@agoric/wallet 0.19.0-u19.2 → 0.19.0-u21.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +1 -17
- package/api/CHANGELOG.md +1 -17
- package/api/bundles/bundle-wallet-js-meta.json +252 -237
- package/api/bundles/bundle-wallet.js +1 -1
- package/api/package.json +24 -24
- package/api/src/issuerTable.js +2 -2
- package/api/src/types-ambient.js +4 -4
- package/package.json +3 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
export default {"moduleFormat":"endoZipBase64","endoZipBase64":"UEsDBAoAAAAAAAAAAAAO4qVgG/wAABv8AAAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgInRhZ3MiOiBbXSwKICAiZW50cnkiOiB7CiAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy93YWxsZXQtYmFja2VuZC12MC4xNS4wLXUxOS4yIiwKICAgICJtb2R1bGUiOiAiLi9zcmMvd2FsbGV0LmpzIgogIH0sCiAgImNvbXBhcnRtZW50cyI6IHsKICAgICJAYWdvcmljL2Jhc2Utem9uZS12MC4xLjEtdTE5LjAiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvYmFzZS16b25lIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvYmFzZS16b25lLXYwLjEuMS11MTkuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL2Jhc2Utem9uZS12MC4xLjEtdTE5LjAiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMy11MTkuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi45IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9leG8iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXhvLXYxLjUuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MS4xLjEwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjQuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjEuNC44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL2hlYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaGVhcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdjNzFiMjc1NzI1YWVjNjg4MzI1ZDZkMzBmMzkzYzg1NDkxMjllNWQxM2FjNTYyMGU0ZTI2MDdmNmQ4YTFjZjExNzNlYTkwNzA5ODc3NzY0MGQyYTUxNjYwZDJmOWRjNDlhNmUyZjQ3N2Q5MjU2M2E3MmQzOTlhMmQ1NWQxNTc3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4cG9ydHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4cG9ydHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxYmU2Zjg3MDYwNWM1ZTVlNDJmMzllZDI4MjIzNzhhYjllYWY0ZmE2YmRhNzQwNzBiYWM1OGZmZDEwZTE0YTA3MmNmODA5NmZlOGM2OTg2ODAwYTk5NWUyYzYwNGI4OGNhMjcyMWY5OTFiNTUwNzFhZTZmM2UzZDBlYTNiYWFmOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9oZWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9oZWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNmFjMGZiN2NkMmI2NmJiOTgxMzNkOTQ4YjFkYjFhZmFmZmYzZjdmOWZhMDM2ZTYwMWI3MGYyYTEzZjMyMGYxMWQ0NWQzMTFmZGJhMzlmYmY1NDk1NjY0YmI2MzEzODk5ODYyZTA3MzE5ODFkNzk1YTY0NWJlZWYzZThlNTRiYTkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNmJjZTg1ZDkyNzk4MGZmMGJjZGE2ZGZjYjIyNjBjNmQ3ZTdiNGZiYWU0NDlhZGVjY2U0NGUwODQ2Nzc5YmI0NWUyYzQzYmQ2NzgyMzA2YTY5NWY2OTY4OWZiZTAwYmIyNTVmYTViOTlhMWE3N2EwNGI4YzU4NjdjZjc0MDYyNDYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXMtcGFzc2FibGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2lzLXBhc3NhYmxlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODlmNWY1NTMzYzBlYTlhYzgyZmQxMDA3ZDc2OGU4ZmEzMjA5ZGM4OWVlZGJjY2I2ZDRhZmIzNWFlMGY3MWZlODA4YmFlYjAyZGY1NmNhZDZhZGIzNjQyODIzOTE5ZWNkMjllMmEwYzg0MzkwODBhMmM5NDkzYjIwNDZiN2U1NDYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjM4MGMwODFjYjMxYmYwN2Y0NDIwNmJmZWY1MTI3ZTAwNGNlMWViODVkMzNhMzgyZWJlNDAzYmMyMjRhYTBmOTc2M2UyZjM2MWJmM2E0MmU0YTNiNTU1MmI5NDhkM2QwNTM3N2Q1ZTEyZDAyZWNlY2FmODM5MGE5M2Y3MDhmN2RhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ha2Utb25jZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZS1vbmNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmEzNWNjNmJhMWVhZDU0MTFhMGQ4ZWQ2YzhlMWY2ZTYzNjBhMWQzZmU3NzE1MDgyYTg2NDNhOTQ2YzEwM2VjYjVkYzNhZjczNDU4OTljNDNhOWQ2YjNkMjkxM2Y2YzUxYjIwM2JjZDU1YzY4MWVhYjk1YWMwMDM5ODUzZGY2ZTYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvd2F0Y2gtcHJvbWlzZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvd2F0Y2gtcHJvbWlzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU1ZDU2N2Q2YWY4ODdhNjU4MTY3ZGEyNzEzMzRkYzVmMzRkMTBmYjdjZWNkNzI5YzFiNDBhZmM5NTNmYzNmMmMyZjJiOGZiMzA4MTBiNTZkNTFiNzE0NjlmN2FhNmVkNDlmMTc1MGIxMWFlZTRhMjgyYmZjMzQ2OWQ1M2QwOWUxIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL2NhY2hlLXYwLjMuMy11MTkuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9jYWNoZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL2NhY2hlLXYwLjMuMy11MTkuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL2NhY2hlLXYwLjMuMy11MTkuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2ludGVybmFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuNC4wLXUxOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMy11MTkuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjMtdTE5LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYxLjEuMTAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuNi4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jYWNoZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY2FjaGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1YWM0MTRkZTk0YWFjZmFkMzJjNmU0M2YzZTZhZTQ5NzJjNmVlNDQyZGVkMjIwYTVkYTExYWM3Y2ZiOTc4ZmIwZmFkMzMzMmE5OTY4OTMwNjFmNDg1YmYwYjE2OTk3MDRmYjVkNWY3ZTcwODY4NjA3YjYwODYwMjk5ZDZiNGI1MiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjljNDRkNGRiMmFkN2VjZDA3MTdmMzk5ODdmZWE1NzlhYjY0ZDM4YmJjZmU3M2FjYjc5ZjE0Yjg1OGJiODEyNGU5MGZkZWUwYmMzNWY3OGE2YjE3ODc3Njc3NGZkYjZmMWJlOWIwYTJjZjZlYTkxOTU3NGUwZTc5M2VkMzU1NGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RhdGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0YXRlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDE3YmY0ZDU0NzRmZWI0ZjNmZGZhMzdmODlkN2UxYWFmZDNlNGFkNTVhMDliZDQzNDQzNmFmZjQxMDA4YmQyNmEwMjA4NjcyMGIwNDgxZTAxODAxNTBkY2EwNWNkMGVlMDRiYzMyNDFmMGE1NzYzNDQ2MDVjYzY3NzA3NzI5NzgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmEyMjExMjBhMDc5ZDc3ZGMwZTcyYWNhMjQ2MDJlZjRiMTg5ODJiM2I4NjBjNDVkMmQ5Yzk0MzljMjFlMzhkMDI3MDk3ZTA0Y2Q1NTVhOWM0MzdlNzI5NzQwNTkyNTA3OTNiOGNmY2JlZWQxNDI0ODAzNGIwNmIyM2FkMGJlYzYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWJlNmY4NzA2MDVjNWU1ZTQyZjM5ZWQyODIyMzc4YWI5ZWFmNGZhNmJkYTc0MDcwYmFjNThmZmQxMGUxNGEwNzJjZjgwOTZmZThjNjk4NjgwMGE5OTVlMmM2MDRiODhjYTI3MjFmOTkxYjU1MDcxYWU2ZjNlM2QwZWEzYmFhZjgiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvZXJ0cC12MC4xNi4zLXUxOS4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL2VydHAiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9lcnRwLXYwLjE2LjMtdTE5LjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9lcnRwLXYwLjE2LjMtdTE5LjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9ub3RpZmllciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjcuMC11MTkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjMtdTE5LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4zLXUxOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b25lL2R1cmFibGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b25lLXYwLjMuMC11MTkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZHVyYWJsZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuOSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYxLjYuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NS4wLjE0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjEuNC44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Ftb3VudE1hdGguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Ftb3VudE1hdGguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiOTg0MGYwY2U4NzI0MzRhMDI1OTA4OTViYjFhYTRhNDMzMjA3YmYzNmI3N2E0Y2QxMTI4YTRhOTUxNTRiMzQ5ZjhiODk1NTE3ZDdiODZjYzRhMDY0OWVhMDUyNDU0NzU3MGUzZDc0MjMzZTg4ODhjMTRiOTlhMmY5MzM1MzIwZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9hbW91bnRTdG9yZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYW1vdW50U3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2NjQwZDE0MWIzZTkwZWM3MTM4MjA1OWE2ZmZkZGFiZTQ2NmVhOWQ4ZTNlYTVjZmVhM2M1NWViYzU4MzA2ZWUyMWIxYTQzM2I3OGQzZDU5YjFiYzg3NWRiZGE0NDcwMzcyZDE5ODlmZGRiMTI3Zjc0MzdlMGFhNzQ5MDlkYWQ4MiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9kaXNwbGF5SW5mby5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZGlzcGxheUluZm8uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1Nzk5ZGE2YmM5ZmFiMzAxMjY5YjNkZjYzZGI5MDM5ODQxMzkxMmQ1YzUyMzc1ZDBjYTU1MGJhZWVhMjRiMzk2NDZjNGVjYTFjMTkwYTI2OTk1NTJmNzQ1NTRjZjk0YjkxNDI5NDlhY2QxYmM4M2QyMGNhNDk5ZjY2MGI5ZTRlZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkM2JiODkxNmM0MjQxNTZmYWUzMmI5OGZmZTY0YzhkODUzMDVlZTdmOGU5NjI1ZTJhMjFjOGJmYjViYzM3OGFjZTQ2ZGQ5ZjFjODEzN2YyMTRiYTA1NzQ1MjUzOGI5Y2ViMDk1NWM2YjA3YjEzOTBmYTE4Zjg0MjYyNGUwMDc1OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pc3N1ZXJLaXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2lzc3VlcktpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjkwOTlhZGZjNDc2MWI3MzJjMzRiZmEyZWIzNzRiZjM1MTVkNmFmYmJhMjViMDMxMjY2MTViNzdmOTFjMDY1Yjk5ODFkMjI5OWYzNWY2OTQ5OTBlMzQzZTRmZDFkYzE0MTg2YTZkOGIxNjUxNTgxMzZlODk2M2I0MTBjZGY0Y2Y3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTM1MmYzYjE4ZWM4NjJmMjBmM2Y0ZWQ5NzNlMmExZjFmMDUxNTdiODBmZmYwMTdmNzdlNGQxMzJlNWQyNTM4ZmVlZjY0MDJiNzJjZDc5Y2Q0MGRhMWEwY2NkYWMzNTFhYzBkMTZlMTZmM2VjODg4ODYwYmEyM2M2ZjM4YTFlODUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxNmIzN2YwYTVmMjY2OGI3NWI4ODkxYjljMGE4ODIxNTliZTc1OWI0ZDMyNWJjZThlOWMzYzExNTFiOWY1Yjk4MzgxNjVhMjU0YmEwMDAxMjBmNjY4M2E1ZThmYjE2ZGQzMTFjM2IyNzhhNjYyNmI3MTE1ODEwMTVhOTc4MDA0OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2YTYxYzcxNTRjOWJkMjVhMmQzYjEyMTczN2ZlY2ZhZGRiNDM1M2EyYzRhMmEzZjNhZGYyMzU5YzU5ZmVkNWE3ZWM2ODlkYmQ1YjNkZTdlM2FiMWQxYWRjNWU1NDkyYTI4YjI5M2U3MTlkMzIyMzhmMjM0NWI0YTU5YmRlMzNhYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzOGU5M2MxOGNhZTRkZmRkOGE0NWJjYjYzMzViZmJhZjI5Nzk2YzZkMjNkYmRmMGQ2YWYzY2FmZGU1NTQwOWExYTA1NTc1ZTIyNTZhMGM2MjI1M2RiNGNmOTk2MDJiMTcyYzVmYzE4YTFlZDMyNTRkNWZmODhmMzI2MTJlNGI1ZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXltZW50LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXltZW50LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODQ3YTE3OWRjZjJiM2Y3YWQ3MWY1NWE0ZWZjNmIxMTI2NzgwNzcyZjRiODE0OGUxZTBkYmUxNzMwNDdkMDhkOWQ3ZjQxOGU4ODJmMDNiM2M2M2FiNDViZjYzNWYxMTY1ZDIyNzMzZGI5NjdlODQ0ODY3NTMyMTY3Mjg0NjIwZjYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF5bWVudExlZGdlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF5bWVudExlZGdlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFhYjVkNmMyMWQxNWIyODE5NWRmZmQ5Zjk2NjBjYTlmMTQ5ODFmNDgwNmNiMGUwYzhhN2Y5ODhlYjZkMThjYzBlMTM4YjIxYjYxZTE1YTZlYmRkZDdjYWMyODkxZjFlZWY4NjI1MzJkZTE4ZWYyZjYwNGJmYzJhMWE1Njg0N2E1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3B1cnNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wdXJzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjg0ZTQ2OGY2YjA0ODUwNTU0MjI3MDE1NDFmNTMwMmNmNDYxZDFmNjk3ZjY5MzA1YzY2Mzc0MGE4Y2I0NTg4Y2YwMmIxMGIzZTg2MTM4NjNhZTA0OWY4MGJmMGYxYjZiYmIwZmI0MDViNDEzOTYzZGM4OGIyOTg1ZTNiMjdkNDAwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RyYW5zaWVudE5vdGlmaWVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90cmFuc2llbnROb3RpZmllci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNjNTQ3MTVkYTQ4YjE1NThjMzdiYzQ4MThlYzBlMmM0ODhlNjFkYjc0OGJkNWExMWQxOWMxZDlkN2Q4MTA1M2NjNDRjZWU0ZTUxMDQ2NTY1MzdmZGNkY2QyMThkZmY2ZjhmYzFmYTZmY2EzMzIzNjFhZjhkZWFmY2I3NGEwY2NkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5ODhkOGUzZGMxN2VjODcwZTdkODQ2NGI2MGU5NDMwMGQ0N2IwNWJmMzQ4NGNmMGZkMjFlOWYzZjhkYjZmNGM0OGZiMjBhMWNlNTQxMGQyMTE1MWJjOWExYzIyMmIyYWFmZGYyYWIzYmI2YmRlM2E3NmZkNjY4NzExNDIxOGYyMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMtaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxYmU2Zjg3MDYwNWM1ZTVlNDJmMzllZDI4MjIzNzhhYjllYWY0ZmE2YmRhNzQwNzBiYWM1OGZmZDEwZTE0YTA3MmNmODA5NmZlOGM2OTg2ODAwYTk5NWUyYzYwNGI4OGNhMjcyMWY5OTFiNTUwNzFhZTZmM2UzZDBlYTNiYWFmOCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9pbnRlcm5hbC12MC40LjAtdTE5LjIiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvaW50ZXJuYWwiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC40LjAtdTE5LjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9pbnRlcm5hbC12MC40LjAtdTE5LjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9iYXNlLXpvbmUvaGVhcC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Jhc2Utem9uZS12MC4xLjEtdTE5LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2hlYXAuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuOSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZnJvbS11bmlxdWUtZW50cmllcy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi45IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9vYmplY3QtbWFwLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9vYmplY3QtbWV0YS1tYXAuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuOSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vb2JqZWN0LW1ldGEtbWFwLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi45IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYxLjEuMTAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuNi4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MS40LjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuOSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vc3RyZWFtIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3N0cmVhbS12MS4yLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgImplc3NpZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJqZXNzaWUuanMtdjAuMy40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbWFpbi5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jYWxsYmFjay5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY2FsbGJhY2suanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhYTYzMThkNzFjODRlMjg2MTBlOWQzNWI0NzY1ODU0OGUyMGNmNGVjNDU5YTFkOGI3OWM0YzVjMGE1MDY2YTE4YWJkODczZTU3MGU4ZTM4M2VlMWY1MDViYTY0M2Y3N2U3ZGNjZThhYjgzNzNiMDkwNDgxMWU1ZGVmODdjZjQ0MSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb25maWcuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbmZpZy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUzOGQwMmJkYzBjYTA1YmFiZTZkNzJiMzczYTMwN2M3YjRkMjg2NjQ2MzdkMzA3ZmE0M2E3ZmYwMzM4OGJlMTU0ZDdkMWE2ZjE2MjM5Y2VhNjJhMDMxMWNmZDYwZTVhODQ5YmQyNDIzZDM1YTI2ZmU5OTJkODNlZDVjYTY1YmQyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2RlYnVnLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kZWJ1Zy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjgzYzAwYzk1NmUyZjMwZmRlNTE5YjlmNzUxYmU1MzA4ZTRhMzg0MTI0NGUxNTY1YzZiOWIyMzg3YWU5ZWYwN2VhMWQzODQ2NzA4MzJiZDNlY2QyZGVjMTUxMjNiZTkxZDQ2Y2VhOWVhM2NhNDFjMGJlZjk2M2E5YjUyMDU1M2QwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Vycm9ycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXJyb3JzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzMxM2I5YmE5MDA4YmMwMjYyY2ZkMjIwZmM5NDdkOTIzYzkwYzc0MWU3MDNiMGI3OTVlMDcxYjkxZjkwYTQxZDhhMzA4NzAzNTQ0ZjE5OTYwNjY4OWQwMDlkMzg1MjBkNzQ0MjcyZjg2ZWU3NDk1NzFkZTQ3ZDkyODJkM2E1YjQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWY1YTdjYWUwMzE4NjNjOTZhNjY3NmE4MzI0NWFhZmM5ZjUwOGFjMDc1MzNiZTI2NzcyNzIxZWNhM2E3NTkyYzlkYjIyZGQyYTE4YjIxZDMyYzVhNjE0Nzg1YjFlNTAwOTdlMDQ1ZTUyMDhhZTQ0N2M3MGYxZTAwNGYwZmI3ZWMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvanMtdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2pzLXV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDBiN2Q3MzRmYmM4ZmE2ZDAzODU2MzMzODMzZmUxMmNmZTFjMTJiOGI2OTJmMjI5MTUxOGI1N2Q0M2Q2ZmNlMDYwMTJkY2FiMjc3MTkyYjQ5MzA5ODZiYTNmZDAwOTYyNDRkYjg5NTE2NTJjNTk1MTU3MTRiMjc0ZDZmOTBkYzYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGliLWNoYWluU3RvcmFnZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc4N2MyMzJmMTJjNTliNzRjZGI1YjM3NzFmYTk5ODUzYzE4MDk4YTU5YzZjMTYwMWE2Mzc5MGEwM2Q2MThiZThiOWNjOTJmZDJjYTk2Y2JjOTcxY2Y3YTM4OWQ3MjBhYmVjZTQzNDkwOGU0Yzk1YmMzM2VjYmJkM2Y1ZWIyMDQyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4NTJlNzc4OGZhOTgxYjJhZDUwN2M5NGI1MjM5YzExZTg1OTc5YzI0ZGMxMzRiZmE2ZDhlNTExZjMwZmFjNzhjMjllMTAwZjRlYzc4ZWQxNjdjYzg3OTYxOTNiYWRlNzllMGY3YTdlNGE3YTljMzYzYWEyNmYzYmY5MThhMzY0MCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tZXRob2QtdG9vbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ldGhvZC10b29scy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQyYTVmNzA3OTE3OWQ3ZDJhNzE2MThjOWY3MWE5NzMxYjdlMDE0MzVjMDIxNjFmMTE3Y2I1NzA2NDAwNWI2YTNlNTkzNTA5ZTE3NjVlNjQ4MzlmMTEyOGI5Yzc5OTA5YzEyNmE0MjJhMTMzODY0Zjg2ZTEyMWZmMDBlYjc0NzAzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Nlcy11dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc2VzLXV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTY0N2Q3ZTg4NzVjOWY2NzJkYThhMzBhYjczN2Q3ZGVhZTU3N2NmNjJlMGJmZmQwYTIxZjE4ODE5M2VhZjZlZmVkMDg5ZDVkMWNkNjMxM2YzZTY1NjRmY2VlN2QwYTdhZmNiZTdmZjM5NTczZWUxZGMwOGFkNTEwMGUwYmY5NDgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmFnZS10ZXN0LXV0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yYWdlLXRlc3QtdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5MzUxNWJlYzBjZmQ5MDMwY2I2MzQzNjU0MGNiNjA2ZTM2NzM2NGNkYWFjZTQ4ZTg3ZTcyNWI3OTM4MzA3NjI2Mzg4YWUxZjQxM2QxZGZiZDJmMjdhYjhiNzRmYjkzOGIxNzdjNTA2OTkzMzhjMjNlY2E4NDI3YjY3N2I4MjFiZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90ZXN0aW5nLXV0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90ZXN0aW5nLXV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZWU4YjU3OWNkN2FiNjE5ZTk2ZWRjMTI0ZGIxMTk3YmE4MjQ3MWUxYzhjYzRlMDk1ZTg3MDUxODRhMTU2ZWUxM2M4NDdlOGUxMjU0ZDhhYzNkNzQyMzExMjE1NTA2YjZmYjYxYzc4NDBiM2UxNGNmN2RiNzJlNjc2NzJiYzgwMTciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUNoZWNrLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlQ2hlY2suanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiZjIzNDE5NDlmMDFjNTNmZDljNDRlMWViZGJiYzdkNjU1NWY0YWMwMWZhMTAyZDkxYjZhZjc2NTA2NDIyYTAxOTAyZDM5YzZlN2E2ZGVkMDZmMWU0NjMzZmFjMmVkNDhlMDBmNjc0NzJlODM3Y2NhYjNmYTI2MTIzMjk1YmIzYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmZkNjVhN2Q5ZWMyYjFmNWExNGZkNDUyNzgxZDE3MjBjOThmNGQ5OGFiMzQ4NjJhN2VjM2YxNzQzMzA1NDI1NjJhMjY4Zjg5MGQzZjNkZmEwMzIyZmYwMzg2OTgzOGNlMzY1NGU0YWRjN2ZhYjkxNWMyYTQxYWNjMzljYzNiODgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMtaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLWluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWJlNmY4NzA2MDVjNWU1ZTQyZjM5ZWQyODIyMzc4YWI5ZWFmNGZhNmJkYTc0MDcwYmFjNThmZmQxMGUxNGEwNzJjZjgwOTZmZThjNjk4NjgwMGE5OTVlMmM2MDRiODhjYTI3MjFmOTkxYjU1MDcxYWU2ZjNlM2QwZWEzYmFhZjgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdXBncmFkZS1hcGkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3VwZ3JhZGUtYXBpLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjczZmRmNzA3ZWI3YjhkNWE0ZmFlZGJhMzMxM2VmMjAwYWVmMGRlM2Q4YWZmY2EwMzMyOTJiOGM2NjE3NjVhNWQ0NGZjNTk1ZWUyYjgyNWJjMDkzYzkwZjc5MGViNmU0ZTg2YTM2MGE0NDVjMGE5NmQ5ZTA2MWQ1NTMxNjlkNGYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvbm90aWZpZXItdjAuNy4wLXUxOS4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL25vdGlmaWVyIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvbm90aWZpZXItdjAuNy4wLXUxOS4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvbm90aWZpZXItdjAuNy4wLXUxOS4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC40LjAtdTE5LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuNC4wLXUxOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsL3NyYy90ZXN0aW5nLXV0aWxzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuNC4wLXUxOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvdGVzdGluZy11dGlscy5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsL3NyYy91cGdyYWRlLWFwaS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjQuMC11MTkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3VwZ3JhZGUtYXBpLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjMtdTE5LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuOSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MS4xLjEwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYxLjYuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjEuNC44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFmNTBjNzFiNzhkZTlkYjY0ZDgyYWRjZTRhYjUwMDA2NGRlOTY3MTkxOWVjMzI4MjhjMmVmMGY0YzVhZTM3MmE2YTk0YmNiZWJiMGM0Mjk0NDNhMDdmZjA0MDUwYWYxNjkwNmQ0YTg1NjQ2MTIzMTBhMTEwMzJhMTIxMWYwOGRmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImMyNWIxZDc5NmIwNzcwYTFhM2I3MjQ2N2Q0OTU1MTE0MGRmNDFmNDVlYzI0MWM1NjkxZDkwNWIzZTMxNDFhODc5ZmU0YjAwNDhiNjlhNzVmZTk1MDBjMTA3MDVmMDA2ZWFhMzE3ZDRhZmJhYWFlZmUwYmEyOTE2OGUwMzllMDYwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL25vdGlmaWVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9ub3RpZmllci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjBhZjg3MGVmZjUxODUxZTY1NjVjNjYxNmQ3ZThlYTQxNjc4ZDZmMTA4NDdiNDM0OTJlMTYwNjllYmNkNDU4YWZhY2RiNmI5YTBhOGI3ZGJkZTMwYTRiYWRlNDMyMDc3ZTQ1YWIzNjI4ZTI4Njk3ZTlkYWFiOTI5NzEyYzEwYzkzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3B1Ymxpc2gta2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wdWJsaXNoLWtpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImYzYTBjYzU0M2Y1Y2IzNTg4Mjk1M2IyNDFhOGViM2JlNmE5MzY1Mjk4OWM3NWRjNzkzMDFlOTNlZTg5MTViOTVlZmRlZGIzY2JmZWJmNDlhN2QyYTU3ZGZlNjczYzQ0MmFkMzNjNTA1MzNjODM1ZGUzZmY0ZWVlZGVmNTFkM2JhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3JlZC1ub3RpZmllci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVkLW5vdGlmaWVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjA0YzMyNDRhOGFiNGNhODIyYWY5YzQyODU1ZmY1OWJlYmRiZjU0NTFhZWUyY2VmZWM0MTI4NTQ2MDMxOGJkNTU1NGYzM2MxOWJmNmRiNWIzMmU2ZmNlMTNiYzg1ZDRiOGU0ZjMzYTRkMDQyMTdkNDUxODAyMThjNWUxMjNjZTkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzdWIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlc3ViLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODgxZGMxYmQ2OTc3NmM4NjBmM2MwN2QzMDg1MTNjZjE3ZmI1NjNkOTZiOWYzN2Q4NTM0ZjhkOTA3OWYyMGYwOWVjODI1OWRkMzM0MjBhNmY2MDQzODM5Zjg4MWY4MWUwYzRjYjM5ODRjMmViYzgxNzRmMDgyMTMyMWZhZGI2ZTYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3Vic2NyaWJlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdWJzY3JpYmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5NTk3ZGIwMTBjMDJlMzZjODZiMzliZDg3NzgzZGRiOWJmYmIwY2M2MTI2NmFiOThmNmE3YzQ2MjhiM2VhYTM2NzY4OWJhN2M4ODk4MGIzNzk0MDM3Y2EyODdlNmFmOGM0MDdhZDFlMDIzMjAwNTM1MzBiNjExNDczMWYyM2NhMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdWJzY3JpYmVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdWJzY3JpYmVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmE0NmNjZjU3MWQxNjZhM2JkYjQ4YzExYzJkZGMwYmY3ZjliYzI3NGJjNzZhZjgwMWZjMzE1ZmM2MTU1YmM2NzY2ZTU5ZTQ2YWE3YmRhNDMzOTc1ZDdkMGI4YWFiMDY0YjM0NTM4ODZkZmEwZGZiODMxYjc0YTliM2EzYjFkYTgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdG9waWMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RvcGljLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDYwNjhkNmFlYTJjYjMxZDY4MzJhZTZjZjlmZjVlZTE4ODFkMzJjMDU5NzVjNTM4ZTFmMDEyYTVjZjI0Njk3OTRmNWRlZGE4N2RhYWU5MDUwMGMyNmQ3NzE4NzdjNTVmNGZkMjFmOWVlZWE4YzJmYzhkMmY5ZTUwY2IwM2M4MmMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMtaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLWluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWJlNmY4NzA2MDVjNWU1ZTQyZjM5ZWQyODIyMzc4YWI5ZWFmNGZhNmJkYTc0MDcwYmFjNThmZmQxMGUxNGEwNzJjZjgwOTZmZThjNjk4NjgwMGE5OTVlMmM2MDRiODhjYTI3MjFmOTkxYjU1MDcxYWU2ZjNlM2QwZWEzYmFhZjgiCiAgICAgICAgfSwKICAgICAgICAiLi90b29scy90ZXN0U3VwcG9ydHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAidG9vbHMvdGVzdFN1cHBvcnRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWRmMzdmNGMyNWU3MDAxNTNkODVjNmMzNjgxZjJkM2U2NWQ0YjFhNDg5ODczN2UyZmJmMzI2ZjQ0NDYzMTQxODE5MmZhMTgyMzM0MzRlMDg1YjRhNWE1MjMxODcxZDZmNTQ4YjI1NDRhYTMwNTI1NTVhNjgyOGU5M2QzZGIxMjgiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvc21hcnQtd2FsbGV0LXYwLjUuNC11MTkuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9zbWFydC13YWxsZXQiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9zbWFydC13YWxsZXQtdjAuNS40LXUxOS4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvc21hcnQtd2FsbGV0LXYwLjUuNC11MTkuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOS4zLXUxOS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXRzL3NyYy9saWItYm9hcmQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXRzLXYwLjE2LjAtdTE5LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9saWItYm9hcmQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MS42LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwtY29udGV4dHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwtY29udGV4dHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmOTYyMjdmMGJlODgxYmM2NGIwMTQ3OTkyZWI4ZThjMDczNDE3NDFiOWJlOGFjNDBlYjZlZWFkNzE1ZmRiNmQ5N2U1ZDVmM2E3MDI0NzhjNWY3NWFhZDg1ZTkwMGVkOTMxMTYyMTdlNDdkNzNjZGNkM2M0ZjZjNDk4YWZhZTdmZSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9zdG9yZS12MC45LjMtdTE5LjAiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvc3RvcmUiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9zdG9yZS12MC45LjMtdTE5LjAiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9zdG9yZS12MC45LjMtdTE5LjAiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V4byI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9leG8tdjEuNS44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuNi4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MS40LjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjIxNDAwYWU4ZmZjMTlmN2FmNzk1MzU4MWRhM2Y2ZWE5NzAzYTUzOTVkM2RlNDlkYjg0ZTFlYzhhMTc2MDdhNDE0NjU4YWJiMzM5OGJjZDcwMWZiNjIwZTExZTYxM2JiNjdmYzhkMTU5MjA2ZTM1YTA3MWYwMjU0MTg3ZWQzZDg5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2xlZ2FjeS9sZWdhY3lNYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2xlZ2FjeS9sZWdhY3lNYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkODdkZjAyNGYyNzQ3MDY4MDgyZTQ0NTQ2ZmYwMWU3Y2Q0ZTYyNzUxMDkzOTQ4ZDJkMmQ5ODQ1Y2JmMTA5MTUyMDQ3M2YzNGIwNjJiY2M3OWQ1ZDQyZDRlYTcyNGE3ODliOGY1NmZjMmQwMmYwYzQ4MWQwM2QwOThhNWQwOTgyZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9sZWdhY3kvbGVnYWN5V2Vha01hcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjMmE3YTU2OGQ0MWQ4NzIzZjk2YjA1YWI1ZDNkNTZiYTA4YjQ1MDM3MDY2YmZjZjk1ODg3YzkyZGU4OTU0ZDYyNDRiYWZlOTgzMDRmMGU2ODJkNTc1MmEzNjEyOGExOTllODM4N2Q5NWE5NmEwZDA0MmVhOGMwYTZhNDYxZDFiYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc3NTNjNTQ4MjhhZmNkZWM4MjM4NGFmMzdlNGNhMzFkYTZiODk2ZWUyYTdkYWRiMDM3Y2U0MWQzODg5Zjk3YTFiMDE5NGI1ZmY2YmIyNmMyNjgyNThjZjc2NjJiMWJmNDJkYTI5NjkyOGY4YzYzNzg4MjI1MDJlZjMyNzZjNDNiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTEzZDMwYjg4ZmZiN2E4MTg5NWNlNzM0NWEyZWRmNWExYmUwMjlhMzgyYmRlNjZiZDFjMmMxYTE4NDE4MzYyODA5ZTAzMWY0ZjU4ODU3YmI5ZjQ5ODFmZjEwNjAwZmE4OWJkMDdiNTlkMjRhYmU1ZWQ2MTgxMDJhYWM2ZmNjYzYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImY0OWRiMDMwMGZlZTM3NmRiOTQwNzUwMzUzZGM1MjczYTNlYmVlNDhjMDA0NDEyM2IwYzExYmNiMDFlOGMzNDYzOTM0NGQyNjZmYjM4ZWFkMWQ0MTlmMjJiY2FkMThlZDdhYjdjM2Y5OTA5YWEzZDQxZGZhZGY1NjNlNDJhZmNkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5Njg5MDcyNzA2MGMyZGFiMWQ2Nzc3NDY2ODRhNzhlNzdmMzVjYzUxYTkzNzQ5ZTk2NDFkZTU5NjVjZjU1ZThhNGYyZDdhYjM2ZmViMWQ3YWI3MjFkNWJkYTM4YTMwYTAzZWQxNWY2Yjc1Zjg2NDMzZDY4NTViMjY0MWE2ZjNjMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjVmODU0M2ZiZGZlOGMwMTMxMGEyYmM1ZjgyYzQzN2QxNmMxZTdjODY2ZmJjNGFhZTk3NWM2OGM2ZTE1MzcxZTBkM2FlNDE2ZGFlMTZmYWYzYWM5YWIyMzg1OGMwZmY0YmVmYWM4MDRhMTVlYzJjYTUwM2U4ZGFhZTc0NzljMDlmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFiZTZmODcwNjA1YzVlNWU0MmYzOWVkMjgyMjM3OGFiOWVhZjRmYTZiZGE3NDA3MGJhYzU4ZmZkMTBlMTRhMDcyY2Y4MDk2ZmU4YzY5ODY4MDBhOTk1ZTJjNjA0Yjg4Y2EyNzIxZjk5MWI1NTA3MWFlNmYzZTNkMGVhM2JhYWY4IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMy11MTkuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy92YXQtZGF0YSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMy11MTkuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMy11MTkuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOS4zLXUxOS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4by11dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXhvLXV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzNhNmMwYjM3MDk3OTBjYzU3ZDFkODM1MTFhNzg4NDRkZTIxYmUyZjk1Zjg3NzYyODk1ZGNjNDU4Y2Q5YWUxZjdhNjAzMzU2MzFhZDUyYjNlNTJhMWRjOGUwMTVmOGRmZTcyNGE3ZWU5NjlhNmMwMjMzNjgxOTJkOGFmMjYyZTQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTU5NTU0YWMyOTU1NjdhY2IzYjY3MjY3ZWYxYjhlNWE4NTRlOWRhYmE2ODNmOWVmNjE0MmYwZjlmMmRmN2Y2ODczODg0ZjE0OTljZjg5OWRkMzNiOGQ0YzMzNzU3MGVkZWExYjEzZTE0YWM1MzMxN2JlZjQ1MDUyYTBiYzhlMTQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdmF0LWRhdGEtYmluZGluZ3MuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWU4ODMxOGY1ZDQ3NWZmM2E3NjM4OWNhZGU2ZDU0MDdjMjVlMWNjNzBkMGIxMjY4ZDQxMzk5NmJiMWM2M2FkZmU0YTM1Y2U0MmZjZjI5MDlkMDZiNjZiMmM3OTYyNDkzZGQ3Nzc2YTM4YTlhOTUyMWY4Zjg1YWE1NzNjNzFjODgiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvdmF0cy12MC4xNi4wLXUxOS4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3ZhdHMiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy92YXRzLXYwLjE2LjAtdTE5LjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy92YXRzLXYwLjE2LjAtdTE5LjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9ub3RpZmllciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjcuMC11MTkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjMtdTE5LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L3JlY29yZGVyLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9lLXYwLjI3LjAtdTE5LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9jb250cmFjdFN1cHBvcnQvcmVjb3JkZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjEuMS4xMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MS42LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NyYy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY3JjLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTk0YzZjNGRjOTE1Mzg4OTZlMzg5NGI3MDkyYmNkODI5MWMzMWU5NTI2MjNjNjNlZTdhYzZmNTUyN2FhMWRiYmUwZDI1NDQyMjNjMjk0OTgxZDRhZjc1NzliNjAxNDEyNjM5ZGMzNTdlMDkzOWRmNzFmOWMwYWI0ZmZmNTJlOGQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGliLWJvYXJkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9saWItYm9hcmQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3ZjAzYzVkYTZmYTI5ZmMxMzY5MWNhOTBiZTc1OTZiZjllOWQ3ZGU3ZTMwNGQ3MDRmMmZkODZhMmZmMTIzZDA3MWY2YzIxMGNhMjk0NTk0NTc5NmExZTY3ZDc0MDhjNjk4NDc5MDUyMzhkY2YzMzY1YmQ1YjE4NTcxNjJmYTFjNyIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy93YWxsZXQtYmFja2VuZC12MC4xNS4wLXUxOS4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3dhbGxldC1iYWNrZW5kIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvd2FsbGV0LWJhY2tlbmQtdjAuMTUuMC11MTkuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3dhbGxldC1iYWNrZW5kLXYwLjE1LjAtdTE5LjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9jYWNoZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2NhY2hlLXYwLjMuMy11MTkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL21haW4uanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9lcnRwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvZXJ0cC12MC4xNi4zLXUxOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjQuMC11MTkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2pzLXV0aWxzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuNC4wLXUxOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvanMtdXRpbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbC9zcmMvc3RvcmFnZS10ZXN0LXV0aWxzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuNC4wLXUxOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvc3RvcmFnZS10ZXN0LXV0aWxzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC43LjAtdTE5LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3NtYXJ0LXdhbGxldC9zcmMvbWFyc2hhbC1jb250ZXh0cy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3NtYXJ0LXdhbGxldC12MC41LjQtdTE5LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9tYXJzaGFsLWNvbnRleHRzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjMtdTE5LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4zLXUxOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MS42LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjUuMC4xNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuOSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYWN0aW9ucy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYWN0aW9ucy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ0YmZiMTMyMjJlMzE0NWY5NWIzNDM2ZGRjMmVkZTE4NTI0YWEyYThhNTI5YTU4YmU5Mjk5OGU5NmNhYzU2ZjhhNTk2ZTI2YzEzZTNhNzY5ZGRhYWZmNWE0ZmQ5ODJmYjYzNGNmNGYwNTRjMjM2YjVhMjkxNmNjYjZmZDU4MWJkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2JpZ2ludFN0cmluZ2lmeS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYmlnaW50U3RyaW5naWZ5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzQ2ZWU2N2MxODFjNDBlYWI0YzBhNTFhMTRkYzMzZDM1YWI1MzE3YTBjMjhlM2FlNWM4MDU5ZTM2MDJhMzgzMmQ2M2JjODdkYjliNzVlOGJjOTdhZDUxODAxYTRkZGJiZjA1YmI1Y2I0ZWY4ZWQ0MmQzMWNiZTQzOGM5NzBiZWUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGF0ZS1ub3cuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2RhdGUtbm93LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDViYmM5ODY0N2YxNjY3ODUyYjBiNGU3MDcwMTRiNTcyMDIyYjhjMTRlYjc3Y2EyZDE4MmM2MjEwZTlhOGRlMDZkNmFiYWU2YWFiMmFjM2FjMjA5ZmU2YzE2NTY1ZTExMjY3MGRlYWM5NWUwOThjMTZhNDMxYTFjNDlmMDQwODkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZmluZE9yTWFrZUludml0YXRpb24uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2ZpbmRPck1ha2VJbnZpdGF0aW9uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjJkMDAwMjVhZjI5ZGYzODM1Zjc5OGEzMTk2YWYwYTkyYzAzZThiMDQ1MzNhYTg0ODcyNzlmNGRjNGUwMTgyMjgyZjY2NzIwMzVjNmU2MzAxNWFiMWJmZjUzNzRmMWRiNjQxNTcwNzAxYmI2MTkxODQ0OWJkZDIzMWNlZmUzZWYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW50ZXJuYWwtdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2ludGVybmFsLXR5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTE0NmUwODNhOTkwMjZjYThlZWQyNjJiYmRhMGZkNTI2YTdkYzRlMGFmZDAxZWQwODgzZjc1YTFhZTg4YTk4NDY5ZDlkOGYzNGY5MzAxODhjOTNmMmQ4YWQ1ZGNlMmQ1NjE5YzUzYjM0N2FlNDIxZDk2MTY0MDkwNjY5NmIyNDIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXNzdWVyVGFibGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2lzc3VlclRhYmxlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjA4NTJmZjc2MDhlOGZjYmUwMDgwN2E4ZWQxODFhZGNlNzk0MjVlM2QyZTkwMDRlMDIwODAxY2IwOTIzNGY4ZGQxMjdiMzE2ZWYzOTVjOTBlN2JlNTI1N2M3YjgyMjYxZmJlMjc2M2QzMmU5ZmM2MzcyNjVjY2UzNjQ1YjFhYWEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGliLWRlaHlkcmF0ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGliLWRlaHlkcmF0ZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhiZmVjYTVlMzllNWNlMGMwNjVlMDUyOTE3Mzk2MDFkN2NkZjg2NzFmODEyYjU5NDllYzU3MDg2OTM1MjQ3ZjUzZDlhZTJjZGNlYzdiZWM4YTY5NDQ3ODYxMWFlYzM5ZDFiNzJjOGM4ZTlmZmQwMWUxMDNlMjljNWE2ZjhmOTM2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2xpYi13YWxsZXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2xpYi13YWxsZXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0NjcwNmQ5ZjJkNDdkY2UzMTQ4ODRhYjkzNjAyYmFmNTc4YjJmMzViNzI0NmZmYWQzMDA3ODVlMWM1OGJmM2YyYzEzZjcwZTg3MjQwOTg2NjNmMzBiZmYyYTlhZWQ1YWIzZTY1MGFjODljNjdhZmM0MzA1MGI3OTZhZTZmZDVmMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wdWJzdWIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3B1YnN1Yi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ4NTBhZmU3NjM4YTQwNjUzYjZiMWFlNzVmYjZkMjhjNzE2YzUwNjgzNDllZjMyNTc4ODk5NGRiODRhOTZhMDlhZDAxNTQ3ZGM2ZmIyNjRjYzFhM2Q5OTFkZTM3NWY3NTNmZjM0NDc3OTg3OTQ4NDZiZWM3YTI0YTg1NjA3MTVkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3dhbGxldC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvd2FsbGV0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMGU3YTE2ZTJlNzNiODUzY2JmYTc5YzEyMzkwODA3ZjQ5MmFjMDllMjY1NDNlNTUwNzE5ODkzMGRjZmIzOWMwMjJkYWIwZWVlYjk4Njc1YzQ2MDlhMjBjZjAzODlkYjFmYmY0YjBiOGYzOGRjNTZiNDJkM2MzZTg1MTQzM2JiODAiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvem9lLXYwLjI3LjAtdTE5LjIiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvem9lIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvem9lLXYwLjI3LjAtdTE5LjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy96b2UtdjAuMjcuMC11MTkuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2ludGVybmFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuNC4wLXUxOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjcuMC11MTkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIvdG9vbHMvdGVzdFN1cHBvcnRzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNy4wLXUxOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy90ZXN0U3VwcG9ydHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMy11MTkuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjMtdTE5LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuOSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3JlY29yZGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvcmVjb3JkZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3OTA5YzNiYWRkZTdjMjlhYWJhNWFhMWQzODY2YzgwNWQ4OWNlMDliYmEyM2RmOWI2ZjFhZmViMmExZWE4MjMzYzkyMmU1YzQxMjNkNmZiYjA4NTczZmRkNTJmOGQzODY1NDM1NWYzNzEzYjIxMGE2ODc0MmUwYWY3ZGE0YjIwZSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy96b25lLXYwLjMuMC11MTkuMiI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy96b25lIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvem9uZS12MC4zLjAtdTE5LjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy96b25lLXYwLjMuMC11MTkuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Jhc2Utem9uZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Jhc2Utem9uZS12MC4xLjEtdTE5LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4zLXUxOS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS40LjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vZHVyYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJkdXJhYmxlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmNiYzg5OTQzMjkwY2M3OTQ1ZjcyZjRmNzdhMjEyNDE3YjViZDIyNTEyOWRlMmQyMDgzMDk1NWVjMzMyYjg0NGEwOGE4ZDAxODIwZTI4YzEwNTdmYjQyZjljYjE5NDA3ZjE4MDQ0YWUzM2IxN2IzM2I1OGZhNmU2NGNkMGJjZDciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZHVyYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZHVyYWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImIyNjkwOTVhMGFiYjk3MGNjNzhmOWI4MGE0YTU0ODFmMGU3ODhiYzdlMjViMzJmNmYwMWU2YTViZTQ1MzEyMzk1ODA4ZjIwZDJiMDQyNWU3NGIyMTljMTJkZWQzNzdlYTU1MDhkODAwYWU0YjIyZDRmNWZjYjFhMTBiOTcyNGRlIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9jb21tb24tdjEuMi45IjogewogICAgICAibmFtZSI6ICJAZW5kby9jb21tb24iLAogICAgICAibGFiZWwiOiAiQGVuZG8vY29tbW9uLXYxLjIuOSIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9jb21tb24tdjEuMi45IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi45IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vYXBwbHktbGFiZWxpbmctZXJyb3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiYXBwbHktbGFiZWxpbmctZXJyb3IuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwNWFmNTQyYmU5OTYwMDRmMTA5YmQyM2Q2ZWQ5NTg5MmZkOGVhMGY0NWRmZmI5MWMwZTdjZDUwM2JkMTJhZDRkN2Y0Y2ZiYWEyOTJiMmIzYmUxMmZkNzgzMDhmZTlhZmU1N2NiNGI2ODBjZGQzMGRjMWI3MGMyNmFmOGM1Y2ZlNSIKICAgICAgICB9LAogICAgICAgICIuL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZnJvbS11bmlxdWUtZW50cmllcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjA5ODJmNzgwZmYzYzM4ZGRjOGU0OGQ0MDE3ZGVlMTQ4ZDVhOGE0ZTY2MjA3ZjdiYzVlMTcxMGU5N2FiYjM0Y2FhNzUxZjQ4OWNjMzgwMDU5MmVhNGYwMDk5YTQ0YmQ1NzAwOTg3NzQyMzFiZDk4NzI5MTIxMDQyN2EwMTU3NGMxIgogICAgICAgIH0sCiAgICAgICAgIi4vaWRlbnQtY2hlY2tlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpZGVudC1jaGVja2VyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjM5YmMwODIzMTNmNzBkNzI5YTc0NDZlYmI2NzhlMzllNDQ5ZjdlNzY4YmJjOTg0YjAyOGY0YmIzYmY4NDc3ZWU2NzZiODBlYzFjZTY2Yzk1MzFjZDkwOWM5NDRlNDAxMDk3MDgzMjk1N2UyMjE0MjM1NGUyNzk4ZTI2MzZhOGEiCiAgICAgICAgfSwKICAgICAgICAiLi9saXN0LWRpZmZlcmVuY2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAibGlzdC1kaWZmZXJlbmNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjY0ODQ5OTRiNjU2ZjEzNmFkNzUyYjBhNTE1Y2M0NWU0NWRjOTEwMGRhNjdjNzRhN2Q2MjU3Y2EyMmE3ZmI1ZWVhNzQ0YjA5MTg1YWY2MTgxMTY3Nzk3OGY5ZWQ1NGU0YTYyMTM2NWM1MTAxNzAxMWI0M2YxMTkwODFjMjk1MTIiCiAgICAgICAgfSwKICAgICAgICAiLi9tYWtlLWFycmF5LWl0ZXJhdG9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogIm1ha2UtYXJyYXktaXRlcmF0b3IuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzZDBmOGZmODhkMmM5ZTc5ZWY4YzI2Mjg0NGU2YmJhNzUyNzY4NTUyODdiOTU1ZTEwMzc3NjYyZTMwNmZhOTQxNDgyMmEwYWFhMjA3ZDBjOGI2NmYyMjJhNzgyYzM5MDc0YWUyOGMyNDM4OTAxYjUwZGIwZmFhZGI4Yzg4NjJiOSIKICAgICAgICB9LAogICAgICAgICIuL21ha2UtaXRlcmF0b3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAibWFrZS1pdGVyYXRvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRmZjIzNjYzYmM5NzI0ODA5ZmM1ZjVkMzc5MDM5NGU0ZTVjMDA2Mjg0N2JiM2Q0MDY4ZjNiZGU2MWQ0ZTlmNmFiMWI3YTkzYmU0OTA1MWUwMzY1YzlkNzRkYmFiZTg0ZjliNjQ0YjMwZmRiZDE0ZjU5OTA3MTNmNjlmNTBlMjdmIgogICAgICAgIH0sCiAgICAgICAgIi4vb2JqZWN0LW1hcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJvYmplY3QtbWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmM5MzM1ODIzYzczNWIyNTZkNzUxNWNhYTUwODlhYjgxNzk4NTRlNmMxYTc1ZWIyNGEyM2U1NDM0MzFiYzQ3ZDFiNzUwYzE3MmY3ZjZkNWQwNzhlMmMxNjMzNjQ4MDdkNmZlZjhhYTgzNzE1ODM5ZjFlYjM3NmUyNjBiNTRiZWQiCiAgICAgICAgfSwKICAgICAgICAiLi9vYmplY3QtbWV0YS1tYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAib2JqZWN0LW1ldGEtbWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZWU0MTVhM2JiZjM5NTc2ZTJmNTQxNzk5YTY1NmI2MTIyZTFiMjk3MDFmZDFhOTY5OTBlZDU0MTRlNzMwNTA3NmU2YzNmNGQyMjE3NTViMGFlMDdjNWU4NTc5MzRkOTgzMWZiN2M2MDcxMDY3NTM2NTBmNTU3ZjU5MzBjNGE3MDgiCiAgICAgICAgfSwKICAgICAgICAiLi90aHJvdy1sYWJlbGVkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInRocm93LWxhYmVsZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxYTg1ZDFiMGZiM2FiZDIyNzk1ZGEwNmZlMzE3Yjc2NzZjNzY0N2QzZjI0Mzc0OTc3NmM2MzUwNDg0YjcxMjc2NjJkNTM0M2JkMjRkNTliZTg0M2FiZDlmMzg1NWYwYzY4MTVjNGNjNDNjOWE5MDQ1OWZiNjQxNjU1YTVjOGJkMiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS44IjogewogICAgICAibmFtZSI6ICJAZW5kby9lbnYtb3B0aW9ucyIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjgiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS44IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyMGM4NGZjZTVkMmIzMWNiNzVmZjY5MWE0NDY0N2RlYWM1OWFiY2M4MmJkZjc0ZmUwNGU4ZDNkMjljNzFlODljZGFhZjM0MGIyYzQyMGI2OWU5ZmJjYzMwMDk2YjI3ZDc5YzA1YWRkZjEyMGMzMDgyOGQxMjdlNWM5YTc4YjUzMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbnYtb3B0aW9ucy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW52LW9wdGlvbnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkZjE2ZDgxZTQ5YzliY2RmMGRjYTg5ZjA5MTRmYzk4NGE4N2M3NjkwYjM2MjI5ZjQzNGNhM2YwMDk0M2FhNDdiMTg4YjczYzkwNWRlZTVjNTVhZDEwMmNhMWU0NDViMTYxZTllZGI4MTAxNzE0MjY2OTBkYjg5MmEwZDFmYjI0MyIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZXJyb3JzLXYxLjIuOSI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vZXJyb3JzIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2Vycm9ycy12MS4yLjkiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZXJyb3JzLXYxLjIuOSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzY3ZjRlNDIyNjFjNTZhNmQ4MmFmZGQ3ZWFmMzk3MjA4ZjdiNmRmNTA0MjUwM2VhMjc3YmJiNGY1NzZmMDA4MDEwNGNhZGZjMDAxODUxOTFjYjRkNWM2MWEzOWM1YzE5ZTczMTUyMThiNTYyZDdlYThhNTc1NThjN2MwYzdmMTEiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4wIjogewogICAgICAibmFtZSI6ICJAZW5kby9ldmVudHVhbC1zZW5kIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4wIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4wIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Vudi1vcHRpb25zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vudi1vcHRpb25zLXYxLjEuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvRS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvRS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjI4NzBhMjhiNDFkYzA0NzkzMzQ3MTdkYzU4NGU2NTAyMDY0NTAyYjNmYjUwYTA5OWViY2VmYjQ0NDNjZTkyY2ZjN2NlN2RmM2ZjYzMxM2NlMzI1OWVmNWE5Y2I3NDBjZTlkMjI2ZTE1NzdmZTIxMWFkYjE5NGVmZDhkOWRjNWY3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4cG9ydHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4cG9ydHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxYmU2Zjg3MDYwNWM1ZTVlNDJmMzllZDI4MjIzNzhhYjllYWY0ZmE2YmRhNzQwNzBiYWM1OGZmZDEwZTE0YTA3MmNmODA5NmZlOGM2OTg2ODAwYTk5NWUyYzYwNGI4OGNhMjcyMWY5OTFiNTUwNzFhZTZmM2UzZDBlYTNiYWFmOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9sb2NhbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbG9jYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5MDdlZGNlYTc0OTRjNjYyY2Q5YjJjNjU1MzkxYzY0YWUzNjkxZGEyMTFkYjIzMjQwOGI1ZTQ4ZTZjNmMxNTJhZmY0ZDJhMGE0NWQ1OGU4Y2E1NDViOTZkNmY4YTM2YWRlODc3MDFiYTcxODYwZjRhZjczMTAyOGM2NjY2MTQyMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTk2MjdmMzNjODUwYWZiOGZjMjZlZjhlNTdlMDhlMWQyNDk4ZmZiN2VkYWE2MTMzNjY4NDRiMDA0Mjk5Mzg4NDYwODlkMDJmZDBmM2Y2NjcxNzg3ZWYxMDhlNWQ1MWY5ZTQ2OTY3YTExZmE5MzFmYjNjZWIzOWIxMGM3YjE3NDkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbm8tc2hpbS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbm8tc2hpbS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJkMzcwNjNmNDdkNzdiM2RkNTAyYjU4MGU2ZWViYjVhNzkyNmQyZTliN2U1MzFiZmZlMmYyODg0OGQxM2ZhYWMyMDE5YjhkYjA3YTE2ZTZhMTNlNzg1MzRiYzA4YzUxOWQzNmZkMWRkMmFhMzExZWU2NTYyN2QwZjQ2NjAwYTZkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RyYWNrLXR1cm5zLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90cmFjay10dXJucy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjA2ZWQyY2UxZTY5ZmY5MmEzYTQ1ZTBlOTgyY2QwYTYwZmJkZWQ1ZmYyNjc1NTlmZmQ1NTkzOWJlYzljYWMyOGU1MGNhN2MyYTQ0ODgwY2FiZTdjY2E2YzhiMDg4Yzk2YTVlYjE1YWQxYmQ2YjBlOTQzYWIyZTBiZDI3OTQ3Y2E0IgogICAgICAgIH0sCiAgICAgICAgIi4vdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAidXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjYzJhMTgxZjczMzY3ZDMwYjI1ZDBhZjUyMGE1OWUxOWU4ODM3MzZiMzY4N2Y5ZDc1NjU4M2YwNWJhOTkyYzFlNjgwNDU1NGExYmMyMzRlMzVjZjViZDAwYTk4OTQ4NDJmZjdhMjI4NTJkNTQxYmNlYjA0YTM2ZGQ3ODllZTc2NCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZXhvLXYxLjUuOCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vZXhvIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2V4by12MS41LjgiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZXhvLXYxLjUuOCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9jb21tb24vbGlzdC1kaWZmZXJlbmNlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2xpc3QtZGlmZmVyZW5jZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi45IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9vYmplY3QtbWFwLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vudi1vcHRpb25zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vudi1vcHRpb25zLXYxLjEuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3V0aWxzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjEuMS4xMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS40LjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYxLjQuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjEzNzcxMmIzZWU0MjhmZThjMmNjMDIwZTE4NGI3YTc2Yzk2MWU1NjBmMjM1Njg2NDc5NDIxYTIzOGU3MDJjZGUyYWY1NDg2MWMxZjg1NTA5YjQwY2NmZjAzN2M0YzQ0NzVmNmNhYjU3M2ZiYjdiZGY3Mjc1MTlmMDQ1NjY1NzA1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4by1tYWtlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4by1tYWtlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmMjFmOTIyNWZiYjMxYzEzYzQ2MGNjZDM5NTlhNjZhMWY0YWJlMDQzMDZhZGQxMWI4MGZkZTE0NmFjY2Y4ODNjYWI4OWQ0NzM2NjEzNTc2NTYzMWE5NTRkOWU5N2Q1N2EwY2I2MGZiNmQxZjdiOTM5Njg5MmZiY2I1Y2VjMzk1NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9leG8tdG9vbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4by10b29scy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjgyYTRmZjEyM2M2NDFlY2VhNmQ4N2Q4Mzk2ZTc1OThjZjdjZjRjMzUwMzVmOTZkYzFhMzdjZTdkMDk2MTcxOTk4MWRjNzNkMGI1ODlkMGU4ZjJkNWFlZjYxOWRlZGM1Yjk3ZTljYTBhNTFjMmJiY2I2ZDliZWIwZDdjZTcwNWZlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2dldC1pbnRlcmZhY2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2dldC1pbnRlcmZhY2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4NjUwZWE1YTFhNzdkZWViMDcwYjM3YzIwN2UwOWU3MWNiNGUwNTI5YmM4N2FhMTFlYjdiMWU1ZTM2MDViNzc1OWU3YTY0YTAyMGI4YWYxOTNhYjQ2Y2VmN2VjMmNkZTkxYmI0ZDdjZjg2ZGEwZmU5YzNhNTkwNDhjODliOTRlOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxYmU2Zjg3MDYwNWM1ZTVlNDJmMzllZDI4MjIzNzhhYjllYWY0ZmE2YmRhNzQwNzBiYWM1OGZmZDEwZTE0YTA3MmNmODA5NmZlOGM2OTg2ODAwYTk5NWUyYzYwNGI4OGNhMjcyMWY5OTFiNTUwNzFhZTZmM2UzZDBlYTNiYWFmOCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZmFyLXYxLjEuMTAiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2ZhciIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9mYXItdjEuMS4xMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9mYXItdjEuMS4xMCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9leHBvcnRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9leHBvcnRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWJlNmY4NzA2MDVjNWU1ZTQyZjM5ZWQyODIyMzc4YWI5ZWFmNGZhNmJkYTc0MDcwYmFjNThmZmQxMGUxNGEwNzJjZjgwOTZmZThjNjk4NjgwMGE5OTVlMmM2MDRiODhjYTI3MjFmOTkxYjU1MDcxYWU2ZjNlM2QwZWEzYmFhZjgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTM4NzMwNWJmMDkyYzg2NjdkMTdhMWFlMGVhMjg3ZWY2Y2IwOGNlMjA2ZWI3MmY4ZWU1YTU2OWI4ZTZjMmUwNzIyMGUxNTNmN2EzNmY0NGVkMTQ3YzQ3MGEyNTc3NWU2MmRhNGViZTRkOTkxYTg5OTZmOWY5NDA4ZjZjNzgxNjIiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL21hcnNoYWwtdjEuNi4zIjogewogICAgICAibmFtZSI6ICJAZW5kby9tYXJzaGFsIiwKICAgICAgImxhYmVsIjogIkBlbmRvL21hcnNoYWwtdjEuNi4zIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL21hcnNoYWwtdjEuNi4zIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL29iamVjdC1tYXAuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjUuMC4xNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS40LjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwMjQ5MzM3YjhkMjE0ZTc5NzUyNjZmNmJkODIyZDU0MDg2NmJlZjQ4Yjg4MjMwZjIwYTM0YTkxMGExMjAxODdiMDMyMTQzMTVlNWMwMWE5NTRmMzgzYmZmNDdmM2RkYzQ4NWMzZDI2ZGU0ZGI0MmM3ZGM0NTYzYmM3ZjAwYmIyMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlUGFzc2FibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2MTc2NzE2ZDdiMjFjMDc0MjNjYzk2OGE2OTA5ZGM3YzA4OWM1MTg1NzAwNzdmMTMzZjkzNzI5NjIyMGUxMzRjNjQzZmJmODZlNDcyNzhiYmUyMTU0MTg3N2Q0M2E4M2JmZWY3ODY2OTFmMGEyMjhhYzE5NDBlYjJhYjBiYmQ4OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZVRvQ2FwRGF0YS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUxZjhkZWRiMjcwZmMyZDdmZGU0MjY1Njk4NDc5MjA5ZWJhMGY0NjdhYWU4NWQ4MmNhNWUxMGU2NDNkZDRkZjNmZTE5MjQ0Mjc5M2I0ODgyNWVkNzBmZTdlNWVhMjZmMzJiNzc3ZGZmYjg3MjY2YzkyZWI3ODM3MjFkOTY2M2ZkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjViMGJkOWI3N2VlOTc2MzVhNmE4YmQ1ZTRlMzNiZTNlZWRhOWQxYzczYzY5MjYyOTlmMjg5YWFlNTBkMTlkM2UyMjgxMTE5YTcwYTBhMjFmYTE0MjY2YzY3MDVjNTA1ZWYxNTczOWRkZTliYmFkNzgzMTk2ZjQ3ZTk3NDM4NWIwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwtanVzdGluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLWp1c3Rpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjBiZDY0ZDA5MTU1MDlhYTNkMTdkNmIwOGYwOGYyMzM4ODA3YTVjODg1MjFkNTAxZmJlMTU4ZGMzNmZiYTFjMDhiZWYzZjk3YzRkZGU5ZTViMjI5NTU2NzlhOWQzOWZkZjNiMTY1MDYyOWMxNzMxOTViMjg1ZWYxODk5MDUyNGFlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjE4YjE2NTU2OWE4ZmQ4NTFlNmUyNTQyM2I3NzQyMWM2Mzk2NjQ2NWEzNDU4NDA0MjE0OTFjYzA4NGQ2ZDJjYmFlYTM3MzMzY2U1MWVmNTljNTdhMjMzYzkyNTdhOTY3ZjMyNTBjODdlMzMxYzY4MmM2NDQ0MTMzYTkzOTc3MGUwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3MjIwNWFkY2U3NGY5NWM2YjllMDgwYmU0ZmIwOTJmNDAzMWYwYTI2Y2FmYzIwOTRlNGMyZDQ4N2M4MzI4OWMyOGU4YjY1NzY5OTA3YjYwN2Q0ZDM0MTFiYzQ4ZjljMGEwYzdkNGM3YjM1YmQ0ZGQ4OTg0ZTM1OWIzMjY2OTAxMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yYW5rT3JkZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JhbmtPcmRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImMzZTVlN2E2ZWQ4NzM1MzdkODgyZjhlOWE2MDNhMWNjYzI1ZTc3NTVjMWUxYmZkZTA1MjRiYTE1N2NlYTQ2ZGU4MTc3MDNmMTQwOThhZjRmOTdmNWM3MmQ5Yjc5MDBjNDRiNmU0NDNiYTY3ODBkOTFkOTFmNDkxMGQzYWI3ZTg1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFiZTZmODcwNjA1YzVlNWU0MmYzOWVkMjgyMjM3OGFiOWVhZjRmYTZiZGE3NDA3MGJhYzU4ZmZkMTBlMTRhMDcyY2Y4MDk2ZmU4YzY5ODY4MDBhOTk1ZTJjNjA0Yjg4Y2EyNzIxZjk5MWI1NTA3MWFlNmYzZTNkMGVhM2JhYWY4IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9uYXQtdjUuMC4xNCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vbmF0IiwKICAgICAgImxhYmVsIjogIkBlbmRvL25hdC12NS4wLjE0IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL25hdC12NS4wLjE0IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImYxMDBmOTQwOTQ0YWIzNTQzMmU1YTI2YWRkZDYzMmM0NWMyNGMzZTFhNzA4MDAzYmRjZTg0NTYxYzRlMTBmNjBhYzEzN2NjMWI3YzY4ZDIwNjk1NTNlOTE2NDE0MDYwYzM5YTJmNjY1NmNkZGNjMDJmYjFkYjNjYTNlYmVlZWY2IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9wYXNzLXN0eWxlLXYxLjQuOCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcGFzcy1zdHlsZSIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjQuOCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjQuOCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9lbnYtb3B0aW9ucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi45IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi91dGlscy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmYTc3NjY0NTFlM2NhZjMwYmM3NTExNjU3OTg2NDJjYTQ4M2FlNmQyYzNiYjhlNzc3OTAwNzFiMTdlZmEzNDgxZjNhYjgzMDMzMjc0YTM2NTQzMTU4MWIyNTYxYjA3Y2UxNjQxMWI0YWE0NjA1OWQ1YTVlNDc2YjE2YWYwZmUyOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb3B5QXJyYXkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvcHlBcnJheS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjVlNWQxYjEyZDE1ZTEwMDUyNjNkZmQ0NGY3NWVhNzIyMGEyZjFmMmYyOGQ5MjZiZTgxMGU3NmE3OTRmYjkxYzhlMjJkZWMzYmJhMWQ2ZDE4ODBhMzNmYTMwOWRhNDdiNjgxYjgzMDQxNmExY2I1ODg1ZGUxYTNlMDZiYmMyN2Q0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvcHlSZWNvcmQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvcHlSZWNvcmQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkOTRlZmM5NzVlNjU0MTE3YmEzMWIyNGE1M2EwZGIzNTA1ODUzNDUzMjZmNGQyZmQyZWViOWViMzBkOGY1ODM5N2MwMjhlYzNmMTMwZDAzN2ExMDcyNTJjNDVlM2MyNzNjMzZiOTVmZmJhYzcwYTk0YjdlYmFjYjI4MWFmMmJiNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2RlZXBseUZ1bGZpbGxlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjAxOWZmM2YwNTFkODE4NTg2YWJmNWEwYzAyOWIzMGQyZTdjZDNiZTRkM2VmM2Q3ZDQwMGYwZmM1NjhjNjllNzQ4Y2EzMjk4MmZiZjVjNDliOTdhYTgxMTA2MTIxZGIzNzMxM2JhMTY0MDlhYTVlMTdmZWIxZWFmNzFhOWNmNDA1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Vycm9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lcnJvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjIxNDVhYmQ3NmViNTU3YjAxZDA0OGU0NTI2MGMxYTU1OWQ0MDI4Y2JlOWNiMzAwNjI4MmJhMTcwZDQ1NjI4ODY1NTBmNDk4YmU1ODRlZDJiNmZmZmMwYjgwOTExNjdkYjYwOWZiNjk5OTE4MDA0MjFhNWY2ODFkYmRkMzI3YTEzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2l0ZXItaGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaXRlci1oZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzA4NGY2ZGQxNTNjY2Q2ZjAxMzFmNTAyNjEzYmQ3ZmNkZTIzZDE4NWI2Nzg0YjI1ZGI1OWIxZWVlNWIyZmJlNjUwNTViOGVjZDVhOWUwMjRhYzFmOTY4MTA4OWQ0ZTRlZTBkYjAzMjdkOTQxMDdhODdiYjU5MjA2YzU2MzkwMmEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFrZS1mYXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ha2UtZmFyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNmI0OTI3YjAxNTViMjI1YjkzNDIxMWNkNDBhMGYzMGQ0M2Y0ZDcwNzgzOGM2ZmUwYWJjMTBkMWZmZTlkNWQ5NDY1NDMzYWEwMmNlMDU1YWZkNDNkMWUyYTg1ZGIyNGRjOTA1M2RmNTY3NzNkMmNlMjQyZGNmYTA4MjExY2Y2NDIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFrZVRhZ2dlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZVRhZ2dlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhmZjVjZTQyMzBmZWJiNzUyMDY0YmMzZjA5YWRkMGFmNGE0OTU4YzIwYjNjMjUyM2M5ZDdkMGVmYzNjYTkxMzE3YzcxMThlODU0NWY4ZGEwZjU1NmJiYmRiYWZmODUyYmFlYmE1YTYxZjQyOTY1NGEwMzQzMzUwYWMyOGU3OGQ1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXNzU3R5bGUtaGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImMxOGRkYzg4MWJhNjJhNzM1NGY1ZjA5MTQ2NGFjYjFkM2I3ODBjNDRlZjg3ZjZhNmVlYzliMzk5ODY1MTBiOGRiZGJhYzEyNjgyZjdkNTdiMmNiY2Y0OTNiYmE3NTIyZDJlOWU1NTllZGY5ZTA5MmJiNTg2MWE1NzVkNWUzNzY3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Bhc3NTdHlsZU9mLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXNzU3R5bGVPZi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImRmYmRmMDE2OGQ4ZTg5OWM5ZDdkZDQwNDdjNzA4YmE1ZDI2MzExYzVkNGIzOGFlZmFhNzk2NjBjYzU2NWU2NmQzZmZkOWMwZTcwN2EwYjBkYzk2YmI3NWI1ZGUxYTJiODNmNDYwZjcxNTc3Yzk1OGIxYzBlZjVjZjcyYTkwNTY0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JlbW90YWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmVtb3RhYmxlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzI3NzIwOTViNDc2MWM2OWEzYzBmMmZjZWJmMTk0N2I2NzgwZDMwNzczZGRmZWYxODMyN2JlYTA3NjE0ZTY4ZTcyZWFlMGQxNWVmZmI4OTMxMzFlM2Y4NjM3ODZkOGQyMTc3ZTI5ZmZhMjk4OTNjNGVkMTUwMWRjZWEwYjg5ZjEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc2FmZS1wcm9taXNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zYWZlLXByb21pc2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjNTQ2YmJhOTkyY2YyMTQwYmFlOTJiMWNjOWQ1OGQ5YzI5ZGNjMDM0NmIxYzAwOWI0NDIzNjBlNzMyNWQyYWRjNjEyN2I5MWYwYmRlNzAyN2M2Y2ZmNWExNjhjMTY5NTkzMjczOTY4OTIwM2E1MmQwZGZhYWFhZDU5MTAwYWVlMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdHJpbmcuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0cmluZy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImRhOGQ5MTBmNzE1ZmI4N2FmZTdkODI2NjQ5Yjg3YTM5YTZhZWUzYTY0ZDlmODE5NmIyNGM0ZDUyNzU0YTBhZDhmYmZjODIxMDNjOWIyYzBjY2M4NWYyMzQ3MDcwZTcwYzUwMGUyYzlkZTJkMmZlZDBhNTUwZjJlODc4YzcxNTg3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N5bWJvbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3ltYm9sLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTY1MWE0NDA3ZTRmMDVjMjQ1NGE5NmMwNjE3NDJmNjg0OTI5YTUxMWY0YjA3NTkzYmM3ZWE1ODk2M2M3YzVjOTQwZjJhMWE5MWI4YzY1MGI0ZWE4NzQxMDlmOGQ1NjM4ZDYyOGIyY2E3YTZlZjlhYzk3NGM2YWRmYzg2ZDZiZjIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdGFnZ2VkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90YWdnZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0YmRiMGE4MTdmZmZjNDhkOGYxMmZiY2EzY2I5NmE2NjQ5OWE2NWZjNmI5ODk2MzkwNjMwZjg0YTcwNWY2MjU3OTFiZjEzY2ZkOTE1NzI0NmMxMzlkOWJjNjE2YTYzYTRkYzE2ZDJkNGYyNDM0MDlmNzM4MTcwOGU5NjNjMjRiMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTcwMTQ0ODc4NTEzMmUzYWU5ODhjYTE0OTBjY2Y1MDRjNGE4ZThkMjVkNGJiZmQzZjkxZjU2NDM3ZWFjYTFjMzlhOTgwOTgxZmE1Mzg3MGU1YTAyMjcxYzBjY2Q5YmZlMTQ5ODc1NTUwYmUxYWQ0OTRmNzNmNGZjODcwMDgzYzUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWJlNmY4NzA2MDVjNWU1ZTQyZjM5ZWQyODIyMzc4YWI5ZWFmNGZhNmJkYTc0MDcwYmFjNThmZmQxMGUxNGEwNzJjZjgwOTZmZThjNjk4NjgwMGE5OTVlMmM2MDRiODhjYTI3MjFmOTkxYjU1MDcxYWU2ZjNlM2QwZWEzYmFhZjgiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL3BhdHRlcm5zLXYxLjQuOCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcGF0dGVybnMiLAogICAgICAibGFiZWwiOiAiQGVuZG8vcGF0dGVybnMtdjEuNC44IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL3BhdHRlcm5zLXYxLjQuOCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9jb21tb24vYXBwbHktbGFiZWxpbmctZXJyb3IuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuOSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYXBwbHktbGFiZWxpbmctZXJyb3IuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuOSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZnJvbS11bmlxdWUtZW50cmllcy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vaWRlbnQtY2hlY2tlci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi45IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pZGVudC1jaGVja2VyLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9saXN0LWRpZmZlcmVuY2UuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuOSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbGlzdC1kaWZmZXJlbmNlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9tYWtlLWFycmF5LWl0ZXJhdG9yLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL21ha2UtYXJyYXktaXRlcmF0b3IuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL21ha2UtaXRlcmF0b3IuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuOSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbWFrZS1pdGVyYXRvci5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi45IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9vYmplY3QtbWFwLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi45IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuNi4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzE3YjRiODFlOGE4YzkzNGUyZDQ3YTc5ZTE2MjhlN2VjZDBkYzM0NDhmZjRlNTdkMjQwMDUzMmFlM2JiZTE3Zjc2OTVkZDg2MjcxMDUyZmE0N2Q3ZGFhOTFmMWQ4YTc3MGZkYzIzMDM0MjU4NjE0MjY1MzM1ZTc3OTYwYzQxZmMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9jaGVja0tleS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9jaGVja0tleS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjliOGYzOTlkMDY0NjllYzE2YWFhYTNlYjc4ZTllMmVmZDczMGRhZTQyNTlmNWMxN2FiMDc2ZTI0NGYzMGU1M2VkMzA5YjFiMmY4ODdhZjFkYzA4YTIxYWRiOTc3ODI3NzQ3MzJhMWViZDRlODBhM2M3NGNmNTc1MWNhYmZkMDNmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvY29tcGFyZUtleXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY29tcGFyZUtleXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3M2JhZGExNmRjNGVjN2YwYjFhNzhlMzU3Zjk3ZjJmZGZmOTJhZjBlMzA0YzM4NWMzNjY4OWU2MGY1NGIzNWY0ZjdmMTJjOWE4OWM0NGNjYTg1ZjgyNjFmODYzMjZiNGU2Zjk2ZTZiMTdmMjRiNTBiZGJmYjFiMDc2Yjc1NGIzMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NvcHlCYWcuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY29weUJhZy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjA3NzI2YjIwMjEzZjAyNDVlYjg5NmNlYTVjNGVhZWRjMmY0YjQwZTllOTZlNjA1ODE3YWVjMmI0YzhmNjE1NjdlYTQyMmM0MWZmOWNmYWNlNzg5OWE1ZDZkOWRlNmQ5ODQ5OWFhZmJiNGM2NTFjNDA1YWUyNDUwZDFkMGNmNDY2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvY29weVNldC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9jb3B5U2V0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzg2N2JiODE0YjMwNTIwY2ZhYjVjYTE5OTEyMmJhOWZmYjRhMzA3ZmRlYmFiNWQ4NDU1OTgxNWFlNWY5MTlhNDZlZmMzMzE0MTY4NjU1MjlkM2NiZjk5ZTJjODY0Yzk3ZTUwYTIzYjE0ZTEzNTMwODU3NTBjMGQ5ODZjZTNiMGEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9rZXljb2xsZWN0aW9uLW9wZXJhdG9ycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9rZXljb2xsZWN0aW9uLW9wZXJhdG9ycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjk5MDQ1ZGYxZTFlM2NkM2FmNTA1MjAyODQ0ZjQ3NjczYjQzYzEwNmNhN2MyMzcwYzUyYWNjMjc4ZTE2YmIyMTljNWZiOTcwZjQ4YzkzOTNkZmI4NzdlZTU2ZTdkM2RlMTZhYjJiOTk0NTdhN2Q1OWY3MzA3ZjliNThlYTk2ODg5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWE5Zjc3ZTk2YjQxMDc5MjRjMThmY2FlZmEyOGU4MWQzOTY4NTAwNzY4ZDZkZGUyZjViNjMxMTFiZDM0NGYwYmQyNDI3ZTY0NTJjY2ZlMWRjYzllZjNhNTA5NGUxNDczMTU4NWIwM2E4MTJlNDNjN2U2YzQzNWZmYzFhYTY1YjMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxZWE0ODM4MWFmNDI5M2IyMmQ1Y2ZlM2I4NzQ1ZWM3ZjEwYmZiMGRmM2E3Y2Y1ZGVlZTViMDEzYzBjMWIzYTRjODkxOThkMTkxNTAyMGQyYmU4ZThhMzNlYzc2ZDAzZjdjN2M5YWYwNGQwMjdjZjc2NGU0NjA5NzE0MmYyMjlkMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXR0ZXJucy9nZXRHdWFyZFBheWxvYWRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXR0ZXJucy9nZXRHdWFyZFBheWxvYWRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjY3MTY2MTAwNDlkYTk1ZDdjZTM2NTVhMGY1ZjE5ZGI3YmQwNGM3NzA1ZDdmNzgwZGE2MDY1Y2EyZTU5YjljY2EzMTAxY2QzNGM1MWJhYWEzOTE1MDE0MmZiMjNhMTFlNTdhYTUzZDRiZDViOTNmMzcyMzgwZGJhMzlkYTAxNTgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4ZTE4YmI0YzJjMjE5YzRjYmE2MmEzNTVhMDdmYWQ5ZGJlNTdmNzliYWU5YjYwNTk0N2FmYmY4NTg4MDY1ZGQ0ZDIxMzI4Y2U3ZWQ0NjFkNWIyNDcxY2Q1YTg4MDUxMWQ5ZTI4YzYzNmJjMzQxYTA5NDIyODUxZGQxNDNkNDM1MCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxYmU2Zjg3MDYwNWM1ZTVlNDJmMzllZDI4MjIzNzhhYjllYWY0ZmE2YmRhNzQwNzBiYWM1OGZmZDEwZTE0YTA3MmNmODA5NmZlOGM2OTg2ODAwYTk5NWUyYzYwNGI4OGNhMjcyMWY5OTFiNTUwNzFhZTZmM2UzZDBlYTNiYWFmOCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS45IjogewogICAgICAibmFtZSI6ICJAZW5kby9wcm9taXNlLWtpdCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjkiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS45IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwYzJjOWQ0MmE3MWUyZmRhZGY1MDRlYjUwMzllMGFlOWFiYzM5YzVhZjRhMmY3OGY3YTYzZDAzNTA0YTE4OGQyZDY1ZGNmY2E4NzE2YmUwOTM1NmE2Y2Y5ODNmMTI3YTk2MWRlOGVkNTA2NTZmYmNiZGQwZGFkNDkzY2JkMDAzMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pcy1wcm9taXNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pcy1wcm9taXNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDQ2ZTlhYjY3NTBjM2ExNTY5MjBiYzEyYWQyMjU0N2I2NmZjNDEyZDZmZDAzZGYxYTQyZjY5NTVhYTZjNjJkNzE0NTY1ZjMyOTE2OWFiNDc2NmZlMGIzZDE1NmQyZWU1ODdkYzY1ZjA3ZGU4MzYzYmI0OGE5OThhMTkzYmViOGQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWVtby1yYWNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tZW1vLXJhY2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmMzcxYjA4YjMwMjE5ZDMxMGYzN2U4ZjFjZWMzMDA0ZGEyMDlkN2I3ODljNjA2ZmQ0MGIzODBjNWUwZjg2YWVlMmEwZDg0ZTMzZTExMTA4ZWM1YWFkMGU0OTRmNTQwMGY5NWYwZTMzYTU4NDYyNGViMzExMDQ5MjMwNmZiZjNlNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4Nzc4ZmM2YmE3MTM4ZGNkNzA1Y2FhOWNkMzk4YjkyYzM4NTFhYTJlYmE3ZjM3OWE0OWVkYTU2MzQ1MjMxMzE5ZTZiZTkyOTYzNGQzNjJkYzkxZTQ1NGQ5OTE0NGVlZDE3MTkwMjQ2ZmQ3MjM3ODU3NzFhY2NhYjZiYjYyMWU4OCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxYmU2Zjg3MDYwNWM1ZTVlNDJmMzllZDI4MjIzNzhhYjllYWY0ZmE2YmRhNzQwNzBiYWM1OGZmZDEwZTE0YTA3MmNmODA5NmZlOGM2OTg2ODAwYTk5NWUyYzYwNGI4OGNhMjcyMWY5OTFiNTUwNzFhZTZmM2UzZDBlYTNiYWFmOCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vc3RyZWFtLXYxLjIuOSI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vc3RyZWFtIiwKICAgICAgImxhYmVsIjogIkBlbmRvL3N0cmVhbS12MS4yLjkiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vc3RyZWFtLXYxLjIuOSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzNTY4MTU5YjhmNDVkNjcwMTYwYzk2MDBiMDE1OTQ1ZDQxYzRjMjBhZTdkMThiYTdjYjgyZTI2NzIyYzFjOWU4MzEyOTM0YmNlZTM1ZmZkM2Y3MGZkZWRlNGZmNGY3ZDE5YmE0YTFmMTMyYmJkMjhlZGM0MTBmNjcwMWNhYzVlMSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiamVzc2llLmpzLXYwLjMuNCI6IHsKICAgICAgIm5hbWUiOiAiamVzc2llLmpzIiwKICAgICAgImxhYmVsIjogImplc3NpZS5qcy12MC4zLjQiLAogICAgICAibG9jYXRpb24iOiAiamVzc2llLmpzLXYwLjMuNCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYxLjEuMTAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZWI4ZGYzMzY1YzViMGY0YjBmNmJmNmMxM2Y3ZTI5NmU3NjAzMWQzNjcxYjI4Y2I2ZDJmZGVjNDdmYmI3ZDE3YjBlNjk4NDgxN2FhNDAwOWRkYzY4Y2ExMDlkYjc5MzgyODAyZWUzZWIxMTViZGM0NTU4YjkzNjNhMmM2YmEyOGIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmluZzAvRS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzAvRS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdmNDIzNzE1ZWZlZDk0YzBlMWU5NDEwMGY4ZjVlMTYzZjUzMTAzMTk1NWExNmYzNTkwYWMyOTA1OTU3OGM5ZGRjZjg0ZWNlNzczNTAwNDkxYmJkZWNmNWQ0M2E2MDViYjc0NWM1NzA5OTAyM2JjOWIyYWM3YTM2Yzc1YTNjMmJiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JpbmcwL2FzeW5jLWdlbmVyYXRlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMC9hc3luYy1nZW5lcmF0ZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFkYTM0ZGNiNmJlN2ExNTMzNTBjNTU1MTUzODE1ODY4ZDEyYzg3MDYxNDU1MTc1NmQxODk0MWNiZTdmMDc1M2E3ODZlMTBmN2M5MjYxZjEyYzFiNTU0NzY1YWMxZWQwY2E3MGU4NzY3N2UwM2JiZGE5OTcwNTgxNGVlZjQ1ODI2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JpbmcwL21haW4uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JpbmcwL21haW4uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkYTEyNWFkYTI2MDdiZDc2YjQzOWY3NTg4YmQzOWZkOGI4MDY4Y2Q4NjI5OWRmMDk2NDdlM2ZhMzVkMDZkMjU1OTkyOGIzNjk4ZGNmZDhhMDI1YjAwMTJhODU3OGU3MDQ1Nzk1NWUwYjFkMTZjMWFjOTI3MjI1NzIxMTRmMzgyMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMC9tYWtlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JpbmcwL21ha2Vycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjgyYTVkZjFlZDEwNGUzMzM1YzMyNTMzZGQ2MDk0NDE0ZTllYTU3NGQ0YjQ3MzVkMjkzZGFiMWY1NWM0MzI5Y2UwZDc4ODIxNjdkZDIxODAyY2I2ZjJkOThkOTdlODNjNmE3Nzk5Y2E1Yzc5OGI5MmEzN2MzODczNjA4NmI1MWJkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JpbmcxL2FzeW5jLXRvb2xzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMS9hc3luYy10b29scy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjljNTIyZGQ2NTc5M2QyMjIxNTkwZjYyZmM1MDEwOWI2ZDk1MmJjZDU1ZDI5NWNhNzgyMGQ1NDVhNmQ4NDEzNDMwYjI5ZWU1ZTQ2ZmZiZTZjNWU2ZTA3ZWM4MzQ0ZmRjOTcyOTRlOGE3MjZiMjQ5YmM3OTgwMjNlZDMzMmZlMDYwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JpbmcxL21haW4uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JpbmcxL21haW4uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwOTNlYzRiNGMzNGUxNzY3NWU4MGE5OTNjODcxMjJlZTE5NDRmODk1YTA5ZWExODUzODlmNDE5OThlNjQ1ZmE0OTQ0NWE3N2Q0MTYwODMyODMwYjhhYzgyZjhlMTBiZGZjYjBmYTJjM2E2YjYwZDhhNTIzNTM1MmEwYjMzOWIzZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9Cn1QSwMECgAAAAAAAAAAAOgouyiuAQAArgEAACYAAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjEtdTE5LjAvaGVhcC5qc3siaW1wb3J0cyI6WyIuL3NyYy9oZWFwLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9zcmMvaGVhcC5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjNj19pbXBvcnRzKFtbXCIuL3NyYy9oZWFwLmpzXCIsIFtdXV0pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAVESyZ5AQAAeQEAAC0AAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjEtdTE5LjAvc3JjL2V4cG9ydHMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRozY9faW1wb3J0cyhbXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAWxIkmYgKAACICgAAKgAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMS11MTkuMC9zcmMvaGVhcC5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vZXhvIiwiQGFnb3JpYy9zdG9yZSIsIi4vbWFrZS1vbmNlLmpzIiwiLi9rZXlzLmpzIiwiLi93YXRjaC1wcm9taXNlLmpzIl0sImV4cG9ydHMiOlsibWFrZUhlYXBab25lIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgRmFyLGlzUGFzc2FibGUsbWFrZUV4byxkZWZpbmVFeG9DbGFzcyxkZWZpbmVFeG9DbGFzc0tpdCxtYWtlU2NhbGFyTWFwU3RvcmUsbWFrZVNjYWxhclNldFN0b3JlLG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUsbWFrZVNjYWxhcldlYWtTZXRTdG9yZSxtYWtlT25jZUtpdCxrZXlzLHdhdGNoUHJvbWlzZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcIkZhclwiLCBbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wiaXNQYXNzYWJsZVwiLCBbJGjNj19hID0+IChpc1Bhc3NhYmxlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXhvXCIsIFtbXCJtYWtlRXhvXCIsIFskaM2PX2EgPT4gKG1ha2VFeG8gPSAkaM2PX2EpXV0sW1wiZGVmaW5lRXhvQ2xhc3NcIiwgWyRozY9fYSA9PiAoZGVmaW5lRXhvQ2xhc3MgPSAkaM2PX2EpXV0sW1wiZGVmaW5lRXhvQ2xhc3NLaXRcIiwgWyRozY9fYSA9PiAoZGVmaW5lRXhvQ2xhc3NLaXQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtYWtlU2NhbGFyTWFwU3RvcmVcIiwgWyRozY9fYSA9PiAobWFrZVNjYWxhck1hcFN0b3JlID0gJGjNj19hKV1dLFtcIm1ha2VTY2FsYXJTZXRTdG9yZVwiLCBbJGjNj19hID0+IChtYWtlU2NhbGFyU2V0U3RvcmUgPSAkaM2PX2EpXV0sW1wibWFrZVNjYWxhcldlYWtNYXBTdG9yZVwiLCBbJGjNj19hID0+IChtYWtlU2NhbGFyV2Vha01hcFN0b3JlID0gJGjNj19hKV1dLFtcIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmVcIiwgWyRozY9fYSA9PiAobWFrZVNjYWxhcldlYWtTZXRTdG9yZSA9ICRozY9fYSldXV1dLFtcIi4vbWFrZS1vbmNlLmpzXCIsIFtbXCJtYWtlT25jZUtpdFwiLCBbJGjNj19hID0+IChtYWtlT25jZUtpdCA9ICRozY9fYSldXV1dLFtcIi4va2V5cy5qc1wiLCBbW1wiYWdvcmljVmF0RGF0YUtleXNcIiwgWyRozY9fYSA9PiAoa2V5cyA9ICRozY9fYSldXV1dLFtcIi4vd2F0Y2gtcHJvbWlzZS5qc1wiLCBbW1wid2F0Y2hQcm9taXNlXCIsIFskaM2PX2EgPT4gKHdhdGNoUHJvbWlzZSA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG4gKi9cbmNvbnN0IGRldGFjaGVkSGVhcFN0b3Jlcz1GYXIoJ2hlYXBTdG9yZXMnLHtcbmRldGFjaGVkOigpPT5kZXRhY2hlZEhlYXBTdG9yZXMsXG5pc1N0b3JhYmxlOmlzUGFzc2FibGUsXG5cbnNldFN0b3JlOm1ha2VTY2FsYXJTZXRTdG9yZSxcbm1hcFN0b3JlOm1ha2VTY2FsYXJNYXBTdG9yZSxcbndlYWtNYXBTdG9yZTptYWtlU2NhbGFyV2Vha01hcFN0b3JlLFxud2Vha1NldFN0b3JlOm1ha2VTY2FsYXJXZWFrU2V0U3RvcmV9KTtcblxuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlSGVhcFpvbmU9KGJhc2VMYWJlbD0naGVhcFpvbmUnKT0+e1xuY29uc3R7bWFrZU9uY2Usd3JhcFByb3ZpZGVyfT1tYWtlT25jZUtpdChiYXNlTGFiZWwsZGV0YWNoZWRIZWFwU3RvcmVzKTtcblxuLypcblxuXG4gICAqL1xuY29uc3QgbWFrZVN1YlpvbmU9KGxhYmVsLF9vcHRpb25zKT0+XG5tYWtlSGVhcFpvbmUoIGAke2Jhc2VMYWJlbH0uJHtsYWJlbH1gKTtcblxucmV0dXJuIEZhcignaGVhcFpvbmUnLHtcbmV4bzp3cmFwUHJvdmlkZXIobWFrZUV4byxrZXlzLmV4byksXG5leG9DbGFzczp3cmFwUHJvdmlkZXIoZGVmaW5lRXhvQ2xhc3Msa2V5cy5leG9DbGFzcyksXG5leG9DbGFzc0tpdDp3cmFwUHJvdmlkZXIoZGVmaW5lRXhvQ2xhc3NLaXQsa2V5cy5leG9DbGFzc0tpdCksXG5zdWJab25lOndyYXBQcm92aWRlcihtYWtlU3ViWm9uZSksXG5cbm1ha2VPbmNlLFxud2F0Y2hQcm9taXNlLFxuZGV0YWNoZWQ6ZGV0YWNoZWRIZWFwU3RvcmVzLmRldGFjaGVkLFxuaXNTdG9yYWJsZTpkZXRhY2hlZEhlYXBTdG9yZXMuaXNTdG9yYWJsZSxcblxubWFwU3RvcmU6d3JhcFByb3ZpZGVyKGRldGFjaGVkSGVhcFN0b3Jlcy5tYXBTdG9yZSksXG5zZXRTdG9yZTp3cmFwUHJvdmlkZXIoZGV0YWNoZWRIZWFwU3RvcmVzLnNldFN0b3JlKSxcbndlYWtNYXBTdG9yZTp3cmFwUHJvdmlkZXIoZGV0YWNoZWRIZWFwU3RvcmVzLndlYWtNYXBTdG9yZSksXG53ZWFrU2V0U3RvcmU6d3JhcFByb3ZpZGVyKGRldGFjaGVkSGVhcFN0b3Jlcy53ZWFrU2V0U3RvcmUpfSk7XG5cbiB9OyRozY9fb25jZS5tYWtlSGVhcFpvbmUobWFrZUhlYXBab25lKTtcbmhhcmRlbihtYWtlSGVhcFpvbmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUhlYXBab25lIjpbIm1ha2VIZWFwWm9uZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADM7NELmgIAAJoCAAArAAAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4xLXUxOS4wL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL2V4cG9ydHMuanMiLCIuL21ha2Utb25jZS5qcyIsIi4va2V5cy5qcyIsIi4vaXMtcGFzc2FibGUuanMiLCIuL3dhdGNoLXByb21pc2UuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL2V4cG9ydHMuanMiLCIuL2lzLXBhc3NhYmxlLmpzIiwiLi9rZXlzLmpzIiwiLi9tYWtlLW9uY2UuanMiLCIuL3dhdGNoLXByb21pc2UuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRozY9faW1wb3J0cyhbW1wiLi9leHBvcnRzLmpzXCIsIFtdXSxbXCIuL21ha2Utb25jZS5qc1wiLCBbXV0sW1wiLi9rZXlzLmpzXCIsIFtdXSxbXCIuL2lzLXBhc3NhYmxlLmpzXCIsIFtdXSxbXCIuL3dhdGNoLXByb21pc2UuanNcIiwgW11dXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAUdiVg4cCAACHAgAAMQAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMS11MTkuMC9zcmMvaXMtcGFzc2FibGUuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSJdLCJleHBvcnRzIjpbImlzUGFzc2FibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCByZWFsSXNQYXNzYWJsZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImlzUGFzc2FibGVcIiwgWyRozY9fYSA9PiAocmVhbElzUGFzc2FibGUgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG4vKlxuXG5cblxuICovXG5jb25zdCAgICAgICAgaXNQYXNzYWJsZT0oc3BlY2ltZW4pPT5yZWFsSXNQYXNzYWJsZShzcGVjaW1lbik7JGjNj19vbmNlLmlzUGFzc2FibGUoaXNQYXNzYWJsZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1Bhc3NhYmxlIjpbImlzUGFzc2FibGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAfuQVJKQDAACkAwAAKgAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMS11MTkuMC9zcmMva2V5cy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiYWdvcmljVmF0RGF0YUtleXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRozY9faW1wb3J0cyhbXSk7ICAgLy9cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3Qga2luZD0obGFiZWwpPT4gYCR7bGFiZWx9X2tpbmRIYW5kbGVgO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBzaW5nbGV0b249KGxhYmVsKT0+IGAke2xhYmVsfV9zaW5nbGV0b25gO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCAgICAgICAgYWdvcmljVmF0RGF0YUtleXM9e1xuZXhvQ2xhc3M6KGxhYmVsKT0+aGFyZGVuKFtraW5kKGxhYmVsKV0pLFxuZXhvQ2xhc3NLaXQ6KGxhYmVsKT0+aGFyZGVuKFtraW5kKGxhYmVsKV0pLFxuZXhvOihsYWJlbCk9PmhhcmRlbihba2luZChsYWJlbCksc2luZ2xldG9uKGxhYmVsKV0pLFxuc3RvcmU6KGxhYmVsKT0+aGFyZGVuKFtsYWJlbF0pLFxuem9uZToobGFiZWwpPT5oYXJkZW4oW2xhYmVsXSl9OyRozY9fb25jZS5hZ29yaWNWYXREYXRhS2V5cyhhZ29yaWNWYXREYXRhS2V5cyk7XG5cbmhhcmRlbihhZ29yaWNWYXREYXRhS2V5cyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhZ29yaWNWYXREYXRhS2V5cyI6WyJhZ29yaWNWYXREYXRhS2V5cyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAJluY9EQcAABEHAAAvAAAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4xLXUxOS4wL3NyYy9tYWtlLW9uY2UuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsibWFrZU9uY2VLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBGYWlsOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsIFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGRlZmF1bHRMYWJlbFRvS2V5cz0obGFiZWwpPT5oYXJkZW4oW2xhYmVsXSk7XG5oYXJkZW4oZGVmYXVsdExhYmVsVG9LZXlzKTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgICAgICAgIG1ha2VPbmNlS2l0PShkZWJ1Z05hbWUsc3RvcmVzLGJhY2tpbmdTdG9yZT11bmRlZmluZWQpPT57XG4vL1xuLy9cbi8vXG4vL1xuLy9cbmNvbnN0IHVzZWRLZXlzPXN0b3Jlcy5kZXRhY2hlZCgpLnNldFN0b3JlKCBgJHtkZWJ1Z05hbWV9IHVzZWQga2V5c2ApO1xuXG4vKlxuXG4gICAqL1xuY29uc3QgYXNzZXJ0T25seU9uY2U9KGtleSk9PntcbnR5cGVvZiBrZXk9PT0nc3RyaW5nJ3x8RmFpbCBga2V5ICR7a2V5fSBtdXN0IGJlIGEgc3RyaW5nYDtcbiF1c2VkS2V5cy5oYXMoa2V5KXx8XG5GYWlsIGBrZXkgJHtrZXl9IGhhcyBhbHJlYWR5IGJlZW4gdXNlZCBpbiB0aGlzIHpvbmUgYW5kIGluY2FybmF0aW9uYDtcblxuLy9cbi8vXG51c2VkS2V5cy5hZGQoa2V5KTtcbiB9O1xuXG4vKlxuXG5cblxuXG5cblxuXG4gICAqL1xuY29uc3Qgd3JhcFByb3ZpZGVyPShwcm92aWRlcixsYWJlbFRvS2V5cz1kZWZhdWx0TGFiZWxUb0tleXMpPT57XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3Qgd3JhcHBlcj0obGFiZWwsLi4ucmVzdCk9PntcbmZvcihjb25zdCBrZXkgb2YgbGFiZWxUb0tleXMobGFiZWwpKXtcbmFzc2VydE9ubHlPbmNlKGtleSk7XG4gfVxucmV0dXJuIHByb3ZpZGVyKGxhYmVsLC4uLnJlc3QpO1xuIH07XG5yZXR1cm4gKC8qICAgICAgICAgICAgKi93cmFwcGVyKTtcbiB9O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuY29uc3QgbWFrZU9uY2U9KGtleSxtYWtlcik9PntcbmFzc2VydE9ubHlPbmNlKGtleSk7XG5pZihiYWNraW5nU3RvcmUmJmJhY2tpbmdTdG9yZS5oYXMoa2V5KSl7XG5yZXR1cm4gYmFja2luZ1N0b3JlLmdldChrZXkpO1xuIH1cbmNvbnN0IHZhbHVlPW1ha2VyKGtleSk7XG5zdG9yZXMuaXNTdG9yYWJsZSh2YWx1ZSl8fFxuRmFpbCBgbWFrZXIgcmV0dXJuIHZhbHVlICR7dmFsdWV9IGlzIG5vdCBzdG9yYWJsZWA7XG5iYWNraW5nU3RvcmUmJmJhY2tpbmdTdG9yZS5pbml0KGtleSx2YWx1ZSk7XG5yZXR1cm4gdmFsdWU7XG4gfTtcblxucmV0dXJuIGhhcmRlbih7bWFrZU9uY2Usd3JhcFByb3ZpZGVyfSk7XG4gfTskaM2PX29uY2UubWFrZU9uY2VLaXQobWFrZU9uY2VLaXQpO1xuaGFyZGVuKG1ha2VPbmNlS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VPbmNlS2l0IjpbIm1ha2VPbmNlS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAF0ivuOCQAAjgkAADMAAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjEtdTE5LjAvc3JjL3dhdGNoLXByb21pc2UuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vcGF0dGVybnMiLCJAZW5kby9mYXIiXSwiZXhwb3J0cyI6WyJQcm9taXNlV2F0Y2hlckZ1bGZpbGxlZEkiLCJQcm9taXNlV2F0Y2hlckhhbmRsZXIiLCJQcm9taXNlV2F0Y2hlckkiLCJQcm9taXNlV2F0Y2hlclJlamVjdGVkSSIsIndhdGNoUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IEZhaWwsTSxFOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsIFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLCBbJGjNj19hID0+IChNID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsIFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5jb25zdHthcHBseX09UmVmbGVjdDtcblxuLypcblxuICovXG5jb25zdCAgICAgICAgUHJvbWlzZVdhdGNoZXJIYW5kbGVyPU0uY2FsbChNLnJhdygpKS5yZXN0KE0ucmF3KCkpLnJldHVybnMoKTtcblxuLypcblxuICovJGjNj19vbmNlLlByb21pc2VXYXRjaGVySGFuZGxlcihQcm9taXNlV2F0Y2hlckhhbmRsZXIpO1xuY29uc3QgICAgICAgIFByb21pc2VXYXRjaGVyST1NLmludGVyZmFjZSgnUHJvbWlzZVdhdGNoZXInLHtcbm9uRnVsZmlsbGVkOlByb21pc2VXYXRjaGVySGFuZGxlcixcbm9uUmVqZWN0ZWQ6UHJvbWlzZVdhdGNoZXJIYW5kbGVyfSk7XG5cblxuLypcblxuICovJGjNj19vbmNlLlByb21pc2VXYXRjaGVySShQcm9taXNlV2F0Y2hlckkpO1xuY29uc3QgICAgICAgIFByb21pc2VXYXRjaGVyRnVsZmlsbGVkST1NLmludGVyZmFjZSgnUHJvbWlzZVdhdGNoZXJGdWxmaWxsZWQnLHtcbm9uRnVsZmlsbGVkOlByb21pc2VXYXRjaGVySGFuZGxlcn0pO1xuXG5cbi8qXG5cbiAqLyRozY9fb25jZS5Qcm9taXNlV2F0Y2hlckZ1bGZpbGxlZEkoUHJvbWlzZVdhdGNoZXJGdWxmaWxsZWRJKTtcbmNvbnN0ICAgICAgICBQcm9taXNlV2F0Y2hlclJlamVjdGVkST1NLmludGVyZmFjZSgnUHJvbWlzZVdhdGNoZXJSZWplY3RlZCcse1xub25SZWplY3RlZDpQcm9taXNlV2F0Y2hlckhhbmRsZXJ9KTtcblxuXG4vKlxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS5Qcm9taXNlV2F0Y2hlclJlamVjdGVkSShQcm9taXNlV2F0Y2hlclJlamVjdGVkSSk7XG5jb25zdCBjYWxsTWVNYXliZT0odGhhdCxwcm9wLHBvc3RBcmdzKT0+e1xuY29uc3QgZm49dGhhdFtwcm9wXTtcbmlmKCFmbil7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmFzc2VydC50eXBlb2YoZm4sJ2Z1bmN0aW9uJyk7XG4vKlxuXG4gICAqL1xuY29uc3Qgd3JhcHBlZD0oYXJnKT0+e1xuLy9cbi8vXG5hcHBseShmbix0aGF0LFthcmcsLi4ucG9zdEFyZ3NdKTtcbiB9O1xucmV0dXJuIHdyYXBwZWQ7XG4gfTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIHdhdGNoUHJvbWlzZT0ocCx3YXRjaGVyLC4uLndhdGNoZXJBcmdzKT0+e1xuUHJvbWlzZS5yZXNvbHZlKHApPT09cHx8RmFpbCBgd2F0Y2hQcm9taXNlIG9ubHkgd2F0Y2hlcyBwcm9taXNlc2A7XG5jb25zdCBvbkZ1bGZpbGxlZD1jYWxsTWVNYXliZSh3YXRjaGVyLCdvbkZ1bGZpbGxlZCcsd2F0Y2hlckFyZ3MpO1xuY29uc3Qgb25SZWplY3RlZD1jYWxsTWVNYXliZSh3YXRjaGVyLCdvblJlamVjdGVkJyx3YXRjaGVyQXJncyk7XG5vbkZ1bGZpbGxlZHx8XG5vblJlamVjdGVkfHxcbkZhaWwgYHByb21pc2Ugd2F0Y2hlciBtdXN0IGltcGxlbWVudCBhdCBsZWFzdCBvbmUgaGFuZGxlciBtZXRob2RgO1xudm9pZCBFLndoZW4ocCxvbkZ1bGZpbGxlZCxvblJlamVjdGVkKTtcbiB9OyRozY9fb25jZS53YXRjaFByb21pc2Uod2F0Y2hQcm9taXNlKTtcbmhhcmRlbih3YXRjaFByb21pc2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUHJvbWlzZVdhdGNoZXJIYW5kbGVyIjpbIlByb21pc2VXYXRjaGVySGFuZGxlciJdLCJQcm9taXNlV2F0Y2hlckkiOlsiUHJvbWlzZVdhdGNoZXJJIl0sIlByb21pc2VXYXRjaGVyRnVsZmlsbGVkSSI6WyJQcm9taXNlV2F0Y2hlckZ1bGZpbGxlZEkiXSwiUHJvbWlzZVdhdGNoZXJSZWplY3RlZEkiOlsiUHJvbWlzZVdhdGNoZXJSZWplY3RlZEkiXSwid2F0Y2hQcm9taXNlIjpbIndhdGNoUHJvbWlzZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABI8rnVKAUAACgFAAAnAAAAQGFnb3JpYy9jYWNoZS12MC4zLjMtdTE5LjIvc3JjL2NhY2hlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ZhciIsIi4vc3RvcmUuanMiXSwiZXhwb3J0cyI6WyJtYWtlQ2FjaGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBFLEZhcixtYWtlU2NhbGFyU3RvcmVDb29yZGluYXRvcjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjNj19hID0+IChFID0gJGjNj19hKV1dLFtcIkZhclwiLCBbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCIuL3N0b3JlLmpzXCIsIFtbXCJtYWtlU2NhbGFyU3RvcmVDb29yZGluYXRvclwiLCBbJGjNj19hID0+IChtYWtlU2NhbGFyU3RvcmVDb29yZGluYXRvciA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuLypcblxuICovXG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vKlxuXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQ2FjaGU9KGNvb3JkaW5hdG9yPW1ha2VTY2FsYXJTdG9yZUNvb3JkaW5hdG9yKCkpPT57XG4vKlxuXG5cblxuXG5cbiAgICovXG5jb25zdCBjYWNoZT0oa2V5LC4uLm9wdFVwZGF0ZUd1YXJkUGF0dGVybik9PntcbmlmKG9wdFVwZGF0ZUd1YXJkUGF0dGVybi5sZW5ndGg9PT0wKXtcbnJldHVybiBFKGNvb3JkaW5hdG9yKS5nZXRSZWNlbnRWYWx1ZShrZXkpO1xuIH1cblxuY29uc3RbdXBkYXRlLGd1YXJkUGF0dGVybl09b3B0VXBkYXRlR3VhcmRQYXR0ZXJuO1xuaWYodHlwZW9mIHVwZGF0ZSE9PSdmdW5jdGlvbicpe1xucmV0dXJuIEUoY29vcmRpbmF0b3IpLnNldENhY2hlVmFsdWUoa2V5LHVwZGF0ZSxndWFyZFBhdHRlcm4pO1xuIH1cblxuY29uc3QgdXBkYXRlcj1GYXIoJ2NhY2hlIHVwZGF0ZXInLHtcbnVwZGF0ZToob2xkVmFsdWUpPT57XG5yZXR1cm4gdXBkYXRlKG9sZFZhbHVlKTtcbiB9fSk7XG5cbnJldHVybiBFKGNvb3JkaW5hdG9yKS51cGRhdGVDYWNoZVZhbHVlKGtleSx1cGRhdGVyLGd1YXJkUGF0dGVybik7XG4gfTtcblxucmV0dXJuIGNhY2hlO1xuIH07JGjNj19vbmNlLm1ha2VDYWNoZShtYWtlQ2FjaGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUNhY2hlIjpbIm1ha2VDYWNoZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAASnwuxMgIAADICAAAmAAAAQGFnb3JpYy9jYWNoZS12MC4zLjMtdTE5LjIvc3JjL21haW4uanN7ImltcG9ydHMiOlsiLi90eXBlcy5qcyIsIi4vc3RvcmUuanMiLCIuL2NhY2hlLmpzIiwiLi9zdGF0ZS5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vY2FjaGUuanMiLCIuL3N0YXRlLmpzIiwiLi9zdG9yZS5qcyIsIi4vdHlwZXMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRozY9faW1wb3J0cyhbW1wiLi90eXBlcy5qc1wiLCBbXV0sW1wiLi9zdG9yZS5qc1wiLCBbXV0sW1wiLi9jYWNoZS5qc1wiLCBbXV0sW1wiLi9zdGF0ZS5qc1wiLCBbXV1dKTsgICBcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACMvBfLOwQAADsEAAAnAAAAQGFnb3JpYy9jYWNoZS12MC4zLjMtdTE5LjIvc3JjL3N0YXRlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJHUk9VTkRfU1RBVEUiLCJtYWtlU3RhdGUiLCJ3aXRoR3JvdW5kU3RhdGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRozY9faW1wb3J0cyhbXSk7ICAgLy9cblxuLypcblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBHUk9VTkRfU1RBVEU9aGFyZGVuKHtnZW5lcmF0aW9uOjBuLHZhbHVlOnVuZGVmaW5lZH0pO1xuXG4vKlxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5HUk9VTkRfU1RBVEUoR1JPVU5EX1NUQVRFKTtcbmNvbnN0ICAgICAgICBtYWtlU3RhdGU9KHZhbHVlLHByaW9yU3RhdGU9R1JPVU5EX1NUQVRFKT0+XG5oYXJkZW4oe1xuZ2VuZXJhdGlvbjpwcmlvclN0YXRlLmdlbmVyYXRpb24rMW4sXG52YWx1ZX0pO1xuXG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UubWFrZVN0YXRlKG1ha2VTdGF0ZSk7XG5jb25zdCAgICAgICAgd2l0aEdyb3VuZFN0YXRlPShzdGF0ZVN0b3JlKT0+KHtcbi4uLnN0YXRlU3RvcmUsXG5nZXQ6KGtleSk9PntcbmlmKCFzdGF0ZVN0b3JlLmhhcyhrZXkpKXtcbnJldHVybiBHUk9VTkRfU1RBVEU7XG4gfVxucmV0dXJuIHN0YXRlU3RvcmUuZ2V0KGtleSk7XG4gfX0pOyRozY9fb25jZS53aXRoR3JvdW5kU3RhdGUod2l0aEdyb3VuZFN0YXRlKTtcblxuaGFyZGVuKHdpdGhHcm91bmRTdGF0ZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJHUk9VTkRfU1RBVEUiOlsiR1JPVU5EX1NUQVRFIl0sIm1ha2VTdGF0ZSI6WyJtYWtlU3RhdGUiXSwid2l0aEdyb3VuZFN0YXRlIjpbIndpdGhHcm91bmRTdGF0ZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABlF7DQsRcAALEXAAAnAAAAQGFnb3JpYy9jYWNoZS12MC4zLjMtdTE5LjIvc3JjL3N0b3JlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ZhciIsIkBlbmRvL21hcnNoYWwiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBhZ29yaWMvaW50ZXJuYWwiLCIuL3N0YXRlLmpzIl0sImV4cG9ydHMiOlsibWFrZUNoYWluU3RvcmFnZUNvb3JkaW5hdG9yIiwibWFrZVNjYWxhclN0b3JlQ29vcmRpbmF0b3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBFLEZhcixkZWVwbHlGdWxmaWxsZWQsbWFrZU1hcnNoYWwsbWF0Y2hlcyxtYWtlU2NhbGFyTWFwU3RvcmUsbWFrZVNjYWxhckJpZ01hcFN0b3JlLHVudGlsVHJ1ZSx3aXRoR3JvdW5kU3RhdGUsbWFrZVN0YXRlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsIFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV0sW1wiRmFyXCIsIFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImRlZXBseUZ1bGZpbGxlZFwiLCBbJGjNj19hID0+IChkZWVwbHlGdWxmaWxsZWQgPSAkaM2PX2EpXV0sW1wibWFrZU1hcnNoYWxcIiwgWyRozY9fYSA9PiAobWFrZU1hcnNoYWwgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtYXRjaGVzXCIsIFskaM2PX2EgPT4gKG1hdGNoZXMgPSAkaM2PX2EpXV0sW1wibWFrZVNjYWxhck1hcFN0b3JlXCIsIFskaM2PX2EgPT4gKG1ha2VTY2FsYXJNYXBTdG9yZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIm1ha2VTY2FsYXJCaWdNYXBTdG9yZVwiLCBbJGjNj19hID0+IChtYWtlU2NhbGFyQmlnTWFwU3RvcmUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJ1bnRpbFRydWVcIiwgWyRozY9fYSA9PiAodW50aWxUcnVlID0gJGjNj19hKV1dXV0sW1wiLi9zdGF0ZS5qc1wiLCBbW1wid2l0aEdyb3VuZFN0YXRlXCIsIFskaM2PX2EgPT4gKHdpdGhHcm91bmRTdGF0ZSA9ICRozY9fYSldXSxbXCJtYWtlU3RhdGVcIiwgWyRozY9fYSA9PiAobWFrZVN0YXRlID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qXG5cblxuICovXG5jb25zdCBtYWtlS2V5VG9TdHJpbmc9KHNhbml0aXplPShvYmopPT5vYmopPT57XG5sZXQgbGFzdE5vbmNlPTA7XG5jb25zdCB2YWxUb05vbmNlPW5ldyBXZWFrTWFwKCk7XG5jb25zdCB2YWxUb1Nsb3Q9KHZhbCk9PntcbmxldCBzbG90PXZhbFRvTm9uY2UuZ2V0KHZhbCk7XG5pZighc2xvdCl7XG5sYXN0Tm9uY2UrPTE7XG5zbG90PWxhc3ROb25jZTtcbnZhbFRvTm9uY2Uuc2V0KHZhbCxzbG90KTtcbiB9XG5yZXR1cm4gc2xvdDtcbiB9O1xuXG5jb25zdHt0b0NhcERhdGE6a2V5VG9Kc29uYWJsZX09bWFrZU1hcnNoYWwodmFsVG9TbG90LHVuZGVmaW5lZCx7XG5zZXJpYWxpemVCb2R5Rm9ybWF0OidzbWFsbGNhcHMnfSk7XG5cbmNvbnN0IGtleVRvU3RyaW5nPWFzeW5jKGtleVApPT57XG5jb25zdCBrZXk9YXdhaXQgc2FuaXRpemUoa2V5UCk7XG5jb25zdCBvYmo9a2V5VG9Kc29uYWJsZShrZXkpO1xucmV0dXJuIEpTT04uc3RyaW5naWZ5KG9iaik7XG4gfTtcbnJldHVybiBrZXlUb1N0cmluZztcbiB9O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgYXBwbHlDYWNoZVRyYW5zYWN0aW9uPWFzeW5jKFxua2V5U3RyLFxudHhuLFxuZ3VhcmRQYXR0ZXJuLFxuc2FuaXRpemUsXG5zdGF0ZVN0b3JlKT0+XG57XG4vKlxuXG5cblxuXG4gICAqL1xuY29uc3QgZ2V0VXBkYXRlZFN0YXRlPWFzeW5jKGJhc2lzU3RhdGUpPT57XG5jb25zdHt2YWx1ZX09YmFzaXNTdGF0ZTtcbmlmKCFtYXRjaGVzKHZhbHVlLGd1YXJkUGF0dGVybikpe1xuLy9cbnJldHVybiBudWxsO1xuIH1cblxuY29uc3QgbmV3VmFsdWU9YXdhaXQgc2FuaXRpemUodHhuKHZhbHVlKSk7XG5yZXR1cm4gbWFrZVN0YXRlKG5ld1ZhbHVlLGJhc2lzU3RhdGUpO1xuIH07XG5cbmxldCBiYXNpc1N0YXRlPXN0YXRlU3RvcmUuZ2V0KGtleVN0cik7XG5sZXQgdXBkYXRlZFN0YXRlPWF3YWl0IGdldFVwZGF0ZWRTdGF0ZShiYXNpc1N0YXRlKTtcblxuLy9cblxuLy9cbmJhc2lzU3RhdGU9c3RhdGVTdG9yZS5nZXQoa2V5U3RyKTtcbmNvbnN0IHVudGlsVXBkYXRlU3luY2VkPXVudGlsVHJ1ZShcbigpPT4hdXBkYXRlZFN0YXRlfHx1cGRhdGVkU3RhdGUuZ2VuZXJhdGlvbj5iYXNpc1N0YXRlLmdlbmVyYXRpb24pO1xuXG5mb3IgYXdhaXQoY29uc3QgXyBvZiB1bnRpbFVwZGF0ZVN5bmNlZCl7XG51cGRhdGVkU3RhdGU9YXdhaXQgZ2V0VXBkYXRlZFN0YXRlKGJhc2lzU3RhdGUpO1xuLy9cbmJhc2lzU3RhdGU9c3RhdGVTdG9yZS5nZXQoa2V5U3RyKTtcbiB9XG5cbmlmKCF1cGRhdGVkU3RhdGUpe1xuLy9cbi8vXG5yZXR1cm4gYmFzaXNTdGF0ZS52YWx1ZTtcbiB9XG5cbi8vXG4vL1xuaWYoYmFzaXNTdGF0ZS5nZW5lcmF0aW9uPDFuKXtcbi8vXG5zdGF0ZVN0b3JlLmluaXQoa2V5U3RyLHVwZGF0ZWRTdGF0ZSk7XG4gfWVsc2V7XG5zdGF0ZVN0b3JlLnNldChrZXlTdHIsdXBkYXRlZFN0YXRlKTtcbiB9XG5cbi8vXG5yZXR1cm4gdXBkYXRlZFN0YXRlLnZhbHVlO1xuIH07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IHN0cmluZ2lmeVN0YXRlU3RvcmU9YXN5bmMoc3RhdGVTdG9yZSxtYXJzaGFsbGVyKT0+e1xuLyogICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IG9iaj17fTtcbmZvcihjb25zdFtrZXksdmFsdWVdb2Ygc3RhdGVTdG9yZS5lbnRyaWVzKCkpe1xub2JqW2tleV09RShtYXJzaGFsbGVyKS50b0NhcERhdGEodmFsdWUpO1xuIH1cbnJldHVybiBkZWVwbHlGdWxmaWxsZWQoaGFyZGVuKG9iaikpLnRoZW4oKGZ1bGZpbGxlZE9iaik9PlxuSlNPTi5zdHJpbmdpZnkoZnVsZmlsbGVkT2JqKSk7XG5cbiB9O1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZVNjYWxhclN0b3JlQ29vcmRpbmF0b3I9KFxuc3RhdGVTdG9yZT1tYWtlU2NhbGFyTWFwU3RvcmUoKSxcbnNhbml0aXplPWRlZXBseUZ1bGZpbGxlZCk9Plxue1xuY29uc3Qgc2VyaWFsaXplUGFzc2FibGU9bWFrZUtleVRvU3RyaW5nKHNhbml0aXplKTtcblxuY29uc3QgZGVmYXVsdFN0YXRlU3RvcmU9d2l0aEdyb3VuZFN0YXRlKHN0YXRlU3RvcmUpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgY29vcmQ9RmFyKCdzdG9yZSBjYWNoZSBjb29yZGluYXRvcicse1xuZ2V0UmVjZW50VmFsdWU6YXN5bmMoa2V5KT0+e1xuY29uc3Qga2V5U3RyPWF3YWl0IHNlcmlhbGl6ZVBhc3NhYmxlKGtleSk7XG5yZXR1cm4gZGVmYXVsdFN0YXRlU3RvcmUuZ2V0KGtleVN0cikudmFsdWU7XG4gfSxcbnNldENhY2hlVmFsdWU6YXN5bmMoa2V5LG5ld1ZhbHVlLGd1YXJkUGF0dGVybik9PntcbmNvbnN0IGtleVN0cj1hd2FpdCBzZXJpYWxpemVQYXNzYWJsZShrZXkpO1xucmV0dXJuIGFwcGx5Q2FjaGVUcmFuc2FjdGlvbihcbmtleVN0cixcbigpPT5uZXdWYWx1ZSxcbmd1YXJkUGF0dGVybixcbnNhbml0aXplLFxuZGVmYXVsdFN0YXRlU3RvcmUpO1xuXG4gfSxcbnVwZGF0ZUNhY2hlVmFsdWU6YXN5bmMoa2V5LHVwZGF0ZXIsZ3VhcmRQYXR0ZXJuKT0+e1xuY29uc3Qga2V5U3RyPWF3YWl0IHNlcmlhbGl6ZVBhc3NhYmxlKGtleSk7XG5yZXR1cm4gYXBwbHlDYWNoZVRyYW5zYWN0aW9uKFxua2V5U3RyLFxuKG9sZFZhbHVlKT0+RSh1cGRhdGVyKS51cGRhdGUob2xkVmFsdWUpLFxuZ3VhcmRQYXR0ZXJuLFxuc2FuaXRpemUsXG5kZWZhdWx0U3RhdGVTdG9yZSk7XG5cbiB9fSk7XG5cbnJldHVybiBjb29yZDtcbiB9O1xuXG4vKlxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLm1ha2VTY2FsYXJTdG9yZUNvb3JkaW5hdG9yKG1ha2VTY2FsYXJTdG9yZUNvb3JkaW5hdG9yKTtcbmNvbnN0IG1ha2VMYXN0V2luc1VwZGF0ZXI9KHN0YXRlU3RvcmUsbWFyc2hhbGxlcixzdG9yYWdlTm9kZSk9PntcbmxldCBsYXN0UHJlcGFyZVRpY2tldD0wbjtcbmxldCBsYXN0Q29tbWl0VGlja2V0PTBuO1xuXG5yZXR1cm4gYXN5bmMoc3RvcmVkVmFsdWUpPT57XG4vL1xuLy9cbi8vXG5sYXN0UHJlcGFyZVRpY2tldCs9MW47XG5jb25zdCBtYXJzaGFsbFRpY2tldD1sYXN0UHJlcGFyZVRpY2tldDtcbmNvbnN0IHNlcmlhbGl6ZWRTdG9yZT1hd2FpdCBzdHJpbmdpZnlTdGF0ZVN0b3JlKHN0YXRlU3RvcmUsbWFyc2hhbGxlcik7XG5pZihtYXJzaGFsbFRpY2tldDxsYXN0Q29tbWl0VGlja2V0KXtcbi8vXG5yZXR1cm4gc3RvcmVkVmFsdWU7XG4gfVxuYXdhaXQgRShzdG9yYWdlTm9kZSkuc2V0VmFsdWUoc2VyaWFsaXplZFN0b3JlKTtcbmxhc3RDb21taXRUaWNrZXQ9bWFyc2hhbGxUaWNrZXQ7XG5yZXR1cm4gc3RvcmVkVmFsdWU7XG4gfTtcbiB9O1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIG1ha2VDaGFpblN0b3JhZ2VDb29yZGluYXRvcj0oc3RvcmFnZU5vZGUsbWFyc2hhbGxlcik9PntcbmNvbnN0IHN0YXRlU3RvcmU9bWFrZVNjYWxhckJpZ01hcFN0b3JlKCdzdGF0ZUtleScpO1xuXG5jb25zdCBzYW5pdGl6ZT1kZWVwbHlGdWxmaWxsZWQ7XG5jb25zdCBzZXJpYWxpemVQYXNzYWJsZT1tYWtlS2V5VG9TdHJpbmcoc2FuaXRpemUpO1xuXG5jb25zdCBkZWZhdWx0U3RhdGVTdG9yZT13aXRoR3JvdW5kU3RhdGUoc3RhdGVTdG9yZSk7XG5cbmNvbnN0IHVwZGF0ZVN0b3JhZ2VOb2RlPW1ha2VMYXN0V2luc1VwZGF0ZXIoXG5kZWZhdWx0U3RhdGVTdG9yZSxcbm1hcnNoYWxsZXIsXG5zdG9yYWdlTm9kZSk7XG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGNvb3JkPUZhcignc3RvcmUgY2FjaGUgY29vcmRpbmF0b3InLHtcbmdldFJlY2VudFZhbHVlOmFzeW5jKGtleSk9PntcbmNvbnN0IGtleVN0cj1hd2FpdCBzZXJpYWxpemVQYXNzYWJsZShrZXkpO1xucmV0dXJuIGRlZmF1bHRTdGF0ZVN0b3JlLmdldChrZXlTdHIpLnZhbHVlO1xuIH0sXG5zZXRDYWNoZVZhbHVlOmFzeW5jKGtleSxuZXdWYWx1ZSxndWFyZFBhdHRlcm4pPT57XG5jb25zdCBrZXlTdHI9YXdhaXQgc2VyaWFsaXplUGFzc2FibGUoa2V5KTtcbmNvbnN0IHN0b3JlZFZhbHVlPWF3YWl0IGFwcGx5Q2FjaGVUcmFuc2FjdGlvbihcbmtleVN0cixcbigpPT5uZXdWYWx1ZSxcbmd1YXJkUGF0dGVybixcbnNhbml0aXplLFxuZGVmYXVsdFN0YXRlU3RvcmUpO1xuXG5yZXR1cm4gdXBkYXRlU3RvcmFnZU5vZGUoc3RvcmVkVmFsdWUpO1xuIH0sXG51cGRhdGVDYWNoZVZhbHVlOmFzeW5jKGtleSx1cGRhdGVyLGd1YXJkUGF0dGVybik9PntcbmNvbnN0IGtleVN0cj1hd2FpdCBzZXJpYWxpemVQYXNzYWJsZShrZXkpO1xuY29uc3Qgc3RvcmVkVmFsdWU9YXdhaXQgYXBwbHlDYWNoZVRyYW5zYWN0aW9uKFxua2V5U3RyLFxuKG9sZFZhbHVlKT0+RSh1cGRhdGVyKS51cGRhdGUob2xkVmFsdWUpLFxuZ3VhcmRQYXR0ZXJuLFxuc2FuaXRpemUsXG5kZWZhdWx0U3RhdGVTdG9yZSk7XG5cbnJldHVybiB1cGRhdGVTdG9yYWdlTm9kZShzdG9yZWRWYWx1ZSk7XG4gfX0pO1xuXG5yZXR1cm4gY29vcmQ7XG4gfTskaM2PX29uY2UubWFrZUNoYWluU3RvcmFnZUNvb3JkaW5hdG9yKG1ha2VDaGFpblN0b3JhZ2VDb29yZGluYXRvcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlU2NhbGFyU3RvcmVDb29yZGluYXRvciI6WyJtYWtlU2NhbGFyU3RvcmVDb29yZGluYXRvciJdLCJtYWtlQ2hhaW5TdG9yYWdlQ29vcmRpbmF0b3IiOlsibWFrZUNoYWluU3RvcmFnZUNvb3JkaW5hdG9yIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAVESyZ5AQAAeQEAACcAAABAYWdvcmljL2NhY2hlLXYwLjMuMy11MTkuMi9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRozY9faW1wb3J0cyhbXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAR1HsYi8dAAAvHQAALAAAAEBhZ29yaWMvZXJ0cC12MC4xNi4zLXUxOS4yL3NyYy9hbW91bnRNYXRoLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL21hcnNoYWwiLCJAYWdvcmljL3N0b3JlIiwiLi9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qcyIsIi4vbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanMiLCIuL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qcyIsIi4vbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiQW1vdW50TWF0aCIsIkFzc2V0S2luZCIsImFzc2VydEFzc2V0S2luZCIsImFzc2VydFZhbHVlR2V0SGVscGVycyIsImdldEFzc2V0S2luZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IHEsRmFpbCxwYXNzU3R5bGVPZixhc3NlcnRSZW1vdGFibGUsYXNzZXJ0UmVjb3JkLE0sbWF0Y2hlcyxuYXRNYXRoSGVscGVycyxzZXRNYXRoSGVscGVycyxjb3B5U2V0TWF0aEhlbHBlcnMsY29weUJhZ01hdGhIZWxwZXJzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsIFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLCBbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UmVtb3RhYmxlXCIsIFskaM2PX2EgPT4gKGFzc2VydFJlbW90YWJsZSA9ICRozY9fYSldXSxbXCJhc3NlcnRSZWNvcmRcIiwgWyRozY9fYSA9PiAoYXNzZXJ0UmVjb3JkID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLCBbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcIm1hdGNoZXNcIiwgWyRozY9fYSA9PiAobWF0Y2hlcyA9ICRozY9fYSldXV1dLFtcIi4vbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanNcIiwgW1tcIm5hdE1hdGhIZWxwZXJzXCIsIFskaM2PX2EgPT4gKG5hdE1hdGhIZWxwZXJzID0gJGjNj19hKV1dXV0sW1wiLi9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qc1wiLCBbW1wic2V0TWF0aEhlbHBlcnNcIiwgWyRozY9fYSA9PiAoc2V0TWF0aEhlbHBlcnMgPSAkaM2PX2EpXV1dXSxbXCIuL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qc1wiLCBbW1wiY29weVNldE1hdGhIZWxwZXJzXCIsIFskaM2PX2EgPT4gKGNvcHlTZXRNYXRoSGVscGVycyA9ICRozY9fYSldXV1dLFtcIi4vbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzXCIsIFtbXCJjb3B5QmFnTWF0aEhlbHBlcnNcIiwgWyRozY9fYSA9PiAoY29weUJhZ01hdGhIZWxwZXJzID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG4vKlxuXG5cbiAqL1xuXG4vL1xuLypcblxuXG5cbiAqL1xuY29uc3QgICAgICAgIEFzc2V0S2luZD0vKiAgICAgICAgICAgICAgICAqL3tcbk5BVDonbmF0JyxcblNFVDonc2V0JyxcbkNPUFlfU0VUOidjb3B5U2V0JyxcbkNPUFlfQkFHOidjb3B5QmFnJ307JGjNj19vbmNlLkFzc2V0S2luZChBc3NldEtpbmQpO1xuXG5oYXJkZW4oQXNzZXRLaW5kKTtcbmNvbnN0IGFzc2V0S2luZE5hbWVzPWhhcmRlbihPYmplY3QudmFsdWVzKEFzc2V0S2luZCkuc29ydCgpKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0ICAgICAgICBhc3NlcnRBc3NldEtpbmQ9KGFsbGVnZWRBSyk9PntcbmFzc2V0S2luZE5hbWVzLmluY2x1ZGVzKGFsbGVnZWRBSyl8fFxuRmFpbCBgVGhlIGFzc2V0S2luZCAke2FsbGVnZWRBS30gbXVzdCBiZSBvbmUgb2YgJHtxKGFzc2V0S2luZE5hbWVzKX1gO1xuIH07JGjNj19vbmNlLmFzc2VydEFzc2V0S2luZChhc3NlcnRBc3NldEtpbmQpO1xuaGFyZGVuKGFzc2VydEFzc2V0S2luZCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG5jb25zdCBoZWxwZXJzPXtcbm5hdDpuYXRNYXRoSGVscGVycyxcbnNldDpzZXRNYXRoSGVscGVycyxcbmNvcHlTZXQ6Y29weVNldE1hdGhIZWxwZXJzLFxuY29weUJhZzpjb3B5QmFnTWF0aEhlbHBlcnN9O1xuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBhc3NlcnRWYWx1ZUdldEFzc2V0S2luZD0odmFsdWUpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YodmFsdWUpO1xuaWYocGFzc1N0eWxlPT09J2JpZ2ludCcpe1xucmV0dXJuJ25hdCc7XG4gfVxuaWYocGFzc1N0eWxlPT09J2NvcHlBcnJheScpe1xucmV0dXJuJ3NldCc7XG4gfVxuaWYobWF0Y2hlcyh2YWx1ZSxNLnNldCgpKSl7XG5yZXR1cm4nY29weVNldCc7XG4gfVxuaWYobWF0Y2hlcyh2YWx1ZSxNLmJhZygpKSl7XG5yZXR1cm4nY29weUJhZyc7XG4gfVxuLy9cbi8vXG4vL1xuLy9cbi8vXG50aHJvdyBGYWlsIGB2YWx1ZSAke3ZhbHVlfSBtdXN0IGJlIGEgYmlnaW50LCBjb3B5U2V0LCBjb3B5QmFnLCBvciBhbiBhcnJheSwgbm90ICR7cShcbnBhc3NTdHlsZSlcbiB9YDtcbiB9O1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRWYWx1ZUdldEhlbHBlcnM9KHZhbHVlKT0+XG4vL1xuaGVscGVyc1thc3NlcnRWYWx1ZUdldEFzc2V0S2luZCh2YWx1ZSldO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5hc3NlcnRWYWx1ZUdldEhlbHBlcnMoYXNzZXJ0VmFsdWVHZXRIZWxwZXJzKTtcbmNvbnN0IG9wdGlvbmFsQnJhbmRDaGVjaz0oYWxsZWdlZEJyYW5kLGJyYW5kKT0+e1xuaWYoYnJhbmQhPT11bmRlZmluZWQpe1xuYXNzZXJ0UmVtb3RhYmxlKGJyYW5kLCdicmFuZCcpO1xuYWxsZWdlZEJyYW5kPT09YnJhbmR8fFxuRmFpbCBgYW1vdW50J3MgYnJhbmQgJHtxKGFsbGVnZWRCcmFuZCl9IGRpZCBub3QgbWF0Y2ggZXhwZWN0ZWQgYnJhbmQgJHtxKFxuYnJhbmQpXG4gfWA7XG4gfVxuIH07XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBjaGVja0xSQW5kR2V0SGVscGVycz0obGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZD11bmRlZmluZWQpPT57XG5hc3NlcnRSZWNvcmQobGVmdEFtb3VudCwnbGVmdEFtb3VudCcpO1xuYXNzZXJ0UmVjb3JkKHJpZ2h0QW1vdW50LCdyaWdodEFtb3VudCcpO1xuY29uc3R7dmFsdWU6bGVmdFZhbHVlLGJyYW5kOmxlZnRCcmFuZH09bGVmdEFtb3VudDtcbmNvbnN0e3ZhbHVlOnJpZ2h0VmFsdWUsYnJhbmQ6cmlnaHRCcmFuZH09cmlnaHRBbW91bnQ7XG5hc3NlcnRSZW1vdGFibGUobGVmdEJyYW5kLCdsZWZ0QnJhbmQnKTtcbmFzc2VydFJlbW90YWJsZShyaWdodEJyYW5kLCdyaWdodEJyYW5kJyk7XG5vcHRpb25hbEJyYW5kQ2hlY2sobGVmdEJyYW5kLGJyYW5kKTtcbm9wdGlvbmFsQnJhbmRDaGVjayhyaWdodEJyYW5kLGJyYW5kKTtcbmxlZnRCcmFuZD09PXJpZ2h0QnJhbmR8fFxuRmFpbCBgQnJhbmRzIGluIGxlZnQgJHtxKGxlZnRCcmFuZCl9IGFuZCByaWdodCAke3EoXG5yaWdodEJyYW5kKVxuIH0gc2hvdWxkIG1hdGNoIGJ1dCBkbyBub3RgO1xuY29uc3QgbGVmdEhlbHBlcnM9YXNzZXJ0VmFsdWVHZXRIZWxwZXJzKGxlZnRWYWx1ZSk7XG5jb25zdCByaWdodEhlbHBlcnM9YXNzZXJ0VmFsdWVHZXRIZWxwZXJzKHJpZ2h0VmFsdWUpO1xubGVmdEhlbHBlcnM9PT1yaWdodEhlbHBlcnN8fFxuRmFpbCBgVGhlIGxlZnQgJHtsZWZ0QW1vdW50fSBhbmQgcmlnaHQgYW1vdW50ICR7cmlnaHRBbW91bnR9IGhhZCBkaWZmZXJlbnQgYXNzZXRLaW5kc2A7XG5yZXR1cm4gbGVmdEhlbHBlcnM7XG4gfTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IGNvZXJjZUxSPShoLGxlZnRBbW91bnQscmlnaHRBbW91bnQpPT57XG4vL1xucmV0dXJuW2guZG9Db2VyY2UobGVmdEFtb3VudC52YWx1ZSksaC5kb0NvZXJjZShyaWdodEFtb3VudC52YWx1ZSldO1xuIH07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBpc0dURT0obGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZD11bmRlZmluZWQpPT57XG5jb25zdCBoPWNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQpO1xucmV0dXJuIGguZG9Jc0dURSguLi5jb2VyY2VMUihoLGxlZnRBbW91bnQscmlnaHRBbW91bnQpKTtcbiB9O1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgQW1vdW50TWF0aD17XG4vL1xuLy9cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG5tYWtlOihicmFuZCxhbGxlZ2VkVmFsdWUpPT57XG5hc3NlcnRSZW1vdGFibGUoYnJhbmQsJ2JyYW5kJyk7XG5jb25zdCBoPWFzc2VydFZhbHVlR2V0SGVscGVycyhhbGxlZ2VkVmFsdWUpO1xuY29uc3QgdmFsdWU9aC5kb0NvZXJjZShhbGxlZ2VkVmFsdWUpO1xuLy9cbnJldHVybiBoYXJkZW4oe2JyYW5kLHZhbHVlfSk7XG4gfSxcbi8qXG5cblxuXG5cblxuXG5cbiAgICovXG5jb2VyY2U6KGJyYW5kLGFsbGVnZWRBbW91bnQpPT57XG5hc3NlcnRSZW1vdGFibGUoYnJhbmQsJ2JyYW5kJyk7XG5hc3NlcnRSZWNvcmQoYWxsZWdlZEFtb3VudCwnYW1vdW50Jyk7XG5jb25zdHticmFuZDphbGxlZ2VkQnJhbmQsdmFsdWU6YWxsZWdlZFZhbHVlfT1hbGxlZ2VkQW1vdW50O1xuYnJhbmQ9PT1hbGxlZ2VkQnJhbmR8fFxuRmFpbCBgVGhlIGJyYW5kIGluIHRoZSBhbGxlZ2VkQW1vdW50ICR7YWxsZWdlZEFtb3VudH0gaW4gJ2NvZXJjZScgZGlkbid0IG1hdGNoIHRoZSBzcGVjaWZpZWQgYnJhbmQgJHticmFuZH0uYDtcbi8vXG4vL1xucmV0dXJuIEFtb3VudE1hdGgubWFrZShicmFuZCxhbGxlZ2VkVmFsdWUpO1xuIH0sXG4vKlxuXG5cblxuXG5cblxuICAgKi9cbmdldFZhbHVlOihicmFuZCxhbW91bnQpPT5BbW91bnRNYXRoLmNvZXJjZShicmFuZCxhbW91bnQpLnZhbHVlLFxuLypcblxuXG5cblxuXG5cblxuICAgKi9cbm1ha2VFbXB0eTooYnJhbmQsYXNzZXRLaW5kPS8qICAgICAgICAgICAgICAgICovJ25hdCcpPT57XG5hc3NlcnRSZW1vdGFibGUoYnJhbmQsJ2JyYW5kJyk7XG5hc3NlcnRBc3NldEtpbmQoYXNzZXRLaW5kKTtcbmNvbnN0IHZhbHVlPWhlbHBlcnNbYXNzZXRLaW5kXS5kb01ha2VFbXB0eSgpO1xuLy9cbnJldHVybiBoYXJkZW4oe2JyYW5kLHZhbHVlfSk7XG4gfSxcbi8qXG5cblxuXG5cblxuXG4gICAqL1xubWFrZUVtcHR5RnJvbUFtb3VudDooYW1vdW50KT0+e1xuYXNzZXJ0UmVjb3JkKGFtb3VudCwnYW1vdW50Jyk7XG5jb25zdHticmFuZCx2YWx1ZX09YW1vdW50O1xuY29uc3QgYXNzZXRLaW5kPWFzc2VydFZhbHVlR2V0QXNzZXRLaW5kKHZhbHVlKTtcbi8vXG5yZXR1cm4gQW1vdW50TWF0aC5tYWtlRW1wdHkoYnJhbmQsYXNzZXRLaW5kKTtcbiB9LFxuLypcblxuXG5cblxuXG4gICAqL1xuaXNFbXB0eTooYW1vdW50LGJyYW5kPXVuZGVmaW5lZCk9PntcbmFzc2VydFJlY29yZChhbW91bnQsJ2Ftb3VudCcpO1xuY29uc3R7YnJhbmQ6YWxsZWdlZEJyYW5kLHZhbHVlfT1hbW91bnQ7XG5hc3NlcnRSZW1vdGFibGUoYWxsZWdlZEJyYW5kLCdicmFuZCcpO1xub3B0aW9uYWxCcmFuZENoZWNrKGFsbGVnZWRCcmFuZCxicmFuZCk7XG5jb25zdCBoPWFzc2VydFZhbHVlR2V0SGVscGVycyh2YWx1ZSk7XG5yZXR1cm4gaC5kb0lzRW1wdHkoaC5kb0NvZXJjZSh2YWx1ZSkpO1xuIH0sXG5pc0dURSxcbi8qXG5cblxuXG5cblxuXG5cblxuICAgKi9cbmlzRXF1YWw6KGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQ9dW5kZWZpbmVkKT0+e1xuY29uc3QgaD1jaGVja0xSQW5kR2V0SGVscGVycyhsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kKTtcbnJldHVybiBoLmRvSXNFcXVhbCguLi5jb2VyY2VMUihoLGxlZnRBbW91bnQscmlnaHRBbW91bnQpKTtcbiB9LFxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuYWRkOihsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kPXVuZGVmaW5lZCk9PntcbmNvbnN0IGg9Y2hlY2tMUkFuZEdldEhlbHBlcnMobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZCk7XG5jb25zdCB2YWx1ZT1oLmRvQWRkKC4uLmNvZXJjZUxSKGgsbGVmdEFtb3VudCxyaWdodEFtb3VudCkpO1xuLy9cbnJldHVybiBoYXJkZW4oe2JyYW5kOmxlZnRBbW91bnQuYnJhbmQsdmFsdWV9KTtcbiB9LFxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG5zdWJ0cmFjdDoobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZD11bmRlZmluZWQpPT57XG5jb25zdCBoPWNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQpO1xuY29uc3QgdmFsdWU9aC5kb1N1YnRyYWN0KC4uLmNvZXJjZUxSKGgsbGVmdEFtb3VudCxyaWdodEFtb3VudCkpO1xuLy9cbnJldHVybiBoYXJkZW4oe2JyYW5kOmxlZnRBbW91bnQuYnJhbmQsdmFsdWV9KTtcbiB9LFxuLypcblxuXG5cblxuXG5cblxuICAgKi9cbm1pbjooeCx5LGJyYW5kPXVuZGVmaW5lZCk9PlxuLy9cbmlzR1RFKHgseSxicmFuZCk/XG55OlxuaXNHVEUoeSx4LGJyYW5kKT9cbng6XG5GYWlsIGAke3h9IGFuZCAke3l9IGFyZSBpbmNvbXBhcmFibGVgLFxuLypcblxuXG5cblxuXG5cblxuICAgKi9cbm1heDooeCx5LGJyYW5kPXVuZGVmaW5lZCk9PlxuLy9cbmlzR1RFKHgseSxicmFuZCk/XG54OlxuaXNHVEUoeSx4KT9cbnk6XG5GYWlsIGAke3h9IGFuZCAke3l9IGFyZSBpbmNvbXBhcmFibGVgfTskaM2PX29uY2UuQW1vdW50TWF0aChBbW91bnRNYXRoKTtcblxuaGFyZGVuKEFtb3VudE1hdGgpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgICAgICAgIGdldEFzc2V0S2luZD0oYW1vdW50KT0+e1xuYXNzZXJ0UmVjb3JkKGFtb3VudCwnYW1vdW50Jyk7XG5jb25zdHt2YWx1ZX09YW1vdW50O1xucmV0dXJuIGFzc2VydFZhbHVlR2V0QXNzZXRLaW5kKHZhbHVlKTtcbiB9OyRozY9fb25jZS5nZXRBc3NldEtpbmQoZ2V0QXNzZXRLaW5kKTtcbmhhcmRlbihnZXRBc3NldEtpbmQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQXNzZXRLaW5kIjpbIkFzc2V0S2luZCJdLCJhc3NlcnRBc3NldEtpbmQiOlsiYXNzZXJ0QXNzZXRLaW5kIl0sImFzc2VydFZhbHVlR2V0SGVscGVycyI6WyJhc3NlcnRWYWx1ZUdldEhlbHBlcnMiXSwiQW1vdW50TWF0aCI6WyJBbW91bnRNYXRoIl0sImdldEFzc2V0S2luZCI6WyJnZXRBc3NldEtpbmQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAASpDQfAMEAAADBAAALQAAAEBhZ29yaWMvZXJ0cC12MC4xNi4zLXUxOS4yL3NyYy9hbW91bnRTdG9yZS5qc3siaW1wb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiXSwiZXhwb3J0cyI6WyJtYWtlQW1vdW50U3RvcmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBBbW91bnRNYXRoOyRozY9faW1wb3J0cyhbW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBbW91bnRNYXRoXCIsIFskaM2PX2EgPT4gKEFtb3VudE1hdGggPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIG1ha2VBbW91bnRTdG9yZT0oc3RhdGUsa2V5KT0+e1xucmV0dXJuIGhhcmRlbih7XG5nZXRBbW91bnQ6KCk9PnN0YXRlW2tleV0sXG5pbmNyZW1lbnQ6KGRlbHRhKT0+e1xuc3RhdGVba2V5XT1BbW91bnRNYXRoLmFkZChzdGF0ZVtrZXldLGRlbHRhKTtcbiB9LFxuZGVjcmVtZW50OihkZWx0YSk9PntcbmlmKEFtb3VudE1hdGguaXNHVEUoc3RhdGVba2V5XSxkZWx0YSkpe1xuc3RhdGVba2V5XT1BbW91bnRNYXRoLnN1YnRyYWN0KHN0YXRlW2tleV0sZGVsdGEpO1xucmV0dXJuIHRydWU7XG4gfVxucmV0dXJuIGZhbHNlO1xuIH19KTtcblxuIH07JGjNj19vbmNlLm1ha2VBbW91bnRTdG9yZShtYWtlQW1vdW50U3RvcmUpO1xuaGFyZGVuKG1ha2VBbW91bnRTdG9yZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlQW1vdW50U3RvcmUiOlsibWFrZUFtb3VudFN0b3JlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEW1HBr2BQAA9gUAAC0AAABAYWdvcmljL2VydHAtdjAuMTYuMy11MTkuMi9zcmMvZGlzcGxheUluZm8uanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGFnb3JpYy9zdG9yZSIsIi4vdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbImNvZXJjZURpc3BsYXlJbmZvIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgRmFpbCxtdXN0TWF0Y2gsRGlzcGxheUluZm9TaGFwZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLCBbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibXVzdE1hdGNoXCIsIFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiRGlzcGxheUluZm9TaGFwZVwiLCBbJGjNj19hID0+IChEaXNwbGF5SW5mb1NoYXBlID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBjb2VyY2VEaXNwbGF5SW5mbz0oYWxsZWdlZERpc3BsYXlJbmZvLGFzc2V0S2luZCk9Pntcbm11c3RNYXRjaChhbGxlZ2VkRGlzcGxheUluZm8sRGlzcGxheUluZm9TaGFwZSwnZGlzcGxheUluZm8nKTtcblxuaWYoYWxsZWdlZERpc3BsYXlJbmZvLmFzc2V0S2luZCE9PXVuZGVmaW5lZCl7XG5hbGxlZ2VkRGlzcGxheUluZm8uYXNzZXRLaW5kPT09YXNzZXRLaW5kfHxcbkZhaWwgYGRpc3BsYXlJbmZvLmFzc2V0S2luZCB3YXMgcHJlc2VudCAoJHthbGxlZ2VkRGlzcGxheUluZm8uYXNzZXRLaW5kfSkgYW5kIGRpZCBub3QgbWF0Y2ggdGhlIGFzc2V0S2luZCBhcmd1bWVudCAoJHthc3NldEtpbmR9KWA7XG4gfVxuY29uc3QgZGlzcGxheUluZm89aGFyZGVuKHsuLi5hbGxlZ2VkRGlzcGxheUluZm8sYXNzZXRLaW5kfSk7XG5cbmlmKGRpc3BsYXlJbmZvLmRlY2ltYWxQbGFjZXMhPT11bmRlZmluZWQpe1xuTnVtYmVyLmlzU2FmZUludGVnZXIoZGlzcGxheUluZm8uZGVjaW1hbFBsYWNlcyl8fFxuRmFpbCBgZGVjaW1hbFBsYWNlcyAke2Rpc3BsYXlJbmZvLmRlY2ltYWxQbGFjZXN9IGlzIG5vdCBhIHNhZmUgaW50ZWdlcmA7XG4gfVxuXG5yZXR1cm4gZGlzcGxheUluZm87XG4gfTskaM2PX29uY2UuY29lcmNlRGlzcGxheUluZm8oY29lcmNlRGlzcGxheUluZm8pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY29lcmNlRGlzcGxheUluZm8iOlsiY29lcmNlRGlzcGxheUluZm8iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAX5aQtm4CAABuAgAAJwAAAEBhZ29yaWMvZXJ0cC12MC4xNi4zLXUxOS4yL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL2lzc3VlcktpdC5qcyIsIi4vdHlwZUd1YXJkcy5qcyIsIi4vdHlwZXMtaW5kZXguanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL2lzc3VlcktpdC5qcyIsIi4vdHlwZUd1YXJkcy5qcyIsIi4vdHlwZXMtaW5kZXguanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRozY9faW1wb3J0cyhbW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtdXSxbXCIuL2lzc3VlcktpdC5qc1wiLCBbXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtdXSxbXCIuL3R5cGVzLWluZGV4LmpzXCIsIFtdXV0pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPADLeUUFgAAFBYAACsAAABAYWdvcmljL2VydHAtdjAuMTYuMy11MTkuMi9zcmMvaXNzdWVyS2l0LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGFnb3JpYy96b25lL2R1cmFibGUuanMiLCIuL2Ftb3VudE1hdGguanMiLCIuL2Rpc3BsYXlJbmZvLmpzIiwiLi9wYXltZW50TGVkZ2VyLmpzIl0sImV4cG9ydHMiOlsiaGFzSXNzdWVyIiwibWFrZUR1cmFibGVJc3N1ZXJLaXQiLCJtYWtlSXNzdWVyS2l0IiwicHJlcGFyZUlzc3VlcktpdCIsInVwZ3JhZGVJc3N1ZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBhc3NlcnQsRmFpbCxhc3NlcnRQYXR0ZXJuLG1ha2VTY2FsYXJCaWdNYXBTdG9yZSxtYWtlRHVyYWJsZVpvbmUsQXNzZXRLaW5kLGFzc2VydEFzc2V0S2luZCxjb2VyY2VEaXNwbGF5SW5mbyxwcmVwYXJlUGF5bWVudExlZGdlcjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiYXNzZXJ0XCIsIFskaM2PX2EgPT4gKGFzc2VydCA9ICRozY9fYSldXSxbXCJGYWlsXCIsIFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJhc3NlcnRQYXR0ZXJuXCIsIFskaM2PX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJtYWtlU2NhbGFyQmlnTWFwU3RvcmVcIiwgWyRozY9fYSA9PiAobWFrZVNjYWxhckJpZ01hcFN0b3JlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy96b25lL2R1cmFibGUuanNcIiwgW1tcIm1ha2VEdXJhYmxlWm9uZVwiLCBbJGjNj19hID0+IChtYWtlRHVyYWJsZVpvbmUgPSAkaM2PX2EpXV1dXSxbXCIuL2Ftb3VudE1hdGguanNcIiwgW1tcIkFzc2V0S2luZFwiLCBbJGjNj19hID0+IChBc3NldEtpbmQgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0QXNzZXRLaW5kXCIsIFskaM2PX2EgPT4gKGFzc2VydEFzc2V0S2luZCA9ICRozY9fYSldXV1dLFtcIi4vZGlzcGxheUluZm8uanNcIiwgW1tcImNvZXJjZURpc3BsYXlJbmZvXCIsIFskaM2PX2EgPT4gKGNvZXJjZURpc3BsYXlJbmZvID0gJGjNj19hKV1dXV0sW1wiLi9wYXltZW50TGVkZ2VyLmpzXCIsIFtbXCJwcmVwYXJlUGF5bWVudExlZGdlclwiLCBbJGjNj19hID0+IChwcmVwYXJlUGF5bWVudExlZGdlciA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBzZXR1cElzc3VlcktpdD0oXG57bmFtZSxhc3NldEtpbmQsZGlzcGxheUluZm8sZWxlbWVudFNoYXBlfSxcbmlzc3VlclpvbmUsXG5yZWNvdmVyeVNldHNTdGF0ZSxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmU9dW5kZWZpbmVkKT0+XG57XG5hc3NlcnQudHlwZW9mKG5hbWUsJ3N0cmluZycpO1xuYXNzZXJ0QXNzZXRLaW5kKGFzc2V0S2luZCk7XG5cbi8vXG5jb25zdCBjbGVhbkRpc3BsYXlJbmZvPWNvZXJjZURpc3BsYXlJbmZvKGRpc3BsYXlJbmZvLGFzc2V0S2luZCk7XG5pZihvcHRTaHV0ZG93bldpdGhGYWlsdXJlIT09dW5kZWZpbmVkKXtcbmFzc2VydC50eXBlb2Yob3B0U2h1dGRvd25XaXRoRmFpbHVyZSwnZnVuY3Rpb24nKTtcbiB9XG5cbmlmKGVsZW1lbnRTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKGVsZW1lbnRTaGFwZSk7XG4gfVxuXG4vL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLy9cbmNvbnN0e2lzc3VlcixtaW50LGJyYW5kLG1pbnRSZWNvdmVyeVB1cnNlfT1wcmVwYXJlUGF5bWVudExlZGdlcihcbmlzc3VlclpvbmUsXG5uYW1lLFxuYXNzZXRLaW5kLFxuY2xlYW5EaXNwbGF5SW5mbyxcbmVsZW1lbnRTaGFwZSxcbnJlY292ZXJ5U2V0c1N0YXRlLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZSk7XG5cblxucmV0dXJuIGhhcmRlbih7XG5icmFuZCxcbmlzc3Vlcixcbm1pbnQsXG5taW50UmVjb3ZlcnlQdXJzZSxcbmRpc3BsYXlJbmZvOmNsZWFuRGlzcGxheUluZm99KTtcblxuIH07XG5oYXJkZW4oc2V0dXBJc3N1ZXJLaXQpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBJTlNUQU5DRV9LRVk9J2lzc3Vlcic7XG4vKlxuXG5cblxuICovXG5jb25zdCBSRUNPVkVSWV9TRVRTX1NUQVRFPSdyZWNvdmVyeVNldHNTdGF0ZSc7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICB1cGdyYWRlSXNzdWVyS2l0PShcbmlzc3VlckJhZ2dhZ2UsXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlPXVuZGVmaW5lZCxcbnJlY292ZXJ5U2V0c09wdGlvbj11bmRlZmluZWQpPT5cbntcbmNvbnN0IGlzc3VlclJlY29yZD1pc3N1ZXJCYWdnYWdlLmdldChJTlNUQU5DRV9LRVkpO1xuY29uc3QgaXNzdWVyWm9uZT1tYWtlRHVyYWJsZVpvbmUoaXNzdWVyQmFnZ2FnZSk7XG5jb25zdCBvbGRSZWNvdmVyeVNldHNTdGF0ZT1pc3N1ZXJCYWdnYWdlLmhhcyhSRUNPVkVSWV9TRVRTX1NUQVRFKT9cbmlzc3VlckJhZ2dhZ2UuZ2V0KFJFQ09WRVJZX1NFVFNfU1RBVEUpOlxuJ2hhc1JlY292ZXJ5U2V0cyc7XG5pZihcbm9sZFJlY292ZXJ5U2V0c1N0YXRlPT09J25vUmVjb3ZlcnlTZXRzJyYmXG5yZWNvdmVyeVNldHNPcHRpb249PT0naGFzUmVjb3ZlcnlTZXRzJylcbntcbkZhaWwgYENhbm5vdCAoeWV0PykgdXBncmFkZSBmcm9tICdub1JlY292ZXJ5U2V0cycgdG8gJ2hhc1JlY292ZXJ5U2V0cydgO1xuIH1cbi8vXG4vL1xuLy9cbmNvbnN0IHJlY292ZXJ5U2V0c1N0YXRlPXJlY292ZXJ5U2V0c09wdGlvbnx8b2xkUmVjb3ZlcnlTZXRzU3RhdGU7XG5yZXR1cm4gc2V0dXBJc3N1ZXJLaXQoXG5pc3N1ZXJSZWNvcmQsXG5pc3N1ZXJab25lLFxucmVjb3ZlcnlTZXRzU3RhdGUsXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlKTtcblxuIH07JGjNj19vbmNlLnVwZ3JhZGVJc3N1ZXJLaXQodXBncmFkZUlzc3VlcktpdCk7XG5oYXJkZW4odXBncmFkZUlzc3VlcktpdCk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBoYXNJc3N1ZXI9KGJhZ2dhZ2UpPT5iYWdnYWdlLmhhcyhJTlNUQU5DRV9LRVkpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuaGFzSXNzdWVyKGhhc0lzc3Vlcik7XG5jb25zdCAgICAgICAgbWFrZUR1cmFibGVJc3N1ZXJLaXQ9KFxuaXNzdWVyQmFnZ2FnZSxcbm5hbWUsXG4vL1xuYXNzZXRLaW5kPUFzc2V0S2luZC5OQVQsXG5kaXNwbGF5SW5mbz1oYXJkZW4oe30pLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZT11bmRlZmluZWQsXG57ZWxlbWVudFNoYXBlPXVuZGVmaW5lZCxyZWNvdmVyeVNldHNPcHRpb249dW5kZWZpbmVkfT17fSk9Plxue1xuY29uc3QgaXNzdWVyRGF0YT1oYXJkZW4oe1xubmFtZSxcbmFzc2V0S2luZCxcbmRpc3BsYXlJbmZvLFxuZWxlbWVudFNoYXBlfSk7XG5cbmlzc3VlckJhZ2dhZ2UuaW5pdChJTlNUQU5DRV9LRVksaXNzdWVyRGF0YSk7XG5jb25zdCBpc3N1ZXJab25lPW1ha2VEdXJhYmxlWm9uZShpc3N1ZXJCYWdnYWdlKTtcbmNvbnN0IHJlY292ZXJ5U2V0c1N0YXRlPXJlY292ZXJ5U2V0c09wdGlvbnx8J2hhc1JlY292ZXJ5U2V0cyc7XG5pc3N1ZXJCYWdnYWdlLmluaXQoUkVDT1ZFUllfU0VUU19TVEFURSxyZWNvdmVyeVNldHNTdGF0ZSk7XG5yZXR1cm4gc2V0dXBJc3N1ZXJLaXQoXG5pc3N1ZXJEYXRhLFxuaXNzdWVyWm9uZSxcbnJlY292ZXJ5U2V0c1N0YXRlLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZSk7XG5cbiB9OyRozY9fb25jZS5tYWtlRHVyYWJsZUlzc3VlcktpdChtYWtlRHVyYWJsZUlzc3VlcktpdCk7XG5oYXJkZW4obWFrZUR1cmFibGVJc3N1ZXJLaXQpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBwcmVwYXJlSXNzdWVyS2l0PShcbmlzc3VlckJhZ2dhZ2UsXG5uYW1lLFxuLy9cbmFzc2V0S2luZD1Bc3NldEtpbmQuTkFULFxuZGlzcGxheUluZm89aGFyZGVuKHt9KSxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmU9dW5kZWZpbmVkLFxuLy9cbm9wdGlvbnM9e30pPT5cbntcbmlmKGhhc0lzc3Vlcihpc3N1ZXJCYWdnYWdlKSl7XG5jb25zdHtlbGVtZW50U2hhcGU6Xz11bmRlZmluZWQscmVjb3ZlcnlTZXRzT3B0aW9uPXVuZGVmaW5lZH09XG5vcHRpb25zO1xuY29uc3QgaXNzdWVyS2l0PXVwZ3JhZGVJc3N1ZXJLaXQoXG5pc3N1ZXJCYWdnYWdlLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZSxcbnJlY292ZXJ5U2V0c09wdGlvbik7XG5cblxuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbi8vXG5yZXR1cm4gaXNzdWVyS2l0O1xuIH1lbHNle1xuY29uc3QgaXNzdWVyS2l0PW1ha2VEdXJhYmxlSXNzdWVyS2l0KFxuaXNzdWVyQmFnZ2FnZSxcbm5hbWUsXG5hc3NldEtpbmQsXG5kaXNwbGF5SW5mbyxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmUsXG5vcHRpb25zKTtcblxuLy9cbnJldHVybiBpc3N1ZXJLaXQ7XG4gfVxuIH07JGjNj19vbmNlLnByZXBhcmVJc3N1ZXJLaXQocHJlcGFyZUlzc3VlcktpdCk7XG5oYXJkZW4ocHJlcGFyZUlzc3VlcktpdCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZUlzc3VlcktpdD0oXG5uYW1lLFxuLy9cbmFzc2V0S2luZD1Bc3NldEtpbmQuTkFULFxuZGlzcGxheUluZm89aGFyZGVuKHt9KSxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmU9dW5kZWZpbmVkLFxuLy9cbntlbGVtZW50U2hhcGU9dW5kZWZpbmVkLHJlY292ZXJ5U2V0c09wdGlvbj11bmRlZmluZWR9PXt9KT0+XG5cbi8vXG5tYWtlRHVyYWJsZUlzc3VlcktpdChcbm1ha2VTY2FsYXJCaWdNYXBTdG9yZSgnZHJvcHBlZCBpc3N1ZXIga2l0Jyx7ZHVyYWJsZTp0cnVlfSksXG5uYW1lLFxuYXNzZXRLaW5kLFxuZGlzcGxheUluZm8sXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlLFxue2VsZW1lbnRTaGFwZSxyZWNvdmVyeVNldHNPcHRpb259KTskaM2PX29uY2UubWFrZUlzc3VlcktpdChtYWtlSXNzdWVyS2l0KTtcblxuaGFyZGVuKG1ha2VJc3N1ZXJLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidXBncmFkZUlzc3VlcktpdCI6WyJ1cGdyYWRlSXNzdWVyS2l0Il0sImhhc0lzc3VlciI6WyJoYXNJc3N1ZXIiXSwibWFrZUR1cmFibGVJc3N1ZXJLaXQiOlsibWFrZUR1cmFibGVJc3N1ZXJLaXQiXSwicHJlcGFyZUlzc3VlcktpdCI6WyJwcmVwYXJlSXNzdWVyS2l0Il0sIm1ha2VJc3N1ZXJLaXQiOlsibWFrZUlzc3VlcktpdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADfxm6nEAYAABAGAABAAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjMtdTE5LjIvc3JjL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiY29weUJhZ01hdGhIZWxwZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQga2V5RVEsbWFrZUNvcHlCYWcsbXVzdE1hdGNoLE0sZ2V0Q29weUJhZ0VudHJpZXMsYmFnSXNTdXBlcmJhZyxiYWdVbmlvbixiYWdEaXNqb2ludFN1YnRyYWN0OyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wia2V5RVFcIiwgWyRozY9fYSA9PiAoa2V5RVEgPSAkaM2PX2EpXV0sW1wibWFrZUNvcHlCYWdcIiwgWyRozY9fYSA9PiAobWFrZUNvcHlCYWcgPSAkaM2PX2EpXV0sW1wibXVzdE1hdGNoXCIsIFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXSxbXCJNXCIsIFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wiZ2V0Q29weUJhZ0VudHJpZXNcIiwgWyRozY9fYSA9PiAoZ2V0Q29weUJhZ0VudHJpZXMgPSAkaM2PX2EpXV0sW1wiYmFnSXNTdXBlcmJhZ1wiLCBbJGjNj19hID0+IChiYWdJc1N1cGVyYmFnID0gJGjNj19hKV1dLFtcImJhZ1VuaW9uXCIsIFskaM2PX2EgPT4gKGJhZ1VuaW9uID0gJGjNj19hKV1dLFtcImJhZ0Rpc2pvaW50U3VidHJhY3RcIiwgWyRozY9fYSA9PiAoYmFnRGlzam9pbnRTdWJ0cmFjdCA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgZW1wdHk9bWFrZUNvcHlCYWcoW10pO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0ICAgICAgICBjb3B5QmFnTWF0aEhlbHBlcnM9aGFyZGVuKHtcbmRvQ29lcmNlOihiYWcpPT57XG5tdXN0TWF0Y2goYmFnLE0uYmFnKCksJ2JhZyBvZiBhbW91bnQnKTtcbnJldHVybiBiYWc7XG4gfSxcbmRvTWFrZUVtcHR5OigpPT5lbXB0eSxcbmRvSXNFbXB0eTooYmFnKT0+Z2V0Q29weUJhZ0VudHJpZXMoYmFnKS5sZW5ndGg9PT0wLFxuZG9Jc0dURTpiYWdJc1N1cGVyYmFnLFxuZG9Jc0VxdWFsOmtleUVRLFxuZG9BZGQ6YmFnVW5pb24sXG5kb1N1YnRyYWN0OmJhZ0Rpc2pvaW50U3VidHJhY3R9KTskaM2PX29uY2UuY29weUJhZ01hdGhIZWxwZXJzKGNvcHlCYWdNYXRoSGVscGVycyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjb3B5QmFnTWF0aEhlbHBlcnMiOlsiY29weUJhZ01hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAF7BS2/OBQAAzgUAAEAAAABAYWdvcmljL2VydHAtdjAuMTYuMy11MTkuMi9zcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJjb3B5U2V0TWF0aEhlbHBlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBrZXlFUSxtYWtlQ29weVNldCxtdXN0TWF0Y2gsTSxnZXRDb3B5U2V0S2V5cyxzZXRJc1N1cGVyc2V0LHNldERpc2pvaW50VW5pb24sc2V0RGlzam9pbnRTdWJ0cmFjdDskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImtleUVRXCIsIFskaM2PX2EgPT4gKGtleUVRID0gJGjNj19hKV1dLFtcIm1ha2VDb3B5U2V0XCIsIFskaM2PX2EgPT4gKG1ha2VDb3B5U2V0ID0gJGjNj19hKV1dLFtcIm11c3RNYXRjaFwiLCBbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV0sW1wiTVwiLCBbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcImdldENvcHlTZXRLZXlzXCIsIFskaM2PX2EgPT4gKGdldENvcHlTZXRLZXlzID0gJGjNj19hKV1dLFtcInNldElzU3VwZXJzZXRcIiwgWyRozY9fYSA9PiAoc2V0SXNTdXBlcnNldCA9ICRozY9fYSldXSxbXCJzZXREaXNqb2ludFVuaW9uXCIsIFskaM2PX2EgPT4gKHNldERpc2pvaW50VW5pb24gPSAkaM2PX2EpXV0sW1wic2V0RGlzam9pbnRTdWJ0cmFjdFwiLCBbJGjNj19hID0+IChzZXREaXNqb2ludFN1YnRyYWN0ID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuICovXG5cbi8qICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGVtcHR5PW1ha2VDb3B5U2V0KFtdKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0ICAgICAgICBjb3B5U2V0TWF0aEhlbHBlcnM9aGFyZGVuKHtcbmRvQ29lcmNlOihzZXQpPT57XG5tdXN0TWF0Y2goc2V0LE0uc2V0KCksJ3NldCBvZiBhbW91bnQnKTtcbnJldHVybiBzZXQ7XG4gfSxcbmRvTWFrZUVtcHR5OigpPT5lbXB0eSxcbmRvSXNFbXB0eTooc2V0KT0+Z2V0Q29weVNldEtleXMoc2V0KS5sZW5ndGg9PT0wLFxuZG9Jc0dURTpzZXRJc1N1cGVyc2V0LFxuZG9Jc0VxdWFsOmtleUVRLFxuZG9BZGQ6c2V0RGlzam9pbnRVbmlvbixcbmRvU3VidHJhY3Q6c2V0RGlzam9pbnRTdWJ0cmFjdH0pOyRozY9fb25jZS5jb3B5U2V0TWF0aEhlbHBlcnMoY29weVNldE1hdGhIZWxwZXJzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNvcHlTZXRNYXRoSGVscGVycyI6WyJjb3B5U2V0TWF0aEhlbHBlcnMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAmYWgJpYEAACWBAAAPAAAAEBhZ29yaWMvZXJ0cC12MC4xNi4zLXUxOS4yL3NyYy9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9uYXQiXSwiZXhwb3J0cyI6WyJuYXRNYXRoSGVscGVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IEZhaWwsTmF0LGlzTmF0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsIFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLCBbJGjNj19hID0+IChOYXQgPSAkaM2PX2EpXV0sW1wiaXNOYXRcIiwgWyRozY9fYSA9PiAoaXNOYXQgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuY29uc3QgZW1wdHk9MG47XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBuYXRNYXRoSGVscGVycz1oYXJkZW4oe1xuZG9Db2VyY2U6KG5hdCk9Pntcbi8vXG5hc3NlcnQudHlwZW9mKG5hdCwnYmlnaW50Jyk7XG5pc05hdChuYXQpfHxGYWlsIGB2YWx1ZSAke25hdH0gbXVzdCBiZSBhIG5hdHVyYWwgbnVtYmVyYDtcbnJldHVybiBOYXQobmF0KTtcbiB9LFxuZG9NYWtlRW1wdHk6KCk9PmVtcHR5LFxuZG9Jc0VtcHR5OihuYXQpPT5uYXQ9PT1lbXB0eSxcbmRvSXNHVEU6KGxlZnQscmlnaHQpPT5sZWZ0Pj1yaWdodCxcbmRvSXNFcXVhbDoobGVmdCxyaWdodCk9PmxlZnQ9PT1yaWdodCxcbi8vXG5kb0FkZDoobGVmdCxyaWdodCk9PmxlZnQrcmlnaHQsXG5kb1N1YnRyYWN0OihsZWZ0LHJpZ2h0KT0+TmF0KGxlZnQtcmlnaHQpfSk7JGjNj19vbmNlLm5hdE1hdGhIZWxwZXJzKG5hdE1hdGhIZWxwZXJzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im5hdE1hdGhIZWxwZXJzIjpbIm5hdE1hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFYLCPF3BgAAdwYAADwAAABAYWdvcmljL2VydHAtdjAuMTYuMy11MTkuMi9zcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJzZXRNYXRoSGVscGVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IHBhc3NTdHlsZU9mLGFzc2VydEtleSxlbGVtZW50c0lzU3VwZXJzZXQsZWxlbWVudHNEaXNqb2ludFVuaW9uLGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCxjb2VyY2VUb0VsZW1lbnRzLGVsZW1lbnRzQ29tcGFyZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiYXNzZXJ0S2V5XCIsIFskaM2PX2EgPT4gKGFzc2VydEtleSA9ICRozY9fYSldXSxbXCJlbGVtZW50c0lzU3VwZXJzZXRcIiwgWyRozY9fYSA9PiAoZWxlbWVudHNJc1N1cGVyc2V0ID0gJGjNj19hKV1dLFtcImVsZW1lbnRzRGlzam9pbnRVbmlvblwiLCBbJGjNj19hID0+IChlbGVtZW50c0Rpc2pvaW50VW5pb24gPSAkaM2PX2EpXV0sW1wiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0XCIsIFskaM2PX2EgPT4gKGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCA9ICRozY9fYSldXSxbXCJjb2VyY2VUb0VsZW1lbnRzXCIsIFskaM2PX2EgPT4gKGNvZXJjZVRvRWxlbWVudHMgPSAkaM2PX2EpXV0sW1wiZWxlbWVudHNDb21wYXJlXCIsIFskaM2PX2EgPT4gKGVsZW1lbnRzQ29tcGFyZSA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8vXG4vL1xuLyogICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGVtcHR5PWhhcmRlbihbXSk7XG5cbi8qXG5cblxuICovXG5jb25zdCAgICAgICAgc2V0TWF0aEhlbHBlcnM9aGFyZGVuKHtcbmRvQ29lcmNlOihsaXN0KT0+e1xubGlzdD1jb2VyY2VUb0VsZW1lbnRzKGxpc3QpO1xuLy9cbi8vXG4vL1xuLy9cbmFzc2VydEtleShsaXN0KTtcbnJldHVybiBsaXN0O1xuIH0sXG5kb01ha2VFbXB0eTooKT0+ZW1wdHksXG5kb0lzRW1wdHk6KGxpc3QpPT5wYXNzU3R5bGVPZihsaXN0KT09PSdjb3B5QXJyYXknJiZsaXN0Lmxlbmd0aD09PTAsXG5kb0lzR1RFOmVsZW1lbnRzSXNTdXBlcnNldCxcbmRvSXNFcXVhbDooeCx5KT0+ZWxlbWVudHNDb21wYXJlKHgseSk9PT0wLFxuZG9BZGQ6ZWxlbWVudHNEaXNqb2ludFVuaW9uLFxuZG9TdWJ0cmFjdDplbGVtZW50c0Rpc2pvaW50U3VidHJhY3R9KTskaM2PX29uY2Uuc2V0TWF0aEhlbHBlcnMoc2V0TWF0aEhlbHBlcnMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic2V0TWF0aEhlbHBlcnMiOlsic2V0TWF0aEhlbHBlcnMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAjb9p3rIDAACyAwAAKQAAAEBhZ29yaWMvZXJ0cC12MC4xNi4zLXUxOS4yL3NyYy9wYXltZW50LmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJwcmVwYXJlUGF5bWVudEtpbmQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBpbml0RW1wdHk7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJpbml0RW1wdHlcIiwgWyRozY9fYSA9PiAoaW5pdEVtcHR5ID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vL1xuLypcblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIHByZXBhcmVQYXltZW50S2luZD0oaXNzdWVyWm9uZSxuYW1lLGJyYW5kLFBheW1lbnRJKT0+e1xuY29uc3QgbWFrZVBheW1lbnQ9aXNzdWVyWm9uZS5leG9DbGFzcyhcbiBgJHtuYW1lfSBwYXltZW50YCxcblBheW1lbnRJLFxuaW5pdEVtcHR5LFxue1xuZ2V0QWxsZWdlZEJyYW5kKCl7XG5yZXR1cm4gYnJhbmQ7XG4gfX0pO1xuXG5cbi8vXG5yZXR1cm4gbWFrZVBheW1lbnQ7XG4gfTskaM2PX29uY2UucHJlcGFyZVBheW1lbnRLaW5kKHByZXBhcmVQYXltZW50S2luZCk7XG5oYXJkZW4ocHJlcGFyZVBheW1lbnRLaW5kKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InByZXBhcmVQYXltZW50S2luZCI6WyJwcmVwYXJlUGF5bWVudEtpbmQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAkinqOxogAAAaIAAALwAAAEBhZ29yaWMvZXJ0cC12MC4xNi4zLXUxOS4yL3NyYy9wYXltZW50TGVkZ2VyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL3Byb21pc2Uta2l0IiwiQGFnb3JpYy9zdG9yZSIsIi4vYW1vdW50TWF0aC5qcyIsIi4vcGF5bWVudC5qcyIsIi4vcHVyc2UuanMiLCIuL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6WyJwcmVwYXJlUGF5bWVudExlZGdlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IFgscSxGYWlsLGFubm90YXRlRXJyb3IsaXNQcm9taXNlLG11c3RNYXRjaCxNLGtleUVRLEFtb3VudE1hdGgscHJlcGFyZVBheW1lbnRLaW5kLHByZXBhcmVQdXJzZUtpbmQsQnJhbmRJLG1ha2VJc3N1ZXJJbnRlcmZhY2VzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsIFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wicVwiLCBbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIiwgWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJhbm5vdGF0ZUVycm9yXCIsIFskaM2PX2EgPT4gKGFubm90YXRlRXJyb3IgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsIFskaM2PX2EgPT4gKGlzUHJvbWlzZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm11c3RNYXRjaFwiLCBbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV0sW1wiTVwiLCBbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcImtleUVRXCIsIFskaM2PX2EgPT4gKGtleUVRID0gJGjNj19hKV1dXV0sW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBbW91bnRNYXRoXCIsIFskaM2PX2EgPT4gKEFtb3VudE1hdGggPSAkaM2PX2EpXV1dXSxbXCIuL3BheW1lbnQuanNcIiwgW1tcInByZXBhcmVQYXltZW50S2luZFwiLCBbJGjNj19hID0+IChwcmVwYXJlUGF5bWVudEtpbmQgPSAkaM2PX2EpXV1dXSxbXCIuL3B1cnNlLmpzXCIsIFtbXCJwcmVwYXJlUHVyc2VLaW5kXCIsIFskaM2PX2EgPT4gKHByZXBhcmVQdXJzZUtpbmQgPSAkaM2PX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIkJyYW5kSVwiLCBbJGjNj19hID0+IChCcmFuZEkgPSAkaM2PX2EpXV0sW1wibWFrZUlzc3VlckludGVyZmFjZXNcIiwgWyRozY9fYSA9PiAobWFrZUlzc3VlckludGVyZmFjZXMgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLypcblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgYW1vdW50U2hhcGVGcm9tRWxlbWVudFNoYXBlPShicmFuZCxhc3NldEtpbmQsZWxlbWVudFNoYXBlKT0+e1xubGV0IHZhbHVlU2hhcGU7XG5zd2l0Y2goYXNzZXRLaW5kKXtcbmNhc2UnbmF0Jzp7XG52YWx1ZVNoYXBlPU0ubmF0KCk7XG5lbGVtZW50U2hhcGU9PT11bmRlZmluZWR8fFxuRmFpbCBgRnVuZ2libGUgYXNzZXRzIGNhbm5vdCBoYXZlIGFuIGVsZW1lbnRTaGFwZTogJHtxKGVsZW1lbnRTaGFwZSl9YDtcbmJyZWFrO1xuIH1cbmNhc2Unc2V0Jzp7XG5pZihlbGVtZW50U2hhcGU9PT11bmRlZmluZWQpe1xudmFsdWVTaGFwZT1NLmFycmF5T2YoTS5rZXkoKSk7XG4gfWVsc2V7XG52YWx1ZVNoYXBlPU0uYXJyYXlPZihNLmFuZChNLmtleSgpLGVsZW1lbnRTaGFwZSkpO1xuIH1cbmJyZWFrO1xuIH1cbmNhc2UnY29weVNldCc6e1xuaWYoZWxlbWVudFNoYXBlPT09dW5kZWZpbmVkKXtcbnZhbHVlU2hhcGU9TS5zZXQoKTtcbiB9ZWxzZXtcbnZhbHVlU2hhcGU9TS5zZXRPZihlbGVtZW50U2hhcGUpO1xuIH1cbmJyZWFrO1xuIH1cbmNhc2UnY29weUJhZyc6e1xuaWYoZWxlbWVudFNoYXBlPT09dW5kZWZpbmVkKXtcbnZhbHVlU2hhcGU9TS5iYWcoKTtcbiB9ZWxzZXtcbnZhbHVlU2hhcGU9TS5iYWdPZihlbGVtZW50U2hhcGUpO1xuIH1cbmJyZWFrO1xuIH1cbmRlZmF1bHQ6e1xuRmFpbCBgdW5leHBlY3RlZCBhc3NldCBraW5kICR7cShhc3NldEtpbmQpfWA7XG4gfX1cblxuXG5jb25zdCBhbW91bnRTaGFwZT1oYXJkZW4oe1xuYnJhbmQsLy9cbnZhbHVlOnZhbHVlU2hhcGV9KTtcblxucmV0dXJuIGFtb3VudFNoYXBlO1xuIH07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBwcmVwYXJlUGF5bWVudExlZGdlcj0oXG5pc3N1ZXJab25lLFxubmFtZSxcbmFzc2V0S2luZCxcbmRpc3BsYXlJbmZvLFxuZWxlbWVudFNoYXBlLFxucmVjb3ZlcnlTZXRzU3RhdGUsXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlPXVuZGVmaW5lZCk9Plxue1xuLyogICAgICAgICAgICAgICAgICAgKi9cbi8vXG5jb25zdCBicmFuZD1pc3N1ZXJab25lLmV4byggYCR7bmFtZX0gYnJhbmRgLEJyYW5kSSx7XG5pc015SXNzdWVyKGFsbGVnZWRJc3N1ZXIpe1xuLy9cbnJldHVybiBhbGxlZ2VkSXNzdWVyPT09aXNzdWVyO1xuIH0sXG5nZXRBbGxlZ2VkTmFtZSgpe1xucmV0dXJuIG5hbWU7XG4gfSxcbi8vXG5nZXREaXNwbGF5SW5mbygpe1xucmV0dXJuIGRpc3BsYXlJbmZvO1xuIH0sXG5nZXRBbW91bnRTaGFwZSgpe1xucmV0dXJuIGFtb3VudFNoYXBlO1xuIH19KTtcblxuXG5jb25zdCBhbW91bnRTaGFwZT1hbW91bnRTaGFwZUZyb21FbGVtZW50U2hhcGUoXG5icmFuZCxcbmFzc2V0S2luZCxcbmVsZW1lbnRTaGFwZSk7XG5cblxuY29uc3R7SXNzdWVySSxNaW50SSxQYXltZW50SSxQdXJzZUlLaXR9PW1ha2VJc3N1ZXJJbnRlcmZhY2VzKFxuYnJhbmQsXG5hc3NldEtpbmQsXG5hbW91bnRTaGFwZSk7XG5cblxuY29uc3QgbWFrZVBheW1lbnQ9cHJlcGFyZVBheW1lbnRLaW5kKGlzc3VlclpvbmUsbmFtZSxicmFuZCxQYXltZW50SSk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmU9KHJlYXNvbik9Pntcbi8vXG4vL1xuaWYob3B0U2h1dGRvd25XaXRoRmFpbHVyZSE9PXVuZGVmaW5lZCl7XG50cnl7XG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlKHJlYXNvbik7XG4gfWNhdGNoKGVyckluU2h1dGRvd24pe1xuYW5ub3RhdGVFcnJvcihlcnJJblNodXRkb3duLFggYENhdXNlZCBieTogJHtyZWFzb259YCk7XG50aHJvdyBlcnJJblNodXRkb3duO1xuIH1cbiB9XG50aHJvdyByZWFzb247XG4gfTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHBheW1lbnRMZWRnZXI9aXNzdWVyWm9uZS53ZWFrTWFwU3RvcmUoJ3BheW1lbnRMZWRnZXInLHtcbnZhbHVlU2hhcGU6YW1vdW50U2hhcGV9KTtcblxuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG5jb25zdCBwYXltZW50UmVjb3ZlcnlTZXRzPWlzc3VlclpvbmUud2Vha01hcFN0b3JlKCdwYXltZW50UmVjb3ZlcnlTZXRzJyk7XG5cbi8qXG5cblxuXG5cblxuXG4gICAqL1xuY29uc3QgaW5pdFBheW1lbnQ9KHBheW1lbnQsYW1vdW50LG9wdFJlY292ZXJ5U2V0PXVuZGVmaW5lZCk9PntcbmlmKHJlY292ZXJ5U2V0c1N0YXRlPT09J25vUmVjb3ZlcnlTZXRzJyl7XG5vcHRSZWNvdmVyeVNldD09PXVuZGVmaW5lZHx8XG5GYWlsIGB3aGVuIHJlY292ZXJTZXRzU3RhdGUgPT09ICdub1JlY292ZXJ5U2V0cycsIG9wdFJlY292ZXJ5U2V0IG11c3QgYmUgZW1wdHlgO1xuIH1cbmlmKG9wdFJlY292ZXJ5U2V0IT09dW5kZWZpbmVkJiYhQW1vdW50TWF0aC5pc0VtcHR5KGFtb3VudCkpe1xub3B0UmVjb3ZlcnlTZXQuYWRkKHBheW1lbnQpO1xucGF5bWVudFJlY292ZXJ5U2V0cy5pbml0KHBheW1lbnQsb3B0UmVjb3ZlcnlTZXQpO1xuIH1cbnBheW1lbnRMZWRnZXIuaW5pdChwYXltZW50LGFtb3VudCk7XG4gfTtcblxuLypcblxuXG5cblxuICAgKi9cbmNvbnN0IGRlbGV0ZVBheW1lbnQ9KHBheW1lbnQpPT57XG5wYXltZW50TGVkZ2VyLmRlbGV0ZShwYXltZW50KTtcbmlmKHBheW1lbnRSZWNvdmVyeVNldHMuaGFzKHBheW1lbnQpKXtcbmNvbnN0IHJlY292ZXJ5U2V0PXBheW1lbnRSZWNvdmVyeVNldHMuZ2V0KHBheW1lbnQpO1xucGF5bWVudFJlY292ZXJ5U2V0cy5kZWxldGUocGF5bWVudCk7XG5yZWNvdmVyeVNldC5kZWxldGUocGF5bWVudCk7XG4gfVxuIH07XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgY29lcmNlPShhbGxlZ2VkQW1vdW50KT0+QW1vdW50TWF0aC5jb2VyY2UoYnJhbmQsYWxsZWdlZEFtb3VudCk7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuY29uc3QgYXNzZXJ0QW1vdW50Q29uc2lzdGVudD0ocGF5bWVudEJhbGFuY2Usb3B0QW1vdW50U2hhcGUpPT57XG5pZihvcHRBbW91bnRTaGFwZSE9PXVuZGVmaW5lZCl7XG5tdXN0TWF0Y2gocGF5bWVudEJhbGFuY2Usb3B0QW1vdW50U2hhcGUsJ2Ftb3VudCcpO1xuIH1cbiB9O1xuXG4vKlxuXG5cbiAgICovXG5jb25zdCBhc3NlcnRMaXZlUGF5bWVudD0ocGF5bWVudCk9PntcbnBheW1lbnRMZWRnZXIuaGFzKHBheW1lbnQpfHxcbkZhaWwgYCR7cGF5bWVudH0gd2FzIG5vdCBhIGxpdmUgcGF5bWVudCBmb3IgYnJhbmQgJHtxKFxuYnJhbmQpXG4gfS4gSXQgY291bGQgYmUgYSB1c2VkLXVwIHBheW1lbnQsIGEgcGF5bWVudCBmb3IgYW5vdGhlciBicmFuZCwgb3IgaXQgbWlnaHQgbm90IGJlIGEgcGF5bWVudCBhdCBhbGwuYDtcbiB9O1xuXG4vKlxuXG5cblxuXG5cblxuICAgKi9cbmNvbnN0IGRlcG9zaXRJbnRlcm5hbD0oXG5iYWxhbmNlU3RvcmUsXG5zcmNQYXltZW50LFxub3B0QW1vdW50U2hhcGU9dW5kZWZpbmVkKT0+XG57XG4haXNQcm9taXNlKHNyY1BheW1lbnQpfHxcbmFzc2VydC5mYWlsKFxuIGBkZXBvc2l0IGRvZXMgbm90IGFjY2VwdCBwcm9taXNlcyBhcyBmaXJzdCBhcmd1bWVudC4gSW5zdGVhZCBvZiBwYXNzaW5nIHRoZSBwcm9taXNlIChkZXBvc2l0KHBheW1lbnRQcm9taXNlKSksIGNvbnNpZGVyIHVud3JhcHBpbmcgdGhlIHByb21pc2UgZmlyc3Q6IEUud2hlbihwYXltZW50UHJvbWlzZSwgKGFjdHVhbFBheW1lbnQgPT4gZGVwb3NpdChhY3R1YWxQYXltZW50KSlgLFxuVHlwZUVycm9yKTtcblxuYXNzZXJ0TGl2ZVBheW1lbnQoc3JjUGF5bWVudCk7XG5jb25zdCBzcmNQYXltZW50QmFsYW5jZT1wYXltZW50TGVkZ2VyLmdldChzcmNQYXltZW50KTtcbmFzc2VydEFtb3VudENvbnNpc3RlbnQoc3JjUGF5bWVudEJhbGFuY2Usb3B0QW1vdW50U2hhcGUpO1xudHJ5e1xuLy9cbi8vXG4vL1xuZGVsZXRlUGF5bWVudChzcmNQYXltZW50KTtcbmJhbGFuY2VTdG9yZS5pbmNyZW1lbnQoc3JjUGF5bWVudEJhbGFuY2UpO1xuIH1jYXRjaChlcnIpe1xuc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZShlcnIpO1xudGhyb3cgZXJyO1xuIH1cbnJldHVybiBzcmNQYXltZW50QmFsYW5jZTtcbiB9O1xuXG4vKlxuXG5cblxuXG5cblxuICAgKi9cbmNvbnN0IHdpdGhkcmF3SW50ZXJuYWw9KGJhbGFuY2VTdG9yZSxhbW91bnQscmVjb3ZlcnlTZXQ9dW5kZWZpbmVkKT0+e1xuYW1vdW50PWNvZXJjZShhbW91bnQpO1xuY29uc3QgcGF5bWVudD1tYWtlUGF5bWVudCgpO1xuLy9cbi8vXG5iYWxhbmNlU3RvcmUuZGVjcmVtZW50KGFtb3VudCl8fFxuRmFpbCBgV2l0aGRyYXdhbCBvZiAke2Ftb3VudH0gZmFpbGVkIGJlY2F1c2UgdGhlIHB1cnNlIG9ubHkgY29udGFpbmVkICR7YmFsYW5jZVN0b3JlLmdldEFtb3VudCgpfWA7XG50cnl7XG5pbml0UGF5bWVudChwYXltZW50LGFtb3VudCxyZWNvdmVyeVNldCk7XG4gfWNhdGNoKGVycil7XG5zaHV0ZG93bkxlZGdlcldpdGhGYWlsdXJlKGVycik7XG50aHJvdyBlcnI7XG4gfVxucmV0dXJuIHBheW1lbnQ7XG4gfTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8vXG5jb25zdCBtYWtlRW1wdHlQdXJzZT1wcmVwYXJlUHVyc2VLaW5kKFxuaXNzdWVyWm9uZSxcbm5hbWUsXG5hc3NldEtpbmQsXG5icmFuZCxcblB1cnNlSUtpdCxcbmhhcmRlbih7XG5kZXBvc2l0SW50ZXJuYWwsXG53aXRoZHJhd0ludGVybmFsfSksXG5cbnJlY292ZXJ5U2V0c1N0YXRlLFxucGF5bWVudFJlY292ZXJ5U2V0cyk7XG5cblxuLyogICAgICAgICAgICAgICAgICAgICovXG4vL1xuY29uc3QgaXNzdWVyPWlzc3VlclpvbmUuZXhvKCBgJHtuYW1lfSBpc3N1ZXJgLElzc3Vlckkse1xuZ2V0QnJhbmQoKXtcbnJldHVybiBicmFuZDtcbiB9LFxuZ2V0QWxsZWdlZE5hbWUoKXtcbnJldHVybiBuYW1lO1xuIH0sXG5nZXRBc3NldEtpbmQoKXtcbnJldHVybiBhc3NldEtpbmQ7XG4gfSxcbmdldERpc3BsYXlJbmZvKCl7XG5yZXR1cm4gZGlzcGxheUluZm87XG4gfSxcbm1ha2VFbXB0eVB1cnNlKCl7XG5yZXR1cm4gbWFrZUVtcHR5UHVyc2UoKTtcbiB9LFxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5pc0xpdmUocGF5bWVudCl7XG4vL1xucmV0dXJuIHBheW1lbnRMZWRnZXIuaGFzKHBheW1lbnQpO1xuIH0sXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmdldEFtb3VudE9mKHBheW1lbnQpe1xuLy9cbmFzc2VydExpdmVQYXltZW50KHBheW1lbnQpO1xucmV0dXJuIHBheW1lbnRMZWRnZXIuZ2V0KHBheW1lbnQpO1xuIH0sXG4vKlxuXG5cbiAgICAgKi9cbmJ1cm4ocGF5bWVudCxvcHRBbW91bnRTaGFwZT11bmRlZmluZWQpe1xuLy9cbmFzc2VydExpdmVQYXltZW50KHBheW1lbnQpO1xuY29uc3QgcGF5bWVudEJhbGFuY2U9cGF5bWVudExlZGdlci5nZXQocGF5bWVudCk7XG5hc3NlcnRBbW91bnRDb25zaXN0ZW50KHBheW1lbnRCYWxhbmNlLG9wdEFtb3VudFNoYXBlKTtcbnRyeXtcbi8vXG5kZWxldGVQYXltZW50KHBheW1lbnQpO1xuIH1jYXRjaChlcnIpe1xuc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZShlcnIpO1xudGhyb3cgZXJyO1xuIH1cbnJldHVybiBwYXltZW50QmFsYW5jZTtcbiB9fSk7XG5cblxuLypcblxuXG5cblxuXG4gICAqL1xuY29uc3QgbWludFJlY292ZXJ5UHVyc2U9LyogICAgICAgICAgICAgICAgICAgKi9cbmlzc3VlclpvbmUubWFrZU9uY2UoJ21pbnRSZWNvdmVyeVB1cnNlJywoKT0+bWFrZUVtcHR5UHVyc2UoKSk7XG5cblxuLyogICAgICAgICAgICAgICAgICAqL1xuY29uc3QgbWludD1pc3N1ZXJab25lLmV4byggYCR7bmFtZX0gbWludGAsTWludEkse1xuZ2V0SXNzdWVyKCl7XG5yZXR1cm4gaXNzdWVyO1xuIH0sXG5taW50UGF5bWVudChuZXdBbW91bnQpe1xubmV3QW1vdW50PWNvZXJjZShuZXdBbW91bnQpO1xubXVzdE1hdGNoKG5ld0Ftb3VudCxhbW91bnRTaGFwZSwnbWludGVkIGFtb3VudCcpO1xuLy9cbi8vXG5jb25zdCByYXdQYXltZW50PW1ha2VQYXltZW50KCk7XG5pbml0UGF5bWVudChyYXdQYXltZW50LG5ld0Ftb3VudCx1bmRlZmluZWQpO1xuXG5jb25zdCBtaW50UmVjb3ZlcnlQdXJzZUJlZm9yZT1taW50UmVjb3ZlcnlQdXJzZS5nZXRDdXJyZW50QW1vdW50KCk7XG5taW50UmVjb3ZlcnlQdXJzZS5kZXBvc2l0KHJhd1BheW1lbnQsbmV3QW1vdW50KTtcbmNvbnN0IHBheW1lbnQ9bWludFJlY292ZXJ5UHVyc2Uud2l0aGRyYXcobmV3QW1vdW50KTtcbmNvbnN0IG1pbnRSZWNvdmVyeVB1cnNlQWZ0ZXI9bWludFJlY292ZXJ5UHVyc2UuZ2V0Q3VycmVudEFtb3VudCgpO1xuYXNzZXJ0KGtleUVRKG1pbnRSZWNvdmVyeVB1cnNlQmVmb3JlLG1pbnRSZWNvdmVyeVB1cnNlQWZ0ZXIpKTtcbnJldHVybiBwYXltZW50O1xuIH19KTtcblxuXG5jb25zdCBpc3N1ZXJLaXQ9aGFyZGVuKHtpc3N1ZXIsbWludCxicmFuZCxtaW50UmVjb3ZlcnlQdXJzZX0pO1xucmV0dXJuIGlzc3VlcktpdDtcbiB9OyRozY9fb25jZS5wcmVwYXJlUGF5bWVudExlZGdlcihwcmVwYXJlUGF5bWVudExlZGdlcik7XG5oYXJkZW4ocHJlcGFyZVBheW1lbnRMZWRnZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZVBheW1lbnRMZWRnZXIiOlsicHJlcGFyZVBheW1lbnRMZWRnZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAejD3iekQAADpEAAAJwAAAEBhZ29yaWMvZXJ0cC12MC4xNi4zLXUxOS4yL3NyYy9wdXJzZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAYWdvcmljL3N0b3JlIiwiLi9hbW91bnRNYXRoLmpzIiwiLi90cmFuc2llbnROb3RpZmllci5qcyIsIi4vYW1vdW50U3RvcmUuanMiXSwiZXhwb3J0cyI6WyJwcmVwYXJlUHVyc2VLaW5kIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgRmFpbCxNLG1ha2VDb3B5U2V0LEFtb3VudE1hdGgsbWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0LG1ha2VBbW91bnRTdG9yZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLCBbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLCBbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcIm1ha2VDb3B5U2V0XCIsIFskaM2PX2EgPT4gKG1ha2VDb3B5U2V0ID0gJGjNj19hKV1dXV0sW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBbW91bnRNYXRoXCIsIFskaM2PX2EgPT4gKEFtb3VudE1hdGggPSAkaM2PX2EpXV1dXSxbXCIuL3RyYW5zaWVudE5vdGlmaWVyLmpzXCIsIFtbXCJtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXRcIiwgWyRozY9fYSA9PiAobWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0ID0gJGjNj19hKV1dXV0sW1wiLi9hbW91bnRTdG9yZS5qc1wiLCBbW1wibWFrZUFtb3VudFN0b3JlXCIsIFskaM2PX2EgPT4gKG1ha2VBbW91bnRTdG9yZSA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuY29uc3QgRU1QVFlfQ09QWV9TRVQ9bWFrZUNvcHlTZXQoW10pO1xuXG4vL1xuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBwcmVwYXJlUHVyc2VLaW5kPShcbmlzc3VlclpvbmUsXG5uYW1lLFxuYXNzZXRLaW5kLFxuYnJhbmQsXG5QdXJzZUlLaXQsXG5wdXJzZU1ldGhvZHMsXG5yZWNvdmVyeVNldHNTdGF0ZSxcbnBheW1lbnRSZWNvdmVyeVNldHMpPT5cbntcbmNvbnN0IGFtb3VudFNoYXBlPWJyYW5kLmdldEFtb3VudFNoYXBlKCk7XG5cbi8vXG4vL1xuLy9cbmNvbnN0e3Byb3ZpZGVOb3RpZmllcix1cGRhdGU6dXBkYXRlQmFsYW5jZX09bWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0KCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG5jb25zdCBtYXliZVJlY292ZXJ5U2V0PShzdGF0ZSk9PntcbmNvbnN0e3JlY292ZXJ5U2V0fT1zdGF0ZTtcbmlmKHJlY292ZXJ5U2V0c1N0YXRlPT09J2hhc1JlY292ZXJ5U2V0cycpe1xucmV0dXJuIHJlY292ZXJ5U2V0O1xuIH1lbHNle1xucmVjb3ZlcnlTZXRzU3RhdGU9PT0nbm9SZWNvdmVyeVNldHMnfHxcbkZhaWwgYHJlY292ZXJTZXRzU3RhdGUgbXVzdCBiZSBub1JlY292ZXJ5U2V0cyBpZiBpdCBpc24ndCBoYXNSZWNvdmVyU2V0c2A7XG5wYXltZW50UmVjb3ZlcnlTZXRzIT09dW5kZWZpbmVkfHxcbkZhaWwgYHBheW1lbnRSZWNvdmVyeVNldHMgbXVzdCBhbHdheXMgYmUgZGVmaW5lZGA7XG5yZWNvdmVyeVNldC5nZXRTaXplKCk9PT0wfHxcbkZhaWwgYFdpdGggbm9SZWNvdmVyeVNldHMsIHJlY292ZXJ5U2V0IG11c3QgYmUgZW1wdHlgO1xuXG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbiB9O1xuXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5jb25zdHtkZXBvc2l0SW50ZXJuYWwsd2l0aGRyYXdJbnRlcm5hbH09cHVyc2VNZXRob2RzO1xuY29uc3QgbWFrZVB1cnNlS2l0PWlzc3VlclpvbmUuZXhvQ2xhc3NLaXQoXG4gYCR7bmFtZX0gUHVyc2VgLFxuUHVyc2VJS2l0LFxuKCk9PntcbmNvbnN0IGN1cnJlbnRCYWxhbmNlPUFtb3VudE1hdGgubWFrZUVtcHR5KGJyYW5kLGFzc2V0S2luZCk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCByZWNvdmVyeVNldD1pc3N1ZXJab25lLmRldGFjaGVkKCkuc2V0U3RvcmUoJ3JlY292ZXJ5IHNldCcpO1xuXG5yZXR1cm57XG5jdXJyZW50QmFsYW5jZSxcbnJlY292ZXJ5U2V0fTtcblxuIH0sXG57XG5wdXJzZTp7XG5kZXBvc2l0KHNyY1BheW1lbnQsb3B0QW1vdW50U2hhcGU9dW5kZWZpbmVkKXtcbi8vXG4vL1xuY29uc3R7c3RhdGV9PXRoaXM7XG5jb25zdHtwdXJzZX09dGhpcy5mYWNldHM7XG5jb25zdCBiYWxhbmNlU3RvcmU9bWFrZUFtb3VudFN0b3JlKHN0YXRlLCdjdXJyZW50QmFsYW5jZScpO1xuLy9cbmNvbnN0IHNyY1BheW1lbnRCYWxhbmNlPWRlcG9zaXRJbnRlcm5hbChcbmJhbGFuY2VTdG9yZSxcbnNyY1BheW1lbnQsXG5vcHRBbW91bnRTaGFwZSk7XG5cbnVwZGF0ZUJhbGFuY2UocHVyc2UsYmFsYW5jZVN0b3JlLmdldEFtb3VudCgpKTtcbnJldHVybiBzcmNQYXltZW50QmFsYW5jZTtcbiB9LFxud2l0aGRyYXcoYW1vdW50KXtcbmNvbnN0e3N0YXRlfT10aGlzO1xuY29uc3R7cHVyc2V9PXRoaXMuZmFjZXRzO1xuXG5jb25zdCBvcHRSZWNvdmVyeVNldD1tYXliZVJlY292ZXJ5U2V0KHN0YXRlKTtcbmNvbnN0IGJhbGFuY2VTdG9yZT1tYWtlQW1vdW50U3RvcmUoc3RhdGUsJ2N1cnJlbnRCYWxhbmNlJyk7XG4vL1xuY29uc3QgcGF5bWVudD13aXRoZHJhd0ludGVybmFsKFxuYmFsYW5jZVN0b3JlLFxuYW1vdW50LFxub3B0UmVjb3ZlcnlTZXQpO1xuXG51cGRhdGVCYWxhbmNlKHB1cnNlLGJhbGFuY2VTdG9yZS5nZXRBbW91bnQoKSk7XG5yZXR1cm4gcGF5bWVudDtcbiB9LFxuZ2V0Q3VycmVudEFtb3VudCgpe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5jb25zdCBiYWxhbmNlU3RvcmU9bWFrZUFtb3VudFN0b3JlKHN0YXRlLCdjdXJyZW50QmFsYW5jZScpO1xucmV0dXJuIGJhbGFuY2VTdG9yZS5nZXRBbW91bnQoKTtcbiB9LFxuZ2V0Q3VycmVudEFtb3VudE5vdGlmaWVyKCl7XG5yZXR1cm4gcHJvdmlkZU5vdGlmaWVyKHRoaXMuZmFjZXRzLnB1cnNlKTtcbiB9LFxuZ2V0QWxsZWdlZEJyYW5kKCl7XG5yZXR1cm4gYnJhbmQ7XG4gfSxcblxuZ2V0RGVwb3NpdEZhY2V0KCl7XG5yZXR1cm4gdGhpcy5mYWNldHMuZGVwb3NpdEZhY2V0O1xuIH0sXG5cbmdldFJlY292ZXJ5U2V0KCl7XG5jb25zdHtzdGF0ZX09dGhpcztcbmNvbnN0IG9wdFJlY292ZXJ5U2V0PW1heWJlUmVjb3ZlcnlTZXQoc3RhdGUpO1xuaWYob3B0UmVjb3ZlcnlTZXQ9PT11bmRlZmluZWQpe1xucmV0dXJuIEVNUFRZX0NPUFlfU0VUO1xuIH1cbnJldHVybiBvcHRSZWNvdmVyeVNldC5zbmFwc2hvdCgpO1xuIH0sXG5yZWNvdmVyQWxsKCl7XG5jb25zdHtzdGF0ZSxmYWNldHN9PXRoaXM7XG5sZXQgYW1vdW50PUFtb3VudE1hdGgubWFrZUVtcHR5KGJyYW5kLGFzc2V0S2luZCk7XG5jb25zdCBvcHRSZWNvdmVyeVNldD1tYXliZVJlY292ZXJ5U2V0KHN0YXRlKTtcbmlmKG9wdFJlY292ZXJ5U2V0PT09dW5kZWZpbmVkKXtcbnJldHVybiBhbW91bnQ7Ly9cbiB9XG5mb3IoY29uc3QgcGF5bWVudCBvZiBvcHRSZWNvdmVyeVNldC5rZXlzKCkpe1xuLy9cbi8vXG5jb25zdCBkZWx0YT1mYWNldHMucHVyc2UuZGVwb3NpdChwYXltZW50KTtcbmFtb3VudD1BbW91bnRNYXRoLmFkZChhbW91bnQsZGVsdGEsYnJhbmQpO1xuIH1cbm9wdFJlY292ZXJ5U2V0LmdldFNpemUoKT09PTB8fFxuRmFpbCBgaW50ZXJuYWw6IFJlbWFpbmluZyB1bnJlY292ZXJlZCBwYXltZW50czogJHtmYWNldHMucHVyc2UuZ2V0UmVjb3ZlcnlTZXQoKX1gO1xucmV0dXJuIGFtb3VudDtcbiB9fSxcblxuZGVwb3NpdEZhY2V0OntcbnJlY2VpdmUoLi4uYXJncyl7XG5yZXR1cm4gdGhpcy5mYWNldHMucHVyc2UuZGVwb3NpdCguLi5hcmdzKTtcbiB9fX0sXG5cblxue1xuc3RhdGVTaGFwZTp7XG5jdXJyZW50QmFsYW5jZTphbW91bnRTaGFwZSxcbnJlY292ZXJ5U2V0Ok0ucmVtb3RhYmxlKCdyZWNvdmVyeVNldCcpfX0pO1xuXG5cblxucmV0dXJuKCk9Pm1ha2VQdXJzZUtpdCgpLnB1cnNlO1xuIH07JGjNj19vbmNlLnByZXBhcmVQdXJzZUtpbmQocHJlcGFyZVB1cnNlS2luZCk7XG5oYXJkZW4ocHJlcGFyZVB1cnNlS2luZCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwcmVwYXJlUHVyc2VLaW5kIjpbInByZXBhcmVQdXJzZUtpbmQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAMcOXKwUGAAAFBgAAMwAAAEBhZ29yaWMvZXJ0cC12MC4xNi4zLXUxOS4yL3NyYy90cmFuc2llbnROb3RpZmllci5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3ZhdC1kYXRhIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvbm90aWZpZXIiXSwiZXhwb3J0cyI6WyJtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlLHByb3ZpZGVMYXp5LG1ha2VOb3RpZmllcktpdDskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmVcIiwgWyRozY9fYSA9PiAobWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcInByb3ZpZGVMYXp5XCIsIFskaM2PX2EgPT4gKHByb3ZpZGVMYXp5ID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wibWFrZU5vdGlmaWVyS2l0XCIsIFskaM2PX2EgPT4gKG1ha2VOb3RpZmllcktpdCA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuLypcblxuXG4gKi9cblxuLy9cbi8vXG5jb25zdCAgICAgICAgbWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0PSgpPT57XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCB0cmFuc2llbnROb3RpZmVyS2l0cz1tYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlKFxuJ3RyYW5zaWVudE5vdGlmZXJLaXRzJyk7XG5cblxuY29uc3QgcHJvdmlkZU5vdGlmaWVyS2l0PShrZXkpPT5cbnByb3ZpZGVMYXp5KHRyYW5zaWVudE5vdGlmZXJLaXRzLGtleSwoKT0+XG5tYWtlTm90aWZpZXJLaXQoa2V5LmdldEN1cnJlbnRBbW91bnQoKSkpO1xuXG5cbmNvbnN0IHByb3ZpZGVOb3RpZmllcj0oa2V5KT0+cHJvdmlkZU5vdGlmaWVyS2l0KGtleSkubm90aWZpZXI7XG5jb25zdCB1cGRhdGU9KGtleSxuZXdWYWx1ZSk9PntcbmlmKHRyYW5zaWVudE5vdGlmZXJLaXRzLmhhcyhrZXkpKXtcbmNvbnN0e3VwZGF0ZXJ9PXRyYW5zaWVudE5vdGlmZXJLaXRzLmdldChrZXkpO1xudXBkYXRlci51cGRhdGVTdGF0ZShuZXdWYWx1ZSk7XG4gfVxuIH07XG5cbnJldHVybntwcm92aWRlTm90aWZpZXIsdXBkYXRlfTtcbiB9OyRozY9fb25jZS5tYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQobWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0KTtcbmhhcmRlbihtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0IjpbIm1ha2VUcmFuc2llbnROb3RpZmllcktpdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADB3r+Y+xgAAPsYAAAsAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjMtdTE5LjIvc3JjL3R5cGVHdWFyZHMuanN7ImltcG9ydHMiOlsiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJBbW91bnRQYXR0ZXJuU2hhcGUiLCJBbW91bnRTaGFwZSIsIkFzc2V0S2luZFNoYXBlIiwiQnJhbmRJIiwiQnJhbmRTaGFwZSIsIkRlcG9zaXRGYWNldFNoYXBlIiwiRGlzcGxheUluZm9TaGFwZSIsIklzc3VlcktpdFNoYXBlIiwiSXNzdWVyU2hhcGUiLCJNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMiLCJNaW50U2hhcGUiLCJOb3RpZmllclNoYXBlIiwiUGF5bWVudFNoYXBlIiwiUHVyc2VTaGFwZSIsIlJhdGlvU2hhcGUiLCJpc0NvcHlCYWdWYWx1ZSIsImlzQ29weVNldFZhbHVlIiwiaXNOYXRWYWx1ZSIsImlzU2V0VmFsdWUiLCJtYWtlSXNzdWVySW50ZXJmYWNlcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IE0sbWF0Y2hlcyxnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLCBbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcIm1hdGNoZXNcIiwgWyRozY9fYSA9PiAobWF0Y2hlcyA9ICRozY9fYSldXSxbXCJnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWRcIiwgWyRozY9fYSA9PiAoZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG4vKlxuXG5cbiAqL1xuXG5jb25zdCAgICAgICAgQnJhbmRTaGFwZT1NLnJlbW90YWJsZSgnQnJhbmQnKTskaM2PX29uY2UuQnJhbmRTaGFwZShCcmFuZFNoYXBlKTtcbmNvbnN0ICAgICAgICBJc3N1ZXJTaGFwZT1NLnJlbW90YWJsZSgnSXNzdWVyJyk7JGjNj19vbmNlLklzc3VlclNoYXBlKElzc3VlclNoYXBlKTtcbmNvbnN0ICAgICAgICBQYXltZW50U2hhcGU9TS5yZW1vdGFibGUoJ1BheW1lbnQnKTskaM2PX29uY2UuUGF5bWVudFNoYXBlKFBheW1lbnRTaGFwZSk7XG5jb25zdCAgICAgICAgUHVyc2VTaGFwZT1NLnJlbW90YWJsZSgnUHVyc2UnKTskaM2PX29uY2UuUHVyc2VTaGFwZShQdXJzZVNoYXBlKTtcbmNvbnN0ICAgICAgICBEZXBvc2l0RmFjZXRTaGFwZT1NLnJlbW90YWJsZSgnRGVwb3NpdEZhY2V0Jyk7JGjNj19vbmNlLkRlcG9zaXRGYWNldFNoYXBlKERlcG9zaXRGYWNldFNoYXBlKTtcbmNvbnN0ICAgICAgICBOb3RpZmllclNoYXBlPU0ucmVtb3RhYmxlKCdOb3RpZmllcicpOyRozY9fb25jZS5Ob3RpZmllclNoYXBlKE5vdGlmaWVyU2hhcGUpO1xuY29uc3QgICAgICAgIE1pbnRTaGFwZT1NLnJlbW90YWJsZSgnTWludCcpO1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UuTWludFNoYXBlKE1pbnRTaGFwZSk7XG5jb25zdCBOYXRWYWx1ZVNoYXBlPU0ubmF0KCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBDb3B5U2V0VmFsdWVTaGFwZT1NLnNldCgpO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgU2V0VmFsdWVTaGFwZT1NLmFycmF5T2YoTS5rZXkoKSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IENvcHlCYWdWYWx1ZVNoYXBlPU0uYmFnKCk7XG5cbmNvbnN0IEFtb3VudFZhbHVlU2hhcGU9TS5vcihcbk5hdFZhbHVlU2hhcGUsXG5Db3B5U2V0VmFsdWVTaGFwZSxcblNldFZhbHVlU2hhcGUsXG5Db3B5QmFnVmFsdWVTaGFwZSk7XG5cblxuY29uc3QgICAgICAgIEFtb3VudFNoYXBlPXticmFuZDpCcmFuZFNoYXBlLHZhbHVlOkFtb3VudFZhbHVlU2hhcGV9OyRozY9fb25jZS5BbW91bnRTaGFwZShBbW91bnRTaGFwZSk7XG5oYXJkZW4oQW1vdW50U2hhcGUpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgQW1vdW50UGF0dGVyblNoYXBlPU0ucGF0dGVybigpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovJGjNj19vbmNlLkFtb3VudFBhdHRlcm5TaGFwZShBbW91bnRQYXR0ZXJuU2hhcGUpO1xuY29uc3QgICAgICAgIFJhdGlvU2hhcGU9e251bWVyYXRvcjpBbW91bnRTaGFwZSxkZW5vbWluYXRvcjpBbW91bnRTaGFwZX07JGjNj19vbmNlLlJhdGlvU2hhcGUoUmF0aW9TaGFwZSk7XG5oYXJkZW4oUmF0aW9TaGFwZSk7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGlzTmF0VmFsdWU9KHZhbHVlKT0+bWF0Y2hlcyh2YWx1ZSxOYXRWYWx1ZVNoYXBlKTskaM2PX29uY2UuaXNOYXRWYWx1ZShpc05hdFZhbHVlKTtcbmhhcmRlbihpc05hdFZhbHVlKTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCAgICAgICAgaXNDb3B5U2V0VmFsdWU9KHZhbHVlKT0+bWF0Y2hlcyh2YWx1ZSxDb3B5U2V0VmFsdWVTaGFwZSk7JGjNj19vbmNlLmlzQ29weVNldFZhbHVlKGlzQ29weVNldFZhbHVlKTtcbmhhcmRlbihpc0NvcHlTZXRWYWx1ZSk7XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGlzU2V0VmFsdWU9KHZhbHVlKT0+bWF0Y2hlcyh2YWx1ZSxTZXRWYWx1ZVNoYXBlKTskaM2PX29uY2UuaXNTZXRWYWx1ZShpc1NldFZhbHVlKTtcbmhhcmRlbihpc1NldFZhbHVlKTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCAgICAgICAgaXNDb3B5QmFnVmFsdWU9KHZhbHVlKT0+bWF0Y2hlcyh2YWx1ZSxDb3B5QmFnVmFsdWVTaGFwZSk7JGjNj19vbmNlLmlzQ29weUJhZ1ZhbHVlKGlzQ29weUJhZ1ZhbHVlKTtcbmhhcmRlbihpc0NvcHlCYWdWYWx1ZSk7XG5cbi8vXG5jb25zdCAgICAgICAgTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTPTEwMDskaM2PX29uY2UuTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTKE1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyk7XG5cbmNvbnN0ICAgICAgICBBc3NldEtpbmRTaGFwZT1NLm9yKCduYXQnLCdzZXQnLCdjb3B5U2V0JywnY29weUJhZycpOyRozY9fb25jZS5Bc3NldEtpbmRTaGFwZShBc3NldEtpbmRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBEaXNwbGF5SW5mb1NoYXBlPU0uc3BsaXRSZWNvcmQoXG57fSxcbntcbmRlY2ltYWxQbGFjZXM6TS5hbmQoXG5NLmd0ZSgtTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTKSxcbk0ubHRlKE1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUykpLFxuXG5hc3NldEtpbmQ6QXNzZXRLaW5kU2hhcGV9LFxuXG57XG4vL1xuLy9cbn0pOyRozY9fb25jZS5EaXNwbGF5SW5mb1NoYXBlKERpc3BsYXlJbmZvU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBJc3N1ZXJLaXRTaGFwZT17XG5icmFuZDpCcmFuZFNoYXBlLFxubWludDpNaW50U2hhcGUsXG5taW50UmVjb3ZlcnlQdXJzZTpQdXJzZVNoYXBlLFxuaXNzdWVyOklzc3VlclNoYXBlLFxuZGlzcGxheUluZm86RGlzcGxheUluZm9TaGFwZX07JGjNj19vbmNlLklzc3VlcktpdFNoYXBlKElzc3VlcktpdFNoYXBlKTtcblxuaGFyZGVuKElzc3VlcktpdFNoYXBlKTtcblxuLy9cblxuY29uc3QgICAgICAgIEJyYW5kST1NLmludGVyZmFjZSgnQnJhbmQnLHtcbmlzTXlJc3N1ZXI6TS5jYWxsV2hlbihNLmF3YWl0KElzc3VlclNoYXBlKSkucmV0dXJucyhNLmJvb2xlYW4oKSksXG5nZXRBbGxlZ2VkTmFtZTpNLmNhbGwoKS5yZXR1cm5zKE0uc3RyaW5nKCkpLFxuZ2V0RGlzcGxheUluZm86TS5jYWxsKCkucmV0dXJucyhEaXNwbGF5SW5mb1NoYXBlKSxcbmdldEFtb3VudFNoYXBlOk0uY2FsbCgpLnJldHVybnMoTS5wYXR0ZXJuKCkpfSk7XG5cblxuLypcblxuXG5cbiAqLyRozY9fb25jZS5CcmFuZEkoQnJhbmRJKTtcbmNvbnN0ICAgICAgICBtYWtlSXNzdWVySW50ZXJmYWNlcz0oXG5icmFuZFNoYXBlPUJyYW5kU2hhcGUsXG5hc3NldEtpbmRTaGFwZT1Bc3NldEtpbmRTaGFwZSxcbmFtb3VudFNoYXBlPUFtb3VudFNoYXBlKT0+XG57XG5jb25zdCBJc3N1ZXJJPU0uaW50ZXJmYWNlKCdJc3N1ZXInLHtcbmdldEJyYW5kOk0uY2FsbCgpLnJldHVybnMoYnJhbmRTaGFwZSksXG5nZXRBbGxlZ2VkTmFtZTpNLmNhbGwoKS5yZXR1cm5zKE0uc3RyaW5nKCkpLFxuZ2V0QXNzZXRLaW5kOk0uY2FsbCgpLnJldHVybnMoYXNzZXRLaW5kU2hhcGUpLFxuZ2V0RGlzcGxheUluZm86TS5jYWxsKCkucmV0dXJucyhEaXNwbGF5SW5mb1NoYXBlKSxcbm1ha2VFbXB0eVB1cnNlOk0uY2FsbCgpLnJldHVybnMoUHVyc2VTaGFwZSksXG5cbmlzTGl2ZTpNLmNhbGxXaGVuKE0uYXdhaXQoUGF5bWVudFNoYXBlKSkucmV0dXJucyhNLmJvb2xlYW4oKSksXG5nZXRBbW91bnRPZjpNLmNhbGxXaGVuKE0uYXdhaXQoUGF5bWVudFNoYXBlKSkucmV0dXJucyhhbW91bnRTaGFwZSksXG5idXJuOk0uY2FsbFdoZW4oTS5hd2FpdChQYXltZW50U2hhcGUpKS5cbm9wdGlvbmFsKEFtb3VudFBhdHRlcm5TaGFwZSkuXG5yZXR1cm5zKGFtb3VudFNoYXBlKX0pO1xuXG5cbmNvbnN0IE1pbnRJPU0uaW50ZXJmYWNlKCdNaW50Jyx7XG5nZXRJc3N1ZXI6TS5jYWxsKCkucmV0dXJucyhJc3N1ZXJTaGFwZSksXG5taW50UGF5bWVudDpNLmNhbGwoYW1vdW50U2hhcGUpLnJldHVybnMoUGF5bWVudFNoYXBlKX0pO1xuXG5cbmNvbnN0IFBheW1lbnRJPU0uaW50ZXJmYWNlKCdQYXltZW50Jyx7XG5nZXRBbGxlZ2VkQnJhbmQ6TS5jYWxsKCkucmV0dXJucyhicmFuZFNoYXBlKX0pO1xuXG5cbmNvbnN0IFB1cnNlST1NLmludGVyZmFjZSgnUHVyc2UnLHtcbmdldEFsbGVnZWRCcmFuZDpNLmNhbGwoKS5yZXR1cm5zKGJyYW5kU2hhcGUpLFxuZ2V0Q3VycmVudEFtb3VudDpNLmNhbGwoKS5yZXR1cm5zKGFtb3VudFNoYXBlKSxcbmdldEN1cnJlbnRBbW91bnROb3RpZmllcjpNLmNhbGwoKS5yZXR1cm5zKE5vdGlmaWVyU2hhcGUpLFxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbmRlcG9zaXQ6TS5jYWxsKFBheW1lbnRTaGFwZSkuXG5vcHRpb25hbChBbW91bnRQYXR0ZXJuU2hhcGUpLlxucmV0dXJucyhhbW91bnRTaGFwZSksXG5nZXREZXBvc2l0RmFjZXQ6TS5jYWxsKCkucmV0dXJucyhEZXBvc2l0RmFjZXRTaGFwZSksXG53aXRoZHJhdzpNLmNhbGwoYW1vdW50U2hhcGUpLnJldHVybnMoUGF5bWVudFNoYXBlKSxcbmdldFJlY292ZXJ5U2V0Ok0uY2FsbCgpLnJldHVybnMoTS5zZXRPZihQYXltZW50U2hhcGUpKSxcbnJlY292ZXJBbGw6TS5jYWxsKCkucmV0dXJucyhhbW91bnRTaGFwZSl9KTtcblxuXG5jb25zdCBEZXBvc2l0RmFjZXRJPU0uaW50ZXJmYWNlKCdEZXBvc2l0RmFjZXQnLHtcbnJlY2VpdmU6Z2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkKFB1cnNlSSkubWV0aG9kR3VhcmRzLmRlcG9zaXR9KTtcblxuXG5jb25zdCBQdXJzZUlLaXQ9e1xucHVyc2U6UHVyc2VJLFxuZGVwb3NpdEZhY2V0OkRlcG9zaXRGYWNldEl9O1xuXG5oYXJkZW4oUHVyc2VJS2l0KTtcblxucmV0dXJuIGhhcmRlbih7XG5Jc3N1ZXJJLFxuTWludEksXG5QYXltZW50SSxcblB1cnNlSUtpdH0pO1xuXG4gfTskaM2PX29uY2UubWFrZUlzc3VlckludGVyZmFjZXMobWFrZUlzc3VlckludGVyZmFjZXMpO1xuaGFyZGVuKG1ha2VJc3N1ZXJJbnRlcmZhY2VzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkJyYW5kU2hhcGUiOlsiQnJhbmRTaGFwZSJdLCJJc3N1ZXJTaGFwZSI6WyJJc3N1ZXJTaGFwZSJdLCJQYXltZW50U2hhcGUiOlsiUGF5bWVudFNoYXBlIl0sIlB1cnNlU2hhcGUiOlsiUHVyc2VTaGFwZSJdLCJEZXBvc2l0RmFjZXRTaGFwZSI6WyJEZXBvc2l0RmFjZXRTaGFwZSJdLCJOb3RpZmllclNoYXBlIjpbIk5vdGlmaWVyU2hhcGUiXSwiTWludFNoYXBlIjpbIk1pbnRTaGFwZSJdLCJBbW91bnRTaGFwZSI6WyJBbW91bnRTaGFwZSJdLCJBbW91bnRQYXR0ZXJuU2hhcGUiOlsiQW1vdW50UGF0dGVyblNoYXBlIl0sIlJhdGlvU2hhcGUiOlsiUmF0aW9TaGFwZSJdLCJpc05hdFZhbHVlIjpbImlzTmF0VmFsdWUiXSwiaXNDb3B5U2V0VmFsdWUiOlsiaXNDb3B5U2V0VmFsdWUiXSwiaXNTZXRWYWx1ZSI6WyJpc1NldFZhbHVlIl0sImlzQ29weUJhZ1ZhbHVlIjpbImlzQ29weUJhZ1ZhbHVlIl0sIk1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyI6WyJNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMiXSwiQXNzZXRLaW5kU2hhcGUiOlsiQXNzZXRLaW5kU2hhcGUiXSwiRGlzcGxheUluZm9TaGFwZSI6WyJEaXNwbGF5SW5mb1NoYXBlIl0sIklzc3VlcktpdFNoYXBlIjpbIklzc3VlcktpdFNoYXBlIl0sIkJyYW5kSSI6WyJCcmFuZEkiXSwibWFrZUlzc3VlckludGVyZmFjZXMiOlsibWFrZUlzc3VlckludGVyZmFjZXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAABURLJnkBAAB5AQAALQAAAEBhZ29yaWMvZXJ0cC12MC4xNi4zLXUxOS4yL3NyYy90eXBlcy1pbmRleC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjNj19pbXBvcnRzKFtdKTsgICBcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACdrdzfGBoAABgaAAAtAAAAQGFnb3JpYy9pbnRlcm5hbC12MC40LjAtdTE5LjIvc3JjL2NhbGxiYWNrLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2ZhciIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbImNhbGxFIiwiY2FsbFN5bmMiLCJpc0NhbGxiYWNrIiwibWFrZUZ1bmN0aW9uQ2FsbGJhY2siLCJtYWtlTWV0aG9kQ2FsbGJhY2siLCJtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2siLCJtYWtlU3luY01ldGhvZENhbGxiYWNrIiwicHJlcGFyZUF0dGVudWF0b3IiLCJwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBGYWlsLG1ha2VFcnJvcixxLEUsaXNPYmplY3QsaXNQYXNzYWJsZVN5bWJvbCxnZXRJbnRlcmZhY2VNZXRob2RLZXlzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsIFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wibWFrZUVycm9yXCIsIFskaM2PX2EgPT4gKG1ha2VFcnJvciA9ICRozY9fYSldXSxbXCJxXCIsIFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImlzT2JqZWN0XCIsIFskaM2PX2EgPT4gKGlzT2JqZWN0ID0gJGjNj19hKV1dLFtcImlzUGFzc2FibGVTeW1ib2xcIiwgWyRozY9fYSA9PiAoaXNQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJnZXRJbnRlcmZhY2VNZXRob2RLZXlzXCIsIFskaM2PX2EgPT4gKGdldEludGVyZmFjZU1ldGhvZEtleXMgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuY29uc3R7ZnJvbUVudHJpZXN9PU9iamVjdDtcblxuY29uc3R7b3duS2V5czpyYXdPd25LZXlzfT1SZWZsZWN0O1xuY29uc3Qgb3duS2V5cz1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5yYXdPd25LZXlzO1xuXG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBpc1Byb3BlcnR5S2V5PShrZXkpPT57XG5zd2l0Y2godHlwZW9mIGtleSl7XG5jYXNlJ3N0cmluZyc6XG5jYXNlJ251bWJlcic6XG5jYXNlJ3N5bWJvbCc6XG5yZXR1cm4gdHJ1ZTtcbmRlZmF1bHQ6XG5yZXR1cm4gZmFsc2U7fVxuXG4gfTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGNhbGxTeW5jPShjYWxsYmFjaywuLi5hcmdzKT0+e1xuY29uc3R7dGFyZ2V0LG1ldGhvZE5hbWUsYm91bmR9PWNhbGxiYWNrO1xuaWYobWV0aG9kTmFtZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gdGFyZ2V0KC4uLmJvdW5kLC4uLmFyZ3MpO1xuIH1cbnJldHVybiB0YXJnZXRbbWV0aG9kTmFtZV0oLi4uYm91bmQsLi4uYXJncyk7XG4gfTskaM2PX29uY2UuY2FsbFN5bmMoY2FsbFN5bmMpO1xuaGFyZGVuKGNhbGxTeW5jKTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGNhbGxFPShjYWxsYmFjaywuLi5hcmdzKT0+e1xuY29uc3R7dGFyZ2V0LG1ldGhvZE5hbWUsYm91bmR9PWNhbGxiYWNrO1xuaWYobWV0aG9kTmFtZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gRSh0YXJnZXQpKC4uLmJvdW5kLC4uLmFyZ3MpO1xuIH1cbnJldHVybiBFKHRhcmdldClbbWV0aG9kTmFtZV0oLi4uYm91bmQsLi4uYXJncyk7XG4gfTskaM2PX29uY2UuY2FsbEUoY2FsbEUpO1xuaGFyZGVuKGNhbGxFKTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2s9KHRhcmdldCwuLi5ib3VuZCk9PntcbnR5cGVvZiB0YXJnZXQ9PT0nZnVuY3Rpb24nfHxcbkZhaWwgYHN5bmMgZnVuY3Rpb24gY2FsbGJhY2sgdGFyZ2V0IG11c3QgYmUgYSBmdW5jdGlvbjogJHt0YXJnZXR9YDtcbi8qICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGNiPWhhcmRlbih7dGFyZ2V0LGJvdW5kLGlzU3luYzp0cnVlfSk7XG5yZXR1cm4gKC8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL2NiKTtcbiB9OyRozY9fb25jZS5tYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2sobWFrZVN5bmNGdW5jdGlvbkNhbGxiYWNrKTtcbmhhcmRlbihtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2spO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIG1ha2VGdW5jdGlvbkNhbGxiYWNrPSh0YXJnZXQsLi4uYm91bmQpPT57XG5pc09iamVjdCh0YXJnZXQpfHxcbkZhaWwgYGZ1bmN0aW9uIGNhbGxiYWNrIHRhcmdldCBtdXN0IGJlIGEgZnVuY3Rpb24gcHJlc2VuY2U6ICR7dGFyZ2V0fWA7XG4vKiAgICAgICAgICAgICAgICAgICovXG5jb25zdCBjYj1oYXJkZW4oe3RhcmdldCxib3VuZH0pO1xucmV0dXJuICgvKiAgICAgICAgICAgICAgICAgICAgICAqL2NiKTtcbiB9OyRozY9fb25jZS5tYWtlRnVuY3Rpb25DYWxsYmFjayhtYWtlRnVuY3Rpb25DYWxsYmFjayk7XG5oYXJkZW4obWFrZUZ1bmN0aW9uQ2FsbGJhY2spO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZVN5bmNNZXRob2RDYWxsYmFjaz0odGFyZ2V0LG1ldGhvZE5hbWUsLi4uYm91bmQpPT57XG5pc09iamVjdCh0YXJnZXQpfHxcbkZhaWwgYHN5bmMgbWV0aG9kIGNhbGxiYWNrIHRhcmdldCBtdXN0IGJlIGFuIG9iamVjdDogJHt0YXJnZXR9YDtcbnR5cGVvZiBtZXRob2ROYW1lPT09J3N0cmluZyd8fFxuaXNQYXNzYWJsZVN5bWJvbChtZXRob2ROYW1lKXx8XG5GYWlsIGBtZXRob2QgbmFtZSBtdXN0IGJlIGEgc3RyaW5nIG9yIHBhc3NhYmxlIHN5bWJvbDogJHttZXRob2ROYW1lfWA7XG4vKiAgICAgICAgICAgICAgICAgICovXG5jb25zdCBjYj1oYXJkZW4oe3RhcmdldCxtZXRob2ROYW1lLGJvdW5kLGlzU3luYzp0cnVlfSk7XG5yZXR1cm4gKC8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL2NiKTtcbiB9OyRozY9fb25jZS5tYWtlU3luY01ldGhvZENhbGxiYWNrKG1ha2VTeW5jTWV0aG9kQ2FsbGJhY2spO1xuaGFyZGVuKG1ha2VTeW5jTWV0aG9kQ2FsbGJhY2spO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZU1ldGhvZENhbGxiYWNrPSh0YXJnZXQsbWV0aG9kTmFtZSwuLi5ib3VuZCk9PntcbmlzT2JqZWN0KHRhcmdldCl8fEZhaWwgYG1ldGhvZCBjYWxsYmFjayB0YXJnZXQgbXVzdCBiZSBhbiBvYmplY3Q6ICR7dGFyZ2V0fWA7XG50eXBlb2YgbWV0aG9kTmFtZT09PSdzdHJpbmcnfHxcbmlzUGFzc2FibGVTeW1ib2wobWV0aG9kTmFtZSl8fFxuRmFpbCBgbWV0aG9kIG5hbWUgbXVzdCBiZSBhIHN0cmluZyBvciBwYXNzYWJsZSBzeW1ib2w6ICR7bWV0aG9kTmFtZX1gO1xuLyogICAgICAgICAgICAgICAgICAqL1xuY29uc3QgY2I9aGFyZGVuKHt0YXJnZXQsbWV0aG9kTmFtZSxib3VuZH0pO1xucmV0dXJuICgvKiAgICAgICAgICAgICAgICAgICAgICAqL2NiKTtcbiB9OyRozY9fb25jZS5tYWtlTWV0aG9kQ2FsbGJhY2sobWFrZU1ldGhvZENhbGxiYWNrKTtcbmhhcmRlbihtYWtlTWV0aG9kQ2FsbGJhY2spO1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgICAgICAgIGlzQ2FsbGJhY2s9KGNhbGxiYWNrKT0+e1xuaWYoIWlzT2JqZWN0KGNhbGxiYWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3R7dGFyZ2V0LG1ldGhvZE5hbWUsYm91bmR9PWNhbGxiYWNrO1xucmV0dXJuKFxuaXNPYmplY3QodGFyZ2V0KSYmKFxubWV0aG9kTmFtZT09PXVuZGVmaW5lZHx8XG50eXBlb2YgbWV0aG9kTmFtZT09PSdzdHJpbmcnfHxcbmlzUGFzc2FibGVTeW1ib2wobWV0aG9kTmFtZSkpJiZcbkFycmF5LmlzQXJyYXkoYm91bmQpKTtcblxuIH07JGjNj19vbmNlLmlzQ2FsbGJhY2soaXNDYWxsYmFjayk7XG5oYXJkZW4oaXNDYWxsYmFjayk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBwcmVwYXJlQXR0ZW51YXRvcj0oXG56b25lLFxubWV0aG9kTmFtZXMsXG57aW50ZXJmYWNlR3VhcmQsdGFnPSdBdHRlbnVhdG9yJ309e30pPT5cbntcbi8qXG5cblxuXG5cblxuICAgKi9cbmNvbnN0IG1ldGhvZHM9LyogICAgICAgICAgICAgICAgICAqL1xuZnJvbUVudHJpZXMoXG5tZXRob2ROYW1lcy5tYXAoKGtleSk9Pntcbi8vXG5pZighaXNQcm9wZXJ0eUtleShrZXkpKXtcbnRocm93IEZhaWwgYGtleSAke3Eoa2V5KX0gaXMgbm90IGEgUHJvcGVydHlLZXlgO1xuIH1cblxuY29uc3QgbT0vKiAgICAgICAgICAgICAgICAgICove1xuLy9cbi8vXG4vKiAgICAgICAgICAgICAgICAgKi9cbltrZXldKC4uLmFyZ3Mpe1xuLy9cbmNvbnN0IGNiPXRoaXMuc3RhdGUuY2JzW2tleV07XG5pZighY2Ipe1xuY29uc3QgZXJyPW1ha2VFcnJvciggYHVuaW1wbGVtZW50ZWQgJHtxKHRhZyl9IG1ldGhvZCAke3Eoa2V5KX1gKTtcbmlmKHRoaXMuc3RhdGUuaXNTeW5jKXtcbnRocm93IGVycjtcbiB9XG5yZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiB9XG5pZihjYi5pc1N5bmMpe1xucmV0dXJuIGNhbGxTeW5jKGNiLC4uLmFyZ3MpO1xuIH1cbnJldHVybiBjYWxsRShjYiwuLi5hcmdzKTtcbiB9fVtcbmtleV07XG5yZXR1cm4gKC8qICAgICAgICAgICAgICAgICovW2tleSxtXSk7XG4gfSkpO1xuXG5cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuY29uc3QgbWFrZUF0dGVudWF0b3I9em9uZS5leG9DbGFzcyhcbnRhZyxcbmludGVyZmFjZUd1YXJkLFxuLypcblxuXG5cblxuICAgICAqL1xuKHtcbnRhcmdldD1udWxsLFxuaXNTeW5jPWZhbHNlLFxub3ZlcnJpZGVzPS8qICAgICAgICAgICAgICAgICAgICAqL3t9fSk9Plxue1xuY29uc3QgY2JzPS8qICAgICAgICAgICAgICAgICAgICAqL3t9O1xuXG5jb25zdCByZW1haW5pbmc9bmV3IFNldChtZXRob2ROYW1lcyk7XG5mb3IoY29uc3Qga2V5IG9mIG93bktleXMob3ZlcnJpZGVzKSl7XG5yZW1haW5pbmcuaGFzKGtleSl8fFxuRmFpbCBgJHtxKHRhZyl9IG92ZXJyaWRlc1ske3Eoa2V5KX1dIG5vdCBhbGxvd2VkIGJ5IG1ldGhvZE5hbWVzYDtcblxucmVtYWluaW5nLmRlbGV0ZShrZXkpO1xuY29uc3QgY2I9b3ZlcnJpZGVzW2tleV07XG5jYj09bnVsbHx8XG5pc0NhbGxiYWNrKGNiKXx8XG5GYWlsIGAke3EodGFnKX0gb3ZlcnJpZGVzWyR7cShrZXkpfV0gaXMgbm90IGEgY2FsbGJhY2s7IGdvdCAke2NifWA7XG5jYnNba2V5XT1jYjtcbiB9XG5mb3IoY29uc3Qga2V5IG9mIHJlbWFpbmluZyl7XG5pZihpc1N5bmMpe1xuY2JzW2tleV09bWFrZVN5bmNNZXRob2RDYWxsYmFjayh0YXJnZXQsa2V5KTtcbiB9ZWxzZXtcbmNic1trZXldPW1ha2VNZXRob2RDYWxsYmFjayh0YXJnZXQsa2V5KTtcbiB9XG4gfVxucmV0dXJuIGhhcmRlbih7Y2JzLGlzU3luY30pO1xuIH0sXG4vKiAgICAgICAgICAgICAgICAgICovbWV0aG9kcyk7XG5cbnJldHVybiBtYWtlQXR0ZW51YXRvcjtcbiB9OyRozY9fb25jZS5wcmVwYXJlQXR0ZW51YXRvcihwcmVwYXJlQXR0ZW51YXRvcik7XG5oYXJkZW4ocHJlcGFyZUF0dGVudWF0b3IpO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3I9KHpvbmUsaW50ZXJmYWNlR3VhcmQsb3B0cz17fSk9PntcbmNvbnN0IG1ldGhvZE5hbWVzPWdldEludGVyZmFjZU1ldGhvZEtleXMoaW50ZXJmYWNlR3VhcmQpO1xuY29uc3QgbWFrZUF0dGVudWF0b3I9cHJlcGFyZUF0dGVudWF0b3Ioem9uZSxtZXRob2ROYW1lcyx7XG4uLi5vcHRzLFxuaW50ZXJmYWNlR3VhcmR9KTtcblxucmV0dXJuICgvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovbWFrZUF0dGVudWF0b3IpO1xuIH07JGjNj19vbmNlLnByZXBhcmVHdWFyZGVkQXR0ZW51YXRvcihwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IpO1xuaGFyZGVuKHByZXBhcmVHdWFyZGVkQXR0ZW51YXRvcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjYWxsU3luYyI6WyJjYWxsU3luYyJdLCJjYWxsRSI6WyJjYWxsRSJdLCJtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2siOlsibWFrZVN5bmNGdW5jdGlvbkNhbGxiYWNrIl0sIm1ha2VGdW5jdGlvbkNhbGxiYWNrIjpbIm1ha2VGdW5jdGlvbkNhbGxiYWNrIl0sIm1ha2VTeW5jTWV0aG9kQ2FsbGJhY2siOlsibWFrZVN5bmNNZXRob2RDYWxsYmFjayJdLCJtYWtlTWV0aG9kQ2FsbGJhY2siOlsibWFrZU1ldGhvZENhbGxiYWNrIl0sImlzQ2FsbGJhY2siOlsiaXNDYWxsYmFjayJdLCJwcmVwYXJlQXR0ZW51YXRvciI6WyJwcmVwYXJlQXR0ZW51YXRvciJdLCJwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IiOlsicHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHPQXuH8BQAA/AUAACsAAABAYWdvcmljL2ludGVybmFsLXYwLjQuMC11MTkuMi9zcmMvY29uZmlnLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJCcmlkZ2VJZCIsIkNvc21vc0luaXRLZXlUb0JyaWRnZUlkIiwiVkJhbmtBY2NvdW50IiwiV2FsbGV0TmFtZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjNj19pbXBvcnRzKFtdKTsgICAvL1xuLy9cblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuICovXG5jb25zdCAgICAgICAgQnJpZGdlSWQ9LyogICAgICAgICAgICAgICAgKi97XG5CQU5LOidiYW5rJyxcbkNPUkU6J2NvcmUnLFxuRElCQzonZGliYycsXG5TVE9SQUdFOidzdG9yYWdlJyxcblBST1ZJU0lPTjoncHJvdmlzaW9uJyxcblBST1ZJU0lPTl9TTUFSVF9XQUxMRVQ6J3Byb3Zpc2lvbldhbGxldCcsXG5WTE9DQUxDSEFJTjondmxvY2FsY2hhaW4nLFxuVlRSQU5TRkVSOid2dHJhbnNmZXInLFxuV0FMTEVUOid3YWxsZXQnfTskaM2PX29uY2UuQnJpZGdlSWQoQnJpZGdlSWQpO1xuXG5oYXJkZW4oQnJpZGdlSWQpO1xuXG5jb25zdCAgICAgICAgQ29zbW9zSW5pdEtleVRvQnJpZGdlSWQ9e1xudmJhbmtQb3J0OkJyaWRnZUlkLkJBTkssXG52aWJjUG9ydDpCcmlkZ2VJZC5ESUJDfTskaM2PX29uY2UuQ29zbW9zSW5pdEtleVRvQnJpZGdlSWQoQ29zbW9zSW5pdEtleVRvQnJpZGdlSWQpO1xuXG5cbmNvbnN0ICAgICAgICBXYWxsZXROYW1lPS8qICAgICAgICAgICAgICAgICove1xuZGVwb3NpdEZhY2V0OidkZXBvc2l0RmFjZXQnfTskaM2PX29uY2UuV2FsbGV0TmFtZShXYWxsZXROYW1lKTtcblxuaGFyZGVuKFdhbGxldE5hbWUpO1xuXG4vL1xuY29uc3QgICAgICAgIFZCYW5rQWNjb3VudD0vKiAgICAgICAgICAgICAgICAqL3tcbnJlc2VydmU6e1xubW9kdWxlOid2YmFuay9yZXNlcnZlJyxcbmFkZHJlc3M6J2Fnb3JpYzFhZTBsbXR6bGdyY25sYTl4amtwYWFycTVkNWRmZXo2M2gzbnVjbCd9LFxuXG5wcm92aXNpb246e1xubW9kdWxlOid2YmFuay9wcm92aXNpb24nLFxuYWRkcmVzczonYWdvcmljMW1lZ3p5dGc2NWN5cmd6czZmdnp4Z3JjcXZ3d2w3dWdwdDYyMzQ2J319OyRozY9fb25jZS5WQmFua0FjY291bnQoVkJhbmtBY2NvdW50KTtcblxuXG5oYXJkZW4oVkJhbmtBY2NvdW50KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkJyaWRnZUlkIjpbIkJyaWRnZUlkIl0sIkNvc21vc0luaXRLZXlUb0JyaWRnZUlkIjpbIkNvc21vc0luaXRLZXlUb0JyaWRnZUlkIl0sIldhbGxldE5hbWUiOlsiV2FsbGV0TmFtZSJdLCJWQmFua0FjY291bnQiOlsiVkJhbmtBY2NvdW50Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAF+DFqp3BAAAdwQAACoAAABAYWdvcmljL2ludGVybmFsLXYwLjQuMC11MTkuMi9zcmMvZGVidWcuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1ha2VUcmFjZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRozY9faW1wb3J0cyhbXSk7ICAgLy9cblxubGV0IGRlYnVnSW5zdGFuY2U9MTtcblxuLypcblxuXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlVHJhY2VyPShuYW1lLGVuYWJsZT10cnVlKT0+e1xuZGVidWdJbnN0YW5jZSs9MTtcbmxldCBkZWJ1Z0NvdW50PTE7XG5jb25zdCBrZXk9IGAtLS0tLSAke25hbWV9LiR7ZGVidWdJbnN0YW5jZX0gYDtcbi8vXG5zd2l0Y2goZW5hYmxlKXtcbmNhc2UgZmFsc2U6e1xuY29uc3QgbG9nRGlzYWJsZWQ9KC4uLl9hcmdzKT0+eyB9O1xucmV0dXJuIGxvZ0Rpc2FibGVkO1xuIH1cbmNhc2UndmVyYm9zZSc6e1xuY29uc3QgaW5mb1RpY2s9KG9wdExvZywuLi5hcmdzKT0+e1xuaWYob3B0TG9nLmxvZyl7XG5jb25zb2xlLmluZm8oa2V5LGRlYnVnQ291bnQrPTEsLi4uYXJncyk7XG4gfWVsc2V7XG5jb25zb2xlLmluZm8oa2V5LGRlYnVnQ291bnQrPTEsb3B0TG9nLC4uLmFyZ3MpO1xuIH1cbiB9O1xucmV0dXJuIGluZm9UaWNrO1xuIH1cbmRlZmF1bHQ6e1xuY29uc3QgZGVidWdUaWNrPShvcHRMb2csLi4uYXJncyk9PntcbmlmKG9wdExvZy5sb2cpe1xub3B0TG9nLmxvZyhrZXksZGVidWdDb3VudCs9MSwuLi5hcmdzKTtcbiB9ZWxzZXtcbmNvbnNvbGUuaW5mbyhrZXksZGVidWdDb3VudCs9MSxvcHRMb2csLi4uYXJncyk7XG4gfVxuIH07XG5yZXR1cm4gZGVidWdUaWNrO1xuIH19XG5cbiB9OyRozY9fb25jZS5tYWtlVHJhY2VyKG1ha2VUcmFjZXIpO1xuaGFyZGVuKG1ha2VUcmFjZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVRyYWNlciI6WyJtYWtlVHJhY2VyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANOJob+9AgAAvQIAACsAAABAYWdvcmljL2ludGVybmFsLXYwLjQuMC11MTkuMi9zcmMvZXJyb3JzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIk5vbk51bGxpc2giXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBxOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsIFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBOb25OdWxsaXNoPSh2YWwsb3B0RGV0YWlscz0gYHVuZXhwZWN0ZWQgJHtxKHZhbCl9YCk9PntcbmlmKHZhbCE9bnVsbCl7XG4vL1xucmV0dXJuIHZhbDtcbiB9XG5hc3NlcnQuZmFpbChvcHREZXRhaWxzKTtcbiB9OyRozY9fb25jZS5Ob25OdWxsaXNoKE5vbk51bGxpc2gpO1xuaGFyZGVuKE5vbk51bGxpc2gpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiTm9uTnVsbGlzaCI6WyJOb25OdWxsaXNoIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACHQpXKiBQAAogUAACoAAABAYWdvcmljL2ludGVybmFsLXYwLjQuMC11MTkuMi9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9jb25maWcuanMiLCIuL2RlYnVnLmpzIiwiLi9lcnJvcnMuanMiLCIuL2pzLXV0aWxzLmpzIiwiLi9tYXJzaGFsLmpzIiwiLi9tZXRob2QtdG9vbHMuanMiLCIuL3Nlcy11dGlscy5qcyIsIi4vdHlwZUNoZWNrLmpzIiwiLi90eXBlR3VhcmRzLmpzIiwiLi90eXBlcy1pbmRleC5qcyIsIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIiwiQGVuZG8vY29tbW9uL29iamVjdC1tZXRhLW1hcC5qcyIsIkBlbmRvL2NvbW1vbi9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzIl0sImV4cG9ydHMiOltudWxsLG51bGwsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbIi4vY29uZmlnLmpzIiwiLi9kZWJ1Zy5qcyIsIi4vZXJyb3JzLmpzIiwiLi9qcy11dGlscy5qcyIsIi4vbWV0aG9kLXRvb2xzLmpzIiwiLi9zZXMtdXRpbHMuanMiLCIuL3R5cGVDaGVjay5qcyIsIi4vdHlwZUd1YXJkcy5qcyIsIi4vdHlwZXMtaW5kZXguanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRozY9faW1wb3J0cyhbW1wiLi9jb25maWcuanNcIiwgW11dLFtcIi4vZGVidWcuanNcIiwgW11dLFtcIi4vZXJyb3JzLmpzXCIsIFtdXSxbXCIuL2pzLXV0aWxzLmpzXCIsIFtdXSxbXCIuL21hcnNoYWwuanNcIiwgW11dLFtcIi4vbWV0aG9kLXRvb2xzLmpzXCIsIFtdXSxbXCIuL3Nlcy11dGlscy5qc1wiLCBbXV0sW1wiLi90eXBlQ2hlY2suanNcIiwgW11dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbXV0sW1wiLi90eXBlcy1pbmRleC5qc1wiLCBbXV0sW1wiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanNcIiwgW11dLFtcIkBlbmRvL2NvbW1vbi9vYmplY3QtbWV0YS1tYXAuanNcIiwgW11dLFtcIkBlbmRvL2NvbW1vbi9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzXCIsIFtdXV0pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9tYXJzaGFsLmpzIjpbWyJwdXJlRGF0YU1hcnNoYWxsZXIiLCJwdXJlRGF0YU1hcnNoYWxsZXIiXV0sIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIjpbWyJvYmplY3RNYXAiLCJvYmplY3RNYXAiXV0sIkBlbmRvL2NvbW1vbi9vYmplY3QtbWV0YS1tYXAuanMiOltbIm9iamVjdE1ldGFNYXAiLCJvYmplY3RNZXRhTWFwIl1dLCJAZW5kby9jb21tb24vZnJvbS11bmlxdWUtZW50cmllcy5qcyI6W1siZnJvbVVuaXF1ZUVudHJpZXMiLCJmcm9tVW5pcXVlRW50cmllcyJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAlCl+YfAJAADwCQAALQAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuNC4wLXUxOS4yL3NyYy9qcy11dGlscy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiZGVlcENvcHlKc29uYWJsZSIsImRlZXBNYXBPYmplY3QiLCJsb2dMZXZlbHMiLCJtYWtlTWVhc3VyZVNlY29uZHMiLCJvYmplY3RNYXBNdXRhYmxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaM2PX2ltcG9ydHMoW10pOyAgIC8vXG4vL1xuLypcblxuXG4gKi9cblxuY29uc3QgICAgICAgIGxvZ0xldmVscz0vKiAgICAgICAgICAgICAgICAqL1tcbidkZWJ1ZycsXG4nbG9nJyxcbidpbmZvJyxcbid3YXJuJyxcbidlcnJvciddOyRozY9fb25jZS5sb2dMZXZlbHMobG9nTGV2ZWxzKTtcblxuT2JqZWN0LmZyZWV6ZShsb2dMZXZlbHMpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdHtlbnRyaWVzLGZyb21FbnRyaWVzfT1PYmplY3Q7XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGRlZXBDb3B5SnNvbmFibGU9KHZhbHVlKT0+SlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuXG4vKlxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5kZWVwQ29weUpzb25hYmxlKGRlZXBDb3B5SnNvbmFibGUpO1xuY29uc3QgZGVlcE1hcE9iamVjdEludGVybmFsPSh2YWx1ZSxuYW1lLGNvbnRhaW5lcixtYXBwZXIpPT57XG5pZihjb250YWluZXImJnR5cGVvZiBuYW1lPT09J3N0cmluZycpe1xuY29uc3QgbWFwcGVkPW1hcHBlcih2YWx1ZSxuYW1lLGNvbnRhaW5lcik7XG5pZihtYXBwZWQhPT12YWx1ZSl7XG5yZXR1cm4gbWFwcGVkO1xuIH1cbiB9XG5cbmlmKHR5cGVvZiB2YWx1ZSE9PSdvYmplY3QnfHwhdmFsdWUpe1xucmV0dXJuIHZhbHVlO1xuIH1cblxubGV0IHdhc01hcHBlZD1mYWxzZTtcbmNvbnN0IG1hcHBlZEVudHJpZXM9T2JqZWN0LmVudHJpZXModmFsdWUpLm1hcCgoW2lubmVyTmFtZSxpbm5lclZhbHVlXSk9PntcbmNvbnN0IG1hcHBlZElubmVyVmFsdWU9ZGVlcE1hcE9iamVjdEludGVybmFsKFxuaW5uZXJWYWx1ZSxcbmlubmVyTmFtZSxcbnZhbHVlLFxubWFwcGVyKTtcblxud2FzTWFwcGVkfHw9bWFwcGVkSW5uZXJWYWx1ZSE9PWlubmVyVmFsdWU7XG5yZXR1cm5baW5uZXJOYW1lLG1hcHBlZElubmVyVmFsdWVdO1xuIH0pO1xuXG5yZXR1cm4gd2FzTWFwcGVkP09iamVjdC5mcm9tRW50cmllcyhtYXBwZWRFbnRyaWVzKTp2YWx1ZTtcbiB9O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGRlZXBNYXBPYmplY3Q9KG9iaixtYXBwZXIpPT5cbmRlZXBNYXBPYmplY3RJbnRlcm5hbChvYmosdW5kZWZpbmVkLHVuZGVmaW5lZCxtYXBwZXIpO1xuXG4vKlxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5kZWVwTWFwT2JqZWN0KGRlZXBNYXBPYmplY3QpO1xuY29uc3QgICAgICAgIG9iamVjdE1hcE11dGFibGU9KG9iaixtYXBGbik9PntcbmNvbnN0IG5ld0VudHJpZXM9ZW50cmllcyhvYmopLm1hcCgoW2ssdl0pPT5bayxtYXBGbih2LGspXSk7XG5yZXR1cm4gKC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL2Zyb21FbnRyaWVzKG5ld0VudHJpZXMpKTtcbiB9O1xuXG4vKlxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5vYmplY3RNYXBNdXRhYmxlKG9iamVjdE1hcE11dGFibGUpO1xuY29uc3QgICAgICAgIG1ha2VNZWFzdXJlU2Vjb25kcz0oY3VycmVudFRpbWVNaWxsaXNlYyk9Pntcbi8qXG5cblxuXG4gICAqL1xuY29uc3QgbWVhc3VyZVNlY29uZHM9YXN5bmMoZm4pPT57XG5jb25zdCB0MD1jdXJyZW50VGltZU1pbGxpc2VjKCk7XG5jb25zdCByZXN1bHQ9YXdhaXQgZm4oKTtcbmNvbnN0IGR1cmF0aW9uTWlsbGlzZWM9Y3VycmVudFRpbWVNaWxsaXNlYygpLXQwO1xucmV0dXJue3Jlc3VsdCxkdXJhdGlvbjpkdXJhdGlvbk1pbGxpc2VjLzEwMDB9O1xuIH07XG5yZXR1cm4gbWVhc3VyZVNlY29uZHM7XG4gfTskaM2PX29uY2UubWFrZU1lYXN1cmVTZWNvbmRzKG1ha2VNZWFzdXJlU2Vjb25kcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJsb2dMZXZlbHMiOlsibG9nTGV2ZWxzIl0sImRlZXBDb3B5SnNvbmFibGUiOlsiZGVlcENvcHlKc29uYWJsZSJdLCJkZWVwTWFwT2JqZWN0IjpbImRlZXBNYXBPYmplY3QiXSwib2JqZWN0TWFwTXV0YWJsZSI6WyJvYmplY3RNYXBNdXRhYmxlIl0sIm1ha2VNZWFzdXJlU2Vjb25kcyI6WyJtYWtlTWVhc3VyZVNlY29uZHMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAHwlK4QIWAAACFgAANQAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuNC4wLXUxOS4yL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2ZhciIsIkBlbmRvL3BhdHRlcm5zIiwiQGFnb3JpYy9iYXNlLXpvbmUvaGVhcC5qcyIsIi4vY2FsbGJhY2suanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRDYXBEYXRhIiwiYXNzZXJ0UGF0aFNlZ21lbnQiLCJpc1N0cmVhbUNlbGwiLCJtYWtlQ2hhaW5TdG9yYWdlUm9vdCIsIm1ha2VTZXJpYWxpemVUb1N0b3JhZ2UiLCJtYWtlU3RvcmFnZU5vZGVDaGlsZCIsInByZXBhcmVDaGFpblN0b3JhZ2VOb2RlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgRmFpbCxFLEZhcixNLG1ha2VIZWFwWm9uZSxjYjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLCBbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsIFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV0sW1wiRmFyXCIsIFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsIFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2Jhc2Utem9uZS9oZWFwLmpzXCIsIFtbXCJtYWtlSGVhcFpvbmVcIiwgWyRozY9fYSA9PiAobWFrZUhlYXBab25lID0gJGjNj19hKV1dXV0sW1wiLi9jYWxsYmFjay5qc1wiLCBbW1wiKlwiLCBbJGjNj19hID0+IChjYiA9ICRozY9fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1ha2VDaGFpblN0b3JhZ2VSb290LCAnbmFtZScsIHt2YWx1ZTogXCJtYWtlQ2hhaW5TdG9yYWdlUm9vdFwifSk7JGjNj19vbmNlLm1ha2VDaGFpblN0b3JhZ2VSb290KG1ha2VDaGFpblN0b3JhZ2VSb290KTtPYmplY3QuZGVmaW5lUHJvcGVydHkobWFrZVN0b3JhZ2VOb2RlQ2hpbGQsICduYW1lJywge3ZhbHVlOiBcIm1ha2VTdG9yYWdlTm9kZUNoaWxkXCJ9KTskaM2PX29uY2UubWFrZVN0b3JhZ2VOb2RlQ2hpbGQobWFrZVN0b3JhZ2VOb2RlQ2hpbGQpOyAgIFxuXG5cblxuXG5cblxuXG4vKlxuXG5cbiAqL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbmNvbnN0IENoYWluU3RvcmFnZU5vZGVJPU0uaW50ZXJmYWNlKCdTdG9yYWdlTm9kZScse1xuc2V0VmFsdWU6TS5jYWxsV2hlbihNLnN0cmluZygpKS5yZXR1cm5zKCksXG5nZXRQYXRoOk0uY2FsbCgpLnJldHVybnMoTS5zdHJpbmcoKSksXG5nZXRTdG9yZUtleTpNLmNhbGxXaGVuKCkucmV0dXJucyhNLnJlY29yZCgpKSxcbm1ha2VDaGlsZE5vZGU6TS5jYWxsKE0uc3RyaW5nKCkpLlxub3B0aW9uYWwoTS5zcGxpdFJlY29yZCh7fSx7c2VxdWVuY2U6TS5ib29sZWFuKCl9LHt9KSkuXG5yZXR1cm5zKE0ucmVtb3RhYmxlKCdTdG9yYWdlTm9kZScpKX0pO1xuXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBpc1N0cmVhbUNlbGw9KGNlbGwpPT5cbmNlbGwmJlxudHlwZW9mIGNlbGw9PT0nb2JqZWN0JyYmXG5BcnJheS5pc0FycmF5KGNlbGwudmFsdWVzKSYmXG50eXBlb2YgY2VsbC5ibG9ja0hlaWdodD09PSdzdHJpbmcnJiZcbi9eMCR8XlsxLTldWzAtOV0qJC8udGVzdChjZWxsLmJsb2NrSGVpZ2h0KTskaM2PX29uY2UuaXNTdHJlYW1DZWxsKGlzU3RyZWFtQ2VsbCk7XG5oYXJkZW4oaXNTdHJlYW1DZWxsKTtcblxuLy9cbi8vXG4vKlxuXG5cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydENhcERhdGE9KGRhdGEpPT57XG5hc3NlcnQudHlwZW9mKGRhdGEsJ29iamVjdCcpO1xuYXNzZXJ0KGRhdGEpO1xuYXNzZXJ0LnR5cGVvZihkYXRhLmJvZHksJ3N0cmluZycpO1xuYXNzZXJ0KEFycmF5LmlzQXJyYXkoZGF0YS5zbG90cykpO1xuLy9cbiB9OyRozY9fb25jZS5hc3NlcnRDYXBEYXRhKGFzc2VydENhcERhdGEpO1xuaGFyZGVuKGFzc2VydENhcERhdGEpO1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuY29uc3QgcGF0aFNlZ21lbnRQYXR0ZXJuPS9eW2EtekEtWjAtOV8tXXsxLDEwMH0kLztcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgICAgICAgIGFzc2VydFBhdGhTZWdtZW50PShuYW1lKT0+e1xucGF0aFNlZ21lbnRQYXR0ZXJuLnRlc3QobmFtZSl8fFxuRmFpbCBgUGF0aCBzZWdtZW50IG5hbWVzIG11c3QgY29uc2lzdCBvZiAxIHRvIDEwMCBjaGFyYWN0ZXJzIGxpbWl0ZWQgdG8gQVNDSUkgYWxwaGFudW1lcmljcywgdW5kZXJzY29yZXMsIGFuZC9vciBkYXNoZXM6ICR7bmFtZX1gO1xuIH07JGjNj19vbmNlLmFzc2VydFBhdGhTZWdtZW50KGFzc2VydFBhdGhTZWdtZW50KTtcbmhhcmRlbihhc3NlcnRQYXRoU2VnbWVudCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cbiAqL1xuY29uc3QgICAgICAgIHByZXBhcmVDaGFpblN0b3JhZ2VOb2RlPSh6b25lKT0+e1xuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuY29uc3QgbWFrZUNoYWluU3RvcmFnZU5vZGU9em9uZS5leG9DbGFzcyhcbidDaGFpblN0b3JhZ2VOb2RlJyxcbkNoYWluU3RvcmFnZU5vZGVJLFxuLypcblxuXG5cblxuXG5cbiAgICAgKi9cbihtZXNzZW5nZXIscGF0aCx7c2VxdWVuY2U9ZmFsc2V9PXt9KT0+e1xuYXNzZXJ0LnR5cGVvZihwYXRoLCdzdHJpbmcnKTtcbmFzc2VydC50eXBlb2Yoc2VxdWVuY2UsJ2Jvb2xlYW4nKTtcbnJldHVybiBoYXJkZW4oe3BhdGgsbWVzc2VuZ2VyLHNlcXVlbmNlfSk7XG4gfSxcbntcbmdldFBhdGgoKXtcbnJldHVybiB0aGlzLnN0YXRlLnBhdGg7XG4gfSxcbi8qXG5cblxuICAgICAgICovXG4gICAgICBhc3luYyBnZXRTdG9yZUtleSgpe1xuY29uc3R7cGF0aCxtZXNzZW5nZXJ9PXRoaXMuc3RhdGU7XG5yZXR1cm4gY2IuY2FsbEUobWVzc2VuZ2VyLHtcbm1ldGhvZDonZ2V0U3RvcmVLZXknLFxuYXJnczpbcGF0aF19KTtcblxuIH0sXG4vKlxuXG5cblxuXG4gICAgICAgKi9cbm1ha2VDaGlsZE5vZGUobmFtZSxjaGlsZE5vZGVPcHRpb25zPXt9KXtcbmNvbnN0e3NlcXVlbmNlLHBhdGgsbWVzc2VuZ2VyfT10aGlzLnN0YXRlO1xuYXNzZXJ0UGF0aFNlZ21lbnQobmFtZSk7XG5jb25zdCBtZXJnZWRPcHRpb25zPXtzZXF1ZW5jZSwuLi5jaGlsZE5vZGVPcHRpb25zfTtcbnJldHVybiBtYWtlQ2hhaW5TdG9yYWdlTm9kZShcbm1lc3NlbmdlcixcbiBgJHtwYXRofS4ke25hbWV9YCxcbm1lcmdlZE9wdGlvbnMpO1xuXG4gfSxcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICBhc3luYyBzZXRWYWx1ZSh2YWx1ZSl7XG5jb25zdHtzZXF1ZW5jZSxwYXRoLG1lc3Nlbmdlcn09dGhpcy5zdGF0ZTtcbmFzc2VydC50eXBlb2YodmFsdWUsJ3N0cmluZycpO1xuLyogICAgICAgICAgICAgICAgICAgICAgICovXG5sZXQgZW50cnk7XG5pZighc2VxdWVuY2UmJiF2YWx1ZSl7XG5lbnRyeT1bcGF0aF07XG4gfWVsc2V7XG5lbnRyeT1bcGF0aCx2YWx1ZV07XG4gfVxuYXdhaXQgY2IuY2FsbEUobWVzc2VuZ2VyLHtcbm1ldGhvZDpzZXF1ZW5jZT8nYXBwZW5kJzonc2V0JyxcbmFyZ3M6W2VudHJ5XX0pO1xuXG4gfVxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbn0pO1xuXG5yZXR1cm4gbWFrZUNoYWluU3RvcmFnZU5vZGU7XG4gfTskaM2PX29uY2UucHJlcGFyZUNoYWluU3RvcmFnZU5vZGUocHJlcGFyZUNoYWluU3RvcmFnZU5vZGUpO1xuXG5jb25zdCBtYWtlSGVhcENoYWluU3RvcmFnZU5vZGU9cHJlcGFyZUNoYWluU3RvcmFnZU5vZGUobWFrZUhlYXBab25lKCkpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuZnVuY3Rpb24gICAgICAgIG1ha2VDaGFpblN0b3JhZ2VSb290KFxuaGFuZGxlU3RvcmFnZU1lc3NhZ2UsXG5yb290UGF0aCxcbnJvb3RPcHRpb25zPXt9KVxue1xuY29uc3QgbWVzc2VuZ2VyPWNiLm1ha2VGdW5jdGlvbkNhbGxiYWNrKGhhbmRsZVN0b3JhZ2VNZXNzYWdlKTtcblxuLy9cbmNvbnN0IHJvb3ROb2RlPW1ha2VIZWFwQ2hhaW5TdG9yYWdlTm9kZShtZXNzZW5nZXIscm9vdFBhdGgscm9vdE9wdGlvbnMpO1xucmV0dXJuIHJvb3ROb2RlO1xuIH1cblxuLypcblxuXG4gKi9cbmNvbnN0IG1ha2VOdWxsU3RvcmFnZU5vZGU9KCk9Pntcbi8vXG5yZXR1cm4gbWFrZUNoYWluU3RvcmFnZVJvb3QoXG5GYXIoJ051bGxNZXNzZW5nZXInLCgpPT5udWxsKSxcbidudWxsJyk7XG5cbiB9O1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uICAgICAgICBtYWtlU3RvcmFnZU5vZGVDaGlsZChzdG9yYWdlTm9kZVJlZixjaGlsZE5hbWUpe1xuY29uc3QgZXhpc3RpbmdTdG9yYWdlTm9kZT1hd2FpdCBzdG9yYWdlTm9kZVJlZjtcbmNvbnN0IHN0b3JhZ2VOb2RlPWV4aXN0aW5nU3RvcmFnZU5vZGV8fG1ha2VOdWxsU3RvcmFnZU5vZGUoKTtcbnJldHVybiBFKHN0b3JhZ2VOb2RlKS5tYWtlQ2hpbGROb2RlKGNoaWxkTmFtZSk7XG4gfVxuaGFyZGVuKG1ha2VTdG9yYWdlTm9kZUNoaWxkKTtcblxuLy9cbi8qXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlU2VyaWFsaXplVG9TdG9yYWdlPShzdG9yYWdlTm9kZSxtYXJzaGFsbGVyKT0+e1xucmV0dXJuIGFzeW5jKHZhbHVlKT0+e1xuY29uc3QgbWFyc2hhbGxlZD1hd2FpdCBFKG1hcnNoYWxsZXIpLnRvQ2FwRGF0YSh2YWx1ZSk7XG5jb25zdCBzZXJpYWxpemVkPUpTT04uc3RyaW5naWZ5KG1hcnNoYWxsZWQpO1xucmV0dXJuIEUoc3RvcmFnZU5vZGUpLnNldFZhbHVlKHNlcmlhbGl6ZWQpO1xuIH07XG4gfTskaM2PX29uY2UubWFrZVNlcmlhbGl6ZVRvU3RvcmFnZShtYWtlU2VyaWFsaXplVG9TdG9yYWdlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzU3RyZWFtQ2VsbCI6WyJpc1N0cmVhbUNlbGwiXSwiYXNzZXJ0Q2FwRGF0YSI6WyJhc3NlcnRDYXBEYXRhIl0sImFzc2VydFBhdGhTZWdtZW50IjpbImFzc2VydFBhdGhTZWdtZW50Il0sInByZXBhcmVDaGFpblN0b3JhZ2VOb2RlIjpbInByZXBhcmVDaGFpblN0b3JhZ2VOb2RlIl0sIm1ha2VDaGFpblN0b3JhZ2VSb290IjpbIm1ha2VDaGFpblN0b3JhZ2VSb290Il0sIm1ha2VTdG9yYWdlTm9kZUNoaWxkIjpbIm1ha2VTdG9yYWdlTm9kZUNoaWxkIl0sIm1ha2VTZXJpYWxpemVUb1N0b3JhZ2UiOlsibWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADCYop9QBAAAEAQAAAsAAAAQGFnb3JpYy9pbnRlcm5hbC12MC40LjAtdTE5LjIvc3JjL21hcnNoYWwuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZmFyIiwiQGVuZG8vbWFyc2hhbCIsIi4vbGliLWNoYWluU3RvcmFnZS5qcyJdLCJleHBvcnRzIjpbImJvYXJkU2xvdHRpbmdNYXJzaGFsbGVyIiwibWFrZUJvYXJkUmVtb3RlIiwibWFrZUhpc3RvcnlSZXZpdmVyIiwicHVyZURhdGFNYXJzaGFsbGVyIiwic2xvdFRvQm9hcmRSZW1vdGUiLCJ1bm1hcnNoYWxGcm9tVnN0b3JhZ2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBGYWlsLEZhcixtYWtlTWFyc2hhbCxpc1N0cmVhbUNlbGw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIiwgWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRmFyXCIsIFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIm1ha2VNYXJzaGFsXCIsIFskaM2PX2EgPT4gKG1ha2VNYXJzaGFsID0gJGjNj19hKV1dXV0sW1wiLi9saWItY2hhaW5TdG9yYWdlLmpzXCIsIFtbXCJpc1N0cmVhbUNlbGxcIiwgWyRozY9fYSA9PiAoaXNTdHJlYW1DZWxsID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuXG4vKlxuXG5cblxuXG4gKi9cblxuLypcblxuXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQm9hcmRSZW1vdGU9KHtib2FyZElkLGlmYWNlfSk9PntcbmNvbnN0IG5vbmFsbGVnZWQ9aWZhY2U/aWZhY2UucmVwbGFjZSgvXkFsbGVnZWQ6IC8sJycpOicnO1xucmV0dXJuIEZhciggYEJvYXJkUmVtb3RlJHtub25hbGxlZ2VkfWAse2dldEJvYXJkSWQ6KCk9PmJvYXJkSWR9KTtcbiB9O1xuXG4vKlxuXG5cbiAqLyRozY9fb25jZS5tYWtlQm9hcmRSZW1vdGUobWFrZUJvYXJkUmVtb3RlKTtcbmNvbnN0ICAgICAgICBzbG90VG9Cb2FyZFJlbW90ZT0oYm9hcmRJZCxpZmFjZSk9PlxubWFrZUJvYXJkUmVtb3RlKHtib2FyZElkLGlmYWNlfSk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2Uuc2xvdFRvQm9hcmRSZW1vdGUoc2xvdFRvQm9hcmRSZW1vdGUpO1xuY29uc3QgYm9hcmRWYWxUb1Nsb3Q9KHZhbCk9PntcbmlmKCdnZXRCb2FyZElkJ2luIHZhbCl7XG5yZXR1cm4gdmFsLmdldEJvYXJkSWQoKTtcbiB9XG50aHJvdyBGYWlsIGB1bmtub3duIG9iaiBpbiBib2FyZFNsb3R0aW5nTWFyc2hhbGxlci52YWxUb1Nsb3QgJHt2YWx9YDtcbiB9O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgYm9hcmRTbG90dGluZ01hcnNoYWxsZXI9KHNsb3RUb1ZhbD11bmRlZmluZWQpPT57XG5yZXR1cm4gbWFrZU1hcnNoYWwoYm9hcmRWYWxUb1Nsb3Qsc2xvdFRvVmFsLHtcbnNlcmlhbGl6ZUJvZHlGb3JtYXQ6J3NtYWxsY2Fwcyd9KTtcblxuIH07XG5cbi8vXG4vL1xuLypcblxuXG4gKi8kaM2PX29uY2UuYm9hcmRTbG90dGluZ01hcnNoYWxsZXIoYm9hcmRTbG90dGluZ01hcnNoYWxsZXIpO1xuY29uc3QgYXNzZXJ0Q2FwRGF0YT0oZGF0YSk9PntcbmFzc2VydC50eXBlb2YoZGF0YSwnb2JqZWN0Jyk7XG5hc3NlcnQoZGF0YSk7XG5hc3NlcnQudHlwZW9mKGRhdGEuYm9keSwnc3RyaW5nJyk7XG5hc3NlcnQoQXJyYXkuaXNBcnJheShkYXRhLnNsb3RzKSk7XG4vL1xuIH07XG5oYXJkZW4oYXNzZXJ0Q2FwRGF0YSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIHVubWFyc2hhbEZyb21Wc3RvcmFnZT0oZGF0YSxrZXksZnJvbUNhcERhdGEsaW5kZXgpPT57XG5jb25zdCBzZXJpYWxpemVkPWRhdGEuZ2V0KGtleSl8fEZhaWwgYG5vIGRhdGEgZm9yICR7a2V5fWA7XG5hc3NlcnQudHlwZW9mKHNlcmlhbGl6ZWQsJ3N0cmluZycpO1xuYXNzZXJ0LnR5cGVvZihpbmRleCwnbnVtYmVyJyk7XG5cbmNvbnN0IHN0cmVhbUNlbGw9SlNPTi5wYXJzZShzZXJpYWxpemVkKTtcbmlmKCFpc1N0cmVhbUNlbGwoc3RyZWFtQ2VsbCkpe1xudGhyb3cgRmFpbCBgbm90IGEgU3RyZWFtQ2VsbDogJHtzdHJlYW1DZWxsfWA7XG4gfVxuXG5jb25zdHt2YWx1ZXN9PXN0cmVhbUNlbGw7XG52YWx1ZXMubGVuZ3RoPjB8fEZhaWwgYG5vIFN0cmVhbUNlbGwgdmFsdWVzOiAke3N0cmVhbUNlbGx9YDtcblxuY29uc3QgbWFyc2hhbGxlZD12YWx1ZXMuYXQoaW5kZXgpO1xuYXNzZXJ0LnR5cGVvZihtYXJzaGFsbGVkLCdzdHJpbmcnKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBjYXBEYXRhPWhhcmRlbihKU09OLnBhcnNlKG1hcnNoYWxsZWQpKTtcbmFzc2VydENhcERhdGEoY2FwRGF0YSk7XG5cbmNvbnN0IHVubWFyc2hhbGxlZD1mcm9tQ2FwRGF0YShjYXBEYXRhKTtcbnJldHVybiB1bm1hcnNoYWxsZWQ7XG4gfTskaM2PX29uY2UudW5tYXJzaGFsRnJvbVZzdG9yYWdlKHVubWFyc2hhbEZyb21Wc3RvcmFnZSk7XG5oYXJkZW4odW5tYXJzaGFsRnJvbVZzdG9yYWdlKTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZUhpc3RvcnlSZXZpdmVyPShlbnRyaWVzLHNsb3RUb1ZhbD11bmRlZmluZWQpPT57XG5jb25zdCBib2FyZD1ib2FyZFNsb3R0aW5nTWFyc2hhbGxlcihzbG90VG9WYWwpO1xuY29uc3QgdnNNYXA9bmV3IE1hcChlbnRyaWVzKTtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgZnJvbUNhcERhdGE9KC4uLmFyZ3MpPT5cblJlZmxlY3QuYXBwbHkoYm9hcmQuZnJvbUNhcERhdGEsYm9hcmQsYXJncyk7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBnZXRJdGVtPShrZXkpPT51bm1hcnNoYWxGcm9tVnN0b3JhZ2UodnNNYXAsa2V5LGZyb21DYXBEYXRhLC0xKTtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGNoaWxkcmVuPShwcmVmaXgpPT57XG5wcmVmaXguZW5kc1dpdGgoJy4nKXx8RmFpbCBgcHJlZml4IG11c3QgZW5kIHdpdGggJy4nYDtcbnJldHVybiBoYXJkZW4oW1xuLi4ubmV3IFNldChcbmVudHJpZXMuXG5tYXAoKFtrLF9dKT0+aykuXG5maWx0ZXIoKGspPT5rLnN0YXJ0c1dpdGgocHJlZml4KSkuXG5tYXAoKGspPT5rLnNsaWNlKHByZWZpeC5sZW5ndGgpLnNwbGl0KCcuJylbMF0pKV0pO1xuXG5cbiB9O1xuLyogICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGhhcz0oayk9PnZzTWFwLmdldChrKSE9PXVuZGVmaW5lZDtcblxucmV0dXJuIGhhcmRlbih7Z2V0SXRlbSxjaGlsZHJlbixoYXN9KTtcbiB9O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UubWFrZUhpc3RvcnlSZXZpdmVyKG1ha2VIaXN0b3J5UmV2aXZlcik7XG5jb25zdCByZWplY3RPQ2FwPShjYXApPT5GYWlsIGAke2NhcH0gaXMgbm90IHB1cmUgZGF0YWA7XG5jb25zdCAgICAgICAgcHVyZURhdGFNYXJzaGFsbGVyPW1ha2VNYXJzaGFsKHJlamVjdE9DYXAscmVqZWN0T0NhcCx7XG5zZXJpYWxpemVCb2R5Rm9ybWF0OidzbWFsbGNhcHMnfSk7JGjNj19vbmNlLnB1cmVEYXRhTWFyc2hhbGxlcihwdXJlRGF0YU1hcnNoYWxsZXIpO1xuXG5oYXJkZW4ocHVyZURhdGFNYXJzaGFsbGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VCb2FyZFJlbW90ZSI6WyJtYWtlQm9hcmRSZW1vdGUiXSwic2xvdFRvQm9hcmRSZW1vdGUiOlsic2xvdFRvQm9hcmRSZW1vdGUiXSwiYm9hcmRTbG90dGluZ01hcnNoYWxsZXIiOlsiYm9hcmRTbG90dGluZ01hcnNoYWxsZXIiXSwidW5tYXJzaGFsRnJvbVZzdG9yYWdlIjpbInVubWFyc2hhbEZyb21Wc3RvcmFnZSJdLCJtYWtlSGlzdG9yeVJldml2ZXIiOlsibWFrZUhpc3RvcnlSZXZpdmVyIl0sInB1cmVEYXRhTWFyc2hhbGxlciI6WyJwdXJlRGF0YU1hcnNoYWxsZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA12mQKZoIAACaCAAAMQAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuNC4wLXUxOS4yL3NyYy9tZXRob2QtdG9vbHMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImJpbmRBbGxNZXRob2RzIiwiZ2V0TWV0aG9kTmFtZXMiLCJnZXRTdHJpbmdNZXRob2ROYW1lcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IGlzT2JqZWN0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiaXNPYmplY3RcIiwgWyRozY9fYSA9PiAoaXNPYmplY3QgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cbi8qXG5cblxuICovXG5cbmNvbnN0e2dldFByb3RvdHlwZU9mLGNyZWF0ZSxmcm9tRW50cmllcyxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzfT1cbk9iamVjdDtcbmNvbnN0e293bktleXMsYXBwbHl9PVJlZmxlY3Q7XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBjb21wYXJlU3RyaW5naWZpZWQ9KGEsYik9PntcbmlmKHR5cGVvZiBhPT09dHlwZW9mIGIpe1xuY29uc3QgbGVmdD1TdHJpbmcoYSk7XG5jb25zdCByaWdodD1TdHJpbmcoYik7XG4vL1xucmV0dXJuIGxlZnQ8cmlnaHQ/LTE6bGVmdD5yaWdodD8xOjA7XG4gfVxuaWYodHlwZW9mIGE9PT0nc3ltYm9sJyl7XG5hc3NlcnQodHlwZW9mIGI9PT0nc3RyaW5nJyk7XG5yZXR1cm4tMTtcbiB9XG5hc3NlcnQodHlwZW9mIGE9PT0nc3RyaW5nJyk7XG5hc3NlcnQodHlwZW9mIGI9PT0nc3ltYm9sJyk7XG5yZXR1cm4gMTtcbiB9O1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGdldE1ldGhvZE5hbWVzPSh2YWwpPT57XG5sZXQgbGF5ZXI9dmFsO1xuY29uc3QgbmFtZXM9bmV3IFNldCgpOy8vXG53aGlsZShsYXllciE9PW51bGwmJmxheWVyIT09T2JqZWN0LnByb3RvdHlwZSl7XG4vL1xuY29uc3QgZGVzY3M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhsYXllcik7XG5jb25zdCBvd25OYW1lcz0vKiAgICAgICAgICAgICAgKi9vd25LZXlzKGRlc2NzKTtcbmZvcihjb25zdCBuYW1lIG9mIG93bk5hbWVzKXtcbi8vXG4vL1xuaWYodHlwZW9mIHZhbFtuYW1lXT09PSdmdW5jdGlvbicpe1xubmFtZXMuYWRkKG5hbWUpO1xuIH1cbiB9XG5pZighaXNPYmplY3QodmFsKSl7XG5icmVhaztcbiB9XG5sYXllcj1nZXRQcm90b3R5cGVPZihsYXllcik7XG4gfVxucmV0dXJuIGhhcmRlbihbLi4ubmFtZXNdLnNvcnQoY29tcGFyZVN0cmluZ2lmaWVkKSk7XG4gfTskaM2PX29uY2UuZ2V0TWV0aG9kTmFtZXMoZ2V0TWV0aG9kTmFtZXMpO1xuaGFyZGVuKGdldE1ldGhvZE5hbWVzKTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBnZXRTdHJpbmdNZXRob2ROYW1lcz0odmFsKT0+XG4vKiAgICAgICAgICAgICAgICAgICAqL1xuZ2V0TWV0aG9kTmFtZXModmFsKS5maWx0ZXIoKG5hbWUpPT50eXBlb2YgbmFtZT09PSdzdHJpbmcnKTtcblxuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmdldFN0cmluZ01ldGhvZE5hbWVzKGdldFN0cmluZ01ldGhvZE5hbWVzKTtcbmNvbnN0ICAgICAgICBiaW5kQWxsTWV0aG9kcz0ob2JqKT0+XG5oYXJkZW4oXG5jcmVhdGUoXG5vYmosXG5mcm9tRW50cmllcyhcbmdldE1ldGhvZE5hbWVzKG9iaikubWFwKChuYW1lKT0+W1xubmFtZSxcbntcbnZhbHVlOigvKiAgICAgICAgICAgICAgICAgICAgKi8uLi5hcmdzKT0+XG5hcHBseShvYmpbbmFtZV0sb2JqLGFyZ3MpLFxuZW51bWVyYWJsZTp0cnVlfV0pKSkpOyRozY9fb25jZS5iaW5kQWxsTWV0aG9kcyhiaW5kQWxsTWV0aG9kcyk7XG5cblxuXG5cblxuaGFyZGVuKGJpbmRBbGxNZXRob2RzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdldE1ldGhvZE5hbWVzIjpbImdldE1ldGhvZE5hbWVzIl0sImdldFN0cmluZ01ldGhvZE5hbWVzIjpbImdldFN0cmluZ01ldGhvZE5hbWVzIl0sImJpbmRBbGxNZXRob2RzIjpbImJpbmRBbGxNZXRob2RzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAG8JsoYRIAAAESAAAC4AAABAYWdvcmljL2ludGVybmFsLXYwLjQuMC11MTkuMi9zcmMvc2VzLXV0aWxzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9wcm9taXNlLWtpdCIsIkBlbmRvL3N0cmVhbSIsImplc3NpZS5qcyIsIi4vanMtdXRpbHMuanMiXSwiZXhwb3J0cyI6WyJQcm9taXNlQWxsT3JFcnJvcnMiLCJhZ2dyZWdhdGVUcnlGaW5hbGx5IiwiYWxsVmFsdWVzIiwiYXNzZXJ0QWxsRGVmaW5lZCIsImRlZXBseUZ1bGZpbGxlZE9iamVjdCIsImZvcmV2ZXIiLCJtYWtlTGltaXRlZENvbnNvbGUiLCJzeW5jaHJvbml6ZWRUZWUiLCJ1bnRpbFRydWUiLCJ3aGlsZVRydWUiLCJ3aXRoRGVmZXJyZWRDbGVhbnVwIiwiemlwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgcSxGYWlsLG1ha2VFcnJvcixhbm5vdGF0ZUVycm9yLFgsZGVlcGx5RnVsZmlsbGVkLGlzT2JqZWN0LG1ha2VQcm9taXNlS2l0LG1ha2VRdWV1ZSxhc3luY0dlbmVyYXRlLGxvZ0xldmVsczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLCBbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIiwgWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJtYWtlRXJyb3JcIiwgWyRozY9fYSA9PiAobWFrZUVycm9yID0gJGjNj19hKV1dLFtcImFubm90YXRlRXJyb3JcIiwgWyRozY9fYSA9PiAoYW5ub3RhdGVFcnJvciA9ICRozY9fYSldXSxbXCJYXCIsIFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJkZWVwbHlGdWxmaWxsZWRcIiwgWyRozY9fYSA9PiAoZGVlcGx5RnVsZmlsbGVkID0gJGjNj19hKV1dLFtcImlzT2JqZWN0XCIsIFskaM2PX2EgPT4gKGlzT2JqZWN0ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcIm1ha2VQcm9taXNlS2l0XCIsIFskaM2PX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vc3RyZWFtXCIsIFtbXCJtYWtlUXVldWVcIiwgWyRozY9fYSA9PiAobWFrZVF1ZXVlID0gJGjNj19hKV1dXV0sW1wiamVzc2llLmpzXCIsIFtbXCJhc3luY0dlbmVyYXRlXCIsIFskaM2PX2EgPT4gKGFzeW5jR2VuZXJhdGUgPSAkaM2PX2EpXV1dXSxbXCIuL2pzLXV0aWxzLmpzXCIsIFtbXCJsb2dMZXZlbHNcIiwgWyRozY9fYSA9PiAobG9nTGV2ZWxzID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuY29uc3R7ZnJvbUVudHJpZXMsa2V5cyx2YWx1ZXN9PU9iamVjdDtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0ICAgICAgICBtYWtlTGltaXRlZENvbnNvbGU9KG1ha2VMb2dnZXIpPT57XG5jb25zdCBsaW1pdGVkQ29uc29sZT0vKiAgICAgICAgICAgICAgKi9cbmZyb21FbnRyaWVzKGxvZ0xldmVscy5tYXAoKGxldmVsKT0+W2xldmVsLG1ha2VMb2dnZXIobGV2ZWwpXSkpO1xuXG5yZXR1cm4gKC8qICAgICAgICAgICAgICAgICAgICAgICAgICovaGFyZGVuKGxpbWl0ZWRDb25zb2xlKSk7XG4gfTskaM2PX29uY2UubWFrZUxpbWl0ZWRDb25zb2xlKG1ha2VMaW1pdGVkQ29uc29sZSk7XG5oYXJkZW4obWFrZUxpbWl0ZWRDb25zb2xlKTtcblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGRlZXBseUZ1bGZpbGxlZE9iamVjdD1hc3luYyhvYmopPT57XG5pc09iamVjdChvYmopfHxGYWlsIGBwYXJhbSBtdXN0IGJlIGFuIG9iamVjdGA7XG5yZXR1cm4gZGVlcGx5RnVsZmlsbGVkKG9iaik7XG4gfTtcblxuLypcblxuXG5cbiAqLyRozY9fb25jZS5kZWVwbHlGdWxmaWxsZWRPYmplY3QoZGVlcGx5RnVsZmlsbGVkT2JqZWN0KTtcbmNvbnN0IG1ha2VBZ2dyZWdhdGVFcnJvcj1cbnR5cGVvZiBBZ2dyZWdhdGVFcnJvcj09PSdmdW5jdGlvbic/XG4oZXJyb3JzLG1lc3NhZ2Usb3B0aW9ucyk9PkFnZ3JlZ2F0ZUVycm9yKGVycm9ycyxtZXNzYWdlLG9wdGlvbnMpOlxuKGVycm9ycyxtZXNzYWdlLG9wdGlvbnMpPT57XG5yZXR1cm4gbWFrZUVycm9yKG1lc3NhZ2U/PydtdWx0aXBsZSBlcnJvcnMnLHVuZGVmaW5lZCx7XG4uLi5vcHRpb25zLFxuZXJyb3JzfSk7XG5cbiB9O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCAgICAgICAgUHJvbWlzZUFsbE9yRXJyb3JzPWFzeW5jKGl0ZW1zKT0+e1xucmV0dXJuIFByb21pc2UuYWxsU2V0dGxlZChpdGVtcykudGhlbigocmVzdWx0cyk9PntcbmNvbnN0IGVycm9ycz0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xucmVzdWx0cy5maWx0ZXIoKHtzdGF0dXN9KT0+c3RhdHVzPT09J3JlamVjdGVkJykuXG5tYXAoKHJlc3VsdCk9PnJlc3VsdC5yZWFzb24pO1xuaWYoIWVycm9ycy5sZW5ndGgpe1xucmV0dXJuICgvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9yZXN1bHRzLm1hcChcbihyZXN1bHQpPT5yZXN1bHQudmFsdWUpKTtcblxuIH1lbHNlIGlmKGVycm9ycy5sZW5ndGg9PT0xKXtcbnRocm93IGVycm9yc1swXTtcbiB9ZWxzZXtcbnRocm93IG1ha2VBZ2dyZWdhdGVFcnJvcihlcnJvcnMpO1xuIH1cbiB9KTtcbiB9O1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UuUHJvbWlzZUFsbE9yRXJyb3JzKFByb21pc2VBbGxPckVycm9ycyk7XG5jb25zdCAgICAgICAgYWdncmVnYXRlVHJ5RmluYWxseT1hc3luYyh0cmllcixmaW5hbGl6ZXIpPT5cbnRyaWVyKCkudGhlbihcbmFzeW5jKHJlc3VsdCk9PmZpbmFsaXplcigpLnRoZW4oKCk9PnJlc3VsdCksXG5hc3luYyh0cnlFcnJvcik9PlxuZmluYWxpemVyKHRyeUVycm9yKS5cbnRoZW4oXG4oKT0+dHJ5RXJyb3IsXG4oZmluYWxpemVFcnJvcik9Pm1ha2VBZ2dyZWdhdGVFcnJvcihbdHJ5RXJyb3IsZmluYWxpemVFcnJvcl0pKS5cblxudGhlbigoZXJyb3IpPT5Qcm9taXNlLnJlamVjdChlcnJvcikpKTtcblxuXG4vKlxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuYWdncmVnYXRlVHJ5RmluYWxseShhZ2dyZWdhdGVUcnlGaW5hbGx5KTtcbmNvbnN0ICAgICAgICB3aXRoRGVmZXJyZWRDbGVhbnVwPWFzeW5jKGZuKT0+e1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBjbGVhbnVwc0xJRk89W107XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGFkZENsZWFudXA9KGNsZWFudXApPT57XG5jbGVhbnVwc0xJRk8udW5zaGlmdChjbGVhbnVwKTtcbiB9O1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGZpbmFsaXplcj1hc3luYyhlcnIpPT57XG4vL1xuY29uc3QgY2xlYW51cFJlc3VsdHM9Y2xlYW51cHNMSUZPLm1hcChhc3luYyhjbGVhbnVwKT0+e1xuYXdhaXQgbnVsbDtcbnJldHVybiBjbGVhbnVwKGVycik7XG4gfSk7XG5hd2FpdCBQcm9taXNlQWxsT3JFcnJvcnMoY2xlYW51cFJlc3VsdHMpO1xuIH07XG5yZXR1cm4gYWdncmVnYXRlVHJ5RmluYWxseSgoKT0+Zm4oYWRkQ2xlYW51cCksZmluYWxpemVyKTtcbiB9O1xuXG4vKlxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2Uud2l0aERlZmVycmVkQ2xlYW51cCh3aXRoRGVmZXJyZWRDbGVhbnVwKTtcbmNvbnN0ICAgICAgICBhc3NlcnRBbGxEZWZpbmVkPShvYmopPT57XG5jb25zdCBtaXNzaW5nPVtdO1xuZm9yKGNvbnN0W2tleSx2YWxdb2YgT2JqZWN0LmVudHJpZXMob2JqKSl7XG5pZih2YWw9PT11bmRlZmluZWQpe1xubWlzc2luZy5wdXNoKGtleSk7XG4gfVxuIH1cbmlmKG1pc3NpbmcubGVuZ3RoPjApe1xuRmFpbCBgbWlzc2luZyAke3EobWlzc2luZyl9YDtcbiB9XG4gfTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UuYXNzZXJ0QWxsRGVmaW5lZChhc3NlcnRBbGxEZWZpbmVkKTtcbmNvbnN0IG5vdERvbmU9aGFyZGVuKHtkb25lOmZhbHNlLHZhbHVlOnVuZGVmaW5lZH0pO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGFsd2F5c0RvbmU9aGFyZGVuKHtkb25lOnRydWUsdmFsdWU6dW5kZWZpbmVkfSk7XG5cbmNvbnN0ICAgICAgICBmb3JldmVyPWFzeW5jR2VuZXJhdGUoKCk9Pm5vdERvbmUpO1xuXG4vKlxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5mb3JldmVyKGZvcmV2ZXIpO1xuY29uc3QgICAgICAgIHdoaWxlVHJ1ZT0ocHJvZHVjZSk9PlxuYXN5bmNHZW5lcmF0ZShhc3luYygpPT57XG5jb25zdCB2YWx1ZT1hd2FpdCBwcm9kdWNlKCk7XG5pZighdmFsdWUpe1xucmV0dXJuIGFsd2F5c0RvbmU7XG4gfVxucmV0dXJuIGhhcmRlbih7XG5kb25lOmZhbHNlLFxudmFsdWV9KTtcblxuIH0pO1xuXG4vKlxuXG5cblxuXG5cbiAqLyRozY9fb25jZS53aGlsZVRydWUod2hpbGVUcnVlKTtcbmNvbnN0ICAgICAgICB1bnRpbFRydWU9KHByb2R1Y2UpPT5cbmFzeW5jR2VuZXJhdGUoYXN5bmMoKT0+e1xuY29uc3QgdmFsdWU9YXdhaXQgcHJvZHVjZSgpO1xuaWYodmFsdWUpe1xucmV0dXJuIGhhcmRlbih7XG5kb25lOnRydWUsXG52YWx1ZX0pO1xuXG4gfVxucmV0dXJuIGhhcmRlbih7XG5kb25lOmZhbHNlLFxudmFsdWV9KTtcblxuIH0pO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UudW50aWxUcnVlKHVudGlsVHJ1ZSk7XG5jb25zdCAgICAgICAgemlwPSh4cyx5cyk9PmhhcmRlbih4cy5tYXAoKHgsaSk9Plt4LHlzWytpXV0pKTtcblxuLypcblxuXG5cbiAqLyRozY9fb25jZS56aXAoemlwKTtcbmNvbnN0ICAgICAgICBhbGxWYWx1ZXM9YXN5bmMob2JqKT0+e1xuY29uc3QgcmVzb2x2ZWQ9YXdhaXQgUHJvbWlzZS5hbGwodmFsdWVzKG9iaikpO1xuLy9cbnJldHVybiBoYXJkZW4oZnJvbUVudHJpZXMoemlwKGtleXMob2JqKSxyZXNvbHZlZCkpKTtcbiB9O1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuYWxsVmFsdWVzKGFsbFZhbHVlcyk7XG5jb25zdCAgICAgICAgc3luY2hyb25pemVkVGVlPShzb3VyY2VTdHJlYW0scmVhZGVyQ291bnQpPT57XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xubGV0IGRvbmVSZXN1bHQ7XG5cbi8qXG5cblxuXG4gICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgcXVldWVzPVtdO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBwdWxsTmV4dD1hc3luYygpPT57XG5jb25zdCByZXF1ZXN0cz1hd2FpdCBQcm9taXNlLmFsbFNldHRsZWQocXVldWVzLm1hcCgocXVldWUpPT5xdWV1ZS5nZXQoKSkpO1xuY29uc3QgcmVqZWN0aW9ucz1bXTtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgcmVzb2x2ZXJzPVtdO1xubGV0IGRvbmU9ZmFsc2U7XG5mb3IoY29uc3Qgc2V0dGxlZFJlc3VsdCBvZiByZXF1ZXN0cyl7XG5pZihzZXR0bGVkUmVzdWx0LnN0YXR1cz09PSdyZWplY3RlZCcpe1xucmVqZWN0aW9ucy5wdXNoKHNldHRsZWRSZXN1bHQucmVhc29uKTtcbiB9ZWxzZXtcbmRvbmV8fD0hIXNldHRsZWRSZXN1bHQudmFsdWUuZG9uZTtcbnJlc29sdmVycy5wdXNoKHNldHRsZWRSZXN1bHQudmFsdWUudmFsdWUpO1xuIH1cbiB9XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xubGV0IHJlc3VsdDtcbmlmKGRvbmVSZXN1bHQpe1xucmVzdWx0PVByb21pc2UucmVzb2x2ZShkb25lUmVzdWx0KTtcbiB9ZWxzZSBpZihyZWplY3Rpb25zLmxlbmd0aCl7XG5jb25zdCBlcnJvcj1tYWtlRXJyb3IoWCBgVGVlZCBzdHJlYW0gdGhyZXdgKTtcbmFubm90YXRlRXJyb3IoZXJyb3IsWCBgVGVlZCByZWplY3Rpb25zOiAke3JlamVjdGlvbnN9YCk7XG5yZXN1bHQ9XG5zb3VyY2VTdHJlYW0udGhyb3c/LihlcnJvcil8fFxuUHJvbWlzZS5yZXNvbHZlKHNvdXJjZVN0cmVhbS5yZXR1cm4/LigpKS50aGVuKCgpPT5cblByb21pc2UucmVqZWN0KGVycm9yKSk7XG5cbiB9ZWxzZSBpZihkb25lKXtcbnJlc3VsdD1cbnNvdXJjZVN0cmVhbS5yZXR1cm4/LigpfHxcblByb21pc2UucmVzb2x2ZSh7ZG9uZTp0cnVlLHZhbHVlOnVuZGVmaW5lZH0pO1xuIH1lbHNle1xucmVzdWx0PXNvdXJjZVN0cmVhbS5uZXh0KCk7XG4gfVxucmVzdWx0LnRoZW4oXG4ocik9PntcbmlmKHIuZG9uZSl7XG5kb25lUmVzdWx0PXI7XG4gfVxuIH0sXG4oKT0+e1xuZG9uZVJlc3VsdD17ZG9uZTp0cnVlLHZhbHVlOnVuZGVmaW5lZH07XG4gfSk7XG5cbmZvcihjb25zdCByZXNvbHZlIG9mIHJlc29sdmVycyl7XG5yZXNvbHZlKHJlc3VsdCk7XG4gfVxucmV0dXJuIHB1bGxOZXh0KCk7XG4gfTtcblxuY29uc3QgcmVhZGVycz1BcnJheS5mcm9tKHtsZW5ndGg6cmVhZGVyQ291bnR9KS5tYXAoKCk9Pntcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBxdWV1ZT1tYWtlUXVldWUoKTtcbnF1ZXVlcy5wdXNoKHF1ZXVlKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHJlYWRlcj1oYXJkZW4oe1xuICAgICAgYXN5bmMgbmV4dCgpe1xuLypcblxuXG5cbiAgICAgICAgICovXG5jb25zdHtwcm9taXNlLHJlc29sdmV9PW1ha2VQcm9taXNlS2l0KCk7XG5xdWV1ZS5wdXQoe3ZhbHVlOnJlc29sdmUsZG9uZTpmYWxzZX0pO1xucmV0dXJuIHByb21pc2U7XG4gfSxcbiAgICAgIGFzeW5jIHJldHVybigpe1xuLypcblxuXG5cbiAgICAgICAgICovXG5jb25zdHtwcm9taXNlLHJlc29sdmV9PW1ha2VQcm9taXNlS2l0KCk7XG5xdWV1ZS5wdXQoe3ZhbHVlOnJlc29sdmUsZG9uZTp0cnVlfSk7XG5yZXR1cm4gcHJvbWlzZTtcbiB9LFxuICAgICAgYXN5bmMgdGhyb3cocmVhc29uKXtcbmNvbnN0IHJlamVjdGlvbj1Qcm9taXNlLnJlamVjdChyZWFzb24pO1xucXVldWUucHV0KHJlamVjdGlvbik7XG5yZXR1cm4gcmVqZWN0aW9uO1xuIH0sXG4vL1xuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpe1xucmV0dXJuIHJlYWRlcjtcbiB9LFxuLy9cbiAgICAgIGFzeW5jW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCl7XG5hd2FpdCByZWFkZXIucmV0dXJuKCk7XG4gfX0pO1xuXG5yZXR1cm4gcmVhZGVyO1xuIH0pO1xuXG52b2lkIHB1bGxOZXh0KCk7XG5yZXR1cm4gcmVhZGVycztcbiB9OyRozY9fb25jZS5zeW5jaHJvbml6ZWRUZWUoc3luY2hyb25pemVkVGVlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VMaW1pdGVkQ29uc29sZSI6WyJtYWtlTGltaXRlZENvbnNvbGUiXSwiZGVlcGx5RnVsZmlsbGVkT2JqZWN0IjpbImRlZXBseUZ1bGZpbGxlZE9iamVjdCJdLCJQcm9taXNlQWxsT3JFcnJvcnMiOlsiUHJvbWlzZUFsbE9yRXJyb3JzIl0sImFnZ3JlZ2F0ZVRyeUZpbmFsbHkiOlsiYWdncmVnYXRlVHJ5RmluYWxseSJdLCJ3aXRoRGVmZXJyZWRDbGVhbnVwIjpbIndpdGhEZWZlcnJlZENsZWFudXAiXSwiYXNzZXJ0QWxsRGVmaW5lZCI6WyJhc3NlcnRBbGxEZWZpbmVkIl0sImZvcmV2ZXIiOlsiZm9yZXZlciJdLCJ3aGlsZVRydWUiOlsid2hpbGVUcnVlIl0sInVudGlsVHJ1ZSI6WyJ1bnRpbFRydWUiXSwiemlwIjpbInppcCJdLCJhbGxWYWx1ZXMiOlsiYWxsVmFsdWVzIl0sInN5bmNocm9uaXplZFRlZSI6WyJzeW5jaHJvbml6ZWRUZWUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAH7Bug0QjAABEIwAANwAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuNC4wLXUxOS4yL3NyYy9zdG9yYWdlLXRlc3QtdXRpbHMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZmFyIiwiQGVuZG8vbWFyc2hhbCIsIi4vZGVidWcuanMiLCIuL2Vycm9ycy5qcyIsIi4vbGliLWNoYWluU3RvcmFnZS5qcyIsIi4vbWFyc2hhbC5qcyIsIi4vbWV0aG9kLXRvb2xzLmpzIiwiLi90ZXN0aW5nLXV0aWxzLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdE1hcnNoYWxsZXIiLCJkZWZhdWx0U2VyaWFsaXplciIsImRvY3VtZW50U3RvcmFnZVNjaGVtYSIsIm1ha2VGYWtlU3RvcmFnZUtpdCIsIm1ha2VNb2NrQ2hhaW5TdG9yYWdlUm9vdCIsInNsb3RTdHJpbmdVbnNlcmlhbGl6ZSIsInNsb3RUb1JlbW90YWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IEZhaWwsRmFyLG1ha2VNYXJzaGFsLFJlbW90YWJsZSxtYWtlVHJhY2VyLE5vbk51bGxpc2gsaXNTdHJlYW1DZWxsLG1ha2VDaGFpblN0b3JhZ2VSb290LHVubWFyc2hhbEZyb21Wc3RvcmFnZSxiaW5kQWxsTWV0aG9kcyxldmVudExvb3BJdGVyYXRpb247JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIiwgWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRmFyXCIsIFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIm1ha2VNYXJzaGFsXCIsIFskaM2PX2EgPT4gKG1ha2VNYXJzaGFsID0gJGjNj19hKV1dLFtcIlJlbW90YWJsZVwiLCBbJGjNj19hID0+IChSZW1vdGFibGUgPSAkaM2PX2EpXV1dXSxbXCIuL2RlYnVnLmpzXCIsIFtbXCJtYWtlVHJhY2VyXCIsIFskaM2PX2EgPT4gKG1ha2VUcmFjZXIgPSAkaM2PX2EpXV1dXSxbXCIuL2Vycm9ycy5qc1wiLCBbW1wiTm9uTnVsbGlzaFwiLCBbJGjNj19hID0+IChOb25OdWxsaXNoID0gJGjNj19hKV1dXV0sW1wiLi9saWItY2hhaW5TdG9yYWdlLmpzXCIsIFtbXCJpc1N0cmVhbUNlbGxcIiwgWyRozY9fYSA9PiAoaXNTdHJlYW1DZWxsID0gJGjNj19hKV1dLFtcIm1ha2VDaGFpblN0b3JhZ2VSb290XCIsIFskaM2PX2EgPT4gKG1ha2VDaGFpblN0b3JhZ2VSb290ID0gJGjNj19hKV1dXV0sW1wiLi9tYXJzaGFsLmpzXCIsIFtbXCJ1bm1hcnNoYWxGcm9tVnN0b3JhZ2VcIiwgWyRozY9fYSA9PiAodW5tYXJzaGFsRnJvbVZzdG9yYWdlID0gJGjNj19hKV1dXV0sW1wiLi9tZXRob2QtdG9vbHMuanNcIiwgW1tcImJpbmRBbGxNZXRob2RzXCIsIFskaM2PX2EgPT4gKGJpbmRBbGxNZXRob2RzID0gJGjNj19hKV1dXV0sW1wiLi90ZXN0aW5nLXV0aWxzLmpzXCIsIFtbXCJldmVudExvb3BJdGVyYXRpb25cIiwgWyRozY9fYSA9PiAoZXZlbnRMb29wSXRlcmF0aW9uID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuLypcblxuXG4gKi9cblxuY29uc3QgdHJhY2U9bWFrZVRyYWNlcignU3RvclRVJyxmYWxzZSk7XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgc2xvdFRvUmVtb3RhYmxlPShfc2xvdElkLGlmYWNlPSdSZW1vdGFibGUnKT0+XG5SZW1vdGFibGUoaWZhY2UpO1xuXG4vKlxuXG5cbiAqLyRozY9fb25jZS5zbG90VG9SZW1vdGFibGUoc2xvdFRvUmVtb3RhYmxlKTtcbmNvbnN0ICAgICAgICBkZWZhdWx0TWFyc2hhbGxlcj1tYWtlTWFyc2hhbCh1bmRlZmluZWQsc2xvdFRvUmVtb3RhYmxlLHtcbnNlcmlhbGl6ZUJvZHlGb3JtYXQ6J3NtYWxsY2Fwcyd9KTtcblxuXG4vKlxuXG4gKi8kaM2PX29uY2UuZGVmYXVsdE1hcnNoYWxsZXIoZGVmYXVsdE1hcnNoYWxsZXIpO1xuY29uc3QgICAgICAgIGRlZmF1bHRTZXJpYWxpemVyPXtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbnBhcnNlOih0eHQpPT5kZWZhdWx0TWFyc2hhbGxlci5mcm9tQ2FwRGF0YShKU09OLnBhcnNlKHR4dCkpLFxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbnN0cmluZ2lmeToob2JqKT0+SlNPTi5zdHJpbmdpZnkoZGVmYXVsdE1hcnNoYWxsZXIudG9DYXBEYXRhKG9iaikpfTtcblxuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5kZWZhdWx0U2VyaWFsaXplcihkZWZhdWx0U2VyaWFsaXplcik7XG5jb25zdCBtYWtlU2xvdFN0cmluZ1Vuc2VyaWFsaXplPSgpPT57XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGlkZW50aXR5U2xvdFRvVmFsRm49KHNsb3QsXyk9PkZhcigndW5rJyx7dG9KU09OOigpPT5zbG90fSk7XG5jb25zdHtmcm9tQ2FwRGF0YX09bWFrZU1hcnNoYWwodW5kZWZpbmVkLGlkZW50aXR5U2xvdFRvVmFsRm4pO1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCB1bnNlcmlhbGl6ZT0oY2FwRGF0YSk9PlxuSlNPTi5wYXJzZShcbkpTT04uc3RyaW5naWZ5KGZyb21DYXBEYXRhKGNhcERhdGEpLChfLHZhbCk9PntcbmlmKHR5cGVvZiB2YWw9PT0nYmlnaW50Jyl7XG4vL1xuLy9cbnJldHVybiBgQGVuY3JvbXVsYXRlOiR7dmFsfWA7XG4gfWVsc2V7XG5yZXR1cm4gdmFsO1xuIH1cbiB9KSxcbihfa2V5LHZhbCk9PntcbmlmKHR5cGVvZiB2YWw9PT0nc3RyaW5nJyYmdmFsLnN0YXJ0c1dpdGgoJ0BlbmNyb211bGF0ZScpKXtcbnJldHVybiBCaWdJbnQodmFsLnNwbGl0KCc6JylbMV0pO1xuIH1lbHNle1xucmV0dXJuIHZhbDtcbiB9XG4gfSk7XG5cbnJldHVybiBoYXJkZW4odW5zZXJpYWxpemUpO1xuIH07XG5jb25zdCAgICAgICAgc2xvdFN0cmluZ1Vuc2VyaWFsaXplPW1ha2VTbG90U3RyaW5nVW5zZXJpYWxpemUoKTtcblxuLypcblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5zbG90U3RyaW5nVW5zZXJpYWxpemUoc2xvdFN0cmluZ1Vuc2VyaWFsaXplKTtcbmNvbnN0ICAgICAgICBtYWtlRmFrZVN0b3JhZ2VLaXQ9KHJvb3RQYXRoLHJvb3RPcHRpb25zKT0+e1xuY29uc3QgcmVzb2x2ZWRPcHRpb25zPXtzZXF1ZW5jZTp0cnVlLC4uLnJvb3RPcHRpb25zfTtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgZGF0YT1uZXcgTWFwKCk7XG5sZXQgY3VycmVudEJsb2NrSGVpZ2h0PTA7XG5cbmNvbnN0IHVwZGF0ZU5ld0NlbGxCbG9ja0hlaWdodD0oYmxvY2tIZWlnaHQ9Y3VycmVudEJsb2NrSGVpZ2h0KzEpPT57XG5ibG9ja0hlaWdodD5jdXJyZW50QmxvY2tIZWlnaHR8fFxuRmFpbCBgYmxvY2tIZWlnaHQgJHtibG9ja0hlaWdodH0gbXVzdCBiZSBncmVhdGVyIHRoYW4gJHtjdXJyZW50QmxvY2tIZWlnaHR9YDtcbmN1cnJlbnRCbG9ja0hlaWdodD1ibG9ja0hlaWdodDtcbiB9O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgZ2V0Q2hpbGRFbnRyaWVzPShwcmVmaXgpPT57XG5hc3NlcnQocHJlZml4LmVuZHNXaXRoKCcuJykpO1xuY29uc3QgY2hpbGRFbnRyaWVzPW5ldyBNYXAoKTtcbmZvcihjb25zdFtwYXRoLHZhbHVlXW9mIGRhdGEuZW50cmllcygpKXtcbmlmKCFwYXRoLnN0YXJ0c1dpdGgocHJlZml4KSl7XG5jb250aW51ZTtcbiB9XG5jb25zdFtzZWdtZW50LC4uLnN1ZmZpeF09cGF0aC5zbGljZShwcmVmaXgubGVuZ3RoKS5zcGxpdCgnLicpO1xuaWYoc3VmZml4Lmxlbmd0aD09PTApe1xuY2hpbGRFbnRyaWVzLnNldChzZWdtZW50LHZhbHVlKTtcbiB9ZWxzZSBpZighY2hpbGRFbnRyaWVzLmhhcyhzZWdtZW50KSl7XG5jaGlsZEVudHJpZXMuc2V0KHNlZ21lbnQsbnVsbCk7XG4gfVxuIH1cbnJldHVybiBjaGlsZEVudHJpZXM7XG4gfTtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IG1lc3NhZ2VzPVtdO1xuXG5jb25zdCB0b1N0b3JhZ2U9RmFyKFxuJ1RvU3RvcmFnZScsXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuKG1lc3NhZ2UpPT57XG5tZXNzYWdlcy5wdXNoKG1lc3NhZ2UpO1xuc3dpdGNoKG1lc3NhZ2UubWV0aG9kKXtcbmNhc2UnZ2V0U3RvcmVLZXknOntcbmNvbnN0W2tleV09bWVzc2FnZS5hcmdzO1xucmV0dXJue3N0b3JlTmFtZTonc3dpbmdzZXQnLHN0b3JlU3Via2V5OiBgZmFrZToke2tleX1gfTtcbiB9XG5jYXNlJ2dldCc6e1xuY29uc3Rba2V5XT1tZXNzYWdlLmFyZ3M7XG5yZXR1cm4gZGF0YS5oYXMoa2V5KT9kYXRhLmdldChrZXkpOm51bGw7XG4gfVxuY2FzZSdjaGlsZHJlbic6e1xuY29uc3Rba2V5XT1tZXNzYWdlLmFyZ3M7XG5jb25zdCBjaGlsZEVudHJpZXM9Z2V0Q2hpbGRFbnRyaWVzKCBgJHtrZXl9LmApO1xucmV0dXJuWy4uLmNoaWxkRW50cmllcy5rZXlzKCldO1xuIH1cbmNhc2UnZW50cmllcyc6e1xuY29uc3Rba2V5XT1tZXNzYWdlLmFyZ3M7XG5jb25zdCBjaGlsZEVudHJpZXM9Z2V0Q2hpbGRFbnRyaWVzKCBgJHtrZXl9LmApO1xucmV0dXJuWy4uLmNoaWxkRW50cmllcy5lbnRyaWVzKCldLm1hcCgoZW50cnkpPT5cbmVudHJ5WzFdIT1udWxsP2VudHJ5OltlbnRyeVswXV0pO1xuXG4gfVxuY2FzZSdzZXQnOlxuY2FzZSdzZXRXaXRob3V0Tm90aWZ5Jzp7XG50cmFjZSgndG9TdG9yYWdlIHNldCcsbWVzc2FnZSk7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgbmV3RW50cmllcz1tZXNzYWdlLmFyZ3M7XG5mb3IoY29uc3Rba2V5LHZhbHVlXW9mIG5ld0VudHJpZXMpe1xuaWYodmFsdWUhPW51bGwpe1xuZGF0YS5zZXQoa2V5LHZhbHVlKTtcbiB9ZWxzZXtcbmRhdGEuZGVsZXRlKGtleSk7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH1cbmNhc2UnYXBwZW5kJzp7XG50cmFjZSgndG9TdG9yYWdlIGFwcGVuZCcsbWVzc2FnZSk7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgbmV3RW50cmllcz1tZXNzYWdlLmFyZ3M7XG5mb3IoY29uc3Rba2V5LHZhbHVlXW9mIG5ld0VudHJpZXMpe1xudmFsdWUhPW51bGx8fEZhaWwgYGF0dGVtcHQgdG8gYXBwZW5kIHdpdGggbm8gdmFsdWVgO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmxldCBvbGRWYWw9ZGF0YS5nZXQoa2V5KTtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmxldCBzdHJlYW1DZWxsO1xuaWYob2xkVmFsIT1udWxsKXtcbnRyeXtcbnN0cmVhbUNlbGw9SlNPTi5wYXJzZShvbGRWYWwpO1xuYXNzZXJ0KGlzU3RyZWFtQ2VsbChzdHJlYW1DZWxsKSk7XG4gfWNhdGNoKF9lcnIpe1xuc3RyZWFtQ2VsbD11bmRlZmluZWQ7XG4gfVxuLy9cbmlmKFxuc3RyZWFtQ2VsbCYmXG5OdW1iZXIoc3RyZWFtQ2VsbC5ibG9ja0hlaWdodCkhPT1jdXJyZW50QmxvY2tIZWlnaHQpXG57XG5zdHJlYW1DZWxsPXVuZGVmaW5lZDtcbm9sZFZhbD11bmRlZmluZWQ7XG4gfVxuIH1cblxuaWYoc3RyZWFtQ2VsbD09PXVuZGVmaW5lZCl7XG5zdHJlYW1DZWxsPXtcbmJsb2NrSGVpZ2h0OlN0cmluZyhjdXJyZW50QmxvY2tIZWlnaHQpLFxudmFsdWVzOm9sZFZhbCE9bnVsbD9bb2xkVmFsXTpbXX07XG5cbiB9XG5zdHJlYW1DZWxsLnZhbHVlcy5wdXNoKHZhbHVlKTtcbmRhdGEuc2V0KGtleSxKU09OLnN0cmluZ2lmeShzdHJlYW1DZWxsKSk7XG4gfVxucmV0dXJuIHRydWU7XG4gfVxuY2FzZSdzaXplJzpcbi8vXG4vL1xucmV0dXJuWy4uLmRhdGEua2V5cygpXS5maWx0ZXIoKGspPT5cbmsuc3RhcnRzV2l0aCggYCR7bWVzc2FnZS5hcmdzWzBdfS5gKSkuXG5sZW5ndGg7XG5kZWZhdWx0OlxudGhyb3cgRXJyb3IoIGB1bnN1cHBvcnRlZCBtZXRob2Q6ICR7bWVzc2FnZS5tZXRob2R9YCk7fVxuXG4gfSk7XG5cbmNvbnN0IHJvb3ROb2RlPW1ha2VDaGFpblN0b3JhZ2VSb290KHRvU3RvcmFnZSxyb290UGF0aCxyZXNvbHZlZE9wdGlvbnMpO1xuXG4vKlxuXG5cblxuXG4gICAqL1xuY29uc3QgZ2V0VmFsdWVzPShwYXRoKT0+e1xuYXNzZXJ0KHJlc29sdmVkT3B0aW9ucy5zZXF1ZW5jZSk7XG5jb25zdCBub2RlRGF0YT1kYXRhLmdldChwYXRoKTtcbmFzc2VydChub2RlRGF0YSwgYG5vIGRhdGEgYXQgcGF0aCAke3BhdGh9YCk7XG5jb25zdCB3cmFwcGVyPUpTT04ucGFyc2Uobm9kZURhdGEpO1xucmV0dXJuIHdyYXBwZXIudmFsdWVzO1xuIH07XG5cbnJldHVybntcbnJvb3ROb2RlLFxuLy9cbmRhdGE6LyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL2RhdGEsXG51cGRhdGVOZXdDZWxsQmxvY2tIZWlnaHQsXG5nZXRWYWx1ZXMsXG5tZXNzYWdlcyxcbnRvU3RvcmFnZX07XG5cbiB9OyRozY9fb25jZS5tYWtlRmFrZVN0b3JhZ2VLaXQobWFrZUZha2VTdG9yYWdlS2l0KTtcbmhhcmRlbihtYWtlRmFrZVN0b3JhZ2VLaXQpO1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0ICAgICAgICBtYWtlTW9ja0NoYWluU3RvcmFnZVJvb3Q9KCk9PntcbmNvbnN0e3Jvb3ROb2RlLGRhdGF9PW1ha2VGYWtlU3RvcmFnZUtpdCgnbW9ja0NoYWluU3RvcmFnZVJvb3QnKTtcbnJldHVybiBGYXIoJ21vY2tDaGFpblN0b3JhZ2UnLHtcbi4uLmJpbmRBbGxNZXRob2RzKHJvb3ROb2RlKSxcbi8qXG5cblxuXG5cblxuXG5cblxuXG4gICAgICovXG5nZXRCb2R5OihwYXRoLG1hcnNoYWxsZXI9ZGVmYXVsdE1hcnNoYWxsZXIsaW5kZXg9LTEpPT57XG5kYXRhLnNpemV8fEZhaWwgYG5vIGRhdGEgaW4gc3RvcmFnZWA7XG4vKlxuXG5cblxuICAgICAgICovXG5jb25zdCBmcm9tQ2FwRGF0YT0oLi4uYXJncyk9PlxuUmVmbGVjdC5hcHBseShtYXJzaGFsbGVyLmZyb21DYXBEYXRhLG1hcnNoYWxsZXIsYXJncyk7XG5yZXR1cm4gdW5tYXJzaGFsRnJvbVZzdG9yYWdlKGRhdGEscGF0aCxmcm9tQ2FwRGF0YSxpbmRleCk7XG4gfSxcbmtleXM6KCk9PlsuLi5kYXRhLmtleXMoKV19KTtcblxuIH07XG5cbi8qXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UubWFrZU1vY2tDaGFpblN0b3JhZ2VSb290KG1ha2VNb2NrQ2hhaW5TdG9yYWdlUm9vdCk7XG5jb25zdCAgICAgICAgZG9jdW1lbnRTdG9yYWdlU2NoZW1hPWFzeW5jKHQsc3RvcmFnZSxvcHRzKT0+e1xuLy9cbmF3YWl0IGV2ZW50TG9vcEl0ZXJhdGlvbigpO1xuXG5jb25zdCBnZXRMYXN0PSgvKiAgICAgICAgICAgICAgICAgKi9jZWxsKT0+XG5KU09OLnBhcnNlKGNlbGwpLnZhbHVlcy5hdCgtMSl8fGFzc2VydC5mYWlsKCk7XG5jb25zdHtzaG93VmFsdWU9KHMpPT5zfT1vcHRzO1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgZ2V0Qm9keURlZmF1bHQ9KGQsayk9PnNob3dWYWx1ZShnZXRMYXN0KE5vbk51bGxpc2goZC5nZXQoaykpKSk7XG5cbmNvbnN0W2tleXMsZ2V0Qm9keV09XG4na2V5cydpbiBzdG9yYWdlP1xuW3N0b3JhZ2Uua2V5cygpLCgvKiAgICAgICAgICAgICAgICAgKi9rKT0+c3RvcmFnZS5nZXRCb2R5KGspXTpcbltcbnN0b3JhZ2UuZGF0YS5rZXlzKCksXG4oLyogICAgICAgICAgICAgICAgICovayk9PmdldEJvZHlEZWZhdWx0KHN0b3JhZ2UuZGF0YSxrKV07XG5cblxuY29uc3R7cGF0dGVybixyZXBsYWNlbWVudH09XG4ncGF0dGVybidpbiBvcHRzP1xub3B0czpcbntwYXR0ZXJuOidtb2NrQ2hhaW5TdG9yYWdlUm9vdC4nLHJlcGxhY2VtZW50OidwdWJsaXNoZWQuJ307XG5cbmNvbnN0IHBydW5lZD1bLi4ua2V5c10uXG5zb3J0KCkuXG5maWx0ZXIoXG4nbm9kZSdpbiBvcHRzP1xuKGtleSk9Plxua2V5LlxucmVwbGFjZShwYXR0ZXJuLHJlcGxhY2VtZW50KS5cbnN0YXJ0c1dpdGgoIGBwdWJsaXNoZWQuJHtvcHRzLm5vZGV9YCk6XG4oX2VudHJ5KT0+dHJ1ZSk7XG5cblxuY29uc3QgaWxsdXN0cmF0aW9uPXBydW5lZC5tYXAoXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuKGtleSk9PltrZXkucmVwbGFjZShwYXR0ZXJuLHJlcGxhY2VtZW50KSxnZXRCb2R5KGtleSldKTtcblxuXG5jb25zdCBub3RlPVxuJ25vdGUnaW4gb3B0cz9cbm9wdHMubm90ZTpcbiBgVW5kZXIgXCJwdWJsaXNoZWRcIiwgdGhlIFwiJHtvcHRzLm5vZGV9XCIgbm9kZSBpcyBkZWxlZ2F0ZWQgdG8gJHtvcHRzLm93bmVyfS5gO1xuY29uc3QgYm9pbGVycGxhdGU9IGBcblRoZSBleGFtcGxlIGJlbG93IGlsbHVzdHJhdGVzIHRoZSBzY2hlbWEgb2YgdGhlIGRhdGEgcHVibGlzaGVkIHRoZXJlLlxuXG5TZWUgYWxzbyBib2FyZCBtYXJzaGFsbGluZyBjb252ZW50aW9ucyAoX3RvIGFwcGVhcl8pLmA7XG50LnNuYXBzaG90KGlsbHVzdHJhdGlvbixub3RlK2JvaWxlcnBsYXRlKTtcbiB9OyRozY9fb25jZS5kb2N1bWVudFN0b3JhZ2VTY2hlbWEoZG9jdW1lbnRTdG9yYWdlU2NoZW1hKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InNsb3RUb1JlbW90YWJsZSI6WyJzbG90VG9SZW1vdGFibGUiXSwiZGVmYXVsdE1hcnNoYWxsZXIiOlsiZGVmYXVsdE1hcnNoYWxsZXIiXSwiZGVmYXVsdFNlcmlhbGl6ZXIiOlsiZGVmYXVsdFNlcmlhbGl6ZXIiXSwic2xvdFN0cmluZ1Vuc2VyaWFsaXplIjpbInNsb3RTdHJpbmdVbnNlcmlhbGl6ZSJdLCJtYWtlRmFrZVN0b3JhZ2VLaXQiOlsibWFrZUZha2VTdG9yYWdlS2l0Il0sIm1ha2VNb2NrQ2hhaW5TdG9yYWdlUm9vdCI6WyJtYWtlTW9ja0NoYWluU3RvcmFnZVJvb3QiXSwiZG9jdW1lbnRTdG9yYWdlU2NoZW1hIjpbImRvY3VtZW50U3RvcmFnZVNjaGVtYSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADrGI4BUAYAAFAGAAAyAAAAQGFnb3JpYy9pbnRlcm5hbC12MC40LjAtdTE5LjIvc3JjL3Rlc3RpbmctdXRpbHMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImV2ZW50TG9vcEl0ZXJhdGlvbiIsImluc3BlY3RNYXBTdG9yZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjNj19pbXBvcnRzKFtdKTsgICAvL1xuLypcblxuXG4gKi9cbi8qICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgZXZlbnRMb29wSXRlcmF0aW9uPWFzeW5jKCk9PlxubmV3IFByb21pc2UoKHJlc29sdmUpPT5zZXRJbW1lZGlhdGUocmVzb2x2ZSkpOyRozY9fb25jZS5ldmVudExvb3BJdGVyYXRpb24oZXZlbnRMb29wSXRlcmF0aW9uKTtcbmhhcmRlbihldmVudExvb3BJdGVyYXRpb24pO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBzdHJpbmdPclRhZz0odmFsdWUpPT57XG5pZih0eXBlb2YgdmFsdWU9PT0nc3RyaW5nJyl7XG5yZXR1cm4gdmFsdWU7XG4gfWVsc2UgaWYodHlwZW9mIHZhbHVlPT09J29iamVjdCcmJlN5bWJvbC50b1N0cmluZ1RhZyBpbiB2YWx1ZSl7XG5yZXR1cm4gdmFsdWVbU3ltYm9sLnRvU3RyaW5nVGFnXTtcbiB9XG5yZXR1cm4gU3RyaW5nKHZhbHVlKTtcbiB9O1xuLypcblxuXG4gKi9cbmNvbnN0ICAgICAgICBpbnNwZWN0TWFwU3RvcmU9KHN0b3JlKT0+e1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IG9iaj17fTtcbmZvcihjb25zdCBrZXkgb2Ygc3RvcmUua2V5cygpKXtcbmNvbnN0IHZhbHVlPXN0b3JlLmdldChrZXkpO1xuY29uc3QgaGFzS2V5cz10eXBlb2YgdmFsdWU9PT0nb2JqZWN0JyYmJ2tleXMnaW4gdmFsdWU7XG5jb25zdCBpbmRleD1zdHJpbmdPclRhZyhrZXkpO1xuaWYoaGFzS2V5cyYmJ2dldCdpbiB2YWx1ZSl7XG5vYmpbaW5kZXhdPWluc3BlY3RNYXBTdG9yZSh2YWx1ZSk7XG4gfWVsc2UgaWYoaGFzS2V5cyl7XG5vYmpbaW5kZXhdPUFycmF5LmZyb20odmFsdWUua2V5cygpKTtcbiB9ZWxzZXtcbm9ialtpbmRleF09XG52YWx1ZSBpbnN0YW5jZW9mIE9iamVjdCYmU3ltYm9sLnRvU3RyaW5nVGFnIGluIHZhbHVlP1xudmFsdWVbU3ltYm9sLnRvU3RyaW5nVGFnXTpcbnZhbHVlO1xuIH1cbiB9XG5yZXR1cm4gb2JqO1xuIH07JGjNj19vbmNlLmluc3BlY3RNYXBTdG9yZShpbnNwZWN0TWFwU3RvcmUpO1xuaGFyZGVuKGluc3BlY3RNYXBTdG9yZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJldmVudExvb3BJdGVyYXRpb24iOlsiZXZlbnRMb29wSXRlcmF0aW9uIl0sImluc3BlY3RNYXBTdG9yZSI6WyJpbnNwZWN0TWFwU3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAGERIDiwDAAAsAwAALgAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuNC4wLXUxOS4yL3NyYy90eXBlQ2hlY2suanN7ImltcG9ydHMiOlsiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJjYXN0IiwibXVzdE1hdGNoIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgdHlwZWxlc3NNdXN0TWF0Y2g7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wibXVzdE1hdGNoXCIsIFskaM2PX2EgPT4gKHR5cGVsZXNzTXVzdE1hdGNoID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG4vKlxuXG4gKi9cblxuLyogICAgICAgICAgICAgICAgICAgICovXG5jb25zdCAgICAgICAgbXVzdE1hdGNoPXR5cGVsZXNzTXVzdE1hdGNoO1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UubXVzdE1hdGNoKG11c3RNYXRjaCk7XG5jb25zdCAgICAgICAgY2FzdD0oc3BlY2ltZW4scGF0dCk9Pntcbi8vXG4vL1xuLy9cbm11c3RNYXRjaChzcGVjaW1lbixwYXR0KTtcbnJldHVybiBzcGVjaW1lbjtcbiB9OyRozY9fb25jZS5jYXN0KGNhc3QpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibXVzdE1hdGNoIjpbIm11c3RNYXRjaCJdLCJjYXN0IjpbImNhc3QiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAkPuG/0kEAABJBAAALwAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuNC4wLXUxOS4yL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiQnJpZGdlQmlnSW50U2hhcGUiLCJTdG9yYWdlTm9kZVNoYXBlIiwiVW5ndWFyZGVkSGVscGVySSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IE07JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLCBbJGjNj19hID0+IChNID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuY29uc3QgICAgICAgIFN0b3JhZ2VOb2RlU2hhcGU9TS5yZW1vdGFibGUoJ1N0b3JhZ2VOb2RlJyk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5TdG9yYWdlTm9kZVNoYXBlKFN0b3JhZ2VOb2RlU2hhcGUpO1xuY29uc3QgICAgICAgIFVuZ3VhcmRlZEhlbHBlckk9TS5pbnRlcmZhY2UoXG4naGVscGVyJyxcbnt9LFxuLy9cbntzbG9wcHk6dHJ1ZX0pO1xuXG5cbi8qXG5cblxuXG4gKi9cblxuLypcblxuICovJGjNj19vbmNlLlVuZ3VhcmRlZEhlbHBlckkoVW5ndWFyZGVkSGVscGVySSk7XG5jb25zdCAgICAgICAgQnJpZGdlQmlnSW50U2hhcGU9TS5vcihNLm51bWJlcigpLE0uc3RyaW5nKCkpOyRozY9fb25jZS5CcmlkZ2VCaWdJbnRTaGFwZShCcmlkZ2VCaWdJbnRTaGFwZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJTdG9yYWdlTm9kZVNoYXBlIjpbIlN0b3JhZ2VOb2RlU2hhcGUiXSwiVW5ndWFyZGVkSGVscGVySSI6WyJVbmd1YXJkZWRIZWxwZXJJIl0sIkJyaWRnZUJpZ0ludFNoYXBlIjpbIkJyaWRnZUJpZ0ludFNoYXBlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAVESyZ5AQAAeQEAADAAAABAYWdvcmljL2ludGVybmFsLXYwLjQuMC11MTkuMi9zcmMvdHlwZXMtaW5kZXguanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRozY9faW1wb3J0cyhbXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA03qr5UEHAABBBwAAMAAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuNC4wLXUxOS4yL3NyYy91cGdyYWRlLWFwaS5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbIlVwZ3JhZGVEaXNjb25uZWN0aW9uU2hhcGUiLCJpc0FiYW5kb25lZEVycm9yIiwiaXNVcGdyYWRlRGlzY29ubmVjdGlvbiIsIm1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IE0sbWF0Y2hlczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsIFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wibWF0Y2hlc1wiLCBbJGjNj19hID0+IChtYXRjaGVzID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuY29uc3R7aXNGcm96ZW59PU9iamVjdDtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cblxuY29uc3QgICAgICAgIFVwZ3JhZGVEaXNjb25uZWN0aW9uU2hhcGU9aGFyZGVuKHtcbm5hbWU6J3ZhdFVwZ3JhZGVkJyxcbnVwZ3JhZGVNZXNzYWdlOk0uc3RyaW5nKCksXG5pbmNhcm5hdGlvbk51bWJlcjpNLm51bWJlcigpfSk7XG5cblxuLypcblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5VcGdyYWRlRGlzY29ubmVjdGlvblNoYXBlKFVwZ3JhZGVEaXNjb25uZWN0aW9uU2hhcGUpO1xuY29uc3QgICAgICAgIG1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbj0odXBncmFkZU1lc3NhZ2UsdG9JbmNhcm5hdGlvbk51bWJlcik9PlxuaGFyZGVuKHtcbm5hbWU6J3ZhdFVwZ3JhZGVkJyxcbnVwZ3JhZGVNZXNzYWdlLFxuaW5jYXJuYXRpb25OdW1iZXI6dG9JbmNhcm5hdGlvbk51bWJlcn0pOyRozY9fb25jZS5tYWtlVXBncmFkZURpc2Nvbm5lY3Rpb24obWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uKTtcblxuaGFyZGVuKG1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbik7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGlzVXBncmFkZURpc2Nvbm5lY3Rpb249KHJlYXNvbik9PlxucmVhc29uIT1udWxsJiYvL1xuaXNGcm96ZW4ocmVhc29uKSYmXG5tYXRjaGVzKHJlYXNvbixVcGdyYWRlRGlzY29ubmVjdGlvblNoYXBlKTskaM2PX29uY2UuaXNVcGdyYWRlRGlzY29ubmVjdGlvbihpc1VwZ3JhZGVEaXNjb25uZWN0aW9uKTtcbmhhcmRlbihpc1VwZ3JhZGVEaXNjb25uZWN0aW9uKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBpc0FiYW5kb25lZEVycm9yPShyZWFzb24pPT5cbnJlYXNvbiE9bnVsbCYmLy9cbmlzRnJvemVuKHJlYXNvbikmJlxubWF0Y2hlcyhyZWFzb24sTS5lcnJvcigpKSYmXG4vL1xuLy9cbnJlYXNvbi5tZXNzYWdlPT09J3ZhdCB0ZXJtaW5hdGVkJzskaM2PX29uY2UuaXNBYmFuZG9uZWRFcnJvcihpc0FiYW5kb25lZEVycm9yKTtcbmhhcmRlbihpc0FiYW5kb25lZEVycm9yKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlVwZ3JhZGVEaXNjb25uZWN0aW9uU2hhcGUiOlsiVXBncmFkZURpc2Nvbm5lY3Rpb25TaGFwZSJdLCJtYWtlVXBncmFkZURpc2Nvbm5lY3Rpb24iOlsibWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uIl0sImlzVXBncmFkZURpc2Nvbm5lY3Rpb24iOlsiaXNVcGdyYWRlRGlzY29ubmVjdGlvbiJdLCJpc0FiYW5kb25lZEVycm9yIjpbImlzQWJhbmRvbmVkRXJyb3IiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAEo7iXzYIAAA2CAAAOQAAAEBhZ29yaWMvbm90aWZpZXItdjAuNy4wLXUxOS4yL3NyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiLCIuL3N1YnNjcmliZS5qcyJdLCJleHBvcnRzIjpbIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIiwib2JzZXJ2ZUl0ZXJhdGlvbiIsIm9ic2VydmVJdGVyYXRvciIsIm9ic2VydmVOb3RpZmllciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IEUsc3Vic2NyaWJlTGF0ZXN0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsIFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCIuL3N1YnNjcmliZS5qc1wiLCBbW1wic3Vic2NyaWJlTGF0ZXN0XCIsIFskaM2PX2EgPT4gKHN1YnNjcmliZUxhdGVzdCA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cbi8qXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXI9c3Vic2NyaWJlTGF0ZXN0O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyKG1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyKTtcbmNvbnN0ICAgICAgICBvYnNlcnZlSXRlcmF0b3I9KGFzeW5jSXRlcmF0b3JQLGl0ZXJhdGlvbk9ic2VydmVyKT0+e1xucmV0dXJuIG5ldyBQcm9taXNlKChhY2ssb2JzZXJ2ZXJFcnJvcik9PntcbmNvbnN0IHJlY3VyPSgpPT57XG5FLndoZW4oXG5FKGFzeW5jSXRlcmF0b3JQKS5uZXh0KCksXG4oe3ZhbHVlLGRvbmV9KT0+e1xuaWYoZG9uZSl7XG5pdGVyYXRpb25PYnNlcnZlci5maW5pc2gmJml0ZXJhdGlvbk9ic2VydmVyLmZpbmlzaCh2YWx1ZSk7XG5hY2sodW5kZWZpbmVkKTtcbiB9ZWxzZXtcbml0ZXJhdGlvbk9ic2VydmVyLnVwZGF0ZVN0YXRlJiZcbml0ZXJhdGlvbk9ic2VydmVyLnVwZGF0ZVN0YXRlKHZhbHVlKTtcbnJlY3VyKCk7XG4gfVxuIH0sXG4ocmVhc29uKT0+e1xuaXRlcmF0aW9uT2JzZXJ2ZXIuZmFpbCYmaXRlcmF0aW9uT2JzZXJ2ZXIuZmFpbChyZWFzb24pO1xuYWNrKHVuZGVmaW5lZCk7XG4gfSkuXG5jYXRjaChvYnNlcnZlckVycm9yKTtcbiB9O1xucmVjdXIoKTtcbiB9KTtcbiB9O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLm9ic2VydmVJdGVyYXRvcihvYnNlcnZlSXRlcmF0b3IpO1xuY29uc3QgICAgICAgIG9ic2VydmVJdGVyYXRpb249KGFzeW5jSXRlcmFibGVQLGl0ZXJhdGlvbk9ic2VydmVyKT0+e1xuY29uc3QgaXRlcmF0b3JQPUUoYXN5bmNJdGVyYWJsZVApW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xucmV0dXJuIG9ic2VydmVJdGVyYXRvcihpdGVyYXRvclAsaXRlcmF0aW9uT2JzZXJ2ZXIpO1xuIH07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2Uub2JzZXJ2ZUl0ZXJhdGlvbihvYnNlcnZlSXRlcmF0aW9uKTtcbmNvbnN0ICAgICAgICBvYnNlcnZlTm90aWZpZXI9KG5vdGlmaWVyUCxpdGVyYXRpb25PYnNlcnZlcik9Plxub2JzZXJ2ZUl0ZXJhdGlvbihzdWJzY3JpYmVMYXRlc3Qobm90aWZpZXJQKSxpdGVyYXRpb25PYnNlcnZlcik7JGjNj19vbmNlLm9ic2VydmVOb3RpZmllcihvYnNlcnZlTm90aWZpZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiOlsibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiXSwib2JzZXJ2ZUl0ZXJhdG9yIjpbIm9ic2VydmVJdGVyYXRvciJdLCJvYnNlcnZlSXRlcmF0aW9uIjpbIm9ic2VydmVJdGVyYXRpb24iXSwib2JzZXJ2ZU5vdGlmaWVyIjpbIm9ic2VydmVOb3RpZmllciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACgC8uyDAgAAAwIAAAqAAAAQGFnb3JpYy9ub3RpZmllci12MC43LjAtdTE5LjIvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vcHVibGlzaC1raXQuanMiLCIuL3N1YnNjcmliZS5qcyIsIi4vbm90aWZpZXIuanMiLCIuL3N1YnNjcmliZXIuanMiLCIuL3RvcGljLmpzIiwiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyIsIi4vc3RvcmVzdWIuanMiLCIuL3N0b3JlZC1ub3RpZmllci5qcyIsIi4vdHlwZXMtaW5kZXguanMiXSwiZXhwb3J0cyI6WyJtYWtlTm90aWZpZXJLaXQiLCJtYWtlTm90aWZpZXJLaXQiLCJtYWtlU3Vic2NyaXB0aW9uS2l0IiwibWFrZVN1YnNjcmlwdGlvbktpdCIsIm9ic2VydmVJdGVyYXRvciIsIm9ic2VydmVJdGVyYXRvciIsInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCIsInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCIsInN1YnNjcmliZUxhdGVzdCIsInN1YnNjcmliZUxhdGVzdCIsbnVsbF0sInJlZXhwb3J0cyI6WyIuL3N0b3JlZC1ub3RpZmllci5qcyIsIi4vc3RvcmVzdWIuanMiLCIuL3R5cGVzLWluZGV4LmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaM2PX2ltcG9ydHMoW1tcIi4vcHVibGlzaC1raXQuanNcIiwgW11dLFtcIi4vc3Vic2NyaWJlLmpzXCIsIFtdXSxbXCIuL25vdGlmaWVyLmpzXCIsIFtdXSxbXCIuL3N1YnNjcmliZXIuanNcIiwgW11dLFtcIi4vdG9waWMuanNcIiwgW11dLFtcIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanNcIiwgW11dLFtcIi4vc3RvcmVzdWIuanNcIiwgW11dLFtcIi4vc3RvcmVkLW5vdGlmaWVyLmpzXCIsIFtdXSxbXCIuL3R5cGVzLWluZGV4LmpzXCIsIFtdXV0pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9wdWJsaXNoLWtpdC5qcyI6W1sibWFrZVB1Ymxpc2hLaXQiLCJtYWtlUHVibGlzaEtpdCJdLFsicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0IiwicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0Il0sWyJGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclNoYXBlIiwiRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSJdLFsiSXRlcmFibGVFYWNoVG9waWNJIiwiSXRlcmFibGVFYWNoVG9waWNJIl0sWyJJdGVyYWJsZUxhdGVzdFRvcGljSSIsIkl0ZXJhYmxlTGF0ZXN0VG9waWNJIl0sWyJTdWJzY3JpYmVyU2hhcGUiLCJTdWJzY3JpYmVyU2hhcGUiXV0sIi4vc3Vic2NyaWJlLmpzIjpbWyJzdWJzY3JpYmVFYWNoIiwic3Vic2NyaWJlRWFjaCJdLFsic3Vic2NyaWJlTGF0ZXN0Iiwic3Vic2NyaWJlTGF0ZXN0Il1dLCIuL25vdGlmaWVyLmpzIjpbWyJtYWtlTm90aWZpZXIiLCJtYWtlTm90aWZpZXIiXSxbIm1ha2VOb3RpZmllcktpdCIsIm1ha2VOb3RpZmllcktpdCJdLFsibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiLCJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSJdLFsibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiLCJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciJdXSwiLi9zdWJzY3JpYmVyLmpzIjpbWyJtYWtlU3Vic2NyaXB0aW9uIiwibWFrZVN1YnNjcmlwdGlvbiJdLFsibWFrZVN1YnNjcmlwdGlvbktpdCIsIm1ha2VTdWJzY3JpcHRpb25LaXQiXV0sIi4vdG9waWMuanMiOltbIm1ha2VQaW5uZWRIaXN0b3J5VG9waWMiLCJtYWtlUGlubmVkSGlzdG9yeVRvcGljIl1dLCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIjpbWyJvYnNlcnZlTm90aWZpZXIiLCJvYnNlcnZlTm90aWZpZXIiXSxbIm9ic2VydmVJdGVyYXRvciIsIm9ic2VydmVJdGVyYXRvciJdLFsib2JzZXJ2ZUl0ZXJhdGlvbiIsIm9ic2VydmVJdGVyYXRpb24iXSxbIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIiwibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPOeblugEAAAoBAAAC0AAABAYWdvcmljL25vdGlmaWVyLXYwLjcuMC11MTkuMi9zcmMvbm90aWZpZXIuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZmFyIiwiLi9wdWJsaXNoLWtpdC5qcyIsIi4vc3Vic2NyaWJlLmpzIl0sImV4cG9ydHMiOlsibWFrZU5vdGlmaWVyIiwibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiLCJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciIsIm1ha2VOb3RpZmllcktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IGFzc2VydCxFLEZhcixtYWtlUHVibGlzaEtpdCxzdWJzY3JpYmVMYXRlc3Q7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcImFzc2VydFwiLCBbJGjNj19hID0+IChhc3NlcnQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXSxbXCJGYXJcIiwgWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiLi9wdWJsaXNoLWtpdC5qc1wiLCBbW1wibWFrZVB1Ymxpc2hLaXRcIiwgWyRozY9fYSA9PiAobWFrZVB1Ymxpc2hLaXQgPSAkaM2PX2EpXV1dXSxbXCIuL3N1YnNjcmliZS5qc1wiLCBbW1wic3Vic2NyaWJlTGF0ZXN0XCIsIFskaM2PX2EgPT4gKHN1YnNjcmliZUxhdGVzdCA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cbi8qXG5cblxuICovXG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTm90aWZpZXI9KHNoYXJhYmxlSW50ZXJuYWxzUCk9Pntcbi8qICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBub3RpZmllcj1GYXIoJ25vdGlmaWVyJyx7XG4uLi5zdWJzY3JpYmVMYXRlc3Qoc2hhcmFibGVJbnRlcm5hbHNQKSxcbmdldFVwZGF0ZVNpbmNlOmFzeW5jKHVwZGF0ZUNvdW50KT0+XG5FKHNoYXJhYmxlSW50ZXJuYWxzUCkuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpLFxuXG4vKlxuXG5cblxuXG4gICAgICovXG5nZXRTaGFyYWJsZU5vdGlmaWVySW50ZXJuYWxzOmFzeW5jKCk9PnNoYXJhYmxlSW50ZXJuYWxzUCxcbi8qXG5cblxuXG4gICAgICovXG5nZXRTdG9yZUtleTooKT0+aGFyZGVuKHtub3RpZmllcn0pfSk7XG5cbnJldHVybiBub3RpZmllcjtcbiB9O1xuXG4vKlxuXG5cblxuICovJGjNj19vbmNlLm1ha2VOb3RpZmllcihtYWtlTm90aWZpZXIpO1xuY29uc3QgICAgICAgIG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyPShzdWJzY3JpYmVyKT0+e1xuLypcblxuICAgKi9cbmNvbnN0IGJhc2VOb3RpZmllcj1oYXJkZW4oe1xuZ2V0VXBkYXRlU2luY2U6KHVwZGF0ZUNvdW50PXVuZGVmaW5lZCk9PlxuRShzdWJzY3JpYmVyKS5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCl9KTtcblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3Qgbm90aWZpZXI9RmFyKCdub3RpZmllcicse1xuLi4ubWFrZU5vdGlmaWVyKGJhc2VOb3RpZmllciksXG4uLi5iYXNlTm90aWZpZXJ9KTtcblxucmV0dXJuIG5vdGlmaWVyO1xuIH07JGjNj19vbmNlLm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyKG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyKTtcbmhhcmRlbihtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcik7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTm90aWZpZXJLaXQ9KC4uLmluaXRpYWxTdGF0ZUFycik9Pntcbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0e3B1Ymxpc2hlcixzdWJzY3JpYmVyfT1tYWtlUHVibGlzaEtpdCgpO1xuXG5jb25zdCBub3RpZmllcj1tYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcihzdWJzY3JpYmVyKTtcblxuY29uc3QgdXBkYXRlcj1GYXIoJ3VwZGF0ZXInLHtcbnVwZGF0ZVN0YXRlOihzdGF0ZSk9PnB1Ymxpc2hlci5wdWJsaXNoKHN0YXRlKSxcbmZpbmlzaDooY29tcGxldGlvbik9PnB1Ymxpc2hlci5maW5pc2goY29tcGxldGlvbiksXG5mYWlsOihyZWFzb24pPT5wdWJsaXNoZXIuZmFpbChyZWFzb24pfSk7XG5cblxuYXNzZXJ0KGluaXRpYWxTdGF0ZUFyci5sZW5ndGg8PTEsJ3RvbyBtYW55IGFyZ3VtZW50cycpO1xuaWYoaW5pdGlhbFN0YXRlQXJyLmxlbmd0aD09PTEpe1xudXBkYXRlci51cGRhdGVTdGF0ZShpbml0aWFsU3RhdGVBcnJbMF0pO1xuIH1cblxuLy9cbi8vXG5yZXR1cm4gaGFyZGVuKHtub3RpZmllcix1cGRhdGVyfSk7XG4gfTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLm1ha2VOb3RpZmllcktpdChtYWtlTm90aWZpZXJLaXQpO1xuY29uc3QgICAgICAgIG1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlPShhc3luY0l0ZXJhYmxlUCk9PntcbmNvbnN0IGl0ZXJhdG9yUD1FKGFzeW5jSXRlcmFibGVQKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xubGV0IG9wdE5leHRQcm9taXNlO1xubGV0IGN1cnJlbnRVcGRhdGVDb3VudD0wbjtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmxldCBjdXJyZW50UmVzcG9uc2U7XG5sZXQgZmluYWw9ZmFsc2U7XG5cbi8qXG5cbiAgICovXG5jb25zdCBiYXNlTm90aWZpZXI9RmFyKCdiYXNlTm90aWZpZXInLHtcbmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50PS0xbil7XG5pZih1cGRhdGVDb3VudDxjdXJyZW50VXBkYXRlQ291bnQpe1xuaWYoY3VycmVudFJlc3BvbnNlKXtcbnJldHVybiBQcm9taXNlLnJlc29sdmUoY3VycmVudFJlc3BvbnNlKTtcbiB9XG4gfWVsc2UgaWYodXBkYXRlQ291bnQhPT1jdXJyZW50VXBkYXRlQ291bnQpe1xudGhyb3cgRXJyb3IoXG4nZ2V0VXBkYXRlU2luY2UgYXJndW1lbnQgbXVzdCBiZSBhIHByZXZpb3VzbHktaXNzdWVkIHVwZGF0ZUNvdW50LicpO1xuXG4gfVxuXG4vL1xuaWYoZmluYWwpe1xuYXNzZXJ0KGN1cnJlbnRSZXNwb25zZSE9PXVuZGVmaW5lZCk7XG5yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGN1cnJlbnRSZXNwb25zZSk7XG4gfVxuaWYoIW9wdE5leHRQcm9taXNlKXtcbmNvbnN0IG5leHRJdGVyUmVzdWx0UD1FKGl0ZXJhdG9yUCkubmV4dCgpO1xub3B0TmV4dFByb21pc2U9RS53aGVuKFxubmV4dEl0ZXJSZXN1bHRQLFxuKHtkb25lLHZhbHVlfSk9PntcbmFzc2VydCghZmluYWwpO1xuaWYoZG9uZSl7XG5maW5hbD10cnVlO1xuIH1cbmN1cnJlbnRVcGRhdGVDb3VudCs9MW47XG5jdXJyZW50UmVzcG9uc2U9aGFyZGVuKHtcbnZhbHVlLFxudXBkYXRlQ291bnQ6ZG9uZT91bmRlZmluZWQ6Y3VycmVudFVwZGF0ZUNvdW50fSk7XG5cbm9wdE5leHRQcm9taXNlPXVuZGVmaW5lZDtcbnJldHVybiBjdXJyZW50UmVzcG9uc2U7XG4gfSxcbihfcmVhc29uKT0+e1xuZmluYWw9dHJ1ZTtcbmN1cnJlbnRSZXNwb25zZT1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xubmV4dEl0ZXJSZXN1bHRQO1xub3B0TmV4dFByb21pc2U9dW5kZWZpbmVkO1xucmV0dXJuIGN1cnJlbnRSZXNwb25zZTtcbiB9KTtcblxuIH1cbnJldHVybiBvcHROZXh0UHJvbWlzZTtcbiB9fSk7XG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IG5vdGlmaWVyPUZhcignbm90aWZpZXInLHtcbi8vXG4vL1xuLi4ubWFrZU5vdGlmaWVyKGJhc2VOb3RpZmllciksXG4uLi5iYXNlTm90aWZpZXJ9KTtcblxucmV0dXJuIG5vdGlmaWVyO1xuIH07JGjNj19vbmNlLm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlKG1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlKTtcbmhhcmRlbihtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTm90aWZpZXIiOlsibWFrZU5vdGlmaWVyIl0sIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIjpbIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIl0sIm1ha2VOb3RpZmllcktpdCI6WyJtYWtlTm90aWZpZXJLaXQiXSwibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiOlsibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAJtJ+3FErAABRKwAAMAAAAEBhZ29yaWMvbm90aWZpZXItdjAuNy4wLXUxOS4yL3NyYy9wdWJsaXNoLWtpdC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9mYXIiLCJAZW5kby9wcm9taXNlLWtpdCIsIkBlbmRvL3BhdHRlcm5zIiwiQGFnb3JpYy92YXQtZGF0YSJdLCJleHBvcnRzIjpbIkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUiLCJJdGVyYWJsZUVhY2hUb3BpY0kiLCJJdGVyYWJsZUxhdGVzdFRvcGljSSIsIlB1Ymxpc2hlckkiLCJTdWJzY3JpYmVySSIsIlN1YnNjcmliZXJTaGFwZSIsIlVwZGF0ZUNvdW50U2hhcGUiLCJtYWtlUHVibGlzaEtpdCIsInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCIsInB1Ymxpc2hLaXRJS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgRmFpbCxxLEUsRmFyLG1ha2VQcm9taXNlS2l0LE0sZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkLGNhbkJlRHVyYWJsZSxwcmVwYXJlRXhvQ2xhc3NLaXQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIiwgWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsIFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXSxbXCJGYXJcIiwgWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcIm1ha2VQcm9taXNlS2l0XCIsIFskaM2PX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIk1cIiwgWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWRcIiwgWyRozY9fYSA9PiAoZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wiY2FuQmVEdXJhYmxlXCIsIFskaM2PX2EgPT4gKGNhbkJlRHVyYWJsZSA9ICRozY9fYSldXSxbXCJwcmVwYXJlRXhvQ2xhc3NLaXRcIiwgWyRozY9fYSA9PiAocHJlcGFyZUV4b0NsYXNzS2l0ID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuLypcblxuXG4gKi9cblxuY29uc3Qgc2luaz0oKT0+eyB9O1xuY29uc3QgbWFrZVF1aWV0UmVqZWN0aW9uPShyZWFzb24pPT57XG5jb25zdCByZWplY3Rpb249aGFyZGVuKFByb21pc2UucmVqZWN0KHJlYXNvbikpO1xudm9pZCBFLndoZW4ocmVqZWN0aW9uLHNpbmssc2luayk7XG5yZXR1cm4gcmVqZWN0aW9uO1xuIH07XG5jb25zdCB0b29GYXJSZWplY3Rpb249bWFrZVF1aWV0UmVqZWN0aW9uKFxuaGFyZGVuKEVycm9yKCdDYW5ub3QgcmVhZCBwYXN0IGVuZCBvZiBpdGVyYXRpb24uJykpKTtcblxuXG5jb25zdCAgICAgICAgUHVibGlzaGVyST1NLmludGVyZmFjZSgnUHVibGlzaGVyJyx7XG5wdWJsaXNoOk0uY2FsbChNLmFueSgpKS5yZXR1cm5zKCksXG5maW5pc2g6TS5jYWxsKE0uYW55KCkpLnJldHVybnMoKSxcbmZhaWw6TS5jYWxsKE0uYW55KCkpLnJldHVybnMoKX0pO1xuXG5cbi8vXG4kaM2PX29uY2UuUHVibGlzaGVySShQdWJsaXNoZXJJKTtjb25zdCBVcGRhdGVDb3VudFNoYXBlPU0ub3IoTS5iaWdpbnQoKSxNLm51bWJlcigpKTskaM2PX29uY2UuVXBkYXRlQ291bnRTaGFwZShVcGRhdGVDb3VudFNoYXBlKTtcbmNvbnN0ICAgICAgICBTdWJzY3JpYmVyST1NLmludGVyZmFjZSgnU3Vic2NyaWJlcicse1xuc3Vic2NyaWJlQWZ0ZXI6TS5jYWxsKCkub3B0aW9uYWwoTS5iaWdpbnQoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG5nZXRVcGRhdGVTaW5jZTpNLmNhbGwoKS5vcHRpb25hbChVcGRhdGVDb3VudFNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKX0pOyRozY9fb25jZS5TdWJzY3JpYmVySShTdWJzY3JpYmVySSk7XG5cbmNvbnN0ICAgICAgICBwdWJsaXNoS2l0SUtpdD1oYXJkZW4oe1xucHVibGlzaGVyOlB1Ymxpc2hlckksXG5zdWJzY3JpYmVyOlN1YnNjcmliZXJJfSk7JGjNj19vbmNlLnB1Ymxpc2hLaXRJS2l0KHB1Ymxpc2hLaXRJS2l0KTtcblxuXG5jb25zdCAgICAgICAgRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZT1NLmludGVyZmFjZShcbidGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvcicsXG57XG5mb3JrOk0uY2FsbCgpLnJldHVybnMoTS5hbnkoKSksXG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOk0uY2FsbCgpLnJldHVybnMoTS5hbnkoKSksLy9cbm5leHQ6TS5jYWxsV2hlbigpLnJldHVybnMoTS5hbnkoKSl9KTskaM2PX29uY2UuRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZShGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclNoYXBlKTtcblxuXG5cbmNvbnN0ICAgICAgICBJdGVyYWJsZUVhY2hUb3BpY0k9TS5pbnRlcmZhY2UoJ0l0ZXJhYmxlRWFjaFRvcGljJyx7XG5zdWJzY3JpYmVBZnRlcjpcbmdldEludGVyZmFjZUd1YXJkUGF5bG9hZChTdWJzY3JpYmVySSkubWV0aG9kR3VhcmRzLnN1YnNjcmliZUFmdGVyLFxuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTpNLmNhbGwoKS5yZXR1cm5zKFxuTS5yZW1vdGFibGUoJ0ZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yJykpfSk7JGjNj19vbmNlLkl0ZXJhYmxlRWFjaFRvcGljSShJdGVyYWJsZUVhY2hUb3BpY0kpO1xuXG5cblxuY29uc3QgICAgICAgIEl0ZXJhYmxlTGF0ZXN0VG9waWNJPU0uaW50ZXJmYWNlKCdJdGVyYWJsZUxhdGVzdFRvcGljJyx7XG5nZXRVcGRhdGVTaW5jZTpcbmdldEludGVyZmFjZUd1YXJkUGF5bG9hZChTdWJzY3JpYmVySSkubWV0aG9kR3VhcmRzLmdldFVwZGF0ZVNpbmNlLFxuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTpNLmNhbGwoKS5yZXR1cm5zKFxuTS5yZW1vdGFibGUoJ0ZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yJykpfSk7XG5cblxuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UuSXRlcmFibGVMYXRlc3RUb3BpY0koSXRlcmFibGVMYXRlc3RUb3BpY0kpO1xuY29uc3Qgd2Vha01lbW9pemVVbmFyeT0oZm4pPT57XG5jb25zdCBjYWNoZT1uZXcgV2Vha01hcCgpO1xucmV0dXJuKGFyZyk9Pntcbi8qICAgICAgICAgICAgICAgICAqL1xuY29uc3Qgb2FyZz1hcmc7XG5pZihjYWNoZS5oYXMob2FyZykpe1xucmV0dXJuIGNhY2hlLmdldChvYXJnKTtcbiB9XG5jb25zdCByZXN1bHQ9Zm4oYXJnKTtcbmNhY2hlLnNldChvYXJnLHJlc3VsdCk7XG5yZXR1cm4gcmVzdWx0O1xuIH07XG4gfTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgbWFrZVVwZGF0ZVJlY29yZEZyb21QdWJsaWNhdGlvblJlY29yZD0ocmVjb3JkKT0+e1xuY29uc3R7XG5oZWFkOnt2YWx1ZSxkb25lfSxcbnB1Ymxpc2hDb3VudH09XG5yZWNvcmQ7XG5pZihkb25lKXtcbi8vXG5yZXR1cm4gaGFyZGVuKHt2YWx1ZSx1cGRhdGVDb3VudDp1bmRlZmluZWR9KTtcbiB9XG5yZXR1cm4gaGFyZGVuKHt2YWx1ZSx1cGRhdGVDb3VudDpwdWJsaXNoQ291bnR9KTtcbiB9O1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZVB1Ymxpc2hLaXQ9KCk9Pntcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5sZXQgdGFpbFA7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmxldCB0YWlsUjtcbih7cHJvbWlzZTp0YWlsUCxyZXNvbHZlOnRhaWxSfT1tYWtlUHJvbWlzZUtpdCgpKTtcblxubGV0IGN1cnJlbnRQdWJsaXNoQ291bnQ9MG47XG5sZXQgY3VycmVudFA9dGFpbFA7XG5jb25zdCBhZHZhbmNlQ3VycmVudD0oZG9uZSx2YWx1ZSxyZWplY3Rpb24pPT57XG5pZih0YWlsUj09PXVuZGVmaW5lZCl7XG50aHJvdyBFcnJvcignQ2Fubm90IHVwZGF0ZSBzdGF0ZSBhZnRlciB0ZXJtaW5hdGlvbi4nKTtcbiB9XG5cbmN1cnJlbnRQdWJsaXNoQ291bnQrPTFuO1xuY3VycmVudFA9dGFpbFA7XG5jb25zdCByZXNvbHZlQ3VycmVudD10YWlsUjtcblxuaWYoZG9uZSl7XG50YWlsUD10b29GYXJSZWplY3Rpb247XG50YWlsUj11bmRlZmluZWQ7XG4gfWVsc2V7XG4oe3Byb21pc2U6dGFpbFAscmVzb2x2ZTp0YWlsUn09bWFrZVByb21pc2VLaXQoKSk7XG4gfVxuXG5pZihyZWplY3Rpb24pe1xucmVzb2x2ZUN1cnJlbnQocmVqZWN0aW9uKTtcbiB9ZWxzZXtcbnJlc29sdmVDdXJyZW50KFxuaGFyZGVuKHtcbmhlYWQ6e3ZhbHVlLGRvbmV9LFxucHVibGlzaENvdW50OmN1cnJlbnRQdWJsaXNoQ291bnQsXG50YWlsOnRhaWxQfSkpO1xuXG5cbiB9XG4gfTtcblxuY29uc3QgbWFrZU1lbW9pemVkVXBkYXRlUmVjb3JkPXdlYWtNZW1vaXplVW5hcnkoXG5tYWtlVXBkYXRlUmVjb3JkRnJvbVB1YmxpY2F0aW9uUmVjb3JkKTtcblxuXG4vKlxuXG5cbiAgICovXG5jb25zdCBzdWJzY3JpYmVyPUZhcignU3Vic2NyaWJlcicse1xuc3Vic2NyaWJlQWZ0ZXI6KHB1Ymxpc2hDb3VudD0tMW4pPT57XG5hc3NlcnQudHlwZW9mKHB1Ymxpc2hDb3VudCwnYmlnaW50Jyk7XG5pZihwdWJsaXNoQ291bnQ9PT1jdXJyZW50UHVibGlzaENvdW50KXtcbnJldHVybiB0YWlsUDtcbiB9ZWxzZSBpZihwdWJsaXNoQ291bnQ8Y3VycmVudFB1Ymxpc2hDb3VudCl7XG5yZXR1cm4gY3VycmVudFA7XG4gfWVsc2V7XG50aHJvdyBFcnJvcihcbidzdWJzY3JpYmVBZnRlciBhcmd1bWVudCBtdXN0IGJlIGEgcHJldmlvdXNseS1pc3N1ZWQgcHVibGlzaENvdW50LicpO1xuXG4gfVxuIH0sXG5nZXRVcGRhdGVTaW5jZToodXBkYXRlQ291bnQpPT57XG5pZih1cGRhdGVDb3VudD09PXVuZGVmaW5lZCl7XG5yZXR1cm4gc3Vic2NyaWJlci5zdWJzY3JpYmVBZnRlcigpLnRoZW4obWFrZU1lbW9pemVkVXBkYXRlUmVjb3JkKTtcbiB9XG51cGRhdGVDb3VudD1CaWdJbnQodXBkYXRlQ291bnQpO1xucmV0dXJuKFxuc3Vic2NyaWJlclxuLy9cbi8vXG4vL1xuLnN1YnNjcmliZUFmdGVyKHVwZGF0ZUNvdW50KVxuLy9cbi8vXG4udGhlbigoKT0+c3Vic2NyaWJlci5nZXRVcGRhdGVTaW5jZSgpKSk7XG5cbiB9fSk7XG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBwdWJsaXNoZXI9RmFyKCdQdWJsaXNoZXInLHtcbnB1Ymxpc2g6KHZhbHVlKT0+e1xuYWR2YW5jZUN1cnJlbnQoZmFsc2UsdmFsdWUpO1xuIH0sXG5maW5pc2g6KGZpbmFsVmFsdWUpPT57XG5hZHZhbmNlQ3VycmVudCh0cnVlLGZpbmFsVmFsdWUpO1xuIH0sXG5mYWlsOihyZWFzb24pPT57XG5hZHZhbmNlQ3VycmVudCh0cnVlLHVuZGVmaW5lZCxtYWtlUXVpZXRSZWplY3Rpb24ocmVhc29uKSk7XG4gfX0pO1xuXG5yZXR1cm4gaGFyZGVuKHtwdWJsaXNoZXIsc3Vic2NyaWJlcn0pO1xuIH07JGjNj19vbmNlLm1ha2VQdWJsaXNoS2l0KG1ha2VQdWJsaXNoS2l0KTtcbmhhcmRlbihtYWtlUHVibGlzaEtpdCk7XG5cbmNvbnN0IER1cmFibGVQdWJsaXNoS2l0U3RhdGVTaGFwZT1oYXJkZW4oe1xudmFsdWVEdXJhYmlsaXR5Ok0uYW55KCksXG5wdWJsaXNoQ291bnQ6TS5hbnkoKSxcbnN0YXR1czpNLmFueSgpLFxuaGFzVmFsdWU6TS5hbnkoKSxcbnZhbHVlOk0uYW55KCl9KTtcblxuXG4vL1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBpbml0RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZT0ob3B0aW9ucz17fSk9PntcbmNvbnN0e3ZhbHVlRHVyYWJpbGl0eT0nbWFuZGF0b3J5J309b3B0aW9ucztcbmFzc2VydC5lcXVhbCh2YWx1ZUR1cmFiaWxpdHksJ21hbmRhdG9yeScpO1xucmV0dXJue1xuLy9cbnZhbHVlRHVyYWJpbGl0eSxcblxuLy9cbnB1Ymxpc2hDb3VudDowbixcbnN0YXR1czonbGl2ZScsLy9cblxuLy9cbi8vXG4vL1xuaGFzVmFsdWU6ZmFsc2UsXG52YWx1ZTp1bmRlZmluZWR9O1xuXG4gfTtcblxuLy9cbi8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qXG5cblxuICovXG5jb25zdCBnZXRFcGhlbWVyYWxLZXk9KGZhY2V0cyk9PmZhY2V0cy5wdWJsaXNoZXI7XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgZHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhPW5ldyBXZWFrTWFwKCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBwcm92aWRlQ3VycmVudFA9KHN0YXRlLGZhY2V0cyx0YWlsKT0+e1xuY29uc3QgZXBoZW1lcmFsS2V5PWdldEVwaGVtZXJhbEtleShmYWNldHMpO1xuY29uc3QgZm91bmREYXRhPWR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YS5nZXQoZXBoZW1lcmFsS2V5KTtcbmNvbnN0IGN1cnJlbnRQPWZvdW5kRGF0YSYmZm91bmREYXRhLmN1cnJlbnRQO1xuaWYoY3VycmVudFApe1xucmV0dXJuIGN1cnJlbnRQO1xuIH1cblxuY29uc3R7cHVibGlzaENvdW50LHN0YXR1cyxoYXNWYWx1ZSx2YWx1ZX09c3RhdGU7XG5pZighaGFzVmFsdWUpe1xuYXNzZXJ0KHN0YXR1cz09PSdsaXZlJyk7XG5yZXR1cm4gdGFpbDtcbiB9XG5pZihzdGF0dXM9PT0nbGl2ZSd8fHN0YXR1cz09PSdmaW5pc2hlZCcpe1xuY29uc3QgY2VsbD1oYXJkZW4oe1xuaGVhZDp7dmFsdWUsZG9uZTpzdGF0dXMhPT0nbGl2ZSd9LFxucHVibGlzaENvdW50LFxudGFpbH0pO1xuXG5yZXR1cm4gRS5yZXNvbHZlKGNlbGwpO1xuIH1lbHNlIGlmKHN0YXR1cz09PSdmYWlsZWQnKXtcbnJldHVybiBtYWtlUXVpZXRSZWplY3Rpb24odmFsdWUpO1xuIH1lbHNle1xudGhyb3cgRmFpbCBgSW52YWxpZCBkdXJhYmxlIHByb21pc2Uga2l0IHN0YXR1czogJHtxKHN0YXR1cyl9YDtcbiB9XG4gfTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHByb3ZpZGVEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGE9KHN0YXRlLGZhY2V0cyk9PntcbmNvbnN0IGVwaGVtZXJhbEtleT1nZXRFcGhlbWVyYWxLZXkoZmFjZXRzKTtcbmNvbnN0IGZvdW5kRGF0YT1kdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEuZ2V0KGVwaGVtZXJhbEtleSk7XG5pZihmb3VuZERhdGEpe1xucmV0dXJuIGZvdW5kRGF0YTtcbiB9XG5cbmNvbnN0e3N0YXR1c309c3RhdGU7XG5sZXQgdGFpbFA7XG5sZXQgdGFpbFI7XG5pZihzdGF0dXM9PT0nbGl2ZScpe1xuKHtwcm9taXNlOnRhaWxQLHJlc29sdmU6dGFpbFJ9PW1ha2VQcm9taXNlS2l0KCkpO1xudm9pZCBFLndoZW4odGFpbFAsc2luayxzaW5rKTtcbiB9ZWxzZSBpZihzdGF0dXM9PT0nZmluaXNoZWQnfHxzdGF0dXM9PT0nZmFpbGVkJyl7XG50YWlsUD10b29GYXJSZWplY3Rpb247XG4gfWVsc2V7XG50aHJvdyBGYWlsIGBJbnZhbGlkIGR1cmFibGUgcHJvbWlzZSBraXQgc3RhdHVzOiAke3Eoc3RhdHVzKX1gO1xuIH1cbi8vXG5jb25zdCBvYmo9aGFyZGVuKHtjdXJyZW50UDp1bmRlZmluZWQsdGFpbFAsdGFpbFJ9KTtcbmR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YS5zZXQoZXBoZW1lcmFsS2V5LG9iaik7XG5yZXR1cm4gb2JqO1xuIH07XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBhZHZhbmNlRHVyYWJsZVB1Ymxpc2hLaXQ9KGNvbnRleHQsdmFsdWUsdGFyZ2V0U3RhdHVzPSdsaXZlJyk9PntcbmNvbnN0e3N0YXRlLGZhY2V0c309Y29udGV4dDtcbmNvbnN0e3ZhbHVlRHVyYWJpbGl0eSxzdGF0dXN9PXN0YXRlO1xuaWYoc3RhdHVzIT09J2xpdmUnKXtcbnRocm93IEVycm9yKCdDYW5ub3QgdXBkYXRlIHN0YXRlIGFmdGVyIHRlcm1pbmF0aW9uLicpO1xuIH1cbmNvbnN0IGRvbmU9dGFyZ2V0U3RhdHVzIT09J2xpdmUnO1xuaWYoZG9uZXx8dmFsdWVEdXJhYmlsaXR5PT09J21hbmRhdG9yeScpe1xuY2FuQmVEdXJhYmxlKHZhbHVlKXx8RmFpbCBgQ2Fubm90IGFjY2VwdCBub24tZHVyYWJsZSB2YWx1ZTogJHt2YWx1ZX1gO1xuIH1cbmNvbnN0e3RhaWxQOm9sZFRhaWxQLHRhaWxSOnJlc29sdmVPbGRUYWlsfT1cbnByb3ZpZGVEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEoc3RhdGUsZmFjZXRzKTtcbmFzc2VydC50eXBlb2YocmVzb2x2ZU9sZFRhaWwsJ2Z1bmN0aW9uJyk7XG5cbmNvbnN0IHB1Ymxpc2hDb3VudD1zdGF0ZS5wdWJsaXNoQ291bnQrMW47XG5zdGF0ZS5wdWJsaXNoQ291bnQ9cHVibGlzaENvdW50O1xuXG5sZXQgdGFpbFA7XG5sZXQgdGFpbFI7XG5pZihkb25lKXtcbnN0YXRlLnN0YXR1cz10YXJnZXRTdGF0dXM7XG50YWlsUD10b29GYXJSZWplY3Rpb247XG50YWlsUj11bmRlZmluZWQ7XG4gfWVsc2V7XG4oe3Byb21pc2U6dGFpbFAscmVzb2x2ZTp0YWlsUn09bWFrZVByb21pc2VLaXQoKSk7XG52b2lkIEUud2hlbih0YWlsUCxzaW5rLHNpbmspO1xuIH1cblxubGV0IGN1cnJlbnRQO1xuaWYodGFyZ2V0U3RhdHVzPT09J2ZhaWxlZCcpe1xuc3RhdGUuaGFzVmFsdWU9dHJ1ZTtcbnN0YXRlLnZhbHVlPXZhbHVlO1xuY29uc3QgcmVqZWN0aW9uPW1ha2VRdWlldFJlamVjdGlvbih2YWx1ZSk7XG5yZXNvbHZlT2xkVGFpbChyZWplY3Rpb24pO1xuIH1lbHNle1xuLy9cbi8vXG5pZihkb25lfHx2YWx1ZUR1cmFiaWxpdHkhPT0naWdub3JlZCcmJmNhbkJlRHVyYWJsZSh2YWx1ZSkpe1xuc3RhdGUuaGFzVmFsdWU9dHJ1ZTtcbnN0YXRlLnZhbHVlPXZhbHVlO1xuIH1lbHNle1xuc3RhdGUuaGFzVmFsdWU9ZmFsc2U7XG5zdGF0ZS52YWx1ZT11bmRlZmluZWQ7XG4vL1xuY3VycmVudFA9b2xkVGFpbFA7XG4gfVxuXG5yZXNvbHZlT2xkVGFpbChcbmhhcmRlbih7XG5oZWFkOnt2YWx1ZSxkb25lfSxcbnB1Ymxpc2hDb3VudCxcbnRhaWw6dGFpbFB9KSk7XG5cblxuIH1cblxuZHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhLnNldChcbmdldEVwaGVtZXJhbEtleShmYWNldHMpLFxuaGFyZGVuKHtjdXJyZW50UCx0YWlsUCx0YWlsUn0pKTtcblxuIH07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQ9KGJhZ2dhZ2Usa2luZE5hbWUpPT57XG4vL1xuLy9cbmNvbnN0IG1ha2VNZW1vaXplZFVwZGF0ZVJlY29yZD1tYWtlVXBkYXRlUmVjb3JkRnJvbVB1YmxpY2F0aW9uUmVjb3JkO1xuXG5yZXR1cm4gcHJlcGFyZUV4b0NsYXNzS2l0KFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxucHVibGlzaEtpdElLaXQsXG5pbml0RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZSxcbntcbi8vXG4vL1xucHVibGlzaGVyOntcbnB1Ymxpc2godmFsdWUpe1xuYWR2YW5jZUR1cmFibGVQdWJsaXNoS2l0KHRoaXMsdmFsdWUpO1xuIH0sXG5maW5pc2goZmluYWxWYWx1ZSl7XG5hZHZhbmNlRHVyYWJsZVB1Ymxpc2hLaXQodGhpcyxmaW5hbFZhbHVlLCdmaW5pc2hlZCcpO1xuIH0sXG5mYWlsKHJlYXNvbil7XG5hZHZhbmNlRHVyYWJsZVB1Ymxpc2hLaXQodGhpcyxyZWFzb24sJ2ZhaWxlZCcpO1xuIH19LFxuXG5cbi8vXG4vL1xuc3Vic2NyaWJlcjp7XG5zdWJzY3JpYmVBZnRlcihwdWJsaXNoQ291bnQ9LTFuKXtcbmNvbnN0e3N0YXRlLGZhY2V0c309dGhpcztcbmNvbnN0e3B1Ymxpc2hDb3VudDpjdXJyZW50UHVibGlzaENvdW50fT1zdGF0ZTtcbmNvbnN0e2N1cnJlbnRQLHRhaWxQfT1wcm92aWRlRHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhKFxuc3RhdGUsXG5mYWNldHMpO1xuXG5pZihwdWJsaXNoQ291bnQ9PT1jdXJyZW50UHVibGlzaENvdW50KXtcbnJldHVybiB0YWlsUDtcbiB9ZWxzZSBpZihwdWJsaXNoQ291bnQ8Y3VycmVudFB1Ymxpc2hDb3VudCl7XG5yZXR1cm4gY3VycmVudFB8fHByb3ZpZGVDdXJyZW50UChzdGF0ZSxmYWNldHMsdGFpbFApO1xuIH1lbHNle1xudGhyb3cgRXJyb3IoXG4nc3Vic2NyaWJlQWZ0ZXIgYXJndW1lbnQgbXVzdCBiZSBhIHByZXZpb3VzbHktaXNzdWVkIHB1Ymxpc2hDb3VudC4nKTtcblxuIH1cbiB9LFxuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpe1xuY29uc3R7XG5mYWNldHM6e3N1YnNjcmliZXJ9fT1cbnRoaXM7XG5pZih1cGRhdGVDb3VudD09PXVuZGVmaW5lZCl7XG5yZXR1cm4gc3Vic2NyaWJlci5zdWJzY3JpYmVBZnRlcigpLnRoZW4obWFrZU1lbW9pemVkVXBkYXRlUmVjb3JkKTtcbiB9XG51cGRhdGVDb3VudD1CaWdJbnQodXBkYXRlQ291bnQpO1xucmV0dXJuKFxuc3Vic2NyaWJlclxuLy9cbi8vXG4vL1xuLnN1YnNjcmliZUFmdGVyKHVwZGF0ZUNvdW50KVxuLy9cbi8vXG4udGhlbigoKT0+c3Vic2NyaWJlci5nZXRVcGRhdGVTaW5jZSgpKSk7XG5cbiB9fX0sXG5cblxue1xuc3RhdGVTaGFwZTpEdXJhYmxlUHVibGlzaEtpdFN0YXRlU2hhcGV9KTtcblxuXG4gfTskaM2PX29uY2UucHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0KHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCk7XG5oYXJkZW4ocHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0KTtcblxuY29uc3QgICAgICAgIFN1YnNjcmliZXJTaGFwZT1NLnJlbW90YWJsZSgnU3Vic2NyaWJlcicpOyRozY9fb25jZS5TdWJzY3JpYmVyU2hhcGUoU3Vic2NyaWJlclNoYXBlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlB1Ymxpc2hlckkiOlsiUHVibGlzaGVySSJdLCJVcGRhdGVDb3VudFNoYXBlIjpbIlVwZGF0ZUNvdW50U2hhcGUiXSwiU3Vic2NyaWJlckkiOlsiU3Vic2NyaWJlckkiXSwicHVibGlzaEtpdElLaXQiOlsicHVibGlzaEtpdElLaXQiXSwiRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSI6WyJGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclNoYXBlIl0sIkl0ZXJhYmxlRWFjaFRvcGljSSI6WyJJdGVyYWJsZUVhY2hUb3BpY0kiXSwiSXRlcmFibGVMYXRlc3RUb3BpY0kiOlsiSXRlcmFibGVMYXRlc3RUb3BpY0kiXSwibWFrZVB1Ymxpc2hLaXQiOlsibWFrZVB1Ymxpc2hLaXQiXSwicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0IjpbInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCJdLCJTdWJzY3JpYmVyU2hhcGUiOlsiU3Vic2NyaWJlclNoYXBlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADGuTgpACAAAQAgAADQAAABAYWdvcmljL25vdGlmaWVyLXYwLjcuMC11MTkuMi9zcmMvc3RvcmVkLW5vdGlmaWVyLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzIiwiQGVuZG8vZmFyIiwiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyJdLCJleHBvcnRzIjpbIm1ha2VTdG9yZWROb3RpZmllciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IGFzc2VydEFsbERlZmluZWQsbWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSxFLEZhcixvYnNlcnZlTm90aWZpZXI7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJhc3NlcnRBbGxEZWZpbmVkXCIsIFskaM2PX2EgPT4gKGFzc2VydEFsbERlZmluZWQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzXCIsIFtbXCJtYWtlU2VyaWFsaXplVG9TdG9yYWdlXCIsIFskaM2PX2EgPT4gKG1ha2VTZXJpYWxpemVUb1N0b3JhZ2UgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXSxbXCJGYXJcIiwgWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc1wiLCBbW1wib2JzZXJ2ZU5vdGlmaWVyXCIsIFskaM2PX2EgPT4gKG9ic2VydmVOb3RpZmllciA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG4vKlxuXG5cblxuXG4gKi9cblxuLypcblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZVN0b3JlZE5vdGlmaWVyPShub3RpZmllcixzdG9yYWdlTm9kZSxtYXJzaGFsbGVyKT0+e1xuYXNzZXJ0QWxsRGVmaW5lZCh7bm90aWZpZXIsc3RvcmFnZU5vZGUsbWFyc2hhbGxlcn0pO1xuXG5jb25zdCBtYXJzaGFsbFRvU3RvcmFnZT1tYWtlU2VyaWFsaXplVG9TdG9yYWdlKHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIpO1xuXG5vYnNlcnZlTm90aWZpZXIobm90aWZpZXIse1xudXBkYXRlU3RhdGUodmFsdWUpe1xubWFyc2hhbGxUb1N0b3JhZ2UodmFsdWUpLmNhdGNoKChyZWFzb24pPT5cbmNvbnNvbGUuZXJyb3IoJ1N0b3JlZE5vdGlmaWVyIGZhaWxlZCB0byB1cGRhdGVTdGF0ZScscmVhc29uKSk7XG5cbiB9LFxuZmFpbChyZWFzb24pe1xuY29uc29sZS5lcnJvcignU3RvcmVkTm90aWZpZXIgZmFpbGVkIHRvIGl0ZXJhdGUnLHJlYXNvbik7XG4gfX0pLlxuY2F0Y2goKHJlYXNvbik9PntcbmNvbnNvbGUuZXJyb3IoJ1N0b3JlZE5vdGlmaWVyIGhhbHRlZCBpdGVyYXRpb24nLHJlYXNvbik7XG4gfSk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgdW5zZXJpYWxpemVyPUZhcigndW5zZXJpYWxpemVyJyx7XG5mcm9tQ2FwRGF0YTooZGF0YSk9PkUobWFyc2hhbGxlcikuZnJvbUNhcERhdGEoZGF0YSksXG51bnNlcmlhbGl6ZTooZGF0YSk9PkUobWFyc2hhbGxlcikuZnJvbUNhcERhdGEoZGF0YSl9KTtcblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3Qgc3RvcmVkTm90aWZpZXI9RmFyKCdTdG9yZWROb3RpZmllcicse1xuZ2V0VXBkYXRlU2luY2U6KHVwZGF0ZUNvdW50KT0+RShub3RpZmllcikuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpLFxuZ2V0UGF0aDooKT0+RShzdG9yYWdlTm9kZSkuZ2V0UGF0aCgpLFxuZ2V0VW5zZXJpYWxpemVyOigpPT51bnNlcmlhbGl6ZXJ9KTtcblxucmV0dXJuIHN0b3JlZE5vdGlmaWVyO1xuIH07JGjNj19vbmNlLm1ha2VTdG9yZWROb3RpZmllcihtYWtlU3RvcmVkTm90aWZpZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVN0b3JlZE5vdGlmaWVyIjpbIm1ha2VTdG9yZWROb3RpZmllciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAqiD/cHBYAABwWAAAtAAAAQGFnb3JpYy9ub3RpZmllci12MC43LjAtdTE5LjIvc3JjL3N0b3Jlc3ViLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ZhciIsIkBlbmRvL21hcnNoYWwiLCJAYWdvcmljL2ludGVybmFsIiwiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyIsIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiLCIuL3B1Ymxpc2gta2l0LmpzIiwiLi9zdWJzY3JpYmVyLmpzIiwiLi9zdWJzY3JpYmUuanMiXSwiZXhwb3J0cyI6WyJmb3JFYWNoUHVibGljYXRpb25SZWNvcmQiLCJtYWtlU3RvcmVkUHVibGlzaEtpdCIsIm1ha2VTdG9yZWRQdWJsaXNoZXJLaXQiLCJtYWtlU3RvcmVkU3Vic2NyaWJlciIsIm1ha2VTdG9yZWRTdWJzY3JpcHRpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBFLEZhcixtYWtlTWFyc2hhbCxhc3NlcnRBbGxEZWZpbmVkLG1ha2VTZXJpYWxpemVUb1N0b3JhZ2Usb2JzZXJ2ZUl0ZXJhdGlvbixtYWtlUHVibGlzaEtpdCxtYWtlU3Vic2NyaXB0aW9uS2l0LHN1YnNjcmliZUVhY2g7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXSxbXCJGYXJcIiwgWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wibWFrZU1hcnNoYWxcIiwgWyRozY9fYSA9PiAobWFrZU1hcnNoYWwgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJhc3NlcnRBbGxEZWZpbmVkXCIsIFskaM2PX2EgPT4gKGFzc2VydEFsbERlZmluZWQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzXCIsIFtbXCJtYWtlU2VyaWFsaXplVG9TdG9yYWdlXCIsIFskaM2PX2EgPT4gKG1ha2VTZXJpYWxpemVUb1N0b3JhZ2UgPSAkaM2PX2EpXV1dXSxbXCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzXCIsIFtbXCJvYnNlcnZlSXRlcmF0aW9uXCIsIFskaM2PX2EgPT4gKG9ic2VydmVJdGVyYXRpb24gPSAkaM2PX2EpXV1dXSxbXCIuL3B1Ymxpc2gta2l0LmpzXCIsIFtbXCJtYWtlUHVibGlzaEtpdFwiLCBbJGjNj19hID0+IChtYWtlUHVibGlzaEtpdCA9ICRozY9fYSldXV1dLFtcIi4vc3Vic2NyaWJlci5qc1wiLCBbW1wibWFrZVN1YnNjcmlwdGlvbktpdFwiLCBbJGjNj19hID0+IChtYWtlU3Vic2NyaXB0aW9uS2l0ID0gJGjNj19hKV1dXV0sW1wiLi9zdWJzY3JpYmUuanNcIiwgW1tcInN1YnNjcmliZUVhY2hcIiwgWyRozY9fYSA9PiAoc3Vic2NyaWJlRWFjaCA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuLypcblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkPWFzeW5jKHN1YnNjcmliZXIsY29uc3VtZVZhbHVlKT0+e1xuLy9cbi8vXG5jb25zdCBpdGVyYXRvcj1zdWJzY3JpYmVFYWNoKHN1YnNjcmliZXIpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xuXG5sZXQgZmluaXNoZWQ9ZmFsc2U7XG5hd2FpdCBudWxsO1xud2hpbGUoIWZpbmlzaGVkKXtcbmNvbnN0e3ZhbHVlLGRvbmV9PWF3YWl0IGl0ZXJhdG9yLm5leHQoKTtcbmF3YWl0IGNvbnN1bWVWYWx1ZSh2YWx1ZSk7XG5maW5pc2hlZD0hIWRvbmU7XG4gfVxuIH07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5mb3JFYWNoUHVibGljYXRpb25SZWNvcmQoZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkKTtcbmNvbnN0ICAgICAgICBtYWtlU3RvcmVkU3Vic2NyaWJlcj0oc3Vic2NyaWJlcixzdG9yYWdlTm9kZSxtYXJzaGFsbGVyKT0+e1xuYXNzZXJ0QWxsRGVmaW5lZCh7c3Vic2NyaWJlcixzdG9yYWdlTm9kZSxtYXJzaGFsbGVyfSk7XG5cbmNvbnN0IG1hcnNoYWxsVG9TdG9yYWdlPW1ha2VTZXJpYWxpemVUb1N0b3JhZ2Uoc3RvcmFnZU5vZGUsbWFyc2hhbGxlcik7XG5cbi8vXG5mb3JFYWNoUHVibGljYXRpb25SZWNvcmQoc3Vic2NyaWJlcixtYXJzaGFsbFRvU3RvcmFnZSkuY2F0Y2goKGVycik9Pntcbi8vXG4vL1xuY29uc29sZS5lcnJvcignU3RvcmVkU3Vic2NyaWJlciBmYWlsZWQgdG8gaXRlcmF0ZScsZXJyKTtcbiB9KTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCB1bnNlcmlhbGl6ZXI9RmFyKCd1bnNlcmlhbGl6ZXInLHtcbmZyb21DYXBEYXRhOihkYXRhKT0+RShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKSxcbnVuc2VyaWFsaXplOihkYXRhKT0+RShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKX0pO1xuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHN0b3Jlc3ViPUZhcignU3RvcmVkU3Vic2NyaWJlcicse1xuc3Vic2NyaWJlQWZ0ZXI6KHB1Ymxpc2hDb3VudCk9PnN1YnNjcmliZXIuc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50KSxcbmdldFVwZGF0ZVNpbmNlOih1cGRhdGVDb3VudCk9PnN1YnNjcmliZXIuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpLFxuZ2V0UGF0aDooKT0+RShzdG9yYWdlTm9kZSkuZ2V0UGF0aCgpLFxuZ2V0U3RvcmVLZXk6KCk9PkUoc3RvcmFnZU5vZGUpLmdldFN0b3JlS2V5KCksXG5nZXRVbnNlcmlhbGl6ZXI6KCk9PnVuc2VyaWFsaXplcn0pO1xuXG5yZXR1cm4gc3RvcmVzdWI7XG4gfTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UubWFrZVN0b3JlZFN1YnNjcmliZXIobWFrZVN0b3JlZFN1YnNjcmliZXIpO1xuY29uc3QgICAgICAgIG1ha2VTdG9yZWRTdWJzY3JpcHRpb249KFxuc3Vic2NyaXB0aW9uLFxuc3RvcmFnZU5vZGUsXG5tYXJzaGFsbGVyPW1ha2VNYXJzaGFsKHVuZGVmaW5lZCx1bmRlZmluZWQse1xubWFyc2hhbFNhdmVFcnJvcjooKT0+eyB9LFxuc2VyaWFsaXplQm9keUZvcm1hdDonc21hbGxjYXBzJ30pKT0+XG5cbntcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgdW5zZXJpYWxpemVyPUZhcigndW5zZXJpYWxpemVyJyx7XG5mcm9tQ2FwRGF0YTooZGF0YSk9PkUobWFyc2hhbGxlcikuZnJvbUNhcERhdGEoZGF0YSksXG51bnNlcmlhbGl6ZTooZGF0YSk9PkUobWFyc2hhbGxlcikuZnJvbUNhcERhdGEoZGF0YSl9KTtcblxuXG4vL1xubGV0IHB1Ymxpc2hGYWlsZWQ9ZmFsc2U7XG5sZXQgcHVibGlzaEV4Y2VwdGlvbjtcblxuY29uc3QgZmFpbD0oZXJyKT0+e1xucHVibGlzaEZhaWxlZD10cnVlO1xucHVibGlzaEV4Y2VwdGlvbj1lcnI7XG4gfTtcblxuLy9cbi8vXG5jb25zdCBwdWJsaXNoVmFsdWU9KG9iaik9PntcbmFzc2VydChzdG9yYWdlTm9kZSk7XG5pZihwdWJsaXNoRmFpbGVkKXtcbi8vXG50aHJvdyBwdWJsaXNoRXhjZXB0aW9uO1xuIH1cblxuLy9cbkUobWFyc2hhbGxlcikuXG50b0NhcERhdGEob2JqKS5cbnRoZW4oKHNlcmlhbGl6ZWQpPT57XG5jb25zdCBlbmNvZGVkPUpTT04uc3RyaW5naWZ5KHNlcmlhbGl6ZWQpO1xucmV0dXJuIEUoc3RvcmFnZU5vZGUpLnNldFZhbHVlKGVuY29kZWQpO1xuIH0pLlxuY2F0Y2goZmFpbCk7XG4gfTtcblxuaWYoc3RvcmFnZU5vZGUpe1xuLy9cbm9ic2VydmVJdGVyYXRpb24oc3Vic2NyaXB0aW9uLHtcbnVwZGF0ZVN0YXRlOnB1Ymxpc2hWYWx1ZSxcbmZpbmlzaDpwdWJsaXNoVmFsdWV9KS5cbmNhdGNoKGZhaWwpO1xuIH1cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBzdG9yZXN1Yj1GYXIoJ1N0b3JlZFN1YnNjcmlwdGlvbicse1xuLy9cbmdldFN0b3JlS2V5OmFzeW5jKCk9PntcbmlmKCFzdG9yYWdlTm9kZSl7XG5yZXR1cm4gaGFyZGVuKHtzdWJzY3JpcHRpb259KTtcbiB9XG5jb25zdCBzdG9yZUtleT1hd2FpdCBFKHN0b3JhZ2VOb2RlKS5nZXRTdG9yZUtleSgpO1xucmV0dXJuIGhhcmRlbih7Li4uc3RvcmVLZXksc3Vic2NyaXB0aW9ufSk7XG4gfSxcbmdldFVuc2VyaWFsaXplcjooKT0+dW5zZXJpYWxpemVyLFxuZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHM6KCk9Plxuc3Vic2NyaXB0aW9uLmdldFNoYXJhYmxlU3Vic2NyaXB0aW9uSW50ZXJuYWxzKCksXG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT5zdWJzY3JpcHRpb25bU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCksXG5zdWJzY3JpYmVBZnRlcjoocHVibGlzaENvdW50KT0+c3Vic2NyaXB0aW9uLnN1YnNjcmliZUFmdGVyKHB1Ymxpc2hDb3VudCl9KTtcblxucmV0dXJuIHN0b3Jlc3ViO1xuIH07JGjNj19vbmNlLm1ha2VTdG9yZWRTdWJzY3JpcHRpb24obWFrZVN0b3JlZFN1YnNjcmlwdGlvbik7XG5oYXJkZW4obWFrZVN0b3JlZFN1YnNjcmlwdGlvbik7XG5cbi8qXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIG1ha2VTdG9yZWRQdWJsaXNoZXJLaXQ9KHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIsY2hpbGRQYXRoKT0+e1xuY29uc3R7cHVibGljYXRpb24sc3Vic2NyaXB0aW9ufT1tYWtlU3Vic2NyaXB0aW9uS2l0KCk7XG5cbmlmKHN0b3JhZ2VOb2RlJiZjaGlsZFBhdGgpe1xuc3RvcmFnZU5vZGU9RShzdG9yYWdlTm9kZSkubWFrZUNoaWxkTm9kZShjaGlsZFBhdGgpO1xuIH1cblxuLy9cbmNvbnN0IHN1YnNjcmliZXI9bWFrZVN0b3JlZFN1YnNjcmlwdGlvbihcbnN1YnNjcmlwdGlvbixcbnN0b3JhZ2VOb2RlLFxubWFyc2hhbGxlcik7XG5cblxucmV0dXJue1xucHVibGlzaGVyOnB1YmxpY2F0aW9uLFxuc3Vic2NyaWJlcn07XG5cbiB9O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLm1ha2VTdG9yZWRQdWJsaXNoZXJLaXQobWFrZVN0b3JlZFB1Ymxpc2hlcktpdCk7XG5jb25zdCAgICAgICAgbWFrZVN0b3JlZFB1Ymxpc2hLaXQ9KHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIpPT57XG5jb25zdHtwdWJsaXNoZXIsc3Vic2NyaWJlcn09bWFrZVB1Ymxpc2hLaXQoKTtcblxucmV0dXJue1xucHVibGlzaGVyLFxuLy9cbnN1YnNjcmliZXI6bWFrZVN0b3JlZFN1YnNjcmliZXIoc3Vic2NyaWJlcixzdG9yYWdlTm9kZSxtYXJzaGFsbGVyKX07XG5cbiB9OyRozY9fb25jZS5tYWtlU3RvcmVkUHVibGlzaEtpdChtYWtlU3RvcmVkUHVibGlzaEtpdCk7XG5oYXJkZW4obWFrZVN0b3JlZFB1Ymxpc2hLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkIjpbImZvckVhY2hQdWJsaWNhdGlvblJlY29yZCJdLCJtYWtlU3RvcmVkU3Vic2NyaWJlciI6WyJtYWtlU3RvcmVkU3Vic2NyaWJlciJdLCJtYWtlU3RvcmVkU3Vic2NyaXB0aW9uIjpbIm1ha2VTdG9yZWRTdWJzY3JpcHRpb24iXSwibWFrZVN0b3JlZFB1Ymxpc2hlcktpdCI6WyJtYWtlU3RvcmVkUHVibGlzaGVyS2l0Il0sIm1ha2VTdG9yZWRQdWJsaXNoS2l0IjpbIm1ha2VTdG9yZWRQdWJsaXNoS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKlXfHBQEgAAUBIAAC4AAABAYWdvcmljL25vdGlmaWVyLXYwLjcuMC11MTkuMi9zcmMvc3Vic2NyaWJlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2ZhciIsIkBlbmRvL21hcnNoYWwiLCJAYWdvcmljL2ludGVybmFsL3NyYy91cGdyYWRlLWFwaS5qcyJdLCJleHBvcnRzIjpbInN1YnNjcmliZSIsInN1YnNjcmliZUVhY2giLCJzdWJzY3JpYmVMYXRlc3QiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBYLEZhaWwsYW5ub3RhdGVFcnJvcixFLEZhcixpc09iamVjdCxpc1VwZ3JhZGVEaXNjb25uZWN0aW9uOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsIFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLCBbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcImFubm90YXRlRXJyb3JcIiwgWyRozY9fYSA9PiAoYW5ub3RhdGVFcnJvciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjNj19hID0+IChFID0gJGjNj19hKV1dLFtcIkZhclwiLCBbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJpc09iamVjdFwiLCBbJGjNj19hID0+IChpc09iamVjdCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3VwZ3JhZGUtYXBpLmpzXCIsIFtbXCJpc1VwZ3JhZGVEaXNjb25uZWN0aW9uXCIsIFskaM2PX2EgPT4gKGlzVXBncmFkZURpc2Nvbm5lY3Rpb24gPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuXG4vKlxuXG5cbiAqL1xuXG5jb25zdCBzaW5rPSgpPT57IH07XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgcmVjb25uZWN0QXNOZWVkZWQ9YXN5bmMoZ2V0dGVyLHNlZWQ9W10pPT57XG5sZXQgZGlzY29ubmVjdGlvbjtcbmxldCBsYXN0VmVyc2lvbj0tSW5maW5pdHk7XG4vL1xuYXdhaXQgbnVsbDtcbmZvcihsZXQgaT0wOztpKz0xKXtcbnRyeXtcbmNvbnN0IHJlc3VsdFA9aTxzZWVkLmxlbmd0aD9zZWVkW2ldOmdldHRlcigpO1xuY29uc3QgcmVzdWx0PWF3YWl0IHJlc3VsdFA7XG5yZXR1cm4gcmVzdWx0O1xuIH1jYXRjaChlcnIpe1xuaWYoaXNVcGdyYWRlRGlzY29ubmVjdGlvbihlcnIpKXtcbmlmKCFkaXNjb25uZWN0aW9uKXtcbmRpc2Nvbm5lY3Rpb249ZXJyO1xuIH1cbmNvbnN0e2luY2FybmF0aW9uTnVtYmVyOnZlcnNpb259PWVycjtcbmlmKHZlcnNpb24+bGFzdFZlcnNpb24pe1xuLy9cbi8vXG4vL1xubGFzdFZlcnNpb249dmVyc2lvbjtcbmNvbnRpbnVlO1xuIH1cbiB9XG4vL1xuLy9cbi8vXG5pZihpc09iamVjdChlcnIpJiZkaXNjb25uZWN0aW9uJiZkaXNjb25uZWN0aW9uIT09ZXJyKXtcbnRyeXtcbmFubm90YXRlRXJyb3IoXG5lcnIsXG5YIGBBdHRlbXB0aW5nIHRvIHJlY292ZXIgZnJvbSBkaXNjb25uZWN0aW9uOiAke2Rpc2Nvbm5lY3Rpb259YCk7XG5cbiB9Y2F0Y2goX2Vycil7XG4vL1xuIH1cbiB9XG50aHJvdyBlcnI7XG4gfVxuIH1cbiB9O1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBzdWJzY3JpYmU9KGl0UCk9PlxuRmFyKCdBc3luY0l0ZXJhYmxlJyx7XG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT57XG5jb25zdCBpdD1FKGl0UClbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG5jb25zdCBzZWxmPUZhcignQXN5bmNJdGVyYWJsZUl0ZXJhdG9yJyx7XG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT5zZWxmLFxubmV4dDphc3luYygpPT5FKGl0KS5uZXh0KCl9KTtcblxucmV0dXJuIHNlbGY7XG4gfX0pO1xuXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2Uuc3Vic2NyaWJlKHN1YnNjcmliZSk7XG5jb25zdCBtYWtlRWFjaEl0ZXJhdG9yPSh0b3BpYyxuZXh0Q2VsbFApPT57XG4vL1xuLy9cbmNvbnN0IHNlbGY9RmFyKCdFYWNoSXRlcmF0b3InLHtcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9PnNlbGYsXG5uZXh0OigpPT57XG5jb25zdHtcbmhlYWQ6cmVzdWx0UCxcbnB1Ymxpc2hDb3VudDpwdWJsaXNoQ291bnRQLFxudGFpbDp0YWlsUH09XG5FLmdldChuZXh0Q2VsbFApO1xuXG4vL1xuLy9cbmNvbnN0IGdldFN1Y2Nlc3Nvcj1hc3luYygpPT57XG5jb25zdCBwdWJsaXNoQ291bnQ9YXdhaXQgcHVibGlzaENvdW50UDtcbmFzc2VydC50eXBlb2YocHVibGlzaENvdW50LCdiaWdpbnQnKTtcbmNvbnN0IHN1Y2Nlc3Nvcj1hd2FpdCBFKHRvcGljKS5zdWJzY3JpYmVBZnRlcihwdWJsaXNoQ291bnQpO1xuY29uc3QgbmV3UHVibGlzaENvdW50PXN1Y2Nlc3Nvci5wdWJsaXNoQ291bnQ7XG5pZihuZXdQdWJsaXNoQ291bnQhPT1wdWJsaXNoQ291bnQrMW4pe1xuRmFpbCBgZWFjaEl0ZXJhdG9yIGJyb2tlbiBieSBnYXAgZnJvbSBwdWJsaXNoQ291bnQgJHtwdWJsaXNoQ291bnR9IHRvICR7bmV3UHVibGlzaENvdW50fWA7XG4gfVxucmV0dXJuIHN1Y2Nlc3NvcjtcbiB9O1xuXG4vL1xuLy9cbm5leHRDZWxsUD1yZWNvbm5lY3RBc05lZWRlZChnZXRTdWNjZXNzb3IsW3RhaWxQXSk7XG5cbi8vXG4vL1xuLy9cbi8vXG52b2lkIEUud2hlbihwdWJsaXNoQ291bnRQLHNpbmssc2luayk7XG52b2lkIEUud2hlbihuZXh0Q2VsbFAsc2luayxzaW5rKTtcbnJldHVybiByZXN1bHRQO1xuIH0sXG5mb3JrOigpPT5tYWtlRWFjaEl0ZXJhdG9yKHRvcGljLG5leHRDZWxsUCl9KTtcblxucmV0dXJuIHNlbGY7XG4gfTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBzdWJzY3JpYmVFYWNoPSh0b3BpYyk9PntcbmNvbnN0IGl0ZXJhYmxlPUZhcignRWFjaEl0ZXJhYmxlJyx7XG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT57XG5jb25zdCBmaXJzdENlbGxQPXJlY29ubmVjdEFzTmVlZGVkKCgpPT5FKHRvcGljKS5zdWJzY3JpYmVBZnRlcigpKTtcbnJldHVybiBtYWtlRWFjaEl0ZXJhdG9yKHRvcGljLGZpcnN0Q2VsbFApO1xuIH19KTtcblxucmV0dXJuIGl0ZXJhYmxlO1xuIH07JGjNj19vbmNlLnN1YnNjcmliZUVhY2goc3Vic2NyaWJlRWFjaCk7XG5oYXJkZW4oc3Vic2NyaWJlRWFjaCk7XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBjbG9uZUxhdGVzdEl0ZXJhdG9yPSh0b3BpYyxsb2NhbFVwZGF0ZUNvdW50LHRlcm1pbmFsUmVzdWx0KT0+e1xubGV0IG11dGV4PVByb21pc2UucmVzb2x2ZSgpO1xuXG4vKlxuXG5cblxuXG4gICAqL1xuY29uc3QgbWF5YmVSZXF1ZXN0TmV4dFJlc3VsdD1hc3luYygpPT57XG5pZih0ZXJtaW5hbFJlc3VsdCl7XG4vL1xuLy9cbnJldHVybiB0ZXJtaW5hbFJlc3VsdDtcbiB9XG5cbi8vXG4vL1xuY29uc3R7dmFsdWUsdXBkYXRlQ291bnR9PWF3YWl0IHJlY29ubmVjdEFzTmVlZGVkKCgpPT5cbkUodG9waWMpLmdldFVwZGF0ZVNpbmNlKGxvY2FsVXBkYXRlQ291bnQpKTtcblxuLy9cbmxvY2FsVXBkYXRlQ291bnQ9dXBkYXRlQ291bnQ7XG5cbi8vXG5pZih1cGRhdGVDb3VudD09PXVuZGVmaW5lZCl7XG50ZXJtaW5hbFJlc3VsdD1oYXJkZW4oe2RvbmU6dHJ1ZSx2YWx1ZX0pO1xucmV0dXJuIHRlcm1pbmFsUmVzdWx0O1xuIH1cbnJldHVybiBoYXJkZW4oe2RvbmU6ZmFsc2UsdmFsdWV9KTtcbiB9O1xuXG5jb25zdCBzZWxmPUZhcignTGF0ZXN0SXRlcmF0b3InLHtcbmZvcms6KCk9PmNsb25lTGF0ZXN0SXRlcmF0b3IodG9waWMsbG9jYWxVcGRhdGVDb3VudCx0ZXJtaW5hbFJlc3VsdCksXG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT5zZWxmLFxubmV4dDphc3luYygpPT57XG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbmlmKHRlcm1pbmFsUmVzdWx0KXtcbi8vXG4vL1xucmV0dXJuIHRlcm1pbmFsUmVzdWx0O1xuIH1cblxuLy9cbi8vXG4vL1xuLy9cbmNvbnN0IG5leHRSZXN1bHQ9bXV0ZXgudGhlbihtYXliZVJlcXVlc3ROZXh0UmVzdWx0KTtcbm11dGV4PW5leHRSZXN1bHQudGhlbihzaW5rLHNpbmspO1xuLy9cblxucmV0dXJuIG5leHRSZXN1bHQ7XG4gfX0pO1xuXG5yZXR1cm4gc2VsZjtcbiB9O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBtYWtlTGF0ZXN0SXRlcmF0b3I9KHRvcGljKT0+Y2xvbmVMYXRlc3RJdGVyYXRvcih0b3BpYyk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgc3Vic2NyaWJlTGF0ZXN0PSh0b3BpYyk9PntcbmNvbnN0IGl0ZXJhYmxlPUZhcignTGF0ZXN0SXRlcmFibGUnLHtcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9Pm1ha2VMYXRlc3RJdGVyYXRvcih0b3BpYyl9KTtcblxucmV0dXJuIGl0ZXJhYmxlO1xuIH07JGjNj19vbmNlLnN1YnNjcmliZUxhdGVzdChzdWJzY3JpYmVMYXRlc3QpO1xuaGFyZGVuKHN1YnNjcmliZUxhdGVzdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzdWJzY3JpYmUiOlsic3Vic2NyaWJlIl0sInN1YnNjcmliZUVhY2giOlsic3Vic2NyaWJlRWFjaCJdLCJzdWJzY3JpYmVMYXRlc3QiOlsic3Vic2NyaWJlTGF0ZXN0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJfiv+IACAAAAAgAAC8AAABAYWdvcmljL25vdGlmaWVyLXYwLjcuMC11MTkuMi9zcmMvc3Vic2NyaWJlci5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiLCIuL3N1YnNjcmliZS5qcyIsIi4vcHVibGlzaC1raXQuanMiLCIuL3RvcGljLmpzIl0sImV4cG9ydHMiOlsibWFrZVN1YnNjcmlwdGlvbiIsIm1ha2VTdWJzY3JpcHRpb25LaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBFLEZhcixzdWJzY3JpYmVFYWNoLG1ha2VQdWJsaXNoS2l0LG1ha2VQaW5uZWRIaXN0b3J5VG9waWM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXSxbXCJGYXJcIiwgWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiLi9zdWJzY3JpYmUuanNcIiwgW1tcInN1YnNjcmliZUVhY2hcIiwgWyRozY9fYSA9PiAoc3Vic2NyaWJlRWFjaCA9ICRozY9fYSldXV1dLFtcIi4vcHVibGlzaC1raXQuanNcIiwgW1tcIm1ha2VQdWJsaXNoS2l0XCIsIFskaM2PX2EgPT4gKG1ha2VQdWJsaXNoS2l0ID0gJGjNj19hKV1dXV0sW1wiLi90b3BpYy5qc1wiLCBbW1wibWFrZVBpbm5lZEhpc3RvcnlUb3BpY1wiLCBbJGjNj19hID0+IChtYWtlUGlubmVkSGlzdG9yeVRvcGljID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cbi8qXG5cbiAqL1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBtYWtlU3Vic2NyaXB0aW9uPSh0b3BpYyk9PntcbmNvbnN0IHN1YnNjcmlwdGlvbj1GYXIoJ1N1YnNjcmlwdGlvbicse1xuLi4uc3Vic2NyaWJlRWFjaCh0b3BpYyksXG5zdWJzY3JpYmVBZnRlcjphc3luYyhwdWJsaXNoQ291bnQpPT5FKHRvcGljKS5zdWJzY3JpYmVBZnRlcihwdWJsaXNoQ291bnQpLFxuXG4vKlxuXG5cblxuXG4gICAgICovXG5nZXRTaGFyYWJsZVN1YnNjcmlwdGlvbkludGVybmFsczphc3luYygpPT50b3BpYyxcblxuZ2V0U3RvcmVLZXk6KCk9PmhhcmRlbih7c3Vic2NyaXB0aW9ufSl9KTtcblxucmV0dXJuIHN1YnNjcmlwdGlvbjtcbiB9OyRozY9fb25jZS5tYWtlU3Vic2NyaXB0aW9uKG1ha2VTdWJzY3JpcHRpb24pO1xuaGFyZGVuKG1ha2VTdWJzY3JpcHRpb24pO1xuXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZVN1YnNjcmlwdGlvbktpdD0oKT0+e1xuY29uc3R7cHVibGlzaGVyLHN1YnNjcmliZXJ9PW1ha2VQdWJsaXNoS2l0KCk7XG5cbi8vXG4vL1xuXG5jb25zdCBwaW5uZWRIaXN0b3J5VG9waWM9bWFrZVBpbm5lZEhpc3RvcnlUb3BpYyhzdWJzY3JpYmVyKTtcbmNvbnN0IHN1YnNjcmlwdGlvbj1tYWtlU3Vic2NyaXB0aW9uKHBpbm5lZEhpc3RvcnlUb3BpYyk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBwdWJsaWNhdGlvbj1GYXIoJ3B1YmxpY2F0aW9uJyx7XG51cGRhdGVTdGF0ZToobm9uRmluYWxWYWx1ZSk9PnB1Ymxpc2hlci5wdWJsaXNoKG5vbkZpbmFsVmFsdWUpLFxuZmluaXNoOihjb21wbGV0aW9uKT0+cHVibGlzaGVyLmZpbmlzaChjb21wbGV0aW9uKSxcbmZhaWw6KHJlYXNvbik9PnB1Ymxpc2hlci5mYWlsKHJlYXNvbil9KTtcblxuXG5yZXR1cm4gaGFyZGVuKHtwdWJsaWNhdGlvbixzdWJzY3JpcHRpb259KTtcbiB9OyRozY9fb25jZS5tYWtlU3Vic2NyaXB0aW9uS2l0KG1ha2VTdWJzY3JpcHRpb25LaXQpO1xuaGFyZGVuKG1ha2VTdWJzY3JpcHRpb25LaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVN1YnNjcmlwdGlvbiI6WyJtYWtlU3Vic2NyaXB0aW9uIl0sIm1ha2VTdWJzY3JpcHRpb25LaXQiOlsibWFrZVN1YnNjcmlwdGlvbktpdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAu1+OLHAQAABwEAAAqAAAAQGFnb3JpYy9ub3RpZmllci12MC43LjAtdTE5LjIvc3JjL3RvcGljLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbIm1ha2VQaW5uZWRIaXN0b3J5VG9waWMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBGYXI7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkZhclwiLCBbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuLypcblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIG1ha2VQaW5uZWRIaXN0b3J5VG9waWM9KHRvcGljKT0+e1xuLy9cblxuLy9cbmNvbnN0IHBpbm5lZFB1Ykxpc3Q9dG9waWMuc3Vic2NyaWJlQWZ0ZXIoKTtcblxucmV0dXJuIEZhcignUGlubmVkSGlzdG9yeVRvcGljJyx7XG5zdWJzY3JpYmVBZnRlcjphc3luYyhwdWJsaXNoQ291bnQ9LTFuKT0+e1xuaWYocHVibGlzaENvdW50PT09LTFuKXtcbnJldHVybiBwaW5uZWRQdWJMaXN0O1xuIH1cbnJldHVybiB0b3BpYy5zdWJzY3JpYmVBZnRlcihwdWJsaXNoQ291bnQpO1xuIH0sXG5nZXRVcGRhdGVTaW5jZTphc3luYyh1cGRhdGVDb3VudD11bmRlZmluZWQpPT57XG4vL1xucmV0dXJuIHRvcGljLmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50KTtcbiB9fSk7XG5cbiB9OyRozY9fb25jZS5tYWtlUGlubmVkSGlzdG9yeVRvcGljKG1ha2VQaW5uZWRIaXN0b3J5VG9waWMpO1xuaGFyZGVuKG1ha2VQaW5uZWRIaXN0b3J5VG9waWMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVBpbm5lZEhpc3RvcnlUb3BpYyI6WyJtYWtlUGlubmVkSGlzdG9yeVRvcGljIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAVESyZ5AQAAeQEAADAAAABAYWdvcmljL25vdGlmaWVyLXYwLjcuMC11MTkuMi9zcmMvdHlwZXMtaW5kZXguanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRozY9faW1wb3J0cyhbXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA0yzIgLEGAACxBgAAMwAAAEBhZ29yaWMvbm90aWZpZXItdjAuNy4wLXUxOS4yL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGFnb3JpYy9pbnRlcm5hbC9zcmMvdGVzdGluZy11dGlscy5qcyJdLCJleHBvcnRzIjpbIm1ha2VGYWtlTWFyc2hhbGxlciIsIm1ha2VGYWtlU3RvcmFnZSIsbnVsbF0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgRmFyLG1ha2VNYXJzaGFsOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXSxbXCJtYWtlTWFyc2hhbFwiLCBbJGjNj19hID0+IChtYWtlTWFyc2hhbCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3Rlc3RpbmctdXRpbHMuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuLypcblxuXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRmFrZVN0b3JhZ2U9KHBhdGgscHVibGljYXRpb24pPT57XG5sZXQgc2V0VmFsdWVDYWxscz0wO1xuY29uc3QgZnVsbFBhdGg9IGBwdWJsaXNoLiR7cGF0aH1gO1xuY29uc3Qgc3RvcmVLZXk9aGFyZGVuKHtcbnN0b3JlTmFtZTonc3dpbmdzZXQnLFxuc3RvcmVTdWJrZXk6IGBzd2luZ3NldC9kYXRhOiR7ZnVsbFBhdGh9YCxcbmRhdGFQcmVmaXhCeXRlczonJ30pO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBzdG9yYWdlPUZhcignU3RvcmFnZU5vZGUnLHtcbmdldFBhdGg6KCk9PnBhdGgsXG5nZXRTdG9yZUtleTphc3luYygpPT5zdG9yZUtleSxcbnNldFZhbHVlOmFzeW5jKHZhbHVlKT0+e1xuc2V0VmFsdWVDYWxscys9MTtcbmFzc2VydC50eXBlb2YodmFsdWUsJ3N0cmluZycpO1xuaWYocHVibGljYXRpb24pe1xucHVibGljYXRpb24udXBkYXRlU3RhdGUodmFsdWUpO1xuIH1cbiB9LFxubWFrZUNoaWxkTm9kZTooKT0+c3RvcmFnZSxcbmNvdW50U2V0VmFsdWVDYWxsczooKT0+c2V0VmFsdWVDYWxsc30pO1xuXG5yZXR1cm4gc3RvcmFnZTtcbiB9OyRozY9fb25jZS5tYWtlRmFrZVN0b3JhZ2UobWFrZUZha2VTdG9yYWdlKTtcbmhhcmRlbihtYWtlRmFrZVN0b3JhZ2UpO1xuXG5jb25zdCAgICAgICAgbWFrZUZha2VNYXJzaGFsbGVyPSgpPT5cbm1ha2VNYXJzaGFsKHVuZGVmaW5lZCx1bmRlZmluZWQse1xubWFyc2hhbFNhdmVFcnJvcjooKT0+eyB9fSk7JGjNj19vbmNlLm1ha2VGYWtlTWFyc2hhbGxlcihtYWtlRmFrZU1hcnNoYWxsZXIpO1xuXG5oYXJkZW4obWFrZUZha2VNYXJzaGFsbGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7IkBhZ29yaWMvaW50ZXJuYWwvc3JjL3Rlc3RpbmctdXRpbHMuanMiOltbImV2ZW50TG9vcEl0ZXJhdGlvbiIsImV2ZW50TG9vcEl0ZXJhdGlvbiJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRmFrZVN0b3JhZ2UiOlsibWFrZUZha2VTdG9yYWdlIl0sIm1ha2VGYWtlTWFyc2hhbGxlciI6WyJtYWtlRmFrZU1hcnNoYWxsZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAAqvzybwdAAC8HQAAOQAAAEBhZ29yaWMvc21hcnQtd2FsbGV0LXYwLjUuNC11MTkuMi9zcmMvbWFyc2hhbC1jb250ZXh0cy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGFnb3JpYy9zdG9yZSIsIkBlbmRvL21hcnNoYWwiLCJAYWdvcmljL3ZhdHMvc3JjL2xpYi1ib2FyZC5qcyJdLCJleHBvcnRzIjpbIm1ha2VFeHBvcnRDb250ZXh0IiwibWFrZUltcG9ydENvbnRleHQiLCJtYWtlTG9nZ2luZ1ByZXNlbmNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgRmFpbCxxLEhhbmRsZWRQcm9taXNlLG1ha2VTY2FsYXJNYXBTdG9yZSxGYXIsbWFrZU1hcnNoYWwsUmVtb3RhYmxlLERFRkFVTFRfUFJFRklYOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsIFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLCBbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiSGFuZGxlZFByb21pc2VcIiwgWyRozY9fYSA9PiAoSGFuZGxlZFByb21pc2UgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtYWtlU2NhbGFyTWFwU3RvcmVcIiwgWyRozY9fYSA9PiAobWFrZVNjYWxhck1hcFN0b3JlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXSxbXCJtYWtlTWFyc2hhbFwiLCBbJGjNj19hID0+IChtYWtlTWFyc2hhbCA9ICRozY9fYSldXSxbXCJSZW1vdGFibGVcIiwgWyRozY9fYSA9PiAoUmVtb3RhYmxlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy92YXRzL3NyYy9saWItYm9hcmQuanNcIiwgW1tcIkRFRkFVTFRfUFJFRklYXCIsIFskaM2PX2EgPT4gKERFRkFVTFRfUFJFRklYID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgaXNEZWZhdWx0Qm9hcmRJZD0oc3BlY2ltZW4pPT57XG5yZXR1cm4gdHlwZW9mIHNwZWNpbWVuPT09J3N0cmluZycmJnNwZWNpbWVuLnN0YXJ0c1dpdGgoREVGQVVMVF9QUkVGSVgpO1xuIH07XG5cbi8qXG5cblxuXG5cbiAqL1xuLypcblxuXG4gKi9cblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VXYWxsZXRTbG90PShfdGFibGVzLGtpbmQsaWQpPT57XG5jb25zdCBkaWdpdHM9LyogICAgICAgICAgICAgICAgICovIGAke2lkfWA7XG5yZXR1cm4gYCR7a2luZH06JHtkaWdpdHN9YDtcbiB9O1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGZpbmRLZXk9KHJlY29yZCxwcmVkaWNhdGUpPT57XG5jb25zdCBrZXk9T2JqZWN0LmtleXMocmVjb3JkKS5maW5kKHByZWRpY2F0ZSk7XG5yZXR1cm4ga2V5O1xuIH07XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgcGFyc2VXYWxsZXRTbG90PSh0YWJsZXMsc2xvdCk9PntcbmNvbnN0IGtpbmQ9ZmluZEtleSh0YWJsZXMsKGspPT5zbG90LnN0YXJ0c1dpdGgoIGAke2t9OmApKTtcbmNvbnN0IGlkPWtpbmQ/TnVtYmVyKHNsb3Quc2xpY2Uoa2luZC5sZW5ndGgrMSkpOk5hTjtcbnJldHVybntraW5kLGlkfTtcbiB9O1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuLypcblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgaW5pdFNsb3RWYWw9KHRhYmxlLHNsb3QsdmFsKT0+e1xudGFibGUuYnlTbG90LmluaXQoc2xvdCx2YWwpO1xudGFibGUuYnlWYWwuaW5pdCh2YWwsc2xvdCk7XG4gfTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRXhwb3J0Q29udGV4dD0oKT0+e1xuY29uc3Qgd2FsbGV0T2JqZWN0cz17XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5wdXJzZTp7XG5ieVNsb3Q6bWFrZVNjYWxhck1hcFN0b3JlKCksXG5ieVZhbDptYWtlU2NhbGFyTWFwU3RvcmUoKX0sXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xucGF5bWVudDp7XG5ieVNsb3Q6bWFrZVNjYWxhck1hcFN0b3JlKCksXG5ieVZhbDptYWtlU2NhbGFyTWFwU3RvcmUoKX0sXG5cbi8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG51bmtub3duOntcbmJ5U2xvdDptYWtlU2NhbGFyTWFwU3RvcmUoKSxcbmJ5VmFsOm1ha2VTY2FsYXJNYXBTdG9yZSgpfX07XG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGJvYXJkT2JqZWN0cz17XG5ieVNsb3Q6bWFrZVNjYWxhck1hcFN0b3JlKCksXG5ieVZhbDptYWtlU2NhbGFyTWFwU3RvcmUoKX07XG5cblxuLypcblxuXG5cblxuXG5cblxuICAgKi9cbmNvbnN0IHNsb3RUb1ZhbD0oc2xvdCxfaWZhY2UpPT57XG5pZihpc0RlZmF1bHRCb2FyZElkKHNsb3QpJiZib2FyZE9iamVjdHMuYnlTbG90LmhhcyhzbG90KSl7XG5yZXR1cm4gYm9hcmRPYmplY3RzLmJ5U2xvdC5nZXQoc2xvdCk7XG4gfVxuY29uc3R7a2luZCxpZH09cGFyc2VXYWxsZXRTbG90KHdhbGxldE9iamVjdHMsc2xvdCk7XG5raW5kfHxGYWlsIGBiYWQgc2xvdCBraW5kOiAke3Nsb3R9YDtcbmNvbnN0IHZhbD13YWxsZXRPYmplY3RzW2tpbmRdLmJ5U2xvdC5nZXQoaWQpOy8vXG5yZXR1cm4gdmFsO1xuIH07XG5cbmxldCB1bmtub3duTm9uY2U9MDtcblxuLypcblxuXG4gICAqL1xuY29uc3QgdmFsVG9TbG90PSh2YWwpPT57XG5pZihib2FyZE9iamVjdHMuYnlWYWwuaGFzKHZhbCkpe1xucmV0dXJuIGJvYXJkT2JqZWN0cy5ieVZhbC5nZXQodmFsKTtcbiB9XG5jb25zdCBraW5kPWZpbmRLZXkod2FsbGV0T2JqZWN0cywoayk9PndhbGxldE9iamVjdHNba10uYnlWYWwuaGFzKHZhbCkpO1xuaWYoa2luZCl7XG4vL1xuY29uc3QgaWQ9d2FsbGV0T2JqZWN0c1traW5kXS5ieVZhbC5nZXQodmFsKTtcbnJldHVybiBtYWtlV2FsbGV0U2xvdCh3YWxsZXRPYmplY3RzLGtpbmQsaWQpO1xuIH1cbnVua25vd25Ob25jZSs9MTtcbmNvbnN0IHNsb3Q9bWFrZVdhbGxldFNsb3Qod2FsbGV0T2JqZWN0cywndW5rbm93bicsdW5rbm93bk5vbmNlKTtcbmluaXRTbG90VmFsKHdhbGxldE9iamVjdHMudW5rbm93bix1bmtub3duTm9uY2UsdmFsKTtcbnJldHVybiBzbG90O1xuIH07XG5cbi8qXG5cblxuXG4gICAqL1xuY29uc3QgbWFrZVNhdmVyPShraW5kLHRhYmxlKT0+e1xubGV0IG5vbmNlPTA7XG4vKiAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHNhdmVyPSh2YWwpPT57XG5ub25jZSs9MTtcbmluaXRTbG90VmFsKHRhYmxlLG5vbmNlLHZhbCk7XG4gfTtcbnJldHVybiBzYXZlcjtcbiB9O1xuXG5yZXR1cm4gaGFyZGVuKHtcbnNhdmVQdXJzZUFjdGlvbnM6bWFrZVNhdmVyKCdwdXJzZScsd2FsbGV0T2JqZWN0cy5wdXJzZSksXG5zYXZlUGF5bWVudEFjdGlvbnM6bWFrZVNhdmVyKCdwYXltZW50Jyx3YWxsZXRPYmplY3RzLnBheW1lbnQpLFxuLypcblxuXG4gICAgICovXG5pbml0UHVyc2VJZDooaWQscHVyc2UpPT57XG5pbml0U2xvdFZhbCh3YWxsZXRPYmplY3RzLnB1cnNlLGlkLHB1cnNlKTtcbiB9LFxucHVyc2VFbnRyaWVzOndhbGxldE9iamVjdHMucHVyc2UuYnlTbG90LmVudHJpZXMsXG4vKlxuXG5cbiAgICAgKi9cbmluaXRCb2FyZElkOihpZCx2YWwpPT57XG5pbml0U2xvdFZhbChib2FyZE9iamVjdHMsaWQsdmFsKTtcbiB9LFxuLypcblxuXG4gICAgICovXG5lbnN1cmVCb2FyZElkOihpZCx2YWwpPT57XG5pZihib2FyZE9iamVjdHMuYnlWYWwuaGFzKHZhbCkpe1xuYXNzZXJ0LmVxdWFsKGJvYXJkT2JqZWN0cy5ieVZhbC5nZXQodmFsKSxpZCk7XG5yZXR1cm47XG4gfVxuaW5pdFNsb3RWYWwoYm9hcmRPYmplY3RzLGlkLHZhbCk7XG4gfSxcbi4uLm1ha2VNYXJzaGFsKHZhbFRvU2xvdCxzbG90VG9WYWwse3NlcmlhbGl6ZUJvZHlGb3JtYXQ6J3NtYWxsY2Fwcyd9KX0pO1xuXG4gfTtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovJGjNj19vbmNlLm1ha2VFeHBvcnRDb250ZXh0KG1ha2VFeHBvcnRDb250ZXh0KTtcblxuY29uc3QgZGVmYXVsdE1ha2VQcmVzZW5jZT0oaWZhY2UpPT57XG5jb25zdCBzZXZlcmVkPSBgU0VWRVJFRDogJHtpZmFjZS5yZXBsYWNlKC9eQWxsZWdlZDogLywnJyl9YDtcbnJldHVybiBGYXIoc2V2ZXJlZCx7fSk7XG4gfTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZUltcG9ydENvbnRleHQ9KG1ha2VQcmVzZW5jZT1kZWZhdWx0TWFrZVByZXNlbmNlKT0+e1xuY29uc3Qgd2FsbGV0T2JqZWN0cz17XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5wdXJzZTp7XG5ieVNsb3Q6bWFrZVNjYWxhck1hcFN0b3JlKCksXG5ieVZhbDptYWtlU2NhbGFyTWFwU3RvcmUoKX0sXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbnBheW1lbnQ6e1xuYnlTbG90Om1ha2VTY2FsYXJNYXBTdG9yZSgpLFxuYnlWYWw6bWFrZVNjYWxhck1hcFN0b3JlKCl9LFxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG51bmtub3duOntcbmJ5U2xvdDptYWtlU2NhbGFyTWFwU3RvcmUoKSxcbmJ5VmFsOm1ha2VTY2FsYXJNYXBTdG9yZSgpfX07XG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGJvYXJkT2JqZWN0cz17XG5ieVNsb3Q6bWFrZVNjYWxhck1hcFN0b3JlKCksXG5ieVZhbDptYWtlU2NhbGFyTWFwU3RvcmUoKX07XG5cblxuLypcblxuXG5cblxuXG4gICAqL1xuY29uc3QgcHJvdmlkZVZhbD0odGFibGUsc2xvdCxpZmFjZSk9PntcbmlmKHRhYmxlLmJ5U2xvdC5oYXMoc2xvdCkpe1xucmV0dXJuIHRhYmxlLmJ5U2xvdC5nZXQoc2xvdCk7XG4gfVxuY29uc3QgdmFsPW1ha2VQcmVzZW5jZShpZmFjZSk7XG5pbml0U2xvdFZhbCh0YWJsZSxzbG90LHZhbCk7XG5yZXR1cm4gdmFsO1xuIH07XG5cbmNvbnN0IHNsb3RUb1ZhbD17XG4vKlxuXG5cbiAgICAgKi9cbmZyb21Cb2FyZDooc2xvdCxpZmFjZSk9PntcbmlzRGVmYXVsdEJvYXJkSWQoc2xvdCl8fEZhaWwgYGJhZCBib2FyZCBzbG90ICR7cShzbG90KX1gO1xucmV0dXJuIHByb3ZpZGVWYWwoYm9hcmRPYmplY3RzLHNsb3QsaWZhY2UpO1xuIH0sXG5cbi8qXG5cblxuICAgICAqL1xuZnJvbU15V2FsbGV0OihzbG90LGlmYWNlKT0+e1xuaWYoIXNsb3Qpe1xuLy9cbnJldHVybiBtYWtlUHJlc2VuY2UoIGAke3Nsb3R9YCk7XG4gfVxuY29uc3R7a2luZCxpZH09cGFyc2VXYWxsZXRTbG90KHdhbGxldE9iamVjdHMsc2xvdCk7XG5yZXR1cm4ga2luZD9cbnByb3ZpZGVWYWwod2FsbGV0T2JqZWN0c1traW5kXSxpZCxpZmFjZSk6XG5zbG90VG9WYWwuZnJvbUJvYXJkKHNsb3QsaWZhY2UpO1xuIH19O1xuXG5cbmNvbnN0IHZhbFRvU2xvdD17XG5mcm9tQm9hcmQ6KHZhbCk9PmJvYXJkT2JqZWN0cy5ieVZhbC5nZXQodmFsKSxcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmZyb21NeVdhbGxldDoodmFsKT0+e1xuY29uc3Qga2luZD1maW5kS2V5KHdhbGxldE9iamVjdHMsKGspPT53YWxsZXRPYmplY3RzW2tdLmJ5VmFsLmhhcyh2YWwpKTtcbmlmKGtpbmQ9PT11bmRlZmluZWQpe1xudGhyb3cgRmFpbCBgY2Fubm90IHNlcmlhbGl6ZSB1bnJlZ2lzdGVyZWQgJHt2YWx9YDtcbiB9XG5cbmNvbnN0IGlkPXdhbGxldE9iamVjdHNba2luZF0uYnlWYWwuZ2V0KHZhbCk7XG5yZXR1cm4gbWFrZVdhbGxldFNsb3Qod2FsbGV0T2JqZWN0cyxraW5kLGlkKTtcbiB9fTtcblxuXG5jb25zdCBtYXJzaGFsPXtcbmZyb21Cb2FyZDptYWtlTWFyc2hhbCh2YWxUb1Nsb3QuZnJvbUJvYXJkLHNsb3RUb1ZhbC5mcm9tQm9hcmQse1xubWFyc2hhbE5hbWU6J2Zyb21Cb2FyZCcsXG5zZXJpYWxpemVCb2R5Rm9ybWF0OidzbWFsbGNhcHMnfSksXG5cbmZyb21NeVdhbGxldDptYWtlTWFyc2hhbCh2YWxUb1Nsb3QuZnJvbU15V2FsbGV0LHNsb3RUb1ZhbC5mcm9tTXlXYWxsZXQse1xubWFyc2hhbE5hbWU6J2Zyb21NeVdhbGxldCcsXG5zZXJpYWxpemVCb2R5Rm9ybWF0OidzbWFsbGNhcHMnfSl9O1xuXG5cblxucmV0dXJuIGhhcmRlbih7XG4vKlxuXG5cbiAgICAgKi9cbmluaXRCb2FyZElkOihpZCx2YWwpPT57XG5pbml0U2xvdFZhbChib2FyZE9iamVjdHMsaWQsdmFsKTtcbiB9LFxuLypcblxuXG4gICAgICovXG5lbnN1cmVCb2FyZElkOihpZCx2YWwpPT57XG5pZihib2FyZE9iamVjdHMuYnlWYWwuaGFzKHZhbCkpe1xuYXNzZXJ0LmVxdWFsKGJvYXJkT2JqZWN0cy5ieVZhbC5nZXQodmFsKSxpZCk7XG5yZXR1cm47XG4gfVxuaW5pdFNsb3RWYWwoYm9hcmRPYmplY3RzLGlkLHZhbCk7XG4gfSxcbmZyb21NeVdhbGxldDpGYXIoJ3dhbGxldCBtYXJzaGFsbGVyJyx7Li4ubWFyc2hhbC5mcm9tTXlXYWxsZXR9KSxcbmZyb21Cb2FyZDpGYXIoJ2JvYXJkIG1hcnNoYWxsZXInLHsuLi5tYXJzaGFsLmZyb21Cb2FyZH0pfSk7XG5cbiB9O1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5tYWtlSW1wb3J0Q29udGV4dChtYWtlSW1wb3J0Q29udGV4dCk7XG5jb25zdCBtYWtlUHJlc2VuY2U9KGlmYWNlLGhhbmRsZXIpPT57XG5sZXQgb2JqO1xuXG52b2lkIG5ldyBIYW5kbGVkUHJvbWlzZSgocmVzb2x2ZSxyZWplY3QscmVzb2x2ZVdpdGhQcmVzZW5jZSk9Pntcbm9iaj1yZXNvbHZlV2l0aFByZXNlbmNlKGhhbmRsZXIpO1xuIH0pO1xuYXNzZXJ0KG9iaik7XG5yZXR1cm4gUmVtb3RhYmxlKGlmYWNlLHVuZGVmaW5lZCxvYmopO1xuIH07XG5cbi8qXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZUxvZ2dpbmdQcmVzZW5jZT0oaWZhY2UsbG9nKT0+e1xuLyogICAgICAgICAgICAgICovIC8vXG5jb25zdCBpdD1tYWtlUHJlc2VuY2UoaWZhY2Use1xuYXBwbHlNZXRob2Q6KHRhcmdldCxtZXRob2QsYXJncyk9PntcbmxvZyhoYXJkZW4oWydhcHBseU1ldGhvZCcsdGFyZ2V0LG1ldGhvZCxhcmdzXSkpO1xuIH0sXG5hcHBseUZ1bmN0aW9uOih0YXJnZXQsYXJncyk9PntcbmxvZyhoYXJkZW4oWydhcHBseUZ1bmN0aW9uJyx0YXJnZXQsYXJnc10pKTtcbiB9fSk7XG5cbnJldHVybiBpdDtcbiB9OyRozY9fb25jZS5tYWtlTG9nZ2luZ1ByZXNlbmNlKG1ha2VMb2dnaW5nUHJlc2VuY2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUV4cG9ydENvbnRleHQiOlsibWFrZUV4cG9ydENvbnRleHQiXSwibWFrZUltcG9ydENvbnRleHQiOlsibWFrZUltcG9ydENvbnRleHQiXSwibWFrZUxvZ2dpbmdQcmVzZW5jZSI6WyJtYWtlTG9nZ2luZ1ByZXNlbmNlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKGq/S/DDQAAww0AACcAAABAYWdvcmljL3N0b3JlLXYwLjkuMy11MTkuMC9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiQGVuZG8vcGF0dGVybnMiLCIuL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanMiLCIuL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qcyIsIi4vc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qcyIsIi4vc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzIiwiLi9zdG9yZXMvc3RvcmUtdXRpbHMuanMiLCJAZW5kby9leG8iLCIuL2xlZ2FjeS9sZWdhY3lNYXAuanMiLCIuL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzIiwiLi90eXBlcy5qcyJdLCJleHBvcnRzIjpbImFzc2VydEtleSIsImFzc2VydEtleSIsImRlZmluZUV4b0NsYXNzIiwiZGVmaW5lRXhvQ2xhc3MiLCJtdXN0TWF0Y2giLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGxdLCJyZWV4cG9ydHMiOlsiLi90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IHR5cGVsZXNzTXVzdE1hdGNoOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIm11c3RNYXRjaFwiLCBbJGjNj19hID0+ICh0eXBlbGVzc011c3RNYXRjaCA9ICRozY9fYSldXV1dLFtcIi4vc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qc1wiLCBbXV0sW1wiLi9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanNcIiwgW11dLFtcIi4vc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qc1wiLCBbXV0sW1wiLi9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanNcIiwgW11dLFtcIi4vc3RvcmVzL3N0b3JlLXV0aWxzLmpzXCIsIFtdXSxbXCJAZW5kby9leG9cIiwgW11dLFtcIi4vbGVnYWN5L2xlZ2FjeU1hcC5qc1wiLCBbXV0sW1wiLi9sZWdhY3kvbGVnYWN5V2Vha01hcC5qc1wiLCBbXV0sW1wiLi90eXBlcy5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLy9cbi8vXG4vKiAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0ICAgICAgICBtdXN0TWF0Y2g9dHlwZWxlc3NNdXN0TWF0Y2g7JGjNj19vbmNlLm11c3RNYXRjaChtdXN0TWF0Y2gpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzIjpbWyJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIiwibWFrZVNjYWxhcldlYWtTZXRTdG9yZSJdXSwiLi9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanMiOltbIm1ha2VTY2FsYXJTZXRTdG9yZSIsIm1ha2VTY2FsYXJTZXRTdG9yZSJdXSwiLi9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzIjpbWyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhcldlYWtNYXBTdG9yZSJdXSwiLi9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanMiOltbIm1ha2VTY2FsYXJNYXBTdG9yZSIsIm1ha2VTY2FsYXJNYXBTdG9yZSJdXSwiLi9zdG9yZXMvc3RvcmUtdXRpbHMuanMiOltbInByb3ZpZGVMYXp5IiwicHJvdmlkZUxhenkiXV0sIkBlbmRvL3BhdHRlcm5zIjpbWyJpc0tleSIsImlzS2V5Il0sWyJhc3NlcnRLZXkiLCJhc3NlcnRLZXkiXSxbImFzc2VydFNjYWxhcktleSIsImFzc2VydFNjYWxhcktleSJdLFsibWFrZUNvcHlTZXQiLCJtYWtlQ29weVNldCJdLFsiZ2V0Q29weVNldEtleXMiLCJnZXRDb3B5U2V0S2V5cyJdLFsibWFrZUNvcHlCYWciLCJtYWtlQ29weUJhZyJdLFsibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiLCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyJdLFsiZ2V0Q29weUJhZ0VudHJpZXMiLCJnZXRDb3B5QmFnRW50cmllcyJdLFsibWFrZUNvcHlNYXAiLCJtYWtlQ29weU1hcCJdLFsiZ2V0Q29weU1hcEVudHJpZXMiLCJnZXRDb3B5TWFwRW50cmllcyJdLFsiY29lcmNlVG9FbGVtZW50cyIsImNvZXJjZVRvRWxlbWVudHMiXSxbImNvZXJjZVRvQmFnRW50cmllcyIsImNvZXJjZVRvQmFnRW50cmllcyJdLFsiY29tcGFyZUtleXMiLCJjb21wYXJlS2V5cyJdLFsia2V5TFQiLCJrZXlMVCJdLFsia2V5TFRFIiwia2V5TFRFIl0sWyJrZXlFUSIsImtleUVRIl0sWyJrZXlHVEUiLCJrZXlHVEUiXSxbImtleUdUIiwia2V5R1QiXSxbImVsZW1lbnRzSXNTdXBlcnNldCIsImVsZW1lbnRzSXNTdXBlcnNldCJdLFsiZWxlbWVudHNJc0Rpc2pvaW50IiwiZWxlbWVudHNJc0Rpc2pvaW50Il0sWyJlbGVtZW50c0NvbXBhcmUiLCJlbGVtZW50c0NvbXBhcmUiXSxbImVsZW1lbnRzVW5pb24iLCJlbGVtZW50c1VuaW9uIl0sWyJlbGVtZW50c0Rpc2pvaW50VW5pb24iLCJlbGVtZW50c0Rpc2pvaW50VW5pb24iXSxbImVsZW1lbnRzSW50ZXJzZWN0aW9uIiwiZWxlbWVudHNJbnRlcnNlY3Rpb24iXSxbImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCIsImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCJdLFsic2V0SXNTdXBlcnNldCIsInNldElzU3VwZXJzZXQiXSxbInNldElzRGlzam9pbnQiLCJzZXRJc0Rpc2pvaW50Il0sWyJzZXRDb21wYXJlIiwic2V0Q29tcGFyZSJdLFsic2V0VW5pb24iLCJzZXRVbmlvbiJdLFsic2V0RGlzam9pbnRVbmlvbiIsInNldERpc2pvaW50VW5pb24iXSxbInNldEludGVyc2VjdGlvbiIsInNldEludGVyc2VjdGlvbiJdLFsic2V0RGlzam9pbnRTdWJ0cmFjdCIsInNldERpc2pvaW50U3VidHJhY3QiXSxbImJhZ0lzU3VwZXJiYWciLCJiYWdJc1N1cGVyYmFnIl0sWyJiYWdDb21wYXJlIiwiYmFnQ29tcGFyZSJdLFsiYmFnVW5pb24iLCJiYWdVbmlvbiJdLFsiYmFnSW50ZXJzZWN0aW9uIiwiYmFnSW50ZXJzZWN0aW9uIl0sWyJiYWdEaXNqb2ludFN1YnRyYWN0IiwiYmFnRGlzam9pbnRTdWJ0cmFjdCJdLFsiTSIsIk0iXSxbImdldFJhbmtDb3ZlciIsImdldFJhbmtDb3ZlciJdLFsiaXNQYXR0ZXJuIiwiaXNQYXR0ZXJuIl0sWyJhc3NlcnRQYXR0ZXJuIiwiYXNzZXJ0UGF0dGVybiJdLFsibWF0Y2hlcyIsIm1hdGNoZXMiXSxbImlzQ29weVNldCIsImlzQ29weVNldCJdLFsiaXNDb3B5TWFwIiwiaXNDb3B5TWFwIl1dLCJAZW5kby9leG8iOltbImluaXRFbXB0eSIsImluaXRFbXB0eSJdLFsiZGVmaW5lRXhvQ2xhc3MiLCJkZWZpbmVFeG9DbGFzcyJdLFsiZGVmaW5lRXhvQ2xhc3NLaXQiLCJkZWZpbmVFeG9DbGFzc0tpdCJdLFsibWFrZUV4byIsIm1ha2VFeG8iXV0sIi4vbGVnYWN5L2xlZ2FjeU1hcC5qcyI6W1sibWFrZUxlZ2FjeU1hcCIsIm1ha2VMZWdhY3lNYXAiXV0sIi4vbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanMiOltbIm1ha2VMZWdhY3lXZWFrTWFwIiwibWFrZUxlZ2FjeVdlYWtNYXAiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibXVzdE1hdGNoIjpbIm11c3RNYXRjaCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADO5ZdIZAUAAGQFAAAyAAAAQGFnb3JpYy9zdG9yZS12MC45LjMtdTE5LjAvc3JjL2xlZ2FjeS9sZWdhY3lNYXAuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsibWFrZUxlZ2FjeU1hcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IEZhaWwscTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLCBbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIiwgWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIG1ha2VMZWdhY3lNYXA9KHRhZz0na2V5Jyk9PntcbmNvbnN0IG09bmV3IE1hcCgpO1xuY29uc3QgYXNzZXJ0S2V5RG9lc05vdEV4aXN0PShrZXkpPT5cbiFtLmhhcyhrZXkpfHxGYWlsIGAke3EodGFnKX0gYWxyZWFkeSByZWdpc3RlcmVkOiAke2tleX1gO1xuY29uc3QgYXNzZXJ0S2V5RXhpc3RzPShrZXkpPT5cbm0uaGFzKGtleSl8fEZhaWwgYCR7cSh0YWcpfSBub3QgZm91bmQ6ICR7a2V5fWA7XG5yZXR1cm4gaGFyZGVuKHtcbmhhczooa2V5KT0+e1xuLy9cbi8vXG4vL1xucmV0dXJuIG0uaGFzKGtleSk7XG4gfSxcbmluaXQ6KGtleSx2YWx1ZSk9PntcbmFzc2VydEtleURvZXNOb3RFeGlzdChrZXkpO1xubS5zZXQoa2V5LHZhbHVlKTtcbiB9LFxuZ2V0OihrZXkpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbnJldHVybiBtLmdldChrZXkpO1xuIH0sXG5zZXQ6KGtleSx2YWx1ZSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xubS5zZXQoa2V5LHZhbHVlKTtcbiB9LFxuZGVsZXRlOihrZXkpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbm0uZGVsZXRlKGtleSk7XG4gfSxcbmtleXM6KCk9Pm0ua2V5cygpLFxudmFsdWVzOigpPT5tLnZhbHVlcygpLFxuZW50cmllczooKT0+bS5lbnRyaWVzKCksXG5nZXRTaXplOigpPT5tLnNpemUsXG5jbGVhcjooKT0+bS5jbGVhcigpfSk7XG5cbiB9OyRozY9fb25jZS5tYWtlTGVnYWN5TWFwKG1ha2VMZWdhY3lNYXApO1xuaGFyZGVuKG1ha2VMZWdhY3lNYXApO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUxlZ2FjeU1hcCI6WyJtYWtlTGVnYWN5TWFwIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAG3xWSMmBQAAJgUAADYAAABAYWdvcmljL3N0b3JlLXYwLjkuMy11MTkuMC9zcmMvbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsibWFrZUxlZ2FjeVdlYWtNYXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBGYWlsLHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIiwgWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsIFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuXG4vKlxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZUxlZ2FjeVdlYWtNYXA9KHRhZz0na2V5Jyk9Pntcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHdtPW5ldyBXZWFrTWFwKCk7XG5jb25zdCBhc3NlcnRLZXlEb2VzTm90RXhpc3Q9KGtleSk9PlxuIXdtLmhhcyhrZXkpfHxGYWlsIGAke3EodGFnKX0gYWxyZWFkeSByZWdpc3RlcmVkOiAke2tleX1gO1xuY29uc3QgYXNzZXJ0S2V5RXhpc3RzPShrZXkpPT5cbndtLmhhcyhrZXkpfHxGYWlsIGAke3EodGFnKX0gbm90IGZvdW5kOiAke2tleX1gO1xucmV0dXJuIGhhcmRlbih7XG5oYXM6KGtleSk9Pntcbi8vXG4vL1xuLy9cbnJldHVybiB3bS5oYXMoa2V5KTtcbiB9LFxuaW5pdDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RG9lc05vdEV4aXN0KGtleSk7XG53bS5zZXQoa2V5LHZhbHVlKTtcbiB9LFxuZ2V0OihrZXkpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbi8vXG5yZXR1cm4gKC8qICAgICAgICAgICAgKi93bS5nZXQoa2V5KSk7XG4gfSxcbnNldDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG53bS5zZXQoa2V5LHZhbHVlKTtcbiB9LFxuZGVsZXRlOihrZXkpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbndtLmRlbGV0ZShrZXkpO1xuIH19KTtcblxuIH07JGjNj19vbmNlLm1ha2VMZWdhY3lXZWFrTWFwKG1ha2VMZWdhY3lXZWFrTWFwKTtcbmhhcmRlbihtYWtlTGVnYWN5V2Vha01hcCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTGVnYWN5V2Vha01hcCI6WyJtYWtlTGVnYWN5V2Vha01hcCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACFnm5myxAAAMsQAAA3AAAAQGFnb3JpYy9zdG9yZS12MC45LjMtdTE5LjAvc3JjL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL3BhdHRlcm5zIiwiLi9zY2FsYXJXZWFrTWFwU3RvcmUuanMiLCIuL3N0b3JlLXV0aWxzLmpzIl0sImV4cG9ydHMiOlsibWFrZU1hcFN0b3JlTWV0aG9kcyIsIm1ha2VTY2FsYXJNYXBTdG9yZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IHEsRmFyLGFzc2VydFBhc3NhYmxlLGZpbHRlckl0ZXJhYmxlLG1hcEl0ZXJhYmxlLGNvbXBhcmVSYW5rLGFzc2VydFNjYWxhcktleSxtYWtlQ29weU1hcCxtYXRjaGVzLG11c3RNYXRjaCxhc3NlcnRQYXR0ZXJuLG1ha2VXZWFrTWFwU3RvcmVNZXRob2RzLG1ha2VDdXJyZW50S2V5c0tpdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLCBbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiRmFyXCIsIFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVwiLCBbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRozY9fYSldXSxbXCJmaWx0ZXJJdGVyYWJsZVwiLCBbJGjNj19hID0+IChmaWx0ZXJJdGVyYWJsZSA9ICRozY9fYSldXSxbXCJtYXBJdGVyYWJsZVwiLCBbJGjNj19hID0+IChtYXBJdGVyYWJsZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImNvbXBhcmVSYW5rXCIsIFskaM2PX2EgPT4gKGNvbXBhcmVSYW5rID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcImFzc2VydFNjYWxhcktleVwiLCBbJGjNj19hID0+IChhc3NlcnRTY2FsYXJLZXkgPSAkaM2PX2EpXV0sW1wibWFrZUNvcHlNYXBcIiwgWyRozY9fYSA9PiAobWFrZUNvcHlNYXAgPSAkaM2PX2EpXV0sW1wibWF0Y2hlc1wiLCBbJGjNj19hID0+IChtYXRjaGVzID0gJGjNj19hKV1dLFtcIm11c3RNYXRjaFwiLCBbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UGF0dGVyblwiLCBbJGjNj19hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjNj19hKV1dXV0sW1wiLi9zY2FsYXJXZWFrTWFwU3RvcmUuanNcIiwgW1tcIm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzXCIsIFskaM2PX2EgPT4gKG1ha2VXZWFrTWFwU3RvcmVNZXRob2RzID0gJGjNj19hKV1dXV0sW1wiLi9zdG9yZS11dGlscy5qc1wiLCBbW1wibWFrZUN1cnJlbnRLZXlzS2l0XCIsIFskaM2PX2EgPT4gKG1ha2VDdXJyZW50S2V5c0tpdCA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLypcblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIG1ha2VNYXBTdG9yZU1ldGhvZHM9KFxuanNtYXAsXG5hc3NlcnRLVk9rVG9BZGQsXG5hc3NlcnRLVk9rVG9TZXQsXG5hc3NlcnRLZXlPa1RvRGVsZXRlPXVuZGVmaW5lZCxcbnRhZz0na2V5Jyk9Plxue1xuY29uc3R7YXNzZXJ0VXBkYXRlT25BZGQsYXNzZXJ0VXBkYXRlT25EZWxldGUsaXRlcmFibGVLZXlzfT1cbm1ha2VDdXJyZW50S2V5c0tpdChcbigpPT5qc21hcC5rZXlzKCksXG4oayk9PmpzbWFwLmhhcyhrKSxcbmNvbXBhcmVSYW5rLFxuYXNzZXJ0S1ZPa1RvQWRkLFxuYXNzZXJ0S2V5T2tUb0RlbGV0ZSxcbnRhZyk7XG5cblxuLypcblxuXG5cbiAgICovXG5jb25zdCBrZXlzPShrZXlQYXR0PXVuZGVmaW5lZCx2YWx1ZVBhdHQ9dW5kZWZpbmVkKT0+e1xuaWYoa2V5UGF0dD09PXVuZGVmaW5lZCYmdmFsdWVQYXR0PT09dW5kZWZpbmVkKXtcbnJldHVybiBpdGVyYWJsZUtleXM7XG4gfVxuY29uc3QgZmlsdGVyPShrKT0+e1xuaWYoa2V5UGF0dCE9PXVuZGVmaW5lZCYmIW1hdGNoZXMoayxrZXlQYXR0KSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuLy9cbmlmKHZhbHVlUGF0dCE9PXVuZGVmaW5lZCYmIW1hdGNoZXMoanNtYXAuZ2V0KGspLHZhbHVlUGF0dCkpe1xucmV0dXJuIGZhbHNlO1xuIH1cbnJldHVybiB0cnVlO1xuIH07XG5yZXR1cm4gZmlsdGVySXRlcmFibGUoaXRlcmFibGVLZXlzLGZpbHRlcik7XG4gfTtcblxuLypcblxuXG5cbiAgICovXG5jb25zdCB2YWx1ZXM9KGtleVBhdHQ9dW5kZWZpbmVkLHZhbHVlUGF0dD11bmRlZmluZWQpPT5cbm1hcEl0ZXJhYmxlKGtleXMoa2V5UGF0dCx2YWx1ZVBhdHQpLChrKT0+LyogICAgICAgICAgICAqL2pzbWFwLmdldChrKSk7XG5cbi8qXG5cblxuXG4gICAqL1xuY29uc3QgZW50cmllcz0oa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9PlxubWFwSXRlcmFibGUoa2V5cyhrZXlQYXR0LHZhbHVlUGF0dCksKGspPT5bXG5rLFxuLyogICAgICAgICAgICAqL2pzbWFwLmdldChrKV0pO1xuXG5cbnJldHVybiBoYXJkZW4oe1xuLi4ubWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMoXG5qc21hcCxcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovYXNzZXJ0VXBkYXRlT25BZGQsXG5hc3NlcnRLVk9rVG9TZXQsXG5hc3NlcnRVcGRhdGVPbkRlbGV0ZSxcbnRhZyksXG5cbmtleXMsXG52YWx1ZXMsXG5lbnRyaWVzLFxuXG5zbmFwc2hvdDooa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9PlxubWFrZUNvcHlNYXAoZW50cmllcyhrZXlQYXR0LHZhbHVlUGF0dCkpLFxuXG5nZXRTaXplOihrZXlQYXR0PXVuZGVmaW5lZCx2YWx1ZVBhdHQ9dW5kZWZpbmVkKT0+XG5rZXlQYXR0PT09dW5kZWZpbmVkJiZ2YWx1ZVBhdHQ9PT11bmRlZmluZWQ/XG5qc21hcC5zaXplOlxuWy4uLmtleXMoa2V5UGF0dCx2YWx1ZVBhdHQpXS5sZW5ndGgsXG5cbmNsZWFyOihrZXlQYXR0PXVuZGVmaW5lZCx2YWx1ZVBhdHQ9dW5kZWZpbmVkKT0+e1xuaWYoa2V5UGF0dD09PXVuZGVmaW5lZCYmdmFsdWVQYXR0PT09dW5kZWZpbmVkKXtcbmpzbWFwLmNsZWFyKCk7XG4gfVxuZm9yKGNvbnN0IGtleSBvZiBrZXlzKGtleVBhdHQsdmFsdWVQYXR0KSl7XG5qc21hcC5kZWxldGUoa2V5KTtcbiB9XG4gfX0pO1xuXG4gfTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLm1ha2VNYXBTdG9yZU1ldGhvZHMobWFrZU1hcFN0b3JlTWV0aG9kcyk7XG5jb25zdCAgICAgICAgbWFrZVNjYWxhck1hcFN0b3JlPShcbnRhZz0na2V5JyxcbntrZXlTaGFwZT11bmRlZmluZWQsdmFsdWVTaGFwZT11bmRlZmluZWR9PXt9KT0+XG57XG5jb25zdCBqc21hcD1uZXcgTWFwKCk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKGtleVNoYXBlKTtcbiB9XG5pZih2YWx1ZVNoYXBlIT09dW5kZWZpbmVkKXtcbmFzc2VydFBhdHRlcm4odmFsdWVTaGFwZSk7XG4gfVxuXG5jb25zdCBhc3NlcnRLVk9rVG9TZXQ9KF9rZXksdmFsdWUpPT57XG4vL1xuLy9cbmhhcmRlbih2YWx1ZSk7XG5cbmFzc2VydFBhc3NhYmxlKHZhbHVlKTtcbmlmKHZhbHVlU2hhcGUhPT11bmRlZmluZWQpe1xubXVzdE1hdGNoKHZhbHVlLHZhbHVlU2hhcGUsJ21hcFN0b3JlIHZhbHVlJyk7XG4gfVxuIH07XG5cbmNvbnN0IGFzc2VydEtWT2tUb0FkZD0oa2V5LHZhbHVlKT0+e1xuLy9cbi8vXG5oYXJkZW4oa2V5KTtcblxuYXNzZXJ0U2NhbGFyS2V5KGtleSk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5tdXN0TWF0Y2goa2V5LGtleVNoYXBlLCdtYXBTdG9yZSBrZXknKTtcbiB9XG5hc3NlcnRLVk9rVG9TZXQoa2V5LHZhbHVlKTtcbiB9O1xuXG5yZXR1cm4gRmFyKCBgc2NhbGFyIE1hcFN0b3JlIG9mICR7cSh0YWcpfWAse1xuLi4ubWFrZU1hcFN0b3JlTWV0aG9kcyhcbmpzbWFwLFxuYXNzZXJ0S1ZPa1RvQWRkLFxuYXNzZXJ0S1ZPa1RvU2V0LFxudW5kZWZpbmVkLFxudGFnKX0pO1xuXG5cbiB9OyRozY9fb25jZS5tYWtlU2NhbGFyTWFwU3RvcmUobWFrZVNjYWxhck1hcFN0b3JlKTtcbmhhcmRlbihtYWtlU2NhbGFyTWFwU3RvcmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU1hcFN0b3JlTWV0aG9kcyI6WyJtYWtlTWFwU3RvcmVNZXRob2RzIl0sIm1ha2VTY2FsYXJNYXBTdG9yZSI6WyJtYWtlU2NhbGFyTWFwU3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAQkx9HvwLAAD8CwAANwAAAEBhZ29yaWMvc3RvcmUtdjAuOS4zLXUxOS4wL3NyYy9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9wYXR0ZXJucyIsIi4vc2NhbGFyV2Vha1NldFN0b3JlLmpzIiwiLi9zdG9yZS11dGlscy5qcyJdLCJleHBvcnRzIjpbIm1ha2VTY2FsYXJTZXRTdG9yZSIsIm1ha2VTZXRTdG9yZU1ldGhvZHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBxLEZhcixmaWx0ZXJJdGVyYWJsZSxjb21wYXJlUmFuayxhc3NlcnRTY2FsYXJLZXksbWFrZUNvcHlTZXQsbWF0Y2hlcyxtdXN0TWF0Y2gsYXNzZXJ0UGF0dGVybixtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyxtYWtlQ3VycmVudEtleXNLaXQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIiwgWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcIkZhclwiLCBbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wiZmlsdGVySXRlcmFibGVcIiwgWyRozY9fYSA9PiAoZmlsdGVySXRlcmFibGUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJjb21wYXJlUmFua1wiLCBbJGjNj19hID0+IChjb21wYXJlUmFuayA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJhc3NlcnRTY2FsYXJLZXlcIiwgWyRozY9fYSA9PiAoYXNzZXJ0U2NhbGFyS2V5ID0gJGjNj19hKV1dLFtcIm1ha2VDb3B5U2V0XCIsIFskaM2PX2EgPT4gKG1ha2VDb3B5U2V0ID0gJGjNj19hKV1dLFtcIm1hdGNoZXNcIiwgWyRozY9fYSA9PiAobWF0Y2hlcyA9ICRozY9fYSldXSxbXCJtdXN0TWF0Y2hcIiwgWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcImFzc2VydFBhdHRlcm5cIiwgWyRozY9fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRozY9fYSldXV1dLFtcIi4vc2NhbGFyV2Vha1NldFN0b3JlLmpzXCIsIFtbXCJtYWtlV2Vha1NldFN0b3JlTWV0aG9kc1wiLCBbJGjNj19hID0+IChtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyA9ICRozY9fYSldXV1dLFtcIi4vc3RvcmUtdXRpbHMuanNcIiwgW1tcIm1ha2VDdXJyZW50S2V5c0tpdFwiLCBbJGjNj19hID0+IChtYWtlQ3VycmVudEtleXNLaXQgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLypcblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIG1ha2VTZXRTdG9yZU1ldGhvZHM9KFxuanNzZXQsXG5hc3NlcnRLZXlPa1RvQWRkLFxuYXNzZXJ0S2V5T2tUb0RlbGV0ZT11bmRlZmluZWQsXG5rZXlOYW1lPSdrZXknKT0+XG57XG5jb25zdHthc3NlcnRVcGRhdGVPbkFkZCxhc3NlcnRVcGRhdGVPbkRlbGV0ZSxpdGVyYWJsZUtleXN9PVxubWFrZUN1cnJlbnRLZXlzS2l0KFxuKCk9Pmpzc2V0LmtleXMoKSxcbihrKT0+anNzZXQuaGFzKGspLFxuY29tcGFyZVJhbmssXG5hc3NlcnRLZXlPa1RvQWRkLFxuYXNzZXJ0S2V5T2tUb0RlbGV0ZSxcbmtleU5hbWUpO1xuXG5cbi8qXG5cblxuICAgKi9cbmNvbnN0IGtleXM9KGtleVBhdHQ9dW5kZWZpbmVkKT0+XG5rZXlQYXR0PT09dW5kZWZpbmVkP1xuaXRlcmFibGVLZXlzOlxuZmlsdGVySXRlcmFibGUoaXRlcmFibGVLZXlzLChrKT0+bWF0Y2hlcyhrLGtleVBhdHQpKTtcblxucmV0dXJuIGhhcmRlbih7XG4uLi5tYWtlV2Vha1NldFN0b3JlTWV0aG9kcyhcbmpzc2V0LFxuYXNzZXJ0VXBkYXRlT25BZGQsXG5hc3NlcnRVcGRhdGVPbkRlbGV0ZSxcbmtleU5hbWUpLFxuXG5cbmtleXMsXG5cbnZhbHVlczprZXlzLFxuXG5zbmFwc2hvdDooa2V5UGF0dD11bmRlZmluZWQpPT5tYWtlQ29weVNldChrZXlzKGtleVBhdHQpKSxcblxuZ2V0U2l6ZTooa2V5UGF0dD11bmRlZmluZWQpPT5cbmtleVBhdHQ9PT11bmRlZmluZWQ/anNzZXQuc2l6ZTpbLi4ua2V5cyhrZXlQYXR0KV0ubGVuZ3RoLFxuXG5jbGVhcjooa2V5UGF0dD11bmRlZmluZWQpPT57XG5pZihrZXlQYXR0PT09dW5kZWZpbmVkKXtcbmpzc2V0LmNsZWFyKCk7XG4gfVxuZm9yKGNvbnN0IGtleSBvZiBrZXlzKGtleVBhdHQpKXtcbmpzc2V0LmRlbGV0ZShrZXkpO1xuIH1cbiB9fSk7XG5cbiB9O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5tYWtlU2V0U3RvcmVNZXRob2RzKG1ha2VTZXRTdG9yZU1ldGhvZHMpO1xuY29uc3QgICAgICAgIG1ha2VTY2FsYXJTZXRTdG9yZT0oXG50YWc9J2tleScsXG57a2V5U2hhcGU9dW5kZWZpbmVkfT17fSk9Plxue1xuY29uc3QganNzZXQ9bmV3IFNldCgpO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0UGF0dGVybihrZXlTaGFwZSk7XG4gfVxuXG5jb25zdCBhc3NlcnRLZXlPa1RvQWRkPShrZXkpPT57XG4vL1xuLy9cbmhhcmRlbihrZXkpO1xuXG5hc3NlcnRTY2FsYXJLZXkoa2V5KTtcbmlmKGtleVNoYXBlIT09dW5kZWZpbmVkKXtcbm11c3RNYXRjaChrZXksa2V5U2hhcGUsJ3NldFN0b3JlIGtleScpO1xuIH1cbiB9O1xuXG5yZXR1cm4gRmFyKCBgc2NhbGFyIFNldFN0b3JlIG9mICR7cSh0YWcpfWAse1xuLi4ubWFrZVNldFN0b3JlTWV0aG9kcyhqc3NldCxhc3NlcnRLZXlPa1RvQWRkLHVuZGVmaW5lZCx0YWcpfSk7XG5cbiB9OyRozY9fb25jZS5tYWtlU2NhbGFyU2V0U3RvcmUobWFrZVNjYWxhclNldFN0b3JlKTtcbmhhcmRlbihtYWtlU2NhbGFyU2V0U3RvcmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVNldFN0b3JlTWV0aG9kcyI6WyJtYWtlU2V0U3RvcmVNZXRob2RzIl0sIm1ha2VTY2FsYXJTZXRTdG9yZSI6WyJtYWtlU2NhbGFyU2V0U3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAxvwtZd8NAADfDQAAOwAAAEBhZ29yaWMvc3RvcmUtdjAuOS4zLXUxOS4wL3NyYy9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiLCJtYWtlV2Vha01hcFN0b3JlTWV0aG9kcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IHEsRmFpbCxGYXIsYXNzZXJ0UGFzc2FibGUscGFzc1N0eWxlT2YsZ2V0Q29weU1hcEVudHJpZXMsbXVzdE1hdGNoLGFzc2VydFBhdHRlcm4saXNDb3B5TWFwOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsIFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLCBbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiRmFyXCIsIFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVwiLCBbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRozY9fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJnZXRDb3B5TWFwRW50cmllc1wiLCBbJGjNj19hID0+IChnZXRDb3B5TWFwRW50cmllcyA9ICRozY9fYSldXSxbXCJtdXN0TWF0Y2hcIiwgWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcImFzc2VydFBhdHRlcm5cIiwgWyRozY9fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRozY9fYSldXSxbXCJpc0NvcHlNYXBcIiwgWyRozY9fYSA9PiAoaXNDb3B5TWFwID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZVdlYWtNYXBTdG9yZU1ldGhvZHM9KFxuanNtYXAsXG5hc3NlcnRLVk9rVG9BZGQsXG5hc3NlcnRLVk9rVG9TZXQsXG5hc3NlcnRLZXlPa1RvRGVsZXRlPXVuZGVmaW5lZCxcbmtleU5hbWU9J2tleScpPT5cbntcbmNvbnN0IGFzc2VydEtleURvZXNOb3RFeGlzdD0oa2V5KT0+XG4hanNtYXAuaGFzKGtleSl8fEZhaWwgYCR7cShrZXlOYW1lKX0gYWxyZWFkeSByZWdpc3RlcmVkOiAke2tleX1gO1xuXG5jb25zdCBhc3NlcnRLZXlFeGlzdHM9KGtleSk9PlxuanNtYXAuaGFzKGtleSl8fEZhaWwgYCR7cShrZXlOYW1lKX0gbm90IGZvdW5kOiAke2tleX1gO1xuXG5yZXR1cm4gaGFyZGVuKHtcbmhhczooa2V5KT0+e1xuLy9cbi8vXG4vL1xucmV0dXJuIGpzbWFwLmhhcyhrZXkpO1xuIH0sXG5nZXQ6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xuLy9cbnJldHVybiAoLyogICAgICAgICAgICAqL2pzbWFwLmdldChrZXkpKTtcbiB9LFxuXG5pbml0OihrZXksdmFsdWUpPT57XG5hc3NlcnRLZXlEb2VzTm90RXhpc3Qoa2V5KTtcbmFzc2VydEtWT2tUb0FkZChrZXksdmFsdWUpO1xuanNtYXAuc2V0KGtleSx2YWx1ZSk7XG4gfSxcbnNldDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG5hc3NlcnRLVk9rVG9TZXQoa2V5LHZhbHVlKTtcbmpzbWFwLnNldChrZXksdmFsdWUpO1xuIH0sXG5kZWxldGU6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xuaWYoYXNzZXJ0S2V5T2tUb0RlbGV0ZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRLZXlPa1RvRGVsZXRlKGtleSk7XG4gfVxuanNtYXAuZGVsZXRlKGtleSk7XG4gfSxcblxuYWRkQWxsOihlbnRyaWVzKT0+e1xuaWYodHlwZW9mIGVudHJpZXNbU3ltYm9sLml0ZXJhdG9yXSE9PSdmdW5jdGlvbicpe1xuaWYoT2JqZWN0LmlzRnJvemVuKGVudHJpZXMpJiZpc0NvcHlNYXAoZW50cmllcykpe1xuLy9cbmVudHJpZXM9Z2V0Q29weU1hcEVudHJpZXMoZW50cmllcyk7XG4gfWVsc2V7XG5GYWlsIGBwcm92aWRlZCBkYXRhIHNvdXJjZSBpcyBub3QgaXRlcmFibGU6ICR7ZW50cmllc31gO1xuIH1cbiB9XG5mb3IoY29uc3Rba2V5LHZhbHVlXW9mLyogICAgICAgICAgICAgICAgICAgICAgICAgICAqL2VudHJpZXMpe1xuLy9cbmFzc2VydEtWT2tUb0FkZChrZXksdmFsdWUpO1xuanNtYXAuc2V0KGtleSx2YWx1ZSk7XG4gfVxuIH19KTtcblxuIH07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5tYWtlV2Vha01hcFN0b3JlTWV0aG9kcyhtYWtlV2Vha01hcFN0b3JlTWV0aG9kcyk7XG5jb25zdCAgICAgICAgbWFrZVNjYWxhcldlYWtNYXBTdG9yZT0oXG50YWc9J2tleScsXG57bG9uZ0xpdmVkPXRydWUsa2V5U2hhcGU9dW5kZWZpbmVkLHZhbHVlU2hhcGU9dW5kZWZpbmVkfT17fSk9Plxue1xuY29uc3QganNtYXA9bmV3KGxvbmdMaXZlZD9XZWFrTWFwOk1hcCkoKTtcbmlmKGtleVNoYXBlIT09dW5kZWZpbmVkKXtcbmFzc2VydFBhdHRlcm4oa2V5U2hhcGUpO1xuIH1cbmlmKHZhbHVlU2hhcGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0UGF0dGVybih2YWx1ZVNoYXBlKTtcbiB9XG5cbmNvbnN0IGFzc2VydEtWT2tUb1NldD0oX2tleSx2YWx1ZSk9Pntcbi8vXG4vL1xuaGFyZGVuKHZhbHVlKTtcblxuYXNzZXJ0UGFzc2FibGUodmFsdWUpO1xuaWYodmFsdWVTaGFwZSE9PXVuZGVmaW5lZCl7XG5tdXN0TWF0Y2godmFsdWUsdmFsdWVTaGFwZSwnd2Vha01hcFN0b3JlIHZhbHVlJyk7XG4gfVxuIH07XG5cbmNvbnN0IGFzc2VydEtWT2tUb0FkZD0oa2V5LHZhbHVlKT0+e1xuLy9cbi8vXG5oYXJkZW4oa2V5KTtcbnBhc3NTdHlsZU9mKGtleSk9PT0ncmVtb3RhYmxlJ3x8XG5GYWlsIGBPbmx5IHJlbW90YWJsZXMgY2FuIGJlIGtleXMgb2Ygc2NhbGFyIFdlYWtNYXBTdG9yZXM6ICR7a2V5fWA7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5tdXN0TWF0Y2goa2V5LGtleVNoYXBlLCd3ZWFrTWFwU3RvcmUga2V5Jyk7XG4gfVxuYXNzZXJ0S1ZPa1RvU2V0KGtleSx2YWx1ZSk7XG4gfTtcblxucmV0dXJuIEZhciggYHNjYWxhciBXZWFrTWFwU3RvcmUgb2YgJHtxKHRhZyl9YCx7XG4uLi5tYWtlV2Vha01hcFN0b3JlTWV0aG9kcyhcbmpzbWFwLFxuYXNzZXJ0S1ZPa1RvQWRkLFxuYXNzZXJ0S1ZPa1RvU2V0LFxudW5kZWZpbmVkLFxudGFnKX0pO1xuXG5cbiB9OyRozY9fb25jZS5tYWtlU2NhbGFyV2Vha01hcFN0b3JlKG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiOlsibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhcldlYWtNYXBTdG9yZSI6WyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIYvvsSiCgAAogoAADsAAABAYWdvcmljL3N0b3JlLXYwLjkuMy11MTkuMC9zcmMvc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIiwibWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBxLEZhaWwsRmFyLHBhc3NTdHlsZU9mLGdldENvcHlTZXRLZXlzLG11c3RNYXRjaCxhc3NlcnRQYXR0ZXJuLGlzQ29weVNldDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLCBbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIiwgWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcIkZhclwiLCBbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiZ2V0Q29weVNldEtleXNcIiwgWyRozY9fYSA9PiAoZ2V0Q29weVNldEtleXMgPSAkaM2PX2EpXV0sW1wibXVzdE1hdGNoXCIsIFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXSxbXCJhc3NlcnRQYXR0ZXJuXCIsIFskaM2PX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaM2PX2EpXV0sW1wiaXNDb3B5U2V0XCIsIFskaM2PX2EgPT4gKGlzQ29weVNldCA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuLypcblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzPShcbmpzc2V0LFxuYXNzZXJ0S2V5T2tUb0FkZCxcbmFzc2VydEtleU9rVG9EZWxldGU9dW5kZWZpbmVkLFxua2V5TmFtZT0na2V5Jyk9Plxue1xuY29uc3QgYXNzZXJ0S2V5RXhpc3RzPShrZXkpPT5cbmpzc2V0LmhhcyhrZXkpfHxGYWlsIGAke3Eoa2V5TmFtZSl9IG5vdCBmb3VuZDogJHtrZXl9YDtcblxucmV0dXJuIGhhcmRlbih7XG5oYXM6KGtleSk9Pntcbi8vXG4vL1xuLy9cbnJldHVybiBqc3NldC5oYXMoa2V5KTtcbiB9LFxuXG5hZGQ6KGtleSk9PntcbmFzc2VydEtleU9rVG9BZGQoa2V5KTtcbmpzc2V0LmFkZChrZXkpO1xuIH0sXG5kZWxldGU6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xuaWYoYXNzZXJ0S2V5T2tUb0RlbGV0ZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRLZXlPa1RvRGVsZXRlKGtleSk7XG4gfVxuanNzZXQuZGVsZXRlKGtleSk7XG4gfSxcblxuYWRkQWxsOihrZXlzKT0+e1xuaWYodHlwZW9mIGtleXNbU3ltYm9sLml0ZXJhdG9yXSE9PSdmdW5jdGlvbicpe1xuaWYoT2JqZWN0LmlzRnJvemVuKGtleXMpJiZpc0NvcHlTZXQoa2V5cykpe1xuLy9cbmtleXM9Z2V0Q29weVNldEtleXMoa2V5cyk7XG4gfWVsc2V7XG5GYWlsIGBwcm92aWRlZCBkYXRhIHNvdXJjZSBpcyBub3QgaXRlcmFibGU6ICR7a2V5c31gO1xuIH1cbiB9XG5mb3IoY29uc3Qga2V5IG9mLyogICAgICAgICAgICAgICAgICAgICAgKi9rZXlzKXtcbmFzc2VydEtleU9rVG9BZGQoa2V5KTtcbmpzc2V0LmFkZChrZXkpO1xuIH1cbiB9fSk7XG5cbiB9O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzKG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzKTtcbmNvbnN0ICAgICAgICBtYWtlU2NhbGFyV2Vha1NldFN0b3JlPShcbnRhZz0na2V5Jyxcbntsb25nTGl2ZWQ9dHJ1ZSxrZXlTaGFwZT11bmRlZmluZWR9PXt9KT0+XG57XG5jb25zdCBqc3NldD1uZXcobG9uZ0xpdmVkP1dlYWtTZXQ6U2V0KSgpO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0UGF0dGVybihrZXlTaGFwZSk7XG4gfVxuXG5jb25zdCBhc3NlcnRLZXlPa1RvQWRkPShrZXkpPT57XG4vL1xuLy9cbmhhcmRlbihrZXkpO1xucGFzc1N0eWxlT2Yoa2V5KT09PSdyZW1vdGFibGUnfHxcbkZhaWwgYE9ubHkgcmVtb3RhYmxlcyBjYW4gYmUga2V5cyBvZiBzY2FsYXIgV2Vha1N0b3JlczogJHtrZXl9YDtcbmlmKGtleVNoYXBlIT09dW5kZWZpbmVkKXtcbm11c3RNYXRjaChrZXksa2V5U2hhcGUsJ3dlYWtTZXRTdG9yZSBrZXknKTtcbiB9XG4gfTtcblxucmV0dXJuIEZhciggYHNjYWxhciBXZWFrU2V0U3RvcmUgb2YgJHtxKHRhZyl9YCx7XG4uLi5tYWtlV2Vha1NldFN0b3JlTWV0aG9kcyhqc3NldCxhc3NlcnRLZXlPa1RvQWRkLHVuZGVmaW5lZCx0YWcpfSk7XG5cbiB9OyRozY9fb25jZS5tYWtlU2NhbGFyV2Vha1NldFN0b3JlKG1ha2VTY2FsYXJXZWFrU2V0U3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJXZWFrU2V0U3RvcmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMiOlsibWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhcldlYWtTZXRTdG9yZSI6WyJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMUCjDPaDgAA2g4AADQAAABAYWdvcmljL3N0b3JlLXYwLjkuMy11MTkuMC9zcmMvc3RvcmVzL3N0b3JlLXV0aWxzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbImFwcGVuZFRvU3RvcmVkQXJyYXkiLCJpc0NvcHlNYXAiLCJpc0NvcHlTZXQiLCJtYWtlQXRvbWljUHJvdmlkZXIiLCJtYWtlQ3VycmVudEtleXNLaXQiLCJwcm92aWRlTGF6eSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IEZhaWwscSxGYXIsTSxtYXRjaGVzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsIFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLCBbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsIFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wibWF0Y2hlc1wiLCBbJGjNj19hID0+IChtYXRjaGVzID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vL1xuLy9cbi8qXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBpc0NvcHlTZXQ9KHMpPT5tYXRjaGVzKHMsTS5zZXQoKSk7XG5cbi8vXG4vL1xuLypcblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5pc0NvcHlTZXQoaXNDb3B5U2V0KTtcbmNvbnN0ICAgICAgICBpc0NvcHlNYXA9KG0pPT5tYXRjaGVzKG0sTS5tYXAoKSk7XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5pc0NvcHlNYXAoaXNDb3B5TWFwKTtcbmNvbnN0ICAgICAgICBtYWtlQ3VycmVudEtleXNLaXQ9KFxuZ2V0UmF3S2V5cyxcbmNoZWNrSGFzLFxuY29tcGFyZSxcbmFzc2VydE9rVG9BZGQsXG5hc3NlcnRPa1RvRGVsZXRlPXVuZGVmaW5lZCxcbmtleU5hbWU9J2tleScpPT5cbntcbmxldCB1cGRhdGVDb3VudD0wO1xubGV0IHNvcnRlZEtleXNNZW1vO1xuXG5jb25zdCBhc3NlcnRVcGRhdGVPbkFkZD0oayx2PXVuZGVmaW5lZCk9PntcbmFzc2VydE9rVG9BZGQoayx2KTtcbnVwZGF0ZUNvdW50Kz0xO1xuc29ydGVkS2V5c01lbW89dW5kZWZpbmVkO1xuIH07XG5cbmNvbnN0IGFzc2VydFVwZGF0ZU9uRGVsZXRlPShrKT0+YXNzZXJ0T2tUb0RlbGV0ZSYmYXNzZXJ0T2tUb0RlbGV0ZShrKTtcblxuY29uc3QgZ2V0U29ydGVkS2V5cz0oKT0+e1xuaWYoc29ydGVkS2V5c01lbW89PT11bmRlZmluZWQpe1xuc29ydGVkS2V5c01lbW89aGFyZGVuKFsuLi5nZXRSYXdLZXlzKCldLnNvcnQoY29tcGFyZSkpO1xuIH1cbnJldHVybiBzb3J0ZWRLZXlzTWVtbztcbiB9O1xuXG5jb25zdCBpdGVyYWJsZUtleXM9RmFyKCdJdGVyYWJsZSBvZiBrZXlzJyx7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+e1xuY29uc3QgZ2VuZXJhdGlvbj11cGRhdGVDb3VudDtcbmdldFNvcnRlZEtleXMoKTtcbmNvbnN0IGxlbj1zb3J0ZWRLZXlzTWVtby5sZW5ndGg7XG5sZXQgaT0wO1xucmV0dXJuIEZhcignSXRlcmF0b3Igb2Yga2V5cycse1xubmV4dDooKT0+e1xuZ2VuZXJhdGlvbj09PXVwZGF0ZUNvdW50fHxGYWlsIGBTdG9yZSAke3Eoa2V5TmFtZSl9IGN1cnNvciBzdGFsZWA7XG4vL1xuLy9cbmZvcig7Oyl7XG5pZihpPGxlbil7XG5jb25zdCB2YWx1ZT1zb3J0ZWRLZXlzTWVtb1tpXTtcbmkrPTE7XG5pZihjaGVja0hhcyh2YWx1ZSkpe1xucmV0dXJuIGhhcmRlbih7ZG9uZTpmYWxzZSx2YWx1ZX0pO1xuIH1cbiB9ZWxzZXtcbnJldHVybiBoYXJkZW4oe2RvbmU6dHJ1ZSx2YWx1ZTp1bmRlZmluZWR9KTtcbiB9XG4gfVxuIH19KTtcblxuIH19KTtcblxuXG5yZXR1cm4gaGFyZGVuKHtcbmFzc2VydFVwZGF0ZU9uQWRkLFxuYXNzZXJ0VXBkYXRlT25EZWxldGUsXG5pdGVyYWJsZUtleXN9KTtcblxuIH07JGjNj19vbmNlLm1ha2VDdXJyZW50S2V5c0tpdChtYWtlQ3VycmVudEtleXNLaXQpO1xuaGFyZGVuKG1ha2VDdXJyZW50S2V5c0tpdCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIHByb3ZpZGVMYXp5PShtYXBTdG9yZSxrZXksbWFrZVZhbHVlKT0+e1xuaWYoIW1hcFN0b3JlLmhhcyhrZXkpKXtcbm1hcFN0b3JlLmluaXQoa2V5LG1ha2VWYWx1ZShrZXkpKTtcbiB9XG5yZXR1cm4gbWFwU3RvcmUuZ2V0KGtleSk7XG4gfTskaM2PX29uY2UucHJvdmlkZUxhenkocHJvdmlkZUxhenkpO1xuaGFyZGVuKHByb3ZpZGVMYXp5KTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZUF0b21pY1Byb3ZpZGVyPShzdG9yZSk9Pntcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgcGVuZGluZz1uZXcgTWFwKCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbmNvbnN0IHByb3ZpZGVBc3luYz0oa2V5LG1ha2VWYWx1ZSxmaW5pc2hWYWx1ZSk9PntcbmlmKHN0b3JlLmhhcyhrZXkpKXtcbnJldHVybiBQcm9taXNlLnJlc29sdmUoc3RvcmUuZ2V0KGtleSkpO1xuIH1cbmlmKCFwZW5kaW5nLmhhcyhrZXkpKXtcbmNvbnN0IHZhbFA9bWFrZVZhbHVlKGtleSkuXG50aGVuKCh2KT0+e1xuc3RvcmUuaW5pdChrZXksdik7XG5yZXR1cm4gdjtcbiB9KS5cbnRoZW4oKHYpPT57XG5pZihmaW5pc2hWYWx1ZSl7XG5yZXR1cm4gZmluaXNoVmFsdWUoa2V5LHYpLnRoZW4oKCk9PnYpO1xuIH1cbnJldHVybiB2O1xuIH0pLlxuZmluYWxseSgoKT0+e1xucGVuZGluZy5kZWxldGUoa2V5KTtcbiB9KTtcbnBlbmRpbmcuc2V0KGtleSx2YWxQKTtcbiB9XG5jb25zdCB2YWxQPXBlbmRpbmcuZ2V0KGtleSk7XG5hc3NlcnQodmFsUCk7XG5yZXR1cm4gdmFsUDtcbiB9O1xuXG5yZXR1cm4gaGFyZGVuKHtwcm92aWRlQXN5bmN9KTtcbiB9OyRozY9fb25jZS5tYWtlQXRvbWljUHJvdmlkZXIobWFrZUF0b21pY1Byb3ZpZGVyKTtcbmhhcmRlbihtYWtlQXRvbWljUHJvdmlkZXIpO1xuLypcblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGFwcGVuZFRvU3RvcmVkQXJyYXk9KG1hcFN0b3JlLGtleSxpdGVtKT0+e1xuaWYobWFwU3RvcmUuaGFzKGtleSkpe1xuY29uc3QgZXh0YW50PW1hcFN0b3JlLmdldChrZXkpO1xubWFwU3RvcmUuc2V0KGtleSxoYXJkZW4oWy4uLmV4dGFudCxpdGVtXSkpO1xuIH1lbHNle1xubWFwU3RvcmUuaW5pdChrZXksaGFyZGVuKFtpdGVtXSkpO1xuIH1cbiB9OyRozY9fb25jZS5hcHBlbmRUb1N0b3JlZEFycmF5KGFwcGVuZFRvU3RvcmVkQXJyYXkpO1xuaGFyZGVuKGFwcGVuZFRvU3RvcmVkQXJyYXkpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNDb3B5U2V0IjpbImlzQ29weVNldCJdLCJpc0NvcHlNYXAiOlsiaXNDb3B5TWFwIl0sIm1ha2VDdXJyZW50S2V5c0tpdCI6WyJtYWtlQ3VycmVudEtleXNLaXQiXSwicHJvdmlkZUxhenkiOlsicHJvdmlkZUxhenkiXSwibWFrZUF0b21pY1Byb3ZpZGVyIjpbIm1ha2VBdG9taWNQcm92aWRlciJdLCJhcHBlbmRUb1N0b3JlZEFycmF5IjpbImFwcGVuZFRvU3RvcmVkQXJyYXkiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAABURLJnkBAAB5AQAAJwAAAEBhZ29yaWMvc3RvcmUtdjAuOS4zLXUxOS4wL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjNj19pbXBvcnRzKFtdKTsgICBcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABvG5SMzxYAAM8WAAAuAAAAQGFnb3JpYy92YXQtZGF0YS12MC41LjMtdTE5LjIvc3JjL2V4by11dGlscy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIiwiLi92YXQtZGF0YS1iaW5kaW5ncy5qcyJdLCJleHBvcnRzIjpbImRlZmluZUR1cmFibGVFeG9DbGFzcyIsImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCIsImRlZmluZVZpcnR1YWxFeG9DbGFzcyIsImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCIsImlnbm9yZUNvbnRleHQiLCJtYWtlRXhvVXRpbHMiLCJwcmVwYXJlRXhvIiwicHJlcGFyZUV4b0NsYXNzIiwicHJlcGFyZUV4b0NsYXNzS2l0IiwicHJlcGFyZUtpbmQiLCJwcmVwYXJlS2luZE11bHRpIiwicHJlcGFyZVNpbmdsZXRvbiIsInByb3ZpZGVLaW5kSGFuZGxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgaW5pdEVtcHR5LHByb3ZpZGUsZ2xvYmFsVmF0RGF0YTskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImluaXRFbXB0eVwiLCBbJGjNj19hID0+IChpbml0RW1wdHkgPSAkaM2PX2EpXV1dXSxbXCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzXCIsIFtbXCJwcm92aWRlXCIsIFskaM2PX2EgPT4gKHByb3ZpZGUgPSAkaM2PX2EpXV0sW1wiVmF0RGF0YVwiLCBbJGjNj19hID0+IChnbG9iYWxWYXREYXRhID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuXG4vKlxuXG5cblxuICovXG5cbi8vXG4vKlxuXG4gKi9cbi8qXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBpZ25vcmVDb250ZXh0PVxuKGZuKT0+XG4oX2NvbnRleHQsLi4uYXJncyk9PlxuZm4oLi4uYXJncyk7JGjNj19vbmNlLmlnbm9yZUNvbnRleHQoaWdub3JlQ29udGV4dCk7XG5oYXJkZW4oaWdub3JlQ29udGV4dCk7XG5cbi8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgICAgICAgIG1ha2VFeG9VdGlscz0oVmF0RGF0YSk9PntcbmNvbnN0e1xuZGVmaW5lS2luZCxcbmRlZmluZUtpbmRNdWx0aSxcbmRlZmluZUR1cmFibGVLaW5kLFxuZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSxcbm1ha2VLaW5kSGFuZGxlfT1cblZhdERhdGE7XG5cbi8qXG5cblxuXG5cbiAgICovXG5jb25zdCBwcm92aWRlS2luZEhhbmRsZT0oYmFnZ2FnZSxraW5kTmFtZSk9PlxucHJvdmlkZShiYWdnYWdlLCBgJHtraW5kTmFtZX1fa2luZEhhbmRsZWAsKCk9Pm1ha2VLaW5kSGFuZGxlKGtpbmROYW1lKSk7XG5oYXJkZW4ocHJvdmlkZUtpbmRIYW5kbGUpO1xuXG4vKlxuXG5cbiAgICovXG5jb25zdCBwcmVwYXJlS2luZD0oXG5iYWdnYWdlLFxua2luZE5hbWUsXG5pbml0LFxuYmVoYXZpb3IsXG5vcHRpb25zPXVuZGVmaW5lZCk9PlxuXG5kZWZpbmVEdXJhYmxlS2luZChcbnByb3ZpZGVLaW5kSGFuZGxlKGJhZ2dhZ2Usa2luZE5hbWUpLFxuaW5pdCxcbmJlaGF2aW9yLFxub3B0aW9ucyk7XG5cbmhhcmRlbihwcmVwYXJlS2luZCk7XG5cbi8qXG5cblxuICAgKi9cbmNvbnN0IHByZXBhcmVLaW5kTXVsdGk9KFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxuaW5pdCxcbmJlaGF2aW9yLFxub3B0aW9ucz11bmRlZmluZWQpPT5cblxuZGVmaW5lRHVyYWJsZUtpbmRNdWx0aShcbnByb3ZpZGVLaW5kSGFuZGxlKGJhZ2dhZ2Usa2luZE5hbWUpLFxuaW5pdCxcbmJlaGF2aW9yLFxub3B0aW9ucyk7XG5cbmhhcmRlbihwcmVwYXJlS2luZE11bHRpKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG5jb25zdCBkZWZpbmVWaXJ0dWFsRXhvQ2xhc3M9KHRhZyxpbnRlcmZhY2VHdWFyZCxpbml0LG1ldGhvZHMsb3B0aW9ucyk9PlxuLy9cbmRlZmluZUtpbmQodGFnLGluaXQsbWV0aG9kcyx7XG4uLi5vcHRpb25zLFxudGhpc2Z1bE1ldGhvZHM6dHJ1ZSxcbmludGVyZmFjZUd1YXJkfSk7XG5cbmhhcmRlbihkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbmNvbnN0IGRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdD0oXG50YWcsXG5pbnRlcmZhY2VHdWFyZEtpdCxcbmluaXQsXG5mYWNldHMsXG5vcHRpb25zKT0+XG5cbi8vXG5kZWZpbmVLaW5kTXVsdGkodGFnLGluaXQsZmFjZXRzLHtcbi4uLm9wdGlvbnMsXG50aGlzZnVsTWV0aG9kczp0cnVlLFxuaW50ZXJmYWNlR3VhcmRLaXR9KTtcblxuaGFyZGVuKGRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuY29uc3QgZGVmaW5lRHVyYWJsZUV4b0NsYXNzPShcbmtpbmRIYW5kbGUsXG5pbnRlcmZhY2VHdWFyZCxcbmluaXQsXG5tZXRob2RzLFxub3B0aW9ucyk9PlxuXG4vL1xuZGVmaW5lRHVyYWJsZUtpbmQoa2luZEhhbmRsZSxpbml0LG1ldGhvZHMse1xuLi4ub3B0aW9ucyxcbnRoaXNmdWxNZXRob2RzOnRydWUsXG5pbnRlcmZhY2VHdWFyZH0pO1xuXG5oYXJkZW4oZGVmaW5lRHVyYWJsZUV4b0NsYXNzKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG5jb25zdCBkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQ9KFxua2luZEhhbmRsZSxcbmludGVyZmFjZUd1YXJkS2l0LFxuaW5pdCxcbmZhY2V0cyxcbm9wdGlvbnMpPT5cblxuLy9cbmRlZmluZUR1cmFibGVLaW5kTXVsdGkoa2luZEhhbmRsZSxpbml0LGZhY2V0cyx7XG4uLi5vcHRpb25zLFxudGhpc2Z1bE1ldGhvZHM6dHJ1ZSxcbmludGVyZmFjZUd1YXJkS2l0fSk7XG5cbmhhcmRlbihkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuY29uc3QgcHJlcGFyZUV4b0NsYXNzPShcbmJhZ2dhZ2UsXG5raW5kTmFtZSxcbmludGVyZmFjZUd1YXJkLFxuaW5pdCxcbm1ldGhvZHMsXG5vcHRpb25zPXVuZGVmaW5lZCk9PlxuXG5kZWZpbmVEdXJhYmxlRXhvQ2xhc3MoXG5wcm92aWRlS2luZEhhbmRsZShiYWdnYWdlLGtpbmROYW1lKSxcbmludGVyZmFjZUd1YXJkLFxuaW5pdCxcbm1ldGhvZHMsXG5vcHRpb25zKTtcblxuaGFyZGVuKHByZXBhcmVFeG9DbGFzcyk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG5jb25zdCBwcmVwYXJlRXhvQ2xhc3NLaXQ9KFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxuaW50ZXJmYWNlR3VhcmRLaXQsXG5pbml0LFxuZmFjZXRzLFxub3B0aW9ucz11bmRlZmluZWQpPT5cblxuZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0KFxucHJvdmlkZUtpbmRIYW5kbGUoYmFnZ2FnZSxraW5kTmFtZSksXG5pbnRlcmZhY2VHdWFyZEtpdCxcbmluaXQsXG5mYWNldHMsXG5vcHRpb25zKTtcblxuaGFyZGVuKHByZXBhcmVFeG9DbGFzc0tpdCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG5jb25zdCBwcmVwYXJlRXhvPShcbmJhZ2dhZ2UsXG5raW5kTmFtZSxcbmludGVyZmFjZUd1YXJkLFxubWV0aG9kcyxcbm9wdGlvbnM9dW5kZWZpbmVkKT0+XG57XG5jb25zdCBtYWtlU2luZ2xldG9uPXByZXBhcmVFeG9DbGFzcyhcbmJhZ2dhZ2UsXG5raW5kTmFtZSxcbmludGVyZmFjZUd1YXJkLFxuaW5pdEVtcHR5LFxubWV0aG9kcyxcbm9wdGlvbnMpO1xuXG5cbnJldHVybiBwcm92aWRlKGJhZ2dhZ2UsIGAke2tpbmROYW1lfV9zaW5nbGV0b25gLCgpPT5tYWtlU2luZ2xldG9uKCkpO1xuIH07XG5oYXJkZW4ocHJlcGFyZUV4byk7XG5cbi8qXG5cblxuXG5cblxuXG5cbiAgICovXG5jb25zdCBwcmVwYXJlU2luZ2xldG9uPShiYWdnYWdlLGtpbmROYW1lLG1ldGhvZHMsb3B0aW9ucz11bmRlZmluZWQpPT5cbnByZXBhcmVFeG8oYmFnZ2FnZSxraW5kTmFtZSx1bmRlZmluZWQsbWV0aG9kcyxvcHRpb25zKTtcbmhhcmRlbihwcmVwYXJlU2luZ2xldG9uKTtcblxucmV0dXJuIGhhcmRlbih7XG5kZWZpbmVWaXJ0dWFsRXhvQ2xhc3MsXG5kZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQsXG5kZWZpbmVEdXJhYmxlRXhvQ2xhc3MsXG5kZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQsXG5wcmVwYXJlRXhvQ2xhc3MsXG5wcmVwYXJlRXhvQ2xhc3NLaXQsXG5wcmVwYXJlRXhvLFxuXG5wcmVwYXJlU2luZ2xldG9uLFxucHJvdmlkZUtpbmRIYW5kbGUsXG5wcmVwYXJlS2luZCxcbnByZXBhcmVLaW5kTXVsdGl9KTtcblxuIH07JGjNj19vbmNlLm1ha2VFeG9VdGlscyhtYWtlRXhvVXRpbHMpO1xuXG5jb25zdCBnbG9iYWxFeG9VdGlscz1tYWtlRXhvVXRpbHMoZ2xvYmFsVmF0RGF0YSk7XG5cbmNvbnN0ICAgICAgIHtcbmRlZmluZVZpcnR1YWxFeG9DbGFzcyxcbmRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCxcbmRlZmluZUR1cmFibGVFeG9DbGFzcyxcbmRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCxcbnByZXBhcmVFeG9DbGFzcyxcbnByZXBhcmVFeG9DbGFzc0tpdCxcbnByZXBhcmVFeG8sXG5wcmVwYXJlU2luZ2xldG9ufT1cbmdsb2JhbEV4b1V0aWxzO1xuXG4vKlxuXG4gKi8kaM2PX29uY2UuZGVmaW5lVmlydHVhbEV4b0NsYXNzKGRlZmluZVZpcnR1YWxFeG9DbGFzcyk7JGjNj19vbmNlLmRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdChkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQpOyRozY9fb25jZS5kZWZpbmVEdXJhYmxlRXhvQ2xhc3MoZGVmaW5lRHVyYWJsZUV4b0NsYXNzKTskaM2PX29uY2UuZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0KGRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCk7JGjNj19vbmNlLnByZXBhcmVFeG9DbGFzcyhwcmVwYXJlRXhvQ2xhc3MpOyRozY9fb25jZS5wcmVwYXJlRXhvQ2xhc3NLaXQocHJlcGFyZUV4b0NsYXNzS2l0KTskaM2PX29uY2UucHJlcGFyZUV4byhwcmVwYXJlRXhvKTskaM2PX29uY2UucHJlcGFyZVNpbmdsZXRvbihwcmVwYXJlU2luZ2xldG9uKTtcbmNvbnN0ICAgICAgIHtwcm92aWRlS2luZEhhbmRsZSxwcmVwYXJlS2luZCxwcmVwYXJlS2luZE11bHRpfT1cbmdsb2JhbEV4b1V0aWxzOyRozY9fb25jZS5wcm92aWRlS2luZEhhbmRsZShwcm92aWRlS2luZEhhbmRsZSk7JGjNj19vbmNlLnByZXBhcmVLaW5kKHByZXBhcmVLaW5kKTskaM2PX29uY2UucHJlcGFyZUtpbmRNdWx0aShwcmVwYXJlS2luZE11bHRpKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Imlnbm9yZUNvbnRleHQiOlsiaWdub3JlQ29udGV4dCJdLCJtYWtlRXhvVXRpbHMiOlsibWFrZUV4b1V0aWxzIl0sImRlZmluZVZpcnR1YWxFeG9DbGFzcyI6WyJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MiXSwiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0IjpbImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCJdLCJkZWZpbmVEdXJhYmxlRXhvQ2xhc3MiOlsiZGVmaW5lRHVyYWJsZUV4b0NsYXNzIl0sImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCI6WyJkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQiXSwicHJlcGFyZUV4b0NsYXNzIjpbInByZXBhcmVFeG9DbGFzcyJdLCJwcmVwYXJlRXhvQ2xhc3NLaXQiOlsicHJlcGFyZUV4b0NsYXNzS2l0Il0sInByZXBhcmVFeG8iOlsicHJlcGFyZUV4byJdLCJwcmVwYXJlU2luZ2xldG9uIjpbInByZXBhcmVTaW5nbGV0b24iXSwicHJvdmlkZUtpbmRIYW5kbGUiOlsicHJvdmlkZUtpbmRIYW5kbGUiXSwicHJlcGFyZUtpbmQiOlsicHJlcGFyZUtpbmQiXSwicHJlcGFyZUtpbmRNdWx0aSI6WyJwcmVwYXJlS2luZE11bHRpIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOco1IzXCAAA1wgAACoAAABAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMy11MTkuMi9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSIsIi4vdmF0LWRhdGEtYmluZGluZ3MuanMiLCIuL2V4by11dGlscy5qcyJdLCJleHBvcnRzIjpbImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCIsImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCIsIm1ha2VTY2FsYXJNYXBTdG9yZSIsIm1ha2VTY2FsYXJNYXBTdG9yZSIsInByb3ZpZGVQcm9taXNlV2F0Y2hlciIsInByb3ZpZGVQcm9taXNlV2F0Y2hlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtdXSxbXCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzXCIsIFtdXSxbXCIuL2V4by11dGlscy5qc1wiLCBbXV1dKTsgICBcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7IkBhZ29yaWMvc3RvcmUiOltbIk0iLCJNIl0sWyJtYWtlU2NhbGFyTWFwU3RvcmUiLCJtYWtlU2NhbGFyTWFwU3RvcmUiXSxbIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiLCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIl0sWyJtYWtlU2NhbGFyU2V0U3RvcmUiLCJtYWtlU2NhbGFyU2V0U3RvcmUiXSxbIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiLCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIl1dLCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIjpbWyJtYWtlS2luZEhhbmRsZSIsIm1ha2VLaW5kSGFuZGxlIl0sWyJwcm92aWRlUHJvbWlzZVdhdGNoZXIiLCJwcm92aWRlUHJvbWlzZVdhdGNoZXIiXSxbIndhdGNoUHJvbWlzZSIsIndhdGNoUHJvbWlzZSJdLFsibWFrZVNjYWxhckJpZ01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ01hcFN0b3JlIl0sWyJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSJdLFsibWFrZVNjYWxhckJpZ1NldFN0b3JlIiwibWFrZVNjYWxhckJpZ1NldFN0b3JlIl0sWyJtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSJdLFsiY2FuQmVEdXJhYmxlIiwiY2FuQmVEdXJhYmxlIl0sWyJwaWNrRmFjZXQiLCJwaWNrRmFjZXQiXSxbInBhcnRpYWxBc3NpZ24iLCJwYXJ0aWFsQXNzaWduIl0sWyJwcm92aWRlIiwicHJvdmlkZSJdLFsicHJvdmlkZUR1cmFibGVNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiXSxbInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIiwicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUiXSxbInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiLCJwcm92aWRlRHVyYWJsZVNldFN0b3JlIl0sWyJwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSIsInByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlIl0sWyJkZWZpbmVLaW5kIiwiZGVmaW5lS2luZCJdLFsiZGVmaW5lS2luZE11bHRpIiwiZGVmaW5lS2luZE11bHRpIl0sWyJkZWZpbmVEdXJhYmxlS2luZCIsImRlZmluZUR1cmFibGVLaW5kIl0sWyJkZWZpbmVEdXJhYmxlS2luZE11bHRpIiwiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSJdXSwiLi9leG8tdXRpbHMuanMiOltbImRlZmluZVZpcnR1YWxFeG9DbGFzcyIsImRlZmluZVZpcnR1YWxFeG9DbGFzcyJdLFsiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0IiwiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0Il0sWyJkZWZpbmVEdXJhYmxlRXhvQ2xhc3MiLCJkZWZpbmVEdXJhYmxlRXhvQ2xhc3MiXSxbImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCIsImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCJdLFsicHJlcGFyZUV4b0NsYXNzIiwicHJlcGFyZUV4b0NsYXNzIl0sWyJwcmVwYXJlRXhvQ2xhc3NLaXQiLCJwcmVwYXJlRXhvQ2xhc3NLaXQiXSxbInByZXBhcmVFeG8iLCJwcmVwYXJlRXhvIl0sWyJwcmVwYXJlU2luZ2xldG9uIiwicHJlcGFyZVNpbmdsZXRvbiJdLFsiaWdub3JlQ29udGV4dCIsImlnbm9yZUNvbnRleHQiXSxbInByb3ZpZGVLaW5kSGFuZGxlIiwicHJvdmlkZUtpbmRIYW5kbGUiXSxbInByZXBhcmVLaW5kIiwicHJlcGFyZUtpbmQiXSxbInByZXBhcmVLaW5kTXVsdGkiLCJwcmVwYXJlS2luZE11bHRpIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADeGWoD2xYAANsWAAA2AAAAQGFnb3JpYy92YXQtZGF0YS12MC41LjMtdTE5LjIvc3JjL3ZhdC1kYXRhLWJpbmRpbmdzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJWYXREYXRhIiwiY2FuQmVEdXJhYmxlIiwiZGVmaW5lRHVyYWJsZUtpbmQiLCJkZWZpbmVEdXJhYmxlS2luZE11bHRpIiwiZGVmaW5lS2luZCIsImRlZmluZUtpbmRNdWx0aSIsIm1ha2VLaW5kSGFuZGxlIiwibWFrZVNjYWxhckJpZ01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ1NldFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSIsIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiLCJtYWtlU3RvcmVVdGlscyIsInBhcnRpYWxBc3NpZ24iLCJwaWNrRmFjZXQiLCJwcm92aWRlIiwicHJvdmlkZUR1cmFibGVNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiLCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlIiwicHJvdmlkZVByb21pc2VXYXRjaGVyIiwid2F0Y2hQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgRmFpbCxwcm92aWRlTGF6eTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLCBbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wicHJvdmlkZUxhenlcIiwgWyRozY9fYSA9PiAocHJvdmlkZUxhenkgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLyogICAgICAgICAgICAgICAgICAqL1xubGV0IFZhdERhdGFHbG9iYWw7XG5pZignVmF0RGF0YSdpbiBnbG9iYWxUaGlzKXtcbmdsb2JhbFRoaXMuVmF0RGF0YXx8RmFpbCBgVmF0RGF0YSBkZWZpbmVkIGluIGdsb2JhbCBhcyBudWxsIG9yIHVuZGVmaW5lZGA7XG4vL1xuVmF0RGF0YUdsb2JhbD0vKiAgICAgICAgICAgICAgKi9nbG9iYWxUaGlzLlZhdERhdGE7XG4gfWVsc2V7XG4vL1xuLy9cbi8vXG5jb25zdCB1bmF2YWlsYWJsZT0oKT0+RmFpbCBgVmF0RGF0YSB1bmF2YWlsYWJsZWA7XG5WYXREYXRhR2xvYmFsPXtcbmRlZmluZUtpbmQ6dW5hdmFpbGFibGUsXG5kZWZpbmVLaW5kTXVsdGk6dW5hdmFpbGFibGUsXG5kZWZpbmVEdXJhYmxlS2luZDp1bmF2YWlsYWJsZSxcbmRlZmluZUR1cmFibGVLaW5kTXVsdGk6dW5hdmFpbGFibGUsXG5tYWtlS2luZEhhbmRsZTp1bmF2YWlsYWJsZSxcbnByb3ZpZGVQcm9taXNlV2F0Y2hlcjp1bmF2YWlsYWJsZSxcbndhdGNoUHJvbWlzZTp1bmF2YWlsYWJsZSxcbm1ha2VTY2FsYXJCaWdNYXBTdG9yZTp1bmF2YWlsYWJsZSxcbm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmU6dW5hdmFpbGFibGUsXG5tYWtlU2NhbGFyQmlnU2V0U3RvcmU6dW5hdmFpbGFibGUsXG5tYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlOnVuYXZhaWxhYmxlLFxuY2FuQmVEdXJhYmxlOnVuYXZhaWxhYmxlfTtcblxuIH1cblxuY29uc3QgVmF0RGF0YUV4cG9ydD1WYXREYXRhR2xvYmFsOyRozY9fb25jZS5WYXREYXRhRXhwb3J0KFZhdERhdGFFeHBvcnQpO1xuXG5cbi8qXG5cbiAqL1xuY29uc3QgICAgICAge1xuZGVmaW5lS2luZCxcbmRlZmluZUtpbmRNdWx0aSxcbmRlZmluZUR1cmFibGVLaW5kLFxuZGVmaW5lRHVyYWJsZUtpbmRNdWx0aX09XG5WYXREYXRhR2xvYmFsOyRozY9fb25jZS5kZWZpbmVLaW5kKGRlZmluZUtpbmQpOyRozY9fb25jZS5kZWZpbmVLaW5kTXVsdGkoZGVmaW5lS2luZE11bHRpKTskaM2PX29uY2UuZGVmaW5lRHVyYWJsZUtpbmQoZGVmaW5lRHVyYWJsZUtpbmQpOyRozY9fb25jZS5kZWZpbmVEdXJhYmxlS2luZE11bHRpKGRlZmluZUR1cmFibGVLaW5kTXVsdGkpO1xuXG5jb25zdCAgICAgICB7XG5tYWtlS2luZEhhbmRsZSxcbnByb3ZpZGVQcm9taXNlV2F0Y2hlcixcbndhdGNoUHJvbWlzZSxcbm1ha2VTY2FsYXJCaWdNYXBTdG9yZSxcbm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUsXG5tYWtlU2NhbGFyQmlnU2V0U3RvcmUsXG5tYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlLFxuY2FuQmVEdXJhYmxlfT1cblZhdERhdGFHbG9iYWw7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5tYWtlS2luZEhhbmRsZShtYWtlS2luZEhhbmRsZSk7JGjNj19vbmNlLnByb3ZpZGVQcm9taXNlV2F0Y2hlcihwcm92aWRlUHJvbWlzZVdhdGNoZXIpOyRozY9fb25jZS53YXRjaFByb21pc2Uod2F0Y2hQcm9taXNlKTskaM2PX29uY2UubWFrZVNjYWxhckJpZ01hcFN0b3JlKG1ha2VTY2FsYXJCaWdNYXBTdG9yZSk7JGjNj19vbmNlLm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUobWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSk7JGjNj19vbmNlLm1ha2VTY2FsYXJCaWdTZXRTdG9yZShtYWtlU2NhbGFyQmlnU2V0U3RvcmUpOyRozY9fb25jZS5tYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlKG1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUpOyRozY9fb25jZS5jYW5CZUR1cmFibGUoY2FuQmVEdXJhYmxlKTtcbmNvbnN0ICAgICAgICBwaWNrRmFjZXQ9XG4obWFrZXIsZmFjZXROYW1lKT0+XG4oLi4uYXJncyk9PlxubWFrZXIoLi4uYXJncylbZmFjZXROYW1lXTskaM2PX29uY2UucGlja0ZhY2V0KHBpY2tGYWNldCk7XG5oYXJkZW4ocGlja0ZhY2V0KTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIHBhcnRpYWxBc3NpZ249KHRhcmdldCxzb3VyY2UpPT57XG5PYmplY3QuYXNzaWduKHRhcmdldCxzb3VyY2UpO1xuIH07JGjNj19vbmNlLnBhcnRpYWxBc3NpZ24ocGFydGlhbEFzc2lnbik7XG5oYXJkZW4ocGFydGlhbEFzc2lnbik7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG5jb25zdCAgICAgICAgcHJvdmlkZT1cbi8vXG4vKlxuXG5cblxuXG5cbiAgICovcHJvdmlkZUxhenk7XG5cbi8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovJGjNj19vbmNlLnByb3ZpZGUocHJvdmlkZSk7XG5jb25zdCAgICAgICAgbWFrZVN0b3JlVXRpbHM9KFZhdERhdGEpPT57XG5jb25zdHtcbi8vXG5tYWtlU2NhbGFyQmlnTWFwU3RvcmUsXG4vL1xubWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSxcbi8vXG5tYWtlU2NhbGFyQmlnU2V0U3RvcmUsXG4vL1xubWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZX09XG5WYXREYXRhO1xuXG4vKlxuXG5cblxuICAgKi9cbmNvbnN0IHByb3ZpZGVEdXJhYmxlTWFwU3RvcmU9KGJhZ2dhZ2UsbmFtZSxvcHRpb25zPXt9KT0+XG5wcm92aWRlKGJhZ2dhZ2UsbmFtZSwoKT0+XG5tYWtlU2NhbGFyQmlnTWFwU3RvcmUobmFtZSx7ZHVyYWJsZTp0cnVlLC4uLm9wdGlvbnN9KSk7XG5cbmhhcmRlbihwcm92aWRlRHVyYWJsZU1hcFN0b3JlKTtcblxuLypcblxuXG5cbiAgICovXG5jb25zdCBwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZT0oYmFnZ2FnZSxuYW1lLG9wdGlvbnM9e30pPT5cbnByb3ZpZGUoYmFnZ2FnZSxuYW1lLCgpPT5cbm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUobmFtZSx7ZHVyYWJsZTp0cnVlLC4uLm9wdGlvbnN9KSk7XG5cbmhhcmRlbihwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSk7XG5cbi8qXG5cblxuXG4gICAqL1xuY29uc3QgcHJvdmlkZUR1cmFibGVTZXRTdG9yZT0oYmFnZ2FnZSxuYW1lLG9wdGlvbnM9e30pPT5cbnByb3ZpZGUoYmFnZ2FnZSxuYW1lLCgpPT5cbm1ha2VTY2FsYXJCaWdTZXRTdG9yZShuYW1lLHtkdXJhYmxlOnRydWUsLi4ub3B0aW9uc30pKTtcblxuaGFyZGVuKHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUpO1xuXG4vKlxuXG5cblxuICAgKi9cbmNvbnN0IHByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlPShiYWdnYWdlLG5hbWUsb3B0aW9ucz17fSk9PlxucHJvdmlkZShiYWdnYWdlLG5hbWUsKCk9PlxubWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZShuYW1lLHtkdXJhYmxlOnRydWUsLi4ub3B0aW9uc30pKTtcblxuaGFyZGVuKHByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlKTtcblxucmV0dXJuIGhhcmRlbih7XG5wcm92aWRlRHVyYWJsZU1hcFN0b3JlLFxucHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUsXG5wcm92aWRlRHVyYWJsZVNldFN0b3JlLFxucHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmV9KTtcblxuIH07JGjNj19vbmNlLm1ha2VTdG9yZVV0aWxzKG1ha2VTdG9yZVV0aWxzKTtcblxuY29uc3QgZ2xvYmFsU3RvcmVVdGlscz1tYWtlU3RvcmVVdGlscyhWYXREYXRhR2xvYmFsKTtcbmNvbnN0ICAgICAgIHtcbnByb3ZpZGVEdXJhYmxlTWFwU3RvcmUsXG5wcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSxcbnByb3ZpZGVEdXJhYmxlU2V0U3RvcmUsXG5wcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZX09XG5nbG9iYWxTdG9yZVV0aWxzOyRozY9fb25jZS5wcm92aWRlRHVyYWJsZU1hcFN0b3JlKHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUpOyRozY9fb25jZS5wcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZShwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSk7JGjNj19vbmNlLnByb3ZpZGVEdXJhYmxlU2V0U3RvcmUocHJvdmlkZUR1cmFibGVTZXRTdG9yZSk7JGjNj19vbmNlLnByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlKHByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlZhdERhdGEiOlsiVmF0RGF0YUV4cG9ydCJdLCJkZWZpbmVLaW5kIjpbImRlZmluZUtpbmQiXSwiZGVmaW5lS2luZE11bHRpIjpbImRlZmluZUtpbmRNdWx0aSJdLCJkZWZpbmVEdXJhYmxlS2luZCI6WyJkZWZpbmVEdXJhYmxlS2luZCJdLCJkZWZpbmVEdXJhYmxlS2luZE11bHRpIjpbImRlZmluZUR1cmFibGVLaW5kTXVsdGkiXSwibWFrZUtpbmRIYW5kbGUiOlsibWFrZUtpbmRIYW5kbGUiXSwicHJvdmlkZVByb21pc2VXYXRjaGVyIjpbInByb3ZpZGVQcm9taXNlV2F0Y2hlciJdLCJ3YXRjaFByb21pc2UiOlsid2F0Y2hQcm9taXNlIl0sIm1ha2VTY2FsYXJCaWdNYXBTdG9yZSI6WyJtYWtlU2NhbGFyQmlnTWFwU3RvcmUiXSwibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSI6WyJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlIl0sIm1ha2VTY2FsYXJCaWdTZXRTdG9yZSI6WyJtYWtlU2NhbGFyQmlnU2V0U3RvcmUiXSwibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSI6WyJtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlIl0sImNhbkJlRHVyYWJsZSI6WyJjYW5CZUR1cmFibGUiXSwicGlja0ZhY2V0IjpbInBpY2tGYWNldCJdLCJwYXJ0aWFsQXNzaWduIjpbInBhcnRpYWxBc3NpZ24iXSwicHJvdmlkZSI6WyJwcm92aWRlIl0sIm1ha2VTdG9yZVV0aWxzIjpbIm1ha2VTdG9yZVV0aWxzIl0sInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiOlsicHJvdmlkZUR1cmFibGVNYXBTdG9yZSJdLCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSI6WyJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSJdLCJwcm92aWRlRHVyYWJsZVNldFN0b3JlIjpbInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiXSwicHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUiOlsicHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAc3i9rmURAABlEQAAJQAAAEBhZ29yaWMvdmF0cy12MC4xNi4wLXUxOS4yL3NyYy9jcmMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkNSQyIsImNyYzEiLCJjcmMxMCIsImNyYzE2IiwiY3JjMjQiLCJjcmMzMiIsImNyYzMyYyIsImNyYzYiLCJjcmM4IiwibW9kZWxzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaM2PX2ltcG9ydHMoW10pOyAgIC8qXG5cblxuXG5cblxuXG4gKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuY29uc3QgZW5jb2Rlcj1uZXcgVGV4dEVuY29kZXIoKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAqL1xuZnVuY3Rpb24gY29udmVydChkYXRhKXtcbmlmKHR5cGVvZiBkYXRhPT09J251bWJlcicpe1xuY29uc3QgYnl0ZXM9W107XG4vL1xuLy9cbndoaWxlKGRhdGE+MHx8Ynl0ZXMubGVuZ3RoPDQpe1xuYnl0ZXMudW5zaGlmdChkYXRhJTI1Nik7XG5kYXRhPU1hdGguZmxvb3IoZGF0YS8yNTYpO1xuIH1cbnJldHVybiBuZXcgVWludDhBcnJheShieXRlcyk7XG4gfWVsc2UgaWYodHlwZW9mIGRhdGE9PT0nc3RyaW5nJyl7XG5yZXR1cm4gZW5jb2Rlci5lbmNvZGUoZGF0YSk7XG4gfWVsc2UgaWYoQXJyYXlCdWZmZXIuaXNWaWV3KGRhdGEpKXtcbnJldHVybiBuZXcgVWludDhBcnJheShkYXRhLmJ1ZmZlcixkYXRhLmJ5dGVPZmZzZXQsZGF0YS5ieXRlTGVuZ3RoKTtcbiB9ZWxzZSBpZihkYXRhIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpe1xucmV0dXJuIG5ldyBVaW50OEFycmF5KGRhdGEpO1xuIH1cbnRocm93IFR5cGVFcnJvcihcbiBgY3JjIHJlcXVpcmVzIDMyIGJpdCBudW1iZXIsIGEgc3RyaW5nIG9yIFR5cGVkQXJyYXkgZm9yIGlucHV0YCk7XG5cbiB9XG5cbi8qXG5cblxuICovXG5mdW5jdGlvbiBtaXJyb3IoZGF0YSx3aWR0aCl7XG5sZXQgcmVzPTA7XG5mb3IobGV0IGk9MDtpPHdpZHRoO2krPTEpe1xucmVzPXJlczw8MXxkYXRhJjE7XG5kYXRhPj49MTtcbiB9XG5yZXR1cm4gcmVzO1xuIH1cblxuY2xhc3MgICAgICAgIENSQ3tcbi8qXG5cblxuXG5cblxuICAgKi9cbiAgICAgICAgICAgY29uc3RydWN0b3Iod2lkdGgscG9seSx4b3JJbix4b3JPdXQscmVmbGVjdCl7XG50aGlzLndpZHRoPXdpZHRoO1xudGhpcy5wb2x5PXBvbHk7XG50aGlzLnhvckluPXhvckluO1xudGhpcy5yZWZsZWN0ZWRYb3JJbj1taXJyb3IoeG9ySW4sd2lkdGgpO1xudGhpcy54b3JPdXQ9eG9yT3V0O1xudGhpcy5yZWZsZWN0PXJlZmxlY3Q7XG50aGlzLm1zYk1hc2s9MTw8dGhpcy53aWR0aC0xO1xudGhpcy5tYXNrPXRoaXMubXNiTWFzay0xPDwxfDE7XG50aGlzLmNyY1NoaWZ0PXRoaXMud2lkdGg8OD84LXRoaXMud2lkdGg6MDtcbnRoaXMuc2hpZnRlZFhvckluPXRoaXMueG9ySW48PHRoaXMuY3JjU2hpZnQ7XG5cbmNvbnN0IHRhYmxlPXRoaXMuZ2VuVGFibGUoKTtcbnRoaXMudGFibGU9dGFibGU7XG5cbmlmKHRoaXMud2lkdGg9PT04JiYhdGhpcy54b3JJbiYmIXRoaXMueG9yT3V0JiYhdGhpcy5yZWZsZWN0KXtcbi8qICAgICAgICAgICAgICAgICAgICAgKi9cbnRoaXMuY2FsY3VsYXRlPWZ1bmN0aW9uIGNhbGN1bGF0ZShkYXRhKXtcbmNvbnN0IGJ1ZmZlcj1jb252ZXJ0KGRhdGEpO1xubGV0IGNyYz0wO1xuZm9yKGxldCBpPTA7aTxidWZmZXIubGVuZ3RoO2krPTEpe1xuY3JjPXRhYmxlW2NyY15idWZmZXJbaV1dO1xuIH1cbnJldHVybiBjcmM7XG4gfTtcbiB9XG4gfVxuXG4vKiAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICBjYWxjdWxhdGUoZGF0YSl7XG5jb25zdCBidWZmZXI9Y29udmVydChkYXRhKTtcbmxldCBjcmM7XG5jb25zdHt0YWJsZSx3aWR0aCxjcmNTaGlmdCxtYXNrfT10aGlzO1xuaWYodGhpcy5yZWZsZWN0KXtcbmNyYz10aGlzLnJlZmxlY3RlZFhvckluO1xuZm9yKGxldCBpPTA7aTxidWZmZXIubGVuZ3RoO2krPTEpe1xuY29uc3QgYnl0ZT1idWZmZXJbaV07XG5jcmM9KHRhYmxlWyhjcmNeYnl0ZSkmMHhmZl1eY3JjPj4+OCkmbWFzaztcbiB9XG4gfWVsc2V7XG5jcmM9dGhpcy5zaGlmdGVkWG9ySW47XG5mb3IobGV0IGk9MDtpPGJ1ZmZlci5sZW5ndGg7aSs9MSl7XG5jcmM9XG50YWJsZVsoY3JjPj53aWR0aC04K2NyY1NoaWZ0XmJ1ZmZlcltpXSkmMHhmZl08PFxuY3JjU2hpZnReXG5jcmM8PDgtY3JjU2hpZnQmbWFzazw8Y3JjU2hpZnQ7XG4gfVxuY3JjPj49Y3JjU2hpZnQ7XG4gfVxuY3JjXj10aGlzLnhvck91dDtcbnJldHVybiBjcmM+Pj4wO1xuIH1cblxuLyogICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIGNhbGN1bGF0ZU5vVGFibGUoZGF0YSl7XG5jb25zdCBidWZmZXI9Y29udmVydChkYXRhKTtcbmxldCBjcmM9dGhpcy54b3JJbjtcbmZvcihsZXQgaT0wO2k8YnVmZmVyLmxlbmd0aDtpKz0xKXtcbmxldCBvY3RldD1idWZmZXJbaV07XG5pZih0aGlzLnJlZmxlY3Qpb2N0ZXQ9bWlycm9yKG9jdGV0LDgpO1xuZm9yKGxldCBqPTA7ajw4O2orPTEpe1xubGV0IHRvcGJpdD1jcmMmdGhpcy5tc2JNYXNrO1xuaWYob2N0ZXQmMHg4MD4+ail0b3BiaXRePXRoaXMubXNiTWFzaztcbmNyYzw8PTE7XG5pZih0b3BiaXQpY3JjXj10aGlzLnBvbHk7XG4gfVxuY3JjJj10aGlzLm1hc2s7XG4gfVxuaWYodGhpcy5yZWZsZWN0KWNyYz1taXJyb3IoY3JjLHRoaXMud2lkdGgpO1xuY3JjXj10aGlzLnhvck91dDtcbnJldHVybiBjcmM+Pj4wO1xuIH1cblxuICAgICAgICBnZW5UYWJsZSgpe1xuY29uc3QgdGFibGVMZW5ndGg9MjU2O1xuY29uc3QgdGFibGU9W107XG5mb3IobGV0IGk9MDtpPHRhYmxlTGVuZ3RoO2krPTEpe1xubGV0IHJlZz1pO1xuaWYodGhpcy5yZWZsZWN0KXJlZz1taXJyb3IocmVnLDgpO1xucmVnPDw9dGhpcy53aWR0aC04K3RoaXMuY3JjU2hpZnQ7XG5mb3IobGV0IGo9MDtqPDg7ais9MSl7XG5pZigocmVnJnRoaXMubXNiTWFzazw8dGhpcy5jcmNTaGlmdCkhPT0wKXtcbnJlZzw8PTE7XG5yZWdePXRoaXMucG9seTw8dGhpcy5jcmNTaGlmdDtcbiB9ZWxzZXtcbnJlZzw8PTE7XG4gfVxuIH1cbmlmKHRoaXMucmVmbGVjdClcbnJlZz1taXJyb3IocmVnPj50aGlzLmNyY1NoaWZ0LHRoaXMud2lkdGgpPDx0aGlzLmNyY1NoaWZ0O1xucmVnPXJlZz4+dGhpcy5jcmNTaGlmdCZ0aGlzLm1hc2s7XG50YWJsZVtpXT1yZWc+Pj4wO1xuIH1cbnJldHVybiBuZXcgSW50MzJBcnJheSh0YWJsZSk7XG4gfX0kaM2PX29uY2UuIENSQyhDUkMpO1xuXG5cbmNvbnN0ICAgICAgICBjcmMxPW5ldyBDUkMoMSwweDAxLDB4MDAsMHgwMCxmYWxzZSk7JGjNj19vbmNlLmNyYzEoY3JjMSk7XG5jb25zdCAgICAgICAgY3JjNj1uZXcgQ1JDKDYsMHgyZiwweDAwLDB4MDAsZmFsc2UpOyRozY9fb25jZS5jcmM2KGNyYzYpO1xuY29uc3QgICAgICAgIGNyYzg9bmV3IENSQyg4LDB4MDcsMHgwMCwweDAwLGZhbHNlKTskaM2PX29uY2UuY3JjOChjcmM4KTtcbmNvbnN0ICAgICAgICBjcmMxMD1uZXcgQ1JDKDEwLDB4MjMzLDB4MDAwMCwweDAwMDAsZmFsc2UpOyRozY9fb25jZS5jcmMxMChjcmMxMCk7XG5jb25zdCAgICAgICAgY3JjMTY9bmV3IENSQygxNiwweDgwMDUsMHgwMDAwLDB4MDAwMCx0cnVlKTskaM2PX29uY2UuY3JjMTYoY3JjMTYpO1xuY29uc3QgICAgICAgIGNyYzI0PW5ldyBDUkMoMjQsMHg4NjRjZmIsMHhiNzA0Y2UsMHgwMDAwMDAsZmFsc2UpOyRozY9fb25jZS5jcmMyNChjcmMyNCk7XG5jb25zdCAgICAgICAgY3JjMzI9bmV3IENSQygzMiwweDA0YzExZGI3LDB4ZmZmZmZmZmYsMHhmZmZmZmZmZix0cnVlKTskaM2PX29uY2UuY3JjMzIoY3JjMzIpO1xuY29uc3QgICAgICAgIGNyYzMyYz1uZXcgQ1JDKDMyLDB4MWVkYzZmNDEsMHhmZmZmZmZmZiwweGZmZmZmZmZmLHRydWUpOyRozY9fb25jZS5jcmMzMmMoY3JjMzJjKTtcblxuY29uc3QgICAgICAgIG1vZGVscz17Y3JjMSxjcmM2LGNyYzgsY3JjMTAsY3JjMTYsY3JjMjQsY3JjMzIsY3JjMzJjfTskaM2PX29uY2UubW9kZWxzKG1vZGVscyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJDUkMiOlsiQ1JDIl0sImNyYzEiOlsiY3JjMSJdLCJjcmM2IjpbImNyYzYiXSwiY3JjOCI6WyJjcmM4Il0sImNyYzEwIjpbImNyYzEwIl0sImNyYzE2IjpbImNyYzE2Il0sImNyYzI0IjpbImNyYzI0Il0sImNyYzMyIjpbImNyYzMyIl0sImNyYzMyYyI6WyJjcmMzMmMiXSwibW9kZWxzIjpbIm1vZGVscyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACSC1tuYyEAAGMhAAArAAAAQGFnb3JpYy92YXRzLXYwLjE2LjAtdTE5LjIvc3JjL2xpYi1ib2FyZC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAYWdvcmljL25vdGlmaWVyIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvcmVjb3JkZXIuanMiLCJAZW5kby9mYXIiLCJAZW5kby9tYXJzaGFsIiwiLi9jcmMuanMiXSwiZXhwb3J0cyI6WyJERUZBVUxUX0NSQ19ESUdJVFMiLCJERUZBVUxUX1BSRUZJWCIsInByZXBhcmVCb2FyZEtpdCIsInByZXBhcmVSZWNvcmRlckZhY3RvcnkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBhc3NlcnQsRmFpbCxxLHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCxNLG1ha2VTY2FsYXJCaWdNYXBTdG9yZSxwcmVwYXJlRXhvQ2xhc3NLaXQsZGVmaW5lUmVjb3JkZXJLaXQscHJlcGFyZVJlY29yZGVyLEUsRmFyLGlzUmVtb3RhYmxlLG1ha2VNYXJzaGFsLGNyYzY7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcImFzc2VydFwiLCBbJGjNj19hID0+IChhc3NlcnQgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLCBbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIiwgWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdFwiLCBbJGjNj19hID0+IChwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJNXCIsIFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wibWFrZVNjYWxhckJpZ01hcFN0b3JlXCIsIFskaM2PX2EgPT4gKG1ha2VTY2FsYXJCaWdNYXBTdG9yZSA9ICRozY9fYSldXSxbXCJwcmVwYXJlRXhvQ2xhc3NLaXRcIiwgWyRozY9fYSA9PiAocHJlcGFyZUV4b0NsYXNzS2l0ID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9yZWNvcmRlci5qc1wiLCBbW1wiZGVmaW5lUmVjb3JkZXJLaXRcIiwgWyRozY9fYSA9PiAoZGVmaW5lUmVjb3JkZXJLaXQgPSAkaM2PX2EpXV0sW1wicHJlcGFyZVJlY29yZGVyXCIsIFskaM2PX2EgPT4gKHByZXBhcmVSZWNvcmRlciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjNj19hID0+IChFID0gJGjNj19hKV1dLFtcIkZhclwiLCBbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJpc1JlbW90YWJsZVwiLCBbJGjNj19hID0+IChpc1JlbW90YWJsZSA9ICRozY9fYSldXSxbXCJtYWtlTWFyc2hhbFwiLCBbJGjNj19hID0+IChtYWtlTWFyc2hhbCA9ICRozY9fYSldXV1dLFtcIi4vY3JjLmpzXCIsIFtbXCJjcmM2XCIsIFskaM2PX2EgPT4gKGNyYzYgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cbiAqL1xuXG5jb25zdCAgICAgICAgREVGQVVMVF9DUkNfRElHSVRTPTI7JGjNj19vbmNlLkRFRkFVTFRfQ1JDX0RJR0lUUyhERUZBVUxUX0NSQ19ESUdJVFMpO1xuY29uc3QgICAgICAgIERFRkFVTFRfUFJFRklYPSdib2FyZDAnO1xuXG4vL1xuLy9cbiRozY9fb25jZS5ERUZBVUxUX1BSRUZJWChERUZBVUxUX1BSRUZJWCk7Y29uc3QgQ2FwRGF0YVNoYXBlPXtib2R5Ok0uc3RyaW5nKCksc2xvdHM6TS5hcnJheSgpfTtcbmNvbnN0IE1hcnNoYWxJPU0uaW50ZXJmYWNlKCdNYXJzaGFsbGVyJyx7XG50b0NhcERhdGE6TS5jYWxsKE0uYW55KCkpLnJldHVybnMoQ2FwRGF0YVNoYXBlKSxcbnNlcmlhbGl6ZTpNLmNhbGwoTS5hbnkoKSkucmV0dXJucyhDYXBEYXRhU2hhcGUpLFxuZnJvbUNhcERhdGE6TS5jYWxsKENhcERhdGFTaGFwZSkucmV0dXJucyhNLmFueSgpKSxcbnVuc2VyaWFsaXplOk0uY2FsbChDYXBEYXRhU2hhcGUpLnJldHVybnMoTS5hbnkoKSl9KTtcblxuXG5jb25zdCBJZFNoYXBlPU0uc3RyaW5nKCk7XG5jb25zdCBWYWxTaGFwZT1NLnNjYWxhcigpO1xuY29uc3QgQm9hcmRLaXRJS2l0PXtcbmJvYXJkOk0uaW50ZXJmYWNlKCdCb2FyZCcse1xuaGFzOk0uY2FsbChWYWxTaGFwZSkucmV0dXJucyhNLmJvb2xlYW4oKSksXG5nZXRWYWx1ZTpNLmNhbGwoSWRTaGFwZSkucmV0dXJucyhWYWxTaGFwZSksXG5sb29rdXA6TS5jYWxsKCkucmVzdChNLmFycmF5T2YoSWRTaGFwZSkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuZ2V0SWQ6TS5jYWxsKFZhbFNoYXBlKS5yZXR1cm5zKElkU2hhcGUpLFxuaWRzOk0uY2FsbCgpLnJldHVybnMoTS5hcnJheU9mKElkU2hhcGUpKSxcbmdldFB1Ymxpc2hpbmdNYXJzaGFsbGVyOk0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoKSksXG5nZXRSZWFkb25seU1hcnNoYWxsZXI6TS5jYWxsKCkucmV0dXJucyhNLnJlbW90YWJsZSgpKX0pLFxuXG5wdWJsaXNoaW5nTWFyc2hhbGxlcjpNYXJzaGFsSSxcbnJlYWRvbmx5TWFyc2hhbGxlcjpNYXJzaGFsSX07XG5cbi8vXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuICovXG5jb25zdCBjYWxjQ3JjPShkYXRhLGNyY0RpZ2l0cyk9Pntcbi8vXG4vL1xuY29uc3QgY3JjPWNyYzYuY2FsY3VsYXRlKGRhdGEpKzE7XG5jb25zdCBjcmNTdHI9Y3JjLnRvU3RyaW5nKCkucGFkU3RhcnQoY3JjRGlnaXRzLCcwJyk7XG5hc3NlcnQoY3JjU3RyLmxlbmd0aDw9Y3JjRGlnaXRzLCBgQ1JDIHRvbyBiaWcgZm9yIGl0cyBicml0Y2hlcyAke2NyY1N0cn1gKTtcbnJldHVybiBjcmNTdHI7XG4gfTtcblxuLypcblxuXG4gKi9cblxuLy9cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgaW5pdER1cmFibGVCb2FyZFN0YXRlPShcbmluaXRTZXF1ZW5jZT0wLFxue3ByZWZpeD1ERUZBVUxUX1BSRUZJWCxjcmNEaWdpdHM9REVGQVVMVF9DUkNfRElHSVRTfT17fSk9Plxue1xuY29uc3QgaW1tdXRhYmxlPXtwcmVmaXgsY3JjRGlnaXRzfTtcblxuY29uc3QgbGFzdFNlcXVlbmNlPUJpZ0ludChpbml0U2VxdWVuY2UpO1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgaWRUb1ZhbD1tYWtlU2NhbGFyQmlnTWFwU3RvcmUoJ2lkVG9WYWwnLHtcbmR1cmFibGU6dHJ1ZSxcbmtleVNoYXBlOklkU2hhcGUsXG52YWx1ZVNoYXBlOlZhbFNoYXBlfSk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHZhbFRvSWQ9bWFrZVNjYWxhckJpZ01hcFN0b3JlKCd2YWxUb0lkJyx7XG5kdXJhYmxlOnRydWUsXG5rZXlTaGFwZTpWYWxTaGFwZSxcbnZhbHVlU2hhcGU6SWRTaGFwZX0pO1xuXG5cbmNvbnN0IG11dGFibGU9e2xhc3RTZXF1ZW5jZSxpZFRvVmFsLHZhbFRvSWR9O1xuXG5yZXR1cm57XG4uLi5pbW11dGFibGUsXG4uLi5tdXRhYmxlfTtcblxuIH07XG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgZ2V0SWQ9KHZhbHVlLHN0YXRlKT0+e1xuY29uc3R7aWRUb1ZhbCx2YWxUb0lkLHByZWZpeCxjcmNEaWdpdHN9PXN0YXRlO1xuaWYoIWlzUmVtb3RhYmxlKHZhbHVlKSl7XG5GYWlsIGBCb2FyZCBjYW5ub3QgY3JlYXRlIGlkIGZvciBub24tcmVtb3RhYmxlYDtcbiB9XG5cbmlmKHZhbFRvSWQuaGFzKHZhbHVlKSl7XG5yZXR1cm4gdmFsVG9JZC5nZXQodmFsdWUpO1xuIH1cblxuc3RhdGUubGFzdFNlcXVlbmNlKz0xbjtcbmNvbnN0IHNlcT1zdGF0ZS5sYXN0U2VxdWVuY2U7XG5cbmNvbnN0IGNyY0lucHV0PSBgJHtwcmVmaXh9JHtzZXF9YDtcbmNvbnN0IGNyYz1jYWxjQ3JjKGNyY0lucHV0LGNyY0RpZ2l0cyk7XG5cbmNvbnN0IGlkPSBgJHtwcmVmaXh9JHtjcmN9JHtzZXF9YDtcblxudmFsVG9JZC5pbml0KHZhbHVlLGlkKTtcbmlkVG9WYWwuaW5pdChpZCx2YWx1ZSk7XG5yZXR1cm4gaWQ7XG4gfTtcblxuLypcblxuXG4gKi9cbmNvbnN0IGdldFZhbHVlPShpZCx7cHJlZml4LGNyY0RpZ2l0cyxpZFRvVmFsfSk9PntcbmlkLnN0YXJ0c1dpdGgocHJlZml4KXx8RmFpbCBgaWQgbXVzdCBzdGFydCB3aXRoICR7cShwcmVmaXgpfTogJHtpZH1gO1xuY29uc3QgZGlnaXRzPWlkLnNsaWNlKHByZWZpeC5sZW5ndGgpO1xuLy9cbmNvbnN0IERJR0lUU19SRUdFWFA9bmV3IFJlZ0V4cCggYF5bMC05XXske2NyY0RpZ2l0cysxfSx9JGApO1xuRElHSVRTX1JFR0VYUC50ZXN0KGRpZ2l0cyl8fFxuRmFpbCBgaWQgbXVzdCBlbmQgaW4gYXQgbGVhc3QgJHtxKGNyY0RpZ2l0cysxKX0gZGlnaXRzOiAke2lkfWA7XG5cbmlmKGlkVG9WYWwuaGFzKGlkKSl7XG5yZXR1cm4gaWRUb1ZhbC5nZXQoaWQpO1xuIH1cblxuY29uc3QgYWxsZWdlZENyYz1kaWdpdHMuc2xpY2UoMCxjcmNEaWdpdHMpO1xuXG5jb25zdCBzZXE9ZGlnaXRzLnNsaWNlKGNyY0RpZ2l0cyk7XG5jb25zdCBjcmNJbnB1dD0gYCR7cHJlZml4fSR7c2VxfWA7XG5jb25zdCBjcmM9Y2FsY0NyYyhjcmNJbnB1dCxjcmNEaWdpdHMpO1xuXG5hbGxlZ2VkQ3JjPT09Y3JjfHxGYWlsIGBpZCBpcyBwcm9iYWJseSBhIHR5cG8sIGNhbm5vdCB2ZXJpZnkgQ1JDOiAke2lkfWA7XG4vL1xudGhyb3cgRmFpbCBgYm9hcmQgZG9lcyBub3QgaGF2ZSBpZDogJHtpZH1gO1xuIH07XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBtYWtlU2xvdFRvVmFsPShzdGF0ZSk9PntcbmNvbnN0IGlmYWNlQWxsZWdlZFByZWZpeD0nQWxsZWdlZDogJztcbmNvbnN0IGlmYWNlSW5hY2Nlc3NpYmxlUHJlZml4PSdTRVZFUkVEOiAnO1xuXG4vKlxuXG5cblxuICAgKi9cbmNvbnN0IHNsb3RUb1ZhbD0oc2xvdCxpZmFjZSk9PntcbmlmKHNsb3QhPT1udWxsKXtcbnJldHVybiBnZXRWYWx1ZShzbG90LHN0YXRlKTtcbiB9XG5cbi8vXG5pZih0eXBlb2YgaWZhY2U9PT0nc3RyaW5nJyYmaWZhY2Uuc3RhcnRzV2l0aChpZmFjZUFsbGVnZWRQcmVmaXgpKXtcbmlmYWNlPWlmYWNlLnNsaWNlKGlmYWNlQWxsZWdlZFByZWZpeC5sZW5ndGgpO1xuIH1cbnJldHVybiBGYXIoIGAke2lmYWNlSW5hY2Nlc3NpYmxlUHJlZml4fSR7aWZhY2V9YCx7fSk7XG4gfTtcbnJldHVybiBzbG90VG9WYWw7XG4gfTtcblxuLy9cbi8qXG5cblxuICovXG5jb25zdCBtYWtlUmVhZG9ubHlNYXJzaGFsbGVyPShzdGF0ZSk9PntcbmNvbnN0e3ZhbFRvSWR9PXN0YXRlO1xuY29uc3Qgc2xvdFRvVmFsPW1ha2VTbG90VG9WYWwoc3RhdGUpO1xuY29uc3QgdmFsVG9TbG90PSh2YWwpPT57XG5pZighdmFsVG9JZC5oYXModmFsKSl7XG4vL1xucmV0dXJuIG51bGw7XG4gfVxuXG4vL1xucmV0dXJuIHZhbFRvSWQuZ2V0KHZhbCk7XG4gfTtcbnJldHVybiBtYWtlTWFyc2hhbCh2YWxUb1Nsb3Qsc2xvdFRvVmFsLHtcbnNlcmlhbGl6ZUJvZHlGb3JtYXQ6J3NtYWxsY2Fwcyd9KTtcblxuIH07XG5cbi8qXG5cblxuICovXG5jb25zdCBtYWtlUHVibGlzaGluZ01hcnNoYWxsZXI9KHN0YXRlKT0+e1xuY29uc3Qgc2xvdFRvVmFsPW1ha2VTbG90VG9WYWwoc3RhdGUpO1xuLy9cbmNvbnN0IHZhbFRvU2xvdD0odmFsKT0+Z2V0SWQodmFsLHN0YXRlKTtcbnJldHVybiBtYWtlTWFyc2hhbCh2YWxUb1Nsb3Qsc2xvdFRvVmFsLHtcbnNlcmlhbGl6ZUJvZHlGb3JtYXQ6J3NtYWxsY2Fwcyd9KTtcblxuIH07XG4vL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgcHJlcGFyZUJvYXJkS2l0PShiYWdnYWdlKT0+e1xucmV0dXJuIHByZXBhcmVFeG9DbGFzc0tpdChcbmJhZ2dhZ2UsXG4nQm9hcmQnLFxuQm9hcmRLaXRJS2l0LFxuaW5pdER1cmFibGVCb2FyZFN0YXRlLFxue1xuYm9hcmQ6e1xuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAgICAgICAqL1xuZ2V0SWQodmFsdWUpe1xucmV0dXJuIGdldElkKHZhbHVlLHRoaXMuc3RhdGUpO1xuIH0sXG4vKlxuXG5cbiAgICAgICAgICovXG5nZXRWYWx1ZShpZCl7XG5yZXR1cm4gZ2V0VmFsdWUoaWQsdGhpcy5zdGF0ZSk7XG4gfSxcbi8qXG5cblxuXG5cblxuXG5cblxuICAgICAgICAgKi9cbiAgICAgIGFzeW5jIGxvb2t1cCguLi5wYXRoKXtcbmNvbnN0e1xuZmFjZXRzOntib2FyZH19PVxudGhpcztcbmlmKHBhdGgubGVuZ3RoPT09MCl7XG5yZXR1cm4gYm9hcmQ7XG4gfVxuY29uc3RbZmlyc3QsLi4ucmVzdF09cGF0aDtcbi8qICAgICAgICAgICAgICAqL1xuY29uc3QgZmlyc3RWYWx1ZT1ib2FyZC5nZXRWYWx1ZSgvKiAgICAgICAgICAgICAgICAgICovZmlyc3QpO1xuaWYocmVzdC5sZW5ndGg9PT0wKXtcbnJldHVybiBmaXJzdFZhbHVlO1xuIH1cbnJldHVybiBFKGZpcnN0VmFsdWUpLmxvb2t1cCguLi5yZXN0KTtcbiB9LFxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmhhcyh2YWwpe1xuY29uc3R7c3RhdGV9PXRoaXM7XG5yZXR1cm4gc3RhdGUudmFsVG9JZC5oYXModmFsKTtcbiB9LFxuaWRzKCl7XG5jb25zdHtzdGF0ZX09dGhpcztcbnJldHVybiBoYXJkZW4oWy4uLnN0YXRlLmlkVG9WYWwua2V5cygpXSk7XG4gfSxcbi8qXG5cblxuICAgICAgICAgKi9cbmdldFB1Ymxpc2hpbmdNYXJzaGFsbGVyKCl7XG5yZXR1cm4gdGhpcy5mYWNldHMucHVibGlzaGluZ01hcnNoYWxsZXI7XG4gfSxcbi8qXG5cblxuXG5cblxuXG4gICAgICAgICAqL1xuZ2V0UmVhZG9ubHlNYXJzaGFsbGVyKCl7XG5yZXR1cm4gdGhpcy5mYWNldHMucmVhZG9ubHlNYXJzaGFsbGVyO1xuIH19LFxuXG5yZWFkb25seU1hcnNoYWxsZXI6e1xudG9DYXBEYXRhKHZhbCl7XG5jb25zdCByZWFkb25seT1tYWtlUmVhZG9ubHlNYXJzaGFsbGVyKHRoaXMuc3RhdGUpO1xucmV0dXJuIHJlYWRvbmx5LnRvQ2FwRGF0YSh2YWwpO1xuIH0sXG5mcm9tQ2FwRGF0YShkYXRhKXtcbmNvbnN0IHJlYWRvbmx5PW1ha2VSZWFkb25seU1hcnNoYWxsZXIodGhpcy5zdGF0ZSk7XG5yZXR1cm4gcmVhZG9ubHkuZnJvbUNhcERhdGEoZGF0YSk7XG4gfSxcbnNlcmlhbGl6ZShkYXRhKXtcbnJldHVybiB0aGlzLmZhY2V0cy5yZWFkb25seU1hcnNoYWxsZXIudG9DYXBEYXRhKGRhdGEpO1xuIH0sXG51bnNlcmlhbGl6ZShkYXRhKXtcbnJldHVybiB0aGlzLmZhY2V0cy5yZWFkb25seU1hcnNoYWxsZXIuZnJvbUNhcERhdGEoZGF0YSk7XG4gfX0sXG5cbnB1Ymxpc2hpbmdNYXJzaGFsbGVyOntcbnRvQ2FwRGF0YSh2YWwpe1xuY29uc3QgcHVibGlzaGluZz1tYWtlUHVibGlzaGluZ01hcnNoYWxsZXIodGhpcy5zdGF0ZSk7XG5yZXR1cm4gcHVibGlzaGluZy50b0NhcERhdGEodmFsKTtcbiB9LFxuZnJvbUNhcERhdGEoZGF0YSl7XG5jb25zdCBwdWJsaXNoaW5nPW1ha2VQdWJsaXNoaW5nTWFyc2hhbGxlcih0aGlzLnN0YXRlKTtcbnJldHVybiBwdWJsaXNoaW5nLmZyb21DYXBEYXRhKGRhdGEpO1xuIH0sXG5zZXJpYWxpemUoZGF0YSl7XG5yZXR1cm4gdGhpcy5mYWNldHMucHVibGlzaGluZ01hcnNoYWxsZXIudG9DYXBEYXRhKGRhdGEpO1xuIH0sXG51bnNlcmlhbGl6ZShkYXRhKXtcbnJldHVybiB0aGlzLmZhY2V0cy5wdWJsaXNoaW5nTWFyc2hhbGxlci5mcm9tQ2FwRGF0YShkYXRhKTtcbiB9fX0pO1xuXG5cblxuIH07XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5wcmVwYXJlQm9hcmRLaXQocHJlcGFyZUJvYXJkS2l0KTtcbmNvbnN0ICAgICAgICBwcmVwYXJlUmVjb3JkZXJGYWN0b3J5PSh6b25lKT0+e1xuY29uc3QgYmFnZ2FnZT16b25lLm1hcFN0b3JlKCBgUmVjb3JkZXIgQmFnZ2FnZWApO1xuY29uc3QgbWFrZUR1cmFibGVQdWJsaXNoS2l0PXByZXBhcmVEdXJhYmxlUHVibGlzaEtpdChcbmJhZ2dhZ2UsXG4nRHVyYWJsZVB1Ymxpc2hLaXQnKTtcblxuXG4vKlxuXG5cbiAgICovXG5jb25zdCBwcmVwYXJlUmVjb3JkZXJLaXQ9KGxhYmVsLG1hcnNoYWxsZXIpPT57XG5jb25zdCBteVpvbmU9em9uZS5zdWJab25lKGxhYmVsKTtcbmNvbnN0IG1ha2VSZWNvcmRlcj1wcmVwYXJlUmVjb3JkZXIoXG5teVpvbmUubWFwU3RvcmUoIGBSZWNvcmRlciBCYWdnYWdlOiAke2xhYmVsfWApLFxubWFyc2hhbGxlcik7XG5cbnJldHVybiBkZWZpbmVSZWNvcmRlcktpdCh7bWFrZVJlY29yZGVyLG1ha2VEdXJhYmxlUHVibGlzaEtpdH0pO1xuIH07XG5cbnJldHVybiBwcmVwYXJlUmVjb3JkZXJLaXQ7XG4gfTskaM2PX29uY2UucHJlcGFyZVJlY29yZGVyRmFjdG9yeShwcmVwYXJlUmVjb3JkZXJGYWN0b3J5KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkRFRkFVTFRfQ1JDX0RJR0lUUyI6WyJERUZBVUxUX0NSQ19ESUdJVFMiXSwiREVGQVVMVF9QUkVGSVgiOlsiREVGQVVMVF9QUkVGSVgiXSwicHJlcGFyZUJvYXJkS2l0IjpbInByZXBhcmVCb2FyZEtpdCJdLCJwcmVwYXJlUmVjb3JkZXJGYWN0b3J5IjpbInByZXBhcmVSZWNvcmRlckZhY3RvcnkiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAH0+owuULAADlCwAAMwAAAEBhZ29yaWMvd2FsbGV0LWJhY2tlbmQtdjAuMTUuMC11MTkuMi9zcmMvYWN0aW9ucy5qc3siaW1wb3J0cyI6WyJAZW5kby9wcm9taXNlLWtpdCIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9ldmVudHVhbC1zZW5kIl0sImV4cG9ydHMiOlsibWFrZVBheW1lbnRBY3Rpb25zIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgbWFrZVByb21pc2VLaXQsRmFyLEU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wibWFrZVByb21pc2VLaXRcIiwgWyRozY9fYSA9PiAobWFrZVByb21pc2VLaXQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuXG5jb25zdCAgICAgICAgbWFrZVBheW1lbnRBY3Rpb25zPSh7XG5nZXRCcmFuZFJlY29yZCxcbmdldFB1cnNlQnlQZXRuYW1lLFxuZ2V0UmVjb3JkLFxudXBkYXRlUmVjb3JkLFxuZ2V0QXV0b0RlcG9zaXRQdXJzZSxcbmdldElzc3VlckJvYXJkSWR9KT0+XG57XG5jb25zdCBkZXBvc2l0ZWRQSz1tYWtlUHJvbWlzZUtpdCgpO1xuXG5yZXR1cm4gRmFyKCdwYXltZW50IGFjdGlvbnMnLHtcbmRlcG9zaXQ6YXN5bmMocHVyc2VPclBldG5hbWU9dW5kZWZpbmVkKT0+e1xuY29uc3Qgb2xkUGF5bWVudFJlY29yZD1nZXRSZWNvcmQoKTtcbmNvbnN0e2JyYW5kLHBheW1lbnR9PW9sZFBheW1lbnRSZWNvcmQ7XG5hc3NlcnQocGF5bWVudCk7XG5cbi8qICAgICAgICAgICAgICAgICovXG5sZXQgcHVyc2U7XG5pZihwdXJzZU9yUGV0bmFtZT09PXVuZGVmaW5lZCl7XG5jb25zdCBhdXRvRGVwb3NpdFB1cnNlPWdldEF1dG9EZXBvc2l0UHVyc2UoYnJhbmQpO1xuaWYoIWF1dG9EZXBvc2l0UHVyc2Upe1xuLy9cbnJldHVybiBkZXBvc2l0ZWRQSy5wcm9taXNlO1xuIH1cbi8vXG5wdXJzZT1nZXRBdXRvRGVwb3NpdFB1cnNlKGJyYW5kKTtcbiB9ZWxzZSBpZihcbkFycmF5LmlzQXJyYXkocHVyc2VPclBldG5hbWUpfHxcbnR5cGVvZiBwdXJzZU9yUGV0bmFtZT09PSdzdHJpbmcnKVxue1xucHVyc2U9Z2V0UHVyc2VCeVBldG5hbWUocHVyc2VPclBldG5hbWUpO1xuIH1lbHNle1xucHVyc2U9cHVyc2VPclBldG5hbWU7XG4gfVxuY29uc3QgYnJhbmRSZWNvcmQ9Z2V0QnJhbmRSZWNvcmQoYnJhbmQpO1xudXBkYXRlUmVjb3JkKHsuLi5vbGRQYXltZW50UmVjb3JkLHN0YXR1czoncGVuZGluZyd9LGJyYW5kUmVjb3JkKTtcbi8vXG5FKHB1cnNlKS5cbmRlcG9zaXQocGF5bWVudCkuXG50aGVuKFxuKGRlcG9zaXRlZEFtb3VudCk9PntcbnVwZGF0ZVJlY29yZChcbntcbi4uLmdldFJlY29yZCgpLFxuLy9cbnBheW1lbnQ6dW5kZWZpbmVkLFxuc3RhdHVzOidkZXBvc2l0ZWQnLFxuZGVwb3NpdGVkQW1vdW50fSxcblxuYnJhbmRSZWNvcmQpO1xuXG5kZXBvc2l0ZWRQSy5yZXNvbHZlKGRlcG9zaXRlZEFtb3VudCk7XG4gfSxcbihlKT0+e1xuY29uc29sZS5lcnJvcihcbidFcnJvciBkZXBvc2l0aW5nIHBheW1lbnQgaW4nLFxucHVyc2VPclBldG5hbWV8fCdkZWZhdWx0IHB1cnNlJyxcbmUpO1xuXG5pZihwdXJzZU9yUGV0bmFtZT09PXVuZGVmaW5lZCl7XG4vL1xuLy9cbnVwZGF0ZVJlY29yZCh7XG4uLi5nZXRSZWNvcmQoKSxcbnN0YXR1czp1bmRlZmluZWR9KTtcblxuZGVwb3NpdGVkUEsucmVqZWN0KGUpO1xuIH1lbHNle1xuLy9cbi8vXG5kZXBvc2l0ZWRQSy5yZXNvbHZlKGdldFJlY29yZCgpLmFjdGlvbnMuZGVwb3NpdCh1bmRlZmluZWQpKTtcbiB9XG4gfSk7XG5cbnJldHVybiBkZXBvc2l0ZWRQSy5wcm9taXNlO1xuIH0sXG5yZWZyZXNoOmFzeW5jKCk9PntcbmNvbnN0IG9sZFBheW1lbnRSZWNvcmQ9Z2V0UmVjb3JkKCk7XG5jb25zdHticmFuZCxpc3N1ZXIscGF5bWVudH09b2xkUGF5bWVudFJlY29yZDtcbmNvbnN0IGJyYW5kUmVjb3JkPWdldEJyYW5kUmVjb3JkKGJyYW5kKTtcbmlmKCFicmFuZFJlY29yZCl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuXG5pZighaXNzdWVyKXtcbnVwZGF0ZVJlY29yZChcbntcbi4uLm9sZFBheW1lbnRSZWNvcmQsXG5pc3N1ZXJCb2FyZElkOmdldElzc3VlckJvYXJkSWQoYnJhbmRSZWNvcmQuaXNzdWVyKX0sXG5cbmJyYW5kUmVjb3JkKTtcblxucmV0dXJuIHRydWU7XG4gfVxuXG5pZighcGF5bWVudCl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuXG5jb25zdCBpc0xpdmU9YXdhaXQgRShpc3N1ZXIpLmlzTGl2ZShwYXltZW50KTtcbmlmKGlzTGl2ZSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuXG51cGRhdGVSZWNvcmQoe1xuLi4ub2xkUGF5bWVudFJlY29yZCxcbi8vXG5wYXltZW50OnVuZGVmaW5lZCxcbnN0YXR1czonZXhwaXJlZCd9KTtcblxucmV0dXJuIHRydWU7XG4gfSxcbmdldEFtb3VudE9mOmFzeW5jKCk9PntcbmNvbnN0IG9sZFBheW1lbnRSZWNvcmQ9Z2V0UmVjb3JkKCk7XG5jb25zdHtpc3N1ZXIscGF5bWVudH09b2xkUGF5bWVudFJlY29yZDtcbmFzc2VydChpc3N1ZXIpO1xuYXNzZXJ0KHBheW1lbnQpO1xuXG4vL1xuY29uc3QgbGFzdEFtb3VudD1hd2FpdCBFKGlzc3VlcikuZ2V0QW1vdW50T2YocGF5bWVudCk7XG5cbnVwZGF0ZVJlY29yZCh7XG4uLi5vbGRQYXltZW50UmVjb3JkLFxubGFzdEFtb3VudH0pO1xuXG5yZXR1cm4gdHJ1ZTtcbiB9fSk7XG5cbiB9OyRozY9fb25jZS5tYWtlUGF5bWVudEFjdGlvbnMobWFrZVBheW1lbnRBY3Rpb25zKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VQYXltZW50QWN0aW9ucyI6WyJtYWtlUGF5bWVudEFjdGlvbnMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAUwoWrtcCAADXAgAAOwAAAEBhZ29yaWMvd2FsbGV0LWJhY2tlbmQtdjAuMTUuMC11MTkuMi9zcmMvYmlnaW50U3RyaW5naWZ5LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJiaWdpbnRTdHJpbmdpZnkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRozY9faW1wb3J0cyhbXSk7ICAgLy9cbi8vXG4vL1xuLy9cbmNvbnN0ICAgICAgICBiaWdpbnRTdHJpbmdpZnk9KHgpPT5cbkpTT04uc3RyaW5naWZ5KHgsKF9rZXksdmFsdWUpPT57XG5pZih0eXBlb2YgdmFsdWUhPT0nYmlnaW50Jyl7XG4vL1xucmV0dXJuIHZhbHVlO1xuIH1cbmlmKHZhbHVlPD1CaWdJbnQoTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpKXtcbi8vXG5yZXR1cm4gTnVtYmVyKHZhbHVlKTtcbiB9XG4vL1xuLy9cbnJldHVybiB2YWx1ZS50b1N0cmluZygpO1xuIH0pOyRozY9fb25jZS5iaWdpbnRTdHJpbmdpZnkoYmlnaW50U3RyaW5naWZ5KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImJpZ2ludFN0cmluZ2lmeSI6WyJiaWdpbnRTdHJpbmdpZnkiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAWRTr9okJAACJCQAANAAAAEBhZ29yaWMvd2FsbGV0LWJhY2tlbmQtdjAuMTUuMC11MTkuMi9zcmMvZGF0ZS1ub3cuanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBhZ29yaWMvbm90aWZpZXIiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbIkRFRkFVTFRfVElNRVJfREVWSUNFX1NDQUxFIiwiREVGQVVMVF9USU1FUl9TRVJWSUNFX1BPTExfSU5URVJWQUwiLCJtYWtlVGltZXJEZXZpY2VEYXRlTm93IiwibWFrZVRpbWVyU2VydmljZURhdGVOb3ciXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBFLG9ic2VydmVOb3RpZmllcixtYWtlUHJvbWlzZUtpdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcIm9ic2VydmVOb3RpZmllclwiLCBbJGjNj19hID0+IChvYnNlcnZlTm90aWZpZXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wibWFrZVByb21pc2VLaXRcIiwgWyRozY9fYSA9PiAobWFrZVByb21pc2VLaXQgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuY29uc3QgICAgICAgIERFRkFVTFRfVElNRVJfU0VSVklDRV9QT0xMX0lOVEVSVkFMPTYwXzAwMG47JGjNj19vbmNlLkRFRkFVTFRfVElNRVJfU0VSVklDRV9QT0xMX0lOVEVSVkFMKERFRkFVTFRfVElNRVJfU0VSVklDRV9QT0xMX0lOVEVSVkFMKTtcbmNvbnN0ICAgICAgICBERUZBVUxUX1RJTUVSX0RFVklDRV9TQ0FMRT0xO1xuXG4vL1xuLy9cbiRozY9fb25jZS5ERUZBVUxUX1RJTUVSX0RFVklDRV9TQ0FMRShERUZBVUxUX1RJTUVSX0RFVklDRV9TQ0FMRSk7Y29uc3QgbWFrZVRpbWVyRGV2aWNlRGF0ZU5vdz1cbihELHRpbWVyRGV2aWNlLHRpbWVyRGV2aWNlU2NhbGU9REVGQVVMVF9USU1FUl9ERVZJQ0VfU0NBTEUpPT5cbigpPT57XG5jb25zdCBzdGFtcD1EKHRpbWVyRGV2aWNlKS5nZXRMYXN0UG9sbGVkKCk7XG5jb25zdCBsYXN0UG9sbGVkU3RhbXA9cGFyc2VJbnQoIGAke3N0YW1wfWAsMTApKnRpbWVyRGV2aWNlU2NhbGU7XG5yZXR1cm4gbGFzdFBvbGxlZFN0YW1wO1xuIH07XG5cbi8vXG4vL1xuJGjNj19vbmNlLm1ha2VUaW1lckRldmljZURhdGVOb3cobWFrZVRpbWVyRGV2aWNlRGF0ZU5vdyk7Y29uc3QgbWFrZVRpbWVyU2VydmljZURhdGVOb3c9KFxudGltZXJTZXJ2aWNlLFxudGltZXJQb2xsSW50ZXJ2YWw9REVGQVVMVF9USU1FUl9TRVJWSUNFX1BPTExfSU5URVJWQUwpPT5cbntcbmxldCBsYXN0UG9sbGVkU3RhbXA9TmFOO1xuY29uc3QgZGF0ZU5vdz0oKT0+bGFzdFBvbGxlZFN0YW1wO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgZGF0ZU5vd1BLPW1ha2VQcm9taXNlS2l0KCk7XG5cbi8vXG5jb25zdCBvYnNlcnZlVGltZXI9YXN5bmMoKT0+e1xuY29uc3Qgb2JzZXJ2ZXI9e1xudXBkYXRlU3RhdGUoc3RhbXApe1xubGFzdFBvbGxlZFN0YW1wPXBhcnNlSW50KCBgJHtzdGFtcH1gLDEwKTtcbmRhdGVOb3dQSy5yZXNvbHZlKGRhdGVOb3cpO1xuIH19O1xuXG5cbi8vXG5jb25zdCBzdGFtcD1hd2FpdCBFKHRpbWVyU2VydmljZSkuZ2V0Q3VycmVudFRpbWVzdGFtcCgpO1xub2JzZXJ2ZXIudXBkYXRlU3RhdGUoc3RhbXApO1xuXG4vL1xuLy9cbmNvbnN0IHRpbWVyTm90aWZpZXI9RSh0aW1lclNlcnZpY2UpLm1ha2VOb3RpZmllcigwbix0aW1lclBvbGxJbnRlcnZhbCk7XG5cbi8vXG5hd2FpdCBvYnNlcnZlTm90aWZpZXIodGltZXJOb3RpZmllcixvYnNlcnZlcik7XG4gfTtcblxub2JzZXJ2ZVRpbWVyKCkuY2F0Y2goKGUpPT5kYXRlTm93UEsucmVqZWN0KGUpKTtcblxuLy9cbnJldHVybiBkYXRlTm93UEsucHJvbWlzZTtcbiB9OyRozY9fb25jZS5tYWtlVGltZXJTZXJ2aWNlRGF0ZU5vdyhtYWtlVGltZXJTZXJ2aWNlRGF0ZU5vdyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJERUZBVUxUX1RJTUVSX1NFUlZJQ0VfUE9MTF9JTlRFUlZBTCI6WyJERUZBVUxUX1RJTUVSX1NFUlZJQ0VfUE9MTF9JTlRFUlZBTCJdLCJERUZBVUxUX1RJTUVSX0RFVklDRV9TQ0FMRSI6WyJERUZBVUxUX1RJTUVSX0RFVklDRV9TQ0FMRSJdLCJtYWtlVGltZXJEZXZpY2VEYXRlTm93IjpbIm1ha2VUaW1lckRldmljZURhdGVOb3ciXSwibWFrZVRpbWVyU2VydmljZURhdGVOb3ciOlsibWFrZVRpbWVyU2VydmljZURhdGVOb3ciXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAwK/qdQkTAAAJEwAAQAAAAEBhZ29yaWMvd2FsbGV0LWJhY2tlbmQtdjAuMTUuMC11MTkuMi9zcmMvZmluZE9yTWFrZUludml0YXRpb24uanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiLCJAYWdvcmljL2VydHAiXSwiZXhwb3J0cyI6WyJmaW5kT3JNYWtlSW52aXRhdGlvbiIsIm1ha2VJZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IGFzc2VydCxGYWlsLHEsRSxwYXNzU3R5bGVPZixBbW91bnRNYXRoOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJhc3NlcnRcIiwgWyRozY9fYSA9PiAoYXNzZXJ0ID0gJGjNj19hKV1dLFtcIkZhaWxcIiwgWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsIFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50TWF0aFwiLCBbJGjNj19hID0+IChBbW91bnRNYXRoID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuY29uc3QgICAgICAgIG1ha2VJZD0oZGFwcE9yaWdpbixyYXdJZCk9PiBgJHtkYXBwT3JpZ2lufSMke3Jhd0lkfWA7JGjNj19vbmNlLm1ha2VJZChtYWtlSWQpO1xuXG5jb25zdCBhc3NlcnRGaXJzdENhcEFTQ0lJPShzdHIpPT57XG5hc3NlcnQudHlwZW9mKHN0ciwnc3RyaW5nJyk7XG5jb25zdCBmaXJzdENhcEFTQ0lJPS9eW0EtWl1bYS16QS1aMC05XyRdKiQvO1xuZmlyc3RDYXBBU0NJSS50ZXN0KHN0cil8fFxuRmFpbCBgVGhlIHN0cmluZyAke3EoXG5zdHIpXG4gfSBtdXN0IGJlIGFuIGFzY2lpIGlkZW50aWZpZXIgc3RhcnRpbmcgd2l0aCB1cHBlciBjYXNlLmA7XG5zdHIhPT0nTmFOJyYmc3RyIT09J0luZmluaXR5J3x8XG5GYWlsIGBrZXl3b3JkICR7cShzdHIpfSBtdXN0IG5vdCBiZSBhIG51bWJlcidzIG5hbWVgO1xuIH07XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGZpbmRCeUJvYXJkSWQ9YXN5bmMoaW52aXRhdGlvblB1cnNlQmFsYW5jZSx7Ym9hcmQsYm9hcmRJZH0pPT57XG5hc3NlcnQudHlwZW9mKGJvYXJkSWQsJ3N0cmluZycpO1xuY29uc3QgaW52aXRhdGlvbkhhbmRsZT1hd2FpdCBFKGJvYXJkKS5nZXRWYWx1ZShib2FyZElkKTtcbmNvbnN0IG1hdGNoPShlbGVtZW50KT0+ZWxlbWVudC5oYW5kbGU9PT1pbnZpdGF0aW9uSGFuZGxlO1xuY29uc3QgbWF0Y2hpbmdWYWx1ZT1pbnZpdGF0aW9uUHVyc2VCYWxhbmNlLnZhbHVlLmZpbmQobWF0Y2gpO1xubWF0Y2hpbmdWYWx1ZXx8RmFpbCBgQ2Fubm90IGZpbmQgaW52aXRhdGlvbiBjb3JyZXNwb25kaW5nIHRvICR7cShib2FyZElkKX1gO1xuXG5yZXR1cm4gaGFyZGVuKFttYXRjaGluZ1ZhbHVlXSk7XG4gfTtcblxuLy9cbi8vXG4vKlxuXG5cbiAqL1xuY29uc3QgZmluZEJ5S2V5VmFsdWVQYWlycz1hc3luYyhpbnZpdGF0aW9uUHVyc2VCYWxhbmNlLGt2cyk9Pntcbi8vXG4vL1xuLy9cbmNvbnN0IG1hdGNoZXM9KGludml0YXRpb25EZXRhaWwpPT5cbk9iamVjdC5lbnRyaWVzKGt2cykuZXZlcnkoXG4oW2tleSx2YWx1ZV0pPT5pbnZpdGF0aW9uRGV0YWlsW2tleV09PT12YWx1ZSk7XG5cblxuY29uc3QgbWF0Y2hpbmdWYWx1ZT1pbnZpdGF0aW9uUHVyc2VCYWxhbmNlLnZhbHVlLmZpbmQobWF0Y2hlcyk7XG5tYXRjaGluZ1ZhbHVlfHxGYWlsIGBDYW5ub3QgZmluZCBpbnZpdGF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gJHtxKGt2cyl9YDtcbnJldHVybiBoYXJkZW4oW21hdGNoaW5nVmFsdWVdKTtcbiB9O1xuXG5jb25zdCBtYWtlRmluZEludml0YXRpb249KGludml0YXRpb25QdXJzZSxpbnZpdGF0aW9uQnJhbmQpPT57XG5jb25zdCBmaW5kSW52aXRhdGlvbj1hc3luYyhxdWVyeUZuLHF1ZXJ5UGFyYW1zKT0+e1xuY29uc3QgcHVyc2VCYWxhbmNlPWF3YWl0IEUoaW52aXRhdGlvblB1cnNlKS5nZXRDdXJyZW50QW1vdW50KCk7XG5jb25zdCB2YWx1ZT1hd2FpdCBxdWVyeUZuKHB1cnNlQmFsYW5jZSxxdWVyeVBhcmFtcyk7XG5jb25zdCBpbnZpdGF0aW9uQW1vdW50PUFtb3VudE1hdGgubWFrZShpbnZpdGF0aW9uQnJhbmQsdmFsdWUpO1xuY29uc3QgaW52aXRhdGlvblA9RShpbnZpdGF0aW9uUHVyc2UpLndpdGhkcmF3KGludml0YXRpb25BbW91bnQpO1xucmV0dXJuIGludml0YXRpb25QO1xuIH07XG5yZXR1cm4gZmluZEludml0YXRpb247XG4gfTtcblxuY29uc3QgbWFrZUNvbnRpbnVpbmdJbnZpdGF0aW9uPWFzeW5jKFxuaWRUb09mZmVyUmVzdWx0UHJvbWlzZUtpdCxcbmRhcHBPcmlnaW4sXG57cHJpb3JPZmZlcklkOnJhd1ByaW9yT2ZmZXJJZCxkZXNjcmlwdGlvbn0pPT5cbntcbmFzc2VydEZpcnN0Q2FwQVNDSUkoZGVzY3JpcHRpb24pO1xuXG5jb25zdCBwcmlvck9mZmVySWQ9bWFrZUlkKGRhcHBPcmlnaW4scmF3UHJpb3JPZmZlcklkKTtcbmNvbnN0IG9mZmVyUmVzdWx0PWF3YWl0IGlkVG9PZmZlclJlc3VsdFByb21pc2VLaXQuZ2V0KHByaW9yT2ZmZXJJZCkucHJvbWlzZTtcbmFzc2VydChcbnBhc3NTdHlsZU9mKG9mZmVyUmVzdWx0KT09PSdjb3B5UmVjb3JkJyxcbiBgb2ZmZXJSZXN1bHQgbXVzdCBiZSBhIHJlY29yZCB0byBoYXZlIGFuIGludml0YXRpb25NYWtlcnMgcHJvcGVydHlgKTtcblxuYXNzZXJ0KFxub2ZmZXJSZXN1bHQuaW52aXRhdGlvbk1ha2VycyxcbiBgb2ZmZXJSZXN1bHQgZG9lcyBub3QgaGF2ZSBhbiBpbnZpdGF0aW9uTWFrZXJzIHByb3BlcnR5YCk7XG5cblxuY29uc3QgaW52aXRhdGlvblA9RShvZmZlclJlc3VsdC5pbnZpdGF0aW9uTWFrZXJzKVtkZXNjcmlwdGlvbl0oKTtcbnJldHVybiBpbnZpdGF0aW9uUDtcbiB9O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlSW52aXRhdGlvbj1hc3luYyhcbmludml0YXRpb25NYWtlcixcbmluc3RhbmNlSGFuZGxlQm9hcmRJZCxcbmJvYXJkLFxuem9lKT0+XG57XG5jb25zdCBpbnN0YW5jZT0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuRShib2FyZCkuZ2V0VmFsdWUoaW5zdGFuY2VIYW5kbGVCb2FyZElkKTtcblxuY29uc3QgcHVibGljRmFjZXQ9RSh6b2UpLmdldFB1YmxpY0ZhY2V0KGluc3RhbmNlKTtcbmNvbnN0e21ldGhvZCxhcmdzPVtdfT1pbnZpdGF0aW9uTWFrZXI7XG5cbnJldHVybiBFKHB1YmxpY0ZhY2V0KVttZXRob2RdKC4uLmFyZ3MpO1xuIH07XG5cbmNvbnN0ICAgICAgICBmaW5kT3JNYWtlSW52aXRhdGlvbj1hc3luYyhcbmlkVG9PZmZlclJlc3VsdFByb21pc2VLaXQsXG5ib2FyZCxcbnpvZSxcbmludml0YXRpb25QdXJzZSxcbmludml0YXRpb25CcmFuZCxcbm9mZmVyKT0+XG57XG5pZihvZmZlci5pbnZpdGF0aW9uKXtcbi8vXG5yZXR1cm4gb2ZmZXIuaW52aXRhdGlvbjtcbiB9XG5cbmNvbnN0IGZpbmRJbnZpdGF0aW9uPW1ha2VGaW5kSW52aXRhdGlvbihpbnZpdGF0aW9uUHVyc2UsaW52aXRhdGlvbkJyYW5kKTtcblxuLy9cbmlmKG9mZmVyLmludml0ZUhhbmRsZUJvYXJkSWQpe1xuY29uc3QgcXVlcnlQYXJhbXM9e1xuYm9hcmQsXG5ib2FyZElkOm9mZmVyLmludml0ZUhhbmRsZUJvYXJkSWR9O1xuXG5yZXR1cm4gZmluZEludml0YXRpb24oZmluZEJ5Qm9hcmRJZCxxdWVyeVBhcmFtcyk7XG4gfVxuXG4vL1xuaWYob2ZmZXIuaW52aXRhdGlvbkhhbmRsZUJvYXJkSWQpe1xuY29uc3QgcXVlcnlQYXJhbXM9e1xuYm9hcmQsXG5ib2FyZElkOm9mZmVyLmludml0YXRpb25IYW5kbGVCb2FyZElkfTtcblxucmV0dXJuIGZpbmRJbnZpdGF0aW9uKGZpbmRCeUJvYXJkSWQscXVlcnlQYXJhbXMpO1xuIH1cblxuaWYob2ZmZXIuaW52aXRhdGlvbk1ha2VyKXtcbnJldHVybiBtYWtlSW52aXRhdGlvbihcbm9mZmVyLmludml0YXRpb25NYWtlcixcbm9mZmVyLmluc3RhbmNlSGFuZGxlQm9hcmRJZCxcbmJvYXJkLFxuem9lKTtcblxuIH1cblxuaWYob2ZmZXIuaW52aXRhdGlvblF1ZXJ5KXtcbnJldHVybiBmaW5kSW52aXRhdGlvbihmaW5kQnlLZXlWYWx1ZVBhaXJzLG9mZmVyLmludml0YXRpb25RdWVyeSk7XG4gfVxuXG5pZihvZmZlci5jb250aW51aW5nSW52aXRhdGlvbil7XG5jb25zdCBkYXBwT3JpZ2luPVxub2ZmZXIucmVxdWVzdENvbnRleHQmJm9mZmVyLnJlcXVlc3RDb250ZXh0LmRhcHBPcmlnaW4/XG5vZmZlci5yZXF1ZXN0Q29udGV4dC5kYXBwT3JpZ2luOlxuIGB1bmtub3duYDtcbnJldHVybiBtYWtlQ29udGludWluZ0ludml0YXRpb24oXG5pZFRvT2ZmZXJSZXN1bHRQcm9taXNlS2l0LFxuZGFwcE9yaWdpbixcbm9mZmVyLmNvbnRpbnVpbmdJbnZpdGF0aW9uKTtcblxuIH1cblxudGhyb3cgRmFpbCBgbm8gaW52aXRhdGlvbiB3YXMgZm91bmQgb3IgbWFkZSBmb3IgdGhpcyBvZmZlciAke29mZmVyLmlkfWA7XG4gfTskaM2PX29uY2UuZmluZE9yTWFrZUludml0YXRpb24oZmluZE9yTWFrZUludml0YXRpb24pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUlkIjpbIm1ha2VJZCJdLCJmaW5kT3JNYWtlSW52aXRhdGlvbiI6WyJmaW5kT3JNYWtlSW52aXRhdGlvbiJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABUaqUpegIAAHoCAAA6AAAAQGFnb3JpYy93YWxsZXQtYmFja2VuZC12MC4xNS4wLXUxOS4yL3NyYy9pbnRlcm5hbC10eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjNj19pbXBvcnRzKFtdKTsgICAvL1xuXG4vKlxuXG5cblxuXG4gKi9cblxuLypcblxuXG4gKi9cblxuLypcblxuICovXG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi9cblxuLypcblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPGYCATLCAAAywgAADcAAABAYWdvcmljL3dhbGxldC1iYWNrZW5kLXYwLjE1LjAtdTE5LjIvc3JjL2lzc3VlclRhYmxlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAYWdvcmljL3N0b3JlIiwiLi9pbnRlcm5hbC10eXBlcy5qcyJdLCJleHBvcnRzIjpbIm1ha2VJc3N1ZXJUYWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IGFzc2VydCxFLG1ha2VTY2FsYXJXZWFrTWFwU3RvcmU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcImFzc2VydFwiLCBbJGjNj19hID0+IChhc3NlcnQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlXCIsIFskaM2PX2EgPT4gKG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUgPSAkaM2PX2EpXV1dXSxbXCIuL2ludGVybmFsLXR5cGVzLmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZUlzc3VlclRhYmxlPSgpPT57XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgYnJhbmRUb0lzc3VlclJlY29yZD1tYWtlU2NhbGFyV2Vha01hcFN0b3JlKCdicmFuZCcpO1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBpc3N1ZXJUb0lzc3VlclJlY29yZD1tYWtlU2NhbGFyV2Vha01hcFN0b3JlKCdpc3N1ZXInKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGlzc3VlclRhYmxlPXtcbmhhc0J5QnJhbmQ6YnJhbmRUb0lzc3VlclJlY29yZC5oYXMsXG5nZXRCeUJyYW5kOmJyYW5kVG9Jc3N1ZXJSZWNvcmQuZ2V0LFxuaGFzQnlJc3N1ZXI6aXNzdWVyVG9Jc3N1ZXJSZWNvcmQuaGFzLFxuZ2V0QnlJc3N1ZXI6aXNzdWVyVG9Jc3N1ZXJSZWNvcmQuZ2V0LFxuLy9cbi8vXG5pbml0SXNzdWVyOmFzeW5jKGlzc3VlclAsYWRkTWV0YT0oeCk9PngpPT57XG5jb25zdCBicmFuZFA9RShpc3N1ZXJQKS5nZXRCcmFuZCgpO1xuY29uc3QgYnJhbmRJc3N1ZXJNYXRjaFA9RShicmFuZFApLmlzTXlJc3N1ZXIoaXNzdWVyUCk7XG5jb25zdCBkaXNwbGF5SW5mb1A9RShicmFuZFApLmdldERpc3BsYXlJbmZvKCk7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdFtpc3N1ZXIsYnJhbmQsYnJhbmRJc3N1ZXJNYXRjaCxkaXNwbGF5SW5mb109YXdhaXQgUHJvbWlzZS5hbGwoW1xuaXNzdWVyUCxcbmJyYW5kUCxcbmJyYW5kSXNzdWVyTWF0Y2hQLFxuZGlzcGxheUluZm9QXSk7XG5cbi8vXG5cbmlmKGlzc3VlclRvSXNzdWVyUmVjb3JkLmhhcyhpc3N1ZXIpKXtcbnJldHVybiBpc3N1ZXJUb0lzc3VlclJlY29yZC5nZXQoaXNzdWVyKTtcbiB9XG5hc3NlcnQoXG5icmFuZElzc3Vlck1hdGNoLFxuIGBpc3N1ZXIgd2FzIHVzaW5nIGEgYnJhbmQgd2hpY2ggd2FzIG5vdCBpdHMgb3duYCk7XG5cbmlzc3VlclRhYmxlLmluaXRJc3N1ZXJCeVJlY29yZChcbmFkZE1ldGEoe1xuYnJhbmQsXG5pc3N1ZXIsXG5hc3NldEtpbmQ6ZGlzcGxheUluZm8uYXNzZXRLaW5kLFxuZGlzcGxheUluZm99KSk7XG5cblxucmV0dXJuIGlzc3VlclRhYmxlLmdldEJ5QnJhbmQoYnJhbmQpO1xuIH0sXG5pbml0SXNzdWVyQnlSZWNvcmQ6KGlzc3VlclJlY29yZCk9PntcbmNvbnN0e2JyYW5kLGlzc3Vlcn09aXNzdWVyUmVjb3JkO1xuYnJhbmRUb0lzc3VlclJlY29yZC5pbml0KGJyYW5kLGlzc3VlclJlY29yZCk7XG5pc3N1ZXJUb0lzc3VlclJlY29yZC5pbml0KGlzc3Vlcixpc3N1ZXJSZWNvcmQpO1xuIH19O1xuXG5cbnJldHVybiBpc3N1ZXJUYWJsZTtcbiB9OyRozY9fb25jZS5tYWtlSXNzdWVyVGFibGUobWFrZUlzc3VlclRhYmxlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VJc3N1ZXJUYWJsZSI6WyJtYWtlSXNzdWVyVGFibGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAgGwBZDQeAAA0HgAAOQAAAEBhZ29yaWMvd2FsbGV0LWJhY2tlbmQtdjAuMTUuMC11MTkuMi9zcmMvbGliLWRlaHlkcmF0ZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9tYXJzaGFsIiwiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbImlzUGF0aCIsIm1ha2VEZWh5ZHJhdG9yIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgYXNzZXJ0LEZhaWwscSxtYWtlTWFyc2hhbCxtYXBJdGVyYWJsZSxtYWtlTGVnYWN5TWFwLG1ha2VTY2FsYXJNYXBTdG9yZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiYXNzZXJ0XCIsIFskaM2PX2EgPT4gKGFzc2VydCA9ICRozY9fYSldXSxbXCJGYWlsXCIsIFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLCBbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wibWFrZU1hcnNoYWxcIiwgWyRozY9fYSA9PiAobWFrZU1hcnNoYWwgPSAkaM2PX2EpXV0sW1wibWFwSXRlcmFibGVcIiwgWyRozY9fYSA9PiAobWFwSXRlcmFibGUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtYWtlTGVnYWN5TWFwXCIsIFskaM2PX2EgPT4gKG1ha2VMZWdhY3lNYXAgPSAkaM2PX2EpXV0sW1wibWFrZVNjYWxhck1hcFN0b3JlXCIsIFskaM2PX2EgPT4gKG1ha2VTY2FsYXJNYXBTdG9yZSA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuLypcblxuXG5cblxuICovXG5jb25zdCAgICAgICAgaXNQYXRoPSh4KT0+e1xuaWYoIUFycmF5LmlzQXJyYXkoeCkpe1xucmV0dXJuIGZhbHNlO1xuIH1cbngubGVuZ3RoPjB8fEZhaWwgYFBhdGggJHtxKHgpfSBtdXN0IG5vdCBiZSBlbXB0eWA7XG5mb3IoY29uc3QgbmFtZSBvZiB4KXtcbmlmKHR5cGVvZiBuYW1lIT09J3N0cmluZycpe1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9OyRozY9fb25jZS5pc1BhdGgoaXNQYXRoKTtcblxuY29uc3QgSU1QTE9ERV9QUkVGSVg9J0lFOic7XG5cbi8vXG4vL1xuLy9cbmNvbnN0ICAgICAgICBtYWtlRGVoeWRyYXRvcj0oaW5pdGlhbFVubmFtZWRDb3VudD0wKT0+e1xubGV0IHVubmFtZWRDb3VudD1pbml0aWFsVW5uYW1lZENvdW50O1xuXG4vL1xuY29uc3QgcGV0bmFtZUtpbmRUb01hcHBpbmc9bWFrZUxlZ2FjeU1hcCgncGV0bmFtZUtpbmQnKTtcblxuLyogICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHNlYXJjaE9yZGVyPVtdO1xuXG4vL1xuLy9cbi8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHZhbFRvUGF0aHM9bWFrZVNjYWxhck1hcFN0b3JlKCd2YWx1ZScpO1xuXG4vKlxuXG5cbiAgICovXG5jb25zdCBleHBsb2RlPShkYXRhKT0+e1xuZGF0YS5zdGFydHNXaXRoKElNUExPREVfUFJFRklYKXx8XG5GYWlsIGBleHBsb2RlZCBzdHJpbmcgJHtkYXRhfSBtdXN0IHN0YXJ0IHdpdGggJHtxKElNUExPREVfUFJFRklYKX1gO1xuY29uc3Qgc3Ryb25nbmFtZT1KU09OLnBhcnNlKGRhdGEuc2xpY2UoSU1QTE9ERV9QUkVGSVgubGVuZ3RoKSk7XG5pZighaXNQYXRoKHN0cm9uZ25hbWUpKXtcbnJldHVybiBzdHJvbmduYW1lO1xuIH1cbmNvbnN0e3ZhbFRvUGV0bmFtZTpyb290VG9QZXRuYW1lfT1lZGdlTWFwcGluZztcbmNvbnN0IHBldG5hbWU9cm9vdFRvUGV0bmFtZS5nZXQoc3Ryb25nbmFtZVswXSk7XG5hc3NlcnQoIWlzUGF0aChwZXRuYW1lKSk7XG5zdHJvbmduYW1lWzBdPXBldG5hbWU7XG5yZXR1cm4gaGFyZGVuKHN0cm9uZ25hbWUpO1xuIH07XG5cbi8qXG5cblxuICAgKi9cbmNvbnN0IGltcGxvZGU9KHN0cm9uZ25hbWUpPT57XG5pZighaXNQYXRoKHN0cm9uZ25hbWUpKXtcbnJldHVybiBgJHtJTVBMT0RFX1BSRUZJWH0ke0pTT04uc3RyaW5naWZ5KHN0cm9uZ25hbWUpfWA7XG4gfVxuXG4vL1xuY29uc3QgcGF0aD1bLi4uc3Ryb25nbmFtZV07XG5jb25zdHtwZXRuYW1lVG9WYWw6cGV0bmFtZVRvUm9vdH09ZWRnZU1hcHBpbmc7XG5pZighcGV0bmFtZVRvUm9vdC5oYXMocGF0aFswXSkpe1xuLy9cbkZhaWwgYEVkZ2VuYW1lIGZvciAke3EocGF0aFswXSl9IHBldG5hbWUgbm90IGZvdW5kYDtcbiB9XG5jb25zdCByb290PXBldG5hbWVUb1Jvb3QuZ2V0KHBhdGhbMF0pO1xucGF0aFswXT1yb290O1xuXG5yZXR1cm4gYCR7SU1QTE9ERV9QUkVGSVh9JHtKU09OLnN0cmluZ2lmeShwYXRoKX1gO1xuIH07XG5cbi8qXG5cblxuXG4gICAqL1xuY29uc3QgbWFrZU1hcHBpbmc9KGtpbmQse3VzZUxlZ2FjeU1hcD1mYWxzZX09e30pPT57XG50eXBlb2Yga2luZD09PSdzdHJpbmcnfHwgYGtpbmQgJHtraW5kfSBtdXN0IGJlIGEgc3RyaW5nYDtcbmNvbnN0IG1ha2VNYXA9dXNlTGVnYWN5TWFwP21ha2VMZWdhY3lNYXA6bWFrZVNjYWxhck1hcFN0b3JlO1xuLy9cbi8vXG4vL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgcmF3VmFsVG9QZXRuYW1lPW1ha2VNYXAoJ3ZhbHVlJyk7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgdmFsVG9QZXRuYW1lPXtcbi4uLnJhd1ZhbFRvUGV0bmFtZSxcbnNldChrZXksdmFsKXtcbnJhd1ZhbFRvUGV0bmFtZS5zZXQoa2V5LGltcGxvZGUodmFsKSk7XG4gfSxcbmluaXQoa2V5LHZhbCl7XG5yYXdWYWxUb1BldG5hbWUuaW5pdChrZXksaW1wbG9kZSh2YWwpKTtcbiB9LFxuZ2V0KGtleSl7XG5yZXR1cm4gZXhwbG9kZShyYXdWYWxUb1BldG5hbWUuZ2V0KGtleSkpO1xuIH0sXG5lbnRyaWVzKCl7XG5yZXR1cm4gbWFwSXRlcmFibGUocmF3VmFsVG9QZXRuYW1lLmVudHJpZXMoKSwoW2tleSx2YWxdKT0+W1xua2V5LFxuZXhwbG9kZSh2YWwpXSk7XG5cbiB9LFxudmFsdWVzKCl7XG5yZXR1cm4gbWFwSXRlcmFibGUocmF3VmFsVG9QZXRuYW1lLnZhbHVlcygpLCh2YWwpPT5leHBsb2RlKHZhbCkpO1xuIH19O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHJhd1BldG5hbWVUb1ZhbD1tYWtlU2NhbGFyTWFwU3RvcmUoJ3BldG5hbWUnKTtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHBldG5hbWVUb1ZhbD17XG4uLi5yYXdQZXRuYW1lVG9WYWwsXG5pbml0KGtleSx2YWwpe1xucmV0dXJuIHJhd1BldG5hbWVUb1ZhbC5pbml0KGltcGxvZGUoa2V5KSx2YWwpO1xuIH0sXG5zZXQoa2V5LHZhbCl7XG5yZXR1cm4gcmF3UGV0bmFtZVRvVmFsLnNldChpbXBsb2RlKGtleSksdmFsKTtcbiB9LFxuaGFzKGtleSl7XG50cnl7XG5yZXR1cm4gcmF3UGV0bmFtZVRvVmFsLmhhcyhpbXBsb2RlKGtleSkpO1xuIH1jYXRjaChlKXtcbi8vXG5yZXR1cm4gZmFsc2U7XG4gfVxuIH0sXG5nZXQoa2V5KXtcbnJldHVybiByYXdQZXRuYW1lVG9WYWwuZ2V0KGltcGxvZGUoa2V5KSk7XG4gfSxcbmRlbGV0ZShrZXkpe1xucmV0dXJuIHJhd1BldG5hbWVUb1ZhbC5kZWxldGUoaW1wbG9kZShrZXkpKTtcbiB9LFxua2V5cygpe1xucmV0dXJuIG1hcEl0ZXJhYmxlKHJhd1BldG5hbWVUb1ZhbC5rZXlzKCksKGtleSk9PmV4cGxvZGUoa2V5KSk7XG4gfSxcbmVudHJpZXMoKXtcbnJldHVybiBtYXBJdGVyYWJsZShyYXdQZXRuYW1lVG9WYWwuZW50cmllcygpLChba2V5LHZhbF0pPT5bXG5leHBsb2RlKGtleSksXG52YWxdKTtcblxuIH19O1xuXG5cbi8qXG5cblxuICAgICAqL1xuY29uc3QgYWRkUGF0aD0ocGF0aCx2YWwpPT57XG5pc1BhdGgocGF0aCl8fEZhaWwgYHBhdGggJHtxKHBhdGgpfSBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3NgO1xuXG5pZighdmFsVG9QZXRuYW1lLmhhcyh2YWwpJiZlZGdlTWFwcGluZy52YWxUb1BldG5hbWUuaGFzKHBhdGhbMF0pKXtcbi8vXG4vL1xudmFsVG9QZXRuYW1lLmluaXQodmFsLHBhdGgpO1xuIH1cblxuLy9cbmlmKCF2YWxUb1BhdGhzLmhhcyh2YWwpKXtcbnZhbFRvUGF0aHMuaW5pdCh2YWwsaGFyZGVuKFtwYXRoXSkpO1xucmV0dXJuO1xuIH1cbmNvbnN0IHBhdGhzPXZhbFRvUGF0aHMuZ2V0KHZhbCk7XG5cbi8vXG5jb25zdCBmb3VuZD1wYXRocy5maW5kKChlbmFtZSk9PntcbmlmKGVuYW1lLmxlbmd0aCE9PXBhdGgubGVuZ3RoKXtcbnJldHVybiBmYWxzZTtcbiB9XG5mb3IobGV0IGk9MDtpPGVuYW1lLmxlbmd0aDtpKz0xKXtcbmlmKGVuYW1lW2ldIT09cGF0aFtpXSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH0pO1xuXG4vL1xuaWYoIWZvdW5kKXtcbnZhbFRvUGF0aHMuc2V0KHZhbCxoYXJkZW4oWy4uLnBhdGhzLHBhdGhdKSk7XG4gfVxuIH07XG5cbmNvbnN0IGFkZFBldG5hbWU9KHBldG5hbWUsdmFsKT0+e1xuaWYocGV0bmFtZVRvVmFsLmhhcyhwZXRuYW1lKSYmcGV0bmFtZVRvVmFsLmdldChwZXRuYW1lKT09PXZhbCl7XG5yZXR1cm47XG4gfVxuIXBldG5hbWVUb1ZhbC5oYXMocGV0bmFtZSl8fEZhaWwgYHBldG5hbWUgJHtwZXRuYW1lfSBpcyBhbHJlYWR5IGluIHVzZWA7XG4hdmFsVG9QZXRuYW1lLmhhcyh2YWwpfHxGYWlsIGB2YWwgJHt2YWx9IGFscmVhZHkgaGFzIGEgcGV0bmFtZWA7XG5wZXRuYW1lVG9WYWwuaW5pdChwZXRuYW1lLHZhbCk7XG52YWxUb1BldG5hbWUuaW5pdCh2YWwscGV0bmFtZSk7XG5cbmlmKGlzUGF0aChwZXRuYW1lKSl7XG5hZGRQYXRoKHBldG5hbWUsdmFsKTtcbiB9XG4gfTtcblxuY29uc3QgcmVuYW1lUGV0bmFtZT0ocGV0bmFtZSx2YWwpPT57XG52YWxUb1BldG5hbWUuaGFzKHZhbCl8fFxuRmFpbCBgdmFsICR7dmFsfSBoYXMgbm90IGJlZW4gcHJldmlvdXNseSBuYW1lZCwgd291bGQgeW91IGxpa2UgdG8gYWRkIGl0IGluc3RlYWQ/YDtcbiFwZXRuYW1lVG9WYWwuaGFzKHBldG5hbWUpfHxGYWlsIGBwZXRuYW1lICR7cGV0bmFtZX0gaXMgYWxyZWFkeSBpbiB1c2VgO1xuLy9cbmNvbnN0IG9sZFBldG5hbWU9dmFsVG9QZXRuYW1lLmdldCh2YWwpO1xucGV0bmFtZVRvVmFsLmRlbGV0ZShvbGRQZXRuYW1lKTtcbnZhbFRvUGV0bmFtZS5kZWxldGUodmFsKTtcblxuLy9cbnBldG5hbWVUb1ZhbC5pbml0KHBldG5hbWUsdmFsKTtcbnZhbFRvUGV0bmFtZS5pbml0KHZhbCxwZXRuYW1lKTtcbiB9O1xuXG4vKlxuXG5cblxuICAgICAqL1xuY29uc3Qgc3VnZ2VzdFBldG5hbWU9KHBldG5hbWUsdmFsKT0+e1xuaWYodmFsVG9QZXRuYW1lLmhhcyh2YWwpKXtcbi8vXG5yZXR1cm4gdmFsVG9QZXRuYW1lLmdldCh2YWwpO1xuIH1cblxuLy9cbmxldCB1bmlxdWVQYXRoPXBldG5hbWU7XG5sZXQgbm9uY2U9MjtcbndoaWxlKHBldG5hbWVUb1ZhbC5oYXModW5pcXVlUGF0aCkpe1xuLy9cbmlmKGlzUGF0aChwZXRuYW1lKSl7XG51bmlxdWVQYXRoPVsuLi5wZXRuYW1lLCBgJHtub25jZX1gXTtcbiB9ZWxzZXtcbnVuaXF1ZVBhdGg9IGAke3BldG5hbWV9JHtub25jZX1gO1xuIH1cbm5vbmNlKz0xO1xuIH1cblxuLy9cbi8vXG4vL1xuYWRkUGV0bmFtZSh1bmlxdWVQYXRoLHZhbCk7XG5yZXR1cm4gdW5pcXVlUGF0aDtcbiB9O1xuXG5jb25zdCBkZWxldGVQZXRuYW1lPShwZXRuYW1lKT0+e1xucGV0bmFtZVRvVmFsLmhhcyhwZXRuYW1lKXx8XG5GYWlsIGBwZXRuYW1lICR7cShcbnBldG5hbWUpXG4gfSBoYXMgbm90IGJlZW4gcHJldmlvdXNseSBuYW1lZCwgd291bGQgeW91IGxpa2UgdG8gYWRkIGl0IGluc3RlYWQ/YDtcblxuLy9cbmNvbnN0IHZhbD1wZXRuYW1lVG9WYWwuZ2V0KHBldG5hbWUpO1xucGV0bmFtZVRvVmFsLmRlbGV0ZShwZXRuYW1lKTtcbnZhbFRvUGV0bmFtZS5kZWxldGUodmFsKTtcbiB9O1xuLyogICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBtYXBwaW5nPWhhcmRlbih7XG5pbXBsb2RlLFxuZXhwbG9kZSxcbnZhbFRvUGV0bmFtZSxcbnZhbFRvUGF0aHMsXG5wZXRuYW1lVG9WYWwsXG5hZGRQZXRuYW1lLFxuYWRkUGF0aCxcbnJlbmFtZVBldG5hbWUsXG5kZWxldGVQZXRuYW1lLFxuc3VnZ2VzdFBldG5hbWUsXG5raW5kfSk7XG5cbnBldG5hbWVLaW5kVG9NYXBwaW5nLmluaXQoa2luZCxtYXBwaW5nKTtcbnJldHVybiBtYXBwaW5nO1xuIH07XG5cbmNvbnN0IGVkZ2VNYXBwaW5nPW1ha2VNYXBwaW5nKCdlZGdlJyk7XG5jb25zdCB1bm5hbWVkTWFwcGluZz1tYWtlTWFwcGluZygndW5uYW1lZCcpO1xuXG5jb25zdCBhZGRUb1VubmFtZWQ9KHZhbCk9PntcbnVubmFtZWRDb3VudCs9MTtcbmNvbnN0IHBsYWNlaG9sZGVyPSBgdW5uYW1lZC0ke3VubmFtZWRDb3VudH1gO1xudW5uYW1lZE1hcHBpbmcuYWRkUGV0bmFtZShwbGFjZWhvbGRlcix2YWwpO1xuY29uc3QgcGxhY2Vob2xkZXJOYW1lPWhhcmRlbih7XG5raW5kOid1bm5hbWVkJyxcbnBldG5hbWU6cGxhY2Vob2xkZXJ9KTtcblxucmV0dXJuIHBsYWNlaG9sZGVyTmFtZTtcbiB9O1xuXG4vL1xuLy9cbmNvbnN0IGNvbnZlcnRWYWxUb05hbWU9KHZhbCk9PntcbmZvcihsZXQgaT0wO2k8c2VhcmNoT3JkZXIubGVuZ3RoO2krPTEpe1xuY29uc3Qga2luZD1zZWFyY2hPcmRlcltpXTtcbmNvbnN0e3ZhbFRvUGV0bmFtZX09cGV0bmFtZUtpbmRUb01hcHBpbmcuZ2V0KGtpbmQpO1xuaWYodmFsVG9QZXRuYW1lLmhhcyh2YWwpKXtcbnJldHVybiBoYXJkZW4oe1xua2luZCxcbnBldG5hbWU6dmFsVG9QZXRuYW1lLmdldCh2YWwpfSk7XG5cbiB9XG4gfVxuLy9cbi8vXG5pZih1bm5hbWVkTWFwcGluZy52YWxUb1BldG5hbWUuaGFzKHZhbCkpe1xucmV0dXJuIGhhcmRlbih7XG5raW5kOid1bm5hbWVkJyxcbnBldG5hbWU6dW5uYW1lZE1hcHBpbmcudmFsVG9QZXRuYW1lLmdldCh2YWwpfSk7XG5cbiB9XG4vL1xuY29uc3QgcGxhY2Vob2xkZXJOYW1lPWFkZFRvVW5uYW1lZCh2YWwpO1xucmV0dXJuIHBsYWNlaG9sZGVyTmFtZTtcbiB9O1xuXG5jb25zdCBjb252ZXJ0TmFtZVRvVmFsPSh7a2luZCxwZXRuYW1lfSxfaWZhY2U9dW5kZWZpbmVkKT0+e1xuY29uc3R7cGV0bmFtZVRvVmFsfT1wZXRuYW1lS2luZFRvTWFwcGluZy5nZXQoa2luZCk7XG5yZXR1cm4gcGV0bmFtZVRvVmFsLmdldChwZXRuYW1lKTtcbiB9O1xuXG5jb25zdHt0b0NhcERhdGE6ZGVoeWRyYXRlLGZyb21DYXBEYXRhOmh5ZHJhdGV9PW1ha2VNYXJzaGFsKFxuY29udmVydFZhbFRvTmFtZSxcbmNvbnZlcnROYW1lVG9WYWwsXG57XG5tYXJzaGFsTmFtZTonaHlkcmF0aW9uJyxcbi8vXG4vL1xuZXJyb3JJZE51bTozMF8wMDAsXG5zZXJpYWxpemVCb2R5Rm9ybWF0OidzbWFsbGNhcHMnfSk7XG5cblxucmV0dXJuIGhhcmRlbih7XG5oeWRyYXRlLFxuZGVoeWRyYXRlLFxuZWRnZU1hcHBpbmcsXG4vKlxuXG5cblxuXG4gICAgICovXG5tYWtlTWFwcGluZzooa2luZCxsZWdhY3lPcHRpb25zPXVuZGVmaW5lZCk9PntcbmNvbnN0IG1hcHBpbmc9bWFrZU1hcHBpbmcoa2luZCxsZWdhY3lPcHRpb25zKTtcbnNlYXJjaE9yZGVyLnB1c2goa2luZCk7XG5yZXR1cm4gbWFwcGluZztcbiB9fSk7XG5cbiB9OyRozY9fb25jZS5tYWtlRGVoeWRyYXRvcihtYWtlRGVoeWRyYXRvcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1BhdGgiOlsiaXNQYXRoIl0sIm1ha2VEZWh5ZHJhdG9yIjpbIm1ha2VEZWh5ZHJhdG9yIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAO8/6uhepQAAXqUAADYAAABAYWdvcmljL3dhbGxldC1iYWNrZW5kLXYwLjE1LjAtdTE5LjIvc3JjL2xpYi13YWxsZXQuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGFnb3JpYy9jYWNoZSIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL2ludGVybmFsL3NyYy9zdG9yYWdlLXRlc3QtdXRpbHMuanMiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBhZ29yaWMvZXJ0cCIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vbmF0IiwiQGFnb3JpYy9ub3RpZmllciIsIkBlbmRvL3Byb21pc2Uta2l0IiwiQGFnb3JpYy9zbWFydC13YWxsZXQvc3JjL21hcnNoYWwtY29udGV4dHMuanMiLCIuL2lzc3VlclRhYmxlLmpzIiwiLi9saWItZGVoeWRyYXRlLmpzIiwiLi9maW5kT3JNYWtlSW52aXRhdGlvbi5qcyIsIi4vYmlnaW50U3RyaW5naWZ5LmpzIiwiLi9hY3Rpb25zLmpzIiwiLi9pbnRlcm5hbC10eXBlcy5qcyJdLCJleHBvcnRzIjpbIm1ha2VXYWxsZXRSb290Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgYXNzZXJ0LHEsRmFpbCxtYWtlU2NhbGFyU3RvcmVDb29yZGluYXRvcixvYmplY3RNYXAsV2FsbGV0TmFtZSxzbG90U3RyaW5nVW5zZXJpYWxpemUsbWFrZUxlZ2FjeU1hcCxtYWtlU2NhbGFyTWFwU3RvcmUsbWFrZVNjYWxhcldlYWtNYXBTdG9yZSxtYWtlU2NhbGFyQmlnTWFwU3RvcmUsQW1vdW50TWF0aCxFLHBhc3NTdHlsZU9mLEZhcixtYXBJdGVyYWJsZSxOYXQsbWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIsbWFrZU5vdGlmaWVyS2l0LG9ic2VydmVJdGVyYXRpb24sb2JzZXJ2ZU5vdGlmaWVyLHN1YnNjcmliZUVhY2gsbWFrZVByb21pc2VLaXQsbWFrZUV4cG9ydENvbnRleHQsbWFrZUlzc3VlclRhYmxlLG1ha2VEZWh5ZHJhdG9yLG1ha2VJZCxmaW5kT3JNYWtlSW52aXRhdGlvbixiaWdpbnRTdHJpbmdpZnksbWFrZVBheW1lbnRBY3Rpb25zOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJhc3NlcnRcIiwgWyRozY9fYSA9PiAoYXNzZXJ0ID0gJGjNj19hKV1dLFtcInFcIiwgWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsIFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2NhY2hlXCIsIFtbXCJtYWtlU2NhbGFyU3RvcmVDb29yZGluYXRvclwiLCBbJGjNj19hID0+IChtYWtlU2NhbGFyU3RvcmVDb29yZGluYXRvciA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcIm9iamVjdE1hcFwiLCBbJGjNj19hID0+IChvYmplY3RNYXAgPSAkaM2PX2EpXV0sW1wiV2FsbGV0TmFtZVwiLCBbJGjNj19hID0+IChXYWxsZXROYW1lID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbC9zcmMvc3RvcmFnZS10ZXN0LXV0aWxzLmpzXCIsIFtbXCJzbG90U3RyaW5nVW5zZXJpYWxpemVcIiwgWyRozY9fYSA9PiAoc2xvdFN0cmluZ1Vuc2VyaWFsaXplID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibWFrZUxlZ2FjeU1hcFwiLCBbJGjNj19hID0+IChtYWtlTGVnYWN5TWFwID0gJGjNj19hKV1dLFtcIm1ha2VTY2FsYXJNYXBTdG9yZVwiLCBbJGjNj19hID0+IChtYWtlU2NhbGFyTWFwU3RvcmUgPSAkaM2PX2EpXV0sW1wibWFrZVNjYWxhcldlYWtNYXBTdG9yZVwiLCBbJGjNj19hID0+IChtYWtlU2NhbGFyV2Vha01hcFN0b3JlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wibWFrZVNjYWxhckJpZ01hcFN0b3JlXCIsIFskaM2PX2EgPT4gKG1ha2VTY2FsYXJCaWdNYXBTdG9yZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50TWF0aFwiLCBbJGjNj19hID0+IChBbW91bnRNYXRoID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wiRmFyXCIsIFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXSxbXCJtYXBJdGVyYWJsZVwiLCBbJGjNj19hID0+IChtYXBJdGVyYWJsZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsIFskaM2PX2EgPT4gKE5hdCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyXCIsIFskaM2PX2EgPT4gKG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyID0gJGjNj19hKV1dLFtcIm1ha2VOb3RpZmllcktpdFwiLCBbJGjNj19hID0+IChtYWtlTm90aWZpZXJLaXQgPSAkaM2PX2EpXV0sW1wib2JzZXJ2ZUl0ZXJhdGlvblwiLCBbJGjNj19hID0+IChvYnNlcnZlSXRlcmF0aW9uID0gJGjNj19hKV1dLFtcIm9ic2VydmVOb3RpZmllclwiLCBbJGjNj19hID0+IChvYnNlcnZlTm90aWZpZXIgPSAkaM2PX2EpXV0sW1wic3Vic2NyaWJlRWFjaFwiLCBbJGjNj19hID0+IChzdWJzY3JpYmVFYWNoID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcIm1ha2VQcm9taXNlS2l0XCIsIFskaM2PX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zbWFydC13YWxsZXQvc3JjL21hcnNoYWwtY29udGV4dHMuanNcIiwgW1tcIm1ha2VFeHBvcnRDb250ZXh0XCIsIFskaM2PX2EgPT4gKG1ha2VFeHBvcnRDb250ZXh0ID0gJGjNj19hKV1dXV0sW1wiLi9pc3N1ZXJUYWJsZS5qc1wiLCBbW1wibWFrZUlzc3VlclRhYmxlXCIsIFskaM2PX2EgPT4gKG1ha2VJc3N1ZXJUYWJsZSA9ICRozY9fYSldXV1dLFtcIi4vbGliLWRlaHlkcmF0ZS5qc1wiLCBbW1wibWFrZURlaHlkcmF0b3JcIiwgWyRozY9fYSA9PiAobWFrZURlaHlkcmF0b3IgPSAkaM2PX2EpXV1dXSxbXCIuL2ZpbmRPck1ha2VJbnZpdGF0aW9uLmpzXCIsIFtbXCJtYWtlSWRcIiwgWyRozY9fYSA9PiAobWFrZUlkID0gJGjNj19hKV1dLFtcImZpbmRPck1ha2VJbnZpdGF0aW9uXCIsIFskaM2PX2EgPT4gKGZpbmRPck1ha2VJbnZpdGF0aW9uID0gJGjNj19hKV1dXV0sW1wiLi9iaWdpbnRTdHJpbmdpZnkuanNcIiwgW1tcImJpZ2ludFN0cmluZ2lmeVwiLCBbJGjNj19hID0+IChiaWdpbnRTdHJpbmdpZnkgPSAkaM2PX2EpXV1dXSxbXCIuL2FjdGlvbnMuanNcIiwgW1tcIm1ha2VQYXltZW50QWN0aW9uc1wiLCBbJGjNj19hID0+IChtYWtlUGF5bWVudEFjdGlvbnMgPSAkaM2PX2EpXV1dXSxbXCIuL2ludGVybmFsLXR5cGVzLmpzXCIsIFtdXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShtYWtlV2FsbGV0Um9vdCwgJ25hbWUnLCB7dmFsdWU6IFwibWFrZVdhbGxldFJvb3RcIn0pOyRozY9fb25jZS5tYWtlV2FsbGV0Um9vdChtYWtlV2FsbGV0Um9vdCk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vL1xuY29uc3Qgbm9BY3Rpb25TdGF0ZUNoYW5nZUhhbmRsZXI9KF9uZXdTdGF0ZSk9PnsgfTtcblxuY29uc3QgY21wPShhLGIpPT57XG5pZihhPmIpe1xucmV0dXJuIDE7XG4gfVxuaWYoYT09PWIpe1xucmV0dXJuIDA7XG4gfVxucmV0dXJuLTE7XG4gfTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuZnVuY3Rpb24gICAgICAgIG1ha2VXYWxsZXRSb290KHtcbnpvZSxcbmJvYXJkLFxuYWdvcmljTmFtZXMsXG5uYW1lc0J5QWRkcmVzcyxcbm15QWRkcmVzc05hbWVBZG1pbixcbnB1cnNlc1N0YXRlQ2hhbmdlSGFuZGxlcj1ub0FjdGlvblN0YXRlQ2hhbmdlSGFuZGxlcixcbmluYm94U3RhdGVDaGFuZ2VIYW5kbGVyPW5vQWN0aW9uU3RhdGVDaGFuZ2VIYW5kbGVyLFxuZGF0ZU5vdz11bmRlZmluZWR9KVxue1xuYXNzZXJ0KG15QWRkcmVzc05hbWVBZG1pbiwnbWlzc2luZyBteUFkZHJlc3NOYW1lQWRtaW4nKTtcblxubGV0IGxhc3RJZD0wO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuY29uc3QgYWRkTWV0YT0ocmVjb3JkKT0+e1xuY29uc3R7bWV0YTpvbGRNZXRhPXt9fT1yZWNvcmQ7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBtZXRhPXsuLi5vbGRNZXRhfTtcbmlmKCFtZXRhLmlkKXtcbi8vXG5sYXN0SWQrPTE7XG5tZXRhLmlkPWxhc3RJZDtcbiB9XG5pZihkYXRlTm93KXtcbmNvbnN0IG5vd1N0YW1wPWRhdGVOb3coKTtcbmlmKCFtZXRhLmNyZWF0aW9uU3RhbXApe1xuLy9cbm1ldGEuY3JlYXRpb25TdGFtcD1ub3dTdGFtcDtcbiB9XG5tZXRhLnVwZGF0ZWRTdGFtcD1ub3dTdGFtcDtcbiB9XG5yZXR1cm57Li4ucmVjb3JkLG1ldGF9O1xuIH07XG5cbmNvbnN0IGNvbnRleHQ9bWFrZUV4cG9ydENvbnRleHQoKTtcblxuLy9cbi8vXG5jb25zdHttYWtlTWFwcGluZyxkZWh5ZHJhdGUsZWRnZU1hcHBpbmd9PW1ha2VEZWh5ZHJhdG9yKCk7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgcHVyc2VNYXBwaW5nPW1ha2VNYXBwaW5nKCdwdXJzZScpO1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGJyYW5kTWFwcGluZz1tYWtlTWFwcGluZygnYnJhbmQnKTtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGNvbnRhY3RNYXBwaW5nPW1ha2VNYXBwaW5nKFxuJ2NvbnRhY3QnLFxue3VzZUxlZ2FjeU1hcDp0cnVlfS8vXG4pO1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGluc3RhbmNlTWFwcGluZz1tYWtlTWFwcGluZygnaW5zdGFuY2UnKTtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgaW5zdGFsbGF0aW9uTWFwcGluZz1tYWtlTWFwcGluZygnaW5zdGFsbGF0aW9uJyk7XG5cbmNvbnN0IGJyYW5kVGFibGU9bWFrZUlzc3VlclRhYmxlKCk7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBpc3N1ZXJUb0JvYXJkSWQ9bWFrZVNjYWxhcldlYWtNYXBTdG9yZSgnaXNzdWVyJyk7XG5cbi8vXG5jb25zdCBpbml0SXNzdWVyVG9Cb2FyZElkPWFzeW5jKGlzc3VlcixicmFuZCk9PntcbmlmKGlzc3VlclRvQm9hcmRJZC5oYXMoaXNzdWVyKSl7XG4vL1xucmV0dXJuIGlzc3VlclRvQm9hcmRJZC5nZXQoaXNzdWVyKTtcbiB9XG5cbi8vXG5jb25zdFtpc3N1ZXJCb2FyZElkLGJyYW5kQm9hcmRJZF09YXdhaXQgUHJvbWlzZS5hbGwoW1xuRShib2FyZCkuZ2V0SWQoaXNzdWVyKSxcbkUoYm9hcmQpLmdldElkKGJyYW5kKV0pO1xuXG5pZihpc3N1ZXJUb0JvYXJkSWQuaGFzKGlzc3Vlcikpe1xuLy9cbnJldHVybiBpc3N1ZXJUb0JvYXJkSWQuZ2V0KGlzc3Vlcik7XG4gfVxuXG4vL1xuLy9cbmNvbnRleHQuZW5zdXJlQm9hcmRJZChpc3N1ZXJCb2FyZElkLGlzc3Vlcik7XG5jb250ZXh0LmluaXRCb2FyZElkKGJyYW5kQm9hcmRJZCxicmFuZCk7XG5cbi8vXG5pc3N1ZXJUb0JvYXJkSWQuaW5pdChpc3N1ZXIsaXNzdWVyQm9hcmRJZCk7XG5yZXR1cm4gaXNzdWVyQm9hcmRJZDtcbiB9O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgcHVyc2VUb0JyYW5kPW1ha2VTY2FsYXJXZWFrTWFwU3RvcmUoJ3B1cnNlJyk7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgYnJhbmRUb0RlcG9zaXRGYWNldElkPW1ha2VTY2FsYXJNYXBTdG9yZSgnYnJhbmQnKTtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGJyYW5kVG9BdXRvRGVwb3NpdFB1cnNlPW1ha2VTY2FsYXJNYXBTdG9yZSgnYnJhbmQnKTtcblxuLy9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgaWRUb09mZmVyPW1ha2VTY2FsYXJNYXBTdG9yZSgnb2ZmZXJJZCcpO1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLy9cbmNvbnN0IGlkVG9PZmZlclJlc3VsdFByb21pc2VLaXQ9bWFrZUxlZ2FjeU1hcCgnaWQnKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBpbnZpdGF0aW9uSGFuZGxlVG9PZmZlclJlc3VsdD1cbm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUoJ2ludml0YXRpb25IYW5kbGUnKTtcblxuLy9cbmNvbnN0IGlkVG9Db21waWxlZE9mZmVyUD1uZXcgTWFwKCk7XG5jb25zdCBpZFRvQ29tcGxldGU9bmV3IE1hcCgpO1xuY29uc3QgaWRUb1NlYXQ9bmV3IE1hcCgpO1xuXG4vL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgcHVyc2VzU3RhdGU9bmV3IE1hcCgpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHB1cnNlc0Z1bGxTdGF0ZT1uZXcgTWFwKCk7XG5jb25zdCBpbmJveFN0YXRlPW5ldyBNYXAoKTtcblxuLypcblxuXG5cbiAgICovXG5sZXQgem9lSW52aXRlUHVyc2U7XG5cbmNvbnN0IFpPRV9JTlZJVEVfQlJBTkRfUEVUTkFNRT0nem9lIGludml0ZSc7XG5cbmZ1bmN0aW9uIGdldFNvcnRlZFZhbHVlcyhtYXApe1xuY29uc3QgZW50cmllcz1bLi4ubWFwLmVudHJpZXMoKV07XG4vL1xuY29uc3QgdmFsdWVzPWVudHJpZXMuXG5zb3J0KChbaWQxXSxbaWQyXSk9PmNtcChpZDEsaWQyKSkuXG5tYXAoKFtfaWQsdmFsdWVdKT0+dmFsdWUpO1xuXG5yZXR1cm4gYmlnaW50U3RyaW5naWZ5KGhhcmRlbih2YWx1ZXMpKTtcbiB9XG5cbmZ1bmN0aW9uIGdldFB1cnNlc1N0YXRlKCl7XG5yZXR1cm4gZ2V0U29ydGVkVmFsdWVzKHB1cnNlc1N0YXRlKTtcbiB9XG5cbmZ1bmN0aW9uIGdldEluYm94U3RhdGUoKXtcbnJldHVybiBnZXRTb3J0ZWRWYWx1ZXMoaW5ib3hTdGF0ZSk7XG4gfVxuXG4vL1xuLy9cbi8vXG5jb25zdCBmaWxsSW5TbG90cz1zbG90U3RyaW5nVW5zZXJpYWxpemU7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0e25vdGlmaWVyOm9mZmVyc05vdGlmaWVyLHVwZGF0ZXI6b2ZmZXJzVXBkYXRlcn09bWFrZU5vdGlmaWVyS2l0KFxuW10pO1xuXG5cbmNvbnN0e3B1cnNlc05vdGlmaWVyLGF0dGVudWF0ZWRQdXJzZXNOb3RpZmllcixwdXJzZXNVcGRhdGVyfT0oKCk9Pntcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3R7bm90aWZpZXI6aXBuLHVwZGF0ZXI6aXB1fT1tYWtlTm90aWZpZXJLaXQoW10pO1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdHtub3RpZmllcjphcG4sdXBkYXRlcjphcHV9PW1ha2VOb3RpZmllcktpdChbXSk7XG4vL1xuLypcblxuXG4gICAgICovXG5jb25zdCBpbm5lckZpbHRlcj0oe1xuYnJhbmQsXG5icmFuZEJvYXJkSWQsXG5kZXBvc2l0Qm9hcmRJZCxcbmJyYW5kUGV0bmFtZSxcbnB1cnNlUGV0bmFtZSxcbmRpc3BsYXlJbmZvLFxudmFsdWUsXG5jdXJyZW50QW1vdW50U2xvdHMsXG5jdXJyZW50QW1vdW50fSk9PlxuXG5oYXJkZW4oe1xuYnJhbmQsXG5icmFuZEJvYXJkSWQsXG4uLi4oZGVwb3NpdEJvYXJkSWQmJntkZXBvc2l0Qm9hcmRJZH0pLFxuYnJhbmRQZXRuYW1lLFxucHVyc2VQZXRuYW1lLFxuLi4uKGRpc3BsYXlJbmZvJiZ7ZGlzcGxheUluZm99KSxcbnZhbHVlLFxuY3VycmVudEFtb3VudFNsb3RzLFxuY3VycmVudEFtb3VudH0pO1xuXG5jb25zdCBmaWx0ZXI9KHN0YXRlKT0+c3RhdGUubWFwKGlubmVyRmlsdGVyKTtcbmNvbnN0IHB1PUZhcigncHVyc2VzVXBkYXRlcicse1xudXBkYXRlU3RhdGU6KG5ld1N0YXRlKT0+e1xuaXB1LnVwZGF0ZVN0YXRlKG5ld1N0YXRlKTtcbmFwdS51cGRhdGVTdGF0ZShmaWx0ZXIobmV3U3RhdGUpKTtcbiB9LFxuZmluaXNoOihmaW5hbFN0YXRlKT0+e1xuaXB1LmZpbmlzaChmaW5hbFN0YXRlKTtcbmFwdS5maW5pc2goZmlsdGVyKGZpbmFsU3RhdGUpKTtcbiB9LFxuZmFpbDoocmVhc29uKT0+e1xuaXB1LmZhaWwocmVhc29uKTtcbmFwdS5mYWlsKHJlYXNvbik7XG4gfX0pO1xuXG5yZXR1cm4gaGFyZGVuKHtcbnB1cnNlc05vdGlmaWVyOmlwbixcbmF0dGVudWF0ZWRQdXJzZXNOb3RpZmllcjphcG4sXG5wdXJzZXNVcGRhdGVyOnB1fSk7XG5cbiB9KSgpO1xuXG4vKlxuXG5cbiAgICovXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVQdXJzZXNTdGF0ZShwdXJzZVBldG5hbWUscHVyc2Upe1xuY29uc3QgcHVyc2VLZXk9cHVyc2VNYXBwaW5nLmltcGxvZGUocHVyc2VQZXRuYW1lKTtcbmZvcihjb25zdCBrZXkgb2YgcHVyc2VzU3RhdGUua2V5cygpKXtcbmlmKCFwdXJzZU1hcHBpbmcucGV0bmFtZVRvVmFsLmhhcyhwdXJzZU1hcHBpbmcuZXhwbG9kZShrZXkpKSl7XG5wdXJzZXNTdGF0ZS5kZWxldGUoa2V5KTtcbiB9XG4gfVxuY29uc3QgY3VycmVudEFtb3VudD1hd2FpdCBFKHB1cnNlKS5nZXRDdXJyZW50QW1vdW50KCk7XG5jb25zdHt2YWx1ZSxicmFuZH09Y3VycmVudEFtb3VudDtcbmNvbnN0IGJyYW5kUGV0bmFtZT1icmFuZE1hcHBpbmcudmFsVG9QZXRuYW1lLmdldChicmFuZCk7XG5jb25zdCBkZWh5ZHJhdGVkQ3VycmVudEFtb3VudD1kZWh5ZHJhdGUoY3VycmVudEFtb3VudCk7XG5jb25zdCBicmFuZEJvYXJkSWQ9YXdhaXQgRShib2FyZCkuZ2V0SWQoYnJhbmQpO1xuXG5sZXQgZGVwb3NpdEJvYXJkSWQ7XG5pZihcbmJyYW5kVG9BdXRvRGVwb3NpdFB1cnNlLmhhcyhicmFuZCkmJlxuYnJhbmRUb0F1dG9EZXBvc2l0UHVyc2UuZ2V0KGJyYW5kKT09PXB1cnNlJiZcbmJyYW5kVG9EZXBvc2l0RmFjZXRJZC5oYXMoYnJhbmQpKVxue1xuLy9cbmRlcG9zaXRCb2FyZElkPWJyYW5kVG9EZXBvc2l0RmFjZXRJZC5nZXQoYnJhbmQpO1xuIH1cblxuY29uc3QgaXNzdWVyUmVjb3JkPVxuYnJhbmRUYWJsZS5oYXNCeUJyYW5kKGJyYW5kKSYmYnJhbmRUYWJsZS5nZXRCeUJyYW5kKGJyYW5kKTtcbi8qXG5cbiAgICAgKi9cbmNvbnN0IGpzdGF0ZT1hZGRNZXRhKHtcbi4uLnB1cnNlc1N0YXRlLmdldChwdXJzZUtleSksXG5icmFuZCxcbmJyYW5kQm9hcmRJZCxcbi4uLihkZXBvc2l0Qm9hcmRJZCYme2RlcG9zaXRCb2FyZElkfSksXG5icmFuZFBldG5hbWUsXG5wdXJzZVBldG5hbWUsXG5kaXNwbGF5SW5mbzppc3N1ZXJSZWNvcmQmJmlzc3VlclJlY29yZC5kaXNwbGF5SW5mbyxcbnZhbHVlLFxuY3VycmVudEFtb3VudFNsb3RzOmRlaHlkcmF0ZWRDdXJyZW50QW1vdW50LFxuY3VycmVudEFtb3VudDpmaWxsSW5TbG90cyhkZWh5ZHJhdGVkQ3VycmVudEFtb3VudCl9KTtcblxucHVyc2VzU3RhdGUuc2V0KHB1cnNlS2V5LGpzdGF0ZSk7XG5cbnB1cnNlc0Z1bGxTdGF0ZS5zZXQoXG5wdXJzZSxcbmhhcmRlbih7XG4uLi5qc3RhdGUsXG5wdXJzZSxcbmJyYW5kLFxuYWN0aW9uczpGYXIoJ3B1cnNlLmFjdGlvbnMnLHtcbi8vXG4gICAgICBhc3luYyBzZW5kKHJlY2VpdmVyUCxzZW5kVmFsdWUpe1xuY29uc3QgYW1vdW50PUFtb3VudE1hdGgubWFrZShicmFuZCxzZW5kVmFsdWUpO1xuY29uc3QgcGF5bWVudD1hd2FpdCBFKHB1cnNlKS53aXRoZHJhdyhhbW91bnQpO1xudHJ5e1xuYXdhaXQgRShyZWNlaXZlclApLnJlY2VpdmUocGF5bWVudCk7XG4gfWNhdGNoKGUpe1xuLy9cbmF3YWl0IEUocHVyc2UpLmRlcG9zaXQocGF5bWVudCk7XG50aHJvdyBlO1xuIH1cbiB9LFxuICAgICAgYXN5bmMgcmVjZWl2ZShwYXltZW50UCl7XG5jb25zdCBwYXltZW50PWF3YWl0IHBheW1lbnRQO1xucmV0dXJuIEUocHVyc2UpLmRlcG9zaXQocGF5bWVudCk7XG4gfSxcbmRlcG9zaXQocGF5bWVudCxhbW91bnQ9dW5kZWZpbmVkKXtcbnJldHVybiBFKHB1cnNlKS5kZXBvc2l0KHBheW1lbnQsYW1vdW50KTtcbiB9fSl9KSk7XG5cblxuXG5wdXJzZXNVcGRhdGVyLnVwZGF0ZVN0YXRlKFsuLi5wdXJzZXNGdWxsU3RhdGUudmFsdWVzKCldKTtcbnB1cnNlc1N0YXRlQ2hhbmdlSGFuZGxlcihnZXRQdXJzZXNTdGF0ZSgpKTtcbiB9XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUFsbFB1cnNlU3RhdGUoKXtcbnJldHVybiBQcm9taXNlLmFsbChcbm1hcEl0ZXJhYmxlKHB1cnNlTWFwcGluZy5wZXRuYW1lVG9WYWwuZW50cmllcygpLChbcGV0bmFtZSxwdXJzZV0pPT5cbnVwZGF0ZVB1cnNlc1N0YXRlKHBldG5hbWUscHVyc2UpKSk7XG5cblxuIH1cblxuY29uc3QgZGlzcGxheT0odmFsdWUpPT5maWxsSW5TbG90cyhkZWh5ZHJhdGUoaGFyZGVuKHZhbHVlKSkpO1xuXG5jb25zdCBleHBhbmRJbnZpdGF0aW9uQnJhbmRzPWFzeW5jKGludml0YXRpb25EZXRhaWxzKT0+e1xuLy9cbmNvbnN0e2ZlZX09aW52aXRhdGlvbkRldGFpbHM7XG5pZighZmVlKXtcbnJldHVybiBpbnZpdGF0aW9uRGV0YWlscztcbiB9XG5cbi8vXG5jb25zdCBkaXNwbGF5SW5mbz1hd2FpdCBFKEUoem9lKS5nZXRGZWVJc3N1ZXIoKSkuZ2V0RGlzcGxheUluZm8oKTtcbmNvbnN0IGF1Z21lbnRlZERldGFpbHM9e1xuLi4uaW52aXRhdGlvbkRldGFpbHMsXG5mZWU6ey4uLmZlZSxkaXNwbGF5SW5mb319O1xuXG5yZXR1cm4gZGlzcGxheShhdWdtZW50ZWREZXRhaWxzKTtcbiB9O1xuXG5jb25zdCBkaXNwbGF5UHJvcG9zYWw9KHByb3Bvc2FsVGVtcGxhdGUpPT57XG5jb25zdHtcbndhbnQsXG5naXZlLFxuZXhpdD17b25EZW1hbmQ6bnVsbH0sXG5hcmd1bWVudHM6YXJnc309XG5wcm9wb3NhbFRlbXBsYXRlO1xuY29uc3QgZGlzcGxheVJlY29yZD0ocHVyc2VQZXRuYW1lVmFsdWVLZXl3b3JkUmVjb3JkKT0+e1xuaWYocHVyc2VQZXRuYW1lVmFsdWVLZXl3b3JkUmVjb3JkPT09dW5kZWZpbmVkKXtcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxucmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbk9iamVjdC5lbnRyaWVzKHB1cnNlUGV0bmFtZVZhbHVlS2V5d29yZFJlY29yZCkubWFwKFxuKFtrZXl3b3JkLHtwdXJzZVBldG5hbWUsdmFsdWUsYW1vdW50LHB1cnNlfV0pPT57XG5pZighYW1vdW50KXtcbnB1cnNlPWdldFB1cnNlKHB1cnNlUGV0bmFtZSk7XG5hbW91bnQ9e3ZhbHVlfTtcbiB9ZWxzZXtcbnB1cnNlUGV0bmFtZT1wdXJzZU1hcHBpbmcudmFsVG9QZXRuYW1lLmdldChwdXJzZSk7XG4gfVxuXG5jb25zdCBicmFuZD1wdXJzZVRvQnJhbmQuZ2V0KHB1cnNlKTtcbmNvbnN0IGlzc3VlclJlY29yZD1cbmJyYW5kVGFibGUuaGFzQnlCcmFuZChicmFuZCkmJmJyYW5kVGFibGUuZ2V0QnlCcmFuZChicmFuZCk7XG5hbW91bnQ9aGFyZGVuKHtcbi4uLmFtb3VudCxcbmJyYW5kLFxuZGlzcGxheUluZm86aXNzdWVyUmVjb3JkJiZpc3N1ZXJSZWNvcmQuZGlzcGxheUluZm99KTtcblxuY29uc3QgZGlzcGxheUFtb3VudD1kaXNwbGF5KGFtb3VudCk7XG5yZXR1cm5bXG5rZXl3b3JkLFxue1xucHVyc2VQZXRuYW1lLFxucHVyc2UsXG5hbW91bnQ6ZGlzcGxheUFtb3VudH1dO1xuXG5cbiB9KSk7XG5cblxuIH07XG5jb25zdCBwcm9wb3NhbEZvckRpc3BsYXk9e1xud2FudDpkaXNwbGF5UmVjb3JkKHdhbnQpLFxuZ2l2ZTpkaXNwbGF5UmVjb3JkKGdpdmUpLFxuZXhpdH07XG5cbmlmKGFyZ3MhPT11bmRlZmluZWQpe1xucHJvcG9zYWxGb3JEaXNwbGF5LmFyZ3VtZW50cz1kaXNwbGF5KGFyZ3MpO1xuIH1cbnJldHVybiBwcm9wb3NhbEZvckRpc3BsYXk7XG4gfTtcblxuLypcblxuXG5cblxuXG4gICAqL1xuY29uc3QgcHJ1bmVPZmZlcldoZW5JbmFjdGl2ZT0oaWQpPT57XG5hc3NlcnQoaW5ib3hTdGF0ZS5oYXMoaWQpKTtcbmNvbnN0IG9mZmVyPWluYm94U3RhdGUuZ2V0KGlkKTtcbmNvbnN0e3N0YXR1c309b2ZmZXI7XG5cbnN3aXRjaChzdGF0dXMpe1xuY2FzZSdkZWNsaW5lJzpcbmNhc2UnY2FuY2VsJzpcbmNhc2UncmVqZWN0ZWQnOlxuaW5ib3hTdGF0ZS5kZWxldGUoaWQpO1xucmV0dXJuO1xuY2FzZSdhY2NlcHQnOlxuYXNzZXJ0KGlkVG9PZmZlclJlc3VsdFByb21pc2VLaXQuaGFzKGlkKSk7XG52b2lkIEUud2hlbihpZFRvT2ZmZXJSZXN1bHRQcm9taXNlS2l0LmdldChpZCkucHJvbWlzZSwocmVzdWx0KT0+e1xuY29uc3Qgc3R5bGU9cGFzc1N0eWxlT2YocmVzdWx0KTtcbmNvbnN0IGFjdGl2ZT1cbnN0eWxlPT09J3JlbW90YWJsZSd8fFxuc3R5bGU9PT0nY29weVJlY29yZCcmJidpbnZpdGF0aW9uTWFrZXJzJ2luIHJlc3VsdDtcbmlmKCFhY3RpdmUpe1xuaW5ib3hTdGF0ZS5kZWxldGUoaWQpO1xuIH1cbiB9KTtcbmJyZWFrO1xuY2FzZSdwZW5kaW5nJzpcbmNhc2UnY29tcGxldGUnOlxuZGVmYXVsdDp9XG5cbiB9O1xuXG5hc3luYyBmdW5jdGlvbiB1cGRhdGVJbmJveFN0YXRlKGlkLG9mZmVyLGRvUHVzaD10cnVlKXtcbi8vXG5jb25zdHtwcm9wb3NhbFRlbXBsYXRlfT1vZmZlcjtcbmNvbnN0e2luc3RhbmNlLGluc3RhbGxhdGlvbixpbnZpdGF0aW9uRGV0YWlsc309aWRUb09mZmVyLmdldChpZCk7XG5pZighaW5zdGFuY2V8fCFpbnN0YWxsYXRpb24pe1xuLy9cbi8vXG5yZXR1cm47XG4gfVxuY29uc3QgaW5zdGFuY2VEaXNwbGF5PWRpc3BsYXkoaW5zdGFuY2UpO1xuY29uc3QgaW5zdGFsbGF0aW9uRGlzcGxheT1kaXNwbGF5KGluc3RhbGxhdGlvbik7XG5jb25zdCBhbHJlYWR5RGlzcGxheWVkPVxuaW5ib3hTdGF0ZS5oYXMoaWQpJiZpbmJveFN0YXRlLmdldChpZCkucHJvcG9zYWxGb3JEaXNwbGF5O1xuXG5jb25zdCBhdWdtZW50ZWRJbnZpdGF0aW9uRGV0YWlscz1cbmF3YWl0IGV4cGFuZEludml0YXRpb25CcmFuZHMoaW52aXRhdGlvbkRldGFpbHMpO1xuXG5jb25zdCBvZmZlckZvckRpc3BsYXk9e1xuLi4ub2ZmZXIsXG4vL1xuLy9cbi8vXG5hY3Rpb25zOnVuZGVmaW5lZCxcbmluc3RhbGxhdGlvbjp1bmRlZmluZWQsXG5pbnN0YW5jZTp1bmRlZmluZWQsXG5wcm9wb3NhbFRlbXBsYXRlLFxuaW52aXRhdGlvbkRldGFpbHM6ZGlzcGxheShhdWdtZW50ZWRJbnZpdGF0aW9uRGV0YWlscyksXG5pbnN0YW5jZVBldG5hbWU6aW5zdGFuY2VEaXNwbGF5LnBldG5hbWUsXG5pbnN0YWxsYXRpb25QZXRuYW1lOmluc3RhbGxhdGlvbkRpc3BsYXkucGV0bmFtZSxcbnByb3Bvc2FsRm9yRGlzcGxheTpkaXNwbGF5UHJvcG9zYWwoYWxyZWFkeURpc3BsYXllZHx8cHJvcG9zYWxUZW1wbGF0ZSl9O1xuXG5cbmluYm94U3RhdGUuc2V0KGlkLG9mZmVyRm9yRGlzcGxheSk7XG5pZihkb1B1c2gpe1xuLy9cbm9mZmVyc1VwZGF0ZXIudXBkYXRlU3RhdGUoW29mZmVyRm9yRGlzcGxheV0pO1xuaW5ib3hTdGF0ZUNoYW5nZUhhbmRsZXIoZ2V0SW5ib3hTdGF0ZSgpKTtcbiB9XG5wcnVuZU9mZmVyV2hlbkluYWN0aXZlKGlkKTtcbiB9XG5cbmFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUFsbEluYm94U3RhdGUoKXtcbmF3YWl0IFByb21pc2UuYWxsKFxuQXJyYXkuZnJvbShpbmJveFN0YXRlLmVudHJpZXMoKSkubWFwKChbaWQsb2ZmZXJdKT0+XG4vL1xudXBkYXRlSW5ib3hTdGF0ZShpZCxvZmZlcixmYWxzZSkpKTtcblxuXG4vL1xub2ZmZXJzVXBkYXRlci51cGRhdGVTdGF0ZShbLi4uaW5ib3hTdGF0ZS52YWx1ZXMoKV0pO1xuaW5ib3hTdGF0ZUNoYW5nZUhhbmRsZXIoZ2V0SW5ib3hTdGF0ZSgpKTtcbiB9XG5cbmNvbnN0e3VwZGF0ZXI6aXNzdWVyc1VwZGF0ZXIsbm90aWZpZXI6aXNzdWVyc05vdGlmaWVyfT1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xubWFrZU5vdGlmaWVyS2l0KFtdKTtcblxuXG5mdW5jdGlvbiB1cGRhdGVBbGxJc3N1ZXJzU3RhdGUoKXtcbmlzc3VlcnNVcGRhdGVyLnVwZGF0ZVN0YXRlKFxuWy4uLmJyYW5kTWFwcGluZy5wZXRuYW1lVG9WYWwuZW50cmllcygpXS5tYXAoKFtwZXRuYW1lLGJyYW5kXSk9PntcbmNvbnN0IGlzc3VlclJlY29yZD1icmFuZFRhYmxlLmdldEJ5QnJhbmQoYnJhbmQpO1xucmV0dXJuW1xucGV0bmFtZSxcbntcbi4uLmlzc3VlclJlY29yZCxcbmlzc3VlckJvYXJkSWQ6aXNzdWVyVG9Cb2FyZElkLmdldChpc3N1ZXJSZWNvcmQuaXNzdWVyKX1dO1xuXG5cbiB9KSk7XG5cbiB9XG5cbi8vXG4vL1xuYXN5bmMgZnVuY3Rpb24gdXBkYXRlQWxsU3RhdGUoKXtcbnVwZGF0ZUFsbElzc3VlcnNTdGF0ZSgpO1xuYXdhaXQgdXBkYXRlQWxsUHVyc2VTdGF0ZSgpO1xuYXdhaXQgdXBkYXRlQWxsSW5ib3hTdGF0ZSgpO1xuIH1cblxuLy9cbi8vXG5mdW5jdGlvbiB1cGRhdGVPclJlc3Vic2NyaWJlKGlkLHNlYXQsdXBkYXRlKXtcbmNvbnN0e3VwZGF0ZUNvdW50fT11cGRhdGU7XG5hc3NlcnQodXBkYXRlQ291bnQ9PT11bmRlZmluZWQpO1xuaWRUb1NlYXQuZGVsZXRlKGlkKTtcblxuY29uc3Qgb2ZmZXI9aWRUb09mZmVyLmdldChpZCk7XG5jb25zdCBjb21wbGV0ZWRPZmZlcj1hZGRNZXRhKHtcbi4uLm9mZmVyLFxuc3RhdHVzOidjb21wbGV0ZSd9KTtcblxuaWRUb09mZmVyLnNldChpZCxjb21wbGV0ZWRPZmZlcik7XG52b2lkIHVwZGF0ZUluYm94U3RhdGUoaWQsY29tcGxldGVkT2ZmZXIpO1xuIH1cblxuLypcblxuXG5cblxuICAgKi9cbmZ1bmN0aW9uIHN1YnNjcmliZVRvVXBkYXRlcyhpZCxzZWF0KXtcbnJldHVybiBFKEUoc2VhdCkuZ2V0RXhpdFN1YnNjcmliZXIoKSkuXG5zdWJzY3JpYmVBZnRlcigpLlxudGhlbigodXBkYXRlKT0+dXBkYXRlT3JSZXN1YnNjcmliZShpZCxzZWF0LHVwZGF0ZSkpO1xuIH1cblxuYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZU9mZmVyKGNvbXBpbGVkT2ZmZXJQKXtcbi8vXG4vL1xuLy9cbmNvbnN0e1xuaW52aXRlUCxcbnB1cnNlS2V5d29yZFJlY29yZCxcbnByb3Bvc2FsLFxuYXJndW1lbnRzOmFyZ3N9PVxuYXdhaXQgY29tcGlsZWRPZmZlclA7XG5cbi8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBwYXltZW50VG9QdXJzZT1uZXcgTWFwKCk7XG5cbi8vXG4vL1xuY29uc3Qga2V5d29yZFBheW1lbnRQcz1PYmplY3QuZW50cmllcyhwcm9wb3NhbC5naXZlfHxoYXJkZW4oe30pKS5tYXAoXG5hc3luYyhba2V5d29yZCxhbW91bnRdKT0+e1xuY29uc3QgcHVyc2U9cHVyc2VLZXl3b3JkUmVjb3JkW2tleXdvcmRdO1xucHVyc2UhPT11bmRlZmluZWR8fFxuRmFpbCBgcHVyc2Ugd2FzIG5vdCBmb3VuZCBmb3Iga2V5d29yZCAke3Eoa2V5d29yZCl9YDtcblxuY29uc3QgcGF5bWVudD1hd2FpdCBFKHB1cnNlKS53aXRoZHJhdyhhbW91bnQpO1xucGF5bWVudFRvUHVyc2Uuc2V0KHBheW1lbnQscHVyc2UpO1xucmV0dXJuW2tleXdvcmQscGF5bWVudF07XG4gfSk7XG5cblxuLy9cbi8vXG5jb25zdCB0cnlSZWNsYWltaW5nV2l0aGRyYXduUGF5bWVudHM9KCk9PlxuLy9cbi8vXG5Qcm9taXNlLmFsbFNldHRsZWQoXG5rZXl3b3JkUGF5bWVudFBzLm1hcChhc3luYyhrZXl3b3JkUGF5bWVudFApPT57XG4vL1xuLy9cbmNvbnN0W19rZXl3b3JkLHBheW1lbnRdPWF3YWl0IGtleXdvcmRQYXltZW50UDtcblxuLy9cbmNvbnN0IHB1cnNlPXBheW1lbnRUb1B1cnNlLmdldChwYXltZW50KTtcbmlmKHB1cnNlPT09dW5kZWZpbmVkKXtcbi8vXG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cblxuLy9cbnRyeXtcbnJldHVybiBhZGRQYXltZW50KHBheW1lbnQscHVyc2UpO1xuIH1maW5hbGx5e1xuLy9cbnBheW1lbnRUb1B1cnNlLmRlbGV0ZShwYXltZW50KTtcbiB9XG4gfSkpO1xuXG5cbi8vXG4vL1xuY29uc3Qgd2l0aGRyYXdBbGxQYXltZW50cz1Qcm9taXNlLmFsbChrZXl3b3JkUGF5bWVudFBzKTtcbndpdGhkcmF3QWxsUGF5bWVudHMuY2F0Y2godHJ5UmVjbGFpbWluZ1dpdGhkcmF3blBheW1lbnRzKTtcblxuLy9cbi8vXG4vL1xuXG4vL1xuLy9cbi8vXG5jb25zdCBwYXltZW50S2V5d29yZHM9YXdhaXQgd2l0aGRyYXdBbGxQYXltZW50cztcblxuY29uc3QgcGF5bWVudEtleXdvcmRSZWNvcmQ9aGFyZGVuKE9iamVjdC5mcm9tRW50cmllcyhwYXltZW50S2V5d29yZHMpKTtcblxuY29uc3Qgc2VhdD1FKHpvZSkub2ZmZXIoXG5pbnZpdGVQLFxuaGFyZGVuKHByb3Bvc2FsKSxcbnBheW1lbnRLZXl3b3JkUmVjb3JkLFxuYXJncyk7XG5cbi8vXG4vL1xudm9pZCBzZWF0LmZpbmFsbHkodHJ5UmVjbGFpbWluZ1dpdGhkcmF3blBheW1lbnRzKTtcblxuLy9cbi8vXG5jb25zdCBkZXBvc2l0ZWRQPUUoc2VhdCkuXG5nZXRQYXlvdXRzKCkuXG50aGVuKChwYXlvdXRPYmopPT57XG5yZXR1cm4gUHJvbWlzZS5hbGwoXG5PYmplY3QuZW50cmllcyhwYXlvdXRPYmopLm1hcCgoW2tleXdvcmQscGF5b3V0UF0pPT57XG4vL1xuLy9cbmNvbnN0IHB1cnNlT3JVbmRlZmluZWQ9cHVyc2VLZXl3b3JkUmVjb3JkW2tleXdvcmRdO1xuXG5yZXR1cm4gYWRkUGF5bWVudChwYXlvdXRQLHB1cnNlT3JVbmRlZmluZWQpO1xuIH0pKTtcblxuIH0pO1xuXG4vL1xuLy9cbi8vXG52b2lkIGRlcG9zaXRlZFAuZmluYWxseSh0cnlSZWNsYWltaW5nV2l0aGRyYXduUGF5bWVudHMpO1xuXG4vL1xuLy9cbnJldHVybntkZXBvc2l0ZWRQLHNlYXR9O1xuIH1cblxuLy9cblxuY29uc3QgYWRkSXNzdWVyPWFzeW5jKHBldG5hbWVGb3JCcmFuZCxpc3N1ZXJQLG1ha2VQdXJzZT1mYWxzZSk9PntcbmNvbnN0IGlzc3Vlcj1hd2FpdCBpc3N1ZXJQO1xuY29uc3QgcmVjUD1icmFuZFRhYmxlLmhhc0J5SXNzdWVyKGlzc3Vlcik/XG5icmFuZFRhYmxlLmdldEJ5SXNzdWVyKGlzc3Vlcik6XG5icmFuZFRhYmxlLmluaXRJc3N1ZXIoaXNzdWVyLGFkZE1ldGEpO1xuY29uc3R7YnJhbmR9PWF3YWl0IHJlY1A7XG5hd2FpdCBpbml0SXNzdWVyVG9Cb2FyZElkKGlzc3VlcixicmFuZCk7XG5jb25zdCBhZGRCcmFuZFBldG5hbWU9KCk9PntcbmxldCBwO1xuY29uc3QgYWxyZWFkeT1icmFuZE1hcHBpbmcudmFsVG9QZXRuYW1lLmhhcyhicmFuZCk7XG5wZXRuYW1lRm9yQnJhbmQ9YnJhbmRNYXBwaW5nLnN1Z2dlc3RQZXRuYW1lKHBldG5hbWVGb3JCcmFuZCxicmFuZCk7XG5pZighYWxyZWFkeSYmbWFrZVB1cnNlKXtcbnA9bWFrZUVtcHR5UHVyc2UocGV0bmFtZUZvckJyYW5kLHBldG5hbWVGb3JCcmFuZCx0cnVlKTtcbiB9ZWxzZXtcbnA9UHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gfVxucmV0dXJuIEUud2hlbihwLChfKT0+cGV0bmFtZUZvckJyYW5kKTtcbiB9O1xucmV0dXJuIGFkZEJyYW5kUGV0bmFtZSgpLnRoZW4oYXN5bmMoYnJhbmROYW1lKT0+e1xuYXdhaXQgdXBkYXRlQWxsSXNzdWVyc1N0YXRlKCk7XG5yZXR1cm4gYnJhbmROYW1lO1xuIH0pO1xuIH07XG5cbmNvbnN0IHB1Ymxpc2hJc3N1ZXI9YXN5bmMoYnJhbmQpPT57XG5jb25zdHtpc3N1ZXJ9PWJyYW5kVGFibGUuZ2V0QnlCcmFuZChicmFuZCk7XG5jb25zdCBpc3N1ZXJCb2FyZElkPWF3YWl0IGluaXRJc3N1ZXJUb0JvYXJkSWQoaXNzdWVyLGJyYW5kKTtcbnVwZGF0ZUFsbElzc3VlcnNTdGF0ZSgpO1xucmV0dXJuIGlzc3VlckJvYXJkSWQ7XG4gfTtcblxuY29uc3R7dXBkYXRlcjpjb250YWN0c1VwZGF0ZXIsbm90aWZpZXI6Y29udGFjdHNOb3RpZmllcn09XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xubWFrZU5vdGlmaWVyS2l0KFtdKTtcblxuXG4vKlxuXG5cblxuICAgKi9cbmNvbnN0IGFkZENvbnRhY3Q9YXN5bmMocGV0bmFtZSxhY3Rpb25zLGFkZHJlc3M9dW5kZWZpbmVkKT0+e1xuLy9cbmNvbnN0IGFscmVhZHk9YXdhaXQgRShib2FyZCkuaGFzKGFjdGlvbnMpO1xuLyogICAgICAgICAgICAgICovXG5sZXQgZGVwb3NpdEZhY2V0O1xuaWYoYWxyZWFkeSl7XG5kZXBvc2l0RmFjZXQ9YWN0aW9ucztcbiB9ZWxzZXtcbmRlcG9zaXRGYWNldD1GYXIoV2FsbGV0TmFtZS5kZXBvc2l0RmFjZXQse1xucmVjZWl2ZShwYXltZW50UCl7XG5yZXR1cm4gRShhY3Rpb25zKS5yZWNlaXZlKHBheW1lbnRQKTtcbiB9fSk7XG5cbiB9XG5jb25zdCBkZXBvc2l0Qm9hcmRJZD1hd2FpdCBFKGJvYXJkKS5nZXRJZChkZXBvc2l0RmFjZXQpO1xuY29uc3QgZm91bmQ9Wy4uLmNvbnRhY3RNYXBwaW5nLnBldG5hbWVUb1ZhbC5lbnRyaWVzKCldLmZpbmQoXG4oW19wbix7ZGVwb3NpdEJvYXJkSWQ6ZGJpZH1dKT0+ZGVwb3NpdEJvYXJkSWQ9PT1kYmlkKTtcblxuIWZvdW5kfHxcbkZhaWwgYCR7cShmb3VuZCYmZm91bmRbMF0pfSBpcyBhbHJlYWR5IHRoZSBwZXRuYW1lIGZvciBib2FyZCBJRCAke3EoXG5kZXBvc2l0Qm9hcmRJZClcbiB9YDtcblxuY29uc3QgY29udGFjdD1oYXJkZW4oXG5hZGRNZXRhKHtcbmFjdGlvbnMsXG5hZGRyZXNzLFxuZGVwb3NpdEJvYXJkSWR9KSk7XG5cblxuXG5jb250YWN0TWFwcGluZy5zdWdnZXN0UGV0bmFtZShwZXRuYW1lLGNvbnRhY3QpO1xuY29udGFjdHNVcGRhdGVyLnVwZGF0ZVN0YXRlKFsuLi5jb250YWN0TWFwcGluZy5wZXRuYW1lVG9WYWwuZW50cmllcygpXSk7XG5yZXR1cm4gY29udGFjdDtcbiB9O1xuXG5jb25zdCBhZGRJbnN0YW5jZT0ocGV0bmFtZSxpbnN0YW5jZUhhbmRsZSk9Pntcbi8vXG4vL1xuLy9cbnBldG5hbWU9aW5zdGFuY2VNYXBwaW5nLnN1Z2dlc3RQZXRuYW1lKHBldG5hbWUsaW5zdGFuY2VIYW5kbGUpO1xuLy9cbnZvaWQgdXBkYXRlQWxsU3RhdGUoKTtcbnJldHVybiBgaW5zdGFuY2UgJHtxKHBldG5hbWUpfSBzdWNjZXNzZnVsbHkgYWRkZWQgdG8gd2FsbGV0YDtcbiB9O1xuXG4vKlxuXG5cblxuXG5cblxuXG4gICAqL1xuY29uc3QgaW50ZXJuYWxVbnNhZmVJbXBvcnRQdXJzZT1hc3luYyhcbmJyYW5kUGV0bmFtZSxcbnBldG5hbWVGb3JQdXJzZSxcbmRlZmF1bHRBdXRvRGVwb3NpdCxcbnB1cnNlVG9JbXBvcnQpPT5cbntcbmNvbnN0IGJyYW5kPWJyYW5kTWFwcGluZy5wZXRuYW1lVG9WYWwuZ2V0KGJyYW5kUGV0bmFtZSk7XG5jb25zdHtpc3N1ZXJ9PWJyYW5kVGFibGUuZ2V0QnlCcmFuZChicmFuZCk7XG5cbi8qICAgICAgICAgICAgICAgICovXG5jb25zdCBwdXJzZT1hd2FpdChwdXJzZVRvSW1wb3J0fHxFKGlzc3VlcikubWFrZUVtcHR5UHVyc2UoKSk7XG5cbnB1cnNlVG9CcmFuZC5pbml0KHB1cnNlLGJyYW5kKTtcbnBldG5hbWVGb3JQdXJzZT1wdXJzZU1hcHBpbmcuc3VnZ2VzdFBldG5hbWUocGV0bmFtZUZvclB1cnNlLHB1cnNlKTtcblxuaWYoZGVmYXVsdEF1dG9EZXBvc2l0JiYhYnJhbmRUb0F1dG9EZXBvc2l0UHVyc2UuaGFzKGJyYW5kKSl7XG4vL1xuLy9cbmF3YWl0IGRvRW5hYmxlQXV0b0RlcG9zaXQocGV0bmFtZUZvclB1cnNlLGZhbHNlKTtcbiB9XG5cbmF3YWl0IHVwZGF0ZVB1cnNlc1N0YXRlKHBldG5hbWVGb3JQdXJzZSxwdXJzZSk7XG5cbi8vXG52b2lkIG9ic2VydmVOb3RpZmllcihFKHB1cnNlKS5nZXRDdXJyZW50QW1vdW50Tm90aWZpZXIoKSx7XG51cGRhdGVTdGF0ZShfYmFsYW5jZSl7XG51cGRhdGVQdXJzZXNTdGF0ZShwdXJzZU1hcHBpbmcudmFsVG9QZXRuYW1lLmdldChwdXJzZSkscHVyc2UpLmNhdGNoKFxuKGUpPT5jb25zb2xlLmVycm9yKCdjYW5ub3QgdXBkYXRlU3RhdGUnLGUpKTtcblxuIH0sXG5mYWlsKHJlYXNvbil7XG5jb25zb2xlLmVycm9yKCBgZmFpbGVkIHVwZGF0ZVN0YXRlIG9ic2VydmVyYCxyZWFzb24pO1xuIH19KTtcblxuXG5yZXR1cm4gcGV0bmFtZUZvclB1cnNlO1xuIH07XG5cbi8vXG4vKlxuXG5cblxuICAgKi9cbmNvbnN0IG1ha2VFbXB0eVB1cnNlPShcbmJyYW5kUGV0bmFtZSxcbnBldG5hbWVGb3JQdXJzZSxcbmRlZmF1bHRBdXRvRGVwb3NpdD10cnVlKT0+XG5cbmludGVybmFsVW5zYWZlSW1wb3J0UHVyc2UoXG5icmFuZFBldG5hbWUsXG5wZXRuYW1lRm9yUHVyc2UsXG5kZWZhdWx0QXV0b0RlcG9zaXQsXG51bmRlZmluZWQpO1xuXG5cbi8qXG5cblxuICAgKi9cbmFzeW5jIGZ1bmN0aW9uIGRlcG9zaXQocHVyc2VQZXRuYW1lLHBheW1lbnQpe1xuY29uc3QgcHVyc2U9cHVyc2VNYXBwaW5nLnBldG5hbWVUb1ZhbC5nZXQocHVyc2VQZXRuYW1lKTtcbnJldHVybiBFKHB1cnNlKS5kZXBvc2l0KHBheW1lbnQpO1xuIH1cblxuZnVuY3Rpb24gZ2V0UHVyc2VzKCl7XG5yZXR1cm5bLi4ucHVyc2VNYXBwaW5nLnBldG5hbWVUb1ZhbC5lbnRyaWVzKCldO1xuIH1cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5mdW5jdGlvbiBnZXRQdXJzZShwdXJzZVBldG5hbWUpe1xucmV0dXJuIHB1cnNlTWFwcGluZy5wZXRuYW1lVG9WYWwuZ2V0KHB1cnNlUGV0bmFtZSk7XG4gfVxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmZ1bmN0aW9uIGdldFB1cnNlSXNzdWVyKHB1cnNlUGV0bmFtZSl7XG5jb25zdCBwdXJzZT1wdXJzZU1hcHBpbmcucGV0bmFtZVRvVmFsLmdldChwdXJzZVBldG5hbWUpO1xuY29uc3QgYnJhbmQ9cHVyc2VUb0JyYW5kLmdldChwdXJzZSk7XG5jb25zdHtpc3N1ZXJ9PWJyYW5kVGFibGUuZ2V0QnlCcmFuZChicmFuZCk7XG5yZXR1cm4gaXNzdWVyO1xuIH1cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmZ1bmN0aW9uIGdldE9mZmVycyh7b3JpZ2luPW51bGx9PXt9KXtcbi8vXG5yZXR1cm5bLi4uaWRUb09mZmVyLmVudHJpZXMoKV0uXG5maWx0ZXIoXG4oW19pZCxvZmZlcl0pPT5cbm9yaWdpbj09PW51bGx8fFxub2ZmZXIucmVxdWVzdENvbnRleHQmJm9mZmVyLnJlcXVlc3RDb250ZXh0LmRhcHBPcmlnaW49PT1vcmlnaW4pLlxuXG5zb3J0KChbaWQxXSxbaWQyXSk9PmNtcChpZDEsaWQyKSkuXG5tYXAoKFtfaWQsb2ZmZXJdKT0+aGFyZGVuKG9mZmVyKSk7XG4gfVxuXG5jb25zdCBjb21waWxlUHJvcG9zYWw9KHByb3Bvc2FsVGVtcGxhdGUpPT57XG5jb25zdHtcbndhbnQ9aGFyZGVuKHt9KSxcbmdpdmU9aGFyZGVuKHt9KSxcbmV4aXQ9e29uRGVtYW5kOm51bGx9LFxuYXJndW1lbnRzOmFyZ3N9PVxucHJvcG9zYWxUZW1wbGF0ZTtcblxuY29uc3QgcHVyc2VLZXl3b3JkUmVjb3JkPXt9O1xuXG5jb25zdCBjb21waWxlPShhbW91bnRLZXl3b3JkUmVjb3JkKT0+e1xucmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbk9iamVjdC5lbnRyaWVzKGFtb3VudEtleXdvcmRSZWNvcmQpLm1hcChcbihba2V5d29yZCx7cHVyc2VQZXRuYW1lLHZhbHVlfV0pPT57XG4vL1xuaWYodHlwZW9mIHZhbHVlPT09J251bWJlcicpe1xudmFsdWU9TmF0KHZhbHVlKTtcbiB9XG5jb25zdCBwdXJzZT1nZXRQdXJzZShwdXJzZVBldG5hbWUpO1xucHVyc2VLZXl3b3JkUmVjb3JkW2tleXdvcmRdPXB1cnNlO1xuY29uc3QgYnJhbmQ9cHVyc2VUb0JyYW5kLmdldChwdXJzZSk7XG5cbnJldHVybltrZXl3b3JkLHticmFuZCx2YWx1ZX1dO1xuIH0pKTtcblxuXG4gfTtcblxuY29uc3QgcHJvcG9zYWw9e1xud2FudDpjb21waWxlKHdhbnQpLFxuZ2l2ZTpjb21waWxlKGdpdmUpLFxuZXhpdH07XG5cblxucmV0dXJue3Byb3Bvc2FsLGFyZ3VtZW50czphcmdzLHB1cnNlS2V5d29yZFJlY29yZH07XG4gfTtcblxuY29uc3QgY29tcGlsZU9mZmVyPWFzeW5jKG9mZmVyKT0+e1xuY29uc3R7XG5wcm9wb3NhbCxcbnB1cnNlS2V5d29yZFJlY29yZCxcbmFyZ3VtZW50czphcmdzfT1cbmNvbXBpbGVQcm9wb3NhbChvZmZlci5wcm9wb3NhbFRlbXBsYXRlKTtcblxuY29uc3Qgem9lSXNzdWVyPWlzc3Vlck1hbmFnZXIuZ2V0KFpPRV9JTlZJVEVfQlJBTkRfUEVUTkFNRSk7XG5jb25zdHticmFuZDppbnZpdGF0aW9uQnJhbmR9PWJyYW5kVGFibGUuZ2V0QnlJc3N1ZXIoem9lSXNzdWVyKTtcbmNvbnN0IGludml0YXRpb25QPWZpbmRPck1ha2VJbnZpdGF0aW9uKFxuaWRUb09mZmVyUmVzdWx0UHJvbWlzZUtpdCxcbmJvYXJkLFxuem9lLFxuem9lSW52aXRlUHVyc2UsXG5pbnZpdGF0aW9uQnJhbmQsXG5vZmZlcik7XG5cblxuY29uc3QgaW52aXRhdGlvbkRldGFpbHM9YXdhaXQgRSh6b2UpLmdldEludml0YXRpb25EZXRhaWxzKGludml0YXRpb25QKTtcbmNvbnN0e2luc3RhbGxhdGlvbixpbnN0YW5jZX09aW52aXRhdGlvbkRldGFpbHM7XG5cbmNvbnN0IGNvbXBpbGVkPXtcbmFyZ3VtZW50czphcmdzLFxucHJvcG9zYWwsXG5pbnZpdGVQOmludml0YXRpb25QLFxucHVyc2VLZXl3b3JkUmVjb3JkLFxuaW52aXRhdGlvbkRldGFpbHMsXG5pbnN0YWxsYXRpb24sXG5pbnN0YW5jZX07XG5cbnJldHVybiBjb21waWxlZDtcbiB9O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBkYXBwT3JpZ2lucz1tYWtlU2NhbGFyTWFwU3RvcmUoJ2RhcHBPcmlnaW4nKTtcbmNvbnN0e25vdGlmaWVyOmRhcHBzTm90aWZpZXIsdXBkYXRlcjpkYXBwc1VwZGF0ZXJ9PVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL21ha2VOb3RpZmllcktpdChbXSk7XG5cbmNvbnN0IHVwZGF0ZURhcHA9KGRhcHBSZWNvcmQpPT57XG5oYXJkZW4oYWRkTWV0YShkYXBwUmVjb3JkKSk7XG5kYXBwT3JpZ2lucy5zZXQoZGFwcFJlY29yZC5vcmlnaW4sZGFwcFJlY29yZCk7XG5kYXBwc1VwZGF0ZXIudXBkYXRlU3RhdGUoWy4uLmRhcHBPcmlnaW5zLnZhbHVlcygpXSk7XG4gfTtcblxuY29uc3QgZGVsZXRlRGFwcD0oe29yaWdpbn0pPT57XG5kYXBwT3JpZ2lucy5kZWxldGUob3JpZ2luKTtcbmRhcHBzVXBkYXRlci51cGRhdGVTdGF0ZShbLi4uZGFwcE9yaWdpbnMudmFsdWVzKCldKTtcbiB9O1xuXG5jb25zdCBzaGFyZWRDYWNoZUNvb3JkaW5hdG9yPW1ha2VTY2FsYXJTdG9yZUNvb3JkaW5hdG9yKFxubWFrZVNjYWxhckJpZ01hcFN0b3JlKCBgc2hhcmVkIGNhY2hlYCkpO1xuXG5cbmFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JEYXBwQXBwcm92YWwoXG5zdWdnZXN0ZWRQZXRuYW1lLFxub3JpZ2luLFxubm90WWV0RW5hYmxlZD0oKT0+eyB9KVxue1xubGV0IGRhcHBSZWNvcmQ7XG5pZihkYXBwT3JpZ2lucy5oYXMob3JpZ2luKSl7XG5kYXBwUmVjb3JkPWRhcHBPcmlnaW5zLmdldChvcmlnaW4pO1xuIH1lbHNle1xubGV0IHJlc29sdmU7XG5sZXQgcmVqZWN0O1xubGV0IGFwcHJvdmFsUDtcblxuY29uc3QgY2FjaGVDb29yZGluYXRvcj1tYWtlU2NhbGFyU3RvcmVDb29yZGluYXRvcihcbm1ha2VTY2FsYXJCaWdNYXBTdG9yZSggYG9yaWdpbiAke29yaWdpbn0gY2FjaGVgKSk7XG5cbmRhcHBSZWNvcmQ9YWRkTWV0YSh7XG5zdWdnZXN0ZWRQZXRuYW1lLFxucGV0bmFtZTpzdWdnZXN0ZWRQZXRuYW1lLFxub3JpZ2luLFxuY2FjaGVDb29yZGluYXRvcixcbmFwcHJvdmFsUCxcbmVuYWJsZTpmYWxzZSxcbmFjdGlvbnM6RmFyKCdkYXBwLmFjdGlvbnMnLHtcbnNldFBldG5hbWUocGV0bmFtZSl7XG5pZihkYXBwUmVjb3JkLnBldG5hbWU9PT1wZXRuYW1lKXtcbnJldHVybiBkYXBwUmVjb3JkLmFjdGlvbnM7XG4gfVxuaWYoZWRnZU1hcHBpbmcudmFsVG9QZXRuYW1lLmhhcyhvcmlnaW4pKXtcbmVkZ2VNYXBwaW5nLnJlbmFtZVBldG5hbWUocGV0bmFtZSxvcmlnaW4pO1xuIH1lbHNle1xucGV0bmFtZT1lZGdlTWFwcGluZy5zdWdnZXN0UGV0bmFtZShwZXRuYW1lLG9yaWdpbik7XG4gfVxuZGFwcFJlY29yZD1hZGRNZXRhKHtcbi4uLmRhcHBSZWNvcmQsXG5wZXRuYW1lfSk7XG5cbnVwZGF0ZURhcHAoZGFwcFJlY29yZCk7XG52b2lkIHVwZGF0ZUFsbFN0YXRlKCk7XG5yZXR1cm4gZGFwcFJlY29yZC5hY3Rpb25zO1xuIH0sXG5lbmFibGUoKXtcbi8vXG5kYXBwUmVjb3JkPWFkZE1ldGEoe1xuLi4uZGFwcFJlY29yZCxcbmVuYWJsZTp0cnVlfSk7XG5cbmVkZ2VNYXBwaW5nLnN1Z2dlc3RQZXRuYW1lKGRhcHBSZWNvcmQucGV0bmFtZSxvcmlnaW4pO1xudXBkYXRlRGFwcChkYXBwUmVjb3JkKTtcblxuLy9cbnJlc29sdmUoKTtcbnJldHVybiBkYXBwUmVjb3JkLmFjdGlvbnM7XG4gfSxcbmRpc2FibGUocmVhc29uPXVuZGVmaW5lZCl7XG4vL1xuaWYocmVqZWN0KXtcbnJlamVjdChyZWFzb24pO1xuIH1cbi8vXG4oe3Jlc29sdmUscmVqZWN0LHByb21pc2U6YXBwcm92YWxQfT1tYWtlUHJvbWlzZUtpdCgpKTtcbmRhcHBSZWNvcmQ9YWRkTWV0YSh7XG4uLi5kYXBwUmVjb3JkLFxuZW5hYmxlOmZhbHNlLFxuYXBwcm92YWxQfSk7XG5cbnVwZGF0ZURhcHAoZGFwcFJlY29yZCk7XG5yZXR1cm4gZGFwcFJlY29yZC5hY3Rpb25zO1xuIH0sXG5kZWxldGUoKXtcbmlmKHJlamVjdCl7XG5yZWplY3QoJ0RhcHAgZGVsZXRlZCcpO1xuIH1cbmRlbGV0ZURhcHAoZGFwcFJlY29yZCk7XG4gfX0pfSk7XG5cblxuXG4vL1xuZGFwcE9yaWdpbnMuaW5pdChvcmlnaW4sZGFwcFJlY29yZCk7XG5cbi8vXG5kYXBwUmVjb3JkLmFjdGlvbnMuZGlzYWJsZSgpO1xuIH1cblxuaWYoIWRhcHBSZWNvcmQuZW5hYmxlKXtcbm5vdFlldEVuYWJsZWQoKTtcbiB9XG5hd2FpdCBkYXBwUmVjb3JkLmFwcHJvdmFsUDtcbi8vXG4vL1xucmV0dXJuIGRhcHBPcmlnaW5zLmdldChvcmlnaW4pO1xuIH1cblxuYXN5bmMgZnVuY3Rpb24gYWRkT2ZmZXIocmF3T2ZmZXIscmVxdWVzdENvbnRleHQ9e30pe1xuY29uc3QgZGFwcE9yaWdpbj1cbnJlcXVlc3RDb250ZXh0LmRhcHBPcmlnaW58fHJlcXVlc3RDb250ZXh0Lm9yaWdpbnx8J3Vua25vd24nO1xuY29uc3R7aWQ6cmF3SWR9PXJhd09mZmVyO1xuY29uc3QgaWQ9bWFrZUlkKGRhcHBPcmlnaW4scmF3SWQpO1xuY29uc3Qgb2ZmZXI9aGFyZGVuKFxuYWRkTWV0YSh7XG4uLi5yYXdPZmZlcixcbnJhd0lkLFxuaWQsXG5yZXF1ZXN0Q29udGV4dDp7Li4ucmVxdWVzdENvbnRleHQsZGFwcE9yaWdpbn0sXG5zdGF0dXM6dW5kZWZpbmVkfSkpO1xuXG5cbmlkVG9PZmZlci5pbml0KGlkLG9mZmVyKTtcbmlkVG9PZmZlclJlc3VsdFByb21pc2VLaXQuaW5pdChpZCxtYWtlUHJvbWlzZUtpdCgpKTtcbmF3YWl0IHVwZGF0ZUluYm94U3RhdGUoaWQsb2ZmZXIpO1xuXG4vL1xuY29uc3QgY29tcGlsZWRPZmZlclA9Y29tcGlsZU9mZmVyKG9mZmVyKTtcbmlkVG9Db21waWxlZE9mZmVyUC5zZXQoaWQsY29tcGlsZWRPZmZlclApO1xuXG4vL1xuYXdhaXQgdXBkYXRlSW5ib3hTdGF0ZShpZCxpZFRvT2ZmZXIuZ2V0KGlkKSk7XG5jb25zdHtpbnN0YWxsYXRpb24saW5zdGFuY2UsaW52aXRhdGlvbkRldGFpbHN9PWF3YWl0IGNvbXBpbGVkT2ZmZXJQO1xuXG5pZighaWRUb09mZmVyLmhhcyhpZCkpe1xucmV0dXJuIHJhd0lkO1xuIH1cbmlkVG9PZmZlci5zZXQoXG5pZCxcbmhhcmRlbihcbmFkZE1ldGEoe1xuLi4uaWRUb09mZmVyLmdldChpZCksXG5pbnN0YWxsYXRpb24sXG5pbnN0YW5jZSxcbmludml0YXRpb25EZXRhaWxzfSkpKTtcblxuXG5cbmF3YWl0IHVwZGF0ZUluYm94U3RhdGUoaWQsaWRUb09mZmVyLmdldChpZCkpO1xucmV0dXJuIHJhd0lkO1xuIH1cblxuZnVuY3Rpb24gY29uc3VtbWF0ZWQob2ZmZXIpe1xuaWYob2ZmZXIuc3RhdHVzIT09dW5kZWZpbmVkKXtcbnJldHVybiB0cnVlO1xuIH1cbmlmKG9mZmVyLmFjdGlvbnMpe1xuRShvZmZlci5hY3Rpb25zKS5oYW5kbGVkKG9mZmVyKTtcbiB9XG5yZXR1cm4gZmFsc2U7XG4gfVxuXG5hc3luYyBmdW5jdGlvbiBkZWNsaW5lT2ZmZXIoaWQpe1xuY29uc3Qgb2ZmZXI9aWRUb09mZmVyLmdldChpZCk7XG5pZihjb25zdW1tYXRlZChvZmZlcikpe1xucmV0dXJuO1xuIH1cblxuLy9cbmNvbnN0IGRlY2xpbmVkT2ZmZXI9YWRkTWV0YSh7XG4uLi5vZmZlcixcbnN0YXR1czonZGVjbGluZSd9KTtcblxuaWRUb09mZmVyLnNldChpZCxkZWNsaW5lZE9mZmVyKTtcbnZvaWQgdXBkYXRlSW5ib3hTdGF0ZShpZCxkZWNsaW5lZE9mZmVyKTtcblxuLy9cbmNvbnN0IGNvbXBpbGVkT2ZmZXJQPWlkVG9Db21waWxlZE9mZmVyUC5nZXQoaWQpO1xuaWYoIWNvbXBpbGVkT2ZmZXJQKXtcbnJldHVybjtcbiB9XG5cbmF3YWl0IGFkZFBheW1lbnQoRS5nZXQoY29tcGlsZWRPZmZlclApLmludml0ZVApLmNhdGNoKGNvbnNvbGUuZXJyb3IpO1xuIH1cblxuYXN5bmMgZnVuY3Rpb24gY2FuY2VsT2ZmZXIoaWQpe1xuY29uc3QgY29tcGxldGVGbj1pZFRvQ29tcGxldGUuZ2V0KGlkKTtcbmlmKCFjb21wbGV0ZUZuKXtcbnJldHVybiBmYWxzZTtcbiB9XG5cbmNvbXBsZXRlRm4oKS5cbnRoZW4oKF8pPT57XG5pZFRvQ29tcGxldGUuZGVsZXRlKGlkKTtcbmNvbnN0IG9mZmVyPWlkVG9PZmZlci5nZXQoaWQpO1xuY29uc3QgY2FuY2VsbGVkT2ZmZXI9YWRkTWV0YSh7XG4uLi5vZmZlcixcbnN0YXR1czonY2FuY2VsJ30pO1xuXG5pZFRvT2ZmZXIuc2V0KGlkLGNhbmNlbGxlZE9mZmVyKTtcbnJldHVybiB1cGRhdGVJbmJveFN0YXRlKGlkLGNhbmNlbGxlZE9mZmVyKTtcbiB9KS5cbmNhdGNoKChlKT0+Y29uc29sZS5lcnJvciggYENhbm5vdCBjYW5jZWwgb2ZmZXIgJHtpZH06YCxlKSk7XG5cbnJldHVybiB0cnVlO1xuIH1cblxuYXN5bmMgZnVuY3Rpb24gYWNjZXB0T2ZmZXIoaWQpe1xuY29uc3Qgb2ZmZXI9aWRUb09mZmVyLmdldChpZCk7XG5pZihjb25zdW1tYXRlZChvZmZlcikpe1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5sZXQgcmV0PXt9O1xubGV0IGFscmVhZHlSZXNvbHZlZD1mYWxzZTtcbmNvbnN0IHJlamVjdGVkPShlKT0+e1xuaWYoYWxyZWFkeVJlc29sdmVkKXtcbnJldHVybjtcbiB9XG5jb25zdCByZWplY3RPZmZlcj1hZGRNZXRhKHtcbi4uLm9mZmVyLFxuc3RhdHVzOidyZWplY3RlZCcsXG5lcnJvcjogYCR7ZX1gfSk7XG5cbmlkVG9PZmZlci5zZXQoaWQscmVqZWN0T2ZmZXIpO1xudm9pZCB1cGRhdGVJbmJveFN0YXRlKGlkLHJlamVjdE9mZmVyKTtcbiB9O1xuXG5hd2FpdCBudWxsO1xudHJ5e1xuY29uc3QgcGVuZGluZ09mZmVyPWFkZE1ldGEoe1xuLi4ub2ZmZXIsXG5zdGF0dXM6J3BlbmRpbmcnfSk7XG5cbmlkVG9PZmZlci5zZXQoaWQscGVuZGluZ09mZmVyKTtcbnZvaWQgdXBkYXRlSW5ib3hTdGF0ZShpZCxwZW5kaW5nT2ZmZXIpO1xuY29uc3QgY29tcGlsZWRPZmZlcj1hd2FpdCBpZFRvQ29tcGlsZWRPZmZlclAuZ2V0KGlkKTtcblxuY29uc3R7ZGVwb3NpdGVkUCxzZWF0fT1hd2FpdCBleGVjdXRlT2ZmZXIoY29tcGlsZWRPZmZlcik7XG5cbmlkVG9Db21wbGV0ZS5zZXQoaWQsKCk9PntcbmFscmVhZHlSZXNvbHZlZD10cnVlO1xucmV0dXJuIEUoc2VhdCkudHJ5RXhpdCgpO1xuIH0pO1xuaWRUb1NlYXQuc2V0KGlkLHNlYXQpO1xuLy9cbi8vXG52b2lkIEUoc2VhdCkuXG5oYXNFeGl0ZWQoKS5cbnRoZW4oKGV4aXRlZCk9PntcbmlmKCFleGl0ZWQpe1xucmV0dXJuIHN1YnNjcmliZVRvVXBkYXRlcyhpZCxzZWF0KTtcbiB9XG4gfSk7XG5cbmNvbnN0IG9mZmVyUmVzdWx0UD1FKHNlYXQpLmdldE9mZmVyUmVzdWx0KCk7XG5pZFRvT2ZmZXJSZXN1bHRQcm9taXNlS2l0LmdldChpZCkucmVzb2x2ZShvZmZlclJlc3VsdFApO1xuXG5yZXQ9e1xuZGVwb3NpdGVkUCxcbmRhcHBDb250ZXh0Om9mZmVyLmRhcHBDb250ZXh0fTtcblxuXG4vL1xuZGVwb3NpdGVkUC5cbnRoZW4oKF8pPT57XG4vL1xuaWYoIWFscmVhZHlSZXNvbHZlZCl7XG5hbHJlYWR5UmVzb2x2ZWQ9dHJ1ZTtcbmNvbnN0IGFjY2VwdGVkT2ZmZXI9YWRkTWV0YSh7XG4uLi5wZW5kaW5nT2ZmZXIsXG5zdGF0dXM6J2FjY2VwdCd9KTtcblxuaWRUb09mZmVyLnNldChpZCxhY2NlcHRlZE9mZmVyKTtcbnZvaWQgdXBkYXRlSW5ib3hTdGF0ZShpZCxhY2NlcHRlZE9mZmVyKTtcbiB9XG4gfSkuXG5jYXRjaChyZWplY3RlZCk7XG4gfWNhdGNoKGUpe1xuaWYob2ZmZXIuYWN0aW9ucyl7XG5FKG9mZmVyLmFjdGlvbnMpLmVycm9yKG9mZmVyLGUpO1xuIH1cbnJlamVjdGVkKGUpO1xudGhyb3cgZTtcbiB9XG5yZXR1cm4gcmV0O1xuIH1cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgaWRUb1BheW1lbnRSZWNvcmQ9bWFrZVNjYWxhck1hcFN0b3JlKCdwYXltZW50SWQnKTtcbmNvbnN0e3VwZGF0ZXI6cGF5bWVudHNVcGRhdGVyLG5vdGlmaWVyOnBheW1lbnRzTm90aWZpZXJ9PVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL21ha2VOb3RpZmllcktpdChbXSk7XG4vKlxuXG4gICAqL1xuY29uc3QgdXBkYXRlUGF5bWVudFJlY29yZD0oe2FjdGlvbnMsLi4ucHJlRGlzcGxheX0pPT57XG4vL1xuLy9cbmRlbGV0ZSBwcmVEaXNwbGF5LmRpc3BsYXlQYXltZW50O1xuY29uc3QgZGlzcGxheVBheW1lbnQ9ZmlsbEluU2xvdHMoZGVoeWRyYXRlKGhhcmRlbihwcmVEaXNwbGF5KSkpO1xuY29uc3QgcGF5bWVudFJlY29yZD1hZGRNZXRhKHtcbi4uLnByZURpc3BsYXksXG5hY3Rpb25zLFxuZGlzcGxheVBheW1lbnR9KTtcblxuY29uc3R7aWR9PXBheW1lbnRSZWNvcmQubWV0YTtcbmlkVG9QYXltZW50UmVjb3JkLnNldChpZCxoYXJkZW4ocGF5bWVudFJlY29yZCkpO1xucGF5bWVudHNVcGRhdGVyLnVwZGF0ZVN0YXRlKFtwYXltZW50UmVjb3JkXSk7XG4gfTtcblxuY29uc3QgbWFrZVBheW1lbnRBY3Rpb25zRm9ySWQ9KGlkKT0+XG5tYWtlUGF5bWVudEFjdGlvbnMoe1xuZ2V0UmVjb3JkOigpPT5pZFRvUGF5bWVudFJlY29yZC5nZXQoaWQpLFxudXBkYXRlUmVjb3JkOihyZWNvcmQsd2l0aG91dE1ldGE9e30pPT57XG4vL1xuLy9cbnVwZGF0ZVBheW1lbnRSZWNvcmQoey4uLndpdGhvdXRNZXRhLC4uLmFkZE1ldGEocmVjb3JkKX0pO1xuIH0sXG5nZXRCcmFuZFJlY29yZDooYnJhbmQpPT5cbmJyYW5kVGFibGUuaGFzQnlCcmFuZChicmFuZCkmJmJyYW5kVGFibGUuZ2V0QnlCcmFuZChicmFuZCksXG5nZXRQdXJzZUJ5UGV0bmFtZToocGV0bmFtZSk9PnB1cnNlTWFwcGluZy5wZXRuYW1lVG9WYWwuZ2V0KHBldG5hbWUpLFxuZ2V0QXV0b0RlcG9zaXRQdXJzZTooYik9PlxuYnJhbmRUb0F1dG9EZXBvc2l0UHVyc2UuaGFzKGIpP1xuYnJhbmRUb0F1dG9EZXBvc2l0UHVyc2UuZ2V0KGIpOlxudW5kZWZpbmVkLFxuZ2V0SXNzdWVyQm9hcmRJZDppc3N1ZXJUb0JvYXJkSWQuZ2V0fSk7XG5cblxuLypcblxuXG4gICAqL1xuY29uc3QgYWRkUGF5bWVudD1hc3luYyhwYXltZW50UCxkZXBvc2l0VG89dW5kZWZpbmVkKT0+e1xuLy9cbmNvbnN0W3BheW1lbnQsYnJhbmRdPWF3YWl0IFByb21pc2UuYWxsKFtcbnBheW1lbnRQLFxuRShwYXltZW50UCkuZ2V0QWxsZWdlZEJyYW5kKCldKTtcblxuXG5jb25zdCBiYXNlUGF5bWVudFJlY29yZD1hZGRNZXRhKHtcbnBheW1lbnQsXG5icmFuZH0pO1xuXG5jb25zdHtpZH09YmFzZVBheW1lbnRSZWNvcmQubWV0YTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgcGF5bWVudFJlY29yZD17XG4uLi5iYXNlUGF5bWVudFJlY29yZCxcbmFjdGlvbnM6bWFrZVBheW1lbnRBY3Rpb25zRm9ySWQoaWQpfTtcblxuaWRUb1BheW1lbnRSZWNvcmQuaW5pdChpZCxoYXJkZW4ocGF5bWVudFJlY29yZCkpO1xuXG5jb25zdCByZWZyZXNoZWQ9YXdhaXQgcGF5bWVudFJlY29yZC5hY3Rpb25zLnJlZnJlc2goKTtcbmlmKCFyZWZyZXNoZWQpe1xuLy9cbnVwZGF0ZVBheW1lbnRSZWNvcmQocGF5bWVudFJlY29yZCk7XG4gfVxuXG4vL1xuYXdhaXQgcGF5bWVudFJlY29yZC5hY3Rpb25zLmRlcG9zaXQoZGVwb3NpdFRvKTtcbiB9O1xuXG5sZXQgc2VsZkNvbnRhY3RQO1xuYXN5bmMgZnVuY3Rpb24gZ2V0RGVwb3NpdEZhY2V0SWQoX2JyYW5kQm9hcmRJZCl7XG4vL1xucmV0dXJuIEUuZ2V0KHNlbGZDb250YWN0UCkuZGVwb3NpdEJvYXJkSWQ7XG4gfVxuXG5hc3luYyBmdW5jdGlvbiBkaXNhYmxlQXV0b0RlcG9zaXQocHVyc2VQZXRuYW1lKXtcbmNvbnN0IHB1cnNlPXB1cnNlTWFwcGluZy5wZXRuYW1lVG9WYWwuZ2V0KHB1cnNlUGV0bmFtZSk7XG5jb25zdCBicmFuZD1wdXJzZVRvQnJhbmQuZ2V0KHB1cnNlKTtcbmlmKFxuIWJyYW5kVG9BdXRvRGVwb3NpdFB1cnNlLmhhcyhicmFuZCl8fFxuYnJhbmRUb0F1dG9EZXBvc2l0UHVyc2UuZ2V0KGJyYW5kKSE9PXB1cnNlKVxue1xucmV0dXJuO1xuIH1cblxuYnJhbmRUb0F1dG9EZXBvc2l0UHVyc2UuZGVsZXRlKGJyYW5kKTtcbmF3YWl0IHVwZGF0ZUFsbFB1cnNlU3RhdGUoKTtcbiB9XG5cbmNvbnN0IHBlbmRpbmdFbmFibGVBdXRvRGVwb3NpdHM9bWFrZVNjYWxhck1hcFN0b3JlKCdicmFuZCcpO1xuYXN5bmMgZnVuY3Rpb24gZG9FbmFibGVBdXRvRGVwb3NpdChwdXJzZVBldG5hbWUsdXBkYXRlU3RhdGUpe1xuY29uc3QgcHVyc2U9cHVyc2VNYXBwaW5nLnBldG5hbWVUb1ZhbC5nZXQocHVyc2VQZXRuYW1lKTtcbmNvbnN0IGJyYW5kPXB1cnNlVG9CcmFuZC5nZXQocHVyc2UpO1xuaWYoYnJhbmRUb0F1dG9EZXBvc2l0UHVyc2UuaGFzKGJyYW5kKSl7XG5icmFuZFRvQXV0b0RlcG9zaXRQdXJzZS5zZXQoYnJhbmQscHVyc2UpO1xuIH1lbHNle1xuYnJhbmRUb0F1dG9EZXBvc2l0UHVyc2UuaW5pdChicmFuZCxwdXJzZSk7XG4gfVxuXG5hd2FpdCBudWxsO1xuaWYodXBkYXRlU3RhdGUpe1xuYXdhaXQgdXBkYXRlQWxsUHVyc2VTdGF0ZSgpO1xuIH1cblxuY29uc3QgcGVuZGluZ1A9XG5wZW5kaW5nRW5hYmxlQXV0b0RlcG9zaXRzLmhhcyhicmFuZCkmJlxucGVuZGluZ0VuYWJsZUF1dG9EZXBvc2l0cy5nZXQoYnJhbmQpO1xuaWYocGVuZGluZ1Ape1xucmV0dXJuIHBlbmRpbmdQO1xuIH1cblxuY29uc3QgYm9hcmRJZFA9RS5nZXQoc2VsZkNvbnRhY3RQKS5kZXBvc2l0Qm9hcmRJZDtcbnBlbmRpbmdFbmFibGVBdXRvRGVwb3NpdHMuaW5pdChicmFuZCxib2FyZElkUCk7XG5jb25zdCBib2FyZElkPWF3YWl0IGJvYXJkSWRQO1xuYnJhbmRUb0RlcG9zaXRGYWNldElkLmluaXQoYnJhbmQsYm9hcmRJZCk7XG5cbmlmKHVwZGF0ZVN0YXRlKXtcbmF3YWl0IHVwZGF0ZUFsbFB1cnNlU3RhdGUoKTtcbiB9XG5yZXR1cm4gYm9hcmRJZFA7XG4gfVxuXG4vKlxuXG5cblxuXG4gICAqL1xuZnVuY3Rpb24gYWNjZXB0UGV0bmFtZShcbmFjY2VwdEZuLFxuc3VnZ2VzdGVkUGV0bmFtZSxcbmJvYXJkSWQsXG5kYXBwT3JpZ2luPXVuZGVmaW5lZClcbntcbi8qICAgICAgICAgICAgICAgICAgKi9cbmxldCBwZXRuYW1lO1xuaWYoZGFwcE9yaWdpbj09PXVuZGVmaW5lZCl7XG5wZXRuYW1lPXN1Z2dlc3RlZFBldG5hbWU7XG4gfWVsc2V7XG5jb25zdCBlZGdlbmFtZT1lZGdlTWFwcGluZy52YWxUb1BldG5hbWUuZ2V0KGRhcHBPcmlnaW4pO1xuLy9cbnBldG5hbWU9W2VkZ2VuYW1lLHN1Z2dlc3RlZFBldG5hbWVdO1xuIH1cblxucmV0dXJuIEUoYm9hcmQpLlxuZ2V0VmFsdWUoYm9hcmRJZCkuXG50aGVuKCh2YWx1ZSk9PntcbmNvbnRleHQuZW5zdXJlQm9hcmRJZChib2FyZElkLHZhbHVlKTtcbnJldHVybiBhY2NlcHRGbihwZXRuYW1lLHZhbHVlKTtcbiB9KTtcbiB9XG5cbi8qXG5cblxuXG4gICAqL1xuYXN5bmMgZnVuY3Rpb24gc3VnZ2VzdElzc3VlcihcbnN1Z2dlc3RlZFBldG5hbWUsXG5pc3N1ZXJCb2FyZElkLFxuZGFwcE9yaWdpbj11bmRlZmluZWQpXG57XG4vL1xuLy9cbi8vXG5yZXR1cm4gYWNjZXB0UGV0bmFtZShcbi8vXG4ocGV0bmFtZSx2YWx1ZSk9PmFkZElzc3VlcihwZXRuYW1lLHZhbHVlLHRydWUpLFxuc3VnZ2VzdGVkUGV0bmFtZSxcbmlzc3VlckJvYXJkSWQsXG5kYXBwT3JpZ2luKTtcblxuIH1cblxuLypcblxuXG5cbiAgICovXG5hc3luYyBmdW5jdGlvbiBzdWdnZXN0SW5zdGFuY2UoXG5zdWdnZXN0ZWRQZXRuYW1lLFxuaW5zdGFuY2VIYW5kbGVCb2FyZElkLFxuZGFwcE9yaWdpbj11bmRlZmluZWQpXG57XG4vL1xuLy9cbi8vXG5cbnJldHVybiBhY2NlcHRQZXRuYW1lKFxuYWRkSW5zdGFuY2UsXG5zdWdnZXN0ZWRQZXRuYW1lLFxuaW5zdGFuY2VIYW5kbGVCb2FyZElkLFxuZGFwcE9yaWdpbik7XG5cbiB9XG5cbi8qXG5cblxuXG4gICAqL1xuYXN5bmMgZnVuY3Rpb24gc3VnZ2VzdEluc3RhbGxhdGlvbihcbnN1Z2dlc3RlZFBldG5hbWUsXG5pbnN0YWxsYXRpb25IYW5kbGVCb2FyZElkLFxuZGFwcE9yaWdpbj11bmRlZmluZWQpXG57XG4vL1xuLy9cbi8vXG5yZXR1cm4gYWNjZXB0UGV0bmFtZShcbmluc3RhbGxhdGlvbk1hbmFnZXIuYWRkLFxuc3VnZ2VzdGVkUGV0bmFtZSxcbmluc3RhbGxhdGlvbkhhbmRsZUJvYXJkSWQsXG5kYXBwT3JpZ2luKTtcblxuIH1cblxuZnVuY3Rpb24gZ2V0QnJhbmQocGV0bmFtZSl7XG5jb25zdCBicmFuZD1icmFuZE1hcHBpbmcucGV0bmFtZVRvVmFsLmdldChwZXRuYW1lKTtcbnJldHVybiBicmFuZDtcbiB9XG5cbmZ1bmN0aW9uIGdldEJyYW5kUGV0bmFtZXMoYnJhbmRzKXtcbnJldHVybiBicmFuZHMubWFwKGJyYW5kTWFwcGluZy52YWxUb1BldG5hbWUuZ2V0KTtcbiB9XG5cbmZ1bmN0aW9uIGdldFNlbGZDb250YWN0KCl7XG5yZXR1cm4gc2VsZkNvbnRhY3RQO1xuIH1cblxuY29uc3QgbWFrZU1hbmFnZXI9KHBldG5hbWVNYXBwaW5nLG1hbmFnZXJUeXBlKT0+e1xuY29uc3QgbWFuYWdlcj1GYXIobWFuYWdlclR5cGUse1xucmVuYW1lOmFzeW5jKHBldG5hbWUsdGhpbmcpPT57XG5wZXRuYW1lTWFwcGluZy5yZW5hbWVQZXRuYW1lKHBldG5hbWUsdGhpbmcpO1xuYXdhaXQgdXBkYXRlQWxsU3RhdGUoKTtcbiB9LFxuZ2V0OnBldG5hbWVNYXBwaW5nLnBldG5hbWVUb1ZhbC5nZXQsXG5nZXRBbGw6cGV0bmFtZU1hcHBpbmcucGV0bmFtZVRvVmFsLmVudHJpZXMsXG5hZGQ6YXN5bmMocGV0bmFtZSx0aGluZyk9PntcbnBldG5hbWVNYXBwaW5nLnN1Z2dlc3RQZXRuYW1lKHBldG5hbWUsdGhpbmcpO1xuYXdhaXQgdXBkYXRlQWxsU3RhdGUoKTtcbiB9fSk7XG5cbnJldHVybiBtYW5hZ2VyO1xuIH07XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGluc3RhbGxhdGlvbk1hbmFnZXI9bWFrZU1hbmFnZXIoXG5pbnN0YWxsYXRpb25NYXBwaW5nLFxuJ0luc3RhbGxhdGlvbk1hbmFnZXInKTtcblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGluc3RhbmNlTWFuYWdlcj1tYWtlTWFuYWdlcihpbnN0YW5jZU1hcHBpbmcsJ0luc3RhbmNlTWFuYWdlcicpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBpc3N1ZXJNYW5hZ2VyPUZhcignSXNzdWVyTWFuYWdlcicse1xucmVuYW1lOmFzeW5jKHBldG5hbWUsaXNzdWVyKT0+e1xuYnJhbmRUYWJsZS5oYXNCeUlzc3Vlcihpc3N1ZXIpfHxcbkZhaWwgYGlzc3VlciBoYXMgbm90IGJlZW4gcHJldmlvdXNseSBhZGRlZGA7XG5jb25zdCBicmFuZFJlY29yZD1icmFuZFRhYmxlLmdldEJ5SXNzdWVyKGlzc3Vlcik7XG5icmFuZE1hcHBpbmcucmVuYW1lUGV0bmFtZShwZXRuYW1lLGJyYW5kUmVjb3JkLmJyYW5kKTtcbmF3YWl0IHVwZGF0ZUFsbFN0YXRlKCk7XG4gfSxcbmdldDoocGV0bmFtZSk9PntcbmNvbnN0IGJyYW5kPWJyYW5kTWFwcGluZy5wZXRuYW1lVG9WYWwuZ2V0KHBldG5hbWUpO1xucmV0dXJuIGJyYW5kVGFibGUuZ2V0QnlCcmFuZChicmFuZCkuaXNzdWVyO1xuIH0sXG5nZXRBbGw6KCk9PntcbnJldHVyblsuLi5icmFuZE1hcHBpbmcucGV0bmFtZVRvVmFsLmVudHJpZXMoKV0ubWFwKFxuKFtwZXRuYW1lLGJyYW5kXSk9PntcbmNvbnN0e2lzc3Vlcn09YnJhbmRUYWJsZS5nZXRCeUJyYW5kKGJyYW5kKTtcbnJldHVybltwZXRuYW1lLGlzc3Vlcl07XG4gfSk7XG5cbiB9LFxuYWRkOmFzeW5jKHBldG5hbWUsaXNzdWVyUCk9PntcbmNvbnN0e2JyYW5kLGlzc3Vlcn09YXdhaXQgYnJhbmRUYWJsZS5pbml0SXNzdWVyKGlzc3VlclAsYWRkTWV0YSk7XG5hd2FpdCBpbml0SXNzdWVyVG9Cb2FyZElkKGlzc3VlcixicmFuZCk7XG5icmFuZE1hcHBpbmcuc3VnZ2VzdFBldG5hbWUocGV0bmFtZSxicmFuZCk7XG5hd2FpdCB1cGRhdGVBbGxJc3N1ZXJzU3RhdGUoKTtcbiB9fSk7XG5cblxuZnVuY3Rpb24gZ2V0SW5zdGFsbGF0aW9uTWFuYWdlcigpe1xucmV0dXJuIGluc3RhbGxhdGlvbk1hbmFnZXI7XG4gfVxuXG5mdW5jdGlvbiBnZXRJbnN0YW5jZU1hbmFnZXIoKXtcbnJldHVybiBpbnN0YW5jZU1hbmFnZXI7XG4gfVxuXG5mdW5jdGlvbiBnZXRJc3N1ZXJNYW5hZ2VyKCl7XG5yZXR1cm4gaXNzdWVyTWFuYWdlcjtcbiB9XG5cbmFzeW5jIGZ1bmN0aW9uIHNhdmVPZmZlclJlc3VsdChpbnZpdGF0aW9uSGFuZGxlLG9mZmVyUmVzdWx0KXtcbmludml0YXRpb25IYW5kbGVUb09mZmVyUmVzdWx0LmluaXQoaW52aXRhdGlvbkhhbmRsZSxvZmZlclJlc3VsdCk7XG4gfVxuXG5hc3luYyBmdW5jdGlvbiBnZXRPZmZlclJlc3VsdChpbnZpdGF0aW9uSGFuZGxlKXtcbnJldHVybiBpbnZpdGF0aW9uSGFuZGxlVG9PZmZlclJlc3VsdC5nZXQoaW52aXRhdGlvbkhhbmRsZSk7XG4gfVxuXG4vKlxuXG5cblxuXG5cbiAgICovXG5hc3luYyBmdW5jdGlvbiBnZXRVSU5vdGlmaWVyKHJhd0lkLGRhcHBPcmlnaW49J3Vua25vd24nKXtcbmNvbnN0IGlkPW1ha2VJZChkYXBwT3JpZ2luLHJhd0lkKTtcbmNvbnN0IG9mZmVyUmVzdWx0PWF3YWl0IGlkVG9PZmZlclJlc3VsdFByb21pc2VLaXQuZ2V0KGlkKS5wcm9taXNlO1xuYXNzZXJ0KFxucGFzc1N0eWxlT2Yob2ZmZXJSZXN1bHQpPT09J2NvcHlSZWNvcmQnLFxuIGBvZmZlclJlc3VsdCBtdXN0IGJlIGEgcmVjb3JkIHRvIGhhdmUgYSB1aU5vdGlmaWVyYCk7XG5cbm9mZmVyUmVzdWx0LnVpTm90aWZpZXJ8fEZhaWwgYG9mZmVyUmVzdWx0IGRvZXMgbm90IGhhdmUgYSB1aU5vdGlmaWVyYDtcbnJldHVybiBvZmZlclJlc3VsdC51aU5vdGlmaWVyO1xuIH1cblxuLypcblxuXG5cblxuXG5cbiAgICovXG5hc3luYyBmdW5jdGlvbiBnZXRQdWJsaWNTdWJzY3JpYmVycyhyYXdJZCxkYXBwT3JpZ2luPSd1bmtub3duJyl7XG5jb25zdCBpZD1tYWtlSWQoZGFwcE9yaWdpbixyYXdJZCk7XG5cbmNvbnN0IG9mZmVyUmVzdWx0PWF3YWl0IGlkVG9PZmZlclJlc3VsdFByb21pc2VLaXQuZ2V0KGlkKS5wcm9taXNlO1xuYXNzZXJ0KFxucGFzc1N0eWxlT2Yob2ZmZXJSZXN1bHQpPT09J2NvcHlSZWNvcmQnLFxuIGBvZmZlclJlc3VsdCAke29mZmVyUmVzdWx0fSBtdXN0IGJlIGEgcmVjb3JkIHRvIGhhdmUgcHVibGljU3Vic2NyaWJlcnNgKTtcblxuXG5jb25zdHtwdWJsaWNTdWJzY3JpYmVyc309b2ZmZXJSZXN1bHQ7XG5wdWJsaWNTdWJzY3JpYmVyc3x8XG5GYWlsIGBvZmZlclJlc3VsdCAke29mZmVyUmVzdWx0fSBkb2VzIG5vdCBoYXZlIHB1YmxpY1N1YnNjcmliZXJzYDtcbnBhc3NTdHlsZU9mKHB1YmxpY1N1YnNjcmliZXJzKT09PSdjb3B5UmVjb3JkJ3x8XG5GYWlsIGBwdWJsaWNTdWJzY3JpYmVycyAke3B1YmxpY1N1YnNjcmliZXJzfSBtdXN0IGJlIGEgcmVjb3JkYDtcblxucmV0dXJuIHB1YmxpY1N1YnNjcmliZXJzO1xuIH1cblxuLypcblxuXG5cblxuXG5cbiAgICovXG5hc3luYyBmdW5jdGlvbiBnZXRQdWJsaWNOb3RpZmllcnMocmF3SWQsZGFwcE9yaWdpbj0ndW5rbm93bicpe1xuY29uc3QgcHVibGljU3Vic2NyaWJlcnM9YXdhaXQgZ2V0UHVibGljU3Vic2NyaWJlcnMocmF3SWQsZGFwcE9yaWdpbik7XG5yZXR1cm4gb2JqZWN0TWFwKHB1YmxpY1N1YnNjcmliZXJzLG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyKTtcbiB9XG5cbi8vXG4vL1xuY29uc3QgY3JlYXRlUm9vdExvb2t1cHM9KCk9PntcbmNvbnN0IHJvb3RQYXRoVG9Mb29rdXA9bWFrZUxlZ2FjeU1hcCgnbG9va3VwcycpO1xuXG4vKlxuXG5cbiAgICAgKi9cbmNvbnN0IG1ha2VMb29rdXA9KGtpbmQsbG9va3VwKT0+e1xucm9vdFBhdGhUb0xvb2t1cC5pbml0KFxua2luZCxcbkZhciggYCR7a2luZH1Mb29rdXBgLHtcbmxvb2t1cH0pKTtcblxuXG4gfTtcblxuLy9cbi8vXG5jb25zdCBwZXRuYW1lT3JQYXRoPVxuKGxvb2t1cCk9PlxuKC4uLnBhdGgpPT57XG50cnl7XG5pZihwYXRoLmxlbmd0aD09PTEpe1xuLy9cbnJldHVybiBsb29rdXAocGF0aFswXSk7XG4gfVxuIH1jYXRjaChlKXtcbi8vXG4gfVxucmV0dXJuIGxvb2t1cChwYXRoKTtcbiB9O1xuXG5tYWtlTG9va3VwKCdicmFuZCcscGV0bmFtZU9yUGF0aChicmFuZE1hcHBpbmcucGV0bmFtZVRvVmFsLmdldCkpO1xubWFrZUxvb2t1cCgnY29udGFjdCcscGV0bmFtZU9yUGF0aChjb250YWN0TWFwcGluZy5wZXRuYW1lVG9WYWwuZ2V0KSk7XG5tYWtlTG9va3VwKCdpc3N1ZXInLHBldG5hbWVPclBhdGgoaXNzdWVyTWFuYWdlci5nZXQpKTtcbm1ha2VMb29rdXAoJ2luc3RhbmNlJyxwZXRuYW1lT3JQYXRoKGluc3RhbmNlTWFwcGluZy5wZXRuYW1lVG9WYWwuZ2V0KSk7XG5tYWtlTG9va3VwKFxuJ2luc3RhbGxhdGlvbicsXG5wZXRuYW1lT3JQYXRoKGluc3RhbGxhdGlvbk1hcHBpbmcucGV0bmFtZVRvVmFsLmdldCkpO1xuXG5tYWtlTG9va3VwKCdwdXJzZScscGV0bmFtZU9yUGF0aChwdXJzZU1hcHBpbmcucGV0bmFtZVRvVmFsLmdldCkpO1xuXG4vL1xuY29uc3QgaWRPbmx5PVxuKGtpbmQsbG9va3VwKT0+XG4oLi4ucGF0aCk9PntcbnBhdGgubGVuZ3RoPT09MXx8XG5GYWlsIGAke3EoXG5raW5kKVxuIH0gbG9va3VwIG11c3QgYmUgY2FsbGVkIHdpdGggYSBzaW5nbGUgb2ZmZXIgSUQsIG5vdCAke3BhdGh9YDtcbnJldHVybiBsb29rdXAocGF0aFswXSk7XG4gfTtcbm1ha2VMb29rdXAoJ29mZmVyJyxpZE9ubHkoJ29mZmVyJyxpZFRvT2ZmZXIuZ2V0KSk7XG5tYWtlTG9va3VwKFxuJ29mZmVyUmVzdWx0JyxcbmlkT25seSgnb2ZmZXJSZXN1bHQnLChpZCk9PmlkVG9PZmZlclJlc3VsdFByb21pc2VLaXQuZ2V0KGlkKS5wcm9taXNlKSk7XG5cblxucmV0dXJuIHJvb3RQYXRoVG9Mb29rdXA7XG4gfTtcblxuY29uc3QgZmlyc3RQYXRoVG9Mb29rdXA9Y3JlYXRlUm9vdExvb2t1cHMoKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBtYXJzaGFsbGVyPWhhcmRlbih7XG5mcm9tQ2FwRGF0YTpjb250ZXh0LmZyb21DYXBEYXRhLFxudG9DYXBEYXRhOmNvbnRleHQudG9DYXBEYXRhLFxudW5zZXJpYWxpemU6Y29udGV4dC5mcm9tQ2FwRGF0YSxcbnNlcmlhbGl6ZTpjb250ZXh0LnRvQ2FwRGF0YX0pO1xuXG5cbmNvbnN0IGhhbmRsZUFjY2VwdE9mZmVyQWN0aW9uPWFzeW5jKG9mZmVyKT0+e1xuY29uc3R7cmVxdWVzdENvbnRleHR9PW9mZmVyO1xuY29uc3QgcmF3SWQ9YXdhaXQgYWRkT2ZmZXIob2ZmZXIscmVxdWVzdENvbnRleHQpO1xuY29uc3QgZGFwcE9yaWdpbj1cbnJlcXVlc3RDb250ZXh0LmRhcHBPcmlnaW58fHJlcXVlc3RDb250ZXh0Lm9yaWdpbnx8J3Vua25vd24nO1xucmV0dXJuIGFjY2VwdE9mZmVyKCBgJHtkYXBwT3JpZ2lufSMke3Jhd0lkfWApO1xuIH07XG5cbmNvbnN0IGhhbmRsZVN1Z2dlc3RJc3N1ZXJBY3Rpb249KHtwZXRuYW1lLGJvYXJkSWR9KT0+XG5zdWdnZXN0SXNzdWVyKHBldG5hbWUsYm9hcmRJZCk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qXG5cblxuICAgKi9cbmNvbnN0IHBlcmZvcm1BY3Rpb249KG9iaik9PntcbmNvbnN0e3R5cGUsZGF0YX09SlNPTi5wYXJzZShvYmouc3BlbmRBY3Rpb24pO1xuc3dpdGNoKHR5cGUpe1xuY2FzZSdhY2NlcHRPZmZlcic6XG5yZXR1cm4gaGFuZGxlQWNjZXB0T2ZmZXJBY3Rpb24oZGF0YSk7XG5jYXNlJ3N1Z2dlc3RJc3N1ZXInOlxucmV0dXJuIGhhbmRsZVN1Z2dlc3RJc3N1ZXJBY3Rpb24oZGF0YSk7XG5kZWZhdWx0OlxudGhyb3cgRXJyb3IoIGBVbmtub3duIHdhbGxldCBhY3Rpb24gJHt0eXBlfWApO31cblxuIH07XG5cbmNvbnN0IHdhbGxldD1GYXIoJ3dhbGxldCcse1xubG9va3VwOiguLi5wYXRoKT0+e1xuLy9cbmlmKHBhdGgubGVuZ3RoPT09MCl7XG5yZXR1cm4gd2FsbGV0O1xuIH1cbmNvbnN0W2ZpcnN0LC4uLnJlbWFpbmluZ109cGF0aDtcbmNvbnN0IGZpcnN0VmFsdWU9Zmlyc3RQYXRoVG9Mb29rdXAuZ2V0KGZpcnN0KTtcbmlmKHJlbWFpbmluZy5sZW5ndGg9PT0wKXtcbnJldHVybiBmaXJzdFZhbHVlO1xuIH1cbnJldHVybiBFKGZpcnN0VmFsdWUpLmxvb2t1cCguLi5yZW1haW5pbmcpO1xuIH0sXG5nZXRNYXJzaGFsbGVyOigpPT5tYXJzaGFsbGVyLFxuZ2V0RGFwcENhY2hlQ29vcmRpbmF0b3I6KGRhcHBPcmlnaW4pPT5cbmRhcHBPcmlnaW5zLmdldChkYXBwT3JpZ2luKS5jYWNoZUNvb3JkaW5hdG9yLFxuZ2V0Q2FjaGVDb29yZGluYXRvcjooKT0+c2hhcmVkQ2FjaGVDb29yZGluYXRvcixcbnNhdmVPZmZlclJlc3VsdCxcbmdldE9mZmVyUmVzdWx0LFxud2FpdEZvckRhcHBBcHByb3ZhbCxcbmdldERhcHBzTm90aWZpZXIoKXtcbnJldHVybiBkYXBwc05vdGlmaWVyO1xuIH0sXG5nZXRQdXJzZXNOb3RpZmllcigpe1xucmV0dXJuIHB1cnNlc05vdGlmaWVyO1xuIH0sXG5nZXRBdHRlbnVhdGVkUHVyc2VzTm90aWZpZXIoKXtcbnJldHVybiBhdHRlbnVhdGVkUHVyc2VzTm90aWZpZXI7XG4gfSxcbmdldElzc3VlcnNOb3RpZmllcigpe1xucmV0dXJuIGlzc3VlcnNOb3RpZmllcjtcbiB9LFxuZ2V0T2ZmZXJzTm90aWZpZXIoKXtcbnJldHVybiBvZmZlcnNOb3RpZmllcjtcbiB9LFxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5hZGRJc3N1ZXI6aXNzdWVyTWFuYWdlci5hZGQsXG5nZXRCcmFuZCxcbmdldEJyYW5kUGV0bmFtZXMsXG5wdWJsaXNoSXNzdWVyLFxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmFkZEluc3RhbmNlOmluc3RhbmNlTWFuYWdlci5hZGQsXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmFkZEluc3RhbGxhdGlvbjppbnN0YWxsYXRpb25NYW5hZ2VyLmFkZCxcbmdldEluc3RhbGxhdGlvbk1hbmFnZXIsXG5nZXRJbnN0YW5jZU1hbmFnZXIsXG5nZXRJc3N1ZXJNYW5hZ2VyLFxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5yZW5hbWVJc3N1ZXI6aXNzdWVyTWFuYWdlci5yZW5hbWUsXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xucmVuYW1lSW5zdGFuY2U6aW5zdGFuY2VNYW5hZ2VyLnJlbmFtZSxcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xucmVuYW1lSW5zdGFsbGF0aW9uOmluc3RhbGxhdGlvbk1hbmFnZXIucmVuYW1lLFxuZ2V0U2VsZkNvbnRhY3QsXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuZ2V0SW5zdGFuY2U6aW5zdGFuY2VNYW5hZ2VyLmdldCxcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuZ2V0SW5zdGFsbGF0aW9uOmluc3RhbGxhdGlvbk1hbmFnZXIuZ2V0LFxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5nZXRJbnN0YWxsYXRpb25zOmluc3RhbGxhdGlvbk1hbmFnZXIuZ2V0QWxsLFxubWFrZUVtcHR5UHVyc2UsXG5kZXBvc2l0LFxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5nZXRJc3N1ZXI6aXNzdWVyTWFuYWdlci5nZXQsXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmdldElzc3VlcnM6aXNzdWVyTWFuYWdlci5nZXRBbGwsXG5nZXRQdXJzZXMsXG5nZXRQdXJzZSxcbmdldFB1cnNlSXNzdWVyLFxuYWRkT2ZmZXIsXG5kZWNsaW5lT2ZmZXIsXG5jYW5jZWxPZmZlcixcbmFjY2VwdE9mZmVyLFxuZ2V0T2ZmZXJzLFxuZ2V0U2VhdDooaWQpPT5pZFRvU2VhdC5nZXQoaWQpLFxuZ2V0U2VhdHM6KGlkcyk9Pmlkcy5tYXAod2FsbGV0LmdldFNlYXQpLFxuZW5hYmxlQXV0b0RlcG9zaXQocHVyc2VQZXRuYW1lKXtcbi8vXG5yZXR1cm4gZG9FbmFibGVBdXRvRGVwb3NpdChwdXJzZVBldG5hbWUsdHJ1ZSk7XG4gfSxcbmRpc2FibGVBdXRvRGVwb3NpdCxcbnBlcmZvcm1BY3Rpb24sXG5nZXREZXBvc2l0RmFjZXRJZCxcbnN1Z2dlc3RJc3N1ZXIsXG5zdWdnZXN0SW5zdGFuY2UsXG5zdWdnZXN0SW5zdGFsbGF0aW9uLFxuYWRkQ29udGFjdCxcbmdldENvbnRhY3RzTm90aWZpZXIoKXtcbnJldHVybiBjb250YWN0c05vdGlmaWVyO1xuIH0sXG5hZGRQYXltZW50LFxuZ2V0UGF5bWVudHNOb3RpZmllcigpe1xucmV0dXJuIHBheW1lbnRzTm90aWZpZXI7XG4gfSxcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuZ2V0VUlOb3RpZmllcixcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuZ2V0UHVibGljTm90aWZpZXJzLFxuZ2V0UHVibGljU3Vic2NyaWJlcnMsXG5nZXRab2UoKXtcbnJldHVybiB6b2U7XG4gfSxcbmdldEJvYXJkKCl7XG5yZXR1cm4gYm9hcmQ7XG4gfSxcbmdldEFnb3JpY05hbWVzKC4uLnBhdGgpe1xuaWYoIWFnb3JpY05hbWVzKXtcbnRocm93IEZhaWwgYGFnb3JpY05hbWVzIHdhcyBub3Qgc3VwcGxpZWQgdG8gdGhlIHdhbGxldCBtYWtlcmA7XG4gfVxucmV0dXJuIEUoYWdvcmljTmFtZXMpLmxvb2t1cCguLi5wYXRoKTtcbiB9LFxuZ2V0TmFtZXNCeUFkZHJlc3MoLi4ucGF0aCl7XG5pZihuYW1lc0J5QWRkcmVzcz09PXVuZGVmaW5lZCl7XG4vL1xuLy9cbnRocm93IEZhaWwgYG5hbWVzQnlBZGRyZXNzIHdhcyBub3Qgc3VwcGxpZWQgdG8gdGhlIHdhbGxldCBtYWtlcmA7XG4gfVxucmV0dXJuIEUobmFtZXNCeUFkZHJlc3MpLmxvb2t1cCguLi5wYXRoKTtcbiB9fSk7XG5cblxuY29uc3QgaW5pdGlhbGl6ZT1hc3luYygpPT57XG4vL1xuY29uc3Qgc2VsZkRlcG9zaXRGYWNldD1GYXIoJ2NvbnRhY3QnLHtcbnJlY2VpdmUocGF5bWVudCl7XG5yZXR1cm4gYWRkUGF5bWVudChwYXltZW50KTtcbiB9fSk7XG5cblxuY29uc3QgYWRkcmVzcz1hd2FpdCBFKG15QWRkcmVzc05hbWVBZG1pbikuZ2V0TXlBZGRyZXNzKCk7XG4vL1xuc2VsZkNvbnRhY3RQPWFkZENvbnRhY3QoJ1NlbGYnLHNlbGZEZXBvc2l0RmFjZXQsYWRkcmVzcyk7XG5cbi8vXG5jb25zdCBaT0VfSU5WSVRFX1BVUlNFX1BFVE5BTUU9J0RlZmF1bHQgWm9lIGludml0ZSBwdXJzZSc7XG5jb25zdCBpbnZpdGVJc3N1ZXJQPUUoem9lKS5nZXRJbnZpdGF0aW9uSXNzdWVyKCk7XG5jb25zdCBhZGRab2VJc3N1ZXI9KGlzc3VlclApPT5cbmlzc3Vlck1hbmFnZXIuYWRkKFpPRV9JTlZJVEVfQlJBTkRfUEVUTkFNRSxpc3N1ZXJQKTtcbmNvbnN0IG1ha2VJbnZpdGVQdXJzZT0oKT0+XG53YWxsZXQubWFrZUVtcHR5UHVyc2UoWk9FX0lOVklURV9CUkFORF9QRVROQU1FLFpPRV9JTlZJVEVfUFVSU0VfUEVUTkFNRSk7XG5jb25zdCBhZGRJbnZpdGVEZXBvc2l0RmFjZXQ9KCk9PlxuRSh3YWxsZXQpLmVuYWJsZUF1dG9EZXBvc2l0KFpPRV9JTlZJVEVfUFVSU0VfUEVUTkFNRSk7XG5cbmF3YWl0IGFkZFpvZUlzc3VlcihpbnZpdGVJc3N1ZXJQKS5cbnRoZW4obWFrZUludml0ZVB1cnNlKS5cbnRoZW4oYWRkSW52aXRlRGVwb3NpdEZhY2V0KTtcbnpvZUludml0ZVB1cnNlPXdhbGxldC5nZXRQdXJzZShaT0VfSU5WSVRFX1BVUlNFX1BFVE5BTUUpO1xuXG5hd2FpdCBFKG15QWRkcmVzc05hbWVBZG1pbikudXBkYXRlKFxuV2FsbGV0TmFtZS5kZXBvc2l0RmFjZXQsXG5zZWxmRGVwb3NpdEZhY2V0KTtcblxuIH07XG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuY29uc3QgaW1wb3J0QmFua0Fzc2V0cz1hc3luYyhiYW5rKT0+e1xudm9pZCBvYnNlcnZlSXRlcmF0aW9uKFxuc3Vic2NyaWJlRWFjaChFKGJhbmspLmdldEFzc2V0U3Vic2NyaXB0aW9uKCkpLFxuaGFyZGVuKHtcbiAgICAgIGFzeW5jIHVwZGF0ZVN0YXRlKHtwcm9wb3NlZE5hbWUsaXNzdWVyTmFtZSxpc3N1ZXIsYnJhbmR9KXtcbmF3YWl0IG51bGw7XG50cnl7XG5pc3N1ZXJOYW1lPWF3YWl0IGFkZElzc3Vlcihpc3N1ZXJOYW1lLGlzc3Vlcik7XG5jb25zdCBwdXJzZT1hd2FpdCBFKGJhbmspLmdldFB1cnNlKGJyYW5kKTtcbi8vXG5hd2FpdCBpbnRlcm5hbFVuc2FmZUltcG9ydFB1cnNlKFxuaXNzdWVyTmFtZSxcbnByb3Bvc2VkTmFtZSxcbnRydWUsXG5wdXJzZSk7XG5cbiB9Y2F0Y2goZSl7XG5jb25zb2xlLmVycm9yKCcvLy8gY291bGQgbm90IGFkZCBiYW5rIGFzc2V0IHB1cnNlJyxlLHtcbmlzc3Vlck5hbWUsXG5wcm9wb3NlZE5hbWUsXG5pc3N1ZXIsXG5icmFuZH0pO1xuXG4gfVxuIH19KSkuXG5cbmZpbmFsbHkoKCk9PmNvbnNvbGUuZXJyb3IoJy8vLyBUaGlzIGlzIHRoZSBlbmQgb2YgdGhlIGJhbmsgYXNzZXRzJykpO1xuIH07XG5yZXR1cm57XG5hZG1pbjp3YWxsZXQsXG5pbml0aWFsaXplZDppbml0aWFsaXplKCksXG5pbXBvcnRCYW5rQXNzZXRzfTtcblxuIH1cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlV2FsbGV0Um9vdCI6WyJtYWtlV2FsbGV0Um9vdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC/5N1e6AIAAOgCAAAyAAAAQGFnb3JpYy93YWxsZXQtYmFja2VuZC12MC4xNS4wLXUxOS4yL3NyYy9wdWJzdWIuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImRlZmF1bHQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRozY9faW1wb3J0cyhbXSk7ICAgZnVuY3Rpb24gICAgICAgICAgICAgICAgbWFrZVB1YnN1YihFKXtcbmxldCBsYXN0UHVibGlzaGVkO1xuY29uc3Qgc3Vic2NyaWJlcnM9W107XG5cbnJldHVybiBoYXJkZW4oe1xuc3Vic2NyaWJlKHMpe1xuc3Vic2NyaWJlcnMucHVzaChzKTtcbmlmKGxhc3RQdWJsaXNoZWQhPT11bmRlZmluZWQpe1xuRShzKS5ub3RpZnkobGFzdFB1Ymxpc2hlZCk7XG4gfVxuIH0sXG5wdWJsaXNoKG0pe1xubGFzdFB1Ymxpc2hlZD1tO1xuZm9yKGNvbnN0IHMgb2Ygc3Vic2NyaWJlcnMpe1xuRShzKS5ub3RpZnkobSk7XG4gfVxuIH19KTtcblxuIH0kaM2PX29uY2UuZGVmYXVsdCggICAgIG1ha2VQdWJzdWIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKXB49/ANQAAwDUAADIAAABAYWdvcmljL3dhbGxldC1iYWNrZW5kLXYwLjE1LjAtdTE5LjIvc3JjL3dhbGxldC5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2pzLXV0aWxzLmpzIiwiQGFnb3JpYy9ub3RpZmllciIsIi4vbGliLXdhbGxldC5qcyIsIi4vcHVic3ViLmpzIiwiLi9iaWdpbnRTdHJpbmdpZnkuanMiLCIuL2RhdGUtbm93LmpzIiwiLi9pbnRlcm5hbC10eXBlcy5qcyJdLCJleHBvcnRzIjpbImJ1aWxkUm9vdE9iamVjdCIsImRlZmF1bHQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBFLEZhcixkZWVwQ29weUpzb25hYmxlLG1ha2VOb3RpZmllcktpdCxvYnNlcnZlSXRlcmF0aW9uLG1ha2VXYWxsZXRSb290LHB1YnN1YixiaWdpbnRTdHJpbmdpZnksbWFrZVRpbWVyRGV2aWNlRGF0ZU5vdyxtYWtlVGltZXJTZXJ2aWNlRGF0ZU5vdzskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsL3NyYy9qcy11dGlscy5qc1wiLCBbW1wiZGVlcENvcHlKc29uYWJsZVwiLCBbJGjNj19hID0+IChkZWVwQ29weUpzb25hYmxlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wibWFrZU5vdGlmaWVyS2l0XCIsIFskaM2PX2EgPT4gKG1ha2VOb3RpZmllcktpdCA9ICRozY9fYSldXSxbXCJvYnNlcnZlSXRlcmF0aW9uXCIsIFskaM2PX2EgPT4gKG9ic2VydmVJdGVyYXRpb24gPSAkaM2PX2EpXV1dXSxbXCIuL2xpYi13YWxsZXQuanNcIiwgW1tcIm1ha2VXYWxsZXRSb290XCIsIFskaM2PX2EgPT4gKG1ha2VXYWxsZXRSb290ID0gJGjNj19hKV1dXV0sW1wiLi9wdWJzdWIuanNcIiwgW1tcImRlZmF1bHRcIiwgWyRozY9fYSA9PiAocHVic3ViID0gJGjNj19hKV1dXV0sW1wiLi9iaWdpbnRTdHJpbmdpZnkuanNcIiwgW1tcImJpZ2ludFN0cmluZ2lmeVwiLCBbJGjNj19hID0+IChiaWdpbnRTdHJpbmdpZnkgPSAkaM2PX2EpXV1dXSxbXCIuL2RhdGUtbm93LmpzXCIsIFtbXCJtYWtlVGltZXJEZXZpY2VEYXRlTm93XCIsIFskaM2PX2EgPT4gKG1ha2VUaW1lckRldmljZURhdGVOb3cgPSAkaM2PX2EpXV0sW1wibWFrZVRpbWVyU2VydmljZURhdGVOb3dcIiwgWyRozY9fYSA9PiAobWFrZVRpbWVyU2VydmljZURhdGVOb3cgPSAkaM2PX2EpXV1dXSxbXCIuL2ludGVybmFsLXR5cGVzLmpzXCIsIFtdXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShidWlsZFJvb3RPYmplY3QsICduYW1lJywge3ZhbHVlOiBcImJ1aWxkUm9vdE9iamVjdFwifSk7JGjNj19vbmNlLmJ1aWxkUm9vdE9iamVjdChidWlsZFJvb3RPYmplY3QpOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuZnVuY3Rpb24gICAgICAgIGJ1aWxkUm9vdE9iamVjdCh2YXRQb3dlcnMpe1xuLy9cbmNvbnN0e0R9PXZhdFBvd2Vyc3x8e307XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xubGV0IHdhbGxldFJvb3Q7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5sZXQgd2FsbGV0QWRtaW47XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5sZXQgcHVyc2VzU3RhdGU9W107XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xubGV0IGluYm94U3RhdGU9W107XG5sZXQgaHR0cDtcblxuY29uc3QgYnJpZGdlSGFuZGxlcz1uZXcgU2V0KCk7XG5jb25zdCBvZmZlclN1YnNjcmlwdGlvbnM9bmV3IE1hcCgpO1xuXG5jb25zdCBodHRwU2VuZD0ob2JqLGNoYW5uZWxIYW5kbGVzKT0+XG5FKGh0dHApLnNlbmQoZGVlcENvcHlKc29uYWJsZShvYmopLGNoYW5uZWxIYW5kbGVzKTtcblxuY29uc3QgcHVzaE9mZmVyU3Vic2NyaXB0aW9ucz0oY2hhbm5lbEhhbmRsZSxvZmZlcnMpPT57XG5jb25zdCBzdWJzPW9mZmVyU3Vic2NyaXB0aW9ucy5nZXQoY2hhbm5lbEhhbmRsZSk7XG5mb3IoY29uc3R7b3JpZ2luLHN0YXR1c31vZiBzdWJzfHxbXSl7XG4vL1xuY29uc3QgcmVzdWx0PWhhcmRlbihcbm9mZmVycy5maWx0ZXIoXG4ob2ZmZXIpPT5cbihzdGF0dXM9PT1udWxsfHxvZmZlci5zdGF0dXM9PT1zdGF0dXMpJiZcbm9mZmVyLnJlcXVlc3RDb250ZXh0JiZcbm9mZmVyLnJlcXVlc3RDb250ZXh0Lm9yaWdpbj09PW9yaWdpbikpO1xuXG5cbmh0dHBTZW5kKFxue1xudHlwZTond2FsbGV0T2ZmZXJEZXNjcmlwdGlvbnMnLFxuZGF0YTpyZXN1bHR9LFxuXG5bY2hhbm5lbEhhbmRsZV0pO1xuXG4gfVxuIH07XG5cbmNvbnN0IHN1YnNjcmliZVRvT2ZmZXJzPShjaGFubmVsSGFuZGxlLHtvcmlnaW4sc3RhdHVzPW51bGx9KT0+e1xubGV0IHN1YnM9b2ZmZXJTdWJzY3JpcHRpb25zLmdldChjaGFubmVsSGFuZGxlKTtcbmlmKCFzdWJzKXtcbnN1YnM9W107XG5vZmZlclN1YnNjcmlwdGlvbnMuc2V0KGNoYW5uZWxIYW5kbGUsc3Vicyk7XG4gfVxuc3Vicy5wdXNoKHtvcmlnaW4sc3RhdHVzfSk7XG5wdXNoT2ZmZXJTdWJzY3JpcHRpb25zKGNoYW5uZWxIYW5kbGUsaW5ib3hTdGF0ZSk7XG4gfTtcblxuY29uc3R7cHVibGlzaDpwdXJzZXNQdWJsaXNoLHN1YnNjcmliZTpwdXJzZXNTdWJzY3JpYmV9PXB1YnN1YihFKTtcbmNvbnN0e3VwZGF0ZXI6aW5ib3hVcGRhdGVyLG5vdGlmaWVyOm9mZmVyTm90aWZpZXJ9PVxubWFrZU5vdGlmaWVyS2l0KGluYm94U3RhdGUpO1xuY29uc3R7cHVibGlzaDppbmJveFB1Ymxpc2gsc3Vic2NyaWJlOmluYm94U3Vic2NyaWJlfT1wdWJzdWIoRSk7XG5cbmNvbnN0IG5vdGlmaWVycz1oYXJkZW4oe1xuZ2V0SW5ib3hOb3RpZmllcigpe1xucmV0dXJuIG9mZmVyTm90aWZpZXI7XG4gfX0pO1xuXG5cbi8qXG5cbiAgICovXG5hc3luYyBmdW5jdGlvbiBzdGFydHVwKHtcbnpvZSxcbmJvYXJkLFxuYWdvcmljTmFtZXMsXG5uYW1lc0J5QWRkcmVzcyxcbm15QWRkcmVzc05hbWVBZG1pbixcbnRpbWVyRGV2aWNlLFxudGltZXJEZXZpY2VTY2FsZSxcbmxvY2FsVGltZXJTZXJ2aWNlLFxubG9jYWxUaW1lclBvbGxJbnRlcnZhbH0pXG57XG5hc3NlcnQobXlBZGRyZXNzTmFtZUFkbWluLCdtaXNzaW5nIG15QWRkcmVzc05hbWVBZG1pbicpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmxldCBkYXRlTm93UDtcbmlmKHRpbWVyRGV2aWNlKXtcbmRhdGVOb3dQPW1ha2VUaW1lckRldmljZURhdGVOb3coRCx0aW1lckRldmljZSx0aW1lckRldmljZVNjYWxlKTtcbiB9XG5pZihsb2NhbFRpbWVyU2VydmljZSl7XG5kYXRlTm93UD1tYWtlVGltZXJTZXJ2aWNlRGF0ZU5vdyhcbmxvY2FsVGltZXJTZXJ2aWNlLFxubG9jYWxUaW1lclBvbGxJbnRlcnZhbCk7XG5cbiB9XG5cbmNvbnN0IGRhdGVOb3c9YXdhaXQgZGF0ZU5vd1A7XG5jb25zdCB3PW1ha2VXYWxsZXRSb290KHtcbmFnb3JpY05hbWVzLFxubmFtZXNCeUFkZHJlc3MsXG5teUFkZHJlc3NOYW1lQWRtaW4sXG56b2UsXG5ib2FyZCxcbnB1cnNlc1N0YXRlQ2hhbmdlSGFuZGxlcjpwdXJzZXNQdWJsaXNoLFxuaW5ib3hTdGF0ZUNoYW5nZUhhbmRsZXI6aW5ib3hQdWJsaXNoLFxuZGF0ZU5vd30pO1xuXG5jb25zb2xlLmRlYnVnKCd3YWl0aW5nIGZvciB3YWxsZXQgdG8gaW5pdGlhbGl6ZScpO1xuYXdhaXQgdy5pbml0aWFsaXplZDtcbmNvbnNvbGUuZGVidWcoJ3dhbGxldCBpbml0aWFsaXplZCcpO1xud2FsbGV0QWRtaW49dy5hZG1pbjtcbndhbGxldFJvb3Q9dztcbiB9XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuY29uc3QgbWFrZUJyaWRnZT0oYXBwcm92ZSxkYXBwT3JpZ2luLG1ldGE9e30pPT57XG5hc3luYyBmdW5jdGlvbiptYWtlQXBwcm92ZWROb3RpZmllcihzb3VyY2VOb3RpZmllcil7XG5hd2FpdCBhcHByb3ZlKCk7XG5mb3IgYXdhaXQoY29uc3Qgc3RhdGUgb2Ygc291cmNlTm90aWZpZXIpe1xuYXdhaXQgYXBwcm92ZSgpO1xueWllbGQgc3RhdGU7XG4gfVxuIH1cbmhhcmRlbihtYWtlQXBwcm92ZWROb3RpZmllcik7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgYnJpZGdlPUZhcignYnJpZGdlJyx7XG4gICAgICBhc3luYyBnZXRQdXJzZXNOb3RpZmllcigpe1xuYXdhaXQgYXBwcm92ZSgpO1xuY29uc3QgcHVyc2VzTm90aWZpZXI9d2FsbGV0QWRtaW4uZ2V0QXR0ZW51YXRlZFB1cnNlc05vdGlmaWVyKCk7XG5jb25zdHtub3RpZmllcix1cGRhdGVyfT1tYWtlTm90aWZpZXJLaXQoKTtcbnZvaWQgb2JzZXJ2ZUl0ZXJhdGlvbihtYWtlQXBwcm92ZWROb3RpZmllcihwdXJzZXNOb3RpZmllciksdXBkYXRlcik7XG5yZXR1cm4gbm90aWZpZXI7XG4gfSxcbiAgICAgIGFzeW5jIGdldENhY2hlQ29vcmRpbmF0b3IoKXtcbmF3YWl0IGFwcHJvdmUoKTtcbnJldHVybiB3YWxsZXRBZG1pbi5nZXREYXBwQ2FjaGVDb29yZGluYXRvcihkYXBwT3JpZ2luKTtcbiB9LFxuICAgICAgYXN5bmMgZ2V0SXNzdWVyc05vdGlmaWVyKCl7XG5hd2FpdCBhcHByb3ZlKCk7XG5yZXR1cm4gd2FsbGV0QWRtaW4uZ2V0SXNzdWVyc05vdGlmaWVyKCk7XG4gfSxcbiAgICAgIGFzeW5jIGFkZE9mZmVyKG9mZmVyKXtcbmF3YWl0IGFwcHJvdmUoKTtcbnJldHVybiB3YWxsZXRBZG1pbi5hZGRPZmZlcihvZmZlcix7Li4ubWV0YSxkYXBwT3JpZ2lufSk7XG4gfSxcbiAgICAgIGFzeW5jIGdldE9mZmVyc05vdGlmaWVyKHN0YXR1cz1udWxsKXtcbmF3YWl0IGFwcHJvdmUoKTtcbmNvbnN0e25vdGlmaWVyLHVwZGF0ZXJ9PW1ha2VOb3RpZmllcktpdChpbmJveFN0YXRlKTtcbmNvbnN0IGZpbHRlcj0ob2ZmZXIpPT5cbihzdGF0dXM9PT1udWxsfHxvZmZlci5zdGF0dXM9PT1zdGF0dXMpJiZcbm9mZmVyLnJlcXVlc3RDb250ZXh0JiZcbm9mZmVyLnJlcXVlc3RDb250ZXh0LmRhcHBPcmlnaW49PT1kYXBwT3JpZ2luO1xuY29uc3QgZmlsdGVyZWRPZmZlcnM9KG9mZmVycyk9PntcbnJldHVybiBvZmZlcnMuZmlsdGVyKGZpbHRlcikubWFwKCh7cmF3SWQsLi4udn0pPT4oe1xuLi4udixcbmlkOnJhd0lkfSkpO1xuXG4gfTtcblxudm9pZCBvYnNlcnZlSXRlcmF0aW9uKG1ha2VBcHByb3ZlZE5vdGlmaWVyKG9mZmVyTm90aWZpZXIpLHtcbnVwZGF0ZVN0YXRlKG9mZmVycyl7XG51cGRhdGVyLnVwZGF0ZVN0YXRlKGZpbHRlcmVkT2ZmZXJzKG9mZmVycykpO1xuIH0sXG5maW5pc2gob2ZmZXJzKXtcbnVwZGF0ZXIuZmluaXNoKGZpbHRlcmVkT2ZmZXJzKG9mZmVycykpO1xuIH0sXG5mYWlsKGUpe1xudXBkYXRlci5mYWlsKGUpO1xuIH19KTtcblxucmV0dXJuIG5vdGlmaWVyO1xuIH0sXG4gICAgICBhc3luYyBnZXREZXBvc2l0RmFjZXRJZChicmFuZEJvYXJkSWQpe1xuYXdhaXQgYXBwcm92ZSgpO1xucmV0dXJuIHdhbGxldEFkbWluLmdldERlcG9zaXRGYWNldElkKGJyYW5kQm9hcmRJZCk7XG4gfSxcbiAgICAgIGFzeW5jIHN1Z2dlc3RJc3N1ZXIocGV0bmFtZSxib2FyZElkKXtcbmF3YWl0IGFwcHJvdmUoKTtcbnJldHVybiB3YWxsZXRBZG1pbi5zdWdnZXN0SXNzdWVyKHBldG5hbWUsYm9hcmRJZCxkYXBwT3JpZ2luKTtcbiB9LFxuICAgICAgYXN5bmMgc3VnZ2VzdEluc3RhbGxhdGlvbihwZXRuYW1lLGJvYXJkSWQpe1xuYXdhaXQgYXBwcm92ZSgpO1xucmV0dXJuIHdhbGxldEFkbWluLnN1Z2dlc3RJbnN0YWxsYXRpb24ocGV0bmFtZSxib2FyZElkLGRhcHBPcmlnaW4pO1xuIH0sXG4gICAgICBhc3luYyBzdWdnZXN0SW5zdGFuY2UocGV0bmFtZSxib2FyZElkKXtcbmF3YWl0IGFwcHJvdmUoKTtcbnJldHVybiB3YWxsZXRBZG1pbi5zdWdnZXN0SW5zdGFuY2UocGV0bmFtZSxib2FyZElkLGRhcHBPcmlnaW4pO1xuIH0sXG4gICAgICBhc3luYyBnZXRVSU5vdGlmaWVyKHJhd0lkKXtcbmF3YWl0IGFwcHJvdmUoKTtcbnJldHVybiB3YWxsZXRBZG1pbi5nZXRVSU5vdGlmaWVyKHJhd0lkLGRhcHBPcmlnaW4pO1xuIH0sXG4gICAgICBhc3luYyBnZXRQdWJsaWNOb3RpZmllcnMocmF3SWQpe1xuYXdhaXQgYXBwcm92ZSgpO1xucmV0dXJuIHdhbGxldEFkbWluLmdldFB1YmxpY05vdGlmaWVycyhyYXdJZCxkYXBwT3JpZ2luKTtcbiB9LFxuICAgICAgYXN5bmMgZ2V0Wm9lKCl7XG5hd2FpdCBhcHByb3ZlKCk7XG5yZXR1cm4gd2FsbGV0QWRtaW4uZ2V0Wm9lKCk7XG4gfSxcbiAgICAgIGFzeW5jIGdldEJvYXJkKCl7XG5hd2FpdCBhcHByb3ZlKCk7XG5yZXR1cm4gd2FsbGV0QWRtaW4uZ2V0Qm9hcmQoKTtcbiB9LFxuICAgICAgYXN5bmMgZ2V0QWdvcmljTmFtZXMoLi4ucGF0aCl7XG5hd2FpdCBhcHByb3ZlKCk7XG5yZXR1cm4gd2FsbGV0QWRtaW4uZ2V0QWdvcmljTmFtZXMoLi4ucGF0aCk7XG4gfSxcbiAgICAgIGFzeW5jIGdldE5hbWVzQnlBZGRyZXNzKC4uLnBhdGgpe1xuYXdhaXQgYXBwcm92ZSgpO1xucmV0dXJuIHdhbGxldEFkbWluLmdldE5hbWVzQnlBZGRyZXNzKC4uLnBhdGgpO1xuIH0sXG4gICAgICBhc3luYyBnZXRCcmFuZFBldG5hbWVzKGJyYW5kcyl7XG5hd2FpdCBhcHByb3ZlKCk7XG5yZXR1cm4gd2FsbGV0QWRtaW4uZ2V0QnJhbmRQZXRuYW1lcyhicmFuZHMpO1xuIH19KTtcblxucmV0dXJuIGJyaWRnZTtcbiB9O1xuXG4vKlxuXG5cblxuXG5cbiAgICovXG5jb25zdCBwcmVhcHByb3ZlZEJyaWRnZT1GYXIoJ3ByZWFwcHJvdmVkQnJpZGdlJyx7XG4vKlxuXG5cbiAgICAgKi9cbmFkZE9mZmVyKG9mZmVyLG1ldGEpe1xucmV0dXJuIHdhbGxldEFkbWluLmFkZE9mZmVyKG9mZmVyLG1ldGEpO1xuIH0sXG5nZXREZXBvc2l0RmFjZXRJZChicmFuZEJvYXJkSWQpe1xucmV0dXJuIHdhbGxldEFkbWluLmdldERlcG9zaXRGYWNldElkKGJyYW5kQm9hcmRJZCk7XG4gfSxcbiAgICAgIGFzeW5jIGdldE9mZmVyc05vdGlmaWVyKCl7XG5yZXR1cm4gd2FsbGV0QWRtaW4uZ2V0T2ZmZXJzTm90aWZpZXIoKTtcbiB9LFxuICAgICAgYXN5bmMgZ2V0UHVyc2VzTm90aWZpZXIoKXtcbnJldHVybiB3YWxsZXRBZG1pbi5nZXRBdHRlbnVhdGVkUHVyc2VzTm90aWZpZXIoKTtcbiB9LFxuICAgICAgYXN5bmMgZ2V0SXNzdWVyc05vdGlmaWVyKCl7XG5yZXR1cm4gd2FsbGV0QWRtaW4uZ2V0SXNzdWVyc05vdGlmaWVyKCk7XG4gfSxcbiAgICAgIGFzeW5jIGdldENhY2hlQ29vcmRpbmF0b3IoKXtcbnJldHVybiB3YWxsZXRBZG1pbi5nZXRDYWNoZUNvb3JkaW5hdG9yKCk7XG4gfSxcbnN1Z2dlc3RJbnN0YWxsYXRpb24ocGV0bmFtZSxpbnN0YWxsYXRpb25Cb2FyZElkKXtcbnJldHVybiB3YWxsZXRBZG1pbi5zdWdnZXN0SW5zdGFsbGF0aW9uKHBldG5hbWUsaW5zdGFsbGF0aW9uQm9hcmRJZCk7XG4gfSxcbnN1Z2dlc3RJbnN0YW5jZShwZXRuYW1lLGluc3RhbmNlQm9hcmRJZCl7XG5yZXR1cm4gd2FsbGV0QWRtaW4uc3VnZ2VzdEluc3RhbmNlKHBldG5hbWUsaW5zdGFuY2VCb2FyZElkKTtcbiB9LFxuc3VnZ2VzdElzc3VlcihwZXRuYW1lLGlzc3VlckJvYXJkSWQpe1xucmV0dXJuIHdhbGxldEFkbWluLnN1Z2dlc3RJc3N1ZXIocGV0bmFtZSxpc3N1ZXJCb2FyZElkKTtcbiB9LFxuZ2V0VUlOb3RpZmllcihyYXdJZCl7XG5yZXR1cm4gd2FsbGV0QWRtaW4uZ2V0VUlOb3RpZmllcihyYXdJZCk7XG4gfSxcbmdldFB1YmxpY05vdGlmaWVycyhyYXdJZCl7XG5yZXR1cm4gd2FsbGV0QWRtaW4uZ2V0UHVibGljTm90aWZpZXJzKHJhd0lkKTtcbiB9LFxuICAgICAgYXN5bmMgZ2V0Wm9lKCl7XG5yZXR1cm4gd2FsbGV0QWRtaW4uZ2V0Wm9lKCk7XG4gfSxcbiAgICAgIGFzeW5jIGdldEJvYXJkKCl7XG5yZXR1cm4gd2FsbGV0QWRtaW4uZ2V0Qm9hcmQoKTtcbiB9LFxuICAgICAgYXN5bmMgZ2V0QWdvcmljTmFtZXMoLi4ucGF0aCl7XG5yZXR1cm4gd2FsbGV0QWRtaW4uZ2V0QWdvcmljTmFtZXMoLi4ucGF0aCk7XG4gfSxcbiAgICAgIGFzeW5jIGdldE5hbWVzQnlBZGRyZXNzKC4uLnBhdGgpe1xucmV0dXJuIHdhbGxldEFkbWluLmdldE5hbWVzQnlBZGRyZXNzKC4uLnBhdGgpO1xuIH0sXG4gICAgICBhc3luYyBnZXRCcmFuZFBldG5hbWVzKGJyYW5kcyl7XG5yZXR1cm4gd2FsbGV0QWRtaW4uZ2V0QnJhbmRQZXRuYW1lcyhicmFuZHMpO1xuIH19KTtcblxuaGFyZGVuKHByZWFwcHJvdmVkQnJpZGdlKTtcblxuYXN5bmMgZnVuY3Rpb24gZ2V0V2FsbGV0KGJhbmspe1xuYXdhaXQgd2FsbGV0Um9vdC5pbXBvcnRCYW5rQXNzZXRzKGJhbmspO1xuXG4vKlxuXG4gICAgICovXG5jb25zdCB3YWxsZXQ9RmFyKCd3YWxsZXQnLHtcbmFkZFBheW1lbnQ6d2FsbGV0QWRtaW4uYWRkUGF5bWVudCxcbiAgICAgIGFzeW5jIGdldFNjb3BlZEJyaWRnZShzdWdnZXN0ZWREYXBwUGV0bmFtZSxkYXBwT3JpZ2luKXtcbmNvbnN0IGFwcHJvdmU9YXN5bmMoKT0+e1xuYXdhaXQgd2FsbGV0QWRtaW4ud2FpdEZvckRhcHBBcHByb3ZhbChcbnN1Z2dlc3RlZERhcHBQZXRuYW1lLFxuZGFwcE9yaWdpbik7XG5cbiB9O1xuXG5yZXR1cm4gbWFrZUJyaWRnZShhcHByb3ZlLGRhcHBPcmlnaW4pO1xuIH0sXG4gICAgICBhc3luYyBnZXRCcmlkZ2UoKXtcbnJldHVybiBwcmVhcHByb3ZlZEJyaWRnZTtcbiB9LFxuZ2V0RGVwb3NpdEZhY2V0SWQ6d2FsbGV0QWRtaW4uZ2V0RGVwb3NpdEZhY2V0SWQsXG5nZXRBZG1pbkZhY2V0KCl7XG5yZXR1cm4gRmFyKCdhZG1pbkZhY2V0Jyx7XG4uLi53YWxsZXRBZG1pbixcbi4uLm5vdGlmaWVycyxcbmdldFNjb3BlZEJyaWRnZTp3YWxsZXQuZ2V0U2NvcGVkQnJpZGdlfSk7XG5cbiB9LFxuZ2V0SXNzdWVyOndhbGxldEFkbWluLmdldElzc3VlcixcbmdldElzc3VlcnM6d2FsbGV0QWRtaW4uZ2V0SXNzdWVycyxcbmdldFB1cnNlOndhbGxldEFkbWluLmdldFB1cnNlLFxuZ2V0UHVyc2VzOndhbGxldEFkbWluLmdldFB1cnNlcyxcblxuZ2V0TWFyc2hhbGxlcjp3YWxsZXRBZG1pbi5nZXRNYXJzaGFsbGVyLFxuXG5sb29rdXA6d2FsbGV0QWRtaW4ubG9va3VwfSk7XG5cbnJldHVybiBoYXJkZW4od2FsbGV0KTtcbiB9XG5cbmZ1bmN0aW9uIHNldEhUVFBPYmplY3Qobyl7XG5odHRwPW87XG4gfVxuXG5mdW5jdGlvbiBzdGFydFN1YnNjcmlwdGlvbnMoKXtcbi8vXG4vL1xucHVyc2VzU3Vic2NyaWJlKFxuaGFyZGVuKHtcbm5vdGlmeShtKXtcbnB1cnNlc1N0YXRlPUpTT04ucGFyc2UobSk7XG4gfX0pKTtcblxuXG5cbi8vXG4vL1xuaW5ib3hTdWJzY3JpYmUoXG5oYXJkZW4oe1xubm90aWZ5KG0pe1xuaW5ib3hTdGF0ZT1KU09OLnBhcnNlKG0pO1xuaW5ib3hVcGRhdGVyLnVwZGF0ZVN0YXRlKGluYm94U3RhdGUpO1xuaWYoaHR0cCl7XG4vL1xuZm9yKGNvbnN0IGNoYW5uZWxIYW5kbGUgb2Ygb2ZmZXJTdWJzY3JpcHRpb25zLmtleXMoKSl7XG5wdXNoT2ZmZXJTdWJzY3JpcHRpb25zKGNoYW5uZWxIYW5kbGUsaW5ib3hTdGF0ZSk7XG4gfVxuIH1cbiB9fSkpO1xuXG5cbiB9XG5cbmZ1bmN0aW9uIGdldEJyaWRnZVVSTEhhbmRsZXIoKXtcbnJldHVybiBGYXIoJ2JyaWRnZVVSTEhhbmRsZXInLHtcbi8qXG5cblxuXG5cblxuXG5cblxuICAgICAgICovXG5cbi8qXG5cblxuXG5cblxuICAgICAgICovXG4gICAgICBhc3luYyBnZXRCb290c3RyYXAob3RoZXJTaWRlLG1ldGEsb2JqKXtcbmNvbnN0e2RhcHBPcmlnaW49bWV0YS5vcmlnaW59PW9iajtcbmNvbnN0IHN1Z2dlc3RlZERhcHBQZXRuYW1lPVN0cmluZyhcbm1ldGEucXVlcnkmJm1ldGEucXVlcnkuc3VnZ2VzdGVkRGFwcFBldG5hbWV8fFxubWV0YS5kYXBwT3JpZ2lufHxcbmRhcHBPcmlnaW4pO1xuXG5cbmNvbnN0IGFwcHJvdmU9YXN5bmMoKT0+e1xubGV0IG5vdFlldEVuYWJsZWQ9ZmFsc2U7XG5hd2FpdCB3YWxsZXRBZG1pbi53YWl0Rm9yRGFwcEFwcHJvdmFsKFxuc3VnZ2VzdGVkRGFwcFBldG5hbWUsXG5kYXBwT3JpZ2luLFxuKCk9Pntcbm5vdFlldEVuYWJsZWQ9dHJ1ZTtcbkUob3RoZXJTaWRlKS5cbm5lZWREYXBwQXBwcm92YWwoZGFwcE9yaWdpbixzdWdnZXN0ZWREYXBwUGV0bmFtZSkuXG5jYXRjaCgoXyk9PnsgfSk7XG4gfSk7XG5cbmlmKG5vdFlldEVuYWJsZWQpe1xuYXdhaXQgRShvdGhlclNpZGUpLmRhcHBBcHByb3ZlZChkYXBwT3JpZ2luKTtcbiB9XG4gfTtcblxucmV0dXJuIG1ha2VCcmlkZ2UoYXBwcm92ZSxkYXBwT3JpZ2luLG1ldGEpO1xuIH0sXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgICAgICovXG5nZXRDb21tYW5kSGFuZGxlcigpe1xucmV0dXJuIEZhcignY29tbWFuZEhhbmRsZXInLHtcbm9uT3Blbihfb2JqLG1ldGEpe1xuYnJpZGdlSGFuZGxlcy5hZGQobWV0YS5jaGFubmVsSGFuZGxlKTtcbiB9LFxub25DbG9zZShfb2JqLG1ldGEpe1xuYnJpZGdlSGFuZGxlcy5kZWxldGUobWV0YS5jaGFubmVsSGFuZGxlKTtcbm9mZmVyU3Vic2NyaXB0aW9ucy5kZWxldGUobWV0YS5jaGFubmVsSGFuZGxlKTtcbiB9LFxuXG4gICAgICBhc3luYyBvbk1lc3NhZ2Uob2JqLG1ldGEpe1xuY29uc3R7XG50eXBlLFxuZGFwcE9yaWdpbj1tZXRhLm9yaWdpbixcbnN1Z2dlc3RlZERhcHBQZXRuYW1lPW1ldGEucXVlcnkmJlxubWV0YS5xdWVyeS5zdWdnZXN0ZWREYXBwUGV0bmFtZXx8XG5vYmouZGFwcE9yaWdpbnx8XG5tZXRhLm9yaWdpbn09XG5vYmo7XG5cbi8vXG5sZXQgbmVlZEFwcHJvdmFsPWZhbHNlO1xuYXdhaXQgd2FsbGV0QWRtaW4ud2FpdEZvckRhcHBBcHByb3ZhbChcbnN1Z2dlc3RlZERhcHBQZXRuYW1lLFxuZGFwcE9yaWdpbixcbigpPT57XG5uZWVkQXBwcm92YWw9dHJ1ZTtcbmh0dHBTZW5kKFxue1xudHlwZTond2FsbGV0TmVlZERhcHBBcHByb3ZhbCcsXG5kYXRhOntcbmRhcHBPcmlnaW4sXG5zdWdnZXN0ZWREYXBwUGV0bmFtZX19LFxuXG5cblttZXRhLmNoYW5uZWxIYW5kbGVdKTtcblxuIH0pO1xuXG5pZihuZWVkQXBwcm92YWwpe1xuaHR0cFNlbmQoXG57XG50eXBlOid3YWxsZXRIYXZlRGFwcEFwcHJvdmFsJyxcbmRhdGE6e1xuZGFwcE9yaWdpbn19LFxuXG5cblttZXRhLmNoYW5uZWxIYW5kbGVdKTtcblxuIH1cblxuc3dpdGNoKHR5cGUpe1xuY2FzZSd3YWxsZXRHZXRQdXJzZXMnOntcbnJldHVybntcbnR5cGU6J3dhbGxldFVwZGF0ZVB1cnNlcycsXG5kYXRhOmJpZ2ludFN0cmluZ2lmeShwdXJzZXNTdGF0ZSl9O1xuXG4gfVxuY2FzZSd3YWxsZXRBZGRPZmZlcic6e1xubGV0IGhhbmRsZWQ9ZmFsc2U7XG5jb25zdCBhY3Rpb25zPUZhcignYWN0aW9ucycse1xuaGFuZGxlZChvZmZlcil7XG5pZihoYW5kbGVkKXtcbnJldHVybjtcbiB9XG5oYW5kbGVkPXRydWU7XG5odHRwU2VuZChcbntcbnR5cGU6J3dhbGxldE9mZmVySGFuZGxlZCcsXG5kYXRhOm9mZmVyLmlkfSxcblxuW21ldGEuY2hhbm5lbEhhbmRsZV0pO1xuXG4gfX0pO1xuXG5yZXR1cm57XG50eXBlOid3YWxsZXRPZmZlckFkZGVkJyxcbmRhdGE6YXdhaXQgd2FsbGV0QWRtaW4uYWRkT2ZmZXIoXG57Li4ub2JqLmRhdGEsYWN0aW9uc30sXG57Li4ubWV0YSxkYXBwT3JpZ2lufSl9O1xuXG5cbiB9XG5cbmNhc2Und2FsbGV0U3Vic2NyaWJlT2ZmZXJzJzp7XG5jb25zdHtzdGF0dXM9bnVsbH09b2JqO1xuY29uc3R7Y2hhbm5lbEhhbmRsZX09bWV0YTtcblxuaWYoIWNoYW5uZWxIYW5kbGUpe1xucmV0dXJue1xudHlwZTond2FsbGV0U3Vic2NyaWJlZE9mZmVycycsXG5kYXRhOmZhbHNlfTtcblxuIH1cblxuLy9cbnN1YnNjcmliZVRvT2ZmZXJzKGNoYW5uZWxIYW5kbGUse1xub3JpZ2luOmRhcHBPcmlnaW4sXG5zdGF0dXN9KTtcblxucmV0dXJue1xudHlwZTond2FsbGV0U3Vic2NyaWJlZE9mZmVycycsXG5kYXRhOnRydWV9O1xuXG4gfVxuXG5jYXNlJ3dhbGxldEdldE9mZmVycyc6e1xuY29uc3R7c3RhdHVzPW51bGx9PW9iajtcblxuLy9cbmxldCByZXN1bHQ9YXdhaXQgd2FsbGV0QWRtaW4uZ2V0T2ZmZXJzKHtcbm9yaWdpbjpkYXBwT3JpZ2lufSk7XG5cbmlmKHN0YXR1cyE9PW51bGwpe1xuLy9cbnJlc3VsdD1oYXJkZW4oXG5yZXN1bHQuZmlsdGVyKChvZmZlcik9Pm9mZmVyLnN0YXR1cz09PXN0YXR1cykpO1xuXG4gfVxuXG5yZXR1cm57XG50eXBlOid3YWxsZXRPZmZlckRlc2NyaXB0aW9ucycsXG5kYXRhOnJlc3VsdH07XG5cbiB9XG5cbmNhc2Und2FsbGV0R2V0RGVwb3NpdEZhY2V0SWQnOntcbmNvbnN0e2JyYW5kQm9hcmRJZH09b2JqO1xuY29uc3QgcmVzdWx0PVxuYXdhaXQgd2FsbGV0QWRtaW4uZ2V0RGVwb3NpdEZhY2V0SWQoYnJhbmRCb2FyZElkKTtcbnJldHVybntcbnR5cGU6J3dhbGxldERlcG9zaXRGYWNldElkUmVzcG9uc2UnLFxuZGF0YTpyZXN1bHR9O1xuXG4gfVxuXG5jYXNlJ3dhbGxldFN1Z2dlc3RJc3N1ZXInOntcbmNvbnN0e3BldG5hbWUsYm9hcmRJZH09b2JqO1xuY29uc3QgcmVzdWx0PWF3YWl0IHdhbGxldEFkbWluLnN1Z2dlc3RJc3N1ZXIoXG5wZXRuYW1lLFxuYm9hcmRJZCxcbmRhcHBPcmlnaW4pO1xuXG5yZXR1cm57XG50eXBlOid3YWxsZXRTdWdnZXN0SXNzdWVyUmVzcG9uc2UnLFxuZGF0YTpyZXN1bHR9O1xuXG4gfVxuXG5jYXNlJ3dhbGxldFN1Z2dlc3RJbnN0YW5jZSc6e1xuY29uc3R7cGV0bmFtZSxib2FyZElkfT1vYmo7XG5jb25zdCByZXN1bHQ9YXdhaXQgd2FsbGV0QWRtaW4uc3VnZ2VzdEluc3RhbmNlKFxucGV0bmFtZSxcbmJvYXJkSWQsXG5kYXBwT3JpZ2luKTtcblxucmV0dXJue1xudHlwZTond2FsbGV0U3VnZ2VzdEluc3RhbmNlUmVzcG9uc2UnLFxuZGF0YTpyZXN1bHR9O1xuXG4gfVxuXG5jYXNlJ3dhbGxldFN1Z2dlc3RJbnN0YWxsYXRpb24nOntcbmNvbnN0e3BldG5hbWUsYm9hcmRJZH09b2JqO1xuY29uc3QgcmVzdWx0PWF3YWl0IHdhbGxldEFkbWluLnN1Z2dlc3RJbnN0YWxsYXRpb24oXG5wZXRuYW1lLFxuYm9hcmRJZCxcbmRhcHBPcmlnaW4pO1xuXG5yZXR1cm57XG50eXBlOid3YWxsZXRTdWdnZXN0SW5zdGFsbGF0aW9uUmVzcG9uc2UnLFxuZGF0YTpyZXN1bHR9O1xuXG4gfVxuXG5kZWZhdWx0OlxucmV0dXJuIFByb21pc2UucmVzb2x2ZShmYWxzZSk7fVxuXG4gfX0pO1xuXG4gfX0pO1xuXG4gfVxuXG5zdGFydFN1YnNjcmlwdGlvbnMoKTtcblxuZnVuY3Rpb24gZ2V0Q29tbWFuZEhhbmRsZXIoLi4ucGFyYW1zKXtcbmNvbnNvbGUuZGVidWcoXG4nZ2V0Q29tbWFuZEhhbmRsZXIgY2FsbGVkIGluIHdhbGxldCwgYnV0IGRvZXMgbm90IGV4aXN0JyxcbnBhcmFtcyk7XG5cbiB9XG5cbnJldHVybiBGYXIoJ3Jvb3QnLHtcbnN0YXJ0dXAsXG5nZXRXYWxsZXQsXG5zZXRIVFRQT2JqZWN0LFxuZ2V0QnJpZGdlVVJMSGFuZGxlcixcbmdldENvbW1hbmRIYW5kbGVyfSk7XG5cbiB9XG5cbi8qXG5cblxuXG5cblxuICovXG5mdW5jdGlvbiAgICAgICAgICAgICAgICBzcGF3bih0ZXJtcyxfaW52aXRlTWFrZXIpe1xuY29uc3Qgd2FsbGV0VmF0PWJ1aWxkUm9vdE9iamVjdCgpO1xucmV0dXJuIHdhbGxldFZhdC5zdGFydHVwKHRlcm1zKS50aGVuKChfKT0+d2FsbGV0VmF0KTtcbiB9JGjNj19vbmNlLmRlZmF1bHQoICAgICBzcGF3bik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXSwiYnVpbGRSb290T2JqZWN0IjpbImJ1aWxkUm9vdE9iamVjdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABweatGXRkAAF0ZAAA5AAAAQGFnb3JpYy96b2UtdjAuMjcuMC11MTkuMi9zcmMvY29udHJhY3RTdXBwb3J0L3JlY29yZGVyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL25vdGlmaWVyIiwiQGFnb3JpYy9ub3RpZmllci90b29scy90ZXN0U3VwcG9ydHMuanMiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiXSwiZXhwb3J0cyI6WyJSZWNvcmRlcktpdFNoYXBlIiwiZGVmaW5lRVJlY29yZGVyS2l0IiwiZGVmaW5lUmVjb3JkZXJLaXQiLCJwcmVwYXJlTW9ja1JlY29yZGVyS2l0TWFrZXJzIiwicHJlcGFyZVJlY29yZGVyIiwicHJlcGFyZVJlY29yZGVyS2l0IiwicHJlcGFyZVJlY29yZGVyS2l0TWFrZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgRmFpbCxTdG9yYWdlTm9kZVNoYXBlLHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCxtYWtlRmFrZU1hcnNoYWxsZXIsbWFrZUZha2VTdG9yYWdlLG11c3RNYXRjaCxNLG1ha2VTY2FsYXJCaWdNYXBTdG9yZSxwcmVwYXJlRXhvQ2xhc3MsRTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLCBbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wiU3RvcmFnZU5vZGVTaGFwZVwiLCBbJGjNj19hID0+IChTdG9yYWdlTm9kZVNoYXBlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0XCIsIFskaM2PX2EgPT4gKHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXIvdG9vbHMvdGVzdFN1cHBvcnRzLmpzXCIsIFtbXCJtYWtlRmFrZU1hcnNoYWxsZXJcIiwgWyRozY9fYSA9PiAobWFrZUZha2VNYXJzaGFsbGVyID0gJGjNj19hKV1dLFtcIm1ha2VGYWtlU3RvcmFnZVwiLCBbJGjNj19hID0+IChtYWtlRmFrZVN0b3JhZ2UgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtdXN0TWF0Y2hcIiwgWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wiTVwiLCBbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcIm1ha2VTY2FsYXJCaWdNYXBTdG9yZVwiLCBbJGjNj19hID0+IChtYWtlU2NhbGFyQmlnTWFwU3RvcmUgPSAkaM2PX2EpXV0sW1wicHJlcGFyZUV4b0NsYXNzXCIsIFskaM2PX2EgPT4gKHByZXBhcmVFeG9DbGFzcyA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuICovXG5cbi8qXG5cblxuICovXG5cbi8qXG5cblxuICovXG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIHByZXBhcmVSZWNvcmRlcj0oYmFnZ2FnZSxtYXJzaGFsbGVyKT0+e1xuY29uc3QgbWFrZVJlY29yZGVyPXByZXBhcmVFeG9DbGFzcyhcbmJhZ2dhZ2UsXG4nUmVjb3JkZXInLFxuTS5pbnRlcmZhY2UoJ1JlY29yZGVyJyx7XG5nZXRTdG9yYWdlTm9kZTpNLmNhbGwoKS5yZXR1cm5zKFN0b3JhZ2VOb2RlU2hhcGUpLFxuZ2V0U3RvcmFnZVBhdGg6TS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG53cml0ZTpNLmNhbGwoTS5hbnkoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG53cml0ZUZpbmFsOk0uY2FsbChNLmFueSgpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKX0pLFxuXG4vKlxuXG5cblxuXG4gICAgICovXG4oXG5wdWJsaXNoZXIsXG5zdG9yYWdlTm9kZSxcbnZhbHVlU2hhcGU9LyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9NLmFueSgpKT0+XG57XG5yZXR1cm57XG5jbG9zZWQ6ZmFsc2UsXG5wdWJsaXNoZXIsXG5zdG9yYWdlTm9kZSxcbnN0b3JhZ2VQYXRoOi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL3VuZGVmaW5lZCxcbnZhbHVlU2hhcGV9O1xuXG4gfSxcbntcbmdldFN0b3JhZ2VOb2RlKCl7XG5yZXR1cm4gdGhpcy5zdGF0ZS5zdG9yYWdlTm9kZTtcbiB9LFxuLypcblxuXG5cbiAgICAgICAqL1xuICAgICAgYXN5bmMgZ2V0U3RvcmFnZVBhdGgoKXtcbmNvbnN0e3N0b3JhZ2VQYXRoOmhlbGRQYXRofT10aGlzLnN0YXRlO1xuLy9cbmF3YWl0IG51bGw7XG5pZihoZWxkUGF0aCE9PXVuZGVmaW5lZCl7XG5yZXR1cm4gaGVsZFBhdGg7XG4gfVxuY29uc3QgcGF0aD1hd2FpdCBFKHRoaXMuc3RhdGUuc3RvcmFnZU5vZGUpLmdldFBhdGgoKTtcbnRoaXMuc3RhdGUuc3RvcmFnZVBhdGg9cGF0aDtcbnJldHVybiBwYXRoO1xuIH0sXG4vKlxuXG5cblxuXG4gICAgICAgKi9cbiAgICAgIGFzeW5jIHdyaXRlKHZhbHVlKXtcbmNvbnN0e2Nsb3NlZCxwdWJsaXNoZXIsc3RvcmFnZU5vZGUsdmFsdWVTaGFwZX09dGhpcy5zdGF0ZTtcbiFjbG9zZWR8fEZhaWwgYGNhbm5vdCB3cml0ZSB0byBjbG9zZWQgcmVjb3JkZXJgO1xubXVzdE1hdGNoKHZhbHVlLHZhbHVlU2hhcGUpO1xuY29uc3QgZW5jb2RlZD1hd2FpdCBFKG1hcnNoYWxsZXIpLnRvQ2FwRGF0YSh2YWx1ZSk7XG5jb25zdCBzZXJpYWxpemVkPUpTT04uc3RyaW5naWZ5KGVuY29kZWQpO1xuYXdhaXQgRShzdG9yYWdlTm9kZSkuc2V0VmFsdWUoc2VyaWFsaXplZCk7XG5cbi8vXG5yZXR1cm4gcHVibGlzaGVyLnB1Ymxpc2godmFsdWUpO1xuIH0sXG4vKlxuXG5cblxuXG4gICAgICAgKi9cbiAgICAgIGFzeW5jIHdyaXRlRmluYWwodmFsdWUpe1xuY29uc3R7Y2xvc2VkLHB1Ymxpc2hlcixzdG9yYWdlTm9kZSx2YWx1ZVNoYXBlfT10aGlzLnN0YXRlO1xuIWNsb3NlZHx8RmFpbCBgY2Fubm90IHdyaXRlIHRvIGNsb3NlZCByZWNvcmRlcmA7XG5tdXN0TWF0Y2godmFsdWUsdmFsdWVTaGFwZSk7XG5jb25zdCBlbmNvZGVkPWF3YWl0IEUobWFyc2hhbGxlcikudG9DYXBEYXRhKHZhbHVlKTtcbmNvbnN0IHNlcmlhbGl6ZWQ9SlNPTi5zdHJpbmdpZnkoZW5jb2RlZCk7XG5hd2FpdCBFKHN0b3JhZ2VOb2RlKS5zZXRWYWx1ZShzZXJpYWxpemVkKTtcblxuLy9cbnRoaXMuc3RhdGUuY2xvc2VkPXRydWU7XG5yZXR1cm4gcHVibGlzaGVyLmZpbmlzaCh2YWx1ZSk7XG4gfX0pO1xuXG5cblxucmV0dXJuIG1ha2VSZWNvcmRlcjtcbiB9OyRozY9fb25jZS5wcmVwYXJlUmVjb3JkZXIocHJlcGFyZVJlY29yZGVyKTtcbmhhcmRlbihwcmVwYXJlUmVjb3JkZXIpO1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBkZWZpbmVSZWNvcmRlcktpdD0oe21ha2VSZWNvcmRlcixtYWtlRHVyYWJsZVB1Ymxpc2hLaXR9KT0+e1xuLypcblxuXG5cblxuICAgKi9cbmNvbnN0IG1ha2VSZWNvcmRlcktpdD0oc3RvcmFnZU5vZGUsdmFsdWVTaGFwZSk9PntcbmNvbnN0e3N1YnNjcmliZXIscHVibGlzaGVyfT1tYWtlRHVyYWJsZVB1Ymxpc2hLaXQoKTtcbmNvbnN0IHJlY29yZGVyPW1ha2VSZWNvcmRlcihcbnB1Ymxpc2hlcixcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5zdG9yYWdlTm9kZSxcblxudmFsdWVTaGFwZSk7XG5cbnJldHVybiBoYXJkZW4oe3N1YnNjcmliZXIscmVjb3JkZXJ9KTtcbiB9O1xucmV0dXJuIG1ha2VSZWNvcmRlcktpdDtcbiB9O1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5kZWZpbmVSZWNvcmRlcktpdChkZWZpbmVSZWNvcmRlcktpdCk7XG5jb25zdCAgICAgICAgZGVmaW5lRVJlY29yZGVyS2l0PSh7bWFrZVJlY29yZGVyLG1ha2VEdXJhYmxlUHVibGlzaEtpdH0pPT57XG4vKlxuXG5cblxuXG4gICAqL1xuY29uc3QgbWFrZUVSZWNvcmRlcktpdD0oc3RvcmFnZU5vZGVQLHZhbHVlU2hhcGUpPT57XG5jb25zdHtwdWJsaXNoZXIsc3Vic2NyaWJlcn09bWFrZUR1cmFibGVQdWJsaXNoS2l0KCk7XG5jb25zdCByZWNvcmRlclA9RS53aGVuKHN0b3JhZ2VOb2RlUCwoc3RvcmFnZU5vZGUpPT5cbm1ha2VSZWNvcmRlcihcbnB1Ymxpc2hlcixcbi8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL3N0b3JhZ2VOb2RlLFxudmFsdWVTaGFwZSkpO1xuXG5cbnJldHVybntzdWJzY3JpYmVyLHJlY29yZGVyUH07XG4gfTtcbnJldHVybiBtYWtlRVJlY29yZGVyS2l0O1xuIH07JGjNj19vbmNlLmRlZmluZUVSZWNvcmRlcktpdChkZWZpbmVFUmVjb3JkZXJLaXQpO1xuaGFyZGVuKGRlZmluZUVSZWNvcmRlcktpdCk7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgcHJlcGFyZVJlY29yZGVyS2l0PShiYWdnYWdlLG1hcnNoYWxsZXIpPT57XG5jb25zdCBtYWtlRHVyYWJsZVB1Ymxpc2hLaXQ9cHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0KFxuYmFnZ2FnZSxcbidEdXJhYmxlIFB1Ymxpc2ggS2l0Jyk7XG5cbmNvbnN0IG1ha2VSZWNvcmRlcj1wcmVwYXJlUmVjb3JkZXIoYmFnZ2FnZSxtYXJzaGFsbGVyKTtcbnJldHVybiBkZWZpbmVSZWNvcmRlcktpdCh7bWFrZUR1cmFibGVQdWJsaXNoS2l0LG1ha2VSZWNvcmRlcn0pO1xuIH07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UucHJlcGFyZVJlY29yZGVyS2l0KHByZXBhcmVSZWNvcmRlcktpdCk7XG5jb25zdCAgICAgICAgcHJlcGFyZVJlY29yZGVyS2l0TWFrZXJzPShiYWdnYWdlLG1hcnNoYWxsZXIpPT57XG5jb25zdCBtYWtlRHVyYWJsZVB1Ymxpc2hLaXQ9cHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0KFxuYmFnZ2FnZSxcbidEdXJhYmxlIFB1Ymxpc2ggS2l0Jyk7XG5cbmNvbnN0IG1ha2VSZWNvcmRlcj1wcmVwYXJlUmVjb3JkZXIoYmFnZ2FnZSxtYXJzaGFsbGVyKTtcblxuY29uc3QgbWFrZVJlY29yZGVyS2l0PWRlZmluZVJlY29yZGVyS2l0KHtcbm1ha2VSZWNvcmRlcixcbm1ha2VEdXJhYmxlUHVibGlzaEtpdH0pO1xuXG5jb25zdCBtYWtlRVJlY29yZGVyS2l0PWRlZmluZUVSZWNvcmRlcktpdCh7XG5tYWtlUmVjb3JkZXIsXG5tYWtlRHVyYWJsZVB1Ymxpc2hLaXR9KTtcblxuXG5yZXR1cm57XG5tYWtlRHVyYWJsZVB1Ymxpc2hLaXQsXG5tYWtlUmVjb3JkZXIsXG5tYWtlUmVjb3JkZXJLaXQsXG5tYWtlRVJlY29yZGVyS2l0fTtcblxuIH07XG5cbi8qXG5cbiAqLyRozY9fb25jZS5wcmVwYXJlUmVjb3JkZXJLaXRNYWtlcnMocHJlcGFyZVJlY29yZGVyS2l0TWFrZXJzKTtcbmNvbnN0ICAgICAgICBwcmVwYXJlTW9ja1JlY29yZGVyS2l0TWFrZXJzPSgpPT57XG5jb25zdCBiYWdnYWdlPW1ha2VTY2FsYXJCaWdNYXBTdG9yZSgnbW9jayByZWNvcmRlciBiYWdnYWdlJyk7XG5jb25zdCBtYXJzaGFsbGVyPW1ha2VGYWtlTWFyc2hhbGxlcigpO1xucmV0dXJue1xuLi4ucHJlcGFyZVJlY29yZGVyS2l0TWFrZXJzKGJhZ2dhZ2UsbWFyc2hhbGxlciksXG5zdG9yYWdlTm9kZTptYWtlRmFrZVN0b3JhZ2UoJ21vY2sgcmVjb3JkZXIgc3RvcmFnZScpfTtcblxuIH07JGjNj19vbmNlLnByZXBhcmVNb2NrUmVjb3JkZXJLaXRNYWtlcnMocHJlcGFyZU1vY2tSZWNvcmRlcktpdE1ha2Vycyk7XG5cbmNvbnN0ICAgICAgICBSZWNvcmRlcktpdFNoYXBlPXtcbnJlY29yZGVyOk0ucmVtb3RhYmxlKCksXG5zdWJzY3JpYmVyOk0ucmVtb3RhYmxlKCl9OyRozY9fb25jZS5SZWNvcmRlcktpdFNoYXBlKFJlY29yZGVyS2l0U2hhcGUpO1xuXG5oYXJkZW4oUmVjb3JkZXJLaXRTaGFwZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwcmVwYXJlUmVjb3JkZXIiOlsicHJlcGFyZVJlY29yZGVyIl0sImRlZmluZVJlY29yZGVyS2l0IjpbImRlZmluZVJlY29yZGVyS2l0Il0sImRlZmluZUVSZWNvcmRlcktpdCI6WyJkZWZpbmVFUmVjb3JkZXJLaXQiXSwicHJlcGFyZVJlY29yZGVyS2l0IjpbInByZXBhcmVSZWNvcmRlcktpdCJdLCJwcmVwYXJlUmVjb3JkZXJLaXRNYWtlcnMiOlsicHJlcGFyZVJlY29yZGVyS2l0TWFrZXJzIl0sInByZXBhcmVNb2NrUmVjb3JkZXJLaXRNYWtlcnMiOlsicHJlcGFyZU1vY2tSZWNvcmRlcktpdE1ha2VycyJdLCJSZWNvcmRlcktpdFNoYXBlIjpbIlJlY29yZGVyS2l0U2hhcGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA/eM5cbcBAAC3AQAAJAAAAEBhZ29yaWMvem9uZS12MC4zLjAtdTE5LjIvZHVyYWJsZS5qc3siaW1wb3J0cyI6WyIuL3NyYy9kdXJhYmxlLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9zcmMvZHVyYWJsZS5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjNj19pbXBvcnRzKFtbXCIuL3NyYy9kdXJhYmxlLmpzXCIsIFtdXV0pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAL0ecno5EQAAOREAACgAAABAYWdvcmljL3pvbmUtdjAuMy4wLXUxOS4yL3NyYy9kdXJhYmxlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGFnb3JpYy9iYXNlLXpvbmUiXSwiZXhwb3J0cyI6WyJtYWtlRHVyYWJsZVpvbmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBGYWlsLEZhcixpc1Bhc3NhYmxlLGNhbkJlRHVyYWJsZSxtYWtlU2NhbGFyTWFwU3RvcmUscHJlcGFyZUV4byxwcmVwYXJlRXhvQ2xhc3MscHJlcGFyZUV4b0NsYXNzS2l0LHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUscHJvdmlkZUR1cmFibGVTZXRTdG9yZSxwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSxwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSx3YXRjaFByb21pc2Usa2V5cyxtYWtlT25jZUtpdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLCBbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiRmFyXCIsIFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXSxbXCJpc1Bhc3NhYmxlXCIsIFskaM2PX2EgPT4gKGlzUGFzc2FibGUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJjYW5CZUR1cmFibGVcIiwgWyRozY9fYSA9PiAoY2FuQmVEdXJhYmxlID0gJGjNj19hKV1dLFtcIm1ha2VTY2FsYXJNYXBTdG9yZVwiLCBbJGjNj19hID0+IChtYWtlU2NhbGFyTWFwU3RvcmUgPSAkaM2PX2EpXV0sW1wicHJlcGFyZUV4b1wiLCBbJGjNj19hID0+IChwcmVwYXJlRXhvID0gJGjNj19hKV1dLFtcInByZXBhcmVFeG9DbGFzc1wiLCBbJGjNj19hID0+IChwcmVwYXJlRXhvQ2xhc3MgPSAkaM2PX2EpXV0sW1wicHJlcGFyZUV4b0NsYXNzS2l0XCIsIFskaM2PX2EgPT4gKHByZXBhcmVFeG9DbGFzc0tpdCA9ICRozY9fYSldXSxbXCJwcm92aWRlRHVyYWJsZU1hcFN0b3JlXCIsIFskaM2PX2EgPT4gKHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUgPSAkaM2PX2EpXV0sW1wicHJvdmlkZUR1cmFibGVTZXRTdG9yZVwiLCBbJGjNj19hID0+IChwcm92aWRlRHVyYWJsZVNldFN0b3JlID0gJGjNj19hKV1dLFtcInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlXCIsIFskaM2PX2EgPT4gKHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlID0gJGjNj19hKV1dLFtcInByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlXCIsIFskaM2PX2EgPT4gKHByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlID0gJGjNj19hKV1dLFtcIndhdGNoUHJvbWlzZVwiLCBbJGjNj19hID0+ICh3YXRjaFByb21pc2UgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2Jhc2Utem9uZVwiLCBbW1wiYWdvcmljVmF0RGF0YUtleXNcIiwgWyRozY9fYSA9PiAoa2V5cyA9ICRozY9fYSldXSxbXCJtYWtlT25jZUtpdFwiLCBbJGjNj19hID0+IChtYWtlT25jZUtpdCA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLypcblxuXG5cblxuICovXG5jb25zdCBpc1N0b3JhYmxlPShzcGVjaW1lbik9PmlzUGFzc2FibGUoc3BlY2ltZW4pJiZjYW5CZUR1cmFibGUoc3BlY2ltZW4pO1xuaGFyZGVuKGlzU3RvcmFibGUpO1xuXG4vKlxuXG4gKi9cbmNvbnN0IGF0dGFjaER1cmFibGVTdG9yZXM9KGdldEJhZ2dhZ2UpPT57XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBtYXBTdG9yZT0obGFiZWwsb3B0aW9ucyk9PntcbmNvbnN0IGJhZ2dhZ2U9Z2V0QmFnZ2FnZSgpO1xuY29uc3QgcmV0PXByb3ZpZGVEdXJhYmxlTWFwU3RvcmUoYmFnZ2FnZSxsYWJlbCxvcHRpb25zKTtcbnJldHVybiByZXQ7XG4gfTtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHNldFN0b3JlPShsYWJlbCxvcHRpb25zKT0+XG5wcm92aWRlRHVyYWJsZVNldFN0b3JlKGdldEJhZ2dhZ2UoKSxsYWJlbCxvcHRpb25zKTtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCB3ZWFrU2V0U3RvcmU9KGxhYmVsLG9wdGlvbnMpPT5cbnByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlKGdldEJhZ2dhZ2UoKSxsYWJlbCxvcHRpb25zKTtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCB3ZWFrTWFwU3RvcmU9KGxhYmVsLG9wdGlvbnMpPT5cbnByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKGdldEJhZ2dhZ2UoKSxsYWJlbCxvcHRpb25zKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5yZXR1cm4gRmFyKCdkdXJhYmxlU3RvcmVzJyx7XG5kZXRhY2hlZDooKT0+ZGV0YWNoZWREdXJhYmxlU3RvcmVzLFxuaXNTdG9yYWJsZSxcbm1hcFN0b3JlLFxuc2V0U3RvcmUsXG53ZWFrTWFwU3RvcmUsXG53ZWFrU2V0U3RvcmV9KTtcblxuIH07XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgZGV0YWNoZWREdXJhYmxlU3RvcmVzPWF0dGFjaER1cmFibGVTdG9yZXMoKCk9PlxubWFrZVNjYWxhck1hcFN0b3JlKCdkZXRhY2hlZCcpKTtcblxuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIG1ha2VEdXJhYmxlWm9uZT0oYmFnZ2FnZSxiYXNlTGFiZWw9J2R1cmFibGVab25lJyk9PntcbmJhZ2dhZ2V8fEZhaWwgYGJhZ2dhZ2UgcmVxdWlyZWRgO1xuXG5jb25zdCBhdHRhY2hlZFN0b3Jlcz1hdHRhY2hEdXJhYmxlU3RvcmVzKCgpPT5iYWdnYWdlKTtcblxuY29uc3R7bWFrZU9uY2Usd3JhcFByb3ZpZGVyfT1tYWtlT25jZUtpdChcbmJhc2VMYWJlbCxcbmF0dGFjaGVkU3RvcmVzLFxuYmFnZ2FnZSk7XG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgZXhvQ2xhc3M9KC4uLmFyZ3MpPT5wcmVwYXJlRXhvQ2xhc3MoYmFnZ2FnZSwuLi5hcmdzKTtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8vXG4vL1xuY29uc3QgZXhvQ2xhc3NLaXQ9KC4uLmFyZ3MpPT5wcmVwYXJlRXhvQ2xhc3NLaXQoYmFnZ2FnZSwuLi5hcmdzKTtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBleG89KC4uLmFyZ3MpPT5wcmVwYXJlRXhvKGJhZ2dhZ2UsLi4uYXJncyk7XG5cbmNvbnN0IHN1YlpvbmVTdG9yZT13cmFwUHJvdmlkZXIoYXR0YWNoZWRTdG9yZXMubWFwU3RvcmUsa2V5cy56b25lKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBzdWJab25lPShsYWJlbCxvcHRpb25zPXt9KT0+e1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHN1YkJhZ2dhZ2U9c3ViWm9uZVN0b3JlKGxhYmVsLG9wdGlvbnMpO1xucmV0dXJuIG1ha2VEdXJhYmxlWm9uZShzdWJCYWdnYWdlLCBgJHtiYXNlTGFiZWx9LiR7bGFiZWx9YCk7XG4gfTtcblxucmV0dXJuIEZhcignZHVyYWJsZVpvbmUnLHtcbmV4bzp3cmFwUHJvdmlkZXIoZXhvLGtleXMuZXhvKSxcbmV4b0NsYXNzOndyYXBQcm92aWRlcihleG9DbGFzcyxrZXlzLmV4b0NsYXNzKSxcbmV4b0NsYXNzS2l0OndyYXBQcm92aWRlcihleG9DbGFzc0tpdCxrZXlzLmV4b0NsYXNzS2l0KSxcbnN1YlpvbmUsXG5cbm1ha2VPbmNlLFxud2F0Y2hQcm9taXNlLFxuZGV0YWNoZWQ6YXR0YWNoZWRTdG9yZXMuZGV0YWNoZWQsXG5pc1N0b3JhYmxlOmF0dGFjaGVkU3RvcmVzLmlzU3RvcmFibGUsXG5cbm1hcFN0b3JlOndyYXBQcm92aWRlcihhdHRhY2hlZFN0b3Jlcy5tYXBTdG9yZSxrZXlzLnN0b3JlKSxcbnNldFN0b3JlOndyYXBQcm92aWRlcihhdHRhY2hlZFN0b3Jlcy5zZXRTdG9yZSxrZXlzLnN0b3JlKSxcbndlYWtNYXBTdG9yZTp3cmFwUHJvdmlkZXIoYXR0YWNoZWRTdG9yZXMud2Vha01hcFN0b3JlLGtleXMuc3RvcmUpLFxud2Vha1NldFN0b3JlOndyYXBQcm92aWRlcihhdHRhY2hlZFN0b3Jlcy53ZWFrU2V0U3RvcmUsa2V5cy5zdG9yZSl9KTtcblxuIH07JGjNj19vbmNlLm1ha2VEdXJhYmxlWm9uZShtYWtlRHVyYWJsZVpvbmUpO1xuaGFyZGVuKG1ha2VEdXJhYmxlWm9uZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRHVyYWJsZVpvbmUiOlsibWFrZUR1cmFibGVab25lIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACoyYzj2BAAA9gQAACsAAABAZW5kby9jb21tb24tdjEuMi45L2FwcGx5LWxhYmVsaW5nLWVycm9yLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9wcm9taXNlLWtpdCIsIi4vdGhyb3ctbGFiZWxlZC5qcyJdLCJleHBvcnRzIjpbImFwcGx5TGFiZWxpbmdFcnJvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IEUsaXNQcm9taXNlLHRocm93TGFiZWxlZDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIiwgWyRozY9fYSA9PiAoaXNQcm9taXNlID0gJGjNj19hKV1dXV0sW1wiLi90aHJvdy1sYWJlbGVkLmpzXCIsIFtbXCJ0aHJvd0xhYmVsZWRcIiwgWyRozY9fYSA9PiAodGhyb3dMYWJlbGVkID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGFwcGx5TGFiZWxpbmdFcnJvcj0oZnVuYyxhcmdzLGxhYmVsPXVuZGVmaW5lZCk9PntcbmlmKGxhYmVsPT09dW5kZWZpbmVkKXtcbnJldHVybiBmdW5jKC4uLmFyZ3MpO1xuIH1cbmxldCByZXN1bHQ7XG50cnl7XG5yZXN1bHQ9ZnVuYyguLi5hcmdzKTtcbiB9Y2F0Y2goZXJyKXtcbnRocm93TGFiZWxlZChlcnIsbGFiZWwpO1xuIH1cbmlmKGlzUHJvbWlzZShyZXN1bHQpKXtcbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbnJldHVybiBFLndoZW4ocmVzdWx0LHVuZGVmaW5lZCwocmVhc29uKT0+dGhyb3dMYWJlbGVkKHJlYXNvbixsYWJlbCkpO1xuIH1lbHNle1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfTskaM2PX29uY2UuYXBwbHlMYWJlbGluZ0Vycm9yKGFwcGx5TGFiZWxpbmdFcnJvcik7XG5oYXJkZW4oYXBwbHlMYWJlbGluZ0Vycm9yKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFwcGx5TGFiZWxpbmdFcnJvciI6WyJhcHBseUxhYmVsaW5nRXJyb3IiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAACX+gTIsEAACLBAAAKgAAAEBlbmRvL2NvbW1vbi12MS4yLjkvZnJvbS11bmlxdWUtZW50cmllcy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJmcm9tVW5pcXVlRW50cmllcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IHEsRmFpbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLCBbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIiwgWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dXSk7ICAgXG5cbmNvbnN0e2Zyb21FbnRyaWVzfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBmcm9tVW5pcXVlRW50cmllcz0oYWxsRW50cmllcyk9PntcbmNvbnN0IGVudHJpZXNBcnJheT1bLi4uYWxsRW50cmllc107XG5jb25zdCByZXN1bHQ9aGFyZGVuKGZyb21FbnRyaWVzKGVudHJpZXNBcnJheSkpO1xuaWYob3duS2V5cyhyZXN1bHQpLmxlbmd0aD09PWVudHJpZXNBcnJheS5sZW5ndGgpe1xucmV0dXJuIHJlc3VsdDtcbiB9XG5jb25zdCBuYW1lcz1uZXcgU2V0KCk7XG5mb3IoY29uc3RbbmFtZSxfXW9mIGVudHJpZXNBcnJheSl7XG5pZihuYW1lcy5oYXMobmFtZSkpe1xuRmFpbCBgY29sbGlzaW9uIG9uIHByb3BlcnR5IG5hbWUgJHtxKG5hbWUpfTogJHtlbnRyaWVzQXJyYXl9YDtcbiB9XG5uYW1lcy5hZGQobmFtZSk7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IGZhaWxlZCB0byBjcmVhdGUgb2JqZWN0IGZyb20gdW5pcXVlIGVudHJpZXNgO1xuIH07JGjNj19vbmNlLmZyb21VbmlxdWVFbnRyaWVzKGZyb21VbmlxdWVFbnRyaWVzKTtcbmhhcmRlbihmcm9tVW5pcXVlRW50cmllcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJmcm9tVW5pcXVlRW50cmllcyI6WyJmcm9tVW5pcXVlRW50cmllcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC9GBLtZgIAAGYCAAAkAAAAQGVuZG8vY29tbW9uLXYxLjIuOS9pZGVudC1jaGVja2VyLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJpZGVudENoZWNrZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRozY9faW1wb3J0cyhbXSk7ICAgLy9cbi8vXG4vL1xuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGlkZW50Q2hlY2tlcj0oY29uZCxfZGV0YWlscyk9PmNvbmQ7JGjNj19vbmNlLmlkZW50Q2hlY2tlcihpZGVudENoZWNrZXIpO1xuaGFyZGVuKGlkZW50Q2hlY2tlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpZGVudENoZWNrZXIiOlsiaWRlbnRDaGVja2VyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACT2bBGnAgAApwIAACYAAABAZW5kby9jb21tb24tdjEuMi45L2xpc3QtZGlmZmVyZW5jZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibGlzdERpZmZlcmVuY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRozY9faW1wb3J0cyhbXSk7ICAgLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGxpc3REaWZmZXJlbmNlPShsZWZ0TGlzdCxyaWdodExpc3QpPT57XG5jb25zdCByaWdodFNldD1uZXcgU2V0KHJpZ2h0TGlzdCk7XG5yZXR1cm4gbGVmdExpc3QuZmlsdGVyKChlbGVtZW50KT0+IXJpZ2h0U2V0LmhhcyhlbGVtZW50KSk7XG4gfTskaM2PX29uY2UubGlzdERpZmZlcmVuY2UobGlzdERpZmZlcmVuY2UpO1xuaGFyZGVuKGxpc3REaWZmZXJlbmNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Imxpc3REaWZmZXJlbmNlIjpbImxpc3REaWZmZXJlbmNlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMnTMsiMAwAAjAMAACoAAABAZW5kby9jb21tb24tdjEuMi45L21ha2UtYXJyYXktaXRlcmF0b3IuanN7ImltcG9ydHMiOlsiLi9tYWtlLWl0ZXJhdG9yLmpzIl0sImV4cG9ydHMiOlsibWFrZUFycmF5SXRlcmF0b3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBtYWtlSXRlcmF0b3I7JGjNj19pbXBvcnRzKFtbXCIuL21ha2UtaXRlcmF0b3IuanNcIiwgW1tcIm1ha2VJdGVyYXRvclwiLCBbJGjNj19hID0+IChtYWtlSXRlcmF0b3IgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIG1ha2VBcnJheUl0ZXJhdG9yPShhcnIpPT57XG5jb25zdHtsZW5ndGh9PWFycjtcbmxldCBpPTA7XG5yZXR1cm4gbWFrZUl0ZXJhdG9yKCgpPT57XG4vKiAgICAgICAgICAgICovXG5sZXQgdmFsdWU7XG5pZihpPGxlbmd0aCl7XG52YWx1ZT1hcnJbaV07XG5pKz0xO1xucmV0dXJuIGhhcmRlbih7ZG9uZTpmYWxzZSx2YWx1ZX0pO1xuIH1cbi8vXG5yZXR1cm4gaGFyZGVuKHtkb25lOnRydWUsdmFsdWV9KTtcbiB9KTtcbiB9OyRozY9fb25jZS5tYWtlQXJyYXlJdGVyYXRvcihtYWtlQXJyYXlJdGVyYXRvcik7XG5oYXJkZW4obWFrZUFycmF5SXRlcmF0b3IpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUFycmF5SXRlcmF0b3IiOlsibWFrZUFycmF5SXRlcmF0b3IiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAALXItnGgCAABoAgAAJAAAAEBlbmRvL2NvbW1vbi12MS4yLjkvbWFrZS1pdGVyYXRvci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWFrZUl0ZXJhdG9yIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaM2PX2ltcG9ydHMoW10pOyAgIC8qXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZUl0ZXJhdG9yPShuZXh0KT0+e1xuY29uc3QgaXRlcj1oYXJkZW4oe1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9Pml0ZXIsXG5uZXh0fSk7XG5cbnJldHVybiBpdGVyO1xuIH07JGjNj19vbmNlLm1ha2VJdGVyYXRvcihtYWtlSXRlcmF0b3IpO1xuaGFyZGVuKG1ha2VJdGVyYXRvcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlSXRlcmF0b3IiOlsibWFrZUl0ZXJhdG9yIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAArPU6wxAwAAMQMAACEAAABAZW5kby9jb21tb24tdjEuMi45L29iamVjdC1tYXAuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm9iamVjdE1hcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjNj19pbXBvcnRzKFtdKTsgICBjb25zdHtlbnRyaWVzLGZyb21FbnRyaWVzfT1PYmplY3Q7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIG9iamVjdE1hcD0ob3JpZ2luYWwsbWFwRm4pPT57XG5jb25zdCBlbnRzPWVudHJpZXMob3JpZ2luYWwpO1xuY29uc3QgbWFwRW50cz1lbnRzLm1hcChcbihbayx2XSk9Pi8qICAgICAgICAgICAgICAgICAgICAgICAqL1trLG1hcEZuKHYsayldKTtcblxucmV0dXJuICgvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9oYXJkZW4oZnJvbUVudHJpZXMobWFwRW50cykpKTtcbiB9OyRozY9fb25jZS5vYmplY3RNYXAob2JqZWN0TWFwKTtcbmhhcmRlbihvYmplY3RNYXApO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsib2JqZWN0TWFwIjpbIm9iamVjdE1hcCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACGSuucEAQAABAEAAAmAAAAQGVuZG8vY29tbW9uLXYxLjIuOS9vYmplY3QtbWV0YS1tYXAuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm9iamVjdE1ldGFNYXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRozY9faW1wb3J0cyhbXSk7ICAgY29uc3R7Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyxjcmVhdGUsZnJvbUVudHJpZXN9PU9iamVjdDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgb2JqZWN0TWV0YU1hcD0oXG5vcmlnaW5hbCxcbm1ldGFNYXBGbixcbnByb3RvPU9iamVjdC5wcm90b3R5cGUpPT5cbntcbmNvbnN0IGRlc2NzPWdldE93blByb3BlcnR5RGVzY3JpcHRvcnMob3JpZ2luYWwpO1xuY29uc3Qga2V5cz1vd25LZXlzKG9yaWdpbmFsKTtcblxuY29uc3QgZGVzY0VudHJpZXM9LyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xua2V5cy5cbm1hcCgoa2V5KT0+W2tleSxtZXRhTWFwRm4oZGVzY3Nba2V5XSxrZXkpXSkuXG5maWx0ZXIoKFtfa2V5LG9wdERlc2NdKT0+b3B0RGVzYyE9PXVuZGVmaW5lZCk7XG5cbnJldHVybiBoYXJkZW4oY3JlYXRlKHByb3RvLGZyb21FbnRyaWVzKGRlc2NFbnRyaWVzKSkpO1xuIH07JGjNj19vbmNlLm9iamVjdE1ldGFNYXAob2JqZWN0TWV0YU1hcCk7XG5oYXJkZW4ob2JqZWN0TWV0YU1hcCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJvYmplY3RNZXRhTWFwIjpbIm9iamVjdE1ldGFNYXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAu7kYJRAEAAAQBAAAJAAAAEBlbmRvL2NvbW1vbi12MS4yLjkvdGhyb3ctbGFiZWxlZC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJ0aHJvd0xhYmVsZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBYLG1ha2VFcnJvcixhbm5vdGF0ZUVycm9yOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsIFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wibWFrZUVycm9yXCIsIFskaM2PX2EgPT4gKG1ha2VFcnJvciA9ICRozY9fYSldXSxbXCJhbm5vdGF0ZUVycm9yXCIsIFskaM2PX2EgPT4gKGFubm90YXRlRXJyb3IgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgdGhyb3dMYWJlbGVkPShcbmlubmVyRXJyLFxubGFiZWwsXG5lcnJDb25zdHJ1Y3Rvcj11bmRlZmluZWQsXG5vcHRpb25zPXVuZGVmaW5lZCk9Plxue1xuaWYodHlwZW9mIGxhYmVsPT09J251bWJlcicpe1xubGFiZWw9IGBbJHtsYWJlbH1dYDtcbiB9XG5jb25zdCBvdXRlckVycj1tYWtlRXJyb3IoXG4gYCR7bGFiZWx9OiAke2lubmVyRXJyLm1lc3NhZ2V9YCxcbmVyckNvbnN0cnVjdG9yLFxub3B0aW9ucyk7XG5cbmFubm90YXRlRXJyb3Iob3V0ZXJFcnIsWCBgQ2F1c2VkIGJ5ICR7aW5uZXJFcnJ9YCk7XG50aHJvdyBvdXRlckVycjtcbiB9OyRozY9fb25jZS50aHJvd0xhYmVsZWQodGhyb3dMYWJlbGVkKTtcbmhhcmRlbih0aHJvd0xhYmVsZWQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidGhyb3dMYWJlbGVkIjpbInRocm93TGFiZWxlZCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADp662BwwEAAMMBAAAhAAAAQGVuZG8vZW52LW9wdGlvbnMtdjEuMS44L2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2Vudi1vcHRpb25zLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9zcmMvZW52LW9wdGlvbnMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRozY9faW1wb3J0cyhbW1wiLi9zcmMvZW52LW9wdGlvbnMuanNcIiwgW11dXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAFZxokBsOAAAbDgAAKwAAAEBlbmRvL2Vudi1vcHRpb25zLXYxLjEuOC9zcmMvZW52LW9wdGlvbnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMiLCJnZXRFbnZpcm9ubWVudE9wdGlvbiIsImdldEVudmlyb25tZW50T3B0aW9uc0xpc3QiLCJtYWtlRW52aXJvbm1lbnRDYXB0b3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRozY9faW1wb3J0cyhbXSk7ICAgLyogICAgICAgICAgICAgICAgICAgKi9cbi8vXG5cbi8vXG4vL1xuXG4vL1xuLy9cbi8vXG5cbmNvbnN0e2ZyZWV6ZX09T2JqZWN0O1xuY29uc3R7YXBwbHl9PVJlZmxlY3Q7XG5cbi8vXG4vL1xuY29uc3QgdW5jdXJyeVRoaXM9XG4oZm4pPT5cbihyZWNlaXZlciwuLi5hcmdzKT0+XG5hcHBseShmbixyZWNlaXZlcixhcmdzKTtcbmNvbnN0IGFycmF5UHVzaD11bmN1cnJ5VGhpcyhBcnJheS5wcm90b3R5cGUucHVzaCk7XG5jb25zdCBhcnJheUluY2x1ZGVzPXVuY3VycnlUaGlzKEFycmF5LnByb3RvdHlwZS5pbmNsdWRlcyk7XG5jb25zdCBzdHJpbmdTcGxpdD11bmN1cnJ5VGhpcyhTdHJpbmcucHJvdG90eXBlLnNwbGl0KTtcblxuY29uc3QgcT1KU09OLnN0cmluZ2lmeTtcblxuY29uc3QgRmFpbD0obGl0ZXJhbHMsLi4uYXJncyk9PntcbmxldCBtc2c9bGl0ZXJhbHNbMF07XG5mb3IobGV0IGk9MDtpPGFyZ3MubGVuZ3RoO2krPTEpe1xubXNnPSBgJHttc2d9JHthcmdzW2ldfSR7bGl0ZXJhbHNbaSsxXX1gO1xuIH1cbnRocm93IEVycm9yKG1zZyk7XG4gfTtcblxuLy9cbi8vXG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIG1ha2VFbnZpcm9ubWVudENhcHRvcj0oYUdsb2JhbCxkcm9wTmFtZXM9ZmFsc2UpPT57XG5jb25zdCBjYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXM9W107XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICAgKi9cbmNvbnN0IGdldEVudmlyb25tZW50T3B0aW9uPShcbm9wdGlvbk5hbWUsXG5kZWZhdWx0U2V0dGluZyxcbm9wdE90aGVyVmFsdWVzPXVuZGVmaW5lZCk9Plxue1xudHlwZW9mIG9wdGlvbk5hbWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBFbnZpcm9ubWVudCBvcHRpb24gbmFtZSAke3Eob3B0aW9uTmFtZSl9IG11c3QgYmUgYSBzdHJpbmcuYDtcbnR5cGVvZiBkZWZhdWx0U2V0dGluZz09PSdzdHJpbmcnfHxcbkZhaWwgYEVudmlyb25tZW50IG9wdGlvbiBkZWZhdWx0IHNldHRpbmcgJHtxKFxuZGVmYXVsdFNldHRpbmcpXG4gfSBtdXN0IGJlIGEgc3RyaW5nLmA7XG5cbi8qICAgICAgICAgICAgICAgICAqL1xubGV0IHNldHRpbmc9ZGVmYXVsdFNldHRpbmc7XG5jb25zdCBnbG9iYWxQcm9jZXNzPWFHbG9iYWwucHJvY2Vzc3x8dW5kZWZpbmVkO1xuY29uc3QgZ2xvYmFsRW52PVxudHlwZW9mIGdsb2JhbFByb2Nlc3M9PT0nb2JqZWN0JyYmZ2xvYmFsUHJvY2Vzcy5lbnZ8fHVuZGVmaW5lZDtcbmlmKHR5cGVvZiBnbG9iYWxFbnY9PT0nb2JqZWN0Jyl7XG5pZihvcHRpb25OYW1lIGluIGdsb2JhbEVudil7XG5pZighZHJvcE5hbWVzKXtcbmFycmF5UHVzaChjYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXMsb3B0aW9uTmFtZSk7XG4gfVxuY29uc3Qgb3B0aW9uVmFsdWU9Z2xvYmFsRW52W29wdGlvbk5hbWVdO1xuLy9cbnR5cGVvZiBvcHRpb25WYWx1ZT09PSdzdHJpbmcnfHxcbkZhaWwgYEVudmlyb25tZW50IG9wdGlvbiBuYW1lZCAke3EoXG5vcHRpb25OYW1lKVxuIH0sIGlmIHByZXNlbnQsIG11c3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgc3RyaW5nIHZhbHVlLCBnb3QgJHtxKFxub3B0aW9uVmFsdWUpXG4gfWA7XG5zZXR0aW5nPW9wdGlvblZhbHVlO1xuIH1cbiB9XG5vcHRPdGhlclZhbHVlcz09PXVuZGVmaW5lZHx8XG5zZXR0aW5nPT09ZGVmYXVsdFNldHRpbmd8fFxuYXJyYXlJbmNsdWRlcyhvcHRPdGhlclZhbHVlcyxzZXR0aW5nKXx8XG5GYWlsIGBVbnJlY29nbml6ZWQgJHtxKG9wdGlvbk5hbWUpfSB2YWx1ZSAke3EoXG5zZXR0aW5nKVxuIH0uIEV4cGVjdGVkIG9uZSBvZiAke3EoW2RlZmF1bHRTZXR0aW5nLC4uLm9wdE90aGVyVmFsdWVzXSl9YDtcbnJldHVybiBzZXR0aW5nO1xuIH07XG5mcmVlemUoZ2V0RW52aXJvbm1lbnRPcHRpb24pO1xuXG4vKlxuXG5cbiAgICovXG5jb25zdCBnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0PShvcHRpb25OYW1lKT0+e1xuY29uc3Qgb3B0aW9uPWdldEVudmlyb25tZW50T3B0aW9uKG9wdGlvbk5hbWUsJycpO1xucmV0dXJuIGZyZWV6ZShvcHRpb249PT0nJz9bXTpzdHJpbmdTcGxpdChvcHRpb24sJywnKSk7XG4gfTtcbmZyZWV6ZShnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0KTtcblxuY29uc3QgZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcz0ob3B0aW9uTmFtZSxlbGVtZW50KT0+XG5hcnJheUluY2x1ZGVzKGdldEVudmlyb25tZW50T3B0aW9uc0xpc3Qob3B0aW9uTmFtZSksZWxlbWVudCk7XG5cbmNvbnN0IGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcz0oKT0+e1xucmV0dXJuIGZyZWV6ZShbLi4uY2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzXSk7XG4gfTtcbmZyZWV6ZShnZXRDYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXMpO1xuXG5yZXR1cm4gZnJlZXplKHtcbmdldEVudmlyb25tZW50T3B0aW9uLFxuZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCxcbmVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMsXG5nZXRDYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXN9KTtcblxuIH07JGjNj19vbmNlLm1ha2VFbnZpcm9ubWVudENhcHRvcihtYWtlRW52aXJvbm1lbnRDYXB0b3IpO1xuZnJlZXplKG1ha2VFbnZpcm9ubWVudENhcHRvcik7XG5cbi8qXG5cblxuICovXG5jb25zdCAgICAgICB7XG5nZXRFbnZpcm9ubWVudE9wdGlvbixcbmdldEVudmlyb25tZW50T3B0aW9uc0xpc3QsXG5lbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzfT1cbm1ha2VFbnZpcm9ubWVudENhcHRvcihnbG9iYWxUaGlzLHRydWUpOyRozY9fb25jZS5nZXRFbnZpcm9ubWVudE9wdGlvbihnZXRFbnZpcm9ubWVudE9wdGlvbik7JGjNj19vbmNlLmdldEVudmlyb25tZW50T3B0aW9uc0xpc3QoZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCk7JGjNj19vbmNlLmVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMoZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRW52aXJvbm1lbnRDYXB0b3IiOlsibWFrZUVudmlyb25tZW50Q2FwdG9yIl0sImdldEVudmlyb25tZW50T3B0aW9uIjpbImdldEVudmlyb25tZW50T3B0aW9uIl0sImdldEVudmlyb25tZW50T3B0aW9uc0xpc3QiOlsiZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCJdLCJlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzIjpbImVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAWrW6gA4IAAAOCAAAHAAAAEBlbmRvL2Vycm9ycy12MS4yLjkvaW5kZXguanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkZhaWwiLCJYIiwiYW5ub3RhdGVFcnJvciIsImFzc2VydCIsImIiLCJiYXJlIiwibWFrZUVycm9yIiwibm90ZSIsInEiLCJxdW90ZSIsInJlZGFjdGVkIiwidGhyb3dSZWRhY3RlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjNj19pbXBvcnRzKFtdKTsgICAvKiAgICAgICAgICAgICAgICAgICAqL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbi8vXG4vL1xuXG5jb25zdCBnbG9iYWxBc3NlcnQ9Z2xvYmFsVGhpcy5hc3NlcnQ7XG5cbmlmKGdsb2JhbEFzc2VydD09PXVuZGVmaW5lZCl7XG50aHJvdyBFcnJvcihcbiBgQ2Fubm90IGluaXRpYWxpemUgQGVuZG8vZXJyb3JzLCBtaXNzaW5nIGdsb2JhbFRoaXMuYXNzZXJ0LCBpbXBvcnQgJ3NlcycgYmVmb3JlICdAZW5kby9lcnJvcnMnYCk7XG5cbiB9XG5cbmNvbnN0IG1pc3Npbmc9LyogICAgICAgICAgICAgICAgKi9bXG4ndHlwZW9mJyxcbidlcnJvcicsXG4nZmFpbCcsXG4nZXF1YWwnLFxuJ3N0cmluZycsXG4nbm90ZScsXG4nZGV0YWlscycsXG4nRmFpbCcsXG4ncXVvdGUnLFxuLy9cbi8vXG4vL1xuLy9cbidtYWtlQXNzZXJ0J10uXG5maWx0ZXIoKG5hbWUpPT5nbG9iYWxBc3NlcnRbbmFtZV09PT11bmRlZmluZWQpO1xuaWYobWlzc2luZy5sZW5ndGg+MCl7XG50aHJvdyBFcnJvcihcbiBgQ2Fubm90IGluaXRpYWxpemUgQGVuZG8vZXJyb3JzLCBtaXNzaW5nIGdsb2JhbFRoaXMuYXNzZXJ0IG1ldGhvZHMgJHttaXNzaW5nLmpvaW4oXG4nLCAnKVxuIH1gKTtcblxuIH1cblxuLy9cbi8vXG4vL1xuY29uc3R7XG5iYXJlLFxuZGV0YWlsczpyZWRhY3RlZCxcbmVycm9yOm1ha2VFcnJvcixcbkZhaWw6dGhyb3dSZWRhY3RlZCxcbm1ha2VBc3NlcnQ6X29taXR0ZWRNYWtlQXNzZXJ0LFxubm90ZSxcbnF1b3RlLFxuLi4uYXNzZXJ0aW9uc309XG5nbG9iYWxBc3NlcnQ7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8vXG4kaM2PX29uY2UucmVkYWN0ZWQocmVkYWN0ZWQpOyRozY9fb25jZS5tYWtlRXJyb3IobWFrZUVycm9yKTskaM2PX29uY2UudGhyb3dSZWRhY3RlZCh0aHJvd1JlZGFjdGVkKTskaM2PX29uY2Uubm90ZShub3RlKTskaM2PX29uY2UucXVvdGUocXVvdGUpO2NvbnN0IGFzc2VydD0odmFsdWUsb3B0RGV0YWlscyxlcnJDb250cnVjdG9yLG9wdGlvbnMpPT5cbmdsb2JhbEFzc2VydCh2YWx1ZSxvcHREZXRhaWxzLGVyckNvbnRydWN0b3Isb3B0aW9ucyk7JGjNj19vbmNlLmFzc2VydChhc3NlcnQpO1xuT2JqZWN0LmFzc2lnbihhc3NlcnQsYXNzZXJ0aW9ucyk7XG5cbi8vXG4vL1xuLy9cbmNvbnN0IGJhcmVPclF1b3RlPWJhcmV8fHF1b3RlO1xuXG4vL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovJGjNj19vbmNlLmJhcmVPclF1b3RlKGJhcmVPclF1b3RlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InJlZGFjdGVkIjpbInJlZGFjdGVkIl0sIlgiOlsicmVkYWN0ZWQiXSwibWFrZUVycm9yIjpbIm1ha2VFcnJvciJdLCJ0aHJvd1JlZGFjdGVkIjpbInRocm93UmVkYWN0ZWQiXSwiRmFpbCI6WyJ0aHJvd1JlZGFjdGVkIl0sIm5vdGUiOlsibm90ZSJdLCJhbm5vdGF0ZUVycm9yIjpbIm5vdGUiXSwicXVvdGUiOlsicXVvdGUiXSwicSI6WyJxdW90ZSJdLCJhc3NlcnQiOlsiYXNzZXJ0Il0sImJhcmUiOlsiYmFyZU9yUXVvdGUiXSwiYiI6WyJiYXJlT3JRdW90ZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADMGR2ETBEAAEwRAAAjAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjAvc3JjL0UuanN7ImltcG9ydHMiOlsiLi90cmFjay10dXJucy5qcyIsIi4vbWVzc2FnZS1icmVha3BvaW50cy5qcyJdLCJleHBvcnRzIjpbImRlZmF1bHQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCB0cmFja1R1cm5zLG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlcjskaM2PX2ltcG9ydHMoW1tcIi4vdHJhY2stdHVybnMuanNcIiwgW1tcInRyYWNrVHVybnNcIiwgWyRozY9fYSA9PiAodHJhY2tUdXJucyA9ICRozY9fYSldXV1dLFtcIi4vbWVzc2FnZS1icmVha3BvaW50cy5qc1wiLCBbW1wibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyXCIsIFskaM2PX2EgPT4gKG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnEsRmFpbCxlcnJvcjptYWtlRXJyb3J9PWFzc2VydDtcbmNvbnN0e2Fzc2lnbixmcmVlemV9PU9iamVjdDtcblxuLypcblxuICovXG5cbmNvbnN0IG9uU2VuZD1tYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIoJ0VORE9fU0VORF9CUkVBS1BPSU5UUycpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcj17XG5zZXQoX3RhcmdldCxfcHJvcCxfdmFsdWUpe1xucmV0dXJuIGZhbHNlO1xuIH0sXG5pc0V4dGVuc2libGUoX3RhcmdldCl7XG5yZXR1cm4gZmFsc2U7XG4gfSxcbnNldFByb3RvdHlwZU9mKF90YXJnZXQsX3ZhbHVlKXtcbnJldHVybiBmYWxzZTtcbiB9LFxuZGVsZXRlUHJvcGVydHkoX3RhcmdldCxfcHJvcCl7XG5yZXR1cm4gZmFsc2U7XG4gfX07XG5cblxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlRVByb3h5SGFuZGxlcj0ocmVjaXBpZW50LEhhbmRsZWRQcm9taXNlKT0+XG5oYXJkZW4oe1xuLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbmdldDooX3RhcmdldCxwcm9wZXJ0eUtleSxyZWNlaXZlcik9PntcbnJldHVybiBoYXJkZW4oXG57XG4vL1xuLy9cbi8vXG4vL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5bcHJvcGVydHlLZXldKC4uLmFyZ3Mpe1xuaWYodGhpcyE9PXJlY2VpdmVyKXtcbi8vXG5yZXR1cm4gSGFuZGxlZFByb21pc2UucmVqZWN0KFxubWFrZUVycm9yKFxuWCBgVW5leHBlY3RlZCByZWNlaXZlciBmb3IgXCIke3EocHJvcGVydHlLZXkpfVwiIG1ldGhvZCBvZiBFKCR7cShcbnJlY2lwaWVudClcbiB9KWApKTtcblxuXG4gfVxuXG5pZihvblNlbmQmJm9uU2VuZC5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCxwcm9wZXJ0eUtleSkpe1xuLy9cbmRlYnVnZ2VyOy8vXG4vL1xuLy9cbi8vXG4vL1xuIH1cbnJldHVybiBIYW5kbGVkUHJvbWlzZS5hcHBseU1ldGhvZChyZWNpcGllbnQscHJvcGVydHlLZXksYXJncyk7XG4gfVxuLy9cbn1bcHJvcGVydHlLZXldKTtcblxuIH0sXG5hcHBseTooX3RhcmdldCxfdGhpc0FyZyxhcmdBcnJheT1bXSk9PntcbmlmKG9uU2VuZCYmb25TZW5kLnNob3VsZEJyZWFrcG9pbnQocmVjaXBpZW50LHVuZGVmaW5lZCkpe1xuLy9cbmRlYnVnZ2VyOy8vXG4vL1xuLy9cbi8vXG4gfVxucmV0dXJuIEhhbmRsZWRQcm9taXNlLmFwcGx5RnVuY3Rpb24ocmVjaXBpZW50LGFyZ0FycmF5KTtcbiB9LFxuaGFzOihfdGFyZ2V0LF9wKT0+e1xuLy9cbnJldHVybiB0cnVlO1xuIH19KTtcblxuXG4vKlxuXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlRVNlbmRPbmx5UHJveHlIYW5kbGVyPShyZWNpcGllbnQsSGFuZGxlZFByb21pc2UpPT5cbmhhcmRlbih7XG4uLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuZ2V0OihfdGFyZ2V0LHByb3BlcnR5S2V5LHJlY2VpdmVyKT0+e1xucmV0dXJuIGhhcmRlbihcbntcbi8vXG4vL1xuLy9cbi8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuW3Byb3BlcnR5S2V5XSguLi5hcmdzKXtcbi8vXG50aGlzPT09cmVjZWl2ZXJ8fFxuRmFpbCBgVW5leHBlY3RlZCByZWNlaXZlciBmb3IgXCIke3EoXG5wcm9wZXJ0eUtleSlcbiB9XCIgbWV0aG9kIG9mIEUuc2VuZE9ubHkoJHtxKHJlY2lwaWVudCl9KWA7XG5pZihvblNlbmQmJm9uU2VuZC5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCxwcm9wZXJ0eUtleSkpe1xuLy9cbmRlYnVnZ2VyOy8vXG4vL1xuLy9cbi8vXG4vL1xuIH1cbkhhbmRsZWRQcm9taXNlLmFwcGx5TWV0aG9kU2VuZE9ubHkocmVjaXBpZW50LHByb3BlcnR5S2V5LGFyZ3MpO1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG4vL1xufVtwcm9wZXJ0eUtleV0pO1xuXG4gfSxcbmFwcGx5OihfdGFyZ2V0LF90aGlzQXJnLGFyZ3NBcnJheT1bXSk9PntcbmlmKG9uU2VuZCYmb25TZW5kLnNob3VsZEJyZWFrcG9pbnQocmVjaXBpZW50LHVuZGVmaW5lZCkpe1xuLy9cbmRlYnVnZ2VyOy8vXG4vL1xuLy9cbi8vXG4gfVxuSGFuZGxlZFByb21pc2UuYXBwbHlGdW5jdGlvblNlbmRPbmx5KHJlY2lwaWVudCxhcmdzQXJyYXkpO1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9LFxuaGFzOihfdGFyZ2V0LF9wKT0+e1xuLy9cbnJldHVybiB0cnVlO1xuIH19KTtcblxuXG4vKlxuXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlRUdldFByb3h5SGFuZGxlcj0oeCxIYW5kbGVkUHJvbWlzZSk9PlxuaGFyZGVuKHtcbi4uLmJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIsXG5oYXM6KF90YXJnZXQsX3Byb3ApPT50cnVlLFxuZ2V0OihfdGFyZ2V0LHByb3ApPT5IYW5kbGVkUHJvbWlzZS5nZXQoeCxwcm9wKX0pO1xuXG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgZnVuY1RhcmdldD1mcmVlemUoKCk9PnsgfSk7XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBvYmpUYXJnZXQ9ZnJlZXplKHtfX3Byb3RvX186bnVsbH0pO1xuXG4vKlxuXG4gKi9cbmNvbnN0IG1ha2VFPShIYW5kbGVkUHJvbWlzZSk9PntcbnJldHVybiBoYXJkZW4oXG5hc3NpZ24oXG4vKlxuXG5cblxuXG5cblxuXG4gICAgICAgKi9cbi8vXG4oeCk9Pm5ldyBQcm94eShmdW5jVGFyZ2V0LG1ha2VFUHJveHlIYW5kbGVyKHgsSGFuZGxlZFByb21pc2UpKSxcbntcbi8qXG5cblxuXG5cblxuXG5cblxuXG4gICAgICAgICAqL1xuLy9cbmdldDooeCk9Pm5ldyBQcm94eShvYmpUYXJnZXQsbWFrZUVHZXRQcm94eUhhbmRsZXIoeCxIYW5kbGVkUHJvbWlzZSkpLFxuXG4vKlxuXG5cblxuXG5cblxuXG4gICAgICAgICAqL1xucmVzb2x2ZTpIYW5kbGVkUHJvbWlzZS5yZXNvbHZlLFxuXG4vKlxuXG5cblxuXG5cblxuXG4gICAgICAgICAqL1xuc2VuZE9ubHk6KHgpPT5cbi8vXG5uZXcgUHJveHkoZnVuY1RhcmdldCxtYWtlRVNlbmRPbmx5UHJveHlIYW5kbGVyKHgsSGFuZGxlZFByb21pc2UpKSxcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuICAgICAgICAgKi9cbndoZW46KHgsb25mdWxmaWxsZWQsb25yZWplY3RlZCk9PlxuSGFuZGxlZFByb21pc2UucmVzb2x2ZSh4KS50aGVuKFxuLi4udHJhY2tUdXJucyhbb25mdWxmaWxsZWQsb25yZWplY3RlZF0pKX0pKTtcblxuXG5cblxuIH07XG5cbmNvbnN0e2RlZmF1bHQ6JGPNj19kZWZhdWx0fT17ZGVmYXVsdDptYWtlRX07XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuZGVmYXVsdCgkY82PX2RlZmF1bHQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAVESyZ5AQAAeQEAACkAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMC9zcmMvZXhwb3J0cy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjNj19pbXBvcnRzKFtdKTsgICBcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC21bu22QwAANkMAAAnAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjAvc3JjL2xvY2FsLmpzeyJpbXBvcnRzIjpbIi4vbWVzc2FnZS1icmVha3BvaW50cy5qcyJdLCJleHBvcnRzIjpbImdldE1ldGhvZE5hbWVzIiwibG9jYWxBcHBseUZ1bmN0aW9uIiwibG9jYWxBcHBseU1ldGhvZCIsImxvY2FsR2V0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgbWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyOyRozY9faW1wb3J0cyhbW1wiLi9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzXCIsIFtbXCJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXJcIiwgWyRozY9fYSA9PiAobWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyID0gJGjNj19hKV1dXV1dKTsgICBcblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG5jb25zdHtnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLGdldFByb3RvdHlwZU9mLGZyZWV6ZX09T2JqZWN0O1xuY29uc3R7YXBwbHksb3duS2V5c309UmVmbGVjdDtcblxuY29uc3QgbnR5cGVvZj0oc3BlY2ltZW4pPT5zcGVjaW1lbj09PW51bGw/J251bGwnOnR5cGVvZiBzcGVjaW1lbjtcblxuY29uc3Qgb25EZWxpdmVyeT1tYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIoJ0VORE9fREVMSVZFUllfQlJFQUtQT0lOVFMnKTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBpc09iamVjdD0odmFsKT0+T2JqZWN0KHZhbCk9PT12YWw7XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBjb21wYXJlU3RyaW5naWZpZWQ9KGEsYik9PntcbmlmKHR5cGVvZiBhPT09dHlwZW9mIGIpe1xuY29uc3QgbGVmdD1TdHJpbmcoYSk7XG5jb25zdCByaWdodD1TdHJpbmcoYik7XG4vL1xucmV0dXJuIGxlZnQ8cmlnaHQ/LTE6bGVmdD5yaWdodD8xOjA7XG4gfVxuaWYodHlwZW9mIGE9PT0nc3ltYm9sJyl7XG5hc3NlcnQodHlwZW9mIGI9PT0nc3RyaW5nJyk7XG5yZXR1cm4tMTtcbiB9XG5hc3NlcnQodHlwZW9mIGE9PT0nc3RyaW5nJyk7XG5hc3NlcnQodHlwZW9mIGI9PT0nc3ltYm9sJyk7XG5yZXR1cm4gMTtcbiB9O1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgICAgICAgIGdldE1ldGhvZE5hbWVzPSh2YWwpPT57XG5sZXQgbGF5ZXI9dmFsO1xuY29uc3QgbmFtZXM9bmV3IFNldCgpOy8vXG53aGlsZShsYXllciE9PW51bGwmJmxheWVyIT09T2JqZWN0LnByb3RvdHlwZSl7XG4vL1xuY29uc3QgZGVzY3M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhsYXllcik7XG5mb3IoY29uc3QgbmFtZSBvZiBvd25LZXlzKGRlc2NzKSl7XG4vL1xuLy9cbmlmKHR5cGVvZiB2YWxbbmFtZV09PT0nZnVuY3Rpb24nKXtcbm5hbWVzLmFkZChuYW1lKTtcbiB9XG4gfVxuaWYoIWlzT2JqZWN0KHZhbCkpe1xuYnJlYWs7XG4gfVxubGF5ZXI9Z2V0UHJvdG90eXBlT2YobGF5ZXIpO1xuIH1cbnJldHVybiBoYXJkZW4oWy4uLm5hbWVzXS5zb3J0KGNvbXBhcmVTdHJpbmdpZmllZCkpO1xuIH07XG4vL1xuLy9cbiRozY9fb25jZS5nZXRNZXRob2ROYW1lcyhnZXRNZXRob2ROYW1lcyk7ZnJlZXplKGdldE1ldGhvZE5hbWVzKTtcblxuY29uc3QgICAgICAgIGxvY2FsQXBwbHlGdW5jdGlvbj0ocmVjaXBpZW50LGFyZ3MpPT57XG50eXBlb2YgcmVjaXBpZW50PT09J2Z1bmN0aW9uJ3x8XG5hc3NlcnQuZmFpbChcblggYENhbm5vdCBpbnZva2UgdGFyZ2V0IGFzIGEgZnVuY3Rpb247IHR5cGVvZiB0YXJnZXQgaXMgJHtxKFxubnR5cGVvZihyZWNpcGllbnQpKVxuIH1gLFxuVHlwZUVycm9yKTtcblxuaWYob25EZWxpdmVyeSYmb25EZWxpdmVyeS5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCx1bmRlZmluZWQpKXtcbi8vXG5kZWJ1Z2dlcjsvL1xuLy9cbi8vXG4vL1xuLy9cbiB9XG5jb25zdCByZXN1bHQ9YXBwbHkocmVjaXBpZW50LHVuZGVmaW5lZCxhcmdzKTtcbnJldHVybiByZXN1bHQ7XG4gfTskaM2PX29uY2UubG9jYWxBcHBseUZ1bmN0aW9uKGxvY2FsQXBwbHlGdW5jdGlvbik7XG5cbmNvbnN0ICAgICAgICBsb2NhbEFwcGx5TWV0aG9kPShyZWNpcGllbnQsbWV0aG9kTmFtZSxhcmdzKT0+e1xuaWYobWV0aG9kTmFtZT09PXVuZGVmaW5lZHx8bWV0aG9kTmFtZT09PW51bGwpe1xuLy9cbnJldHVybiBsb2NhbEFwcGx5RnVuY3Rpb24ocmVjaXBpZW50LGFyZ3MpO1xuIH1cbmlmKHJlY2lwaWVudD09PXVuZGVmaW5lZHx8cmVjaXBpZW50PT09bnVsbCl7XG5hc3NlcnQuZmFpbChcblggYENhbm5vdCBkZWxpdmVyICR7cShtZXRob2ROYW1lKX0gdG8gdGFyZ2V0OyB0eXBlb2YgdGFyZ2V0IGlzICR7cShcbm50eXBlb2YocmVjaXBpZW50KSlcbiB9YCxcblR5cGVFcnJvcik7XG5cbiB9XG5jb25zdCBmbj1yZWNpcGllbnRbbWV0aG9kTmFtZV07XG5pZihmbj09PXVuZGVmaW5lZCl7XG5hc3NlcnQuZmFpbChcblggYHRhcmdldCBoYXMgbm8gbWV0aG9kICR7cShtZXRob2ROYW1lKX0sIGhhcyAke3EoXG5nZXRNZXRob2ROYW1lcyhyZWNpcGllbnQpKVxuIH1gLFxuVHlwZUVycm9yKTtcblxuIH1cbmNvbnN0IGZ0eXBlPW50eXBlb2YoZm4pO1xudHlwZW9mIGZuPT09J2Z1bmN0aW9uJ3x8XG5GYWlsIGBpbnZva2VkIG1ldGhvZCAke3EobWV0aG9kTmFtZSl9IGlzIG5vdCBhIGZ1bmN0aW9uOyBpdCBpcyBhICR7cShcbmZ0eXBlKVxuIH1gO1xuaWYob25EZWxpdmVyeSYmb25EZWxpdmVyeS5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCxtZXRob2ROYW1lKSl7XG4vL1xuZGVidWdnZXI7Ly9cbi8vXG4vL1xuLy9cbi8vXG4gfVxuY29uc3QgcmVzdWx0PWFwcGx5KGZuLHJlY2lwaWVudCxhcmdzKTtcbnJldHVybiByZXN1bHQ7XG4gfTskaM2PX29uY2UubG9jYWxBcHBseU1ldGhvZChsb2NhbEFwcGx5TWV0aG9kKTtcblxuY29uc3QgICAgICAgIGxvY2FsR2V0PSh0LGtleSk9PnRba2V5XTskaM2PX29uY2UubG9jYWxHZXQobG9jYWxHZXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0TWV0aG9kTmFtZXMiOlsiZ2V0TWV0aG9kTmFtZXMiXSwibG9jYWxBcHBseUZ1bmN0aW9uIjpbImxvY2FsQXBwbHlGdW5jdGlvbiJdLCJsb2NhbEFwcGx5TWV0aG9kIjpbImxvY2FsQXBwbHlNZXRob2QiXSwibG9jYWxHZXQiOlsibG9jYWxHZXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAbAyYzhgNAAAYDQAANQAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4wL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vudi1vcHRpb25zIl0sImV4cG9ydHMiOlsibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgZ2V0RW52aXJvbm1lbnRPcHRpb247JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lbnYtb3B0aW9uc1wiLCBbW1wiZ2V0RW52aXJvbm1lbnRPcHRpb25cIiwgWyRozY9fYSA9PiAoZ2V0RW52aXJvbm1lbnRPcHRpb24gPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuY29uc3R7aGFzT3duLGZyZWV6ZSxlbnRyaWVzfT1PYmplY3Q7XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbi8qXG5cblxuXG5cblxuICovXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG4gKi9cbmNvbnN0IGlzSlNPTlJlY29yZD0odmFsKT0+XG50eXBlb2YgdmFsPT09J29iamVjdCcmJnZhbCE9PW51bGwmJiFBcnJheS5pc0FycmF5KHZhbCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHNpbXBsaWZ5VGFnPSh0YWcpPT57XG5mb3IoY29uc3QgcHJlZml4IG9mWydBbGxlZ2VkOiAnLCdEZWJ1Z05hbWU6ICddKXtcbmlmKHRhZy5zdGFydHNXaXRoKHByZWZpeCkpe1xucmV0dXJuIHRhZy5zbGljZShwcmVmaXgubGVuZ3RoKTtcbiB9XG4gfVxucmV0dXJuIHRhZztcbiB9O1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgICAgICAgIG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3Rlcj0ob3B0aW9uTmFtZSk9PntcbmxldCBicmVha3BvaW50cz1KU09OLnBhcnNlKGdldEVudmlyb25tZW50T3B0aW9uKG9wdGlvbk5hbWUsJ251bGwnKSk7XG5cbmlmKGJyZWFrcG9pbnRzPT09bnVsbCl7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICovXG5sZXQgYnJlYWtwb2ludHNUYWJsZTtcblxuY29uc3QgZ2V0QnJlYWtwb2ludHM9KCk9PmJyZWFrcG9pbnRzO1xuZnJlZXplKGdldEJyZWFrcG9pbnRzKTtcblxuY29uc3Qgc2V0QnJlYWtwb2ludHM9KG5ld0JyZWFrcG9pbnRzPWJyZWFrcG9pbnRzKT0+e1xuaXNKU09OUmVjb3JkKG5ld0JyZWFrcG9pbnRzKXx8XG5GYWlsIGBFeHBlY3RlZCAke3Eob3B0aW9uTmFtZSl9IG9wdGlvbiB0byBiZSBhIEpTT04gYnJlYWtwb2ludHMgcmVjb3JkYDtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vL1xuY29uc3QgbmV3QnJlYWtwb2ludHNUYWJsZT17X19wcm90b19fOm51bGx9O1xuXG5mb3IoY29uc3RbdGFnLG1ldGhvZEJQc11vZiBlbnRyaWVzKG5ld0JyZWFrcG9pbnRzKSl7XG50YWc9PT1zaW1wbGlmeVRhZyh0YWcpfHxcbkZhaWwgYEp1c3QgdXNlIHNpbXBsZSB0YWcgJHtxKHNpbXBsaWZ5VGFnKHRhZykpfSByYXRoZXIgdGhhbiAke3EodGFnKX1gO1xuaXNKU09OUmVjb3JkKG1ldGhvZEJQcyl8fFxuRmFpbCBgRXhwZWN0ZWQgJHtxKG9wdGlvbk5hbWUpfSBvcHRpb24ncyAke3EoXG50YWcpXG4gfSB0byBiZSBhIEpTT04gbWV0aG9kcyBicmVha3BvaW50cyByZWNvcmRgO1xuZm9yKGNvbnN0W21ldGhvZE5hbWUsY291bnRdb2YgZW50cmllcyhtZXRob2RCUHMpKXtcbmNvdW50PT09JyonfHxcbnR5cGVvZiBjb3VudD09PSdudW1iZXInJiZcbk51bWJlci5pc1NhZmVJbnRlZ2VyKGNvdW50KSYmXG5jb3VudD49MHx8XG5GYWlsIGBFeHBlY3RlZCAke3Eob3B0aW9uTmFtZSl9IG9wdGlvbidzICR7cSh0YWcpfS4ke3EoXG5tZXRob2ROYW1lKVxuIH0gdG8gYmUgXCIqXCIgb3IgYSBub24tbmVnYXRpdmUgaW50ZWdlcmA7XG5cbmNvbnN0IGNsYXNzQlBzPWhhc093bihuZXdCcmVha3BvaW50c1RhYmxlLG1ldGhvZE5hbWUpP1xubmV3QnJlYWtwb2ludHNUYWJsZVttZXRob2ROYW1lXTpcbm5ld0JyZWFrcG9pbnRzVGFibGVbbWV0aG9kTmFtZV09e1xuLy9cbl9fcHJvdG9fXzpudWxsfTtcblxuY2xhc3NCUHNbdGFnXT1jb3VudDtcbiB9XG4gfVxuYnJlYWtwb2ludHM9bmV3QnJlYWtwb2ludHM7XG5icmVha3BvaW50c1RhYmxlPW5ld0JyZWFrcG9pbnRzVGFibGU7XG4gfTtcbmZyZWV6ZShzZXRCcmVha3BvaW50cyk7XG5cbmNvbnN0IHNob3VsZEJyZWFrcG9pbnQ9KHJlY2lwaWVudCxtZXRob2ROYW1lKT0+e1xuaWYobWV0aG9kTmFtZT09PXVuZGVmaW5lZHx8bWV0aG9kTmFtZT09PW51bGwpe1xuLy9cbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdCBjbGFzc0JQcz1icmVha3BvaW50c1RhYmxlW21ldGhvZE5hbWVdfHxicmVha3BvaW50c1RhYmxlWycqJ107XG5pZihjbGFzc0JQcz09PXVuZGVmaW5lZCl7XG5yZXR1cm4gZmFsc2U7XG4gfVxubGV0IHRhZz1zaW1wbGlmeVRhZyhyZWNpcGllbnRbU3ltYm9sLnRvU3RyaW5nVGFnXSk7XG5sZXQgY291bnQ9Y2xhc3NCUHNbdGFnXTtcbmlmKGNvdW50PT09dW5kZWZpbmVkKXtcbnRhZz0nKic7XG5jb3VudD1jbGFzc0JQc1t0YWddO1xuaWYoY291bnQ9PT11bmRlZmluZWQpe1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5pZihjb3VudD09PScqJyl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihjb3VudD09PTApe1xucmV0dXJuIHRydWU7XG4gfVxuYXNzZXJ0KHR5cGVvZiBjb3VudD09PSdudW1iZXInJiZjb3VudD49MSk7XG5jbGFzc0JQc1t0YWddPWNvdW50LTE7XG5yZXR1cm4gZmFsc2U7XG4gfTtcbmZyZWV6ZShzaG91bGRCcmVha3BvaW50KTtcblxuY29uc3QgYnJlYWtwb2ludFRlc3Rlcj1mcmVlemUoe1xuZ2V0QnJlYWtwb2ludHMsXG5zZXRCcmVha3BvaW50cyxcbnNob3VsZEJyZWFrcG9pbnR9KTtcblxuYnJlYWtwb2ludFRlc3Rlci5zZXRCcmVha3BvaW50cygpO1xucmV0dXJuIGJyZWFrcG9pbnRUZXN0ZXI7XG4gfTskaM2PX29uY2UubWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyKG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3Rlcik7XG5mcmVlemUobWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciI6WyJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAvTu/JWIDAABiAwAAKQAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4wL3NyYy9uby1zaGltLmpzeyJpbXBvcnRzIjpbIi4vRS5qcyIsIi4vZXhwb3J0cy5qcyJdLCJleHBvcnRzIjpbIkUiLCJIYW5kbGVkUHJvbWlzZSJdLCJyZWV4cG9ydHMiOlsiLi9leHBvcnRzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgbWFrZUU7JGjNj19pbXBvcnRzKFtbXCIuL0UuanNcIiwgW1tcImRlZmF1bHRcIiwgWyRozY9fYSA9PiAobWFrZUUgPSAkaM2PX2EpXV1dXSxbXCIuL2V4cG9ydHMuanNcIiwgW11dXSk7ICAgXG5cbi8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCBocD1IYW5kbGVkUHJvbWlzZTskaM2PX29uY2UuaHAoaHApO1xuY29uc3QgICAgICAgIEU9bWFrZUUoaHApOyRozY9fb25jZS5FKEUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiSGFuZGxlZFByb21pc2UiOlsiaHAiXSwiRSI6WyJFIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKSaUDKOCQAAjgkAAC0AAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMC9zcmMvdHJhY2stdHVybnMuanN7ImltcG9ydHMiOlsiQGVuZG8vZW52LW9wdGlvbnMiXSwiZXhwb3J0cyI6WyJ0cmFja1R1cm5zIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgZ2V0RW52aXJvbm1lbnRPcHRpb24sZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vudi1vcHRpb25zXCIsIFtbXCJnZXRFbnZpcm9ubWVudE9wdGlvblwiLCBbJGjNj19hID0+IChnZXRFbnZpcm9ubWVudE9wdGlvbiA9ICRozY9fYSldXSxbXCJlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzXCIsIFskaM2PX2EgPT4gKGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbmxldCBoaWRkZW5QcmlvckVycm9yO1xubGV0IGhpZGRlbkN1cnJlbnRUdXJuPTA7XG5sZXQgaGlkZGVuQ3VycmVudEV2ZW50PTA7XG5cbi8vXG5jb25zdCBWRVJCT1NFPWVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMoJ0RFQlVHJywndHJhY2stdHVybnMnKTtcblxuLy9cbi8vXG5jb25zdCBFTkFCTEVEPVxuZ2V0RW52aXJvbm1lbnRPcHRpb24oJ1RSQUNLX1RVUk5TJywnZGlzYWJsZWQnLFsnZW5hYmxlZCddKT09PSdlbmFibGVkJztcblxuLy9cbi8vXG4vL1xuLy9cblxuY29uc3QgYWRkUmVqZWN0aW9uTm90ZT0oZGV0YWlsc05vdGUpPT4ocmVhc29uKT0+e1xuaWYocmVhc29uIGluc3RhbmNlb2YgRXJyb3Ipe1xuZ2xvYmFsVGhpcy5hc3NlcnQubm90ZShyZWFzb24sZGV0YWlsc05vdGUpO1xuIH1cbmlmKFZFUkJPU0Upe1xuY29uc29sZS5sb2coJ1JFSkVDVEVEIGF0IHRvcCBvZiBldmVudCBsb29wJyxyZWFzb24pO1xuIH1cbiB9O1xuXG5jb25zdCB3cmFwRnVuY3Rpb249XG4oZnVuYyxzZW5kaW5nRXJyb3IsWCk9PlxuKC4uLmFyZ3MpPT57XG5oaWRkZW5QcmlvckVycm9yPXNlbmRpbmdFcnJvcjtcbmhpZGRlbkN1cnJlbnRUdXJuKz0xO1xuaGlkZGVuQ3VycmVudEV2ZW50PTA7XG50cnl7XG5sZXQgcmVzdWx0O1xudHJ5e1xucmVzdWx0PWZ1bmMoLi4uYXJncyk7XG4gfWNhdGNoKGVycil7XG5pZihlcnIgaW5zdGFuY2VvZiBFcnJvcil7XG5nbG9iYWxUaGlzLmFzc2VydC5ub3RlKFxuZXJyLFxuWCBgVGhyb3duIGZyb206ICR7aGlkZGVuUHJpb3JFcnJvcn06JHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCk7XG5cbiB9XG5pZihWRVJCT1NFKXtcbmNvbnNvbGUubG9nKCdUSFJPV04gdG8gdG9wIG9mIGV2ZW50IGxvb3AnLGVycik7XG4gfVxudGhyb3cgZXJyO1xuIH1cbi8vXG5jb25zdCBkZXRhaWxzTm90ZT1YIGBSZWplY3Rpb24gZnJvbTogJHtoaWRkZW5QcmlvckVycm9yfToke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gO1xuUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkuY2F0Y2goYWRkUmVqZWN0aW9uTm90ZShkZXRhaWxzTm90ZSkpO1xucmV0dXJuIHJlc3VsdDtcbiB9ZmluYWxseXtcbmhpZGRlblByaW9yRXJyb3I9dW5kZWZpbmVkO1xuIH1cbiB9O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICB0cmFja1R1cm5zPShmdW5jcyk9PntcbmlmKCFFTkFCTEVEfHx0eXBlb2YgZ2xvYmFsVGhpcz09PSd1bmRlZmluZWQnfHwhZ2xvYmFsVGhpcy5hc3NlcnQpe1xucmV0dXJuIGZ1bmNzO1xuIH1cbmNvbnN0e2RldGFpbHM6WCxub3RlOmFubm90YXRlRXJyb3J9PWdsb2JhbFRoaXMuYXNzZXJ0O1xuXG5oaWRkZW5DdXJyZW50RXZlbnQrPTE7XG5jb25zdCBzZW5kaW5nRXJyb3I9RXJyb3IoXG4gYEV2ZW50OiAke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gKTtcblxuaWYoaGlkZGVuUHJpb3JFcnJvciE9PXVuZGVmaW5lZCl7XG5hbm5vdGF0ZUVycm9yKHNlbmRpbmdFcnJvcixYIGBDYXVzZWQgYnk6ICR7aGlkZGVuUHJpb3JFcnJvcn1gKTtcbiB9XG5cbnJldHVybiAoLyogICAgICAgICAgICAqL1xuZnVuY3MubWFwKChmdW5jKT0+ZnVuYyYmd3JhcEZ1bmN0aW9uKGZ1bmMsc2VuZGluZ0Vycm9yLFgpKSk7XG5cbiB9O1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UudHJhY2tUdXJucyh0cmFja1R1cm5zKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InRyYWNrVHVybnMiOlsidHJhY2tUdXJucyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB/ppUchQIAAIUCAAAjAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjAvdXRpbHMuanN7ImltcG9ydHMiOlsiLi9zcmMvbG9jYWwuanMiLCIuL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIl0sImV4cG9ydHMiOltudWxsLG51bGxdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjNj19pbXBvcnRzKFtbXCIuL3NyYy9sb2NhbC5qc1wiLCBbXV0sW1wiLi9zcmMvbWVzc2FnZS1icmVha3BvaW50cy5qc1wiLCBbXV1dKTsgICBcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2xvY2FsLmpzIjpbWyJnZXRNZXRob2ROYW1lcyIsImdldE1ldGhvZE5hbWVzIl1dLCIuL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIjpbWyJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIiLCJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABi5hL6BAgAAgQIAABkAAABAZW5kby9leG8tdjEuNS44L2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2V4by1tYWtlcnMuanMiLCIuL3NyYy90eXBlcy5qcyIsIi4vc3JjL2dldC1pbnRlcmZhY2UuanMiXSwiZXhwb3J0cyI6W251bGxdLCJyZWV4cG9ydHMiOlsiLi9zcmMvZXhvLW1ha2Vycy5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2V4by1tYWtlcnMuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXSxbXCIuL3NyYy9nZXQtaW50ZXJmYWNlLmpzXCIsIFtdXV0pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvZ2V0LWludGVyZmFjZS5qcyI6W1siR0VUX0lOVEVSRkFDRV9HVUFSRCIsIkdFVF9JTlRFUkZBQ0VfR1VBUkQiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHZKF/AGFQAABhUAACIAAABAZW5kby9leG8tdjEuNS44L3NyYy9leG8tbWFrZXJzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIiwiQGVuZG8vZW52LW9wdGlvbnMiLCJAZW5kby9lcnJvcnMiLCIuL2V4by10b29scy5qcyJdLCJleHBvcnRzIjpbImRlZmluZUV4b0NsYXNzIiwiZGVmaW5lRXhvQ2xhc3NLaXQiLCJpbml0RW1wdHkiLCJtYWtlRXhvIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgb2JqZWN0TWFwLGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMsRmFpbCxxLGRlZmVuZFByb3RvdHlwZSxkZWZlbmRQcm90b3R5cGVLaXQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qc1wiLCBbW1wib2JqZWN0TWFwXCIsIFskaM2PX2EgPT4gKG9iamVjdE1hcCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vudi1vcHRpb25zXCIsIFtbXCJlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzXCIsIFskaM2PX2EgPT4gKGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIiwgWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsIFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCIuL2V4by10b29scy5qc1wiLCBbW1wiZGVmZW5kUHJvdG90eXBlXCIsIFskaM2PX2EgPT4gKGRlZmVuZFByb3RvdHlwZSA9ICRozY9fYSldXSxbXCJkZWZlbmRQcm90b3R5cGVLaXRcIiwgWyRozY9fYSA9PiAoZGVmZW5kUHJvdG90eXBlS2l0ID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuXG4vKlxuXG4gKi9cblxuY29uc3R7Y3JlYXRlLHNlYWwsZnJlZXplLGRlZmluZVByb3BlcnR5LHZhbHVlc309T2JqZWN0O1xuXG4vL1xuY29uc3QgTEFCRUxfSU5TVEFOQ0VTPWVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMoJ0RFQlVHJywnbGFiZWwtaW5zdGFuY2VzJyk7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZVNlbGY9KHByb3RvLGluc3RhbmNlQ291bnQpPT57XG5jb25zdCBzZWxmPWNyZWF0ZShwcm90byk7XG5pZihMQUJFTF9JTlNUQU5DRVMpe1xuZGVmaW5lUHJvcGVydHkoc2VsZixTeW1ib2wudG9TdHJpbmdUYWcse1xudmFsdWU6IGAke3Byb3RvW1N5bWJvbC50b1N0cmluZ1RhZ119IyR7aW5zdGFuY2VDb3VudH1gLFxud3JpdGFibGU6ZmFsc2UsXG5lbnVtZXJhYmxlOmZhbHNlLFxuY29uZmlndXJhYmxlOmZhbHNlfSk7XG5cbiB9XG5yZXR1cm4gaGFyZGVuKHNlbGYpO1xuIH07XG5cbmNvbnN0IGVtcHR5UmVjb3JkPWhhcmRlbih7fSk7XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGluaXRFbXB0eT0oKT0+ZW1wdHlSZWNvcmQ7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmluaXRFbXB0eShpbml0RW1wdHkpO1xuY29uc3QgICAgICAgIGRlZmluZUV4b0NsYXNzPShcbnRhZyxcbmludGVyZmFjZUd1YXJkLFxuaW5pdCxcbm1ldGhvZHMsXG5vcHRpb25zPXt9KT0+XG57XG5oYXJkZW4obWV0aG9kcyk7XG5jb25zdHtcbmZpbmlzaD11bmRlZmluZWQsXG5yZWNlaXZlQW1wbGlmaWVyPXVuZGVmaW5lZCxcbnJlY2VpdmVJbnN0YW5jZVRlc3Rlcj11bmRlZmluZWR9PVxub3B0aW9ucztcbnJlY2VpdmVBbXBsaWZpZXI9PT11bmRlZmluZWR8fFxuRmFpbCBgT25seSBmYWNldHMgb2YgYW4gZXhvIGNsYXNzIGtpdCBjYW4gYmUgYW1wbGlmaWVkICR7cSh0YWcpfWA7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgY29udGV4dE1hcD1uZXcgV2Vha01hcCgpO1xuY29uc3QgcHJvdG89ZGVmZW5kUHJvdG90eXBlKFxudGFnLFxuKHNlbGYpPT4vKiAgICAgICAgICAgICAgKi9jb250ZXh0TWFwLmdldChzZWxmKSxcbm1ldGhvZHMsXG50cnVlLFxuaW50ZXJmYWNlR3VhcmQpO1xuXG5sZXQgaW5zdGFuY2VDb3VudD0wO1xuLypcblxuICAgKi9cbmNvbnN0IG1ha2VJbnN0YW5jZT0oLi4uYXJncyk9Pntcbi8vXG5jb25zdCBzdGF0ZT1zZWFsKGluaXQoLi4uYXJncykpO1xuaW5zdGFuY2VDb3VudCs9MTtcbmNvbnN0IHNlbGY9bWFrZVNlbGYocHJvdG8saW5zdGFuY2VDb3VudCk7XG5cbi8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgY29udGV4dD1mcmVlemUoe3N0YXRlLHNlbGZ9KTtcbmNvbnRleHRNYXAuc2V0KHNlbGYsY29udGV4dCk7XG5pZihmaW5pc2gpe1xuZmluaXNoKGNvbnRleHQpO1xuIH1cbnJldHVybiBzZWxmO1xuIH07XG5cbmlmKHJlY2VpdmVJbnN0YW5jZVRlc3Rlcil7XG4vKiAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBpc0luc3RhbmNlPShleG8sZmFjZXROYW1lPXVuZGVmaW5lZCk9PntcbmZhY2V0TmFtZT09PXVuZGVmaW5lZHx8XG5GYWlsIGBmYWNldE5hbWUgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIGFuIGV4byBjbGFzcyBraXQ6ICR7cShcbnRhZylcbiB9IGhhcyBubyBmYWNldCAke3EoZmFjZXROYW1lKX1gO1xucmV0dXJuIGNvbnRleHRNYXAuaGFzKGV4byk7XG4gfTtcbmhhcmRlbihpc0luc3RhbmNlKTtcbnJlY2VpdmVJbnN0YW5jZVRlc3Rlcihpc0luc3RhbmNlKTtcbiB9XG5cbnJldHVybiBoYXJkZW4obWFrZUluc3RhbmNlKTtcbiB9OyRozY9fb25jZS5kZWZpbmVFeG9DbGFzcyhkZWZpbmVFeG9DbGFzcyk7XG5oYXJkZW4oZGVmaW5lRXhvQ2xhc3MpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGRlZmluZUV4b0NsYXNzS2l0PShcbnRhZyxcbmludGVyZmFjZUd1YXJkS2l0LFxuaW5pdCxcbm1ldGhvZHNLaXQsXG5vcHRpb25zPXt9KT0+XG57XG5oYXJkZW4obWV0aG9kc0tpdCk7XG5jb25zdHtcbmZpbmlzaD11bmRlZmluZWQsXG5yZWNlaXZlQW1wbGlmaWVyPXVuZGVmaW5lZCxcbnJlY2VpdmVJbnN0YW5jZVRlc3Rlcj11bmRlZmluZWR9PVxub3B0aW9ucztcbmNvbnN0IGNvbnRleHRNYXBLaXQ9b2JqZWN0TWFwKG1ldGhvZHNLaXQsKCk9Pm5ldyBXZWFrTWFwKCkpO1xuY29uc3QgZ2V0Q29udGV4dEtpdD1vYmplY3RNYXAoXG5jb250ZXh0TWFwS2l0LFxuKGNvbnRleHRNYXApPT4oZmFjZXQpPT5jb250ZXh0TWFwLmdldChmYWNldCkpO1xuXG5jb25zdCBwcm90b3R5cGVLaXQ9ZGVmZW5kUHJvdG90eXBlS2l0KFxudGFnLFxuZ2V0Q29udGV4dEtpdCxcbm1ldGhvZHNLaXQsXG50cnVlLFxuaW50ZXJmYWNlR3VhcmRLaXQpO1xuXG5sZXQgaW5zdGFuY2VDb3VudD0wO1xuLypcblxuICAgKi9cbmNvbnN0IG1ha2VJbnN0YW5jZUtpdD0oLi4uYXJncyk9Pntcbi8vXG5jb25zdCBzdGF0ZT1zZWFsKGluaXQoLi4uYXJncykpO1xuLy9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGNvbnRleHQ9e3N0YXRlLGZhY2V0czpudWxsfTtcbmluc3RhbmNlQ291bnQrPTE7XG5jb25zdCBmYWNldHM9b2JqZWN0TWFwKHByb3RvdHlwZUtpdCwocHJvdG8sZmFjZXROYW1lKT0+e1xuY29uc3Qgc2VsZj1tYWtlU2VsZihwcm90byxpbnN0YW5jZUNvdW50KTtcbmNvbnRleHRNYXBLaXRbZmFjZXROYW1lXS5zZXQoc2VsZixjb250ZXh0KTtcbnJldHVybiBzZWxmO1xuIH0pO1xuY29udGV4dC5mYWNldHM9ZmFjZXRzO1xuLy9cbmZyZWV6ZShjb250ZXh0KTtcbmlmKGZpbmlzaCl7XG5maW5pc2goY29udGV4dCk7XG4gfVxucmV0dXJuICgvKiAgICAgICAgICAgICAgICAgICAgICAgICovY29udGV4dC5mYWNldHMpO1xuIH07XG5cbmlmKHJlY2VpdmVBbXBsaWZpZXIpe1xuLyogICAgICAgICAgICAgICAgICAqL1xuY29uc3QgYW1wbGlmeT0oZXhvRmFjZXQpPT57XG5mb3IoY29uc3QgY29udGV4dE1hcCBvZiB2YWx1ZXMoY29udGV4dE1hcEtpdCkpe1xuaWYoY29udGV4dE1hcC5oYXMoZXhvRmFjZXQpKXtcbmNvbnN0e2ZhY2V0c309Y29udGV4dE1hcC5nZXQoZXhvRmFjZXQpO1xucmV0dXJuIGZhY2V0cztcbiB9XG4gfVxudGhyb3cgRmFpbCBgTXVzdCBiZSBhIGZhY2V0IG9mICR7cSh0YWcpfTogJHtleG9GYWNldH1gO1xuIH07XG5oYXJkZW4oYW1wbGlmeSk7XG5yZWNlaXZlQW1wbGlmaWVyKGFtcGxpZnkpO1xuIH1cblxuaWYocmVjZWl2ZUluc3RhbmNlVGVzdGVyKXtcbi8qICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGlzSW5zdGFuY2U9KGV4b0ZhY2V0LGZhY2V0TmFtZT11bmRlZmluZWQpPT57XG5pZihmYWNldE5hbWU9PT11bmRlZmluZWQpe1xucmV0dXJuIHZhbHVlcyhjb250ZXh0TWFwS2l0KS5zb21lKChjb250ZXh0TWFwKT0+XG5jb250ZXh0TWFwLmhhcyhleG9GYWNldCkpO1xuXG4gfVxuYXNzZXJ0LnR5cGVvZihmYWNldE5hbWUsJ3N0cmluZycpO1xuY29uc3QgY29udGV4dE1hcD1jb250ZXh0TWFwS2l0W2ZhY2V0TmFtZV07XG5jb250ZXh0TWFwIT09dW5kZWZpbmVkfHxcbkZhaWwgYGV4byBjbGFzcyBraXQgJHtxKHRhZyl9IGhhcyBubyBmYWNldCBuYW1lZCAke3EoZmFjZXROYW1lKX1gO1xucmV0dXJuIGNvbnRleHRNYXAuaGFzKGV4b0ZhY2V0KTtcbiB9O1xuaGFyZGVuKGlzSW5zdGFuY2UpO1xucmVjZWl2ZUluc3RhbmNlVGVzdGVyKGlzSW5zdGFuY2UpO1xuIH1cblxucmV0dXJuIGhhcmRlbihtYWtlSW5zdGFuY2VLaXQpO1xuIH07JGjNj19vbmNlLmRlZmluZUV4b0NsYXNzS2l0KGRlZmluZUV4b0NsYXNzS2l0KTtcbmhhcmRlbihkZWZpbmVFeG9DbGFzc0tpdCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZUV4bz0odGFnLGludGVyZmFjZUd1YXJkLG1ldGhvZHMsb3B0aW9ucz11bmRlZmluZWQpPT57XG5jb25zdCBtYWtlSW5zdGFuY2U9ZGVmaW5lRXhvQ2xhc3MoXG50YWcsXG5pbnRlcmZhY2VHdWFyZCxcbmluaXRFbXB0eSxcbm1ldGhvZHMsXG5vcHRpb25zKTtcblxucmV0dXJuIG1ha2VJbnN0YW5jZSgpO1xuIH07JGjNj19vbmNlLm1ha2VFeG8obWFrZUV4byk7XG5oYXJkZW4obWFrZUV4byk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpbml0RW1wdHkiOlsiaW5pdEVtcHR5Il0sImRlZmluZUV4b0NsYXNzIjpbImRlZmluZUV4b0NsYXNzIl0sImRlZmluZUV4b0NsYXNzS2l0IjpbImRlZmluZUV4b0NsYXNzS2l0Il0sIm1ha2VFeG8iOlsibWFrZUV4byJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAjBf3IFTAAABUwAAAhAAAAQGVuZG8vZXhvLXYxLjUuOC9zcmMvZXhvLXRvb2xzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vZmFyIiwiQGVuZG8vcGF0dGVybnMiLCJAZW5kby9jb21tb24vbGlzdC1kaWZmZXJlbmNlLmpzIiwiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiLCJAZW5kby9lcnJvcnMiLCIuL2dldC1pbnRlcmZhY2UuanMiXSwiZXhwb3J0cyI6WyJkZWZlbmRQcm90b3R5cGUiLCJkZWZlbmRQcm90b3R5cGVLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBnZXRNZXRob2ROYW1lcyxoYXNPd25Qcm9wZXJ0eU9mLHRvVGhyb3dhYmxlLEUsRmFyLG11c3RNYXRjaCxNLGlzQXdhaXRBcmdHdWFyZCxpc1Jhd0d1YXJkLGdldEF3YWl0QXJnR3VhcmRQYXlsb2FkLGdldE1ldGhvZEd1YXJkUGF5bG9hZCxnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQsZ2V0Q29weU1hcEVudHJpZXMsbGlzdERpZmZlcmVuY2Usb2JqZWN0TWFwLHEsRmFpbCxHRVRfSU5URVJGQUNFX0dVQVJEOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qc1wiLCBbW1wiZ2V0TWV0aG9kTmFtZXNcIiwgWyRozY9fYSA9PiAoZ2V0TWV0aG9kTmFtZXMgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaM2PX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaM2PX2EpXV0sW1widG9UaHJvd2FibGVcIiwgWyRozY9fYSA9PiAodG9UaHJvd2FibGUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXSxbXCJGYXJcIiwgWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIm11c3RNYXRjaFwiLCBbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV0sW1wiTVwiLCBbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcImlzQXdhaXRBcmdHdWFyZFwiLCBbJGjNj19hID0+IChpc0F3YWl0QXJnR3VhcmQgPSAkaM2PX2EpXV0sW1wiaXNSYXdHdWFyZFwiLCBbJGjNj19hID0+IChpc1Jhd0d1YXJkID0gJGjNj19hKV1dLFtcImdldEF3YWl0QXJnR3VhcmRQYXlsb2FkXCIsIFskaM2PX2EgPT4gKGdldEF3YWl0QXJnR3VhcmRQYXlsb2FkID0gJGjNj19hKV1dLFtcImdldE1ldGhvZEd1YXJkUGF5bG9hZFwiLCBbJGjNj19hID0+IChnZXRNZXRob2RHdWFyZFBheWxvYWQgPSAkaM2PX2EpXV0sW1wiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkXCIsIFskaM2PX2EgPT4gKGdldEludGVyZmFjZUd1YXJkUGF5bG9hZCA9ICRozY9fYSldXSxbXCJnZXRDb3B5TWFwRW50cmllc1wiLCBbJGjNj19hID0+IChnZXRDb3B5TWFwRW50cmllcyA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9saXN0LWRpZmZlcmVuY2UuanNcIiwgW1tcImxpc3REaWZmZXJlbmNlXCIsIFskaM2PX2EgPT4gKGxpc3REaWZmZXJlbmNlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanNcIiwgW1tcIm9iamVjdE1hcFwiLCBbJGjNj19hID0+IChvYmplY3RNYXAgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIiwgWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsIFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL2dldC1pbnRlcmZhY2UuanNcIiwgW1tcIkdFVF9JTlRFUkZBQ0VfR1VBUkRcIiwgWyRozY9fYSA9PiAoR0VUX0lOVEVSRkFDRV9HVUFSRCA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLypcblxuXG4gKi9cblxuY29uc3R7YXBwbHksb3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2RlZmluZVByb3BlcnRpZXMsZnJvbUVudHJpZXN9PU9iamVjdDtcblxuLypcblxuXG4gKi9cbmNvbnN0IFJhd01ldGhvZEd1YXJkPU0uY2FsbCgpLnJlc3QoTS5yYXcoKSkucmV0dXJucyhNLnJhdygpKTtcblxuY29uc3QgUkVEQUNURURfUkFXX0FSRz0nPHJlZGFjdGVkIHJhdyBhcmc+JztcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IFBhc3NhYmxlTWV0aG9kR3VhcmQ9TS5jYWxsKCkucmVzdChNLmFueSgpKS5yZXR1cm5zKE0uYW55KCkpO1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGRlZmVuZFN5bmNBcmdzPShzeW5jQXJncyxtYXRjaENvbmZpZyxsYWJlbD11bmRlZmluZWQpPT57XG5jb25zdHtcbmRlY2xhcmVkTGVuLFxuaGFzUmVzdEFyZ0d1YXJkLFxucmVzdEFyZ0d1YXJkSXNSYXcsXG5wYXJhbXNQYXR0ZXJuLFxucmVkYWN0ZWRJbmRpY2VzfT1cbm1hdGNoQ29uZmlnO1xuXG4vL1xuLy9cbmxldCBtYXRjaGFibGVBcmdzPXN5bmNBcmdzO1xuaWYocmVzdEFyZ0d1YXJkSXNSYXcmJnN5bmNBcmdzLmxlbmd0aD5kZWNsYXJlZExlbil7XG5jb25zdCByZXN0TGVuPXN5bmNBcmdzLmxlbmd0aC1kZWNsYXJlZExlbjtcbmNvbnN0IHJlZGFjdGVkUmVzdD1BcnJheShyZXN0TGVuKS5maWxsKFJFREFDVEVEX1JBV19BUkcpO1xubWF0Y2hhYmxlQXJncz1bLi4uc3luY0FyZ3Muc2xpY2UoMCxkZWNsYXJlZExlbiksLi4ucmVkYWN0ZWRSZXN0XTtcbiB9ZWxzZSBpZihcbnJlZGFjdGVkSW5kaWNlcy5sZW5ndGg+MCYmXG5yZWRhY3RlZEluZGljZXNbMF08c3luY0FyZ3MubGVuZ3RoKVxue1xuLy9cbi8vXG5tYXRjaGFibGVBcmdzPVsuLi5zeW5jQXJnc107XG4gfVxuXG5mb3IoY29uc3QgaSBvZiByZWRhY3RlZEluZGljZXMpe1xuaWYoaT49bWF0Y2hhYmxlQXJncy5sZW5ndGgpe1xuYnJlYWs7XG4gfVxubWF0Y2hhYmxlQXJnc1tpXT1SRURBQ1RFRF9SQVdfQVJHO1xuIH1cblxubXVzdE1hdGNoKGhhcmRlbihtYXRjaGFibGVBcmdzKSxwYXJhbXNQYXR0ZXJuLGxhYmVsKTtcblxuaWYoaGFzUmVzdEFyZ0d1YXJkKXtcbnJldHVybiBzeW5jQXJncztcbiB9XG5zeW5jQXJncy5sZW5ndGg8PWRlY2xhcmVkTGVufHxcbkZhaWwgYCR7cShsYWJlbCl9IGFjY2VwdHMgYXQgbW9zdCAke3EoZGVjbGFyZWRMZW4pfSBhcmd1bWVudHMsIG5vdCAke3EoXG5zeW5jQXJncy5sZW5ndGgpXG4gfTogJHtzeW5jQXJnc31gO1xucmV0dXJuIHN5bmNBcmdzO1xuIH07XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgYnVpbGRNYXRjaENvbmZpZz0obWV0aG9kR3VhcmRQYXlsb2FkKT0+e1xuY29uc3R7XG5hcmdHdWFyZHMsXG5vcHRpb25hbEFyZ0d1YXJkcz1bXSxcbnJlc3RBcmdHdWFyZH09XG5tZXRob2RHdWFyZFBheWxvYWQ7XG5cbmNvbnN0IG1hdGNoYWJsZUFyZ0d1YXJkcz1bLi4uYXJnR3VhcmRzLC4uLm9wdGlvbmFsQXJnR3VhcmRzXTtcblxuY29uc3QgcmVkYWN0ZWRJbmRpY2VzPVtdO1xuZm9yKGxldCBpPTA7aTxtYXRjaGFibGVBcmdHdWFyZHMubGVuZ3RoO2krPTEpe1xuaWYoaXNSYXdHdWFyZChtYXRjaGFibGVBcmdHdWFyZHNbaV0pKXtcbm1hdGNoYWJsZUFyZ0d1YXJkc1tpXT1SRURBQ1RFRF9SQVdfQVJHO1xucmVkYWN0ZWRJbmRpY2VzLnB1c2goaSk7XG4gfVxuIH1cblxuLy9cbmxldCBtYXRjaGFibGVSZXN0QXJnR3VhcmQ9cmVzdEFyZ0d1YXJkO1xuaWYoaXNSYXdHdWFyZChtYXRjaGFibGVSZXN0QXJnR3VhcmQpKXtcbm1hdGNoYWJsZVJlc3RBcmdHdWFyZD1NLmFycmF5T2YoUkVEQUNURURfUkFXX0FSRyk7XG4gfVxuY29uc3QgbWF0Y2hhYmxlTWV0aG9kR3VhcmRQYXlsb2FkPWhhcmRlbih7XG4uLi5tZXRob2RHdWFyZFBheWxvYWQsXG5hcmdHdWFyZHM6bWF0Y2hhYmxlQXJnR3VhcmRzLnNsaWNlKDAsYXJnR3VhcmRzLmxlbmd0aCksXG5vcHRpb25hbEFyZ0d1YXJkczptYXRjaGFibGVBcmdHdWFyZHMuc2xpY2UoYXJnR3VhcmRzLmxlbmd0aCksXG5yZXN0QXJnR3VhcmQ6bWF0Y2hhYmxlUmVzdEFyZ0d1YXJkfSk7XG5cblxuY29uc3QgcGFyYW1zUGF0dGVybj1NLnNwbGl0QXJyYXkoXG5tYXRjaGFibGVNZXRob2RHdWFyZFBheWxvYWQuYXJnR3VhcmRzLFxubWF0Y2hhYmxlTWV0aG9kR3VhcmRQYXlsb2FkLm9wdGlvbmFsQXJnR3VhcmRzLFxubWF0Y2hhYmxlTWV0aG9kR3VhcmRQYXlsb2FkLnJlc3RBcmdHdWFyZCk7XG5cblxucmV0dXJuIGhhcmRlbih7XG5kZWNsYXJlZExlbjptYXRjaGFibGVBcmdHdWFyZHMubGVuZ3RoLFxuaGFzUmVzdEFyZ0d1YXJkOnJlc3RBcmdHdWFyZCE9PXVuZGVmaW5lZCxcbnJlc3RBcmdHdWFyZElzUmF3OnJlc3RBcmdHdWFyZCE9PW1hdGNoYWJsZVJlc3RBcmdHdWFyZCxcbnBhcmFtc1BhdHRlcm4sXG5yZWRhY3RlZEluZGljZXMsXG5tYXRjaGFibGVNZXRob2RHdWFyZFBheWxvYWR9KTtcblxuIH07XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBkZWZlbmRTeW5jTWV0aG9kPShcbmdldENvbnRleHQsXG5iZWhhdmlvck1ldGhvZCxcbm1ldGhvZEd1YXJkUGF5bG9hZCxcbmxhYmVsKT0+XG57XG5jb25zdHtyZXR1cm5HdWFyZH09bWV0aG9kR3VhcmRQYXlsb2FkO1xuY29uc3QgaXNSYXdSZXR1cm49aXNSYXdHdWFyZChyZXR1cm5HdWFyZCk7XG5jb25zdCBtYXRjaENvbmZpZz1idWlsZE1hdGNoQ29uZmlnKG1ldGhvZEd1YXJkUGF5bG9hZCk7XG5jb25zdHtzeW5jTWV0aG9kfT17XG4vL1xuc3luY01ldGhvZCguLi5zeW5jQXJncyl7XG50cnl7XG5jb25zdCBjb250ZXh0PWdldENvbnRleHQodGhpcyk7XG4vL1xuY29uc3QgcmVhbEFyZ3M9ZGVmZW5kU3luY0FyZ3Moc3luY0FyZ3MsbWF0Y2hDb25maWcsbGFiZWwpO1xuY29uc3QgcmVzdWx0PWFwcGx5KGJlaGF2aW9yTWV0aG9kLGNvbnRleHQscmVhbEFyZ3MpO1xuaWYoIWlzUmF3UmV0dXJuKXtcbm11c3RNYXRjaChoYXJkZW4ocmVzdWx0KSxyZXR1cm5HdWFyZCwgYCR7bGFiZWx9OiByZXN1bHRgKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH1jYXRjaCh0aHJvd25UaGluZyl7XG50aHJvdyB0b1Rocm93YWJsZSh0aHJvd25UaGluZyk7XG4gfVxuIH19O1xuXG5yZXR1cm4gc3luY01ldGhvZDtcbiB9O1xuXG4vKlxuXG4gKi9cbmNvbnN0IGRlc3luYz0obWV0aG9kR3VhcmRQYXlsb2FkKT0+e1xuY29uc3R7XG5hcmdHdWFyZHMsXG5vcHRpb25hbEFyZ0d1YXJkcz1bXSxcbnJlc3RBcmdHdWFyZH09XG5tZXRob2RHdWFyZFBheWxvYWQ7XG4haXNBd2FpdEFyZ0d1YXJkKHJlc3RBcmdHdWFyZCl8fFxuRmFpbCBgUmVzdCBhcmdzIG1heSBub3QgYmUgYXdhaXRlZDogJHtyZXN0QXJnR3VhcmR9YDtcbmNvbnN0IHJhd0FyZ0d1YXJkcz1bLi4uYXJnR3VhcmRzLC4uLm9wdGlvbmFsQXJnR3VhcmRzXTtcblxuY29uc3QgYXdhaXRJbmRleGVzPVtdO1xuZm9yKGxldCBpPTA7aTxyYXdBcmdHdWFyZHMubGVuZ3RoO2krPTEpe1xuY29uc3QgYXJnR3VhcmQ9cmF3QXJnR3VhcmRzW2ldO1xuaWYoaXNBd2FpdEFyZ0d1YXJkKGFyZ0d1YXJkKSl7XG5yYXdBcmdHdWFyZHNbaV09Z2V0QXdhaXRBcmdHdWFyZFBheWxvYWQoYXJnR3VhcmQpLmFyZ0d1YXJkO1xuYXdhaXRJbmRleGVzLnB1c2goaSk7XG4gfVxuIH1cbnJldHVybntcbmF3YWl0SW5kZXhlcyxcbnJhd01ldGhvZEd1YXJkUGF5bG9hZDp7XG4uLi5tZXRob2RHdWFyZFBheWxvYWQsXG5hcmdHdWFyZHM6cmF3QXJnR3VhcmRzLnNsaWNlKDAsYXJnR3VhcmRzLmxlbmd0aCksXG5vcHRpb25hbEFyZ0d1YXJkczpyYXdBcmdHdWFyZHMuc2xpY2UoYXJnR3VhcmRzLmxlbmd0aCl9fTtcblxuXG4gfTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBkZWZlbmRBc3luY01ldGhvZD0oXG5nZXRDb250ZXh0LFxuYmVoYXZpb3JNZXRob2QsXG5tZXRob2RHdWFyZFBheWxvYWQsXG5sYWJlbCk9Plxue1xuY29uc3R7cmV0dXJuR3VhcmR9PW1ldGhvZEd1YXJkUGF5bG9hZDtcbmNvbnN0IGlzUmF3UmV0dXJuPWlzUmF3R3VhcmQocmV0dXJuR3VhcmQpO1xuXG5jb25zdHthd2FpdEluZGV4ZXMscmF3TWV0aG9kR3VhcmRQYXlsb2FkfT1kZXN5bmMobWV0aG9kR3VhcmRQYXlsb2FkKTtcbmNvbnN0IG1hdGNoQ29uZmlnPWJ1aWxkTWF0Y2hDb25maWcocmF3TWV0aG9kR3VhcmRQYXlsb2FkKTtcblxuY29uc3R7YXN5bmNNZXRob2R9PXtcbi8vXG5hc3luY01ldGhvZCguLi5hcmdzKXtcbmNvbnN0IGF3YWl0TGlzdD1bXTtcbmZvcihjb25zdCBpIG9mIGF3YWl0SW5kZXhlcyl7XG5pZihpPj1hcmdzLmxlbmd0aCl7XG5icmVhaztcbiB9XG5hd2FpdExpc3QucHVzaChhcmdzW2ldKTtcbiB9XG5jb25zdCBwPVByb21pc2UuYWxsKGF3YWl0TGlzdCk7XG5jb25zdCBzeW5jQXJncz1bLi4uYXJnc107XG5jb25zdCByZXN1bHRQPUUud2hlbihcbnAsXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8oYXdhaXRlZEFyZ3MpPT57XG5mb3IobGV0IGo9MDtqPGF3YWl0ZWRBcmdzLmxlbmd0aDtqKz0xKXtcbnN5bmNBcmdzW2F3YWl0SW5kZXhlc1tqXV09YXdhaXRlZEFyZ3Nbal07XG4gfVxuLy9cbi8vXG5jb25zdCBjb250ZXh0PWdldENvbnRleHQodGhpcyk7XG5jb25zdCByZWFsQXJncz1kZWZlbmRTeW5jQXJncyhzeW5jQXJncyxtYXRjaENvbmZpZyxsYWJlbCk7XG5yZXR1cm4gYXBwbHkoYmVoYXZpb3JNZXRob2QsY29udGV4dCxyZWFsQXJncyk7XG4gfSk7XG5cbnJldHVybiBFLndoZW4ocmVzdWx0UCwoZnVsZmlsbG1lbnQpPT57XG5pZighaXNSYXdSZXR1cm4pe1xubXVzdE1hdGNoKGhhcmRlbihmdWxmaWxsbWVudCkscmV0dXJuR3VhcmQsIGAke2xhYmVsfTogcmVzdWx0YCk7XG4gfVxucmV0dXJuIGZ1bGZpbGxtZW50O1xuIH0pLmNhdGNoKChyZWFzb24pPT5cbi8vXG4vL1xuUHJvbWlzZS5yZWplY3QodG9UaHJvd2FibGUocmVhc29uKSkpO1xuXG4gfX07XG5cbnJldHVybiBhc3luY01ldGhvZDtcbiB9O1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgZGVmZW5kTWV0aG9kPShnZXRDb250ZXh0LGJlaGF2aW9yTWV0aG9kLG1ldGhvZEd1YXJkLGxhYmVsKT0+e1xuY29uc3QgbWV0aG9kR3VhcmRQYXlsb2FkPWdldE1ldGhvZEd1YXJkUGF5bG9hZChtZXRob2RHdWFyZCk7XG5jb25zdHtjYWxsS2luZH09bWV0aG9kR3VhcmRQYXlsb2FkO1xuaWYoY2FsbEtpbmQ9PT0nc3luYycpe1xucmV0dXJuIGRlZmVuZFN5bmNNZXRob2QoXG5nZXRDb250ZXh0LFxuYmVoYXZpb3JNZXRob2QsXG5tZXRob2RHdWFyZFBheWxvYWQsXG5sYWJlbCk7XG5cbiB9ZWxzZXtcbmFzc2VydChjYWxsS2luZD09PSdhc3luYycpO1xucmV0dXJuIGRlZmVuZEFzeW5jTWV0aG9kKFxuZ2V0Q29udGV4dCxcbmJlaGF2aW9yTWV0aG9kLFxubWV0aG9kR3VhcmRQYXlsb2FkLFxubGFiZWwpO1xuXG4gfVxuIH07XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgYmluZE1ldGhvZD0oXG5tZXRob2RUYWcsXG5jb250ZXh0UHJvdmlkZXIsXG5iZWhhdmlvck1ldGhvZCxcbm1ldGhvZEd1YXJkKT0+XG57XG5hc3NlcnQudHlwZW9mKGJlaGF2aW9yTWV0aG9kLCdmdW5jdGlvbicpO1xuXG4vKlxuXG5cbiAgICovXG5jb25zdCBnZXRDb250ZXh0PShyZXByZXNlbnRhdGl2ZSk9PntcbnJlcHJlc2VudGF0aXZlfHxcbi8vXG5GYWlsIGBNZXRob2QgJHttZXRob2RUYWd9IGNhbGxlZCB3aXRob3V0ICd0aGlzJyBvYmplY3RgO1xuY29uc3QgY29udGV4dD1jb250ZXh0UHJvdmlkZXIocmVwcmVzZW50YXRpdmUpO1xuaWYoY29udGV4dD09PXVuZGVmaW5lZCl7XG50aHJvdyBGYWlsIGAke3EoXG5tZXRob2RUYWcpXG4gfSBtYXkgb25seSBiZSBhcHBsaWVkIHRvIGEgdmFsaWQgaW5zdGFuY2U6ICR7cmVwcmVzZW50YXRpdmV9YDtcbiB9XG5yZXR1cm4gY29udGV4dDtcbiB9O1xuXG5jb25zdCBtZXRob2Q9ZGVmZW5kTWV0aG9kKFxuZ2V0Q29udGV4dCxcbmJlaGF2aW9yTWV0aG9kLFxubWV0aG9kR3VhcmQsXG5tZXRob2RUYWcpO1xuXG5cbmRlZmluZVByb3BlcnRpZXMobWV0aG9kLHtcbm5hbWU6e3ZhbHVlOm1ldGhvZFRhZ30sXG5sZW5ndGg6e3ZhbHVlOmJlaGF2aW9yTWV0aG9kLmxlbmd0aH19KTtcblxucmV0dXJuIG1ldGhvZDtcbiB9O1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgZGVmZW5kUHJvdG90eXBlPShcbnRhZyxcbmNvbnRleHRQcm92aWRlcixcbmJlaGF2aW9yTWV0aG9kcyxcbnRoaXNmdWxNZXRob2RzPWZhbHNlLFxuaW50ZXJmYWNlR3VhcmQ9dW5kZWZpbmVkKT0+XG57XG5jb25zdCBwcm90b3R5cGU9e307XG5jb25zdCBtZXRob2ROYW1lcz1nZXRNZXRob2ROYW1lcyhiZWhhdmlvck1ldGhvZHMpLmZpbHRlcihcbi8vXG4vL1xuKGtleSk9PntcbmlmKGtleSE9PSdjb25zdHJ1Y3Rvcicpe1xucmV0dXJuIHRydWU7XG4gfVxuY29uc3QgY29uc3RydWN0b3I9YmVoYXZpb3JNZXRob2RzLmNvbnN0cnVjdG9yO1xucmV0dXJuIShcbmNvbnN0cnVjdG9yLnByb3RvdHlwZSYmXG5jb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3I9PT1jb25zdHJ1Y3Rvcik7XG5cbiB9KTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmxldCBtZXRob2RHdWFyZHM7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xubGV0IGRlZmF1bHRHdWFyZHM7XG5pZihpbnRlcmZhY2VHdWFyZCl7XG5jb25zdHtcbmludGVyZmFjZU5hbWUsXG5tZXRob2RHdWFyZHM6bWcsXG5zeW1ib2xNZXRob2RHdWFyZHMsXG5zbG9wcHksXG5kZWZhdWx0R3VhcmRzOmRnPXNsb3BweT8ncGFzc2FibGUnOmRlZmF1bHRHdWFyZHN9PVxuZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkKGludGVyZmFjZUd1YXJkKTtcbm1ldGhvZEd1YXJkcz1oYXJkZW4oe1xuLi4ubWcsXG4uLi4oc3ltYm9sTWV0aG9kR3VhcmRzJiZcbmZyb21FbnRyaWVzKGdldENvcHlNYXBFbnRyaWVzKHN5bWJvbE1ldGhvZEd1YXJkcykpKX0pO1xuXG5kZWZhdWx0R3VhcmRzPWRnO1xue1xuY29uc3QgbWV0aG9kR3VhcmROYW1lcz1vd25LZXlzKG1ldGhvZEd1YXJkcyk7XG5jb25zdCB1bmltcGxlbWVudGVkPWxpc3REaWZmZXJlbmNlKG1ldGhvZEd1YXJkTmFtZXMsbWV0aG9kTmFtZXMpO1xudW5pbXBsZW1lbnRlZC5sZW5ndGg9PT0wfHxcbkZhaWwgYG1ldGhvZHMgJHtxKHVuaW1wbGVtZW50ZWQpfSBub3QgaW1wbGVtZW50ZWQgYnkgJHtxKHRhZyl9YDtcbmlmKGRlZmF1bHRHdWFyZHM9PT11bmRlZmluZWQpe1xuY29uc3QgdW5ndWFyZGVkPWxpc3REaWZmZXJlbmNlKG1ldGhvZE5hbWVzLG1ldGhvZEd1YXJkTmFtZXMpO1xudW5ndWFyZGVkLmxlbmd0aD09PTB8fFxuRmFpbCBgbWV0aG9kcyAke3EodW5ndWFyZGVkKX0gbm90IGd1YXJkZWQgYnkgJHtxKGludGVyZmFjZU5hbWUpfWA7XG4gfVxuIH1cbiB9XG5cbmZvcihjb25zdCBwcm9wIG9mIG1ldGhvZE5hbWVzKXtcbmNvbnN0IG9yaWdpbmFsTWV0aG9kPWJlaGF2aW9yTWV0aG9kc1twcm9wXTtcbmNvbnN0e3NoaWZ0ZWRNZXRob2R9PXtcbnNoaWZ0ZWRNZXRob2QoLi4uYXJncyl7XG5yZXR1cm4gb3JpZ2luYWxNZXRob2QodGhpcywuLi5hcmdzKTtcbiB9fTtcblxuY29uc3QgYmVoYXZpb3JNZXRob2Q9dGhpc2Z1bE1ldGhvZHM/b3JpZ2luYWxNZXRob2Q6c2hpZnRlZE1ldGhvZDtcbi8vXG4vL1xubGV0IG1ldGhvZEd1YXJkPW1ldGhvZEd1YXJkcyYmbWV0aG9kR3VhcmRzW3Byb3BdO1xuaWYoIW1ldGhvZEd1YXJkKXtcbnN3aXRjaChkZWZhdWx0R3VhcmRzKXtcbmNhc2UgdW5kZWZpbmVkOntcbmlmKHRoaXNmdWxNZXRob2RzKXtcbm1ldGhvZEd1YXJkPVBhc3NhYmxlTWV0aG9kR3VhcmQ7XG4gfWVsc2V7XG5tZXRob2RHdWFyZD1SYXdNZXRob2RHdWFyZDtcbiB9XG5icmVhaztcbiB9XG5jYXNlJ3Bhc3NhYmxlJzp7XG5tZXRob2RHdWFyZD1QYXNzYWJsZU1ldGhvZEd1YXJkO1xuYnJlYWs7XG4gfVxuY2FzZSdyYXcnOntcbm1ldGhvZEd1YXJkPVJhd01ldGhvZEd1YXJkO1xuYnJlYWs7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGBVbnJlY29nbml6ZWQgZGVmYXVsdEd1YXJkcyAke3EoZGVmYXVsdEd1YXJkcyl9YDtcbiB9fVxuXG4gfVxucHJvdG90eXBlW3Byb3BdPWJpbmRNZXRob2QoXG4gYEluICR7cShwcm9wKX0gbWV0aG9kIG9mICgke3RhZ30pYCxcbmNvbnRleHRQcm92aWRlcixcbmJlaGF2aW9yTWV0aG9kLFxubWV0aG9kR3VhcmQpO1xuXG4gfVxuXG5pZighaGFzT3duUHJvcGVydHlPZihwcm90b3R5cGUsR0VUX0lOVEVSRkFDRV9HVUFSRCkpe1xuY29uc3QgZ2V0SW50ZXJmYWNlR3VhcmRNZXRob2Q9e1xuW0dFVF9JTlRFUkZBQ0VfR1VBUkRdKCl7XG4vL1xucmV0dXJuIGludGVyZmFjZUd1YXJkO1xuIH19W1xuR0VUX0lOVEVSRkFDRV9HVUFSRF07XG5wcm90b3R5cGVbR0VUX0lOVEVSRkFDRV9HVUFSRF09YmluZE1ldGhvZChcbiBgSW4gJHtxKEdFVF9JTlRFUkZBQ0VfR1VBUkQpfSBtZXRob2Qgb2YgKCR7dGFnfSlgLFxuY29udGV4dFByb3ZpZGVyLFxuZ2V0SW50ZXJmYWNlR3VhcmRNZXRob2QsXG5QYXNzYWJsZU1ldGhvZEd1YXJkKTtcblxuIH1cblxucmV0dXJuIEZhcihcbnRhZyxcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5wcm90b3R5cGUpO1xuXG5cbiB9OyRozY9fb25jZS5kZWZlbmRQcm90b3R5cGUoZGVmZW5kUHJvdG90eXBlKTtcbmhhcmRlbihkZWZlbmRQcm90b3R5cGUpO1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgZGVmZW5kUHJvdG90eXBlS2l0PShcbnRhZyxcbmNvbnRleHRQcm92aWRlcktpdCxcbmJlaGF2aW9yTWV0aG9kc0tpdCxcbnRoaXNmdWxNZXRob2RzPWZhbHNlLFxuaW50ZXJmYWNlR3VhcmRLaXQ9dW5kZWZpbmVkKT0+XG57XG5jb25zdCBmYWNldE5hbWVzPW93bktleXMoYmVoYXZpb3JNZXRob2RzS2l0KS5zb3J0KCk7XG5mYWNldE5hbWVzLmxlbmd0aD4xfHxGYWlsIGBBIG11bHRpLWZhY2V0IG9iamVjdCBtdXN0IGhhdmUgbXVsdGlwbGUgZmFjZXRzYDtcbmlmKGludGVyZmFjZUd1YXJkS2l0KXtcbmNvbnN0IGludGVyZmFjZU5hbWVzPW93bktleXMoaW50ZXJmYWNlR3VhcmRLaXQpO1xuY29uc3QgZXh0cmFJbnRlcmZhY2VOYW1lcz1saXN0RGlmZmVyZW5jZShmYWNldE5hbWVzLGludGVyZmFjZU5hbWVzKTtcbmV4dHJhSW50ZXJmYWNlTmFtZXMubGVuZ3RoPT09MHx8XG5GYWlsIGBJbnRlcmZhY2VzICR7cShleHRyYUludGVyZmFjZU5hbWVzKX0gbm90IGltcGxlbWVudGVkIGJ5ICR7cSh0YWcpfWA7XG5jb25zdCBleHRyYUZhY2V0TmFtZXM9bGlzdERpZmZlcmVuY2UoaW50ZXJmYWNlTmFtZXMsZmFjZXROYW1lcyk7XG5leHRyYUZhY2V0TmFtZXMubGVuZ3RoPT09MHx8XG5GYWlsIGBGYWNldHMgJHtxKGV4dHJhRmFjZXROYW1lcyl9IG9mICR7cSh0YWcpfSBub3QgZ3VhcmRlZCBieSBpbnRlcmZhY2VzYDtcbiB9XG5jb25zdCBjb250ZXh0TWFwTmFtZXM9b3duS2V5cyhjb250ZXh0UHJvdmlkZXJLaXQpO1xuY29uc3QgZXh0cmFDb250ZXh0TmFtZXM9bGlzdERpZmZlcmVuY2UoZmFjZXROYW1lcyxjb250ZXh0TWFwTmFtZXMpO1xuZXh0cmFDb250ZXh0TmFtZXMubGVuZ3RoPT09MHx8XG5GYWlsIGBDb250ZXh0cyAke3EoZXh0cmFDb250ZXh0TmFtZXMpfSBub3QgaW1wbGVtZW50ZWQgYnkgJHtxKHRhZyl9YDtcbmNvbnN0IGV4dHJhRmFjZXROYW1lcz1saXN0RGlmZmVyZW5jZShjb250ZXh0TWFwTmFtZXMsZmFjZXROYW1lcyk7XG5leHRyYUZhY2V0TmFtZXMubGVuZ3RoPT09MHx8XG5GYWlsIGBGYWNldHMgJHtxKGV4dHJhRmFjZXROYW1lcyl9IG9mICR7cSh0YWcpfSBtaXNzaW5nIGNvbnRleHRzYDtcbmNvbnN0IHByb3RvS2l0PW9iamVjdE1hcChiZWhhdmlvck1ldGhvZHNLaXQsKGJlaGF2aW9yTWV0aG9kcyxmYWNldE5hbWUpPT5cbmRlZmVuZFByb3RvdHlwZShcbiBgJHt0YWd9ICR7U3RyaW5nKGZhY2V0TmFtZSl9YCxcbmNvbnRleHRQcm92aWRlcktpdFtmYWNldE5hbWVdLFxuYmVoYXZpb3JNZXRob2RzLFxudGhpc2Z1bE1ldGhvZHMsXG5pbnRlcmZhY2VHdWFyZEtpdCYmaW50ZXJmYWNlR3VhcmRLaXRbZmFjZXROYW1lXSkpO1xuXG5cbnJldHVybiBwcm90b0tpdDtcbiB9OyRozY9fb25jZS5kZWZlbmRQcm90b3R5cGVLaXQoZGVmZW5kUHJvdG90eXBlS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmVuZFByb3RvdHlwZSI6WyJkZWZlbmRQcm90b3R5cGUiXSwiZGVmZW5kUHJvdG90eXBlS2l0IjpbImRlZmVuZFByb3RvdHlwZUtpdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADXllD+ZQIAAGUCAAAlAAAAQGVuZG8vZXhvLXYxLjUuOC9zcmMvZ2V0LWludGVyZmFjZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiR0VUX0lOVEVSRkFDRV9HVUFSRCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjNj19pbXBvcnRzKFtdKTsgICAvL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIEdFVF9JTlRFUkZBQ0VfR1VBUkQ9J19fZ2V0SW50ZXJmYWNlR3VhcmRfXyc7XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5HRVRfSU5URVJGQUNFX0dVQVJEKEdFVF9JTlRFUkZBQ0VfR1VBUkQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiR0VUX0lOVEVSRkFDRV9HVUFSRCI6WyJHRVRfSU5URVJGQUNFX0dVQVJEIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAVESyZ5AQAAeQEAAB0AAABAZW5kby9leG8tdjEuNS44L3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjNj19pbXBvcnRzKFtdKTsgICBcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAFREsmeQEAAHkBAAAgAAAAQGVuZG8vZmFyLXYxLjEuMTAvc3JjL2V4cG9ydHMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRozY9faW1wb3J0cyhbXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAUnJCqbkCAAC5AgAAHgAAAEBlbmRvL2Zhci12MS4xLjEwL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vcGFzcy1zdHlsZSIsIi4vZXhwb3J0cy5qcyJdLCJleHBvcnRzIjpbImdldEludGVyZmFjZU9mIiwiZ2V0SW50ZXJmYWNlT2YiLG51bGxdLCJyZWV4cG9ydHMiOlsiLi9leHBvcnRzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW11dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW11dLFtcIi4vZXhwb3J0cy5qc1wiLCBbXV1dKTsgICBcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7IkBlbmRvL2V2ZW50dWFsLXNlbmQiOltbIkUiLCJFIl1dLCJAZW5kby9wYXNzLXN0eWxlIjpbWyJGYXIiLCJGYXIiXSxbImdldEludGVyZmFjZU9mIiwiZ2V0SW50ZXJmYWNlT2YiXSxbInBhc3NTdHlsZU9mIiwicGFzc1N0eWxlT2YiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFl/ZBajBwAAowcAAB0AAABAZW5kby9tYXJzaGFsLXYxLjYuMy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiLCIuL3NyYy9tYXJzaGFsLmpzIiwiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiLCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qcyIsIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzIiwiLi9zcmMvcmFua09yZGVyLmpzIiwiLi9zcmMvdHlwZXMuanMiLCJAZW5kby9wYXNzLXN0eWxlIl0sImV4cG9ydHMiOlsiYXNzZXJ0UmFua1NvcnRlZCIsImFzc2VydFJhbmtTb3J0ZWQiLCJtYWtlRW5jb2RlUGFzc2FibGUiLCJtYWtlRW5jb2RlUGFzc2FibGUiLCJwYXJzZSIsInBhcnNlIixudWxsLG51bGwsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIiwiQGVuZG8vcGFzcy1zdHlsZSJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjNj19pbXBvcnRzKFtbXCIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanNcIiwgW11dLFtcIi4vc3JjL21hcnNoYWwuanNcIiwgW11dLFtcIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzXCIsIFtdXSxbXCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qc1wiLCBbXV0sW1wiLi9zcmMvZW5jb2RlUGFzc2FibGUuanNcIiwgW11dLFtcIi4vc3JjL3JhbmtPcmRlci5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW11dXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiOltbIlFDTEFTUyIsIlFDTEFTUyJdXSwiLi9zcmMvbWFyc2hhbC5qcyI6W1sibWFrZU1hcnNoYWwiLCJtYWtlTWFyc2hhbCJdXSwiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiOltbInN0cmluZ2lmeSIsInN0cmluZ2lmeSJdLFsicGFyc2UiLCJwYXJzZSJdXSwiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiOltbImRlY29kZVRvSnVzdGluIiwiZGVjb2RlVG9KdXN0aW4iXV0sIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzIjpbWyJtYWtlUGFzc2FibGVLaXQiLCJtYWtlUGFzc2FibGVLaXQiXSxbIm1ha2VFbmNvZGVQYXNzYWJsZSIsIm1ha2VFbmNvZGVQYXNzYWJsZSJdLFsibWFrZURlY29kZVBhc3NhYmxlIiwibWFrZURlY29kZVBhc3NhYmxlIl0sWyJpc0VuY29kZWRSZW1vdGFibGUiLCJpc0VuY29kZWRSZW1vdGFibGUiXSxbInplcm9QYWQiLCJ6ZXJvUGFkIl0sWyJyZWNvcmROYW1lcyIsInJlY29yZE5hbWVzIl0sWyJyZWNvcmRWYWx1ZXMiLCJyZWNvcmRWYWx1ZXMiXV0sIi4vc3JjL3JhbmtPcmRlci5qcyI6W1sidHJpdmlhbENvbXBhcmF0b3IiLCJ0cml2aWFsQ29tcGFyYXRvciJdLFsiYXNzZXJ0UmFua1NvcnRlZCIsImFzc2VydFJhbmtTb3J0ZWQiXSxbImNvbXBhcmVSYW5rIiwiY29tcGFyZVJhbmsiXSxbImlzUmFua1NvcnRlZCIsImlzUmFua1NvcnRlZCJdLFsic29ydEJ5UmFuayIsInNvcnRCeVJhbmsiXSxbImNvbXBhcmVBbnRpUmFuayIsImNvbXBhcmVBbnRpUmFuayJdLFsibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiLCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCJdLFsiZ2V0UGFzc1N0eWxlQ292ZXIiLCJnZXRQYXNzU3R5bGVDb3ZlciJdLFsiaW50ZXJzZWN0UmFua0NvdmVycyIsImludGVyc2VjdFJhbmtDb3ZlcnMiXSxbInVuaW9uUmFua0NvdmVycyIsInVuaW9uUmFua0NvdmVycyJdXSwiQGVuZG8vcGFzcy1zdHlsZSI6W1siZGVlcGx5RnVsZmlsbGVkIiwiZGVlcGx5RnVsZmlsbGVkIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACqXQ2piEMAAIhDAAAqAAAAQGVuZG8vbWFyc2hhbC12MS42LjMvc3JjL2VuY29kZVBhc3NhYmxlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJpc0VuY29kZWRSZW1vdGFibGUiLCJtYWtlRGVjb2RlUGFzc2FibGUiLCJtYWtlRW5jb2RlUGFzc2FibGUiLCJtYWtlUGFzc2FibGVLaXQiLCJwYXNzU3R5bGVQcmVmaXhlcyIsInJlY29yZE5hbWVzIiwicmVjb3JkVmFsdWVzIiwiemVyb1BhZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IGdldFRhZyxtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLGFzc2VydFJlY29yZCxpc0Vycm9yTGlrZSxuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc2FibGVTeW1ib2xGb3JOYW1lLGIscSxGYWlsOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiZ2V0VGFnXCIsIFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UmVjb3JkXCIsIFskaM2PX2EgPT4gKGFzc2VydFJlY29yZCA9ICRozY9fYSldXSxbXCJpc0Vycm9yTGlrZVwiLCBbJGjNj19hID0+IChpc0Vycm9yTGlrZSA9ICRozY9fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIiwgWyRozY9fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjNj19hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLCBbJGjNj19hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcImJcIiwgWyRozY9fYSA9PiAoYiA9ICRozY9fYSldXSxbXCJxXCIsIFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLCBbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtmcm9tRW50cmllcyxpc309T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLy9cbmNvbnN0IHJDMD0vW1xceDAwLVxceDFGXS87XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgZ2V0U3VmZml4PShzdHIsaW5kZXgpPT5pbmRleD09PTA/c3RyOnN0ci5zdWJzdHJpbmcoaW5kZXgpO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICByZWNvcmROYW1lcz0ocmVjb3JkKT0+XG4vL1xuLy9cbi8vXG4vL1xuLy9cbmhhcmRlbigvKiAgICAgICAgICAgICAgICAgICAqL293bktleXMocmVjb3JkKS5zb3J0KCkucmV2ZXJzZSgpKTskaM2PX29uY2UucmVjb3JkTmFtZXMocmVjb3JkTmFtZXMpO1xuaGFyZGVuKHJlY29yZE5hbWVzKTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgcmVjb3JkVmFsdWVzPShyZWNvcmQsbmFtZXMpPT5cbmhhcmRlbihuYW1lcy5tYXAoKG5hbWUpPT5yZWNvcmRbbmFtZV0pKTskaM2PX29uY2UucmVjb3JkVmFsdWVzKHJlY29yZFZhbHVlcyk7XG5oYXJkZW4ocmVjb3JkVmFsdWVzKTtcblxuY29uc3QgemVyb2VzPUFycmF5KDE2KS5cbmZpbGwodW5kZWZpbmVkKS5cbm1hcCgoXyxpKT0+JzAnLnJlcGVhdChpKSk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICB6ZXJvUGFkPShuLHNpemUpPT57XG5jb25zdCBuU3RyPSBgJHtufWA7XG5jb25zdCBmaWxsTGVuPXNpemUtblN0ci5sZW5ndGg7XG5pZihmaWxsTGVuPT09MClyZXR1cm4gblN0cjtcbmFzc2VydChmaWxsTGVuPjAmJmZpbGxMZW48emVyb2VzLmxlbmd0aCk7XG5yZXR1cm4gYCR7emVyb2VzW2ZpbGxMZW5dfSR7blN0cn1gO1xuIH07JGjNj19vbmNlLnplcm9QYWQoemVyb1BhZCk7XG5oYXJkZW4oemVyb1BhZCk7XG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuY29uc3QgYXNOdW1iZXI9bmV3IEZsb2F0NjRBcnJheSgxKTtcbmNvbnN0IGFzQml0cz1uZXcgQmlnVWludDY0QXJyYXkoYXNOdW1iZXIuYnVmZmVyKTtcblxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vL1xuY29uc3QgQ2Fub25pY2FsTmFOQml0cz0nZmZmODAwMDAwMDAwMDAwMCc7XG5cbi8qXG5cblxuICovXG5jb25zdCBlbmNvZGVCaW5hcnk2ND0obik9Pntcbi8vXG5pZihpcyhuLC0wKSl7XG5uPTA7XG4gfWVsc2UgaWYoaXMobixOYU4pKXtcbnJldHVybiBgZiR7Q2Fub25pY2FsTmFOQml0c31gO1xuIH1cbmFzTnVtYmVyWzBdPW47XG5sZXQgYml0cz1hc0JpdHNbMF07XG5pZihuPDApe1xuYml0c149MHhmZmZmZmZmZmZmZmZmZmZmbjtcbiB9ZWxzZXtcbmJpdHNePTB4ODAwMDAwMDAwMDAwMDAwMG47XG4gfVxucmV0dXJuIGBmJHt6ZXJvUGFkKGJpdHMudG9TdHJpbmcoMTYpLDE2KX1gO1xuIH07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGRlY29kZUJpbmFyeTY0PShlbmNvZGVkLHNraXA9MCk9PntcbmVuY29kZWQuY2hhckF0KHNraXApPT09J2YnfHxGYWlsIGBFbmNvZGVkIG51bWJlciBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5sZXQgYml0cz1CaWdJbnQoIGAweCR7Z2V0U3VmZml4KGVuY29kZWQsc2tpcCsxKX1gKTtcbmlmKGVuY29kZWQuY2hhckF0KHNraXArMSk8JzgnKXtcbmJpdHNePTB4ZmZmZmZmZmZmZmZmZmZmZm47XG4gfWVsc2V7XG5iaXRzXj0weDgwMDAwMDAwMDAwMDAwMDBuO1xuIH1cbmFzQml0c1swXT1iaXRzO1xuY29uc3QgcmVzdWx0PWFzTnVtYmVyWzBdO1xuIWlzKHJlc3VsdCwtMCl8fFxuRmFpbCBgVW5leHBlY3RlZCBuZWdhdGl2ZSB6ZXJvOiAke2dldFN1ZmZpeChlbmNvZGVkLHNraXApfWA7XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGVuY29kZUJpZ0ludD0obik9PntcbmNvbnN0IGFicz1uPDBuPy1uOm47XG5jb25zdCBuRGlnaXRzPWFicy50b1N0cmluZygpLmxlbmd0aDtcbmNvbnN0IGxEaWdpdHM9bkRpZ2l0cy50b1N0cmluZygpLmxlbmd0aDtcbmlmKG48MG4pe1xucmV0dXJuIGBuJHtcbi8vXG4vL1xuJyMnLnJlcGVhdChsRGlnaXRzLTEpXG4gfSR7XG4vL1xuKDEwKipsRGlnaXRzLW5EaWdpdHMpLnRvU3RyaW5nKCkucGFkU3RhcnQobERpZ2l0cywnMCcpXG4gfToke1xuLy9cbigxMG4qKkJpZ0ludChuRGlnaXRzKStuKS50b1N0cmluZygpLnBhZFN0YXJ0KG5EaWdpdHMsJzAnKVxuIH1gO1xuIH1lbHNle1xucmV0dXJuIGBwJHtcbi8vXG4vL1xuJ34nLnJlcGVhdChsRGlnaXRzLTEpXG4gfSR7XG4vL1xubkRpZ2l0c1xuIH06JHtcbi8vXG5uXG4gfWA7XG4gfVxuIH07XG5cbmNvbnN0IHJCaWdJbnRQYXlsb2FkPS8oWzAtOV0rKSg6KFswLTldKyR8KXwpL3M7XG5cbi8qXG5cblxuICovXG5jb25zdCBkZWNvZGVCaWdJbnQ9KGVuY29kZWQpPT57XG5jb25zdCB0eXBlUHJlZml4PWVuY29kZWQuY2hhckF0KDApOy8vXG50eXBlUHJlZml4PT09J3AnfHxcbnR5cGVQcmVmaXg9PT0nbid8fFxuRmFpbCBgRW5jb2RlZCBiaWdpbnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuXG5jb25zdHtcbmluZGV4OmxEaWdpdHMsXG4xOnNuRGlnaXRzLFxuMjp0YWlsLFxuMzpkaWdpdHN9PVxuZW5jb2RlZC5tYXRjaChyQmlnSW50UGF5bG9hZCl8fEZhaWwgYERpZ2l0IGNvdW50IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcblxuc25EaWdpdHMubGVuZ3RoPT09bERpZ2l0c3x8XG5GYWlsIGBVbmFyeS1wcmVmaXhlZCBkZWNpbWFsIGRpZ2l0IGNvdW50IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbmxldCBuRGlnaXRzPXBhcnNlSW50KHNuRGlnaXRzLDEwKTtcbmlmKHR5cGVQcmVmaXg9PT0nbicpe1xuLy9cbi8vXG5uRGlnaXRzPTEwKiovKiAgICAgICAgICAgICAgICAgKi9sRGlnaXRzLW5EaWdpdHM7XG4gfVxuXG50YWlsLmNoYXJBdCgwKT09PSc6J3x8RmFpbCBgU2VwYXJhdG9yIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbmRpZ2l0cy5sZW5ndGg9PT1uRGlnaXRzfHxcbkZhaWwgYEZpeGVkLWxlbmd0aCBkaWdpdCBzZXF1ZW5jZSBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5sZXQgbj1CaWdJbnQoZGlnaXRzKTtcbmlmKHR5cGVQcmVmaXg9PT0nbicpe1xuLy9cbi8vXG5uPS0oMTBuKipCaWdJbnQobkRpZ2l0cyktbik7XG4gfVxuXG5yZXR1cm4gbjtcbiB9O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHN0cmluZ0VzY2FwZXM9QXJyYXkoMHgyMikuXG5maWxsKHVuZGVmaW5lZCkuXG5tYXAoKF8sY3ApPT57XG5zd2l0Y2goU3RyaW5nLmZyb21DaGFyQ29kZShjcCkpe1xuY2FzZScgJzpcbnJldHVybichXyc7XG5jYXNlJyEnOlxucmV0dXJuJyF8JztcbmRlZmF1bHQ6XG5yZXR1cm4gYCEke1N0cmluZy5mcm9tQ2hhckNvZGUoY3ArMHgyMSl9YDt9XG5cbiB9KTtcbnN0cmluZ0VzY2FwZXNbJ14nLmNoYXJDb2RlQXQoMCldPSdfQCc7XG5zdHJpbmdFc2NhcGVzWydfJy5jaGFyQ29kZUF0KDApXT0nX18nO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBlbmNvZGVDb21wYWN0U3RyaW5nU3VmZml4PShzdHIpPT5cbnN0ci5yZXBsYWNlKC9bXFwwLSFeX10vZywoY2gpPT5zdHJpbmdFc2NhcGVzW2NoLmNoYXJDb2RlQXQoMCldKTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgZGVjb2RlQ29tcGFjdFN0cmluZ1N1ZmZpeD0oZW5jb2RlZCk9PntcbnJldHVybiBlbmNvZGVkLnJlcGxhY2UoLyhbXFwwLSFfXSkoLnxcXG4pPy9nLChlc2MscHJlZml4LHN1ZmZpeCk9PntcbnN3aXRjaChlc2Mpe1xuY2FzZSchXyc6XG5yZXR1cm4nICc7XG5jYXNlJyF8JzpcbnJldHVybichJztcbmNhc2UnX0AnOlxucmV0dXJuJ14nO1xuY2FzZSdfXyc6XG5yZXR1cm4nXyc7XG5kZWZhdWx0OntcbmNvbnN0IGNoPS8qICAgICAgICAgICAgICAgICAqL3N1ZmZpeDtcbi8vXG4vL1xucHJlZml4PT09JyEnJiZzdWZmaXghPT11bmRlZmluZWQmJmNoPj0nIScmJmNoPD0nQCd8fFxuRmFpbCBgaW52YWxpZCBzdHJpbmcgZXNjYXBlOiAke3EoZXNjKX1gO1xucmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoY2guY2hhckNvZGVBdCgwKS0weDIxKTtcbiB9fVxuXG4gfSk7XG4gfTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgZW5jb2RlTGVnYWN5U3RyaW5nU3VmZml4PShzdHIpPT5zdHI7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGRlY29kZUxlZ2FjeVN0cmluZ1N1ZmZpeD0oZW5jb2RlZCk9PmVuY29kZWQ7XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgZW5jb2RlQ29tcGFjdEFycmF5PShhcnJheSxlbmNvZGVQYXNzYWJsZSk9PntcbmNvbnN0IGNoYXJzPVsnXiddO1xuZm9yKGNvbnN0IGVsZW1lbnQgb2YgYXJyYXkpe1xuY29uc3QgZW5jPWVuY29kZVBhc3NhYmxlKGVsZW1lbnQpO1xuY2hhcnMucHVzaChlbmMsJyAnKTtcbiB9XG5yZXR1cm4gY2hhcnMuam9pbignJyk7XG4gfTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBkZWNvZGVDb21wYWN0QXJyYXk9KGVuY29kZWQsZGVjb2RlUGFzc2FibGUsc2tpcD0wKT0+e1xuY29uc3QgZWxlbWVudHM9W107XG5sZXQgZGVwdGg9MDtcbi8vXG4vL1xubGV0IG5leHRJbmRleD1za2lwKzE7XG5sZXQgY3VycmVudEVsZW1lbnRTdGFydD1za2lwKzE7XG5mb3IoY29uc3R7MDpjaCxpbmRleDppfW9mIGVuY29kZWQubWF0Y2hBbGwoL1tcXF4gXS9nKSl7XG5jb25zdCBpbmRleD0vKiAgICAgICAgICAgICAgICAgKi9pO1xuaWYoaW5kZXg8PXNraXApe1xuaWYoaW5kZXg9PT1za2lwKXtcbmNoPT09J14nfHxGYWlsIGBFbmNvZGVkIGFycmF5IGV4cGVjdGVkOiAke2dldFN1ZmZpeChlbmNvZGVkLHNraXApfWA7XG4gfVxuIH1lbHNlIGlmKGNoPT09J14nKXtcbi8vXG4vL1xuLy9cbi8vXG4vL1xuZGVwdGgrPTE7XG4gfWVsc2V7XG4vL1xuaWYoaW5kZXg9PT1uZXh0SW5kZXgpe1xuLy9cbmRlcHRoLT0xO1xuZGVwdGg+PTB8fFxuLy9cbkZhaWwgYHVuZXhwZWN0ZWQgYXJyYXkgZWxlbWVudCB0ZXJtaW5hdG9yOiAke2VuY29kZWQuc2xpY2Uoc2tpcCxpbmRleCsyKX1gO1xuIH1cbmlmKGRlcHRoPT09MCl7XG4vL1xuZWxlbWVudHMucHVzaChcbmRlY29kZVBhc3NhYmxlKGVuY29kZWQuc2xpY2UoY3VycmVudEVsZW1lbnRTdGFydCxpbmRleCkpKTtcblxuY3VycmVudEVsZW1lbnRTdGFydD1pbmRleCsxO1xuIH1cbiB9XG4vL1xubmV4dEluZGV4PWluZGV4KzE7XG4gfVxuZGVwdGg9PT0wfHxGYWlsIGB1bnRlcm1pbmF0ZWQgYXJyYXk6ICR7Z2V0U3VmZml4KGVuY29kZWQsc2tpcCl9YDtcbm5leHRJbmRleD09PWVuY29kZWQubGVuZ3RofHxcbkZhaWwgYHVudGVybWluYXRlZCBhcnJheSBlbGVtZW50OiAke2dldFN1ZmZpeChcbmVuY29kZWQsXG5jdXJyZW50RWxlbWVudFN0YXJ0KVxuIH1gO1xucmV0dXJuIGhhcmRlbihlbGVtZW50cyk7XG4gfTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgZW5jb2RlTGVnYWN5QXJyYXk9KGFycmF5LGVuY29kZVBhc3NhYmxlKT0+e1xuY29uc3QgY2hhcnM9WydbJ107XG5mb3IoY29uc3QgZWxlbWVudCBvZiBhcnJheSl7XG5jb25zdCBlbmM9ZW5jb2RlUGFzc2FibGUoZWxlbWVudCk7XG5mb3IoY29uc3QgYyBvZiBlbmMpe1xuaWYoYz09PSdcXHUwMDAwJ3x8Yz09PSdcXHUwMDAxJyl7XG5jaGFycy5wdXNoKCdcXHUwMDAxJyk7XG4gfVxuY2hhcnMucHVzaChjKTtcbiB9XG5jaGFycy5wdXNoKCdcXHUwMDAwJyk7XG4gfVxucmV0dXJuIGNoYXJzLmpvaW4oJycpO1xuIH07XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgZGVjb2RlTGVnYWN5QXJyYXk9KGVuY29kZWQsZGVjb2RlUGFzc2FibGUsc2tpcD0wKT0+e1xuY29uc3QgZWxlbWVudHM9W107XG5jb25zdCBlbGVtQ2hhcnM9W107XG4vL1xuLy9cbmxldCBzdGlsbFRvU2tpcD1za2lwKzE7XG5sZXQgaW5Fc2NhcGU9ZmFsc2U7XG5mb3IoY29uc3QgYyBvZiBlbmNvZGVkKXtcbmlmKHN0aWxsVG9Ta2lwPjApe1xuc3RpbGxUb1NraXAtPTE7XG5pZihzdGlsbFRvU2tpcD09PTApe1xuYz09PSdbJ3x8RmFpbCBgRW5jb2RlZCBhcnJheSBleHBlY3RlZDogJHtnZXRTdWZmaXgoZW5jb2RlZCxza2lwKX1gO1xuIH1cbiB9ZWxzZSBpZihpbkVzY2FwZSl7XG5jPT09J1xcdTAwMDAnfHxcbmM9PT0nXFx1MDAwMSd8fFxuRmFpbCBgVW5leHBlY3RlZCBjaGFyYWN0ZXIgYWZ0ZXIgdTAwMDEgZXNjYXBlOiAke2N9YDtcbmVsZW1DaGFycy5wdXNoKGMpO1xuIH1lbHNlIGlmKGM9PT0nXFx1MDAwMCcpe1xuY29uc3QgZW5jb2RlZEVsZW1lbnQ9ZWxlbUNoYXJzLmpvaW4oJycpO1xuZWxlbUNoYXJzLmxlbmd0aD0wO1xuY29uc3QgZWxlbWVudD1kZWNvZGVQYXNzYWJsZShlbmNvZGVkRWxlbWVudCk7XG5lbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuIH1lbHNlIGlmKGM9PT0nXFx1MDAwMScpe1xuaW5Fc2NhcGU9dHJ1ZTtcbi8vXG5jb250aW51ZTtcbiB9ZWxzZXtcbmVsZW1DaGFycy5wdXNoKGMpO1xuIH1cbmluRXNjYXBlPWZhbHNlO1xuIH1cbiFpbkVzY2FwZXx8RmFpbCBgdW5leHBlY3RlZCBlbmQgb2YgZW5jb2RpbmcgJHtnZXRTdWZmaXgoZW5jb2RlZCxza2lwKX1gO1xuZWxlbUNoYXJzLmxlbmd0aD09PTB8fFxuRmFpbCBgZW5jb2RpbmcgdGVybWluYXRlZCBlYXJseTogJHtnZXRTdWZmaXgoZW5jb2RlZCxza2lwKX1gO1xucmV0dXJuIGhhcmRlbihlbGVtZW50cyk7XG4gfTtcblxuY29uc3QgZW5jb2RlUmVjb3JkPShyZWNvcmQsZW5jb2RlQXJyYXksZW5jb2RlUGFzc2FibGUpPT57XG5jb25zdCBuYW1lcz1yZWNvcmROYW1lcyhyZWNvcmQpO1xuY29uc3QgdmFsdWVzPXJlY29yZFZhbHVlcyhyZWNvcmQsbmFtZXMpO1xucmV0dXJuIGAoJHtlbmNvZGVBcnJheShoYXJkZW4oW25hbWVzLHZhbHVlc10pLGVuY29kZVBhc3NhYmxlKX1gO1xuIH07XG5cbmNvbnN0IGRlY29kZVJlY29yZD0oZW5jb2RlZCxkZWNvZGVBcnJheSxkZWNvZGVQYXNzYWJsZSxza2lwPTApPT57XG5hc3NlcnQoZW5jb2RlZC5jaGFyQXQoc2tpcCk9PT0nKCcpO1xuLy9cbi8vXG5jb25zdCB1bnppcHBlZEVudHJpZXM9ZGVjb2RlQXJyYXkoZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSxza2lwKzEpO1xudW56aXBwZWRFbnRyaWVzLmxlbmd0aD09PTJ8fFxuRmFpbCBgZXhwZWN0ZWQga2V5cyx2YWx1ZXMgcGFpcjogJHtnZXRTdWZmaXgoZW5jb2RlZCxza2lwKX1gO1xuY29uc3Rba2V5cyx2YWxzXT11bnppcHBlZEVudHJpZXM7XG5cbnBhc3NTdHlsZU9mKGtleXMpPT09J2NvcHlBcnJheScmJlxucGFzc1N0eWxlT2YodmFscyk9PT0nY29weUFycmF5JyYmXG5rZXlzLmxlbmd0aD09PXZhbHMubGVuZ3RoJiZcbmtleXMuZXZlcnkoKGtleSk9PnR5cGVvZiBrZXk9PT0nc3RyaW5nJyl8fFxuRmFpbCBgbm90IGEgdmFsaWQgcmVjb3JkIGVuY29kaW5nOiAke2dldFN1ZmZpeChlbmNvZGVkLHNraXApfWA7XG5jb25zdCBtYXBFbnRyaWVzPWtleXMubWFwKChrZXksaSk9PltrZXksdmFsc1tpXV0pO1xuY29uc3QgcmVjb3JkPWhhcmRlbihmcm9tRW50cmllcyhtYXBFbnRyaWVzKSk7XG5hc3NlcnRSZWNvcmQocmVjb3JkLCdkZWNvZGVkIHJlY29yZCcpO1xucmV0dXJuIHJlY29yZDtcbiB9O1xuXG5jb25zdCBlbmNvZGVUYWdnZWQ9KHRhZ2dlZCxlbmNvZGVBcnJheSxlbmNvZGVQYXNzYWJsZSk9PlxuIGA6JHtlbmNvZGVBcnJheShoYXJkZW4oW2dldFRhZyh0YWdnZWQpLHRhZ2dlZC5wYXlsb2FkXSksZW5jb2RlUGFzc2FibGUpfWA7XG5cbmNvbnN0IGRlY29kZVRhZ2dlZD0oZW5jb2RlZCxkZWNvZGVBcnJheSxkZWNvZGVQYXNzYWJsZSxza2lwPTApPT57XG5hc3NlcnQoZW5jb2RlZC5jaGFyQXQoc2tpcCk9PT0nOicpO1xuLy9cbi8vXG5jb25zdCB0YWdnZWRQYXlsb2FkPWRlY29kZUFycmF5KGVuY29kZWQsZGVjb2RlUGFzc2FibGUsc2tpcCsxKTtcbnRhZ2dlZFBheWxvYWQubGVuZ3RoPT09Mnx8XG5GYWlsIGBleHBlY3RlZCB0YWcscGF5bG9hZCBwYWlyOiAke2dldFN1ZmZpeChlbmNvZGVkLHNraXApfWA7XG5jb25zdFt0YWcscGF5bG9hZF09dGFnZ2VkUGF5bG9hZDtcbnBhc3NTdHlsZU9mKHRhZyk9PT0nc3RyaW5nJ3x8XG5GYWlsIGBub3QgYSB2YWxpZCB0YWdnZWQgZW5jb2Rpbmc6ICR7Z2V0U3VmZml4KGVuY29kZWQsc2tpcCl9YDtcbnJldHVybiBtYWtlVGFnZ2VkKHRhZyxwYXlsb2FkKTtcbiB9O1xuXG5jb25zdCBtYWtlRW5jb2RlUmVtb3RhYmxlPSh1bnNhZmVFbmNvZGVSZW1vdGFibGUsdmVyaWZ5RW5jb2RpbmcpPT57XG5jb25zdCBlbmNvZGVSZW1vdGFibGU9KHIsaW5uZXJFbmNvZGUpPT57XG5jb25zdCBlbmNvZGluZz11bnNhZmVFbmNvZGVSZW1vdGFibGUocixpbm5lckVuY29kZSk7XG50eXBlb2YgZW5jb2Rpbmc9PT0nc3RyaW5nJyYmZW5jb2RpbmcuY2hhckF0KDApPT09J3InfHxcbkZhaWwgYFJlbW90YWJsZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCJyXCI6ICR7ZW5jb2Rpbmd9YDtcbnZlcmlmeUVuY29kaW5nKGVuY29kaW5nLCdSZW1vdGFibGUnKTtcbnJldHVybiBlbmNvZGluZztcbiB9O1xucmV0dXJuIGVuY29kZVJlbW90YWJsZTtcbiB9O1xuXG5jb25zdCBtYWtlRW5jb2RlUHJvbWlzZT0odW5zYWZlRW5jb2RlUHJvbWlzZSx2ZXJpZnlFbmNvZGluZyk9PntcbmNvbnN0IGVuY29kZVByb21pc2U9KHAsaW5uZXJFbmNvZGUpPT57XG5jb25zdCBlbmNvZGluZz11bnNhZmVFbmNvZGVQcm9taXNlKHAsaW5uZXJFbmNvZGUpO1xudHlwZW9mIGVuY29kaW5nPT09J3N0cmluZycmJmVuY29kaW5nLmNoYXJBdCgwKT09PSc/J3x8XG5GYWlsIGBQcm9taXNlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIj9cIjogJHtlbmNvZGluZ31gO1xudmVyaWZ5RW5jb2RpbmcoZW5jb2RpbmcsJ1Byb21pc2UnKTtcbnJldHVybiBlbmNvZGluZztcbiB9O1xucmV0dXJuIGVuY29kZVByb21pc2U7XG4gfTtcblxuY29uc3QgbWFrZUVuY29kZUVycm9yPSh1bnNhZmVFbmNvZGVFcnJvcix2ZXJpZnlFbmNvZGluZyk9PntcbmNvbnN0IGVuY29kZUVycm9yPShlcnIsaW5uZXJFbmNvZGUpPT57XG5jb25zdCBlbmNvZGluZz11bnNhZmVFbmNvZGVFcnJvcihlcnIsaW5uZXJFbmNvZGUpO1xudHlwZW9mIGVuY29kaW5nPT09J3N0cmluZycmJmVuY29kaW5nLmNoYXJBdCgwKT09PSchJ3x8XG5GYWlsIGBFcnJvciBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCIhXCI6ICR7ZW5jb2Rpbmd9YDtcbnZlcmlmeUVuY29kaW5nKGVuY29kaW5nLCdFcnJvcicpO1xucmV0dXJuIGVuY29kaW5nO1xuIH07XG5yZXR1cm4gZW5jb2RlRXJyb3I7XG4gfTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuICovXG5jb25zdCBtYWtlSW5uZXJFbmNvZGU9KGVuY29kZVN0cmluZ1N1ZmZpeCxlbmNvZGVBcnJheSxvcHRpb25zKT0+e1xuY29uc3R7XG5lbmNvZGVSZW1vdGFibGU6dW5zYWZlRW5jb2RlUmVtb3RhYmxlLFxuZW5jb2RlUHJvbWlzZTp1bnNhZmVFbmNvZGVQcm9taXNlLFxuZW5jb2RlRXJyb3I6dW5zYWZlRW5jb2RlRXJyb3IsXG52ZXJpZnlFbmNvZGluZz0oKT0+eyB9fT1cbm9wdGlvbnM7XG5jb25zdCBlbmNvZGVSZW1vdGFibGU9bWFrZUVuY29kZVJlbW90YWJsZShcbnVuc2FmZUVuY29kZVJlbW90YWJsZSxcbnZlcmlmeUVuY29kaW5nKTtcblxuY29uc3QgZW5jb2RlUHJvbWlzZT1tYWtlRW5jb2RlUHJvbWlzZSh1bnNhZmVFbmNvZGVQcm9taXNlLHZlcmlmeUVuY29kaW5nKTtcbmNvbnN0IGVuY29kZUVycm9yPW1ha2VFbmNvZGVFcnJvcih1bnNhZmVFbmNvZGVFcnJvcix2ZXJpZnlFbmNvZGluZyk7XG5cbmNvbnN0IGlubmVyRW5jb2RlPShwYXNzYWJsZSk9PntcbmlmKGlzRXJyb3JMaWtlKHBhc3NhYmxlKSl7XG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xucmV0dXJuIGVuY29kZUVycm9yKHBhc3NhYmxlLGlubmVyRW5jb2RlKTtcbiB9XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocGFzc2FibGUpO1xuc3dpdGNoKHBhc3NTdHlsZSl7XG5jYXNlJ251bGwnOntcbnJldHVybid2JztcbiB9XG5jYXNlJ3VuZGVmaW5lZCc6e1xucmV0dXJuJ3onO1xuIH1cbmNhc2UnbnVtYmVyJzp7XG5yZXR1cm4gZW5jb2RlQmluYXJ5NjQocGFzc2FibGUpO1xuIH1cbmNhc2Unc3RyaW5nJzp7XG5yZXR1cm4gYHMke2VuY29kZVN0cmluZ1N1ZmZpeChwYXNzYWJsZSl9YDtcbiB9XG5jYXNlJ2Jvb2xlYW4nOntcbnJldHVybiBgYiR7cGFzc2FibGV9YDtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xucmV0dXJuIGVuY29kZUJpZ0ludChwYXNzYWJsZSk7XG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbnJldHVybiBlbmNvZGVSZW1vdGFibGUocGFzc2FibGUsaW5uZXJFbmNvZGUpO1xuIH1cbmNhc2UnZXJyb3InOntcbnJldHVybiBlbmNvZGVFcnJvcihwYXNzYWJsZSxpbm5lckVuY29kZSk7XG4gfVxuY2FzZSdwcm9taXNlJzp7XG5yZXR1cm4gZW5jb2RlUHJvbWlzZShwYXNzYWJsZSxpbm5lckVuY29kZSk7XG4gfVxuY2FzZSdzeW1ib2wnOntcbi8vXG5jb25zdCBuYW1lPW5hbWVGb3JQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG5hc3NlcnQudHlwZW9mKG5hbWUsJ3N0cmluZycpO1xucmV0dXJuIGB5JHtlbmNvZGVTdHJpbmdTdWZmaXgobmFtZSl9YDtcbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xucmV0dXJuIGVuY29kZUFycmF5KHBhc3NhYmxlLGlubmVyRW5jb2RlKTtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbnJldHVybiBlbmNvZGVSZWNvcmQocGFzc2FibGUsZW5jb2RlQXJyYXksaW5uZXJFbmNvZGUpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5yZXR1cm4gZW5jb2RlVGFnZ2VkKHBhc3NhYmxlLGVuY29kZUFycmF5LGlubmVyRW5jb2RlKTtcbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYGEgJHtxKHBhc3NTdHlsZSl9IGNhbm5vdCBiZSB1c2VkIGFzIGEgY29sbGVjdGlvbiBwYXNzYWJsZWA7XG4gfX1cblxuIH07XG5yZXR1cm4gaW5uZXJFbmNvZGU7XG4gfTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbmNvbnN0IGxpYmVyYWxEZWNvZGVycz0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAqL3tcbmRlY29kZVJlbW90YWJsZTooX2VuY29kaW5nLF9pbm5lckRlY29kZSk9PnVuZGVmaW5lZCxcbmRlY29kZVByb21pc2U6KF9lbmNvZGluZyxfaW5uZXJEZWNvZGUpPT51bmRlZmluZWQsXG5kZWNvZGVFcnJvcjooX2VuY29kaW5nLF9pbm5lckRlY29kZSk9PnVuZGVmaW5lZH07XG5cblxuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VJbm5lckRlY29kZT0oZGVjb2RlU3RyaW5nU3VmZml4LGRlY29kZUFycmF5LG9wdGlvbnMpPT57XG5jb25zdHtkZWNvZGVSZW1vdGFibGUsZGVjb2RlUHJvbWlzZSxkZWNvZGVFcnJvcn09b3B0aW9ucztcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBpbm5lckRlY29kZT0oZW5jb2RlZCxza2lwPTApPT57XG5zd2l0Y2goZW5jb2RlZC5jaGFyQXQoc2tpcCkpe1xuY2FzZSd2Jzp7XG5yZXR1cm4gbnVsbDtcbiB9XG5jYXNlJ3onOntcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuY2FzZSdmJzp7XG5yZXR1cm4gZGVjb2RlQmluYXJ5NjQoZW5jb2RlZCxza2lwKTtcbiB9XG5jYXNlJ3MnOntcbnJldHVybiBkZWNvZGVTdHJpbmdTdWZmaXgoZ2V0U3VmZml4KGVuY29kZWQsc2tpcCsxKSk7XG4gfVxuY2FzZSdiJzp7XG5jb25zdCBzdWJzdHJpbmc9Z2V0U3VmZml4KGVuY29kZWQsc2tpcCsxKTtcbmlmKHN1YnN0cmluZz09PSd0cnVlJyl7XG5yZXR1cm4gdHJ1ZTtcbiB9ZWxzZSBpZihzdWJzdHJpbmc9PT0nZmFsc2UnKXtcbnJldHVybiBmYWxzZTtcbiB9XG50aHJvdyBGYWlsIGBleHBlY3RlZCBlbmNvZGVkIGJvb2xlYW4gdG8gYmUgXCJidHJ1ZVwiIG9yIFwiYmZhbHNlXCI6ICR7c3Vic3RyaW5nfWA7XG4gfVxuY2FzZSduJzpcbmNhc2UncCc6e1xucmV0dXJuIGRlY29kZUJpZ0ludChnZXRTdWZmaXgoZW5jb2RlZCxza2lwKSk7XG4gfVxuY2FzZSdyJzp7XG5yZXR1cm4gZGVjb2RlUmVtb3RhYmxlKGdldFN1ZmZpeChlbmNvZGVkLHNraXApLGlubmVyRGVjb2RlKTtcbiB9XG5jYXNlJz8nOntcbnJldHVybiBkZWNvZGVQcm9taXNlKGdldFN1ZmZpeChlbmNvZGVkLHNraXApLGlubmVyRGVjb2RlKTtcbiB9XG5jYXNlJyEnOntcbnJldHVybiBkZWNvZGVFcnJvcihnZXRTdWZmaXgoZW5jb2RlZCxza2lwKSxpbm5lckRlY29kZSk7XG4gfVxuY2FzZSd5Jzp7XG4vL1xuY29uc3QgbmFtZT1kZWNvZGVTdHJpbmdTdWZmaXgoZ2V0U3VmZml4KGVuY29kZWQsc2tpcCsxKSk7XG5yZXR1cm4gcGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuIH1cbmNhc2UnWyc6XG5jYXNlJ14nOntcbi8vXG5yZXR1cm4gZGVjb2RlQXJyYXkoZW5jb2RlZCxpbm5lckRlY29kZSxza2lwKTtcbiB9XG5jYXNlJygnOntcbnJldHVybiBkZWNvZGVSZWNvcmQoZW5jb2RlZCxkZWNvZGVBcnJheSxpbm5lckRlY29kZSxza2lwKTtcbiB9XG5jYXNlJzonOntcbnJldHVybiBkZWNvZGVUYWdnZWQoZW5jb2RlZCxkZWNvZGVBcnJheSxpbm5lckRlY29kZSxza2lwKTtcbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYGludmFsaWQgZGF0YWJhc2Uga2V5OiAke2dldFN1ZmZpeChlbmNvZGVkLHNraXApfWA7XG4gfX1cblxuIH07XG5yZXR1cm4gaW5uZXJEZWNvZGU7XG4gfTtcblxuLypcblxuXG5cbiAqL1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgICAgICAgIG1ha2VQYXNzYWJsZUtpdD0ob3B0aW9ucz17fSk9PntcbmNvbnN0e1xuZW5jb2RlUmVtb3RhYmxlPShyLF8pPT5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyfWAsXG5lbmNvZGVQcm9taXNlPShwLF8pPT5GYWlsIGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cH1gLFxuZW5jb2RlRXJyb3I9KGVycixfKT0+RmFpbCBgZXJyb3IgdW5leHBlY3RlZDogJHtlcnJ9YCxcbmZvcm1hdD0nbGVnYWN5T3JkZXJlZCcsXG5cbmRlY29kZVJlbW90YWJsZT0oZW5jb2RpbmcsXyk9PkZhaWwgYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWAsXG5kZWNvZGVQcm9taXNlPShlbmNvZGluZyxfKT0+RmFpbCBgcHJvbWlzZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWAsXG5kZWNvZGVFcnJvcj0oZW5jb2RpbmcsXyk9PkZhaWwgYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZW5jb2Rpbmd9YH09XG5vcHRpb25zO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xubGV0IGVuY29kZVBhc3NhYmxlO1xuY29uc3QgZW5jb2RlT3B0aW9ucz17ZW5jb2RlUmVtb3RhYmxlLGVuY29kZVByb21pc2UsZW5jb2RlRXJyb3IsZm9ybWF0fTtcbmlmKGZvcm1hdD09PSdjb21wYWN0T3JkZXJlZCcpe1xuY29uc3QgbGliZXJhbERlY29kZT1tYWtlSW5uZXJEZWNvZGUoXG5kZWNvZGVDb21wYWN0U3RyaW5nU3VmZml4LFxuZGVjb2RlQ29tcGFjdEFycmF5LFxubGliZXJhbERlY29kZXJzKTtcblxuLypcblxuXG5cbiAgICAgKi9cbmNvbnN0IHZlcmlmeUVuY29kaW5nPShlbmNvZGluZyxsYWJlbCk9PntcbiFlbmNvZGluZy5tYXRjaChyQzApfHxcbkZhaWwgYCR7YihcbmxhYmVsKVxuIH0gZW5jb2RpbmcgbXVzdCBub3QgY29udGFpbiBhIEMwIGNvbnRyb2wgY2hhcmFjdGVyOiAke2VuY29kaW5nfWA7XG5jb25zdCBkZWNvZGVkPWRlY29kZUNvbXBhY3RBcnJheSggYF52ICR7ZW5jb2Rpbmd9IHYgYCxsaWJlcmFsRGVjb2RlKTtcbmlzQXJyYXkoZGVjb2RlZCkmJlxuZGVjb2RlZC5sZW5ndGg9PT0zJiZcbmRlY29kZWRbMF09PT1udWxsJiZcbmRlY29kZWRbMl09PT1udWxsfHxcbkZhaWwgYCR7YihsYWJlbCl9IGVuY29kaW5nIG11c3QgYmUgZW1iZWRkYWJsZTogJHtlbmNvZGluZ31gO1xuIH07XG5jb25zdCBlbmNvZGVDb21wYWN0PW1ha2VJbm5lckVuY29kZShcbmVuY29kZUNvbXBhY3RTdHJpbmdTdWZmaXgsXG5lbmNvZGVDb21wYWN0QXJyYXksXG57Li4uZW5jb2RlT3B0aW9ucyx2ZXJpZnlFbmNvZGluZ30pO1xuXG5lbmNvZGVQYXNzYWJsZT0ocGFzc2FibGUpPT4gYH4ke2VuY29kZUNvbXBhY3QocGFzc2FibGUpfWA7XG4gfWVsc2UgaWYoZm9ybWF0PT09J2xlZ2FjeU9yZGVyZWQnKXtcbmVuY29kZVBhc3NhYmxlPW1ha2VJbm5lckVuY29kZShcbmVuY29kZUxlZ2FjeVN0cmluZ1N1ZmZpeCxcbmVuY29kZUxlZ2FjeUFycmF5LFxuZW5jb2RlT3B0aW9ucyk7XG5cbiB9ZWxzZXtcbnRocm93IEZhaWwgYFVucmVjb2duaXplZCBmb3JtYXQ6ICR7cShmb3JtYXQpfWA7XG4gfVxuXG5jb25zdCBkZWNvZGVPcHRpb25zPXtkZWNvZGVSZW1vdGFibGUsZGVjb2RlUHJvbWlzZSxkZWNvZGVFcnJvcn07XG5jb25zdCBkZWNvZGVDb21wYWN0PW1ha2VJbm5lckRlY29kZShcbmRlY29kZUNvbXBhY3RTdHJpbmdTdWZmaXgsXG5kZWNvZGVDb21wYWN0QXJyYXksXG5kZWNvZGVPcHRpb25zKTtcblxuY29uc3QgZGVjb2RlTGVnYWN5PW1ha2VJbm5lckRlY29kZShcbmRlY29kZUxlZ2FjeVN0cmluZ1N1ZmZpeCxcbmRlY29kZUxlZ2FjeUFycmF5LFxuZGVjb2RlT3B0aW9ucyk7XG5cbmNvbnN0IGRlY29kZVBhc3NhYmxlPShlbmNvZGVkKT0+e1xuLy9cbi8vXG4vL1xuaWYoZW5jb2RlZC5jaGFyQXQoMCk9PT0nficpe1xucmV0dXJuIGRlY29kZUNvbXBhY3QoZW5jb2RlZCwxKTtcbiB9XG5yZXR1cm4gZGVjb2RlTGVnYWN5KGVuY29kZWQpO1xuIH07XG5cbnJldHVybiBoYXJkZW4oe2VuY29kZVBhc3NhYmxlLGRlY29kZVBhc3NhYmxlfSk7XG4gfTskaM2PX29uY2UubWFrZVBhc3NhYmxlS2l0KG1ha2VQYXNzYWJsZUtpdCk7XG5oYXJkZW4obWFrZVBhc3NhYmxlS2l0KTtcblxuLypcblxuXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRW5jb2RlUGFzc2FibGU9KGVuY29kZU9wdGlvbnMpPT57XG5jb25zdHtlbmNvZGVQYXNzYWJsZX09bWFrZVBhc3NhYmxlS2l0KGVuY29kZU9wdGlvbnMpO1xucmV0dXJuIGVuY29kZVBhc3NhYmxlO1xuIH07JGjNj19vbmNlLm1ha2VFbmNvZGVQYXNzYWJsZShtYWtlRW5jb2RlUGFzc2FibGUpO1xuaGFyZGVuKG1ha2VFbmNvZGVQYXNzYWJsZSk7XG5cbi8qXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZURlY29kZVBhc3NhYmxlPShkZWNvZGVPcHRpb25zKT0+e1xuY29uc3R7ZGVjb2RlUGFzc2FibGV9PW1ha2VQYXNzYWJsZUtpdChkZWNvZGVPcHRpb25zKTtcbnJldHVybiBkZWNvZGVQYXNzYWJsZTtcbiB9OyRozY9fb25jZS5tYWtlRGVjb2RlUGFzc2FibGUobWFrZURlY29kZVBhc3NhYmxlKTtcbmhhcmRlbihtYWtlRGVjb2RlUGFzc2FibGUpO1xuXG5jb25zdCAgICAgICAgaXNFbmNvZGVkUmVtb3RhYmxlPShlbmNvZGVkKT0+ZW5jb2RlZC5jaGFyQXQoMCk9PT0ncic7JGjNj19vbmNlLmlzRW5jb2RlZFJlbW90YWJsZShpc0VuY29kZWRSZW1vdGFibGUpO1xuaGFyZGVuKGlzRW5jb2RlZFJlbW90YWJsZSk7XG5cbi8vXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBwYXNzU3R5bGVQcmVmaXhlcz17XG5lcnJvcjonIScsXG5jb3B5UmVjb3JkOicoJyxcbnRhZ2dlZDonOicsXG5wcm9taXNlOic/JyxcbmNvcHlBcnJheTonW14nLFxuYm9vbGVhbjonYicsXG5udW1iZXI6J2YnLFxuYmlnaW50OiducCcsXG5yZW1vdGFibGU6J3InLFxuc3RyaW5nOidzJyxcbm51bGw6J3YnLFxuc3ltYm9sOid5Jyxcbi8vXG4vL1xuLy9cbnVuZGVmaW5lZDoneid9OyRozY9fb25jZS5wYXNzU3R5bGVQcmVmaXhlcyhwYXNzU3R5bGVQcmVmaXhlcyk7XG5cbk9iamVjdC5zZXRQcm90b3R5cGVPZihwYXNzU3R5bGVQcmVmaXhlcyxudWxsKTtcbmhhcmRlbihwYXNzU3R5bGVQcmVmaXhlcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJyZWNvcmROYW1lcyI6WyJyZWNvcmROYW1lcyJdLCJyZWNvcmRWYWx1ZXMiOlsicmVjb3JkVmFsdWVzIl0sInplcm9QYWQiOlsiemVyb1BhZCJdLCJtYWtlUGFzc2FibGVLaXQiOlsibWFrZVBhc3NhYmxlS2l0Il0sIm1ha2VFbmNvZGVQYXNzYWJsZSI6WyJtYWtlRW5jb2RlUGFzc2FibGUiXSwibWFrZURlY29kZVBhc3NhYmxlIjpbIm1ha2VEZWNvZGVQYXNzYWJsZSJdLCJpc0VuY29kZWRSZW1vdGFibGUiOlsiaXNFbmNvZGVkUmVtb3RhYmxlIl0sInBhc3NTdHlsZVByZWZpeGVzIjpbInBhc3NTdHlsZVByZWZpeGVzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANm6fDOBIgAAgSIAACsAAABAZW5kby9tYXJzaGFsLXYxLjYuMy9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJRQ0xBU1MiLCJtYWtlRGVjb2RlRnJvbUNhcERhdGEiLCJtYWtlRW5jb2RlVG9DYXBEYXRhIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgcGFzc1N0eWxlT2YsaXNFcnJvckxpa2UsbWFrZVRhZ2dlZCxpc09iamVjdCxnZXRUYWcsaGFzT3duUHJvcGVydHlPZixhc3NlcnRQYXNzYWJsZVN5bWJvbCxuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc2FibGVTeW1ib2xGb3JOYW1lLFgsRmFpbCxxOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wiaXNFcnJvckxpa2VcIiwgWyRozY9fYSA9PiAoaXNFcnJvckxpa2UgPSAkaM2PX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjNj19hID0+IChtYWtlVGFnZ2VkID0gJGjNj19hKV1dLFtcImlzT2JqZWN0XCIsIFskaM2PX2EgPT4gKGlzT2JqZWN0ID0gJGjNj19hKV1dLFtcImdldFRhZ1wiLCBbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjNj19hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjNj19hKV1dLFtcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsIFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlU3ltYm9sID0gJGjNj19hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjNj19hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsIFskaM2PX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLCBbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIkZhaWxcIiwgWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsIFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtcbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsXG5kZWZpbmVQcm9wZXJ0aWVzLFxuaXMsXG5lbnRyaWVzLFxuZnJvbUVudHJpZXMsXG5mcmVlemV9PVxuT2JqZWN0O1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgUUNMQVNTPSdAcWNsYXNzJzskaM2PX29uY2UuUUNMQVNTKFFDTEFTUyk7XG5cblxuLypcblxuXG4gKi9cbmNvbnN0IGhhc1FDbGFzcz0oZW5jb2RlZCk9Pmhhc093blByb3BlcnR5T2YoZW5jb2RlZCxRQ0xBU1MpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBxY2xhc3NNYXRjaGVzPShlbmNvZGVkLHFjbGFzcyk9PlxuaXNPYmplY3QoZW5jb2RlZCkmJlxuIWlzQXJyYXkoZW5jb2RlZCkmJlxuaGFzUUNsYXNzKGVuY29kZWQpJiZcbmVuY29kZWRbUUNMQVNTXT09PXFjbGFzcztcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbmNvbnN0IGRvbnRFbmNvZGVSZW1vdGFibGVUb0NhcERhdGE9KHJlbSk9PkZhaWwgYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gO1xuXG5jb25zdCBkb250RW5jb2RlUHJvbWlzZVRvQ2FwRGF0YT0ocHJvbSk9PkZhaWwgYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVFcnJvclRvQ2FwRGF0YT0oZXJyKT0+RmFpbCBgZXJyb3Igb2JqZWN0IHVuZXhwZWN0ZWQ6ICR7ZXJyfWA7XG5cbi8qXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZUVuY29kZVRvQ2FwRGF0YT0oZW5jb2RlT3B0aW9ucz17fSk9PntcbmNvbnN0e1xuZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhPWRvbnRFbmNvZGVSZW1vdGFibGVUb0NhcERhdGEsXG5lbmNvZGVQcm9taXNlVG9DYXBEYXRhPWRvbnRFbmNvZGVQcm9taXNlVG9DYXBEYXRhLFxuZW5jb2RlRXJyb3JUb0NhcERhdGE9ZG9udEVuY29kZUVycm9yVG9DYXBEYXRhfT1cbmVuY29kZU9wdGlvbnM7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG5jb25zdCBlbmNvZGVUb0NhcERhdGFSZWN1cj0ocGFzc2FibGUpPT57XG4vL1xuLy9cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwYXNzYWJsZSk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnbnVsbCc6XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdzdHJpbmcnOntcbi8vXG5yZXR1cm4gcGFzc2FibGU7XG4gfVxuY2FzZSd1bmRlZmluZWQnOntcbnJldHVybntbUUNMQVNTXTondW5kZWZpbmVkJ307XG4gfVxuY2FzZSdudW1iZXInOntcbi8vXG5pZihOdW1iZXIuaXNOYU4ocGFzc2FibGUpKXtcbnJldHVybntbUUNMQVNTXTonTmFOJ307XG4gfWVsc2UgaWYocGFzc2FibGU9PT1JbmZpbml0eSl7XG5yZXR1cm57W1FDTEFTU106J0luZmluaXR5J307XG4gfWVsc2UgaWYocGFzc2FibGU9PT0tSW5maW5pdHkpe1xucmV0dXJue1tRQ0xBU1NdOictSW5maW5pdHknfTtcbiB9XG4vL1xucmV0dXJuIGlzKHBhc3NhYmxlLC0wKT8wOnBhc3NhYmxlO1xuIH1cbmNhc2UnYmlnaW50Jzp7XG5yZXR1cm57XG5bUUNMQVNTXTonYmlnaW50JyxcbmRpZ2l0czpTdHJpbmcocGFzc2FibGUpfTtcblxuIH1cbmNhc2Unc3ltYm9sJzp7XG5hc3NlcnRQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG5jb25zdCBuYW1lPS8qICAgICAgICAgICAgICAgICAqL25hbWVGb3JQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG5yZXR1cm57XG5bUUNMQVNTXTonc3ltYm9sJyxcbm5hbWV9O1xuXG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG5pZihoYXNPd25Qcm9wZXJ0eU9mKHBhc3NhYmxlLFFDTEFTUykpe1xuLy9cbmNvbnN0e1tRQ0xBU1NdOnFjbGFzc1ZhbHVlLC4uLnJlc3R9PXBhc3NhYmxlO1xuLyogICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHJlc3VsdD17XG5bUUNMQVNTXTonaGlsYmVydCcsXG5vcmlnaW5hbDplbmNvZGVUb0NhcERhdGFSZWN1cihxY2xhc3NWYWx1ZSl9O1xuXG5pZihvd25LZXlzKHJlc3QpLmxlbmd0aD49MSl7XG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5yZXN1bHQucmVzdD1lbmNvZGVUb0NhcERhdGFSZWN1cihmcmVlemUocmVzdCkpO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfVxuLy9cbi8vXG4vL1xuY29uc3QgbmFtZXM9b3duS2V5cyhwYXNzYWJsZSkuc29ydCgpO1xucmV0dXJuIGZyb21FbnRyaWVzKFxubmFtZXMubWFwKChuYW1lKT0+W25hbWUsZW5jb2RlVG9DYXBEYXRhUmVjdXIocGFzc2FibGVbbmFtZV0pXSkpO1xuXG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbnJldHVybiBwYXNzYWJsZS5tYXAoZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5yZXR1cm57XG5bUUNMQVNTXTondGFnZ2VkJyxcbnRhZzpnZXRUYWcocGFzc2FibGUpLFxucGF5bG9hZDplbmNvZGVUb0NhcERhdGFSZWN1cihwYXNzYWJsZS5wYXlsb2FkKX07XG5cbiB9XG5jYXNlJ3JlbW90YWJsZSc6e1xuY29uc3QgZW5jb2RlZD1lbmNvZGVSZW1vdGFibGVUb0NhcERhdGEoXG5wYXNzYWJsZSxcbmVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcblxuaWYocWNsYXNzTWF0Y2hlcyhlbmNvZGVkLCdzbG90Jykpe1xucmV0dXJuIGVuY29kZWQ7XG4gfVxuLy9cbnRocm93IEZhaWwgYGludGVybmFsOiBSZW1vdGFibGUgZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCAke3EoXG5RQ0xBU1MpXG4gfSAke3EoJ3Nsb3QnKX06ICR7ZW5jb2RlZH1gO1xuIH1cbmNhc2UncHJvbWlzZSc6e1xuY29uc3QgZW5jb2RlZD1lbmNvZGVQcm9taXNlVG9DYXBEYXRhKHBhc3NhYmxlLGVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcbmlmKHFjbGFzc01hdGNoZXMoZW5jb2RlZCwnc2xvdCcpKXtcbnJldHVybiBlbmNvZGVkO1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBQcm9taXNlIGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggJHtxKFxuUUNMQVNTLFxuJ3Nsb3QnKVxuIH06ICR7ZW5jb2RlZH1gO1xuIH1cbmNhc2UnZXJyb3InOntcbmNvbnN0IGVuY29kZWQ9ZW5jb2RlRXJyb3JUb0NhcERhdGEocGFzc2FibGUsZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuaWYocWNsYXNzTWF0Y2hlcyhlbmNvZGVkLCdlcnJvcicpKXtcbnJldHVybiBlbmNvZGVkO1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoICR7cShcblFDTEFTUyxcbidlcnJvcicpXG4gfTogJHtlbmNvZGVkfWA7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBhc3NlcnQuZmFpbChcblggYGludGVybmFsOiBVbnJlY29nbml6ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfWAsXG5UeXBlRXJyb3IpO1xuXG4gfX1cblxuIH07XG5jb25zdCBlbmNvZGVUb0NhcERhdGE9KHBhc3NhYmxlKT0+e1xuaWYoaXNFcnJvckxpa2UocGFzc2FibGUpKXtcbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5yZXR1cm4gaGFyZGVuKGVuY29kZUVycm9yVG9DYXBEYXRhKHBhc3NhYmxlLGVuY29kZVRvQ2FwRGF0YVJlY3VyKSk7XG4gfVxucmV0dXJuIGhhcmRlbihlbmNvZGVUb0NhcERhdGFSZWN1cihwYXNzYWJsZSkpO1xuIH07XG5yZXR1cm4gaGFyZGVuKGVuY29kZVRvQ2FwRGF0YSk7XG4gfTskaM2PX29uY2UubWFrZUVuY29kZVRvQ2FwRGF0YShtYWtlRW5jb2RlVG9DYXBEYXRhKTtcbmhhcmRlbihtYWtlRW5jb2RlVG9DYXBEYXRhKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbmNvbnN0IGRvbnREZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YT0oc2xvdEVuY29kaW5nKT0+XG5GYWlsIGByZW1vdGFibGUgb3IgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Nsb3RFbmNvZGluZ31gO1xuY29uc3QgZG9udERlY29kZUVycm9yRnJvbUNhcERhdGE9KGVycm9yRW5jb2RpbmcpPT5cbkZhaWwgYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZXJyb3JFbmNvZGluZ31gO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIG1ha2VEZWNvZGVGcm9tQ2FwRGF0YT0oZGVjb2RlT3B0aW9ucz17fSk9PntcbmNvbnN0e1xuZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGE9ZG9udERlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhPWRvbnREZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbmRlY29kZUVycm9yRnJvbUNhcERhdGE9ZG9udERlY29kZUVycm9yRnJvbUNhcERhdGF9PVxuZGVjb2RlT3B0aW9ucztcblxuZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGE9PT1kZWNvZGVQcm9taXNlRnJvbUNhcERhdGF8fFxuRmFpbCBgQW4gaW1wbGVtZW50YXRpb24gcmVzdHJpY3Rpb24gZm9yIG5vdzogSWYgZWl0aGVyIGRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhIG9yIGRlY29kZVByb21pc2VGcm9tQ2FwRGF0YSBpcyBwcm92aWRlZCwgYm90aCBtdXN0IGJlIHByb3ZpZGVkIGFuZCB0aGV5IG11c3QgYmUgdGhlIHNhbWU6ICR7cShcbmRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhKVxuIH0gdnMgJHtxKGRlY29kZVByb21pc2VGcm9tQ2FwRGF0YSl9YDtcblxuLypcblxuXG5cblxuXG5cblxuXG4gICAqL1xuY29uc3QgZGVjb2RlRnJvbUNhcERhdGE9KGpzb25FbmNvZGVkKT0+e1xuaWYoIWlzT2JqZWN0KGpzb25FbmNvZGVkKSl7XG4vL1xucmV0dXJuIGpzb25FbmNvZGVkO1xuIH1cbmlmKGlzQXJyYXkoanNvbkVuY29kZWQpKXtcbnJldHVybiBqc29uRW5jb2RlZC5tYXAoKGVuY29kZWRWYWwpPT5kZWNvZGVGcm9tQ2FwRGF0YShlbmNvZGVkVmFsKSk7XG4gfWVsc2UgaWYoaGFzUUNsYXNzKGpzb25FbmNvZGVkKSl7XG5jb25zdCBxY2xhc3M9anNvbkVuY29kZWRbUUNMQVNTXTtcbnR5cGVvZiBxY2xhc3M9PT0nc3RyaW5nJ3x8XG5GYWlsIGBpbnZhbGlkICR7cShRQ0xBU1MpfSB0eXBlb2YgJHtxKHR5cGVvZiBxY2xhc3MpfWA7XG5zd2l0Y2gocWNsYXNzKXtcbi8vXG5jYXNlJ3VuZGVmaW5lZCc6e1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5jYXNlJ05hTic6e1xucmV0dXJuIE5hTjtcbiB9XG5jYXNlJ0luZmluaXR5Jzp7XG5yZXR1cm4gSW5maW5pdHk7XG4gfVxuY2FzZSctSW5maW5pdHknOntcbnJldHVybi1JbmZpbml0eTtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xuY29uc3R7ZGlnaXRzfT1qc29uRW5jb2RlZDtcbnR5cGVvZiBkaWdpdHM9PT0nc3RyaW5nJ3x8XG5GYWlsIGBpbnZhbGlkIGRpZ2l0cyB0eXBlb2YgJHtxKHR5cGVvZiBkaWdpdHMpfWA7XG5yZXR1cm4gQmlnSW50KGRpZ2l0cyk7XG4gfVxuY2FzZSdAQGFzeW5jSXRlcmF0b3InOntcbi8vXG4vL1xuLy9cbi8vXG5yZXR1cm4gU3ltYm9sLmFzeW5jSXRlcmF0b3I7XG4gfVxuY2FzZSdzeW1ib2wnOntcbmNvbnN0e25hbWV9PWpzb25FbmNvZGVkO1xucmV0dXJuIHBhc3NhYmxlU3ltYm9sRm9yTmFtZShuYW1lKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuY29uc3R7dGFnLHBheWxvYWR9PWpzb25FbmNvZGVkO1xucmV0dXJuIG1ha2VUYWdnZWQodGFnLGRlY29kZUZyb21DYXBEYXRhKHBheWxvYWQpKTtcbiB9XG5jYXNlJ3Nsb3QnOntcbi8vXG4vL1xuLy9cbmNvbnN0IGRlY29kZWQ9ZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEoXG5qc29uRW5jb2RlZCxcbmRlY29kZUZyb21DYXBEYXRhKTtcblxuLy9cbi8vXG4vL1xuLy9cbnJldHVybiBkZWNvZGVkO1xuIH1cbmNhc2UnZXJyb3InOntcbmNvbnN0IGRlY29kZWQ9ZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YShcbmpzb25FbmNvZGVkLFxuZGVjb2RlRnJvbUNhcERhdGEpO1xuXG5pZihwYXNzU3R5bGVPZihkZWNvZGVkKT09PSdlcnJvcicpe1xucmV0dXJuIGRlY29kZWQ7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IGRlY29kZUVycm9yRnJvbUNhcERhdGEgb3B0aW9uIG11c3QgcmV0dXJuIGFuIGVycm9yOiAke2RlY29kZWR9YDtcbiB9XG5jYXNlJ2hpbGJlcnQnOntcbmNvbnN0e29yaWdpbmFsLHJlc3R9PWpzb25FbmNvZGVkO1xuaGFzT3duUHJvcGVydHlPZihqc29uRW5jb2RlZCwnb3JpZ2luYWwnKXx8XG5GYWlsIGBJbnZhbGlkIEhpbGJlcnQgSG90ZWwgZW5jb2RpbmcgJHtqc29uRW5jb2RlZH1gO1xuLy9cbmNvbnN0IHJlc3VsdD17W1FDTEFTU106ZGVjb2RlRnJvbUNhcERhdGEob3JpZ2luYWwpfTtcbmlmKGhhc093blByb3BlcnR5T2YoanNvbkVuY29kZWQsJ3Jlc3QnKSl7XG5jb25zdCBpc05vbkVtcHR5T2JqZWN0PVxudHlwZW9mIHJlc3Q9PT0nb2JqZWN0JyYmXG5yZXN0IT09bnVsbCYmXG5vd25LZXlzKHJlc3QpLmxlbmd0aD49MTtcbmlmKCFpc05vbkVtcHR5T2JqZWN0KXtcbnRocm93IEZhaWwgYFJlc3QgZW5jb2RpbmcgbXVzdCBiZSBhIG5vbi1lbXB0eSBvYmplY3Q6ICR7cmVzdH1gO1xuIH1cbmNvbnN0IHJlc3RPYmo9ZGVjb2RlRnJvbUNhcERhdGEocmVzdCk7XG4vL1xuLy9cbi8vXG4haGFzT3duUHJvcGVydHlPZihyZXN0T2JqLFFDTEFTUyl8fFxuRmFpbCBgUmVzdCBtdXN0IG5vdCBjb250YWluIGl0cyBvd24gZGVmaW5pdGlvbiBvZiAke3EoUUNMQVNTKX1gO1xuZGVmaW5lUHJvcGVydGllcyhyZXN1bHQsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhyZXN0T2JqKSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9XG4vL1xuY2FzZSdpYmlkJzp7XG50aHJvdyBGYWlsIGBUaGUgY2FwRGF0YSBwcm90b2NvbCBubyBsb25nZXIgc3VwcG9ydHMgJHtxKFFDTEFTUyl9ICR7cShcbnFjbGFzcylcbiB9YDtcbiB9XG5kZWZhdWx0OntcbnRocm93IGFzc2VydC5mYWlsKFxuWCBgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLFxuVHlwZUVycm9yKTtcblxuIH19XG5cbiB9ZWxzZXtcbmFzc2VydCh0eXBlb2YganNvbkVuY29kZWQ9PT0nb2JqZWN0JyYmanNvbkVuY29kZWQhPT1udWxsKTtcbmNvbnN0IGRlY29kZUVudHJ5PShbbmFtZSxlbmNvZGVkVmFsXSk9PntcbnR5cGVvZiBuYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgUHJvcGVydHkgJHtxKG5hbWUpfSBvZiAke2pzb25FbmNvZGVkfSBtdXN0IGJlIGEgc3RyaW5nYDtcbnJldHVybltuYW1lLGRlY29kZUZyb21DYXBEYXRhKGVuY29kZWRWYWwpXTtcbiB9O1xuY29uc3QgZGVjb2RlZEVudHJpZXM9ZW50cmllcyhqc29uRW5jb2RlZCkubWFwKGRlY29kZUVudHJ5KTtcbnJldHVybiBmcm9tRW50cmllcyhkZWNvZGVkRW50cmllcyk7XG4gfVxuIH07XG5yZXR1cm4gaGFyZGVuKGRlY29kZUZyb21DYXBEYXRhKTtcbiB9OyRozY9fb25jZS5tYWtlRGVjb2RlRnJvbUNhcERhdGEobWFrZURlY29kZUZyb21DYXBEYXRhKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlFDTEFTUyI6WyJRQ0xBU1MiXSwibWFrZUVuY29kZVRvQ2FwRGF0YSI6WyJtYWtlRW5jb2RlVG9DYXBEYXRhIl0sIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSI6WyJtYWtlRGVjb2RlRnJvbUNhcERhdGEiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA+4mezV0iAABdIgAALQAAAEBlbmRvL21hcnNoYWwtdjEuNi4zL3NyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsibWFrZURlY29kZUZyb21TbWFsbGNhcHMiLCJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBwYXNzU3R5bGVPZixpc0Vycm9yTGlrZSxtYWtlVGFnZ2VkLGdldFRhZyxoYXNPd25Qcm9wZXJ0eU9mLGFzc2VydFBhc3NhYmxlU3ltYm9sLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWUsWCxGYWlsLHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJpc0Vycm9yTGlrZVwiLCBbJGjNj19hID0+IChpc0Vycm9yTGlrZSA9ICRozY9fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV0sW1wiZ2V0VGFnXCIsIFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaM2PX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVTeW1ib2xcIiwgWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaM2PX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIiwgWyRozY9fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsIFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLCBbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIiwgWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtpcyxlbnRyaWVzLGZyb21FbnRyaWVzfT1PYmplY3Q7XG5cbmNvbnN0IEJBTkc9JyEnLmNoYXJDb2RlQXQoMCk7XG5jb25zdCBEQVNIPSctJy5jaGFyQ29kZUF0KDApO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBzdGFydHNTcGVjaWFsPShlbmNvZGVkU3RyKT0+e1xuaWYoZW5jb2RlZFN0cj09PScnKXtcbnJldHVybiBmYWxzZTtcbiB9XG4vL1xuY29uc3QgY29kZT1lbmNvZGVkU3RyLmNoYXJDb2RlQXQoMCk7XG4vL1xucmV0dXJuIEJBTkc8PWNvZGUmJmNvZGU8PURBU0g7XG4gfTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbmNvbnN0IGRvbnRFbmNvZGVSZW1vdGFibGVUb1NtYWxsY2Fwcz0ocmVtKT0+XG5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YDtcblxuY29uc3QgZG9udEVuY29kZVByb21pc2VUb1NtYWxsY2Fwcz0ocHJvbSk9PkZhaWwgYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVFcnJvclRvU21hbGxjYXBzPShlcnIpPT5cbkZhaWwgYGVycm9yIG9iamVjdCB1bmV4cGVjdGVkOiAke3EoZXJyKX1gO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIG1ha2VFbmNvZGVUb1NtYWxsY2Fwcz0oZW5jb2RlT3B0aW9ucz17fSk9PntcbmNvbnN0e1xuZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHM9ZG9udEVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzLFxuZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzPWRvbnRFbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMsXG5lbmNvZGVFcnJvclRvU21hbGxjYXBzPWRvbnRFbmNvZGVFcnJvclRvU21hbGxjYXBzfT1cbmVuY29kZU9wdGlvbnM7XG5cbmNvbnN0IGFzc2VydEVuY29kZWRFcnJvcj0oZW5jb2RpbmcpPT57XG50eXBlb2YgZW5jb2Rpbmc9PT0nb2JqZWN0JyYmaGFzT3duUHJvcGVydHlPZihlbmNvZGluZywnI2Vycm9yJyl8fFxuRmFpbCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgaGF2ZSBcIiNlcnJvclwiIHByb3BlcnR5OiAke3EoXG5lbmNvZGluZylcbiB9YDtcbi8vXG5jb25zdCBtZXNzYWdlPWVuY29kaW5nWycjZXJyb3InXTtcbnR5cGVvZiBtZXNzYWdlPT09J3N0cmluZycmJihcbiFzdGFydHNTcGVjaWFsKG1lc3NhZ2UpfHxtZXNzYWdlLmNoYXJBdCgwKT09PSchJyl8fFxuRmFpbCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgaGF2ZSBzdHJpbmcgbWVzc2FnZTogJHtxKG1lc3NhZ2UpfWA7XG4gfTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbmNvbnN0IGVuY29kZVRvU21hbGxjYXBzUmVjdXI9KHBhc3NhYmxlKT0+e1xuLy9cbi8vXG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocGFzc2FibGUpO1xuc3dpdGNoKHBhc3NTdHlsZSl7XG5jYXNlJ251bGwnOlxuY2FzZSdib29sZWFuJzp7XG4vL1xucmV0dXJuIHBhc3NhYmxlO1xuIH1cbmNhc2Unc3RyaW5nJzp7XG5pZihzdGFydHNTcGVjaWFsKHBhc3NhYmxlKSl7XG4vL1xuLy9cbi8vXG4vL1xuLy9cbnJldHVybiBgISR7cGFzc2FibGV9YDtcbiB9XG4vL1xucmV0dXJuIHBhc3NhYmxlO1xuIH1cbmNhc2UndW5kZWZpbmVkJzp7XG5yZXR1cm4nI3VuZGVmaW5lZCc7XG4gfVxuY2FzZSdudW1iZXInOntcbi8vXG5pZihOdW1iZXIuaXNOYU4ocGFzc2FibGUpKXtcbnJldHVybicjTmFOJztcbiB9ZWxzZSBpZihwYXNzYWJsZT09PUluZmluaXR5KXtcbnJldHVybicjSW5maW5pdHknO1xuIH1lbHNlIGlmKHBhc3NhYmxlPT09LUluZmluaXR5KXtcbnJldHVybicjLUluZmluaXR5JztcbiB9XG4vL1xucmV0dXJuIGlzKHBhc3NhYmxlLC0wKT8wOnBhc3NhYmxlO1xuIH1cbmNhc2UnYmlnaW50Jzp7XG5jb25zdCBzdHI9U3RyaW5nKHBhc3NhYmxlKTtcbnJldHVybiAoLyogICAgICAgICAgICAgICAgICovcGFzc2FibGU8MG4/c3RyOmArJHtzdHJ9YCk7XG4gfVxuY2FzZSdzeW1ib2wnOntcbmFzc2VydFBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbmNvbnN0IG5hbWU9LyogICAgICAgICAgICAgICAgICovbmFtZUZvclBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbnJldHVybiBgJSR7bmFtZX1gO1xuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuLy9cbi8vXG4vL1xuY29uc3QgbmFtZXM9b3duS2V5cyhwYXNzYWJsZSkuc29ydCgpO1xucmV0dXJuIGZyb21FbnRyaWVzKFxubmFtZXMubWFwKChuYW1lKT0+W1xuZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihuYW1lKSxcbmVuY29kZVRvU21hbGxjYXBzUmVjdXIocGFzc2FibGVbbmFtZV0pXSkpO1xuXG5cbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xucmV0dXJuIHBhc3NhYmxlLm1hcChlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xucmV0dXJue1xuJyN0YWcnOmVuY29kZVRvU21hbGxjYXBzUmVjdXIoZ2V0VGFnKHBhc3NhYmxlKSksXG5wYXlsb2FkOmVuY29kZVRvU21hbGxjYXBzUmVjdXIocGFzc2FibGUucGF5bG9hZCl9O1xuXG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyhcbnBhc3NhYmxlLFxuZW5jb2RlVG9TbWFsbGNhcHNSZWN1cik7XG5cbmlmKHR5cGVvZiByZXN1bHQ9PT0nc3RyaW5nJyYmcmVzdWx0LmNoYXJBdCgwKT09PSckJyl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbi8vXG50aHJvdyBGYWlsIGBpbnRlcm5hbDogUmVtb3RhYmxlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiRcIjogJHtyZXN1bHR9YDtcbiB9XG5jYXNlJ3Byb21pc2UnOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMoXG5wYXNzYWJsZSxcbmVuY29kZVRvU21hbGxjYXBzUmVjdXIpO1xuXG5pZih0eXBlb2YgcmVzdWx0PT09J3N0cmluZycmJnJlc3VsdC5jaGFyQXQoMCk9PT0nJicpe1xucmV0dXJuIHJlc3VsdDtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogUHJvbWlzZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCImXCI6ICR7cmVzdWx0fWA7XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3QgcmVzdWx0PWVuY29kZUVycm9yVG9TbWFsbGNhcHMocGFzc2FibGUsZW5jb2RlVG9TbWFsbGNhcHNSZWN1cik7XG5hc3NlcnRFbmNvZGVkRXJyb3IocmVzdWx0KTtcbnJldHVybiByZXN1bHQ7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBhc3NlcnQuZmFpbChcblggYGludGVybmFsOiBVbnJlY29nbml6ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfWAsXG5UeXBlRXJyb3IpO1xuXG4gfX1cblxuIH07XG5jb25zdCBlbmNvZGVUb1NtYWxsY2Fwcz0ocGFzc2FibGUpPT57XG5pZihpc0Vycm9yTGlrZShwYXNzYWJsZSkpe1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbmNvbnN0IHJlc3VsdD1oYXJkZW4oXG5lbmNvZGVFcnJvclRvU21hbGxjYXBzKHBhc3NhYmxlLGVuY29kZVRvU21hbGxjYXBzUmVjdXIpKTtcblxuYXNzZXJ0RW5jb2RlZEVycm9yKHJlc3VsdCk7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbnJldHVybiBoYXJkZW4oZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZSkpO1xuIH07XG5yZXR1cm4gaGFyZGVuKGVuY29kZVRvU21hbGxjYXBzKTtcbiB9OyRozY9fb25jZS5tYWtlRW5jb2RlVG9TbWFsbGNhcHMobWFrZUVuY29kZVRvU21hbGxjYXBzKTtcbmhhcmRlbihtYWtlRW5jb2RlVG9TbWFsbGNhcHMpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuY29uc3QgZG9udERlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHM9KGVuY29kaW5nKT0+XG5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gO1xuY29uc3QgZG9udERlY29kZVByb21pc2VGcm9tU21hbGxjYXBzPShlbmNvZGluZyk9PlxuRmFpbCBgcHJvbWlzZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzPShlbmNvZGluZyk9PlxuRmFpbCBgZXJyb3IgdW5leHBlY3RlZDogJHtxKGVuY29kaW5nKX1gO1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgICAgICAgIG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzPShkZWNvZGVPcHRpb25zPXt9KT0+e1xuY29uc3R7XG5kZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzPWRvbnREZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzLFxuZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHM9ZG9udERlY29kZVByb21pc2VGcm9tU21hbGxjYXBzLFxuZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzPWRvbnREZWNvZGVFcnJvckZyb21TbWFsbGNhcHN9PVxuZGVjb2RlT3B0aW9ucztcblxuLypcblxuXG5cblxuXG5cblxuXG4gICAqL1xuY29uc3QgZGVjb2RlRnJvbVNtYWxsY2Fwcz0oZW5jb2RpbmcpPT57XG5zd2l0Y2godHlwZW9mIGVuY29kaW5nKXtcbmNhc2UnYm9vbGVhbic6XG5jYXNlJ251bWJlcic6e1xucmV0dXJuIGVuY29kaW5nO1xuIH1cbmNhc2Unc3RyaW5nJzp7XG5pZighc3RhcnRzU3BlY2lhbChlbmNvZGluZykpe1xucmV0dXJuIGVuY29kaW5nO1xuIH1cbmNvbnN0IGM9ZW5jb2RpbmcuY2hhckF0KDApO1xuc3dpdGNoKGMpe1xuY2FzZSchJzp7XG4vL1xucmV0dXJuIGVuY29kaW5nLnNsaWNlKDEpO1xuIH1cbmNhc2UnJSc6e1xucmV0dXJuIHBhc3NhYmxlU3ltYm9sRm9yTmFtZShlbmNvZGluZy5zbGljZSgxKSk7XG4gfVxuY2FzZScjJzp7XG5zd2l0Y2goZW5jb2Rpbmcpe1xuY2FzZScjdW5kZWZpbmVkJzp7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmNhc2UnI05hTic6e1xucmV0dXJuIE5hTjtcbiB9XG5jYXNlJyNJbmZpbml0eSc6e1xucmV0dXJuIEluZmluaXR5O1xuIH1cbmNhc2UnIy1JbmZpbml0eSc6e1xucmV0dXJuLUluZmluaXR5O1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgYXNzZXJ0LmZhaWwoXG5YIGB1bmtub3duIGNvbnN0YW50IFwiJHtxKGVuY29kaW5nKX1cImAsXG5UeXBlRXJyb3IpO1xuXG4gfX1cblxuIH1cbmNhc2UnKyc6XG5jYXNlJy0nOntcbnJldHVybiBCaWdJbnQoZW5jb2RpbmcpO1xuIH1cbmNhc2UnJCc6e1xuY29uc3QgcmVzdWx0PWRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMoXG5lbmNvZGluZyxcbmRlY29kZUZyb21TbWFsbGNhcHMpO1xuXG4vL1xuaWYocGFzc1N0eWxlT2YocmVzdWx0KSE9PSdyZW1vdGFibGUnKXtcbkZhaWwgYGludGVybmFsOiBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhIHJlbW90YWJsZTogJHtyZXN1bHR9YDtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH1cbmNhc2UnJic6e1xuY29uc3QgcmVzdWx0PWRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzKFxuZW5jb2RpbmcsXG5kZWNvZGVGcm9tU21hbGxjYXBzKTtcblxuaWYocGFzc1N0eWxlT2YocmVzdWx0KSE9PSdwcm9taXNlJyl7XG5GYWlsIGBpbnRlcm5hbDogZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMgb3B0aW9uIG11c3QgcmV0dXJuIGEgcHJvbWlzZTogJHtyZXN1bHR9YDtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgU3BlY2lhbCBjaGFyICR7cShcbmMpXG4gfSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZTogJHtlbmNvZGluZ31gO1xuIH19XG5cbiB9XG5jYXNlJ29iamVjdCc6e1xuaWYoZW5jb2Rpbmc9PT1udWxsKXtcbnJldHVybiBlbmNvZGluZztcbiB9XG5cbmlmKGlzQXJyYXkoZW5jb2RpbmcpKXtcbnJldHVybiBlbmNvZGluZy5tYXAoKHZhbCk9PmRlY29kZUZyb21TbWFsbGNhcHModmFsKSk7XG4gfVxuXG5pZihoYXNPd25Qcm9wZXJ0eU9mKGVuY29kaW5nLCcjdGFnJykpe1xuY29uc3R7JyN0YWcnOnRhZyxwYXlsb2FkLC4uLnJlc3R9PWVuY29kaW5nO1xudHlwZW9mIHRhZz09PSdzdHJpbmcnfHxcbkZhaWwgYFZhbHVlIG9mIFwiI3RhZ1wiLCB0aGUgdGFnLCBtdXN0IGJlIGEgc3RyaW5nOiAke2VuY29kaW5nfWA7XG5vd25LZXlzKHJlc3QpLmxlbmd0aD09PTB8fFxuRmFpbCBgI3RhZyByZWNvcmQgdW5leHBlY3RlZCBwcm9wZXJ0aWVzOiAke3Eob3duS2V5cyhyZXN0KSl9YDtcbnJldHVybiBtYWtlVGFnZ2VkKFxuZGVjb2RlRnJvbVNtYWxsY2Fwcyh0YWcpLFxuZGVjb2RlRnJvbVNtYWxsY2FwcyhwYXlsb2FkKSk7XG5cbiB9XG5cbmlmKGhhc093blByb3BlcnR5T2YoZW5jb2RpbmcsJyNlcnJvcicpKXtcbmNvbnN0IHJlc3VsdD1kZWNvZGVFcnJvckZyb21TbWFsbGNhcHMoXG5lbmNvZGluZyxcbmRlY29kZUZyb21TbWFsbGNhcHMpO1xuXG5wYXNzU3R5bGVPZihyZXN1bHQpPT09J2Vycm9yJ3x8XG5GYWlsIGBpbnRlcm5hbDogZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhbiBlcnJvcjogJHtyZXN1bHR9YDtcbnJldHVybiByZXN1bHQ7XG4gfVxuXG5jb25zdCBkZWNvZGVFbnRyeT0oW2VuY29kZWROYW1lLGVuY29kZWRWYWxdKT0+e1xudHlwZW9mIGVuY29kZWROYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgUHJvcGVydHkgbmFtZSAke3EoXG5lbmNvZGVkTmFtZSlcbiB9IG9mICR7ZW5jb2Rpbmd9IG11c3QgYmUgYSBzdHJpbmdgO1xuZW5jb2RlZE5hbWUuY2hhckF0KDApIT09JyMnfHxcbkZhaWwgYFVucmVjb2duaXplZCByZWNvcmQgdHlwZSAke3EoZW5jb2RlZE5hbWUpfTogJHtlbmNvZGluZ31gO1xuY29uc3QgbmFtZT1kZWNvZGVGcm9tU21hbGxjYXBzKGVuY29kZWROYW1lKTtcbnR5cGVvZiBuYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgRGVjb2RlZCBwcm9wZXJ0eSBuYW1lICR7bmFtZX0gZnJvbSAke2VuY29kaW5nfSBtdXN0IGJlIGEgc3RyaW5nYDtcbnJldHVybltuYW1lLGRlY29kZUZyb21TbWFsbGNhcHMoZW5jb2RlZFZhbCldO1xuIH07XG5jb25zdCBkZWNvZGVkRW50cmllcz1lbnRyaWVzKGVuY29kaW5nKS5tYXAoZGVjb2RlRW50cnkpO1xucmV0dXJuIGZyb21FbnRyaWVzKGRlY29kZWRFbnRyaWVzKTtcbiB9XG5kZWZhdWx0OntcbnRocm93IGFzc2VydC5mYWlsKFxuWCBgaW50ZXJuYWw6IHVucmVjb2duaXplZCBKU09OIHR5cGVvZiAke3EoXG50eXBlb2YgZW5jb2RpbmcpXG4gfTogJHtlbmNvZGluZ31gLFxuVHlwZUVycm9yKTtcblxuIH19XG5cbiB9O1xucmV0dXJuIGhhcmRlbihkZWNvZGVGcm9tU21hbGxjYXBzKTtcbiB9OyRozY9fb25jZS5tYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyhtYWtlRGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiOlsibWFrZUVuY29kZVRvU21hbGxjYXBzIl0sIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzIjpbIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADLFCCU/IwAAPyMAACoAAABAZW5kby9tYXJzaGFsLXYxLjYuMy9zcmMvbWFyc2hhbC1qdXN0aW4uanN7ImltcG9ydHMiOlsiQGVuZG8vbmF0IiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2Vycm9ycyIsIi4vZW5jb2RlVG9DYXBEYXRhLmpzIl0sImV4cG9ydHMiOlsiZGVjb2RlVG9KdXN0aW4iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBOYXQsZ2V0RXJyb3JDb25zdHJ1Y3Rvcixpc09iamVjdCxwYXNzYWJsZVN5bWJvbEZvck5hbWUscSxYLEZhaWwsUUNMQVNTOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIiwgWyRozY9fYSA9PiAoTmF0ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiZ2V0RXJyb3JDb25zdHJ1Y3RvclwiLCBbJGjNj19hID0+IChnZXRFcnJvckNvbnN0cnVjdG9yID0gJGjNj19hKV1dLFtcImlzT2JqZWN0XCIsIFskaM2PX2EgPT4gKGlzT2JqZWN0ID0gJGjNj19hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLCBbJGjNj19hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIiwgWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJYXCIsIFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLCBbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9lbmNvZGVUb0NhcERhdGEuanNcIiwgW1tcIlFDTEFTU1wiLCBbJGjNj19hID0+IChRQ0xBU1MgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e3N0cmluZ2lmeTpxdW90ZX09SlNPTjtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBtYWtlWWVzSW5kZW50ZXI9KCk9PntcbmNvbnN0IHN0cmluZ3M9W107XG5sZXQgbGV2ZWw9MDtcbmxldCBuZWVkU3BhY2U9ZmFsc2U7XG5jb25zdCBsaW5lPSgpPT57XG5uZWVkU3BhY2U9ZmFsc2U7XG5yZXR1cm4gc3RyaW5ncy5wdXNoKCdcXG4nLCcgICcucmVwZWF0KGxldmVsKSk7XG4gfTtcbnJldHVybiBoYXJkZW4oe1xub3Blbjoob3BlbkJyYWNrZXQpPT57XG5sZXZlbCs9MTtcbmlmKG5lZWRTcGFjZSl7XG5zdHJpbmdzLnB1c2goJyAnKTtcbiB9XG5uZWVkU3BhY2U9ZmFsc2U7XG5yZXR1cm4gc3RyaW5ncy5wdXNoKG9wZW5CcmFja2V0KTtcbiB9LFxubGluZSxcbm5leHQ6KHRva2VuKT0+e1xuaWYobmVlZFNwYWNlJiZ0b2tlbiE9PScsJyl7XG5zdHJpbmdzLnB1c2goJyAnKTtcbiB9XG5uZWVkU3BhY2U9dHJ1ZTtcbnJldHVybiBzdHJpbmdzLnB1c2godG9rZW4pO1xuIH0sXG5jbG9zZTooY2xvc2VCcmFja2V0KT0+e1xuYXNzZXJ0KGxldmVsPj0xKTtcbmxldmVsLT0xO1xubGluZSgpO1xucmV0dXJuIHN0cmluZ3MucHVzaChjbG9zZUJyYWNrZXQpO1xuIH0sXG5kb25lOigpPT57XG5hc3NlcnQuZXF1YWwobGV2ZWwsMCk7XG5yZXR1cm4gc3RyaW5ncy5qb2luKCcnKTtcbiB9fSk7XG5cbiB9O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgYmFkUGFpclBhdHRlcm49L14oPzpcXHdcXHd8PDx8Pj58XFwrXFwrfC0tfDwhfC0+KSQvO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBtYWtlTm9JbmRlbnRlcj0oKT0+e1xuLyogICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHN0cmluZ3M9W107XG5yZXR1cm4gaGFyZGVuKHtcbm9wZW46KG9wZW5CcmFja2V0KT0+c3RyaW5ncy5wdXNoKG9wZW5CcmFja2V0KSxcbmxpbmU6KCk9PnN0cmluZ3MubGVuZ3RoLFxubmV4dDoodG9rZW4pPT57XG5pZihzdHJpbmdzLmxlbmd0aD49MSl7XG5jb25zdCBsYXN0PXN0cmluZ3Nbc3RyaW5ncy5sZW5ndGgtMV07XG4vL1xuaWYobGFzdC5sZW5ndGg+PTEmJnRva2VuLmxlbmd0aD49MSl7XG5jb25zdCBwYWlyPSBgJHtsYXN0W2xhc3QubGVuZ3RoLTFdfSR7dG9rZW5bMF19YDtcbmlmKGJhZFBhaXJQYXR0ZXJuLnRlc3QocGFpcikpe1xuc3RyaW5ncy5wdXNoKCcgJyk7XG4gfVxuIH1cbiB9XG5yZXR1cm4gc3RyaW5ncy5wdXNoKHRva2VuKTtcbiB9LFxuY2xvc2U6KGNsb3NlQnJhY2tldCk9PntcbmlmKHN0cmluZ3MubGVuZ3RoPj0xJiZzdHJpbmdzW3N0cmluZ3MubGVuZ3RoLTFdPT09JywnKXtcbnN0cmluZ3MucG9wKCk7XG4gfVxucmV0dXJuIHN0cmluZ3MucHVzaChjbG9zZUJyYWNrZXQpO1xuIH0sXG5kb25lOigpPT5zdHJpbmdzLmpvaW4oJycpfSk7XG5cbiB9O1xuXG5jb25zdCBpZGVudFBhdHRlcm49L15bYS16QS1aXVxcdyokLztcbmhhcmRlbihpZGVudFBhdHRlcm4pO1xuY29uc3QgQXRBdFByZWZpeFBhdHRlcm49L15AQCguKikkLztcbmhhcmRlbihBdEF0UHJlZml4UGF0dGVybik7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgZGVjb2RlVG9KdXN0aW49KGVuY29kaW5nLHNob3VsZEluZGVudD1mYWxzZSxzbG90cz1bXSk9Pntcbi8qXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG5jb25zdCBwcmVwYXJlPShyYXdUcmVlKT0+e1xuaWYoIWlzT2JqZWN0KHJhd1RyZWUpKXtcbnJldHVybjtcbiB9XG4vL1xuYXNzZXJ0LnR5cGVvZihyYXdUcmVlLCdvYmplY3QnKTtcbmFzc2VydChyYXdUcmVlIT09bnVsbCk7XG5pZihRQ0xBU1MgaW4gcmF3VHJlZSl7XG5jb25zdCBxY2xhc3M9cmF3VHJlZVtRQ0xBU1NdO1xudHlwZW9mIHFjbGFzcz09PSdzdHJpbmcnfHxcbkZhaWwgYGludmFsaWQgcWNsYXNzIHR5cGVvZiAke3EodHlwZW9mIHFjbGFzcyl9YDtcbmFzc2VydCghaXNBcnJheShyYXdUcmVlKSk7XG5zd2l0Y2gocmF3VHJlZVsnQHFjbGFzcyddKXtcbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnTmFOJzpcbmNhc2UnSW5maW5pdHknOlxuY2FzZSctSW5maW5pdHknOntcbnJldHVybjtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xuY29uc3R7ZGlnaXRzfT1yYXdUcmVlO1xudHlwZW9mIGRpZ2l0cz09PSdzdHJpbmcnfHxcbkZhaWwgYGludmFsaWQgZGlnaXRzIHR5cGVvZiAke3EodHlwZW9mIGRpZ2l0cyl9YDtcbnJldHVybjtcbiB9XG5jYXNlJ0BAYXN5bmNJdGVyYXRvcic6e1xucmV0dXJuO1xuIH1cbmNhc2Unc3ltYm9sJzp7XG5jb25zdHtuYW1lfT1yYXdUcmVlO1xuYXNzZXJ0LnR5cGVvZihuYW1lLCdzdHJpbmcnKTtcbmNvbnN0IHN5bT1wYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG5hc3NlcnQudHlwZW9mKHN5bSwnc3ltYm9sJyk7XG5yZXR1cm47XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0e3RhZyxwYXlsb2FkfT1yYXdUcmVlO1xuYXNzZXJ0LnR5cGVvZih0YWcsJ3N0cmluZycpO1xucHJlcGFyZShwYXlsb2FkKTtcbnJldHVybjtcbiB9XG5jYXNlJ3Nsb3QnOntcbmNvbnN0e2luZGV4LGlmYWNlfT1yYXdUcmVlO1xuYXNzZXJ0LnR5cGVvZihpbmRleCwnbnVtYmVyJyk7XG5OYXQoaW5kZXgpO1xuaWYoaWZhY2UhPT11bmRlZmluZWQpe1xuYXNzZXJ0LnR5cGVvZihpZmFjZSwnc3RyaW5nJyk7XG4gfVxucmV0dXJuO1xuIH1cbmNhc2UnaGlsYmVydCc6e1xuY29uc3R7b3JpZ2luYWwscmVzdH09cmF3VHJlZTtcbidvcmlnaW5hbCdpbiByYXdUcmVlfHxcbkZhaWwgYEludmFsaWQgSGlsYmVydCBIb3RlbCBlbmNvZGluZyAke3Jhd1RyZWV9YDtcbnByZXBhcmUob3JpZ2luYWwpO1xuaWYoJ3Jlc3QnaW4gcmF3VHJlZSl7XG5pZih0eXBlb2YgcmVzdCE9PSdvYmplY3QnKXtcbnRocm93IEZhaWwgYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdGA7XG4gfVxuaWYocmVzdD09PW51bGwpe1xudGhyb3cgRmFpbCBgUmVzdCAke3Jlc3R9IGVuY29kaW5nIG11c3Qgbm90IGJlIG51bGxgO1xuIH1cbmlmKGlzQXJyYXkocmVzdCkpe1xudGhyb3cgRmFpbCBgUmVzdCAke3Jlc3R9IGVuY29kaW5nIG11c3Qgbm90IGJlIGFuIGFycmF5YDtcbiB9XG5pZihRQ0xBU1MgaW4gcmVzdCl7XG50aHJvdyBGYWlsIGBSZXN0IGVuY29kaW5nICR7cmVzdH0gbXVzdCBub3QgY29udGFpbiAke3EoUUNMQVNTKX1gO1xuIH1cbmNvbnN0IG5hbWVzPW93bktleXMocmVzdCk7XG5mb3IoY29uc3QgbmFtZSBvZiBuYW1lcyl7XG50eXBlb2YgbmFtZT09PSdzdHJpbmcnfHxcbkZhaWwgYFByb3BlcnR5IG5hbWUgJHtuYW1lfSBvZiAke3Jhd1RyZWV9IG11c3QgYmUgYSBzdHJpbmdgO1xucHJlcGFyZShyZXN0W25hbWVdKTtcbiB9XG4gfVxucmV0dXJuO1xuIH1cbmNhc2UnZXJyb3InOntcbmNvbnN0e25hbWUsbWVzc2FnZX09cmF3VHJlZTtcbmlmKHR5cGVvZiBuYW1lIT09J3N0cmluZycpe1xudGhyb3cgRmFpbCBgaW52YWxpZCBlcnJvciBuYW1lIHR5cGVvZiAke3EodHlwZW9mIG5hbWUpfWA7XG4gfVxuZ2V0RXJyb3JDb25zdHJ1Y3RvcihuYW1lKSE9PXVuZGVmaW5lZHx8XG5GYWlsIGBNdXN0IGJlIHRoZSBuYW1lIG9mIGFuIEVycm9yIGNvbnN0cnVjdG9yICR7bmFtZX1gO1xudHlwZW9mIG1lc3NhZ2U9PT0nc3RyaW5nJ3x8XG5GYWlsIGBpbnZhbGlkIGVycm9yIG1lc3NhZ2UgdHlwZW9mICR7cSh0eXBlb2YgbWVzc2FnZSl9YDtcbnJldHVybjtcbiB9XG5cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoWCBgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLFR5cGVFcnJvcik7XG4gfX1cblxuIH1lbHNlIGlmKGlzQXJyYXkocmF3VHJlZSkpe1xuY29uc3R7bGVuZ3RofT1yYXdUcmVlO1xuZm9yKGxldCBpPTA7aTxsZW5ndGg7aSs9MSl7XG5wcmVwYXJlKHJhd1RyZWVbaV0pO1xuIH1cbiB9ZWxzZXtcbmNvbnN0IG5hbWVzPW93bktleXMocmF3VHJlZSk7XG5mb3IoY29uc3QgbmFtZSBvZiBuYW1lcyl7XG5pZih0eXBlb2YgbmFtZSE9PSdzdHJpbmcnKXtcbnRocm93IEZhaWwgYFByb3BlcnR5IG5hbWUgJHtuYW1lfSBvZiAke3Jhd1RyZWV9IG11c3QgYmUgYSBzdHJpbmdgO1xuIH1cbnByZXBhcmUocmF3VHJlZVtuYW1lXSk7XG4gfVxuIH1cbiB9O1xuXG5jb25zdCBtYWtlSW5kZW50ZXI9c2hvdWxkSW5kZW50P21ha2VZZXNJbmRlbnRlcjptYWtlTm9JbmRlbnRlcjtcbmxldCBvdXQ9bWFrZUluZGVudGVyKCk7XG5cbi8qXG5cblxuXG5cblxuXG4gICAqL1xuY29uc3QgZGVjb2RlPShyYXdUcmVlKT0+e1xuLy9cbnJldHVybiByZWN1cihyYXdUcmVlKTtcbiB9O1xuXG5jb25zdCBkZWNvZGVQcm9wZXJ0eT0obmFtZSx2YWx1ZSk9Pntcbm91dC5saW5lKCk7XG5pZihuYW1lPT09J19fcHJvdG9fXycpe1xuLy9cbi8vXG4vL1xuLy9cbm91dC5uZXh0KCBgW1wiX19wcm90b19fXCJdOmApO1xuIH1lbHNlIGlmKGlkZW50UGF0dGVybi50ZXN0KG5hbWUpKXtcbm91dC5uZXh0KCBgJHtuYW1lfTpgKTtcbiB9ZWxzZXtcbm91dC5uZXh0KCBgJHtxdW90ZShuYW1lKX06YCk7XG4gfVxuZGVjb2RlKHZhbHVlKTtcbm91dC5uZXh0KCcsJyk7XG4gfTtcblxuLypcblxuXG5cblxuICAgKi9cbmNvbnN0IHJlY3VyPShyYXdUcmVlKT0+e1xuaWYoIWlzT2JqZWN0KHJhd1RyZWUpKXtcbi8vXG5yZXR1cm4gb3V0Lm5leHQocXVvdGUocmF3VHJlZSkpO1xuIH1cbi8vXG5hc3NlcnQudHlwZW9mKHJhd1RyZWUsJ29iamVjdCcpO1xuYXNzZXJ0KHJhd1RyZWUhPT1udWxsKTtcbmlmKFFDTEFTUyBpbiByYXdUcmVlKXtcbmNvbnN0IHFjbGFzcz1yYXdUcmVlW1FDTEFTU107XG5hc3NlcnQudHlwZW9mKHFjbGFzcywnc3RyaW5nJyk7XG5hc3NlcnQoIWlzQXJyYXkocmF3VHJlZSkpO1xuLy9cbi8vXG4vL1xuc3dpdGNoKHJhd1RyZWVbJ0BxY2xhc3MnXSl7XG4vL1xuY2FzZSd1bmRlZmluZWQnOlxuY2FzZSdOYU4nOlxuY2FzZSdJbmZpbml0eSc6XG5jYXNlJy1JbmZpbml0eSc6e1xuLy9cbnJldHVybiBvdXQubmV4dChxY2xhc3MpO1xuIH1cbmNhc2UnYmlnaW50Jzp7XG5jb25zdHtkaWdpdHN9PXJhd1RyZWU7XG5hc3NlcnQudHlwZW9mKGRpZ2l0cywnc3RyaW5nJyk7XG5yZXR1cm4gb3V0Lm5leHQoIGAke0JpZ0ludChkaWdpdHMpfW5gKTtcbiB9XG5jYXNlJ0BAYXN5bmNJdGVyYXRvcic6e1xuLy9cbnJldHVybiBvdXQubmV4dCgnU3ltYm9sLmFzeW5jSXRlcmF0b3InKTtcbiB9XG5jYXNlJ3N5bWJvbCc6e1xuY29uc3R7bmFtZX09cmF3VHJlZTtcbmFzc2VydC50eXBlb2YobmFtZSwnc3RyaW5nJyk7XG5jb25zdCBzeW09cGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuYXNzZXJ0LnR5cGVvZihzeW0sJ3N5bWJvbCcpO1xuY29uc3QgcmVnaXN0ZXJlZE5hbWU9U3ltYm9sLmtleUZvcihzeW0pO1xuaWYocmVnaXN0ZXJlZE5hbWU9PT11bmRlZmluZWQpe1xuY29uc3QgbWF0Y2g9QXRBdFByZWZpeFBhdHRlcm4uZXhlYyhuYW1lKTtcbmFzc2VydChtYXRjaCE9PW51bGwpO1xuY29uc3Qgc3VmZml4PW1hdGNoWzFdO1xuYXNzZXJ0KFN5bWJvbFtzdWZmaXhdPT09c3ltKTtcbmFzc2VydChpZGVudFBhdHRlcm4udGVzdChzdWZmaXgpKTtcbnJldHVybiBvdXQubmV4dCggYFN5bWJvbC4ke3N1ZmZpeH1gKTtcbiB9XG5yZXR1cm4gb3V0Lm5leHQoIGBTeW1ib2wuZm9yKCR7cXVvdGUocmVnaXN0ZXJlZE5hbWUpfSlgKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuY29uc3R7dGFnLHBheWxvYWR9PXJhd1RyZWU7XG5vdXQubmV4dCggYG1ha2VUYWdnZWQoJHtxdW90ZSh0YWcpfSxgKTtcbmRlY29kZShwYXlsb2FkKTtcbnJldHVybiBvdXQubmV4dCgnKScpO1xuIH1cblxuY2FzZSdzbG90Jzp7XG5sZXR7aWZhY2V9PXJhd1RyZWU7XG5jb25zdCBpbmRleD1OdW1iZXIoTmF0KHJhd1RyZWUuaW5kZXgpKTtcbmNvbnN0IG5lc3RlZFJlbmRlcj0oYXJnKT0+e1xuY29uc3Qgb2xkT3V0PW91dDtcbnRyeXtcbm91dD1tYWtlTm9JbmRlbnRlcigpO1xuZGVjb2RlKGFyZyk7XG5yZXR1cm4gb3V0LmRvbmUoKTtcbiB9ZmluYWxseXtcbm91dD1vbGRPdXQ7XG4gfVxuIH07XG5pZihpbmRleDxzbG90cy5sZW5ndGgpe1xuY29uc3Qgc2xvdD1uZXN0ZWRSZW5kZXIoc2xvdHNbaW5kZXhdKTtcbmlmKGlmYWNlPT09dW5kZWZpbmVkKXtcbnJldHVybiBvdXQubmV4dCggYHNsb3RUb1ZhbCgke3Nsb3R9KWApO1xuIH1cbmlmYWNlPW5lc3RlZFJlbmRlcihpZmFjZSk7XG5yZXR1cm4gb3V0Lm5leHQoIGBzbG90VG9WYWwoJHtzbG90fSwke2lmYWNlfSlgKTtcbiB9ZWxzZSBpZihpZmFjZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gb3V0Lm5leHQoIGBzbG90KCR7aW5kZXh9KWApO1xuIH1cbmlmYWNlPW5lc3RlZFJlbmRlcihpZmFjZSk7XG5yZXR1cm4gb3V0Lm5leHQoIGBzbG90KCR7aW5kZXh9LCR7aWZhY2V9KWApO1xuIH1cblxuY2FzZSdoaWxiZXJ0Jzp7XG5jb25zdHtvcmlnaW5hbCxyZXN0fT1yYXdUcmVlO1xub3V0Lm9wZW4oJ3snKTtcbmRlY29kZVByb3BlcnR5KFFDTEFTUyxvcmlnaW5hbCk7XG5pZigncmVzdCdpbiByYXdUcmVlKXtcbmFzc2VydC50eXBlb2YocmVzdCwnb2JqZWN0Jyk7XG5hc3NlcnQocmVzdCE9PW51bGwpO1xuY29uc3QgbmFtZXM9b3duS2V5cyhyZXN0KTtcbmZvcihjb25zdCBuYW1lIG9mIG5hbWVzKXtcbmlmKHR5cGVvZiBuYW1lIT09J3N0cmluZycpe1xudGhyb3cgRmFpbCBgUHJvcGVydHkgbmFtZSAke3EoXG5uYW1lKVxuIH0gb2YgJHtyZXN0fSBtdXN0IGJlIGEgc3RyaW5nYDtcbiB9XG5kZWNvZGVQcm9wZXJ0eShuYW1lLHJlc3RbbmFtZV0pO1xuIH1cbiB9XG5yZXR1cm4gb3V0LmNsb3NlKCd9Jyk7XG4gfVxuXG5jYXNlJ2Vycm9yJzp7XG5jb25zdHtcbm5hbWUsXG5tZXNzYWdlLFxuY2F1c2U9dW5kZWZpbmVkLFxuZXJyb3JzPXVuZGVmaW5lZH09XG5yYXdUcmVlO1xuY2F1c2U9PT11bmRlZmluZWR8fFxuRmFpbCBgZXJyb3IgY2F1c2Ugbm90IHlldCBpbXBsZW1lbnRlZCBpbiBtYXJzaGFsLWp1c3RpbmA7XG5uYW1lIT09IGBBZ2dyZWdhdGVFcnJvcmB8fFxuRmFpbCBgQWdncmVnYXRlRXJyb3Igbm90IHlldCBpbXBsZW1lbnRlZCBpbiBtYXJzaGFsLWp1c3RpbmA7XG5lcnJvcnM9PT11bmRlZmluZWR8fFxuRmFpbCBgZXJyb3IgZXJyb3JzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gbWFyc2hhbC1qdXN0aW5gO1xucmV0dXJuIG91dC5uZXh0KCBgJHtuYW1lfSgke3F1b3RlKG1lc3NhZ2UpfSlgKTtcbiB9XG5cbmRlZmF1bHQ6e1xudGhyb3cgYXNzZXJ0LmZhaWwoXG5YIGB1bnJlY29nbml6ZWQgJHtxKFFDTEFTUyl9ICR7cShxY2xhc3MpfWAsXG5UeXBlRXJyb3IpO1xuXG4gfX1cblxuIH1lbHNlIGlmKGlzQXJyYXkocmF3VHJlZSkpe1xuY29uc3R7bGVuZ3RofT1yYXdUcmVlO1xuaWYobGVuZ3RoPT09MCl7XG5yZXR1cm4gb3V0Lm5leHQoJ1tdJyk7XG4gfWVsc2V7XG5vdXQub3BlbignWycpO1xuZm9yKGxldCBpPTA7aTxsZW5ndGg7aSs9MSl7XG5vdXQubGluZSgpO1xuZGVjb2RlKHJhd1RyZWVbaV0pO1xub3V0Lm5leHQoJywnKTtcbiB9XG5yZXR1cm4gb3V0LmNsb3NlKCddJyk7XG4gfVxuIH1lbHNle1xuLy9cbi8vXG5jb25zdCBuYW1lcz0vKiAgICAgICAgICAgICAgICAgICAqL293bktleXMocmF3VHJlZSk7XG5pZihuYW1lcy5sZW5ndGg9PT0wKXtcbnJldHVybiBvdXQubmV4dCgne30nKTtcbiB9ZWxzZXtcbm91dC5vcGVuKCd7Jyk7XG5mb3IoY29uc3QgbmFtZSBvZiBuYW1lcyl7XG5kZWNvZGVQcm9wZXJ0eShuYW1lLHJhd1RyZWVbbmFtZV0pO1xuIH1cbnJldHVybiBvdXQuY2xvc2UoJ30nKTtcbiB9XG4gfVxuIH07XG5wcmVwYXJlKGVuY29kaW5nKTtcbmRlY29kZShlbmNvZGluZyk7XG5yZXR1cm4gb3V0LmRvbmUoKTtcbiB9OyRozY9fb25jZS5kZWNvZGVUb0p1c3RpbihkZWNvZGVUb0p1c3Rpbik7XG5oYXJkZW4oZGVjb2RlVG9KdXN0aW4pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVjb2RlVG9KdXN0aW4iOlsiZGVjb2RlVG9KdXN0aW4iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAE5ayZe0GAADtBgAALQAAAEBlbmRvL21hcnNoYWwtdjEuNi4zL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL21hcnNoYWwuanMiXSwiZXhwb3J0cyI6WyJwYXJzZSIsInN0cmluZ2lmeSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IEZhaWwsbWFrZU1hcnNoYWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIiwgWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vbWFyc2hhbC5qc1wiLCBbW1wibWFrZU1hcnNoYWxcIiwgWyRozY9fYSA9PiAobWFrZU1hcnNoYWwgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbmNvbnN0e2ZyZWV6ZX09T2JqZWN0O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGRvTm90Q29udmVydFZhbFRvU2xvdD0odmFsKT0+XG5GYWlsIGBNYXJzaGFsJ3Mgc3RyaW5naWZ5IHJlamVjdHMgcHJlc2VuY2VzIGFuZCBwcm9taXNlcyAke3ZhbH1gO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGRvTm90Q29udmVydFNsb3RUb1ZhbD0oc2xvdCxfaWZhY2UpPT5cbkZhaWwgYE1hcnNoYWwncyBwYXJzZSBtdXN0IG5vdCBlbmNvZGUgYW55IHNsb3RzICR7c2xvdH1gO1xuXG5jb25zdCBiYWRBcnJheUhhbmRsZXI9aGFyZGVuKHtcbmdldDooX3RhcmdldCxuYW1lLF9yZWNlaXZlcik9PntcbmlmKG5hbWU9PT0nbGVuZ3RoJyl7XG5yZXR1cm4gMDtcbiB9XG4vL1xudGhyb3cgRmFpbCBgTWFyc2hhbCdzIHBhcnNlIG11c3Qgbm90IGVuY29kZSBhbnkgc2xvdCBwb3NpdGlvbnMgJHtuYW1lfWA7XG4gfX0pO1xuXG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgYXJyYXlUYXJnZXQ9ZnJlZXplKC8qICAgICAgICAgICAgICAgICovW10pO1xuY29uc3QgYmFkQXJyYXk9bmV3IFByb3h5KGFycmF5VGFyZ2V0LGJhZEFycmF5SGFuZGxlcik7XG5cbmNvbnN0e3NlcmlhbGl6ZSx1bnNlcmlhbGl6ZX09bWFrZU1hcnNoYWwoXG5kb05vdENvbnZlcnRWYWxUb1Nsb3QsXG5kb05vdENvbnZlcnRTbG90VG9WYWwsXG57XG5lcnJvclRhZ2dpbmc6J29mZicsXG4vL1xuc2VyaWFsaXplQm9keUZvcm1hdDonY2FwZGF0YSd9KTtcblxuXG5cbi8qXG5cblxuICovXG5jb25zdCBzdHJpbmdpZnk9KHZhbCk9PnNlcmlhbGl6ZSh2YWwpLmJvZHk7JGjNj19vbmNlLnN0cmluZ2lmeShzdHJpbmdpZnkpO1xuaGFyZGVuKHN0cmluZ2lmeSk7XG5cbi8qXG5cblxuICovXG5jb25zdCBwYXJzZT0oc3RyKT0+XG51bnNlcmlhbGl6ZShcbi8vXG4vL1xuLy9cbmZyZWV6ZSh7XG5ib2R5OnN0cixcbnNsb3RzOmJhZEFycmF5fSkpOyRozY9fb25jZS5wYXJzZShwYXJzZSk7XG5cblxuaGFyZGVuKHBhcnNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InN0cmluZ2lmeSI6WyJzdHJpbmdpZnkiXSwicGFyc2UiOlsicGFyc2UiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAlYANwlknAABZJwAAIwAAAEBlbmRvL21hcnNoYWwtdjEuNi4zL3NyYy9tYXJzaGFsLmpzeyJpbXBvcnRzIjpbIkBlbmRvL25hdCIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9lcnJvcnMiLCJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyIsIi4vZW5jb2RlVG9DYXBEYXRhLmpzIiwiLi9lbmNvZGVUb1NtYWxsY2Fwcy5qcyJdLCJleHBvcnRzIjpbIm1ha2VNYXJzaGFsIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgTmF0LGFzc2VydFBhc3NhYmxlLGdldEludGVyZmFjZU9mLGdldEVycm9yQ29uc3RydWN0b3IsaGFzT3duUHJvcGVydHlPZix0b1Bhc3NhYmxlRXJyb3IsWCxGYWlsLHEsbWFrZUVycm9yLGFubm90YXRlRXJyb3Isb2JqZWN0TWFwLFFDTEFTUyxtYWtlRW5jb2RlVG9DYXBEYXRhLG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSxtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyxtYWtlRW5jb2RlVG9TbWFsbGNhcHM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLCBbJGjNj19hID0+IChOYXQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVwiLCBbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRozY9fYSldXSxbXCJnZXRJbnRlcmZhY2VPZlwiLCBbJGjNj19hID0+IChnZXRJbnRlcmZhY2VPZiA9ICRozY9fYSldXSxbXCJnZXRFcnJvckNvbnN0cnVjdG9yXCIsIFskaM2PX2EgPT4gKGdldEVycm9yQ29uc3RydWN0b3IgPSAkaM2PX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjNj19hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjNj19hKV1dLFtcInRvUGFzc2FibGVFcnJvclwiLCBbJGjNj19hID0+ICh0b1Bhc3NhYmxlRXJyb3IgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIiwgWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJGYWlsXCIsIFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLCBbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIm1ha2VFcnJvclwiLCBbJGjNj19hID0+IChtYWtlRXJyb3IgPSAkaM2PX2EpXV0sW1wiYW5ub3RhdGVFcnJvclwiLCBbJGjNj19hID0+IChhbm5vdGF0ZUVycm9yID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanNcIiwgW1tcIm9iamVjdE1hcFwiLCBbJGjNj19hID0+IChvYmplY3RNYXAgPSAkaM2PX2EpXV1dXSxbXCIuL2VuY29kZVRvQ2FwRGF0YS5qc1wiLCBbW1wiUUNMQVNTXCIsIFskaM2PX2EgPT4gKFFDTEFTUyA9ICRozY9fYSldXSxbXCJtYWtlRW5jb2RlVG9DYXBEYXRhXCIsIFskaM2PX2EgPT4gKG1ha2VFbmNvZGVUb0NhcERhdGEgPSAkaM2PX2EpXV0sW1wibWFrZURlY29kZUZyb21DYXBEYXRhXCIsIFskaM2PX2EgPT4gKG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSA9ICRozY9fYSldXV1dLFtcIi4vZW5jb2RlVG9TbWFsbGNhcHMuanNcIiwgW1tcIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzXCIsIFskaM2PX2EgPT4gKG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzID0gJGjNj19hKV1dLFtcIm1ha2VFbmNvZGVUb1NtYWxsY2Fwc1wiLCBbJGjNj19hID0+IChtYWtlRW5jb2RlVG9TbWFsbGNhcHMgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuXG4gKi9cblxuY29uc3R7ZGVmaW5lUHJvcGVydGllc309T2JqZWN0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGRlZmF1bHRWYWxUb1Nsb3RGbj0oeCk9Png7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGRlZmF1bHRTbG90VG9WYWxGbj0oeCxfKT0+eDtcblxuLypcblxuXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZU1hcnNoYWw9KFxuY29udmVydFZhbFRvU2xvdD1kZWZhdWx0VmFsVG9TbG90Rm4sXG5jb252ZXJ0U2xvdFRvVmFsPWRlZmF1bHRTbG90VG9WYWxGbixcbntcbmVycm9yVGFnZ2luZz0nb24nLFxubWFyc2hhbE5hbWU9J2Fub24tbWFyc2hhbCcsXG4vL1xuLy9cbmVycm9ySWROdW09MTAwMDAsXG4vL1xuLy9cbm1hcnNoYWxTYXZlRXJyb3I9KGVycik9PlxuY29uc29sZS5sb2coJ1RlbXBvcmFyeSBsb2dnaW5nIG9mIHNlbnQgZXJyb3InLGVyciksXG4vL1xuLy9cbnNlcmlhbGl6ZUJvZHlGb3JtYXQ9J2NhcGRhdGEnfT1cbnt9KT0+XG57XG5hc3NlcnQudHlwZW9mKG1hcnNoYWxOYW1lLCdzdHJpbmcnKTtcbmVycm9yVGFnZ2luZz09PSdvbid8fFxuZXJyb3JUYWdnaW5nPT09J29mZid8fFxuRmFpbCBgVGhlIGVycm9yVGFnZ2luZyBvcHRpb24gY2FuIG9ubHkgYmUgXCJvblwiIG9yIFwib2ZmXCIgJHtlcnJvclRhZ2dpbmd9YDtcbmNvbnN0IG5leHRFcnJvcklkPSgpPT57XG5lcnJvcklkTnVtKz0xO1xucmV0dXJuIGBlcnJvcjoke21hcnNoYWxOYW1lfSMke2Vycm9ySWROdW19YDtcbiB9O1xuXG4vKlxuXG4gICAqL1xuY29uc3QgdG9DYXBEYXRhPShyb290KT0+e1xuY29uc3Qgc2xvdHM9W107XG4vL1xuY29uc3Qgc2xvdE1hcD1uZXcgTWFwKCk7XG5cbi8qXG5cblxuICAgICAqL1xuY29uc3QgZW5jb2RlU2xvdENvbW1vbj0ocGFzc2FibGUpPT57XG5sZXQgaW5kZXg9c2xvdE1hcC5nZXQocGFzc2FibGUpO1xuaWYoaW5kZXghPT11bmRlZmluZWQpe1xuLy9cbmFzc2VydC50eXBlb2YoaW5kZXgsJ251bWJlcicpO1xucmV0dXJuIGhhcmRlbih7aW5kZXgscmVwZWF0OnRydWV9KTtcbiB9XG5cbmluZGV4PXNsb3RzLmxlbmd0aDtcbmNvbnN0IHNsb3Q9Y29udmVydFZhbFRvU2xvdChwYXNzYWJsZSk7XG5zbG90cy5wdXNoKHNsb3QpO1xuc2xvdE1hcC5zZXQocGFzc2FibGUsaW5kZXgpO1xucmV0dXJuIGhhcmRlbih7aW5kZXgscmVwZWF0OmZhbHNlfSk7XG4gfTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gICAgICovXG5jb25zdCBlbmNvZGVFcnJvckNvbW1vbj0oZXJyLGVuY29kZVJlY3VyKT0+e1xuY29uc3QgbWVzc2FnZT1lbmNvZGVSZWN1ciggYCR7ZXJyLm1lc3NhZ2V9YCk7XG5hc3NlcnQudHlwZW9mKG1lc3NhZ2UsJ3N0cmluZycpO1xuY29uc3QgbmFtZT1lbmNvZGVSZWN1ciggYCR7ZXJyLm5hbWV9YCk7XG5hc3NlcnQudHlwZW9mKG5hbWUsJ3N0cmluZycpO1xuLy9cbi8vXG4vL1xuaWYoZXJyb3JUYWdnaW5nPT09J29uJyl7XG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuY29uc3QgZXJyb3JJZD1lbmNvZGVSZWN1cihuZXh0RXJyb3JJZCgpKTtcbmFzc2VydC50eXBlb2YoZXJyb3JJZCwnc3RyaW5nJyk7XG5hbm5vdGF0ZUVycm9yKGVycixYIGBTZW50IGFzICR7ZXJyb3JJZH1gKTtcbm1hcnNoYWxTYXZlRXJyb3IoZXJyKTtcbnJldHVybiBoYXJkZW4oe2Vycm9ySWQsbWVzc2FnZSxuYW1lfSk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHttZXNzYWdlLG5hbWV9KTtcbiB9XG4gfTtcblxuaWYoc2VyaWFsaXplQm9keUZvcm1hdD09PSdjYXBkYXRhJyl7XG4vKlxuXG5cblxuICAgICAgICovXG5jb25zdCBlbmNvZGVTbG90VG9DYXBEYXRhPShwYXNzYWJsZSxpZmFjZT11bmRlZmluZWQpPT57XG5jb25zdHtpbmRleCxyZXBlYXR9PWVuY29kZVNsb3RDb21tb24ocGFzc2FibGUpO1xuXG5pZihyZXBlYXQ9PT10cnVlfHxpZmFjZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gaGFyZGVuKHtbUUNMQVNTXTonc2xvdCcsaW5kZXh9KTtcbiB9ZWxzZXtcbnJldHVybiBoYXJkZW4oe1tRQ0xBU1NdOidzbG90JyxpZmFjZSxpbmRleH0pO1xuIH1cbiB9O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YT0odmFsLF9lbmNvZGVSZWN1cik9PlxuZW5jb2RlU2xvdFRvQ2FwRGF0YSh2YWwsZ2V0SW50ZXJmYWNlT2YodmFsKSk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGVuY29kZVByb21pc2VUb0NhcERhdGE9KHByb21pc2UsX2VuY29kZVJlY3VyKT0+XG5lbmNvZGVTbG90VG9DYXBEYXRhKHByb21pc2UpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAgICAgICAqL1xuY29uc3QgZW5jb2RlRXJyb3JUb0NhcERhdGE9KGVycixlbmNvZGVSZWN1cik9PntcbmNvbnN0IGVyckRhdGE9ZW5jb2RlRXJyb3JDb21tb24oZXJyLGVuY29kZVJlY3VyKTtcbnJldHVybiBoYXJkZW4oe1tRQ0xBU1NdOidlcnJvcicsLi4uZXJyRGF0YX0pO1xuIH07XG5cbmNvbnN0IGVuY29kZVRvQ2FwRGF0YT1tYWtlRW5jb2RlVG9DYXBEYXRhKHtcbmVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSxcbmVuY29kZVByb21pc2VUb0NhcERhdGEsXG5lbmNvZGVFcnJvclRvQ2FwRGF0YX0pO1xuXG5cbmNvbnN0IGVuY29kZWQ9ZW5jb2RlVG9DYXBEYXRhKHJvb3QpO1xuY29uc3QgYm9keT1KU09OLnN0cmluZ2lmeShlbmNvZGVkKTtcbnJldHVybiBoYXJkZW4oe1xuYm9keSxcbnNsb3RzfSk7XG5cbiB9ZWxzZSBpZihzZXJpYWxpemVCb2R5Rm9ybWF0PT09J3NtYWxsY2Fwcycpe1xuLypcblxuXG5cblxuICAgICAgICovXG5jb25zdCBlbmNvZGVTbG90VG9TbWFsbGNhcHM9KHByZWZpeCxwYXNzYWJsZSxpZmFjZT11bmRlZmluZWQpPT57XG5jb25zdHtpbmRleCxyZXBlYXR9PWVuY29kZVNsb3RDb21tb24ocGFzc2FibGUpO1xuXG4vL1xuaWYocmVwZWF0PT09dHJ1ZXx8aWZhY2U9PT11bmRlZmluZWQpe1xucmV0dXJuIGAke3ByZWZpeH0ke2luZGV4fWA7XG4gfVxucmV0dXJuIGAke3ByZWZpeH0ke2luZGV4fS4ke2lmYWNlfWA7XG4gfTtcblxuY29uc3QgZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHM9KHJlbW90YWJsZSxfZW5jb2RlUmVjdXIpPT5cbmVuY29kZVNsb3RUb1NtYWxsY2FwcygnJCcscmVtb3RhYmxlLGdldEludGVyZmFjZU9mKHJlbW90YWJsZSkpO1xuXG5jb25zdCBlbmNvZGVQcm9taXNlVG9TbWFsbGNhcHM9KHByb21pc2UsX2VuY29kZVJlY3VyKT0+XG5lbmNvZGVTbG90VG9TbWFsbGNhcHMoJyYnLHByb21pc2UpO1xuXG5jb25zdCBlbmNvZGVFcnJvclRvU21hbGxjYXBzPShlcnIsZW5jb2RlUmVjdXIpPT57XG5jb25zdCBlcnJEYXRhPWVuY29kZUVycm9yQ29tbW9uKGVycixlbmNvZGVSZWN1cik7XG5jb25zdHttZXNzYWdlLC4uLnJlc3R9PWVyckRhdGE7XG5yZXR1cm4gaGFyZGVuKHsnI2Vycm9yJzptZXNzYWdlLC4uLnJlc3R9KTtcbiB9O1xuXG5jb25zdCBlbmNvZGVUb1NtYWxsY2Fwcz1tYWtlRW5jb2RlVG9TbWFsbGNhcHMoe1xuZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMsXG5lbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMsXG5lbmNvZGVFcnJvclRvU21hbGxjYXBzfSk7XG5cblxuY29uc3QgZW5jb2RlZD1lbmNvZGVUb1NtYWxsY2Fwcyhyb290KTtcbmNvbnN0IHNtYWxsY2Fwc0JvZHk9SlNPTi5zdHJpbmdpZnkoZW5jb2RlZCk7XG5yZXR1cm4gaGFyZGVuKHtcbi8vXG4vL1xuYm9keTogYCMke3NtYWxsY2Fwc0JvZHl9YCxcbnNsb3RzfSk7XG5cbiB9ZWxzZXtcbi8vXG50aHJvdyBGYWlsIGBVbnJlY29nbml6ZWQgc2VyaWFsaXplQm9keUZvcm1hdDogJHtxKHNlcmlhbGl6ZUJvZHlGb3JtYXQpfWA7XG4gfVxuIH07XG5cbmNvbnN0IG1ha2VGdWxsUmV2aXZlPShzbG90cyk9Pntcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCB2YWxNYXA9bmV3IE1hcCgpO1xuXG4vKlxuXG5cbiAgICAgKi9cbmNvbnN0IGRlY29kZVNsb3RDb21tb249KHNsb3REYXRhKT0+e1xuY29uc3R7aWZhY2U9dW5kZWZpbmVkLGluZGV4LC4uLnJlc3R9PXNsb3REYXRhO1xub3duS2V5cyhyZXN0KS5sZW5ndGg9PT0wfHxcbkZhaWwgYHVuZXhwZWN0ZWQgZW5jb2RlZCBzbG90IHByb3BlcnRpZXMgJHtxKG93bktleXMocmVzdCkpfWA7XG5jb25zdCBleHRhbnQ9dmFsTWFwLmdldChpbmRleCk7XG5pZihleHRhbnQpe1xucmV0dXJuIGV4dGFudDtcbiB9XG4vL1xuLy9cbmNvbnN0IHNsb3Q9c2xvdHNbTnVtYmVyKE5hdChpbmRleCkpXTtcbmNvbnN0IHZhbD1jb252ZXJ0U2xvdFRvVmFsKHNsb3QsaWZhY2UpO1xudmFsTWFwLnNldChpbmRleCx2YWwpO1xucmV0dXJuIHZhbDtcbiB9O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICAgICAqL1xuY29uc3QgZGVjb2RlRXJyb3JDb21tb249KGVyckRhdGEsZGVjb2RlUmVjdXIpPT57XG5jb25zdHtcbmVycm9ySWQ9dW5kZWZpbmVkLFxubWVzc2FnZSxcbm5hbWUsXG5jYXVzZT11bmRlZmluZWQsXG5lcnJvcnM9dW5kZWZpbmVkLFxuLi4ucmVzdH09XG5lcnJEYXRhO1xuLy9cbi8vXG4vL1xuLy9cbmNvbnN0IGROYW1lPWRlY29kZVJlY3VyKG5hbWUpO1xuY29uc3QgZE1lc3NhZ2U9ZGVjb2RlUmVjdXIobWVzc2FnZSk7XG4vL1xuY29uc3QgZEVycm9ySWQ9LyogICAgICAgICAgICAgICAgICovZXJyb3JJZCYmZGVjb2RlUmVjdXIoZXJyb3JJZCk7XG5pZih0eXBlb2YgZE5hbWUhPT0nc3RyaW5nJyl7XG50aHJvdyBGYWlsIGBpbnZhbGlkIGVycm9yIG5hbWUgdHlwZW9mICR7cSh0eXBlb2YgZE5hbWUpfWA7XG4gfVxuaWYodHlwZW9mIGRNZXNzYWdlIT09J3N0cmluZycpe1xudGhyb3cgRmFpbCBgaW52YWxpZCBlcnJvciBtZXNzYWdlIHR5cGVvZiAke3EodHlwZW9mIGRNZXNzYWdlKX1gO1xuIH1cbmNvbnN0IGVyckNvbnN0cnVjdG9yPWdldEVycm9yQ29uc3RydWN0b3IoZE5hbWUpfHxFcnJvcjtcbmNvbnN0IGVycm9yTmFtZT1cbmRFcnJvcklkPT09dW5kZWZpbmVkP1xuIGBSZW1vdGUke2VyckNvbnN0cnVjdG9yLm5hbWV9YDpcbiBgUmVtb3RlJHtlcnJDb25zdHJ1Y3Rvci5uYW1lfSgke2RFcnJvcklkfSlgO1xuY29uc3Qgb3B0aW9ucz17XG5lcnJvck5hbWUsXG5zYW5pdGl6ZTpmYWxzZX07XG5cbmlmKGNhdXNlKXtcbm9wdGlvbnMuY2F1c2U9ZGVjb2RlUmVjdXIoY2F1c2UpO1xuIH1cbmlmKGVycm9ycyl7XG5vcHRpb25zLmVycm9ycz1kZWNvZGVSZWN1cihlcnJvcnMpO1xuIH1cbmNvbnN0IHJhd0Vycm9yPW1ha2VFcnJvcihkTWVzc2FnZSxlcnJDb25zdHJ1Y3RvcixvcHRpb25zKTtcbi8vXG4vL1xuLy9cbi8vXG5jb25zdCBkZXNjcz1vYmplY3RNYXAocmVzdCwoZGF0YSk9Pih7XG52YWx1ZTpkZWNvZGVSZWN1cihkYXRhKSxcbndyaXRhYmxlOmZhbHNlLFxuZW51bWVyYWJsZTpmYWxzZSxcbmNvbmZpZ3VyYWJsZTpmYWxzZX0pKTtcblxuZGVmaW5lUHJvcGVydGllcyhyYXdFcnJvcixkZXNjcyk7XG5oYXJkZW4ocmF3RXJyb3IpO1xucmV0dXJuIHRvUGFzc2FibGVFcnJvcihyYXdFcnJvcik7XG4gfTtcblxuLy9cbi8vXG4vL1xuLy9cbi8vXG5jb25zdCBkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YT0ocmF3VHJlZSxfZGVjb2RlUmVjdXIpPT57XG5jb25zdHtbUUNMQVNTXTpfLC4uLnNsb3REYXRhfT1yYXdUcmVlO1xucmV0dXJuIGRlY29kZVNsb3RDb21tb24oc2xvdERhdGEpO1xuIH07XG5cbmNvbnN0IGRlY29kZUVycm9yRnJvbUNhcERhdGE9KHJhd1RyZWUsZGVjb2RlUmVjdXIpPT57XG5jb25zdHtbUUNMQVNTXTpfLC4uLmVyckRhdGF9PXJhd1RyZWU7XG5yZXR1cm4gZGVjb2RlRXJyb3JDb21tb24oZXJyRGF0YSxkZWNvZGVSZWN1cik7XG4gfTtcblxuY29uc3QgcmV2aXZlRnJvbUNhcERhdGE9bWFrZURlY29kZUZyb21DYXBEYXRhKHtcbmRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhOmRlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhOmRlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YX0pO1xuXG5cbmNvbnN0IG1ha2VEZWNvZGVTbG90RnJvbVNtYWxsY2Fwcz0ocHJlZml4KT0+e1xuLypcblxuXG5cbiAgICAgICAqL1xucmV0dXJuKHN0cmluZ0VuY29kaW5nLF9kZWNvZGVSZWN1cik9PntcbmFzc2VydChzdHJpbmdFbmNvZGluZy5jaGFyQXQoMCk9PT1wcmVmaXgpO1xuLy9cbmNvbnN0IGk9c3RyaW5nRW5jb2RpbmcuaW5kZXhPZignLicpO1xuY29uc3QgaW5kZXg9TnVtYmVyKHN0cmluZ0VuY29kaW5nLnNsaWNlKDEsaTwwP3VuZGVmaW5lZDppKSk7XG4vL1xuY29uc3QgaWZhY2U9aTwwP3VuZGVmaW5lZDpzdHJpbmdFbmNvZGluZy5zbGljZShpKzEpO1xucmV0dXJuIGRlY29kZVNsb3RDb21tb24oe2lmYWNlLGluZGV4fSk7XG4gfTtcbiB9O1xuY29uc3QgZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2Fwcz1tYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHMoJyQnKTtcbmNvbnN0IGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzPW1ha2VEZWNvZGVTbG90RnJvbVNtYWxsY2FwcygnJicpO1xuXG5jb25zdCBkZWNvZGVFcnJvckZyb21TbWFsbGNhcHM9KGVuY29kaW5nLGRlY29kZVJlY3VyKT0+e1xuY29uc3R7JyNlcnJvcic6bWVzc2FnZSwuLi5yZXN0RXJyRGF0YX09ZW5jb2Rpbmc7XG4haGFzT3duUHJvcGVydHlPZihyZXN0RXJyRGF0YSwnbWVzc2FnZScpfHxcbkZhaWwgYHVuZXhwZWN0ZWQgZW5jb2RlZCBlcnJvciBwcm9wZXJ0eSAke3EoJ21lc3NhZ2UnKX1gO1xucmV0dXJuIGRlY29kZUVycm9yQ29tbW9uKHttZXNzYWdlLC4uLnJlc3RFcnJEYXRhfSxkZWNvZGVSZWN1cik7XG4gfTtcblxuY29uc3QgcmV2aXZlRnJvbVNtYWxsY2Fwcz1tYWtlRGVjb2RlRnJvbVNtYWxsY2Fwcyh7XG4vL1xuZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2Fwcyxcbi8vXG5kZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyxcbmRlY29kZUVycm9yRnJvbVNtYWxsY2Fwc30pO1xuXG5cbnJldHVybiBoYXJkZW4oe3Jldml2ZUZyb21DYXBEYXRhLHJldml2ZUZyb21TbWFsbGNhcHN9KTtcbiB9O1xuXG4vKlxuXG4gICAqL1xuY29uc3QgZnJvbUNhcERhdGE9KGRhdGEpPT57XG5jb25zdHtib2R5LHNsb3RzfT1kYXRhO1xudHlwZW9mIGJvZHk9PT0nc3RyaW5nJ3x8XG5GYWlsIGB1bnNlcmlhbGl6ZSgpIGdpdmVuIG5vbi1jYXBkYXRhICguYm9keSBpcyAke2JvZHl9LCBub3Qgc3RyaW5nKWA7XG5pc0FycmF5KGRhdGEuc2xvdHMpfHxcbkZhaWwgYHVuc2VyaWFsaXplKCkgZ2l2ZW4gbm9uLWNhcGRhdGEgKC5zbG90cyBhcmUgbm90IEFycmF5KWA7XG5jb25zdHtyZXZpdmVGcm9tQ2FwRGF0YSxyZXZpdmVGcm9tU21hbGxjYXBzfT1tYWtlRnVsbFJldml2ZShzbG90cyk7XG5sZXQgcmVzdWx0O1xuLy9cbmlmKGJvZHkuY2hhckF0KDApPT09JyMnKXtcbmNvbnN0IHNtYWxsY2Fwc0JvZHk9Ym9keS5zbGljZSgxKTtcbmNvbnN0IGVuY29kaW5nPWhhcmRlbihKU09OLnBhcnNlKHNtYWxsY2Fwc0JvZHkpKTtcbnJlc3VsdD1oYXJkZW4ocmV2aXZlRnJvbVNtYWxsY2FwcyhlbmNvZGluZykpO1xuIH1lbHNle1xuY29uc3QgcmF3VHJlZT1oYXJkZW4oSlNPTi5wYXJzZShib2R5KSk7XG5yZXN1bHQ9aGFyZGVuKHJldml2ZUZyb21DYXBEYXRhKHJhd1RyZWUpKTtcbiB9XG4vL1xuLy9cbi8vXG5hc3NlcnRQYXNzYWJsZShyZXN1bHQpO1xucmV0dXJuICgvKiAgICAgICAgICAgICAgICAgICAgICAqL3Jlc3VsdCk7XG4gfTtcblxucmV0dXJuIGhhcmRlbih7XG50b0NhcERhdGEsXG5mcm9tQ2FwRGF0YSxcblxuLy9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5zZXJpYWxpemU6dG9DYXBEYXRhLFxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xudW5zZXJpYWxpemU6ZnJvbUNhcERhdGF9KTtcblxuIH07JGjNj19vbmNlLm1ha2VNYXJzaGFsKG1ha2VNYXJzaGFsKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VNYXJzaGFsIjpbIm1ha2VNYXJzaGFsIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMgPMMrLJwAAyycAACUAAABAZW5kby9tYXJzaGFsLXYxLjYuMy9zcmMvcmFua09yZGVyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9lcnJvcnMiLCIuL2VuY29kZVBhc3NhYmxlLmpzIl0sImV4cG9ydHMiOlsiRnVsbFJhbmtDb3ZlciIsImFzc2VydFJhbmtTb3J0ZWQiLCJjb21wYXJhdG9yTWlycm9ySW1hZ2UiLCJjb21wYXJlQW50aVJhbmsiLCJjb21wYXJlUmFuayIsImNvdmVyZWRFbnRyaWVzIiwiZ2V0SW5kZXhDb3ZlciIsImdldFBhc3NTdHlsZUNvdmVyIiwiaW50ZXJzZWN0UmFua0NvdmVycyIsImlzUmFua1NvcnRlZCIsIm1ha2VDb21wYXJhdG9yS2l0IiwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiLCJzb3J0QnlSYW5rIiwidHJpdmlhbENvbXBhcmF0b3IiLCJ1bmlvblJhbmtDb3ZlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBnZXRUYWcscGFzc1N0eWxlT2YsbmFtZUZvclBhc3NhYmxlU3ltYm9sLEZhaWwscSxwYXNzU3R5bGVQcmVmaXhlcyxyZWNvcmROYW1lcyxyZWNvcmRWYWx1ZXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRUYWdcIiwgWyRozY9fYSA9PiAoZ2V0VGFnID0gJGjNj19hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjNj19hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIiwgWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsIFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCIuL2VuY29kZVBhc3NhYmxlLmpzXCIsIFtbXCJwYXNzU3R5bGVQcmVmaXhlc1wiLCBbJGjNj19hID0+IChwYXNzU3R5bGVQcmVmaXhlcyA9ICRozY9fYSldXSxbXCJyZWNvcmROYW1lc1wiLCBbJGjNj19hID0+IChyZWNvcmROYW1lcyA9ICRozY9fYSldXSxbXCJyZWNvcmRWYWx1ZXNcIiwgWyRozY9fYSA9PiAocmVjb3JkVmFsdWVzID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuLypcblxuXG4gKi9cblxuY29uc3R7ZW50cmllcyxmcm9tRW50cmllcyxzZXRQcm90b3R5cGVPZixpc309T2JqZWN0O1xuXG4vKlxuXG5cblxuICovXG5cbi8qXG5cblxuXG4gKi9cblxuLypcblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBzYW1lVmFsdWVaZXJvPSh4LHkpPT54PT09eXx8aXMoeCx5KTtcblxuY29uc3QgICAgICAgIHRyaXZpYWxDb21wYXJhdG9yPShsZWZ0LHJpZ2h0KT0+XG4vL1xubGVmdDxyaWdodD8tMTpsZWZ0PT09cmlnaHQ/MDoxO1xuXG4vKlxuXG4gKi8kaM2PX29uY2UudHJpdmlhbENvbXBhcmF0b3IodHJpdmlhbENvbXBhcmF0b3IpO1xuXG5jb25zdCBwYXNzU3R5bGVSYW5rcz0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuZnJvbUVudHJpZXMoXG5lbnRyaWVzKHBhc3NTdHlsZVByZWZpeGVzKVxuLy9cbi5zb3J0KChbX2xlZnRTdHlsZSxsZWZ0UHJlZml4ZXNdLFtfcmlnaHRTdHlsZSxyaWdodFByZWZpeGVzXSk9PntcbnJldHVybiB0cml2aWFsQ29tcGFyYXRvcihsZWZ0UHJlZml4ZXMscmlnaHRQcmVmaXhlcyk7XG4gfSkuXG5tYXAoKFtwYXNzU3R5bGUscHJlZml4ZXNdLGluZGV4KT0+e1xuLy9cbi8vXG4vL1xucHJlZml4ZXM9PT1bLi4ucHJlZml4ZXNdLnNvcnQoKS5qb2luKCcnKXx8XG5GYWlsIGB1bnNvcnRlZCBwcmVmaXhlcyBmb3IgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfTogJHtxKHByZWZpeGVzKX1gO1xuY29uc3QgY292ZXI9W1xucHJlZml4ZXMuY2hhckF0KDApLFxuU3RyaW5nLmZyb21DaGFyQ29kZShwcmVmaXhlcy5jaGFyQ29kZUF0KHByZWZpeGVzLmxlbmd0aC0xKSsxKV07XG5cbnJldHVybltwYXNzU3R5bGUse2luZGV4LGNvdmVyfV07XG4gfSkpO1xuXG5cbnNldFByb3RvdHlwZU9mKHBhc3NTdHlsZVJhbmtzLG51bGwpO1xuaGFyZGVuKHBhc3NTdHlsZVJhbmtzKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGdldFBhc3NTdHlsZUNvdmVyPShwYXNzU3R5bGUpPT5wYXNzU3R5bGVSYW5rc1twYXNzU3R5bGVdLmNvdmVyOyRozY9fb25jZS5nZXRQYXNzU3R5bGVDb3ZlcihnZXRQYXNzU3R5bGVDb3Zlcik7XG5oYXJkZW4oZ2V0UGFzc1N0eWxlQ292ZXIpO1xuXG4vKlxuXG4gKi9cbmNvbnN0IG1lbW9PZlNvcnRlZD1uZXcgV2Vha01hcCgpO1xuXG4vKlxuXG4gKi9cbmNvbnN0IGNvbXBhcmF0b3JNaXJyb3JJbWFnZXM9bmV3IFdlYWtNYXAoKTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZUNvbXBhcmF0b3JLaXQ9KGNvbXBhcmVSZW1vdGFibGVzPShfeCxfeSk9Pk5hTik9Pntcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBjb21wYXJhdG9yPShsZWZ0LHJpZ2h0KT0+e1xuaWYoc2FtZVZhbHVlWmVybyhsZWZ0LHJpZ2h0KSl7XG5yZXR1cm4gMDtcbiB9XG5jb25zdCBsZWZ0U3R5bGU9cGFzc1N0eWxlT2YobGVmdCk7XG5jb25zdCByaWdodFN0eWxlPXBhc3NTdHlsZU9mKHJpZ2h0KTtcbmlmKGxlZnRTdHlsZSE9PXJpZ2h0U3R5bGUpe1xucmV0dXJuIHRyaXZpYWxDb21wYXJhdG9yKFxucGFzc1N0eWxlUmFua3NbbGVmdFN0eWxlXS5pbmRleCxcbnBhc3NTdHlsZVJhbmtzW3JpZ2h0U3R5bGVdLmluZGV4KTtcblxuIH1cbi8qXG5cbiAgICAgKi9cbnN3aXRjaChsZWZ0U3R5bGUpe1xuY2FzZSdyZW1vdGFibGUnOntcbnJldHVybiBjb21wYXJlUmVtb3RhYmxlcyhsZWZ0LHJpZ2h0KTtcbiB9XG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ251bGwnOlxuY2FzZSdlcnJvcic6XG5jYXNlJ3Byb21pc2UnOntcbi8vXG4vL1xucmV0dXJuIDA7XG4gfVxuY2FzZSdib29sZWFuJzpcbmNhc2UnYmlnaW50JzpcbmNhc2Unc3RyaW5nJzp7XG4vL1xuLy9cbmlmKGxlZnQ8cmlnaHQpe1xucmV0dXJuLTE7XG4gfWVsc2V7XG5hc3NlcnQobGVmdD5yaWdodCk7XG5yZXR1cm4gMTtcbiB9XG4gfVxuY2FzZSdzeW1ib2wnOntcbnJldHVybiBjb21wYXJhdG9yKFxubmFtZUZvclBhc3NhYmxlU3ltYm9sKGxlZnQpLFxubmFtZUZvclBhc3NhYmxlU3ltYm9sKHJpZ2h0KSk7XG5cbiB9XG5jYXNlJ251bWJlcic6e1xuLy9cbmlmKE51bWJlci5pc05hTihsZWZ0KSl7XG5hc3NlcnQoIU51bWJlci5pc05hTihyaWdodCkpO1xucmV0dXJuIDE7XG4gfWVsc2UgaWYoTnVtYmVyLmlzTmFOKHJpZ2h0KSl7XG5yZXR1cm4tMTtcbiB9XG4vL1xuLy9cbmlmKGxlZnQ8cmlnaHQpe1xucmV0dXJuLTE7XG4gfWVsc2V7XG5hc3NlcnQobGVmdD5yaWdodCk7XG5yZXR1cm4gMTtcbiB9XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuLy9cbi8vXG4vL1xuLy9cbi8vXG5jb25zdCBsZWZ0TmFtZXM9cmVjb3JkTmFtZXMobGVmdCk7XG5jb25zdCByaWdodE5hbWVzPXJlY29yZE5hbWVzKHJpZ2h0KTtcblxuY29uc3QgcmVzdWx0PWNvbXBhcmF0b3IobGVmdE5hbWVzLHJpZ2h0TmFtZXMpO1xuaWYocmVzdWx0IT09MCl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbmNvbnN0IGxlZnRWYWx1ZXM9cmVjb3JkVmFsdWVzKGxlZnQsbGVmdE5hbWVzKTtcbmNvbnN0IHJpZ2h0VmFsdWVzPXJlY29yZFZhbHVlcyhyaWdodCxyaWdodE5hbWVzKTtcbnJldHVybiBjb21wYXJhdG9yKGxlZnRWYWx1ZXMscmlnaHRWYWx1ZXMpO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG4vL1xuY29uc3QgbGVuPU1hdGgubWluKGxlZnQubGVuZ3RoLHJpZ2h0Lmxlbmd0aCk7XG5mb3IobGV0IGk9MDtpPGxlbjtpKz0xKXtcbmNvbnN0IHJlc3VsdD1jb21wYXJhdG9yKGxlZnRbaV0scmlnaHRbaV0pO1xuaWYocmVzdWx0IT09MCl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9XG4vL1xuLy9cbnJldHVybiBjb21wYXJhdG9yKGxlZnQubGVuZ3RoLHJpZ2h0Lmxlbmd0aCk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbi8vXG5jb25zdCBsYWJlbENvbXA9Y29tcGFyYXRvcihnZXRUYWcobGVmdCksZ2V0VGFnKHJpZ2h0KSk7XG5pZihsYWJlbENvbXAhPT0wKXtcbnJldHVybiBsYWJlbENvbXA7XG4gfVxucmV0dXJuIGNvbXBhcmF0b3IobGVmdC5wYXlsb2FkLHJpZ2h0LnBheWxvYWQpO1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgVW5yZWNvZ25pemVkIHBhc3NTdHlsZTogJHtxKGxlZnRTdHlsZSl9YDtcbiB9fVxuXG4vKiAgICAgICAgICAgICAgICovXG4gfTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IG91dGVyQ29tcGFyYXRvcj0oeCx5KT0+XG4vL1xuLy9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9jb21wYXJhdG9yKHgseSl8fDA7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBhbnRpQ29tcGFyYXRvcj0oeCx5KT0+b3V0ZXJDb21wYXJhdG9yKHkseCk7XG5cbm1lbW9PZlNvcnRlZC5zZXQob3V0ZXJDb21wYXJhdG9yLG5ldyBXZWFrU2V0KCkpO1xubWVtb09mU29ydGVkLnNldChhbnRpQ29tcGFyYXRvcixuZXcgV2Vha1NldCgpKTtcbmNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuc2V0KG91dGVyQ29tcGFyYXRvcixhbnRpQ29tcGFyYXRvcik7XG5jb21wYXJhdG9yTWlycm9ySW1hZ2VzLnNldChhbnRpQ29tcGFyYXRvcixvdXRlckNvbXBhcmF0b3IpO1xuXG5yZXR1cm4gaGFyZGVuKHtjb21wYXJhdG9yOm91dGVyQ29tcGFyYXRvcixhbnRpQ29tcGFyYXRvcn0pO1xuIH07XG4vKlxuXG5cbiAqLyRozY9fb25jZS5tYWtlQ29tcGFyYXRvcktpdChtYWtlQ29tcGFyYXRvcktpdCk7XG5jb25zdCAgICAgICAgY29tcGFyYXRvck1pcnJvckltYWdlPShjb21wYXJhdG9yKT0+XG5jb21wYXJhdG9yTWlycm9ySW1hZ2VzLmdldChjb21wYXJhdG9yKTtcblxuLypcblxuXG5cbiAqLyRozY9fb25jZS5jb21wYXJhdG9yTWlycm9ySW1hZ2UoY29tcGFyYXRvck1pcnJvckltYWdlKTtcbmNvbnN0ICAgICAgICBpc1JhbmtTb3J0ZWQ9KHBhc3NhYmxlcyxjb21wYXJlKT0+e1xuY29uc3Qgc3ViTWVtb09mU29ydGVkPW1lbW9PZlNvcnRlZC5nZXQoY29tcGFyZSk7XG5hc3NlcnQoc3ViTWVtb09mU29ydGVkIT09dW5kZWZpbmVkKTtcbmlmKHN1Yk1lbW9PZlNvcnRlZC5oYXMocGFzc2FibGVzKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5hc3NlcnQocGFzc1N0eWxlT2YocGFzc2FibGVzKT09PSdjb3B5QXJyYXknKTtcbmZvcihsZXQgaT0xO2k8cGFzc2FibGVzLmxlbmd0aDtpKz0xKXtcbmlmKGNvbXBhcmUocGFzc2FibGVzW2ktMV0scGFzc2FibGVzW2ldKT49MSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cbnN1Yk1lbW9PZlNvcnRlZC5hZGQocGFzc2FibGVzKTtcbnJldHVybiB0cnVlO1xuIH07JGjNj19vbmNlLmlzUmFua1NvcnRlZChpc1JhbmtTb3J0ZWQpO1xuaGFyZGVuKGlzUmFua1NvcnRlZCk7XG5cbi8qXG5cblxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0UmFua1NvcnRlZD0oc29ydGVkLGNvbXBhcmUpPT5cbmlzUmFua1NvcnRlZChzb3J0ZWQsY29tcGFyZSl8fFxuLy9cbi8vXG5GYWlsIGBNdXN0IGJlIHJhbmsgc29ydGVkOiAke3NvcnRlZH0gdnMgJHtzb3J0QnlSYW5rKHNvcnRlZCxjb21wYXJlKX1gOyRozY9fb25jZS5hc3NlcnRSYW5rU29ydGVkKGFzc2VydFJhbmtTb3J0ZWQpO1xuaGFyZGVuKGFzc2VydFJhbmtTb3J0ZWQpO1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBzb3J0QnlSYW5rPShwYXNzYWJsZXMsY29tcGFyZSk9PntcbmlmKEFycmF5LmlzQXJyYXkocGFzc2FibGVzKSl7XG5oYXJkZW4ocGFzc2FibGVzKTtcbi8vXG4vL1xuLy9cbmlmKGlzUmFua1NvcnRlZChwYXNzYWJsZXMsY29tcGFyZSkpe1xucmV0dXJuIHBhc3NhYmxlcztcbiB9XG4gfVxuY29uc3QgdW5zb3J0ZWQ9Wy4uLnBhc3NhYmxlc107XG51bnNvcnRlZC5mb3JFYWNoKGhhcmRlbik7XG5jb25zdCBzb3J0ZWQ9dW5zb3J0ZWQuc29ydChjb21wYXJlKTtcbi8vXG4vL1xuLy9cbmlmKGNvbXBhcmUodHJ1ZSx1bmRlZmluZWQpPjApe1xubGV0IGk9c29ydGVkLmxlbmd0aC0xO1xud2hpbGUoaT49MCYmc29ydGVkW2ldPT09dW5kZWZpbmVkKWktPTE7XG5jb25zdCBuPXNvcnRlZC5sZW5ndGgtaS0xO1xuaWYobj4wJiZuPHNvcnRlZC5sZW5ndGgpe1xuc29ydGVkLmNvcHlXaXRoaW4obiwwKTtcbnNvcnRlZC5maWxsKC8qICAgICAgICAgICAgKi91bmRlZmluZWQsMCxuKTtcbiB9XG4gfVxuaGFyZGVuKHNvcnRlZCk7XG5jb25zdCBzdWJNZW1vT2ZTb3J0ZWQ9bWVtb09mU29ydGVkLmdldChjb21wYXJlKTtcbmFzc2VydChzdWJNZW1vT2ZTb3J0ZWQhPT11bmRlZmluZWQpO1xuc3ViTWVtb09mU29ydGVkLmFkZChzb3J0ZWQpO1xucmV0dXJuIHNvcnRlZDtcbiB9OyRozY9fb25jZS5zb3J0QnlSYW5rKHNvcnRCeVJhbmspO1xuaGFyZGVuKHNvcnRCeVJhbmspO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgcmFua1NlYXJjaD0oc29ydGVkLGNvbXBhcmUsa2V5LGJpYXM9J2xlZnRNb3N0Jyk9PntcbmFzc2VydFJhbmtTb3J0ZWQoc29ydGVkLGNvbXBhcmUpO1xubGV0IGxlZnQ9MDtcbmxldCByaWdodD1zb3J0ZWQubGVuZ3RoO1xud2hpbGUobGVmdDxyaWdodCl7XG5jb25zdCBtPU1hdGguZmxvb3IoKGxlZnQrcmlnaHQpLzIpO1xuY29uc3QgY29tcD1jb21wYXJlKHNvcnRlZFttXSxrZXkpO1xuaWYoY29tcDw9LTF8fGNvbXA9PT0wJiZiaWFzPT09J3JpZ2h0TW9zdCcpe1xubGVmdD1tKzE7XG4gfWVsc2V7XG5hc3NlcnQoY29tcD49MXx8Y29tcD09PTAmJmJpYXM9PT0nbGVmdE1vc3QnKTtcbnJpZ2h0PW07XG4gfVxuIH1cbnJldHVybiBiaWFzPT09J2xlZnRNb3N0Jz9sZWZ0OnJpZ2h0LTE7XG4gfTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCAgICAgICAgZ2V0SW5kZXhDb3Zlcj0oc29ydGVkLGNvbXBhcmUsW2xlZnRLZXkscmlnaHRLZXldKT0+e1xuYXNzZXJ0UmFua1NvcnRlZChzb3J0ZWQsY29tcGFyZSk7XG5jb25zdCBsZWZ0SW5kZXg9cmFua1NlYXJjaChzb3J0ZWQsY29tcGFyZSxsZWZ0S2V5LCdsZWZ0TW9zdCcpO1xuY29uc3QgcmlnaHRJbmRleD1yYW5rU2VhcmNoKHNvcnRlZCxjb21wYXJlLHJpZ2h0S2V5LCdyaWdodE1vc3QnKTtcbnJldHVybltsZWZ0SW5kZXgscmlnaHRJbmRleF07XG4gfTskaM2PX29uY2UuZ2V0SW5kZXhDb3ZlcihnZXRJbmRleENvdmVyKTtcbmhhcmRlbihnZXRJbmRleENvdmVyKTtcblxuLyogICAgICAgICAgICAgICAgICAgICovXG5jb25zdCAgICAgICAgRnVsbFJhbmtDb3Zlcj1oYXJkZW4oWycnLCd7J10pO1xuXG4vKlxuXG5cblxuICovJGjNj19vbmNlLkZ1bGxSYW5rQ292ZXIoRnVsbFJhbmtDb3Zlcik7XG5jb25zdCAgICAgICAgY292ZXJlZEVudHJpZXM9KHNvcnRlZCxbbGVmdEluZGV4LHJpZ2h0SW5kZXhdKT0+e1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgaXRlcmFibGU9aGFyZGVuKHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5sZXQgaT1sZWZ0SW5kZXg7XG5yZXR1cm4gaGFyZGVuKHtcbm5leHQ6KCk9PntcbmlmKGk8PXJpZ2h0SW5kZXgpe1xuY29uc3QgZWxlbWVudD1zb3J0ZWRbaV07XG5pKz0xO1xucmV0dXJuIGhhcmRlbih7dmFsdWU6W2ksZWxlbWVudF0sZG9uZTpmYWxzZX0pO1xuIH1lbHNle1xucmV0dXJuIGhhcmRlbih7dmFsdWU6dW5kZWZpbmVkLGRvbmU6dHJ1ZX0pO1xuIH1cbiB9fSk7XG5cbiB9fSk7XG5cbnJldHVybiBpdGVyYWJsZTtcbiB9OyRozY9fb25jZS5jb3ZlcmVkRW50cmllcyhjb3ZlcmVkRW50cmllcyk7XG5oYXJkZW4oY292ZXJlZEVudHJpZXMpO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWF4UmFuaz0oY29tcGFyZSxhLGIpPT5jb21wYXJlKGEsYik+PTA/YTpiO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWluUmFuaz0oY29tcGFyZSxhLGIpPT5jb21wYXJlKGEsYik8PTA/YTpiO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCAgICAgICAgdW5pb25SYW5rQ292ZXJzPShjb21wYXJlLGNvdmVycyk9Pntcbi8qXG5cblxuXG4gICAqL1xuY29uc3QgdW5pb25SYW5rQ292ZXJQYWlyPShbbGVmdEEscmlnaHRBXSxbbGVmdEIscmlnaHRCXSk9Pltcbm1pblJhbmsoY29tcGFyZSxsZWZ0QSxsZWZ0QiksXG5tYXhSYW5rKGNvbXBhcmUscmlnaHRBLHJpZ2h0QildO1xuXG5yZXR1cm4gY292ZXJzLnJlZHVjZSh1bmlvblJhbmtDb3ZlclBhaXIsWyd7JywnJ10pO1xuIH07JGjNj19vbmNlLnVuaW9uUmFua0NvdmVycyh1bmlvblJhbmtDb3ZlcnMpO1xuaGFyZGVuKHVuaW9uUmFua0NvdmVycyk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBpbnRlcnNlY3RSYW5rQ292ZXJzPShjb21wYXJlLGNvdmVycyk9Pntcbi8qXG5cblxuXG4gICAqL1xuY29uc3QgaW50ZXJzZWN0UmFua0NvdmVyUGFpcj0oW2xlZnRBLHJpZ2h0QV0sW2xlZnRCLHJpZ2h0Ql0pPT5bXG5tYXhSYW5rKGNvbXBhcmUsbGVmdEEsbGVmdEIpLFxubWluUmFuayhjb21wYXJlLHJpZ2h0QSxyaWdodEIpXTtcblxucmV0dXJuIGNvdmVycy5yZWR1Y2UoaW50ZXJzZWN0UmFua0NvdmVyUGFpcixbJycsJ3snXSk7XG4gfTskaM2PX29uY2UuaW50ZXJzZWN0UmFua0NvdmVycyhpbnRlcnNlY3RSYW5rQ292ZXJzKTtcblxuY29uc3QgICAgICAge2NvbXBhcmF0b3I6Y29tcGFyZVJhbmssYW50aUNvbXBhcmF0b3I6Y29tcGFyZUFudGlSYW5rfT1cbm1ha2VDb21wYXJhdG9yS2l0KCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuY29tcGFyZVJhbmsoY29tcGFyZVJhbmspOyRozY9fb25jZS5jb21wYXJlQW50aVJhbmsoY29tcGFyZUFudGlSYW5rKTtcbmNvbnN0ICAgICAgICBtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdD0obG9uZ0xpdmVkPWZhbHNlKT0+e1xubGV0IG51bVNlZW49MDtcbi8vXG4vL1xuLy9cbmNvbnN0IE1hcENvbnN0cnVjdG9yPWxvbmdMaXZlZD9XZWFrTWFwOk1hcDtcbmNvbnN0IHNlZW49bmV3IE1hcENvbnN0cnVjdG9yKCk7XG5jb25zdCB0YWc9KHIpPT57XG5pZihzZWVuLmhhcyhyKSl7XG5yZXR1cm4gc2Vlbi5nZXQocik7XG4gfVxubnVtU2Vlbis9MTtcbnNlZW4uc2V0KHIsbnVtU2Vlbik7XG5yZXR1cm4gbnVtU2VlbjtcbiB9O1xuY29uc3QgY29tcGFyZVJlbW90YWJsZXM9KHgseSk9PmNvbXBhcmVSYW5rKHRhZyh4KSx0YWcoeSkpO1xucmV0dXJuIG1ha2VDb21wYXJhdG9yS2l0KGNvbXBhcmVSZW1vdGFibGVzKTtcbiB9OyRozY9fb25jZS5tYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCk7XG5oYXJkZW4obWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidHJpdmlhbENvbXBhcmF0b3IiOlsidHJpdmlhbENvbXBhcmF0b3IiXSwiZ2V0UGFzc1N0eWxlQ292ZXIiOlsiZ2V0UGFzc1N0eWxlQ292ZXIiXSwibWFrZUNvbXBhcmF0b3JLaXQiOlsibWFrZUNvbXBhcmF0b3JLaXQiXSwiY29tcGFyYXRvck1pcnJvckltYWdlIjpbImNvbXBhcmF0b3JNaXJyb3JJbWFnZSJdLCJpc1JhbmtTb3J0ZWQiOlsiaXNSYW5rU29ydGVkIl0sImFzc2VydFJhbmtTb3J0ZWQiOlsiYXNzZXJ0UmFua1NvcnRlZCJdLCJzb3J0QnlSYW5rIjpbInNvcnRCeVJhbmsiXSwiZ2V0SW5kZXhDb3ZlciI6WyJnZXRJbmRleENvdmVyIl0sIkZ1bGxSYW5rQ292ZXIiOlsiRnVsbFJhbmtDb3ZlciJdLCJjb3ZlcmVkRW50cmllcyI6WyJjb3ZlcmVkRW50cmllcyJdLCJ1bmlvblJhbmtDb3ZlcnMiOlsidW5pb25SYW5rQ292ZXJzIl0sImludGVyc2VjdFJhbmtDb3ZlcnMiOlsiaW50ZXJzZWN0UmFua0NvdmVycyJdLCJjb21wYXJlUmFuayI6WyJjb21wYXJlUmFuayJdLCJjb21wYXJlQW50aVJhbmsiOlsiY29tcGFyZUFudGlSYW5rIl0sIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0IjpbIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAVESyZ5AQAAeQEAACEAAABAZW5kby9tYXJzaGFsLXYxLjYuMy9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRozY9faW1wb3J0cyhbXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAZVGWYogFAACIBQAAHgAAAEBlbmRvL25hdC12NS4wLjE0L3NyYy9pbmRleC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiTmF0IiwiaXNOYXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRozY9faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGlzTmF0LCAnbmFtZScsIHt2YWx1ZTogXCJpc05hdFwifSk7JGjNj19vbmNlLmlzTmF0KGlzTmF0KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoTmF0LCAnbmFtZScsIHt2YWx1ZTogXCJOYXRcIn0pOyRozY9fb25jZS5OYXQoTmF0KTsgICAvL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuLy9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuZnVuY3Rpb24gaXNOYXQoYWxsZWdlZE51bSl7XG5pZih0eXBlb2YgYWxsZWdlZE51bT09PSdiaWdpbnQnKXtcbnJldHVybiBhbGxlZ2VkTnVtPj0wO1xuIH1cbmlmKHR5cGVvZiBhbGxlZ2VkTnVtIT09J251bWJlcicpe1xucmV0dXJuIGZhbHNlO1xuIH1cblxucmV0dXJuIE51bWJlci5pc1NhZmVJbnRlZ2VyKGFsbGVnZWROdW0pJiZhbGxlZ2VkTnVtPj0wO1xuIH1cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmZ1bmN0aW9uIE5hdChhbGxlZ2VkTnVtKXtcbmlmKHR5cGVvZiBhbGxlZ2VkTnVtPT09J2JpZ2ludCcpe1xuaWYoYWxsZWdlZE51bTwwKXtcbnRocm93IFJhbmdlRXJyb3IoIGAke2FsbGVnZWROdW19IGlzIG5lZ2F0aXZlYCk7XG4gfVxucmV0dXJuIGFsbGVnZWROdW07XG4gfVxuXG5pZih0eXBlb2YgYWxsZWdlZE51bT09PSdudW1iZXInKXtcbmlmKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihhbGxlZ2VkTnVtKSl7XG50aHJvdyBSYW5nZUVycm9yKCBgJHthbGxlZ2VkTnVtfSBpcyBub3QgYSBzYWZlIGludGVnZXJgKTtcbiB9XG5pZihhbGxlZ2VkTnVtPDApe1xudGhyb3cgUmFuZ2VFcnJvciggYCR7YWxsZWdlZE51bX0gaXMgbmVnYXRpdmVgKTtcbiB9XG5yZXR1cm4gQmlnSW50KGFsbGVnZWROdW0pO1xuIH1cblxudGhyb3cgVHlwZUVycm9yKFxuIGAke2FsbGVnZWROdW19IGlzIGEgJHt0eXBlb2YgYWxsZWdlZE51bX0gYnV0IG11c3QgYmUgYSBiaWdpbnQgb3IgYSBudW1iZXJgKTtcblxuIH1cbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzTmF0IjpbImlzTmF0Il0sIk5hdCI6WyJOYXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAYIWHCG4KAABuCgAAIAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC44L2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2l0ZXItaGVscGVycy5qcyIsIi4vc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9zcmMvZXJyb3IuanMiLCIuL3NyYy9yZW1vdGFibGUuanMiLCIuL3NyYy9zeW1ib2wuanMiLCIuL3NyYy9zdHJpbmcuanMiLCIuL3NyYy9wYXNzU3R5bGVPZi5qcyIsIi4vc3JjL21ha2VUYWdnZWQuanMiLCIuL3NyYy9tYWtlLWZhci5qcyIsIi4vc3JjL3R5cGVHdWFyZHMuanMiLCIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJleHBvcnRzIjpbIkZhciIsIkZhciIsImFzc2VydENvcHlBcnJheSIsImFzc2VydENvcHlBcnJheSIsImFzc2VydFdlbGxGb3JtZWRTdHJpbmciLCJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIiwiZmlsdGVySXRlcmFibGUiLCJmaWx0ZXJJdGVyYWJsZSIsImlzRXJyb3JMaWtlIiwiaXNFcnJvckxpa2UiLCJpc09iamVjdCIsImlzT2JqZWN0IiwiaXNQYXNzYWJsZSIsImlzUGFzc2FibGUiLCJpc1Bhc3NhYmxlU3ltYm9sIiwiaXNQYXNzYWJsZVN5bWJvbCIsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbIi4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2l0ZXItaGVscGVycy5qc1wiLCBbXV0sW1wiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW11dLFtcIi4vc3JjL2Vycm9yLmpzXCIsIFtdXSxbXCIuL3NyYy9yZW1vdGFibGUuanNcIiwgW11dLFtcIi4vc3JjL3N5bWJvbC5qc1wiLCBbXV0sW1wiLi9zcmMvc3RyaW5nLmpzXCIsIFtdXSxbXCIuL3NyYy9wYXNzU3R5bGVPZi5qc1wiLCBbXV0sW1wiLi9zcmMvbWFrZVRhZ2dlZC5qc1wiLCBbXV0sW1wiLi9zcmMvbWFrZS1mYXIuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVHdWFyZHMuanNcIiwgW11dLFtcIi4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9pdGVyLWhlbHBlcnMuanMiOltbIm1hcEl0ZXJhYmxlIiwibWFwSXRlcmFibGUiXSxbImZpbHRlckl0ZXJhYmxlIiwiZmlsdGVySXRlcmFibGUiXV0sIi4vc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIjpbWyJQQVNTX1NUWUxFIiwiUEFTU19TVFlMRSJdLFsiaXNPYmplY3QiLCJpc09iamVjdCJdLFsiYXNzZXJ0Q2hlY2tlciIsImFzc2VydENoZWNrZXIiXSxbImdldFRhZyIsImdldFRhZyJdLFsiaGFzT3duUHJvcGVydHlPZiIsImhhc093blByb3BlcnR5T2YiXV0sIi4vc3JjL2Vycm9yLmpzIjpbWyJnZXRFcnJvckNvbnN0cnVjdG9yIiwiZ2V0RXJyb3JDb25zdHJ1Y3RvciJdLFsiaXNFcnJvckxpa2UiLCJpc0Vycm9yTGlrZSJdXSwiLi9zcmMvcmVtb3RhYmxlLmpzIjpbWyJnZXRJbnRlcmZhY2VPZiIsImdldEludGVyZmFjZU9mIl1dLCIuL3NyYy9zeW1ib2wuanMiOltbImFzc2VydFBhc3NhYmxlU3ltYm9sIiwiYXNzZXJ0UGFzc2FibGVTeW1ib2wiXSxbImlzUGFzc2FibGVTeW1ib2wiLCJpc1Bhc3NhYmxlU3ltYm9sIl0sWyJuYW1lRm9yUGFzc2FibGVTeW1ib2wiLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiXSxbInBhc3NhYmxlU3ltYm9sRm9yTmFtZSIsInBhc3NhYmxlU3ltYm9sRm9yTmFtZSJdXSwiLi9zcmMvc3RyaW5nLmpzIjpbWyJpc1dlbGxGb3JtZWRTdHJpbmciLCJpc1dlbGxGb3JtZWRTdHJpbmciXSxbImFzc2VydFdlbGxGb3JtZWRTdHJpbmciLCJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIl0sWyJhc3NlcnRQYXNzYWJsZVN0cmluZyIsImFzc2VydFBhc3NhYmxlU3RyaW5nIl1dLCIuL3NyYy9wYXNzU3R5bGVPZi5qcyI6W1sicGFzc1N0eWxlT2YiLCJwYXNzU3R5bGVPZiJdLFsiaXNQYXNzYWJsZSIsImlzUGFzc2FibGUiXSxbImFzc2VydFBhc3NhYmxlIiwiYXNzZXJ0UGFzc2FibGUiXSxbInRvUGFzc2FibGVFcnJvciIsInRvUGFzc2FibGVFcnJvciJdLFsidG9UaHJvd2FibGUiLCJ0b1Rocm93YWJsZSJdXSwiLi9zcmMvbWFrZVRhZ2dlZC5qcyI6W1sibWFrZVRhZ2dlZCIsIm1ha2VUYWdnZWQiXV0sIi4vc3JjL21ha2UtZmFyLmpzIjpbWyJSZW1vdGFibGUiLCJSZW1vdGFibGUiXSxbIkZhciIsIkZhciJdLFsiVG9GYXJGdW5jdGlvbiIsIlRvRmFyRnVuY3Rpb24iXSxbIkdFVF9NRVRIT0RfTkFNRVMiLCJHRVRfTUVUSE9EX05BTUVTIl1dLCIuL3NyYy90eXBlR3VhcmRzLmpzIjpbWyJhc3NlcnRSZWNvcmQiLCJhc3NlcnRSZWNvcmQiXSxbImFzc2VydENvcHlBcnJheSIsImFzc2VydENvcHlBcnJheSJdLFsiYXNzZXJ0UmVtb3RhYmxlIiwiYXNzZXJ0UmVtb3RhYmxlIl0sWyJpc1JlbW90YWJsZSIsImlzUmVtb3RhYmxlIl0sWyJpc1JlY29yZCIsImlzUmVjb3JkIl0sWyJpc0NvcHlBcnJheSIsImlzQ29weUFycmF5Il1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACaj+JhgwYAAIMGAAAoAAAAQGVuZG8vcGFzcy1zdHlsZS12MS40Ljgvc3JjL2NvcHlBcnJheS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiQ29weUFycmF5SGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgWCxhc3NlcnRDaGVja2VyLGdldE93bkRhdGFEZXNjcmlwdG9yOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsIFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiZ2V0T3duRGF0YURlc2NyaXB0b3JcIiwgWyRozY9fYSA9PiAoZ2V0T3duRGF0YURlc2NyaXB0b3IgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5jb25zdHtnZXRQcm90b3R5cGVPZn09T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXkscHJvdG90eXBlOmFycmF5UHJvdG90eXBlfT1BcnJheTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgY2FuQmVWYWxpZD0oY2FuZGlkYXRlLGNoZWNrPXVuZGVmaW5lZCk9PlxuaXNBcnJheShjYW5kaWRhdGUpfHxcbiEhY2hlY2smJmNoZWNrKGZhbHNlLFggYEFycmF5IGV4cGVjdGVkOiAke2NhbmRpZGF0ZX1gKTtcblxuLypcblxuXG4gKi9cbmNvbnN0ICAgICAgICBDb3B5QXJyYXlIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZTonY29weUFycmF5JyxcblxuY2FuQmVWYWxpZCxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSxwYXNzU3R5bGVPZlJlY3VyKT0+e1xuY2FuQmVWYWxpZChjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlcik7XG5nZXRQcm90b3R5cGVPZihjYW5kaWRhdGUpPT09YXJyYXlQcm90b3R5cGV8fFxuYXNzZXJ0LmZhaWwoWCBgTWFsZm9ybWVkIGFycmF5OiAke2NhbmRpZGF0ZX1gLFR5cGVFcnJvcik7XG4vL1xuLy9cbmNvbnN0IGxlbj0vKiAgICAgICAgICAgICAgICAgKi9cbmdldE93bkRhdGFEZXNjcmlwdG9yKGNhbmRpZGF0ZSwnbGVuZ3RoJyxmYWxzZSxhc3NlcnRDaGVja2VyKS52YWx1ZTtcblxuLy9cbi8vXG5mb3IobGV0IGk9MDtpPGxlbjtpKz0xKXtcbnBhc3NTdHlsZU9mUmVjdXIoXG5nZXRPd25EYXRhRGVzY3JpcHRvcihjYW5kaWRhdGUsaSx0cnVlLGFzc2VydENoZWNrZXIpLnZhbHVlKTtcblxuIH1cbi8vXG5vd25LZXlzKGNhbmRpZGF0ZSkubGVuZ3RoPT09bGVuKzF8fFxuYXNzZXJ0LmZhaWwoWCBgQXJyYXlzIG11c3Qgbm90IGhhdmUgbm9uLWluZGV4ZXM6ICR7Y2FuZGlkYXRlfWAsVHlwZUVycm9yKTtcbiB9fSk7JGjNj19vbmNlLkNvcHlBcnJheUhlbHBlcihDb3B5QXJyYXlIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ29weUFycmF5SGVscGVyIjpbIkNvcHlBcnJheUhlbHBlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC2O8a8WAgAAFgIAAApAAAAQGVuZG8vcGFzcy1zdHlsZS12MS40Ljgvc3JjL2NvcHlSZWNvcmQuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIkNvcHlSZWNvcmRIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBhc3NlcnRDaGVja2VyLGNhbkJlTWV0aG9kLGdldE93bkRhdGFEZXNjcmlwdG9yLENYOyRozY9faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcImNhbkJlTWV0aG9kXCIsIFskaM2PX2EgPT4gKGNhbkJlTWV0aG9kID0gJGjNj19hKV1dLFtcImdldE93bkRhdGFEZXNjcmlwdG9yXCIsIFskaM2PX2EgPT4gKGdldE93bkRhdGFEZXNjcmlwdG9yID0gJGjNj19hKV1dLFtcIkNYXCIsIFskaM2PX2EgPT4gKENYID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2dldFByb3RvdHlwZU9mLHByb3RvdHlwZTpvYmplY3RQcm90b3R5cGV9PU9iamVjdDtcblxuLypcblxuXG4gKi9cbmNvbnN0IGNoZWNrT2JqZWN0UHJvdG90eXBlPShjYW5kaWRhdGUsY2hlY2s9dW5kZWZpbmVkKT0+e1xucmV0dXJuKFxuZ2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKT09PW9iamVjdFByb3RvdHlwZXx8XG4hIWNoZWNrJiZcbkNYKGNoZWNrKSBgUmVjb3JkcyBtdXN0IGluaGVyaXQgZnJvbSBPYmplY3QucHJvdG90eXBlOiAke2NhbmRpZGF0ZX1gKTtcblxuIH07XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgY2hlY2tQcm9wZXJ0eUNhbkJlVmFsaWQ9KGNhbmRpZGF0ZSxrZXksdmFsdWUsY2hlY2s9dW5kZWZpbmVkKT0+e1xucmV0dXJuKFxuKHR5cGVvZiBrZXk9PT0nc3RyaW5nJ3x8XG4hIWNoZWNrJiZcbkNYKFxuY2hlY2spXG4gYFJlY29yZHMgY2FuIG9ubHkgaGF2ZSBzdHJpbmctbmFtZWQgcHJvcGVydGllczogJHtjYW5kaWRhdGV9YCkmJihcbiFjYW5CZU1ldGhvZCh2YWx1ZSl8fFxuISFjaGVjayYmXG4vL1xuQ1goXG5jaGVjaylcbiBgUmVjb3JkcyBjYW5ub3QgY29udGFpbiBub24tZmFyIGZ1bmN0aW9ucyBiZWNhdXNlIHRoZXkgbWF5IGJlIG1ldGhvZHMgb2YgYW4gaW1wbGljaXQgUmVtb3RhYmxlOiAke2NhbmRpZGF0ZX1gKSk7XG5cbiB9O1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgICAgICAgIENvcHlSZWNvcmRIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZTonY29weVJlY29yZCcsXG5cbmNhbkJlVmFsaWQ6KGNhbmRpZGF0ZSxjaGVjaz11bmRlZmluZWQpPT57XG5yZXR1cm4oXG5jaGVja09iamVjdFByb3RvdHlwZShjYW5kaWRhdGUsY2hlY2spJiZcbi8vXG4vL1xub3duS2V5cyhjYW5kaWRhdGUpLmV2ZXJ5KChrZXkpPT5cbmNoZWNrUHJvcGVydHlDYW5CZVZhbGlkKGNhbmRpZGF0ZSxrZXksY2FuZGlkYXRlW2tleV0sY2hlY2spKSk7XG5cblxuIH0sXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUscGFzc1N0eWxlT2ZSZWN1cik9PntcbmNoZWNrT2JqZWN0UHJvdG90eXBlKGNhbmRpZGF0ZSxhc3NlcnRDaGVja2VyKTtcblxuLy9cbi8vXG5mb3IoY29uc3QgbmFtZSBvZiBvd25LZXlzKGNhbmRpZGF0ZSkpe1xuY29uc3R7dmFsdWV9PWdldE93bkRhdGFEZXNjcmlwdG9yKFxuY2FuZGlkYXRlLFxubmFtZSxcbnRydWUsXG5hc3NlcnRDaGVja2VyKTtcblxuY2hlY2tQcm9wZXJ0eUNhbkJlVmFsaWQoY2FuZGlkYXRlLG5hbWUsdmFsdWUsYXNzZXJ0Q2hlY2tlcik7XG5wYXNzU3R5bGVPZlJlY3VyKHZhbHVlKTtcbiB9XG4gfX0pOyRozY9fb25jZS5Db3B5UmVjb3JkSGVscGVyKENvcHlSZWNvcmRIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ29weVJlY29yZEhlbHBlciI6WyJDb3B5UmVjb3JkSGVscGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEeE+i+FCgAAhQoAAC4AAABAZW5kby9wYXNzLXN0eWxlLXYxLjQuOC9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9wcm9taXNlLWtpdCIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL3Bhc3NTdHlsZU9mLmpzIiwiLi9tYWtlVGFnZ2VkLmpzIl0sImV4cG9ydHMiOlsiZGVlcGx5RnVsZmlsbGVkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgWCxxLEUsaXNQcm9taXNlLGdldFRhZyxpc09iamVjdCxwYXNzU3R5bGVPZixtYWtlVGFnZ2VkOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsIFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wicVwiLCBbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLCBbJGjNj19hID0+IChpc1Byb21pc2UgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJnZXRUYWdcIiwgWyRozY9fYSA9PiAoZ2V0VGFnID0gJGjNj19hKV1dLFtcImlzT2JqZWN0XCIsIFskaM2PX2EgPT4gKGlzT2JqZWN0ID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV1dXSxbXCIuL21ha2VUYWdnZWQuanNcIiwgW1tcIm1ha2VUYWdnZWRcIiwgWyRozY9fYSA9PiAobWFrZVRhZ2dlZCA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG4vKlxuXG4gKi9cblxuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2Zyb21FbnRyaWVzfT1PYmplY3Q7XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGRlZXBseUZ1bGZpbGxlZD1hc3luYyh2YWwpPT57XG4vL1xuLy9cbi8vXG5cbmlmKCFpc09iamVjdCh2YWwpKXtcbnJldHVybiAoLyogICAgICAgICAgICAgICAgICAgICAgICAgICAqL3ZhbCk7XG4gfVxuaWYoaXNQcm9taXNlKHZhbCkpe1xucmV0dXJuIEUud2hlbih2YWwsKG5vbnApPT5kZWVwbHlGdWxmaWxsZWQobm9ucCkpO1xuIH1cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZih2YWwpO1xuc3dpdGNoKHBhc3NTdHlsZSl7XG5jYXNlJ2NvcHlSZWNvcmQnOntcbmNvbnN0IHJlYz0vKiAgICAgICAgICAgICAgICAgICAgICovdmFsO1xuY29uc3QgbmFtZXM9LyogICAgICAgICAgICAgICAgICAgKi9vd25LZXlzKHJlYyk7XG5jb25zdCB2YWxQcz1uYW1lcy5tYXAoKG5hbWUpPT5kZWVwbHlGdWxmaWxsZWQocmVjW25hbWVdKSk7XG4vL1xucmV0dXJuIEUud2hlbihQcm9taXNlLmFsbCh2YWxQcyksKHZhbHMpPT5cbmhhcmRlbihmcm9tRW50cmllcyh2YWxzLm1hcCgoYyxpKT0+W25hbWVzW2ldLGNdKSkpKTtcblxuIH1cbmNhc2UnY29weUFycmF5Jzp7XG5jb25zdCBhcnI9LyogICAgICAgICAgICAgICAgICAgICovdmFsO1xuY29uc3QgdmFsUHM9YXJyLm1hcCgocCk9PmRlZXBseUZ1bGZpbGxlZChwKSk7XG4vL1xucmV0dXJuIEUud2hlbihQcm9taXNlLmFsbCh2YWxQcyksKHZhbHMpPT5oYXJkZW4odmFscykpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdCB0Z2Q9LyogICAgICAgICAgICAgICAgICAgICAqL3ZhbDtcbmNvbnN0IHRhZz1nZXRUYWcodGdkKTtcbi8vXG5yZXR1cm4gRS53aGVuKGRlZXBseUZ1bGZpbGxlZCh0Z2QucGF5bG9hZCksKHBheWxvYWQpPT5cbm1ha2VUYWdnZWQodGFnLHBheWxvYWQpKTtcblxuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG5jb25zdCByZW09LyogICAgICAgICAgICAgICAgICAgICAgICAgICovdmFsO1xuLy9cbnJldHVybiByZW07XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3QgZXJyPS8qICAgICAgICAgICAgICAgICovdmFsO1xuLy9cbnJldHVybiBlcnI7XG4gfVxuY2FzZSdwcm9taXNlJzp7XG5jb25zdCBwcm9tPS8qICAgICAgICAgICAgICAgICAgKi8gLyogICAgICAgICAgICAgICAgICAqL3ZhbDtcbnJldHVybiBFLndoZW4ocHJvbSwobm9ucCk9PmRlZXBseUZ1bGZpbGxlZChub25wKSk7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBhc3NlcnQuZmFpbChYIGBVbmV4cGVjdGVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX1gLFR5cGVFcnJvcik7XG4gfX1cblxuIH07JGjNj19vbmNlLmRlZXBseUZ1bGZpbGxlZChkZWVwbHlGdWxmaWxsZWQpO1xuaGFyZGVuKGRlZXBseUZ1bGZpbGxlZCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWVwbHlGdWxmaWxsZWQiOlsiZGVlcGx5RnVsZmlsbGVkIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAL5g42NjEgAAYxIAACQAAABAZW5kby9wYXNzLXN0eWxlLXYxLjQuOC9zcmMvZXJyb3IuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIkVycm9ySGVscGVyIiwiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IiLCJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyIsImdldEVycm9yQ29uc3RydWN0b3IiLCJpc0Vycm9yTGlrZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IHEsYXNzZXJ0Q2hlY2tlcixDWDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLCBbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcIkNYXCIsIFskaM2PX2EgPT4gKENYID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdHtnZXRQcm90b3R5cGVPZixnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLGhhc093bixlbnRyaWVzfT1PYmplY3Q7XG5cbi8vXG4vL1xuY29uc3QgZXJyb3JDb25zdHJ1Y3RvcnM9bmV3IE1hcChcbi8vXG4vL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5bXG5bJ0Vycm9yJyxFcnJvcl0sXG5bJ0V2YWxFcnJvcicsRXZhbEVycm9yXSxcblsnUmFuZ2VFcnJvcicsUmFuZ2VFcnJvcl0sXG5bJ1JlZmVyZW5jZUVycm9yJyxSZWZlcmVuY2VFcnJvcl0sXG5bJ1N5bnRheEVycm9yJyxTeW50YXhFcnJvcl0sXG5bJ1R5cGVFcnJvcicsVHlwZUVycm9yXSxcblsnVVJJRXJyb3InLFVSSUVycm9yXVxuXG4vL1xuLy9cbi8vXG4vL1xuXSk7XG5cblxuaWYodHlwZW9mIEFnZ3JlZ2F0ZUVycm9yIT09J3VuZGVmaW5lZCcpe1xuLy9cbmVycm9yQ29uc3RydWN0b3JzLnNldCgnQWdncmVnYXRlRXJyb3InLEFnZ3JlZ2F0ZUVycm9yKTtcbiB9XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgZ2V0RXJyb3JDb25zdHJ1Y3Rvcj0obmFtZSk9PmVycm9yQ29uc3RydWN0b3JzLmdldChuYW1lKTskaM2PX29uY2UuZ2V0RXJyb3JDb25zdHJ1Y3RvcihnZXRFcnJvckNvbnN0cnVjdG9yKTtcbmhhcmRlbihnZXRFcnJvckNvbnN0cnVjdG9yKTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgY2hlY2tFcnJvckxpa2U9KGNhbmRpZGF0ZSxjaGVjaz11bmRlZmluZWQpPT57XG4vL1xucmV0dXJuKFxuY2FuZGlkYXRlIGluc3RhbmNlb2YgRXJyb3J8fFxuISFjaGVjayYmQ1goY2hlY2spIGBFcnJvciBleHBlY3RlZDogJHtjYW5kaWRhdGV9YCk7XG5cbiB9O1xuaGFyZGVuKGNoZWNrRXJyb3JMaWtlKTtcbi8vXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGlzRXJyb3JMaWtlPShjYW5kaWRhdGUpPT5jaGVja0Vycm9yTGlrZShjYW5kaWRhdGUpOyRozY9fb25jZS5pc0Vycm9yTGlrZShpc0Vycm9yTGlrZSk7XG5oYXJkZW4oaXNFcnJvckxpa2UpO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjPShcbnByb3BOYW1lLFxuZGVzYyxcbnBhc3NTdHlsZU9mUmVjdXIsXG5jaGVjaz11bmRlZmluZWQpPT5cbntcbmlmKGRlc2MuZW51bWVyYWJsZSl7XG5yZXR1cm4oXG4hIWNoZWNrJiZcbkNYKGNoZWNrKSBgUGFzc2FibGUgRXJyb3IgJHtxKFxucHJvcE5hbWUpXG4gfSBvd24gcHJvcGVydHkgbXVzdCBub3QgYmUgZW51bWVyYWJsZTogJHtkZXNjfWApO1xuXG4gfVxuaWYoIWhhc093bihkZXNjLCd2YWx1ZScpKXtcbnJldHVybihcbiEhY2hlY2smJlxuQ1goY2hlY2spIGBQYXNzYWJsZSBFcnJvciAke3EoXG5wcm9wTmFtZSlcbiB9IG93biBwcm9wZXJ0eSBtdXN0IGJlIGEgZGF0YSBwcm9wZXJ0eTogJHtkZXNjfWApO1xuXG4gfVxuY29uc3R7dmFsdWV9PWRlc2M7XG5zd2l0Y2gocHJvcE5hbWUpe1xuY2FzZSdtZXNzYWdlJzpcbmNhc2Unc3RhY2snOntcbnJldHVybihcbnR5cGVvZiB2YWx1ZT09PSdzdHJpbmcnfHxcbiEhY2hlY2smJlxuQ1goY2hlY2spIGBQYXNzYWJsZSBFcnJvciAke3EoXG5wcm9wTmFtZSlcbiB9IG93biBwcm9wZXJ0eSBtdXN0IGJlIGEgc3RyaW5nOiAke3ZhbHVlfWApO1xuXG4gfVxuY2FzZSdjYXVzZSc6e1xuLy9cbnJldHVybiBjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcih2YWx1ZSxwYXNzU3R5bGVPZlJlY3VyLGNoZWNrKTtcbiB9XG5jYXNlJ2Vycm9ycyc6e1xuaWYoIUFycmF5LmlzQXJyYXkodmFsdWUpfHxwYXNzU3R5bGVPZlJlY3VyKHZhbHVlKSE9PSdjb3B5QXJyYXknKXtcbnJldHVybihcbiEhY2hlY2smJlxuQ1goY2hlY2spIGBQYXNzYWJsZSBFcnJvciAke3EoXG5wcm9wTmFtZSlcbiB9IG93biBwcm9wZXJ0eSBtdXN0IGJlIGEgY29weUFycmF5OiAke3ZhbHVlfWApO1xuXG4gfVxucmV0dXJuIHZhbHVlLmV2ZXJ5KChlcnIpPT5cbi8vXG5jaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcihlcnIscGFzc1N0eWxlT2ZSZWN1cixjaGVjaykpO1xuXG4gfVxuZGVmYXVsdDp7XG5icmVhaztcbiB9fVxuXG5yZXR1cm4oXG4hIWNoZWNrJiZcbkNYKGNoZWNrKSBgUGFzc2FibGUgRXJyb3IgaGFzIGV4dHJhIHVucGFzc2VkIHByb3BlcnR5ICR7cShwcm9wTmFtZSl9YCk7XG5cbiB9OyRozY9fb25jZS5jaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyhjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyk7XG5oYXJkZW4oY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MpO1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcj0oXG5jYW5kaWRhdGUsXG5wYXNzU3R5bGVPZlJlY3VyLFxuY2hlY2s9dW5kZWZpbmVkKT0+XG57XG5pZighY2hlY2tFcnJvckxpa2UoY2FuZGlkYXRlLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3QgcHJvdG89Z2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKTtcbmNvbnN0e25hbWV9PXByb3RvO1xuY29uc3QgZXJyQ29uc3RydWN0b3I9Z2V0RXJyb3JDb25zdHJ1Y3RvcihuYW1lKTtcbmlmKGVyckNvbnN0cnVjdG9yPT09dW5kZWZpbmVkfHxlcnJDb25zdHJ1Y3Rvci5wcm90b3R5cGUhPT1wcm90byl7XG5yZXR1cm4oXG4hIWNoZWNrJiZcbkNYKFxuY2hlY2spXG4gYFBhc3NhYmxlIEVycm9yIG11c3QgaW5oZXJpdCBmcm9tIGFuIGVycm9yIGNsYXNzIC5wcm90b3R5cGU6ICR7Y2FuZGlkYXRlfWApO1xuXG4gfVxuY29uc3QgZGVzY3M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xuaWYoISgnbWVzc2FnZSdpbiBkZXNjcykpe1xucmV0dXJuKFxuISFjaGVjayYmXG5DWChcbmNoZWNrKVxuIGBQYXNzYWJsZSBFcnJvciBtdXN0IGhhdmUgYW4gb3duIFwibWVzc2FnZVwiIHN0cmluZyBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YCk7XG5cbiB9XG5cbnJldHVybiBlbnRyaWVzKGRlc2NzKS5ldmVyeSgoW3Byb3BOYW1lLGRlc2NdKT0+XG5jaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyhcbnByb3BOYW1lLFxuZGVzYyxcbnBhc3NTdHlsZU9mUmVjdXIsXG5jaGVjaykpO1xuXG5cbiB9OyRozY9fb25jZS5jaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcihjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcik7XG5oYXJkZW4oY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IpO1xuXG4vKlxuXG4gKi9cbmNvbnN0ICAgICAgICBFcnJvckhlbHBlcj1oYXJkZW4oe1xuc3R5bGVOYW1lOidlcnJvcicsXG5cbmNhbkJlVmFsaWQ6Y2hlY2tFcnJvckxpa2UsXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUscGFzc1N0eWxlT2ZSZWN1cik9PlxuY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IoY2FuZGlkYXRlLHBhc3NTdHlsZU9mUmVjdXIsYXNzZXJ0Q2hlY2tlcil9KTskaM2PX29uY2UuRXJyb3JIZWxwZXIoRXJyb3JIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0RXJyb3JDb25zdHJ1Y3RvciI6WyJnZXRFcnJvckNvbnN0cnVjdG9yIl0sImlzRXJyb3JMaWtlIjpbImlzRXJyb3JMaWtlIl0sImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjIjpbImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjIl0sImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yIjpbImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yIl0sIkVycm9ySGVscGVyIjpbIkVycm9ySGVscGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACbmmAG+BQAAvgUAACsAAABAZW5kby9wYXNzLXN0eWxlLXYxLjQuOC9zcmMvaXRlci1oZWxwZXJzLmpzeyJpbXBvcnRzIjpbIi4vbWFrZS1mYXIuanMiXSwiZXhwb3J0cyI6WyJmaWx0ZXJJdGVyYWJsZSIsIm1hcEl0ZXJhYmxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgRmFyOyRozY9faW1wb3J0cyhbW1wiLi9tYWtlLWZhci5qc1wiLCBbW1wiRmFyXCIsIFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dXSk7ICAgXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBtYXBJdGVyYWJsZT0oYmFzZUl0ZXJhYmxlLGZ1bmMpPT5cbi8qICAgICAgICAgICAgICAgICAgICAgICovXG5GYXIoJ21hcHBlZCBpdGVyYWJsZScse1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PntcbmNvbnN0IGJhc2VJdGVyYXRvcj1iYXNlSXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSgpO1xucmV0dXJuIEZhcignbWFwcGVkIGl0ZXJhdG9yJyx7XG5uZXh0OigpPT57XG5jb25zdHt2YWx1ZTpiYXNlVmFsdWUsZG9uZX09YmFzZUl0ZXJhdG9yLm5leHQoKTtcbmNvbnN0IHZhbHVlPWRvbmU/YmFzZVZhbHVlOmZ1bmMoYmFzZVZhbHVlKTtcbnJldHVybiBoYXJkZW4oe3ZhbHVlLGRvbmV9KTtcbiB9fSk7XG5cbiB9fSk7JGjNj19vbmNlLm1hcEl0ZXJhYmxlKG1hcEl0ZXJhYmxlKTtcblxuaGFyZGVuKG1hcEl0ZXJhYmxlKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGZpbHRlckl0ZXJhYmxlPShiYXNlSXRlcmFibGUscHJlZCk9PlxuLyogICAgICAgICAgICAgICAgICAgICAgKi9cbkZhcignZmlsdGVyZWQgaXRlcmFibGUnLHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5jb25zdCBiYXNlSXRlcmF0b3I9YmFzZUl0ZXJhYmxlW1N5bWJvbC5pdGVyYXRvcl0oKTtcbnJldHVybiBGYXIoJ2ZpbHRlcmVkIGl0ZXJhdG9yJyx7XG5uZXh0OigpPT57XG5mb3IoOzspe1xuY29uc3QgcmVzdWx0PWJhc2VJdGVyYXRvci5uZXh0KCk7XG5jb25zdHt2YWx1ZSxkb25lfT1yZXN1bHQ7XG5pZihkb25lfHxwcmVkKHZhbHVlKSl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9XG4gfX0pO1xuXG4gfX0pOyRozY9fb25jZS5maWx0ZXJJdGVyYWJsZShmaWx0ZXJJdGVyYWJsZSk7XG5cbmhhcmRlbihmaWx0ZXJJdGVyYWJsZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYXBJdGVyYWJsZSI6WyJtYXBJdGVyYWJsZSJdLCJmaWx0ZXJJdGVyYWJsZSI6WyJmaWx0ZXJJdGVyYWJsZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAJVM1gcBEAAHARAAAnAAAAQGVuZG8vcGFzcy1zdHlsZS12MS40Ljgvc3JjL21ha2UtZmFyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanMiLCJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9yZW1vdGFibGUuanMiXSwiZXhwb3J0cyI6WyJGYXIiLCJHRVRfTUVUSE9EX05BTUVTIiwiUmVtb3RhYmxlIiwiVG9GYXJGdW5jdGlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IGdldE1ldGhvZE5hbWVzLHEsRmFpbCxhc3NlcnRDaGVja2VyLFBBU1NfU1RZTEUsYXNzZXJ0SWZhY2UsZ2V0SW50ZXJmYWNlT2YsUmVtb3RhYmxlSGVscGVyOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qc1wiLCBbW1wiZ2V0TWV0aG9kTmFtZXNcIiwgWyRozY9fYSA9PiAoZ2V0TWV0aG9kTmFtZXMgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIiwgWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsIFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiUEFTU19TVFlMRVwiLCBbJGjNj19hID0+IChQQVNTX1NUWUxFID0gJGjNj19hKV1dXV0sW1wiLi9yZW1vdGFibGUuanNcIiwgW1tcImFzc2VydElmYWNlXCIsIFskaM2PX2EgPT4gKGFzc2VydElmYWNlID0gJGjNj19hKV1dLFtcImdldEludGVyZmFjZU9mXCIsIFskaM2PX2EgPT4gKGdldEludGVyZmFjZU9mID0gJGjNj19hKV1dLFtcIlJlbW90YWJsZUhlbHBlclwiLCBbJGjNj19hID0+IChSZW1vdGFibGVIZWxwZXIgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuY29uc3R7cHJvdG90eXBlOmZ1bmN0aW9uUHJvdG90eXBlfT1GdW5jdGlvbjtcbmNvbnN0e1xuZ2V0UHJvdG90eXBlT2YsXG5zZXRQcm90b3R5cGVPZixcbmNyZWF0ZSxcbmlzRnJvemVuLFxucHJvdG90eXBlOm9iamVjdFByb3RvdHlwZX09XG5PYmplY3Q7XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZVJlbW90YWJsZVByb3RvPShyZW1vdGFibGUsaWZhY2UpPT57XG5sZXQgb2xkUHJvdG89Z2V0UHJvdG90eXBlT2YocmVtb3RhYmxlKTtcbmlmKHR5cGVvZiByZW1vdGFibGU9PT0nb2JqZWN0Jyl7XG5pZihvbGRQcm90bz09PW51bGwpe1xub2xkUHJvdG89b2JqZWN0UHJvdG90eXBlO1xuIH1cbm9sZFByb3RvPT09b2JqZWN0UHJvdG90eXBlfHxcbkZhaWwgYEZvciBub3csIHJlbW90YWJsZXMgY2Fubm90IGluaGVyaXQgZnJvbSBhbnl0aGluZyB1bnVzdWFsLCBpbiAke3JlbW90YWJsZX1gO1xuIH1lbHNlIGlmKHR5cGVvZiByZW1vdGFibGU9PT0nZnVuY3Rpb24nKXtcbm9sZFByb3RvIT09bnVsbHx8XG5GYWlsIGBPcmlnaW5hbCBmdW5jdGlvbiBtdXN0IG5vdCBpbmhlcml0IGZyb20gbnVsbDogJHtyZW1vdGFibGV9YDtcbm9sZFByb3RvPT09ZnVuY3Rpb25Qcm90b3R5cGV8fFxuZ2V0UHJvdG90eXBlT2Yob2xkUHJvdG8pPT09ZnVuY3Rpb25Qcm90b3R5cGV8fFxuRmFpbCBgRmFyIGZ1bmN0aW9ucyBtdXN0IG9yaWdpbmFsbHkgaW5oZXJpdCBmcm9tIEZ1bmN0aW9uLnByb3RvdHlwZSwgaW4gJHtyZW1vdGFibGV9YDtcbiB9ZWxzZXtcbkZhaWwgYHVucmVjb2duaXplZCB0eXBlb2YgJHtyZW1vdGFibGV9YDtcbiB9XG5yZXR1cm4gaGFyZGVuKFxuY3JlYXRlKG9sZFByb3RvLHtcbltQQVNTX1NUWUxFXTp7dmFsdWU6J3JlbW90YWJsZSd9LFxuW1N5bWJvbC50b1N0cmluZ1RhZ106e3ZhbHVlOmlmYWNlfX0pKTtcblxuXG4gfTtcblxuY29uc3QgYXNzZXJ0Q2FuQmVSZW1vdGFibGU9KGNhbmRpZGF0ZSk9PlxuUmVtb3RhYmxlSGVscGVyLmNhbkJlVmFsaWQoY2FuZGlkYXRlLGFzc2VydENoZWNrZXIpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgUmVtb3RhYmxlPShcbi8vXG5pZmFjZT0nUmVtb3RhYmxlJyxcbnByb3BzPXVuZGVmaW5lZCxcbnJlbW90YWJsZT0vKiAgICAgICAgICAgICove30pPT5cbntcbmFzc2VydElmYWNlKGlmYWNlKTtcbmFzc2VydChpZmFjZSk7XG4vL1xuLy9cbnByb3BzPT09dW5kZWZpbmVkfHxGYWlsIGBSZW1vdGFibGUgcHJvcHMgbm90IHlldCBpbXBsZW1lbnRlZCAke3Byb3BzfWA7XG5cbi8vXG5hc3NlcnRDYW5CZVJlbW90YWJsZShyZW1vdGFibGUpO1xuXG4vL1xuIShQQVNTX1NUWUxFIGluIHJlbW90YWJsZSl8fFxuRmFpbCBgUmVtb3RhYmxlICR7cmVtb3RhYmxlfSBpcyBhbHJlYWR5IG1hcmtlZCBhcyBhICR7cShcbnJlbW90YWJsZVtQQVNTX1NUWUxFXSlcbiB9YDtcbi8vXG4vL1xuLy9cbi8vXG4vL1xuaGFyZGVuLmlzRmFrZXx8XG4vL1xuIWlzRnJvemVuKHJlbW90YWJsZSl8fFxuRmFpbCBgUmVtb3RhYmxlICR7cmVtb3RhYmxlfSBpcyBhbHJlYWR5IGZyb3plbmA7XG5jb25zdCByZW1vdGFibGVQcm90bz1tYWtlUmVtb3RhYmxlUHJvdG8ocmVtb3RhYmxlLGlmYWNlKTtcblxuLy9cbi8vXG5jb25zdCBtdXRhdGVIYXJkZW5BbmRDaGVjaz0odGFyZ2V0KT0+e1xuLy9cbnNldFByb3RvdHlwZU9mKHRhcmdldCxyZW1vdGFibGVQcm90byk7XG5oYXJkZW4odGFyZ2V0KTtcbmFzc2VydENhbkJlUmVtb3RhYmxlKHRhcmdldCk7XG4gfTtcblxuLy9cbm11dGF0ZUhhcmRlbkFuZENoZWNrKHt9KTtcblxuLy9cbm11dGF0ZUhhcmRlbkFuZENoZWNrKHJlbW90YWJsZSk7XG5cbi8vXG4vL1xuYXNzZXJ0KGlmYWNlIT09dW5kZWZpbmVkKTsvL1xucmV0dXJuICgvKiAgICAgICAgICAgICAgKi9yZW1vdGFibGUpO1xuIH07JGjNj19vbmNlLlJlbW90YWJsZShSZW1vdGFibGUpO1xuaGFyZGVuKFJlbW90YWJsZSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBHRVRfTUVUSE9EX05BTUVTPSdfX2dldE1ldGhvZE5hbWVzX18nO1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UuR0VUX01FVEhPRF9OQU1FUyhHRVRfTUVUSE9EX05BTUVTKTtcbmNvbnN0IGdldE1ldGhvZE5hbWVzTWV0aG9kPWhhcmRlbih7XG5bR0VUX01FVEhPRF9OQU1FU10oKXtcbnJldHVybiBnZXRNZXRob2ROYW1lcyh0aGlzKTtcbiB9fSlbXG5HRVRfTUVUSE9EX05BTUVTXTtcblxuY29uc3QgZ2V0TWV0aG9kTmFtZXNEZXNjcmlwdG9yPWhhcmRlbih7XG52YWx1ZTpnZXRNZXRob2ROYW1lc01ldGhvZCxcbmVudW1lcmFibGU6ZmFsc2UsXG5jb25maWd1cmFibGU6ZmFsc2UsXG53cml0YWJsZTpmYWxzZX0pO1xuXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBGYXI9KGZhck5hbWUscmVtb3RhYmxlPXVuZGVmaW5lZCk9PntcbmNvbnN0IHI9cmVtb3RhYmxlPT09dW5kZWZpbmVkPy8qICAgICAgICAgICAgKi97fTpyZW1vdGFibGU7XG5pZih0eXBlb2Ygcj09PSdvYmplY3QnJiYhKEdFVF9NRVRIT0RfTkFNRVMgaW4gcikpe1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLEdFVF9NRVRIT0RfTkFNRVMsZ2V0TWV0aG9kTmFtZXNEZXNjcmlwdG9yKTtcbiB9XG5yZXR1cm4gUmVtb3RhYmxlKCBgQWxsZWdlZDogJHtmYXJOYW1lfWAsdW5kZWZpbmVkLHIpO1xuIH07JGjNj19vbmNlLkZhcihGYXIpO1xuaGFyZGVuKEZhcik7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBUb0ZhckZ1bmN0aW9uPShmYXJOYW1lLGZ1bmMpPT57XG5pZihnZXRJbnRlcmZhY2VPZihmdW5jKSE9PXVuZGVmaW5lZCl7XG4vL1xucmV0dXJuIGZ1bmM7XG4gfVxuLy9cbnJldHVybiBGYXIoZmFyTmFtZSwoLi4uYXJncyk9PmZ1bmMoLi4uYXJncykpO1xuIH07JGjNj19vbmNlLlRvRmFyRnVuY3Rpb24oVG9GYXJGdW5jdGlvbik7XG5oYXJkZW4oVG9GYXJGdW5jdGlvbik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJSZW1vdGFibGUiOlsiUmVtb3RhYmxlIl0sIkdFVF9NRVRIT0RfTkFNRVMiOlsiR0VUX01FVEhPRF9OQU1FUyJdLCJGYXIiOlsiRmFyIl0sIlRvRmFyRnVuY3Rpb24iOlsiVG9GYXJGdW5jdGlvbiJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABIzbEwrwQAAK8EAAApAAAAQGVuZG8vcGFzcy1zdHlsZS12MS40Ljgvc3JjL21ha2VUYWdnZWQuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vcGFzc1N0eWxlT2YuanMiXSwiZXhwb3J0cyI6WyJtYWtlVGFnZ2VkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgRmFpbCxQQVNTX1NUWUxFLGFzc2VydFBhc3NhYmxlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsIFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJQQVNTX1NUWUxFXCIsIFskaM2PX2EgPT4gKFBBU1NfU1RZTEUgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVwiLCBbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuY29uc3R7Y3JlYXRlLHByb3RvdHlwZTpvYmplY3RQcm90b3R5cGV9PU9iamVjdDtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlVGFnZ2VkPSh0YWcscGF5bG9hZCk9PntcbnR5cGVvZiB0YWc9PT0nc3RyaW5nJ3x8XG5GYWlsIGBUaGUgdGFnIG9mIGEgdGFnZ2VkIHJlY29yZCBtdXN0IGJlIGEgc3RyaW5nOiAke3RhZ31gO1xuYXNzZXJ0UGFzc2FibGUoaGFyZGVuKHBheWxvYWQpKTtcbnJldHVybiBoYXJkZW4oXG5jcmVhdGUob2JqZWN0UHJvdG90eXBlLHtcbltQQVNTX1NUWUxFXTp7dmFsdWU6J3RhZ2dlZCd9LFxuW1N5bWJvbC50b1N0cmluZ1RhZ106e3ZhbHVlOnRhZ30sXG5wYXlsb2FkOnt2YWx1ZTpwYXlsb2FkLGVudW1lcmFibGU6dHJ1ZX19KSk7XG5cblxuIH07JGjNj19vbmNlLm1ha2VUYWdnZWQobWFrZVRhZ2dlZCk7XG5oYXJkZW4obWFrZVRhZ2dlZCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlVGFnZ2VkIjpbIm1ha2VUYWdnZWQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAR6bO6kMVAABDFQAAMAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC44L3NyYy9wYXNzU3R5bGUtaGVscGVycy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJDWCIsIlBBU1NfU1RZTEUiLCJhc3NlcnRDaGVja2VyIiwiY2FuQmVNZXRob2QiLCJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIiwiY2hlY2tQYXNzU3R5bGUiLCJjaGVja1RhZ1JlY29yZCIsImdldE93bkRhdGFEZXNjcmlwdG9yIiwiZ2V0VGFnIiwiaGFzT3duUHJvcGVydHlPZiIsImlzT2JqZWN0IiwiaXNUeXBlZEFycmF5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgWCxxOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsIFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wicVwiLCBbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7cHJvdG90eXBlOmZ1bmN0aW9uUHJvdG90eXBlfT1GdW5jdGlvbjtcbmNvbnN0e1xuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuZ2V0UHJvdG90eXBlT2YsXG5oYXNPd25Qcm9wZXJ0eTpvYmplY3RIYXNPd25Qcm9wZXJ0eSxcbmlzRnJvemVuLFxucHJvdG90eXBlOm9iamVjdFByb3RvdHlwZX09XG5PYmplY3Q7XG5jb25zdHthcHBseX09UmVmbGVjdDtcbmNvbnN0e3RvU3RyaW5nVGFnOnRvU3RyaW5nVGFnU3ltYm9sfT1TeW1ib2w7XG5cbmNvbnN0IHR5cGVkQXJyYXlQcm90b3R5cGU9Z2V0UHJvdG90eXBlT2YoVWludDhBcnJheS5wcm90b3R5cGUpO1xuY29uc3QgdHlwZWRBcnJheVRvU3RyaW5nVGFnRGVzYz1nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG50eXBlZEFycmF5UHJvdG90eXBlLFxudG9TdHJpbmdUYWdTeW1ib2wpO1xuXG5hc3NlcnQodHlwZWRBcnJheVRvU3RyaW5nVGFnRGVzYyk7XG5jb25zdCBnZXRUeXBlZEFycmF5VG9TdHJpbmdUYWc9dHlwZWRBcnJheVRvU3RyaW5nVGFnRGVzYy5nZXQ7XG5hc3NlcnQodHlwZW9mIGdldFR5cGVkQXJyYXlUb1N0cmluZ1RhZz09PSdmdW5jdGlvbicpO1xuXG5jb25zdCAgICAgICAgaGFzT3duUHJvcGVydHlPZj0ob2JqLHByb3ApPT5cbmFwcGx5KG9iamVjdEhhc093blByb3BlcnR5LG9iaixbcHJvcF0pOyRozY9fb25jZS5oYXNPd25Qcm9wZXJ0eU9mKGhhc093blByb3BlcnR5T2YpO1xuaGFyZGVuKGhhc093blByb3BlcnR5T2YpO1xuXG4vL1xuY29uc3QgICAgICAgIGlzT2JqZWN0PSh2YWwpPT5PYmplY3QodmFsKT09PXZhbDskaM2PX29uY2UuaXNPYmplY3QoaXNPYmplY3QpO1xuaGFyZGVuKGlzT2JqZWN0KTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGlzVHlwZWRBcnJheT0ob2JqZWN0KT0+e1xuLy9cbmNvbnN0IHRhZz1hcHBseShnZXRUeXBlZEFycmF5VG9TdHJpbmdUYWcsb2JqZWN0LFtdKTtcbnJldHVybiB0YWchPT11bmRlZmluZWQ7XG4gfTskaM2PX29uY2UuaXNUeXBlZEFycmF5KGlzVHlwZWRBcnJheSk7XG5oYXJkZW4oaXNUeXBlZEFycmF5KTtcblxuY29uc3QgICAgICAgIFBBU1NfU1RZTEU9U3ltYm9sLmZvcigncGFzc1N0eWxlJyk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLlBBU1NfU1RZTEUoUEFTU19TVFlMRSk7XG5jb25zdCAgICAgICAgY2FuQmVNZXRob2Q9KGZ1bmMpPT5cbnR5cGVvZiBmdW5jPT09J2Z1bmN0aW9uJyYmIShQQVNTX1NUWUxFIGluIGZ1bmMpOyRozY9fb25jZS5jYW5CZU1ldGhvZChjYW5CZU1ldGhvZCk7XG5oYXJkZW4oY2FuQmVNZXRob2QpO1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0Q2hlY2tlcj0oY29uZCxkZXRhaWxzKT0+e1xuYXNzZXJ0KGNvbmQsZGV0YWlscyk7XG5yZXR1cm4gdHJ1ZTtcbiB9OyRozY9fb25jZS5hc3NlcnRDaGVja2VyKGFzc2VydENoZWNrZXIpO1xuaGFyZGVuKGFzc2VydENoZWNrZXIpO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBDWD0oY2hlY2spPT57XG5jb25zdCByZWplY3Q9KFQsLi4uc3Vicyk9PmNoZWNrKGZhbHNlLFgoVCwuLi5zdWJzKSk7XG5yZXR1cm4gcmVqZWN0O1xuIH07JGjNj19vbmNlLkNYKENYKTtcbmhhcmRlbihDWCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgZ2V0T3duRGF0YURlc2NyaXB0b3I9KFxuY2FuZGlkYXRlLFxucHJvcE5hbWUsXG5zaG91bGRCZUVudW1lcmFibGUsXG5jaGVjayk9Plxue1xuY29uc3QgZGVzYz0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjYW5kaWRhdGUscHJvcE5hbWUpO1xuXG5yZXR1cm4oZGVzYyE9PXVuZGVmaW5lZHx8XG4hIWNoZWNrJiZDWChjaGVjaykgYCR7cShwcm9wTmFtZSl9IHByb3BlcnR5IGV4cGVjdGVkOiAke2NhbmRpZGF0ZX1gKSYmKFxuaGFzT3duUHJvcGVydHlPZihkZXNjLCd2YWx1ZScpfHxcbiEhY2hlY2smJlxuQ1goXG5jaGVjaylcbiBgJHtxKHByb3BOYW1lKX0gbXVzdCBub3QgYmUgYW4gYWNjZXNzb3IgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWApJiYoXG5zaG91bGRCZUVudW1lcmFibGU/XG5kZXNjLmVudW1lcmFibGV8fFxuISFjaGVjayYmXG5DWChcbmNoZWNrKVxuIGAke3EocHJvcE5hbWUpfSBtdXN0IGJlIGFuIGVudW1lcmFibGUgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWA6XG4hZGVzYy5lbnVtZXJhYmxlfHxcbiEhY2hlY2smJlxuQ1goXG5jaGVjaylcbiBgJHtxKHByb3BOYW1lKX0gbXVzdCBub3QgYmUgYW4gZW51bWVyYWJsZSBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YCk/XG5kZXNjOlxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIC8qICAgICAgICAgICAgICAgICAgKi91bmRlZmluZWQ7XG4gfTskaM2PX29uY2UuZ2V0T3duRGF0YURlc2NyaXB0b3IoZ2V0T3duRGF0YURlc2NyaXB0b3IpO1xuaGFyZGVuKGdldE93bkRhdGFEZXNjcmlwdG9yKTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGdldFRhZz0odGFnUmVjb3JkKT0+dGFnUmVjb3JkW1N5bWJvbC50b1N0cmluZ1RhZ107JGjNj19vbmNlLmdldFRhZyhnZXRUYWcpO1xuaGFyZGVuKGdldFRhZyk7XG5cbmNvbnN0ICAgICAgICBjaGVja1Bhc3NTdHlsZT0ob2JqLHBhc3NTdHlsZSxleHBlY3RlZFBhc3NTdHlsZSxjaGVjayk9PntcbnJldHVybihcbnBhc3NTdHlsZT09PWV4cGVjdGVkUGFzc1N0eWxlfHxcbiEhY2hlY2smJlxuQ1goY2hlY2spIGBFeHBlY3RlZCAke3EoZXhwZWN0ZWRQYXNzU3R5bGUpfSwgbm90ICR7cShwYXNzU3R5bGUpfTogJHtvYmp9YCk7XG5cbiB9OyRozY9fb25jZS5jaGVja1Bhc3NTdHlsZShjaGVja1Bhc3NTdHlsZSk7XG5oYXJkZW4oY2hlY2tQYXNzU3R5bGUpO1xuXG5jb25zdCBtYWtlQ2hlY2tUYWdSZWNvcmQ9KGNoZWNrUHJvdG8pPT57XG4vKlxuXG5cblxuXG4gICAqL1xuY29uc3QgY2hlY2tUYWdSZWNvcmQ9KHRhZ1JlY29yZCxleHBlY3RlZFBhc3NTdHlsZSxjaGVjayk9PntcbnJldHVybihcbihpc09iamVjdCh0YWdSZWNvcmQpfHxcbiEhY2hlY2smJlxuQ1goY2hlY2spIGBBIG5vbi1vYmplY3QgY2Fubm90IGJlIGEgdGFnUmVjb3JkOiAke3RhZ1JlY29yZH1gKSYmKFxuaXNGcm96ZW4odGFnUmVjb3JkKXx8XG4hIWNoZWNrJiZDWChjaGVjaykgYEEgdGFnUmVjb3JkIG11c3QgYmUgZnJvemVuOiAke3RhZ1JlY29yZH1gKSYmKFxuIWlzQXJyYXkodGFnUmVjb3JkKXx8XG4hIWNoZWNrJiZDWChjaGVjaykgYEFuIGFycmF5IGNhbm5vdCBiZSBhIHRhZ1JlY29yZDogJHt0YWdSZWNvcmR9YCkmJlxuY2hlY2tQYXNzU3R5bGUoXG50YWdSZWNvcmQsXG5nZXRPd25EYXRhRGVzY3JpcHRvcih0YWdSZWNvcmQsUEFTU19TVFlMRSxmYWxzZSxjaGVjaykudmFsdWUsXG5leHBlY3RlZFBhc3NTdHlsZSxcbmNoZWNrKSYmKFxuXG50eXBlb2YgZ2V0T3duRGF0YURlc2NyaXB0b3IodGFnUmVjb3JkLFN5bWJvbC50b1N0cmluZ1RhZyxmYWxzZSxjaGVjaykuXG52YWx1ZT09PSdzdHJpbmcnfHxcbiEhY2hlY2smJlxuQ1goXG5jaGVjaylcbiBgQSBbU3ltYm9sLnRvU3RyaW5nVGFnXS1uYW1lZCBwcm9wZXJ0eSBtdXN0IGJlIGEgc3RyaW5nOiAke3RhZ1JlY29yZH1gKSYmXG5jaGVja1Byb3RvKHRhZ1JlY29yZCxnZXRQcm90b3R5cGVPZih0YWdSZWNvcmQpLGNoZWNrKSk7XG5cbiB9O1xucmV0dXJuIGhhcmRlbihjaGVja1RhZ1JlY29yZCk7XG4gfTtcblxuY29uc3QgICAgICAgIGNoZWNrVGFnUmVjb3JkPW1ha2VDaGVja1RhZ1JlY29yZChcbih2YWwscHJvdG8sY2hlY2spPT5cbnByb3RvPT09b2JqZWN0UHJvdG90eXBlfHxcbiEhY2hlY2smJlxuY2hlY2soZmFsc2UsWCBgQSB0YWdSZWNvcmQgbXVzdCBpbmhlcml0IGZyb20gT2JqZWN0LnByb3RvdHlwZTogJHt2YWx9YCkpOyRozY9fb25jZS5jaGVja1RhZ1JlY29yZChjaGVja1RhZ1JlY29yZCk7XG5cbmhhcmRlbihjaGVja1RhZ1JlY29yZCk7XG5cbmNvbnN0ICAgICAgICBjaGVja0Z1bmN0aW9uVGFnUmVjb3JkPW1ha2VDaGVja1RhZ1JlY29yZChcbih2YWwscHJvdG8sY2hlY2spPT5cbnByb3RvPT09ZnVuY3Rpb25Qcm90b3R5cGV8fFxucHJvdG8hPT1udWxsJiZnZXRQcm90b3R5cGVPZihwcm90byk9PT1mdW5jdGlvblByb3RvdHlwZXx8XG4hIWNoZWNrJiZcbmNoZWNrKFxuZmFsc2UsXG5YIGBGb3IgZnVuY3Rpb25zLCBhIHRhZ1JlY29yZCBtdXN0IGluaGVyaXQgZnJvbSBGdW5jdGlvbi5wcm90b3R5cGU6ICR7dmFsfWApKTskaM2PX29uY2UuY2hlY2tGdW5jdGlvblRhZ1JlY29yZChjaGVja0Z1bmN0aW9uVGFnUmVjb3JkKTtcblxuXG5oYXJkZW4oY2hlY2tGdW5jdGlvblRhZ1JlY29yZCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJoYXNPd25Qcm9wZXJ0eU9mIjpbImhhc093blByb3BlcnR5T2YiXSwiaXNPYmplY3QiOlsiaXNPYmplY3QiXSwiaXNUeXBlZEFycmF5IjpbImlzVHlwZWRBcnJheSJdLCJQQVNTX1NUWUxFIjpbIlBBU1NfU1RZTEUiXSwiY2FuQmVNZXRob2QiOlsiY2FuQmVNZXRob2QiXSwiYXNzZXJ0Q2hlY2tlciI6WyJhc3NlcnRDaGVja2VyIl0sIkNYIjpbIkNYIl0sImdldE93bkRhdGFEZXNjcmlwdG9yIjpbImdldE93bkRhdGFEZXNjcmlwdG9yIl0sImdldFRhZyI6WyJnZXRUYWciXSwiY2hlY2tQYXNzU3R5bGUiOlsiY2hlY2tQYXNzU3R5bGUiXSwiY2hlY2tUYWdSZWNvcmQiOlsiY2hlY2tUYWdSZWNvcmQiXSwiY2hlY2tGdW5jdGlvblRhZ1JlY29yZCI6WyJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAENt1cnfJAAA3yQAACoAAABAZW5kby9wYXNzLXN0eWxlLXYxLjQuOC9zcmMvcGFzc1N0eWxlT2YuanN7ImltcG9ydHMiOlsiQGVuZG8vcHJvbWlzZS1raXQiLCJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9jb3B5QXJyYXkuanMiLCIuL2NvcHlSZWNvcmQuanMiLCIuL3RhZ2dlZC5qcyIsIi4vZXJyb3IuanMiLCIuL3JlbW90YWJsZS5qcyIsIi4vc3ltYm9sLmpzIiwiLi9zYWZlLXByb21pc2UuanMiLCIuL3N0cmluZy5qcyJdLCJleHBvcnRzIjpbIlBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sIiwiYXNzZXJ0UGFzc2FibGUiLCJpc1Bhc3NhYmxlIiwicGFzc1N0eWxlT2YiLCJ0b1Bhc3NhYmxlRXJyb3IiLCJ0b1Rocm93YWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IGlzUHJvbWlzZSxYLEZhaWwscSxhbm5vdGF0ZUVycm9yLG1ha2VFcnJvcixpc09iamVjdCxpc1R5cGVkQXJyYXksUEFTU19TVFlMRSxDb3B5QXJyYXlIZWxwZXIsQ29weVJlY29yZEhlbHBlcixUYWdnZWRIZWxwZXIsRXJyb3JIZWxwZXIsY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MsY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IsZ2V0RXJyb3JDb25zdHJ1Y3Rvcixpc0Vycm9yTGlrZSxSZW1vdGFibGVIZWxwZXIsYXNzZXJ0UGFzc2FibGVTeW1ib2wsYXNzZXJ0U2FmZVByb21pc2UsYXNzZXJ0UGFzc2FibGVTdHJpbmc7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsIFskaM2PX2EgPT4gKGlzUHJvbWlzZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLCBbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIkZhaWxcIiwgWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsIFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiYW5ub3RhdGVFcnJvclwiLCBbJGjNj19hID0+IChhbm5vdGF0ZUVycm9yID0gJGjNj19hKV1dLFtcIm1ha2VFcnJvclwiLCBbJGjNj19hID0+IChtYWtlRXJyb3IgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJpc09iamVjdFwiLCBbJGjNj19hID0+IChpc09iamVjdCA9ICRozY9fYSldXSxbXCJpc1R5cGVkQXJyYXlcIiwgWyRozY9fYSA9PiAoaXNUeXBlZEFycmF5ID0gJGjNj19hKV1dLFtcIlBBU1NfU1RZTEVcIiwgWyRozY9fYSA9PiAoUEFTU19TVFlMRSA9ICRozY9fYSldXV1dLFtcIi4vY29weUFycmF5LmpzXCIsIFtbXCJDb3B5QXJyYXlIZWxwZXJcIiwgWyRozY9fYSA9PiAoQ29weUFycmF5SGVscGVyID0gJGjNj19hKV1dXV0sW1wiLi9jb3B5UmVjb3JkLmpzXCIsIFtbXCJDb3B5UmVjb3JkSGVscGVyXCIsIFskaM2PX2EgPT4gKENvcHlSZWNvcmRIZWxwZXIgPSAkaM2PX2EpXV1dXSxbXCIuL3RhZ2dlZC5qc1wiLCBbW1wiVGFnZ2VkSGVscGVyXCIsIFskaM2PX2EgPT4gKFRhZ2dlZEhlbHBlciA9ICRozY9fYSldXV1dLFtcIi4vZXJyb3IuanNcIiwgW1tcIkVycm9ySGVscGVyXCIsIFskaM2PX2EgPT4gKEVycm9ySGVscGVyID0gJGjNj19hKV1dLFtcImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjXCIsIFskaM2PX2EgPT4gKGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjID0gJGjNj19hKV1dLFtcImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yXCIsIFskaM2PX2EgPT4gKGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yID0gJGjNj19hKV1dLFtcImdldEVycm9yQ29uc3RydWN0b3JcIiwgWyRozY9fYSA9PiAoZ2V0RXJyb3JDb25zdHJ1Y3RvciA9ICRozY9fYSldXSxbXCJpc0Vycm9yTGlrZVwiLCBbJGjNj19hID0+IChpc0Vycm9yTGlrZSA9ICRozY9fYSldXV1dLFtcIi4vcmVtb3RhYmxlLmpzXCIsIFtbXCJSZW1vdGFibGVIZWxwZXJcIiwgWyRozY9fYSA9PiAoUmVtb3RhYmxlSGVscGVyID0gJGjNj19hKV1dXV0sW1wiLi9zeW1ib2wuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsIFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlU3ltYm9sID0gJGjNj19hKV1dXV0sW1wiLi9zYWZlLXByb21pc2UuanNcIiwgW1tcImFzc2VydFNhZmVQcm9taXNlXCIsIFskaM2PX2EgPT4gKGFzc2VydFNhZmVQcm9taXNlID0gJGjNj19hKV1dXV0sW1wiLi9zdHJpbmcuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlU3RyaW5nXCIsIFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlU3RyaW5nID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNGcm96ZW4sZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyx2YWx1ZXN9PU9iamVjdDtcblxuLypcblxuXG4gKi9cblxuY29uc3QgbWFrZUhlbHBlclRhYmxlPShwYXNzU3R5bGVIZWxwZXJzKT0+e1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBIZWxwZXJUYWJsZT17XG5fX3Byb3RvX186bnVsbCxcbmNvcHlBcnJheTp1bmRlZmluZWQsXG5jb3B5UmVjb3JkOnVuZGVmaW5lZCxcbnRhZ2dlZDp1bmRlZmluZWQsXG5lcnJvcjp1bmRlZmluZWQsXG5yZW1vdGFibGU6dW5kZWZpbmVkfTtcblxuZm9yKGNvbnN0IGhlbHBlciBvZiBwYXNzU3R5bGVIZWxwZXJzKXtcbmNvbnN0e3N0eWxlTmFtZX09aGVscGVyO1xuc3R5bGVOYW1lIGluIEhlbHBlclRhYmxlfHxGYWlsIGBVbnJlY29nbml6ZWQgaGVscGVyOiAke3Eoc3R5bGVOYW1lKX1gO1xuSGVscGVyVGFibGVbc3R5bGVOYW1lXT09PXVuZGVmaW5lZHx8XG5GYWlsIGBjb25mbGljdGluZyBoZWxwZXJzIGZvciAke3Eoc3R5bGVOYW1lKX1gO1xuSGVscGVyVGFibGVbc3R5bGVOYW1lXT1oZWxwZXI7XG4gfVxuZm9yKGNvbnN0IHN0eWxlTmFtZSBvZiBvd25LZXlzKEhlbHBlclRhYmxlKSl7XG5IZWxwZXJUYWJsZVtzdHlsZU5hbWVdIT09dW5kZWZpbmVkfHxcbkZhaWwgYG1pc3NpbmcgaGVscGVyIGZvciAke3Eoc3R5bGVOYW1lKX1gO1xuIH1cblxucmV0dXJuIGhhcmRlbihIZWxwZXJUYWJsZSk7XG4gfTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VQYXNzU3R5bGVPZj0ocGFzc1N0eWxlSGVscGVycyk9PntcbmNvbnN0IEhlbHBlclRhYmxlPW1ha2VIZWxwZXJUYWJsZShwYXNzU3R5bGVIZWxwZXJzKTtcbmNvbnN0IHJlbW90YWJsZUhlbHBlcj1IZWxwZXJUYWJsZS5yZW1vdGFibGU7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbmNvbnN0IHBhc3NTdHlsZU1lbW89bmV3IFdlYWtNYXAoKTtcblxuLypcblxuICAgKi9cbi8vXG5jb25zdCBwYXNzU3R5bGVPZj0ocGFzc2FibGUpPT57XG4vL1xuLy9cbi8vXG5jb25zdCBpblByb2dyZXNzPW5ldyBTZXQoKTtcblxuY29uc3QgcGFzc1N0eWxlT2ZSZWN1cj0oaW5uZXIpPT57XG5jb25zdCBpbm5lcklzT2JqZWN0PWlzT2JqZWN0KGlubmVyKTtcbmlmKGlubmVySXNPYmplY3Qpe1xuY29uc3QgaW5uZXJTdHlsZT1wYXNzU3R5bGVNZW1vLmdldChpbm5lcik7XG5pZihpbm5lclN0eWxlKXtcbnJldHVybiBpbm5lclN0eWxlO1xuIH1cbiFpblByb2dyZXNzLmhhcyhpbm5lcil8fFxuRmFpbCBgUGFzcy1ieS1jb3B5IGRhdGEgY2Fubm90IGJlIGN5Y2xpYyAke2lubmVyfWA7XG5pblByb2dyZXNzLmFkZChpbm5lcik7XG4gfVxuLy9cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZkludGVybmFsKGlubmVyKTtcbmlmKGlubmVySXNPYmplY3Qpe1xucGFzc1N0eWxlTWVtby5zZXQoaW5uZXIscGFzc1N0eWxlKTtcbmluUHJvZ3Jlc3MuZGVsZXRlKGlubmVyKTtcbiB9XG5yZXR1cm4gcGFzc1N0eWxlO1xuIH07XG5cbmNvbnN0IHBhc3NTdHlsZU9mSW50ZXJuYWw9KGlubmVyKT0+e1xuY29uc3QgdHlwZXN0cj10eXBlb2YgaW5uZXI7XG5zd2l0Y2godHlwZXN0cil7XG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdudW1iZXInOlxuY2FzZSdiaWdpbnQnOntcbnJldHVybiB0eXBlc3RyO1xuIH1cbmNhc2Unc3RyaW5nJzp7XG5hc3NlcnRQYXNzYWJsZVN0cmluZyhpbm5lcik7XG5yZXR1cm4nc3RyaW5nJztcbiB9XG5jYXNlJ3N5bWJvbCc6e1xuYXNzZXJ0UGFzc2FibGVTeW1ib2woaW5uZXIpO1xucmV0dXJuJ3N5bWJvbCc7XG4gfVxuY2FzZSdvYmplY3QnOntcbmlmKGlubmVyPT09bnVsbCl7XG5yZXR1cm4nbnVsbCc7XG4gfVxuaWYoIWlzRnJvemVuKGlubmVyKSl7XG5hc3NlcnQuZmFpbChcbi8vXG4vL1xuaXNUeXBlZEFycmF5KGlubmVyKT9cblggYENhbm5vdCBwYXNzIG11dGFibGUgdHlwZWQgYXJyYXlzIGxpa2UgJHtpbm5lcn0uYDpcblggYENhbm5vdCBwYXNzIG5vbi1mcm96ZW4gb2JqZWN0cyBsaWtlICR7aW5uZXJ9LiBVc2UgaGFyZGVuKClgKTtcblxuIH1cbmlmKGlzUHJvbWlzZShpbm5lcikpe1xuYXNzZXJ0U2FmZVByb21pc2UoaW5uZXIpO1xucmV0dXJuJ3Byb21pc2UnO1xuIH1cbnR5cGVvZiBpbm5lci50aGVuIT09J2Z1bmN0aW9uJ3x8XG5GYWlsIGBDYW5ub3QgcGFzcyBub24tcHJvbWlzZSB0aGVuYWJsZXNgO1xuY29uc3QgcGFzc1N0eWxlVGFnPWlubmVyW1BBU1NfU1RZTEVdO1xuaWYocGFzc1N0eWxlVGFnIT09dW5kZWZpbmVkKXtcbmFzc2VydC50eXBlb2YocGFzc1N0eWxlVGFnLCdzdHJpbmcnKTtcbmNvbnN0IGhlbHBlcj1IZWxwZXJUYWJsZVtwYXNzU3R5bGVUYWddO1xuaGVscGVyIT09dW5kZWZpbmVkfHxcbkZhaWwgYFVucmVjb2duaXplZCBQYXNzU3R5bGU6ICR7cShwYXNzU3R5bGVUYWcpfWA7XG5oZWxwZXIuYXNzZXJ0VmFsaWQoaW5uZXIscGFzc1N0eWxlT2ZSZWN1cik7XG5yZXR1cm4gKC8qICAgICAgICAgICAgICAgICAgICAqL3Bhc3NTdHlsZVRhZyk7XG4gfVxuZm9yKGNvbnN0IGhlbHBlciBvZiBwYXNzU3R5bGVIZWxwZXJzKXtcbmlmKGhlbHBlci5jYW5CZVZhbGlkKGlubmVyKSl7XG5oZWxwZXIuYXNzZXJ0VmFsaWQoaW5uZXIscGFzc1N0eWxlT2ZSZWN1cik7XG5yZXR1cm4gaGVscGVyLnN0eWxlTmFtZTtcbiB9XG4gfVxucmVtb3RhYmxlSGVscGVyLmFzc2VydFZhbGlkKGlubmVyLHBhc3NTdHlsZU9mUmVjdXIpO1xucmV0dXJuJ3JlbW90YWJsZSc7XG4gfVxuY2FzZSdmdW5jdGlvbic6e1xuaXNGcm96ZW4oaW5uZXIpfHxcbkZhaWwgYENhbm5vdCBwYXNzIG5vbi1mcm96ZW4gb2JqZWN0cyBsaWtlICR7aW5uZXJ9LiBVc2UgaGFyZGVuKClgO1xudHlwZW9mIGlubmVyLnRoZW4hPT0nZnVuY3Rpb24nfHxcbkZhaWwgYENhbm5vdCBwYXNzIG5vbi1wcm9taXNlIHRoZW5hYmxlc2A7XG5yZW1vdGFibGVIZWxwZXIuYXNzZXJ0VmFsaWQoaW5uZXIscGFzc1N0eWxlT2ZSZWN1cik7XG5yZXR1cm4ncmVtb3RhYmxlJztcbiB9XG5kZWZhdWx0OntcbnRocm93IGFzc2VydC5mYWlsKFggYFVucmVjb2duaXplZCB0eXBlb2YgJHtxKHR5cGVzdHIpfWAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfTtcblxucmV0dXJuIHBhc3NTdHlsZU9mUmVjdXIocGFzc2FibGUpO1xuIH07XG5yZXR1cm4gaGFyZGVuKHBhc3NTdHlsZU9mKTtcbiB9O1xuXG5jb25zdCAgICAgICAgUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2w9U3ltYm9sLmZvcignQGVuZG8gcGFzc1N0eWxlT2YnKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLlBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sKFBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sKTtcbmNvbnN0ICAgICAgICBwYXNzU3R5bGVPZj1cbmdsb2JhbFRoaXMmJmdsb2JhbFRoaXNbUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2xdfHxcbm1ha2VQYXNzU3R5bGVPZihbXG5Db3B5QXJyYXlIZWxwZXIsXG5Db3B5UmVjb3JkSGVscGVyLFxuVGFnZ2VkSGVscGVyLFxuRXJyb3JIZWxwZXIsXG5SZW1vdGFibGVIZWxwZXJdKTskaM2PX29uY2UucGFzc1N0eWxlT2YocGFzc1N0eWxlT2YpO1xuXG5cbmNvbnN0ICAgICAgICBhc3NlcnRQYXNzYWJsZT0odmFsKT0+e1xucGFzc1N0eWxlT2YodmFsKTsvL1xuIH07JGjNj19vbmNlLmFzc2VydFBhc3NhYmxlKGFzc2VydFBhc3NhYmxlKTtcbmhhcmRlbihhc3NlcnRQYXNzYWJsZSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgaXNQYXNzYWJsZT0oc3BlY2ltZW4pPT57XG50cnl7XG4vL1xuLy9cbnJldHVybiBwYXNzU3R5bGVPZihzcGVjaW1lbikhPT11bmRlZmluZWQ7XG4gfWNhdGNoKF8pe1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9OyRozY9fb25jZS5pc1Bhc3NhYmxlKGlzUGFzc2FibGUpO1xuaGFyZGVuKGlzUGFzc2FibGUpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBpc1Bhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2M9KG5hbWUsZGVzYyk9PlxuY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MobmFtZSxkZXNjLHBhc3NTdHlsZU9mKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICB0b1Bhc3NhYmxlRXJyb3I9KGVycik9PntcbmhhcmRlbihlcnIpO1xuaWYoY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IoZXJyLHBhc3NTdHlsZU9mKSl7XG5yZXR1cm4gZXJyO1xuIH1cbmNvbnN0e25hbWUsbWVzc2FnZX09ZXJyO1xuY29uc3R7Y2F1c2U6Y2F1c2VEZXNjLGVycm9yczplcnJvcnNEZXNjfT1cbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoZXJyKTtcbmxldCBjYXVzZTtcbmxldCBlcnJvcnM7XG5pZihjYXVzZURlc2MmJmlzUGFzc2FibGVFcnJvclByb3BlcnR5RGVzYygnY2F1c2UnLGNhdXNlRGVzYykpe1xuY2F1c2U9Y2F1c2VEZXNjLnZhbHVlO1xuIH1cbmlmKGVycm9yc0Rlc2MmJmlzUGFzc2FibGVFcnJvclByb3BlcnR5RGVzYygnZXJyb3JzJyxlcnJvcnNEZXNjKSl7XG5lcnJvcnM9ZXJyb3JzRGVzYy52YWx1ZTtcbiB9XG5cbmNvbnN0IGVyckNvbnN0cnVjdG9yPWdldEVycm9yQ29uc3RydWN0b3IoIGAke25hbWV9YCl8fEVycm9yO1xuY29uc3QgbmV3RXJyb3I9bWFrZUVycm9yKCBgJHttZXNzYWdlfWAsZXJyQ29uc3RydWN0b3Ise1xuLy9cbmNhdXNlLFxuZXJyb3JzfSk7XG5cbi8vXG5oYXJkZW4obmV3RXJyb3IpO1xuLy9cbi8vXG4vL1xuYW5ub3RhdGVFcnJvcihuZXdFcnJvcixYIGBjb3BpZWQgZnJvbSBlcnJvciAke2Vycn1gKTtcbnBhc3NTdHlsZU9mKG5ld0Vycm9yKT09PSdlcnJvcid8fFxuRmFpbCBgRXhwZWN0ZWQgJHtuZXdFcnJvcn0gdG8gYmUgYSBwYXNzYWJsZSBlcnJvcmA7XG5yZXR1cm4gbmV3RXJyb3I7XG4gfTskaM2PX29uY2UudG9QYXNzYWJsZUVycm9yKHRvUGFzc2FibGVFcnJvcik7XG5oYXJkZW4odG9QYXNzYWJsZUVycm9yKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIHRvVGhyb3dhYmxlPShzcGVjaW1lbik9PntcbmhhcmRlbihzcGVjaW1lbik7XG5pZihpc0Vycm9yTGlrZShzcGVjaW1lbikpe1xucmV0dXJuIHRvUGFzc2FibGVFcnJvcigvKiAgICAgICAgICAgICAgICAqL3NwZWNpbWVuKTtcbiB9XG4vL1xuLy9cbi8vXG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2Yoc3BlY2ltZW4pO1xuaWYoaXNPYmplY3Qoc3BlY2ltZW4pKXtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdjb3B5QXJyYXknOntcbmNvbnN0IGVsZW1lbnRzPS8qICAgICAgICAgICAgICAgICAgICAqL3NwZWNpbWVuO1xuZm9yKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpe1xuZWxlbWVudD09PXRvVGhyb3dhYmxlKGVsZW1lbnQpfHxcbkZhaWwgYG5lc3RlZCB0b1Rocm93YWJsZSBjb2VyY2lvbiBub3QgeWV0IHN1cHBvcnRlZCAke2VsZW1lbnR9YDtcbiB9XG5icmVhaztcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbmNvbnN0IHJlYz0vKiAgICAgICAgICAgICAgICAgICAgICovc3BlY2ltZW47XG5mb3IoY29uc3QgdmFsIG9mIHZhbHVlcyhyZWMpKXtcbnZhbD09PXRvVGhyb3dhYmxlKHZhbCl8fFxuRmFpbCBgbmVzdGVkIHRvVGhyb3dhYmxlIGNvZXJjaW9uIG5vdCB5ZXQgc3VwcG9ydGVkICR7dmFsfWA7XG4gfVxuYnJlYWs7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0IHRnPS8qICAgICAgICAgICAgICAgICAgICAgKi9zcGVjaW1lbjtcbmNvbnN0e3BheWxvYWR9PXRnO1xucGF5bG9hZD09PXRvVGhyb3dhYmxlKHBheWxvYWQpfHxcbkZhaWwgYG5lc3RlZCB0b1Rocm93YWJsZSBjb2VyY2lvbiBub3QgeWV0IHN1cHBvcnRlZCAke3BheWxvYWR9YDtcbmJyZWFrO1xuIH1cbmNhc2UnZXJyb3InOntcbmNvbnN0IGVyPS8qICAgICAgICAgICAgICAgICovc3BlY2ltZW47XG5lcj09PXRvVGhyb3dhYmxlKGVyKXx8XG5GYWlsIGBuZXN0ZWQgdG9UaHJvd2FibGUgY29lcmNpb24gbm90IHlldCBzdXBwb3J0ZWQgJHtlcn1gO1xuYnJlYWs7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGBBICR7cShwYXNzU3R5bGUpfSBpcyBub3QgdGhyb3dhYmxlOiAke3NwZWNpbWVufWA7XG4gfX1cblxuIH1cbnJldHVybiAoLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovc3BlY2ltZW4pO1xuIH07JGjNj19vbmNlLnRvVGhyb3dhYmxlKHRvVGhyb3dhYmxlKTtcbmhhcmRlbih0b1Rocm93YWJsZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJQYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbCI6WyJQYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbCJdLCJwYXNzU3R5bGVPZiI6WyJwYXNzU3R5bGVPZiJdLCJhc3NlcnRQYXNzYWJsZSI6WyJhc3NlcnRQYXNzYWJsZSJdLCJpc1Bhc3NhYmxlIjpbImlzUGFzc2FibGUiXSwidG9QYXNzYWJsZUVycm9yIjpbInRvUGFzc2FibGVFcnJvciJdLCJ0b1Rocm93YWJsZSI6WyJ0b1Rocm93YWJsZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD2aIte1RcAANUXAAAoAAAAQGVuZG8vcGFzcy1zdHlsZS12MS40Ljgvc3JjL3JlbW90YWJsZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiUmVtb3RhYmxlSGVscGVyIiwiYXNzZXJ0SWZhY2UiLCJnZXRJbnRlcmZhY2VPZiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IEZhaWwscSxhc3NlcnRDaGVja2VyLGNhbkJlTWV0aG9kLGhhc093blByb3BlcnR5T2YsUEFTU19TVFlMRSxjaGVja1RhZ1JlY29yZCxjaGVja0Z1bmN0aW9uVGFnUmVjb3JkLGlzT2JqZWN0LGdldFRhZyxDWDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLCBbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIiwgWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJjYW5CZU1ldGhvZFwiLCBbJGjNj19hID0+IChjYW5CZU1ldGhvZCA9ICRozY9fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaM2PX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaM2PX2EpXV0sW1wiUEFTU19TVFlMRVwiLCBbJGjNj19hID0+IChQQVNTX1NUWUxFID0gJGjNj19hKV1dLFtcImNoZWNrVGFnUmVjb3JkXCIsIFskaM2PX2EgPT4gKGNoZWNrVGFnUmVjb3JkID0gJGjNj19hKV1dLFtcImNoZWNrRnVuY3Rpb25UYWdSZWNvcmRcIiwgWyRozY9fYSA9PiAoY2hlY2tGdW5jdGlvblRhZ1JlY29yZCA9ICRozY9fYSldXSxbXCJpc09iamVjdFwiLCBbJGjNj19hID0+IChpc09iamVjdCA9ICRozY9fYSldXSxbXCJnZXRUYWdcIiwgWyRozY9fYSA9PiAoZ2V0VGFnID0gJGjNj19hKV1dLFtcIkNYXCIsIFskaM2PX2EgPT4gKENYID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuXG4gKi9cblxuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7XG5nZXRQcm90b3R5cGVPZixcbmlzRnJvemVuLFxucHJvdG90eXBlOm9iamVjdFByb3RvdHlwZSxcbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnN9PVxuT2JqZWN0O1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgY2hlY2tJZmFjZT0oaWZhY2UsY2hlY2spPT57XG5yZXR1cm4oXG4vL1xuKHR5cGVvZiBpZmFjZT09PSdzdHJpbmcnfHxcbiEhY2hlY2smJlxuQ1goXG5jaGVjaylcbiBgRm9yIG5vdywgaW50ZXJmYWNlICR7aWZhY2V9IG11c3QgYmUgYSBzdHJpbmc7IHVuaW1wbGVtZW50ZWRgKSYmKFxuaWZhY2U9PT0nUmVtb3RhYmxlJ3x8XG5pZmFjZS5zdGFydHNXaXRoKCdBbGxlZ2VkOiAnKXx8XG5pZmFjZS5zdGFydHNXaXRoKCdEZWJ1Z05hbWU6ICcpfHxcbiEhY2hlY2smJlxuQ1goY2hlY2spIGBGb3Igbm93LCBpZmFjZSAke3EoXG5pZmFjZSlcbiB9IG11c3QgYmUgXCJSZW1vdGFibGVcIiBvciBiZWdpbiB3aXRoIFwiQWxsZWdlZDogXCIgb3IgXCJEZWJ1Z05hbWU6IFwiOyB1bmltcGxlbWVudGVkYCkpO1xuXG4gfTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRJZmFjZT0oaWZhY2UpPT5jaGVja0lmYWNlKGlmYWNlLGFzc2VydENoZWNrZXIpOyRozY9fb25jZS5hc3NlcnRJZmFjZShhc3NlcnRJZmFjZSk7XG5oYXJkZW4oYXNzZXJ0SWZhY2UpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBjaGVja1JlbW90YWJsZVByb3RvT2Y9KG9yaWdpbmFsLGNoZWNrKT0+e1xuaXNPYmplY3Qob3JpZ2luYWwpfHxcbkZhaWwgYFJlbW90YWJsZXMgbXVzdCBiZSBvYmplY3RzIG9yIGZ1bmN0aW9uczogJHtvcmlnaW5hbH1gO1xuXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbmNvbnN0IHByb3RvPWdldFByb3RvdHlwZU9mKG9yaWdpbmFsKTtcbmlmKFxucHJvdG89PT1vYmplY3RQcm90b3R5cGV8fFxucHJvdG89PT1udWxsfHxcbnByb3RvPT09RnVuY3Rpb24ucHJvdG90eXBlKVxue1xucmV0dXJuKFxuISFjaGVjayYmXG5DWChjaGVjaykgYFJlbW90YWJsZXMgbXVzdCBiZSBleHBsaWNpdGx5IGRlY2xhcmVkOiAke3Eob3JpZ2luYWwpfWApO1xuXG4gfVxuXG5pZih0eXBlb2Ygb3JpZ2luYWw9PT0nb2JqZWN0Jyl7XG5jb25zdCBwcm90b1Byb3RvPWdldFByb3RvdHlwZU9mKHByb3RvKTtcbmlmKHByb3RvUHJvdG8hPT1vYmplY3RQcm90b3R5cGUmJnByb3RvUHJvdG8hPT1udWxsKXtcbi8vXG5yZXR1cm4gY2hlY2tSZW1vdGFibGUocHJvdG8sY2hlY2spO1xuIH1cbmlmKCFjaGVja1RhZ1JlY29yZChwcm90bywncmVtb3RhYmxlJyxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9ZWxzZSBpZih0eXBlb2Ygb3JpZ2luYWw9PT0nZnVuY3Rpb24nKXtcbmlmKCFjaGVja0Z1bmN0aW9uVGFnUmVjb3JkKHByb3RvLCdyZW1vdGFibGUnLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cblxuLy9cbmNvbnN0IHBhc3NTdHlsZUtleT0vKiAgICAgICAgICAgICAgICAgICovUEFTU19TVFlMRTtcbmNvbnN0IHRhZ0tleT0vKiAgICAgICAgICAgICAgICAgICovU3ltYm9sLnRvU3RyaW5nVGFnO1xuY29uc3R7XG4vL1xuWy8qICAgICAgICAgICAgICAgICAqL3Bhc3NTdHlsZUtleV06X3Bhc3NTdHlsZURlc2MsXG5bLyogICAgICAgICAgICAgICAgICovdGFnS2V5XTp7dmFsdWU6aWZhY2V9LFxuLi4ucmVzdERlc2NzfT1cbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocHJvdG8pO1xuXG5yZXR1cm4oXG4ob3duS2V5cyhyZXN0RGVzY3MpLmxlbmd0aD09PTB8fFxuISFjaGVjayYmXG5DWChcbmNoZWNrKVxuIGBVbmV4cGVjdGVkIHByb3BlcnRpZXMgb24gUmVtb3RhYmxlIFByb3RvICR7b3duS2V5cyhyZXN0RGVzY3MpfWApJiZcbmNoZWNrSWZhY2UoaWZhY2UsY2hlY2spKTtcblxuIH07XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgY29uZmlybWVkUmVtb3RhYmxlcz1uZXcgV2Vha1NldCgpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBjaGVja1JlbW90YWJsZT0odmFsLGNoZWNrKT0+e1xuaWYoY29uZmlybWVkUmVtb3RhYmxlcy5oYXModmFsKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZighaXNGcm96ZW4odmFsKSl7XG5yZXR1cm4oXG4hIWNoZWNrJiZDWChjaGVjaykgYGNhbm5vdCBzZXJpYWxpemUgbm9uLWZyb3plbiBvYmplY3RzIGxpa2UgJHt2YWx9YCk7XG5cbiB9XG4vL1xuaWYoIVJlbW90YWJsZUhlbHBlci5jYW5CZVZhbGlkKHZhbCxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmNvbnN0IHJlc3VsdD1jaGVja1JlbW90YWJsZVByb3RvT2YodmFsLGNoZWNrKTtcbmlmKHJlc3VsdCl7XG5jb25maXJtZWRSZW1vdGFibGVzLmFkZCh2YWwpO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgZ2V0SW50ZXJmYWNlT2Y9KHZhbCk9PntcbmlmKFxuIWlzT2JqZWN0KHZhbCl8fFxudmFsW1BBU1NfU1RZTEVdIT09J3JlbW90YWJsZSd8fFxuIWNoZWNrUmVtb3RhYmxlKHZhbCkpXG57XG4vL1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG4vL1xucmV0dXJuIGdldFRhZyh2YWwpO1xuIH07JGjNj19vbmNlLmdldEludGVyZmFjZU9mKGdldEludGVyZmFjZU9mKTtcbmhhcmRlbihnZXRJbnRlcmZhY2VPZik7XG5cbi8qXG5cblxuICovXG5jb25zdCAgICAgICAgUmVtb3RhYmxlSGVscGVyPWhhcmRlbih7XG5zdHlsZU5hbWU6J3JlbW90YWJsZScsXG5cbmNhbkJlVmFsaWQ6KGNhbmRpZGF0ZSxjaGVjaz11bmRlZmluZWQpPT57XG5jb25zdCB2YWxpZFR5cGU9XG4oaXNPYmplY3QoY2FuZGlkYXRlKXx8XG4hIWNoZWNrJiZcbkNYKGNoZWNrKSBgY2Fubm90IHNlcmlhbGl6ZSBub24tb2JqZWN0cyBhcyBSZW1vdGFibGUgJHtjYW5kaWRhdGV9YCkmJihcbiFpc0FycmF5KGNhbmRpZGF0ZSl8fFxuISFjaGVjayYmXG5DWChjaGVjaykgYGNhbm5vdCBzZXJpYWxpemUgYXJyYXlzIGFzIFJlbW90YWJsZSAke2NhbmRpZGF0ZX1gKTtcbmlmKCF2YWxpZFR5cGUpe1xucmV0dXJuIGZhbHNlO1xuIH1cblxuY29uc3QgZGVzY3M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xuaWYodHlwZW9mIGNhbmRpZGF0ZT09PSdvYmplY3QnKXtcbi8vXG4vL1xucmV0dXJuIG93bktleXMoZGVzY3MpLmV2ZXJ5KChrZXkpPT57XG5yZXR1cm4oXG4vL1xuKGhhc093blByb3BlcnR5T2YoZGVzY3NbLyogICAgICAgICAgICAgICAgICova2V5XSwndmFsdWUnKXx8XG4hIWNoZWNrJiZcbkNYKGNoZWNrKSBgY2Fubm90IHNlcmlhbGl6ZSBSZW1vdGFibGVzIHdpdGggYWNjZXNzb3JzIGxpa2UgJHtxKFxuU3RyaW5nKGtleSkpXG4gfSBpbiAke2NhbmRpZGF0ZX1gKSYmKFxua2V5PT09U3ltYm9sLnRvU3RyaW5nVGFnJiZjaGVja0lmYWNlKGNhbmRpZGF0ZVtrZXldLGNoZWNrKXx8XG4oY2FuQmVNZXRob2QoY2FuZGlkYXRlW2tleV0pfHxcbiEhY2hlY2smJlxuQ1goY2hlY2spIGBjYW5ub3Qgc2VyaWFsaXplIFJlbW90YWJsZXMgd2l0aCBub24tbWV0aG9kcyBsaWtlICR7cShcblN0cmluZyhrZXkpKVxuIH0gaW4gJHtjYW5kaWRhdGV9YCkmJihcbmtleSE9PVBBU1NfU1RZTEV8fFxuISFjaGVjayYmXG5DWChjaGVjaykgYEEgcGFzcy1ieS1yZW1vdGUgY2Fubm90IHNoYWRvdyAke3EoUEFTU19TVFlMRSl9YCkpKTtcblxuIH0pO1xuIH1lbHNlIGlmKHR5cGVvZiBjYW5kaWRhdGU9PT0nZnVuY3Rpb24nKXtcbi8vXG4vL1xuY29uc3R7XG5uYW1lOm5hbWVEZXNjLFxubGVuZ3RoOmxlbmd0aERlc2MsXG4vL1xuW1N5bWJvbC50b1N0cmluZ1RhZ106dG9TdHJpbmdUYWdEZXNjLFxuLi4ucmVzdERlc2NzfT1cbmRlc2NzO1xuY29uc3QgcmVzdEtleXM9b3duS2V5cyhyZXN0RGVzY3MpO1xucmV0dXJuKFxuKG5hbWVEZXNjJiZ0eXBlb2YgbmFtZURlc2MudmFsdWU9PT0nc3RyaW5nJ3x8XG4hIWNoZWNrJiZcbkNYKGNoZWNrKSBgRmFyIGZ1bmN0aW9uIG5hbWUgbXVzdCBiZSBhIHN0cmluZywgaW4gJHtjYW5kaWRhdGV9YCkmJihcbmxlbmd0aERlc2MmJnR5cGVvZiBsZW5ndGhEZXNjLnZhbHVlPT09J251bWJlcid8fFxuISFjaGVjayYmXG5DWChcbmNoZWNrKVxuIGBGYXIgZnVuY3Rpb24gbGVuZ3RoIG11c3QgYmUgYSBudW1iZXIsIGluICR7Y2FuZGlkYXRlfWApJiYoXG50b1N0cmluZ1RhZ0Rlc2M9PT11bmRlZmluZWR8fFxuKHR5cGVvZiB0b1N0cmluZ1RhZ0Rlc2MudmFsdWU9PT0nc3RyaW5nJ3x8XG4hIWNoZWNrJiZcbkNYKFxuY2hlY2spXG4gYEZhciBmdW5jdGlvbiBAQHRvU3RyaW5nVGFnIG11c3QgYmUgYSBzdHJpbmcsIGluICR7Y2FuZGlkYXRlfWApJiZcbmNoZWNrSWZhY2UodG9TdHJpbmdUYWdEZXNjLnZhbHVlLGNoZWNrKSkmJihcbnJlc3RLZXlzLmxlbmd0aD09PTB8fFxuISFjaGVjayYmXG5DWChcbmNoZWNrKVxuIGBGYXIgZnVuY3Rpb25zIHVuZXhwZWN0ZWQgcHJvcGVydGllcyBiZXNpZGVzIC5uYW1lIGFuZCAubGVuZ3RoICR7cmVzdEtleXN9YCkpO1xuXG4gfVxucmV0dXJuISFjaGVjayYmQ1goY2hlY2spIGB1bnJlY29nbml6ZWQgdHlwZW9mICR7Y2FuZGlkYXRlfWA7XG4gfSxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSk9PmNoZWNrUmVtb3RhYmxlKGNhbmRpZGF0ZSxhc3NlcnRDaGVja2VyKSxcblxuZXZlcnk6KF9wYXNzYWJsZSxfZm4pPT50cnVlfSk7JGjNj19vbmNlLlJlbW90YWJsZUhlbHBlcihSZW1vdGFibGVIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0SWZhY2UiOlsiYXNzZXJ0SWZhY2UiXSwiZ2V0SW50ZXJmYWNlT2YiOlsiZ2V0SW50ZXJmYWNlT2YiXSwiUmVtb3RhYmxlSGVscGVyIjpbIlJlbW90YWJsZUhlbHBlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAH8dZCtQwAALUMAAArAAAAQGVuZG8vcGFzcy1zdHlsZS12MS40Ljgvc3JjL3NhZmUtcHJvbWlzZS5qc3siaW1wb3J0cyI6WyJAZW5kby9wcm9taXNlLWtpdCIsIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRTYWZlUHJvbWlzZSIsImlzU2FmZVByb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBpc1Byb21pc2UscSxhc3NlcnRDaGVja2VyLGhhc093blByb3BlcnR5T2YsQ1g7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsIFskaM2PX2EgPT4gKGlzUHJvbWlzZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLCBbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRozY9fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRozY9fYSldXSxbXCJDWFwiLCBbJGjNj19hID0+IChDWCA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbmNvbnN0e2lzRnJvemVuLGdldFByb3RvdHlwZU9mLGdldE93blByb3BlcnR5RGVzY3JpcHRvcn09T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e3RvU3RyaW5nVGFnfT1TeW1ib2w7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGNoZWNrUHJvbWlzZU93bktleXM9KHByLGNoZWNrKT0+e1xuY29uc3Qga2V5cz1vd25LZXlzKHByKTtcblxuaWYoa2V5cy5sZW5ndGg9PT0wKXtcbnJldHVybiB0cnVlO1xuIH1cblxuLypcblxuXG5cblxuXG5cblxuICAgKi9cbmNvbnN0IHVua25vd25LZXlzPWtleXMuZmlsdGVyKFxuKGtleSk9PnR5cGVvZiBrZXkhPT0nc3ltYm9sJ3x8IWhhc093blByb3BlcnR5T2YoUHJvbWlzZS5wcm90b3R5cGUsa2V5KSk7XG5cblxuaWYodW5rbm93bktleXMubGVuZ3RoIT09MCl7XG5yZXR1cm4gQ1goXG5jaGVjaylcbiBgJHtwcn0gLSBNdXN0IG5vdCBoYXZlIGFueSBvd24gcHJvcGVydGllczogJHtxKHVua25vd25LZXlzKX1gO1xuIH1cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbmNvbnN0IGNoZWNrU2FmZU93bktleT0oa2V5KT0+e1xuaWYoa2V5PT09dG9TdHJpbmdUYWcpe1xuLy9cbi8vXG5jb25zdCB0YWdEZXNjPWdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcix0b1N0cmluZ1RhZyk7XG5hc3NlcnQodGFnRGVzYyE9PXVuZGVmaW5lZCk7XG5yZXR1cm4oXG4oaGFzT3duUHJvcGVydHlPZih0YWdEZXNjLCd2YWx1ZScpfHxcbkNYKFxuY2hlY2spXG4gYE93biBAQHRvU3RyaW5nVGFnIG11c3QgYmUgYSBkYXRhIHByb3BlcnR5LCBub3QgYW4gYWNjZXNzb3I6ICR7cSh0YWdEZXNjKX1gKSYmKFxudHlwZW9mIHRhZ0Rlc2MudmFsdWU9PT0nc3RyaW5nJ3x8XG5DWChcbmNoZWNrKVxuIGBPd24gQEB0b1N0cmluZ1RhZyB2YWx1ZSBtdXN0IGJlIGEgc3RyaW5nOiAke3EodGFnRGVzYy52YWx1ZSl9YCkmJihcbiF0YWdEZXNjLmVudW1lcmFibGV8fFxuQ1goY2hlY2spIGBPd24gQEB0b1N0cmluZ1RhZyBtdXN0IG5vdCBiZSBlbnVtZXJhYmxlOiAke3EodGFnRGVzYyl9YCkpO1xuXG4gfVxuY29uc3QgdmFsPXByW2tleV07XG5pZih2YWw9PT11bmRlZmluZWR8fHR5cGVvZiB2YWw9PT0nbnVtYmVyJyl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihcbnR5cGVvZiB2YWw9PT0nb2JqZWN0JyYmXG52YWwhPT1udWxsJiZcbmlzRnJvemVuKHZhbCkmJlxuZ2V0UHJvdG90eXBlT2YodmFsKT09PU9iamVjdC5wcm90b3R5cGUpXG57XG5jb25zdCBzdWJLZXlzPW93bktleXModmFsKTtcbmlmKHN1YktleXMubGVuZ3RoPT09MCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5cbmlmKFxuc3ViS2V5cy5sZW5ndGg9PT0xJiZcbnN1YktleXNbMF09PT0nZGVzdHJveWVkJyYmXG52YWwuZGVzdHJveWVkPT09ZmFsc2UpXG57XG5yZXR1cm4gdHJ1ZTtcbiB9XG4gfVxucmV0dXJuIENYKFxuY2hlY2spXG4gYFVuZXhwZWN0ZWQgTm9kZSBhc3luY19ob29rcyBhZGRpdGlvbnMgdG8gcHJvbWlzZTogJHtwcn0uJHtxKFxuU3RyaW5nKGtleSkpXG4gfSBpcyAke3ZhbH1gO1xuIH07XG5cbnJldHVybiBrZXlzLmV2ZXJ5KGNoZWNrU2FmZU93bktleSk7XG4gfTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGNoZWNrU2FmZVByb21pc2U9KHByLGNoZWNrKT0+e1xucmV0dXJuKFxuKGlzRnJvemVuKHByKXx8Q1goY2hlY2spIGAke3ByfSAtIE11c3QgYmUgZnJvemVuYCkmJihcbmlzUHJvbWlzZShwcil8fENYKGNoZWNrKSBgJHtwcn0gLSBNdXN0IGJlIGEgcHJvbWlzZWApJiYoXG5nZXRQcm90b3R5cGVPZihwcik9PT1Qcm9taXNlLnByb3RvdHlwZXx8XG5DWChjaGVjaykgYCR7cHJ9IC0gTXVzdCBpbmhlcml0IGZyb20gUHJvbWlzZS5wcm90b3R5cGU6ICR7cShcbmdldFByb3RvdHlwZU9mKHByKSlcbiB9YCkmJlxuY2hlY2tQcm9taXNlT3duS2V5cygvKiAgICAgICAgICAgICAgICAgICovcHIsY2hlY2spKTtcblxuIH07XG5oYXJkZW4oY2hlY2tTYWZlUHJvbWlzZSk7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGlzU2FmZVByb21pc2U9KHByKT0+Y2hlY2tTYWZlUHJvbWlzZShwciwoeCk9PngpOyRozY9fb25jZS5pc1NhZmVQcm9taXNlKGlzU2FmZVByb21pc2UpO1xuaGFyZGVuKGlzU2FmZVByb21pc2UpO1xuXG5jb25zdCAgICAgICAgYXNzZXJ0U2FmZVByb21pc2U9KHByKT0+Y2hlY2tTYWZlUHJvbWlzZShwcixhc3NlcnRDaGVja2VyKTskaM2PX29uY2UuYXNzZXJ0U2FmZVByb21pc2UoYXNzZXJ0U2FmZVByb21pc2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNTYWZlUHJvbWlzZSI6WyJpc1NhZmVQcm9taXNlIl0sImFzc2VydFNhZmVQcm9taXNlIjpbImFzc2VydFNhZmVQcm9taXNlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAC5p46jhBwAA4QcAACUAAABAZW5kby9wYXNzLXN0eWxlLXYxLjQuOC9zcmMvc3RyaW5nLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vudi1vcHRpb25zIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiYXNzZXJ0UGFzc2FibGVTdHJpbmciLCJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIiwiaXNXZWxsRm9ybWVkU3RyaW5nIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgZ2V0RW52aXJvbm1lbnRPcHRpb24sRmFpbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vudi1vcHRpb25zXCIsIFtbXCJnZXRFbnZpcm9ubWVudE9wdGlvblwiLCBbJGjNj19hID0+IChnZXRFbnZpcm9ubWVudE9wdGlvbiA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLCBbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG4vL1xuY29uc3QgaGFzV2VsbEZvcm1lZFN0cmluZ01ldGhvZD0hIVN0cmluZy5wcm90b3R5cGUuaXNXZWxsRm9ybWVkO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGlzV2VsbEZvcm1lZFN0cmluZz1oYXNXZWxsRm9ybWVkU3RyaW5nTWV0aG9kP1xuKHN0cik9PnR5cGVvZiBzdHI9PT0nc3RyaW5nJyYmc3RyLmlzV2VsbEZvcm1lZCgpOlxuKHN0cik9PntcbmlmKHR5cGVvZiBzdHIhPT0nc3RyaW5nJyl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuZm9yKGNvbnN0IGNoIG9mIHN0cil7XG4vL1xuLy9cbi8vXG5jb25zdCBjcD0vKiAgICAgICAgICAgICAgICAgKi9jaC5jb2RlUG9pbnRBdCgwKTtcbmlmKGNwPj0weGQ4MDAmJmNwPD0weGRmZmYpe1xuLy9cbi8vXG4vL1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9OyRozY9fb25jZS5pc1dlbGxGb3JtZWRTdHJpbmcoaXNXZWxsRm9ybWVkU3RyaW5nKTtcbmhhcmRlbihpc1dlbGxGb3JtZWRTdHJpbmcpO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydFdlbGxGb3JtZWRTdHJpbmc9KHN0cik9PntcbmlzV2VsbEZvcm1lZFN0cmluZyhzdHIpfHxGYWlsIGBFeHBlY3RlZCB3ZWxsLWZvcm1lZCB1bmljb2RlIHN0cmluZzogJHtzdHJ9YDtcbiB9OyRozY9fb25jZS5hc3NlcnRXZWxsRm9ybWVkU3RyaW5nKGFzc2VydFdlbGxGb3JtZWRTdHJpbmcpO1xuaGFyZGVuKGFzc2VydFdlbGxGb3JtZWRTdHJpbmcpO1xuXG5jb25zdCBPTkxZX1dFTExfRk9STUVEX1NUUklOR1NfUEFTU0FCTEU9XG5nZXRFbnZpcm9ubWVudE9wdGlvbignT05MWV9XRUxMX0ZPUk1FRF9TVFJJTkdTX1BBU1NBQkxFJywnZGlzYWJsZWQnLFtcbidlbmFibGVkJ10pPT09XG4nZW5hYmxlZCc7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRQYXNzYWJsZVN0cmluZz0oc3RyKT0+e1xudHlwZW9mIHN0cj09PSdzdHJpbmcnfHxGYWlsIGBFeHBlY3RlZCBzdHJpbmcgJHtzdHJ9YDtcbiFPTkxZX1dFTExfRk9STUVEX1NUUklOR1NfUEFTU0FCTEV8fGFzc2VydFdlbGxGb3JtZWRTdHJpbmcoc3RyKTtcbiB9OyRozY9fb25jZS5hc3NlcnRQYXNzYWJsZVN0cmluZyhhc3NlcnRQYXNzYWJsZVN0cmluZyk7XG5oYXJkZW4oYXNzZXJ0UGFzc2FibGVTdHJpbmcpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNXZWxsRm9ybWVkU3RyaW5nIjpbImlzV2VsbEZvcm1lZFN0cmluZyJdLCJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIjpbImFzc2VydFdlbGxGb3JtZWRTdHJpbmciXSwiYXNzZXJ0UGFzc2FibGVTdHJpbmciOlsiYXNzZXJ0UGFzc2FibGVTdHJpbmciXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAABc9ZcisKAAArCgAAJQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC44L3NyYy9zeW1ib2wuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiYXNzZXJ0UGFzc2FibGVTeW1ib2wiLCJpc1Bhc3NhYmxlU3ltYm9sIiwibmFtZUZvclBhc3NhYmxlU3ltYm9sIiwicGFzc2FibGVTeW1ib2xGb3JOYW1lIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgRmFpbCxxOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsIFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLCBbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTsgICBcblxuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLypcblxuICovXG5jb25zdCB3ZWxsS25vd25TeW1ib2xOYW1lcz1uZXcgTWFwKFxub3duS2V5cyhTeW1ib2wpLlxuZmlsdGVyKFxuKG5hbWUpPT50eXBlb2YgbmFtZT09PSdzdHJpbmcnJiZ0eXBlb2YgU3ltYm9sW25hbWVdPT09J3N5bWJvbCcpLlxuXG5maWx0ZXIoKG5hbWUpPT57XG4vL1xuIW5hbWUuc3RhcnRzV2l0aCgnQEAnKXx8XG5GYWlsIGBEaWQgbm90IGV4cGVjdCBTeW1ib2wgdG8gaGF2ZSBhIHN5bWJvbC12YWx1ZWQgcHJvcGVydHkgbmFtZSBzdGFydGluZyB3aXRoIFwiQEBcIiAke3EoXG5uYW1lKVxuIH1gO1xucmV0dXJuIHRydWU7XG4gfSlcbi8vXG4ubWFwKChuYW1lKT0+W1N5bWJvbFtuYW1lXSwgYEBAJHtuYW1lfWBdKSk7XG5cblxuLypcblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGlzUGFzc2FibGVTeW1ib2w9KHN5bSk9PlxudHlwZW9mIHN5bT09PSdzeW1ib2wnJiYoXG50eXBlb2YgU3ltYm9sLmtleUZvcihzeW0pPT09J3N0cmluZyd8fHdlbGxLbm93blN5bWJvbE5hbWVzLmhhcyhzeW0pKTskaM2PX29uY2UuaXNQYXNzYWJsZVN5bWJvbChpc1Bhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihpc1Bhc3NhYmxlU3ltYm9sKTtcblxuY29uc3QgICAgICAgIGFzc2VydFBhc3NhYmxlU3ltYm9sPShzeW0pPT5cbmlzUGFzc2FibGVTeW1ib2woc3ltKXx8XG5GYWlsIGBPbmx5IHJlZ2lzdGVyZWQgc3ltYm9scyBvciB3ZWxsLWtub3duIHN5bWJvbHMgYXJlIHBhc3NhYmxlOiAke3Eoc3ltKX1gOyRozY9fb25jZS5hc3NlcnRQYXNzYWJsZVN5bWJvbChhc3NlcnRQYXNzYWJsZVN5bWJvbCk7XG5oYXJkZW4oYXNzZXJ0UGFzc2FibGVTeW1ib2wpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBuYW1lRm9yUGFzc2FibGVTeW1ib2w9KHN5bSk9PntcbmNvbnN0IG5hbWU9U3ltYm9sLmtleUZvcihzeW0pO1xuaWYobmFtZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gd2VsbEtub3duU3ltYm9sTmFtZXMuZ2V0KHN5bSk7XG4gfVxuaWYobmFtZS5zdGFydHNXaXRoKCdAQCcpKXtcbnJldHVybiBgQEAke25hbWV9YDtcbiB9XG5yZXR1cm4gbmFtZTtcbiB9OyRozY9fb25jZS5uYW1lRm9yUGFzc2FibGVTeW1ib2wobmFtZUZvclBhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihuYW1lRm9yUGFzc2FibGVTeW1ib2wpO1xuXG5jb25zdCBBdEF0UHJlZml4UGF0dGVybj0vXkBAKC4qKSQvO1xuaGFyZGVuKEF0QXRQcmVmaXhQYXR0ZXJuKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBwYXNzYWJsZVN5bWJvbEZvck5hbWU9KG5hbWUpPT57XG5pZih0eXBlb2YgbmFtZSE9PSdzdHJpbmcnKXtcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuY29uc3QgbWF0Y2g9QXRBdFByZWZpeFBhdHRlcm4uZXhlYyhuYW1lKTtcbmlmKG1hdGNoKXtcbmNvbnN0IHN1ZmZpeD1tYXRjaFsxXTtcbmlmKHN1ZmZpeC5zdGFydHNXaXRoKCdAQCcpKXtcbnJldHVybiBTeW1ib2wuZm9yKHN1ZmZpeCk7XG4gfWVsc2V7XG5jb25zdCBzeW09U3ltYm9sW3N1ZmZpeF07XG5pZih0eXBlb2Ygc3ltPT09J3N5bWJvbCcpe1xucmV0dXJuIHN5bTtcbiB9XG5GYWlsIGBSZXNlcnZlZCBmb3Igd2VsbCBrbm93biBzeW1ib2wgJHtxKHN1ZmZpeCl9OiAke3EobmFtZSl9YDtcbiB9XG4gfVxucmV0dXJuIFN5bWJvbC5mb3IobmFtZSk7XG4gfTskaM2PX29uY2UucGFzc2FibGVTeW1ib2xGb3JOYW1lKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSk7XG5oYXJkZW4ocGFzc2FibGVTeW1ib2xGb3JOYW1lKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUGFzc2FibGVTeW1ib2wiOlsiaXNQYXNzYWJsZVN5bWJvbCJdLCJhc3NlcnRQYXNzYWJsZVN5bWJvbCI6WyJhc3NlcnRQYXNzYWJsZVN5bWJvbCJdLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiOlsibmFtZUZvclBhc3NhYmxlU3ltYm9sIl0sInBhc3NhYmxlU3ltYm9sRm9yTmFtZSI6WyJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA4vj7S0MHAABDBwAAJQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC44L3NyYy90YWdnZWQuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIlRhZ2dlZEhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IEZhaWwsYXNzZXJ0Q2hlY2tlcixjaGVja1RhZ1JlY29yZCxQQVNTX1NUWUxFLGdldE93bkRhdGFEZXNjcmlwdG9yLGNoZWNrUGFzc1N0eWxlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsIFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiY2hlY2tUYWdSZWNvcmRcIiwgWyRozY9fYSA9PiAoY2hlY2tUYWdSZWNvcmQgPSAkaM2PX2EpXV0sW1wiUEFTU19TVFlMRVwiLCBbJGjNj19hID0+IChQQVNTX1NUWUxFID0gJGjNj19hKV1dLFtcImdldE93bkRhdGFEZXNjcmlwdG9yXCIsIFskaM2PX2EgPT4gKGdldE93bkRhdGFEZXNjcmlwdG9yID0gJGjNj19hKV1dLFtcImNoZWNrUGFzc1N0eWxlXCIsIFskaM2PX2EgPT4gKGNoZWNrUGFzc1N0eWxlID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2dldE93blByb3BlcnR5RGVzY3JpcHRvcnN9PU9iamVjdDtcblxuLypcblxuXG4gKi9cbmNvbnN0ICAgICAgICBUYWdnZWRIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZTondGFnZ2VkJyxcblxuY2FuQmVWYWxpZDooY2FuZGlkYXRlLGNoZWNrPXVuZGVmaW5lZCk9PlxuY2hlY2tQYXNzU3R5bGUoY2FuZGlkYXRlLGNhbmRpZGF0ZVtQQVNTX1NUWUxFXSwndGFnZ2VkJyxjaGVjayksXG5cbmFzc2VydFZhbGlkOihjYW5kaWRhdGUscGFzc1N0eWxlT2ZSZWN1cik9PntcbmNoZWNrVGFnUmVjb3JkKGNhbmRpZGF0ZSwndGFnZ2VkJyxhc3NlcnRDaGVja2VyKTtcblxuLy9cbmNvbnN0IHBhc3NTdHlsZUtleT0vKiAgICAgICAgICAgICAgICAgICovUEFTU19TVFlMRTtcbmNvbnN0IHRhZ0tleT0vKiAgICAgICAgICAgICAgICAgICovU3ltYm9sLnRvU3RyaW5nVGFnO1xuY29uc3R7XG4vL1xuWy8qICAgICAgICAgICAgICAgICAqL3Bhc3NTdHlsZUtleV06X3Bhc3NTdHlsZURlc2MsXG5bLyogICAgICAgICAgICAgICAgICovdGFnS2V5XTpfbGFiZWxEZXNjLFxucGF5bG9hZDpfcGF5bG9hZERlc2MsLy9cbi4uLnJlc3REZXNjc309XG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGNhbmRpZGF0ZSk7XG5vd25LZXlzKHJlc3REZXNjcykubGVuZ3RoPT09MHx8XG5GYWlsIGBVbmV4cGVjdGVkIHByb3BlcnRpZXMgb24gdGFnZ2VkIHJlY29yZCAke293bktleXMocmVzdERlc2NzKX1gO1xuXG4vL1xuLy9cbnBhc3NTdHlsZU9mUmVjdXIoXG5nZXRPd25EYXRhRGVzY3JpcHRvcihjYW5kaWRhdGUsJ3BheWxvYWQnLHRydWUsYXNzZXJ0Q2hlY2tlcikudmFsdWUpO1xuXG4gfX0pOyRozY9fb25jZS5UYWdnZWRIZWxwZXIoVGFnZ2VkSGVscGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlRhZ2dlZEhlbHBlciI6WyJUYWdnZWRIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAikvENicJAAAnCQAAKQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC44L3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlT2YuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRSZWNvcmQiLCJhc3NlcnRSZW1vdGFibGUiLCJpc0NvcHlBcnJheSIsImlzUmVjb3JkIiwiaXNSZW1vdGFibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBGYWlsLHEscGFzc1N0eWxlT2Y7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIiwgWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsIFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IGlzQ29weUFycmF5PShhcnIpPT5wYXNzU3R5bGVPZihhcnIpPT09J2NvcHlBcnJheSc7JGjNj19vbmNlLmlzQ29weUFycmF5KGlzQ29weUFycmF5KTtcbmhhcmRlbihpc0NvcHlBcnJheSk7XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBpc1JlY29yZD0ocmVjb3JkKT0+cGFzc1N0eWxlT2YocmVjb3JkKT09PSdjb3B5UmVjb3JkJzskaM2PX29uY2UuaXNSZWNvcmQoaXNSZWNvcmQpO1xuaGFyZGVuKGlzUmVjb3JkKTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBpc1JlbW90YWJsZT0ocmVtb3RhYmxlKT0+cGFzc1N0eWxlT2YocmVtb3RhYmxlKT09PSdyZW1vdGFibGUnOyRozY9fb25jZS5pc1JlbW90YWJsZShpc1JlbW90YWJsZSk7XG5oYXJkZW4oaXNSZW1vdGFibGUpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBhc3NlcnRDb3B5QXJyYXk9KGFycixvcHROYW1lT2ZBcnJheT0nQWxsZWdlZCBhcnJheScpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YoYXJyKTtcbnBhc3NTdHlsZT09PSdjb3B5QXJyYXknfHxcbkZhaWwgYCR7cShvcHROYW1lT2ZBcnJheSl9ICR7YXJyfSBtdXN0IGJlIGEgcGFzcy1ieS1jb3B5IGFycmF5LCBub3QgJHtxKFxucGFzc1N0eWxlKVxuIH1gO1xuIH07JGjNj19vbmNlLmFzc2VydENvcHlBcnJheShhc3NlcnRDb3B5QXJyYXkpO1xuaGFyZGVuKGFzc2VydENvcHlBcnJheSk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGFzc2VydFJlY29yZD0ocmVjb3JkLG9wdE5hbWVPZlJlY29yZD0nQWxsZWdlZCByZWNvcmQnKT0+e1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHJlY29yZCk7XG5wYXNzU3R5bGU9PT0nY29weVJlY29yZCd8fFxuRmFpbCBgJHtxKG9wdE5hbWVPZlJlY29yZCl9ICR7cmVjb3JkfSBtdXN0IGJlIGEgcGFzcy1ieS1jb3B5IHJlY29yZCwgbm90ICR7cShcbnBhc3NTdHlsZSlcbiB9YDtcbiB9OyRozY9fb25jZS5hc3NlcnRSZWNvcmQoYXNzZXJ0UmVjb3JkKTtcbmhhcmRlbihhc3NlcnRSZWNvcmQpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBhc3NlcnRSZW1vdGFibGU9KFxucmVtb3RhYmxlLFxub3B0TmFtZU9mUmVtb3RhYmxlPSdBbGxlZ2VkIHJlbW90YWJsZScpPT5cbntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihyZW1vdGFibGUpO1xucGFzc1N0eWxlPT09J3JlbW90YWJsZSd8fFxuRmFpbCBgJHtxKG9wdE5hbWVPZlJlbW90YWJsZSl9ICR7cmVtb3RhYmxlfSBtdXN0IGJlIGEgcmVtb3RhYmxlLCBub3QgJHtxKFxucGFzc1N0eWxlKVxuIH1gO1xuIH07JGjNj19vbmNlLmFzc2VydFJlbW90YWJsZShhc3NlcnRSZW1vdGFibGUpO1xuaGFyZGVuKGFzc2VydFJlbW90YWJsZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc0NvcHlBcnJheSI6WyJpc0NvcHlBcnJheSJdLCJpc1JlY29yZCI6WyJpc1JlY29yZCJdLCJpc1JlbW90YWJsZSI6WyJpc1JlbW90YWJsZSJdLCJhc3NlcnRDb3B5QXJyYXkiOlsiYXNzZXJ0Q29weUFycmF5Il0sImFzc2VydFJlY29yZCI6WyJhc3NlcnRSZWNvcmQiXSwiYXNzZXJ0UmVtb3RhYmxlIjpbImFzc2VydFJlbW90YWJsZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAFREsmeQEAAHkBAAAkAAAAQGVuZG8vcGFzcy1zdHlsZS12MS40Ljgvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaM2PX2ltcG9ydHMoW10pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPC1O0bmDgAA5g4AAB4AAABAZW5kby9wYXR0ZXJucy12MS40LjgvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMva2V5cy9jaGVja0tleS5qcyIsIi4vc3JjL2tleXMvY29weVNldC5qcyIsIi4vc3JjL2tleXMvY29weUJhZy5qcyIsIi4vc3JjL2tleXMvY29tcGFyZUtleXMuanMiLCIuL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanMiLCIuL3NyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanMiLCIuL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiLCIuL3NyYy9wYXR0ZXJucy9nZXRHdWFyZFBheWxvYWRzLmpzIiwiLi9zcmMvdHlwZXMuanMiLCJAZW5kby9jb21tb24vbGlzdC1kaWZmZXJlbmNlLmpzIiwiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRLZXkiLCJhc3NlcnRLZXkiLCJiYWdVbmlvbiIsImJhZ1VuaW9uIiwiZWxlbWVudHNJc0Rpc2pvaW50IiwiZWxlbWVudHNJc0Rpc2pvaW50IiwiZ2V0TWV0aG9kR3VhcmRQYXlsb2FkIiwiZ2V0TWV0aG9kR3VhcmRQYXlsb2FkIiwiZ2V0UmFua0NvdmVyIiwiZ2V0UmFua0NvdmVyIiwic2V0Q29tcGFyZSIsInNldENvbXBhcmUiLG51bGwsbnVsbCxudWxsLG51bGxdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdHlwZXMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRozY9faW1wb3J0cyhbW1wiLi9zcmMva2V5cy9jaGVja0tleS5qc1wiLCBbXV0sW1wiLi9zcmMva2V5cy9jb3B5U2V0LmpzXCIsIFtdXSxbXCIuL3NyYy9rZXlzL2NvcHlCYWcuanNcIiwgW11dLFtcIi4vc3JjL2tleXMvY29tcGFyZUtleXMuanNcIiwgW11dLFtcIi4vc3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qc1wiLCBbXV0sW1wiLi9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzXCIsIFtdXSxbXCIuL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanNcIiwgW11dLFtcIi4vc3JjL3BhdHRlcm5zL2dldEd1YXJkUGF5bG9hZHMuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXSxbXCJAZW5kby9jb21tb24vbGlzdC1kaWZmZXJlbmNlLmpzXCIsIFtdXSxbXCJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qc1wiLCBbXV1dKTsgICBcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2tleXMvY2hlY2tLZXkuanMiOltbImlzS2V5IiwiaXNLZXkiXSxbImFzc2VydEtleSIsImFzc2VydEtleSJdLFsiYXNzZXJ0U2NhbGFyS2V5IiwiYXNzZXJ0U2NhbGFyS2V5Il0sWyJpc0NvcHlTZXQiLCJpc0NvcHlTZXQiXSxbImFzc2VydENvcHlTZXQiLCJhc3NlcnRDb3B5U2V0Il0sWyJtYWtlQ29weVNldCIsIm1ha2VDb3B5U2V0Il0sWyJnZXRDb3B5U2V0S2V5cyIsImdldENvcHlTZXRLZXlzIl0sWyJpc0NvcHlCYWciLCJpc0NvcHlCYWciXSxbImFzc2VydENvcHlCYWciLCJhc3NlcnRDb3B5QmFnIl0sWyJtYWtlQ29weUJhZyIsIm1ha2VDb3B5QmFnIl0sWyJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyIsIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIl0sWyJnZXRDb3B5QmFnRW50cmllcyIsImdldENvcHlCYWdFbnRyaWVzIl0sWyJpc0NvcHlNYXAiLCJpc0NvcHlNYXAiXSxbImFzc2VydENvcHlNYXAiLCJhc3NlcnRDb3B5TWFwIl0sWyJtYWtlQ29weU1hcCIsIm1ha2VDb3B5TWFwIl0sWyJnZXRDb3B5TWFwRW50cmllcyIsImdldENvcHlNYXBFbnRyaWVzIl1dLCIuL3NyYy9rZXlzL2NvcHlTZXQuanMiOltbImNvZXJjZVRvRWxlbWVudHMiLCJjb2VyY2VUb0VsZW1lbnRzIl1dLCIuL3NyYy9rZXlzL2NvcHlCYWcuanMiOltbImNvZXJjZVRvQmFnRW50cmllcyIsImNvZXJjZVRvQmFnRW50cmllcyJdXSwiLi9zcmMva2V5cy9jb21wYXJlS2V5cy5qcyI6W1siYmFnQ29tcGFyZSIsImJhZ0NvbXBhcmUiXSxbInNldENvbXBhcmUiLCJzZXRDb21wYXJlIl0sWyJjb21wYXJlS2V5cyIsImNvbXBhcmVLZXlzIl0sWyJrZXlMVCIsImtleUxUIl0sWyJrZXlMVEUiLCJrZXlMVEUiXSxbImtleUVRIiwia2V5RVEiXSxbImtleUdURSIsImtleUdURSJdLFsia2V5R1QiLCJrZXlHVCJdXSwiLi9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzIjpbWyJlbGVtZW50c0lzU3VwZXJzZXQiLCJlbGVtZW50c0lzU3VwZXJzZXQiXSxbImVsZW1lbnRzSXNEaXNqb2ludCIsImVsZW1lbnRzSXNEaXNqb2ludCJdLFsiZWxlbWVudHNDb21wYXJlIiwiZWxlbWVudHNDb21wYXJlIl0sWyJlbGVtZW50c1VuaW9uIiwiZWxlbWVudHNVbmlvbiJdLFsiZWxlbWVudHNEaXNqb2ludFVuaW9uIiwiZWxlbWVudHNEaXNqb2ludFVuaW9uIl0sWyJlbGVtZW50c0ludGVyc2VjdGlvbiIsImVsZW1lbnRzSW50ZXJzZWN0aW9uIl0sWyJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiLCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiXSxbInNldElzU3VwZXJzZXQiLCJzZXRJc1N1cGVyc2V0Il0sWyJzZXRJc0Rpc2pvaW50Iiwic2V0SXNEaXNqb2ludCJdLFsic2V0VW5pb24iLCJzZXRVbmlvbiJdLFsic2V0RGlzam9pbnRVbmlvbiIsInNldERpc2pvaW50VW5pb24iXSxbInNldEludGVyc2VjdGlvbiIsInNldEludGVyc2VjdGlvbiJdLFsic2V0RGlzam9pbnRTdWJ0cmFjdCIsInNldERpc2pvaW50U3VidHJhY3QiXV0sIi4vc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qcyI6W1siYmFnSXNTdXBlcmJhZyIsImJhZ0lzU3VwZXJiYWciXSxbImJhZ1VuaW9uIiwiYmFnVW5pb24iXSxbImJhZ0ludGVyc2VjdGlvbiIsImJhZ0ludGVyc2VjdGlvbiJdLFsiYmFnRGlzam9pbnRTdWJ0cmFjdCIsImJhZ0Rpc2pvaW50U3VidHJhY3QiXV0sIi4vc3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qcyI6W1siTSIsIk0iXSxbImdldFJhbmtDb3ZlciIsImdldFJhbmtDb3ZlciJdLFsiaXNQYXR0ZXJuIiwiaXNQYXR0ZXJuIl0sWyJhc3NlcnRQYXR0ZXJuIiwiYXNzZXJ0UGF0dGVybiJdLFsibWF0Y2hlcyIsIm1hdGNoZXMiXSxbIm11c3RNYXRjaCIsIm11c3RNYXRjaCJdLFsiaXNBd2FpdEFyZ0d1YXJkIiwiaXNBd2FpdEFyZ0d1YXJkIl0sWyJhc3NlcnRBd2FpdEFyZ0d1YXJkIiwiYXNzZXJ0QXdhaXRBcmdHdWFyZCJdLFsiaXNSYXdHdWFyZCIsImlzUmF3R3VhcmQiXSxbImFzc2VydFJhd0d1YXJkIiwiYXNzZXJ0UmF3R3VhcmQiXSxbImFzc2VydE1ldGhvZEd1YXJkIiwiYXNzZXJ0TWV0aG9kR3VhcmQiXSxbImFzc2VydEludGVyZmFjZUd1YXJkIiwiYXNzZXJ0SW50ZXJmYWNlR3VhcmQiXSxbImtpbmRPZiIsImtpbmRPZiJdXSwiLi9zcmMvcGF0dGVybnMvZ2V0R3VhcmRQYXlsb2Fkcy5qcyI6W1siZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQiLCJnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZCJdLFsiZ2V0TWV0aG9kR3VhcmRQYXlsb2FkIiwiZ2V0TWV0aG9kR3VhcmRQYXlsb2FkIl0sWyJnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQiLCJnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQiXSxbImdldEludGVyZmFjZU1ldGhvZEtleXMiLCJnZXRJbnRlcmZhY2VNZXRob2RLZXlzIl1dLCJAZW5kby9jb21tb24vbGlzdC1kaWZmZXJlbmNlLmpzIjpbWyJsaXN0RGlmZmVyZW5jZSIsImxpc3REaWZmZXJlbmNlIl1dLCJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyI6W1sib2JqZWN0TWFwIiwib2JqZWN0TWFwIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADMxv08aDIAAGgyAAAqAAAAQGVuZG8vcGF0dGVybnMtdjEuNC44L3NyYy9rZXlzL2NoZWNrS2V5LmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAZW5kby9jb21tb24vaWRlbnQtY2hlY2tlci5qcyIsIkBlbmRvL2Vycm9ycyIsIi4vY29weVNldC5qcyIsIi4vY29weUJhZy5qcyJdLCJleHBvcnRzIjpbImFzc2VydENvcHlCYWciLCJhc3NlcnRDb3B5TWFwIiwiYXNzZXJ0Q29weVNldCIsImFzc2VydEtleSIsImFzc2VydFByaW1pdGl2ZUtleSIsImFzc2VydFNjYWxhcktleSIsImNoZWNrQ29weUJhZyIsImNoZWNrQ29weU1hcCIsImNoZWNrQ29weVNldCIsImNoZWNrS2V5IiwiY2hlY2tTY2FsYXJLZXkiLCJjb3B5TWFwS2V5U2V0IiwiZXZlcnlDb3B5QmFnRW50cnkiLCJldmVyeUNvcHlNYXBLZXkiLCJldmVyeUNvcHlNYXBWYWx1ZSIsImV2ZXJ5Q29weVNldEtleSIsImdldENvcHlCYWdFbnRyaWVzIiwiZ2V0Q29weU1hcEVudHJpZXMiLCJnZXRDb3B5TWFwRW50cnlBcnJheSIsImdldENvcHlNYXBLZXlzIiwiZ2V0Q29weU1hcFZhbHVlcyIsImdldENvcHlTZXRLZXlzIiwiaXNDb3B5QmFnIiwiaXNDb3B5TWFwIiwiaXNDb3B5U2V0IiwiaXNLZXkiLCJpc1ByaW1pdGl2ZUtleSIsImlzU2NhbGFyS2V5IiwibWFrZUNvcHlCYWciLCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyIsIm1ha2VDb3B5TWFwIiwibWFrZUNvcHlTZXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBhc3NlcnRDaGVja2VyLGFzc2VydFBhc3NhYmxlLEZhcixnZXRUYWcsaXNPYmplY3QsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZixjb21wYXJlQW50aVJhbmssbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQsc29ydEJ5UmFuayxpZGVudENoZWNrZXIsWCxxLEZhaWwsY2hlY2tFbGVtZW50cyxtYWtlU2V0T2ZFbGVtZW50cyxjaGVja0JhZ0VudHJpZXMsbWFrZUJhZ09mRW50cmllczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVwiLCBbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRozY9fYSldXSxbXCJGYXJcIiwgWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dLFtcImdldFRhZ1wiLCBbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRozY9fYSA9PiAoaXNPYmplY3QgPSAkaM2PX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjNj19hID0+IChtYWtlVGFnZ2VkID0gJGjNj19hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLCBbJGjNj19hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaM2PX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIiwgWyRozY9fYSA9PiAobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAkaM2PX2EpXV0sW1wic29ydEJ5UmFua1wiLCBbJGjNj19hID0+IChzb3J0QnlSYW5rID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL2lkZW50LWNoZWNrZXIuanNcIiwgW1tcImlkZW50Q2hlY2tlclwiLCBbJGjNj19hID0+IChpZGVudENoZWNrZXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIiwgWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJxXCIsIFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLCBbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9jb3B5U2V0LmpzXCIsIFtbXCJjaGVja0VsZW1lbnRzXCIsIFskaM2PX2EgPT4gKGNoZWNrRWxlbWVudHMgPSAkaM2PX2EpXV0sW1wibWFrZVNldE9mRWxlbWVudHNcIiwgWyRozY9fYSA9PiAobWFrZVNldE9mRWxlbWVudHMgPSAkaM2PX2EpXV1dXSxbXCIuL2NvcHlCYWcuanNcIiwgW1tcImNoZWNrQmFnRW50cmllc1wiLCBbJGjNj19hID0+IChjaGVja0JhZ0VudHJpZXMgPSAkaM2PX2EpXV0sW1wibWFrZUJhZ09mRW50cmllc1wiLCBbJGjNj19hID0+IChtYWtlQmFnT2ZFbnRyaWVzID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLypcblxuXG5cbiAqL1xuXG4vL1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBjaGVja1ByaW1pdGl2ZUtleT0odmFsLGNoZWNrKT0+e1xuaWYoaXNPYmplY3QodmFsKSl7XG5yZXR1cm4oXG5jaGVjayE9PWlkZW50Q2hlY2tlciYmXG5jaGVjayhmYWxzZSxYIGBBICR7cSh0eXBlb2YgdmFsKX0gY2Fubm90IGJlIGEgcHJpbWl0aXZlOiAke3ZhbH1gKSk7XG5cbiB9XG4vL1xuLy9cbmFzc2VydFBhc3NhYmxlKHZhbCk7XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgICAgICAgIGlzUHJpbWl0aXZlS2V5PSh2YWwpPT5jaGVja1ByaW1pdGl2ZUtleSh2YWwsaWRlbnRDaGVja2VyKTskaM2PX29uY2UuaXNQcmltaXRpdmVLZXkoaXNQcmltaXRpdmVLZXkpO1xuaGFyZGVuKGlzUHJpbWl0aXZlS2V5KTtcblxuLypcblxuXG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRQcmltaXRpdmVLZXk9KHZhbCk9PntcbmNoZWNrUHJpbWl0aXZlS2V5KHZhbCxhc3NlcnRDaGVja2VyKTtcbiB9OyRozY9fb25jZS5hc3NlcnRQcmltaXRpdmVLZXkoYXNzZXJ0UHJpbWl0aXZlS2V5KTtcbmhhcmRlbihhc3NlcnRQcmltaXRpdmVLZXkpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCAgICAgICAgY2hlY2tTY2FsYXJLZXk9KHZhbCxjaGVjayk9PntcbmlmKGlzUHJpbWl0aXZlS2V5KHZhbCkpe1xucmV0dXJuIHRydWU7XG4gfVxuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHZhbCk7XG5pZihwYXNzU3R5bGU9PT0ncmVtb3RhYmxlJyl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgQSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIGEgc2NhbGFyIGtleTogJHt2YWx9YCk7XG4gfTtcblxuLypcblxuXG4gKi8kaM2PX29uY2UuY2hlY2tTY2FsYXJLZXkoY2hlY2tTY2FsYXJLZXkpO1xuY29uc3QgICAgICAgIGlzU2NhbGFyS2V5PSh2YWwpPT5jaGVja1NjYWxhcktleSh2YWwsaWRlbnRDaGVja2VyKTskaM2PX29uY2UuaXNTY2FsYXJLZXkoaXNTY2FsYXJLZXkpO1xuaGFyZGVuKGlzU2NhbGFyS2V5KTtcblxuLypcblxuXG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRTY2FsYXJLZXk9KHZhbCk9PntcbmNoZWNrU2NhbGFyS2V5KHZhbCxhc3NlcnRDaGVja2VyKTtcbiB9OyRozY9fb25jZS5hc3NlcnRTY2FsYXJLZXkoYXNzZXJ0U2NhbGFyS2V5KTtcbmhhcmRlbihhc3NlcnRTY2FsYXJLZXkpO1xuXG4vL1xuXG4vL1xuLyogICAgICAgICAgICAgICAgICAgICAgICovXG4vL1xuY29uc3Qga2V5TWVtbz1uZXcgV2Vha1NldCgpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCAgICAgICAgY2hlY2tLZXk9KHZhbCxjaGVjayk9PntcbmlmKCFpc09iamVjdCh2YWwpKXtcbi8vXG4vL1xuYXNzZXJ0UGFzc2FibGUodmFsKTtcbnJldHVybiB0cnVlO1xuIH1cbi8vXG5pZihrZXlNZW1vLmhhcyh2YWwpKXtcbnJldHVybiB0cnVlO1xuIH1cbi8vXG5jb25zdCByZXN1bHQ9Y2hlY2tLZXlJbnRlcm5hbCh2YWwsY2hlY2spO1xuaWYocmVzdWx0KXtcbi8vXG4vL1xuLy9cbmtleU1lbW8uYWRkKHZhbCk7XG4gfVxuLy9cbi8vXG5yZXR1cm4gcmVzdWx0O1xuIH07JGjNj19vbmNlLmNoZWNrS2V5KGNoZWNrS2V5KTtcbmhhcmRlbihjaGVja0tleSk7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGlzS2V5PSh2YWwpPT5jaGVja0tleSh2YWwsaWRlbnRDaGVja2VyKTskaM2PX29uY2UuaXNLZXkoaXNLZXkpO1xuaGFyZGVuKGlzS2V5KTtcblxuLypcblxuXG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRLZXk9KHZhbCk9PntcbmNoZWNrS2V5KHZhbCxhc3NlcnRDaGVja2VyKTtcbiB9OyRozY9fb25jZS5hc3NlcnRLZXkoYXNzZXJ0S2V5KTtcbmhhcmRlbihhc3NlcnRLZXkpO1xuXG4vL1xuXG4vL1xuLy9cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgY29weVNldE1lbW89bmV3IFdlYWtTZXQoKTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGNoZWNrQ29weVNldD0ocyxjaGVjayk9PntcbmlmKGNvcHlTZXRNZW1vLmhhcyhzKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5jb25zdCByZXN1bHQ9XG4ocGFzc1N0eWxlT2Yocyk9PT0ndGFnZ2VkJyYmZ2V0VGFnKHMpPT09J2NvcHlTZXQnfHxcbmNoZWNrKGZhbHNlLFggYE5vdCBhIGNvcHlTZXQ6ICR7c31gKSkmJlxuY2hlY2tFbGVtZW50cyhzLnBheWxvYWQsY2hlY2spJiZcbmNoZWNrS2V5KHMucGF5bG9hZCxjaGVjayk7XG5pZihyZXN1bHQpe1xuY29weVNldE1lbW8uYWRkKHMpO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfTskaM2PX29uY2UuY2hlY2tDb3B5U2V0KGNoZWNrQ29weVNldCk7XG5oYXJkZW4oY2hlY2tDb3B5U2V0KTtcblxuLypcblxuXG4gKi9cbmNvbnN0ICAgICAgICBpc0NvcHlTZXQ9KHMpPT5jaGVja0NvcHlTZXQocyxpZGVudENoZWNrZXIpOyRozY9fb25jZS5pc0NvcHlTZXQoaXNDb3B5U2V0KTtcbmhhcmRlbihpc0NvcHlTZXQpO1xuXG4vKlxuXG5cblxuICovXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0ICAgICAgICBhc3NlcnRDb3B5U2V0PShzKT0+e1xuY2hlY2tDb3B5U2V0KHMsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaM2PX29uY2UuYXNzZXJ0Q29weVNldChhc3NlcnRDb3B5U2V0KTtcbmhhcmRlbihhc3NlcnRDb3B5U2V0KTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGdldENvcHlTZXRLZXlzPShzKT0+e1xuYXNzZXJ0Q29weVNldChzKTtcbnJldHVybiBzLnBheWxvYWQ7XG4gfTskaM2PX29uY2UuZ2V0Q29weVNldEtleXMoZ2V0Q29weVNldEtleXMpO1xuaGFyZGVuKGdldENvcHlTZXRLZXlzKTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCAgICAgICAgZXZlcnlDb3B5U2V0S2V5PShzLGZuKT0+XG5nZXRDb3B5U2V0S2V5cyhzKS5ldmVyeSgoa2V5LGluZGV4KT0+Zm4oa2V5LGluZGV4KSk7JGjNj19vbmNlLmV2ZXJ5Q29weVNldEtleShldmVyeUNvcHlTZXRLZXkpO1xuaGFyZGVuKGV2ZXJ5Q29weVNldEtleSk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQ29weVNldD0oZWxlbWVudEl0ZXIpPT57XG5jb25zdCByZXN1bHQ9bWFrZVNldE9mRWxlbWVudHMoZWxlbWVudEl0ZXIpO1xuYXNzZXJ0Q29weVNldChyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9OyRozY9fb25jZS5tYWtlQ29weVNldChtYWtlQ29weVNldCk7XG5oYXJkZW4obWFrZUNvcHlTZXQpO1xuXG4vL1xuXG4vL1xuLy9cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgY29weUJhZ01lbW89bmV3IFdlYWtTZXQoKTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGNoZWNrQ29weUJhZz0oYixjaGVjayk9PntcbmlmKGNvcHlCYWdNZW1vLmhhcyhiKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5jb25zdCByZXN1bHQ9XG4ocGFzc1N0eWxlT2YoYik9PT0ndGFnZ2VkJyYmZ2V0VGFnKGIpPT09J2NvcHlCYWcnfHxcbmNoZWNrKGZhbHNlLFggYE5vdCBhIGNvcHlCYWc6ICR7Yn1gKSkmJlxuY2hlY2tCYWdFbnRyaWVzKGIucGF5bG9hZCxjaGVjaykmJlxuY2hlY2tLZXkoYi5wYXlsb2FkLGNoZWNrKTtcbmlmKHJlc3VsdCl7XG5jb3B5QmFnTWVtby5hZGQoYik7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9OyRozY9fb25jZS5jaGVja0NvcHlCYWcoY2hlY2tDb3B5QmFnKTtcbmhhcmRlbihjaGVja0NvcHlCYWcpO1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgICAgICAgIGlzQ29weUJhZz0oYik9PmNoZWNrQ29weUJhZyhiLGlkZW50Q2hlY2tlcik7JGjNj19vbmNlLmlzQ29weUJhZyhpc0NvcHlCYWcpO1xuaGFyZGVuKGlzQ29weUJhZyk7XG5cbi8qXG5cblxuXG4gKi9cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgICAgICAgIGFzc2VydENvcHlCYWc9KGIpPT57XG5jaGVja0NvcHlCYWcoYixhc3NlcnRDaGVja2VyKTtcbiB9OyRozY9fb25jZS5hc3NlcnRDb3B5QmFnKGFzc2VydENvcHlCYWcpO1xuaGFyZGVuKGFzc2VydENvcHlCYWcpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCAgICAgICAgZ2V0Q29weUJhZ0VudHJpZXM9KGIpPT57XG5hc3NlcnRDb3B5QmFnKGIpO1xucmV0dXJuIGIucGF5bG9hZDtcbiB9OyRozY9fb25jZS5nZXRDb3B5QmFnRW50cmllcyhnZXRDb3B5QmFnRW50cmllcyk7XG5oYXJkZW4oZ2V0Q29weUJhZ0VudHJpZXMpO1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBldmVyeUNvcHlCYWdFbnRyeT0oYixmbik9PlxuZ2V0Q29weUJhZ0VudHJpZXMoYikuZXZlcnkoKGVudHJ5LGluZGV4KT0+Zm4oZW50cnksaW5kZXgpKTskaM2PX29uY2UuZXZlcnlDb3B5QmFnRW50cnkoZXZlcnlDb3B5QmFnRW50cnkpO1xuaGFyZGVuKGV2ZXJ5Q29weUJhZ0VudHJ5KTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgICAgICAgIG1ha2VDb3B5QmFnPShiYWdFbnRyeUl0ZXIpPT57XG5jb25zdCByZXN1bHQ9bWFrZUJhZ09mRW50cmllcyhiYWdFbnRyeUl0ZXIpO1xuYXNzZXJ0Q29weUJhZyhyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9OyRozY9fb25jZS5tYWtlQ29weUJhZyhtYWtlQ29weUJhZyk7XG5oYXJkZW4obWFrZUNvcHlCYWcpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZUNvcHlCYWdGcm9tRWxlbWVudHM9KGVsZW1lbnRJdGVyKT0+e1xuLy9cbi8vXG5jb25zdCBmdWxsQ29tcGFyZT1tYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuY29uc3Qgc29ydGVkPXNvcnRCeVJhbmsoZWxlbWVudEl0ZXIsZnVsbENvbXBhcmUpO1xuLyogICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBlbnRyaWVzPVtdO1xuZm9yKGxldCBpPTA7aTxzb3J0ZWQubGVuZ3RoOyl7XG5jb25zdCBrPXNvcnRlZFtpXTtcbmxldCBqPWkrMTtcbndoaWxlKGo8c29ydGVkLmxlbmd0aCYmZnVsbENvbXBhcmUoayxzb3J0ZWRbal0pPT09MCl7XG5qKz0xO1xuIH1cbmVudHJpZXMucHVzaChbayxCaWdJbnQoai1pKV0pO1xuaT1qO1xuIH1cbnJldHVybiBtYWtlQ29weUJhZyhlbnRyaWVzKTtcbiB9OyRozY9fb25jZS5tYWtlQ29weUJhZ0Zyb21FbGVtZW50cyhtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyk7XG5oYXJkZW4obWFrZUNvcHlCYWdGcm9tRWxlbWVudHMpO1xuXG4vL1xuXG4vL1xuLy9cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgY29weU1hcE1lbW89bmV3IFdlYWtTZXQoKTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGNoZWNrQ29weU1hcD0obSxjaGVjayk9PntcbmlmKGNvcHlNYXBNZW1vLmhhcyhtKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZighKHBhc3NTdHlsZU9mKG0pPT09J3RhZ2dlZCcmJmdldFRhZyhtKT09PSdjb3B5TWFwJykpe1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYE5vdCBhIGNvcHlNYXA6ICR7bX1gKTtcbiB9XG5jb25zdHtwYXlsb2FkfT1tO1xuaWYocGFzc1N0eWxlT2YocGF5bG9hZCkhPT0nY29weVJlY29yZCcpe1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYEEgY29weU1hcCdzIHBheWxvYWQgbXVzdCBiZSBhIHJlY29yZDogJHttfWApO1xuIH1cbmNvbnN0e2tleXMsdmFsdWVzLC4uLnJlc3R9PXBheWxvYWQ7XG5jb25zdCByZXN1bHQ9XG4ob3duS2V5cyhyZXN0KS5sZW5ndGg9PT0wfHxcbmNoZWNrKFxuZmFsc2UsXG5YIGBBIGNvcHlNYXAncyBwYXlsb2FkIG11c3Qgb25seSBoYXZlIC5rZXlzIGFuZCAudmFsdWVzOiAke219YCkpJiZcblxuY2hlY2tFbGVtZW50cyhrZXlzLGNoZWNrKSYmXG5jaGVja0tleShrZXlzLGNoZWNrKSYmKFxucGFzc1N0eWxlT2YodmFsdWVzKT09PSdjb3B5QXJyYXknfHxcbmNoZWNrKGZhbHNlLFggYEEgY29weU1hcCdzIC52YWx1ZXMgbXVzdCBiZSBhIGNvcHlBcnJheTogJHttfWApKSYmKFxua2V5cy5sZW5ndGg9PT12YWx1ZXMubGVuZ3RofHxcbmNoZWNrKFxuZmFsc2UsXG5YIGBBIGNvcHlNYXAgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBrZXlzIGFuZCB2YWx1ZXM6ICR7bX1gKSk7XG5cbmlmKHJlc3VsdCl7XG5jb3B5TWFwTWVtby5hZGQobSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9OyRozY9fb25jZS5jaGVja0NvcHlNYXAoY2hlY2tDb3B5TWFwKTtcbmhhcmRlbihjaGVja0NvcHlNYXApO1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgICAgICAgIGlzQ29weU1hcD0obSk9PmNoZWNrQ29weU1hcChtLGlkZW50Q2hlY2tlcik7JGjNj19vbmNlLmlzQ29weU1hcChpc0NvcHlNYXApO1xuaGFyZGVuKGlzQ29weU1hcCk7XG5cbi8qXG5cblxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0Q29weU1hcD0obSk9PntcbmNoZWNrQ29weU1hcChtLGFzc2VydENoZWNrZXIpO1xuIH07JGjNj19vbmNlLmFzc2VydENvcHlNYXAoYXNzZXJ0Q29weU1hcCk7XG5oYXJkZW4oYXNzZXJ0Q29weU1hcCk7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGdldENvcHlNYXBLZXlzPShtKT0+e1xuYXNzZXJ0Q29weU1hcChtKTtcbnJldHVybiBtLnBheWxvYWQua2V5cztcbiB9OyRozY9fb25jZS5nZXRDb3B5TWFwS2V5cyhnZXRDb3B5TWFwS2V5cyk7XG5oYXJkZW4oZ2V0Q29weU1hcEtleXMpO1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBnZXRDb3B5TWFwVmFsdWVzPShtKT0+e1xuYXNzZXJ0Q29weU1hcChtKTtcbnJldHVybiBtLnBheWxvYWQudmFsdWVzO1xuIH07JGjNj19vbmNlLmdldENvcHlNYXBWYWx1ZXMoZ2V0Q29weU1hcFZhbHVlcyk7XG5oYXJkZW4oZ2V0Q29weU1hcFZhbHVlcyk7XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBnZXRDb3B5TWFwRW50cnlBcnJheT0obSk9PntcbmFzc2VydENvcHlNYXAobSk7XG5jb25zdHtcbnBheWxvYWQ6e2tleXMsdmFsdWVzfX09XG5tO1xucmV0dXJuIGhhcmRlbihrZXlzLm1hcCgoa2V5LGkpPT5ba2V5LHZhbHVlc1tpXV0pKTtcbiB9OyRozY9fb25jZS5nZXRDb3B5TWFwRW50cnlBcnJheShnZXRDb3B5TWFwRW50cnlBcnJheSk7XG5oYXJkZW4oZ2V0Q29weU1hcEVudHJ5QXJyYXkpO1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBnZXRDb3B5TWFwRW50cmllcz0obSk9PntcbmFzc2VydENvcHlNYXAobSk7XG5jb25zdHtcbnBheWxvYWQ6e2tleXMsdmFsdWVzfX09XG5tO1xuY29uc3R7bGVuZ3RofT0vKiAgICAgICAgICAgICAgICAqL2tleXM7XG5yZXR1cm4gRmFyKCdDb3B5TWFwIGVudHJpZXMgaXRlcmFibGUnLHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5sZXQgaT0wO1xucmV0dXJuIEZhcignQ29weU1hcCBlbnRyaWVzIGl0ZXJhdG9yJyx7XG5uZXh0OigpPT57XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xubGV0IHJlc3VsdDtcbmlmKGk8bGVuZ3RoKXtcbnJlc3VsdD1oYXJkZW4oe2RvbmU6ZmFsc2UsdmFsdWU6W2tleXNbaV0sdmFsdWVzW2ldXX0pO1xuaSs9MTtcbnJldHVybiByZXN1bHQ7XG4gfWVsc2V7XG5yZXN1bHQ9aGFyZGVuKHtkb25lOnRydWUsdmFsdWU6dW5kZWZpbmVkfSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9fSk7XG5cbiB9fSk7XG5cbiB9OyRozY9fb25jZS5nZXRDb3B5TWFwRW50cmllcyhnZXRDb3B5TWFwRW50cmllcyk7XG5oYXJkZW4oZ2V0Q29weU1hcEVudHJpZXMpO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGV2ZXJ5Q29weU1hcEtleT0obSxmbik9PlxuZ2V0Q29weU1hcEtleXMobSkuZXZlcnkoKGtleSxpbmRleCk9PmZuKGtleSxpbmRleCkpOyRozY9fb25jZS5ldmVyeUNvcHlNYXBLZXkoZXZlcnlDb3B5TWFwS2V5KTtcbmhhcmRlbihldmVyeUNvcHlNYXBLZXkpO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGV2ZXJ5Q29weU1hcFZhbHVlPShtLGZuKT0+XG5nZXRDb3B5TWFwVmFsdWVzKG0pLmV2ZXJ5KCh2YWx1ZSxpbmRleCk9PmZuKHZhbHVlLGluZGV4KSk7JGjNj19vbmNlLmV2ZXJ5Q29weU1hcFZhbHVlKGV2ZXJ5Q29weU1hcFZhbHVlKTtcbmhhcmRlbihldmVyeUNvcHlNYXBWYWx1ZSk7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGNvcHlNYXBLZXlTZXQ9KG0pPT5cbi8vXG5tYWtlVGFnZ2VkKCdjb3B5U2V0JyxtLnBheWxvYWQua2V5cyk7JGjNj19vbmNlLmNvcHlNYXBLZXlTZXQoY29weU1hcEtleVNldCk7XG5oYXJkZW4oY29weU1hcEtleVNldCk7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIG1ha2VDb3B5TWFwPShlbnRyaWVzKT0+e1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5jb25zdCBzb3J0ZWRFbnRyaWVzPXNvcnRCeVJhbmsoZW50cmllcyxjb21wYXJlQW50aVJhbmspO1xuY29uc3Qga2V5cz1zb3J0ZWRFbnRyaWVzLm1hcCgoW2ssX3ZdKT0+ayk7XG5jb25zdCB2YWx1ZXM9c29ydGVkRW50cmllcy5tYXAoKFtfayx2XSk9PnYpO1xuY29uc3QgcmVzdWx0PW1ha2VUYWdnZWQoJ2NvcHlNYXAnLHtrZXlzLHZhbHVlc30pO1xuYXNzZXJ0Q29weU1hcChyZXN1bHQpO1xucmV0dXJuIHJlc3VsdDtcbiB9OyRozY9fb25jZS5tYWtlQ29weU1hcChtYWtlQ29weU1hcCk7XG5oYXJkZW4obWFrZUNvcHlNYXApO1xuXG4vL1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBjaGVja0tleUludGVybmFsPSh2YWwsY2hlY2spPT57XG5jb25zdCBjaGVja0l0PShjaGlsZCk9PmNoZWNrS2V5KGNoaWxkLGNoZWNrKTtcblxuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHZhbCk7XG5zd2l0Y2gocGFzc1N0eWxlKXtcbmNhc2UnY29weVJlY29yZCc6e1xuLy9cbnJldHVybiBPYmplY3QudmFsdWVzKHZhbCkuZXZlcnkoY2hlY2tJdCk7XG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbi8vXG5yZXR1cm4gdmFsLmV2ZXJ5KGNoZWNrSXQpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdCB0YWc9Z2V0VGFnKHZhbCk7XG5zd2l0Y2godGFnKXtcbmNhc2UnY29weVNldCc6e1xucmV0dXJuIGNoZWNrQ29weVNldCh2YWwsY2hlY2spO1xuIH1cbmNhc2UnY29weUJhZyc6e1xucmV0dXJuIGNoZWNrQ29weUJhZyh2YWwsY2hlY2spO1xuIH1cbmNhc2UnY29weU1hcCc6e1xucmV0dXJuKFxuY2hlY2tDb3B5TWFwKHZhbCxjaGVjaykmJlxuLy9cbi8vXG4vL1xuZXZlcnlDb3B5TWFwVmFsdWUodmFsLGNoZWNrSXQpKTtcblxuIH1cbmRlZmF1bHQ6e1xucmV0dXJuKFxuY2hlY2shPT1pZGVudENoZWNrZXImJlxuY2hlY2soZmFsc2UsWCBgQSBwYXNzYWJsZSB0YWdnZWQgJHtxKHRhZyl9IGlzIG5vdCBhIGtleTogJHt2YWx9YCkpO1xuXG4gfX1cblxuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG4vL1xucmV0dXJuIHRydWU7XG4gfVxuY2FzZSdlcnJvcic6XG5jYXNlJ3Byb21pc2UnOntcbnJldHVybiBjaGVjayhmYWxzZSxYIGBBICR7cShwYXNzU3R5bGUpfSBjYW5ub3QgYmUgYSBrZXlgKTtcbiB9XG5kZWZhdWx0Ontcbi8vXG4vL1xudGhyb3cgRmFpbCBgdW5leHBlY3RlZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9OiAke3ZhbH1gO1xuIH19XG5cbiB9O1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNQcmltaXRpdmVLZXkiOlsiaXNQcmltaXRpdmVLZXkiXSwiYXNzZXJ0UHJpbWl0aXZlS2V5IjpbImFzc2VydFByaW1pdGl2ZUtleSJdLCJjaGVja1NjYWxhcktleSI6WyJjaGVja1NjYWxhcktleSJdLCJpc1NjYWxhcktleSI6WyJpc1NjYWxhcktleSJdLCJhc3NlcnRTY2FsYXJLZXkiOlsiYXNzZXJ0U2NhbGFyS2V5Il0sImNoZWNrS2V5IjpbImNoZWNrS2V5Il0sImlzS2V5IjpbImlzS2V5Il0sImFzc2VydEtleSI6WyJhc3NlcnRLZXkiXSwiY2hlY2tDb3B5U2V0IjpbImNoZWNrQ29weVNldCJdLCJpc0NvcHlTZXQiOlsiaXNDb3B5U2V0Il0sImFzc2VydENvcHlTZXQiOlsiYXNzZXJ0Q29weVNldCJdLCJnZXRDb3B5U2V0S2V5cyI6WyJnZXRDb3B5U2V0S2V5cyJdLCJldmVyeUNvcHlTZXRLZXkiOlsiZXZlcnlDb3B5U2V0S2V5Il0sIm1ha2VDb3B5U2V0IjpbIm1ha2VDb3B5U2V0Il0sImNoZWNrQ29weUJhZyI6WyJjaGVja0NvcHlCYWciXSwiaXNDb3B5QmFnIjpbImlzQ29weUJhZyJdLCJhc3NlcnRDb3B5QmFnIjpbImFzc2VydENvcHlCYWciXSwiZ2V0Q29weUJhZ0VudHJpZXMiOlsiZ2V0Q29weUJhZ0VudHJpZXMiXSwiZXZlcnlDb3B5QmFnRW50cnkiOlsiZXZlcnlDb3B5QmFnRW50cnkiXSwibWFrZUNvcHlCYWciOlsibWFrZUNvcHlCYWciXSwibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiOlsibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiXSwiY2hlY2tDb3B5TWFwIjpbImNoZWNrQ29weU1hcCJdLCJpc0NvcHlNYXAiOlsiaXNDb3B5TWFwIl0sImFzc2VydENvcHlNYXAiOlsiYXNzZXJ0Q29weU1hcCJdLCJnZXRDb3B5TWFwS2V5cyI6WyJnZXRDb3B5TWFwS2V5cyJdLCJnZXRDb3B5TWFwVmFsdWVzIjpbImdldENvcHlNYXBWYWx1ZXMiXSwiZ2V0Q29weU1hcEVudHJ5QXJyYXkiOlsiZ2V0Q29weU1hcEVudHJ5QXJyYXkiXSwiZ2V0Q29weU1hcEVudHJpZXMiOlsiZ2V0Q29weU1hcEVudHJpZXMiXSwiZXZlcnlDb3B5TWFwS2V5IjpbImV2ZXJ5Q29weU1hcEtleSJdLCJldmVyeUNvcHlNYXBWYWx1ZSI6WyJldmVyeUNvcHlNYXBWYWx1ZSJdLCJjb3B5TWFwS2V5U2V0IjpbImNvcHlNYXBLZXlTZXQiXSwibWFrZUNvcHlNYXAiOlsibWFrZUNvcHlNYXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAZL5Ck0IVAABCFQAALQAAAEBlbmRvL3BhdHRlcm5zLXYxLjQuOC9zcmMva2V5cy9jb21wYXJlS2V5cy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGVuZG8vZXJyb3JzIiwiLi9jaGVja0tleS5qcyIsIi4va2V5Y29sbGVjdGlvbi1vcGVyYXRvcnMuanMiXSwiZXhwb3J0cyI6WyJiYWdDb21wYXJlIiwiY29tcGFyZUtleXMiLCJrZXlFUSIsImtleUdUIiwia2V5R1RFIiwia2V5TFQiLCJrZXlMVEUiLCJzZXRDb21wYXJlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgcGFzc1N0eWxlT2YsZ2V0VGFnLGNvbXBhcmVSYW5rLHJlY29yZE5hbWVzLHJlY29yZFZhbHVlcyx0cml2aWFsQ29tcGFyYXRvcixxLEZhaWwsYXNzZXJ0S2V5LGdldENvcHlCYWdFbnRyaWVzLGdldENvcHlNYXBFbnRyeUFycmF5LGdldENvcHlTZXRLZXlzLG1ha2VDb21wYXJlQ29sbGVjdGlvbjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImdldFRhZ1wiLCBbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wiY29tcGFyZVJhbmtcIiwgWyRozY9fYSA9PiAoY29tcGFyZVJhbmsgPSAkaM2PX2EpXV0sW1wicmVjb3JkTmFtZXNcIiwgWyRozY9fYSA9PiAocmVjb3JkTmFtZXMgPSAkaM2PX2EpXV0sW1wicmVjb3JkVmFsdWVzXCIsIFskaM2PX2EgPT4gKHJlY29yZFZhbHVlcyA9ICRozY9fYSldXSxbXCJ0cml2aWFsQ29tcGFyYXRvclwiLCBbJGjNj19hID0+ICh0cml2aWFsQ29tcGFyYXRvciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLCBbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIiwgWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vY2hlY2tLZXkuanNcIiwgW1tcImFzc2VydEtleVwiLCBbJGjNj19hID0+IChhc3NlcnRLZXkgPSAkaM2PX2EpXV0sW1wiZ2V0Q29weUJhZ0VudHJpZXNcIiwgWyRozY9fYSA9PiAoZ2V0Q29weUJhZ0VudHJpZXMgPSAkaM2PX2EpXV0sW1wiZ2V0Q29weU1hcEVudHJ5QXJyYXlcIiwgWyRozY9fYSA9PiAoZ2V0Q29weU1hcEVudHJ5QXJyYXkgPSAkaM2PX2EpXV0sW1wiZ2V0Q29weVNldEtleXNcIiwgWyRozY9fYSA9PiAoZ2V0Q29weVNldEtleXMgPSAkaM2PX2EpXV1dXSxbXCIuL2tleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzXCIsIFtbXCJtYWtlQ29tcGFyZUNvbGxlY3Rpb25cIiwgWyRozY9fYSA9PiAobWFrZUNvbXBhcmVDb2xsZWN0aW9uID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIHNldENvbXBhcmU9bWFrZUNvbXBhcmVDb2xsZWN0aW9uKFxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbihzKT0+aGFyZGVuKGdldENvcHlTZXRLZXlzKHMpLm1hcCgoa2V5KT0+W2tleSwxXSkpLFxuXG4wLFxudHJpdmlhbENvbXBhcmF0b3IpOyRozY9fb25jZS5zZXRDb21wYXJlKHNldENvbXBhcmUpO1xuXG5oYXJkZW4oc2V0Q29tcGFyZSk7XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBiYWdDb21wYXJlPW1ha2VDb21wYXJlQ29sbGVjdGlvbihcbmdldENvcHlCYWdFbnRyaWVzLFxuMG4sXG50cml2aWFsQ29tcGFyYXRvcik7JGjNj19vbmNlLmJhZ0NvbXBhcmUoYmFnQ29tcGFyZSk7XG5cbmhhcmRlbihiYWdDb21wYXJlKTtcblxuLy9cbi8vXG4vL1xuLy9cbi8qXG5cblxuICovXG5jb25zdCBBQlNFTlQ9U3ltYm9sKCdhYnNlbnQnKTtcbi8qXG5cblxuXG5cblxuXG4gKi9cbi8vXG5jb25zdCBfbWFwQ29tcGFyZT1tYWtlQ29tcGFyZUNvbGxlY3Rpb24oXG5nZXRDb3B5TWFwRW50cnlBcnJheSxcbkFCU0VOVCxcbihsZWZ0VmFsdWUscmlnaHRWYWx1ZSk9PntcbmlmKGxlZnRWYWx1ZT09PUFCU0VOVCYmcmlnaHRWYWx1ZT09PUFCU0VOVCl7XG50aHJvdyBGYWlsIGBJbnRlcm5hbDogVW5leHBlY3RlZCBhYnNlbnQgZW50cnkgcGFpcmA7XG4gfWVsc2UgaWYobGVmdFZhbHVlPT09QUJTRU5UKXtcbnJldHVybi0xO1xuIH1lbHNlIGlmKHJpZ2h0VmFsdWU9PT1BQlNFTlQpe1xucmV0dXJuIDE7XG4gfWVsc2V7XG4vL1xucmV0dXJuIGNvbXBhcmVLZXlzKGxlZnRWYWx1ZSxyaWdodFZhbHVlKTtcbiB9XG4gfSk7XG5cbmhhcmRlbihfbWFwQ29tcGFyZSk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0ICAgICAgICBjb21wYXJlS2V5cz0obGVmdCxyaWdodCk9PntcbmFzc2VydEtleShsZWZ0KTtcbmFzc2VydEtleShyaWdodCk7XG5jb25zdCBsZWZ0U3R5bGU9cGFzc1N0eWxlT2YobGVmdCk7XG5jb25zdCByaWdodFN0eWxlPXBhc3NTdHlsZU9mKHJpZ2h0KTtcbmlmKGxlZnRTdHlsZSE9PXJpZ2h0U3R5bGUpe1xuLy9cbnJldHVybiBOYU47XG4gfVxuc3dpdGNoKGxlZnRTdHlsZSl7XG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ251bGwnOlxuY2FzZSdib29sZWFuJzpcbmNhc2UnYmlnaW50JzpcbmNhc2Unc3RyaW5nJzpcbmNhc2Unc3ltYm9sJzp7XG4vL1xucmV0dXJuIGNvbXBhcmVSYW5rKGxlZnQscmlnaHQpO1xuIH1cbmNhc2UnbnVtYmVyJzp7XG5jb25zdCByYW5rQ29tcD1jb21wYXJlUmFuayhsZWZ0LHJpZ2h0KTtcbmlmKHJhbmtDb21wPT09MCl7XG5yZXR1cm4gMDtcbiB9XG5pZihOdW1iZXIuaXNOYU4obGVmdCl8fE51bWJlci5pc05hTihyaWdodCkpe1xuLy9cbmFzc2VydCghTnVtYmVyLmlzTmFOKGxlZnQpfHwhTnVtYmVyLmlzTmFOKHJpZ2h0KSk7XG5yZXR1cm4gTmFOO1xuIH1cbi8vXG4vL1xucmV0dXJuIHJhbmtDb21wO1xuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG5pZihsZWZ0PT09cmlnaHQpe1xucmV0dXJuIDA7XG4gfVxuLy9cbi8vXG5yZXR1cm4gTmFOO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG4vL1xuLy9cbi8vXG4vL1xuLy9cbmNvbnN0IGxlbj1NYXRoLm1pbihsZWZ0Lmxlbmd0aCxyaWdodC5sZW5ndGgpO1xuZm9yKGxldCBpPTA7aTxsZW47aSs9MSl7XG4vL1xuY29uc3QgcmVzdWx0PWNvbXBhcmVLZXlzKGxlZnRbaV0scmlnaHRbaV0pO1xuaWYocmVzdWx0IT09MCl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbiB9XG4vL1xuLy9cbi8vXG5yZXR1cm4gY29tcGFyZVJhbmsobGVmdC5sZW5ndGgscmlnaHQubGVuZ3RoKTtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbi8vXG4vL1xuY29uc3QgbGVmdE5hbWVzPXJlY29yZE5hbWVzKGxlZnQpO1xuLy9cbmNvbnN0IHJpZ2h0TmFtZXM9cmVjb3JkTmFtZXMocmlnaHQpO1xuXG4vL1xuaWYoIWtleUVRKGxlZnROYW1lcyxyaWdodE5hbWVzKSl7XG4vL1xuLy9cbi8vXG4vL1xuLy9cbnJldHVybiBOYU47XG4gfVxuLy9cbmNvbnN0IGxlZnRWYWx1ZXM9cmVjb3JkVmFsdWVzKGxlZnQsbGVmdE5hbWVzKTtcbi8vXG5jb25zdCByaWdodFZhbHVlcz1yZWNvcmRWYWx1ZXMocmlnaHQscmlnaHROYW1lcyk7XG4vL1xuLy9cbmxldCByZXN1bHQ9MDtcbmZvcihsZXQgaT0wO2k8bGVmdFZhbHVlcy5sZW5ndGg7aSs9MSl7XG5jb25zdCBjb21wPWNvbXBhcmVLZXlzKGxlZnRWYWx1ZXNbaV0scmlnaHRWYWx1ZXNbaV0pO1xuaWYoTnVtYmVyLmlzTmFOKGNvbXApKXtcbnJldHVybiBOYU47XG4gfVxuaWYocmVzdWx0IT09Y29tcCYmY29tcCE9PTApe1xuaWYocmVzdWx0PT09MCl7XG5yZXN1bHQ9Y29tcDtcbiB9ZWxzZXtcbmFzc2VydChcbnJlc3VsdD09PS0xJiZjb21wPT09MXx8cmVzdWx0PT09MSYmY29tcD09PS0xKTtcblxucmV0dXJuIE5hTjtcbiB9XG4gfVxuIH1cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5yZXR1cm4gcmVzdWx0O1xuIH1cbmNhc2UndGFnZ2VkJzp7XG4vL1xuY29uc3QgbGVmdFRhZz1nZXRUYWcobGVmdCk7XG4vL1xuY29uc3QgcmlnaHRUYWc9Z2V0VGFnKHJpZ2h0KTtcbmlmKGxlZnRUYWchPT1yaWdodFRhZyl7XG4vL1xucmV0dXJuIE5hTjtcbiB9XG5zd2l0Y2gobGVmdFRhZyl7XG5jYXNlJ2NvcHlTZXQnOntcbi8vXG5yZXR1cm4gc2V0Q29tcGFyZShsZWZ0LHJpZ2h0KTtcbiB9XG5jYXNlJ2NvcHlCYWcnOntcbi8vXG5yZXR1cm4gYmFnQ29tcGFyZShsZWZ0LHJpZ2h0KTtcbiB9XG5jYXNlJ2NvcHlNYXAnOntcbi8vXG4vL1xudGhyb3cgRmFpbCBgTWFwIGNvbXBhcmlzb24gbm90IHlldCBpbXBsZW1lbnRlZDogJHtsZWZ0fSB2cyAke3JpZ2h0fWA7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGB1bmV4cGVjdGVkIHRhZyAke3EobGVmdFRhZyl9OiAke2xlZnR9YDtcbiB9fVxuXG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGB1bmV4cGVjdGVkIHBhc3NTdHlsZSAke3EobGVmdFN0eWxlKX06ICR7bGVmdH1gO1xuIH19XG5cbiB9OyRozY9fb25jZS5jb21wYXJlS2V5cyhjb21wYXJlS2V5cyk7XG5oYXJkZW4oY29tcGFyZUtleXMpO1xuXG5jb25zdCAgICAgICAga2V5TFQ9KGxlZnQscmlnaHQpPT5jb21wYXJlS2V5cyhsZWZ0LHJpZ2h0KTwwOyRozY9fb25jZS5rZXlMVChrZXlMVCk7XG5oYXJkZW4oa2V5TFQpO1xuXG5jb25zdCAgICAgICAga2V5TFRFPShsZWZ0LHJpZ2h0KT0+Y29tcGFyZUtleXMobGVmdCxyaWdodCk8PTA7JGjNj19vbmNlLmtleUxURShrZXlMVEUpO1xuaGFyZGVuKGtleUxURSk7XG5cbmNvbnN0ICAgICAgICBrZXlFUT0obGVmdCxyaWdodCk9PmNvbXBhcmVLZXlzKGxlZnQscmlnaHQpPT09MDskaM2PX29uY2Uua2V5RVEoa2V5RVEpO1xuaGFyZGVuKGtleUVRKTtcblxuY29uc3QgICAgICAgIGtleUdURT0obGVmdCxyaWdodCk9PmNvbXBhcmVLZXlzKGxlZnQscmlnaHQpPj0wOyRozY9fb25jZS5rZXlHVEUoa2V5R1RFKTtcbmhhcmRlbihrZXlHVEUpO1xuXG5jb25zdCAgICAgICAga2V5R1Q9KGxlZnQscmlnaHQpPT5jb21wYXJlS2V5cyhsZWZ0LHJpZ2h0KT4wOyRozY9fb25jZS5rZXlHVChrZXlHVCk7XG5oYXJkZW4oa2V5R1QpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic2V0Q29tcGFyZSI6WyJzZXRDb21wYXJlIl0sImJhZ0NvbXBhcmUiOlsiYmFnQ29tcGFyZSJdLCJjb21wYXJlS2V5cyI6WyJjb21wYXJlS2V5cyJdLCJrZXlMVCI6WyJrZXlMVCJdLCJrZXlMVEUiOlsia2V5TFRFIl0sImtleUVRIjpbImtleUVRIl0sImtleUdURSI6WyJrZXlHVEUiXSwia2V5R1QiOlsia2V5R1QiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAwFi4RfYNAAD2DQAAKQAAAEBlbmRvL3BhdHRlcm5zLXYxLjQuOC9zcmMva2V5cy9jb3B5QmFnLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJhc3NlcnRCYWdFbnRyaWVzIiwiYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzIiwiY2hlY2tCYWdFbnRyaWVzIiwiY29lcmNlVG9CYWdFbnRyaWVzIiwibWFrZUJhZ09mRW50cmllcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IGFzc2VydENoZWNrZXIsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZixjb21wYXJlQW50aVJhbmssaXNSYW5rU29ydGVkLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbmssWDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wiY29tcGFyZUFudGlSYW5rXCIsIFskaM2PX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRozY9fYSldXSxbXCJpc1JhbmtTb3J0ZWRcIiwgWyRozY9fYSA9PiAoaXNSYW5rU29ydGVkID0gJGjNj19hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsIFskaM2PX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjNj19hKV1dLFtcInNvcnRCeVJhbmtcIiwgWyRozY9fYSA9PiAoc29ydEJ5UmFuayA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLCBbJGjNj19hID0+IChYID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLypcblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBjaGVja05vRHVwbGljYXRlS2V5cz0oYmFnRW50cmllcyxmdWxsQ29tcGFyZSxjaGVjayk9Pntcbi8vXG4vL1xuLy9cbi8vXG5mdWxsQ29tcGFyZT1mdWxsQ29tcGFyZXx8bWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcblxuLy9cbi8vXG4vL1xuYmFnRW50cmllcz1zb3J0QnlSYW5rKGJhZ0VudHJpZXMsZnVsbENvbXBhcmUpO1xuY29uc3R7bGVuZ3RofT1iYWdFbnRyaWVzO1xuZm9yKGxldCBpPTE7aTxsZW5ndGg7aSs9MSl7XG5jb25zdCBrMD1iYWdFbnRyaWVzW2ktMV1bMF07XG5jb25zdCBrMT1iYWdFbnRyaWVzW2ldWzBdO1xuaWYoZnVsbENvbXBhcmUoazAsazEpPT09MCl7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgdmFsdWUgaGFzIGR1cGxpY2F0ZSBrZXlzOiAke2swfWApO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnROb0R1cGxpY2F0ZUtleXM9KGJhZ0VudHJpZXMsZnVsbENvbXBhcmU9dW5kZWZpbmVkKT0+e1xuY2hlY2tOb0R1cGxpY2F0ZUtleXMoYmFnRW50cmllcyxmdWxsQ29tcGFyZSxhc3NlcnRDaGVja2VyKTtcbiB9O1xuXG4vKlxuXG5cblxuICovJGjNj19vbmNlLmFzc2VydE5vRHVwbGljYXRlS2V5cyhhc3NlcnROb0R1cGxpY2F0ZUtleXMpO1xuY29uc3QgICAgICAgIGNoZWNrQmFnRW50cmllcz0oYmFnRW50cmllcyxjaGVjayk9PntcbmlmKHBhc3NTdHlsZU9mKGJhZ0VudHJpZXMpIT09J2NvcHlBcnJheScpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBUaGUgZW50cmllcyBvZiBhIGNvcHlCYWcgbXVzdCBiZSBhIGNvcHlBcnJheTogJHtiYWdFbnRyaWVzfWApO1xuXG4gfVxuaWYoIWlzUmFua1NvcnRlZChiYWdFbnRyaWVzLGNvbXBhcmVBbnRpUmFuaykpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBUaGUgZW50cmllcyBvZiBhIGNvcHlCYWcgbXVzdCBiZSBzb3J0ZWQgaW4gcmV2ZXJzZSByYW5rIG9yZGVyOiAke2JhZ0VudHJpZXN9YCk7XG5cbiB9XG5mb3IoY29uc3QgZW50cnkgb2YgYmFnRW50cmllcyl7XG5pZihcbnBhc3NTdHlsZU9mKGVudHJ5KSE9PSdjb3B5QXJyYXknfHxcbmVudHJ5Lmxlbmd0aCE9PTJ8fFxudHlwZW9mIGVudHJ5WzFdIT09J2JpZ2ludCcpXG57XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYEVhY2ggZW50cnkgb2YgYSBjb3B5QmFnIG11c3QgYmUgcGFpciBvZiBhIGtleSBhbmQgYSBiaWdpbnQgcmVwcmVzZW50aW5nIGEgY291bnQ6ICR7ZW50cnl9YCk7XG5cbiB9XG5pZihlbnRyeVsxXTwxKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgRWFjaCBlbnRyeSBvZiBhIGNvcHlCYWcgbXVzdCBoYXZlIGEgcG9zaXRpdmUgY291bnQ6ICR7ZW50cnl9YCk7XG5cbiB9XG4gfVxuLy9cbnJldHVybiBjaGVja05vRHVwbGljYXRlS2V5cyhiYWdFbnRyaWVzLHVuZGVmaW5lZCxjaGVjayk7XG4gfTskaM2PX29uY2UuY2hlY2tCYWdFbnRyaWVzKGNoZWNrQmFnRW50cmllcyk7XG5oYXJkZW4oY2hlY2tCYWdFbnRyaWVzKTtcblxuLy9cbi8qXG5cblxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0QmFnRW50cmllcz0oYmFnRW50cmllcyk9PntcbmNoZWNrQmFnRW50cmllcyhiYWdFbnRyaWVzLGFzc2VydENoZWNrZXIpO1xuIH07JGjNj19vbmNlLmFzc2VydEJhZ0VudHJpZXMoYXNzZXJ0QmFnRW50cmllcyk7XG5oYXJkZW4oYXNzZXJ0QmFnRW50cmllcyk7XG5cbi8qXG5cblxuICovXG5jb25zdCAgICAgICAgY29lcmNlVG9CYWdFbnRyaWVzPShiYWdFbnRyaWVzTGlzdCk9PntcbmNvbnN0IGJhZ0VudHJpZXM9c29ydEJ5UmFuayhiYWdFbnRyaWVzTGlzdCxjb21wYXJlQW50aVJhbmspO1xuYXNzZXJ0QmFnRW50cmllcyhiYWdFbnRyaWVzKTtcbnJldHVybiBiYWdFbnRyaWVzO1xuIH07JGjNj19vbmNlLmNvZXJjZVRvQmFnRW50cmllcyhjb2VyY2VUb0JhZ0VudHJpZXMpO1xuaGFyZGVuKGNvZXJjZVRvQmFnRW50cmllcyk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQmFnT2ZFbnRyaWVzPShiYWdFbnRyeUl0ZXIpPT5cbm1ha2VUYWdnZWQoJ2NvcHlCYWcnLGNvZXJjZVRvQmFnRW50cmllcyhiYWdFbnRyeUl0ZXIpKTskaM2PX29uY2UubWFrZUJhZ09mRW50cmllcyhtYWtlQmFnT2ZFbnRyaWVzKTtcbmhhcmRlbihtYWtlQmFnT2ZFbnRyaWVzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydE5vRHVwbGljYXRlS2V5cyI6WyJhc3NlcnROb0R1cGxpY2F0ZUtleXMiXSwiY2hlY2tCYWdFbnRyaWVzIjpbImNoZWNrQmFnRW50cmllcyJdLCJhc3NlcnRCYWdFbnRyaWVzIjpbImFzc2VydEJhZ0VudHJpZXMiXSwiY29lcmNlVG9CYWdFbnRyaWVzIjpbImNvZXJjZVRvQmFnRW50cmllcyJdLCJtYWtlQmFnT2ZFbnRyaWVzIjpbIm1ha2VCYWdPZkVudHJpZXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAd54Tg/0LAAD9CwAAKQAAAEBlbmRvL3BhdHRlcm5zLXYxLjQuOC9zcmMva2V5cy9jb3B5U2V0LmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJhc3NlcnRFbGVtZW50cyIsImFzc2VydE5vRHVwbGljYXRlcyIsImNoZWNrRWxlbWVudHMiLCJjb2VyY2VUb0VsZW1lbnRzIiwibWFrZVNldE9mRWxlbWVudHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBhc3NlcnRDaGVja2VyLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsY29tcGFyZUFudGlSYW5rLGlzUmFua1NvcnRlZCxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLFg7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wibWFrZVRhZ2dlZFwiLCBbJGjNj19hID0+IChtYWtlVGFnZ2VkID0gJGjNj19hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLCBbJGjNj19hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaM2PX2EpXV0sW1wiaXNSYW5rU29ydGVkXCIsIFskaM2PX2EgPT4gKGlzUmFua1NvcnRlZCA9ICRozY9fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLCBbJGjNj19hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRozY9fYSldXSxbXCJzb3J0QnlSYW5rXCIsIFskaM2PX2EgPT4gKHNvcnRCeVJhbmsgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIiwgWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgY2hlY2tOb0R1cGxpY2F0ZXM9KGVsZW1lbnRzLGZ1bGxDb21wYXJlLGNoZWNrKT0+e1xuLy9cbi8vXG4vL1xuLy9cbmZ1bGxDb21wYXJlPWZ1bGxDb21wYXJlfHxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuXG5lbGVtZW50cz1zb3J0QnlSYW5rKGVsZW1lbnRzLGZ1bGxDb21wYXJlKTtcbmNvbnN0e2xlbmd0aH09ZWxlbWVudHM7XG5mb3IobGV0IGk9MTtpPGxlbmd0aDtpKz0xKXtcbmNvbnN0IGswPWVsZW1lbnRzW2ktMV07XG5jb25zdCBrMT1lbGVtZW50c1tpXTtcbmlmKGZ1bGxDb21wYXJlKGswLGsxKT09PTApe1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYHZhbHVlIGhhcyBkdXBsaWNhdGUga2V5czogJHtrMH1gKTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0Tm9EdXBsaWNhdGVzPShlbGVtZW50cyxmdWxsQ29tcGFyZT11bmRlZmluZWQpPT57XG5jaGVja05vRHVwbGljYXRlcyhlbGVtZW50cyxmdWxsQ29tcGFyZSxhc3NlcnRDaGVja2VyKTtcbiB9O1xuXG4vKlxuXG5cblxuICovJGjNj19vbmNlLmFzc2VydE5vRHVwbGljYXRlcyhhc3NlcnROb0R1cGxpY2F0ZXMpO1xuY29uc3QgICAgICAgIGNoZWNrRWxlbWVudHM9KGVsZW1lbnRzLGNoZWNrKT0+e1xuaWYocGFzc1N0eWxlT2YoZWxlbWVudHMpIT09J2NvcHlBcnJheScpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBUaGUga2V5cyBvZiBhIGNvcHlTZXQgb3IgY29weU1hcCBtdXN0IGJlIGEgY29weUFycmF5OiAke2VsZW1lbnRzfWApO1xuXG4gfVxuaWYoIWlzUmFua1NvcnRlZChlbGVtZW50cyxjb21wYXJlQW50aVJhbmspKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgVGhlIGtleXMgb2YgYSBjb3B5U2V0IG9yIGNvcHlNYXAgbXVzdCBiZSBzb3J0ZWQgaW4gcmV2ZXJzZSByYW5rIG9yZGVyOiAke2VsZW1lbnRzfWApO1xuXG4gfVxucmV0dXJuIGNoZWNrTm9EdXBsaWNhdGVzKGVsZW1lbnRzLHVuZGVmaW5lZCxjaGVjayk7XG4gfTskaM2PX29uY2UuY2hlY2tFbGVtZW50cyhjaGVja0VsZW1lbnRzKTtcbmhhcmRlbihjaGVja0VsZW1lbnRzKTtcblxuY29uc3QgICAgICAgIGFzc2VydEVsZW1lbnRzPShlbGVtZW50cyk9PntcbmNoZWNrRWxlbWVudHMoZWxlbWVudHMsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaM2PX29uY2UuYXNzZXJ0RWxlbWVudHMoYXNzZXJ0RWxlbWVudHMpO1xuaGFyZGVuKGFzc2VydEVsZW1lbnRzKTtcblxuLypcblxuXG4gKi9cbmNvbnN0ICAgICAgICBjb2VyY2VUb0VsZW1lbnRzPShlbGVtZW50c0xpc3QpPT57XG5jb25zdCBlbGVtZW50cz1zb3J0QnlSYW5rKGVsZW1lbnRzTGlzdCxjb21wYXJlQW50aVJhbmspO1xuYXNzZXJ0RWxlbWVudHMoZWxlbWVudHMpO1xucmV0dXJuIGVsZW1lbnRzO1xuIH07JGjNj19vbmNlLmNvZXJjZVRvRWxlbWVudHMoY29lcmNlVG9FbGVtZW50cyk7XG5oYXJkZW4oY29lcmNlVG9FbGVtZW50cyk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlU2V0T2ZFbGVtZW50cz0oZWxlbWVudEl0ZXIpPT5cbm1ha2VUYWdnZWQoJ2NvcHlTZXQnLGNvZXJjZVRvRWxlbWVudHMoZWxlbWVudEl0ZXIpKTskaM2PX29uY2UubWFrZVNldE9mRWxlbWVudHMobWFrZVNldE9mRWxlbWVudHMpO1xuaGFyZGVuKG1ha2VTZXRPZkVsZW1lbnRzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydE5vRHVwbGljYXRlcyI6WyJhc3NlcnROb0R1cGxpY2F0ZXMiXSwiY2hlY2tFbGVtZW50cyI6WyJjaGVja0VsZW1lbnRzIl0sImFzc2VydEVsZW1lbnRzIjpbImFzc2VydEVsZW1lbnRzIl0sImNvZXJjZVRvRWxlbWVudHMiOlsiY29lcmNlVG9FbGVtZW50cyJdLCJtYWtlU2V0T2ZFbGVtZW50cyI6WyJtYWtlU2V0T2ZFbGVtZW50cyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACTaWSFDxMAAA8TAAA5AAAAQGVuZG8vcGF0dGVybnMtdjEuNC44L3NyYy9rZXlzL2tleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAZW5kby9jb21tb24vbWFrZS1pdGVyYXRvci5qcyIsIkBlbmRvL2NvbW1vbi9tYWtlLWFycmF5LWl0ZXJhdG9yLmpzIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiZ2VuZXJhdGVDb2xsZWN0aW9uUGFpckVudHJpZXMiLCJtYWtlQ29tcGFyZUNvbGxlY3Rpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBhc3NlcnRSYW5rU29ydGVkLGNvbXBhcmVBbnRpUmFuayxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLG1ha2VJdGVyYXRvcixtYWtlQXJyYXlJdGVyYXRvcixxLEZhaWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRSYW5rU29ydGVkXCIsIFskaM2PX2EgPT4gKGFzc2VydFJhbmtTb3J0ZWQgPSAkaM2PX2EpXV0sW1wiY29tcGFyZUFudGlSYW5rXCIsIFskaM2PX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRozY9fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLCBbJGjNj19hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRozY9fYSldXSxbXCJzb3J0QnlSYW5rXCIsIFskaM2PX2EgPT4gKHNvcnRCeVJhbmsgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vbWFrZS1pdGVyYXRvci5qc1wiLCBbW1wibWFrZUl0ZXJhdG9yXCIsIFskaM2PX2EgPT4gKG1ha2VJdGVyYXRvciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9tYWtlLWFycmF5LWl0ZXJhdG9yLmpzXCIsIFtbXCJtYWtlQXJyYXlJdGVyYXRvclwiLCBbJGjNj19hID0+IChtYWtlQXJyYXlJdGVyYXRvciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLCBbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIiwgWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGdlbmVyYXRlRnVsbFNvcnRlZEVudHJpZXM9KGVudHJpZXMscmFua0NvbXBhcmUsZnVsbENvbXBhcmUpPT57XG4vL1xuYXNzZXJ0UmFua1NvcnRlZChlbnRyaWVzLHJhbmtDb21wYXJlKTtcbmNvbnN0e2xlbmd0aH09ZW50cmllcztcbmxldCBpPTA7XG5sZXQgc2FtZVJhbmtJdGVyYXRvcjtcbnJldHVybiBtYWtlSXRlcmF0b3IoKCk9PntcbmlmKHNhbWVSYW5rSXRlcmF0b3Ipe1xuY29uc3QgcmVzdWx0PXNhbWVSYW5rSXRlcmF0b3IubmV4dCgpO1xuaWYoIXJlc3VsdC5kb25lKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuc2FtZVJhbmtJdGVyYXRvcj11bmRlZmluZWQ7XG4gfVxuaWYoaTxsZW5ndGgpe1xuY29uc3QgZW50cnk9ZW50cmllc1tpXTtcbi8vXG5sZXQgaj1pKzE7XG53aGlsZShqPGxlbmd0aCYmcmFua0NvbXBhcmUoZW50cnlbMF0sZW50cmllc1tqXVswXSk9PT0wKXtcbmorPTE7XG4gfVxuaWYoaj09PWkrMSl7XG4vL1xuaT1qO1xucmV0dXJuIGhhcmRlbih7ZG9uZTpmYWxzZSx2YWx1ZTplbnRyeX0pO1xuIH1cbmNvbnN0IHRpZXM9ZW50cmllcy5zbGljZShpLGopO1xuaT1qO1xuXG4vL1xuLy9cbi8vXG5jb25zdCBzb3J0ZWRUaWVzPXNvcnRCeVJhbmsodGllcyxmdWxsQ29tcGFyZSk7XG5mb3IobGV0IGs9MTtrPHNvcnRlZFRpZXMubGVuZ3RoO2srPTEpe1xuLy9cbmNvbnN0W2tleTBdPXNvcnRlZFRpZXNbay0xXTtcbmNvbnN0W2tleTFdPXNvcnRlZFRpZXNba107XG5NYXRoLnNpZ24oZnVsbENvbXBhcmUoa2V5MCxrZXkxKSl8fFxuRmFpbCBgRHVwbGljYXRlIGVudHJ5IGtleTogJHtrZXkwfWA7XG4gfVxuc2FtZVJhbmtJdGVyYXRvcj1tYWtlQXJyYXlJdGVyYXRvcihzb3J0ZWRUaWVzKTtcbnJldHVybiBzYW1lUmFua0l0ZXJhdG9yLm5leHQoKTtcbiB9XG5yZXR1cm4gaGFyZGVuKHtkb25lOnRydWUsdmFsdWU6dW5kZWZpbmVkfSk7XG4gfSk7XG4gfTtcbmhhcmRlbihnZW5lcmF0ZUZ1bGxTb3J0ZWRFbnRyaWVzKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIGdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzPShcbmMxLFxuYzIsXG5nZXRFbnRyaWVzLFxuYWJzZW50VmFsdWUpPT5cbntcbmNvbnN0IGUxPWdldEVudHJpZXMoYzEpO1xuY29uc3QgZTI9Z2V0RW50cmllcyhjMik7XG5cbi8vXG4vL1xuLy9cbmNvbnN0IGZ1bGxDb21wYXJlPW1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5jb25zdCB4PWdlbmVyYXRlRnVsbFNvcnRlZEVudHJpZXMoZTEsY29tcGFyZUFudGlSYW5rLGZ1bGxDb21wYXJlKTtcbmNvbnN0IHk9Z2VuZXJhdGVGdWxsU29ydGVkRW50cmllcyhlMixjb21wYXJlQW50aVJhbmssZnVsbENvbXBhcmUpO1xuXG4vL1xuLy9cbmxldCB4RG9uZTtcbmxldCB4S2V5O1xubGV0IHhWYWx1ZTtcbmxldCB5RG9uZTtcbmxldCB5S2V5O1xubGV0IHlWYWx1ZTtcbmNvbnN0IG5vbkVudHJ5PVt1bmRlZmluZWQsdW5kZWZpbmVkXTtcbmNvbnN0IG5leHRYPSgpPT57XG4heERvbmV8fEZhaWwgYEludGVybmFsOiBuZXh0WCBtdXN0IG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbmNvbnN0IHJlc3VsdD14VmFsdWU7XG4oe2RvbmU6eERvbmUsdmFsdWU6W3hLZXkseFZhbHVlXT1ub25FbnRyeX09eC5uZXh0KCkpO1xucmV0dXJuIHJlc3VsdDtcbiB9O1xubmV4dFgoKTtcbmNvbnN0IG5leHRZPSgpPT57XG4heURvbmV8fEZhaWwgYEludGVybmFsOiBuZXh0WSBtdXN0IG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbmNvbnN0IHJlc3VsdD15VmFsdWU7XG4oe2RvbmU6eURvbmUsdmFsdWU6W3lLZXkseVZhbHVlXT1ub25FbnRyeX09eS5uZXh0KCkpO1xucmV0dXJuIHJlc3VsdDtcbiB9O1xubmV4dFkoKTtcbnJldHVybiBtYWtlSXRlcmF0b3IoKCk9PntcbmxldCBkb25lPWZhbHNlO1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5sZXQgdmFsdWU7XG5pZih4RG9uZSYmeURvbmUpe1xuZG9uZT10cnVlO1xudmFsdWU9W3VuZGVmaW5lZCxhYnNlbnRWYWx1ZSxhYnNlbnRWYWx1ZV07XG4gfWVsc2UgaWYoeERvbmUpe1xudmFsdWU9W3lLZXksYWJzZW50VmFsdWUsbmV4dFkoKV07XG4gfWVsc2UgaWYoeURvbmUpe1xudmFsdWU9W3hLZXksbmV4dFgoKSxhYnNlbnRWYWx1ZV07XG4gfWVsc2V7XG4vL1xuLy9cbmNvbnN0IGNvbXA9ZnVsbENvbXBhcmUoeEtleSx5S2V5KTtcbmlmKGNvbXA9PT0wKXtcbnZhbHVlPVt4S2V5LG5leHRYKCksbmV4dFkoKV07XG4gfWVsc2UgaWYoY29tcDwwKXtcbnZhbHVlPVt4S2V5LG5leHRYKCksYWJzZW50VmFsdWVdO1xuIH1lbHNlIGlmKGNvbXA+MCl7XG52YWx1ZT1beUtleSxhYnNlbnRWYWx1ZSxuZXh0WSgpXTtcbiB9ZWxzZXtcbnRocm93IEZhaWwgYFVuZXhwZWN0ZWQga2V5IGNvbXBhcmlzb24gJHtxKGNvbXApfSBmb3IgJHt4S2V5fSB2cyAke3lLZXl9YDtcbiB9XG4gfVxucmV0dXJuIGhhcmRlbih7ZG9uZSx2YWx1ZX0pO1xuIH0pO1xuIH07JGjNj19vbmNlLmdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzKGdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzKTtcbmhhcmRlbihnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgbWFrZUNvbXBhcmVDb2xsZWN0aW9uPShnZXRFbnRyaWVzLGFic2VudFZhbHVlLGNvbXBhcmVWYWx1ZXMpPT5cbmhhcmRlbigobGVmdCxyaWdodCk9PntcbmNvbnN0IG1lcmdlZD1nZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyhcbmxlZnQsXG5yaWdodCxcbmdldEVudHJpZXMsXG5hYnNlbnRWYWx1ZSk7XG5cbmxldCBsZWZ0SXNCaWdnZXI9ZmFsc2U7XG5sZXQgcmlnaHRJc0JpZ2dlcj1mYWxzZTtcbmZvcihjb25zdFtfa2V5LGxlZnRWYWx1ZSxyaWdodFZhbHVlXW9mIG1lcmdlZCl7XG5jb25zdCBjb21wPWNvbXBhcmVWYWx1ZXMobGVmdFZhbHVlLHJpZ2h0VmFsdWUpO1xuaWYoY29tcD09PTApe1xuLy9cbmNvbnRpbnVlO1xuIH1lbHNlIGlmKGNvbXA8MCl7XG4vL1xucmlnaHRJc0JpZ2dlcj10cnVlO1xuIH1lbHNlIGlmKGNvbXA+MCl7XG4vL1xubGVmdElzQmlnZ2VyPXRydWU7XG4gfWVsc2V7XG5OdW1iZXIuaXNOYU4oY29tcCl8fFxuLy9cbkZhaWwgYFVuZXhwZWN0ZWQgdmFsdWUgY29tcGFyaXNvbiAke3EoY29tcCl9IGZvciAke2xlZnRWYWx1ZX0gdnMgJHtyaWdodFZhbHVlfWA7XG5yZXR1cm4gTmFOO1xuIH1cbmlmKGxlZnRJc0JpZ2dlciYmcmlnaHRJc0JpZ2dlcil7XG5yZXR1cm4gTmFOO1xuIH1cbiB9XG4vL1xucmV0dXJuIGxlZnRJc0JpZ2dlcj8xOnJpZ2h0SXNCaWdnZXI/LTE6MDtcbiB9KTskaM2PX29uY2UubWFrZUNvbXBhcmVDb2xsZWN0aW9uKG1ha2VDb21wYXJlQ29sbGVjdGlvbik7XG5oYXJkZW4obWFrZUNvbXBhcmVDb2xsZWN0aW9uKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzIjpbImdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzIl0sIm1ha2VDb21wYXJlQ29sbGVjdGlvbiI6WyJtYWtlQ29tcGFyZUNvbGxlY3Rpb24iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAlxh8MoEWAACBFgAANQAAAEBlbmRvL3BhdHRlcm5zLXYxLjQuOC9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAZW5kby9lcnJvcnMiLCIuL2NvcHlCYWcuanMiXSwiZXhwb3J0cyI6WyJiYWdEaXNqb2ludFN1YnRyYWN0IiwiYmFnSW50ZXJzZWN0aW9uIiwiYmFnSXNEaXNqb2ludCIsImJhZ0lzU3VwZXJiYWciLCJiYWdVbmlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IGFzc2VydFJhbmtTb3J0ZWQsY29tcGFyZUFudGlSYW5rLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbmsscSxGYWlsLGFzc2VydE5vRHVwbGljYXRlS2V5cyxtYWtlQmFnT2ZFbnRyaWVzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0UmFua1NvcnRlZFwiLCBbJGjNj19hID0+IChhc3NlcnRSYW5rU29ydGVkID0gJGjNj19hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLCBbJGjNj19hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaM2PX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIiwgWyRozY9fYSA9PiAobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAkaM2PX2EpXV0sW1wic29ydEJ5UmFua1wiLCBbJGjNj19hID0+IChzb3J0QnlSYW5rID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsIFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLCBbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9jb3B5QmFnLmpzXCIsIFtbXCJhc3NlcnROb0R1cGxpY2F0ZUtleXNcIiwgWyRozY9fYSA9PiAoYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzID0gJGjNj19hKV1dLFtcIm1ha2VCYWdPZkVudHJpZXNcIiwgWyRozY9fYSA9PiAobWFrZUJhZ09mRW50cmllcyA9ICRozY9fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuLypcblxuXG5cbiAqL1xuXG4vL1xuLy9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgYmFnV2luZG93UmVzb3J0PShiYWdFbnRyaWVzLHJhbmtDb21wYXJlLGZ1bGxDb21wYXJlKT0+e1xuYXNzZXJ0UmFua1NvcnRlZChiYWdFbnRyaWVzLHJhbmtDb21wYXJlKTtcbmNvbnN0e2xlbmd0aH09YmFnRW50cmllcztcbmxldCBpPTA7XG5sZXQgb3B0SW5uZXJJdGVyYXRvcjtcbnJldHVybiBoYXJkZW4oe1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PlxuaGFyZGVuKHtcbm5leHQ6KCk9PntcbmlmKG9wdElubmVySXRlcmF0b3Ipe1xuY29uc3QgcmVzdWx0PW9wdElubmVySXRlcmF0b3IubmV4dCgpO1xuaWYocmVzdWx0LmRvbmUpe1xub3B0SW5uZXJJdGVyYXRvcj11bmRlZmluZWQ7XG4vL1xuIH1lbHNle1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfVxuaWYoaTxsZW5ndGgpe1xuY29uc3QgZW50cnk9YmFnRW50cmllc1tpXTtcbmxldCBqPWkrMTtcbndoaWxlKFxuajxsZW5ndGgmJlxucmFua0NvbXBhcmUoZW50cnlbMF0sYmFnRW50cmllc1tqXVswXSk9PT0wKVxue1xuais9MTtcbiB9XG5pZihqPT09aSsxKXtcbmk9ajtcbnJldHVybiBoYXJkZW4oe2RvbmU6ZmFsc2UsdmFsdWU6ZW50cnl9KTtcbiB9XG5jb25zdCBzaW1pbGFyUnVuPWJhZ0VudHJpZXMuc2xpY2UoaSxqKTtcbmk9ajtcbmNvbnN0IHJlc29ydGVkPXNvcnRCeVJhbmsoc2ltaWxhclJ1bixmdWxsQ29tcGFyZSk7XG4vL1xuLy9cbi8vXG5hc3NlcnROb0R1cGxpY2F0ZUtleXMocmVzb3J0ZWQsZnVsbENvbXBhcmUpO1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5vcHRJbm5lckl0ZXJhdG9yPXJlc29ydGVkW1N5bWJvbC5pdGVyYXRvcl0oKTtcbnJldHVybiBvcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbiB9ZWxzZXtcbnJldHVybiBoYXJkZW4oe2RvbmU6dHJ1ZSx2YWx1ZTpbbnVsbCwwbl19KTtcbiB9XG4gfX0pfSk7XG5cblxuIH07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBtZXJnZT0oeGJhZ0VudHJpZXMseWJhZ0VudHJpZXMpPT57XG4vL1xuLy9cbmNvbnN0IGZ1bGxDb21wYXJlPW1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbmNvbnN0IHhzPWJhZ1dpbmRvd1Jlc29ydCh4YmFnRW50cmllcyxjb21wYXJlQW50aVJhbmssZnVsbENvbXBhcmUpO1xuY29uc3QgeXM9YmFnV2luZG93UmVzb3J0KHliYWdFbnRyaWVzLGNvbXBhcmVBbnRpUmFuayxmdWxsQ29tcGFyZSk7XG5yZXR1cm4gaGFyZGVuKHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG4vL1xuLy9cbi8vXG4vKiAgICAgICAgICAgICovXG5sZXQgeDtcbmxldCB4YztcbmxldCB4RG9uZTtcbi8qICAgICAgICAgICAgKi9cbmxldCB5O1xubGV0IHljO1xubGV0IHlEb25lO1xuXG5jb25zdCB4aT14c1tTeW1ib2wuaXRlcmF0b3JdKCk7XG5jb25zdCBuZXh0WD0oKT0+e1xuIXhEb25lfHxGYWlsIGBJbnRlcm5hbDogbmV4dFggc2hvdWxkIG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbih7XG5kb25lOnhEb25lLFxudmFsdWU6W3gseGNdfT1cbnhpLm5leHQoKSk7XG4gfTtcbm5leHRYKCk7XG5cbmNvbnN0IHlpPXlzW1N5bWJvbC5pdGVyYXRvcl0oKTtcbmNvbnN0IG5leHRZPSgpPT57XG4heURvbmV8fEZhaWwgYEludGVybmFsOiBuZXh0WSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuKHtcbmRvbmU6eURvbmUsXG52YWx1ZTpbeSx5Y119PVxueWkubmV4dCgpKTtcbiB9O1xubmV4dFkoKTtcblxucmV0dXJuIGhhcmRlbih7XG5uZXh0OigpPT57XG4vKiAgICAgICAgICAgICAgICAgICovXG5sZXQgZG9uZT1mYWxzZTtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5sZXQgdmFsdWU7XG5pZih4RG9uZSYmeURvbmUpe1xuZG9uZT10cnVlO1xuLy9cbnZhbHVlPVtudWxsLDBuLDBuXTtcbiB9ZWxzZSBpZih4RG9uZSl7XG4vL1xudmFsdWU9W3ksMG4seWNdO1xubmV4dFkoKTtcbiB9ZWxzZSBpZih5RG9uZSl7XG4vL1xudmFsdWU9W3gseGMsMG5dO1xubmV4dFgoKTtcbiB9ZWxzZXtcbmNvbnN0IGNvbXA9ZnVsbENvbXBhcmUoeCx5KTtcbmlmKGNvbXA9PT0wKXtcbi8vXG52YWx1ZT1beCx4Yyx5Y107XG5uZXh0WCgpO1xubmV4dFkoKTtcbiB9ZWxzZSBpZihjb21wPDApe1xuLy9cbnZhbHVlPVt4LHhjLDBuXTtcbm5leHRYKCk7XG4gfWVsc2V7XG4vL1xuY29tcD4wfHxGYWlsIGBJbnRlcm5hbDogVW5leHBlY3RlZCBjb21wICR7cShjb21wKX1gO1xudmFsdWU9W3ksMG4seWNdO1xubmV4dFkoKTtcbiB9XG4gfVxucmV0dXJuIGhhcmRlbih7ZG9uZSx2YWx1ZX0pO1xuIH19KTtcblxuIH19KTtcblxuIH07XG5oYXJkZW4obWVyZ2UpO1xuXG4vL1xuLy9cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGJhZ0l0ZXJJc1N1cGVyYmFnPSh4eWkpPT57XG5mb3IoY29uc3RbX20seGMseWNdb2YgeHlpKXtcbmlmKHhjPHljKXtcbi8vXG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07XG5cbi8vXG4vL1xuLypcblxuXG5cbiAqL1xuY29uc3QgYmFnSXRlcklzRGlzam9pbnQ9KHh5aSk9PntcbmZvcihjb25zdFtfbSx4Yyx5Y11vZiB4eWkpe1xuaWYoeGM+PTFuJiZ5Yz49MW4pe1xuLy9cbnJldHVybiBmYWxzZTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYmFnSXRlclVuaW9uPSh4eWkpPT57XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG5yZXN1bHQucHVzaChbbSx4Yyt5Y10pO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYmFnSXRlckludGVyc2VjdGlvbj0oeHlpKT0+e1xuLyogICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCByZXN1bHQ9W107XG5mb3IoY29uc3RbbSx4Yyx5Y11vZiB4eWkpe1xuY29uc3QgbWM9eGM8PXljP3hjOnljO1xucmVzdWx0LnB1c2goW20sbWNdKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGJhZ0l0ZXJEaXNqb2ludFN1YnRyYWN0PSh4eWkpPT57XG4vKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG5jb25zdCBtYz14Yy15Yztcbm1jPj0wbnx8RmFpbCBgcmlnaHQgZWxlbWVudCAke219IHdhcyBub3QgaW4gbGVmdGA7XG5pZihtYz49MW4pe1xuLy9cbnJlc3VsdC5wdXNoKFttLG1jXSk7XG4gfVxuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuY29uc3QgbWVyZ2VpZnk9KGJhZ0l0ZXJPcCk9Pih4YmFnRW50cmllcyx5YmFnRW50cmllcyk9PlxuYmFnSXRlck9wKG1lcmdlKHhiYWdFbnRyaWVzLHliYWdFbnRyaWVzKSk7XG5cbmNvbnN0IGJhZ0VudHJpZXNJc1N1cGVyYmFnPW1lcmdlaWZ5KGJhZ0l0ZXJJc1N1cGVyYmFnKTtcbmNvbnN0IGJhZ0VudHJpZXNJc0Rpc2pvaW50PW1lcmdlaWZ5KGJhZ0l0ZXJJc0Rpc2pvaW50KTtcbmNvbnN0IGJhZ0VudHJpZXNVbmlvbj1tZXJnZWlmeShiYWdJdGVyVW5pb24pO1xuY29uc3QgYmFnRW50cmllc0ludGVyc2VjdGlvbj1tZXJnZWlmeShiYWdJdGVySW50ZXJzZWN0aW9uKTtcbmNvbnN0IGJhZ0VudHJpZXNEaXNqb2ludFN1YnRyYWN0PW1lcmdlaWZ5KGJhZ0l0ZXJEaXNqb2ludFN1YnRyYWN0KTtcblxuY29uc3QgcmF3QmFnaWZ5PShiYWdFbnRyaWVzT3ApPT4oeGJhZyx5YmFnKT0+XG5iYWdFbnRyaWVzT3AoeGJhZy5wYXlsb2FkLHliYWcucGF5bG9hZCk7XG5cbmNvbnN0IGJhZ2lmeT0oYmFnRW50cmllc09wKT0+KHhiYWcseWJhZyk9PlxubWFrZUJhZ09mRW50cmllcyhiYWdFbnRyaWVzT3AoeGJhZy5wYXlsb2FkLHliYWcucGF5bG9hZCkpO1xuXG5jb25zdCAgICAgICAgYmFnSXNTdXBlcmJhZz1yYXdCYWdpZnkoYmFnRW50cmllc0lzU3VwZXJiYWcpOyRozY9fb25jZS5iYWdJc1N1cGVyYmFnKGJhZ0lzU3VwZXJiYWcpO1xuY29uc3QgICAgICAgIGJhZ0lzRGlzam9pbnQ9cmF3QmFnaWZ5KGJhZ0VudHJpZXNJc0Rpc2pvaW50KTskaM2PX29uY2UuYmFnSXNEaXNqb2ludChiYWdJc0Rpc2pvaW50KTtcbmNvbnN0ICAgICAgICBiYWdVbmlvbj1iYWdpZnkoYmFnRW50cmllc1VuaW9uKTskaM2PX29uY2UuYmFnVW5pb24oYmFnVW5pb24pO1xuY29uc3QgICAgICAgIGJhZ0ludGVyc2VjdGlvbj1iYWdpZnkoYmFnRW50cmllc0ludGVyc2VjdGlvbik7JGjNj19vbmNlLmJhZ0ludGVyc2VjdGlvbihiYWdJbnRlcnNlY3Rpb24pO1xuY29uc3QgICAgICAgIGJhZ0Rpc2pvaW50U3VidHJhY3Q9YmFnaWZ5KGJhZ0VudHJpZXNEaXNqb2ludFN1YnRyYWN0KTskaM2PX29uY2UuYmFnRGlzam9pbnRTdWJ0cmFjdChiYWdEaXNqb2ludFN1YnRyYWN0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImJhZ0lzU3VwZXJiYWciOlsiYmFnSXNTdXBlcmJhZyJdLCJiYWdJc0Rpc2pvaW50IjpbImJhZ0lzRGlzam9pbnQiXSwiYmFnVW5pb24iOlsiYmFnVW5pb24iXSwiYmFnSW50ZXJzZWN0aW9uIjpbImJhZ0ludGVyc2VjdGlvbiJdLCJiYWdEaXNqb2ludFN1YnRyYWN0IjpbImJhZ0Rpc2pvaW50U3VidHJhY3QiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAANiBppbocAAC6HAAANQAAAEBlbmRvL3BhdHRlcm5zLXYxLjQuOC9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAZW5kby9lcnJvcnMiLCIuL2NvcHlTZXQuanMiXSwiZXhwb3J0cyI6WyJlbGVtZW50c0NvbXBhcmUiLCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiLCJlbGVtZW50c0Rpc2pvaW50VW5pb24iLCJlbGVtZW50c0ludGVyc2VjdGlvbiIsImVsZW1lbnRzSXNEaXNqb2ludCIsImVsZW1lbnRzSXNTdXBlcnNldCIsImVsZW1lbnRzVW5pb24iLCJzZXREaXNqb2ludFN1YnRyYWN0Iiwic2V0RGlzam9pbnRVbmlvbiIsInNldEludGVyc2VjdGlvbiIsInNldElzRGlzam9pbnQiLCJzZXRJc1N1cGVyc2V0Iiwic2V0VW5pb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBhc3NlcnRSYW5rU29ydGVkLGNvbXBhcmVBbnRpUmFuayxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLHEsRmFpbCxhc3NlcnROb0R1cGxpY2F0ZXMsbWFrZVNldE9mRWxlbWVudHM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRSYW5rU29ydGVkXCIsIFskaM2PX2EgPT4gKGFzc2VydFJhbmtTb3J0ZWQgPSAkaM2PX2EpXV0sW1wiY29tcGFyZUFudGlSYW5rXCIsIFskaM2PX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRozY9fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLCBbJGjNj19hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRozY9fYSldXSxbXCJzb3J0QnlSYW5rXCIsIFskaM2PX2EgPT4gKHNvcnRCeVJhbmsgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIiwgWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsIFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL2NvcHlTZXQuanNcIiwgW1tcImFzc2VydE5vRHVwbGljYXRlc1wiLCBbJGjNj19hID0+IChhc3NlcnROb0R1cGxpY2F0ZXMgPSAkaM2PX2EpXV0sW1wibWFrZVNldE9mRWxlbWVudHNcIiwgWyRozY9fYSA9PiAobWFrZVNldE9mRWxlbWVudHMgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG4gKi9cblxuLy9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3Qgd2luZG93UmVzb3J0PShlbGVtZW50cyxyYW5rQ29tcGFyZSxmdWxsQ29tcGFyZSk9PntcbmFzc2VydFJhbmtTb3J0ZWQoZWxlbWVudHMscmFua0NvbXBhcmUpO1xuY29uc3R7bGVuZ3RofT1lbGVtZW50cztcbmxldCBpPTA7XG5sZXQgb3B0SW5uZXJJdGVyYXRvcjtcbnJldHVybiBoYXJkZW4oe1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PlxuaGFyZGVuKHtcbm5leHQ6KCk9PntcbmlmKG9wdElubmVySXRlcmF0b3Ipe1xuY29uc3QgcmVzdWx0PW9wdElubmVySXRlcmF0b3IubmV4dCgpO1xuaWYocmVzdWx0LmRvbmUpe1xub3B0SW5uZXJJdGVyYXRvcj11bmRlZmluZWQ7XG4vL1xuIH1lbHNle1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfVxuaWYoaTxsZW5ndGgpe1xuY29uc3QgdmFsdWU9ZWxlbWVudHNbaV07XG5sZXQgaj1pKzE7XG53aGlsZShqPGxlbmd0aCYmcmFua0NvbXBhcmUodmFsdWUsZWxlbWVudHNbal0pPT09MCl7XG5qKz0xO1xuIH1cbmlmKGo9PT1pKzEpe1xuaT1qO1xucmV0dXJuIGhhcmRlbih7ZG9uZTpmYWxzZSx2YWx1ZX0pO1xuIH1cbmNvbnN0IHNpbWlsYXJSdW49ZWxlbWVudHMuc2xpY2UoaSxqKTtcbmk9ajtcbmNvbnN0IHJlc29ydGVkPXNvcnRCeVJhbmsoc2ltaWxhclJ1bixmdWxsQ29tcGFyZSk7XG4vL1xuLy9cbi8vXG5hc3NlcnROb0R1cGxpY2F0ZXMocmVzb3J0ZWQsZnVsbENvbXBhcmUpO1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5vcHRJbm5lckl0ZXJhdG9yPXJlc29ydGVkW1N5bWJvbC5pdGVyYXRvcl0oKTtcbnJldHVybiBvcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbiB9ZWxzZXtcbnJldHVybiBoYXJkZW4oe2RvbmU6dHJ1ZSx2YWx1ZTpudWxsfSk7XG4gfVxuIH19KX0pO1xuXG5cbiB9O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWVyZ2U9KHhlbGVtZW50cyx5ZWxlbWVudHMpPT57XG4vL1xuLy9cbmNvbnN0IGZ1bGxDb21wYXJlPW1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbmNvbnN0IHhzPXdpbmRvd1Jlc29ydCh4ZWxlbWVudHMsY29tcGFyZUFudGlSYW5rLGZ1bGxDb21wYXJlKTtcbmNvbnN0IHlzPXdpbmRvd1Jlc29ydCh5ZWxlbWVudHMsY29tcGFyZUFudGlSYW5rLGZ1bGxDb21wYXJlKTtcbnJldHVybiBoYXJkZW4oe1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9Pntcbi8vXG4vL1xuLy9cbi8qICAgICAgICAgICAgKi9cbmxldCB4O1xubGV0IHhEb25lO1xuLyogICAgICAgICAgICAqL1xubGV0IHk7XG5sZXQgeURvbmU7XG5cbmNvbnN0IHhpPXhzW1N5bWJvbC5pdGVyYXRvcl0oKTtcbmNvbnN0IG5leHRYPSgpPT57XG4heERvbmV8fEZhaWwgYEludGVybmFsOiBuZXh0WCBzaG91bGQgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuKHtkb25lOnhEb25lLHZhbHVlOnh9PXhpLm5leHQoKSk7XG4gfTtcbm5leHRYKCk7XG5cbmNvbnN0IHlpPXlzW1N5bWJvbC5pdGVyYXRvcl0oKTtcbmNvbnN0IG5leHRZPSgpPT57XG4heURvbmV8fEZhaWwgYEludGVybmFsOiBuZXh0WSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuKHtkb25lOnlEb25lLHZhbHVlOnl9PXlpLm5leHQoKSk7XG4gfTtcbm5leHRZKCk7XG5cbnJldHVybiBoYXJkZW4oe1xubmV4dDooKT0+e1xuLyogICAgICAgICAgICAgICAgICAqL1xubGV0IGRvbmU9ZmFsc2U7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xubGV0IHZhbHVlO1xuaWYoeERvbmUmJnlEb25lKXtcbmRvbmU9dHJ1ZTtcbi8vXG52YWx1ZT1bbnVsbCwwbiwwbl07XG4gfWVsc2UgaWYoeERvbmUpe1xuLy9cbnZhbHVlPVt5LDBuLDFuXTtcbm5leHRZKCk7XG4gfWVsc2UgaWYoeURvbmUpe1xuLy9cbnZhbHVlPVt4LDFuLDBuXTtcbm5leHRYKCk7XG4gfWVsc2V7XG5jb25zdCBjb21wPWZ1bGxDb21wYXJlKHgseSk7XG5pZihjb21wPT09MCl7XG4vL1xudmFsdWU9W3gsMW4sMW5dO1xubmV4dFgoKTtcbm5leHRZKCk7XG4gfWVsc2UgaWYoY29tcDwwKXtcbi8vXG52YWx1ZT1beCwxbiwwbl07XG5uZXh0WCgpO1xuIH1lbHNle1xuLy9cbmNvbXA+MHx8RmFpbCBgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgY29tcCAke3EoY29tcCl9YDtcbnZhbHVlPVt5LDBuLDFuXTtcbm5leHRZKCk7XG4gfVxuIH1cbnJldHVybiBoYXJkZW4oe2RvbmUsdmFsdWV9KTtcbiB9fSk7XG5cbiB9fSk7XG5cbiB9O1xuaGFyZGVuKG1lcmdlKTtcblxuY29uc3QgaXRlcklzU3VwZXJzZXQ9KHh5aSk9PntcbmZvcihjb25zdFtfbSx4YyxfeWNdb2YgeHlpKXtcbmlmKHhjPT09MG4pe1xuLy9cbnJldHVybiBmYWxzZTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgaXRlcklzRGlzam9pbnQ9KHh5aSk9PntcbmZvcihjb25zdFtfbSx4Yyx5Y11vZiB4eWkpe1xuaWYoeGM+PTFuJiZ5Yz49MW4pe1xuLy9cbnJldHVybiBmYWxzZTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgaXRlckNvbXBhcmU9KHh5aSk9PntcbmxldCBsb25lWT1mYWxzZTtcbmxldCBsb25lWD1mYWxzZTtcbmZvcihjb25zdFtfbSx4Yyx5Y11vZiB4eWkpe1xuaWYoeGM9PT0wbil7XG4vL1xubG9uZVk9dHJ1ZTtcbiB9XG5pZih5Yz09PTBuKXtcbi8vXG5sb25lWD10cnVlO1xuIH1cbmlmKGxvbmVYJiZsb25lWSl7XG5yZXR1cm4gTmFOO1xuIH1cbiB9XG5pZihsb25lWCl7XG5yZXR1cm4gMTtcbiB9ZWxzZSBpZihsb25lWSl7XG5yZXR1cm4tMTtcbiB9ZWxzZXtcbiFsb25lWCYmIWxvbmVZfHxcbkZhaWwgYEludGVybmFsOiBVbmV4cGVjdGVkIGxvbmUgcGFpciAke3EoW2xvbmVYLGxvbmVZXSl9YDtcbnJldHVybiAwO1xuIH1cbiB9O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBpdGVyVW5pb249KHh5aSk9PntcbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG5pZih4Yz49MG4pe1xucmVzdWx0LnB1c2gobSk7XG4gfWVsc2V7XG55Yz49MG58fEZhaWwgYEludGVybmFsOiBVbmV4cGVjdGVkIGNvdW50ICR7cSh5Yyl9YDtcbi8vXG4vL1xucmVzdWx0LnB1c2gobSk7XG4gfVxuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgaXRlckRpc2pvaW50VW5pb249KHh5aSk9PntcbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG54Yz09PTBufHx5Yz09PTBufHxGYWlsIGBTZXRzIG11c3Qgbm90IGhhdmUgY29tbW9uIGVsZW1lbnRzOiAke219YDtcbmlmKHhjPj0xbil7XG5yZXN1bHQucHVzaChtKTtcbiB9ZWxzZXtcbnljPj0xbnx8RmFpbCBgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgY291bnQgJHtxKHljKX1gO1xucmVzdWx0LnB1c2gobSk7XG4gfVxuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgaXRlckludGVyc2VjdGlvbj0oeHlpKT0+e1xuY29uc3QgcmVzdWx0PVtdO1xuZm9yKGNvbnN0W20seGMseWNdb2YgeHlpKXtcbmlmKHhjPj0xbiYmeWM+PTFuKXtcbi8vXG5yZXN1bHQucHVzaChtKTtcbiB9XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBpdGVyRGlzam9pbnRTdWJ0cmFjdD0oeHlpKT0+e1xuY29uc3QgcmVzdWx0PVtdO1xuZm9yKGNvbnN0W20seGMseWNdb2YgeHlpKXtcbnhjPj0xbnx8RmFpbCBgcmlnaHQgZWxlbWVudCAke219IHdhcyBub3QgaW4gbGVmdGA7XG5pZih5Yz09PTBuKXtcbi8vXG5yZXN1bHQucHVzaChtKTtcbiB9XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG5jb25zdCBtZXJnZWlmeT0oaXRlck9wKT0+KHhlbGVtZW50cyx5ZWxlbWVudHMpPT5cbml0ZXJPcChtZXJnZSh4ZWxlbWVudHMseWVsZW1lbnRzKSk7XG5cbmNvbnN0ICAgICAgICBlbGVtZW50c0lzU3VwZXJzZXQ9bWVyZ2VpZnkoaXRlcklzU3VwZXJzZXQpOyRozY9fb25jZS5lbGVtZW50c0lzU3VwZXJzZXQoZWxlbWVudHNJc1N1cGVyc2V0KTtcbmNvbnN0ICAgICAgICBlbGVtZW50c0lzRGlzam9pbnQ9bWVyZ2VpZnkoaXRlcklzRGlzam9pbnQpOyRozY9fb25jZS5lbGVtZW50c0lzRGlzam9pbnQoZWxlbWVudHNJc0Rpc2pvaW50KTtcbmNvbnN0ICAgICAgICBlbGVtZW50c0NvbXBhcmU9bWVyZ2VpZnkoaXRlckNvbXBhcmUpOyRozY9fb25jZS5lbGVtZW50c0NvbXBhcmUoZWxlbWVudHNDb21wYXJlKTtcbmNvbnN0ICAgICAgICBlbGVtZW50c1VuaW9uPW1lcmdlaWZ5KGl0ZXJVbmlvbik7JGjNj19vbmNlLmVsZW1lbnRzVW5pb24oZWxlbWVudHNVbmlvbik7XG5jb25zdCAgICAgICAgZWxlbWVudHNEaXNqb2ludFVuaW9uPW1lcmdlaWZ5KGl0ZXJEaXNqb2ludFVuaW9uKTskaM2PX29uY2UuZWxlbWVudHNEaXNqb2ludFVuaW9uKGVsZW1lbnRzRGlzam9pbnRVbmlvbik7XG5jb25zdCAgICAgICAgZWxlbWVudHNJbnRlcnNlY3Rpb249bWVyZ2VpZnkoaXRlckludGVyc2VjdGlvbik7JGjNj19vbmNlLmVsZW1lbnRzSW50ZXJzZWN0aW9uKGVsZW1lbnRzSW50ZXJzZWN0aW9uKTtcbmNvbnN0ICAgICAgICBlbGVtZW50c0Rpc2pvaW50U3VidHJhY3Q9bWVyZ2VpZnkoaXRlckRpc2pvaW50U3VidHJhY3QpOyRozY9fb25jZS5lbGVtZW50c0Rpc2pvaW50U3VidHJhY3QoZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0KTtcblxuY29uc3QgcmF3U2V0aWZ5PShlbGVtZW50c09wKT0+KHhzZXQseXNldCk9PlxuZWxlbWVudHNPcCh4c2V0LnBheWxvYWQseXNldC5wYXlsb2FkKTtcblxuY29uc3Qgc2V0aWZ5PShlbGVtZW50c09wKT0+KHhzZXQseXNldCk9PlxubWFrZVNldE9mRWxlbWVudHMoZWxlbWVudHNPcCh4c2V0LnBheWxvYWQseXNldC5wYXlsb2FkKSk7XG5cbmNvbnN0ICAgICAgICBzZXRJc1N1cGVyc2V0PXJhd1NldGlmeShlbGVtZW50c0lzU3VwZXJzZXQpOyRozY9fb25jZS5zZXRJc1N1cGVyc2V0KHNldElzU3VwZXJzZXQpO1xuY29uc3QgICAgICAgIHNldElzRGlzam9pbnQ9cmF3U2V0aWZ5KGVsZW1lbnRzSXNEaXNqb2ludCk7JGjNj19vbmNlLnNldElzRGlzam9pbnQoc2V0SXNEaXNqb2ludCk7XG5jb25zdCAgICAgICAgc2V0VW5pb249c2V0aWZ5KGVsZW1lbnRzVW5pb24pOyRozY9fb25jZS5zZXRVbmlvbihzZXRVbmlvbik7XG5jb25zdCAgICAgICAgc2V0RGlzam9pbnRVbmlvbj1zZXRpZnkoZWxlbWVudHNEaXNqb2ludFVuaW9uKTskaM2PX29uY2Uuc2V0RGlzam9pbnRVbmlvbihzZXREaXNqb2ludFVuaW9uKTtcbmNvbnN0ICAgICAgICBzZXRJbnRlcnNlY3Rpb249c2V0aWZ5KGVsZW1lbnRzSW50ZXJzZWN0aW9uKTskaM2PX29uY2Uuc2V0SW50ZXJzZWN0aW9uKHNldEludGVyc2VjdGlvbik7XG5jb25zdCAgICAgICAgc2V0RGlzam9pbnRTdWJ0cmFjdD1zZXRpZnkoZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0KTskaM2PX29uY2Uuc2V0RGlzam9pbnRTdWJ0cmFjdChzZXREaXNqb2ludFN1YnRyYWN0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImVsZW1lbnRzSXNTdXBlcnNldCI6WyJlbGVtZW50c0lzU3VwZXJzZXQiXSwiZWxlbWVudHNJc0Rpc2pvaW50IjpbImVsZW1lbnRzSXNEaXNqb2ludCJdLCJlbGVtZW50c0NvbXBhcmUiOlsiZWxlbWVudHNDb21wYXJlIl0sImVsZW1lbnRzVW5pb24iOlsiZWxlbWVudHNVbmlvbiJdLCJlbGVtZW50c0Rpc2pvaW50VW5pb24iOlsiZWxlbWVudHNEaXNqb2ludFVuaW9uIl0sImVsZW1lbnRzSW50ZXJzZWN0aW9uIjpbImVsZW1lbnRzSW50ZXJzZWN0aW9uIl0sImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCI6WyJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiXSwic2V0SXNTdXBlcnNldCI6WyJzZXRJc1N1cGVyc2V0Il0sInNldElzRGlzam9pbnQiOlsic2V0SXNEaXNqb2ludCJdLCJzZXRVbmlvbiI6WyJzZXRVbmlvbiJdLCJzZXREaXNqb2ludFVuaW9uIjpbInNldERpc2pvaW50VW5pb24iXSwic2V0SW50ZXJzZWN0aW9uIjpbInNldEludGVyc2VjdGlvbiJdLCJzZXREaXNqb2ludFN1YnRyYWN0IjpbInNldERpc2pvaW50U3VidHJhY3QiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA5CBlLxwZAAAcGQAANgAAAEBlbmRvL3BhdHRlcm5zLXYxLjQuOC9zcmMvcGF0dGVybnMvZ2V0R3VhcmRQYXlsb2Fkcy5qc3siaW1wb3J0cyI6WyJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyIsIi4vcGF0dGVybk1hdGNoZXJzLmpzIiwiLi4va2V5cy9jaGVja0tleS5qcyJdLCJleHBvcnRzIjpbImdldEF3YWl0QXJnR3VhcmRQYXlsb2FkIiwiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkIiwiZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyIsImdldE1ldGhvZEd1YXJkUGF5bG9hZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IG9iamVjdE1hcCxBcmdHdWFyZExpc3RTaGFwZSxBd2FpdEFyZ0d1YXJkU2hhcGUsSW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGUsSW50ZXJmYWNlR3VhcmRTaGFwZSxNLE1ldGhvZEd1YXJkUGF5bG9hZFNoYXBlLE1ldGhvZEd1YXJkU2hhcGUsUmF3R3VhcmRTaGFwZSxTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSxTeW5jVmFsdWVHdWFyZFNoYXBlLGFzc2VydEF3YWl0QXJnR3VhcmQsbWF0Y2hlcyxtdXN0TWF0Y2gsZ2V0Q29weU1hcEtleXMsbWFrZUNvcHlNYXA7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qc1wiLCBbW1wib2JqZWN0TWFwXCIsIFskaM2PX2EgPT4gKG9iamVjdE1hcCA9ICRozY9fYSldXV1dLFtcIi4vcGF0dGVybk1hdGNoZXJzLmpzXCIsIFtbXCJBcmdHdWFyZExpc3RTaGFwZVwiLCBbJGjNj19hID0+IChBcmdHdWFyZExpc3RTaGFwZSA9ICRozY9fYSldXSxbXCJBd2FpdEFyZ0d1YXJkU2hhcGVcIiwgWyRozY9fYSA9PiAoQXdhaXRBcmdHdWFyZFNoYXBlID0gJGjNj19hKV1dLFtcIkludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlXCIsIFskaM2PX2EgPT4gKEludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlID0gJGjNj19hKV1dLFtcIkludGVyZmFjZUd1YXJkU2hhcGVcIiwgWyRozY9fYSA9PiAoSW50ZXJmYWNlR3VhcmRTaGFwZSA9ICRozY9fYSldXSxbXCJNXCIsIFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wiTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGVcIiwgWyRozY9fYSA9PiAoTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUgPSAkaM2PX2EpXV0sW1wiTWV0aG9kR3VhcmRTaGFwZVwiLCBbJGjNj19hID0+IChNZXRob2RHdWFyZFNoYXBlID0gJGjNj19hKV1dLFtcIlJhd0d1YXJkU2hhcGVcIiwgWyRozY9fYSA9PiAoUmF3R3VhcmRTaGFwZSA9ICRozY9fYSldXSxbXCJTeW5jVmFsdWVHdWFyZExpc3RTaGFwZVwiLCBbJGjNj19hID0+IChTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSA9ICRozY9fYSldXSxbXCJTeW5jVmFsdWVHdWFyZFNoYXBlXCIsIFskaM2PX2EgPT4gKFN5bmNWYWx1ZUd1YXJkU2hhcGUgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0QXdhaXRBcmdHdWFyZFwiLCBbJGjNj19hID0+IChhc3NlcnRBd2FpdEFyZ0d1YXJkID0gJGjNj19hKV1dLFtcIm1hdGNoZXNcIiwgWyRozY9fYSA9PiAobWF0Y2hlcyA9ICRozY9fYSldXSxbXCJtdXN0TWF0Y2hcIiwgWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dXV0sW1wiLi4va2V5cy9jaGVja0tleS5qc1wiLCBbW1wiZ2V0Q29weU1hcEtleXNcIiwgWyRozY9fYSA9PiAoZ2V0Q29weU1hcEtleXMgPSAkaM2PX2EpXV0sW1wibWFrZUNvcHlNYXBcIiwgWyRozY9fYSA9PiAobWFrZUNvcHlNYXAgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cbiAqL1xuXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbi8vXG4vL1xuLy9cblxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vL1xuLy9cbi8vXG4vL1xuXG4vL1xuLy9cbi8vXG5jb25zdCBMZWdhY3lBd2FpdEFyZ0d1YXJkU2hhcGU9aGFyZGVuKHtcbmtsYXNzOidhd2FpdEFyZycsXG5hcmdHdWFyZDpNLnBhdHRlcm4oKX0pO1xuXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZD0oYXdhaXRBcmdHdWFyZCk9PntcbmlmKG1hdGNoZXMoYXdhaXRBcmdHdWFyZCxMZWdhY3lBd2FpdEFyZ0d1YXJkU2hhcGUpKXtcbi8vXG5jb25zdHtrbGFzczpfLC4uLnBheWxvYWR9PWF3YWl0QXJnR3VhcmQ7XG4vL1xucmV0dXJuIHBheWxvYWQ7XG4gfVxuYXNzZXJ0QXdhaXRBcmdHdWFyZChhd2FpdEFyZ0d1YXJkKTtcbnJldHVybiBhd2FpdEFyZ0d1YXJkLnBheWxvYWQ7XG4gfTskaM2PX29uY2UuZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQoZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQpO1xuaGFyZGVuKGdldEF3YWl0QXJnR3VhcmRQYXlsb2FkKTtcblxuLy9cbi8vXG4vL1xuY29uc3QgTGVnYWN5U3luY01ldGhvZEd1YXJkU2hhcGU9TS5zcGxpdFJlY29yZChcbntcbmtsYXNzOidtZXRob2RHdWFyZCcsXG5jYWxsS2luZDonc3luYycsXG5hcmdHdWFyZHM6U3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUsXG5yZXR1cm5HdWFyZDpTeW5jVmFsdWVHdWFyZFNoYXBlfSxcblxue1xub3B0aW9uYWxBcmdHdWFyZHM6U3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUsXG5yZXN0QXJnR3VhcmQ6U3luY1ZhbHVlR3VhcmRTaGFwZX0pO1xuXG5cblxuLy9cbi8vXG4vL1xuY29uc3QgTGVnYWN5QXJnR3VhcmRTaGFwZT1NLm9yKFxuUmF3R3VhcmRTaGFwZSxcbkF3YWl0QXJnR3VhcmRTaGFwZSxcbkxlZ2FjeUF3YWl0QXJnR3VhcmRTaGFwZSxcbk0ucGF0dGVybigpKTtcblxuLy9cbi8vXG4vL1xuY29uc3QgTGVnYWN5QXJnR3VhcmRMaXN0U2hhcGU9TS5hcnJheU9mKExlZ2FjeUFyZ0d1YXJkU2hhcGUpO1xuXG4vL1xuLy9cbi8vXG5jb25zdCBMZWdhY3lBc3luY01ldGhvZEd1YXJkU2hhcGU9TS5zcGxpdFJlY29yZChcbntcbmtsYXNzOidtZXRob2RHdWFyZCcsXG5jYWxsS2luZDonYXN5bmMnLFxuYXJnR3VhcmRzOkxlZ2FjeUFyZ0d1YXJkTGlzdFNoYXBlLFxucmV0dXJuR3VhcmQ6U3luY1ZhbHVlR3VhcmRTaGFwZX0sXG5cbntcbm9wdGlvbmFsQXJnR3VhcmRzOkFyZ0d1YXJkTGlzdFNoYXBlLFxucmVzdEFyZ0d1YXJkOlN5bmNWYWx1ZUd1YXJkU2hhcGV9KTtcblxuXG5cbi8vXG4vL1xuLy9cbmNvbnN0IExlZ2FjeU1ldGhvZEd1YXJkU2hhcGU9TS5vcihcbkxlZ2FjeVN5bmNNZXRob2RHdWFyZFNoYXBlLFxuTGVnYWN5QXN5bmNNZXRob2RHdWFyZFNoYXBlKTtcblxuXG5jb25zdCBhZGFwdExlZ2FjeUFyZ0d1YXJkPShhcmdHdWFyZCk9PlxubWF0Y2hlcyhhcmdHdWFyZCxMZWdhY3lBd2FpdEFyZ0d1YXJkU2hhcGUpP1xuTS5hd2FpdChnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZChhcmdHdWFyZCkuYXJnR3VhcmQpOlxuYXJnR3VhcmQ7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgZ2V0TWV0aG9kR3VhcmRQYXlsb2FkPShtZXRob2RHdWFyZCk9PntcbmlmKG1hdGNoZXMobWV0aG9kR3VhcmQsTWV0aG9kR3VhcmRTaGFwZSkpe1xucmV0dXJuIG1ldGhvZEd1YXJkLnBheWxvYWQ7XG4gfVxubXVzdE1hdGNoKG1ldGhvZEd1YXJkLExlZ2FjeU1ldGhvZEd1YXJkU2hhcGUsJ2xlZ2FjeU1ldGhvZEd1YXJkJyk7XG5jb25zdHtcbi8vXG5rbGFzczpfLFxuLy9cbmNhbGxLaW5kLFxuLy9cbnJldHVybkd1YXJkLFxuLy9cbnJlc3RBcmdHdWFyZH09XG5tZXRob2RHdWFyZDtcbmxldHtcbi8vXG5hcmdHdWFyZHMsXG4vL1xub3B0aW9uYWxBcmdHdWFyZHN9PVxubWV0aG9kR3VhcmQ7XG5pZihjYWxsS2luZD09PSdhc3luYycpe1xuYXJnR3VhcmRzPWFyZ0d1YXJkcy5tYXAoYWRhcHRMZWdhY3lBcmdHdWFyZCk7XG5vcHRpb25hbEFyZ0d1YXJkcz1cbm9wdGlvbmFsQXJnR3VhcmRzJiZvcHRpb25hbEFyZ0d1YXJkcy5tYXAoYWRhcHRMZWdhY3lBcmdHdWFyZCk7XG4gfVxuY29uc3QgcGF5bG9hZD1oYXJkZW4oe1xuY2FsbEtpbmQsXG5hcmdHdWFyZHMsXG5vcHRpb25hbEFyZ0d1YXJkcyxcbnJlc3RBcmdHdWFyZCxcbnJldHVybkd1YXJkfSk7XG5cbi8vXG5tdXN0TWF0Y2gocGF5bG9hZCxNZXRob2RHdWFyZFBheWxvYWRTaGFwZSwnaW50ZXJuYWxNZXRob2RHdWFyZEFkYXB0b3InKTtcbnJldHVybiBwYXlsb2FkO1xuIH07JGjNj19vbmNlLmdldE1ldGhvZEd1YXJkUGF5bG9hZChnZXRNZXRob2RHdWFyZFBheWxvYWQpO1xuaGFyZGVuKGdldE1ldGhvZEd1YXJkUGF5bG9hZCk7XG5cbi8vXG4vL1xuLy9cbmNvbnN0IExlZ2FjeUludGVyZmFjZUd1YXJkU2hhcGU9TS5zcGxpdFJlY29yZChcbntcbmtsYXNzOidJbnRlcmZhY2UnLFxuaW50ZXJmYWNlTmFtZTpNLnN0cmluZygpLFxubWV0aG9kR3VhcmRzOk0ucmVjb3JkT2YoXG5NLnN0cmluZygpLFxuTS5vcihNZXRob2RHdWFyZFNoYXBlLExlZ2FjeU1ldGhvZEd1YXJkU2hhcGUpKX0sXG5cblxue1xuZGVmYXVsdEd1YXJkczpNLm9yKE0udW5kZWZpbmVkKCksJ3Bhc3NhYmxlJywncmF3JyksXG5zbG9wcHk6TS5ib29sZWFuKCksXG4vL1xuLy9cbi8vXG5zeW1ib2xNZXRob2RHdWFyZHM6TS5tYXBPZihNLnN5bWJvbCgpLE1ldGhvZEd1YXJkU2hhcGUpfSk7XG5cblxuXG5jb25zdCBhZGFwdE1ldGhvZEd1YXJkPShtZXRob2RHdWFyZCk9PntcbmlmKG1hdGNoZXMobWV0aG9kR3VhcmQsTGVnYWN5TWV0aG9kR3VhcmRTaGFwZSkpe1xuY29uc3R7XG5jYWxsS2luZCxcbmFyZ0d1YXJkcyxcbm9wdGlvbmFsQXJnR3VhcmRzPVtdLFxucmVzdEFyZ0d1YXJkPU0uYW55KCksXG5yZXR1cm5HdWFyZH09XG5nZXRNZXRob2RHdWFyZFBheWxvYWQobWV0aG9kR3VhcmQpO1xuY29uc3QgbUNhbGw9Y2FsbEtpbmQ9PT0nc3luYyc/TS5jYWxsOk0uY2FsbFdoZW47XG5yZXR1cm4gbUNhbGwoLi4uYXJnR3VhcmRzKS5cbm9wdGlvbmFsKC4uLm9wdGlvbmFsQXJnR3VhcmRzKS5cbnJlc3QocmVzdEFyZ0d1YXJkKS5cbnJldHVybnMocmV0dXJuR3VhcmQpO1xuIH1cbnJldHVybiBtZXRob2RHdWFyZDtcbiB9O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkPShpbnRlcmZhY2VHdWFyZCk9PntcbmlmKG1hdGNoZXMoaW50ZXJmYWNlR3VhcmQsSW50ZXJmYWNlR3VhcmRTaGFwZSkpe1xucmV0dXJuIGludGVyZmFjZUd1YXJkLnBheWxvYWQ7XG4gfVxubXVzdE1hdGNoKGludGVyZmFjZUd1YXJkLExlZ2FjeUludGVyZmFjZUd1YXJkU2hhcGUsJ2xlZ2FjeUludGVyZmFjZUd1YXJkJyk7XG4vL1xuLy9cbmxldHtrbGFzczpfLGludGVyZmFjZU5hbWUsbWV0aG9kR3VhcmRzLC4uLnJlc3R9PWludGVyZmFjZUd1YXJkO1xubWV0aG9kR3VhcmRzPW9iamVjdE1hcChtZXRob2RHdWFyZHMsYWRhcHRNZXRob2RHdWFyZCk7XG5jb25zdCBwYXlsb2FkPWhhcmRlbih7XG5pbnRlcmZhY2VOYW1lLFxubWV0aG9kR3VhcmRzLFxuLi4ucmVzdH0pO1xuXG5tdXN0TWF0Y2goXG5wYXlsb2FkLFxuSW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGUsXG4naW50ZXJuYWxJbnRlcmZhY2VHdWFyZEFkYXB0b3InKTtcblxucmV0dXJuIHBheWxvYWQ7XG4gfTskaM2PX29uY2UuZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkKGdldEludGVyZmFjZUd1YXJkUGF5bG9hZCk7XG5oYXJkZW4oZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkKTtcblxuY29uc3QgZW1wdHlDb3B5TWFwPW1ha2VDb3B5TWFwKFtdKTtcblxuLypcblxuXG4gKi9cbmNvbnN0ICAgICAgICBnZXRJbnRlcmZhY2VNZXRob2RLZXlzPShpbnRlcmZhY2VHdWFyZCk9PntcbmNvbnN0e21ldGhvZEd1YXJkcyxzeW1ib2xNZXRob2RHdWFyZHM9ZW1wdHlDb3B5TWFwfT1cbmdldEludGVyZmFjZUd1YXJkUGF5bG9hZChpbnRlcmZhY2VHdWFyZCk7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vL1xuLy9cbnJldHVybiBoYXJkZW4oW1xuLi4uUmVmbGVjdC5vd25LZXlzKG1ldGhvZEd1YXJkcyksXG4uLi5nZXRDb3B5TWFwS2V5cyhzeW1ib2xNZXRob2RHdWFyZHMpXSk7XG5cbiB9OyRozY9fb25jZS5nZXRJbnRlcmZhY2VNZXRob2RLZXlzKGdldEludGVyZmFjZU1ldGhvZEtleXMpO1xuaGFyZGVuKGdldEludGVyZmFjZU1ldGhvZEtleXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQiOlsiZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQiXSwiZ2V0TWV0aG9kR3VhcmRQYXlsb2FkIjpbImdldE1ldGhvZEd1YXJkUGF5bG9hZCJdLCJnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQiOlsiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkIl0sImdldEludGVyZmFjZU1ldGhvZEtleXMiOlsiZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACo3re+960AAPetAAA1AAAAQGVuZG8vcGF0dGVybnMtdjEuNC44L3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL2NvbW1vbi9pZGVudC1jaGVja2VyLmpzIiwiQGVuZG8vY29tbW9uL2FwcGx5LWxhYmVsaW5nLWVycm9yLmpzIiwiQGVuZG8vY29tbW9uL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiLCJAZW5kby9jb21tb24vbGlzdC1kaWZmZXJlbmNlLmpzIiwiQGVuZG8vZXJyb3JzIiwiLi4va2V5cy9jb21wYXJlS2V5cy5qcyIsIi4uL2tleXMvY2hlY2tLZXkuanMiLCIuLi9rZXlzL2tleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzIl0sImV4cG9ydHMiOlsiQXJnR3VhcmRMaXN0U2hhcGUiLCJBd2FpdEFyZ0d1YXJkU2hhcGUiLCJJbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZSIsIkludGVyZmFjZUd1YXJkU2hhcGUiLCJNIiwiTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUiLCJNZXRob2RHdWFyZFNoYXBlIiwiUmF3R3VhcmRTaGFwZSIsIlN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlIiwiU3luY1ZhbHVlR3VhcmRTaGFwZSIsImFzc2VydEF3YWl0QXJnR3VhcmQiLCJhc3NlcnRJbnRlcmZhY2VHdWFyZCIsImFzc2VydE1ldGhvZEd1YXJkIiwiYXNzZXJ0UGF0dGVybiIsImFzc2VydFJhd0d1YXJkIiwiY2hlY2tNYXRjaGVzIiwiZGVmYXVsdExpbWl0cyIsImdldFJhbmtDb3ZlciIsImlzQXdhaXRBcmdHdWFyZCIsImlzUGF0dGVybiIsImlzUmF3R3VhcmQiLCJraW5kT2YiLCJtYXRjaGVzIiwibXVzdE1hdGNoIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgYXNzZXJ0Q2hlY2tlcixGYXIsZ2V0VGFnLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsaGFzT3duUHJvcGVydHlPZixuYW1lRm9yUGFzc2FibGVTeW1ib2wsY29tcGFyZVJhbmssZ2V0UGFzc1N0eWxlQ292ZXIsaW50ZXJzZWN0UmFua0NvdmVycyx1bmlvblJhbmtDb3ZlcnMscmVjb3JkTmFtZXMscmVjb3JkVmFsdWVzLGlkZW50Q2hlY2tlcixhcHBseUxhYmVsaW5nRXJyb3IsZnJvbVVuaXF1ZUVudHJpZXMsbGlzdERpZmZlcmVuY2UscSxiLFgsRmFpbCxtYWtlRXJyb3IsYW5ub3RhdGVFcnJvcixrZXlFUSxrZXlHVCxrZXlHVEUsa2V5TFQsa2V5TFRFLGFzc2VydEtleSxjaGVja0tleSxpc0tleSxjaGVja1NjYWxhcktleSxjaGVja0NvcHlTZXQsY2hlY2tDb3B5TWFwLGNvcHlNYXBLZXlTZXQsY2hlY2tDb3B5QmFnLGdldENvcHlNYXBFbnRyeUFycmF5LG1ha2VDb3B5TWFwLGdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcIkZhclwiLCBbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wiZ2V0VGFnXCIsIFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjNj19hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjNj19hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLCBbJGjNj19hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV0sW1wiY29tcGFyZVJhbmtcIiwgWyRozY9fYSA9PiAoY29tcGFyZVJhbmsgPSAkaM2PX2EpXV0sW1wiZ2V0UGFzc1N0eWxlQ292ZXJcIiwgWyRozY9fYSA9PiAoZ2V0UGFzc1N0eWxlQ292ZXIgPSAkaM2PX2EpXV0sW1wiaW50ZXJzZWN0UmFua0NvdmVyc1wiLCBbJGjNj19hID0+IChpbnRlcnNlY3RSYW5rQ292ZXJzID0gJGjNj19hKV1dLFtcInVuaW9uUmFua0NvdmVyc1wiLCBbJGjNj19hID0+ICh1bmlvblJhbmtDb3ZlcnMgPSAkaM2PX2EpXV0sW1wicmVjb3JkTmFtZXNcIiwgWyRozY9fYSA9PiAocmVjb3JkTmFtZXMgPSAkaM2PX2EpXV0sW1wicmVjb3JkVmFsdWVzXCIsIFskaM2PX2EgPT4gKHJlY29yZFZhbHVlcyA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9pZGVudC1jaGVja2VyLmpzXCIsIFtbXCJpZGVudENoZWNrZXJcIiwgWyRozY9fYSA9PiAoaWRlbnRDaGVja2VyID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL2FwcGx5LWxhYmVsaW5nLWVycm9yLmpzXCIsIFtbXCJhcHBseUxhYmVsaW5nRXJyb3JcIiwgWyRozY9fYSA9PiAoYXBwbHlMYWJlbGluZ0Vycm9yID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL2Zyb20tdW5pcXVlLWVudHJpZXMuanNcIiwgW1tcImZyb21VbmlxdWVFbnRyaWVzXCIsIFskaM2PX2EgPT4gKGZyb21VbmlxdWVFbnRyaWVzID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qc1wiLCBbW1wibGlzdERpZmZlcmVuY2VcIiwgWyRozY9fYSA9PiAobGlzdERpZmZlcmVuY2UgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIiwgWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJiXCIsIFskaM2PX2EgPT4gKGIgPSAkaM2PX2EpXV0sW1wiWFwiLCBbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIkZhaWxcIiwgWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJtYWtlRXJyb3JcIiwgWyRozY9fYSA9PiAobWFrZUVycm9yID0gJGjNj19hKV1dLFtcImFubm90YXRlRXJyb3JcIiwgWyRozY9fYSA9PiAoYW5ub3RhdGVFcnJvciA9ICRozY9fYSldXV1dLFtcIi4uL2tleXMvY29tcGFyZUtleXMuanNcIiwgW1tcImtleUVRXCIsIFskaM2PX2EgPT4gKGtleUVRID0gJGjNj19hKV1dLFtcImtleUdUXCIsIFskaM2PX2EgPT4gKGtleUdUID0gJGjNj19hKV1dLFtcImtleUdURVwiLCBbJGjNj19hID0+IChrZXlHVEUgPSAkaM2PX2EpXV0sW1wia2V5TFRcIiwgWyRozY9fYSA9PiAoa2V5TFQgPSAkaM2PX2EpXV0sW1wia2V5TFRFXCIsIFskaM2PX2EgPT4gKGtleUxURSA9ICRozY9fYSldXV1dLFtcIi4uL2tleXMvY2hlY2tLZXkuanNcIiwgW1tcImFzc2VydEtleVwiLCBbJGjNj19hID0+IChhc3NlcnRLZXkgPSAkaM2PX2EpXV0sW1wiY2hlY2tLZXlcIiwgWyRozY9fYSA9PiAoY2hlY2tLZXkgPSAkaM2PX2EpXV0sW1wiaXNLZXlcIiwgWyRozY9fYSA9PiAoaXNLZXkgPSAkaM2PX2EpXV0sW1wiY2hlY2tTY2FsYXJLZXlcIiwgWyRozY9fYSA9PiAoY2hlY2tTY2FsYXJLZXkgPSAkaM2PX2EpXV0sW1wiY2hlY2tDb3B5U2V0XCIsIFskaM2PX2EgPT4gKGNoZWNrQ29weVNldCA9ICRozY9fYSldXSxbXCJjaGVja0NvcHlNYXBcIiwgWyRozY9fYSA9PiAoY2hlY2tDb3B5TWFwID0gJGjNj19hKV1dLFtcImNvcHlNYXBLZXlTZXRcIiwgWyRozY9fYSA9PiAoY29weU1hcEtleVNldCA9ICRozY9fYSldXSxbXCJjaGVja0NvcHlCYWdcIiwgWyRozY9fYSA9PiAoY2hlY2tDb3B5QmFnID0gJGjNj19hKV1dLFtcImdldENvcHlNYXBFbnRyeUFycmF5XCIsIFskaM2PX2EgPT4gKGdldENvcHlNYXBFbnRyeUFycmF5ID0gJGjNj19hKV1dLFtcIm1ha2VDb3B5TWFwXCIsIFskaM2PX2EgPT4gKG1ha2VDb3B5TWFwID0gJGjNj19hKV1dXV0sW1wiLi4va2V5cy9rZXljb2xsZWN0aW9uLW9wZXJhdG9ycy5qc1wiLCBbW1wiZ2VuZXJhdGVDb2xsZWN0aW9uUGFpckVudHJpZXNcIiwgWyRozY9fYSA9PiAoZ2VuZXJhdGVDb2xsZWN0aW9uUGFpckVudHJpZXMgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuICovXG5cbmNvbnN0e2VudHJpZXMsdmFsdWVzfT1PYmplY3Q7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBwYXR0ZXJuTWVtbz1uZXcgV2Vha1NldCgpO1xuXG4vL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmxldCBNTTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBkZWZhdWx0TGltaXRzPWhhcmRlbih7XG5kZWNpbWFsRGlnaXRzTGltaXQ6MTAwLFxuc3RyaW5nTGVuZ3RoTGltaXQ6MTAwXzAwMCxcbnN5bWJvbE5hbWVMZW5ndGhMaW1pdDoxMDAsXG5udW1Qcm9wZXJ0aWVzTGltaXQ6ODAsXG5wcm9wZXJ0eU5hbWVMZW5ndGhMaW1pdDoxMDAsXG5hcnJheUxlbmd0aExpbWl0OjEwXzAwMCxcbm51bVNldEVsZW1lbnRzTGltaXQ6MTBfMDAwLFxubnVtVW5pcXVlQmFnRWxlbWVudHNMaW1pdDoxMF8wMDAsXG5udW1NYXBFbnRyaWVzTGltaXQ6NTAwMH0pO1xuXG5cbi8qXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuZGVmYXVsdExpbWl0cyhkZWZhdWx0TGltaXRzKTtcbmNvbnN0IGxpbWl0PShsaW1pdHM9e30pPT5cbi8qICAgICAgICAgICAgICAgICAgICAqL2hhcmRlbih7X19wcm90b19fOmRlZmF1bHRMaW1pdHMsLi4ubGltaXRzfSk7XG5cbmNvbnN0IGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0PShcbnBheWxvYWQsXG5tYWluUGF5bG9hZFNoYXBlLFxuY2hlY2ssXG5sYWJlbCk9Plxue1xuYXNzZXJ0KEFycmF5LmlzQXJyYXkobWFpblBheWxvYWRTaGFwZSkpO1xuaWYoIUFycmF5LmlzQXJyYXkocGF5bG9hZCkpe1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYCR7cShsYWJlbCl9IHBheWxvYWQgbXVzdCBiZSBhbiBhcnJheTogJHtwYXlsb2FkfWApO1xuIH1cblxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbmNvbnN0IG1haW5MZW5ndGg9bWFpblBheWxvYWRTaGFwZS5sZW5ndGg7XG5pZighKHBheWxvYWQubGVuZ3RoPT09bWFpbkxlbmd0aHx8cGF5bG9hZC5sZW5ndGg9PT1tYWluTGVuZ3RoKzEpKXtcbnJldHVybiBjaGVjayhmYWxzZSxYIGAke3EobGFiZWwpfSBwYXlsb2FkIHVuZXhwZWN0ZWQgc2l6ZTogJHtwYXlsb2FkfWApO1xuIH1cbmNvbnN0IGxpbWl0cz1wYXlsb2FkW21haW5MZW5ndGhdO1xucGF5bG9hZD1oYXJkZW4ocGF5bG9hZC5zbGljZSgwLG1haW5MZW5ndGgpKTtcbi8vXG5pZighY2hlY2tNYXRjaGVzKHBheWxvYWQsbWFpblBheWxvYWRTaGFwZSxjaGVjayxsYWJlbCkpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmlmKGxpbWl0cz09PXVuZGVmaW5lZCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4oXG4ocGFzc1N0eWxlT2YobGltaXRzKT09PSdjb3B5UmVjb3JkJ3x8XG5jaGVjayhmYWxzZSxYIGBMaW1pdHMgbXVzdCBiZSBhIHJlY29yZDogJHtxKGxpbWl0cyl9YCkpJiZcbmVudHJpZXMobGltaXRzKS5ldmVyeShcbihba2V5LHZhbHVlXSk9PlxucGFzc1N0eWxlT2YodmFsdWUpPT09J251bWJlcid8fFxuY2hlY2soZmFsc2UsWCBgVmFsdWUgb2YgbGltaXQgJHtxKGtleSl9IGJ1dCBiZSBhIG51bWJlcjogJHtxKHZhbHVlKX1gKSkpO1xuXG5cbiB9O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBjaGVja0RlY2ltYWxEaWdpdHNMaW1pdD0oc3BlY2ltZW4sZGVjaW1hbERpZ2l0c0xpbWl0LGNoZWNrKT0+e1xuaWYoXG5NYXRoLmZsb29yKE1hdGgubG9nMTAoTWF0aC5hYnMoTnVtYmVyKHNwZWNpbWVuKSkpKSsxPD1cbmRlY2ltYWxEaWdpdHNMaW1pdClcbntcbnJldHVybiB0cnVlO1xuIH1cbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgYmlnaW50ICR7c3BlY2ltZW59IG11c3Qgbm90IGhhdmUgbW9yZSB0aGFuICR7ZGVjaW1hbERpZ2l0c0xpbWl0fSBkaWdpdHNgKTtcblxuIH07XG5cbi8qXG5cbiAqL1xuY29uc3QgbWFrZVBhdHRlcm5LaXQ9KCk9Pntcbi8qXG5cblxuXG5cblxuICAgKi9cbmNvbnN0IG1heWJlTWF0Y2hIZWxwZXI9KHRhZyk9PlxuLy9cbkhlbHBlcnNCeU1hdGNoVGFnW3RhZ107XG5cbi8qXG5cblxuXG5cblxuXG4gICAqL1xuY29uc3QgbWF5YmVQYXlsb2FkU2hhcGU9KHRhZyk9PlxuLy9cbkd1YXJkUGF5bG9hZFNoYXBlc1t0YWddO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHNpbmdsZXRvbktpbmRzPW5ldyBNYXAoW1xuWydudWxsJyxudWxsXSxcblsndW5kZWZpbmVkJyx1bmRlZmluZWRdXSk7XG5cblxuLypcblxuXG5cbiAgICovXG5jb25zdCB0YWdNZW1vPW5ldyBXZWFrTWFwKCk7XG5cbi8qXG5cblxuXG5cblxuXG5cbiAgICovXG5jb25zdCBjaGVja1RhZ2dlZD0odGFnZ2VkLHRhZyxjaGVjayk9PntcbmNvbnN0IG1hdGNoSGVscGVyPW1heWJlTWF0Y2hIZWxwZXIodGFnKTtcbmlmKG1hdGNoSGVscGVyKXtcbi8vXG4vL1xucmV0dXJuIG1hdGNoSGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkKHRhZ2dlZC5wYXlsb2FkLGNoZWNrKTtcbiB9ZWxzZXtcbmNvbnN0IHBheWxvYWRTaGFwZT1tYXliZVBheWxvYWRTaGFwZSh0YWcpO1xuaWYocGF5bG9hZFNoYXBlIT09dW5kZWZpbmVkKXtcbi8vXG5yZXR1cm4gY2hlY2tNYXRjaGVzKHRhZ2dlZC5wYXlsb2FkLHBheWxvYWRTaGFwZSxjaGVjayx0YWcpO1xuIH1cbiB9XG5zd2l0Y2godGFnKXtcbmNhc2UnY29weVNldCc6e1xucmV0dXJuIGNoZWNrQ29weVNldCh0YWdnZWQsY2hlY2spO1xuIH1cbmNhc2UnY29weUJhZyc6e1xucmV0dXJuIGNoZWNrQ29weUJhZyh0YWdnZWQsY2hlY2spO1xuIH1cbmNhc2UnY29weU1hcCc6e1xucmV0dXJuIGNoZWNrQ29weU1hcCh0YWdnZWQsY2hlY2spO1xuIH1cbmRlZmF1bHQ6e1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBjYW5ub3QgY2hlY2sgdW5yZWNvZ25pemVkIHRhZyAke3EodGFnKX06ICR7dGFnZ2VkfWApO1xuXG4gfX1cblxuIH07XG5cbi8qXG5cblxuXG5cblxuXG5cbiAgICovXG5jb25zdCBraW5kT2Y9KHNwZWNpbWVuLGNoZWNrPWlkZW50Q2hlY2tlcik9PntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihzcGVjaW1lbik7XG5pZihwYXNzU3R5bGUhPT0ndGFnZ2VkJyl7XG5yZXR1cm4gcGFzc1N0eWxlO1xuIH1cbi8vXG4vL1xuLy9cbmlmKHRhZ01lbW8uaGFzKHNwZWNpbWVuKSl7XG5yZXR1cm4gdGFnTWVtby5nZXQoc3BlY2ltZW4pO1xuIH1cbmNvbnN0IHRhZz1nZXRUYWcoc3BlY2ltZW4pO1xuaWYoY2hlY2tUYWdnZWQoc3BlY2ltZW4sdGFnLGNoZWNrKSl7XG50YWdNZW1vLnNldChzcGVjaW1lbix0YWcpO1xucmV0dXJuIHRhZztcbiB9XG5pZihjaGVjayE9PWlkZW50Q2hlY2tlcil7XG5jaGVjayhmYWxzZSxYIGBjYW5ub3QgY2hlY2sgdW5yZWNvZ25pemVkIHRhZyAke3EodGFnKX1gKTtcbiB9XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH07XG5oYXJkZW4oa2luZE9mKTtcblxuLypcblxuXG5cblxuXG5cblxuICAgKi9cbmNvbnN0IGNoZWNrS2luZD0oc3BlY2ltZW4sa2luZCxjaGVjayk9Pntcbi8vXG5pZihzaW5nbGV0b25LaW5kcy5oYXMoa2luZCkpe1xuLy9cbnJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbixzaW5nbGV0b25LaW5kcy5nZXQoa2luZCksY2hlY2spO1xuIH1cblxuY29uc3QgcmVhbEtpbmQ9a2luZE9mKHNwZWNpbWVuLGNoZWNrKTtcbmlmKGtpbmQ9PT1yZWFsS2luZCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihjaGVjayE9PWlkZW50Q2hlY2tlcil7XG4vL1xuLy9cbmNoZWNrKGZhbHNlLFggYCR7YihyZWFsS2luZCl9ICR7c3BlY2ltZW59IC0gTXVzdCBiZSBhICR7YihraW5kKX1gKTtcbiB9XG5yZXR1cm4gZmFsc2U7XG4gfTtcblxuLypcblxuXG5cblxuXG5cbiAgICovXG5jb25zdCBpc0tpbmQ9KHNwZWNpbWVuLGtpbmQpPT5jaGVja0tpbmQoc3BlY2ltZW4sa2luZCxpZGVudENoZWNrZXIpO1xuXG4vKlxuXG5cblxuXG4gICAqL1xuY29uc3QgY2hlY2tBc0tleVBhdHQ9KHNwZWNpbWVuLGtleUFzUGF0dGVybixjaGVjayk9PntcbmlmKGlzS2V5KHNwZWNpbWVuKSYma2V5RVEoc3BlY2ltZW4sa2V5QXNQYXR0ZXJuKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4oXG5jaGVjayE9PWlkZW50Q2hlY2tlciYmXG4vL1xuLy9cbmNoZWNrKGZhbHNlLFggYCR7c3BlY2ltZW59IC0gTXVzdCBiZTogJHtrZXlBc1BhdHRlcm59YCkpO1xuXG4gfTtcblxuLy9cblxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBjaGVja1BhdHRlcm49KHBhdHQsY2hlY2spPT57XG5pZihpc0tleShwYXR0KSl7XG4vL1xuLy9cbi8vXG4vL1xucmV0dXJuIHRydWU7XG4gfVxuaWYocGF0dGVybk1lbW8uaGFzKHBhdHQpKXtcbnJldHVybiB0cnVlO1xuIH1cbi8vXG5jb25zdCByZXN1bHQ9Y2hlY2tQYXR0ZXJuSW50ZXJuYWwocGF0dCxjaGVjayk7XG5pZihyZXN1bHQpe1xucGF0dGVybk1lbW8uYWRkKHBhdHQpO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuLypcblxuXG5cblxuICAgKi9cbmNvbnN0IGNoZWNrUGF0dGVybkludGVybmFsPShwYXR0LGNoZWNrKT0+e1xuLy9cbi8vXG4vL1xuY29uc3QgY2hlY2tJdD0oY2hpbGQpPT5jaGVja1BhdHRlcm4oY2hpbGQsY2hlY2spO1xuXG5jb25zdCBraW5kPWtpbmRPZihwYXR0LGNoZWNrKTtcbnN3aXRjaChraW5kKXtcbmNhc2UgdW5kZWZpbmVkOntcbnJldHVybiBmYWxzZTtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbi8vXG4vL1xucmV0dXJuIHZhbHVlcyhwYXR0KS5ldmVyeShjaGVja0l0KTtcbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xuLy9cbi8vXG5yZXR1cm4gcGF0dC5ldmVyeShjaGVja0l0KTtcbiB9XG5jYXNlJ2NvcHlNYXAnOntcbi8vXG4vL1xuLy9cbnJldHVybiBjaGVja1BhdHRlcm4ocGF0dC52YWx1ZXMsY2hlY2spO1xuIH1cbmNhc2UnZXJyb3InOlxuY2FzZSdwcm9taXNlJzp7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgQSAke3Eoa2luZCl9IGNhbm5vdCBiZSBhIHBhdHRlcm5gKTtcbiB9XG5kZWZhdWx0OntcbmlmKG1heWJlTWF0Y2hIZWxwZXIoa2luZCkhPT11bmRlZmluZWQpe1xucmV0dXJuIHRydWU7XG4gfVxucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBBIHBhc3NhYmxlIG9mIGtpbmQgJHtxKGtpbmQpfSBpcyBub3QgYSBwYXR0ZXJuOiAke3BhdHR9YCk7XG5cbiB9fVxuXG4gfTtcblxuLypcblxuXG4gICAqL1xuY29uc3QgaXNQYXR0ZXJuPShwYXR0KT0+Y2hlY2tQYXR0ZXJuKHBhdHQsaWRlbnRDaGVja2VyKTtcblxuLypcblxuICAgKi9cbmNvbnN0IGFzc2VydFBhdHRlcm49KHBhdHQpPT57XG5jaGVja1BhdHRlcm4ocGF0dCxhc3NlcnRDaGVja2VyKTtcbiB9O1xuXG4vL1xuXG4vKlxuXG5cblxuXG5cbiAgICovXG5jb25zdCBjaGVja01hdGNoZXM9KHNwZWNpbWVuLHBhdHRlcm4sY2hlY2ssbGFiZWw9dW5kZWZpbmVkKT0+XG4vL1xuYXBwbHlMYWJlbGluZ0Vycm9yKGNoZWNrTWF0Y2hlc0ludGVybmFsLFtzcGVjaW1lbixwYXR0ZXJuLGNoZWNrXSxsYWJlbCk7XG5cbi8qXG5cblxuXG5cbiAgICovXG5jb25zdCBjaGVja01hdGNoZXNJbnRlcm5hbD0oc3BlY2ltZW4scGF0dCxjaGVjayk9Pntcbi8vXG5jb25zdCBwYXR0ZXJuS2luZD1raW5kT2YocGF0dCxjaGVjayk7XG5jb25zdCBzcGVjaW1lbktpbmQ9a2luZE9mKHNwZWNpbWVuKTsvL1xuc3dpdGNoKHBhdHRlcm5LaW5kKXtcbmNhc2UgdW5kZWZpbmVkOntcbnJldHVybiBGYWlsIGBwYXR0ZXJuIGV4cGVjdGVkOiAke3BhdHR9YDtcbiB9XG5jYXNlJ3Byb21pc2UnOntcbnJldHVybiBGYWlsIGBwcm9taXNlcyBjYW5ub3QgYmUgcGF0dGVybnM6ICR7cGF0dH1gO1xuIH1cbmNhc2UnZXJyb3InOntcbnJldHVybiBGYWlsIGBlcnJvcnMgY2Fubm90IGJlIHBhdHRlcm5zOiAke3BhdHR9YDtcbiB9XG5jYXNlJ3VuZGVmaW5lZCc6XG5jYXNlJ251bGwnOlxuY2FzZSdib29sZWFuJzpcbmNhc2UnbnVtYmVyJzpcbmNhc2UnYmlnaW50JzpcbmNhc2Unc3RyaW5nJzpcbmNhc2Unc3ltYm9sJzpcbmNhc2UnY29weVNldCc6XG5jYXNlJ2NvcHlCYWcnOlxuY2FzZSdyZW1vdGFibGUnOntcbi8vXG5yZXR1cm4gY2hlY2tBc0tleVBhdHQoc3BlY2ltZW4scGF0dCxjaGVjayk7XG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbmlmKGlzS2V5KHBhdHQpKXtcbi8vXG4vL1xucmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLHBhdHQsY2hlY2spO1xuIH1cbmlmKHNwZWNpbWVuS2luZCE9PSdjb3B5QXJyYXknKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIGEgY29weUFycmF5IHRvIG1hdGNoIGEgY29weUFycmF5IHBhdHRlcm46ICR7cShcbnBhdHQpXG4gfWApO1xuXG4gfVxuY29uc3R7bGVuZ3RofT1wYXR0O1xuaWYoc3BlY2ltZW4ubGVuZ3RoIT09bGVuZ3RoKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgQXJyYXkgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIGFzIGxvbmcgYXMgY29weUFycmF5IHBhdHRlcm46ICR7cShcbnBhdHQpXG4gfWApO1xuXG4gfVxucmV0dXJuIHBhdHQuZXZlcnkoKHAsaSk9PmNoZWNrTWF0Y2hlcyhzcGVjaW1lbltpXSxwLGNoZWNrLGkpKTtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbmlmKGlzS2V5KHBhdHQpKXtcbi8vXG4vL1xucmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLHBhdHQsY2hlY2spO1xuIH1cbmlmKHNwZWNpbWVuS2luZCE9PSdjb3B5UmVjb3JkJyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBhIGNvcHlSZWNvcmQgdG8gbWF0Y2ggYSBjb3B5UmVjb3JkIHBhdHRlcm46ICR7cShcbnBhdHQpXG4gfWApO1xuXG4gfVxuLy9cbi8vXG4vL1xuLy9cbi8vXG5jb25zdCBzcGVjaW1lbk5hbWVzPXJlY29yZE5hbWVzKHNwZWNpbWVuKTtcbmNvbnN0IHBhdHROYW1lcz1yZWNvcmROYW1lcyhwYXR0KTtcbmNvbnN0IG1pc3Npbmc9bGlzdERpZmZlcmVuY2UocGF0dE5hbWVzLHNwZWNpbWVuTmFtZXMpO1xuaWYobWlzc2luZy5sZW5ndGg+PTEpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGAke3NwZWNpbWVufSAtIE11c3QgaGF2ZSBtaXNzaW5nIHByb3BlcnRpZXMgJHtxKG1pc3NpbmcpfWApO1xuXG4gfVxuY29uc3QgdW5leHBlY3RlZD1saXN0RGlmZmVyZW5jZShzcGVjaW1lbk5hbWVzLHBhdHROYW1lcyk7XG5pZih1bmV4cGVjdGVkLmxlbmd0aD49MSl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBub3QgaGF2ZSB1bmV4cGVjdGVkIHByb3BlcnRpZXM6ICR7cShcbnVuZXhwZWN0ZWQpXG4gfWApO1xuXG4gfVxuY29uc3Qgc3BlY2ltZW5WYWx1ZXM9cmVjb3JkVmFsdWVzKHNwZWNpbWVuLHNwZWNpbWVuTmFtZXMpO1xuY29uc3QgcGF0dFZhbHVlcz1yZWNvcmRWYWx1ZXMocGF0dCxwYXR0TmFtZXMpO1xucmV0dXJuIHBhdHROYW1lcy5ldmVyeSgobGFiZWwsaSk9PlxuY2hlY2tNYXRjaGVzKHNwZWNpbWVuVmFsdWVzW2ldLHBhdHRWYWx1ZXNbaV0sY2hlY2ssbGFiZWwpKTtcblxuIH1cbmNhc2UnY29weU1hcCc6e1xuaWYoaXNLZXkocGF0dCkpe1xuLy9cbi8vXG5yZXR1cm4gY2hlY2tBc0tleVBhdHQoc3BlY2ltZW4scGF0dCxjaGVjayk7XG4gfVxuaWYoc3BlY2ltZW5LaW5kIT09J2NvcHlNYXAnKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIGEgY29weU1hcCB0byBtYXRjaCBhIGNvcHlNYXAgcGF0dGVybjogJHtxKFxucGF0dClcbiB9YCk7XG5cbiB9XG4vL1xuY29uc3QgcGF0dEtleVNldD1jb3B5TWFwS2V5U2V0KHBhdHQpO1xuY29uc3Qgc3BlY2ltZW5LZXlTZXQ9Y29weU1hcEtleVNldChzcGVjaW1lbik7XG5pZighY2hlY2tNYXRjaGVzKHNwZWNpbWVuS2V5U2V0LHBhdHRLZXlTZXQsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG4vL1xuLy9cbi8vXG5jb25zdCBwYXR0VmFsdWVzPVtdO1xuY29uc3Qgc3BlY2ltZW5WYWx1ZXM9W107XG5jb25zdCBlbnRyeVBhaXJzPWdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzKFxucGF0dCxcbnNwZWNpbWVuLFxuZ2V0Q29weU1hcEVudHJ5QXJyYXksXG51bmRlZmluZWQpO1xuXG5mb3IoY29uc3RbX2tleSxwYXR0VmFsdWUsc3BlY2ltZW5WYWx1ZV1vZiBlbnRyeVBhaXJzKXtcbnBhdHRWYWx1ZXMucHVzaChwYXR0VmFsdWUpO1xuc3BlY2ltZW5WYWx1ZXMucHVzaChzcGVjaW1lblZhbHVlKTtcbiB9XG5yZXR1cm4gY2hlY2tNYXRjaGVzKGhhcmRlbihzcGVjaW1lblZhbHVlcyksaGFyZGVuKHBhdHRWYWx1ZXMpLGNoZWNrKTtcbiB9XG5kZWZhdWx0OntcbmNvbnN0IG1hdGNoSGVscGVyPW1heWJlTWF0Y2hIZWxwZXIocGF0dGVybktpbmQpO1xuaWYobWF0Y2hIZWxwZXIpe1xucmV0dXJuIG1hdGNoSGVscGVyLmNoZWNrTWF0Y2hlcyhzcGVjaW1lbixwYXR0LnBheWxvYWQsY2hlY2spO1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBzaG91bGQgaGF2ZSByZWNvZ25pemVkICR7cShwYXR0ZXJuS2luZCl9IGA7XG4gfX1cblxuIH07XG5cbi8qXG5cblxuXG4gICAqL1xuY29uc3QgbWF0Y2hlcz0oc3BlY2ltZW4scGF0dCk9PlxuY2hlY2tNYXRjaGVzKHNwZWNpbWVuLHBhdHQsaWRlbnRDaGVja2VyKTtcblxuLypcblxuXG5cblxuXG5cbiAgICovXG5jb25zdCBtdXN0TWF0Y2g9KHNwZWNpbWVuLHBhdHQsbGFiZWw9dW5kZWZpbmVkKT0+e1xubGV0IGlubmVyRXJyb3I7XG50cnl7XG5pZihjaGVja01hdGNoZXMoc3BlY2ltZW4scGF0dCxpZGVudENoZWNrZXIsdW5kZWZpbmVkKSl7XG5yZXR1cm47XG4gfVxuIH1jYXRjaChlcil7XG5pbm5lckVycm9yPWVyO1xuIH1cbi8vXG5jaGVja01hdGNoZXMoc3BlY2ltZW4scGF0dCxhc3NlcnRDaGVja2VyLGxhYmVsKTtcbmNvbnN0IG91dGVyRXJyb3I9bWFrZUVycm9yKFxuWCBgaW50ZXJuYWw6ICR7bGFiZWx9OiBpbmNvbnNpc3RlbnQgcGF0dGVybiBtYXRjaDogJHtxKHBhdHQpfWApO1xuXG5pZihpbm5lckVycm9yIT09dW5kZWZpbmVkKXtcbmFubm90YXRlRXJyb3Iob3V0ZXJFcnJvcixYIGBjYXVzZWQgYnkgJHtpbm5lckVycm9yfWApO1xuIH1cbnRocm93IG91dGVyRXJyb3I7XG4gfTtcblxuLy9cblxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBnZXRSYW5rQ292ZXI9KHBhdHQsZW5jb2RlUGFzc2FibGUpPT57XG5pZihpc0tleShwYXR0KSl7XG5jb25zdCBlbmNvZGVkPWVuY29kZVBhc3NhYmxlKHBhdHQpO1xuaWYoZW5jb2RlZCE9PXVuZGVmaW5lZCl7XG5yZXR1cm5bZW5jb2RlZCwgYCR7ZW5jb2RlZH1+YF07XG4gfVxuIH1cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwYXR0KTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdjb3B5QXJyYXknOntcbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbmJyZWFrO1xuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuYnJlYWs7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0IHRhZz1nZXRUYWcocGF0dCk7XG5jb25zdCBtYXRjaEhlbHBlcj1tYXliZU1hdGNoSGVscGVyKHRhZyk7XG5pZihtYXRjaEhlbHBlcil7XG4vL1xuLy9cbnJldHVybiBtYXRjaEhlbHBlci5nZXRSYW5rQ292ZXIocGF0dC5wYXlsb2FkLGVuY29kZVBhc3NhYmxlKTtcbiB9XG5zd2l0Y2godGFnKXtcbmNhc2UnY29weVNldCc6e1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbmJyZWFrO1xuIH1cbmNhc2UnY29weU1hcCc6e1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5icmVhaztcbiB9XG5kZWZhdWx0OntcbmJyZWFrOy8vXG4gfX1cblxuYnJlYWs7Ly9cbiB9XG5kZWZhdWx0OntcbmJyZWFrOy8vXG4gfX1cblxucmV0dXJuIGdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZSk7XG4gfTtcblxuLypcblxuXG5cblxuXG4gICAqL1xuY29uc3QgYXJyYXlFdmVyeU1hdGNoUGF0dGVybj0oYXJyYXkscGF0dCxjaGVjayxsYWJlbFByZWZpeD0nJyk9PntcbmlmKGlzS2luZChwYXR0LCdtYXRjaDphbnknKSl7XG4vL1xucmV0dXJuIHRydWU7XG4gfVxucmV0dXJuIGFycmF5LmV2ZXJ5KChlbCxpKT0+XG5jaGVja01hdGNoZXMoZWwscGF0dCxjaGVjaywgYCR7bGFiZWxQcmVmaXh9WyR7aX1dYCkpO1xuXG4gfTtcblxuLy9cblxuLyogICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IG1hdGNoQW55SGVscGVyPUZhcignbWF0Y2g6YW55IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihfc3BlY2ltZW4sX21hdGNoZXJQYXlsb2FkLF9jaGVjayk9PnRydWUsXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihtYXRjaGVyUGF5bG9hZCxjaGVjayk9PlxubWF0Y2hlclBheWxvYWQ9PT11bmRlZmluZWR8fFxuY2hlY2soZmFsc2UsWCBgbWF0Y2g6YW55IHBheWxvYWQ6ICR7bWF0Y2hlclBheWxvYWR9IC0gTXVzdCBiZSB1bmRlZmluZWRgKSxcblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlsnJywneyddfSk7XG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IG1hdGNoQW5kSGVscGVyPUZhcignbWF0Y2g6YW5kIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixwYXR0cyxjaGVjayk9PntcbnJldHVybiBwYXR0cy5ldmVyeSgocGF0dCk9PmNoZWNrTWF0Y2hlcyhzcGVjaW1lbixwYXR0LGNoZWNrKSk7XG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KGFsbGVnZWRQYXR0cyxjaGVjayk9PntcbmNvbnN0IGNoZWNrSXQ9KHBhdHQpPT5jaGVja1BhdHRlcm4ocGF0dCxjaGVjayk7XG5yZXR1cm4oXG4ocGFzc1N0eWxlT2YoYWxsZWdlZFBhdHRzKT09PSdjb3B5QXJyYXknfHxcbmNoZWNrKGZhbHNlLFggYE5lZWRzIGFycmF5IG9mIHN1Yi1wYXR0ZXJuczogJHtxKGFsbGVnZWRQYXR0cyl9YCkpJiZcbmFsbGVnZWRQYXR0cy5ldmVyeShjaGVja0l0KSk7XG5cbiB9LFxuXG5nZXRSYW5rQ292ZXI6KHBhdHRzLGVuY29kZVBhc3NhYmxlKT0+XG5pbnRlcnNlY3RSYW5rQ292ZXJzKFxuY29tcGFyZVJhbmssXG5wYXR0cy5tYXAoKHApPT5nZXRSYW5rQ292ZXIocCxlbmNvZGVQYXNzYWJsZSkpKX0pO1xuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IG1hdGNoT3JIZWxwZXI9RmFyKCdtYXRjaDpvciBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4scGF0dHMsY2hlY2spPT57XG5jb25zdHtsZW5ndGh9PXBhdHRzO1xuaWYobGVuZ3RoPT09MCl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gbm8gcGF0dGVybiBkaXNqdW5jdHMgdG8gbWF0Y2g6ICR7cShwYXR0cyl9YCk7XG5cbiB9XG5pZihcbnBhdHRzLmxlbmd0aD09PTImJlxuIW1hdGNoZXMoc3BlY2ltZW4scGF0dHNbMF0pJiZcbmlzS2luZChwYXR0c1swXSwnbWF0Y2g6a2luZCcpJiZcbnBhdHRzWzBdLnBheWxvYWQ9PT0ndW5kZWZpbmVkJylcbntcbi8vXG4vL1xucmV0dXJuIGNoZWNrTWF0Y2hlcyhzcGVjaW1lbixwYXR0c1sxXSxjaGVjayk7XG4gfVxuaWYocGF0dHMuc29tZSgocGF0dCk9Pm1hdGNoZXMoc3BlY2ltZW4scGF0dCkpKXtcbnJldHVybiB0cnVlO1xuIH1cbnJldHVybiBjaGVjayhmYWxzZSxYIGAke3NwZWNpbWVufSAtIE11c3QgbWF0Y2ggb25lIG9mICR7cShwYXR0cyl9YCk7XG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6bWF0Y2hBbmRIZWxwZXIuY2hlY2tJc1dlbGxGb3JtZWQsXG5cbmdldFJhbmtDb3ZlcjoocGF0dHMsZW5jb2RlUGFzc2FibGUpPT5cbnVuaW9uUmFua0NvdmVycyhcbmNvbXBhcmVSYW5rLFxucGF0dHMubWFwKChwKT0+Z2V0UmFua0NvdmVyKHAsZW5jb2RlUGFzc2FibGUpKSl9KTtcblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBtYXRjaE5vdEhlbHBlcj1GYXIoJ21hdGNoOm5vdCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4scGF0dCxjaGVjayk9PntcbmlmKG1hdGNoZXMoc3BlY2ltZW4scGF0dCkpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGAke3NwZWNpbWVufSAtIE11c3QgZmFpbCBuZWdhdGVkIHBhdHRlcm46ICR7cShwYXR0KX1gKTtcblxuIH1lbHNle1xucmV0dXJuIHRydWU7XG4gfVxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOmNoZWNrUGF0dGVybixcblxuZ2V0UmFua0NvdmVyOihfcGF0dCxfZW5jb2RlUGFzc2FibGUpPT5bJycsJ3snXX0pO1xuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBtYXRjaFNjYWxhckhlbHBlcj1GYXIoJ21hdGNoOnNjYWxhciBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sX21hdGNoZXJQYXlsb2FkLGNoZWNrKT0+XG5jaGVja1NjYWxhcktleShzcGVjaW1lbixjaGVjayksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOm1hdGNoQW55SGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+WydhJywnen4nXX0pO1xuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBtYXRjaEtleUhlbHBlcj1GYXIoJ21hdGNoOmtleSBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sX21hdGNoZXJQYXlsb2FkLGNoZWNrKT0+XG5jaGVja0tleShzcGVjaW1lbixjaGVjayksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOm1hdGNoQW55SGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+WydhJywnen4nXX0pO1xuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBtYXRjaFBhdHRlcm5IZWxwZXI9RmFyKCdtYXRjaDpwYXR0ZXJuIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixfbWF0Y2hlclBheWxvYWQsY2hlY2spPT5cbmNoZWNrUGF0dGVybihzcGVjaW1lbixjaGVjayksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOm1hdGNoQW55SGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+WydhJywnen4nXX0pO1xuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBtYXRjaEtpbmRIZWxwZXI9RmFyKCdtYXRjaDpraW5kIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOmNoZWNrS2luZCxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KGFsbGVnZWRLZXlLaW5kLGNoZWNrKT0+XG50eXBlb2YgYWxsZWdlZEtleUtpbmQ9PT0nc3RyaW5nJ3x8XG5jaGVjayhcbmZhbHNlLFxuWCBgbWF0Y2g6a2luZDogcGF5bG9hZDogJHthbGxlZ2VkS2V5S2luZH0gLSBBIGtpbmQgbmFtZSBtdXN0IGJlIGEgc3RyaW5nYCksXG5cblxuZ2V0UmFua0NvdmVyOihraW5kLF9lbmNvZGVQYXNzYWJsZSk9PntcbmxldCBzdHlsZTtcbnN3aXRjaChraW5kKXtcbmNhc2UnY29weVNldCc6XG5jYXNlJ2NvcHlNYXAnOntcbnN0eWxlPSd0YWdnZWQnO1xuYnJlYWs7XG4gfVxuZGVmYXVsdDp7XG5zdHlsZT1raW5kO1xuYnJlYWs7XG4gfX1cblxucmV0dXJuIGdldFBhc3NTdHlsZUNvdmVyKHN0eWxlKTtcbiB9fSk7XG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IG1hdGNoVGFnZ2VkSGVscGVyPUZhcignbWF0Y2g6dGFnZ2VkIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixbdGFnUGF0dCxwYXlsb2FkUGF0dF0sY2hlY2spPT57XG5pZihwYXNzU3R5bGVPZihzcGVjaW1lbikhPT0ndGFnZ2VkJyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYEV4cGVjdGVkIHRhZ2dlZCBvYmplY3QsIG5vdCAke3EoXG5wYXNzU3R5bGVPZihzcGVjaW1lbikpXG4gfTogJHtzcGVjaW1lbn1gKTtcblxuIH1cbnJldHVybihcbmNoZWNrTWF0Y2hlcyhnZXRUYWcoc3BlY2ltZW4pLHRhZ1BhdHQsY2hlY2ssJ3RhZycpJiZcbmNoZWNrTWF0Y2hlcyhzcGVjaW1lbi5wYXlsb2FkLHBheWxvYWRQYXR0LGNoZWNrLCdwYXlsb2FkJykpO1xuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrTWF0Y2hlcyhcbnBheWxvYWQsXG5oYXJkZW4oW01NLnBhdHRlcm4oKSxNTS5wYXR0ZXJuKCldKSxcbmNoZWNrLFxuJ21hdGNoOnRhZ2dlZCBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOihfa2luZCxfZW5jb2RlUGFzc2FibGUpPT5nZXRQYXNzU3R5bGVDb3ZlcigndGFnZ2VkJyl9KTtcblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgbWF0Y2hCaWdpbnRIZWxwZXI9RmFyKCdtYXRjaDpiaWdpbnQgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLFtsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e2RlY2ltYWxEaWdpdHNMaW1pdH09bGltaXQobGltaXRzKTtcbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnYmlnaW50JyxjaGVjaykmJlxuY2hlY2tEZWNpbWFsRGlnaXRzTGltaXQoc3BlY2ltZW4sZGVjaW1hbERpZ2l0c0xpbWl0LGNoZWNrKSk7XG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtdKSxcbmNoZWNrLFxuJ21hdGNoOmJpZ2ludCBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlxuZ2V0UGFzc1N0eWxlQ292ZXIoJ2JpZ2ludCcpfSk7XG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IG1hdGNoTmF0SGVscGVyPUZhcignbWF0Y2g6bmF0IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixbbGltaXRzPXVuZGVmaW5lZF0sY2hlY2spPT57XG5jb25zdHtkZWNpbWFsRGlnaXRzTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2JpZ2ludCcsY2hlY2spJiZcbmNoZWNrKFxuLyogICAgICAgICAgICAgICAgICovc3BlY2ltZW4+PTBuLFxuWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIG5vbi1uZWdhdGl2ZWApJiZcblxuY2hlY2tEZWNpbWFsRGlnaXRzTGltaXQoc3BlY2ltZW4sZGVjaW1hbERpZ2l0c0xpbWl0LGNoZWNrKSk7XG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtdKSxcbmNoZWNrLFxuJ21hdGNoOm5hdCBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlxuLy9cbmdldFBhc3NTdHlsZUNvdmVyKCdiaWdpbnQnKX0pO1xuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBtYXRjaFN0cmluZ0hlbHBlcj1GYXIoJ21hdGNoOnN0cmluZyBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sW2xpbWl0cz11bmRlZmluZWRdLGNoZWNrKT0+e1xuY29uc3R7c3RyaW5nTGVuZ3RoTGltaXR9PWxpbWl0KGxpbWl0cyk7XG4vL1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdzdHJpbmcnLGNoZWNrKSYmKFxuLy9cbi8qICAgICAgICAgICAgICAgICAqL3NwZWNpbWVuLmxlbmd0aDw9c3RyaW5nTGVuZ3RoTGltaXR8fFxuY2hlY2soXG5mYWxzZSxcblggYHN0cmluZyAke3NwZWNpbWVufSBtdXN0IG5vdCBiZSBiaWdnZXIgdGhhbiAke3N0cmluZ0xlbmd0aExpbWl0fWApKSk7XG5cblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW10pLFxuY2hlY2ssXG4nbWF0Y2g6c3RyaW5nIHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+XG5nZXRQYXNzU3R5bGVDb3Zlcignc3RyaW5nJyl9KTtcblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgbWF0Y2hTeW1ib2xIZWxwZXI9RmFyKCdtYXRjaDpzeW1ib2wgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLFtsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e3N5bWJvbE5hbWVMZW5ndGhMaW1pdH09bGltaXQobGltaXRzKTtcbmlmKCFjaGVja0tpbmQoc3BlY2ltZW4sJ3N5bWJvbCcsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdCBzeW1ib2xOYW1lPW5hbWVGb3JQYXNzYWJsZVN5bWJvbChzcGVjaW1lbik7XG5cbmlmKHR5cGVvZiBzeW1ib2xOYW1lIT09J3N0cmluZycpe1xudGhyb3cgRmFpbCBgaW50ZXJuYWw6IFBhc3NhYmxlIHN5bWJvbCAke3NwZWNpbWVufSBtdXN0IGhhdmUgYSBwYXNzYWJsZSBuYW1lYDtcbiB9XG5yZXR1cm4gY2hlY2soXG5zeW1ib2xOYW1lLmxlbmd0aDw9c3ltYm9sTmFtZUxlbmd0aExpbWl0LFxuWCBgU3ltYm9sIG5hbWUgJHtxKFxuc3ltYm9sTmFtZSlcbiB9IG11c3Qgbm90IGJlIGJpZ2dlciB0aGFuICR7c3ltYm9sTmFtZUxlbmd0aExpbWl0fWApO1xuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbXSksXG5jaGVjayxcbidtYXRjaDpzeW1ib2wgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX21hdGNoUGF5bG9hZCxfZW5jb2RlUGFzc2FibGUpPT5cbmdldFBhc3NTdHlsZUNvdmVyKCdzeW1ib2wnKX0pO1xuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBtYXRjaFJlbW90YWJsZUhlbHBlcj1GYXIoJ21hdGNoOnJlbW90YWJsZSBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4scmVtb3RhYmxlRGVzYyxjaGVjayk9PntcbmlmKGlzS2luZChzcGVjaW1lbiwncmVtb3RhYmxlJykpe1xucmV0dXJuIHRydWU7XG4gfVxuaWYoY2hlY2s9PT1pZGVudENoZWNrZXIpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmNvbnN0e2xhYmVsfT1yZW1vdGFibGVEZXNjO1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHNwZWNpbWVuKTtcbmNvbnN0IGtpbmREZXRhaWxzPVxucGFzc1N0eWxlIT09J3RhZ2dlZCc/XG4vL1xuYihwYXNzU3R5bGUpOlxuLy9cbi8vXG5xKGdldFRhZyhzcGVjaW1lbikpO1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG4vL1xuLy9cblggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBhIHJlbW90YWJsZSAke2IobGFiZWwpfSwgbm90ICR7a2luZERldGFpbHN9YCk7XG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDooYWxsZWdlZFJlbW90YWJsZURlc2MsY2hlY2spPT5cbmNoZWNrTWF0Y2hlcyhcbmFsbGVnZWRSZW1vdGFibGVEZXNjLFxuaGFyZGVuKHtsYWJlbDpNTS5zdHJpbmcoKX0pLFxuY2hlY2ssXG4nbWF0Y2g6cmVtb3RhYmxlIHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KF9yZW1vdGFibGVEZXNjLF9lbmNvZGVQYXNzYWJsZSk9PlxuZ2V0UGFzc1N0eWxlQ292ZXIoJ3JlbW90YWJsZScpfSk7XG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IG1hdGNoTFRFSGVscGVyPUZhcignbWF0Y2g6bHRlIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixyaWdodE9wZXJhbmQsY2hlY2spPT5cbmtleUxURShzcGVjaW1lbixyaWdodE9wZXJhbmQpfHxcbmNoZWNrKGZhbHNlLFggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSA8PSAke3JpZ2h0T3BlcmFuZH1gKSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6Y2hlY2tLZXksXG5cbmdldFJhbmtDb3ZlcjoocmlnaHRPcGVyYW5kLGVuY29kZVBhc3NhYmxlKT0+e1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHJpZ2h0T3BlcmFuZCk7XG4vL1xuLy9cbi8vXG5sZXRbbGVmdEJvdW5kLHJpZ2h0Qm91bmRdPWdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZSk7XG5jb25zdCBuZXdSaWdodEJvdW5kPSBgJHtlbmNvZGVQYXNzYWJsZShyaWdodE9wZXJhbmQpfX5gO1xuaWYobmV3UmlnaHRCb3VuZCE9PXVuZGVmaW5lZCl7XG5yaWdodEJvdW5kPW5ld1JpZ2h0Qm91bmQ7XG4gfVxucmV0dXJuW2xlZnRCb3VuZCxyaWdodEJvdW5kXTtcbiB9fSk7XG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IG1hdGNoTFRIZWxwZXI9RmFyKCdtYXRjaDpsdCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4scmlnaHRPcGVyYW5kLGNoZWNrKT0+XG5rZXlMVChzcGVjaW1lbixyaWdodE9wZXJhbmQpfHxcbmNoZWNrKGZhbHNlLFggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSA8ICR7cmlnaHRPcGVyYW5kfWApLFxuXG5jaGVja0lzV2VsbEZvcm1lZDpjaGVja0tleSxcblxuZ2V0UmFua0NvdmVyOm1hdGNoTFRFSGVscGVyLmdldFJhbmtDb3Zlcn0pO1xuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBtYXRjaEdURUhlbHBlcj1GYXIoJ21hdGNoOmd0ZSBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4scmlnaHRPcGVyYW5kLGNoZWNrKT0+XG5rZXlHVEUoc3BlY2ltZW4scmlnaHRPcGVyYW5kKXx8XG5jaGVjayhmYWxzZSxYIGAke3NwZWNpbWVufSAtIE11c3QgYmUgPj0gJHtyaWdodE9wZXJhbmR9YCksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOmNoZWNrS2V5LFxuXG5nZXRSYW5rQ292ZXI6KHJpZ2h0T3BlcmFuZCxlbmNvZGVQYXNzYWJsZSk9PntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihyaWdodE9wZXJhbmQpO1xuLy9cbi8vXG4vL1xubGV0W2xlZnRCb3VuZCxyaWdodEJvdW5kXT1nZXRQYXNzU3R5bGVDb3ZlcihwYXNzU3R5bGUpO1xuY29uc3QgbmV3TGVmdEJvdW5kPWVuY29kZVBhc3NhYmxlKHJpZ2h0T3BlcmFuZCk7XG5pZihuZXdMZWZ0Qm91bmQhPT11bmRlZmluZWQpe1xubGVmdEJvdW5kPW5ld0xlZnRCb3VuZDtcbiB9XG5yZXR1cm5bbGVmdEJvdW5kLHJpZ2h0Qm91bmRdO1xuIH19KTtcblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgbWF0Y2hHVEhlbHBlcj1GYXIoJ21hdGNoOmd0IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixyaWdodE9wZXJhbmQsY2hlY2spPT5cbmtleUdUKHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCl8fFxuY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlID4gJHtyaWdodE9wZXJhbmR9YCksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOmNoZWNrS2V5LFxuXG5nZXRSYW5rQ292ZXI6bWF0Y2hHVEVIZWxwZXIuZ2V0UmFua0NvdmVyfSk7XG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IG1hdGNoUmVjb3JkT2ZIZWxwZXI9RmFyKCdtYXRjaDpyZWNvcmRPZiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooXG5zcGVjaW1lbixcbltrZXlQYXR0LHZhbHVlUGF0dCxsaW1pdHM9dW5kZWZpbmVkXSxcbmNoZWNrKT0+XG57XG5jb25zdHtudW1Qcm9wZXJ0aWVzTGltaXQscHJvcGVydHlOYW1lTGVuZ3RoTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlSZWNvcmQnLGNoZWNrKSYmXG5jaGVjayhcbm93bktleXMoc3BlY2ltZW4pLmxlbmd0aDw9bnVtUHJvcGVydGllc0xpbWl0LFxuWCBgTXVzdCBub3QgaGF2ZSBtb3JlIHRoYW4gJHtxKFxubnVtUHJvcGVydGllc0xpbWl0KVxuIH0gcHJvcGVydGllczogJHtzcGVjaW1lbn1gKSYmXG5cbmVudHJpZXMoc3BlY2ltZW4pLmV2ZXJ5KFxuKFtrZXksdmFsdWVdKT0+XG5hcHBseUxhYmVsaW5nRXJyb3IoXG5jaGVjayxcbltcbmtleS5sZW5ndGg8PXByb3BlcnR5TmFtZUxlbmd0aExpbWl0LFxuWCBgUHJvcGVydHkgbmFtZSBtdXN0IG5vdCBiZSBsb25nZXIgdGhhbiAke3EoXG5wcm9wZXJ0eU5hbWVMZW5ndGhMaW1pdClcbiB9YF0sXG5cbmtleSkmJlxuXG5jaGVja01hdGNoZXMoXG5oYXJkZW4oW2tleSx2YWx1ZV0pLFxuaGFyZGVuKFtrZXlQYXR0LHZhbHVlUGF0dF0pLFxuY2hlY2ssXG5rZXkpKSk7XG5cblxuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbTU0ucGF0dGVybigpLE1NLnBhdHRlcm4oKV0pLFxuY2hlY2ssXG4nbWF0Y2g6cmVjb3JkT2YgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX2VudHJ5UGF0dCk9PmdldFBhc3NTdHlsZUNvdmVyKCdjb3B5UmVjb3JkJyl9KTtcblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgbWF0Y2hBcnJheU9mSGVscGVyPUZhcignbWF0Y2g6YXJyYXlPZiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sW3N1YlBhdHQsbGltaXRzPXVuZGVmaW5lZF0sY2hlY2spPT57XG5jb25zdHthcnJheUxlbmd0aExpbWl0fT1saW1pdChsaW1pdHMpO1xuLy9cbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnY29weUFycmF5JyxjaGVjaykmJihcbi8qICAgICAgICAgICAgICAgICovc3BlY2ltZW4ubGVuZ3RoPD1hcnJheUxlbmd0aExpbWl0fHxcbmNoZWNrKFxuZmFsc2UsXG5YIGBBcnJheSBsZW5ndGggJHtzcGVjaW1lbi5sZW5ndGh9IG11c3QgYmUgPD0gbGltaXQgJHthcnJheUxlbmd0aExpbWl0fWApKSYmXG5cbmFycmF5RXZlcnlNYXRjaFBhdHRlcm4oc3BlY2ltZW4sc3ViUGF0dCxjaGVjaykpO1xuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbTU0ucGF0dGVybigpXSksXG5jaGVjayxcbidtYXRjaDphcnJheU9mIHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KCk9PmdldFBhc3NTdHlsZUNvdmVyKCdjb3B5QXJyYXknKX0pO1xuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBtYXRjaFNldE9mSGVscGVyPUZhcignbWF0Y2g6c2V0T2YgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLFtrZXlQYXR0LGxpbWl0cz11bmRlZmluZWRdLGNoZWNrKT0+e1xuY29uc3R7bnVtU2V0RWxlbWVudHNMaW1pdH09bGltaXQobGltaXRzKTtcbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnY29weVNldCcsY2hlY2spJiZcbmNoZWNrKFxuLyogICAgICAgICAgICAgICAgKi9zcGVjaW1lbi5wYXlsb2FkLmxlbmd0aDxudW1TZXRFbGVtZW50c0xpbWl0LFxuWCBgU2V0IG11c3Qgbm90IGhhdmUgbW9yZSB0aGFuICR7cShudW1TZXRFbGVtZW50c0xpbWl0KX0gZWxlbWVudHM6ICR7XG5zcGVjaW1lbi5wYXlsb2FkLmxlbmd0aFxuIH1gKSYmXG5cbmFycmF5RXZlcnlNYXRjaFBhdHRlcm4oc3BlY2ltZW4ucGF5bG9hZCxrZXlQYXR0LGNoZWNrLCdzZXQgZWxlbWVudHMnKSk7XG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtNTS5wYXR0ZXJuKCldKSxcbmNoZWNrLFxuJ21hdGNoOnNldE9mIHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KCk9PmdldFBhc3NTdHlsZUNvdmVyKCd0YWdnZWQnKX0pO1xuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBtYXRjaEJhZ09mSGVscGVyPUZhcignbWF0Y2g6YmFnT2YgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KFxuc3BlY2ltZW4sXG5ba2V5UGF0dCxjb3VudFBhdHQsbGltaXRzPXVuZGVmaW5lZF0sXG5jaGVjayk9Plxue1xuY29uc3R7bnVtVW5pcXVlQmFnRWxlbWVudHNMaW1pdCxkZWNpbWFsRGlnaXRzTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlCYWcnLGNoZWNrKSYmXG5jaGVjayhcbi8qICAgICAgICAgICAgICAgICovc3BlY2ltZW4ucGF5bG9hZC5sZW5ndGg8PVxubnVtVW5pcXVlQmFnRWxlbWVudHNMaW1pdCxcblggYEJhZyBtdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiAke3EoXG5udW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0KVxuIH0gdW5pcXVlIGVsZW1lbnRzOiAke3NwZWNpbWVufWApJiZcblxuc3BlY2ltZW4ucGF5bG9hZC5ldmVyeShcbihba2V5LGNvdW50XSxpKT0+XG5jaGVja01hdGNoZXMoa2V5LGtleVBhdHQsY2hlY2ssIGBiYWcga2V5c1ske2l9XWApJiZcbmFwcGx5TGFiZWxpbmdFcnJvcihcbmNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0LFxuW2NvdW50LGRlY2ltYWxEaWdpdHNMaW1pdCxjaGVja10sXG4gYGJhZyBjb3VudHNbJHtpfV1gKSYmXG5cbmNoZWNrTWF0Y2hlcyhjb3VudCxjb3VudFBhdHQsY2hlY2ssIGBiYWcgY291bnRzWyR7aX1dYCkpKTtcblxuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbTU0ucGF0dGVybigpLE1NLnBhdHRlcm4oKV0pLFxuY2hlY2ssXG4nbWF0Y2g6YmFnT2YgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooKT0+Z2V0UGFzc1N0eWxlQ292ZXIoJ3RhZ2dlZCcpfSk7XG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IG1hdGNoTWFwT2ZIZWxwZXI9RmFyKCdtYXRjaDptYXBPZiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooXG5zcGVjaW1lbixcbltrZXlQYXR0LHZhbHVlUGF0dCxsaW1pdHM9dW5kZWZpbmVkXSxcbmNoZWNrKT0+XG57XG5jb25zdHtudW1NYXBFbnRyaWVzTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlNYXAnLGNoZWNrKSYmXG5jaGVjayhcbi8qICAgICAgICAgICAgICAgICovc3BlY2ltZW4ucGF5bG9hZC5rZXlzLmxlbmd0aDw9XG5udW1NYXBFbnRyaWVzTGltaXQsXG5YIGBDb3B5TWFwIG11c3QgaGF2ZSBubyBtb3JlIHRoYW4gJHtxKFxubnVtTWFwRW50cmllc0xpbWl0KVxuIH0gZW50cmllczogJHtzcGVjaW1lbn1gKSYmXG5cbmFycmF5RXZlcnlNYXRjaFBhdHRlcm4oXG5zcGVjaW1lbi5wYXlsb2FkLmtleXMsXG5rZXlQYXR0LFxuY2hlY2ssXG4nbWFwIGtleXMnKSYmXG5cbmFycmF5RXZlcnlNYXRjaFBhdHRlcm4oXG5zcGVjaW1lbi5wYXlsb2FkLnZhbHVlcyxcbnZhbHVlUGF0dCxcbmNoZWNrLFxuJ21hcCB2YWx1ZXMnKSk7XG5cblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW01NLnBhdHRlcm4oKSxNTS5wYXR0ZXJuKCldKSxcbmNoZWNrLFxuJ21hdGNoOm1hcE9mIHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KF9lbnRyeVBhdHQpPT5nZXRQYXNzU3R5bGVDb3ZlcigndGFnZ2VkJyl9KTtcblxuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAgICovXG5jb25zdCBzcGxpdEFycmF5UGFydHM9KHNwZWNpbWVuLHJlcXVpcmVkUGF0dCxvcHRpb25hbFBhdHQpPT57XG5jb25zdCBudW1SZXF1aXJlZD1yZXF1aXJlZFBhdHQubGVuZ3RoO1xuY29uc3QgbnVtT3B0aW9uYWw9b3B0aW9uYWxQYXR0Lmxlbmd0aDtcbmNvbnN0IHJlcXVpcmVkU3BlY2ltZW49c3BlY2ltZW4uc2xpY2UoMCxudW1SZXF1aXJlZCk7XG5jb25zdCBvcHRpb25hbFNwZWNpbWVuPXNwZWNpbWVuLnNsaWNlKFxubnVtUmVxdWlyZWQsXG5udW1SZXF1aXJlZCtudW1PcHRpb25hbCk7XG5cbmNvbnN0IHJlc3RTcGVjaW1lbj1zcGVjaW1lbi5zbGljZShudW1SZXF1aXJlZCtudW1PcHRpb25hbCk7XG5yZXR1cm4gaGFyZGVuKHtyZXF1aXJlZFNwZWNpbWVuLG9wdGlvbmFsU3BlY2ltZW4scmVzdFNwZWNpbWVufSk7XG4gfTtcblxuLypcblxuXG5cblxuXG5cblxuICAgKi9cbmNvbnN0IGFkYXB0QXJyYXlQYXR0ZXJuPShvcHRpb25hbFBhdHQsbGVuZ3RoKT0+XG5oYXJkZW4ob3B0aW9uYWxQYXR0LnNsaWNlKDAsbGVuZ3RoKS5tYXAoKHBhdHQpPT5NTS5vcHQocGF0dCkpKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IG1hdGNoU3BsaXRBcnJheUhlbHBlcj1GYXIoJ21hdGNoOnNwbGl0QXJyYXkgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KFxuc3BlY2ltZW4sXG5bcmVxdWlyZWRQYXR0LG9wdGlvbmFsUGF0dD1bXSxyZXN0UGF0dD1NTS5hbnkoKV0sXG5jaGVjayk9Plxue1xuaWYoIWNoZWNrS2luZChzcGVjaW1lbiwnY29weUFycmF5JyxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmNvbnN0e3JlcXVpcmVkU3BlY2ltZW4sb3B0aW9uYWxTcGVjaW1lbixyZXN0U3BlY2ltZW59PVxuc3BsaXRBcnJheVBhcnRzKHNwZWNpbWVuLHJlcXVpcmVkUGF0dCxvcHRpb25hbFBhdHQpO1xuY29uc3QgcGFydGlhbFBhdHQ9YWRhcHRBcnJheVBhdHRlcm4oXG5vcHRpb25hbFBhdHQsXG5vcHRpb25hbFNwZWNpbWVuLmxlbmd0aCk7XG5cbmxldCBhcmdOdW09MDtcbnJldHVybihcbihyZXF1aXJlZFNwZWNpbWVuLmxlbmd0aD09PXJlcXVpcmVkUGF0dC5sZW5ndGh8fFxuY2hlY2soXG5mYWxzZSxcblggYEV4cGVjdGVkIGF0IGxlYXN0ICR7cShcbnJlcXVpcmVkUGF0dC5sZW5ndGgpXG4gfSBhcmd1bWVudHM6ICR7c3BlY2ltZW59YCkpJiZcblxucmVxdWlyZWRQYXR0LmV2ZXJ5KChwLGkpPT5cbi8vXG5jaGVja01hdGNoZXMocmVxdWlyZWRTcGVjaW1lbltpXSxwLGNoZWNrLCBgYXJnICR7YXJnTnVtKyt9YCkpJiZcblxucGFydGlhbFBhdHQuZXZlcnkoKHAsaSk9PlxuLy9cbmNoZWNrTWF0Y2hlcyhvcHRpb25hbFNwZWNpbWVuW2ldLHAsY2hlY2ssIGBhcmcgJHthcmdOdW0rK30/YCkpJiZcblxuY2hlY2tNYXRjaGVzKHJlc3RTcGVjaW1lbixyZXN0UGF0dCxjaGVjaywnLi4ucmVzdCcpKTtcblxuIH0sXG5cbi8qXG5cblxuICAgICAqL1xuY2hlY2tJc1dlbGxGb3JtZWQ6KHNwbGl0QXJyYXksY2hlY2spPT57XG5pZihcbnBhc3NTdHlsZU9mKHNwbGl0QXJyYXkpPT09J2NvcHlBcnJheScmJihcbnNwbGl0QXJyYXkubGVuZ3RoPj0xfHxzcGxpdEFycmF5Lmxlbmd0aDw9MykpXG57XG5jb25zdFtyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0PXVuZGVmaW5lZCxyZXN0UGF0dD11bmRlZmluZWRdPVxuc3BsaXRBcnJheTtcbmlmKFxuaXNQYXR0ZXJuKHJlcXVpcmVkUGF0dCkmJlxucGFzc1N0eWxlT2YocmVxdWlyZWRQYXR0KT09PSdjb3B5QXJyYXknJiYoXG5vcHRpb25hbFBhdHQ9PT11bmRlZmluZWR8fFxuaXNQYXR0ZXJuKG9wdGlvbmFsUGF0dCkmJlxucGFzc1N0eWxlT2Yob3B0aW9uYWxQYXR0KT09PSdjb3B5QXJyYXknKSYmKFxucmVzdFBhdHQ9PT11bmRlZmluZWR8fGlzUGF0dGVybihyZXN0UGF0dCkpKVxue1xucmV0dXJuIHRydWU7XG4gfVxuIH1cbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgTXVzdCBiZSBhbiBhcnJheSBvZiBhIHJlcXVpcmVkUGF0dCBhcnJheSwgYW4gb3B0aW9uYWwgb3B0aW9uYWxQYXR0IGFycmF5LCBhbmQgYW4gb3B0aW9uYWwgcmVzdFBhdHQ6ICR7cShcbnNwbGl0QXJyYXkpXG4gfWApO1xuXG4gfSxcblxuZ2V0UmFua0NvdmVyOihbXG5fcmVxdWlyZWRQYXR0LFxuX29wdGlvbmFsUGF0dD11bmRlZmluZWQsXG5fcmVzdFBhdHQ9dW5kZWZpbmVkXSk9PlxuZ2V0UGFzc1N0eWxlQ292ZXIoJ2NvcHlBcnJheScpfSk7XG5cblxuLypcblxuXG5cblxuXG5cblxuXG4gICAqL1xuY29uc3Qgc3BsaXRSZWNvcmRQYXJ0cz0oc3BlY2ltZW4scmVxdWlyZWRQYXR0LG9wdGlvbmFsUGF0dCk9Pntcbi8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgcmVxdWlyZWRFbnRyaWVzPVtdO1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IG9wdGlvbmFsRW50cmllcz1bXTtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCByZXN0RW50cmllcz1bXTtcbmZvcihjb25zdFtuYW1lLHZhbHVlXW9mIGVudHJpZXMoc3BlY2ltZW4pKXtcbmlmKGhhc093blByb3BlcnR5T2YocmVxdWlyZWRQYXR0LG5hbWUpKXtcbnJlcXVpcmVkRW50cmllcy5wdXNoKFtuYW1lLHZhbHVlXSk7XG4gfWVsc2UgaWYoaGFzT3duUHJvcGVydHlPZihvcHRpb25hbFBhdHQsbmFtZSkpe1xub3B0aW9uYWxFbnRyaWVzLnB1c2goW25hbWUsdmFsdWVdKTtcbiB9ZWxzZXtcbnJlc3RFbnRyaWVzLnB1c2goW25hbWUsdmFsdWVdKTtcbiB9XG4gfVxucmV0dXJuIGhhcmRlbih7XG5yZXF1aXJlZFNwZWNpbWVuOmZyb21VbmlxdWVFbnRyaWVzKHJlcXVpcmVkRW50cmllcyksXG5vcHRpb25hbFNwZWNpbWVuOmZyb21VbmlxdWVFbnRyaWVzKG9wdGlvbmFsRW50cmllcyksXG5yZXN0U3BlY2ltZW46ZnJvbVVuaXF1ZUVudHJpZXMocmVzdEVudHJpZXMpfSk7XG5cbiB9O1xuXG4vKlxuXG5cblxuXG5cblxuXG4gICAqL1xuY29uc3QgYWRhcHRSZWNvcmRQYXR0ZXJuPShvcHRpb25hbFBhdHQsbmFtZXMpPT5cbmZyb21VbmlxdWVFbnRyaWVzKG5hbWVzLm1hcCgobmFtZSk9PltuYW1lLE1NLm9wdChvcHRpb25hbFBhdHRbbmFtZV0pXSkpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgbWF0Y2hTcGxpdFJlY29yZEhlbHBlcj1GYXIoJ21hdGNoOnNwbGl0UmVjb3JkIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihcbnNwZWNpbWVuLFxuW3JlcXVpcmVkUGF0dCxvcHRpb25hbFBhdHQ9e30scmVzdFBhdHQ9TU0uYW55KCldLFxuY2hlY2spPT5cbntcbmlmKCFjaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlSZWNvcmQnLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3R7cmVxdWlyZWRTcGVjaW1lbixvcHRpb25hbFNwZWNpbWVuLHJlc3RTcGVjaW1lbn09XG5zcGxpdFJlY29yZFBhcnRzKHNwZWNpbWVuLHJlcXVpcmVkUGF0dCxvcHRpb25hbFBhdHQpO1xuXG5jb25zdCBwYXJ0aWFsTmFtZXM9LyogICAgICAgICAgICAgICAgICAgKi9vd25LZXlzKG9wdGlvbmFsU3BlY2ltZW4pO1xuY29uc3QgcGFydGlhbFBhdHQ9YWRhcHRSZWNvcmRQYXR0ZXJuKG9wdGlvbmFsUGF0dCxwYXJ0aWFsTmFtZXMpO1xucmV0dXJuKFxuY2hlY2tNYXRjaGVzKHJlcXVpcmVkU3BlY2ltZW4scmVxdWlyZWRQYXR0LGNoZWNrKSYmXG5wYXJ0aWFsTmFtZXMuZXZlcnkoKG5hbWUpPT5cbmNoZWNrTWF0Y2hlcyhcbm9wdGlvbmFsU3BlY2ltZW5bbmFtZV0sXG5wYXJ0aWFsUGF0dFtuYW1lXSxcbmNoZWNrLFxuIGAke25hbWV9P2ApKSYmXG5cblxuY2hlY2tNYXRjaGVzKHJlc3RTcGVjaW1lbixyZXN0UGF0dCxjaGVjaywnLi4ucmVzdCcpKTtcblxuIH0sXG5cbi8qXG5cblxuICAgICAqL1xuY2hlY2tJc1dlbGxGb3JtZWQ6KHNwbGl0QXJyYXksY2hlY2spPT57XG5pZihcbnBhc3NTdHlsZU9mKHNwbGl0QXJyYXkpPT09J2NvcHlBcnJheScmJihcbnNwbGl0QXJyYXkubGVuZ3RoPj0xfHxzcGxpdEFycmF5Lmxlbmd0aDw9MykpXG57XG5jb25zdFtyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0PXVuZGVmaW5lZCxyZXN0UGF0dD11bmRlZmluZWRdPVxuc3BsaXRBcnJheTtcbmlmKFxuaXNQYXR0ZXJuKHJlcXVpcmVkUGF0dCkmJlxucGFzc1N0eWxlT2YocmVxdWlyZWRQYXR0KT09PSdjb3B5UmVjb3JkJyYmKFxub3B0aW9uYWxQYXR0PT09dW5kZWZpbmVkfHxcbmlzUGF0dGVybihvcHRpb25hbFBhdHQpJiZcbnBhc3NTdHlsZU9mKG9wdGlvbmFsUGF0dCk9PT0nY29weVJlY29yZCcpJiYoXG5yZXN0UGF0dD09PXVuZGVmaW5lZHx8aXNQYXR0ZXJuKHJlc3RQYXR0KSkpXG57XG5yZXR1cm4gdHJ1ZTtcbiB9XG4gfVxucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBNdXN0IGJlIGFuIGFycmF5IG9mIGEgcmVxdWlyZWRQYXR0IHJlY29yZCwgYW4gb3B0aW9uYWwgb3B0aW9uYWxQYXR0IHJlY29yZCwgYW5kIGFuIG9wdGlvbmFsIHJlc3RQYXR0OiAke3EoXG5zcGxpdEFycmF5KVxuIH1gKTtcblxuIH0sXG5cbmdldFJhbmtDb3ZlcjooW1xucmVxdWlyZWRQYXR0LFxuX29wdGlvbmFsUGF0dD11bmRlZmluZWQsXG5fcmVzdFBhdHQ9dW5kZWZpbmVkXSk9PlxuZ2V0UGFzc1N0eWxlQ292ZXIocGFzc1N0eWxlT2YocmVxdWlyZWRQYXR0KSl9KTtcblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IEhlbHBlcnNCeU1hdGNoVGFnPWhhcmRlbih7XG4nbWF0Y2g6YW55JzptYXRjaEFueUhlbHBlcixcbidtYXRjaDphbmQnOm1hdGNoQW5kSGVscGVyLFxuJ21hdGNoOm9yJzptYXRjaE9ySGVscGVyLFxuJ21hdGNoOm5vdCc6bWF0Y2hOb3RIZWxwZXIsXG5cbidtYXRjaDpzY2FsYXInOm1hdGNoU2NhbGFySGVscGVyLFxuJ21hdGNoOmtleSc6bWF0Y2hLZXlIZWxwZXIsXG4nbWF0Y2g6cGF0dGVybic6bWF0Y2hQYXR0ZXJuSGVscGVyLFxuJ21hdGNoOmtpbmQnOm1hdGNoS2luZEhlbHBlcixcbidtYXRjaDp0YWdnZWQnOm1hdGNoVGFnZ2VkSGVscGVyLFxuJ21hdGNoOmJpZ2ludCc6bWF0Y2hCaWdpbnRIZWxwZXIsXG4nbWF0Y2g6bmF0JzptYXRjaE5hdEhlbHBlcixcbidtYXRjaDpzdHJpbmcnOm1hdGNoU3RyaW5nSGVscGVyLFxuJ21hdGNoOnN5bWJvbCc6bWF0Y2hTeW1ib2xIZWxwZXIsXG4nbWF0Y2g6cmVtb3RhYmxlJzptYXRjaFJlbW90YWJsZUhlbHBlcixcblxuJ21hdGNoOmx0JzptYXRjaExUSGVscGVyLFxuJ21hdGNoOmx0ZSc6bWF0Y2hMVEVIZWxwZXIsXG4nbWF0Y2g6Z3RlJzptYXRjaEdURUhlbHBlcixcbidtYXRjaDpndCc6bWF0Y2hHVEhlbHBlcixcblxuJ21hdGNoOmFycmF5T2YnOm1hdGNoQXJyYXlPZkhlbHBlcixcbidtYXRjaDpyZWNvcmRPZic6bWF0Y2hSZWNvcmRPZkhlbHBlcixcbidtYXRjaDpzZXRPZic6bWF0Y2hTZXRPZkhlbHBlcixcbidtYXRjaDpiYWdPZic6bWF0Y2hCYWdPZkhlbHBlcixcbidtYXRjaDptYXBPZic6bWF0Y2hNYXBPZkhlbHBlcixcbidtYXRjaDpzcGxpdEFycmF5JzptYXRjaFNwbGl0QXJyYXlIZWxwZXIsXG4nbWF0Y2g6c3BsaXRSZWNvcmQnOm1hdGNoU3BsaXRSZWNvcmRIZWxwZXJ9KTtcblxuXG5jb25zdCBtYWtlTWF0Y2hlcj0odGFnLHBheWxvYWQpPT57XG5jb25zdCBtYXRjaGVyPW1ha2VUYWdnZWQodGFnLHBheWxvYWQpO1xuYXNzZXJ0UGF0dGVybihtYXRjaGVyKTtcbnJldHVybiBtYXRjaGVyO1xuIH07XG5cbmNvbnN0IG1ha2VLaW5kTWF0Y2hlcj0oa2luZCk9Pm1ha2VNYXRjaGVyKCdtYXRjaDpraW5kJyxraW5kKTtcblxuY29uc3QgQW55U2hhcGU9bWFrZU1hdGNoZXIoJ21hdGNoOmFueScsdW5kZWZpbmVkKTtcbmNvbnN0IFNjYWxhclNoYXBlPW1ha2VNYXRjaGVyKCdtYXRjaDpzY2FsYXInLHVuZGVmaW5lZCk7XG5jb25zdCBLZXlTaGFwZT1tYWtlTWF0Y2hlcignbWF0Y2g6a2V5Jyx1bmRlZmluZWQpO1xuY29uc3QgUGF0dGVyblNoYXBlPW1ha2VNYXRjaGVyKCdtYXRjaDpwYXR0ZXJuJyx1bmRlZmluZWQpO1xuY29uc3QgQm9vbGVhblNoYXBlPW1ha2VLaW5kTWF0Y2hlcignYm9vbGVhbicpO1xuY29uc3QgTnVtYmVyU2hhcGU9bWFrZUtpbmRNYXRjaGVyKCdudW1iZXInKTtcbmNvbnN0IEJpZ0ludFNoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOmJpZ2ludCcsW10pO1xuY29uc3QgTmF0U2hhcGU9bWFrZVRhZ2dlZCgnbWF0Y2g6bmF0JyxbXSk7XG5jb25zdCBTdHJpbmdTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpzdHJpbmcnLFtdKTtcbmNvbnN0IFN5bWJvbFNoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOnN5bWJvbCcsW10pO1xuY29uc3QgUmVjb3JkU2hhcGU9bWFrZVRhZ2dlZCgnbWF0Y2g6cmVjb3JkT2YnLFtBbnlTaGFwZSxBbnlTaGFwZV0pO1xuY29uc3QgQXJyYXlTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDphcnJheU9mJyxbQW55U2hhcGVdKTtcbmNvbnN0IFNldFNoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOnNldE9mJyxbQW55U2hhcGVdKTtcbmNvbnN0IEJhZ1NoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOmJhZ09mJyxbQW55U2hhcGUsQW55U2hhcGVdKTtcbmNvbnN0IE1hcFNoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOm1hcE9mJyxbQW55U2hhcGUsQW55U2hhcGVdKTtcbmNvbnN0IFJlbW90YWJsZVNoYXBlPW1ha2VLaW5kTWF0Y2hlcigncmVtb3RhYmxlJyk7XG5jb25zdCBFcnJvclNoYXBlPW1ha2VLaW5kTWF0Y2hlcignZXJyb3InKTtcbmNvbnN0IFByb21pc2VTaGFwZT1tYWtlS2luZE1hdGNoZXIoJ3Byb21pc2UnKTtcbmNvbnN0IFVuZGVmaW5lZFNoYXBlPW1ha2VLaW5kTWF0Y2hlcigndW5kZWZpbmVkJyk7XG5cbi8qXG5cblxuXG5cblxuXG4gICAqL1xuY29uc3QgbWFrZUxpbWl0c01hdGNoZXI9KHRhZyxwYXlsb2FkKT0+e1xuaWYocGF5bG9hZFtwYXlsb2FkLmxlbmd0aC0xXT09PXVuZGVmaW5lZCl7XG5wYXlsb2FkPWhhcmRlbihwYXlsb2FkLnNsaWNlKDAscGF5bG9hZC5sZW5ndGgtMSkpO1xuIH1cbnJldHVybiBtYWtlTWF0Y2hlcih0YWcscGF5bG9hZCk7XG4gfTtcblxuY29uc3QgbWFrZVJlbW90YWJsZU1hdGNoZXI9KGxhYmVsPXVuZGVmaW5lZCk9PlxubGFiZWw9PT11bmRlZmluZWQ/XG5SZW1vdGFibGVTaGFwZTpcbm1ha2VNYXRjaGVyKCdtYXRjaDpyZW1vdGFibGUnLGhhcmRlbih7bGFiZWx9KSk7XG5cbi8qXG5cblxuXG5cblxuXG4gICAqL1xuY29uc3QgbWFrZVNwbGl0UGF5bG9hZD0oXG5lbXB0eSxcbmJhc2UsXG5vcHRpb25hbD11bmRlZmluZWQsXG5yZXN0PXVuZGVmaW5lZCk9Plxue1xuaWYocmVzdCl7XG5yZXR1cm5bYmFzZSxvcHRpb25hbHx8ZW1wdHkscmVzdF07XG4gfVxuaWYob3B0aW9uYWwpe1xucmV0dXJuW2Jhc2Usb3B0aW9uYWxdO1xuIH1cbnJldHVybltiYXNlXTtcbiB9O1xuXG4vL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBNPWhhcmRlbih7XG5hbnk6KCk9PkFueVNoYXBlLFxuYW5kOiguLi5wYXR0cyk9Pm1ha2VNYXRjaGVyKCdtYXRjaDphbmQnLHBhdHRzKSxcbm9yOiguLi5wYXR0cyk9Pm1ha2VNYXRjaGVyKCdtYXRjaDpvcicscGF0dHMpLFxubm90OihzdWJQYXR0KT0+bWFrZU1hdGNoZXIoJ21hdGNoOm5vdCcsc3ViUGF0dCksXG5cbnNjYWxhcjooKT0+U2NhbGFyU2hhcGUsXG5rZXk6KCk9PktleVNoYXBlLFxucGF0dGVybjooKT0+UGF0dGVyblNoYXBlLFxua2luZDptYWtlS2luZE1hdGNoZXIsXG50YWdnZWQ6KHRhZ1BhdHQ9TS5zdHJpbmcoKSxwYXlsb2FkUGF0dD1NLmFueSgpKT0+XG5tYWtlTWF0Y2hlcignbWF0Y2g6dGFnZ2VkJyxoYXJkZW4oW3RhZ1BhdHQscGF5bG9hZFBhdHRdKSksXG5ib29sZWFuOigpPT5Cb29sZWFuU2hhcGUsXG5udW1iZXI6KCk9Pk51bWJlclNoYXBlLFxuYmlnaW50OihsaW1pdHM9dW5kZWZpbmVkKT0+XG5saW1pdHM/bWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOmJpZ2ludCcsW2xpbWl0c10pOkJpZ0ludFNoYXBlLFxubmF0OihsaW1pdHM9dW5kZWZpbmVkKT0+XG5saW1pdHM/bWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOm5hdCcsW2xpbWl0c10pOk5hdFNoYXBlLFxuc3RyaW5nOihsaW1pdHM9dW5kZWZpbmVkKT0+XG5saW1pdHM/bWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOnN0cmluZycsW2xpbWl0c10pOlN0cmluZ1NoYXBlLFxuc3ltYm9sOihsaW1pdHM9dW5kZWZpbmVkKT0+XG5saW1pdHM/bWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOnN5bWJvbCcsW2xpbWl0c10pOlN5bWJvbFNoYXBlLFxucmVjb3JkOihsaW1pdHM9dW5kZWZpbmVkKT0+XG5saW1pdHM/TS5yZWNvcmRPZihNLmFueSgpLE0uYW55KCksbGltaXRzKTpSZWNvcmRTaGFwZSxcbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5hcnJheToobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP00uYXJyYXlPZihNLmFueSgpLGxpbWl0cyk6QXJyYXlTaGFwZSxcbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbnNldDoobGltaXRzPXVuZGVmaW5lZCk9PmxpbWl0cz9NLnNldE9mKE0uYW55KCksbGltaXRzKTpTZXRTaGFwZSxcbmJhZzoobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP00uYmFnT2YoTS5hbnkoKSxNLmFueSgpLGxpbWl0cyk6QmFnU2hhcGUsXG5tYXA6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9NLm1hcE9mKE0uYW55KCksTS5hbnkoKSxsaW1pdHMpOk1hcFNoYXBlLFxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbnJlbW90YWJsZTptYWtlUmVtb3RhYmxlTWF0Y2hlcixcbmVycm9yOigpPT5FcnJvclNoYXBlLFxucHJvbWlzZTooKT0+UHJvbWlzZVNoYXBlLFxudW5kZWZpbmVkOigpPT5VbmRlZmluZWRTaGFwZSxcbm51bGw6KCk9Pm51bGwsXG5cbmx0OihyaWdodE9wZXJhbmQpPT5tYWtlTWF0Y2hlcignbWF0Y2g6bHQnLHJpZ2h0T3BlcmFuZCksXG5sdGU6KHJpZ2h0T3BlcmFuZCk9Pm1ha2VNYXRjaGVyKCdtYXRjaDpsdGUnLHJpZ2h0T3BlcmFuZCksXG5lcTooa2V5KT0+e1xuYXNzZXJ0S2V5KGtleSk7XG5yZXR1cm4ga2V5PT09dW5kZWZpbmVkP00udW5kZWZpbmVkKCk6a2V5O1xuIH0sXG5uZXE6KGtleSk9Pk0ubm90KE0uZXEoa2V5KSksXG5ndGU6KHJpZ2h0T3BlcmFuZCk9Pm1ha2VNYXRjaGVyKCdtYXRjaDpndGUnLHJpZ2h0T3BlcmFuZCksXG5ndDoocmlnaHRPcGVyYW5kKT0+bWFrZU1hdGNoZXIoJ21hdGNoOmd0JyxyaWdodE9wZXJhbmQpLFxuXG5yZWNvcmRPZjooa2V5UGF0dD1NLmFueSgpLHZhbHVlUGF0dD1NLmFueSgpLGxpbWl0cz11bmRlZmluZWQpPT5cbm1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpyZWNvcmRPZicsW2tleVBhdHQsdmFsdWVQYXR0LGxpbWl0c10pLFxuYXJyYXlPZjooc3ViUGF0dD1NLmFueSgpLGxpbWl0cz11bmRlZmluZWQpPT5cbm1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDphcnJheU9mJyxbc3ViUGF0dCxsaW1pdHNdKSxcbnNldE9mOihrZXlQYXR0PU0uYW55KCksbGltaXRzPXVuZGVmaW5lZCk9PlxubWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOnNldE9mJyxba2V5UGF0dCxsaW1pdHNdKSxcbmJhZ09mOihrZXlQYXR0PU0uYW55KCksY291bnRQYXR0PU0uYW55KCksbGltaXRzPXVuZGVmaW5lZCk9PlxubWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOmJhZ09mJyxba2V5UGF0dCxjb3VudFBhdHQsbGltaXRzXSksXG5tYXBPZjooa2V5UGF0dD1NLmFueSgpLHZhbHVlUGF0dD1NLmFueSgpLGxpbWl0cz11bmRlZmluZWQpPT5cbm1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDptYXBPZicsW2tleVBhdHQsdmFsdWVQYXR0LGxpbWl0c10pLFxuc3BsaXRBcnJheTooYmFzZSxvcHRpb25hbD11bmRlZmluZWQscmVzdD11bmRlZmluZWQpPT5cbm1ha2VNYXRjaGVyKFxuJ21hdGNoOnNwbGl0QXJyYXknLFxubWFrZVNwbGl0UGF5bG9hZChbXSxiYXNlLG9wdGlvbmFsLHJlc3QpKSxcblxuc3BsaXRSZWNvcmQ6KGJhc2Usb3B0aW9uYWw9dW5kZWZpbmVkLHJlc3Q9dW5kZWZpbmVkKT0+XG5tYWtlTWF0Y2hlcihcbidtYXRjaDpzcGxpdFJlY29yZCcsXG5tYWtlU3BsaXRQYXlsb2FkKHt9LGJhc2Usb3B0aW9uYWwscmVzdCkpLFxuXG5zcGxpdDooYmFzZSxyZXN0PXVuZGVmaW5lZCk9PntcbmlmKHBhc3NTdHlsZU9mKGhhcmRlbihiYXNlKSk9PT0nY29weUFycmF5Jyl7XG4vL1xuLy9cbnJldHVybiBNLnNwbGl0QXJyYXkoYmFzZSxyZXN0JiZbXSxyZXN0KTtcbiB9ZWxzZXtcbnJldHVybiBNLnNwbGl0UmVjb3JkKGJhc2UscmVzdCYme30scmVzdCk7XG4gfVxuIH0sXG5wYXJ0aWFsOihiYXNlLHJlc3Q9dW5kZWZpbmVkKT0+e1xuaWYocGFzc1N0eWxlT2YoaGFyZGVuKGJhc2UpKT09PSdjb3B5QXJyYXknKXtcbi8vXG4vL1xucmV0dXJuIE0uc3BsaXRBcnJheShbXSxiYXNlLHJlc3QpO1xuIH1lbHNle1xucmV0dXJuIE0uc3BsaXRSZWNvcmQoe30sYmFzZSxyZXN0KTtcbiB9XG4gfSxcblxuZXJlZjoodCk9Pk0ub3IodCxNLnByb21pc2UoKSksXG5vcHQ6KHQpPT5NLm9yKE0udW5kZWZpbmVkKCksdCksXG5cbmludGVyZmFjZTooaW50ZXJmYWNlTmFtZSxtZXRob2RHdWFyZHMsb3B0aW9ucyk9PlxuLy9cbm1ha2VJbnRlcmZhY2VHdWFyZChpbnRlcmZhY2VOYW1lLG1ldGhvZEd1YXJkcyxvcHRpb25zKSxcbmNhbGw6KC4uLmFyZ1BhdHRlcm5zKT0+XG4vL1xubWFrZU1ldGhvZEd1YXJkTWFrZXIoJ3N5bmMnLGFyZ1BhdHRlcm5zKSxcbmNhbGxXaGVuOiguLi5hcmdHdWFyZHMpPT5cbi8vXG5tYWtlTWV0aG9kR3VhcmRNYWtlcignYXN5bmMnLGFyZ0d1YXJkcyksXG5cbmF3YWl0OihhcmdQYXR0ZXJuKT0+XG4vL1xubWFrZUF3YWl0QXJnR3VhcmQoYXJnUGF0dGVybiksXG5yYXc6KCk9PlxuLy9cbm1ha2VSYXdHdWFyZCgpfSk7XG5cblxucmV0dXJuIGhhcmRlbih7XG5jaGVja01hdGNoZXMsXG5tYXRjaGVzLFxubXVzdE1hdGNoLFxuYXNzZXJ0UGF0dGVybixcbmlzUGF0dGVybixcbmdldFJhbmtDb3Zlcixcbk0sXG5raW5kT2Z9KTtcblxuIH07XG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbmNvbnN0ICAgICAgIHtcbmNoZWNrTWF0Y2hlcyxcbm1hdGNoZXMsXG5tdXN0TWF0Y2gsXG5hc3NlcnRQYXR0ZXJuLFxuaXNQYXR0ZXJuLFxuZ2V0UmFua0NvdmVyLFxuTSxcbmtpbmRPZn09XG5tYWtlUGF0dGVybktpdCgpOyRozY9fb25jZS5jaGVja01hdGNoZXMoY2hlY2tNYXRjaGVzKTskaM2PX29uY2UubWF0Y2hlcyhtYXRjaGVzKTskaM2PX29uY2UubXVzdE1hdGNoKG11c3RNYXRjaCk7JGjNj19vbmNlLmFzc2VydFBhdHRlcm4oYXNzZXJ0UGF0dGVybik7JGjNj19vbmNlLmlzUGF0dGVybihpc1BhdHRlcm4pOyRozY9fb25jZS5nZXRSYW5rQ292ZXIoZ2V0UmFua0NvdmVyKTskaM2PX29uY2UuTShNKTskaM2PX29uY2Uua2luZE9mKGtpbmRPZik7XG5cbk1NPU07XG5cbi8vXG5cbi8vXG5jb25zdCBBd2FpdEFyZ0d1YXJkUGF5bG9hZFNoYXBlPWhhcmRlbih7XG5hcmdHdWFyZDpNLnBhdHRlcm4oKX0pO1xuXG5cbmNvbnN0ICAgICAgICBBd2FpdEFyZ0d1YXJkU2hhcGU9TS5raW5kKCdndWFyZDphd2FpdEFyZ0d1YXJkJyk7XG5cbi8qXG5cblxuICovJGjNj19vbmNlLkF3YWl0QXJnR3VhcmRTaGFwZShBd2FpdEFyZ0d1YXJkU2hhcGUpO1xuY29uc3QgICAgICAgIGlzQXdhaXRBcmdHdWFyZD0oc3BlY2ltZW4pPT5cbm1hdGNoZXMoc3BlY2ltZW4sQXdhaXRBcmdHdWFyZFNoYXBlKTskaM2PX29uY2UuaXNBd2FpdEFyZ0d1YXJkKGlzQXdhaXRBcmdHdWFyZCk7XG5oYXJkZW4oaXNBd2FpdEFyZ0d1YXJkKTtcblxuLypcblxuXG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRBd2FpdEFyZ0d1YXJkPShzcGVjaW1lbik9Pntcbm11c3RNYXRjaChzcGVjaW1lbixBd2FpdEFyZ0d1YXJkU2hhcGUsJ2F3YWl0QXJnR3VhcmQnKTtcbiB9OyRozY9fb25jZS5hc3NlcnRBd2FpdEFyZ0d1YXJkKGFzc2VydEF3YWl0QXJnR3VhcmQpO1xuaGFyZGVuKGFzc2VydEF3YWl0QXJnR3VhcmQpO1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgbWFrZUF3YWl0QXJnR3VhcmQ9KGFyZ1BhdHRlcm4pPT57XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCByZXN1bHQ9bWFrZVRhZ2dlZCgnZ3VhcmQ6YXdhaXRBcmdHdWFyZCcse1xuYXJnR3VhcmQ6YXJnUGF0dGVybn0pO1xuXG5hc3NlcnRBd2FpdEFyZ0d1YXJkKHJlc3VsdCk7XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8vXG5cbmNvbnN0IFJhd0d1YXJkUGF5bG9hZFNoYXBlPU0ucmVjb3JkKCk7XG5cbmNvbnN0ICAgICAgICBSYXdHdWFyZFNoYXBlPU0ua2luZCgnZ3VhcmQ6cmF3R3VhcmQnKTskaM2PX29uY2UuUmF3R3VhcmRTaGFwZShSYXdHdWFyZFNoYXBlKTtcblxuY29uc3QgICAgICAgIGlzUmF3R3VhcmQ9KHNwZWNpbWVuKT0+bWF0Y2hlcyhzcGVjaW1lbixSYXdHdWFyZFNoYXBlKTskaM2PX29uY2UuaXNSYXdHdWFyZChpc1Jhd0d1YXJkKTtcblxuY29uc3QgICAgICAgIGFzc2VydFJhd0d1YXJkPShzcGVjaW1lbik9PlxubXVzdE1hdGNoKHNwZWNpbWVuLFJhd0d1YXJkU2hhcGUsJ3Jhd0d1YXJkJyk7XG5cbi8qXG5cbiAqLyRozY9fb25jZS5hc3NlcnRSYXdHdWFyZChhc3NlcnRSYXdHdWFyZCk7XG5jb25zdCBtYWtlUmF3R3VhcmQ9KCk9Pm1ha2VUYWdnZWQoJ2d1YXJkOnJhd0d1YXJkJyx7fSk7XG5cbi8vXG4vL1xuXG5jb25zdCAgICAgICAgU3luY1ZhbHVlR3VhcmRTaGFwZT1NLm9yKFJhd0d1YXJkU2hhcGUsTS5wYXR0ZXJuKCkpOyRozY9fb25jZS5TeW5jVmFsdWVHdWFyZFNoYXBlKFN5bmNWYWx1ZUd1YXJkU2hhcGUpO1xuXG5jb25zdCAgICAgICAgU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGU9TS5hcnJheU9mKFN5bmNWYWx1ZUd1YXJkU2hhcGUpOyRozY9fb25jZS5TeW5jVmFsdWVHdWFyZExpc3RTaGFwZShTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSk7XG5cbmNvbnN0IEFyZ0d1YXJkU2hhcGU9TS5vcihSYXdHdWFyZFNoYXBlLEF3YWl0QXJnR3VhcmRTaGFwZSxNLnBhdHRlcm4oKSk7XG5jb25zdCAgICAgICAgQXJnR3VhcmRMaXN0U2hhcGU9TS5hcnJheU9mKEFyZ0d1YXJkU2hhcGUpOyRozY9fb25jZS5BcmdHdWFyZExpc3RTaGFwZShBcmdHdWFyZExpc3RTaGFwZSk7XG5cbmNvbnN0IFN5bmNNZXRob2RHdWFyZFBheWxvYWRTaGFwZT1oYXJkZW4oe1xuY2FsbEtpbmQ6J3N5bmMnLFxuYXJnR3VhcmRzOlN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlLFxub3B0aW9uYWxBcmdHdWFyZHM6TS5vcHQoU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUpLFxucmVzdEFyZ0d1YXJkOk0ub3B0KFN5bmNWYWx1ZUd1YXJkU2hhcGUpLFxucmV0dXJuR3VhcmQ6U3luY1ZhbHVlR3VhcmRTaGFwZX0pO1xuXG5cbmNvbnN0IEFzeW5jTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGU9aGFyZGVuKHtcbmNhbGxLaW5kOidhc3luYycsXG5hcmdHdWFyZHM6QXJnR3VhcmRMaXN0U2hhcGUsXG5vcHRpb25hbEFyZ0d1YXJkczpNLm9wdChBcmdHdWFyZExpc3RTaGFwZSksXG5yZXN0QXJnR3VhcmQ6TS5vcHQoU3luY1ZhbHVlR3VhcmRTaGFwZSksXG5yZXR1cm5HdWFyZDpTeW5jVmFsdWVHdWFyZFNoYXBlfSk7XG5cblxuY29uc3QgICAgICAgIE1ldGhvZEd1YXJkUGF5bG9hZFNoYXBlPU0ub3IoXG5TeW5jTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUsXG5Bc3luY01ldGhvZEd1YXJkUGF5bG9hZFNoYXBlKTskaM2PX29uY2UuTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUoTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBNZXRob2RHdWFyZFNoYXBlPU0ua2luZCgnZ3VhcmQ6bWV0aG9kR3VhcmQnKTtcblxuLypcblxuXG4gKi8kaM2PX29uY2UuTWV0aG9kR3VhcmRTaGFwZShNZXRob2RHdWFyZFNoYXBlKTtcbmNvbnN0ICAgICAgICBhc3NlcnRNZXRob2RHdWFyZD0oc3BlY2ltZW4pPT57XG5tdXN0TWF0Y2goc3BlY2ltZW4sTWV0aG9kR3VhcmRTaGFwZSwnbWV0aG9kR3VhcmQnKTtcbiB9OyRozY9fb25jZS5hc3NlcnRNZXRob2RHdWFyZChhc3NlcnRNZXRob2RHdWFyZCk7XG5oYXJkZW4oYXNzZXJ0TWV0aG9kR3VhcmQpO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZU1ldGhvZEd1YXJkTWFrZXI9KFxuY2FsbEtpbmQsXG5hcmdHdWFyZHMsXG5vcHRpb25hbEFyZ0d1YXJkcz11bmRlZmluZWQsXG5yZXN0QXJnR3VhcmQ9dW5kZWZpbmVkKT0+XG5cbmhhcmRlbih7XG5vcHRpb25hbDooLi4ub3B0QXJnR3VhcmRzKT0+e1xub3B0aW9uYWxBcmdHdWFyZHM9PT11bmRlZmluZWR8fFxuRmFpbCBgQ2FuIG9ubHkgaGF2ZSBvbmUgc2V0IG9mIG9wdGlvbmFsIGd1YXJkc2A7XG5yZXN0QXJnR3VhcmQ9PT11bmRlZmluZWR8fFxuRmFpbCBgb3B0aW9uYWwgYXJnIGd1YXJkcyBtdXN0IGNvbWUgYmVmb3JlIHJlc3QgYXJnYDtcbnJldHVybiBtYWtlTWV0aG9kR3VhcmRNYWtlcihjYWxsS2luZCxhcmdHdWFyZHMsb3B0QXJnR3VhcmRzKTtcbiB9LFxucmVzdDoockFyZ0d1YXJkKT0+e1xucmVzdEFyZ0d1YXJkPT09dW5kZWZpbmVkfHxGYWlsIGBDYW4gb25seSBoYXZlIG9uZSByZXN0IGFyZ2A7XG5yZXR1cm4gbWFrZU1ldGhvZEd1YXJkTWFrZXIoXG5jYWxsS2luZCxcbmFyZ0d1YXJkcyxcbm9wdGlvbmFsQXJnR3VhcmRzLFxuckFyZ0d1YXJkKTtcblxuIH0sXG5yZXR1cm5zOihyZXR1cm5HdWFyZD1NLnVuZGVmaW5lZCgpKT0+e1xuLyogICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHJlc3VsdD1tYWtlVGFnZ2VkKCdndWFyZDptZXRob2RHdWFyZCcse1xuY2FsbEtpbmQsXG5hcmdHdWFyZHMsXG5vcHRpb25hbEFyZ0d1YXJkcyxcbnJlc3RBcmdHdWFyZCxcbnJldHVybkd1YXJkfSk7XG5cbmFzc2VydE1ldGhvZEd1YXJkKHJlc3VsdCk7XG5yZXR1cm4gcmVzdWx0O1xuIH19KTtcblxuXG5jb25zdCAgICAgICAgSW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGU9TS5zcGxpdFJlY29yZChcbntcbmludGVyZmFjZU5hbWU6TS5zdHJpbmcoKSxcbm1ldGhvZEd1YXJkczpNLnJlY29yZE9mKE0uc3RyaW5nKCksTWV0aG9kR3VhcmRTaGFwZSl9LFxuXG57XG5kZWZhdWx0R3VhcmRzOk0ub3IoTS51bmRlZmluZWQoKSwncGFzc2FibGUnLCdyYXcnKSxcbnNsb3BweTpNLmJvb2xlYW4oKSxcbnN5bWJvbE1ldGhvZEd1YXJkczpNLm1hcE9mKE0uc3ltYm9sKCksTWV0aG9kR3VhcmRTaGFwZSl9KTskaM2PX29uY2UuSW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGUoSW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGUpO1xuXG5cblxuY29uc3QgICAgICAgIEludGVyZmFjZUd1YXJkU2hhcGU9TS5raW5kKCdndWFyZDppbnRlcmZhY2VHdWFyZCcpO1xuXG4vKlxuXG5cbiAqLyRozY9fb25jZS5JbnRlcmZhY2VHdWFyZFNoYXBlKEludGVyZmFjZUd1YXJkU2hhcGUpO1xuY29uc3QgICAgICAgIGFzc2VydEludGVyZmFjZUd1YXJkPShzcGVjaW1lbik9Pntcbm11c3RNYXRjaChzcGVjaW1lbixJbnRlcmZhY2VHdWFyZFNoYXBlLCdpbnRlcmZhY2VHdWFyZCcpO1xuIH07JGjNj19vbmNlLmFzc2VydEludGVyZmFjZUd1YXJkKGFzc2VydEludGVyZmFjZUd1YXJkKTtcbmhhcmRlbihhc3NlcnRJbnRlcmZhY2VHdWFyZCk7XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlSW50ZXJmYWNlR3VhcmQ9KGludGVyZmFjZU5hbWUsbWV0aG9kR3VhcmRzLG9wdGlvbnM9e30pPT57XG5jb25zdHtzbG9wcHk9ZmFsc2UsZGVmYXVsdEd1YXJkcz1zbG9wcHk/J3Bhc3NhYmxlJzp1bmRlZmluZWR9PVxub3B0aW9ucztcbi8vXG4vL1xuLy9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3Qgc3RyaW5nTWV0aG9kR3VhcmRzPXt9O1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3Qgc3ltYm9sTWV0aG9kR3VhcmRzRW50cmllcz1bXTtcbmZvcihjb25zdCBrZXkgb2Ygb3duS2V5cyhtZXRob2RHdWFyZHMpKXtcbmNvbnN0IHZhbHVlPW1ldGhvZEd1YXJkc1svKiAgICAgICAgICAgICAgICAgKi9rZXldO1xuaWYodHlwZW9mIGtleT09PSdzeW1ib2wnKXtcbnN5bWJvbE1ldGhvZEd1YXJkc0VudHJpZXMucHVzaChba2V5LHZhbHVlXSk7XG4gfWVsc2V7XG5zdHJpbmdNZXRob2RHdWFyZHNba2V5XT12YWx1ZTtcbiB9XG4gfVxuLyogICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHJlc3VsdD1tYWtlVGFnZ2VkKCdndWFyZDppbnRlcmZhY2VHdWFyZCcse1xuaW50ZXJmYWNlTmFtZSxcbm1ldGhvZEd1YXJkczpzdHJpbmdNZXRob2RHdWFyZHMsXG4uLi4oc3ltYm9sTWV0aG9kR3VhcmRzRW50cmllcy5sZW5ndGg/XG57c3ltYm9sTWV0aG9kR3VhcmRzOm1ha2VDb3B5TWFwKHN5bWJvbE1ldGhvZEd1YXJkc0VudHJpZXMpfTpcbnt9KSxcbmRlZmF1bHRHdWFyZHN9KTtcblxuYXNzZXJ0SW50ZXJmYWNlR3VhcmQocmVzdWx0KTtcbnJldHVybiAoLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9yZXN1bHQpO1xuIH07XG5cbmNvbnN0IEd1YXJkUGF5bG9hZFNoYXBlcz1oYXJkZW4oe1xuJ2d1YXJkOmF3YWl0QXJnR3VhcmQnOkF3YWl0QXJnR3VhcmRQYXlsb2FkU2hhcGUsXG4nZ3VhcmQ6cmF3R3VhcmQnOlJhd0d1YXJkUGF5bG9hZFNoYXBlLFxuJ2d1YXJkOm1ldGhvZEd1YXJkJzpNZXRob2RHdWFyZFBheWxvYWRTaGFwZSxcbidndWFyZDppbnRlcmZhY2VHdWFyZCc6SW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGV9KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmF1bHRMaW1pdHMiOlsiZGVmYXVsdExpbWl0cyJdLCJjaGVja01hdGNoZXMiOlsiY2hlY2tNYXRjaGVzIl0sIm1hdGNoZXMiOlsibWF0Y2hlcyJdLCJtdXN0TWF0Y2giOlsibXVzdE1hdGNoIl0sImFzc2VydFBhdHRlcm4iOlsiYXNzZXJ0UGF0dGVybiJdLCJpc1BhdHRlcm4iOlsiaXNQYXR0ZXJuIl0sImdldFJhbmtDb3ZlciI6WyJnZXRSYW5rQ292ZXIiXSwiTSI6WyJNIl0sImtpbmRPZiI6WyJraW5kT2YiXSwiQXdhaXRBcmdHdWFyZFNoYXBlIjpbIkF3YWl0QXJnR3VhcmRTaGFwZSJdLCJpc0F3YWl0QXJnR3VhcmQiOlsiaXNBd2FpdEFyZ0d1YXJkIl0sImFzc2VydEF3YWl0QXJnR3VhcmQiOlsiYXNzZXJ0QXdhaXRBcmdHdWFyZCJdLCJSYXdHdWFyZFNoYXBlIjpbIlJhd0d1YXJkU2hhcGUiXSwiaXNSYXdHdWFyZCI6WyJpc1Jhd0d1YXJkIl0sImFzc2VydFJhd0d1YXJkIjpbImFzc2VydFJhd0d1YXJkIl0sIlN5bmNWYWx1ZUd1YXJkU2hhcGUiOlsiU3luY1ZhbHVlR3VhcmRTaGFwZSJdLCJTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSI6WyJTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSJdLCJBcmdHdWFyZExpc3RTaGFwZSI6WyJBcmdHdWFyZExpc3RTaGFwZSJdLCJNZXRob2RHdWFyZFBheWxvYWRTaGFwZSI6WyJNZXRob2RHdWFyZFBheWxvYWRTaGFwZSJdLCJNZXRob2RHdWFyZFNoYXBlIjpbIk1ldGhvZEd1YXJkU2hhcGUiXSwiYXNzZXJ0TWV0aG9kR3VhcmQiOlsiYXNzZXJ0TWV0aG9kR3VhcmQiXSwiSW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGUiOlsiSW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGUiXSwiSW50ZXJmYWNlR3VhcmRTaGFwZSI6WyJJbnRlcmZhY2VHdWFyZFNoYXBlIl0sImFzc2VydEludGVyZmFjZUd1YXJkIjpbImFzc2VydEludGVyZmFjZUd1YXJkIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAVESyZ5AQAAeQEAACIAAABAZW5kby9wYXR0ZXJucy12MS40Ljgvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaM2PX2ltcG9ydHMoW10pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACPy9HxxBgAAcQYAACEAAABAZW5kby9wcm9taXNlLWtpdC12MS4xLjkvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiLCIuL3NyYy9tZW1vLXJhY2UuanMiLCIuL3NyYy9pcy1wcm9taXNlLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJtYWtlUHJvbWlzZUtpdCIsInJhY2VQcm9taXNlcyJdLCJyZWV4cG9ydHMiOlsiLi9zcmMvaXMtcHJvbWlzZS5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICBsZXQgbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0LG1lbW9SYWNlOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanNcIiwgW1tcIm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdFwiLCBbJGjNj19hID0+IChtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQgPSAkaM2PX2EpXV1dXSxbXCIuL3NyYy9tZW1vLXJhY2UuanNcIiwgW1tcIm1lbW9SYWNlXCIsIFskaM2PX2EgPT4gKG1lbW9SYWNlID0gJGjNj19hKV1dXV0sW1wiLi9zcmMvaXMtcHJvbWlzZS5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1ha2VQcm9taXNlS2l0LCAnbmFtZScsIHt2YWx1ZTogXCJtYWtlUHJvbWlzZUtpdFwifSk7JGjNj19vbmNlLm1ha2VQcm9taXNlS2l0KG1ha2VQcm9taXNlS2l0KTtPYmplY3QuZGVmaW5lUHJvcGVydHkocmFjZVByb21pc2VzLCAnbmFtZScsIHt2YWx1ZTogXCJyYWNlUHJvbWlzZXNcIn0pOyRozY9fb25jZS5yYWNlUHJvbWlzZXMocmFjZVByb21pc2VzKTsgICBcblxuXG5cblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IEJlc3RQaXBlbGluYWJsZVByb21pc2U9Z2xvYmFsVGhpcy5IYW5kbGVkUHJvbWlzZXx8UHJvbWlzZTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuZnVuY3Rpb24gICAgICAgIG1ha2VQcm9taXNlS2l0KCl7XG5jb25zdHtyZXNvbHZlLHJlamVjdCxleGVjdXRvcn09bWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KCk7XG5cbmNvbnN0IHByb21pc2U9bmV3IEJlc3RQaXBlbGluYWJsZVByb21pc2UoZXhlY3V0b3IpO1xuXG5yZXR1cm4gaGFyZGVuKHtwcm9taXNlLHJlc29sdmUscmVqZWN0fSk7XG4gfVxuaGFyZGVuKG1ha2VQcm9taXNlS2l0KTtcblxuLy9cbi8vXG4vL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG5mdW5jdGlvbiAgICAgICAgcmFjZVByb21pc2VzKHZhbHVlcyl7XG5yZXR1cm4gaGFyZGVuKG1lbW9SYWNlLmNhbGwoQmVzdFBpcGVsaW5hYmxlUHJvbWlzZSx2YWx1ZXMpKTtcbiB9XG5oYXJkZW4ocmFjZVByb21pc2VzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VQcm9taXNlS2l0IjpbIm1ha2VQcm9taXNlS2l0Il0sInJhY2VQcm9taXNlcyI6WyJyYWNlUHJvbWlzZXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAhjnUX4QCAACEAgAAKgAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuOS9zcmMvaXMtcHJvbWlzZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiaXNQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaM2PX2ltcG9ydHMoW10pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShpc1Byb21pc2UsICduYW1lJywge3ZhbHVlOiBcImlzUHJvbWlzZVwifSk7JGjNj19vbmNlLmlzUHJvbWlzZShpc1Byb21pc2UpOyAgIC8qXG5cblxuXG5cbiAqL1xuZnVuY3Rpb24gICAgICAgIGlzUHJvbWlzZShtYXliZVByb21pc2Upe1xucmV0dXJuIFByb21pc2UucmVzb2x2ZShtYXliZVByb21pc2UpPT09bWF5YmVQcm9taXNlO1xuIH1cbmhhcmRlbihpc1Byb21pc2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNQcm9taXNlIjpbImlzUHJvbWlzZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD4ynw6ywcAAMsHAAApAAAAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS45L3NyYy9tZW1vLXJhY2UuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1lbW9SYWNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaM2PX2ltcG9ydHMoW10pOyAgIC8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4qL1xuXG5jb25zdCBpc09iamVjdD0odmFsdWUpPT5PYmplY3QodmFsdWUpPT09dmFsdWU7XG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi9cblxuLy9cbi8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBrbm93blByb21pc2VzPW5ldyBXZWFrTWFwKCk7XG5cbi8qXG5cblxuICovXG5jb25zdCBtYXJrU2V0dGxlZD0ocmVjb3JkKT0+e1xuaWYoIXJlY29yZHx8cmVjb3JkLnNldHRsZWQpe1xucmV0dXJuIG5ldyBTZXQoKTtcbiB9XG5cbmNvbnN0e2RlZmVycmVkc309cmVjb3JkO1xuT2JqZWN0LmFzc2lnbihyZWNvcmQse1xuZGVmZXJyZWRzOnVuZGVmaW5lZCxcbnNldHRsZWQ6dHJ1ZX0pO1xuXG5PYmplY3QuZnJlZXplKHJlY29yZCk7XG5yZXR1cm4gZGVmZXJyZWRzO1xuIH07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGdldE1lbW9SZWNvcmQ9KHZhbHVlKT0+e1xuaWYoIWlzT2JqZWN0KHZhbHVlKSl7XG4vL1xuLy9cbi8vXG4vL1xucmV0dXJuIGhhcmRlbih7c2V0dGxlZDp0cnVlfSk7XG4gfVxuXG5sZXQgcmVjb3JkPWtub3duUHJvbWlzZXMuZ2V0KHZhbHVlKTtcblxuaWYoIXJlY29yZCl7XG5yZWNvcmQ9e2RlZmVycmVkczpuZXcgU2V0KCksc2V0dGxlZDpmYWxzZX07XG5rbm93blByb21pc2VzLnNldCh2YWx1ZSxyZWNvcmQpO1xuLy9cblByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihcbih2YWwpPT57XG5mb3IoY29uc3R7cmVzb2x2ZX1vZiBtYXJrU2V0dGxlZChyZWNvcmQpKXtcbnJlc29sdmUodmFsKTtcbiB9XG4gfSxcbihlcnIpPT57XG5mb3IoY29uc3R7cmVqZWN0fW9mIG1hcmtTZXR0bGVkKHJlY29yZCkpe1xucmVqZWN0KGVycik7XG4gfVxuIH0pO1xuXG4gfVxucmV0dXJuIHJlY29yZDtcbiB9O1xuXG5jb25zdHtyYWNlfT17XG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG5yYWNlKHZhbHVlcyl7XG5sZXQgZGVmZXJyZWQ7XG4vKiAgICAgICAgICAgICAgICAgKi9cbi8vXG5jb25zdCBjYWNoZWRWYWx1ZXM9W107XG5jb25zdCBDPXRoaXM7XG5jb25zdCByZXN1bHQ9bmV3IEMoKHJlc29sdmUscmVqZWN0KT0+e1xuZGVmZXJyZWQ9e3Jlc29sdmUscmVqZWN0fTtcbmZvcihjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpe1xuY2FjaGVkVmFsdWVzLnB1c2godmFsdWUpO1xuY29uc3R7c2V0dGxlZCxkZWZlcnJlZHN9PWdldE1lbW9SZWNvcmQodmFsdWUpO1xuaWYoc2V0dGxlZCl7XG4vL1xuLy9cbkMucmVzb2x2ZSh2YWx1ZSkudGhlbihyZXNvbHZlLHJlamVjdCk7XG4gfWVsc2V7XG5kZWZlcnJlZHMuYWRkKGRlZmVycmVkKTtcbiB9XG4gfVxuIH0pO1xuXG4vL1xuLy9cbnJldHVybiByZXN1bHQuZmluYWxseSgoKT0+e1xuZm9yKGNvbnN0IHZhbHVlIG9mIGNhY2hlZFZhbHVlcyl7XG5jb25zdHtkZWZlcnJlZHN9PWdldE1lbW9SZWNvcmQodmFsdWUpO1xuaWYoZGVmZXJyZWRzKXtcbmRlZmVycmVkcy5kZWxldGUoZGVmZXJyZWQpO1xuIH1cbiB9XG4gfSk7XG4gfX07JGjNj19vbmNlLnJhY2UocmFjZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtZW1vUmFjZSI6WyJyYWNlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADwUN+6rBQAAqwUAADQAAABAZW5kby9wcm9taXNlLWtpdC12MS4xLjkvc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRozY9faW1wb3J0cyhbXSk7ICAgLy9cblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQ9KCk9Pntcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xubGV0IGludGVybmFsUmVzb2x2ZTtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmxldCBpbnRlcm5hbFJlamVjdDtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHJlc29sdmU9KHZhbHVlKT0+e1xuaWYoaW50ZXJuYWxSZXNvbHZlKXtcbmludGVybmFsUmVzb2x2ZSh2YWx1ZSk7XG5pbnRlcm5hbFJlc29sdmU9bnVsbDtcbmludGVybmFsUmVqZWN0PW51bGw7XG4gfWVsc2V7XG5hc3NlcnQoaW50ZXJuYWxSZXNvbHZlPT09bnVsbCk7XG4gfVxuIH07XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgcmVqZWN0PShyZWFzb24pPT57XG5pZihpbnRlcm5hbFJlamVjdCl7XG5pbnRlcm5hbFJlamVjdChyZWFzb24pO1xuaW50ZXJuYWxSZXNvbHZlPW51bGw7XG5pbnRlcm5hbFJlamVjdD1udWxsO1xuIH1lbHNle1xuYXNzZXJ0KGludGVybmFsUmVqZWN0PT09bnVsbCk7XG4gfVxuIH07XG5cbmNvbnN0IGV4ZWN1dG9yPShyZXMscmVqKT0+e1xuYXNzZXJ0KGludGVybmFsUmVzb2x2ZT09PXVuZGVmaW5lZCYmaW50ZXJuYWxSZWplY3Q9PT11bmRlZmluZWQpO1xuaW50ZXJuYWxSZXNvbHZlPXJlcztcbmludGVybmFsUmVqZWN0PXJlajtcbiB9O1xuXG5yZXR1cm4gaGFyZGVuKHtyZXNvbHZlLHJlamVjdCxleGVjdXRvcn0pO1xuIH07JGjNj19vbmNlLm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdChtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQpO1xuaGFyZGVuKG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiOlsibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAVESyZ5AQAAeQEAACUAAABAZW5kby9wcm9taXNlLWtpdC12MS4xLjkvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaM2PX2ltcG9ydHMoW10pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAG3xa+/EQAAvxEAABwAAABAZW5kby9zdHJlYW0tdjEuMi45L2luZGV4LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbIm1ha2VQaXBlIiwibWFrZVF1ZXVlIiwibWFrZVN0cmVhbSIsIm1hcFJlYWRlciIsIm1hcFdyaXRlciIsInByaW1lIiwicHVtcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgbGV0IEUsbWFrZVByb21pc2VLaXQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wibWFrZVByb21pc2VLaXRcIiwgWyRozY9fYSA9PiAobWFrZVByb21pc2VLaXQgPSAkaM2PX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLy9cbi8vXG4vL1xuY29uc3QgZnJlZXplPS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9PYmplY3QuZnJlZXplO1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgICAgICAgIG1ha2VRdWV1ZT0oKT0+e1xubGV0e3Byb21pc2U6dGFpbFByb21pc2UscmVzb2x2ZTp0YWlsUmVzb2x2ZX09bWFrZVByb21pc2VLaXQoKTtcbnJldHVybntcbnB1dCh2YWx1ZSl7XG5jb25zdHtyZXNvbHZlLHByb21pc2V9PW1ha2VQcm9taXNlS2l0KCk7XG50YWlsUmVzb2x2ZShmcmVlemUoe3ZhbHVlLHByb21pc2V9KSk7XG50YWlsUmVzb2x2ZT1yZXNvbHZlO1xuIH0sXG5nZXQoKXtcbmNvbnN0IHByb21pc2U9dGFpbFByb21pc2UudGhlbigobmV4dCk9Pm5leHQudmFsdWUpO1xudGFpbFByb21pc2U9dGFpbFByb21pc2UudGhlbigobmV4dCk9Pm5leHQucHJvbWlzZSk7XG5yZXR1cm4gaGFyZGVuKHByb21pc2UpO1xuIH19O1xuXG4gfTskaM2PX29uY2UubWFrZVF1ZXVlKG1ha2VRdWV1ZSk7XG5oYXJkZW4obWFrZVF1ZXVlKTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIG1ha2VTdHJlYW09KGFja3MsZGF0YSk9PntcbmNvbnN0IHN0cmVhbT1oYXJkZW4oe1xuLypcblxuICAgICAqL1xubmV4dCh2YWx1ZSl7XG4vL1xuLy9cbmRhdGEucHV0KGZyZWV6ZSh7dmFsdWUsZG9uZTpmYWxzZX0pKTtcbnJldHVybiBhY2tzLmdldCgpO1xuIH0sXG4vKlxuXG4gICAgICovXG5yZXR1cm4odmFsdWUpe1xuZGF0YS5wdXQoZnJlZXplKHt2YWx1ZSxkb25lOnRydWV9KSk7XG5yZXR1cm4gYWNrcy5nZXQoKTtcbiB9LFxuLypcblxuICAgICAqL1xudGhyb3coZXJyb3Ipe1xuZGF0YS5wdXQoaGFyZGVuKFByb21pc2UucmVqZWN0KGVycm9yKSkpO1xucmV0dXJuIGFja3MuZ2V0KCk7XG4gfSxcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKXtcbnJldHVybiBzdHJlYW07XG4gfX0pO1xuXG5yZXR1cm4gc3RyZWFtO1xuIH07JGjNj19vbmNlLm1ha2VTdHJlYW0obWFrZVN0cmVhbSk7XG5oYXJkZW4obWFrZVN0cmVhbSk7XG5cbi8vXG4vL1xuLy9cbmNvbnN0ICAgICAgICBtYWtlUGlwZT0oKT0+e1xuY29uc3QgZGF0YT1tYWtlUXVldWUoKTtcbmNvbnN0IGFja3M9bWFrZVF1ZXVlKCk7XG5jb25zdCByZWFkZXI9bWFrZVN0cmVhbShhY2tzLGRhdGEpO1xuY29uc3Qgd3JpdGVyPW1ha2VTdHJlYW0oZGF0YSxhY2tzKTtcbnJldHVybiBoYXJkZW4oW3dyaXRlcixyZWFkZXJdKTtcbiB9OyRozY9fb25jZS5tYWtlUGlwZShtYWtlUGlwZSk7XG5oYXJkZW4obWFrZVBpcGUpO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBwdW1wPWFzeW5jKHdyaXRlcixyZWFkZXIscHJpbWVyKT0+e1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgdGljaz0ocHJvbWlzZSk9PlxuRS53aGVuKFxucHJvbWlzZSxcbihyZXN1bHQpPT57XG5pZihyZXN1bHQuZG9uZSl7XG5yZXR1cm4gd3JpdGVyLnJldHVybihyZXN1bHQudmFsdWUpO1xuIH1lbHNle1xuLy9cbi8vXG5yZXR1cm4gdG9jayh3cml0ZXIubmV4dChyZXN1bHQudmFsdWUpKTtcbiB9XG4gfSxcbigvKiAgICAgICAgICAgICAgICAqL2Vycm9yKT0+e1xucmV0dXJuIHdyaXRlci50aHJvdyhlcnJvcik7XG4gfSk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgdG9jaz0ocHJvbWlzZSk9PlxuRS53aGVuKFxucHJvbWlzZSxcbihyZXN1bHQpPT57XG5pZihyZXN1bHQuZG9uZSl7XG5yZXR1cm4gcmVhZGVyLnJldHVybihyZXN1bHQudmFsdWUpO1xuIH1lbHNle1xucmV0dXJuIHRpY2socmVhZGVyLm5leHQocmVzdWx0LnZhbHVlKSk7XG4gfVxuIH0sXG4oLyogICAgICAgICAgICAgICAgKi9lcnJvcik9PntcbnJldHVybiByZWFkZXIudGhyb3coZXJyb3IpO1xuIH0pO1xuXG5hd2FpdCB0aWNrKHJlYWRlci5uZXh0KHByaW1lcikpO1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9OyRozY9fb25jZS5wdW1wKHB1bXApO1xuaGFyZGVuKHB1bXApO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgICAgICAgIHByaW1lPShnZW5lcmF0b3IscHJpbWVyKT0+e1xuLy9cbmNvbnN0IGZpcnN0PWdlbmVyYXRvci5uZXh0KHByaW1lcik7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5sZXQgcmVzdWx0O1xuY29uc3QgcHJpbWVkPWhhcmRlbih7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICBhc3luYyBuZXh0KHZhbHVlKXtcbmlmKHJlc3VsdD09PXVuZGVmaW5lZCl7XG4vL1xucmVzdWx0PWF3YWl0IGZpcnN0O1xuaWYocmVzdWx0LmRvbmUpe1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfVxucmV0dXJuIGdlbmVyYXRvci5uZXh0KHZhbHVlKTtcbiB9LFxuLyogICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgIGFzeW5jIHJldHVybih2YWx1ZSl7XG5pZihyZXN1bHQ9PT11bmRlZmluZWQpe1xuLy9cbnJlc3VsdD1hd2FpdCBmaXJzdDtcbmlmKHJlc3VsdC5kb25lKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbnJldHVybiBnZW5lcmF0b3IucmV0dXJuKHZhbHVlKTtcbiB9LFxuLyogICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICBhc3luYyB0aHJvdyhlcnJvcil7XG5pZihyZXN1bHQ9PT11bmRlZmluZWQpe1xuLy9cbnJlc3VsdD1hd2FpdCBmaXJzdDtcbmlmKHJlc3VsdC5kb25lKXtcbnRocm93IGVycm9yO1xuIH1cbiB9XG5yZXR1cm4gZ2VuZXJhdG9yLnRocm93KGVycm9yKTtcbiB9fSk7XG5cbnJldHVybiBwcmltZWQ7XG4gfTskaM2PX29uY2UucHJpbWUocHJpbWUpO1xuaGFyZGVuKHByaW1lKTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBtYXBSZWFkZXI9KHJlYWRlcix0cmFuc2Zvcm0pPT57XG5hc3luYyBmdW5jdGlvbip0cmFuc2Zvcm1HZW5lcmF0b3IoKXtcbmZvciBhd2FpdChjb25zdCB2YWx1ZSBvZiByZWFkZXIpe1xueWllbGQgdHJhbnNmb3JtKHZhbHVlKTtcbiB9XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmhhcmRlbih0cmFuc2Zvcm1HZW5lcmF0b3IpO1xucmV0dXJuIGhhcmRlbih0cmFuc2Zvcm1HZW5lcmF0b3IoKSk7XG4gfTskaM2PX29uY2UubWFwUmVhZGVyKG1hcFJlYWRlcik7XG5oYXJkZW4obWFwUmVhZGVyKTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBtYXBXcml0ZXI9KHdyaXRlcix0cmFuc2Zvcm0pPT57XG5jb25zdCB0cmFuc2Zvcm1lZFdyaXRlcj1oYXJkZW4oe1xuLypcblxuICAgICAqL1xuICAgICAgYXN5bmMgbmV4dCh2YWx1ZSl7XG5yZXR1cm4gd3JpdGVyLm5leHQodHJhbnNmb3JtKHZhbHVlKSk7XG4gfSxcbi8qXG5cbiAgICAgKi9cbiAgICAgIGFzeW5jIHRocm93KGVycm9yKXtcbnJldHVybiB3cml0ZXIudGhyb3coZXJyb3IpO1xuIH0sXG4vKlxuXG4gICAgICovXG4gICAgICBhc3luYyByZXR1cm4odmFsdWUpe1xucmV0dXJuIHdyaXRlci5yZXR1cm4odmFsdWUpO1xuIH0sXG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCl7XG5yZXR1cm4gdHJhbnNmb3JtZWRXcml0ZXI7XG4gfX0pO1xuXG5yZXR1cm4gdHJhbnNmb3JtZWRXcml0ZXI7XG4gfTskaM2PX29uY2UubWFwV3JpdGVyKG1hcFdyaXRlcik7XG5oYXJkZW4obWFwV3JpdGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VRdWV1ZSI6WyJtYWtlUXVldWUiXSwibWFrZVN0cmVhbSI6WyJtYWtlU3RyZWFtIl0sIm1ha2VQaXBlIjpbIm1ha2VQaXBlIl0sInB1bXAiOlsicHVtcCJdLCJwcmltZSI6WyJwcmltZSJdLCJtYXBSZWFkZXIiOlsibWFwUmVhZGVyIl0sIm1hcFdyaXRlciI6WyJtYXBXcml0ZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA9AzO3/IBAADyAQAAHAAAAGplc3NpZS5qcy12MC4zLjQvc3JjL21haW4uanN7ImltcG9ydHMiOlsiLi9yaW5nMC9tYWluLmpzIiwiLi9yaW5nMS9tYWluLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9yaW5nMC9tYWluLmpzIiwiLi9yaW5nMS9tYWluLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaM2PX2ltcG9ydHMoW1tcIi4vcmluZzAvbWFpbi5qc1wiLCBbXV0sW1wiLi9yaW5nMS9tYWluLmpzXCIsIFtdXV0pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFbHvW+iAQAAogEAAB8AAABqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMC9FLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIkBlbmRvL2ZhciJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjNj19pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW11dXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAfL3MT54CAACeAgAALAAAAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcwL2FzeW5jLWdlbmVyYXRlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJhc3luY0dlbmVyYXRlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaM2PX2ltcG9ydHMoW10pOyAgIC8vXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBhc3luY0dlbmVyYXRlPShuZXh0KT0+e1xucmV0dXJuIGhhcmRlbih7XG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT57XG5yZXR1cm4gaGFyZGVuKHtcbm5leHQ6YXN5bmMoKT0+aGFyZGVuKG5leHQoKSl9KTtcblxuIH19KTtcblxuIH07JGjNj19vbmNlLmFzeW5jR2VuZXJhdGUoYXN5bmNHZW5lcmF0ZSk7XG5oYXJkZW4oYXN5bmNHZW5lcmF0ZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3luY0dlbmVyYXRlIjpbImFzeW5jR2VuZXJhdGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAm0gutxUCAAAVAgAAIgAAAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcwL21haW4uanN7ImltcG9ydHMiOlsiLi9FLmpzIiwiLi9tYWtlcnMuanMiLCIuL2FzeW5jLWdlbmVyYXRlLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9FLmpzIiwiLi9hc3luYy1nZW5lcmF0ZS5qcyIsIi4vbWFrZXJzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7ICAgaW1wb3J0czogJGjNj19pbXBvcnRzLCAgIGxpdmVWYXI6ICRozY9fbGl2ZSwgICBvbmNlVmFyOiAkaM2PX29uY2UsICAgaW1wb3J0OiAkaM2PX2ltcG9ydCwgICBpbXBvcnRNZXRhOiAkaM2PX19fX21ldGEsIH0pID0+IChmdW5jdGlvbiAoKSB7ICd1c2Ugc3RyaWN0JzsgICAkaM2PX2ltcG9ydHMoW1tcIi4vRS5qc1wiLCBbXV0sW1wiLi9tYWtlcnMuanNcIiwgW11dLFtcIi4vYXN5bmMtZ2VuZXJhdGUuanNcIiwgW11dXSk7ICAgXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA2+a/P/sHAAD7BwAAJAAAAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcwL21ha2Vycy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWFrZU1hcCIsIm1ha2VQcm9taXNlIiwibWFrZVNldCIsIm1ha2VXZWFrTWFwIiwibWFrZVdlYWtTZXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgICRozY9faW1wb3J0cyhbXSk7ICAgLy9cbi8vXG4vL1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0ICAgICAgICBtYWtlUHJvbWlzZT0oZXhlY3V0b3IpPT5oYXJkZW4obmV3IFByb21pc2UoZXhlY3V0b3IpKTskaM2PX29uY2UubWFrZVByb21pc2UobWFrZVByb21pc2UpO1xuaGFyZGVuKG1ha2VQcm9taXNlKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgICAgICAgIG1ha2VNYXA9KGVudHJpZXNPckl0ZXJhYmxlKT0+aGFyZGVuKG5ldyBNYXAoZW50cmllc09ySXRlcmFibGUpKTskaM2PX29uY2UubWFrZU1hcChtYWtlTWFwKTtcbmhhcmRlbihtYWtlTWFwKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0ICAgICAgICBtYWtlU2V0PSh2YWx1ZXMpPT5oYXJkZW4obmV3IFNldCh2YWx1ZXMpKTskaM2PX29uY2UubWFrZVNldChtYWtlU2V0KTtcbmhhcmRlbihtYWtlU2V0KTtcblxuLypcblxuXG5cbiAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgICAgICAgIG1ha2VXZWFrTWFwPShlbnRyaWVzKT0+aGFyZGVuKG5ldyBXZWFrTWFwKGVudHJpZXMpKTskaM2PX29uY2UubWFrZVdlYWtNYXAobWFrZVdlYWtNYXApO1xuaGFyZGVuKG1ha2VXZWFrTWFwKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCAgICAgICAgbWFrZVdlYWtTZXQ9KHZhbHVlcyk9PmhhcmRlbihuZXcgV2Vha1NldCh2YWx1ZXMpKTskaM2PX29uY2UubWFrZVdlYWtTZXQobWFrZVdlYWtTZXQpO1xuaGFyZGVuKG1ha2VXZWFrU2V0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VQcm9taXNlIjpbIm1ha2VQcm9taXNlIl0sIm1ha2VNYXAiOlsibWFrZU1hcCJdLCJtYWtlU2V0IjpbIm1ha2VTZXQiXSwibWFrZVdlYWtNYXAiOlsibWFrZVdlYWtNYXAiXSwibWFrZVdlYWtTZXQiOlsibWFrZVdlYWtTZXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAr9Pr6ngDAAB4AwAAKQAAAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcxL2FzeW5jLXRvb2xzLmpzeyJpbXBvcnRzIjpbIi4uL3JpbmcwL21haW4uanMiXSwiZXhwb3J0cyI6WyJhc3luY0RvV2hpbGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHsgICBpbXBvcnRzOiAkaM2PX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjNj19saXZlLCAgIG9uY2VWYXI6ICRozY9fb25jZSwgICBpbXBvcnQ6ICRozY9faW1wb3J0LCAgIGltcG9ydE1ldGE6ICRozY9fX19fbWV0YSwgfSkgPT4gKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnOyAgIGxldCBtYWtlUHJvbWlzZTskaM2PX2ltcG9ydHMoW1tcIi4uL3JpbmcwL21haW4uanNcIiwgW1tcIm1ha2VQcm9taXNlXCIsIFskaM2PX2EgPT4gKG1ha2VQcm9taXNlID0gJGjNj19hKV1dXV1dKTsgICBcblxuXG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCAgICAgICAgYXN5bmNEb1doaWxlPShib2R5KT0+e1xucmV0dXJuIG1ha2VQcm9taXNlKChyZXNvbHZlLHJlamVjdCk9PntcbmNvbnN0IGxvb3A9YXN5bmMoKT0+e1xuY29uc3QgZG9Db250aW51ZT1hd2FpdCBib2R5KCk7XG5pZighZG9Db250aW51ZSl7XG4vL1xucmVzb2x2ZSh1bmRlZmluZWQpO1xucmV0dXJuO1xuIH1cblxuLy9cbi8vXG5sb29wKCkuY2F0Y2gocmVqZWN0KTtcbiB9O1xuXG5sb29wKCkuY2F0Y2gocmVqZWN0KTtcbiB9KTtcbiB9OyRozY9fb25jZS5hc3luY0RvV2hpbGUoYXN5bmNEb1doaWxlKTtcbmhhcmRlbihhc3luY0RvV2hpbGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXN5bmNEb1doaWxlIjpbImFzeW5jRG9XaGlsZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAGX4r/twEAALcBAAAiAAAAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzEvbWFpbi5qc3siaW1wb3J0cyI6WyIuL2FzeW5jLXRvb2xzLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9hc3luYy10b29scy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoeyAgIGltcG9ydHM6ICRozY9faW1wb3J0cywgICBsaXZlVmFyOiAkaM2PX2xpdmUsICAgb25jZVZhcjogJGjNj19vbmNlLCAgIGltcG9ydDogJGjNj19pbXBvcnQsICAgaW1wb3J0TWV0YTogJGjNj19fX19tZXRhLCB9KSA9PiAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7ICAgJGjNj19pbXBvcnRzKFtbXCIuL2FzeW5jLXRvb2xzLmpzXCIsIFtdXV0pOyAgIFxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwECHgMKAAAAAAAAAAAADuKlYBv8AAAb/AAAFAAAAAAAAAAAAAAApIEAAAAAY29tcGFydG1lbnQtbWFwLmpzb25QSwECHgMKAAAAAAAAAAAA6Ci7KK4BAACuAQAAJgAAAAAAAAAAAAAApIFN/AAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4xLXUxOS4wL2hlYXAuanNQSwECHgMKAAAAAAAAAAAABURLJnkBAAB5AQAALQAAAAAAAAAAAAAApIE//gAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4xLXUxOS4wL3NyYy9leHBvcnRzLmpzUEsBAh4DCgAAAAAAAAAAAFsSJJmICgAAiAoAACoAAAAAAAAAAAAAAKSBAwABAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMS11MTkuMC9zcmMvaGVhcC5qc1BLAQIeAwoAAAAAAAAAAADM7NELmgIAAJoCAAArAAAAAAAAAAAAAACkgdMKAQBAYWdvcmljL2Jhc2Utem9uZS12MC4xLjEtdTE5LjAvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAFHYlYOHAgAAhwIAADEAAAAAAAAAAAAAAKSBtg0BAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMS11MTkuMC9zcmMvaXMtcGFzc2FibGUuanNQSwECHgMKAAAAAAAAAAAAfuQVJKQDAACkAwAAKgAAAAAAAAAAAAAApIGMEAEAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4xLXUxOS4wL3NyYy9rZXlzLmpzUEsBAh4DCgAAAAAAAAAAAAmW5j0RBwAAEQcAAC8AAAAAAAAAAAAAAKSBeBQBAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMS11MTkuMC9zcmMvbWFrZS1vbmNlLmpzUEsBAh4DCgAAAAAAAAAAAAF0ivuOCQAAjgkAADMAAAAAAAAAAAAAAKSB1hsBAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMS11MTkuMC9zcmMvd2F0Y2gtcHJvbWlzZS5qc1BLAQIeAwoAAAAAAAAAAABI8rnVKAUAACgFAAAnAAAAAAAAAAAAAACkgbUlAQBAYWdvcmljL2NhY2hlLXYwLjMuMy11MTkuMi9zcmMvY2FjaGUuanNQSwECHgMKAAAAAAAAAAAAEp8LsTICAAAyAgAAJgAAAAAAAAAAAAAApIEiKwEAQGFnb3JpYy9jYWNoZS12MC4zLjMtdTE5LjIvc3JjL21haW4uanNQSwECHgMKAAAAAAAAAAAAjLwXyzsEAAA7BAAAJwAAAAAAAAAAAAAApIGYLQEAQGFnb3JpYy9jYWNoZS12MC4zLjMtdTE5LjIvc3JjL3N0YXRlLmpzUEsBAh4DCgAAAAAAAAAAAGUXsNCxFwAAsRcAACcAAAAAAAAAAAAAAKSBGDIBAEBhZ29yaWMvY2FjaGUtdjAuMy4zLXUxOS4yL3NyYy9zdG9yZS5qc1BLAQIeAwoAAAAAAAAAAAAFREsmeQEAAHkBAAAnAAAAAAAAAAAAAACkgQ5KAQBAYWdvcmljL2NhY2hlLXYwLjMuMy11MTkuMi9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAR1HsYi8dAAAvHQAALAAAAAAAAAAAAAAApIHMSwEAQGFnb3JpYy9lcnRwLXYwLjE2LjMtdTE5LjIvc3JjL2Ftb3VudE1hdGguanNQSwECHgMKAAAAAAAAAAAASpDQfAMEAAADBAAALQAAAAAAAAAAAAAApIFFaQEAQGFnb3JpYy9lcnRwLXYwLjE2LjMtdTE5LjIvc3JjL2Ftb3VudFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAEW1HBr2BQAA9gUAAC0AAAAAAAAAAAAAAKSBk20BAEBhZ29yaWMvZXJ0cC12MC4xNi4zLXUxOS4yL3NyYy9kaXNwbGF5SW5mby5qc1BLAQIeAwoAAAAAAAAAAABflpC2bgIAAG4CAAAnAAAAAAAAAAAAAACkgdRzAQBAYWdvcmljL2VydHAtdjAuMTYuMy11MTkuMi9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA8AMt5RQWAAAUFgAAKwAAAAAAAAAAAAAApIGHdgEAQGFnb3JpYy9lcnRwLXYwLjE2LjMtdTE5LjIvc3JjL2lzc3VlcktpdC5qc1BLAQIeAwoAAAAAAAAAAADfxm6nEAYAABAGAABAAAAAAAAAAAAAAACkgeSMAQBAYWdvcmljL2VydHAtdjAuMTYuMy11MTkuMi9zcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAF7BS2/OBQAAzgUAAEAAAAAAAAAAAAAAAKSBUpMBAEBhZ29yaWMvZXJ0cC12MC4xNi4zLXUxOS4yL3NyYy9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAmYWgJpYEAACWBAAAPAAAAAAAAAAAAAAApIF+mQEAQGFnb3JpYy9lcnRwLXYwLjE2LjMtdTE5LjIvc3JjL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAFYLCPF3BgAAdwYAADwAAAAAAAAAAAAAAKSBbp4BAEBhZ29yaWMvZXJ0cC12MC4xNi4zLXUxOS4yL3NyYy9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAACNv2nesgMAALIDAAApAAAAAAAAAAAAAACkgT+lAQBAYWdvcmljL2VydHAtdjAuMTYuMy11MTkuMi9zcmMvcGF5bWVudC5qc1BLAQIeAwoAAAAAAAAAAACSKeo7GiAAABogAAAvAAAAAAAAAAAAAACkgTipAQBAYWdvcmljL2VydHAtdjAuMTYuMy11MTkuMi9zcmMvcGF5bWVudExlZGdlci5qc1BLAQIeAwoAAAAAAAAAAAB6MPeJ6RAAAOkQAAAnAAAAAAAAAAAAAACkgZ/JAQBAYWdvcmljL2VydHAtdjAuMTYuMy11MTkuMi9zcmMvcHVyc2UuanNQSwECHgMKAAAAAAAAAAAAMcOXKwUGAAAFBgAAMwAAAAAAAAAAAAAApIHN2gEAQGFnb3JpYy9lcnRwLXYwLjE2LjMtdTE5LjIvc3JjL3RyYW5zaWVudE5vdGlmaWVyLmpzUEsBAh4DCgAAAAAAAAAAAMHev5j7GAAA+xgAACwAAAAAAAAAAAAAAKSBI+EBAEBhZ29yaWMvZXJ0cC12MC4xNi4zLXUxOS4yL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAAAVESyZ5AQAAeQEAAC0AAAAAAAAAAAAAAKSBaPoBAEBhZ29yaWMvZXJ0cC12MC4xNi4zLXUxOS4yL3NyYy90eXBlcy1pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACdrdzfGBoAABgaAAAtAAAAAAAAAAAAAACkgSz8AQBAYWdvcmljL2ludGVybmFsLXYwLjQuMC11MTkuMi9zcmMvY2FsbGJhY2suanNQSwECHgMKAAAAAAAAAAAAc9Be4fwFAAD8BQAAKwAAAAAAAAAAAAAApIGPFgIAQGFnb3JpYy9pbnRlcm5hbC12MC40LjAtdTE5LjIvc3JjL2NvbmZpZy5qc1BLAQIeAwoAAAAAAAAAAABfgxaqdwQAAHcEAAAqAAAAAAAAAAAAAACkgdQcAgBAYWdvcmljL2ludGVybmFsLXYwLjQuMC11MTkuMi9zcmMvZGVidWcuanNQSwECHgMKAAAAAAAAAAAA04mhv70CAAC9AgAAKwAAAAAAAAAAAAAApIGTIQIAQGFnb3JpYy9pbnRlcm5hbC12MC40LjAtdTE5LjIvc3JjL2Vycm9ycy5qc1BLAQIeAwoAAAAAAAAAAAAh0KVyogUAAKIFAAAqAAAAAAAAAAAAAACkgZkkAgBAYWdvcmljL2ludGVybmFsLXYwLjQuMC11MTkuMi9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAlCl+YfAJAADwCQAALQAAAAAAAAAAAAAApIGDKgIAQGFnb3JpYy9pbnRlcm5hbC12MC40LjAtdTE5LjIvc3JjL2pzLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAB8JSuECFgAAAhYAADUAAAAAAAAAAAAAAKSBvjQCAEBhZ29yaWMvaW50ZXJuYWwtdjAuNC4wLXUxOS4yL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzUEsBAh4DCgAAAAAAAAAAAMJiin1AEAAAQBAAACwAAAAAAAAAAAAAAKSBE0sCAEBhZ29yaWMvaW50ZXJuYWwtdjAuNC4wLXUxOS4yL3NyYy9tYXJzaGFsLmpzUEsBAh4DCgAAAAAAAAAAANdpkCmaCAAAmggAADEAAAAAAAAAAAAAAKSBnVsCAEBhZ29yaWMvaW50ZXJuYWwtdjAuNC4wLXUxOS4yL3NyYy9tZXRob2QtdG9vbHMuanNQSwECHgMKAAAAAAAAAAAAbwmyhhEgAAARIAAALgAAAAAAAAAAAAAApIGGZAIAQGFnb3JpYy9pbnRlcm5hbC12MC40LjAtdTE5LjIvc3JjL3Nlcy11dGlscy5qc1BLAQIeAwoAAAAAAAAAAAAfsG6DRCMAAEQjAAA3AAAAAAAAAAAAAACkgeOEAgBAYWdvcmljL2ludGVybmFsLXYwLjQuMC11MTkuMi9zcmMvc3RvcmFnZS10ZXN0LXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAOsYjgFQBgAAUAYAADIAAAAAAAAAAAAAAKSBfKgCAEBhZ29yaWMvaW50ZXJuYWwtdjAuNC4wLXUxOS4yL3NyYy90ZXN0aW5nLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAABhESA4sAwAALAMAAC4AAAAAAAAAAAAAAKSBHK8CAEBhZ29yaWMvaW50ZXJuYWwtdjAuNC4wLXUxOS4yL3NyYy90eXBlQ2hlY2suanNQSwECHgMKAAAAAAAAAAAAkPuG/0kEAABJBAAALwAAAAAAAAAAAAAApIGUsgIAQGFnb3JpYy9pbnRlcm5hbC12MC40LjAtdTE5LjIvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAABURLJnkBAAB5AQAAMAAAAAAAAAAAAAAApIEqtwIAQGFnb3JpYy9pbnRlcm5hbC12MC40LjAtdTE5LjIvc3JjL3R5cGVzLWluZGV4LmpzUEsBAh4DCgAAAAAAAAAAANN6q+VBBwAAQQcAADAAAAAAAAAAAAAAAKSB8bgCAEBhZ29yaWMvaW50ZXJuYWwtdjAuNC4wLXUxOS4yL3NyYy91cGdyYWRlLWFwaS5qc1BLAQIeAwoAAAAAAAAAAAASjuJfNggAADYIAAA5AAAAAAAAAAAAAACkgYDAAgBAYWdvcmljL25vdGlmaWVyLXYwLjcuMC11MTkuMi9zcmMvYXN5bmNJdGVyYWJsZUFkYXB0b3IuanNQSwECHgMKAAAAAAAAAAAAoAvLsgwIAAAMCAAAKgAAAAAAAAAAAAAApIENyQIAQGFnb3JpYy9ub3RpZmllci12MC43LjAtdTE5LjIvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAPOeblugEAAAoBAAAC0AAAAAAAAAAAAAAKSBYdECAEBhZ29yaWMvbm90aWZpZXItdjAuNy4wLXUxOS4yL3NyYy9ub3RpZmllci5qc1BLAQIeAwoAAAAAAAAAAAAm0n7cUSsAAFErAAAwAAAAAAAAAAAAAACkgUziAgBAYWdvcmljL25vdGlmaWVyLXYwLjcuMC11MTkuMi9zcmMvcHVibGlzaC1raXQuanNQSwECHgMKAAAAAAAAAAAAMa5OCkAIAABACAAANAAAAAAAAAAAAAAApIHrDQMAQGFnb3JpYy9ub3RpZmllci12MC43LjAtdTE5LjIvc3JjL3N0b3JlZC1ub3RpZmllci5qc1BLAQIeAwoAAAAAAAAAAAAqiD/cHBYAABwWAAAtAAAAAAAAAAAAAACkgX0WAwBAYWdvcmljL25vdGlmaWVyLXYwLjcuMC11MTkuMi9zcmMvc3RvcmVzdWIuanNQSwECHgMKAAAAAAAAAAAAqVd8cFASAABQEgAALgAAAAAAAAAAAAAApIHkLAMAQGFnb3JpYy9ub3RpZmllci12MC43LjAtdTE5LjIvc3JjL3N1YnNjcmliZS5qc1BLAQIeAwoAAAAAAAAAAACX4r/iAAgAAAAIAAAvAAAAAAAAAAAAAACkgYA/AwBAYWdvcmljL25vdGlmaWVyLXYwLjcuMC11MTkuMi9zcmMvc3Vic2NyaWJlci5qc1BLAQIeAwoAAAAAAAAAAAAu1+OLHAQAABwEAAAqAAAAAAAAAAAAAACkgc1HAwBAYWdvcmljL25vdGlmaWVyLXYwLjcuMC11MTkuMi9zcmMvdG9waWMuanNQSwECHgMKAAAAAAAAAAAABURLJnkBAAB5AQAAMAAAAAAAAAAAAAAApIExTAMAQGFnb3JpYy9ub3RpZmllci12MC43LjAtdTE5LjIvc3JjL3R5cGVzLWluZGV4LmpzUEsBAh4DCgAAAAAAAAAAANMsyICxBgAAsQYAADMAAAAAAAAAAAAAAKSB+E0DAEBhZ29yaWMvbm90aWZpZXItdjAuNy4wLXUxOS4yL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qc1BLAQIeAwoAAAAAAAAAAAACq/PJvB0AALwdAAA5AAAAAAAAAAAAAACkgfpUAwBAYWdvcmljL3NtYXJ0LXdhbGxldC12MC41LjQtdTE5LjIvc3JjL21hcnNoYWwtY29udGV4dHMuanNQSwECHgMKAAAAAAAAAAAAoar9L8MNAADDDQAAJwAAAAAAAAAAAAAApIENcwMAQGFnb3JpYy9zdG9yZS12MC45LjMtdTE5LjAvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAM7ll0hkBQAAZAUAADIAAAAAAAAAAAAAAKSBFYEDAEBhZ29yaWMvc3RvcmUtdjAuOS4zLXUxOS4wL3NyYy9sZWdhY3kvbGVnYWN5TWFwLmpzUEsBAh4DCgAAAAAAAAAAAG3xWSMmBQAAJgUAADYAAAAAAAAAAAAAAKSByYYDAEBhZ29yaWMvc3RvcmUtdjAuOS4zLXUxOS4wL3NyYy9sZWdhY3kvbGVnYWN5V2Vha01hcC5qc1BLAQIeAwoAAAAAAAAAAACFnm5myxAAAMsQAAA3AAAAAAAAAAAAAACkgUOMAwBAYWdvcmljL3N0b3JlLXYwLjkuMy11MTkuMC9zcmMvc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAEJMfR78CwAA/AsAADcAAAAAAAAAAAAAAKSBY50DAEBhZ29yaWMvc3RvcmUtdjAuOS4zLXUxOS4wL3NyYy9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanNQSwECHgMKAAAAAAAAAAAAxvwtZd8NAADfDQAAOwAAAAAAAAAAAAAApIG0qQMAQGFnb3JpYy9zdG9yZS12MC45LjMtdTE5LjAvc3JjL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanNQSwECHgMKAAAAAAAAAAAAhi++xKIKAACiCgAAOwAAAAAAAAAAAAAApIHstwMAQGFnb3JpYy9zdG9yZS12MC45LjMtdTE5LjAvc3JjL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanNQSwECHgMKAAAAAAAAAAAAxQKMM9oOAADaDgAANAAAAAAAAAAAAAAApIHnwgMAQGFnb3JpYy9zdG9yZS12MC45LjMtdTE5LjAvc3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qc1BLAQIeAwoAAAAAAAAAAAAFREsmeQEAAHkBAAAnAAAAAAAAAAAAAACkgRPSAwBAYWdvcmljL3N0b3JlLXYwLjkuMy11MTkuMC9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAbxuUjM8WAADPFgAALgAAAAAAAAAAAAAApIHR0wMAQGFnb3JpYy92YXQtZGF0YS12MC41LjMtdTE5LjIvc3JjL2V4by11dGlscy5qc1BLAQIeAwoAAAAAAAAAAADnKNSM1wgAANcIAAAqAAAAAAAAAAAAAACkgezqAwBAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMy11MTkuMi9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA3hlqA9sWAADbFgAANgAAAAAAAAAAAAAApIEL9AMAQGFnb3JpYy92YXQtZGF0YS12MC41LjMtdTE5LjIvc3JjL3ZhdC1kYXRhLWJpbmRpbmdzLmpzUEsBAh4DCgAAAAAAAAAAAHN4va5lEQAAZREAACUAAAAAAAAAAAAAAKSBOgsEAEBhZ29yaWMvdmF0cy12MC4xNi4wLXUxOS4yL3NyYy9jcmMuanNQSwECHgMKAAAAAAAAAAAAkgtbbmMhAABjIQAAKwAAAAAAAAAAAAAApIHiHAQAQGFnb3JpYy92YXRzLXYwLjE2LjAtdTE5LjIvc3JjL2xpYi1ib2FyZC5qc1BLAQIeAwoAAAAAAAAAAAAfT6jC5QsAAOULAAAzAAAAAAAAAAAAAACkgY4+BABAYWdvcmljL3dhbGxldC1iYWNrZW5kLXYwLjE1LjAtdTE5LjIvc3JjL2FjdGlvbnMuanNQSwECHgMKAAAAAAAAAAAAUwoWrtcCAADXAgAAOwAAAAAAAAAAAAAApIHESgQAQGFnb3JpYy93YWxsZXQtYmFja2VuZC12MC4xNS4wLXUxOS4yL3NyYy9iaWdpbnRTdHJpbmdpZnkuanNQSwECHgMKAAAAAAAAAAAAWRTr9okJAACJCQAANAAAAAAAAAAAAAAApIH0TQQAQGFnb3JpYy93YWxsZXQtYmFja2VuZC12MC4xNS4wLXUxOS4yL3NyYy9kYXRlLW5vdy5qc1BLAQIeAwoAAAAAAAAAAADAr+p1CRMAAAkTAABAAAAAAAAAAAAAAACkgc9XBABAYWdvcmljL3dhbGxldC1iYWNrZW5kLXYwLjE1LjAtdTE5LjIvc3JjL2ZpbmRPck1ha2VJbnZpdGF0aW9uLmpzUEsBAh4DCgAAAAAAAAAAAFRqpSl6AgAAegIAADoAAAAAAAAAAAAAAKSBNmsEAEBhZ29yaWMvd2FsbGV0LWJhY2tlbmQtdjAuMTUuMC11MTkuMi9zcmMvaW50ZXJuYWwtdHlwZXMuanNQSwECHgMKAAAAAAAAAAAA8ZgIBMsIAADLCAAANwAAAAAAAAAAAAAApIEIbgQAQGFnb3JpYy93YWxsZXQtYmFja2VuZC12MC4xNS4wLXUxOS4yL3NyYy9pc3N1ZXJUYWJsZS5qc1BLAQIeAwoAAAAAAAAAAACAbAFkNB4AADQeAAA5AAAAAAAAAAAAAACkgSh3BABAYWdvcmljL3dhbGxldC1iYWNrZW5kLXYwLjE1LjAtdTE5LjIvc3JjL2xpYi1kZWh5ZHJhdGUuanNQSwECHgMKAAAAAAAAAAAA7z/q6F6lAABepQAANgAAAAAAAAAAAAAApIGzlQQAQGFnb3JpYy93YWxsZXQtYmFja2VuZC12MC4xNS4wLXUxOS4yL3NyYy9saWItd2FsbGV0LmpzUEsBAh4DCgAAAAAAAAAAAL/k3V7oAgAA6AIAADIAAAAAAAAAAAAAAKSBZTsFAEBhZ29yaWMvd2FsbGV0LWJhY2tlbmQtdjAuMTUuMC11MTkuMi9zcmMvcHVic3ViLmpzUEsBAh4DCgAAAAAAAAAAAKXB49/ANQAAwDUAADIAAAAAAAAAAAAAAKSBnT4FAEBhZ29yaWMvd2FsbGV0LWJhY2tlbmQtdjAuMTUuMC11MTkuMi9zcmMvd2FsbGV0LmpzUEsBAh4DCgAAAAAAAAAAAHB5q0ZdGQAAXRkAADkAAAAAAAAAAAAAAKSBrXQFAEBhZ29yaWMvem9lLXYwLjI3LjAtdTE5LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9yZWNvcmRlci5qc1BLAQIeAwoAAAAAAAAAAAD94zlxtwEAALcBAAAkAAAAAAAAAAAAAACkgWGOBQBAYWdvcmljL3pvbmUtdjAuMy4wLXUxOS4yL2R1cmFibGUuanNQSwECHgMKAAAAAAAAAAAAvR5yejkRAAA5EQAAKAAAAAAAAAAAAAAApIFakAUAQGFnb3JpYy96b25lLXYwLjMuMC11MTkuMi9zcmMvZHVyYWJsZS5qc1BLAQIeAwoAAAAAAAAAAAAqMmM49gQAAPYEAAArAAAAAAAAAAAAAACkgdmhBQBAZW5kby9jb21tb24tdjEuMi45L2FwcGx5LWxhYmVsaW5nLWVycm9yLmpzUEsBAh4DCgAAAAAAAAAAAAl/oEyLBAAAiwQAACoAAAAAAAAAAAAAAKSBGKcFAEBlbmRvL2NvbW1vbi12MS4yLjkvZnJvbS11bmlxdWUtZW50cmllcy5qc1BLAQIeAwoAAAAAAAAAAAC9GBLtZgIAAGYCAAAkAAAAAAAAAAAAAACkgeurBQBAZW5kby9jb21tb24tdjEuMi45L2lkZW50LWNoZWNrZXIuanNQSwECHgMKAAAAAAAAAAAAJPZsEacCAACnAgAAJgAAAAAAAAAAAAAApIGTrgUAQGVuZG8vY29tbW9uLXYxLjIuOS9saXN0LWRpZmZlcmVuY2UuanNQSwECHgMKAAAAAAAAAAAAydMyyIwDAACMAwAAKgAAAAAAAAAAAAAApIF+sQUAQGVuZG8vY29tbW9uLXYxLjIuOS9tYWtlLWFycmF5LWl0ZXJhdG9yLmpzUEsBAh4DCgAAAAAAAAAAAC1yLZxoAgAAaAIAACQAAAAAAAAAAAAAAKSBUrUFAEBlbmRvL2NvbW1vbi12MS4yLjkvbWFrZS1pdGVyYXRvci5qc1BLAQIeAwoAAAAAAAAAAAAKz1OsMQMAADEDAAAhAAAAAAAAAAAAAACkgfy3BQBAZW5kby9jb21tb24tdjEuMi45L29iamVjdC1tYXAuanNQSwECHgMKAAAAAAAAAAAAhkrrnBAEAAAQBAAAJgAAAAAAAAAAAAAApIFsuwUAQGVuZG8vY29tbW9uLXYxLjIuOS9vYmplY3QtbWV0YS1tYXAuanNQSwECHgMKAAAAAAAAAAAAu7kYJRAEAAAQBAAAJAAAAAAAAAAAAAAApIHAvwUAQGVuZG8vY29tbW9uLXYxLjIuOS90aHJvdy1sYWJlbGVkLmpzUEsBAh4DCgAAAAAAAAAAAOnrrYHDAQAAwwEAACEAAAAAAAAAAAAAAKSBEsQFAEBlbmRvL2Vudi1vcHRpb25zLXYxLjEuOC9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAAVnGiQGw4AABsOAAArAAAAAAAAAAAAAACkgRTGBQBAZW5kby9lbnYtb3B0aW9ucy12MS4xLjgvc3JjL2Vudi1vcHRpb25zLmpzUEsBAh4DCgAAAAAAAAAAAFq1uoAOCAAADggAABwAAAAAAAAAAAAAAKSBeNQFAEBlbmRvL2Vycm9ycy12MS4yLjkvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAzBkdhEwRAABMEQAAIwAAAAAAAAAAAAAApIHA3AUAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjAvc3JjL0UuanNQSwECHgMKAAAAAAAAAAAABURLJnkBAAB5AQAAKQAAAAAAAAAAAAAApIFN7gUAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjAvc3JjL2V4cG9ydHMuanNQSwECHgMKAAAAAAAAAAAAttW7ttkMAADZDAAAJwAAAAAAAAAAAAAApIEN8AUAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjAvc3JjL2xvY2FsLmpzUEsBAh4DCgAAAAAAAAAAAGwMmM4YDQAAGA0AADUAAAAAAAAAAAAAAKSBK/0FAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4wL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzUEsBAh4DCgAAAAAAAAAAAL07vyViAwAAYgMAACkAAAAAAAAAAAAAAKSBlgoGAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4wL3NyYy9uby1zaGltLmpzUEsBAh4DCgAAAAAAAAAAAKSaUDKOCQAAjgkAAC0AAAAAAAAAAAAAAKSBPw4GAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4wL3NyYy90cmFjay10dXJucy5qc1BLAQIeAwoAAAAAAAAAAAB/ppUchQIAAIUCAAAjAAAAAAAAAAAAAACkgRgYBgBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMC91dGlscy5qc1BLAQIeAwoAAAAAAAAAAAAYuYS+gQIAAIECAAAZAAAAAAAAAAAAAACkgd4aBgBAZW5kby9leG8tdjEuNS44L2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAHZKF/AGFQAABhUAACIAAAAAAAAAAAAAAKSBlh0GAEBlbmRvL2V4by12MS41Ljgvc3JjL2V4by1tYWtlcnMuanNQSwECHgMKAAAAAAAAAAAAIwX9yBUwAAAVMAAAIQAAAAAAAAAAAAAApIHcMgYAQGVuZG8vZXhvLXYxLjUuOC9zcmMvZXhvLXRvb2xzLmpzUEsBAh4DCgAAAAAAAAAAANeWUP5lAgAAZQIAACUAAAAAAAAAAAAAAKSBMGMGAEBlbmRvL2V4by12MS41Ljgvc3JjL2dldC1pbnRlcmZhY2UuanNQSwECHgMKAAAAAAAAAAAABURLJnkBAAB5AQAAHQAAAAAAAAAAAAAApIHYZQYAQGVuZG8vZXhvLXYxLjUuOC9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAABURLJnkBAAB5AQAAIAAAAAAAAAAAAAAApIGMZwYAQGVuZG8vZmFyLXYxLjEuMTAvc3JjL2V4cG9ydHMuanNQSwECHgMKAAAAAAAAAAAAUnJCqbkCAAC5AgAAHgAAAAAAAAAAAAAApIFDaQYAQGVuZG8vZmFyLXYxLjEuMTAvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAFl/ZBajBwAAowcAAB0AAAAAAAAAAAAAAKSBOGwGAEBlbmRvL21hcnNoYWwtdjEuNi4zL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAKpdDamIQwAAiEMAACoAAAAAAAAAAAAAAKSBFnQGAEBlbmRvL21hcnNoYWwtdjEuNi4zL3NyYy9lbmNvZGVQYXNzYWJsZS5qc1BLAQIeAwoAAAAAAAAAAADZunwzgSIAAIEiAAArAAAAAAAAAAAAAACkgea3BgBAZW5kby9tYXJzaGFsLXYxLjYuMy9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzUEsBAh4DCgAAAAAAAAAAAPuJns1dIgAAXSIAAC0AAAAAAAAAAAAAAKSBsNoGAEBlbmRvL21hcnNoYWwtdjEuNi4zL3NyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qc1BLAQIeAwoAAAAAAAAAAAAyxQglPyMAAD8jAAAqAAAAAAAAAAAAAACkgVj9BgBAZW5kby9tYXJzaGFsLXYxLjYuMy9zcmMvbWFyc2hhbC1qdXN0aW4uanNQSwECHgMKAAAAAAAAAAAAE5ayZe0GAADtBgAALQAAAAAAAAAAAAAApIHfIAcAQGVuZG8vbWFyc2hhbC12MS42LjMvc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzUEsBAh4DCgAAAAAAAAAAAJWADcJZJwAAWScAACMAAAAAAAAAAAAAAKSBFygHAEBlbmRvL21hcnNoYWwtdjEuNi4zL3NyYy9tYXJzaGFsLmpzUEsBAh4DCgAAAAAAAAAAAMgPMMrLJwAAyycAACUAAAAAAAAAAAAAAKSBsU8HAEBlbmRvL21hcnNoYWwtdjEuNi4zL3NyYy9yYW5rT3JkZXIuanNQSwECHgMKAAAAAAAAAAAABURLJnkBAAB5AQAAIQAAAAAAAAAAAAAApIG/dwcAQGVuZG8vbWFyc2hhbC12MS42LjMvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAGVRlmKIBQAAiAUAAB4AAAAAAAAAAAAAAKSBd3kHAEBlbmRvL25hdC12NS4wLjE0L3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAABghYcIbgoAAG4KAAAgAAAAAAAAAAAAAACkgTt/BwBAZW5kby9wYXNzLXN0eWxlLXYxLjQuOC9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACaj+JhgwYAAIMGAAAoAAAAAAAAAAAAAACkgeeJBwBAZW5kby9wYXNzLXN0eWxlLXYxLjQuOC9zcmMvY29weUFycmF5LmpzUEsBAh4DCgAAAAAAAAAAALY7xrxYCAAAWAgAACkAAAAAAAAAAAAAAKSBsJAHAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC44L3NyYy9jb3B5UmVjb3JkLmpzUEsBAh4DCgAAAAAAAAAAAEeE+i+FCgAAhQoAAC4AAAAAAAAAAAAAAKSBT5kHAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC44L3NyYy9kZWVwbHlGdWxmaWxsZWQuanNQSwECHgMKAAAAAAAAAAAAvmDjY2MSAABjEgAAJAAAAAAAAAAAAAAApIEgpAcAQGVuZG8vcGFzcy1zdHlsZS12MS40Ljgvc3JjL2Vycm9yLmpzUEsBAh4DCgAAAAAAAAAAACbmmAG+BQAAvgUAACsAAAAAAAAAAAAAAKSBxbYHAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC44L3NyYy9pdGVyLWhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAACVTNYHARAABwEQAAJwAAAAAAAAAAAAAApIHMvAcAQGVuZG8vcGFzcy1zdHlsZS12MS40Ljgvc3JjL21ha2UtZmFyLmpzUEsBAh4DCgAAAAAAAAAAAEjNsTCvBAAArwQAACkAAAAAAAAAAAAAAKSBgc4HAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC44L3NyYy9tYWtlVGFnZ2VkLmpzUEsBAh4DCgAAAAAAAAAAAEemzupDFQAAQxUAADAAAAAAAAAAAAAAAKSBd9MHAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC44L3NyYy9wYXNzU3R5bGUtaGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAABDbdXJ3yQAAN8kAAAqAAAAAAAAAAAAAACkgQjpBwBAZW5kby9wYXNzLXN0eWxlLXYxLjQuOC9zcmMvcGFzc1N0eWxlT2YuanNQSwECHgMKAAAAAAAAAAAA9miLXtUXAADVFwAAKAAAAAAAAAAAAAAApIEvDggAQGVuZG8vcGFzcy1zdHlsZS12MS40Ljgvc3JjL3JlbW90YWJsZS5qc1BLAQIeAwoAAAAAAAAAAAAH8dZCtQwAALUMAAArAAAAAAAAAAAAAACkgUomCABAZW5kby9wYXNzLXN0eWxlLXYxLjQuOC9zcmMvc2FmZS1wcm9taXNlLmpzUEsBAh4DCgAAAAAAAAAAAC5p46jhBwAA4QcAACUAAAAAAAAAAAAAAKSBSDMIAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC44L3NyYy9zdHJpbmcuanNQSwECHgMKAAAAAAAAAAAABc9ZcisKAAArCgAAJQAAAAAAAAAAAAAApIFsOwgAQGVuZG8vcGFzcy1zdHlsZS12MS40Ljgvc3JjL3N5bWJvbC5qc1BLAQIeAwoAAAAAAAAAAADi+PtLQwcAAEMHAAAlAAAAAAAAAAAAAACkgdpFCABAZW5kby9wYXNzLXN0eWxlLXYxLjQuOC9zcmMvdGFnZ2VkLmpzUEsBAh4DCgAAAAAAAAAAAIpLxDYnCQAAJwkAACkAAAAAAAAAAAAAAKSBYE0IAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC44L3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAAAVESyZ5AQAAeQEAACQAAAAAAAAAAAAAAKSBzlYIAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNC44L3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAADwtTtG5g4AAOYOAAAeAAAAAAAAAAAAAACkgYlYCABAZW5kby9wYXR0ZXJucy12MS40LjgvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAzMb9PGgyAABoMgAAKgAAAAAAAAAAAAAApIGrZwgAQGVuZG8vcGF0dGVybnMtdjEuNC44L3NyYy9rZXlzL2NoZWNrS2V5LmpzUEsBAh4DCgAAAAAAAAAAAGS+QpNCFQAAQhUAAC0AAAAAAAAAAAAAAKSBW5oIAEBlbmRvL3BhdHRlcm5zLXYxLjQuOC9zcmMva2V5cy9jb21wYXJlS2V5cy5qc1BLAQIeAwoAAAAAAAAAAADAWLhF9g0AAPYNAAApAAAAAAAAAAAAAACkgeivCABAZW5kby9wYXR0ZXJucy12MS40Ljgvc3JjL2tleXMvY29weUJhZy5qc1BLAQIeAwoAAAAAAAAAAAB3nhOD/QsAAP0LAAApAAAAAAAAAAAAAACkgSW+CABAZW5kby9wYXR0ZXJucy12MS40Ljgvc3JjL2tleXMvY29weVNldC5qc1BLAQIeAwoAAAAAAAAAAACTaWSFDxMAAA8TAAA5AAAAAAAAAAAAAACkgWnKCABAZW5kby9wYXR0ZXJucy12MS40Ljgvc3JjL2tleXMva2V5Y29sbGVjdGlvbi1vcGVyYXRvcnMuanNQSwECHgMKAAAAAAAAAAAAlxh8MoEWAACBFgAANQAAAAAAAAAAAAAApIHP3QgAQGVuZG8vcGF0dGVybnMtdjEuNC44L3NyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanNQSwECHgMKAAAAAAAAAAAANiBppbocAAC6HAAANQAAAAAAAAAAAAAApIGj9AgAQGVuZG8vcGF0dGVybnMtdjEuNC44L3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanNQSwECHgMKAAAAAAAAAAAA5CBlLxwZAAAcGQAANgAAAAAAAAAAAAAApIGwEQkAQGVuZG8vcGF0dGVybnMtdjEuNC44L3NyYy9wYXR0ZXJucy9nZXRHdWFyZFBheWxvYWRzLmpzUEsBAh4DCgAAAAAAAAAAAKjet773rQAA960AADUAAAAAAAAAAAAAAKSBICsJAEBlbmRvL3BhdHRlcm5zLXYxLjQuOC9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzUEsBAh4DCgAAAAAAAAAAAAVESyZ5AQAAeQEAACIAAAAAAAAAAAAAAKSBatkJAEBlbmRvL3BhdHRlcm5zLXYxLjQuOC9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAI/L0fHEGAABxBgAAIQAAAAAAAAAAAAAApIEj2wkAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS45L2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAIY51F+EAgAAhAIAACoAAAAAAAAAAAAAAKSB0+EJAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuOS9zcmMvaXMtcHJvbWlzZS5qc1BLAQIeAwoAAAAAAAAAAAD4ynw6ywcAAMsHAAApAAAAAAAAAAAAAACkgZ/kCQBAZW5kby9wcm9taXNlLWtpdC12MS4xLjkvc3JjL21lbW8tcmFjZS5qc1BLAQIeAwoAAAAAAAAAAAA8FDfuqwUAAKsFAAA0AAAAAAAAAAAAAACkgbHsCQBAZW5kby9wcm9taXNlLWtpdC12MS4xLjkvc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzUEsBAh4DCgAAAAAAAAAAAAVESyZ5AQAAeQEAACUAAAAAAAAAAAAAAKSBrvIJAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuOS9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAAbfFr78RAAC/EQAAHAAAAAAAAAAAAAAApIFq9AkAQGVuZG8vc3RyZWFtLXYxLjIuOS9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAD0DM7f8gEAAPIBAAAcAAAAAAAAAAAAAACkgWMGCgBqZXNzaWUuanMtdjAuMy40L3NyYy9tYWluLmpzUEsBAh4DCgAAAAAAAAAAAFbHvW+iAQAAogEAAB8AAAAAAAAAAAAAAKSBjwgKAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcwL0UuanNQSwECHgMKAAAAAAAAAAAAfL3MT54CAACeAgAALAAAAAAAAAAAAAAApIFuCgoAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzAvYXN5bmMtZ2VuZXJhdGUuanNQSwECHgMKAAAAAAAAAAAAm0gutxUCAAAVAgAAIgAAAAAAAAAAAAAApIFWDQoAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzAvbWFpbi5qc1BLAQIeAwoAAAAAAAAAAADb5r8/+wcAAPsHAAAkAAAAAAAAAAAAAACkgasPCgBqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMC9tYWtlcnMuanNQSwECHgMKAAAAAAAAAAAAr9Pr6ngDAAB4AwAAKQAAAAAAAAAAAAAApIHoFwoAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzEvYXN5bmMtdG9vbHMuanNQSwECHgMKAAAAAAAAAAAABl+K/7cBAAC3AQAAIgAAAAAAAAAAAAAApIGnGwoAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzEvbWFpbi5qc1BLBQYAAAAAoQChAEI4AACeHQoAAAA=","endoZipBase64Sha512":"25d05c514393270c2a5692171f21190d20d51ad79d82e0b210ff8b119963e28ab13aad9809e4abce33c588133a4a409e5be481024d6259fc3488bf270e27fc9f"};
|
|
1
|
+
export default {"moduleFormat":"endoZipBase64","endoZipBase64":"UEsDBAoAAAAAAAAAAADs0VCaigEBAIoBAQAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgInRhZ3MiOiBbXSwKICAiZW50cnkiOiB7CiAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy93YWxsZXQtYmFja2VuZC12MC4xNS4wLXUyMS4wIiwKICAgICJtb2R1bGUiOiAiLi9zcmMvd2FsbGV0LmpzIgogIH0sCiAgImNvbXBhcnRtZW50cyI6IHsKICAgICJAYWdvcmljL2Jhc2Utem9uZS12MC4xLjEtdTIxLjAiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvYmFzZS16b25lIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvYmFzZS16b25lLXYwLjEuMS11MjEuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL2Jhc2Utem9uZS12MC4xLjEtdTIxLjAiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMy11MjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXhvIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V4by12MS41LjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjEuMS4xMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS41LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYxLjUuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9oZWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImhlYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzMmZjOTZhZTJmZTA4NjZlNjdkN2EyODZiNTIzNDMxOTU4ZWRkYTY2ZTYwMGIyYmM0YzQ1Y2ZjMWQyYzYyMWY2NDQwM2ZhMDJhYjU1YWY2NzcwODdmMjI2MGQyYjRlNmQ2NWQzNjZmOTg3OGFkZTU5NjdlOWUwOWE1ZjY2MjhkYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9leHBvcnRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9leHBvcnRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaGVhcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaGVhcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjUxZTAzZjZjNTIwZTdjODM3YmUxNjFmZjdkZTZlNjI5NjMyNjc1MGVlOGEzOTk0NDg1YTlmZTg3YTgzNTk3NGNiZTZiNTVlNTNmZmVhOWY5ZmI1MzczYTlhM2YyZjBjYTY5MzY4ZmIwMjFlODZlMDAwZGFlYWQ0ODM4YmUwNDAzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ1YmE3OTE1M2RiODgzZGVhMDgwOGE5MDYzNmQ3MTZkZjAzNGE3MDZiN2Y4NWRhZDM3NzczMjg1MDlhYzZmZGY5ZTk1NGFjZjk5OTk5MzA5NTc0ZjEzYzNmN2FjYzk2MTAzOWI5NDQ5YjgzNTg0M2RkOWQ5OTQ1NTNhZDc3MDIwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2lzLXBhc3NhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pcy1wYXNzYWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjYxZWFmNzEyOGNlNzFjOWQ1NWY5MDE0MGExMmQ2MjFjYTNlODVmYzU3NTFmY2UyNGJlZmJiNDI2OTMzNmEzZGMzYzI1ZTA4ZjBiYzU1OWMwYzMyODhmYTk4NjA4N2EzMjFjMGExODQyYWEwNWE3NzVkMjExMGY2ODQ0N2Q1N2FhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhODllMjM5NGY3ZGExZGI3NzRiYjdlZDAzMTg3NDA1ODM0ZDcxODA1NWMxMmRjYzVmYWUxNTEwNmQyMjY4NmI1NmMzNTg4MTk2OTczMDc4Mzc0OTMwOTE0ZDQ0ODQzYjE3OGU4MDBkZTQyOTRkOTQ0N2VjYWY5MjU0MWNkZmM4YyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlLW9uY2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ha2Utb25jZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjViZjg5ZTIzOGVjOTZmODVkNDUyOTc4ZmZmZjc0YjljNTliYWYxMTMwNjA2OWYyNjYxYzQzYTBjMmE1ZDE5NWQ2NzBkMWRmYzZiMDllZTZjNzU0OWNlOGExYzU5YjdmNGFiNzM2ZTNmYzMzMDNhOGQzZWU5NmZjMTQ5NmQ3M2MyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3dhdGNoLXByb21pc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3dhdGNoLXByb21pc2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5YzY1YmI1NWZlZDg0ZWU5ZDU2ODExMDdjZDYxNzBhZTJiN2JhMjViY2MxNWNhZjRjNWI5MDliMjFmYWZjNThkMjg4NGY2MWFlMjZkNTk3NjY2MDgwODlkZTc4MzUwZmM3ZTMzNGY1NjJhYjNjZDRmYTZhYTUyZWVkZGRkN2U0ZCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9jYWNoZS12MC4zLjMtdTIxLjAiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvY2FjaGUiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9jYWNoZS12MC4zLjMtdTIxLjAiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9jYWNoZS12MC4zLjMtdTIxLjAiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjQuMC11MjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjMtdTIxLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4zLXUyMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MS4xLjExIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYxLjYuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY2FjaGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NhY2hlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNmY1Y2FiMDI1NTBjODBkYWNlMzllMTQyYzc3ZDFkOWUxMWQzNDQxNzA1ZjFkN2RhZDNhYzJmMzVkNzEyNTQ4Y2ZjYmMxMGEzYmFlNDQwMWM2Y2M5YzE2NzljYzU5NWJjMmY1YzA5NWFmYTJmNzhhNWRkNWE2YzlmNWQ0N2Y0NGMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFpbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE3MjRkZjdkMWZmNjdjYzlmMTg5Y2YzMjA2NjEzYjRlNGQyZDZlOTA5OGE5NjE4Y2FkYTI5ZTRlNGI0OWU0ZjNiNjUxZmEzMzM4NjA4YmRmNTdmNGJiMzk5ZmQyZDRhZWFlOGJkOTY0MmJkZDRmYThhODcxODQ5ZGM3ODYwZmNmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0YXRlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdGF0ZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjA1ZmU5YmNmYWE2ZjgwN2I2Mjk1ODM2MWY0MDFhMzA2OTQ1YThkNTY2YzQ4ZGI2MmRlNjljMzg1YzQyZDhhMGQ5NGFmMzU4YjE2YzA5OTcyOGM2ZGE5MWM2ZDkzYTU0Nzg1YTNmOWIzNWFhMDdkMTQyYTkzYjc4ZGZjMjg4ZjA1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjI2YzkzMzM3YWI0MDY3YjczOTY3OWMxYzg4Njg1YmRlMDFjMWI2MTU1OGM2YmU2MDNmMzRjNDE4YzNmMDgxZTk5MGJlMzlmZDBiODgzNGRmNjhhZmM2MDhkMjYwZWQ5M2IxMjFhN2I2ZmZiNmYyNTc0M2YwOGRhMmM2NTE0NDc1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL2VydHAtdjAuMTYuMy11MjEuMCI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9lcnRwIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvZXJ0cC12MC4xNi4zLXUyMS4wIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvZXJ0cC12MC4xNi4zLXUyMS4wIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC43LjAtdTIxLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOS4zLXUyMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMy11MjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9uZS9kdXJhYmxlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9uZS12MC4zLjAtdTIxLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2R1cmFibGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuNi40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY1LjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYxLjUuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYW1vdW50TWF0aC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYW1vdW50TWF0aC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc4Njk3MzFlNjVjNzNmZjNkNzcwODU5N2M2OWVmYTBmMzgzOTNiZDk3YzVhYzYzMGRlN2E3NzExNDgzNGYzYmM5YWY1MmQzZTMzYzU0ZDJjNDdkZDRmODliNjg2Y2Y3MzUwMmE2MmViYjBkM2VlNjhiMTdhMjEzNzAxMTU3MTZlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Ftb3VudFN0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9hbW91bnRTdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjBlMGFhODA5MTJlNDVmNDk4ZWE3MzZjYTE0YmNlODg2MmIwZDRmYmUzMGI4NTNhZDRkOTczMmM2ZGI5ZDRmMjg5N2ZlNGZiNjY0MDVlMzk4MDcxOGU2ZjQ1YmFlOGMzNTgzMGJlNmE0ZjgwODZmOWZiYzE3NmRjNWUxZWI4ZmNjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Rpc3BsYXlJbmZvLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kaXNwbGF5SW5mby5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjVmYWY3YjkyMTI5NTVlMGNjZTVhOGY1MTVhNzVhNWJlYmQ2MWJmN2ZhODU1NDk1ZWEwNGJiMjI1NTAxODI2NTdjMDgyMGQwNzFkZTNlZDI4YTc2ZmRkMGY2OTQ5ZGExOWQ0MGY5MmRkZDg0ZjBkZWMyYmZhZDM1OTA0OGQ3NzBiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZhZTQ2MWUwNmFhNzk0MTBlYWE3MGUxNjVjMzU0MTY3ZWRhZTc1MzRiZTkyNzBhYzQ1NmZkNzkyNzBiZjdkOGNiMjA2MTQwMTJjNTI4MzM1MmM4MjQyZGExN2VjNWFhNzdmZTAyZWRkNzdmOWY5YjE1OTE5NTE5ZGFjZmQ0OWE4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2lzc3VlcktpdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaXNzdWVyS2l0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTU1ZTVhMWY5OWMyZDQ4ZmIyMzM3NzcwYzM4ODcwOTVmNjM3ZDlkYWM2OTkxYWQ0YWY3NTcwODE3YzY2MDQ3NTc5NDVjOGY4ODUyODdmZDVmZDM2MDQwNjBlZWU2MThiNjk3ZDEyMTI0NTdkYTcxZDMwOWU4YjJmZTM0OTllZjYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4YTA5OGM0YWUwYjhjNWExOTAzNDVkZTMwMDI1YWI3ZDdkNTBhNjk0ZjM1YjEwMWM4YmM4NmFlOTIxOTU3Yzc2ZDMyY2VlYTU2Mzk4OTZjZjI0OTllODlkMGRmMDY4ODI5OWFjMTA3NTI5ZTFmZGVhNTRlY2Q1OGEzYmYxYjg2OCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE5YzE0ZWNlMmY5OTYyNDk1Y2ZhNjgzZWU5ZWJmNDI4OGU4ZTAxNjJiMzViYmRiNmVjMzc5ODNmNWU5MWZhOGFiMGUyMjFkMjc1ZmM5MWViN2YxMjRjYzdkMDgzN2U3Y2M4MTNiODczZWMxZDFjMzBlNTZjOTdlMGZhZGYyNzYyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImYyM2M2M2QxMzc2MmYwNDk0YTBjODczMDFiYWM2ZTE0OGE2ZTc3NTZhM2EyMWNjMTFhN2VmOGE2YjhjOGMxYTJmYTA4MjhiMzNiMzcxZDNmNjBjMjkzYWQ3M2Q1NDZiOTljMGNhNTgxYzVhMmI1MzE0NDFjZmJkODZkMDNlM2YwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFjNTc0NjkxNmI0Y2RmZjE4MzhlODFjNDZiM2QxOTQzODk4YzliNmY4YzIzMGI2YWFkZDkyOWVlYzJlNjQ5NGQ1ZGJlNzM5OWUxZjVmNmQyMWVjZWEyMjZjNjgwMjg1ZDQyZDc5ZWYxMGI4ODE4NjFlYTRhOTZlYWEzNjNiOGNmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BheW1lbnQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BheW1lbnQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmOTc1YTQ3Yzk4ZGZkYjkyN2M4MDE4NmY4YTdjYjIyNmY2NDJkNjAzYjM0MDMxNmY5NGNhMmVkYzM1NmY5NGQ5YmJmZDY5Mzg3MWE4NTU5YzRhNmM5OGE2YjhiYjVjOGMzNTcyNWM5MGE1OGZlMzEzZTIyNTBlZjVjYmE2ODZmMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXltZW50TGVkZ2VyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXltZW50TGVkZ2VyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTZlMDI2OGFlNDlhNmI2ZDBhMjJhYWYxY2RhYjFhZjU0NjIxNTljZTk2ZTllM2NkYjI1ZTEzM2YyMzljNTdmOGNiNTQ4MjI0NTRiMmY0YjExYzExNDNiNTY3OWQ1MTgzN2VmNGIyMDRlYTEzOTNjYjg4MmRjZTY3NDA1MmM3NTEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHVyc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3B1cnNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjcwMzRmNzU4MDk3MDM5MjIxMDM4ZGY2OWZjNWY2OTAxMWE1MTJlODc4YmU3NjVmY2QzYmJiYzEzMzg1MWUwZjhjNDhmNDM1ZjA3ZWVhZjRkOWE2ODMzOWI1NThmYjlmM2RkYzI4MzYzMjQ3ZWMyNmEyMmFkMjI0YmExMjA1ZjgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHJhbnNpZW50Tm90aWZpZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RyYW5zaWVudE5vdGlmaWVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODE4ZTlhNDViOGY1ZDg2ZDM3OWRkMGYyOWEyYmRkYjE0NDdjZTMyODllNTFlYWE5NmZmNjU5ZWIxNDhjZTc5YzUyMTVjNjQ5ODMzYzE5ZGEyOTFlM2IyNzFhYTk4MGJhNjUwZjVlOTBlZWEzNmJjYmZiY2I2MzVlYTQ3ZWI1NGQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdlODBhN2FjMDE1ODQyMzc5YTQzMzE0NzQwN2Y3ZmM3ZGMzODk4NWQ4NmM2ZGE0OTVjMGYxODQ5MGUwYjc5MDYxYzk1ZGNiMTgxOWFjZGY0M2Q1OTRlYWNjMTZjYTgzZmExODJjYzA1YWQ0NzFmZTJhN2IzMzk3NDI4ZjVjZDc2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLWluZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy1pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL2ludGVybmFsLXYwLjQuMC11MjEuMCI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9pbnRlcm5hbCIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjQuMC11MjEuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL2ludGVybmFsLXYwLjQuMC11MjEuMCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Jhc2Utem9uZS9oZWFwLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYmFzZS16b25lLXYwLjEuMS11MjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaGVhcC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vZnJvbS11bmlxdWUtZW50cmllcy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZnJvbS11bmlxdWUtZW50cmllcy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vb2JqZWN0LW1hcC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vb2JqZWN0LW1ldGEtbWFwLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9vYmplY3QtbWV0YS1tYXAuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi91dGlscy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYxLjEuMTEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuNi40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY1LjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYxLjUuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vc3RyZWFtIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3N0cmVhbS12MS4yLjEwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJqZXNzaWUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiamVzc2llLmpzLXYwLjMuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL21haW4uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY2FsbGJhY2suanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NhbGxiYWNrLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDU2ZThiOTAwMDRiZTE2ODUxYzFlMDViMjU5ZDM0ZjJlMTk2MTlmMzI4YzdjNDhmYzY2ZGM0ZDcxZGI2N2JlZDI1NGU2MGUxM2I0YTc5YmVkODAyZjFiYTYyZjc3ZDM5YTRmNGZiNmUzY2RkYzQ5Y2NmMjEzM2FiMzUyZGRhOTAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29uZmlnLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb25maWcuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkNmU0OTE1ZjlhYzliNGUxZTEyMmM1OWIyNGZjYmNlOTljNGIxYjI0MzUxZTliMThkOTgwMWNmN2EwODBkYjY4NTIyM2RiM2JiODAzOTUyMDhiMmMwNTBiNjQ0YmMwMGZjZjRkOTgwNGFlZmY5N2I5NjU1YjZiYTFjMjY3MDkxYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9kZWJ1Zy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZGVidWcuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzY2VkM2ZlYTI0MzljMjEyMjE0YzJhZDJmNDM0ODBkZGQwZDVhMzQzOGJmMGJhZmRmMzI3NmYyMjg1MWY1YzExMGEwYzhlOTg1ODc5M2Q5OGZiN2UyNTZmMDA5ZmNlYjhjOGUwN2I3ZmRhMDNiMWE1MDI5YzlkYmM3MjFjMmEyOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lcnJvcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Vycm9ycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQyNThjNGQ3ZWJmZjMxMTgyZjg0MjVlMGVkNWU4OWEzYWZlNzQ1MDNhOWYzNjk1ODliMmEwNTYzYjdkZjc1MzNjYTg0MTg5OGE1Mjc2ODIyOWViMDU1MDdlMWYxOTU4NWU2MWZmNTk1YzVjMTAzMTIzNjU3MjEwZTU1ZWQ3ZjI0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhmNjlmMDFhYWFmNTMzNjdiOTA4ZmFmNzI3MzA0MTU3YjNiYWFkN2IyZDBmYmJkOTEzMmYxNjc1OWM5OWMxMTQxOTBmMjJlNzU2NDIzYTk5M2VkMmI3ZWEwMTFjNTgyNTIxYjBiZDk5MWEyNGQwMTYyYjg3NzY0N2M5ODg0MmY5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2pzLXV0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9qcy11dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNkOGY1OWRmM2YzYzZjZmUxMTJlNGU5ZGE0YjY3OTkyZTRiYTU4MTgwY2VjNzRkMTU2MmVhMzg3N2IwOTY3ZmYzNjA0NjQ0MWNkMzlkNjlmMzZmZTNhMWJhYTBjYTZhODU2OThhMzZmNmQ5ODk1ZWViODM3ZmM0OTBhNDk2ZGQzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2NjM4NzQxZTkwNDVlZWY5ZjZhYjA4N2MyNWJhNWJhMzU2NjM5ZTc5NzYxMzdlMzdkNTUwNWRkMzI0Y2MxZjM0OTU4YTYzNzZmOGM4MzFjNzg3Mzk0NzZiMjk4MzU4ZTZhMDM1ZWMwMTBjOGFhNDFhYWFlZGU0NzJmNmJhNWI3OCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXJzaGFsLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWE3ZGZjMWM4Y2NkNGUxMmViYTg5ZjYzMTNkNGY5OTAzMDNjNTllNTcwNDE0ZmQxNTM5NWZlZGRiZjBlYzVjZTlkYzFhOTAwMTg1OTVmMWYzMjc2MWRjMGJjYzA1Mjc0YWZmYzQ1ZTlhNjIyMjRiY2UyOWU0NTQyMDdjNmJjMjgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWV0aG9kLXRvb2xzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tZXRob2QtdG9vbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwNTVhNzlmZDI0NjYxNDVhZTY4ZWNiYzc3Njk0Mzc5ZDhjMDUyZjJjN2Y0NDJjYWNhOTA4NzQ5MjExZDk3ZTk1NjRhOGRkZWE2ZjQyZjgyNTNkMzI2MGRmYjc5NzA5ZWEyOTdiYzg3MTRhYTg2MmU2OWUxYTM4ZjI0Y2JkYjVjMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tZXRyaWNzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tZXRyaWNzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOWNkZDc2ZGYyMmY2N2VhY2I0Mzc2MzE5Nzg4YTI5N2IxZjEzNzQ2MGI0MDQ3NGI5NWU0MjcwOGJlMDJhMDc1Yjk0NmQwZDRlZjU4NTk4Y2Y0NDUxYWMwNjAyZGU3MjliMDJmY2QzNjk2NWRiMDM4M2M4MTAxNzIyZjdkZmIzYjIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbmF0dXJhbC1zb3J0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9uYXR1cmFsLXNvcnQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4YmM2ODA2Y2UxYTk2OGNmZTY5YzZhNDg1MjEzZGJiMzcxYWVjZDU4OGViM2QxOWI5NmQ4ZmIxNjI0NThkODIwYzE1NjA0YzcwMDNjN2RiNTFhZmFmNTQyODMwZGYxMDhiMzViZjVjY2IxMWY5MjlhYmVmNmZjNzdmZWVmYjdlZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zZXMtdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Nlcy11dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjUxOTk4YmNhNDlkMWIzMTA0ZTAzZTg3NDdiNzQzMjg4ZDc3YzVjZjM0NTUxNjlhMGNmZTJlZDU4OWRlYWFhNGM1YTc1ZmY4YzVmMTRkNDQ4MjQ3NzA1Mzc3MTIxNmU1NjkwMzVmYTcwZGY1MTg1OTIxOTk0NDA2MWE4YWEyYTRhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3JhZ2UtdGVzdC11dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmFnZS10ZXN0LXV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzg1OTFlNzkxOTZjNzFjZmZhNGIzNDVhYWFlNGUwYjU3OGRiOWJhOThmOGUzOTYyNDQzMjUwOTgzYjUyMTQyNTZjMDUyNGQwMzRhOTY3NzMwZjM3ZDdiMWMyMzlmMzIyNWEzNmZmNGEwMDk5ZTZhYWNkYzk1YmI1NzRmMmY1NWQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdGVzdGluZy11dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdGVzdGluZy11dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE4MzFhZjIyMmNiMDIzZDdkZGZjYjJkYmNlZWU4YjhmNDdmN2Y3OTg4YWUyMzUxYWZlYTU3Y2RlODIyNjVkYmViNTFiODNiZjNiNTM2NmZkYWM1NzhjYWJmNDhiNDdhOTZjYTdlOGVkNTZhMjM3YTUxNThhNzc5NmRmZTE5NDUyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RtcERpci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdG1wRGlyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDZhYWJhZjAwMDVkODdjMzQzNjM5YjFiZGNlOWY0NGI2MzkzNGNjNTFjOTBjNThiMWEwZDU3NzcyM2I2ZTJjYzFhZTZlMmNlZGViMTQyYzczZTFiNzcyNTFiNjc5NWNkMzYyZmU1NDcwNTI0NWVhNGZkYjYyZjk0OGM3Mzk3M2QiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUNoZWNrLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlQ2hlY2suanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3ZjA2YTMxY2ZkNWVkNWJmZTdhOGEwN2Y4MGZhYTFhYmM3ZWVlZjg2ZWZiNzlmOGI3Njk4M2E0NGM0ZGE3NWE5YjYzZGVjM2U3ZWVlM2QxY2QzZWI4NTI2ZDk0NzU4OGFjYTk5MTIyODU0ZDMzMDhiNDdkMzQ0NjIwODg0N2M5MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTdkNWM4MDJmNGJmNDg5NDc5NjI3NDk4MzlmYmM5OTZmMDlkMDQ5N2VlNTE1Njc3OGFkNWNlZTUzMTVmN2U4MDg1Yzg2MmVlMTZjZGZkNmVmNzBhMmNjZGNiYzhmOTRiYjJlNDg4NDYwMThkOTFmODhlMzI4NzM5MWJhYzM0ODciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMtaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLWluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdXBncmFkZS1hcGkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3VwZ3JhZGUtYXBpLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZGNiMDk4MTNiNWQxMzU0NGEyNDEyNTE2OWZhOThjMDM2YTUzZjAzYWMxMGY0YjAyM2VmMjQ5MzgyMzQ5ODE0MDFhOGMxMmFhMWE4MzZiNDBmY2M3YzlhYjhlMTEwYTYyMGU5YjFlZTlhNDA5MjFkN2U5NzQzOTg0NmE5NjA2YzciCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvbm90aWZpZXItdjAuNy4wLXUyMS4wIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL25vdGlmaWVyIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvbm90aWZpZXItdjAuNy4wLXUyMS4wIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvbm90aWZpZXItdjAuNy4wLXUyMS4wIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC40LjAtdTIxLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuNC4wLXUyMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsL3NyYy90ZXN0aW5nLXV0aWxzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuNC4wLXUyMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvdGVzdGluZy11dGlscy5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsL3NyYy91cGdyYWRlLWFwaS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjQuMC11MjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3VwZ3JhZGUtYXBpLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjMtdTIxLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjEuMS4xMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MS42LjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYxLjUuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTcyMGRmMzU1ZWVmNWZhYmUyZDEyYWVkMDg5YzEwNDU5MDE5MDBiZmFhM2EwNmMxMTFjYWM3ZThmMzEzM2IwZmIxMDUwNTJmZjNlZGU4NTE0NTNmNzEyMDJhNTljMWNiOTE0ZTFmMTI0ODZhZjZjOGE1YjVjMzg5OWQxMzJkNmUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODI3ZGVkYTQxZjRlZmZkNDFkMmM5Y2ViYjdlZjkxNDcxNmU4MDM5MjUwYTNmYzY0ZTMyYWZkYTY1ZmNkMmViMTUzYmMyZWY4NzQ2NWY4OTBkMzFhOWY5NDBjMGQ0MDA3ZGQ4ODU2ODZkNWZjMjViYzBjY2U3MWQxZTJmNzBlZDMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbm90aWZpZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL25vdGlmaWVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjNhZDhkODlmZTgyNmM0YzE3NDkzNzk4NDEzZjVlMWZmN2ExNTg0OGIzNmIxZDA1ZDE1Yzk0ZGU0MmVmZDkzOWIwZDQzMjgyNjU3ODkwNjNkZmY4OTUyZjg0ZTA0ZGZiMmIzOGFhMmRmNDJjNjNmMDc0ODY0OWIzYzJhZjg1M2EiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHVibGlzaC1raXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3B1Ymxpc2gta2l0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTViYWQ5YjM4Mzg0ZDBkZDdjOTJiZTg5ZjAyMjM2NDZkNmIzOWEyNDI2YTgzMzliZjhkYWM3ODRiZGFhZDYwYTc4NzJkMWQzMDcyYzE1NjQxNWRiMWE5ZDdmYjU0MDk4MWM1MmVkYmIwY2ExMjUwOTBkZDY1MzIwZmRlNjE3NDAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVkLW5vdGlmaWVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZWQtbm90aWZpZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyODk0ZGVlZjc4YzRjZGM4NzAwYjI4MTU4ZGI5OWNiMGViYWFiYTFhNGU2OGY5OGIxODg1MzBlMmUwNTE3MWI5Mjg0Y2ExNzYyMmU0YjUxZTkzM2I3NjNjZDc1YjA2N2RhNWIxNWYzN2M1OTAwYmZmYjc0ZTU3YTM0MzQxNDhjYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXN1Yi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzdWIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlOWRiODg5ZWY0YjNlZDVmMjQwN2Y0YzQzY2FmMWM2NzJiNGFiM2QxMzMwZmI1OWNlZDc5MWUwNjI0OTU5NjFkNmUzZTQ5MjgwNjI4YTMzMmE5MTEzN2ZlYmEzZmEwZDg3Y2ZlOWQwZmVmN2FjNjlmNDc3ZDYyOTUwYmVhY2RhNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdWJzY3JpYmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N1YnNjcmliZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZmM2IzMzg0MmFmMzBkNWU3MWRhZTE5ODM2ZGM2ZGQwMWM5MWY4OWNlNWY0MGY1ZDM4OWM1YTZmNGNjYTE2OWZkZTJlZGNjYmNmMGI3Y2UyODkwZDFkYWYwOTM4YjljNjQ0YjU2ZmM5OTU3NjI2Zjk2YjQ4MDEwYTVlMTA4YzUwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N1YnNjcmliZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N1YnNjcmliZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3YjEwNzgxZjU2ODU5OGMyMmY3OTNlYmU4YTM0MGMwY2NiODljNGVkYjI5Y2FiYzYzMzM1MzkyYWQ4M2ZmMWE2OGNhNzBhYmYxOThjOTE3NzQ0ZTc4NzhlYWZhYTlhOTJmODRmMmI4MTJlYTNmOThiODZiNjgzNmNhZWNlODkzOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90b3BpYy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdG9waWMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYjJiMzRlMDUzZjE4YzA5MzMyMWVjMzRiMWY3NGNiZjMzNzBlZjk0MTk5MDc4OTFjOGU4ZmFlZDJkNGVkYWI1MDMyZWUyOWRiM2VjMDM5NWFlY2Q3Y2MzNjNmYzcyZjNlNmM3OTM3MDY1MDdkMWNmM2QwNDkyZmFlNWMyOGVkZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMtaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9LAogICAgICAgICIuL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJ0b29scy90ZXN0U3VwcG9ydHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyMmRmNTMxNWFlOWMyZmVkNDJlN2UwOTYxN2Y4Zjk5NDk3ZjBkMTJiZDQ3YTBmNTIyMDI1YTBkYzcyMWNhYTc5YzZlODExMjU5MjlhNWJlYmFiOTUxZTdhZDAyMTQzZDgxMmM5YmRhNWVmYmE0ODQ0ZDQ3Y2EzYzgzM2U2MTM0ZCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9zbWFydC13YWxsZXQtdjAuNS40LXUyMS4wIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3NtYXJ0LXdhbGxldCIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3NtYXJ0LXdhbGxldC12MC41LjQtdTIxLjAiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9zbWFydC13YWxsZXQtdjAuNS40LXUyMS4wIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjMtdTIxLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdHMvc3JjL2xpYi1ib2FyZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdHMtdjAuMTYuMC11MjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2xpYi1ib2FyZC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MS42LjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwtY29udGV4dHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwtY29udGV4dHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2MGNhMWIyNGRmYzc3ZWJjNGM0ZTk4Yjk5NzBlMjA0YzE3ZDJmOTM5YjU5YjVmNDY3OWE2ZDFkMTljMmE2ZjMyYjI2MjVlOWJmMDQzOWQwODgwOGI0YTA2MDIyYTI5ZTViNGQxZTgyMWNiMTdiYTU2YWI1ZjI1NWM2NGNhYmE3NyIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9zdG9yZS12MC45LjMtdTIxLjAiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvc3RvcmUiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9zdG9yZS12MC45LjMtdTIxLjAiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9zdG9yZS12MC45LjMtdTIxLjAiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9leG8iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXhvLXYxLjUuOSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYxLjYuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjUuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjEuNS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiYjkyMzk2NDg3NWNkZTk3YzI2YmNkMTgzZTgwM2JlMDFlYWQ3Mjg2NWI1YjI1ODE3MDM3YmFmZWZkYmNhZGQ2ZjBlNjRhNjA1NDVkZWJhZTJjNTM4ZDBiZWRjN2NjYWVkNjlkZTNlYTIyNTkzNDM4ZjA1ZTZiYTgwNDk5NzNiZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9sZWdhY3kvbGVnYWN5TWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9sZWdhY3kvbGVnYWN5TWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDBhY2E2ZWVkYTJiNmQzN2FmMzQ4ODY3NTU3NWYxZjJmZDU2NDk4ZmZiMzVkYjlkY2RkODQ5YTdhNzMwNGE1YzE3ZmE2MTI4NzJkZDg2NzRmMmM5YWVjODRiZGFhYTRmODE5NjBjYWNlMDE5YWNmMjM0NjJhMTFlMWUxZjRlNTAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODQ5YjE2OGVmMDRmOGQ5YjgzNDJjMDMzYTdiNmU5ZDBkODUwNDU0YTgyYWVjNzE5YTU5NTRlYjgwN2Y2ZWYxYjgwMDQ0OWIwYmY3MzcxZjQ5Nzk5NGE5NzUzNTNlZTE4MzIwMGUxYjkyZTYxZTRkNDU0NmJmZjQzM2RjZTk4NmIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjMzk3NmM4NzQ2MzMwODA2M2JhNTk2NjAyMDgxNjZiYzM0YmM5YzZlNmNjYTQ4MmZlNDliYmJlZWVkODUwOGQyNGZiN2YxMzgzNGYyMWQ1MGExYTUwZDFhMGU3MjI5YjhiYjQ4MTBhZDJmMTZmZmQwNTc2MDE1ZWNmODVjZWM3OCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFmZDE3NmM3OGVkMGE5ZmNlMDY4ZWU5Yjc3NjNjYWM3NzIyYjFkN2JmN2U5ZmQwZWEyM2QyNWRhZDJmMzE0ZDJlNjYwOGViZGI2NTU5NjZlNzlkMmI2YzgzMTRhZTJiODA0NTY2ZmE2MGI3ZjAwMzM1OWI0NmZjZTUyNTUwZmY1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4M2FlZTE1M2NiZjFlNzY4NjhkNDM3Yjg4ZDVlNzBiNjhiM2I4ZTM4MDcxMTRjMDI1OTU4OWRhOTVmYTU0YjMyNzJlYjUxMmVhMjA2OWMwNTkyZTBhMjE1Y2Q4MjQ5M2ZjYmEyZDM5MmE5OTNjYTI5NjQxODkyM2Q3ZDlkYmYxOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDhkYzBhZDk4MzY5ODhiYTAyNGQ5YjI1MDlkMTgyODM4MWM0ZTllYzVmYzY2MDAzYWFmYjMxNjY4OTEzYmYzMjVmMjIyYmVjZTU3YjIzZDYzNzcwZGYyZDYwYzVmNmI1YTdlOWJkMWI0NTkwYzA4YmVhOGRiNTAyMjQ1MTFkZGQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3N0b3JlLXV0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlZWQyMmE0NjgwZWVhYzZkZjc0YTI2Yzg5ZWI5NWU5ZTVjMzI1NWFlYzRhMWE2ZTIzZmY3ZmEzYjY0MTA0OWFkMDRmMTMyZDRlZmJhNDRmOTU2YWU4MDc5M2ZlMzc4NDQwMWVmY2FkNTFmYzkzMjc1OTg2MjVkODUxN2RlOTE0NSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy92YXQtZGF0YS12MC41LjMtdTIxLjAiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvdmF0LWRhdGEiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjMtdTIxLjAiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjMtdTIxLjAiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMy11MjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXhvLXV0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9leG8tdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3ZWM5N2JkMjhmYmFlMTQ4NTc5OGVhZDJkODBkMWQyNzUwYjc4NDY2MmIzYTg3MjA5MGNmYzJiYTIxYzgxNjY1OWEwMjgyZGIzZGE4OTlhOTliZTExOTlkNjEwZTVmZDE1NTRhZWQ2NzIzMWNjMzkzMjdiOWU4ZjQzMmIxZjY4YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkNzJmZTNhNjgzODgzZTg1Y2M0ZGQzYjg2YThiNWZjMWYyYmExZjY3N2ViODAzMzE5OTBmZDU0NTA1NmY4ZjFhMzFiZDRlNjkzNThlYmExM2NlOTBkMWEyYzVjYzFjMzJmZjk1OTBkMjkwZjRjZDg3NDU5OGU4N2QwMjc5NzM5MiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy92YXQtZGF0YS1iaW5kaW5ncy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdmF0LWRhdGEtYmluZGluZ3MuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyOGZjNWU2YTdjNzUzOTRlMDE2NWIwZmYzMWQ1ZTUzNmM0MDUwMWMyMzZlNWRlMjM2MmVhZmIwMTQ2NjRiZDM0OGVmNTkwZWMyOGFjNDU0MzBjMTI4MjY1OTYxYjBmMGZmZDY1Mzk3YmEwMDlkMjA5NjI4NzIxYTYzMDhhYWZjNCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy92YXRzLXYwLjE2LjAtdTIxLjAiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvdmF0cyIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3ZhdHMtdjAuMTYuMC11MjEuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3ZhdHMtdjAuMTYuMC11MjEuMCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2ludGVybmFsL3NyYy9tYXJzaGFsLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuNC4wLXUyMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbWFyc2hhbC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNy4wLXUyMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMy11MjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvcmVjb3JkZXIuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjcuMC11MjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9yZWNvcmRlci5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjEuMS4xMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MS42LjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NyYy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY3JjLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDJlODI1NDIzMGZkNTFhY2NhM2E2ZWJjMzBkNjc0ODE4MDcyNzUyMzVmNmNlOTM5YTFlOGQzMjJjNzYwNWYyMzc3NmU2MmU4ZjQyYWJmOGYxODExYTg3ZDc0MDZlNTU2NGZkNjhhMTZmYzU0MzY1Y2JhMDlmNGZiODNiODNlYjciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGliLWJvYXJkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9saWItYm9hcmQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlZmIwNzkwYjc3OWRmNjM2OGI2YWU2ZGE1NDgwYTI1ZjMxMjUwMWFkODRhMmM4YjY3ZDAyNjE3ZWEyMjM3NjMxYWVmZWJmZGI4NzFhOTVhMmY1YzA5NTM5ZmU3MzNmOGNhMzZlMGE3MjhkNzIzODhlZDNlM2YwYTU2OGVjYTVkOCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy93YWxsZXQtYmFja2VuZC12MC4xNS4wLXUyMS4wIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3dhbGxldC1iYWNrZW5kIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvd2FsbGV0LWJhY2tlbmQtdjAuMTUuMC11MjEuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3dhbGxldC1iYWNrZW5kLXYwLjE1LjAtdTIxLjAiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9jYWNoZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2NhY2hlLXYwLjMuMy11MjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL21haW4uanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9lcnRwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvZXJ0cC12MC4xNi4zLXUyMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjQuMC11MjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2pzLXV0aWxzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuNC4wLXUyMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvanMtdXRpbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbC9zcmMvc3RvcmFnZS10ZXN0LXV0aWxzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuNC4wLXUyMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvc3RvcmFnZS10ZXN0LXV0aWxzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC43LjAtdTIxLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3NtYXJ0LXdhbGxldC9zcmMvbWFyc2hhbC1jb250ZXh0cy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3NtYXJ0LXdhbGxldC12MC41LjQtdTIxLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9tYXJzaGFsLWNvbnRleHRzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjMtdTIxLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4zLXUyMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuNi40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY1LjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2FjdGlvbnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2FjdGlvbnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxZmFjOWE5ZWNlZmNlZDhlYTI3ZDhkMjY2ZWQ0NzhhYjgyMjMyNzAxYmExYjNmM2ExMzcyMDhhNmRhMDZiZjM1OThjMmFiMDY4OTIyY2RjYjA3YTIwNTQ5YmMyNmEzMzAzNjExNDk4MTk1NTQxYjA4ZTMzYmJhYzY5YTc3MjFlNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9iaWdpbnRTdHJpbmdpZnkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2JpZ2ludFN0cmluZ2lmeS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjlhNzI4MDk4Yzc1N2Q5ZGNmMWI4YmU5MDM2NjliYWZlMzcyZWM5NjFlZmQxNDkzY2IzNjUzMWJmZmNlMTA3MGNkM2I4ZTM0MzhiMWY3ZTliNWZjN2E2NTIxYTBjYjliNDRlOWUxYTgyMWZiZjljYzE0NDliZjNjZGNkYzY4NTk5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2RhdGUtbm93LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kYXRlLW5vdy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhiN2NkOGQyMGRkYjQ2MmI3YzdiYjBlZmU1YjRiZDQ1ODRhYmNiNGJmYjU0NzVlZmI0Mjg4NmUwYjQwMTQ1ZTFhMzk0ZmU5M2JjOTE0NjllZmZhOTQ0NzE0NTlmNTQyZjJlNWM4ZjQ3NGFhMmQ0YzdjMWRkODg1MTIzMDA1ZWFlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2ZpbmRPck1ha2VJbnZpdGF0aW9uLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9maW5kT3JNYWtlSW52aXRhdGlvbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ5MGY1ZjlhZWU4ZGUxMTdmYzJhMzZjYzgzZWI4MjU4YjNhMGQwYjc4MGVmMjUwZWI5MWU1NThhZWYwNDczMzQzMmY1YTIwZTcwYmM2ZjQ2NGE5MzBhMGQxMTljYTJhZWE1NjRlMzc5YWVkZjI3YTJkNjdkZDljNDM1N2RjMTcwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2ludGVybmFsLXR5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbnRlcm5hbC10eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUyZjA0NTY5MGZlODhlODMzODgzNmM3MjBmYjIwOThjMjUzNGE4NGU5ODNmMjc5ZTg3OWY3YzM1YmJkYjc3OTFjNTc2NDZhYWJjNjRhZWQwM2EyNDBmYTJjMTQwZDMzNmE3Yjg4ZjU5OWEwMWVlYzk0OWNmNTI3MmFjMGYyMDQzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2lzc3VlclRhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pc3N1ZXJUYWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjczMmNiNTU1YzA5MjljODczNmQyOTM4ZmJkMDJjYTFlODZlNDgxYzY4ZWEwMmQzZmExNGYxMmFiMjI3YzUzMWRmZDg1Yzg1YzgzM2NiYTY2NTk2YzlmNzgxNGJlNDE3YjZhYzhmNDIwNTFhZTMyN2M2MjFjMGEyZDU2ZTE4OTg5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2xpYi1kZWh5ZHJhdGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2xpYi1kZWh5ZHJhdGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjZGFkYWE4OTkxYTUxYjgzYTU1ODdiNDk0ZmJmN2Y2NWI1Nzc1Y2Q5YmRiOGM5Mjc1NjhlODQ5MWIwYTgwODRlNDlmYjFiMWQxYmUyMWE4MjVkMTg2ZThlNjM2YTkyY2E5MzZjNTllOTMyNDQ4NmQ5YjgzYTAzZDhjMzIwZjgyMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9saWItd2FsbGV0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9saWItd2FsbGV0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTY0Mjk4NjYyMGE4YzU5MzQ3NjNkOGIxZjc0NTdlN2E2NjAxY2NhZDZjYmIzZjNkYTQ2OTJhOTRhODhhZDAyZjdhOWFiMWNlZjQwNzIzODFmMmM3YTU2M2U1Mjc2M2MyYzBhNTE5ZWUwZTQ3YzE3MzNiZWM0OGQxMjllMDcxYjkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHVic3ViLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wdWJzdWIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3OTFlYzcwNjgyZmI4ZGYwY2M0NzZlMjE1ZjNlYzM4ODcwNDUxMTNiMmUxMjcxMjkyZDA5Mjc0ZjExMzJmOTY1YmE5N2VlNGVkMmNmNDA2OGYyNGVlM2I2MGM2YWIxZGRhYmMzYWY0NDliMzRkZWEyN2YyZjE0MDAwYjA0NmU4MCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy93YWxsZXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3dhbGxldC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU0YjIyODYyMGNkNDhkOWRmODg2ZGY1NmZlM2I3ODQzN2JlYTFkZTM5ODA5MTgyMTcyNmRmYTdiOTQ3NzMwYTE3Mjg4MGJjMzhiMTg5NDIxOWIwYTI5N2RjZDE1ZmFmZmNkYzg4MTI0ODE3NTI4NjY4NzM0OGIwMzliMDhkYWU4IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3pvZS12MC4yNy4wLXUyMS4wIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3pvZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3pvZS12MC4yNy4wLXUyMS4wIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvem9lLXYwLjI3LjAtdTIxLjAiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjQuMC11MjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC43LjAtdTIxLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjcuMC11MjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMvdGVzdFN1cHBvcnRzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjMtdTIxLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4zLXUyMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvcmVjb3JkZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC9yZWNvcmRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImExNjZiZjJjYzFjNjA3MDMwNWFmYzZkNmYyYjQwYTdlZTVmZDhjMjJlODNmNTMzNGE4NDA3NjBjODFiNDMzNjg5M2Y3MTZlNGY1MGNhMTdhZmFhMDUwZDkyZGZmMGRiNzQwYjMwYTIwYWVjOThkNmQzMmFlNDI0ZmIxMzM0OGNjIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3pvbmUtdjAuMy4wLXUyMS4wIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3pvbmUiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy96b25lLXYwLjMuMC11MjEuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3pvbmUtdjAuMy4wLXUyMS4wIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYmFzZS16b25lIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYmFzZS16b25lLXYwLjEuMS11MjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjMtdTIxLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS41LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vZHVyYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJkdXJhYmxlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjIwOGRlZjhkZjFjYmUxNDE4NjY5ZGVkZjgwYmRmNTk1MzU4ZjUzNjZkMTE4OGFjMDRmZTRhMmNiOWM1M2NhODg0ZDg1MjE1YzkwZjFiODdmOTQ5YmIwNDhhNzk2ZWU1YjZmZGExM2Q1MWEyNTllMjU3NDQ2NDgxOWQ2MjJjZDMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZHVyYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZHVyYWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU3OWIxOTFhNzM4MDQ4ZDY2NGFkYzIyNTI2NmZiNTI1YjBhZDg4YzE1ZGNkYjQ4ZDVhYTBlYWY4ODA3NmY5ZDU4MjdlYmU4OWQ2NDc1MTQzZDYwMjkxYzNhZmQ0Y2NhNzZmNTY5MWY1NzFmZDEyMWQ2MjU3NGViYjIzOWFjNmExIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9jb21tb24tdjEuMi4xMCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vY29tbW9uIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2NvbW1vbi12MS4yLjEwIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2NvbW1vbi12MS4yLjEwIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9hcHBseS1sYWJlbGluZy1lcnJvci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJhcHBseS1sYWJlbGluZy1lcnJvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU1MzExZDQyMjc5YzM5MDNkNjI1ZjEzZWE2YjNmZTc5N2JiMWVhMDJiOTVlMDYzNzNhOTNlYzM4YzgzOTJhODZiZGE1MTJjODQxYjhiNGJlNDBlYWI1ZjUzYmE1NjZmMTgyMDM1ZTBlODFkMzYzZGI2NjRhYTA3ZWNjMmU2NTdjIgogICAgICAgIH0sCiAgICAgICAgIi4vZnJvbS11bmlxdWUtZW50cmllcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJmcm9tLXVuaXF1ZS1lbnRyaWVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDhmNDAyNjYxODhlZWI4YTRmZGFkMTA3YzA2MjQ1N2U4MTRhZGFkOWRjZjFhNmM3NzFmYzlkMzQ0M2U4ODNlNDMyODdlNDJkNGQ5MWZlYzFjNDQyN2MzYmU1ZGMzNTk2ZGEzMzBjMmMwMmU0NDRmY2ViODUyMzgzMGM4MzQwMGQiCiAgICAgICAgfSwKICAgICAgICAiLi9pZGVudC1jaGVja2VyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImlkZW50LWNoZWNrZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1OTdmMTg5MzA1ZmYwZTQ4NzZmZTVmNGE4ZGNmODRlMzgzNTZiOGEzOTVlOWVhY2Q3M2I4OTU3Y2IxOTEyMTQ1Yjg1Nzc4YWNiNzA1ZjEwMDBhMjgyOGNmYWI3NzA1Zjk1Y2Y0ZDE4ZDQ4YjYwZWU4NDExMTcwM2I2Y2EzN2E5YiIKICAgICAgICB9LAogICAgICAgICIuL2xpc3QtZGlmZmVyZW5jZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJsaXN0LWRpZmZlcmVuY2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyNjY2NmE0NjkzZjBjY2Q2MzZkYzM3ZTIyNWIyNDkyYmJjOTgwNDNkZTIwZjA1NzNjNGMyMDJlZmJjMzI5YjgyZDgxMzc2Y2M3MmRhNzg2NmRmMDliYTg5MzE5NTU2YWEwYWM5YWU0MTNkZWY2MDNhMTRjOTBkNDljODYxYjVjYiIKICAgICAgICB9LAogICAgICAgICIuL21ha2UtYXJyYXktaXRlcmF0b3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAibWFrZS1hcnJheS1pdGVyYXRvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdjNTM0OGFiZWQwMmM5ZDVkYzE5NDJjYWI4ODgzODkyNDAyNTdlNDFhZDcxYzg3ZjM5NDZiNTFjZDUyMTFjZjg5OTk0MzQxMmI2OTc0OTU3NGE0MWQ1YTU4YTAwN2FmMGE0NDdlMzUxNTM5OWRlY2FhNjMyNDE5OTY1NTIzNjkyIgogICAgICAgIH0sCiAgICAgICAgIi4vbWFrZS1pdGVyYXRvci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJtYWtlLWl0ZXJhdG9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZmIyYzQ4NjViYWY2MWRkYTg4NzNkZGRmMzE0NGNiNDU1M2YxYmY3ZTU3M2UzZGU4NjJiYWVlNGFhMDVkOWM4ODM2Mzk5NDYzZDE2NmJmN2NkOGNkODI0ZjZhZmM1YmJkOGFhZjhkMmFmNDhjNDAzY2FiZDkyY2ZiOWI4NGNhZmIiCiAgICAgICAgfSwKICAgICAgICAiLi9vYmplY3QtbWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogIm9iamVjdC1tYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYjNlZjFiMGI5NGI3MGQ1NTJhNDNiYmRhMWFjNDZmYmFhZDU2OGVlMDI0ODEzZThlNWQ4MjAyNWMxMTZkNGExNzkzMzcxM2NiMzQwMjc1ODU5ZmIzYmUzZjVhMzk3NGFlNjU2ZWYxYmViMDFhYTBlZmEwNWU4MGJlNWMwOGQwNiIKICAgICAgICB9LAogICAgICAgICIuL29iamVjdC1tZXRhLW1hcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJvYmplY3QtbWV0YS1tYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5OTgxYzhjNjMwNThjMjdjMGNhMTI3MDRiNGY1ZWRiYzM4NDk0YzU5NTc4ZmFkYmU3YjBmY2EzMGJmZDY5M2U5NDAwZThkMzdjODBiMWQxM2RjZjQxYmQ1M2YyMjQzZjRkM2RmZWFjNjZmNmM0ZGY4ZDZiYTAxZjU5OGU5Y2I5MiIKICAgICAgICB9LAogICAgICAgICIuL3Rocm93LWxhYmVsZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAidGhyb3ctbGFiZWxlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFlNmE4YWRkZWY1YjdiMzUxNmJhNTljMmViYzM4MGViMGMwZGZiNGQwNzQ1MzkzOWU1YTRlYzNjNzhjNWE4ZThlM2E2M2MyMjhhYzQ5ZDE0Y2I5OTU5NmExNGU1OGQxN2JmYmNiOWQyZmU2NjVjOGQyODk2NzRkNTg1NGVjOTU4IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjgiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2Vudi1vcHRpb25zIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2Vudi1vcHRpb25zLXYxLjEuOCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjgiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJiYWNhNzZlZDdjNmI2NTY3MWY3MGIyNjQ2ZjY4OTQzNTcyNGQ4Yjk5MzBhNWZmMjlkMWZiMzI3ZWQ5NmZkNDE0NDY5NTI1ODk2MmRhZmI5ODI4NjJhMmVmYzFiMDNkMGFkOTZiMzNjMmNhZTViZWJmYTM3MjY4ODZhMDZmNjY0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Vudi1vcHRpb25zLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbnYtb3B0aW9ucy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjk5YTMyM2NlYTE4ZjE5ZDcwZjI5ZDk0ZTY2N2QwYzI3NTZkNTY2YTFmODQ2OWI1ZjY3YzE4ZGJjODU3MzQ0OTE4NWY1YmY3OGZhYjA3ODY4M2IzNDkxZGFlY2Q2YjM4ZTAwOTI2YzUyYzdmNDUwYTE3MDI2ZWM5YTdjOWJiNjllIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9lcnJvcnMtdjEuMi4xMCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vZXJyb3JzIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2Vycm9ycy12MS4yLjEwIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2Vycm9ycy12MS4yLjEwIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiYmFjOTJiYzBiOTIwNzdmY2EwNTdkMDYyY2Q0ZjU5YmI4OWJlYjkzMGU4MzU5ODYzNDZiNjFiZTAxMDgyMjgwZTI4NGY1YjE0NTZiYTg4ZDA5NmYyODZiMTAxZGFkOGEyYmQzYjI4ZDcxOWQ3N2I5YjJmZDZjZmRmZTVmZDk2NSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZW52LW9wdGlvbnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9FLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9FLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDE1NWFhM2Q0MTdkMjg3Yzk5Yzk4MWQyMzdiMmRhYzQ3M2UxN2ZmZWJhZTJmM2RhYTMyOTkxYmQ2MTI3NWFmMGZhZmYwNzkwN2IzMDlkODNkNTBiNjM1MjNmZDkyNzA5YTdiZmU5MWU4ODliY2JjMjcxYWU1ZDhlMmNjYmUxZmYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXhwb3J0cy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXhwb3J0cy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2xvY2FsLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9sb2NhbC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU1MDc3OGYxYmVmZWMwMTAyZjBmYWNiODc1Nzc0NTlmODNhYmQ2NmM1ZDFmOTE2MDliYjlhMzFjMzkzNDg0YTZhNWNjM2E5NWUxNDJlNTYyNjQxYzZhY2NhMzEyMDc2NGJhM2NmYTY1M2IyNzk2Y2UzNGVkMTBmM2JlZDY0OWZkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiY2YyNWNmZWExYzQzN2IzM2ExMzQyNzMyY2M4NmMxOGYwMzYwYTlhZGY5NjliNWJjNGMxODJmYjdmMzk3NDlmOTk0YzU1MTM5ZTllNTY1NWJlYmE5N2I1NDJkYzM1MzM3NTFkYTA1ODY5ZTIxZWExZTFkMDdhODEwMDcxZWJhOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9uby1zaGltLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9uby1zaGltLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiY2MzYWQ3MDBkMDY1NGU2YTRmZjI3N2FlYzI2MTE1MWM5N2I5MzAwM2ZkNTAyM2M4YjNhMzZlNTFkOGI4YzU5ZWNlMmU5NWUyNDU0MGE0NDU5M2JiNjQ0ZjZiMTNmYWQwZmE2NGY0YjYyZDYwNmJjOTkwMjJkNGZjMTMyODliMjgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHJhY2stdHVybnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RyYWNrLXR1cm5zLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNGMwMDJmMTc1NzMyZDU1NGE0ZjA3NjRhMWQyNTI5OGNmYTA5MjNlNDExZDg5Mjg0Mjg5MGRmYzY0YjE4YTEzNTJlYTgyYjFkOGVlNzk2ZDljYzg4NTU0OWY0NDczODhjOWNjM2E0OWZjZTA1N2E2YjEwOTI3MzY1YzUwNGYxZTEiCiAgICAgICAgfSwKICAgICAgICAiLi91dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJ1dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ2MDcxMjM4YjI1ZDMwNzY2ZjQ0NzNiMzYwNzVkYjA1MDA0YTMwOTViN2JhNmFkZDA0NGQ5ODY2NWM3ZTBjM2MzMDlkMDRkNDM1OGFhZDhiMDVkZDhmY2YwMGY3ZGYyOTYxNTVjNWY4MjliMmY4YmYzOGRkYmVmYjEwZDU4MzQ5IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9leG8tdjEuNS45IjogewogICAgICAibmFtZSI6ICJAZW5kby9leG8iLAogICAgICAibGFiZWwiOiAiQGVuZG8vZXhvLXYxLjUuOSIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9leG8tdjEuNS45IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2NvbW1vbi9saXN0LWRpZmZlcmVuY2UuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2xpc3QtZGlmZmVyZW5jZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vb2JqZWN0LW1hcC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lbnYtb3B0aW9ucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdXRpbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MS4xLjExIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjUuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjEuNS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzk0MTQ3M2MzMDViZTU3ZTc3ODMxYjg0NmI1ZGQ3MmYwNWIwM2U5NzcwNjk4NDE3NGFjZDFmM2ExM2ZmOGNjYTQ2YzJkNTEwMGYzNWZjYTdkOGYwNzE0YTVkYmQ5M2RkMDliN2U2ZGI2ZGI0YzYwODkzOTljMjQ0ZWM0NmNjYjciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXhvLW1ha2Vycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXhvLW1ha2Vycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjEzZDA1NmViOTc1YmY1MDkzOGU3NTE1MmI2MmRiN2RmYmMyMjY1YzQ3YTI4YzcxNzJkYjY1YzA3OTFhNGFiMWIyMjdjZDNjMjI2MTA3YjI2ODYwNzM4NWJhNWJlOGFjOWY5MGY2MmRiNWQwZGFjMzkyZGJlNWRlNzIyNDQ4ZWY5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4by10b29scy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXhvLXRvb2xzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjdmOTczMTkzYzlhOTI3M2ViZmNiZmM3ZTUyNTRhM2Y3OGM3ZmYxYzkzYmI5NmU4MzdhNTJiM2YzOTQyZTc0NzI3NDdkNWVhNmMwMDcyMDdlZjEzMGI4MTUwYmYzOWQ0YWRmOGRlZDUxYzY1YTgwNjc0YmZlNjg2YjFmZTYxZGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZ2V0LWludGVyZmFjZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZ2V0LWludGVyZmFjZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFjYmZmNGZhNjY4Nzg5MzM0OGUxNjhjZGMwYWQ3MTExYTViM2MyZjg5ZWI2NzNhYjc4ZTQ2ZWE1NTBhYTFiZmYyYzgxNTRiMTc5MGJmMjMzMjU4NDNiMGZiZjA3MjdjMGJhYzkwOGU3MGZhZDdlYmFkMGJmY2YxYzJlZDNmZGY4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9mYXItdjEuMS4xMSI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vZmFyIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2Zhci12MS4xLjExIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2Zhci12MS4xLjExIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS41LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4cG9ydHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4cG9ydHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0YWJjZTViMDU4NDYwMWFiNTUwNjk5MDQyZDE2ZTY2ZDA3NGMyNTViMDQxOTM2ZDJiMDc4NzMyYTY0OTI3YzM1MTVhM2Q0Zjk1MGVlOTYwOTllYTA0ZWQxZGMxNmU0ZjRhODhhZWIwZDgxMWI0ZWViNGQ5N2E0OTJkZjUwNGQzYiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vbWFyc2hhbC12MS42LjQiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL21hcnNoYWwiLAogICAgICAibGFiZWwiOiAiQGVuZG8vbWFyc2hhbC12MS42LjQiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vbWFyc2hhbC12MS42LjQiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL29iamVjdC1tYXAuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY1LjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS41LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3NjM1MDMxMmYwZTJkYjZhNTAxMzdlNzJlOTY1ZGI4ZjZlMDI1YWMyYTNlOWMwOTEyYjJiMjcwN2MyZjUzYzAzZjlkN2JkNjM5NzgzMzY5M2QyZWU5MzMwYzUwNjI4ZWM4NDIxYzBjNzlkN2U2ODBjNGNmNWNmNjlhMDYyNDdjNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlUGFzc2FibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhN2M4OWU1ODQzZTEwMWVmOThkMDgxOWI1MWFlYzFjNDI0ZTFkMWViNGE0MjBlNDg0NDAyNjllMDc1OGVkMzlhOGM1NTdmNGZjOTM5NGI5MWY2MDU2MTNlNmE0NTk2YzU1MmMxODM4YmUxNGZkMzBiNWJkOGExNjk4ZTg1MTU1MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZVRvQ2FwRGF0YS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjI0ZmJmMWRlOWRiNDExMjRjZDE1NGUzNmY5MjgyNjllNWM2MTA1NjY1NzcyMjZmM2NjNDY2ODlmYTQ3ZGE5Y2I5ODU5MjM4NWZkMjg0YzcyNDZkZjY3OGI0ODFlZTA3OGYzOGEwNjE1MmJjMDQ1ZGNkZmJiMjI1MTJiZGU0MmFiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhiZDc0M2U2MzFmM2Y2ZDdkOGE4Zjc4NWE1MTZhNWMyZWJiZTcwZWJjNGY3OGNkYjJhYTcwOTNhNDYzYmM5N2M4NjZjNTc5NDg2ODE4ODZlMTllZTEwMGFmNjc2NjA1NjBhODE2MGZjMTBjMzJkNTcwNDVkYjQxNmNiMTBlMzZkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwtanVzdGluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLWp1c3Rpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE5YjIwZTUyMDU1ZmFjZDU3MTU2OTI4OThiODJiYTliZWVjOGU4ZjM3MzM1OTNkNWYxOTcxODlhOGNjYTEyY2M0OGE0ZDdkNGQ3ZTViZGY0NTNmNzM0NDRlNjI2ODRjZjVkMzlmMDVhNDBmMDQ2YjBmMzkwYWFiMTJlMjg0MzU5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjVkNGI1ZWNjYmI5YWZiYjZiYjJlNWZlNjEzMmM2OGQwMzQ0NGNiMDk0OTQ0ZGI3OTU3NTZlOGY0MjZmYjAyNDk1YWJhY2M5ZWYyMWQ2YTgxYTQ3NzAwZGNjZDAzNWI2MTQ0MTFmMDk1M2UzNmI1NzQ3NTkyYjUyNTUyZDIzNzhkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0YzQ3ODRhMzhhMzRkNTYxMzMxNmZjYzc2OGJkMzQzNTA5ZGIzODhhZWZhNTg0M2I2ZjA3MGQxMzhjNTI3OThjODBjMjYwZGZkN2E1NTZjOWVkNGNmZjNmNjgwNDUxOTNjM2RjMTM3YjM5YmRmNjYyZDFkMzQ0M2M0NWY1YzZjYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yYW5rT3JkZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JhbmtPcmRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU3MDUyOTJjZjcxZWE3ZjkxZTY1YzFlOTBjMDA3NDA4YmEwMThlODVlYTBlZjJlNzRlM2Y5OGMyOWJkYTRjNjA5NGI4ZTRlYjM4ODc1MjhjNmE2YzE5ZmZkYzFmNGI4OWZjZDQxMjNlNzMwMzAxYmRmNmE0YjY3OTU1MGNlYjQ3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9uYXQtdjUuMS4wIjogewogICAgICAibmFtZSI6ICJAZW5kby9uYXQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vbmF0LXY1LjEuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9uYXQtdjUuMS4wIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU3MzFjODI0YjFkOWI0MTc3ZmIzZmViNWExZWIwN2ExYzVkZjNjYTFlYTQ3NmExZTU1ODZlMTBjYjNmOTNjMTRkM2Q0MzZmOTE0ODk2MTkzMjkyMWVlZWYyM2ViZTMwZmI2YmIyMzMwNDRmYmVlYjc2YzZmOGUzMzU0YjllNmU1IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9wYXNzLXN0eWxlLXYxLjUuMCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcGFzcy1zdHlsZSIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjUuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjUuMCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9lbnYtb3B0aW9ucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdXRpbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU1ODQzMTYzYTc0YjkyZGUxMDZjMjI5ZTAxZTdkYWI3M2VlYzExMTdlMzgxNThkYTg1MzYyYWY5Y2ExMGZkOGVjNmZmODU3ZjlhMzliNGUyYTM3YmE2YTZiMGQ5MmY3NjM1MzA1MmE1MGFlZWQ5YzUwMDZiNDYyZTZkNjRiY2IwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvcHlBcnJheS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29weUFycmF5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDM2YzIzOGMzMGE5ZmY4NjYzZmQyNmI1NzhiYjkzZWMyMGRkNjVhYWE3ZWNkYTRjYzI4MzU2Nzk0OTE0NjQ1ODkxZGY4Zjc5ZTFiMjMyMjZhODQ5YTA3ZDRhOWY1ZGRlMzUzOTk1MzQyNmE5ZWE0MWY2MzhiZTY4ZjIxNDdkYTAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29weVJlY29yZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29weVJlY29yZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ1YmE5ZWVkMjFhYjYzZWEyZDA5ZmUyZTEyN2E0NjFjYzhhM2ViMTc4YmNmN2NmMTk1YTdmNGJhMjNhMDI1YzU4NjM3MjFjNjE5ZTQ0ZWY5NzU1MTgyM2ZhMzg4ZDI1ZjRjZDEwNTRjYjJhYzhhNjFhMGMxMWZjMzcyMWM2MGY2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZGVlcGx5RnVsZmlsbGVkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMGI2MTQwYjdjZTkwOTJmODZmNWYyMTE5ZDg3MTcxMjUyNGUyYTRlZGMzMjBlMDk3MjkyZmNiOGExYjViZjc5OWE3ZDJkZjAyOTA3Y2VkZGVhMmEyZmMzMmZjMDBiNGU5MjgzOWNjYmI2NThiNzVlNDQwMzI5MTA1ZjgxYWM5YWUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXJyb3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Vycm9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWJhZTJmMWY0MjYwMGJiOTcyOGVjMWQxZTdhY2U3ZTUzYTRmNjlkMzZkZTVhOGZjZmJjODUwZmM0ZmRhOGJlYjQ2MzdiYTYwYTVlYTBjNmNmYTBlZjVjYjlhMWQ4MjE2MWE3NzNkZDQ3ZTRkNGU3NjZjY2E2NTU4ODg4M2U5MjEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXRlci1oZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pdGVyLWhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiYWVmZDllMjM3MDlmZDFjZWM4ZDZkZDFlZDBhYzEyNTI1OWFlM2E4YmNhYTJiOTE4YmIzNzNhNjllN2VmNzlhMzljZDZkOWNmNjY3NDM2Njc2NzQ5NGUzOTM4MzMyZDI3MDM3MTA0MmY4MjMyNGM4MzQ2YmU1ODU3MThkN2JjZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlLWZhci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZS1mYXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiZTg3NTRjMjk4OTNiZGY4OGFlZDI5YzI2ZmFjMDczYjUwYTJmMDEyZWE5YzZjNDBhNTI0MTQwY2ZmY2VhZWE0YjllMmJlNGQ0NjRlMjczYmZhODRjY2QyN2RjMzQ5NzdkYzc2NzJhNDNlZmEzM2IyYTIyODg0NTFhMWEwMjE5NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlVGFnZ2VkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWtlVGFnZ2VkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWQ1ZjJjOWQ4YzQxZjFiOGJhOTg3ZWI4NzRjMjYzNTA5YjIyZDkwYWZhM2EzZjNiYjg4MWRiOWYwZTgwYmE2YTNiMzkzYTkzMGViYjI5MWU2ZjQ3M2VlNTYwNTMwZmNjZWVmM2YzMWZkMzYwZmUzMTI1OTEyNWFlZmE0ODc4ZjgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWJmNGFmOGY2OWNmMWQ0OWY3YmFmOWNhNDQyNzM0Y2M3OWI5NzJiOTk3YmRlMWIwZjhjODcwNDlhOWViZDRiZGY0ZjE2MWJmNzRkN2Q3ZGFkMTg4MTBiOWVhZGQxODIwNjhmNjIwMmQzNDZhMGJlNTBmNWM2NDI3YzA5NzA3NDYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFzc1N0eWxlT2YuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bhc3NTdHlsZU9mLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNGZjN2FmMmY2YTgxYWNlYWJmNTk5YjAxYjdiZjU2YWE2NzQ2NzQ5NGU4NTEyNTAxOWU1YjhiNTFkZmMwMWVmMGQ2NTk3OWY5MmY1ZTZiY2MzMGM1YTEyN2ExZWYxNjliOWNhOWU0ODcxODM3YmUxYjQ3MGIyODg2ZjdkYmU1Y2MiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmVtb3RhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yZW1vdGFibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiNGZjY2YwNjY3NmEwZjU1NjdkNzE3MzViZGJiZjE5OTk0NjQ4NjRhNGYyNGFhZjVjZTY1ZjE3OWZiOWM3YzcxNjMxNDVlMjE1OTE3ZWIzYjMwMWE2Zjg0YWNjY2UwZDFkMTg2YzlmNjRjOThiNmIzZTdmY2E5ZDY1M2FjOWI4OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zYWZlLXByb21pc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3NhZmUtcHJvbWlzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc2MDk3MWVkZGVjOWU5MzZiMjEyNzQ5MmZiYzZhMmQ1MDAwZTRmNGE1OTAzZTNmMTI4NmFmZjM4ODIzYmU2NTcyNWRiMjJiMDE0OGMzYzM2MjhkZGJhZWI2MzdmM2U0NDk2OWY0M2FjYTM3YjAyZjJkZDVjOGQyM2I4Zjc0YTY4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0cmluZy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RyaW5nLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmU1MzE1YTY0YmZkMzE4YWY5YjM1MGU0M2FhZGRlZjYxOGI5ZTA1MjMyMjdkZGI0MWRmM2IzNmJhNzA4NzYwMDQ1YjRjNGUxMmY4YmIwYzdlNTRhYzI0YmFkZDIxM2UwY2Y5ZDVjMDQzNmZkZDM4ZGJhNzBiNDg3MTYyYTI5MjUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3ltYm9sLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zeW1ib2wuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4OTAwMTQyODc0MTBiNzJjZjcwODhkMjY1ODQ2NjAxNzExNjcxM2Y0ZDE0MDdkY2E5NzE5ODkyNjk2NTY1ZDBhYmIxMmFmMTY0NTZlMjRkYTkxYzhhMjYyMGUwNThkMDZiOTBmOGI1MTA1ZTM1YzY5NzZiMDcwNDVmN2U1YzMxOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90YWdnZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RhZ2dlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE5MjdmMTFlYWVhNjE0YzE5MWY5OGM4ZDU3ZmM3MTQ5ZWY4ODM4MDMzN2JmZjQ5Y2FkOTM0YzdiM2ZmMWZhYjNhMDhiZTc0ZjY2ZmZlYTk1YWFhMmI5YzQ0M2IzZmUwNWNkN2Y5MDE3NWY4MzY3ZmViODc0NWJiYzI0MTg3MjczIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkYTZkY2EwM2E2OTRhYjdkYTg5OWNjY2FiMzhkNDdjMDYxODYwYjI2ZjFkNzI5MjlmMzBhZDY4NDE5MWY4MDc0M2Y4NTc3OGY0YWIwYTZjYjQ1ZDA5YzBlZWIzMGM0OThhYWIzOGE0OWM2NGU5NmFiYTRhNTQxODZkZDgyYzA4MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vcGF0dGVybnMtdjEuNS4wIjogewogICAgICAibmFtZSI6ICJAZW5kby9wYXR0ZXJucyIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9wYXR0ZXJucy12MS41LjAiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vcGF0dGVybnMtdjEuNS4wIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2NvbW1vbi9hcHBseS1sYWJlbGluZy1lcnJvci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYXBwbHktbGFiZWxpbmctZXJyb3IuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL2lkZW50LWNoZWNrZXIuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2lkZW50LWNoZWNrZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbGlzdC1kaWZmZXJlbmNlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9tYWtlLWFycmF5LWl0ZXJhdG9yLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9tYWtlLWFycmF5LWl0ZXJhdG9yLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9tYWtlLWl0ZXJhdG9yLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9tYWtlLWl0ZXJhdG9yLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9vYmplY3QtbWFwLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYxLjYuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjUuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRjOWI3YWJhMzI1YjNhOTQwOGJiOTc3M2QyYjgyMzQ4ZTBlYzVjOGE4ZWZkZDQ3ZmNjY2U1MWQ0YzUyYWJmMmZkNTAyMGZkYWI5ZWFmMGQwZDA1MjhiNzkxNzBiZjAzZmMyOTA2YzMyNjJjY2QwMmIxMWVmYTMyZWUyMjM3YzczIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvY2hlY2tLZXkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY2hlY2tLZXkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkM2YxNjQ0NWNmYmNjM2JhZTExOGI4ZWM2NGRmODdmYmYwYTE0ZGFlZTc5Y2U2OTRiNTk5YTQ0ODM0YmRkMjIxZTVlOWM1YmViMzQwNzU3M2YxOWExOTc1NTk4OWRmZDFjOTczNzNiZDNmMWYzMjEwZWFiZDMwYzU5Zjk3ZjQ1ZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODYyODMyNmZiMWVmOWE0NDNkMjE5MDllYWI4ZmZiMTdlNzViMGY5OGZjNTBmMTQ1MjQ0MDUwMTkxN2NjYzhhZTExMjg5NzQ4NzFlYmY0NmIzNzJlM2ZlYTRlZWE2ZjZkMzMzYTYyMmM4YWViNmVjYzUzOWUwZWJhYjBlYzBjZTMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9jb3B5QmFnLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2NvcHlCYWcuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiNGFkMjBiNzRiZDM2YTQ3NDIyOTlkODMyOGE0YTY3M2IwMDc0NTk4ZTcyMGFhMDczYmVmZjc4NjdkN2VhZjM5YjBhMTkzMGI4OWNmMzhiZDA4N2M3NTI3YjRlYzA3NjhjZmNmYjI5YjkzZjNkOTNkMzVlMWU2YjQ2MjdlOWY0MCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NvcHlTZXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY29weVNldC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ0YzhiNzcyZGRlNmI0OTc0MzNmMDM5ZTZiMTBkMjExOWUwMmVmZGMwYTNhYmY1NmEwYjBjMDZlMzVkYjA0NjJjMTUxNzAxMWYzZThjODNhYmUzYWMxNmFkNTVkZWU4NDM4NGFjZGViYzdmY2FiYzJiOWJlMjlmMGMzOTZhMWUxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMva2V5Y29sbGVjdGlvbi1vcGVyYXRvcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMva2V5Y29sbGVjdGlvbi1vcGVyYXRvcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlMTQyYWFmYWQ5NGM3ZjhkMjNkODczYjYwZmIwYjI3ZDAyMzE4OTk1MWE5ZWM1MTM4ZDVlNjkxZDE2MDgyNTg5NzFiOGExNTZlZDVmMWZmNTljYmFlODFkMjliNDY5OTc5MjEwMGZmMDNmNDczZjdhODkzZjBhNWU3YzU4YzNmYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY1NTU4N2JjYTI0NWQ0M2FkMzQ3YmExYjA5NmNmNmYzY2IwZWYwODUzNWUwODM3MzUyODVlNjY1OWMxNzVmNjU3YmRjZWZlMGZlNzVkY2MxMTY2ZjJhOWYwNGY1ODljN2EwZWQ3OGE5MDE2YWYwOGMxZmQzYmVlMmJkNjIxZTA1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2E4OTBmODNiNDcxNTFhZDc4YzhhZDVjNDQzMTQyY2YzOTllMDVhMjExYjEyN2U1MTU5NjYzZjA3NjY3N2YxMTBhOGExYWMyNWVmOGI4MjhjYjJiNDlmM2Y0NjY5ODU5NTRiOWNjYmMzNzczYTIwNTFiZmQ0ZDQ4Nzg3ZDE0M2EiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF0dGVybnMvZ2V0R3VhcmRQYXlsb2Fkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF0dGVybnMvZ2V0R3VhcmRQYXlsb2Fkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjAwZTQ1ODE1N2ZkZThlYjRiNzllZTY3NzdhN2NjMThiZDBhZTYzOWNmNzIxZmYxM2FiYjU3Yzg3NGMwYjEyY2UyZTYzMmIzNTc4ZmQwZGQwYjA2YjBiYzU2NmFiNzQ0Nzc5NWIyNThkYTI2N2M4ODEzMGQ5ZWZmMWQwYTMxNzRmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDg4MGRhOTcyNTc2OTcxMmM3YWM0OTk2ZTdlNWVjZDAzNjc4NTM3NmQ0MzZiMDM2Yjc2ZWFiMjVhYWZjOGJiNWU1YzU1MTlmNDhkYThkNjk3Y2JiMTBmZDFiODNjNmIyNDA4MDc3NDdhM2Y4NWJjOTRhODk4ZTAyNmE0ZjM1ZDAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTAiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3Byb21pc2Uta2l0IiwKICAgICAgImxhYmVsIjogIkBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTAiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmY0NjUzMzA3ZjgwNmYxM2IyYWRiNTk2YmI2ZTI0Y2FmZThmMDgzNDQyZjhiNTBiMzJhMGVjYWIxYWY4ZGVlNTJiNmE5YjgzZTY0YmMyZDY2YmQ1ZGQ0MjNkZGYwNmExMjE0MWY5YWI4ZTY0Y2IyNjE0MDY0ZWU2NTJkMDQwMDQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXMtcHJvbWlzZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaXMtcHJvbWlzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNkM2EyNTYzNmU1NDI3OGIzM2Y2YzM2MjE0Nzg4OWU2ZmYxMGJlZGE4MGMwN2U2YTE2ZDE5MDQ3YjdiM2M2YTM0ZDczMGU5YjNjZmM5Zjg1MTFiNmUyN2I2YTY5Nzc2NGY5NjgzZDcwZGY3MDg2ZTA4NWY5M2Q3Zjk1ZmM0ZmZhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21lbW8tcmFjZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWVtby1yYWNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDJlYjBjMWEyNDk2NmQ0YWJmZmEyYzE4YzJmYjI4ZGQ1MDRkY2IzYjcyM2Q4MzAwYzEwZTk0Mzk0NDkzYzU0ZTE4MDI0NTI3ZmRlNzAxZDdlZDU5M2IyNjVlNDU2ZDJkNDhjMTVlMGQ1MDEwMTA4ZWZkMTg3MmI3NGEyNTE0Y2UiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNGM4NGQwNzZlMGE0MTlmYzg2MzdhYjM4ZjI0NDMzOGM0NzZjNTAxMzJjZmUwOTAwMmRkZGNiYmZjZDM2NWJmNmNmM2QzMmIwOWRhMzI1MjVmNzViNjBmNWZjNjYwZGRjMGUwOGYzNmE2MDdiYTA3N2Y1OTliYzU1ZjI5ZWNiMzYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL3N0cmVhbS12MS4yLjEwIjogewogICAgICAibmFtZSI6ICJAZW5kby9zdHJlYW0iLAogICAgICAibGFiZWwiOiAiQGVuZG8vc3RyZWFtLXYxLjIuMTAiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vc3RyZWFtLXYxLjIuMTAiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImIwMDUyYzZlNmZhMjViMWQyODJiMDIwNjE5NGE5NTk5YzY3ZDMyYjVhMGNlOWU3ZTk5NTc3NGNmZDlmZjdhMGI5MmQ3NTAwOWEzMDkzMGFhNmNjMTM0ODEzYmIyN2RjNjJhOGVhZTkwNjQ2YjE5OGE2N2QwZGYzYWViMTg4YWMwIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJqZXNzaWUuanMtdjAuMy40IjogewogICAgICAibmFtZSI6ICJqZXNzaWUuanMiLAogICAgICAibGFiZWwiOiAiamVzc2llLmpzLXYwLjMuNCIsCiAgICAgICJsb2NhdGlvbiI6ICJqZXNzaWUuanMtdjAuMy40IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjEuMS4xMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21haW4uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21haW4uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwYWYxMDk5NzI5MDFlZWMzZTdkOWMwMWRhZTI2YWVkNjc5ZmYxMGM2YjhjMmVhYjlmN2I4NTAyYTI3ZDkxNWY0ZmMwZDg4Y2ZmMjVmMTViNjk4NWY0ZTFjZTJiZDQ1M2I3ODMxMGJmNmMzYzZhMjU4MzNjNTFiMDcwNjViMDMyOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMC9FLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMC9FLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDdkZTZjYmI1MWUxNmEyZGQ1MjBmN2U1NjYwYWRmYTNkMzZiOWQyMGVlYmE3Y2QzZDAzNmEwZDViZmQ2ZDE0YWQ4NWY1NjM5MDBmMTZjNmEwN2JjNTcyZmY4NDM2YzNmZDFhZmRjNzU2NzcyMzcwOTgzNzQzZTZkMjRkNzQ3YzEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmluZzAvYXN5bmMtZ2VuZXJhdGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JpbmcwL2FzeW5jLWdlbmVyYXRlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOGFmZjdmN2QwYzRjOTdjYjU1ZWU0OGIzZTM0MjliN2FjODZlODJjMzk1ODI3ZGZjM2JmYTg4ZTNjYzYxYmI2OTRhODVlZjU4MDkzNGFhNmYyYTQxNGE1NTlhM2Y0ZmIxYjQ2ZWI3NzlkMDBiYjFlMGEzZGY1OTYwZDU3Y2Q2YzIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmluZzAvbWFpbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzAvbWFpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhmZDUyZWYzMDJjMWYxNGM2MjBmZGRkNDM3MjdkODIzMjQwM2I5YmQzNTYxZTFmMTIzZGNlOWQ0ZTlhMTNiNTVhMmQxZWU0YWQ4MDcwMmYyNTExMTllOWQ0OTJhOGM3YTM0NWZlNTcxYTQ3OWQzOTFlMmI3ODFmZmIxMzhjMDA2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JpbmcwL21ha2Vycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzAvbWFrZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmU4ZjgwZjMzYWQ3NWQ3ZTAyMTJjOWVhZDdmOThmODI5YjdiZjJlNmQxOTJhYzcwOGVkZDc3M2M1Mjg0N2RiZGYzODMwNDc5ODgzYmM2YzQ0MDY1ZTA1NTQ3MGNkOTM4ZDA4NTEwNmZhMTJjN2RmY2VlMzk2OTM1YTRjZTE1NmEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmluZzEvYXN5bmMtdG9vbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JpbmcxL2FzeW5jLXRvb2xzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjcwZGM1ZWI0MTQ3N2U0ZGRlZmQwZTA4NjhiZjAzYTg3MWFkNTk5NmYyN2Y3MWM3MDBjNTk3ZjFjOTEzMTY4NmVjOWZiZDNhY2E3ZGQ3YzViNjQ1Yzg3NTFmZWYwMWY1ZjkxMWQyNTFmNTllZDkyOGE5MmJhNjhkOTkwMjJlNzEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmluZzEvbWFpbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzEvbWFpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc0NmI2YWJiY2VhNzBiNTEyMGEwNTQyNjM5YTk4NWQ4OThhMjVmMjVhMjM5NDBlY2MwZmEyNmU2ZWZjOGQ2NTJhNWRiOWFlNWE3NWVjMjc4Zjc5YzQ0ZDg4MDBkOTdhN2JkZWViZmU2NTczM2IzYWI2NjRiYjIzNTNjNDY1NWVlIgogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfVBLAwQKAAAAAAAAAAAAMYBI+I0BAACNAQAAJgAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMS11MjEuMC9oZWFwLmpzeyJpbXBvcnRzIjpbIi4vc3JjL2hlYXAuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL3NyYy9oZWFwLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2hlYXAuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAALQAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMS11MjEuMC9zcmMvZXhwb3J0cy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAE88KdzwoAAM8KAAAqAAAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4xLXUyMS4wL3NyYy9oZWFwLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9leG8iLCJAYWdvcmljL3N0b3JlIiwiLi9tYWtlLW9uY2UuanMiLCIuL2tleXMuanMiLCIuL3dhdGNoLXByb21pc2UuanMiXSwiZXhwb3J0cyI6WyJtYWtlSGVhcFpvbmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYXIsaXNQYXNzYWJsZSxtYWtlRXhvLGRlZmluZUV4b0NsYXNzLGRlZmluZUV4b0NsYXNzS2l0LG1ha2VTY2FsYXJNYXBTdG9yZSxtYWtlU2NhbGFyU2V0U3RvcmUsbWFrZVNjYWxhcldlYWtNYXBTdG9yZSxtYWtlU2NhbGFyV2Vha1NldFN0b3JlLG1ha2VPbmNlS2l0LGtleXMsd2F0Y2hQcm9taXNlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dLFtcImlzUGFzc2FibGVcIixbJGjNj19hID0+IChpc1Bhc3NhYmxlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXhvXCIsIFtbXCJtYWtlRXhvXCIsWyRozY9fYSA9PiAobWFrZUV4byA9ICRozY9fYSldXSxbXCJkZWZpbmVFeG9DbGFzc1wiLFskaM2PX2EgPT4gKGRlZmluZUV4b0NsYXNzID0gJGjNj19hKV1dLFtcImRlZmluZUV4b0NsYXNzS2l0XCIsWyRozY9fYSA9PiAoZGVmaW5lRXhvQ2xhc3NLaXQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtYWtlU2NhbGFyTWFwU3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyTWFwU3RvcmUgPSAkaM2PX2EpXV0sW1wibWFrZVNjYWxhclNldFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZVNjYWxhclNldFN0b3JlID0gJGjNj19hKV1dLFtcIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyV2Vha01hcFN0b3JlID0gJGjNj19hKV1dLFtcIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyV2Vha1NldFN0b3JlID0gJGjNj19hKV1dXV0sW1wiLi9tYWtlLW9uY2UuanNcIiwgW1tcIm1ha2VPbmNlS2l0XCIsWyRozY9fYSA9PiAobWFrZU9uY2VLaXQgPSAkaM2PX2EpXV1dXSxbXCIuL2tleXMuanNcIiwgW1tcImFnb3JpY1ZhdERhdGFLZXlzXCIsWyRozY9fYSA9PiAoa2V5cyA9ICRozY9fYSldXV1dLFtcIi4vd2F0Y2gtcHJvbWlzZS5qc1wiLCBbW1wid2F0Y2hQcm9taXNlXCIsWyRozY9fYSA9PiAod2F0Y2hQcm9taXNlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cbiAqL1xuY29uc3QgZGV0YWNoZWRIZWFwU3RvcmVzID0gRmFyKCdoZWFwU3RvcmVzJywge1xuICBkZXRhY2hlZDogKCkgPT4gZGV0YWNoZWRIZWFwU3RvcmVzLFxuICBpc1N0b3JhYmxlOiBpc1Bhc3NhYmxlLFxuXG4gIHNldFN0b3JlOiBtYWtlU2NhbGFyU2V0U3RvcmUsXG4gIG1hcFN0b3JlOiBtYWtlU2NhbGFyTWFwU3RvcmUsXG4gIHdlYWtNYXBTdG9yZTogbWFrZVNjYWxhcldlYWtNYXBTdG9yZSxcbiAgd2Vha1NldFN0b3JlOiBtYWtlU2NhbGFyV2Vha1NldFN0b3JlLFxufSk7XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VIZWFwWm9uZSA9IChiYXNlTGFiZWwgPSAnaGVhcFpvbmUnKSA9PiB7XG4gIGNvbnN0IHsgbWFrZU9uY2UsIHdyYXBQcm92aWRlciB9ID0gbWFrZU9uY2VLaXQoYmFzZUxhYmVsLCBkZXRhY2hlZEhlYXBTdG9yZXMpO1xuXG4gIC8qXG5cblxuICAgKi9cbiAgY29uc3QgbWFrZVN1YlpvbmUgPSAobGFiZWwsIF9vcHRpb25zKSA9PlxuICAgIG1ha2VIZWFwWm9uZShgJHtiYXNlTGFiZWx9LiR7bGFiZWx9YCk7XG5cbiAgcmV0dXJuIEZhcignaGVhcFpvbmUnLCB7XG4gICAgZXhvOiB3cmFwUHJvdmlkZXIobWFrZUV4bywga2V5cy5leG8pLFxuICAgIGV4b0NsYXNzOiB3cmFwUHJvdmlkZXIoZGVmaW5lRXhvQ2xhc3MsIGtleXMuZXhvQ2xhc3MpLFxuICAgIGV4b0NsYXNzS2l0OiB3cmFwUHJvdmlkZXIoZGVmaW5lRXhvQ2xhc3NLaXQsIGtleXMuZXhvQ2xhc3NLaXQpLFxuICAgIHN1YlpvbmU6IHdyYXBQcm92aWRlcihtYWtlU3ViWm9uZSksXG5cbiAgICBtYWtlT25jZSxcbiAgICB3YXRjaFByb21pc2UsXG4gICAgZGV0YWNoZWQ6IGRldGFjaGVkSGVhcFN0b3Jlcy5kZXRhY2hlZCxcbiAgICBpc1N0b3JhYmxlOiBkZXRhY2hlZEhlYXBTdG9yZXMuaXNTdG9yYWJsZSxcblxuICAgIG1hcFN0b3JlOiB3cmFwUHJvdmlkZXIoZGV0YWNoZWRIZWFwU3RvcmVzLm1hcFN0b3JlKSxcbiAgICBzZXRTdG9yZTogd3JhcFByb3ZpZGVyKGRldGFjaGVkSGVhcFN0b3Jlcy5zZXRTdG9yZSksXG4gICAgd2Vha01hcFN0b3JlOiB3cmFwUHJvdmlkZXIoZGV0YWNoZWRIZWFwU3RvcmVzLndlYWtNYXBTdG9yZSksXG4gICAgd2Vha1NldFN0b3JlOiB3cmFwUHJvdmlkZXIoZGV0YWNoZWRIZWFwU3RvcmVzLndlYWtTZXRTdG9yZSksXG4gIH0pO1xufTskaM2PX29uY2UubWFrZUhlYXBab25lKG1ha2VIZWFwWm9uZSk7XG5oYXJkZW4obWFrZUhlYXBab25lKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VIZWFwWm9uZSI6WyJtYWtlSGVhcFpvbmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAFW6x+nkCAAB5AgAAKwAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMS11MjEuMC9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9leHBvcnRzLmpzIiwiLi9tYWtlLW9uY2UuanMiLCIuL2tleXMuanMiLCIuL2lzLXBhc3NhYmxlLmpzIiwiLi93YXRjaC1wcm9taXNlLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9leHBvcnRzLmpzIiwiLi9pcy1wYXNzYWJsZS5qcyIsIi4va2V5cy5qcyIsIi4vbWFrZS1vbmNlLmpzIiwiLi93YXRjaC1wcm9taXNlLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vZXhwb3J0cy5qc1wiLCBbXV0sW1wiLi9tYWtlLW9uY2UuanNcIiwgW11dLFtcIi4va2V5cy5qc1wiLCBbXV0sW1wiLi9pcy1wYXNzYWJsZS5qc1wiLCBbXV0sW1wiLi93YXRjaC1wcm9taXNlLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADl90gx0AgAAdAIAADEAAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjEtdTIxLjAvc3JjL2lzLXBhc3NhYmxlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiZXhwb3J0cyI6WyJpc1Bhc3NhYmxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcmVhbElzUGFzc2FibGU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJpc1Bhc3NhYmxlXCIsWyRozY9fYSA9PiAocmVhbElzUGFzc2FibGUgPSAkaM2PX2EpXV1dXV0pO1xuXG4vKlxuXG4gKi9cblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGlzUGFzc2FibGUgPSBzcGVjaW1lbiA9PiByZWFsSXNQYXNzYWJsZShzcGVjaW1lbik7JGjNj19vbmNlLmlzUGFzc2FibGUoaXNQYXNzYWJsZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1Bhc3NhYmxlIjpbImlzUGFzc2FibGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAy4/sxZgDAACYAwAAKgAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMS11MjEuMC9zcmMva2V5cy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiYWdvcmljVmF0RGF0YUtleXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Ly9cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3Qga2luZCA9IGxhYmVsID0+IGAke2xhYmVsfV9raW5kSGFuZGxlYDtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3Qgc2luZ2xldG9uID0gbGFiZWwgPT4gYCR7bGFiZWx9X3NpbmdsZXRvbmA7XG5cbi8qXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBhZ29yaWNWYXREYXRhS2V5cyA9IHtcbiAgZXhvQ2xhc3M6IGxhYmVsID0+IGhhcmRlbihba2luZChsYWJlbCldKSxcbiAgZXhvQ2xhc3NLaXQ6IGxhYmVsID0+IGhhcmRlbihba2luZChsYWJlbCldKSxcbiAgZXhvOiBsYWJlbCA9PiBoYXJkZW4oW2tpbmQobGFiZWwpLCBzaW5nbGV0b24obGFiZWwpXSksXG4gIHN0b3JlOiBsYWJlbCA9PiBoYXJkZW4oW2xhYmVsXSksXG4gIHpvbmU6IGxhYmVsID0+IGhhcmRlbihbbGFiZWxdKSxcbn07JGjNj19vbmNlLmFnb3JpY1ZhdERhdGFLZXlzKGFnb3JpY1ZhdERhdGFLZXlzKTtcbmhhcmRlbihhZ29yaWNWYXREYXRhS2V5cyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhZ29yaWNWYXREYXRhS2V5cyI6WyJhZ29yaWNWYXREYXRhS2V5cyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAa7pnbpQcAAKUHAAAvAAAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4xLXUyMS4wL3NyYy9tYWtlLW9uY2UuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsibWFrZU9uY2VLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dXSk7XG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgZGVmYXVsdExhYmVsVG9LZXlzID0gbGFiZWwgPT4gaGFyZGVuKFtsYWJlbF0pO1xuaGFyZGVuKGRlZmF1bHRMYWJlbFRvS2V5cyk7XG5cbi8qXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlT25jZUtpdCA9IChkZWJ1Z05hbWUsIHN0b3JlcywgYmFja2luZ1N0b3JlID0gdW5kZWZpbmVkKSA9PiB7XG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIGNvbnN0IHVzZWRLZXlzID0gc3RvcmVzLmRldGFjaGVkKCkuc2V0U3RvcmUoYCR7ZGVidWdOYW1lfSB1c2VkIGtleXNgKTtcblxuICAvKlxuXG4gICAqL1xuICBjb25zdCBhc3NlcnRPbmx5T25jZSA9IGtleSA9PiB7XG4gICAgdHlwZW9mIGtleSA9PT0gJ3N0cmluZycgfHwgRmFpbGBrZXkgJHtrZXl9IG11c3QgYmUgYSBzdHJpbmdgO1xuICAgICF1c2VkS2V5cy5oYXMoa2V5KSB8fFxuICAgICAgRmFpbGBrZXkgJHtrZXl9IGhhcyBhbHJlYWR5IGJlZW4gdXNlZCBpbiB0aGlzIHpvbmUgYW5kIGluY2FybmF0aW9uYDtcblxuICAgIC8vXG4gICAgLy9cbiAgICB1c2VkS2V5cy5hZGQoa2V5KTtcbiAgfTtcblxuICAvKlxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCB3cmFwUHJvdmlkZXIgPSAocHJvdmlkZXIsIGxhYmVsVG9LZXlzID0gZGVmYXVsdExhYmVsVG9LZXlzKSA9PiB7XG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCB3cmFwcGVyID0gKGxhYmVsLCAuLi5yZXN0KSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBsYWJlbFRvS2V5cyhsYWJlbCkpIHtcbiAgICAgICAgYXNzZXJ0T25seU9uY2Uoa2V5KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwcm92aWRlcihsYWJlbCwgLi4ucmVzdCk7XG4gICAgfTtcbiAgICByZXR1cm4gLyogICAgICAgICAgICAqLyAod3JhcHBlcik7XG4gIH07XG5cbiAgLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgbWFrZU9uY2UgPSAoa2V5LCBtYWtlcikgPT4ge1xuICAgIGFzc2VydE9ubHlPbmNlKGtleSk7XG4gICAgaWYgKGJhY2tpbmdTdG9yZSAmJiBiYWNraW5nU3RvcmUuaGFzKGtleSkpIHtcbiAgICAgIHJldHVybiBiYWNraW5nU3RvcmUuZ2V0KGtleSk7XG4gICAgfVxuICAgIGNvbnN0IHZhbHVlID0gbWFrZXIoa2V5KTtcbiAgICBzdG9yZXMuaXNTdG9yYWJsZSh2YWx1ZSkgfHxcbiAgICAgIEZhaWxgbWFrZXIgcmV0dXJuIHZhbHVlICR7dmFsdWV9IGlzIG5vdCBzdG9yYWJsZWA7XG4gICAgYmFja2luZ1N0b3JlICYmIGJhY2tpbmdTdG9yZS5pbml0KGtleSwgdmFsdWUpO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfTtcblxuICByZXR1cm4gaGFyZGVuKHsgbWFrZU9uY2UsIHdyYXBQcm92aWRlciB9KTtcbn07JGjNj19vbmNlLm1ha2VPbmNlS2l0KG1ha2VPbmNlS2l0KTtcbmhhcmRlbihtYWtlT25jZUtpdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlT25jZUtpdCI6WyJtYWtlT25jZUtpdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACVS2X92wkAANsJAAAzAAAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4xLXUyMS4wL3NyYy93YXRjaC1wcm9taXNlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL3BhdHRlcm5zIiwiQGVuZG8vZmFyIl0sImV4cG9ydHMiOlsiUHJvbWlzZVdhdGNoZXJGdWxmaWxsZWRJIiwiUHJvbWlzZVdhdGNoZXJIYW5kbGVyIiwiUHJvbWlzZVdhdGNoZXJJIiwiUHJvbWlzZVdhdGNoZXJSZWplY3RlZEkiLCJ3YXRjaFByb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLE0sRTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuY29uc3QgeyBhcHBseSB9ID0gUmVmbGVjdDtcblxuLypcblxuICovXG4gICAgICAgY29uc3QgUHJvbWlzZVdhdGNoZXJIYW5kbGVyID0gTS5jYWxsKE0ucmF3KCkpLnJlc3QoTS5yYXcoKSkucmV0dXJucygpO1xuXG4vKlxuXG4gKi8kaM2PX29uY2UuUHJvbWlzZVdhdGNoZXJIYW5kbGVyKFByb21pc2VXYXRjaGVySGFuZGxlcik7XG4gICAgICAgY29uc3QgUHJvbWlzZVdhdGNoZXJJID0gTS5pbnRlcmZhY2UoJ1Byb21pc2VXYXRjaGVyJywge1xuICBvbkZ1bGZpbGxlZDogUHJvbWlzZVdhdGNoZXJIYW5kbGVyLFxuICBvblJlamVjdGVkOiBQcm9taXNlV2F0Y2hlckhhbmRsZXIsXG59KTtcblxuLypcblxuICovJGjNj19vbmNlLlByb21pc2VXYXRjaGVySShQcm9taXNlV2F0Y2hlckkpO1xuICAgICAgIGNvbnN0IFByb21pc2VXYXRjaGVyRnVsZmlsbGVkSSA9IE0uaW50ZXJmYWNlKCdQcm9taXNlV2F0Y2hlckZ1bGZpbGxlZCcsIHtcbiAgb25GdWxmaWxsZWQ6IFByb21pc2VXYXRjaGVySGFuZGxlcixcbn0pO1xuXG4vKlxuXG4gKi8kaM2PX29uY2UuUHJvbWlzZVdhdGNoZXJGdWxmaWxsZWRJKFByb21pc2VXYXRjaGVyRnVsZmlsbGVkSSk7XG4gICAgICAgY29uc3QgUHJvbWlzZVdhdGNoZXJSZWplY3RlZEkgPSBNLmludGVyZmFjZSgnUHJvbWlzZVdhdGNoZXJSZWplY3RlZCcsIHtcbiAgb25SZWplY3RlZDogUHJvbWlzZVdhdGNoZXJIYW5kbGVyLFxufSk7XG5cbi8qXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuICovJGjNj19vbmNlLlByb21pc2VXYXRjaGVyUmVqZWN0ZWRJKFByb21pc2VXYXRjaGVyUmVqZWN0ZWRJKTtcbmNvbnN0IGNhbGxNZU1heWJlID0gKHRoYXQsIHByb3AsIHBvc3RBcmdzKSA9PiB7XG4gIGNvbnN0IGZuID0gdGhhdFtwcm9wXTtcbiAgaWYgKCFmbikge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgYXNzZXJ0LnR5cGVvZihmbiwgJ2Z1bmN0aW9uJyk7XG4gIC8qXG5cbiAgICovXG4gIGNvbnN0IHdyYXBwZWQgPSBhcmcgPT4ge1xuICAgIC8vXG4gICAgLy9cbiAgICBhcHBseShmbiwgdGhhdCwgW2FyZywgLi4ucG9zdEFyZ3NdKTtcbiAgfTtcbiAgcmV0dXJuIHdyYXBwZWQ7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3Qgd2F0Y2hQcm9taXNlID0gKHAsIHdhdGNoZXIsIC4uLndhdGNoZXJBcmdzKSA9PiB7XG4gIFByb21pc2UucmVzb2x2ZShwKSA9PT0gcCB8fCBGYWlsYHdhdGNoUHJvbWlzZSBvbmx5IHdhdGNoZXMgcHJvbWlzZXNgO1xuICBjb25zdCBvbkZ1bGZpbGxlZCA9IGNhbGxNZU1heWJlKHdhdGNoZXIsICdvbkZ1bGZpbGxlZCcsIHdhdGNoZXJBcmdzKTtcbiAgY29uc3Qgb25SZWplY3RlZCA9IGNhbGxNZU1heWJlKHdhdGNoZXIsICdvblJlamVjdGVkJywgd2F0Y2hlckFyZ3MpO1xuICBvbkZ1bGZpbGxlZCB8fFxuICAgIG9uUmVqZWN0ZWQgfHxcbiAgICBGYWlsYHByb21pc2Ugd2F0Y2hlciBtdXN0IGltcGxlbWVudCBhdCBsZWFzdCBvbmUgaGFuZGxlciBtZXRob2RgO1xuICB2b2lkIEUud2hlbihwLCBvbkZ1bGZpbGxlZCwgb25SZWplY3RlZCk7XG59OyRozY9fb25jZS53YXRjaFByb21pc2Uod2F0Y2hQcm9taXNlKTtcbmhhcmRlbih3YXRjaFByb21pc2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUHJvbWlzZVdhdGNoZXJIYW5kbGVyIjpbIlByb21pc2VXYXRjaGVySGFuZGxlciJdLCJQcm9taXNlV2F0Y2hlckkiOlsiUHJvbWlzZVdhdGNoZXJJIl0sIlByb21pc2VXYXRjaGVyRnVsZmlsbGVkSSI6WyJQcm9taXNlV2F0Y2hlckZ1bGZpbGxlZEkiXSwiUHJvbWlzZVdhdGNoZXJSZWplY3RlZEkiOlsiUHJvbWlzZVdhdGNoZXJSZWplY3RlZEkiXSwid2F0Y2hQcm9taXNlIjpbIndhdGNoUHJvbWlzZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADKlZNPaQUAAGkFAAAnAAAAQGFnb3JpYy9jYWNoZS12MC4zLjMtdTIxLjAvc3JjL2NhY2hlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ZhciIsIi4vc3RvcmUuanMiXSwiZXhwb3J0cyI6WyJtYWtlQ2FjaGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBFLEZhcixtYWtlU2NhbGFyU3RvcmVDb29yZGluYXRvcjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV0sW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiLi9zdG9yZS5qc1wiLCBbW1wibWFrZVNjYWxhclN0b3JlQ29vcmRpbmF0b3JcIixbJGjNj19hID0+IChtYWtlU2NhbGFyU3RvcmVDb29yZGluYXRvciA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuLypcblxuXG4gKi9cblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VDYWNoZSA9IChjb29yZGluYXRvciA9IG1ha2VTY2FsYXJTdG9yZUNvb3JkaW5hdG9yKCkpID0+IHtcbiAgLypcblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBjYWNoZSA9IChrZXksIC4uLm9wdFVwZGF0ZUd1YXJkUGF0dGVybikgPT4ge1xuICAgIGlmIChvcHRVcGRhdGVHdWFyZFBhdHRlcm4ubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gRShjb29yZGluYXRvcikuZ2V0UmVjZW50VmFsdWUoa2V5KTtcbiAgICB9XG5cbiAgICBjb25zdCBbdXBkYXRlLCBndWFyZFBhdHRlcm5dID0gb3B0VXBkYXRlR3VhcmRQYXR0ZXJuO1xuICAgIGlmICh0eXBlb2YgdXBkYXRlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICByZXR1cm4gRShjb29yZGluYXRvcikuc2V0Q2FjaGVWYWx1ZShrZXksIHVwZGF0ZSwgZ3VhcmRQYXR0ZXJuKTtcbiAgICB9XG5cbiAgICBjb25zdCB1cGRhdGVyID0gRmFyKCdjYWNoZSB1cGRhdGVyJywge1xuICAgICAgdXBkYXRlOiBvbGRWYWx1ZSA9PiB7XG4gICAgICAgIHJldHVybiB1cGRhdGUob2xkVmFsdWUpO1xuICAgICAgfSxcbiAgICB9KTtcbiAgICByZXR1cm4gRShjb29yZGluYXRvcikudXBkYXRlQ2FjaGVWYWx1ZShrZXksIHVwZGF0ZXIsIGd1YXJkUGF0dGVybik7XG4gIH07XG5cbiAgcmV0dXJuIGNhY2hlO1xufTskaM2PX29uY2UubWFrZUNhY2hlKG1ha2VDYWNoZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlQ2FjaGUiOlsibWFrZUNhY2hlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKDGVQkRAgAAEQIAACYAAABAYWdvcmljL2NhY2hlLXYwLjMuMy11MjEuMC9zcmMvbWFpbi5qc3siaW1wb3J0cyI6WyIuL3R5cGVzLmpzIiwiLi9zdG9yZS5qcyIsIi4vY2FjaGUuanMiLCIuL3N0YXRlLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9jYWNoZS5qcyIsIi4vc3RhdGUuanMiLCIuL3N0b3JlLmpzIiwiLi90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3R5cGVzLmpzXCIsIFtdXSxbXCIuL3N0b3JlLmpzXCIsIFtdXSxbXCIuL2NhY2hlLmpzXCIsIFtdXSxbXCIuL3N0YXRlLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEvZK3ZTBAAAUwQAACcAAABAYWdvcmljL2NhY2hlLXYwLjMuMy11MjEuMC9zcmMvc3RhdGUuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkdST1VORF9TVEFURSIsIm1ha2VTdGF0ZSIsIndpdGhHcm91bmRTdGF0ZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvL1xuXG4vKlxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IEdST1VORF9TVEFURSA9IGhhcmRlbih7IGdlbmVyYXRpb246IDBuLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuXG4vKlxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5HUk9VTkRfU1RBVEUoR1JPVU5EX1NUQVRFKTtcbiAgICAgICBjb25zdCBtYWtlU3RhdGUgPSAodmFsdWUsIHByaW9yU3RhdGUgPSBHUk9VTkRfU1RBVEUpID0+XG4gIGhhcmRlbih7XG4gICAgZ2VuZXJhdGlvbjogcHJpb3JTdGF0ZS5nZW5lcmF0aW9uICsgMW4sXG4gICAgdmFsdWUsXG4gIH0pO1xuXG4vKlxuXG5cblxuICovJGjNj19vbmNlLm1ha2VTdGF0ZShtYWtlU3RhdGUpO1xuICAgICAgIGNvbnN0IHdpdGhHcm91bmRTdGF0ZSA9IHN0YXRlU3RvcmUgPT4gKHtcbiAgLi4uc3RhdGVTdG9yZSxcbiAgZ2V0OiBrZXkgPT4ge1xuICAgIGlmICghc3RhdGVTdG9yZS5oYXMoa2V5KSkge1xuICAgICAgcmV0dXJuIEdST1VORF9TVEFURTtcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlU3RvcmUuZ2V0KGtleSk7XG4gIH0sXG59KTskaM2PX29uY2Uud2l0aEdyb3VuZFN0YXRlKHdpdGhHcm91bmRTdGF0ZSk7XG5oYXJkZW4od2l0aEdyb3VuZFN0YXRlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkdST1VORF9TVEFURSI6WyJHUk9VTkRfU1RBVEUiXSwibWFrZVN0YXRlIjpbIm1ha2VTdGF0ZSJdLCJ3aXRoR3JvdW5kU3RhdGUiOlsid2l0aEdyb3VuZFN0YXRlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACP9LiSjGgAAoxoAACcAAABAYWdvcmljL2NhY2hlLXYwLjMuMy11MjEuMC9zcmMvc3RvcmUuanN7ImltcG9ydHMiOlsiQGVuZG8vZmFyIiwiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGFnb3JpYy9pbnRlcm5hbCIsIi4vc3RhdGUuanMiXSwiZXhwb3J0cyI6WyJtYWtlQ2hhaW5TdG9yYWdlQ29vcmRpbmF0b3IiLCJtYWtlU2NhbGFyU3RvcmVDb29yZGluYXRvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEUsRmFyLGRlZXBseUZ1bGZpbGxlZCxtYWtlTWFyc2hhbCxtYXRjaGVzLG1ha2VTY2FsYXJNYXBTdG9yZSxtYWtlU2NhbGFyQmlnTWFwU3RvcmUsdW50aWxUcnVlLHdpdGhHcm91bmRTdGF0ZSxtYWtlU3RhdGU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImRlZXBseUZ1bGZpbGxlZFwiLFskaM2PX2EgPT4gKGRlZXBseUZ1bGZpbGxlZCA9ICRozY9fYSldXSxbXCJtYWtlTWFyc2hhbFwiLFskaM2PX2EgPT4gKG1ha2VNYXJzaGFsID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibWF0Y2hlc1wiLFskaM2PX2EgPT4gKG1hdGNoZXMgPSAkaM2PX2EpXV0sW1wibWFrZVNjYWxhck1hcFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZVNjYWxhck1hcFN0b3JlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wibWFrZVNjYWxhckJpZ01hcFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZVNjYWxhckJpZ01hcFN0b3JlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1widW50aWxUcnVlXCIsWyRozY9fYSA9PiAodW50aWxUcnVlID0gJGjNj19hKV1dXV0sW1wiLi9zdGF0ZS5qc1wiLCBbW1wid2l0aEdyb3VuZFN0YXRlXCIsWyRozY9fYSA9PiAod2l0aEdyb3VuZFN0YXRlID0gJGjNj19hKV1dLFtcIm1ha2VTdGF0ZVwiLFskaM2PX2EgPT4gKG1ha2VTdGF0ZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG4vKlxuXG5cbiAqL1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgbWFrZUtleVRvU3RyaW5nID0gKHNhbml0aXplID0gb2JqID0+IG9iaikgPT4ge1xuICBsZXQgbGFzdE5vbmNlID0gMDtcbiAgY29uc3QgdmFsVG9Ob25jZSA9IG5ldyBXZWFrTWFwKCk7XG4gIGNvbnN0IHZhbFRvU2xvdCA9IHZhbCA9PiB7XG4gICAgbGV0IHNsb3QgPSB2YWxUb05vbmNlLmdldCh2YWwpO1xuICAgIGlmICghc2xvdCkge1xuICAgICAgbGFzdE5vbmNlICs9IDE7XG4gICAgICBzbG90ID0gbGFzdE5vbmNlO1xuICAgICAgdmFsVG9Ob25jZS5zZXQodmFsLCBzbG90KTtcbiAgICB9XG4gICAgcmV0dXJuIHNsb3Q7XG4gIH07XG5cbiAgY29uc3QgeyB0b0NhcERhdGE6IGtleVRvSnNvbmFibGUgfSA9IG1ha2VNYXJzaGFsKHZhbFRvU2xvdCwgdW5kZWZpbmVkLCB7XG4gICAgc2VyaWFsaXplQm9keUZvcm1hdDogJ3NtYWxsY2FwcycsXG4gIH0pO1xuICBjb25zdCBrZXlUb1N0cmluZyA9IGFzeW5jIGtleVAgPT4ge1xuICAgIGNvbnN0IGtleSA9IGF3YWl0IHNhbml0aXplKGtleVApO1xuICAgIGNvbnN0IG9iaiA9IGtleVRvSnNvbmFibGUoa2V5KTtcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob2JqKTtcbiAgfTtcbiAgcmV0dXJuIGtleVRvU3RyaW5nO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGFwcGx5Q2FjaGVUcmFuc2FjdGlvbiA9IGFzeW5jIChcbiAga2V5U3RyLFxuICB0eG4sXG4gIGd1YXJkUGF0dGVybixcbiAgc2FuaXRpemUsXG4gIHN0YXRlU3RvcmUsXG4pID0+IHtcbiAgLypcblxuXG5cblxuICAgKi9cbiAgY29uc3QgZ2V0VXBkYXRlZFN0YXRlID0gYXN5bmMgYmFzaXNTdGF0ZSA9PiB7XG4gICAgY29uc3QgeyB2YWx1ZSB9ID0gYmFzaXNTdGF0ZTtcbiAgICBpZiAoIW1hdGNoZXModmFsdWUsIGd1YXJkUGF0dGVybikpIHtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBuZXdWYWx1ZSA9IGF3YWl0IHNhbml0aXplKHR4bih2YWx1ZSkpO1xuICAgIHJldHVybiBtYWtlU3RhdGUobmV3VmFsdWUsIGJhc2lzU3RhdGUpO1xuICB9O1xuXG4gIGxldCBiYXNpc1N0YXRlID0gc3RhdGVTdG9yZS5nZXQoa2V5U3RyKTtcbiAgbGV0IHVwZGF0ZWRTdGF0ZSA9IGF3YWl0IGdldFVwZGF0ZWRTdGF0ZShiYXNpc1N0YXRlKTtcblxuICAvL1xuXG4gIC8vXG4gIGJhc2lzU3RhdGUgPSBzdGF0ZVN0b3JlLmdldChrZXlTdHIpO1xuICBjb25zdCB1bnRpbFVwZGF0ZVN5bmNlZCA9IHVudGlsVHJ1ZShcbiAgICAoKSA9PiAhdXBkYXRlZFN0YXRlIHx8IHVwZGF0ZWRTdGF0ZS5nZW5lcmF0aW9uID4gYmFzaXNTdGF0ZS5nZW5lcmF0aW9uLFxuICApO1xuICBmb3IgYXdhaXQgKGNvbnN0IF8gb2YgdW50aWxVcGRhdGVTeW5jZWQpIHtcbiAgICB1cGRhdGVkU3RhdGUgPSBhd2FpdCBnZXRVcGRhdGVkU3RhdGUoYmFzaXNTdGF0ZSk7XG4gICAgLy9cbiAgICBiYXNpc1N0YXRlID0gc3RhdGVTdG9yZS5nZXQoa2V5U3RyKTtcbiAgfVxuXG4gIGlmICghdXBkYXRlZFN0YXRlKSB7XG4gICAgLy9cbiAgICAvL1xuICAgIHJldHVybiBiYXNpc1N0YXRlLnZhbHVlO1xuICB9XG5cbiAgLy9cbiAgLy9cbiAgaWYgKGJhc2lzU3RhdGUuZ2VuZXJhdGlvbiA8IDFuKSB7XG4gICAgLy9cbiAgICBzdGF0ZVN0b3JlLmluaXQoa2V5U3RyLCB1cGRhdGVkU3RhdGUpO1xuICB9IGVsc2Uge1xuICAgIHN0YXRlU3RvcmUuc2V0KGtleVN0ciwgdXBkYXRlZFN0YXRlKTtcbiAgfVxuXG4gIC8vXG4gIHJldHVybiB1cGRhdGVkU3RhdGUudmFsdWU7XG59O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBzdHJpbmdpZnlTdGF0ZVN0b3JlID0gYXN5bmMgKHN0YXRlU3RvcmUsIG1hcnNoYWxsZXIpID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3Qgb2JqID0ge307XG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIHN0YXRlU3RvcmUuZW50cmllcygpKSB7XG4gICAgb2JqW2tleV0gPSBFKG1hcnNoYWxsZXIpLnRvQ2FwRGF0YSh2YWx1ZSk7XG4gIH1cbiAgcmV0dXJuIGRlZXBseUZ1bGZpbGxlZChoYXJkZW4ob2JqKSkudGhlbihmdWxmaWxsZWRPYmogPT5cbiAgICBKU09OLnN0cmluZ2lmeShmdWxmaWxsZWRPYmopLFxuICApO1xufTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VTY2FsYXJTdG9yZUNvb3JkaW5hdG9yID0gKFxuICBzdGF0ZVN0b3JlID0gbWFrZVNjYWxhck1hcFN0b3JlKCksXG4gIHNhbml0aXplID0gZGVlcGx5RnVsZmlsbGVkLFxuKSA9PiB7XG4gIGNvbnN0IHNlcmlhbGl6ZVBhc3NhYmxlID0gbWFrZUtleVRvU3RyaW5nKHNhbml0aXplKTtcblxuICBjb25zdCBkZWZhdWx0U3RhdGVTdG9yZSA9IHdpdGhHcm91bmRTdGF0ZShzdGF0ZVN0b3JlKTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBjb29yZCA9IEZhcignc3RvcmUgY2FjaGUgY29vcmRpbmF0b3InLCB7XG4gICAgZ2V0UmVjZW50VmFsdWU6IGFzeW5jIGtleSA9PiB7XG4gICAgICBjb25zdCBrZXlTdHIgPSBhd2FpdCBzZXJpYWxpemVQYXNzYWJsZShrZXkpO1xuICAgICAgcmV0dXJuIGRlZmF1bHRTdGF0ZVN0b3JlLmdldChrZXlTdHIpLnZhbHVlO1xuICAgIH0sXG4gICAgc2V0Q2FjaGVWYWx1ZTogYXN5bmMgKGtleSwgbmV3VmFsdWUsIGd1YXJkUGF0dGVybikgPT4ge1xuICAgICAgY29uc3Qga2V5U3RyID0gYXdhaXQgc2VyaWFsaXplUGFzc2FibGUoa2V5KTtcbiAgICAgIHJldHVybiBhcHBseUNhY2hlVHJhbnNhY3Rpb24oXG4gICAgICAgIGtleVN0cixcbiAgICAgICAgKCkgPT4gbmV3VmFsdWUsXG4gICAgICAgIGd1YXJkUGF0dGVybixcbiAgICAgICAgc2FuaXRpemUsXG4gICAgICAgIGRlZmF1bHRTdGF0ZVN0b3JlLFxuICAgICAgKTtcbiAgICB9LFxuICAgIHVwZGF0ZUNhY2hlVmFsdWU6IGFzeW5jIChrZXksIHVwZGF0ZXIsIGd1YXJkUGF0dGVybikgPT4ge1xuICAgICAgY29uc3Qga2V5U3RyID0gYXdhaXQgc2VyaWFsaXplUGFzc2FibGUoa2V5KTtcbiAgICAgIHJldHVybiBhcHBseUNhY2hlVHJhbnNhY3Rpb24oXG4gICAgICAgIGtleVN0cixcbiAgICAgICAgb2xkVmFsdWUgPT4gRSh1cGRhdGVyKS51cGRhdGUob2xkVmFsdWUpLFxuICAgICAgICBndWFyZFBhdHRlcm4sXG4gICAgICAgIHNhbml0aXplLFxuICAgICAgICBkZWZhdWx0U3RhdGVTdG9yZSxcbiAgICAgICk7XG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiBjb29yZDtcbn07XG5cbi8qXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UubWFrZVNjYWxhclN0b3JlQ29vcmRpbmF0b3IobWFrZVNjYWxhclN0b3JlQ29vcmRpbmF0b3IpO1xuY29uc3QgbWFrZUxhc3RXaW5zVXBkYXRlciA9IChzdGF0ZVN0b3JlLCBtYXJzaGFsbGVyLCBzdG9yYWdlTm9kZSkgPT4ge1xuICBsZXQgbGFzdFByZXBhcmVUaWNrZXQgPSAwbjtcbiAgbGV0IGxhc3RDb21taXRUaWNrZXQgPSAwbjtcblxuICByZXR1cm4gYXN5bmMgc3RvcmVkVmFsdWUgPT4ge1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGxhc3RQcmVwYXJlVGlja2V0ICs9IDFuO1xuICAgIGNvbnN0IG1hcnNoYWxsVGlja2V0ID0gbGFzdFByZXBhcmVUaWNrZXQ7XG4gICAgY29uc3Qgc2VyaWFsaXplZFN0b3JlID0gYXdhaXQgc3RyaW5naWZ5U3RhdGVTdG9yZShzdGF0ZVN0b3JlLCBtYXJzaGFsbGVyKTtcbiAgICBpZiAobWFyc2hhbGxUaWNrZXQgPCBsYXN0Q29tbWl0VGlja2V0KSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIHN0b3JlZFZhbHVlO1xuICAgIH1cbiAgICBhd2FpdCBFKHN0b3JhZ2VOb2RlKS5zZXRWYWx1ZShzZXJpYWxpemVkU3RvcmUpO1xuICAgIGxhc3RDb21taXRUaWNrZXQgPSBtYXJzaGFsbFRpY2tldDtcbiAgICByZXR1cm4gc3RvcmVkVmFsdWU7XG4gIH07XG59O1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VDaGFpblN0b3JhZ2VDb29yZGluYXRvciA9IChzdG9yYWdlTm9kZSwgbWFyc2hhbGxlcikgPT4ge1xuICBjb25zdCBzdGF0ZVN0b3JlID0gbWFrZVNjYWxhckJpZ01hcFN0b3JlKCdzdGF0ZUtleScpO1xuXG4gIGNvbnN0IHNhbml0aXplID0gZGVlcGx5RnVsZmlsbGVkO1xuICBjb25zdCBzZXJpYWxpemVQYXNzYWJsZSA9IG1ha2VLZXlUb1N0cmluZyhzYW5pdGl6ZSk7XG5cbiAgY29uc3QgZGVmYXVsdFN0YXRlU3RvcmUgPSB3aXRoR3JvdW5kU3RhdGUoc3RhdGVTdG9yZSk7XG5cbiAgY29uc3QgdXBkYXRlU3RvcmFnZU5vZGUgPSBtYWtlTGFzdFdpbnNVcGRhdGVyKFxuICAgIGRlZmF1bHRTdGF0ZVN0b3JlLFxuICAgIG1hcnNoYWxsZXIsXG4gICAgc3RvcmFnZU5vZGUsXG4gICk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgY29vcmQgPSBGYXIoJ3N0b3JlIGNhY2hlIGNvb3JkaW5hdG9yJywge1xuICAgIGdldFJlY2VudFZhbHVlOiBhc3luYyBrZXkgPT4ge1xuICAgICAgY29uc3Qga2V5U3RyID0gYXdhaXQgc2VyaWFsaXplUGFzc2FibGUoa2V5KTtcbiAgICAgIHJldHVybiBkZWZhdWx0U3RhdGVTdG9yZS5nZXQoa2V5U3RyKS52YWx1ZTtcbiAgICB9LFxuICAgIHNldENhY2hlVmFsdWU6IGFzeW5jIChrZXksIG5ld1ZhbHVlLCBndWFyZFBhdHRlcm4pID0+IHtcbiAgICAgIGNvbnN0IGtleVN0ciA9IGF3YWl0IHNlcmlhbGl6ZVBhc3NhYmxlKGtleSk7XG4gICAgICBjb25zdCBzdG9yZWRWYWx1ZSA9IGF3YWl0IGFwcGx5Q2FjaGVUcmFuc2FjdGlvbihcbiAgICAgICAga2V5U3RyLFxuICAgICAgICAoKSA9PiBuZXdWYWx1ZSxcbiAgICAgICAgZ3VhcmRQYXR0ZXJuLFxuICAgICAgICBzYW5pdGl6ZSxcbiAgICAgICAgZGVmYXVsdFN0YXRlU3RvcmUsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHVwZGF0ZVN0b3JhZ2VOb2RlKHN0b3JlZFZhbHVlKTtcbiAgICB9LFxuICAgIHVwZGF0ZUNhY2hlVmFsdWU6IGFzeW5jIChrZXksIHVwZGF0ZXIsIGd1YXJkUGF0dGVybikgPT4ge1xuICAgICAgY29uc3Qga2V5U3RyID0gYXdhaXQgc2VyaWFsaXplUGFzc2FibGUoa2V5KTtcbiAgICAgIGNvbnN0IHN0b3JlZFZhbHVlID0gYXdhaXQgYXBwbHlDYWNoZVRyYW5zYWN0aW9uKFxuICAgICAgICBrZXlTdHIsXG4gICAgICAgIG9sZFZhbHVlID0+IEUodXBkYXRlcikudXBkYXRlKG9sZFZhbHVlKSxcbiAgICAgICAgZ3VhcmRQYXR0ZXJuLFxuICAgICAgICBzYW5pdGl6ZSxcbiAgICAgICAgZGVmYXVsdFN0YXRlU3RvcmUsXG4gICAgICApO1xuICAgICAgcmV0dXJuIHVwZGF0ZVN0b3JhZ2VOb2RlKHN0b3JlZFZhbHVlKTtcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIGNvb3JkO1xufTskaM2PX29uY2UubWFrZUNoYWluU3RvcmFnZUNvb3JkaW5hdG9yKG1ha2VDaGFpblN0b3JhZ2VDb29yZGluYXRvcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlU2NhbGFyU3RvcmVDb29yZGluYXRvciI6WyJtYWtlU2NhbGFyU3RvcmVDb29yZGluYXRvciJdLCJtYWtlQ2hhaW5TdG9yYWdlQ29vcmRpbmF0b3IiOlsibWFrZUNoYWluU3RvcmFnZUNvb3JkaW5hdG9yIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACcAAABAYWdvcmljL2NhY2hlLXYwLjMuMy11MjEuMC9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAmQLNtKUfAAClHwAALAAAAEBhZ29yaWMvZXJ0cC12MC4xNi4zLXUyMS4wL3NyYy9hbW91bnRNYXRoLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL21hcnNoYWwiLCJAYWdvcmljL3N0b3JlIiwiLi9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qcyIsIi4vbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanMiLCIuL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qcyIsIi4vbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiQW1vdW50TWF0aCIsIkFzc2V0S2luZCIsImFzc2VydEFzc2V0S2luZCIsImFzc2VydFZhbHVlR2V0SGVscGVycyIsImdldEFzc2V0S2luZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHEsRmFpbCxwYXNzU3R5bGVPZixhc3NlcnRSZW1vdGFibGUsYXNzZXJ0UmVjb3JkLE0sbWF0Y2hlcyxuYXRNYXRoSGVscGVycyxzZXRNYXRoSGVscGVycyxjb3B5U2V0TWF0aEhlbHBlcnMsY29weUJhZ01hdGhIZWxwZXJzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UmVtb3RhYmxlXCIsWyRozY9fYSA9PiAoYXNzZXJ0UmVtb3RhYmxlID0gJGjNj19hKV1dLFtcImFzc2VydFJlY29yZFwiLFskaM2PX2EgPT4gKGFzc2VydFJlY29yZCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcIm1hdGNoZXNcIixbJGjNj19hID0+IChtYXRjaGVzID0gJGjNj19hKV1dXV0sW1wiLi9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qc1wiLCBbW1wibmF0TWF0aEhlbHBlcnNcIixbJGjNj19hID0+IChuYXRNYXRoSGVscGVycyA9ICRozY9fYSldXV1dLFtcIi4vbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanNcIiwgW1tcInNldE1hdGhIZWxwZXJzXCIsWyRozY9fYSA9PiAoc2V0TWF0aEhlbHBlcnMgPSAkaM2PX2EpXV1dXSxbXCIuL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qc1wiLCBbW1wiY29weVNldE1hdGhIZWxwZXJzXCIsWyRozY9fYSA9PiAoY29weVNldE1hdGhIZWxwZXJzID0gJGjNj19hKV1dXV0sW1wiLi9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanNcIiwgW1tcImNvcHlCYWdNYXRoSGVscGVyc1wiLFskaM2PX2EgPT4gKGNvcHlCYWdNYXRoSGVscGVycyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuLypcblxuXG4gKi9cblxuLy9cbi8qXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBBc3NldEtpbmQgPSAvKiAgICAgICAgICAgICAgICAqLyAoe1xuICBOQVQ6ICduYXQnLFxuICBTRVQ6ICdzZXQnLFxuICBDT1BZX1NFVDogJ2NvcHlTZXQnLFxuICBDT1BZX0JBRzogJ2NvcHlCYWcnLFxufSk7JGjNj19vbmNlLkFzc2V0S2luZChBc3NldEtpbmQpO1xuaGFyZGVuKEFzc2V0S2luZCk7XG5jb25zdCBhc3NldEtpbmROYW1lcyA9IGhhcmRlbihPYmplY3QudmFsdWVzKEFzc2V0S2luZCkuc29ydCgpKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICBjb25zdCBhc3NlcnRBc3NldEtpbmQgPSBhbGxlZ2VkQUsgPT4ge1xuICBhc3NldEtpbmROYW1lcy5pbmNsdWRlcyhhbGxlZ2VkQUspIHx8XG4gICAgRmFpbGBUaGUgYXNzZXRLaW5kICR7YWxsZWdlZEFLfSBtdXN0IGJlIG9uZSBvZiAke3EoYXNzZXRLaW5kTmFtZXMpfWA7XG59OyRozY9fb25jZS5hc3NlcnRBc3NldEtpbmQoYXNzZXJ0QXNzZXRLaW5kKTtcbmhhcmRlbihhc3NlcnRBc3NldEtpbmQpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuY29uc3QgaGVscGVycyA9IHtcbiAgbmF0OiBuYXRNYXRoSGVscGVycyxcbiAgc2V0OiBzZXRNYXRoSGVscGVycyxcbiAgY29weVNldDogY29weVNldE1hdGhIZWxwZXJzLFxuICBjb3B5QmFnOiBjb3B5QmFnTWF0aEhlbHBlcnMsXG59O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgYXNzZXJ0VmFsdWVHZXRBc3NldEtpbmQgPSB2YWx1ZSA9PiB7XG4gIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHZhbHVlKTtcbiAgaWYgKHBhc3NTdHlsZSA9PT0gJ2JpZ2ludCcpIHtcbiAgICByZXR1cm4gJ25hdCc7XG4gIH1cbiAgaWYgKHBhc3NTdHlsZSA9PT0gJ2NvcHlBcnJheScpIHtcbiAgICByZXR1cm4gJ3NldCc7XG4gIH1cbiAgaWYgKG1hdGNoZXModmFsdWUsIE0uc2V0KCkpKSB7XG4gICAgcmV0dXJuICdjb3B5U2V0JztcbiAgfVxuICBpZiAobWF0Y2hlcyh2YWx1ZSwgTS5iYWcoKSkpIHtcbiAgICByZXR1cm4gJ2NvcHlCYWcnO1xuICB9XG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIHRocm93IEZhaWxgdmFsdWUgJHt2YWx1ZX0gbXVzdCBiZSBhIGJpZ2ludCwgY29weVNldCwgY29weUJhZywgb3IgYW4gYXJyYXksIG5vdCAke3EoXG4gICAgcGFzc1N0eWxlLFxuICApfWA7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRWYWx1ZUdldEhlbHBlcnMgPSB2YWx1ZSA9PlxuICAvL1xuICBoZWxwZXJzW2Fzc2VydFZhbHVlR2V0QXNzZXRLaW5kKHZhbHVlKV07XG5cbi8qXG5cbiAqLyRozY9fb25jZS5hc3NlcnRWYWx1ZUdldEhlbHBlcnMoYXNzZXJ0VmFsdWVHZXRIZWxwZXJzKTtcbmNvbnN0IG9wdGlvbmFsQnJhbmRDaGVjayA9IChhbGxlZ2VkQnJhbmQsIGJyYW5kKSA9PiB7XG4gIGlmIChicmFuZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0UmVtb3RhYmxlKGJyYW5kLCAnYnJhbmQnKTtcbiAgICBhbGxlZ2VkQnJhbmQgPT09IGJyYW5kIHx8XG4gICAgICBGYWlsYGFtb3VudCdzIGJyYW5kICR7cShhbGxlZ2VkQnJhbmQpfSBkaWQgbm90IG1hdGNoIGV4cGVjdGVkIGJyYW5kICR7cShcbiAgICAgICAgYnJhbmQsXG4gICAgICApfWA7XG4gIH1cbn07XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBjaGVja0xSQW5kR2V0SGVscGVycyA9IChsZWZ0QW1vdW50LCByaWdodEFtb3VudCwgYnJhbmQgPSB1bmRlZmluZWQpID0+IHtcbiAgYXNzZXJ0UmVjb3JkKGxlZnRBbW91bnQsICdsZWZ0QW1vdW50Jyk7XG4gIGFzc2VydFJlY29yZChyaWdodEFtb3VudCwgJ3JpZ2h0QW1vdW50Jyk7XG4gIGNvbnN0IHsgdmFsdWU6IGxlZnRWYWx1ZSwgYnJhbmQ6IGxlZnRCcmFuZCB9ID0gbGVmdEFtb3VudDtcbiAgY29uc3QgeyB2YWx1ZTogcmlnaHRWYWx1ZSwgYnJhbmQ6IHJpZ2h0QnJhbmQgfSA9IHJpZ2h0QW1vdW50O1xuICBhc3NlcnRSZW1vdGFibGUobGVmdEJyYW5kLCAnbGVmdEJyYW5kJyk7XG4gIGFzc2VydFJlbW90YWJsZShyaWdodEJyYW5kLCAncmlnaHRCcmFuZCcpO1xuICBvcHRpb25hbEJyYW5kQ2hlY2sobGVmdEJyYW5kLCBicmFuZCk7XG4gIG9wdGlvbmFsQnJhbmRDaGVjayhyaWdodEJyYW5kLCBicmFuZCk7XG4gIGxlZnRCcmFuZCA9PT0gcmlnaHRCcmFuZCB8fFxuICAgIEZhaWxgQnJhbmRzIGluIGxlZnQgJHtxKGxlZnRCcmFuZCl9IGFuZCByaWdodCAke3EoXG4gICAgICByaWdodEJyYW5kLFxuICAgICl9IHNob3VsZCBtYXRjaCBidXQgZG8gbm90YDtcbiAgY29uc3QgbGVmdEhlbHBlcnMgPSBhc3NlcnRWYWx1ZUdldEhlbHBlcnMobGVmdFZhbHVlKTtcbiAgY29uc3QgcmlnaHRIZWxwZXJzID0gYXNzZXJ0VmFsdWVHZXRIZWxwZXJzKHJpZ2h0VmFsdWUpO1xuICBsZWZ0SGVscGVycyA9PT0gcmlnaHRIZWxwZXJzIHx8XG4gICAgRmFpbGBUaGUgbGVmdCAke2xlZnRBbW91bnR9IGFuZCByaWdodCBhbW91bnQgJHtyaWdodEFtb3VudH0gaGFkIGRpZmZlcmVudCBhc3NldEtpbmRzYDtcbiAgcmV0dXJuIGxlZnRIZWxwZXJzO1xufTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IGNvZXJjZUxSID0gKGgsIGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50KSA9PiB7XG4gIC8vXG4gIHJldHVybiBbaC5kb0NvZXJjZShsZWZ0QW1vdW50LnZhbHVlKSwgaC5kb0NvZXJjZShyaWdodEFtb3VudC52YWx1ZSldO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGlzR1RFID0gKGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50LCBicmFuZCA9IHVuZGVmaW5lZCkgPT4ge1xuICBjb25zdCBoID0gY2hlY2tMUkFuZEdldEhlbHBlcnMobGVmdEFtb3VudCwgcmlnaHRBbW91bnQsIGJyYW5kKTtcbiAgcmV0dXJuIGguZG9Jc0dURSguLi5jb2VyY2VMUihoLCBsZWZ0QW1vdW50LCByaWdodEFtb3VudCkpO1xufTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IEFtb3VudE1hdGggPSB7XG4gIC8vXG4gIC8vXG4gIC8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIG1ha2U6IChicmFuZCwgYWxsZWdlZFZhbHVlKSA9PiB7XG4gICAgYXNzZXJ0UmVtb3RhYmxlKGJyYW5kLCAnYnJhbmQnKTtcbiAgICBjb25zdCBoID0gYXNzZXJ0VmFsdWVHZXRIZWxwZXJzKGFsbGVnZWRWYWx1ZSk7XG4gICAgY29uc3QgdmFsdWUgPSBoLmRvQ29lcmNlKGFsbGVnZWRWYWx1ZSk7XG4gICAgLy9cbiAgICByZXR1cm4gaGFyZGVuKHsgYnJhbmQsIHZhbHVlIH0pO1xuICB9LFxuICAvKlxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb2VyY2U6IChicmFuZCwgYWxsZWdlZEFtb3VudCkgPT4ge1xuICAgIGFzc2VydFJlbW90YWJsZShicmFuZCwgJ2JyYW5kJyk7XG4gICAgYXNzZXJ0UmVjb3JkKGFsbGVnZWRBbW91bnQsICdhbW91bnQnKTtcbiAgICBjb25zdCB7IGJyYW5kOiBhbGxlZ2VkQnJhbmQsIHZhbHVlOiBhbGxlZ2VkVmFsdWUgfSA9IGFsbGVnZWRBbW91bnQ7XG4gICAgYnJhbmQgPT09IGFsbGVnZWRCcmFuZCB8fFxuICAgICAgRmFpbGBUaGUgYnJhbmQgaW4gdGhlIGFsbGVnZWRBbW91bnQgJHthbGxlZ2VkQW1vdW50fSBpbiAnY29lcmNlJyBkaWRuJ3QgbWF0Y2ggdGhlIHNwZWNpZmllZCBicmFuZCAke2JyYW5kfS5gO1xuICAgIC8vXG4gICAgLy9cbiAgICByZXR1cm4gQW1vdW50TWF0aC5tYWtlKGJyYW5kLCBhbGxlZ2VkVmFsdWUpO1xuICB9LFxuICAvKlxuXG5cblxuXG5cblxuICAgKi9cbiAgZ2V0VmFsdWU6IChicmFuZCwgYW1vdW50KSA9PiBBbW91bnRNYXRoLmNvZXJjZShicmFuZCwgYW1vdW50KS52YWx1ZSxcbiAgLypcblxuXG5cblxuXG5cblxuICAgKi9cbiAgbWFrZUVtcHR5OiAoYnJhbmQsIGFzc2V0S2luZCA9IC8qICAgICAgICAgICAgICAgICovICgnbmF0JykpID0+IHtcbiAgICBhc3NlcnRSZW1vdGFibGUoYnJhbmQsICdicmFuZCcpO1xuICAgIGFzc2VydEFzc2V0S2luZChhc3NldEtpbmQpO1xuICAgIGNvbnN0IHZhbHVlID0gaGVscGVyc1thc3NldEtpbmRdLmRvTWFrZUVtcHR5KCk7XG4gICAgLy9cbiAgICByZXR1cm4gaGFyZGVuKHsgYnJhbmQsIHZhbHVlIH0pO1xuICB9LFxuICAvKlxuXG5cblxuXG5cblxuICAgKi9cbiAgbWFrZUVtcHR5RnJvbUFtb3VudDogYW1vdW50ID0+IHtcbiAgICBhc3NlcnRSZWNvcmQoYW1vdW50LCAnYW1vdW50Jyk7XG4gICAgY29uc3QgeyBicmFuZCwgdmFsdWUgfSA9IGFtb3VudDtcbiAgICBjb25zdCBhc3NldEtpbmQgPSBhc3NlcnRWYWx1ZUdldEFzc2V0S2luZCh2YWx1ZSk7XG4gICAgLy9cbiAgICByZXR1cm4gQW1vdW50TWF0aC5tYWtlRW1wdHkoYnJhbmQsIGFzc2V0S2luZCk7XG4gIH0sXG4gIC8qXG5cblxuXG5cblxuICAgKi9cbiAgaXNFbXB0eTogKGFtb3VudCwgYnJhbmQgPSB1bmRlZmluZWQpID0+IHtcbiAgICBhc3NlcnRSZWNvcmQoYW1vdW50LCAnYW1vdW50Jyk7XG4gICAgY29uc3QgeyBicmFuZDogYWxsZWdlZEJyYW5kLCB2YWx1ZSB9ID0gYW1vdW50O1xuICAgIGFzc2VydFJlbW90YWJsZShhbGxlZ2VkQnJhbmQsICdicmFuZCcpO1xuICAgIG9wdGlvbmFsQnJhbmRDaGVjayhhbGxlZ2VkQnJhbmQsIGJyYW5kKTtcbiAgICBjb25zdCBoID0gYXNzZXJ0VmFsdWVHZXRIZWxwZXJzKHZhbHVlKTtcbiAgICByZXR1cm4gaC5kb0lzRW1wdHkoaC5kb0NvZXJjZSh2YWx1ZSkpO1xuICB9LFxuICBpc0dURSxcbiAgLypcblxuXG5cblxuXG5cblxuXG4gICAqL1xuICBpc0VxdWFsOiAobGVmdEFtb3VudCwgcmlnaHRBbW91bnQsIGJyYW5kID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgY29uc3QgaCA9IGNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50LCBicmFuZCk7XG4gICAgcmV0dXJuIGguZG9Jc0VxdWFsKC4uLmNvZXJjZUxSKGgsIGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50KSk7XG4gIH0sXG4gIC8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgYWRkOiAobGVmdEFtb3VudCwgcmlnaHRBbW91bnQsIGJyYW5kID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgY29uc3QgaCA9IGNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50LCBicmFuZCk7XG4gICAgY29uc3QgdmFsdWUgPSBoLmRvQWRkKC4uLmNvZXJjZUxSKGgsIGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50KSk7XG4gICAgLy9cbiAgICByZXR1cm4gaGFyZGVuKHsgYnJhbmQ6IGxlZnRBbW91bnQuYnJhbmQsIHZhbHVlIH0pO1xuICB9LFxuICAvKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgc3VidHJhY3Q6IChsZWZ0QW1vdW50LCByaWdodEFtb3VudCwgYnJhbmQgPSB1bmRlZmluZWQpID0+IHtcbiAgICBjb25zdCBoID0gY2hlY2tMUkFuZEdldEhlbHBlcnMobGVmdEFtb3VudCwgcmlnaHRBbW91bnQsIGJyYW5kKTtcbiAgICBjb25zdCB2YWx1ZSA9IGguZG9TdWJ0cmFjdCguLi5jb2VyY2VMUihoLCBsZWZ0QW1vdW50LCByaWdodEFtb3VudCkpO1xuICAgIC8vXG4gICAgcmV0dXJuIGhhcmRlbih7IGJyYW5kOiBsZWZ0QW1vdW50LmJyYW5kLCB2YWx1ZSB9KTtcbiAgfSxcbiAgLypcblxuXG5cblxuXG5cblxuICAgKi9cbiAgbWluOiAoeCwgeSwgYnJhbmQgPSB1bmRlZmluZWQpID0+XG4gICAgLy9cbiAgICBpc0dURSh4LCB5LCBicmFuZClcbiAgICAgID8geVxuICAgICAgOiBpc0dURSh5LCB4LCBicmFuZClcbiAgICAgICAgPyB4XG4gICAgICAgIDogRmFpbGAke3h9IGFuZCAke3l9IGFyZSBpbmNvbXBhcmFibGVgLFxuICAvKlxuXG5cblxuXG5cblxuXG4gICAqL1xuICBtYXg6ICh4LCB5LCBicmFuZCA9IHVuZGVmaW5lZCkgPT5cbiAgICAvL1xuICAgIGlzR1RFKHgsIHksIGJyYW5kKVxuICAgICAgPyB4XG4gICAgICA6IGlzR1RFKHksIHgpXG4gICAgICAgID8geVxuICAgICAgICA6IEZhaWxgJHt4fSBhbmQgJHt5fSBhcmUgaW5jb21wYXJhYmxlYCxcbn07JGjNj19vbmNlLkFtb3VudE1hdGgoQW1vdW50TWF0aCk7XG5oYXJkZW4oQW1vdW50TWF0aCk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgZ2V0QXNzZXRLaW5kID0gYW1vdW50ID0+IHtcbiAgYXNzZXJ0UmVjb3JkKGFtb3VudCwgJ2Ftb3VudCcpO1xuICBjb25zdCB7IHZhbHVlIH0gPSBhbW91bnQ7XG4gIHJldHVybiBhc3NlcnRWYWx1ZUdldEFzc2V0S2luZCh2YWx1ZSk7XG59OyRozY9fb25jZS5nZXRBc3NldEtpbmQoZ2V0QXNzZXRLaW5kKTtcbmhhcmRlbihnZXRBc3NldEtpbmQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQXNzZXRLaW5kIjpbIkFzc2V0S2luZCJdLCJhc3NlcnRBc3NldEtpbmQiOlsiYXNzZXJ0QXNzZXRLaW5kIl0sImFzc2VydFZhbHVlR2V0SGVscGVycyI6WyJhc3NlcnRWYWx1ZUdldEhlbHBlcnMiXSwiQW1vdW50TWF0aCI6WyJBbW91bnRNYXRoIl0sImdldEFzc2V0S2luZCI6WyJnZXRBc3NldEtpbmQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAExpaUjEEAAAxBAAALQAAAEBhZ29yaWMvZXJ0cC12MC4xNi4zLXUyMS4wL3NyYy9hbW91bnRTdG9yZS5qc3siaW1wb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiXSwiZXhwb3J0cyI6WyJtYWtlQW1vdW50U3RvcmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBBbW91bnRNYXRoOyRozY9faW1wb3J0cyhbW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBbW91bnRNYXRoXCIsWyRozY9fYSA9PiAoQW1vdW50TWF0aCA9ICRozY9fYSldXV1dXSk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZUFtb3VudFN0b3JlID0gKHN0YXRlLCBrZXkpID0+IHtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgZ2V0QW1vdW50OiAoKSA9PiBzdGF0ZVtrZXldLFxuICAgIGluY3JlbWVudDogZGVsdGEgPT4ge1xuICAgICAgc3RhdGVba2V5XSA9IEFtb3VudE1hdGguYWRkKHN0YXRlW2tleV0sIGRlbHRhKTtcbiAgICB9LFxuICAgIGRlY3JlbWVudDogZGVsdGEgPT4ge1xuICAgICAgaWYgKEFtb3VudE1hdGguaXNHVEUoc3RhdGVba2V5XSwgZGVsdGEpKSB7XG4gICAgICAgIHN0YXRlW2tleV0gPSBBbW91bnRNYXRoLnN1YnRyYWN0KHN0YXRlW2tleV0sIGRlbHRhKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlQW1vdW50U3RvcmUobWFrZUFtb3VudFN0b3JlKTtcbmhhcmRlbihtYWtlQW1vdW50U3RvcmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUFtb3VudFN0b3JlIjpbIm1ha2VBbW91bnRTdG9yZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC4O4ykBwYAAAcGAAAtAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjMtdTIxLjAvc3JjL2Rpc3BsYXlJbmZvLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBhZ29yaWMvc3RvcmUiLCIuL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6WyJjb2VyY2VEaXNwbGF5SW5mbyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsbXVzdE1hdGNoLERpc3BsYXlJbmZvU2hhcGU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJEaXNwbGF5SW5mb1NoYXBlXCIsWyRozY9fYSA9PiAoRGlzcGxheUluZm9TaGFwZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuICovXG4gICAgICAgY29uc3QgY29lcmNlRGlzcGxheUluZm8gPSAoYWxsZWdlZERpc3BsYXlJbmZvLCBhc3NldEtpbmQpID0+IHtcbiAgbXVzdE1hdGNoKGFsbGVnZWREaXNwbGF5SW5mbywgRGlzcGxheUluZm9TaGFwZSwgJ2Rpc3BsYXlJbmZvJyk7XG5cbiAgaWYgKGFsbGVnZWREaXNwbGF5SW5mby5hc3NldEtpbmQgIT09IHVuZGVmaW5lZCkge1xuICAgIGFsbGVnZWREaXNwbGF5SW5mby5hc3NldEtpbmQgPT09IGFzc2V0S2luZCB8fFxuICAgICAgRmFpbGBkaXNwbGF5SW5mby5hc3NldEtpbmQgd2FzIHByZXNlbnQgKCR7YWxsZWdlZERpc3BsYXlJbmZvLmFzc2V0S2luZH0pIGFuZCBkaWQgbm90IG1hdGNoIHRoZSBhc3NldEtpbmQgYXJndW1lbnQgKCR7YXNzZXRLaW5kfSlgO1xuICB9XG4gIGNvbnN0IGRpc3BsYXlJbmZvID0gaGFyZGVuKHsgLi4uYWxsZWdlZERpc3BsYXlJbmZvLCBhc3NldEtpbmQgfSk7XG5cbiAgaWYgKGRpc3BsYXlJbmZvLmRlY2ltYWxQbGFjZXMgIT09IHVuZGVmaW5lZCkge1xuICAgIE51bWJlci5pc1NhZmVJbnRlZ2VyKGRpc3BsYXlJbmZvLmRlY2ltYWxQbGFjZXMpIHx8XG4gICAgICBGYWlsYGRlY2ltYWxQbGFjZXMgJHtkaXNwbGF5SW5mby5kZWNpbWFsUGxhY2VzfSBpcyBub3QgYSBzYWZlIGludGVnZXJgO1xuICB9XG5cbiAgcmV0dXJuIGRpc3BsYXlJbmZvO1xufTskaM2PX29uY2UuY29lcmNlRGlzcGxheUluZm8oY29lcmNlRGlzcGxheUluZm8pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY29lcmNlRGlzcGxheUluZm8iOlsiY29lcmNlRGlzcGxheUluZm8iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA819NA00CAABNAgAAJwAAAEBhZ29yaWMvZXJ0cC12MC4xNi4zLXUyMS4wL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL2lzc3VlcktpdC5qcyIsIi4vdHlwZUd1YXJkcy5qcyIsIi4vdHlwZXMtaW5kZXguanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL2lzc3VlcktpdC5qcyIsIi4vdHlwZUd1YXJkcy5qcyIsIi4vdHlwZXMtaW5kZXguanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtdXSxbXCIuL2lzc3VlcktpdC5qc1wiLCBbXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtdXSxbXCIuL3R5cGVzLWluZGV4LmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJ1k6WEdGAAAHRgAACsAAABAYWdvcmljL2VydHAtdjAuMTYuMy11MjEuMC9zcmMvaXNzdWVyS2l0LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGFnb3JpYy96b25lL2R1cmFibGUuanMiLCIuL2Ftb3VudE1hdGguanMiLCIuL2Rpc3BsYXlJbmZvLmpzIiwiLi9wYXltZW50TGVkZ2VyLmpzIl0sImV4cG9ydHMiOlsiaGFzSXNzdWVyIiwibWFrZUR1cmFibGVJc3N1ZXJLaXQiLCJtYWtlSXNzdWVyS2l0IiwicHJlcGFyZUlzc3VlcktpdCIsInVwZ3JhZGVJc3N1ZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnQsRmFpbCxhc3NlcnRQYXR0ZXJuLG1ha2VTY2FsYXJCaWdNYXBTdG9yZSxtYWtlRHVyYWJsZVpvbmUsQXNzZXRLaW5kLGFzc2VydEFzc2V0S2luZCxjb2VyY2VEaXNwbGF5SW5mbyxwcmVwYXJlUGF5bWVudExlZGdlcjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiYXNzZXJ0XCIsWyRozY9fYSA9PiAoYXNzZXJ0ID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiYXNzZXJ0UGF0dGVyblwiLFskaM2PX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJtYWtlU2NhbGFyQmlnTWFwU3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyQmlnTWFwU3RvcmUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3pvbmUvZHVyYWJsZS5qc1wiLCBbW1wibWFrZUR1cmFibGVab25lXCIsWyRozY9fYSA9PiAobWFrZUR1cmFibGVab25lID0gJGjNj19hKV1dXV0sW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBc3NldEtpbmRcIixbJGjNj19hID0+IChBc3NldEtpbmQgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0QXNzZXRLaW5kXCIsWyRozY9fYSA9PiAoYXNzZXJ0QXNzZXRLaW5kID0gJGjNj19hKV1dXV0sW1wiLi9kaXNwbGF5SW5mby5qc1wiLCBbW1wiY29lcmNlRGlzcGxheUluZm9cIixbJGjNj19hID0+IChjb2VyY2VEaXNwbGF5SW5mbyA9ICRozY9fYSldXV1dLFtcIi4vcGF5bWVudExlZGdlci5qc1wiLCBbW1wicHJlcGFyZVBheW1lbnRMZWRnZXJcIixbJGjNj19hID0+IChwcmVwYXJlUGF5bWVudExlZGdlciA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBzZXR1cElzc3VlcktpdCA9IChcbiAgeyBuYW1lLCBhc3NldEtpbmQsIGRpc3BsYXlJbmZvLCBlbGVtZW50U2hhcGUgfSxcbiAgaXNzdWVyWm9uZSxcbiAgcmVjb3ZlcnlTZXRzU3RhdGUsXG4gIG9wdFNodXRkb3duV2l0aEZhaWx1cmUgPSB1bmRlZmluZWQsXG4pID0+IHtcbiAgYXNzZXJ0LnR5cGVvZihuYW1lLCAnc3RyaW5nJyk7XG4gIGFzc2VydEFzc2V0S2luZChhc3NldEtpbmQpO1xuXG4gIC8vXG4gIGNvbnN0IGNsZWFuRGlzcGxheUluZm8gPSBjb2VyY2VEaXNwbGF5SW5mbyhkaXNwbGF5SW5mbywgYXNzZXRLaW5kKTtcbiAgaWYgKG9wdFNodXRkb3duV2l0aEZhaWx1cmUgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydC50eXBlb2Yob3B0U2h1dGRvd25XaXRoRmFpbHVyZSwgJ2Z1bmN0aW9uJyk7XG4gIH1cblxuICBpZiAoZWxlbWVudFNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnRQYXR0ZXJuKGVsZW1lbnRTaGFwZSk7XG4gIH1cblxuICAvL1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIC8vXG4gIGNvbnN0IHsgaXNzdWVyLCBtaW50LCBicmFuZCwgbWludFJlY292ZXJ5UHVyc2UgfSA9IHByZXBhcmVQYXltZW50TGVkZ2VyKFxuICAgIGlzc3VlclpvbmUsXG4gICAgbmFtZSxcbiAgICBhc3NldEtpbmQsXG4gICAgY2xlYW5EaXNwbGF5SW5mbyxcbiAgICBlbGVtZW50U2hhcGUsXG4gICAgcmVjb3ZlcnlTZXRzU3RhdGUsXG4gICAgb3B0U2h1dGRvd25XaXRoRmFpbHVyZSxcbiAgKTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBicmFuZCxcbiAgICBpc3N1ZXIsXG4gICAgbWludCxcbiAgICBtaW50UmVjb3ZlcnlQdXJzZSxcbiAgICBkaXNwbGF5SW5mbzogY2xlYW5EaXNwbGF5SW5mbyxcbiAgfSk7XG59O1xuaGFyZGVuKHNldHVwSXNzdWVyS2l0KTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgSU5TVEFOQ0VfS0VZID0gJ2lzc3Vlcic7XG4vKlxuXG5cblxuICovXG5jb25zdCBSRUNPVkVSWV9TRVRTX1NUQVRFID0gJ3JlY292ZXJ5U2V0c1N0YXRlJztcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHVwZ3JhZGVJc3N1ZXJLaXQgPSAoXG4gIGlzc3VlckJhZ2dhZ2UsXG4gIG9wdFNodXRkb3duV2l0aEZhaWx1cmUgPSB1bmRlZmluZWQsXG4gIHJlY292ZXJ5U2V0c09wdGlvbiA9IHVuZGVmaW5lZCxcbikgPT4ge1xuICBjb25zdCBpc3N1ZXJSZWNvcmQgPSBpc3N1ZXJCYWdnYWdlLmdldChJTlNUQU5DRV9LRVkpO1xuICBjb25zdCBpc3N1ZXJab25lID0gbWFrZUR1cmFibGVab25lKGlzc3VlckJhZ2dhZ2UpO1xuICBjb25zdCBvbGRSZWNvdmVyeVNldHNTdGF0ZSA9IGlzc3VlckJhZ2dhZ2UuaGFzKFJFQ09WRVJZX1NFVFNfU1RBVEUpXG4gICAgPyBpc3N1ZXJCYWdnYWdlLmdldChSRUNPVkVSWV9TRVRTX1NUQVRFKVxuICAgIDogJ2hhc1JlY292ZXJ5U2V0cyc7XG4gIGlmIChcbiAgICBvbGRSZWNvdmVyeVNldHNTdGF0ZSA9PT0gJ25vUmVjb3ZlcnlTZXRzJyAmJlxuICAgIHJlY292ZXJ5U2V0c09wdGlvbiA9PT0gJ2hhc1JlY292ZXJ5U2V0cydcbiAgKSB7XG4gICAgRmFpbGBDYW5ub3QgKHlldD8pIHVwZ3JhZGUgZnJvbSAnbm9SZWNvdmVyeVNldHMnIHRvICdoYXNSZWNvdmVyeVNldHMnYDtcbiAgfVxuICAvL1xuICAvL1xuICAvL1xuICBjb25zdCByZWNvdmVyeVNldHNTdGF0ZSA9IHJlY292ZXJ5U2V0c09wdGlvbiB8fCBvbGRSZWNvdmVyeVNldHNTdGF0ZTtcbiAgcmV0dXJuIHNldHVwSXNzdWVyS2l0KFxuICAgIGlzc3VlclJlY29yZCxcbiAgICBpc3N1ZXJab25lLFxuICAgIHJlY292ZXJ5U2V0c1N0YXRlLFxuICAgIG9wdFNodXRkb3duV2l0aEZhaWx1cmUsXG4gICk7XG59OyRozY9fb25jZS51cGdyYWRlSXNzdWVyS2l0KHVwZ3JhZGVJc3N1ZXJLaXQpO1xuaGFyZGVuKHVwZ3JhZGVJc3N1ZXJLaXQpO1xuXG4vKlxuXG5cblxuICovXG4gICAgICAgY29uc3QgaGFzSXNzdWVyID0gYmFnZ2FnZSA9PiBiYWdnYWdlLmhhcyhJTlNUQU5DRV9LRVkpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuaGFzSXNzdWVyKGhhc0lzc3Vlcik7XG4gICAgICAgY29uc3QgbWFrZUR1cmFibGVJc3N1ZXJLaXQgPSAoXG4gIGlzc3VlckJhZ2dhZ2UsXG4gIG5hbWUsXG4gIC8vXG4gIGFzc2V0S2luZCA9IEFzc2V0S2luZC5OQVQsXG4gIGRpc3BsYXlJbmZvID0gaGFyZGVuKHt9KSxcbiAgb3B0U2h1dGRvd25XaXRoRmFpbHVyZSA9IHVuZGVmaW5lZCxcbiAgeyBlbGVtZW50U2hhcGUgPSB1bmRlZmluZWQsIHJlY292ZXJ5U2V0c09wdGlvbiA9IHVuZGVmaW5lZCB9ID0ge30sXG4pID0+IHtcbiAgY29uc3QgaXNzdWVyRGF0YSA9IGhhcmRlbih7XG4gICAgbmFtZSxcbiAgICBhc3NldEtpbmQsXG4gICAgZGlzcGxheUluZm8sXG4gICAgZWxlbWVudFNoYXBlLFxuICB9KTtcbiAgaXNzdWVyQmFnZ2FnZS5pbml0KElOU1RBTkNFX0tFWSwgaXNzdWVyRGF0YSk7XG4gIGNvbnN0IGlzc3VlclpvbmUgPSBtYWtlRHVyYWJsZVpvbmUoaXNzdWVyQmFnZ2FnZSk7XG4gIGNvbnN0IHJlY292ZXJ5U2V0c1N0YXRlID0gcmVjb3ZlcnlTZXRzT3B0aW9uIHx8ICdoYXNSZWNvdmVyeVNldHMnO1xuICBpc3N1ZXJCYWdnYWdlLmluaXQoUkVDT1ZFUllfU0VUU19TVEFURSwgcmVjb3ZlcnlTZXRzU3RhdGUpO1xuICByZXR1cm4gc2V0dXBJc3N1ZXJLaXQoXG4gICAgaXNzdWVyRGF0YSxcbiAgICBpc3N1ZXJab25lLFxuICAgIHJlY292ZXJ5U2V0c1N0YXRlLFxuICAgIG9wdFNodXRkb3duV2l0aEZhaWx1cmUsXG4gICk7XG59OyRozY9fb25jZS5tYWtlRHVyYWJsZUlzc3VlcktpdChtYWtlRHVyYWJsZUlzc3VlcktpdCk7XG5oYXJkZW4obWFrZUR1cmFibGVJc3N1ZXJLaXQpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBwcmVwYXJlSXNzdWVyS2l0ID0gKFxuICBpc3N1ZXJCYWdnYWdlLFxuICBuYW1lLFxuICAvL1xuICBhc3NldEtpbmQgPSBBc3NldEtpbmQuTkFULFxuICBkaXNwbGF5SW5mbyA9IGhhcmRlbih7fSksXG4gIG9wdFNodXRkb3duV2l0aEZhaWx1cmUgPSB1bmRlZmluZWQsXG4gIC8vXG4gIG9wdGlvbnMgPSB7fSxcbikgPT4ge1xuICBpZiAoaGFzSXNzdWVyKGlzc3VlckJhZ2dhZ2UpKSB7XG4gICAgY29uc3QgeyBlbGVtZW50U2hhcGU6IF8gPSB1bmRlZmluZWQsIHJlY292ZXJ5U2V0c09wdGlvbiA9IHVuZGVmaW5lZCB9ID1cbiAgICAgIG9wdGlvbnM7XG4gICAgY29uc3QgaXNzdWVyS2l0ID0gdXBncmFkZUlzc3VlcktpdChcbiAgICAgIGlzc3VlckJhZ2dhZ2UsXG4gICAgICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlLFxuICAgICAgcmVjb3ZlcnlTZXRzT3B0aW9uLFxuICAgICk7XG5cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG5cbiAgICAvL1xuICAgIHJldHVybiBpc3N1ZXJLaXQ7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgaXNzdWVyS2l0ID0gbWFrZUR1cmFibGVJc3N1ZXJLaXQoXG4gICAgICBpc3N1ZXJCYWdnYWdlLFxuICAgICAgbmFtZSxcbiAgICAgIGFzc2V0S2luZCxcbiAgICAgIGRpc3BsYXlJbmZvLFxuICAgICAgb3B0U2h1dGRvd25XaXRoRmFpbHVyZSxcbiAgICAgIG9wdGlvbnMsXG4gICAgKTtcbiAgICAvL1xuICAgIHJldHVybiBpc3N1ZXJLaXQ7XG4gIH1cbn07JGjNj19vbmNlLnByZXBhcmVJc3N1ZXJLaXQocHJlcGFyZUlzc3VlcktpdCk7XG5oYXJkZW4ocHJlcGFyZUlzc3VlcktpdCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZUlzc3VlcktpdCA9IChcbiAgbmFtZSxcbiAgLy9cbiAgYXNzZXRLaW5kID0gQXNzZXRLaW5kLk5BVCxcbiAgZGlzcGxheUluZm8gPSBoYXJkZW4oe30pLFxuICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlID0gdW5kZWZpbmVkLFxuICAvL1xuICB7IGVsZW1lbnRTaGFwZSA9IHVuZGVmaW5lZCwgcmVjb3ZlcnlTZXRzT3B0aW9uID0gdW5kZWZpbmVkIH0gPSB7fSxcbikgPT5cbiAgLy9cbiAgbWFrZUR1cmFibGVJc3N1ZXJLaXQoXG4gICAgbWFrZVNjYWxhckJpZ01hcFN0b3JlKCdkcm9wcGVkIGlzc3VlciBraXQnLCB7IGR1cmFibGU6IHRydWUgfSksXG4gICAgbmFtZSxcbiAgICBhc3NldEtpbmQsXG4gICAgZGlzcGxheUluZm8sXG4gICAgb3B0U2h1dGRvd25XaXRoRmFpbHVyZSxcbiAgICB7IGVsZW1lbnRTaGFwZSwgcmVjb3ZlcnlTZXRzT3B0aW9uIH0sXG4gICk7JGjNj19vbmNlLm1ha2VJc3N1ZXJLaXQobWFrZUlzc3VlcktpdCk7XG5oYXJkZW4obWFrZUlzc3VlcktpdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ1cGdyYWRlSXNzdWVyS2l0IjpbInVwZ3JhZGVJc3N1ZXJLaXQiXSwiaGFzSXNzdWVyIjpbImhhc0lzc3VlciJdLCJtYWtlRHVyYWJsZUlzc3VlcktpdCI6WyJtYWtlRHVyYWJsZUlzc3VlcktpdCJdLCJwcmVwYXJlSXNzdWVyS2l0IjpbInByZXBhcmVJc3N1ZXJLaXQiXSwibWFrZUlzc3VlcktpdCI6WyJtYWtlSXNzdWVyS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADTpUBQSBgAAEgYAAEAAAABAYWdvcmljL2VydHAtdjAuMTYuMy11MjEuMC9zcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJjb3B5QmFnTWF0aEhlbHBlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBrZXlFUSxtYWtlQ29weUJhZyxtdXN0TWF0Y2gsTSxnZXRDb3B5QmFnRW50cmllcyxiYWdJc1N1cGVyYmFnLGJhZ1VuaW9uLGJhZ0Rpc2pvaW50U3VidHJhY3Q7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJrZXlFUVwiLFskaM2PX2EgPT4gKGtleUVRID0gJGjNj19hKV1dLFtcIm1ha2VDb3B5QmFnXCIsWyRozY9fYSA9PiAobWFrZUNvcHlCYWcgPSAkaM2PX2EpXV0sW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcImdldENvcHlCYWdFbnRyaWVzXCIsWyRozY9fYSA9PiAoZ2V0Q29weUJhZ0VudHJpZXMgPSAkaM2PX2EpXV0sW1wiYmFnSXNTdXBlcmJhZ1wiLFskaM2PX2EgPT4gKGJhZ0lzU3VwZXJiYWcgPSAkaM2PX2EpXV0sW1wiYmFnVW5pb25cIixbJGjNj19hID0+IChiYWdVbmlvbiA9ICRozY9fYSldXSxbXCJiYWdEaXNqb2ludFN1YnRyYWN0XCIsWyRozY9fYSA9PiAoYmFnRGlzam9pbnRTdWJ0cmFjdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgZW1wdHkgPSBtYWtlQ29weUJhZyhbXSk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgIGNvbnN0IGNvcHlCYWdNYXRoSGVscGVycyA9IGhhcmRlbih7XG4gIGRvQ29lcmNlOiBiYWcgPT4ge1xuICAgIG11c3RNYXRjaChiYWcsIE0uYmFnKCksICdiYWcgb2YgYW1vdW50Jyk7XG4gICAgcmV0dXJuIGJhZztcbiAgfSxcbiAgZG9NYWtlRW1wdHk6ICgpID0+IGVtcHR5LFxuICBkb0lzRW1wdHk6IGJhZyA9PiBnZXRDb3B5QmFnRW50cmllcyhiYWcpLmxlbmd0aCA9PT0gMCxcbiAgZG9Jc0dURTogYmFnSXNTdXBlcmJhZyxcbiAgZG9Jc0VxdWFsOiBrZXlFUSxcbiAgZG9BZGQ6IGJhZ1VuaW9uLFxuICBkb1N1YnRyYWN0OiBiYWdEaXNqb2ludFN1YnRyYWN0LFxufSk7JGjNj19vbmNlLmNvcHlCYWdNYXRoSGVscGVycyhjb3B5QmFnTWF0aEhlbHBlcnMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY29weUJhZ01hdGhIZWxwZXJzIjpbImNvcHlCYWdNYXRoSGVscGVycyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAChmPGE0AUAANAFAABAAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjMtdTIxLjAvc3JjL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiY29weVNldE1hdGhIZWxwZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQga2V5RVEsbWFrZUNvcHlTZXQsbXVzdE1hdGNoLE0sZ2V0Q29weVNldEtleXMsc2V0SXNTdXBlcnNldCxzZXREaXNqb2ludFVuaW9uLHNldERpc2pvaW50U3VidHJhY3Q7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJrZXlFUVwiLFskaM2PX2EgPT4gKGtleUVRID0gJGjNj19hKV1dLFtcIm1ha2VDb3B5U2V0XCIsWyRozY9fYSA9PiAobWFrZUNvcHlTZXQgPSAkaM2PX2EpXV0sW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcImdldENvcHlTZXRLZXlzXCIsWyRozY9fYSA9PiAoZ2V0Q29weVNldEtleXMgPSAkaM2PX2EpXV0sW1wic2V0SXNTdXBlcnNldFwiLFskaM2PX2EgPT4gKHNldElzU3VwZXJzZXQgPSAkaM2PX2EpXV0sW1wic2V0RGlzam9pbnRVbmlvblwiLFskaM2PX2EgPT4gKHNldERpc2pvaW50VW5pb24gPSAkaM2PX2EpXV0sW1wic2V0RGlzam9pbnRTdWJ0cmFjdFwiLFskaM2PX2EgPT4gKHNldERpc2pvaW50U3VidHJhY3QgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLypcblxuXG4gKi9cblxuLyogICAgICAgICAgICAgICAgICAqL1xuY29uc3QgZW1wdHkgPSBtYWtlQ29weVNldChbXSk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgY29weVNldE1hdGhIZWxwZXJzID0gaGFyZGVuKHtcbiAgZG9Db2VyY2U6IHNldCA9PiB7XG4gICAgbXVzdE1hdGNoKHNldCwgTS5zZXQoKSwgJ3NldCBvZiBhbW91bnQnKTtcbiAgICByZXR1cm4gc2V0O1xuICB9LFxuICBkb01ha2VFbXB0eTogKCkgPT4gZW1wdHksXG4gIGRvSXNFbXB0eTogc2V0ID0+IGdldENvcHlTZXRLZXlzKHNldCkubGVuZ3RoID09PSAwLFxuICBkb0lzR1RFOiBzZXRJc1N1cGVyc2V0LFxuICBkb0lzRXF1YWw6IGtleUVRLFxuICBkb0FkZDogc2V0RGlzam9pbnRVbmlvbixcbiAgZG9TdWJ0cmFjdDogc2V0RGlzam9pbnRTdWJ0cmFjdCxcbn0pOyRozY9fb25jZS5jb3B5U2V0TWF0aEhlbHBlcnMoY29weVNldE1hdGhIZWxwZXJzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNvcHlTZXRNYXRoSGVscGVycyI6WyJjb3B5U2V0TWF0aEhlbHBlcnMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA82r1OrsEAAC7BAAAPAAAAEBhZ29yaWMvZXJ0cC12MC4xNi4zLXUyMS4wL3NyYy9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9uYXQiXSwiZXhwb3J0cyI6WyJuYXRNYXRoSGVscGVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsTmF0LGlzTmF0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsWyRozY9fYSA9PiAoTmF0ID0gJGjNj19hKV1dLFtcImlzTmF0XCIsWyRozY9fYSA9PiAoaXNOYXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuY29uc3QgZW1wdHkgPSAwbjtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG5hdE1hdGhIZWxwZXJzID0gaGFyZGVuKHtcbiAgZG9Db2VyY2U6IG5hdCA9PiB7XG4gICAgLy9cbiAgICBhc3NlcnQudHlwZW9mKG5hdCwgJ2JpZ2ludCcpO1xuICAgIGlzTmF0KG5hdCkgfHwgRmFpbGB2YWx1ZSAke25hdH0gbXVzdCBiZSBhIG5hdHVyYWwgbnVtYmVyYDtcbiAgICByZXR1cm4gTmF0KG5hdCk7XG4gIH0sXG4gIGRvTWFrZUVtcHR5OiAoKSA9PiBlbXB0eSxcbiAgZG9Jc0VtcHR5OiBuYXQgPT4gbmF0ID09PSBlbXB0eSxcbiAgZG9Jc0dURTogKGxlZnQsIHJpZ2h0KSA9PiBsZWZ0ID49IHJpZ2h0LFxuICBkb0lzRXF1YWw6IChsZWZ0LCByaWdodCkgPT4gbGVmdCA9PT0gcmlnaHQsXG4gIC8vXG4gIGRvQWRkOiAobGVmdCwgcmlnaHQpID0+IGxlZnQgKyByaWdodCxcbiAgZG9TdWJ0cmFjdDogKGxlZnQsIHJpZ2h0KSA9PiBOYXQobGVmdCAtIHJpZ2h0KSxcbn0pOyRozY9fb25jZS5uYXRNYXRoSGVscGVycyhuYXRNYXRoSGVscGVycyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJuYXRNYXRoSGVscGVycyI6WyJuYXRNYXRoSGVscGVycyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACB+ofGmAYAAJgGAAA8AAAAQGFnb3JpYy9lcnRwLXYwLjE2LjMtdTIxLjAvc3JjL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsic2V0TWF0aEhlbHBlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBwYXNzU3R5bGVPZixhc3NlcnRLZXksZWxlbWVudHNJc1N1cGVyc2V0LGVsZW1lbnRzRGlzam9pbnRVbmlvbixlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QsY29lcmNlVG9FbGVtZW50cyxlbGVtZW50c0NvbXBhcmU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiYXNzZXJ0S2V5XCIsWyRozY9fYSA9PiAoYXNzZXJ0S2V5ID0gJGjNj19hKV1dLFtcImVsZW1lbnRzSXNTdXBlcnNldFwiLFskaM2PX2EgPT4gKGVsZW1lbnRzSXNTdXBlcnNldCA9ICRozY9fYSldXSxbXCJlbGVtZW50c0Rpc2pvaW50VW5pb25cIixbJGjNj19hID0+IChlbGVtZW50c0Rpc2pvaW50VW5pb24gPSAkaM2PX2EpXV0sW1wiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0XCIsWyRozY9fYSA9PiAoZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0ID0gJGjNj19hKV1dLFtcImNvZXJjZVRvRWxlbWVudHNcIixbJGjNj19hID0+IChjb2VyY2VUb0VsZW1lbnRzID0gJGjNj19hKV1dLFtcImVsZW1lbnRzQ29tcGFyZVwiLFskaM2PX2EgPT4gKGVsZW1lbnRzQ29tcGFyZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8vXG4vL1xuLyogICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGVtcHR5ID0gaGFyZGVuKFtdKTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBzZXRNYXRoSGVscGVycyA9IGhhcmRlbih7XG4gIGRvQ29lcmNlOiBsaXN0ID0+IHtcbiAgICBsaXN0ID0gY29lcmNlVG9FbGVtZW50cyhsaXN0KTtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGFzc2VydEtleShsaXN0KTtcbiAgICByZXR1cm4gbGlzdDtcbiAgfSxcbiAgZG9NYWtlRW1wdHk6ICgpID0+IGVtcHR5LFxuICBkb0lzRW1wdHk6IGxpc3QgPT4gcGFzc1N0eWxlT2YobGlzdCkgPT09ICdjb3B5QXJyYXknICYmIGxpc3QubGVuZ3RoID09PSAwLFxuICBkb0lzR1RFOiBlbGVtZW50c0lzU3VwZXJzZXQsXG4gIGRvSXNFcXVhbDogKHgsIHkpID0+IGVsZW1lbnRzQ29tcGFyZSh4LCB5KSA9PT0gMCxcbiAgZG9BZGQ6IGVsZW1lbnRzRGlzam9pbnRVbmlvbixcbiAgZG9TdWJ0cmFjdDogZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0LFxufSk7JGjNj19vbmNlLnNldE1hdGhIZWxwZXJzKHNldE1hdGhIZWxwZXJzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InNldE1hdGhIZWxwZXJzIjpbInNldE1hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJ57M0HJAwAAyQMAACkAAABAYWdvcmljL2VydHAtdjAuMTYuMy11MjEuMC9zcmMvcGF5bWVudC5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsicHJlcGFyZVBheW1lbnRLaW5kIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgaW5pdEVtcHR5OyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiaW5pdEVtcHR5XCIsWyRozY9fYSA9PiAoaW5pdEVtcHR5ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vL1xuLypcblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVQYXltZW50S2luZCA9IChpc3N1ZXJab25lLCBuYW1lLCBicmFuZCwgUGF5bWVudEkpID0+IHtcbiAgY29uc3QgbWFrZVBheW1lbnQgPSBpc3N1ZXJab25lLmV4b0NsYXNzKFxuICAgIGAke25hbWV9IHBheW1lbnRgLFxuICAgIFBheW1lbnRJLFxuICAgIGluaXRFbXB0eSxcbiAgICB7XG4gICAgICBnZXRBbGxlZ2VkQnJhbmQoKSB7XG4gICAgICAgIHJldHVybiBicmFuZDtcbiAgICAgIH0sXG4gICAgfSxcbiAgKTtcbiAgLy9cbiAgcmV0dXJuIG1ha2VQYXltZW50O1xufTskaM2PX29uY2UucHJlcGFyZVBheW1lbnRLaW5kKHByZXBhcmVQYXltZW50S2luZCk7XG5oYXJkZW4ocHJlcGFyZVBheW1lbnRLaW5kKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InByZXBhcmVQYXltZW50S2luZCI6WyJwcmVwYXJlUGF5bWVudEtpbmQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAslt9GjAlAAAwJQAALwAAAEBhZ29yaWMvZXJ0cC12MC4xNi4zLXUyMS4wL3NyYy9wYXltZW50TGVkZ2VyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL3Byb21pc2Uta2l0IiwiQGVuZG8vcGF0dGVybnMiLCIuL2Ftb3VudE1hdGguanMiLCIuL3BheW1lbnQuanMiLCIuL3B1cnNlLmpzIiwiLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsicHJlcGFyZVBheW1lbnRMZWRnZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBxLEZhaWwsYW5ub3RhdGVFcnJvcixYLGlzUHJvbWlzZSxtdXN0TWF0Y2gsTSxrZXlFUSxBbW91bnRNYXRoLHByZXBhcmVQYXltZW50S2luZCxwcmVwYXJlUHVyc2VLaW5kLEJyYW5kSSxtYWtlSXNzdWVySW50ZXJmYWNlczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wiYW5ub3RhdGVFcnJvclwiLFskaM2PX2EgPT4gKGFubm90YXRlRXJyb3IgPSAkaM2PX2EpXV0sW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsWyRozY9fYSA9PiAoaXNQcm9taXNlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXSxbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJrZXlFUVwiLFskaM2PX2EgPT4gKGtleUVRID0gJGjNj19hKV1dXV0sW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBbW91bnRNYXRoXCIsWyRozY9fYSA9PiAoQW1vdW50TWF0aCA9ICRozY9fYSldXV1dLFtcIi4vcGF5bWVudC5qc1wiLCBbW1wicHJlcGFyZVBheW1lbnRLaW5kXCIsWyRozY9fYSA9PiAocHJlcGFyZVBheW1lbnRLaW5kID0gJGjNj19hKV1dXV0sW1wiLi9wdXJzZS5qc1wiLCBbW1wicHJlcGFyZVB1cnNlS2luZFwiLFskaM2PX2EgPT4gKHByZXBhcmVQdXJzZUtpbmQgPSAkaM2PX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIkJyYW5kSVwiLFskaM2PX2EgPT4gKEJyYW5kSSA9ICRozY9fYSldXSxbXCJtYWtlSXNzdWVySW50ZXJmYWNlc1wiLFskaM2PX2EgPT4gKG1ha2VJc3N1ZXJJbnRlcmZhY2VzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBhbW91bnRTaGFwZUZyb21FbGVtZW50U2hhcGUgPSAoYnJhbmQsIGFzc2V0S2luZCwgZWxlbWVudFNoYXBlKSA9PiB7XG4gIGxldCB2YWx1ZVNoYXBlO1xuICBzd2l0Y2ggKGFzc2V0S2luZCkge1xuICAgIGNhc2UgJ25hdCc6IHtcbiAgICAgIHZhbHVlU2hhcGUgPSBNLm5hdCgpO1xuICAgICAgZWxlbWVudFNoYXBlID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgRmFpbGBGdW5naWJsZSBhc3NldHMgY2Fubm90IGhhdmUgYW4gZWxlbWVudFNoYXBlOiAke3EoZWxlbWVudFNoYXBlKX1gO1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGNhc2UgJ3NldCc6IHtcbiAgICAgIGlmIChlbGVtZW50U2hhcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YWx1ZVNoYXBlID0gTS5hcnJheU9mKE0ua2V5KCkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVTaGFwZSA9IE0uYXJyYXlPZihNLmFuZChNLmtleSgpLCBlbGVtZW50U2hhcGUpKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICdjb3B5U2V0Jzoge1xuICAgICAgaWYgKGVsZW1lbnRTaGFwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhbHVlU2hhcGUgPSBNLnNldCgpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVTaGFwZSA9IE0uc2V0T2YoZWxlbWVudFNoYXBlKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICdjb3B5QmFnJzoge1xuICAgICAgaWYgKGVsZW1lbnRTaGFwZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHZhbHVlU2hhcGUgPSBNLmJhZygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFsdWVTaGFwZSA9IE0uYmFnT2YoZWxlbWVudFNoYXBlKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICBGYWlsYHVuZXhwZWN0ZWQgYXNzZXQga2luZCAke3EoYXNzZXRLaW5kKX1gO1xuICAgIH1cbiAgfVxuXG4gIGNvbnN0IGFtb3VudFNoYXBlID0gaGFyZGVuKHtcbiAgICBicmFuZCwgLy9cbiAgICB2YWx1ZTogdmFsdWVTaGFwZSxcbiAgfSk7XG4gIHJldHVybiBhbW91bnRTaGFwZTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBwcmVwYXJlUGF5bWVudExlZGdlciA9IChcbiAgaXNzdWVyWm9uZSxcbiAgbmFtZSxcbiAgYXNzZXRLaW5kLFxuICBkaXNwbGF5SW5mbyxcbiAgZWxlbWVudFNoYXBlLFxuICByZWNvdmVyeVNldHNTdGF0ZSxcbiAgb3B0U2h1dGRvd25XaXRoRmFpbHVyZSA9IHVuZGVmaW5lZCxcbikgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAqL1xuICAvL1xuICBjb25zdCBicmFuZCA9IGlzc3VlclpvbmUuZXhvKGAke25hbWV9IGJyYW5kYCwgQnJhbmRJLCB7XG4gICAgaXNNeUlzc3VlcihhbGxlZ2VkSXNzdWVyKSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIGFsbGVnZWRJc3N1ZXIgPT09IGlzc3VlcjtcbiAgICB9LFxuICAgIGdldEFsbGVnZWROYW1lKCkge1xuICAgICAgcmV0dXJuIG5hbWU7XG4gICAgfSxcbiAgICAvL1xuICAgIGdldERpc3BsYXlJbmZvKCkge1xuICAgICAgcmV0dXJuIGRpc3BsYXlJbmZvO1xuICAgIH0sXG4gICAgZ2V0QW1vdW50U2hhcGUoKSB7XG4gICAgICByZXR1cm4gYW1vdW50U2hhcGU7XG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3QgYW1vdW50U2hhcGUgPSBhbW91bnRTaGFwZUZyb21FbGVtZW50U2hhcGUoXG4gICAgYnJhbmQsXG4gICAgYXNzZXRLaW5kLFxuICAgIGVsZW1lbnRTaGFwZSxcbiAgKTtcblxuICBjb25zdCB7IElzc3VlckksIE1pbnRJLCBQYXltZW50SSwgUHVyc2VJS2l0IH0gPSBtYWtlSXNzdWVySW50ZXJmYWNlcyhcbiAgICBicmFuZCxcbiAgICBhc3NldEtpbmQsXG4gICAgYW1vdW50U2hhcGUsXG4gICk7XG5cbiAgY29uc3QgbWFrZVBheW1lbnQgPSBwcmVwYXJlUGF5bWVudEtpbmQoaXNzdWVyWm9uZSwgbmFtZSwgYnJhbmQsIFBheW1lbnRJKTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmUgPSByZWFzb24gPT4ge1xuICAgIC8vXG4gICAgLy9cbiAgICBpZiAob3B0U2h1dGRvd25XaXRoRmFpbHVyZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICB0cnkge1xuICAgICAgICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlKHJlYXNvbik7XG4gICAgICB9IGNhdGNoIChlcnJJblNodXRkb3duKSB7XG4gICAgICAgIGFubm90YXRlRXJyb3IoZXJySW5TaHV0ZG93biwgWGBDYXVzZWQgYnk6ICR7cmVhc29ufWApO1xuICAgICAgICB0aHJvdyBlcnJJblNodXRkb3duO1xuICAgICAgfVxuICAgIH1cbiAgICB0aHJvdyByZWFzb247XG4gIH07XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgcGF5bWVudExlZGdlciA9IGlzc3VlclpvbmUud2Vha01hcFN0b3JlKCdwYXltZW50TGVkZ2VyJywge1xuICAgIHZhbHVlU2hhcGU6IGFtb3VudFNoYXBlLFxuICB9KTtcblxuICAvKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IHBheW1lbnRSZWNvdmVyeVNldHMgPSBpc3N1ZXJab25lLndlYWtNYXBTdG9yZSgncGF5bWVudFJlY292ZXJ5U2V0cycpO1xuXG4gIC8qXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBpbml0UGF5bWVudCA9IChwYXltZW50LCBhbW91bnQsIG9wdFJlY292ZXJ5U2V0ID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgaWYgKHJlY292ZXJ5U2V0c1N0YXRlID09PSAnbm9SZWNvdmVyeVNldHMnKSB7XG4gICAgICBvcHRSZWNvdmVyeVNldCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIEZhaWxgd2hlbiByZWNvdmVyU2V0c1N0YXRlID09PSAnbm9SZWNvdmVyeVNldHMnLCBvcHRSZWNvdmVyeVNldCBtdXN0IGJlIGVtcHR5YDtcbiAgICB9XG4gICAgaWYgKG9wdFJlY292ZXJ5U2V0ICE9PSB1bmRlZmluZWQgJiYgIUFtb3VudE1hdGguaXNFbXB0eShhbW91bnQpKSB7XG4gICAgICBvcHRSZWNvdmVyeVNldC5hZGQocGF5bWVudCk7XG4gICAgICBwYXltZW50UmVjb3ZlcnlTZXRzLmluaXQocGF5bWVudCwgb3B0UmVjb3ZlcnlTZXQpO1xuICAgIH1cbiAgICBwYXltZW50TGVkZ2VyLmluaXQocGF5bWVudCwgYW1vdW50KTtcbiAgfTtcblxuICAvKlxuXG5cblxuXG4gICAqL1xuICBjb25zdCBkZWxldGVQYXltZW50ID0gcGF5bWVudCA9PiB7XG4gICAgcGF5bWVudExlZGdlci5kZWxldGUocGF5bWVudCk7XG4gICAgaWYgKHBheW1lbnRSZWNvdmVyeVNldHMuaGFzKHBheW1lbnQpKSB7XG4gICAgICBjb25zdCByZWNvdmVyeVNldCA9IHBheW1lbnRSZWNvdmVyeVNldHMuZ2V0KHBheW1lbnQpO1xuICAgICAgcGF5bWVudFJlY292ZXJ5U2V0cy5kZWxldGUocGF5bWVudCk7XG4gICAgICByZWNvdmVyeVNldC5kZWxldGUocGF5bWVudCk7XG4gICAgfVxuICB9O1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBjb2VyY2UgPSBhbGxlZ2VkQW1vdW50ID0+IEFtb3VudE1hdGguY29lcmNlKGJyYW5kLCBhbGxlZ2VkQW1vdW50KTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4gIC8qXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBhc3NlcnRBbW91bnRDb25zaXN0ZW50ID0gKHBheW1lbnRCYWxhbmNlLCBvcHRBbW91bnRTaGFwZSkgPT4ge1xuICAgIGlmIChvcHRBbW91bnRTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtdXN0TWF0Y2gocGF5bWVudEJhbGFuY2UsIG9wdEFtb3VudFNoYXBlLCAnYW1vdW50Jyk7XG4gICAgfVxuICB9O1xuXG4gIC8qXG5cblxuICAgKi9cbiAgY29uc3QgYXNzZXJ0TGl2ZVBheW1lbnQgPSBwYXltZW50ID0+IHtcbiAgICBwYXltZW50TGVkZ2VyLmhhcyhwYXltZW50KSB8fFxuICAgICAgRmFpbGAke3BheW1lbnR9IHdhcyBub3QgYSBsaXZlIHBheW1lbnQgZm9yIGJyYW5kICR7cShcbiAgICAgICAgYnJhbmQsXG4gICAgICApfS4gSXQgY291bGQgYmUgYSB1c2VkLXVwIHBheW1lbnQsIGEgcGF5bWVudCBmb3IgYW5vdGhlciBicmFuZCwgb3IgaXQgbWlnaHQgbm90IGJlIGEgcGF5bWVudCBhdCBhbGwuYDtcbiAgfTtcblxuICAvKlxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgZGVwb3NpdEludGVybmFsID0gKFxuICAgIGJhbGFuY2VTdG9yZSxcbiAgICBzcmNQYXltZW50LFxuICAgIG9wdEFtb3VudFNoYXBlID0gdW5kZWZpbmVkLFxuICApID0+IHtcbiAgICAhaXNQcm9taXNlKHNyY1BheW1lbnQpIHx8XG4gICAgICBhc3NlcnQuZmFpbChcbiAgICAgICAgYGRlcG9zaXQgZG9lcyBub3QgYWNjZXB0IHByb21pc2VzIGFzIGZpcnN0IGFyZ3VtZW50LiBJbnN0ZWFkIG9mIHBhc3NpbmcgdGhlIHByb21pc2UgKGRlcG9zaXQocGF5bWVudFByb21pc2UpKSwgY29uc2lkZXIgdW53cmFwcGluZyB0aGUgcHJvbWlzZSBmaXJzdDogRS53aGVuKHBheW1lbnRQcm9taXNlLCAoYWN0dWFsUGF5bWVudCA9PiBkZXBvc2l0KGFjdHVhbFBheW1lbnQpKWAsXG4gICAgICAgIFR5cGVFcnJvcixcbiAgICAgICk7XG4gICAgYXNzZXJ0TGl2ZVBheW1lbnQoc3JjUGF5bWVudCk7XG4gICAgY29uc3Qgc3JjUGF5bWVudEJhbGFuY2UgPSBwYXltZW50TGVkZ2VyLmdldChzcmNQYXltZW50KTtcbiAgICBhc3NlcnRBbW91bnRDb25zaXN0ZW50KHNyY1BheW1lbnRCYWxhbmNlLCBvcHRBbW91bnRTaGFwZSk7XG4gICAgdHJ5IHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGRlbGV0ZVBheW1lbnQoc3JjUGF5bWVudCk7XG4gICAgICBiYWxhbmNlU3RvcmUuaW5jcmVtZW50KHNyY1BheW1lbnRCYWxhbmNlKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmUoZXJyKTtcbiAgICAgIHRocm93IGVycjtcbiAgICB9XG4gICAgcmV0dXJuIHNyY1BheW1lbnRCYWxhbmNlO1xuICB9O1xuXG4gIC8qXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCB3aXRoZHJhd0ludGVybmFsID0gKGJhbGFuY2VTdG9yZSwgYW1vdW50LCByZWNvdmVyeVNldCA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIGFtb3VudCA9IGNvZXJjZShhbW91bnQpO1xuICAgIGNvbnN0IHBheW1lbnQgPSBtYWtlUGF5bWVudCgpO1xuICAgIC8vXG4gICAgLy9cbiAgICBiYWxhbmNlU3RvcmUuZGVjcmVtZW50KGFtb3VudCkgfHxcbiAgICAgIEZhaWxgV2l0aGRyYXdhbCBvZiAke2Ftb3VudH0gZmFpbGVkIGJlY2F1c2UgdGhlIHB1cnNlIG9ubHkgY29udGFpbmVkICR7YmFsYW5jZVN0b3JlLmdldEFtb3VudCgpfWA7XG4gICAgdHJ5IHtcbiAgICAgIGluaXRQYXltZW50KHBheW1lbnQsIGFtb3VudCwgcmVjb3ZlcnlTZXQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZShlcnIpO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICByZXR1cm4gcGF5bWVudDtcbiAgfTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAvL1xuICBjb25zdCBtYWtlRW1wdHlQdXJzZSA9IHByZXBhcmVQdXJzZUtpbmQoXG4gICAgaXNzdWVyWm9uZSxcbiAgICBuYW1lLFxuICAgIGFzc2V0S2luZCxcbiAgICBicmFuZCxcbiAgICBQdXJzZUlLaXQsXG4gICAgaGFyZGVuKHtcbiAgICAgIGRlcG9zaXRJbnRlcm5hbCxcbiAgICAgIHdpdGhkcmF3SW50ZXJuYWwsXG4gICAgfSksXG4gICAgcmVjb3ZlcnlTZXRzU3RhdGUsXG4gICAgcGF5bWVudFJlY292ZXJ5U2V0cyxcbiAgKTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgKi9cbiAgLy9cbiAgY29uc3QgaXNzdWVyID0gaXNzdWVyWm9uZS5leG8oYCR7bmFtZX0gaXNzdWVyYCwgSXNzdWVySSwge1xuICAgIGdldEJyYW5kKCkge1xuICAgICAgcmV0dXJuIGJyYW5kO1xuICAgIH0sXG4gICAgZ2V0QWxsZWdlZE5hbWUoKSB7XG4gICAgICByZXR1cm4gbmFtZTtcbiAgICB9LFxuICAgIGdldEFzc2V0S2luZCgpIHtcbiAgICAgIHJldHVybiBhc3NldEtpbmQ7XG4gICAgfSxcbiAgICBnZXREaXNwbGF5SW5mbygpIHtcbiAgICAgIHJldHVybiBkaXNwbGF5SW5mbztcbiAgICB9LFxuICAgIG1ha2VFbXB0eVB1cnNlKCkge1xuICAgICAgcmV0dXJuIG1ha2VFbXB0eVB1cnNlKCk7XG4gICAgfSxcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBpc0xpdmUocGF5bWVudCkge1xuICAgICAgLy9cbiAgICAgIHJldHVybiBwYXltZW50TGVkZ2VyLmhhcyhwYXltZW50KTtcbiAgICB9LFxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGdldEFtb3VudE9mKHBheW1lbnQpIHtcbiAgICAgIC8vXG4gICAgICBhc3NlcnRMaXZlUGF5bWVudChwYXltZW50KTtcbiAgICAgIHJldHVybiBwYXltZW50TGVkZ2VyLmdldChwYXltZW50KTtcbiAgICB9LFxuICAgIC8qXG5cblxuICAgICAqL1xuICAgIGJ1cm4ocGF5bWVudCwgb3B0QW1vdW50U2hhcGUgPSB1bmRlZmluZWQpIHtcbiAgICAgIC8vXG4gICAgICBhc3NlcnRMaXZlUGF5bWVudChwYXltZW50KTtcbiAgICAgIGNvbnN0IHBheW1lbnRCYWxhbmNlID0gcGF5bWVudExlZGdlci5nZXQocGF5bWVudCk7XG4gICAgICBhc3NlcnRBbW91bnRDb25zaXN0ZW50KHBheW1lbnRCYWxhbmNlLCBvcHRBbW91bnRTaGFwZSk7XG4gICAgICB0cnkge1xuICAgICAgICAvL1xuICAgICAgICBkZWxldGVQYXltZW50KHBheW1lbnQpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmUoZXJyKTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBheW1lbnRCYWxhbmNlO1xuICAgIH0sXG4gIH0pO1xuXG4gIC8qXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgbWludFJlY292ZXJ5UHVyc2UgPSAvKiAgICAgICAgICAgICAgICAgICAqLyAoXG4gICAgaXNzdWVyWm9uZS5tYWtlT25jZSgnbWludFJlY292ZXJ5UHVyc2UnLCAoKSA9PiBtYWtlRW1wdHlQdXJzZSgpKVxuICApO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWludCA9IGlzc3VlclpvbmUuZXhvKGAke25hbWV9IG1pbnRgLCBNaW50SSwge1xuICAgIGdldElzc3VlcigpIHtcbiAgICAgIHJldHVybiBpc3N1ZXI7XG4gICAgfSxcbiAgICBtaW50UGF5bWVudChuZXdBbW91bnQpIHtcbiAgICAgIG5ld0Ftb3VudCA9IGNvZXJjZShuZXdBbW91bnQpO1xuICAgICAgbXVzdE1hdGNoKG5ld0Ftb3VudCwgYW1vdW50U2hhcGUsICdtaW50ZWQgYW1vdW50Jyk7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGNvbnN0IHJhd1BheW1lbnQgPSBtYWtlUGF5bWVudCgpO1xuICAgICAgaW5pdFBheW1lbnQocmF3UGF5bWVudCwgbmV3QW1vdW50LCB1bmRlZmluZWQpO1xuXG4gICAgICBjb25zdCBtaW50UmVjb3ZlcnlQdXJzZUJlZm9yZSA9IG1pbnRSZWNvdmVyeVB1cnNlLmdldEN1cnJlbnRBbW91bnQoKTtcbiAgICAgIG1pbnRSZWNvdmVyeVB1cnNlLmRlcG9zaXQocmF3UGF5bWVudCwgbmV3QW1vdW50KTtcbiAgICAgIGNvbnN0IHBheW1lbnQgPSBtaW50UmVjb3ZlcnlQdXJzZS53aXRoZHJhdyhuZXdBbW91bnQpO1xuICAgICAgY29uc3QgbWludFJlY292ZXJ5UHVyc2VBZnRlciA9IG1pbnRSZWNvdmVyeVB1cnNlLmdldEN1cnJlbnRBbW91bnQoKTtcbiAgICAgIGFzc2VydChrZXlFUShtaW50UmVjb3ZlcnlQdXJzZUJlZm9yZSwgbWludFJlY292ZXJ5UHVyc2VBZnRlcikpO1xuICAgICAgcmV0dXJuIHBheW1lbnQ7XG4gICAgfSxcbiAgfSk7XG5cbiAgY29uc3QgaXNzdWVyS2l0ID0gaGFyZGVuKHsgaXNzdWVyLCBtaW50LCBicmFuZCwgbWludFJlY292ZXJ5UHVyc2UgfSk7XG4gIHJldHVybiBpc3N1ZXJLaXQ7XG59OyRozY9fb25jZS5wcmVwYXJlUGF5bWVudExlZGdlcihwcmVwYXJlUGF5bWVudExlZGdlcik7XG5oYXJkZW4ocHJlcGFyZVBheW1lbnRMZWRnZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZVBheW1lbnRMZWRnZXIiOlsicHJlcGFyZVBheW1lbnRMZWRnZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAACc2lSAcVAAAHFQAAJwAAAEBhZ29yaWMvZXJ0cC12MC4xNi4zLXUyMS4wL3NyYy9wdXJzZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAYWdvcmljL3N0b3JlIiwiLi9hbW91bnRNYXRoLmpzIiwiLi90cmFuc2llbnROb3RpZmllci5qcyIsIi4vYW1vdW50U3RvcmUuanMiXSwiZXhwb3J0cyI6WyJwcmVwYXJlUHVyc2VLaW5kIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxNLG1ha2VDb3B5U2V0LEFtb3VudE1hdGgsbWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0LG1ha2VBbW91bnRTdG9yZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJtYWtlQ29weVNldFwiLFskaM2PX2EgPT4gKG1ha2VDb3B5U2V0ID0gJGjNj19hKV1dXV0sW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBbW91bnRNYXRoXCIsWyRozY9fYSA9PiAoQW1vdW50TWF0aCA9ICRozY9fYSldXV1dLFtcIi4vdHJhbnNpZW50Tm90aWZpZXIuanNcIiwgW1tcIm1ha2VUcmFuc2llbnROb3RpZmllcktpdFwiLFskaM2PX2EgPT4gKG1ha2VUcmFuc2llbnROb3RpZmllcktpdCA9ICRozY9fYSldXV1dLFtcIi4vYW1vdW50U3RvcmUuanNcIiwgW1tcIm1ha2VBbW91bnRTdG9yZVwiLFskaM2PX2EgPT4gKG1ha2VBbW91bnRTdG9yZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuY29uc3QgRU1QVFlfQ09QWV9TRVQgPSBtYWtlQ29weVNldChbXSk7XG5cbi8vXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVQdXJzZUtpbmQgPSAoXG4gIGlzc3VlclpvbmUsXG4gIG5hbWUsXG4gIGFzc2V0S2luZCxcbiAgYnJhbmQsXG4gIFB1cnNlSUtpdCxcbiAgcHVyc2VNZXRob2RzLFxuICByZWNvdmVyeVNldHNTdGF0ZSxcbiAgcGF5bWVudFJlY292ZXJ5U2V0cyxcbikgPT4ge1xuICBjb25zdCBhbW91bnRTaGFwZSA9IGJyYW5kLmdldEFtb3VudFNoYXBlKCk7XG5cbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgeyBwcm92aWRlTm90aWZpZXIsIHVwZGF0ZTogdXBkYXRlQmFsYW5jZSB9ID0gbWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0KCk7XG5cbiAgLypcblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgbWF5YmVSZWNvdmVyeVNldCA9IHN0YXRlID0+IHtcbiAgICBjb25zdCB7IHJlY292ZXJ5U2V0IH0gPSBzdGF0ZTtcbiAgICBpZiAocmVjb3ZlcnlTZXRzU3RhdGUgPT09ICdoYXNSZWNvdmVyeVNldHMnKSB7XG4gICAgICByZXR1cm4gcmVjb3ZlcnlTZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlY292ZXJ5U2V0c1N0YXRlID09PSAnbm9SZWNvdmVyeVNldHMnIHx8XG4gICAgICAgIEZhaWxgcmVjb3ZlclNldHNTdGF0ZSBtdXN0IGJlIG5vUmVjb3ZlcnlTZXRzIGlmIGl0IGlzbid0IGhhc1JlY292ZXJTZXRzYDtcbiAgICAgIHBheW1lbnRSZWNvdmVyeVNldHMgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBGYWlsYHBheW1lbnRSZWNvdmVyeVNldHMgbXVzdCBhbHdheXMgYmUgZGVmaW5lZGA7XG4gICAgICByZWNvdmVyeVNldC5nZXRTaXplKCkgPT09IDAgfHxcbiAgICAgICAgRmFpbGBXaXRoIG5vUmVjb3ZlcnlTZXRzLCByZWNvdmVyeVNldCBtdXN0IGJlIGVtcHR5YDtcblxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH07XG5cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgeyBkZXBvc2l0SW50ZXJuYWwsIHdpdGhkcmF3SW50ZXJuYWwgfSA9IHB1cnNlTWV0aG9kcztcbiAgY29uc3QgbWFrZVB1cnNlS2l0ID0gaXNzdWVyWm9uZS5leG9DbGFzc0tpdChcbiAgICBgJHtuYW1lfSBQdXJzZWAsXG4gICAgUHVyc2VJS2l0LFxuICAgICgpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRCYWxhbmNlID0gQW1vdW50TWF0aC5tYWtlRW1wdHkoYnJhbmQsIGFzc2V0S2luZCk7XG5cbiAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICBjb25zdCByZWNvdmVyeVNldCA9IGlzc3VlclpvbmUuZGV0YWNoZWQoKS5zZXRTdG9yZSgncmVjb3Zlcnkgc2V0Jyk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGN1cnJlbnRCYWxhbmNlLFxuICAgICAgICByZWNvdmVyeVNldCxcbiAgICAgIH07XG4gICAgfSxcbiAgICB7XG4gICAgICBwdXJzZToge1xuICAgICAgICBkZXBvc2l0KHNyY1BheW1lbnQsIG9wdEFtb3VudFNoYXBlID0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIGNvbnN0IHsgc3RhdGUgfSA9IHRoaXM7XG4gICAgICAgICAgY29uc3QgeyBwdXJzZSB9ID0gdGhpcy5mYWNldHM7XG4gICAgICAgICAgY29uc3QgYmFsYW5jZVN0b3JlID0gbWFrZUFtb3VudFN0b3JlKHN0YXRlLCAnY3VycmVudEJhbGFuY2UnKTtcbiAgICAgICAgICAvL1xuICAgICAgICAgIGNvbnN0IHNyY1BheW1lbnRCYWxhbmNlID0gZGVwb3NpdEludGVybmFsKFxuICAgICAgICAgICAgYmFsYW5jZVN0b3JlLFxuICAgICAgICAgICAgc3JjUGF5bWVudCxcbiAgICAgICAgICAgIG9wdEFtb3VudFNoYXBlLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdXBkYXRlQmFsYW5jZShwdXJzZSwgYmFsYW5jZVN0b3JlLmdldEFtb3VudCgpKTtcbiAgICAgICAgICByZXR1cm4gc3JjUGF5bWVudEJhbGFuY2U7XG4gICAgICAgIH0sXG4gICAgICAgIHdpdGhkcmF3KGFtb3VudCkge1xuICAgICAgICAgIGNvbnN0IHsgc3RhdGUgfSA9IHRoaXM7XG4gICAgICAgICAgY29uc3QgeyBwdXJzZSB9ID0gdGhpcy5mYWNldHM7XG5cbiAgICAgICAgICBjb25zdCBvcHRSZWNvdmVyeVNldCA9IG1heWJlUmVjb3ZlcnlTZXQoc3RhdGUpO1xuICAgICAgICAgIGNvbnN0IGJhbGFuY2VTdG9yZSA9IG1ha2VBbW91bnRTdG9yZShzdGF0ZSwgJ2N1cnJlbnRCYWxhbmNlJyk7XG4gICAgICAgICAgLy9cbiAgICAgICAgICBjb25zdCBwYXltZW50ID0gd2l0aGRyYXdJbnRlcm5hbChcbiAgICAgICAgICAgIGJhbGFuY2VTdG9yZSxcbiAgICAgICAgICAgIGFtb3VudCxcbiAgICAgICAgICAgIG9wdFJlY292ZXJ5U2V0LFxuICAgICAgICAgICk7XG4gICAgICAgICAgdXBkYXRlQmFsYW5jZShwdXJzZSwgYmFsYW5jZVN0b3JlLmdldEFtb3VudCgpKTtcbiAgICAgICAgICByZXR1cm4gcGF5bWVudDtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0Q3VycmVudEFtb3VudCgpIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXRlIH0gPSB0aGlzO1xuICAgICAgICAgIGNvbnN0IGJhbGFuY2VTdG9yZSA9IG1ha2VBbW91bnRTdG9yZShzdGF0ZSwgJ2N1cnJlbnRCYWxhbmNlJyk7XG4gICAgICAgICAgcmV0dXJuIGJhbGFuY2VTdG9yZS5nZXRBbW91bnQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0Q3VycmVudEFtb3VudE5vdGlmaWVyKCkge1xuICAgICAgICAgIHJldHVybiBwcm92aWRlTm90aWZpZXIodGhpcy5mYWNldHMucHVyc2UpO1xuICAgICAgICB9LFxuICAgICAgICBnZXRBbGxlZ2VkQnJhbmQoKSB7XG4gICAgICAgICAgcmV0dXJuIGJyYW5kO1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldERlcG9zaXRGYWNldCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5mYWNldHMuZGVwb3NpdEZhY2V0O1xuICAgICAgICB9LFxuXG4gICAgICAgIGdldFJlY292ZXJ5U2V0KCkge1xuICAgICAgICAgIGNvbnN0IHsgc3RhdGUgfSA9IHRoaXM7XG4gICAgICAgICAgY29uc3Qgb3B0UmVjb3ZlcnlTZXQgPSBtYXliZVJlY292ZXJ5U2V0KHN0YXRlKTtcbiAgICAgICAgICBpZiAob3B0UmVjb3ZlcnlTZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIEVNUFRZX0NPUFlfU0VUO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gb3B0UmVjb3ZlcnlTZXQuc25hcHNob3QoKTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVjb3ZlckFsbCgpIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXRlLCBmYWNldHMgfSA9IHRoaXM7XG4gICAgICAgICAgbGV0IGFtb3VudCA9IEFtb3VudE1hdGgubWFrZUVtcHR5KGJyYW5kLCBhc3NldEtpbmQpO1xuICAgICAgICAgIGNvbnN0IG9wdFJlY292ZXJ5U2V0ID0gbWF5YmVSZWNvdmVyeVNldChzdGF0ZSk7XG4gICAgICAgICAgaWYgKG9wdFJlY292ZXJ5U2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBhbW91bnQ7IC8vXG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAoY29uc3QgcGF5bWVudCBvZiBvcHRSZWNvdmVyeVNldC5rZXlzKCkpIHtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgY29uc3QgZGVsdGEgPSBmYWNldHMucHVyc2UuZGVwb3NpdChwYXltZW50KTtcbiAgICAgICAgICAgIGFtb3VudCA9IEFtb3VudE1hdGguYWRkKGFtb3VudCwgZGVsdGEsIGJyYW5kKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgb3B0UmVjb3ZlcnlTZXQuZ2V0U2l6ZSgpID09PSAwIHx8XG4gICAgICAgICAgICBGYWlsYGludGVybmFsOiBSZW1haW5pbmcgdW5yZWNvdmVyZWQgcGF5bWVudHM6ICR7ZmFjZXRzLnB1cnNlLmdldFJlY292ZXJ5U2V0KCl9YDtcbiAgICAgICAgICByZXR1cm4gYW1vdW50O1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGRlcG9zaXRGYWNldDoge1xuICAgICAgICByZWNlaXZlKC4uLmFyZ3MpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5mYWNldHMucHVyc2UuZGVwb3NpdCguLi5hcmdzKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBzdGF0ZVNoYXBlOiB7XG4gICAgICAgIGN1cnJlbnRCYWxhbmNlOiBhbW91bnRTaGFwZSxcbiAgICAgICAgcmVjb3ZlcnlTZXQ6IE0ucmVtb3RhYmxlKCdyZWNvdmVyeVNldCcpLFxuICAgICAgfSxcbiAgICB9LFxuICApO1xuICByZXR1cm4gKCkgPT4gbWFrZVB1cnNlS2l0KCkucHVyc2U7XG59OyRozY9fb25jZS5wcmVwYXJlUHVyc2VLaW5kKHByZXBhcmVQdXJzZUtpbmQpO1xuaGFyZGVuKHByZXBhcmVQdXJzZUtpbmQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZVB1cnNlS2luZCI6WyJwcmVwYXJlUHVyc2VLaW5kIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAE2UxkMyBgAAMgYAADMAAABAYWdvcmljL2VydHAtdjAuMTYuMy11MjEuMC9zcmMvdHJhbnNpZW50Tm90aWZpZXIuanN7ImltcG9ydHMiOlsiQGFnb3JpYy92YXQtZGF0YSIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL25vdGlmaWVyIl0sImV4cG9ydHMiOlsibWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgbWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSxwcm92aWRlTGF6eSxtYWtlTm90aWZpZXJLaXQ7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcInByb3ZpZGVMYXp5XCIsWyRozY9fYSA9PiAocHJvdmlkZUxhenkgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL25vdGlmaWVyXCIsIFtbXCJtYWtlTm90aWZpZXJLaXRcIixbJGjNj19hID0+IChtYWtlTm90aWZpZXJLaXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8qXG5cblxuICovXG5cbi8vXG4vL1xuICAgICAgIGNvbnN0IG1ha2VUcmFuc2llbnROb3RpZmllcktpdCA9ICgpID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCB0cmFuc2llbnROb3RpZmVyS2l0cyA9IG1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUoXG4gICAgJ3RyYW5zaWVudE5vdGlmZXJLaXRzJyxcbiAgKTtcblxuICBjb25zdCBwcm92aWRlTm90aWZpZXJLaXQgPSBrZXkgPT5cbiAgICBwcm92aWRlTGF6eSh0cmFuc2llbnROb3RpZmVyS2l0cywga2V5LCAoKSA9PlxuICAgICAgbWFrZU5vdGlmaWVyS2l0KGtleS5nZXRDdXJyZW50QW1vdW50KCkpLFxuICAgICk7XG5cbiAgY29uc3QgcHJvdmlkZU5vdGlmaWVyID0ga2V5ID0+IHByb3ZpZGVOb3RpZmllcktpdChrZXkpLm5vdGlmaWVyO1xuICBjb25zdCB1cGRhdGUgPSAoa2V5LCBuZXdWYWx1ZSkgPT4ge1xuICAgIGlmICh0cmFuc2llbnROb3RpZmVyS2l0cy5oYXMoa2V5KSkge1xuICAgICAgY29uc3QgeyB1cGRhdGVyIH0gPSB0cmFuc2llbnROb3RpZmVyS2l0cy5nZXQoa2V5KTtcbiAgICAgIHVwZGF0ZXIudXBkYXRlU3RhdGUobmV3VmFsdWUpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4geyBwcm92aWRlTm90aWZpZXIsIHVwZGF0ZSB9O1xufTskaM2PX29uY2UubWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0KG1ha2VUcmFuc2llbnROb3RpZmllcktpdCk7XG5oYXJkZW4obWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VUcmFuc2llbnROb3RpZmllcktpdCI6WyJtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAcBshjnQaAAB0GgAALAAAAEBhZ29yaWMvZXJ0cC12MC4xNi4zLXUyMS4wL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiQW1vdW50UGF0dGVyblNoYXBlIiwiQW1vdW50U2hhcGUiLCJBc3NldEtpbmRTaGFwZSIsIkJyYW5kSSIsIkJyYW5kU2hhcGUiLCJEZXBvc2l0RmFjZXRTaGFwZSIsIkRpc3BsYXlJbmZvU2hhcGUiLCJJc3N1ZXJLaXRTaGFwZSIsIklzc3VlclNoYXBlIiwiTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTIiwiTWludFNoYXBlIiwiTm90aWZpZXJTaGFwZSIsIlBheW1lbnRTaGFwZSIsIlB1cnNlU2hhcGUiLCJSYXRpb1NoYXBlIiwiaXNDb3B5QmFnVmFsdWUiLCJpc0NvcHlTZXRWYWx1ZSIsImlzTmF0VmFsdWUiLCJpc1NldFZhbHVlIiwibWFrZUlzc3VlckludGVyZmFjZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBNLG1hdGNoZXMsZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcIm1hdGNoZXNcIixbJGjNj19hID0+IChtYXRjaGVzID0gJGjNj19hKV1dLFtcImdldEludGVyZmFjZUd1YXJkUGF5bG9hZFwiLFskaM2PX2EgPT4gKGdldEludGVyZmFjZUd1YXJkUGF5bG9hZCA9ICRozY9fYSldXV1dXSk7XG5cblxuLypcblxuXG5cbiAqL1xuXG4gICAgICAgY29uc3QgQnJhbmRTaGFwZSA9IE0ucmVtb3RhYmxlKCdCcmFuZCcpOyRozY9fb25jZS5CcmFuZFNoYXBlKEJyYW5kU2hhcGUpO1xuICAgICAgIGNvbnN0IElzc3VlclNoYXBlID0gTS5yZW1vdGFibGUoJ0lzc3VlcicpOyRozY9fb25jZS5Jc3N1ZXJTaGFwZShJc3N1ZXJTaGFwZSk7XG4gICAgICAgY29uc3QgUGF5bWVudFNoYXBlID0gTS5yZW1vdGFibGUoJ1BheW1lbnQnKTskaM2PX29uY2UuUGF5bWVudFNoYXBlKFBheW1lbnRTaGFwZSk7XG4gICAgICAgY29uc3QgUHVyc2VTaGFwZSA9IE0ucmVtb3RhYmxlKCdQdXJzZScpOyRozY9fb25jZS5QdXJzZVNoYXBlKFB1cnNlU2hhcGUpO1xuICAgICAgIGNvbnN0IERlcG9zaXRGYWNldFNoYXBlID0gTS5yZW1vdGFibGUoJ0RlcG9zaXRGYWNldCcpOyRozY9fb25jZS5EZXBvc2l0RmFjZXRTaGFwZShEZXBvc2l0RmFjZXRTaGFwZSk7XG4gICAgICAgY29uc3QgTm90aWZpZXJTaGFwZSA9IE0ucmVtb3RhYmxlKCdOb3RpZmllcicpOyRozY9fb25jZS5Ob3RpZmllclNoYXBlKE5vdGlmaWVyU2hhcGUpO1xuICAgICAgIGNvbnN0IE1pbnRTaGFwZSA9IE0ucmVtb3RhYmxlKCdNaW50Jyk7XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS5NaW50U2hhcGUoTWludFNoYXBlKTtcbmNvbnN0IE5hdFZhbHVlU2hhcGUgPSBNLm5hdCgpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgQ29weVNldFZhbHVlU2hhcGUgPSBNLnNldCgpO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgU2V0VmFsdWVTaGFwZSA9IE0uYXJyYXlPZihNLmtleSgpKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgQ29weUJhZ1ZhbHVlU2hhcGUgPSBNLmJhZygpO1xuXG5jb25zdCBBbW91bnRWYWx1ZVNoYXBlID0gTS5vcihcbiAgTmF0VmFsdWVTaGFwZSxcbiAgQ29weVNldFZhbHVlU2hhcGUsXG4gIFNldFZhbHVlU2hhcGUsXG4gIENvcHlCYWdWYWx1ZVNoYXBlLFxuKTtcblxuICAgICAgIGNvbnN0IEFtb3VudFNoYXBlID0geyBicmFuZDogQnJhbmRTaGFwZSwgdmFsdWU6IEFtb3VudFZhbHVlU2hhcGUgfTskaM2PX29uY2UuQW1vdW50U2hhcGUoQW1vdW50U2hhcGUpO1xuaGFyZGVuKEFtb3VudFNoYXBlKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IEFtb3VudFBhdHRlcm5TaGFwZSA9IE0ucGF0dGVybigpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovJGjNj19vbmNlLkFtb3VudFBhdHRlcm5TaGFwZShBbW91bnRQYXR0ZXJuU2hhcGUpO1xuICAgICAgIGNvbnN0IFJhdGlvU2hhcGUgPSB7IG51bWVyYXRvcjogQW1vdW50U2hhcGUsIGRlbm9taW5hdG9yOiBBbW91bnRTaGFwZSB9OyRozY9fb25jZS5SYXRpb1NoYXBlKFJhdGlvU2hhcGUpO1xuaGFyZGVuKFJhdGlvU2hhcGUpO1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBpc05hdFZhbHVlID0gdmFsdWUgPT4gbWF0Y2hlcyh2YWx1ZSwgTmF0VmFsdWVTaGFwZSk7JGjNj19vbmNlLmlzTmF0VmFsdWUoaXNOYXRWYWx1ZSk7XG5oYXJkZW4oaXNOYXRWYWx1ZSk7XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGlzQ29weVNldFZhbHVlID0gdmFsdWUgPT4gbWF0Y2hlcyh2YWx1ZSwgQ29weVNldFZhbHVlU2hhcGUpOyRozY9fb25jZS5pc0NvcHlTZXRWYWx1ZShpc0NvcHlTZXRWYWx1ZSk7XG5oYXJkZW4oaXNDb3B5U2V0VmFsdWUpO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBpc1NldFZhbHVlID0gdmFsdWUgPT4gbWF0Y2hlcyh2YWx1ZSwgU2V0VmFsdWVTaGFwZSk7JGjNj19vbmNlLmlzU2V0VmFsdWUoaXNTZXRWYWx1ZSk7XG5oYXJkZW4oaXNTZXRWYWx1ZSk7XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGlzQ29weUJhZ1ZhbHVlID0gdmFsdWUgPT4gbWF0Y2hlcyh2YWx1ZSwgQ29weUJhZ1ZhbHVlU2hhcGUpOyRozY9fb25jZS5pc0NvcHlCYWdWYWx1ZShpc0NvcHlCYWdWYWx1ZSk7XG5oYXJkZW4oaXNDb3B5QmFnVmFsdWUpO1xuXG4vL1xuICAgICAgIGNvbnN0IE1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyA9IDEwMDskaM2PX29uY2UuTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTKE1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyk7XG5cbiAgICAgICBjb25zdCBBc3NldEtpbmRTaGFwZSA9IE0ub3IoJ25hdCcsICdzZXQnLCAnY29weVNldCcsICdjb3B5QmFnJyk7JGjNj19vbmNlLkFzc2V0S2luZFNoYXBlKEFzc2V0S2luZFNoYXBlKTtcblxuICAgICAgIGNvbnN0IERpc3BsYXlJbmZvU2hhcGUgPSBNLnNwbGl0UmVjb3JkKFxuICB7fSxcbiAge1xuICAgIGRlY2ltYWxQbGFjZXM6IE0uYW5kKFxuICAgICAgTS5ndGUoLU1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyksXG4gICAgICBNLmx0ZShNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMpLFxuICAgICksXG4gICAgYXNzZXRLaW5kOiBBc3NldEtpbmRTaGFwZSxcbiAgfSxcbiAge1xuICAgIC8vXG4gICAgLy9cbiAgfSxcbik7JGjNj19vbmNlLkRpc3BsYXlJbmZvU2hhcGUoRGlzcGxheUluZm9TaGFwZSk7XG5cbiAgICAgICBjb25zdCBJc3N1ZXJLaXRTaGFwZSA9IHtcbiAgYnJhbmQ6IEJyYW5kU2hhcGUsXG4gIG1pbnQ6IE1pbnRTaGFwZSxcbiAgbWludFJlY292ZXJ5UHVyc2U6IFB1cnNlU2hhcGUsXG4gIGlzc3VlcjogSXNzdWVyU2hhcGUsXG4gIGRpc3BsYXlJbmZvOiBEaXNwbGF5SW5mb1NoYXBlLFxufTskaM2PX29uY2UuSXNzdWVyS2l0U2hhcGUoSXNzdWVyS2l0U2hhcGUpO1xuaGFyZGVuKElzc3VlcktpdFNoYXBlKTtcblxuLy9cblxuICAgICAgIGNvbnN0IEJyYW5kSSA9IE0uaW50ZXJmYWNlKCdCcmFuZCcsIHtcbiAgaXNNeUlzc3VlcjogTS5jYWxsV2hlbihNLmF3YWl0KElzc3VlclNoYXBlKSkucmV0dXJucyhNLmJvb2xlYW4oKSksXG4gIGdldEFsbGVnZWROYW1lOiBNLmNhbGwoKS5yZXR1cm5zKE0uc3RyaW5nKCkpLFxuICBnZXREaXNwbGF5SW5mbzogTS5jYWxsKCkucmV0dXJucyhEaXNwbGF5SW5mb1NoYXBlKSxcbiAgZ2V0QW1vdW50U2hhcGU6IE0uY2FsbCgpLnJldHVybnMoTS5wYXR0ZXJuKCkpLFxufSk7XG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UuQnJhbmRJKEJyYW5kSSk7XG4gICAgICAgY29uc3QgbWFrZUlzc3VlckludGVyZmFjZXMgPSAoXG4gIGJyYW5kU2hhcGUgPSBCcmFuZFNoYXBlLFxuICBhc3NldEtpbmRTaGFwZSA9IEFzc2V0S2luZFNoYXBlLFxuICBhbW91bnRTaGFwZSA9IEFtb3VudFNoYXBlLFxuKSA9PiB7XG4gIGNvbnN0IElzc3VlckkgPSBNLmludGVyZmFjZSgnSXNzdWVyJywge1xuICAgIGdldEJyYW5kOiBNLmNhbGwoKS5yZXR1cm5zKGJyYW5kU2hhcGUpLFxuICAgIGdldEFsbGVnZWROYW1lOiBNLmNhbGwoKS5yZXR1cm5zKE0uc3RyaW5nKCkpLFxuICAgIGdldEFzc2V0S2luZDogTS5jYWxsKCkucmV0dXJucyhhc3NldEtpbmRTaGFwZSksXG4gICAgZ2V0RGlzcGxheUluZm86IE0uY2FsbCgpLnJldHVybnMoRGlzcGxheUluZm9TaGFwZSksXG4gICAgbWFrZUVtcHR5UHVyc2U6IE0uY2FsbCgpLnJldHVybnMoUHVyc2VTaGFwZSksXG5cbiAgICBpc0xpdmU6IE0uY2FsbFdoZW4oTS5hd2FpdChQYXltZW50U2hhcGUpKS5yZXR1cm5zKE0uYm9vbGVhbigpKSxcbiAgICBnZXRBbW91bnRPZjogTS5jYWxsV2hlbihNLmF3YWl0KFBheW1lbnRTaGFwZSkpLnJldHVybnMoYW1vdW50U2hhcGUpLFxuICAgIGJ1cm46IE0uY2FsbFdoZW4oTS5hd2FpdChQYXltZW50U2hhcGUpKVxuICAgICAgLm9wdGlvbmFsKEFtb3VudFBhdHRlcm5TaGFwZSlcbiAgICAgIC5yZXR1cm5zKGFtb3VudFNoYXBlKSxcbiAgfSk7XG5cbiAgY29uc3QgTWludEkgPSBNLmludGVyZmFjZSgnTWludCcsIHtcbiAgICBnZXRJc3N1ZXI6IE0uY2FsbCgpLnJldHVybnMoSXNzdWVyU2hhcGUpLFxuICAgIG1pbnRQYXltZW50OiBNLmNhbGwoYW1vdW50U2hhcGUpLnJldHVybnMoUGF5bWVudFNoYXBlKSxcbiAgfSk7XG5cbiAgY29uc3QgUGF5bWVudEkgPSBNLmludGVyZmFjZSgnUGF5bWVudCcsIHtcbiAgICBnZXRBbGxlZ2VkQnJhbmQ6IE0uY2FsbCgpLnJldHVybnMoYnJhbmRTaGFwZSksXG4gIH0pO1xuXG4gIGNvbnN0IFB1cnNlSSA9IE0uaW50ZXJmYWNlKCdQdXJzZScsIHtcbiAgICBnZXRBbGxlZ2VkQnJhbmQ6IE0uY2FsbCgpLnJldHVybnMoYnJhbmRTaGFwZSksXG4gICAgZ2V0Q3VycmVudEFtb3VudDogTS5jYWxsKCkucmV0dXJucyhhbW91bnRTaGFwZSksXG4gICAgZ2V0Q3VycmVudEFtb3VudE5vdGlmaWVyOiBNLmNhbGwoKS5yZXR1cm5zKE5vdGlmaWVyU2hhcGUpLFxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgZGVwb3NpdDogTS5jYWxsKFBheW1lbnRTaGFwZSlcbiAgICAgIC5vcHRpb25hbChBbW91bnRQYXR0ZXJuU2hhcGUpXG4gICAgICAucmV0dXJucyhhbW91bnRTaGFwZSksXG4gICAgZ2V0RGVwb3NpdEZhY2V0OiBNLmNhbGwoKS5yZXR1cm5zKERlcG9zaXRGYWNldFNoYXBlKSxcbiAgICB3aXRoZHJhdzogTS5jYWxsKGFtb3VudFNoYXBlKS5yZXR1cm5zKFBheW1lbnRTaGFwZSksXG4gICAgZ2V0UmVjb3ZlcnlTZXQ6IE0uY2FsbCgpLnJldHVybnMoTS5zZXRPZihQYXltZW50U2hhcGUpKSxcbiAgICByZWNvdmVyQWxsOiBNLmNhbGwoKS5yZXR1cm5zKGFtb3VudFNoYXBlKSxcbiAgfSk7XG5cbiAgY29uc3QgRGVwb3NpdEZhY2V0SSA9IE0uaW50ZXJmYWNlKCdEZXBvc2l0RmFjZXQnLCB7XG4gICAgcmVjZWl2ZTogZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkKFB1cnNlSSkubWV0aG9kR3VhcmRzLmRlcG9zaXQsXG4gIH0pO1xuXG4gIGNvbnN0IFB1cnNlSUtpdCA9IHtcbiAgICBwdXJzZTogUHVyc2VJLFxuICAgIGRlcG9zaXRGYWNldDogRGVwb3NpdEZhY2V0SSxcbiAgfTtcbiAgaGFyZGVuKFB1cnNlSUtpdCk7XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgSXNzdWVySSxcbiAgICBNaW50SSxcbiAgICBQYXltZW50SSxcbiAgICBQdXJzZUlLaXQsXG4gIH0pO1xufTskaM2PX29uY2UubWFrZUlzc3VlckludGVyZmFjZXMobWFrZUlzc3VlckludGVyZmFjZXMpO1xuaGFyZGVuKG1ha2VJc3N1ZXJJbnRlcmZhY2VzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkJyYW5kU2hhcGUiOlsiQnJhbmRTaGFwZSJdLCJJc3N1ZXJTaGFwZSI6WyJJc3N1ZXJTaGFwZSJdLCJQYXltZW50U2hhcGUiOlsiUGF5bWVudFNoYXBlIl0sIlB1cnNlU2hhcGUiOlsiUHVyc2VTaGFwZSJdLCJEZXBvc2l0RmFjZXRTaGFwZSI6WyJEZXBvc2l0RmFjZXRTaGFwZSJdLCJOb3RpZmllclNoYXBlIjpbIk5vdGlmaWVyU2hhcGUiXSwiTWludFNoYXBlIjpbIk1pbnRTaGFwZSJdLCJBbW91bnRTaGFwZSI6WyJBbW91bnRTaGFwZSJdLCJBbW91bnRQYXR0ZXJuU2hhcGUiOlsiQW1vdW50UGF0dGVyblNoYXBlIl0sIlJhdGlvU2hhcGUiOlsiUmF0aW9TaGFwZSJdLCJpc05hdFZhbHVlIjpbImlzTmF0VmFsdWUiXSwiaXNDb3B5U2V0VmFsdWUiOlsiaXNDb3B5U2V0VmFsdWUiXSwiaXNTZXRWYWx1ZSI6WyJpc1NldFZhbHVlIl0sImlzQ29weUJhZ1ZhbHVlIjpbImlzQ29weUJhZ1ZhbHVlIl0sIk1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyI6WyJNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMiXSwiQXNzZXRLaW5kU2hhcGUiOlsiQXNzZXRLaW5kU2hhcGUiXSwiRGlzcGxheUluZm9TaGFwZSI6WyJEaXNwbGF5SW5mb1NoYXBlIl0sIklzc3VlcktpdFNoYXBlIjpbIklzc3VlcktpdFNoYXBlIl0sIkJyYW5kSSI6WyJCcmFuZEkiXSwibWFrZUlzc3VlckludGVyZmFjZXMiOlsibWFrZUlzc3VlckludGVyZmFjZXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAALQAAAEBhZ29yaWMvZXJ0cC12MC4xNi4zLXUyMS4wL3NyYy90eXBlcy1pbmRleC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD7g02yiR0AAIkdAAAtAAAAQGFnb3JpYy9pbnRlcm5hbC12MC40LjAtdTIxLjAvc3JjL2NhbGxiYWNrLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2ZhciIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbImNhbGxFIiwiY2FsbFN5bmMiLCJpc0NhbGxiYWNrIiwibWFrZUZ1bmN0aW9uQ2FsbGJhY2siLCJtYWtlTWV0aG9kQ2FsbGJhY2siLCJtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2siLCJtYWtlU3luY01ldGhvZENhbGxiYWNrIiwicHJlcGFyZUF0dGVudWF0b3IiLCJwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLG1ha2VFcnJvcixxLEUsaXNPYmplY3QsaXNQYXNzYWJsZVN5bWJvbCxnZXRJbnRlcmZhY2VNZXRob2RLZXlzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJtYWtlRXJyb3JcIixbJGjNj19hID0+IChtYWtlRXJyb3IgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiaXNPYmplY3RcIixbJGjNj19hID0+IChpc09iamVjdCA9ICRozY9fYSldXSxbXCJpc1Bhc3NhYmxlU3ltYm9sXCIsWyRozY9fYSA9PiAoaXNQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJnZXRJbnRlcmZhY2VNZXRob2RLZXlzXCIsWyRozY9fYSA9PiAoZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCB7IGZyb21FbnRyaWVzIH0gPSBPYmplY3Q7XG5cbmNvbnN0IHsgb3duS2V5czogcmF3T3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IG93bktleXMgPVxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoXG4gICAgcmF3T3duS2V5c1xuICApO1xuXG4vKlxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cbiAqL1xuY29uc3QgaXNQcm9wZXJ0eUtleSA9IGtleSA9PiB7XG4gIHN3aXRjaCAodHlwZW9mIGtleSkge1xuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgY2FzZSAnbnVtYmVyJzpcbiAgICBjYXNlICdzeW1ib2wnOlxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGNhbGxTeW5jID0gKGNhbGxiYWNrLCAuLi5hcmdzKSA9PiB7XG4gIGNvbnN0IHsgdGFyZ2V0LCBtZXRob2ROYW1lLCBib3VuZCB9ID0gY2FsbGJhY2s7XG4gIGlmIChtZXRob2ROYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdGFyZ2V0KC4uLmJvdW5kLCAuLi5hcmdzKTtcbiAgfVxuICByZXR1cm4gdGFyZ2V0W21ldGhvZE5hbWVdKC4uLmJvdW5kLCAuLi5hcmdzKTtcbn07JGjNj19vbmNlLmNhbGxTeW5jKGNhbGxTeW5jKTtcbmhhcmRlbihjYWxsU3luYyk7XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBjYWxsRSA9IChjYWxsYmFjaywgLi4uYXJncykgPT4ge1xuICBjb25zdCB7IHRhcmdldCwgbWV0aG9kTmFtZSwgYm91bmQgfSA9IGNhbGxiYWNrO1xuICBpZiAobWV0aG9kTmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIEUodGFyZ2V0KSguLi5ib3VuZCwgLi4uYXJncyk7XG4gIH1cbiAgcmV0dXJuIEUodGFyZ2V0KVttZXRob2ROYW1lXSguLi5ib3VuZCwgLi4uYXJncyk7XG59OyRozY9fb25jZS5jYWxsRShjYWxsRSk7XG5oYXJkZW4oY2FsbEUpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VTeW5jRnVuY3Rpb25DYWxsYmFjayA9ICh0YXJnZXQsIC4uLmJvdW5kKSA9PiB7XG4gIHR5cGVvZiB0YXJnZXQgPT09ICdmdW5jdGlvbicgfHxcbiAgICBGYWlsYHN5bmMgZnVuY3Rpb24gY2FsbGJhY2sgdGFyZ2V0IG11c3QgYmUgYSBmdW5jdGlvbjogJHt0YXJnZXR9YDtcbiAgLyogICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBjYiA9IGhhcmRlbih7IHRhcmdldCwgYm91bmQsIGlzU3luYzogdHJ1ZSB9KTtcbiAgcmV0dXJuIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoY2IpO1xufTskaM2PX29uY2UubWFrZVN5bmNGdW5jdGlvbkNhbGxiYWNrKG1ha2VTeW5jRnVuY3Rpb25DYWxsYmFjayk7XG5oYXJkZW4obWFrZVN5bmNGdW5jdGlvbkNhbGxiYWNrKTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlRnVuY3Rpb25DYWxsYmFjayA9ICh0YXJnZXQsIC4uLmJvdW5kKSA9PiB7XG4gIGlzT2JqZWN0KHRhcmdldCkgfHxcbiAgICBGYWlsYGZ1bmN0aW9uIGNhbGxiYWNrIHRhcmdldCBtdXN0IGJlIGEgZnVuY3Rpb24gcHJlc2VuY2U6ICR7dGFyZ2V0fWA7XG4gIC8qICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgY2IgPSBoYXJkZW4oeyB0YXJnZXQsIGJvdW5kIH0pO1xuICByZXR1cm4gLyogICAgICAgICAgICAgICAgICAgICAgKi8gKGNiKTtcbn07JGjNj19vbmNlLm1ha2VGdW5jdGlvbkNhbGxiYWNrKG1ha2VGdW5jdGlvbkNhbGxiYWNrKTtcbmhhcmRlbihtYWtlRnVuY3Rpb25DYWxsYmFjayk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlU3luY01ldGhvZENhbGxiYWNrID0gKHRhcmdldCwgbWV0aG9kTmFtZSwgLi4uYm91bmQpID0+IHtcbiAgaXNPYmplY3QodGFyZ2V0KSB8fFxuICAgIEZhaWxgc3luYyBtZXRob2QgY2FsbGJhY2sgdGFyZ2V0IG11c3QgYmUgYW4gb2JqZWN0OiAke3RhcmdldH1gO1xuICB0eXBlb2YgbWV0aG9kTmFtZSA9PT0gJ3N0cmluZycgfHxcbiAgICBpc1Bhc3NhYmxlU3ltYm9sKG1ldGhvZE5hbWUpIHx8XG4gICAgRmFpbGBtZXRob2QgbmFtZSBtdXN0IGJlIGEgc3RyaW5nIG9yIHBhc3NhYmxlIHN5bWJvbDogJHttZXRob2ROYW1lfWA7XG4gIC8qICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgY2IgPSBoYXJkZW4oeyB0YXJnZXQsIG1ldGhvZE5hbWUsIGJvdW5kLCBpc1N5bmM6IHRydWUgfSk7XG4gIHJldHVybiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKGNiKTtcbn07JGjNj19vbmNlLm1ha2VTeW5jTWV0aG9kQ2FsbGJhY2sobWFrZVN5bmNNZXRob2RDYWxsYmFjayk7XG5oYXJkZW4obWFrZVN5bmNNZXRob2RDYWxsYmFjayk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlTWV0aG9kQ2FsbGJhY2sgPSAodGFyZ2V0LCBtZXRob2ROYW1lLCAuLi5ib3VuZCkgPT4ge1xuICBpc09iamVjdCh0YXJnZXQpIHx8IEZhaWxgbWV0aG9kIGNhbGxiYWNrIHRhcmdldCBtdXN0IGJlIGFuIG9iamVjdDogJHt0YXJnZXR9YDtcbiAgdHlwZW9mIG1ldGhvZE5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgaXNQYXNzYWJsZVN5bWJvbChtZXRob2ROYW1lKSB8fFxuICAgIEZhaWxgbWV0aG9kIG5hbWUgbXVzdCBiZSBhIHN0cmluZyBvciBwYXNzYWJsZSBzeW1ib2w6ICR7bWV0aG9kTmFtZX1gO1xuICAvKiAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGNiID0gaGFyZGVuKHsgdGFyZ2V0LCBtZXRob2ROYW1lLCBib3VuZCB9KTtcbiAgcmV0dXJuIC8qICAgICAgICAgICAgICAgICAgICAgICovIChjYik7XG59OyRozY9fb25jZS5tYWtlTWV0aG9kQ2FsbGJhY2sobWFrZU1ldGhvZENhbGxiYWNrKTtcbmhhcmRlbihtYWtlTWV0aG9kQ2FsbGJhY2spO1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGlzQ2FsbGJhY2sgPSBjYWxsYmFjayA9PiB7XG4gIGlmICghaXNPYmplY3QoY2FsbGJhY2spKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHsgdGFyZ2V0LCBtZXRob2ROYW1lLCBib3VuZCB9ID0gY2FsbGJhY2s7XG4gIHJldHVybiAoXG4gICAgaXNPYmplY3QodGFyZ2V0KSAmJlxuICAgIChtZXRob2ROYW1lID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHR5cGVvZiBtZXRob2ROYW1lID09PSAnc3RyaW5nJyB8fFxuICAgICAgaXNQYXNzYWJsZVN5bWJvbChtZXRob2ROYW1lKSkgJiZcbiAgICBBcnJheS5pc0FycmF5KGJvdW5kKVxuICApO1xufTskaM2PX29uY2UuaXNDYWxsYmFjayhpc0NhbGxiYWNrKTtcbmhhcmRlbihpc0NhbGxiYWNrKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVBdHRlbnVhdG9yID0gKFxuICB6b25lLFxuICBtZXRob2ROYW1lcyxcbiAgeyBpbnRlcmZhY2VHdWFyZCwgdGFnID0gJ0F0dGVudWF0b3InIH0gPSB7fSxcbikgPT4ge1xuICAvKlxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IG1ldGhvZHMgPSAvKiAgICAgICAgICAgICAgICAgICovIChcbiAgICBmcm9tRW50cmllcyhcbiAgICAgIG1ldGhvZE5hbWVzLm1hcChrZXkgPT4ge1xuICAgICAgICAvL1xuICAgICAgICBpZiAoIWlzUHJvcGVydHlLZXkoa2V5KSkge1xuICAgICAgICAgIHRocm93IEZhaWxga2V5ICR7cShrZXkpfSBpcyBub3QgYSBQcm9wZXJ0eUtleWA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtID0gLyogICAgICAgICAgICAgICAgICAqLyAoe1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICBba2V5XSguLi5hcmdzKSB7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgY29uc3QgY2IgPSB0aGlzLnN0YXRlLmNic1trZXldO1xuICAgICAgICAgICAgaWYgKCFjYikge1xuICAgICAgICAgICAgICBjb25zdCBlcnIgPSBtYWtlRXJyb3IoYHVuaW1wbGVtZW50ZWQgJHtxKHRhZyl9IG1ldGhvZCAke3Eoa2V5KX1gKTtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGUuaXNTeW5jKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGNiLmlzU3luYykge1xuICAgICAgICAgICAgICByZXR1cm4gY2FsbFN5bmMoY2IsIC4uLmFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNhbGxFKGNiLCAuLi5hcmdzKTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KVtrZXldO1xuICAgICAgICByZXR1cm4gLyogICAgICAgICAgICAgICAgKi8gKFtrZXksIG1dKTtcbiAgICAgIH0pLFxuICAgIClcbiAgKTtcblxuICAvKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IG1ha2VBdHRlbnVhdG9yID0gem9uZS5leG9DbGFzcyhcbiAgICB0YWcsXG4gICAgaW50ZXJmYWNlR3VhcmQsXG4gICAgLypcblxuXG5cblxuICAgICAqL1xuICAgICh7XG4gICAgICB0YXJnZXQgPSBudWxsLFxuICAgICAgaXNTeW5jID0gZmFsc2UsXG4gICAgICBvdmVycmlkZXMgPSAvKiAgICAgICAgICAgICAgICAgICAgKi8gKHt9KSxcbiAgICB9KSA9PiB7XG4gICAgICBjb25zdCBjYnMgPSAvKiAgICAgICAgICAgICAgICAgICAgKi8gKHt9KTtcblxuICAgICAgY29uc3QgcmVtYWluaW5nID0gbmV3IFNldChtZXRob2ROYW1lcyk7XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiBvd25LZXlzKG92ZXJyaWRlcykpIHtcbiAgICAgICAgcmVtYWluaW5nLmhhcyhrZXkpIHx8XG4gICAgICAgICAgRmFpbGAke3EodGFnKX0gb3ZlcnJpZGVzWyR7cShrZXkpfV0gbm90IGFsbG93ZWQgYnkgbWV0aG9kTmFtZXNgO1xuXG4gICAgICAgIHJlbWFpbmluZy5kZWxldGUoa2V5KTtcbiAgICAgICAgY29uc3QgY2IgPSBvdmVycmlkZXNba2V5XTtcbiAgICAgICAgY2IgPT0gbnVsbCB8fFxuICAgICAgICAgIGlzQ2FsbGJhY2soY2IpIHx8XG4gICAgICAgICAgRmFpbGAke3EodGFnKX0gb3ZlcnJpZGVzWyR7cShrZXkpfV0gaXMgbm90IGEgY2FsbGJhY2s7IGdvdCAke2NifWA7XG4gICAgICAgIGNic1trZXldID0gY2I7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiByZW1haW5pbmcpIHtcbiAgICAgICAgaWYgKGlzU3luYykge1xuICAgICAgICAgIGNic1trZXldID0gbWFrZVN5bmNNZXRob2RDYWxsYmFjayh0YXJnZXQsIGtleSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY2JzW2tleV0gPSBtYWtlTWV0aG9kQ2FsbGJhY2sodGFyZ2V0LCBrZXkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gaGFyZGVuKHsgY2JzLCBpc1N5bmMgfSk7XG4gICAgfSxcbiAgICAvKiAgICAgICAgICAgICAgICAgICovIChtZXRob2RzKSxcbiAgKTtcbiAgcmV0dXJuIG1ha2VBdHRlbnVhdG9yO1xufTskaM2PX29uY2UucHJlcGFyZUF0dGVudWF0b3IocHJlcGFyZUF0dGVudWF0b3IpO1xuaGFyZGVuKHByZXBhcmVBdHRlbnVhdG9yKTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yID0gKHpvbmUsIGludGVyZmFjZUd1YXJkLCBvcHRzID0ge30pID0+IHtcbiAgY29uc3QgbWV0aG9kTmFtZXMgPSBnZXRJbnRlcmZhY2VNZXRob2RLZXlzKGludGVyZmFjZUd1YXJkKTtcbiAgY29uc3QgbWFrZUF0dGVudWF0b3IgPSBwcmVwYXJlQXR0ZW51YXRvcih6b25lLCBtZXRob2ROYW1lcywge1xuICAgIC4uLm9wdHMsXG4gICAgaW50ZXJmYWNlR3VhcmQsXG4gIH0pO1xuICByZXR1cm4gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAobWFrZUF0dGVudWF0b3IpO1xufTskaM2PX29uY2UucHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yKHByZXBhcmVHdWFyZGVkQXR0ZW51YXRvcik7XG5oYXJkZW4ocHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNhbGxTeW5jIjpbImNhbGxTeW5jIl0sImNhbGxFIjpbImNhbGxFIl0sIm1ha2VTeW5jRnVuY3Rpb25DYWxsYmFjayI6WyJtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2siXSwibWFrZUZ1bmN0aW9uQ2FsbGJhY2siOlsibWFrZUZ1bmN0aW9uQ2FsbGJhY2siXSwibWFrZVN5bmNNZXRob2RDYWxsYmFjayI6WyJtYWtlU3luY01ldGhvZENhbGxiYWNrIl0sIm1ha2VNZXRob2RDYWxsYmFjayI6WyJtYWtlTWV0aG9kQ2FsbGJhY2siXSwiaXNDYWxsYmFjayI6WyJpc0NhbGxiYWNrIl0sInByZXBhcmVBdHRlbnVhdG9yIjpbInByZXBhcmVBdHRlbnVhdG9yIl0sInByZXBhcmVHdWFyZGVkQXR0ZW51YXRvciI6WyJwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAz7Ja43YGAAB2BgAAKwAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuNC4wLXUyMS4wL3NyYy9jb25maWcuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkJyaWRnZUlkIiwiQ29zbW9zSW5pdEtleVRvQnJpZGdlSWQiLCJWQmFua0FjY291bnQiLCJXYWxsZXROYW1lIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8vXG4vL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBCcmlkZ2VJZCA9IC8qICAgICAgICAgICAgICAgICovICh7XG4gIEJBTks6ICdiYW5rJyxcbiAgQ09SRTogJ2NvcmUnLFxuICBESUJDOiAnZGliYycsXG4gIFNUT1JBR0U6ICdzdG9yYWdlJyxcbiAgUFJPVklTSU9OOiAncHJvdmlzaW9uJyxcbiAgUFJPVklTSU9OX1NNQVJUX1dBTExFVDogJ3Byb3Zpc2lvbldhbGxldCcsXG4gIFZMT0NBTENIQUlOOiAndmxvY2FsY2hhaW4nLFxuICBWVFJBTlNGRVI6ICd2dHJhbnNmZXInLFxuICBXQUxMRVQ6ICd3YWxsZXQnLFxufSk7JGjNj19vbmNlLkJyaWRnZUlkKEJyaWRnZUlkKTtcbmhhcmRlbihCcmlkZ2VJZCk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgQ29zbW9zSW5pdEtleVRvQnJpZGdlSWQgPSB7XG4gIHZiYW5rUG9ydDogJ2JhbmsnLFxuICB2aWJjUG9ydDogJ2RpYmMnLFxufTskaM2PX29uY2UuQ29zbW9zSW5pdEtleVRvQnJpZGdlSWQoQ29zbW9zSW5pdEtleVRvQnJpZGdlSWQpO1xuaGFyZGVuKENvc21vc0luaXRLZXlUb0JyaWRnZUlkKTtcblxuICAgICAgIGNvbnN0IFdhbGxldE5hbWUgPSAvKiAgICAgICAgICAgICAgICAqLyAoe1xuICBkZXBvc2l0RmFjZXQ6ICdkZXBvc2l0RmFjZXQnLFxufSk7JGjNj19vbmNlLldhbGxldE5hbWUoV2FsbGV0TmFtZSk7XG5oYXJkZW4oV2FsbGV0TmFtZSk7XG5cbi8vXG4gICAgICAgY29uc3QgVkJhbmtBY2NvdW50ID0gLyogICAgICAgICAgICAgICAgKi8gKHtcbiAgcmVzZXJ2ZToge1xuICAgIG1vZHVsZTogJ3ZiYW5rL3Jlc2VydmUnLFxuICAgIGFkZHJlc3M6ICdhZ29yaWMxYWUwbG10emxncmNubGE5eGprcGFhcnE1ZDVkZmV6NjNoM251Y2wnLFxuICB9LFxuICBwcm92aXNpb246IHtcbiAgICBtb2R1bGU6ICd2YmFuay9wcm92aXNpb24nLFxuICAgIGFkZHJlc3M6ICdhZ29yaWMxbWVnenl0ZzY1Y3lyZ3pzNmZ2enhncmNxdnd3bDd1Z3B0NjIzNDYnLFxuICB9LFxufSk7JGjNj19vbmNlLlZCYW5rQWNjb3VudChWQmFua0FjY291bnQpO1xuaGFyZGVuKFZCYW5rQWNjb3VudCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJCcmlkZ2VJZCI6WyJCcmlkZ2VJZCJdLCJDb3Ntb3NJbml0S2V5VG9CcmlkZ2VJZCI6WyJDb3Ntb3NJbml0S2V5VG9CcmlkZ2VJZCJdLCJXYWxsZXROYW1lIjpbIldhbGxldE5hbWUiXSwiVkJhbmtBY2NvdW50IjpbIlZCYW5rQWNjb3VudCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC8BYikOwUAADsFAAAqAAAAQGFnb3JpYy9pbnRlcm5hbC12MC40LjAtdTIxLjAvc3JjL2RlYnVnLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlVHJhY2VyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8vXG5cbmxldCBkZWJ1Z0luc3RhbmNlID0gMTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlVHJhY2VyID0gKG5hbWUsIGVuYWJsZSA9IHRydWUpID0+IHtcbiAgZGVidWdJbnN0YW5jZSArPSAxO1xuICBsZXQgZGVidWdDb3VudCA9IDE7XG4gIGNvbnN0IGtleSA9IGAtLS0tLSAke25hbWV9LiR7ZGVidWdJbnN0YW5jZX0gYDtcbiAgLy9cbiAgc3dpdGNoIChlbmFibGUpIHtcbiAgICBjYXNlIGZhbHNlOiB7XG4gICAgICBjb25zdCBsb2dEaXNhYmxlZCA9ICguLi5fYXJncykgPT4ge307XG4gICAgICByZXR1cm4gbG9nRGlzYWJsZWQ7XG4gICAgfVxuICAgIGNhc2UgJ3ZlcmJvc2UnOiB7XG4gICAgICBjb25zdCBpbmZvVGljayA9IChvcHRMb2csIC4uLmFyZ3MpID0+IHtcbiAgICAgICAgaWYgKG9wdExvZy5sb2cpIHtcbiAgICAgICAgICBjb25zb2xlLmluZm8oa2V5LCAoZGVidWdDb3VudCArPSAxKSwgLi4uYXJncyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgY29uc29sZS5pbmZvKGtleSwgKGRlYnVnQ291bnQgKz0gMSksIG9wdExvZywgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZXR1cm4gaW5mb1RpY2s7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGNvbnN0IGRlYnVnVGljayA9IChvcHRMb2csIC4uLmFyZ3MpID0+IHtcbiAgICAgICAgaWYgKG9wdExvZy5sb2cpIHtcbiAgICAgICAgICBvcHRMb2cubG9nKGtleSwgKGRlYnVnQ291bnQgKz0gMSksIC4uLmFyZ3MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhrZXksIChkZWJ1Z0NvdW50ICs9IDEpLCBvcHRMb2csIC4uLmFyZ3MpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgcmV0dXJuIGRlYnVnVGljaztcbiAgICB9XG4gIH1cbn07JGjNj19vbmNlLm1ha2VUcmFjZXIobWFrZVRyYWNlcik7XG5oYXJkZW4obWFrZVRyYWNlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlVHJhY2VyIjpbIm1ha2VUcmFjZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA+tsENbECAACxAgAAKwAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuNC4wLXUyMS4wL3NyYy9lcnJvcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiTm9uTnVsbGlzaCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgTm9uTnVsbGlzaCA9ICh2YWwsIG9wdERldGFpbHMgPSBgdW5leHBlY3RlZCAke3EodmFsKX1gKSA9PiB7XG4gIGlmICh2YWwgIT0gbnVsbCkge1xuICAgIC8vXG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICBhc3NlcnQuZmFpbChvcHREZXRhaWxzKTtcbn07JGjNj19vbmNlLk5vbk51bGxpc2goTm9uTnVsbGlzaCk7XG5oYXJkZW4oTm9uTnVsbGlzaCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJOb25OdWxsaXNoIjpbIk5vbk51bGxpc2giXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAj9W4fWoEAABqBAAAKgAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuNC4wLXUyMS4wL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL2NvbmZpZy5qcyIsIi4vZGVidWcuanMiLCIuL2Vycm9ycy5qcyIsIi4vanMtdXRpbHMuanMiLCIuL21hcnNoYWwuanMiLCIuL21ldGhvZC10b29scy5qcyIsIi4vbWV0cmljcy5qcyIsIi4vbmF0dXJhbC1zb3J0LmpzIiwiLi9zZXMtdXRpbHMuanMiLCIuL3RtcERpci5qcyIsIi4vdHlwZUNoZWNrLmpzIiwiLi90eXBlR3VhcmRzLmpzIiwiLi90eXBlcy1pbmRleC5qcyJdLCJleHBvcnRzIjpbbnVsbF0sInJlZXhwb3J0cyI6WyIuL2NvbmZpZy5qcyIsIi4vZGVidWcuanMiLCIuL2Vycm9ycy5qcyIsIi4vanMtdXRpbHMuanMiLCIuL21ldGhvZC10b29scy5qcyIsIi4vbWV0cmljcy5qcyIsIi4vbmF0dXJhbC1zb3J0LmpzIiwiLi9zZXMtdXRpbHMuanMiLCIuL3RtcERpci5qcyIsIi4vdHlwZUNoZWNrLmpzIiwiLi90eXBlR3VhcmRzLmpzIiwiLi90eXBlcy1pbmRleC5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL2NvbmZpZy5qc1wiLCBbXV0sW1wiLi9kZWJ1Zy5qc1wiLCBbXV0sW1wiLi9lcnJvcnMuanNcIiwgW11dLFtcIi4vanMtdXRpbHMuanNcIiwgW11dLFtcIi4vbWFyc2hhbC5qc1wiLCBbXV0sW1wiLi9tZXRob2QtdG9vbHMuanNcIiwgW11dLFtcIi4vbWV0cmljcy5qc1wiLCBbXV0sW1wiLi9uYXR1cmFsLXNvcnQuanNcIiwgW11dLFtcIi4vc2VzLXV0aWxzLmpzXCIsIFtdXSxbXCIuL3RtcERpci5qc1wiLCBbXV0sW1wiLi90eXBlQ2hlY2suanNcIiwgW11dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbXV0sW1wiLi90eXBlcy1pbmRleC5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vbWFyc2hhbC5qcyI6W1sicHVyZURhdGFNYXJzaGFsbGVyIiwicHVyZURhdGFNYXJzaGFsbGVyIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC0hnKwIxMAACMTAAAtAAAAQGFnb3JpYy9pbnRlcm5hbC12MC40LjAtdTIxLjAvc3JjL2pzLXV0aWxzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJUUlVFIiwiZGVlcENvcHlKc29uYWJsZSIsImRlZXBNYXBPYmplY3QiLCJkZWZpbmVOYW1lIiwiZnJvbVR5cGVkRW50cmllcyIsImxvZ0xldmVscyIsIm1ha2VNZWFzdXJlU2Vjb25kcyIsIm9iamVjdE1hcE11dGFibGUiLCJwcm92aWRlTGF6eU1hcCIsInR5cGVkRW50cmllcyIsInR5cGVkTWFwIiwidW5wcmVmaXhlZFByb3BlcnRpZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Ly9cbi8vXG4vKlxuXG5cbiAqL1xuXG5jb25zdCB7IGRlZmluZVByb3BlcnR5IH0gPSBPYmplY3Q7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICBjb25zdCBUUlVFID0gLyogICAgICAgICAgICAgICAgKi8gKHRydWUpO1xuXG4vKlxuXG5cblxuICovJGjNj19vbmNlLlRSVUUoVFJVRSk7XG4gICAgICAgY29uc3QgdHlwZWRFbnRyaWVzID0gLyogICAgICAgICAgICAgICAgICAgICAgICovIChPYmplY3QuZW50cmllcyk7XG5cbi8qXG5cblxuXG5cblxuICovJGjNj19vbmNlLnR5cGVkRW50cmllcyh0eXBlZEVudHJpZXMpO1xuICAgICAgIGNvbnN0IGZyb21UeXBlZEVudHJpZXMgPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChcbiAgT2JqZWN0LmZyb21FbnRyaWVzXG4pO1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UuZnJvbVR5cGVkRW50cmllcyhmcm9tVHlwZWRFbnRyaWVzKTtcbiAgICAgICBjb25zdCB0eXBlZE1hcCA9IC8qICAgICAgICAgICAgICAgICAgICovIChcbiAgRnVuY3Rpb24ucHJvdG90eXBlLmNhbGwuYmluZChBcnJheS5wcm90b3R5cGUubWFwKVxuKTskaM2PX29uY2UudHlwZWRNYXAodHlwZWRNYXApO1xuXG4gICAgICAgY29uc3QgbG9nTGV2ZWxzID0gLyogICAgICAgICAgICAgICAgKi8gKFtcbiAgJ2RlYnVnJyxcbiAgJ2xvZycsXG4gICdpbmZvJyxcbiAgJ3dhcm4nLFxuICAnZXJyb3InLFxuXSk7JGjNj19vbmNlLmxvZ0xldmVscyhsb2dMZXZlbHMpO1xuT2JqZWN0LmZyZWV6ZShsb2dMZXZlbHMpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBkZWVwQ29weUpzb25hYmxlID0gdmFsdWUgPT4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeSh2YWx1ZSkpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5kZWVwQ29weUpzb25hYmxlKGRlZXBDb3B5SnNvbmFibGUpO1xuY29uc3QgZGVlcE1hcE9iamVjdEludGVybmFsID0gKHZhbHVlLCBuYW1lLCBjb250YWluZXIsIG1hcHBlcikgPT4ge1xuICBpZiAoY29udGFpbmVyICYmIHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJykge1xuICAgIGNvbnN0IG1hcHBlZCA9IG1hcHBlcih2YWx1ZSwgbmFtZSwgY29udGFpbmVyKTtcbiAgICBpZiAobWFwcGVkICE9PSB2YWx1ZSkge1xuICAgICAgcmV0dXJuIG1hcHBlZDtcbiAgICB9XG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlICE9PSAnb2JqZWN0JyB8fCAhdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBsZXQgd2FzTWFwcGVkID0gZmFsc2U7XG4gIGNvbnN0IHZhbHVlT2JqID0gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKHZhbHVlKTtcbiAgLypcblxuXG5cbiAgICovXG4gIGNvbnN0IG1hcEVudHJ5ID0gKFtpbm5lck5hbWUsIGlubmVyVmFsdWVdKSA9PiB7XG4gICAgY29uc3QgbWFwcGVkSW5uZXJWYWx1ZSA9IGRlZXBNYXBPYmplY3RJbnRlcm5hbChcbiAgICAgIGlubmVyVmFsdWUsXG4gICAgICBpbm5lck5hbWUsXG4gICAgICB2YWx1ZU9iaixcbiAgICAgIG1hcHBlcixcbiAgICApO1xuICAgIHdhc01hcHBlZCB8fD0gbWFwcGVkSW5uZXJWYWx1ZSAhPT0gaW5uZXJWYWx1ZTtcbiAgICByZXR1cm4gW2lubmVyTmFtZSwgLyogICAgICAgICAgICAgICovIChtYXBwZWRJbm5lclZhbHVlKV07XG4gIH07XG4gIGNvbnN0IG1hcHBlZEVudHJpZXMgPSB0eXBlZEVudHJpZXModmFsdWVPYmopLm1hcChtYXBFbnRyeSk7XG5cbiAgaWYgKCF3YXNNYXBwZWQpIHtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICBjb25zdCBtYXBwZWRPYmogPSBmcm9tVHlwZWRFbnRyaWVzKG1hcHBlZEVudHJpZXMpO1xuICByZXR1cm4gLyogICAgICAgICAgICAgICovIChtYXBwZWRPYmopO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBkZWVwTWFwT2JqZWN0ID0gKG9iaiwgbWFwcGVyKSA9PlxuICAvKiAgICAgICAgICAgICAgKi8gKGRlZXBNYXBPYmplY3RJbnRlcm5hbChvYmosIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCBtYXBwZXIpKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5kZWVwTWFwT2JqZWN0KGRlZXBNYXBPYmplY3QpO1xuICAgICAgIGNvbnN0IGRlZmluZU5hbWUgPSAobmFtZSwgZm4pID0+XG4gIGRlZmluZVByb3BlcnR5KGZuLCAnbmFtZScsIHsgdmFsdWU6IG5hbWUgfSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmRlZmluZU5hbWUoZGVmaW5lTmFtZSk7XG4gICAgICAgY29uc3Qgb2JqZWN0TWFwTXV0YWJsZSA9IChvYmosIG1hcHBlcikgPT4ge1xuICBjb25zdCBvbGRFbnRyaWVzID0gdHlwZWRFbnRyaWVzKG9iaik7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hcEVudHJ5ID0gKFtrLCB2XSkgPT4gW2ssIG1hcHBlcih2LCBrKV07XG4gIGNvbnN0IG5ld0VudHJpZXMgPSB0eXBlZE1hcChvbGRFbnRyaWVzLCBtYXBFbnRyeSk7XG4gIGNvbnN0IG5ld09iaiA9IGZyb21UeXBlZEVudHJpZXMobmV3RW50cmllcyk7XG4gIHJldHVybiAvKiAgICAgICAgICAgICAgKi8gKG5ld09iaik7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2Uub2JqZWN0TWFwTXV0YWJsZShvYmplY3RNYXBNdXRhYmxlKTtcbiAgICAgICBjb25zdCBwcm92aWRlTGF6eU1hcCA9IChtYXAsIGtleSwgbWFrZVZhbHVlKSA9PiB7XG4gIGNvbnN0IGZvdW5kID0gbWFwLmdldChrZXkpO1xuICBpZiAoZm91bmQgIT09IHVuZGVmaW5lZCB8fCBtYXAuaGFzKGtleSkpIHtcbiAgICByZXR1cm4gLyogICAgICAgICAgICAqLyAoZm91bmQpO1xuICB9XG4gIGNvbnN0IHZhbHVlID0gbWFrZVZhbHVlKGtleSk7XG4gIG1hcC5zZXQoa2V5LCB2YWx1ZSk7XG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbi8qXG5cblxuXG5cblxuICovJGjNj19vbmNlLnByb3ZpZGVMYXp5TWFwKHByb3ZpZGVMYXp5TWFwKTtcbiAgICAgICBjb25zdCBtYWtlTWVhc3VyZVNlY29uZHMgPSBjdXJyZW50VGltZU1pbGxpc2VjID0+IHtcbiAgLypcblxuXG5cbiAgICovXG4gIGNvbnN0IG1lYXN1cmVTZWNvbmRzID0gYXN5bmMgZm4gPT4ge1xuICAgIGNvbnN0IHQwID0gY3VycmVudFRpbWVNaWxsaXNlYygpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZuKCk7XG4gICAgY29uc3QgZHVyYXRpb25NaWxsaXNlYyA9IGN1cnJlbnRUaW1lTWlsbGlzZWMoKSAtIHQwO1xuICAgIHJldHVybiB7IHJlc3VsdCwgZHVyYXRpb246IGR1cmF0aW9uTWlsbGlzZWMgLyAxMDAwIH07XG4gIH07XG4gIHJldHVybiBtZWFzdXJlU2Vjb25kcztcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UubWFrZU1lYXN1cmVTZWNvbmRzKG1ha2VNZWFzdXJlU2Vjb25kcyk7XG4gICAgICAgY29uc3QgdW5wcmVmaXhlZFByb3BlcnRpZXMgPSAob2JqLCBwcmVmaXgpID0+XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAqLyAoXG4gICAgZnJvbVR5cGVkRW50cmllcyhcbiAgICAgIHR5cGVkRW50cmllcyhvYmopXG4gICAgICAgIC5maWx0ZXIoKFtrZXldKSA9PiBrZXkuc3RhcnRzV2l0aChwcmVmaXgpKVxuICAgICAgICAubWFwKChba2V5LCB2YWx1ZV0pID0+IFtrZXkuc2xpY2UocHJlZml4Lmxlbmd0aCksIHZhbHVlXSksXG4gICAgKVxuICApOyRozY9fb25jZS51bnByZWZpeGVkUHJvcGVydGllcyh1bnByZWZpeGVkUHJvcGVydGllcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJUUlVFIjpbIlRSVUUiXSwidHlwZWRFbnRyaWVzIjpbInR5cGVkRW50cmllcyJdLCJmcm9tVHlwZWRFbnRyaWVzIjpbImZyb21UeXBlZEVudHJpZXMiXSwidHlwZWRNYXAiOlsidHlwZWRNYXAiXSwibG9nTGV2ZWxzIjpbImxvZ0xldmVscyJdLCJkZWVwQ29weUpzb25hYmxlIjpbImRlZXBDb3B5SnNvbmFibGUiXSwiZGVlcE1hcE9iamVjdCI6WyJkZWVwTWFwT2JqZWN0Il0sImRlZmluZU5hbWUiOlsiZGVmaW5lTmFtZSJdLCJvYmplY3RNYXBNdXRhYmxlIjpbIm9iamVjdE1hcE11dGFibGUiXSwicHJvdmlkZUxhenlNYXAiOlsicHJvdmlkZUxhenlNYXAiXSwibWFrZU1lYXN1cmVTZWNvbmRzIjpbIm1ha2VNZWFzdXJlU2Vjb25kcyJdLCJ1bnByZWZpeGVkUHJvcGVydGllcyI6WyJ1bnByZWZpeGVkUHJvcGVydGllcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABChW2i6RcAAOkXAAA1AAAAQGFnb3JpYy9pbnRlcm5hbC12MC40LjAtdTIxLjAvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZmFyIiwiQGVuZG8vcGF0dGVybnMiLCJAYWdvcmljL2Jhc2Utem9uZS9oZWFwLmpzIiwiLi9jYWxsYmFjay5qcyJdLCJleHBvcnRzIjpbIlN0cmVhbUNlbGxTaGFwZSIsImFzc2VydFBhdGhTZWdtZW50IiwiaXNTdHJlYW1DZWxsIiwibWFrZUNoYWluU3RvcmFnZVJvb3QiLCJtYWtlU2VyaWFsaXplVG9TdG9yYWdlIiwibWFrZVN0b3JhZ2VOb2RlQ2hpbGQiLCJwcmVwYXJlQ2hhaW5TdG9yYWdlTm9kZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsRSxGYXIsTSxtYWtlSGVhcFpvbmUsY2I7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXSxbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2Jhc2Utem9uZS9oZWFwLmpzXCIsIFtbXCJtYWtlSGVhcFpvbmVcIixbJGjNj19hID0+IChtYWtlSGVhcFpvbmUgPSAkaM2PX2EpXV1dXSxbXCIuL2NhbGxiYWNrLmpzXCIsIFtbXCIqXCIsWyRozY9fYSA9PiAoY2IgPSAkaM2PX2EpXV1dXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShtYWtlQ2hhaW5TdG9yYWdlUm9vdCwnbmFtZScse3ZhbHVlOlwibWFrZUNoYWluU3RvcmFnZVJvb3RcIn0pOyRozY9fb25jZS5tYWtlQ2hhaW5TdG9yYWdlUm9vdChtYWtlQ2hhaW5TdG9yYWdlUm9vdCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1ha2VTdG9yYWdlTm9kZUNoaWxkLCduYW1lJyx7dmFsdWU6XCJtYWtlU3RvcmFnZU5vZGVDaGlsZFwifSk7JGjNj19vbmNlLm1ha2VTdG9yYWdlTm9kZUNoaWxkKG1ha2VTdG9yYWdlTm9kZUNoaWxkKTtcblxuXG5cblxuXG5cblxuLypcblxuXG5cbiAqL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICBjb25zdCBTdHJlYW1DZWxsU2hhcGUgPSBoYXJkZW4oe1xuICBibG9ja0hlaWdodDogTS5zdHJpbmcoKSxcbiAgdmFsdWVzOiBNLmFycmF5KCksXG59KTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5TdHJlYW1DZWxsU2hhcGUoU3RyZWFtQ2VsbFNoYXBlKTtcblxuY29uc3QgQ2hhaW5TdG9yYWdlTm9kZUkgPSBNLmludGVyZmFjZSgnU3RvcmFnZU5vZGUnLCB7XG4gIHNldFZhbHVlOiBNLmNhbGxXaGVuKE0uc3RyaW5nKCkpLnJldHVybnMoKSxcbiAgZ2V0UGF0aDogTS5jYWxsKCkucmV0dXJucyhNLnN0cmluZygpKSxcbiAgZ2V0U3RvcmVLZXk6IE0uY2FsbFdoZW4oKS5yZXR1cm5zKE0ucmVjb3JkKCkpLFxuICBtYWtlQ2hpbGROb2RlOiBNLmNhbGwoTS5zdHJpbmcoKSlcbiAgICAub3B0aW9uYWwoTS5zcGxpdFJlY29yZCh7fSwgeyBzZXF1ZW5jZTogTS5ib29sZWFuKCkgfSwge30pKVxuICAgIC5yZXR1cm5zKE0ucmVtb3RhYmxlKCdTdG9yYWdlTm9kZScpKSxcbn0pO1xuXG4vKlxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgaXNTdHJlYW1DZWxsID0gY2VsbCA9PlxuICBjZWxsICYmXG4gIHR5cGVvZiBjZWxsID09PSAnb2JqZWN0JyAmJlxuICBBcnJheS5pc0FycmF5KGNlbGwudmFsdWVzKSAmJlxuICB0eXBlb2YgY2VsbC5ibG9ja0hlaWdodCA9PT0gJ3N0cmluZycgJiZcbiAgL14wJHxeWzEtOV1bMC05XSokLy50ZXN0KGNlbGwuYmxvY2tIZWlnaHQpOyRozY9fb25jZS5pc1N0cmVhbUNlbGwoaXNTdHJlYW1DZWxsKTtcbmhhcmRlbihpc1N0cmVhbUNlbGwpO1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuY29uc3QgcGF0aFNlZ21lbnRQYXR0ZXJuID0gL15bYS16QS1aMC05Xy1dezEsMTAwfSQvO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgYXNzZXJ0UGF0aFNlZ21lbnQgPSBuYW1lID0+IHtcbiAgcGF0aFNlZ21lbnRQYXR0ZXJuLnRlc3QobmFtZSkgfHxcbiAgICBGYWlsYFBhdGggc2VnbWVudCBuYW1lcyBtdXN0IGNvbnNpc3Qgb2YgMSB0byAxMDAgY2hhcmFjdGVycyBsaW1pdGVkIHRvIEFTQ0lJIGFscGhhbnVtZXJpY3MsIHVuZGVyc2NvcmVzLCBhbmQvb3IgZGFzaGVzOiAke25hbWV9YDtcbn07JGjNj19vbmNlLmFzc2VydFBhdGhTZWdtZW50KGFzc2VydFBhdGhTZWdtZW50KTtcbmhhcmRlbihhc3NlcnRQYXRoU2VnbWVudCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVDaGFpblN0b3JhZ2VOb2RlID0gem9uZSA9PiB7XG4gIC8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgbWFrZUNoYWluU3RvcmFnZU5vZGUgPSB6b25lLmV4b0NsYXNzKFxuICAgICdDaGFpblN0b3JhZ2VOb2RlJyxcbiAgICBDaGFpblN0b3JhZ2VOb2RlSSxcbiAgICAvKlxuXG5cblxuXG5cblxuICAgICAqL1xuICAgIChtZXNzZW5nZXIsIHBhdGgsIHsgc2VxdWVuY2UgPSBmYWxzZSB9ID0ge30pID0+IHtcbiAgICAgIGFzc2VydC50eXBlb2YocGF0aCwgJ3N0cmluZycpO1xuICAgICAgYXNzZXJ0LnR5cGVvZihzZXF1ZW5jZSwgJ2Jvb2xlYW4nKTtcbiAgICAgIHJldHVybiBoYXJkZW4oeyBwYXRoLCBtZXNzZW5nZXIsIHNlcXVlbmNlIH0pO1xuICAgIH0sXG4gICAge1xuICAgICAgZ2V0UGF0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RhdGUucGF0aDtcbiAgICAgIH0sXG4gICAgICAvKlxuXG5cbiAgICAgICAqL1xuICAgICAgYXN5bmMgZ2V0U3RvcmVLZXkoKSB7XG4gICAgICAgIGNvbnN0IHsgcGF0aCwgbWVzc2VuZ2VyIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICByZXR1cm4gY2IuY2FsbEUobWVzc2VuZ2VyLCB7XG4gICAgICAgICAgbWV0aG9kOiAnZ2V0U3RvcmVLZXknLFxuICAgICAgICAgIGFyZ3M6IFtwYXRoXSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgLypcblxuXG5cblxuICAgICAgICovXG4gICAgICBtYWtlQ2hpbGROb2RlKG5hbWUsIGNoaWxkTm9kZU9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IHNlcXVlbmNlLCBwYXRoLCBtZXNzZW5nZXIgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgIGFzc2VydFBhdGhTZWdtZW50KG5hbWUpO1xuICAgICAgICBjb25zdCBtZXJnZWRPcHRpb25zID0geyBzZXF1ZW5jZSwgLi4uY2hpbGROb2RlT3B0aW9ucyB9O1xuICAgICAgICByZXR1cm4gbWFrZUNoYWluU3RvcmFnZU5vZGUoXG4gICAgICAgICAgbWVzc2VuZ2VyLFxuICAgICAgICAgIGAke3BhdGh9LiR7bmFtZX1gLFxuICAgICAgICAgIG1lcmdlZE9wdGlvbnMsXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgIGFzeW5jIHNldFZhbHVlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHsgc2VxdWVuY2UsIHBhdGgsIG1lc3NlbmdlciB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgYXNzZXJ0LnR5cGVvZih2YWx1ZSwgJ3N0cmluZycpO1xuICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgbGV0IGVudHJ5O1xuICAgICAgICBpZiAoIXNlcXVlbmNlICYmICF2YWx1ZSkge1xuICAgICAgICAgIGVudHJ5ID0gW3BhdGhdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVudHJ5ID0gW3BhdGgsIHZhbHVlXTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBjYi5jYWxsRShtZXNzZW5nZXIsIHtcbiAgICAgICAgICBtZXRob2Q6IHNlcXVlbmNlID8gJ2FwcGVuZCcgOiAnc2V0JyxcbiAgICAgICAgICBhcmdzOiBbZW50cnldLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgfSxcbiAgKTtcbiAgcmV0dXJuIG1ha2VDaGFpblN0b3JhZ2VOb2RlO1xufTskaM2PX29uY2UucHJlcGFyZUNoYWluU3RvcmFnZU5vZGUocHJlcGFyZUNoYWluU3RvcmFnZU5vZGUpO1xuXG5jb25zdCBtYWtlSGVhcENoYWluU3RvcmFnZU5vZGUgPSBwcmVwYXJlQ2hhaW5TdG9yYWdlTm9kZShtYWtlSGVhcFpvbmUoKSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgZnVuY3Rpb24gbWFrZUNoYWluU3RvcmFnZVJvb3QoXG4gIGhhbmRsZVN0b3JhZ2VNZXNzYWdlLFxuICByb290UGF0aCxcbiAgcm9vdE9wdGlvbnMgPSB7fSxcbikge1xuICBjb25zdCBtZXNzZW5nZXIgPSBjYi5tYWtlRnVuY3Rpb25DYWxsYmFjayhoYW5kbGVTdG9yYWdlTWVzc2FnZSk7XG5cbiAgLy9cbiAgY29uc3Qgcm9vdE5vZGUgPSBtYWtlSGVhcENoYWluU3RvcmFnZU5vZGUobWVzc2VuZ2VyLCByb290UGF0aCwgcm9vdE9wdGlvbnMpO1xuICByZXR1cm4gcm9vdE5vZGU7XG59XG5cbi8qXG5cblxuICovXG5jb25zdCBtYWtlTnVsbFN0b3JhZ2VOb2RlID0gKCkgPT4ge1xuICAvL1xuICByZXR1cm4gbWFrZUNoYWluU3RvcmFnZVJvb3QoXG4gICAgRmFyKCdOdWxsTWVzc2VuZ2VyJywgKCkgPT4gbnVsbCksXG4gICAgJ251bGwnLFxuICApO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG4gICAgICAgYXN5bmMgZnVuY3Rpb24gbWFrZVN0b3JhZ2VOb2RlQ2hpbGQoc3RvcmFnZU5vZGVSZWYsIGNoaWxkTmFtZSkge1xuICBjb25zdCBleGlzdGluZ1N0b3JhZ2VOb2RlID0gYXdhaXQgc3RvcmFnZU5vZGVSZWY7XG4gIGNvbnN0IHN0b3JhZ2VOb2RlID0gZXhpc3RpbmdTdG9yYWdlTm9kZSB8fCBtYWtlTnVsbFN0b3JhZ2VOb2RlKCk7XG4gIHJldHVybiBFKHN0b3JhZ2VOb2RlKS5tYWtlQ2hpbGROb2RlKGNoaWxkTmFtZSk7XG59XG5oYXJkZW4obWFrZVN0b3JhZ2VOb2RlQ2hpbGQpO1xuXG4vL1xuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VTZXJpYWxpemVUb1N0b3JhZ2UgPSAoc3RvcmFnZU5vZGUsIG1hcnNoYWxsZXIpID0+IHtcbiAgcmV0dXJuIGFzeW5jIHZhbHVlID0+IHtcbiAgICBjb25zdCBtYXJzaGFsbGVkID0gYXdhaXQgRShtYXJzaGFsbGVyKS50b0NhcERhdGEodmFsdWUpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBKU09OLnN0cmluZ2lmeShtYXJzaGFsbGVkKTtcbiAgICByZXR1cm4gRShzdG9yYWdlTm9kZSkuc2V0VmFsdWUoc2VyaWFsaXplZCk7XG4gIH07XG59OyRozY9fb25jZS5tYWtlU2VyaWFsaXplVG9TdG9yYWdlKG1ha2VTZXJpYWxpemVUb1N0b3JhZ2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiU3RyZWFtQ2VsbFNoYXBlIjpbIlN0cmVhbUNlbGxTaGFwZSJdLCJpc1N0cmVhbUNlbGwiOlsiaXNTdHJlYW1DZWxsIl0sImFzc2VydFBhdGhTZWdtZW50IjpbImFzc2VydFBhdGhTZWdtZW50Il0sInByZXBhcmVDaGFpblN0b3JhZ2VOb2RlIjpbInByZXBhcmVDaGFpblN0b3JhZ2VOb2RlIl0sIm1ha2VDaGFpblN0b3JhZ2VSb290IjpbIm1ha2VDaGFpblN0b3JhZ2VSb290Il0sIm1ha2VTdG9yYWdlTm9kZUNoaWxkIjpbIm1ha2VTdG9yYWdlTm9kZUNoaWxkIl0sIm1ha2VTZXJpYWxpemVUb1N0b3JhZ2UiOlsibWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAQLx5+7xIAAO8SAAAsAAAAQGFnb3JpYy9pbnRlcm5hbC12MC40LjAtdTIxLjAvc3JjL21hcnNoYWwuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZmFyIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL3BhdHRlcm5zIiwiLi9saWItY2hhaW5TdG9yYWdlLmpzIl0sImV4cG9ydHMiOlsiQ2FwRGF0YVNoYXBlIiwiYXNzZXJ0Q2FwRGF0YSIsImJvYXJkU2xvdHRpbmdNYXJzaGFsbGVyIiwibWFrZUJvYXJkUmVtb3RlIiwibWFrZUhpc3RvcnlSZXZpdmVyIiwicHVyZURhdGFNYXJzaGFsbGVyIiwic2xvdFRvQm9hcmRSZW1vdGUiLCJ1bm1hcnNoYWxGcm9tVnN0b3JhZ2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLEZhcixtYWtlTWFyc2hhbCxNLGlzU3RyZWFtQ2VsbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIm1ha2VNYXJzaGFsXCIsWyRozY9fYSA9PiAobWFrZU1hcnNoYWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXSxbXCIuL2xpYi1jaGFpblN0b3JhZ2UuanNcIiwgW1tcImlzU3RyZWFtQ2VsbFwiLFskaM2PX2EgPT4gKGlzU3RyZWFtQ2VsbCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG4vKlxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi9cblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlQm9hcmRSZW1vdGUgPSAoeyBib2FyZElkLCBpZmFjZSB9KSA9PiB7XG4gIGNvbnN0IG5vbmFsbGVnZWQgPSBpZmFjZSA/IGlmYWNlLnJlcGxhY2UoL15BbGxlZ2VkOiAvLCAnJykgOiAnJztcbiAgcmV0dXJuIEZhcihgQm9hcmRSZW1vdGUke25vbmFsbGVnZWR9YCwgeyBnZXRCb2FyZElkOiAoKSA9PiBib2FyZElkIH0pO1xufTtcblxuLypcblxuXG4gKi8kaM2PX29uY2UubWFrZUJvYXJkUmVtb3RlKG1ha2VCb2FyZFJlbW90ZSk7XG4gICAgICAgY29uc3Qgc2xvdFRvQm9hcmRSZW1vdGUgPSAoYm9hcmRJZCwgaWZhY2UpID0+XG4gIG1ha2VCb2FyZFJlbW90ZSh7IGJvYXJkSWQsIGlmYWNlIH0pO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovJGjNj19vbmNlLnNsb3RUb0JvYXJkUmVtb3RlKHNsb3RUb0JvYXJkUmVtb3RlKTtcbmNvbnN0IGJvYXJkVmFsVG9TbG90ID0gdmFsID0+IHtcbiAgaWYgKCdnZXRCb2FyZElkJyBpbiB2YWwpIHtcbiAgICByZXR1cm4gdmFsLmdldEJvYXJkSWQoKTtcbiAgfVxuICB0aHJvdyBGYWlsYHVua25vd24gb2JqIGluIGJvYXJkU2xvdHRpbmdNYXJzaGFsbGVyLnZhbFRvU2xvdCAke3ZhbH1gO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGJvYXJkU2xvdHRpbmdNYXJzaGFsbGVyID0gKHNsb3RUb1ZhbCA9IHVuZGVmaW5lZCkgPT4ge1xuICByZXR1cm4gbWFrZU1hcnNoYWwoYm9hcmRWYWxUb1Nsb3QsIHNsb3RUb1ZhbCwge1xuICAgIHNlcmlhbGl6ZUJvZHlGb3JtYXQ6ICdzbWFsbGNhcHMnLFxuICB9KTtcbn07XG5cbi8vXG4vKlxuXG4gKi8kaM2PX29uY2UuYm9hcmRTbG90dGluZ01hcnNoYWxsZXIoYm9hcmRTbG90dGluZ01hcnNoYWxsZXIpO1xuICAgICAgIGNvbnN0IENhcERhdGFTaGFwZSA9IHsgYm9keTogTS5zdHJpbmcoKSwgc2xvdHM6IE0uYXJyYXkoKSB9OyRozY9fb25jZS5DYXBEYXRhU2hhcGUoQ2FwRGF0YVNoYXBlKTtcbmhhcmRlbihDYXBEYXRhU2hhcGUpO1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRDYXBEYXRhID0gZGF0YSA9PiB7XG4gIGFzc2VydC50eXBlb2YoZGF0YSwgJ29iamVjdCcpO1xuICBhc3NlcnQoZGF0YSk7XG4gIHR5cGVvZiBkYXRhLmJvZHkgPT09ICdzdHJpbmcnIHx8IEZhaWxgZGF0YSBoYXMgbm9uLXN0cmluZyAuYm9keSAke2RhdGEuYm9keX1gO1xuICBBcnJheS5pc0FycmF5KGRhdGEuc2xvdHMpIHx8IEZhaWxgZGF0YSBoYXMgbm9uLUFycmF5IHNsb3RzICR7ZGF0YS5zbG90c31gO1xufTskaM2PX29uY2UuYXNzZXJ0Q2FwRGF0YShhc3NlcnRDYXBEYXRhKTtcbmhhcmRlbihhc3NlcnRDYXBEYXRhKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgdW5tYXJzaGFsRnJvbVZzdG9yYWdlID0gKGRhdGEsIGtleSwgZnJvbUNhcERhdGEsIGluZGV4KSA9PiB7XG4gIGNvbnN0IHNlcmlhbGl6ZWQgPSBkYXRhLmdldChrZXkpIHx8IEZhaWxgbm8gZGF0YSBmb3IgJHtrZXl9YDtcbiAgYXNzZXJ0LnR5cGVvZihzZXJpYWxpemVkLCAnc3RyaW5nJyk7XG4gIGFzc2VydC50eXBlb2YoaW5kZXgsICdudW1iZXInKTtcblxuICBjb25zdCBzdHJlYW1DZWxsID0gSlNPTi5wYXJzZShzZXJpYWxpemVkKTtcbiAgaWYgKCFpc1N0cmVhbUNlbGwoc3RyZWFtQ2VsbCkpIHtcbiAgICB0aHJvdyBGYWlsYG5vdCBhIFN0cmVhbUNlbGw6ICR7c3RyZWFtQ2VsbH1gO1xuICB9XG5cbiAgY29uc3QgeyB2YWx1ZXMgfSA9IHN0cmVhbUNlbGw7XG4gIHZhbHVlcy5sZW5ndGggPiAwIHx8IEZhaWxgbm8gU3RyZWFtQ2VsbCB2YWx1ZXM6ICR7c3RyZWFtQ2VsbH1gO1xuXG4gIGNvbnN0IG1hcnNoYWxsZWQgPSB2YWx1ZXMuYXQoaW5kZXgpO1xuICBhc3NlcnQudHlwZW9mKG1hcnNoYWxsZWQsICdzdHJpbmcnKTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgY2FwRGF0YSA9IGhhcmRlbihKU09OLnBhcnNlKG1hcnNoYWxsZWQpKTtcbiAgYXNzZXJ0Q2FwRGF0YShjYXBEYXRhKTtcblxuICBjb25zdCB1bm1hcnNoYWxsZWQgPSBmcm9tQ2FwRGF0YShjYXBEYXRhKTtcbiAgcmV0dXJuIHVubWFyc2hhbGxlZDtcbn07JGjNj19vbmNlLnVubWFyc2hhbEZyb21Wc3RvcmFnZSh1bm1hcnNoYWxGcm9tVnN0b3JhZ2UpO1xuaGFyZGVuKHVubWFyc2hhbEZyb21Wc3RvcmFnZSk7XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VIaXN0b3J5UmV2aXZlciA9IChlbnRyaWVzLCBzbG90VG9WYWwgPSB1bmRlZmluZWQpID0+IHtcbiAgY29uc3QgYm9hcmQgPSBib2FyZFNsb3R0aW5nTWFyc2hhbGxlcihzbG90VG9WYWwpO1xuICBjb25zdCB2c01hcCA9IG5ldyBNYXAoZW50cmllcyk7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBmcm9tQ2FwRGF0YSA9ICguLi5hcmdzKSA9PlxuICAgIFJlZmxlY3QuYXBwbHkoYm9hcmQuZnJvbUNhcERhdGEsIGJvYXJkLCBhcmdzKTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBnZXRJdGVtID0ga2V5ID0+IHVubWFyc2hhbEZyb21Wc3RvcmFnZSh2c01hcCwga2V5LCBmcm9tQ2FwRGF0YSwgLTEpO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGNoaWxkcmVuID0gcHJlZml4ID0+IHtcbiAgICBwcmVmaXguZW5kc1dpdGgoJy4nKSB8fCBGYWlsYHByZWZpeCBtdXN0IGVuZCB3aXRoICcuJ2A7XG4gICAgcmV0dXJuIGhhcmRlbihbXG4gICAgICAuLi5uZXcgU2V0KFxuICAgICAgICBlbnRyaWVzXG4gICAgICAgICAgLm1hcCgoW2ssIF9dKSA9PiBrKVxuICAgICAgICAgIC5maWx0ZXIoayA9PiBrLnN0YXJ0c1dpdGgocHJlZml4KSlcbiAgICAgICAgICAubWFwKGsgPT4gay5zbGljZShwcmVmaXgubGVuZ3RoKS5zcGxpdCgnLicpWzBdKSxcbiAgICAgICksXG4gICAgXSk7XG4gIH07XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGhhcyA9IGsgPT4gdnNNYXAuZ2V0KGspICE9PSB1bmRlZmluZWQ7XG5cbiAgcmV0dXJuIGhhcmRlbih7IGdldEl0ZW0sIGNoaWxkcmVuLCBoYXMgfSk7XG59O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UubWFrZUhpc3RvcnlSZXZpdmVyKG1ha2VIaXN0b3J5UmV2aXZlcik7XG5jb25zdCByZWplY3RPQ2FwID0gY2FwID0+IEZhaWxgJHtjYXB9IGlzIG5vdCBwdXJlIGRhdGFgO1xuICAgICAgIGNvbnN0IHB1cmVEYXRhTWFyc2hhbGxlciA9IG1ha2VNYXJzaGFsKHJlamVjdE9DYXAsIHJlamVjdE9DYXAsIHtcbiAgc2VyaWFsaXplQm9keUZvcm1hdDogJ3NtYWxsY2FwcycsXG59KTskaM2PX29uY2UucHVyZURhdGFNYXJzaGFsbGVyKHB1cmVEYXRhTWFyc2hhbGxlcik7XG5oYXJkZW4ocHVyZURhdGFNYXJzaGFsbGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VCb2FyZFJlbW90ZSI6WyJtYWtlQm9hcmRSZW1vdGUiXSwic2xvdFRvQm9hcmRSZW1vdGUiOlsic2xvdFRvQm9hcmRSZW1vdGUiXSwiYm9hcmRTbG90dGluZ01hcnNoYWxsZXIiOlsiYm9hcmRTbG90dGluZ01hcnNoYWxsZXIiXSwiQ2FwRGF0YVNoYXBlIjpbIkNhcERhdGFTaGFwZSJdLCJhc3NlcnRDYXBEYXRhIjpbImFzc2VydENhcERhdGEiXSwidW5tYXJzaGFsRnJvbVZzdG9yYWdlIjpbInVubWFyc2hhbEZyb21Wc3RvcmFnZSJdLCJtYWtlSGlzdG9yeVJldml2ZXIiOlsibWFrZUhpc3RvcnlSZXZpdmVyIl0sInB1cmVEYXRhTWFyc2hhbGxlciI6WyJwdXJlRGF0YU1hcnNoYWxsZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAbng7jG0GAABtBgAAMQAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuNC4wLXUyMS4wL3NyYy9tZXRob2QtdG9vbHMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qcyJdLCJleHBvcnRzIjpbImJpbmRBbGxNZXRob2RzIiwiZ2V0TWV0aG9kTmFtZXMiLCJnZXRTdHJpbmdNZXRob2ROYW1lcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHJlYWxHZXRNZXRob2ROYW1lczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanNcIiwgW1tcImdldE1ldGhvZE5hbWVzXCIsWyRozY9fYSA9PiAocmVhbEdldE1ldGhvZE5hbWVzID0gJGjNj19hKV1dXV1dKTtcblxuXG4vKlxuXG5cbiAqL1xuXG5jb25zdCB7IGNyZWF0ZSwgZnJvbUVudHJpZXMgfSA9IE9iamVjdDtcbmNvbnN0IHsgYXBwbHkgfSA9IFJlZmxlY3Q7XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBnZXRNZXRob2ROYW1lcyA9IHZhbCA9PlxuICAvKiAgICAgICAgICAgICAgKi8gKHJlYWxHZXRNZXRob2ROYW1lcyh2YWwpKTskaM2PX29uY2UuZ2V0TWV0aG9kTmFtZXMoZ2V0TWV0aG9kTmFtZXMpO1xuaGFyZGVuKGdldE1ldGhvZE5hbWVzKTtcblxuLypcblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBnZXRTdHJpbmdNZXRob2ROYW1lcyA9IHZhbCA9PlxuICAvKiAgICAgICAgICAgICAgICAgICAqLyAoXG4gICAgcmVhbEdldE1ldGhvZE5hbWVzKHZhbCkuZmlsdGVyKG5hbWUgPT4gdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKVxuICApO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmdldFN0cmluZ01ldGhvZE5hbWVzKGdldFN0cmluZ01ldGhvZE5hbWVzKTtcbiAgICAgICBjb25zdCBiaW5kQWxsTWV0aG9kcyA9IG9iaiA9PlxuICBoYXJkZW4oXG4gICAgY3JlYXRlKFxuICAgICAgb2JqLFxuICAgICAgZnJvbUVudHJpZXMoXG4gICAgICAgIHJlYWxHZXRNZXRob2ROYW1lcyhvYmopLm1hcChuYW1lID0+IFtcbiAgICAgICAgICBuYW1lLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIHZhbHVlOiAoLyogICAgICAgICAgICAgICAgICAgICovIC4uLmFyZ3MpID0+XG4gICAgICAgICAgICAgIGFwcGx5KG9ialtuYW1lXSwgb2JqLCBhcmdzKSxcbiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSksXG4gICAgICApLFxuICAgICksXG4gICk7JGjNj19vbmNlLmJpbmRBbGxNZXRob2RzKGJpbmRBbGxNZXRob2RzKTtcbmhhcmRlbihiaW5kQWxsTWV0aG9kcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRNZXRob2ROYW1lcyI6WyJnZXRNZXRob2ROYW1lcyJdLCJnZXRTdHJpbmdNZXRob2ROYW1lcyI6WyJnZXRTdHJpbmdNZXRob2ROYW1lcyJdLCJiaW5kQWxsTWV0aG9kcyI6WyJiaW5kQWxsTWV0aG9kcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACyfarQyTYAAMk2AAAsAAAAQGFnb3JpYy9pbnRlcm5hbC12MC40LjAtdTIxLjAvc3JjL21ldHJpY3MuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vbmF0Il0sImV4cG9ydHMiOlsiQkxPQ0tfSElTVE9HUkFNX01FVFJJQ1MiLCJISVNUT0dSQU1fTUVUUklDUyIsIktFUk5FTF9TVEFUU19NRVRSSUNTIiwiS0VSTkVMX1NUQVRTX1NVTV9NRVRSSUNTIiwiS0VSTkVMX1NUQVRTX1VQRE9XTl9NRVRSSUNTIiwiUXVldWVNZXRyaWNBc3BlY3QiLCJtYWtlUXVldWVNZXRyaWNzIiwibWFrZVF1ZXVlTWV0cmljc01ldGEiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBxLGlzTmF0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL25hdFwiLCBbW1wiaXNOYXRcIixbJGjNj19hID0+IChpc05hdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLypcblxuXG4gKi9cblxuY29uc3QgSElTVE9HUkFNX01TX0xBVEVOQ1lfQk9VTkRBUklFUyA9IFtcbiAgNSxcbiAgMTAsXG4gIDI1LFxuICA1MCxcbiAgMTAwLFxuICAyNTAsXG4gIDUwMCxcbiAgMTAwMCxcbiAgMjUwMCxcbiAgNTAwMCxcbiAgMTAwMDAsXG4gIEluZmluaXR5LFxuXTtcbmNvbnN0IEhJU1RPR1JBTV9TRUNPTkRTX0xBVEVOQ1lfQk9VTkRBUklFUyA9XG4gIEhJU1RPR1JBTV9NU19MQVRFTkNZX0JPVU5EQVJJRVMubWFwKG1zID0+IG1zIC8gMTAwMCk7XG5cbi8vXG4vL1xuICAgICAgIGNvbnN0IEhJU1RPR1JBTV9NRVRSSUNTID0gLyogICAgICAgICAgICAgICAgKi8gKHtcbiAgc3dpbmdzZXRfY3JhbmtfcHJvY2Vzc2luZ190aW1lOiB7XG4gICAgZGVzY3JpcHRpb246ICdQcm9jZXNzaW5nIHRpbWUgcGVyIGNyYW5rIChtcyknLFxuICAgIHVuaXQ6ICdtcycsXG4gICAgYm91bmRhcmllczogQXJyYXkub2YoMSwgMTEsIDIxLCAzMSwgNDEsIDUxLCA2MSwgNzEsIDgxLCA5MSwgSW5maW5pdHkpLFxuICB9LFxuICBzd2luZ3NldF9ibG9ja19wcm9jZXNzaW5nX3NlY29uZHM6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1Byb2Nlc3NpbmcgdGltZSBwZXIgYmxvY2snLFxuICAgIHVuaXQ6ICdzJyxcbiAgICBib3VuZGFyaWVzOiBISVNUT0dSQU1fU0VDT05EU19MQVRFTkNZX0JPVU5EQVJJRVMsXG4gIH0sXG4gIHN3aW5nc2V0X3ZhdF9zdGFydHVwOiB7XG4gICAgZGVzY3JpcHRpb246ICdWYXQgc3RhcnR1cCB0aW1lIChtcyknLFxuICAgIHVuaXQ6ICdtcycsXG4gICAgYm91bmRhcmllczogSElTVE9HUkFNX01TX0xBVEVOQ1lfQk9VTkRBUklFUyxcbiAgfSxcbiAgc3dpbmdzZXRfdmF0X2RlbGl2ZXJ5OiB7XG4gICAgZGVzY3JpcHRpb246ICdWYXQgZGVsaXZlcnkgdGltZSAobXMpJyxcbiAgICB1bml0OiAnbXMnLFxuICAgIGJvdW5kYXJpZXM6IEhJU1RPR1JBTV9NU19MQVRFTkNZX0JPVU5EQVJJRVMsXG4gIH0sXG4gIHN3aW5nc2V0X21ldGVyX3VzYWdlOiB7XG4gICAgZGVzY3JpcHRpb246ICdWYXQgbWV0ZXIgdXNhZ2UnLFxuICAgIHVuaXQ6ICdtcycsXG4gICAgYm91bmRhcmllczogSElTVE9HUkFNX01TX0xBVEVOQ1lfQk9VTkRBUklFUyxcbiAgfSxcbn0pOyRozY9fb25jZS5ISVNUT0dSQU1fTUVUUklDUyhISVNUT0dSQU1fTUVUUklDUyk7XG5cbmNvbnN0IGJsb2NrSGlzdG9ncmFtTWV0cmljRGVzYyA9IHtcbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgdW5pdDogJ3MnLFxuICBhZHZpY2U6IHtcbiAgICBleHBsaWNpdEJ1Y2tldEJvdW5kYXJpZXM6IFtcbiAgICAgIDAuMSwgMC4yLCAwLjMsIDAuNCwgMC41LCAxLCAyLCAzLCA0LCA1LCA2LCA3LCAxMCwgMTUsIDMwLFxuICAgIF0sXG4gIH0sXG59O1xuICAgICAgIGNvbnN0IEJMT0NLX0hJU1RPR1JBTV9NRVRSSUNTID0gLyogICAgICAgICAgICAgICAgKi8gKHtcbiAgc3dpbmdzZXRSdW5TZWNvbmRzOiB7XG4gICAgZGVzY3JpcHRpb246ICdQZXItYmxvY2sgdGltZSBzcGVudCBleGVjdXRpbmcgU3dpbmdTZXQnLFxuICAgIC4uLmJsb2NrSGlzdG9ncmFtTWV0cmljRGVzYyxcbiAgfSxcbiAgc3dpbmdzZXRDaGFpblNhdmVTZWNvbmRzOiB7XG4gICAgZGVzY3JpcHRpb246ICdQZXItYmxvY2sgdGltZSBzcGVudCBwcm9wYWdhdGluZyBTd2luZ1NldCBzdGF0ZSBpbnRvIGNvc21vcycsXG4gICAgLi4uYmxvY2tIaXN0b2dyYW1NZXRyaWNEZXNjLFxuICB9LFxuICBzd2luZ3NldENvbW1pdFNlY29uZHM6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdQZXItYmxvY2sgdGltZSBzcGVudCBjb21taXR0aW5nIFN3aW5nU2V0IHN0YXRlIHRvIGhvc3Qgc3RvcmFnZScsXG4gICAgLi4uYmxvY2tIaXN0b2dyYW1NZXRyaWNEZXNjLFxuICB9LFxuICBjb3Ntb3NDb21taXRTZWNvbmRzOiB7XG4gICAgZGVzY3JpcHRpb246ICdQZXItYmxvY2sgdGltZSBzcGVudCBjb21taXR0aW5nIGNvc21vcyBzdGF0ZScsXG4gICAgLi4uYmxvY2tIaXN0b2dyYW1NZXRyaWNEZXNjLFxuICB9LFxuICBmdWxsQ29tbWl0U2Vjb25kczoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1Blci1ibG9jayB0aW1lIHNwZW50IGNvbW1pdHRpbmcgc3RhdGUsIGluY2x1c2l2ZSBvZiBDT01NSVRfQkxPQ0sgcHJvY2Vzc2luZyBwbHVzIHRpbWUgc3BlbnQgW291dHNpZGUgb2YgY29zbWljLXN3aW5nc2V0XSBiZWZvcmUgYW5kIGFmdGVyIGl0JyxcbiAgICAuLi5ibG9ja0hpc3RvZ3JhbU1ldHJpY0Rlc2MsXG4gIH0sXG4gIGludGVyQmxvY2tTZWNvbmRzOiB7XG4gICAgZGVzY3JpcHRpb246ICdUaW1lIHNwZW50IGlkbGUgYmV0d2VlbiBibG9ja3MnLFxuICAgIC4uLmJsb2NrSGlzdG9ncmFtTWV0cmljRGVzYyxcbiAgfSxcbiAgYWZ0ZXJDb21taXRIYW5nb3ZlclNlY29uZHM6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdQZXItYmxvY2sgdGltZSBzcGVudCB3YWl0aW5nIGZvciBwcmV2aW91cy1ibG9jayBhZnRlckNvbW1pdCB3b3JrJyxcbiAgICAuLi5ibG9ja0hpc3RvZ3JhbU1ldHJpY0Rlc2MsXG4gIH0sXG4gIGJsb2NrTGFnU2Vjb25kczoge1xuICAgIGRlc2NyaXB0aW9uOiAnVGhlIGRlbGF5IG9mIGVhY2ggYmxvY2sgZnJvbSBpdHMgZXhwZWN0ZWQgYmVnaW4gdGltZScsXG4gICAgLi4uYmxvY2tIaXN0b2dyYW1NZXRyaWNEZXNjLFxuICAgIC8vXG4gICAgYWR2aWNlOiB7XG4gICAgICAuLi5ibG9ja0hpc3RvZ3JhbU1ldHJpY0Rlc2MuYWR2aWNlLFxuICAgICAgZXhwbGljaXRCdWNrZXRCb3VuZGFyaWVzOiAvKiAgICAgICAgICAgICAgICAgICAqLyAoW1xuICAgICAgICAuLi5ibG9ja0hpc3RvZ3JhbU1ldHJpY0Rlc2MuYWR2aWNlLmV4cGxpY2l0QnVja2V0Qm91bmRhcmllcyxcbiAgICAgICAgLi4uWzYwLCAxMjAsIDE4MCwgMjQwLCAzMDAsIDYwMCwgMzYwMF0sXG4gICAgICBdKSxcbiAgICB9LFxuICB9LFxufSk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UuQkxPQ0tfSElTVE9HUkFNX01FVFJJQ1MoQkxPQ0tfSElTVE9HUkFNX01FVFJJQ1MpO1xuICAgICAgIGNvbnN0IFF1ZXVlTWV0cmljQXNwZWN0ID0gLyogICAgICAgICAgICAgICAgKi8gKHtcbiAgTGVuZ3RoOiAnbGVuZ3RoJyxcbiAgSW5jcmVtZW50Q291bnQ6ICdpbmNyZW1lbnRzJyxcbiAgRGVjcmVtZW50Q291bnQ6ICdkZWNyZW1lbnRzJyxcbn0pO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5RdWV1ZU1ldHJpY0FzcGVjdChRdWV1ZU1ldHJpY0FzcGVjdCk7XG4gICAgICAgY29uc3QgbWFrZVF1ZXVlTWV0cmljc01ldGEgPSAobmFtZVByZWZpeCwgZGVzY1ByZWZpeCkgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1ldHJpY3NNZXRhID0gW1xuICAgIFtRdWV1ZU1ldHJpY0FzcGVjdC5MZW5ndGgsICdsZW5ndGgnLCAnbGVuZ3RoJ10sXG4gICAgW1F1ZXVlTWV0cmljQXNwZWN0LkluY3JlbWVudENvdW50LCAnYWRkJywgJ2luY3JlbWVudHMnXSxcbiAgICBbUXVldWVNZXRyaWNBc3BlY3QuRGVjcmVtZW50Q291bnQsICdyZW1vdmUnLCAnZGVjcmVtZW50cyddLFxuICBdO1xuICBjb25zdCBlbnRyaWVzID0gbWV0cmljc01ldGEubWFwKChbYXNwZWN0LCBuYW1lU3VmZml4LCBkZXNjU3VmZml4XSkgPT4ge1xuICAgIGNvbnN0IG5hbWUgPSBgJHtuYW1lUHJlZml4fV8ke25hbWVTdWZmaXh9YDtcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IGAke2Rlc2NQcmVmaXh9ICR7ZGVzY1N1ZmZpeH1gO1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICByZXR1cm4gW2FzcGVjdCwgeyBuYW1lLCBvcHRpb25zOiB7IGRlc2NyaXB0aW9uIH0gfV07XG4gIH0pO1xuICByZXR1cm4gT2JqZWN0LmZyb21FbnRyaWVzKGVudHJpZXMpO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UubWFrZVF1ZXVlTWV0cmljc01ldGEobWFrZVF1ZXVlTWV0cmljc01ldGEpO1xuICAgICAgIGNvbnN0IG1ha2VRdWV1ZU1ldHJpY3MgPSAoe1xuICBvdGVsTWV0ZXIsXG4gIG5hbWVQcmVmaXgsXG4gIGRlc2NQcmVmaXgsXG4gIGNvbnNvbGUsXG59KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBbUXVldWVNZXRyaWNBc3BlY3QuTGVuZ3RoXTogbGVuZ3RoTWV0YSxcbiAgICBbUXVldWVNZXRyaWNBc3BlY3QuSW5jcmVtZW50Q291bnRdOiB1cE1ldGEsXG4gICAgW1F1ZXVlTWV0cmljQXNwZWN0LkRlY3JlbWVudENvdW50XTogZG93bk1ldGEsXG4gIH0gPSBtYWtlUXVldWVNZXRyaWNzTWV0YShuYW1lUHJlZml4LCBkZXNjUHJlZml4KTtcbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgbGVuZ3RoQ291bnRlciA9IG90ZWxNZXRlci5jcmVhdGVVcERvd25Db3VudGVyKFxuICAgIGxlbmd0aE1ldGEubmFtZSxcbiAgICBsZW5ndGhNZXRhLm9wdGlvbnMsXG4gICk7XG4gIC8vXG4gIC8vXG4gIGNvbnN0IHVwQ291bnRlciA9IG90ZWxNZXRlci5jcmVhdGVPYnNlcnZhYmxlQ291bnRlcihcbiAgICB1cE1ldGEubmFtZSxcbiAgICB1cE1ldGEub3B0aW9ucyxcbiAgKTtcbiAgY29uc3QgZG93bkNvdW50ZXIgPSBvdGVsTWV0ZXIuY3JlYXRlT2JzZXJ2YWJsZUNvdW50ZXIoXG4gICAgZG93bk1ldGEubmFtZSxcbiAgICBkb3duTWV0YS5vcHRpb25zLFxuICApO1xuICBjb25zdCBpbmNyZW1lbnRzID0gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChuZXcgTWFwKCkpO1xuICBjb25zdCBkZWNyZW1lbnRzID0gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChuZXcgTWFwKCkpO1xuICB1cENvdW50ZXIuYWRkQ2FsbGJhY2sob2JzZXJ2ZXIgPT4ge1xuICAgIGZvciAoY29uc3QgW3F1ZXVlTmFtZSwgdmFsdWVdIG9mIGluY3JlbWVudHMuZW50cmllcygpKSB7XG4gICAgICBvYnNlcnZlci5vYnNlcnZlKHZhbHVlLCB7IHF1ZXVlOiBxdWV1ZU5hbWUgfSk7XG4gICAgfVxuICB9KTtcbiAgZG93bkNvdW50ZXIuYWRkQ2FsbGJhY2sob2JzZXJ2ZXIgPT4ge1xuICAgIGZvciAoY29uc3QgW3F1ZXVlTmFtZSwgdmFsdWVdIG9mIGRlY3JlbWVudHMuZW50cmllcygpKSB7XG4gICAgICBvYnNlcnZlci5vYnNlcnZlKHZhbHVlLCB7IHF1ZXVlOiBxdWV1ZU5hbWUgfSk7XG4gICAgfVxuICB9KTtcblxuICBsZXQgcmVhZHkgPSBmYWxzZTtcbiAgY29uc3QgbGVuZ3RocyA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAobmV3IE1hcCgpKTtcbiAgY29uc3QgbnVkZ2UgPSAocXVldWVOYW1lLCBkZWx0YSwgaW5pdCA9IGZhbHNlKSA9PiB7XG4gICAgaWYgKCFsZW5ndGhzLmhhcyhxdWV1ZU5hbWUpKSB7XG4gICAgICBpZiAoIWluaXQpIGNvbnNvbGU/Lndhcm4oJ1Vua25vd24gcXVldWUnLCBxdWV1ZU5hbWUpO1xuICAgICAgbGVuZ3Rocy5zZXQocXVldWVOYW1lLCAwKTtcbiAgICAgIGluY3JlbWVudHMuc2V0KHF1ZXVlTmFtZSwgMCk7XG4gICAgICBkZWNyZW1lbnRzLnNldChxdWV1ZU5hbWUsIDApO1xuICAgIH1cbiAgICBjb25zdCBvbGRMZW5ndGggPSBsZW5ndGhzLmdldChxdWV1ZU5hbWUpO1xuICAgIGxlbmd0aHMuc2V0KHF1ZXVlTmFtZSwgb2xkTGVuZ3RoICsgZGVsdGEpO1xuICAgIGNvbnN0IGRpbWVuc2lvbnMgPSB7IHF1ZXVlOiBxdWV1ZU5hbWUgfTtcbiAgICBsZW5ndGhDb3VudGVyLmFkZChkZWx0YSwgZGltZW5zaW9ucyk7XG4gICAgaWYgKGluaXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IGVsc2UgaWYgKGRlbHRhID4gMCkge1xuICAgICAgLy9cbiAgICAgIGluY3JlbWVudHMuc2V0KHF1ZXVlTmFtZSwgKGluY3JlbWVudHMuZ2V0KHF1ZXVlTmFtZSkgfHwgMCkgKyBkZWx0YSk7XG4gICAgfSBlbHNlIGlmIChkZWx0YSA8IDApIHtcbiAgICAgIC8vXG4gICAgICBkZWNyZW1lbnRzLnNldChxdWV1ZU5hbWUsIChkZWNyZW1lbnRzLmdldChxdWV1ZU5hbWUpIHx8IDApIC0gZGVsdGEpO1xuICAgIH1cbiAgICByZWFkeSA9IHRydWU7XG4gIH07XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgaW5pdExlbmd0aHM6IGluaXRpYWxMZW5ndGhzID0+IHtcbiAgICAgICFyZWFkeSB8fFxuICAgICAgICBjb25zb2xlPy53YXJuKFxuICAgICAgICAgIGBVbmV4cGVjdGVkIHJlcGVhdCBxdWV1ZSBsZW5ndGggaW5pdGlhbGl6YXRpb24gZnJvbSAke3EobGVuZ3Rocyl9IHRvICR7cShpbml0aWFsTGVuZ3Rocyl9YFxuICAgICAgICApO1xuICAgICAgZm9yIChjb25zdCBbcXVldWVOYW1lLCBuZXdMZW5ndGhdIG9mIE9iamVjdC5lbnRyaWVzKGluaXRpYWxMZW5ndGhzKSkge1xuICAgICAgICBpZiAoIWlzTmF0KG5ld0xlbmd0aCkpIHtcbiAgICAgICAgICBjb25zb2xlPy53YXJuKGBJbnZhbGlkIGxlbmd0aCBmb3IgcXVldWUgJHtxKHF1ZXVlTmFtZSl9OmAsIG5ld0xlbmd0aCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbnVkZ2UocXVldWVOYW1lLCBuZXdMZW5ndGgsIHRydWUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXBkYXRlTGVuZ3RoczogbmV3TGVuZ3RocyA9PiB7XG4gICAgICByZWFkeSB8fCBjb25zb2xlPy53YXJuKCdNaXNzaW5nIGluaXRpYWwgcXVldWUgbGVuZ3RocycpO1xuICAgICAgZm9yIChjb25zdCBbcXVldWVOYW1lLCBuZXdMZW5ndGhdIG9mIE9iamVjdC5lbnRyaWVzKG5ld0xlbmd0aHMpKSB7XG4gICAgICAgIGlmICghaXNOYXQobmV3TGVuZ3RoKSkge1xuICAgICAgICAgIGNvbnNvbGU/Lndhcm4oYEludmFsaWQgbGVuZ3RoIGZvciBxdWV1ZSAke3EocXVldWVOYW1lKX06YCwgbmV3TGVuZ3RoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBudWRnZShxdWV1ZU5hbWUsIG5ld0xlbmd0aCAtIChsZW5ndGhzLmdldChxdWV1ZU5hbWUpIHx8IDApKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGluY0xlbmd0aDogKHF1ZXVlTmFtZSwgZGVsdGEgPSAxKSA9PiB7XG4gICAgICBpZiAoIWlzTmF0KGRlbHRhKSkge1xuICAgICAgICBjb25zb2xlPy53YXJuKGBJbnZhbGlkIGluY3JlbWVudCBmb3IgcXVldWUgJHtxKHF1ZXVlTmFtZSl9OmAsIGRlbHRhKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbnVkZ2UocXVldWVOYW1lLCBkZWx0YSk7XG4gICAgfSxcbiAgICBkZWNMZW5ndGg6IChxdWV1ZU5hbWUsIGRlbHRhID0gMSkgPT4ge1xuICAgICAgaWYgKCFpc05hdChkZWx0YSkpIHtcbiAgICAgICAgY29uc29sZT8ud2FybihgSW52YWxpZCBkZWNyZW1lbnQgZm9yIHF1ZXVlICR7cShxdWV1ZU5hbWUpfTpgLCBkZWx0YSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG51ZGdlKHF1ZXVlTmFtZSwgLWRlbHRhKTtcbiAgICB9LFxuICB9KTtcbn07XG5cbi8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovJGjNj19vbmNlLm1ha2VRdWV1ZU1ldHJpY3MobWFrZVF1ZXVlTWV0cmljcyk7XG5jb25zdCBNZXRyaWNUeXBlID0gLyogICAgICAgICAgICAgICAgKi8gKHtcbiAgQ291bnRlcjogJ2NvdW50ZXInLFxuICBHYXVnZTogJ2dhdWdlJyxcbn0pO1xuLypcblxuXG5cblxuXG5cblxuICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgIGNvbnN0IEtFUk5FTF9TVEFUU19TVU1fTUVUUklDUyA9IFtcbiAge1xuICAgIGtleTogJ3N5c2NhbGxzJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfYWxsX3N5c2NhbGxfdG90YWwnLFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IGtlcm5lbCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdzeXNjYWxsU2VuZCcsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3N5c2NhbGxfdG90YWwnLFxuICAgIHN1YjogeyBkaW1lbnNpb246ICdzeXNjYWxsJywgdmFsdWU6ICdzZW5kJyB9LFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IG1lc3NhZ2Ugc2VuZCBrZXJuZWwgY2FsbHMnLFxuICB9LFxuICB7XG4gICAga2V5OiAnc3lzY2FsbENhbGxOb3cnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9zeXNjYWxsX3RvdGFsJyxcbiAgICBzdWI6IHsgZGltZW5zaW9uOiAnc3lzY2FsbCcsIHZhbHVlOiAnY2FsbE5vdycgfSxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCBzeW5jaHJvbm91cyBkZXZpY2Uga2VybmVsIGNhbGxzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3N5c2NhbGxTdWJzY3JpYmUnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9zeXNjYWxsX3RvdGFsJyxcbiAgICBzdWI6IHsgZGltZW5zaW9uOiAnc3lzY2FsbCcsIHZhbHVlOiAnc3Vic2NyaWJlJyB9LFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IHByb21pc2Ugc3Vic2NyaXB0aW9uIGtlcm5lbCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdzeXNjYWxsUmVzb2x2ZScsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3N5c2NhbGxfdG90YWwnLFxuICAgIHN1YjogeyBkaW1lbnNpb246ICdzeXNjYWxsJywgdmFsdWU6ICdyZXNvbHZlJyB9LFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IHByb21pc2UgcmVzb2x1dGlvbiBrZXJuZWwgY2FsbHMnLFxuICB9LFxuICB7XG4gICAga2V5OiAnc3lzY2FsbEV4aXQnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9zeXNjYWxsX3RvdGFsJyxcbiAgICBzdWI6IHsgZGltZW5zaW9uOiAnc3lzY2FsbCcsIHZhbHVlOiAnZXhpdCcgfSxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCB2YXQgZXhpdCBrZXJuZWwgY2FsbHMnLFxuICB9LFxuICB7XG4gICAga2V5OiAnc3lzY2FsbFZhdHN0b3JlR2V0JyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfc3lzY2FsbF90b3RhbCcsXG4gICAgc3ViOiB7IGRpbWVuc2lvbjogJ3N5c2NhbGwnLCB2YWx1ZTogJ3ZhdHN0b3JlR2V0JyB9LFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IHZhdHN0b3JlIGdldCBrZXJuZWwgY2FsbHMnLFxuICB9LFxuICB7XG4gICAga2V5OiAnc3lzY2FsbFZhdHN0b3JlU2V0JyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfc3lzY2FsbF90b3RhbCcsXG4gICAgc3ViOiB7IGRpbWVuc2lvbjogJ3N5c2NhbGwnLCB2YWx1ZTogJ3ZhdHN0b3JlU2V0JyB9LFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IHZhdHN0b3JlIHNldCBrZXJuZWwgY2FsbHMnLFxuICB9LFxuICB7XG4gICAga2V5OiAnc3lzY2FsbFZhdHN0b3JlR2V0TmV4dEtleScsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3N5c2NhbGxfdG90YWwnLFxuICAgIHN1YjogeyBkaW1lbnNpb246ICdzeXNjYWxsJywgdmFsdWU6ICd2YXRzdG9yZUdldE5leHQnIH0sXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgdmF0c3RvcmUgZ2V0TmV4dEtleSBrZXJuZWwgY2FsbHMnLFxuICB9LFxuICB7XG4gICAga2V5OiAnc3lzY2FsbFZhdHN0b3JlRGVsZXRlJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfc3lzY2FsbF90b3RhbCcsXG4gICAgc3ViOiB7IGRpbWVuc2lvbjogJ3N5c2NhbGwnLCB2YWx1ZTogJ3ZhdHN0b3JlRGVsZXRlJyB9LFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IHZhdHN0b3JlIGRlbGV0ZSBrZXJuZWwgY2FsbHMnLFxuICB9LFxuICB7XG4gICAga2V5OiAnc3lzY2FsbERyb3BJbXBvcnRzJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfc3lzY2FsbF90b3RhbCcsXG4gICAgc3ViOiB7IGRpbWVuc2lvbjogJ3N5c2NhbGwnLCB2YWx1ZTogJ2Ryb3BJbXBvcnRzJyB9LFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IGRyb3AgaW1wb3J0cyBrZXJuZWwgY2FsbHMnLFxuICB9LFxuICB7XG4gICAga2V5OiAnZGlzcGF0Y2hlcycsXG4gICAgbmFtZTogJ3N3aW5nc2V0X2Rpc3BhdGNoX3RvdGFsJyxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCB2YXQgY2FsbHMnLFxuICB9LFxuICB7XG4gICAga2V5OiAnZGlzcGF0Y2hEZWxpdmVyJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfZGlzcGF0Y2hfZGVsaXZlcl90b3RhbCcsXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgdmF0IG1lc3NhZ2UgZGVsaXZlcmllcycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdkaXNwYXRjaE5vdGlmeScsXG4gICAgbmFtZTogJ3N3aW5nc2V0X2Rpc3BhdGNoX25vdGlmeV90b3RhbCcsXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgdmF0IHByb21pc2Ugbm90aWZpY2F0aW9ucycsXG4gIH0sXG5dO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5LRVJORUxfU1RBVFNfU1VNX01FVFJJQ1MoS0VSTkVMX1NUQVRTX1NVTV9NRVRSSUNTKTtcbiAgICAgICBjb25zdCBLRVJORUxfU1RBVFNfVVBET1dOX01FVFJJQ1MgPSBbXG4gIHtcbiAgICBrZXk6ICdrZXJuZWxPYmplY3RzJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfa2VybmVsX29iamVjdHMnLFxuICAgIGRlc2NyaXB0aW9uOiAnQWN0aXZlIGtlcm5lbCBvYmplY3RzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2tlcm5lbERldmljZXMnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9rZXJuZWxfZGV2aWNlcycsXG4gICAgZGVzY3JpcHRpb246ICdBY3RpdmUga2VybmVsIGRldmljZXMnLFxuICB9LFxuICB7XG4gICAga2V5OiAna2VybmVsUHJvbWlzZXMnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9rZXJuZWxfcHJvbWlzZXMnLFxuICAgIGRlc2NyaXB0aW9uOiAnQWN0aXZlIGtlcm5lbCBwcm9taXNlcycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdrcFVucmVzb2x2ZWQnLFxuICAgIG5hbWU6ICdzd2luZ3NldF91bnJlc29sdmVkX2tlcm5lbF9wcm9taXNlcycsXG4gICAgZGVzY3JpcHRpb246ICdVbnJlc29sdmVkIGtlcm5lbCBwcm9taXNlcycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdrcEZ1bGZpbGxlZCcsXG4gICAgbmFtZTogJ3N3aW5nc2V0X2Z1bGZpbGxlZF9rZXJuZWxfcHJvbWlzZXMnLFxuICAgIGRlc2NyaXB0aW9uOiAnRnVsZmlsbGVkIGtlcm5lbCBwcm9taXNlcycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdrcFJlamVjdGVkJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfcmVqZWN0ZWRfa2VybmVsX3Byb21pc2VzJyxcbiAgICBkZXNjcmlwdGlvbjogJ1JlamVjdGVkIGtlcm5lbCBwcm9taXNlcycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdydW5RdWV1ZUxlbmd0aCcsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3J1bl9xdWV1ZV9sZW5ndGgnLFxuICAgIGNvbnNlbnN1czogdHJ1ZSxcbiAgICBkZXNjcmlwdGlvbjogJ0xlbmd0aCBvZiB0aGUga2VybmVsIHJ1biBxdWV1ZScsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdhY2NlcHRhbmNlUXVldWVMZW5ndGgnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9hY2NlcHRhbmNlX3F1ZXVlX2xlbmd0aCcsXG4gICAgY29uc2Vuc3VzOiB0cnVlLFxuICAgIGRlc2NyaXB0aW9uOiAnTGVuZ3RoIG9mIHRoZSBrZXJuZWwgYWNjZXB0YW5jZSBxdWV1ZScsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdwcm9taXNlUXVldWVzTGVuZ3RoJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfcHJvbWlzZV9xdWV1ZXNfbGVuZ3RoJyxcbiAgICBjb25zZW5zdXM6IHRydWUsXG4gICAgZGVzY3JpcHRpb246ICdDb21iaW5lZCBsZW5ndGggb2YgYWxsIGtlcm5lbCBwcm9taXNlIHF1ZXVlcycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdjbGlzdEVudHJpZXMnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9jbGlzdF9lbnRyaWVzJyxcbiAgICBkZXNjcmlwdGlvbjogJ051bWJlciBvZiBlbnRyaWVzIGluIHRoZSBrZXJuZWwgYy1saXN0JyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3ZhdHMnLFxuICAgIG5hbWU6ICdzd2luZ3NldF92YXRzJyxcbiAgICBkZXNjcmlwdGlvbjogJ051bWJlciBvZiBhY3RpdmUgdmF0cycsXG4gIH0sXG5dOyRozY9fb25jZS5LRVJORUxfU1RBVFNfVVBET1dOX01FVFJJQ1MoS0VSTkVMX1NUQVRTX1VQRE9XTl9NRVRSSUNTKTtcblxuY29uc3QgeyBDb3VudGVyLCBHYXVnZSB9ID0gTWV0cmljVHlwZTtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgIGNvbnN0IEtFUk5FTF9TVEFUU19NRVRSSUNTID0gaGFyZGVuKFtcbiAgLi4uS0VSTkVMX1NUQVRTX1NVTV9NRVRSSUNTLm1hcChtID0+ICh7IC4uLm0sIG1ldHJpY1R5cGU6IENvdW50ZXIgfSkpLFxuICAuLi5LRVJORUxfU1RBVFNfVVBET1dOX01FVFJJQ1MubWFwKG0gPT4gKHsgLi4ubSwgbWV0cmljVHlwZTogR2F1Z2UgfSkpLFxuXSk7XG5cbi8vXG4kaM2PX29uY2UuS0VSTkVMX1NUQVRTX01FVFJJQ1MoS0VSTkVMX1NUQVRTX01FVFJJQ1MpO2NvbnN0IGtlcm5lbFN0YXRzS2V5cz1uZXcgTWFwKCk7XG5mb3IgKGNvbnN0IHsga2V5IH0gb2YgS0VSTkVMX1NUQVRTX01FVFJJQ1MpIHtcbiAga2VybmVsU3RhdHNLZXlzLnNldChrZXksIChrZXJuZWxTdGF0c0tleXMuZ2V0KGtleSkgfHwgMCkgKyAxKTtcbn1cbmNvbnN0IGR1cGxpY2F0ZUtlcm5lbFN0YXRzS2V5cyA9IFsuLi5rZXJuZWxTdGF0c0tleXMuZW50cmllcygpXS5mbGF0TWFwKFxuICAoW2tleSwgdmFsdWVdKSA9PiAodmFsdWUgPiAxID8gW2tleV0gOiBbXSksXG4pO1xuaWYgKGR1cGxpY2F0ZUtlcm5lbFN0YXRzS2V5cy5sZW5ndGggPiAwKSB7XG4gIGNvbnN0IG1zZyA9IGBEdXBsaWNhdGUga2VybmVsIHN0YXRzIGtleXMgJHtKU09OLnN0cmluZ2lmeShkdXBsaWNhdGVLZXJuZWxTdGF0c0tleXMpfWA7XG4gIHRocm93IEVycm9yKG1zZyk7XG59XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJISVNUT0dSQU1fTUVUUklDUyI6WyJISVNUT0dSQU1fTUVUUklDUyJdLCJCTE9DS19ISVNUT0dSQU1fTUVUUklDUyI6WyJCTE9DS19ISVNUT0dSQU1fTUVUUklDUyJdLCJRdWV1ZU1ldHJpY0FzcGVjdCI6WyJRdWV1ZU1ldHJpY0FzcGVjdCJdLCJtYWtlUXVldWVNZXRyaWNzTWV0YSI6WyJtYWtlUXVldWVNZXRyaWNzTWV0YSJdLCJtYWtlUXVldWVNZXRyaWNzIjpbIm1ha2VRdWV1ZU1ldHJpY3MiXSwiS0VSTkVMX1NUQVRTX1NVTV9NRVRSSUNTIjpbIktFUk5FTF9TVEFUU19TVU1fTUVUUklDUyJdLCJLRVJORUxfU1RBVFNfVVBET1dOX01FVFJJQ1MiOlsiS0VSTkVMX1NUQVRTX1VQRE9XTl9NRVRSSUNTIl0sIktFUk5FTF9TVEFUU19NRVRSSUNTIjpbIktFUk5FTF9TVEFUU19NRVRSSUNTIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOZHrB8EBQAABAUAADEAAABAYWdvcmljL2ludGVybmFsLXYwLjQuMC11MjEuMC9zcmMvbmF0dXJhbC1zb3J0LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJuYXR1cmFsQ29tcGFyZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKlxuXG5cblxuICovXG5jb25zdCBjb21wYXJlTmF0cyA9IChhLCBiKSA9PiB7XG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIGNvbnN0IGRpZmYgPSArYSAtICtiO1xuICBjb25zdCBmaW5pdGVEaWZmID1cbiAgICAoTnVtYmVyLmlzRmluaXRlKGRpZmYpICYmIGRpZmYpIHx8XG4gICAgKGEgPT09IGIgPyAwIDogTnVtYmVyKEJpZ0ludChhKSAtIEJpZ0ludChiKSkgfHwgYS5sZW5ndGggLSBiLmxlbmd0aCk7XG5cbiAgLy9cbiAgcmV0dXJuIE1hdGguc2lnbihmaW5pdGVEaWZmKTtcbn07XG5cbi8vXG4vL1xuLy9cbmNvbnN0IGNvbXBhcmVTdHJpbmdzID0gKGEsIGIpID0+IChhID4gYiA/IDEgOiBhIDwgYiA/IC0xIDogMCk7XG5cbmNvbnN0IHJQcmVmaXhlZERpZ2l0cyA9IC9eKFxcRCopKFxcZCspKFxcRC4qfCkvcztcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG5hdHVyYWxDb21wYXJlID0gKGEsIGIpID0+IHtcbiAgY29uc3QgW19hLCBhUHJlZml4LCBhRGlnaXRzLCBhU3VmZml4XSA9IHJQcmVmaXhlZERpZ2l0cy5leGVjKGEpIHx8IFtdO1xuICBpZiAoYVByZWZpeCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgY29uc3QgW19iLCBiUHJlZml4LCBiRGlnaXRzLCBiU3VmZml4XSA9IHJQcmVmaXhlZERpZ2l0cy5leGVjKGIpIHx8IFtdO1xuICAgIGlmIChiUHJlZml4ID09PSBhUHJlZml4KSB7XG4gICAgICByZXR1cm4gY29tcGFyZU5hdHMoYURpZ2l0cywgYkRpZ2l0cykgfHwgY29tcGFyZVN0cmluZ3MoYVN1ZmZpeCwgYlN1ZmZpeCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBjb21wYXJlU3RyaW5ncyhhLCBiKTtcbn07JGjNj19vbmNlLm5hdHVyYWxDb21wYXJlKG5hdHVyYWxDb21wYXJlKTtcbmhhcmRlbihuYXR1cmFsQ29tcGFyZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJuYXR1cmFsQ29tcGFyZSI6WyJuYXR1cmFsQ29tcGFyZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACaQsJezSwAAM0sAAAuAAAAQGFnb3JpYy9pbnRlcm5hbC12MC40LjAtdTIxLjAvc3JjL3Nlcy11dGlscy5qc3siaW1wb3J0cyI6WyJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyIsIkBlbmRvL2NvbW1vbi9vYmplY3QtbWV0YS1tYXAuanMiLCJAZW5kby9jb21tb24vZnJvbS11bmlxdWUtZW50cmllcy5qcyIsIkBlbmRvL2Vycm9ycyIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9wcm9taXNlLWtpdCIsIkBlbmRvL3N0cmVhbSIsImplc3NpZS5qcyIsIi4vanMtdXRpbHMuanMiXSwiZXhwb3J0cyI6WyJQcm9taXNlQWxsT3JFcnJvcnMiLCJhZ2dyZWdhdGVUcnlGaW5hbGx5IiwiYWxsVmFsdWVzIiwiYXNzZXJ0QWxsRGVmaW5lZCIsImF0dGVudWF0ZSIsImRlZXBseUZ1bGZpbGxlZE9iamVjdCIsImZvcmV2ZXIiLCJmcm9tVW5pcXVlRW50cmllcyIsIm1ha2VMaW1pdGVkQ29uc29sZSIsIm9iamVjdE1hcCIsIm9iamVjdE1ldGFNYXAiLCJzeW5jaHJvbml6ZWRUZWUiLCJ1bnRpbFRydWUiLCJ3aGlsZVRydWUiLCJ3aXRoRGVmZXJyZWRDbGVhbnVwIiwiemlwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgb2JqZWN0TWFwLG9iamVjdE1ldGFNYXAsZnJvbVVuaXF1ZUVudHJpZXMscSxGYWlsLG1ha2VFcnJvcixhbm5vdGF0ZUVycm9yLFgsZGVlcGx5RnVsZmlsbGVkLGlzT2JqZWN0LG1ha2VQcm9taXNlS2l0LG1ha2VRdWV1ZSxhc3luY0dlbmVyYXRlLGxvZ0xldmVsczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzXCIsIFtbXCJvYmplY3RNYXBcIixbJGjNj19hID0+IChvYmplY3RNYXAgPSAkaM2PX2EpLCRozY9fbGl2ZVtcIm9iamVjdE1hcFwiXV1dXV0sW1wiQGVuZG8vY29tbW9uL29iamVjdC1tZXRhLW1hcC5qc1wiLCBbW1wib2JqZWN0TWV0YU1hcFwiLFskaM2PX2EgPT4gKG9iamVjdE1ldGFNYXAgPSAkaM2PX2EpLCRozY9fbGl2ZVtcIm9iamVjdE1ldGFNYXBcIl1dXV1dLFtcIkBlbmRvL2NvbW1vbi9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzXCIsIFtbXCJmcm9tVW5pcXVlRW50cmllc1wiLFskaM2PX2EgPT4gKGZyb21VbmlxdWVFbnRyaWVzID0gJGjNj19hKSwkaM2PX2xpdmVbXCJmcm9tVW5pcXVlRW50cmllc1wiXV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJtYWtlRXJyb3JcIixbJGjNj19hID0+IChtYWtlRXJyb3IgPSAkaM2PX2EpXV0sW1wiYW5ub3RhdGVFcnJvclwiLFskaM2PX2EgPT4gKGFubm90YXRlRXJyb3IgPSAkaM2PX2EpXV0sW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJkZWVwbHlGdWxmaWxsZWRcIixbJGjNj19hID0+IChkZWVwbHlGdWxmaWxsZWQgPSAkaM2PX2EpXV0sW1wiaXNPYmplY3RcIixbJGjNj19hID0+IChpc09iamVjdCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJtYWtlUHJvbWlzZUtpdFwiLFskaM2PX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vc3RyZWFtXCIsIFtbXCJtYWtlUXVldWVcIixbJGjNj19hID0+IChtYWtlUXVldWUgPSAkaM2PX2EpXV1dXSxbXCJqZXNzaWUuanNcIiwgW1tcImFzeW5jR2VuZXJhdGVcIixbJGjNj19hID0+IChhc3luY0dlbmVyYXRlID0gJGjNj19hKV1dXV0sW1wiLi9qcy11dGlscy5qc1wiLCBbW1wibG9nTGV2ZWxzXCIsWyRozY9fYSA9PiAobG9nTGV2ZWxzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB7IGZyb21FbnRyaWVzLCBrZXlzLCB2YWx1ZXMgfSA9IE9iamVjdDtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICBjb25zdCBtYWtlTGltaXRlZENvbnNvbGUgPSBtYWtlTG9nZ2VyID0+IHtcbiAgY29uc3QgbGltaXRlZENvbnNvbGUgPSAvKiAgICAgICAgICAgICAgKi8gKFxuICAgIGZyb21FbnRyaWVzKGxvZ0xldmVscy5tYXAobGV2ZWwgPT4gW2xldmVsLCBtYWtlTG9nZ2VyKGxldmVsKV0pKVxuICApO1xuICByZXR1cm4gLyogICAgICAgICAgICAgICAgICAgICAgICAgKi8gKGhhcmRlbihsaW1pdGVkQ29uc29sZSkpO1xufTskaM2PX29uY2UubWFrZUxpbWl0ZWRDb25zb2xlKG1ha2VMaW1pdGVkQ29uc29sZSk7XG5oYXJkZW4obWFrZUxpbWl0ZWRDb25zb2xlKTtcblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGRlZXBseUZ1bGZpbGxlZE9iamVjdCA9IGFzeW5jIG9iaiA9PiB7XG4gIGlzT2JqZWN0KG9iaikgfHwgRmFpbGBwYXJhbSBtdXN0IGJlIGFuIG9iamVjdGA7XG4gIHJldHVybiBkZWVwbHlGdWxmaWxsZWQob2JqKTtcbn07XG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UuZGVlcGx5RnVsZmlsbGVkT2JqZWN0KGRlZXBseUZ1bGZpbGxlZE9iamVjdCk7XG5jb25zdCBtYWtlQWdncmVnYXRlRXJyb3IgPVxuICB0eXBlb2YgQWdncmVnYXRlRXJyb3IgPT09ICdmdW5jdGlvbidcbiAgICA/IChlcnJvcnMsIG1lc3NhZ2UsIG9wdGlvbnMpID0+IEFnZ3JlZ2F0ZUVycm9yKGVycm9ycywgbWVzc2FnZSwgb3B0aW9ucylcbiAgICA6IChlcnJvcnMsIG1lc3NhZ2UsIG9wdGlvbnMpID0+IHtcbiAgICAgICAgcmV0dXJuIG1ha2VFcnJvcihtZXNzYWdlID8/ICdtdWx0aXBsZSBlcnJvcnMnLCB1bmRlZmluZWQsIHtcbiAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgIGVycm9ycyxcbiAgICAgICAgfSk7XG4gICAgICB9O1xuXG4vKlxuXG5cblxuICovXG4gICAgICAgY29uc3QgUHJvbWlzZUFsbE9yRXJyb3JzID0gYXN5bmMgaXRlbXMgPT4ge1xuICByZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKGl0ZW1zKS50aGVuKHJlc3VsdHMgPT4ge1xuICAgIGNvbnN0IGVycm9ycyA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChcbiAgICAgIHJlc3VsdHMuZmlsdGVyKCh7IHN0YXR1cyB9KSA9PiBzdGF0dXMgPT09ICdyZWplY3RlZCcpXG4gICAgKS5tYXAocmVzdWx0ID0+IHJlc3VsdC5yZWFzb24pO1xuICAgIGlmICghZXJyb3JzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAocmVzdWx0cykubWFwKFxuICAgICAgICByZXN1bHQgPT4gcmVzdWx0LnZhbHVlLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGVycm9ycy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHRocm93IGVycm9yc1swXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbWFrZUFnZ3JlZ2F0ZUVycm9yKGVycm9ycyk7XG4gICAgfVxuICB9KTtcbn07XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS5Qcm9taXNlQWxsT3JFcnJvcnMoUHJvbWlzZUFsbE9yRXJyb3JzKTtcbiAgICAgICBjb25zdCBhZ2dyZWdhdGVUcnlGaW5hbGx5ID0gYXN5bmMgKHRyaWVyLCBmaW5hbGl6ZXIpID0+XG4gIHRyaWVyKCkudGhlbihcbiAgICBhc3luYyByZXN1bHQgPT4gZmluYWxpemVyKCkudGhlbigoKSA9PiByZXN1bHQpLFxuICAgIGFzeW5jIHRyeUVycm9yID0+XG4gICAgICBmaW5hbGl6ZXIodHJ5RXJyb3IpXG4gICAgICAgIC50aGVuKFxuICAgICAgICAgICgpID0+IHRyeUVycm9yLFxuICAgICAgICAgIGZpbmFsaXplRXJyb3IgPT4gbWFrZUFnZ3JlZ2F0ZUVycm9yKFt0cnlFcnJvciwgZmluYWxpemVFcnJvcl0pLFxuICAgICAgICApXG4gICAgICAgIC50aGVuKGVycm9yID0+IFByb21pc2UucmVqZWN0KGVycm9yKSksXG4gICk7XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5hZ2dyZWdhdGVUcnlGaW5hbGx5KGFnZ3JlZ2F0ZVRyeUZpbmFsbHkpO1xuICAgICAgIGNvbnN0IHdpdGhEZWZlcnJlZENsZWFudXAgPSBhc3luYyBmbiA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBjbGVhbnVwc0xJRk8gPSBbXTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGFkZENsZWFudXAgPSBjbGVhbnVwID0+IHtcbiAgICBjbGVhbnVwc0xJRk8udW5zaGlmdChjbGVhbnVwKTtcbiAgfTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgZmluYWxpemVyID0gYXN5bmMgZXJyID0+IHtcbiAgICAvL1xuICAgIGNvbnN0IGNsZWFudXBSZXN1bHRzID0gY2xlYW51cHNMSUZPLm1hcChhc3luYyBjbGVhbnVwID0+IHtcbiAgICAgIGF3YWl0IG51bGw7XG4gICAgICByZXR1cm4gY2xlYW51cChlcnIpO1xuICAgIH0pO1xuICAgIGF3YWl0IFByb21pc2VBbGxPckVycm9ycyhjbGVhbnVwUmVzdWx0cyk7XG4gIH07XG4gIHJldHVybiBhZ2dyZWdhdGVUcnlGaW5hbGx5KCgpID0+IGZuKGFkZENsZWFudXApLCBmaW5hbGl6ZXIpO1xufTtcblxuLypcblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLndpdGhEZWZlcnJlZENsZWFudXAod2l0aERlZmVycmVkQ2xlYW51cCk7XG4gICAgICAgY29uc3QgYXNzZXJ0QWxsRGVmaW5lZCA9IG9iaiA9PiB7XG4gIGNvbnN0IG1pc3NpbmcgPSBbXTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgIG1pc3NpbmcucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICBpZiAobWlzc2luZy5sZW5ndGggPiAwKSB7XG4gICAgRmFpbGBtaXNzaW5nICR7cShtaXNzaW5nKX1gO1xuICB9XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmFzc2VydEFsbERlZmluZWQoYXNzZXJ0QWxsRGVmaW5lZCk7XG4gICAgICAgY29uc3QgYXR0ZW51YXRlID0gKHNwZWNpbWVuLCBwZXJtaXQsIHRyYW5zZm9ybSA9IHggPT4geCkgPT4ge1xuICAvL1xuICBpZiAocGVybWl0ID09PSB0cnVlIHx8IHR5cGVvZiBwZXJtaXQgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKHNwZWNpbWVuKTtcbiAgfVxuXG4gIC8qICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHBhdGggPSBbXTtcbiAgLypcblxuXG5cbiAgICovXG4gIGNvbnN0IGV4dHJhY3QgPSAoc3ViU3BlY2ltZW4sIHN1YlBlcm1pdCkgPT4ge1xuICAgIGlmIChzdWJQZXJtaXQgPT09IG51bGwgfHwgdHlwZW9mIHN1YlBlcm1pdCAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IHBhdGgubGVuZ3RoID09PSAwXG4gICAgICAgID8gRmFpbGBpbnZhbGlkIHBlcm1pdDogJHtxKHBlcm1pdCl9YFxuICAgICAgICA6IEZhaWxgaW52YWxpZCBwZXJtaXQgYXQgcGF0aCAke3EocGF0aCl9OiAke3Eoc3ViUGVybWl0KX1gO1xuICAgIH0gZWxzZSBpZiAoc3ViU3BlY2ltZW4gPT09IG51bGwgfHwgdHlwZW9mIHN1YlNwZWNpbWVuICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgcGF0aC5sZW5ndGggPT09IDBcbiAgICAgICAgPyBGYWlsYHNwZWNpbWVuIG11c3QgYmUgYW4gb2JqZWN0IGZvciBwZXJtaXQgJHtxKHBlcm1pdCl9YFxuICAgICAgICA6IEZhaWxgc3BlY2ltZW4gYXQgcGF0aCAke3EocGF0aCl9IG11c3QgYmUgYW4gb2JqZWN0IGZvciBwZXJtaXQgJHtxKHN1YlBlcm1pdCl9YDtcbiAgICB9XG4gICAgY29uc3QgcGlja3MgPSBPYmplY3QuZW50cmllcyhzdWJQZXJtaXQpLm1hcCgoW3N1YktleSwgZGVlcFBlcm1pdF0pID0+IHtcbiAgICAgIGlmICghT2JqZWN0Lmhhc093bihzdWJTcGVjaW1lbiwgc3ViS2V5KSkge1xuICAgICAgICB0aHJvdyBGYWlsYHNwZWNpbWVuIGlzIG1pc3NpbmcgcGF0aCAke3EocGF0aC5jb25jYXQoc3ViS2V5KSl9YDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGRlZXBTcGVjaW1lbiA9IFJlZmxlY3QuZ2V0KHN1YlNwZWNpbWVuLCBzdWJLZXkpO1xuICAgICAgaWYgKGRlZXBQZXJtaXQgPT09IHRydWUgfHwgdHlwZW9mIGRlZXBQZXJtaXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBbc3ViS2V5LCBkZWVwU3BlY2ltZW5dO1xuICAgICAgfVxuICAgICAgcGF0aC5wdXNoKHN1YktleSk7XG4gICAgICBjb25zdCBleHRyYWN0ZWQgPSBleHRyYWN0KC8qICAgICAgICAgICAgICAqLyAoZGVlcFNwZWNpbWVuKSwgZGVlcFBlcm1pdCk7XG4gICAgICBjb25zdCBlbnRyeSA9IFtzdWJLZXksIGV4dHJhY3RlZF07XG4gICAgICBwYXRoLnBvcCgpO1xuICAgICAgcmV0dXJuIGVudHJ5O1xuICAgIH0pO1xuICAgIHJldHVybiB0cmFuc2Zvcm0oT2JqZWN0LmZyb21FbnRyaWVzKHBpY2tzKSwgc3ViUGVybWl0KTtcbiAgfTtcblxuICAvL1xuICByZXR1cm4gZXh0cmFjdChzcGVjaW1lbiwgcGVybWl0KTtcbn07XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovJGjNj19vbmNlLmF0dGVudWF0ZShhdHRlbnVhdGUpO1xuY29uc3Qgbm90RG9uZSA9IGhhcmRlbih7IGRvbmU6IGZhbHNlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGFsd2F5c0RvbmUgPSBoYXJkZW4oeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pO1xuXG4gICAgICAgY29uc3QgZm9yZXZlciA9IGFzeW5jR2VuZXJhdGUoKCkgPT4gbm90RG9uZSk7XG5cbi8qXG5cblxuXG5cblxuICovJGjNj19vbmNlLmZvcmV2ZXIoZm9yZXZlcik7XG4gICAgICAgY29uc3Qgd2hpbGVUcnVlID0gcHJvZHVjZSA9PlxuICBhc3luY0dlbmVyYXRlKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHByb2R1Y2UoKTtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICByZXR1cm4gYWx3YXlzRG9uZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICBkb25lOiBmYWxzZSxcbiAgICAgIHZhbHVlLFxuICAgIH0pO1xuICB9KTtcblxuLypcblxuXG5cblxuXG4gKi8kaM2PX29uY2Uud2hpbGVUcnVlKHdoaWxlVHJ1ZSk7XG4gICAgICAgY29uc3QgdW50aWxUcnVlID0gcHJvZHVjZSA9PlxuICBhc3luY0dlbmVyYXRlKGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB2YWx1ZSA9IGF3YWl0IHByb2R1Y2UoKTtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgICBkb25lOiB0cnVlLFxuICAgICAgICB2YWx1ZSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgdmFsdWUsXG4gICAgfSk7XG4gIH0pO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UudW50aWxUcnVlKHVudGlsVHJ1ZSk7XG4gICAgICAgY29uc3QgemlwID0gKHhzLCB5cykgPT4gaGFyZGVuKHhzLm1hcCgoeCwgaSkgPT4gW3gsIHlzWytpXV0pKTtcblxuLypcblxuXG5cbiAqLyRozY9fb25jZS56aXAoemlwKTtcbiAgICAgICBjb25zdCBhbGxWYWx1ZXMgPSBhc3luYyBvYmogPT4ge1xuICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IFByb21pc2UuYWxsKHZhbHVlcyhvYmopKTtcbiAgLy9cbiAgcmV0dXJuIGhhcmRlbihmcm9tRW50cmllcyh6aXAoa2V5cyhvYmopLCByZXNvbHZlZCkpKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5hbGxWYWx1ZXMoYWxsVmFsdWVzKTtcbiAgICAgICBjb25zdCBzeW5jaHJvbml6ZWRUZWUgPSAoc291cmNlU3RyZWFtLCByZWFkZXJDb3VudCkgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgZG9uZVJlc3VsdDtcblxuICAvKlxuXG5cblxuICAgKi9cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBxdWV1ZXMgPSBbXTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHB1bGxOZXh0ID0gYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHJlcXVlc3RzID0gYXdhaXQgUHJvbWlzZS5hbGxTZXR0bGVkKHF1ZXVlcy5tYXAocXVldWUgPT4gcXVldWUuZ2V0KCkpKTtcbiAgICBjb25zdCByZWplY3Rpb25zID0gW107XG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgcmVzb2x2ZXJzID0gW107XG4gICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IHNldHRsZWRSZXN1bHQgb2YgcmVxdWVzdHMpIHtcbiAgICAgIGlmIChzZXR0bGVkUmVzdWx0LnN0YXR1cyA9PT0gJ3JlamVjdGVkJykge1xuICAgICAgICByZWplY3Rpb25zLnB1c2goc2V0dGxlZFJlc3VsdC5yZWFzb24pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZG9uZSB8fD0gISFzZXR0bGVkUmVzdWx0LnZhbHVlLmRvbmU7XG4gICAgICAgIHJlc29sdmVycy5wdXNoKHNldHRsZWRSZXN1bHQudmFsdWUudmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGxldCByZXN1bHQ7XG4gICAgaWYgKGRvbmVSZXN1bHQpIHtcbiAgICAgIHJlc3VsdCA9IFByb21pc2UucmVzb2x2ZShkb25lUmVzdWx0KTtcbiAgICB9IGVsc2UgaWYgKHJlamVjdGlvbnMubGVuZ3RoKSB7XG4gICAgICBjb25zdCBlcnJvciA9IG1ha2VFcnJvcihYYFRlZWQgc3RyZWFtIHRocmV3YCk7XG4gICAgICBhbm5vdGF0ZUVycm9yKGVycm9yLCBYYFRlZWQgcmVqZWN0aW9uczogJHtyZWplY3Rpb25zfWApO1xuICAgICAgcmVzdWx0ID1cbiAgICAgICAgc291cmNlU3RyZWFtLnRocm93Py4oZXJyb3IpIHx8XG4gICAgICAgIFByb21pc2UucmVzb2x2ZShzb3VyY2VTdHJlYW0ucmV0dXJuPy4oKSkudGhlbigoKSA9PlxuICAgICAgICAgIFByb21pc2UucmVqZWN0KGVycm9yKSxcbiAgICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGRvbmUpIHtcbiAgICAgIHJlc3VsdCA9XG4gICAgICAgIHNvdXJjZVN0cmVhbS5yZXR1cm4/LigpIHx8XG4gICAgICAgIFByb21pc2UucmVzb2x2ZSh7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdCA9IHNvdXJjZVN0cmVhbS5uZXh0KCk7XG4gICAgfVxuICAgIHJlc3VsdC50aGVuKFxuICAgICAgciA9PiB7XG4gICAgICAgIGlmIChyLmRvbmUpIHtcbiAgICAgICAgICBkb25lUmVzdWx0ID0gcjtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICgpID0+IHtcbiAgICAgICAgZG9uZVJlc3VsdCA9IHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9O1xuICAgICAgfSxcbiAgICApO1xuICAgIGZvciAoY29uc3QgcmVzb2x2ZSBvZiByZXNvbHZlcnMpIHtcbiAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICB9XG4gICAgcmV0dXJuIHB1bGxOZXh0KCk7XG4gIH07XG5cbiAgY29uc3QgcmVhZGVycyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHJlYWRlckNvdW50IH0pLm1hcCgoKSA9PiB7XG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCBxdWV1ZSA9IG1ha2VRdWV1ZSgpO1xuICAgIHF1ZXVlcy5wdXNoKHF1ZXVlKTtcblxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgcmVhZGVyID0gaGFyZGVuKHtcbiAgICAgIGFzeW5jIG5leHQoKSB7XG4gICAgICAgIC8qXG5cblxuXG4gICAgICAgICAqL1xuICAgICAgICBjb25zdCB7IHByb21pc2UsIHJlc29sdmUgfSA9IG1ha2VQcm9taXNlS2l0KCk7XG4gICAgICAgIHF1ZXVlLnB1dCh7IHZhbHVlOiByZXNvbHZlLCBkb25lOiBmYWxzZSB9KTtcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgICB9LFxuICAgICAgYXN5bmMgcmV0dXJuKCkge1xuICAgICAgICAvKlxuXG5cblxuICAgICAgICAgKi9cbiAgICAgICAgY29uc3QgeyBwcm9taXNlLCByZXNvbHZlIH0gPSBtYWtlUHJvbWlzZUtpdCgpO1xuICAgICAgICBxdWV1ZS5wdXQoeyB2YWx1ZTogcmVzb2x2ZSwgZG9uZTogdHJ1ZSB9KTtcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgICB9LFxuICAgICAgYXN5bmMgdGhyb3cocmVhc29uKSB7XG4gICAgICAgIGNvbnN0IHJlamVjdGlvbiA9IFByb21pc2UucmVqZWN0KHJlYXNvbik7XG4gICAgICAgIHF1ZXVlLnB1dChyZWplY3Rpb24pO1xuICAgICAgICByZXR1cm4gcmVqZWN0aW9uO1xuICAgICAgfSxcbiAgICAgIC8vXG4gICAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgICByZXR1cm4gcmVhZGVyO1xuICAgICAgfSxcbiAgICAgIC8vXG4gICAgICBhc3luYyBbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKSB7XG4gICAgICAgIGF3YWl0IHJlYWRlci5yZXR1cm4oKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlYWRlcjtcbiAgfSk7XG5cbiAgdm9pZCBwdWxsTmV4dCgpO1xuICByZXR1cm4gcmVhZGVycztcbn07JGjNj19vbmNlLnN5bmNocm9uaXplZFRlZShzeW5jaHJvbml6ZWRUZWUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnsib2JqZWN0TWFwIjpbIm9iamVjdE1hcCIsZmFsc2VdLCJvYmplY3RNZXRhTWFwIjpbIm9iamVjdE1ldGFNYXAiLGZhbHNlXSwiZnJvbVVuaXF1ZUVudHJpZXMiOlsiZnJvbVVuaXF1ZUVudHJpZXMiLGZhbHNlXX0sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTGltaXRlZENvbnNvbGUiOlsibWFrZUxpbWl0ZWRDb25zb2xlIl0sImRlZXBseUZ1bGZpbGxlZE9iamVjdCI6WyJkZWVwbHlGdWxmaWxsZWRPYmplY3QiXSwiUHJvbWlzZUFsbE9yRXJyb3JzIjpbIlByb21pc2VBbGxPckVycm9ycyJdLCJhZ2dyZWdhdGVUcnlGaW5hbGx5IjpbImFnZ3JlZ2F0ZVRyeUZpbmFsbHkiXSwid2l0aERlZmVycmVkQ2xlYW51cCI6WyJ3aXRoRGVmZXJyZWRDbGVhbnVwIl0sImFzc2VydEFsbERlZmluZWQiOlsiYXNzZXJ0QWxsRGVmaW5lZCJdLCJhdHRlbnVhdGUiOlsiYXR0ZW51YXRlIl0sImZvcmV2ZXIiOlsiZm9yZXZlciJdLCJ3aGlsZVRydWUiOlsid2hpbGVUcnVlIl0sInVudGlsVHJ1ZSI6WyJ1bnRpbFRydWUiXSwiemlwIjpbInppcCJdLCJhbGxWYWx1ZXMiOlsiYWxsVmFsdWVzIl0sInN5bmNocm9uaXplZFRlZSI6WyJzeW5jaHJvbml6ZWRUZWUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAj/BubkIqAABCKgAANwAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuNC4wLXUyMS4wL3NyYy9zdG9yYWdlLXRlc3QtdXRpbHMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZmFyIiwiQGVuZG8vbWFyc2hhbCIsIi4vZGVidWcuanMiLCIuL2Vycm9ycy5qcyIsIi4vbGliLWNoYWluU3RvcmFnZS5qcyIsIi4vbWFyc2hhbC5qcyIsIi4vbWV0aG9kLXRvb2xzLmpzIiwiLi90ZXN0aW5nLXV0aWxzLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdE1hcnNoYWxsZXIiLCJkZWZhdWx0U2VyaWFsaXplciIsImRvY3VtZW50U3RvcmFnZVNjaGVtYSIsIm1ha2VGYWtlU3RvcmFnZUtpdCIsIm1ha2VNb2NrQ2hhaW5TdG9yYWdlUm9vdCIsInNsb3RTdHJpbmdVbnNlcmlhbGl6ZSIsInNsb3RUb1JlbW90YWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsRmFyLG1ha2VNYXJzaGFsLFJlbW90YWJsZSxtYWtlVHJhY2VyLE5vbk51bGxpc2gsaXNTdHJlYW1DZWxsLG1ha2VDaGFpblN0b3JhZ2VSb290LHVubWFyc2hhbEZyb21Wc3RvcmFnZSxiaW5kQWxsTWV0aG9kcyxldmVudExvb3BJdGVyYXRpb247JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJtYWtlTWFyc2hhbFwiLFskaM2PX2EgPT4gKG1ha2VNYXJzaGFsID0gJGjNj19hKV1dLFtcIlJlbW90YWJsZVwiLFskaM2PX2EgPT4gKFJlbW90YWJsZSA9ICRozY9fYSldXV1dLFtcIi4vZGVidWcuanNcIiwgW1tcIm1ha2VUcmFjZXJcIixbJGjNj19hID0+IChtYWtlVHJhY2VyID0gJGjNj19hKV1dXV0sW1wiLi9lcnJvcnMuanNcIiwgW1tcIk5vbk51bGxpc2hcIixbJGjNj19hID0+IChOb25OdWxsaXNoID0gJGjNj19hKV1dXV0sW1wiLi9saWItY2hhaW5TdG9yYWdlLmpzXCIsIFtbXCJpc1N0cmVhbUNlbGxcIixbJGjNj19hID0+IChpc1N0cmVhbUNlbGwgPSAkaM2PX2EpXV0sW1wibWFrZUNoYWluU3RvcmFnZVJvb3RcIixbJGjNj19hID0+IChtYWtlQ2hhaW5TdG9yYWdlUm9vdCA9ICRozY9fYSldXV1dLFtcIi4vbWFyc2hhbC5qc1wiLCBbW1widW5tYXJzaGFsRnJvbVZzdG9yYWdlXCIsWyRozY9fYSA9PiAodW5tYXJzaGFsRnJvbVZzdG9yYWdlID0gJGjNj19hKV1dXV0sW1wiLi9tZXRob2QtdG9vbHMuanNcIiwgW1tcImJpbmRBbGxNZXRob2RzXCIsWyRozY9fYSA9PiAoYmluZEFsbE1ldGhvZHMgPSAkaM2PX2EpXV1dXSxbXCIuL3Rlc3RpbmctdXRpbHMuanNcIiwgW1tcImV2ZW50TG9vcEl0ZXJhdGlvblwiLFskaM2PX2EgPT4gKGV2ZW50TG9vcEl0ZXJhdGlvbiA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuICovXG5cbmNvbnN0IHRyYWNlID0gbWFrZVRyYWNlcignU3RvclRVJywgZmFsc2UpO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHNsb3RUb1JlbW90YWJsZSA9IChfc2xvdElkLCBpZmFjZSA9ICdSZW1vdGFibGUnKSA9PlxuICBSZW1vdGFibGUoaWZhY2UpO1xuXG4vKlxuXG5cbiAqLyRozY9fb25jZS5zbG90VG9SZW1vdGFibGUoc2xvdFRvUmVtb3RhYmxlKTtcbiAgICAgICBjb25zdCBkZWZhdWx0TWFyc2hhbGxlciA9IG1ha2VNYXJzaGFsKHVuZGVmaW5lZCwgc2xvdFRvUmVtb3RhYmxlLCB7XG4gIHNlcmlhbGl6ZUJvZHlGb3JtYXQ6ICdzbWFsbGNhcHMnLFxufSk7XG5cbi8qXG5cbiAqLyRozY9fb25jZS5kZWZhdWx0TWFyc2hhbGxlcihkZWZhdWx0TWFyc2hhbGxlcik7XG4gICAgICAgY29uc3QgZGVmYXVsdFNlcmlhbGl6ZXIgPSB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgcGFyc2U6IHR4dCA9PiBkZWZhdWx0TWFyc2hhbGxlci5mcm9tQ2FwRGF0YShKU09OLnBhcnNlKHR4dCkpLFxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBzdHJpbmdpZnk6IG9iaiA9PiBKU09OLnN0cmluZ2lmeShkZWZhdWx0TWFyc2hhbGxlci50b0NhcERhdGEob2JqKSksXG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5kZWZhdWx0U2VyaWFsaXplcihkZWZhdWx0U2VyaWFsaXplcik7XG5jb25zdCBtYWtlU2xvdFN0cmluZ1Vuc2VyaWFsaXplID0gKCkgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgaWRlbnRpdHlTbG90VG9WYWxGbiA9IChzbG90LCBfKSA9PiBGYXIoJ3VuaycsIHsgdG9KU09OOiAoKSA9PiBzbG90IH0pO1xuICBjb25zdCB7IGZyb21DYXBEYXRhIH0gPSBtYWtlTWFyc2hhbCh1bmRlZmluZWQsIGlkZW50aXR5U2xvdFRvVmFsRm4pO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgdW5zZXJpYWxpemUgPSBjYXBEYXRhID0+XG4gICAgSlNPTi5wYXJzZShcbiAgICAgIEpTT04uc3RyaW5naWZ5KGZyb21DYXBEYXRhKGNhcERhdGEpLCAoXywgdmFsKSA9PiB7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnYmlnaW50Jykge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICByZXR1cm4gYEBlbmNyb211bGF0ZToke3ZhbH1gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgKF9rZXksIHZhbCkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiYgdmFsLnN0YXJ0c1dpdGgoJ0BlbmNyb211bGF0ZScpKSB7XG4gICAgICAgICAgcmV0dXJuIEJpZ0ludCh2YWwuc3BsaXQoJzonKVsxXSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHZhbDtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICByZXR1cm4gaGFyZGVuKHVuc2VyaWFsaXplKTtcbn07XG4gICAgICAgY29uc3Qgc2xvdFN0cmluZ1Vuc2VyaWFsaXplID0gbWFrZVNsb3RTdHJpbmdVbnNlcmlhbGl6ZSgpO1xuXG4vKlxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLnNsb3RTdHJpbmdVbnNlcmlhbGl6ZShzbG90U3RyaW5nVW5zZXJpYWxpemUpO1xuICAgICAgIGNvbnN0IG1ha2VGYWtlU3RvcmFnZUtpdCA9IChyb290UGF0aCwgcm9vdE9wdGlvbnMpID0+IHtcbiAgY29uc3QgcmVzb2x2ZWRPcHRpb25zID0geyBzZXF1ZW5jZTogdHJ1ZSwgLi4ucm9vdE9wdGlvbnMgfTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGRhdGEgPSBuZXcgTWFwKCk7XG4gIGxldCBjdXJyZW50QmxvY2tIZWlnaHQgPSAwO1xuXG4gIGNvbnN0IHVwZGF0ZU5ld0NlbGxCbG9ja0hlaWdodCA9IChibG9ja0hlaWdodCA9IGN1cnJlbnRCbG9ja0hlaWdodCArIDEpID0+IHtcbiAgICBibG9ja0hlaWdodCA+IGN1cnJlbnRCbG9ja0hlaWdodCB8fFxuICAgICAgRmFpbGBibG9ja0hlaWdodCAke2Jsb2NrSGVpZ2h0fSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAke2N1cnJlbnRCbG9ja0hlaWdodH1gO1xuICAgIGN1cnJlbnRCbG9ja0hlaWdodCA9IGJsb2NrSGVpZ2h0O1xuICB9O1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGdldENoaWxkRW50cmllcyA9IHByZWZpeCA9PiB7XG4gICAgYXNzZXJ0KHByZWZpeC5lbmRzV2l0aCgnLicpKTtcbiAgICBjb25zdCBjaGlsZEVudHJpZXMgPSBuZXcgTWFwKCk7XG4gICAgZm9yIChjb25zdCBbcGF0aCwgdmFsdWVdIG9mIGRhdGEuZW50cmllcygpKSB7XG4gICAgICBpZiAoIXBhdGguc3RhcnRzV2l0aChwcmVmaXgpKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuICAgICAgY29uc3QgW3NlZ21lbnQsIC4uLnN1ZmZpeF0gPSBwYXRoLnNsaWNlKHByZWZpeC5sZW5ndGgpLnNwbGl0KCcuJyk7XG4gICAgICBpZiAoc3VmZml4Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjaGlsZEVudHJpZXMuc2V0KHNlZ21lbnQsIHZhbHVlKTtcbiAgICAgIH0gZWxzZSBpZiAoIWNoaWxkRW50cmllcy5oYXMoc2VnbWVudCkpIHtcbiAgICAgICAgY2hpbGRFbnRyaWVzLnNldChzZWdtZW50LCBudWxsKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNoaWxkRW50cmllcztcbiAgfTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBtZXNzYWdlcyA9IFtdO1xuXG4gIGNvbnN0IHRvU3RvcmFnZSA9IEZhcihcbiAgICAnVG9TdG9yYWdlJyxcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIG1lc3NhZ2UgPT4ge1xuICAgICAgbWVzc2FnZXMucHVzaChtZXNzYWdlKTtcbiAgICAgIHN3aXRjaCAobWVzc2FnZS5tZXRob2QpIHtcbiAgICAgICAgY2FzZSAnZ2V0U3RvcmVLZXknOiB7XG4gICAgICAgICAgY29uc3QgW2tleV0gPSBtZXNzYWdlLmFyZ3M7XG4gICAgICAgICAgcmV0dXJuIHsgc3RvcmVOYW1lOiAnc3dpbmdzZXQnLCBzdG9yZVN1YmtleTogYGZha2U6JHtrZXl9YCB9O1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2dldCc6IHtcbiAgICAgICAgICBjb25zdCBba2V5XSA9IG1lc3NhZ2UuYXJncztcbiAgICAgICAgICByZXR1cm4gZGF0YS5oYXMoa2V5KSA/IGRhdGEuZ2V0KGtleSkgOiBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2NoaWxkcmVuJzoge1xuICAgICAgICAgIGNvbnN0IFtrZXldID0gbWVzc2FnZS5hcmdzO1xuICAgICAgICAgIGNvbnN0IGNoaWxkRW50cmllcyA9IGdldENoaWxkRW50cmllcyhgJHtrZXl9LmApO1xuICAgICAgICAgIHJldHVybiBbLi4uY2hpbGRFbnRyaWVzLmtleXMoKV07XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZW50cmllcyc6IHtcbiAgICAgICAgICBjb25zdCBba2V5XSA9IG1lc3NhZ2UuYXJncztcbiAgICAgICAgICBjb25zdCBjaGlsZEVudHJpZXMgPSBnZXRDaGlsZEVudHJpZXMoYCR7a2V5fS5gKTtcbiAgICAgICAgICByZXR1cm4gWy4uLmNoaWxkRW50cmllcy5lbnRyaWVzKCldLm1hcChlbnRyeSA9PlxuICAgICAgICAgICAgZW50cnlbMV0gIT0gbnVsbCA/IGVudHJ5IDogW2VudHJ5WzBdXSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3NldCc6XG4gICAgICAgIGNhc2UgJ3NldFdpdGhvdXROb3RpZnknOiB7XG4gICAgICAgICAgdHJhY2UoJ3RvU3RvcmFnZSBzZXQnLCBtZXNzYWdlKTtcbiAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgIGNvbnN0IG5ld0VudHJpZXMgPSBtZXNzYWdlLmFyZ3M7XG4gICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgbmV3RW50cmllcykge1xuICAgICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBkYXRhLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdhcHBlbmQnOiB7XG4gICAgICAgICAgdHJhY2UoJ3RvU3RvcmFnZSBhcHBlbmQnLCBtZXNzYWdlKTtcbiAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgIGNvbnN0IG5ld0VudHJpZXMgPSBtZXNzYWdlLmFyZ3M7XG4gICAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgbmV3RW50cmllcykge1xuICAgICAgICAgICAgdmFsdWUgIT0gbnVsbCB8fCBGYWlsYGF0dGVtcHQgdG8gYXBwZW5kIHdpdGggbm8gdmFsdWVgO1xuXG4gICAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICAgIGxldCBvbGRWYWwgPSBkYXRhLmdldChrZXkpO1xuICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgbGV0IHN0cmVhbUNlbGw7XG4gICAgICAgICAgICBpZiAob2xkVmFsICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBzdHJlYW1DZWxsID0gSlNPTi5wYXJzZShvbGRWYWwpO1xuICAgICAgICAgICAgICAgIGFzc2VydChpc1N0cmVhbUNlbGwoc3RyZWFtQ2VsbCkpO1xuICAgICAgICAgICAgICB9IGNhdGNoIChfZXJyKSB7XG4gICAgICAgICAgICAgICAgc3RyZWFtQ2VsbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgc3RyZWFtQ2VsbCAmJlxuICAgICAgICAgICAgICAgIE51bWJlcihzdHJlYW1DZWxsLmJsb2NrSGVpZ2h0KSAhPT0gY3VycmVudEJsb2NrSGVpZ2h0XG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHN0cmVhbUNlbGwgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgb2xkVmFsID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzdHJlYW1DZWxsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgc3RyZWFtQ2VsbCA9IHtcbiAgICAgICAgICAgICAgICBibG9ja0hlaWdodDogU3RyaW5nKGN1cnJlbnRCbG9ja0hlaWdodCksXG4gICAgICAgICAgICAgICAgdmFsdWVzOiBvbGRWYWwgIT0gbnVsbCA/IFtvbGRWYWxdIDogW10sXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzdHJlYW1DZWxsLnZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgICAgIGRhdGEuc2V0KGtleSwgSlNPTi5zdHJpbmdpZnkoc3RyZWFtQ2VsbCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzaXplJzpcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgcmV0dXJuIFsuLi5kYXRhLmtleXMoKV0uZmlsdGVyKGsgPT5cbiAgICAgICAgICAgIGsuc3RhcnRzV2l0aChgJHttZXNzYWdlLmFyZ3NbMF19LmApLFxuICAgICAgICAgICkubGVuZ3RoO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIHRocm93IEVycm9yKGB1bnN1cHBvcnRlZCBtZXRob2Q6ICR7bWVzc2FnZS5tZXRob2R9YCk7XG4gICAgICB9XG4gICAgfSxcbiAgKTtcbiAgY29uc3Qgcm9vdE5vZGUgPSBtYWtlQ2hhaW5TdG9yYWdlUm9vdCh0b1N0b3JhZ2UsIHJvb3RQYXRoLCByZXNvbHZlZE9wdGlvbnMpO1xuXG4gIC8qXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGdldFZhbHVlcyA9IHBhdGggPT4ge1xuICAgIGFzc2VydChyZXNvbHZlZE9wdGlvbnMuc2VxdWVuY2UpO1xuICAgIGNvbnN0IG5vZGVEYXRhID0gZGF0YS5nZXQocGF0aCk7XG4gICAgYXNzZXJ0KG5vZGVEYXRhLCBgbm8gZGF0YSBhdCBwYXRoICR7cGF0aH1gKTtcbiAgICBjb25zdCB3cmFwcGVyID0gSlNPTi5wYXJzZShub2RlRGF0YSk7XG4gICAgcmV0dXJuIHdyYXBwZXIudmFsdWVzO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgcm9vdE5vZGUsXG4gICAgLy9cbiAgICBkYXRhOiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChkYXRhKSxcbiAgICB1cGRhdGVOZXdDZWxsQmxvY2tIZWlnaHQsXG4gICAgZ2V0VmFsdWVzLFxuICAgIG1lc3NhZ2VzLFxuICAgIHRvU3RvcmFnZSxcbiAgfTtcbn07JGjNj19vbmNlLm1ha2VGYWtlU3RvcmFnZUtpdChtYWtlRmFrZVN0b3JhZ2VLaXQpO1xuaGFyZGVuKG1ha2VGYWtlU3RvcmFnZUtpdCk7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgIGNvbnN0IG1ha2VNb2NrQ2hhaW5TdG9yYWdlUm9vdCA9ICgpID0+IHtcbiAgY29uc3QgeyByb290Tm9kZSwgZGF0YSB9ID0gbWFrZUZha2VTdG9yYWdlS2l0KCdtb2NrQ2hhaW5TdG9yYWdlUm9vdCcpO1xuICByZXR1cm4gRmFyKCdtb2NrQ2hhaW5TdG9yYWdlJywge1xuICAgIC4uLmJpbmRBbGxNZXRob2RzKHJvb3ROb2RlKSxcbiAgICAvKlxuXG5cblxuXG5cblxuXG5cblxuICAgICAqL1xuICAgIGdldEJvZHk6IChwYXRoLCBtYXJzaGFsbGVyID0gZGVmYXVsdE1hcnNoYWxsZXIsIGluZGV4ID0gLTEpID0+IHtcbiAgICAgIGRhdGEuc2l6ZSB8fCBGYWlsYG5vIGRhdGEgaW4gc3RvcmFnZWA7XG4gICAgICAvKlxuXG5cblxuICAgICAgICovXG4gICAgICBjb25zdCBmcm9tQ2FwRGF0YSA9ICguLi5hcmdzKSA9PlxuICAgICAgICBSZWZsZWN0LmFwcGx5KG1hcnNoYWxsZXIuZnJvbUNhcERhdGEsIG1hcnNoYWxsZXIsIGFyZ3MpO1xuICAgICAgcmV0dXJuIHVubWFyc2hhbEZyb21Wc3RvcmFnZShkYXRhLCBwYXRoLCBmcm9tQ2FwRGF0YSwgaW5kZXgpO1xuICAgIH0sXG4gICAga2V5czogKCkgPT4gWy4uLmRhdGEua2V5cygpXSxcbiAgfSk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLm1ha2VNb2NrQ2hhaW5TdG9yYWdlUm9vdChtYWtlTW9ja0NoYWluU3RvcmFnZVJvb3QpO1xuICAgICAgIGNvbnN0IGRvY3VtZW50U3RvcmFnZVNjaGVtYSA9IGFzeW5jICh0LCBzdG9yYWdlLCBvcHRzKSA9PiB7XG4gIC8vXG4gIGF3YWl0IGV2ZW50TG9vcEl0ZXJhdGlvbigpO1xuXG4gIGNvbnN0IGdldExhc3QgPSAoLyogICAgICAgICAgICAgICAgICovIGNlbGwpID0+XG4gICAgSlNPTi5wYXJzZShjZWxsKS52YWx1ZXMuYXQoLTEpIHx8IGFzc2VydC5mYWlsKCk7XG4gIGNvbnN0IHsgc2hvd1ZhbHVlID0gcyA9PiBzIH0gPSBvcHRzO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGdldEJvZHlEZWZhdWx0ID0gKGQsIGspID0+IHNob3dWYWx1ZShnZXRMYXN0KE5vbk51bGxpc2goZC5nZXQoaykpKSk7XG5cbiAgY29uc3QgW2tleXMsIGdldEJvZHldID1cbiAgICAna2V5cycgaW4gc3RvcmFnZVxuICAgICAgPyBbc3RvcmFnZS5rZXlzKCksICgvKiAgICAgICAgICAgICAgICAgKi8gaykgPT4gc3RvcmFnZS5nZXRCb2R5KGspXVxuICAgICAgOiBbXG4gICAgICAgICAgc3RvcmFnZS5kYXRhLmtleXMoKSxcbiAgICAgICAgICAoLyogICAgICAgICAgICAgICAgICovIGspID0+IGdldEJvZHlEZWZhdWx0KHN0b3JhZ2UuZGF0YSwgayksXG4gICAgICAgIF07XG5cbiAgY29uc3QgeyBwYXR0ZXJuLCByZXBsYWNlbWVudCB9ID1cbiAgICAncGF0dGVybicgaW4gb3B0c1xuICAgICAgPyBvcHRzXG4gICAgICA6IHsgcGF0dGVybjogJ21vY2tDaGFpblN0b3JhZ2VSb290LicsIHJlcGxhY2VtZW50OiAncHVibGlzaGVkLicgfTtcblxuICBjb25zdCBwcnVuZWQgPSBbLi4ua2V5c11cbiAgICAuc29ydCgpXG4gICAgLmZpbHRlcihcbiAgICAgICdub2RlJyBpbiBvcHRzXG4gICAgICAgID8ga2V5ID0+XG4gICAgICAgICAgICBrZXlcbiAgICAgICAgICAgICAgLnJlcGxhY2UocGF0dGVybiwgcmVwbGFjZW1lbnQpXG4gICAgICAgICAgICAgIC5zdGFydHNXaXRoKGBwdWJsaXNoZWQuJHtvcHRzLm5vZGV9YClcbiAgICAgICAgOiBfZW50cnkgPT4gdHJ1ZSxcbiAgICApO1xuXG4gIGNvbnN0IGlsbHVzdHJhdGlvbiA9IHBydW5lZC5tYXAoXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBrZXkgPT4gW2tleS5yZXBsYWNlKHBhdHRlcm4sIHJlcGxhY2VtZW50KSwgZ2V0Qm9keShrZXkpXSxcbiAgKTtcblxuICBjb25zdCBub3RlID1cbiAgICAnbm90ZScgaW4gb3B0c1xuICAgICAgPyBvcHRzLm5vdGVcbiAgICAgIDogYFVuZGVyIFwicHVibGlzaGVkXCIsIHRoZSBcIiR7b3B0cy5ub2RlfVwiIG5vZGUgaXMgZGVsZWdhdGVkIHRvICR7b3B0cy5vd25lcn0uYDtcbiAgY29uc3QgYm9pbGVycGxhdGUgPSBgXG5UaGUgZXhhbXBsZSBiZWxvdyBpbGx1c3RyYXRlcyB0aGUgc2NoZW1hIG9mIHRoZSBkYXRhIHB1Ymxpc2hlZCB0aGVyZS5cblxuU2VlIGFsc28gYm9hcmQgbWFyc2hhbGxpbmcgY29udmVudGlvbnMgKF90byBhcHBlYXJfKS5gO1xuICB0LnNuYXBzaG90KGlsbHVzdHJhdGlvbiwgbm90ZSArIGJvaWxlcnBsYXRlKTtcbn07JGjNj19vbmNlLmRvY3VtZW50U3RvcmFnZVNjaGVtYShkb2N1bWVudFN0b3JhZ2VTY2hlbWEpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic2xvdFRvUmVtb3RhYmxlIjpbInNsb3RUb1JlbW90YWJsZSJdLCJkZWZhdWx0TWFyc2hhbGxlciI6WyJkZWZhdWx0TWFyc2hhbGxlciJdLCJkZWZhdWx0U2VyaWFsaXplciI6WyJkZWZhdWx0U2VyaWFsaXplciJdLCJzbG90U3RyaW5nVW5zZXJpYWxpemUiOlsic2xvdFN0cmluZ1Vuc2VyaWFsaXplIl0sIm1ha2VGYWtlU3RvcmFnZUtpdCI6WyJtYWtlRmFrZVN0b3JhZ2VLaXQiXSwibWFrZU1vY2tDaGFpblN0b3JhZ2VSb290IjpbIm1ha2VNb2NrQ2hhaW5TdG9yYWdlUm9vdCJdLCJkb2N1bWVudFN0b3JhZ2VTY2hlbWEiOlsiZG9jdW1lbnRTdG9yYWdlU2NoZW1hIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKMaFLHCBgAAwgYAADIAAABAYWdvcmljL2ludGVybmFsLXYwLjQuMC11MjEuMC9zcmMvdGVzdGluZy11dGlscy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiZXZlbnRMb29wSXRlcmF0aW9uIiwiaW5zcGVjdE1hcFN0b3JlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8vXG4vKlxuXG5cbiAqL1xuLyogICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBldmVudExvb3BJdGVyYXRpb24gPSBhc3luYyAoKSA9PlxuICBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldEltbWVkaWF0ZShyZXNvbHZlKSk7JGjNj19vbmNlLmV2ZW50TG9vcEl0ZXJhdGlvbihldmVudExvb3BJdGVyYXRpb24pO1xuaGFyZGVuKGV2ZW50TG9vcEl0ZXJhdGlvbik7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHN0cmluZ09yVGFnID0gdmFsdWUgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIFN5bWJvbC50b1N0cmluZ1RhZyBpbiB2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZVtTeW1ib2wudG9TdHJpbmdUYWddO1xuICB9XG4gIHJldHVybiBTdHJpbmcodmFsdWUpO1xufTtcbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgaW5zcGVjdE1hcFN0b3JlID0gc3RvcmUgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBvYmogPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgb2Ygc3RvcmUua2V5cygpKSB7XG4gICAgY29uc3QgdmFsdWUgPSBzdG9yZS5nZXQoa2V5KTtcbiAgICBjb25zdCBoYXNLZXlzID0gdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAna2V5cycgaW4gdmFsdWU7XG4gICAgY29uc3QgaW5kZXggPSBzdHJpbmdPclRhZyhrZXkpO1xuICAgIGlmIChoYXNLZXlzICYmICdnZXQnIGluIHZhbHVlKSB7XG4gICAgICBvYmpbaW5kZXhdID0gaW5zcGVjdE1hcFN0b3JlKHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKGhhc0tleXMpIHtcbiAgICAgIG9ialtpbmRleF0gPSBBcnJheS5mcm9tKHZhbHVlLmtleXMoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9ialtpbmRleF0gPVxuICAgICAgICB2YWx1ZSBpbnN0YW5jZW9mIE9iamVjdCAmJiBTeW1ib2wudG9TdHJpbmdUYWcgaW4gdmFsdWVcbiAgICAgICAgICA/IHZhbHVlW1N5bWJvbC50b1N0cmluZ1RhZ11cbiAgICAgICAgICA6IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb2JqO1xufTskaM2PX29uY2UuaW5zcGVjdE1hcFN0b3JlKGluc3BlY3RNYXBTdG9yZSk7XG5oYXJkZW4oaW5zcGVjdE1hcFN0b3JlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImV2ZW50TG9vcEl0ZXJhdGlvbiI6WyJldmVudExvb3BJdGVyYXRpb24iXSwiaW5zcGVjdE1hcFN0b3JlIjpbImluc3BlY3RNYXBTdG9yZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAgI8qkFwMAABcDAAArAAAAQGFnb3JpYy9pbnRlcm5hbC12MC40LjAtdTIxLjAvc3JjL3RtcERpci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWFrZVRlbXBEaXJGYWN0b3J5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VUZW1wRGlyRmFjdG9yeSA9IHRtcCA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHRtcERpciA9IHByZWZpeCA9PiB7XG4gICAgY29uc3QgeyBuYW1lLCByZW1vdmVDYWxsYmFjayB9ID0gdG1wLmRpclN5bmMoe1xuICAgICAgcHJlZml4LFxuICAgICAgdW5zYWZlQ2xlYW51cDogdHJ1ZSxcbiAgICB9KTtcbiAgICByZXR1cm4gW25hbWUsIHJlbW92ZUNhbGxiYWNrXTtcbiAgfTtcbiAgcmV0dXJuIHRtcERpcjtcbn07JGjNj19vbmNlLm1ha2VUZW1wRGlyRmFjdG9yeShtYWtlVGVtcERpckZhY3RvcnkpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVRlbXBEaXJGYWN0b3J5IjpbIm1ha2VUZW1wRGlyRmFjdG9yeSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACysov1GwMAABsDAAAuAAAAQGFnb3JpYy9pbnRlcm5hbC12MC40LjAtdTIxLjAvc3JjL3R5cGVDaGVjay5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbImNhc3QiLCJtdXN0TWF0Y2giXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCB0eXBlbGVzc011c3RNYXRjaDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+ICh0eXBlbGVzc011c3RNYXRjaCA9ICRozY9fYSldXV1dXSk7XG5cblxuLypcblxuICovXG5cbi8qICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgIGNvbnN0IG11c3RNYXRjaCA9IHR5cGVsZXNzTXVzdE1hdGNoO1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UubXVzdE1hdGNoKG11c3RNYXRjaCk7XG4gICAgICAgY29uc3QgY2FzdCA9IChzcGVjaW1lbiwgcGF0dCkgPT4ge1xuICAvL1xuICAvL1xuICAvL1xuICBtdXN0TWF0Y2goc3BlY2ltZW4sIHBhdHQpO1xuICByZXR1cm4gc3BlY2ltZW47XG59OyRozY9fb25jZS5jYXN0KGNhc3QpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibXVzdE1hdGNoIjpbIm11c3RNYXRjaCJdLCJjYXN0IjpbImNhc3QiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAD8zCxDoEAAA6BAAALwAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuNC4wLXUyMS4wL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiQnJpZGdlQmlnSW50U2hhcGUiLCJTdG9yYWdlTm9kZVNoYXBlIiwiVW5ndWFyZGVkSGVscGVySSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IE07JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4gICAgICAgY29uc3QgU3RvcmFnZU5vZGVTaGFwZSA9IE0ucmVtb3RhYmxlKCdTdG9yYWdlTm9kZScpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UuU3RvcmFnZU5vZGVTaGFwZShTdG9yYWdlTm9kZVNoYXBlKTtcbiAgICAgICBjb25zdCBVbmd1YXJkZWRIZWxwZXJJID0gTS5pbnRlcmZhY2UoXG4gICdoZWxwZXInLFxuICB7fSxcbiAgLy9cbiAgeyBzbG9wcHk6IHRydWUgfSxcbik7XG5cbi8qXG5cblxuXG4gKi9cblxuLypcblxuICovJGjNj19vbmNlLlVuZ3VhcmRlZEhlbHBlckkoVW5ndWFyZGVkSGVscGVySSk7XG4gICAgICAgY29uc3QgQnJpZGdlQmlnSW50U2hhcGUgPSBNLm9yKE0ubnVtYmVyKCksIE0uc3RyaW5nKCkpOyRozY9fb25jZS5CcmlkZ2VCaWdJbnRTaGFwZShCcmlkZ2VCaWdJbnRTaGFwZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJTdG9yYWdlTm9kZVNoYXBlIjpbIlN0b3JhZ2VOb2RlU2hhcGUiXSwiVW5ndWFyZGVkSGVscGVySSI6WyJVbmd1YXJkZWRIZWxwZXJJIl0sIkJyaWRnZUJpZ0ludFNoYXBlIjpbIkJyaWRnZUJpZ0ludFNoYXBlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAADAAAABAYWdvcmljL2ludGVybmFsLXYwLjQuMC11MjEuMC9zcmMvdHlwZXMtaW5kZXguanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAkna9+2kHAABpBwAAMAAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuNC4wLXUyMS4wL3NyYy91cGdyYWRlLWFwaS5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbIlVwZ3JhZGVEaXNjb25uZWN0aW9uU2hhcGUiLCJpc0FiYW5kb25lZEVycm9yIiwiaXNVcGdyYWRlRGlzY29ubmVjdGlvbiIsIm1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IE0sbWF0Y2hlczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJtYXRjaGVzXCIsWyRozY9fYSA9PiAobWF0Y2hlcyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbmNvbnN0IHsgaXNGcm96ZW4gfSA9IE9iamVjdDtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cblxuICAgICAgIGNvbnN0IFVwZ3JhZGVEaXNjb25uZWN0aW9uU2hhcGUgPSBoYXJkZW4oe1xuICBuYW1lOiAndmF0VXBncmFkZWQnLFxuICB1cGdyYWRlTWVzc2FnZTogTS5zdHJpbmcoKSxcbiAgaW5jYXJuYXRpb25OdW1iZXI6IE0ubnVtYmVyKCksXG59KTtcblxuLypcblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5VcGdyYWRlRGlzY29ubmVjdGlvblNoYXBlKFVwZ3JhZGVEaXNjb25uZWN0aW9uU2hhcGUpO1xuICAgICAgIGNvbnN0IG1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbiA9ICh1cGdyYWRlTWVzc2FnZSwgdG9JbmNhcm5hdGlvbk51bWJlcikgPT5cbiAgaGFyZGVuKHtcbiAgICBuYW1lOiAndmF0VXBncmFkZWQnLFxuICAgIHVwZ3JhZGVNZXNzYWdlLFxuICAgIGluY2FybmF0aW9uTnVtYmVyOiB0b0luY2FybmF0aW9uTnVtYmVyLFxuICB9KTskaM2PX29uY2UubWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uKG1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbik7XG5oYXJkZW4obWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uKTtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgaXNVcGdyYWRlRGlzY29ubmVjdGlvbiA9IHJlYXNvbiA9PlxuICByZWFzb24gIT0gbnVsbCAmJiAvL1xuICBpc0Zyb3plbihyZWFzb24pICYmXG4gIG1hdGNoZXMocmVhc29uLCBVcGdyYWRlRGlzY29ubmVjdGlvblNoYXBlKTskaM2PX29uY2UuaXNVcGdyYWRlRGlzY29ubmVjdGlvbihpc1VwZ3JhZGVEaXNjb25uZWN0aW9uKTtcbmhhcmRlbihpc1VwZ3JhZGVEaXNjb25uZWN0aW9uKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBpc0FiYW5kb25lZEVycm9yID0gcmVhc29uID0+XG4gIHJlYXNvbiAhPSBudWxsICYmIC8vXG4gIGlzRnJvemVuKHJlYXNvbikgJiZcbiAgbWF0Y2hlcyhyZWFzb24sIE0uZXJyb3IoKSkgJiZcbiAgLy9cbiAgLy9cbiAgcmVhc29uLm1lc3NhZ2UgPT09ICd2YXQgdGVybWluYXRlZCc7JGjNj19vbmNlLmlzQWJhbmRvbmVkRXJyb3IoaXNBYmFuZG9uZWRFcnJvcik7XG5oYXJkZW4oaXNBYmFuZG9uZWRFcnJvcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJVcGdyYWRlRGlzY29ubmVjdGlvblNoYXBlIjpbIlVwZ3JhZGVEaXNjb25uZWN0aW9uU2hhcGUiXSwibWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uIjpbIm1ha2VVcGdyYWRlRGlzY29ubmVjdGlvbiJdLCJpc1VwZ3JhZGVEaXNjb25uZWN0aW9uIjpbImlzVXBncmFkZURpc2Nvbm5lY3Rpb24iXSwiaXNBYmFuZG9uZWRFcnJvciI6WyJpc0FiYW5kb25lZEVycm9yIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANCWSi3vCAAA7wgAADkAAABAYWdvcmljL25vdGlmaWVyLXYwLjcuMC11MjEuMC9zcmMvYXN5bmNJdGVyYWJsZUFkYXB0b3IuanN7ImltcG9ydHMiOlsiQGVuZG8vZmFyIiwiLi9zdWJzY3JpYmUuanMiXSwiZXhwb3J0cyI6WyJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciIsIm9ic2VydmVJdGVyYXRpb24iLCJvYnNlcnZlSXRlcmF0b3IiLCJvYnNlcnZlTm90aWZpZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBFLHN1YnNjcmliZUxhdGVzdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCIuL3N1YnNjcmliZS5qc1wiLCBbW1wic3Vic2NyaWJlTGF0ZXN0XCIsWyRozY9fYSA9PiAoc3Vic2NyaWJlTGF0ZXN0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLypcblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciA9IHN1YnNjcmliZUxhdGVzdDtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5tYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllcihtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllcik7XG4gICAgICAgY29uc3Qgb2JzZXJ2ZUl0ZXJhdG9yID0gKGFzeW5jSXRlcmF0b3JQLCBpdGVyYXRpb25PYnNlcnZlcikgPT4ge1xuICByZXR1cm4gbmV3IFByb21pc2UoKGFjaywgb2JzZXJ2ZXJFcnJvcikgPT4ge1xuICAgIGNvbnN0IHJlY3VyID0gKCkgPT4ge1xuICAgICAgRS53aGVuKFxuICAgICAgICBFKGFzeW5jSXRlcmF0b3JQKS5uZXh0KCksXG4gICAgICAgICh7IHZhbHVlLCBkb25lIH0pID0+IHtcbiAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgaXRlcmF0aW9uT2JzZXJ2ZXIuZmluaXNoICYmIGl0ZXJhdGlvbk9ic2VydmVyLmZpbmlzaCh2YWx1ZSk7XG4gICAgICAgICAgICBhY2sodW5kZWZpbmVkKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaXRlcmF0aW9uT2JzZXJ2ZXIudXBkYXRlU3RhdGUgJiZcbiAgICAgICAgICAgICAgaXRlcmF0aW9uT2JzZXJ2ZXIudXBkYXRlU3RhdGUodmFsdWUpO1xuICAgICAgICAgICAgcmVjdXIoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHJlYXNvbiA9PiB7XG4gICAgICAgICAgaXRlcmF0aW9uT2JzZXJ2ZXIuZmFpbCAmJiBpdGVyYXRpb25PYnNlcnZlci5mYWlsKHJlYXNvbik7XG4gICAgICAgICAgYWNrKHVuZGVmaW5lZCk7XG4gICAgICAgIH0sXG4gICAgICApLmNhdGNoKG9ic2VydmVyRXJyb3IpO1xuICAgIH07XG4gICAgcmVjdXIoKTtcbiAgfSk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLm9ic2VydmVJdGVyYXRvcihvYnNlcnZlSXRlcmF0b3IpO1xuICAgICAgIGNvbnN0IG9ic2VydmVJdGVyYXRpb24gPSAoYXN5bmNJdGVyYWJsZVAsIGl0ZXJhdGlvbk9ic2VydmVyKSA9PiB7XG4gIGNvbnN0IGl0ZXJhdG9yUCA9IEUoYXN5bmNJdGVyYWJsZVApW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xuICByZXR1cm4gb2JzZXJ2ZUl0ZXJhdG9yKGl0ZXJhdG9yUCwgaXRlcmF0aW9uT2JzZXJ2ZXIpO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5vYnNlcnZlSXRlcmF0aW9uKG9ic2VydmVJdGVyYXRpb24pO1xuICAgICAgIGNvbnN0IG9ic2VydmVOb3RpZmllciA9IChub3RpZmllclAsIGl0ZXJhdGlvbk9ic2VydmVyKSA9PlxuICBvYnNlcnZlSXRlcmF0aW9uKHN1YnNjcmliZUxhdGVzdChub3RpZmllclApLCBpdGVyYXRpb25PYnNlcnZlcik7JGjNj19vbmNlLm9ic2VydmVOb3RpZmllcihvYnNlcnZlTm90aWZpZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiOlsibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiXSwib2JzZXJ2ZUl0ZXJhdG9yIjpbIm9ic2VydmVJdGVyYXRvciJdLCJvYnNlcnZlSXRlcmF0aW9uIjpbIm9ic2VydmVJdGVyYXRpb24iXSwib2JzZXJ2ZU5vdGlmaWVyIjpbIm9ic2VydmVOb3RpZmllciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADCPu246wcAAOsHAAAqAAAAQGFnb3JpYy9ub3RpZmllci12MC43LjAtdTIxLjAvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vcHVibGlzaC1raXQuanMiLCIuL3N1YnNjcmliZS5qcyIsIi4vbm90aWZpZXIuanMiLCIuL3N1YnNjcmliZXIuanMiLCIuL3RvcGljLmpzIiwiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyIsIi4vc3RvcmVzdWIuanMiLCIuL3N0b3JlZC1ub3RpZmllci5qcyIsIi4vdHlwZXMtaW5kZXguanMiXSwiZXhwb3J0cyI6WyJtYWtlTm90aWZpZXJLaXQiLCJtYWtlTm90aWZpZXJLaXQiLCJtYWtlU3Vic2NyaXB0aW9uS2l0IiwibWFrZVN1YnNjcmlwdGlvbktpdCIsIm9ic2VydmVJdGVyYXRvciIsIm9ic2VydmVJdGVyYXRvciIsInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCIsInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCIsInN1YnNjcmliZUxhdGVzdCIsInN1YnNjcmliZUxhdGVzdCIsbnVsbF0sInJlZXhwb3J0cyI6WyIuL3N0b3JlZC1ub3RpZmllci5qcyIsIi4vc3RvcmVzdWIuanMiLCIuL3R5cGVzLWluZGV4LmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vcHVibGlzaC1raXQuanNcIiwgW11dLFtcIi4vc3Vic2NyaWJlLmpzXCIsIFtdXSxbXCIuL25vdGlmaWVyLmpzXCIsIFtdXSxbXCIuL3N1YnNjcmliZXIuanNcIiwgW11dLFtcIi4vdG9waWMuanNcIiwgW11dLFtcIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanNcIiwgW11dLFtcIi4vc3RvcmVzdWIuanNcIiwgW11dLFtcIi4vc3RvcmVkLW5vdGlmaWVyLmpzXCIsIFtdXSxbXCIuL3R5cGVzLWluZGV4LmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9wdWJsaXNoLWtpdC5qcyI6W1sibWFrZVB1Ymxpc2hLaXQiLCJtYWtlUHVibGlzaEtpdCJdLFsicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0IiwicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0Il0sWyJGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclNoYXBlIiwiRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSJdLFsiSXRlcmFibGVFYWNoVG9waWNJIiwiSXRlcmFibGVFYWNoVG9waWNJIl0sWyJJdGVyYWJsZUxhdGVzdFRvcGljSSIsIkl0ZXJhYmxlTGF0ZXN0VG9waWNJIl0sWyJTdWJzY3JpYmVyU2hhcGUiLCJTdWJzY3JpYmVyU2hhcGUiXV0sIi4vc3Vic2NyaWJlLmpzIjpbWyJzdWJzY3JpYmVFYWNoIiwic3Vic2NyaWJlRWFjaCJdLFsic3Vic2NyaWJlTGF0ZXN0Iiwic3Vic2NyaWJlTGF0ZXN0Il1dLCIuL25vdGlmaWVyLmpzIjpbWyJtYWtlTm90aWZpZXIiLCJtYWtlTm90aWZpZXIiXSxbIm1ha2VOb3RpZmllcktpdCIsIm1ha2VOb3RpZmllcktpdCJdLFsibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiLCJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSJdLFsibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiLCJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciJdXSwiLi9zdWJzY3JpYmVyLmpzIjpbWyJtYWtlU3Vic2NyaXB0aW9uIiwibWFrZVN1YnNjcmlwdGlvbiJdLFsibWFrZVN1YnNjcmlwdGlvbktpdCIsIm1ha2VTdWJzY3JpcHRpb25LaXQiXV0sIi4vdG9waWMuanMiOltbIm1ha2VQaW5uZWRIaXN0b3J5VG9waWMiLCJtYWtlUGlubmVkSGlzdG9yeVRvcGljIl1dLCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIjpbWyJvYnNlcnZlTm90aWZpZXIiLCJvYnNlcnZlTm90aWZpZXIiXSxbIm9ic2VydmVJdGVyYXRvciIsIm9ic2VydmVJdGVyYXRvciJdLFsib2JzZXJ2ZUl0ZXJhdGlvbiIsIm9ic2VydmVJdGVyYXRpb24iXSxbIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIiwibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACG+ywQmEwAAJhMAAC0AAABAYWdvcmljL25vdGlmaWVyLXYwLjcuMC11MjEuMC9zcmMvbm90aWZpZXIuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZmFyIiwiLi9wdWJsaXNoLWtpdC5qcyIsIi4vc3Vic2NyaWJlLmpzIl0sImV4cG9ydHMiOlsibWFrZU5vdGlmaWVyIiwibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiLCJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciIsIm1ha2VOb3RpZmllcktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzc2VydCxFLEZhcixtYWtlUHVibGlzaEtpdCxzdWJzY3JpYmVMYXRlc3Q7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcImFzc2VydFwiLFskaM2PX2EgPT4gKGFzc2VydCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV0sW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiLi9wdWJsaXNoLWtpdC5qc1wiLCBbW1wibWFrZVB1Ymxpc2hLaXRcIixbJGjNj19hID0+IChtYWtlUHVibGlzaEtpdCA9ICRozY9fYSldXV1dLFtcIi4vc3Vic2NyaWJlLmpzXCIsIFtbXCJzdWJzY3JpYmVMYXRlc3RcIixbJGjNj19hID0+IChzdWJzY3JpYmVMYXRlc3QgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG4vKlxuXG5cbiAqL1xuXG4vKlxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZU5vdGlmaWVyID0gc2hhcmFibGVJbnRlcm5hbHNQID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3Qgbm90aWZpZXIgPSBGYXIoJ25vdGlmaWVyJywge1xuICAgIC4uLnN1YnNjcmliZUxhdGVzdChzaGFyYWJsZUludGVybmFsc1ApLFxuICAgIGdldFVwZGF0ZVNpbmNlOiBhc3luYyB1cGRhdGVDb3VudCA9PlxuICAgICAgRShzaGFyYWJsZUludGVybmFsc1ApLmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50KSxcblxuICAgIC8qXG5cblxuXG5cbiAgICAgKi9cbiAgICBnZXRTaGFyYWJsZU5vdGlmaWVySW50ZXJuYWxzOiBhc3luYyAoKSA9PiBzaGFyYWJsZUludGVybmFsc1AsXG4gICAgLypcblxuXG5cbiAgICAgKi9cbiAgICBnZXRTdG9yZUtleTogKCkgPT4gaGFyZGVuKHsgbm90aWZpZXIgfSksXG4gIH0pO1xuICByZXR1cm4gbm90aWZpZXI7XG59O1xuXG4vKlxuXG5cblxuICovJGjNj19vbmNlLm1ha2VOb3RpZmllcihtYWtlTm90aWZpZXIpO1xuICAgICAgIGNvbnN0IG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyID0gc3Vic2NyaWJlciA9PiB7XG4gIC8qXG5cbiAgICovXG4gIGNvbnN0IGJhc2VOb3RpZmllciA9IGhhcmRlbih7XG4gICAgZ2V0VXBkYXRlU2luY2U6ICh1cGRhdGVDb3VudCA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIEUoc3Vic2NyaWJlcikuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpLFxuICB9KTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBub3RpZmllciA9IEZhcignbm90aWZpZXInLCB7XG4gICAgLi4ubWFrZU5vdGlmaWVyKGJhc2VOb3RpZmllciksXG4gICAgLi4uYmFzZU5vdGlmaWVyLFxuICB9KTtcbiAgcmV0dXJuIG5vdGlmaWVyO1xufTskaM2PX29uY2UubWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIobWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIpO1xuaGFyZGVuKG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VOb3RpZmllcktpdCA9ICguLi5pbml0aWFsU3RhdGVBcnIpID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCB7IHB1Ymxpc2hlciwgc3Vic2NyaWJlciB9ID0gbWFrZVB1Ymxpc2hLaXQoKTtcblxuICBjb25zdCBub3RpZmllciA9IG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyKHN1YnNjcmliZXIpO1xuXG4gIGNvbnN0IHVwZGF0ZXIgPSBGYXIoJ3VwZGF0ZXInLCB7XG4gICAgdXBkYXRlU3RhdGU6IHN0YXRlID0+IHB1Ymxpc2hlci5wdWJsaXNoKHN0YXRlKSxcbiAgICBmaW5pc2g6IGNvbXBsZXRpb24gPT4gcHVibGlzaGVyLmZpbmlzaChjb21wbGV0aW9uKSxcbiAgICBmYWlsOiByZWFzb24gPT4gcHVibGlzaGVyLmZhaWwocmVhc29uKSxcbiAgfSk7XG5cbiAgYXNzZXJ0KGluaXRpYWxTdGF0ZUFyci5sZW5ndGggPD0gMSwgJ3RvbyBtYW55IGFyZ3VtZW50cycpO1xuICBpZiAoaW5pdGlhbFN0YXRlQXJyLmxlbmd0aCA9PT0gMSkge1xuICAgIHVwZGF0ZXIudXBkYXRlU3RhdGUoaW5pdGlhbFN0YXRlQXJyWzBdKTtcbiAgfVxuXG4gIC8vXG4gIC8vXG4gIHJldHVybiBoYXJkZW4oeyBub3RpZmllciwgdXBkYXRlciB9KTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5tYWtlTm90aWZpZXJLaXQobWFrZU5vdGlmaWVyS2l0KTtcbiAgICAgICBjb25zdCBtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSA9IGFzeW5jSXRlcmFibGVQID0+IHtcbiAgY29uc3QgaXRlcmF0b3JQID0gRShhc3luY0l0ZXJhYmxlUClbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgb3B0TmV4dFByb21pc2U7XG4gIGxldCBjdXJyZW50VXBkYXRlQ291bnQgPSAwbjtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgY3VycmVudFJlc3BvbnNlO1xuICBsZXQgZmluYWwgPSBmYWxzZTtcblxuICAvKlxuXG4gICAqL1xuICBjb25zdCBiYXNlTm90aWZpZXIgPSBGYXIoJ2Jhc2VOb3RpZmllcicsIHtcbiAgICBnZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCA9IC0xbikge1xuICAgICAgaWYgKHVwZGF0ZUNvdW50IDwgY3VycmVudFVwZGF0ZUNvdW50KSB7XG4gICAgICAgIGlmIChjdXJyZW50UmVzcG9uc2UpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGN1cnJlbnRSZXNwb25zZSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAodXBkYXRlQ291bnQgIT09IGN1cnJlbnRVcGRhdGVDb3VudCkge1xuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAnZ2V0VXBkYXRlU2luY2UgYXJndW1lbnQgbXVzdCBiZSBhIHByZXZpb3VzbHktaXNzdWVkIHVwZGF0ZUNvdW50LicsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vXG4gICAgICBpZiAoZmluYWwpIHtcbiAgICAgICAgYXNzZXJ0KGN1cnJlbnRSZXNwb25zZSAhPT0gdW5kZWZpbmVkKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjdXJyZW50UmVzcG9uc2UpO1xuICAgICAgfVxuICAgICAgaWYgKCFvcHROZXh0UHJvbWlzZSkge1xuICAgICAgICBjb25zdCBuZXh0SXRlclJlc3VsdFAgPSBFKGl0ZXJhdG9yUCkubmV4dCgpO1xuICAgICAgICBvcHROZXh0UHJvbWlzZSA9IEUud2hlbihcbiAgICAgICAgICBuZXh0SXRlclJlc3VsdFAsXG4gICAgICAgICAgKHsgZG9uZSwgdmFsdWUgfSkgPT4ge1xuICAgICAgICAgICAgYXNzZXJ0KCFmaW5hbCk7XG4gICAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgICBmaW5hbCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXJyZW50VXBkYXRlQ291bnQgKz0gMW47XG4gICAgICAgICAgICBjdXJyZW50UmVzcG9uc2UgPSBoYXJkZW4oe1xuICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgdXBkYXRlQ291bnQ6IGRvbmUgPyB1bmRlZmluZWQgOiBjdXJyZW50VXBkYXRlQ291bnQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG9wdE5leHRQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRSZXNwb25zZTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIF9yZWFzb24gPT4ge1xuICAgICAgICAgICAgZmluYWwgPSB0cnVlO1xuICAgICAgICAgICAgY3VycmVudFJlc3BvbnNlID1cbiAgICAgICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgIChuZXh0SXRlclJlc3VsdFApO1xuICAgICAgICAgICAgb3B0TmV4dFByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudFJlc3BvbnNlO1xuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3B0TmV4dFByb21pc2U7XG4gICAgfSxcbiAgfSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3Qgbm90aWZpZXIgPSBGYXIoJ25vdGlmaWVyJywge1xuICAgIC8vXG4gICAgLy9cbiAgICAuLi5tYWtlTm90aWZpZXIoYmFzZU5vdGlmaWVyKSxcbiAgICAuLi5iYXNlTm90aWZpZXIsXG4gIH0pO1xuICByZXR1cm4gbm90aWZpZXI7XG59OyRozY9fb25jZS5tYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZShtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSk7XG5oYXJkZW4obWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU5vdGlmaWVyIjpbIm1ha2VOb3RpZmllciJdLCJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciI6WyJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciJdLCJtYWtlTm90aWZpZXJLaXQiOlsibWFrZU5vdGlmaWVyS2l0Il0sIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIjpbIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAes8nreMgAA3jIAADAAAABAYWdvcmljL25vdGlmaWVyLXYwLjcuMC11MjEuMC9zcmMvcHVibGlzaC1raXQuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZmFyIiwiQGVuZG8vcHJvbWlzZS1raXQiLCJAZW5kby9wYXR0ZXJucyIsIkBhZ29yaWMvdmF0LWRhdGEiXSwiZXhwb3J0cyI6WyJGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclNoYXBlIiwiSXRlcmFibGVFYWNoVG9waWNJIiwiSXRlcmFibGVMYXRlc3RUb3BpY0kiLCJQdWJsaXNoZXJJIiwiU3Vic2NyaWJlckkiLCJTdWJzY3JpYmVyU2hhcGUiLCJVcGRhdGVDb3VudFNoYXBlIiwibWFrZVB1Ymxpc2hLaXQiLCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiLCJwdWJsaXNoS2l0SUtpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwscSxFLEZhcixtYWtlUHJvbWlzZUtpdCxNLGdldEludGVyZmFjZUd1YXJkUGF5bG9hZCxjYW5CZUR1cmFibGUscHJlcGFyZUV4b0NsYXNzS2l0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV0sW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcIm1ha2VQcm9taXNlS2l0XCIsWyRozY9fYSA9PiAobWFrZVByb21pc2VLaXQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkXCIsWyRozY9fYSA9PiAoZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wiY2FuQmVEdXJhYmxlXCIsWyRozY9fYSA9PiAoY2FuQmVEdXJhYmxlID0gJGjNj19hKV1dLFtcInByZXBhcmVFeG9DbGFzc0tpdFwiLFskaM2PX2EgPT4gKHByZXBhcmVFeG9DbGFzc0tpdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cbi8qXG5cblxuICovXG5cbmNvbnN0IHNpbmsgPSAoKSA9PiB7fTtcbmNvbnN0IG1ha2VRdWlldFJlamVjdGlvbiA9IHJlYXNvbiA9PiB7XG4gIGNvbnN0IHJlamVjdGlvbiA9IGhhcmRlbihQcm9taXNlLnJlamVjdChyZWFzb24pKTtcbiAgdm9pZCBFLndoZW4ocmVqZWN0aW9uLCBzaW5rLCBzaW5rKTtcbiAgcmV0dXJuIHJlamVjdGlvbjtcbn07XG5jb25zdCB0b29GYXJSZWplY3Rpb24gPSBtYWtlUXVpZXRSZWplY3Rpb24oXG4gIGhhcmRlbihFcnJvcignQ2Fubm90IHJlYWQgcGFzdCBlbmQgb2YgaXRlcmF0aW9uLicpKSxcbik7XG5cbiAgICAgICBjb25zdCBQdWJsaXNoZXJJID0gTS5pbnRlcmZhY2UoJ1B1Ymxpc2hlcicsIHtcbiAgcHVibGlzaDogTS5jYWxsKE0uYW55KCkpLnJldHVybnMoKSxcbiAgZmluaXNoOiBNLmNhbGwoTS5hbnkoKSkucmV0dXJucygpLFxuICBmYWlsOiBNLmNhbGwoTS5hbnkoKSkucmV0dXJucygpLFxufSk7XG5cbi8vXG4kaM2PX29uY2UuUHVibGlzaGVySShQdWJsaXNoZXJJKTtjb25zdCBVcGRhdGVDb3VudFNoYXBlPU0ub3IoTS5iaWdpbnQoKSxNLm51bWJlcigpKTskaM2PX29uY2UuVXBkYXRlQ291bnRTaGFwZShVcGRhdGVDb3VudFNoYXBlKTtcbiAgICAgICBjb25zdCBTdWJzY3JpYmVySSA9IE0uaW50ZXJmYWNlKCdTdWJzY3JpYmVyJywge1xuICBzdWJzY3JpYmVBZnRlcjogTS5jYWxsKCkub3B0aW9uYWwoTS5iaWdpbnQoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIGdldFVwZGF0ZVNpbmNlOiBNLmNhbGwoKS5vcHRpb25hbChVcGRhdGVDb3VudFNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbn0pOyRozY9fb25jZS5TdWJzY3JpYmVySShTdWJzY3JpYmVySSk7XG4gICAgICAgY29uc3QgcHVibGlzaEtpdElLaXQgPSBoYXJkZW4oe1xuICBwdWJsaXNoZXI6IFB1Ymxpc2hlckksXG4gIHN1YnNjcmliZXI6IFN1YnNjcmliZXJJLFxufSk7JGjNj19vbmNlLnB1Ymxpc2hLaXRJS2l0KHB1Ymxpc2hLaXRJS2l0KTtcblxuICAgICAgIGNvbnN0IEZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUgPSBNLmludGVyZmFjZShcbiAgJ0ZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yJyxcbiAge1xuICAgIGZvcms6IE0uY2FsbCgpLnJldHVybnMoTS5hbnkoKSksXG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogTS5jYWxsKCkucmV0dXJucyhNLmFueSgpKSwgLy9cbiAgICBuZXh0OiBNLmNhbGxXaGVuKCkucmV0dXJucyhNLmFueSgpKSxcbiAgfSxcbik7JGjNj19vbmNlLkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUoRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSk7XG5cbiAgICAgICBjb25zdCBJdGVyYWJsZUVhY2hUb3BpY0kgPSBNLmludGVyZmFjZSgnSXRlcmFibGVFYWNoVG9waWMnLCB7XG4gIHN1YnNjcmliZUFmdGVyOlxuICAgIGdldEludGVyZmFjZUd1YXJkUGF5bG9hZChTdWJzY3JpYmVySSkubWV0aG9kR3VhcmRzLnN1YnNjcmliZUFmdGVyLFxuICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiBNLmNhbGwoKS5yZXR1cm5zKFxuICAgIE0ucmVtb3RhYmxlKCdGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvcicpLFxuICApLFxufSk7JGjNj19vbmNlLkl0ZXJhYmxlRWFjaFRvcGljSShJdGVyYWJsZUVhY2hUb3BpY0kpO1xuXG4gICAgICAgY29uc3QgSXRlcmFibGVMYXRlc3RUb3BpY0kgPSBNLmludGVyZmFjZSgnSXRlcmFibGVMYXRlc3RUb3BpYycsIHtcbiAgZ2V0VXBkYXRlU2luY2U6XG4gICAgZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkKFN1YnNjcmliZXJJKS5tZXRob2RHdWFyZHMuZ2V0VXBkYXRlU2luY2UsXG4gIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06IE0uY2FsbCgpLnJldHVybnMoXG4gICAgTS5yZW1vdGFibGUoJ0ZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yJyksXG4gICksXG59KTtcblxuLypcblxuXG5cblxuICovJGjNj19vbmNlLkl0ZXJhYmxlTGF0ZXN0VG9waWNJKEl0ZXJhYmxlTGF0ZXN0VG9waWNJKTtcbmNvbnN0IHdlYWtNZW1vaXplVW5hcnkgPSBmbiA9PiB7XG4gIGNvbnN0IGNhY2hlID0gbmV3IFdlYWtNYXAoKTtcbiAgcmV0dXJuIGFyZyA9PiB7XG4gICAgLyogICAgICAgICAgICAgICAgICovXG4gICAgY29uc3Qgb2FyZyA9IGFyZztcbiAgICBpZiAoY2FjaGUuaGFzKG9hcmcpKSB7XG4gICAgICByZXR1cm4gY2FjaGUuZ2V0KG9hcmcpO1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQgPSBmbihhcmcpO1xuICAgIGNhY2hlLnNldChvYXJnLCByZXN1bHQpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG59O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBtYWtlVXBkYXRlUmVjb3JkRnJvbVB1YmxpY2F0aW9uUmVjb3JkID0gcmVjb3JkID0+IHtcbiAgY29uc3Qge1xuICAgIGhlYWQ6IHsgdmFsdWUsIGRvbmUgfSxcbiAgICBwdWJsaXNoQ291bnQsXG4gIH0gPSByZWNvcmQ7XG4gIGlmIChkb25lKSB7XG4gICAgLy9cbiAgICByZXR1cm4gaGFyZGVuKHsgdmFsdWUsIHVwZGF0ZUNvdW50OiB1bmRlZmluZWQgfSk7XG4gIH1cbiAgcmV0dXJuIGhhcmRlbih7IHZhbHVlLCB1cGRhdGVDb3VudDogcHVibGlzaENvdW50IH0pO1xufTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VQdWJsaXNoS2l0ID0gKCkgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgdGFpbFA7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgdGFpbFI7XG4gICh7IHByb21pc2U6IHRhaWxQLCByZXNvbHZlOiB0YWlsUiB9ID0gbWFrZVByb21pc2VLaXQoKSk7XG5cbiAgbGV0IGN1cnJlbnRQdWJsaXNoQ291bnQgPSAwbjtcbiAgbGV0IGN1cnJlbnRQID0gdGFpbFA7XG4gIGNvbnN0IGFkdmFuY2VDdXJyZW50ID0gKGRvbmUsIHZhbHVlLCByZWplY3Rpb24pID0+IHtcbiAgICBpZiAodGFpbFIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0Nhbm5vdCB1cGRhdGUgc3RhdGUgYWZ0ZXIgdGVybWluYXRpb24uJyk7XG4gICAgfVxuXG4gICAgY3VycmVudFB1Ymxpc2hDb3VudCArPSAxbjtcbiAgICBjdXJyZW50UCA9IHRhaWxQO1xuICAgIGNvbnN0IHJlc29sdmVDdXJyZW50ID0gdGFpbFI7XG5cbiAgICBpZiAoZG9uZSkge1xuICAgICAgdGFpbFAgPSB0b29GYXJSZWplY3Rpb247XG4gICAgICB0YWlsUiA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgKHsgcHJvbWlzZTogdGFpbFAsIHJlc29sdmU6IHRhaWxSIH0gPSBtYWtlUHJvbWlzZUtpdCgpKTtcbiAgICB9XG5cbiAgICBpZiAocmVqZWN0aW9uKSB7XG4gICAgICByZXNvbHZlQ3VycmVudChyZWplY3Rpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNvbHZlQ3VycmVudChcbiAgICAgICAgaGFyZGVuKHtcbiAgICAgICAgICBoZWFkOiB7IHZhbHVlLCBkb25lIH0sXG4gICAgICAgICAgcHVibGlzaENvdW50OiBjdXJyZW50UHVibGlzaENvdW50LFxuICAgICAgICAgIHRhaWw6IHRhaWxQLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IG1ha2VNZW1vaXplZFVwZGF0ZVJlY29yZCA9IHdlYWtNZW1vaXplVW5hcnkoXG4gICAgbWFrZVVwZGF0ZVJlY29yZEZyb21QdWJsaWNhdGlvblJlY29yZCxcbiAgKTtcblxuICAvKlxuXG5cbiAgICovXG4gIGNvbnN0IHN1YnNjcmliZXIgPSBGYXIoJ1N1YnNjcmliZXInLCB7XG4gICAgc3Vic2NyaWJlQWZ0ZXI6IChwdWJsaXNoQ291bnQgPSAtMW4pID0+IHtcbiAgICAgIGFzc2VydC50eXBlb2YocHVibGlzaENvdW50LCAnYmlnaW50Jyk7XG4gICAgICBpZiAocHVibGlzaENvdW50ID09PSBjdXJyZW50UHVibGlzaENvdW50KSB7XG4gICAgICAgIHJldHVybiB0YWlsUDtcbiAgICAgIH0gZWxzZSBpZiAocHVibGlzaENvdW50IDwgY3VycmVudFB1Ymxpc2hDb3VudCkge1xuICAgICAgICByZXR1cm4gY3VycmVudFA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAnc3Vic2NyaWJlQWZ0ZXIgYXJndW1lbnQgbXVzdCBiZSBhIHByZXZpb3VzbHktaXNzdWVkIHB1Ymxpc2hDb3VudC4nLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0sXG4gICAgZ2V0VXBkYXRlU2luY2U6IHVwZGF0ZUNvdW50ID0+IHtcbiAgICAgIGlmICh1cGRhdGVDb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBzdWJzY3JpYmVyLnN1YnNjcmliZUFmdGVyKCkudGhlbihtYWtlTWVtb2l6ZWRVcGRhdGVSZWNvcmQpO1xuICAgICAgfVxuICAgICAgdXBkYXRlQ291bnQgPSBCaWdJbnQodXBkYXRlQ291bnQpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgc3Vic2NyaWJlclxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC5zdWJzY3JpYmVBZnRlcih1cGRhdGVDb3VudClcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLnRoZW4oKCkgPT4gc3Vic2NyaWJlci5nZXRVcGRhdGVTaW5jZSgpKVxuICAgICAgKTtcbiAgICB9LFxuICB9KTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgcHVibGlzaGVyID0gRmFyKCdQdWJsaXNoZXInLCB7XG4gICAgcHVibGlzaDogdmFsdWUgPT4ge1xuICAgICAgYWR2YW5jZUN1cnJlbnQoZmFsc2UsIHZhbHVlKTtcbiAgICB9LFxuICAgIGZpbmlzaDogZmluYWxWYWx1ZSA9PiB7XG4gICAgICBhZHZhbmNlQ3VycmVudCh0cnVlLCBmaW5hbFZhbHVlKTtcbiAgICB9LFxuICAgIGZhaWw6IHJlYXNvbiA9PiB7XG4gICAgICBhZHZhbmNlQ3VycmVudCh0cnVlLCB1bmRlZmluZWQsIG1ha2VRdWlldFJlamVjdGlvbihyZWFzb24pKTtcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIGhhcmRlbih7IHB1Ymxpc2hlciwgc3Vic2NyaWJlciB9KTtcbn07JGjNj19vbmNlLm1ha2VQdWJsaXNoS2l0KG1ha2VQdWJsaXNoS2l0KTtcbmhhcmRlbihtYWtlUHVibGlzaEtpdCk7XG5cbmNvbnN0IER1cmFibGVQdWJsaXNoS2l0U3RhdGVTaGFwZSA9IGhhcmRlbih7XG4gIHZhbHVlRHVyYWJpbGl0eTogTS5hbnkoKSxcbiAgcHVibGlzaENvdW50OiBNLmFueSgpLFxuICBzdGF0dXM6IE0uYW55KCksXG4gIGhhc1ZhbHVlOiBNLmFueSgpLFxuICB2YWx1ZTogTS5hbnkoKSxcbn0pO1xuXG4vL1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBpbml0RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZSA9IChvcHRpb25zID0ge30pID0+IHtcbiAgY29uc3QgeyB2YWx1ZUR1cmFiaWxpdHkgPSAnbWFuZGF0b3J5JyB9ID0gb3B0aW9ucztcbiAgYXNzZXJ0LmVxdWFsKHZhbHVlRHVyYWJpbGl0eSwgJ21hbmRhdG9yeScpO1xuICByZXR1cm4ge1xuICAgIC8vXG4gICAgdmFsdWVEdXJhYmlsaXR5LFxuXG4gICAgLy9cbiAgICBwdWJsaXNoQ291bnQ6IDBuLFxuICAgIHN0YXR1czogJ2xpdmUnLCAvL1xuXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgaGFzVmFsdWU6IGZhbHNlLFxuICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gIH07XG59O1xuXG4vL1xuLy9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLypcblxuXG4gKi9cbmNvbnN0IGdldEVwaGVtZXJhbEtleSA9IGZhY2V0cyA9PiBmYWNldHMucHVibGlzaGVyO1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YSA9IG5ldyBXZWFrTWFwKCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBwcm92aWRlQ3VycmVudFAgPSAoc3RhdGUsIGZhY2V0cywgdGFpbCkgPT4ge1xuICBjb25zdCBlcGhlbWVyYWxLZXkgPSBnZXRFcGhlbWVyYWxLZXkoZmFjZXRzKTtcbiAgY29uc3QgZm91bmREYXRhID0gZHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhLmdldChlcGhlbWVyYWxLZXkpO1xuICBjb25zdCBjdXJyZW50UCA9IGZvdW5kRGF0YSAmJiBmb3VuZERhdGEuY3VycmVudFA7XG4gIGlmIChjdXJyZW50UCkge1xuICAgIHJldHVybiBjdXJyZW50UDtcbiAgfVxuXG4gIGNvbnN0IHsgcHVibGlzaENvdW50LCBzdGF0dXMsIGhhc1ZhbHVlLCB2YWx1ZSB9ID0gc3RhdGU7XG4gIGlmICghaGFzVmFsdWUpIHtcbiAgICBhc3NlcnQoc3RhdHVzID09PSAnbGl2ZScpO1xuICAgIHJldHVybiB0YWlsO1xuICB9XG4gIGlmIChzdGF0dXMgPT09ICdsaXZlJyB8fCBzdGF0dXMgPT09ICdmaW5pc2hlZCcpIHtcbiAgICBjb25zdCBjZWxsID0gaGFyZGVuKHtcbiAgICAgIGhlYWQ6IHsgdmFsdWUsIGRvbmU6IHN0YXR1cyAhPT0gJ2xpdmUnIH0sXG4gICAgICBwdWJsaXNoQ291bnQsXG4gICAgICB0YWlsLFxuICAgIH0pO1xuICAgIHJldHVybiBFLnJlc29sdmUoY2VsbCk7XG4gIH0gZWxzZSBpZiAoc3RhdHVzID09PSAnZmFpbGVkJykge1xuICAgIHJldHVybiBtYWtlUXVpZXRSZWplY3Rpb24odmFsdWUpO1xuICB9IGVsc2Uge1xuICAgIHRocm93IEZhaWxgSW52YWxpZCBkdXJhYmxlIHByb21pc2Uga2l0IHN0YXR1czogJHtxKHN0YXR1cyl9YDtcbiAgfVxufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHByb3ZpZGVEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEgPSAoc3RhdGUsIGZhY2V0cykgPT4ge1xuICBjb25zdCBlcGhlbWVyYWxLZXkgPSBnZXRFcGhlbWVyYWxLZXkoZmFjZXRzKTtcbiAgY29uc3QgZm91bmREYXRhID0gZHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhLmdldChlcGhlbWVyYWxLZXkpO1xuICBpZiAoZm91bmREYXRhKSB7XG4gICAgcmV0dXJuIGZvdW5kRGF0YTtcbiAgfVxuXG4gIGNvbnN0IHsgc3RhdHVzIH0gPSBzdGF0ZTtcbiAgbGV0IHRhaWxQO1xuICBsZXQgdGFpbFI7XG4gIGlmIChzdGF0dXMgPT09ICdsaXZlJykge1xuICAgICh7IHByb21pc2U6IHRhaWxQLCByZXNvbHZlOiB0YWlsUiB9ID0gbWFrZVByb21pc2VLaXQoKSk7XG4gICAgdm9pZCBFLndoZW4odGFpbFAsIHNpbmssIHNpbmspO1xuICB9IGVsc2UgaWYgKHN0YXR1cyA9PT0gJ2ZpbmlzaGVkJyB8fCBzdGF0dXMgPT09ICdmYWlsZWQnKSB7XG4gICAgdGFpbFAgPSB0b29GYXJSZWplY3Rpb247XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgRmFpbGBJbnZhbGlkIGR1cmFibGUgcHJvbWlzZSBraXQgc3RhdHVzOiAke3Eoc3RhdHVzKX1gO1xuICB9XG4gIC8vXG4gIGNvbnN0IG9iaiA9IGhhcmRlbih7IGN1cnJlbnRQOiB1bmRlZmluZWQsIHRhaWxQLCB0YWlsUiB9KTtcbiAgZHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhLnNldChlcGhlbWVyYWxLZXksIG9iaik7XG4gIHJldHVybiBvYmo7XG59O1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgYWR2YW5jZUR1cmFibGVQdWJsaXNoS2l0ID0gKGNvbnRleHQsIHZhbHVlLCB0YXJnZXRTdGF0dXMgPSAnbGl2ZScpID0+IHtcbiAgY29uc3QgeyBzdGF0ZSwgZmFjZXRzIH0gPSBjb250ZXh0O1xuICBjb25zdCB7IHZhbHVlRHVyYWJpbGl0eSwgc3RhdHVzIH0gPSBzdGF0ZTtcbiAgaWYgKHN0YXR1cyAhPT0gJ2xpdmUnKSB7XG4gICAgdGhyb3cgRXJyb3IoJ0Nhbm5vdCB1cGRhdGUgc3RhdGUgYWZ0ZXIgdGVybWluYXRpb24uJyk7XG4gIH1cbiAgY29uc3QgZG9uZSA9IHRhcmdldFN0YXR1cyAhPT0gJ2xpdmUnO1xuICBpZiAoZG9uZSB8fCB2YWx1ZUR1cmFiaWxpdHkgPT09ICdtYW5kYXRvcnknKSB7XG4gICAgY2FuQmVEdXJhYmxlKHZhbHVlKSB8fCBGYWlsYENhbm5vdCBhY2NlcHQgbm9uLWR1cmFibGUgdmFsdWU6ICR7dmFsdWV9YDtcbiAgfVxuICBjb25zdCB7IHRhaWxQOiBvbGRUYWlsUCwgdGFpbFI6IHJlc29sdmVPbGRUYWlsIH0gPVxuICAgIHByb3ZpZGVEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEoc3RhdGUsIGZhY2V0cyk7XG4gIGFzc2VydC50eXBlb2YocmVzb2x2ZU9sZFRhaWwsICdmdW5jdGlvbicpO1xuXG4gIGNvbnN0IHB1Ymxpc2hDb3VudCA9IHN0YXRlLnB1Ymxpc2hDb3VudCArIDFuO1xuICBzdGF0ZS5wdWJsaXNoQ291bnQgPSBwdWJsaXNoQ291bnQ7XG5cbiAgbGV0IHRhaWxQO1xuICBsZXQgdGFpbFI7XG4gIGlmIChkb25lKSB7XG4gICAgc3RhdGUuc3RhdHVzID0gdGFyZ2V0U3RhdHVzO1xuICAgIHRhaWxQID0gdG9vRmFyUmVqZWN0aW9uO1xuICAgIHRhaWxSID0gdW5kZWZpbmVkO1xuICB9IGVsc2Uge1xuICAgICh7IHByb21pc2U6IHRhaWxQLCByZXNvbHZlOiB0YWlsUiB9ID0gbWFrZVByb21pc2VLaXQoKSk7XG4gICAgdm9pZCBFLndoZW4odGFpbFAsIHNpbmssIHNpbmspO1xuICB9XG5cbiAgbGV0IGN1cnJlbnRQO1xuICBpZiAodGFyZ2V0U3RhdHVzID09PSAnZmFpbGVkJykge1xuICAgIHN0YXRlLmhhc1ZhbHVlID0gdHJ1ZTtcbiAgICBzdGF0ZS52YWx1ZSA9IHZhbHVlO1xuICAgIGNvbnN0IHJlamVjdGlvbiA9IG1ha2VRdWlldFJlamVjdGlvbih2YWx1ZSk7XG4gICAgcmVzb2x2ZU9sZFRhaWwocmVqZWN0aW9uKTtcbiAgfSBlbHNlIHtcbiAgICAvL1xuICAgIC8vXG4gICAgaWYgKGRvbmUgfHwgKHZhbHVlRHVyYWJpbGl0eSAhPT0gJ2lnbm9yZWQnICYmIGNhbkJlRHVyYWJsZSh2YWx1ZSkpKSB7XG4gICAgICBzdGF0ZS5oYXNWYWx1ZSA9IHRydWU7XG4gICAgICBzdGF0ZS52YWx1ZSA9IHZhbHVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5oYXNWYWx1ZSA9IGZhbHNlO1xuICAgICAgc3RhdGUudmFsdWUgPSB1bmRlZmluZWQ7XG4gICAgICAvL1xuICAgICAgY3VycmVudFAgPSBvbGRUYWlsUDtcbiAgICB9XG5cbiAgICByZXNvbHZlT2xkVGFpbChcbiAgICAgIGhhcmRlbih7XG4gICAgICAgIGhlYWQ6IHsgdmFsdWUsIGRvbmUgfSxcbiAgICAgICAgcHVibGlzaENvdW50LFxuICAgICAgICB0YWlsOiB0YWlsUCxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBkdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEuc2V0KFxuICAgIGdldEVwaGVtZXJhbEtleShmYWNldHMpLFxuICAgIGhhcmRlbih7IGN1cnJlbnRQLCB0YWlsUCwgdGFpbFIgfSksXG4gICk7XG59O1xuXG4vKlxuXG5cblxuICovXG4gICAgICAgY29uc3QgcHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0ID0gKGJhZ2dhZ2UsIGtpbmROYW1lKSA9PiB7XG4gIC8vXG4gIC8vXG4gIGNvbnN0IG1ha2VNZW1vaXplZFVwZGF0ZVJlY29yZCA9IG1ha2VVcGRhdGVSZWNvcmRGcm9tUHVibGljYXRpb25SZWNvcmQ7XG5cbiAgcmV0dXJuIHByZXBhcmVFeG9DbGFzc0tpdChcbiAgICBiYWdnYWdlLFxuICAgIGtpbmROYW1lLFxuICAgIHB1Ymxpc2hLaXRJS2l0LFxuICAgIGluaXREdXJhYmxlUHVibGlzaEtpdFN0YXRlLFxuICAgIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgcHVibGlzaGVyOiB7XG4gICAgICAgIHB1Ymxpc2godmFsdWUpIHtcbiAgICAgICAgICBhZHZhbmNlRHVyYWJsZVB1Ymxpc2hLaXQodGhpcywgdmFsdWUpO1xuICAgICAgICB9LFxuICAgICAgICBmaW5pc2goZmluYWxWYWx1ZSkge1xuICAgICAgICAgIGFkdmFuY2VEdXJhYmxlUHVibGlzaEtpdCh0aGlzLCBmaW5hbFZhbHVlLCAnZmluaXNoZWQnKTtcbiAgICAgICAgfSxcbiAgICAgICAgZmFpbChyZWFzb24pIHtcbiAgICAgICAgICBhZHZhbmNlRHVyYWJsZVB1Ymxpc2hLaXQodGhpcywgcmVhc29uLCAnZmFpbGVkJyk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHN1YnNjcmliZXI6IHtcbiAgICAgICAgc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50ID0gLTFuKSB7XG4gICAgICAgICAgY29uc3QgeyBzdGF0ZSwgZmFjZXRzIH0gPSB0aGlzO1xuICAgICAgICAgIGNvbnN0IHsgcHVibGlzaENvdW50OiBjdXJyZW50UHVibGlzaENvdW50IH0gPSBzdGF0ZTtcbiAgICAgICAgICBjb25zdCB7IGN1cnJlbnRQLCB0YWlsUCB9ID0gcHJvdmlkZUR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YShcbiAgICAgICAgICAgIHN0YXRlLFxuICAgICAgICAgICAgZmFjZXRzLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHB1Ymxpc2hDb3VudCA9PT0gY3VycmVudFB1Ymxpc2hDb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuIHRhaWxQO1xuICAgICAgICAgIH0gZWxzZSBpZiAocHVibGlzaENvdW50IDwgY3VycmVudFB1Ymxpc2hDb3VudCkge1xuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRQIHx8IHByb3ZpZGVDdXJyZW50UChzdGF0ZSwgZmFjZXRzLCB0YWlsUCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgICAnc3Vic2NyaWJlQWZ0ZXIgYXJndW1lbnQgbXVzdCBiZSBhIHByZXZpb3VzbHktaXNzdWVkIHB1Ymxpc2hDb3VudC4nLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50KSB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgZmFjZXRzOiB7IHN1YnNjcmliZXIgfSxcbiAgICAgICAgICB9ID0gdGhpcztcbiAgICAgICAgICBpZiAodXBkYXRlQ291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIHN1YnNjcmliZXIuc3Vic2NyaWJlQWZ0ZXIoKS50aGVuKG1ha2VNZW1vaXplZFVwZGF0ZVJlY29yZCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHVwZGF0ZUNvdW50ID0gQmlnSW50KHVwZGF0ZUNvdW50KTtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgc3Vic2NyaWJlclxuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAuc3Vic2NyaWJlQWZ0ZXIodXBkYXRlQ291bnQpXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC50aGVuKCgpID0+IHN1YnNjcmliZXIuZ2V0VXBkYXRlU2luY2UoKSlcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHN0YXRlU2hhcGU6IER1cmFibGVQdWJsaXNoS2l0U3RhdGVTaGFwZSxcbiAgICB9LFxuICApO1xufTskaM2PX29uY2UucHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0KHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCk7XG5oYXJkZW4ocHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0KTtcblxuICAgICAgIGNvbnN0IFN1YnNjcmliZXJTaGFwZSA9IE0ucmVtb3RhYmxlKCdTdWJzY3JpYmVyJyk7JGjNj19vbmNlLlN1YnNjcmliZXJTaGFwZShTdWJzY3JpYmVyU2hhcGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUHVibGlzaGVySSI6WyJQdWJsaXNoZXJJIl0sIlVwZGF0ZUNvdW50U2hhcGUiOlsiVXBkYXRlQ291bnRTaGFwZSJdLCJTdWJzY3JpYmVySSI6WyJTdWJzY3JpYmVySSJdLCJwdWJsaXNoS2l0SUtpdCI6WyJwdWJsaXNoS2l0SUtpdCJdLCJGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclNoYXBlIjpbIkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUiXSwiSXRlcmFibGVFYWNoVG9waWNJIjpbIkl0ZXJhYmxlRWFjaFRvcGljSSJdLCJJdGVyYWJsZUxhdGVzdFRvcGljSSI6WyJJdGVyYWJsZUxhdGVzdFRvcGljSSJdLCJtYWtlUHVibGlzaEtpdCI6WyJtYWtlUHVibGlzaEtpdCJdLCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiOlsicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0Il0sIlN1YnNjcmliZXJTaGFwZSI6WyJTdWJzY3JpYmVyU2hhcGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA1hwl75UIAACVCAAANAAAAEBhZ29yaWMvbm90aWZpZXItdjAuNy4wLXUyMS4wL3NyYy9zdG9yZWQtbm90aWZpZXIuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiLCJAZW5kby9mYXIiLCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIl0sImV4cG9ydHMiOlsibWFrZVN0b3JlZE5vdGlmaWVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYXNzZXJ0QWxsRGVmaW5lZCxtYWtlU2VyaWFsaXplVG9TdG9yYWdlLEUsRmFyLG9ic2VydmVOb3RpZmllcjskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcImFzc2VydEFsbERlZmluZWRcIixbJGjNj19hID0+IChhc3NlcnRBbGxEZWZpbmVkID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qc1wiLCBbW1wibWFrZVNlcmlhbGl6ZVRvU3RvcmFnZVwiLFskaM2PX2EgPT4gKG1ha2VTZXJpYWxpemVUb1N0b3JhZ2UgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanNcIiwgW1tcIm9ic2VydmVOb3RpZmllclwiLFskaM2PX2EgPT4gKG9ic2VydmVOb3RpZmllciA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG4vKlxuXG5cblxuXG4gKi9cblxuLypcblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZVN0b3JlZE5vdGlmaWVyID0gKG5vdGlmaWVyLCBzdG9yYWdlTm9kZSwgbWFyc2hhbGxlcikgPT4ge1xuICBhc3NlcnRBbGxEZWZpbmVkKHsgbm90aWZpZXIsIHN0b3JhZ2VOb2RlLCBtYXJzaGFsbGVyIH0pO1xuXG4gIGNvbnN0IG1hcnNoYWxsVG9TdG9yYWdlID0gbWFrZVNlcmlhbGl6ZVRvU3RvcmFnZShzdG9yYWdlTm9kZSwgbWFyc2hhbGxlcik7XG5cbiAgb2JzZXJ2ZU5vdGlmaWVyKG5vdGlmaWVyLCB7XG4gICAgdXBkYXRlU3RhdGUodmFsdWUpIHtcbiAgICAgIG1hcnNoYWxsVG9TdG9yYWdlKHZhbHVlKS5jYXRjaChyZWFzb24gPT5cbiAgICAgICAgY29uc29sZS5lcnJvcignU3RvcmVkTm90aWZpZXIgZmFpbGVkIHRvIHVwZGF0ZVN0YXRlJywgcmVhc29uKSxcbiAgICAgICk7XG4gICAgfSxcbiAgICBmYWlsKHJlYXNvbikge1xuICAgICAgY29uc29sZS5lcnJvcignU3RvcmVkTm90aWZpZXIgZmFpbGVkIHRvIGl0ZXJhdGUnLCByZWFzb24pO1xuICAgIH0sXG4gIH0pLmNhdGNoKHJlYXNvbiA9PiB7XG4gICAgY29uc29sZS5lcnJvcignU3RvcmVkTm90aWZpZXIgaGFsdGVkIGl0ZXJhdGlvbicsIHJlYXNvbik7XG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCB1bnNlcmlhbGl6ZXIgPSBGYXIoJ3Vuc2VyaWFsaXplcicsIHtcbiAgICBmcm9tQ2FwRGF0YTogZGF0YSA9PiBFKG1hcnNoYWxsZXIpLmZyb21DYXBEYXRhKGRhdGEpLFxuICAgIHVuc2VyaWFsaXplOiBkYXRhID0+IEUobWFyc2hhbGxlcikuZnJvbUNhcERhdGEoZGF0YSksXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHN0b3JlZE5vdGlmaWVyID0gRmFyKCdTdG9yZWROb3RpZmllcicsIHtcbiAgICBnZXRVcGRhdGVTaW5jZTogdXBkYXRlQ291bnQgPT4gRShub3RpZmllcikuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpLFxuICAgIGdldFBhdGg6ICgpID0+IEUoc3RvcmFnZU5vZGUpLmdldFBhdGgoKSxcbiAgICBnZXRVbnNlcmlhbGl6ZXI6ICgpID0+IHVuc2VyaWFsaXplcixcbiAgfSk7XG4gIHJldHVybiBzdG9yZWROb3RpZmllcjtcbn07JGjNj19vbmNlLm1ha2VTdG9yZWROb3RpZmllcihtYWtlU3RvcmVkTm90aWZpZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVN0b3JlZE5vdGlmaWVyIjpbIm1ha2VTdG9yZWROb3RpZmllciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABIlYDC/hcAAP4XAAAtAAAAQGFnb3JpYy9ub3RpZmllci12MC43LjAtdTIxLjAvc3JjL3N0b3Jlc3ViLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ZhciIsIkBlbmRvL21hcnNoYWwiLCJAYWdvcmljL2ludGVybmFsIiwiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyIsIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiLCIuL3B1Ymxpc2gta2l0LmpzIiwiLi9zdWJzY3JpYmVyLmpzIiwiLi9zdWJzY3JpYmUuanMiXSwiZXhwb3J0cyI6WyJmb3JFYWNoUHVibGljYXRpb25SZWNvcmQiLCJtYWtlU3RvcmVkUHVibGlzaEtpdCIsIm1ha2VTdG9yZWRQdWJsaXNoZXJLaXQiLCJtYWtlU3RvcmVkU3Vic2NyaWJlciIsIm1ha2VTdG9yZWRTdWJzY3JpcHRpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBFLEZhcixtYWtlTWFyc2hhbCxhc3NlcnRBbGxEZWZpbmVkLG1ha2VTZXJpYWxpemVUb1N0b3JhZ2Usb2JzZXJ2ZUl0ZXJhdGlvbixtYWtlUHVibGlzaEtpdCxtYWtlU3Vic2NyaXB0aW9uS2l0LHN1YnNjcmliZUVhY2g7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIm1ha2VNYXJzaGFsXCIsWyRozY9fYSA9PiAobWFrZU1hcnNoYWwgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJhc3NlcnRBbGxEZWZpbmVkXCIsWyRozY9fYSA9PiAoYXNzZXJ0QWxsRGVmaW5lZCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanNcIiwgW1tcIm1ha2VTZXJpYWxpemVUb1N0b3JhZ2VcIixbJGjNj19hID0+IChtYWtlU2VyaWFsaXplVG9TdG9yYWdlID0gJGjNj19hKV1dXV0sW1wiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc1wiLCBbW1wib2JzZXJ2ZUl0ZXJhdGlvblwiLFskaM2PX2EgPT4gKG9ic2VydmVJdGVyYXRpb24gPSAkaM2PX2EpXV1dXSxbXCIuL3B1Ymxpc2gta2l0LmpzXCIsIFtbXCJtYWtlUHVibGlzaEtpdFwiLFskaM2PX2EgPT4gKG1ha2VQdWJsaXNoS2l0ID0gJGjNj19hKV1dXV0sW1wiLi9zdWJzY3JpYmVyLmpzXCIsIFtbXCJtYWtlU3Vic2NyaXB0aW9uS2l0XCIsWyRozY9fYSA9PiAobWFrZVN1YnNjcmlwdGlvbktpdCA9ICRozY9fYSldXV1dLFtcIi4vc3Vic2NyaWJlLmpzXCIsIFtbXCJzdWJzY3JpYmVFYWNoXCIsWyRozY9fYSA9PiAoc3Vic2NyaWJlRWFjaCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuLypcblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkID0gYXN5bmMgKHN1YnNjcmliZXIsIGNvbnN1bWVWYWx1ZSkgPT4ge1xuICAvL1xuICAvL1xuICBjb25zdCBpdGVyYXRvciA9IHN1YnNjcmliZUVhY2goc3Vic2NyaWJlcilbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCk7XG5cbiAgbGV0IGZpbmlzaGVkID0gZmFsc2U7XG4gIGF3YWl0IG51bGw7XG4gIHdoaWxlICghZmluaXNoZWQpIHtcbiAgICBjb25zdCB7IHZhbHVlLCBkb25lIH0gPSBhd2FpdCBpdGVyYXRvci5uZXh0KCk7XG4gICAgYXdhaXQgY29uc3VtZVZhbHVlKHZhbHVlKTtcbiAgICBmaW5pc2hlZCA9ICEhZG9uZTtcbiAgfVxufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmZvckVhY2hQdWJsaWNhdGlvblJlY29yZChmb3JFYWNoUHVibGljYXRpb25SZWNvcmQpO1xuICAgICAgIGNvbnN0IG1ha2VTdG9yZWRTdWJzY3JpYmVyID0gKHN1YnNjcmliZXIsIHN0b3JhZ2VOb2RlLCBtYXJzaGFsbGVyKSA9PiB7XG4gIGFzc2VydEFsbERlZmluZWQoeyBzdWJzY3JpYmVyLCBzdG9yYWdlTm9kZSwgbWFyc2hhbGxlciB9KTtcblxuICBjb25zdCBtYXJzaGFsbFRvU3RvcmFnZSA9IG1ha2VTZXJpYWxpemVUb1N0b3JhZ2Uoc3RvcmFnZU5vZGUsIG1hcnNoYWxsZXIpO1xuXG4gIC8vXG4gIGZvckVhY2hQdWJsaWNhdGlvblJlY29yZChzdWJzY3JpYmVyLCBtYXJzaGFsbFRvU3RvcmFnZSkuY2F0Y2goZXJyID0+IHtcbiAgICAvL1xuICAgIC8vXG4gICAgY29uc29sZS5lcnJvcignU3RvcmVkU3Vic2NyaWJlciBmYWlsZWQgdG8gaXRlcmF0ZScsIGVycik7XG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCB1bnNlcmlhbGl6ZXIgPSBGYXIoJ3Vuc2VyaWFsaXplcicsIHtcbiAgICBmcm9tQ2FwRGF0YTogZGF0YSA9PiBFKG1hcnNoYWxsZXIpLmZyb21DYXBEYXRhKGRhdGEpLFxuICAgIHVuc2VyaWFsaXplOiBkYXRhID0+IEUobWFyc2hhbGxlcikuZnJvbUNhcERhdGEoZGF0YSksXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3Qgc3RvcmVzdWIgPSBGYXIoJ1N0b3JlZFN1YnNjcmliZXInLCB7XG4gICAgc3Vic2NyaWJlQWZ0ZXI6IHB1Ymxpc2hDb3VudCA9PiBzdWJzY3JpYmVyLnN1YnNjcmliZUFmdGVyKHB1Ymxpc2hDb3VudCksXG4gICAgZ2V0VXBkYXRlU2luY2U6IHVwZGF0ZUNvdW50ID0+IHN1YnNjcmliZXIuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpLFxuICAgIGdldFBhdGg6ICgpID0+IEUoc3RvcmFnZU5vZGUpLmdldFBhdGgoKSxcbiAgICBnZXRTdG9yZUtleTogKCkgPT4gRShzdG9yYWdlTm9kZSkuZ2V0U3RvcmVLZXkoKSxcbiAgICBnZXRVbnNlcmlhbGl6ZXI6ICgpID0+IHVuc2VyaWFsaXplcixcbiAgfSk7XG4gIHJldHVybiBzdG9yZXN1Yjtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLm1ha2VTdG9yZWRTdWJzY3JpYmVyKG1ha2VTdG9yZWRTdWJzY3JpYmVyKTtcbiAgICAgICBjb25zdCBtYWtlU3RvcmVkU3Vic2NyaXB0aW9uID0gKFxuICBzdWJzY3JpcHRpb24sXG4gIHN0b3JhZ2VOb2RlLFxuICBtYXJzaGFsbGVyID0gbWFrZU1hcnNoYWwodW5kZWZpbmVkLCB1bmRlZmluZWQsIHtcbiAgICBtYXJzaGFsU2F2ZUVycm9yOiAoKSA9PiB7fSxcbiAgICBzZXJpYWxpemVCb2R5Rm9ybWF0OiAnc21hbGxjYXBzJyxcbiAgfSksXG4pID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHVuc2VyaWFsaXplciA9IEZhcigndW5zZXJpYWxpemVyJywge1xuICAgIGZyb21DYXBEYXRhOiBkYXRhID0+IEUobWFyc2hhbGxlcikuZnJvbUNhcERhdGEoZGF0YSksXG4gICAgdW5zZXJpYWxpemU6IGRhdGEgPT4gRShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKSxcbiAgfSk7XG5cbiAgLy9cbiAgbGV0IHB1Ymxpc2hGYWlsZWQgPSBmYWxzZTtcbiAgbGV0IHB1Ymxpc2hFeGNlcHRpb247XG5cbiAgY29uc3QgZmFpbCA9IGVyciA9PiB7XG4gICAgcHVibGlzaEZhaWxlZCA9IHRydWU7XG4gICAgcHVibGlzaEV4Y2VwdGlvbiA9IGVycjtcbiAgfTtcblxuICAvL1xuICAvL1xuICBjb25zdCBwdWJsaXNoVmFsdWUgPSBvYmogPT4ge1xuICAgIGFzc2VydChzdG9yYWdlTm9kZSk7XG4gICAgaWYgKHB1Ymxpc2hGYWlsZWQpIHtcbiAgICAgIC8vXG4gICAgICB0aHJvdyBwdWJsaXNoRXhjZXB0aW9uO1xuICAgIH1cblxuICAgIC8vXG4gICAgRShtYXJzaGFsbGVyKVxuICAgICAgLnRvQ2FwRGF0YShvYmopXG4gICAgICAudGhlbihzZXJpYWxpemVkID0+IHtcbiAgICAgICAgY29uc3QgZW5jb2RlZCA9IEpTT04uc3RyaW5naWZ5KHNlcmlhbGl6ZWQpO1xuICAgICAgICByZXR1cm4gRShzdG9yYWdlTm9kZSkuc2V0VmFsdWUoZW5jb2RlZCk7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGZhaWwpO1xuICB9O1xuXG4gIGlmIChzdG9yYWdlTm9kZSkge1xuICAgIC8vXG4gICAgb2JzZXJ2ZUl0ZXJhdGlvbihzdWJzY3JpcHRpb24sIHtcbiAgICAgIHVwZGF0ZVN0YXRlOiBwdWJsaXNoVmFsdWUsXG4gICAgICBmaW5pc2g6IHB1Ymxpc2hWYWx1ZSxcbiAgICB9KS5jYXRjaChmYWlsKTtcbiAgfVxuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBzdG9yZXN1YiA9IEZhcignU3RvcmVkU3Vic2NyaXB0aW9uJywge1xuICAgIC8vXG4gICAgZ2V0U3RvcmVLZXk6IGFzeW5jICgpID0+IHtcbiAgICAgIGlmICghc3RvcmFnZU5vZGUpIHtcbiAgICAgICAgcmV0dXJuIGhhcmRlbih7IHN1YnNjcmlwdGlvbiB9KTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHN0b3JlS2V5ID0gYXdhaXQgRShzdG9yYWdlTm9kZSkuZ2V0U3RvcmVLZXkoKTtcbiAgICAgIHJldHVybiBoYXJkZW4oeyAuLi5zdG9yZUtleSwgc3Vic2NyaXB0aW9uIH0pO1xuICAgIH0sXG4gICAgZ2V0VW5zZXJpYWxpemVyOiAoKSA9PiB1bnNlcmlhbGl6ZXIsXG4gICAgZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHM6ICgpID0+XG4gICAgICBzdWJzY3JpcHRpb24uZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHMoKSxcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiBzdWJzY3JpcHRpb25bU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCksXG4gICAgc3Vic2NyaWJlQWZ0ZXI6IHB1Ymxpc2hDb3VudCA9PiBzdWJzY3JpcHRpb24uc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50KSxcbiAgfSk7XG4gIHJldHVybiBzdG9yZXN1Yjtcbn07JGjNj19vbmNlLm1ha2VTdG9yZWRTdWJzY3JpcHRpb24obWFrZVN0b3JlZFN1YnNjcmlwdGlvbik7XG5oYXJkZW4obWFrZVN0b3JlZFN1YnNjcmlwdGlvbik7XG5cbi8qXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VTdG9yZWRQdWJsaXNoZXJLaXQgPSAoc3RvcmFnZU5vZGUsIG1hcnNoYWxsZXIsIGNoaWxkUGF0aCkgPT4ge1xuICBjb25zdCB7IHB1YmxpY2F0aW9uLCBzdWJzY3JpcHRpb24gfSA9IG1ha2VTdWJzY3JpcHRpb25LaXQoKTtcblxuICBpZiAoc3RvcmFnZU5vZGUgJiYgY2hpbGRQYXRoKSB7XG4gICAgc3RvcmFnZU5vZGUgPSBFKHN0b3JhZ2VOb2RlKS5tYWtlQ2hpbGROb2RlKGNoaWxkUGF0aCk7XG4gIH1cblxuICAvL1xuICBjb25zdCBzdWJzY3JpYmVyID0gbWFrZVN0b3JlZFN1YnNjcmlwdGlvbihcbiAgICBzdWJzY3JpcHRpb24sXG4gICAgc3RvcmFnZU5vZGUsXG4gICAgbWFyc2hhbGxlcixcbiAgKTtcblxuICByZXR1cm4ge1xuICAgIHB1Ymxpc2hlcjogcHVibGljYXRpb24sXG4gICAgc3Vic2NyaWJlcixcbiAgfTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UubWFrZVN0b3JlZFB1Ymxpc2hlcktpdChtYWtlU3RvcmVkUHVibGlzaGVyS2l0KTtcbiAgICAgICBjb25zdCBtYWtlU3RvcmVkUHVibGlzaEtpdCA9IChzdG9yYWdlTm9kZSwgbWFyc2hhbGxlcikgPT4ge1xuICBjb25zdCB7IHB1Ymxpc2hlciwgc3Vic2NyaWJlciB9ID0gbWFrZVB1Ymxpc2hLaXQoKTtcblxuICByZXR1cm4ge1xuICAgIHB1Ymxpc2hlcixcbiAgICAvL1xuICAgIHN1YnNjcmliZXI6IG1ha2VTdG9yZWRTdWJzY3JpYmVyKHN1YnNjcmliZXIsIHN0b3JhZ2VOb2RlLCBtYXJzaGFsbGVyKSxcbiAgfTtcbn07JGjNj19vbmNlLm1ha2VTdG9yZWRQdWJsaXNoS2l0KG1ha2VTdG9yZWRQdWJsaXNoS2l0KTtcbmhhcmRlbihtYWtlU3RvcmVkUHVibGlzaEtpdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJmb3JFYWNoUHVibGljYXRpb25SZWNvcmQiOlsiZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkIl0sIm1ha2VTdG9yZWRTdWJzY3JpYmVyIjpbIm1ha2VTdG9yZWRTdWJzY3JpYmVyIl0sIm1ha2VTdG9yZWRTdWJzY3JpcHRpb24iOlsibWFrZVN0b3JlZFN1YnNjcmlwdGlvbiJdLCJtYWtlU3RvcmVkUHVibGlzaGVyS2l0IjpbIm1ha2VTdG9yZWRQdWJsaXNoZXJLaXQiXSwibWFrZVN0b3JlZFB1Ymxpc2hLaXQiOlsibWFrZVN0b3JlZFB1Ymxpc2hLaXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAWhtnckUWAABFFgAALgAAAEBhZ29yaWMvbm90aWZpZXItdjAuNy4wLXUyMS4wL3NyYy9zdWJzY3JpYmUuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZmFyIiwiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3VwZ3JhZGUtYXBpLmpzIl0sImV4cG9ydHMiOlsic3Vic2NyaWJlIiwic3Vic2NyaWJlRWFjaCIsInN1YnNjcmliZUxhdGVzdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IFgsRmFpbCxhbm5vdGF0ZUVycm9yLEUsRmFyLGlzT2JqZWN0LGlzVXBncmFkZURpc2Nvbm5lY3Rpb247JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcImFubm90YXRlRXJyb3JcIixbJGjNj19hID0+IChhbm5vdGF0ZUVycm9yID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXSxbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJpc09iamVjdFwiLFskaM2PX2EgPT4gKGlzT2JqZWN0ID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbC9zcmMvdXBncmFkZS1hcGkuanNcIiwgW1tcImlzVXBncmFkZURpc2Nvbm5lY3Rpb25cIixbJGjNj19hID0+IChpc1VwZ3JhZGVEaXNjb25uZWN0aW9uID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLypcblxuXG4gKi9cblxuY29uc3Qgc2luayA9ICgpID0+IHt9O1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHJlY29ubmVjdEFzTmVlZGVkID0gYXN5bmMgKGdldHRlciwgc2VlZCA9IFtdKSA9PiB7XG4gIGxldCBkaXNjb25uZWN0aW9uO1xuICBsZXQgbGFzdFZlcnNpb24gPSAtSW5maW5pdHk7XG4gIC8vXG4gIGF3YWl0IG51bGw7XG4gIGZvciAobGV0IGkgPSAwOyA7IGkgKz0gMSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHRQID0gaSA8IHNlZWQubGVuZ3RoID8gc2VlZFtpXSA6IGdldHRlcigpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzdWx0UDtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoaXNVcGdyYWRlRGlzY29ubmVjdGlvbihlcnIpKSB7XG4gICAgICAgIGlmICghZGlzY29ubmVjdGlvbikge1xuICAgICAgICAgIGRpc2Nvbm5lY3Rpb24gPSBlcnI7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBpbmNhcm5hdGlvbk51bWJlcjogdmVyc2lvbiB9ID0gZXJyO1xuICAgICAgICBpZiAodmVyc2lvbiA+IGxhc3RWZXJzaW9uKSB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgbGFzdFZlcnNpb24gPSB2ZXJzaW9uO1xuICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBpZiAoaXNPYmplY3QoZXJyKSAmJiBkaXNjb25uZWN0aW9uICYmIGRpc2Nvbm5lY3Rpb24gIT09IGVycikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGFubm90YXRlRXJyb3IoXG4gICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICBYYEF0dGVtcHRpbmcgdG8gcmVjb3ZlciBmcm9tIGRpc2Nvbm5lY3Rpb246ICR7ZGlzY29ubmVjdGlvbn1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKF9lcnIpIHtcbiAgICAgICAgICAvL1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICB9XG59O1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBzdWJzY3JpYmUgPSBpdFAgPT5cbiAgRmFyKCdBc3luY0l0ZXJhYmxlJywge1xuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIGNvbnN0IGl0ID0gRShpdFApW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xuICAgICAgY29uc3Qgc2VsZiA9IEZhcignQXN5bmNJdGVyYWJsZUl0ZXJhdG9yJywge1xuICAgICAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiBzZWxmLFxuICAgICAgICBuZXh0OiBhc3luYyAoKSA9PiBFKGl0KS5uZXh0KCksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG4gIH0pO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLnN1YnNjcmliZShzdWJzY3JpYmUpO1xuY29uc3QgbWFrZUVhY2hJdGVyYXRvciA9ICh0b3BpYywgbmV4dENlbGxQKSA9PiB7XG4gIC8vXG4gIC8vXG4gIGNvbnN0IHNlbGYgPSBGYXIoJ0VhY2hJdGVyYXRvcicsIHtcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiBzZWxmLFxuICAgIG5leHQ6ICgpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgaGVhZDogcmVzdWx0UCxcbiAgICAgICAgcHVibGlzaENvdW50OiBwdWJsaXNoQ291bnRQLFxuICAgICAgICB0YWlsOiB0YWlsUCxcbiAgICAgIH0gPSBFLmdldChuZXh0Q2VsbFApO1xuXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGNvbnN0IGdldFN1Y2Nlc3NvciA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgY29uc3QgcHVibGlzaENvdW50ID0gYXdhaXQgcHVibGlzaENvdW50UDtcbiAgICAgICAgYXNzZXJ0LnR5cGVvZihwdWJsaXNoQ291bnQsICdiaWdpbnQnKTtcbiAgICAgICAgY29uc3Qgc3VjY2Vzc29yID0gYXdhaXQgRSh0b3BpYykuc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50KTtcbiAgICAgICAgY29uc3QgbmV3UHVibGlzaENvdW50ID0gc3VjY2Vzc29yLnB1Ymxpc2hDb3VudDtcbiAgICAgICAgaWYgKG5ld1B1Ymxpc2hDb3VudCAhPT0gcHVibGlzaENvdW50ICsgMW4pIHtcbiAgICAgICAgICBGYWlsYGVhY2hJdGVyYXRvciBicm9rZW4gYnkgZ2FwIGZyb20gcHVibGlzaENvdW50ICR7cHVibGlzaENvdW50fSB0byAke25ld1B1Ymxpc2hDb3VudH1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdWNjZXNzb3I7XG4gICAgICB9O1xuXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIG5leHRDZWxsUCA9IHJlY29ubmVjdEFzTmVlZGVkKGdldFN1Y2Nlc3NvciwgW3RhaWxQXSk7XG5cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICB2b2lkIEUud2hlbihwdWJsaXNoQ291bnRQLCBzaW5rLCBzaW5rKTtcbiAgICAgIHZvaWQgRS53aGVuKG5leHRDZWxsUCwgc2luaywgc2luayk7XG4gICAgICByZXR1cm4gcmVzdWx0UDtcbiAgICB9LFxuICAgIGZvcms6ICgpID0+IG1ha2VFYWNoSXRlcmF0b3IodG9waWMsIG5leHRDZWxsUCksXG4gIH0pO1xuICByZXR1cm4gc2VsZjtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3Qgc3Vic2NyaWJlRWFjaCA9IHRvcGljID0+IHtcbiAgY29uc3QgaXRlcmFibGUgPSBGYXIoJ0VhY2hJdGVyYWJsZScsIHtcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICBjb25zdCBmaXJzdENlbGxQID0gcmVjb25uZWN0QXNOZWVkZWQoKCkgPT4gRSh0b3BpYykuc3Vic2NyaWJlQWZ0ZXIoKSk7XG4gICAgICByZXR1cm4gbWFrZUVhY2hJdGVyYXRvcih0b3BpYywgZmlyc3RDZWxsUCk7XG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiBpdGVyYWJsZTtcbn07JGjNj19vbmNlLnN1YnNjcmliZUVhY2goc3Vic2NyaWJlRWFjaCk7XG5oYXJkZW4oc3Vic2NyaWJlRWFjaCk7XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBjbG9uZUxhdGVzdEl0ZXJhdG9yID0gKHRvcGljLCBsb2NhbFVwZGF0ZUNvdW50LCB0ZXJtaW5hbFJlc3VsdCkgPT4ge1xuICBsZXQgbXV0ZXggPSBQcm9taXNlLnJlc29sdmUoKTtcblxuICAvKlxuXG5cblxuXG4gICAqL1xuICBjb25zdCBtYXliZVJlcXVlc3ROZXh0UmVzdWx0ID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmICh0ZXJtaW5hbFJlc3VsdCkge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICByZXR1cm4gdGVybWluYWxSZXN1bHQ7XG4gICAgfVxuXG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IHsgdmFsdWUsIHVwZGF0ZUNvdW50IH0gPSBhd2FpdCByZWNvbm5lY3RBc05lZWRlZCgoKSA9PlxuICAgICAgRSh0b3BpYykuZ2V0VXBkYXRlU2luY2UobG9jYWxVcGRhdGVDb3VudCksXG4gICAgKTtcbiAgICAvL1xuICAgIGxvY2FsVXBkYXRlQ291bnQgPSB1cGRhdGVDb3VudDtcblxuICAgIC8vXG4gICAgaWYgKHVwZGF0ZUNvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRlcm1pbmFsUmVzdWx0ID0gaGFyZGVuKHsgZG9uZTogdHJ1ZSwgdmFsdWUgfSk7XG4gICAgICByZXR1cm4gdGVybWluYWxSZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiBoYXJkZW4oeyBkb25lOiBmYWxzZSwgdmFsdWUgfSk7XG4gIH07XG5cbiAgY29uc3Qgc2VsZiA9IEZhcignTGF0ZXN0SXRlcmF0b3InLCB7XG4gICAgZm9yazogKCkgPT4gY2xvbmVMYXRlc3RJdGVyYXRvcih0b3BpYywgbG9jYWxVcGRhdGVDb3VudCwgdGVybWluYWxSZXN1bHQpLFxuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06ICgpID0+IHNlbGYsXG4gICAgbmV4dDogYXN5bmMgKCkgPT4ge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuXG4gICAgICBpZiAodGVybWluYWxSZXN1bHQpIHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIHRlcm1pbmFsUmVzdWx0O1xuICAgICAgfVxuXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3QgbmV4dFJlc3VsdCA9IG11dGV4LnRoZW4obWF5YmVSZXF1ZXN0TmV4dFJlc3VsdCk7XG4gICAgICBtdXRleCA9IG5leHRSZXN1bHQudGhlbihzaW5rLCBzaW5rKTtcbiAgICAgIC8vXG5cbiAgICAgIHJldHVybiBuZXh0UmVzdWx0O1xuICAgIH0sXG4gIH0pO1xuICByZXR1cm4gc2VsZjtcbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VMYXRlc3RJdGVyYXRvciA9IHRvcGljID0+IGNsb25lTGF0ZXN0SXRlcmF0b3IodG9waWMpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHN1YnNjcmliZUxhdGVzdCA9IHRvcGljID0+IHtcbiAgY29uc3QgaXRlcmFibGUgPSBGYXIoJ0xhdGVzdEl0ZXJhYmxlJywge1xuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06ICgpID0+IG1ha2VMYXRlc3RJdGVyYXRvcih0b3BpYyksXG4gIH0pO1xuICByZXR1cm4gaXRlcmFibGU7XG59OyRozY9fb25jZS5zdWJzY3JpYmVMYXRlc3Qoc3Vic2NyaWJlTGF0ZXN0KTtcbmhhcmRlbihzdWJzY3JpYmVMYXRlc3QpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic3Vic2NyaWJlIjpbInN1YnNjcmliZSJdLCJzdWJzY3JpYmVFYWNoIjpbInN1YnNjcmliZUVhY2giXSwic3Vic2NyaWJlTGF0ZXN0IjpbInN1YnNjcmliZUxhdGVzdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAjmX64OQgAADkIAAAvAAAAQGFnb3JpYy9ub3RpZmllci12MC43LjAtdTIxLjAvc3JjL3N1YnNjcmliZXIuanN7ImltcG9ydHMiOlsiQGVuZG8vZmFyIiwiLi9zdWJzY3JpYmUuanMiLCIuL3B1Ymxpc2gta2l0LmpzIiwiLi90b3BpYy5qcyJdLCJleHBvcnRzIjpbIm1ha2VTdWJzY3JpcHRpb24iLCJtYWtlU3Vic2NyaXB0aW9uS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRSxGYXIsc3Vic2NyaWJlRWFjaCxtYWtlUHVibGlzaEtpdCxtYWtlUGlubmVkSGlzdG9yeVRvcGljOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXSxbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCIuL3N1YnNjcmliZS5qc1wiLCBbW1wic3Vic2NyaWJlRWFjaFwiLFskaM2PX2EgPT4gKHN1YnNjcmliZUVhY2ggPSAkaM2PX2EpXV1dXSxbXCIuL3B1Ymxpc2gta2l0LmpzXCIsIFtbXCJtYWtlUHVibGlzaEtpdFwiLFskaM2PX2EgPT4gKG1ha2VQdWJsaXNoS2l0ID0gJGjNj19hKV1dXV0sW1wiLi90b3BpYy5qc1wiLCBbW1wibWFrZVBpbm5lZEhpc3RvcnlUb3BpY1wiLFskaM2PX2EgPT4gKG1ha2VQaW5uZWRIaXN0b3J5VG9waWMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuLypcblxuICovXG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VTdWJzY3JpcHRpb24gPSB0b3BpYyA9PiB7XG4gIGNvbnN0IHN1YnNjcmlwdGlvbiA9IEZhcignU3Vic2NyaXB0aW9uJywge1xuICAgIC4uLnN1YnNjcmliZUVhY2godG9waWMpLFxuICAgIHN1YnNjcmliZUFmdGVyOiBhc3luYyBwdWJsaXNoQ291bnQgPT4gRSh0b3BpYykuc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50KSxcblxuICAgIC8qXG5cblxuXG5cbiAgICAgKi9cbiAgICBnZXRTaGFyYWJsZVN1YnNjcmlwdGlvbkludGVybmFsczogYXN5bmMgKCkgPT4gdG9waWMsXG5cbiAgICBnZXRTdG9yZUtleTogKCkgPT4gaGFyZGVuKHsgc3Vic2NyaXB0aW9uIH0pLFxuICB9KTtcbiAgcmV0dXJuIHN1YnNjcmlwdGlvbjtcbn07JGjNj19vbmNlLm1ha2VTdWJzY3JpcHRpb24obWFrZVN1YnNjcmlwdGlvbik7XG5oYXJkZW4obWFrZVN1YnNjcmlwdGlvbik7XG5cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlU3Vic2NyaXB0aW9uS2l0ID0gKCkgPT4ge1xuICBjb25zdCB7IHB1Ymxpc2hlciwgc3Vic2NyaWJlciB9ID0gbWFrZVB1Ymxpc2hLaXQoKTtcblxuICAvL1xuICAvL1xuXG4gIGNvbnN0IHBpbm5lZEhpc3RvcnlUb3BpYyA9IG1ha2VQaW5uZWRIaXN0b3J5VG9waWMoc3Vic2NyaWJlcik7XG4gIGNvbnN0IHN1YnNjcmlwdGlvbiA9IG1ha2VTdWJzY3JpcHRpb24ocGlubmVkSGlzdG9yeVRvcGljKTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBwdWJsaWNhdGlvbiA9IEZhcigncHVibGljYXRpb24nLCB7XG4gICAgdXBkYXRlU3RhdGU6IG5vbkZpbmFsVmFsdWUgPT4gcHVibGlzaGVyLnB1Ymxpc2gobm9uRmluYWxWYWx1ZSksXG4gICAgZmluaXNoOiBjb21wbGV0aW9uID0+IHB1Ymxpc2hlci5maW5pc2goY29tcGxldGlvbiksXG4gICAgZmFpbDogcmVhc29uID0+IHB1Ymxpc2hlci5mYWlsKHJlYXNvbiksXG4gIH0pO1xuXG4gIHJldHVybiBoYXJkZW4oeyBwdWJsaWNhdGlvbiwgc3Vic2NyaXB0aW9uIH0pO1xufTskaM2PX29uY2UubWFrZVN1YnNjcmlwdGlvbktpdChtYWtlU3Vic2NyaXB0aW9uS2l0KTtcbmhhcmRlbihtYWtlU3Vic2NyaXB0aW9uS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VTdWJzY3JpcHRpb24iOlsibWFrZVN1YnNjcmlwdGlvbiJdLCJtYWtlU3Vic2NyaXB0aW9uS2l0IjpbIm1ha2VTdWJzY3JpcHRpb25LaXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAWzsF4kwEAABMBAAAKgAAAEBhZ29yaWMvbm90aWZpZXItdjAuNy4wLXUyMS4wL3NyYy90b3BpYy5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiXSwiZXhwb3J0cyI6WyJtYWtlUGlubmVkSGlzdG9yeVRvcGljIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFyOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuLypcblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VQaW5uZWRIaXN0b3J5VG9waWMgPSB0b3BpYyA9PiB7XG4gIC8vXG5cbiAgLy9cbiAgY29uc3QgcGlubmVkUHViTGlzdCA9IHRvcGljLnN1YnNjcmliZUFmdGVyKCk7XG5cbiAgcmV0dXJuIEZhcignUGlubmVkSGlzdG9yeVRvcGljJywge1xuICAgIHN1YnNjcmliZUFmdGVyOiBhc3luYyAocHVibGlzaENvdW50ID0gLTFuKSA9PiB7XG4gICAgICBpZiAocHVibGlzaENvdW50ID09PSAtMW4pIHtcbiAgICAgICAgcmV0dXJuIHBpbm5lZFB1Ykxpc3Q7XG4gICAgICB9XG4gICAgICByZXR1cm4gdG9waWMuc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50KTtcbiAgICB9LFxuICAgIGdldFVwZGF0ZVNpbmNlOiBhc3luYyAodXBkYXRlQ291bnQgPSB1bmRlZmluZWQpID0+IHtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gdG9waWMuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpO1xuICAgIH0sXG4gIH0pO1xufTskaM2PX29uY2UubWFrZVBpbm5lZEhpc3RvcnlUb3BpYyhtYWtlUGlubmVkSGlzdG9yeVRvcGljKTtcbmhhcmRlbihtYWtlUGlubmVkSGlzdG9yeVRvcGljKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VQaW5uZWRIaXN0b3J5VG9waWMiOlsibWFrZVBpbm5lZEhpc3RvcnlUb3BpYyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAAwAAAAQGFnb3JpYy9ub3RpZmllci12MC43LjAtdTIxLjAvc3JjL3R5cGVzLWluZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKOSJg0UBwAAFAcAADMAAABAYWdvcmljL25vdGlmaWVyLXYwLjcuMC11MjEuMC90b29scy90ZXN0U3VwcG9ydHMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3Rlc3RpbmctdXRpbHMuanMiXSwiZXhwb3J0cyI6WyJtYWtlRmFrZU1hcnNoYWxsZXIiLCJtYWtlRmFrZVN0b3JhZ2UiLG51bGxdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhcixtYWtlTWFyc2hhbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXSxbXCJtYWtlTWFyc2hhbFwiLFskaM2PX2EgPT4gKG1ha2VNYXJzaGFsID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbC9zcmMvdGVzdGluZy11dGlscy5qc1wiLCBbXV1dKTtcblxuXG5cblxuXG5cblxuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VGYWtlU3RvcmFnZSA9IChwYXRoLCBwdWJsaWNhdGlvbikgPT4ge1xuICBsZXQgc2V0VmFsdWVDYWxscyA9IDA7XG4gIGNvbnN0IGZ1bGxQYXRoID0gYHB1Ymxpc2guJHtwYXRofWA7XG4gIGNvbnN0IHN0b3JlS2V5ID0gaGFyZGVuKHtcbiAgICBzdG9yZU5hbWU6ICdzd2luZ3NldCcsXG4gICAgc3RvcmVTdWJrZXk6IGBzd2luZ3NldC9kYXRhOiR7ZnVsbFBhdGh9YCxcbiAgICBkYXRhUHJlZml4Qnl0ZXM6ICcnLFxuICB9KTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBzdG9yYWdlID0gRmFyKCdTdG9yYWdlTm9kZScsIHtcbiAgICBnZXRQYXRoOiAoKSA9PiBwYXRoLFxuICAgIGdldFN0b3JlS2V5OiBhc3luYyAoKSA9PiBzdG9yZUtleSxcbiAgICBzZXRWYWx1ZTogYXN5bmMgdmFsdWUgPT4ge1xuICAgICAgc2V0VmFsdWVDYWxscyArPSAxO1xuICAgICAgYXNzZXJ0LnR5cGVvZih2YWx1ZSwgJ3N0cmluZycpO1xuICAgICAgaWYgKHB1YmxpY2F0aW9uKSB7XG4gICAgICAgIHB1YmxpY2F0aW9uLnVwZGF0ZVN0YXRlKHZhbHVlKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIG1ha2VDaGlsZE5vZGU6ICgpID0+IHN0b3JhZ2UsXG4gICAgY291bnRTZXRWYWx1ZUNhbGxzOiAoKSA9PiBzZXRWYWx1ZUNhbGxzLFxuICB9KTtcbiAgcmV0dXJuIHN0b3JhZ2U7XG59OyRozY9fb25jZS5tYWtlRmFrZVN0b3JhZ2UobWFrZUZha2VTdG9yYWdlKTtcbmhhcmRlbihtYWtlRmFrZVN0b3JhZ2UpO1xuXG4gICAgICAgY29uc3QgbWFrZUZha2VNYXJzaGFsbGVyID0gKCkgPT5cbiAgbWFrZU1hcnNoYWwodW5kZWZpbmVkLCB1bmRlZmluZWQsIHtcbiAgICBtYXJzaGFsU2F2ZUVycm9yOiAoKSA9PiB7fSxcbiAgfSk7JGjNj19vbmNlLm1ha2VGYWtlTWFyc2hhbGxlcihtYWtlRmFrZU1hcnNoYWxsZXIpO1xuaGFyZGVuKG1ha2VGYWtlTWFyc2hhbGxlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyJAYWdvcmljL2ludGVybmFsL3NyYy90ZXN0aW5nLXV0aWxzLmpzIjpbWyJldmVudExvb3BJdGVyYXRpb24iLCJldmVudExvb3BJdGVyYXRpb24iXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUZha2VTdG9yYWdlIjpbIm1ha2VGYWtlU3RvcmFnZSJdLCJtYWtlRmFrZU1hcnNoYWxsZXIiOlsibWFrZUZha2VNYXJzaGFsbGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABZZvz/bIQAA2yEAADkAAABAYWdvcmljL3NtYXJ0LXdhbGxldC12MC41LjQtdTIxLjAvc3JjL21hcnNoYWwtY29udGV4dHMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBhZ29yaWMvc3RvcmUiLCJAZW5kby9tYXJzaGFsIiwiQGFnb3JpYy92YXRzL3NyYy9saWItYm9hcmQuanMiXSwiZXhwb3J0cyI6WyJtYWtlRXhwb3J0Q29udGV4dCIsIm1ha2VJbXBvcnRDb250ZXh0IiwibWFrZUxvZ2dpbmdQcmVzZW5jZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwscSxIYW5kbGVkUHJvbWlzZSxtYWtlU2NhbGFyTWFwU3RvcmUsRmFyLG1ha2VNYXJzaGFsLFJlbW90YWJsZSxERUZBVUxUX1BSRUZJWDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJIYW5kbGVkUHJvbWlzZVwiLFskaM2PX2EgPT4gKEhhbmRsZWRQcm9taXNlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibWFrZVNjYWxhck1hcFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZVNjYWxhck1hcFN0b3JlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dLFtcIm1ha2VNYXJzaGFsXCIsWyRozY9fYSA9PiAobWFrZU1hcnNoYWwgPSAkaM2PX2EpXV0sW1wiUmVtb3RhYmxlXCIsWyRozY9fYSA9PiAoUmVtb3RhYmxlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy92YXRzL3NyYy9saWItYm9hcmQuanNcIiwgW1tcIkRFRkFVTFRfUFJFRklYXCIsWyRozY9fYSA9PiAoREVGQVVMVF9QUkVGSVggPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuICovXG5jb25zdCBpc0RlZmF1bHRCb2FyZElkID0gc3BlY2ltZW4gPT4ge1xuICByZXR1cm4gdHlwZW9mIHNwZWNpbWVuID09PSAnc3RyaW5nJyAmJiBzcGVjaW1lbi5zdGFydHNXaXRoKERFRkFVTFRfUFJFRklYKTtcbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuLypcblxuXG4gKi9cblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VXYWxsZXRTbG90ID0gKF90YWJsZXMsIGtpbmQsIGlkKSA9PiB7XG4gIGNvbnN0IGRpZ2l0cyA9IC8qICAgICAgICAgICAgICAgICAqLyAoYCR7aWR9YCk7XG4gIHJldHVybiBgJHtraW5kfToke2RpZ2l0c31gO1xufTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBmaW5kS2V5ID0gKHJlY29yZCwgcHJlZGljYXRlKSA9PiB7XG4gIGNvbnN0IGtleSA9IE9iamVjdC5rZXlzKHJlY29yZCkuZmluZChwcmVkaWNhdGUpO1xuICByZXR1cm4ga2V5O1xufTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBwYXJzZVdhbGxldFNsb3QgPSAodGFibGVzLCBzbG90KSA9PiB7XG4gIGNvbnN0IGtpbmQgPSBmaW5kS2V5KHRhYmxlcywgayA9PiBzbG90LnN0YXJ0c1dpdGgoYCR7a306YCkpO1xuICBjb25zdCBpZCA9IGtpbmQgPyBOdW1iZXIoc2xvdC5zbGljZShraW5kLmxlbmd0aCArIDEpKSA6IE5hTjtcbiAgcmV0dXJuIHsga2luZCwgaWQgfTtcbn07XG5cbi8qXG5cblxuXG5cblxuICovXG4vKlxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBpbml0U2xvdFZhbCA9ICh0YWJsZSwgc2xvdCwgdmFsKSA9PiB7XG4gIHRhYmxlLmJ5U2xvdC5pbml0KHNsb3QsIHZhbCk7XG4gIHRhYmxlLmJ5VmFsLmluaXQodmFsLCBzbG90KTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZUV4cG9ydENvbnRleHQgPSAoKSA9PiB7XG4gIGNvbnN0IHdhbGxldE9iamVjdHMgPSB7XG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIHB1cnNlOiB7XG4gICAgICBieVNsb3Q6IG1ha2VTY2FsYXJNYXBTdG9yZSgpLFxuICAgICAgYnlWYWw6IG1ha2VTY2FsYXJNYXBTdG9yZSgpLFxuICAgIH0sXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgcGF5bWVudDoge1xuICAgICAgYnlTbG90OiBtYWtlU2NhbGFyTWFwU3RvcmUoKSxcbiAgICAgIGJ5VmFsOiBtYWtlU2NhbGFyTWFwU3RvcmUoKSxcbiAgICB9LFxuICAgIC8vXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIHVua25vd246IHtcbiAgICAgIGJ5U2xvdDogbWFrZVNjYWxhck1hcFN0b3JlKCksXG4gICAgICBieVZhbDogbWFrZVNjYWxhck1hcFN0b3JlKCksXG4gICAgfSxcbiAgfTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgYm9hcmRPYmplY3RzID0ge1xuICAgIGJ5U2xvdDogbWFrZVNjYWxhck1hcFN0b3JlKCksXG4gICAgYnlWYWw6IG1ha2VTY2FsYXJNYXBTdG9yZSgpLFxuICB9O1xuXG4gIC8qXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IHNsb3RUb1ZhbCA9IChzbG90LCBfaWZhY2UpID0+IHtcbiAgICBpZiAoaXNEZWZhdWx0Qm9hcmRJZChzbG90KSAmJiBib2FyZE9iamVjdHMuYnlTbG90LmhhcyhzbG90KSkge1xuICAgICAgcmV0dXJuIGJvYXJkT2JqZWN0cy5ieVNsb3QuZ2V0KHNsb3QpO1xuICAgIH1cbiAgICBjb25zdCB7IGtpbmQsIGlkIH0gPSBwYXJzZVdhbGxldFNsb3Qod2FsbGV0T2JqZWN0cywgc2xvdCk7XG4gICAga2luZCB8fCBGYWlsYGJhZCBzbG90IGtpbmQ6ICR7c2xvdH1gO1xuICAgIGNvbnN0IHZhbCA9IHdhbGxldE9iamVjdHNba2luZF0uYnlTbG90LmdldChpZCk7IC8vXG4gICAgcmV0dXJuIHZhbDtcbiAgfTtcblxuICBsZXQgdW5rbm93bk5vbmNlID0gMDtcblxuICAvKlxuXG5cbiAgICovXG4gIGNvbnN0IHZhbFRvU2xvdCA9IHZhbCA9PiB7XG4gICAgaWYgKGJvYXJkT2JqZWN0cy5ieVZhbC5oYXModmFsKSkge1xuICAgICAgcmV0dXJuIGJvYXJkT2JqZWN0cy5ieVZhbC5nZXQodmFsKTtcbiAgICB9XG4gICAgY29uc3Qga2luZCA9IGZpbmRLZXkod2FsbGV0T2JqZWN0cywgayA9PiB3YWxsZXRPYmplY3RzW2tdLmJ5VmFsLmhhcyh2YWwpKTtcbiAgICBpZiAoa2luZCkge1xuICAgICAgLy9cbiAgICAgIGNvbnN0IGlkID0gd2FsbGV0T2JqZWN0c1traW5kXS5ieVZhbC5nZXQodmFsKTtcbiAgICAgIHJldHVybiBtYWtlV2FsbGV0U2xvdCh3YWxsZXRPYmplY3RzLCBraW5kLCBpZCk7XG4gICAgfVxuICAgIHVua25vd25Ob25jZSArPSAxO1xuICAgIGNvbnN0IHNsb3QgPSBtYWtlV2FsbGV0U2xvdCh3YWxsZXRPYmplY3RzLCAndW5rbm93bicsIHVua25vd25Ob25jZSk7XG4gICAgaW5pdFNsb3RWYWwod2FsbGV0T2JqZWN0cy51bmtub3duLCB1bmtub3duTm9uY2UsIHZhbCk7XG4gICAgcmV0dXJuIHNsb3Q7XG4gIH07XG5cbiAgLypcblxuXG5cbiAgICovXG4gIGNvbnN0IG1ha2VTYXZlciA9IChraW5kLCB0YWJsZSkgPT4ge1xuICAgIGxldCBub25jZSA9IDA7XG4gICAgLyogICAgICAgICAgICAgICAgICovXG4gICAgY29uc3Qgc2F2ZXIgPSB2YWwgPT4ge1xuICAgICAgbm9uY2UgKz0gMTtcbiAgICAgIGluaXRTbG90VmFsKHRhYmxlLCBub25jZSwgdmFsKTtcbiAgICB9O1xuICAgIHJldHVybiBzYXZlcjtcbiAgfTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBzYXZlUHVyc2VBY3Rpb25zOiBtYWtlU2F2ZXIoJ3B1cnNlJywgd2FsbGV0T2JqZWN0cy5wdXJzZSksXG4gICAgc2F2ZVBheW1lbnRBY3Rpb25zOiBtYWtlU2F2ZXIoJ3BheW1lbnQnLCB3YWxsZXRPYmplY3RzLnBheW1lbnQpLFxuICAgIC8qXG5cblxuICAgICAqL1xuICAgIGluaXRQdXJzZUlkOiAoaWQsIHB1cnNlKSA9PiB7XG4gICAgICBpbml0U2xvdFZhbCh3YWxsZXRPYmplY3RzLnB1cnNlLCBpZCwgcHVyc2UpO1xuICAgIH0sXG4gICAgcHVyc2VFbnRyaWVzOiB3YWxsZXRPYmplY3RzLnB1cnNlLmJ5U2xvdC5lbnRyaWVzLFxuICAgIC8qXG5cblxuICAgICAqL1xuICAgIGluaXRCb2FyZElkOiAoaWQsIHZhbCkgPT4ge1xuICAgICAgaW5pdFNsb3RWYWwoYm9hcmRPYmplY3RzLCBpZCwgdmFsKTtcbiAgICB9LFxuICAgIC8qXG5cblxuICAgICAqL1xuICAgIGVuc3VyZUJvYXJkSWQ6IChpZCwgdmFsKSA9PiB7XG4gICAgICBpZiAoYm9hcmRPYmplY3RzLmJ5VmFsLmhhcyh2YWwpKSB7XG4gICAgICAgIGFzc2VydC5lcXVhbChib2FyZE9iamVjdHMuYnlWYWwuZ2V0KHZhbCksIGlkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaW5pdFNsb3RWYWwoYm9hcmRPYmplY3RzLCBpZCwgdmFsKTtcbiAgICB9LFxuICAgIC4uLm1ha2VNYXJzaGFsKHZhbFRvU2xvdCwgc2xvdFRvVmFsLCB7IHNlcmlhbGl6ZUJvZHlGb3JtYXQ6ICdzbWFsbGNhcHMnIH0pLFxuICB9KTtcbn07XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5tYWtlRXhwb3J0Q29udGV4dChtYWtlRXhwb3J0Q29udGV4dCk7XG5cbmNvbnN0IGRlZmF1bHRNYWtlUHJlc2VuY2UgPSBpZmFjZSA9PiB7XG4gIGNvbnN0IHNldmVyZWQgPSBgU0VWRVJFRDogJHtpZmFjZS5yZXBsYWNlKC9eQWxsZWdlZDogLywgJycpfWA7XG4gIHJldHVybiBGYXIoc2V2ZXJlZCwge30pO1xufTtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZUltcG9ydENvbnRleHQgPSAobWFrZVByZXNlbmNlID0gZGVmYXVsdE1ha2VQcmVzZW5jZSkgPT4ge1xuICBjb25zdCB3YWxsZXRPYmplY3RzID0ge1xuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBwdXJzZToge1xuICAgICAgYnlTbG90OiBtYWtlU2NhbGFyTWFwU3RvcmUoKSxcbiAgICAgIGJ5VmFsOiBtYWtlU2NhbGFyTWFwU3RvcmUoKSxcbiAgICB9LFxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBwYXltZW50OiB7XG4gICAgICBieVNsb3Q6IG1ha2VTY2FsYXJNYXBTdG9yZSgpLFxuICAgICAgYnlWYWw6IG1ha2VTY2FsYXJNYXBTdG9yZSgpLFxuICAgIH0sXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIHVua25vd246IHtcbiAgICAgIGJ5U2xvdDogbWFrZVNjYWxhck1hcFN0b3JlKCksXG4gICAgICBieVZhbDogbWFrZVNjYWxhck1hcFN0b3JlKCksXG4gICAgfSxcbiAgfTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgYm9hcmRPYmplY3RzID0ge1xuICAgIGJ5U2xvdDogbWFrZVNjYWxhck1hcFN0b3JlKCksXG4gICAgYnlWYWw6IG1ha2VTY2FsYXJNYXBTdG9yZSgpLFxuICB9O1xuXG4gIC8qXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgcHJvdmlkZVZhbCA9ICh0YWJsZSwgc2xvdCwgaWZhY2UpID0+IHtcbiAgICBpZiAodGFibGUuYnlTbG90LmhhcyhzbG90KSkge1xuICAgICAgcmV0dXJuIHRhYmxlLmJ5U2xvdC5nZXQoc2xvdCk7XG4gICAgfVxuICAgIGNvbnN0IHZhbCA9IG1ha2VQcmVzZW5jZShpZmFjZSk7XG4gICAgaW5pdFNsb3RWYWwodGFibGUsIHNsb3QsIHZhbCk7XG4gICAgcmV0dXJuIHZhbDtcbiAgfTtcblxuICBjb25zdCBzbG90VG9WYWwgPSB7XG4gICAgLypcblxuXG4gICAgICovXG4gICAgZnJvbUJvYXJkOiAoc2xvdCwgaWZhY2UpID0+IHtcbiAgICAgIGlzRGVmYXVsdEJvYXJkSWQoc2xvdCkgfHwgRmFpbGBiYWQgYm9hcmQgc2xvdCAke3Eoc2xvdCl9YDtcbiAgICAgIHJldHVybiBwcm92aWRlVmFsKGJvYXJkT2JqZWN0cywgc2xvdCwgaWZhY2UpO1xuICAgIH0sXG5cbiAgICAvKlxuXG5cbiAgICAgKi9cbiAgICBmcm9tTXlXYWxsZXQ6IChzbG90LCBpZmFjZSkgPT4ge1xuICAgICAgaWYgKCFzbG90KSB7XG4gICAgICAgIC8vXG4gICAgICAgIHJldHVybiBtYWtlUHJlc2VuY2UoYCR7c2xvdH1gKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHsga2luZCwgaWQgfSA9IHBhcnNlV2FsbGV0U2xvdCh3YWxsZXRPYmplY3RzLCBzbG90KTtcbiAgICAgIHJldHVybiBraW5kXG4gICAgICAgID8gcHJvdmlkZVZhbCh3YWxsZXRPYmplY3RzW2tpbmRdLCBpZCwgaWZhY2UpXG4gICAgICAgIDogc2xvdFRvVmFsLmZyb21Cb2FyZChzbG90LCBpZmFjZSk7XG4gICAgfSxcbiAgfTtcblxuICBjb25zdCB2YWxUb1Nsb3QgPSB7XG4gICAgZnJvbUJvYXJkOiB2YWwgPT4gYm9hcmRPYmplY3RzLmJ5VmFsLmdldCh2YWwpLFxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBmcm9tTXlXYWxsZXQ6IHZhbCA9PiB7XG4gICAgICBjb25zdCBraW5kID0gZmluZEtleSh3YWxsZXRPYmplY3RzLCBrID0+IHdhbGxldE9iamVjdHNba10uYnlWYWwuaGFzKHZhbCkpO1xuICAgICAgaWYgKGtpbmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBGYWlsYGNhbm5vdCBzZXJpYWxpemUgdW5yZWdpc3RlcmVkICR7dmFsfWA7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlkID0gd2FsbGV0T2JqZWN0c1traW5kXS5ieVZhbC5nZXQodmFsKTtcbiAgICAgIHJldHVybiBtYWtlV2FsbGV0U2xvdCh3YWxsZXRPYmplY3RzLCBraW5kLCBpZCk7XG4gICAgfSxcbiAgfTtcblxuICBjb25zdCBtYXJzaGFsID0ge1xuICAgIGZyb21Cb2FyZDogbWFrZU1hcnNoYWwodmFsVG9TbG90LmZyb21Cb2FyZCwgc2xvdFRvVmFsLmZyb21Cb2FyZCwge1xuICAgICAgbWFyc2hhbE5hbWU6ICdmcm9tQm9hcmQnLFxuICAgICAgc2VyaWFsaXplQm9keUZvcm1hdDogJ3NtYWxsY2FwcycsXG4gICAgfSksXG4gICAgZnJvbU15V2FsbGV0OiBtYWtlTWFyc2hhbCh2YWxUb1Nsb3QuZnJvbU15V2FsbGV0LCBzbG90VG9WYWwuZnJvbU15V2FsbGV0LCB7XG4gICAgICBtYXJzaGFsTmFtZTogJ2Zyb21NeVdhbGxldCcsXG4gICAgICBzZXJpYWxpemVCb2R5Rm9ybWF0OiAnc21hbGxjYXBzJyxcbiAgICB9KSxcbiAgfTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICAvKlxuXG5cbiAgICAgKi9cbiAgICBpbml0Qm9hcmRJZDogKGlkLCB2YWwpID0+IHtcbiAgICAgIGluaXRTbG90VmFsKGJvYXJkT2JqZWN0cywgaWQsIHZhbCk7XG4gICAgfSxcbiAgICAvKlxuXG5cbiAgICAgKi9cbiAgICBlbnN1cmVCb2FyZElkOiAoaWQsIHZhbCkgPT4ge1xuICAgICAgaWYgKGJvYXJkT2JqZWN0cy5ieVZhbC5oYXModmFsKSkge1xuICAgICAgICBhc3NlcnQuZXF1YWwoYm9hcmRPYmplY3RzLmJ5VmFsLmdldCh2YWwpLCBpZCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGluaXRTbG90VmFsKGJvYXJkT2JqZWN0cywgaWQsIHZhbCk7XG4gICAgfSxcbiAgICBmcm9tTXlXYWxsZXQ6IEZhcignd2FsbGV0IG1hcnNoYWxsZXInLCB7IC4uLm1hcnNoYWwuZnJvbU15V2FsbGV0IH0pLFxuICAgIGZyb21Cb2FyZDogRmFyKCdib2FyZCBtYXJzaGFsbGVyJywgeyAuLi5tYXJzaGFsLmZyb21Cb2FyZCB9KSxcbiAgfSk7XG59O1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5tYWtlSW1wb3J0Q29udGV4dChtYWtlSW1wb3J0Q29udGV4dCk7XG5jb25zdCBtYWtlUHJlc2VuY2UgPSAoaWZhY2UsIGhhbmRsZXIpID0+IHtcbiAgbGV0IG9iajtcblxuICB2b2lkIG5ldyBIYW5kbGVkUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0LCByZXNvbHZlV2l0aFByZXNlbmNlKSA9PiB7XG4gICAgb2JqID0gcmVzb2x2ZVdpdGhQcmVzZW5jZShoYW5kbGVyKTtcbiAgfSk7XG4gIGFzc2VydChvYmopO1xuICByZXR1cm4gUmVtb3RhYmxlKGlmYWNlLCB1bmRlZmluZWQsIG9iaik7XG59O1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VMb2dnaW5nUHJlc2VuY2UgPSAoaWZhY2UsIGxvZykgPT4ge1xuICAvKiAgICAgICAgICAgICAgKi8gLy9cbiAgY29uc3QgaXQgPSBtYWtlUHJlc2VuY2UoaWZhY2UsIHtcbiAgICBhcHBseU1ldGhvZDogKHRhcmdldCwgbWV0aG9kLCBhcmdzKSA9PiB7XG4gICAgICBsb2coaGFyZGVuKFsnYXBwbHlNZXRob2QnLCB0YXJnZXQsIG1ldGhvZCwgYXJnc10pKTtcbiAgICB9LFxuICAgIGFwcGx5RnVuY3Rpb246ICh0YXJnZXQsIGFyZ3MpID0+IHtcbiAgICAgIGxvZyhoYXJkZW4oWydhcHBseUZ1bmN0aW9uJywgdGFyZ2V0LCBhcmdzXSkpO1xuICAgIH0sXG4gIH0pO1xuICByZXR1cm4gaXQ7XG59OyRozY9fb25jZS5tYWtlTG9nZ2luZ1ByZXNlbmNlKG1ha2VMb2dnaW5nUHJlc2VuY2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUV4cG9ydENvbnRleHQiOlsibWFrZUV4cG9ydENvbnRleHQiXSwibWFrZUltcG9ydENvbnRleHQiOlsibWFrZUltcG9ydENvbnRleHQiXSwibWFrZUxvZ2dpbmdQcmVzZW5jZSI6WyJtYWtlTG9nZ2luZ1ByZXNlbmNlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGw0phvmDQAA5g0AACcAAABAYWdvcmljL3N0b3JlLXYwLjkuMy11MjEuMC9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiQGVuZG8vcGF0dGVybnMiLCIuL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanMiLCIuL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qcyIsIi4vc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qcyIsIi4vc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzIiwiLi9zdG9yZXMvc3RvcmUtdXRpbHMuanMiLCJAZW5kby9leG8iLCIuL2xlZ2FjeS9sZWdhY3lNYXAuanMiLCIuL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzIiwiLi90eXBlcy5qcyJdLCJleHBvcnRzIjpbImFzc2VydEtleSIsImFzc2VydEtleSIsImRlZmluZUV4b0NsYXNzIiwiZGVmaW5lRXhvQ2xhc3MiLCJtdXN0TWF0Y2giLCJwcm92aWRlTGF6eSIsInByb3ZpZGVMYXp5IixudWxsLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbF0sInJlZXhwb3J0cyI6WyIuL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgdHlwZWxlc3NNdXN0TWF0Y2g7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAodHlwZWxlc3NNdXN0TWF0Y2ggPSAkaM2PX2EpXV1dXSxbXCIuL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanNcIiwgW11dLFtcIi4vc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzXCIsIFtdXSxbXCIuL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanNcIiwgW11dLFtcIi4vc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzXCIsIFtdXSxbXCIuL3N0b3Jlcy9zdG9yZS11dGlscy5qc1wiLCBbXV0sW1wiQGVuZG8vZXhvXCIsIFtdXSxbXCIuL2xlZ2FjeS9sZWdhY3lNYXAuanNcIiwgW11dLFtcIi4vbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanNcIiwgW11dLFtcIi4vdHlwZXMuanNcIiwgW11dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8vXG4vL1xuLyogICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgbXVzdE1hdGNoID0gdHlwZWxlc3NNdXN0TWF0Y2g7JGjNj19vbmNlLm11c3RNYXRjaChtdXN0TWF0Y2gpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzIjpbWyJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIiwibWFrZVNjYWxhcldlYWtTZXRTdG9yZSJdXSwiLi9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanMiOltbIm1ha2VTY2FsYXJTZXRTdG9yZSIsIm1ha2VTY2FsYXJTZXRTdG9yZSJdXSwiLi9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzIjpbWyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhcldlYWtNYXBTdG9yZSJdXSwiLi9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanMiOltbIm1ha2VTY2FsYXJNYXBTdG9yZSIsIm1ha2VTY2FsYXJNYXBTdG9yZSJdXSwiLi9zdG9yZXMvc3RvcmUtdXRpbHMuanMiOltbIm1ha2VBdG9taWNQcm92aWRlciIsIm1ha2VBdG9taWNQcm92aWRlciJdLFsicHJvdmlkZUxhenkiLCJwcm92aWRlTGF6eSJdXSwiQGVuZG8vcGF0dGVybnMiOltbImlzS2V5IiwiaXNLZXkiXSxbImFzc2VydEtleSIsImFzc2VydEtleSJdLFsiYXNzZXJ0U2NhbGFyS2V5IiwiYXNzZXJ0U2NhbGFyS2V5Il0sWyJtYWtlQ29weVNldCIsIm1ha2VDb3B5U2V0Il0sWyJnZXRDb3B5U2V0S2V5cyIsImdldENvcHlTZXRLZXlzIl0sWyJtYWtlQ29weUJhZyIsIm1ha2VDb3B5QmFnIl0sWyJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyIsIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIl0sWyJnZXRDb3B5QmFnRW50cmllcyIsImdldENvcHlCYWdFbnRyaWVzIl0sWyJtYWtlQ29weU1hcCIsIm1ha2VDb3B5TWFwIl0sWyJnZXRDb3B5TWFwRW50cmllcyIsImdldENvcHlNYXBFbnRyaWVzIl0sWyJjb2VyY2VUb0VsZW1lbnRzIiwiY29lcmNlVG9FbGVtZW50cyJdLFsiY29lcmNlVG9CYWdFbnRyaWVzIiwiY29lcmNlVG9CYWdFbnRyaWVzIl0sWyJjb21wYXJlS2V5cyIsImNvbXBhcmVLZXlzIl0sWyJrZXlMVCIsImtleUxUIl0sWyJrZXlMVEUiLCJrZXlMVEUiXSxbImtleUVRIiwia2V5RVEiXSxbImtleUdURSIsImtleUdURSJdLFsia2V5R1QiLCJrZXlHVCJdLFsiZWxlbWVudHNJc1N1cGVyc2V0IiwiZWxlbWVudHNJc1N1cGVyc2V0Il0sWyJlbGVtZW50c0lzRGlzam9pbnQiLCJlbGVtZW50c0lzRGlzam9pbnQiXSxbImVsZW1lbnRzQ29tcGFyZSIsImVsZW1lbnRzQ29tcGFyZSJdLFsiZWxlbWVudHNVbmlvbiIsImVsZW1lbnRzVW5pb24iXSxbImVsZW1lbnRzRGlzam9pbnRVbmlvbiIsImVsZW1lbnRzRGlzam9pbnRVbmlvbiJdLFsiZWxlbWVudHNJbnRlcnNlY3Rpb24iLCJlbGVtZW50c0ludGVyc2VjdGlvbiJdLFsiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0IiwiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0Il0sWyJzZXRJc1N1cGVyc2V0Iiwic2V0SXNTdXBlcnNldCJdLFsic2V0SXNEaXNqb2ludCIsInNldElzRGlzam9pbnQiXSxbInNldENvbXBhcmUiLCJzZXRDb21wYXJlIl0sWyJzZXRVbmlvbiIsInNldFVuaW9uIl0sWyJzZXREaXNqb2ludFVuaW9uIiwic2V0RGlzam9pbnRVbmlvbiJdLFsic2V0SW50ZXJzZWN0aW9uIiwic2V0SW50ZXJzZWN0aW9uIl0sWyJzZXREaXNqb2ludFN1YnRyYWN0Iiwic2V0RGlzam9pbnRTdWJ0cmFjdCJdLFsiYmFnSXNTdXBlcmJhZyIsImJhZ0lzU3VwZXJiYWciXSxbImJhZ0NvbXBhcmUiLCJiYWdDb21wYXJlIl0sWyJiYWdVbmlvbiIsImJhZ1VuaW9uIl0sWyJiYWdJbnRlcnNlY3Rpb24iLCJiYWdJbnRlcnNlY3Rpb24iXSxbImJhZ0Rpc2pvaW50U3VidHJhY3QiLCJiYWdEaXNqb2ludFN1YnRyYWN0Il0sWyJNIiwiTSJdLFsiZ2V0UmFua0NvdmVyIiwiZ2V0UmFua0NvdmVyIl0sWyJpc1BhdHRlcm4iLCJpc1BhdHRlcm4iXSxbImFzc2VydFBhdHRlcm4iLCJhc3NlcnRQYXR0ZXJuIl0sWyJtYXRjaGVzIiwibWF0Y2hlcyJdLFsiaXNDb3B5U2V0IiwiaXNDb3B5U2V0Il0sWyJpc0NvcHlNYXAiLCJpc0NvcHlNYXAiXV0sIkBlbmRvL2V4byI6W1siaW5pdEVtcHR5IiwiaW5pdEVtcHR5Il0sWyJkZWZpbmVFeG9DbGFzcyIsImRlZmluZUV4b0NsYXNzIl0sWyJkZWZpbmVFeG9DbGFzc0tpdCIsImRlZmluZUV4b0NsYXNzS2l0Il0sWyJtYWtlRXhvIiwibWFrZUV4byJdXSwiLi9sZWdhY3kvbGVnYWN5TWFwLmpzIjpbWyJtYWtlTGVnYWN5TWFwIiwibWFrZUxlZ2FjeU1hcCJdXSwiLi9sZWdhY3kvbGVnYWN5V2Vha01hcC5qcyI6W1sibWFrZUxlZ2FjeVdlYWtNYXAiLCJtYWtlTGVnYWN5V2Vha01hcCJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtdXN0TWF0Y2giOlsibXVzdE1hdGNoIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMMzhvT6BQAA+gUAADIAAABAYWdvcmljL3N0b3JlLXYwLjkuMy11MjEuMC9zcmMvbGVnYWN5L2xlZ2FjeU1hcC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJtYWtlTGVnYWN5TWFwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxxOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VMZWdhY3lNYXAgPSAodGFnID0gJ2tleScpID0+IHtcbiAgY29uc3QgbSA9IG5ldyBNYXAoKTtcbiAgY29uc3QgYXNzZXJ0S2V5RG9lc05vdEV4aXN0ID0ga2V5ID0+XG4gICAgIW0uaGFzKGtleSkgfHwgRmFpbGAke3EodGFnKX0gYWxyZWFkeSByZWdpc3RlcmVkOiAke2tleX1gO1xuICBjb25zdCBhc3NlcnRLZXlFeGlzdHMgPSBrZXkgPT5cbiAgICBtLmhhcyhrZXkpIHx8IEZhaWxgJHtxKHRhZyl9IG5vdCBmb3VuZDogJHtrZXl9YDtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgaGFzOiBrZXkgPT4ge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgcmV0dXJuIG0uaGFzKGtleSk7XG4gICAgfSxcbiAgICBpbml0OiAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgYXNzZXJ0S2V5RG9lc05vdEV4aXN0KGtleSk7XG4gICAgICBtLnNldChrZXksIHZhbHVlKTtcbiAgICB9LFxuICAgIGdldDoga2V5ID0+IHtcbiAgICAgIGFzc2VydEtleUV4aXN0cyhrZXkpO1xuICAgICAgcmV0dXJuIG0uZ2V0KGtleSk7XG4gICAgfSxcbiAgICBzZXQ6IChrZXksIHZhbHVlKSA9PiB7XG4gICAgICBhc3NlcnRLZXlFeGlzdHMoa2V5KTtcbiAgICAgIG0uc2V0KGtleSwgdmFsdWUpO1xuICAgIH0sXG4gICAgZGVsZXRlOiBrZXkgPT4ge1xuICAgICAgYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4gICAgICBtLmRlbGV0ZShrZXkpO1xuICAgIH0sXG4gICAga2V5czogKCkgPT4gbS5rZXlzKCksXG4gICAgdmFsdWVzOiAoKSA9PiBtLnZhbHVlcygpLFxuICAgIGVudHJpZXM6ICgpID0+IG0uZW50cmllcygpLFxuICAgIGdldFNpemU6ICgpID0+IG0uc2l6ZSxcbiAgICBjbGVhcjogKCkgPT4gbS5jbGVhcigpLFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VMZWdhY3lNYXAobWFrZUxlZ2FjeU1hcCk7XG5oYXJkZW4obWFrZUxlZ2FjeU1hcCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTGVnYWN5TWFwIjpbIm1ha2VMZWdhY3lNYXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAAxezG6IFAACiBQAANgAAAEBhZ29yaWMvc3RvcmUtdjAuOS4zLXUyMS4wL3NyYy9sZWdhY3kvbGVnYWN5V2Vha01hcC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJtYWtlTGVnYWN5V2Vha01hcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwscTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKlxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZUxlZ2FjeVdlYWtNYXAgPSAodGFnID0gJ2tleScpID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCB3bSA9IG5ldyBXZWFrTWFwKCk7XG4gIGNvbnN0IGFzc2VydEtleURvZXNOb3RFeGlzdCA9IGtleSA9PlxuICAgICF3bS5oYXMoa2V5KSB8fCBGYWlsYCR7cSh0YWcpfSBhbHJlYWR5IHJlZ2lzdGVyZWQ6ICR7a2V5fWA7XG4gIGNvbnN0IGFzc2VydEtleUV4aXN0cyA9IGtleSA9PlxuICAgIHdtLmhhcyhrZXkpIHx8IEZhaWxgJHtxKHRhZyl9IG5vdCBmb3VuZDogJHtrZXl9YDtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgaGFzOiBrZXkgPT4ge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgcmV0dXJuIHdtLmhhcyhrZXkpO1xuICAgIH0sXG4gICAgaW5pdDogKGtleSwgdmFsdWUpID0+IHtcbiAgICAgIGFzc2VydEtleURvZXNOb3RFeGlzdChrZXkpO1xuICAgICAgd20uc2V0KGtleSwgdmFsdWUpO1xuICAgIH0sXG4gICAgZ2V0OiBrZXkgPT4ge1xuICAgICAgYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIC8qICAgICAgICAgICAgKi8gKHdtLmdldChrZXkpKTtcbiAgICB9LFxuICAgIHNldDogKGtleSwgdmFsdWUpID0+IHtcbiAgICAgIGFzc2VydEtleUV4aXN0cyhrZXkpO1xuICAgICAgd20uc2V0KGtleSwgdmFsdWUpO1xuICAgIH0sXG4gICAgZGVsZXRlOiBrZXkgPT4ge1xuICAgICAgYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4gICAgICB3bS5kZWxldGUoa2V5KTtcbiAgICB9LFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VMZWdhY3lXZWFrTWFwKG1ha2VMZWdhY3lXZWFrTWFwKTtcbmhhcmRlbihtYWtlTGVnYWN5V2Vha01hcCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTGVnYWN5V2Vha01hcCI6WyJtYWtlTGVnYWN5V2Vha01hcCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACGpoxiARMAAAETAAA3AAAAQGFnb3JpYy9zdG9yZS12MC45LjMtdTIxLjAvc3JjL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL3BhdHRlcm5zIiwiLi9zY2FsYXJXZWFrTWFwU3RvcmUuanMiLCIuL3N0b3JlLXV0aWxzLmpzIl0sImV4cG9ydHMiOlsibWFrZU1hcFN0b3JlTWV0aG9kcyIsIm1ha2VTY2FsYXJNYXBTdG9yZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHEsRmFyLGFzc2VydFBhc3NhYmxlLGZpbHRlckl0ZXJhYmxlLG1hcEl0ZXJhYmxlLGNvbXBhcmVSYW5rLGFzc2VydFNjYWxhcktleSxtYWtlQ29weU1hcCxtYXRjaGVzLG11c3RNYXRjaCxhc3NlcnRQYXR0ZXJuLG1ha2VXZWFrTWFwU3RvcmVNZXRob2RzLG1ha2VDdXJyZW50S2V5c0tpdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVcIixbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRozY9fYSldXSxbXCJmaWx0ZXJJdGVyYWJsZVwiLFskaM2PX2EgPT4gKGZpbHRlckl0ZXJhYmxlID0gJGjNj19hKV1dLFtcIm1hcEl0ZXJhYmxlXCIsWyRozY9fYSA9PiAobWFwSXRlcmFibGUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJjb21wYXJlUmFua1wiLFskaM2PX2EgPT4gKGNvbXBhcmVSYW5rID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcImFzc2VydFNjYWxhcktleVwiLFskaM2PX2EgPT4gKGFzc2VydFNjYWxhcktleSA9ICRozY9fYSldXSxbXCJtYWtlQ29weU1hcFwiLFskaM2PX2EgPT4gKG1ha2VDb3B5TWFwID0gJGjNj19hKV1dLFtcIm1hdGNoZXNcIixbJGjNj19hID0+IChtYXRjaGVzID0gJGjNj19hKV1dLFtcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXSxbXCJhc3NlcnRQYXR0ZXJuXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRozY9fYSldXV1dLFtcIi4vc2NhbGFyV2Vha01hcFN0b3JlLmpzXCIsIFtbXCJtYWtlV2Vha01hcFN0b3JlTWV0aG9kc1wiLFskaM2PX2EgPT4gKG1ha2VXZWFrTWFwU3RvcmVNZXRob2RzID0gJGjNj19hKV1dXV0sW1wiLi9zdG9yZS11dGlscy5qc1wiLCBbW1wibWFrZUN1cnJlbnRLZXlzS2l0XCIsWyRozY9fYSA9PiAobWFrZUN1cnJlbnRLZXlzS2l0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZU1hcFN0b3JlTWV0aG9kcyA9IChcbiAganNtYXAsXG4gIGFzc2VydEtWT2tUb0FkZCxcbiAgYXNzZXJ0S1ZPa1RvU2V0LFxuICBhc3NlcnRLZXlPa1RvRGVsZXRlID0gdW5kZWZpbmVkLFxuICB0YWcgPSAna2V5JyxcbikgPT4ge1xuICBjb25zdCB7IGFzc2VydFVwZGF0ZU9uQWRkLCBhc3NlcnRVcGRhdGVPbkRlbGV0ZSwgaXRlcmFibGVLZXlzIH0gPVxuICAgIG1ha2VDdXJyZW50S2V5c0tpdChcbiAgICAgICgpID0+IGpzbWFwLmtleXMoKSxcbiAgICAgIGsgPT4ganNtYXAuaGFzKGspLFxuICAgICAgY29tcGFyZVJhbmssXG4gICAgICBhc3NlcnRLVk9rVG9BZGQsXG4gICAgICBhc3NlcnRLZXlPa1RvRGVsZXRlLFxuICAgICAgdGFnLFxuICAgICk7XG5cbiAgLypcblxuXG5cbiAgICovXG4gIGNvbnN0IGtleXMgPSAoa2V5UGF0dCA9IHVuZGVmaW5lZCwgdmFsdWVQYXR0ID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgaWYgKGtleVBhdHQgPT09IHVuZGVmaW5lZCAmJiB2YWx1ZVBhdHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGl0ZXJhYmxlS2V5cztcbiAgICB9XG4gICAgY29uc3QgZmlsdGVyID0gayA9PiB7XG4gICAgICBpZiAoa2V5UGF0dCAhPT0gdW5kZWZpbmVkICYmICFtYXRjaGVzKGssIGtleVBhdHQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vXG4gICAgICBpZiAodmFsdWVQYXR0ICE9PSB1bmRlZmluZWQgJiYgIW1hdGNoZXMoanNtYXAuZ2V0KGspLCB2YWx1ZVBhdHQpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07XG4gICAgcmV0dXJuIGZpbHRlckl0ZXJhYmxlKGl0ZXJhYmxlS2V5cywgZmlsdGVyKTtcbiAgfTtcblxuICAvKlxuXG5cblxuICAgKi9cbiAgY29uc3QgdmFsdWVzID0gKGtleVBhdHQgPSB1bmRlZmluZWQsIHZhbHVlUGF0dCA9IHVuZGVmaW5lZCkgPT5cbiAgICBtYXBJdGVyYWJsZShrZXlzKGtleVBhdHQsIHZhbHVlUGF0dCksIGsgPT4gLyogICAgICAgICAgICAqLyAoanNtYXAuZ2V0KGspKSk7XG5cbiAgLypcblxuXG5cbiAgICovXG4gIGNvbnN0IGVudHJpZXMgPSAoa2V5UGF0dCA9IHVuZGVmaW5lZCwgdmFsdWVQYXR0ID0gdW5kZWZpbmVkKSA9PlxuICAgIG1hcEl0ZXJhYmxlKGtleXMoa2V5UGF0dCwgdmFsdWVQYXR0KSwgayA9PiBbXG4gICAgICBrLFxuICAgICAgLyogICAgICAgICAgICAqLyAoanNtYXAuZ2V0KGspKSxcbiAgICBdKTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICAuLi5tYWtlV2Vha01hcFN0b3JlTWV0aG9kcyhcbiAgICAgIGpzbWFwLFxuICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKGFzc2VydFVwZGF0ZU9uQWRkKSxcbiAgICAgIGFzc2VydEtWT2tUb1NldCxcbiAgICAgIGFzc2VydFVwZGF0ZU9uRGVsZXRlLFxuICAgICAgdGFnLFxuICAgICksXG4gICAga2V5cyxcbiAgICB2YWx1ZXMsXG4gICAgZW50cmllcyxcblxuICAgIHNuYXBzaG90OiAoa2V5UGF0dCA9IHVuZGVmaW5lZCwgdmFsdWVQYXR0ID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbWFrZUNvcHlNYXAoZW50cmllcyhrZXlQYXR0LCB2YWx1ZVBhdHQpKSxcblxuICAgIGdldFNpemU6IChrZXlQYXR0ID0gdW5kZWZpbmVkLCB2YWx1ZVBhdHQgPSB1bmRlZmluZWQpID0+XG4gICAgICBrZXlQYXR0ID09PSB1bmRlZmluZWQgJiYgdmFsdWVQYXR0ID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBqc21hcC5zaXplXG4gICAgICAgIDogWy4uLmtleXMoa2V5UGF0dCwgdmFsdWVQYXR0KV0ubGVuZ3RoLFxuXG4gICAgY2xlYXI6IChrZXlQYXR0ID0gdW5kZWZpbmVkLCB2YWx1ZVBhdHQgPSB1bmRlZmluZWQpID0+IHtcbiAgICAgIGlmIChrZXlQYXR0ID09PSB1bmRlZmluZWQgJiYgdmFsdWVQYXR0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAganNtYXAuY2xlYXIoKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMoa2V5UGF0dCwgdmFsdWVQYXR0KSkge1xuICAgICAgICBqc21hcC5kZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UubWFrZU1hcFN0b3JlTWV0aG9kcyhtYWtlTWFwU3RvcmVNZXRob2RzKTtcbiAgICAgICBjb25zdCBtYWtlU2NhbGFyTWFwU3RvcmUgPSAoXG4gIHRhZyA9ICdrZXknLFxuICB7IGtleVNoYXBlID0gdW5kZWZpbmVkLCB2YWx1ZVNoYXBlID0gdW5kZWZpbmVkIH0gPSB7fSxcbikgPT4ge1xuICBjb25zdCBqc21hcCA9IG5ldyBNYXAoKTtcbiAgaWYgKGtleVNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnRQYXR0ZXJuKGtleVNoYXBlKTtcbiAgfVxuICBpZiAodmFsdWVTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0UGF0dGVybih2YWx1ZVNoYXBlKTtcbiAgfVxuXG4gIGNvbnN0IGFzc2VydEtWT2tUb1NldCA9IChfa2V5LCB2YWx1ZSkgPT4ge1xuICAgIC8vXG4gICAgLy9cbiAgICBoYXJkZW4odmFsdWUpO1xuXG4gICAgYXNzZXJ0UGFzc2FibGUodmFsdWUpO1xuICAgIGlmICh2YWx1ZVNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG11c3RNYXRjaCh2YWx1ZSwgdmFsdWVTaGFwZSwgJ21hcFN0b3JlIHZhbHVlJyk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGFzc2VydEtWT2tUb0FkZCA9IChrZXksIHZhbHVlKSA9PiB7XG4gICAgLy9cbiAgICAvL1xuICAgIGhhcmRlbihrZXkpO1xuXG4gICAgYXNzZXJ0U2NhbGFyS2V5KGtleSk7XG4gICAgaWYgKGtleVNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG11c3RNYXRjaChrZXksIGtleVNoYXBlLCAnbWFwU3RvcmUga2V5Jyk7XG4gICAgfVxuICAgIGFzc2VydEtWT2tUb1NldChrZXksIHZhbHVlKTtcbiAgfTtcblxuICByZXR1cm4gRmFyKGBzY2FsYXIgTWFwU3RvcmUgb2YgJHtxKHRhZyl9YCwge1xuICAgIC4uLm1ha2VNYXBTdG9yZU1ldGhvZHMoXG4gICAgICBqc21hcCxcbiAgICAgIGFzc2VydEtWT2tUb0FkZCxcbiAgICAgIGFzc2VydEtWT2tUb1NldCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRhZyxcbiAgICApLFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VTY2FsYXJNYXBTdG9yZShtYWtlU2NhbGFyTWFwU3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJNYXBTdG9yZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTWFwU3RvcmVNZXRob2RzIjpbIm1ha2VNYXBTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhck1hcFN0b3JlIjpbIm1ha2VTY2FsYXJNYXBTdG9yZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC6QDqcDQ0AAA0NAAA3AAAAQGFnb3JpYy9zdG9yZS12MC45LjMtdTIxLjAvc3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL3BhdHRlcm5zIiwiLi9zY2FsYXJXZWFrU2V0U3RvcmUuanMiLCIuL3N0b3JlLXV0aWxzLmpzIl0sImV4cG9ydHMiOlsibWFrZVNjYWxhclNldFN0b3JlIiwibWFrZVNldFN0b3JlTWV0aG9kcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHEsRmFyLGZpbHRlckl0ZXJhYmxlLGNvbXBhcmVSYW5rLGFzc2VydFNjYWxhcktleSxtYWtlQ29weVNldCxtYXRjaGVzLG11c3RNYXRjaCxhc3NlcnRQYXR0ZXJuLG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzLG1ha2VDdXJyZW50S2V5c0tpdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wiZmlsdGVySXRlcmFibGVcIixbJGjNj19hID0+IChmaWx0ZXJJdGVyYWJsZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImNvbXBhcmVSYW5rXCIsWyRozY9fYSA9PiAoY29tcGFyZVJhbmsgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiYXNzZXJ0U2NhbGFyS2V5XCIsWyRozY9fYSA9PiAoYXNzZXJ0U2NhbGFyS2V5ID0gJGjNj19hKV1dLFtcIm1ha2VDb3B5U2V0XCIsWyRozY9fYSA9PiAobWFrZUNvcHlTZXQgPSAkaM2PX2EpXV0sW1wibWF0Y2hlc1wiLFskaM2PX2EgPT4gKG1hdGNoZXMgPSAkaM2PX2EpXV0sW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcImFzc2VydFBhdHRlcm5cIixbJGjNj19hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjNj19hKV1dXV0sW1wiLi9zY2FsYXJXZWFrU2V0U3RvcmUuanNcIiwgW1tcIm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzXCIsWyRozY9fYSA9PiAobWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMgPSAkaM2PX2EpXV1dXSxbXCIuL3N0b3JlLXV0aWxzLmpzXCIsIFtbXCJtYWtlQ3VycmVudEtleXNLaXRcIixbJGjNj19hID0+IChtYWtlQ3VycmVudEtleXNLaXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLypcblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VTZXRTdG9yZU1ldGhvZHMgPSAoXG4gIGpzc2V0LFxuICBhc3NlcnRLZXlPa1RvQWRkLFxuICBhc3NlcnRLZXlPa1RvRGVsZXRlID0gdW5kZWZpbmVkLFxuICBrZXlOYW1lID0gJ2tleScsXG4pID0+IHtcbiAgY29uc3QgeyBhc3NlcnRVcGRhdGVPbkFkZCwgYXNzZXJ0VXBkYXRlT25EZWxldGUsIGl0ZXJhYmxlS2V5cyB9ID1cbiAgICBtYWtlQ3VycmVudEtleXNLaXQoXG4gICAgICAoKSA9PiBqc3NldC5rZXlzKCksXG4gICAgICBrID0+IGpzc2V0LmhhcyhrKSxcbiAgICAgIGNvbXBhcmVSYW5rLFxuICAgICAgYXNzZXJ0S2V5T2tUb0FkZCxcbiAgICAgIGFzc2VydEtleU9rVG9EZWxldGUsXG4gICAgICBrZXlOYW1lLFxuICAgICk7XG5cbiAgLypcblxuXG4gICAqL1xuICBjb25zdCBrZXlzID0gKGtleVBhdHQgPSB1bmRlZmluZWQpID0+XG4gICAga2V5UGF0dCA9PT0gdW5kZWZpbmVkXG4gICAgICA/IGl0ZXJhYmxlS2V5c1xuICAgICAgOiBmaWx0ZXJJdGVyYWJsZShpdGVyYWJsZUtleXMsIGsgPT4gbWF0Y2hlcyhrLCBrZXlQYXR0KSk7XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgLi4ubWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMoXG4gICAgICBqc3NldCxcbiAgICAgIGFzc2VydFVwZGF0ZU9uQWRkLFxuICAgICAgYXNzZXJ0VXBkYXRlT25EZWxldGUsXG4gICAgICBrZXlOYW1lLFxuICAgICksXG5cbiAgICBrZXlzLFxuXG4gICAgdmFsdWVzOiBrZXlzLFxuXG4gICAgc25hcHNob3Q6IChrZXlQYXR0ID0gdW5kZWZpbmVkKSA9PiBtYWtlQ29weVNldChrZXlzKGtleVBhdHQpKSxcblxuICAgIGdldFNpemU6IChrZXlQYXR0ID0gdW5kZWZpbmVkKSA9PlxuICAgICAga2V5UGF0dCA9PT0gdW5kZWZpbmVkID8ganNzZXQuc2l6ZSA6IFsuLi5rZXlzKGtleVBhdHQpXS5sZW5ndGgsXG5cbiAgICBjbGVhcjogKGtleVBhdHQgPSB1bmRlZmluZWQpID0+IHtcbiAgICAgIGlmIChrZXlQYXR0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAganNzZXQuY2xlYXIoKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMoa2V5UGF0dCkpIHtcbiAgICAgICAganNzZXQuZGVsZXRlKGtleSk7XG4gICAgICB9XG4gICAgfSxcbiAgfSk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5tYWtlU2V0U3RvcmVNZXRob2RzKG1ha2VTZXRTdG9yZU1ldGhvZHMpO1xuICAgICAgIGNvbnN0IG1ha2VTY2FsYXJTZXRTdG9yZSA9IChcbiAgdGFnID0gJ2tleScsXG4gIHsga2V5U2hhcGUgPSB1bmRlZmluZWQgfSA9IHt9LFxuKSA9PiB7XG4gIGNvbnN0IGpzc2V0ID0gbmV3IFNldCgpO1xuICBpZiAoa2V5U2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydFBhdHRlcm4oa2V5U2hhcGUpO1xuICB9XG5cbiAgY29uc3QgYXNzZXJ0S2V5T2tUb0FkZCA9IGtleSA9PiB7XG4gICAgLy9cbiAgICAvL1xuICAgIGhhcmRlbihrZXkpO1xuXG4gICAgYXNzZXJ0U2NhbGFyS2V5KGtleSk7XG4gICAgaWYgKGtleVNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG11c3RNYXRjaChrZXksIGtleVNoYXBlLCAnc2V0U3RvcmUga2V5Jyk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBGYXIoYHNjYWxhciBTZXRTdG9yZSBvZiAke3EodGFnKX1gLCB7XG4gICAgLi4ubWFrZVNldFN0b3JlTWV0aG9kcyhqc3NldCwgYXNzZXJ0S2V5T2tUb0FkZCwgdW5kZWZpbmVkLCB0YWcpLFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VTY2FsYXJTZXRTdG9yZShtYWtlU2NhbGFyU2V0U3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJTZXRTdG9yZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlU2V0U3RvcmVNZXRob2RzIjpbIm1ha2VTZXRTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhclNldFN0b3JlIjpbIm1ha2VTY2FsYXJTZXRTdG9yZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABZuWC6xA8AAMQPAAA7AAAAQGFnb3JpYy9zdG9yZS12MC45LjMtdTIxLjAvc3JjL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsibWFrZVNjYWxhcldlYWtNYXBTdG9yZSIsIm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxGYWlsLEZhcixhc3NlcnRQYXNzYWJsZSxwYXNzU3R5bGVPZixnZXRDb3B5TWFwRW50cmllcyxtdXN0TWF0Y2gsYXNzZXJ0UGF0dGVybixpc0NvcHlNYXA7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dLFtcImFzc2VydFBhc3NhYmxlXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJnZXRDb3B5TWFwRW50cmllc1wiLFskaM2PX2EgPT4gKGdldENvcHlNYXBFbnRyaWVzID0gJGjNj19hKV1dLFtcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXSxbXCJhc3NlcnRQYXR0ZXJuXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRozY9fYSldXSxbXCJpc0NvcHlNYXBcIixbJGjNj19hID0+IChpc0NvcHlNYXAgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlV2Vha01hcFN0b3JlTWV0aG9kcyA9IChcbiAganNtYXAsXG4gIGFzc2VydEtWT2tUb0FkZCxcbiAgYXNzZXJ0S1ZPa1RvU2V0LFxuICBhc3NlcnRLZXlPa1RvRGVsZXRlID0gdW5kZWZpbmVkLFxuICBrZXlOYW1lID0gJ2tleScsXG4pID0+IHtcbiAgY29uc3QgYXNzZXJ0S2V5RG9lc05vdEV4aXN0ID0ga2V5ID0+XG4gICAgIWpzbWFwLmhhcyhrZXkpIHx8IEZhaWxgJHtxKGtleU5hbWUpfSBhbHJlYWR5IHJlZ2lzdGVyZWQ6ICR7a2V5fWA7XG5cbiAgY29uc3QgYXNzZXJ0S2V5RXhpc3RzID0ga2V5ID0+XG4gICAganNtYXAuaGFzKGtleSkgfHwgRmFpbGAke3Eoa2V5TmFtZSl9IG5vdCBmb3VuZDogJHtrZXl9YDtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBoYXM6IGtleSA9PiB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICByZXR1cm4ganNtYXAuaGFzKGtleSk7XG4gICAgfSxcbiAgICBnZXQ6IGtleSA9PiB7XG4gICAgICBhc3NlcnRLZXlFeGlzdHMoa2V5KTtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gLyogICAgICAgICAgICAqLyAoanNtYXAuZ2V0KGtleSkpO1xuICAgIH0sXG5cbiAgICBpbml0OiAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgYXNzZXJ0S2V5RG9lc05vdEV4aXN0KGtleSk7XG4gICAgICBhc3NlcnRLVk9rVG9BZGQoa2V5LCB2YWx1ZSk7XG4gICAgICBqc21hcC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfSxcbiAgICBzZXQ6IChrZXksIHZhbHVlKSA9PiB7XG4gICAgICBhc3NlcnRLZXlFeGlzdHMoa2V5KTtcbiAgICAgIGFzc2VydEtWT2tUb1NldChrZXksIHZhbHVlKTtcbiAgICAgIGpzbWFwLnNldChrZXksIHZhbHVlKTtcbiAgICB9LFxuICAgIGRlbGV0ZToga2V5ID0+IHtcbiAgICAgIGFzc2VydEtleUV4aXN0cyhrZXkpO1xuICAgICAgaWYgKGFzc2VydEtleU9rVG9EZWxldGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBhc3NlcnRLZXlPa1RvRGVsZXRlKGtleSk7XG4gICAgICB9XG4gICAgICBqc21hcC5kZWxldGUoa2V5KTtcbiAgICB9LFxuXG4gICAgYWRkQWxsOiBlbnRyaWVzID0+IHtcbiAgICAgIGlmICh0eXBlb2YgZW50cmllc1tTeW1ib2wuaXRlcmF0b3JdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGlmIChPYmplY3QuaXNGcm96ZW4oZW50cmllcykgJiYgaXNDb3B5TWFwKGVudHJpZXMpKSB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICBlbnRyaWVzID0gZ2V0Q29weU1hcEVudHJpZXMoZW50cmllcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgRmFpbGBwcm92aWRlZCBkYXRhIHNvdXJjZSBpcyBub3QgaXRlcmFibGU6ICR7ZW50cmllc31gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChlbnRyaWVzKSkge1xuICAgICAgICAvL1xuICAgICAgICBhc3NlcnRLVk9rVG9BZGQoa2V5LCB2YWx1ZSk7XG4gICAgICAgIGpzbWFwLnNldChrZXksIHZhbHVlKTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5tYWtlV2Vha01hcFN0b3JlTWV0aG9kcyhtYWtlV2Vha01hcFN0b3JlTWV0aG9kcyk7XG4gICAgICAgY29uc3QgbWFrZVNjYWxhcldlYWtNYXBTdG9yZSA9IChcbiAgdGFnID0gJ2tleScsXG4gIHsgbG9uZ0xpdmVkID0gdHJ1ZSwga2V5U2hhcGUgPSB1bmRlZmluZWQsIHZhbHVlU2hhcGUgPSB1bmRlZmluZWQgfSA9IHt9LFxuKSA9PiB7XG4gIGNvbnN0IGpzbWFwID0gbmV3IChsb25nTGl2ZWQgPyBXZWFrTWFwIDogTWFwKSgpO1xuICBpZiAoa2V5U2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydFBhdHRlcm4oa2V5U2hhcGUpO1xuICB9XG4gIGlmICh2YWx1ZVNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnRQYXR0ZXJuKHZhbHVlU2hhcGUpO1xuICB9XG5cbiAgY29uc3QgYXNzZXJ0S1ZPa1RvU2V0ID0gKF9rZXksIHZhbHVlKSA9PiB7XG4gICAgLy9cbiAgICAvL1xuICAgIGhhcmRlbih2YWx1ZSk7XG5cbiAgICBhc3NlcnRQYXNzYWJsZSh2YWx1ZSk7XG4gICAgaWYgKHZhbHVlU2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbXVzdE1hdGNoKHZhbHVlLCB2YWx1ZVNoYXBlLCAnd2Vha01hcFN0b3JlIHZhbHVlJyk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGFzc2VydEtWT2tUb0FkZCA9IChrZXksIHZhbHVlKSA9PiB7XG4gICAgLy9cbiAgICAvL1xuICAgIGhhcmRlbihrZXkpO1xuICAgIHBhc3NTdHlsZU9mKGtleSkgPT09ICdyZW1vdGFibGUnIHx8XG4gICAgICBGYWlsYE9ubHkgcmVtb3RhYmxlcyBjYW4gYmUga2V5cyBvZiBzY2FsYXIgV2Vha01hcFN0b3JlczogJHtrZXl9YDtcbiAgICBpZiAoa2V5U2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbXVzdE1hdGNoKGtleSwga2V5U2hhcGUsICd3ZWFrTWFwU3RvcmUga2V5Jyk7XG4gICAgfVxuICAgIGFzc2VydEtWT2tUb1NldChrZXksIHZhbHVlKTtcbiAgfTtcblxuICByZXR1cm4gRmFyKGBzY2FsYXIgV2Vha01hcFN0b3JlIG9mICR7cSh0YWcpfWAsIHtcbiAgICAuLi5tYWtlV2Vha01hcFN0b3JlTWV0aG9kcyhcbiAgICAgIGpzbWFwLFxuICAgICAgYXNzZXJ0S1ZPa1RvQWRkLFxuICAgICAgYXNzZXJ0S1ZPa1RvU2V0LFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdGFnLFxuICAgICksXG4gIH0pO1xufTskaM2PX29uY2UubWFrZVNjYWxhcldlYWtNYXBTdG9yZShtYWtlU2NhbGFyV2Vha01hcFN0b3JlKTtcbmhhcmRlbihtYWtlU2NhbGFyV2Vha01hcFN0b3JlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VXZWFrTWFwU3RvcmVNZXRob2RzIjpbIm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzIl0sIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiOlsibWFrZVNjYWxhcldlYWtNYXBTdG9yZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABA7FDWywsAAMsLAAA7AAAAQGFnb3JpYy9zdG9yZS12MC45LjMtdTIxLjAvc3JjL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsibWFrZVNjYWxhcldlYWtTZXRTdG9yZSIsIm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxGYWlsLEZhcixwYXNzU3R5bGVPZixnZXRDb3B5U2V0S2V5cyxtdXN0TWF0Y2gsYXNzZXJ0UGF0dGVybixpc0NvcHlTZXQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dLFtcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiZ2V0Q29weVNldEtleXNcIixbJGjNj19hID0+IChnZXRDb3B5U2V0S2V5cyA9ICRozY9fYSldXSxbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UGF0dGVyblwiLFskaM2PX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaM2PX2EpXV0sW1wiaXNDb3B5U2V0XCIsWyRozY9fYSA9PiAoaXNDb3B5U2V0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG4vKlxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMgPSAoXG4gIGpzc2V0LFxuICBhc3NlcnRLZXlPa1RvQWRkLFxuICBhc3NlcnRLZXlPa1RvRGVsZXRlID0gdW5kZWZpbmVkLFxuICBrZXlOYW1lID0gJ2tleScsXG4pID0+IHtcbiAgY29uc3QgYXNzZXJ0S2V5RXhpc3RzID0ga2V5ID0+XG4gICAganNzZXQuaGFzKGtleSkgfHwgRmFpbGAke3Eoa2V5TmFtZSl9IG5vdCBmb3VuZDogJHtrZXl9YDtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBoYXM6IGtleSA9PiB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICByZXR1cm4ganNzZXQuaGFzKGtleSk7XG4gICAgfSxcblxuICAgIGFkZDoga2V5ID0+IHtcbiAgICAgIGFzc2VydEtleU9rVG9BZGQoa2V5KTtcbiAgICAgIGpzc2V0LmFkZChrZXkpO1xuICAgIH0sXG4gICAgZGVsZXRlOiBrZXkgPT4ge1xuICAgICAgYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4gICAgICBpZiAoYXNzZXJ0S2V5T2tUb0RlbGV0ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGFzc2VydEtleU9rVG9EZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICAgIGpzc2V0LmRlbGV0ZShrZXkpO1xuICAgIH0sXG5cbiAgICBhZGRBbGw6IGtleXMgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBrZXlzW1N5bWJvbC5pdGVyYXRvcl0gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaWYgKE9iamVjdC5pc0Zyb3plbihrZXlzKSAmJiBpc0NvcHlTZXQoa2V5cykpIHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIGtleXMgPSBnZXRDb3B5U2V0S2V5cyhrZXlzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBGYWlsYHByb3ZpZGVkIGRhdGEgc291cmNlIGlzIG5vdCBpdGVyYWJsZTogJHtrZXlzfWA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIC8qICAgICAgICAgICAgICAgICAgICAgICovIChrZXlzKSkge1xuICAgICAgICBhc3NlcnRLZXlPa1RvQWRkKGtleSk7XG4gICAgICAgIGpzc2V0LmFkZChrZXkpO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5tYWtlV2Vha1NldFN0b3JlTWV0aG9kcyhtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyk7XG4gICAgICAgY29uc3QgbWFrZVNjYWxhcldlYWtTZXRTdG9yZSA9IChcbiAgdGFnID0gJ2tleScsXG4gIHsgbG9uZ0xpdmVkID0gdHJ1ZSwga2V5U2hhcGUgPSB1bmRlZmluZWQgfSA9IHt9LFxuKSA9PiB7XG4gIGNvbnN0IGpzc2V0ID0gbmV3IChsb25nTGl2ZWQgPyBXZWFrU2V0IDogU2V0KSgpO1xuICBpZiAoa2V5U2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydFBhdHRlcm4oa2V5U2hhcGUpO1xuICB9XG5cbiAgY29uc3QgYXNzZXJ0S2V5T2tUb0FkZCA9IGtleSA9PiB7XG4gICAgLy9cbiAgICAvL1xuICAgIGhhcmRlbihrZXkpO1xuICAgIHBhc3NTdHlsZU9mKGtleSkgPT09ICdyZW1vdGFibGUnIHx8XG4gICAgICBGYWlsYE9ubHkgcmVtb3RhYmxlcyBjYW4gYmUga2V5cyBvZiBzY2FsYXIgV2Vha1N0b3JlczogJHtrZXl9YDtcbiAgICBpZiAoa2V5U2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbXVzdE1hdGNoKGtleSwga2V5U2hhcGUsICd3ZWFrU2V0U3RvcmUga2V5Jyk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBGYXIoYHNjYWxhciBXZWFrU2V0U3RvcmUgb2YgJHtxKHRhZyl9YCwge1xuICAgIC4uLm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzKGpzc2V0LCBhc3NlcnRLZXlPa1RvQWRkLCB1bmRlZmluZWQsIHRhZyksXG4gIH0pO1xufTskaM2PX29uY2UubWFrZVNjYWxhcldlYWtTZXRTdG9yZShtYWtlU2NhbGFyV2Vha1NldFN0b3JlKTtcbmhhcmRlbihtYWtlU2NhbGFyV2Vha1NldFN0b3JlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VXZWFrU2V0U3RvcmVNZXRob2RzIjpbIm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzIl0sIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiOlsibWFrZVNjYWxhcldlYWtTZXRTdG9yZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFxkU9ohAAAKIQAAA0AAAAQGFnb3JpYy9zdG9yZS12MC45LjMtdTIxLjAvc3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJhcHBlbmRUb1N0b3JlZEFycmF5IiwiaXNDb3B5TWFwIiwiaXNDb3B5U2V0IiwibWFrZUF0b21pY1Byb3ZpZGVyIiwibWFrZUN1cnJlbnRLZXlzS2l0IiwicHJvdmlkZUxhenkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHEsRmFyLGlzQ29weU1hcCxpc0NvcHlTZXQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcImlzQ29weU1hcFwiLFskaM2PX2EgPT4gKGlzQ29weU1hcCA9ICRozY9fYSksJGjNj19saXZlW1wiaXNDb3B5TWFwXCJdXV0sW1wiaXNDb3B5U2V0XCIsWyRozY9fYSA9PiAoaXNDb3B5U2V0ID0gJGjNj19hKSwkaM2PX2xpdmVbXCJpc0NvcHlTZXRcIl1dXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlQ3VycmVudEtleXNLaXQgPSAoXG4gIGdldFJhd0tleXMsXG4gIGNoZWNrSGFzLFxuICBjb21wYXJlLFxuICBhc3NlcnRPa1RvQWRkLFxuICBhc3NlcnRPa1RvRGVsZXRlID0gdW5kZWZpbmVkLFxuICBrZXlOYW1lID0gJ2tleScsXG4pID0+IHtcbiAgbGV0IHVwZGF0ZUNvdW50ID0gMDtcbiAgbGV0IHNvcnRlZEtleXNNZW1vO1xuXG4gIGNvbnN0IGFzc2VydFVwZGF0ZU9uQWRkID0gKGssIHYgPSB1bmRlZmluZWQpID0+IHtcbiAgICBhc3NlcnRPa1RvQWRkKGssIHYpO1xuICAgIHVwZGF0ZUNvdW50ICs9IDE7XG4gICAgc29ydGVkS2V5c01lbW8gPSB1bmRlZmluZWQ7XG4gIH07XG5cbiAgY29uc3QgYXNzZXJ0VXBkYXRlT25EZWxldGUgPSBrID0+IGFzc2VydE9rVG9EZWxldGUgJiYgYXNzZXJ0T2tUb0RlbGV0ZShrKTtcblxuICBjb25zdCBnZXRTb3J0ZWRLZXlzID0gKCkgPT4ge1xuICAgIGlmIChzb3J0ZWRLZXlzTWVtbyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBzb3J0ZWRLZXlzTWVtbyA9IGhhcmRlbihbLi4uZ2V0UmF3S2V5cygpXS5zb3J0KGNvbXBhcmUpKTtcbiAgICB9XG4gICAgcmV0dXJuIHNvcnRlZEtleXNNZW1vO1xuICB9O1xuXG4gIGNvbnN0IGl0ZXJhYmxlS2V5cyA9IEZhcignSXRlcmFibGUgb2Yga2V5cycsIHtcbiAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgY29uc3QgZ2VuZXJhdGlvbiA9IHVwZGF0ZUNvdW50O1xuICAgICAgZ2V0U29ydGVkS2V5cygpO1xuICAgICAgY29uc3QgbGVuID0gc29ydGVkS2V5c01lbW8ubGVuZ3RoO1xuICAgICAgbGV0IGkgPSAwO1xuICAgICAgcmV0dXJuIEZhcignSXRlcmF0b3Igb2Yga2V5cycsIHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGdlbmVyYXRpb24gPT09IHVwZGF0ZUNvdW50IHx8IEZhaWxgU3RvcmUgJHtxKGtleU5hbWUpfSBjdXJzb3Igc3RhbGVgO1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBpZiAoaSA8IGxlbikge1xuICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHNvcnRlZEtleXNNZW1vW2ldO1xuICAgICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICAgIGlmIChjaGVja0hhcyh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgZG9uZTogZmFsc2UsIHZhbHVlIH0pO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBhc3NlcnRVcGRhdGVPbkFkZCxcbiAgICBhc3NlcnRVcGRhdGVPbkRlbGV0ZSxcbiAgICBpdGVyYWJsZUtleXMsXG4gIH0pO1xufTskaM2PX29uY2UubWFrZUN1cnJlbnRLZXlzS2l0KG1ha2VDdXJyZW50S2V5c0tpdCk7XG5oYXJkZW4obWFrZUN1cnJlbnRLZXlzS2l0KTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcHJvdmlkZUxhenkgPSAobWFwU3RvcmUsIGtleSwgbWFrZVZhbHVlKSA9PiB7XG4gIGlmICghbWFwU3RvcmUuaGFzKGtleSkpIHtcbiAgICBtYXBTdG9yZS5pbml0KGtleSwgbWFrZVZhbHVlKGtleSkpO1xuICB9XG4gIHJldHVybiBtYXBTdG9yZS5nZXQoa2V5KTtcbn07JGjNj19vbmNlLnByb3ZpZGVMYXp5KHByb3ZpZGVMYXp5KTtcbmhhcmRlbihwcm92aWRlTGF6eSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VBdG9taWNQcm92aWRlciA9IHN0b3JlID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHBlbmRpbmcgPSBuZXcgTWFwKCk7XG5cbiAgLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBwcm92aWRlQXN5bmMgPSAoa2V5LCBtYWtlVmFsdWUsIGZpbmlzaFZhbHVlKSA9PiB7XG4gICAgaWYgKHN0b3JlLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHN0b3JlLmdldChrZXkpKTtcbiAgICB9XG4gICAgaWYgKCFwZW5kaW5nLmhhcyhrZXkpKSB7XG4gICAgICBjb25zdCB2YWxQID0gbWFrZVZhbHVlKGtleSlcbiAgICAgICAgLnRoZW4odiA9PiB7XG4gICAgICAgICAgc3RvcmUuaW5pdChrZXksIHYpO1xuICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICB9KVxuICAgICAgICAudGhlbih2ID0+IHtcbiAgICAgICAgICBpZiAoZmluaXNoVmFsdWUpIHtcbiAgICAgICAgICAgIHJldHVybiBmaW5pc2hWYWx1ZShrZXksIHYpLnRoZW4oKCkgPT4gdik7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB2O1xuICAgICAgICB9KVxuICAgICAgICAuZmluYWxseSgoKSA9PiB7XG4gICAgICAgICAgcGVuZGluZy5kZWxldGUoa2V5KTtcbiAgICAgICAgfSk7XG4gICAgICBwZW5kaW5nLnNldChrZXksIHZhbFApO1xuICAgIH1cbiAgICBjb25zdCB2YWxQID0gcGVuZGluZy5nZXQoa2V5KTtcbiAgICBhc3NlcnQodmFsUCk7XG4gICAgcmV0dXJuIHZhbFA7XG4gIH07XG5cbiAgcmV0dXJuIGhhcmRlbih7IHByb3ZpZGVBc3luYyB9KTtcbn07JGjNj19vbmNlLm1ha2VBdG9taWNQcm92aWRlcihtYWtlQXRvbWljUHJvdmlkZXIpO1xuaGFyZGVuKG1ha2VBdG9taWNQcm92aWRlcik7XG4vKlxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgYXBwZW5kVG9TdG9yZWRBcnJheSA9IChtYXBTdG9yZSwga2V5LCBpdGVtKSA9PiB7XG4gIGlmIChtYXBTdG9yZS5oYXMoa2V5KSkge1xuICAgIGNvbnN0IGV4dGFudCA9IG1hcFN0b3JlLmdldChrZXkpO1xuICAgIG1hcFN0b3JlLnNldChrZXksIGhhcmRlbihbLi4uZXh0YW50LCBpdGVtXSkpO1xuICB9IGVsc2Uge1xuICAgIG1hcFN0b3JlLmluaXQoa2V5LCBoYXJkZW4oW2l0ZW1dKSk7XG4gIH1cbn07JGjNj19vbmNlLmFwcGVuZFRvU3RvcmVkQXJyYXkoYXBwZW5kVG9TdG9yZWRBcnJheSk7XG5oYXJkZW4oYXBwZW5kVG9TdG9yZWRBcnJheSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6eyJpc0NvcHlNYXAiOlsiaXNDb3B5TWFwIixmYWxzZV0sImlzQ29weVNldCI6WyJpc0NvcHlTZXQiLGZhbHNlXX0sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlQ3VycmVudEtleXNLaXQiOlsibWFrZUN1cnJlbnRLZXlzS2l0Il0sInByb3ZpZGVMYXp5IjpbInByb3ZpZGVMYXp5Il0sIm1ha2VBdG9taWNQcm92aWRlciI6WyJtYWtlQXRvbWljUHJvdmlkZXIiXSwiYXBwZW5kVG9TdG9yZWRBcnJheSI6WyJhcHBlbmRUb1N0b3JlZEFycmF5Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACcAAABAYWdvcmljL3N0b3JlLXYwLjkuMy11MjEuMC9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAwwxcir8ZAAC/GQAALgAAAEBhZ29yaWMvdmF0LWRhdGEtdjAuNS4zLXUyMS4wL3NyYy9leG8tdXRpbHMuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSIsIi4vdmF0LWRhdGEtYmluZGluZ3MuanMiXSwiZXhwb3J0cyI6WyJkZWZpbmVEdXJhYmxlRXhvQ2xhc3MiLCJkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQiLCJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MiLCJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQiLCJpZ25vcmVDb250ZXh0IiwibWFrZUV4b1V0aWxzIiwicHJlcGFyZUV4byIsInByZXBhcmVFeG9DbGFzcyIsInByZXBhcmVFeG9DbGFzc0tpdCIsInByZXBhcmVLaW5kIiwicHJlcGFyZUtpbmRNdWx0aSIsInByZXBhcmVTaW5nbGV0b24iLCJwcm92aWRlS2luZEhhbmRsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGluaXRFbXB0eSxwcm92aWRlLGdsb2JhbFZhdERhdGE7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJpbml0RW1wdHlcIixbJGjNj19hID0+IChpbml0RW1wdHkgPSAkaM2PX2EpXV1dXSxbXCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzXCIsIFtbXCJwcm92aWRlXCIsWyRozY9fYSA9PiAocHJvdmlkZSA9ICRozY9fYSldXSxbXCJWYXREYXRhXCIsWyRozY9fYSA9PiAoZ2xvYmFsVmF0RGF0YSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuLypcblxuXG5cbiAqL1xuXG4vL1xuLypcblxuICovXG4vKlxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgaWdub3JlQ29udGV4dCA9XG4gIGZuID0+XG4gIChfY29udGV4dCwgLi4uYXJncykgPT5cbiAgICBmbiguLi5hcmdzKTskaM2PX29uY2UuaWdub3JlQ29udGV4dChpZ25vcmVDb250ZXh0KTtcbmhhcmRlbihpZ25vcmVDb250ZXh0KTtcblxuLy9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgbWFrZUV4b1V0aWxzID0gVmF0RGF0YSA9PiB7XG4gIGNvbnN0IHtcbiAgICBkZWZpbmVLaW5kLFxuICAgIGRlZmluZUtpbmRNdWx0aSxcbiAgICBkZWZpbmVEdXJhYmxlS2luZCxcbiAgICBkZWZpbmVEdXJhYmxlS2luZE11bHRpLFxuICAgIG1ha2VLaW5kSGFuZGxlLFxuICB9ID0gVmF0RGF0YTtcblxuICAvKlxuXG5cblxuXG4gICAqL1xuICBjb25zdCBwcm92aWRlS2luZEhhbmRsZSA9IChiYWdnYWdlLCBraW5kTmFtZSkgPT5cbiAgICBwcm92aWRlKGJhZ2dhZ2UsIGAke2tpbmROYW1lfV9raW5kSGFuZGxlYCwgKCkgPT4gbWFrZUtpbmRIYW5kbGUoa2luZE5hbWUpKTtcbiAgaGFyZGVuKHByb3ZpZGVLaW5kSGFuZGxlKTtcblxuICAvKlxuXG5cbiAgICovXG4gIGNvbnN0IHByZXBhcmVLaW5kID0gKFxuICAgIGJhZ2dhZ2UsXG4gICAga2luZE5hbWUsXG4gICAgaW5pdCxcbiAgICBiZWhhdmlvcixcbiAgICBvcHRpb25zID0gdW5kZWZpbmVkLFxuICApID0+XG4gICAgZGVmaW5lRHVyYWJsZUtpbmQoXG4gICAgICBwcm92aWRlS2luZEhhbmRsZShiYWdnYWdlLCBraW5kTmFtZSksXG4gICAgICBpbml0LFxuICAgICAgYmVoYXZpb3IsXG4gICAgICBvcHRpb25zLFxuICAgICk7XG4gIGhhcmRlbihwcmVwYXJlS2luZCk7XG5cbiAgLypcblxuXG4gICAqL1xuICBjb25zdCBwcmVwYXJlS2luZE11bHRpID0gKFxuICAgIGJhZ2dhZ2UsXG4gICAga2luZE5hbWUsXG4gICAgaW5pdCxcbiAgICBiZWhhdmlvcixcbiAgICBvcHRpb25zID0gdW5kZWZpbmVkLFxuICApID0+XG4gICAgZGVmaW5lRHVyYWJsZUtpbmRNdWx0aShcbiAgICAgIHByb3ZpZGVLaW5kSGFuZGxlKGJhZ2dhZ2UsIGtpbmROYW1lKSxcbiAgICAgIGluaXQsXG4gICAgICBiZWhhdmlvcixcbiAgICAgIG9wdGlvbnMsXG4gICAgKTtcbiAgaGFyZGVuKHByZXBhcmVLaW5kTXVsdGkpO1xuXG4gIC8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MgPSAodGFnLCBpbnRlcmZhY2VHdWFyZCwgaW5pdCwgbWV0aG9kcywgb3B0aW9ucykgPT5cbiAgICAvL1xuICAgIGRlZmluZUtpbmQodGFnLCBpbml0LCBtZXRob2RzLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgdGhpc2Z1bE1ldGhvZHM6IHRydWUsXG4gICAgICBpbnRlcmZhY2VHdWFyZCxcbiAgICB9KTtcbiAgaGFyZGVuKGRlZmluZVZpcnR1YWxFeG9DbGFzcyk7XG5cbiAgLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCA9IChcbiAgICB0YWcsXG4gICAgaW50ZXJmYWNlR3VhcmRLaXQsXG4gICAgaW5pdCxcbiAgICBmYWNldHMsXG4gICAgb3B0aW9ucyxcbiAgKSA9PlxuICAgIC8vXG4gICAgZGVmaW5lS2luZE11bHRpKHRhZywgaW5pdCwgZmFjZXRzLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgdGhpc2Z1bE1ldGhvZHM6IHRydWUsXG4gICAgICBpbnRlcmZhY2VHdWFyZEtpdCxcbiAgICB9KTtcbiAgaGFyZGVuKGRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCk7XG5cbiAgLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGRlZmluZUR1cmFibGVFeG9DbGFzcyA9IChcbiAgICBraW5kSGFuZGxlLFxuICAgIGludGVyZmFjZUd1YXJkLFxuICAgIGluaXQsXG4gICAgbWV0aG9kcyxcbiAgICBvcHRpb25zLFxuICApID0+XG4gICAgLy9cbiAgICBkZWZpbmVEdXJhYmxlS2luZChraW5kSGFuZGxlLCBpbml0LCBtZXRob2RzLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgdGhpc2Z1bE1ldGhvZHM6IHRydWUsXG4gICAgICBpbnRlcmZhY2VHdWFyZCxcbiAgICB9KTtcbiAgaGFyZGVuKGRlZmluZUR1cmFibGVFeG9DbGFzcyk7XG5cbiAgLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCA9IChcbiAgICBraW5kSGFuZGxlLFxuICAgIGludGVyZmFjZUd1YXJkS2l0LFxuICAgIGluaXQsXG4gICAgZmFjZXRzLFxuICAgIG9wdGlvbnMsXG4gICkgPT5cbiAgICAvL1xuICAgIGRlZmluZUR1cmFibGVLaW5kTXVsdGkoa2luZEhhbmRsZSwgaW5pdCwgZmFjZXRzLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgdGhpc2Z1bE1ldGhvZHM6IHRydWUsXG4gICAgICBpbnRlcmZhY2VHdWFyZEtpdCxcbiAgICB9KTtcbiAgaGFyZGVuKGRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCk7XG5cbiAgLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgcHJlcGFyZUV4b0NsYXNzID0gKFxuICAgIGJhZ2dhZ2UsXG4gICAga2luZE5hbWUsXG4gICAgaW50ZXJmYWNlR3VhcmQsXG4gICAgaW5pdCxcbiAgICBtZXRob2RzLFxuICAgIG9wdGlvbnMgPSB1bmRlZmluZWQsXG4gICkgPT5cbiAgICBkZWZpbmVEdXJhYmxlRXhvQ2xhc3MoXG4gICAgICBwcm92aWRlS2luZEhhbmRsZShiYWdnYWdlLCBraW5kTmFtZSksXG4gICAgICBpbnRlcmZhY2VHdWFyZCxcbiAgICAgIGluaXQsXG4gICAgICBtZXRob2RzLFxuICAgICAgb3B0aW9ucyxcbiAgICApO1xuICBoYXJkZW4ocHJlcGFyZUV4b0NsYXNzKTtcblxuICAvKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBwcmVwYXJlRXhvQ2xhc3NLaXQgPSAoXG4gICAgYmFnZ2FnZSxcbiAgICBraW5kTmFtZSxcbiAgICBpbnRlcmZhY2VHdWFyZEtpdCxcbiAgICBpbml0LFxuICAgIGZhY2V0cyxcbiAgICBvcHRpb25zID0gdW5kZWZpbmVkLFxuICApID0+XG4gICAgZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0KFxuICAgICAgcHJvdmlkZUtpbmRIYW5kbGUoYmFnZ2FnZSwga2luZE5hbWUpLFxuICAgICAgaW50ZXJmYWNlR3VhcmRLaXQsXG4gICAgICBpbml0LFxuICAgICAgZmFjZXRzLFxuICAgICAgb3B0aW9ucyxcbiAgICApO1xuICBoYXJkZW4ocHJlcGFyZUV4b0NsYXNzS2l0KTtcblxuICAvKlxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBwcmVwYXJlRXhvID0gKFxuICAgIGJhZ2dhZ2UsXG4gICAga2luZE5hbWUsXG4gICAgaW50ZXJmYWNlR3VhcmQsXG4gICAgbWV0aG9kcyxcbiAgICBvcHRpb25zID0gdW5kZWZpbmVkLFxuICApID0+IHtcbiAgICBjb25zdCBtYWtlU2luZ2xldG9uID0gcHJlcGFyZUV4b0NsYXNzKFxuICAgICAgYmFnZ2FnZSxcbiAgICAgIGtpbmROYW1lLFxuICAgICAgaW50ZXJmYWNlR3VhcmQsXG4gICAgICBpbml0RW1wdHksXG4gICAgICBtZXRob2RzLFxuICAgICAgb3B0aW9ucyxcbiAgICApO1xuXG4gICAgcmV0dXJuIHByb3ZpZGUoYmFnZ2FnZSwgYCR7a2luZE5hbWV9X3NpbmdsZXRvbmAsICgpID0+IG1ha2VTaW5nbGV0b24oKSk7XG4gIH07XG4gIGhhcmRlbihwcmVwYXJlRXhvKTtcblxuICAvKlxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBwcmVwYXJlU2luZ2xldG9uID0gKGJhZ2dhZ2UsIGtpbmROYW1lLCBtZXRob2RzLCBvcHRpb25zID0gdW5kZWZpbmVkKSA9PlxuICAgIHByZXBhcmVFeG8oYmFnZ2FnZSwga2luZE5hbWUsIHVuZGVmaW5lZCwgbWV0aG9kcywgb3B0aW9ucyk7XG4gIGhhcmRlbihwcmVwYXJlU2luZ2xldG9uKTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MsXG4gICAgZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0LFxuICAgIGRlZmluZUR1cmFibGVFeG9DbGFzcyxcbiAgICBkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQsXG4gICAgcHJlcGFyZUV4b0NsYXNzLFxuICAgIHByZXBhcmVFeG9DbGFzc0tpdCxcbiAgICBwcmVwYXJlRXhvLFxuXG4gICAgcHJlcGFyZVNpbmdsZXRvbixcbiAgICBwcm92aWRlS2luZEhhbmRsZSxcbiAgICBwcmVwYXJlS2luZCxcbiAgICBwcmVwYXJlS2luZE11bHRpLFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VFeG9VdGlscyhtYWtlRXhvVXRpbHMpO1xuXG5jb25zdCBnbG9iYWxFeG9VdGlscyA9IG1ha2VFeG9VdGlscyhnbG9iYWxWYXREYXRhKTtcblxuICAgICAgIGNvbnN0IHtcbiAgZGVmaW5lVmlydHVhbEV4b0NsYXNzLFxuICBkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQsXG4gIGRlZmluZUR1cmFibGVFeG9DbGFzcyxcbiAgZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0LFxuICBwcmVwYXJlRXhvQ2xhc3MsXG4gIHByZXBhcmVFeG9DbGFzc0tpdCxcbiAgcHJlcGFyZUV4byxcbiAgcHJlcGFyZVNpbmdsZXRvbixcbn0gPSBnbG9iYWxFeG9VdGlscztcblxuLypcblxuICovJGjNj19vbmNlLmRlZmluZVZpcnR1YWxFeG9DbGFzcyhkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MpOyRozY9fb25jZS5kZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQoZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0KTskaM2PX29uY2UuZGVmaW5lRHVyYWJsZUV4b0NsYXNzKGRlZmluZUR1cmFibGVFeG9DbGFzcyk7JGjNj19vbmNlLmRlZmluZUR1cmFibGVFeG9DbGFzc0tpdChkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQpOyRozY9fb25jZS5wcmVwYXJlRXhvQ2xhc3MocHJlcGFyZUV4b0NsYXNzKTskaM2PX29uY2UucHJlcGFyZUV4b0NsYXNzS2l0KHByZXBhcmVFeG9DbGFzc0tpdCk7JGjNj19vbmNlLnByZXBhcmVFeG8ocHJlcGFyZUV4byk7JGjNj19vbmNlLnByZXBhcmVTaW5nbGV0b24ocHJlcGFyZVNpbmdsZXRvbik7XG4gICAgICAgY29uc3QgeyBwcm92aWRlS2luZEhhbmRsZSwgcHJlcGFyZUtpbmQsIHByZXBhcmVLaW5kTXVsdGkgfSA9XG4gIGdsb2JhbEV4b1V0aWxzOyRozY9fb25jZS5wcm92aWRlS2luZEhhbmRsZShwcm92aWRlS2luZEhhbmRsZSk7JGjNj19vbmNlLnByZXBhcmVLaW5kKHByZXBhcmVLaW5kKTskaM2PX29uY2UucHJlcGFyZUtpbmRNdWx0aShwcmVwYXJlS2luZE11bHRpKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Imlnbm9yZUNvbnRleHQiOlsiaWdub3JlQ29udGV4dCJdLCJtYWtlRXhvVXRpbHMiOlsibWFrZUV4b1V0aWxzIl0sImRlZmluZVZpcnR1YWxFeG9DbGFzcyI6WyJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MiXSwiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0IjpbImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCJdLCJkZWZpbmVEdXJhYmxlRXhvQ2xhc3MiOlsiZGVmaW5lRHVyYWJsZUV4b0NsYXNzIl0sImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCI6WyJkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQiXSwicHJlcGFyZUV4b0NsYXNzIjpbInByZXBhcmVFeG9DbGFzcyJdLCJwcmVwYXJlRXhvQ2xhc3NLaXQiOlsicHJlcGFyZUV4b0NsYXNzS2l0Il0sInByZXBhcmVFeG8iOlsicHJlcGFyZUV4byJdLCJwcmVwYXJlU2luZ2xldG9uIjpbInByZXBhcmVTaW5nbGV0b24iXSwicHJvdmlkZUtpbmRIYW5kbGUiOlsicHJvdmlkZUtpbmRIYW5kbGUiXSwicHJlcGFyZUtpbmQiOlsicHJlcGFyZUtpbmQiXSwicHJlcGFyZUtpbmRNdWx0aSI6WyJwcmVwYXJlS2luZE11bHRpIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAM+c6+m2CAAAtggAACoAAABAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMy11MjEuMC9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSIsIi4vdmF0LWRhdGEtYmluZGluZ3MuanMiLCIuL2V4by11dGlscy5qcyJdLCJleHBvcnRzIjpbImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCIsImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCIsIm1ha2VTY2FsYXJNYXBTdG9yZSIsIm1ha2VTY2FsYXJNYXBTdG9yZSIsInByb3ZpZGVQcm9taXNlV2F0Y2hlciIsInByb3ZpZGVQcm9taXNlV2F0Y2hlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtdXSxbXCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzXCIsIFtdXSxbXCIuL2V4by11dGlscy5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7IkBhZ29yaWMvc3RvcmUiOltbIk0iLCJNIl0sWyJtYWtlU2NhbGFyTWFwU3RvcmUiLCJtYWtlU2NhbGFyTWFwU3RvcmUiXSxbIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiLCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIl0sWyJtYWtlU2NhbGFyU2V0U3RvcmUiLCJtYWtlU2NhbGFyU2V0U3RvcmUiXSxbIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiLCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIl1dLCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIjpbWyJtYWtlS2luZEhhbmRsZSIsIm1ha2VLaW5kSGFuZGxlIl0sWyJwcm92aWRlUHJvbWlzZVdhdGNoZXIiLCJwcm92aWRlUHJvbWlzZVdhdGNoZXIiXSxbIndhdGNoUHJvbWlzZSIsIndhdGNoUHJvbWlzZSJdLFsibWFrZVNjYWxhckJpZ01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ01hcFN0b3JlIl0sWyJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSJdLFsibWFrZVNjYWxhckJpZ1NldFN0b3JlIiwibWFrZVNjYWxhckJpZ1NldFN0b3JlIl0sWyJtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSJdLFsiY2FuQmVEdXJhYmxlIiwiY2FuQmVEdXJhYmxlIl0sWyJwaWNrRmFjZXQiLCJwaWNrRmFjZXQiXSxbInBhcnRpYWxBc3NpZ24iLCJwYXJ0aWFsQXNzaWduIl0sWyJwcm92aWRlIiwicHJvdmlkZSJdLFsicHJvdmlkZUR1cmFibGVNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiXSxbInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIiwicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUiXSxbInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiLCJwcm92aWRlRHVyYWJsZVNldFN0b3JlIl0sWyJwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSIsInByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlIl0sWyJkZWZpbmVLaW5kIiwiZGVmaW5lS2luZCJdLFsiZGVmaW5lS2luZE11bHRpIiwiZGVmaW5lS2luZE11bHRpIl0sWyJkZWZpbmVEdXJhYmxlS2luZCIsImRlZmluZUR1cmFibGVLaW5kIl0sWyJkZWZpbmVEdXJhYmxlS2luZE11bHRpIiwiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSJdXSwiLi9leG8tdXRpbHMuanMiOltbImRlZmluZVZpcnR1YWxFeG9DbGFzcyIsImRlZmluZVZpcnR1YWxFeG9DbGFzcyJdLFsiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0IiwiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0Il0sWyJkZWZpbmVEdXJhYmxlRXhvQ2xhc3MiLCJkZWZpbmVEdXJhYmxlRXhvQ2xhc3MiXSxbImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCIsImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCJdLFsicHJlcGFyZUV4b0NsYXNzIiwicHJlcGFyZUV4b0NsYXNzIl0sWyJwcmVwYXJlRXhvQ2xhc3NLaXQiLCJwcmVwYXJlRXhvQ2xhc3NLaXQiXSxbInByZXBhcmVFeG8iLCJwcmVwYXJlRXhvIl0sWyJwcmVwYXJlU2luZ2xldG9uIiwicHJlcGFyZVNpbmdsZXRvbiJdLFsiaWdub3JlQ29udGV4dCIsImlnbm9yZUNvbnRleHQiXSxbInByb3ZpZGVLaW5kSGFuZGxlIiwicHJvdmlkZUtpbmRIYW5kbGUiXSxbInByZXBhcmVLaW5kIiwicHJlcGFyZUtpbmQiXSxbInByZXBhcmVLaW5kTXVsdGkiLCJwcmVwYXJlS2luZE11bHRpIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAvYSCWLhgAAC4YAAA2AAAAQGFnb3JpYy92YXQtZGF0YS12MC41LjMtdTIxLjAvc3JjL3ZhdC1kYXRhLWJpbmRpbmdzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJWYXREYXRhIiwiY2FuQmVEdXJhYmxlIiwiZGVmaW5lRHVyYWJsZUtpbmQiLCJkZWZpbmVEdXJhYmxlS2luZE11bHRpIiwiZGVmaW5lS2luZCIsImRlZmluZUtpbmRNdWx0aSIsIm1ha2VLaW5kSGFuZGxlIiwibWFrZVNjYWxhckJpZ01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ1NldFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSIsIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiLCJtYWtlU3RvcmVVdGlscyIsInBhcnRpYWxBc3NpZ24iLCJwaWNrRmFjZXQiLCJwcm92aWRlIiwicHJvdmlkZUR1cmFibGVNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiLCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlIiwicHJvdmlkZVByb21pc2VXYXRjaGVyIiwid2F0Y2hQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxwcm92aWRlTGF6eTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJwcm92aWRlTGF6eVwiLFskaM2PX2EgPT4gKHByb3ZpZGVMYXp5ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qICAgICAgICAgICAgICAgICAgKi9cbmxldCBWYXREYXRhR2xvYmFsO1xuaWYgKCdWYXREYXRhJyBpbiBnbG9iYWxUaGlzKSB7XG4gIGdsb2JhbFRoaXMuVmF0RGF0YSB8fCBGYWlsYFZhdERhdGEgZGVmaW5lZCBpbiBnbG9iYWwgYXMgbnVsbCBvciB1bmRlZmluZWRgO1xuICAvL1xuICBWYXREYXRhR2xvYmFsID0gLyogICAgICAgICAgICAgICovIChnbG9iYWxUaGlzLlZhdERhdGEpO1xufSBlbHNlIHtcbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgdW5hdmFpbGFibGUgPSAoKSA9PiBGYWlsYFZhdERhdGEgdW5hdmFpbGFibGVgO1xuICBWYXREYXRhR2xvYmFsID0ge1xuICAgIGRlZmluZUtpbmQ6IHVuYXZhaWxhYmxlLFxuICAgIGRlZmluZUtpbmRNdWx0aTogdW5hdmFpbGFibGUsXG4gICAgZGVmaW5lRHVyYWJsZUtpbmQ6IHVuYXZhaWxhYmxlLFxuICAgIGRlZmluZUR1cmFibGVLaW5kTXVsdGk6IHVuYXZhaWxhYmxlLFxuICAgIG1ha2VLaW5kSGFuZGxlOiB1bmF2YWlsYWJsZSxcbiAgICBwcm92aWRlUHJvbWlzZVdhdGNoZXI6IHVuYXZhaWxhYmxlLFxuICAgIHdhdGNoUHJvbWlzZTogdW5hdmFpbGFibGUsXG4gICAgbWFrZVNjYWxhckJpZ01hcFN0b3JlOiB1bmF2YWlsYWJsZSxcbiAgICBtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlOiB1bmF2YWlsYWJsZSxcbiAgICBtYWtlU2NhbGFyQmlnU2V0U3RvcmU6IHVuYXZhaWxhYmxlLFxuICAgIG1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmU6IHVuYXZhaWxhYmxlLFxuICAgIGNhbkJlRHVyYWJsZTogdW5hdmFpbGFibGUsXG4gIH07XG59XG5cbmNvbnN0IFZhdERhdGFFeHBvcnQgPSBWYXREYXRhR2xvYmFsOyRozY9fb25jZS5WYXREYXRhRXhwb3J0KFZhdERhdGFFeHBvcnQpO1xuXG5cbi8qXG5cbiAqL1xuICAgICAgIGNvbnN0IHtcbiAgZGVmaW5lS2luZCxcbiAgZGVmaW5lS2luZE11bHRpLFxuICBkZWZpbmVEdXJhYmxlS2luZCxcbiAgZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSxcbn0gPSBWYXREYXRhR2xvYmFsOyRozY9fb25jZS5kZWZpbmVLaW5kKGRlZmluZUtpbmQpOyRozY9fb25jZS5kZWZpbmVLaW5kTXVsdGkoZGVmaW5lS2luZE11bHRpKTskaM2PX29uY2UuZGVmaW5lRHVyYWJsZUtpbmQoZGVmaW5lRHVyYWJsZUtpbmQpOyRozY9fb25jZS5kZWZpbmVEdXJhYmxlS2luZE11bHRpKGRlZmluZUR1cmFibGVLaW5kTXVsdGkpO1xuXG4gICAgICAgY29uc3Qge1xuICBtYWtlS2luZEhhbmRsZSxcbiAgcHJvdmlkZVByb21pc2VXYXRjaGVyLFxuICB3YXRjaFByb21pc2UsXG4gIG1ha2VTY2FsYXJCaWdNYXBTdG9yZSxcbiAgbWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSxcbiAgbWFrZVNjYWxhckJpZ1NldFN0b3JlLFxuICBtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlLFxuICBjYW5CZUR1cmFibGUsXG59ID0gVmF0RGF0YUdsb2JhbDtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLm1ha2VLaW5kSGFuZGxlKG1ha2VLaW5kSGFuZGxlKTskaM2PX29uY2UucHJvdmlkZVByb21pc2VXYXRjaGVyKHByb3ZpZGVQcm9taXNlV2F0Y2hlcik7JGjNj19vbmNlLndhdGNoUHJvbWlzZSh3YXRjaFByb21pc2UpOyRozY9fb25jZS5tYWtlU2NhbGFyQmlnTWFwU3RvcmUobWFrZVNjYWxhckJpZ01hcFN0b3JlKTskaM2PX29uY2UubWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZShtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlKTskaM2PX29uY2UubWFrZVNjYWxhckJpZ1NldFN0b3JlKG1ha2VTY2FsYXJCaWdTZXRTdG9yZSk7JGjNj19vbmNlLm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUobWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSk7JGjNj19vbmNlLmNhbkJlRHVyYWJsZShjYW5CZUR1cmFibGUpO1xuICAgICAgIGNvbnN0IHBpY2tGYWNldCA9XG4gIChtYWtlciwgZmFjZXROYW1lKSA9PlxuICAoLi4uYXJncykgPT5cbiAgICBtYWtlciguLi5hcmdzKVtmYWNldE5hbWVdOyRozY9fb25jZS5waWNrRmFjZXQocGlja0ZhY2V0KTtcbmhhcmRlbihwaWNrRmFjZXQpO1xuXG4vKlxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcGFydGlhbEFzc2lnbiA9ICh0YXJnZXQsIHNvdXJjZSkgPT4ge1xuICBPYmplY3QuYXNzaWduKHRhcmdldCwgc291cmNlKTtcbn07JGjNj19vbmNlLnBhcnRpYWxBc3NpZ24ocGFydGlhbEFzc2lnbik7XG5oYXJkZW4ocGFydGlhbEFzc2lnbik7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4gICAgICAgY29uc3QgcHJvdmlkZSA9XG4gIC8vXG4gIC8qXG5cblxuXG5cblxuICAgKi8gKHByb3ZpZGVMYXp5KTtcblxuLy9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UucHJvdmlkZShwcm92aWRlKTtcbiAgICAgICBjb25zdCBtYWtlU3RvcmVVdGlscyA9IFZhdERhdGEgPT4ge1xuICBjb25zdCB7XG4gICAgLy9cbiAgICBtYWtlU2NhbGFyQmlnTWFwU3RvcmUsXG4gICAgLy9cbiAgICBtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlLFxuICAgIC8vXG4gICAgbWFrZVNjYWxhckJpZ1NldFN0b3JlLFxuICAgIC8vXG4gICAgbWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSxcbiAgfSA9IFZhdERhdGE7XG5cbiAgLypcblxuXG5cbiAgICovXG4gIGNvbnN0IHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUgPSAoYmFnZ2FnZSwgbmFtZSwgb3B0aW9ucyA9IHt9KSA9PlxuICAgIHByb3ZpZGUoYmFnZ2FnZSwgbmFtZSwgKCkgPT5cbiAgICAgIG1ha2VTY2FsYXJCaWdNYXBTdG9yZShuYW1lLCB7IGR1cmFibGU6IHRydWUsIC4uLm9wdGlvbnMgfSksXG4gICAgKTtcbiAgaGFyZGVuKHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUpO1xuXG4gIC8qXG5cblxuXG4gICAqL1xuICBjb25zdCBwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSA9IChiYWdnYWdlLCBuYW1lLCBvcHRpb25zID0ge30pID0+XG4gICAgcHJvdmlkZShiYWdnYWdlLCBuYW1lLCAoKSA9PlxuICAgICAgbWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZShuYW1lLCB7IGR1cmFibGU6IHRydWUsIC4uLm9wdGlvbnMgfSksXG4gICAgKTtcbiAgaGFyZGVuKHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKTtcblxuICAvKlxuXG5cblxuICAgKi9cbiAgY29uc3QgcHJvdmlkZUR1cmFibGVTZXRTdG9yZSA9IChiYWdnYWdlLCBuYW1lLCBvcHRpb25zID0ge30pID0+XG4gICAgcHJvdmlkZShiYWdnYWdlLCBuYW1lLCAoKSA9PlxuICAgICAgbWFrZVNjYWxhckJpZ1NldFN0b3JlKG5hbWUsIHsgZHVyYWJsZTogdHJ1ZSwgLi4ub3B0aW9ucyB9KSxcbiAgICApO1xuICBoYXJkZW4ocHJvdmlkZUR1cmFibGVTZXRTdG9yZSk7XG5cbiAgLypcblxuXG5cbiAgICovXG4gIGNvbnN0IHByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlID0gKGJhZ2dhZ2UsIG5hbWUsIG9wdGlvbnMgPSB7fSkgPT5cbiAgICBwcm92aWRlKGJhZ2dhZ2UsIG5hbWUsICgpID0+XG4gICAgICBtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlKG5hbWUsIHsgZHVyYWJsZTogdHJ1ZSwgLi4ub3B0aW9ucyB9KSxcbiAgICApO1xuICBoYXJkZW4ocHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUpO1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUsXG4gICAgcHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUsXG4gICAgcHJvdmlkZUR1cmFibGVTZXRTdG9yZSxcbiAgICBwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlU3RvcmVVdGlscyhtYWtlU3RvcmVVdGlscyk7XG5cbmNvbnN0IGdsb2JhbFN0b3JlVXRpbHMgPSBtYWtlU3RvcmVVdGlscyhWYXREYXRhR2xvYmFsKTtcbiAgICAgICBjb25zdCB7XG4gIHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUsXG4gIHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlLFxuICBwcm92aWRlRHVyYWJsZVNldFN0b3JlLFxuICBwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSxcbn0gPSBnbG9iYWxTdG9yZVV0aWxzOyRozY9fb25jZS5wcm92aWRlRHVyYWJsZU1hcFN0b3JlKHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUpOyRozY9fb25jZS5wcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZShwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSk7JGjNj19vbmNlLnByb3ZpZGVEdXJhYmxlU2V0U3RvcmUocHJvdmlkZUR1cmFibGVTZXRTdG9yZSk7JGjNj19vbmNlLnByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlKHByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlZhdERhdGEiOlsiVmF0RGF0YUV4cG9ydCJdLCJkZWZpbmVLaW5kIjpbImRlZmluZUtpbmQiXSwiZGVmaW5lS2luZE11bHRpIjpbImRlZmluZUtpbmRNdWx0aSJdLCJkZWZpbmVEdXJhYmxlS2luZCI6WyJkZWZpbmVEdXJhYmxlS2luZCJdLCJkZWZpbmVEdXJhYmxlS2luZE11bHRpIjpbImRlZmluZUR1cmFibGVLaW5kTXVsdGkiXSwibWFrZUtpbmRIYW5kbGUiOlsibWFrZUtpbmRIYW5kbGUiXSwicHJvdmlkZVByb21pc2VXYXRjaGVyIjpbInByb3ZpZGVQcm9taXNlV2F0Y2hlciJdLCJ3YXRjaFByb21pc2UiOlsid2F0Y2hQcm9taXNlIl0sIm1ha2VTY2FsYXJCaWdNYXBTdG9yZSI6WyJtYWtlU2NhbGFyQmlnTWFwU3RvcmUiXSwibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSI6WyJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlIl0sIm1ha2VTY2FsYXJCaWdTZXRTdG9yZSI6WyJtYWtlU2NhbGFyQmlnU2V0U3RvcmUiXSwibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSI6WyJtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlIl0sImNhbkJlRHVyYWJsZSI6WyJjYW5CZUR1cmFibGUiXSwicGlja0ZhY2V0IjpbInBpY2tGYWNldCJdLCJwYXJ0aWFsQXNzaWduIjpbInBhcnRpYWxBc3NpZ24iXSwicHJvdmlkZSI6WyJwcm92aWRlIl0sIm1ha2VTdG9yZVV0aWxzIjpbIm1ha2VTdG9yZVV0aWxzIl0sInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiOlsicHJvdmlkZUR1cmFibGVNYXBTdG9yZSJdLCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSI6WyJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSJdLCJwcm92aWRlRHVyYWJsZVNldFN0b3JlIjpbInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiXSwicHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUiOlsicHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAJFJo4wMVAAADFQAAJQAAAEBhZ29yaWMvdmF0cy12MC4xNi4wLXUyMS4wL3NyYy9jcmMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkNSQyIsImNyYzEiLCJjcmMxMCIsImNyYzE2IiwiY3JjMjQiLCJjcmMzMiIsImNyYzMyYyIsImNyYzYiLCJjcmM4IiwibW9kZWxzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qXG5cblxuXG5cblxuXG4gKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuY29uc3QgZW5jb2RlciA9IG5ldyBUZXh0RW5jb2RlcigpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICovXG5mdW5jdGlvbiBjb252ZXJ0KGRhdGEpIHtcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnbnVtYmVyJykge1xuICAgIGNvbnN0IGJ5dGVzID0gW107XG4gICAgLy9cbiAgICAvL1xuICAgIHdoaWxlIChkYXRhID4gMCB8fCBieXRlcy5sZW5ndGggPCA0KSB7XG4gICAgICBieXRlcy51bnNoaWZ0KGRhdGEgJSAyNTYpO1xuICAgICAgZGF0YSA9IE1hdGguZmxvb3IoZGF0YSAvIDI1Nik7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVWludDhBcnJheShieXRlcyk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIGVuY29kZXIuZW5jb2RlKGRhdGEpO1xuICB9IGVsc2UgaWYgKEFycmF5QnVmZmVyLmlzVmlldyhkYXRhKSkge1xuICAgIHJldHVybiBuZXcgVWludDhBcnJheShkYXRhLmJ1ZmZlciwgZGF0YS5ieXRlT2Zmc2V0LCBkYXRhLmJ5dGVMZW5ndGgpO1xuICB9IGVsc2UgaWYgKGRhdGEgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgIHJldHVybiBuZXcgVWludDhBcnJheShkYXRhKTtcbiAgfVxuICB0aHJvdyBUeXBlRXJyb3IoXG4gICAgYGNyYyByZXF1aXJlcyAzMiBiaXQgbnVtYmVyLCBhIHN0cmluZyBvciBUeXBlZEFycmF5IGZvciBpbnB1dGAsXG4gICk7XG59XG5cbi8qXG5cblxuICovXG5mdW5jdGlvbiBtaXJyb3IoZGF0YSwgd2lkdGgpIHtcbiAgbGV0IHJlcyA9IDA7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgd2lkdGg7IGkgKz0gMSkge1xuICAgIHJlcyA9IChyZXMgPDwgMSkgfCAoZGF0YSAmIDEpO1xuICAgIGRhdGEgPj49IDE7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxuICAgICAgIGNsYXNzIENSQyB7XG4gIC8qXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3RydWN0b3Iod2lkdGgsIHBvbHksIHhvckluLCB4b3JPdXQsIHJlZmxlY3QpIHtcbiAgICB0aGlzLndpZHRoID0gd2lkdGg7XG4gICAgdGhpcy5wb2x5ID0gcG9seTtcbiAgICB0aGlzLnhvckluID0geG9ySW47XG4gICAgdGhpcy5yZWZsZWN0ZWRYb3JJbiA9IG1pcnJvcih4b3JJbiwgd2lkdGgpO1xuICAgIHRoaXMueG9yT3V0ID0geG9yT3V0O1xuICAgIHRoaXMucmVmbGVjdCA9IHJlZmxlY3Q7XG4gICAgdGhpcy5tc2JNYXNrID0gMSA8PCAodGhpcy53aWR0aCAtIDEpO1xuICAgIHRoaXMubWFzayA9ICgodGhpcy5tc2JNYXNrIC0gMSkgPDwgMSkgfCAxO1xuICAgIHRoaXMuY3JjU2hpZnQgPSB0aGlzLndpZHRoIDwgOCA/IDggLSB0aGlzLndpZHRoIDogMDtcbiAgICB0aGlzLnNoaWZ0ZWRYb3JJbiA9IHRoaXMueG9ySW4gPDwgdGhpcy5jcmNTaGlmdDtcblxuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5nZW5UYWJsZSgpO1xuICAgIHRoaXMudGFibGUgPSB0YWJsZTtcblxuICAgIGlmICh0aGlzLndpZHRoID09PSA4ICYmICF0aGlzLnhvckluICYmICF0aGlzLnhvck91dCAmJiAhdGhpcy5yZWZsZWN0KSB7XG4gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICB0aGlzLmNhbGN1bGF0ZSA9IGZ1bmN0aW9uIGNhbGN1bGF0ZShkYXRhKSB7XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IGNvbnZlcnQoZGF0YSk7XG4gICAgICAgIGxldCBjcmMgPSAwO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJ1ZmZlci5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgIGNyYyA9IHRhYmxlW2NyYyBeIGJ1ZmZlcltpXV07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNyYztcbiAgICAgIH07XG4gICAgfVxuICB9XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAqL1xuICBjYWxjdWxhdGUoZGF0YSkge1xuICAgIGNvbnN0IGJ1ZmZlciA9IGNvbnZlcnQoZGF0YSk7XG4gICAgbGV0IGNyYztcbiAgICBjb25zdCB7IHRhYmxlLCB3aWR0aCwgY3JjU2hpZnQsIG1hc2sgfSA9IHRoaXM7XG4gICAgaWYgKHRoaXMucmVmbGVjdCkge1xuICAgICAgY3JjID0gdGhpcy5yZWZsZWN0ZWRYb3JJbjtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmZmVyLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGNvbnN0IGJ5dGUgPSBidWZmZXJbaV07XG4gICAgICAgIGNyYyA9ICh0YWJsZVsoY3JjIF4gYnl0ZSkgJiAweGZmXSBeIChjcmMgPj4+IDgpKSAmIG1hc2s7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNyYyA9IHRoaXMuc2hpZnRlZFhvckluO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBidWZmZXIubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgY3JjID1cbiAgICAgICAgICAodGFibGVbKChjcmMgPj4gKHdpZHRoIC0gOCArIGNyY1NoaWZ0KSkgXiBidWZmZXJbaV0pICYgMHhmZl0gPDxcbiAgICAgICAgICAgIGNyY1NoaWZ0KSBeXG4gICAgICAgICAgKChjcmMgPDwgKDggLSBjcmNTaGlmdCkpICYgKG1hc2sgPDwgY3JjU2hpZnQpKTtcbiAgICAgIH1cbiAgICAgIGNyYyA+Pj0gY3JjU2hpZnQ7XG4gICAgfVxuICAgIGNyYyBePSB0aGlzLnhvck91dDtcbiAgICByZXR1cm4gY3JjID4+PiAwO1xuICB9XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAqL1xuICBjYWxjdWxhdGVOb1RhYmxlKGRhdGEpIHtcbiAgICBjb25zdCBidWZmZXIgPSBjb252ZXJ0KGRhdGEpO1xuICAgIGxldCBjcmMgPSB0aGlzLnhvckluO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYnVmZmVyLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICBsZXQgb2N0ZXQgPSBidWZmZXJbaV07XG4gICAgICBpZiAodGhpcy5yZWZsZWN0KSBvY3RldCA9IG1pcnJvcihvY3RldCwgOCk7XG4gICAgICBmb3IgKGxldCBqID0gMDsgaiA8IDg7IGogKz0gMSkge1xuICAgICAgICBsZXQgdG9wYml0ID0gY3JjICYgdGhpcy5tc2JNYXNrO1xuICAgICAgICBpZiAob2N0ZXQgJiAoMHg4MCA+PiBqKSkgdG9wYml0IF49IHRoaXMubXNiTWFzaztcbiAgICAgICAgY3JjIDw8PSAxO1xuICAgICAgICBpZiAodG9wYml0KSBjcmMgXj0gdGhpcy5wb2x5O1xuICAgICAgfVxuICAgICAgY3JjICY9IHRoaXMubWFzaztcbiAgICB9XG4gICAgaWYgKHRoaXMucmVmbGVjdCkgY3JjID0gbWlycm9yKGNyYywgdGhpcy53aWR0aCk7XG4gICAgY3JjIF49IHRoaXMueG9yT3V0O1xuICAgIHJldHVybiBjcmMgPj4+IDA7XG4gIH1cblxuICBnZW5UYWJsZSgpIHtcbiAgICBjb25zdCB0YWJsZUxlbmd0aCA9IDI1NjtcbiAgICBjb25zdCB0YWJsZSA9IFtdO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFibGVMZW5ndGg7IGkgKz0gMSkge1xuICAgICAgbGV0IHJlZyA9IGk7XG4gICAgICBpZiAodGhpcy5yZWZsZWN0KSByZWcgPSBtaXJyb3IocmVnLCA4KTtcbiAgICAgIHJlZyA8PD0gdGhpcy53aWR0aCAtIDggKyB0aGlzLmNyY1NoaWZ0O1xuICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCA4OyBqICs9IDEpIHtcbiAgICAgICAgaWYgKChyZWcgJiAodGhpcy5tc2JNYXNrIDw8IHRoaXMuY3JjU2hpZnQpKSAhPT0gMCkge1xuICAgICAgICAgIHJlZyA8PD0gMTtcbiAgICAgICAgICByZWcgXj0gdGhpcy5wb2x5IDw8IHRoaXMuY3JjU2hpZnQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVnIDw8PSAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5yZWZsZWN0KVxuICAgICAgICByZWcgPSBtaXJyb3IocmVnID4+IHRoaXMuY3JjU2hpZnQsIHRoaXMud2lkdGgpIDw8IHRoaXMuY3JjU2hpZnQ7XG4gICAgICByZWcgPSAocmVnID4+IHRoaXMuY3JjU2hpZnQpICYgdGhpcy5tYXNrO1xuICAgICAgdGFibGVbaV0gPSByZWcgPj4+IDA7XG4gICAgfVxuICAgIHJldHVybiBuZXcgSW50MzJBcnJheSh0YWJsZSk7XG4gIH1cbn0kaM2PX29uY2UuICAgQ1JDKENSQyk7XG5cbiAgICAgICBjb25zdCBjcmMxID0gbmV3IENSQygxLCAweDAxLCAweDAwLCAweDAwLCBmYWxzZSk7JGjNj19vbmNlLmNyYzEoY3JjMSk7XG4gICAgICAgY29uc3QgY3JjNiA9IG5ldyBDUkMoNiwgMHgyZiwgMHgwMCwgMHgwMCwgZmFsc2UpOyRozY9fb25jZS5jcmM2KGNyYzYpO1xuICAgICAgIGNvbnN0IGNyYzggPSBuZXcgQ1JDKDgsIDB4MDcsIDB4MDAsIDB4MDAsIGZhbHNlKTskaM2PX29uY2UuY3JjOChjcmM4KTtcbiAgICAgICBjb25zdCBjcmMxMCA9IG5ldyBDUkMoMTAsIDB4MjMzLCAweDAwMDAsIDB4MDAwMCwgZmFsc2UpOyRozY9fb25jZS5jcmMxMChjcmMxMCk7XG4gICAgICAgY29uc3QgY3JjMTYgPSBuZXcgQ1JDKDE2LCAweDgwMDUsIDB4MDAwMCwgMHgwMDAwLCB0cnVlKTskaM2PX29uY2UuY3JjMTYoY3JjMTYpO1xuICAgICAgIGNvbnN0IGNyYzI0ID0gbmV3IENSQygyNCwgMHg4NjRjZmIsIDB4YjcwNGNlLCAweDAwMDAwMCwgZmFsc2UpOyRozY9fb25jZS5jcmMyNChjcmMyNCk7XG4gICAgICAgY29uc3QgY3JjMzIgPSBuZXcgQ1JDKDMyLCAweDA0YzExZGI3LCAweGZmZmZmZmZmLCAweGZmZmZmZmZmLCB0cnVlKTskaM2PX29uY2UuY3JjMzIoY3JjMzIpO1xuICAgICAgIGNvbnN0IGNyYzMyYyA9IG5ldyBDUkMoMzIsIDB4MWVkYzZmNDEsIDB4ZmZmZmZmZmYsIDB4ZmZmZmZmZmYsIHRydWUpOyRozY9fb25jZS5jcmMzMmMoY3JjMzJjKTtcblxuICAgICAgIGNvbnN0IG1vZGVscyA9IHsgY3JjMSwgY3JjNiwgY3JjOCwgY3JjMTAsIGNyYzE2LCBjcmMyNCwgY3JjMzIsIGNyYzMyYyB9OyRozY9fb25jZS5tb2RlbHMobW9kZWxzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkNSQyI6WyJDUkMiXSwiY3JjMSI6WyJjcmMxIl0sImNyYzYiOlsiY3JjNiJdLCJjcmM4IjpbImNyYzgiXSwiY3JjMTAiOlsiY3JjMTAiXSwiY3JjMTYiOlsiY3JjMTYiXSwiY3JjMjQiOlsiY3JjMjQiXSwiY3JjMzIiOlsiY3JjMzIiXSwiY3JjMzJjIjpbImNyYzMyYyJdLCJtb2RlbHMiOlsibW9kZWxzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANGYmZuAJgAAgCYAACsAAABAYWdvcmljL3ZhdHMtdjAuMTYuMC11MjEuMC9zcmMvbGliLWJvYXJkLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBhZ29yaWMvbm90aWZpZXIiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9yZWNvcmRlci5qcyIsIkBlbmRvL2ZhciIsIkBlbmRvL21hcnNoYWwiLCJAYWdvcmljL2ludGVybmFsL3NyYy9tYXJzaGFsLmpzIiwiLi9jcmMuanMiXSwiZXhwb3J0cyI6WyJERUZBVUxUX0NSQ19ESUdJVFMiLCJERUZBVUxUX1BSRUZJWCIsInByZXBhcmVCb2FyZEtpdCIsInByZXBhcmVSZWNvcmRlckZhY3RvcnkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnQsRmFpbCxxLHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCxNLG1ha2VTY2FsYXJCaWdNYXBTdG9yZSxwcmVwYXJlRXhvQ2xhc3NLaXQsZGVmaW5lUmVjb3JkZXJLaXQscHJlcGFyZVJlY29yZGVyLEUsRmFyLGlzUmVtb3RhYmxlLG1ha2VNYXJzaGFsLENhcERhdGFTaGFwZSxjcmM2OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJhc3NlcnRcIixbJGjNj19hID0+IChhc3NlcnQgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL25vdGlmaWVyXCIsIFtbXCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXRcIixbJGjNj19hID0+IChwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJtYWtlU2NhbGFyQmlnTWFwU3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyQmlnTWFwU3RvcmUgPSAkaM2PX2EpXV0sW1wicHJlcGFyZUV4b0NsYXNzS2l0XCIsWyRozY9fYSA9PiAocHJlcGFyZUV4b0NsYXNzS2l0ID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9yZWNvcmRlci5qc1wiLCBbW1wiZGVmaW5lUmVjb3JkZXJLaXRcIixbJGjNj19hID0+IChkZWZpbmVSZWNvcmRlcktpdCA9ICRozY9fYSldXSxbXCJwcmVwYXJlUmVjb3JkZXJcIixbJGjNj19hID0+IChwcmVwYXJlUmVjb3JkZXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImlzUmVtb3RhYmxlXCIsWyRozY9fYSA9PiAoaXNSZW1vdGFibGUgPSAkaM2PX2EpXV0sW1wibWFrZU1hcnNoYWxcIixbJGjNj19hID0+IChtYWtlTWFyc2hhbCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWwvc3JjL21hcnNoYWwuanNcIiwgW1tcIkNhcERhdGFTaGFwZVwiLFskaM2PX2EgPT4gKENhcERhdGFTaGFwZSA9ICRozY9fYSldXV1dLFtcIi4vY3JjLmpzXCIsIFtbXCJjcmM2XCIsWyRozY9fYSA9PiAoY3JjNiA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLypcblxuXG4gKi9cblxuICAgICAgIGNvbnN0IERFRkFVTFRfQ1JDX0RJR0lUUyA9IDI7JGjNj19vbmNlLkRFRkFVTFRfQ1JDX0RJR0lUUyhERUZBVUxUX0NSQ19ESUdJVFMpO1xuICAgICAgIGNvbnN0IERFRkFVTFRfUFJFRklYID0gJ2JvYXJkMCc7XG5cbi8vXG4kaM2PX29uY2UuREVGQVVMVF9QUkVGSVgoREVGQVVMVF9QUkVGSVgpO2NvbnN0IE1hcnNoYWxJPU0uaW50ZXJmYWNlKCdNYXJzaGFsbGVyJyx7XG4gIHRvQ2FwRGF0YTogTS5jYWxsKE0uYW55KCkpLnJldHVybnMoQ2FwRGF0YVNoYXBlKSxcbiAgc2VyaWFsaXplOiBNLmNhbGwoTS5hbnkoKSkucmV0dXJucyhDYXBEYXRhU2hhcGUpLFxuICBmcm9tQ2FwRGF0YTogTS5jYWxsKENhcERhdGFTaGFwZSkucmV0dXJucyhNLmFueSgpKSxcbiAgdW5zZXJpYWxpemU6IE0uY2FsbChDYXBEYXRhU2hhcGUpLnJldHVybnMoTS5hbnkoKSksXG59KTtcblxuY29uc3QgSWRTaGFwZSA9IE0uc3RyaW5nKCk7XG5jb25zdCBWYWxTaGFwZSA9IE0uc2NhbGFyKCk7XG5jb25zdCBCb2FyZEtpdElLaXQgPSB7XG4gIGJvYXJkOiBNLmludGVyZmFjZSgnQm9hcmQnLCB7XG4gICAgaGFzOiBNLmNhbGwoVmFsU2hhcGUpLnJldHVybnMoTS5ib29sZWFuKCkpLFxuICAgIGdldFZhbHVlOiBNLmNhbGwoSWRTaGFwZSkucmV0dXJucyhWYWxTaGFwZSksXG4gICAgbG9va3VwOiBNLmNhbGwoKS5yZXN0KE0uYXJyYXlPZihJZFNoYXBlKSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgZ2V0SWQ6IE0uY2FsbChWYWxTaGFwZSkucmV0dXJucyhJZFNoYXBlKSxcbiAgICBpZHM6IE0uY2FsbCgpLnJldHVybnMoTS5hcnJheU9mKElkU2hhcGUpKSxcbiAgICBnZXRQdWJsaXNoaW5nTWFyc2hhbGxlcjogTS5jYWxsKCkucmV0dXJucyhNLnJlbW90YWJsZSgpKSxcbiAgICBnZXRSZWFkb25seU1hcnNoYWxsZXI6IE0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoKSksXG4gIH0pLFxuICBwdWJsaXNoaW5nTWFyc2hhbGxlcjogTWFyc2hhbEksXG4gIHJlYWRvbmx5TWFyc2hhbGxlcjogTWFyc2hhbEksXG59O1xuLy9cblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGNhbGNDcmMgPSAoZGF0YSwgY3JjRGlnaXRzKSA9PiB7XG4gIC8vXG4gIC8vXG4gIGNvbnN0IGNyYyA9IGNyYzYuY2FsY3VsYXRlKGRhdGEpICsgMTtcbiAgY29uc3QgY3JjU3RyID0gY3JjLnRvU3RyaW5nKCkucGFkU3RhcnQoY3JjRGlnaXRzLCAnMCcpO1xuICBhc3NlcnQoY3JjU3RyLmxlbmd0aCA8PSBjcmNEaWdpdHMsIGBDUkMgdG9vIGJpZyBmb3IgaXRzIGJyaXRjaGVzICR7Y3JjU3RyfWApO1xuICByZXR1cm4gY3JjU3RyO1xufTtcblxuLypcblxuXG4gKi9cblxuLy9cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgaW5pdER1cmFibGVCb2FyZFN0YXRlID0gKFxuICBpbml0U2VxdWVuY2UgPSAwLFxuICB7IHByZWZpeCA9IERFRkFVTFRfUFJFRklYLCBjcmNEaWdpdHMgPSBERUZBVUxUX0NSQ19ESUdJVFMgfSA9IHt9LFxuKSA9PiB7XG4gIGNvbnN0IGltbXV0YWJsZSA9IHsgcHJlZml4LCBjcmNEaWdpdHMgfTtcblxuICBjb25zdCBsYXN0U2VxdWVuY2UgPSBCaWdJbnQoaW5pdFNlcXVlbmNlKTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBpZFRvVmFsID0gbWFrZVNjYWxhckJpZ01hcFN0b3JlKCdpZFRvVmFsJywge1xuICAgIGR1cmFibGU6IHRydWUsXG4gICAga2V5U2hhcGU6IElkU2hhcGUsXG4gICAgdmFsdWVTaGFwZTogVmFsU2hhcGUsXG4gIH0pO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHZhbFRvSWQgPSBtYWtlU2NhbGFyQmlnTWFwU3RvcmUoJ3ZhbFRvSWQnLCB7XG4gICAgZHVyYWJsZTogdHJ1ZSxcbiAgICBrZXlTaGFwZTogVmFsU2hhcGUsXG4gICAgdmFsdWVTaGFwZTogSWRTaGFwZSxcbiAgfSk7XG5cbiAgY29uc3QgbXV0YWJsZSA9IHsgbGFzdFNlcXVlbmNlLCBpZFRvVmFsLCB2YWxUb0lkIH07XG5cbiAgcmV0dXJuIHtcbiAgICAuLi5pbW11dGFibGUsXG4gICAgLi4ubXV0YWJsZSxcbiAgfTtcbn07XG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgZ2V0SWQgPSAodmFsdWUsIHN0YXRlKSA9PiB7XG4gIGNvbnN0IHsgaWRUb1ZhbCwgdmFsVG9JZCwgcHJlZml4LCBjcmNEaWdpdHMgfSA9IHN0YXRlO1xuICBpZiAoIWlzUmVtb3RhYmxlKHZhbHVlKSkge1xuICAgIEZhaWxgQm9hcmQgY2Fubm90IGNyZWF0ZSBpZCBmb3Igbm9uLXJlbW90YWJsZWA7XG4gIH1cblxuICBpZiAodmFsVG9JZC5oYXModmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbFRvSWQuZ2V0KHZhbHVlKTtcbiAgfVxuXG4gIHN0YXRlLmxhc3RTZXF1ZW5jZSArPSAxbjtcbiAgY29uc3Qgc2VxID0gc3RhdGUubGFzdFNlcXVlbmNlO1xuXG4gIGNvbnN0IGNyY0lucHV0ID0gYCR7cHJlZml4fSR7c2VxfWA7XG4gIGNvbnN0IGNyYyA9IGNhbGNDcmMoY3JjSW5wdXQsIGNyY0RpZ2l0cyk7XG5cbiAgY29uc3QgaWQgPSBgJHtwcmVmaXh9JHtjcmN9JHtzZXF9YDtcblxuICB2YWxUb0lkLmluaXQodmFsdWUsIGlkKTtcbiAgaWRUb1ZhbC5pbml0KGlkLCB2YWx1ZSk7XG4gIHJldHVybiBpZDtcbn07XG5cbi8qXG5cblxuICovXG5jb25zdCBnZXRWYWx1ZSA9IChpZCwgeyBwcmVmaXgsIGNyY0RpZ2l0cywgaWRUb1ZhbCB9KSA9PiB7XG4gIGlkLnN0YXJ0c1dpdGgocHJlZml4KSB8fCBGYWlsYGlkIG11c3Qgc3RhcnQgd2l0aCAke3EocHJlZml4KX06ICR7aWR9YDtcbiAgY29uc3QgZGlnaXRzID0gaWQuc2xpY2UocHJlZml4Lmxlbmd0aCk7XG4gIC8vXG4gIGNvbnN0IERJR0lUU19SRUdFWFAgPSBuZXcgUmVnRXhwKGBeWzAtOV17JHtjcmNEaWdpdHMgKyAxfSx9JGApO1xuICBESUdJVFNfUkVHRVhQLnRlc3QoZGlnaXRzKSB8fFxuICAgIEZhaWxgaWQgbXVzdCBlbmQgaW4gYXQgbGVhc3QgJHtxKGNyY0RpZ2l0cyArIDEpfSBkaWdpdHM6ICR7aWR9YDtcblxuICBpZiAoaWRUb1ZhbC5oYXMoaWQpKSB7XG4gICAgcmV0dXJuIGlkVG9WYWwuZ2V0KGlkKTtcbiAgfVxuXG4gIGNvbnN0IGFsbGVnZWRDcmMgPSBkaWdpdHMuc2xpY2UoMCwgY3JjRGlnaXRzKTtcblxuICBjb25zdCBzZXEgPSBkaWdpdHMuc2xpY2UoY3JjRGlnaXRzKTtcbiAgY29uc3QgY3JjSW5wdXQgPSBgJHtwcmVmaXh9JHtzZXF9YDtcbiAgY29uc3QgY3JjID0gY2FsY0NyYyhjcmNJbnB1dCwgY3JjRGlnaXRzKTtcblxuICBhbGxlZ2VkQ3JjID09PSBjcmMgfHwgRmFpbGBpZCBpcyBwcm9iYWJseSBhIHR5cG8sIGNhbm5vdCB2ZXJpZnkgQ1JDOiAke2lkfWA7XG4gIC8vXG4gIHRocm93IEZhaWxgYm9hcmQgZG9lcyBub3QgaGF2ZSBpZDogJHtpZH1gO1xufTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IG1ha2VTbG90VG9WYWwgPSBzdGF0ZSA9PiB7XG4gIGNvbnN0IGlmYWNlQWxsZWdlZFByZWZpeCA9ICdBbGxlZ2VkOiAnO1xuICBjb25zdCBpZmFjZUluYWNjZXNzaWJsZVByZWZpeCA9ICdTRVZFUkVEOiAnO1xuXG4gIC8qXG5cblxuXG4gICAqL1xuICBjb25zdCBzbG90VG9WYWwgPSAoc2xvdCwgaWZhY2UpID0+IHtcbiAgICBpZiAoc2xvdCAhPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIGdldFZhbHVlKHNsb3QsIHN0YXRlKTtcbiAgICB9XG5cbiAgICAvL1xuICAgIGlmICh0eXBlb2YgaWZhY2UgPT09ICdzdHJpbmcnICYmIGlmYWNlLnN0YXJ0c1dpdGgoaWZhY2VBbGxlZ2VkUHJlZml4KSkge1xuICAgICAgaWZhY2UgPSBpZmFjZS5zbGljZShpZmFjZUFsbGVnZWRQcmVmaXgubGVuZ3RoKTtcbiAgICB9XG4gICAgcmV0dXJuIEZhcihgJHtpZmFjZUluYWNjZXNzaWJsZVByZWZpeH0ke2lmYWNlfWAsIHt9KTtcbiAgfTtcbiAgcmV0dXJuIHNsb3RUb1ZhbDtcbn07XG5cbi8vXG4vKlxuXG5cbiAqL1xuY29uc3QgbWFrZVJlYWRvbmx5TWFyc2hhbGxlciA9IHN0YXRlID0+IHtcbiAgY29uc3QgeyB2YWxUb0lkIH0gPSBzdGF0ZTtcbiAgY29uc3Qgc2xvdFRvVmFsID0gbWFrZVNsb3RUb1ZhbChzdGF0ZSk7XG4gIGNvbnN0IHZhbFRvU2xvdCA9IHZhbCA9PiB7XG4gICAgaWYgKCF2YWxUb0lkLmhhcyh2YWwpKSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy9cbiAgICByZXR1cm4gdmFsVG9JZC5nZXQodmFsKTtcbiAgfTtcbiAgcmV0dXJuIG1ha2VNYXJzaGFsKHZhbFRvU2xvdCwgc2xvdFRvVmFsLCB7XG4gICAgc2VyaWFsaXplQm9keUZvcm1hdDogJ3NtYWxsY2FwcycsXG4gIH0pO1xufTtcblxuLypcblxuXG4gKi9cbmNvbnN0IG1ha2VQdWJsaXNoaW5nTWFyc2hhbGxlciA9IHN0YXRlID0+IHtcbiAgY29uc3Qgc2xvdFRvVmFsID0gbWFrZVNsb3RUb1ZhbChzdGF0ZSk7XG4gIC8vXG4gIGNvbnN0IHZhbFRvU2xvdCA9IHZhbCA9PiBnZXRJZCh2YWwsIHN0YXRlKTtcbiAgcmV0dXJuIG1ha2VNYXJzaGFsKHZhbFRvU2xvdCwgc2xvdFRvVmFsLCB7XG4gICAgc2VyaWFsaXplQm9keUZvcm1hdDogJ3NtYWxsY2FwcycsXG4gIH0pO1xufTtcbi8vXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBwcmVwYXJlQm9hcmRLaXQgPSBiYWdnYWdlID0+IHtcbiAgcmV0dXJuIHByZXBhcmVFeG9DbGFzc0tpdChcbiAgICBiYWdnYWdlLFxuICAgICdCb2FyZCcsXG4gICAgQm9hcmRLaXRJS2l0LFxuICAgIGluaXREdXJhYmxlQm9hcmRTdGF0ZSxcbiAgICB7XG4gICAgICBib2FyZDoge1xuICAgICAgICAvKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICAgICAgICovXG4gICAgICAgIGdldElkKHZhbHVlKSB7XG4gICAgICAgICAgcmV0dXJuIGdldElkKHZhbHVlLCB0aGlzLnN0YXRlKTtcbiAgICAgICAgfSxcbiAgICAgICAgLypcblxuXG4gICAgICAgICAqL1xuICAgICAgICBnZXRWYWx1ZShpZCkge1xuICAgICAgICAgIHJldHVybiBnZXRWYWx1ZShpZCwgdGhpcy5zdGF0ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIC8qXG5cblxuXG5cblxuXG5cblxuICAgICAgICAgKi9cbiAgICAgICAgYXN5bmMgbG9va3VwKC4uLnBhdGgpIHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBmYWNldHM6IHsgYm9hcmQgfSxcbiAgICAgICAgICB9ID0gdGhpcztcbiAgICAgICAgICBpZiAocGF0aC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBib2FyZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY29uc3QgW2ZpcnN0LCAuLi5yZXN0XSA9IHBhdGg7XG4gICAgICAgICAgLyogICAgICAgICAgICAgICovXG4gICAgICAgICAgY29uc3QgZmlyc3RWYWx1ZSA9IGJvYXJkLmdldFZhbHVlKC8qICAgICAgICAgICAgICAgICAgKi8gKGZpcnN0KSk7XG4gICAgICAgICAgaWYgKHJlc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gZmlyc3RWYWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIEUoZmlyc3RWYWx1ZSkubG9va3VwKC4uLnJlc3QpO1xuICAgICAgICB9LFxuICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICBoYXModmFsKSB7XG4gICAgICAgICAgY29uc3QgeyBzdGF0ZSB9ID0gdGhpcztcbiAgICAgICAgICByZXR1cm4gc3RhdGUudmFsVG9JZC5oYXModmFsKTtcbiAgICAgICAgfSxcbiAgICAgICAgaWRzKCkge1xuICAgICAgICAgIGNvbnN0IHsgc3RhdGUgfSA9IHRoaXM7XG4gICAgICAgICAgcmV0dXJuIGhhcmRlbihbLi4uc3RhdGUuaWRUb1ZhbC5rZXlzKCldKTtcbiAgICAgICAgfSxcbiAgICAgICAgLypcblxuXG4gICAgICAgICAqL1xuICAgICAgICBnZXRQdWJsaXNoaW5nTWFyc2hhbGxlcigpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5mYWNldHMucHVibGlzaGluZ01hcnNoYWxsZXI7XG4gICAgICAgIH0sXG4gICAgICAgIC8qXG5cblxuXG5cblxuXG4gICAgICAgICAqL1xuICAgICAgICBnZXRSZWFkb25seU1hcnNoYWxsZXIoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmFjZXRzLnJlYWRvbmx5TWFyc2hhbGxlcjtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICByZWFkb25seU1hcnNoYWxsZXI6IHtcbiAgICAgICAgdG9DYXBEYXRhKHZhbCkge1xuICAgICAgICAgIGNvbnN0IHJlYWRvbmx5ID0gbWFrZVJlYWRvbmx5TWFyc2hhbGxlcih0aGlzLnN0YXRlKTtcbiAgICAgICAgICByZXR1cm4gcmVhZG9ubHkudG9DYXBEYXRhKHZhbCk7XG4gICAgICAgIH0sXG4gICAgICAgIGZyb21DYXBEYXRhKGRhdGEpIHtcbiAgICAgICAgICBjb25zdCByZWFkb25seSA9IG1ha2VSZWFkb25seU1hcnNoYWxsZXIodGhpcy5zdGF0ZSk7XG4gICAgICAgICAgcmV0dXJuIHJlYWRvbmx5LmZyb21DYXBEYXRhKGRhdGEpO1xuICAgICAgICB9LFxuICAgICAgICBzZXJpYWxpemUoZGF0YSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmZhY2V0cy5yZWFkb25seU1hcnNoYWxsZXIudG9DYXBEYXRhKGRhdGEpO1xuICAgICAgICB9LFxuICAgICAgICB1bnNlcmlhbGl6ZShkYXRhKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmFjZXRzLnJlYWRvbmx5TWFyc2hhbGxlci5mcm9tQ2FwRGF0YShkYXRhKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBwdWJsaXNoaW5nTWFyc2hhbGxlcjoge1xuICAgICAgICB0b0NhcERhdGEodmFsKSB7XG4gICAgICAgICAgY29uc3QgcHVibGlzaGluZyA9IG1ha2VQdWJsaXNoaW5nTWFyc2hhbGxlcih0aGlzLnN0YXRlKTtcbiAgICAgICAgICByZXR1cm4gcHVibGlzaGluZy50b0NhcERhdGEodmFsKTtcbiAgICAgICAgfSxcbiAgICAgICAgZnJvbUNhcERhdGEoZGF0YSkge1xuICAgICAgICAgIGNvbnN0IHB1Ymxpc2hpbmcgPSBtYWtlUHVibGlzaGluZ01hcnNoYWxsZXIodGhpcy5zdGF0ZSk7XG4gICAgICAgICAgcmV0dXJuIHB1Ymxpc2hpbmcuZnJvbUNhcERhdGEoZGF0YSk7XG4gICAgICAgIH0sXG4gICAgICAgIHNlcmlhbGl6ZShkYXRhKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmFjZXRzLnB1Ymxpc2hpbmdNYXJzaGFsbGVyLnRvQ2FwRGF0YShkYXRhKTtcbiAgICAgICAgfSxcbiAgICAgICAgdW5zZXJpYWxpemUoZGF0YSkge1xuICAgICAgICAgIHJldHVybiB0aGlzLmZhY2V0cy5wdWJsaXNoaW5nTWFyc2hhbGxlci5mcm9tQ2FwRGF0YShkYXRhKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgKTtcbn07XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5wcmVwYXJlQm9hcmRLaXQocHJlcGFyZUJvYXJkS2l0KTtcbiAgICAgICBjb25zdCBwcmVwYXJlUmVjb3JkZXJGYWN0b3J5ID0gem9uZSA9PiB7XG4gIGNvbnN0IGJhZ2dhZ2UgPSB6b25lLm1hcFN0b3JlKGBSZWNvcmRlciBCYWdnYWdlYCk7XG4gIGNvbnN0IG1ha2VEdXJhYmxlUHVibGlzaEtpdCA9IHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdChcbiAgICBiYWdnYWdlLFxuICAgICdEdXJhYmxlUHVibGlzaEtpdCcsXG4gICk7XG5cbiAgLypcblxuXG4gICAqL1xuICBjb25zdCBwcmVwYXJlUmVjb3JkZXJLaXQgPSAobGFiZWwsIG1hcnNoYWxsZXIpID0+IHtcbiAgICBjb25zdCBteVpvbmUgPSB6b25lLnN1YlpvbmUobGFiZWwpO1xuICAgIGNvbnN0IG1ha2VSZWNvcmRlciA9IHByZXBhcmVSZWNvcmRlcihcbiAgICAgIG15Wm9uZS5tYXBTdG9yZShgUmVjb3JkZXIgQmFnZ2FnZTogJHtsYWJlbH1gKSxcbiAgICAgIG1hcnNoYWxsZXIsXG4gICAgKTtcbiAgICByZXR1cm4gZGVmaW5lUmVjb3JkZXJLaXQoeyBtYWtlUmVjb3JkZXIsIG1ha2VEdXJhYmxlUHVibGlzaEtpdCB9KTtcbiAgfTtcblxuICByZXR1cm4gcHJlcGFyZVJlY29yZGVyS2l0O1xufTskaM2PX29uY2UucHJlcGFyZVJlY29yZGVyRmFjdG9yeShwcmVwYXJlUmVjb3JkZXJGYWN0b3J5KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkRFRkFVTFRfQ1JDX0RJR0lUUyI6WyJERUZBVUxUX0NSQ19ESUdJVFMiXSwiREVGQVVMVF9QUkVGSVgiOlsiREVGQVVMVF9QUkVGSVgiXSwicHJlcGFyZUJvYXJkS2l0IjpbInByZXBhcmVCb2FyZEtpdCJdLCJwcmVwYXJlUmVjb3JkZXJGYWN0b3J5IjpbInByZXBhcmVSZWNvcmRlckZhY3RvcnkiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAArnkXUv0PAAD9DwAAMwAAAEBhZ29yaWMvd2FsbGV0LWJhY2tlbmQtdjAuMTUuMC11MjEuMC9zcmMvYWN0aW9ucy5qc3siaW1wb3J0cyI6WyJAZW5kby9wcm9taXNlLWtpdCIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9ldmVudHVhbC1zZW5kIl0sImV4cG9ydHMiOlsibWFrZVBheW1lbnRBY3Rpb25zIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgbWFrZVByb21pc2VLaXQsRmFyLEU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wibWFrZVByb21pc2VLaXRcIixbJGjNj19hID0+IChtYWtlUHJvbWlzZUtpdCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4gICAgICAgY29uc3QgbWFrZVBheW1lbnRBY3Rpb25zID0gKHtcbiAgZ2V0QnJhbmRSZWNvcmQsXG4gIGdldFB1cnNlQnlQZXRuYW1lLFxuICBnZXRSZWNvcmQsXG4gIHVwZGF0ZVJlY29yZCxcbiAgZ2V0QXV0b0RlcG9zaXRQdXJzZSxcbiAgZ2V0SXNzdWVyQm9hcmRJZCxcbn0pID0+IHtcbiAgY29uc3QgZGVwb3NpdGVkUEsgPSBtYWtlUHJvbWlzZUtpdCgpO1xuXG4gIHJldHVybiBGYXIoJ3BheW1lbnQgYWN0aW9ucycsIHtcbiAgICBkZXBvc2l0OiBhc3luYyAocHVyc2VPclBldG5hbWUgPSB1bmRlZmluZWQpID0+IHtcbiAgICAgIGNvbnN0IG9sZFBheW1lbnRSZWNvcmQgPSBnZXRSZWNvcmQoKTtcbiAgICAgIGNvbnN0IHsgYnJhbmQsIHBheW1lbnQgfSA9IG9sZFBheW1lbnRSZWNvcmQ7XG4gICAgICBhc3NlcnQocGF5bWVudCk7XG5cbiAgICAgIC8qICAgICAgICAgICAgICAgICovXG4gICAgICBsZXQgcHVyc2U7XG4gICAgICBpZiAocHVyc2VPclBldG5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBhdXRvRGVwb3NpdFB1cnNlID0gZ2V0QXV0b0RlcG9zaXRQdXJzZShicmFuZCk7XG4gICAgICAgIGlmICghYXV0b0RlcG9zaXRQdXJzZSkge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgcmV0dXJuIGRlcG9zaXRlZFBLLnByb21pc2U7XG4gICAgICAgIH1cbiAgICAgICAgLy9cbiAgICAgICAgcHVyc2UgPSBnZXRBdXRvRGVwb3NpdFB1cnNlKGJyYW5kKTtcbiAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgIEFycmF5LmlzQXJyYXkocHVyc2VPclBldG5hbWUpIHx8XG4gICAgICAgIHR5cGVvZiBwdXJzZU9yUGV0bmFtZSA9PT0gJ3N0cmluZydcbiAgICAgICkge1xuICAgICAgICBwdXJzZSA9IGdldFB1cnNlQnlQZXRuYW1lKHB1cnNlT3JQZXRuYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHB1cnNlID0gcHVyc2VPclBldG5hbWU7XG4gICAgICB9XG4gICAgICBjb25zdCBicmFuZFJlY29yZCA9IGdldEJyYW5kUmVjb3JkKGJyYW5kKTtcbiAgICAgIHVwZGF0ZVJlY29yZCh7IC4uLm9sZFBheW1lbnRSZWNvcmQsIHN0YXR1czogJ3BlbmRpbmcnIH0sIGJyYW5kUmVjb3JkKTtcbiAgICAgIC8vXG4gICAgICBFKHB1cnNlKVxuICAgICAgICAuZGVwb3NpdChwYXltZW50KVxuICAgICAgICAudGhlbihcbiAgICAgICAgICBkZXBvc2l0ZWRBbW91bnQgPT4ge1xuICAgICAgICAgICAgdXBkYXRlUmVjb3JkKFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLi4uZ2V0UmVjb3JkKCksXG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICBwYXltZW50OiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgc3RhdHVzOiAnZGVwb3NpdGVkJyxcbiAgICAgICAgICAgICAgICBkZXBvc2l0ZWRBbW91bnQsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIGJyYW5kUmVjb3JkLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGRlcG9zaXRlZFBLLnJlc29sdmUoZGVwb3NpdGVkQW1vdW50KTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGUgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihcbiAgICAgICAgICAgICAgJ0Vycm9yIGRlcG9zaXRpbmcgcGF5bWVudCBpbicsXG4gICAgICAgICAgICAgIHB1cnNlT3JQZXRuYW1lIHx8ICdkZWZhdWx0IHB1cnNlJyxcbiAgICAgICAgICAgICAgZSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAocHVyc2VPclBldG5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICB1cGRhdGVSZWNvcmQoe1xuICAgICAgICAgICAgICAgIC4uLmdldFJlY29yZCgpLFxuICAgICAgICAgICAgICAgIHN0YXR1czogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgZGVwb3NpdGVkUEsucmVqZWN0KGUpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgZGVwb3NpdGVkUEsucmVzb2x2ZShnZXRSZWNvcmQoKS5hY3Rpb25zLmRlcG9zaXQodW5kZWZpbmVkKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgKTtcbiAgICAgIHJldHVybiBkZXBvc2l0ZWRQSy5wcm9taXNlO1xuICAgIH0sXG4gICAgcmVmcmVzaDogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgb2xkUGF5bWVudFJlY29yZCA9IGdldFJlY29yZCgpO1xuICAgICAgY29uc3QgeyBicmFuZCwgaXNzdWVyLCBwYXltZW50IH0gPSBvbGRQYXltZW50UmVjb3JkO1xuICAgICAgY29uc3QgYnJhbmRSZWNvcmQgPSBnZXRCcmFuZFJlY29yZChicmFuZCk7XG4gICAgICBpZiAoIWJyYW5kUmVjb3JkKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc3N1ZXIpIHtcbiAgICAgICAgdXBkYXRlUmVjb3JkKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLm9sZFBheW1lbnRSZWNvcmQsXG4gICAgICAgICAgICBpc3N1ZXJCb2FyZElkOiBnZXRJc3N1ZXJCb2FyZElkKGJyYW5kUmVjb3JkLmlzc3VlciksXG4gICAgICAgICAgfSxcbiAgICAgICAgICBicmFuZFJlY29yZCxcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmICghcGF5bWVudCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlzTGl2ZSA9IGF3YWl0IEUoaXNzdWVyKS5pc0xpdmUocGF5bWVudCk7XG4gICAgICBpZiAoaXNMaXZlKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cblxuICAgICAgdXBkYXRlUmVjb3JkKHtcbiAgICAgICAgLi4ub2xkUGF5bWVudFJlY29yZCxcbiAgICAgICAgLy9cbiAgICAgICAgcGF5bWVudDogdW5kZWZpbmVkLFxuICAgICAgICBzdGF0dXM6ICdleHBpcmVkJyxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBnZXRBbW91bnRPZjogYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3Qgb2xkUGF5bWVudFJlY29yZCA9IGdldFJlY29yZCgpO1xuICAgICAgY29uc3QgeyBpc3N1ZXIsIHBheW1lbnQgfSA9IG9sZFBheW1lbnRSZWNvcmQ7XG4gICAgICBhc3NlcnQoaXNzdWVyKTtcbiAgICAgIGFzc2VydChwYXltZW50KTtcblxuICAgICAgLy9cbiAgICAgIGNvbnN0IGxhc3RBbW91bnQgPSBhd2FpdCBFKGlzc3VlcikuZ2V0QW1vdW50T2YocGF5bWVudCk7XG5cbiAgICAgIHVwZGF0ZVJlY29yZCh7XG4gICAgICAgIC4uLm9sZFBheW1lbnRSZWNvcmQsXG4gICAgICAgIGxhc3RBbW91bnQsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gIH0pO1xufTskaM2PX29uY2UubWFrZVBheW1lbnRBY3Rpb25zKG1ha2VQYXltZW50QWN0aW9ucyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUGF5bWVudEFjdGlvbnMiOlsibWFrZVBheW1lbnRBY3Rpb25zIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAL8f+9L4AgAA+AIAADsAAABAYWdvcmljL3dhbGxldC1iYWNrZW5kLXYwLjE1LjAtdTIxLjAvc3JjL2JpZ2ludFN0cmluZ2lmeS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiYmlnaW50U3RyaW5naWZ5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8vXG4vL1xuLy9cbi8vXG4gICAgICAgY29uc3QgYmlnaW50U3RyaW5naWZ5ID0geCA9PlxuICBKU09OLnN0cmluZ2lmeSh4LCAoX2tleSwgdmFsdWUpID0+IHtcbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnYmlnaW50Jykge1xuICAgICAgLy9cbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gICAgaWYgKHZhbHVlIDw9IEJpZ0ludChOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikpIHtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gTnVtYmVyKHZhbHVlKTtcbiAgICB9XG4gICAgLy9cbiAgICAvL1xuICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpO1xuICB9KTskaM2PX29uY2UuYmlnaW50U3RyaW5naWZ5KGJpZ2ludFN0cmluZ2lmeSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJiaWdpbnRTdHJpbmdpZnkiOlsiYmlnaW50U3RyaW5naWZ5Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIxw6pX+CQAA/gkAADQAAABAYWdvcmljL3dhbGxldC1iYWNrZW5kLXYwLjE1LjAtdTIxLjAvc3JjL2RhdGUtbm93LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAYWdvcmljL25vdGlmaWVyIiwiQGVuZG8vcHJvbWlzZS1raXQiXSwiZXhwb3J0cyI6WyJERUZBVUxUX1RJTUVSX0RFVklDRV9TQ0FMRSIsIkRFRkFVTFRfVElNRVJfU0VSVklDRV9QT0xMX0lOVEVSVkFMIiwibWFrZVRpbWVyRGV2aWNlRGF0ZU5vdyIsIm1ha2VUaW1lclNlcnZpY2VEYXRlTm93Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRSxvYnNlcnZlTm90aWZpZXIsbWFrZVByb21pc2VLaXQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcIm9ic2VydmVOb3RpZmllclwiLFskaM2PX2EgPT4gKG9ic2VydmVOb3RpZmllciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJtYWtlUHJvbWlzZUtpdFwiLFskaM2PX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cbiAgICAgICBjb25zdCBERUZBVUxUX1RJTUVSX1NFUlZJQ0VfUE9MTF9JTlRFUlZBTCA9IDYwXzAwMG47JGjNj19vbmNlLkRFRkFVTFRfVElNRVJfU0VSVklDRV9QT0xMX0lOVEVSVkFMKERFRkFVTFRfVElNRVJfU0VSVklDRV9QT0xMX0lOVEVSVkFMKTtcbiAgICAgICBjb25zdCBERUZBVUxUX1RJTUVSX0RFVklDRV9TQ0FMRSA9IDE7XG5cbi8vXG4vL1xuJGjNj19vbmNlLkRFRkFVTFRfVElNRVJfREVWSUNFX1NDQUxFKERFRkFVTFRfVElNRVJfREVWSUNFX1NDQUxFKTtjb25zdCBtYWtlVGltZXJEZXZpY2VEYXRlTm93PVxuICAoRCwgdGltZXJEZXZpY2UsIHRpbWVyRGV2aWNlU2NhbGUgPSBERUZBVUxUX1RJTUVSX0RFVklDRV9TQ0FMRSkgPT5cbiAgKCkgPT4ge1xuICAgIGNvbnN0IHN0YW1wID0gRCh0aW1lckRldmljZSkuZ2V0TGFzdFBvbGxlZCgpO1xuICAgIGNvbnN0IGxhc3RQb2xsZWRTdGFtcCA9IHBhcnNlSW50KGAke3N0YW1wfWAsIDEwKSAqIHRpbWVyRGV2aWNlU2NhbGU7XG4gICAgcmV0dXJuIGxhc3RQb2xsZWRTdGFtcDtcbiAgfTtcblxuLy9cbi8vXG4kaM2PX29uY2UubWFrZVRpbWVyRGV2aWNlRGF0ZU5vdyhtYWtlVGltZXJEZXZpY2VEYXRlTm93KTtjb25zdCBtYWtlVGltZXJTZXJ2aWNlRGF0ZU5vdz0oXG4gIHRpbWVyU2VydmljZSxcbiAgdGltZXJQb2xsSW50ZXJ2YWwgPSBERUZBVUxUX1RJTUVSX1NFUlZJQ0VfUE9MTF9JTlRFUlZBTCxcbikgPT4ge1xuICBsZXQgbGFzdFBvbGxlZFN0YW1wID0gTmFOO1xuICBjb25zdCBkYXRlTm93ID0gKCkgPT4gbGFzdFBvbGxlZFN0YW1wO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGRhdGVOb3dQSyA9IG1ha2VQcm9taXNlS2l0KCk7XG5cbiAgLy9cbiAgY29uc3Qgb2JzZXJ2ZVRpbWVyID0gYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IG9ic2VydmVyID0ge1xuICAgICAgdXBkYXRlU3RhdGUoc3RhbXApIHtcbiAgICAgICAgbGFzdFBvbGxlZFN0YW1wID0gcGFyc2VJbnQoYCR7c3RhbXB9YCwgMTApO1xuICAgICAgICBkYXRlTm93UEsucmVzb2x2ZShkYXRlTm93KTtcbiAgICAgIH0sXG4gICAgfTtcblxuICAgIC8vXG4gICAgY29uc3Qgc3RhbXAgPSBhd2FpdCBFKHRpbWVyU2VydmljZSkuZ2V0Q3VycmVudFRpbWVzdGFtcCgpO1xuICAgIG9ic2VydmVyLnVwZGF0ZVN0YXRlKHN0YW1wKTtcblxuICAgIC8vXG4gICAgLy9cbiAgICBjb25zdCB0aW1lck5vdGlmaWVyID0gRSh0aW1lclNlcnZpY2UpLm1ha2VOb3RpZmllcigwbiwgdGltZXJQb2xsSW50ZXJ2YWwpO1xuXG4gICAgLy9cbiAgICBhd2FpdCBvYnNlcnZlTm90aWZpZXIodGltZXJOb3RpZmllciwgb2JzZXJ2ZXIpO1xuICB9O1xuXG4gIG9ic2VydmVUaW1lcigpLmNhdGNoKGUgPT4gZGF0ZU5vd1BLLnJlamVjdChlKSk7XG5cbiAgLy9cbiAgcmV0dXJuIGRhdGVOb3dQSy5wcm9taXNlO1xufTskaM2PX29uY2UubWFrZVRpbWVyU2VydmljZURhdGVOb3cobWFrZVRpbWVyU2VydmljZURhdGVOb3cpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiREVGQVVMVF9USU1FUl9TRVJWSUNFX1BPTExfSU5URVJWQUwiOlsiREVGQVVMVF9USU1FUl9TRVJWSUNFX1BPTExfSU5URVJWQUwiXSwiREVGQVVMVF9USU1FUl9ERVZJQ0VfU0NBTEUiOlsiREVGQVVMVF9USU1FUl9ERVZJQ0VfU0NBTEUiXSwibWFrZVRpbWVyRGV2aWNlRGF0ZU5vdyI6WyJtYWtlVGltZXJEZXZpY2VEYXRlTm93Il0sIm1ha2VUaW1lclNlcnZpY2VEYXRlTm93IjpbIm1ha2VUaW1lclNlcnZpY2VEYXRlTm93Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAB28S7XAFAAAwBQAAEAAAABAYWdvcmljL3dhbGxldC1iYWNrZW5kLXYwLjE1LjAtdTIxLjAvc3JjL2ZpbmRPck1ha2VJbnZpdGF0aW9uLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9tYXJzaGFsIiwiQGFnb3JpYy9lcnRwIl0sImV4cG9ydHMiOlsiZmluZE9yTWFrZUludml0YXRpb24iLCJtYWtlSWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnQsRmFpbCxxLEUscGFzc1N0eWxlT2YsQW1vdW50TWF0aDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiYXNzZXJ0XCIsWyRozY9fYSA9PiAoYXNzZXJ0ID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRNYXRoXCIsWyRozY9fYSA9PiAoQW1vdW50TWF0aCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbiAgICAgICBjb25zdCBtYWtlSWQgPSAoZGFwcE9yaWdpbiwgcmF3SWQpID0+IGAke2RhcHBPcmlnaW59IyR7cmF3SWR9YDskaM2PX29uY2UubWFrZUlkKG1ha2VJZCk7XG5cbmNvbnN0IGFzc2VydEZpcnN0Q2FwQVNDSUkgPSBzdHIgPT4ge1xuICBhc3NlcnQudHlwZW9mKHN0ciwgJ3N0cmluZycpO1xuICBjb25zdCBmaXJzdENhcEFTQ0lJID0gL15bQS1aXVthLXpBLVowLTlfJF0qJC87XG4gIGZpcnN0Q2FwQVNDSUkudGVzdChzdHIpIHx8XG4gICAgRmFpbGBUaGUgc3RyaW5nICR7cShcbiAgICAgIHN0cixcbiAgICApfSBtdXN0IGJlIGFuIGFzY2lpIGlkZW50aWZpZXIgc3RhcnRpbmcgd2l0aCB1cHBlciBjYXNlLmA7XG4gIChzdHIgIT09ICdOYU4nICYmIHN0ciAhPT0gJ0luZmluaXR5JykgfHxcbiAgICBGYWlsYGtleXdvcmQgJHtxKHN0cil9IG11c3Qgbm90IGJlIGEgbnVtYmVyJ3MgbmFtZWA7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5jb25zdCBmaW5kQnlCb2FyZElkID0gYXN5bmMgKGludml0YXRpb25QdXJzZUJhbGFuY2UsIHsgYm9hcmQsIGJvYXJkSWQgfSkgPT4ge1xuICBhc3NlcnQudHlwZW9mKGJvYXJkSWQsICdzdHJpbmcnKTtcbiAgY29uc3QgaW52aXRhdGlvbkhhbmRsZSA9IGF3YWl0IEUoYm9hcmQpLmdldFZhbHVlKGJvYXJkSWQpO1xuICBjb25zdCBtYXRjaCA9IGVsZW1lbnQgPT4gZWxlbWVudC5oYW5kbGUgPT09IGludml0YXRpb25IYW5kbGU7XG4gIGNvbnN0IG1hdGNoaW5nVmFsdWUgPSBpbnZpdGF0aW9uUHVyc2VCYWxhbmNlLnZhbHVlLmZpbmQobWF0Y2gpO1xuICBtYXRjaGluZ1ZhbHVlIHx8IEZhaWxgQ2Fubm90IGZpbmQgaW52aXRhdGlvbiBjb3JyZXNwb25kaW5nIHRvICR7cShib2FyZElkKX1gO1xuXG4gIHJldHVybiBoYXJkZW4oW21hdGNoaW5nVmFsdWVdKTtcbn07XG5cbi8vXG4vL1xuLypcblxuXG4gKi9cbmNvbnN0IGZpbmRCeUtleVZhbHVlUGFpcnMgPSBhc3luYyAoaW52aXRhdGlvblB1cnNlQmFsYW5jZSwga3ZzKSA9PiB7XG4gIC8vXG4gIC8vXG4gIC8vXG4gIGNvbnN0IG1hdGNoZXMgPSBpbnZpdGF0aW9uRGV0YWlsID0+XG4gICAgT2JqZWN0LmVudHJpZXMoa3ZzKS5ldmVyeShcbiAgICAgIChba2V5LCB2YWx1ZV0pID0+IGludml0YXRpb25EZXRhaWxba2V5XSA9PT0gdmFsdWUsXG4gICAgKTtcblxuICBjb25zdCBtYXRjaGluZ1ZhbHVlID0gaW52aXRhdGlvblB1cnNlQmFsYW5jZS52YWx1ZS5maW5kKG1hdGNoZXMpO1xuICBtYXRjaGluZ1ZhbHVlIHx8IEZhaWxgQ2Fubm90IGZpbmQgaW52aXRhdGlvbiBjb3JyZXNwb25kaW5nIHRvICR7cShrdnMpfWA7XG4gIHJldHVybiBoYXJkZW4oW21hdGNoaW5nVmFsdWVdKTtcbn07XG5cbmNvbnN0IG1ha2VGaW5kSW52aXRhdGlvbiA9IChpbnZpdGF0aW9uUHVyc2UsIGludml0YXRpb25CcmFuZCkgPT4ge1xuICBjb25zdCBmaW5kSW52aXRhdGlvbiA9IGFzeW5jIChxdWVyeUZuLCBxdWVyeVBhcmFtcykgPT4ge1xuICAgIGNvbnN0IHB1cnNlQmFsYW5jZSA9IGF3YWl0IEUoaW52aXRhdGlvblB1cnNlKS5nZXRDdXJyZW50QW1vdW50KCk7XG4gICAgY29uc3QgdmFsdWUgPSBhd2FpdCBxdWVyeUZuKHB1cnNlQmFsYW5jZSwgcXVlcnlQYXJhbXMpO1xuICAgIGNvbnN0IGludml0YXRpb25BbW91bnQgPSBBbW91bnRNYXRoLm1ha2UoaW52aXRhdGlvbkJyYW5kLCB2YWx1ZSk7XG4gICAgY29uc3QgaW52aXRhdGlvblAgPSBFKGludml0YXRpb25QdXJzZSkud2l0aGRyYXcoaW52aXRhdGlvbkFtb3VudCk7XG4gICAgcmV0dXJuIGludml0YXRpb25QO1xuICB9O1xuICByZXR1cm4gZmluZEludml0YXRpb247XG59O1xuXG5jb25zdCBtYWtlQ29udGludWluZ0ludml0YXRpb24gPSBhc3luYyAoXG4gIGlkVG9PZmZlclJlc3VsdFByb21pc2VLaXQsXG4gIGRhcHBPcmlnaW4sXG4gIHsgcHJpb3JPZmZlcklkOiByYXdQcmlvck9mZmVySWQsIGRlc2NyaXB0aW9uIH0sXG4pID0+IHtcbiAgYXNzZXJ0Rmlyc3RDYXBBU0NJSShkZXNjcmlwdGlvbik7XG5cbiAgY29uc3QgcHJpb3JPZmZlcklkID0gbWFrZUlkKGRhcHBPcmlnaW4sIHJhd1ByaW9yT2ZmZXJJZCk7XG4gIGNvbnN0IG9mZmVyUmVzdWx0ID0gYXdhaXQgaWRUb09mZmVyUmVzdWx0UHJvbWlzZUtpdC5nZXQocHJpb3JPZmZlcklkKS5wcm9taXNlO1xuICBhc3NlcnQoXG4gICAgcGFzc1N0eWxlT2Yob2ZmZXJSZXN1bHQpID09PSAnY29weVJlY29yZCcsXG4gICAgYG9mZmVyUmVzdWx0IG11c3QgYmUgYSByZWNvcmQgdG8gaGF2ZSBhbiBpbnZpdGF0aW9uTWFrZXJzIHByb3BlcnR5YCxcbiAgKTtcbiAgYXNzZXJ0KFxuICAgIG9mZmVyUmVzdWx0Lmludml0YXRpb25NYWtlcnMsXG4gICAgYG9mZmVyUmVzdWx0IGRvZXMgbm90IGhhdmUgYW4gaW52aXRhdGlvbk1ha2VycyBwcm9wZXJ0eWAsXG4gICk7XG5cbiAgY29uc3QgaW52aXRhdGlvblAgPSBFKG9mZmVyUmVzdWx0Lmludml0YXRpb25NYWtlcnMpW2Rlc2NyaXB0aW9uXSgpO1xuICByZXR1cm4gaW52aXRhdGlvblA7XG59O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlSW52aXRhdGlvbiA9IGFzeW5jIChcbiAgaW52aXRhdGlvbk1ha2VyLFxuICBpbnN0YW5jZUhhbmRsZUJvYXJkSWQsXG4gIGJvYXJkLFxuICB6b2UsXG4pID0+IHtcbiAgY29uc3QgaW5zdGFuY2UgPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoXG4gICAgRShib2FyZCkuZ2V0VmFsdWUoaW5zdGFuY2VIYW5kbGVCb2FyZElkKVxuICApO1xuICBjb25zdCBwdWJsaWNGYWNldCA9IEUoem9lKS5nZXRQdWJsaWNGYWNldChpbnN0YW5jZSk7XG4gIGNvbnN0IHsgbWV0aG9kLCBhcmdzID0gW10gfSA9IGludml0YXRpb25NYWtlcjtcblxuICByZXR1cm4gRShwdWJsaWNGYWNldClbbWV0aG9kXSguLi5hcmdzKTtcbn07XG5cbiAgICAgICBjb25zdCBmaW5kT3JNYWtlSW52aXRhdGlvbiA9IGFzeW5jIChcbiAgaWRUb09mZmVyUmVzdWx0UHJvbWlzZUtpdCxcbiAgYm9hcmQsXG4gIHpvZSxcbiAgaW52aXRhdGlvblB1cnNlLFxuICBpbnZpdGF0aW9uQnJhbmQsXG4gIG9mZmVyLFxuKSA9PiB7XG4gIGlmIChvZmZlci5pbnZpdGF0aW9uKSB7XG4gICAgLy9cbiAgICByZXR1cm4gb2ZmZXIuaW52aXRhdGlvbjtcbiAgfVxuXG4gIGNvbnN0IGZpbmRJbnZpdGF0aW9uID0gbWFrZUZpbmRJbnZpdGF0aW9uKGludml0YXRpb25QdXJzZSwgaW52aXRhdGlvbkJyYW5kKTtcblxuICAvL1xuICBpZiAob2ZmZXIuaW52aXRlSGFuZGxlQm9hcmRJZCkge1xuICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0ge1xuICAgICAgYm9hcmQsXG4gICAgICBib2FyZElkOiBvZmZlci5pbnZpdGVIYW5kbGVCb2FyZElkLFxuICAgIH07XG4gICAgcmV0dXJuIGZpbmRJbnZpdGF0aW9uKGZpbmRCeUJvYXJkSWQsIHF1ZXJ5UGFyYW1zKTtcbiAgfVxuXG4gIC8vXG4gIGlmIChvZmZlci5pbnZpdGF0aW9uSGFuZGxlQm9hcmRJZCkge1xuICAgIGNvbnN0IHF1ZXJ5UGFyYW1zID0ge1xuICAgICAgYm9hcmQsXG4gICAgICBib2FyZElkOiBvZmZlci5pbnZpdGF0aW9uSGFuZGxlQm9hcmRJZCxcbiAgICB9O1xuICAgIHJldHVybiBmaW5kSW52aXRhdGlvbihmaW5kQnlCb2FyZElkLCBxdWVyeVBhcmFtcyk7XG4gIH1cblxuICBpZiAob2ZmZXIuaW52aXRhdGlvbk1ha2VyKSB7XG4gICAgcmV0dXJuIG1ha2VJbnZpdGF0aW9uKFxuICAgICAgb2ZmZXIuaW52aXRhdGlvbk1ha2VyLFxuICAgICAgb2ZmZXIuaW5zdGFuY2VIYW5kbGVCb2FyZElkLFxuICAgICAgYm9hcmQsXG4gICAgICB6b2UsXG4gICAgKTtcbiAgfVxuXG4gIGlmIChvZmZlci5pbnZpdGF0aW9uUXVlcnkpIHtcbiAgICByZXR1cm4gZmluZEludml0YXRpb24oZmluZEJ5S2V5VmFsdWVQYWlycywgb2ZmZXIuaW52aXRhdGlvblF1ZXJ5KTtcbiAgfVxuXG4gIGlmIChvZmZlci5jb250aW51aW5nSW52aXRhdGlvbikge1xuICAgIGNvbnN0IGRhcHBPcmlnaW4gPVxuICAgICAgb2ZmZXIucmVxdWVzdENvbnRleHQgJiYgb2ZmZXIucmVxdWVzdENvbnRleHQuZGFwcE9yaWdpblxuICAgICAgICA/IG9mZmVyLnJlcXVlc3RDb250ZXh0LmRhcHBPcmlnaW5cbiAgICAgICAgOiBgdW5rbm93bmA7XG4gICAgcmV0dXJuIG1ha2VDb250aW51aW5nSW52aXRhdGlvbihcbiAgICAgIGlkVG9PZmZlclJlc3VsdFByb21pc2VLaXQsXG4gICAgICBkYXBwT3JpZ2luLFxuICAgICAgb2ZmZXIuY29udGludWluZ0ludml0YXRpb24sXG4gICAgKTtcbiAgfVxuXG4gIHRocm93IEZhaWxgbm8gaW52aXRhdGlvbiB3YXMgZm91bmQgb3IgbWFkZSBmb3IgdGhpcyBvZmZlciAke29mZmVyLmlkfWA7XG59OyRozY9fb25jZS5maW5kT3JNYWtlSW52aXRhdGlvbihmaW5kT3JNYWtlSW52aXRhdGlvbik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlSWQiOlsibWFrZUlkIl0sImZpbmRPck1ha2VJbnZpdGF0aW9uIjpbImZpbmRPck1ha2VJbnZpdGF0aW9uIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGXxFw9ZAgAAWQIAADoAAABAYWdvcmljL3dhbGxldC1iYWNrZW5kLXYwLjE1LjAtdTIxLjAvc3JjL2ludGVybmFsLXR5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8vXG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cbiAqL1xuXG4vKlxuXG4gKi9cblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuICovXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAzpAQ4eoJAADqCQAANwAAAEBhZ29yaWMvd2FsbGV0LWJhY2tlbmQtdjAuMTUuMC11MjEuMC9zcmMvaXNzdWVyVGFibGUuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBhZ29yaWMvc3RvcmUiLCIuL2ludGVybmFsLXR5cGVzLmpzIl0sImV4cG9ydHMiOlsibWFrZUlzc3VlclRhYmxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYXNzZXJ0LEUsbWFrZVNjYWxhcldlYWtNYXBTdG9yZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiYXNzZXJ0XCIsWyRozY9fYSA9PiAoYXNzZXJ0ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZVNjYWxhcldlYWtNYXBTdG9yZSA9ICRozY9fYSldXV1dLFtcIi4vaW50ZXJuYWwtdHlwZXMuanNcIiwgW11dXSk7XG5cblxuXG5cblxuXG5cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlSXNzdWVyVGFibGUgPSAoKSA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBicmFuZFRvSXNzdWVyUmVjb3JkID0gbWFrZVNjYWxhcldlYWtNYXBTdG9yZSgnYnJhbmQnKTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBpc3N1ZXJUb0lzc3VlclJlY29yZCA9IG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUoJ2lzc3VlcicpO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGlzc3VlclRhYmxlID0ge1xuICAgIGhhc0J5QnJhbmQ6IGJyYW5kVG9Jc3N1ZXJSZWNvcmQuaGFzLFxuICAgIGdldEJ5QnJhbmQ6IGJyYW5kVG9Jc3N1ZXJSZWNvcmQuZ2V0LFxuICAgIGhhc0J5SXNzdWVyOiBpc3N1ZXJUb0lzc3VlclJlY29yZC5oYXMsXG4gICAgZ2V0QnlJc3N1ZXI6IGlzc3VlclRvSXNzdWVyUmVjb3JkLmdldCxcbiAgICAvL1xuICAgIC8vXG4gICAgaW5pdElzc3VlcjogYXN5bmMgKGlzc3VlclAsIGFkZE1ldGEgPSB4ID0+IHgpID0+IHtcbiAgICAgIGNvbnN0IGJyYW5kUCA9IEUoaXNzdWVyUCkuZ2V0QnJhbmQoKTtcbiAgICAgIGNvbnN0IGJyYW5kSXNzdWVyTWF0Y2hQID0gRShicmFuZFApLmlzTXlJc3N1ZXIoaXNzdWVyUCk7XG4gICAgICBjb25zdCBkaXNwbGF5SW5mb1AgPSBFKGJyYW5kUCkuZ2V0RGlzcGxheUluZm8oKTtcbiAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgIGNvbnN0IFtpc3N1ZXIsIGJyYW5kLCBicmFuZElzc3Vlck1hdGNoLCBkaXNwbGF5SW5mb10gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIGlzc3VlclAsXG4gICAgICAgIGJyYW5kUCxcbiAgICAgICAgYnJhbmRJc3N1ZXJNYXRjaFAsXG4gICAgICAgIGRpc3BsYXlJbmZvUCxcbiAgICAgIF0pO1xuICAgICAgLy9cblxuICAgICAgaWYgKGlzc3VlclRvSXNzdWVyUmVjb3JkLmhhcyhpc3N1ZXIpKSB7XG4gICAgICAgIHJldHVybiBpc3N1ZXJUb0lzc3VlclJlY29yZC5nZXQoaXNzdWVyKTtcbiAgICAgIH1cbiAgICAgIGFzc2VydChcbiAgICAgICAgYnJhbmRJc3N1ZXJNYXRjaCxcbiAgICAgICAgYGlzc3VlciB3YXMgdXNpbmcgYSBicmFuZCB3aGljaCB3YXMgbm90IGl0cyBvd25gLFxuICAgICAgKTtcbiAgICAgIGlzc3VlclRhYmxlLmluaXRJc3N1ZXJCeVJlY29yZChcbiAgICAgICAgYWRkTWV0YSh7XG4gICAgICAgICAgYnJhbmQsXG4gICAgICAgICAgaXNzdWVyLFxuICAgICAgICAgIGFzc2V0S2luZDogZGlzcGxheUluZm8uYXNzZXRLaW5kLFxuICAgICAgICAgIGRpc3BsYXlJbmZvLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gaXNzdWVyVGFibGUuZ2V0QnlCcmFuZChicmFuZCk7XG4gICAgfSxcbiAgICBpbml0SXNzdWVyQnlSZWNvcmQ6IGlzc3VlclJlY29yZCA9PiB7XG4gICAgICBjb25zdCB7IGJyYW5kLCBpc3N1ZXIgfSA9IGlzc3VlclJlY29yZDtcbiAgICAgIGJyYW5kVG9Jc3N1ZXJSZWNvcmQuaW5pdChicmFuZCwgaXNzdWVyUmVjb3JkKTtcbiAgICAgIGlzc3VlclRvSXNzdWVyUmVjb3JkLmluaXQoaXNzdWVyLCBpc3N1ZXJSZWNvcmQpO1xuICAgIH0sXG4gIH07XG5cbiAgcmV0dXJuIGlzc3VlclRhYmxlO1xufTskaM2PX29uY2UubWFrZUlzc3VlclRhYmxlKG1ha2VJc3N1ZXJUYWJsZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlSXNzdWVyVGFibGUiOlsibWFrZUlzc3VlclRhYmxlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACfezqkYJQAAGCUAADkAAABAYWdvcmljL3dhbGxldC1iYWNrZW5kLXYwLjE1LjAtdTIxLjAvc3JjL2xpYi1kZWh5ZHJhdGUuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJpc1BhdGgiLCJtYWtlRGVoeWRyYXRvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzc2VydCxGYWlsLHEsbWFrZU1hcnNoYWwsbWFwSXRlcmFibGUsbWFrZUxlZ2FjeU1hcCxtYWtlU2NhbGFyTWFwU3RvcmU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcImFzc2VydFwiLFskaM2PX2EgPT4gKGFzc2VydCA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIm1ha2VNYXJzaGFsXCIsWyRozY9fYSA9PiAobWFrZU1hcnNoYWwgPSAkaM2PX2EpXV0sW1wibWFwSXRlcmFibGVcIixbJGjNj19hID0+IChtYXBJdGVyYWJsZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm1ha2VMZWdhY3lNYXBcIixbJGjNj19hID0+IChtYWtlTGVnYWN5TWFwID0gJGjNj19hKV1dLFtcIm1ha2VTY2FsYXJNYXBTdG9yZVwiLFskaM2PX2EgPT4gKG1ha2VTY2FsYXJNYXBTdG9yZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgaXNQYXRoID0geCA9PiB7XG4gIGlmICghQXJyYXkuaXNBcnJheSh4KSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB4Lmxlbmd0aCA+IDAgfHwgRmFpbGBQYXRoICR7cSh4KX0gbXVzdCBub3QgYmUgZW1wdHlgO1xuICBmb3IgKGNvbnN0IG5hbWUgb2YgeCkge1xuICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59OyRozY9fb25jZS5pc1BhdGgoaXNQYXRoKTtcblxuY29uc3QgSU1QTE9ERV9QUkVGSVggPSAnSUU6JztcblxuLy9cbi8vXG4vL1xuICAgICAgIGNvbnN0IG1ha2VEZWh5ZHJhdG9yID0gKGluaXRpYWxVbm5hbWVkQ291bnQgPSAwKSA9PiB7XG4gIGxldCB1bm5hbWVkQ291bnQgPSBpbml0aWFsVW5uYW1lZENvdW50O1xuXG4gIC8vXG4gIGNvbnN0IHBldG5hbWVLaW5kVG9NYXBwaW5nID0gbWFrZUxlZ2FjeU1hcCgncGV0bmFtZUtpbmQnKTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBzZWFyY2hPcmRlciA9IFtdO1xuXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCB2YWxUb1BhdGhzID0gbWFrZVNjYWxhck1hcFN0b3JlKCd2YWx1ZScpO1xuXG4gIC8qXG5cblxuICAgKi9cbiAgY29uc3QgZXhwbG9kZSA9IGRhdGEgPT4ge1xuICAgIGRhdGEuc3RhcnRzV2l0aChJTVBMT0RFX1BSRUZJWCkgfHxcbiAgICAgIEZhaWxgZXhwbG9kZWQgc3RyaW5nICR7ZGF0YX0gbXVzdCBzdGFydCB3aXRoICR7cShJTVBMT0RFX1BSRUZJWCl9YDtcbiAgICBjb25zdCBzdHJvbmduYW1lID0gSlNPTi5wYXJzZShkYXRhLnNsaWNlKElNUExPREVfUFJFRklYLmxlbmd0aCkpO1xuICAgIGlmICghaXNQYXRoKHN0cm9uZ25hbWUpKSB7XG4gICAgICByZXR1cm4gc3Ryb25nbmFtZTtcbiAgICB9XG4gICAgY29uc3QgeyB2YWxUb1BldG5hbWU6IHJvb3RUb1BldG5hbWUgfSA9IGVkZ2VNYXBwaW5nO1xuICAgIGNvbnN0IHBldG5hbWUgPSByb290VG9QZXRuYW1lLmdldChzdHJvbmduYW1lWzBdKTtcbiAgICBhc3NlcnQoIWlzUGF0aChwZXRuYW1lKSk7XG4gICAgc3Ryb25nbmFtZVswXSA9IHBldG5hbWU7XG4gICAgcmV0dXJuIGhhcmRlbihzdHJvbmduYW1lKTtcbiAgfTtcblxuICAvKlxuXG5cbiAgICovXG4gIGNvbnN0IGltcGxvZGUgPSBzdHJvbmduYW1lID0+IHtcbiAgICBpZiAoIWlzUGF0aChzdHJvbmduYW1lKSkge1xuICAgICAgcmV0dXJuIGAke0lNUExPREVfUFJFRklYfSR7SlNPTi5zdHJpbmdpZnkoc3Ryb25nbmFtZSl9YDtcbiAgICB9XG5cbiAgICAvL1xuICAgIGNvbnN0IHBhdGggPSBbLi4uc3Ryb25nbmFtZV07XG4gICAgY29uc3QgeyBwZXRuYW1lVG9WYWw6IHBldG5hbWVUb1Jvb3QgfSA9IGVkZ2VNYXBwaW5nO1xuICAgIGlmICghcGV0bmFtZVRvUm9vdC5oYXMocGF0aFswXSkpIHtcbiAgICAgIC8vXG4gICAgICBGYWlsYEVkZ2VuYW1lIGZvciAke3EocGF0aFswXSl9IHBldG5hbWUgbm90IGZvdW5kYDtcbiAgICB9XG4gICAgY29uc3Qgcm9vdCA9IHBldG5hbWVUb1Jvb3QuZ2V0KHBhdGhbMF0pO1xuICAgIHBhdGhbMF0gPSByb290O1xuXG4gICAgcmV0dXJuIGAke0lNUExPREVfUFJFRklYfSR7SlNPTi5zdHJpbmdpZnkocGF0aCl9YDtcbiAgfTtcblxuICAvKlxuXG5cblxuICAgKi9cbiAgY29uc3QgbWFrZU1hcHBpbmcgPSAoa2luZCwgeyB1c2VMZWdhY3lNYXAgPSBmYWxzZSB9ID0ge30pID0+IHtcbiAgICB0eXBlb2Yga2luZCA9PT0gJ3N0cmluZycgfHwgYGtpbmQgJHtraW5kfSBtdXN0IGJlIGEgc3RyaW5nYDtcbiAgICBjb25zdCBtYWtlTWFwID0gdXNlTGVnYWN5TWFwID8gbWFrZUxlZ2FjeU1hcCA6IG1ha2VTY2FsYXJNYXBTdG9yZTtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgcmF3VmFsVG9QZXRuYW1lID0gbWFrZU1hcCgndmFsdWUnKTtcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGNvbnN0IHZhbFRvUGV0bmFtZSA9IHtcbiAgICAgIC4uLnJhd1ZhbFRvUGV0bmFtZSxcbiAgICAgIHNldChrZXksIHZhbCkge1xuICAgICAgICByYXdWYWxUb1BldG5hbWUuc2V0KGtleSwgaW1wbG9kZSh2YWwpKTtcbiAgICAgIH0sXG4gICAgICBpbml0KGtleSwgdmFsKSB7XG4gICAgICAgIHJhd1ZhbFRvUGV0bmFtZS5pbml0KGtleSwgaW1wbG9kZSh2YWwpKTtcbiAgICAgIH0sXG4gICAgICBnZXQoa2V5KSB7XG4gICAgICAgIHJldHVybiBleHBsb2RlKHJhd1ZhbFRvUGV0bmFtZS5nZXQoa2V5KSk7XG4gICAgICB9LFxuICAgICAgZW50cmllcygpIHtcbiAgICAgICAgcmV0dXJuIG1hcEl0ZXJhYmxlKHJhd1ZhbFRvUGV0bmFtZS5lbnRyaWVzKCksIChba2V5LCB2YWxdKSA9PiBbXG4gICAgICAgICAga2V5LFxuICAgICAgICAgIGV4cGxvZGUodmFsKSxcbiAgICAgICAgXSk7XG4gICAgICB9LFxuICAgICAgdmFsdWVzKCkge1xuICAgICAgICByZXR1cm4gbWFwSXRlcmFibGUocmF3VmFsVG9QZXRuYW1lLnZhbHVlcygpLCB2YWwgPT4gZXhwbG9kZSh2YWwpKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCByYXdQZXRuYW1lVG9WYWwgPSBtYWtlU2NhbGFyTWFwU3RvcmUoJ3BldG5hbWUnKTtcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgcGV0bmFtZVRvVmFsID0ge1xuICAgICAgLi4ucmF3UGV0bmFtZVRvVmFsLFxuICAgICAgaW5pdChrZXksIHZhbCkge1xuICAgICAgICByZXR1cm4gcmF3UGV0bmFtZVRvVmFsLmluaXQoaW1wbG9kZShrZXkpLCB2YWwpO1xuICAgICAgfSxcbiAgICAgIHNldChrZXksIHZhbCkge1xuICAgICAgICByZXR1cm4gcmF3UGV0bmFtZVRvVmFsLnNldChpbXBsb2RlKGtleSksIHZhbCk7XG4gICAgICB9LFxuICAgICAgaGFzKGtleSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiByYXdQZXRuYW1lVG9WYWwuaGFzKGltcGxvZGUoa2V5KSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGdldChrZXkpIHtcbiAgICAgICAgcmV0dXJuIHJhd1BldG5hbWVUb1ZhbC5nZXQoaW1wbG9kZShrZXkpKTtcbiAgICAgIH0sXG4gICAgICBkZWxldGUoa2V5KSB7XG4gICAgICAgIHJldHVybiByYXdQZXRuYW1lVG9WYWwuZGVsZXRlKGltcGxvZGUoa2V5KSk7XG4gICAgICB9LFxuICAgICAga2V5cygpIHtcbiAgICAgICAgcmV0dXJuIG1hcEl0ZXJhYmxlKHJhd1BldG5hbWVUb1ZhbC5rZXlzKCksIGtleSA9PiBleHBsb2RlKGtleSkpO1xuICAgICAgfSxcbiAgICAgIGVudHJpZXMoKSB7XG4gICAgICAgIHJldHVybiBtYXBJdGVyYWJsZShyYXdQZXRuYW1lVG9WYWwuZW50cmllcygpLCAoW2tleSwgdmFsXSkgPT4gW1xuICAgICAgICAgIGV4cGxvZGUoa2V5KSxcbiAgICAgICAgICB2YWwsXG4gICAgICAgIF0pO1xuICAgICAgfSxcbiAgICB9O1xuXG4gICAgLypcblxuXG4gICAgICovXG4gICAgY29uc3QgYWRkUGF0aCA9IChwYXRoLCB2YWwpID0+IHtcbiAgICAgIGlzUGF0aChwYXRoKSB8fCBGYWlsYHBhdGggJHtxKHBhdGgpfSBtdXN0IGJlIGFuIGFycmF5IG9mIHN0cmluZ3NgO1xuXG4gICAgICBpZiAoIXZhbFRvUGV0bmFtZS5oYXModmFsKSAmJiBlZGdlTWFwcGluZy52YWxUb1BldG5hbWUuaGFzKHBhdGhbMF0pKSB7XG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIHZhbFRvUGV0bmFtZS5pbml0KHZhbCwgcGF0aCk7XG4gICAgICB9XG5cbiAgICAgIC8vXG4gICAgICBpZiAoIXZhbFRvUGF0aHMuaGFzKHZhbCkpIHtcbiAgICAgICAgdmFsVG9QYXRocy5pbml0KHZhbCwgaGFyZGVuKFtwYXRoXSkpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBwYXRocyA9IHZhbFRvUGF0aHMuZ2V0KHZhbCk7XG5cbiAgICAgIC8vXG4gICAgICBjb25zdCBmb3VuZCA9IHBhdGhzLmZpbmQoZW5hbWUgPT4ge1xuICAgICAgICBpZiAoZW5hbWUubGVuZ3RoICE9PSBwYXRoLmxlbmd0aCkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVuYW1lLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgaWYgKGVuYW1lW2ldICE9PSBwYXRoW2ldKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfSk7XG5cbiAgICAgIC8vXG4gICAgICBpZiAoIWZvdW5kKSB7XG4gICAgICAgIHZhbFRvUGF0aHMuc2V0KHZhbCwgaGFyZGVuKFsuLi5wYXRocywgcGF0aF0pKTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgY29uc3QgYWRkUGV0bmFtZSA9IChwZXRuYW1lLCB2YWwpID0+IHtcbiAgICAgIGlmIChwZXRuYW1lVG9WYWwuaGFzKHBldG5hbWUpICYmIHBldG5hbWVUb1ZhbC5nZXQocGV0bmFtZSkgPT09IHZhbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAhcGV0bmFtZVRvVmFsLmhhcyhwZXRuYW1lKSB8fCBGYWlsYHBldG5hbWUgJHtwZXRuYW1lfSBpcyBhbHJlYWR5IGluIHVzZWA7XG4gICAgICAhdmFsVG9QZXRuYW1lLmhhcyh2YWwpIHx8IEZhaWxgdmFsICR7dmFsfSBhbHJlYWR5IGhhcyBhIHBldG5hbWVgO1xuICAgICAgcGV0bmFtZVRvVmFsLmluaXQocGV0bmFtZSwgdmFsKTtcbiAgICAgIHZhbFRvUGV0bmFtZS5pbml0KHZhbCwgcGV0bmFtZSk7XG5cbiAgICAgIGlmIChpc1BhdGgocGV0bmFtZSkpIHtcbiAgICAgICAgYWRkUGF0aChwZXRuYW1lLCB2YWwpO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBjb25zdCByZW5hbWVQZXRuYW1lID0gKHBldG5hbWUsIHZhbCkgPT4ge1xuICAgICAgdmFsVG9QZXRuYW1lLmhhcyh2YWwpIHx8XG4gICAgICAgIEZhaWxgdmFsICR7dmFsfSBoYXMgbm90IGJlZW4gcHJldmlvdXNseSBuYW1lZCwgd291bGQgeW91IGxpa2UgdG8gYWRkIGl0IGluc3RlYWQ/YDtcbiAgICAgICFwZXRuYW1lVG9WYWwuaGFzKHBldG5hbWUpIHx8IEZhaWxgcGV0bmFtZSAke3BldG5hbWV9IGlzIGFscmVhZHkgaW4gdXNlYDtcbiAgICAgIC8vXG4gICAgICBjb25zdCBvbGRQZXRuYW1lID0gdmFsVG9QZXRuYW1lLmdldCh2YWwpO1xuICAgICAgcGV0bmFtZVRvVmFsLmRlbGV0ZShvbGRQZXRuYW1lKTtcbiAgICAgIHZhbFRvUGV0bmFtZS5kZWxldGUodmFsKTtcblxuICAgICAgLy9cbiAgICAgIHBldG5hbWVUb1ZhbC5pbml0KHBldG5hbWUsIHZhbCk7XG4gICAgICB2YWxUb1BldG5hbWUuaW5pdCh2YWwsIHBldG5hbWUpO1xuICAgIH07XG5cbiAgICAvKlxuXG5cblxuICAgICAqL1xuICAgIGNvbnN0IHN1Z2dlc3RQZXRuYW1lID0gKHBldG5hbWUsIHZhbCkgPT4ge1xuICAgICAgaWYgKHZhbFRvUGV0bmFtZS5oYXModmFsKSkge1xuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gdmFsVG9QZXRuYW1lLmdldCh2YWwpO1xuICAgICAgfVxuXG4gICAgICAvL1xuICAgICAgbGV0IHVuaXF1ZVBhdGggPSBwZXRuYW1lO1xuICAgICAgbGV0IG5vbmNlID0gMjtcbiAgICAgIHdoaWxlIChwZXRuYW1lVG9WYWwuaGFzKHVuaXF1ZVBhdGgpKSB7XG4gICAgICAgIC8vXG4gICAgICAgIGlmIChpc1BhdGgocGV0bmFtZSkpIHtcbiAgICAgICAgICB1bmlxdWVQYXRoID0gWy4uLnBldG5hbWUsIGAke25vbmNlfWBdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHVuaXF1ZVBhdGggPSBgJHtwZXRuYW1lfSR7bm9uY2V9YDtcbiAgICAgICAgfVxuICAgICAgICBub25jZSArPSAxO1xuICAgICAgfVxuXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBhZGRQZXRuYW1lKHVuaXF1ZVBhdGgsIHZhbCk7XG4gICAgICByZXR1cm4gdW5pcXVlUGF0aDtcbiAgICB9O1xuXG4gICAgY29uc3QgZGVsZXRlUGV0bmFtZSA9IHBldG5hbWUgPT4ge1xuICAgICAgcGV0bmFtZVRvVmFsLmhhcyhwZXRuYW1lKSB8fFxuICAgICAgICBGYWlsYHBldG5hbWUgJHtxKFxuICAgICAgICAgIHBldG5hbWUsXG4gICAgICAgICl9IGhhcyBub3QgYmVlbiBwcmV2aW91c2x5IG5hbWVkLCB3b3VsZCB5b3UgbGlrZSB0byBhZGQgaXQgaW5zdGVhZD9gO1xuXG4gICAgICAvL1xuICAgICAgY29uc3QgdmFsID0gcGV0bmFtZVRvVmFsLmdldChwZXRuYW1lKTtcbiAgICAgIHBldG5hbWVUb1ZhbC5kZWxldGUocGV0bmFtZSk7XG4gICAgICB2YWxUb1BldG5hbWUuZGVsZXRlKHZhbCk7XG4gICAgfTtcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCBtYXBwaW5nID0gaGFyZGVuKHtcbiAgICAgIGltcGxvZGUsXG4gICAgICBleHBsb2RlLFxuICAgICAgdmFsVG9QZXRuYW1lLFxuICAgICAgdmFsVG9QYXRocyxcbiAgICAgIHBldG5hbWVUb1ZhbCxcbiAgICAgIGFkZFBldG5hbWUsXG4gICAgICBhZGRQYXRoLFxuICAgICAgcmVuYW1lUGV0bmFtZSxcbiAgICAgIGRlbGV0ZVBldG5hbWUsXG4gICAgICBzdWdnZXN0UGV0bmFtZSxcbiAgICAgIGtpbmQsXG4gICAgfSk7XG4gICAgcGV0bmFtZUtpbmRUb01hcHBpbmcuaW5pdChraW5kLCBtYXBwaW5nKTtcbiAgICByZXR1cm4gbWFwcGluZztcbiAgfTtcblxuICBjb25zdCBlZGdlTWFwcGluZyA9IG1ha2VNYXBwaW5nKCdlZGdlJyk7XG4gIGNvbnN0IHVubmFtZWRNYXBwaW5nID0gbWFrZU1hcHBpbmcoJ3VubmFtZWQnKTtcblxuICBjb25zdCBhZGRUb1VubmFtZWQgPSB2YWwgPT4ge1xuICAgIHVubmFtZWRDb3VudCArPSAxO1xuICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gYHVubmFtZWQtJHt1bm5hbWVkQ291bnR9YDtcbiAgICB1bm5hbWVkTWFwcGluZy5hZGRQZXRuYW1lKHBsYWNlaG9sZGVyLCB2YWwpO1xuICAgIGNvbnN0IHBsYWNlaG9sZGVyTmFtZSA9IGhhcmRlbih7XG4gICAgICBraW5kOiAndW5uYW1lZCcsXG4gICAgICBwZXRuYW1lOiBwbGFjZWhvbGRlcixcbiAgICB9KTtcbiAgICByZXR1cm4gcGxhY2Vob2xkZXJOYW1lO1xuICB9O1xuXG4gIC8vXG4gIC8vXG4gIGNvbnN0IGNvbnZlcnRWYWxUb05hbWUgPSB2YWwgPT4ge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2VhcmNoT3JkZXIubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGNvbnN0IGtpbmQgPSBzZWFyY2hPcmRlcltpXTtcbiAgICAgIGNvbnN0IHsgdmFsVG9QZXRuYW1lIH0gPSBwZXRuYW1lS2luZFRvTWFwcGluZy5nZXQoa2luZCk7XG4gICAgICBpZiAodmFsVG9QZXRuYW1lLmhhcyh2YWwpKSB7XG4gICAgICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgICAgIGtpbmQsXG4gICAgICAgICAgcGV0bmFtZTogdmFsVG9QZXRuYW1lLmdldCh2YWwpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy9cbiAgICAvL1xuICAgIGlmICh1bm5hbWVkTWFwcGluZy52YWxUb1BldG5hbWUuaGFzKHZhbCkpIHtcbiAgICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgICBraW5kOiAndW5uYW1lZCcsXG4gICAgICAgIHBldG5hbWU6IHVubmFtZWRNYXBwaW5nLnZhbFRvUGV0bmFtZS5nZXQodmFsKSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICAvL1xuICAgIGNvbnN0IHBsYWNlaG9sZGVyTmFtZSA9IGFkZFRvVW5uYW1lZCh2YWwpO1xuICAgIHJldHVybiBwbGFjZWhvbGRlck5hbWU7XG4gIH07XG5cbiAgY29uc3QgY29udmVydE5hbWVUb1ZhbCA9ICh7IGtpbmQsIHBldG5hbWUgfSwgX2lmYWNlID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgY29uc3QgeyBwZXRuYW1lVG9WYWwgfSA9IHBldG5hbWVLaW5kVG9NYXBwaW5nLmdldChraW5kKTtcbiAgICByZXR1cm4gcGV0bmFtZVRvVmFsLmdldChwZXRuYW1lKTtcbiAgfTtcblxuICBjb25zdCB7IHRvQ2FwRGF0YTogZGVoeWRyYXRlLCBmcm9tQ2FwRGF0YTogaHlkcmF0ZSB9ID0gbWFrZU1hcnNoYWwoXG4gICAgY29udmVydFZhbFRvTmFtZSxcbiAgICBjb252ZXJ0TmFtZVRvVmFsLFxuICAgIHtcbiAgICAgIG1hcnNoYWxOYW1lOiAnaHlkcmF0aW9uJyxcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgZXJyb3JJZE51bTogMzBfMDAwLFxuICAgICAgc2VyaWFsaXplQm9keUZvcm1hdDogJ3NtYWxsY2FwcycsXG4gICAgfSxcbiAgKTtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgaHlkcmF0ZSxcbiAgICBkZWh5ZHJhdGUsXG4gICAgZWRnZU1hcHBpbmcsXG4gICAgLypcblxuXG5cblxuICAgICAqL1xuICAgIG1ha2VNYXBwaW5nOiAoa2luZCwgbGVnYWN5T3B0aW9ucyA9IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgY29uc3QgbWFwcGluZyA9IG1ha2VNYXBwaW5nKGtpbmQsIGxlZ2FjeU9wdGlvbnMpO1xuICAgICAgc2VhcmNoT3JkZXIucHVzaChraW5kKTtcbiAgICAgIHJldHVybiBtYXBwaW5nO1xuICAgIH0sXG4gIH0pO1xufTskaM2PX29uY2UubWFrZURlaHlkcmF0b3IobWFrZURlaHlkcmF0b3IpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNQYXRoIjpbImlzUGF0aCJdLCJtYWtlRGVoeWRyYXRvciI6WyJtYWtlRGVoeWRyYXRvciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABQD5vAvMsAALzLAAA2AAAAQGFnb3JpYy93YWxsZXQtYmFja2VuZC12MC4xNS4wLXUyMS4wL3NyYy9saWItd2FsbGV0LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBhZ29yaWMvY2FjaGUiLCJAYWdvcmljL2ludGVybmFsIiwiQGFnb3JpYy9pbnRlcm5hbC9zcmMvc3RvcmFnZS10ZXN0LXV0aWxzLmpzIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiLCJAYWdvcmljL2VydHAiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL25hdCIsIkBhZ29yaWMvbm90aWZpZXIiLCJAZW5kby9wcm9taXNlLWtpdCIsIkBhZ29yaWMvc21hcnQtd2FsbGV0L3NyYy9tYXJzaGFsLWNvbnRleHRzLmpzIiwiLi9pc3N1ZXJUYWJsZS5qcyIsIi4vbGliLWRlaHlkcmF0ZS5qcyIsIi4vZmluZE9yTWFrZUludml0YXRpb24uanMiLCIuL2JpZ2ludFN0cmluZ2lmeS5qcyIsIi4vYWN0aW9ucy5qcyIsIi4vaW50ZXJuYWwtdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJtYWtlV2FsbGV0Um9vdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzc2VydCxxLEZhaWwsbWFrZVNjYWxhclN0b3JlQ29vcmRpbmF0b3Isb2JqZWN0TWFwLFdhbGxldE5hbWUsc2xvdFN0cmluZ1Vuc2VyaWFsaXplLG1ha2VMZWdhY3lNYXAsbWFrZVNjYWxhck1hcFN0b3JlLG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUsbWFrZVNjYWxhckJpZ01hcFN0b3JlLEFtb3VudE1hdGgsRSxwYXNzU3R5bGVPZixGYXIsbWFwSXRlcmFibGUsTmF0LG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyLG1ha2VOb3RpZmllcktpdCxvYnNlcnZlSXRlcmF0aW9uLG9ic2VydmVOb3RpZmllcixzdWJzY3JpYmVFYWNoLG1ha2VQcm9taXNlS2l0LG1ha2VFeHBvcnRDb250ZXh0LG1ha2VJc3N1ZXJUYWJsZSxtYWtlRGVoeWRyYXRvcixtYWtlSWQsZmluZE9yTWFrZUludml0YXRpb24sYmlnaW50U3RyaW5naWZ5LG1ha2VQYXltZW50QWN0aW9uczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiYXNzZXJ0XCIsWyRozY9fYSA9PiAoYXNzZXJ0ID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9jYWNoZVwiLCBbW1wibWFrZVNjYWxhclN0b3JlQ29vcmRpbmF0b3JcIixbJGjNj19hID0+IChtYWtlU2NhbGFyU3RvcmVDb29yZGluYXRvciA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcIm9iamVjdE1hcFwiLFskaM2PX2EgPT4gKG9iamVjdE1hcCA9ICRozY9fYSldXSxbXCJXYWxsZXROYW1lXCIsWyRozY9fYSA9PiAoV2FsbGV0TmFtZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3N0b3JhZ2UtdGVzdC11dGlscy5qc1wiLCBbW1wic2xvdFN0cmluZ1Vuc2VyaWFsaXplXCIsWyRozY9fYSA9PiAoc2xvdFN0cmluZ1Vuc2VyaWFsaXplID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibWFrZUxlZ2FjeU1hcFwiLFskaM2PX2EgPT4gKG1ha2VMZWdhY3lNYXAgPSAkaM2PX2EpXV0sW1wibWFrZVNjYWxhck1hcFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZVNjYWxhck1hcFN0b3JlID0gJGjNj19hKV1dLFtcIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyV2Vha01hcFN0b3JlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wibWFrZVNjYWxhckJpZ01hcFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZVNjYWxhckJpZ01hcFN0b3JlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRNYXRoXCIsWyRozY9fYSA9PiAoQW1vdW50TWF0aCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wibWFwSXRlcmFibGVcIixbJGjNj19hID0+IChtYXBJdGVyYWJsZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsWyRozY9fYSA9PiAoTmF0ID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXJcIixbJGjNj19hID0+IChtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciA9ICRozY9fYSldXSxbXCJtYWtlTm90aWZpZXJLaXRcIixbJGjNj19hID0+IChtYWtlTm90aWZpZXJLaXQgPSAkaM2PX2EpXV0sW1wib2JzZXJ2ZUl0ZXJhdGlvblwiLFskaM2PX2EgPT4gKG9ic2VydmVJdGVyYXRpb24gPSAkaM2PX2EpXV0sW1wib2JzZXJ2ZU5vdGlmaWVyXCIsWyRozY9fYSA9PiAob2JzZXJ2ZU5vdGlmaWVyID0gJGjNj19hKV1dLFtcInN1YnNjcmliZUVhY2hcIixbJGjNj19hID0+IChzdWJzY3JpYmVFYWNoID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcIm1ha2VQcm9taXNlS2l0XCIsWyRozY9fYSA9PiAobWFrZVByb21pc2VLaXQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3NtYXJ0LXdhbGxldC9zcmMvbWFyc2hhbC1jb250ZXh0cy5qc1wiLCBbW1wibWFrZUV4cG9ydENvbnRleHRcIixbJGjNj19hID0+IChtYWtlRXhwb3J0Q29udGV4dCA9ICRozY9fYSldXV1dLFtcIi4vaXNzdWVyVGFibGUuanNcIiwgW1tcIm1ha2VJc3N1ZXJUYWJsZVwiLFskaM2PX2EgPT4gKG1ha2VJc3N1ZXJUYWJsZSA9ICRozY9fYSldXV1dLFtcIi4vbGliLWRlaHlkcmF0ZS5qc1wiLCBbW1wibWFrZURlaHlkcmF0b3JcIixbJGjNj19hID0+IChtYWtlRGVoeWRyYXRvciA9ICRozY9fYSldXV1dLFtcIi4vZmluZE9yTWFrZUludml0YXRpb24uanNcIiwgW1tcIm1ha2VJZFwiLFskaM2PX2EgPT4gKG1ha2VJZCA9ICRozY9fYSldXSxbXCJmaW5kT3JNYWtlSW52aXRhdGlvblwiLFskaM2PX2EgPT4gKGZpbmRPck1ha2VJbnZpdGF0aW9uID0gJGjNj19hKV1dXV0sW1wiLi9iaWdpbnRTdHJpbmdpZnkuanNcIiwgW1tcImJpZ2ludFN0cmluZ2lmeVwiLFskaM2PX2EgPT4gKGJpZ2ludFN0cmluZ2lmeSA9ICRozY9fYSldXV1dLFtcIi4vYWN0aW9ucy5qc1wiLCBbW1wibWFrZVBheW1lbnRBY3Rpb25zXCIsWyRozY9fYSA9PiAobWFrZVBheW1lbnRBY3Rpb25zID0gJGjNj19hKV1dXV0sW1wiLi9pbnRlcm5hbC10eXBlcy5qc1wiLCBbXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkobWFrZVdhbGxldFJvb3QsJ25hbWUnLHt2YWx1ZTpcIm1ha2VXYWxsZXRSb290XCJ9KTskaM2PX29uY2UubWFrZVdhbGxldFJvb3QobWFrZVdhbGxldFJvb3QpO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLy9cbmNvbnN0IG5vQWN0aW9uU3RhdGVDaGFuZ2VIYW5kbGVyID0gX25ld1N0YXRlID0+IHt9O1xuXG5jb25zdCBjbXAgPSAoYSwgYikgPT4ge1xuICBpZiAoYSA+IGIpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuICBpZiAoYSA9PT0gYikge1xuICAgIHJldHVybiAwO1xuICB9XG4gIHJldHVybiAtMTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBmdW5jdGlvbiBtYWtlV2FsbGV0Um9vdCh7XG4gIHpvZSxcbiAgYm9hcmQsXG4gIGFnb3JpY05hbWVzLFxuICBuYW1lc0J5QWRkcmVzcyxcbiAgbXlBZGRyZXNzTmFtZUFkbWluLFxuICBwdXJzZXNTdGF0ZUNoYW5nZUhhbmRsZXIgPSBub0FjdGlvblN0YXRlQ2hhbmdlSGFuZGxlcixcbiAgaW5ib3hTdGF0ZUNoYW5nZUhhbmRsZXIgPSBub0FjdGlvblN0YXRlQ2hhbmdlSGFuZGxlcixcbiAgZGF0ZU5vdyA9IHVuZGVmaW5lZCxcbn0pIHtcbiAgYXNzZXJ0KG15QWRkcmVzc05hbWVBZG1pbiwgJ21pc3NpbmcgbXlBZGRyZXNzTmFtZUFkbWluJyk7XG5cbiAgbGV0IGxhc3RJZCA9IDA7XG5cbiAgLypcblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgYWRkTWV0YSA9IHJlY29yZCA9PiB7XG4gICAgY29uc3QgeyBtZXRhOiBvbGRNZXRhID0ge30gfSA9IHJlY29yZDtcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgbWV0YSA9IHsgLi4ub2xkTWV0YSB9O1xuICAgIGlmICghbWV0YS5pZCkge1xuICAgICAgLy9cbiAgICAgIGxhc3RJZCArPSAxO1xuICAgICAgbWV0YS5pZCA9IGxhc3RJZDtcbiAgICB9XG4gICAgaWYgKGRhdGVOb3cpIHtcbiAgICAgIGNvbnN0IG5vd1N0YW1wID0gZGF0ZU5vdygpO1xuICAgICAgaWYgKCFtZXRhLmNyZWF0aW9uU3RhbXApIHtcbiAgICAgICAgLy9cbiAgICAgICAgbWV0YS5jcmVhdGlvblN0YW1wID0gbm93U3RhbXA7XG4gICAgICB9XG4gICAgICBtZXRhLnVwZGF0ZWRTdGFtcCA9IG5vd1N0YW1wO1xuICAgIH1cbiAgICByZXR1cm4geyAuLi5yZWNvcmQsIG1ldGEgfTtcbiAgfTtcblxuICBjb25zdCBjb250ZXh0ID0gbWFrZUV4cG9ydENvbnRleHQoKTtcblxuICAvL1xuICAvL1xuICBjb25zdCB7IG1ha2VNYXBwaW5nLCBkZWh5ZHJhdGUsIGVkZ2VNYXBwaW5nIH0gPSBtYWtlRGVoeWRyYXRvcigpO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBwdXJzZU1hcHBpbmcgPSBtYWtlTWFwcGluZygncHVyc2UnKTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgYnJhbmRNYXBwaW5nID0gbWFrZU1hcHBpbmcoJ2JyYW5kJyk7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgY29udGFjdE1hcHBpbmcgPSBtYWtlTWFwcGluZyhcbiAgICAnY29udGFjdCcsXG4gICAgeyB1c2VMZWdhY3lNYXA6IHRydWUgfSAgLy9cbiAgKTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgaW5zdGFuY2VNYXBwaW5nID0gbWFrZU1hcHBpbmcoJ2luc3RhbmNlJyk7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBpbnN0YWxsYXRpb25NYXBwaW5nID0gbWFrZU1hcHBpbmcoJ2luc3RhbGxhdGlvbicpO1xuXG4gIGNvbnN0IGJyYW5kVGFibGUgPSBtYWtlSXNzdWVyVGFibGUoKTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBpc3N1ZXJUb0JvYXJkSWQgPSBtYWtlU2NhbGFyV2Vha01hcFN0b3JlKCdpc3N1ZXInKTtcblxuICAvL1xuICBjb25zdCBpbml0SXNzdWVyVG9Cb2FyZElkID0gYXN5bmMgKGlzc3VlciwgYnJhbmQpID0+IHtcbiAgICBpZiAoaXNzdWVyVG9Cb2FyZElkLmhhcyhpc3N1ZXIpKSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIGlzc3VlclRvQm9hcmRJZC5nZXQoaXNzdWVyKTtcbiAgICB9XG5cbiAgICAvL1xuICAgIGNvbnN0IFtpc3N1ZXJCb2FyZElkLCBicmFuZEJvYXJkSWRdID0gYXdhaXQgUHJvbWlzZS5hbGwoW1xuICAgICAgRShib2FyZCkuZ2V0SWQoaXNzdWVyKSxcbiAgICAgIEUoYm9hcmQpLmdldElkKGJyYW5kKSxcbiAgICBdKTtcbiAgICBpZiAoaXNzdWVyVG9Cb2FyZElkLmhhcyhpc3N1ZXIpKSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIGlzc3VlclRvQm9hcmRJZC5nZXQoaXNzdWVyKTtcbiAgICB9XG5cbiAgICAvL1xuICAgIC8vXG4gICAgY29udGV4dC5lbnN1cmVCb2FyZElkKGlzc3VlckJvYXJkSWQsIGlzc3Vlcik7XG4gICAgY29udGV4dC5pbml0Qm9hcmRJZChicmFuZEJvYXJkSWQsIGJyYW5kKTtcblxuICAgIC8vXG4gICAgaXNzdWVyVG9Cb2FyZElkLmluaXQoaXNzdWVyLCBpc3N1ZXJCb2FyZElkKTtcbiAgICByZXR1cm4gaXNzdWVyQm9hcmRJZDtcbiAgfTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBwdXJzZVRvQnJhbmQgPSBtYWtlU2NhbGFyV2Vha01hcFN0b3JlKCdwdXJzZScpO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBicmFuZFRvRGVwb3NpdEZhY2V0SWQgPSBtYWtlU2NhbGFyTWFwU3RvcmUoJ2JyYW5kJyk7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgYnJhbmRUb0F1dG9EZXBvc2l0UHVyc2UgPSBtYWtlU2NhbGFyTWFwU3RvcmUoJ2JyYW5kJyk7XG5cbiAgLy9cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGlkVG9PZmZlciA9IG1ha2VTY2FsYXJNYXBTdG9yZSgnb2ZmZXJJZCcpO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIC8vXG4gIGNvbnN0IGlkVG9PZmZlclJlc3VsdFByb21pc2VLaXQgPSBtYWtlTGVnYWN5TWFwKCdpZCcpO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBpbnZpdGF0aW9uSGFuZGxlVG9PZmZlclJlc3VsdCA9XG4gICAgbWFrZVNjYWxhcldlYWtNYXBTdG9yZSgnaW52aXRhdGlvbkhhbmRsZScpO1xuXG4gIC8vXG4gIGNvbnN0IGlkVG9Db21waWxlZE9mZmVyUCA9IG5ldyBNYXAoKTtcbiAgY29uc3QgaWRUb0NvbXBsZXRlID0gbmV3IE1hcCgpO1xuICBjb25zdCBpZFRvU2VhdCA9IG5ldyBNYXAoKTtcblxuICAvL1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHB1cnNlc1N0YXRlID0gbmV3IE1hcCgpO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBwdXJzZXNGdWxsU3RhdGUgPSBuZXcgTWFwKCk7XG4gIGNvbnN0IGluYm94U3RhdGUgPSBuZXcgTWFwKCk7XG5cbiAgLypcblxuXG5cbiAgICovXG4gIGxldCB6b2VJbnZpdGVQdXJzZTtcblxuICBjb25zdCBaT0VfSU5WSVRFX0JSQU5EX1BFVE5BTUUgPSAnem9lIGludml0ZSc7XG5cbiAgZnVuY3Rpb24gZ2V0U29ydGVkVmFsdWVzKG1hcCkge1xuICAgIGNvbnN0IGVudHJpZXMgPSBbLi4ubWFwLmVudHJpZXMoKV07XG4gICAgLy9cbiAgICBjb25zdCB2YWx1ZXMgPSBlbnRyaWVzXG4gICAgICAuc29ydCgoW2lkMV0sIFtpZDJdKSA9PiBjbXAoaWQxLCBpZDIpKVxuICAgICAgLm1hcCgoW19pZCwgdmFsdWVdKSA9PiB2YWx1ZSk7XG5cbiAgICByZXR1cm4gYmlnaW50U3RyaW5naWZ5KGhhcmRlbih2YWx1ZXMpKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldFB1cnNlc1N0YXRlKCkge1xuICAgIHJldHVybiBnZXRTb3J0ZWRWYWx1ZXMocHVyc2VzU3RhdGUpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0SW5ib3hTdGF0ZSgpIHtcbiAgICByZXR1cm4gZ2V0U29ydGVkVmFsdWVzKGluYm94U3RhdGUpO1xuICB9XG5cbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgZmlsbEluU2xvdHMgPSBzbG90U3RyaW5nVW5zZXJpYWxpemU7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCB7IG5vdGlmaWVyOiBvZmZlcnNOb3RpZmllciwgdXBkYXRlcjogb2ZmZXJzVXBkYXRlciB9ID0gbWFrZU5vdGlmaWVyS2l0KFxuICAgIFtdLFxuICApO1xuXG4gIGNvbnN0IHsgcHVyc2VzTm90aWZpZXIsIGF0dGVudWF0ZWRQdXJzZXNOb3RpZmllciwgcHVyc2VzVXBkYXRlciB9ID0gKCgpID0+IHtcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCB7IG5vdGlmaWVyOiBpcG4sIHVwZGF0ZXI6IGlwdSB9ID0gbWFrZU5vdGlmaWVyS2l0KFtdKTtcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCB7IG5vdGlmaWVyOiBhcG4sIHVwZGF0ZXI6IGFwdSB9ID0gbWFrZU5vdGlmaWVyS2l0KFtdKTtcbiAgICAvL1xuICAgIC8qXG5cblxuICAgICAqL1xuICAgIGNvbnN0IGlubmVyRmlsdGVyID0gKHtcbiAgICAgIGJyYW5kLFxuICAgICAgYnJhbmRCb2FyZElkLFxuICAgICAgZGVwb3NpdEJvYXJkSWQsXG4gICAgICBicmFuZFBldG5hbWUsXG4gICAgICBwdXJzZVBldG5hbWUsXG4gICAgICBkaXNwbGF5SW5mbyxcbiAgICAgIHZhbHVlLFxuICAgICAgY3VycmVudEFtb3VudFNsb3RzLFxuICAgICAgY3VycmVudEFtb3VudCxcbiAgICB9KSA9PlxuICAgICAgaGFyZGVuKHtcbiAgICAgICAgYnJhbmQsXG4gICAgICAgIGJyYW5kQm9hcmRJZCxcbiAgICAgICAgLi4uKGRlcG9zaXRCb2FyZElkICYmIHsgZGVwb3NpdEJvYXJkSWQgfSksXG4gICAgICAgIGJyYW5kUGV0bmFtZSxcbiAgICAgICAgcHVyc2VQZXRuYW1lLFxuICAgICAgICAuLi4oZGlzcGxheUluZm8gJiYgeyBkaXNwbGF5SW5mbyB9KSxcbiAgICAgICAgdmFsdWUsXG4gICAgICAgIGN1cnJlbnRBbW91bnRTbG90cyxcbiAgICAgICAgY3VycmVudEFtb3VudCxcbiAgICAgIH0pO1xuICAgIGNvbnN0IGZpbHRlciA9IHN0YXRlID0+IHN0YXRlLm1hcChpbm5lckZpbHRlcik7XG4gICAgY29uc3QgcHUgPSBGYXIoJ3B1cnNlc1VwZGF0ZXInLCB7XG4gICAgICB1cGRhdGVTdGF0ZTogbmV3U3RhdGUgPT4ge1xuICAgICAgICBpcHUudXBkYXRlU3RhdGUobmV3U3RhdGUpO1xuICAgICAgICBhcHUudXBkYXRlU3RhdGUoZmlsdGVyKG5ld1N0YXRlKSk7XG4gICAgICB9LFxuICAgICAgZmluaXNoOiBmaW5hbFN0YXRlID0+IHtcbiAgICAgICAgaXB1LmZpbmlzaChmaW5hbFN0YXRlKTtcbiAgICAgICAgYXB1LmZpbmlzaChmaWx0ZXIoZmluYWxTdGF0ZSkpO1xuICAgICAgfSxcbiAgICAgIGZhaWw6IHJlYXNvbiA9PiB7XG4gICAgICAgIGlwdS5mYWlsKHJlYXNvbik7XG4gICAgICAgIGFwdS5mYWlsKHJlYXNvbik7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgcHVyc2VzTm90aWZpZXI6IGlwbixcbiAgICAgIGF0dGVudWF0ZWRQdXJzZXNOb3RpZmllcjogYXBuLFxuICAgICAgcHVyc2VzVXBkYXRlcjogcHUsXG4gICAgfSk7XG4gIH0pKCk7XG5cbiAgLypcblxuXG4gICAqL1xuICBhc3luYyBmdW5jdGlvbiB1cGRhdGVQdXJzZXNTdGF0ZShwdXJzZVBldG5hbWUsIHB1cnNlKSB7XG4gICAgY29uc3QgcHVyc2VLZXkgPSBwdXJzZU1hcHBpbmcuaW1wbG9kZShwdXJzZVBldG5hbWUpO1xuICAgIGZvciAoY29uc3Qga2V5IG9mIHB1cnNlc1N0YXRlLmtleXMoKSkge1xuICAgICAgaWYgKCFwdXJzZU1hcHBpbmcucGV0bmFtZVRvVmFsLmhhcyhwdXJzZU1hcHBpbmcuZXhwbG9kZShrZXkpKSkge1xuICAgICAgICBwdXJzZXNTdGF0ZS5kZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY3VycmVudEFtb3VudCA9IGF3YWl0IEUocHVyc2UpLmdldEN1cnJlbnRBbW91bnQoKTtcbiAgICBjb25zdCB7IHZhbHVlLCBicmFuZCB9ID0gY3VycmVudEFtb3VudDtcbiAgICBjb25zdCBicmFuZFBldG5hbWUgPSBicmFuZE1hcHBpbmcudmFsVG9QZXRuYW1lLmdldChicmFuZCk7XG4gICAgY29uc3QgZGVoeWRyYXRlZEN1cnJlbnRBbW91bnQgPSBkZWh5ZHJhdGUoY3VycmVudEFtb3VudCk7XG4gICAgY29uc3QgYnJhbmRCb2FyZElkID0gYXdhaXQgRShib2FyZCkuZ2V0SWQoYnJhbmQpO1xuXG4gICAgbGV0IGRlcG9zaXRCb2FyZElkO1xuICAgIGlmIChcbiAgICAgIGJyYW5kVG9BdXRvRGVwb3NpdFB1cnNlLmhhcyhicmFuZCkgJiZcbiAgICAgIGJyYW5kVG9BdXRvRGVwb3NpdFB1cnNlLmdldChicmFuZCkgPT09IHB1cnNlICYmXG4gICAgICBicmFuZFRvRGVwb3NpdEZhY2V0SWQuaGFzKGJyYW5kKVxuICAgICkge1xuICAgICAgLy9cbiAgICAgIGRlcG9zaXRCb2FyZElkID0gYnJhbmRUb0RlcG9zaXRGYWNldElkLmdldChicmFuZCk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNzdWVyUmVjb3JkID1cbiAgICAgIGJyYW5kVGFibGUuaGFzQnlCcmFuZChicmFuZCkgJiYgYnJhbmRUYWJsZS5nZXRCeUJyYW5kKGJyYW5kKTtcbiAgICAvKlxuXG4gICAgICovXG4gICAgY29uc3QganN0YXRlID0gYWRkTWV0YSh7XG4gICAgICAuLi5wdXJzZXNTdGF0ZS5nZXQocHVyc2VLZXkpLFxuICAgICAgYnJhbmQsXG4gICAgICBicmFuZEJvYXJkSWQsXG4gICAgICAuLi4oZGVwb3NpdEJvYXJkSWQgJiYgeyBkZXBvc2l0Qm9hcmRJZCB9KSxcbiAgICAgIGJyYW5kUGV0bmFtZSxcbiAgICAgIHB1cnNlUGV0bmFtZSxcbiAgICAgIGRpc3BsYXlJbmZvOiBpc3N1ZXJSZWNvcmQgJiYgaXNzdWVyUmVjb3JkLmRpc3BsYXlJbmZvLFxuICAgICAgdmFsdWUsXG4gICAgICBjdXJyZW50QW1vdW50U2xvdHM6IGRlaHlkcmF0ZWRDdXJyZW50QW1vdW50LFxuICAgICAgY3VycmVudEFtb3VudDogZmlsbEluU2xvdHMoZGVoeWRyYXRlZEN1cnJlbnRBbW91bnQpLFxuICAgIH0pO1xuICAgIHB1cnNlc1N0YXRlLnNldChwdXJzZUtleSwganN0YXRlKTtcblxuICAgIHB1cnNlc0Z1bGxTdGF0ZS5zZXQoXG4gICAgICBwdXJzZSxcbiAgICAgIGhhcmRlbih7XG4gICAgICAgIC4uLmpzdGF0ZSxcbiAgICAgICAgcHVyc2UsXG4gICAgICAgIGJyYW5kLFxuICAgICAgICBhY3Rpb25zOiBGYXIoJ3B1cnNlLmFjdGlvbnMnLCB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICBhc3luYyBzZW5kKHJlY2VpdmVyUCwgc2VuZFZhbHVlKSB7XG4gICAgICAgICAgICBjb25zdCBhbW91bnQgPSBBbW91bnRNYXRoLm1ha2UoYnJhbmQsIHNlbmRWYWx1ZSk7XG4gICAgICAgICAgICBjb25zdCBwYXltZW50ID0gYXdhaXQgRShwdXJzZSkud2l0aGRyYXcoYW1vdW50KTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIGF3YWl0IEUocmVjZWl2ZXJQKS5yZWNlaXZlKHBheW1lbnQpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICBhd2FpdCBFKHB1cnNlKS5kZXBvc2l0KHBheW1lbnQpO1xuICAgICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgYXN5bmMgcmVjZWl2ZShwYXltZW50UCkge1xuICAgICAgICAgICAgY29uc3QgcGF5bWVudCA9IGF3YWl0IHBheW1lbnRQO1xuICAgICAgICAgICAgcmV0dXJuIEUocHVyc2UpLmRlcG9zaXQocGF5bWVudCk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBkZXBvc2l0KHBheW1lbnQsIGFtb3VudCA9IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIEUocHVyc2UpLmRlcG9zaXQocGF5bWVudCwgYW1vdW50KTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgcHVyc2VzVXBkYXRlci51cGRhdGVTdGF0ZShbLi4ucHVyc2VzRnVsbFN0YXRlLnZhbHVlcygpXSk7XG4gICAgcHVyc2VzU3RhdGVDaGFuZ2VIYW5kbGVyKGdldFB1cnNlc1N0YXRlKCkpO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlQWxsUHVyc2VTdGF0ZSgpIHtcbiAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICBtYXBJdGVyYWJsZShwdXJzZU1hcHBpbmcucGV0bmFtZVRvVmFsLmVudHJpZXMoKSwgKFtwZXRuYW1lLCBwdXJzZV0pID0+XG4gICAgICAgIHVwZGF0ZVB1cnNlc1N0YXRlKHBldG5hbWUsIHB1cnNlKSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIGNvbnN0IGRpc3BsYXkgPSB2YWx1ZSA9PiBmaWxsSW5TbG90cyhkZWh5ZHJhdGUoaGFyZGVuKHZhbHVlKSkpO1xuXG4gIGNvbnN0IGV4cGFuZEludml0YXRpb25CcmFuZHMgPSBhc3luYyBpbnZpdGF0aW9uRGV0YWlscyA9PiB7XG4gICAgLy9cbiAgICBjb25zdCB7IGZlZSB9ID0gaW52aXRhdGlvbkRldGFpbHM7XG4gICAgaWYgKCFmZWUpIHtcbiAgICAgIHJldHVybiBpbnZpdGF0aW9uRGV0YWlscztcbiAgICB9XG5cbiAgICAvL1xuICAgIGNvbnN0IGRpc3BsYXlJbmZvID0gYXdhaXQgRShFKHpvZSkuZ2V0RmVlSXNzdWVyKCkpLmdldERpc3BsYXlJbmZvKCk7XG4gICAgY29uc3QgYXVnbWVudGVkRGV0YWlscyA9IHtcbiAgICAgIC4uLmludml0YXRpb25EZXRhaWxzLFxuICAgICAgZmVlOiB7IC4uLmZlZSwgZGlzcGxheUluZm8gfSxcbiAgICB9O1xuICAgIHJldHVybiBkaXNwbGF5KGF1Z21lbnRlZERldGFpbHMpO1xuICB9O1xuXG4gIGNvbnN0IGRpc3BsYXlQcm9wb3NhbCA9IHByb3Bvc2FsVGVtcGxhdGUgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgIHdhbnQsXG4gICAgICBnaXZlLFxuICAgICAgZXhpdCA9IHsgb25EZW1hbmQ6IG51bGwgfSxcbiAgICAgIGFyZ3VtZW50czogYXJncyxcbiAgICB9ID0gcHJvcG9zYWxUZW1wbGF0ZTtcbiAgICBjb25zdCBkaXNwbGF5UmVjb3JkID0gcHVyc2VQZXRuYW1lVmFsdWVLZXl3b3JkUmVjb3JkID0+IHtcbiAgICAgIGlmIChwdXJzZVBldG5hbWVWYWx1ZUtleXdvcmRSZWNvcmQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhcbiAgICAgICAgT2JqZWN0LmVudHJpZXMocHVyc2VQZXRuYW1lVmFsdWVLZXl3b3JkUmVjb3JkKS5tYXAoXG4gICAgICAgICAgKFtrZXl3b3JkLCB7IHB1cnNlUGV0bmFtZSwgdmFsdWUsIGFtb3VudCwgcHVyc2UgfV0pID0+IHtcbiAgICAgICAgICAgIGlmICghYW1vdW50KSB7XG4gICAgICAgICAgICAgIHB1cnNlID0gZ2V0UHVyc2UocHVyc2VQZXRuYW1lKTtcbiAgICAgICAgICAgICAgYW1vdW50ID0geyB2YWx1ZSB9O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcHVyc2VQZXRuYW1lID0gcHVyc2VNYXBwaW5nLnZhbFRvUGV0bmFtZS5nZXQocHVyc2UpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBicmFuZCA9IHB1cnNlVG9CcmFuZC5nZXQocHVyc2UpO1xuICAgICAgICAgICAgY29uc3QgaXNzdWVyUmVjb3JkID1cbiAgICAgICAgICAgICAgYnJhbmRUYWJsZS5oYXNCeUJyYW5kKGJyYW5kKSAmJiBicmFuZFRhYmxlLmdldEJ5QnJhbmQoYnJhbmQpO1xuICAgICAgICAgICAgYW1vdW50ID0gaGFyZGVuKHtcbiAgICAgICAgICAgICAgLi4uYW1vdW50LFxuICAgICAgICAgICAgICBicmFuZCxcbiAgICAgICAgICAgICAgZGlzcGxheUluZm86IGlzc3VlclJlY29yZCAmJiBpc3N1ZXJSZWNvcmQuZGlzcGxheUluZm8sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGRpc3BsYXlBbW91bnQgPSBkaXNwbGF5KGFtb3VudCk7XG4gICAgICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgICBrZXl3b3JkLFxuICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcHVyc2VQZXRuYW1lLFxuICAgICAgICAgICAgICAgIHB1cnNlLFxuICAgICAgICAgICAgICAgIGFtb3VudDogZGlzcGxheUFtb3VudCxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF07XG4gICAgICAgICAgfSxcbiAgICAgICAgKSxcbiAgICAgICk7XG4gICAgfTtcbiAgICBjb25zdCBwcm9wb3NhbEZvckRpc3BsYXkgPSB7XG4gICAgICB3YW50OiBkaXNwbGF5UmVjb3JkKHdhbnQpLFxuICAgICAgZ2l2ZTogZGlzcGxheVJlY29yZChnaXZlKSxcbiAgICAgIGV4aXQsXG4gICAgfTtcbiAgICBpZiAoYXJncyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBwcm9wb3NhbEZvckRpc3BsYXkuYXJndW1lbnRzID0gZGlzcGxheShhcmdzKTtcbiAgICB9XG4gICAgcmV0dXJuIHByb3Bvc2FsRm9yRGlzcGxheTtcbiAgfTtcblxuICAvKlxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IHBydW5lT2ZmZXJXaGVuSW5hY3RpdmUgPSBpZCA9PiB7XG4gICAgYXNzZXJ0KGluYm94U3RhdGUuaGFzKGlkKSk7XG4gICAgY29uc3Qgb2ZmZXIgPSBpbmJveFN0YXRlLmdldChpZCk7XG4gICAgY29uc3QgeyBzdGF0dXMgfSA9IG9mZmVyO1xuXG4gICAgc3dpdGNoIChzdGF0dXMpIHtcbiAgICAgIGNhc2UgJ2RlY2xpbmUnOlxuICAgICAgY2FzZSAnY2FuY2VsJzpcbiAgICAgIGNhc2UgJ3JlamVjdGVkJzpcbiAgICAgICAgaW5ib3hTdGF0ZS5kZWxldGUoaWQpO1xuICAgICAgICByZXR1cm47XG4gICAgICBjYXNlICdhY2NlcHQnOlxuICAgICAgICBhc3NlcnQoaWRUb09mZmVyUmVzdWx0UHJvbWlzZUtpdC5oYXMoaWQpKTtcbiAgICAgICAgdm9pZCBFLndoZW4oaWRUb09mZmVyUmVzdWx0UHJvbWlzZUtpdC5nZXQoaWQpLnByb21pc2UsIHJlc3VsdCA9PiB7XG4gICAgICAgICAgY29uc3Qgc3R5bGUgPSBwYXNzU3R5bGVPZihyZXN1bHQpO1xuICAgICAgICAgIGNvbnN0IGFjdGl2ZSA9XG4gICAgICAgICAgICBzdHlsZSA9PT0gJ3JlbW90YWJsZScgfHxcbiAgICAgICAgICAgIChzdHlsZSA9PT0gJ2NvcHlSZWNvcmQnICYmICdpbnZpdGF0aW9uTWFrZXJzJyBpbiByZXN1bHQpO1xuICAgICAgICAgIGlmICghYWN0aXZlKSB7XG4gICAgICAgICAgICBpbmJveFN0YXRlLmRlbGV0ZShpZCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdwZW5kaW5nJzpcbiAgICAgIGNhc2UgJ2NvbXBsZXRlJzpcbiAgICAgIGRlZmF1bHQ6XG4gICAgfVxuICB9O1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHVwZGF0ZUluYm94U3RhdGUoaWQsIG9mZmVyLCBkb1B1c2ggPSB0cnVlKSB7XG4gICAgLy9cbiAgICBjb25zdCB7IHByb3Bvc2FsVGVtcGxhdGUgfSA9IG9mZmVyO1xuICAgIGNvbnN0IHsgaW5zdGFuY2UsIGluc3RhbGxhdGlvbiwgaW52aXRhdGlvbkRldGFpbHMgfSA9IGlkVG9PZmZlci5nZXQoaWQpO1xuICAgIGlmICghaW5zdGFuY2UgfHwgIWluc3RhbGxhdGlvbikge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IGluc3RhbmNlRGlzcGxheSA9IGRpc3BsYXkoaW5zdGFuY2UpO1xuICAgIGNvbnN0IGluc3RhbGxhdGlvbkRpc3BsYXkgPSBkaXNwbGF5KGluc3RhbGxhdGlvbik7XG4gICAgY29uc3QgYWxyZWFkeURpc3BsYXllZCA9XG4gICAgICBpbmJveFN0YXRlLmhhcyhpZCkgJiYgaW5ib3hTdGF0ZS5nZXQoaWQpLnByb3Bvc2FsRm9yRGlzcGxheTtcblxuICAgIGNvbnN0IGF1Z21lbnRlZEludml0YXRpb25EZXRhaWxzID1cbiAgICAgIGF3YWl0IGV4cGFuZEludml0YXRpb25CcmFuZHMoaW52aXRhdGlvbkRldGFpbHMpO1xuXG4gICAgY29uc3Qgb2ZmZXJGb3JEaXNwbGF5ID0ge1xuICAgICAgLi4ub2ZmZXIsXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBhY3Rpb25zOiB1bmRlZmluZWQsXG4gICAgICBpbnN0YWxsYXRpb246IHVuZGVmaW5lZCxcbiAgICAgIGluc3RhbmNlOiB1bmRlZmluZWQsXG4gICAgICBwcm9wb3NhbFRlbXBsYXRlLFxuICAgICAgaW52aXRhdGlvbkRldGFpbHM6IGRpc3BsYXkoYXVnbWVudGVkSW52aXRhdGlvbkRldGFpbHMpLFxuICAgICAgaW5zdGFuY2VQZXRuYW1lOiBpbnN0YW5jZURpc3BsYXkucGV0bmFtZSxcbiAgICAgIGluc3RhbGxhdGlvblBldG5hbWU6IGluc3RhbGxhdGlvbkRpc3BsYXkucGV0bmFtZSxcbiAgICAgIHByb3Bvc2FsRm9yRGlzcGxheTogZGlzcGxheVByb3Bvc2FsKGFscmVhZHlEaXNwbGF5ZWQgfHwgcHJvcG9zYWxUZW1wbGF0ZSksXG4gICAgfTtcblxuICAgIGluYm94U3RhdGUuc2V0KGlkLCBvZmZlckZvckRpc3BsYXkpO1xuICAgIGlmIChkb1B1c2gpIHtcbiAgICAgIC8vXG4gICAgICBvZmZlcnNVcGRhdGVyLnVwZGF0ZVN0YXRlKFtvZmZlckZvckRpc3BsYXldKTtcbiAgICAgIGluYm94U3RhdGVDaGFuZ2VIYW5kbGVyKGdldEluYm94U3RhdGUoKSk7XG4gICAgfVxuICAgIHBydW5lT2ZmZXJXaGVuSW5hY3RpdmUoaWQpO1xuICB9XG5cbiAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlQWxsSW5ib3hTdGF0ZSgpIHtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgIEFycmF5LmZyb20oaW5ib3hTdGF0ZS5lbnRyaWVzKCkpLm1hcCgoW2lkLCBvZmZlcl0pID0+XG4gICAgICAgIC8vXG4gICAgICAgIHVwZGF0ZUluYm94U3RhdGUoaWQsIG9mZmVyLCBmYWxzZSksXG4gICAgICApLFxuICAgICk7XG4gICAgLy9cbiAgICBvZmZlcnNVcGRhdGVyLnVwZGF0ZVN0YXRlKFsuLi5pbmJveFN0YXRlLnZhbHVlcygpXSk7XG4gICAgaW5ib3hTdGF0ZUNoYW5nZUhhbmRsZXIoZ2V0SW5ib3hTdGF0ZSgpKTtcbiAgfVxuXG4gIGNvbnN0IHsgdXBkYXRlcjogaXNzdWVyc1VwZGF0ZXIsIG5vdGlmaWVyOiBpc3N1ZXJzTm90aWZpZXIgfSA9XG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChcbiAgICAgIG1ha2VOb3RpZmllcktpdChbXSlcbiAgICApO1xuXG4gIGZ1bmN0aW9uIHVwZGF0ZUFsbElzc3VlcnNTdGF0ZSgpIHtcbiAgICBpc3N1ZXJzVXBkYXRlci51cGRhdGVTdGF0ZShcbiAgICAgIFsuLi5icmFuZE1hcHBpbmcucGV0bmFtZVRvVmFsLmVudHJpZXMoKV0ubWFwKChbcGV0bmFtZSwgYnJhbmRdKSA9PiB7XG4gICAgICAgIGNvbnN0IGlzc3VlclJlY29yZCA9IGJyYW5kVGFibGUuZ2V0QnlCcmFuZChicmFuZCk7XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgcGV0bmFtZSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICAuLi5pc3N1ZXJSZWNvcmQsXG4gICAgICAgICAgICBpc3N1ZXJCb2FyZElkOiBpc3N1ZXJUb0JvYXJkSWQuZ2V0KGlzc3VlclJlY29yZC5pc3N1ZXIpLFxuICAgICAgICAgIH0sXG4gICAgICAgIF07XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgLy9cbiAgLy9cbiAgYXN5bmMgZnVuY3Rpb24gdXBkYXRlQWxsU3RhdGUoKSB7XG4gICAgdXBkYXRlQWxsSXNzdWVyc1N0YXRlKCk7XG4gICAgYXdhaXQgdXBkYXRlQWxsUHVyc2VTdGF0ZSgpO1xuICAgIGF3YWl0IHVwZGF0ZUFsbEluYm94U3RhdGUoKTtcbiAgfVxuXG4gIC8vXG4gIC8vXG4gIGZ1bmN0aW9uIHVwZGF0ZU9yUmVzdWJzY3JpYmUoaWQsIHNlYXQsIHVwZGF0ZSkge1xuICAgIGNvbnN0IHsgdXBkYXRlQ291bnQgfSA9IHVwZGF0ZTtcbiAgICBhc3NlcnQodXBkYXRlQ291bnQgPT09IHVuZGVmaW5lZCk7XG4gICAgaWRUb1NlYXQuZGVsZXRlKGlkKTtcblxuICAgIGNvbnN0IG9mZmVyID0gaWRUb09mZmVyLmdldChpZCk7XG4gICAgY29uc3QgY29tcGxldGVkT2ZmZXIgPSBhZGRNZXRhKHtcbiAgICAgIC4uLm9mZmVyLFxuICAgICAgc3RhdHVzOiAnY29tcGxldGUnLFxuICAgIH0pO1xuICAgIGlkVG9PZmZlci5zZXQoaWQsIGNvbXBsZXRlZE9mZmVyKTtcbiAgICB2b2lkIHVwZGF0ZUluYm94U3RhdGUoaWQsIGNvbXBsZXRlZE9mZmVyKTtcbiAgfVxuXG4gIC8qXG5cblxuXG5cbiAgICovXG4gIGZ1bmN0aW9uIHN1YnNjcmliZVRvVXBkYXRlcyhpZCwgc2VhdCkge1xuICAgIHJldHVybiBFKEUoc2VhdCkuZ2V0RXhpdFN1YnNjcmliZXIoKSlcbiAgICAgIC5zdWJzY3JpYmVBZnRlcigpXG4gICAgICAudGhlbih1cGRhdGUgPT4gdXBkYXRlT3JSZXN1YnNjcmliZShpZCwgc2VhdCwgdXBkYXRlKSk7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBleGVjdXRlT2ZmZXIoY29tcGlsZWRPZmZlclApIHtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBjb25zdCB7XG4gICAgICBpbnZpdGVQLFxuICAgICAgcHVyc2VLZXl3b3JkUmVjb3JkLFxuICAgICAgcHJvcG9zYWwsXG4gICAgICBhcmd1bWVudHM6IGFyZ3MsXG4gICAgfSA9IGF3YWl0IGNvbXBpbGVkT2ZmZXJQO1xuXG4gICAgLy9cbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgcGF5bWVudFRvUHVyc2UgPSBuZXcgTWFwKCk7XG5cbiAgICAvL1xuICAgIC8vXG4gICAgY29uc3Qga2V5d29yZFBheW1lbnRQcyA9IE9iamVjdC5lbnRyaWVzKHByb3Bvc2FsLmdpdmUgfHwgaGFyZGVuKHt9KSkubWFwKFxuICAgICAgYXN5bmMgKFtrZXl3b3JkLCBhbW91bnRdKSA9PiB7XG4gICAgICAgIGNvbnN0IHB1cnNlID0gcHVyc2VLZXl3b3JkUmVjb3JkW2tleXdvcmRdO1xuICAgICAgICBwdXJzZSAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgRmFpbGBwdXJzZSB3YXMgbm90IGZvdW5kIGZvciBrZXl3b3JkICR7cShrZXl3b3JkKX1gO1xuXG4gICAgICAgIGNvbnN0IHBheW1lbnQgPSBhd2FpdCBFKHB1cnNlKS53aXRoZHJhdyhhbW91bnQpO1xuICAgICAgICBwYXltZW50VG9QdXJzZS5zZXQocGF5bWVudCwgcHVyc2UpO1xuICAgICAgICByZXR1cm4gW2tleXdvcmQsIHBheW1lbnRdO1xuICAgICAgfSxcbiAgICApO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IHRyeVJlY2xhaW1pbmdXaXRoZHJhd25QYXltZW50cyA9ICgpID0+XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIFByb21pc2UuYWxsU2V0dGxlZChcbiAgICAgICAga2V5d29yZFBheW1lbnRQcy5tYXAoYXN5bmMga2V5d29yZFBheW1lbnRQID0+IHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgY29uc3QgW19rZXl3b3JkLCBwYXltZW50XSA9IGF3YWl0IGtleXdvcmRQYXltZW50UDtcblxuICAgICAgICAgIC8vXG4gICAgICAgICAgY29uc3QgcHVyc2UgPSBwYXltZW50VG9QdXJzZS5nZXQocGF5bWVudCk7XG4gICAgICAgICAgaWYgKHB1cnNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vXG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBhZGRQYXltZW50KHBheW1lbnQsIHB1cnNlKTtcbiAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIHBheW1lbnRUb1B1cnNlLmRlbGV0ZShwYXltZW50KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pLFxuICAgICAgKTtcblxuICAgIC8vXG4gICAgLy9cbiAgICBjb25zdCB3aXRoZHJhd0FsbFBheW1lbnRzID0gUHJvbWlzZS5hbGwoa2V5d29yZFBheW1lbnRQcyk7XG4gICAgd2l0aGRyYXdBbGxQYXltZW50cy5jYXRjaCh0cnlSZWNsYWltaW5nV2l0aGRyYXduUGF5bWVudHMpO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG5cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBjb25zdCBwYXltZW50S2V5d29yZHMgPSBhd2FpdCB3aXRoZHJhd0FsbFBheW1lbnRzO1xuXG4gICAgY29uc3QgcGF5bWVudEtleXdvcmRSZWNvcmQgPSBoYXJkZW4oT2JqZWN0LmZyb21FbnRyaWVzKHBheW1lbnRLZXl3b3JkcykpO1xuXG4gICAgY29uc3Qgc2VhdCA9IEUoem9lKS5vZmZlcihcbiAgICAgIGludml0ZVAsXG4gICAgICBoYXJkZW4ocHJvcG9zYWwpLFxuICAgICAgcGF5bWVudEtleXdvcmRSZWNvcmQsXG4gICAgICBhcmdzLFxuICAgICk7XG4gICAgLy9cbiAgICAvL1xuICAgIHZvaWQgc2VhdC5maW5hbGx5KHRyeVJlY2xhaW1pbmdXaXRoZHJhd25QYXltZW50cyk7XG5cbiAgICAvL1xuICAgIC8vXG4gICAgY29uc3QgZGVwb3NpdGVkUCA9IEUoc2VhdClcbiAgICAgIC5nZXRQYXlvdXRzKClcbiAgICAgIC50aGVuKHBheW91dE9iaiA9PiB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgICAgICBPYmplY3QuZW50cmllcyhwYXlvdXRPYmopLm1hcCgoW2tleXdvcmQsIHBheW91dFBdKSA9PiB7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIGNvbnN0IHB1cnNlT3JVbmRlZmluZWQgPSBwdXJzZUtleXdvcmRSZWNvcmRba2V5d29yZF07XG5cbiAgICAgICAgICAgIHJldHVybiBhZGRQYXltZW50KHBheW91dFAsIHB1cnNlT3JVbmRlZmluZWQpO1xuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuICAgICAgfSk7XG5cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICB2b2lkIGRlcG9zaXRlZFAuZmluYWxseSh0cnlSZWNsYWltaW5nV2l0aGRyYXduUGF5bWVudHMpO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIHJldHVybiB7IGRlcG9zaXRlZFAsIHNlYXQgfTtcbiAgfVxuXG4gIC8vXG5cbiAgY29uc3QgYWRkSXNzdWVyID0gYXN5bmMgKHBldG5hbWVGb3JCcmFuZCwgaXNzdWVyUCwgbWFrZVB1cnNlID0gZmFsc2UpID0+IHtcbiAgICBjb25zdCBpc3N1ZXIgPSBhd2FpdCBpc3N1ZXJQO1xuICAgIGNvbnN0IHJlY1AgPSBicmFuZFRhYmxlLmhhc0J5SXNzdWVyKGlzc3VlcilcbiAgICAgID8gYnJhbmRUYWJsZS5nZXRCeUlzc3Vlcihpc3N1ZXIpXG4gICAgICA6IGJyYW5kVGFibGUuaW5pdElzc3Vlcihpc3N1ZXIsIGFkZE1ldGEpO1xuICAgIGNvbnN0IHsgYnJhbmQgfSA9IGF3YWl0IHJlY1A7XG4gICAgYXdhaXQgaW5pdElzc3VlclRvQm9hcmRJZChpc3N1ZXIsIGJyYW5kKTtcbiAgICBjb25zdCBhZGRCcmFuZFBldG5hbWUgPSAoKSA9PiB7XG4gICAgICBsZXQgcDtcbiAgICAgIGNvbnN0IGFscmVhZHkgPSBicmFuZE1hcHBpbmcudmFsVG9QZXRuYW1lLmhhcyhicmFuZCk7XG4gICAgICBwZXRuYW1lRm9yQnJhbmQgPSBicmFuZE1hcHBpbmcuc3VnZ2VzdFBldG5hbWUocGV0bmFtZUZvckJyYW5kLCBicmFuZCk7XG4gICAgICBpZiAoIWFscmVhZHkgJiYgbWFrZVB1cnNlKSB7XG4gICAgICAgIHAgPSBtYWtlRW1wdHlQdXJzZShwZXRuYW1lRm9yQnJhbmQsIHBldG5hbWVGb3JCcmFuZCwgdHJ1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwID0gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gRS53aGVuKHAsIF8gPT4gcGV0bmFtZUZvckJyYW5kKTtcbiAgICB9O1xuICAgIHJldHVybiBhZGRCcmFuZFBldG5hbWUoKS50aGVuKGFzeW5jIGJyYW5kTmFtZSA9PiB7XG4gICAgICBhd2FpdCB1cGRhdGVBbGxJc3N1ZXJzU3RhdGUoKTtcbiAgICAgIHJldHVybiBicmFuZE5hbWU7XG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgcHVibGlzaElzc3VlciA9IGFzeW5jIGJyYW5kID0+IHtcbiAgICBjb25zdCB7IGlzc3VlciB9ID0gYnJhbmRUYWJsZS5nZXRCeUJyYW5kKGJyYW5kKTtcbiAgICBjb25zdCBpc3N1ZXJCb2FyZElkID0gYXdhaXQgaW5pdElzc3VlclRvQm9hcmRJZChpc3N1ZXIsIGJyYW5kKTtcbiAgICB1cGRhdGVBbGxJc3N1ZXJzU3RhdGUoKTtcbiAgICByZXR1cm4gaXNzdWVyQm9hcmRJZDtcbiAgfTtcblxuICBjb25zdCB7IHVwZGF0ZXI6IGNvbnRhY3RzVXBkYXRlciwgbm90aWZpZXI6IGNvbnRhY3RzTm90aWZpZXIgfSA9XG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKFxuICAgICAgbWFrZU5vdGlmaWVyS2l0KFtdKVxuICAgICk7XG5cbiAgLypcblxuXG5cbiAgICovXG4gIGNvbnN0IGFkZENvbnRhY3QgPSBhc3luYyAocGV0bmFtZSwgYWN0aW9ucywgYWRkcmVzcyA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIC8vXG4gICAgY29uc3QgYWxyZWFkeSA9IGF3YWl0IEUoYm9hcmQpLmhhcyhhY3Rpb25zKTtcbiAgICAvKiAgICAgICAgICAgICAgKi9cbiAgICBsZXQgZGVwb3NpdEZhY2V0O1xuICAgIGlmIChhbHJlYWR5KSB7XG4gICAgICBkZXBvc2l0RmFjZXQgPSBhY3Rpb25zO1xuICAgIH0gZWxzZSB7XG4gICAgICBkZXBvc2l0RmFjZXQgPSBGYXIoV2FsbGV0TmFtZS5kZXBvc2l0RmFjZXQsIHtcbiAgICAgICAgcmVjZWl2ZShwYXltZW50UCkge1xuICAgICAgICAgIHJldHVybiBFKGFjdGlvbnMpLnJlY2VpdmUocGF5bWVudFApO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfVxuICAgIGNvbnN0IGRlcG9zaXRCb2FyZElkID0gYXdhaXQgRShib2FyZCkuZ2V0SWQoZGVwb3NpdEZhY2V0KTtcbiAgICBjb25zdCBmb3VuZCA9IFsuLi5jb250YWN0TWFwcGluZy5wZXRuYW1lVG9WYWwuZW50cmllcygpXS5maW5kKFxuICAgICAgKFtfcG4sIHsgZGVwb3NpdEJvYXJkSWQ6IGRiaWQgfV0pID0+IGRlcG9zaXRCb2FyZElkID09PSBkYmlkLFxuICAgICk7XG4gICAgIWZvdW5kIHx8XG4gICAgICBGYWlsYCR7cShmb3VuZCAmJiBmb3VuZFswXSl9IGlzIGFscmVhZHkgdGhlIHBldG5hbWUgZm9yIGJvYXJkIElEICR7cShcbiAgICAgICAgZGVwb3NpdEJvYXJkSWQsXG4gICAgICApfWA7XG5cbiAgICBjb25zdCBjb250YWN0ID0gaGFyZGVuKFxuICAgICAgYWRkTWV0YSh7XG4gICAgICAgIGFjdGlvbnMsXG4gICAgICAgIGFkZHJlc3MsXG4gICAgICAgIGRlcG9zaXRCb2FyZElkLFxuICAgICAgfSksXG4gICAgKTtcblxuICAgIGNvbnRhY3RNYXBwaW5nLnN1Z2dlc3RQZXRuYW1lKHBldG5hbWUsIGNvbnRhY3QpO1xuICAgIGNvbnRhY3RzVXBkYXRlci51cGRhdGVTdGF0ZShbLi4uY29udGFjdE1hcHBpbmcucGV0bmFtZVRvVmFsLmVudHJpZXMoKV0pO1xuICAgIHJldHVybiBjb250YWN0O1xuICB9O1xuXG4gIGNvbnN0IGFkZEluc3RhbmNlID0gKHBldG5hbWUsIGluc3RhbmNlSGFuZGxlKSA9PiB7XG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgcGV0bmFtZSA9IGluc3RhbmNlTWFwcGluZy5zdWdnZXN0UGV0bmFtZShwZXRuYW1lLCBpbnN0YW5jZUhhbmRsZSk7XG4gICAgLy9cbiAgICB2b2lkIHVwZGF0ZUFsbFN0YXRlKCk7XG4gICAgcmV0dXJuIGBpbnN0YW5jZSAke3EocGV0bmFtZSl9IHN1Y2Nlc3NmdWxseSBhZGRlZCB0byB3YWxsZXRgO1xuICB9O1xuXG4gIC8qXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGludGVybmFsVW5zYWZlSW1wb3J0UHVyc2UgPSBhc3luYyAoXG4gICAgYnJhbmRQZXRuYW1lLFxuICAgIHBldG5hbWVGb3JQdXJzZSxcbiAgICBkZWZhdWx0QXV0b0RlcG9zaXQsXG4gICAgcHVyc2VUb0ltcG9ydCxcbiAgKSA9PiB7XG4gICAgY29uc3QgYnJhbmQgPSBicmFuZE1hcHBpbmcucGV0bmFtZVRvVmFsLmdldChicmFuZFBldG5hbWUpO1xuICAgIGNvbnN0IHsgaXNzdWVyIH0gPSBicmFuZFRhYmxlLmdldEJ5QnJhbmQoYnJhbmQpO1xuXG4gICAgLyogICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCBwdXJzZSA9IGF3YWl0IChwdXJzZVRvSW1wb3J0IHx8IEUoaXNzdWVyKS5tYWtlRW1wdHlQdXJzZSgpKTtcblxuICAgIHB1cnNlVG9CcmFuZC5pbml0KHB1cnNlLCBicmFuZCk7XG4gICAgcGV0bmFtZUZvclB1cnNlID0gcHVyc2VNYXBwaW5nLnN1Z2dlc3RQZXRuYW1lKHBldG5hbWVGb3JQdXJzZSwgcHVyc2UpO1xuXG4gICAgaWYgKGRlZmF1bHRBdXRvRGVwb3NpdCAmJiAhYnJhbmRUb0F1dG9EZXBvc2l0UHVyc2UuaGFzKGJyYW5kKSkge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBhd2FpdCBkb0VuYWJsZUF1dG9EZXBvc2l0KHBldG5hbWVGb3JQdXJzZSwgZmFsc2UpO1xuICAgIH1cblxuICAgIGF3YWl0IHVwZGF0ZVB1cnNlc1N0YXRlKHBldG5hbWVGb3JQdXJzZSwgcHVyc2UpO1xuXG4gICAgLy9cbiAgICB2b2lkIG9ic2VydmVOb3RpZmllcihFKHB1cnNlKS5nZXRDdXJyZW50QW1vdW50Tm90aWZpZXIoKSwge1xuICAgICAgdXBkYXRlU3RhdGUoX2JhbGFuY2UpIHtcbiAgICAgICAgdXBkYXRlUHVyc2VzU3RhdGUocHVyc2VNYXBwaW5nLnZhbFRvUGV0bmFtZS5nZXQocHVyc2UpLCBwdXJzZSkuY2F0Y2goXG4gICAgICAgICAgZSA9PiBjb25zb2xlLmVycm9yKCdjYW5ub3QgdXBkYXRlU3RhdGUnLCBlKSxcbiAgICAgICAgKTtcbiAgICAgIH0sXG4gICAgICBmYWlsKHJlYXNvbikge1xuICAgICAgICBjb25zb2xlLmVycm9yKGBmYWlsZWQgdXBkYXRlU3RhdGUgb2JzZXJ2ZXJgLCByZWFzb24pO1xuICAgICAgfSxcbiAgICB9KTtcblxuICAgIHJldHVybiBwZXRuYW1lRm9yUHVyc2U7XG4gIH07XG5cbiAgLy9cbiAgLypcblxuXG5cbiAgICovXG4gIGNvbnN0IG1ha2VFbXB0eVB1cnNlID0gKFxuICAgIGJyYW5kUGV0bmFtZSxcbiAgICBwZXRuYW1lRm9yUHVyc2UsXG4gICAgZGVmYXVsdEF1dG9EZXBvc2l0ID0gdHJ1ZSxcbiAgKSA9PlxuICAgIGludGVybmFsVW5zYWZlSW1wb3J0UHVyc2UoXG4gICAgICBicmFuZFBldG5hbWUsXG4gICAgICBwZXRuYW1lRm9yUHVyc2UsXG4gICAgICBkZWZhdWx0QXV0b0RlcG9zaXQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgKTtcblxuICAvKlxuXG5cbiAgICovXG4gIGFzeW5jIGZ1bmN0aW9uIGRlcG9zaXQocHVyc2VQZXRuYW1lLCBwYXltZW50KSB7XG4gICAgY29uc3QgcHVyc2UgPSBwdXJzZU1hcHBpbmcucGV0bmFtZVRvVmFsLmdldChwdXJzZVBldG5hbWUpO1xuICAgIHJldHVybiBFKHB1cnNlKS5kZXBvc2l0KHBheW1lbnQpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0UHVyc2VzKCkge1xuICAgIHJldHVybiBbLi4ucHVyc2VNYXBwaW5nLnBldG5hbWVUb1ZhbC5lbnRyaWVzKCldO1xuICB9XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGZ1bmN0aW9uIGdldFB1cnNlKHB1cnNlUGV0bmFtZSkge1xuICAgIHJldHVybiBwdXJzZU1hcHBpbmcucGV0bmFtZVRvVmFsLmdldChwdXJzZVBldG5hbWUpO1xuICB9XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGZ1bmN0aW9uIGdldFB1cnNlSXNzdWVyKHB1cnNlUGV0bmFtZSkge1xuICAgIGNvbnN0IHB1cnNlID0gcHVyc2VNYXBwaW5nLnBldG5hbWVUb1ZhbC5nZXQocHVyc2VQZXRuYW1lKTtcbiAgICBjb25zdCBicmFuZCA9IHB1cnNlVG9CcmFuZC5nZXQocHVyc2UpO1xuICAgIGNvbnN0IHsgaXNzdWVyIH0gPSBicmFuZFRhYmxlLmdldEJ5QnJhbmQoYnJhbmQpO1xuICAgIHJldHVybiBpc3N1ZXI7XG4gIH1cblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBmdW5jdGlvbiBnZXRPZmZlcnMoeyBvcmlnaW4gPSBudWxsIH0gPSB7fSkge1xuICAgIC8vXG4gICAgcmV0dXJuIFsuLi5pZFRvT2ZmZXIuZW50cmllcygpXVxuICAgICAgLmZpbHRlcihcbiAgICAgICAgKFtfaWQsIG9mZmVyXSkgPT5cbiAgICAgICAgICBvcmlnaW4gPT09IG51bGwgfHxcbiAgICAgICAgICAob2ZmZXIucmVxdWVzdENvbnRleHQgJiYgb2ZmZXIucmVxdWVzdENvbnRleHQuZGFwcE9yaWdpbiA9PT0gb3JpZ2luKSxcbiAgICAgIClcbiAgICAgIC5zb3J0KChbaWQxXSwgW2lkMl0pID0+IGNtcChpZDEsIGlkMikpXG4gICAgICAubWFwKChbX2lkLCBvZmZlcl0pID0+IGhhcmRlbihvZmZlcikpO1xuICB9XG5cbiAgY29uc3QgY29tcGlsZVByb3Bvc2FsID0gcHJvcG9zYWxUZW1wbGF0ZSA9PiB7XG4gICAgY29uc3Qge1xuICAgICAgd2FudCA9IGhhcmRlbih7fSksXG4gICAgICBnaXZlID0gaGFyZGVuKHt9KSxcbiAgICAgIGV4aXQgPSB7IG9uRGVtYW5kOiBudWxsIH0sXG4gICAgICBhcmd1bWVudHM6IGFyZ3MsXG4gICAgfSA9IHByb3Bvc2FsVGVtcGxhdGU7XG5cbiAgICBjb25zdCBwdXJzZUtleXdvcmRSZWNvcmQgPSB7fTtcblxuICAgIGNvbnN0IGNvbXBpbGUgPSBhbW91bnRLZXl3b3JkUmVjb3JkID0+IHtcbiAgICAgIHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG4gICAgICAgIE9iamVjdC5lbnRyaWVzKGFtb3VudEtleXdvcmRSZWNvcmQpLm1hcChcbiAgICAgICAgICAoW2tleXdvcmQsIHsgcHVyc2VQZXRuYW1lLCB2YWx1ZSB9XSkgPT4ge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgIHZhbHVlID0gTmF0KHZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHB1cnNlID0gZ2V0UHVyc2UocHVyc2VQZXRuYW1lKTtcbiAgICAgICAgICAgIHB1cnNlS2V5d29yZFJlY29yZFtrZXl3b3JkXSA9IHB1cnNlO1xuICAgICAgICAgICAgY29uc3QgYnJhbmQgPSBwdXJzZVRvQnJhbmQuZ2V0KHB1cnNlKTtcblxuICAgICAgICAgICAgcmV0dXJuIFtrZXl3b3JkLCB7IGJyYW5kLCB2YWx1ZSB9XTtcbiAgICAgICAgICB9LFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgY29uc3QgcHJvcG9zYWwgPSB7XG4gICAgICB3YW50OiBjb21waWxlKHdhbnQpLFxuICAgICAgZ2l2ZTogY29tcGlsZShnaXZlKSxcbiAgICAgIGV4aXQsXG4gICAgfTtcblxuICAgIHJldHVybiB7IHByb3Bvc2FsLCBhcmd1bWVudHM6IGFyZ3MsIHB1cnNlS2V5d29yZFJlY29yZCB9O1xuICB9O1xuXG4gIGNvbnN0IGNvbXBpbGVPZmZlciA9IGFzeW5jIG9mZmVyID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBwcm9wb3NhbCxcbiAgICAgIHB1cnNlS2V5d29yZFJlY29yZCxcbiAgICAgIGFyZ3VtZW50czogYXJncyxcbiAgICB9ID0gY29tcGlsZVByb3Bvc2FsKG9mZmVyLnByb3Bvc2FsVGVtcGxhdGUpO1xuXG4gICAgY29uc3Qgem9lSXNzdWVyID0gaXNzdWVyTWFuYWdlci5nZXQoWk9FX0lOVklURV9CUkFORF9QRVROQU1FKTtcbiAgICBjb25zdCB7IGJyYW5kOiBpbnZpdGF0aW9uQnJhbmQgfSA9IGJyYW5kVGFibGUuZ2V0QnlJc3N1ZXIoem9lSXNzdWVyKTtcbiAgICBjb25zdCBpbnZpdGF0aW9uUCA9IGZpbmRPck1ha2VJbnZpdGF0aW9uKFxuICAgICAgaWRUb09mZmVyUmVzdWx0UHJvbWlzZUtpdCxcbiAgICAgIGJvYXJkLFxuICAgICAgem9lLFxuICAgICAgem9lSW52aXRlUHVyc2UsXG4gICAgICBpbnZpdGF0aW9uQnJhbmQsXG4gICAgICBvZmZlcixcbiAgICApO1xuXG4gICAgY29uc3QgaW52aXRhdGlvbkRldGFpbHMgPSBhd2FpdCBFKHpvZSkuZ2V0SW52aXRhdGlvbkRldGFpbHMoaW52aXRhdGlvblApO1xuICAgIGNvbnN0IHsgaW5zdGFsbGF0aW9uLCBpbnN0YW5jZSB9ID0gaW52aXRhdGlvbkRldGFpbHM7XG5cbiAgICBjb25zdCBjb21waWxlZCA9IHtcbiAgICAgIGFyZ3VtZW50czogYXJncyxcbiAgICAgIHByb3Bvc2FsLFxuICAgICAgaW52aXRlUDogaW52aXRhdGlvblAsXG4gICAgICBwdXJzZUtleXdvcmRSZWNvcmQsXG4gICAgICBpbnZpdGF0aW9uRGV0YWlscyxcbiAgICAgIGluc3RhbGxhdGlvbixcbiAgICAgIGluc3RhbmNlLFxuICAgIH07XG4gICAgcmV0dXJuIGNvbXBpbGVkO1xuICB9O1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgZGFwcE9yaWdpbnMgPSBtYWtlU2NhbGFyTWFwU3RvcmUoJ2RhcHBPcmlnaW4nKTtcbiAgY29uc3QgeyBub3RpZmllcjogZGFwcHNOb3RpZmllciwgdXBkYXRlcjogZGFwcHNVcGRhdGVyIH0gPVxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKG1ha2VOb3RpZmllcktpdChbXSkpO1xuXG4gIGNvbnN0IHVwZGF0ZURhcHAgPSBkYXBwUmVjb3JkID0+IHtcbiAgICBoYXJkZW4oYWRkTWV0YShkYXBwUmVjb3JkKSk7XG4gICAgZGFwcE9yaWdpbnMuc2V0KGRhcHBSZWNvcmQub3JpZ2luLCBkYXBwUmVjb3JkKTtcbiAgICBkYXBwc1VwZGF0ZXIudXBkYXRlU3RhdGUoWy4uLmRhcHBPcmlnaW5zLnZhbHVlcygpXSk7XG4gIH07XG5cbiAgY29uc3QgZGVsZXRlRGFwcCA9ICh7IG9yaWdpbiB9KSA9PiB7XG4gICAgZGFwcE9yaWdpbnMuZGVsZXRlKG9yaWdpbik7XG4gICAgZGFwcHNVcGRhdGVyLnVwZGF0ZVN0YXRlKFsuLi5kYXBwT3JpZ2lucy52YWx1ZXMoKV0pO1xuICB9O1xuXG4gIGNvbnN0IHNoYXJlZENhY2hlQ29vcmRpbmF0b3IgPSBtYWtlU2NhbGFyU3RvcmVDb29yZGluYXRvcihcbiAgICBtYWtlU2NhbGFyQmlnTWFwU3RvcmUoYHNoYXJlZCBjYWNoZWApLFxuICApO1xuXG4gIGFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JEYXBwQXBwcm92YWwoXG4gICAgc3VnZ2VzdGVkUGV0bmFtZSxcbiAgICBvcmlnaW4sXG4gICAgbm90WWV0RW5hYmxlZCA9ICgpID0+IHt9LFxuICApIHtcbiAgICBsZXQgZGFwcFJlY29yZDtcbiAgICBpZiAoZGFwcE9yaWdpbnMuaGFzKG9yaWdpbikpIHtcbiAgICAgIGRhcHBSZWNvcmQgPSBkYXBwT3JpZ2lucy5nZXQob3JpZ2luKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGV0IHJlc29sdmU7XG4gICAgICBsZXQgcmVqZWN0O1xuICAgICAgbGV0IGFwcHJvdmFsUDtcblxuICAgICAgY29uc3QgY2FjaGVDb29yZGluYXRvciA9IG1ha2VTY2FsYXJTdG9yZUNvb3JkaW5hdG9yKFxuICAgICAgICBtYWtlU2NhbGFyQmlnTWFwU3RvcmUoYG9yaWdpbiAke29yaWdpbn0gY2FjaGVgKSxcbiAgICAgICk7XG4gICAgICBkYXBwUmVjb3JkID0gYWRkTWV0YSh7XG4gICAgICAgIHN1Z2dlc3RlZFBldG5hbWUsXG4gICAgICAgIHBldG5hbWU6IHN1Z2dlc3RlZFBldG5hbWUsXG4gICAgICAgIG9yaWdpbixcbiAgICAgICAgY2FjaGVDb29yZGluYXRvcixcbiAgICAgICAgYXBwcm92YWxQLFxuICAgICAgICBlbmFibGU6IGZhbHNlLFxuICAgICAgICBhY3Rpb25zOiBGYXIoJ2RhcHAuYWN0aW9ucycsIHtcbiAgICAgICAgICBzZXRQZXRuYW1lKHBldG5hbWUpIHtcbiAgICAgICAgICAgIGlmIChkYXBwUmVjb3JkLnBldG5hbWUgPT09IHBldG5hbWUpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGRhcHBSZWNvcmQuYWN0aW9ucztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChlZGdlTWFwcGluZy52YWxUb1BldG5hbWUuaGFzKG9yaWdpbikpIHtcbiAgICAgICAgICAgICAgZWRnZU1hcHBpbmcucmVuYW1lUGV0bmFtZShwZXRuYW1lLCBvcmlnaW4pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGV0bmFtZSA9IGVkZ2VNYXBwaW5nLnN1Z2dlc3RQZXRuYW1lKHBldG5hbWUsIG9yaWdpbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkYXBwUmVjb3JkID0gYWRkTWV0YSh7XG4gICAgICAgICAgICAgIC4uLmRhcHBSZWNvcmQsXG4gICAgICAgICAgICAgIHBldG5hbWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHVwZGF0ZURhcHAoZGFwcFJlY29yZCk7XG4gICAgICAgICAgICB2b2lkIHVwZGF0ZUFsbFN0YXRlKCk7XG4gICAgICAgICAgICByZXR1cm4gZGFwcFJlY29yZC5hY3Rpb25zO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZW5hYmxlKCkge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIGRhcHBSZWNvcmQgPSBhZGRNZXRhKHtcbiAgICAgICAgICAgICAgLi4uZGFwcFJlY29yZCxcbiAgICAgICAgICAgICAgZW5hYmxlOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBlZGdlTWFwcGluZy5zdWdnZXN0UGV0bmFtZShkYXBwUmVjb3JkLnBldG5hbWUsIG9yaWdpbik7XG4gICAgICAgICAgICB1cGRhdGVEYXBwKGRhcHBSZWNvcmQpO1xuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICAgICAgcmV0dXJuIGRhcHBSZWNvcmQuYWN0aW9ucztcbiAgICAgICAgICB9LFxuICAgICAgICAgIGRpc2FibGUocmVhc29uID0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgaWYgKHJlamVjdCkge1xuICAgICAgICAgICAgICByZWplY3QocmVhc29uKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAoeyByZXNvbHZlLCByZWplY3QsIHByb21pc2U6IGFwcHJvdmFsUCB9ID0gbWFrZVByb21pc2VLaXQoKSk7XG4gICAgICAgICAgICBkYXBwUmVjb3JkID0gYWRkTWV0YSh7XG4gICAgICAgICAgICAgIC4uLmRhcHBSZWNvcmQsXG4gICAgICAgICAgICAgIGVuYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgIGFwcHJvdmFsUCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdXBkYXRlRGFwcChkYXBwUmVjb3JkKTtcbiAgICAgICAgICAgIHJldHVybiBkYXBwUmVjb3JkLmFjdGlvbnM7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBkZWxldGUoKSB7XG4gICAgICAgICAgICBpZiAocmVqZWN0KSB7XG4gICAgICAgICAgICAgIHJlamVjdCgnRGFwcCBkZWxldGVkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWxldGVEYXBwKGRhcHBSZWNvcmQpO1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pLFxuICAgICAgfSk7XG5cbiAgICAgIC8vXG4gICAgICBkYXBwT3JpZ2lucy5pbml0KG9yaWdpbiwgZGFwcFJlY29yZCk7XG5cbiAgICAgIC8vXG4gICAgICBkYXBwUmVjb3JkLmFjdGlvbnMuZGlzYWJsZSgpO1xuICAgIH1cblxuICAgIGlmICghZGFwcFJlY29yZC5lbmFibGUpIHtcbiAgICAgIG5vdFlldEVuYWJsZWQoKTtcbiAgICB9XG4gICAgYXdhaXQgZGFwcFJlY29yZC5hcHByb3ZhbFA7XG4gICAgLy9cbiAgICAvL1xuICAgIHJldHVybiBkYXBwT3JpZ2lucy5nZXQob3JpZ2luKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGFkZE9mZmVyKHJhd09mZmVyLCByZXF1ZXN0Q29udGV4dCA9IHt9KSB7XG4gICAgY29uc3QgZGFwcE9yaWdpbiA9XG4gICAgICByZXF1ZXN0Q29udGV4dC5kYXBwT3JpZ2luIHx8IHJlcXVlc3RDb250ZXh0Lm9yaWdpbiB8fCAndW5rbm93bic7XG4gICAgY29uc3QgeyBpZDogcmF3SWQgfSA9IHJhd09mZmVyO1xuICAgIGNvbnN0IGlkID0gbWFrZUlkKGRhcHBPcmlnaW4sIHJhd0lkKTtcbiAgICBjb25zdCBvZmZlciA9IGhhcmRlbihcbiAgICAgIGFkZE1ldGEoe1xuICAgICAgICAuLi5yYXdPZmZlcixcbiAgICAgICAgcmF3SWQsXG4gICAgICAgIGlkLFxuICAgICAgICByZXF1ZXN0Q29udGV4dDogeyAuLi5yZXF1ZXN0Q29udGV4dCwgZGFwcE9yaWdpbiB9LFxuICAgICAgICBzdGF0dXM6IHVuZGVmaW5lZCxcbiAgICAgIH0pLFxuICAgICk7XG4gICAgaWRUb09mZmVyLmluaXQoaWQsIG9mZmVyKTtcbiAgICBpZFRvT2ZmZXJSZXN1bHRQcm9taXNlS2l0LmluaXQoaWQsIG1ha2VQcm9taXNlS2l0KCkpO1xuICAgIGF3YWl0IHVwZGF0ZUluYm94U3RhdGUoaWQsIG9mZmVyKTtcblxuICAgIC8vXG4gICAgY29uc3QgY29tcGlsZWRPZmZlclAgPSBjb21waWxlT2ZmZXIob2ZmZXIpO1xuICAgIGlkVG9Db21waWxlZE9mZmVyUC5zZXQoaWQsIGNvbXBpbGVkT2ZmZXJQKTtcblxuICAgIC8vXG4gICAgYXdhaXQgdXBkYXRlSW5ib3hTdGF0ZShpZCwgaWRUb09mZmVyLmdldChpZCkpO1xuICAgIGNvbnN0IHsgaW5zdGFsbGF0aW9uLCBpbnN0YW5jZSwgaW52aXRhdGlvbkRldGFpbHMgfSA9IGF3YWl0IGNvbXBpbGVkT2ZmZXJQO1xuXG4gICAgaWYgKCFpZFRvT2ZmZXIuaGFzKGlkKSkge1xuICAgICAgcmV0dXJuIHJhd0lkO1xuICAgIH1cbiAgICBpZFRvT2ZmZXIuc2V0KFxuICAgICAgaWQsXG4gICAgICBoYXJkZW4oXG4gICAgICAgIGFkZE1ldGEoe1xuICAgICAgICAgIC4uLmlkVG9PZmZlci5nZXQoaWQpLFxuICAgICAgICAgIGluc3RhbGxhdGlvbixcbiAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICBpbnZpdGF0aW9uRGV0YWlscyxcbiAgICAgICAgfSksXG4gICAgICApLFxuICAgICk7XG4gICAgYXdhaXQgdXBkYXRlSW5ib3hTdGF0ZShpZCwgaWRUb09mZmVyLmdldChpZCkpO1xuICAgIHJldHVybiByYXdJZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNvbnN1bW1hdGVkKG9mZmVyKSB7XG4gICAgaWYgKG9mZmVyLnN0YXR1cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKG9mZmVyLmFjdGlvbnMpIHtcbiAgICAgIEUob2ZmZXIuYWN0aW9ucykuaGFuZGxlZChvZmZlcik7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGRlY2xpbmVPZmZlcihpZCkge1xuICAgIGNvbnN0IG9mZmVyID0gaWRUb09mZmVyLmdldChpZCk7XG4gICAgaWYgKGNvbnN1bW1hdGVkKG9mZmVyKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vXG4gICAgY29uc3QgZGVjbGluZWRPZmZlciA9IGFkZE1ldGEoe1xuICAgICAgLi4ub2ZmZXIsXG4gICAgICBzdGF0dXM6ICdkZWNsaW5lJyxcbiAgICB9KTtcbiAgICBpZFRvT2ZmZXIuc2V0KGlkLCBkZWNsaW5lZE9mZmVyKTtcbiAgICB2b2lkIHVwZGF0ZUluYm94U3RhdGUoaWQsIGRlY2xpbmVkT2ZmZXIpO1xuXG4gICAgLy9cbiAgICBjb25zdCBjb21waWxlZE9mZmVyUCA9IGlkVG9Db21waWxlZE9mZmVyUC5nZXQoaWQpO1xuICAgIGlmICghY29tcGlsZWRPZmZlclApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBhd2FpdCBhZGRQYXltZW50KEUuZ2V0KGNvbXBpbGVkT2ZmZXJQKS5pbnZpdGVQKS5jYXRjaChjb25zb2xlLmVycm9yKTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGNhbmNlbE9mZmVyKGlkKSB7XG4gICAgY29uc3QgY29tcGxldGVGbiA9IGlkVG9Db21wbGV0ZS5nZXQoaWQpO1xuICAgIGlmICghY29tcGxldGVGbikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbXBsZXRlRm4oKVxuICAgICAgLnRoZW4oXyA9PiB7XG4gICAgICAgIGlkVG9Db21wbGV0ZS5kZWxldGUoaWQpO1xuICAgICAgICBjb25zdCBvZmZlciA9IGlkVG9PZmZlci5nZXQoaWQpO1xuICAgICAgICBjb25zdCBjYW5jZWxsZWRPZmZlciA9IGFkZE1ldGEoe1xuICAgICAgICAgIC4uLm9mZmVyLFxuICAgICAgICAgIHN0YXR1czogJ2NhbmNlbCcsXG4gICAgICAgIH0pO1xuICAgICAgICBpZFRvT2ZmZXIuc2V0KGlkLCBjYW5jZWxsZWRPZmZlcik7XG4gICAgICAgIHJldHVybiB1cGRhdGVJbmJveFN0YXRlKGlkLCBjYW5jZWxsZWRPZmZlcik7XG4gICAgICB9KVxuICAgICAgLmNhdGNoKGUgPT4gY29uc29sZS5lcnJvcihgQ2Fubm90IGNhbmNlbCBvZmZlciAke2lkfTpgLCBlKSk7XG5cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGFjY2VwdE9mZmVyKGlkKSB7XG4gICAgY29uc3Qgb2ZmZXIgPSBpZFRvT2ZmZXIuZ2V0KGlkKTtcbiAgICBpZiAoY29uc3VtbWF0ZWQob2ZmZXIpKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgbGV0IHJldCA9IHt9O1xuICAgIGxldCBhbHJlYWR5UmVzb2x2ZWQgPSBmYWxzZTtcbiAgICBjb25zdCByZWplY3RlZCA9IGUgPT4ge1xuICAgICAgaWYgKGFscmVhZHlSZXNvbHZlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCByZWplY3RPZmZlciA9IGFkZE1ldGEoe1xuICAgICAgICAuLi5vZmZlcixcbiAgICAgICAgc3RhdHVzOiAncmVqZWN0ZWQnLFxuICAgICAgICBlcnJvcjogYCR7ZX1gLFxuICAgICAgfSk7XG4gICAgICBpZFRvT2ZmZXIuc2V0KGlkLCByZWplY3RPZmZlcik7XG4gICAgICB2b2lkIHVwZGF0ZUluYm94U3RhdGUoaWQsIHJlamVjdE9mZmVyKTtcbiAgICB9O1xuXG4gICAgYXdhaXQgbnVsbDtcbiAgICB0cnkge1xuICAgICAgY29uc3QgcGVuZGluZ09mZmVyID0gYWRkTWV0YSh7XG4gICAgICAgIC4uLm9mZmVyLFxuICAgICAgICBzdGF0dXM6ICdwZW5kaW5nJyxcbiAgICAgIH0pO1xuICAgICAgaWRUb09mZmVyLnNldChpZCwgcGVuZGluZ09mZmVyKTtcbiAgICAgIHZvaWQgdXBkYXRlSW5ib3hTdGF0ZShpZCwgcGVuZGluZ09mZmVyKTtcbiAgICAgIGNvbnN0IGNvbXBpbGVkT2ZmZXIgPSBhd2FpdCBpZFRvQ29tcGlsZWRPZmZlclAuZ2V0KGlkKTtcblxuICAgICAgY29uc3QgeyBkZXBvc2l0ZWRQLCBzZWF0IH0gPSBhd2FpdCBleGVjdXRlT2ZmZXIoY29tcGlsZWRPZmZlcik7XG5cbiAgICAgIGlkVG9Db21wbGV0ZS5zZXQoaWQsICgpID0+IHtcbiAgICAgICAgYWxyZWFkeVJlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIEUoc2VhdCkudHJ5RXhpdCgpO1xuICAgICAgfSk7XG4gICAgICBpZFRvU2VhdC5zZXQoaWQsIHNlYXQpO1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICB2b2lkIEUoc2VhdClcbiAgICAgICAgLmhhc0V4aXRlZCgpXG4gICAgICAgIC50aGVuKGV4aXRlZCA9PiB7XG4gICAgICAgICAgaWYgKCFleGl0ZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzdWJzY3JpYmVUb1VwZGF0ZXMoaWQsIHNlYXQpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IG9mZmVyUmVzdWx0UCA9IEUoc2VhdCkuZ2V0T2ZmZXJSZXN1bHQoKTtcbiAgICAgIGlkVG9PZmZlclJlc3VsdFByb21pc2VLaXQuZ2V0KGlkKS5yZXNvbHZlKG9mZmVyUmVzdWx0UCk7XG5cbiAgICAgIHJldCA9IHtcbiAgICAgICAgZGVwb3NpdGVkUCxcbiAgICAgICAgZGFwcENvbnRleHQ6IG9mZmVyLmRhcHBDb250ZXh0LFxuICAgICAgfTtcblxuICAgICAgLy9cbiAgICAgIGRlcG9zaXRlZFBcbiAgICAgICAgLnRoZW4oXyA9PiB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICBpZiAoIWFscmVhZHlSZXNvbHZlZCkge1xuICAgICAgICAgICAgYWxyZWFkeVJlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgICAgIGNvbnN0IGFjY2VwdGVkT2ZmZXIgPSBhZGRNZXRhKHtcbiAgICAgICAgICAgICAgLi4ucGVuZGluZ09mZmVyLFxuICAgICAgICAgICAgICBzdGF0dXM6ICdhY2NlcHQnLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZFRvT2ZmZXIuc2V0KGlkLCBhY2NlcHRlZE9mZmVyKTtcbiAgICAgICAgICAgIHZvaWQgdXBkYXRlSW5ib3hTdGF0ZShpZCwgYWNjZXB0ZWRPZmZlcik7XG4gICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2gocmVqZWN0ZWQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGlmIChvZmZlci5hY3Rpb25zKSB7XG4gICAgICAgIEUob2ZmZXIuYWN0aW9ucykuZXJyb3Iob2ZmZXIsIGUpO1xuICAgICAgfVxuICAgICAgcmVqZWN0ZWQoZSk7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBpZFRvUGF5bWVudFJlY29yZCA9IG1ha2VTY2FsYXJNYXBTdG9yZSgncGF5bWVudElkJyk7XG4gIGNvbnN0IHsgdXBkYXRlcjogcGF5bWVudHNVcGRhdGVyLCBub3RpZmllcjogcGF5bWVudHNOb3RpZmllciB9ID1cbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChtYWtlTm90aWZpZXJLaXQoW10pKTtcbiAgLypcblxuICAgKi9cbiAgY29uc3QgdXBkYXRlUGF5bWVudFJlY29yZCA9ICh7IGFjdGlvbnMsIC4uLnByZURpc3BsYXkgfSkgPT4ge1xuICAgIC8vXG4gICAgLy9cbiAgICBkZWxldGUgcHJlRGlzcGxheS5kaXNwbGF5UGF5bWVudDtcbiAgICBjb25zdCBkaXNwbGF5UGF5bWVudCA9IGZpbGxJblNsb3RzKGRlaHlkcmF0ZShoYXJkZW4ocHJlRGlzcGxheSkpKTtcbiAgICBjb25zdCBwYXltZW50UmVjb3JkID0gYWRkTWV0YSh7XG4gICAgICAuLi5wcmVEaXNwbGF5LFxuICAgICAgYWN0aW9ucyxcbiAgICAgIGRpc3BsYXlQYXltZW50LFxuICAgIH0pO1xuICAgIGNvbnN0IHsgaWQgfSA9IHBheW1lbnRSZWNvcmQubWV0YTtcbiAgICBpZFRvUGF5bWVudFJlY29yZC5zZXQoaWQsIGhhcmRlbihwYXltZW50UmVjb3JkKSk7XG4gICAgcGF5bWVudHNVcGRhdGVyLnVwZGF0ZVN0YXRlKFtwYXltZW50UmVjb3JkXSk7XG4gIH07XG5cbiAgY29uc3QgbWFrZVBheW1lbnRBY3Rpb25zRm9ySWQgPSBpZCA9PlxuICAgIG1ha2VQYXltZW50QWN0aW9ucyh7XG4gICAgICBnZXRSZWNvcmQ6ICgpID0+IGlkVG9QYXltZW50UmVjb3JkLmdldChpZCksXG4gICAgICB1cGRhdGVSZWNvcmQ6IChyZWNvcmQsIHdpdGhvdXRNZXRhID0ge30pID0+IHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgdXBkYXRlUGF5bWVudFJlY29yZCh7IC4uLndpdGhvdXRNZXRhLCAuLi5hZGRNZXRhKHJlY29yZCkgfSk7XG4gICAgICB9LFxuICAgICAgZ2V0QnJhbmRSZWNvcmQ6IGJyYW5kID0+XG4gICAgICAgIGJyYW5kVGFibGUuaGFzQnlCcmFuZChicmFuZCkgJiYgYnJhbmRUYWJsZS5nZXRCeUJyYW5kKGJyYW5kKSxcbiAgICAgIGdldFB1cnNlQnlQZXRuYW1lOiBwZXRuYW1lID0+IHB1cnNlTWFwcGluZy5wZXRuYW1lVG9WYWwuZ2V0KHBldG5hbWUpLFxuICAgICAgZ2V0QXV0b0RlcG9zaXRQdXJzZTogYiA9PlxuICAgICAgICBicmFuZFRvQXV0b0RlcG9zaXRQdXJzZS5oYXMoYilcbiAgICAgICAgICA/IGJyYW5kVG9BdXRvRGVwb3NpdFB1cnNlLmdldChiKVxuICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgZ2V0SXNzdWVyQm9hcmRJZDogaXNzdWVyVG9Cb2FyZElkLmdldCxcbiAgICB9KTtcblxuICAvKlxuXG5cbiAgICovXG4gIGNvbnN0IGFkZFBheW1lbnQgPSBhc3luYyAocGF5bWVudFAsIGRlcG9zaXRUbyA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIC8vXG4gICAgY29uc3QgW3BheW1lbnQsIGJyYW5kXSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHBheW1lbnRQLFxuICAgICAgRShwYXltZW50UCkuZ2V0QWxsZWdlZEJyYW5kKCksXG4gICAgXSk7XG5cbiAgICBjb25zdCBiYXNlUGF5bWVudFJlY29yZCA9IGFkZE1ldGEoe1xuICAgICAgcGF5bWVudCxcbiAgICAgIGJyYW5kLFxuICAgIH0pO1xuICAgIGNvbnN0IHsgaWQgfSA9IGJhc2VQYXltZW50UmVjb3JkLm1ldGE7XG5cbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgcGF5bWVudFJlY29yZCA9IHtcbiAgICAgIC4uLmJhc2VQYXltZW50UmVjb3JkLFxuICAgICAgYWN0aW9uczogbWFrZVBheW1lbnRBY3Rpb25zRm9ySWQoaWQpLFxuICAgIH07XG4gICAgaWRUb1BheW1lbnRSZWNvcmQuaW5pdChpZCwgaGFyZGVuKHBheW1lbnRSZWNvcmQpKTtcblxuICAgIGNvbnN0IHJlZnJlc2hlZCA9IGF3YWl0IHBheW1lbnRSZWNvcmQuYWN0aW9ucy5yZWZyZXNoKCk7XG4gICAgaWYgKCFyZWZyZXNoZWQpIHtcbiAgICAgIC8vXG4gICAgICB1cGRhdGVQYXltZW50UmVjb3JkKHBheW1lbnRSZWNvcmQpO1xuICAgIH1cblxuICAgIC8vXG4gICAgYXdhaXQgcGF5bWVudFJlY29yZC5hY3Rpb25zLmRlcG9zaXQoZGVwb3NpdFRvKTtcbiAgfTtcblxuICBsZXQgc2VsZkNvbnRhY3RQO1xuICBhc3luYyBmdW5jdGlvbiBnZXREZXBvc2l0RmFjZXRJZChfYnJhbmRCb2FyZElkKSB7XG4gICAgLy9cbiAgICByZXR1cm4gRS5nZXQoc2VsZkNvbnRhY3RQKS5kZXBvc2l0Qm9hcmRJZDtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGRpc2FibGVBdXRvRGVwb3NpdChwdXJzZVBldG5hbWUpIHtcbiAgICBjb25zdCBwdXJzZSA9IHB1cnNlTWFwcGluZy5wZXRuYW1lVG9WYWwuZ2V0KHB1cnNlUGV0bmFtZSk7XG4gICAgY29uc3QgYnJhbmQgPSBwdXJzZVRvQnJhbmQuZ2V0KHB1cnNlKTtcbiAgICBpZiAoXG4gICAgICAhYnJhbmRUb0F1dG9EZXBvc2l0UHVyc2UuaGFzKGJyYW5kKSB8fFxuICAgICAgYnJhbmRUb0F1dG9EZXBvc2l0UHVyc2UuZ2V0KGJyYW5kKSAhPT0gcHVyc2VcbiAgICApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBicmFuZFRvQXV0b0RlcG9zaXRQdXJzZS5kZWxldGUoYnJhbmQpO1xuICAgIGF3YWl0IHVwZGF0ZUFsbFB1cnNlU3RhdGUoKTtcbiAgfVxuXG4gIGNvbnN0IHBlbmRpbmdFbmFibGVBdXRvRGVwb3NpdHMgPSBtYWtlU2NhbGFyTWFwU3RvcmUoJ2JyYW5kJyk7XG4gIGFzeW5jIGZ1bmN0aW9uIGRvRW5hYmxlQXV0b0RlcG9zaXQocHVyc2VQZXRuYW1lLCB1cGRhdGVTdGF0ZSkge1xuICAgIGNvbnN0IHB1cnNlID0gcHVyc2VNYXBwaW5nLnBldG5hbWVUb1ZhbC5nZXQocHVyc2VQZXRuYW1lKTtcbiAgICBjb25zdCBicmFuZCA9IHB1cnNlVG9CcmFuZC5nZXQocHVyc2UpO1xuICAgIGlmIChicmFuZFRvQXV0b0RlcG9zaXRQdXJzZS5oYXMoYnJhbmQpKSB7XG4gICAgICBicmFuZFRvQXV0b0RlcG9zaXRQdXJzZS5zZXQoYnJhbmQsIHB1cnNlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYnJhbmRUb0F1dG9EZXBvc2l0UHVyc2UuaW5pdChicmFuZCwgcHVyc2UpO1xuICAgIH1cblxuICAgIGF3YWl0IG51bGw7XG4gICAgaWYgKHVwZGF0ZVN0YXRlKSB7XG4gICAgICBhd2FpdCB1cGRhdGVBbGxQdXJzZVN0YXRlKCk7XG4gICAgfVxuXG4gICAgY29uc3QgcGVuZGluZ1AgPVxuICAgICAgcGVuZGluZ0VuYWJsZUF1dG9EZXBvc2l0cy5oYXMoYnJhbmQpICYmXG4gICAgICBwZW5kaW5nRW5hYmxlQXV0b0RlcG9zaXRzLmdldChicmFuZCk7XG4gICAgaWYgKHBlbmRpbmdQKSB7XG4gICAgICByZXR1cm4gcGVuZGluZ1A7XG4gICAgfVxuXG4gICAgY29uc3QgYm9hcmRJZFAgPSBFLmdldChzZWxmQ29udGFjdFApLmRlcG9zaXRCb2FyZElkO1xuICAgIHBlbmRpbmdFbmFibGVBdXRvRGVwb3NpdHMuaW5pdChicmFuZCwgYm9hcmRJZFApO1xuICAgIGNvbnN0IGJvYXJkSWQgPSBhd2FpdCBib2FyZElkUDtcbiAgICBicmFuZFRvRGVwb3NpdEZhY2V0SWQuaW5pdChicmFuZCwgYm9hcmRJZCk7XG5cbiAgICBpZiAodXBkYXRlU3RhdGUpIHtcbiAgICAgIGF3YWl0IHVwZGF0ZUFsbFB1cnNlU3RhdGUoKTtcbiAgICB9XG4gICAgcmV0dXJuIGJvYXJkSWRQO1xuICB9XG5cbiAgLypcblxuXG5cblxuICAgKi9cbiAgZnVuY3Rpb24gYWNjZXB0UGV0bmFtZShcbiAgICBhY2NlcHRGbixcbiAgICBzdWdnZXN0ZWRQZXRuYW1lLFxuICAgIGJvYXJkSWQsXG4gICAgZGFwcE9yaWdpbiA9IHVuZGVmaW5lZCxcbiAgKSB7XG4gICAgLyogICAgICAgICAgICAgICAgICAqL1xuICAgIGxldCBwZXRuYW1lO1xuICAgIGlmIChkYXBwT3JpZ2luID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHBldG5hbWUgPSBzdWdnZXN0ZWRQZXRuYW1lO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBlZGdlbmFtZSA9IGVkZ2VNYXBwaW5nLnZhbFRvUGV0bmFtZS5nZXQoZGFwcE9yaWdpbik7XG4gICAgICAvL1xuICAgICAgcGV0bmFtZSA9IFtlZGdlbmFtZSwgc3VnZ2VzdGVkUGV0bmFtZV07XG4gICAgfVxuXG4gICAgcmV0dXJuIEUoYm9hcmQpXG4gICAgICAuZ2V0VmFsdWUoYm9hcmRJZClcbiAgICAgIC50aGVuKHZhbHVlID0+IHtcbiAgICAgICAgY29udGV4dC5lbnN1cmVCb2FyZElkKGJvYXJkSWQsIHZhbHVlKTtcbiAgICAgICAgcmV0dXJuIGFjY2VwdEZuKHBldG5hbWUsIHZhbHVlKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgLypcblxuXG5cbiAgICovXG4gIGFzeW5jIGZ1bmN0aW9uIHN1Z2dlc3RJc3N1ZXIoXG4gICAgc3VnZ2VzdGVkUGV0bmFtZSxcbiAgICBpc3N1ZXJCb2FyZElkLFxuICAgIGRhcHBPcmlnaW4gPSB1bmRlZmluZWQsXG4gICkge1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIHJldHVybiBhY2NlcHRQZXRuYW1lKFxuICAgICAgLy9cbiAgICAgIChwZXRuYW1lLCB2YWx1ZSkgPT4gYWRkSXNzdWVyKHBldG5hbWUsIHZhbHVlLCB0cnVlKSxcbiAgICAgIHN1Z2dlc3RlZFBldG5hbWUsXG4gICAgICBpc3N1ZXJCb2FyZElkLFxuICAgICAgZGFwcE9yaWdpbixcbiAgICApO1xuICB9XG5cbiAgLypcblxuXG5cbiAgICovXG4gIGFzeW5jIGZ1bmN0aW9uIHN1Z2dlc3RJbnN0YW5jZShcbiAgICBzdWdnZXN0ZWRQZXRuYW1lLFxuICAgIGluc3RhbmNlSGFuZGxlQm9hcmRJZCxcbiAgICBkYXBwT3JpZ2luID0gdW5kZWZpbmVkLFxuICApIHtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cblxuICAgIHJldHVybiBhY2NlcHRQZXRuYW1lKFxuICAgICAgYWRkSW5zdGFuY2UsXG4gICAgICBzdWdnZXN0ZWRQZXRuYW1lLFxuICAgICAgaW5zdGFuY2VIYW5kbGVCb2FyZElkLFxuICAgICAgZGFwcE9yaWdpbixcbiAgICApO1xuICB9XG5cbiAgLypcblxuXG5cbiAgICovXG4gIGFzeW5jIGZ1bmN0aW9uIHN1Z2dlc3RJbnN0YWxsYXRpb24oXG4gICAgc3VnZ2VzdGVkUGV0bmFtZSxcbiAgICBpbnN0YWxsYXRpb25IYW5kbGVCb2FyZElkLFxuICAgIGRhcHBPcmlnaW4gPSB1bmRlZmluZWQsXG4gICkge1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIHJldHVybiBhY2NlcHRQZXRuYW1lKFxuICAgICAgaW5zdGFsbGF0aW9uTWFuYWdlci5hZGQsXG4gICAgICBzdWdnZXN0ZWRQZXRuYW1lLFxuICAgICAgaW5zdGFsbGF0aW9uSGFuZGxlQm9hcmRJZCxcbiAgICAgIGRhcHBPcmlnaW4sXG4gICAgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEJyYW5kKHBldG5hbWUpIHtcbiAgICBjb25zdCBicmFuZCA9IGJyYW5kTWFwcGluZy5wZXRuYW1lVG9WYWwuZ2V0KHBldG5hbWUpO1xuICAgIHJldHVybiBicmFuZDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEJyYW5kUGV0bmFtZXMoYnJhbmRzKSB7XG4gICAgcmV0dXJuIGJyYW5kcy5tYXAoYnJhbmRNYXBwaW5nLnZhbFRvUGV0bmFtZS5nZXQpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0U2VsZkNvbnRhY3QoKSB7XG4gICAgcmV0dXJuIHNlbGZDb250YWN0UDtcbiAgfVxuXG4gIGNvbnN0IG1ha2VNYW5hZ2VyID0gKHBldG5hbWVNYXBwaW5nLCBtYW5hZ2VyVHlwZSkgPT4ge1xuICAgIGNvbnN0IG1hbmFnZXIgPSBGYXIobWFuYWdlclR5cGUsIHtcbiAgICAgIHJlbmFtZTogYXN5bmMgKHBldG5hbWUsIHRoaW5nKSA9PiB7XG4gICAgICAgIHBldG5hbWVNYXBwaW5nLnJlbmFtZVBldG5hbWUocGV0bmFtZSwgdGhpbmcpO1xuICAgICAgICBhd2FpdCB1cGRhdGVBbGxTdGF0ZSgpO1xuICAgICAgfSxcbiAgICAgIGdldDogcGV0bmFtZU1hcHBpbmcucGV0bmFtZVRvVmFsLmdldCxcbiAgICAgIGdldEFsbDogcGV0bmFtZU1hcHBpbmcucGV0bmFtZVRvVmFsLmVudHJpZXMsXG4gICAgICBhZGQ6IGFzeW5jIChwZXRuYW1lLCB0aGluZykgPT4ge1xuICAgICAgICBwZXRuYW1lTWFwcGluZy5zdWdnZXN0UGV0bmFtZShwZXRuYW1lLCB0aGluZyk7XG4gICAgICAgIGF3YWl0IHVwZGF0ZUFsbFN0YXRlKCk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHJldHVybiBtYW5hZ2VyO1xuICB9O1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgaW5zdGFsbGF0aW9uTWFuYWdlciA9IG1ha2VNYW5hZ2VyKFxuICAgIGluc3RhbGxhdGlvbk1hcHBpbmcsXG4gICAgJ0luc3RhbGxhdGlvbk1hbmFnZXInLFxuICApO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBpbnN0YW5jZU1hbmFnZXIgPSBtYWtlTWFuYWdlcihpbnN0YW5jZU1hcHBpbmcsICdJbnN0YW5jZU1hbmFnZXInKTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGlzc3Vlck1hbmFnZXIgPSBGYXIoJ0lzc3Vlck1hbmFnZXInLCB7XG4gICAgcmVuYW1lOiBhc3luYyAocGV0bmFtZSwgaXNzdWVyKSA9PiB7XG4gICAgICBicmFuZFRhYmxlLmhhc0J5SXNzdWVyKGlzc3VlcikgfHxcbiAgICAgICAgRmFpbGBpc3N1ZXIgaGFzIG5vdCBiZWVuIHByZXZpb3VzbHkgYWRkZWRgO1xuICAgICAgY29uc3QgYnJhbmRSZWNvcmQgPSBicmFuZFRhYmxlLmdldEJ5SXNzdWVyKGlzc3Vlcik7XG4gICAgICBicmFuZE1hcHBpbmcucmVuYW1lUGV0bmFtZShwZXRuYW1lLCBicmFuZFJlY29yZC5icmFuZCk7XG4gICAgICBhd2FpdCB1cGRhdGVBbGxTdGF0ZSgpO1xuICAgIH0sXG4gICAgZ2V0OiBwZXRuYW1lID0+IHtcbiAgICAgIGNvbnN0IGJyYW5kID0gYnJhbmRNYXBwaW5nLnBldG5hbWVUb1ZhbC5nZXQocGV0bmFtZSk7XG4gICAgICByZXR1cm4gYnJhbmRUYWJsZS5nZXRCeUJyYW5kKGJyYW5kKS5pc3N1ZXI7XG4gICAgfSxcbiAgICBnZXRBbGw6ICgpID0+IHtcbiAgICAgIHJldHVybiBbLi4uYnJhbmRNYXBwaW5nLnBldG5hbWVUb1ZhbC5lbnRyaWVzKCldLm1hcChcbiAgICAgICAgKFtwZXRuYW1lLCBicmFuZF0pID0+IHtcbiAgICAgICAgICBjb25zdCB7IGlzc3VlciB9ID0gYnJhbmRUYWJsZS5nZXRCeUJyYW5kKGJyYW5kKTtcbiAgICAgICAgICByZXR1cm4gW3BldG5hbWUsIGlzc3Vlcl07XG4gICAgICAgIH0sXG4gICAgICApO1xuICAgIH0sXG4gICAgYWRkOiBhc3luYyAocGV0bmFtZSwgaXNzdWVyUCkgPT4ge1xuICAgICAgY29uc3QgeyBicmFuZCwgaXNzdWVyIH0gPSBhd2FpdCBicmFuZFRhYmxlLmluaXRJc3N1ZXIoaXNzdWVyUCwgYWRkTWV0YSk7XG4gICAgICBhd2FpdCBpbml0SXNzdWVyVG9Cb2FyZElkKGlzc3VlciwgYnJhbmQpO1xuICAgICAgYnJhbmRNYXBwaW5nLnN1Z2dlc3RQZXRuYW1lKHBldG5hbWUsIGJyYW5kKTtcbiAgICAgIGF3YWl0IHVwZGF0ZUFsbElzc3VlcnNTdGF0ZSgpO1xuICAgIH0sXG4gIH0pO1xuXG4gIGZ1bmN0aW9uIGdldEluc3RhbGxhdGlvbk1hbmFnZXIoKSB7XG4gICAgcmV0dXJuIGluc3RhbGxhdGlvbk1hbmFnZXI7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRJbnN0YW5jZU1hbmFnZXIoKSB7XG4gICAgcmV0dXJuIGluc3RhbmNlTWFuYWdlcjtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldElzc3Vlck1hbmFnZXIoKSB7XG4gICAgcmV0dXJuIGlzc3Vlck1hbmFnZXI7XG4gIH1cblxuICBhc3luYyBmdW5jdGlvbiBzYXZlT2ZmZXJSZXN1bHQoaW52aXRhdGlvbkhhbmRsZSwgb2ZmZXJSZXN1bHQpIHtcbiAgICBpbnZpdGF0aW9uSGFuZGxlVG9PZmZlclJlc3VsdC5pbml0KGludml0YXRpb25IYW5kbGUsIG9mZmVyUmVzdWx0KTtcbiAgfVxuXG4gIGFzeW5jIGZ1bmN0aW9uIGdldE9mZmVyUmVzdWx0KGludml0YXRpb25IYW5kbGUpIHtcbiAgICByZXR1cm4gaW52aXRhdGlvbkhhbmRsZVRvT2ZmZXJSZXN1bHQuZ2V0KGludml0YXRpb25IYW5kbGUpO1xuICB9XG5cbiAgLypcblxuXG5cblxuXG4gICAqL1xuICBhc3luYyBmdW5jdGlvbiBnZXRVSU5vdGlmaWVyKHJhd0lkLCBkYXBwT3JpZ2luID0gJ3Vua25vd24nKSB7XG4gICAgY29uc3QgaWQgPSBtYWtlSWQoZGFwcE9yaWdpbiwgcmF3SWQpO1xuICAgIGNvbnN0IG9mZmVyUmVzdWx0ID0gYXdhaXQgaWRUb09mZmVyUmVzdWx0UHJvbWlzZUtpdC5nZXQoaWQpLnByb21pc2U7XG4gICAgYXNzZXJ0KFxuICAgICAgcGFzc1N0eWxlT2Yob2ZmZXJSZXN1bHQpID09PSAnY29weVJlY29yZCcsXG4gICAgICBgb2ZmZXJSZXN1bHQgbXVzdCBiZSBhIHJlY29yZCB0byBoYXZlIGEgdWlOb3RpZmllcmAsXG4gICAgKTtcbiAgICBvZmZlclJlc3VsdC51aU5vdGlmaWVyIHx8IEZhaWxgb2ZmZXJSZXN1bHQgZG9lcyBub3QgaGF2ZSBhIHVpTm90aWZpZXJgO1xuICAgIHJldHVybiBvZmZlclJlc3VsdC51aU5vdGlmaWVyO1xuICB9XG5cbiAgLypcblxuXG5cblxuXG5cbiAgICovXG4gIGFzeW5jIGZ1bmN0aW9uIGdldFB1YmxpY1N1YnNjcmliZXJzKHJhd0lkLCBkYXBwT3JpZ2luID0gJ3Vua25vd24nKSB7XG4gICAgY29uc3QgaWQgPSBtYWtlSWQoZGFwcE9yaWdpbiwgcmF3SWQpO1xuXG4gICAgY29uc3Qgb2ZmZXJSZXN1bHQgPSBhd2FpdCBpZFRvT2ZmZXJSZXN1bHRQcm9taXNlS2l0LmdldChpZCkucHJvbWlzZTtcbiAgICBhc3NlcnQoXG4gICAgICBwYXNzU3R5bGVPZihvZmZlclJlc3VsdCkgPT09ICdjb3B5UmVjb3JkJyxcbiAgICAgIGBvZmZlclJlc3VsdCAke29mZmVyUmVzdWx0fSBtdXN0IGJlIGEgcmVjb3JkIHRvIGhhdmUgcHVibGljU3Vic2NyaWJlcnNgLFxuICAgICk7XG5cbiAgICBjb25zdCB7IHB1YmxpY1N1YnNjcmliZXJzIH0gPSBvZmZlclJlc3VsdDtcbiAgICBwdWJsaWNTdWJzY3JpYmVycyB8fFxuICAgICAgRmFpbGBvZmZlclJlc3VsdCAke29mZmVyUmVzdWx0fSBkb2VzIG5vdCBoYXZlIHB1YmxpY1N1YnNjcmliZXJzYDtcbiAgICBwYXNzU3R5bGVPZihwdWJsaWNTdWJzY3JpYmVycykgPT09ICdjb3B5UmVjb3JkJyB8fFxuICAgICAgRmFpbGBwdWJsaWNTdWJzY3JpYmVycyAke3B1YmxpY1N1YnNjcmliZXJzfSBtdXN0IGJlIGEgcmVjb3JkYDtcblxuICAgIHJldHVybiBwdWJsaWNTdWJzY3JpYmVycztcbiAgfVxuXG4gIC8qXG5cblxuXG5cblxuXG4gICAqL1xuICBhc3luYyBmdW5jdGlvbiBnZXRQdWJsaWNOb3RpZmllcnMocmF3SWQsIGRhcHBPcmlnaW4gPSAndW5rbm93bicpIHtcbiAgICBjb25zdCBwdWJsaWNTdWJzY3JpYmVycyA9IGF3YWl0IGdldFB1YmxpY1N1YnNjcmliZXJzKHJhd0lkLCBkYXBwT3JpZ2luKTtcbiAgICByZXR1cm4gb2JqZWN0TWFwKHB1YmxpY1N1YnNjcmliZXJzLCBtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcik7XG4gIH1cblxuICAvL1xuICAvL1xuICBjb25zdCBjcmVhdGVSb290TG9va3VwcyA9ICgpID0+IHtcbiAgICBjb25zdCByb290UGF0aFRvTG9va3VwID0gbWFrZUxlZ2FjeU1hcCgnbG9va3VwcycpO1xuXG4gICAgLypcblxuXG4gICAgICovXG4gICAgY29uc3QgbWFrZUxvb2t1cCA9IChraW5kLCBsb29rdXApID0+IHtcbiAgICAgIHJvb3RQYXRoVG9Mb29rdXAuaW5pdChcbiAgICAgICAga2luZCxcbiAgICAgICAgRmFyKGAke2tpbmR9TG9va3VwYCwge1xuICAgICAgICAgIGxvb2t1cCxcbiAgICAgICAgfSksXG4gICAgICApO1xuICAgIH07XG5cbiAgICAvL1xuICAgIC8vXG4gICAgY29uc3QgcGV0bmFtZU9yUGF0aCA9XG4gICAgICBsb29rdXAgPT5cbiAgICAgICguLi5wYXRoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgaWYgKHBhdGgubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgcmV0dXJuIGxvb2t1cChwYXRoWzBdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAvL1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsb29rdXAocGF0aCk7XG4gICAgICB9O1xuXG4gICAgbWFrZUxvb2t1cCgnYnJhbmQnLCBwZXRuYW1lT3JQYXRoKGJyYW5kTWFwcGluZy5wZXRuYW1lVG9WYWwuZ2V0KSk7XG4gICAgbWFrZUxvb2t1cCgnY29udGFjdCcsIHBldG5hbWVPclBhdGgoY29udGFjdE1hcHBpbmcucGV0bmFtZVRvVmFsLmdldCkpO1xuICAgIG1ha2VMb29rdXAoJ2lzc3VlcicsIHBldG5hbWVPclBhdGgoaXNzdWVyTWFuYWdlci5nZXQpKTtcbiAgICBtYWtlTG9va3VwKCdpbnN0YW5jZScsIHBldG5hbWVPclBhdGgoaW5zdGFuY2VNYXBwaW5nLnBldG5hbWVUb1ZhbC5nZXQpKTtcbiAgICBtYWtlTG9va3VwKFxuICAgICAgJ2luc3RhbGxhdGlvbicsXG4gICAgICBwZXRuYW1lT3JQYXRoKGluc3RhbGxhdGlvbk1hcHBpbmcucGV0bmFtZVRvVmFsLmdldCksXG4gICAgKTtcbiAgICBtYWtlTG9va3VwKCdwdXJzZScsIHBldG5hbWVPclBhdGgocHVyc2VNYXBwaW5nLnBldG5hbWVUb1ZhbC5nZXQpKTtcblxuICAgIC8vXG4gICAgY29uc3QgaWRPbmx5ID1cbiAgICAgIChraW5kLCBsb29rdXApID0+XG4gICAgICAoLi4ucGF0aCkgPT4ge1xuICAgICAgICBwYXRoLmxlbmd0aCA9PT0gMSB8fFxuICAgICAgICAgIEZhaWxgJHtxKFxuICAgICAgICAgICAga2luZCxcbiAgICAgICAgICApfSBsb29rdXAgbXVzdCBiZSBjYWxsZWQgd2l0aCBhIHNpbmdsZSBvZmZlciBJRCwgbm90ICR7cGF0aH1gO1xuICAgICAgICByZXR1cm4gbG9va3VwKHBhdGhbMF0pO1xuICAgICAgfTtcbiAgICBtYWtlTG9va3VwKCdvZmZlcicsIGlkT25seSgnb2ZmZXInLCBpZFRvT2ZmZXIuZ2V0KSk7XG4gICAgbWFrZUxvb2t1cChcbiAgICAgICdvZmZlclJlc3VsdCcsXG4gICAgICBpZE9ubHkoJ29mZmVyUmVzdWx0JywgaWQgPT4gaWRUb09mZmVyUmVzdWx0UHJvbWlzZUtpdC5nZXQoaWQpLnByb21pc2UpLFxuICAgICk7XG5cbiAgICByZXR1cm4gcm9vdFBhdGhUb0xvb2t1cDtcbiAgfTtcblxuICBjb25zdCBmaXJzdFBhdGhUb0xvb2t1cCA9IGNyZWF0ZVJvb3RMb29rdXBzKCk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hcnNoYWxsZXIgPSBoYXJkZW4oe1xuICAgIGZyb21DYXBEYXRhOiBjb250ZXh0LmZyb21DYXBEYXRhLFxuICAgIHRvQ2FwRGF0YTogY29udGV4dC50b0NhcERhdGEsXG4gICAgdW5zZXJpYWxpemU6IGNvbnRleHQuZnJvbUNhcERhdGEsXG4gICAgc2VyaWFsaXplOiBjb250ZXh0LnRvQ2FwRGF0YSxcbiAgfSk7XG5cbiAgY29uc3QgaGFuZGxlQWNjZXB0T2ZmZXJBY3Rpb24gPSBhc3luYyBvZmZlciA9PiB7XG4gICAgY29uc3QgeyByZXF1ZXN0Q29udGV4dCB9ID0gb2ZmZXI7XG4gICAgY29uc3QgcmF3SWQgPSBhd2FpdCBhZGRPZmZlcihvZmZlciwgcmVxdWVzdENvbnRleHQpO1xuICAgIGNvbnN0IGRhcHBPcmlnaW4gPVxuICAgICAgcmVxdWVzdENvbnRleHQuZGFwcE9yaWdpbiB8fCByZXF1ZXN0Q29udGV4dC5vcmlnaW4gfHwgJ3Vua25vd24nO1xuICAgIHJldHVybiBhY2NlcHRPZmZlcihgJHtkYXBwT3JpZ2lufSMke3Jhd0lkfWApO1xuICB9O1xuXG4gIGNvbnN0IGhhbmRsZVN1Z2dlc3RJc3N1ZXJBY3Rpb24gPSAoeyBwZXRuYW1lLCBib2FyZElkIH0pID0+XG4gICAgc3VnZ2VzdElzc3VlcihwZXRuYW1lLCBib2FyZElkKTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIC8qXG5cblxuICAgKi9cbiAgY29uc3QgcGVyZm9ybUFjdGlvbiA9IG9iaiA9PiB7XG4gICAgY29uc3QgeyB0eXBlLCBkYXRhIH0gPSBKU09OLnBhcnNlKG9iai5zcGVuZEFjdGlvbik7XG4gICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICBjYXNlICdhY2NlcHRPZmZlcic6XG4gICAgICAgIHJldHVybiBoYW5kbGVBY2NlcHRPZmZlckFjdGlvbihkYXRhKTtcbiAgICAgIGNhc2UgJ3N1Z2dlc3RJc3N1ZXInOlxuICAgICAgICByZXR1cm4gaGFuZGxlU3VnZ2VzdElzc3VlckFjdGlvbihkYXRhKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHRocm93IEVycm9yKGBVbmtub3duIHdhbGxldCBhY3Rpb24gJHt0eXBlfWApO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCB3YWxsZXQgPSBGYXIoJ3dhbGxldCcsIHtcbiAgICBsb29rdXA6ICguLi5wYXRoKSA9PiB7XG4gICAgICAvL1xuICAgICAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB3YWxsZXQ7XG4gICAgICB9XG4gICAgICBjb25zdCBbZmlyc3QsIC4uLnJlbWFpbmluZ10gPSBwYXRoO1xuICAgICAgY29uc3QgZmlyc3RWYWx1ZSA9IGZpcnN0UGF0aFRvTG9va3VwLmdldChmaXJzdCk7XG4gICAgICBpZiAocmVtYWluaW5nLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gZmlyc3RWYWx1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBFKGZpcnN0VmFsdWUpLmxvb2t1cCguLi5yZW1haW5pbmcpO1xuICAgIH0sXG4gICAgZ2V0TWFyc2hhbGxlcjogKCkgPT4gbWFyc2hhbGxlcixcbiAgICBnZXREYXBwQ2FjaGVDb29yZGluYXRvcjogZGFwcE9yaWdpbiA9PlxuICAgICAgZGFwcE9yaWdpbnMuZ2V0KGRhcHBPcmlnaW4pLmNhY2hlQ29vcmRpbmF0b3IsXG4gICAgZ2V0Q2FjaGVDb29yZGluYXRvcjogKCkgPT4gc2hhcmVkQ2FjaGVDb29yZGluYXRvcixcbiAgICBzYXZlT2ZmZXJSZXN1bHQsXG4gICAgZ2V0T2ZmZXJSZXN1bHQsXG4gICAgd2FpdEZvckRhcHBBcHByb3ZhbCxcbiAgICBnZXREYXBwc05vdGlmaWVyKCkge1xuICAgICAgcmV0dXJuIGRhcHBzTm90aWZpZXI7XG4gICAgfSxcbiAgICBnZXRQdXJzZXNOb3RpZmllcigpIHtcbiAgICAgIHJldHVybiBwdXJzZXNOb3RpZmllcjtcbiAgICB9LFxuICAgIGdldEF0dGVudWF0ZWRQdXJzZXNOb3RpZmllcigpIHtcbiAgICAgIHJldHVybiBhdHRlbnVhdGVkUHVyc2VzTm90aWZpZXI7XG4gICAgfSxcbiAgICBnZXRJc3N1ZXJzTm90aWZpZXIoKSB7XG4gICAgICByZXR1cm4gaXNzdWVyc05vdGlmaWVyO1xuICAgIH0sXG4gICAgZ2V0T2ZmZXJzTm90aWZpZXIoKSB7XG4gICAgICByZXR1cm4gb2ZmZXJzTm90aWZpZXI7XG4gICAgfSxcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBhZGRJc3N1ZXI6IGlzc3Vlck1hbmFnZXIuYWRkLFxuICAgIGdldEJyYW5kLFxuICAgIGdldEJyYW5kUGV0bmFtZXMsXG4gICAgcHVibGlzaElzc3VlcixcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGFkZEluc3RhbmNlOiBpbnN0YW5jZU1hbmFnZXIuYWRkLFxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGFkZEluc3RhbGxhdGlvbjogaW5zdGFsbGF0aW9uTWFuYWdlci5hZGQsXG4gICAgZ2V0SW5zdGFsbGF0aW9uTWFuYWdlcixcbiAgICBnZXRJbnN0YW5jZU1hbmFnZXIsXG4gICAgZ2V0SXNzdWVyTWFuYWdlcixcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICByZW5hbWVJc3N1ZXI6IGlzc3Vlck1hbmFnZXIucmVuYW1lLFxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgcmVuYW1lSW5zdGFuY2U6IGluc3RhbmNlTWFuYWdlci5yZW5hbWUsXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgcmVuYW1lSW5zdGFsbGF0aW9uOiBpbnN0YWxsYXRpb25NYW5hZ2VyLnJlbmFtZSxcbiAgICBnZXRTZWxmQ29udGFjdCxcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGdldEluc3RhbmNlOiBpbnN0YW5jZU1hbmFnZXIuZ2V0LFxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGdldEluc3RhbGxhdGlvbjogaW5zdGFsbGF0aW9uTWFuYWdlci5nZXQsXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgZ2V0SW5zdGFsbGF0aW9uczogaW5zdGFsbGF0aW9uTWFuYWdlci5nZXRBbGwsXG4gICAgbWFrZUVtcHR5UHVyc2UsXG4gICAgZGVwb3NpdCxcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBnZXRJc3N1ZXI6IGlzc3Vlck1hbmFnZXIuZ2V0LFxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGdldElzc3VlcnM6IGlzc3Vlck1hbmFnZXIuZ2V0QWxsLFxuICAgIGdldFB1cnNlcyxcbiAgICBnZXRQdXJzZSxcbiAgICBnZXRQdXJzZUlzc3VlcixcbiAgICBhZGRPZmZlcixcbiAgICBkZWNsaW5lT2ZmZXIsXG4gICAgY2FuY2VsT2ZmZXIsXG4gICAgYWNjZXB0T2ZmZXIsXG4gICAgZ2V0T2ZmZXJzLFxuICAgIGdldFNlYXQ6IGlkID0+IGlkVG9TZWF0LmdldChpZCksXG4gICAgZ2V0U2VhdHM6IGlkcyA9PiBpZHMubWFwKHdhbGxldC5nZXRTZWF0KSxcbiAgICBlbmFibGVBdXRvRGVwb3NpdChwdXJzZVBldG5hbWUpIHtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gZG9FbmFibGVBdXRvRGVwb3NpdChwdXJzZVBldG5hbWUsIHRydWUpO1xuICAgIH0sXG4gICAgZGlzYWJsZUF1dG9EZXBvc2l0LFxuICAgIHBlcmZvcm1BY3Rpb24sXG4gICAgZ2V0RGVwb3NpdEZhY2V0SWQsXG4gICAgc3VnZ2VzdElzc3VlcixcbiAgICBzdWdnZXN0SW5zdGFuY2UsXG4gICAgc3VnZ2VzdEluc3RhbGxhdGlvbixcbiAgICBhZGRDb250YWN0LFxuICAgIGdldENvbnRhY3RzTm90aWZpZXIoKSB7XG4gICAgICByZXR1cm4gY29udGFjdHNOb3RpZmllcjtcbiAgICB9LFxuICAgIGFkZFBheW1lbnQsXG4gICAgZ2V0UGF5bWVudHNOb3RpZmllcigpIHtcbiAgICAgIHJldHVybiBwYXltZW50c05vdGlmaWVyO1xuICAgIH0sXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgZ2V0VUlOb3RpZmllcixcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBnZXRQdWJsaWNOb3RpZmllcnMsXG4gICAgZ2V0UHVibGljU3Vic2NyaWJlcnMsXG4gICAgZ2V0Wm9lKCkge1xuICAgICAgcmV0dXJuIHpvZTtcbiAgICB9LFxuICAgIGdldEJvYXJkKCkge1xuICAgICAgcmV0dXJuIGJvYXJkO1xuICAgIH0sXG4gICAgZ2V0QWdvcmljTmFtZXMoLi4ucGF0aCkge1xuICAgICAgaWYgKCFhZ29yaWNOYW1lcykge1xuICAgICAgICB0aHJvdyBGYWlsYGFnb3JpY05hbWVzIHdhcyBub3Qgc3VwcGxpZWQgdG8gdGhlIHdhbGxldCBtYWtlcmA7XG4gICAgICB9XG4gICAgICByZXR1cm4gRShhZ29yaWNOYW1lcykubG9va3VwKC4uLnBhdGgpO1xuICAgIH0sXG4gICAgZ2V0TmFtZXNCeUFkZHJlc3MoLi4ucGF0aCkge1xuICAgICAgaWYgKG5hbWVzQnlBZGRyZXNzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgdGhyb3cgRmFpbGBuYW1lc0J5QWRkcmVzcyB3YXMgbm90IHN1cHBsaWVkIHRvIHRoZSB3YWxsZXQgbWFrZXJgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIEUobmFtZXNCeUFkZHJlc3MpLmxvb2t1cCguLi5wYXRoKTtcbiAgICB9LFxuICB9KTtcblxuICBjb25zdCBpbml0aWFsaXplID0gYXN5bmMgKCkgPT4ge1xuICAgIC8vXG4gICAgY29uc3Qgc2VsZkRlcG9zaXRGYWNldCA9IEZhcignY29udGFjdCcsIHtcbiAgICAgIHJlY2VpdmUocGF5bWVudCkge1xuICAgICAgICByZXR1cm4gYWRkUGF5bWVudChwYXltZW50KTtcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBjb25zdCBhZGRyZXNzID0gYXdhaXQgRShteUFkZHJlc3NOYW1lQWRtaW4pLmdldE15QWRkcmVzcygpO1xuICAgIC8vXG4gICAgc2VsZkNvbnRhY3RQID0gYWRkQ29udGFjdCgnU2VsZicsIHNlbGZEZXBvc2l0RmFjZXQsIGFkZHJlc3MpO1xuXG4gICAgLy9cbiAgICBjb25zdCBaT0VfSU5WSVRFX1BVUlNFX1BFVE5BTUUgPSAnRGVmYXVsdCBab2UgaW52aXRlIHB1cnNlJztcbiAgICBjb25zdCBpbnZpdGVJc3N1ZXJQID0gRSh6b2UpLmdldEludml0YXRpb25Jc3N1ZXIoKTtcbiAgICBjb25zdCBhZGRab2VJc3N1ZXIgPSBpc3N1ZXJQID0+XG4gICAgICBpc3N1ZXJNYW5hZ2VyLmFkZChaT0VfSU5WSVRFX0JSQU5EX1BFVE5BTUUsIGlzc3VlclApO1xuICAgIGNvbnN0IG1ha2VJbnZpdGVQdXJzZSA9ICgpID0+XG4gICAgICB3YWxsZXQubWFrZUVtcHR5UHVyc2UoWk9FX0lOVklURV9CUkFORF9QRVROQU1FLCBaT0VfSU5WSVRFX1BVUlNFX1BFVE5BTUUpO1xuICAgIGNvbnN0IGFkZEludml0ZURlcG9zaXRGYWNldCA9ICgpID0+XG4gICAgICBFKHdhbGxldCkuZW5hYmxlQXV0b0RlcG9zaXQoWk9FX0lOVklURV9QVVJTRV9QRVROQU1FKTtcblxuICAgIGF3YWl0IGFkZFpvZUlzc3VlcihpbnZpdGVJc3N1ZXJQKVxuICAgICAgLnRoZW4obWFrZUludml0ZVB1cnNlKVxuICAgICAgLnRoZW4oYWRkSW52aXRlRGVwb3NpdEZhY2V0KTtcbiAgICB6b2VJbnZpdGVQdXJzZSA9IHdhbGxldC5nZXRQdXJzZShaT0VfSU5WSVRFX1BVUlNFX1BFVE5BTUUpO1xuXG4gICAgYXdhaXQgRShteUFkZHJlc3NOYW1lQWRtaW4pLnVwZGF0ZShcbiAgICAgIFdhbGxldE5hbWUuZGVwb3NpdEZhY2V0LFxuICAgICAgc2VsZkRlcG9zaXRGYWNldCxcbiAgICApO1xuICB9O1xuXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIGNvbnN0IGltcG9ydEJhbmtBc3NldHMgPSBhc3luYyBiYW5rID0+IHtcbiAgICB2b2lkIG9ic2VydmVJdGVyYXRpb24oXG4gICAgICBzdWJzY3JpYmVFYWNoKEUoYmFuaykuZ2V0QXNzZXRTdWJzY3JpcHRpb24oKSksXG4gICAgICBoYXJkZW4oe1xuICAgICAgICBhc3luYyB1cGRhdGVTdGF0ZSh7IHByb3Bvc2VkTmFtZSwgaXNzdWVyTmFtZSwgaXNzdWVyLCBicmFuZCB9KSB7XG4gICAgICAgICAgYXdhaXQgbnVsbDtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgaXNzdWVyTmFtZSA9IGF3YWl0IGFkZElzc3Vlcihpc3N1ZXJOYW1lLCBpc3N1ZXIpO1xuICAgICAgICAgICAgY29uc3QgcHVyc2UgPSBhd2FpdCBFKGJhbmspLmdldFB1cnNlKGJyYW5kKTtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICBhd2FpdCBpbnRlcm5hbFVuc2FmZUltcG9ydFB1cnNlKFxuICAgICAgICAgICAgICBpc3N1ZXJOYW1lLFxuICAgICAgICAgICAgICBwcm9wb3NlZE5hbWUsXG4gICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgIHB1cnNlLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCcvLy8gY291bGQgbm90IGFkZCBiYW5rIGFzc2V0IHB1cnNlJywgZSwge1xuICAgICAgICAgICAgICBpc3N1ZXJOYW1lLFxuICAgICAgICAgICAgICBwcm9wb3NlZE5hbWUsXG4gICAgICAgICAgICAgIGlzc3VlcixcbiAgICAgICAgICAgICAgYnJhbmQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgICApLmZpbmFsbHkoKCkgPT4gY29uc29sZS5lcnJvcignLy8vIFRoaXMgaXMgdGhlIGVuZCBvZiB0aGUgYmFuayBhc3NldHMnKSk7XG4gIH07XG4gIHJldHVybiB7XG4gICAgYWRtaW46IHdhbGxldCxcbiAgICBpbml0aWFsaXplZDogaW5pdGlhbGl6ZSgpLFxuICAgIGltcG9ydEJhbmtBc3NldHMsXG4gIH07XG59XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVdhbGxldFJvb3QiOlsibWFrZVdhbGxldFJvb3QiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAPTkpxx0DAAAdAwAAMgAAAEBhZ29yaWMvd2FsbGV0LWJhY2tlbmQtdjAuMTUuMC11MjEuMC9zcmMvcHVic3ViLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJkZWZhdWx0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOyAgICAgICAgICAgICAgIGZ1bmN0aW9uIG1ha2VQdWJzdWIoRSkge1xuICBsZXQgbGFzdFB1Ymxpc2hlZDtcbiAgY29uc3Qgc3Vic2NyaWJlcnMgPSBbXTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBzdWJzY3JpYmUocykge1xuICAgICAgc3Vic2NyaWJlcnMucHVzaChzKTtcbiAgICAgIGlmIChsYXN0UHVibGlzaGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgRShzKS5ub3RpZnkobGFzdFB1Ymxpc2hlZCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBwdWJsaXNoKG0pIHtcbiAgICAgIGxhc3RQdWJsaXNoZWQgPSBtO1xuICAgICAgZm9yIChjb25zdCBzIG9mIHN1YnNjcmliZXJzKSB7XG4gICAgICAgIEUocykubm90aWZ5KG0pO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufSRozY9fb25jZS5kZWZhdWx0KCAgICAgIG1ha2VQdWJzdWIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFWkl7+8SQAAvEkAADIAAABAYWdvcmljL3dhbGxldC1iYWNrZW5kLXYwLjE1LjAtdTIxLjAvc3JjL3dhbGxldC5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2pzLXV0aWxzLmpzIiwiQGFnb3JpYy9ub3RpZmllciIsIi4vbGliLXdhbGxldC5qcyIsIi4vcHVic3ViLmpzIiwiLi9iaWdpbnRTdHJpbmdpZnkuanMiLCIuL2RhdGUtbm93LmpzIiwiLi9pbnRlcm5hbC10eXBlcy5qcyJdLCJleHBvcnRzIjpbImJ1aWxkUm9vdE9iamVjdCIsImRlZmF1bHQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBFLEZhcixkZWVwQ29weUpzb25hYmxlLG1ha2VOb3RpZmllcktpdCxvYnNlcnZlSXRlcmF0aW9uLG1ha2VXYWxsZXRSb290LHB1YnN1YixiaWdpbnRTdHJpbmdpZnksbWFrZVRpbWVyRGV2aWNlRGF0ZU5vdyxtYWtlVGltZXJTZXJ2aWNlRGF0ZU5vdzskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbC9zcmMvanMtdXRpbHMuanNcIiwgW1tcImRlZXBDb3B5SnNvbmFibGVcIixbJGjNj19hID0+IChkZWVwQ29weUpzb25hYmxlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wibWFrZU5vdGlmaWVyS2l0XCIsWyRozY9fYSA9PiAobWFrZU5vdGlmaWVyS2l0ID0gJGjNj19hKV1dLFtcIm9ic2VydmVJdGVyYXRpb25cIixbJGjNj19hID0+IChvYnNlcnZlSXRlcmF0aW9uID0gJGjNj19hKV1dXV0sW1wiLi9saWItd2FsbGV0LmpzXCIsIFtbXCJtYWtlV2FsbGV0Um9vdFwiLFskaM2PX2EgPT4gKG1ha2VXYWxsZXRSb290ID0gJGjNj19hKV1dXV0sW1wiLi9wdWJzdWIuanNcIiwgW1tcImRlZmF1bHRcIixbJGjNj19hID0+IChwdWJzdWIgPSAkaM2PX2EpXV1dXSxbXCIuL2JpZ2ludFN0cmluZ2lmeS5qc1wiLCBbW1wiYmlnaW50U3RyaW5naWZ5XCIsWyRozY9fYSA9PiAoYmlnaW50U3RyaW5naWZ5ID0gJGjNj19hKV1dXV0sW1wiLi9kYXRlLW5vdy5qc1wiLCBbW1wibWFrZVRpbWVyRGV2aWNlRGF0ZU5vd1wiLFskaM2PX2EgPT4gKG1ha2VUaW1lckRldmljZURhdGVOb3cgPSAkaM2PX2EpXV0sW1wibWFrZVRpbWVyU2VydmljZURhdGVOb3dcIixbJGjNj19hID0+IChtYWtlVGltZXJTZXJ2aWNlRGF0ZU5vdyA9ICRozY9fYSldXV1dLFtcIi4vaW50ZXJuYWwtdHlwZXMuanNcIiwgW11dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGJ1aWxkUm9vdE9iamVjdCwnbmFtZScse3ZhbHVlOlwiYnVpbGRSb290T2JqZWN0XCJ9KTskaM2PX29uY2UuYnVpbGRSb290T2JqZWN0KGJ1aWxkUm9vdE9iamVjdCk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4gICAgICAgZnVuY3Rpb24gYnVpbGRSb290T2JqZWN0KHZhdFBvd2Vycykge1xuICAvL1xuICBjb25zdCB7IEQgfSA9IHZhdFBvd2VycyB8fCB7fTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgbGV0IHdhbGxldFJvb3Q7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgbGV0IHdhbGxldEFkbWluO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGxldCBwdXJzZXNTdGF0ZSA9IFtdO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgaW5ib3hTdGF0ZSA9IFtdO1xuICBsZXQgaHR0cDtcblxuICBjb25zdCBicmlkZ2VIYW5kbGVzID0gbmV3IFNldCgpO1xuICBjb25zdCBvZmZlclN1YnNjcmlwdGlvbnMgPSBuZXcgTWFwKCk7XG5cbiAgY29uc3QgaHR0cFNlbmQgPSAob2JqLCBjaGFubmVsSGFuZGxlcykgPT5cbiAgICBFKGh0dHApLnNlbmQoZGVlcENvcHlKc29uYWJsZShvYmopLCBjaGFubmVsSGFuZGxlcyk7XG5cbiAgY29uc3QgcHVzaE9mZmVyU3Vic2NyaXB0aW9ucyA9IChjaGFubmVsSGFuZGxlLCBvZmZlcnMpID0+IHtcbiAgICBjb25zdCBzdWJzID0gb2ZmZXJTdWJzY3JpcHRpb25zLmdldChjaGFubmVsSGFuZGxlKTtcbiAgICBmb3IgKGNvbnN0IHsgb3JpZ2luLCBzdGF0dXMgfSBvZiBzdWJzIHx8IFtdKSB7XG4gICAgICAvL1xuICAgICAgY29uc3QgcmVzdWx0ID0gaGFyZGVuKFxuICAgICAgICBvZmZlcnMuZmlsdGVyKFxuICAgICAgICAgIG9mZmVyID0+XG4gICAgICAgICAgICAoc3RhdHVzID09PSBudWxsIHx8IG9mZmVyLnN0YXR1cyA9PT0gc3RhdHVzKSAmJlxuICAgICAgICAgICAgb2ZmZXIucmVxdWVzdENvbnRleHQgJiZcbiAgICAgICAgICAgIG9mZmVyLnJlcXVlc3RDb250ZXh0Lm9yaWdpbiA9PT0gb3JpZ2luLFxuICAgICAgICApLFxuICAgICAgKTtcbiAgICAgIGh0dHBTZW5kKFxuICAgICAgICB7XG4gICAgICAgICAgdHlwZTogJ3dhbGxldE9mZmVyRGVzY3JpcHRpb25zJyxcbiAgICAgICAgICBkYXRhOiByZXN1bHQsXG4gICAgICAgIH0sXG4gICAgICAgIFtjaGFubmVsSGFuZGxlXSxcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHN1YnNjcmliZVRvT2ZmZXJzID0gKGNoYW5uZWxIYW5kbGUsIHsgb3JpZ2luLCBzdGF0dXMgPSBudWxsIH0pID0+IHtcbiAgICBsZXQgc3VicyA9IG9mZmVyU3Vic2NyaXB0aW9ucy5nZXQoY2hhbm5lbEhhbmRsZSk7XG4gICAgaWYgKCFzdWJzKSB7XG4gICAgICBzdWJzID0gW107XG4gICAgICBvZmZlclN1YnNjcmlwdGlvbnMuc2V0KGNoYW5uZWxIYW5kbGUsIHN1YnMpO1xuICAgIH1cbiAgICBzdWJzLnB1c2goeyBvcmlnaW4sIHN0YXR1cyB9KTtcbiAgICBwdXNoT2ZmZXJTdWJzY3JpcHRpb25zKGNoYW5uZWxIYW5kbGUsIGluYm94U3RhdGUpO1xuICB9O1xuXG4gIGNvbnN0IHsgcHVibGlzaDogcHVyc2VzUHVibGlzaCwgc3Vic2NyaWJlOiBwdXJzZXNTdWJzY3JpYmUgfSA9IHB1YnN1YihFKTtcbiAgY29uc3QgeyB1cGRhdGVyOiBpbmJveFVwZGF0ZXIsIG5vdGlmaWVyOiBvZmZlck5vdGlmaWVyIH0gPVxuICAgIG1ha2VOb3RpZmllcktpdChpbmJveFN0YXRlKTtcbiAgY29uc3QgeyBwdWJsaXNoOiBpbmJveFB1Ymxpc2gsIHN1YnNjcmliZTogaW5ib3hTdWJzY3JpYmUgfSA9IHB1YnN1YihFKTtcblxuICBjb25zdCBub3RpZmllcnMgPSBoYXJkZW4oe1xuICAgIGdldEluYm94Tm90aWZpZXIoKSB7XG4gICAgICByZXR1cm4gb2ZmZXJOb3RpZmllcjtcbiAgICB9LFxuICB9KTtcblxuICAvKlxuXG4gICAqL1xuICBhc3luYyBmdW5jdGlvbiBzdGFydHVwKHtcbiAgICB6b2UsXG4gICAgYm9hcmQsXG4gICAgYWdvcmljTmFtZXMsXG4gICAgbmFtZXNCeUFkZHJlc3MsXG4gICAgbXlBZGRyZXNzTmFtZUFkbWluLFxuICAgIHRpbWVyRGV2aWNlLFxuICAgIHRpbWVyRGV2aWNlU2NhbGUsXG4gICAgbG9jYWxUaW1lclNlcnZpY2UsXG4gICAgbG9jYWxUaW1lclBvbGxJbnRlcnZhbCxcbiAgfSkge1xuICAgIGFzc2VydChteUFkZHJlc3NOYW1lQWRtaW4sICdtaXNzaW5nIG15QWRkcmVzc05hbWVBZG1pbicpO1xuXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgbGV0IGRhdGVOb3dQO1xuICAgIGlmICh0aW1lckRldmljZSkge1xuICAgICAgZGF0ZU5vd1AgPSBtYWtlVGltZXJEZXZpY2VEYXRlTm93KEQsIHRpbWVyRGV2aWNlLCB0aW1lckRldmljZVNjYWxlKTtcbiAgICB9XG4gICAgaWYgKGxvY2FsVGltZXJTZXJ2aWNlKSB7XG4gICAgICBkYXRlTm93UCA9IG1ha2VUaW1lclNlcnZpY2VEYXRlTm93KFxuICAgICAgICBsb2NhbFRpbWVyU2VydmljZSxcbiAgICAgICAgbG9jYWxUaW1lclBvbGxJbnRlcnZhbCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29uc3QgZGF0ZU5vdyA9IGF3YWl0IGRhdGVOb3dQO1xuICAgIGNvbnN0IHcgPSBtYWtlV2FsbGV0Um9vdCh7XG4gICAgICBhZ29yaWNOYW1lcyxcbiAgICAgIG5hbWVzQnlBZGRyZXNzLFxuICAgICAgbXlBZGRyZXNzTmFtZUFkbWluLFxuICAgICAgem9lLFxuICAgICAgYm9hcmQsXG4gICAgICBwdXJzZXNTdGF0ZUNoYW5nZUhhbmRsZXI6IHB1cnNlc1B1Ymxpc2gsXG4gICAgICBpbmJveFN0YXRlQ2hhbmdlSGFuZGxlcjogaW5ib3hQdWJsaXNoLFxuICAgICAgZGF0ZU5vdyxcbiAgICB9KTtcbiAgICBjb25zb2xlLmRlYnVnKCd3YWl0aW5nIGZvciB3YWxsZXQgdG8gaW5pdGlhbGl6ZScpO1xuICAgIGF3YWl0IHcuaW5pdGlhbGl6ZWQ7XG4gICAgY29uc29sZS5kZWJ1Zygnd2FsbGV0IGluaXRpYWxpemVkJyk7XG4gICAgd2FsbGV0QWRtaW4gPSB3LmFkbWluO1xuICAgIHdhbGxldFJvb3QgPSB3O1xuICB9XG5cbiAgLypcblxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IG1ha2VCcmlkZ2UgPSAoYXBwcm92ZSwgZGFwcE9yaWdpbiwgbWV0YSA9IHt9KSA9PiB7XG4gICAgYXN5bmMgZnVuY3Rpb24qIG1ha2VBcHByb3ZlZE5vdGlmaWVyKHNvdXJjZU5vdGlmaWVyKSB7XG4gICAgICBhd2FpdCBhcHByb3ZlKCk7XG4gICAgICBmb3IgYXdhaXQgKGNvbnN0IHN0YXRlIG9mIHNvdXJjZU5vdGlmaWVyKSB7XG4gICAgICAgIGF3YWl0IGFwcHJvdmUoKTtcbiAgICAgICAgeWllbGQgc3RhdGU7XG4gICAgICB9XG4gICAgfVxuICAgIGhhcmRlbihtYWtlQXBwcm92ZWROb3RpZmllcik7XG5cbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCBicmlkZ2UgPSBGYXIoJ2JyaWRnZScsIHtcbiAgICAgIGFzeW5jIGdldFB1cnNlc05vdGlmaWVyKCkge1xuICAgICAgICBhd2FpdCBhcHByb3ZlKCk7XG4gICAgICAgIGNvbnN0IHB1cnNlc05vdGlmaWVyID0gd2FsbGV0QWRtaW4uZ2V0QXR0ZW51YXRlZFB1cnNlc05vdGlmaWVyKCk7XG4gICAgICAgIGNvbnN0IHsgbm90aWZpZXIsIHVwZGF0ZXIgfSA9IG1ha2VOb3RpZmllcktpdCgpO1xuICAgICAgICB2b2lkIG9ic2VydmVJdGVyYXRpb24obWFrZUFwcHJvdmVkTm90aWZpZXIocHVyc2VzTm90aWZpZXIpLCB1cGRhdGVyKTtcbiAgICAgICAgcmV0dXJuIG5vdGlmaWVyO1xuICAgICAgfSxcbiAgICAgIGFzeW5jIGdldENhY2hlQ29vcmRpbmF0b3IoKSB7XG4gICAgICAgIGF3YWl0IGFwcHJvdmUoKTtcbiAgICAgICAgcmV0dXJuIHdhbGxldEFkbWluLmdldERhcHBDYWNoZUNvb3JkaW5hdG9yKGRhcHBPcmlnaW4pO1xuICAgICAgfSxcbiAgICAgIGFzeW5jIGdldElzc3VlcnNOb3RpZmllcigpIHtcbiAgICAgICAgYXdhaXQgYXBwcm92ZSgpO1xuICAgICAgICByZXR1cm4gd2FsbGV0QWRtaW4uZ2V0SXNzdWVyc05vdGlmaWVyKCk7XG4gICAgICB9LFxuICAgICAgYXN5bmMgYWRkT2ZmZXIob2ZmZXIpIHtcbiAgICAgICAgYXdhaXQgYXBwcm92ZSgpO1xuICAgICAgICByZXR1cm4gd2FsbGV0QWRtaW4uYWRkT2ZmZXIob2ZmZXIsIHsgLi4ubWV0YSwgZGFwcE9yaWdpbiB9KTtcbiAgICAgIH0sXG4gICAgICBhc3luYyBnZXRPZmZlcnNOb3RpZmllcihzdGF0dXMgPSBudWxsKSB7XG4gICAgICAgIGF3YWl0IGFwcHJvdmUoKTtcbiAgICAgICAgY29uc3QgeyBub3RpZmllciwgdXBkYXRlciB9ID0gbWFrZU5vdGlmaWVyS2l0KGluYm94U3RhdGUpO1xuICAgICAgICBjb25zdCBmaWx0ZXIgPSBvZmZlciA9PlxuICAgICAgICAgIChzdGF0dXMgPT09IG51bGwgfHwgb2ZmZXIuc3RhdHVzID09PSBzdGF0dXMpICYmXG4gICAgICAgICAgb2ZmZXIucmVxdWVzdENvbnRleHQgJiZcbiAgICAgICAgICBvZmZlci5yZXF1ZXN0Q29udGV4dC5kYXBwT3JpZ2luID09PSBkYXBwT3JpZ2luO1xuICAgICAgICBjb25zdCBmaWx0ZXJlZE9mZmVycyA9IG9mZmVycyA9PiB7XG4gICAgICAgICAgcmV0dXJuIG9mZmVycy5maWx0ZXIoZmlsdGVyKS5tYXAoKHsgcmF3SWQsIC4uLnYgfSkgPT4gKHtcbiAgICAgICAgICAgIC4uLnYsXG4gICAgICAgICAgICBpZDogcmF3SWQsXG4gICAgICAgICAgfSkpO1xuICAgICAgICB9O1xuXG4gICAgICAgIHZvaWQgb2JzZXJ2ZUl0ZXJhdGlvbihtYWtlQXBwcm92ZWROb3RpZmllcihvZmZlck5vdGlmaWVyKSwge1xuICAgICAgICAgIHVwZGF0ZVN0YXRlKG9mZmVycykge1xuICAgICAgICAgICAgdXBkYXRlci51cGRhdGVTdGF0ZShmaWx0ZXJlZE9mZmVycyhvZmZlcnMpKTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIGZpbmlzaChvZmZlcnMpIHtcbiAgICAgICAgICAgIHVwZGF0ZXIuZmluaXNoKGZpbHRlcmVkT2ZmZXJzKG9mZmVycykpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZmFpbChlKSB7XG4gICAgICAgICAgICB1cGRhdGVyLmZhaWwoZSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBub3RpZmllcjtcbiAgICAgIH0sXG4gICAgICBhc3luYyBnZXREZXBvc2l0RmFjZXRJZChicmFuZEJvYXJkSWQpIHtcbiAgICAgICAgYXdhaXQgYXBwcm92ZSgpO1xuICAgICAgICByZXR1cm4gd2FsbGV0QWRtaW4uZ2V0RGVwb3NpdEZhY2V0SWQoYnJhbmRCb2FyZElkKTtcbiAgICAgIH0sXG4gICAgICBhc3luYyBzdWdnZXN0SXNzdWVyKHBldG5hbWUsIGJvYXJkSWQpIHtcbiAgICAgICAgYXdhaXQgYXBwcm92ZSgpO1xuICAgICAgICByZXR1cm4gd2FsbGV0QWRtaW4uc3VnZ2VzdElzc3VlcihwZXRuYW1lLCBib2FyZElkLCBkYXBwT3JpZ2luKTtcbiAgICAgIH0sXG4gICAgICBhc3luYyBzdWdnZXN0SW5zdGFsbGF0aW9uKHBldG5hbWUsIGJvYXJkSWQpIHtcbiAgICAgICAgYXdhaXQgYXBwcm92ZSgpO1xuICAgICAgICByZXR1cm4gd2FsbGV0QWRtaW4uc3VnZ2VzdEluc3RhbGxhdGlvbihwZXRuYW1lLCBib2FyZElkLCBkYXBwT3JpZ2luKTtcbiAgICAgIH0sXG4gICAgICBhc3luYyBzdWdnZXN0SW5zdGFuY2UocGV0bmFtZSwgYm9hcmRJZCkge1xuICAgICAgICBhd2FpdCBhcHByb3ZlKCk7XG4gICAgICAgIHJldHVybiB3YWxsZXRBZG1pbi5zdWdnZXN0SW5zdGFuY2UocGV0bmFtZSwgYm9hcmRJZCwgZGFwcE9yaWdpbik7XG4gICAgICB9LFxuICAgICAgYXN5bmMgZ2V0VUlOb3RpZmllcihyYXdJZCkge1xuICAgICAgICBhd2FpdCBhcHByb3ZlKCk7XG4gICAgICAgIHJldHVybiB3YWxsZXRBZG1pbi5nZXRVSU5vdGlmaWVyKHJhd0lkLCBkYXBwT3JpZ2luKTtcbiAgICAgIH0sXG4gICAgICBhc3luYyBnZXRQdWJsaWNOb3RpZmllcnMocmF3SWQpIHtcbiAgICAgICAgYXdhaXQgYXBwcm92ZSgpO1xuICAgICAgICByZXR1cm4gd2FsbGV0QWRtaW4uZ2V0UHVibGljTm90aWZpZXJzKHJhd0lkLCBkYXBwT3JpZ2luKTtcbiAgICAgIH0sXG4gICAgICBhc3luYyBnZXRab2UoKSB7XG4gICAgICAgIGF3YWl0IGFwcHJvdmUoKTtcbiAgICAgICAgcmV0dXJuIHdhbGxldEFkbWluLmdldFpvZSgpO1xuICAgICAgfSxcbiAgICAgIGFzeW5jIGdldEJvYXJkKCkge1xuICAgICAgICBhd2FpdCBhcHByb3ZlKCk7XG4gICAgICAgIHJldHVybiB3YWxsZXRBZG1pbi5nZXRCb2FyZCgpO1xuICAgICAgfSxcbiAgICAgIGFzeW5jIGdldEFnb3JpY05hbWVzKC4uLnBhdGgpIHtcbiAgICAgICAgYXdhaXQgYXBwcm92ZSgpO1xuICAgICAgICByZXR1cm4gd2FsbGV0QWRtaW4uZ2V0QWdvcmljTmFtZXMoLi4ucGF0aCk7XG4gICAgICB9LFxuICAgICAgYXN5bmMgZ2V0TmFtZXNCeUFkZHJlc3MoLi4ucGF0aCkge1xuICAgICAgICBhd2FpdCBhcHByb3ZlKCk7XG4gICAgICAgIHJldHVybiB3YWxsZXRBZG1pbi5nZXROYW1lc0J5QWRkcmVzcyguLi5wYXRoKTtcbiAgICAgIH0sXG4gICAgICBhc3luYyBnZXRCcmFuZFBldG5hbWVzKGJyYW5kcykge1xuICAgICAgICBhd2FpdCBhcHByb3ZlKCk7XG4gICAgICAgIHJldHVybiB3YWxsZXRBZG1pbi5nZXRCcmFuZFBldG5hbWVzKGJyYW5kcyk7XG4gICAgICB9LFxuICAgIH0pO1xuICAgIHJldHVybiBicmlkZ2U7XG4gIH07XG5cbiAgLypcblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBwcmVhcHByb3ZlZEJyaWRnZSA9IEZhcigncHJlYXBwcm92ZWRCcmlkZ2UnLCB7XG4gICAgLypcblxuXG4gICAgICovXG4gICAgYWRkT2ZmZXIob2ZmZXIsIG1ldGEpIHtcbiAgICAgIHJldHVybiB3YWxsZXRBZG1pbi5hZGRPZmZlcihvZmZlciwgbWV0YSk7XG4gICAgfSxcbiAgICBnZXREZXBvc2l0RmFjZXRJZChicmFuZEJvYXJkSWQpIHtcbiAgICAgIHJldHVybiB3YWxsZXRBZG1pbi5nZXREZXBvc2l0RmFjZXRJZChicmFuZEJvYXJkSWQpO1xuICAgIH0sXG4gICAgYXN5bmMgZ2V0T2ZmZXJzTm90aWZpZXIoKSB7XG4gICAgICByZXR1cm4gd2FsbGV0QWRtaW4uZ2V0T2ZmZXJzTm90aWZpZXIoKTtcbiAgICB9LFxuICAgIGFzeW5jIGdldFB1cnNlc05vdGlmaWVyKCkge1xuICAgICAgcmV0dXJuIHdhbGxldEFkbWluLmdldEF0dGVudWF0ZWRQdXJzZXNOb3RpZmllcigpO1xuICAgIH0sXG4gICAgYXN5bmMgZ2V0SXNzdWVyc05vdGlmaWVyKCkge1xuICAgICAgcmV0dXJuIHdhbGxldEFkbWluLmdldElzc3VlcnNOb3RpZmllcigpO1xuICAgIH0sXG4gICAgYXN5bmMgZ2V0Q2FjaGVDb29yZGluYXRvcigpIHtcbiAgICAgIHJldHVybiB3YWxsZXRBZG1pbi5nZXRDYWNoZUNvb3JkaW5hdG9yKCk7XG4gICAgfSxcbiAgICBzdWdnZXN0SW5zdGFsbGF0aW9uKHBldG5hbWUsIGluc3RhbGxhdGlvbkJvYXJkSWQpIHtcbiAgICAgIHJldHVybiB3YWxsZXRBZG1pbi5zdWdnZXN0SW5zdGFsbGF0aW9uKHBldG5hbWUsIGluc3RhbGxhdGlvbkJvYXJkSWQpO1xuICAgIH0sXG4gICAgc3VnZ2VzdEluc3RhbmNlKHBldG5hbWUsIGluc3RhbmNlQm9hcmRJZCkge1xuICAgICAgcmV0dXJuIHdhbGxldEFkbWluLnN1Z2dlc3RJbnN0YW5jZShwZXRuYW1lLCBpbnN0YW5jZUJvYXJkSWQpO1xuICAgIH0sXG4gICAgc3VnZ2VzdElzc3VlcihwZXRuYW1lLCBpc3N1ZXJCb2FyZElkKSB7XG4gICAgICByZXR1cm4gd2FsbGV0QWRtaW4uc3VnZ2VzdElzc3VlcihwZXRuYW1lLCBpc3N1ZXJCb2FyZElkKTtcbiAgICB9LFxuICAgIGdldFVJTm90aWZpZXIocmF3SWQpIHtcbiAgICAgIHJldHVybiB3YWxsZXRBZG1pbi5nZXRVSU5vdGlmaWVyKHJhd0lkKTtcbiAgICB9LFxuICAgIGdldFB1YmxpY05vdGlmaWVycyhyYXdJZCkge1xuICAgICAgcmV0dXJuIHdhbGxldEFkbWluLmdldFB1YmxpY05vdGlmaWVycyhyYXdJZCk7XG4gICAgfSxcbiAgICBhc3luYyBnZXRab2UoKSB7XG4gICAgICByZXR1cm4gd2FsbGV0QWRtaW4uZ2V0Wm9lKCk7XG4gICAgfSxcbiAgICBhc3luYyBnZXRCb2FyZCgpIHtcbiAgICAgIHJldHVybiB3YWxsZXRBZG1pbi5nZXRCb2FyZCgpO1xuICAgIH0sXG4gICAgYXN5bmMgZ2V0QWdvcmljTmFtZXMoLi4ucGF0aCkge1xuICAgICAgcmV0dXJuIHdhbGxldEFkbWluLmdldEFnb3JpY05hbWVzKC4uLnBhdGgpO1xuICAgIH0sXG4gICAgYXN5bmMgZ2V0TmFtZXNCeUFkZHJlc3MoLi4ucGF0aCkge1xuICAgICAgcmV0dXJuIHdhbGxldEFkbWluLmdldE5hbWVzQnlBZGRyZXNzKC4uLnBhdGgpO1xuICAgIH0sXG4gICAgYXN5bmMgZ2V0QnJhbmRQZXRuYW1lcyhicmFuZHMpIHtcbiAgICAgIHJldHVybiB3YWxsZXRBZG1pbi5nZXRCcmFuZFBldG5hbWVzKGJyYW5kcyk7XG4gICAgfSxcbiAgfSk7XG4gIGhhcmRlbihwcmVhcHByb3ZlZEJyaWRnZSk7XG5cbiAgYXN5bmMgZnVuY3Rpb24gZ2V0V2FsbGV0KGJhbmspIHtcbiAgICBhd2FpdCB3YWxsZXRSb290LmltcG9ydEJhbmtBc3NldHMoYmFuayk7XG5cbiAgICAvKlxuXG4gICAgICovXG4gICAgY29uc3Qgd2FsbGV0ID0gRmFyKCd3YWxsZXQnLCB7XG4gICAgICBhZGRQYXltZW50OiB3YWxsZXRBZG1pbi5hZGRQYXltZW50LFxuICAgICAgYXN5bmMgZ2V0U2NvcGVkQnJpZGdlKHN1Z2dlc3RlZERhcHBQZXRuYW1lLCBkYXBwT3JpZ2luKSB7XG4gICAgICAgIGNvbnN0IGFwcHJvdmUgPSBhc3luYyAoKSA9PiB7XG4gICAgICAgICAgYXdhaXQgd2FsbGV0QWRtaW4ud2FpdEZvckRhcHBBcHByb3ZhbChcbiAgICAgICAgICAgIHN1Z2dlc3RlZERhcHBQZXRuYW1lLFxuICAgICAgICAgICAgZGFwcE9yaWdpbixcbiAgICAgICAgICApO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBtYWtlQnJpZGdlKGFwcHJvdmUsIGRhcHBPcmlnaW4pO1xuICAgICAgfSxcbiAgICAgIGFzeW5jIGdldEJyaWRnZSgpIHtcbiAgICAgICAgcmV0dXJuIHByZWFwcHJvdmVkQnJpZGdlO1xuICAgICAgfSxcbiAgICAgIGdldERlcG9zaXRGYWNldElkOiB3YWxsZXRBZG1pbi5nZXREZXBvc2l0RmFjZXRJZCxcbiAgICAgIGdldEFkbWluRmFjZXQoKSB7XG4gICAgICAgIHJldHVybiBGYXIoJ2FkbWluRmFjZXQnLCB7XG4gICAgICAgICAgLi4ud2FsbGV0QWRtaW4sXG4gICAgICAgICAgLi4ubm90aWZpZXJzLFxuICAgICAgICAgIGdldFNjb3BlZEJyaWRnZTogd2FsbGV0LmdldFNjb3BlZEJyaWRnZSxcbiAgICAgICAgfSk7XG4gICAgICB9LFxuICAgICAgZ2V0SXNzdWVyOiB3YWxsZXRBZG1pbi5nZXRJc3N1ZXIsXG4gICAgICBnZXRJc3N1ZXJzOiB3YWxsZXRBZG1pbi5nZXRJc3N1ZXJzLFxuICAgICAgZ2V0UHVyc2U6IHdhbGxldEFkbWluLmdldFB1cnNlLFxuICAgICAgZ2V0UHVyc2VzOiB3YWxsZXRBZG1pbi5nZXRQdXJzZXMsXG5cbiAgICAgIGdldE1hcnNoYWxsZXI6IHdhbGxldEFkbWluLmdldE1hcnNoYWxsZXIsXG5cbiAgICAgIGxvb2t1cDogd2FsbGV0QWRtaW4ubG9va3VwLFxuICAgIH0pO1xuICAgIHJldHVybiBoYXJkZW4od2FsbGV0KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldEhUVFBPYmplY3Qobykge1xuICAgIGh0dHAgPSBvO1xuICB9XG5cbiAgZnVuY3Rpb24gc3RhcnRTdWJzY3JpcHRpb25zKCkge1xuICAgIC8vXG4gICAgLy9cbiAgICBwdXJzZXNTdWJzY3JpYmUoXG4gICAgICBoYXJkZW4oe1xuICAgICAgICBub3RpZnkobSkge1xuICAgICAgICAgIHB1cnNlc1N0YXRlID0gSlNPTi5wYXJzZShtKTtcbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICAgICk7XG5cbiAgICAvL1xuICAgIC8vXG4gICAgaW5ib3hTdWJzY3JpYmUoXG4gICAgICBoYXJkZW4oe1xuICAgICAgICBub3RpZnkobSkge1xuICAgICAgICAgIGluYm94U3RhdGUgPSBKU09OLnBhcnNlKG0pO1xuICAgICAgICAgIGluYm94VXBkYXRlci51cGRhdGVTdGF0ZShpbmJveFN0YXRlKTtcbiAgICAgICAgICBpZiAoaHR0cCkge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIGZvciAoY29uc3QgY2hhbm5lbEhhbmRsZSBvZiBvZmZlclN1YnNjcmlwdGlvbnMua2V5cygpKSB7XG4gICAgICAgICAgICAgIHB1c2hPZmZlclN1YnNjcmlwdGlvbnMoY2hhbm5lbEhhbmRsZSwgaW5ib3hTdGF0ZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEJyaWRnZVVSTEhhbmRsZXIoKSB7XG4gICAgcmV0dXJuIEZhcignYnJpZGdlVVJMSGFuZGxlcicsIHtcbiAgICAgIC8qXG5cblxuXG5cblxuXG5cblxuICAgICAgICovXG5cbiAgICAgIC8qXG5cblxuXG5cblxuICAgICAgICovXG4gICAgICBhc3luYyBnZXRCb290c3RyYXAob3RoZXJTaWRlLCBtZXRhLCBvYmopIHtcbiAgICAgICAgY29uc3QgeyBkYXBwT3JpZ2luID0gbWV0YS5vcmlnaW4gfSA9IG9iajtcbiAgICAgICAgY29uc3Qgc3VnZ2VzdGVkRGFwcFBldG5hbWUgPSBTdHJpbmcoXG4gICAgICAgICAgKG1ldGEucXVlcnkgJiYgbWV0YS5xdWVyeS5zdWdnZXN0ZWREYXBwUGV0bmFtZSkgfHxcbiAgICAgICAgICAgIG1ldGEuZGFwcE9yaWdpbiB8fFxuICAgICAgICAgICAgZGFwcE9yaWdpbixcbiAgICAgICAgKTtcblxuICAgICAgICBjb25zdCBhcHByb3ZlID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGxldCBub3RZZXRFbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgYXdhaXQgd2FsbGV0QWRtaW4ud2FpdEZvckRhcHBBcHByb3ZhbChcbiAgICAgICAgICAgIHN1Z2dlc3RlZERhcHBQZXRuYW1lLFxuICAgICAgICAgICAgZGFwcE9yaWdpbixcbiAgICAgICAgICAgICgpID0+IHtcbiAgICAgICAgICAgICAgbm90WWV0RW5hYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgIEUob3RoZXJTaWRlKVxuICAgICAgICAgICAgICAgIC5uZWVkRGFwcEFwcHJvdmFsKGRhcHBPcmlnaW4sIHN1Z2dlc3RlZERhcHBQZXRuYW1lKVxuICAgICAgICAgICAgICAgIC5jYXRjaChfID0+IHt9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAobm90WWV0RW5hYmxlZCkge1xuICAgICAgICAgICAgYXdhaXQgRShvdGhlclNpZGUpLmRhcHBBcHByb3ZlZChkYXBwT3JpZ2luKTtcbiAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIG1ha2VCcmlkZ2UoYXBwcm92ZSwgZGFwcE9yaWdpbiwgbWV0YSk7XG4gICAgICB9LFxuXG4gICAgICAvKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICAgICAqL1xuICAgICAgZ2V0Q29tbWFuZEhhbmRsZXIoKSB7XG4gICAgICAgIHJldHVybiBGYXIoJ2NvbW1hbmRIYW5kbGVyJywge1xuICAgICAgICAgIG9uT3Blbihfb2JqLCBtZXRhKSB7XG4gICAgICAgICAgICBicmlkZ2VIYW5kbGVzLmFkZChtZXRhLmNoYW5uZWxIYW5kbGUpO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgb25DbG9zZShfb2JqLCBtZXRhKSB7XG4gICAgICAgICAgICBicmlkZ2VIYW5kbGVzLmRlbGV0ZShtZXRhLmNoYW5uZWxIYW5kbGUpO1xuICAgICAgICAgICAgb2ZmZXJTdWJzY3JpcHRpb25zLmRlbGV0ZShtZXRhLmNoYW5uZWxIYW5kbGUpO1xuICAgICAgICAgIH0sXG5cbiAgICAgICAgICBhc3luYyBvbk1lc3NhZ2Uob2JqLCBtZXRhKSB7XG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICAgIGRhcHBPcmlnaW4gPSBtZXRhLm9yaWdpbixcbiAgICAgICAgICAgICAgc3VnZ2VzdGVkRGFwcFBldG5hbWUgPSAobWV0YS5xdWVyeSAmJlxuICAgICAgICAgICAgICAgIG1ldGEucXVlcnkuc3VnZ2VzdGVkRGFwcFBldG5hbWUpIHx8XG4gICAgICAgICAgICAgICAgb2JqLmRhcHBPcmlnaW4gfHxcbiAgICAgICAgICAgICAgICBtZXRhLm9yaWdpbixcbiAgICAgICAgICAgIH0gPSBvYmo7XG5cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICBsZXQgbmVlZEFwcHJvdmFsID0gZmFsc2U7XG4gICAgICAgICAgICBhd2FpdCB3YWxsZXRBZG1pbi53YWl0Rm9yRGFwcEFwcHJvdmFsKFxuICAgICAgICAgICAgICBzdWdnZXN0ZWREYXBwUGV0bmFtZSxcbiAgICAgICAgICAgICAgZGFwcE9yaWdpbixcbiAgICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIG5lZWRBcHByb3ZhbCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaHR0cFNlbmQoXG4gICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICd3YWxsZXROZWVkRGFwcEFwcHJvdmFsJyxcbiAgICAgICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgIGRhcHBPcmlnaW4sXG4gICAgICAgICAgICAgICAgICAgICAgc3VnZ2VzdGVkRGFwcFBldG5hbWUsXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgW21ldGEuY2hhbm5lbEhhbmRsZV0sXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAobmVlZEFwcHJvdmFsKSB7XG4gICAgICAgICAgICAgIGh0dHBTZW5kKFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICd3YWxsZXRIYXZlRGFwcEFwcHJvdmFsJyxcbiAgICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgZGFwcE9yaWdpbixcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBbbWV0YS5jaGFubmVsSGFuZGxlXSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7XG4gICAgICAgICAgICAgIGNhc2UgJ3dhbGxldEdldFB1cnNlcyc6IHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgdHlwZTogJ3dhbGxldFVwZGF0ZVB1cnNlcycsXG4gICAgICAgICAgICAgICAgICBkYXRhOiBiaWdpbnRTdHJpbmdpZnkocHVyc2VzU3RhdGUpLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FzZSAnd2FsbGV0QWRkT2ZmZXInOiB7XG4gICAgICAgICAgICAgICAgbGV0IGhhbmRsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb25zdCBhY3Rpb25zID0gRmFyKCdhY3Rpb25zJywge1xuICAgICAgICAgICAgICAgICAgaGFuZGxlZChvZmZlcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgaHR0cFNlbmQoXG4gICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3dhbGxldE9mZmVySGFuZGxlZCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBvZmZlci5pZCxcbiAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgIFttZXRhLmNoYW5uZWxIYW5kbGVdLFxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgdHlwZTogJ3dhbGxldE9mZmVyQWRkZWQnLFxuICAgICAgICAgICAgICAgICAgZGF0YTogYXdhaXQgd2FsbGV0QWRtaW4uYWRkT2ZmZXIoXG4gICAgICAgICAgICAgICAgICAgIHsgLi4ub2JqLmRhdGEsIGFjdGlvbnMgfSxcbiAgICAgICAgICAgICAgICAgICAgeyAuLi5tZXRhLCBkYXBwT3JpZ2luIH0sXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjYXNlICd3YWxsZXRTdWJzY3JpYmVPZmZlcnMnOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBzdGF0dXMgPSBudWxsIH0gPSBvYmo7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBjaGFubmVsSGFuZGxlIH0gPSBtZXRhO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFjaGFubmVsSGFuZGxlKSB7XG4gICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnd2FsbGV0U3Vic2NyaWJlZE9mZmVycycsXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgIHN1YnNjcmliZVRvT2ZmZXJzKGNoYW5uZWxIYW5kbGUsIHtcbiAgICAgICAgICAgICAgICAgIG9yaWdpbjogZGFwcE9yaWdpbixcbiAgICAgICAgICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgdHlwZTogJ3dhbGxldFN1YnNjcmliZWRPZmZlcnMnLFxuICAgICAgICAgICAgICAgICAgZGF0YTogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgY2FzZSAnd2FsbGV0R2V0T2ZmZXJzJzoge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgc3RhdHVzID0gbnVsbCB9ID0gb2JqO1xuXG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gYXdhaXQgd2FsbGV0QWRtaW4uZ2V0T2ZmZXJzKHtcbiAgICAgICAgICAgICAgICAgIG9yaWdpbjogZGFwcE9yaWdpbixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gaGFyZGVuKFxuICAgICAgICAgICAgICAgICAgICByZXN1bHQuZmlsdGVyKG9mZmVyID0+IG9mZmVyLnN0YXR1cyA9PT0gc3RhdHVzKSxcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICd3YWxsZXRPZmZlckRlc2NyaXB0aW9ucycsXG4gICAgICAgICAgICAgICAgICBkYXRhOiByZXN1bHQsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNhc2UgJ3dhbGxldEdldERlcG9zaXRGYWNldElkJzoge1xuICAgICAgICAgICAgICAgIGNvbnN0IHsgYnJhbmRCb2FyZElkIH0gPSBvYmo7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID1cbiAgICAgICAgICAgICAgICAgIGF3YWl0IHdhbGxldEFkbWluLmdldERlcG9zaXRGYWNldElkKGJyYW5kQm9hcmRJZCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICd3YWxsZXREZXBvc2l0RmFjZXRJZFJlc3BvbnNlJyxcbiAgICAgICAgICAgICAgICAgIGRhdGE6IHJlc3VsdCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgY2FzZSAnd2FsbGV0U3VnZ2VzdElzc3Vlcic6IHtcbiAgICAgICAgICAgICAgICBjb25zdCB7IHBldG5hbWUsIGJvYXJkSWQgfSA9IG9iajtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB3YWxsZXRBZG1pbi5zdWdnZXN0SXNzdWVyKFxuICAgICAgICAgICAgICAgICAgcGV0bmFtZSxcbiAgICAgICAgICAgICAgICAgIGJvYXJkSWQsXG4gICAgICAgICAgICAgICAgICBkYXBwT3JpZ2luLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICd3YWxsZXRTdWdnZXN0SXNzdWVyUmVzcG9uc2UnLFxuICAgICAgICAgICAgICAgICAgZGF0YTogcmVzdWx0LFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICBjYXNlICd3YWxsZXRTdWdnZXN0SW5zdGFuY2UnOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBwZXRuYW1lLCBib2FyZElkIH0gPSBvYmo7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2FsbGV0QWRtaW4uc3VnZ2VzdEluc3RhbmNlKFxuICAgICAgICAgICAgICAgICAgcGV0bmFtZSxcbiAgICAgICAgICAgICAgICAgIGJvYXJkSWQsXG4gICAgICAgICAgICAgICAgICBkYXBwT3JpZ2luLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgIHR5cGU6ICd3YWxsZXRTdWdnZXN0SW5zdGFuY2VSZXNwb25zZScsXG4gICAgICAgICAgICAgICAgICBkYXRhOiByZXN1bHQsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGNhc2UgJ3dhbGxldFN1Z2dlc3RJbnN0YWxsYXRpb24nOiB7XG4gICAgICAgICAgICAgICAgY29uc3QgeyBwZXRuYW1lLCBib2FyZElkIH0gPSBvYmo7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgd2FsbGV0QWRtaW4uc3VnZ2VzdEluc3RhbGxhdGlvbihcbiAgICAgICAgICAgICAgICAgIHBldG5hbWUsXG4gICAgICAgICAgICAgICAgICBib2FyZElkLFxuICAgICAgICAgICAgICAgICAgZGFwcE9yaWdpbixcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICB0eXBlOiAnd2FsbGV0U3VnZ2VzdEluc3RhbGxhdGlvblJlc3BvbnNlJyxcbiAgICAgICAgICAgICAgICAgIGRhdGE6IHJlc3VsdCxcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGZhbHNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH1cblxuICBzdGFydFN1YnNjcmlwdGlvbnMoKTtcblxuICBmdW5jdGlvbiBnZXRDb21tYW5kSGFuZGxlciguLi5wYXJhbXMpIHtcbiAgICBjb25zb2xlLmRlYnVnKFxuICAgICAgJ2dldENvbW1hbmRIYW5kbGVyIGNhbGxlZCBpbiB3YWxsZXQsIGJ1dCBkb2VzIG5vdCBleGlzdCcsXG4gICAgICBwYXJhbXMsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBGYXIoJ3Jvb3QnLCB7XG4gICAgc3RhcnR1cCxcbiAgICBnZXRXYWxsZXQsXG4gICAgc2V0SFRUUE9iamVjdCxcbiAgICBnZXRCcmlkZ2VVUkxIYW5kbGVyLFxuICAgIGdldENvbW1hbmRIYW5kbGVyLFxuICB9KTtcbn1cblxuLypcblxuXG5cblxuXG4gKi9cbiAgICAgICAgICAgICAgIGZ1bmN0aW9uIHNwYXduKHRlcm1zLCBfaW52aXRlTWFrZXIpIHtcbiAgY29uc3Qgd2FsbGV0VmF0ID0gYnVpbGRSb290T2JqZWN0KCk7XG4gIHJldHVybiB3YWxsZXRWYXQuc3RhcnR1cCh0ZXJtcykudGhlbihfID0+IHdhbGxldFZhdCk7XG59JGjNj19vbmNlLmRlZmF1bHQoICAgICAgc3Bhd24pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il0sImJ1aWxkUm9vdE9iamVjdCI6WyJidWlsZFJvb3RPYmplY3QiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA/qF01VgcAABYHAAAOQAAAEBhZ29yaWMvem9lLXYwLjI3LjAtdTIxLjAvc3JjL2NvbnRyYWN0U3VwcG9ydC9yZWNvcmRlci5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAYWdvcmljL2ludGVybmFsIiwiQGFnb3JpYy9ub3RpZmllciIsIkBhZ29yaWMvbm90aWZpZXIvdG9vbHMvdGVzdFN1cHBvcnRzLmpzIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiLCJAZW5kby9ldmVudHVhbC1zZW5kIl0sImV4cG9ydHMiOlsiUmVjb3JkZXJLaXRTaGFwZSIsImRlZmluZUVSZWNvcmRlcktpdCIsImRlZmluZVJlY29yZGVyS2l0IiwicHJlcGFyZU1vY2tSZWNvcmRlcktpdE1ha2VycyIsInByZXBhcmVSZWNvcmRlciIsInByZXBhcmVSZWNvcmRlcktpdCIsInByZXBhcmVSZWNvcmRlcktpdE1ha2VycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsU3RvcmFnZU5vZGVTaGFwZSxwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQsbWFrZUZha2VNYXJzaGFsbGVyLG1ha2VGYWtlU3RvcmFnZSxtdXN0TWF0Y2gsTSxtYWtlU2NhbGFyQmlnTWFwU3RvcmUscHJlcGFyZUV4b0NsYXNzLEU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wiU3RvcmFnZU5vZGVTaGFwZVwiLFskaM2PX2EgPT4gKFN0b3JhZ2VOb2RlU2hhcGUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL25vdGlmaWVyXCIsIFtbXCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXRcIixbJGjNj19hID0+IChwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL25vdGlmaWVyL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qc1wiLCBbW1wibWFrZUZha2VNYXJzaGFsbGVyXCIsWyRozY9fYSA9PiAobWFrZUZha2VNYXJzaGFsbGVyID0gJGjNj19hKV1dLFtcIm1ha2VGYWtlU3RvcmFnZVwiLFskaM2PX2EgPT4gKG1ha2VGYWtlU3RvcmFnZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcIm1ha2VTY2FsYXJCaWdNYXBTdG9yZVwiLFskaM2PX2EgPT4gKG1ha2VTY2FsYXJCaWdNYXBTdG9yZSA9ICRozY9fYSldXSxbXCJwcmVwYXJlRXhvQ2xhc3NcIixbJGjNj19hID0+IChwcmVwYXJlRXhvQ2xhc3MgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuICovXG5cbi8qXG5cblxuICovXG5cbi8qXG5cblxuICovXG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVSZWNvcmRlciA9IChiYWdnYWdlLCBtYXJzaGFsbGVyKSA9PiB7XG4gIGNvbnN0IG1ha2VSZWNvcmRlciA9IHByZXBhcmVFeG9DbGFzcyhcbiAgICBiYWdnYWdlLFxuICAgICdSZWNvcmRlcicsXG4gICAgTS5pbnRlcmZhY2UoJ1JlY29yZGVyJywge1xuICAgICAgZ2V0U3RvcmFnZU5vZGU6IE0uY2FsbCgpLnJldHVybnMoU3RvcmFnZU5vZGVTaGFwZSksXG4gICAgICBnZXRTdG9yYWdlUGF0aDogTS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoLyogICAgICAgICovKSksXG4gICAgICB3cml0ZTogTS5jYWxsKE0uYW55KCkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICAgICAgd3JpdGVGaW5hbDogTS5jYWxsKE0uYW55KCkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICAgIH0pLFxuICAgIC8qXG5cblxuXG5cbiAgICAgKi9cbiAgICAoXG4gICAgICBwdWJsaXNoZXIsXG4gICAgICBzdG9yYWdlTm9kZSxcbiAgICAgIHZhbHVlU2hhcGUgPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoTS5hbnkoKSksXG4gICAgKSA9PiB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBjbG9zZWQ6IGZhbHNlLFxuICAgICAgICBwdWJsaXNoZXIsXG4gICAgICAgIHN0b3JhZ2VOb2RlLFxuICAgICAgICBzdG9yYWdlUGF0aDogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICh1bmRlZmluZWQpLFxuICAgICAgICB2YWx1ZVNoYXBlLFxuICAgICAgfTtcbiAgICB9LFxuICAgIHtcbiAgICAgIGdldFN0b3JhZ2VOb2RlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5zdG9yYWdlTm9kZTtcbiAgICAgIH0sXG4gICAgICAvKlxuXG5cblxuICAgICAgICovXG4gICAgICBhc3luYyBnZXRTdG9yYWdlUGF0aCgpIHtcbiAgICAgICAgY29uc3QgeyBzdG9yYWdlUGF0aDogaGVsZFBhdGggfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgIC8vXG4gICAgICAgIGF3YWl0IG51bGw7XG4gICAgICAgIGlmIChoZWxkUGF0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGhlbGRQYXRoO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHBhdGggPSBhd2FpdCBFKHRoaXMuc3RhdGUuc3RvcmFnZU5vZGUpLmdldFBhdGgoKTtcbiAgICAgICAgdGhpcy5zdGF0ZS5zdG9yYWdlUGF0aCA9IHBhdGg7XG4gICAgICAgIHJldHVybiBwYXRoO1xuICAgICAgfSxcbiAgICAgIC8qXG5cblxuXG5cbiAgICAgICAqL1xuICAgICAgYXN5bmMgd3JpdGUodmFsdWUpIHtcbiAgICAgICAgY29uc3QgeyBjbG9zZWQsIHB1Ymxpc2hlciwgc3RvcmFnZU5vZGUsIHZhbHVlU2hhcGUgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgICFjbG9zZWQgfHwgRmFpbGBjYW5ub3Qgd3JpdGUgdG8gY2xvc2VkIHJlY29yZGVyYDtcbiAgICAgICAgbXVzdE1hdGNoKHZhbHVlLCB2YWx1ZVNoYXBlKTtcbiAgICAgICAgY29uc3QgZW5jb2RlZCA9IGF3YWl0IEUobWFyc2hhbGxlcikudG9DYXBEYXRhKHZhbHVlKTtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IEpTT04uc3RyaW5naWZ5KGVuY29kZWQpO1xuICAgICAgICBhd2FpdCBFKHN0b3JhZ2VOb2RlKS5zZXRWYWx1ZShzZXJpYWxpemVkKTtcblxuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gcHVibGlzaGVyLnB1Ymxpc2godmFsdWUpO1xuICAgICAgfSxcbiAgICAgIC8qXG5cblxuXG5cbiAgICAgICAqL1xuICAgICAgYXN5bmMgd3JpdGVGaW5hbCh2YWx1ZSkge1xuICAgICAgICBjb25zdCB7IGNsb3NlZCwgcHVibGlzaGVyLCBzdG9yYWdlTm9kZSwgdmFsdWVTaGFwZSB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgIWNsb3NlZCB8fCBGYWlsYGNhbm5vdCB3cml0ZSB0byBjbG9zZWQgcmVjb3JkZXJgO1xuICAgICAgICBtdXN0TWF0Y2godmFsdWUsIHZhbHVlU2hhcGUpO1xuICAgICAgICBjb25zdCBlbmNvZGVkID0gYXdhaXQgRShtYXJzaGFsbGVyKS50b0NhcERhdGEodmFsdWUpO1xuICAgICAgICBjb25zdCBzZXJpYWxpemVkID0gSlNPTi5zdHJpbmdpZnkoZW5jb2RlZCk7XG4gICAgICAgIGF3YWl0IEUoc3RvcmFnZU5vZGUpLnNldFZhbHVlKHNlcmlhbGl6ZWQpO1xuXG4gICAgICAgIC8vXG4gICAgICAgIHRoaXMuc3RhdGUuY2xvc2VkID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIHB1Ymxpc2hlci5maW5pc2godmFsdWUpO1xuICAgICAgfSxcbiAgICB9LFxuICApO1xuXG4gIHJldHVybiBtYWtlUmVjb3JkZXI7XG59OyRozY9fb25jZS5wcmVwYXJlUmVjb3JkZXIocHJlcGFyZVJlY29yZGVyKTtcbmhhcmRlbihwcmVwYXJlUmVjb3JkZXIpO1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBkZWZpbmVSZWNvcmRlcktpdCA9ICh7IG1ha2VSZWNvcmRlciwgbWFrZUR1cmFibGVQdWJsaXNoS2l0IH0pID0+IHtcbiAgLypcblxuXG5cblxuICAgKi9cbiAgY29uc3QgbWFrZVJlY29yZGVyS2l0ID0gKHN0b3JhZ2VOb2RlLCB2YWx1ZVNoYXBlKSA9PiB7XG4gICAgY29uc3QgeyBzdWJzY3JpYmVyLCBwdWJsaXNoZXIgfSA9IG1ha2VEdXJhYmxlUHVibGlzaEtpdCgpO1xuICAgIGNvbnN0IHJlY29yZGVyID0gbWFrZVJlY29yZGVyKFxuICAgICAgcHVibGlzaGVyLFxuICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKFxuICAgICAgICBzdG9yYWdlTm9kZVxuICAgICAgKSxcbiAgICAgIHZhbHVlU2hhcGUsXG4gICAgKTtcbiAgICByZXR1cm4gaGFyZGVuKHsgc3Vic2NyaWJlciwgcmVjb3JkZXIgfSk7XG4gIH07XG4gIHJldHVybiBtYWtlUmVjb3JkZXJLaXQ7XG59O1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5kZWZpbmVSZWNvcmRlcktpdChkZWZpbmVSZWNvcmRlcktpdCk7XG4gICAgICAgY29uc3QgZGVmaW5lRVJlY29yZGVyS2l0ID0gKHsgbWFrZVJlY29yZGVyLCBtYWtlRHVyYWJsZVB1Ymxpc2hLaXQgfSkgPT4ge1xuICAvKlxuXG5cblxuXG4gICAqL1xuICBjb25zdCBtYWtlRVJlY29yZGVyS2l0ID0gKHN0b3JhZ2VOb2RlUCwgdmFsdWVTaGFwZSkgPT4ge1xuICAgIGNvbnN0IHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH0gPSBtYWtlRHVyYWJsZVB1Ymxpc2hLaXQoKTtcbiAgICBjb25zdCByZWNvcmRlclAgPSBFLndoZW4oc3RvcmFnZU5vZGVQLCBzdG9yYWdlTm9kZSA9PlxuICAgICAgbWFrZVJlY29yZGVyKFxuICAgICAgICBwdWJsaXNoZXIsXG4gICAgICAgIC8vXG4gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChzdG9yYWdlTm9kZSksXG4gICAgICAgIHZhbHVlU2hhcGUsXG4gICAgICApLFxuICAgICk7XG4gICAgcmV0dXJuIHsgc3Vic2NyaWJlciwgcmVjb3JkZXJQIH07XG4gIH07XG4gIHJldHVybiBtYWtlRVJlY29yZGVyS2l0O1xufTskaM2PX29uY2UuZGVmaW5lRVJlY29yZGVyS2l0KGRlZmluZUVSZWNvcmRlcktpdCk7XG5oYXJkZW4oZGVmaW5lRVJlY29yZGVyS2l0KTtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBwcmVwYXJlUmVjb3JkZXJLaXQgPSAoYmFnZ2FnZSwgbWFyc2hhbGxlcikgPT4ge1xuICBjb25zdCBtYWtlRHVyYWJsZVB1Ymxpc2hLaXQgPSBwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQoXG4gICAgYmFnZ2FnZSxcbiAgICAnRHVyYWJsZSBQdWJsaXNoIEtpdCcsXG4gICk7XG4gIGNvbnN0IG1ha2VSZWNvcmRlciA9IHByZXBhcmVSZWNvcmRlcihiYWdnYWdlLCBtYXJzaGFsbGVyKTtcbiAgcmV0dXJuIGRlZmluZVJlY29yZGVyS2l0KHsgbWFrZUR1cmFibGVQdWJsaXNoS2l0LCBtYWtlUmVjb3JkZXIgfSk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLnByZXBhcmVSZWNvcmRlcktpdChwcmVwYXJlUmVjb3JkZXJLaXQpO1xuICAgICAgIGNvbnN0IHByZXBhcmVSZWNvcmRlcktpdE1ha2VycyA9IChiYWdnYWdlLCBtYXJzaGFsbGVyKSA9PiB7XG4gIGNvbnN0IG1ha2VEdXJhYmxlUHVibGlzaEtpdCA9IHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdChcbiAgICBiYWdnYWdlLFxuICAgICdEdXJhYmxlIFB1Ymxpc2ggS2l0JyxcbiAgKTtcbiAgY29uc3QgbWFrZVJlY29yZGVyID0gcHJlcGFyZVJlY29yZGVyKGJhZ2dhZ2UsIG1hcnNoYWxsZXIpO1xuXG4gIGNvbnN0IG1ha2VSZWNvcmRlcktpdCA9IGRlZmluZVJlY29yZGVyS2l0KHtcbiAgICBtYWtlUmVjb3JkZXIsXG4gICAgbWFrZUR1cmFibGVQdWJsaXNoS2l0LFxuICB9KTtcbiAgY29uc3QgbWFrZUVSZWNvcmRlcktpdCA9IGRlZmluZUVSZWNvcmRlcktpdCh7XG4gICAgbWFrZVJlY29yZGVyLFxuICAgIG1ha2VEdXJhYmxlUHVibGlzaEtpdCxcbiAgfSk7XG5cbiAgcmV0dXJuIHtcbiAgICBtYWtlRHVyYWJsZVB1Ymxpc2hLaXQsXG4gICAgbWFrZVJlY29yZGVyLFxuICAgIG1ha2VSZWNvcmRlcktpdCxcbiAgICBtYWtlRVJlY29yZGVyS2l0LFxuICB9O1xufTtcblxuLypcblxuICovJGjNj19vbmNlLnByZXBhcmVSZWNvcmRlcktpdE1ha2VycyhwcmVwYXJlUmVjb3JkZXJLaXRNYWtlcnMpO1xuICAgICAgIGNvbnN0IHByZXBhcmVNb2NrUmVjb3JkZXJLaXRNYWtlcnMgPSAoKSA9PiB7XG4gIGNvbnN0IGJhZ2dhZ2UgPSBtYWtlU2NhbGFyQmlnTWFwU3RvcmUoJ21vY2sgcmVjb3JkZXIgYmFnZ2FnZScpO1xuICBjb25zdCBtYXJzaGFsbGVyID0gbWFrZUZha2VNYXJzaGFsbGVyKCk7XG4gIHJldHVybiB7XG4gICAgLi4ucHJlcGFyZVJlY29yZGVyS2l0TWFrZXJzKGJhZ2dhZ2UsIG1hcnNoYWxsZXIpLFxuICAgIHN0b3JhZ2VOb2RlOiBtYWtlRmFrZVN0b3JhZ2UoJ21vY2sgcmVjb3JkZXIgc3RvcmFnZScpLFxuICB9O1xufTskaM2PX29uY2UucHJlcGFyZU1vY2tSZWNvcmRlcktpdE1ha2VycyhwcmVwYXJlTW9ja1JlY29yZGVyS2l0TWFrZXJzKTtcblxuICAgICAgIGNvbnN0IFJlY29yZGVyS2l0U2hhcGUgPSB7XG4gIHJlY29yZGVyOiBNLnJlbW90YWJsZSgpLFxuICBzdWJzY3JpYmVyOiBNLnJlbW90YWJsZSgpLFxufTskaM2PX29uY2UuUmVjb3JkZXJLaXRTaGFwZShSZWNvcmRlcktpdFNoYXBlKTtcbmhhcmRlbihSZWNvcmRlcktpdFNoYXBlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InByZXBhcmVSZWNvcmRlciI6WyJwcmVwYXJlUmVjb3JkZXIiXSwiZGVmaW5lUmVjb3JkZXJLaXQiOlsiZGVmaW5lUmVjb3JkZXJLaXQiXSwiZGVmaW5lRVJlY29yZGVyS2l0IjpbImRlZmluZUVSZWNvcmRlcktpdCJdLCJwcmVwYXJlUmVjb3JkZXJLaXQiOlsicHJlcGFyZVJlY29yZGVyS2l0Il0sInByZXBhcmVSZWNvcmRlcktpdE1ha2VycyI6WyJwcmVwYXJlUmVjb3JkZXJLaXRNYWtlcnMiXSwicHJlcGFyZU1vY2tSZWNvcmRlcktpdE1ha2VycyI6WyJwcmVwYXJlTW9ja1JlY29yZGVyS2l0TWFrZXJzIl0sIlJlY29yZGVyS2l0U2hhcGUiOlsiUmVjb3JkZXJLaXRTaGFwZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADZ9JO0lgEAAJYBAAAkAAAAQGFnb3JpYy96b25lLXYwLjMuMC11MjEuMC9kdXJhYmxlLmpzeyJpbXBvcnRzIjpbIi4vc3JjL2R1cmFibGUuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL3NyYy9kdXJhYmxlLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2R1cmFibGUuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAIltg+OcRAADnEQAAKAAAAEBhZ29yaWMvem9uZS12MC4zLjAtdTIxLjAvc3JjL2R1cmFibGUuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBhZ29yaWMvdmF0LWRhdGEiLCJAYWdvcmljL2Jhc2Utem9uZSJdLCJleHBvcnRzIjpbIm1ha2VEdXJhYmxlWm9uZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsRmFyLGlzUGFzc2FibGUsY2FuQmVEdXJhYmxlLG1ha2VTY2FsYXJNYXBTdG9yZSxwcmVwYXJlRXhvLHByZXBhcmVFeG9DbGFzcyxwcmVwYXJlRXhvQ2xhc3NLaXQscHJvdmlkZUR1cmFibGVNYXBTdG9yZSxwcm92aWRlRHVyYWJsZVNldFN0b3JlLHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlLHByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlLHdhdGNoUHJvbWlzZSxrZXlzLG1ha2VPbmNlS2l0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXSxbXCJpc1Bhc3NhYmxlXCIsWyRozY9fYSA9PiAoaXNQYXNzYWJsZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcImNhbkJlRHVyYWJsZVwiLFskaM2PX2EgPT4gKGNhbkJlRHVyYWJsZSA9ICRozY9fYSldXSxbXCJtYWtlU2NhbGFyTWFwU3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyTWFwU3RvcmUgPSAkaM2PX2EpXV0sW1wicHJlcGFyZUV4b1wiLFskaM2PX2EgPT4gKHByZXBhcmVFeG8gPSAkaM2PX2EpXV0sW1wicHJlcGFyZUV4b0NsYXNzXCIsWyRozY9fYSA9PiAocHJlcGFyZUV4b0NsYXNzID0gJGjNj19hKV1dLFtcInByZXBhcmVFeG9DbGFzc0tpdFwiLFskaM2PX2EgPT4gKHByZXBhcmVFeG9DbGFzc0tpdCA9ICRozY9fYSldXSxbXCJwcm92aWRlRHVyYWJsZU1hcFN0b3JlXCIsWyRozY9fYSA9PiAocHJvdmlkZUR1cmFibGVNYXBTdG9yZSA9ICRozY9fYSldXSxbXCJwcm92aWRlRHVyYWJsZVNldFN0b3JlXCIsWyRozY9fYSA9PiAocHJvdmlkZUR1cmFibGVTZXRTdG9yZSA9ICRozY9fYSldXSxbXCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZVwiLFskaM2PX2EgPT4gKHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlID0gJGjNj19hKV1dLFtcInByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlXCIsWyRozY9fYSA9PiAocHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUgPSAkaM2PX2EpXV0sW1wid2F0Y2hQcm9taXNlXCIsWyRozY9fYSA9PiAod2F0Y2hQcm9taXNlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9iYXNlLXpvbmVcIiwgW1tcImFnb3JpY1ZhdERhdGFLZXlzXCIsWyRozY9fYSA9PiAoa2V5cyA9ICRozY9fYSldXSxbXCJtYWtlT25jZUtpdFwiLFskaM2PX2EgPT4gKG1ha2VPbmNlS2l0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG4gKi9cblxuLypcblxuXG5cblxuICovXG5jb25zdCBpc1N0b3JhYmxlID0gc3BlY2ltZW4gPT4gaXNQYXNzYWJsZShzcGVjaW1lbikgJiYgY2FuQmVEdXJhYmxlKHNwZWNpbWVuKTtcbmhhcmRlbihpc1N0b3JhYmxlKTtcblxuLypcblxuICovXG5jb25zdCBhdHRhY2hEdXJhYmxlU3RvcmVzID0gZ2V0QmFnZ2FnZSA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWFwU3RvcmUgPSAobGFiZWwsIG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCBiYWdnYWdlID0gZ2V0QmFnZ2FnZSgpO1xuICAgIGNvbnN0IHJldCA9IHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUoYmFnZ2FnZSwgbGFiZWwsIG9wdGlvbnMpO1xuICAgIHJldHVybiByZXQ7XG4gIH07XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3Qgc2V0U3RvcmUgPSAobGFiZWwsIG9wdGlvbnMpID0+XG4gICAgcHJvdmlkZUR1cmFibGVTZXRTdG9yZShnZXRCYWdnYWdlKCksIGxhYmVsLCBvcHRpb25zKTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3Qgd2Vha1NldFN0b3JlID0gKGxhYmVsLCBvcHRpb25zKSA9PlxuICAgIHByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlKGdldEJhZ2dhZ2UoKSwgbGFiZWwsIG9wdGlvbnMpO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCB3ZWFrTWFwU3RvcmUgPSAobGFiZWwsIG9wdGlvbnMpID0+XG4gICAgcHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUoZ2V0QmFnZ2FnZSgpLCBsYWJlbCwgb3B0aW9ucyk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIHJldHVybiBGYXIoJ2R1cmFibGVTdG9yZXMnLCB7XG4gICAgZGV0YWNoZWQ6ICgpID0+IGRldGFjaGVkRHVyYWJsZVN0b3JlcyxcbiAgICBpc1N0b3JhYmxlLFxuICAgIG1hcFN0b3JlLFxuICAgIHNldFN0b3JlLFxuICAgIHdlYWtNYXBTdG9yZSxcbiAgICB3ZWFrU2V0U3RvcmUsXG4gIH0pO1xufTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBkZXRhY2hlZER1cmFibGVTdG9yZXMgPSBhdHRhY2hEdXJhYmxlU3RvcmVzKCgpID0+XG4gIG1ha2VTY2FsYXJNYXBTdG9yZSgnZGV0YWNoZWQnKSxcbik7XG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZUR1cmFibGVab25lID0gKGJhZ2dhZ2UsIGJhc2VMYWJlbCA9ICdkdXJhYmxlWm9uZScpID0+IHtcbiAgYmFnZ2FnZSB8fCBGYWlsYGJhZ2dhZ2UgcmVxdWlyZWRgO1xuXG4gIGNvbnN0IGF0dGFjaGVkU3RvcmVzID0gYXR0YWNoRHVyYWJsZVN0b3JlcygoKSA9PiBiYWdnYWdlKTtcblxuICBjb25zdCB7IG1ha2VPbmNlLCB3cmFwUHJvdmlkZXIgfSA9IG1ha2VPbmNlS2l0KFxuICAgIGJhc2VMYWJlbCxcbiAgICBhdHRhY2hlZFN0b3JlcyxcbiAgICBiYWdnYWdlLFxuICApO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgZXhvQ2xhc3MgPSAoLi4uYXJncykgPT4gcHJlcGFyZUV4b0NsYXNzKGJhZ2dhZ2UsIC4uLmFyZ3MpO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIC8vXG4gIC8vXG4gIGNvbnN0IGV4b0NsYXNzS2l0ID0gKC4uLmFyZ3MpID0+IHByZXBhcmVFeG9DbGFzc0tpdChiYWdnYWdlLCAuLi5hcmdzKTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgZXhvID0gKC4uLmFyZ3MpID0+IHByZXBhcmVFeG8oYmFnZ2FnZSwgLi4uYXJncyk7XG5cbiAgY29uc3Qgc3ViWm9uZVN0b3JlID0gd3JhcFByb3ZpZGVyKGF0dGFjaGVkU3RvcmVzLm1hcFN0b3JlLCBrZXlzLnpvbmUpO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBzdWJab25lID0gKGxhYmVsLCBvcHRpb25zID0ge30pID0+IHtcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGNvbnN0IHN1YkJhZ2dhZ2UgPSBzdWJab25lU3RvcmUobGFiZWwsIG9wdGlvbnMpO1xuICAgIHJldHVybiBtYWtlRHVyYWJsZVpvbmUoc3ViQmFnZ2FnZSwgYCR7YmFzZUxhYmVsfS4ke2xhYmVsfWApO1xuICB9O1xuXG4gIHJldHVybiBGYXIoJ2R1cmFibGVab25lJywge1xuICAgIGV4bzogd3JhcFByb3ZpZGVyKGV4bywga2V5cy5leG8pLFxuICAgIGV4b0NsYXNzOiB3cmFwUHJvdmlkZXIoZXhvQ2xhc3MsIGtleXMuZXhvQ2xhc3MpLFxuICAgIGV4b0NsYXNzS2l0OiB3cmFwUHJvdmlkZXIoZXhvQ2xhc3NLaXQsIGtleXMuZXhvQ2xhc3NLaXQpLFxuICAgIHN1YlpvbmUsXG5cbiAgICBtYWtlT25jZSxcbiAgICB3YXRjaFByb21pc2UsXG4gICAgZGV0YWNoZWQ6IGF0dGFjaGVkU3RvcmVzLmRldGFjaGVkLFxuICAgIGlzU3RvcmFibGU6IGF0dGFjaGVkU3RvcmVzLmlzU3RvcmFibGUsXG5cbiAgICBtYXBTdG9yZTogd3JhcFByb3ZpZGVyKGF0dGFjaGVkU3RvcmVzLm1hcFN0b3JlLCBrZXlzLnN0b3JlKSxcbiAgICBzZXRTdG9yZTogd3JhcFByb3ZpZGVyKGF0dGFjaGVkU3RvcmVzLnNldFN0b3JlLCBrZXlzLnN0b3JlKSxcbiAgICB3ZWFrTWFwU3RvcmU6IHdyYXBQcm92aWRlcihhdHRhY2hlZFN0b3Jlcy53ZWFrTWFwU3RvcmUsIGtleXMuc3RvcmUpLFxuICAgIHdlYWtTZXRTdG9yZTogd3JhcFByb3ZpZGVyKGF0dGFjaGVkU3RvcmVzLndlYWtTZXRTdG9yZSwga2V5cy5zdG9yZSksXG4gIH0pO1xufTskaM2PX29uY2UubWFrZUR1cmFibGVab25lKG1ha2VEdXJhYmxlWm9uZSk7XG5oYXJkZW4obWFrZUR1cmFibGVab25lKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VEdXJhYmxlWm9uZSI6WyJtYWtlRHVyYWJsZVpvbmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA6MeBezAFAAAwBQAALAAAAEBlbmRvL2NvbW1vbi12MS4yLjEwL2FwcGx5LWxhYmVsaW5nLWVycm9yLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9wcm9taXNlLWtpdCIsIi4vdGhyb3ctbGFiZWxlZC5qcyJdLCJleHBvcnRzIjpbImFwcGx5TGFiZWxpbmdFcnJvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEUsaXNQcm9taXNlLHRocm93TGFiZWxlZDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLFskaM2PX2EgPT4gKGlzUHJvbWlzZSA9ICRozY9fYSldXV1dLFtcIi4vdGhyb3ctbGFiZWxlZC5qc1wiLCBbW1widGhyb3dMYWJlbGVkXCIsWyRozY9fYSA9PiAodGhyb3dMYWJlbGVkID0gJGjNj19hKV1dXV1dKTtcblxuXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGFwcGx5TGFiZWxpbmdFcnJvciA9IChmdW5jLCBhcmdzLCBsYWJlbCA9IHVuZGVmaW5lZCkgPT4ge1xuICBpZiAobGFiZWwgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBmdW5jKC4uLmFyZ3MpO1xuICB9XG4gIGxldCByZXN1bHQ7XG4gIHRyeSB7XG4gICAgcmVzdWx0ID0gZnVuYyguLi5hcmdzKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgdGhyb3dMYWJlbGVkKGVyciwgbGFiZWwpO1xuICB9XG4gIGlmIChpc1Byb21pc2UocmVzdWx0KSkge1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIHJldHVybiBFLndoZW4ocmVzdWx0LCB1bmRlZmluZWQsIHJlYXNvbiA9PiB0aHJvd0xhYmVsZWQocmVhc29uLCBsYWJlbCkpO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbn07JGjNj19vbmNlLmFwcGx5TGFiZWxpbmdFcnJvcihhcHBseUxhYmVsaW5nRXJyb3IpO1xuaGFyZGVuKGFwcGx5TGFiZWxpbmdFcnJvcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhcHBseUxhYmVsaW5nRXJyb3IiOlsiYXBwbHlMYWJlbGluZ0Vycm9yIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFnIhH+lBAAApQQAACsAAABAZW5kby9jb21tb24tdjEuMi4xMC9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbImZyb21VbmlxdWVFbnRyaWVzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxGYWlsOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dXSk7XG5cbmNvbnN0IHsgZnJvbUVudHJpZXMgfSA9IE9iamVjdDtcbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcblxuLypcblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZnJvbVVuaXF1ZUVudHJpZXMgPSBhbGxFbnRyaWVzID0+IHtcbiAgY29uc3QgZW50cmllc0FycmF5ID0gWy4uLmFsbEVudHJpZXNdO1xuICBjb25zdCByZXN1bHQgPSBoYXJkZW4oZnJvbUVudHJpZXMoZW50cmllc0FycmF5KSk7XG4gIGlmIChvd25LZXlzKHJlc3VsdCkubGVuZ3RoID09PSBlbnRyaWVzQXJyYXkubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuICBjb25zdCBuYW1lcyA9IG5ldyBTZXQoKTtcbiAgZm9yIChjb25zdCBbbmFtZSwgX10gb2YgZW50cmllc0FycmF5KSB7XG4gICAgaWYgKG5hbWVzLmhhcyhuYW1lKSkge1xuICAgICAgRmFpbGBjb2xsaXNpb24gb24gcHJvcGVydHkgbmFtZSAke3EobmFtZSl9OiAke2VudHJpZXNBcnJheX1gO1xuICAgIH1cbiAgICBuYW1lcy5hZGQobmFtZSk7XG4gIH1cbiAgdGhyb3cgRmFpbGBpbnRlcm5hbDogZmFpbGVkIHRvIGNyZWF0ZSBvYmplY3QgZnJvbSB1bmlxdWUgZW50cmllc2A7XG59OyRozY9fb25jZS5mcm9tVW5pcXVlRW50cmllcyhmcm9tVW5pcXVlRW50cmllcyk7XG5oYXJkZW4oZnJvbVVuaXF1ZUVudHJpZXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZnJvbVVuaXF1ZUVudHJpZXMiOlsiZnJvbVVuaXF1ZUVudHJpZXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA1E3/N0oCAABKAgAAJQAAAEBlbmRvL2NvbW1vbi12MS4yLjEwL2lkZW50LWNoZWNrZXIuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImlkZW50Q2hlY2tlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvL1xuLy9cbi8vXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgaWRlbnRDaGVja2VyID0gKGNvbmQsIF9kZXRhaWxzKSA9PiBjb25kOyRozY9fb25jZS5pZGVudENoZWNrZXIoaWRlbnRDaGVja2VyKTtcbmhhcmRlbihpZGVudENoZWNrZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaWRlbnRDaGVja2VyIjpbImlkZW50Q2hlY2tlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACK15dDkAIAAJACAAAnAAAAQGVuZG8vY29tbW9uLXYxLjIuMTAvbGlzdC1kaWZmZXJlbmNlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJsaXN0RGlmZmVyZW5jZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbGlzdERpZmZlcmVuY2UgPSAobGVmdExpc3QsIHJpZ2h0TGlzdCkgPT4ge1xuICBjb25zdCByaWdodFNldCA9IG5ldyBTZXQocmlnaHRMaXN0KTtcbiAgcmV0dXJuIGxlZnRMaXN0LmZpbHRlcihlbGVtZW50ID0+ICFyaWdodFNldC5oYXMoZWxlbWVudCkpO1xufTskaM2PX29uY2UubGlzdERpZmZlcmVuY2UobGlzdERpZmZlcmVuY2UpO1xuaGFyZGVuKGxpc3REaWZmZXJlbmNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Imxpc3REaWZmZXJlbmNlIjpbImxpc3REaWZmZXJlbmNlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAC6Umg60AwAAtAMAACsAAABAZW5kby9jb21tb24tdjEuMi4xMC9tYWtlLWFycmF5LWl0ZXJhdG9yLmpzeyJpbXBvcnRzIjpbIi4vbWFrZS1pdGVyYXRvci5qcyJdLCJleHBvcnRzIjpbIm1ha2VBcnJheUl0ZXJhdG9yIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgbWFrZUl0ZXJhdG9yOyRozY9faW1wb3J0cyhbW1wiLi9tYWtlLWl0ZXJhdG9yLmpzXCIsIFtbXCJtYWtlSXRlcmF0b3JcIixbJGjNj19hID0+IChtYWtlSXRlcmF0b3IgPSAkaM2PX2EpXV1dXV0pO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VBcnJheUl0ZXJhdG9yID0gYXJyID0+IHtcbiAgY29uc3QgeyBsZW5ndGggfSA9IGFycjtcbiAgbGV0IGkgPSAwO1xuICByZXR1cm4gbWFrZUl0ZXJhdG9yKCgpID0+IHtcbiAgICAvKiAgICAgICAgICAgICovXG4gICAgbGV0IHZhbHVlO1xuICAgIGlmIChpIDwgbGVuZ3RoKSB7XG4gICAgICB2YWx1ZSA9IGFycltpXTtcbiAgICAgIGkgKz0gMTtcbiAgICAgIHJldHVybiBoYXJkZW4oeyBkb25lOiBmYWxzZSwgdmFsdWUgfSk7XG4gICAgfVxuICAgIC8vXG4gICAgcmV0dXJuIGhhcmRlbih7IGRvbmU6IHRydWUsIHZhbHVlIH0pO1xuICB9KTtcbn07JGjNj19vbmNlLm1ha2VBcnJheUl0ZXJhdG9yKG1ha2VBcnJheUl0ZXJhdG9yKTtcbmhhcmRlbihtYWtlQXJyYXlJdGVyYXRvcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlQXJyYXlJdGVyYXRvciI6WyJtYWtlQXJyYXlJdGVyYXRvciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAFq82oXAIAAFwCAAAlAAAAQGVuZG8vY29tbW9uLXYxLjIuMTAvbWFrZS1pdGVyYXRvci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWFrZUl0ZXJhdG9yIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZUl0ZXJhdG9yID0gbmV4dCA9PiB7XG4gIGNvbnN0IGl0ZXIgPSBoYXJkZW4oe1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiBpdGVyLFxuICAgIG5leHQsXG4gIH0pO1xuICByZXR1cm4gaXRlcjtcbn07JGjNj19vbmNlLm1ha2VJdGVyYXRvcihtYWtlSXRlcmF0b3IpO1xuaGFyZGVuKG1ha2VJdGVyYXRvcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlSXRlcmF0b3IiOlsibWFrZUl0ZXJhdG9yIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAH9VFLM0AwAANAMAACIAAABAZW5kby9jb21tb24tdjEuMi4xMC9vYmplY3QtbWFwLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJvYmplY3RNYXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Y29uc3QgeyBlbnRyaWVzLCBmcm9tRW50cmllcyB9ID0gT2JqZWN0O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBvYmplY3RNYXAgPSAob3JpZ2luYWwsIG1hcEZuKSA9PiB7XG4gIGNvbnN0IGVudHMgPSBlbnRyaWVzKG9yaWdpbmFsKTtcbiAgY29uc3QgbWFwRW50cyA9IGVudHMubWFwKFxuICAgIChbaywgdl0pID0+IC8qICAgICAgICAgICAgICAgICAgICAgICAqLyAoW2ssIG1hcEZuKHYsIGspXSksXG4gICk7XG4gIHJldHVybiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKGhhcmRlbihmcm9tRW50cmllcyhtYXBFbnRzKSkpO1xufTskaM2PX29uY2Uub2JqZWN0TWFwKG9iamVjdE1hcCk7XG5oYXJkZW4ob2JqZWN0TWFwKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im9iamVjdE1hcCI6WyJvYmplY3RNYXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAf1YvUjIEAAAyBAAAJwAAAEBlbmRvL2NvbW1vbi12MS4yLjEwL29iamVjdC1tZXRhLW1hcC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsib2JqZWN0TWV0YU1hcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtjb25zdCB7IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsIGNyZWF0ZSwgZnJvbUVudHJpZXMgfSA9IE9iamVjdDtcbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBvYmplY3RNZXRhTWFwID0gKFxuICBvcmlnaW5hbCxcbiAgbWV0YU1hcEZuLFxuICBwcm90byA9IE9iamVjdC5wcm90b3R5cGUsXG4pID0+IHtcbiAgY29uc3QgZGVzY3MgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG9yaWdpbmFsKTtcbiAgY29uc3Qga2V5cyA9IG93bktleXMob3JpZ2luYWwpO1xuXG4gIGNvbnN0IGRlc2NFbnRyaWVzID0gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoXG4gICAga2V5c1xuICAgICAgLm1hcChrZXkgPT4gW2tleSwgbWV0YU1hcEZuKGRlc2NzW2tleV0sIGtleSldKVxuICAgICAgLmZpbHRlcigoW19rZXksIG9wdERlc2NdKSA9PiBvcHREZXNjICE9PSB1bmRlZmluZWQpXG4gICk7XG4gIHJldHVybiBoYXJkZW4oY3JlYXRlKHByb3RvLCBmcm9tRW50cmllcyhkZXNjRW50cmllcykpKTtcbn07JGjNj19vbmNlLm9iamVjdE1ldGFNYXAob2JqZWN0TWV0YU1hcCk7XG5oYXJkZW4ob2JqZWN0TWV0YU1hcCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJvYmplY3RNZXRhTWFwIjpbIm9iamVjdE1ldGFNYXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA8qpjsx4EAAAeBAAAJQAAAEBlbmRvL2NvbW1vbi12MS4yLjEwL3Rocm93LWxhYmVsZWQuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsidGhyb3dMYWJlbGVkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgWCxtYWtlRXJyb3IsYW5ub3RhdGVFcnJvcjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wibWFrZUVycm9yXCIsWyRozY9fYSA9PiAobWFrZUVycm9yID0gJGjNj19hKV1dLFtcImFubm90YXRlRXJyb3JcIixbJGjNj19hID0+IChhbm5vdGF0ZUVycm9yID0gJGjNj19hKV1dXV1dKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHRocm93TGFiZWxlZCA9IChcbiAgaW5uZXJFcnIsXG4gIGxhYmVsLFxuICBlcnJDb25zdHJ1Y3RvciA9IHVuZGVmaW5lZCxcbiAgb3B0aW9ucyA9IHVuZGVmaW5lZCxcbikgPT4ge1xuICBpZiAodHlwZW9mIGxhYmVsID09PSAnbnVtYmVyJykge1xuICAgIGxhYmVsID0gYFske2xhYmVsfV1gO1xuICB9XG4gIGNvbnN0IG91dGVyRXJyID0gbWFrZUVycm9yKFxuICAgIGAke2xhYmVsfTogJHtpbm5lckVyci5tZXNzYWdlfWAsXG4gICAgZXJyQ29uc3RydWN0b3IsXG4gICAgb3B0aW9ucyxcbiAgKTtcbiAgYW5ub3RhdGVFcnJvcihvdXRlckVyciwgWGBDYXVzZWQgYnkgJHtpbm5lckVycn1gKTtcbiAgdGhyb3cgb3V0ZXJFcnI7XG59OyRozY9fb25jZS50aHJvd0xhYmVsZWQodGhyb3dMYWJlbGVkKTtcbmhhcmRlbih0aHJvd0xhYmVsZWQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidGhyb3dMYWJlbGVkIjpbInRocm93TGFiZWxlZCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA0oqGpogEAAKIBAAAhAAAAQGVuZG8vZW52LW9wdGlvbnMtdjEuMS44L2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2Vudi1vcHRpb25zLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9zcmMvZW52LW9wdGlvbnMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvZW52LW9wdGlvbnMuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAALrCJHboPAAC6DwAAKwAAAEBlbmRvL2Vudi1vcHRpb25zLXYxLjEuOC9zcmMvZW52LW9wdGlvbnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMiLCJnZXRFbnZpcm9ubWVudE9wdGlvbiIsImdldEVudmlyb25tZW50T3B0aW9uc0xpc3QiLCJtYWtlRW52aXJvbm1lbnRDYXB0b3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogICAgICAgICAgICAgICAgICAgKi9cbi8vXG5cbi8vXG4vL1xuXG4vL1xuLy9cbi8vXG5cbmNvbnN0IHsgZnJlZXplIH0gPSBPYmplY3Q7XG5jb25zdCB7IGFwcGx5IH0gPSBSZWZsZWN0O1xuXG4vL1xuLy9cbmNvbnN0IHVuY3VycnlUaGlzID1cbiAgZm4gPT5cbiAgKHJlY2VpdmVyLCAuLi5hcmdzKSA9PlxuICAgIGFwcGx5KGZuLCByZWNlaXZlciwgYXJncyk7XG5jb25zdCBhcnJheVB1c2ggPSB1bmN1cnJ5VGhpcyhBcnJheS5wcm90b3R5cGUucHVzaCk7XG5jb25zdCBhcnJheUluY2x1ZGVzID0gdW5jdXJyeVRoaXMoQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzKTtcbmNvbnN0IHN0cmluZ1NwbGl0ID0gdW5jdXJyeVRoaXMoU3RyaW5nLnByb3RvdHlwZS5zcGxpdCk7XG5cbmNvbnN0IHEgPSBKU09OLnN0cmluZ2lmeTtcblxuY29uc3QgRmFpbCA9IChsaXRlcmFscywgLi4uYXJncykgPT4ge1xuICBsZXQgbXNnID0gbGl0ZXJhbHNbMF07XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIG1zZyA9IGAke21zZ30ke2FyZ3NbaV19JHtsaXRlcmFsc1tpICsgMV19YDtcbiAgfVxuICB0aHJvdyBFcnJvcihtc2cpO1xufTtcblxuLy9cbi8vXG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VFbnZpcm9ubWVudENhcHRvciA9IChhR2xvYmFsLCBkcm9wTmFtZXMgPSBmYWxzZSkgPT4ge1xuICBjb25zdCBjYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXMgPSBbXTtcblxuICAvKlxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGdldEVudmlyb25tZW50T3B0aW9uID0gKFxuICAgIG9wdGlvbk5hbWUsXG4gICAgZGVmYXVsdFNldHRpbmcsXG4gICAgb3B0T3RoZXJWYWx1ZXMgPSB1bmRlZmluZWQsXG4gICkgPT4ge1xuICAgIHR5cGVvZiBvcHRpb25OYW1lID09PSAnc3RyaW5nJyB8fFxuICAgICAgRmFpbGBFbnZpcm9ubWVudCBvcHRpb24gbmFtZSAke3Eob3B0aW9uTmFtZSl9IG11c3QgYmUgYSBzdHJpbmcuYDtcbiAgICB0eXBlb2YgZGVmYXVsdFNldHRpbmcgPT09ICdzdHJpbmcnIHx8XG4gICAgICBGYWlsYEVudmlyb25tZW50IG9wdGlvbiBkZWZhdWx0IHNldHRpbmcgJHtxKFxuICAgICAgICBkZWZhdWx0U2V0dGluZyxcbiAgICAgICl9IG11c3QgYmUgYSBzdHJpbmcuYDtcblxuICAgIC8qICAgICAgICAgICAgICAgICAqL1xuICAgIGxldCBzZXR0aW5nID0gZGVmYXVsdFNldHRpbmc7XG4gICAgY29uc3QgZ2xvYmFsUHJvY2VzcyA9IGFHbG9iYWwucHJvY2VzcyB8fCB1bmRlZmluZWQ7XG4gICAgY29uc3QgZ2xvYmFsRW52ID1cbiAgICAgICh0eXBlb2YgZ2xvYmFsUHJvY2VzcyA9PT0gJ29iamVjdCcgJiYgZ2xvYmFsUHJvY2Vzcy5lbnYpIHx8IHVuZGVmaW5lZDtcbiAgICBpZiAodHlwZW9mIGdsb2JhbEVudiA9PT0gJ29iamVjdCcpIHtcbiAgICAgIGlmIChvcHRpb25OYW1lIGluIGdsb2JhbEVudikge1xuICAgICAgICBpZiAoIWRyb3BOYW1lcykge1xuICAgICAgICAgIGFycmF5UHVzaChjYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXMsIG9wdGlvbk5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG9wdGlvblZhbHVlID0gZ2xvYmFsRW52W29wdGlvbk5hbWVdO1xuICAgICAgICAvL1xuICAgICAgICB0eXBlb2Ygb3B0aW9uVmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgRmFpbGBFbnZpcm9ubWVudCBvcHRpb24gbmFtZWQgJHtxKFxuICAgICAgICAgICAgb3B0aW9uTmFtZSxcbiAgICAgICAgICApfSwgaWYgcHJlc2VudCwgbXVzdCBoYXZlIGEgY29ycmVzcG9uZGluZyBzdHJpbmcgdmFsdWUsIGdvdCAke3EoXG4gICAgICAgICAgICBvcHRpb25WYWx1ZSxcbiAgICAgICAgICApfWA7XG4gICAgICAgIHNldHRpbmcgPSBvcHRpb25WYWx1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgb3B0T3RoZXJWYWx1ZXMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgc2V0dGluZyA9PT0gZGVmYXVsdFNldHRpbmcgfHxcbiAgICAgIGFycmF5SW5jbHVkZXMob3B0T3RoZXJWYWx1ZXMsIHNldHRpbmcpIHx8XG4gICAgICBGYWlsYFVucmVjb2duaXplZCAke3Eob3B0aW9uTmFtZSl9IHZhbHVlICR7cShcbiAgICAgICAgc2V0dGluZyxcbiAgICAgICl9LiBFeHBlY3RlZCBvbmUgb2YgJHtxKFtkZWZhdWx0U2V0dGluZywgLi4ub3B0T3RoZXJWYWx1ZXNdKX1gO1xuICAgIHJldHVybiBzZXR0aW5nO1xuICB9O1xuICBmcmVlemUoZ2V0RW52aXJvbm1lbnRPcHRpb24pO1xuXG4gIC8qXG5cblxuICAgKi9cbiAgY29uc3QgZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCA9IG9wdGlvbk5hbWUgPT4ge1xuICAgIGNvbnN0IG9wdGlvbiA9IGdldEVudmlyb25tZW50T3B0aW9uKG9wdGlvbk5hbWUsICcnKTtcbiAgICByZXR1cm4gZnJlZXplKG9wdGlvbiA9PT0gJycgPyBbXSA6IHN0cmluZ1NwbGl0KG9wdGlvbiwgJywnKSk7XG4gIH07XG4gIGZyZWV6ZShnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0KTtcblxuICBjb25zdCBlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzID0gKG9wdGlvbk5hbWUsIGVsZW1lbnQpID0+XG4gICAgYXJyYXlJbmNsdWRlcyhnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0KG9wdGlvbk5hbWUpLCBlbGVtZW50KTtcblxuICBjb25zdCBnZXRDYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXMgPSAoKSA9PiB7XG4gICAgcmV0dXJuIGZyZWV6ZShbLi4uY2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzXSk7XG4gIH07XG4gIGZyZWV6ZShnZXRDYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXMpO1xuXG4gIHJldHVybiBmcmVlemUoe1xuICAgIGdldEVudmlyb25tZW50T3B0aW9uLFxuICAgIGdldEVudmlyb25tZW50T3B0aW9uc0xpc3QsXG4gICAgZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyxcbiAgICBnZXRDYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXMsXG4gIH0pO1xufTskaM2PX29uY2UubWFrZUVudmlyb25tZW50Q2FwdG9yKG1ha2VFbnZpcm9ubWVudENhcHRvcik7XG5mcmVlemUobWFrZUVudmlyb25tZW50Q2FwdG9yKTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCB7XG4gIGdldEVudmlyb25tZW50T3B0aW9uLFxuICBnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0LFxuICBlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzLFxufSA9IG1ha2VFbnZpcm9ubWVudENhcHRvcihnbG9iYWxUaGlzLCB0cnVlKTskaM2PX29uY2UuZ2V0RW52aXJvbm1lbnRPcHRpb24oZ2V0RW52aXJvbm1lbnRPcHRpb24pOyRozY9fb25jZS5nZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0KGdldEVudmlyb25tZW50T3B0aW9uc0xpc3QpOyRozY9fb25jZS5lbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzKGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUVudmlyb25tZW50Q2FwdG9yIjpbIm1ha2VFbnZpcm9ubWVudENhcHRvciJdLCJnZXRFbnZpcm9ubWVudE9wdGlvbiI6WyJnZXRFbnZpcm9ubWVudE9wdGlvbiJdLCJnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0IjpbImdldEVudmlyb25tZW50T3B0aW9uc0xpc3QiXSwiZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyI6WyJlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEk19ulUCAAAVAgAAB0AAABAZW5kby9lcnJvcnMtdjEuMi4xMC9pbmRleC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiRmFpbCIsIlgiLCJhbm5vdGF0ZUVycm9yIiwiYXNzZXJ0IiwiYiIsImJhcmUiLCJtYWtlRXJyb3IiLCJub3RlIiwicSIsInF1b3RlIiwicmVkYWN0ZWQiLCJ0aHJvd1JlZGFjdGVkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qICAgICAgICAgICAgICAgICAgICovXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuLy9cbi8vXG5cbmNvbnN0IGdsb2JhbEFzc2VydCA9IGdsb2JhbFRoaXMuYXNzZXJ0O1xuXG5pZiAoZ2xvYmFsQXNzZXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgdGhyb3cgRXJyb3IoXG4gICAgYENhbm5vdCBpbml0aWFsaXplIEBlbmRvL2Vycm9ycywgbWlzc2luZyBnbG9iYWxUaGlzLmFzc2VydCwgaW1wb3J0ICdzZXMnIGJlZm9yZSAnQGVuZG8vZXJyb3JzJ2AsXG4gICk7XG59XG5cbmNvbnN0IG1pc3NpbmcgPSAvKiAgICAgICAgICAgICAgICAqLyAoW1xuICAndHlwZW9mJyxcbiAgJ2Vycm9yJyxcbiAgJ2ZhaWwnLFxuICAnZXF1YWwnLFxuICAnc3RyaW5nJyxcbiAgJ25vdGUnLFxuICAnZGV0YWlscycsXG4gICdGYWlsJyxcbiAgJ3F1b3RlJyxcbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgJ21ha2VBc3NlcnQnLFxuXSkuZmlsdGVyKG5hbWUgPT4gZ2xvYmFsQXNzZXJ0W25hbWVdID09PSB1bmRlZmluZWQpO1xuaWYgKG1pc3NpbmcubGVuZ3RoID4gMCkge1xuICB0aHJvdyBFcnJvcihcbiAgICBgQ2Fubm90IGluaXRpYWxpemUgQGVuZG8vZXJyb3JzLCBtaXNzaW5nIGdsb2JhbFRoaXMuYXNzZXJ0IG1ldGhvZHMgJHttaXNzaW5nLmpvaW4oXG4gICAgICAnLCAnLFxuICAgICl9YCxcbiAgKTtcbn1cblxuLy9cbi8vXG4vL1xuY29uc3Qge1xuICBiYXJlLFxuICBkZXRhaWxzOiByZWRhY3RlZCxcbiAgZXJyb3I6IG1ha2VFcnJvcixcbiAgRmFpbDogdGhyb3dSZWRhY3RlZCxcbiAgbWFrZUFzc2VydDogX29taXR0ZWRNYWtlQXNzZXJ0LFxuICBub3RlLFxuICBxdW90ZSxcbiAgLi4uYXNzZXJ0aW9uc1xufSA9IGdsb2JhbEFzc2VydDtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLy9cbiRozY9fb25jZS5yZWRhY3RlZChyZWRhY3RlZCk7JGjNj19vbmNlLm1ha2VFcnJvcihtYWtlRXJyb3IpOyRozY9fb25jZS50aHJvd1JlZGFjdGVkKHRocm93UmVkYWN0ZWQpOyRozY9fb25jZS5ub3RlKG5vdGUpOyRozY9fb25jZS5xdW90ZShxdW90ZSk7Y29uc3QgYXNzZXJ0PSh2YWx1ZSxvcHREZXRhaWxzLGVyckNvbnRydWN0b3Isb3B0aW9ucyk9PlxuICBnbG9iYWxBc3NlcnQodmFsdWUsIG9wdERldGFpbHMsIGVyckNvbnRydWN0b3IsIG9wdGlvbnMpOyRozY9fb25jZS5hc3NlcnQoYXNzZXJ0KTtcbk9iamVjdC5hc3NpZ24oYXNzZXJ0LCBhc3NlcnRpb25zKTtcblxuLy9cbi8vXG4vL1xuY29uc3QgYmFyZU9yUXVvdGUgPSBiYXJlIHx8IHF1b3RlO1xuXG4vL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovJGjNj19vbmNlLmJhcmVPclF1b3RlKGJhcmVPclF1b3RlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InJlZGFjdGVkIjpbInJlZGFjdGVkIl0sIlgiOlsicmVkYWN0ZWQiXSwibWFrZUVycm9yIjpbIm1ha2VFcnJvciJdLCJ0aHJvd1JlZGFjdGVkIjpbInRocm93UmVkYWN0ZWQiXSwiRmFpbCI6WyJ0aHJvd1JlZGFjdGVkIl0sIm5vdGUiOlsibm90ZSJdLCJhbm5vdGF0ZUVycm9yIjpbIm5vdGUiXSwicXVvdGUiOlsicXVvdGUiXSwicSI6WyJxdW90ZSJdLCJhc3NlcnQiOlsiYXNzZXJ0Il0sImJhcmUiOlsiYmFyZU9yUXVvdGUiXSwiYiI6WyJiYXJlT3JRdW90ZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADJsYMZGxYAABsWAAAjAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEvc3JjL0UuanN7ImltcG9ydHMiOlsiLi90cmFjay10dXJucy5qcyIsIi4vbWVzc2FnZS1icmVha3BvaW50cy5qcyJdLCJleHBvcnRzIjpbImRlZmF1bHQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCB0cmFja1R1cm5zLG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlcjskaM2PX2ltcG9ydHMoW1tcIi4vdHJhY2stdHVybnMuanNcIiwgW1tcInRyYWNrVHVybnNcIixbJGjNj19hID0+ICh0cmFja1R1cm5zID0gJGjNj19hKV1dXV0sW1wiLi9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzXCIsIFtbXCJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXJcIixbJGjNj19hID0+IChtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIgPSAkaM2PX2EpXV1dXV0pO1xuXG5cbmNvbnN0IHsgZGV0YWlsczogWCwgcXVvdGU6IHEsIEZhaWwsIGVycm9yOiBtYWtlRXJyb3IgfSA9IGFzc2VydDtcbmNvbnN0IHsgYXNzaWduLCBmcmVlemUgfSA9IE9iamVjdDtcblxuLypcblxuICovXG5cbmNvbnN0IG9uU2VuZCA9IG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlcignRU5ET19TRU5EX0JSRUFLUE9JTlRTJyk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBiYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyID0ge1xuICBzZXQoX3RhcmdldCwgX3Byb3AsIF92YWx1ZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgaXNFeHRlbnNpYmxlKF90YXJnZXQpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG4gIHNldFByb3RvdHlwZU9mKF90YXJnZXQsIF92YWx1ZSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgZGVsZXRlUHJvcGVydHkoX3RhcmdldCwgX3Byb3ApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH0sXG59O1xuXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VFUHJveHlIYW5kbGVyID0gKHJlY2lwaWVudCwgSGFuZGxlZFByb21pc2UpID0+XG4gIGhhcmRlbih7XG4gICAgLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbiAgICBnZXQ6IChfdGFyZ2V0LCBwcm9wZXJ0eUtleSwgcmVjZWl2ZXIpID0+IHtcbiAgICAgIHJldHVybiBoYXJkZW4oXG4gICAgICAgIHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgIFtwcm9wZXJ0eUtleV0oLi4uYXJncykge1xuICAgICAgICAgICAgaWYgKHRoaXMgIT09IHJlY2VpdmVyKSB7XG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIHJldHVybiBIYW5kbGVkUHJvbWlzZS5yZWplY3QoXG4gICAgICAgICAgICAgICAgbWFrZUVycm9yKFxuICAgICAgICAgICAgICAgICAgWGBVbmV4cGVjdGVkIHJlY2VpdmVyIGZvciBcIiR7cShwcm9wZXJ0eUtleSl9XCIgbWV0aG9kIG9mIEUoJHtxKFxuICAgICAgICAgICAgICAgICAgICByZWNpcGllbnQsXG4gICAgICAgICAgICAgICAgICApfSlgLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChvblNlbmQgJiYgb25TZW5kLnNob3VsZEJyZWFrcG9pbnQocmVjaXBpZW50LCBwcm9wZXJ0eUtleSkpIHtcbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgZGVidWdnZXI7IC8vXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gSGFuZGxlZFByb21pc2UuYXBwbHlNZXRob2QocmVjaXBpZW50LCBwcm9wZXJ0eUtleSwgYXJncyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vXG4gICAgICAgIH1bcHJvcGVydHlLZXldLFxuICAgICAgKTtcbiAgICB9LFxuICAgIGFwcGx5OiAoX3RhcmdldCwgX3RoaXNBcmcsIGFyZ0FycmF5ID0gW10pID0+IHtcbiAgICAgIGlmIChvblNlbmQgJiYgb25TZW5kLnNob3VsZEJyZWFrcG9pbnQocmVjaXBpZW50LCB1bmRlZmluZWQpKSB7XG4gICAgICAgIC8vXG4gICAgICAgIGRlYnVnZ2VyOyAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgfVxuICAgICAgcmV0dXJuIEhhbmRsZWRQcm9taXNlLmFwcGx5RnVuY3Rpb24ocmVjaXBpZW50LCBhcmdBcnJheSk7XG4gICAgfSxcbiAgICBoYXM6IChfdGFyZ2V0LCBfcCkgPT4ge1xuICAgICAgLy9cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gIH0pO1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlRVNlbmRPbmx5UHJveHlIYW5kbGVyID0gKHJlY2lwaWVudCwgSGFuZGxlZFByb21pc2UpID0+XG4gIGhhcmRlbih7XG4gICAgLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbiAgICBnZXQ6IChfdGFyZ2V0LCBwcm9wZXJ0eUtleSwgcmVjZWl2ZXIpID0+IHtcbiAgICAgIHJldHVybiBoYXJkZW4oXG4gICAgICAgIHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgW3Byb3BlcnR5S2V5XSguLi5hcmdzKSB7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgdGhpcyA9PT0gcmVjZWl2ZXIgfHxcbiAgICAgICAgICAgICAgRmFpbGBVbmV4cGVjdGVkIHJlY2VpdmVyIGZvciBcIiR7cShcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSxcbiAgICAgICAgICAgICAgKX1cIiBtZXRob2Qgb2YgRS5zZW5kT25seSgke3EocmVjaXBpZW50KX0pYDtcbiAgICAgICAgICAgIGlmIChvblNlbmQgJiYgb25TZW5kLnNob3VsZEJyZWFrcG9pbnQocmVjaXBpZW50LCBwcm9wZXJ0eUtleSkpIHtcbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgZGVidWdnZXI7IC8vXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBIYW5kbGVkUHJvbWlzZS5hcHBseU1ldGhvZFNlbmRPbmx5KHJlY2lwaWVudCwgcHJvcGVydHlLZXksIGFyZ3MpO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy9cbiAgICAgICAgfVtwcm9wZXJ0eUtleV0sXG4gICAgICApO1xuICAgIH0sXG4gICAgYXBwbHk6IChfdGFyZ2V0LCBfdGhpc0FyZywgYXJnc0FycmF5ID0gW10pID0+IHtcbiAgICAgIGlmIChvblNlbmQgJiYgb25TZW5kLnNob3VsZEJyZWFrcG9pbnQocmVjaXBpZW50LCB1bmRlZmluZWQpKSB7XG4gICAgICAgIC8vXG4gICAgICAgIGRlYnVnZ2VyOyAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgfVxuICAgICAgSGFuZGxlZFByb21pc2UuYXBwbHlGdW5jdGlvblNlbmRPbmx5KHJlY2lwaWVudCwgYXJnc0FycmF5KTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSxcbiAgICBoYXM6IChfdGFyZ2V0LCBfcCkgPT4ge1xuICAgICAgLy9cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gIH0pO1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlRUdldFByb3h5SGFuZGxlciA9ICh4LCBIYW5kbGVkUHJvbWlzZSkgPT5cbiAgaGFyZGVuKHtcbiAgICAuLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuICAgIGhhczogKF90YXJnZXQsIF9wcm9wKSA9PiB0cnVlLFxuICAgIGdldDogKF90YXJnZXQsIHByb3ApID0+IEhhbmRsZWRQcm9taXNlLmdldCh4LCBwcm9wKSxcbiAgfSk7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgZnVuY1RhcmdldCA9IGZyZWV6ZSgoKSA9PiB7fSk7XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBvYmpUYXJnZXQgPSBmcmVlemUoeyBfX3Byb3RvX186IG51bGwgfSk7XG5cbi8qXG5cbiAqL1xuY29uc3QgbWFrZUUgPSBIYW5kbGVkUHJvbWlzZSA9PiB7XG4gIHJldHVybiBoYXJkZW4oXG4gICAgYXNzaWduKFxuICAgICAgLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICAgICAqL1xuICAgICAgLy9cbiAgICAgIHggPT4gbmV3IFByb3h5KGZ1bmNUYXJnZXQsIG1ha2VFUHJveHlIYW5kbGVyKHgsIEhhbmRsZWRQcm9taXNlKSksXG4gICAgICB7XG4gICAgICAgIC8qXG5cblxuXG5cblxuXG5cblxuXG4gICAgICAgICAqL1xuICAgICAgICAvL1xuICAgICAgICBnZXQ6IHggPT4gbmV3IFByb3h5KG9ialRhcmdldCwgbWFrZUVHZXRQcm94eUhhbmRsZXIoeCwgSGFuZGxlZFByb21pc2UpKSxcblxuICAgICAgICAvKlxuXG5cblxuXG5cblxuXG4gICAgICAgICAqL1xuICAgICAgICByZXNvbHZlOiBIYW5kbGVkUHJvbWlzZS5yZXNvbHZlLFxuXG4gICAgICAgIC8qXG5cblxuXG5cblxuXG5cbiAgICAgICAgICovXG4gICAgICAgIHNlbmRPbmx5OiB4ID0+XG4gICAgICAgICAgLy9cbiAgICAgICAgICBuZXcgUHJveHkoZnVuY1RhcmdldCwgbWFrZUVTZW5kT25seVByb3h5SGFuZGxlcih4LCBIYW5kbGVkUHJvbWlzZSkpLFxuXG4gICAgICAgIC8qXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICAgICAgICovXG4gICAgICAgIHdoZW46ICh4LCBvbmZ1bGZpbGxlZCwgb25yZWplY3RlZCkgPT5cbiAgICAgICAgICBIYW5kbGVkUHJvbWlzZS5yZXNvbHZlKHgpLnRoZW4oXG4gICAgICAgICAgICAuLi50cmFja1R1cm5zKFtvbmZ1bGZpbGxlZCwgb25yZWplY3RlZF0pLFxuICAgICAgICAgICksXG4gICAgICB9LFxuICAgICksXG4gICk7XG59O1xuXG5jb25zdHtkZWZhdWx0OiRjzY9fZGVmYXVsdH09e2RlZmF1bHQ6bWFrZUV9O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmRlZmF1bHQoJGPNj19kZWZhdWx0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmF1bHQiOlsiZGVmYXVsdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAApAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEvc3JjL2V4cG9ydHMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAApOMro5EOAACRDgAAJwAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4xL3NyYy9sb2NhbC5qc3siaW1wb3J0cyI6WyIuL21lc3NhZ2UtYnJlYWtwb2ludHMuanMiXSwiZXhwb3J0cyI6WyJnZXRNZXRob2ROYW1lcyIsImxvY2FsQXBwbHlGdW5jdGlvbiIsImxvY2FsQXBwbHlNZXRob2QiLCJsb2NhbEdldCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlcjskaM2PX2ltcG9ydHMoW1tcIi4vbWVzc2FnZS1icmVha3BvaW50cy5qc1wiLCBbW1wibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyXCIsWyRozY9fYSA9PiAobWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyID0gJGjNj19hKV1dXV1dKTtcblxuY29uc3QgeyBkZXRhaWxzOiBYLCBxdW90ZTogcSwgRmFpbCB9ID0gYXNzZXJ0O1xuXG5jb25zdCB7IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsIGdldFByb3RvdHlwZU9mLCBmcmVlemUgfSA9IE9iamVjdDtcbmNvbnN0IHsgYXBwbHksIG93bktleXMgfSA9IFJlZmxlY3Q7XG5cbmNvbnN0IG50eXBlb2YgPSBzcGVjaW1lbiA9PiAoc3BlY2ltZW4gPT09IG51bGwgPyAnbnVsbCcgOiB0eXBlb2Ygc3BlY2ltZW4pO1xuXG5jb25zdCBvbkRlbGl2ZXJ5ID0gbWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyKCdFTkRPX0RFTElWRVJZX0JSRUFLUE9JTlRTJyk7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgaXNPYmplY3QgPSB2YWwgPT4gT2JqZWN0KHZhbCkgPT09IHZhbDtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IGNvbXBhcmVTdHJpbmdpZmllZCA9IChhLCBiKSA9PiB7XG4gIGlmICh0eXBlb2YgYSA9PT0gdHlwZW9mIGIpIHtcbiAgICBjb25zdCBsZWZ0ID0gU3RyaW5nKGEpO1xuICAgIGNvbnN0IHJpZ2h0ID0gU3RyaW5nKGIpO1xuICAgIC8vXG4gICAgcmV0dXJuIGxlZnQgPCByaWdodCA/IC0xIDogbGVmdCA+IHJpZ2h0ID8gMSA6IDA7XG4gIH1cbiAgaWYgKHR5cGVvZiBhID09PSAnc3ltYm9sJykge1xuICAgIGFzc2VydCh0eXBlb2YgYiA9PT0gJ3N0cmluZycpO1xuICAgIHJldHVybiAtMTtcbiAgfVxuICBhc3NlcnQodHlwZW9mIGEgPT09ICdzdHJpbmcnKTtcbiAgYXNzZXJ0KHR5cGVvZiBiID09PSAnc3ltYm9sJyk7XG4gIHJldHVybiAxO1xufTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBnZXRNZXRob2ROYW1lcyA9IHZhbCA9PiB7XG4gIGxldCBsYXllciA9IHZhbDtcbiAgY29uc3QgbmFtZXMgPSBuZXcgU2V0KCk7IC8vXG4gIHdoaWxlIChsYXllciAhPT0gbnVsbCAmJiBsYXllciAhPT0gT2JqZWN0LnByb3RvdHlwZSkge1xuICAgIC8vXG4gICAgY29uc3QgZGVzY3MgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGxheWVyKTtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2Ygb3duS2V5cyhkZXNjcykpIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgaWYgKHR5cGVvZiB2YWxbbmFtZV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgbmFtZXMuYWRkKG5hbWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoIWlzT2JqZWN0KHZhbCkpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBsYXllciA9IGdldFByb3RvdHlwZU9mKGxheWVyKTtcbiAgfVxuICByZXR1cm4gaGFyZGVuKFsuLi5uYW1lc10uc29ydChjb21wYXJlU3RyaW5naWZpZWQpKTtcbn07XG4vL1xuLy9cbiRozY9fb25jZS5nZXRNZXRob2ROYW1lcyhnZXRNZXRob2ROYW1lcyk7ZnJlZXplKGdldE1ldGhvZE5hbWVzKTtcblxuICAgICAgIGNvbnN0IGxvY2FsQXBwbHlGdW5jdGlvbiA9IChyZWNpcGllbnQsIGFyZ3MpID0+IHtcbiAgdHlwZW9mIHJlY2lwaWVudCA9PT0gJ2Z1bmN0aW9uJyB8fFxuICAgIGFzc2VydC5mYWlsKFxuICAgICAgWGBDYW5ub3QgaW52b2tlIHRhcmdldCBhcyBhIGZ1bmN0aW9uOyB0eXBlb2YgdGFyZ2V0IGlzICR7cShcbiAgICAgICAgbnR5cGVvZihyZWNpcGllbnQpLFxuICAgICAgKX1gLFxuICAgICAgVHlwZUVycm9yLFxuICAgICk7XG4gIGlmIChvbkRlbGl2ZXJ5ICYmIG9uRGVsaXZlcnkuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIHVuZGVmaW5lZCkpIHtcbiAgICAvL1xuICAgIGRlYnVnZ2VyOyAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gYXBwbHkocmVjaXBpZW50LCB1bmRlZmluZWQsIGFyZ3MpO1xuICByZXR1cm4gcmVzdWx0O1xufTskaM2PX29uY2UubG9jYWxBcHBseUZ1bmN0aW9uKGxvY2FsQXBwbHlGdW5jdGlvbik7XG5cbiAgICAgICBjb25zdCBsb2NhbEFwcGx5TWV0aG9kID0gKHJlY2lwaWVudCwgbWV0aG9kTmFtZSwgYXJncykgPT4ge1xuICBpZiAobWV0aG9kTmFtZSA9PT0gdW5kZWZpbmVkIHx8IG1ldGhvZE5hbWUgPT09IG51bGwpIHtcbiAgICAvL1xuICAgIHJldHVybiBsb2NhbEFwcGx5RnVuY3Rpb24ocmVjaXBpZW50LCBhcmdzKTtcbiAgfVxuICBpZiAocmVjaXBpZW50ID09PSB1bmRlZmluZWQgfHwgcmVjaXBpZW50ID09PSBudWxsKSB7XG4gICAgYXNzZXJ0LmZhaWwoXG4gICAgICBYYENhbm5vdCBkZWxpdmVyICR7cShtZXRob2ROYW1lKX0gdG8gdGFyZ2V0OyB0eXBlb2YgdGFyZ2V0IGlzICR7cShcbiAgICAgICAgbnR5cGVvZihyZWNpcGllbnQpLFxuICAgICAgKX1gLFxuICAgICAgVHlwZUVycm9yLFxuICAgICk7XG4gIH1cbiAgY29uc3QgZm4gPSByZWNpcGllbnRbbWV0aG9kTmFtZV07XG4gIGlmIChmbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0LmZhaWwoXG4gICAgICBYYHRhcmdldCBoYXMgbm8gbWV0aG9kICR7cShtZXRob2ROYW1lKX0sIGhhcyAke3EoXG4gICAgICAgIGdldE1ldGhvZE5hbWVzKHJlY2lwaWVudCksXG4gICAgICApfWAsXG4gICAgICBUeXBlRXJyb3IsXG4gICAgKTtcbiAgfVxuICBjb25zdCBmdHlwZSA9IG50eXBlb2YoZm4pO1xuICB0eXBlb2YgZm4gPT09ICdmdW5jdGlvbicgfHxcbiAgICBGYWlsYGludm9rZWQgbWV0aG9kICR7cShtZXRob2ROYW1lKX0gaXMgbm90IGEgZnVuY3Rpb247IGl0IGlzIGEgJHtxKFxuICAgICAgZnR5cGUsXG4gICAgKX1gO1xuICBpZiAob25EZWxpdmVyeSAmJiBvbkRlbGl2ZXJ5LnNob3VsZEJyZWFrcG9pbnQocmVjaXBpZW50LCBtZXRob2ROYW1lKSkge1xuICAgIC8vXG4gICAgZGVidWdnZXI7IC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgfVxuICBjb25zdCByZXN1bHQgPSBhcHBseShmbiwgcmVjaXBpZW50LCBhcmdzKTtcbiAgcmV0dXJuIHJlc3VsdDtcbn07JGjNj19vbmNlLmxvY2FsQXBwbHlNZXRob2QobG9jYWxBcHBseU1ldGhvZCk7XG5cbiAgICAgICBjb25zdCBsb2NhbEdldCA9ICh0LCBrZXkpID0+IHRba2V5XTskaM2PX29uY2UubG9jYWxHZXQobG9jYWxHZXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0TWV0aG9kTmFtZXMiOlsiZ2V0TWV0aG9kTmFtZXMiXSwibG9jYWxBcHBseUZ1bmN0aW9uIjpbImxvY2FsQXBwbHlGdW5jdGlvbiJdLCJsb2NhbEFwcGx5TWV0aG9kIjpbImxvY2FsQXBwbHlNZXRob2QiXSwibG9jYWxHZXQiOlsibG9jYWxHZXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAeTPsuDwPAAA8DwAANQAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4xL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vudi1vcHRpb25zIl0sImV4cG9ydHMiOlsibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZ2V0RW52aXJvbm1lbnRPcHRpb247JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lbnYtb3B0aW9uc1wiLCBbW1wiZ2V0RW52aXJvbm1lbnRPcHRpb25cIixbJGjNj19hID0+IChnZXRFbnZpcm9ubWVudE9wdGlvbiA9ICRozY9fYSldXV1dXSk7XG5cbmNvbnN0IHsgcXVvdGU6IHEsIEZhaWwgfSA9IGFzc2VydDtcblxuY29uc3QgeyBoYXNPd24sIGZyZWV6ZSwgZW50cmllcyB9ID0gT2JqZWN0O1xuXG4vKlxuXG5cblxuXG5cblxuICovXG4vKlxuXG5cblxuXG5cbiAqL1xuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuICovXG5jb25zdCBpc0pTT05SZWNvcmQgPSB2YWwgPT5cbiAgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgdmFsICE9PSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHNpbXBsaWZ5VGFnID0gdGFnID0+IHtcbiAgZm9yIChjb25zdCBwcmVmaXggb2YgWydBbGxlZ2VkOiAnLCAnRGVidWdOYW1lOiAnXSkge1xuICAgIGlmICh0YWcuc3RhcnRzV2l0aChwcmVmaXgpKSB7XG4gICAgICByZXR1cm4gdGFnLnNsaWNlKHByZWZpeC5sZW5ndGgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdGFnO1xufTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIgPSBvcHRpb25OYW1lID0+IHtcbiAgbGV0IGJyZWFrcG9pbnRzID0gSlNPTi5wYXJzZShnZXRFbnZpcm9ubWVudE9wdGlvbihvcHRpb25OYW1lLCAnbnVsbCcpKTtcblxuICBpZiAoYnJlYWtwb2ludHMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGxldCBicmVha3BvaW50c1RhYmxlO1xuXG4gIGNvbnN0IGdldEJyZWFrcG9pbnRzID0gKCkgPT4gYnJlYWtwb2ludHM7XG4gIGZyZWV6ZShnZXRCcmVha3BvaW50cyk7XG5cbiAgY29uc3Qgc2V0QnJlYWtwb2ludHMgPSAobmV3QnJlYWtwb2ludHMgPSBicmVha3BvaW50cykgPT4ge1xuICAgIGlzSlNPTlJlY29yZChuZXdCcmVha3BvaW50cykgfHxcbiAgICAgIEZhaWxgRXhwZWN0ZWQgJHtxKG9wdGlvbk5hbWUpfSBvcHRpb24gdG8gYmUgYSBKU09OIGJyZWFrcG9pbnRzIHJlY29yZGA7XG5cbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAvL1xuICAgIGNvbnN0IG5ld0JyZWFrcG9pbnRzVGFibGUgPSB7IF9fcHJvdG9fXzogbnVsbCB9O1xuXG4gICAgZm9yIChjb25zdCBbdGFnLCBtZXRob2RCUHNdIG9mIGVudHJpZXMobmV3QnJlYWtwb2ludHMpKSB7XG4gICAgICB0YWcgPT09IHNpbXBsaWZ5VGFnKHRhZykgfHxcbiAgICAgICAgRmFpbGBKdXN0IHVzZSBzaW1wbGUgdGFnICR7cShzaW1wbGlmeVRhZyh0YWcpKX0gcmF0aGVyIHRoYW4gJHtxKHRhZyl9YDtcbiAgICAgIGlzSlNPTlJlY29yZChtZXRob2RCUHMpIHx8XG4gICAgICAgIEZhaWxgRXhwZWN0ZWQgJHtxKG9wdGlvbk5hbWUpfSBvcHRpb24ncyAke3EoXG4gICAgICAgICAgdGFnLFxuICAgICAgICApfSB0byBiZSBhIEpTT04gbWV0aG9kcyBicmVha3BvaW50cyByZWNvcmRgO1xuICAgICAgZm9yIChjb25zdCBbbWV0aG9kTmFtZSwgY291bnRdIG9mIGVudHJpZXMobWV0aG9kQlBzKSkge1xuICAgICAgICBjb3VudCA9PT0gJyonIHx8XG4gICAgICAgICAgKHR5cGVvZiBjb3VudCA9PT0gJ251bWJlcicgJiZcbiAgICAgICAgICAgIE51bWJlci5pc1NhZmVJbnRlZ2VyKGNvdW50KSAmJlxuICAgICAgICAgICAgY291bnQgPj0gMCkgfHxcbiAgICAgICAgICBGYWlsYEV4cGVjdGVkICR7cShvcHRpb25OYW1lKX0gb3B0aW9uJ3MgJHtxKHRhZyl9LiR7cShcbiAgICAgICAgICAgIG1ldGhvZE5hbWUsXG4gICAgICAgICAgKX0gdG8gYmUgXCIqXCIgb3IgYSBub24tbmVnYXRpdmUgaW50ZWdlcmA7XG5cbiAgICAgICAgY29uc3QgY2xhc3NCUHMgPSBoYXNPd24obmV3QnJlYWtwb2ludHNUYWJsZSwgbWV0aG9kTmFtZSlcbiAgICAgICAgICA/IG5ld0JyZWFrcG9pbnRzVGFibGVbbWV0aG9kTmFtZV1cbiAgICAgICAgICA6IChuZXdCcmVha3BvaW50c1RhYmxlW21ldGhvZE5hbWVdID0ge1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICBfX3Byb3RvX186IG51bGwsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgY2xhc3NCUHNbdGFnXSA9IGNvdW50O1xuICAgICAgfVxuICAgIH1cbiAgICBicmVha3BvaW50cyA9IG5ld0JyZWFrcG9pbnRzO1xuICAgIGJyZWFrcG9pbnRzVGFibGUgPSBuZXdCcmVha3BvaW50c1RhYmxlO1xuICB9O1xuICBmcmVlemUoc2V0QnJlYWtwb2ludHMpO1xuXG4gIGNvbnN0IHNob3VsZEJyZWFrcG9pbnQgPSAocmVjaXBpZW50LCBtZXRob2ROYW1lKSA9PiB7XG4gICAgaWYgKG1ldGhvZE5hbWUgPT09IHVuZGVmaW5lZCB8fCBtZXRob2ROYW1lID09PSBudWxsKSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBjbGFzc0JQcyA9IGJyZWFrcG9pbnRzVGFibGVbbWV0aG9kTmFtZV0gfHwgYnJlYWtwb2ludHNUYWJsZVsnKiddO1xuICAgIGlmIChjbGFzc0JQcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGxldCB0YWcgPSBzaW1wbGlmeVRhZyhyZWNpcGllbnRbU3ltYm9sLnRvU3RyaW5nVGFnXSk7XG4gICAgbGV0IGNvdW50ID0gY2xhc3NCUHNbdGFnXTtcbiAgICBpZiAoY291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGFnID0gJyonO1xuICAgICAgY291bnQgPSBjbGFzc0JQc1t0YWddO1xuICAgICAgaWYgKGNvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoY291bnQgPT09ICcqJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChjb3VudCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGFzc2VydCh0eXBlb2YgY291bnQgPT09ICdudW1iZXInICYmIGNvdW50ID49IDEpO1xuICAgIGNsYXNzQlBzW3RhZ10gPSBjb3VudCAtIDE7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuICBmcmVlemUoc2hvdWxkQnJlYWtwb2ludCk7XG5cbiAgY29uc3QgYnJlYWtwb2ludFRlc3RlciA9IGZyZWV6ZSh7XG4gICAgZ2V0QnJlYWtwb2ludHMsXG4gICAgc2V0QnJlYWtwb2ludHMsXG4gICAgc2hvdWxkQnJlYWtwb2ludCxcbiAgfSk7XG4gIGJyZWFrcG9pbnRUZXN0ZXIuc2V0QnJlYWtwb2ludHMoKTtcbiAgcmV0dXJuIGJyZWFrcG9pbnRUZXN0ZXI7XG59OyRozY9fb25jZS5tYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIobWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyKTtcbmZyZWV6ZShtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyIjpbIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC4dpSdXwMAAF8DAAApAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEvc3JjL25vLXNoaW0uanN7ImltcG9ydHMiOlsiLi9FLmpzIiwiLi9leHBvcnRzLmpzIl0sImV4cG9ydHMiOlsiRSIsIkhhbmRsZWRQcm9taXNlIl0sInJlZXhwb3J0cyI6WyIuL2V4cG9ydHMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlRTskaM2PX2ltcG9ydHMoW1tcIi4vRS5qc1wiLCBbW1wiZGVmYXVsdFwiLFskaM2PX2EgPT4gKG1ha2VFID0gJGjNj19hKV1dXV0sW1wiLi9leHBvcnRzLmpzXCIsIFtdXV0pO1xuXG4vL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuY29uc3QgaHAgPSBIYW5kbGVkUHJvbWlzZTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuaHAoaHApO1xuICAgICAgIGNvbnN0IEUgPSBtYWtlRShocCk7JGjNj19vbmNlLkUoRSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJIYW5kbGVkUHJvbWlzZSI6WyJocCJdLCJFIjpbIkUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAqYDDs54KAACeCgAALQAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4xL3NyYy90cmFjay10dXJucy5qc3siaW1wb3J0cyI6WyJAZW5kby9lbnYtb3B0aW9ucyJdLCJleHBvcnRzIjpbInRyYWNrVHVybnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBnZXRFbnZpcm9ubWVudE9wdGlvbixlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZW52LW9wdGlvbnNcIiwgW1tcImdldEVudmlyb25tZW50T3B0aW9uXCIsWyRozY9fYSA9PiAoZ2V0RW52aXJvbm1lbnRPcHRpb24gPSAkaM2PX2EpXV0sW1wiZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhc1wiLFskaM2PX2EgPT4gKGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbmxldCBoaWRkZW5QcmlvckVycm9yO1xubGV0IGhpZGRlbkN1cnJlbnRUdXJuID0gMDtcbmxldCBoaWRkZW5DdXJyZW50RXZlbnQgPSAwO1xuXG4vL1xuY29uc3QgVkVSQk9TRSA9IGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMoJ0RFQlVHJywgJ3RyYWNrLXR1cm5zJyk7XG5cbi8vXG4vL1xuY29uc3QgRU5BQkxFRCA9XG4gIGdldEVudmlyb25tZW50T3B0aW9uKCdUUkFDS19UVVJOUycsICdkaXNhYmxlZCcsIFsnZW5hYmxlZCddKSA9PT0gJ2VuYWJsZWQnO1xuXG4vL1xuLy9cbi8vXG4vL1xuXG5jb25zdCBhZGRSZWplY3Rpb25Ob3RlID0gZGV0YWlsc05vdGUgPT4gcmVhc29uID0+IHtcbiAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgZ2xvYmFsVGhpcy5hc3NlcnQubm90ZShyZWFzb24sIGRldGFpbHNOb3RlKTtcbiAgfVxuICBpZiAoVkVSQk9TRSkge1xuICAgIGNvbnNvbGUubG9nKCdSRUpFQ1RFRCBhdCB0b3Agb2YgZXZlbnQgbG9vcCcsIHJlYXNvbik7XG4gIH1cbn07XG5cbmNvbnN0IHdyYXBGdW5jdGlvbiA9XG4gIChmdW5jLCBzZW5kaW5nRXJyb3IsIFgpID0+XG4gICguLi5hcmdzKSA9PiB7XG4gICAgaGlkZGVuUHJpb3JFcnJvciA9IHNlbmRpbmdFcnJvcjtcbiAgICBoaWRkZW5DdXJyZW50VHVybiArPSAxO1xuICAgIGhpZGRlbkN1cnJlbnRFdmVudCA9IDA7XG4gICAgdHJ5IHtcbiAgICAgIGxldCByZXN1bHQ7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBmdW5jKC4uLmFyZ3MpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIGdsb2JhbFRoaXMuYXNzZXJ0Lm5vdGUoXG4gICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICBYYFRocm93biBmcm9tOiAke2hpZGRlblByaW9yRXJyb3J9OiR7aGlkZGVuQ3VycmVudFR1cm59LiR7aGlkZGVuQ3VycmVudEV2ZW50fWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoVkVSQk9TRSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdUSFJPV04gdG8gdG9wIG9mIGV2ZW50IGxvb3AnLCBlcnIpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIC8vXG4gICAgICBjb25zdCBkZXRhaWxzTm90ZSA9IFhgUmVqZWN0aW9uIGZyb206ICR7aGlkZGVuUHJpb3JFcnJvcn06JHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YDtcbiAgICAgIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLmNhdGNoKGFkZFJlamVjdGlvbk5vdGUoZGV0YWlsc05vdGUpKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGhpZGRlblByaW9yRXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCB0cmFja1R1cm5zID0gZnVuY3MgPT4ge1xuICBpZiAoIUVOQUJMRUQgfHwgdHlwZW9mIGdsb2JhbFRoaXMgPT09ICd1bmRlZmluZWQnIHx8ICFnbG9iYWxUaGlzLmFzc2VydCkge1xuICAgIHJldHVybiBmdW5jcztcbiAgfVxuICBjb25zdCB7IGRldGFpbHM6IFgsIG5vdGU6IGFubm90YXRlRXJyb3IgfSA9IGdsb2JhbFRoaXMuYXNzZXJ0O1xuXG4gIGhpZGRlbkN1cnJlbnRFdmVudCArPSAxO1xuICBjb25zdCBzZW5kaW5nRXJyb3IgPSBFcnJvcihcbiAgICBgRXZlbnQ6ICR7aGlkZGVuQ3VycmVudFR1cm59LiR7aGlkZGVuQ3VycmVudEV2ZW50fWAsXG4gICk7XG4gIGlmIChoaWRkZW5QcmlvckVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICBhbm5vdGF0ZUVycm9yKHNlbmRpbmdFcnJvciwgWGBDYXVzZWQgYnk6ICR7aGlkZGVuUHJpb3JFcnJvcn1gKTtcbiAgfVxuXG4gIHJldHVybiAvKiAgICAgICAgICAgICovIChcbiAgICBmdW5jcy5tYXAoZnVuYyA9PiBmdW5jICYmIHdyYXBGdW5jdGlvbihmdW5jLCBzZW5kaW5nRXJyb3IsIFgpKVxuICApO1xufTtcblxuLypcblxuXG5cblxuICovJGjNj19vbmNlLnRyYWNrVHVybnModHJhY2tUdXJucyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ0cmFja1R1cm5zIjpbInRyYWNrVHVybnMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAe6GgR2QCAABkAgAAIwAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4xL3V0aWxzLmpzeyJpbXBvcnRzIjpbIi4vc3JjL2xvY2FsLmpzIiwiLi9zcmMvbWVzc2FnZS1icmVha3BvaW50cy5qcyJdLCJleHBvcnRzIjpbbnVsbCxudWxsXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvbG9jYWwuanNcIiwgW11dLFtcIi4vc3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9sb2NhbC5qcyI6W1siZ2V0TWV0aG9kTmFtZXMiLCJnZXRNZXRob2ROYW1lcyJdXSwiLi9zcmMvbWVzc2FnZS1icmVha3BvaW50cy5qcyI6W1sibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyIiwibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADcRdmjYAIAAGACAAAZAAAAQGVuZG8vZXhvLXYxLjUuOS9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9leG8tbWFrZXJzLmpzIiwiLi9zcmMvdHlwZXMuanMiLCIuL3NyYy9nZXQtaW50ZXJmYWNlLmpzIl0sImV4cG9ydHMiOltudWxsXSwicmVleHBvcnRzIjpbIi4vc3JjL2V4by1tYWtlcnMuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9leG8tbWFrZXJzLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV0sW1wiLi9zcmMvZ2V0LWludGVyZmFjZS5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2dldC1pbnRlcmZhY2UuanMiOltbIkdFVF9JTlRFUkZBQ0VfR1VBUkQiLCJHRVRfSU5URVJGQUNFX0dVQVJEIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADgINvCzxcAAM8XAAAiAAAAQGVuZG8vZXhvLXYxLjUuOS9zcmMvZXhvLW1ha2Vycy5qc3siaW1wb3J0cyI6WyJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyIsIkBlbmRvL2Vudi1vcHRpb25zIiwiQGVuZG8vZXJyb3JzIiwiLi9leG8tdG9vbHMuanMiXSwiZXhwb3J0cyI6WyJkZWZpbmVFeG9DbGFzcyIsImRlZmluZUV4b0NsYXNzS2l0IiwiaW5pdEVtcHR5IiwibWFrZUV4byJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG9iamVjdE1hcCxlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzLEZhaWwscSxkZWZlbmRQcm90b3R5cGUsZGVmZW5kUHJvdG90eXBlS2l0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanNcIiwgW1tcIm9iamVjdE1hcFwiLFskaM2PX2EgPT4gKG9iamVjdE1hcCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vudi1vcHRpb25zXCIsIFtbXCJlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzXCIsWyRozY9fYSA9PiAoZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCIuL2V4by10b29scy5qc1wiLCBbW1wiZGVmZW5kUHJvdG90eXBlXCIsWyRozY9fYSA9PiAoZGVmZW5kUHJvdG90eXBlID0gJGjNj19hKV1dLFtcImRlZmVuZFByb3RvdHlwZUtpdFwiLFskaM2PX2EgPT4gKGRlZmVuZFByb3RvdHlwZUtpdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuLypcblxuICovXG5cbmNvbnN0IHsgY3JlYXRlLCBzZWFsLCBmcmVlemUsIGRlZmluZVByb3BlcnR5LCB2YWx1ZXMgfSA9IE9iamVjdDtcblxuLy9cbmNvbnN0IExBQkVMX0lOU1RBTkNFUyA9IGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMoJ0RFQlVHJywgJ2xhYmVsLWluc3RhbmNlcycpO1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VTZWxmID0gKHByb3RvLCBpbnN0YW5jZUNvdW50KSA9PiB7XG4gIGNvbnN0IHNlbGYgPSBjcmVhdGUocHJvdG8pO1xuICBpZiAoTEFCRUxfSU5TVEFOQ0VTKSB7XG4gICAgZGVmaW5lUHJvcGVydHkoc2VsZiwgU3ltYm9sLnRvU3RyaW5nVGFnLCB7XG4gICAgICB2YWx1ZTogYCR7cHJvdG9bU3ltYm9sLnRvU3RyaW5nVGFnXX0jJHtpbnN0YW5jZUNvdW50fWAsXG4gICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgfSk7XG4gIH1cbiAgcmV0dXJuIGhhcmRlbihzZWxmKTtcbn07XG5cbmNvbnN0IGVtcHR5UmVjb3JkID0gaGFyZGVuKHt9KTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgaW5pdEVtcHR5ID0gKCkgPT4gZW1wdHlSZWNvcmQ7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmluaXRFbXB0eShpbml0RW1wdHkpO1xuICAgICAgIGNvbnN0IGRlZmluZUV4b0NsYXNzID0gKFxuICB0YWcsXG4gIGludGVyZmFjZUd1YXJkLFxuICBpbml0LFxuICBtZXRob2RzLFxuICBvcHRpb25zID0ge30sXG4pID0+IHtcbiAgaGFyZGVuKG1ldGhvZHMpO1xuICBjb25zdCB7XG4gICAgZmluaXNoID0gdW5kZWZpbmVkLFxuICAgIHJlY2VpdmVBbXBsaWZpZXIgPSB1bmRlZmluZWQsXG4gICAgcmVjZWl2ZUluc3RhbmNlVGVzdGVyID0gdW5kZWZpbmVkLFxuICB9ID0gb3B0aW9ucztcbiAgcmVjZWl2ZUFtcGxpZmllciA9PT0gdW5kZWZpbmVkIHx8XG4gICAgRmFpbGBPbmx5IGZhY2V0cyBvZiBhbiBleG8gY2xhc3Mga2l0IGNhbiBiZSBhbXBsaWZpZWQgJHtxKHRhZyl9YDtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgY29udGV4dE1hcCA9IG5ldyBXZWFrTWFwKCk7XG4gIGNvbnN0IHByb3RvID0gZGVmZW5kUHJvdG90eXBlKFxuICAgIHRhZyxcbiAgICBzZWxmID0+IC8qICAgICAgICAgICAgICAqLyAoY29udGV4dE1hcC5nZXQoc2VsZikpLFxuICAgIG1ldGhvZHMsXG4gICAgdHJ1ZSxcbiAgICBpbnRlcmZhY2VHdWFyZCxcbiAgKTtcbiAgbGV0IGluc3RhbmNlQ291bnQgPSAwO1xuICAvKlxuXG4gICAqL1xuICBjb25zdCBtYWtlSW5zdGFuY2UgPSAoLi4uYXJncykgPT4ge1xuICAgIC8vXG4gICAgY29uc3Qgc3RhdGUgPSBzZWFsKGluaXQoLi4uYXJncykpO1xuICAgIGluc3RhbmNlQ291bnQgKz0gMTtcbiAgICBjb25zdCBzZWxmID0gbWFrZVNlbGYocHJvdG8sIGluc3RhbmNlQ291bnQpO1xuXG4gICAgLy9cbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGNvbnN0IGNvbnRleHQgPSBmcmVlemUoeyBzdGF0ZSwgc2VsZiB9KTtcbiAgICBjb250ZXh0TWFwLnNldChzZWxmLCBjb250ZXh0KTtcbiAgICBpZiAoZmluaXNoKSB7XG4gICAgICBmaW5pc2goY29udGV4dCk7XG4gICAgfVxuICAgIHJldHVybiBzZWxmO1xuICB9O1xuXG4gIGlmIChyZWNlaXZlSW5zdGFuY2VUZXN0ZXIpIHtcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgaXNJbnN0YW5jZSA9IChleG8sIGZhY2V0TmFtZSA9IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgZmFjZXROYW1lID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgRmFpbGBmYWNldE5hbWUgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIGFuIGV4byBjbGFzcyBraXQ6ICR7cShcbiAgICAgICAgICB0YWcsXG4gICAgICAgICl9IGhhcyBubyBmYWNldCAke3EoZmFjZXROYW1lKX1gO1xuICAgICAgcmV0dXJuIGNvbnRleHRNYXAuaGFzKGV4byk7XG4gICAgfTtcbiAgICBoYXJkZW4oaXNJbnN0YW5jZSk7XG4gICAgcmVjZWl2ZUluc3RhbmNlVGVzdGVyKGlzSW5zdGFuY2UpO1xuICB9XG5cbiAgcmV0dXJuIGhhcmRlbihtYWtlSW5zdGFuY2UpO1xufTskaM2PX29uY2UuZGVmaW5lRXhvQ2xhc3MoZGVmaW5lRXhvQ2xhc3MpO1xuaGFyZGVuKGRlZmluZUV4b0NsYXNzKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBkZWZpbmVFeG9DbGFzc0tpdCA9IChcbiAgdGFnLFxuICBpbnRlcmZhY2VHdWFyZEtpdCxcbiAgaW5pdCxcbiAgbWV0aG9kc0tpdCxcbiAgb3B0aW9ucyA9IHt9LFxuKSA9PiB7XG4gIGhhcmRlbihtZXRob2RzS2l0KTtcbiAgY29uc3Qge1xuICAgIGZpbmlzaCA9IHVuZGVmaW5lZCxcbiAgICByZWNlaXZlQW1wbGlmaWVyID0gdW5kZWZpbmVkLFxuICAgIHJlY2VpdmVJbnN0YW5jZVRlc3RlciA9IHVuZGVmaW5lZCxcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGNvbnRleHRNYXBLaXQgPSBvYmplY3RNYXAobWV0aG9kc0tpdCwgKCkgPT4gbmV3IFdlYWtNYXAoKSk7XG4gIGNvbnN0IGdldENvbnRleHRLaXQgPSBvYmplY3RNYXAoXG4gICAgY29udGV4dE1hcEtpdCxcbiAgICBjb250ZXh0TWFwID0+IGZhY2V0ID0+IGNvbnRleHRNYXAuZ2V0KGZhY2V0KSxcbiAgKTtcbiAgY29uc3QgcHJvdG90eXBlS2l0ID0gZGVmZW5kUHJvdG90eXBlS2l0KFxuICAgIHRhZyxcbiAgICBnZXRDb250ZXh0S2l0LFxuICAgIG1ldGhvZHNLaXQsXG4gICAgdHJ1ZSxcbiAgICBpbnRlcmZhY2VHdWFyZEtpdCxcbiAgKTtcbiAgbGV0IGluc3RhbmNlQ291bnQgPSAwO1xuICAvKlxuXG4gICAqL1xuICBjb25zdCBtYWtlSW5zdGFuY2VLaXQgPSAoLi4uYXJncykgPT4ge1xuICAgIC8vXG4gICAgY29uc3Qgc3RhdGUgPSBzZWFsKGluaXQoLi4uYXJncykpO1xuICAgIC8vXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGNvbnN0IGNvbnRleHQgPSB7IHN0YXRlLCBmYWNldHM6IG51bGwgfTtcbiAgICBpbnN0YW5jZUNvdW50ICs9IDE7XG4gICAgY29uc3QgZmFjZXRzID0gb2JqZWN0TWFwKHByb3RvdHlwZUtpdCwgKHByb3RvLCBmYWNldE5hbWUpID0+IHtcbiAgICAgIGNvbnN0IHNlbGYgPSBtYWtlU2VsZihwcm90bywgaW5zdGFuY2VDb3VudCk7XG4gICAgICBjb250ZXh0TWFwS2l0W2ZhY2V0TmFtZV0uc2V0KHNlbGYsIGNvbnRleHQpO1xuICAgICAgcmV0dXJuIHNlbGY7XG4gICAgfSk7XG4gICAgY29udGV4dC5mYWNldHMgPSBmYWNldHM7XG4gICAgLy9cbiAgICBmcmVlemUoY29udGV4dCk7XG4gICAgaWYgKGZpbmlzaCkge1xuICAgICAgZmluaXNoKGNvbnRleHQpO1xuICAgIH1cbiAgICByZXR1cm4gLyogICAgICAgICAgICAgICAgICAgICAgICAqLyAoY29udGV4dC5mYWNldHMpO1xuICB9O1xuXG4gIGlmIChyZWNlaXZlQW1wbGlmaWVyKSB7XG4gICAgLyogICAgICAgICAgICAgICAgICAqL1xuICAgIGNvbnN0IGFtcGxpZnkgPSBleG9GYWNldCA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGNvbnRleHRNYXAgb2YgdmFsdWVzKGNvbnRleHRNYXBLaXQpKSB7XG4gICAgICAgIGlmIChjb250ZXh0TWFwLmhhcyhleG9GYWNldCkpIHtcbiAgICAgICAgICBjb25zdCB7IGZhY2V0cyB9ID0gY29udGV4dE1hcC5nZXQoZXhvRmFjZXQpO1xuICAgICAgICAgIHJldHVybiBmYWNldHM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRocm93IEZhaWxgTXVzdCBiZSBhIGZhY2V0IG9mICR7cSh0YWcpfTogJHtleG9GYWNldH1gO1xuICAgIH07XG4gICAgaGFyZGVuKGFtcGxpZnkpO1xuICAgIHJlY2VpdmVBbXBsaWZpZXIoYW1wbGlmeSk7XG4gIH1cblxuICBpZiAocmVjZWl2ZUluc3RhbmNlVGVzdGVyKSB7XG4gICAgLyogICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGNvbnN0IGlzSW5zdGFuY2UgPSAoZXhvRmFjZXQsIGZhY2V0TmFtZSA9IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgaWYgKGZhY2V0TmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZXMoY29udGV4dE1hcEtpdCkuc29tZShjb250ZXh0TWFwID0+XG4gICAgICAgICAgY29udGV4dE1hcC5oYXMoZXhvRmFjZXQpLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgYXNzZXJ0LnR5cGVvZihmYWNldE5hbWUsICdzdHJpbmcnKTtcbiAgICAgIGNvbnN0IGNvbnRleHRNYXAgPSBjb250ZXh0TWFwS2l0W2ZhY2V0TmFtZV07XG4gICAgICBjb250ZXh0TWFwICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgRmFpbGBleG8gY2xhc3Mga2l0ICR7cSh0YWcpfSBoYXMgbm8gZmFjZXQgbmFtZWQgJHtxKGZhY2V0TmFtZSl9YDtcbiAgICAgIHJldHVybiBjb250ZXh0TWFwLmhhcyhleG9GYWNldCk7XG4gICAgfTtcbiAgICBoYXJkZW4oaXNJbnN0YW5jZSk7XG4gICAgcmVjZWl2ZUluc3RhbmNlVGVzdGVyKGlzSW5zdGFuY2UpO1xuICB9XG5cbiAgcmV0dXJuIGhhcmRlbihtYWtlSW5zdGFuY2VLaXQpO1xufTskaM2PX29uY2UuZGVmaW5lRXhvQ2xhc3NLaXQoZGVmaW5lRXhvQ2xhc3NLaXQpO1xuaGFyZGVuKGRlZmluZUV4b0NsYXNzS2l0KTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlRXhvID0gKHRhZywgaW50ZXJmYWNlR3VhcmQsIG1ldGhvZHMsIG9wdGlvbnMgPSB1bmRlZmluZWQpID0+IHtcbiAgY29uc3QgbWFrZUluc3RhbmNlID0gZGVmaW5lRXhvQ2xhc3MoXG4gICAgdGFnLFxuICAgIGludGVyZmFjZUd1YXJkLFxuICAgIGluaXRFbXB0eSxcbiAgICBtZXRob2RzLFxuICAgIG9wdGlvbnMsXG4gICk7XG4gIHJldHVybiBtYWtlSW5zdGFuY2UoKTtcbn07JGjNj19vbmNlLm1ha2VFeG8obWFrZUV4byk7XG5oYXJkZW4obWFrZUV4byk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpbml0RW1wdHkiOlsiaW5pdEVtcHR5Il0sImRlZmluZUV4b0NsYXNzIjpbImRlZmluZUV4b0NsYXNzIl0sImRlZmluZUV4b0NsYXNzS2l0IjpbImRlZmluZUV4b0NsYXNzS2l0Il0sIm1ha2VFeG8iOlsibWFrZUV4byJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADBKpYxAzgAAAM4AAAhAAAAQGVuZG8vZXhvLXYxLjUuOS9zcmMvZXhvLXRvb2xzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vZmFyIiwiQGVuZG8vcGF0dGVybnMiLCJAZW5kby9jb21tb24vbGlzdC1kaWZmZXJlbmNlLmpzIiwiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiLCJAZW5kby9lcnJvcnMiLCIuL2dldC1pbnRlcmZhY2UuanMiXSwiZXhwb3J0cyI6WyJkZWZlbmRQcm90b3R5cGUiLCJkZWZlbmRQcm90b3R5cGVLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBnZXRNZXRob2ROYW1lcyxoYXNPd25Qcm9wZXJ0eU9mLHRvVGhyb3dhYmxlLEUsRmFyLG11c3RNYXRjaCxNLGlzQXdhaXRBcmdHdWFyZCxpc1Jhd0d1YXJkLGdldEF3YWl0QXJnR3VhcmRQYXlsb2FkLGdldE1ldGhvZEd1YXJkUGF5bG9hZCxnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQsZ2V0Q29weU1hcEVudHJpZXMsbGlzdERpZmZlcmVuY2Usb2JqZWN0TWFwLHEsRmFpbCxHRVRfSU5URVJGQUNFX0dVQVJEOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qc1wiLCBbW1wiZ2V0TWV0aG9kTmFtZXNcIixbJGjNj19hID0+IChnZXRNZXRob2ROYW1lcyA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImhhc093blByb3BlcnR5T2ZcIixbJGjNj19hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjNj19hKV1dLFtcInRvVGhyb3dhYmxlXCIsWyRozY9fYSA9PiAodG9UaHJvd2FibGUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV0sW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wiaXNBd2FpdEFyZ0d1YXJkXCIsWyRozY9fYSA9PiAoaXNBd2FpdEFyZ0d1YXJkID0gJGjNj19hKV1dLFtcImlzUmF3R3VhcmRcIixbJGjNj19hID0+IChpc1Jhd0d1YXJkID0gJGjNj19hKV1dLFtcImdldEF3YWl0QXJnR3VhcmRQYXlsb2FkXCIsWyRozY9fYSA9PiAoZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQgPSAkaM2PX2EpXV0sW1wiZ2V0TWV0aG9kR3VhcmRQYXlsb2FkXCIsWyRozY9fYSA9PiAoZ2V0TWV0aG9kR3VhcmRQYXlsb2FkID0gJGjNj19hKV1dLFtcImdldEludGVyZmFjZUd1YXJkUGF5bG9hZFwiLFskaM2PX2EgPT4gKGdldEludGVyZmFjZUd1YXJkUGF5bG9hZCA9ICRozY9fYSldXSxbXCJnZXRDb3B5TWFwRW50cmllc1wiLFskaM2PX2EgPT4gKGdldENvcHlNYXBFbnRyaWVzID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qc1wiLCBbW1wibGlzdERpZmZlcmVuY2VcIixbJGjNj19hID0+IChsaXN0RGlmZmVyZW5jZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzXCIsIFtbXCJvYmplY3RNYXBcIixbJGjNj19hID0+IChvYmplY3RNYXAgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9nZXQtaW50ZXJmYWNlLmpzXCIsIFtbXCJHRVRfSU5URVJGQUNFX0dVQVJEXCIsWyRozY9fYSA9PiAoR0VUX0lOVEVSRkFDRV9HVUFSRCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLypcblxuXG4gKi9cblxuY29uc3QgeyBhcHBseSwgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgZGVmaW5lUHJvcGVydGllcywgZnJvbUVudHJpZXMgfSA9IE9iamVjdDtcblxuLypcblxuXG4gKi9cbmNvbnN0IFJhd01ldGhvZEd1YXJkID0gTS5jYWxsKCkucmVzdChNLnJhdygpKS5yZXR1cm5zKE0ucmF3KCkpO1xuXG5jb25zdCBSRURBQ1RFRF9SQVdfQVJHID0gJzxyZWRhY3RlZCByYXcgYXJnPic7XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBQYXNzYWJsZU1ldGhvZEd1YXJkID0gTS5jYWxsKCkucmVzdChNLmFueSgpKS5yZXR1cm5zKE0uYW55KCkpO1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGRlZmVuZFN5bmNBcmdzID0gKHN5bmNBcmdzLCBtYXRjaENvbmZpZywgbGFiZWwgPSB1bmRlZmluZWQpID0+IHtcbiAgY29uc3Qge1xuICAgIGRlY2xhcmVkTGVuLFxuICAgIGhhc1Jlc3RBcmdHdWFyZCxcbiAgICByZXN0QXJnR3VhcmRJc1JhdyxcbiAgICBwYXJhbXNQYXR0ZXJuLFxuICAgIHJlZGFjdGVkSW5kaWNlcyxcbiAgfSA9IG1hdGNoQ29uZmlnO1xuXG4gIC8vXG4gIC8vXG4gIGxldCBtYXRjaGFibGVBcmdzID0gc3luY0FyZ3M7XG4gIGlmIChyZXN0QXJnR3VhcmRJc1JhdyAmJiBzeW5jQXJncy5sZW5ndGggPiBkZWNsYXJlZExlbikge1xuICAgIGNvbnN0IHJlc3RMZW4gPSBzeW5jQXJncy5sZW5ndGggLSBkZWNsYXJlZExlbjtcbiAgICBjb25zdCByZWRhY3RlZFJlc3QgPSBBcnJheShyZXN0TGVuKS5maWxsKFJFREFDVEVEX1JBV19BUkcpO1xuICAgIG1hdGNoYWJsZUFyZ3MgPSBbLi4uc3luY0FyZ3Muc2xpY2UoMCwgZGVjbGFyZWRMZW4pLCAuLi5yZWRhY3RlZFJlc3RdO1xuICB9IGVsc2UgaWYgKFxuICAgIHJlZGFjdGVkSW5kaWNlcy5sZW5ndGggPiAwICYmXG4gICAgcmVkYWN0ZWRJbmRpY2VzWzBdIDwgc3luY0FyZ3MubGVuZ3RoXG4gICkge1xuICAgIC8vXG4gICAgLy9cbiAgICBtYXRjaGFibGVBcmdzID0gWy4uLnN5bmNBcmdzXTtcbiAgfVxuXG4gIGZvciAoY29uc3QgaSBvZiByZWRhY3RlZEluZGljZXMpIHtcbiAgICBpZiAoaSA+PSBtYXRjaGFibGVBcmdzLmxlbmd0aCkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIG1hdGNoYWJsZUFyZ3NbaV0gPSBSRURBQ1RFRF9SQVdfQVJHO1xuICB9XG5cbiAgbXVzdE1hdGNoKGhhcmRlbihtYXRjaGFibGVBcmdzKSwgcGFyYW1zUGF0dGVybiwgbGFiZWwpO1xuXG4gIGlmIChoYXNSZXN0QXJnR3VhcmQpIHtcbiAgICByZXR1cm4gc3luY0FyZ3M7XG4gIH1cbiAgc3luY0FyZ3MubGVuZ3RoIDw9IGRlY2xhcmVkTGVuIHx8XG4gICAgRmFpbGAke3EobGFiZWwpfSBhY2NlcHRzIGF0IG1vc3QgJHtxKGRlY2xhcmVkTGVuKX0gYXJndW1lbnRzLCBub3QgJHtxKFxuICAgICAgc3luY0FyZ3MubGVuZ3RoLFxuICAgICl9OiAke3N5bmNBcmdzfWA7XG4gIHJldHVybiBzeW5jQXJncztcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgYnVpbGRNYXRjaENvbmZpZyA9IG1ldGhvZEd1YXJkUGF5bG9hZCA9PiB7XG4gIGNvbnN0IHtcbiAgICBhcmdHdWFyZHMsXG4gICAgb3B0aW9uYWxBcmdHdWFyZHMgPSBbXSxcbiAgICByZXN0QXJnR3VhcmQsXG4gIH0gPSBtZXRob2RHdWFyZFBheWxvYWQ7XG5cbiAgY29uc3QgbWF0Y2hhYmxlQXJnR3VhcmRzID0gWy4uLmFyZ0d1YXJkcywgLi4ub3B0aW9uYWxBcmdHdWFyZHNdO1xuXG4gIGNvbnN0IHJlZGFjdGVkSW5kaWNlcyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdGNoYWJsZUFyZ0d1YXJkcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGlmIChpc1Jhd0d1YXJkKG1hdGNoYWJsZUFyZ0d1YXJkc1tpXSkpIHtcbiAgICAgIG1hdGNoYWJsZUFyZ0d1YXJkc1tpXSA9IFJFREFDVEVEX1JBV19BUkc7XG4gICAgICByZWRhY3RlZEluZGljZXMucHVzaChpKTtcbiAgICB9XG4gIH1cblxuICAvL1xuICBsZXQgbWF0Y2hhYmxlUmVzdEFyZ0d1YXJkID0gcmVzdEFyZ0d1YXJkO1xuICBpZiAoaXNSYXdHdWFyZChtYXRjaGFibGVSZXN0QXJnR3VhcmQpKSB7XG4gICAgbWF0Y2hhYmxlUmVzdEFyZ0d1YXJkID0gTS5hcnJheU9mKFJFREFDVEVEX1JBV19BUkcpO1xuICB9XG4gIGNvbnN0IG1hdGNoYWJsZU1ldGhvZEd1YXJkUGF5bG9hZCA9IGhhcmRlbih7XG4gICAgLi4ubWV0aG9kR3VhcmRQYXlsb2FkLFxuICAgIGFyZ0d1YXJkczogbWF0Y2hhYmxlQXJnR3VhcmRzLnNsaWNlKDAsIGFyZ0d1YXJkcy5sZW5ndGgpLFxuICAgIG9wdGlvbmFsQXJnR3VhcmRzOiBtYXRjaGFibGVBcmdHdWFyZHMuc2xpY2UoYXJnR3VhcmRzLmxlbmd0aCksXG4gICAgcmVzdEFyZ0d1YXJkOiBtYXRjaGFibGVSZXN0QXJnR3VhcmQsXG4gIH0pO1xuXG4gIGNvbnN0IHBhcmFtc1BhdHRlcm4gPSBNLnNwbGl0QXJyYXkoXG4gICAgbWF0Y2hhYmxlTWV0aG9kR3VhcmRQYXlsb2FkLmFyZ0d1YXJkcyxcbiAgICBtYXRjaGFibGVNZXRob2RHdWFyZFBheWxvYWQub3B0aW9uYWxBcmdHdWFyZHMsXG4gICAgbWF0Y2hhYmxlTWV0aG9kR3VhcmRQYXlsb2FkLnJlc3RBcmdHdWFyZCxcbiAgKTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBkZWNsYXJlZExlbjogbWF0Y2hhYmxlQXJnR3VhcmRzLmxlbmd0aCxcbiAgICBoYXNSZXN0QXJnR3VhcmQ6IHJlc3RBcmdHdWFyZCAhPT0gdW5kZWZpbmVkLFxuICAgIHJlc3RBcmdHdWFyZElzUmF3OiByZXN0QXJnR3VhcmQgIT09IG1hdGNoYWJsZVJlc3RBcmdHdWFyZCxcbiAgICBwYXJhbXNQYXR0ZXJuLFxuICAgIHJlZGFjdGVkSW5kaWNlcyxcbiAgICBtYXRjaGFibGVNZXRob2RHdWFyZFBheWxvYWQsXG4gIH0pO1xufTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IGRlZmVuZFN5bmNNZXRob2QgPSAoXG4gIGdldENvbnRleHQsXG4gIGJlaGF2aW9yTWV0aG9kLFxuICBtZXRob2RHdWFyZFBheWxvYWQsXG4gIGxhYmVsLFxuKSA9PiB7XG4gIGNvbnN0IHsgcmV0dXJuR3VhcmQgfSA9IG1ldGhvZEd1YXJkUGF5bG9hZDtcbiAgY29uc3QgaXNSYXdSZXR1cm4gPSBpc1Jhd0d1YXJkKHJldHVybkd1YXJkKTtcbiAgY29uc3QgbWF0Y2hDb25maWcgPSBidWlsZE1hdGNoQ29uZmlnKG1ldGhvZEd1YXJkUGF5bG9hZCk7XG4gIGNvbnN0IHsgc3luY01ldGhvZCB9ID0ge1xuICAgIC8vXG4gICAgc3luY01ldGhvZCguLi5zeW5jQXJncykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IGdldENvbnRleHQodGhpcyk7XG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHJlYWxBcmdzID0gZGVmZW5kU3luY0FyZ3Moc3luY0FyZ3MsIG1hdGNoQ29uZmlnLCBsYWJlbCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGFwcGx5KGJlaGF2aW9yTWV0aG9kLCBjb250ZXh0LCByZWFsQXJncyk7XG4gICAgICAgIGlmICghaXNSYXdSZXR1cm4pIHtcbiAgICAgICAgICBtdXN0TWF0Y2goaGFyZGVuKHJlc3VsdCksIHJldHVybkd1YXJkLCBgJHtsYWJlbH06IHJlc3VsdGApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9IGNhdGNoICh0aHJvd25UaGluZykge1xuICAgICAgICB0aHJvdyB0b1Rocm93YWJsZSh0aHJvd25UaGluZyk7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbiAgcmV0dXJuIHN5bmNNZXRob2Q7XG59O1xuXG4vKlxuXG4gKi9cbmNvbnN0IGRlc3luYyA9IG1ldGhvZEd1YXJkUGF5bG9hZCA9PiB7XG4gIGNvbnN0IHtcbiAgICBhcmdHdWFyZHMsXG4gICAgb3B0aW9uYWxBcmdHdWFyZHMgPSBbXSxcbiAgICByZXN0QXJnR3VhcmQsXG4gIH0gPSBtZXRob2RHdWFyZFBheWxvYWQ7XG4gICFpc0F3YWl0QXJnR3VhcmQocmVzdEFyZ0d1YXJkKSB8fFxuICAgIEZhaWxgUmVzdCBhcmdzIG1heSBub3QgYmUgYXdhaXRlZDogJHtyZXN0QXJnR3VhcmR9YDtcbiAgY29uc3QgcmF3QXJnR3VhcmRzID0gWy4uLmFyZ0d1YXJkcywgLi4ub3B0aW9uYWxBcmdHdWFyZHNdO1xuXG4gIGNvbnN0IGF3YWl0SW5kZXhlcyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHJhd0FyZ0d1YXJkcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IGFyZ0d1YXJkID0gcmF3QXJnR3VhcmRzW2ldO1xuICAgIGlmIChpc0F3YWl0QXJnR3VhcmQoYXJnR3VhcmQpKSB7XG4gICAgICByYXdBcmdHdWFyZHNbaV0gPSBnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZChhcmdHdWFyZCkuYXJnR3VhcmQ7XG4gICAgICBhd2FpdEluZGV4ZXMucHVzaChpKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBhd2FpdEluZGV4ZXMsXG4gICAgcmF3TWV0aG9kR3VhcmRQYXlsb2FkOiB7XG4gICAgICAuLi5tZXRob2RHdWFyZFBheWxvYWQsXG4gICAgICBhcmdHdWFyZHM6IHJhd0FyZ0d1YXJkcy5zbGljZSgwLCBhcmdHdWFyZHMubGVuZ3RoKSxcbiAgICAgIG9wdGlvbmFsQXJnR3VhcmRzOiByYXdBcmdHdWFyZHMuc2xpY2UoYXJnR3VhcmRzLmxlbmd0aCksXG4gICAgfSxcbiAgfTtcbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgZGVmZW5kQXN5bmNNZXRob2QgPSAoXG4gIGdldENvbnRleHQsXG4gIGJlaGF2aW9yTWV0aG9kLFxuICBtZXRob2RHdWFyZFBheWxvYWQsXG4gIGxhYmVsLFxuKSA9PiB7XG4gIGNvbnN0IHsgcmV0dXJuR3VhcmQgfSA9IG1ldGhvZEd1YXJkUGF5bG9hZDtcbiAgY29uc3QgaXNSYXdSZXR1cm4gPSBpc1Jhd0d1YXJkKHJldHVybkd1YXJkKTtcblxuICBjb25zdCB7IGF3YWl0SW5kZXhlcywgcmF3TWV0aG9kR3VhcmRQYXlsb2FkIH0gPSBkZXN5bmMobWV0aG9kR3VhcmRQYXlsb2FkKTtcbiAgY29uc3QgbWF0Y2hDb25maWcgPSBidWlsZE1hdGNoQ29uZmlnKHJhd01ldGhvZEd1YXJkUGF5bG9hZCk7XG5cbiAgY29uc3QgeyBhc3luY01ldGhvZCB9ID0ge1xuICAgIC8vXG4gICAgYXN5bmNNZXRob2QoLi4uYXJncykge1xuICAgICAgY29uc3QgYXdhaXRMaXN0ID0gW107XG4gICAgICBmb3IgKGNvbnN0IGkgb2YgYXdhaXRJbmRleGVzKSB7XG4gICAgICAgIGlmIChpID49IGFyZ3MubGVuZ3RoKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgYXdhaXRMaXN0LnB1c2goYXJnc1tpXSk7XG4gICAgICB9XG4gICAgICBjb25zdCBwID0gUHJvbWlzZS5hbGwoYXdhaXRMaXN0KTtcbiAgICAgIGNvbnN0IHN5bmNBcmdzID0gWy4uLmFyZ3NdO1xuICAgICAgY29uc3QgcmVzdWx0UCA9IEUud2hlbihcbiAgICAgICAgcCxcbiAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIGF3YWl0ZWRBcmdzID0+IHtcbiAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGF3YWl0ZWRBcmdzLmxlbmd0aDsgaiArPSAxKSB7XG4gICAgICAgICAgICBzeW5jQXJnc1thd2FpdEluZGV4ZXNbal1dID0gYXdhaXRlZEFyZ3Nbal07XG4gICAgICAgICAgfVxuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICBjb25zdCBjb250ZXh0ID0gZ2V0Q29udGV4dCh0aGlzKTtcbiAgICAgICAgICBjb25zdCByZWFsQXJncyA9IGRlZmVuZFN5bmNBcmdzKHN5bmNBcmdzLCBtYXRjaENvbmZpZywgbGFiZWwpO1xuICAgICAgICAgIHJldHVybiBhcHBseShiZWhhdmlvck1ldGhvZCwgY29udGV4dCwgcmVhbEFyZ3MpO1xuICAgICAgICB9LFxuICAgICAgKTtcbiAgICAgIHJldHVybiBFLndoZW4ocmVzdWx0UCwgZnVsZmlsbG1lbnQgPT4ge1xuICAgICAgICBpZiAoIWlzUmF3UmV0dXJuKSB7XG4gICAgICAgICAgbXVzdE1hdGNoKGhhcmRlbihmdWxmaWxsbWVudCksIHJldHVybkd1YXJkLCBgJHtsYWJlbH06IHJlc3VsdGApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmdWxmaWxsbWVudDtcbiAgICAgIH0pLmNhdGNoKHJlYXNvbiA9PlxuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBQcm9taXNlLnJlamVjdCh0b1Rocm93YWJsZShyZWFzb24pKSxcbiAgICAgICk7XG4gICAgfSxcbiAgfTtcbiAgcmV0dXJuIGFzeW5jTWV0aG9kO1xufTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IGRlZmVuZE1ldGhvZCA9IChnZXRDb250ZXh0LCBiZWhhdmlvck1ldGhvZCwgbWV0aG9kR3VhcmQsIGxhYmVsKSA9PiB7XG4gIGNvbnN0IG1ldGhvZEd1YXJkUGF5bG9hZCA9IGdldE1ldGhvZEd1YXJkUGF5bG9hZChtZXRob2RHdWFyZCk7XG4gIGNvbnN0IHsgY2FsbEtpbmQgfSA9IG1ldGhvZEd1YXJkUGF5bG9hZDtcbiAgaWYgKGNhbGxLaW5kID09PSAnc3luYycpIHtcbiAgICByZXR1cm4gZGVmZW5kU3luY01ldGhvZChcbiAgICAgIGdldENvbnRleHQsXG4gICAgICBiZWhhdmlvck1ldGhvZCxcbiAgICAgIG1ldGhvZEd1YXJkUGF5bG9hZCxcbiAgICAgIGxhYmVsLFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgYXNzZXJ0KGNhbGxLaW5kID09PSAnYXN5bmMnKTtcbiAgICByZXR1cm4gZGVmZW5kQXN5bmNNZXRob2QoXG4gICAgICBnZXRDb250ZXh0LFxuICAgICAgYmVoYXZpb3JNZXRob2QsXG4gICAgICBtZXRob2RHdWFyZFBheWxvYWQsXG4gICAgICBsYWJlbCxcbiAgICApO1xuICB9XG59O1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGJpbmRNZXRob2QgPSAoXG4gIG1ldGhvZFRhZyxcbiAgY29udGV4dFByb3ZpZGVyLFxuICBiZWhhdmlvck1ldGhvZCxcbiAgbWV0aG9kR3VhcmQsXG4pID0+IHtcbiAgYXNzZXJ0LnR5cGVvZihiZWhhdmlvck1ldGhvZCwgJ2Z1bmN0aW9uJyk7XG5cbiAgLypcblxuXG4gICAqL1xuICBjb25zdCBnZXRDb250ZXh0ID0gcmVwcmVzZW50YXRpdmUgPT4ge1xuICAgIHJlcHJlc2VudGF0aXZlIHx8XG4gICAgICAvL1xuICAgICAgRmFpbGBNZXRob2QgJHttZXRob2RUYWd9IGNhbGxlZCB3aXRob3V0ICd0aGlzJyBvYmplY3RgO1xuICAgIGNvbnN0IGNvbnRleHQgPSBjb250ZXh0UHJvdmlkZXIocmVwcmVzZW50YXRpdmUpO1xuICAgIGlmIChjb250ZXh0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IEZhaWxgJHtxKFxuICAgICAgICBtZXRob2RUYWcsXG4gICAgICApfSBtYXkgb25seSBiZSBhcHBsaWVkIHRvIGEgdmFsaWQgaW5zdGFuY2U6ICR7cmVwcmVzZW50YXRpdmV9YDtcbiAgICB9XG4gICAgcmV0dXJuIGNvbnRleHQ7XG4gIH07XG5cbiAgY29uc3QgbWV0aG9kID0gZGVmZW5kTWV0aG9kKFxuICAgIGdldENvbnRleHQsXG4gICAgYmVoYXZpb3JNZXRob2QsXG4gICAgbWV0aG9kR3VhcmQsXG4gICAgbWV0aG9kVGFnLFxuICApO1xuXG4gIGRlZmluZVByb3BlcnRpZXMobWV0aG9kLCB7XG4gICAgbmFtZTogeyB2YWx1ZTogbWV0aG9kVGFnIH0sXG4gICAgbGVuZ3RoOiB7IHZhbHVlOiBiZWhhdmlvck1ldGhvZC5sZW5ndGggfSxcbiAgfSk7XG4gIHJldHVybiBtZXRob2Q7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZGVmZW5kUHJvdG90eXBlID0gKFxuICB0YWcsXG4gIGNvbnRleHRQcm92aWRlcixcbiAgYmVoYXZpb3JNZXRob2RzLFxuICB0aGlzZnVsTWV0aG9kcyA9IGZhbHNlLFxuICBpbnRlcmZhY2VHdWFyZCA9IHVuZGVmaW5lZCxcbikgPT4ge1xuICBjb25zdCBwcm90b3R5cGUgPSB7fTtcbiAgY29uc3QgbWV0aG9kTmFtZXMgPSBnZXRNZXRob2ROYW1lcyhiZWhhdmlvck1ldGhvZHMpLmZpbHRlcihcbiAgICAvL1xuICAgIC8vXG4gICAga2V5ID0+IHtcbiAgICAgIGlmIChrZXkgIT09ICdjb25zdHJ1Y3RvcicpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBjb25zdCBjb25zdHJ1Y3RvciA9IGJlaGF2aW9yTWV0aG9kcy5jb25zdHJ1Y3RvcjtcbiAgICAgIHJldHVybiAhKFxuICAgICAgICBjb25zdHJ1Y3Rvci5wcm90b3R5cGUgJiZcbiAgICAgICAgY29uc3RydWN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID09PSBjb25zdHJ1Y3RvclxuICAgICAgKTtcbiAgICB9LFxuICApO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgbWV0aG9kR3VhcmRzO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgZGVmYXVsdEd1YXJkcztcbiAgaWYgKGludGVyZmFjZUd1YXJkKSB7XG4gICAgY29uc3Qge1xuICAgICAgaW50ZXJmYWNlTmFtZSxcbiAgICAgIG1ldGhvZEd1YXJkczogbWcsXG4gICAgICBzeW1ib2xNZXRob2RHdWFyZHMsXG4gICAgICBzbG9wcHksXG4gICAgICBkZWZhdWx0R3VhcmRzOiBkZyA9IHNsb3BweSA/ICdwYXNzYWJsZScgOiBkZWZhdWx0R3VhcmRzLFxuICAgIH0gPSBnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQoaW50ZXJmYWNlR3VhcmQpO1xuICAgIG1ldGhvZEd1YXJkcyA9IGhhcmRlbih7XG4gICAgICAuLi5tZyxcbiAgICAgIC4uLihzeW1ib2xNZXRob2RHdWFyZHMgJiZcbiAgICAgICAgZnJvbUVudHJpZXMoZ2V0Q29weU1hcEVudHJpZXMoc3ltYm9sTWV0aG9kR3VhcmRzKSkpLFxuICAgIH0pO1xuICAgIGRlZmF1bHRHdWFyZHMgPSBkZztcbiAgICB7XG4gICAgICBjb25zdCBtZXRob2RHdWFyZE5hbWVzID0gb3duS2V5cyhtZXRob2RHdWFyZHMpO1xuICAgICAgY29uc3QgdW5pbXBsZW1lbnRlZCA9IGxpc3REaWZmZXJlbmNlKG1ldGhvZEd1YXJkTmFtZXMsIG1ldGhvZE5hbWVzKTtcbiAgICAgIHVuaW1wbGVtZW50ZWQubGVuZ3RoID09PSAwIHx8XG4gICAgICAgIEZhaWxgbWV0aG9kcyAke3EodW5pbXBsZW1lbnRlZCl9IG5vdCBpbXBsZW1lbnRlZCBieSAke3EodGFnKX1gO1xuICAgICAgaWYgKGRlZmF1bHRHdWFyZHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCB1bmd1YXJkZWQgPSBsaXN0RGlmZmVyZW5jZShtZXRob2ROYW1lcywgbWV0aG9kR3VhcmROYW1lcyk7XG4gICAgICAgIHVuZ3VhcmRlZC5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgICBGYWlsYG1ldGhvZHMgJHtxKHVuZ3VhcmRlZCl9IG5vdCBndWFyZGVkIGJ5ICR7cShpbnRlcmZhY2VOYW1lKX1gO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgcHJvcCBvZiBtZXRob2ROYW1lcykge1xuICAgIGNvbnN0IG9yaWdpbmFsTWV0aG9kID0gYmVoYXZpb3JNZXRob2RzW3Byb3BdO1xuICAgIGNvbnN0IHsgc2hpZnRlZE1ldGhvZCB9ID0ge1xuICAgICAgc2hpZnRlZE1ldGhvZCguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBvcmlnaW5hbE1ldGhvZCh0aGlzLCAuLi5hcmdzKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgICBjb25zdCBiZWhhdmlvck1ldGhvZCA9IHRoaXNmdWxNZXRob2RzID8gb3JpZ2luYWxNZXRob2QgOiBzaGlmdGVkTWV0aG9kO1xuICAgIC8vXG4gICAgLy9cbiAgICBsZXQgbWV0aG9kR3VhcmQgPSBtZXRob2RHdWFyZHMgJiYgbWV0aG9kR3VhcmRzW3Byb3BdO1xuICAgIGlmICghbWV0aG9kR3VhcmQpIHtcbiAgICAgIHN3aXRjaCAoZGVmYXVsdEd1YXJkcykge1xuICAgICAgICBjYXNlIHVuZGVmaW5lZDoge1xuICAgICAgICAgIGlmICh0aGlzZnVsTWV0aG9kcykge1xuICAgICAgICAgICAgbWV0aG9kR3VhcmQgPSBQYXNzYWJsZU1ldGhvZEd1YXJkO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtZXRob2RHdWFyZCA9IFJhd01ldGhvZEd1YXJkO1xuICAgICAgICAgIH1cbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdwYXNzYWJsZSc6IHtcbiAgICAgICAgICBtZXRob2RHdWFyZCA9IFBhc3NhYmxlTWV0aG9kR3VhcmQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAncmF3Jzoge1xuICAgICAgICAgIG1ldGhvZEd1YXJkID0gUmF3TWV0aG9kR3VhcmQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IEZhaWxgVW5yZWNvZ25pemVkIGRlZmF1bHRHdWFyZHMgJHtxKGRlZmF1bHRHdWFyZHMpfWA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcHJvdG90eXBlW3Byb3BdID0gYmluZE1ldGhvZChcbiAgICAgIGBJbiAke3EocHJvcCl9IG1ldGhvZCBvZiAoJHt0YWd9KWAsXG4gICAgICBjb250ZXh0UHJvdmlkZXIsXG4gICAgICBiZWhhdmlvck1ldGhvZCxcbiAgICAgIG1ldGhvZEd1YXJkLFxuICAgICk7XG4gIH1cblxuICBpZiAoIWhhc093blByb3BlcnR5T2YocHJvdG90eXBlLCBHRVRfSU5URVJGQUNFX0dVQVJEKSkge1xuICAgIGNvbnN0IGdldEludGVyZmFjZUd1YXJkTWV0aG9kID0ge1xuICAgICAgW0dFVF9JTlRFUkZBQ0VfR1VBUkRdKCkge1xuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gaW50ZXJmYWNlR3VhcmQ7XG4gICAgICB9LFxuICAgIH1bR0VUX0lOVEVSRkFDRV9HVUFSRF07XG4gICAgcHJvdG90eXBlW0dFVF9JTlRFUkZBQ0VfR1VBUkRdID0gYmluZE1ldGhvZChcbiAgICAgIGBJbiAke3EoR0VUX0lOVEVSRkFDRV9HVUFSRCl9IG1ldGhvZCBvZiAoJHt0YWd9KWAsXG4gICAgICBjb250ZXh0UHJvdmlkZXIsXG4gICAgICBnZXRJbnRlcmZhY2VHdWFyZE1ldGhvZCxcbiAgICAgIFBhc3NhYmxlTWV0aG9kR3VhcmQsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBGYXIoXG4gICAgdGFnLFxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChcbiAgICAgIHByb3RvdHlwZVxuICAgICksXG4gICk7XG59OyRozY9fb25jZS5kZWZlbmRQcm90b3R5cGUoZGVmZW5kUHJvdG90eXBlKTtcbmhhcmRlbihkZWZlbmRQcm90b3R5cGUpO1xuXG4vKlxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZGVmZW5kUHJvdG90eXBlS2l0ID0gKFxuICB0YWcsXG4gIGNvbnRleHRQcm92aWRlcktpdCxcbiAgYmVoYXZpb3JNZXRob2RzS2l0LFxuICB0aGlzZnVsTWV0aG9kcyA9IGZhbHNlLFxuICBpbnRlcmZhY2VHdWFyZEtpdCA9IHVuZGVmaW5lZCxcbikgPT4ge1xuICBjb25zdCBmYWNldE5hbWVzID0gb3duS2V5cyhiZWhhdmlvck1ldGhvZHNLaXQpLnNvcnQoKTtcbiAgZmFjZXROYW1lcy5sZW5ndGggPiAxIHx8IEZhaWxgQSBtdWx0aS1mYWNldCBvYmplY3QgbXVzdCBoYXZlIG11bHRpcGxlIGZhY2V0c2A7XG4gIGlmIChpbnRlcmZhY2VHdWFyZEtpdCkge1xuICAgIGNvbnN0IGludGVyZmFjZU5hbWVzID0gb3duS2V5cyhpbnRlcmZhY2VHdWFyZEtpdCk7XG4gICAgY29uc3QgZXh0cmFJbnRlcmZhY2VOYW1lcyA9IGxpc3REaWZmZXJlbmNlKGZhY2V0TmFtZXMsIGludGVyZmFjZU5hbWVzKTtcbiAgICBleHRyYUludGVyZmFjZU5hbWVzLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgRmFpbGBJbnRlcmZhY2VzICR7cShleHRyYUludGVyZmFjZU5hbWVzKX0gbm90IGltcGxlbWVudGVkIGJ5ICR7cSh0YWcpfWA7XG4gICAgY29uc3QgZXh0cmFGYWNldE5hbWVzID0gbGlzdERpZmZlcmVuY2UoaW50ZXJmYWNlTmFtZXMsIGZhY2V0TmFtZXMpO1xuICAgIGV4dHJhRmFjZXROYW1lcy5sZW5ndGggPT09IDAgfHxcbiAgICAgIEZhaWxgRmFjZXRzICR7cShleHRyYUZhY2V0TmFtZXMpfSBvZiAke3EodGFnKX0gbm90IGd1YXJkZWQgYnkgaW50ZXJmYWNlc2A7XG4gIH1cbiAgY29uc3QgY29udGV4dE1hcE5hbWVzID0gb3duS2V5cyhjb250ZXh0UHJvdmlkZXJLaXQpO1xuICBjb25zdCBleHRyYUNvbnRleHROYW1lcyA9IGxpc3REaWZmZXJlbmNlKGZhY2V0TmFtZXMsIGNvbnRleHRNYXBOYW1lcyk7XG4gIGV4dHJhQ29udGV4dE5hbWVzLmxlbmd0aCA9PT0gMCB8fFxuICAgIEZhaWxgQ29udGV4dHMgJHtxKGV4dHJhQ29udGV4dE5hbWVzKX0gbm90IGltcGxlbWVudGVkIGJ5ICR7cSh0YWcpfWA7XG4gIGNvbnN0IGV4dHJhRmFjZXROYW1lcyA9IGxpc3REaWZmZXJlbmNlKGNvbnRleHRNYXBOYW1lcywgZmFjZXROYW1lcyk7XG4gIGV4dHJhRmFjZXROYW1lcy5sZW5ndGggPT09IDAgfHxcbiAgICBGYWlsYEZhY2V0cyAke3EoZXh0cmFGYWNldE5hbWVzKX0gb2YgJHtxKHRhZyl9IG1pc3NpbmcgY29udGV4dHNgO1xuICBjb25zdCBwcm90b0tpdCA9IG9iamVjdE1hcChiZWhhdmlvck1ldGhvZHNLaXQsIChiZWhhdmlvck1ldGhvZHMsIGZhY2V0TmFtZSkgPT5cbiAgICBkZWZlbmRQcm90b3R5cGUoXG4gICAgICBgJHt0YWd9ICR7U3RyaW5nKGZhY2V0TmFtZSl9YCxcbiAgICAgIGNvbnRleHRQcm92aWRlcktpdFtmYWNldE5hbWVdLFxuICAgICAgYmVoYXZpb3JNZXRob2RzLFxuICAgICAgdGhpc2Z1bE1ldGhvZHMsXG4gICAgICBpbnRlcmZhY2VHdWFyZEtpdCAmJiBpbnRlcmZhY2VHdWFyZEtpdFtmYWNldE5hbWVdLFxuICAgICksXG4gICk7XG4gIHJldHVybiBwcm90b0tpdDtcbn07JGjNj19vbmNlLmRlZmVuZFByb3RvdHlwZUtpdChkZWZlbmRQcm90b3R5cGVLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmZW5kUHJvdG90eXBlIjpbImRlZmVuZFByb3RvdHlwZSJdLCJkZWZlbmRQcm90b3R5cGVLaXQiOlsiZGVmZW5kUHJvdG90eXBlS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAODJoYVGAgAARgIAACUAAABAZW5kby9leG8tdjEuNS45L3NyYy9nZXQtaW50ZXJmYWNlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJHRVRfSU5URVJGQUNFX0dVQVJEIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8vXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgR0VUX0lOVEVSRkFDRV9HVUFSRCA9ICdfX2dldEludGVyZmFjZUd1YXJkX18nO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuR0VUX0lOVEVSRkFDRV9HVUFSRChHRVRfSU5URVJGQUNFX0dVQVJEKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkdFVF9JTlRFUkZBQ0VfR1VBUkQiOlsiR0VUX0lOVEVSRkFDRV9HVUFSRCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAAdAAAAQGVuZG8vZXhvLXYxLjUuOS9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAIAAAAEBlbmRvL2Zhci12MS4xLjExL3NyYy9leHBvcnRzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKkm1lCYAgAAmAIAAB4AAABAZW5kby9mYXItdjEuMS4xMS9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCIuL2V4cG9ydHMuanMiXSwiZXhwb3J0cyI6WyJnZXRJbnRlcmZhY2VPZiIsImdldEludGVyZmFjZU9mIixudWxsXSwicmVleHBvcnRzIjpbIi4vZXhwb3J0cy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtdXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtdXSxbXCIuL2V4cG9ydHMuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyJAZW5kby9ldmVudHVhbC1zZW5kIjpbWyJFIiwiRSJdXSwiQGVuZG8vcGFzcy1zdHlsZSI6W1siRmFyIiwiRmFyIl0sWyJnZXRJbnRlcmZhY2VPZiIsImdldEludGVyZmFjZU9mIl0sWyJwYXNzU3R5bGVPZiIsInBhc3NTdHlsZU9mIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAt1VAGggcAAIIHAAAdAAAAQGVuZG8vbWFyc2hhbC12MS42LjQvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzIiwiLi9zcmMvbWFyc2hhbC5qcyIsIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIiwiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiLCIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyIsIi4vc3JjL3JhbmtPcmRlci5qcyIsIi4vc3JjL3R5cGVzLmpzIiwiQGVuZG8vcGFzcy1zdHlsZSJdLCJleHBvcnRzIjpbImFzc2VydFJhbmtTb3J0ZWQiLCJhc3NlcnRSYW5rU29ydGVkIiwibWFrZUVuY29kZVBhc3NhYmxlIiwibWFrZUVuY29kZVBhc3NhYmxlIiwicGFyc2UiLCJwYXJzZSIsbnVsbCxudWxsLG51bGwsbnVsbF0sInJlZXhwb3J0cyI6WyIuL3NyYy90eXBlcy5qcyIsIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzXCIsIFtdXSxbXCIuL3NyYy9tYXJzaGFsLmpzXCIsIFtdXSxbXCIuL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qc1wiLCBbXV0sW1wiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanNcIiwgW11dLFtcIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzXCIsIFtdXSxbXCIuL3NyYy9yYW5rT3JkZXIuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzIjpbWyJRQ0xBU1MiLCJRQ0xBU1MiXV0sIi4vc3JjL21hcnNoYWwuanMiOltbIm1ha2VNYXJzaGFsIiwibWFrZU1hcnNoYWwiXV0sIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIjpbWyJzdHJpbmdpZnkiLCJzdHJpbmdpZnkiXSxbInBhcnNlIiwicGFyc2UiXV0sIi4vc3JjL21hcnNoYWwtanVzdGluLmpzIjpbWyJkZWNvZGVUb0p1c3RpbiIsImRlY29kZVRvSnVzdGluIl1dLCIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyI6W1sibWFrZVBhc3NhYmxlS2l0IiwibWFrZVBhc3NhYmxlS2l0Il0sWyJtYWtlRW5jb2RlUGFzc2FibGUiLCJtYWtlRW5jb2RlUGFzc2FibGUiXSxbIm1ha2VEZWNvZGVQYXNzYWJsZSIsIm1ha2VEZWNvZGVQYXNzYWJsZSJdLFsiaXNFbmNvZGVkUmVtb3RhYmxlIiwiaXNFbmNvZGVkUmVtb3RhYmxlIl0sWyJ6ZXJvUGFkIiwiemVyb1BhZCJdLFsicmVjb3JkTmFtZXMiLCJyZWNvcmROYW1lcyJdLFsicmVjb3JkVmFsdWVzIiwicmVjb3JkVmFsdWVzIl1dLCIuL3NyYy9yYW5rT3JkZXIuanMiOltbInRyaXZpYWxDb21wYXJhdG9yIiwidHJpdmlhbENvbXBhcmF0b3IiXSxbImFzc2VydFJhbmtTb3J0ZWQiLCJhc3NlcnRSYW5rU29ydGVkIl0sWyJjb21wYXJlUmFuayIsImNvbXBhcmVSYW5rIl0sWyJpc1JhbmtTb3J0ZWQiLCJpc1JhbmtTb3J0ZWQiXSxbInNvcnRCeVJhbmsiLCJzb3J0QnlSYW5rIl0sWyJjb21wYXJlQW50aVJhbmsiLCJjb21wYXJlQW50aVJhbmsiXSxbIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0IiwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiXSxbImdldFBhc3NTdHlsZUNvdmVyIiwiZ2V0UGFzc1N0eWxlQ292ZXIiXSxbImludGVyc2VjdFJhbmtDb3ZlcnMiLCJpbnRlcnNlY3RSYW5rQ292ZXJzIl0sWyJ1bmlvblJhbmtDb3ZlcnMiLCJ1bmlvblJhbmtDb3ZlcnMiXV0sIkBlbmRvL3Bhc3Mtc3R5bGUiOltbImRlZXBseUZ1bGZpbGxlZCIsImRlZXBseUZ1bGZpbGxlZCJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAlXxlmZpPAACaTwAAKgAAAEBlbmRvL21hcnNoYWwtdjEuNi40L3NyYy9lbmNvZGVQYXNzYWJsZS5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiaXNFbmNvZGVkUmVtb3RhYmxlIiwibWFrZURlY29kZVBhc3NhYmxlIiwibWFrZUVuY29kZVBhc3NhYmxlIiwibWFrZVBhc3NhYmxlS2l0IiwicGFzc1N0eWxlUHJlZml4ZXMiLCJyZWNvcmROYW1lcyIsInJlY29yZFZhbHVlcyIsInplcm9QYWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBnZXRUYWcsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZixhc3NlcnRSZWNvcmQsaXNFcnJvckxpa2UsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NhYmxlU3ltYm9sRm9yTmFtZSxiLHEsRmFpbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImdldFRhZ1wiLFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXSxbXCJtYWtlVGFnZ2VkXCIsWyRozY9fYSA9PiAobWFrZVRhZ2dlZCA9ICRozY9fYSldXSxbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImFzc2VydFJlY29yZFwiLFskaM2PX2EgPT4gKGFzc2VydFJlY29yZCA9ICRozY9fYSldXSxbXCJpc0Vycm9yTGlrZVwiLFskaM2PX2EgPT4gKGlzRXJyb3JMaWtlID0gJGjNj19hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLFskaM2PX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIixbJGjNj19hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcImJcIixbJGjNj19hID0+IChiID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgeyBpc0FycmF5IH0gPSBBcnJheTtcbmNvbnN0IHsgZnJvbUVudHJpZXMsIGlzIH0gPSBPYmplY3Q7XG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5cbi8vXG5jb25zdCByQzAgPSAvW1xceDAwLVxceDFGXS87XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgZ2V0U3VmZml4ID0gKHN0ciwgaW5kZXgpID0+IChpbmRleCA9PT0gMCA/IHN0ciA6IHN0ci5zdWJzdHJpbmcoaW5kZXgpKTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcmVjb3JkTmFtZXMgPSByZWNvcmQgPT5cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgaGFyZGVuKC8qICAgICAgICAgICAgICAgICAgICovIChvd25LZXlzKHJlY29yZCkpLnNvcnQoKS5yZXZlcnNlKCkpOyRozY9fb25jZS5yZWNvcmROYW1lcyhyZWNvcmROYW1lcyk7XG5oYXJkZW4ocmVjb3JkTmFtZXMpO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCByZWNvcmRWYWx1ZXMgPSAocmVjb3JkLCBuYW1lcykgPT5cbiAgaGFyZGVuKG5hbWVzLm1hcChuYW1lID0+IHJlY29yZFtuYW1lXSkpOyRozY9fb25jZS5yZWNvcmRWYWx1ZXMocmVjb3JkVmFsdWVzKTtcbmhhcmRlbihyZWNvcmRWYWx1ZXMpO1xuXG5jb25zdCB6ZXJvZXMgPSBBcnJheSgxNilcbiAgLmZpbGwodW5kZWZpbmVkKVxuICAubWFwKChfLCBpKSA9PiAnMCcucmVwZWF0KGkpKTtcblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHplcm9QYWQgPSAobiwgc2l6ZSkgPT4ge1xuICBjb25zdCBuU3RyID0gYCR7bn1gO1xuICBjb25zdCBmaWxsTGVuID0gc2l6ZSAtIG5TdHIubGVuZ3RoO1xuICBpZiAoZmlsbExlbiA9PT0gMCkgcmV0dXJuIG5TdHI7XG4gIGFzc2VydChmaWxsTGVuID4gMCAmJiBmaWxsTGVuIDwgemVyb2VzLmxlbmd0aCk7XG4gIHJldHVybiBgJHt6ZXJvZXNbZmlsbExlbl19JHtuU3RyfWA7XG59OyRozY9fb25jZS56ZXJvUGFkKHplcm9QYWQpO1xuaGFyZGVuKHplcm9QYWQpO1xuXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbmNvbnN0IGFzTnVtYmVyID0gbmV3IEZsb2F0NjRBcnJheSgxKTtcbmNvbnN0IGFzQml0cyA9IG5ldyBCaWdVaW50NjRBcnJheShhc051bWJlci5idWZmZXIpO1xuXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbi8vXG5jb25zdCBDYW5vbmljYWxOYU5CaXRzID0gJ2ZmZjgwMDAwMDAwMDAwMDAnO1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgZW5jb2RlQmluYXJ5NjQgPSBuID0+IHtcbiAgLy9cbiAgaWYgKGlzKG4sIC0wKSkge1xuICAgIG4gPSAwO1xuICB9IGVsc2UgaWYgKGlzKG4sIE5hTikpIHtcbiAgICByZXR1cm4gYGYke0Nhbm9uaWNhbE5hTkJpdHN9YDtcbiAgfVxuICBhc051bWJlclswXSA9IG47XG4gIGxldCBiaXRzID0gYXNCaXRzWzBdO1xuICBpZiAobiA8IDApIHtcbiAgICBiaXRzIF49IDB4ZmZmZmZmZmZmZmZmZmZmZm47XG4gIH0gZWxzZSB7XG4gICAgYml0cyBePSAweDgwMDAwMDAwMDAwMDAwMDBuO1xuICB9XG4gIHJldHVybiBgZiR7emVyb1BhZChiaXRzLnRvU3RyaW5nKDE2KSwgMTYpfWA7XG59O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBkZWNvZGVCaW5hcnk2NCA9IChlbmNvZGVkLCBza2lwID0gMCkgPT4ge1xuICBlbmNvZGVkLmNoYXJBdChza2lwKSA9PT0gJ2YnIHx8IEZhaWxgRW5jb2RlZCBudW1iZXIgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuICBsZXQgYml0cyA9IEJpZ0ludChgMHgke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwICsgMSl9YCk7XG4gIGlmIChlbmNvZGVkLmNoYXJBdChza2lwICsgMSkgPCAnOCcpIHtcbiAgICBiaXRzIF49IDB4ZmZmZmZmZmZmZmZmZmZmZm47XG4gIH0gZWxzZSB7XG4gICAgYml0cyBePSAweDgwMDAwMDAwMDAwMDAwMDBuO1xuICB9XG4gIGFzQml0c1swXSA9IGJpdHM7XG4gIGNvbnN0IHJlc3VsdCA9IGFzTnVtYmVyWzBdO1xuICAhaXMocmVzdWx0LCAtMCkgfHxcbiAgICBGYWlsYFVuZXhwZWN0ZWQgbmVnYXRpdmUgemVybzogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGVuY29kZUJpZ0ludCA9IG4gPT4ge1xuICBjb25zdCBhYnMgPSBuIDwgMG4gPyAtbiA6IG47XG4gIGNvbnN0IG5EaWdpdHMgPSBhYnMudG9TdHJpbmcoKS5sZW5ndGg7XG4gIGNvbnN0IGxEaWdpdHMgPSBuRGlnaXRzLnRvU3RyaW5nKCkubGVuZ3RoO1xuICBpZiAobiA8IDBuKSB7XG4gICAgcmV0dXJuIGBuJHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgJyMnLnJlcGVhdChsRGlnaXRzIC0gMSlcbiAgICB9JHtcbiAgICAgIC8vXG4gICAgICAoMTAgKiogbERpZ2l0cyAtIG5EaWdpdHMpLnRvU3RyaW5nKCkucGFkU3RhcnQobERpZ2l0cywgJzAnKVxuICAgIH06JHtcbiAgICAgIC8vXG4gICAgICAoMTBuICoqIEJpZ0ludChuRGlnaXRzKSArIG4pLnRvU3RyaW5nKCkucGFkU3RhcnQobkRpZ2l0cywgJzAnKVxuICAgIH1gO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBgcCR7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgICd+Jy5yZXBlYXQobERpZ2l0cyAtIDEpXG4gICAgfSR7XG4gICAgICAvL1xuICAgICAgbkRpZ2l0c1xuICAgIH06JHtcbiAgICAgIC8vXG4gICAgICBuXG4gICAgfWA7XG4gIH1cbn07XG5cbmNvbnN0IHJCaWdJbnRQYXlsb2FkID0gLyhbMC05XSspKDooWzAtOV0rJHwpfCkvcztcblxuLypcblxuXG4gKi9cbmNvbnN0IGRlY29kZUJpZ0ludCA9IGVuY29kZWQgPT4ge1xuICBjb25zdCB0eXBlUHJlZml4ID0gZW5jb2RlZC5jaGFyQXQoMCk7IC8vXG4gIHR5cGVQcmVmaXggPT09ICdwJyB8fFxuICAgIHR5cGVQcmVmaXggPT09ICduJyB8fFxuICAgIEZhaWxgRW5jb2RlZCBiaWdpbnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuXG4gIGNvbnN0IHtcbiAgICBpbmRleDogbERpZ2l0cyxcbiAgICAxOiBzbkRpZ2l0cyxcbiAgICAyOiB0YWlsLFxuICAgIDM6IGRpZ2l0cyxcbiAgfSA9IGVuY29kZWQubWF0Y2gockJpZ0ludFBheWxvYWQpIHx8IEZhaWxgRGlnaXQgY291bnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuXG4gIHNuRGlnaXRzLmxlbmd0aCA9PT0gbERpZ2l0cyB8fFxuICAgIEZhaWxgVW5hcnktcHJlZml4ZWQgZGVjaW1hbCBkaWdpdCBjb3VudCBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG4gIGxldCBuRGlnaXRzID0gcGFyc2VJbnQoc25EaWdpdHMsIDEwKTtcbiAgaWYgKHR5cGVQcmVmaXggPT09ICduJykge1xuICAgIC8vXG4gICAgLy9cbiAgICBuRGlnaXRzID0gMTAgKiogLyogICAgICAgICAgICAgICAgICovIChsRGlnaXRzKSAtIG5EaWdpdHM7XG4gIH1cblxuICB0YWlsLmNoYXJBdCgwKSA9PT0gJzonIHx8IEZhaWxgU2VwYXJhdG9yIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbiAgZGlnaXRzLmxlbmd0aCA9PT0gbkRpZ2l0cyB8fFxuICAgIEZhaWxgRml4ZWQtbGVuZ3RoIGRpZ2l0IHNlcXVlbmNlIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbiAgbGV0IG4gPSBCaWdJbnQoZGlnaXRzKTtcbiAgaWYgKHR5cGVQcmVmaXggPT09ICduJykge1xuICAgIC8vXG4gICAgLy9cbiAgICBuID0gLSgxMG4gKiogQmlnSW50KG5EaWdpdHMpIC0gbik7XG4gIH1cblxuICByZXR1cm4gbjtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3Qgc3RyaW5nRXNjYXBlcyA9IEFycmF5KDB4MjIpXG4gIC5maWxsKHVuZGVmaW5lZClcbiAgLm1hcCgoXywgY3ApID0+IHtcbiAgICBzd2l0Y2ggKFN0cmluZy5mcm9tQ2hhckNvZGUoY3ApKSB7XG4gICAgICBjYXNlICcgJzpcbiAgICAgICAgcmV0dXJuICchXyc7XG4gICAgICBjYXNlICchJzpcbiAgICAgICAgcmV0dXJuICchfCc7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gYCEke1N0cmluZy5mcm9tQ2hhckNvZGUoY3AgKyAweDIxKX1gO1xuICAgIH1cbiAgfSk7XG5zdHJpbmdFc2NhcGVzWydeJy5jaGFyQ29kZUF0KDApXSA9ICdfQCc7XG5zdHJpbmdFc2NhcGVzWydfJy5jaGFyQ29kZUF0KDApXSA9ICdfXyc7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGVuY29kZUNvbXBhY3RTdHJpbmdTdWZmaXggPSBzdHIgPT5cbiAgc3RyLnJlcGxhY2UoL1tcXDAtIV5fXS9nLCBjaCA9PiBzdHJpbmdFc2NhcGVzW2NoLmNoYXJDb2RlQXQoMCldKTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgZGVjb2RlQ29tcGFjdFN0cmluZ1N1ZmZpeCA9IGVuY29kZWQgPT4ge1xuICByZXR1cm4gZW5jb2RlZC5yZXBsYWNlKC8oW1xcMC0hX10pKC58XFxuKT8vZywgKGVzYywgcHJlZml4LCBzdWZmaXgpID0+IHtcbiAgICBzd2l0Y2ggKGVzYykge1xuICAgICAgY2FzZSAnIV8nOlxuICAgICAgICByZXR1cm4gJyAnO1xuICAgICAgY2FzZSAnIXwnOlxuICAgICAgICByZXR1cm4gJyEnO1xuICAgICAgY2FzZSAnX0AnOlxuICAgICAgICByZXR1cm4gJ14nO1xuICAgICAgY2FzZSAnX18nOlxuICAgICAgICByZXR1cm4gJ18nO1xuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zdCBjaCA9IC8qICAgICAgICAgICAgICAgICAqLyAoc3VmZml4KTtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgKHByZWZpeCA9PT0gJyEnICYmIHN1ZmZpeCAhPT0gdW5kZWZpbmVkICYmIGNoID49ICchJyAmJiBjaCA8PSAnQCcpIHx8XG4gICAgICAgICAgRmFpbGBpbnZhbGlkIHN0cmluZyBlc2NhcGU6ICR7cShlc2MpfWA7XG4gICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoLmNoYXJDb2RlQXQoMCkgLSAweDIxKTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgZW5jb2RlTGVnYWN5U3RyaW5nU3VmZml4ID0gc3RyID0+IHN0cjtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgZGVjb2RlTGVnYWN5U3RyaW5nU3VmZml4ID0gZW5jb2RlZCA9PiBlbmNvZGVkO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGVuY29kZUNvbXBhY3RBcnJheSA9IChhcnJheSwgZW5jb2RlUGFzc2FibGUpID0+IHtcbiAgY29uc3QgY2hhcnMgPSBbJ14nXTtcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIGFycmF5KSB7XG4gICAgY29uc3QgZW5jID0gZW5jb2RlUGFzc2FibGUoZWxlbWVudCk7XG4gICAgY2hhcnMucHVzaChlbmMsICcgJyk7XG4gIH1cbiAgcmV0dXJuIGNoYXJzLmpvaW4oJycpO1xufTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBkZWNvZGVDb21wYWN0QXJyYXkgPSAoZW5jb2RlZCwgZGVjb2RlUGFzc2FibGUsIHNraXAgPSAwKSA9PiB7XG4gIGNvbnN0IGVsZW1lbnRzID0gW107XG4gIGxldCBkZXB0aCA9IDA7XG4gIC8vXG4gIC8vXG4gIGxldCBuZXh0SW5kZXggPSBza2lwICsgMTtcbiAgbGV0IGN1cnJlbnRFbGVtZW50U3RhcnQgPSBza2lwICsgMTtcbiAgZm9yIChjb25zdCB7IDA6IGNoLCBpbmRleDogaSB9IG9mIGVuY29kZWQubWF0Y2hBbGwoL1tcXF4gXS9nKSkge1xuICAgIGNvbnN0IGluZGV4ID0gLyogICAgICAgICAgICAgICAgICovIChpKTtcbiAgICBpZiAoaW5kZXggPD0gc2tpcCkge1xuICAgICAgaWYgKGluZGV4ID09PSBza2lwKSB7XG4gICAgICAgIGNoID09PSAnXicgfHwgRmFpbGBFbmNvZGVkIGFycmF5IGV4cGVjdGVkOiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2ggPT09ICdeJykge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBkZXB0aCArPSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICAvL1xuICAgICAgaWYgKGluZGV4ID09PSBuZXh0SW5kZXgpIHtcbiAgICAgICAgLy9cbiAgICAgICAgZGVwdGggLT0gMTtcbiAgICAgICAgZGVwdGggPj0gMCB8fFxuICAgICAgICAgIC8vXG4gICAgICAgICAgRmFpbGB1bmV4cGVjdGVkIGFycmF5IGVsZW1lbnQgdGVybWluYXRvcjogJHtlbmNvZGVkLnNsaWNlKHNraXAsIGluZGV4ICsgMil9YDtcbiAgICAgIH1cbiAgICAgIGlmIChkZXB0aCA9PT0gMCkge1xuICAgICAgICAvL1xuICAgICAgICBlbGVtZW50cy5wdXNoKFxuICAgICAgICAgIGRlY29kZVBhc3NhYmxlKGVuY29kZWQuc2xpY2UoY3VycmVudEVsZW1lbnRTdGFydCwgaW5kZXgpKSxcbiAgICAgICAgKTtcbiAgICAgICAgY3VycmVudEVsZW1lbnRTdGFydCA9IGluZGV4ICsgMTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy9cbiAgICBuZXh0SW5kZXggPSBpbmRleCArIDE7XG4gIH1cbiAgZGVwdGggPT09IDAgfHwgRmFpbGB1bnRlcm1pbmF0ZWQgYXJyYXk6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gIG5leHRJbmRleCA9PT0gZW5jb2RlZC5sZW5ndGggfHxcbiAgICBGYWlsYHVudGVybWluYXRlZCBhcnJheSBlbGVtZW50OiAke2dldFN1ZmZpeChcbiAgICAgIGVuY29kZWQsXG4gICAgICBjdXJyZW50RWxlbWVudFN0YXJ0LFxuICAgICl9YDtcbiAgcmV0dXJuIGhhcmRlbihlbGVtZW50cyk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBlbmNvZGVMZWdhY3lBcnJheSA9IChhcnJheSwgZW5jb2RlUGFzc2FibGUpID0+IHtcbiAgY29uc3QgY2hhcnMgPSBbJ1snXTtcbiAgZm9yIChjb25zdCBlbGVtZW50IG9mIGFycmF5KSB7XG4gICAgY29uc3QgZW5jID0gZW5jb2RlUGFzc2FibGUoZWxlbWVudCk7XG4gICAgZm9yIChjb25zdCBjIG9mIGVuYykge1xuICAgICAgaWYgKGMgPT09ICdcXHUwMDAwJyB8fCBjID09PSAnXFx1MDAwMScpIHtcbiAgICAgICAgY2hhcnMucHVzaCgnXFx1MDAwMScpO1xuICAgICAgfVxuICAgICAgY2hhcnMucHVzaChjKTtcbiAgICB9XG4gICAgY2hhcnMucHVzaCgnXFx1MDAwMCcpO1xuICB9XG4gIHJldHVybiBjaGFycy5qb2luKCcnKTtcbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgZGVjb2RlTGVnYWN5QXJyYXkgPSAoZW5jb2RlZCwgZGVjb2RlUGFzc2FibGUsIHNraXAgPSAwKSA9PiB7XG4gIGNvbnN0IGVsZW1lbnRzID0gW107XG4gIGNvbnN0IGVsZW1DaGFycyA9IFtdO1xuICAvL1xuICAvL1xuICBsZXQgc3RpbGxUb1NraXAgPSBza2lwICsgMTtcbiAgbGV0IGluRXNjYXBlID0gZmFsc2U7XG4gIGZvciAoY29uc3QgYyBvZiBlbmNvZGVkKSB7XG4gICAgaWYgKHN0aWxsVG9Ta2lwID4gMCkge1xuICAgICAgc3RpbGxUb1NraXAgLT0gMTtcbiAgICAgIGlmIChzdGlsbFRvU2tpcCA9PT0gMCkge1xuICAgICAgICBjID09PSAnWycgfHwgRmFpbGBFbmNvZGVkIGFycmF5IGV4cGVjdGVkOiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaW5Fc2NhcGUpIHtcbiAgICAgIGMgPT09ICdcXHUwMDAwJyB8fFxuICAgICAgICBjID09PSAnXFx1MDAwMScgfHxcbiAgICAgICAgRmFpbGBVbmV4cGVjdGVkIGNoYXJhY3RlciBhZnRlciB1MDAwMSBlc2NhcGU6ICR7Y31gO1xuICAgICAgZWxlbUNoYXJzLnB1c2goYyk7XG4gICAgfSBlbHNlIGlmIChjID09PSAnXFx1MDAwMCcpIHtcbiAgICAgIGNvbnN0IGVuY29kZWRFbGVtZW50ID0gZWxlbUNoYXJzLmpvaW4oJycpO1xuICAgICAgZWxlbUNoYXJzLmxlbmd0aCA9IDA7XG4gICAgICBjb25zdCBlbGVtZW50ID0gZGVjb2RlUGFzc2FibGUoZW5jb2RlZEVsZW1lbnQpO1xuICAgICAgZWxlbWVudHMucHVzaChlbGVtZW50KTtcbiAgICB9IGVsc2UgaWYgKGMgPT09ICdcXHUwMDAxJykge1xuICAgICAgaW5Fc2NhcGUgPSB0cnVlO1xuICAgICAgLy9cbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtQ2hhcnMucHVzaChjKTtcbiAgICB9XG4gICAgaW5Fc2NhcGUgPSBmYWxzZTtcbiAgfVxuICAhaW5Fc2NhcGUgfHwgRmFpbGB1bmV4cGVjdGVkIGVuZCBvZiBlbmNvZGluZyAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICBlbGVtQ2hhcnMubGVuZ3RoID09PSAwIHx8XG4gICAgRmFpbGBlbmNvZGluZyB0ZXJtaW5hdGVkIGVhcmx5OiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICByZXR1cm4gaGFyZGVuKGVsZW1lbnRzKTtcbn07XG5cbmNvbnN0IGVuY29kZVJlY29yZCA9IChyZWNvcmQsIGVuY29kZUFycmF5LCBlbmNvZGVQYXNzYWJsZSkgPT4ge1xuICBjb25zdCBuYW1lcyA9IHJlY29yZE5hbWVzKHJlY29yZCk7XG4gIGNvbnN0IHZhbHVlcyA9IHJlY29yZFZhbHVlcyhyZWNvcmQsIG5hbWVzKTtcbiAgcmV0dXJuIGAoJHtlbmNvZGVBcnJheShoYXJkZW4oW25hbWVzLCB2YWx1ZXNdKSwgZW5jb2RlUGFzc2FibGUpfWA7XG59O1xuXG5jb25zdCBkZWNvZGVSZWNvcmQgPSAoZW5jb2RlZCwgZGVjb2RlQXJyYXksIGRlY29kZVBhc3NhYmxlLCBza2lwID0gMCkgPT4ge1xuICBhc3NlcnQoZW5jb2RlZC5jaGFyQXQoc2tpcCkgPT09ICcoJyk7XG4gIC8vXG4gIC8vXG4gIGNvbnN0IHVuemlwcGVkRW50cmllcyA9IGRlY29kZUFycmF5KGVuY29kZWQsIGRlY29kZVBhc3NhYmxlLCBza2lwICsgMSk7XG4gIHVuemlwcGVkRW50cmllcy5sZW5ndGggPT09IDIgfHxcbiAgICBGYWlsYGV4cGVjdGVkIGtleXMsdmFsdWVzIHBhaXI6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gIGNvbnN0IFtrZXlzLCB2YWxzXSA9IHVuemlwcGVkRW50cmllcztcblxuICAocGFzc1N0eWxlT2Yoa2V5cykgPT09ICdjb3B5QXJyYXknICYmXG4gICAgcGFzc1N0eWxlT2YodmFscykgPT09ICdjb3B5QXJyYXknICYmXG4gICAga2V5cy5sZW5ndGggPT09IHZhbHMubGVuZ3RoICYmXG4gICAga2V5cy5ldmVyeShrZXkgPT4gdHlwZW9mIGtleSA9PT0gJ3N0cmluZycpKSB8fFxuICAgIEZhaWxgbm90IGEgdmFsaWQgcmVjb3JkIGVuY29kaW5nOiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICBjb25zdCBtYXBFbnRyaWVzID0ga2V5cy5tYXAoKGtleSwgaSkgPT4gW2tleSwgdmFsc1tpXV0pO1xuICBjb25zdCByZWNvcmQgPSBoYXJkZW4oZnJvbUVudHJpZXMobWFwRW50cmllcykpO1xuICBhc3NlcnRSZWNvcmQocmVjb3JkLCAnZGVjb2RlZCByZWNvcmQnKTtcbiAgcmV0dXJuIHJlY29yZDtcbn07XG5cbmNvbnN0IGVuY29kZVRhZ2dlZCA9ICh0YWdnZWQsIGVuY29kZUFycmF5LCBlbmNvZGVQYXNzYWJsZSkgPT5cbiAgYDoke2VuY29kZUFycmF5KGhhcmRlbihbZ2V0VGFnKHRhZ2dlZCksIHRhZ2dlZC5wYXlsb2FkXSksIGVuY29kZVBhc3NhYmxlKX1gO1xuXG5jb25zdCBkZWNvZGVUYWdnZWQgPSAoZW5jb2RlZCwgZGVjb2RlQXJyYXksIGRlY29kZVBhc3NhYmxlLCBza2lwID0gMCkgPT4ge1xuICBhc3NlcnQoZW5jb2RlZC5jaGFyQXQoc2tpcCkgPT09ICc6Jyk7XG4gIC8vXG4gIC8vXG4gIGNvbnN0IHRhZ2dlZFBheWxvYWQgPSBkZWNvZGVBcnJheShlbmNvZGVkLCBkZWNvZGVQYXNzYWJsZSwgc2tpcCArIDEpO1xuICB0YWdnZWRQYXlsb2FkLmxlbmd0aCA9PT0gMiB8fFxuICAgIEZhaWxgZXhwZWN0ZWQgdGFnLHBheWxvYWQgcGFpcjogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgY29uc3QgW3RhZywgcGF5bG9hZF0gPSB0YWdnZWRQYXlsb2FkO1xuICBwYXNzU3R5bGVPZih0YWcpID09PSAnc3RyaW5nJyB8fFxuICAgIEZhaWxgbm90IGEgdmFsaWQgdGFnZ2VkIGVuY29kaW5nOiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICByZXR1cm4gbWFrZVRhZ2dlZCh0YWcsIHBheWxvYWQpO1xufTtcblxuY29uc3QgbWFrZUVuY29kZVJlbW90YWJsZSA9ICh1bnNhZmVFbmNvZGVSZW1vdGFibGUsIHZlcmlmeUVuY29kaW5nKSA9PiB7XG4gIGNvbnN0IGVuY29kZVJlbW90YWJsZSA9IChyLCBpbm5lckVuY29kZSkgPT4ge1xuICAgIGNvbnN0IGVuY29kaW5nID0gdW5zYWZlRW5jb2RlUmVtb3RhYmxlKHIsIGlubmVyRW5jb2RlKTtcbiAgICAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJyAmJiBlbmNvZGluZy5jaGFyQXQoMCkgPT09ICdyJykgfHxcbiAgICAgIEZhaWxgUmVtb3RhYmxlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcInJcIjogJHtlbmNvZGluZ31gO1xuICAgIHZlcmlmeUVuY29kaW5nKGVuY29kaW5nLCAnUmVtb3RhYmxlJyk7XG4gICAgcmV0dXJuIGVuY29kaW5nO1xuICB9O1xuICByZXR1cm4gZW5jb2RlUmVtb3RhYmxlO1xufTtcblxuY29uc3QgbWFrZUVuY29kZVByb21pc2UgPSAodW5zYWZlRW5jb2RlUHJvbWlzZSwgdmVyaWZ5RW5jb2RpbmcpID0+IHtcbiAgY29uc3QgZW5jb2RlUHJvbWlzZSA9IChwLCBpbm5lckVuY29kZSkgPT4ge1xuICAgIGNvbnN0IGVuY29kaW5nID0gdW5zYWZlRW5jb2RlUHJvbWlzZShwLCBpbm5lckVuY29kZSk7XG4gICAgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycgJiYgZW5jb2RpbmcuY2hhckF0KDApID09PSAnPycpIHx8XG4gICAgICBGYWlsYFByb21pc2UgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiP1wiOiAke2VuY29kaW5nfWA7XG4gICAgdmVyaWZ5RW5jb2RpbmcoZW5jb2RpbmcsICdQcm9taXNlJyk7XG4gICAgcmV0dXJuIGVuY29kaW5nO1xuICB9O1xuICByZXR1cm4gZW5jb2RlUHJvbWlzZTtcbn07XG5cbmNvbnN0IG1ha2VFbmNvZGVFcnJvciA9ICh1bnNhZmVFbmNvZGVFcnJvciwgdmVyaWZ5RW5jb2RpbmcpID0+IHtcbiAgY29uc3QgZW5jb2RlRXJyb3IgPSAoZXJyLCBpbm5lckVuY29kZSkgPT4ge1xuICAgIGNvbnN0IGVuY29kaW5nID0gdW5zYWZlRW5jb2RlRXJyb3IoZXJyLCBpbm5lckVuY29kZSk7XG4gICAgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycgJiYgZW5jb2RpbmcuY2hhckF0KDApID09PSAnIScpIHx8XG4gICAgICBGYWlsYEVycm9yIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiFcIjogJHtlbmNvZGluZ31gO1xuICAgIHZlcmlmeUVuY29kaW5nKGVuY29kaW5nLCAnRXJyb3InKTtcbiAgICByZXR1cm4gZW5jb2Rpbmc7XG4gIH07XG4gIHJldHVybiBlbmNvZGVFcnJvcjtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZUlubmVyRW5jb2RlID0gKGVuY29kZVN0cmluZ1N1ZmZpeCwgZW5jb2RlQXJyYXksIG9wdGlvbnMpID0+IHtcbiAgY29uc3Qge1xuICAgIGVuY29kZVJlbW90YWJsZTogdW5zYWZlRW5jb2RlUmVtb3RhYmxlLFxuICAgIGVuY29kZVByb21pc2U6IHVuc2FmZUVuY29kZVByb21pc2UsXG4gICAgZW5jb2RlRXJyb3I6IHVuc2FmZUVuY29kZUVycm9yLFxuICAgIHZlcmlmeUVuY29kaW5nID0gKCkgPT4ge30sXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBlbmNvZGVSZW1vdGFibGUgPSBtYWtlRW5jb2RlUmVtb3RhYmxlKFxuICAgIHVuc2FmZUVuY29kZVJlbW90YWJsZSxcbiAgICB2ZXJpZnlFbmNvZGluZyxcbiAgKTtcbiAgY29uc3QgZW5jb2RlUHJvbWlzZSA9IG1ha2VFbmNvZGVQcm9taXNlKHVuc2FmZUVuY29kZVByb21pc2UsIHZlcmlmeUVuY29kaW5nKTtcbiAgY29uc3QgZW5jb2RlRXJyb3IgPSBtYWtlRW5jb2RlRXJyb3IodW5zYWZlRW5jb2RlRXJyb3IsIHZlcmlmeUVuY29kaW5nKTtcblxuICBjb25zdCBpbm5lckVuY29kZSA9IHBhc3NhYmxlID0+IHtcbiAgICBpZiAoaXNFcnJvckxpa2UocGFzc2FibGUpKSB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgcmV0dXJuIGVuY29kZUVycm9yKHBhc3NhYmxlLCBpbm5lckVuY29kZSk7XG4gICAgfVxuICAgIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbiAgICBzd2l0Y2ggKHBhc3NTdHlsZSkge1xuICAgICAgY2FzZSAnbnVsbCc6IHtcbiAgICAgICAgcmV0dXJuICd2JztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6IHtcbiAgICAgICAgcmV0dXJuICd6JztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ251bWJlcic6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kZUJpbmFyeTY0KHBhc3NhYmxlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N0cmluZyc6IHtcbiAgICAgICAgcmV0dXJuIGBzJHtlbmNvZGVTdHJpbmdTdWZmaXgocGFzc2FibGUpfWA7XG4gICAgICB9XG4gICAgICBjYXNlICdib29sZWFuJzoge1xuICAgICAgICByZXR1cm4gYGIke3Bhc3NhYmxlfWA7XG4gICAgICB9XG4gICAgICBjYXNlICdiaWdpbnQnOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVCaWdJbnQocGFzc2FibGUpO1xuICAgICAgfVxuICAgICAgY2FzZSAncmVtb3RhYmxlJzoge1xuICAgICAgICByZXR1cm4gZW5jb2RlUmVtb3RhYmxlKHBhc3NhYmxlLCBpbm5lckVuY29kZSk7XG4gICAgICB9XG4gICAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kZUVycm9yKHBhc3NhYmxlLCBpbm5lckVuY29kZSk7XG4gICAgICB9XG4gICAgICBjYXNlICdwcm9taXNlJzoge1xuICAgICAgICByZXR1cm4gZW5jb2RlUHJvbWlzZShwYXNzYWJsZSwgaW5uZXJFbmNvZGUpO1xuICAgICAgfVxuICAgICAgY2FzZSAnc3ltYm9sJzoge1xuICAgICAgICAvL1xuICAgICAgICBjb25zdCBuYW1lID0gbmFtZUZvclBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbiAgICAgICAgYXNzZXJ0LnR5cGVvZihuYW1lLCAnc3RyaW5nJyk7XG4gICAgICAgIHJldHVybiBgeSR7ZW5jb2RlU3RyaW5nU3VmZml4KG5hbWUpfWA7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVBcnJheShwYXNzYWJsZSwgaW5uZXJFbmNvZGUpO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kZVJlY29yZChwYXNzYWJsZSwgZW5jb2RlQXJyYXksIGlubmVyRW5jb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kZVRhZ2dlZChwYXNzYWJsZSwgZW5jb2RlQXJyYXksIGlubmVyRW5jb2RlKTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgdGhyb3cgRmFpbGBhICR7cShwYXNzU3R5bGUpfSBjYW5ub3QgYmUgdXNlZCBhcyBhIGNvbGxlY3Rpb24gcGFzc2FibGVgO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGlubmVyRW5jb2RlO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbmNvbnN0IGxpYmVyYWxEZWNvZGVycyA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChcbiAgLyogICAgICAgICAgICAgICAgICAqLyAoe1xuICAgIGRlY29kZVJlbW90YWJsZTogKF9lbmNvZGluZywgX2lubmVyRGVjb2RlKSA9PiB1bmRlZmluZWQsXG4gICAgZGVjb2RlUHJvbWlzZTogKF9lbmNvZGluZywgX2lubmVyRGVjb2RlKSA9PiB1bmRlZmluZWQsXG4gICAgZGVjb2RlRXJyb3I6IChfZW5jb2RpbmcsIF9pbm5lckRlY29kZSkgPT4gdW5kZWZpbmVkLFxuICB9KVxuKTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBtYWtlSW5uZXJEZWNvZGUgPSAoZGVjb2RlU3RyaW5nU3VmZml4LCBkZWNvZGVBcnJheSwgb3B0aW9ucykgPT4ge1xuICBjb25zdCB7IGRlY29kZVJlbW90YWJsZSwgZGVjb2RlUHJvbWlzZSwgZGVjb2RlRXJyb3IgfSA9IG9wdGlvbnM7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGlubmVyRGVjb2RlID0gKGVuY29kZWQsIHNraXAgPSAwKSA9PiB7XG4gICAgc3dpdGNoIChlbmNvZGVkLmNoYXJBdChza2lwKSkge1xuICAgICAgY2FzZSAndic6IHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBjYXNlICd6Jzoge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgICAgY2FzZSAnZic6IHtcbiAgICAgICAgcmV0dXJuIGRlY29kZUJpbmFyeTY0KGVuY29kZWQsIHNraXApO1xuICAgICAgfVxuICAgICAgY2FzZSAncyc6IHtcbiAgICAgICAgcmV0dXJuIGRlY29kZVN0cmluZ1N1ZmZpeChnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCArIDEpKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2InOiB7XG4gICAgICAgIGNvbnN0IHN1YnN0cmluZyA9IGdldFN1ZmZpeChlbmNvZGVkLCBza2lwICsgMSk7XG4gICAgICAgIGlmIChzdWJzdHJpbmcgPT09ICd0cnVlJykge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKHN1YnN0cmluZyA9PT0gJ2ZhbHNlJykge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBGYWlsYGV4cGVjdGVkIGVuY29kZWQgYm9vbGVhbiB0byBiZSBcImJ0cnVlXCIgb3IgXCJiZmFsc2VcIjogJHtzdWJzdHJpbmd9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ24nOlxuICAgICAgY2FzZSAncCc6IHtcbiAgICAgICAgcmV0dXJuIGRlY29kZUJpZ0ludChnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCkpO1xuICAgICAgfVxuICAgICAgY2FzZSAncic6IHtcbiAgICAgICAgcmV0dXJuIGRlY29kZVJlbW90YWJsZShnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCksIGlubmVyRGVjb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJz8nOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVQcm9taXNlKGdldFN1ZmZpeChlbmNvZGVkLCBza2lwKSwgaW5uZXJEZWNvZGUpO1xuICAgICAgfVxuICAgICAgY2FzZSAnISc6IHtcbiAgICAgICAgcmV0dXJuIGRlY29kZUVycm9yKGdldFN1ZmZpeChlbmNvZGVkLCBza2lwKSwgaW5uZXJEZWNvZGUpO1xuICAgICAgfVxuICAgICAgY2FzZSAneSc6IHtcbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgbmFtZSA9IGRlY29kZVN0cmluZ1N1ZmZpeChnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCArIDEpKTtcbiAgICAgICAgcmV0dXJuIHBhc3NhYmxlU3ltYm9sRm9yTmFtZShuYW1lKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ1snOlxuICAgICAgY2FzZSAnXic6IHtcbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIGRlY29kZUFycmF5KGVuY29kZWQsIGlubmVyRGVjb2RlLCBza2lwKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJygnOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVSZWNvcmQoZW5jb2RlZCwgZGVjb2RlQXJyYXksIGlubmVyRGVjb2RlLCBza2lwKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJzonOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVUYWdnZWQoZW5jb2RlZCwgZGVjb2RlQXJyYXksIGlubmVyRGVjb2RlLCBza2lwKTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgdGhyb3cgRmFpbGBpbnZhbGlkIGRhdGFiYXNlIGtleTogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBpbm5lckRlY29kZTtcbn07XG5cbi8qXG5cblxuXG4gKi9cblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlUGFzc2FibGVLaXQgPSAob3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBlbmNvZGVSZW1vdGFibGUgPSAociwgXykgPT4gRmFpbGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyfWAsXG4gICAgZW5jb2RlUHJvbWlzZSA9IChwLCBfKSA9PiBGYWlsYHByb21pc2UgdW5leHBlY3RlZDogJHtwfWAsXG4gICAgZW5jb2RlRXJyb3IgPSAoZXJyLCBfKSA9PiBGYWlsYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZXJyfWAsXG4gICAgZm9ybWF0ID0gJ2xlZ2FjeU9yZGVyZWQnLFxuXG4gICAgZGVjb2RlUmVtb3RhYmxlID0gKGVuY29kaW5nLCBfKSA9PiBGYWlsYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWAsXG4gICAgZGVjb2RlUHJvbWlzZSA9IChlbmNvZGluZywgXykgPT4gRmFpbGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7ZW5jb2Rpbmd9YCxcbiAgICBkZWNvZGVFcnJvciA9IChlbmNvZGluZywgXykgPT4gRmFpbGBlcnJvciB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWAsXG4gIH0gPSBvcHRpb25zO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGxldCBlbmNvZGVQYXNzYWJsZTtcbiAgY29uc3QgZW5jb2RlT3B0aW9ucyA9IHsgZW5jb2RlUmVtb3RhYmxlLCBlbmNvZGVQcm9taXNlLCBlbmNvZGVFcnJvciwgZm9ybWF0IH07XG4gIGlmIChmb3JtYXQgPT09ICdjb21wYWN0T3JkZXJlZCcpIHtcbiAgICBjb25zdCBsaWJlcmFsRGVjb2RlID0gbWFrZUlubmVyRGVjb2RlKFxuICAgICAgZGVjb2RlQ29tcGFjdFN0cmluZ1N1ZmZpeCxcbiAgICAgIGRlY29kZUNvbXBhY3RBcnJheSxcbiAgICAgIGxpYmVyYWxEZWNvZGVycyxcbiAgICApO1xuICAgIC8qXG5cblxuXG4gICAgICovXG4gICAgY29uc3QgdmVyaWZ5RW5jb2RpbmcgPSAoZW5jb2RpbmcsIGxhYmVsKSA9PiB7XG4gICAgICAhZW5jb2RpbmcubWF0Y2gockMwKSB8fFxuICAgICAgICBGYWlsYCR7YihcbiAgICAgICAgICBsYWJlbCxcbiAgICAgICAgKX0gZW5jb2RpbmcgbXVzdCBub3QgY29udGFpbiBhIEMwIGNvbnRyb2wgY2hhcmFjdGVyOiAke2VuY29kaW5nfWA7XG4gICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlQ29tcGFjdEFycmF5KGBediAke2VuY29kaW5nfSB2IGAsIGxpYmVyYWxEZWNvZGUpO1xuICAgICAgKGlzQXJyYXkoZGVjb2RlZCkgJiZcbiAgICAgICAgZGVjb2RlZC5sZW5ndGggPT09IDMgJiZcbiAgICAgICAgZGVjb2RlZFswXSA9PT0gbnVsbCAmJlxuICAgICAgICBkZWNvZGVkWzJdID09PSBudWxsKSB8fFxuICAgICAgICBGYWlsYCR7YihsYWJlbCl9IGVuY29kaW5nIG11c3QgYmUgZW1iZWRkYWJsZTogJHtlbmNvZGluZ31gO1xuICAgIH07XG4gICAgY29uc3QgZW5jb2RlQ29tcGFjdCA9IG1ha2VJbm5lckVuY29kZShcbiAgICAgIGVuY29kZUNvbXBhY3RTdHJpbmdTdWZmaXgsXG4gICAgICBlbmNvZGVDb21wYWN0QXJyYXksXG4gICAgICB7IC4uLmVuY29kZU9wdGlvbnMsIHZlcmlmeUVuY29kaW5nIH0sXG4gICAgKTtcbiAgICBlbmNvZGVQYXNzYWJsZSA9IHBhc3NhYmxlID0+IGB+JHtlbmNvZGVDb21wYWN0KHBhc3NhYmxlKX1gO1xuICB9IGVsc2UgaWYgKGZvcm1hdCA9PT0gJ2xlZ2FjeU9yZGVyZWQnKSB7XG4gICAgZW5jb2RlUGFzc2FibGUgPSBtYWtlSW5uZXJFbmNvZGUoXG4gICAgICBlbmNvZGVMZWdhY3lTdHJpbmdTdWZmaXgsXG4gICAgICBlbmNvZGVMZWdhY3lBcnJheSxcbiAgICAgIGVuY29kZU9wdGlvbnMsXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBGYWlsYFVucmVjb2duaXplZCBmb3JtYXQ6ICR7cShmb3JtYXQpfWA7XG4gIH1cblxuICBjb25zdCBkZWNvZGVPcHRpb25zID0geyBkZWNvZGVSZW1vdGFibGUsIGRlY29kZVByb21pc2UsIGRlY29kZUVycm9yIH07XG4gIGNvbnN0IGRlY29kZUNvbXBhY3QgPSBtYWtlSW5uZXJEZWNvZGUoXG4gICAgZGVjb2RlQ29tcGFjdFN0cmluZ1N1ZmZpeCxcbiAgICBkZWNvZGVDb21wYWN0QXJyYXksXG4gICAgZGVjb2RlT3B0aW9ucyxcbiAgKTtcbiAgY29uc3QgZGVjb2RlTGVnYWN5ID0gbWFrZUlubmVyRGVjb2RlKFxuICAgIGRlY29kZUxlZ2FjeVN0cmluZ1N1ZmZpeCxcbiAgICBkZWNvZGVMZWdhY3lBcnJheSxcbiAgICBkZWNvZGVPcHRpb25zLFxuICApO1xuICBjb25zdCBkZWNvZGVQYXNzYWJsZSA9IGVuY29kZWQgPT4ge1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGlmIChlbmNvZGVkLmNoYXJBdCgwKSA9PT0gJ34nKSB7XG4gICAgICByZXR1cm4gZGVjb2RlQ29tcGFjdChlbmNvZGVkLCAxKTtcbiAgICB9XG4gICAgcmV0dXJuIGRlY29kZUxlZ2FjeShlbmNvZGVkKTtcbiAgfTtcblxuICByZXR1cm4gaGFyZGVuKHsgZW5jb2RlUGFzc2FibGUsIGRlY29kZVBhc3NhYmxlIH0pO1xufTskaM2PX29uY2UubWFrZVBhc3NhYmxlS2l0KG1ha2VQYXNzYWJsZUtpdCk7XG5oYXJkZW4obWFrZVBhc3NhYmxlS2l0KTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlRW5jb2RlUGFzc2FibGUgPSBlbmNvZGVPcHRpb25zID0+IHtcbiAgY29uc3QgeyBlbmNvZGVQYXNzYWJsZSB9ID0gbWFrZVBhc3NhYmxlS2l0KGVuY29kZU9wdGlvbnMpO1xuICByZXR1cm4gZW5jb2RlUGFzc2FibGU7XG59OyRozY9fb25jZS5tYWtlRW5jb2RlUGFzc2FibGUobWFrZUVuY29kZVBhc3NhYmxlKTtcbmhhcmRlbihtYWtlRW5jb2RlUGFzc2FibGUpO1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VEZWNvZGVQYXNzYWJsZSA9IGRlY29kZU9wdGlvbnMgPT4ge1xuICBjb25zdCB7IGRlY29kZVBhc3NhYmxlIH0gPSBtYWtlUGFzc2FibGVLaXQoZGVjb2RlT3B0aW9ucyk7XG4gIHJldHVybiBkZWNvZGVQYXNzYWJsZTtcbn07JGjNj19vbmNlLm1ha2VEZWNvZGVQYXNzYWJsZShtYWtlRGVjb2RlUGFzc2FibGUpO1xuaGFyZGVuKG1ha2VEZWNvZGVQYXNzYWJsZSk7XG5cbiAgICAgICBjb25zdCBpc0VuY29kZWRSZW1vdGFibGUgPSBlbmNvZGVkID0+IGVuY29kZWQuY2hhckF0KDApID09PSAncic7JGjNj19vbmNlLmlzRW5jb2RlZFJlbW90YWJsZShpc0VuY29kZWRSZW1vdGFibGUpO1xuaGFyZGVuKGlzRW5jb2RlZFJlbW90YWJsZSk7XG5cbi8vXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBwYXNzU3R5bGVQcmVmaXhlcyA9IHtcbiAgZXJyb3I6ICchJyxcbiAgY29weVJlY29yZDogJygnLFxuICB0YWdnZWQ6ICc6JyxcbiAgcHJvbWlzZTogJz8nLFxuICBjb3B5QXJyYXk6ICdbXicsXG4gIGJvb2xlYW46ICdiJyxcbiAgbnVtYmVyOiAnZicsXG4gIGJpZ2ludDogJ25wJyxcbiAgcmVtb3RhYmxlOiAncicsXG4gIHN0cmluZzogJ3MnLFxuICBudWxsOiAndicsXG4gIHN5bWJvbDogJ3knLFxuICAvL1xuICAvL1xuICAvL1xuICB1bmRlZmluZWQ6ICd6Jyxcbn07JGjNj19vbmNlLnBhc3NTdHlsZVByZWZpeGVzKHBhc3NTdHlsZVByZWZpeGVzKTtcbk9iamVjdC5zZXRQcm90b3R5cGVPZihwYXNzU3R5bGVQcmVmaXhlcywgbnVsbCk7XG5oYXJkZW4ocGFzc1N0eWxlUHJlZml4ZXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicmVjb3JkTmFtZXMiOlsicmVjb3JkTmFtZXMiXSwicmVjb3JkVmFsdWVzIjpbInJlY29yZFZhbHVlcyJdLCJ6ZXJvUGFkIjpbInplcm9QYWQiXSwibWFrZVBhc3NhYmxlS2l0IjpbIm1ha2VQYXNzYWJsZUtpdCJdLCJtYWtlRW5jb2RlUGFzc2FibGUiOlsibWFrZUVuY29kZVBhc3NhYmxlIl0sIm1ha2VEZWNvZGVQYXNzYWJsZSI6WyJtYWtlRGVjb2RlUGFzc2FibGUiXSwiaXNFbmNvZGVkUmVtb3RhYmxlIjpbImlzRW5jb2RlZFJlbW90YWJsZSJdLCJwYXNzU3R5bGVQcmVmaXhlcyI6WyJwYXNzU3R5bGVQcmVmaXhlcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADPYpL49CsAAPQrAAArAAAAQGVuZG8vbWFyc2hhbC12MS42LjQvc3JjL2VuY29kZVRvQ2FwRGF0YS5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiUUNMQVNTIiwibWFrZURlY29kZUZyb21DYXBEYXRhIiwibWFrZUVuY29kZVRvQ2FwRGF0YSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHBhc3NTdHlsZU9mLGlzRXJyb3JMaWtlLG1ha2VUYWdnZWQsaXNPYmplY3QsZ2V0VGFnLGhhc093blByb3BlcnR5T2YsYXNzZXJ0UGFzc2FibGVTeW1ib2wsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NhYmxlU3ltYm9sRm9yTmFtZSxYLEZhaWwscTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wiaXNFcnJvckxpa2VcIixbJGjNj19hID0+IChpc0Vycm9yTGlrZSA9ICRozY9fYSldXSxbXCJtYWtlVGFnZ2VkXCIsWyRozY9fYSA9PiAobWFrZVRhZ2dlZCA9ICRozY9fYSldXSxbXCJpc09iamVjdFwiLFskaM2PX2EgPT4gKGlzT2JqZWN0ID0gJGjNj19hKV1dLFtcImdldFRhZ1wiLFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsWyRozY9fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRozY9fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVN5bWJvbFwiLFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlU3ltYm9sID0gJGjNj19hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLFskaM2PX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIixbJGjNj19hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBpc0FycmF5IH0gPSBBcnJheTtcbmNvbnN0IHtcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyxcbiAgZGVmaW5lUHJvcGVydGllcyxcbiAgaXMsXG4gIGVudHJpZXMsXG4gIGZyb21FbnRyaWVzLFxuICBmcmVlemUsXG59ID0gT2JqZWN0O1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgUUNMQVNTID0gJ0BxY2xhc3MnOyRozY9fb25jZS5RQ0xBU1MoUUNMQVNTKTtcblxuXG4vKlxuXG5cbiAqL1xuY29uc3QgaGFzUUNsYXNzID0gZW5jb2RlZCA9PiBoYXNPd25Qcm9wZXJ0eU9mKGVuY29kZWQsIFFDTEFTUyk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IHFjbGFzc01hdGNoZXMgPSAoZW5jb2RlZCwgcWNsYXNzKSA9PlxuICBpc09iamVjdChlbmNvZGVkKSAmJlxuICAhaXNBcnJheShlbmNvZGVkKSAmJlxuICBoYXNRQ2xhc3MoZW5jb2RlZCkgJiZcbiAgZW5jb2RlZFtRQ0xBU1NdID09PSBxY2xhc3M7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG5jb25zdCBkb250RW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhID0gcmVtID0+IEZhaWxgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cmVtfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVQcm9taXNlVG9DYXBEYXRhID0gcHJvbSA9PiBGYWlsYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVFcnJvclRvQ2FwRGF0YSA9IGVyciA9PiBGYWlsYGVycm9yIG9iamVjdCB1bmV4cGVjdGVkOiAke2Vycn1gO1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VFbmNvZGVUb0NhcERhdGEgPSAoZW5jb2RlT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBlbmNvZGVSZW1vdGFibGVUb0NhcERhdGEgPSBkb250RW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhLFxuICAgIGVuY29kZVByb21pc2VUb0NhcERhdGEgPSBkb250RW5jb2RlUHJvbWlzZVRvQ2FwRGF0YSxcbiAgICBlbmNvZGVFcnJvclRvQ2FwRGF0YSA9IGRvbnRFbmNvZGVFcnJvclRvQ2FwRGF0YSxcbiAgfSA9IGVuY29kZU9wdGlvbnM7XG5cbiAgLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgZW5jb2RlVG9DYXBEYXRhUmVjdXIgPSBwYXNzYWJsZSA9PiB7XG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbiAgICBzd2l0Y2ggKHBhc3NTdHlsZSkge1xuICAgICAgY2FzZSAnbnVsbCc6XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIGNhc2UgJ3N0cmluZyc6IHtcbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIHBhc3NhYmxlO1xuICAgICAgfVxuICAgICAgY2FzZSAndW5kZWZpbmVkJzoge1xuICAgICAgICByZXR1cm4geyBbUUNMQVNTXTogJ3VuZGVmaW5lZCcgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ251bWJlcic6IHtcbiAgICAgICAgLy9cbiAgICAgICAgaWYgKE51bWJlci5pc05hTihwYXNzYWJsZSkpIHtcbiAgICAgICAgICByZXR1cm4geyBbUUNMQVNTXTogJ05hTicgfTtcbiAgICAgICAgfSBlbHNlIGlmIChwYXNzYWJsZSA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgICByZXR1cm4geyBbUUNMQVNTXTogJ0luZmluaXR5JyB9O1xuICAgICAgICB9IGVsc2UgaWYgKHBhc3NhYmxlID09PSAtSW5maW5pdHkpIHtcbiAgICAgICAgICByZXR1cm4geyBbUUNMQVNTXTogJy1JbmZpbml0eScgfTtcbiAgICAgICAgfVxuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gaXMocGFzc2FibGUsIC0wKSA/IDAgOiBwYXNzYWJsZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2JpZ2ludCc6IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBbUUNMQVNTXTogJ2JpZ2ludCcsXG4gICAgICAgICAgZGlnaXRzOiBTdHJpbmcocGFzc2FibGUpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY2FzZSAnc3ltYm9sJzoge1xuICAgICAgICBhc3NlcnRQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG4gICAgICAgIGNvbnN0IG5hbWUgPSAvKiAgICAgICAgICAgICAgICAgKi8gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSkpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIFtRQ0xBU1NdOiAnc3ltYm9sJyxcbiAgICAgICAgICBuYW1lLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5T2YocGFzc2FibGUsIFFDTEFTUykpIHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIGNvbnN0IHsgW1FDTEFTU106IHFjbGFzc1ZhbHVlLCAuLi5yZXN0IH0gPSBwYXNzYWJsZTtcbiAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIFtRQ0xBU1NdOiAnaGlsYmVydCcsXG4gICAgICAgICAgICBvcmlnaW5hbDogZW5jb2RlVG9DYXBEYXRhUmVjdXIocWNsYXNzVmFsdWUpLFxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKG93bktleXMocmVzdCkubGVuZ3RoID49IDEpIHtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIHJlc3VsdC5yZXN0ID0gZW5jb2RlVG9DYXBEYXRhUmVjdXIoZnJlZXplKHJlc3QpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBjb25zdCBuYW1lcyA9IG93bktleXMocGFzc2FibGUpLnNvcnQoKTtcbiAgICAgICAgcmV0dXJuIGZyb21FbnRyaWVzKFxuICAgICAgICAgIG5hbWVzLm1hcChuYW1lID0+IFtuYW1lLCBlbmNvZGVUb0NhcERhdGFSZWN1cihwYXNzYWJsZVtuYW1lXSldKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgcmV0dXJuIHBhc3NhYmxlLm1hcChlbmNvZGVUb0NhcERhdGFSZWN1cik7XG4gICAgICB9XG4gICAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgW1FDTEFTU106ICd0YWdnZWQnLFxuICAgICAgICAgIHRhZzogZ2V0VGFnKHBhc3NhYmxlKSxcbiAgICAgICAgICBwYXlsb2FkOiBlbmNvZGVUb0NhcERhdGFSZWN1cihwYXNzYWJsZS5wYXlsb2FkKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3JlbW90YWJsZSc6IHtcbiAgICAgICAgY29uc3QgZW5jb2RlZCA9IGVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YShcbiAgICAgICAgICBwYXNzYWJsZSxcbiAgICAgICAgICBlbmNvZGVUb0NhcERhdGFSZWN1cixcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHFjbGFzc01hdGNoZXMoZW5jb2RlZCwgJ3Nsb3QnKSkge1xuICAgICAgICAgIHJldHVybiBlbmNvZGVkO1xuICAgICAgICB9XG4gICAgICAgIC8vXG4gICAgICAgIHRocm93IEZhaWxgaW50ZXJuYWw6IFJlbW90YWJsZSBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoICR7cShcbiAgICAgICAgICBRQ0xBU1MsXG4gICAgICAgICl9ICR7cSgnc2xvdCcpfTogJHtlbmNvZGVkfWA7XG4gICAgICB9XG4gICAgICBjYXNlICdwcm9taXNlJzoge1xuICAgICAgICBjb25zdCBlbmNvZGVkID0gZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YShwYXNzYWJsZSwgZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuICAgICAgICBpZiAocWNsYXNzTWF0Y2hlcyhlbmNvZGVkLCAnc2xvdCcpKSB7XG4gICAgICAgICAgcmV0dXJuIGVuY29kZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgRmFpbGBpbnRlcm5hbDogUHJvbWlzZSBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoICR7cShcbiAgICAgICAgICBRQ0xBU1MsXG4gICAgICAgICAgJ3Nsb3QnLFxuICAgICAgICApfTogJHtlbmNvZGVkfWA7XG4gICAgICB9XG4gICAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgICAgY29uc3QgZW5jb2RlZCA9IGVuY29kZUVycm9yVG9DYXBEYXRhKHBhc3NhYmxlLCBlbmNvZGVUb0NhcERhdGFSZWN1cik7XG4gICAgICAgIGlmIChxY2xhc3NNYXRjaGVzKGVuY29kZWQsICdlcnJvcicpKSB7XG4gICAgICAgICAgcmV0dXJuIGVuY29kZWQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgRmFpbGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCAke3EoXG4gICAgICAgICAgUUNMQVNTLFxuICAgICAgICAgICdlcnJvcicsXG4gICAgICAgICl9OiAke2VuY29kZWR9YDtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoXG4gICAgICAgICAgWGBpbnRlcm5hbDogVW5yZWNvZ25pemVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX1gLFxuICAgICAgICAgIFR5cGVFcnJvcixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGNvbnN0IGVuY29kZVRvQ2FwRGF0YSA9IHBhc3NhYmxlID0+IHtcbiAgICBpZiAoaXNFcnJvckxpa2UocGFzc2FibGUpKSB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgcmV0dXJuIGhhcmRlbihlbmNvZGVFcnJvclRvQ2FwRGF0YShwYXNzYWJsZSwgZW5jb2RlVG9DYXBEYXRhUmVjdXIpKTtcbiAgICB9XG4gICAgcmV0dXJuIGhhcmRlbihlbmNvZGVUb0NhcERhdGFSZWN1cihwYXNzYWJsZSkpO1xuICB9O1xuICByZXR1cm4gaGFyZGVuKGVuY29kZVRvQ2FwRGF0YSk7XG59OyRozY9fb25jZS5tYWtlRW5jb2RlVG9DYXBEYXRhKG1ha2VFbmNvZGVUb0NhcERhdGEpO1xuaGFyZGVuKG1ha2VFbmNvZGVUb0NhcERhdGEpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuY29uc3QgZG9udERlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhID0gc2xvdEVuY29kaW5nID0+XG4gIEZhaWxgcmVtb3RhYmxlIG9yIHByb21pc2UgdW5leHBlY3RlZDogJHtzbG90RW5jb2Rpbmd9YDtcbmNvbnN0IGRvbnREZWNvZGVFcnJvckZyb21DYXBEYXRhID0gZXJyb3JFbmNvZGluZyA9PlxuICBGYWlsYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZXJyb3JFbmNvZGluZ31gO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSA9IChkZWNvZGVPcHRpb25zID0ge30pID0+IHtcbiAgY29uc3Qge1xuICAgIGRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhID0gZG9udERlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuICAgIGRlY29kZVByb21pc2VGcm9tQ2FwRGF0YSA9IGRvbnREZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbiAgICBkZWNvZGVFcnJvckZyb21DYXBEYXRhID0gZG9udERlY29kZUVycm9yRnJvbUNhcERhdGEsXG4gIH0gPSBkZWNvZGVPcHRpb25zO1xuXG4gIGRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhID09PSBkZWNvZGVQcm9taXNlRnJvbUNhcERhdGEgfHxcbiAgICBGYWlsYEFuIGltcGxlbWVudGF0aW9uIHJlc3RyaWN0aW9uIGZvciBub3c6IElmIGVpdGhlciBkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YSBvciBkZWNvZGVQcm9taXNlRnJvbUNhcERhdGEgaXMgcHJvdmlkZWQsIGJvdGggbXVzdCBiZSBwcm92aWRlZCBhbmQgdGhleSBtdXN0IGJlIHRoZSBzYW1lOiAke3EoXG4gICAgICBkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YSxcbiAgICApfSB2cyAke3EoZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhKX1gO1xuXG4gIC8qXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgZGVjb2RlRnJvbUNhcERhdGEgPSBqc29uRW5jb2RlZCA9PiB7XG4gICAgaWYgKCFpc09iamVjdChqc29uRW5jb2RlZCkpIHtcbiAgICAgIC8vXG4gICAgICByZXR1cm4ganNvbkVuY29kZWQ7XG4gICAgfVxuICAgIGlmIChpc0FycmF5KGpzb25FbmNvZGVkKSkge1xuICAgICAgcmV0dXJuIGpzb25FbmNvZGVkLm1hcChlbmNvZGVkVmFsID0+IGRlY29kZUZyb21DYXBEYXRhKGVuY29kZWRWYWwpKTtcbiAgICB9IGVsc2UgaWYgKGhhc1FDbGFzcyhqc29uRW5jb2RlZCkpIHtcbiAgICAgIGNvbnN0IHFjbGFzcyA9IGpzb25FbmNvZGVkW1FDTEFTU107XG4gICAgICB0eXBlb2YgcWNsYXNzID09PSAnc3RyaW5nJyB8fFxuICAgICAgICBGYWlsYGludmFsaWQgJHtxKFFDTEFTUyl9IHR5cGVvZiAke3EodHlwZW9mIHFjbGFzcyl9YDtcbiAgICAgIHN3aXRjaCAocWNsYXNzKSB7XG4gICAgICAgIC8vXG4gICAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6IHtcbiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ05hTic6IHtcbiAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0luZmluaXR5Jzoge1xuICAgICAgICAgIHJldHVybiBJbmZpbml0eTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICctSW5maW5pdHknOiB7XG4gICAgICAgICAgcmV0dXJuIC1JbmZpbml0eTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdiaWdpbnQnOiB7XG4gICAgICAgICAgY29uc3QgeyBkaWdpdHMgfSA9IGpzb25FbmNvZGVkO1xuICAgICAgICAgIHR5cGVvZiBkaWdpdHMgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICBGYWlsYGludmFsaWQgZGlnaXRzIHR5cGVvZiAke3EodHlwZW9mIGRpZ2l0cyl9YDtcbiAgICAgICAgICByZXR1cm4gQmlnSW50KGRpZ2l0cyk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnQEBhc3luY0l0ZXJhdG9yJzoge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgcmV0dXJuIFN5bWJvbC5hc3luY0l0ZXJhdG9yO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgICBjb25zdCB7IG5hbWUgfSA9IGpzb25FbmNvZGVkO1xuICAgICAgICAgIHJldHVybiBwYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndGFnZ2VkJzoge1xuICAgICAgICAgIGNvbnN0IHsgdGFnLCBwYXlsb2FkIH0gPSBqc29uRW5jb2RlZDtcbiAgICAgICAgICByZXR1cm4gbWFrZVRhZ2dlZCh0YWcsIGRlY29kZUZyb21DYXBEYXRhKHBheWxvYWQpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzbG90Jzoge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YShcbiAgICAgICAgICAgIGpzb25FbmNvZGVkLFxuICAgICAgICAgICAgZGVjb2RlRnJvbUNhcERhdGEsXG4gICAgICAgICAgKTtcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIHJldHVybiBkZWNvZGVkO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVFcnJvckZyb21DYXBEYXRhKFxuICAgICAgICAgICAganNvbkVuY29kZWQsXG4gICAgICAgICAgICBkZWNvZGVGcm9tQ2FwRGF0YSxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChwYXNzU3R5bGVPZihkZWNvZGVkKSA9PT0gJ2Vycm9yJykge1xuICAgICAgICAgICAgcmV0dXJuIGRlY29kZWQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIHRocm93IEZhaWxgaW50ZXJuYWw6IGRlY29kZUVycm9yRnJvbUNhcERhdGEgb3B0aW9uIG11c3QgcmV0dXJuIGFuIGVycm9yOiAke2RlY29kZWR9YDtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdoaWxiZXJ0Jzoge1xuICAgICAgICAgIGNvbnN0IHsgb3JpZ2luYWwsIHJlc3QgfSA9IGpzb25FbmNvZGVkO1xuICAgICAgICAgIGhhc093blByb3BlcnR5T2YoanNvbkVuY29kZWQsICdvcmlnaW5hbCcpIHx8XG4gICAgICAgICAgICBGYWlsYEludmFsaWQgSGlsYmVydCBIb3RlbCBlbmNvZGluZyAke2pzb25FbmNvZGVkfWA7XG4gICAgICAgICAgLy9cbiAgICAgICAgICBjb25zdCByZXN1bHQgPSB7IFtRQ0xBU1NdOiBkZWNvZGVGcm9tQ2FwRGF0YShvcmlnaW5hbCkgfTtcbiAgICAgICAgICBpZiAoaGFzT3duUHJvcGVydHlPZihqc29uRW5jb2RlZCwgJ3Jlc3QnKSkge1xuICAgICAgICAgICAgY29uc3QgaXNOb25FbXB0eU9iamVjdCA9XG4gICAgICAgICAgICAgIHR5cGVvZiByZXN0ID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgICByZXN0ICE9PSBudWxsICYmXG4gICAgICAgICAgICAgIG93bktleXMocmVzdCkubGVuZ3RoID49IDE7XG4gICAgICAgICAgICBpZiAoIWlzTm9uRW1wdHlPYmplY3QpIHtcbiAgICAgICAgICAgICAgdGhyb3cgRmFpbGBSZXN0IGVuY29kaW5nIG11c3QgYmUgYSBub24tZW1wdHkgb2JqZWN0OiAke3Jlc3R9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc3RPYmogPSBkZWNvZGVGcm9tQ2FwRGF0YShyZXN0KTtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICFoYXNPd25Qcm9wZXJ0eU9mKHJlc3RPYmosIFFDTEFTUykgfHxcbiAgICAgICAgICAgICAgRmFpbGBSZXN0IG11c3Qgbm90IGNvbnRhaW4gaXRzIG93biBkZWZpbml0aW9uIG9mICR7cShRQ0xBU1MpfWA7XG4gICAgICAgICAgICBkZWZpbmVQcm9wZXJ0aWVzKHJlc3VsdCwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhyZXN0T2JqKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgLy9cbiAgICAgICAgY2FzZSAnaWJpZCc6IHtcbiAgICAgICAgICB0aHJvdyBGYWlsYFRoZSBjYXBEYXRhIHByb3RvY29sIG5vIGxvbmdlciBzdXBwb3J0cyAke3EoUUNMQVNTKX0gJHtxKFxuICAgICAgICAgICAgcWNsYXNzLFxuICAgICAgICAgICl9YDtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoXG4gICAgICAgICAgICBYYHVucmVjb2duaXplZCAke3EoUUNMQVNTKX0gJHtxKHFjbGFzcyl9YCxcbiAgICAgICAgICAgIFR5cGVFcnJvcixcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydCh0eXBlb2YganNvbkVuY29kZWQgPT09ICdvYmplY3QnICYmIGpzb25FbmNvZGVkICE9PSBudWxsKTtcbiAgICAgIGNvbnN0IGRlY29kZUVudHJ5ID0gKFtuYW1lLCBlbmNvZGVkVmFsXSkgPT4ge1xuICAgICAgICB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICBGYWlsYFByb3BlcnR5ICR7cShuYW1lKX0gb2YgJHtqc29uRW5jb2RlZH0gbXVzdCBiZSBhIHN0cmluZ2A7XG4gICAgICAgIHJldHVybiBbbmFtZSwgZGVjb2RlRnJvbUNhcERhdGEoZW5jb2RlZFZhbCldO1xuICAgICAgfTtcbiAgICAgIGNvbnN0IGRlY29kZWRFbnRyaWVzID0gZW50cmllcyhqc29uRW5jb2RlZCkubWFwKGRlY29kZUVudHJ5KTtcbiAgICAgIHJldHVybiBmcm9tRW50cmllcyhkZWNvZGVkRW50cmllcyk7XG4gICAgfVxuICB9O1xuICByZXR1cm4gaGFyZGVuKGRlY29kZUZyb21DYXBEYXRhKTtcbn07JGjNj19vbmNlLm1ha2VEZWNvZGVGcm9tQ2FwRGF0YShtYWtlRGVjb2RlRnJvbUNhcERhdGEpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUUNMQVNTIjpbIlFDTEFTUyJdLCJtYWtlRW5jb2RlVG9DYXBEYXRhIjpbIm1ha2VFbmNvZGVUb0NhcERhdGEiXSwibWFrZURlY29kZUZyb21DYXBEYXRhIjpbIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD2GBtPQSwAAEEsAAAtAAAAQGVuZG8vbWFyc2hhbC12MS42LjQvc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyIsIm1ha2VFbmNvZGVUb1NtYWxsY2FwcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHBhc3NTdHlsZU9mLGlzRXJyb3JMaWtlLG1ha2VUYWdnZWQsZ2V0VGFnLGhhc093blByb3BlcnR5T2YsYXNzZXJ0UGFzc2FibGVTeW1ib2wsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NhYmxlU3ltYm9sRm9yTmFtZSxYLEZhaWwscTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wiaXNFcnJvckxpa2VcIixbJGjNj19hID0+IChpc0Vycm9yTGlrZSA9ICRozY9fYSldXSxbXCJtYWtlVGFnZ2VkXCIsWyRozY9fYSA9PiAobWFrZVRhZ2dlZCA9ICRozY9fYSldXSxbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLFskaM2PX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsWyRozY9fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3QgeyBpcywgZW50cmllcywgZnJvbUVudHJpZXMgfSA9IE9iamVjdDtcblxuY29uc3QgQkFORyA9ICchJy5jaGFyQ29kZUF0KDApO1xuY29uc3QgREFTSCA9ICctJy5jaGFyQ29kZUF0KDApO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBzdGFydHNTcGVjaWFsID0gZW5jb2RlZFN0ciA9PiB7XG4gIGlmIChlbmNvZGVkU3RyID09PSAnJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICAvL1xuICBjb25zdCBjb2RlID0gZW5jb2RlZFN0ci5jaGFyQ29kZUF0KDApO1xuICAvL1xuICByZXR1cm4gQkFORyA8PSBjb2RlICYmIGNvZGUgPD0gREFTSDtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG5jb25zdCBkb250RW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMgPSByZW0gPT5cbiAgRmFpbGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YDtcblxuY29uc3QgZG9udEVuY29kZVByb21pc2VUb1NtYWxsY2FwcyA9IHByb20gPT4gRmFpbGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cHJvbX1gO1xuXG5jb25zdCBkb250RW5jb2RlRXJyb3JUb1NtYWxsY2FwcyA9IGVyciA9PlxuICBGYWlsYGVycm9yIG9iamVjdCB1bmV4cGVjdGVkOiAke3EoZXJyKX1gO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VFbmNvZGVUb1NtYWxsY2FwcyA9IChlbmNvZGVPcHRpb25zID0ge30pID0+IHtcbiAgY29uc3Qge1xuICAgIGVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzID0gZG9udEVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzLFxuICAgIGVuY29kZVByb21pc2VUb1NtYWxsY2FwcyA9IGRvbnRFbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMsXG4gICAgZW5jb2RlRXJyb3JUb1NtYWxsY2FwcyA9IGRvbnRFbmNvZGVFcnJvclRvU21hbGxjYXBzLFxuICB9ID0gZW5jb2RlT3B0aW9ucztcblxuICBjb25zdCBhc3NlcnRFbmNvZGVkRXJyb3IgPSBlbmNvZGluZyA9PiB7XG4gICAgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ29iamVjdCcgJiYgaGFzT3duUHJvcGVydHlPZihlbmNvZGluZywgJyNlcnJvcicpKSB8fFxuICAgICAgRmFpbGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBoYXZlIFwiI2Vycm9yXCIgcHJvcGVydHk6ICR7cShcbiAgICAgICAgZW5jb2RpbmcsXG4gICAgICApfWA7XG4gICAgLy9cbiAgICBjb25zdCBtZXNzYWdlID0gZW5jb2RpbmdbJyNlcnJvciddO1xuICAgICh0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZycgJiZcbiAgICAgICghc3RhcnRzU3BlY2lhbChtZXNzYWdlKSB8fCBtZXNzYWdlLmNoYXJBdCgwKSA9PT0gJyEnKSkgfHxcbiAgICAgIEZhaWxgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgaGF2ZSBzdHJpbmcgbWVzc2FnZTogJHtxKG1lc3NhZ2UpfWA7XG4gIH07XG5cbiAgLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgZW5jb2RlVG9TbWFsbGNhcHNSZWN1ciA9IHBhc3NhYmxlID0+IHtcbiAgICAvL1xuICAgIC8vXG4gICAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YocGFzc2FibGUpO1xuICAgIHN3aXRjaCAocGFzc1N0eWxlKSB7XG4gICAgICBjYXNlICdudWxsJzpcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOiB7XG4gICAgICAgIC8vXG4gICAgICAgIHJldHVybiBwYXNzYWJsZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N0cmluZyc6IHtcbiAgICAgICAgaWYgKHN0YXJ0c1NwZWNpYWwocGFzc2FibGUpKSB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIHJldHVybiBgISR7cGFzc2FibGV9YDtcbiAgICAgICAgfVxuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gcGFzc2FibGU7XG4gICAgICB9XG4gICAgICBjYXNlICd1bmRlZmluZWQnOiB7XG4gICAgICAgIHJldHVybiAnI3VuZGVmaW5lZCc7XG4gICAgICB9XG4gICAgICBjYXNlICdudW1iZXInOiB7XG4gICAgICAgIC8vXG4gICAgICAgIGlmIChOdW1iZXIuaXNOYU4ocGFzc2FibGUpKSB7XG4gICAgICAgICAgcmV0dXJuICcjTmFOJztcbiAgICAgICAgfSBlbHNlIGlmIChwYXNzYWJsZSA9PT0gSW5maW5pdHkpIHtcbiAgICAgICAgICByZXR1cm4gJyNJbmZpbml0eSc7XG4gICAgICAgIH0gZWxzZSBpZiAocGFzc2FibGUgPT09IC1JbmZpbml0eSkge1xuICAgICAgICAgIHJldHVybiAnIy1JbmZpbml0eSc7XG4gICAgICAgIH1cbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIGlzKHBhc3NhYmxlLCAtMCkgPyAwIDogcGFzc2FibGU7XG4gICAgICB9XG4gICAgICBjYXNlICdiaWdpbnQnOiB7XG4gICAgICAgIGNvbnN0IHN0ciA9IFN0cmluZyhwYXNzYWJsZSk7XG4gICAgICAgIHJldHVybiAvKiAgICAgICAgICAgICAgICAgKi8gKHBhc3NhYmxlKSA8IDBuID8gc3RyIDogYCske3N0cn1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnc3ltYm9sJzoge1xuICAgICAgICBhc3NlcnRQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG4gICAgICAgIGNvbnN0IG5hbWUgPSAvKiAgICAgICAgICAgICAgICAgKi8gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSkpO1xuICAgICAgICByZXR1cm4gYCUke25hbWV9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IG5hbWVzID0gb3duS2V5cyhwYXNzYWJsZSkuc29ydCgpO1xuICAgICAgICByZXR1cm4gZnJvbUVudHJpZXMoXG4gICAgICAgICAgbmFtZXMubWFwKG5hbWUgPT4gW1xuICAgICAgICAgICAgZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihuYW1lKSxcbiAgICAgICAgICAgIGVuY29kZVRvU21hbGxjYXBzUmVjdXIocGFzc2FibGVbbmFtZV0pLFxuICAgICAgICAgIF0pLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weUFycmF5Jzoge1xuICAgICAgICByZXR1cm4gcGFzc2FibGUubWFwKGVuY29kZVRvU21hbGxjYXBzUmVjdXIpO1xuICAgICAgfVxuICAgICAgY2FzZSAndGFnZ2VkJzoge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICcjdGFnJzogZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihnZXRUYWcocGFzc2FibGUpKSxcbiAgICAgICAgICBwYXlsb2FkOiBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKHBhc3NhYmxlLnBheWxvYWQpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY2FzZSAncmVtb3RhYmxlJzoge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBlbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyhcbiAgICAgICAgICBwYXNzYWJsZSxcbiAgICAgICAgICBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyLFxuICAgICAgICApO1xuICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycgJiYgcmVzdWx0LmNoYXJBdCgwKSA9PT0gJyQnKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICAvL1xuICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBSZW1vdGFibGUgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiJFwiOiAke3Jlc3VsdH1gO1xuICAgICAgfVxuICAgICAgY2FzZSAncHJvbWlzZSc6IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzKFxuICAgICAgICAgIHBhc3NhYmxlLFxuICAgICAgICAgIGVuY29kZVRvU21hbGxjYXBzUmVjdXIsXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJyAmJiByZXN1bHQuY2hhckF0KDApID09PSAnJicpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIHRocm93IEZhaWxgaW50ZXJuYWw6IFByb21pc2UgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiJlwiOiAke3Jlc3VsdH1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGVuY29kZUVycm9yVG9TbWFsbGNhcHMocGFzc2FibGUsIGVuY29kZVRvU21hbGxjYXBzUmVjdXIpO1xuICAgICAgICBhc3NlcnRFbmNvZGVkRXJyb3IocmVzdWx0KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoXG4gICAgICAgICAgWGBpbnRlcm5hbDogVW5yZWNvZ25pemVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX1gLFxuICAgICAgICAgIFR5cGVFcnJvcixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIGNvbnN0IGVuY29kZVRvU21hbGxjYXBzID0gcGFzc2FibGUgPT4ge1xuICAgIGlmIChpc0Vycm9yTGlrZShwYXNzYWJsZSkpIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBjb25zdCByZXN1bHQgPSBoYXJkZW4oXG4gICAgICAgIGVuY29kZUVycm9yVG9TbWFsbGNhcHMocGFzc2FibGUsIGVuY29kZVRvU21hbGxjYXBzUmVjdXIpLFxuICAgICAgKTtcbiAgICAgIGFzc2VydEVuY29kZWRFcnJvcihyZXN1bHQpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgcmV0dXJuIGhhcmRlbihlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKHBhc3NhYmxlKSk7XG4gIH07XG4gIHJldHVybiBoYXJkZW4oZW5jb2RlVG9TbWFsbGNhcHMpO1xufTskaM2PX29uY2UubWFrZUVuY29kZVRvU21hbGxjYXBzKG1ha2VFbmNvZGVUb1NtYWxsY2Fwcyk7XG5oYXJkZW4obWFrZUVuY29kZVRvU21hbGxjYXBzKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbmNvbnN0IGRvbnREZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzID0gZW5jb2RpbmcgPT5cbiAgRmFpbGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gO1xuY29uc3QgZG9udERlY29kZVByb21pc2VGcm9tU21hbGxjYXBzID0gZW5jb2RpbmcgPT5cbiAgRmFpbGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7ZW5jb2Rpbmd9YDtcbmNvbnN0IGRvbnREZWNvZGVFcnJvckZyb21TbWFsbGNhcHMgPSBlbmNvZGluZyA9PlxuICBGYWlsYGVycm9yIHVuZXhwZWN0ZWQ6ICR7cShlbmNvZGluZyl9YDtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyA9IChkZWNvZGVPcHRpb25zID0ge30pID0+IHtcbiAgY29uc3Qge1xuICAgIGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMgPSBkb250RGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyxcbiAgICBkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyA9IGRvbnREZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyxcbiAgICBkZWNvZGVFcnJvckZyb21TbWFsbGNhcHMgPSBkb250RGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzLFxuICB9ID0gZGVjb2RlT3B0aW9ucztcblxuICAvKlxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGRlY29kZUZyb21TbWFsbGNhcHMgPSBlbmNvZGluZyA9PiB7XG4gICAgc3dpdGNoICh0eXBlb2YgZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgY2FzZSAnbnVtYmVyJzoge1xuICAgICAgICByZXR1cm4gZW5jb2Rpbmc7XG4gICAgICB9XG4gICAgICBjYXNlICdzdHJpbmcnOiB7XG4gICAgICAgIGlmICghc3RhcnRzU3BlY2lhbChlbmNvZGluZykpIHtcbiAgICAgICAgICByZXR1cm4gZW5jb2Rpbmc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYyA9IGVuY29kaW5nLmNoYXJBdCgwKTtcbiAgICAgICAgc3dpdGNoIChjKSB7XG4gICAgICAgICAgY2FzZSAnISc6IHtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICByZXR1cm4gZW5jb2Rpbmcuc2xpY2UoMSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJyUnOiB7XG4gICAgICAgICAgICByZXR1cm4gcGFzc2FibGVTeW1ib2xGb3JOYW1lKGVuY29kaW5nLnNsaWNlKDEpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnIyc6IHtcbiAgICAgICAgICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgICAgICAgICAgY2FzZSAnI3VuZGVmaW5lZCc6IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgJyNOYU4nOiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlICcjSW5maW5pdHknOiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEluZmluaXR5O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgJyMtSW5maW5pdHknOiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIC1JbmZpbml0eTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoXG4gICAgICAgICAgICAgICAgICBYYHVua25vd24gY29uc3RhbnQgXCIke3EoZW5jb2RpbmcpfVwiYCxcbiAgICAgICAgICAgICAgICAgIFR5cGVFcnJvcixcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJysnOlxuICAgICAgICAgIGNhc2UgJy0nOiB7XG4gICAgICAgICAgICByZXR1cm4gQmlnSW50KGVuY29kaW5nKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnJCc6IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMoXG4gICAgICAgICAgICAgIGVuY29kaW5nLFxuICAgICAgICAgICAgICBkZWNvZGVGcm9tU21hbGxjYXBzLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICBpZiAocGFzc1N0eWxlT2YocmVzdWx0KSAhPT0gJ3JlbW90YWJsZScpIHtcbiAgICAgICAgICAgICAgRmFpbGBpbnRlcm5hbDogZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyBvcHRpb24gbXVzdCByZXR1cm4gYSByZW1vdGFibGU6ICR7cmVzdWx0fWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICcmJzoge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMoXG4gICAgICAgICAgICAgIGVuY29kaW5nLFxuICAgICAgICAgICAgICBkZWNvZGVGcm9tU21hbGxjYXBzLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChwYXNzU3R5bGVPZihyZXN1bHQpICE9PSAncHJvbWlzZScpIHtcbiAgICAgICAgICAgICAgRmFpbGBpbnRlcm5hbDogZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMgb3B0aW9uIG11c3QgcmV0dXJuIGEgcHJvbWlzZTogJHtyZXN1bHR9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIHRocm93IEZhaWxgU3BlY2lhbCBjaGFyICR7cShcbiAgICAgICAgICAgICAgYyxcbiAgICAgICAgICAgICl9IHJlc2VydmVkIGZvciBmdXR1cmUgdXNlOiAke2VuY29kaW5nfWA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYXNlICdvYmplY3QnOiB7XG4gICAgICAgIGlmIChlbmNvZGluZyA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBlbmNvZGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0FycmF5KGVuY29kaW5nKSkge1xuICAgICAgICAgIHJldHVybiBlbmNvZGluZy5tYXAodmFsID0+IGRlY29kZUZyb21TbWFsbGNhcHModmFsKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHlPZihlbmNvZGluZywgJyN0YWcnKSkge1xuICAgICAgICAgIGNvbnN0IHsgJyN0YWcnOiB0YWcsIHBheWxvYWQsIC4uLnJlc3QgfSA9IGVuY29kaW5nO1xuICAgICAgICAgIHR5cGVvZiB0YWcgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICBGYWlsYFZhbHVlIG9mIFwiI3RhZ1wiLCB0aGUgdGFnLCBtdXN0IGJlIGEgc3RyaW5nOiAke2VuY29kaW5nfWA7XG4gICAgICAgICAgb3duS2V5cyhyZXN0KS5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgICAgIEZhaWxgI3RhZyByZWNvcmQgdW5leHBlY3RlZCBwcm9wZXJ0aWVzOiAke3Eob3duS2V5cyhyZXN0KSl9YDtcbiAgICAgICAgICByZXR1cm4gbWFrZVRhZ2dlZChcbiAgICAgICAgICAgIGRlY29kZUZyb21TbWFsbGNhcHModGFnKSxcbiAgICAgICAgICAgIGRlY29kZUZyb21TbWFsbGNhcHMocGF5bG9hZCksXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eU9mKGVuY29kaW5nLCAnI2Vycm9yJykpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBkZWNvZGVFcnJvckZyb21TbWFsbGNhcHMoXG4gICAgICAgICAgICBlbmNvZGluZyxcbiAgICAgICAgICAgIGRlY29kZUZyb21TbWFsbGNhcHMsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBwYXNzU3R5bGVPZihyZXN1bHQpID09PSAnZXJyb3InIHx8XG4gICAgICAgICAgICBGYWlsYGludGVybmFsOiBkZWNvZGVFcnJvckZyb21TbWFsbGNhcHMgb3B0aW9uIG11c3QgcmV0dXJuIGFuIGVycm9yOiAke3Jlc3VsdH1gO1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBkZWNvZGVFbnRyeSA9IChbZW5jb2RlZE5hbWUsIGVuY29kZWRWYWxdKSA9PiB7XG4gICAgICAgICAgdHlwZW9mIGVuY29kZWROYW1lID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgRmFpbGBQcm9wZXJ0eSBuYW1lICR7cShcbiAgICAgICAgICAgICAgZW5jb2RlZE5hbWUsXG4gICAgICAgICAgICApfSBvZiAke2VuY29kaW5nfSBtdXN0IGJlIGEgc3RyaW5nYDtcbiAgICAgICAgICBlbmNvZGVkTmFtZS5jaGFyQXQoMCkgIT09ICcjJyB8fFxuICAgICAgICAgICAgRmFpbGBVbnJlY29nbml6ZWQgcmVjb3JkIHR5cGUgJHtxKGVuY29kZWROYW1lKX06ICR7ZW5jb2Rpbmd9YDtcbiAgICAgICAgICBjb25zdCBuYW1lID0gZGVjb2RlRnJvbVNtYWxsY2FwcyhlbmNvZGVkTmFtZSk7XG4gICAgICAgICAgdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICBGYWlsYERlY29kZWQgcHJvcGVydHkgbmFtZSAke25hbWV9IGZyb20gJHtlbmNvZGluZ30gbXVzdCBiZSBhIHN0cmluZ2A7XG4gICAgICAgICAgcmV0dXJuIFtuYW1lLCBkZWNvZGVGcm9tU21hbGxjYXBzKGVuY29kZWRWYWwpXTtcbiAgICAgICAgfTtcbiAgICAgICAgY29uc3QgZGVjb2RlZEVudHJpZXMgPSBlbnRyaWVzKGVuY29kaW5nKS5tYXAoZGVjb2RlRW50cnkpO1xuICAgICAgICByZXR1cm4gZnJvbUVudHJpZXMoZGVjb2RlZEVudHJpZXMpO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBhc3NlcnQuZmFpbChcbiAgICAgICAgICBYYGludGVybmFsOiB1bnJlY29nbml6ZWQgSlNPTiB0eXBlb2YgJHtxKFxuICAgICAgICAgICAgdHlwZW9mIGVuY29kaW5nLFxuICAgICAgICAgICl9OiAke2VuY29kaW5nfWAsXG4gICAgICAgICAgVHlwZUVycm9yLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGhhcmRlbihkZWNvZGVGcm9tU21hbGxjYXBzKTtcbn07JGjNj19vbmNlLm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzKG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VFbmNvZGVUb1NtYWxsY2FwcyI6WyJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiXSwibWFrZURlY29kZUZyb21TbWFsbGNhcHMiOlsibWFrZURlY29kZUZyb21TbWFsbGNhcHMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA5otTsGgvAABoLwAAKgAAAEBlbmRvL21hcnNoYWwtdjEuNi40L3NyYy9tYXJzaGFsLWp1c3Rpbi5qc3siaW1wb3J0cyI6WyJAZW5kby9uYXQiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vZXJyb3JzIiwiLi9lbmNvZGVUb0NhcERhdGEuanMiXSwiZXhwb3J0cyI6WyJkZWNvZGVUb0p1c3RpbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IE5hdCxnZXRFcnJvckNvbnN0cnVjdG9yLGlzT2JqZWN0LHBhc3NhYmxlU3ltYm9sRm9yTmFtZSxxLFgsRmFpbCxRQ0xBU1M7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLFskaM2PX2EgPT4gKE5hdCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImdldEVycm9yQ29uc3RydWN0b3JcIixbJGjNj19hID0+IChnZXRFcnJvckNvbnN0cnVjdG9yID0gJGjNj19hKV1dLFtcImlzT2JqZWN0XCIsWyRozY9fYSA9PiAoaXNPYmplY3QgPSAkaM2PX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsWyRozY9fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vZW5jb2RlVG9DYXBEYXRhLmpzXCIsIFtbXCJRQ0xBU1NcIixbJGjNj19hID0+IChRQ0xBU1MgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgaXNBcnJheSB9ID0gQXJyYXk7XG5jb25zdCB7IHN0cmluZ2lmeTogcXVvdGUgfSA9IEpTT047XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cbiAqL1xuY29uc3QgbWFrZVllc0luZGVudGVyID0gKCkgPT4ge1xuICBjb25zdCBzdHJpbmdzID0gW107XG4gIGxldCBsZXZlbCA9IDA7XG4gIGxldCBuZWVkU3BhY2UgPSBmYWxzZTtcbiAgY29uc3QgbGluZSA9ICgpID0+IHtcbiAgICBuZWVkU3BhY2UgPSBmYWxzZTtcbiAgICByZXR1cm4gc3RyaW5ncy5wdXNoKCdcXG4nLCAnICAnLnJlcGVhdChsZXZlbCkpO1xuICB9O1xuICByZXR1cm4gaGFyZGVuKHtcbiAgICBvcGVuOiBvcGVuQnJhY2tldCA9PiB7XG4gICAgICBsZXZlbCArPSAxO1xuICAgICAgaWYgKG5lZWRTcGFjZSkge1xuICAgICAgICBzdHJpbmdzLnB1c2goJyAnKTtcbiAgICAgIH1cbiAgICAgIG5lZWRTcGFjZSA9IGZhbHNlO1xuICAgICAgcmV0dXJuIHN0cmluZ3MucHVzaChvcGVuQnJhY2tldCk7XG4gICAgfSxcbiAgICBsaW5lLFxuICAgIG5leHQ6IHRva2VuID0+IHtcbiAgICAgIGlmIChuZWVkU3BhY2UgJiYgdG9rZW4gIT09ICcsJykge1xuICAgICAgICBzdHJpbmdzLnB1c2goJyAnKTtcbiAgICAgIH1cbiAgICAgIG5lZWRTcGFjZSA9IHRydWU7XG4gICAgICByZXR1cm4gc3RyaW5ncy5wdXNoKHRva2VuKTtcbiAgICB9LFxuICAgIGNsb3NlOiBjbG9zZUJyYWNrZXQgPT4ge1xuICAgICAgYXNzZXJ0KGxldmVsID49IDEpO1xuICAgICAgbGV2ZWwgLT0gMTtcbiAgICAgIGxpbmUoKTtcbiAgICAgIHJldHVybiBzdHJpbmdzLnB1c2goY2xvc2VCcmFja2V0KTtcbiAgICB9LFxuICAgIGRvbmU6ICgpID0+IHtcbiAgICAgIGFzc2VydC5lcXVhbChsZXZlbCwgMCk7XG4gICAgICByZXR1cm4gc3RyaW5ncy5qb2luKCcnKTtcbiAgICB9LFxuICB9KTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBiYWRQYWlyUGF0dGVybiA9IC9eKD86XFx3XFx3fDw8fD4+fFxcK1xcK3wtLXw8IXwtPikkLztcblxuLypcblxuXG5cbiAqL1xuY29uc3QgbWFrZU5vSW5kZW50ZXIgPSAoKSA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHN0cmluZ3MgPSBbXTtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgb3Blbjogb3BlbkJyYWNrZXQgPT4gc3RyaW5ncy5wdXNoKG9wZW5CcmFja2V0KSxcbiAgICBsaW5lOiAoKSA9PiBzdHJpbmdzLmxlbmd0aCxcbiAgICBuZXh0OiB0b2tlbiA9PiB7XG4gICAgICBpZiAoc3RyaW5ncy5sZW5ndGggPj0gMSkge1xuICAgICAgICBjb25zdCBsYXN0ID0gc3RyaW5nc1tzdHJpbmdzLmxlbmd0aCAtIDFdO1xuICAgICAgICAvL1xuICAgICAgICBpZiAobGFzdC5sZW5ndGggPj0gMSAmJiB0b2tlbi5sZW5ndGggPj0gMSkge1xuICAgICAgICAgIGNvbnN0IHBhaXIgPSBgJHtsYXN0W2xhc3QubGVuZ3RoIC0gMV19JHt0b2tlblswXX1gO1xuICAgICAgICAgIGlmIChiYWRQYWlyUGF0dGVybi50ZXN0KHBhaXIpKSB7XG4gICAgICAgICAgICBzdHJpbmdzLnB1c2goJyAnKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBzdHJpbmdzLnB1c2godG9rZW4pO1xuICAgIH0sXG4gICAgY2xvc2U6IGNsb3NlQnJhY2tldCA9PiB7XG4gICAgICBpZiAoc3RyaW5ncy5sZW5ndGggPj0gMSAmJiBzdHJpbmdzW3N0cmluZ3MubGVuZ3RoIC0gMV0gPT09ICcsJykge1xuICAgICAgICBzdHJpbmdzLnBvcCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHN0cmluZ3MucHVzaChjbG9zZUJyYWNrZXQpO1xuICAgIH0sXG4gICAgZG9uZTogKCkgPT4gc3RyaW5ncy5qb2luKCcnKSxcbiAgfSk7XG59O1xuXG5jb25zdCBpZGVudFBhdHRlcm4gPSAvXlthLXpBLVpdXFx3KiQvO1xuaGFyZGVuKGlkZW50UGF0dGVybik7XG5jb25zdCBBdEF0UHJlZml4UGF0dGVybiA9IC9eQEAoLiopJC87XG5oYXJkZW4oQXRBdFByZWZpeFBhdHRlcm4pO1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGRlY29kZVRvSnVzdGluID0gKGVuY29kaW5nLCBzaG91bGRJbmRlbnQgPSBmYWxzZSwgc2xvdHMgPSBbXSkgPT4ge1xuICAvKlxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBwcmVwYXJlID0gcmF3VHJlZSA9PiB7XG4gICAgaWYgKCFpc09iamVjdChyYXdUcmVlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvL1xuICAgIGFzc2VydC50eXBlb2YocmF3VHJlZSwgJ29iamVjdCcpO1xuICAgIGFzc2VydChyYXdUcmVlICE9PSBudWxsKTtcbiAgICBpZiAoUUNMQVNTIGluIHJhd1RyZWUpIHtcbiAgICAgIGNvbnN0IHFjbGFzcyA9IHJhd1RyZWVbUUNMQVNTXTtcbiAgICAgIHR5cGVvZiBxY2xhc3MgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgIEZhaWxgaW52YWxpZCBxY2xhc3MgdHlwZW9mICR7cSh0eXBlb2YgcWNsYXNzKX1gO1xuICAgICAgYXNzZXJ0KCFpc0FycmF5KHJhd1RyZWUpKTtcbiAgICAgIHN3aXRjaCAocmF3VHJlZVsnQHFjbGFzcyddKSB7XG4gICAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgIGNhc2UgJ05hTic6XG4gICAgICAgIGNhc2UgJ0luZmluaXR5JzpcbiAgICAgICAgY2FzZSAnLUluZmluaXR5Jzoge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdiaWdpbnQnOiB7XG4gICAgICAgICAgY29uc3QgeyBkaWdpdHMgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgdHlwZW9mIGRpZ2l0cyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIEZhaWxgaW52YWxpZCBkaWdpdHMgdHlwZW9mICR7cSh0eXBlb2YgZGlnaXRzKX1gO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdAQGFzeW5jSXRlcmF0b3InOiB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgICBjb25zdCB7IG5hbWUgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgYXNzZXJ0LnR5cGVvZihuYW1lLCAnc3RyaW5nJyk7XG4gICAgICAgICAgY29uc3Qgc3ltID0gcGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuICAgICAgICAgIGFzc2VydC50eXBlb2Yoc3ltLCAnc3ltYm9sJyk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgICBjb25zdCB7IHRhZywgcGF5bG9hZCB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBhc3NlcnQudHlwZW9mKHRhZywgJ3N0cmluZycpO1xuICAgICAgICAgIHByZXBhcmUocGF5bG9hZCk7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3Nsb3QnOiB7XG4gICAgICAgICAgY29uc3QgeyBpbmRleCwgaWZhY2UgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgYXNzZXJ0LnR5cGVvZihpbmRleCwgJ251bWJlcicpO1xuICAgICAgICAgIE5hdChpbmRleCk7XG4gICAgICAgICAgaWYgKGlmYWNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGFzc2VydC50eXBlb2YoaWZhY2UsICdzdHJpbmcnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2hpbGJlcnQnOiB7XG4gICAgICAgICAgY29uc3QgeyBvcmlnaW5hbCwgcmVzdCB9ID0gcmF3VHJlZTtcbiAgICAgICAgICAnb3JpZ2luYWwnIGluIHJhd1RyZWUgfHxcbiAgICAgICAgICAgIEZhaWxgSW52YWxpZCBIaWxiZXJ0IEhvdGVsIGVuY29kaW5nICR7cmF3VHJlZX1gO1xuICAgICAgICAgIHByZXBhcmUob3JpZ2luYWwpO1xuICAgICAgICAgIGlmICgncmVzdCcgaW4gcmF3VHJlZSkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiByZXN0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICB0aHJvdyBGYWlsYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdGA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVzdCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICB0aHJvdyBGYWlsYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IG5vdCBiZSBudWxsYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0FycmF5KHJlc3QpKSB7XG4gICAgICAgICAgICAgIHRocm93IEZhaWxgUmVzdCAke3Jlc3R9IGVuY29kaW5nIG11c3Qgbm90IGJlIGFuIGFycmF5YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChRQ0xBU1MgaW4gcmVzdCkge1xuICAgICAgICAgICAgICB0aHJvdyBGYWlsYFJlc3QgZW5jb2RpbmcgJHtyZXN0fSBtdXN0IG5vdCBjb250YWluICR7cShRQ0xBU1MpfWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBuYW1lcyA9IG93bktleXMocmVzdCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgICAgICAgICAgdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICAgICAgRmFpbGBQcm9wZXJ0eSBuYW1lICR7bmFtZX0gb2YgJHtyYXdUcmVlfSBtdXN0IGJlIGEgc3RyaW5nYDtcbiAgICAgICAgICAgICAgcHJlcGFyZShyZXN0W25hbWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICAgIGNvbnN0IHsgbmFtZSwgbWVzc2FnZSB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aHJvdyBGYWlsYGludmFsaWQgZXJyb3IgbmFtZSB0eXBlb2YgJHtxKHR5cGVvZiBuYW1lKX1gO1xuICAgICAgICAgIH1cbiAgICAgICAgICBnZXRFcnJvckNvbnN0cnVjdG9yKG5hbWUpICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIEZhaWxgTXVzdCBiZSB0aGUgbmFtZSBvZiBhbiBFcnJvciBjb25zdHJ1Y3RvciAke25hbWV9YDtcbiAgICAgICAgICB0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIEZhaWxgaW52YWxpZCBlcnJvciBtZXNzYWdlIHR5cGVvZiAke3EodHlwZW9mIG1lc3NhZ2UpfWA7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIGFzc2VydC5mYWlsKFhgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLCBUeXBlRXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc0FycmF5KHJhd1RyZWUpKSB7XG4gICAgICBjb25zdCB7IGxlbmd0aCB9ID0gcmF3VHJlZTtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgcHJlcGFyZShyYXdUcmVlW2ldKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgbmFtZXMgPSBvd25LZXlzKHJhd1RyZWUpO1xuICAgICAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICB0aHJvdyBGYWlsYFByb3BlcnR5IG5hbWUgJHtuYW1lfSBvZiAke3Jhd1RyZWV9IG11c3QgYmUgYSBzdHJpbmdgO1xuICAgICAgICB9XG4gICAgICAgIHByZXBhcmUocmF3VHJlZVtuYW1lXSk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IG1ha2VJbmRlbnRlciA9IHNob3VsZEluZGVudCA/IG1ha2VZZXNJbmRlbnRlciA6IG1ha2VOb0luZGVudGVyO1xuICBsZXQgb3V0ID0gbWFrZUluZGVudGVyKCk7XG5cbiAgLypcblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGRlY29kZSA9IHJhd1RyZWUgPT4ge1xuICAgIC8vXG4gICAgcmV0dXJuIHJlY3VyKHJhd1RyZWUpO1xuICB9O1xuXG4gIGNvbnN0IGRlY29kZVByb3BlcnR5ID0gKG5hbWUsIHZhbHVlKSA9PiB7XG4gICAgb3V0LmxpbmUoKTtcbiAgICBpZiAobmFtZSA9PT0gJ19fcHJvdG9fXycpIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBvdXQubmV4dChgW1wiX19wcm90b19fXCJdOmApO1xuICAgIH0gZWxzZSBpZiAoaWRlbnRQYXR0ZXJuLnRlc3QobmFtZSkpIHtcbiAgICAgIG91dC5uZXh0KGAke25hbWV9OmApO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXQubmV4dChgJHtxdW90ZShuYW1lKX06YCk7XG4gICAgfVxuICAgIGRlY29kZSh2YWx1ZSk7XG4gICAgb3V0Lm5leHQoJywnKTtcbiAgfTtcblxuICAvKlxuXG5cblxuXG4gICAqL1xuICBjb25zdCByZWN1ciA9IHJhd1RyZWUgPT4ge1xuICAgIGlmICghaXNPYmplY3QocmF3VHJlZSkpIHtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gb3V0Lm5leHQocXVvdGUocmF3VHJlZSkpO1xuICAgIH1cbiAgICAvL1xuICAgIGFzc2VydC50eXBlb2YocmF3VHJlZSwgJ29iamVjdCcpO1xuICAgIGFzc2VydChyYXdUcmVlICE9PSBudWxsKTtcbiAgICBpZiAoUUNMQVNTIGluIHJhd1RyZWUpIHtcbiAgICAgIGNvbnN0IHFjbGFzcyA9IHJhd1RyZWVbUUNMQVNTXTtcbiAgICAgIGFzc2VydC50eXBlb2YocWNsYXNzLCAnc3RyaW5nJyk7XG4gICAgICBhc3NlcnQoIWlzQXJyYXkocmF3VHJlZSkpO1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgc3dpdGNoIChyYXdUcmVlWydAcWNsYXNzJ10pIHtcbiAgICAgICAgLy9cbiAgICAgICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgICAgY2FzZSAnTmFOJzpcbiAgICAgICAgY2FzZSAnSW5maW5pdHknOlxuICAgICAgICBjYXNlICctSW5maW5pdHknOiB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICByZXR1cm4gb3V0Lm5leHQocWNsYXNzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdiaWdpbnQnOiB7XG4gICAgICAgICAgY29uc3QgeyBkaWdpdHMgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgYXNzZXJ0LnR5cGVvZihkaWdpdHMsICdzdHJpbmcnKTtcbiAgICAgICAgICByZXR1cm4gb3V0Lm5leHQoYCR7QmlnSW50KGRpZ2l0cyl9bmApO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0BAYXN5bmNJdGVyYXRvcic6IHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIHJldHVybiBvdXQubmV4dCgnU3ltYm9sLmFzeW5jSXRlcmF0b3InKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzeW1ib2wnOiB7XG4gICAgICAgICAgY29uc3QgeyBuYW1lIH0gPSByYXdUcmVlO1xuICAgICAgICAgIGFzc2VydC50eXBlb2YobmFtZSwgJ3N0cmluZycpO1xuICAgICAgICAgIGNvbnN0IHN5bSA9IHBhc3NhYmxlU3ltYm9sRm9yTmFtZShuYW1lKTtcbiAgICAgICAgICBhc3NlcnQudHlwZW9mKHN5bSwgJ3N5bWJvbCcpO1xuICAgICAgICAgIGNvbnN0IHJlZ2lzdGVyZWROYW1lID0gU3ltYm9sLmtleUZvcihzeW0pO1xuICAgICAgICAgIGlmIChyZWdpc3RlcmVkTmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb25zdCBtYXRjaCA9IEF0QXRQcmVmaXhQYXR0ZXJuLmV4ZWMobmFtZSk7XG4gICAgICAgICAgICBhc3NlcnQobWF0Y2ggIT09IG51bGwpO1xuICAgICAgICAgICAgY29uc3Qgc3VmZml4ID0gbWF0Y2hbMV07XG4gICAgICAgICAgICBhc3NlcnQoU3ltYm9sW3N1ZmZpeF0gPT09IHN5bSk7XG4gICAgICAgICAgICBhc3NlcnQoaWRlbnRQYXR0ZXJuLnRlc3Qoc3VmZml4KSk7XG4gICAgICAgICAgICByZXR1cm4gb3V0Lm5leHQoYFN5bWJvbC4ke3N1ZmZpeH1gKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG91dC5uZXh0KGBTeW1ib2wuZm9yKCR7cXVvdGUocmVnaXN0ZXJlZE5hbWUpfSlgKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAgICAgY29uc3QgeyB0YWcsIHBheWxvYWQgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgb3V0Lm5leHQoYG1ha2VUYWdnZWQoJHtxdW90ZSh0YWcpfSxgKTtcbiAgICAgICAgICBkZWNvZGUocGF5bG9hZCk7XG4gICAgICAgICAgcmV0dXJuIG91dC5uZXh0KCcpJyk7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlICdzbG90Jzoge1xuICAgICAgICAgIGxldCB7IGlmYWNlIH0gPSByYXdUcmVlO1xuICAgICAgICAgIGNvbnN0IGluZGV4ID0gTnVtYmVyKE5hdChyYXdUcmVlLmluZGV4KSk7XG4gICAgICAgICAgY29uc3QgbmVzdGVkUmVuZGVyID0gYXJnID0+IHtcbiAgICAgICAgICAgIGNvbnN0IG9sZE91dCA9IG91dDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgIG91dCA9IG1ha2VOb0luZGVudGVyKCk7XG4gICAgICAgICAgICAgIGRlY29kZShhcmcpO1xuICAgICAgICAgICAgICByZXR1cm4gb3V0LmRvbmUoKTtcbiAgICAgICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgICAgIG91dCA9IG9sZE91dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChpbmRleCA8IHNsb3RzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3Qgc2xvdCA9IG5lc3RlZFJlbmRlcihzbG90c1tpbmRleF0pO1xuICAgICAgICAgICAgaWYgKGlmYWNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIG91dC5uZXh0KGBzbG90VG9WYWwoJHtzbG90fSlgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmYWNlID0gbmVzdGVkUmVuZGVyKGlmYWNlKTtcbiAgICAgICAgICAgIHJldHVybiBvdXQubmV4dChgc2xvdFRvVmFsKCR7c2xvdH0sJHtpZmFjZX0pYCk7XG4gICAgICAgICAgfSBlbHNlIGlmIChpZmFjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gb3V0Lm5leHQoYHNsb3QoJHtpbmRleH0pYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmYWNlID0gbmVzdGVkUmVuZGVyKGlmYWNlKTtcbiAgICAgICAgICByZXR1cm4gb3V0Lm5leHQoYHNsb3QoJHtpbmRleH0sJHtpZmFjZX0pYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlICdoaWxiZXJ0Jzoge1xuICAgICAgICAgIGNvbnN0IHsgb3JpZ2luYWwsIHJlc3QgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgb3V0Lm9wZW4oJ3snKTtcbiAgICAgICAgICBkZWNvZGVQcm9wZXJ0eShRQ0xBU1MsIG9yaWdpbmFsKTtcbiAgICAgICAgICBpZiAoJ3Jlc3QnIGluIHJhd1RyZWUpIHtcbiAgICAgICAgICAgIGFzc2VydC50eXBlb2YocmVzdCwgJ29iamVjdCcpO1xuICAgICAgICAgICAgYXNzZXJ0KHJlc3QgIT09IG51bGwpO1xuICAgICAgICAgICAgY29uc3QgbmFtZXMgPSBvd25LZXlzKHJlc3QpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBGYWlsYFByb3BlcnR5IG5hbWUgJHtxKFxuICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICApfSBvZiAke3Jlc3R9IG11c3QgYmUgYSBzdHJpbmdgO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGRlY29kZVByb3BlcnR5KG5hbWUsIHJlc3RbbmFtZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gb3V0LmNsb3NlKCd9Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICAgIGNhdXNlID0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgZXJyb3JzID0gdW5kZWZpbmVkLFxuICAgICAgICAgIH0gPSByYXdUcmVlO1xuICAgICAgICAgIGNhdXNlID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIEZhaWxgZXJyb3IgY2F1c2Ugbm90IHlldCBpbXBsZW1lbnRlZCBpbiBtYXJzaGFsLWp1c3RpbmA7XG4gICAgICAgICAgbmFtZSAhPT0gYEFnZ3JlZ2F0ZUVycm9yYCB8fFxuICAgICAgICAgICAgRmFpbGBBZ2dyZWdhdGVFcnJvciBub3QgeWV0IGltcGxlbWVudGVkIGluIG1hcnNoYWwtanVzdGluYDtcbiAgICAgICAgICBlcnJvcnMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgRmFpbGBlcnJvciBlcnJvcnMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBtYXJzaGFsLWp1c3RpbmA7XG4gICAgICAgICAgcmV0dXJuIG91dC5uZXh0KGAke25hbWV9KCR7cXVvdGUobWVzc2FnZSl9KWApO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IGFzc2VydC5mYWlsKFxuICAgICAgICAgICAgWGB1bnJlY29nbml6ZWQgJHtxKFFDTEFTUyl9ICR7cShxY2xhc3MpfWAsXG4gICAgICAgICAgICBUeXBlRXJyb3IsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNBcnJheShyYXdUcmVlKSkge1xuICAgICAgY29uc3QgeyBsZW5ndGggfSA9IHJhd1RyZWU7XG4gICAgICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBvdXQubmV4dCgnW10nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dC5vcGVuKCdbJyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICBvdXQubGluZSgpO1xuICAgICAgICAgIGRlY29kZShyYXdUcmVlW2ldKTtcbiAgICAgICAgICBvdXQubmV4dCgnLCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXQuY2xvc2UoJ10nKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBjb25zdCBuYW1lcyA9IC8qICAgICAgICAgICAgICAgICAgICovIChvd25LZXlzKHJhd1RyZWUpKTtcbiAgICAgIGlmIChuYW1lcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG91dC5uZXh0KCd7fScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0Lm9wZW4oJ3snKTtcbiAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICAgICAgZGVjb2RlUHJvcGVydHkobmFtZSwgcmF3VHJlZVtuYW1lXSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dC5jbG9zZSgnfScpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgcHJlcGFyZShlbmNvZGluZyk7XG4gIGRlY29kZShlbmNvZGluZyk7XG4gIHJldHVybiBvdXQuZG9uZSgpO1xufTskaM2PX29uY2UuZGVjb2RlVG9KdXN0aW4oZGVjb2RlVG9KdXN0aW4pO1xuaGFyZGVuKGRlY29kZVRvSnVzdGluKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlY29kZVRvSnVzdGluIjpbImRlY29kZVRvSnVzdGluIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAL4ipxtKBwAASgcAAC0AAABAZW5kby9tYXJzaGFsLXYxLjYuNC9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiLi9tYXJzaGFsLmpzIl0sImV4cG9ydHMiOlsicGFyc2UiLCJzdHJpbmdpZnkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLG1ha2VNYXJzaGFsOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vbWFyc2hhbC5qc1wiLCBbW1wibWFrZU1hcnNoYWxcIixbJGjNj19hID0+IChtYWtlTWFyc2hhbCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuY29uc3QgeyBmcmVlemUgfSA9IE9iamVjdDtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBkb05vdENvbnZlcnRWYWxUb1Nsb3QgPSB2YWwgPT5cbiAgRmFpbGBNYXJzaGFsJ3Mgc3RyaW5naWZ5IHJlamVjdHMgcHJlc2VuY2VzIGFuZCBwcm9taXNlcyAke3ZhbH1gO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGRvTm90Q29udmVydFNsb3RUb1ZhbCA9IChzbG90LCBfaWZhY2UpID0+XG4gIEZhaWxgTWFyc2hhbCdzIHBhcnNlIG11c3Qgbm90IGVuY29kZSBhbnkgc2xvdHMgJHtzbG90fWA7XG5cbmNvbnN0IGJhZEFycmF5SGFuZGxlciA9IGhhcmRlbih7XG4gIGdldDogKF90YXJnZXQsIG5hbWUsIF9yZWNlaXZlcikgPT4ge1xuICAgIGlmIChuYW1lID09PSAnbGVuZ3RoJykge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIC8vXG4gICAgdGhyb3cgRmFpbGBNYXJzaGFsJ3MgcGFyc2UgbXVzdCBub3QgZW5jb2RlIGFueSBzbG90IHBvc2l0aW9ucyAke25hbWV9YDtcbiAgfSxcbn0pO1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGFycmF5VGFyZ2V0ID0gZnJlZXplKC8qICAgICAgICAgICAgICAgICovIChbXSkpO1xuY29uc3QgYmFkQXJyYXkgPSBuZXcgUHJveHkoYXJyYXlUYXJnZXQsIGJhZEFycmF5SGFuZGxlcik7XG5cbmNvbnN0IHsgc2VyaWFsaXplLCB1bnNlcmlhbGl6ZSB9ID0gbWFrZU1hcnNoYWwoXG4gIGRvTm90Q29udmVydFZhbFRvU2xvdCxcbiAgZG9Ob3RDb252ZXJ0U2xvdFRvVmFsLFxuICB7XG4gICAgZXJyb3JUYWdnaW5nOiAnb2ZmJyxcbiAgICAvL1xuICAgIHNlcmlhbGl6ZUJvZHlGb3JtYXQ6ICdjYXBkYXRhJyxcbiAgfSxcbik7XG5cbi8qXG5cblxuICovXG5jb25zdCBzdHJpbmdpZnkgPSB2YWwgPT4gc2VyaWFsaXplKHZhbCkuYm9keTskaM2PX29uY2Uuc3RyaW5naWZ5KHN0cmluZ2lmeSk7XG5oYXJkZW4oc3RyaW5naWZ5KTtcblxuLypcblxuXG4gKi9cbmNvbnN0IHBhcnNlID0gc3RyID0+XG4gIHVuc2VyaWFsaXplKFxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGZyZWV6ZSh7XG4gICAgICBib2R5OiBzdHIsXG4gICAgICBzbG90czogYmFkQXJyYXksXG4gICAgfSksXG4gICk7JGjNj19vbmNlLnBhcnNlKHBhcnNlKTtcbmhhcmRlbihwYXJzZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzdHJpbmdpZnkiOlsic3RyaW5naWZ5Il0sInBhcnNlIjpbInBhcnNlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAk6IG5hLwAAYS8AACMAAABAZW5kby9tYXJzaGFsLXYxLjYuNC9zcmMvbWFyc2hhbC5qc3siaW1wb3J0cyI6WyJAZW5kby9uYXQiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vZXJyb3JzIiwiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiLCIuL2VuY29kZVRvQ2FwRGF0YS5qcyIsIi4vZW5jb2RlVG9TbWFsbGNhcHMuanMiXSwiZXhwb3J0cyI6WyJtYWtlTWFyc2hhbCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IE5hdCxhc3NlcnRQYXNzYWJsZSxnZXRJbnRlcmZhY2VPZixnZXRFcnJvckNvbnN0cnVjdG9yLGhhc093blByb3BlcnR5T2YsdG9QYXNzYWJsZUVycm9yLFgsRmFpbCxxLG1ha2VFcnJvcixhbm5vdGF0ZUVycm9yLG9iamVjdE1hcCxRQ0xBU1MsbWFrZUVuY29kZVRvQ2FwRGF0YSxtYWtlRGVjb2RlRnJvbUNhcERhdGEsbWFrZURlY29kZUZyb21TbWFsbGNhcHMsbWFrZUVuY29kZVRvU21hbGxjYXBzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIixbJGjNj19hID0+IChOYXQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVwiLFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjNj19hKV1dLFtcImdldEludGVyZmFjZU9mXCIsWyRozY9fYSA9PiAoZ2V0SW50ZXJmYWNlT2YgPSAkaM2PX2EpXV0sW1wiZ2V0RXJyb3JDb25zdHJ1Y3RvclwiLFskaM2PX2EgPT4gKGdldEVycm9yQ29uc3RydWN0b3IgPSAkaM2PX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLFskaM2PX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaM2PX2EpXV0sW1widG9QYXNzYWJsZUVycm9yXCIsWyRozY9fYSA9PiAodG9QYXNzYWJsZUVycm9yID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJtYWtlRXJyb3JcIixbJGjNj19hID0+IChtYWtlRXJyb3IgPSAkaM2PX2EpXV0sW1wiYW5ub3RhdGVFcnJvclwiLFskaM2PX2EgPT4gKGFubm90YXRlRXJyb3IgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qc1wiLCBbW1wib2JqZWN0TWFwXCIsWyRozY9fYSA9PiAob2JqZWN0TWFwID0gJGjNj19hKV1dXV0sW1wiLi9lbmNvZGVUb0NhcERhdGEuanNcIiwgW1tcIlFDTEFTU1wiLFskaM2PX2EgPT4gKFFDTEFTUyA9ICRozY9fYSldXSxbXCJtYWtlRW5jb2RlVG9DYXBEYXRhXCIsWyRozY9fYSA9PiAobWFrZUVuY29kZVRvQ2FwRGF0YSA9ICRozY9fYSldXSxbXCJtYWtlRGVjb2RlRnJvbUNhcERhdGFcIixbJGjNj19hID0+IChtYWtlRGVjb2RlRnJvbUNhcERhdGEgPSAkaM2PX2EpXV1dXSxbXCIuL2VuY29kZVRvU21hbGxjYXBzLmpzXCIsIFtbXCJtYWtlRGVjb2RlRnJvbVNtYWxsY2Fwc1wiLFskaM2PX2EgPT4gKG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzID0gJGjNj19hKV1dLFtcIm1ha2VFbmNvZGVUb1NtYWxsY2Fwc1wiLFskaM2PX2EgPT4gKG1ha2VFbmNvZGVUb1NtYWxsY2FwcyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG5cbiAqL1xuXG5jb25zdCB7IGRlZmluZVByb3BlcnRpZXMgfSA9IE9iamVjdDtcbmNvbnN0IHsgaXNBcnJheSB9ID0gQXJyYXk7XG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgZGVmYXVsdFZhbFRvU2xvdEZuID0geCA9PiB4O1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBkZWZhdWx0U2xvdFRvVmFsRm4gPSAoeCwgXykgPT4geDtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZU1hcnNoYWwgPSAoXG4gIGNvbnZlcnRWYWxUb1Nsb3QgPSBkZWZhdWx0VmFsVG9TbG90Rm4sXG4gIGNvbnZlcnRTbG90VG9WYWwgPSBkZWZhdWx0U2xvdFRvVmFsRm4sXG4gIHtcbiAgICBlcnJvclRhZ2dpbmcgPSAnb24nLFxuICAgIG1hcnNoYWxOYW1lID0gJ2Fub24tbWFyc2hhbCcsXG4gICAgLy9cbiAgICAvL1xuICAgIGVycm9ySWROdW0gPSAxMDAwMCxcbiAgICAvL1xuICAgIC8vXG4gICAgbWFyc2hhbFNhdmVFcnJvciA9IGVyciA9PlxuICAgICAgY29uc29sZS5sb2coJ1RlbXBvcmFyeSBsb2dnaW5nIG9mIHNlbnQgZXJyb3InLCBlcnIpLFxuICAgIC8vXG4gICAgLy9cbiAgICBzZXJpYWxpemVCb2R5Rm9ybWF0ID0gJ2NhcGRhdGEnLFxuICB9ID0ge30sXG4pID0+IHtcbiAgYXNzZXJ0LnR5cGVvZihtYXJzaGFsTmFtZSwgJ3N0cmluZycpO1xuICBlcnJvclRhZ2dpbmcgPT09ICdvbicgfHxcbiAgICBlcnJvclRhZ2dpbmcgPT09ICdvZmYnIHx8XG4gICAgRmFpbGBUaGUgZXJyb3JUYWdnaW5nIG9wdGlvbiBjYW4gb25seSBiZSBcIm9uXCIgb3IgXCJvZmZcIiAke2Vycm9yVGFnZ2luZ31gO1xuICBjb25zdCBuZXh0RXJyb3JJZCA9ICgpID0+IHtcbiAgICBlcnJvcklkTnVtICs9IDE7XG4gICAgcmV0dXJuIGBlcnJvcjoke21hcnNoYWxOYW1lfSMke2Vycm9ySWROdW19YDtcbiAgfTtcblxuICAvKlxuXG4gICAqL1xuICBjb25zdCB0b0NhcERhdGEgPSByb290ID0+IHtcbiAgICBjb25zdCBzbG90cyA9IFtdO1xuICAgIC8vXG4gICAgY29uc3Qgc2xvdE1hcCA9IG5ldyBNYXAoKTtcblxuICAgIC8qXG5cblxuICAgICAqL1xuICAgIGNvbnN0IGVuY29kZVNsb3RDb21tb24gPSBwYXNzYWJsZSA9PiB7XG4gICAgICBsZXQgaW5kZXggPSBzbG90TWFwLmdldChwYXNzYWJsZSk7XG4gICAgICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvL1xuICAgICAgICBhc3NlcnQudHlwZW9mKGluZGV4LCAnbnVtYmVyJyk7XG4gICAgICAgIHJldHVybiBoYXJkZW4oeyBpbmRleCwgcmVwZWF0OiB0cnVlIH0pO1xuICAgICAgfVxuXG4gICAgICBpbmRleCA9IHNsb3RzLmxlbmd0aDtcbiAgICAgIGNvbnN0IHNsb3QgPSBjb252ZXJ0VmFsVG9TbG90KHBhc3NhYmxlKTtcbiAgICAgIHNsb3RzLnB1c2goc2xvdCk7XG4gICAgICBzbG90TWFwLnNldChwYXNzYWJsZSwgaW5kZXgpO1xuICAgICAgcmV0dXJuIGhhcmRlbih7IGluZGV4LCByZXBlYXQ6IGZhbHNlIH0pO1xuICAgIH07XG5cbiAgICAvKlxuXG5cblxuXG5cblxuXG5cbiAgICAgKi9cbiAgICBjb25zdCBlbmNvZGVFcnJvckNvbW1vbiA9IChlcnIsIGVuY29kZVJlY3VyKSA9PiB7XG4gICAgICBjb25zdCBtZXNzYWdlID0gZW5jb2RlUmVjdXIoYCR7ZXJyLm1lc3NhZ2V9YCk7XG4gICAgICBhc3NlcnQudHlwZW9mKG1lc3NhZ2UsICdzdHJpbmcnKTtcbiAgICAgIGNvbnN0IG5hbWUgPSBlbmNvZGVSZWN1cihgJHtlcnIubmFtZX1gKTtcbiAgICAgIGFzc2VydC50eXBlb2YobmFtZSwgJ3N0cmluZycpO1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgaWYgKGVycm9yVGFnZ2luZyA9PT0gJ29uJykge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBjb25zdCBlcnJvcklkID0gZW5jb2RlUmVjdXIobmV4dEVycm9ySWQoKSk7XG4gICAgICAgIGFzc2VydC50eXBlb2YoZXJyb3JJZCwgJ3N0cmluZycpO1xuICAgICAgICBhbm5vdGF0ZUVycm9yKGVyciwgWGBTZW50IGFzICR7ZXJyb3JJZH1gKTtcbiAgICAgICAgbWFyc2hhbFNhdmVFcnJvcihlcnIpO1xuICAgICAgICByZXR1cm4gaGFyZGVuKHsgZXJyb3JJZCwgbWVzc2FnZSwgbmFtZSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBoYXJkZW4oeyBtZXNzYWdlLCBuYW1lIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAoc2VyaWFsaXplQm9keUZvcm1hdCA9PT0gJ2NhcGRhdGEnKSB7XG4gICAgICAvKlxuXG5cblxuICAgICAgICovXG4gICAgICBjb25zdCBlbmNvZGVTbG90VG9DYXBEYXRhID0gKHBhc3NhYmxlLCBpZmFjZSA9IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgICBjb25zdCB7IGluZGV4LCByZXBlYXQgfSA9IGVuY29kZVNsb3RDb21tb24ocGFzc2FibGUpO1xuXG4gICAgICAgIGlmIChyZXBlYXQgPT09IHRydWUgfHwgaWZhY2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBoYXJkZW4oeyBbUUNMQVNTXTogJ3Nsb3QnLCBpbmRleCB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgW1FDTEFTU106ICdzbG90JywgaWZhY2UsIGluZGV4IH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgIGNvbnN0IGVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSA9ICh2YWwsIF9lbmNvZGVSZWN1cikgPT5cbiAgICAgICAgZW5jb2RlU2xvdFRvQ2FwRGF0YSh2YWwsIGdldEludGVyZmFjZU9mKHZhbCkpO1xuXG4gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICBjb25zdCBlbmNvZGVQcm9taXNlVG9DYXBEYXRhID0gKHByb21pc2UsIF9lbmNvZGVSZWN1cikgPT5cbiAgICAgICAgZW5jb2RlU2xvdFRvQ2FwRGF0YShwcm9taXNlKTtcblxuICAgICAgLypcblxuXG5cblxuXG5cblxuXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IGVuY29kZUVycm9yVG9DYXBEYXRhID0gKGVyciwgZW5jb2RlUmVjdXIpID0+IHtcbiAgICAgICAgY29uc3QgZXJyRGF0YSA9IGVuY29kZUVycm9yQ29tbW9uKGVyciwgZW5jb2RlUmVjdXIpO1xuICAgICAgICByZXR1cm4gaGFyZGVuKHsgW1FDTEFTU106ICdlcnJvcicsIC4uLmVyckRhdGEgfSk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBlbmNvZGVUb0NhcERhdGEgPSBtYWtlRW5jb2RlVG9DYXBEYXRhKHtcbiAgICAgICAgZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhLFxuICAgICAgICBlbmNvZGVQcm9taXNlVG9DYXBEYXRhLFxuICAgICAgICBlbmNvZGVFcnJvclRvQ2FwRGF0YSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBlbmNvZGVkID0gZW5jb2RlVG9DYXBEYXRhKHJvb3QpO1xuICAgICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KGVuY29kZWQpO1xuICAgICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICAgIGJvZHksXG4gICAgICAgIHNsb3RzLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChzZXJpYWxpemVCb2R5Rm9ybWF0ID09PSAnc21hbGxjYXBzJykge1xuICAgICAgLypcblxuXG5cblxuICAgICAgICovXG4gICAgICBjb25zdCBlbmNvZGVTbG90VG9TbWFsbGNhcHMgPSAocHJlZml4LCBwYXNzYWJsZSwgaWZhY2UgPSB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgY29uc3QgeyBpbmRleCwgcmVwZWF0IH0gPSBlbmNvZGVTbG90Q29tbW9uKHBhc3NhYmxlKTtcblxuICAgICAgICAvL1xuICAgICAgICBpZiAocmVwZWF0ID09PSB0cnVlIHx8IGlmYWNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gYCR7cHJlZml4fSR7aW5kZXh9YDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7cHJlZml4fSR7aW5kZXh9LiR7aWZhY2V9YDtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzID0gKHJlbW90YWJsZSwgX2VuY29kZVJlY3VyKSA9PlxuICAgICAgICBlbmNvZGVTbG90VG9TbWFsbGNhcHMoJyQnLCByZW1vdGFibGUsIGdldEludGVyZmFjZU9mKHJlbW90YWJsZSkpO1xuXG4gICAgICBjb25zdCBlbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMgPSAocHJvbWlzZSwgX2VuY29kZVJlY3VyKSA9PlxuICAgICAgICBlbmNvZGVTbG90VG9TbWFsbGNhcHMoJyYnLCBwcm9taXNlKTtcblxuICAgICAgY29uc3QgZW5jb2RlRXJyb3JUb1NtYWxsY2FwcyA9IChlcnIsIGVuY29kZVJlY3VyKSA9PiB7XG4gICAgICAgIGNvbnN0IGVyckRhdGEgPSBlbmNvZGVFcnJvckNvbW1vbihlcnIsIGVuY29kZVJlY3VyKTtcbiAgICAgICAgY29uc3QgeyBtZXNzYWdlLCAuLi5yZXN0IH0gPSBlcnJEYXRhO1xuICAgICAgICByZXR1cm4gaGFyZGVuKHsgJyNlcnJvcic6IG1lc3NhZ2UsIC4uLnJlc3QgfSk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBlbmNvZGVUb1NtYWxsY2FwcyA9IG1ha2VFbmNvZGVUb1NtYWxsY2Fwcyh7XG4gICAgICAgIGVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzLFxuICAgICAgICBlbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMsXG4gICAgICAgIGVuY29kZUVycm9yVG9TbWFsbGNhcHMsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZW5jb2RlZCA9IGVuY29kZVRvU21hbGxjYXBzKHJvb3QpO1xuICAgICAgY29uc3Qgc21hbGxjYXBzQm9keSA9IEpTT04uc3RyaW5naWZ5KGVuY29kZWQpO1xuICAgICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIGJvZHk6IGAjJHtzbWFsbGNhcHNCb2R5fWAsXG4gICAgICAgIHNsb3RzLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vXG4gICAgICB0aHJvdyBGYWlsYFVucmVjb2duaXplZCBzZXJpYWxpemVCb2R5Rm9ybWF0OiAke3Eoc2VyaWFsaXplQm9keUZvcm1hdCl9YDtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgbWFrZUZ1bGxSZXZpdmUgPSBzbG90cyA9PiB7XG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCB2YWxNYXAgPSBuZXcgTWFwKCk7XG5cbiAgICAvKlxuXG5cbiAgICAgKi9cbiAgICBjb25zdCBkZWNvZGVTbG90Q29tbW9uID0gc2xvdERhdGEgPT4ge1xuICAgICAgY29uc3QgeyBpZmFjZSA9IHVuZGVmaW5lZCwgaW5kZXgsIC4uLnJlc3QgfSA9IHNsb3REYXRhO1xuICAgICAgb3duS2V5cyhyZXN0KS5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgRmFpbGB1bmV4cGVjdGVkIGVuY29kZWQgc2xvdCBwcm9wZXJ0aWVzICR7cShvd25LZXlzKHJlc3QpKX1gO1xuICAgICAgY29uc3QgZXh0YW50ID0gdmFsTWFwLmdldChpbmRleCk7XG4gICAgICBpZiAoZXh0YW50KSB7XG4gICAgICAgIHJldHVybiBleHRhbnQ7XG4gICAgICB9XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGNvbnN0IHNsb3QgPSBzbG90c1tOdW1iZXIoTmF0KGluZGV4KSldO1xuICAgICAgY29uc3QgdmFsID0gY29udmVydFNsb3RUb1ZhbChzbG90LCBpZmFjZSk7XG4gICAgICB2YWxNYXAuc2V0KGluZGV4LCB2YWwpO1xuICAgICAgcmV0dXJuIHZhbDtcbiAgICB9O1xuXG4gICAgLypcblxuXG5cblxuXG5cblxuXG5cbiAgICAgKi9cbiAgICBjb25zdCBkZWNvZGVFcnJvckNvbW1vbiA9IChlcnJEYXRhLCBkZWNvZGVSZWN1cikgPT4ge1xuICAgICAgY29uc3Qge1xuICAgICAgICBlcnJvcklkID0gdW5kZWZpbmVkLFxuICAgICAgICBtZXNzYWdlLFxuICAgICAgICBuYW1lLFxuICAgICAgICBjYXVzZSA9IHVuZGVmaW5lZCxcbiAgICAgICAgZXJyb3JzID0gdW5kZWZpbmVkLFxuICAgICAgICAuLi5yZXN0XG4gICAgICB9ID0gZXJyRGF0YTtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBjb25zdCBkTmFtZSA9IGRlY29kZVJlY3VyKG5hbWUpO1xuICAgICAgY29uc3QgZE1lc3NhZ2UgPSBkZWNvZGVSZWN1cihtZXNzYWdlKTtcbiAgICAgIC8vXG4gICAgICBjb25zdCBkRXJyb3JJZCA9IC8qICAgICAgICAgICAgICAgICAqLyAoZXJyb3JJZCAmJiBkZWNvZGVSZWN1cihlcnJvcklkKSk7XG4gICAgICBpZiAodHlwZW9mIGROYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBGYWlsYGludmFsaWQgZXJyb3IgbmFtZSB0eXBlb2YgJHtxKHR5cGVvZiBkTmFtZSl9YDtcbiAgICAgIH1cbiAgICAgIGlmICh0eXBlb2YgZE1lc3NhZ2UgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IEZhaWxgaW52YWxpZCBlcnJvciBtZXNzYWdlIHR5cGVvZiAke3EodHlwZW9mIGRNZXNzYWdlKX1gO1xuICAgICAgfVxuICAgICAgY29uc3QgZXJyQ29uc3RydWN0b3IgPSBnZXRFcnJvckNvbnN0cnVjdG9yKGROYW1lKSB8fCBFcnJvcjtcbiAgICAgIGNvbnN0IGVycm9yTmFtZSA9XG4gICAgICAgIGRFcnJvcklkID09PSB1bmRlZmluZWRcbiAgICAgICAgICA/IGBSZW1vdGUke2VyckNvbnN0cnVjdG9yLm5hbWV9YFxuICAgICAgICAgIDogYFJlbW90ZSR7ZXJyQ29uc3RydWN0b3IubmFtZX0oJHtkRXJyb3JJZH0pYDtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSB7XG4gICAgICAgIGVycm9yTmFtZSxcbiAgICAgICAgc2FuaXRpemU6IGZhbHNlLFxuICAgICAgfTtcbiAgICAgIGlmIChjYXVzZSkge1xuICAgICAgICBvcHRpb25zLmNhdXNlID0gZGVjb2RlUmVjdXIoY2F1c2UpO1xuICAgICAgfVxuICAgICAgaWYgKGVycm9ycykge1xuICAgICAgICBvcHRpb25zLmVycm9ycyA9IGRlY29kZVJlY3VyKGVycm9ycyk7XG4gICAgICB9XG4gICAgICBjb25zdCByYXdFcnJvciA9IG1ha2VFcnJvcihkTWVzc2FnZSwgZXJyQ29uc3RydWN0b3IsIG9wdGlvbnMpO1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGNvbnN0IGRlc2NzID0gb2JqZWN0TWFwKHJlc3QsIGRhdGEgPT4gKHtcbiAgICAgICAgdmFsdWU6IGRlY29kZVJlY3VyKGRhdGEpLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgfSkpO1xuICAgICAgZGVmaW5lUHJvcGVydGllcyhyYXdFcnJvciwgZGVzY3MpO1xuICAgICAgaGFyZGVuKHJhd0Vycm9yKTtcbiAgICAgIHJldHVybiB0b1Bhc3NhYmxlRXJyb3IocmF3RXJyb3IpO1xuICAgIH07XG5cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgY29uc3QgZGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEgPSAocmF3VHJlZSwgX2RlY29kZVJlY3VyKSA9PiB7XG4gICAgICBjb25zdCB7IFtRQ0xBU1NdOiBfLCAuLi5zbG90RGF0YSB9ID0gcmF3VHJlZTtcbiAgICAgIHJldHVybiBkZWNvZGVTbG90Q29tbW9uKHNsb3REYXRhKTtcbiAgICB9O1xuXG4gICAgY29uc3QgZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YSA9IChyYXdUcmVlLCBkZWNvZGVSZWN1cikgPT4ge1xuICAgICAgY29uc3QgeyBbUUNMQVNTXTogXywgLi4uZXJyRGF0YSB9ID0gcmF3VHJlZTtcbiAgICAgIHJldHVybiBkZWNvZGVFcnJvckNvbW1vbihlcnJEYXRhLCBkZWNvZGVSZWN1cik7XG4gICAgfTtcblxuICAgIGNvbnN0IHJldml2ZUZyb21DYXBEYXRhID0gbWFrZURlY29kZUZyb21DYXBEYXRhKHtcbiAgICAgIGRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhOiBkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbiAgICAgIGRlY29kZVByb21pc2VGcm9tQ2FwRGF0YTogZGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG4gICAgICBkZWNvZGVFcnJvckZyb21DYXBEYXRhLFxuICAgIH0pO1xuXG4gICAgY29uc3QgbWFrZURlY29kZVNsb3RGcm9tU21hbGxjYXBzID0gcHJlZml4ID0+IHtcbiAgICAgIC8qXG5cblxuXG4gICAgICAgKi9cbiAgICAgIHJldHVybiAoc3RyaW5nRW5jb2RpbmcsIF9kZWNvZGVSZWN1cikgPT4ge1xuICAgICAgICBhc3NlcnQoc3RyaW5nRW5jb2RpbmcuY2hhckF0KDApID09PSBwcmVmaXgpO1xuICAgICAgICAvL1xuICAgICAgICBjb25zdCBpID0gc3RyaW5nRW5jb2RpbmcuaW5kZXhPZignLicpO1xuICAgICAgICBjb25zdCBpbmRleCA9IE51bWJlcihzdHJpbmdFbmNvZGluZy5zbGljZSgxLCBpIDwgMCA/IHVuZGVmaW5lZCA6IGkpKTtcbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgaWZhY2UgPSBpIDwgMCA/IHVuZGVmaW5lZCA6IHN0cmluZ0VuY29kaW5nLnNsaWNlKGkgKyAxKTtcbiAgICAgICAgcmV0dXJuIGRlY29kZVNsb3RDb21tb24oeyBpZmFjZSwgaW5kZXggfSk7XG4gICAgICB9O1xuICAgIH07XG4gICAgY29uc3QgZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyA9IG1ha2VEZWNvZGVTbG90RnJvbVNtYWxsY2FwcygnJCcpO1xuICAgIGNvbnN0IGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzID0gbWFrZURlY29kZVNsb3RGcm9tU21hbGxjYXBzKCcmJyk7XG5cbiAgICBjb25zdCBkZWNvZGVFcnJvckZyb21TbWFsbGNhcHMgPSAoZW5jb2RpbmcsIGRlY29kZVJlY3VyKSA9PiB7XG4gICAgICBjb25zdCB7ICcjZXJyb3InOiBtZXNzYWdlLCAuLi5yZXN0RXJyRGF0YSB9ID0gZW5jb2Rpbmc7XG4gICAgICAhaGFzT3duUHJvcGVydHlPZihyZXN0RXJyRGF0YSwgJ21lc3NhZ2UnKSB8fFxuICAgICAgICBGYWlsYHVuZXhwZWN0ZWQgZW5jb2RlZCBlcnJvciBwcm9wZXJ0eSAke3EoJ21lc3NhZ2UnKX1gO1xuICAgICAgcmV0dXJuIGRlY29kZUVycm9yQ29tbW9uKHsgbWVzc2FnZSwgLi4ucmVzdEVyckRhdGEgfSwgZGVjb2RlUmVjdXIpO1xuICAgIH07XG5cbiAgICBjb25zdCByZXZpdmVGcm9tU21hbGxjYXBzID0gbWFrZURlY29kZUZyb21TbWFsbGNhcHMoe1xuICAgICAgLy9cbiAgICAgIGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMsXG4gICAgICAvL1xuICAgICAgZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMsXG4gICAgICBkZWNvZGVFcnJvckZyb21TbWFsbGNhcHMsXG4gICAgfSk7XG5cbiAgICByZXR1cm4gaGFyZGVuKHsgcmV2aXZlRnJvbUNhcERhdGEsIHJldml2ZUZyb21TbWFsbGNhcHMgfSk7XG4gIH07XG5cbiAgLypcblxuICAgKi9cbiAgY29uc3QgZnJvbUNhcERhdGEgPSBkYXRhID0+IHtcbiAgICBjb25zdCB7IGJvZHksIHNsb3RzIH0gPSBkYXRhO1xuICAgIHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJyB8fFxuICAgICAgRmFpbGB1bnNlcmlhbGl6ZSgpIGdpdmVuIG5vbi1jYXBkYXRhICguYm9keSBpcyAke2JvZHl9LCBub3Qgc3RyaW5nKWA7XG4gICAgaXNBcnJheShkYXRhLnNsb3RzKSB8fFxuICAgICAgRmFpbGB1bnNlcmlhbGl6ZSgpIGdpdmVuIG5vbi1jYXBkYXRhICguc2xvdHMgYXJlIG5vdCBBcnJheSlgO1xuICAgIGNvbnN0IHsgcmV2aXZlRnJvbUNhcERhdGEsIHJldml2ZUZyb21TbWFsbGNhcHMgfSA9IG1ha2VGdWxsUmV2aXZlKHNsb3RzKTtcbiAgICBsZXQgcmVzdWx0O1xuICAgIC8vXG4gICAgaWYgKGJvZHkuY2hhckF0KDApID09PSAnIycpIHtcbiAgICAgIGNvbnN0IHNtYWxsY2Fwc0JvZHkgPSBib2R5LnNsaWNlKDEpO1xuICAgICAgY29uc3QgZW5jb2RpbmcgPSBoYXJkZW4oSlNPTi5wYXJzZShzbWFsbGNhcHNCb2R5KSk7XG4gICAgICByZXN1bHQgPSBoYXJkZW4ocmV2aXZlRnJvbVNtYWxsY2FwcyhlbmNvZGluZykpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCByYXdUcmVlID0gaGFyZGVuKEpTT04ucGFyc2UoYm9keSkpO1xuICAgICAgcmVzdWx0ID0gaGFyZGVuKHJldml2ZUZyb21DYXBEYXRhKHJhd1RyZWUpKTtcbiAgICB9XG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgYXNzZXJ0UGFzc2FibGUocmVzdWx0KTtcbiAgICByZXR1cm4gLyogICAgICAgICAgICAgICAgICAgICAgKi8gKHJlc3VsdCk7XG4gIH07XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgdG9DYXBEYXRhLFxuICAgIGZyb21DYXBEYXRhLFxuXG4gICAgLy9cbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIHNlcmlhbGl6ZTogdG9DYXBEYXRhLFxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICB1bnNlcmlhbGl6ZTogZnJvbUNhcERhdGEsXG4gIH0pO1xufTskaM2PX29uY2UubWFrZU1hcnNoYWwobWFrZU1hcnNoYWwpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU1hcnNoYWwiOlsibWFrZU1hcnNoYWwiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAASrDVXesuAADrLgAAJQAAAEBlbmRvL21hcnNoYWwtdjEuNi40L3NyYy9yYW5rT3JkZXIuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2Vycm9ycyIsIi4vZW5jb2RlUGFzc2FibGUuanMiXSwiZXhwb3J0cyI6WyJGdWxsUmFua0NvdmVyIiwiYXNzZXJ0UmFua1NvcnRlZCIsImNvbXBhcmF0b3JNaXJyb3JJbWFnZSIsImNvbXBhcmVBbnRpUmFuayIsImNvbXBhcmVSYW5rIiwiY292ZXJlZEVudHJpZXMiLCJnZXRJbmRleENvdmVyIiwiZ2V0UGFzc1N0eWxlQ292ZXIiLCJpbnRlcnNlY3RSYW5rQ292ZXJzIiwiaXNSYW5rU29ydGVkIiwibWFrZUNvbXBhcmF0b3JLaXQiLCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCIsInNvcnRCeVJhbmsiLCJ0cml2aWFsQ29tcGFyYXRvciIsInVuaW9uUmFua0NvdmVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGdldFRhZyxwYXNzU3R5bGVPZixuYW1lRm9yUGFzc2FibGVTeW1ib2wsRmFpbCxxLHBhc3NTdHlsZVByZWZpeGVzLHJlY29yZE5hbWVzLHJlY29yZFZhbHVlczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImdldFRhZ1wiLFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXSxbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLFskaM2PX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCIuL2VuY29kZVBhc3NhYmxlLmpzXCIsIFtbXCJwYXNzU3R5bGVQcmVmaXhlc1wiLFskaM2PX2EgPT4gKHBhc3NTdHlsZVByZWZpeGVzID0gJGjNj19hKV1dLFtcInJlY29yZE5hbWVzXCIsWyRozY9fYSA9PiAocmVjb3JkTmFtZXMgPSAkaM2PX2EpXV0sW1wicmVjb3JkVmFsdWVzXCIsWyRozY9fYSA9PiAocmVjb3JkVmFsdWVzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuLypcblxuXG4gKi9cblxuY29uc3QgeyBlbnRyaWVzLCBmcm9tRW50cmllcywgc2V0UHJvdG90eXBlT2YsIGlzIH0gPSBPYmplY3Q7XG5cbi8qXG5cblxuXG4gKi9cblxuLypcblxuXG5cbiAqL1xuXG4vKlxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHNhbWVWYWx1ZVplcm8gPSAoeCwgeSkgPT4geCA9PT0geSB8fCBpcyh4LCB5KTtcblxuICAgICAgIGNvbnN0IHRyaXZpYWxDb21wYXJhdG9yID0gKGxlZnQsIHJpZ2h0KSA9PlxuICAvL1xuICBsZWZ0IDwgcmlnaHQgPyAtMSA6IGxlZnQgPT09IHJpZ2h0ID8gMCA6IDE7XG5cbi8qXG5cbiAqLyRozY9fb25jZS50cml2aWFsQ29tcGFyYXRvcih0cml2aWFsQ29tcGFyYXRvcik7XG5cbmNvbnN0IHBhc3NTdHlsZVJhbmtzID0gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKFxuICBmcm9tRW50cmllcyhcbiAgICBlbnRyaWVzKHBhc3NTdHlsZVByZWZpeGVzKVxuICAgICAgLy9cbiAgICAgIC5zb3J0KChbX2xlZnRTdHlsZSwgbGVmdFByZWZpeGVzXSwgW19yaWdodFN0eWxlLCByaWdodFByZWZpeGVzXSkgPT4ge1xuICAgICAgICByZXR1cm4gdHJpdmlhbENvbXBhcmF0b3IobGVmdFByZWZpeGVzLCByaWdodFByZWZpeGVzKTtcbiAgICAgIH0pXG4gICAgICAubWFwKChbcGFzc1N0eWxlLCBwcmVmaXhlc10sIGluZGV4KSA9PiB7XG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIHByZWZpeGVzID09PSBbLi4ucHJlZml4ZXNdLnNvcnQoKS5qb2luKCcnKSB8fFxuICAgICAgICAgIEZhaWxgdW5zb3J0ZWQgcHJlZml4ZXMgZm9yIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX06ICR7cShwcmVmaXhlcyl9YDtcbiAgICAgICAgY29uc3QgY292ZXIgPSBbXG4gICAgICAgICAgcHJlZml4ZXMuY2hhckF0KDApLFxuICAgICAgICAgIFN0cmluZy5mcm9tQ2hhckNvZGUocHJlZml4ZXMuY2hhckNvZGVBdChwcmVmaXhlcy5sZW5ndGggLSAxKSArIDEpLFxuICAgICAgICBdO1xuICAgICAgICByZXR1cm4gW3Bhc3NTdHlsZSwgeyBpbmRleCwgY292ZXIgfV07XG4gICAgICB9KSxcbiAgKVxuKTtcbnNldFByb3RvdHlwZU9mKHBhc3NTdHlsZVJhbmtzLCBudWxsKTtcbmhhcmRlbihwYXNzU3R5bGVSYW5rcyk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBnZXRQYXNzU3R5bGVDb3ZlciA9IHBhc3NTdHlsZSA9PiBwYXNzU3R5bGVSYW5rc1twYXNzU3R5bGVdLmNvdmVyOyRozY9fb25jZS5nZXRQYXNzU3R5bGVDb3ZlcihnZXRQYXNzU3R5bGVDb3Zlcik7XG5oYXJkZW4oZ2V0UGFzc1N0eWxlQ292ZXIpO1xuXG4vKlxuXG4gKi9cbmNvbnN0IG1lbW9PZlNvcnRlZCA9IG5ldyBXZWFrTWFwKCk7XG5cbi8qXG5cbiAqL1xuY29uc3QgY29tcGFyYXRvck1pcnJvckltYWdlcyA9IG5ldyBXZWFrTWFwKCk7XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VDb21wYXJhdG9yS2l0ID0gKGNvbXBhcmVSZW1vdGFibGVzID0gKF94LCBfeSkgPT4gTmFOKSA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGNvbXBhcmF0b3IgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgICBpZiAoc2FtZVZhbHVlWmVybyhsZWZ0LCByaWdodCkpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICBjb25zdCBsZWZ0U3R5bGUgPSBwYXNzU3R5bGVPZihsZWZ0KTtcbiAgICBjb25zdCByaWdodFN0eWxlID0gcGFzc1N0eWxlT2YocmlnaHQpO1xuICAgIGlmIChsZWZ0U3R5bGUgIT09IHJpZ2h0U3R5bGUpIHtcbiAgICAgIHJldHVybiB0cml2aWFsQ29tcGFyYXRvcihcbiAgICAgICAgcGFzc1N0eWxlUmFua3NbbGVmdFN0eWxlXS5pbmRleCxcbiAgICAgICAgcGFzc1N0eWxlUmFua3NbcmlnaHRTdHlsZV0uaW5kZXgsXG4gICAgICApO1xuICAgIH1cbiAgICAvKlxuXG4gICAgICovXG4gICAgc3dpdGNoIChsZWZ0U3R5bGUpIHtcbiAgICAgIGNhc2UgJ3JlbW90YWJsZSc6IHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVSZW1vdGFibGVzKGxlZnQsIHJpZ2h0KTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICBjYXNlICdudWxsJzpcbiAgICAgIGNhc2UgJ2Vycm9yJzpcbiAgICAgIGNhc2UgJ3Byb21pc2UnOiB7XG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICBjYXNlICdiaWdpbnQnOlxuICAgICAgY2FzZSAnc3RyaW5nJzoge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBpZiAobGVmdCA8IHJpZ2h0KSB7XG4gICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFzc2VydChsZWZ0ID4gcmlnaHQpO1xuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYXNlICdzeW1ib2wnOiB7XG4gICAgICAgIHJldHVybiBjb21wYXJhdG9yKFxuICAgICAgICAgIG5hbWVGb3JQYXNzYWJsZVN5bWJvbChsZWZ0KSxcbiAgICAgICAgICBuYW1lRm9yUGFzc2FibGVTeW1ib2wocmlnaHQpLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY2FzZSAnbnVtYmVyJzoge1xuICAgICAgICAvL1xuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKGxlZnQpKSB7XG4gICAgICAgICAgYXNzZXJ0KCFOdW1iZXIuaXNOYU4ocmlnaHQpKTtcbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfSBlbHNlIGlmIChOdW1iZXIuaXNOYU4ocmlnaHQpKSB7XG4gICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIGlmIChsZWZ0IDwgcmlnaHQpIHtcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXNzZXJ0KGxlZnQgPiByaWdodCk7XG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG5cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgbGVmdE5hbWVzID0gcmVjb3JkTmFtZXMobGVmdCk7XG4gICAgICAgIGNvbnN0IHJpZ2h0TmFtZXMgPSByZWNvcmROYW1lcyhyaWdodCk7XG5cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY29tcGFyYXRvcihsZWZ0TmFtZXMsIHJpZ2h0TmFtZXMpO1xuICAgICAgICBpZiAocmVzdWx0ICE9PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBsZWZ0VmFsdWVzID0gcmVjb3JkVmFsdWVzKGxlZnQsIGxlZnROYW1lcyk7XG4gICAgICAgIGNvbnN0IHJpZ2h0VmFsdWVzID0gcmVjb3JkVmFsdWVzKHJpZ2h0LCByaWdodE5hbWVzKTtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmF0b3IobGVmdFZhbHVlcywgcmlnaHRWYWx1ZXMpO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weUFycmF5Jzoge1xuICAgICAgICAvL1xuICAgICAgICBjb25zdCBsZW4gPSBNYXRoLm1pbihsZWZ0Lmxlbmd0aCwgcmlnaHQubGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBhcmF0b3IobGVmdFtpXSwgcmlnaHRbaV0pO1xuICAgICAgICAgIGlmIChyZXN1bHQgIT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIHJldHVybiBjb21wYXJhdG9yKGxlZnQubGVuZ3RoLCByaWdodC5sZW5ndGgpO1xuICAgICAgfVxuICAgICAgY2FzZSAndGFnZ2VkJzoge1xuICAgICAgICAvL1xuICAgICAgICBjb25zdCBsYWJlbENvbXAgPSBjb21wYXJhdG9yKGdldFRhZyhsZWZ0KSwgZ2V0VGFnKHJpZ2h0KSk7XG4gICAgICAgIGlmIChsYWJlbENvbXAgIT09IDApIHtcbiAgICAgICAgICByZXR1cm4gbGFiZWxDb21wO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb21wYXJhdG9yKGxlZnQucGF5bG9hZCwgcmlnaHQucGF5bG9hZCk7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IEZhaWxgVW5yZWNvZ25pemVkIHBhc3NTdHlsZTogJHtxKGxlZnRTdHlsZSl9YDtcbiAgICAgIH1cbiAgICB9XG4gICAgLyogICAgICAgICAgICAgICAqL1xuICB9O1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG91dGVyQ29tcGFyYXRvciA9ICh4LCB5KSA9PlxuICAgIC8vXG4gICAgLy9cbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChjb21wYXJhdG9yKHgsIHkpIHx8IDApO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGFudGlDb21wYXJhdG9yID0gKHgsIHkpID0+IG91dGVyQ29tcGFyYXRvcih5LCB4KTtcblxuICBtZW1vT2ZTb3J0ZWQuc2V0KG91dGVyQ29tcGFyYXRvciwgbmV3IFdlYWtTZXQoKSk7XG4gIG1lbW9PZlNvcnRlZC5zZXQoYW50aUNvbXBhcmF0b3IsIG5ldyBXZWFrU2V0KCkpO1xuICBjb21wYXJhdG9yTWlycm9ySW1hZ2VzLnNldChvdXRlckNvbXBhcmF0b3IsIGFudGlDb21wYXJhdG9yKTtcbiAgY29tcGFyYXRvck1pcnJvckltYWdlcy5zZXQoYW50aUNvbXBhcmF0b3IsIG91dGVyQ29tcGFyYXRvcik7XG5cbiAgcmV0dXJuIGhhcmRlbih7IGNvbXBhcmF0b3I6IG91dGVyQ29tcGFyYXRvciwgYW50aUNvbXBhcmF0b3IgfSk7XG59O1xuLypcblxuXG4gKi8kaM2PX29uY2UubWFrZUNvbXBhcmF0b3JLaXQobWFrZUNvbXBhcmF0b3JLaXQpO1xuICAgICAgIGNvbnN0IGNvbXBhcmF0b3JNaXJyb3JJbWFnZSA9IGNvbXBhcmF0b3IgPT5cbiAgY29tcGFyYXRvck1pcnJvckltYWdlcy5nZXQoY29tcGFyYXRvcik7XG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UuY29tcGFyYXRvck1pcnJvckltYWdlKGNvbXBhcmF0b3JNaXJyb3JJbWFnZSk7XG4gICAgICAgY29uc3QgaXNSYW5rU29ydGVkID0gKHBhc3NhYmxlcywgY29tcGFyZSkgPT4ge1xuICBjb25zdCBzdWJNZW1vT2ZTb3J0ZWQgPSBtZW1vT2ZTb3J0ZWQuZ2V0KGNvbXBhcmUpO1xuICBhc3NlcnQoc3ViTWVtb09mU29ydGVkICE9PSB1bmRlZmluZWQpO1xuICBpZiAoc3ViTWVtb09mU29ydGVkLmhhcyhwYXNzYWJsZXMpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgYXNzZXJ0KHBhc3NTdHlsZU9mKHBhc3NhYmxlcykgPT09ICdjb3B5QXJyYXknKTtcbiAgZm9yIChsZXQgaSA9IDE7IGkgPCBwYXNzYWJsZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBpZiAoY29tcGFyZShwYXNzYWJsZXNbaSAtIDFdLCBwYXNzYWJsZXNbaV0pID49IDEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgc3ViTWVtb09mU29ydGVkLmFkZChwYXNzYWJsZXMpO1xuICByZXR1cm4gdHJ1ZTtcbn07JGjNj19vbmNlLmlzUmFua1NvcnRlZChpc1JhbmtTb3J0ZWQpO1xuaGFyZGVuKGlzUmFua1NvcnRlZCk7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0UmFua1NvcnRlZCA9IChzb3J0ZWQsIGNvbXBhcmUpID0+XG4gIGlzUmFua1NvcnRlZChzb3J0ZWQsIGNvbXBhcmUpIHx8XG4gIC8vXG4gIC8vXG4gIEZhaWxgTXVzdCBiZSByYW5rIHNvcnRlZDogJHtzb3J0ZWR9IHZzICR7c29ydEJ5UmFuayhzb3J0ZWQsIGNvbXBhcmUpfWA7JGjNj19vbmNlLmFzc2VydFJhbmtTb3J0ZWQoYXNzZXJ0UmFua1NvcnRlZCk7XG5oYXJkZW4oYXNzZXJ0UmFua1NvcnRlZCk7XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHNvcnRCeVJhbmsgPSAocGFzc2FibGVzLCBjb21wYXJlKSA9PiB7XG4gIGlmIChBcnJheS5pc0FycmF5KHBhc3NhYmxlcykpIHtcbiAgICBoYXJkZW4ocGFzc2FibGVzKTtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBpZiAoaXNSYW5rU29ydGVkKHBhc3NhYmxlcywgY29tcGFyZSkpIHtcbiAgICAgIHJldHVybiBwYXNzYWJsZXM7XG4gICAgfVxuICB9XG4gIGNvbnN0IHVuc29ydGVkID0gWy4uLnBhc3NhYmxlc107XG4gIHVuc29ydGVkLmZvckVhY2goaGFyZGVuKTtcbiAgY29uc3Qgc29ydGVkID0gdW5zb3J0ZWQuc29ydChjb21wYXJlKTtcbiAgLy9cbiAgLy9cbiAgLy9cbiAgaWYgKGNvbXBhcmUodHJ1ZSwgdW5kZWZpbmVkKSA+IDApIHtcbiAgICBsZXQgaSA9IHNvcnRlZC5sZW5ndGggLSAxO1xuICAgIHdoaWxlIChpID49IDAgJiYgc29ydGVkW2ldID09PSB1bmRlZmluZWQpIGkgLT0gMTtcbiAgICBjb25zdCBuID0gc29ydGVkLmxlbmd0aCAtIGkgLSAxO1xuICAgIGlmIChuID4gMCAmJiBuIDwgc29ydGVkLmxlbmd0aCkge1xuICAgICAgc29ydGVkLmNvcHlXaXRoaW4obiwgMCk7XG4gICAgICBzb3J0ZWQuZmlsbCgvKiAgICAgICAgICAgICovICh1bmRlZmluZWQpLCAwLCBuKTtcbiAgICB9XG4gIH1cbiAgaGFyZGVuKHNvcnRlZCk7XG4gIGNvbnN0IHN1Yk1lbW9PZlNvcnRlZCA9IG1lbW9PZlNvcnRlZC5nZXQoY29tcGFyZSk7XG4gIGFzc2VydChzdWJNZW1vT2ZTb3J0ZWQgIT09IHVuZGVmaW5lZCk7XG4gIHN1Yk1lbW9PZlNvcnRlZC5hZGQoc29ydGVkKTtcbiAgcmV0dXJuIHNvcnRlZDtcbn07JGjNj19vbmNlLnNvcnRCeVJhbmsoc29ydEJ5UmFuayk7XG5oYXJkZW4oc29ydEJ5UmFuayk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCByYW5rU2VhcmNoID0gKHNvcnRlZCwgY29tcGFyZSwga2V5LCBiaWFzID0gJ2xlZnRNb3N0JykgPT4ge1xuICBhc3NlcnRSYW5rU29ydGVkKHNvcnRlZCwgY29tcGFyZSk7XG4gIGxldCBsZWZ0ID0gMDtcbiAgbGV0IHJpZ2h0ID0gc29ydGVkLmxlbmd0aDtcbiAgd2hpbGUgKGxlZnQgPCByaWdodCkge1xuICAgIGNvbnN0IG0gPSBNYXRoLmZsb29yKChsZWZ0ICsgcmlnaHQpIC8gMik7XG4gICAgY29uc3QgY29tcCA9IGNvbXBhcmUoc29ydGVkW21dLCBrZXkpO1xuICAgIGlmIChjb21wIDw9IC0xIHx8IChjb21wID09PSAwICYmIGJpYXMgPT09ICdyaWdodE1vc3QnKSkge1xuICAgICAgbGVmdCA9IG0gKyAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQoY29tcCA+PSAxIHx8IChjb21wID09PSAwICYmIGJpYXMgPT09ICdsZWZ0TW9zdCcpKTtcbiAgICAgIHJpZ2h0ID0gbTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJpYXMgPT09ICdsZWZ0TW9zdCcgPyBsZWZ0IDogcmlnaHQgLSAxO1xufTtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0SW5kZXhDb3ZlciA9IChzb3J0ZWQsIGNvbXBhcmUsIFtsZWZ0S2V5LCByaWdodEtleV0pID0+IHtcbiAgYXNzZXJ0UmFua1NvcnRlZChzb3J0ZWQsIGNvbXBhcmUpO1xuICBjb25zdCBsZWZ0SW5kZXggPSByYW5rU2VhcmNoKHNvcnRlZCwgY29tcGFyZSwgbGVmdEtleSwgJ2xlZnRNb3N0Jyk7XG4gIGNvbnN0IHJpZ2h0SW5kZXggPSByYW5rU2VhcmNoKHNvcnRlZCwgY29tcGFyZSwgcmlnaHRLZXksICdyaWdodE1vc3QnKTtcbiAgcmV0dXJuIFtsZWZ0SW5kZXgsIHJpZ2h0SW5kZXhdO1xufTskaM2PX29uY2UuZ2V0SW5kZXhDb3ZlcihnZXRJbmRleENvdmVyKTtcbmhhcmRlbihnZXRJbmRleENvdmVyKTtcblxuLyogICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgRnVsbFJhbmtDb3ZlciA9IGhhcmRlbihbJycsICd7J10pO1xuXG4vKlxuXG5cblxuICovJGjNj19vbmNlLkZ1bGxSYW5rQ292ZXIoRnVsbFJhbmtDb3Zlcik7XG4gICAgICAgY29uc3QgY292ZXJlZEVudHJpZXMgPSAoc29ydGVkLCBbbGVmdEluZGV4LCByaWdodEluZGV4XSkgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGl0ZXJhYmxlID0gaGFyZGVuKHtcbiAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgbGV0IGkgPSBsZWZ0SW5kZXg7XG4gICAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGlmIChpIDw9IHJpZ2h0SW5kZXgpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBzb3J0ZWRbaV07XG4gICAgICAgICAgICBpICs9IDE7XG4gICAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgdmFsdWU6IFtpLCBlbGVtZW50XSwgZG9uZTogZmFsc2UgfSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBoYXJkZW4oeyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pO1xuICByZXR1cm4gaXRlcmFibGU7XG59OyRozY9fb25jZS5jb3ZlcmVkRW50cmllcyhjb3ZlcmVkRW50cmllcyk7XG5oYXJkZW4oY292ZXJlZEVudHJpZXMpO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWF4UmFuayA9IChjb21wYXJlLCBhLCBiKSA9PiAoY29tcGFyZShhLCBiKSA+PSAwID8gYSA6IGIpO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWluUmFuayA9IChjb21wYXJlLCBhLCBiKSA9PiAoY29tcGFyZShhLCBiKSA8PSAwID8gYSA6IGIpO1xuXG4vKlxuXG5cblxuICovXG4gICAgICAgY29uc3QgdW5pb25SYW5rQ292ZXJzID0gKGNvbXBhcmUsIGNvdmVycykgPT4ge1xuICAvKlxuXG5cblxuICAgKi9cbiAgY29uc3QgdW5pb25SYW5rQ292ZXJQYWlyID0gKFtsZWZ0QSwgcmlnaHRBXSwgW2xlZnRCLCByaWdodEJdKSA9PiBbXG4gICAgbWluUmFuayhjb21wYXJlLCBsZWZ0QSwgbGVmdEIpLFxuICAgIG1heFJhbmsoY29tcGFyZSwgcmlnaHRBLCByaWdodEIpLFxuICBdO1xuICByZXR1cm4gY292ZXJzLnJlZHVjZSh1bmlvblJhbmtDb3ZlclBhaXIsIFsneycsICcnXSk7XG59OyRozY9fb25jZS51bmlvblJhbmtDb3ZlcnModW5pb25SYW5rQ292ZXJzKTtcbmhhcmRlbih1bmlvblJhbmtDb3ZlcnMpO1xuXG4vKlxuXG5cblxuICovXG4gICAgICAgY29uc3QgaW50ZXJzZWN0UmFua0NvdmVycyA9IChjb21wYXJlLCBjb3ZlcnMpID0+IHtcbiAgLypcblxuXG5cbiAgICovXG4gIGNvbnN0IGludGVyc2VjdFJhbmtDb3ZlclBhaXIgPSAoW2xlZnRBLCByaWdodEFdLCBbbGVmdEIsIHJpZ2h0Ql0pID0+IFtcbiAgICBtYXhSYW5rKGNvbXBhcmUsIGxlZnRBLCBsZWZ0QiksXG4gICAgbWluUmFuayhjb21wYXJlLCByaWdodEEsIHJpZ2h0QiksXG4gIF07XG4gIHJldHVybiBjb3ZlcnMucmVkdWNlKGludGVyc2VjdFJhbmtDb3ZlclBhaXIsIFsnJywgJ3snXSk7XG59OyRozY9fb25jZS5pbnRlcnNlY3RSYW5rQ292ZXJzKGludGVyc2VjdFJhbmtDb3ZlcnMpO1xuXG4gICAgICAgY29uc3QgeyBjb21wYXJhdG9yOiBjb21wYXJlUmFuaywgYW50aUNvbXBhcmF0b3I6IGNvbXBhcmVBbnRpUmFuayB9ID1cbiAgbWFrZUNvbXBhcmF0b3JLaXQoKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5jb21wYXJlUmFuayhjb21wYXJlUmFuayk7JGjNj19vbmNlLmNvbXBhcmVBbnRpUmFuayhjb21wYXJlQW50aVJhbmspO1xuICAgICAgIGNvbnN0IG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gKGxvbmdMaXZlZCA9IGZhbHNlKSA9PiB7XG4gIGxldCBudW1TZWVuID0gMDtcbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgTWFwQ29uc3RydWN0b3IgPSBsb25nTGl2ZWQgPyBXZWFrTWFwIDogTWFwO1xuICBjb25zdCBzZWVuID0gbmV3IE1hcENvbnN0cnVjdG9yKCk7XG4gIGNvbnN0IHRhZyA9IHIgPT4ge1xuICAgIGlmIChzZWVuLmhhcyhyKSkge1xuICAgICAgcmV0dXJuIHNlZW4uZ2V0KHIpO1xuICAgIH1cbiAgICBudW1TZWVuICs9IDE7XG4gICAgc2Vlbi5zZXQociwgbnVtU2Vlbik7XG4gICAgcmV0dXJuIG51bVNlZW47XG4gIH07XG4gIGNvbnN0IGNvbXBhcmVSZW1vdGFibGVzID0gKHgsIHkpID0+IGNvbXBhcmVSYW5rKHRhZyh4KSwgdGFnKHkpKTtcbiAgcmV0dXJuIG1ha2VDb21wYXJhdG9yS2l0KGNvbXBhcmVSZW1vdGFibGVzKTtcbn07JGjNj19vbmNlLm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KTtcbmhhcmRlbihtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ0cml2aWFsQ29tcGFyYXRvciI6WyJ0cml2aWFsQ29tcGFyYXRvciJdLCJnZXRQYXNzU3R5bGVDb3ZlciI6WyJnZXRQYXNzU3R5bGVDb3ZlciJdLCJtYWtlQ29tcGFyYXRvcktpdCI6WyJtYWtlQ29tcGFyYXRvcktpdCJdLCJjb21wYXJhdG9yTWlycm9ySW1hZ2UiOlsiY29tcGFyYXRvck1pcnJvckltYWdlIl0sImlzUmFua1NvcnRlZCI6WyJpc1JhbmtTb3J0ZWQiXSwiYXNzZXJ0UmFua1NvcnRlZCI6WyJhc3NlcnRSYW5rU29ydGVkIl0sInNvcnRCeVJhbmsiOlsic29ydEJ5UmFuayJdLCJnZXRJbmRleENvdmVyIjpbImdldEluZGV4Q292ZXIiXSwiRnVsbFJhbmtDb3ZlciI6WyJGdWxsUmFua0NvdmVyIl0sImNvdmVyZWRFbnRyaWVzIjpbImNvdmVyZWRFbnRyaWVzIl0sInVuaW9uUmFua0NvdmVycyI6WyJ1bmlvblJhbmtDb3ZlcnMiXSwiaW50ZXJzZWN0UmFua0NvdmVycyI6WyJpbnRlcnNlY3RSYW5rQ292ZXJzIl0sImNvbXBhcmVSYW5rIjpbImNvbXBhcmVSYW5rIl0sImNvbXBhcmVBbnRpUmFuayI6WyJjb21wYXJlQW50aVJhbmsiXSwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiOlsibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAIQAAAEBlbmRvL21hcnNoYWwtdjEuNi40L3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABenLPKzAUAAMwFAAAdAAAAQGVuZG8vbmF0LXY1LjEuMC9zcmMvaW5kZXguanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIk5hdCIsImlzTmF0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShpc05hdCwnbmFtZScse3ZhbHVlOlwiaXNOYXRcIn0pOyRozY9fb25jZS5pc05hdChpc05hdCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KE5hdCwnbmFtZScse3ZhbHVlOlwiTmF0XCJ9KTskaM2PX29uY2UuTmF0KE5hdCk7Ly9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbi8vXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmZ1bmN0aW9uIGlzTmF0KGFsbGVnZWROdW0pIHtcbiAgaWYgKHR5cGVvZiBhbGxlZ2VkTnVtID09PSAnYmlnaW50Jykge1xuICAgIHJldHVybiBhbGxlZ2VkTnVtID49IDA7XG4gIH1cbiAgaWYgKHR5cGVvZiBhbGxlZ2VkTnVtICE9PSAnbnVtYmVyJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiBOdW1iZXIuaXNTYWZlSW50ZWdlcihhbGxlZ2VkTnVtKSAmJiBhbGxlZ2VkTnVtID49IDA7XG59XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5mdW5jdGlvbiBOYXQoYWxsZWdlZE51bSkge1xuICBpZiAodHlwZW9mIGFsbGVnZWROdW0gPT09ICdiaWdpbnQnKSB7XG4gICAgaWYgKGFsbGVnZWROdW0gPCAwbikge1xuICAgICAgdGhyb3cgUmFuZ2VFcnJvcihgJHthbGxlZ2VkTnVtfSBpcyBuZWdhdGl2ZWApO1xuICAgIH1cbiAgICByZXR1cm4gYWxsZWdlZE51bTtcbiAgfVxuXG4gIGlmICh0eXBlb2YgYWxsZWdlZE51bSA9PT0gJ251bWJlcicpIHtcbiAgICBpZiAoIU51bWJlci5pc1NhZmVJbnRlZ2VyKGFsbGVnZWROdW0pKSB7XG4gICAgICB0aHJvdyBSYW5nZUVycm9yKGAke2FsbGVnZWROdW19IGlzIG5vdCBhIHNhZmUgaW50ZWdlcmApO1xuICAgIH1cbiAgICBpZiAoYWxsZWdlZE51bSA8IDApIHtcbiAgICAgIHRocm93IFJhbmdlRXJyb3IoYCR7YWxsZWdlZE51bX0gaXMgbmVnYXRpdmVgKTtcbiAgICB9XG4gICAgcmV0dXJuIEJpZ0ludChhbGxlZ2VkTnVtKTtcbiAgfVxuXG4gIHRocm93IFR5cGVFcnJvcihcbiAgICBgJHthbGxlZ2VkTnVtfSBpcyBhICR7dHlwZW9mIGFsbGVnZWROdW19IGJ1dCBtdXN0IGJlIGEgYmlnaW50IG9yIGEgbnVtYmVyYCxcbiAgKTtcbn1cbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzTmF0IjpbImlzTmF0Il0sIk5hdCI6WyJOYXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAAvR2ak0KAABNCgAAIAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2l0ZXItaGVscGVycy5qcyIsIi4vc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9zcmMvZXJyb3IuanMiLCIuL3NyYy9yZW1vdGFibGUuanMiLCIuL3NyYy9zeW1ib2wuanMiLCIuL3NyYy9zdHJpbmcuanMiLCIuL3NyYy9wYXNzU3R5bGVPZi5qcyIsIi4vc3JjL21ha2VUYWdnZWQuanMiLCIuL3NyYy9tYWtlLWZhci5qcyIsIi4vc3JjL3R5cGVHdWFyZHMuanMiLCIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJleHBvcnRzIjpbIkZhciIsIkZhciIsImFzc2VydENvcHlBcnJheSIsImFzc2VydENvcHlBcnJheSIsImFzc2VydFdlbGxGb3JtZWRTdHJpbmciLCJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIiwiZmlsdGVySXRlcmFibGUiLCJmaWx0ZXJJdGVyYWJsZSIsImlzRXJyb3JMaWtlIiwiaXNFcnJvckxpa2UiLCJpc09iamVjdCIsImlzT2JqZWN0IiwiaXNQYXNzYWJsZSIsImlzUGFzc2FibGUiLCJpc1Bhc3NhYmxlU3ltYm9sIiwiaXNQYXNzYWJsZVN5bWJvbCIsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbIi4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2l0ZXItaGVscGVycy5qc1wiLCBbXV0sW1wiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW11dLFtcIi4vc3JjL2Vycm9yLmpzXCIsIFtdXSxbXCIuL3NyYy9yZW1vdGFibGUuanNcIiwgW11dLFtcIi4vc3JjL3N5bWJvbC5qc1wiLCBbXV0sW1wiLi9zcmMvc3RyaW5nLmpzXCIsIFtdXSxbXCIuL3NyYy9wYXNzU3R5bGVPZi5qc1wiLCBbXV0sW1wiLi9zcmMvbWFrZVRhZ2dlZC5qc1wiLCBbXV0sW1wiLi9zcmMvbWFrZS1mYXIuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVHdWFyZHMuanNcIiwgW11dLFtcIi4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9pdGVyLWhlbHBlcnMuanMiOltbIm1hcEl0ZXJhYmxlIiwibWFwSXRlcmFibGUiXSxbImZpbHRlckl0ZXJhYmxlIiwiZmlsdGVySXRlcmFibGUiXV0sIi4vc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIjpbWyJQQVNTX1NUWUxFIiwiUEFTU19TVFlMRSJdLFsiaXNPYmplY3QiLCJpc09iamVjdCJdLFsiYXNzZXJ0Q2hlY2tlciIsImFzc2VydENoZWNrZXIiXSxbImdldFRhZyIsImdldFRhZyJdLFsiaGFzT3duUHJvcGVydHlPZiIsImhhc093blByb3BlcnR5T2YiXV0sIi4vc3JjL2Vycm9yLmpzIjpbWyJnZXRFcnJvckNvbnN0cnVjdG9yIiwiZ2V0RXJyb3JDb25zdHJ1Y3RvciJdLFsiaXNFcnJvckxpa2UiLCJpc0Vycm9yTGlrZSJdXSwiLi9zcmMvcmVtb3RhYmxlLmpzIjpbWyJnZXRJbnRlcmZhY2VPZiIsImdldEludGVyZmFjZU9mIl1dLCIuL3NyYy9zeW1ib2wuanMiOltbImFzc2VydFBhc3NhYmxlU3ltYm9sIiwiYXNzZXJ0UGFzc2FibGVTeW1ib2wiXSxbImlzUGFzc2FibGVTeW1ib2wiLCJpc1Bhc3NhYmxlU3ltYm9sIl0sWyJuYW1lRm9yUGFzc2FibGVTeW1ib2wiLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiXSxbInBhc3NhYmxlU3ltYm9sRm9yTmFtZSIsInBhc3NhYmxlU3ltYm9sRm9yTmFtZSJdXSwiLi9zcmMvc3RyaW5nLmpzIjpbWyJpc1dlbGxGb3JtZWRTdHJpbmciLCJpc1dlbGxGb3JtZWRTdHJpbmciXSxbImFzc2VydFdlbGxGb3JtZWRTdHJpbmciLCJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIl0sWyJhc3NlcnRQYXNzYWJsZVN0cmluZyIsImFzc2VydFBhc3NhYmxlU3RyaW5nIl1dLCIuL3NyYy9wYXNzU3R5bGVPZi5qcyI6W1sicGFzc1N0eWxlT2YiLCJwYXNzU3R5bGVPZiJdLFsiaXNQYXNzYWJsZSIsImlzUGFzc2FibGUiXSxbImFzc2VydFBhc3NhYmxlIiwiYXNzZXJ0UGFzc2FibGUiXSxbInRvUGFzc2FibGVFcnJvciIsInRvUGFzc2FibGVFcnJvciJdLFsidG9UaHJvd2FibGUiLCJ0b1Rocm93YWJsZSJdXSwiLi9zcmMvbWFrZVRhZ2dlZC5qcyI6W1sibWFrZVRhZ2dlZCIsIm1ha2VUYWdnZWQiXV0sIi4vc3JjL21ha2UtZmFyLmpzIjpbWyJSZW1vdGFibGUiLCJSZW1vdGFibGUiXSxbIkZhciIsIkZhciJdLFsiVG9GYXJGdW5jdGlvbiIsIlRvRmFyRnVuY3Rpb24iXSxbIkdFVF9NRVRIT0RfTkFNRVMiLCJHRVRfTUVUSE9EX05BTUVTIl1dLCIuL3NyYy90eXBlR3VhcmRzLmpzIjpbWyJhc3NlcnRSZWNvcmQiLCJhc3NlcnRSZWNvcmQiXSxbImFzc2VydENvcHlBcnJheSIsImFzc2VydENvcHlBcnJheSJdLFsiYXNzZXJ0UmVtb3RhYmxlIiwiYXNzZXJ0UmVtb3RhYmxlIl0sWyJpc1JlbW90YWJsZSIsImlzUmVtb3RhYmxlIl0sWyJpc1JlY29yZCIsImlzUmVjb3JkIl0sWyJpc0NvcHlBcnJheSIsImlzQ29weUFycmF5Il1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADD7/ZFvAYAALwGAAAoAAAAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL2NvcHlBcnJheS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiQ29weUFycmF5SGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgWCxhc3NlcnRDaGVja2VyLGdldE93bkRhdGFEZXNjcmlwdG9yOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcImdldE93bkRhdGFEZXNjcmlwdG9yXCIsWyRozY9fYSA9PiAoZ2V0T3duRGF0YURlc2NyaXB0b3IgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5jb25zdCB7IGdldFByb3RvdHlwZU9mIH0gPSBPYmplY3Q7XG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGlzQXJyYXksIHByb3RvdHlwZTogYXJyYXlQcm90b3R5cGUgfSA9IEFycmF5O1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IENvcHlBcnJheUhlbHBlciA9IGhhcmRlbih7XG4gIHN0eWxlTmFtZTogJ2NvcHlBcnJheScsXG5cbiAgY2FuQmVWYWxpZDogKGNhbmRpZGF0ZSwgY2hlY2sgPSB1bmRlZmluZWQpID0+XG4gICAgaXNBcnJheShjYW5kaWRhdGUpIHx8XG4gICAgKCEhY2hlY2sgJiYgY2hlY2soZmFsc2UsIFhgQXJyYXkgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApKSxcblxuICBhc3NlcnRSZXN0VmFsaWQ6IChjYW5kaWRhdGUsIHBhc3NTdHlsZU9mUmVjdXIpID0+IHtcbiAgICBnZXRQcm90b3R5cGVPZihjYW5kaWRhdGUpID09PSBhcnJheVByb3RvdHlwZSB8fFxuICAgICAgYXNzZXJ0LmZhaWwoWGBNYWxmb3JtZWQgYXJyYXk6ICR7Y2FuZGlkYXRlfWAsIFR5cGVFcnJvcik7XG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IGxlbiA9IC8qICAgICAgICAgICAgICAgICAqLyAoXG4gICAgICBnZXRPd25EYXRhRGVzY3JpcHRvcihjYW5kaWRhdGUsICdsZW5ndGgnLCBmYWxzZSwgYXNzZXJ0Q2hlY2tlcikudmFsdWVcbiAgICApO1xuICAgIC8vXG4gICAgLy9cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICBwYXNzU3R5bGVPZlJlY3VyKFxuICAgICAgICBnZXRPd25EYXRhRGVzY3JpcHRvcihjYW5kaWRhdGUsIGksIHRydWUsIGFzc2VydENoZWNrZXIpLnZhbHVlLFxuICAgICAgKTtcbiAgICB9XG4gICAgLy9cbiAgICBvd25LZXlzKGNhbmRpZGF0ZSkubGVuZ3RoID09PSBsZW4gKyAxIHx8XG4gICAgICBhc3NlcnQuZmFpbChYYEFycmF5cyBtdXN0IG5vdCBoYXZlIG5vbi1pbmRleGVzOiAke2NhbmRpZGF0ZX1gLCBUeXBlRXJyb3IpO1xuICB9LFxufSk7JGjNj19vbmNlLkNvcHlBcnJheUhlbHBlcihDb3B5QXJyYXlIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ29weUFycmF5SGVscGVyIjpbIkNvcHlBcnJheUhlbHBlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAQgUTA9ggAAPYIAAApAAAAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL2NvcHlSZWNvcmQuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIkNvcHlSZWNvcmRIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnRDaGVja2VyLGNhbkJlTWV0aG9kLGdldE93bkRhdGFEZXNjcmlwdG9yLENYOyRozY9faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiY2FuQmVNZXRob2RcIixbJGjNj19hID0+IChjYW5CZU1ldGhvZCA9ICRozY9fYSldXSxbXCJnZXRPd25EYXRhRGVzY3JpcHRvclwiLFskaM2PX2EgPT4gKGdldE93bkRhdGFEZXNjcmlwdG9yID0gJGjNj19hKV1dLFtcIkNYXCIsWyRozY9fYSA9PiAoQ1ggPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGdldFByb3RvdHlwZU9mLCBwcm90b3R5cGU6IG9iamVjdFByb3RvdHlwZSB9ID0gT2JqZWN0O1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgY2hlY2tPYmplY3RQcm90b3R5cGUgPSAoY2FuZGlkYXRlLCBjaGVjayA9IHVuZGVmaW5lZCkgPT4ge1xuICByZXR1cm4gKFxuICAgIGdldFByb3RvdHlwZU9mKGNhbmRpZGF0ZSkgPT09IG9iamVjdFByb3RvdHlwZSB8fFxuICAgICghIWNoZWNrICYmXG4gICAgICBDWChjaGVjaylgUmVjb3JkcyBtdXN0IGluaGVyaXQgZnJvbSBPYmplY3QucHJvdG90eXBlOiAke2NhbmRpZGF0ZX1gKVxuICApO1xufTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBjaGVja1Byb3BlcnR5Q2FuQmVWYWxpZCA9IChjYW5kaWRhdGUsIGtleSwgdmFsdWUsIGNoZWNrID0gdW5kZWZpbmVkKSA9PiB7XG4gIHJldHVybiAoXG4gICAgKHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnIHx8XG4gICAgICAoISFjaGVjayAmJlxuICAgICAgICBDWChcbiAgICAgICAgICBjaGVjayxcbiAgICAgICAgKWBSZWNvcmRzIGNhbiBvbmx5IGhhdmUgc3RyaW5nLW5hbWVkIHByb3BlcnRpZXM6ICR7Y2FuZGlkYXRlfWApKSAmJlxuICAgICghY2FuQmVNZXRob2QodmFsdWUpIHx8XG4gICAgICAoISFjaGVjayAmJlxuICAgICAgICAvL1xuICAgICAgICBDWChcbiAgICAgICAgICBjaGVjayxcbiAgICAgICAgKWBSZWNvcmRzIGNhbm5vdCBjb250YWluIG5vbi1mYXIgZnVuY3Rpb25zIGJlY2F1c2UgdGhleSBtYXkgYmUgbWV0aG9kcyBvZiBhbiBpbXBsaWNpdCBSZW1vdGFibGU6ICR7Y2FuZGlkYXRlfWApKVxuICApO1xufTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBDb3B5UmVjb3JkSGVscGVyID0gaGFyZGVuKHtcbiAgc3R5bGVOYW1lOiAnY29weVJlY29yZCcsXG5cbiAgY2FuQmVWYWxpZDogKGNhbmRpZGF0ZSwgY2hlY2sgPSB1bmRlZmluZWQpID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgY2hlY2tPYmplY3RQcm90b3R5cGUoY2FuZGlkYXRlLCBjaGVjaykgJiZcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgb3duS2V5cyhjYW5kaWRhdGUpLmV2ZXJ5KGtleSA9PlxuICAgICAgICBjaGVja1Byb3BlcnR5Q2FuQmVWYWxpZChjYW5kaWRhdGUsIGtleSwgY2FuZGlkYXRlW2tleV0sIGNoZWNrKSxcbiAgICAgIClcbiAgICApO1xuICB9LFxuXG4gIGFzc2VydFJlc3RWYWxpZDogKGNhbmRpZGF0ZSwgcGFzc1N0eWxlT2ZSZWN1cikgPT4ge1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBvd25LZXlzKGNhbmRpZGF0ZSkpIHtcbiAgICAgIGNvbnN0IHsgdmFsdWUgfSA9IGdldE93bkRhdGFEZXNjcmlwdG9yKFxuICAgICAgICBjYW5kaWRhdGUsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIHRydWUsXG4gICAgICAgIGFzc2VydENoZWNrZXIsXG4gICAgICApO1xuICAgICAgcGFzc1N0eWxlT2ZSZWN1cih2YWx1ZSk7XG4gICAgfVxuICB9LFxufSk7JGjNj19vbmNlLkNvcHlSZWNvcmRIZWxwZXIoQ29weVJlY29yZEhlbHBlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJDb3B5UmVjb3JkSGVscGVyIjpbIkNvcHlSZWNvcmRIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAwjfJp54LAACeCwAALgAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9kZWVwbHlGdWxmaWxsZWQuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Byb21pc2Uta2l0IiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vcGFzc1N0eWxlT2YuanMiLCIuL21ha2VUYWdnZWQuanMiXSwiZXhwb3J0cyI6WyJkZWVwbHlGdWxmaWxsZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBYLHEsRSxpc1Byb21pc2UsZ2V0VGFnLGlzT2JqZWN0LHBhc3NTdHlsZU9mLG1ha2VUYWdnZWQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsWyRozY9fYSA9PiAoaXNQcm9taXNlID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiZ2V0VGFnXCIsWyRozY9fYSA9PiAoZ2V0VGFnID0gJGjNj19hKV1dLFtcImlzT2JqZWN0XCIsWyRozY9fYSA9PiAoaXNPYmplY3QgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dXV0sW1wiLi9tYWtlVGFnZ2VkLmpzXCIsIFtbXCJtYWtlVGFnZ2VkXCIsWyRozY9fYSA9PiAobWFrZVRhZ2dlZCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG4vKlxuXG4gKi9cblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBmcm9tRW50cmllcyB9ID0gT2JqZWN0O1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBkZWVwbHlGdWxmaWxsZWQgPSBhc3luYyB2YWwgPT4ge1xuICAvL1xuICAvL1xuICAvL1xuXG4gIGlmICghaXNPYmplY3QodmFsKSkge1xuICAgIHJldHVybiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovICh2YWwpO1xuICB9XG4gIGlmIChpc1Byb21pc2UodmFsKSkge1xuICAgIHJldHVybiBFLndoZW4odmFsLCBub25wID0+IGRlZXBseUZ1bGZpbGxlZChub25wKSk7XG4gIH1cbiAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YodmFsKTtcbiAgc3dpdGNoIChwYXNzU3R5bGUpIHtcbiAgICBjYXNlICdjb3B5UmVjb3JkJzoge1xuICAgICAgY29uc3QgcmVjID0gLyogICAgICAgICAgICAgICAgICAgICAqLyAodmFsKTtcbiAgICAgIGNvbnN0IG5hbWVzID0gLyogICAgICAgICAgICAgICAgICAgKi8gKG93bktleXMocmVjKSk7XG4gICAgICBjb25zdCB2YWxQcyA9IG5hbWVzLm1hcChuYW1lID0+IGRlZXBseUZ1bGZpbGxlZChyZWNbbmFtZV0pKTtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gRS53aGVuKFByb21pc2UuYWxsKHZhbFBzKSwgdmFscyA9PlxuICAgICAgICBoYXJkZW4oZnJvbUVudHJpZXModmFscy5tYXAoKGMsIGkpID0+IFtuYW1lc1tpXSwgY10pKSksXG4gICAgICApO1xuICAgIH1cbiAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICBjb25zdCBhcnIgPSAvKiAgICAgICAgICAgICAgICAgICAgKi8gKHZhbCk7XG4gICAgICBjb25zdCB2YWxQcyA9IGFyci5tYXAocCA9PiBkZWVwbHlGdWxmaWxsZWQocCkpO1xuICAgICAgLy9cbiAgICAgIHJldHVybiBFLndoZW4oUHJvbWlzZS5hbGwodmFsUHMpLCB2YWxzID0+IGhhcmRlbih2YWxzKSk7XG4gICAgfVxuICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgIGNvbnN0IHRnZCA9IC8qICAgICAgICAgICAgICAgICAgICAgKi8gKHZhbCk7XG4gICAgICBjb25zdCB0YWcgPSBnZXRUYWcodGdkKTtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gRS53aGVuKGRlZXBseUZ1bGZpbGxlZCh0Z2QucGF5bG9hZCksIHBheWxvYWQgPT5cbiAgICAgICAgbWFrZVRhZ2dlZCh0YWcsIHBheWxvYWQpLFxuICAgICAgKTtcbiAgICB9XG4gICAgY2FzZSAncmVtb3RhYmxlJzoge1xuICAgICAgY29uc3QgcmVtID0gLyogICAgICAgICAgICAgICAgICAgICAgICAgICovICh2YWwpO1xuICAgICAgLy9cbiAgICAgIHJldHVybiByZW07XG4gICAgfVxuICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgY29uc3QgZXJyID0gLyogICAgICAgICAgICAgICAgKi8gKHZhbCk7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIGVycjtcbiAgICB9XG4gICAgY2FzZSAncHJvbWlzZSc6IHtcbiAgICAgIGNvbnN0IHByb20gPSAvKiAgICAgICAgICAgICAgICAgICovICgvKiAgICAgICAgICAgICAgICAgICovICh2YWwpKTtcbiAgICAgIHJldHVybiBFLndoZW4ocHJvbSwgbm9ucCA9PiBkZWVwbHlGdWxmaWxsZWQobm9ucCkpO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICB0aHJvdyBhc3NlcnQuZmFpbChYYFVuZXhwZWN0ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfWAsIFR5cGVFcnJvcik7XG4gICAgfVxuICB9XG59OyRozY9fb25jZS5kZWVwbHlGdWxmaWxsZWQoZGVlcGx5RnVsZmlsbGVkKTtcbmhhcmRlbihkZWVwbHlGdWxmaWxsZWQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVlcGx5RnVsZmlsbGVkIjpbImRlZXBseUZ1bGZpbGxlZCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAXVwIi0xQAANMUAAAkAAAAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL2Vycm9yLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJFcnJvckhlbHBlciIsImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yIiwiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MiLCJnZXRFcnJvckNvbnN0cnVjdG9yIiwiaXNFcnJvckxpa2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBxLGFzc2VydENoZWNrZXIsQ1g7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiQ1hcIixbJGjNj19hID0+IChDWCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuY29uc3QgeyBnZXRQcm90b3R5cGVPZiwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycywgaGFzT3duLCBlbnRyaWVzIH0gPSBPYmplY3Q7XG5cbi8vXG4vL1xuY29uc3QgZXJyb3JDb25zdHJ1Y3RvcnMgPSBuZXcgTWFwKFxuICAvL1xuICAvL1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgKFtcbiAgICBbJ0Vycm9yJywgRXJyb3JdLFxuICAgIFsnRXZhbEVycm9yJywgRXZhbEVycm9yXSxcbiAgICBbJ1JhbmdlRXJyb3InLCBSYW5nZUVycm9yXSxcbiAgICBbJ1JlZmVyZW5jZUVycm9yJywgUmVmZXJlbmNlRXJyb3JdLFxuICAgIFsnU3ludGF4RXJyb3InLCBTeW50YXhFcnJvcl0sXG4gICAgWydUeXBlRXJyb3InLCBUeXBlRXJyb3JdLFxuICAgIFsnVVJJRXJyb3InLCBVUklFcnJvcl1cblxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gIF0pLFxuKTtcblxuaWYgKHR5cGVvZiBBZ2dyZWdhdGVFcnJvciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgLy9cbiAgZXJyb3JDb25zdHJ1Y3RvcnMuc2V0KCdBZ2dyZWdhdGVFcnJvcicsIEFnZ3JlZ2F0ZUVycm9yKTtcbn1cblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBnZXRFcnJvckNvbnN0cnVjdG9yID0gbmFtZSA9PiBlcnJvckNvbnN0cnVjdG9ycy5nZXQobmFtZSk7JGjNj19vbmNlLmdldEVycm9yQ29uc3RydWN0b3IoZ2V0RXJyb3JDb25zdHJ1Y3Rvcik7XG5oYXJkZW4oZ2V0RXJyb3JDb25zdHJ1Y3Rvcik7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGNoZWNrRXJyb3JMaWtlID0gKGNhbmRpZGF0ZSwgY2hlY2sgPSB1bmRlZmluZWQpID0+IHtcbiAgLy9cbiAgcmV0dXJuIChcbiAgICBjYW5kaWRhdGUgaW5zdGFuY2VvZiBFcnJvciB8fFxuICAgICghIWNoZWNrICYmIENYKGNoZWNrKWBFcnJvciBleHBlY3RlZDogJHtjYW5kaWRhdGV9YClcbiAgKTtcbn07XG5oYXJkZW4oY2hlY2tFcnJvckxpa2UpO1xuLy9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgaXNFcnJvckxpa2UgPSBjYW5kaWRhdGUgPT4gY2hlY2tFcnJvckxpa2UoY2FuZGlkYXRlKTskaM2PX29uY2UuaXNFcnJvckxpa2UoaXNFcnJvckxpa2UpO1xuaGFyZGVuKGlzRXJyb3JMaWtlKTtcblxuLypcblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyA9IChcbiAgcHJvcE5hbWUsXG4gIGRlc2MsXG4gIHBhc3NTdHlsZU9mUmVjdXIsXG4gIGNoZWNrID0gdW5kZWZpbmVkLFxuKSA9PiB7XG4gIGlmIChkZXNjLmVudW1lcmFibGUpIHtcbiAgICByZXR1cm4gKFxuICAgICAgISFjaGVjayAmJlxuICAgICAgQ1goY2hlY2spYFBhc3NhYmxlIEVycm9yICR7cShcbiAgICAgICAgcHJvcE5hbWUsXG4gICAgICApfSBvd24gcHJvcGVydHkgbXVzdCBub3QgYmUgZW51bWVyYWJsZTogJHtkZXNjfWBcbiAgICApO1xuICB9XG4gIGlmICghaGFzT3duKGRlc2MsICd2YWx1ZScpKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhY2hlY2sgJiZcbiAgICAgIENYKGNoZWNrKWBQYXNzYWJsZSBFcnJvciAke3EoXG4gICAgICAgIHByb3BOYW1lLFxuICAgICAgKX0gb3duIHByb3BlcnR5IG11c3QgYmUgYSBkYXRhIHByb3BlcnR5OiAke2Rlc2N9YFxuICAgICk7XG4gIH1cbiAgY29uc3QgeyB2YWx1ZSB9ID0gZGVzYztcbiAgc3dpdGNoIChwcm9wTmFtZSkge1xuICAgIGNhc2UgJ21lc3NhZ2UnOlxuICAgIGNhc2UgJ3N0YWNrJzoge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgIENYKGNoZWNrKWBQYXNzYWJsZSBFcnJvciAke3EoXG4gICAgICAgICAgICBwcm9wTmFtZSxcbiAgICAgICAgICApfSBvd24gcHJvcGVydHkgbXVzdCBiZSBhIHN0cmluZzogJHt2YWx1ZX1gKVxuICAgICAgKTtcbiAgICB9XG4gICAgY2FzZSAnY2F1c2UnOiB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yKHZhbHVlLCBwYXNzU3R5bGVPZlJlY3VyLCBjaGVjayk7XG4gICAgfVxuICAgIGNhc2UgJ2Vycm9ycyc6IHtcbiAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkgfHwgcGFzc1N0eWxlT2ZSZWN1cih2YWx1ZSkgIT09ICdjb3B5QXJyYXknKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgISFjaGVjayAmJlxuICAgICAgICAgIENYKGNoZWNrKWBQYXNzYWJsZSBFcnJvciAke3EoXG4gICAgICAgICAgICBwcm9wTmFtZSxcbiAgICAgICAgICApfSBvd24gcHJvcGVydHkgbXVzdCBiZSBhIGNvcHlBcnJheTogJHt2YWx1ZX1gXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gdmFsdWUuZXZlcnkoZXJyID0+XG4gICAgICAgIC8vXG4gICAgICAgIGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yKGVyciwgcGFzc1N0eWxlT2ZSZWN1ciwgY2hlY2spLFxuICAgICAgKTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG4gIHJldHVybiAoXG4gICAgISFjaGVjayAmJlxuICAgIENYKGNoZWNrKWBQYXNzYWJsZSBFcnJvciBoYXMgZXh0cmEgdW5wYXNzZWQgcHJvcGVydHkgJHtxKHByb3BOYW1lKX1gXG4gICk7XG59OyRozY9fb25jZS5jaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyhjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyk7XG5oYXJkZW4oY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MpO1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvciA9IChcbiAgY2FuZGlkYXRlLFxuICBwYXNzU3R5bGVPZlJlY3VyLFxuICBjaGVjayA9IHVuZGVmaW5lZCxcbikgPT4ge1xuICBpZiAoIWNoZWNrRXJyb3JMaWtlKGNhbmRpZGF0ZSwgY2hlY2spKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHByb3RvID0gZ2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKTtcbiAgY29uc3QgeyBuYW1lIH0gPSBwcm90bztcbiAgY29uc3QgZXJyQ29uc3RydWN0b3IgPSBnZXRFcnJvckNvbnN0cnVjdG9yKG5hbWUpO1xuICBpZiAoZXJyQ29uc3RydWN0b3IgPT09IHVuZGVmaW5lZCB8fCBlcnJDb25zdHJ1Y3Rvci5wcm90b3R5cGUgIT09IHByb3RvKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhY2hlY2sgJiZcbiAgICAgIENYKFxuICAgICAgICBjaGVjayxcbiAgICAgIClgUGFzc2FibGUgRXJyb3IgbXVzdCBpbmhlcml0IGZyb20gYW4gZXJyb3IgY2xhc3MgLnByb3RvdHlwZTogJHtjYW5kaWRhdGV9YFxuICAgICk7XG4gIH1cbiAgY29uc3QgZGVzY3MgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGNhbmRpZGF0ZSk7XG4gIGlmICghKCdtZXNzYWdlJyBpbiBkZXNjcykpIHtcbiAgICByZXR1cm4gKFxuICAgICAgISFjaGVjayAmJlxuICAgICAgQ1goXG4gICAgICAgIGNoZWNrLFxuICAgICAgKWBQYXNzYWJsZSBFcnJvciBtdXN0IGhhdmUgYW4gb3duIFwibWVzc2FnZVwiIHN0cmluZyBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gZW50cmllcyhkZXNjcykuZXZlcnkoKFtwcm9wTmFtZSwgZGVzY10pID0+XG4gICAgY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MoXG4gICAgICBwcm9wTmFtZSxcbiAgICAgIGRlc2MsXG4gICAgICBwYXNzU3R5bGVPZlJlY3VyLFxuICAgICAgY2hlY2ssXG4gICAgKSxcbiAgKTtcbn07JGjNj19vbmNlLmNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yKGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yKTtcbmhhcmRlbihjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcik7XG5cbi8qXG5cbiAqL1xuICAgICAgIGNvbnN0IEVycm9ySGVscGVyID0gaGFyZGVuKHtcbiAgc3R5bGVOYW1lOiAnZXJyb3InLFxuXG4gIGNhbkJlVmFsaWQ6IGNoZWNrRXJyb3JMaWtlLFxuXG4gIGFzc2VydFJlc3RWYWxpZDogKGNhbmRpZGF0ZSwgcGFzc1N0eWxlT2ZSZWN1cikgPT5cbiAgICBjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcihjYW5kaWRhdGUsIHBhc3NTdHlsZU9mUmVjdXIsIGFzc2VydENoZWNrZXIpLFxufSk7JGjNj19vbmNlLkVycm9ySGVscGVyKEVycm9ySGVscGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdldEVycm9yQ29uc3RydWN0b3IiOlsiZ2V0RXJyb3JDb25zdHJ1Y3RvciJdLCJpc0Vycm9yTGlrZSI6WyJpc0Vycm9yTGlrZSJdLCJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyI6WyJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyJdLCJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvciI6WyJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvciJdLCJFcnJvckhlbHBlciI6WyJFcnJvckhlbHBlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADTopB8pAYAAKQGAAArAAAAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL2l0ZXItaGVscGVycy5qc3siaW1wb3J0cyI6WyIuL21ha2UtZmFyLmpzIl0sImV4cG9ydHMiOlsiZmlsdGVySXRlcmFibGUiLCJtYXBJdGVyYWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhcjskaM2PX2ltcG9ydHMoW1tcIi4vbWFrZS1mYXIuanNcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dXSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYXBJdGVyYWJsZSA9IChiYXNlSXRlcmFibGUsIGZ1bmMpID0+XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIEZhcignbWFwcGVkIGl0ZXJhYmxlJywge1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICBjb25zdCBiYXNlSXRlcmF0b3IgPSBiYXNlSXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgcmV0dXJuIEZhcignbWFwcGVkIGl0ZXJhdG9yJywge1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgeyB2YWx1ZTogYmFzZVZhbHVlLCBkb25lIH0gPSBiYXNlSXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gZG9uZSA/IGJhc2VWYWx1ZSA6IGZ1bmMoYmFzZVZhbHVlKTtcbiAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgdmFsdWUsIGRvbmUgfSk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTskaM2PX29uY2UubWFwSXRlcmFibGUobWFwSXRlcmFibGUpO1xuaGFyZGVuKG1hcEl0ZXJhYmxlKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGZpbHRlckl0ZXJhYmxlID0gKGJhc2VJdGVyYWJsZSwgcHJlZCkgPT5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgRmFyKCdmaWx0ZXJlZCBpdGVyYWJsZScsIHtcbiAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgY29uc3QgYmFzZUl0ZXJhdG9yID0gYmFzZUl0ZXJhYmxlW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICAgIHJldHVybiBGYXIoJ2ZpbHRlcmVkIGl0ZXJhdG9yJywge1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYmFzZUl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICAgIGNvbnN0IHsgdmFsdWUsIGRvbmUgfSA9IHJlc3VsdDtcbiAgICAgICAgICAgIGlmIChkb25lIHx8IHByZWQodmFsdWUpKSB7XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7JGjNj19vbmNlLmZpbHRlckl0ZXJhYmxlKGZpbHRlckl0ZXJhYmxlKTtcbmhhcmRlbihmaWx0ZXJJdGVyYWJsZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYXBJdGVyYWJsZSI6WyJtYXBJdGVyYWJsZSJdLCJmaWx0ZXJJdGVyYWJsZSI6WyJmaWx0ZXJJdGVyYWJsZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABieHiJ2RIAANkSAAAnAAAAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL21ha2UtZmFyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanMiLCJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9yZW1vdGFibGUuanMiXSwiZXhwb3J0cyI6WyJGYXIiLCJHRVRfTUVUSE9EX05BTUVTIiwiUmVtb3RhYmxlIiwiVG9GYXJGdW5jdGlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGdldE1ldGhvZE5hbWVzLHEsRmFpbCxhc3NlcnRDaGVja2VyLFBBU1NfU1RZTEUsYXNzZXJ0SWZhY2UsZ2V0SW50ZXJmYWNlT2YsUmVtb3RhYmxlSGVscGVyOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qc1wiLCBbW1wiZ2V0TWV0aG9kTmFtZXNcIixbJGjNj19hID0+IChnZXRNZXRob2ROYW1lcyA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJQQVNTX1NUWUxFXCIsWyRozY9fYSA9PiAoUEFTU19TVFlMRSA9ICRozY9fYSldXV1dLFtcIi4vcmVtb3RhYmxlLmpzXCIsIFtbXCJhc3NlcnRJZmFjZVwiLFskaM2PX2EgPT4gKGFzc2VydElmYWNlID0gJGjNj19hKV1dLFtcImdldEludGVyZmFjZU9mXCIsWyRozY9fYSA9PiAoZ2V0SW50ZXJmYWNlT2YgPSAkaM2PX2EpXV0sW1wiUmVtb3RhYmxlSGVscGVyXCIsWyRozY9fYSA9PiAoUmVtb3RhYmxlSGVscGVyID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbmNvbnN0IHsgcHJvdG90eXBlOiBmdW5jdGlvblByb3RvdHlwZSB9ID0gRnVuY3Rpb247XG5jb25zdCB7XG4gIGdldFByb3RvdHlwZU9mLFxuICBzZXRQcm90b3R5cGVPZixcbiAgY3JlYXRlLFxuICBpc0Zyb3plbixcbiAgcHJvdG90eXBlOiBvYmplY3RQcm90b3R5cGUsXG59ID0gT2JqZWN0O1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VSZW1vdGFibGVQcm90byA9IChyZW1vdGFibGUsIGlmYWNlKSA9PiB7XG4gIGxldCBvbGRQcm90byA9IGdldFByb3RvdHlwZU9mKHJlbW90YWJsZSk7XG4gIGlmICh0eXBlb2YgcmVtb3RhYmxlID09PSAnb2JqZWN0Jykge1xuICAgIGlmIChvbGRQcm90byA9PT0gbnVsbCkge1xuICAgICAgb2xkUHJvdG8gPSBvYmplY3RQcm90b3R5cGU7XG4gICAgfVxuICAgIG9sZFByb3RvID09PSBvYmplY3RQcm90b3R5cGUgfHxcbiAgICAgIEZhaWxgRm9yIG5vdywgcmVtb3RhYmxlcyBjYW5ub3QgaW5oZXJpdCBmcm9tIGFueXRoaW5nIHVudXN1YWwsIGluICR7cmVtb3RhYmxlfWA7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHJlbW90YWJsZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIG9sZFByb3RvICE9PSBudWxsIHx8XG4gICAgICBGYWlsYE9yaWdpbmFsIGZ1bmN0aW9uIG11c3Qgbm90IGluaGVyaXQgZnJvbSBudWxsOiAke3JlbW90YWJsZX1gO1xuICAgIG9sZFByb3RvID09PSBmdW5jdGlvblByb3RvdHlwZSB8fFxuICAgICAgZ2V0UHJvdG90eXBlT2Yob2xkUHJvdG8pID09PSBmdW5jdGlvblByb3RvdHlwZSB8fFxuICAgICAgRmFpbGBGYXIgZnVuY3Rpb25zIG11c3Qgb3JpZ2luYWxseSBpbmhlcml0IGZyb20gRnVuY3Rpb24ucHJvdG90eXBlLCBpbiAke3JlbW90YWJsZX1gO1xuICB9IGVsc2Uge1xuICAgIEZhaWxgdW5yZWNvZ25pemVkIHR5cGVvZiAke3JlbW90YWJsZX1gO1xuICB9XG4gIHJldHVybiBoYXJkZW4oXG4gICAgY3JlYXRlKG9sZFByb3RvLCB7XG4gICAgICBbUEFTU19TVFlMRV06IHsgdmFsdWU6ICdyZW1vdGFibGUnIH0sXG4gICAgICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogeyB2YWx1ZTogaWZhY2UgfSxcbiAgICB9KSxcbiAgKTtcbn07XG5cbmNvbnN0IGFzc2VydENhbkJlUmVtb3RhYmxlID0gY2FuZGlkYXRlID0+XG4gIFJlbW90YWJsZUhlbHBlci5jYW5CZVZhbGlkKGNhbmRpZGF0ZSwgYXNzZXJ0Q2hlY2tlcik7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBSZW1vdGFibGUgPSAoXG4gIC8vXG4gIGlmYWNlID0gJ1JlbW90YWJsZScsXG4gIHByb3BzID0gdW5kZWZpbmVkLFxuICByZW1vdGFibGUgPSAvKiAgICAgICAgICAgICovICh7fSksXG4pID0+IHtcbiAgYXNzZXJ0SWZhY2UoaWZhY2UpO1xuICBhc3NlcnQoaWZhY2UpO1xuICAvL1xuICAvL1xuICBwcm9wcyA9PT0gdW5kZWZpbmVkIHx8IEZhaWxgUmVtb3RhYmxlIHByb3BzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgJHtwcm9wc31gO1xuXG4gIC8vXG4gIGFzc2VydENhbkJlUmVtb3RhYmxlKHJlbW90YWJsZSk7XG5cbiAgLy9cbiAgIShQQVNTX1NUWUxFIGluIHJlbW90YWJsZSkgfHxcbiAgICBGYWlsYFJlbW90YWJsZSAke3JlbW90YWJsZX0gaXMgYWxyZWFkeSBtYXJrZWQgYXMgYSAke3EoXG4gICAgICByZW1vdGFibGVbUEFTU19TVFlMRV0sXG4gICAgKX1gO1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICBoYXJkZW4uaXNGYWtlIHx8XG4gICAgLy9cbiAgICAhaXNGcm96ZW4ocmVtb3RhYmxlKSB8fFxuICAgIEZhaWxgUmVtb3RhYmxlICR7cmVtb3RhYmxlfSBpcyBhbHJlYWR5IGZyb3plbmA7XG4gIGNvbnN0IHJlbW90YWJsZVByb3RvID0gbWFrZVJlbW90YWJsZVByb3RvKHJlbW90YWJsZSwgaWZhY2UpO1xuXG4gIC8vXG4gIC8vXG4gIGNvbnN0IG11dGF0ZUhhcmRlbkFuZENoZWNrID0gdGFyZ2V0ID0+IHtcbiAgICAvL1xuICAgIHNldFByb3RvdHlwZU9mKHRhcmdldCwgcmVtb3RhYmxlUHJvdG8pO1xuICAgIGhhcmRlbih0YXJnZXQpO1xuICAgIGFzc2VydENhbkJlUmVtb3RhYmxlKHRhcmdldCk7XG4gIH07XG5cbiAgLy9cbiAgbXV0YXRlSGFyZGVuQW5kQ2hlY2soe30pO1xuXG4gIC8vXG4gIG11dGF0ZUhhcmRlbkFuZENoZWNrKHJlbW90YWJsZSk7XG5cbiAgLy9cbiAgLy9cbiAgYXNzZXJ0KGlmYWNlICE9PSB1bmRlZmluZWQpOyAvL1xuICByZXR1cm4gLyogICAgICAgICAgICAgICovIChyZW1vdGFibGUpO1xufTskaM2PX29uY2UuUmVtb3RhYmxlKFJlbW90YWJsZSk7XG5oYXJkZW4oUmVtb3RhYmxlKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IEdFVF9NRVRIT0RfTkFNRVMgPSAnX19nZXRNZXRob2ROYW1lc19fJztcblxuLypcblxuXG5cblxuICovJGjNj19vbmNlLkdFVF9NRVRIT0RfTkFNRVMoR0VUX01FVEhPRF9OQU1FUyk7XG5jb25zdCBnZXRNZXRob2ROYW1lc01ldGhvZCA9IGhhcmRlbih7XG4gIFtHRVRfTUVUSE9EX05BTUVTXSgpIHtcbiAgICByZXR1cm4gZ2V0TWV0aG9kTmFtZXModGhpcyk7XG4gIH0sXG59KVtHRVRfTUVUSE9EX05BTUVTXTtcblxuY29uc3QgZ2V0TWV0aG9kTmFtZXNEZXNjcmlwdG9yID0gaGFyZGVuKHtcbiAgdmFsdWU6IGdldE1ldGhvZE5hbWVzTWV0aG9kLFxuICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgd3JpdGFibGU6IGZhbHNlLFxufSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBGYXIgPSAoZmFyTmFtZSwgcmVtb3RhYmxlID0gdW5kZWZpbmVkKSA9PiB7XG4gIGNvbnN0IHIgPSByZW1vdGFibGUgPT09IHVuZGVmaW5lZCA/IC8qICAgICAgICAgICAgKi8gKHt9KSA6IHJlbW90YWJsZTtcbiAgaWYgKHR5cGVvZiByID09PSAnb2JqZWN0JyAmJiAhKEdFVF9NRVRIT0RfTkFNRVMgaW4gcikpIHtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyLCBHRVRfTUVUSE9EX05BTUVTLCBnZXRNZXRob2ROYW1lc0Rlc2NyaXB0b3IpO1xuICB9XG4gIHJldHVybiBSZW1vdGFibGUoYEFsbGVnZWQ6ICR7ZmFyTmFtZX1gLCB1bmRlZmluZWQsIHIpO1xufTskaM2PX29uY2UuRmFyKEZhcik7XG5oYXJkZW4oRmFyKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IFRvRmFyRnVuY3Rpb24gPSAoZmFyTmFtZSwgZnVuYykgPT4ge1xuICBpZiAoZ2V0SW50ZXJmYWNlT2YoZnVuYykgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vXG4gICAgcmV0dXJuIGZ1bmM7XG4gIH1cbiAgLy9cbiAgcmV0dXJuIEZhcihmYXJOYW1lLCAoLi4uYXJncykgPT4gZnVuYyguLi5hcmdzKSk7XG59OyRozY9fb25jZS5Ub0ZhckZ1bmN0aW9uKFRvRmFyRnVuY3Rpb24pO1xuaGFyZGVuKFRvRmFyRnVuY3Rpb24pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUmVtb3RhYmxlIjpbIlJlbW90YWJsZSJdLCJHRVRfTUVUSE9EX05BTUVTIjpbIkdFVF9NRVRIT0RfTkFNRVMiXSwiRmFyIjpbIkZhciJdLCJUb0ZhckZ1bmN0aW9uIjpbIlRvRmFyRnVuY3Rpb24iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAATcGI09wEAADcBAAAKQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9tYWtlVGFnZ2VkLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL3Bhc3NTdHlsZU9mLmpzIl0sImV4cG9ydHMiOlsibWFrZVRhZ2dlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsUEFTU19TVFlMRSxhc3NlcnRQYXNzYWJsZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJQQVNTX1NUWUxFXCIsWyRozY9fYSA9PiAoUEFTU19TVFlMRSA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8qXG5cbiAqL1xuXG5jb25zdCB7IGNyZWF0ZSwgcHJvdG90eXBlOiBvYmplY3RQcm90b3R5cGUgfSA9IE9iamVjdDtcblxuLypcblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlVGFnZ2VkID0gKHRhZywgcGF5bG9hZCkgPT4ge1xuICB0eXBlb2YgdGFnID09PSAnc3RyaW5nJyB8fFxuICAgIEZhaWxgVGhlIHRhZyBvZiBhIHRhZ2dlZCByZWNvcmQgbXVzdCBiZSBhIHN0cmluZzogJHt0YWd9YDtcbiAgYXNzZXJ0UGFzc2FibGUoaGFyZGVuKHBheWxvYWQpKTtcbiAgcmV0dXJuIGhhcmRlbihcbiAgICBjcmVhdGUob2JqZWN0UHJvdG90eXBlLCB7XG4gICAgICBbUEFTU19TVFlMRV06IHsgdmFsdWU6ICd0YWdnZWQnIH0sXG4gICAgICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogeyB2YWx1ZTogdGFnIH0sXG4gICAgICBwYXlsb2FkOiB7IHZhbHVlOiBwYXlsb2FkLCBlbnVtZXJhYmxlOiB0cnVlIH0sXG4gICAgfSksXG4gICk7XG59OyRozY9fb25jZS5tYWtlVGFnZ2VkKG1ha2VUYWdnZWQpO1xuaGFyZGVuKG1ha2VUYWdnZWQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVRhZ2dlZCI6WyJtYWtlVGFnZ2VkIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHBEXISiFwAAohcAADAAAABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiQ1giLCJQQVNTX1NUWUxFIiwiYXNzZXJ0Q2hlY2tlciIsImNhbkJlTWV0aG9kIiwiY2hlY2tGdW5jdGlvblRhZ1JlY29yZCIsImNoZWNrUGFzc1N0eWxlIiwiY2hlY2tUYWdSZWNvcmQiLCJnZXRPd25EYXRhRGVzY3JpcHRvciIsImdldFRhZyIsImhhc093blByb3BlcnR5T2YiLCJpc09iamVjdCIsImlzVHlwZWRBcnJheSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IFgscTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuY29uc3QgeyBpc0FycmF5IH0gPSBBcnJheTtcbmNvbnN0IHsgcHJvdG90eXBlOiBmdW5jdGlvblByb3RvdHlwZSB9ID0gRnVuY3Rpb247XG5jb25zdCB7XG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcixcbiAgZ2V0UHJvdG90eXBlT2YsXG4gIGhhc093blByb3BlcnR5OiBvYmplY3RIYXNPd25Qcm9wZXJ0eSxcbiAgaXNGcm96ZW4sXG4gIHByb3RvdHlwZTogb2JqZWN0UHJvdG90eXBlLFxufSA9IE9iamVjdDtcbmNvbnN0IHsgYXBwbHkgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IHRvU3RyaW5nVGFnOiB0b1N0cmluZ1RhZ1N5bWJvbCB9ID0gU3ltYm9sO1xuXG5jb25zdCB0eXBlZEFycmF5UHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoVWludDhBcnJheS5wcm90b3R5cGUpO1xuY29uc3QgdHlwZWRBcnJheVRvU3RyaW5nVGFnRGVzYyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgdHlwZWRBcnJheVByb3RvdHlwZSxcbiAgdG9TdHJpbmdUYWdTeW1ib2wsXG4pO1xuYXNzZXJ0KHR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2MpO1xuY29uc3QgZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnID0gdHlwZWRBcnJheVRvU3RyaW5nVGFnRGVzYy5nZXQ7XG5hc3NlcnQodHlwZW9mIGdldFR5cGVkQXJyYXlUb1N0cmluZ1RhZyA9PT0gJ2Z1bmN0aW9uJyk7XG5cbiAgICAgICBjb25zdCBoYXNPd25Qcm9wZXJ0eU9mID0gKG9iaiwgcHJvcCkgPT5cbiAgYXBwbHkob2JqZWN0SGFzT3duUHJvcGVydHksIG9iaiwgW3Byb3BdKTskaM2PX29uY2UuaGFzT3duUHJvcGVydHlPZihoYXNPd25Qcm9wZXJ0eU9mKTtcbmhhcmRlbihoYXNPd25Qcm9wZXJ0eU9mKTtcblxuLy9cbiAgICAgICBjb25zdCBpc09iamVjdCA9IHZhbCA9PiBPYmplY3QodmFsKSA9PT0gdmFsOyRozY9fb25jZS5pc09iamVjdChpc09iamVjdCk7XG5oYXJkZW4oaXNPYmplY3QpO1xuXG4vKlxuXG5cblxuICovXG4gICAgICAgY29uc3QgaXNUeXBlZEFycmF5ID0gb2JqZWN0ID0+IHtcbiAgLy9cbiAgY29uc3QgdGFnID0gYXBwbHkoZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnLCBvYmplY3QsIFtdKTtcbiAgcmV0dXJuIHRhZyAhPT0gdW5kZWZpbmVkO1xufTskaM2PX29uY2UuaXNUeXBlZEFycmF5KGlzVHlwZWRBcnJheSk7XG5oYXJkZW4oaXNUeXBlZEFycmF5KTtcblxuICAgICAgIGNvbnN0IFBBU1NfU1RZTEUgPSBTeW1ib2wuZm9yKCdwYXNzU3R5bGUnKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuUEFTU19TVFlMRShQQVNTX1NUWUxFKTtcbiAgICAgICBjb25zdCBjYW5CZU1ldGhvZCA9IGZ1bmMgPT5cbiAgdHlwZW9mIGZ1bmMgPT09ICdmdW5jdGlvbicgJiYgIShQQVNTX1NUWUxFIGluIGZ1bmMpOyRozY9fb25jZS5jYW5CZU1ldGhvZChjYW5CZU1ldGhvZCk7XG5oYXJkZW4oY2FuQmVNZXRob2QpO1xuXG4vKlxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0Q2hlY2tlciA9IChjb25kLCBkZXRhaWxzKSA9PiB7XG4gIGFzc2VydChjb25kLCBkZXRhaWxzKTtcbiAgcmV0dXJuIHRydWU7XG59OyRozY9fb25jZS5hc3NlcnRDaGVja2VyKGFzc2VydENoZWNrZXIpO1xuaGFyZGVuKGFzc2VydENoZWNrZXIpO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBDWCA9IGNoZWNrID0+IHtcbiAgY29uc3QgcmVqZWN0ID0gKFQsIC4uLnN1YnMpID0+IGNoZWNrKGZhbHNlLCBYKFQsIC4uLnN1YnMpKTtcbiAgcmV0dXJuIHJlamVjdDtcbn07JGjNj19vbmNlLkNYKENYKTtcbmhhcmRlbihDWCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0T3duRGF0YURlc2NyaXB0b3IgPSAoXG4gIGNhbmRpZGF0ZSxcbiAgcHJvcE5hbWUsXG4gIHNob3VsZEJlRW51bWVyYWJsZSxcbiAgY2hlY2ssXG4pID0+IHtcbiAgY29uc3QgZGVzYyA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoXG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNhbmRpZGF0ZSwgcHJvcE5hbWUpXG4gICk7XG4gIHJldHVybiAoZGVzYyAhPT0gdW5kZWZpbmVkIHx8XG4gICAgKCEhY2hlY2sgJiYgQ1goY2hlY2spYCR7cShwcm9wTmFtZSl9IHByb3BlcnR5IGV4cGVjdGVkOiAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgICAoaGFzT3duUHJvcGVydHlPZihkZXNjLCAndmFsdWUnKSB8fFxuICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgQ1goXG4gICAgICAgICAgY2hlY2ssXG4gICAgICAgIClgJHtxKHByb3BOYW1lKX0gbXVzdCBub3QgYmUgYW4gYWNjZXNzb3IgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWApKSAmJlxuICAgIChzaG91bGRCZUVudW1lcmFibGVcbiAgICAgID8gZGVzYy5lbnVtZXJhYmxlIHx8XG4gICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgQ1goXG4gICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICApYCR7cShwcm9wTmFtZSl9IG11c3QgYmUgYW4gZW51bWVyYWJsZSBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YClcbiAgICAgIDogIWRlc2MuZW51bWVyYWJsZSB8fFxuICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgIENYKFxuICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgKWAke3EocHJvcE5hbWUpfSBtdXN0IG5vdCBiZSBhbiBlbnVtZXJhYmxlIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gKSlcbiAgICA/IGRlc2NcbiAgICA6IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoLyogICAgICAgICAgICAgICAgICAqLyAodW5kZWZpbmVkKSk7XG59OyRozY9fb25jZS5nZXRPd25EYXRhRGVzY3JpcHRvcihnZXRPd25EYXRhRGVzY3JpcHRvcik7XG5oYXJkZW4oZ2V0T3duRGF0YURlc2NyaXB0b3IpO1xuXG4vKlxuXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0VGFnID0gdGFnUmVjb3JkID0+IHRhZ1JlY29yZFtTeW1ib2wudG9TdHJpbmdUYWddOyRozY9fb25jZS5nZXRUYWcoZ2V0VGFnKTtcbmhhcmRlbihnZXRUYWcpO1xuXG4gICAgICAgY29uc3QgY2hlY2tQYXNzU3R5bGUgPSAob2JqLCBwYXNzU3R5bGUsIGV4cGVjdGVkUGFzc1N0eWxlLCBjaGVjaykgPT4ge1xuICByZXR1cm4gKFxuICAgIHBhc3NTdHlsZSA9PT0gZXhwZWN0ZWRQYXNzU3R5bGUgfHxcbiAgICAoISFjaGVjayAmJlxuICAgICAgQ1goY2hlY2spYEV4cGVjdGVkICR7cShleHBlY3RlZFBhc3NTdHlsZSl9LCBub3QgJHtxKHBhc3NTdHlsZSl9OiAke29ian1gKVxuICApO1xufTskaM2PX29uY2UuY2hlY2tQYXNzU3R5bGUoY2hlY2tQYXNzU3R5bGUpO1xuaGFyZGVuKGNoZWNrUGFzc1N0eWxlKTtcblxuY29uc3QgbWFrZUNoZWNrVGFnUmVjb3JkID0gY2hlY2tQcm90byA9PiB7XG4gIC8qXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGNoZWNrVGFnUmVjb3JkID0gKHRhZ1JlY29yZCwgZXhwZWN0ZWRQYXNzU3R5bGUsIGNoZWNrKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIChpc09iamVjdCh0YWdSZWNvcmQpIHx8XG4gICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgQ1goY2hlY2spYEEgbm9uLW9iamVjdCBjYW5ub3QgYmUgYSB0YWdSZWNvcmQ6ICR7dGFnUmVjb3JkfWApKSAmJlxuICAgICAgKGlzRnJvemVuKHRhZ1JlY29yZCkgfHxcbiAgICAgICAgKCEhY2hlY2sgJiYgQ1goY2hlY2spYEEgdGFnUmVjb3JkIG11c3QgYmUgZnJvemVuOiAke3RhZ1JlY29yZH1gKSkgJiZcbiAgICAgICghaXNBcnJheSh0YWdSZWNvcmQpIHx8XG4gICAgICAgICghIWNoZWNrICYmIENYKGNoZWNrKWBBbiBhcnJheSBjYW5ub3QgYmUgYSB0YWdSZWNvcmQ6ICR7dGFnUmVjb3JkfWApKSAmJlxuICAgICAgY2hlY2tQYXNzU3R5bGUoXG4gICAgICAgIHRhZ1JlY29yZCxcbiAgICAgICAgZ2V0T3duRGF0YURlc2NyaXB0b3IodGFnUmVjb3JkLCBQQVNTX1NUWUxFLCBmYWxzZSwgY2hlY2spLnZhbHVlLFxuICAgICAgICBleHBlY3RlZFBhc3NTdHlsZSxcbiAgICAgICAgY2hlY2ssXG4gICAgICApICYmXG4gICAgICAodHlwZW9mIGdldE93bkRhdGFEZXNjcmlwdG9yKHRhZ1JlY29yZCwgU3ltYm9sLnRvU3RyaW5nVGFnLCBmYWxzZSwgY2hlY2spXG4gICAgICAgIC52YWx1ZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICBDWChcbiAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgIClgQSBbU3ltYm9sLnRvU3RyaW5nVGFnXS1uYW1lZCBwcm9wZXJ0eSBtdXN0IGJlIGEgc3RyaW5nOiAke3RhZ1JlY29yZH1gKSkgJiZcbiAgICAgIGNoZWNrUHJvdG8odGFnUmVjb3JkLCBnZXRQcm90b3R5cGVPZih0YWdSZWNvcmQpLCBjaGVjaylcbiAgICApO1xuICB9O1xuICByZXR1cm4gaGFyZGVuKGNoZWNrVGFnUmVjb3JkKTtcbn07XG5cbiAgICAgICBjb25zdCBjaGVja1RhZ1JlY29yZCA9IG1ha2VDaGVja1RhZ1JlY29yZChcbiAgKHZhbCwgcHJvdG8sIGNoZWNrKSA9PlxuICAgIHByb3RvID09PSBvYmplY3RQcm90b3R5cGUgfHxcbiAgICAoISFjaGVjayAmJlxuICAgICAgY2hlY2soZmFsc2UsIFhgQSB0YWdSZWNvcmQgbXVzdCBpbmhlcml0IGZyb20gT2JqZWN0LnByb3RvdHlwZTogJHt2YWx9YCkpLFxuKTskaM2PX29uY2UuY2hlY2tUYWdSZWNvcmQoY2hlY2tUYWdSZWNvcmQpO1xuaGFyZGVuKGNoZWNrVGFnUmVjb3JkKTtcblxuICAgICAgIGNvbnN0IGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQgPSBtYWtlQ2hlY2tUYWdSZWNvcmQoXG4gICh2YWwsIHByb3RvLCBjaGVjaykgPT5cbiAgICBwcm90byA9PT0gZnVuY3Rpb25Qcm90b3R5cGUgfHxcbiAgICAocHJvdG8gIT09IG51bGwgJiYgZ2V0UHJvdG90eXBlT2YocHJvdG8pID09PSBmdW5jdGlvblByb3RvdHlwZSkgfHxcbiAgICAoISFjaGVjayAmJlxuICAgICAgY2hlY2soXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBYYEZvciBmdW5jdGlvbnMsIGEgdGFnUmVjb3JkIG11c3QgaW5oZXJpdCBmcm9tIEZ1bmN0aW9uLnByb3RvdHlwZTogJHt2YWx9YCxcbiAgICAgICkpLFxuKTskaM2PX29uY2UuY2hlY2tGdW5jdGlvblRhZ1JlY29yZChjaGVja0Z1bmN0aW9uVGFnUmVjb3JkKTtcbmhhcmRlbihjaGVja0Z1bmN0aW9uVGFnUmVjb3JkKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Imhhc093blByb3BlcnR5T2YiOlsiaGFzT3duUHJvcGVydHlPZiJdLCJpc09iamVjdCI6WyJpc09iamVjdCJdLCJpc1R5cGVkQXJyYXkiOlsiaXNUeXBlZEFycmF5Il0sIlBBU1NfU1RZTEUiOlsiUEFTU19TVFlMRSJdLCJjYW5CZU1ldGhvZCI6WyJjYW5CZU1ldGhvZCJdLCJhc3NlcnRDaGVja2VyIjpbImFzc2VydENoZWNrZXIiXSwiQ1giOlsiQ1giXSwiZ2V0T3duRGF0YURlc2NyaXB0b3IiOlsiZ2V0T3duRGF0YURlc2NyaXB0b3IiXSwiZ2V0VGFnIjpbImdldFRhZyJdLCJjaGVja1Bhc3NTdHlsZSI6WyJjaGVja1Bhc3NTdHlsZSJdLCJjaGVja1RhZ1JlY29yZCI6WyJjaGVja1RhZ1JlY29yZCJdLCJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIjpbImNoZWNrRnVuY3Rpb25UYWdSZWNvcmQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAADJ1trdMrAADTKwAAKgAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9wYXNzU3R5bGVPZi5qc3siaW1wb3J0cyI6WyJAZW5kby9wcm9taXNlLWtpdCIsIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL2NvcHlBcnJheS5qcyIsIi4vY29weVJlY29yZC5qcyIsIi4vdGFnZ2VkLmpzIiwiLi9lcnJvci5qcyIsIi4vcmVtb3RhYmxlLmpzIiwiLi9zeW1ib2wuanMiLCIuL3NhZmUtcHJvbWlzZS5qcyIsIi4vc3RyaW5nLmpzIl0sImV4cG9ydHMiOlsiUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wiLCJhc3NlcnRQYXNzYWJsZSIsImlzUGFzc2FibGUiLCJwYXNzU3R5bGVPZiIsInRvUGFzc2FibGVFcnJvciIsInRvVGhyb3dhYmxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgaXNQcm9taXNlLFgsRmFpbCxxLGFubm90YXRlRXJyb3IsbWFrZUVycm9yLGlzT2JqZWN0LGlzVHlwZWRBcnJheSxQQVNTX1NUWUxFLGFzc2VydENoZWNrZXIsQ29weUFycmF5SGVscGVyLENvcHlSZWNvcmRIZWxwZXIsVGFnZ2VkSGVscGVyLEVycm9ySGVscGVyLGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjLGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yLGdldEVycm9yQ29uc3RydWN0b3IsaXNFcnJvckxpa2UsUmVtb3RhYmxlSGVscGVyLGFzc2VydFBhc3NhYmxlU3ltYm9sLGFzc2VydFNhZmVQcm9taXNlLGFzc2VydFBhc3NhYmxlU3RyaW5nOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLFskaM2PX2EgPT4gKGlzUHJvbWlzZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiYW5ub3RhdGVFcnJvclwiLFskaM2PX2EgPT4gKGFubm90YXRlRXJyb3IgPSAkaM2PX2EpXV0sW1wibWFrZUVycm9yXCIsWyRozY9fYSA9PiAobWFrZUVycm9yID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiaXNPYmplY3RcIixbJGjNj19hID0+IChpc09iamVjdCA9ICRozY9fYSldXSxbXCJpc1R5cGVkQXJyYXlcIixbJGjNj19hID0+IChpc1R5cGVkQXJyYXkgPSAkaM2PX2EpXV0sW1wiUEFTU19TVFlMRVwiLFskaM2PX2EgPT4gKFBBU1NfU1RZTEUgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV1dXSxbXCIuL2NvcHlBcnJheS5qc1wiLCBbW1wiQ29weUFycmF5SGVscGVyXCIsWyRozY9fYSA9PiAoQ29weUFycmF5SGVscGVyID0gJGjNj19hKV1dXV0sW1wiLi9jb3B5UmVjb3JkLmpzXCIsIFtbXCJDb3B5UmVjb3JkSGVscGVyXCIsWyRozY9fYSA9PiAoQ29weVJlY29yZEhlbHBlciA9ICRozY9fYSldXV1dLFtcIi4vdGFnZ2VkLmpzXCIsIFtbXCJUYWdnZWRIZWxwZXJcIixbJGjNj19hID0+IChUYWdnZWRIZWxwZXIgPSAkaM2PX2EpXV1dXSxbXCIuL2Vycm9yLmpzXCIsIFtbXCJFcnJvckhlbHBlclwiLFskaM2PX2EgPT4gKEVycm9ySGVscGVyID0gJGjNj19hKV1dLFtcImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjXCIsWyRozY9fYSA9PiAoY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MgPSAkaM2PX2EpXV0sW1wiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JcIixbJGjNj19hID0+IChjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvciA9ICRozY9fYSldXSxbXCJnZXRFcnJvckNvbnN0cnVjdG9yXCIsWyRozY9fYSA9PiAoZ2V0RXJyb3JDb25zdHJ1Y3RvciA9ICRozY9fYSldXSxbXCJpc0Vycm9yTGlrZVwiLFskaM2PX2EgPT4gKGlzRXJyb3JMaWtlID0gJGjNj19hKV1dXV0sW1wiLi9yZW1vdGFibGUuanNcIiwgW1tcIlJlbW90YWJsZUhlbHBlclwiLFskaM2PX2EgPT4gKFJlbW90YWJsZUhlbHBlciA9ICRozY9fYSldXV1dLFtcIi4vc3ltYm9sLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVN5bWJvbFwiLFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlU3ltYm9sID0gJGjNj19hKV1dXV0sW1wiLi9zYWZlLXByb21pc2UuanNcIiwgW1tcImFzc2VydFNhZmVQcm9taXNlXCIsWyRozY9fYSA9PiAoYXNzZXJ0U2FmZVByb21pc2UgPSAkaM2PX2EpXV1dXSxbXCIuL3N0cmluZy5qc1wiLCBbW1wiYXNzZXJ0UGFzc2FibGVTdHJpbmdcIixbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZVN0cmluZyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgaXNGcm96ZW4sIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsIHZhbHVlcyB9ID0gT2JqZWN0O1xuXG4vKlxuXG5cbiAqL1xuXG5jb25zdCBtYWtlSGVscGVyVGFibGUgPSBwYXNzU3R5bGVIZWxwZXJzID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IEhlbHBlclRhYmxlID0ge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBjb3B5QXJyYXk6IHVuZGVmaW5lZCxcbiAgICBjb3B5UmVjb3JkOiB1bmRlZmluZWQsXG4gICAgdGFnZ2VkOiB1bmRlZmluZWQsXG4gICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICByZW1vdGFibGU6IHVuZGVmaW5lZCxcbiAgfTtcbiAgZm9yIChjb25zdCBoZWxwZXIgb2YgcGFzc1N0eWxlSGVscGVycykge1xuICAgIGNvbnN0IHsgc3R5bGVOYW1lIH0gPSBoZWxwZXI7XG4gICAgc3R5bGVOYW1lIGluIEhlbHBlclRhYmxlIHx8IEZhaWxgVW5yZWNvZ25pemVkIGhlbHBlcjogJHtxKHN0eWxlTmFtZSl9YDtcbiAgICBIZWxwZXJUYWJsZVtzdHlsZU5hbWVdID09PSB1bmRlZmluZWQgfHxcbiAgICAgIEZhaWxgY29uZmxpY3RpbmcgaGVscGVycyBmb3IgJHtxKHN0eWxlTmFtZSl9YDtcbiAgICBIZWxwZXJUYWJsZVtzdHlsZU5hbWVdID0gaGVscGVyO1xuICB9XG4gIGZvciAoY29uc3Qgc3R5bGVOYW1lIG9mIG93bktleXMoSGVscGVyVGFibGUpKSB7XG4gICAgSGVscGVyVGFibGVbc3R5bGVOYW1lXSAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICBGYWlsYG1pc3NpbmcgaGVscGVyIGZvciAke3Eoc3R5bGVOYW1lKX1gO1xuICB9XG5cbiAgcmV0dXJuIGhhcmRlbihIZWxwZXJUYWJsZSk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0VmFsaWQgPSAoaGVscGVyLCBjYW5kaWRhdGUsIHBhc3NTdHlsZU9mUmVjdXIpID0+IHtcbiAgaGVscGVyLmNhbkJlVmFsaWQoY2FuZGlkYXRlLCBhc3NlcnRDaGVja2VyKTtcbiAgaGVscGVyLmFzc2VydFJlc3RWYWxpZChjYW5kaWRhdGUsIHBhc3NTdHlsZU9mUmVjdXIpO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VQYXNzU3R5bGVPZiA9IHBhc3NTdHlsZUhlbHBlcnMgPT4ge1xuICBjb25zdCBIZWxwZXJUYWJsZSA9IG1ha2VIZWxwZXJUYWJsZShwYXNzU3R5bGVIZWxwZXJzKTtcbiAgY29uc3QgcmVtb3RhYmxlSGVscGVyID0gSGVscGVyVGFibGUucmVtb3RhYmxlO1xuXG4gIC8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgcGFzc1N0eWxlTWVtbyA9IG5ldyBXZWFrTWFwKCk7XG5cbiAgLypcblxuICAgKi9cbiAgLy9cbiAgY29uc3QgcGFzc1N0eWxlT2YgPSBwYXNzYWJsZSA9PiB7XG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgY29uc3QgaW5Qcm9ncmVzcyA9IG5ldyBTZXQoKTtcblxuICAgIGNvbnN0IHBhc3NTdHlsZU9mUmVjdXIgPSBpbm5lciA9PiB7XG4gICAgICBjb25zdCBpbm5lcklzT2JqZWN0ID0gaXNPYmplY3QoaW5uZXIpO1xuICAgICAgaWYgKGlubmVySXNPYmplY3QpIHtcbiAgICAgICAgY29uc3QgaW5uZXJTdHlsZSA9IHBhc3NTdHlsZU1lbW8uZ2V0KGlubmVyKTtcbiAgICAgICAgaWYgKGlubmVyU3R5bGUpIHtcbiAgICAgICAgICByZXR1cm4gaW5uZXJTdHlsZTtcbiAgICAgICAgfVxuICAgICAgICAhaW5Qcm9ncmVzcy5oYXMoaW5uZXIpIHx8XG4gICAgICAgICAgRmFpbGBQYXNzLWJ5LWNvcHkgZGF0YSBjYW5ub3QgYmUgY3ljbGljICR7aW5uZXJ9YDtcbiAgICAgICAgaW5Qcm9ncmVzcy5hZGQoaW5uZXIpO1xuICAgICAgfVxuICAgICAgLy9cbiAgICAgIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mSW50ZXJuYWwoaW5uZXIpO1xuICAgICAgaWYgKGlubmVySXNPYmplY3QpIHtcbiAgICAgICAgcGFzc1N0eWxlTWVtby5zZXQoaW5uZXIsIHBhc3NTdHlsZSk7XG4gICAgICAgIGluUHJvZ3Jlc3MuZGVsZXRlKGlubmVyKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXNzU3R5bGU7XG4gICAgfTtcblxuICAgIGNvbnN0IHBhc3NTdHlsZU9mSW50ZXJuYWwgPSBpbm5lciA9PiB7XG4gICAgICBjb25zdCB0eXBlc3RyID0gdHlwZW9mIGlubmVyO1xuICAgICAgc3dpdGNoICh0eXBlc3RyKSB7XG4gICAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgICBjYXNlICdudW1iZXInOlxuICAgICAgICBjYXNlICdiaWdpbnQnOiB7XG4gICAgICAgICAgcmV0dXJuIHR5cGVzdHI7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc3RyaW5nJzoge1xuICAgICAgICAgIGFzc2VydFBhc3NhYmxlU3RyaW5nKGlubmVyKTtcbiAgICAgICAgICByZXR1cm4gJ3N0cmluZyc7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc3ltYm9sJzoge1xuICAgICAgICAgIGFzc2VydFBhc3NhYmxlU3ltYm9sKGlubmVyKTtcbiAgICAgICAgICByZXR1cm4gJ3N5bWJvbCc7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnb2JqZWN0Jzoge1xuICAgICAgICAgIGlmIChpbm5lciA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuICdudWxsJztcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKCFpc0Zyb3plbihpbm5lcikpIHtcbiAgICAgICAgICAgIGFzc2VydC5mYWlsKFxuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICBpc1R5cGVkQXJyYXkoaW5uZXIpXG4gICAgICAgICAgICAgICAgPyBYYENhbm5vdCBwYXNzIG11dGFibGUgdHlwZWQgYXJyYXlzIGxpa2UgJHtpbm5lcn0uYFxuICAgICAgICAgICAgICAgIDogWGBDYW5ub3QgcGFzcyBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke2lubmVyfS4gVXNlIGhhcmRlbigpYCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChpc1Byb21pc2UoaW5uZXIpKSB7XG4gICAgICAgICAgICBhc3NlcnRTYWZlUHJvbWlzZShpbm5lcik7XG4gICAgICAgICAgICByZXR1cm4gJ3Byb21pc2UnO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0eXBlb2YgaW5uZXIudGhlbiAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICAgICAgRmFpbGBDYW5ub3QgcGFzcyBub24tcHJvbWlzZSB0aGVuYWJsZXNgO1xuICAgICAgICAgIGNvbnN0IHBhc3NTdHlsZVRhZyA9IGlubmVyW1BBU1NfU1RZTEVdO1xuICAgICAgICAgIGlmIChwYXNzU3R5bGVUYWcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYXNzZXJ0LnR5cGVvZihwYXNzU3R5bGVUYWcsICdzdHJpbmcnKTtcbiAgICAgICAgICAgIGNvbnN0IGhlbHBlciA9IEhlbHBlclRhYmxlW3Bhc3NTdHlsZVRhZ107XG4gICAgICAgICAgICBoZWxwZXIgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgICBGYWlsYFVucmVjb2duaXplZCBQYXNzU3R5bGU6ICR7cShwYXNzU3R5bGVUYWcpfWA7XG4gICAgICAgICAgICBhc3NlcnRWYWxpZChoZWxwZXIsIGlubmVyLCBwYXNzU3R5bGVPZlJlY3VyKTtcbiAgICAgICAgICAgIHJldHVybiAvKiAgICAgICAgICAgICAgICAgICAgKi8gKHBhc3NTdHlsZVRhZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGZvciAoY29uc3QgaGVscGVyIG9mIHBhc3NTdHlsZUhlbHBlcnMpIHtcbiAgICAgICAgICAgIGlmIChoZWxwZXIuY2FuQmVWYWxpZChpbm5lcikpIHtcbiAgICAgICAgICAgICAgaGVscGVyLmFzc2VydFJlc3RWYWxpZChpbm5lciwgcGFzc1N0eWxlT2ZSZWN1cik7XG4gICAgICAgICAgICAgIHJldHVybiBoZWxwZXIuc3R5bGVOYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBhc3NlcnRWYWxpZChyZW1vdGFibGVIZWxwZXIsIGlubmVyLCBwYXNzU3R5bGVPZlJlY3VyKTtcbiAgICAgICAgICByZXR1cm4gJ3JlbW90YWJsZSc7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZnVuY3Rpb24nOiB7XG4gICAgICAgICAgaXNGcm96ZW4oaW5uZXIpIHx8XG4gICAgICAgICAgICBGYWlsYENhbm5vdCBwYXNzIG5vbi1mcm96ZW4gb2JqZWN0cyBsaWtlICR7aW5uZXJ9LiBVc2UgaGFyZGVuKClgO1xuICAgICAgICAgIHR5cGVvZiBpbm5lci50aGVuICE9PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgICAgICBGYWlsYENhbm5vdCBwYXNzIG5vbi1wcm9taXNlIHRoZW5hYmxlc2A7XG4gICAgICAgICAgYXNzZXJ0VmFsaWQocmVtb3RhYmxlSGVscGVyLCBpbm5lciwgcGFzc1N0eWxlT2ZSZWN1cik7XG4gICAgICAgICAgcmV0dXJuICdyZW1vdGFibGUnO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBhc3NlcnQuZmFpbChYYFVucmVjb2duaXplZCB0eXBlb2YgJHtxKHR5cGVzdHIpfWAsIFR5cGVFcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuXG4gICAgcmV0dXJuIHBhc3NTdHlsZU9mUmVjdXIocGFzc2FibGUpO1xuICB9O1xuICByZXR1cm4gaGFyZGVuKHBhc3NTdHlsZU9mKTtcbn07XG5cbiAgICAgICBjb25zdCBQYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbCA9IFN5bWJvbC5mb3IoJ0BlbmRvIHBhc3NTdHlsZU9mJyk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5QYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbChQYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbCk7XG4gICAgICAgY29uc3QgcGFzc1N0eWxlT2YgPVxuICAoZ2xvYmFsVGhpcyAmJiBnbG9iYWxUaGlzW1Bhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sXSkgfHxcbiAgbWFrZVBhc3NTdHlsZU9mKFtcbiAgICBDb3B5QXJyYXlIZWxwZXIsXG4gICAgQ29weVJlY29yZEhlbHBlcixcbiAgICBUYWdnZWRIZWxwZXIsXG4gICAgRXJyb3JIZWxwZXIsXG4gICAgUmVtb3RhYmxlSGVscGVyLFxuICBdKTskaM2PX29uY2UucGFzc1N0eWxlT2YocGFzc1N0eWxlT2YpO1xuXG4gICAgICAgY29uc3QgYXNzZXJ0UGFzc2FibGUgPSB2YWwgPT4ge1xuICBwYXNzU3R5bGVPZih2YWwpOyAvL1xufTskaM2PX29uY2UuYXNzZXJ0UGFzc2FibGUoYXNzZXJ0UGFzc2FibGUpO1xuaGFyZGVuKGFzc2VydFBhc3NhYmxlKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBpc1Bhc3NhYmxlID0gc3BlY2ltZW4gPT4ge1xuICB0cnkge1xuICAgIC8vXG4gICAgLy9cbiAgICByZXR1cm4gcGFzc1N0eWxlT2Yoc3BlY2ltZW4pICE9PSB1bmRlZmluZWQ7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07JGjNj19vbmNlLmlzUGFzc2FibGUoaXNQYXNzYWJsZSk7XG5oYXJkZW4oaXNQYXNzYWJsZSk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGlzUGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyA9IChuYW1lLCBkZXNjKSA9PlxuICBjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyhuYW1lLCBkZXNjLCBwYXNzU3R5bGVPZik7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgdG9QYXNzYWJsZUVycm9yID0gZXJyID0+IHtcbiAgaGFyZGVuKGVycik7XG4gIGlmIChjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcihlcnIsIHBhc3NTdHlsZU9mKSkge1xuICAgIHJldHVybiBlcnI7XG4gIH1cbiAgY29uc3QgeyBuYW1lLCBtZXNzYWdlIH0gPSBlcnI7XG4gIGNvbnN0IHsgY2F1c2U6IGNhdXNlRGVzYywgZXJyb3JzOiBlcnJvcnNEZXNjIH0gPVxuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoZXJyKTtcbiAgbGV0IGNhdXNlO1xuICBsZXQgZXJyb3JzO1xuICBpZiAoY2F1c2VEZXNjICYmIGlzUGFzc2FibGVFcnJvclByb3BlcnR5RGVzYygnY2F1c2UnLCBjYXVzZURlc2MpKSB7XG4gICAgY2F1c2UgPSBjYXVzZURlc2MudmFsdWU7XG4gIH1cbiAgaWYgKGVycm9yc0Rlc2MgJiYgaXNQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKCdlcnJvcnMnLCBlcnJvcnNEZXNjKSkge1xuICAgIGVycm9ycyA9IGVycm9yc0Rlc2MudmFsdWU7XG4gIH1cblxuICBjb25zdCBlcnJDb25zdHJ1Y3RvciA9IGdldEVycm9yQ29uc3RydWN0b3IoYCR7bmFtZX1gKSB8fCBFcnJvcjtcbiAgY29uc3QgbmV3RXJyb3IgPSBtYWtlRXJyb3IoYCR7bWVzc2FnZX1gLCBlcnJDb25zdHJ1Y3Rvciwge1xuICAgIC8vXG4gICAgY2F1c2UsXG4gICAgZXJyb3JzLFxuICB9KTtcbiAgLy9cbiAgaGFyZGVuKG5ld0Vycm9yKTtcbiAgLy9cbiAgLy9cbiAgLy9cbiAgYW5ub3RhdGVFcnJvcihuZXdFcnJvciwgWGBjb3BpZWQgZnJvbSBlcnJvciAke2Vycn1gKTtcbiAgcGFzc1N0eWxlT2YobmV3RXJyb3IpID09PSAnZXJyb3InIHx8XG4gICAgRmFpbGBFeHBlY3RlZCAke25ld0Vycm9yfSB0byBiZSBhIHBhc3NhYmxlIGVycm9yYDtcbiAgcmV0dXJuIG5ld0Vycm9yO1xufTskaM2PX29uY2UudG9QYXNzYWJsZUVycm9yKHRvUGFzc2FibGVFcnJvcik7XG5oYXJkZW4odG9QYXNzYWJsZUVycm9yKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHRvVGhyb3dhYmxlID0gc3BlY2ltZW4gPT4ge1xuICBoYXJkZW4oc3BlY2ltZW4pO1xuICBpZiAoaXNFcnJvckxpa2Uoc3BlY2ltZW4pKSB7XG4gICAgcmV0dXJuIHRvUGFzc2FibGVFcnJvcigvKiAgICAgICAgICAgICAgICAqLyAoc3BlY2ltZW4pKTtcbiAgfVxuICAvL1xuICAvL1xuICAvL1xuICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihzcGVjaW1lbik7XG4gIGlmIChpc09iamVjdChzcGVjaW1lbikpIHtcbiAgICBzd2l0Y2ggKHBhc3NTdHlsZSkge1xuICAgICAgY2FzZSAnY29weUFycmF5Jzoge1xuICAgICAgICBjb25zdCBlbGVtZW50cyA9IC8qICAgICAgICAgICAgICAgICAgICAqLyAoc3BlY2ltZW4pO1xuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgZWxlbWVudHMpIHtcbiAgICAgICAgICBlbGVtZW50ID09PSB0b1Rocm93YWJsZShlbGVtZW50KSB8fFxuICAgICAgICAgICAgRmFpbGBuZXN0ZWQgdG9UaHJvd2FibGUgY29lcmNpb24gbm90IHlldCBzdXBwb3J0ZWQgJHtlbGVtZW50fWA7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5UmVjb3JkJzoge1xuICAgICAgICBjb25zdCByZWMgPSAvKiAgICAgICAgICAgICAgICAgICAgICovIChzcGVjaW1lbik7XG4gICAgICAgIGZvciAoY29uc3QgdmFsIG9mIHZhbHVlcyhyZWMpKSB7XG4gICAgICAgICAgdmFsID09PSB0b1Rocm93YWJsZSh2YWwpIHx8XG4gICAgICAgICAgICBGYWlsYG5lc3RlZCB0b1Rocm93YWJsZSBjb2VyY2lvbiBub3QgeWV0IHN1cHBvcnRlZCAke3ZhbH1gO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAndGFnZ2VkJzoge1xuICAgICAgICBjb25zdCB0ZyA9IC8qICAgICAgICAgICAgICAgICAgICAgKi8gKHNwZWNpbWVuKTtcbiAgICAgICAgY29uc3QgeyBwYXlsb2FkIH0gPSB0ZztcbiAgICAgICAgcGF5bG9hZCA9PT0gdG9UaHJvd2FibGUocGF5bG9hZCkgfHxcbiAgICAgICAgICBGYWlsYG5lc3RlZCB0b1Rocm93YWJsZSBjb2VyY2lvbiBub3QgeWV0IHN1cHBvcnRlZCAke3BheWxvYWR9YDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgICAgY29uc3QgZXIgPSAvKiAgICAgICAgICAgICAgICAqLyAoc3BlY2ltZW4pO1xuICAgICAgICBlciA9PT0gdG9UaHJvd2FibGUoZXIpIHx8XG4gICAgICAgICAgRmFpbGBuZXN0ZWQgdG9UaHJvd2FibGUgY29lcmNpb24gbm90IHlldCBzdXBwb3J0ZWQgJHtlcn1gO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgdGhyb3cgRmFpbGBBICR7cShwYXNzU3R5bGUpfSBpcyBub3QgdGhyb3dhYmxlOiAke3NwZWNpbWVufWA7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIHJldHVybiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKHNwZWNpbWVuKTtcbn07JGjNj19vbmNlLnRvVGhyb3dhYmxlKHRvVGhyb3dhYmxlKTtcbmhhcmRlbih0b1Rocm93YWJsZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJQYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbCI6WyJQYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbCJdLCJwYXNzU3R5bGVPZiI6WyJwYXNzU3R5bGVPZiJdLCJhc3NlcnRQYXNzYWJsZSI6WyJhc3NlcnRQYXNzYWJsZSJdLCJpc1Bhc3NhYmxlIjpbImlzUGFzc2FibGUiXSwidG9QYXNzYWJsZUVycm9yIjpbInRvUGFzc2FibGVFcnJvciJdLCJ0b1Rocm93YWJsZSI6WyJ0b1Rocm93YWJsZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAADgSdHrhwAAK4cAAAoAAAAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL3JlbW90YWJsZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiUmVtb3RhYmxlSGVscGVyIiwiYXNzZXJ0SWZhY2UiLCJnZXRJbnRlcmZhY2VPZiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwscSxhc3NlcnRDaGVja2VyLGNhbkJlTWV0aG9kLGhhc093blByb3BlcnR5T2YsUEFTU19TVFlMRSxjaGVja1RhZ1JlY29yZCxjaGVja0Z1bmN0aW9uVGFnUmVjb3JkLGlzT2JqZWN0LGdldFRhZyxDWDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJjYW5CZU1ldGhvZFwiLFskaM2PX2EgPT4gKGNhbkJlTWV0aG9kID0gJGjNj19hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIixbJGjNj19hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjNj19hKV1dLFtcIlBBU1NfU1RZTEVcIixbJGjNj19hID0+IChQQVNTX1NUWUxFID0gJGjNj19hKV1dLFtcImNoZWNrVGFnUmVjb3JkXCIsWyRozY9fYSA9PiAoY2hlY2tUYWdSZWNvcmQgPSAkaM2PX2EpXV0sW1wiY2hlY2tGdW5jdGlvblRhZ1JlY29yZFwiLFskaM2PX2EgPT4gKGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQgPSAkaM2PX2EpXV0sW1wiaXNPYmplY3RcIixbJGjNj19hID0+IChpc09iamVjdCA9ICRozY9fYSldXSxbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wiQ1hcIixbJGjNj19hID0+IChDWCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLypcblxuXG5cblxuICovXG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgaXNBcnJheSB9ID0gQXJyYXk7XG5jb25zdCB7XG4gIGdldFByb3RvdHlwZU9mLFxuICBpc0Zyb3plbixcbiAgcHJvdG90eXBlOiBvYmplY3RQcm90b3R5cGUsXG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsXG59ID0gT2JqZWN0O1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgY2hlY2tJZmFjZSA9IChpZmFjZSwgY2hlY2spID0+IHtcbiAgcmV0dXJuIChcbiAgICAvL1xuICAgICh0eXBlb2YgaWZhY2UgPT09ICdzdHJpbmcnIHx8XG4gICAgICAoISFjaGVjayAmJlxuICAgICAgICBDWChcbiAgICAgICAgICBjaGVjayxcbiAgICAgICAgKWBGb3Igbm93LCBpbnRlcmZhY2UgJHtpZmFjZX0gbXVzdCBiZSBhIHN0cmluZzsgdW5pbXBsZW1lbnRlZGApKSAmJlxuICAgIChpZmFjZSA9PT0gJ1JlbW90YWJsZScgfHxcbiAgICAgIGlmYWNlLnN0YXJ0c1dpdGgoJ0FsbGVnZWQ6ICcpIHx8XG4gICAgICBpZmFjZS5zdGFydHNXaXRoKCdEZWJ1Z05hbWU6ICcpIHx8XG4gICAgICAoISFjaGVjayAmJlxuICAgICAgICBDWChjaGVjaylgRm9yIG5vdywgaWZhY2UgJHtxKFxuICAgICAgICAgIGlmYWNlLFxuICAgICAgICApfSBtdXN0IGJlIFwiUmVtb3RhYmxlXCIgb3IgYmVnaW4gd2l0aCBcIkFsbGVnZWQ6IFwiIG9yIFwiRGVidWdOYW1lOiBcIjsgdW5pbXBsZW1lbnRlZGApKVxuICApO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRJZmFjZSA9IGlmYWNlID0+IGNoZWNrSWZhY2UoaWZhY2UsIGFzc2VydENoZWNrZXIpOyRozY9fb25jZS5hc3NlcnRJZmFjZShhc3NlcnRJZmFjZSk7XG5oYXJkZW4oYXNzZXJ0SWZhY2UpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBjaGVja1JlbW90YWJsZVByb3RvT2YgPSAob3JpZ2luYWwsIGNoZWNrKSA9PiB7XG4gIGlzT2JqZWN0KG9yaWdpbmFsKSB8fFxuICAgIEZhaWxgUmVtb3RhYmxlcyBtdXN0IGJlIG9iamVjdHMgb3IgZnVuY3Rpb25zOiAke29yaWdpbmFsfWA7XG5cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgcHJvdG8gPSBnZXRQcm90b3R5cGVPZihvcmlnaW5hbCk7XG4gIGlmIChcbiAgICBwcm90byA9PT0gb2JqZWN0UHJvdG90eXBlIHx8XG4gICAgcHJvdG8gPT09IG51bGwgfHxcbiAgICBwcm90byA9PT0gRnVuY3Rpb24ucHJvdG90eXBlXG4gICkge1xuICAgIHJldHVybiAoXG4gICAgICAhIWNoZWNrICYmXG4gICAgICBDWChjaGVjaylgUmVtb3RhYmxlcyBtdXN0IGJlIGV4cGxpY2l0bHkgZGVjbGFyZWQ6ICR7cShvcmlnaW5hbCl9YFxuICAgICk7XG4gIH1cblxuICBpZiAodHlwZW9mIG9yaWdpbmFsID09PSAnb2JqZWN0Jykge1xuICAgIGNvbnN0IHByb3RvUHJvdG8gPSBnZXRQcm90b3R5cGVPZihwcm90byk7XG4gICAgaWYgKHByb3RvUHJvdG8gIT09IG9iamVjdFByb3RvdHlwZSAmJiBwcm90b1Byb3RvICE9PSBudWxsKSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIGNoZWNrUmVtb3RhYmxlKHByb3RvLCBjaGVjayk7XG4gICAgfVxuICAgIGlmICghY2hlY2tUYWdSZWNvcmQocHJvdG8sICdyZW1vdGFibGUnLCBjaGVjaykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIG9yaWdpbmFsID09PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKCFjaGVja0Z1bmN0aW9uVGFnUmVjb3JkKHByb3RvLCAncmVtb3RhYmxlJywgY2hlY2spKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy9cbiAgY29uc3QgcGFzc1N0eWxlS2V5ID0gLyogICAgICAgICAgICAgICAgICAqLyAoUEFTU19TVFlMRSk7XG4gIGNvbnN0IHRhZ0tleSA9IC8qICAgICAgICAgICAgICAgICAgKi8gKFN5bWJvbC50b1N0cmluZ1RhZyk7XG4gIGNvbnN0IHtcbiAgICAvL1xuICAgIFsvKiAgICAgICAgICAgICAgICAgKi8gKHBhc3NTdHlsZUtleSldOiBfcGFzc1N0eWxlRGVzYyxcbiAgICBbLyogICAgICAgICAgICAgICAgICovICh0YWdLZXkpXTogeyB2YWx1ZTogaWZhY2UgfSxcbiAgICAuLi5yZXN0RGVzY3NcbiAgfSA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocHJvdG8pO1xuXG4gIHJldHVybiAoXG4gICAgKG93bktleXMocmVzdERlc2NzKS5sZW5ndGggPT09IDAgfHxcbiAgICAgICghIWNoZWNrICYmXG4gICAgICAgIENYKFxuICAgICAgICAgIGNoZWNrLFxuICAgICAgICApYFVuZXhwZWN0ZWQgcHJvcGVydGllcyBvbiBSZW1vdGFibGUgUHJvdG8gJHtvd25LZXlzKHJlc3REZXNjcyl9YCkpICYmXG4gICAgY2hlY2tJZmFjZShpZmFjZSwgY2hlY2spXG4gICk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGNvbmZpcm1lZFJlbW90YWJsZXMgPSBuZXcgV2Vha1NldCgpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBjaGVja1JlbW90YWJsZSA9ICh2YWwsIGNoZWNrKSA9PiB7XG4gIGlmIChjb25maXJtZWRSZW1vdGFibGVzLmhhcyh2YWwpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKCFpc0Zyb3plbih2YWwpKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhY2hlY2sgJiYgQ1goY2hlY2spYGNhbm5vdCBzZXJpYWxpemUgbm9uLWZyb3plbiBvYmplY3RzIGxpa2UgJHt2YWx9YFxuICAgICk7XG4gIH1cbiAgLy9cbiAgaWYgKCFSZW1vdGFibGVIZWxwZXIuY2FuQmVWYWxpZCh2YWwsIGNoZWNrKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCByZXN1bHQgPSBjaGVja1JlbW90YWJsZVByb3RvT2YodmFsLCBjaGVjayk7XG4gIGlmIChyZXN1bHQpIHtcbiAgICBjb25maXJtZWRSZW1vdGFibGVzLmFkZCh2YWwpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBnZXRJbnRlcmZhY2VPZiA9IHZhbCA9PiB7XG4gIGlmIChcbiAgICAhaXNPYmplY3QodmFsKSB8fFxuICAgIHZhbFtQQVNTX1NUWUxFXSAhPT0gJ3JlbW90YWJsZScgfHxcbiAgICAhY2hlY2tSZW1vdGFibGUodmFsKVxuICApIHtcbiAgICAvL1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgLy9cbiAgcmV0dXJuIGdldFRhZyh2YWwpO1xufTskaM2PX29uY2UuZ2V0SW50ZXJmYWNlT2YoZ2V0SW50ZXJmYWNlT2YpO1xuaGFyZGVuKGdldEludGVyZmFjZU9mKTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBSZW1vdGFibGVIZWxwZXIgPSBoYXJkZW4oe1xuICBzdHlsZU5hbWU6ICdyZW1vdGFibGUnLFxuXG4gIGNhbkJlVmFsaWQ6IChjYW5kaWRhdGUsIGNoZWNrID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgY29uc3QgdmFsaWRUeXBlID1cbiAgICAgIChpc09iamVjdChjYW5kaWRhdGUpIHx8XG4gICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgQ1goY2hlY2spYGNhbm5vdCBzZXJpYWxpemUgbm9uLW9iamVjdHMgYXMgUmVtb3RhYmxlICR7Y2FuZGlkYXRlfWApKSAmJlxuICAgICAgKCFpc0FycmF5KGNhbmRpZGF0ZSkgfHxcbiAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICBDWChjaGVjaylgY2Fubm90IHNlcmlhbGl6ZSBhcnJheXMgYXMgUmVtb3RhYmxlICR7Y2FuZGlkYXRlfWApKTtcbiAgICBpZiAoIXZhbGlkVHlwZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IGRlc2NzID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xuICAgIGlmICh0eXBlb2YgY2FuZGlkYXRlID09PSAnb2JqZWN0Jykge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICByZXR1cm4gb3duS2V5cyhkZXNjcykuZXZlcnkoa2V5ID0+IHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAvL1xuICAgICAgICAgIChoYXNPd25Qcm9wZXJ0eU9mKGRlc2NzWy8qICAgICAgICAgICAgICAgICAqLyAoa2V5KV0sICd2YWx1ZScpIHx8XG4gICAgICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgICAgICBDWChjaGVjaylgY2Fubm90IHNlcmlhbGl6ZSBSZW1vdGFibGVzIHdpdGggYWNjZXNzb3JzIGxpa2UgJHtxKFxuICAgICAgICAgICAgICAgIFN0cmluZyhrZXkpLFxuICAgICAgICAgICAgICApfSBpbiAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgICAgICAgICAoKGtleSA9PT0gU3ltYm9sLnRvU3RyaW5nVGFnICYmIGNoZWNrSWZhY2UoY2FuZGlkYXRlW2tleV0sIGNoZWNrKSkgfHxcbiAgICAgICAgICAgICgoY2FuQmVNZXRob2QoY2FuZGlkYXRlW2tleV0pIHx8XG4gICAgICAgICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgICAgICAgQ1goY2hlY2spYGNhbm5vdCBzZXJpYWxpemUgUmVtb3RhYmxlcyB3aXRoIG5vbi1tZXRob2RzIGxpa2UgJHtxKFxuICAgICAgICAgICAgICAgICAgU3RyaW5nKGtleSksXG4gICAgICAgICAgICAgICAgKX0gaW4gJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgICAgICAgICAgIChrZXkgIT09IFBBU1NfU1RZTEUgfHxcbiAgICAgICAgICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgICAgICAgICAgQ1goY2hlY2spYEEgcGFzcy1ieS1yZW1vdGUgY2Fubm90IHNoYWRvdyAke3EoUEFTU19TVFlMRSl9YCkpKSlcbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGNhbmRpZGF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBjb25zdCB7XG4gICAgICAgIG5hbWU6IG5hbWVEZXNjLFxuICAgICAgICBsZW5ndGg6IGxlbmd0aERlc2MsXG4gICAgICAgIC8vXG4gICAgICAgIFtTeW1ib2wudG9TdHJpbmdUYWddOiB0b1N0cmluZ1RhZ0Rlc2MsXG4gICAgICAgIC4uLnJlc3REZXNjc1xuICAgICAgfSA9IGRlc2NzO1xuICAgICAgY29uc3QgcmVzdEtleXMgPSBvd25LZXlzKHJlc3REZXNjcyk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAoKG5hbWVEZXNjICYmIHR5cGVvZiBuYW1lRGVzYy52YWx1ZSA9PT0gJ3N0cmluZycpIHx8XG4gICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgIENYKGNoZWNrKWBGYXIgZnVuY3Rpb24gbmFtZSBtdXN0IGJlIGEgc3RyaW5nLCBpbiAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgICAgICAgKChsZW5ndGhEZXNjICYmIHR5cGVvZiBsZW5ndGhEZXNjLnZhbHVlID09PSAnbnVtYmVyJykgfHxcbiAgICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgICAgQ1goXG4gICAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgICAgKWBGYXIgZnVuY3Rpb24gbGVuZ3RoIG11c3QgYmUgYSBudW1iZXIsIGluICR7Y2FuZGlkYXRlfWApKSAmJlxuICAgICAgICAodG9TdHJpbmdUYWdEZXNjID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAoKHR5cGVvZiB0b1N0cmluZ1RhZ0Rlc2MudmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgICAgICBDWChcbiAgICAgICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICAgICAgKWBGYXIgZnVuY3Rpb24gQEB0b1N0cmluZ1RhZyBtdXN0IGJlIGEgc3RyaW5nLCBpbiAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgICAgICAgICAgIGNoZWNrSWZhY2UodG9TdHJpbmdUYWdEZXNjLnZhbHVlLCBjaGVjaykpKSAmJlxuICAgICAgICAocmVzdEtleXMubGVuZ3RoID09PSAwIHx8XG4gICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgIENYKFxuICAgICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICAgIClgRmFyIGZ1bmN0aW9ucyB1bmV4cGVjdGVkIHByb3BlcnRpZXMgYmVzaWRlcyAubmFtZSBhbmQgLmxlbmd0aCAke3Jlc3RLZXlzfWApKVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuICEhY2hlY2sgJiYgQ1goY2hlY2spYHVucmVjb2duaXplZCB0eXBlb2YgJHtjYW5kaWRhdGV9YDtcbiAgfSxcblxuICBhc3NlcnRSZXN0VmFsaWQ6IGNhbmRpZGF0ZSA9PiBjaGVja1JlbW90YWJsZShjYW5kaWRhdGUsIGFzc2VydENoZWNrZXIpLFxuXG4gIGV2ZXJ5OiAoX3Bhc3NhYmxlLCBfZm4pID0+IHRydWUsXG59KTskaM2PX29uY2UuUmVtb3RhYmxlSGVscGVyKFJlbW90YWJsZUhlbHBlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3NlcnRJZmFjZSI6WyJhc3NlcnRJZmFjZSJdLCJnZXRJbnRlcmZhY2VPZiI6WyJnZXRJbnRlcmZhY2VPZiJdLCJSZW1vdGFibGVIZWxwZXIiOlsiUmVtb3RhYmxlSGVscGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMeMfzh6DgAAeg4AACsAAABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvc2FmZS1wcm9taXNlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Byb21pc2Uta2l0IiwiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbImFzc2VydFNhZmVQcm9taXNlIiwiaXNTYWZlUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGlzUHJvbWlzZSxxLGFzc2VydENoZWNrZXIsaGFzT3duUHJvcGVydHlPZixDWDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIixbJGjNj19hID0+IChpc1Byb21pc2UgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLFskaM2PX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaM2PX2EpXV0sW1wiQ1hcIixbJGjNj19hID0+IChDWCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbmNvbnN0IHsgaXNGcm96ZW4sIGdldFByb3RvdHlwZU9mLCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgfSA9IE9iamVjdDtcbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgdG9TdHJpbmdUYWcgfSA9IFN5bWJvbDtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgY2hlY2tQcm9taXNlT3duS2V5cyA9IChwciwgY2hlY2spID0+IHtcbiAgY29uc3Qga2V5cyA9IG93bktleXMocHIpO1xuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLypcblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgdW5rbm93bktleXMgPSBrZXlzLmZpbHRlcihcbiAgICBrZXkgPT4gdHlwZW9mIGtleSAhPT0gJ3N5bWJvbCcgfHwgIWhhc093blByb3BlcnR5T2YoUHJvbWlzZS5wcm90b3R5cGUsIGtleSksXG4gICk7XG5cbiAgaWYgKHVua25vd25LZXlzLmxlbmd0aCAhPT0gMCkge1xuICAgIHJldHVybiBDWChcbiAgICAgIGNoZWNrLFxuICAgIClgJHtwcn0gLSBNdXN0IG5vdCBoYXZlIGFueSBvd24gcHJvcGVydGllczogJHtxKHVua25vd25LZXlzKX1gO1xuICB9XG5cbiAgLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgY2hlY2tTYWZlT3duS2V5ID0ga2V5ID0+IHtcbiAgICBpZiAoa2V5ID09PSB0b1N0cmluZ1RhZykge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBjb25zdCB0YWdEZXNjID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByLCB0b1N0cmluZ1RhZyk7XG4gICAgICBhc3NlcnQodGFnRGVzYyAhPT0gdW5kZWZpbmVkKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChoYXNPd25Qcm9wZXJ0eU9mKHRhZ0Rlc2MsICd2YWx1ZScpIHx8XG4gICAgICAgICAgQ1goXG4gICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICApYE93biBAQHRvU3RyaW5nVGFnIG11c3QgYmUgYSBkYXRhIHByb3BlcnR5LCBub3QgYW4gYWNjZXNzb3I6ICR7cSh0YWdEZXNjKX1gKSAmJlxuICAgICAgICAodHlwZW9mIHRhZ0Rlc2MudmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgQ1goXG4gICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICApYE93biBAQHRvU3RyaW5nVGFnIHZhbHVlIG11c3QgYmUgYSBzdHJpbmc6ICR7cSh0YWdEZXNjLnZhbHVlKX1gKSAmJlxuICAgICAgICAoIXRhZ0Rlc2MuZW51bWVyYWJsZSB8fFxuICAgICAgICAgIENYKGNoZWNrKWBPd24gQEB0b1N0cmluZ1RhZyBtdXN0IG5vdCBiZSBlbnVtZXJhYmxlOiAke3EodGFnRGVzYyl9YClcbiAgICAgICk7XG4gICAgfVxuICAgIGNvbnN0IHZhbCA9IHByW2tleV07XG4gICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKFxuICAgICAgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiZcbiAgICAgIHZhbCAhPT0gbnVsbCAmJlxuICAgICAgaXNGcm96ZW4odmFsKSAmJlxuICAgICAgZ2V0UHJvdG90eXBlT2YodmFsKSA9PT0gT2JqZWN0LnByb3RvdHlwZVxuICAgICkge1xuICAgICAgY29uc3Qgc3ViS2V5cyA9IG93bktleXModmFsKTtcbiAgICAgIGlmIChzdWJLZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgaWYgKFxuICAgICAgICBzdWJLZXlzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICBzdWJLZXlzWzBdID09PSAnZGVzdHJveWVkJyAmJlxuICAgICAgICB2YWwuZGVzdHJveWVkID09PSBmYWxzZVxuICAgICAgKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gQ1goXG4gICAgICBjaGVjayxcbiAgICApYFVuZXhwZWN0ZWQgTm9kZSBhc3luY19ob29rcyBhZGRpdGlvbnMgdG8gcHJvbWlzZTogJHtwcn0uJHtxKFxuICAgICAgU3RyaW5nKGtleSksXG4gICAgKX0gaXMgJHt2YWx9YDtcbiAgfTtcblxuICByZXR1cm4ga2V5cy5ldmVyeShjaGVja1NhZmVPd25LZXkpO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGNoZWNrU2FmZVByb21pc2UgPSAocHIsIGNoZWNrKSA9PiB7XG4gIHJldHVybiAoXG4gICAgKGlzRnJvemVuKHByKSB8fCBDWChjaGVjaylgJHtwcn0gLSBNdXN0IGJlIGZyb3plbmApICYmXG4gICAgKGlzUHJvbWlzZShwcikgfHwgQ1goY2hlY2spYCR7cHJ9IC0gTXVzdCBiZSBhIHByb21pc2VgKSAmJlxuICAgIChnZXRQcm90b3R5cGVPZihwcikgPT09IFByb21pc2UucHJvdG90eXBlIHx8XG4gICAgICBDWChjaGVjaylgJHtwcn0gLSBNdXN0IGluaGVyaXQgZnJvbSBQcm9taXNlLnByb3RvdHlwZTogJHtxKFxuICAgICAgICBnZXRQcm90b3R5cGVPZihwciksXG4gICAgICApfWApICYmXG4gICAgY2hlY2tQcm9taXNlT3duS2V5cygvKiAgICAgICAgICAgICAgICAgICovIChwciksIGNoZWNrKVxuICApO1xufTtcbmhhcmRlbihjaGVja1NhZmVQcm9taXNlKTtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgaXNTYWZlUHJvbWlzZSA9IHByID0+IGNoZWNrU2FmZVByb21pc2UocHIsIHggPT4geCk7JGjNj19vbmNlLmlzU2FmZVByb21pc2UoaXNTYWZlUHJvbWlzZSk7XG5oYXJkZW4oaXNTYWZlUHJvbWlzZSk7XG5cbiAgICAgICBjb25zdCBhc3NlcnRTYWZlUHJvbWlzZSA9IHByID0+IGNoZWNrU2FmZVByb21pc2UocHIsIGFzc2VydENoZWNrZXIpOyRozY9fb25jZS5hc3NlcnRTYWZlUHJvbWlzZShhc3NlcnRTYWZlUHJvbWlzZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1NhZmVQcm9taXNlIjpbImlzU2FmZVByb21pc2UiXSwiYXNzZXJ0U2FmZVByb21pc2UiOlsiYXNzZXJ0U2FmZVByb21pc2UiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAuj7NoXkIAAB5CAAAJQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9zdHJpbmcuanN7ImltcG9ydHMiOlsiQGVuZG8vZW52LW9wdGlvbnMiLCJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJhc3NlcnRQYXNzYWJsZVN0cmluZyIsImFzc2VydFdlbGxGb3JtZWRTdHJpbmciLCJpc1dlbGxGb3JtZWRTdHJpbmciXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBnZXRFbnZpcm9ubWVudE9wdGlvbixGYWlsOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZW52LW9wdGlvbnNcIiwgW1tcImdldEVudmlyb25tZW50T3B0aW9uXCIsWyRozY9fYSA9PiAoZ2V0RW52aXJvbm1lbnRPcHRpb24gPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV1dKTtcblxuXG4vL1xuY29uc3QgaGFzV2VsbEZvcm1lZFN0cmluZ01ldGhvZCA9ICEhU3RyaW5nLnByb3RvdHlwZS5pc1dlbGxGb3JtZWQ7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgaXNXZWxsRm9ybWVkU3RyaW5nID0gaGFzV2VsbEZvcm1lZFN0cmluZ01ldGhvZFxuICA/IHN0ciA9PiB0eXBlb2Ygc3RyID09PSAnc3RyaW5nJyAmJiBzdHIuaXNXZWxsRm9ybWVkKClcbiAgOiBzdHIgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgY2ggb2Ygc3RyKSB7XG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IGNwID0gLyogICAgICAgICAgICAgICAgICovIChjaC5jb2RlUG9pbnRBdCgwKSk7XG4gICAgICAgIGlmIChjcCA+PSAweGQ4MDAgJiYgY3AgPD0gMHhkZmZmKSB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9OyRozY9fb25jZS5pc1dlbGxGb3JtZWRTdHJpbmcoaXNXZWxsRm9ybWVkU3RyaW5nKTtcbmhhcmRlbihpc1dlbGxGb3JtZWRTdHJpbmcpO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydFdlbGxGb3JtZWRTdHJpbmcgPSBzdHIgPT4ge1xuICBpc1dlbGxGb3JtZWRTdHJpbmcoc3RyKSB8fCBGYWlsYEV4cGVjdGVkIHdlbGwtZm9ybWVkIHVuaWNvZGUgc3RyaW5nOiAke3N0cn1gO1xufTskaM2PX29uY2UuYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyhhc3NlcnRXZWxsRm9ybWVkU3RyaW5nKTtcbmhhcmRlbihhc3NlcnRXZWxsRm9ybWVkU3RyaW5nKTtcblxuY29uc3QgT05MWV9XRUxMX0ZPUk1FRF9TVFJJTkdTX1BBU1NBQkxFID1cbiAgZ2V0RW52aXJvbm1lbnRPcHRpb24oJ09OTFlfV0VMTF9GT1JNRURfU1RSSU5HU19QQVNTQUJMRScsICdkaXNhYmxlZCcsIFtcbiAgICAnZW5hYmxlZCcsXG4gIF0pID09PSAnZW5hYmxlZCc7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRQYXNzYWJsZVN0cmluZyA9IHN0ciA9PiB7XG4gIHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnIHx8IEZhaWxgRXhwZWN0ZWQgc3RyaW5nICR7c3RyfWA7XG4gICFPTkxZX1dFTExfRk9STUVEX1NUUklOR1NfUEFTU0FCTEUgfHwgYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyhzdHIpO1xufTskaM2PX29uY2UuYXNzZXJ0UGFzc2FibGVTdHJpbmcoYXNzZXJ0UGFzc2FibGVTdHJpbmcpO1xuaGFyZGVuKGFzc2VydFBhc3NhYmxlU3RyaW5nKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzV2VsbEZvcm1lZFN0cmluZyI6WyJpc1dlbGxGb3JtZWRTdHJpbmciXSwiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyI6WyJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIl0sImFzc2VydFBhc3NhYmxlU3RyaW5nIjpbImFzc2VydFBhc3NhYmxlU3RyaW5nIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAB0bVHblCgAA5QoAACUAAABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvc3ltYm9sLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbImFzc2VydFBhc3NhYmxlU3ltYm9sIiwiaXNQYXNzYWJsZVN5bWJvbCIsIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCIsInBhc3NhYmxlU3ltYm9sRm9yTmFtZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwscTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXV0pO1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5cbi8qXG5cbiAqL1xuY29uc3Qgd2VsbEtub3duU3ltYm9sTmFtZXMgPSBuZXcgTWFwKFxuICBvd25LZXlzKFN5bWJvbClcbiAgICAuZmlsdGVyKFxuICAgICAgbmFtZSA9PiB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycgJiYgdHlwZW9mIFN5bWJvbFtuYW1lXSA9PT0gJ3N5bWJvbCcsXG4gICAgKVxuICAgIC5maWx0ZXIobmFtZSA9PiB7XG4gICAgICAvL1xuICAgICAgIW5hbWUuc3RhcnRzV2l0aCgnQEAnKSB8fFxuICAgICAgICBGYWlsYERpZCBub3QgZXhwZWN0IFN5bWJvbCB0byBoYXZlIGEgc3ltYm9sLXZhbHVlZCBwcm9wZXJ0eSBuYW1lIHN0YXJ0aW5nIHdpdGggXCJAQFwiICR7cShcbiAgICAgICAgICBuYW1lLFxuICAgICAgICApfWA7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KVxuICAgIC8vXG4gICAgLm1hcChuYW1lID0+IFtTeW1ib2xbbmFtZV0sIGBAQCR7bmFtZX1gXSksXG4pO1xuXG4vKlxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgaXNQYXNzYWJsZVN5bWJvbCA9IHN5bSA9PlxuICB0eXBlb2Ygc3ltID09PSAnc3ltYm9sJyAmJlxuICAodHlwZW9mIFN5bWJvbC5rZXlGb3Ioc3ltKSA9PT0gJ3N0cmluZycgfHwgd2VsbEtub3duU3ltYm9sTmFtZXMuaGFzKHN5bSkpOyRozY9fb25jZS5pc1Bhc3NhYmxlU3ltYm9sKGlzUGFzc2FibGVTeW1ib2wpO1xuaGFyZGVuKGlzUGFzc2FibGVTeW1ib2wpO1xuXG4gICAgICAgY29uc3QgYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSBzeW0gPT5cbiAgaXNQYXNzYWJsZVN5bWJvbChzeW0pIHx8XG4gIEZhaWxgT25seSByZWdpc3RlcmVkIHN5bWJvbHMgb3Igd2VsbC1rbm93biBzeW1ib2xzIGFyZSBwYXNzYWJsZTogJHtxKHN5bSl9YDskaM2PX29uY2UuYXNzZXJ0UGFzc2FibGVTeW1ib2woYXNzZXJ0UGFzc2FibGVTeW1ib2wpO1xuaGFyZGVuKGFzc2VydFBhc3NhYmxlU3ltYm9sKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbmFtZUZvclBhc3NhYmxlU3ltYm9sID0gc3ltID0+IHtcbiAgY29uc3QgbmFtZSA9IFN5bWJvbC5rZXlGb3Ioc3ltKTtcbiAgaWYgKG5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB3ZWxsS25vd25TeW1ib2xOYW1lcy5nZXQoc3ltKTtcbiAgfVxuICBpZiAobmFtZS5zdGFydHNXaXRoKCdAQCcpKSB7XG4gICAgcmV0dXJuIGBAQCR7bmFtZX1gO1xuICB9XG4gIHJldHVybiBuYW1lO1xufTskaM2PX29uY2UubmFtZUZvclBhc3NhYmxlU3ltYm9sKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCk7XG5oYXJkZW4obmFtZUZvclBhc3NhYmxlU3ltYm9sKTtcblxuY29uc3QgQXRBdFByZWZpeFBhdHRlcm4gPSAvXkBAKC4qKSQvO1xuaGFyZGVuKEF0QXRQcmVmaXhQYXR0ZXJuKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSBuYW1lID0+IHtcbiAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgY29uc3QgbWF0Y2ggPSBBdEF0UHJlZml4UGF0dGVybi5leGVjKG5hbWUpO1xuICBpZiAobWF0Y2gpIHtcbiAgICBjb25zdCBzdWZmaXggPSBtYXRjaFsxXTtcbiAgICBpZiAoc3VmZml4LnN0YXJ0c1dpdGgoJ0BAJykpIHtcbiAgICAgIHJldHVybiBTeW1ib2wuZm9yKHN1ZmZpeCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHN5bSA9IFN5bWJvbFtzdWZmaXhdO1xuICAgICAgaWYgKHR5cGVvZiBzeW0gPT09ICdzeW1ib2wnKSB7XG4gICAgICAgIHJldHVybiBzeW07XG4gICAgICB9XG4gICAgICBGYWlsYFJlc2VydmVkIGZvciB3ZWxsIGtub3duIHN5bWJvbCAke3Eoc3VmZml4KX06ICR7cShuYW1lKX1gO1xuICAgIH1cbiAgfVxuICByZXR1cm4gU3ltYm9sLmZvcihuYW1lKTtcbn07JGjNj19vbmNlLnBhc3NhYmxlU3ltYm9sRm9yTmFtZShwYXNzYWJsZVN5bWJvbEZvck5hbWUpO1xuaGFyZGVuKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1Bhc3NhYmxlU3ltYm9sIjpbImlzUGFzc2FibGVTeW1ib2wiXSwiYXNzZXJ0UGFzc2FibGVTeW1ib2wiOlsiYXNzZXJ0UGFzc2FibGVTeW1ib2wiXSwibmFtZUZvclBhc3NhYmxlU3ltYm9sIjpbIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCJdLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiOlsicGFzc2FibGVTeW1ib2xGb3JOYW1lIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPLl8lDJBwAAyQcAACUAAABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvdGFnZ2VkLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJUYWdnZWRIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLGFzc2VydENoZWNrZXIsY2hlY2tUYWdSZWNvcmQsUEFTU19TVFlMRSxnZXRPd25EYXRhRGVzY3JpcHRvcixjaGVja1Bhc3NTdHlsZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJjaGVja1RhZ1JlY29yZFwiLFskaM2PX2EgPT4gKGNoZWNrVGFnUmVjb3JkID0gJGjNj19hKV1dLFtcIlBBU1NfU1RZTEVcIixbJGjNj19hID0+IChQQVNTX1NUWUxFID0gJGjNj19hKV1dLFtcImdldE93bkRhdGFEZXNjcmlwdG9yXCIsWyRozY9fYSA9PiAoZ2V0T3duRGF0YURlc2NyaXB0b3IgPSAkaM2PX2EpXV0sW1wiY2hlY2tQYXNzU3R5bGVcIixbJGjNj19hID0+IChjaGVja1Bhc3NTdHlsZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cbiAqL1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMgfSA9IE9iamVjdDtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBUYWdnZWRIZWxwZXIgPSBoYXJkZW4oe1xuICBzdHlsZU5hbWU6ICd0YWdnZWQnLFxuXG4gIGNhbkJlVmFsaWQ6IChjYW5kaWRhdGUsIGNoZWNrID0gdW5kZWZpbmVkKSA9PlxuICAgIGNoZWNrUGFzc1N0eWxlKGNhbmRpZGF0ZSwgY2FuZGlkYXRlW1BBU1NfU1RZTEVdLCAndGFnZ2VkJywgY2hlY2spLFxuXG4gIGFzc2VydFJlc3RWYWxpZDogKGNhbmRpZGF0ZSwgcGFzc1N0eWxlT2ZSZWN1cikgPT4ge1xuICAgIGNoZWNrVGFnUmVjb3JkKGNhbmRpZGF0ZSwgJ3RhZ2dlZCcsIGFzc2VydENoZWNrZXIpO1xuXG4gICAgLy9cbiAgICBjb25zdCBwYXNzU3R5bGVLZXkgPSAvKiAgICAgICAgICAgICAgICAgICovIChQQVNTX1NUWUxFKTtcbiAgICBjb25zdCB0YWdLZXkgPSAvKiAgICAgICAgICAgICAgICAgICovIChTeW1ib2wudG9TdHJpbmdUYWcpO1xuICAgIGNvbnN0IHtcbiAgICAgIC8vXG4gICAgICBbLyogICAgICAgICAgICAgICAgICovIChwYXNzU3R5bGVLZXkpXTogX3Bhc3NTdHlsZURlc2MsXG4gICAgICBbLyogICAgICAgICAgICAgICAgICovICh0YWdLZXkpXTogX2xhYmVsRGVzYyxcbiAgICAgIHBheWxvYWQ6IF9wYXlsb2FkRGVzYywgLy9cbiAgICAgIC4uLnJlc3REZXNjc1xuICAgIH0gPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGNhbmRpZGF0ZSk7XG4gICAgb3duS2V5cyhyZXN0RGVzY3MpLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgRmFpbGBVbmV4cGVjdGVkIHByb3BlcnRpZXMgb24gdGFnZ2VkIHJlY29yZCAke293bktleXMocmVzdERlc2NzKX1gO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIHBhc3NTdHlsZU9mUmVjdXIoXG4gICAgICBnZXRPd25EYXRhRGVzY3JpcHRvcihjYW5kaWRhdGUsICdwYXlsb2FkJywgdHJ1ZSwgYXNzZXJ0Q2hlY2tlcikudmFsdWUsXG4gICAgKTtcbiAgfSxcbn0pOyRozY9fb25jZS5UYWdnZWRIZWxwZXIoVGFnZ2VkSGVscGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlRhZ2dlZEhlbHBlciI6WyJUYWdnZWRIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA7twisGcJAABnCQAAKQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlT2YuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRSZWNvcmQiLCJhc3NlcnRSZW1vdGFibGUiLCJpc0NvcHlBcnJheSIsImlzUmVjb3JkIiwiaXNSZW1vdGFibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHEscGFzc1N0eWxlT2Y7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXV1dXSk7XG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IGlzQ29weUFycmF5ID0gYXJyID0+IHBhc3NTdHlsZU9mKGFycikgPT09ICdjb3B5QXJyYXknOyRozY9fb25jZS5pc0NvcHlBcnJheShpc0NvcHlBcnJheSk7XG5oYXJkZW4oaXNDb3B5QXJyYXkpO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgaXNSZWNvcmQgPSByZWNvcmQgPT4gcGFzc1N0eWxlT2YocmVjb3JkKSA9PT0gJ2NvcHlSZWNvcmQnOyRozY9fb25jZS5pc1JlY29yZChpc1JlY29yZCk7XG5oYXJkZW4oaXNSZWNvcmQpO1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGlzUmVtb3RhYmxlID0gcmVtb3RhYmxlID0+IHBhc3NTdHlsZU9mKHJlbW90YWJsZSkgPT09ICdyZW1vdGFibGUnOyRozY9fb25jZS5pc1JlbW90YWJsZShpc1JlbW90YWJsZSk7XG5oYXJkZW4oaXNSZW1vdGFibGUpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBhc3NlcnRDb3B5QXJyYXkgPSAoYXJyLCBvcHROYW1lT2ZBcnJheSA9ICdBbGxlZ2VkIGFycmF5JykgPT4ge1xuICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihhcnIpO1xuICBwYXNzU3R5bGUgPT09ICdjb3B5QXJyYXknIHx8XG4gICAgRmFpbGAke3Eob3B0TmFtZU9mQXJyYXkpfSAke2Fycn0gbXVzdCBiZSBhIHBhc3MtYnktY29weSBhcnJheSwgbm90ICR7cShcbiAgICAgIHBhc3NTdHlsZSxcbiAgICApfWA7XG59OyRozY9fb25jZS5hc3NlcnRDb3B5QXJyYXkoYXNzZXJ0Q29weUFycmF5KTtcbmhhcmRlbihhc3NlcnRDb3B5QXJyYXkpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBhc3NlcnRSZWNvcmQgPSAocmVjb3JkLCBvcHROYW1lT2ZSZWNvcmQgPSAnQWxsZWdlZCByZWNvcmQnKSA9PiB7XG4gIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHJlY29yZCk7XG4gIHBhc3NTdHlsZSA9PT0gJ2NvcHlSZWNvcmQnIHx8XG4gICAgRmFpbGAke3Eob3B0TmFtZU9mUmVjb3JkKX0gJHtyZWNvcmR9IG11c3QgYmUgYSBwYXNzLWJ5LWNvcHkgcmVjb3JkLCBub3QgJHtxKFxuICAgICAgcGFzc1N0eWxlLFxuICAgICl9YDtcbn07JGjNj19vbmNlLmFzc2VydFJlY29yZChhc3NlcnRSZWNvcmQpO1xuaGFyZGVuKGFzc2VydFJlY29yZCk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGFzc2VydFJlbW90YWJsZSA9IChcbiAgcmVtb3RhYmxlLFxuICBvcHROYW1lT2ZSZW1vdGFibGUgPSAnQWxsZWdlZCByZW1vdGFibGUnLFxuKSA9PiB7XG4gIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHJlbW90YWJsZSk7XG4gIHBhc3NTdHlsZSA9PT0gJ3JlbW90YWJsZScgfHxcbiAgICBGYWlsYCR7cShvcHROYW1lT2ZSZW1vdGFibGUpfSAke3JlbW90YWJsZX0gbXVzdCBiZSBhIHJlbW90YWJsZSwgbm90ICR7cShcbiAgICAgIHBhc3NTdHlsZSxcbiAgICApfWA7XG59OyRozY9fb25jZS5hc3NlcnRSZW1vdGFibGUoYXNzZXJ0UmVtb3RhYmxlKTtcbmhhcmRlbihhc3NlcnRSZW1vdGFibGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNDb3B5QXJyYXkiOlsiaXNDb3B5QXJyYXkiXSwiaXNSZWNvcmQiOlsiaXNSZWNvcmQiXSwiaXNSZW1vdGFibGUiOlsiaXNSZW1vdGFibGUiXSwiYXNzZXJ0Q29weUFycmF5IjpbImFzc2VydENvcHlBcnJheSJdLCJhc3NlcnRSZWNvcmQiOlsiYXNzZXJ0UmVjb3JkIl0sImFzc2VydFJlbW90YWJsZSI6WyJhc3NlcnRSZW1vdGFibGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAJAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB1TZLc7w4AAO8OAAAeAAAAQGVuZG8vcGF0dGVybnMtdjEuNS4wL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2tleXMvY2hlY2tLZXkuanMiLCIuL3NyYy9rZXlzL2NvcHlTZXQuanMiLCIuL3NyYy9rZXlzL2NvcHlCYWcuanMiLCIuL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIiwiLi9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzIiwiLi9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIiwiLi9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIiwiLi9zcmMvcGF0dGVybnMvZ2V0R3VhcmRQYXlsb2Fkcy5qcyIsIi4vc3JjL3R5cGVzLmpzIiwiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qcyIsIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0S2V5IiwiYXNzZXJ0S2V5IiwiYmFnVW5pb24iLCJiYWdVbmlvbiIsImVsZW1lbnRzSXNEaXNqb2ludCIsImVsZW1lbnRzSXNEaXNqb2ludCIsImdldE1ldGhvZEd1YXJkUGF5bG9hZCIsImdldE1ldGhvZEd1YXJkUGF5bG9hZCIsImdldFJhbmtDb3ZlciIsImdldFJhbmtDb3ZlciIsInNldENvbXBhcmUiLCJzZXRDb21wYXJlIixudWxsLG51bGwsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2tleXMvY2hlY2tLZXkuanNcIiwgW11dLFtcIi4vc3JjL2tleXMvY29weVNldC5qc1wiLCBbXV0sW1wiLi9zcmMva2V5cy9jb3B5QmFnLmpzXCIsIFtdXSxbXCIuL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzXCIsIFtdXSxbXCIuL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanNcIiwgW11dLFtcIi4vc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc1wiLCBbXV0sW1wiLi9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzXCIsIFtdXSxbXCIuL3NyYy9wYXR0ZXJucy9nZXRHdWFyZFBheWxvYWRzLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV0sW1wiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qc1wiLCBbXV0sW1wiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9rZXlzL2NoZWNrS2V5LmpzIjpbWyJpc0tleSIsImlzS2V5Il0sWyJhc3NlcnRLZXkiLCJhc3NlcnRLZXkiXSxbImFzc2VydFNjYWxhcktleSIsImFzc2VydFNjYWxhcktleSJdLFsiaXNDb3B5U2V0IiwiaXNDb3B5U2V0Il0sWyJhc3NlcnRDb3B5U2V0IiwiYXNzZXJ0Q29weVNldCJdLFsibWFrZUNvcHlTZXQiLCJtYWtlQ29weVNldCJdLFsiZ2V0Q29weVNldEtleXMiLCJnZXRDb3B5U2V0S2V5cyJdLFsiaXNDb3B5QmFnIiwiaXNDb3B5QmFnIl0sWyJhc3NlcnRDb3B5QmFnIiwiYXNzZXJ0Q29weUJhZyJdLFsibWFrZUNvcHlCYWciLCJtYWtlQ29weUJhZyJdLFsibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiLCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyJdLFsiZ2V0Q29weUJhZ0VudHJpZXMiLCJnZXRDb3B5QmFnRW50cmllcyJdLFsiaXNDb3B5TWFwIiwiaXNDb3B5TWFwIl0sWyJhc3NlcnRDb3B5TWFwIiwiYXNzZXJ0Q29weU1hcCJdLFsibWFrZUNvcHlNYXAiLCJtYWtlQ29weU1hcCJdLFsiZ2V0Q29weU1hcEVudHJpZXMiLCJnZXRDb3B5TWFwRW50cmllcyJdXSwiLi9zcmMva2V5cy9jb3B5U2V0LmpzIjpbWyJjb2VyY2VUb0VsZW1lbnRzIiwiY29lcmNlVG9FbGVtZW50cyJdXSwiLi9zcmMva2V5cy9jb3B5QmFnLmpzIjpbWyJjb2VyY2VUb0JhZ0VudHJpZXMiLCJjb2VyY2VUb0JhZ0VudHJpZXMiXV0sIi4vc3JjL2tleXMvY29tcGFyZUtleXMuanMiOltbImJhZ0NvbXBhcmUiLCJiYWdDb21wYXJlIl0sWyJzZXRDb21wYXJlIiwic2V0Q29tcGFyZSJdLFsiY29tcGFyZUtleXMiLCJjb21wYXJlS2V5cyJdLFsia2V5TFQiLCJrZXlMVCJdLFsia2V5TFRFIiwia2V5TFRFIl0sWyJrZXlFUSIsImtleUVRIl0sWyJrZXlHVEUiLCJrZXlHVEUiXSxbImtleUdUIiwia2V5R1QiXV0sIi4vc3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcyI6W1siZWxlbWVudHNJc1N1cGVyc2V0IiwiZWxlbWVudHNJc1N1cGVyc2V0Il0sWyJlbGVtZW50c0lzRGlzam9pbnQiLCJlbGVtZW50c0lzRGlzam9pbnQiXSxbImVsZW1lbnRzQ29tcGFyZSIsImVsZW1lbnRzQ29tcGFyZSJdLFsiZWxlbWVudHNVbmlvbiIsImVsZW1lbnRzVW5pb24iXSxbImVsZW1lbnRzRGlzam9pbnRVbmlvbiIsImVsZW1lbnRzRGlzam9pbnRVbmlvbiJdLFsiZWxlbWVudHNJbnRlcnNlY3Rpb24iLCJlbGVtZW50c0ludGVyc2VjdGlvbiJdLFsiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0IiwiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0Il0sWyJzZXRJc1N1cGVyc2V0Iiwic2V0SXNTdXBlcnNldCJdLFsic2V0SXNEaXNqb2ludCIsInNldElzRGlzam9pbnQiXSxbInNldFVuaW9uIiwic2V0VW5pb24iXSxbInNldERpc2pvaW50VW5pb24iLCJzZXREaXNqb2ludFVuaW9uIl0sWyJzZXRJbnRlcnNlY3Rpb24iLCJzZXRJbnRlcnNlY3Rpb24iXSxbInNldERpc2pvaW50U3VidHJhY3QiLCJzZXREaXNqb2ludFN1YnRyYWN0Il1dLCIuL3NyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanMiOltbImJhZ0lzU3VwZXJiYWciLCJiYWdJc1N1cGVyYmFnIl0sWyJiYWdVbmlvbiIsImJhZ1VuaW9uIl0sWyJiYWdJbnRlcnNlY3Rpb24iLCJiYWdJbnRlcnNlY3Rpb24iXSxbImJhZ0Rpc2pvaW50U3VidHJhY3QiLCJiYWdEaXNqb2ludFN1YnRyYWN0Il1dLCIuL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiOltbIk0iLCJNIl0sWyJnZXRSYW5rQ292ZXIiLCJnZXRSYW5rQ292ZXIiXSxbImlzUGF0dGVybiIsImlzUGF0dGVybiJdLFsiYXNzZXJ0UGF0dGVybiIsImFzc2VydFBhdHRlcm4iXSxbIm1hdGNoZXMiLCJtYXRjaGVzIl0sWyJtdXN0TWF0Y2giLCJtdXN0TWF0Y2giXSxbImlzQXdhaXRBcmdHdWFyZCIsImlzQXdhaXRBcmdHdWFyZCJdLFsiYXNzZXJ0QXdhaXRBcmdHdWFyZCIsImFzc2VydEF3YWl0QXJnR3VhcmQiXSxbImlzUmF3R3VhcmQiLCJpc1Jhd0d1YXJkIl0sWyJhc3NlcnRSYXdHdWFyZCIsImFzc2VydFJhd0d1YXJkIl0sWyJhc3NlcnRNZXRob2RHdWFyZCIsImFzc2VydE1ldGhvZEd1YXJkIl0sWyJhc3NlcnRJbnRlcmZhY2VHdWFyZCIsImFzc2VydEludGVyZmFjZUd1YXJkIl0sWyJraW5kT2YiLCJraW5kT2YiXSxbImNvbnRhaW5lckhhc1NwbGl0IiwiY29udGFpbmVySGFzU3BsaXQiXV0sIi4vc3JjL3BhdHRlcm5zL2dldEd1YXJkUGF5bG9hZHMuanMiOltbImdldEF3YWl0QXJnR3VhcmRQYXlsb2FkIiwiZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQiXSxbImdldE1ldGhvZEd1YXJkUGF5bG9hZCIsImdldE1ldGhvZEd1YXJkUGF5bG9hZCJdLFsiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkIiwiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkIl0sWyJnZXRJbnRlcmZhY2VNZXRob2RLZXlzIiwiZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyJdXSwiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qcyI6W1sibGlzdERpZmZlcmVuY2UiLCJsaXN0RGlmZmVyZW5jZSJdXSwiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiOltbIm9iamVjdE1hcCIsIm9iamVjdE1hcCJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAwepGqlU3AABVNwAAKgAAAEBlbmRvL3BhdHRlcm5zLXYxLjUuMC9zcmMva2V5cy9jaGVja0tleS5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGVuZG8vY29tbW9uL2lkZW50LWNoZWNrZXIuanMiLCJAZW5kby9lcnJvcnMiLCIuL2NvcHlTZXQuanMiLCIuL2NvcHlCYWcuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRDb3B5QmFnIiwiYXNzZXJ0Q29weU1hcCIsImFzc2VydENvcHlTZXQiLCJhc3NlcnRLZXkiLCJhc3NlcnRQcmltaXRpdmVLZXkiLCJhc3NlcnRTY2FsYXJLZXkiLCJjaGVja0NvcHlCYWciLCJjaGVja0NvcHlNYXAiLCJjaGVja0NvcHlTZXQiLCJjaGVja0tleSIsImNoZWNrU2NhbGFyS2V5IiwiY29weU1hcEtleVNldCIsImV2ZXJ5Q29weUJhZ0VudHJ5IiwiZXZlcnlDb3B5TWFwS2V5IiwiZXZlcnlDb3B5TWFwVmFsdWUiLCJldmVyeUNvcHlTZXRLZXkiLCJnZXRDb3B5QmFnRW50cmllcyIsImdldENvcHlNYXBFbnRyaWVzIiwiZ2V0Q29weU1hcEVudHJ5QXJyYXkiLCJnZXRDb3B5TWFwS2V5cyIsImdldENvcHlNYXBWYWx1ZXMiLCJnZXRDb3B5U2V0S2V5cyIsImlzQ29weUJhZyIsImlzQ29weU1hcCIsImlzQ29weVNldCIsImlzS2V5IiwiaXNQcmltaXRpdmVLZXkiLCJpc1NjYWxhcktleSIsIm1ha2VDb3B5QmFnIiwibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiLCJtYWtlQ29weU1hcCIsIm1ha2VDb3B5U2V0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYXNzZXJ0Q2hlY2tlcixhc3NlcnRQYXNzYWJsZSxGYXIsZ2V0VGFnLGlzT2JqZWN0LG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsY29tcGFyZUFudGlSYW5rLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbmssaWRlbnRDaGVja2VyLFgscSxGYWlsLGNoZWNrRWxlbWVudHMsbWFrZVNldE9mRWxlbWVudHMsY2hlY2tCYWdFbnRyaWVzLG1ha2VCYWdPZkVudHJpZXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVwiLFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXSxbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wiaXNPYmplY3RcIixbJGjNj19hID0+IChpc09iamVjdCA9ICRozY9fYSldXSxbXCJtYWtlVGFnZ2VkXCIsWyRozY9fYSA9PiAobWFrZVRhZ2dlZCA9ICRozY9fYSldXSxbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLFskaM2PX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRozY9fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLFskaM2PX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjNj19hKV1dLFtcInNvcnRCeVJhbmtcIixbJGjNj19hID0+IChzb3J0QnlSYW5rID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL2lkZW50LWNoZWNrZXIuanNcIiwgW1tcImlkZW50Q2hlY2tlclwiLFskaM2PX2EgPT4gKGlkZW50Q2hlY2tlciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL2NvcHlTZXQuanNcIiwgW1tcImNoZWNrRWxlbWVudHNcIixbJGjNj19hID0+IChjaGVja0VsZW1lbnRzID0gJGjNj19hKV1dLFtcIm1ha2VTZXRPZkVsZW1lbnRzXCIsWyRozY9fYSA9PiAobWFrZVNldE9mRWxlbWVudHMgPSAkaM2PX2EpXV1dXSxbXCIuL2NvcHlCYWcuanNcIiwgW1tcImNoZWNrQmFnRW50cmllc1wiLFskaM2PX2EgPT4gKGNoZWNrQmFnRW50cmllcyA9ICRozY9fYSldXSxbXCJtYWtlQmFnT2ZFbnRyaWVzXCIsWyRozY9fYSA9PiAobWFrZUJhZ09mRW50cmllcyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcblxuLypcblxuXG5cbiAqL1xuXG4vL1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBjaGVja1ByaW1pdGl2ZUtleSA9ICh2YWwsIGNoZWNrKSA9PiB7XG4gIGlmIChpc09iamVjdCh2YWwpKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNoZWNrICE9PSBpZGVudENoZWNrZXIgJiZcbiAgICAgIGNoZWNrKGZhbHNlLCBYYEEgJHtxKHR5cGVvZiB2YWwpfSBjYW5ub3QgYmUgYSBwcmltaXRpdmU6ICR7dmFsfWApXG4gICAgKTtcbiAgfVxuICAvL1xuICAvL1xuICBhc3NlcnRQYXNzYWJsZSh2YWwpO1xuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgaXNQcmltaXRpdmVLZXkgPSB2YWwgPT4gY2hlY2tQcmltaXRpdmVLZXkodmFsLCBpZGVudENoZWNrZXIpOyRozY9fb25jZS5pc1ByaW1pdGl2ZUtleShpc1ByaW1pdGl2ZUtleSk7XG5oYXJkZW4oaXNQcmltaXRpdmVLZXkpO1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydFByaW1pdGl2ZUtleSA9IHZhbCA9PiB7XG4gIGNoZWNrUHJpbWl0aXZlS2V5KHZhbCwgYXNzZXJ0Q2hlY2tlcik7XG59OyRozY9fb25jZS5hc3NlcnRQcmltaXRpdmVLZXkoYXNzZXJ0UHJpbWl0aXZlS2V5KTtcbmhhcmRlbihhc3NlcnRQcmltaXRpdmVLZXkpO1xuXG4vKlxuXG5cblxuICovXG4gICAgICAgY29uc3QgY2hlY2tTY2FsYXJLZXkgPSAodmFsLCBjaGVjaykgPT4ge1xuICBpZiAoaXNQcmltaXRpdmVLZXkodmFsKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHZhbCk7XG4gIGlmIChwYXNzU3R5bGUgPT09ICdyZW1vdGFibGUnKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgcmV0dXJuIGNoZWNrKGZhbHNlLCBYYEEgJHtxKHBhc3NTdHlsZSl9IGNhbm5vdCBiZSBhIHNjYWxhciBrZXk6ICR7dmFsfWApO1xufTtcblxuLypcblxuXG4gKi8kaM2PX29uY2UuY2hlY2tTY2FsYXJLZXkoY2hlY2tTY2FsYXJLZXkpO1xuICAgICAgIGNvbnN0IGlzU2NhbGFyS2V5ID0gdmFsID0+IGNoZWNrU2NhbGFyS2V5KHZhbCwgaWRlbnRDaGVja2VyKTskaM2PX29uY2UuaXNTY2FsYXJLZXkoaXNTY2FsYXJLZXkpO1xuaGFyZGVuKGlzU2NhbGFyS2V5KTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRTY2FsYXJLZXkgPSB2YWwgPT4ge1xuICBjaGVja1NjYWxhcktleSh2YWwsIGFzc2VydENoZWNrZXIpO1xufTskaM2PX29uY2UuYXNzZXJ0U2NhbGFyS2V5KGFzc2VydFNjYWxhcktleSk7XG5oYXJkZW4oYXNzZXJ0U2NhbGFyS2V5KTtcblxuLy9cblxuLy9cbi8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuLy9cbmNvbnN0IGtleU1lbW8gPSBuZXcgV2Vha1NldCgpO1xuXG4vKlxuXG5cblxuICovXG4gICAgICAgY29uc3QgY2hlY2tLZXkgPSAodmFsLCBjaGVjaykgPT4ge1xuICBpZiAoIWlzT2JqZWN0KHZhbCkpIHtcbiAgICAvL1xuICAgIC8vXG4gICAgYXNzZXJ0UGFzc2FibGUodmFsKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvL1xuICBpZiAoa2V5TWVtby5oYXModmFsKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIC8vXG4gIGNvbnN0IHJlc3VsdCA9IGNoZWNrS2V5SW50ZXJuYWwodmFsLCBjaGVjayk7XG4gIGlmIChyZXN1bHQpIHtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBrZXlNZW1vLmFkZCh2YWwpO1xuICB9XG4gIC8vXG4gIC8vXG4gIHJldHVybiByZXN1bHQ7XG59OyRozY9fb25jZS5jaGVja0tleShjaGVja0tleSk7XG5oYXJkZW4oY2hlY2tLZXkpO1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBpc0tleSA9IHZhbCA9PiBjaGVja0tleSh2YWwsIGlkZW50Q2hlY2tlcik7JGjNj19vbmNlLmlzS2V5KGlzS2V5KTtcbmhhcmRlbihpc0tleSk7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0S2V5ID0gdmFsID0+IHtcbiAgY2hlY2tLZXkodmFsLCBhc3NlcnRDaGVja2VyKTtcbn07JGjNj19vbmNlLmFzc2VydEtleShhc3NlcnRLZXkpO1xuaGFyZGVuKGFzc2VydEtleSk7XG5cbi8vXG5cbi8vXG4vL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBjb3B5U2V0TWVtbyA9IG5ldyBXZWFrU2V0KCk7XG5cbi8qXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBjaGVja0NvcHlTZXQgPSAocywgY2hlY2spID0+IHtcbiAgaWYgKGNvcHlTZXRNZW1vLmhhcyhzKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9XG4gICAgKChwYXNzU3R5bGVPZihzKSA9PT0gJ3RhZ2dlZCcgJiYgZ2V0VGFnKHMpID09PSAnY29weVNldCcpIHx8XG4gICAgICBjaGVjayhmYWxzZSwgWGBOb3QgYSBjb3B5U2V0OiAke3N9YCkpICYmXG4gICAgY2hlY2tFbGVtZW50cyhzLnBheWxvYWQsIGNoZWNrKSAmJlxuICAgIGNoZWNrS2V5KHMucGF5bG9hZCwgY2hlY2spO1xuICBpZiAocmVzdWx0KSB7XG4gICAgY29weVNldE1lbW8uYWRkKHMpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59OyRozY9fb25jZS5jaGVja0NvcHlTZXQoY2hlY2tDb3B5U2V0KTtcbmhhcmRlbihjaGVja0NvcHlTZXQpO1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGlzQ29weVNldCA9IHMgPT4gY2hlY2tDb3B5U2V0KHMsIGlkZW50Q2hlY2tlcik7JGjNj19vbmNlLmlzQ29weVNldChpc0NvcHlTZXQpO1xuaGFyZGVuKGlzQ29weVNldCk7XG5cbi8qXG5cblxuXG4gKi9cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgIGNvbnN0IGFzc2VydENvcHlTZXQgPSBzID0+IHtcbiAgY2hlY2tDb3B5U2V0KHMsIGFzc2VydENoZWNrZXIpO1xufTskaM2PX29uY2UuYXNzZXJ0Q29weVNldChhc3NlcnRDb3B5U2V0KTtcbmhhcmRlbihhc3NlcnRDb3B5U2V0KTtcblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGdldENvcHlTZXRLZXlzID0gcyA9PiB7XG4gIGFzc2VydENvcHlTZXQocyk7XG4gIHJldHVybiBzLnBheWxvYWQ7XG59OyRozY9fb25jZS5nZXRDb3B5U2V0S2V5cyhnZXRDb3B5U2V0S2V5cyk7XG5oYXJkZW4oZ2V0Q29weVNldEtleXMpO1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBldmVyeUNvcHlTZXRLZXkgPSAocywgZm4pID0+XG4gIGdldENvcHlTZXRLZXlzKHMpLmV2ZXJ5KChrZXksIGluZGV4KSA9PiBmbihrZXksIGluZGV4KSk7JGjNj19vbmNlLmV2ZXJ5Q29weVNldEtleShldmVyeUNvcHlTZXRLZXkpO1xuaGFyZGVuKGV2ZXJ5Q29weVNldEtleSk7XG5cbi8qXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlQ29weVNldCA9IGVsZW1lbnRJdGVyID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gbWFrZVNldE9mRWxlbWVudHMoZWxlbWVudEl0ZXIpO1xuICBhc3NlcnRDb3B5U2V0KHJlc3VsdCk7XG4gIHJldHVybiByZXN1bHQ7XG59OyRozY9fb25jZS5tYWtlQ29weVNldChtYWtlQ29weVNldCk7XG5oYXJkZW4obWFrZUNvcHlTZXQpO1xuXG4vL1xuXG4vL1xuLy9cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgY29weUJhZ01lbW8gPSBuZXcgV2Vha1NldCgpO1xuXG4vKlxuXG5cblxuICovXG4gICAgICAgY29uc3QgY2hlY2tDb3B5QmFnID0gKGIsIGNoZWNrKSA9PiB7XG4gIGlmIChjb3B5QmFnTWVtby5oYXMoYikpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBjb25zdCByZXN1bHQgPVxuICAgICgocGFzc1N0eWxlT2YoYikgPT09ICd0YWdnZWQnICYmIGdldFRhZyhiKSA9PT0gJ2NvcHlCYWcnKSB8fFxuICAgICAgY2hlY2soZmFsc2UsIFhgTm90IGEgY29weUJhZzogJHtifWApKSAmJlxuICAgIGNoZWNrQmFnRW50cmllcyhiLnBheWxvYWQsIGNoZWNrKSAmJlxuICAgIGNoZWNrS2V5KGIucGF5bG9hZCwgY2hlY2spO1xuICBpZiAocmVzdWx0KSB7XG4gICAgY29weUJhZ01lbW8uYWRkKGIpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59OyRozY9fb25jZS5jaGVja0NvcHlCYWcoY2hlY2tDb3B5QmFnKTtcbmhhcmRlbihjaGVja0NvcHlCYWcpO1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGlzQ29weUJhZyA9IGIgPT4gY2hlY2tDb3B5QmFnKGIsIGlkZW50Q2hlY2tlcik7JGjNj19vbmNlLmlzQ29weUJhZyhpc0NvcHlCYWcpO1xuaGFyZGVuKGlzQ29weUJhZyk7XG5cbi8qXG5cblxuXG4gKi9cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgIGNvbnN0IGFzc2VydENvcHlCYWcgPSBiID0+IHtcbiAgY2hlY2tDb3B5QmFnKGIsIGFzc2VydENoZWNrZXIpO1xufTskaM2PX29uY2UuYXNzZXJ0Q29weUJhZyhhc3NlcnRDb3B5QmFnKTtcbmhhcmRlbihhc3NlcnRDb3B5QmFnKTtcblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGdldENvcHlCYWdFbnRyaWVzID0gYiA9PiB7XG4gIGFzc2VydENvcHlCYWcoYik7XG4gIHJldHVybiBiLnBheWxvYWQ7XG59OyRozY9fb25jZS5nZXRDb3B5QmFnRW50cmllcyhnZXRDb3B5QmFnRW50cmllcyk7XG5oYXJkZW4oZ2V0Q29weUJhZ0VudHJpZXMpO1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBldmVyeUNvcHlCYWdFbnRyeSA9IChiLCBmbikgPT5cbiAgZ2V0Q29weUJhZ0VudHJpZXMoYikuZXZlcnkoKGVudHJ5LCBpbmRleCkgPT4gZm4oZW50cnksIGluZGV4KSk7JGjNj19vbmNlLmV2ZXJ5Q29weUJhZ0VudHJ5KGV2ZXJ5Q29weUJhZ0VudHJ5KTtcbmhhcmRlbihldmVyeUNvcHlCYWdFbnRyeSk7XG5cbi8qXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlQ29weUJhZyA9IGJhZ0VudHJ5SXRlciA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IG1ha2VCYWdPZkVudHJpZXMoYmFnRW50cnlJdGVyKTtcbiAgYXNzZXJ0Q29weUJhZyhyZXN1bHQpO1xuICByZXR1cm4gcmVzdWx0O1xufTskaM2PX29uY2UubWFrZUNvcHlCYWcobWFrZUNvcHlCYWcpO1xuaGFyZGVuKG1ha2VDb3B5QmFnKTtcblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzID0gZWxlbWVudEl0ZXIgPT4ge1xuICAvL1xuICAvL1xuICBjb25zdCBmdWxsQ29tcGFyZSA9IG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG4gIGNvbnN0IHNvcnRlZCA9IHNvcnRCeVJhbmsoZWxlbWVudEl0ZXIsIGZ1bGxDb21wYXJlKTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGVudHJpZXMgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3J0ZWQubGVuZ3RoOyApIHtcbiAgICBjb25zdCBrID0gc29ydGVkW2ldO1xuICAgIGxldCBqID0gaSArIDE7XG4gICAgd2hpbGUgKGogPCBzb3J0ZWQubGVuZ3RoICYmIGZ1bGxDb21wYXJlKGssIHNvcnRlZFtqXSkgPT09IDApIHtcbiAgICAgIGogKz0gMTtcbiAgICB9XG4gICAgZW50cmllcy5wdXNoKFtrLCBCaWdJbnQoaiAtIGkpXSk7XG4gICAgaSA9IGo7XG4gIH1cbiAgcmV0dXJuIG1ha2VDb3B5QmFnKGVudHJpZXMpO1xufTskaM2PX29uY2UubWFrZUNvcHlCYWdGcm9tRWxlbWVudHMobWFrZUNvcHlCYWdGcm9tRWxlbWVudHMpO1xuaGFyZGVuKG1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzKTtcblxuLy9cblxuLy9cbi8vXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGNvcHlNYXBNZW1vID0gbmV3IFdlYWtTZXQoKTtcblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGNoZWNrQ29weU1hcCA9IChtLCBjaGVjaykgPT4ge1xuICBpZiAoY29weU1hcE1lbW8uaGFzKG0pKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKCEocGFzc1N0eWxlT2YobSkgPT09ICd0YWdnZWQnICYmIGdldFRhZyhtKSA9PT0gJ2NvcHlNYXAnKSkge1xuICAgIHJldHVybiBjaGVjayhmYWxzZSwgWGBOb3QgYSBjb3B5TWFwOiAke219YCk7XG4gIH1cbiAgY29uc3QgeyBwYXlsb2FkIH0gPSBtO1xuICBpZiAocGFzc1N0eWxlT2YocGF5bG9hZCkgIT09ICdjb3B5UmVjb3JkJykge1xuICAgIHJldHVybiBjaGVjayhmYWxzZSwgWGBBIGNvcHlNYXAncyBwYXlsb2FkIG11c3QgYmUgYSByZWNvcmQ6ICR7bX1gKTtcbiAgfVxuICBjb25zdCB7IGtleXMsIHZhbHVlcywgLi4ucmVzdCB9ID0gcGF5bG9hZDtcbiAgY29uc3QgcmVzdWx0ID1cbiAgICAob3duS2V5cyhyZXN0KS5sZW5ndGggPT09IDAgfHxcbiAgICAgIGNoZWNrKFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgWGBBIGNvcHlNYXAncyBwYXlsb2FkIG11c3Qgb25seSBoYXZlIC5rZXlzIGFuZCAudmFsdWVzOiAke219YCxcbiAgICAgICkpICYmXG4gICAgY2hlY2tFbGVtZW50cyhrZXlzLCBjaGVjaykgJiZcbiAgICBjaGVja0tleShrZXlzLCBjaGVjaykgJiZcbiAgICAocGFzc1N0eWxlT2YodmFsdWVzKSA9PT0gJ2NvcHlBcnJheScgfHxcbiAgICAgIGNoZWNrKGZhbHNlLCBYYEEgY29weU1hcCdzIC52YWx1ZXMgbXVzdCBiZSBhIGNvcHlBcnJheTogJHttfWApKSAmJlxuICAgIChrZXlzLmxlbmd0aCA9PT0gdmFsdWVzLmxlbmd0aCB8fFxuICAgICAgY2hlY2soXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBYYEEgY29weU1hcCBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIGtleXMgYW5kIHZhbHVlczogJHttfWAsXG4gICAgICApKTtcbiAgaWYgKHJlc3VsdCkge1xuICAgIGNvcHlNYXBNZW1vLmFkZChtKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTskaM2PX29uY2UuY2hlY2tDb3B5TWFwKGNoZWNrQ29weU1hcCk7XG5oYXJkZW4oY2hlY2tDb3B5TWFwKTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBpc0NvcHlNYXAgPSBtID0+IGNoZWNrQ29weU1hcChtLCBpZGVudENoZWNrZXIpOyRozY9fb25jZS5pc0NvcHlNYXAoaXNDb3B5TWFwKTtcbmhhcmRlbihpc0NvcHlNYXApO1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydENvcHlNYXAgPSBtID0+IHtcbiAgY2hlY2tDb3B5TWFwKG0sIGFzc2VydENoZWNrZXIpO1xufTskaM2PX29uY2UuYXNzZXJ0Q29weU1hcChhc3NlcnRDb3B5TWFwKTtcbmhhcmRlbihhc3NlcnRDb3B5TWFwKTtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0Q29weU1hcEtleXMgPSBtID0+IHtcbiAgYXNzZXJ0Q29weU1hcChtKTtcbiAgcmV0dXJuIG0ucGF5bG9hZC5rZXlzO1xufTskaM2PX29uY2UuZ2V0Q29weU1hcEtleXMoZ2V0Q29weU1hcEtleXMpO1xuaGFyZGVuKGdldENvcHlNYXBLZXlzKTtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0Q29weU1hcFZhbHVlcyA9IG0gPT4ge1xuICBhc3NlcnRDb3B5TWFwKG0pO1xuICByZXR1cm4gbS5wYXlsb2FkLnZhbHVlcztcbn07JGjNj19vbmNlLmdldENvcHlNYXBWYWx1ZXMoZ2V0Q29weU1hcFZhbHVlcyk7XG5oYXJkZW4oZ2V0Q29weU1hcFZhbHVlcyk7XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBnZXRDb3B5TWFwRW50cnlBcnJheSA9IG0gPT4ge1xuICBhc3NlcnRDb3B5TWFwKG0pO1xuICBjb25zdCB7XG4gICAgcGF5bG9hZDogeyBrZXlzLCB2YWx1ZXMgfSxcbiAgfSA9IG07XG4gIHJldHVybiBoYXJkZW4oa2V5cy5tYXAoKGtleSwgaSkgPT4gW2tleSwgdmFsdWVzW2ldXSkpO1xufTskaM2PX29uY2UuZ2V0Q29weU1hcEVudHJ5QXJyYXkoZ2V0Q29weU1hcEVudHJ5QXJyYXkpO1xuaGFyZGVuKGdldENvcHlNYXBFbnRyeUFycmF5KTtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0Q29weU1hcEVudHJpZXMgPSBtID0+IHtcbiAgYXNzZXJ0Q29weU1hcChtKTtcbiAgY29uc3Qge1xuICAgIHBheWxvYWQ6IHsga2V5cywgdmFsdWVzIH0sXG4gIH0gPSBtO1xuICBjb25zdCB7IGxlbmd0aCB9ID0gLyogICAgICAgICAgICAgICAgKi8gKGtleXMpO1xuICByZXR1cm4gRmFyKCdDb3B5TWFwIGVudHJpZXMgaXRlcmFibGUnLCB7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIGxldCBpID0gMDtcbiAgICAgIHJldHVybiBGYXIoJ0NvcHlNYXAgZW50cmllcyBpdGVyYXRvcicsIHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgbGV0IHJlc3VsdDtcbiAgICAgICAgICBpZiAoaSA8IGxlbmd0aCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gaGFyZGVuKHsgZG9uZTogZmFsc2UsIHZhbHVlOiBba2V5c1tpXSwgdmFsdWVzW2ldXSB9KTtcbiAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGhhcmRlbih7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbn07JGjNj19vbmNlLmdldENvcHlNYXBFbnRyaWVzKGdldENvcHlNYXBFbnRyaWVzKTtcbmhhcmRlbihnZXRDb3B5TWFwRW50cmllcyk7XG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZXZlcnlDb3B5TWFwS2V5ID0gKG0sIGZuKSA9PlxuICBnZXRDb3B5TWFwS2V5cyhtKS5ldmVyeSgoa2V5LCBpbmRleCkgPT4gZm4oa2V5LCBpbmRleCkpOyRozY9fb25jZS5ldmVyeUNvcHlNYXBLZXkoZXZlcnlDb3B5TWFwS2V5KTtcbmhhcmRlbihldmVyeUNvcHlNYXBLZXkpO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGV2ZXJ5Q29weU1hcFZhbHVlID0gKG0sIGZuKSA9PlxuICBnZXRDb3B5TWFwVmFsdWVzKG0pLmV2ZXJ5KCh2YWx1ZSwgaW5kZXgpID0+IGZuKHZhbHVlLCBpbmRleCkpOyRozY9fb25jZS5ldmVyeUNvcHlNYXBWYWx1ZShldmVyeUNvcHlNYXBWYWx1ZSk7XG5oYXJkZW4oZXZlcnlDb3B5TWFwVmFsdWUpO1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBjb3B5TWFwS2V5U2V0ID0gbSA9PlxuICAvL1xuICBtYWtlVGFnZ2VkKCdjb3B5U2V0JywgbS5wYXlsb2FkLmtleXMpOyRozY9fb25jZS5jb3B5TWFwS2V5U2V0KGNvcHlNYXBLZXlTZXQpO1xuaGFyZGVuKGNvcHlNYXBLZXlTZXQpO1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlQ29weU1hcCA9IGVudHJpZXMgPT4ge1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICBjb25zdCBzb3J0ZWRFbnRyaWVzID0gc29ydEJ5UmFuayhlbnRyaWVzLCBjb21wYXJlQW50aVJhbmspO1xuICBjb25zdCBrZXlzID0gc29ydGVkRW50cmllcy5tYXAoKFtrLCBfdl0pID0+IGspO1xuICBjb25zdCB2YWx1ZXMgPSBzb3J0ZWRFbnRyaWVzLm1hcCgoW19rLCB2XSkgPT4gdik7XG4gIGNvbnN0IHJlc3VsdCA9IG1ha2VUYWdnZWQoJ2NvcHlNYXAnLCB7IGtleXMsIHZhbHVlcyB9KTtcbiAgYXNzZXJ0Q29weU1hcChyZXN1bHQpO1xuICByZXR1cm4gcmVzdWx0O1xufTskaM2PX29uY2UubWFrZUNvcHlNYXAobWFrZUNvcHlNYXApO1xuaGFyZGVuKG1ha2VDb3B5TWFwKTtcblxuLy9cblxuLypcblxuXG5cbiAqL1xuY29uc3QgY2hlY2tLZXlJbnRlcm5hbCA9ICh2YWwsIGNoZWNrKSA9PiB7XG4gIGNvbnN0IGNoZWNrSXQgPSBjaGlsZCA9PiBjaGVja0tleShjaGlsZCwgY2hlY2spO1xuXG4gIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHZhbCk7XG4gIHN3aXRjaCAocGFzc1N0eWxlKSB7XG4gICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh2YWwpLmV2ZXJ5KGNoZWNrSXQpO1xuICAgIH1cbiAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIHZhbC5ldmVyeShjaGVja0l0KTtcbiAgICB9XG4gICAgY2FzZSAndGFnZ2VkJzoge1xuICAgICAgY29uc3QgdGFnID0gZ2V0VGFnKHZhbCk7XG4gICAgICBzd2l0Y2ggKHRhZykge1xuICAgICAgICBjYXNlICdjb3B5U2V0Jzoge1xuICAgICAgICAgIHJldHVybiBjaGVja0NvcHlTZXQodmFsLCBjaGVjayk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnY29weUJhZyc6IHtcbiAgICAgICAgICByZXR1cm4gY2hlY2tDb3B5QmFnKHZhbCwgY2hlY2spO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2NvcHlNYXAnOiB7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIGNoZWNrQ29weU1hcCh2YWwsIGNoZWNrKSAmJlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgZXZlcnlDb3B5TWFwVmFsdWUodmFsLCBjaGVja0l0KVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBjaGVjayAhPT0gaWRlbnRDaGVja2VyICYmXG4gICAgICAgICAgICBjaGVjayhmYWxzZSwgWGBBIHBhc3NhYmxlIHRhZ2dlZCAke3EodGFnKX0gaXMgbm90IGEga2V5OiAke3ZhbH1gKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY2FzZSAncmVtb3RhYmxlJzoge1xuICAgICAgLy9cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBjYXNlICdlcnJvcic6XG4gICAgY2FzZSAncHJvbWlzZSc6IHtcbiAgICAgIHJldHVybiBjaGVjayhmYWxzZSwgWGBBICR7cShwYXNzU3R5bGUpfSBjYW5ub3QgYmUgYSBrZXlgKTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICB0aHJvdyBGYWlsYHVuZXhwZWN0ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfTogJHt2YWx9YDtcbiAgICB9XG4gIH1cbn07XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1ByaW1pdGl2ZUtleSI6WyJpc1ByaW1pdGl2ZUtleSJdLCJhc3NlcnRQcmltaXRpdmVLZXkiOlsiYXNzZXJ0UHJpbWl0aXZlS2V5Il0sImNoZWNrU2NhbGFyS2V5IjpbImNoZWNrU2NhbGFyS2V5Il0sImlzU2NhbGFyS2V5IjpbImlzU2NhbGFyS2V5Il0sImFzc2VydFNjYWxhcktleSI6WyJhc3NlcnRTY2FsYXJLZXkiXSwiY2hlY2tLZXkiOlsiY2hlY2tLZXkiXSwiaXNLZXkiOlsiaXNLZXkiXSwiYXNzZXJ0S2V5IjpbImFzc2VydEtleSJdLCJjaGVja0NvcHlTZXQiOlsiY2hlY2tDb3B5U2V0Il0sImlzQ29weVNldCI6WyJpc0NvcHlTZXQiXSwiYXNzZXJ0Q29weVNldCI6WyJhc3NlcnRDb3B5U2V0Il0sImdldENvcHlTZXRLZXlzIjpbImdldENvcHlTZXRLZXlzIl0sImV2ZXJ5Q29weVNldEtleSI6WyJldmVyeUNvcHlTZXRLZXkiXSwibWFrZUNvcHlTZXQiOlsibWFrZUNvcHlTZXQiXSwiY2hlY2tDb3B5QmFnIjpbImNoZWNrQ29weUJhZyJdLCJpc0NvcHlCYWciOlsiaXNDb3B5QmFnIl0sImFzc2VydENvcHlCYWciOlsiYXNzZXJ0Q29weUJhZyJdLCJnZXRDb3B5QmFnRW50cmllcyI6WyJnZXRDb3B5QmFnRW50cmllcyJdLCJldmVyeUNvcHlCYWdFbnRyeSI6WyJldmVyeUNvcHlCYWdFbnRyeSJdLCJtYWtlQ29weUJhZyI6WyJtYWtlQ29weUJhZyJdLCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyI6WyJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyJdLCJjaGVja0NvcHlNYXAiOlsiY2hlY2tDb3B5TWFwIl0sImlzQ29weU1hcCI6WyJpc0NvcHlNYXAiXSwiYXNzZXJ0Q29weU1hcCI6WyJhc3NlcnRDb3B5TWFwIl0sImdldENvcHlNYXBLZXlzIjpbImdldENvcHlNYXBLZXlzIl0sImdldENvcHlNYXBWYWx1ZXMiOlsiZ2V0Q29weU1hcFZhbHVlcyJdLCJnZXRDb3B5TWFwRW50cnlBcnJheSI6WyJnZXRDb3B5TWFwRW50cnlBcnJheSJdLCJnZXRDb3B5TWFwRW50cmllcyI6WyJnZXRDb3B5TWFwRW50cmllcyJdLCJldmVyeUNvcHlNYXBLZXkiOlsiZXZlcnlDb3B5TWFwS2V5Il0sImV2ZXJ5Q29weU1hcFZhbHVlIjpbImV2ZXJ5Q29weU1hcFZhbHVlIl0sImNvcHlNYXBLZXlTZXQiOlsiY29weU1hcEtleVNldCJdLCJtYWtlQ29weU1hcCI6WyJtYWtlQ29weU1hcCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADndpWarBkAAKwZAAAtAAAAQGVuZG8vcGF0dGVybnMtdjEuNS4wL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAZW5kby9lcnJvcnMiLCIuL2NoZWNrS2V5LmpzIiwiLi9rZXljb2xsZWN0aW9uLW9wZXJhdG9ycy5qcyJdLCJleHBvcnRzIjpbImJhZ0NvbXBhcmUiLCJjb21wYXJlS2V5cyIsImtleUVRIiwia2V5R1QiLCJrZXlHVEUiLCJrZXlMVCIsImtleUxURSIsInNldENvbXBhcmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBwYXNzU3R5bGVPZixnZXRUYWcsY29tcGFyZVJhbmsscmVjb3JkTmFtZXMscmVjb3JkVmFsdWVzLHRyaXZpYWxDb21wYXJhdG9yLHEsRmFpbCxhc3NlcnRLZXksZ2V0Q29weUJhZ0VudHJpZXMsZ2V0Q29weU1hcEVudHJ5QXJyYXksZ2V0Q29weVNldEtleXMsbWFrZUNvbXBhcmVDb2xsZWN0aW9uOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wiY29tcGFyZVJhbmtcIixbJGjNj19hID0+IChjb21wYXJlUmFuayA9ICRozY9fYSldXSxbXCJyZWNvcmROYW1lc1wiLFskaM2PX2EgPT4gKHJlY29yZE5hbWVzID0gJGjNj19hKV1dLFtcInJlY29yZFZhbHVlc1wiLFskaM2PX2EgPT4gKHJlY29yZFZhbHVlcyA9ICRozY9fYSldXSxbXCJ0cml2aWFsQ29tcGFyYXRvclwiLFskaM2PX2EgPT4gKHRyaXZpYWxDb21wYXJhdG9yID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vY2hlY2tLZXkuanNcIiwgW1tcImFzc2VydEtleVwiLFskaM2PX2EgPT4gKGFzc2VydEtleSA9ICRozY9fYSldXSxbXCJnZXRDb3B5QmFnRW50cmllc1wiLFskaM2PX2EgPT4gKGdldENvcHlCYWdFbnRyaWVzID0gJGjNj19hKV1dLFtcImdldENvcHlNYXBFbnRyeUFycmF5XCIsWyRozY9fYSA9PiAoZ2V0Q29weU1hcEVudHJ5QXJyYXkgPSAkaM2PX2EpXV0sW1wiZ2V0Q29weVNldEtleXNcIixbJGjNj19hID0+IChnZXRDb3B5U2V0S2V5cyA9ICRozY9fYSldXV1dLFtcIi4va2V5Y29sbGVjdGlvbi1vcGVyYXRvcnMuanNcIiwgW1tcIm1ha2VDb21wYXJlQ29sbGVjdGlvblwiLFskaM2PX2EgPT4gKG1ha2VDb21wYXJlQ29sbGVjdGlvbiA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBzZXRDb21wYXJlID0gbWFrZUNvbXBhcmVDb2xsZWN0aW9uKFxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoXG4gICAgcyA9PiBoYXJkZW4oZ2V0Q29weVNldEtleXMocykubWFwKGtleSA9PiBba2V5LCAxXSkpXG4gICksXG4gIDAsXG4gIHRyaXZpYWxDb21wYXJhdG9yLFxuKTskaM2PX29uY2Uuc2V0Q29tcGFyZShzZXRDb21wYXJlKTtcbmhhcmRlbihzZXRDb21wYXJlKTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGJhZ0NvbXBhcmUgPSBtYWtlQ29tcGFyZUNvbGxlY3Rpb24oXG4gIGdldENvcHlCYWdFbnRyaWVzLFxuICAwbixcbiAgdHJpdmlhbENvbXBhcmF0b3IsXG4pOyRozY9fb25jZS5iYWdDb21wYXJlKGJhZ0NvbXBhcmUpO1xuaGFyZGVuKGJhZ0NvbXBhcmUpO1xuXG4vL1xuLy9cbi8vXG4vL1xuLypcblxuXG4gKi9cbmNvbnN0IEFCU0VOVCA9IFN5bWJvbCgnYWJzZW50Jyk7XG4vKlxuXG5cblxuXG5cblxuICovXG4vL1xuY29uc3QgX21hcENvbXBhcmUgPSBtYWtlQ29tcGFyZUNvbGxlY3Rpb24oXG4gIGdldENvcHlNYXBFbnRyeUFycmF5LFxuICBBQlNFTlQsXG4gIChsZWZ0VmFsdWUsIHJpZ2h0VmFsdWUpID0+IHtcbiAgICBpZiAobGVmdFZhbHVlID09PSBBQlNFTlQgJiYgcmlnaHRWYWx1ZSA9PT0gQUJTRU5UKSB7XG4gICAgICB0aHJvdyBGYWlsYEludGVybmFsOiBVbmV4cGVjdGVkIGFic2VudCBlbnRyeSBwYWlyYDtcbiAgICB9IGVsc2UgaWYgKGxlZnRWYWx1ZSA9PT0gQUJTRU5UKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfSBlbHNlIGlmIChyaWdodFZhbHVlID09PSBBQlNFTlQpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH0gZWxzZSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIGNvbXBhcmVLZXlzKGxlZnRWYWx1ZSwgcmlnaHRWYWx1ZSk7XG4gICAgfVxuICB9LFxuKTtcbmhhcmRlbihfbWFwQ29tcGFyZSk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICBjb25zdCBjb21wYXJlS2V5cyA9IChsZWZ0LCByaWdodCkgPT4ge1xuICBhc3NlcnRLZXkobGVmdCk7XG4gIGFzc2VydEtleShyaWdodCk7XG4gIGNvbnN0IGxlZnRTdHlsZSA9IHBhc3NTdHlsZU9mKGxlZnQpO1xuICBjb25zdCByaWdodFN0eWxlID0gcGFzc1N0eWxlT2YocmlnaHQpO1xuICBpZiAobGVmdFN0eWxlICE9PSByaWdodFN0eWxlKSB7XG4gICAgLy9cbiAgICByZXR1cm4gTmFOO1xuICB9XG4gIHN3aXRjaCAobGVmdFN0eWxlKSB7XG4gICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICBjYXNlICdudWxsJzpcbiAgICBjYXNlICdib29sZWFuJzpcbiAgICBjYXNlICdiaWdpbnQnOlxuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgY2FzZSAnc3ltYm9sJzoge1xuICAgICAgLy9cbiAgICAgIHJldHVybiBjb21wYXJlUmFuayhsZWZ0LCByaWdodCk7XG4gICAgfVxuICAgIGNhc2UgJ251bWJlcic6IHtcbiAgICAgIGNvbnN0IHJhbmtDb21wID0gY29tcGFyZVJhbmsobGVmdCwgcmlnaHQpO1xuICAgICAgaWYgKHJhbmtDb21wID09PSAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgICAgaWYgKE51bWJlci5pc05hTihsZWZ0KSB8fCBOdW1iZXIuaXNOYU4ocmlnaHQpKSB7XG4gICAgICAgIC8vXG4gICAgICAgIGFzc2VydCghTnVtYmVyLmlzTmFOKGxlZnQpIHx8ICFOdW1iZXIuaXNOYU4ocmlnaHQpKTtcbiAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgIH1cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgcmV0dXJuIHJhbmtDb21wO1xuICAgIH1cbiAgICBjYXNlICdyZW1vdGFibGUnOiB7XG4gICAgICBpZiAobGVmdCA9PT0gcmlnaHQpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHJldHVybiBOYU47XG4gICAgfVxuICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3QgbGVuID0gTWF0aC5taW4obGVmdC5sZW5ndGgsIHJpZ2h0Lmxlbmd0aCk7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBhcmVLZXlzKGxlZnRbaV0sIHJpZ2h0W2ldKTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gMCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHJldHVybiBjb21wYXJlUmFuayhsZWZ0Lmxlbmd0aCwgcmlnaHQubGVuZ3RoKTtcbiAgICB9XG4gICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3QgbGVmdE5hbWVzID0gcmVjb3JkTmFtZXMobGVmdCk7XG4gICAgICAvL1xuICAgICAgY29uc3QgcmlnaHROYW1lcyA9IHJlY29yZE5hbWVzKHJpZ2h0KTtcblxuICAgICAgLy9cbiAgICAgIGlmICgha2V5RVEobGVmdE5hbWVzLCByaWdodE5hbWVzKSkge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgfVxuICAgICAgLy9cbiAgICAgIGNvbnN0IGxlZnRWYWx1ZXMgPSByZWNvcmRWYWx1ZXMobGVmdCwgbGVmdE5hbWVzKTtcbiAgICAgIC8vXG4gICAgICBjb25zdCByaWdodFZhbHVlcyA9IHJlY29yZFZhbHVlcyhyaWdodCwgcmlnaHROYW1lcyk7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGxldCByZXN1bHQgPSAwO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZWZ0VmFsdWVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIGNvbnN0IGNvbXAgPSBjb21wYXJlS2V5cyhsZWZ0VmFsdWVzW2ldLCByaWdodFZhbHVlc1tpXSk7XG4gICAgICAgIGlmIChOdW1iZXIuaXNOYU4oY29tcCkpIHtcbiAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXN1bHQgIT09IGNvbXAgJiYgY29tcCAhPT0gMCkge1xuICAgICAgICAgIGlmIChyZXN1bHQgPT09IDApIHtcbiAgICAgICAgICAgIHJlc3VsdCA9IGNvbXA7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFzc2VydChcbiAgICAgICAgICAgICAgKHJlc3VsdCA9PT0gLTEgJiYgY29tcCA9PT0gMSkgfHwgKHJlc3VsdCA9PT0gMSAmJiBjb21wID09PSAtMSksXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAvL1xuICAgICAgY29uc3QgbGVmdFRhZyA9IGdldFRhZyhsZWZ0KTtcbiAgICAgIC8vXG4gICAgICBjb25zdCByaWdodFRhZyA9IGdldFRhZyhyaWdodCk7XG4gICAgICBpZiAobGVmdFRhZyAhPT0gcmlnaHRUYWcpIHtcbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAobGVmdFRhZykge1xuICAgICAgICBjYXNlICdjb3B5U2V0Jzoge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgcmV0dXJuIHNldENvbXBhcmUobGVmdCwgcmlnaHQpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2NvcHlCYWcnOiB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICByZXR1cm4gYmFnQ29tcGFyZShsZWZ0LCByaWdodCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnY29weU1hcCc6IHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgdGhyb3cgRmFpbGBNYXAgY29tcGFyaXNvbiBub3QgeWV0IGltcGxlbWVudGVkOiAke2xlZnR9IHZzICR7cmlnaHR9YDtcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgRmFpbGB1bmV4cGVjdGVkIHRhZyAke3EobGVmdFRhZyl9OiAke2xlZnR9YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICB0aHJvdyBGYWlsYHVuZXhwZWN0ZWQgcGFzc1N0eWxlICR7cShsZWZ0U3R5bGUpfTogJHtsZWZ0fWA7XG4gICAgfVxuICB9XG59OyRozY9fb25jZS5jb21wYXJlS2V5cyhjb21wYXJlS2V5cyk7XG5oYXJkZW4oY29tcGFyZUtleXMpO1xuXG4gICAgICAgY29uc3Qga2V5TFQgPSAobGVmdCwgcmlnaHQpID0+IGNvbXBhcmVLZXlzKGxlZnQsIHJpZ2h0KSA8IDA7JGjNj19vbmNlLmtleUxUKGtleUxUKTtcbmhhcmRlbihrZXlMVCk7XG5cbiAgICAgICBjb25zdCBrZXlMVEUgPSAobGVmdCwgcmlnaHQpID0+IGNvbXBhcmVLZXlzKGxlZnQsIHJpZ2h0KSA8PSAwOyRozY9fb25jZS5rZXlMVEUoa2V5TFRFKTtcbmhhcmRlbihrZXlMVEUpO1xuXG4gICAgICAgY29uc3Qga2V5RVEgPSAobGVmdCwgcmlnaHQpID0+IGNvbXBhcmVLZXlzKGxlZnQsIHJpZ2h0KSA9PT0gMDskaM2PX29uY2Uua2V5RVEoa2V5RVEpO1xuaGFyZGVuKGtleUVRKTtcblxuICAgICAgIGNvbnN0IGtleUdURSA9IChsZWZ0LCByaWdodCkgPT4gY29tcGFyZUtleXMobGVmdCwgcmlnaHQpID49IDA7JGjNj19vbmNlLmtleUdURShrZXlHVEUpO1xuaGFyZGVuKGtleUdURSk7XG5cbiAgICAgICBjb25zdCBrZXlHVCA9IChsZWZ0LCByaWdodCkgPT4gY29tcGFyZUtleXMobGVmdCwgcmlnaHQpID4gMDskaM2PX29uY2Uua2V5R1Qoa2V5R1QpO1xuaGFyZGVuKGtleUdUKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InNldENvbXBhcmUiOlsic2V0Q29tcGFyZSJdLCJiYWdDb21wYXJlIjpbImJhZ0NvbXBhcmUiXSwiY29tcGFyZUtleXMiOlsiY29tcGFyZUtleXMiXSwia2V5TFQiOlsia2V5TFQiXSwia2V5TFRFIjpbImtleUxURSJdLCJrZXlFUSI6WyJrZXlFUSJdLCJrZXlHVEUiOlsia2V5R1RFIl0sImtleUdUIjpbImtleUdUIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFzRtojrDgAA6w4AACkAAABAZW5kby9wYXR0ZXJucy12MS41LjAvc3JjL2tleXMvY29weUJhZy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiYXNzZXJ0QmFnRW50cmllcyIsImFzc2VydE5vRHVwbGljYXRlS2V5cyIsImNoZWNrQmFnRW50cmllcyIsImNvZXJjZVRvQmFnRW50cmllcyIsIm1ha2VCYWdPZkVudHJpZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnRDaGVja2VyLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsY29tcGFyZUFudGlSYW5rLGlzUmFua1NvcnRlZCxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLFg7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJtYWtlVGFnZ2VkXCIsWyRozY9fYSA9PiAobWFrZVRhZ2dlZCA9ICRozY9fYSldXSxbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLFskaM2PX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRozY9fYSldXSxbXCJpc1JhbmtTb3J0ZWRcIixbJGjNj19hID0+IChpc1JhbmtTb3J0ZWQgPSAkaM2PX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIixbJGjNj19hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRozY9fYSldXSxbXCJzb3J0QnlSYW5rXCIsWyRozY9fYSA9PiAoc29ydEJ5UmFuayA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGNoZWNrTm9EdXBsaWNhdGVLZXlzID0gKGJhZ0VudHJpZXMsIGZ1bGxDb21wYXJlLCBjaGVjaykgPT4ge1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICBmdWxsQ29tcGFyZSA9IGZ1bGxDb21wYXJlIHx8IG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbiAgLy9cbiAgLy9cbiAgLy9cbiAgYmFnRW50cmllcyA9IHNvcnRCeVJhbmsoYmFnRW50cmllcywgZnVsbENvbXBhcmUpO1xuICBjb25zdCB7IGxlbmd0aCB9ID0gYmFnRW50cmllcztcbiAgZm9yIChsZXQgaSA9IDE7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IGswID0gYmFnRW50cmllc1tpIC0gMV1bMF07XG4gICAgY29uc3QgazEgPSBiYWdFbnRyaWVzW2ldWzBdO1xuICAgIGlmIChmdWxsQ29tcGFyZShrMCwgazEpID09PSAwKSB7XG4gICAgICByZXR1cm4gY2hlY2soZmFsc2UsIFhgdmFsdWUgaGFzIGR1cGxpY2F0ZSBrZXlzOiAke2swfWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydE5vRHVwbGljYXRlS2V5cyA9IChiYWdFbnRyaWVzLCBmdWxsQ29tcGFyZSA9IHVuZGVmaW5lZCkgPT4ge1xuICBjaGVja05vRHVwbGljYXRlS2V5cyhiYWdFbnRyaWVzLCBmdWxsQ29tcGFyZSwgYXNzZXJ0Q2hlY2tlcik7XG59O1xuXG4vKlxuXG5cblxuICovJGjNj19vbmNlLmFzc2VydE5vRHVwbGljYXRlS2V5cyhhc3NlcnROb0R1cGxpY2F0ZUtleXMpO1xuICAgICAgIGNvbnN0IGNoZWNrQmFnRW50cmllcyA9IChiYWdFbnRyaWVzLCBjaGVjaykgPT4ge1xuICBpZiAocGFzc1N0eWxlT2YoYmFnRW50cmllcykgIT09ICdjb3B5QXJyYXknKSB7XG4gICAgcmV0dXJuIGNoZWNrKFxuICAgICAgZmFsc2UsXG4gICAgICBYYFRoZSBlbnRyaWVzIG9mIGEgY29weUJhZyBtdXN0IGJlIGEgY29weUFycmF5OiAke2JhZ0VudHJpZXN9YCxcbiAgICApO1xuICB9XG4gIGlmICghaXNSYW5rU29ydGVkKGJhZ0VudHJpZXMsIGNvbXBhcmVBbnRpUmFuaykpIHtcbiAgICByZXR1cm4gY2hlY2soXG4gICAgICBmYWxzZSxcbiAgICAgIFhgVGhlIGVudHJpZXMgb2YgYSBjb3B5QmFnIG11c3QgYmUgc29ydGVkIGluIHJldmVyc2UgcmFuayBvcmRlcjogJHtiYWdFbnRyaWVzfWAsXG4gICAgKTtcbiAgfVxuICBmb3IgKGNvbnN0IGVudHJ5IG9mIGJhZ0VudHJpZXMpIHtcbiAgICBpZiAoXG4gICAgICBwYXNzU3R5bGVPZihlbnRyeSkgIT09ICdjb3B5QXJyYXknIHx8XG4gICAgICBlbnRyeS5sZW5ndGggIT09IDIgfHxcbiAgICAgIHR5cGVvZiBlbnRyeVsxXSAhPT0gJ2JpZ2ludCdcbiAgICApIHtcbiAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIFhgRWFjaCBlbnRyeSBvZiBhIGNvcHlCYWcgbXVzdCBiZSBwYWlyIG9mIGEga2V5IGFuZCBhIGJpZ2ludCByZXByZXNlbnRpbmcgYSBjb3VudDogJHtlbnRyeX1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgaWYgKGVudHJ5WzFdIDwgMSkge1xuICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgWGBFYWNoIGVudHJ5IG9mIGEgY29weUJhZyBtdXN0IGhhdmUgYSBwb3NpdGl2ZSBjb3VudDogJHtlbnRyeX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgLy9cbiAgcmV0dXJuIGNoZWNrTm9EdXBsaWNhdGVLZXlzKGJhZ0VudHJpZXMsIHVuZGVmaW5lZCwgY2hlY2spO1xufTskaM2PX29uY2UuY2hlY2tCYWdFbnRyaWVzKGNoZWNrQmFnRW50cmllcyk7XG5oYXJkZW4oY2hlY2tCYWdFbnRyaWVzKTtcblxuLy9cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0QmFnRW50cmllcyA9IGJhZ0VudHJpZXMgPT4ge1xuICBjaGVja0JhZ0VudHJpZXMoYmFnRW50cmllcywgYXNzZXJ0Q2hlY2tlcik7XG59OyRozY9fb25jZS5hc3NlcnRCYWdFbnRyaWVzKGFzc2VydEJhZ0VudHJpZXMpO1xuaGFyZGVuKGFzc2VydEJhZ0VudHJpZXMpO1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGNvZXJjZVRvQmFnRW50cmllcyA9IGJhZ0VudHJpZXNMaXN0ID0+IHtcbiAgY29uc3QgYmFnRW50cmllcyA9IHNvcnRCeVJhbmsoYmFnRW50cmllc0xpc3QsIGNvbXBhcmVBbnRpUmFuayk7XG4gIGFzc2VydEJhZ0VudHJpZXMoYmFnRW50cmllcyk7XG4gIHJldHVybiBiYWdFbnRyaWVzO1xufTskaM2PX29uY2UuY29lcmNlVG9CYWdFbnRyaWVzKGNvZXJjZVRvQmFnRW50cmllcyk7XG5oYXJkZW4oY29lcmNlVG9CYWdFbnRyaWVzKTtcblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VCYWdPZkVudHJpZXMgPSBiYWdFbnRyeUl0ZXIgPT5cbiAgbWFrZVRhZ2dlZCgnY29weUJhZycsIGNvZXJjZVRvQmFnRW50cmllcyhiYWdFbnRyeUl0ZXIpKTskaM2PX29uY2UubWFrZUJhZ09mRW50cmllcyhtYWtlQmFnT2ZFbnRyaWVzKTtcbmhhcmRlbihtYWtlQmFnT2ZFbnRyaWVzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydE5vRHVwbGljYXRlS2V5cyI6WyJhc3NlcnROb0R1cGxpY2F0ZUtleXMiXSwiY2hlY2tCYWdFbnRyaWVzIjpbImNoZWNrQmFnRW50cmllcyJdLCJhc3NlcnRCYWdFbnRyaWVzIjpbImFzc2VydEJhZ0VudHJpZXMiXSwiY29lcmNlVG9CYWdFbnRyaWVzIjpbImNvZXJjZVRvQmFnRW50cmllcyJdLCJtYWtlQmFnT2ZFbnRyaWVzIjpbIm1ha2VCYWdPZkVudHJpZXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAABxyd+3sMAAB7DAAAKQAAAEBlbmRvL3BhdHRlcm5zLXYxLjUuMC9zcmMva2V5cy9jb3B5U2V0LmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJhc3NlcnRFbGVtZW50cyIsImFzc2VydE5vRHVwbGljYXRlcyIsImNoZWNrRWxlbWVudHMiLCJjb2VyY2VUb0VsZW1lbnRzIiwibWFrZVNldE9mRWxlbWVudHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnRDaGVja2VyLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsY29tcGFyZUFudGlSYW5rLGlzUmFua1NvcnRlZCxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLFg7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJtYWtlVGFnZ2VkXCIsWyRozY9fYSA9PiAobWFrZVRhZ2dlZCA9ICRozY9fYSldXSxbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLFskaM2PX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRozY9fYSldXSxbXCJpc1JhbmtTb3J0ZWRcIixbJGjNj19hID0+IChpc1JhbmtTb3J0ZWQgPSAkaM2PX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIixbJGjNj19hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRozY9fYSldXSxbXCJzb3J0QnlSYW5rXCIsWyRozY9fYSA9PiAoc29ydEJ5UmFuayA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGNoZWNrTm9EdXBsaWNhdGVzID0gKGVsZW1lbnRzLCBmdWxsQ29tcGFyZSwgY2hlY2spID0+IHtcbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgZnVsbENvbXBhcmUgPSBmdWxsQ29tcGFyZSB8fCBtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuXG4gIGVsZW1lbnRzID0gc29ydEJ5UmFuayhlbGVtZW50cywgZnVsbENvbXBhcmUpO1xuICBjb25zdCB7IGxlbmd0aCB9ID0gZWxlbWVudHM7XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCBrMCA9IGVsZW1lbnRzW2kgLSAxXTtcbiAgICBjb25zdCBrMSA9IGVsZW1lbnRzW2ldO1xuICAgIGlmIChmdWxsQ29tcGFyZShrMCwgazEpID09PSAwKSB7XG4gICAgICByZXR1cm4gY2hlY2soZmFsc2UsIFhgdmFsdWUgaGFzIGR1cGxpY2F0ZSBrZXlzOiAke2swfWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydE5vRHVwbGljYXRlcyA9IChlbGVtZW50cywgZnVsbENvbXBhcmUgPSB1bmRlZmluZWQpID0+IHtcbiAgY2hlY2tOb0R1cGxpY2F0ZXMoZWxlbWVudHMsIGZ1bGxDb21wYXJlLCBhc3NlcnRDaGVja2VyKTtcbn07XG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UuYXNzZXJ0Tm9EdXBsaWNhdGVzKGFzc2VydE5vRHVwbGljYXRlcyk7XG4gICAgICAgY29uc3QgY2hlY2tFbGVtZW50cyA9IChlbGVtZW50cywgY2hlY2spID0+IHtcbiAgaWYgKHBhc3NTdHlsZU9mKGVsZW1lbnRzKSAhPT0gJ2NvcHlBcnJheScpIHtcbiAgICByZXR1cm4gY2hlY2soXG4gICAgICBmYWxzZSxcbiAgICAgIFhgVGhlIGtleXMgb2YgYSBjb3B5U2V0IG9yIGNvcHlNYXAgbXVzdCBiZSBhIGNvcHlBcnJheTogJHtlbGVtZW50c31gLFxuICAgICk7XG4gIH1cbiAgaWYgKCFpc1JhbmtTb3J0ZWQoZWxlbWVudHMsIGNvbXBhcmVBbnRpUmFuaykpIHtcbiAgICByZXR1cm4gY2hlY2soXG4gICAgICBmYWxzZSxcbiAgICAgIFhgVGhlIGtleXMgb2YgYSBjb3B5U2V0IG9yIGNvcHlNYXAgbXVzdCBiZSBzb3J0ZWQgaW4gcmV2ZXJzZSByYW5rIG9yZGVyOiAke2VsZW1lbnRzfWAsXG4gICAgKTtcbiAgfVxuICByZXR1cm4gY2hlY2tOb0R1cGxpY2F0ZXMoZWxlbWVudHMsIHVuZGVmaW5lZCwgY2hlY2spO1xufTskaM2PX29uY2UuY2hlY2tFbGVtZW50cyhjaGVja0VsZW1lbnRzKTtcbmhhcmRlbihjaGVja0VsZW1lbnRzKTtcblxuICAgICAgIGNvbnN0IGFzc2VydEVsZW1lbnRzID0gZWxlbWVudHMgPT4ge1xuICBjaGVja0VsZW1lbnRzKGVsZW1lbnRzLCBhc3NlcnRDaGVja2VyKTtcbn07JGjNj19vbmNlLmFzc2VydEVsZW1lbnRzKGFzc2VydEVsZW1lbnRzKTtcbmhhcmRlbihhc3NlcnRFbGVtZW50cyk7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgY29lcmNlVG9FbGVtZW50cyA9IGVsZW1lbnRzTGlzdCA9PiB7XG4gIGNvbnN0IGVsZW1lbnRzID0gc29ydEJ5UmFuayhlbGVtZW50c0xpc3QsIGNvbXBhcmVBbnRpUmFuayk7XG4gIGFzc2VydEVsZW1lbnRzKGVsZW1lbnRzKTtcbiAgcmV0dXJuIGVsZW1lbnRzO1xufTskaM2PX29uY2UuY29lcmNlVG9FbGVtZW50cyhjb2VyY2VUb0VsZW1lbnRzKTtcbmhhcmRlbihjb2VyY2VUb0VsZW1lbnRzKTtcblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VTZXRPZkVsZW1lbnRzID0gZWxlbWVudEl0ZXIgPT5cbiAgbWFrZVRhZ2dlZCgnY29weVNldCcsIGNvZXJjZVRvRWxlbWVudHMoZWxlbWVudEl0ZXIpKTskaM2PX29uY2UubWFrZVNldE9mRWxlbWVudHMobWFrZVNldE9mRWxlbWVudHMpO1xuaGFyZGVuKG1ha2VTZXRPZkVsZW1lbnRzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydE5vRHVwbGljYXRlcyI6WyJhc3NlcnROb0R1cGxpY2F0ZXMiXSwiY2hlY2tFbGVtZW50cyI6WyJjaGVja0VsZW1lbnRzIl0sImFzc2VydEVsZW1lbnRzIjpbImFzc2VydEVsZW1lbnRzIl0sImNvZXJjZVRvRWxlbWVudHMiOlsiY29lcmNlVG9FbGVtZW50cyJdLCJtYWtlU2V0T2ZFbGVtZW50cyI6WyJtYWtlU2V0T2ZFbGVtZW50cyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAPyB9jdhYAAHYWAAA5AAAAQGVuZG8vcGF0dGVybnMtdjEuNS4wL3NyYy9rZXlzL2tleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAZW5kby9jb21tb24vbWFrZS1pdGVyYXRvci5qcyIsIkBlbmRvL2NvbW1vbi9tYWtlLWFycmF5LWl0ZXJhdG9yLmpzIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiZ2VuZXJhdGVDb2xsZWN0aW9uUGFpckVudHJpZXMiLCJtYWtlQ29tcGFyZUNvbGxlY3Rpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnRSYW5rU29ydGVkLGNvbXBhcmVBbnRpUmFuayxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLG1ha2VJdGVyYXRvcixtYWtlQXJyYXlJdGVyYXRvcixxLEZhaWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRSYW5rU29ydGVkXCIsWyRozY9fYSA9PiAoYXNzZXJ0UmFua1NvcnRlZCA9ICRozY9fYSldXSxbXCJjb21wYXJlQW50aVJhbmtcIixbJGjNj19hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaM2PX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIixbJGjNj19hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRozY9fYSldXSxbXCJzb3J0QnlSYW5rXCIsWyRozY9fYSA9PiAoc29ydEJ5UmFuayA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9tYWtlLWl0ZXJhdG9yLmpzXCIsIFtbXCJtYWtlSXRlcmF0b3JcIixbJGjNj19hID0+IChtYWtlSXRlcmF0b3IgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vbWFrZS1hcnJheS1pdGVyYXRvci5qc1wiLCBbW1wibWFrZUFycmF5SXRlcmF0b3JcIixbJGjNj19hID0+IChtYWtlQXJyYXlJdGVyYXRvciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBnZW5lcmF0ZUZ1bGxTb3J0ZWRFbnRyaWVzID0gKGVudHJpZXMsIHJhbmtDb21wYXJlLCBmdWxsQ29tcGFyZSkgPT4ge1xuICAvL1xuICBhc3NlcnRSYW5rU29ydGVkKGVudHJpZXMsIHJhbmtDb21wYXJlKTtcbiAgY29uc3QgeyBsZW5ndGggfSA9IGVudHJpZXM7XG4gIGxldCBpID0gMDtcbiAgbGV0IHNhbWVSYW5rSXRlcmF0b3I7XG4gIHJldHVybiBtYWtlSXRlcmF0b3IoKCkgPT4ge1xuICAgIGlmIChzYW1lUmFua0l0ZXJhdG9yKSB7XG4gICAgICBjb25zdCByZXN1bHQgPSBzYW1lUmFua0l0ZXJhdG9yLm5leHQoKTtcbiAgICAgIGlmICghcmVzdWx0LmRvbmUpIHtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgIH1cbiAgICAgIHNhbWVSYW5rSXRlcmF0b3IgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGlmIChpIDwgbGVuZ3RoKSB7XG4gICAgICBjb25zdCBlbnRyeSA9IGVudHJpZXNbaV07XG4gICAgICAvL1xuICAgICAgbGV0IGogPSBpICsgMTtcbiAgICAgIHdoaWxlIChqIDwgbGVuZ3RoICYmIHJhbmtDb21wYXJlKGVudHJ5WzBdLCBlbnRyaWVzW2pdWzBdKSA9PT0gMCkge1xuICAgICAgICBqICs9IDE7XG4gICAgICB9XG4gICAgICBpZiAoaiA9PT0gaSArIDEpIHtcbiAgICAgICAgLy9cbiAgICAgICAgaSA9IGo7XG4gICAgICAgIHJldHVybiBoYXJkZW4oeyBkb25lOiBmYWxzZSwgdmFsdWU6IGVudHJ5IH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgdGllcyA9IGVudHJpZXMuc2xpY2UoaSwgaik7XG4gICAgICBpID0gajtcblxuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3Qgc29ydGVkVGllcyA9IHNvcnRCeVJhbmsodGllcywgZnVsbENvbXBhcmUpO1xuICAgICAgZm9yIChsZXQgayA9IDE7IGsgPCBzb3J0ZWRUaWVzLmxlbmd0aDsgayArPSAxKSB7XG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IFtrZXkwXSA9IHNvcnRlZFRpZXNbayAtIDFdO1xuICAgICAgICBjb25zdCBba2V5MV0gPSBzb3J0ZWRUaWVzW2tdO1xuICAgICAgICBNYXRoLnNpZ24oZnVsbENvbXBhcmUoa2V5MCwga2V5MSkpIHx8XG4gICAgICAgICAgRmFpbGBEdXBsaWNhdGUgZW50cnkga2V5OiAke2tleTB9YDtcbiAgICAgIH1cbiAgICAgIHNhbWVSYW5rSXRlcmF0b3IgPSBtYWtlQXJyYXlJdGVyYXRvcihzb3J0ZWRUaWVzKTtcbiAgICAgIHJldHVybiBzYW1lUmFua0l0ZXJhdG9yLm5leHQoKTtcbiAgICB9XG4gICAgcmV0dXJuIGhhcmRlbih7IGRvbmU6IHRydWUsIHZhbHVlOiB1bmRlZmluZWQgfSk7XG4gIH0pO1xufTtcbmhhcmRlbihnZW5lcmF0ZUZ1bGxTb3J0ZWRFbnRyaWVzKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzID0gKFxuICBjMSxcbiAgYzIsXG4gIGdldEVudHJpZXMsXG4gIGFic2VudFZhbHVlLFxuKSA9PiB7XG4gIGNvbnN0IGUxID0gZ2V0RW50cmllcyhjMSk7XG4gIGNvbnN0IGUyID0gZ2V0RW50cmllcyhjMik7XG5cbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgZnVsbENvbXBhcmUgPSBtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuICBjb25zdCB4ID0gZ2VuZXJhdGVGdWxsU29ydGVkRW50cmllcyhlMSwgY29tcGFyZUFudGlSYW5rLCBmdWxsQ29tcGFyZSk7XG4gIGNvbnN0IHkgPSBnZW5lcmF0ZUZ1bGxTb3J0ZWRFbnRyaWVzKGUyLCBjb21wYXJlQW50aVJhbmssIGZ1bGxDb21wYXJlKTtcblxuICAvL1xuICAvL1xuICBsZXQgeERvbmU7XG4gIGxldCB4S2V5O1xuICBsZXQgeFZhbHVlO1xuICBsZXQgeURvbmU7XG4gIGxldCB5S2V5O1xuICBsZXQgeVZhbHVlO1xuICBjb25zdCBub25FbnRyeSA9IFt1bmRlZmluZWQsIHVuZGVmaW5lZF07XG4gIGNvbnN0IG5leHRYID0gKCkgPT4ge1xuICAgICF4RG9uZSB8fCBGYWlsYEludGVybmFsOiBuZXh0WCBtdXN0IG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbiAgICBjb25zdCByZXN1bHQgPSB4VmFsdWU7XG4gICAgKHsgZG9uZTogeERvbmUsIHZhbHVlOiBbeEtleSwgeFZhbHVlXSA9IG5vbkVudHJ5IH0gPSB4Lm5leHQoKSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcbiAgbmV4dFgoKTtcbiAgY29uc3QgbmV4dFkgPSAoKSA9PiB7XG4gICAgIXlEb25lIHx8IEZhaWxgSW50ZXJuYWw6IG5leHRZIG11c3Qgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuICAgIGNvbnN0IHJlc3VsdCA9IHlWYWx1ZTtcbiAgICAoeyBkb25lOiB5RG9uZSwgdmFsdWU6IFt5S2V5LCB5VmFsdWVdID0gbm9uRW50cnkgfSA9IHkubmV4dCgpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICBuZXh0WSgpO1xuICByZXR1cm4gbWFrZUl0ZXJhdG9yKCgpID0+IHtcbiAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGxldCB2YWx1ZTtcbiAgICBpZiAoeERvbmUgJiYgeURvbmUpIHtcbiAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgdmFsdWUgPSBbdW5kZWZpbmVkLCBhYnNlbnRWYWx1ZSwgYWJzZW50VmFsdWVdO1xuICAgIH0gZWxzZSBpZiAoeERvbmUpIHtcbiAgICAgIHZhbHVlID0gW3lLZXksIGFic2VudFZhbHVlLCBuZXh0WSgpXTtcbiAgICB9IGVsc2UgaWYgKHlEb25lKSB7XG4gICAgICB2YWx1ZSA9IFt4S2V5LCBuZXh0WCgpLCBhYnNlbnRWYWx1ZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3QgY29tcCA9IGZ1bGxDb21wYXJlKHhLZXksIHlLZXkpO1xuICAgICAgaWYgKGNvbXAgPT09IDApIHtcbiAgICAgICAgdmFsdWUgPSBbeEtleSwgbmV4dFgoKSwgbmV4dFkoKV07XG4gICAgICB9IGVsc2UgaWYgKGNvbXAgPCAwKSB7XG4gICAgICAgIHZhbHVlID0gW3hLZXksIG5leHRYKCksIGFic2VudFZhbHVlXTtcbiAgICAgIH0gZWxzZSBpZiAoY29tcCA+IDApIHtcbiAgICAgICAgdmFsdWUgPSBbeUtleSwgYWJzZW50VmFsdWUsIG5leHRZKCldO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgRmFpbGBVbmV4cGVjdGVkIGtleSBjb21wYXJpc29uICR7cShjb21wKX0gZm9yICR7eEtleX0gdnMgJHt5S2V5fWA7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBoYXJkZW4oeyBkb25lLCB2YWx1ZSB9KTtcbiAgfSk7XG59OyRozY9fb25jZS5nZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyhnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyk7XG5oYXJkZW4oZ2VuZXJhdGVDb2xsZWN0aW9uUGFpckVudHJpZXMpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VDb21wYXJlQ29sbGVjdGlvbiA9IChnZXRFbnRyaWVzLCBhYnNlbnRWYWx1ZSwgY29tcGFyZVZhbHVlcykgPT5cbiAgaGFyZGVuKChsZWZ0LCByaWdodCkgPT4ge1xuICAgIGNvbnN0IG1lcmdlZCA9IGdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzKFxuICAgICAgbGVmdCxcbiAgICAgIHJpZ2h0LFxuICAgICAgZ2V0RW50cmllcyxcbiAgICAgIGFic2VudFZhbHVlLFxuICAgICk7XG4gICAgbGV0IGxlZnRJc0JpZ2dlciA9IGZhbHNlO1xuICAgIGxldCByaWdodElzQmlnZ2VyID0gZmFsc2U7XG4gICAgZm9yIChjb25zdCBbX2tleSwgbGVmdFZhbHVlLCByaWdodFZhbHVlXSBvZiBtZXJnZWQpIHtcbiAgICAgIGNvbnN0IGNvbXAgPSBjb21wYXJlVmFsdWVzKGxlZnRWYWx1ZSwgcmlnaHRWYWx1ZSk7XG4gICAgICBpZiAoY29tcCA9PT0gMCkge1xuICAgICAgICAvL1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH0gZWxzZSBpZiAoY29tcCA8IDApIHtcbiAgICAgICAgLy9cbiAgICAgICAgcmlnaHRJc0JpZ2dlciA9IHRydWU7XG4gICAgICB9IGVsc2UgaWYgKGNvbXAgPiAwKSB7XG4gICAgICAgIC8vXG4gICAgICAgIGxlZnRJc0JpZ2dlciA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBOdW1iZXIuaXNOYU4oY29tcCkgfHxcbiAgICAgICAgICAvL1xuICAgICAgICAgIEZhaWxgVW5leHBlY3RlZCB2YWx1ZSBjb21wYXJpc29uICR7cShjb21wKX0gZm9yICR7bGVmdFZhbHVlfSB2cyAke3JpZ2h0VmFsdWV9YDtcbiAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgIH1cbiAgICAgIGlmIChsZWZ0SXNCaWdnZXIgJiYgcmlnaHRJc0JpZ2dlcikge1xuICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgfVxuICAgIH1cbiAgICAvL1xuICAgIHJldHVybiBsZWZ0SXNCaWdnZXIgPyAxIDogcmlnaHRJc0JpZ2dlciA/IC0xIDogMDtcbiAgfSk7JGjNj19vbmNlLm1ha2VDb21wYXJlQ29sbGVjdGlvbihtYWtlQ29tcGFyZUNvbGxlY3Rpb24pO1xuaGFyZGVuKG1ha2VDb21wYXJlQ29sbGVjdGlvbik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyI6WyJnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyJdLCJtYWtlQ29tcGFyZUNvbGxlY3Rpb24iOlsibWFrZUNvbXBhcmVDb2xsZWN0aW9uIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANICYgGRHAAAkRwAADUAAABAZW5kby9wYXR0ZXJucy12MS41LjAvc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGVuZG8vZXJyb3JzIiwiLi9jb3B5QmFnLmpzIl0sImV4cG9ydHMiOlsiYmFnRGlzam9pbnRTdWJ0cmFjdCIsImJhZ0ludGVyc2VjdGlvbiIsImJhZ0lzRGlzam9pbnQiLCJiYWdJc1N1cGVyYmFnIiwiYmFnVW5pb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnRSYW5rU29ydGVkLGNvbXBhcmVBbnRpUmFuayxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLHEsRmFpbCxhc3NlcnROb0R1cGxpY2F0ZUtleXMsbWFrZUJhZ09mRW50cmllczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydFJhbmtTb3J0ZWRcIixbJGjNj19hID0+IChhc3NlcnRSYW5rU29ydGVkID0gJGjNj19hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLFskaM2PX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRozY9fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLFskaM2PX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjNj19hKV1dLFtcInNvcnRCeVJhbmtcIixbJGjNj19hID0+IChzb3J0QnlSYW5rID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vY29weUJhZy5qc1wiLCBbW1wiYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzXCIsWyRozY9fYSA9PiAoYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzID0gJGjNj19hKV1dLFtcIm1ha2VCYWdPZkVudHJpZXNcIixbJGjNj19hID0+IChtYWtlQmFnT2ZFbnRyaWVzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG4vKlxuXG5cbiAqL1xuXG4vL1xuLy9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgYmFnV2luZG93UmVzb3J0ID0gKGJhZ0VudHJpZXMsIHJhbmtDb21wYXJlLCBmdWxsQ29tcGFyZSkgPT4ge1xuICBhc3NlcnRSYW5rU29ydGVkKGJhZ0VudHJpZXMsIHJhbmtDb21wYXJlKTtcbiAgY29uc3QgeyBsZW5ndGggfSA9IGJhZ0VudHJpZXM7XG4gIGxldCBpID0gMDtcbiAgbGV0IG9wdElubmVySXRlcmF0b3I7XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PlxuICAgICAgaGFyZGVuKHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGlmIChvcHRJbm5lckl0ZXJhdG9yKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgICAgICBvcHRJbm5lckl0ZXJhdG9yID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGkgPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gYmFnRW50cmllc1tpXTtcbiAgICAgICAgICAgIGxldCBqID0gaSArIDE7XG4gICAgICAgICAgICB3aGlsZSAoXG4gICAgICAgICAgICAgIGogPCBsZW5ndGggJiZcbiAgICAgICAgICAgICAgcmFua0NvbXBhcmUoZW50cnlbMF0sIGJhZ0VudHJpZXNbal1bMF0pID09PSAwXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgaiArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGogPT09IGkgKyAxKSB7XG4gICAgICAgICAgICAgIGkgPSBqO1xuICAgICAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgZG9uZTogZmFsc2UsIHZhbHVlOiBlbnRyeSB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHNpbWlsYXJSdW4gPSBiYWdFbnRyaWVzLnNsaWNlKGksIGopO1xuICAgICAgICAgICAgaSA9IGo7XG4gICAgICAgICAgICBjb25zdCByZXNvcnRlZCA9IHNvcnRCeVJhbmsoc2ltaWxhclJ1biwgZnVsbENvbXBhcmUpO1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzKHJlc29ydGVkLCBmdWxsQ29tcGFyZSk7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIG9wdElubmVySXRlcmF0b3IgPSByZXNvcnRlZFtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgICAgICAgICByZXR1cm4gb3B0SW5uZXJJdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBoYXJkZW4oeyBkb25lOiB0cnVlLCB2YWx1ZTogW251bGwsIDBuXSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KSxcbiAgfSk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWVyZ2UgPSAoeGJhZ0VudHJpZXMsIHliYWdFbnRyaWVzKSA9PiB7XG4gIC8vXG4gIC8vXG4gIGNvbnN0IGZ1bGxDb21wYXJlID0gbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcblxuICBjb25zdCB4cyA9IGJhZ1dpbmRvd1Jlc29ydCh4YmFnRW50cmllcywgY29tcGFyZUFudGlSYW5rLCBmdWxsQ29tcGFyZSk7XG4gIGNvbnN0IHlzID0gYmFnV2luZG93UmVzb3J0KHliYWdFbnRyaWVzLCBjb21wYXJlQW50aVJhbmssIGZ1bGxDb21wYXJlKTtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8qICAgICAgICAgICAgKi9cbiAgICAgIGxldCB4O1xuICAgICAgbGV0IHhjO1xuICAgICAgbGV0IHhEb25lO1xuICAgICAgLyogICAgICAgICAgICAqL1xuICAgICAgbGV0IHk7XG4gICAgICBsZXQgeWM7XG4gICAgICBsZXQgeURvbmU7XG5cbiAgICAgIGNvbnN0IHhpID0geHNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgY29uc3QgbmV4dFggPSAoKSA9PiB7XG4gICAgICAgICF4RG9uZSB8fCBGYWlsYEludGVybmFsOiBuZXh0WCBzaG91bGQgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuICAgICAgICAoe1xuICAgICAgICAgIGRvbmU6IHhEb25lLFxuICAgICAgICAgIHZhbHVlOiBbeCwgeGNdLFxuICAgICAgICB9ID0geGkubmV4dCgpKTtcbiAgICAgIH07XG4gICAgICBuZXh0WCgpO1xuXG4gICAgICBjb25zdCB5aSA9IHlzW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICAgIGNvbnN0IG5leHRZID0gKCkgPT4ge1xuICAgICAgICAheURvbmUgfHwgRmFpbGBJbnRlcm5hbDogbmV4dFkgc2hvdWxkIG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbiAgICAgICAgKHtcbiAgICAgICAgICBkb25lOiB5RG9uZSxcbiAgICAgICAgICB2YWx1ZTogW3ksIHljXSxcbiAgICAgICAgfSA9IHlpLm5leHQoKSk7XG4gICAgICB9O1xuICAgICAgbmV4dFkoKTtcblxuICAgICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgIGxldCB2YWx1ZTtcbiAgICAgICAgICBpZiAoeERvbmUgJiYgeURvbmUpIHtcbiAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIHZhbHVlID0gW251bGwsIDBuLCAwbl07XG4gICAgICAgICAgfSBlbHNlIGlmICh4RG9uZSkge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIHZhbHVlID0gW3ksIDBuLCB5Y107XG4gICAgICAgICAgICBuZXh0WSgpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoeURvbmUpIHtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICB2YWx1ZSA9IFt4LCB4YywgMG5dO1xuICAgICAgICAgICAgbmV4dFgoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29uc3QgY29tcCA9IGZ1bGxDb21wYXJlKHgsIHkpO1xuICAgICAgICAgICAgaWYgKGNvbXAgPT09IDApIHtcbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgdmFsdWUgPSBbeCwgeGMsIHljXTtcbiAgICAgICAgICAgICAgbmV4dFgoKTtcbiAgICAgICAgICAgICAgbmV4dFkoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29tcCA8IDApIHtcbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgdmFsdWUgPSBbeCwgeGMsIDBuXTtcbiAgICAgICAgICAgICAgbmV4dFgoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIGNvbXAgPiAwIHx8IEZhaWxgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgY29tcCAke3EoY29tcCl9YDtcbiAgICAgICAgICAgICAgdmFsdWUgPSBbeSwgMG4sIHljXTtcbiAgICAgICAgICAgICAgbmV4dFkoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGhhcmRlbih7IGRvbmUsIHZhbHVlIH0pO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59O1xuaGFyZGVuKG1lcmdlKTtcblxuLy9cbi8vXG4vKlxuXG5cblxuICovXG5jb25zdCBiYWdJdGVySXNTdXBlcmJhZyA9IHh5aSA9PiB7XG4gIGZvciAoY29uc3QgW19tLCB4YywgeWNdIG9mIHh5aSkge1xuICAgIGlmICh4YyA8IHljKSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8vXG4vL1xuLypcblxuXG5cbiAqL1xuY29uc3QgYmFnSXRlcklzRGlzam9pbnQgPSB4eWkgPT4ge1xuICBmb3IgKGNvbnN0IFtfbSwgeGMsIHljXSBvZiB4eWkpIHtcbiAgICBpZiAoeGMgPj0gMW4gJiYgeWMgPj0gMW4pIHtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYmFnSXRlclVuaW9uID0geHlpID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGNvbnN0IFttLCB4YywgeWNdIG9mIHh5aSkge1xuICAgIHJlc3VsdC5wdXNoKFttLCB4YyArIHljXSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGJhZ0l0ZXJJbnRlcnNlY3Rpb24gPSB4eWkgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGZvciAoY29uc3QgW20sIHhjLCB5Y10gb2YgeHlpKSB7XG4gICAgY29uc3QgbWMgPSB4YyA8PSB5YyA/IHhjIDogeWM7XG4gICAgcmVzdWx0LnB1c2goW20sIG1jXSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGJhZ0l0ZXJEaXNqb2ludFN1YnRyYWN0ID0geHlpID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGNvbnN0IFttLCB4YywgeWNdIG9mIHh5aSkge1xuICAgIGNvbnN0IG1jID0geGMgLSB5YztcbiAgICBtYyA+PSAwbiB8fCBGYWlsYHJpZ2h0IGVsZW1lbnQgJHttfSB3YXMgbm90IGluIGxlZnRgO1xuICAgIGlmIChtYyA+PSAxbikge1xuICAgICAgLy9cbiAgICAgIHJlc3VsdC5wdXNoKFttLCBtY10pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuY29uc3QgbWVyZ2VpZnkgPSBiYWdJdGVyT3AgPT4gKHhiYWdFbnRyaWVzLCB5YmFnRW50cmllcykgPT5cbiAgYmFnSXRlck9wKG1lcmdlKHhiYWdFbnRyaWVzLCB5YmFnRW50cmllcykpO1xuXG5jb25zdCBiYWdFbnRyaWVzSXNTdXBlcmJhZyA9IG1lcmdlaWZ5KGJhZ0l0ZXJJc1N1cGVyYmFnKTtcbmNvbnN0IGJhZ0VudHJpZXNJc0Rpc2pvaW50ID0gbWVyZ2VpZnkoYmFnSXRlcklzRGlzam9pbnQpO1xuY29uc3QgYmFnRW50cmllc1VuaW9uID0gbWVyZ2VpZnkoYmFnSXRlclVuaW9uKTtcbmNvbnN0IGJhZ0VudHJpZXNJbnRlcnNlY3Rpb24gPSBtZXJnZWlmeShiYWdJdGVySW50ZXJzZWN0aW9uKTtcbmNvbnN0IGJhZ0VudHJpZXNEaXNqb2ludFN1YnRyYWN0ID0gbWVyZ2VpZnkoYmFnSXRlckRpc2pvaW50U3VidHJhY3QpO1xuXG5jb25zdCByYXdCYWdpZnkgPSBiYWdFbnRyaWVzT3AgPT4gKHhiYWcsIHliYWcpID0+XG4gIGJhZ0VudHJpZXNPcCh4YmFnLnBheWxvYWQsIHliYWcucGF5bG9hZCk7XG5cbmNvbnN0IGJhZ2lmeSA9IGJhZ0VudHJpZXNPcCA9PiAoeGJhZywgeWJhZykgPT5cbiAgbWFrZUJhZ09mRW50cmllcyhiYWdFbnRyaWVzT3AoeGJhZy5wYXlsb2FkLCB5YmFnLnBheWxvYWQpKTtcblxuICAgICAgIGNvbnN0IGJhZ0lzU3VwZXJiYWcgPSByYXdCYWdpZnkoYmFnRW50cmllc0lzU3VwZXJiYWcpOyRozY9fb25jZS5iYWdJc1N1cGVyYmFnKGJhZ0lzU3VwZXJiYWcpO1xuICAgICAgIGNvbnN0IGJhZ0lzRGlzam9pbnQgPSByYXdCYWdpZnkoYmFnRW50cmllc0lzRGlzam9pbnQpOyRozY9fb25jZS5iYWdJc0Rpc2pvaW50KGJhZ0lzRGlzam9pbnQpO1xuICAgICAgIGNvbnN0IGJhZ1VuaW9uID0gYmFnaWZ5KGJhZ0VudHJpZXNVbmlvbik7JGjNj19vbmNlLmJhZ1VuaW9uKGJhZ1VuaW9uKTtcbiAgICAgICBjb25zdCBiYWdJbnRlcnNlY3Rpb24gPSBiYWdpZnkoYmFnRW50cmllc0ludGVyc2VjdGlvbik7JGjNj19vbmNlLmJhZ0ludGVyc2VjdGlvbihiYWdJbnRlcnNlY3Rpb24pO1xuICAgICAgIGNvbnN0IGJhZ0Rpc2pvaW50U3VidHJhY3QgPSBiYWdpZnkoYmFnRW50cmllc0Rpc2pvaW50U3VidHJhY3QpOyRozY9fb25jZS5iYWdEaXNqb2ludFN1YnRyYWN0KGJhZ0Rpc2pvaW50U3VidHJhY3QpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYmFnSXNTdXBlcmJhZyI6WyJiYWdJc1N1cGVyYmFnIl0sImJhZ0lzRGlzam9pbnQiOlsiYmFnSXNEaXNqb2ludCJdLCJiYWdVbmlvbiI6WyJiYWdVbmlvbiJdLCJiYWdJbnRlcnNlY3Rpb24iOlsiYmFnSW50ZXJzZWN0aW9uIl0sImJhZ0Rpc2pvaW50U3VidHJhY3QiOlsiYmFnRGlzam9pbnRTdWJ0cmFjdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD5UY4TSSMAAEkjAAA1AAAAQGVuZG8vcGF0dGVybnMtdjEuNS4wL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL2Vycm9ycyIsIi4vY29weVNldC5qcyJdLCJleHBvcnRzIjpbImVsZW1lbnRzQ29tcGFyZSIsImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCIsImVsZW1lbnRzRGlzam9pbnRVbmlvbiIsImVsZW1lbnRzSW50ZXJzZWN0aW9uIiwiZWxlbWVudHNJc0Rpc2pvaW50IiwiZWxlbWVudHNJc1N1cGVyc2V0IiwiZWxlbWVudHNVbmlvbiIsInNldERpc2pvaW50U3VidHJhY3QiLCJzZXREaXNqb2ludFVuaW9uIiwic2V0SW50ZXJzZWN0aW9uIiwic2V0SXNEaXNqb2ludCIsInNldElzU3VwZXJzZXQiLCJzZXRVbmlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzc2VydFJhbmtTb3J0ZWQsY29tcGFyZUFudGlSYW5rLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbmsscSxGYWlsLGFzc2VydE5vRHVwbGljYXRlcyxtYWtlU2V0T2ZFbGVtZW50czskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydFJhbmtTb3J0ZWRcIixbJGjNj19hID0+IChhc3NlcnRSYW5rU29ydGVkID0gJGjNj19hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLFskaM2PX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRozY9fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLFskaM2PX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjNj19hKV1dLFtcInNvcnRCeVJhbmtcIixbJGjNj19hID0+IChzb3J0QnlSYW5rID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vY29weVNldC5qc1wiLCBbW1wiYXNzZXJ0Tm9EdXBsaWNhdGVzXCIsWyRozY9fYSA9PiAoYXNzZXJ0Tm9EdXBsaWNhdGVzID0gJGjNj19hKV1dLFtcIm1ha2VTZXRPZkVsZW1lbnRzXCIsWyRozY9fYSA9PiAobWFrZVNldE9mRWxlbWVudHMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG4gKi9cblxuLy9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3Qgd2luZG93UmVzb3J0ID0gKGVsZW1lbnRzLCByYW5rQ29tcGFyZSwgZnVsbENvbXBhcmUpID0+IHtcbiAgYXNzZXJ0UmFua1NvcnRlZChlbGVtZW50cywgcmFua0NvbXBhcmUpO1xuICBjb25zdCB7IGxlbmd0aCB9ID0gZWxlbWVudHM7XG4gIGxldCBpID0gMDtcbiAgbGV0IG9wdElubmVySXRlcmF0b3I7XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PlxuICAgICAgaGFyZGVuKHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGlmIChvcHRJbm5lckl0ZXJhdG9yKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgICAgICBvcHRJbm5lckl0ZXJhdG9yID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGkgPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZWxlbWVudHNbaV07XG4gICAgICAgICAgICBsZXQgaiA9IGkgKyAxO1xuICAgICAgICAgICAgd2hpbGUgKGogPCBsZW5ndGggJiYgcmFua0NvbXBhcmUodmFsdWUsIGVsZW1lbnRzW2pdKSA9PT0gMCkge1xuICAgICAgICAgICAgICBqICs9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaiA9PT0gaSArIDEpIHtcbiAgICAgICAgICAgICAgaSA9IGo7XG4gICAgICAgICAgICAgIHJldHVybiBoYXJkZW4oeyBkb25lOiBmYWxzZSwgdmFsdWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzaW1pbGFyUnVuID0gZWxlbWVudHMuc2xpY2UoaSwgaik7XG4gICAgICAgICAgICBpID0gajtcbiAgICAgICAgICAgIGNvbnN0IHJlc29ydGVkID0gc29ydEJ5UmFuayhzaW1pbGFyUnVuLCBmdWxsQ29tcGFyZSk7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICBhc3NlcnROb0R1cGxpY2F0ZXMocmVzb3J0ZWQsIGZ1bGxDb21wYXJlKTtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgb3B0SW5uZXJJdGVyYXRvciA9IHJlc29ydGVkW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICAgICAgICAgIHJldHVybiBvcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGhhcmRlbih7IGRvbmU6IHRydWUsIHZhbHVlOiBudWxsIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICB9KTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBtZXJnZSA9ICh4ZWxlbWVudHMsIHllbGVtZW50cykgPT4ge1xuICAvL1xuICAvL1xuICBjb25zdCBmdWxsQ29tcGFyZSA9IG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbiAgY29uc3QgeHMgPSB3aW5kb3dSZXNvcnQoeGVsZW1lbnRzLCBjb21wYXJlQW50aVJhbmssIGZ1bGxDb21wYXJlKTtcbiAgY29uc3QgeXMgPSB3aW5kb3dSZXNvcnQoeWVsZW1lbnRzLCBjb21wYXJlQW50aVJhbmssIGZ1bGxDb21wYXJlKTtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8qICAgICAgICAgICAgKi9cbiAgICAgIGxldCB4O1xuICAgICAgbGV0IHhEb25lO1xuICAgICAgLyogICAgICAgICAgICAqL1xuICAgICAgbGV0IHk7XG4gICAgICBsZXQgeURvbmU7XG5cbiAgICAgIGNvbnN0IHhpID0geHNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgY29uc3QgbmV4dFggPSAoKSA9PiB7XG4gICAgICAgICF4RG9uZSB8fCBGYWlsYEludGVybmFsOiBuZXh0WCBzaG91bGQgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuICAgICAgICAoeyBkb25lOiB4RG9uZSwgdmFsdWU6IHggfSA9IHhpLm5leHQoKSk7XG4gICAgICB9O1xuICAgICAgbmV4dFgoKTtcblxuICAgICAgY29uc3QgeWkgPSB5c1tTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgICBjb25zdCBuZXh0WSA9ICgpID0+IHtcbiAgICAgICAgIXlEb25lIHx8IEZhaWxgSW50ZXJuYWw6IG5leHRZIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4gICAgICAgICh7IGRvbmU6IHlEb25lLCB2YWx1ZTogeSB9ID0geWkubmV4dCgpKTtcbiAgICAgIH07XG4gICAgICBuZXh0WSgpO1xuXG4gICAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgbGV0IHZhbHVlO1xuICAgICAgICAgIGlmICh4RG9uZSAmJiB5RG9uZSkge1xuICAgICAgICAgICAgZG9uZSA9IHRydWU7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgdmFsdWUgPSBbbnVsbCwgMG4sIDBuXTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHhEb25lKSB7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgdmFsdWUgPSBbeSwgMG4sIDFuXTtcbiAgICAgICAgICAgIG5leHRZKCk7XG4gICAgICAgICAgfSBlbHNlIGlmICh5RG9uZSkge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIHZhbHVlID0gW3gsIDFuLCAwbl07XG4gICAgICAgICAgICBuZXh0WCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjb21wID0gZnVsbENvbXBhcmUoeCwgeSk7XG4gICAgICAgICAgICBpZiAoY29tcCA9PT0gMCkge1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICB2YWx1ZSA9IFt4LCAxbiwgMW5dO1xuICAgICAgICAgICAgICBuZXh0WCgpO1xuICAgICAgICAgICAgICBuZXh0WSgpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChjb21wIDwgMCkge1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICB2YWx1ZSA9IFt4LCAxbiwgMG5dO1xuICAgICAgICAgICAgICBuZXh0WCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgY29tcCA+IDAgfHwgRmFpbGBJbnRlcm5hbDogVW5leHBlY3RlZCBjb21wICR7cShjb21wKX1gO1xuICAgICAgICAgICAgICB2YWx1ZSA9IFt5LCAwbiwgMW5dO1xuICAgICAgICAgICAgICBuZXh0WSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgZG9uZSwgdmFsdWUgfSk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbn07XG5oYXJkZW4obWVyZ2UpO1xuXG5jb25zdCBpdGVySXNTdXBlcnNldCA9IHh5aSA9PiB7XG4gIGZvciAoY29uc3QgW19tLCB4YywgX3ljXSBvZiB4eWkpIHtcbiAgICBpZiAoeGMgPT09IDBuKSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGl0ZXJJc0Rpc2pvaW50ID0geHlpID0+IHtcbiAgZm9yIChjb25zdCBbX20sIHhjLCB5Y10gb2YgeHlpKSB7XG4gICAgaWYgKHhjID49IDFuICYmIHljID49IDFuKSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGl0ZXJDb21wYXJlID0geHlpID0+IHtcbiAgbGV0IGxvbmVZID0gZmFsc2U7XG4gIGxldCBsb25lWCA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IFtfbSwgeGMsIHljXSBvZiB4eWkpIHtcbiAgICBpZiAoeGMgPT09IDBuKSB7XG4gICAgICAvL1xuICAgICAgbG9uZVkgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoeWMgPT09IDBuKSB7XG4gICAgICAvL1xuICAgICAgbG9uZVggPSB0cnVlO1xuICAgIH1cbiAgICBpZiAobG9uZVggJiYgbG9uZVkpIHtcbiAgICAgIHJldHVybiBOYU47XG4gICAgfVxuICB9XG4gIGlmIChsb25lWCkge1xuICAgIHJldHVybiAxO1xuICB9IGVsc2UgaWYgKGxvbmVZKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9IGVsc2Uge1xuICAgICghbG9uZVggJiYgIWxvbmVZKSB8fFxuICAgICAgRmFpbGBJbnRlcm5hbDogVW5leHBlY3RlZCBsb25lIHBhaXIgJHtxKFtsb25lWCwgbG9uZVldKX1gO1xuICAgIHJldHVybiAwO1xuICB9XG59O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBpdGVyVW5pb24gPSB4eWkgPT4ge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCBbbSwgeGMsIHljXSBvZiB4eWkpIHtcbiAgICBpZiAoeGMgPj0gMG4pIHtcbiAgICAgIHJlc3VsdC5wdXNoKG0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB5YyA+PSAwbiB8fCBGYWlsYEludGVybmFsOiBVbmV4cGVjdGVkIGNvdW50ICR7cSh5Yyl9YDtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgcmVzdWx0LnB1c2gobSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBpdGVyRGlzam9pbnRVbmlvbiA9IHh5aSA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGNvbnN0IFttLCB4YywgeWNdIG9mIHh5aSkge1xuICAgIHhjID09PSAwbiB8fCB5YyA9PT0gMG4gfHwgRmFpbGBTZXRzIG11c3Qgbm90IGhhdmUgY29tbW9uIGVsZW1lbnRzOiAke219YDtcbiAgICBpZiAoeGMgPj0gMW4pIHtcbiAgICAgIHJlc3VsdC5wdXNoKG0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB5YyA+PSAxbiB8fCBGYWlsYEludGVybmFsOiBVbmV4cGVjdGVkIGNvdW50ICR7cSh5Yyl9YDtcbiAgICAgIHJlc3VsdC5wdXNoKG0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgaXRlckludGVyc2VjdGlvbiA9IHh5aSA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGNvbnN0IFttLCB4YywgeWNdIG9mIHh5aSkge1xuICAgIGlmICh4YyA+PSAxbiAmJiB5YyA+PSAxbikge1xuICAgICAgLy9cbiAgICAgIHJlc3VsdC5wdXNoKG0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgaXRlckRpc2pvaW50U3VidHJhY3QgPSB4eWkgPT4ge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCBbbSwgeGMsIHljXSBvZiB4eWkpIHtcbiAgICB4YyA+PSAxbiB8fCBGYWlsYHJpZ2h0IGVsZW1lbnQgJHttfSB3YXMgbm90IGluIGxlZnRgO1xuICAgIGlmICh5YyA9PT0gMG4pIHtcbiAgICAgIC8vXG4gICAgICByZXN1bHQucHVzaChtKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmNvbnN0IG1lcmdlaWZ5ID0gaXRlck9wID0+ICh4ZWxlbWVudHMsIHllbGVtZW50cykgPT5cbiAgaXRlck9wKG1lcmdlKHhlbGVtZW50cywgeWVsZW1lbnRzKSk7XG5cbiAgICAgICBjb25zdCBlbGVtZW50c0lzU3VwZXJzZXQgPSBtZXJnZWlmeShpdGVySXNTdXBlcnNldCk7JGjNj19vbmNlLmVsZW1lbnRzSXNTdXBlcnNldChlbGVtZW50c0lzU3VwZXJzZXQpO1xuICAgICAgIGNvbnN0IGVsZW1lbnRzSXNEaXNqb2ludCA9IG1lcmdlaWZ5KGl0ZXJJc0Rpc2pvaW50KTskaM2PX29uY2UuZWxlbWVudHNJc0Rpc2pvaW50KGVsZW1lbnRzSXNEaXNqb2ludCk7XG4gICAgICAgY29uc3QgZWxlbWVudHNDb21wYXJlID0gbWVyZ2VpZnkoaXRlckNvbXBhcmUpOyRozY9fb25jZS5lbGVtZW50c0NvbXBhcmUoZWxlbWVudHNDb21wYXJlKTtcbiAgICAgICBjb25zdCBlbGVtZW50c1VuaW9uID0gbWVyZ2VpZnkoaXRlclVuaW9uKTskaM2PX29uY2UuZWxlbWVudHNVbmlvbihlbGVtZW50c1VuaW9uKTtcbiAgICAgICBjb25zdCBlbGVtZW50c0Rpc2pvaW50VW5pb24gPSBtZXJnZWlmeShpdGVyRGlzam9pbnRVbmlvbik7JGjNj19vbmNlLmVsZW1lbnRzRGlzam9pbnRVbmlvbihlbGVtZW50c0Rpc2pvaW50VW5pb24pO1xuICAgICAgIGNvbnN0IGVsZW1lbnRzSW50ZXJzZWN0aW9uID0gbWVyZ2VpZnkoaXRlckludGVyc2VjdGlvbik7JGjNj19vbmNlLmVsZW1lbnRzSW50ZXJzZWN0aW9uKGVsZW1lbnRzSW50ZXJzZWN0aW9uKTtcbiAgICAgICBjb25zdCBlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QgPSBtZXJnZWlmeShpdGVyRGlzam9pbnRTdWJ0cmFjdCk7JGjNj19vbmNlLmVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdChlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QpO1xuXG5jb25zdCByYXdTZXRpZnkgPSBlbGVtZW50c09wID0+ICh4c2V0LCB5c2V0KSA9PlxuICBlbGVtZW50c09wKHhzZXQucGF5bG9hZCwgeXNldC5wYXlsb2FkKTtcblxuY29uc3Qgc2V0aWZ5ID0gZWxlbWVudHNPcCA9PiAoeHNldCwgeXNldCkgPT5cbiAgbWFrZVNldE9mRWxlbWVudHMoZWxlbWVudHNPcCh4c2V0LnBheWxvYWQsIHlzZXQucGF5bG9hZCkpO1xuXG4gICAgICAgY29uc3Qgc2V0SXNTdXBlcnNldCA9IHJhd1NldGlmeShlbGVtZW50c0lzU3VwZXJzZXQpOyRozY9fb25jZS5zZXRJc1N1cGVyc2V0KHNldElzU3VwZXJzZXQpO1xuICAgICAgIGNvbnN0IHNldElzRGlzam9pbnQgPSByYXdTZXRpZnkoZWxlbWVudHNJc0Rpc2pvaW50KTskaM2PX29uY2Uuc2V0SXNEaXNqb2ludChzZXRJc0Rpc2pvaW50KTtcbiAgICAgICBjb25zdCBzZXRVbmlvbiA9IHNldGlmeShlbGVtZW50c1VuaW9uKTskaM2PX29uY2Uuc2V0VW5pb24oc2V0VW5pb24pO1xuICAgICAgIGNvbnN0IHNldERpc2pvaW50VW5pb24gPSBzZXRpZnkoZWxlbWVudHNEaXNqb2ludFVuaW9uKTskaM2PX29uY2Uuc2V0RGlzam9pbnRVbmlvbihzZXREaXNqb2ludFVuaW9uKTtcbiAgICAgICBjb25zdCBzZXRJbnRlcnNlY3Rpb24gPSBzZXRpZnkoZWxlbWVudHNJbnRlcnNlY3Rpb24pOyRozY9fb25jZS5zZXRJbnRlcnNlY3Rpb24oc2V0SW50ZXJzZWN0aW9uKTtcbiAgICAgICBjb25zdCBzZXREaXNqb2ludFN1YnRyYWN0ID0gc2V0aWZ5KGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCk7JGjNj19vbmNlLnNldERpc2pvaW50U3VidHJhY3Qoc2V0RGlzam9pbnRTdWJ0cmFjdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJlbGVtZW50c0lzU3VwZXJzZXQiOlsiZWxlbWVudHNJc1N1cGVyc2V0Il0sImVsZW1lbnRzSXNEaXNqb2ludCI6WyJlbGVtZW50c0lzRGlzam9pbnQiXSwiZWxlbWVudHNDb21wYXJlIjpbImVsZW1lbnRzQ29tcGFyZSJdLCJlbGVtZW50c1VuaW9uIjpbImVsZW1lbnRzVW5pb24iXSwiZWxlbWVudHNEaXNqb2ludFVuaW9uIjpbImVsZW1lbnRzRGlzam9pbnRVbmlvbiJdLCJlbGVtZW50c0ludGVyc2VjdGlvbiI6WyJlbGVtZW50c0ludGVyc2VjdGlvbiJdLCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiOlsiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0Il0sInNldElzU3VwZXJzZXQiOlsic2V0SXNTdXBlcnNldCJdLCJzZXRJc0Rpc2pvaW50IjpbInNldElzRGlzam9pbnQiXSwic2V0VW5pb24iOlsic2V0VW5pb24iXSwic2V0RGlzam9pbnRVbmlvbiI6WyJzZXREaXNqb2ludFVuaW9uIl0sInNldEludGVyc2VjdGlvbiI6WyJzZXRJbnRlcnNlY3Rpb24iXSwic2V0RGlzam9pbnRTdWJ0cmFjdCI6WyJzZXREaXNqb2ludFN1YnRyYWN0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPB0UiUsGwAALBsAADYAAABAZW5kby9wYXR0ZXJucy12MS41LjAvc3JjL3BhdHRlcm5zL2dldEd1YXJkUGF5bG9hZHMuanN7ImltcG9ydHMiOlsiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiLCIuL3BhdHRlcm5NYXRjaGVycy5qcyIsIi4uL2tleXMvY2hlY2tLZXkuanMiXSwiZXhwb3J0cyI6WyJnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZCIsImdldEludGVyZmFjZUd1YXJkUGF5bG9hZCIsImdldEludGVyZmFjZU1ldGhvZEtleXMiLCJnZXRNZXRob2RHdWFyZFBheWxvYWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBvYmplY3RNYXAsQXJnR3VhcmRMaXN0U2hhcGUsQXdhaXRBcmdHdWFyZFNoYXBlLEludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlLEludGVyZmFjZUd1YXJkU2hhcGUsTSxNZXRob2RHdWFyZFBheWxvYWRTaGFwZSxNZXRob2RHdWFyZFNoYXBlLFJhd0d1YXJkU2hhcGUsU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUsU3luY1ZhbHVlR3VhcmRTaGFwZSxhc3NlcnRBd2FpdEFyZ0d1YXJkLG1hdGNoZXMsbXVzdE1hdGNoLGdldENvcHlNYXBLZXlzLG1ha2VDb3B5TWFwOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanNcIiwgW1tcIm9iamVjdE1hcFwiLFskaM2PX2EgPT4gKG9iamVjdE1hcCA9ICRozY9fYSldXV1dLFtcIi4vcGF0dGVybk1hdGNoZXJzLmpzXCIsIFtbXCJBcmdHdWFyZExpc3RTaGFwZVwiLFskaM2PX2EgPT4gKEFyZ0d1YXJkTGlzdFNoYXBlID0gJGjNj19hKV1dLFtcIkF3YWl0QXJnR3VhcmRTaGFwZVwiLFskaM2PX2EgPT4gKEF3YWl0QXJnR3VhcmRTaGFwZSA9ICRozY9fYSldXSxbXCJJbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZVwiLFskaM2PX2EgPT4gKEludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlID0gJGjNj19hKV1dLFtcIkludGVyZmFjZUd1YXJkU2hhcGVcIixbJGjNj19hID0+IChJbnRlcmZhY2VHdWFyZFNoYXBlID0gJGjNj19hKV1dLFtcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcIk1ldGhvZEd1YXJkUGF5bG9hZFNoYXBlXCIsWyRozY9fYSA9PiAoTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUgPSAkaM2PX2EpXV0sW1wiTWV0aG9kR3VhcmRTaGFwZVwiLFskaM2PX2EgPT4gKE1ldGhvZEd1YXJkU2hhcGUgPSAkaM2PX2EpXV0sW1wiUmF3R3VhcmRTaGFwZVwiLFskaM2PX2EgPT4gKFJhd0d1YXJkU2hhcGUgPSAkaM2PX2EpXV0sW1wiU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGVcIixbJGjNj19hID0+IChTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSA9ICRozY9fYSldXSxbXCJTeW5jVmFsdWVHdWFyZFNoYXBlXCIsWyRozY9fYSA9PiAoU3luY1ZhbHVlR3VhcmRTaGFwZSA9ICRozY9fYSldXSxbXCJhc3NlcnRBd2FpdEFyZ0d1YXJkXCIsWyRozY9fYSA9PiAoYXNzZXJ0QXdhaXRBcmdHdWFyZCA9ICRozY9fYSldXSxbXCJtYXRjaGVzXCIsWyRozY9fYSA9PiAobWF0Y2hlcyA9ICRozY9fYSldXSxbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV1dXSxbXCIuLi9rZXlzL2NoZWNrS2V5LmpzXCIsIFtbXCJnZXRDb3B5TWFwS2V5c1wiLFskaM2PX2EgPT4gKGdldENvcHlNYXBLZXlzID0gJGjNj19hKV1dLFtcIm1ha2VDb3B5TWFwXCIsWyRozY9fYSA9PiAobWFrZUNvcHlNYXAgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cbiAqL1xuXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbi8vXG4vL1xuLy9cblxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vL1xuLy9cbi8vXG4vL1xuXG4vL1xuLy9cbi8vXG5jb25zdCBMZWdhY3lBd2FpdEFyZ0d1YXJkU2hhcGUgPSBoYXJkZW4oe1xuICBrbGFzczogJ2F3YWl0QXJnJyxcbiAgYXJnR3VhcmQ6IE0ucGF0dGVybigpLFxufSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZCA9IGF3YWl0QXJnR3VhcmQgPT4ge1xuICBpZiAobWF0Y2hlcyhhd2FpdEFyZ0d1YXJkLCBMZWdhY3lBd2FpdEFyZ0d1YXJkU2hhcGUpKSB7XG4gICAgLy9cbiAgICBjb25zdCB7IGtsYXNzOiBfLCAuLi5wYXlsb2FkIH0gPSBhd2FpdEFyZ0d1YXJkO1xuICAgIC8vXG4gICAgcmV0dXJuIHBheWxvYWQ7XG4gIH1cbiAgYXNzZXJ0QXdhaXRBcmdHdWFyZChhd2FpdEFyZ0d1YXJkKTtcbiAgcmV0dXJuIGF3YWl0QXJnR3VhcmQucGF5bG9hZDtcbn07JGjNj19vbmNlLmdldEF3YWl0QXJnR3VhcmRQYXlsb2FkKGdldEF3YWl0QXJnR3VhcmRQYXlsb2FkKTtcbmhhcmRlbihnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZCk7XG5cbi8vXG4vL1xuLy9cbmNvbnN0IExlZ2FjeVN5bmNNZXRob2RHdWFyZFNoYXBlID0gTS5zcGxpdFJlY29yZChcbiAge1xuICAgIGtsYXNzOiAnbWV0aG9kR3VhcmQnLFxuICAgIGNhbGxLaW5kOiAnc3luYycsXG4gICAgYXJnR3VhcmRzOiBTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSxcbiAgICByZXR1cm5HdWFyZDogU3luY1ZhbHVlR3VhcmRTaGFwZSxcbiAgfSxcbiAge1xuICAgIG9wdGlvbmFsQXJnR3VhcmRzOiBTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSxcbiAgICByZXN0QXJnR3VhcmQ6IFN5bmNWYWx1ZUd1YXJkU2hhcGUsXG4gIH0sXG4pO1xuXG4vL1xuLy9cbi8vXG5jb25zdCBMZWdhY3lBcmdHdWFyZFNoYXBlID0gTS5vcihcbiAgUmF3R3VhcmRTaGFwZSxcbiAgQXdhaXRBcmdHdWFyZFNoYXBlLFxuICBMZWdhY3lBd2FpdEFyZ0d1YXJkU2hhcGUsXG4gIE0ucGF0dGVybigpLFxuKTtcbi8vXG4vL1xuLy9cbmNvbnN0IExlZ2FjeUFyZ0d1YXJkTGlzdFNoYXBlID0gTS5hcnJheU9mKExlZ2FjeUFyZ0d1YXJkU2hhcGUpO1xuXG4vL1xuLy9cbi8vXG5jb25zdCBMZWdhY3lBc3luY01ldGhvZEd1YXJkU2hhcGUgPSBNLnNwbGl0UmVjb3JkKFxuICB7XG4gICAga2xhc3M6ICdtZXRob2RHdWFyZCcsXG4gICAgY2FsbEtpbmQ6ICdhc3luYycsXG4gICAgYXJnR3VhcmRzOiBMZWdhY3lBcmdHdWFyZExpc3RTaGFwZSxcbiAgICByZXR1cm5HdWFyZDogU3luY1ZhbHVlR3VhcmRTaGFwZSxcbiAgfSxcbiAge1xuICAgIG9wdGlvbmFsQXJnR3VhcmRzOiBBcmdHdWFyZExpc3RTaGFwZSxcbiAgICByZXN0QXJnR3VhcmQ6IFN5bmNWYWx1ZUd1YXJkU2hhcGUsXG4gIH0sXG4pO1xuXG4vL1xuLy9cbi8vXG5jb25zdCBMZWdhY3lNZXRob2RHdWFyZFNoYXBlID0gTS5vcihcbiAgTGVnYWN5U3luY01ldGhvZEd1YXJkU2hhcGUsXG4gIExlZ2FjeUFzeW5jTWV0aG9kR3VhcmRTaGFwZSxcbik7XG5cbmNvbnN0IGFkYXB0TGVnYWN5QXJnR3VhcmQgPSBhcmdHdWFyZCA9PlxuICBtYXRjaGVzKGFyZ0d1YXJkLCBMZWdhY3lBd2FpdEFyZ0d1YXJkU2hhcGUpXG4gICAgPyBNLmF3YWl0KGdldEF3YWl0QXJnR3VhcmRQYXlsb2FkKGFyZ0d1YXJkKS5hcmdHdWFyZClcbiAgICA6IGFyZ0d1YXJkO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGdldE1ldGhvZEd1YXJkUGF5bG9hZCA9IG1ldGhvZEd1YXJkID0+IHtcbiAgaWYgKG1hdGNoZXMobWV0aG9kR3VhcmQsIE1ldGhvZEd1YXJkU2hhcGUpKSB7XG4gICAgcmV0dXJuIG1ldGhvZEd1YXJkLnBheWxvYWQ7XG4gIH1cbiAgbXVzdE1hdGNoKG1ldGhvZEd1YXJkLCBMZWdhY3lNZXRob2RHdWFyZFNoYXBlLCAnbGVnYWN5TWV0aG9kR3VhcmQnKTtcbiAgY29uc3Qge1xuICAgIC8vXG4gICAga2xhc3M6IF8sXG4gICAgLy9cbiAgICBjYWxsS2luZCxcbiAgICAvL1xuICAgIHJldHVybkd1YXJkLFxuICAgIC8vXG4gICAgcmVzdEFyZ0d1YXJkLFxuICB9ID0gbWV0aG9kR3VhcmQ7XG4gIGxldCB7XG4gICAgLy9cbiAgICBhcmdHdWFyZHMsXG4gICAgLy9cbiAgICBvcHRpb25hbEFyZ0d1YXJkcyxcbiAgfSA9IG1ldGhvZEd1YXJkO1xuICBpZiAoY2FsbEtpbmQgPT09ICdhc3luYycpIHtcbiAgICBhcmdHdWFyZHMgPSBhcmdHdWFyZHMubWFwKGFkYXB0TGVnYWN5QXJnR3VhcmQpO1xuICAgIG9wdGlvbmFsQXJnR3VhcmRzID1cbiAgICAgIG9wdGlvbmFsQXJnR3VhcmRzICYmIG9wdGlvbmFsQXJnR3VhcmRzLm1hcChhZGFwdExlZ2FjeUFyZ0d1YXJkKTtcbiAgfVxuICBjb25zdCBwYXlsb2FkID0gaGFyZGVuKHtcbiAgICBjYWxsS2luZCxcbiAgICBhcmdHdWFyZHMsXG4gICAgb3B0aW9uYWxBcmdHdWFyZHMsXG4gICAgcmVzdEFyZ0d1YXJkLFxuICAgIHJldHVybkd1YXJkLFxuICB9KTtcbiAgLy9cbiAgbXVzdE1hdGNoKHBheWxvYWQsIE1ldGhvZEd1YXJkUGF5bG9hZFNoYXBlLCAnaW50ZXJuYWxNZXRob2RHdWFyZEFkYXB0b3InKTtcbiAgcmV0dXJuIHBheWxvYWQ7XG59OyRozY9fb25jZS5nZXRNZXRob2RHdWFyZFBheWxvYWQoZ2V0TWV0aG9kR3VhcmRQYXlsb2FkKTtcbmhhcmRlbihnZXRNZXRob2RHdWFyZFBheWxvYWQpO1xuXG4vL1xuLy9cbi8vXG5jb25zdCBMZWdhY3lJbnRlcmZhY2VHdWFyZFNoYXBlID0gTS5zcGxpdFJlY29yZChcbiAge1xuICAgIGtsYXNzOiAnSW50ZXJmYWNlJyxcbiAgICBpbnRlcmZhY2VOYW1lOiBNLnN0cmluZygpLFxuICAgIG1ldGhvZEd1YXJkczogTS5yZWNvcmRPZihcbiAgICAgIE0uc3RyaW5nKCksXG4gICAgICBNLm9yKE1ldGhvZEd1YXJkU2hhcGUsIExlZ2FjeU1ldGhvZEd1YXJkU2hhcGUpLFxuICAgICksXG4gIH0sXG4gIHtcbiAgICBkZWZhdWx0R3VhcmRzOiBNLm9yKE0udW5kZWZpbmVkKCksICdwYXNzYWJsZScsICdyYXcnKSxcbiAgICBzbG9wcHk6IE0uYm9vbGVhbigpLFxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIHN5bWJvbE1ldGhvZEd1YXJkczogTS5tYXBPZihNLnN5bWJvbCgpLCBNZXRob2RHdWFyZFNoYXBlKSxcbiAgfSxcbik7XG5cbmNvbnN0IGFkYXB0TWV0aG9kR3VhcmQgPSBtZXRob2RHdWFyZCA9PiB7XG4gIGlmIChtYXRjaGVzKG1ldGhvZEd1YXJkLCBMZWdhY3lNZXRob2RHdWFyZFNoYXBlKSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGNhbGxLaW5kLFxuICAgICAgYXJnR3VhcmRzLFxuICAgICAgb3B0aW9uYWxBcmdHdWFyZHMgPSBbXSxcbiAgICAgIHJlc3RBcmdHdWFyZCA9IE0uYW55KCksXG4gICAgICByZXR1cm5HdWFyZCxcbiAgICB9ID0gZ2V0TWV0aG9kR3VhcmRQYXlsb2FkKG1ldGhvZEd1YXJkKTtcbiAgICBjb25zdCBtQ2FsbCA9IGNhbGxLaW5kID09PSAnc3luYycgPyBNLmNhbGwgOiBNLmNhbGxXaGVuO1xuICAgIHJldHVybiBtQ2FsbCguLi5hcmdHdWFyZHMpXG4gICAgICAub3B0aW9uYWwoLi4ub3B0aW9uYWxBcmdHdWFyZHMpXG4gICAgICAucmVzdChyZXN0QXJnR3VhcmQpXG4gICAgICAucmV0dXJucyhyZXR1cm5HdWFyZCk7XG4gIH1cbiAgcmV0dXJuIG1ldGhvZEd1YXJkO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGdldEludGVyZmFjZUd1YXJkUGF5bG9hZCA9IGludGVyZmFjZUd1YXJkID0+IHtcbiAgaWYgKG1hdGNoZXMoaW50ZXJmYWNlR3VhcmQsIEludGVyZmFjZUd1YXJkU2hhcGUpKSB7XG4gICAgcmV0dXJuIGludGVyZmFjZUd1YXJkLnBheWxvYWQ7XG4gIH1cbiAgbXVzdE1hdGNoKGludGVyZmFjZUd1YXJkLCBMZWdhY3lJbnRlcmZhY2VHdWFyZFNoYXBlLCAnbGVnYWN5SW50ZXJmYWNlR3VhcmQnKTtcbiAgLy9cbiAgLy9cbiAgbGV0IHsga2xhc3M6IF8sIGludGVyZmFjZU5hbWUsIG1ldGhvZEd1YXJkcywgLi4ucmVzdCB9ID0gaW50ZXJmYWNlR3VhcmQ7XG4gIG1ldGhvZEd1YXJkcyA9IG9iamVjdE1hcChtZXRob2RHdWFyZHMsIGFkYXB0TWV0aG9kR3VhcmQpO1xuICBjb25zdCBwYXlsb2FkID0gaGFyZGVuKHtcbiAgICBpbnRlcmZhY2VOYW1lLFxuICAgIG1ldGhvZEd1YXJkcyxcbiAgICAuLi5yZXN0LFxuICB9KTtcbiAgbXVzdE1hdGNoKFxuICAgIHBheWxvYWQsXG4gICAgSW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGUsXG4gICAgJ2ludGVybmFsSW50ZXJmYWNlR3VhcmRBZGFwdG9yJyxcbiAgKTtcbiAgcmV0dXJuIHBheWxvYWQ7XG59OyRozY9fb25jZS5nZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQoZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkKTtcbmhhcmRlbihnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQpO1xuXG5jb25zdCBlbXB0eUNvcHlNYXAgPSBtYWtlQ29weU1hcChbXSk7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyA9IGludGVyZmFjZUd1YXJkID0+IHtcbiAgY29uc3QgeyBtZXRob2RHdWFyZHMsIHN5bWJvbE1ldGhvZEd1YXJkcyA9IGVtcHR5Q29weU1hcCB9ID1cbiAgICBnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQoaW50ZXJmYWNlR3VhcmQpO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIC8vXG4gIC8vXG4gIHJldHVybiBoYXJkZW4oW1xuICAgIC4uLlJlZmxlY3Qub3duS2V5cyhtZXRob2RHdWFyZHMpLFxuICAgIC4uLmdldENvcHlNYXBLZXlzKHN5bWJvbE1ldGhvZEd1YXJkcyksXG4gIF0pO1xufTskaM2PX29uY2UuZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyhnZXRJbnRlcmZhY2VNZXRob2RLZXlzKTtcbmhhcmRlbihnZXRJbnRlcmZhY2VNZXRob2RLZXlzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdldEF3YWl0QXJnR3VhcmRQYXlsb2FkIjpbImdldEF3YWl0QXJnR3VhcmRQYXlsb2FkIl0sImdldE1ldGhvZEd1YXJkUGF5bG9hZCI6WyJnZXRNZXRob2RHdWFyZFBheWxvYWQiXSwiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkIjpbImdldEludGVyZmFjZUd1YXJkUGF5bG9hZCJdLCJnZXRJbnRlcmZhY2VNZXRob2RLZXlzIjpbImdldEludGVyZmFjZU1ldGhvZEtleXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAADu5OJ2rsAABq7AAANQAAAEBlbmRvL3BhdHRlcm5zLXYxLjUuMC9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2NvbW1vbi9pZGVudC1jaGVja2VyLmpzIiwiQGVuZG8vY29tbW9uL2FwcGx5LWxhYmVsaW5nLWVycm9yLmpzIiwiQGVuZG8vY29tbW9uL2Zyb20tdW5pcXVlLWVudHJpZXMuanMiLCJAZW5kby9jb21tb24vbGlzdC1kaWZmZXJlbmNlLmpzIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL21hcnNoYWwiLCIuLi9rZXlzL2NvbXBhcmVLZXlzLmpzIiwiLi4va2V5cy9jaGVja0tleS5qcyIsIi4uL2tleXMva2V5Y29sbGVjdGlvbi1vcGVyYXRvcnMuanMiXSwiZXhwb3J0cyI6WyJBcmdHdWFyZExpc3RTaGFwZSIsIkF3YWl0QXJnR3VhcmRTaGFwZSIsIkludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlIiwiSW50ZXJmYWNlR3VhcmRTaGFwZSIsIk0iLCJNZXRob2RHdWFyZFBheWxvYWRTaGFwZSIsIk1ldGhvZEd1YXJkU2hhcGUiLCJSYXdHdWFyZFNoYXBlIiwiU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUiLCJTeW5jVmFsdWVHdWFyZFNoYXBlIiwiYXNzZXJ0QXdhaXRBcmdHdWFyZCIsImFzc2VydEludGVyZmFjZUd1YXJkIiwiYXNzZXJ0TWV0aG9kR3VhcmQiLCJhc3NlcnRQYXR0ZXJuIiwiYXNzZXJ0UmF3R3VhcmQiLCJjaGVja01hdGNoZXMiLCJjb250YWluZXJIYXNTcGxpdCIsImRlZmF1bHRMaW1pdHMiLCJnZXRSYW5rQ292ZXIiLCJpc0F3YWl0QXJnR3VhcmQiLCJpc1BhdHRlcm4iLCJpc1Jhd0d1YXJkIiwia2luZE9mIiwibWF0Y2hlcyIsIm11c3RNYXRjaCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHEsYixYLEZhaWwsbWFrZUVycm9yLGFubm90YXRlRXJyb3IsaWRlbnRDaGVja2VyLGFwcGx5TGFiZWxpbmdFcnJvcixmcm9tVW5pcXVlRW50cmllcyxsaXN0RGlmZmVyZW5jZSxhc3NlcnRDaGVja2VyLEZhcixnZXRUYWcsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZixoYXNPd25Qcm9wZXJ0eU9mLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxjb21wYXJlUmFuayxnZXRQYXNzU3R5bGVDb3ZlcixpbnRlcnNlY3RSYW5rQ292ZXJzLHVuaW9uUmFua0NvdmVycyxyZWNvcmROYW1lcyxyZWNvcmRWYWx1ZXMsa2V5RVEsa2V5R1Qsa2V5R1RFLGtleUxULGtleUxURSxhc3NlcnRLZXksY2hlY2tLZXksaXNLZXksY2hlY2tTY2FsYXJLZXksY2hlY2tDb3B5U2V0LGNoZWNrQ29weU1hcCxjb3B5TWFwS2V5U2V0LGNoZWNrQ29weUJhZyxnZXRDb3B5TWFwRW50cnlBcnJheSxtYWtlQ29weU1hcCxtYWtlQ29weVNldCxtYWtlQ29weUJhZyxnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiYlwiLFskaM2PX2EgPT4gKGIgPSAkaM2PX2EpXV0sW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wibWFrZUVycm9yXCIsWyRozY9fYSA9PiAobWFrZUVycm9yID0gJGjNj19hKV1dLFtcImFubm90YXRlRXJyb3JcIixbJGjNj19hID0+IChhbm5vdGF0ZUVycm9yID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL2lkZW50LWNoZWNrZXIuanNcIiwgW1tcImlkZW50Q2hlY2tlclwiLFskaM2PX2EgPT4gKGlkZW50Q2hlY2tlciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9hcHBseS1sYWJlbGluZy1lcnJvci5qc1wiLCBbW1wiYXBwbHlMYWJlbGluZ0Vycm9yXCIsWyRozY9fYSA9PiAoYXBwbHlMYWJlbGluZ0Vycm9yID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL2Zyb20tdW5pcXVlLWVudHJpZXMuanNcIiwgW1tcImZyb21VbmlxdWVFbnRyaWVzXCIsWyRozY9fYSA9PiAoZnJvbVVuaXF1ZUVudHJpZXMgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vbGlzdC1kaWZmZXJlbmNlLmpzXCIsIFtbXCJsaXN0RGlmZmVyZW5jZVwiLFskaM2PX2EgPT4gKGxpc3REaWZmZXJlbmNlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dLFtcImdldFRhZ1wiLFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXSxbXCJtYWtlVGFnZ2VkXCIsWyRozY9fYSA9PiAobWFrZVRhZ2dlZCA9ICRozY9fYSldXSxbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIixbJGjNj19hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjNj19hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLFskaM2PX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImNvbXBhcmVSYW5rXCIsWyRozY9fYSA9PiAoY29tcGFyZVJhbmsgPSAkaM2PX2EpXV0sW1wiZ2V0UGFzc1N0eWxlQ292ZXJcIixbJGjNj19hID0+IChnZXRQYXNzU3R5bGVDb3ZlciA9ICRozY9fYSldXSxbXCJpbnRlcnNlY3RSYW5rQ292ZXJzXCIsWyRozY9fYSA9PiAoaW50ZXJzZWN0UmFua0NvdmVycyA9ICRozY9fYSldXSxbXCJ1bmlvblJhbmtDb3ZlcnNcIixbJGjNj19hID0+ICh1bmlvblJhbmtDb3ZlcnMgPSAkaM2PX2EpXV0sW1wicmVjb3JkTmFtZXNcIixbJGjNj19hID0+IChyZWNvcmROYW1lcyA9ICRozY9fYSldXSxbXCJyZWNvcmRWYWx1ZXNcIixbJGjNj19hID0+IChyZWNvcmRWYWx1ZXMgPSAkaM2PX2EpXV1dXSxbXCIuLi9rZXlzL2NvbXBhcmVLZXlzLmpzXCIsIFtbXCJrZXlFUVwiLFskaM2PX2EgPT4gKGtleUVRID0gJGjNj19hKV1dLFtcImtleUdUXCIsWyRozY9fYSA9PiAoa2V5R1QgPSAkaM2PX2EpXV0sW1wia2V5R1RFXCIsWyRozY9fYSA9PiAoa2V5R1RFID0gJGjNj19hKV1dLFtcImtleUxUXCIsWyRozY9fYSA9PiAoa2V5TFQgPSAkaM2PX2EpXV0sW1wia2V5TFRFXCIsWyRozY9fYSA9PiAoa2V5TFRFID0gJGjNj19hKV1dXV0sW1wiLi4va2V5cy9jaGVja0tleS5qc1wiLCBbW1wiYXNzZXJ0S2V5XCIsWyRozY9fYSA9PiAoYXNzZXJ0S2V5ID0gJGjNj19hKV1dLFtcImNoZWNrS2V5XCIsWyRozY9fYSA9PiAoY2hlY2tLZXkgPSAkaM2PX2EpXV0sW1wiaXNLZXlcIixbJGjNj19hID0+IChpc0tleSA9ICRozY9fYSldXSxbXCJjaGVja1NjYWxhcktleVwiLFskaM2PX2EgPT4gKGNoZWNrU2NhbGFyS2V5ID0gJGjNj19hKV1dLFtcImNoZWNrQ29weVNldFwiLFskaM2PX2EgPT4gKGNoZWNrQ29weVNldCA9ICRozY9fYSldXSxbXCJjaGVja0NvcHlNYXBcIixbJGjNj19hID0+IChjaGVja0NvcHlNYXAgPSAkaM2PX2EpXV0sW1wiY29weU1hcEtleVNldFwiLFskaM2PX2EgPT4gKGNvcHlNYXBLZXlTZXQgPSAkaM2PX2EpXV0sW1wiY2hlY2tDb3B5QmFnXCIsWyRozY9fYSA9PiAoY2hlY2tDb3B5QmFnID0gJGjNj19hKV1dLFtcImdldENvcHlNYXBFbnRyeUFycmF5XCIsWyRozY9fYSA9PiAoZ2V0Q29weU1hcEVudHJ5QXJyYXkgPSAkaM2PX2EpXV0sW1wibWFrZUNvcHlNYXBcIixbJGjNj19hID0+IChtYWtlQ29weU1hcCA9ICRozY9fYSldXSxbXCJtYWtlQ29weVNldFwiLFskaM2PX2EgPT4gKG1ha2VDb3B5U2V0ID0gJGjNj19hKV1dLFtcIm1ha2VDb3B5QmFnXCIsWyRozY9fYSA9PiAobWFrZUNvcHlCYWcgPSAkaM2PX2EpXV1dXSxbXCIuLi9rZXlzL2tleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzXCIsIFtbXCJnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllc1wiLFskaM2PX2EgPT4gKGdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG4gKi9cblxuY29uc3QgeyBlbnRyaWVzLCB2YWx1ZXMgfSA9IE9iamVjdDtcbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgcGF0dGVybk1lbW8gPSBuZXcgV2Vha1NldCgpO1xuXG4vL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmxldCBNTTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBkZWZhdWx0TGltaXRzID0gaGFyZGVuKHtcbiAgZGVjaW1hbERpZ2l0c0xpbWl0OiAxMDAsXG4gIHN0cmluZ0xlbmd0aExpbWl0OiAxMDBfMDAwLFxuICBzeW1ib2xOYW1lTGVuZ3RoTGltaXQ6IDEwMCxcbiAgbnVtUHJvcGVydGllc0xpbWl0OiA4MCxcbiAgcHJvcGVydHlOYW1lTGVuZ3RoTGltaXQ6IDEwMCxcbiAgYXJyYXlMZW5ndGhMaW1pdDogMTBfMDAwLFxuICBudW1TZXRFbGVtZW50c0xpbWl0OiAxMF8wMDAsXG4gIG51bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXQ6IDEwXzAwMCxcbiAgbnVtTWFwRW50cmllc0xpbWl0OiA1MDAwLFxufSk7XG5cbi8qXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuZGVmYXVsdExpbWl0cyhkZWZhdWx0TGltaXRzKTtcbmNvbnN0IGxpbWl0ID0gKGxpbWl0cyA9IHt9KSA9PlxuICAvKiAgICAgICAgICAgICAgICAgICAgKi8gKGhhcmRlbih7IF9fcHJvdG9fXzogZGVmYXVsdExpbWl0cywgLi4ubGltaXRzIH0pKTtcblxuY29uc3QgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQgPSAoXG4gIHBheWxvYWQsXG4gIG1haW5QYXlsb2FkU2hhcGUsXG4gIGNoZWNrLFxuICBsYWJlbCxcbikgPT4ge1xuICBhc3NlcnQoQXJyYXkuaXNBcnJheShtYWluUGF5bG9hZFNoYXBlKSk7XG4gIGlmICghQXJyYXkuaXNBcnJheShwYXlsb2FkKSkge1xuICAgIHJldHVybiBjaGVjayhmYWxzZSwgWGAke3EobGFiZWwpfSBwYXlsb2FkIG11c3QgYmUgYW4gYXJyYXk6ICR7cGF5bG9hZH1gKTtcbiAgfVxuXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG5cbiAgY29uc3QgbWFpbkxlbmd0aCA9IG1haW5QYXlsb2FkU2hhcGUubGVuZ3RoO1xuICBpZiAoIShwYXlsb2FkLmxlbmd0aCA9PT0gbWFpbkxlbmd0aCB8fCBwYXlsb2FkLmxlbmd0aCA9PT0gbWFpbkxlbmd0aCArIDEpKSB7XG4gICAgcmV0dXJuIGNoZWNrKGZhbHNlLCBYYCR7cShsYWJlbCl9IHBheWxvYWQgdW5leHBlY3RlZCBzaXplOiAke3BheWxvYWR9YCk7XG4gIH1cbiAgY29uc3QgbGltaXRzID0gcGF5bG9hZFttYWluTGVuZ3RoXTtcbiAgcGF5bG9hZCA9IGhhcmRlbihwYXlsb2FkLnNsaWNlKDAsIG1haW5MZW5ndGgpKTtcbiAgLy9cbiAgaWYgKCFjaGVja01hdGNoZXMocGF5bG9hZCwgbWFpblBheWxvYWRTaGFwZSwgY2hlY2ssIGxhYmVsKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAobGltaXRzID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gKFxuICAgIChwYXNzU3R5bGVPZihsaW1pdHMpID09PSAnY29weVJlY29yZCcgfHxcbiAgICAgIGNoZWNrKGZhbHNlLCBYYExpbWl0cyBtdXN0IGJlIGEgcmVjb3JkOiAke3EobGltaXRzKX1gKSkgJiZcbiAgICBlbnRyaWVzKGxpbWl0cykuZXZlcnkoXG4gICAgICAoW2tleSwgdmFsdWVdKSA9PlxuICAgICAgICBwYXNzU3R5bGVPZih2YWx1ZSkgPT09ICdudW1iZXInIHx8XG4gICAgICAgIGNoZWNrKGZhbHNlLCBYYFZhbHVlIG9mIGxpbWl0ICR7cShrZXkpfSBidXQgYmUgYSBudW1iZXI6ICR7cSh2YWx1ZSl9YCksXG4gICAgKVxuICApO1xufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgY2hlY2tEZWNpbWFsRGlnaXRzTGltaXQgPSAoc3BlY2ltZW4sIGRlY2ltYWxEaWdpdHNMaW1pdCwgY2hlY2spID0+IHtcbiAgaWYgKFxuICAgIE1hdGguZmxvb3IoTWF0aC5sb2cxMChNYXRoLmFicyhOdW1iZXIoc3BlY2ltZW4pKSkpICsgMSA8PVxuICAgIGRlY2ltYWxEaWdpdHNMaW1pdFxuICApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gY2hlY2soXG4gICAgZmFsc2UsXG4gICAgWGBiaWdpbnQgJHtzcGVjaW1lbn0gbXVzdCBub3QgaGF2ZSBtb3JlIHRoYW4gJHtkZWNpbWFsRGlnaXRzTGltaXR9IGRpZ2l0c2AsXG4gICk7XG59O1xuXG4vKlxuXG4gKi9cbmNvbnN0IG1ha2VQYXR0ZXJuS2l0ID0gKCkgPT4ge1xuICAvKlxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IG1heWJlTWF0Y2hIZWxwZXIgPSB0YWcgPT5cbiAgICAvL1xuICAgIEhlbHBlcnNCeU1hdGNoVGFnW3RhZ107XG5cbiAgLypcblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IG1heWJlUGF5bG9hZFNoYXBlID0gdGFnID0+XG4gICAgLy9cbiAgICBHdWFyZFBheWxvYWRTaGFwZXNbdGFnXTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3Qgc2luZ2xldG9uS2luZHMgPSBuZXcgTWFwKFtcbiAgICBbJ251bGwnLCBudWxsXSxcbiAgICBbJ3VuZGVmaW5lZCcsIHVuZGVmaW5lZF0sXG4gIF0pO1xuXG4gIC8qXG5cblxuXG4gICAqL1xuICBjb25zdCB0YWdNZW1vID0gbmV3IFdlYWtNYXAoKTtcblxuICAvKlxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBjaGVja1RhZ2dlZCA9ICh0YWdnZWQsIHRhZywgY2hlY2spID0+IHtcbiAgICBjb25zdCBtYXRjaEhlbHBlciA9IG1heWJlTWF0Y2hIZWxwZXIodGFnKTtcbiAgICBpZiAobWF0Y2hIZWxwZXIpIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgcmV0dXJuIG1hdGNoSGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkKHRhZ2dlZC5wYXlsb2FkLCBjaGVjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHBheWxvYWRTaGFwZSA9IG1heWJlUGF5bG9hZFNoYXBlKHRhZyk7XG4gICAgICBpZiAocGF5bG9hZFNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIGNoZWNrTWF0Y2hlcyh0YWdnZWQucGF5bG9hZCwgcGF5bG9hZFNoYXBlLCBjaGVjaywgdGFnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgJ2NvcHlTZXQnOiB7XG4gICAgICAgIHJldHVybiBjaGVja0NvcHlTZXQodGFnZ2VkLCBjaGVjayk7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5QmFnJzoge1xuICAgICAgICByZXR1cm4gY2hlY2tDb3B5QmFnKHRhZ2dlZCwgY2hlY2spO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weU1hcCc6IHtcbiAgICAgICAgcmV0dXJuIGNoZWNrQ29weU1hcCh0YWdnZWQsIGNoZWNrKTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIFhgY2Fubm90IGNoZWNrIHVucmVjb2duaXplZCB0YWcgJHtxKHRhZyl9OiAke3RhZ2dlZH1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKlxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBraW5kT2YgPSAoc3BlY2ltZW4sIGNoZWNrID0gaWRlbnRDaGVja2VyKSA9PiB7XG4gICAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2Yoc3BlY2ltZW4pO1xuICAgIGlmIChwYXNzU3R5bGUgIT09ICd0YWdnZWQnKSB7XG4gICAgICByZXR1cm4gcGFzc1N0eWxlO1xuICAgIH1cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBpZiAodGFnTWVtby5oYXMoc3BlY2ltZW4pKSB7XG4gICAgICByZXR1cm4gdGFnTWVtby5nZXQoc3BlY2ltZW4pO1xuICAgIH1cbiAgICBjb25zdCB0YWcgPSBnZXRUYWcoc3BlY2ltZW4pO1xuICAgIGlmIChjaGVja1RhZ2dlZChzcGVjaW1lbiwgdGFnLCBjaGVjaykpIHtcbiAgICAgIHRhZ01lbW8uc2V0KHNwZWNpbWVuLCB0YWcpO1xuICAgICAgcmV0dXJuIHRhZztcbiAgICB9XG4gICAgaWYgKGNoZWNrICE9PSBpZGVudENoZWNrZXIpIHtcbiAgICAgIGNoZWNrKGZhbHNlLCBYYGNhbm5vdCBjaGVjayB1bnJlY29nbml6ZWQgdGFnICR7cSh0YWcpfWApO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9O1xuICBoYXJkZW4oa2luZE9mKTtcblxuICAvKlxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBjaGVja0tpbmQgPSAoc3BlY2ltZW4sIGtpbmQsIGNoZWNrKSA9PiB7XG4gICAgLy9cbiAgICBpZiAoc2luZ2xldG9uS2luZHMuaGFzKGtpbmQpKSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLCBzaW5nbGV0b25LaW5kcy5nZXQoa2luZCksIGNoZWNrKTtcbiAgICB9XG5cbiAgICBjb25zdCByZWFsS2luZCA9IGtpbmRPZihzcGVjaW1lbiwgY2hlY2spO1xuICAgIGlmIChraW5kID09PSByZWFsS2luZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChjaGVjayAhPT0gaWRlbnRDaGVja2VyKSB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGNoZWNrKGZhbHNlLCBYYCR7YihyZWFsS2luZCl9ICR7c3BlY2ltZW59IC0gTXVzdCBiZSBhICR7YihraW5kKX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIC8qXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBpc0tpbmQgPSAoc3BlY2ltZW4sIGtpbmQpID0+IGNoZWNrS2luZChzcGVjaW1lbiwga2luZCwgaWRlbnRDaGVja2VyKTtcblxuICAvKlxuXG5cblxuXG4gICAqL1xuICBjb25zdCBjaGVja0FzS2V5UGF0dCA9IChzcGVjaW1lbiwga2V5QXNQYXR0ZXJuLCBjaGVjaykgPT4ge1xuICAgIGlmIChpc0tleShzcGVjaW1lbikgJiYga2V5RVEoc3BlY2ltZW4sIGtleUFzUGF0dGVybikpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgY2hlY2sgIT09IGlkZW50Q2hlY2tlciAmJlxuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBjaGVjayhmYWxzZSwgWGAke3NwZWNpbWVufSAtIE11c3QgYmU6ICR7a2V5QXNQYXR0ZXJufWApXG4gICAgKTtcbiAgfTtcblxuICAvL1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBjaGVja1BhdHRlcm4gPSAocGF0dCwgY2hlY2spID0+IHtcbiAgICBpZiAoaXNLZXkocGF0dCkpIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHBhdHRlcm5NZW1vLmhhcyhwYXR0KSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8vXG4gICAgY29uc3QgcmVzdWx0ID0gY2hlY2tQYXR0ZXJuSW50ZXJuYWwocGF0dCwgY2hlY2spO1xuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIHBhdHRlcm5NZW1vLmFkZChwYXR0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvKlxuXG5cblxuXG4gICAqL1xuICBjb25zdCBjaGVja1BhdHRlcm5JbnRlcm5hbCA9IChwYXR0LCBjaGVjaykgPT4ge1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IGNoZWNrSXQgPSBjaGlsZCA9PiBjaGVja1BhdHRlcm4oY2hpbGQsIGNoZWNrKTtcblxuICAgIGNvbnN0IGtpbmQgPSBraW5kT2YocGF0dCwgY2hlY2spO1xuICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgY2FzZSB1bmRlZmluZWQ6IHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIHZhbHVlcyhwYXR0KS5ldmVyeShjaGVja0l0KTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIHBhdHQuZXZlcnkoY2hlY2tJdCk7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5TWFwJzoge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gY2hlY2tQYXR0ZXJuKHBhdHQudmFsdWVzLCBjaGVjayk7XG4gICAgICB9XG4gICAgICBjYXNlICdlcnJvcic6XG4gICAgICBjYXNlICdwcm9taXNlJzoge1xuICAgICAgICByZXR1cm4gY2hlY2soZmFsc2UsIFhgQSAke3Eoa2luZCl9IGNhbm5vdCBiZSBhIHBhdHRlcm5gKTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgaWYgKG1heWJlTWF0Y2hIZWxwZXIoa2luZCkgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBYYEEgcGFzc2FibGUgb2Yga2luZCAke3Eoa2luZCl9IGlzIG5vdCBhIHBhdHRlcm46ICR7cGF0dH1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKlxuXG5cbiAgICovXG4gIGNvbnN0IGlzUGF0dGVybiA9IHBhdHQgPT4gY2hlY2tQYXR0ZXJuKHBhdHQsIGlkZW50Q2hlY2tlcik7XG5cbiAgLypcblxuICAgKi9cbiAgY29uc3QgYXNzZXJ0UGF0dGVybiA9IHBhdHQgPT4ge1xuICAgIGNoZWNrUGF0dGVybihwYXR0LCBhc3NlcnRDaGVja2VyKTtcbiAgfTtcblxuICAvL1xuXG4gIC8qXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgY2hlY2tNYXRjaGVzID0gKHNwZWNpbWVuLCBwYXR0ZXJuLCBjaGVjaywgbGFiZWwgPSB1bmRlZmluZWQpID0+XG4gICAgLy9cbiAgICBhcHBseUxhYmVsaW5nRXJyb3IoY2hlY2tNYXRjaGVzSW50ZXJuYWwsIFtzcGVjaW1lbiwgcGF0dGVybiwgY2hlY2tdLCBsYWJlbCk7XG5cbiAgLypcblxuXG5cblxuICAgKi9cbiAgY29uc3QgY2hlY2tNYXRjaGVzSW50ZXJuYWwgPSAoc3BlY2ltZW4sIHBhdHQsIGNoZWNrKSA9PiB7XG4gICAgLy9cbiAgICBjb25zdCBwYXR0ZXJuS2luZCA9IGtpbmRPZihwYXR0LCBjaGVjayk7XG4gICAgY29uc3Qgc3BlY2ltZW5LaW5kID0ga2luZE9mKHNwZWNpbWVuKTsgLy9cbiAgICBzd2l0Y2ggKHBhdHRlcm5LaW5kKSB7XG4gICAgICBjYXNlIHVuZGVmaW5lZDoge1xuICAgICAgICByZXR1cm4gRmFpbGBwYXR0ZXJuIGV4cGVjdGVkOiAke3BhdHR9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3Byb21pc2UnOiB7XG4gICAgICAgIHJldHVybiBGYWlsYHByb21pc2VzIGNhbm5vdCBiZSBwYXR0ZXJuczogJHtwYXR0fWA7XG4gICAgICB9XG4gICAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgICAgcmV0dXJuIEZhaWxgZXJyb3JzIGNhbm5vdCBiZSBwYXR0ZXJuczogJHtwYXR0fWA7XG4gICAgICB9XG4gICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgY2FzZSAnbnVsbCc6XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICBjYXNlICdiaWdpbnQnOlxuICAgICAgY2FzZSAnc3RyaW5nJzpcbiAgICAgIGNhc2UgJ3N5bWJvbCc6XG4gICAgICBjYXNlICdjb3B5U2V0JzpcbiAgICAgIGNhc2UgJ2NvcHlCYWcnOlxuICAgICAgY2FzZSAncmVtb3RhYmxlJzoge1xuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gY2hlY2tBc0tleVBhdHQoc3BlY2ltZW4sIHBhdHQsIGNoZWNrKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgaWYgKGlzS2V5KHBhdHQpKSB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIHJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbiwgcGF0dCwgY2hlY2spO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzcGVjaW1lbktpbmQgIT09ICdjb3B5QXJyYXknKSB7XG4gICAgICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBYYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBhIGNvcHlBcnJheSB0byBtYXRjaCBhIGNvcHlBcnJheSBwYXR0ZXJuOiAke3EoXG4gICAgICAgICAgICAgIHBhdHQsXG4gICAgICAgICAgICApfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IGxlbmd0aCB9ID0gcGF0dDtcbiAgICAgICAgaWYgKHNwZWNpbWVuLmxlbmd0aCAhPT0gbGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBYYEFycmF5ICR7c3BlY2ltZW59IC0gTXVzdCBiZSBhcyBsb25nIGFzIGNvcHlBcnJheSBwYXR0ZXJuOiAke3EoXG4gICAgICAgICAgICAgIHBhdHQsXG4gICAgICAgICAgICApfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGF0dC5ldmVyeSgocCwgaSkgPT4gY2hlY2tNYXRjaGVzKHNwZWNpbWVuW2ldLCBwLCBjaGVjaywgaSkpO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgICAgaWYgKGlzS2V5KHBhdHQpKSB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIHJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbiwgcGF0dCwgY2hlY2spO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzcGVjaW1lbktpbmQgIT09ICdjb3B5UmVjb3JkJykge1xuICAgICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgWGAke3NwZWNpbWVufSAtIE11c3QgYmUgYSBjb3B5UmVjb3JkIHRvIG1hdGNoIGEgY29weVJlY29yZCBwYXR0ZXJuOiAke3EoXG4gICAgICAgICAgICAgIHBhdHQsXG4gICAgICAgICAgICApfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBjb25zdCBzcGVjaW1lbk5hbWVzID0gcmVjb3JkTmFtZXMoc3BlY2ltZW4pO1xuICAgICAgICBjb25zdCBwYXR0TmFtZXMgPSByZWNvcmROYW1lcyhwYXR0KTtcbiAgICAgICAgY29uc3QgbWlzc2luZyA9IGxpc3REaWZmZXJlbmNlKHBhdHROYW1lcywgc3BlY2ltZW5OYW1lcyk7XG4gICAgICAgIGlmIChtaXNzaW5nLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBYYCR7c3BlY2ltZW59IC0gTXVzdCBoYXZlIG1pc3NpbmcgcHJvcGVydGllcyAke3EobWlzc2luZyl9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHVuZXhwZWN0ZWQgPSBsaXN0RGlmZmVyZW5jZShzcGVjaW1lbk5hbWVzLCBwYXR0TmFtZXMpO1xuICAgICAgICBpZiAodW5leHBlY3RlZC5sZW5ndGggPj0gMSkge1xuICAgICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgWGAke3NwZWNpbWVufSAtIE11c3Qgbm90IGhhdmUgdW5leHBlY3RlZCBwcm9wZXJ0aWVzOiAke3EoXG4gICAgICAgICAgICAgIHVuZXhwZWN0ZWQsXG4gICAgICAgICAgICApfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBzcGVjaW1lblZhbHVlcyA9IHJlY29yZFZhbHVlcyhzcGVjaW1lbiwgc3BlY2ltZW5OYW1lcyk7XG4gICAgICAgIGNvbnN0IHBhdHRWYWx1ZXMgPSByZWNvcmRWYWx1ZXMocGF0dCwgcGF0dE5hbWVzKTtcbiAgICAgICAgcmV0dXJuIHBhdHROYW1lcy5ldmVyeSgobGFiZWwsIGkpID0+XG4gICAgICAgICAgY2hlY2tNYXRjaGVzKHNwZWNpbWVuVmFsdWVzW2ldLCBwYXR0VmFsdWVzW2ldLCBjaGVjaywgbGFiZWwpLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weU1hcCc6IHtcbiAgICAgICAgaWYgKGlzS2V5KHBhdHQpKSB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIHJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbiwgcGF0dCwgY2hlY2spO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzcGVjaW1lbktpbmQgIT09ICdjb3B5TWFwJykge1xuICAgICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgWGAke3NwZWNpbWVufSAtIE11c3QgYmUgYSBjb3B5TWFwIHRvIG1hdGNoIGEgY29weU1hcCBwYXR0ZXJuOiAke3EoXG4gICAgICAgICAgICAgIHBhdHQsXG4gICAgICAgICAgICApfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvL1xuICAgICAgICBjb25zdCBwYXR0S2V5U2V0ID0gY29weU1hcEtleVNldChwYXR0KTtcbiAgICAgICAgY29uc3Qgc3BlY2ltZW5LZXlTZXQgPSBjb3B5TWFwS2V5U2V0KHNwZWNpbWVuKTtcbiAgICAgICAgaWYgKCFjaGVja01hdGNoZXMoc3BlY2ltZW5LZXlTZXQsIHBhdHRLZXlTZXQsIGNoZWNrKSkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBjb25zdCBwYXR0VmFsdWVzID0gW107XG4gICAgICAgIGNvbnN0IHNwZWNpbWVuVmFsdWVzID0gW107XG4gICAgICAgIGNvbnN0IGVudHJ5UGFpcnMgPSBnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyhcbiAgICAgICAgICBwYXR0LFxuICAgICAgICAgIHNwZWNpbWVuLFxuICAgICAgICAgIGdldENvcHlNYXBFbnRyeUFycmF5LFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgKTtcbiAgICAgICAgZm9yIChjb25zdCBbX2tleSwgcGF0dFZhbHVlLCBzcGVjaW1lblZhbHVlXSBvZiBlbnRyeVBhaXJzKSB7XG4gICAgICAgICAgcGF0dFZhbHVlcy5wdXNoKHBhdHRWYWx1ZSk7XG4gICAgICAgICAgc3BlY2ltZW5WYWx1ZXMucHVzaChzcGVjaW1lblZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2hlY2tNYXRjaGVzKGhhcmRlbihzcGVjaW1lblZhbHVlcyksIGhhcmRlbihwYXR0VmFsdWVzKSwgY2hlY2spO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zdCBtYXRjaEhlbHBlciA9IG1heWJlTWF0Y2hIZWxwZXIocGF0dGVybktpbmQpO1xuICAgICAgICBpZiAobWF0Y2hIZWxwZXIpIHtcbiAgICAgICAgICByZXR1cm4gbWF0Y2hIZWxwZXIuY2hlY2tNYXRjaGVzKHNwZWNpbWVuLCBwYXR0LnBheWxvYWQsIGNoZWNrKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBzaG91bGQgaGF2ZSByZWNvZ25pemVkICR7cShwYXR0ZXJuS2luZCl9IGA7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qXG5cblxuXG4gICAqL1xuICBjb25zdCBtYXRjaGVzID0gKHNwZWNpbWVuLCBwYXR0KSA9PlxuICAgIGNoZWNrTWF0Y2hlcyhzcGVjaW1lbiwgcGF0dCwgaWRlbnRDaGVja2VyKTtcblxuICAvKlxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgbXVzdE1hdGNoID0gKHNwZWNpbWVuLCBwYXR0LCBsYWJlbCA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIGxldCBpbm5lckVycm9yO1xuICAgIHRyeSB7XG4gICAgICBpZiAoY2hlY2tNYXRjaGVzKHNwZWNpbWVuLCBwYXR0LCBpZGVudENoZWNrZXIsIHVuZGVmaW5lZCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICBpbm5lckVycm9yID0gZXI7XG4gICAgfVxuICAgIC8vXG4gICAgY2hlY2tNYXRjaGVzKHNwZWNpbWVuLCBwYXR0LCBhc3NlcnRDaGVja2VyLCBsYWJlbCk7XG4gICAgY29uc3Qgb3V0ZXJFcnJvciA9IG1ha2VFcnJvcihcbiAgICAgIFhgaW50ZXJuYWw6ICR7bGFiZWx9OiBpbmNvbnNpc3RlbnQgcGF0dGVybiBtYXRjaDogJHtxKHBhdHQpfWAsXG4gICAgKTtcbiAgICBpZiAoaW5uZXJFcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhbm5vdGF0ZUVycm9yKG91dGVyRXJyb3IsIFhgY2F1c2VkIGJ5ICR7aW5uZXJFcnJvcn1gKTtcbiAgICB9XG4gICAgdGhyb3cgb3V0ZXJFcnJvcjtcbiAgfTtcblxuICAvL1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBnZXRSYW5rQ292ZXIgPSAocGF0dCwgZW5jb2RlUGFzc2FibGUpID0+IHtcbiAgICBpZiAoaXNLZXkocGF0dCkpIHtcbiAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVQYXNzYWJsZShwYXR0KTtcbiAgICAgIGlmIChlbmNvZGVkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmV0dXJuIFtlbmNvZGVkLCBgJHtlbmNvZGVkfX5gXTtcbiAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YocGF0dCk7XG4gICAgc3dpdGNoIChwYXNzU3R5bGUpIHtcbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5UmVjb3JkJzoge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgY29uc3QgdGFnID0gZ2V0VGFnKHBhdHQpO1xuICAgICAgICBjb25zdCBtYXRjaEhlbHBlciA9IG1heWJlTWF0Y2hIZWxwZXIodGFnKTtcbiAgICAgICAgaWYgKG1hdGNoSGVscGVyKSB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIHJldHVybiBtYXRjaEhlbHBlci5nZXRSYW5rQ292ZXIocGF0dC5wYXlsb2FkLCBlbmNvZGVQYXNzYWJsZSk7XG4gICAgICAgIH1cbiAgICAgICAgc3dpdGNoICh0YWcpIHtcbiAgICAgICAgICBjYXNlICdjb3B5U2V0Jzoge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdjb3B5TWFwJzoge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgYnJlYWs7IC8vXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrOyAvL1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBicmVhazsgLy9cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZSk7XG4gIH07XG5cbiAgLypcblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBhcnJheUV2ZXJ5TWF0Y2hQYXR0ZXJuID0gKGFycmF5LCBwYXR0LCBjaGVjaywgbGFiZWxQcmVmaXggPSAnJykgPT4ge1xuICAgIGlmIChpc0tpbmQocGF0dCwgJ21hdGNoOmFueScpKSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBhcnJheS5ldmVyeSgoZWwsIGkpID0+XG4gICAgICBjaGVja01hdGNoZXMoZWwsIHBhdHQsIGNoZWNrLCBgJHtsYWJlbFByZWZpeH1bJHtpfV1gKSxcbiAgICApO1xuICB9O1xuXG4gIC8vXG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWF0Y2hBbnlIZWxwZXIgPSBGYXIoJ21hdGNoOmFueSBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoX3NwZWNpbWVuLCBfbWF0Y2hlclBheWxvYWQsIF9jaGVjaykgPT4gdHJ1ZSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAobWF0Y2hlclBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgbWF0Y2hlclBheWxvYWQgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgY2hlY2soZmFsc2UsIFhgbWF0Y2g6YW55IHBheWxvYWQ6ICR7bWF0Y2hlclBheWxvYWR9IC0gTXVzdCBiZSB1bmRlZmluZWRgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKF9tYXRjaFBheWxvYWQsIF9lbmNvZGVQYXNzYWJsZSkgPT4gWycnLCAneyddLFxuICB9KTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBtYXRjaEFuZEhlbHBlciA9IEZhcignbWF0Y2g6YW5kIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgcGF0dHMsIGNoZWNrKSA9PiB7XG4gICAgICByZXR1cm4gcGF0dHMuZXZlcnkocGF0dCA9PiBjaGVja01hdGNoZXMoc3BlY2ltZW4sIHBhdHQsIGNoZWNrKSk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAoYWxsZWdlZFBhdHRzLCBjaGVjaykgPT4ge1xuICAgICAgY29uc3QgY2hlY2tJdCA9IHBhdHQgPT4gY2hlY2tQYXR0ZXJuKHBhdHQsIGNoZWNrKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChwYXNzU3R5bGVPZihhbGxlZ2VkUGF0dHMpID09PSAnY29weUFycmF5JyB8fFxuICAgICAgICAgIGNoZWNrKGZhbHNlLCBYYE5lZWRzIGFycmF5IG9mIHN1Yi1wYXR0ZXJuczogJHtxKGFsbGVnZWRQYXR0cyl9YCkpICYmXG4gICAgICAgIGFsbGVnZWRQYXR0cy5ldmVyeShjaGVja0l0KVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgZ2V0UmFua0NvdmVyOiAocGF0dHMsIGVuY29kZVBhc3NhYmxlKSA9PlxuICAgICAgaW50ZXJzZWN0UmFua0NvdmVycyhcbiAgICAgICAgY29tcGFyZVJhbmssXG4gICAgICAgIHBhdHRzLm1hcChwID0+IGdldFJhbmtDb3ZlcihwLCBlbmNvZGVQYXNzYWJsZSkpLFxuICAgICAgKSxcbiAgfSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWF0Y2hPckhlbHBlciA9IEZhcignbWF0Y2g6b3IgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBwYXR0cywgY2hlY2spID0+IHtcbiAgICAgIGNvbnN0IHsgbGVuZ3RoIH0gPSBwYXR0cztcbiAgICAgIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIFhgJHtzcGVjaW1lbn0gLSBubyBwYXR0ZXJuIGRpc2p1bmN0cyB0byBtYXRjaDogJHtxKHBhdHRzKX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKFxuICAgICAgICBwYXR0cy5sZW5ndGggPT09IDIgJiZcbiAgICAgICAgIW1hdGNoZXMoc3BlY2ltZW4sIHBhdHRzWzBdKSAmJlxuICAgICAgICBpc0tpbmQocGF0dHNbMF0sICdtYXRjaDpraW5kJykgJiZcbiAgICAgICAgcGF0dHNbMF0ucGF5bG9hZCA9PT0gJ3VuZGVmaW5lZCdcbiAgICAgICkge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gY2hlY2tNYXRjaGVzKHNwZWNpbWVuLCBwYXR0c1sxXSwgY2hlY2spO1xuICAgICAgfVxuICAgICAgaWYgKHBhdHRzLnNvbWUocGF0dCA9PiBtYXRjaGVzKHNwZWNpbWVuLCBwYXR0KSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2hlY2soZmFsc2UsIFhgJHtzcGVjaW1lbn0gLSBNdXN0IG1hdGNoIG9uZSBvZiAke3EocGF0dHMpfWApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogbWF0Y2hBbmRIZWxwZXIuY2hlY2tJc1dlbGxGb3JtZWQsXG5cbiAgICBnZXRSYW5rQ292ZXI6IChwYXR0cywgZW5jb2RlUGFzc2FibGUpID0+XG4gICAgICB1bmlvblJhbmtDb3ZlcnMoXG4gICAgICAgIGNvbXBhcmVSYW5rLFxuICAgICAgICBwYXR0cy5tYXAocCA9PiBnZXRSYW5rQ292ZXIocCwgZW5jb2RlUGFzc2FibGUpKSxcbiAgICAgICksXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoTm90SGVscGVyID0gRmFyKCdtYXRjaDpub3QgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBwYXR0LCBjaGVjaykgPT4ge1xuICAgICAgaWYgKG1hdGNoZXMoc3BlY2ltZW4sIHBhdHQpKSB7XG4gICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICBYYCR7c3BlY2ltZW59IC0gTXVzdCBmYWlsIG5lZ2F0ZWQgcGF0dGVybjogJHtxKHBhdHQpfWAsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IGNoZWNrUGF0dGVybixcblxuICAgIGdldFJhbmtDb3ZlcjogKF9wYXR0LCBfZW5jb2RlUGFzc2FibGUpID0+IFsnJywgJ3snXSxcbiAgfSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWF0Y2hTY2FsYXJIZWxwZXIgPSBGYXIoJ21hdGNoOnNjYWxhciBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIF9tYXRjaGVyUGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja1NjYWxhcktleShzcGVjaW1lbiwgY2hlY2spLFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IG1hdGNoQW55SGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoX21hdGNoUGF5bG9hZCwgX2VuY29kZVBhc3NhYmxlKSA9PiBbJ2EnLCAnen4nXSxcbiAgfSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWF0Y2hLZXlIZWxwZXIgPSBGYXIoJ21hdGNoOmtleSBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIF9tYXRjaGVyUGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja0tleShzcGVjaW1lbiwgY2hlY2spLFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IG1hdGNoQW55SGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoX21hdGNoUGF5bG9hZCwgX2VuY29kZVBhc3NhYmxlKSA9PiBbJ2EnLCAnen4nXSxcbiAgfSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWF0Y2hQYXR0ZXJuSGVscGVyID0gRmFyKCdtYXRjaDpwYXR0ZXJuIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgX21hdGNoZXJQYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrUGF0dGVybihzcGVjaW1lbiwgY2hlY2spLFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IG1hdGNoQW55SGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoX21hdGNoUGF5bG9hZCwgX2VuY29kZVBhc3NhYmxlKSA9PiBbJ2EnLCAnen4nXSxcbiAgfSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWF0Y2hLaW5kSGVscGVyID0gRmFyKCdtYXRjaDpraW5kIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IGNoZWNrS2luZCxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAoYWxsZWdlZEtleUtpbmQsIGNoZWNrKSA9PlxuICAgICAgdHlwZW9mIGFsbGVnZWRLZXlLaW5kID09PSAnc3RyaW5nJyB8fFxuICAgICAgY2hlY2soXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBYYG1hdGNoOmtpbmQ6IHBheWxvYWQ6ICR7YWxsZWdlZEtleUtpbmR9IC0gQSBraW5kIG5hbWUgbXVzdCBiZSBhIHN0cmluZ2AsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoa2luZCwgX2VuY29kZVBhc3NhYmxlKSA9PiB7XG4gICAgICBsZXQgc3R5bGU7XG4gICAgICBzd2l0Y2ggKGtpbmQpIHtcbiAgICAgICAgY2FzZSAnY29weVNldCc6XG4gICAgICAgIGNhc2UgJ2NvcHlNYXAnOiB7XG4gICAgICAgICAgc3R5bGUgPSAndGFnZ2VkJztcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgc3R5bGUgPSBraW5kO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZ2V0UGFzc1N0eWxlQ292ZXIoc3R5bGUpO1xuICAgIH0sXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoVGFnZ2VkSGVscGVyID0gRmFyKCdtYXRjaDp0YWdnZWQgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBbdGFnUGF0dCwgcGF5bG9hZFBhdHRdLCBjaGVjaykgPT4ge1xuICAgICAgaWYgKHBhc3NTdHlsZU9mKHNwZWNpbWVuKSAhPT0gJ3RhZ2dlZCcpIHtcbiAgICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIFhgRXhwZWN0ZWQgdGFnZ2VkIG9iamVjdCwgbm90ICR7cShcbiAgICAgICAgICAgIHBhc3NTdHlsZU9mKHNwZWNpbWVuKSxcbiAgICAgICAgICApfTogJHtzcGVjaW1lbn1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2tNYXRjaGVzKGdldFRhZyhzcGVjaW1lbiksIHRhZ1BhdHQsIGNoZWNrLCAndGFnJykgJiZcbiAgICAgICAgY2hlY2tNYXRjaGVzKHNwZWNpbWVuLnBheWxvYWQsIHBheWxvYWRQYXR0LCBjaGVjaywgJ3BheWxvYWQnKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrTWF0Y2hlcyhcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgaGFyZGVuKFtNTS5wYXR0ZXJuKCksIE1NLnBhdHRlcm4oKV0pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOnRhZ2dlZCBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfa2luZCwgX2VuY29kZVBhc3NhYmxlKSA9PiBnZXRQYXNzU3R5bGVDb3ZlcigndGFnZ2VkJyksXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoQmlnaW50SGVscGVyID0gRmFyKCdtYXRjaDpiaWdpbnQgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBbbGltaXRzID0gdW5kZWZpbmVkXSwgY2hlY2spID0+IHtcbiAgICAgIGNvbnN0IHsgZGVjaW1hbERpZ2l0c0xpbWl0IH0gPSBsaW1pdChsaW1pdHMpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2tLaW5kKHNwZWNpbWVuLCAnYmlnaW50JywgY2hlY2spICYmXG4gICAgICAgIGNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0KHNwZWNpbWVuLCBkZWNpbWFsRGlnaXRzTGltaXQsIGNoZWNrKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBoYXJkZW4oW10pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOmJpZ2ludCBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfbWF0Y2hQYXlsb2FkLCBfZW5jb2RlUGFzc2FibGUpID0+XG4gICAgICBnZXRQYXNzU3R5bGVDb3ZlcignYmlnaW50JyksXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoTmF0SGVscGVyID0gRmFyKCdtYXRjaDpuYXQgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBbbGltaXRzID0gdW5kZWZpbmVkXSwgY2hlY2spID0+IHtcbiAgICAgIGNvbnN0IHsgZGVjaW1hbERpZ2l0c0xpbWl0IH0gPSBsaW1pdChsaW1pdHMpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2tLaW5kKHNwZWNpbWVuLCAnYmlnaW50JywgY2hlY2spICYmXG4gICAgICAgIGNoZWNrKFxuICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAqLyAoc3BlY2ltZW4pID49IDBuLFxuICAgICAgICAgIFhgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIG5vbi1uZWdhdGl2ZWAsXG4gICAgICAgICkgJiZcbiAgICAgICAgY2hlY2tEZWNpbWFsRGlnaXRzTGltaXQoc3BlY2ltZW4sIGRlY2ltYWxEaWdpdHNMaW1pdCwgY2hlY2spXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGhhcmRlbihbXSksXG4gICAgICAgIGNoZWNrLFxuICAgICAgICAnbWF0Y2g6bmF0IHBheWxvYWQnLFxuICAgICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKF9tYXRjaFBheWxvYWQsIF9lbmNvZGVQYXNzYWJsZSkgPT5cbiAgICAgIC8vXG4gICAgICBnZXRQYXNzU3R5bGVDb3ZlcignYmlnaW50JyksXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoU3RyaW5nSGVscGVyID0gRmFyKCdtYXRjaDpzdHJpbmcgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBbbGltaXRzID0gdW5kZWZpbmVkXSwgY2hlY2spID0+IHtcbiAgICAgIGNvbnN0IHsgc3RyaW5nTGVuZ3RoTGltaXQgfSA9IGxpbWl0KGxpbWl0cyk7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2tLaW5kKHNwZWNpbWVuLCAnc3RyaW5nJywgY2hlY2spICYmXG4gICAgICAgICAgLy9cbiAgICAgICAgICAoLyogICAgICAgICAgICAgICAgICovIChzcGVjaW1lbikubGVuZ3RoIDw9IHN0cmluZ0xlbmd0aExpbWl0IHx8XG4gICAgICAgICAgY2hlY2soXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIFhgc3RyaW5nICR7c3BlY2ltZW59IG11c3Qgbm90IGJlIGJpZ2dlciB0aGFuICR7c3RyaW5nTGVuZ3RoTGltaXR9YCxcbiAgICAgICAgICApKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBoYXJkZW4oW10pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOnN0cmluZyBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfbWF0Y2hQYXlsb2FkLCBfZW5jb2RlUGFzc2FibGUpID0+XG4gICAgICBnZXRQYXNzU3R5bGVDb3Zlcignc3RyaW5nJyksXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoU3ltYm9sSGVscGVyID0gRmFyKCdtYXRjaDpzeW1ib2wgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBbbGltaXRzID0gdW5kZWZpbmVkXSwgY2hlY2spID0+IHtcbiAgICAgIGNvbnN0IHsgc3ltYm9sTmFtZUxlbmd0aExpbWl0IH0gPSBsaW1pdChsaW1pdHMpO1xuICAgICAgaWYgKCFjaGVja0tpbmQoc3BlY2ltZW4sICdzeW1ib2wnLCBjaGVjaykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3ltYm9sTmFtZSA9IG5hbWVGb3JQYXNzYWJsZVN5bWJvbChzcGVjaW1lbik7XG5cbiAgICAgIGlmICh0eXBlb2Ygc3ltYm9sTmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgRmFpbGBpbnRlcm5hbDogUGFzc2FibGUgc3ltYm9sICR7c3BlY2ltZW59IG11c3QgaGF2ZSBhIHBhc3NhYmxlIG5hbWVgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICBzeW1ib2xOYW1lLmxlbmd0aCA8PSBzeW1ib2xOYW1lTGVuZ3RoTGltaXQsXG4gICAgICAgIFhgU3ltYm9sIG5hbWUgJHtxKFxuICAgICAgICAgIHN5bWJvbE5hbWUsXG4gICAgICAgICl9IG11c3Qgbm90IGJlIGJpZ2dlciB0aGFuICR7c3ltYm9sTmFtZUxlbmd0aExpbWl0fWAsXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGhhcmRlbihbXSksXG4gICAgICAgIGNoZWNrLFxuICAgICAgICAnbWF0Y2g6c3ltYm9sIHBheWxvYWQnLFxuICAgICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKF9tYXRjaFBheWxvYWQsIF9lbmNvZGVQYXNzYWJsZSkgPT5cbiAgICAgIGdldFBhc3NTdHlsZUNvdmVyKCdzeW1ib2wnKSxcbiAgfSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWF0Y2hSZW1vdGFibGVIZWxwZXIgPSBGYXIoJ21hdGNoOnJlbW90YWJsZSBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIHJlbW90YWJsZURlc2MsIGNoZWNrKSA9PiB7XG4gICAgICBpZiAoaXNLaW5kKHNwZWNpbWVuLCAncmVtb3RhYmxlJykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoY2hlY2sgPT09IGlkZW50Q2hlY2tlcikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCB7IGxhYmVsIH0gPSByZW1vdGFibGVEZXNjO1xuICAgICAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2Yoc3BlY2ltZW4pO1xuICAgICAgY29uc3Qga2luZERldGFpbHMgPVxuICAgICAgICBwYXNzU3R5bGUgIT09ICd0YWdnZWQnXG4gICAgICAgICAgPyAvL1xuICAgICAgICAgICAgYihwYXNzU3R5bGUpXG4gICAgICAgICAgOiAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIHEoZ2V0VGFnKHNwZWNpbWVuKSk7XG4gICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgIGZhbHNlLFxuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBYYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBhIHJlbW90YWJsZSAke2IobGFiZWwpfSwgbm90ICR7a2luZERldGFpbHN9YCxcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAoYWxsZWdlZFJlbW90YWJsZURlc2MsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tNYXRjaGVzKFxuICAgICAgICBhbGxlZ2VkUmVtb3RhYmxlRGVzYyxcbiAgICAgICAgaGFyZGVuKHsgbGFiZWw6IE1NLnN0cmluZygpIH0pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOnJlbW90YWJsZSBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfcmVtb3RhYmxlRGVzYywgX2VuY29kZVBhc3NhYmxlKSA9PlxuICAgICAgZ2V0UGFzc1N0eWxlQ292ZXIoJ3JlbW90YWJsZScpLFxuICB9KTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBtYXRjaExURUhlbHBlciA9IEZhcignbWF0Y2g6bHRlIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgcmlnaHRPcGVyYW5kLCBjaGVjaykgPT5cbiAgICAgIGtleUxURShzcGVjaW1lbiwgcmlnaHRPcGVyYW5kKSB8fFxuICAgICAgY2hlY2soZmFsc2UsIFhgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIDw9ICR7cmlnaHRPcGVyYW5kfWApLFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IGNoZWNrS2V5LFxuXG4gICAgZ2V0UmFua0NvdmVyOiAocmlnaHRPcGVyYW5kLCBlbmNvZGVQYXNzYWJsZSkgPT4ge1xuICAgICAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YocmlnaHRPcGVyYW5kKTtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGxldCBbbGVmdEJvdW5kLCByaWdodEJvdW5kXSA9IGdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZSk7XG4gICAgICBjb25zdCBuZXdSaWdodEJvdW5kID0gYCR7ZW5jb2RlUGFzc2FibGUocmlnaHRPcGVyYW5kKX1+YDtcbiAgICAgIGlmIChuZXdSaWdodEJvdW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgcmlnaHRCb3VuZCA9IG5ld1JpZ2h0Qm91bmQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gW2xlZnRCb3VuZCwgcmlnaHRCb3VuZF07XG4gICAgfSxcbiAgfSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWF0Y2hMVEhlbHBlciA9IEZhcignbWF0Y2g6bHQgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCByaWdodE9wZXJhbmQsIGNoZWNrKSA9PlxuICAgICAga2V5TFQoc3BlY2ltZW4sIHJpZ2h0T3BlcmFuZCkgfHxcbiAgICAgIGNoZWNrKGZhbHNlLCBYYCR7c3BlY2ltZW59IC0gTXVzdCBiZSA8ICR7cmlnaHRPcGVyYW5kfWApLFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IGNoZWNrS2V5LFxuXG4gICAgZ2V0UmFua0NvdmVyOiBtYXRjaExURUhlbHBlci5nZXRSYW5rQ292ZXIsXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoR1RFSGVscGVyID0gRmFyKCdtYXRjaDpndGUgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCByaWdodE9wZXJhbmQsIGNoZWNrKSA9PlxuICAgICAga2V5R1RFKHNwZWNpbWVuLCByaWdodE9wZXJhbmQpIHx8XG4gICAgICBjaGVjayhmYWxzZSwgWGAke3NwZWNpbWVufSAtIE11c3QgYmUgPj0gJHtyaWdodE9wZXJhbmR9YCksXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogY2hlY2tLZXksXG5cbiAgICBnZXRSYW5rQ292ZXI6IChyaWdodE9wZXJhbmQsIGVuY29kZVBhc3NhYmxlKSA9PiB7XG4gICAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihyaWdodE9wZXJhbmQpO1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgbGV0IFtsZWZ0Qm91bmQsIHJpZ2h0Qm91bmRdID0gZ2V0UGFzc1N0eWxlQ292ZXIocGFzc1N0eWxlKTtcbiAgICAgIGNvbnN0IG5ld0xlZnRCb3VuZCA9IGVuY29kZVBhc3NhYmxlKHJpZ2h0T3BlcmFuZCk7XG4gICAgICBpZiAobmV3TGVmdEJvdW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbGVmdEJvdW5kID0gbmV3TGVmdEJvdW5kO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtsZWZ0Qm91bmQsIHJpZ2h0Qm91bmRdO1xuICAgIH0sXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoR1RIZWxwZXIgPSBGYXIoJ21hdGNoOmd0IGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgcmlnaHRPcGVyYW5kLCBjaGVjaykgPT5cbiAgICAgIGtleUdUKHNwZWNpbWVuLCByaWdodE9wZXJhbmQpIHx8XG4gICAgICBjaGVjayhmYWxzZSwgWGAke3NwZWNpbWVufSAtIE11c3QgYmUgPiAke3JpZ2h0T3BlcmFuZH1gKSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiBjaGVja0tleSxcblxuICAgIGdldFJhbmtDb3ZlcjogbWF0Y2hHVEVIZWxwZXIuZ2V0UmFua0NvdmVyLFxuICB9KTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBtYXRjaFJlY29yZE9mSGVscGVyID0gRmFyKCdtYXRjaDpyZWNvcmRPZiBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoXG4gICAgICBzcGVjaW1lbixcbiAgICAgIFtrZXlQYXR0LCB2YWx1ZVBhdHQsIGxpbWl0cyA9IHVuZGVmaW5lZF0sXG4gICAgICBjaGVjayxcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IHsgbnVtUHJvcGVydGllc0xpbWl0LCBwcm9wZXJ0eU5hbWVMZW5ndGhMaW1pdCB9ID0gbGltaXQobGltaXRzKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNoZWNrS2luZChzcGVjaW1lbiwgJ2NvcHlSZWNvcmQnLCBjaGVjaykgJiZcbiAgICAgICAgY2hlY2soXG4gICAgICAgICAgb3duS2V5cyhzcGVjaW1lbikubGVuZ3RoIDw9IG51bVByb3BlcnRpZXNMaW1pdCxcbiAgICAgICAgICBYYE11c3Qgbm90IGhhdmUgbW9yZSB0aGFuICR7cShcbiAgICAgICAgICAgIG51bVByb3BlcnRpZXNMaW1pdCxcbiAgICAgICAgICApfSBwcm9wZXJ0aWVzOiAke3NwZWNpbWVufWAsXG4gICAgICAgICkgJiZcbiAgICAgICAgZW50cmllcyhzcGVjaW1lbikuZXZlcnkoXG4gICAgICAgICAgKFtrZXksIHZhbHVlXSkgPT5cbiAgICAgICAgICAgIGFwcGx5TGFiZWxpbmdFcnJvcihcbiAgICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICBrZXkubGVuZ3RoIDw9IHByb3BlcnR5TmFtZUxlbmd0aExpbWl0LFxuICAgICAgICAgICAgICAgIFhgUHJvcGVydHkgbmFtZSBtdXN0IG5vdCBiZSBsb25nZXIgdGhhbiAke3EoXG4gICAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWVMZW5ndGhMaW1pdCxcbiAgICAgICAgICAgICAgICApfWAsXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICkgJiZcbiAgICAgICAgICAgIGNoZWNrTWF0Y2hlcyhcbiAgICAgICAgICAgICAgaGFyZGVuKFtrZXksIHZhbHVlXSksXG4gICAgICAgICAgICAgIGhhcmRlbihba2V5UGF0dCwgdmFsdWVQYXR0XSksXG4gICAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICApLFxuICAgICAgICApXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGhhcmRlbihbTU0ucGF0dGVybigpLCBNTS5wYXR0ZXJuKCldKSxcbiAgICAgICAgY2hlY2ssXG4gICAgICAgICdtYXRjaDpyZWNvcmRPZiBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6IF9lbnRyeVBhdHQgPT4gZ2V0UGFzc1N0eWxlQ292ZXIoJ2NvcHlSZWNvcmQnKSxcbiAgfSk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWF0Y2hBcnJheU9mSGVscGVyID0gRmFyKCdtYXRjaDphcnJheU9mIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgW3N1YlBhdHQsIGxpbWl0cyA9IHVuZGVmaW5lZF0sIGNoZWNrKSA9PiB7XG4gICAgICBjb25zdCB7IGFycmF5TGVuZ3RoTGltaXQgfSA9IGxpbWl0KGxpbWl0cyk7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2tLaW5kKHNwZWNpbWVuLCAnY29weUFycmF5JywgY2hlY2spICYmXG4gICAgICAgICgvKiAgICAgICAgICAgICAgICAqLyAoc3BlY2ltZW4pLmxlbmd0aCA8PSBhcnJheUxlbmd0aExpbWl0IHx8XG4gICAgICAgICAgY2hlY2soXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIFhgQXJyYXkgbGVuZ3RoICR7c3BlY2ltZW4ubGVuZ3RofSBtdXN0IGJlIDw9IGxpbWl0ICR7YXJyYXlMZW5ndGhMaW1pdH1gLFxuICAgICAgICAgICkpICYmXG4gICAgICAgIGFycmF5RXZlcnlNYXRjaFBhdHRlcm4oc3BlY2ltZW4sIHN1YlBhdHQsIGNoZWNrKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBoYXJkZW4oW01NLnBhdHRlcm4oKV0pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOmFycmF5T2YgcGF5bG9hZCcsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoKSA9PiBnZXRQYXNzU3R5bGVDb3ZlcignY29weUFycmF5JyksXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoU2V0T2ZIZWxwZXIgPSBGYXIoJ21hdGNoOnNldE9mIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgW2tleVBhdHQsIGxpbWl0cyA9IHVuZGVmaW5lZF0sIGNoZWNrKSA9PiB7XG4gICAgICBjb25zdCB7IG51bVNldEVsZW1lbnRzTGltaXQgfSA9IGxpbWl0KGxpbWl0cyk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjaGVja0tpbmQoc3BlY2ltZW4sICdjb3B5U2V0JywgY2hlY2spICYmXG4gICAgICAgIGNoZWNrKFxuICAgICAgICAgIC8qICAgICAgICAgICAgICAgICovIChzcGVjaW1lbi5wYXlsb2FkKS5sZW5ndGggPCBudW1TZXRFbGVtZW50c0xpbWl0LFxuICAgICAgICAgIFhgU2V0IG11c3Qgbm90IGhhdmUgbW9yZSB0aGFuICR7cShudW1TZXRFbGVtZW50c0xpbWl0KX0gZWxlbWVudHM6ICR7XG4gICAgICAgICAgICBzcGVjaW1lbi5wYXlsb2FkLmxlbmd0aFxuICAgICAgICAgIH1gLFxuICAgICAgICApICYmXG4gICAgICAgIGFycmF5RXZlcnlNYXRjaFBhdHRlcm4oc3BlY2ltZW4ucGF5bG9hZCwga2V5UGF0dCwgY2hlY2ssICdzZXQgZWxlbWVudHMnKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBoYXJkZW4oW01NLnBhdHRlcm4oKV0pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOnNldE9mIHBheWxvYWQnLFxuICAgICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKCkgPT4gZ2V0UGFzc1N0eWxlQ292ZXIoJ3RhZ2dlZCcpLFxuICB9KTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBtYXRjaEJhZ09mSGVscGVyID0gRmFyKCdtYXRjaDpiYWdPZiBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoXG4gICAgICBzcGVjaW1lbixcbiAgICAgIFtrZXlQYXR0LCBjb3VudFBhdHQsIGxpbWl0cyA9IHVuZGVmaW5lZF0sXG4gICAgICBjaGVjayxcbiAgICApID0+IHtcbiAgICAgIGNvbnN0IHsgbnVtVW5pcXVlQmFnRWxlbWVudHNMaW1pdCwgZGVjaW1hbERpZ2l0c0xpbWl0IH0gPSBsaW1pdChsaW1pdHMpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2tLaW5kKHNwZWNpbWVuLCAnY29weUJhZycsIGNoZWNrKSAmJlxuICAgICAgICBjaGVjayhcbiAgICAgICAgICAvKiAgICAgICAgICAgICAgICAqLyAoc3BlY2ltZW4ucGF5bG9hZCkubGVuZ3RoIDw9XG4gICAgICAgICAgICBudW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0LFxuICAgICAgICAgIFhgQmFnIG11c3Qgbm90IGhhdmUgbW9yZSB0aGFuICR7cShcbiAgICAgICAgICAgIG51bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXQsXG4gICAgICAgICAgKX0gdW5pcXVlIGVsZW1lbnRzOiAke3NwZWNpbWVufWAsXG4gICAgICAgICkgJiZcbiAgICAgICAgc3BlY2ltZW4ucGF5bG9hZC5ldmVyeShcbiAgICAgICAgICAoW2tleSwgY291bnRdLCBpKSA9PlxuICAgICAgICAgICAgY2hlY2tNYXRjaGVzKGtleSwga2V5UGF0dCwgY2hlY2ssIGBiYWcga2V5c1ske2l9XWApICYmXG4gICAgICAgICAgICBhcHBseUxhYmVsaW5nRXJyb3IoXG4gICAgICAgICAgICAgIGNoZWNrRGVjaW1hbERpZ2l0c0xpbWl0LFxuICAgICAgICAgICAgICBbY291bnQsIGRlY2ltYWxEaWdpdHNMaW1pdCwgY2hlY2tdLFxuICAgICAgICAgICAgICBgYmFnIGNvdW50c1ske2l9XWAsXG4gICAgICAgICAgICApICYmXG4gICAgICAgICAgICBjaGVja01hdGNoZXMoY291bnQsIGNvdW50UGF0dCwgY2hlY2ssIGBiYWcgY291bnRzWyR7aX1dYCksXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAocGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgaGFyZGVuKFtNTS5wYXR0ZXJuKCksIE1NLnBhdHRlcm4oKV0pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOmJhZ09mIHBheWxvYWQnLFxuICAgICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKCkgPT4gZ2V0UGFzc1N0eWxlQ292ZXIoJ3RhZ2dlZCcpLFxuICB9KTtcblxuICAvKlxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBlbGVtZW50c0hhc1NwbGl0ID0gKFxuICAgIGVsZW1lbnRzLFxuICAgIGVsZW1lbnRQYXR0LFxuICAgIGJvdW5kLFxuICAgIGluUmVzdWx0cyA9IHVuZGVmaW5lZCxcbiAgICBvdXRSZXN1bHRzID0gdW5kZWZpbmVkLFxuICAgIGNoZWNrID0gaWRlbnRDaGVja2VyLFxuICApID0+IHtcbiAgICBsZXQgY291bnQgPSAwbjtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGZvciAobGV0IGkgPSBlbGVtZW50cy5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgICAgY29uc3QgZWxlbWVudCA9IGVsZW1lbnRzW2ldO1xuICAgICAgaWYgKGNvdW50IDwgYm91bmQpIHtcbiAgICAgICAgaWYgKG1hdGNoZXMoZWxlbWVudCwgZWxlbWVudFBhdHQpKSB7XG4gICAgICAgICAgY291bnQgKz0gMW47XG4gICAgICAgICAgaWYgKGluUmVzdWx0cykgaW5SZXN1bHRzLnB1c2goZWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSBpZiAob3V0UmVzdWx0cykge1xuICAgICAgICAgIG91dFJlc3VsdHMucHVzaChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChvdXRSZXN1bHRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXRSZXN1bHRzLnB1c2goZWxlbWVudCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjaGVjayhcbiAgICAgIGNvdW50ID49IGJvdW5kLFxuICAgICAgWGBIYXMgb25seSAke3EoY291bnQpfSBtYXRjaGVzLCBidXQgbmVlZHMgJHtxKGJvdW5kKX1gLFxuICAgICk7XG4gIH07XG5cbiAgLypcblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgcGFpcnNIYXNTcGxpdCA9IChcbiAgICBwYWlycyxcbiAgICBlbGVtZW50UGF0dCxcbiAgICBib3VuZCxcbiAgICBpblJlc3VsdHMgPSB1bmRlZmluZWQsXG4gICAgb3V0UmVzdWx0cyA9IHVuZGVmaW5lZCxcbiAgICBjaGVjayA9IGlkZW50Q2hlY2tlcixcbiAgKSA9PiB7XG4gICAgbGV0IGNvdW50ID0gMG47XG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBmb3IgKGxldCBpID0gcGFpcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpIC09IDEpIHtcbiAgICAgIGNvbnN0IFtlbGVtZW50LCBudW1dID0gcGFpcnNbaV07XG4gICAgICBjb25zdCBudW1SZXN0ID0gYm91bmQgLSBjb3VudDtcbiAgICAgIGlmIChudW1SZXN0ID49IDFuKSB7XG4gICAgICAgIGlmIChtYXRjaGVzKGVsZW1lbnQsIGVsZW1lbnRQYXR0KSkge1xuICAgICAgICAgIGlmIChudW0gPD0gbnVtUmVzdCkge1xuICAgICAgICAgICAgY291bnQgKz0gbnVtO1xuICAgICAgICAgICAgaWYgKGluUmVzdWx0cykgaW5SZXN1bHRzLnB1c2goW2VsZW1lbnQsIG51bV0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBudW1JbiA9IG51bVJlc3Q7XG4gICAgICAgICAgICBjb3VudCArPSBudW1JbjtcbiAgICAgICAgICAgIGlmIChpblJlc3VsdHMpIGluUmVzdWx0cy5wdXNoKFtlbGVtZW50LCBudW1SZXN0XSk7XG4gICAgICAgICAgICBpZiAob3V0UmVzdWx0cykgb3V0UmVzdWx0cy5wdXNoKFtlbGVtZW50LCBudW0gLSBudW1SZXN0XSk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKG91dFJlc3VsdHMpIHtcbiAgICAgICAgICBvdXRSZXN1bHRzLnB1c2goW2VsZW1lbnQsIG51bV0pO1xuICAgICAgICB9XG4gICAgICB9IGVsc2UgaWYgKG91dFJlc3VsdHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBicmVhaztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dFJlc3VsdHMucHVzaChbZWxlbWVudCwgbnVtXSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjaGVjayhcbiAgICAgIGNvdW50ID49IGJvdW5kLFxuICAgICAgWGBIYXMgb25seSAke3EoY291bnQpfSBtYXRjaGVzLCBidXQgbmVlZHMgJHtxKGJvdW5kKX1gLFxuICAgICk7XG4gIH07XG5cbiAgLypcblxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBjb250YWluZXJIYXNTcGxpdCA9IChcbiAgICBzcGVjaW1lbixcbiAgICBlbGVtZW50UGF0dCxcbiAgICBib3VuZCxcbiAgICBuZWVkSW5SZXN1bHRzID0gZmFsc2UsXG4gICAgbmVlZE91dFJlc3VsdHMgPSBmYWxzZSxcbiAgICBjaGVjayA9IGlkZW50Q2hlY2tlcixcbiAgKSA9PiB7XG4gICAgY29uc3QgaW5SZXN1bHRzID0gbmVlZEluUmVzdWx0cyA/IFtdIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IG91dFJlc3VsdHMgPSBuZWVkT3V0UmVzdWx0cyA/IFtdIDogdW5kZWZpbmVkO1xuICAgIGNvbnN0IGtpbmQgPSBraW5kT2Yoc3BlY2ltZW4pO1xuICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgY2FzZSAnY29weUFycmF5Jzoge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIWVsZW1lbnRzSGFzU3BsaXQoXG4gICAgICAgICAgICBzcGVjaW1lbixcbiAgICAgICAgICAgIGVsZW1lbnRQYXR0LFxuICAgICAgICAgICAgYm91bmQsXG4gICAgICAgICAgICBpblJlc3VsdHMsXG4gICAgICAgICAgICBvdXRSZXN1bHRzLFxuICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW2luUmVzdWx0cywgb3V0UmVzdWx0c107XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5U2V0Jzoge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIWVsZW1lbnRzSGFzU3BsaXQoXG4gICAgICAgICAgICBzcGVjaW1lbi5wYXlsb2FkLFxuICAgICAgICAgICAgZWxlbWVudFBhdHQsXG4gICAgICAgICAgICBib3VuZCxcbiAgICAgICAgICAgIGluUmVzdWx0cyxcbiAgICAgICAgICAgIG91dFJlc3VsdHMsXG4gICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIGluUmVzdWx0cyAmJiBtYWtlQ29weVNldChpblJlc3VsdHMpLFxuICAgICAgICAgIG91dFJlc3VsdHMgJiYgbWFrZUNvcHlTZXQob3V0UmVzdWx0cyksXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5QmFnJzoge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIXBhaXJzSGFzU3BsaXQoXG4gICAgICAgICAgICBzcGVjaW1lbi5wYXlsb2FkLFxuICAgICAgICAgICAgZWxlbWVudFBhdHQsXG4gICAgICAgICAgICBib3VuZCxcbiAgICAgICAgICAgIGluUmVzdWx0cyxcbiAgICAgICAgICAgIG91dFJlc3VsdHMsXG4gICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgIGluUmVzdWx0cyAmJiBtYWtlQ29weUJhZyhpblJlc3VsdHMpLFxuICAgICAgICAgIG91dFJlc3VsdHMgJiYgbWFrZUNvcHlCYWcob3V0UmVzdWx0cyksXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHJldHVybiBjaGVjayhmYWxzZSwgWGB1bmV4cGVjdGVkICR7cShraW5kKX1gKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgbWF0Y2hDb250YWluZXJIYXNIZWxwZXIgPSBGYXIoJ00uY29udGFpbmVySGFzIGhlbHBlcicsIHtcbiAgICAvKlxuXG5cblxuICAgICAqL1xuICAgIGNoZWNrTWF0Y2hlczogKFxuICAgICAgc3BlY2ltZW4sXG4gICAgICBbZWxlbWVudFBhdHQsIGJvdW5kLCBsaW1pdHMgPSB1bmRlZmluZWRdLFxuICAgICAgY2hlY2ssXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBraW5kID0ga2luZE9mKHNwZWNpbWVuLCBjaGVjayk7XG4gICAgICBjb25zdCB7IGRlY2ltYWxEaWdpdHNMaW1pdCB9ID0gbGltaXQobGltaXRzKTtcbiAgICAgIGlmIChcbiAgICAgICAgIWFwcGx5TGFiZWxpbmdFcnJvcihcbiAgICAgICAgICBjaGVja0RlY2ltYWxEaWdpdHNMaW1pdCxcbiAgICAgICAgICBbYm91bmQsIGRlY2ltYWxEaWdpdHNMaW1pdCwgY2hlY2tdLFxuICAgICAgICAgIGAke2tpbmR9IG1hdGNoZXNgLFxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuICEhY29udGFpbmVySGFzU3BsaXQoXG4gICAgICAgIHNwZWNpbWVuLFxuICAgICAgICBlbGVtZW50UGF0dCxcbiAgICAgICAgYm91bmQsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgY2hlY2ssXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGhhcmRlbihbTU0ucGF0dGVybigpLCBNTS5ndGUoMW4pXSksXG4gICAgICAgIGNoZWNrLFxuICAgICAgICAnTS5jb250YWluZXJIYXMgcGF5bG9hZCcsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoKSA9PiBnZXRQYXNzU3R5bGVDb3ZlcigndGFnZ2VkJyksXG4gIH0pO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoTWFwT2ZIZWxwZXIgPSBGYXIoJ21hdGNoOm1hcE9mIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChcbiAgICAgIHNwZWNpbWVuLFxuICAgICAgW2tleVBhdHQsIHZhbHVlUGF0dCwgbGltaXRzID0gdW5kZWZpbmVkXSxcbiAgICAgIGNoZWNrLFxuICAgICkgPT4ge1xuICAgICAgY29uc3QgeyBudW1NYXBFbnRyaWVzTGltaXQgfSA9IGxpbWl0KGxpbWl0cyk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjaGVja0tpbmQoc3BlY2ltZW4sICdjb3B5TWFwJywgY2hlY2spICYmXG4gICAgICAgIGNoZWNrKFxuICAgICAgICAgIC8qICAgICAgICAgICAgICAgICovIChzcGVjaW1lbi5wYXlsb2FkLmtleXMpLmxlbmd0aCA8PVxuICAgICAgICAgICAgbnVtTWFwRW50cmllc0xpbWl0LFxuICAgICAgICAgIFhgQ29weU1hcCBtdXN0IGhhdmUgbm8gbW9yZSB0aGFuICR7cShcbiAgICAgICAgICAgIG51bU1hcEVudHJpZXNMaW1pdCxcbiAgICAgICAgICApfSBlbnRyaWVzOiAke3NwZWNpbWVufWAsXG4gICAgICAgICkgJiZcbiAgICAgICAgYXJyYXlFdmVyeU1hdGNoUGF0dGVybihcbiAgICAgICAgICBzcGVjaW1lbi5wYXlsb2FkLmtleXMsXG4gICAgICAgICAga2V5UGF0dCxcbiAgICAgICAgICBjaGVjayxcbiAgICAgICAgICAnbWFwIGtleXMnLFxuICAgICAgICApICYmXG4gICAgICAgIGFycmF5RXZlcnlNYXRjaFBhdHRlcm4oXG4gICAgICAgICAgc3BlY2ltZW4ucGF5bG9hZC52YWx1ZXMsXG4gICAgICAgICAgdmFsdWVQYXR0LFxuICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgICdtYXAgdmFsdWVzJyxcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBoYXJkZW4oW01NLnBhdHRlcm4oKSwgTU0ucGF0dGVybigpXSksXG4gICAgICAgIGNoZWNrLFxuICAgICAgICAnbWF0Y2g6bWFwT2YgcGF5bG9hZCcsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiBfZW50cnlQYXR0ID0+IGdldFBhc3NTdHlsZUNvdmVyKCd0YWdnZWQnKSxcbiAgfSk7XG5cbiAgLypcblxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBzcGxpdEFycmF5UGFydHMgPSAoc3BlY2ltZW4sIHJlcXVpcmVkUGF0dCwgb3B0aW9uYWxQYXR0KSA9PiB7XG4gICAgY29uc3QgbnVtUmVxdWlyZWQgPSByZXF1aXJlZFBhdHQubGVuZ3RoO1xuICAgIGNvbnN0IG51bU9wdGlvbmFsID0gb3B0aW9uYWxQYXR0Lmxlbmd0aDtcbiAgICBjb25zdCByZXF1aXJlZFNwZWNpbWVuID0gc3BlY2ltZW4uc2xpY2UoMCwgbnVtUmVxdWlyZWQpO1xuICAgIGNvbnN0IG9wdGlvbmFsU3BlY2ltZW4gPSBzcGVjaW1lbi5zbGljZShcbiAgICAgIG51bVJlcXVpcmVkLFxuICAgICAgbnVtUmVxdWlyZWQgKyBudW1PcHRpb25hbCxcbiAgICApO1xuICAgIGNvbnN0IHJlc3RTcGVjaW1lbiA9IHNwZWNpbWVuLnNsaWNlKG51bVJlcXVpcmVkICsgbnVtT3B0aW9uYWwpO1xuICAgIHJldHVybiBoYXJkZW4oeyByZXF1aXJlZFNwZWNpbWVuLCBvcHRpb25hbFNwZWNpbWVuLCByZXN0U3BlY2ltZW4gfSk7XG4gIH07XG5cbiAgLypcblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgYWRhcHRBcnJheVBhdHRlcm4gPSAob3B0aW9uYWxQYXR0LCBsZW5ndGgpID0+XG4gICAgaGFyZGVuKG9wdGlvbmFsUGF0dC5zbGljZSgwLCBsZW5ndGgpLm1hcChwYXR0ID0+IE1NLm9wdChwYXR0KSkpO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoU3BsaXRBcnJheUhlbHBlciA9IEZhcignbWF0Y2g6c3BsaXRBcnJheSBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoXG4gICAgICBzcGVjaW1lbixcbiAgICAgIFtyZXF1aXJlZFBhdHQsIG9wdGlvbmFsUGF0dCA9IFtdLCByZXN0UGF0dCA9IE1NLmFueSgpXSxcbiAgICAgIGNoZWNrLFxuICAgICkgPT4ge1xuICAgICAgaWYgKCFjaGVja0tpbmQoc3BlY2ltZW4sICdjb3B5QXJyYXknLCBjaGVjaykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3QgeyByZXF1aXJlZFNwZWNpbWVuLCBvcHRpb25hbFNwZWNpbWVuLCByZXN0U3BlY2ltZW4gfSA9XG4gICAgICAgIHNwbGl0QXJyYXlQYXJ0cyhzcGVjaW1lbiwgcmVxdWlyZWRQYXR0LCBvcHRpb25hbFBhdHQpO1xuICAgICAgY29uc3QgcGFydGlhbFBhdHQgPSBhZGFwdEFycmF5UGF0dGVybihcbiAgICAgICAgb3B0aW9uYWxQYXR0LFxuICAgICAgICBvcHRpb25hbFNwZWNpbWVuLmxlbmd0aCxcbiAgICAgICk7XG4gICAgICBsZXQgYXJnTnVtID0gMDtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIChyZXF1aXJlZFNwZWNpbWVuLmxlbmd0aCA9PT0gcmVxdWlyZWRQYXR0Lmxlbmd0aCB8fFxuICAgICAgICAgIGNoZWNrKFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBYYEV4cGVjdGVkIGF0IGxlYXN0ICR7cShcbiAgICAgICAgICAgICAgcmVxdWlyZWRQYXR0Lmxlbmd0aCxcbiAgICAgICAgICAgICl9IGFyZ3VtZW50czogJHtzcGVjaW1lbn1gLFxuICAgICAgICAgICkpICYmXG4gICAgICAgIHJlcXVpcmVkUGF0dC5ldmVyeSgocCwgaSkgPT5cbiAgICAgICAgICAvL1xuICAgICAgICAgIGNoZWNrTWF0Y2hlcyhyZXF1aXJlZFNwZWNpbWVuW2ldLCBwLCBjaGVjaywgYGFyZyAke2FyZ051bSsrfWApLFxuICAgICAgICApICYmXG4gICAgICAgIHBhcnRpYWxQYXR0LmV2ZXJ5KChwLCBpKSA9PlxuICAgICAgICAgIC8vXG4gICAgICAgICAgY2hlY2tNYXRjaGVzKG9wdGlvbmFsU3BlY2ltZW5baV0sIHAsIGNoZWNrLCBgYXJnICR7YXJnTnVtKyt9P2ApLFxuICAgICAgICApICYmXG4gICAgICAgIGNoZWNrTWF0Y2hlcyhyZXN0U3BlY2ltZW4sIHJlc3RQYXR0LCBjaGVjaywgJy4uLnJlc3QnKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgLypcblxuXG4gICAgICovXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChzcGxpdEFycmF5LCBjaGVjaykgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICBwYXNzU3R5bGVPZihzcGxpdEFycmF5KSA9PT0gJ2NvcHlBcnJheScgJiZcbiAgICAgICAgKHNwbGl0QXJyYXkubGVuZ3RoID49IDEgfHwgc3BsaXRBcnJheS5sZW5ndGggPD0gMylcbiAgICAgICkge1xuICAgICAgICBjb25zdCBbcmVxdWlyZWRQYXR0LCBvcHRpb25hbFBhdHQgPSB1bmRlZmluZWQsIHJlc3RQYXR0ID0gdW5kZWZpbmVkXSA9XG4gICAgICAgICAgc3BsaXRBcnJheTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgIGlzUGF0dGVybihyZXF1aXJlZFBhdHQpICYmXG4gICAgICAgICAgcGFzc1N0eWxlT2YocmVxdWlyZWRQYXR0KSA9PT0gJ2NvcHlBcnJheScgJiZcbiAgICAgICAgICAob3B0aW9uYWxQYXR0ID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIChpc1BhdHRlcm4ob3B0aW9uYWxQYXR0KSAmJlxuICAgICAgICAgICAgICBwYXNzU3R5bGVPZihvcHRpb25hbFBhdHQpID09PSAnY29weUFycmF5JykpICYmXG4gICAgICAgICAgKHJlc3RQYXR0ID09PSB1bmRlZmluZWQgfHwgaXNQYXR0ZXJuKHJlc3RQYXR0KSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIFhgTXVzdCBiZSBhbiBhcnJheSBvZiBhIHJlcXVpcmVkUGF0dCBhcnJheSwgYW4gb3B0aW9uYWwgb3B0aW9uYWxQYXR0IGFycmF5LCBhbmQgYW4gb3B0aW9uYWwgcmVzdFBhdHQ6ICR7cShcbiAgICAgICAgICBzcGxpdEFycmF5LFxuICAgICAgICApfWAsXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBnZXRSYW5rQ292ZXI6IChbXG4gICAgICBfcmVxdWlyZWRQYXR0LFxuICAgICAgX29wdGlvbmFsUGF0dCA9IHVuZGVmaW5lZCxcbiAgICAgIF9yZXN0UGF0dCA9IHVuZGVmaW5lZCxcbiAgICBdKSA9PiBnZXRQYXNzU3R5bGVDb3ZlcignY29weUFycmF5JyksXG4gIH0pO1xuXG4gIC8qXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3Qgc3BsaXRSZWNvcmRQYXJ0cyA9IChzcGVjaW1lbiwgcmVxdWlyZWRQYXR0LCBvcHRpb25hbFBhdHQpID0+IHtcbiAgICAvL1xuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgcmVxdWlyZWRFbnRyaWVzID0gW107XG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCBvcHRpb25hbEVudHJpZXMgPSBbXTtcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGNvbnN0IHJlc3RFbnRyaWVzID0gW107XG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIGVudHJpZXMoc3BlY2ltZW4pKSB7XG4gICAgICBpZiAoaGFzT3duUHJvcGVydHlPZihyZXF1aXJlZFBhdHQsIG5hbWUpKSB7XG4gICAgICAgIHJlcXVpcmVkRW50cmllcy5wdXNoKFtuYW1lLCB2YWx1ZV0pO1xuICAgICAgfSBlbHNlIGlmIChoYXNPd25Qcm9wZXJ0eU9mKG9wdGlvbmFsUGF0dCwgbmFtZSkpIHtcbiAgICAgICAgb3B0aW9uYWxFbnRyaWVzLnB1c2goW25hbWUsIHZhbHVlXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN0RW50cmllcy5wdXNoKFtuYW1lLCB2YWx1ZV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgIHJlcXVpcmVkU3BlY2ltZW46IGZyb21VbmlxdWVFbnRyaWVzKHJlcXVpcmVkRW50cmllcyksXG4gICAgICBvcHRpb25hbFNwZWNpbWVuOiBmcm9tVW5pcXVlRW50cmllcyhvcHRpb25hbEVudHJpZXMpLFxuICAgICAgcmVzdFNwZWNpbWVuOiBmcm9tVW5pcXVlRW50cmllcyhyZXN0RW50cmllcyksXG4gICAgfSk7XG4gIH07XG5cbiAgLypcblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgYWRhcHRSZWNvcmRQYXR0ZXJuID0gKG9wdGlvbmFsUGF0dCwgbmFtZXMpID0+XG4gICAgZnJvbVVuaXF1ZUVudHJpZXMobmFtZXMubWFwKG5hbWUgPT4gW25hbWUsIE1NLm9wdChvcHRpb25hbFBhdHRbbmFtZV0pXSkpO1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IG1hdGNoU3BsaXRSZWNvcmRIZWxwZXIgPSBGYXIoJ21hdGNoOnNwbGl0UmVjb3JkIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChcbiAgICAgIHNwZWNpbWVuLFxuICAgICAgW3JlcXVpcmVkUGF0dCwgb3B0aW9uYWxQYXR0ID0ge30sIHJlc3RQYXR0ID0gTU0uYW55KCldLFxuICAgICAgY2hlY2ssXG4gICAgKSA9PiB7XG4gICAgICBpZiAoIWNoZWNrS2luZChzcGVjaW1lbiwgJ2NvcHlSZWNvcmQnLCBjaGVjaykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3QgeyByZXF1aXJlZFNwZWNpbWVuLCBvcHRpb25hbFNwZWNpbWVuLCByZXN0U3BlY2ltZW4gfSA9XG4gICAgICAgIHNwbGl0UmVjb3JkUGFydHMoc3BlY2ltZW4sIHJlcXVpcmVkUGF0dCwgb3B0aW9uYWxQYXR0KTtcblxuICAgICAgY29uc3QgcGFydGlhbE5hbWVzID0gLyogICAgICAgICAgICAgICAgICAgKi8gKG93bktleXMob3B0aW9uYWxTcGVjaW1lbikpO1xuICAgICAgY29uc3QgcGFydGlhbFBhdHQgPSBhZGFwdFJlY29yZFBhdHRlcm4ob3B0aW9uYWxQYXR0LCBwYXJ0aWFsTmFtZXMpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2tNYXRjaGVzKHJlcXVpcmVkU3BlY2ltZW4sIHJlcXVpcmVkUGF0dCwgY2hlY2spICYmXG4gICAgICAgIHBhcnRpYWxOYW1lcy5ldmVyeShuYW1lID0+XG4gICAgICAgICAgY2hlY2tNYXRjaGVzKFxuICAgICAgICAgICAgb3B0aW9uYWxTcGVjaW1lbltuYW1lXSxcbiAgICAgICAgICAgIHBhcnRpYWxQYXR0W25hbWVdLFxuICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgICBgJHtuYW1lfT9gLFxuICAgICAgICAgICksXG4gICAgICAgICkgJiZcbiAgICAgICAgY2hlY2tNYXRjaGVzKHJlc3RTcGVjaW1lbiwgcmVzdFBhdHQsIGNoZWNrLCAnLi4ucmVzdCcpXG4gICAgICApO1xuICAgIH0sXG5cbiAgICAvKlxuXG5cbiAgICAgKi9cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHNwbGl0QXJyYXksIGNoZWNrKSA9PiB7XG4gICAgICBpZiAoXG4gICAgICAgIHBhc3NTdHlsZU9mKHNwbGl0QXJyYXkpID09PSAnY29weUFycmF5JyAmJlxuICAgICAgICAoc3BsaXRBcnJheS5sZW5ndGggPj0gMSB8fCBzcGxpdEFycmF5Lmxlbmd0aCA8PSAzKVxuICAgICAgKSB7XG4gICAgICAgIGNvbnN0IFtyZXF1aXJlZFBhdHQsIG9wdGlvbmFsUGF0dCA9IHVuZGVmaW5lZCwgcmVzdFBhdHQgPSB1bmRlZmluZWRdID1cbiAgICAgICAgICBzcGxpdEFycmF5O1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaXNQYXR0ZXJuKHJlcXVpcmVkUGF0dCkgJiZcbiAgICAgICAgICBwYXNzU3R5bGVPZihyZXF1aXJlZFBhdHQpID09PSAnY29weVJlY29yZCcgJiZcbiAgICAgICAgICAob3B0aW9uYWxQYXR0ID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIChpc1BhdHRlcm4ob3B0aW9uYWxQYXR0KSAmJlxuICAgICAgICAgICAgICBwYXNzU3R5bGVPZihvcHRpb25hbFBhdHQpID09PSAnY29weVJlY29yZCcpKSAmJlxuICAgICAgICAgIChyZXN0UGF0dCA9PT0gdW5kZWZpbmVkIHx8IGlzUGF0dGVybihyZXN0UGF0dCkpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBYYE11c3QgYmUgYW4gYXJyYXkgb2YgYSByZXF1aXJlZFBhdHQgcmVjb3JkLCBhbiBvcHRpb25hbCBvcHRpb25hbFBhdHQgcmVjb3JkLCBhbmQgYW4gb3B0aW9uYWwgcmVzdFBhdHQ6ICR7cShcbiAgICAgICAgICBzcGxpdEFycmF5LFxuICAgICAgICApfWAsXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBnZXRSYW5rQ292ZXI6IChbXG4gICAgICByZXF1aXJlZFBhdHQsXG4gICAgICBfb3B0aW9uYWxQYXR0ID0gdW5kZWZpbmVkLFxuICAgICAgX3Jlc3RQYXR0ID0gdW5kZWZpbmVkLFxuICAgIF0pID0+IGdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZU9mKHJlcXVpcmVkUGF0dCkpLFxuICB9KTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgSGVscGVyc0J5TWF0Y2hUYWcgPSBoYXJkZW4oe1xuICAgICdtYXRjaDphbnknOiBtYXRjaEFueUhlbHBlcixcbiAgICAnbWF0Y2g6YW5kJzogbWF0Y2hBbmRIZWxwZXIsXG4gICAgJ21hdGNoOm9yJzogbWF0Y2hPckhlbHBlcixcbiAgICAnbWF0Y2g6bm90JzogbWF0Y2hOb3RIZWxwZXIsXG5cbiAgICAnbWF0Y2g6c2NhbGFyJzogbWF0Y2hTY2FsYXJIZWxwZXIsXG4gICAgJ21hdGNoOmtleSc6IG1hdGNoS2V5SGVscGVyLFxuICAgICdtYXRjaDpwYXR0ZXJuJzogbWF0Y2hQYXR0ZXJuSGVscGVyLFxuICAgICdtYXRjaDpraW5kJzogbWF0Y2hLaW5kSGVscGVyLFxuICAgICdtYXRjaDp0YWdnZWQnOiBtYXRjaFRhZ2dlZEhlbHBlcixcbiAgICAnbWF0Y2g6YmlnaW50JzogbWF0Y2hCaWdpbnRIZWxwZXIsXG4gICAgJ21hdGNoOm5hdCc6IG1hdGNoTmF0SGVscGVyLFxuICAgICdtYXRjaDpzdHJpbmcnOiBtYXRjaFN0cmluZ0hlbHBlcixcbiAgICAnbWF0Y2g6c3ltYm9sJzogbWF0Y2hTeW1ib2xIZWxwZXIsXG4gICAgJ21hdGNoOnJlbW90YWJsZSc6IG1hdGNoUmVtb3RhYmxlSGVscGVyLFxuXG4gICAgJ21hdGNoOmx0JzogbWF0Y2hMVEhlbHBlcixcbiAgICAnbWF0Y2g6bHRlJzogbWF0Y2hMVEVIZWxwZXIsXG4gICAgJ21hdGNoOmd0ZSc6IG1hdGNoR1RFSGVscGVyLFxuICAgICdtYXRjaDpndCc6IG1hdGNoR1RIZWxwZXIsXG5cbiAgICAnbWF0Y2g6YXJyYXlPZic6IG1hdGNoQXJyYXlPZkhlbHBlcixcbiAgICAnbWF0Y2g6cmVjb3JkT2YnOiBtYXRjaFJlY29yZE9mSGVscGVyLFxuICAgICdtYXRjaDpzZXRPZic6IG1hdGNoU2V0T2ZIZWxwZXIsXG4gICAgJ21hdGNoOmJhZ09mJzogbWF0Y2hCYWdPZkhlbHBlcixcbiAgICAnbWF0Y2g6Y29udGFpbmVySGFzJzogbWF0Y2hDb250YWluZXJIYXNIZWxwZXIsXG4gICAgJ21hdGNoOm1hcE9mJzogbWF0Y2hNYXBPZkhlbHBlcixcbiAgICAnbWF0Y2g6c3BsaXRBcnJheSc6IG1hdGNoU3BsaXRBcnJheUhlbHBlcixcbiAgICAnbWF0Y2g6c3BsaXRSZWNvcmQnOiBtYXRjaFNwbGl0UmVjb3JkSGVscGVyLFxuICB9KTtcblxuICBjb25zdCBtYWtlTWF0Y2hlciA9ICh0YWcsIHBheWxvYWQpID0+IHtcbiAgICBjb25zdCBtYXRjaGVyID0gbWFrZVRhZ2dlZCh0YWcsIHBheWxvYWQpO1xuICAgIGFzc2VydFBhdHRlcm4obWF0Y2hlcik7XG4gICAgcmV0dXJuIG1hdGNoZXI7XG4gIH07XG5cbiAgY29uc3QgbWFrZUtpbmRNYXRjaGVyID0ga2luZCA9PiBtYWtlTWF0Y2hlcignbWF0Y2g6a2luZCcsIGtpbmQpO1xuXG4gIGNvbnN0IEFueVNoYXBlID0gbWFrZU1hdGNoZXIoJ21hdGNoOmFueScsIHVuZGVmaW5lZCk7XG4gIGNvbnN0IFNjYWxhclNoYXBlID0gbWFrZU1hdGNoZXIoJ21hdGNoOnNjYWxhcicsIHVuZGVmaW5lZCk7XG4gIGNvbnN0IEtleVNoYXBlID0gbWFrZU1hdGNoZXIoJ21hdGNoOmtleScsIHVuZGVmaW5lZCk7XG4gIGNvbnN0IFBhdHRlcm5TaGFwZSA9IG1ha2VNYXRjaGVyKCdtYXRjaDpwYXR0ZXJuJywgdW5kZWZpbmVkKTtcbiAgY29uc3QgQm9vbGVhblNoYXBlID0gbWFrZUtpbmRNYXRjaGVyKCdib29sZWFuJyk7XG4gIGNvbnN0IE51bWJlclNoYXBlID0gbWFrZUtpbmRNYXRjaGVyKCdudW1iZXInKTtcbiAgY29uc3QgQmlnSW50U2hhcGUgPSBtYWtlVGFnZ2VkKCdtYXRjaDpiaWdpbnQnLCBbXSk7XG4gIGNvbnN0IE5hdFNoYXBlID0gbWFrZVRhZ2dlZCgnbWF0Y2g6bmF0JywgW10pO1xuICBjb25zdCBTdHJpbmdTaGFwZSA9IG1ha2VUYWdnZWQoJ21hdGNoOnN0cmluZycsIFtdKTtcbiAgY29uc3QgU3ltYm9sU2hhcGUgPSBtYWtlVGFnZ2VkKCdtYXRjaDpzeW1ib2wnLCBbXSk7XG4gIGNvbnN0IFJlY29yZFNoYXBlID0gbWFrZVRhZ2dlZCgnbWF0Y2g6cmVjb3JkT2YnLCBbQW55U2hhcGUsIEFueVNoYXBlXSk7XG4gIGNvbnN0IEFycmF5U2hhcGUgPSBtYWtlVGFnZ2VkKCdtYXRjaDphcnJheU9mJywgW0FueVNoYXBlXSk7XG4gIGNvbnN0IFNldFNoYXBlID0gbWFrZVRhZ2dlZCgnbWF0Y2g6c2V0T2YnLCBbQW55U2hhcGVdKTtcbiAgY29uc3QgQmFnU2hhcGUgPSBtYWtlVGFnZ2VkKCdtYXRjaDpiYWdPZicsIFtBbnlTaGFwZSwgQW55U2hhcGVdKTtcbiAgY29uc3QgTWFwU2hhcGUgPSBtYWtlVGFnZ2VkKCdtYXRjaDptYXBPZicsIFtBbnlTaGFwZSwgQW55U2hhcGVdKTtcbiAgY29uc3QgUmVtb3RhYmxlU2hhcGUgPSBtYWtlS2luZE1hdGNoZXIoJ3JlbW90YWJsZScpO1xuICBjb25zdCBFcnJvclNoYXBlID0gbWFrZUtpbmRNYXRjaGVyKCdlcnJvcicpO1xuICBjb25zdCBQcm9taXNlU2hhcGUgPSBtYWtlS2luZE1hdGNoZXIoJ3Byb21pc2UnKTtcbiAgY29uc3QgVW5kZWZpbmVkU2hhcGUgPSBtYWtlS2luZE1hdGNoZXIoJ3VuZGVmaW5lZCcpO1xuXG4gIC8qXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBtYWtlTGltaXRzTWF0Y2hlciA9ICh0YWcsIHBheWxvYWQpID0+IHtcbiAgICBpZiAocGF5bG9hZFtwYXlsb2FkLmxlbmd0aCAtIDFdID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHBheWxvYWQgPSBoYXJkZW4ocGF5bG9hZC5zbGljZSgwLCBwYXlsb2FkLmxlbmd0aCAtIDEpKTtcbiAgICB9XG4gICAgcmV0dXJuIG1ha2VNYXRjaGVyKHRhZywgcGF5bG9hZCk7XG4gIH07XG5cbiAgY29uc3QgbWFrZVJlbW90YWJsZU1hdGNoZXIgPSAobGFiZWwgPSB1bmRlZmluZWQpID0+XG4gICAgbGFiZWwgPT09IHVuZGVmaW5lZFxuICAgICAgPyBSZW1vdGFibGVTaGFwZVxuICAgICAgOiBtYWtlTWF0Y2hlcignbWF0Y2g6cmVtb3RhYmxlJywgaGFyZGVuKHsgbGFiZWwgfSkpO1xuXG4gIC8qXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBtYWtlU3BsaXRQYXlsb2FkID0gKFxuICAgIGVtcHR5LFxuICAgIGJhc2UsXG4gICAgb3B0aW9uYWwgPSB1bmRlZmluZWQsXG4gICAgcmVzdCA9IHVuZGVmaW5lZCxcbiAgKSA9PiB7XG4gICAgaWYgKHJlc3QpIHtcbiAgICAgIHJldHVybiBbYmFzZSwgb3B0aW9uYWwgfHwgZW1wdHksIHJlc3RdO1xuICAgIH1cbiAgICBpZiAob3B0aW9uYWwpIHtcbiAgICAgIHJldHVybiBbYmFzZSwgb3B0aW9uYWxdO1xuICAgIH1cbiAgICByZXR1cm4gW2Jhc2VdO1xuICB9O1xuXG4gIC8vXG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBNID0gaGFyZGVuKHtcbiAgICBhbnk6ICgpID0+IEFueVNoYXBlLFxuICAgIGFuZDogKC4uLnBhdHRzKSA9PiBtYWtlTWF0Y2hlcignbWF0Y2g6YW5kJywgcGF0dHMpLFxuICAgIG9yOiAoLi4ucGF0dHMpID0+IG1ha2VNYXRjaGVyKCdtYXRjaDpvcicsIHBhdHRzKSxcbiAgICBub3Q6IHN1YlBhdHQgPT4gbWFrZU1hdGNoZXIoJ21hdGNoOm5vdCcsIHN1YlBhdHQpLFxuXG4gICAgc2NhbGFyOiAoKSA9PiBTY2FsYXJTaGFwZSxcbiAgICBrZXk6ICgpID0+IEtleVNoYXBlLFxuICAgIHBhdHRlcm46ICgpID0+IFBhdHRlcm5TaGFwZSxcbiAgICBraW5kOiBtYWtlS2luZE1hdGNoZXIsXG4gICAgdGFnZ2VkOiAodGFnUGF0dCA9IE0uc3RyaW5nKCksIHBheWxvYWRQYXR0ID0gTS5hbnkoKSkgPT5cbiAgICAgIG1ha2VNYXRjaGVyKCdtYXRjaDp0YWdnZWQnLCBoYXJkZW4oW3RhZ1BhdHQsIHBheWxvYWRQYXR0XSkpLFxuICAgIGJvb2xlYW46ICgpID0+IEJvb2xlYW5TaGFwZSxcbiAgICBudW1iZXI6ICgpID0+IE51bWJlclNoYXBlLFxuICAgIGJpZ2ludDogKGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIGxpbWl0cyA/IG1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpiaWdpbnQnLCBbbGltaXRzXSkgOiBCaWdJbnRTaGFwZSxcbiAgICBuYXQ6IChsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBsaW1pdHMgPyBtYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6bmF0JywgW2xpbWl0c10pIDogTmF0U2hhcGUsXG4gICAgc3RyaW5nOiAobGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbGltaXRzID8gbWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOnN0cmluZycsIFtsaW1pdHNdKSA6IFN0cmluZ1NoYXBlLFxuICAgIHN5bWJvbDogKGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIGxpbWl0cyA/IG1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpzeW1ib2wnLCBbbGltaXRzXSkgOiBTeW1ib2xTaGFwZSxcbiAgICByZWNvcmQ6IChsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBsaW1pdHMgPyBNLnJlY29yZE9mKE0uYW55KCksIE0uYW55KCksIGxpbWl0cykgOiBSZWNvcmRTaGFwZSxcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGFycmF5OiAobGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbGltaXRzID8gTS5hcnJheU9mKE0uYW55KCksIGxpbWl0cykgOiBBcnJheVNoYXBlLFxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIHNldDogKGxpbWl0cyA9IHVuZGVmaW5lZCkgPT4gKGxpbWl0cyA/IE0uc2V0T2YoTS5hbnkoKSwgbGltaXRzKSA6IFNldFNoYXBlKSxcbiAgICBiYWc6IChsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBsaW1pdHMgPyBNLmJhZ09mKE0uYW55KCksIE0uYW55KCksIGxpbWl0cykgOiBCYWdTaGFwZSxcbiAgICBtYXA6IChsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBsaW1pdHMgPyBNLm1hcE9mKE0uYW55KCksIE0uYW55KCksIGxpbWl0cykgOiBNYXBTaGFwZSxcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIHJlbW90YWJsZTogbWFrZVJlbW90YWJsZU1hdGNoZXIsXG4gICAgZXJyb3I6ICgpID0+IEVycm9yU2hhcGUsXG4gICAgcHJvbWlzZTogKCkgPT4gUHJvbWlzZVNoYXBlLFxuICAgIHVuZGVmaW5lZDogKCkgPT4gVW5kZWZpbmVkU2hhcGUsXG4gICAgbnVsbDogKCkgPT4gbnVsbCxcblxuICAgIGx0OiByaWdodE9wZXJhbmQgPT4gbWFrZU1hdGNoZXIoJ21hdGNoOmx0JywgcmlnaHRPcGVyYW5kKSxcbiAgICBsdGU6IHJpZ2h0T3BlcmFuZCA9PiBtYWtlTWF0Y2hlcignbWF0Y2g6bHRlJywgcmlnaHRPcGVyYW5kKSxcbiAgICBlcToga2V5ID0+IHtcbiAgICAgIGFzc2VydEtleShrZXkpO1xuICAgICAgcmV0dXJuIGtleSA9PT0gdW5kZWZpbmVkID8gTS51bmRlZmluZWQoKSA6IGtleTtcbiAgICB9LFxuICAgIG5lcToga2V5ID0+IE0ubm90KE0uZXEoa2V5KSksXG4gICAgZ3RlOiByaWdodE9wZXJhbmQgPT4gbWFrZU1hdGNoZXIoJ21hdGNoOmd0ZScsIHJpZ2h0T3BlcmFuZCksXG4gICAgZ3Q6IHJpZ2h0T3BlcmFuZCA9PiBtYWtlTWF0Y2hlcignbWF0Y2g6Z3QnLCByaWdodE9wZXJhbmQpLFxuXG4gICAgcmVjb3JkT2Y6IChrZXlQYXR0ID0gTS5hbnkoKSwgdmFsdWVQYXR0ID0gTS5hbnkoKSwgbGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOnJlY29yZE9mJywgW2tleVBhdHQsIHZhbHVlUGF0dCwgbGltaXRzXSksXG4gICAgYXJyYXlPZjogKHN1YlBhdHQgPSBNLmFueSgpLCBsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBtYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6YXJyYXlPZicsIFtzdWJQYXR0LCBsaW1pdHNdKSxcbiAgICBzZXRPZjogKGtleVBhdHQgPSBNLmFueSgpLCBsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBtYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6c2V0T2YnLCBba2V5UGF0dCwgbGltaXRzXSksXG4gICAgYmFnT2Y6IChrZXlQYXR0ID0gTS5hbnkoKSwgY291bnRQYXR0ID0gTS5hbnkoKSwgbGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOmJhZ09mJywgW2tleVBhdHQsIGNvdW50UGF0dCwgbGltaXRzXSksXG4gICAgY29udGFpbmVySGFzOiAoZWxlbWVudFBhdHQgPSBNLmFueSgpLCBjb3VudFBhdHQgPSAxbiwgbGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOmNvbnRhaW5lckhhcycsIFtlbGVtZW50UGF0dCwgY291bnRQYXR0LCBsaW1pdHNdKSxcbiAgICBtYXBPZjogKGtleVBhdHQgPSBNLmFueSgpLCB2YWx1ZVBhdHQgPSBNLmFueSgpLCBsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBtYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6bWFwT2YnLCBba2V5UGF0dCwgdmFsdWVQYXR0LCBsaW1pdHNdKSxcbiAgICBzcGxpdEFycmF5OiAoYmFzZSwgb3B0aW9uYWwgPSB1bmRlZmluZWQsIHJlc3QgPSB1bmRlZmluZWQpID0+XG4gICAgICBtYWtlTWF0Y2hlcihcbiAgICAgICAgJ21hdGNoOnNwbGl0QXJyYXknLFxuICAgICAgICBtYWtlU3BsaXRQYXlsb2FkKFtdLCBiYXNlLCBvcHRpb25hbCwgcmVzdCksXG4gICAgICApLFxuICAgIHNwbGl0UmVjb3JkOiAoYmFzZSwgb3B0aW9uYWwgPSB1bmRlZmluZWQsIHJlc3QgPSB1bmRlZmluZWQpID0+XG4gICAgICBtYWtlTWF0Y2hlcihcbiAgICAgICAgJ21hdGNoOnNwbGl0UmVjb3JkJyxcbiAgICAgICAgbWFrZVNwbGl0UGF5bG9hZCh7fSwgYmFzZSwgb3B0aW9uYWwsIHJlc3QpLFxuICAgICAgKSxcbiAgICBzcGxpdDogKGJhc2UsIHJlc3QgPSB1bmRlZmluZWQpID0+IHtcbiAgICAgIGlmIChwYXNzU3R5bGVPZihoYXJkZW4oYmFzZSkpID09PSAnY29weUFycmF5Jykge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gTS5zcGxpdEFycmF5KGJhc2UsIHJlc3QgJiYgW10sIHJlc3QpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIE0uc3BsaXRSZWNvcmQoYmFzZSwgcmVzdCAmJiB7fSwgcmVzdCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBwYXJ0aWFsOiAoYmFzZSwgcmVzdCA9IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgaWYgKHBhc3NTdHlsZU9mKGhhcmRlbihiYXNlKSkgPT09ICdjb3B5QXJyYXknKSB7XG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIHJldHVybiBNLnNwbGl0QXJyYXkoW10sIGJhc2UsIHJlc3QpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIE0uc3BsaXRSZWNvcmQoe30sIGJhc2UsIHJlc3QpO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBlcmVmOiB0ID0+IE0ub3IodCwgTS5wcm9taXNlKCkpLFxuICAgIG9wdDogdCA9PiBNLm9yKE0udW5kZWZpbmVkKCksIHQpLFxuXG4gICAgaW50ZXJmYWNlOiAoaW50ZXJmYWNlTmFtZSwgbWV0aG9kR3VhcmRzLCBvcHRpb25zKSA9PlxuICAgICAgLy9cbiAgICAgIG1ha2VJbnRlcmZhY2VHdWFyZChpbnRlcmZhY2VOYW1lLCBtZXRob2RHdWFyZHMsIG9wdGlvbnMpLFxuICAgIGNhbGw6ICguLi5hcmdQYXR0ZXJucykgPT5cbiAgICAgIC8vXG4gICAgICBtYWtlTWV0aG9kR3VhcmRNYWtlcignc3luYycsIGFyZ1BhdHRlcm5zKSxcbiAgICBjYWxsV2hlbjogKC4uLmFyZ0d1YXJkcykgPT5cbiAgICAgIC8vXG4gICAgICBtYWtlTWV0aG9kR3VhcmRNYWtlcignYXN5bmMnLCBhcmdHdWFyZHMpLFxuXG4gICAgYXdhaXQ6IGFyZ1BhdHRlcm4gPT5cbiAgICAgIC8vXG4gICAgICBtYWtlQXdhaXRBcmdHdWFyZChhcmdQYXR0ZXJuKSxcbiAgICByYXc6ICgpID0+XG4gICAgICAvL1xuICAgICAgbWFrZVJhd0d1YXJkKCksXG4gIH0pO1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGNoZWNrTWF0Y2hlcyxcbiAgICBtYXRjaGVzLFxuICAgIG11c3RNYXRjaCxcbiAgICBhc3NlcnRQYXR0ZXJuLFxuICAgIGlzUGF0dGVybixcbiAgICBnZXRSYW5rQ292ZXIsXG4gICAgTSxcbiAgICBraW5kT2YsXG4gICAgY29udGFpbmVySGFzU3BsaXQsXG4gIH0pO1xufTtcblxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuICAgICAgIGNvbnN0IHtcbiAgY2hlY2tNYXRjaGVzLFxuICBtYXRjaGVzLFxuICBtdXN0TWF0Y2gsXG4gIGFzc2VydFBhdHRlcm4sXG4gIGlzUGF0dGVybixcbiAgZ2V0UmFua0NvdmVyLFxuICBNLFxuICBraW5kT2YsXG4gIGNvbnRhaW5lckhhc1NwbGl0LFxufSA9IG1ha2VQYXR0ZXJuS2l0KCk7JGjNj19vbmNlLmNoZWNrTWF0Y2hlcyhjaGVja01hdGNoZXMpOyRozY9fb25jZS5tYXRjaGVzKG1hdGNoZXMpOyRozY9fb25jZS5tdXN0TWF0Y2gobXVzdE1hdGNoKTskaM2PX29uY2UuYXNzZXJ0UGF0dGVybihhc3NlcnRQYXR0ZXJuKTskaM2PX29uY2UuaXNQYXR0ZXJuKGlzUGF0dGVybik7JGjNj19vbmNlLmdldFJhbmtDb3ZlcihnZXRSYW5rQ292ZXIpOyRozY9fb25jZS5NKE0pOyRozY9fb25jZS5raW5kT2Yoa2luZE9mKTskaM2PX29uY2UuY29udGFpbmVySGFzU3BsaXQoY29udGFpbmVySGFzU3BsaXQpO1xuXG5NTSA9IE07XG5cbi8vXG5cbi8vXG5jb25zdCBBd2FpdEFyZ0d1YXJkUGF5bG9hZFNoYXBlID0gaGFyZGVuKHtcbiAgYXJnR3VhcmQ6IE0ucGF0dGVybigpLFxufSk7XG5cbiAgICAgICBjb25zdCBBd2FpdEFyZ0d1YXJkU2hhcGUgPSBNLmtpbmQoJ2d1YXJkOmF3YWl0QXJnR3VhcmQnKTtcblxuLypcblxuXG4gKi8kaM2PX29uY2UuQXdhaXRBcmdHdWFyZFNoYXBlKEF3YWl0QXJnR3VhcmRTaGFwZSk7XG4gICAgICAgY29uc3QgaXNBd2FpdEFyZ0d1YXJkID0gc3BlY2ltZW4gPT5cbiAgbWF0Y2hlcyhzcGVjaW1lbiwgQXdhaXRBcmdHdWFyZFNoYXBlKTskaM2PX29uY2UuaXNBd2FpdEFyZ0d1YXJkKGlzQXdhaXRBcmdHdWFyZCk7XG5oYXJkZW4oaXNBd2FpdEFyZ0d1YXJkKTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRBd2FpdEFyZ0d1YXJkID0gc3BlY2ltZW4gPT4ge1xuICBtdXN0TWF0Y2goc3BlY2ltZW4sIEF3YWl0QXJnR3VhcmRTaGFwZSwgJ2F3YWl0QXJnR3VhcmQnKTtcbn07JGjNj19vbmNlLmFzc2VydEF3YWl0QXJnR3VhcmQoYXNzZXJ0QXdhaXRBcmdHdWFyZCk7XG5oYXJkZW4oYXNzZXJ0QXdhaXRBcmdHdWFyZCk7XG5cbi8qXG5cblxuICovXG5jb25zdCBtYWtlQXdhaXRBcmdHdWFyZCA9IGFyZ1BhdHRlcm4gPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHJlc3VsdCA9IG1ha2VUYWdnZWQoJ2d1YXJkOmF3YWl0QXJnR3VhcmQnLCB7XG4gICAgYXJnR3VhcmQ6IGFyZ1BhdHRlcm4sXG4gIH0pO1xuICBhc3NlcnRBd2FpdEFyZ0d1YXJkKHJlc3VsdCk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vL1xuXG5jb25zdCBSYXdHdWFyZFBheWxvYWRTaGFwZSA9IE0ucmVjb3JkKCk7XG5cbiAgICAgICBjb25zdCBSYXdHdWFyZFNoYXBlID0gTS5raW5kKCdndWFyZDpyYXdHdWFyZCcpOyRozY9fb25jZS5SYXdHdWFyZFNoYXBlKFJhd0d1YXJkU2hhcGUpO1xuXG4gICAgICAgY29uc3QgaXNSYXdHdWFyZCA9IHNwZWNpbWVuID0+IG1hdGNoZXMoc3BlY2ltZW4sIFJhd0d1YXJkU2hhcGUpOyRozY9fb25jZS5pc1Jhd0d1YXJkKGlzUmF3R3VhcmQpO1xuXG4gICAgICAgY29uc3QgYXNzZXJ0UmF3R3VhcmQgPSBzcGVjaW1lbiA9PlxuICBtdXN0TWF0Y2goc3BlY2ltZW4sIFJhd0d1YXJkU2hhcGUsICdyYXdHdWFyZCcpO1xuXG4vKlxuXG4gKi8kaM2PX29uY2UuYXNzZXJ0UmF3R3VhcmQoYXNzZXJ0UmF3R3VhcmQpO1xuY29uc3QgbWFrZVJhd0d1YXJkID0gKCkgPT4gbWFrZVRhZ2dlZCgnZ3VhcmQ6cmF3R3VhcmQnLCB7fSk7XG5cbi8vXG4vL1xuXG4gICAgICAgY29uc3QgU3luY1ZhbHVlR3VhcmRTaGFwZSA9IE0ub3IoUmF3R3VhcmRTaGFwZSwgTS5wYXR0ZXJuKCkpOyRozY9fb25jZS5TeW5jVmFsdWVHdWFyZFNoYXBlKFN5bmNWYWx1ZUd1YXJkU2hhcGUpO1xuXG4gICAgICAgY29uc3QgU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUgPSBNLmFycmF5T2YoU3luY1ZhbHVlR3VhcmRTaGFwZSk7JGjNj19vbmNlLlN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlKFN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlKTtcblxuY29uc3QgQXJnR3VhcmRTaGFwZSA9IE0ub3IoUmF3R3VhcmRTaGFwZSwgQXdhaXRBcmdHdWFyZFNoYXBlLCBNLnBhdHRlcm4oKSk7XG4gICAgICAgY29uc3QgQXJnR3VhcmRMaXN0U2hhcGUgPSBNLmFycmF5T2YoQXJnR3VhcmRTaGFwZSk7JGjNj19vbmNlLkFyZ0d1YXJkTGlzdFNoYXBlKEFyZ0d1YXJkTGlzdFNoYXBlKTtcblxuY29uc3QgU3luY01ldGhvZEd1YXJkUGF5bG9hZFNoYXBlID0gaGFyZGVuKHtcbiAgY2FsbEtpbmQ6ICdzeW5jJyxcbiAgYXJnR3VhcmRzOiBTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSxcbiAgb3B0aW9uYWxBcmdHdWFyZHM6IE0ub3B0KFN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlKSxcbiAgcmVzdEFyZ0d1YXJkOiBNLm9wdChTeW5jVmFsdWVHdWFyZFNoYXBlKSxcbiAgcmV0dXJuR3VhcmQ6IFN5bmNWYWx1ZUd1YXJkU2hhcGUsXG59KTtcblxuY29uc3QgQXN5bmNNZXRob2RHdWFyZFBheWxvYWRTaGFwZSA9IGhhcmRlbih7XG4gIGNhbGxLaW5kOiAnYXN5bmMnLFxuICBhcmdHdWFyZHM6IEFyZ0d1YXJkTGlzdFNoYXBlLFxuICBvcHRpb25hbEFyZ0d1YXJkczogTS5vcHQoQXJnR3VhcmRMaXN0U2hhcGUpLFxuICByZXN0QXJnR3VhcmQ6IE0ub3B0KFN5bmNWYWx1ZUd1YXJkU2hhcGUpLFxuICByZXR1cm5HdWFyZDogU3luY1ZhbHVlR3VhcmRTaGFwZSxcbn0pO1xuXG4gICAgICAgY29uc3QgTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUgPSBNLm9yKFxuICBTeW5jTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUsXG4gIEFzeW5jTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUsXG4pOyRozY9fb25jZS5NZXRob2RHdWFyZFBheWxvYWRTaGFwZShNZXRob2RHdWFyZFBheWxvYWRTaGFwZSk7XG5cbiAgICAgICBjb25zdCBNZXRob2RHdWFyZFNoYXBlID0gTS5raW5kKCdndWFyZDptZXRob2RHdWFyZCcpO1xuXG4vKlxuXG5cbiAqLyRozY9fb25jZS5NZXRob2RHdWFyZFNoYXBlKE1ldGhvZEd1YXJkU2hhcGUpO1xuICAgICAgIGNvbnN0IGFzc2VydE1ldGhvZEd1YXJkID0gc3BlY2ltZW4gPT4ge1xuICBtdXN0TWF0Y2goc3BlY2ltZW4sIE1ldGhvZEd1YXJkU2hhcGUsICdtZXRob2RHdWFyZCcpO1xufTskaM2PX29uY2UuYXNzZXJ0TWV0aG9kR3VhcmQoYXNzZXJ0TWV0aG9kR3VhcmQpO1xuaGFyZGVuKGFzc2VydE1ldGhvZEd1YXJkKTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VNZXRob2RHdWFyZE1ha2VyID0gKFxuICBjYWxsS2luZCxcbiAgYXJnR3VhcmRzLFxuICBvcHRpb25hbEFyZ0d1YXJkcyA9IHVuZGVmaW5lZCxcbiAgcmVzdEFyZ0d1YXJkID0gdW5kZWZpbmVkLFxuKSA9PlxuICBoYXJkZW4oe1xuICAgIG9wdGlvbmFsOiAoLi4ub3B0QXJnR3VhcmRzKSA9PiB7XG4gICAgICBvcHRpb25hbEFyZ0d1YXJkcyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIEZhaWxgQ2FuIG9ubHkgaGF2ZSBvbmUgc2V0IG9mIG9wdGlvbmFsIGd1YXJkc2A7XG4gICAgICByZXN0QXJnR3VhcmQgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBGYWlsYG9wdGlvbmFsIGFyZyBndWFyZHMgbXVzdCBjb21lIGJlZm9yZSByZXN0IGFyZ2A7XG4gICAgICByZXR1cm4gbWFrZU1ldGhvZEd1YXJkTWFrZXIoY2FsbEtpbmQsIGFyZ0d1YXJkcywgb3B0QXJnR3VhcmRzKTtcbiAgICB9LFxuICAgIHJlc3Q6IHJBcmdHdWFyZCA9PiB7XG4gICAgICByZXN0QXJnR3VhcmQgPT09IHVuZGVmaW5lZCB8fCBGYWlsYENhbiBvbmx5IGhhdmUgb25lIHJlc3QgYXJnYDtcbiAgICAgIHJldHVybiBtYWtlTWV0aG9kR3VhcmRNYWtlcihcbiAgICAgICAgY2FsbEtpbmQsXG4gICAgICAgIGFyZ0d1YXJkcyxcbiAgICAgICAgb3B0aW9uYWxBcmdHdWFyZHMsXG4gICAgICAgIHJBcmdHdWFyZCxcbiAgICAgICk7XG4gICAgfSxcbiAgICByZXR1cm5zOiAocmV0dXJuR3VhcmQgPSBNLnVuZGVmaW5lZCgpKSA9PiB7XG4gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgY29uc3QgcmVzdWx0ID0gbWFrZVRhZ2dlZCgnZ3VhcmQ6bWV0aG9kR3VhcmQnLCB7XG4gICAgICAgIGNhbGxLaW5kLFxuICAgICAgICBhcmdHdWFyZHMsXG4gICAgICAgIG9wdGlvbmFsQXJnR3VhcmRzLFxuICAgICAgICByZXN0QXJnR3VhcmQsXG4gICAgICAgIHJldHVybkd1YXJkLFxuICAgICAgfSk7XG4gICAgICBhc3NlcnRNZXRob2RHdWFyZChyZXN1bHQpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuICB9KTtcblxuICAgICAgIGNvbnN0IEludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlID0gTS5zcGxpdFJlY29yZChcbiAge1xuICAgIGludGVyZmFjZU5hbWU6IE0uc3RyaW5nKCksXG4gICAgbWV0aG9kR3VhcmRzOiBNLnJlY29yZE9mKE0uc3RyaW5nKCksIE1ldGhvZEd1YXJkU2hhcGUpLFxuICB9LFxuICB7XG4gICAgZGVmYXVsdEd1YXJkczogTS5vcihNLnVuZGVmaW5lZCgpLCAncGFzc2FibGUnLCAncmF3JyksXG4gICAgc2xvcHB5OiBNLmJvb2xlYW4oKSxcbiAgICBzeW1ib2xNZXRob2RHdWFyZHM6IE0ubWFwT2YoTS5zeW1ib2woKSwgTWV0aG9kR3VhcmRTaGFwZSksXG4gIH0sXG4pOyRozY9fb25jZS5JbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZShJbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZSk7XG5cbiAgICAgICBjb25zdCBJbnRlcmZhY2VHdWFyZFNoYXBlID0gTS5raW5kKCdndWFyZDppbnRlcmZhY2VHdWFyZCcpO1xuXG4vKlxuXG5cbiAqLyRozY9fb25jZS5JbnRlcmZhY2VHdWFyZFNoYXBlKEludGVyZmFjZUd1YXJkU2hhcGUpO1xuICAgICAgIGNvbnN0IGFzc2VydEludGVyZmFjZUd1YXJkID0gc3BlY2ltZW4gPT4ge1xuICBtdXN0TWF0Y2goc3BlY2ltZW4sIEludGVyZmFjZUd1YXJkU2hhcGUsICdpbnRlcmZhY2VHdWFyZCcpO1xufTskaM2PX29uY2UuYXNzZXJ0SW50ZXJmYWNlR3VhcmQoYXNzZXJ0SW50ZXJmYWNlR3VhcmQpO1xuaGFyZGVuKGFzc2VydEludGVyZmFjZUd1YXJkKTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VJbnRlcmZhY2VHdWFyZCA9IChpbnRlcmZhY2VOYW1lLCBtZXRob2RHdWFyZHMsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7IHNsb3BweSA9IGZhbHNlLCBkZWZhdWx0R3VhcmRzID0gc2xvcHB5ID8gJ3Bhc3NhYmxlJyA6IHVuZGVmaW5lZCB9ID1cbiAgICBvcHRpb25zO1xuICAvL1xuICAvL1xuICAvL1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3Qgc3RyaW5nTWV0aG9kR3VhcmRzID0ge307XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3Qgc3ltYm9sTWV0aG9kR3VhcmRzRW50cmllcyA9IFtdO1xuICBmb3IgKGNvbnN0IGtleSBvZiBvd25LZXlzKG1ldGhvZEd1YXJkcykpIHtcbiAgICBjb25zdCB2YWx1ZSA9IG1ldGhvZEd1YXJkc1svKiAgICAgICAgICAgICAgICAgKi8gKGtleSldO1xuICAgIGlmICh0eXBlb2Yga2V5ID09PSAnc3ltYm9sJykge1xuICAgICAgc3ltYm9sTWV0aG9kR3VhcmRzRW50cmllcy5wdXNoKFtrZXksIHZhbHVlXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0cmluZ01ldGhvZEd1YXJkc1trZXldID0gdmFsdWU7XG4gICAgfVxuICB9XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHJlc3VsdCA9IG1ha2VUYWdnZWQoJ2d1YXJkOmludGVyZmFjZUd1YXJkJywge1xuICAgIGludGVyZmFjZU5hbWUsXG4gICAgbWV0aG9kR3VhcmRzOiBzdHJpbmdNZXRob2RHdWFyZHMsXG4gICAgLi4uKHN5bWJvbE1ldGhvZEd1YXJkc0VudHJpZXMubGVuZ3RoXG4gICAgICA/IHsgc3ltYm9sTWV0aG9kR3VhcmRzOiBtYWtlQ29weU1hcChzeW1ib2xNZXRob2RHdWFyZHNFbnRyaWVzKSB9XG4gICAgICA6IHt9KSxcbiAgICBkZWZhdWx0R3VhcmRzLFxuICB9KTtcbiAgYXNzZXJ0SW50ZXJmYWNlR3VhcmQocmVzdWx0KTtcbiAgcmV0dXJuIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChyZXN1bHQpO1xufTtcblxuY29uc3QgR3VhcmRQYXlsb2FkU2hhcGVzID0gaGFyZGVuKHtcbiAgJ2d1YXJkOmF3YWl0QXJnR3VhcmQnOiBBd2FpdEFyZ0d1YXJkUGF5bG9hZFNoYXBlLFxuICAnZ3VhcmQ6cmF3R3VhcmQnOiBSYXdHdWFyZFBheWxvYWRTaGFwZSxcbiAgJ2d1YXJkOm1ldGhvZEd1YXJkJzogTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUsXG4gICdndWFyZDppbnRlcmZhY2VHdWFyZCc6IEludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlLFxufSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0TGltaXRzIjpbImRlZmF1bHRMaW1pdHMiXSwiY2hlY2tNYXRjaGVzIjpbImNoZWNrTWF0Y2hlcyJdLCJtYXRjaGVzIjpbIm1hdGNoZXMiXSwibXVzdE1hdGNoIjpbIm11c3RNYXRjaCJdLCJhc3NlcnRQYXR0ZXJuIjpbImFzc2VydFBhdHRlcm4iXSwiaXNQYXR0ZXJuIjpbImlzUGF0dGVybiJdLCJnZXRSYW5rQ292ZXIiOlsiZ2V0UmFua0NvdmVyIl0sIk0iOlsiTSJdLCJraW5kT2YiOlsia2luZE9mIl0sImNvbnRhaW5lckhhc1NwbGl0IjpbImNvbnRhaW5lckhhc1NwbGl0Il0sIkF3YWl0QXJnR3VhcmRTaGFwZSI6WyJBd2FpdEFyZ0d1YXJkU2hhcGUiXSwiaXNBd2FpdEFyZ0d1YXJkIjpbImlzQXdhaXRBcmdHdWFyZCJdLCJhc3NlcnRBd2FpdEFyZ0d1YXJkIjpbImFzc2VydEF3YWl0QXJnR3VhcmQiXSwiUmF3R3VhcmRTaGFwZSI6WyJSYXdHdWFyZFNoYXBlIl0sImlzUmF3R3VhcmQiOlsiaXNSYXdHdWFyZCJdLCJhc3NlcnRSYXdHdWFyZCI6WyJhc3NlcnRSYXdHdWFyZCJdLCJTeW5jVmFsdWVHdWFyZFNoYXBlIjpbIlN5bmNWYWx1ZUd1YXJkU2hhcGUiXSwiU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUiOlsiU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUiXSwiQXJnR3VhcmRMaXN0U2hhcGUiOlsiQXJnR3VhcmRMaXN0U2hhcGUiXSwiTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUiOlsiTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUiXSwiTWV0aG9kR3VhcmRTaGFwZSI6WyJNZXRob2RHdWFyZFNoYXBlIl0sImFzc2VydE1ldGhvZEd1YXJkIjpbImFzc2VydE1ldGhvZEd1YXJkIl0sIkludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlIjpbIkludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlIl0sIkludGVyZmFjZUd1YXJkU2hhcGUiOlsiSW50ZXJmYWNlR3VhcmRTaGFwZSJdLCJhc3NlcnRJbnRlcmZhY2VHdWFyZCI6WyJhc3NlcnRJbnRlcmZhY2VHdWFyZCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAAiAAAAQGVuZG8vcGF0dGVybnMtdjEuNS4wL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA/RdPfYgYAAGIGAAAiAAAAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMC9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyIsIi4vc3JjL21lbW8tcmFjZS5qcyIsIi4vc3JjL2lzLXByb21pc2UuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJleHBvcnRzIjpbIm1ha2VQcm9taXNlS2l0IiwicmFjZVByb21pc2VzIl0sInJlZXhwb3J0cyI6WyIuL3NyYy9pcy1wcm9taXNlLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQsbWVtb1JhY2U7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc1wiLCBbW1wibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0XCIsWyRozY9fYSA9PiAobWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0ID0gJGjNj19hKV1dXV0sW1wiLi9zcmMvbWVtby1yYWNlLmpzXCIsIFtbXCJtZW1vUmFjZVwiLFskaM2PX2EgPT4gKG1lbW9SYWNlID0gJGjNj19hKV1dXV0sW1wiLi9zcmMvaXMtcHJvbWlzZS5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1ha2VQcm9taXNlS2l0LCduYW1lJyx7dmFsdWU6XCJtYWtlUHJvbWlzZUtpdFwifSk7JGjNj19vbmNlLm1ha2VQcm9taXNlS2l0KG1ha2VQcm9taXNlS2l0KTtPYmplY3QuZGVmaW5lUHJvcGVydHkocmFjZVByb21pc2VzLCduYW1lJyx7dmFsdWU6XCJyYWNlUHJvbWlzZXNcIn0pOyRozY9fb25jZS5yYWNlUHJvbWlzZXMocmFjZVByb21pc2VzKTtcblxuXG5cblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IEJlc3RQaXBlbGluYWJsZVByb21pc2UgPSBnbG9iYWxUaGlzLkhhbmRsZWRQcm9taXNlIHx8IFByb21pc2U7XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBmdW5jdGlvbiBtYWtlUHJvbWlzZUtpdCgpIHtcbiAgY29uc3QgeyByZXNvbHZlLCByZWplY3QsIGV4ZWN1dG9yIH0gPSBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQoKTtcblxuICBjb25zdCBwcm9taXNlID0gbmV3IEJlc3RQaXBlbGluYWJsZVByb21pc2UoZXhlY3V0b3IpO1xuXG4gIHJldHVybiBoYXJkZW4oeyBwcm9taXNlLCByZXNvbHZlLCByZWplY3QgfSk7XG59XG5oYXJkZW4obWFrZVByb21pc2VLaXQpO1xuXG4vL1xuLy9cbi8vXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBmdW5jdGlvbiByYWNlUHJvbWlzZXModmFsdWVzKSB7XG4gIHJldHVybiBoYXJkZW4obWVtb1JhY2UuY2FsbChCZXN0UGlwZWxpbmFibGVQcm9taXNlLCB2YWx1ZXMpKTtcbn1cbmhhcmRlbihyYWNlUHJvbWlzZXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVByb21pc2VLaXQiOlsibWFrZVByb21pc2VLaXQiXSwicmFjZVByb21pc2VzIjpbInJhY2VQcm9taXNlcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB1iEF+ZAIAAGQCAAArAAAAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMC9zcmMvaXMtcHJvbWlzZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiaXNQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShpc1Byb21pc2UsJ25hbWUnLHt2YWx1ZTpcImlzUHJvbWlzZVwifSk7JGjNj19vbmNlLmlzUHJvbWlzZShpc1Byb21pc2UpOy8qXG5cblxuXG5cbiAqL1xuICAgICAgIGZ1bmN0aW9uIGlzUHJvbWlzZShtYXliZVByb21pc2UpIHtcbiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShtYXliZVByb21pc2UpID09PSBtYXliZVByb21pc2U7XG59XG5oYXJkZW4oaXNQcm9taXNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUHJvbWlzZSI6WyJpc1Byb21pc2UiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAOeGs8FkJAABZCQAAKgAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTAvc3JjL21lbW8tcmFjZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWVtb1JhY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiovXG5cbmNvbnN0IGlzT2JqZWN0ID0gdmFsdWUgPT4gT2JqZWN0KHZhbHVlKSA9PT0gdmFsdWU7XG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi9cblxuLy9cbi8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBrbm93blByb21pc2VzID0gbmV3IFdlYWtNYXAoKTtcblxuLypcblxuXG4gKi9cbmNvbnN0IG1hcmtTZXR0bGVkID0gcmVjb3JkID0+IHtcbiAgaWYgKCFyZWNvcmQgfHwgcmVjb3JkLnNldHRsZWQpIHtcbiAgICByZXR1cm4gbmV3IFNldCgpO1xuICB9XG5cbiAgY29uc3QgeyBkZWZlcnJlZHMgfSA9IHJlY29yZDtcbiAgT2JqZWN0LmFzc2lnbihyZWNvcmQsIHtcbiAgICBkZWZlcnJlZHM6IHVuZGVmaW5lZCxcbiAgICBzZXR0bGVkOiB0cnVlLFxuICB9KTtcbiAgT2JqZWN0LmZyZWV6ZShyZWNvcmQpO1xuICByZXR1cm4gZGVmZXJyZWRzO1xufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgZ2V0TWVtb1JlY29yZCA9IHZhbHVlID0+IHtcbiAgaWYgKCFpc09iamVjdCh2YWx1ZSkpIHtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIHJldHVybiBoYXJkZW4oeyBzZXR0bGVkOiB0cnVlIH0pO1xuICB9XG5cbiAgbGV0IHJlY29yZCA9IGtub3duUHJvbWlzZXMuZ2V0KHZhbHVlKTtcblxuICBpZiAoIXJlY29yZCkge1xuICAgIHJlY29yZCA9IHsgZGVmZXJyZWRzOiBuZXcgU2V0KCksIHNldHRsZWQ6IGZhbHNlIH07XG4gICAga25vd25Qcm9taXNlcy5zZXQodmFsdWUsIHJlY29yZCk7XG4gICAgLy9cbiAgICBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oXG4gICAgICB2YWwgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IHsgcmVzb2x2ZSB9IG9mIG1hcmtTZXR0bGVkKHJlY29yZCkpIHtcbiAgICAgICAgICByZXNvbHZlKHZhbCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBlcnIgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IHsgcmVqZWN0IH0gb2YgbWFya1NldHRsZWQocmVjb3JkKSkge1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHJlY29yZDtcbn07XG5cbmNvbnN0IHsgcmFjZSB9ID0ge1xuICAvKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIHJhY2UodmFsdWVzKSB7XG4gICAgbGV0IGRlZmVycmVkO1xuICAgIC8qICAgICAgICAgICAgICAgICAqL1xuICAgIC8vXG4gICAgY29uc3QgY2FjaGVkVmFsdWVzID0gW107XG4gICAgY29uc3QgQyA9IHRoaXM7XG4gICAgY29uc3QgcmVzdWx0ID0gbmV3IEMoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgZGVmZXJyZWQgPSB7IHJlc29sdmUsIHJlamVjdCB9O1xuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHtcbiAgICAgICAgY2FjaGVkVmFsdWVzLnB1c2godmFsdWUpO1xuICAgICAgICBjb25zdCB7IHNldHRsZWQsIGRlZmVycmVkcyB9ID0gZ2V0TWVtb1JlY29yZCh2YWx1ZSk7XG4gICAgICAgIGlmIChzZXR0bGVkKSB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIEMucmVzb2x2ZSh2YWx1ZSkudGhlbihyZXNvbHZlLCByZWplY3QpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRlZmVycmVkcy5hZGQoZGVmZXJyZWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvL1xuICAgIC8vXG4gICAgcmV0dXJuIHJlc3VsdC5maW5hbGx5KCgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgY2FjaGVkVmFsdWVzKSB7XG4gICAgICAgIGNvbnN0IHsgZGVmZXJyZWRzIH0gPSBnZXRNZW1vUmVjb3JkKHZhbHVlKTtcbiAgICAgICAgaWYgKGRlZmVycmVkcykge1xuICAgICAgICAgIGRlZmVycmVkcy5kZWxldGUoZGVmZXJyZWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH0sXG59OyRozY9fb25jZS5yYWNlKHJhY2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWVtb1JhY2UiOlsicmFjZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACMGyI1HwYAAB8GAAA1AAAAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMC9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvL1xuXG4vKlxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCA9ICgpID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGxldCBpbnRlcm5hbFJlc29sdmU7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgbGV0IGludGVybmFsUmVqZWN0O1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHJlc29sdmUgPSB2YWx1ZSA9PiB7XG4gICAgaWYgKGludGVybmFsUmVzb2x2ZSkge1xuICAgICAgaW50ZXJuYWxSZXNvbHZlKHZhbHVlKTtcbiAgICAgIGludGVybmFsUmVzb2x2ZSA9IG51bGw7XG4gICAgICBpbnRlcm5hbFJlamVjdCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydChpbnRlcm5hbFJlc29sdmUgPT09IG51bGwpO1xuICAgIH1cbiAgfTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgcmVqZWN0ID0gcmVhc29uID0+IHtcbiAgICBpZiAoaW50ZXJuYWxSZWplY3QpIHtcbiAgICAgIGludGVybmFsUmVqZWN0KHJlYXNvbik7XG4gICAgICBpbnRlcm5hbFJlc29sdmUgPSBudWxsO1xuICAgICAgaW50ZXJuYWxSZWplY3QgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQoaW50ZXJuYWxSZWplY3QgPT09IG51bGwpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBleGVjdXRvciA9IChyZXMsIHJlaikgPT4ge1xuICAgIGFzc2VydChpbnRlcm5hbFJlc29sdmUgPT09IHVuZGVmaW5lZCAmJiBpbnRlcm5hbFJlamVjdCA9PT0gdW5kZWZpbmVkKTtcbiAgICBpbnRlcm5hbFJlc29sdmUgPSByZXM7XG4gICAgaW50ZXJuYWxSZWplY3QgPSByZWo7XG4gIH07XG5cbiAgcmV0dXJuIGhhcmRlbih7IHJlc29sdmUsIHJlamVjdCwgZXhlY3V0b3IgfSk7XG59OyRozY9fb25jZS5tYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQobWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KTtcbmhhcmRlbihtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0IjpbIm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAAmAAAAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMC9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAASdhWHrgUAAC4FAAAHQAAAEBlbmRvL3N0cmVhbS12MS4yLjEwL2luZGV4LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbIm1ha2VQaXBlIiwibWFrZVF1ZXVlIiwibWFrZVN0cmVhbSIsIm1hcFJlYWRlciIsIm1hcFdyaXRlciIsInByaW1lIiwicHVtcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEUsbWFrZVByb21pc2VLaXQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJtYWtlUHJvbWlzZUtpdFwiLFskaM2PX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8vXG4vL1xuLy9cbmNvbnN0IGZyZWV6ZSA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKE9iamVjdC5mcmVlemUpO1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VRdWV1ZSA9ICgpID0+IHtcbiAgbGV0IHsgcHJvbWlzZTogdGFpbFByb21pc2UsIHJlc29sdmU6IHRhaWxSZXNvbHZlIH0gPSBtYWtlUHJvbWlzZUtpdCgpO1xuICByZXR1cm4ge1xuICAgIHB1dCh2YWx1ZSkge1xuICAgICAgY29uc3QgeyByZXNvbHZlLCBwcm9taXNlIH0gPSBtYWtlUHJvbWlzZUtpdCgpO1xuICAgICAgdGFpbFJlc29sdmUoZnJlZXplKHsgdmFsdWUsIHByb21pc2UgfSkpO1xuICAgICAgdGFpbFJlc29sdmUgPSByZXNvbHZlO1xuICAgIH0sXG4gICAgZ2V0KCkge1xuICAgICAgY29uc3QgcHJvbWlzZSA9IHRhaWxQcm9taXNlLnRoZW4obmV4dCA9PiBuZXh0LnZhbHVlKTtcbiAgICAgIHRhaWxQcm9taXNlID0gdGFpbFByb21pc2UudGhlbihuZXh0ID0+IG5leHQucHJvbWlzZSk7XG4gICAgICByZXR1cm4gaGFyZGVuKHByb21pc2UpO1xuICAgIH0sXG4gIH07XG59OyRozY9fb25jZS5tYWtlUXVldWUobWFrZVF1ZXVlKTtcbmhhcmRlbihtYWtlUXVldWUpO1xuXG4vKlxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZVN0cmVhbSA9IChhY2tzLCBkYXRhKSA9PiB7XG4gIGNvbnN0IHN0cmVhbSA9IGhhcmRlbih7XG4gICAgLypcblxuICAgICAqL1xuICAgIG5leHQodmFsdWUpIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgZGF0YS5wdXQoZnJlZXplKHsgdmFsdWUsIGRvbmU6IGZhbHNlIH0pKTtcbiAgICAgIHJldHVybiBhY2tzLmdldCgpO1xuICAgIH0sXG4gICAgLypcblxuICAgICAqL1xuICAgIHJldHVybih2YWx1ZSkge1xuICAgICAgZGF0YS5wdXQoZnJlZXplKHsgdmFsdWUsIGRvbmU6IHRydWUgfSkpO1xuICAgICAgcmV0dXJuIGFja3MuZ2V0KCk7XG4gICAgfSxcbiAgICAvKlxuXG4gICAgICovXG4gICAgdGhyb3coZXJyb3IpIHtcbiAgICAgIGRhdGEucHV0KGhhcmRlbihQcm9taXNlLnJlamVjdChlcnJvcikpKTtcbiAgICAgIHJldHVybiBhY2tzLmdldCgpO1xuICAgIH0sXG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICAgIHJldHVybiBzdHJlYW07XG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiBzdHJlYW07XG59OyRozY9fb25jZS5tYWtlU3RyZWFtKG1ha2VTdHJlYW0pO1xuaGFyZGVuKG1ha2VTdHJlYW0pO1xuXG4vL1xuLy9cbi8vXG4gICAgICAgY29uc3QgbWFrZVBpcGUgPSAoKSA9PiB7XG4gIGNvbnN0IGRhdGEgPSBtYWtlUXVldWUoKTtcbiAgY29uc3QgYWNrcyA9IG1ha2VRdWV1ZSgpO1xuICBjb25zdCByZWFkZXIgPSBtYWtlU3RyZWFtKGFja3MsIGRhdGEpO1xuICBjb25zdCB3cml0ZXIgPSBtYWtlU3RyZWFtKGRhdGEsIGFja3MpO1xuICByZXR1cm4gaGFyZGVuKFt3cml0ZXIsIHJlYWRlcl0pO1xufTskaM2PX29uY2UubWFrZVBpcGUobWFrZVBpcGUpO1xuaGFyZGVuKG1ha2VQaXBlKTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcHVtcCA9IGFzeW5jICh3cml0ZXIsIHJlYWRlciwgcHJpbWVyKSA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgdGljayA9IHByb21pc2UgPT5cbiAgICBFLndoZW4oXG4gICAgICBwcm9taXNlLFxuICAgICAgcmVzdWx0ID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdC5kb25lKSB7XG4gICAgICAgICAgcmV0dXJuIHdyaXRlci5yZXR1cm4ocmVzdWx0LnZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgcmV0dXJuIHRvY2sod3JpdGVyLm5leHQocmVzdWx0LnZhbHVlKSk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAoLyogICAgICAgICAgICAgICAgKi8gZXJyb3IpID0+IHtcbiAgICAgICAgcmV0dXJuIHdyaXRlci50aHJvdyhlcnJvcik7XG4gICAgICB9LFxuICAgICk7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCB0b2NrID0gcHJvbWlzZSA9PlxuICAgIEUud2hlbihcbiAgICAgIHByb21pc2UsXG4gICAgICByZXN1bHQgPT4ge1xuICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICByZXR1cm4gcmVhZGVyLnJldHVybihyZXN1bHQudmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiB0aWNrKHJlYWRlci5uZXh0KHJlc3VsdC52YWx1ZSkpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgKC8qICAgICAgICAgICAgICAgICovIGVycm9yKSA9PiB7XG4gICAgICAgIHJldHVybiByZWFkZXIudGhyb3coZXJyb3IpO1xuICAgICAgfSxcbiAgICApO1xuICBhd2FpdCB0aWNrKHJlYWRlci5uZXh0KHByaW1lcikpO1xuICByZXR1cm4gdW5kZWZpbmVkO1xufTskaM2PX29uY2UucHVtcChwdW1wKTtcbmhhcmRlbihwdW1wKTtcblxuLypcblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBwcmltZSA9IChnZW5lcmF0b3IsIHByaW1lcikgPT4ge1xuICAvL1xuICBjb25zdCBmaXJzdCA9IGdlbmVyYXRvci5uZXh0KHByaW1lcik7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgbGV0IHJlc3VsdDtcbiAgY29uc3QgcHJpbWVkID0gaGFyZGVuKHtcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgYXN5bmMgbmV4dCh2YWx1ZSkge1xuICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vXG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IGZpcnN0O1xuICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gZ2VuZXJhdG9yLm5leHQodmFsdWUpO1xuICAgIH0sXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBhc3luYyByZXR1cm4odmFsdWUpIHtcbiAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvL1xuICAgICAgICByZXN1bHQgPSBhd2FpdCBmaXJzdDtcbiAgICAgICAgaWYgKHJlc3VsdC5kb25lKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGdlbmVyYXRvci5yZXR1cm4odmFsdWUpO1xuICAgIH0sXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgYXN5bmMgdGhyb3coZXJyb3IpIHtcbiAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvL1xuICAgICAgICByZXN1bHQgPSBhd2FpdCBmaXJzdDtcbiAgICAgICAgaWYgKHJlc3VsdC5kb25lKSB7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBnZW5lcmF0b3IudGhyb3coZXJyb3IpO1xuICAgIH0sXG4gIH0pO1xuICByZXR1cm4gcHJpbWVkO1xufTskaM2PX29uY2UucHJpbWUocHJpbWUpO1xuaGFyZGVuKHByaW1lKTtcblxuLypcblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYXBSZWFkZXIgPSAocmVhZGVyLCB0cmFuc2Zvcm0pID0+IHtcbiAgYXN5bmMgZnVuY3Rpb24qIHRyYW5zZm9ybUdlbmVyYXRvcigpIHtcbiAgICBmb3IgYXdhaXQgKGNvbnN0IHZhbHVlIG9mIHJlYWRlcikge1xuICAgICAgeWllbGQgdHJhbnNmb3JtKHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBoYXJkZW4odHJhbnNmb3JtR2VuZXJhdG9yKTtcbiAgcmV0dXJuIGhhcmRlbih0cmFuc2Zvcm1HZW5lcmF0b3IoKSk7XG59OyRozY9fb25jZS5tYXBSZWFkZXIobWFwUmVhZGVyKTtcbmhhcmRlbihtYXBSZWFkZXIpO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1hcFdyaXRlciA9ICh3cml0ZXIsIHRyYW5zZm9ybSkgPT4ge1xuICBjb25zdCB0cmFuc2Zvcm1lZFdyaXRlciA9IGhhcmRlbih7XG4gICAgLypcblxuICAgICAqL1xuICAgIGFzeW5jIG5leHQodmFsdWUpIHtcbiAgICAgIHJldHVybiB3cml0ZXIubmV4dCh0cmFuc2Zvcm0odmFsdWUpKTtcbiAgICB9LFxuICAgIC8qXG5cbiAgICAgKi9cbiAgICBhc3luYyB0aHJvdyhlcnJvcikge1xuICAgICAgcmV0dXJuIHdyaXRlci50aHJvdyhlcnJvcik7XG4gICAgfSxcbiAgICAvKlxuXG4gICAgICovXG4gICAgYXN5bmMgcmV0dXJuKHZhbHVlKSB7XG4gICAgICByZXR1cm4gd3JpdGVyLnJldHVybih2YWx1ZSk7XG4gICAgfSxcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCkge1xuICAgICAgcmV0dXJuIHRyYW5zZm9ybWVkV3JpdGVyO1xuICAgIH0sXG4gIH0pO1xuICByZXR1cm4gdHJhbnNmb3JtZWRXcml0ZXI7XG59OyRozY9fb25jZS5tYXBXcml0ZXIobWFwV3JpdGVyKTtcbmhhcmRlbihtYXBXcml0ZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVF1ZXVlIjpbIm1ha2VRdWV1ZSJdLCJtYWtlU3RyZWFtIjpbIm1ha2VTdHJlYW0iXSwibWFrZVBpcGUiOlsibWFrZVBpcGUiXSwicHVtcCI6WyJwdW1wIl0sInByaW1lIjpbInByaW1lIl0sIm1hcFJlYWRlciI6WyJtYXBSZWFkZXIiXSwibWFwV3JpdGVyIjpbIm1hcFdyaXRlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADuW/a/0QEAANEBAAAcAAAAamVzc2llLmpzLXYwLjMuNC9zcmMvbWFpbi5qc3siaW1wb3J0cyI6WyIuL3JpbmcwL21haW4uanMiLCIuL3JpbmcxL21haW4uanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL3JpbmcwL21haW4uanMiLCIuL3JpbmcxL21haW4uanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9yaW5nMC9tYWluLmpzXCIsIFtdXSxbXCIuL3JpbmcxL21haW4uanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA9mAl5IEBAACBAQAAHwAAAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcwL0UuanN7ImltcG9ydHMiOlsiQGVuZG8vZmFyIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiQGVuZG8vZmFyIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABPWvW9pgIAAKYCAAAsAAAAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzAvYXN5bmMtZ2VuZXJhdGUuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImFzeW5jR2VuZXJhdGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Ly9cblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGFzeW5jR2VuZXJhdGUgPSBuZXh0ID0+IHtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICAgIG5leHQ6IGFzeW5jICgpID0+IGhhcmRlbihuZXh0KCkpLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59OyRozY9fb25jZS5hc3luY0dlbmVyYXRlKGFzeW5jR2VuZXJhdGUpO1xuaGFyZGVuKGFzeW5jR2VuZXJhdGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXN5bmNHZW5lcmF0ZSI6WyJhc3luY0dlbmVyYXRlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAP56+f30AQAA9AEAACIAAABqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMC9tYWluLmpzeyJpbXBvcnRzIjpbIi4vRS5qcyIsIi4vbWFrZXJzLmpzIiwiLi9hc3luYy1nZW5lcmF0ZS5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vRS5qcyIsIi4vYXN5bmMtZ2VuZXJhdGUuanMiLCIuL21ha2Vycy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL0UuanNcIiwgW11dLFtcIi4vbWFrZXJzLmpzXCIsIFtdXSxbXCIuL2FzeW5jLWdlbmVyYXRlLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEloIVDkBwAA5AcAACQAAABqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMC9tYWtlcnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1ha2VNYXAiLCJtYWtlUHJvbWlzZSIsIm1ha2VTZXQiLCJtYWtlV2Vha01hcCIsIm1ha2VXZWFrU2V0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8vXG4vL1xuLy9cblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZVByb21pc2UgPSBleGVjdXRvciA9PiBoYXJkZW4obmV3IFByb21pc2UoZXhlY3V0b3IpKTskaM2PX29uY2UubWFrZVByb21pc2UobWFrZVByb21pc2UpO1xuaGFyZGVuKG1ha2VQcm9taXNlKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgIGNvbnN0IG1ha2VNYXAgPSBlbnRyaWVzT3JJdGVyYWJsZSA9PiBoYXJkZW4obmV3IE1hcChlbnRyaWVzT3JJdGVyYWJsZSkpOyRozY9fb25jZS5tYWtlTWFwKG1ha2VNYXApO1xuaGFyZGVuKG1ha2VNYXApO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgIGNvbnN0IG1ha2VTZXQgPSB2YWx1ZXMgPT4gaGFyZGVuKG5ldyBTZXQodmFsdWVzKSk7JGjNj19vbmNlLm1ha2VTZXQobWFrZVNldCk7XG5oYXJkZW4obWFrZVNldCk7XG5cbi8qXG5cblxuXG4gKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICBjb25zdCBtYWtlV2Vha01hcCA9IGVudHJpZXMgPT4gaGFyZGVuKG5ldyBXZWFrTWFwKGVudHJpZXMpKTskaM2PX29uY2UubWFrZVdlYWtNYXAobWFrZVdlYWtNYXApO1xuaGFyZGVuKG1ha2VXZWFrTWFwKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgbWFrZVdlYWtTZXQgPSB2YWx1ZXMgPT4gaGFyZGVuKG5ldyBXZWFrU2V0KHZhbHVlcykpOyRozY9fb25jZS5tYWtlV2Vha1NldChtYWtlV2Vha1NldCk7XG5oYXJkZW4obWFrZVdlYWtTZXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVByb21pc2UiOlsibWFrZVByb21pc2UiXSwibWFrZU1hcCI6WyJtYWtlTWFwIl0sIm1ha2VTZXQiOlsibWFrZVNldCJdLCJtYWtlV2Vha01hcCI6WyJtYWtlV2Vha01hcCJdLCJtYWtlV2Vha1NldCI6WyJtYWtlV2Vha1NldCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABp9VL/rAMAAKwDAAApAAAAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzEvYXN5bmMtdG9vbHMuanN7ImltcG9ydHMiOlsiLi4vcmluZzAvbWFpbi5qcyJdLCJleHBvcnRzIjpbImFzeW5jRG9XaGlsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG1ha2VQcm9taXNlOyRozY9faW1wb3J0cyhbW1wiLi4vcmluZzAvbWFpbi5qc1wiLCBbW1wibWFrZVByb21pc2VcIixbJGjNj19hID0+IChtYWtlUHJvbWlzZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGFzeW5jRG9XaGlsZSA9IGJvZHkgPT4ge1xuICByZXR1cm4gbWFrZVByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgIGNvbnN0IGxvb3AgPSBhc3luYyAoKSA9PiB7XG4gICAgICBjb25zdCBkb0NvbnRpbnVlID0gYXdhaXQgYm9keSgpO1xuICAgICAgaWYgKCFkb0NvbnRpbnVlKSB7XG4gICAgICAgIC8vXG4gICAgICAgIHJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGxvb3AoKS5jYXRjaChyZWplY3QpO1xuICAgIH07XG5cbiAgICBsb29wKCkuY2F0Y2gocmVqZWN0KTtcbiAgfSk7XG59OyRozY9fb25jZS5hc3luY0RvV2hpbGUoYXN5bmNEb1doaWxlKTtcbmhhcmRlbihhc3luY0RvV2hpbGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXN5bmNEb1doaWxlIjpbImFzeW5jRG9XaGlsZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAbaDcDlgEAAJYBAAAiAAAAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzEvbWFpbi5qc3siaW1wb3J0cyI6WyIuL2FzeW5jLXRvb2xzLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9hc3luYy10b29scy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL2FzeW5jLXRvb2xzLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwECHgMKAAAAAAAAAAAA7NFQmooBAQCKAQEAFAAAAAAAAAAAAAAApIEAAAAAY29tcGFydG1lbnQtbWFwLmpzb25QSwECHgMKAAAAAAAAAAAAMYBI+I0BAACNAQAAJgAAAAAAAAAAAAAApIG8AQEAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4xLXUyMS4wL2hlYXAuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAALQAAAAAAAAAAAAAApIGNAwEAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4xLXUyMS4wL3NyYy9leHBvcnRzLmpzUEsBAh4DCgAAAAAAAAAAAATzwp3PCgAAzwoAACoAAAAAAAAAAAAAAKSBMAUBAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMS11MjEuMC9zcmMvaGVhcC5qc1BLAQIeAwoAAAAAAAAAAAAVbrH6eQIAAHkCAAArAAAAAAAAAAAAAACkgUcQAQBAYWdvcmljL2Jhc2Utem9uZS12MC4xLjEtdTIxLjAvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAADl90gx0AgAAdAIAADEAAAAAAAAAAAAAAKSBCRMBAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMS11MjEuMC9zcmMvaXMtcGFzc2FibGUuanNQSwECHgMKAAAAAAAAAAAAy4/sxZgDAACYAwAAKgAAAAAAAAAAAAAApIHMFQEAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4xLXUyMS4wL3NyYy9rZXlzLmpzUEsBAh4DCgAAAAAAAAAAABrumdulBwAApQcAAC8AAAAAAAAAAAAAAKSBrBkBAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMS11MjEuMC9zcmMvbWFrZS1vbmNlLmpzUEsBAh4DCgAAAAAAAAAAAJVLZf3bCQAA2wkAADMAAAAAAAAAAAAAAKSBniEBAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMS11MjEuMC9zcmMvd2F0Y2gtcHJvbWlzZS5qc1BLAQIeAwoAAAAAAAAAAADKlZNPaQUAAGkFAAAnAAAAAAAAAAAAAACkgcorAQBAYWdvcmljL2NhY2hlLXYwLjMuMy11MjEuMC9zcmMvY2FjaGUuanNQSwECHgMKAAAAAAAAAAAAoMZVCRECAAARAgAAJgAAAAAAAAAAAAAApIF4MQEAQGFnb3JpYy9jYWNoZS12MC4zLjMtdTIxLjAvc3JjL21haW4uanNQSwECHgMKAAAAAAAAAAAAS9krdlMEAABTBAAAJwAAAAAAAAAAAAAApIHNMwEAQGFnb3JpYy9jYWNoZS12MC4zLjMtdTIxLjAvc3JjL3N0YXRlLmpzUEsBAh4DCgAAAAAAAAAAACP9LiSjGgAAoxoAACcAAAAAAAAAAAAAAKSBZTgBAEBhZ29yaWMvY2FjaGUtdjAuMy4zLXUyMS4wL3NyYy9zdG9yZS5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAnAAAAAAAAAAAAAACkgU1TAQBAYWdvcmljL2NhY2hlLXYwLjMuMy11MjEuMC9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAmQLNtKUfAAClHwAALAAAAAAAAAAAAAAApIHqVAEAQGFnb3JpYy9lcnRwLXYwLjE2LjMtdTIxLjAvc3JjL2Ftb3VudE1hdGguanNQSwECHgMKAAAAAAAAAAAAExpaUjEEAAAxBAAALQAAAAAAAAAAAAAApIHZdAEAQGFnb3JpYy9lcnRwLXYwLjE2LjMtdTIxLjAvc3JjL2Ftb3VudFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAALg7jKQHBgAABwYAAC0AAAAAAAAAAAAAAKSBVXkBAEBhZ29yaWMvZXJ0cC12MC4xNi4zLXUyMS4wL3NyYy9kaXNwbGF5SW5mby5qc1BLAQIeAwoAAAAAAAAAAADzX00DTQIAAE0CAAAnAAAAAAAAAAAAAACkgad/AQBAYWdvcmljL2VydHAtdjAuMTYuMy11MjEuMC9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAnWTpYR0YAAAdGAAAKwAAAAAAAAAAAAAApIE5ggEAQGFnb3JpYy9lcnRwLXYwLjE2LjMtdTIxLjAvc3JjL2lzc3VlcktpdC5qc1BLAQIeAwoAAAAAAAAAAAA06VAUEgYAABIGAABAAAAAAAAAAAAAAACkgZ+aAQBAYWdvcmljL2VydHAtdjAuMTYuMy11MjEuMC9zcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAKGY8YTQBQAA0AUAAEAAAAAAAAAAAAAAAKSBD6EBAEBhZ29yaWMvZXJ0cC12MC4xNi4zLXUyMS4wL3NyYy9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAA82r1OrsEAAC7BAAAPAAAAAAAAAAAAAAApIE9pwEAQGFnb3JpYy9lcnRwLXYwLjE2LjMtdTIxLjAvc3JjL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAIH6h8aYBgAAmAYAADwAAAAAAAAAAAAAAKSBUqwBAEBhZ29yaWMvZXJ0cC12MC4xNi4zLXUyMS4wL3NyYy9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAACeezNByQMAAMkDAAApAAAAAAAAAAAAAACkgUSzAQBAYWdvcmljL2VydHAtdjAuMTYuMy11MjEuMC9zcmMvcGF5bWVudC5qc1BLAQIeAwoAAAAAAAAAAACyW30aMCUAADAlAAAvAAAAAAAAAAAAAACkgVS3AQBAYWdvcmljL2VydHAtdjAuMTYuMy11MjEuMC9zcmMvcGF5bWVudExlZGdlci5qc1BLAQIeAwoAAAAAAAAAAAAJzaVIBxUAAAcVAAAnAAAAAAAAAAAAAACkgdHcAQBAYWdvcmljL2VydHAtdjAuMTYuMy11MjEuMC9zcmMvcHVyc2UuanNQSwECHgMKAAAAAAAAAAAATZTGQzIGAAAyBgAAMwAAAAAAAAAAAAAApIEd8gEAQGFnb3JpYy9lcnRwLXYwLjE2LjMtdTIxLjAvc3JjL3RyYW5zaWVudE5vdGlmaWVyLmpzUEsBAh4DCgAAAAAAAAAAAHAbIY50GgAAdBoAACwAAAAAAAAAAAAAAKSBoPgBAEBhZ29yaWMvZXJ0cC12MC4xNi4zLXUyMS4wL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAAC0AAAAAAAAAAAAAAKSBXhMCAEBhZ29yaWMvZXJ0cC12MC4xNi4zLXUyMS4wL3NyYy90eXBlcy1pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAD7g02yiR0AAIkdAAAtAAAAAAAAAAAAAACkgQEVAgBAYWdvcmljL2ludGVybmFsLXYwLjQuMC11MjEuMC9zcmMvY2FsbGJhY2suanNQSwECHgMKAAAAAAAAAAAAz7Ja43YGAAB2BgAAKwAAAAAAAAAAAAAApIHVMgIAQGFnb3JpYy9pbnRlcm5hbC12MC40LjAtdTIxLjAvc3JjL2NvbmZpZy5qc1BLAQIeAwoAAAAAAAAAAAC8BYikOwUAADsFAAAqAAAAAAAAAAAAAACkgZQ5AgBAYWdvcmljL2ludGVybmFsLXYwLjQuMC11MjEuMC9zcmMvZGVidWcuanNQSwECHgMKAAAAAAAAAAAA+tsENbECAACxAgAAKwAAAAAAAAAAAAAApIEXPwIAQGFnb3JpYy9pbnRlcm5hbC12MC40LjAtdTIxLjAvc3JjL2Vycm9ycy5qc1BLAQIeAwoAAAAAAAAAAACP1bh9agQAAGoEAAAqAAAAAAAAAAAAAACkgRFCAgBAYWdvcmljL2ludGVybmFsLXYwLjQuMC11MjEuMC9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAtIZysCMTAAAjEwAALQAAAAAAAAAAAAAApIHDRgIAQGFnb3JpYy9pbnRlcm5hbC12MC40LjAtdTIxLjAvc3JjL2pzLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAEKFbaLpFwAA6RcAADUAAAAAAAAAAAAAAKSBMVoCAEBhZ29yaWMvaW50ZXJuYWwtdjAuNC4wLXUyMS4wL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzUEsBAh4DCgAAAAAAAAAAABAvHn7vEgAA7xIAACwAAAAAAAAAAAAAAKSBbXICAEBhZ29yaWMvaW50ZXJuYWwtdjAuNC4wLXUyMS4wL3NyYy9tYXJzaGFsLmpzUEsBAh4DCgAAAAAAAAAAAG54O4xtBgAAbQYAADEAAAAAAAAAAAAAAKSBpoUCAEBhZ29yaWMvaW50ZXJuYWwtdjAuNC4wLXUyMS4wL3NyYy9tZXRob2QtdG9vbHMuanNQSwECHgMKAAAAAAAAAAAAsn2q0Mk2AADJNgAALAAAAAAAAAAAAAAApIFijAIAQGFnb3JpYy9pbnRlcm5hbC12MC40LjAtdTIxLjAvc3JjL21ldHJpY3MuanNQSwECHgMKAAAAAAAAAAAA5kesHwQFAAAEBQAAMQAAAAAAAAAAAAAApIF1wwIAQGFnb3JpYy9pbnRlcm5hbC12MC40LjAtdTIxLjAvc3JjL25hdHVyYWwtc29ydC5qc1BLAQIeAwoAAAAAAAAAAACaQsJezSwAAM0sAAAuAAAAAAAAAAAAAACkgcjIAgBAYWdvcmljL2ludGVybmFsLXYwLjQuMC11MjEuMC9zcmMvc2VzLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAI/wbm5CKgAAQioAADcAAAAAAAAAAAAAAKSB4fUCAEBhZ29yaWMvaW50ZXJuYWwtdjAuNC4wLXUyMS4wL3NyYy9zdG9yYWdlLXRlc3QtdXRpbHMuanNQSwECHgMKAAAAAAAAAAAAoxoUscIGAADCBgAAMgAAAAAAAAAAAAAApIF4IAMAQGFnb3JpYy9pbnRlcm5hbC12MC40LjAtdTIxLjAvc3JjL3Rlc3RpbmctdXRpbHMuanNQSwECHgMKAAAAAAAAAAAAICPKpBcDAAAXAwAAKwAAAAAAAAAAAAAApIGKJwMAQGFnb3JpYy9pbnRlcm5hbC12MC40LjAtdTIxLjAvc3JjL3RtcERpci5qc1BLAQIeAwoAAAAAAAAAAACysov1GwMAABsDAAAuAAAAAAAAAAAAAACkgeoqAwBAYWdvcmljL2ludGVybmFsLXYwLjQuMC11MjEuMC9zcmMvdHlwZUNoZWNrLmpzUEsBAh4DCgAAAAAAAAAAAA/MwsQ6BAAAOgQAAC8AAAAAAAAAAAAAAKSBUS4DAEBhZ29yaWMvaW50ZXJuYWwtdjAuNC4wLXUyMS4wL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAADAAAAAAAAAAAAAAAKSB2DIDAEBhZ29yaWMvaW50ZXJuYWwtdjAuNC4wLXUyMS4wL3NyYy90eXBlcy1pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACSdr37aQcAAGkHAAAwAAAAAAAAAAAAAACkgX40AwBAYWdvcmljL2ludGVybmFsLXYwLjQuMC11MjEuMC9zcmMvdXBncmFkZS1hcGkuanNQSwECHgMKAAAAAAAAAAAA0JZKLe8IAADvCAAAOQAAAAAAAAAAAAAApIE1PAMAQGFnb3JpYy9ub3RpZmllci12MC43LjAtdTIxLjAvc3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzUEsBAh4DCgAAAAAAAAAAAMI+7bjrBwAA6wcAACoAAAAAAAAAAAAAAKSBe0UDAEBhZ29yaWMvbm90aWZpZXItdjAuNy4wLXUyMS4wL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAAhvssEJhMAACYTAAAtAAAAAAAAAAAAAACkga5NAwBAYWdvcmljL25vdGlmaWVyLXYwLjcuMC11MjEuMC9zcmMvbm90aWZpZXIuanNQSwECHgMKAAAAAAAAAAAAB6zyet4yAADeMgAAMAAAAAAAAAAAAAAApIEfYQMAQGFnb3JpYy9ub3RpZmllci12MC43LjAtdTIxLjAvc3JjL3B1Ymxpc2gta2l0LmpzUEsBAh4DCgAAAAAAAAAAANYcJe+VCAAAlQgAADQAAAAAAAAAAAAAAKSBS5QDAEBhZ29yaWMvbm90aWZpZXItdjAuNy4wLXUyMS4wL3NyYy9zdG9yZWQtbm90aWZpZXIuanNQSwECHgMKAAAAAAAAAAAASJWAwv4XAAD+FwAALQAAAAAAAAAAAAAApIEynQMAQGFnb3JpYy9ub3RpZmllci12MC43LjAtdTIxLjAvc3JjL3N0b3Jlc3ViLmpzUEsBAh4DCgAAAAAAAAAAAFobZ3JFFgAARRYAAC4AAAAAAAAAAAAAAKSBe7UDAEBhZ29yaWMvbm90aWZpZXItdjAuNy4wLXUyMS4wL3NyYy9zdWJzY3JpYmUuanNQSwECHgMKAAAAAAAAAAAAI5l+uDkIAAA5CAAALwAAAAAAAAAAAAAApIEMzAMAQGFnb3JpYy9ub3RpZmllci12MC43LjAtdTIxLjAvc3JjL3N1YnNjcmliZXIuanNQSwECHgMKAAAAAAAAAAAAWzsF4kwEAABMBAAAKgAAAAAAAAAAAAAApIGS1AMAQGFnb3JpYy9ub3RpZmllci12MC43LjAtdTIxLjAvc3JjL3RvcGljLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAADAAAAAAAAAAAAAAAKSBJtkDAEBhZ29yaWMvbm90aWZpZXItdjAuNy4wLXUyMS4wL3NyYy90eXBlcy1pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACjkiYNFAcAABQHAAAzAAAAAAAAAAAAAACkgczaAwBAYWdvcmljL25vdGlmaWVyLXYwLjcuMC11MjEuMC90b29scy90ZXN0U3VwcG9ydHMuanNQSwECHgMKAAAAAAAAAAAAFlm/P9shAADbIQAAOQAAAAAAAAAAAAAApIEx4gMAQGFnb3JpYy9zbWFydC13YWxsZXQtdjAuNS40LXUyMS4wL3NyYy9tYXJzaGFsLWNvbnRleHRzLmpzUEsBAh4DCgAAAAAAAAAAAGw0phvmDQAA5g0AACcAAAAAAAAAAAAAAKSBYwQEAEBhZ29yaWMvc3RvcmUtdjAuOS4zLXUyMS4wL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADDM4b0+gUAAPoFAAAyAAAAAAAAAAAAAACkgY4SBABAYWdvcmljL3N0b3JlLXYwLjkuMy11MjEuMC9zcmMvbGVnYWN5L2xlZ2FjeU1hcC5qc1BLAQIeAwoAAAAAAAAAAAADF7MbogUAAKIFAAA2AAAAAAAAAAAAAACkgdgYBABAYWdvcmljL3N0b3JlLXYwLjkuMy11MjEuMC9zcmMvbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanNQSwECHgMKAAAAAAAAAAAAhqaMYgETAAABEwAANwAAAAAAAAAAAAAApIHOHgQAQGFnb3JpYy9zdG9yZS12MC45LjMtdTIxLjAvc3JjL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAAC6QDqcDQ0AAA0NAAA3AAAAAAAAAAAAAACkgSQyBABAYWdvcmljL3N0b3JlLXYwLjkuMy11MjEuMC9zcmMvc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAFm5YLrEDwAAxA8AADsAAAAAAAAAAAAAAKSBhj8EAEBhZ29yaWMvc3RvcmUtdjAuOS4zLXUyMS4wL3NyYy9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAEDsUNbLCwAAywsAADsAAAAAAAAAAAAAAKSBo08EAEBhZ29yaWMvc3RvcmUtdjAuOS4zLXUyMS4wL3NyYy9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzUEsBAh4DCgAAAAAAAAAAAEXGRT2iEAAAohAAADQAAAAAAAAAAAAAAKSBx1sEAEBhZ29yaWMvc3RvcmUtdjAuOS4zLXUyMS4wL3NyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAJwAAAAAAAAAAAAAApIG7bAQAQGFnb3JpYy9zdG9yZS12MC45LjMtdTIxLjAvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAMMMXIq/GQAAvxkAAC4AAAAAAAAAAAAAAKSBWG4EAEBhZ29yaWMvdmF0LWRhdGEtdjAuNS4zLXUyMS4wL3NyYy9leG8tdXRpbHMuanNQSwECHgMKAAAAAAAAAAAAz5zr6bYIAAC2CAAAKgAAAAAAAAAAAAAApIFjiAQAQGFnb3JpYy92YXQtZGF0YS12MC41LjMtdTIxLjAvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAC9hIJYuGAAALhgAADYAAAAAAAAAAAAAAKSBYZEEAEBhZ29yaWMvdmF0LWRhdGEtdjAuNS4zLXUyMS4wL3NyYy92YXQtZGF0YS1iaW5kaW5ncy5qc1BLAQIeAwoAAAAAAAAAAAAkUmjjAxUAAAMVAAAlAAAAAAAAAAAAAACkgeOpBABAYWdvcmljL3ZhdHMtdjAuMTYuMC11MjEuMC9zcmMvY3JjLmpzUEsBAh4DCgAAAAAAAAAAANGYmZuAJgAAgCYAACsAAAAAAAAAAAAAAKSBKb8EAEBhZ29yaWMvdmF0cy12MC4xNi4wLXUyMS4wL3NyYy9saWItYm9hcmQuanNQSwECHgMKAAAAAAAAAAAArnkXUv0PAAD9DwAAMwAAAAAAAAAAAAAApIHy5QQAQGFnb3JpYy93YWxsZXQtYmFja2VuZC12MC4xNS4wLXUyMS4wL3NyYy9hY3Rpb25zLmpzUEsBAh4DCgAAAAAAAAAAAL8f+9L4AgAA+AIAADsAAAAAAAAAAAAAAKSBQPYEAEBhZ29yaWMvd2FsbGV0LWJhY2tlbmQtdjAuMTUuMC11MjEuMC9zcmMvYmlnaW50U3RyaW5naWZ5LmpzUEsBAh4DCgAAAAAAAAAAAIxw6pX+CQAA/gkAADQAAAAAAAAAAAAAAKSBkfkEAEBhZ29yaWMvd2FsbGV0LWJhY2tlbmQtdjAuMTUuMC11MjEuMC9zcmMvZGF0ZS1ub3cuanNQSwECHgMKAAAAAAAAAAAAHbxLtcAUAADAFAAAQAAAAAAAAAAAAAAApIHhAwUAQGFnb3JpYy93YWxsZXQtYmFja2VuZC12MC4xNS4wLXUyMS4wL3NyYy9maW5kT3JNYWtlSW52aXRhdGlvbi5qc1BLAQIeAwoAAAAAAAAAAABl8RcPWQIAAFkCAAA6AAAAAAAAAAAAAACkgf8YBQBAYWdvcmljL3dhbGxldC1iYWNrZW5kLXYwLjE1LjAtdTIxLjAvc3JjL2ludGVybmFsLXR5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAM6QEOHqCQAA6gkAADcAAAAAAAAAAAAAAKSBsBsFAEBhZ29yaWMvd2FsbGV0LWJhY2tlbmQtdjAuMTUuMC11MjEuMC9zcmMvaXNzdWVyVGFibGUuanNQSwECHgMKAAAAAAAAAAAAJ97OqRglAAAYJQAAOQAAAAAAAAAAAAAApIHvJQUAQGFnb3JpYy93YWxsZXQtYmFja2VuZC12MC4xNS4wLXUyMS4wL3NyYy9saWItZGVoeWRyYXRlLmpzUEsBAh4DCgAAAAAAAAAAAFAPm8C8ywAAvMsAADYAAAAAAAAAAAAAAKSBXksFAEBhZ29yaWMvd2FsbGV0LWJhY2tlbmQtdjAuMTUuMC11MjEuMC9zcmMvbGliLXdhbGxldC5qc1BLAQIeAwoAAAAAAAAAAAA9OSnHHQMAAB0DAAAyAAAAAAAAAAAAAACkgW4XBgBAYWdvcmljL3dhbGxldC1iYWNrZW5kLXYwLjE1LjAtdTIxLjAvc3JjL3B1YnN1Yi5qc1BLAQIeAwoAAAAAAAAAAABVpJe/vEkAALxJAAAyAAAAAAAAAAAAAACkgdsaBgBAYWdvcmljL3dhbGxldC1iYWNrZW5kLXYwLjE1LjAtdTIxLjAvc3JjL3dhbGxldC5qc1BLAQIeAwoAAAAAAAAAAAD+oXTVWBwAAFgcAAA5AAAAAAAAAAAAAACkgedkBgBAYWdvcmljL3pvZS12MC4yNy4wLXUyMS4wL3NyYy9jb250cmFjdFN1cHBvcnQvcmVjb3JkZXIuanNQSwECHgMKAAAAAAAAAAAA2fSTtJYBAACWAQAAJAAAAAAAAAAAAAAApIGWgQYAQGFnb3JpYy96b25lLXYwLjMuMC11MjEuMC9kdXJhYmxlLmpzUEsBAh4DCgAAAAAAAAAAACJbYPjnEQAA5xEAACgAAAAAAAAAAAAAAKSBboMGAEBhZ29yaWMvem9uZS12MC4zLjAtdTIxLjAvc3JjL2R1cmFibGUuanNQSwECHgMKAAAAAAAAAAAA6MeBezAFAAAwBQAALAAAAAAAAAAAAAAApIGblQYAQGVuZG8vY29tbW9uLXYxLjIuMTAvYXBwbHktbGFiZWxpbmctZXJyb3IuanNQSwECHgMKAAAAAAAAAAAAWciEf6UEAAClBAAAKwAAAAAAAAAAAAAApIEVmwYAQGVuZG8vY29tbW9uLXYxLjIuMTAvZnJvbS11bmlxdWUtZW50cmllcy5qc1BLAQIeAwoAAAAAAAAAAADUTf83SgIAAEoCAAAlAAAAAAAAAAAAAACkgQOgBgBAZW5kby9jb21tb24tdjEuMi4xMC9pZGVudC1jaGVja2VyLmpzUEsBAh4DCgAAAAAAAAAAAIrXl0OQAgAAkAIAACcAAAAAAAAAAAAAAKSBkKIGAEBlbmRvL2NvbW1vbi12MS4yLjEwL2xpc3QtZGlmZmVyZW5jZS5qc1BLAQIeAwoAAAAAAAAAAAAulJoOtAMAALQDAAArAAAAAAAAAAAAAACkgWWlBgBAZW5kby9jb21tb24tdjEuMi4xMC9tYWtlLWFycmF5LWl0ZXJhdG9yLmpzUEsBAh4DCgAAAAAAAAAAAAWrzahcAgAAXAIAACUAAAAAAAAAAAAAAKSBYqkGAEBlbmRvL2NvbW1vbi12MS4yLjEwL21ha2UtaXRlcmF0b3IuanNQSwECHgMKAAAAAAAAAAAAf1UUszQDAAA0AwAAIgAAAAAAAAAAAAAApIEBrAYAQGVuZG8vY29tbW9uLXYxLjIuMTAvb2JqZWN0LW1hcC5qc1BLAQIeAwoAAAAAAAAAAAB/Vi9SMgQAADIEAAAnAAAAAAAAAAAAAACkgXWvBgBAZW5kby9jb21tb24tdjEuMi4xMC9vYmplY3QtbWV0YS1tYXAuanNQSwECHgMKAAAAAAAAAAAA8qpjsx4EAAAeBAAAJQAAAAAAAAAAAAAApIHsswYAQGVuZG8vY29tbW9uLXYxLjIuMTAvdGhyb3ctbGFiZWxlZC5qc1BLAQIeAwoAAAAAAAAAAAA0oqGpogEAAKIBAAAhAAAAAAAAAAAAAACkgU24BgBAZW5kby9lbnYtb3B0aW9ucy12MS4xLjgvaW5kZXguanNQSwECHgMKAAAAAAAAAAAALrCJHboPAAC6DwAAKwAAAAAAAAAAAAAApIEuugYAQGVuZG8vZW52LW9wdGlvbnMtdjEuMS44L3NyYy9lbnYtb3B0aW9ucy5qc1BLAQIeAwoAAAAAAAAAAABJNfbpVAgAAFQIAAAdAAAAAAAAAAAAAACkgTHKBgBAZW5kby9lcnJvcnMtdjEuMi4xMC9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADJsYMZGxYAABsWAAAjAAAAAAAAAAAAAACkgcDSBgBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMS9zcmMvRS5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAApAAAAAAAAAAAAAACkgRzpBgBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMS9zcmMvZXhwb3J0cy5qc1BLAQIeAwoAAAAAAAAAAACk4yujkQ4AAJEOAAAnAAAAAAAAAAAAAACkgbvqBgBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMS9zcmMvbG9jYWwuanNQSwECHgMKAAAAAAAAAAAAeTPsuDwPAAA8DwAANQAAAAAAAAAAAAAApIGR+QYAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEvc3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanNQSwECHgMKAAAAAAAAAAAAuHaUnV8DAABfAwAAKQAAAAAAAAAAAAAApIEgCQcAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEvc3JjL25vLXNoaW0uanNQSwECHgMKAAAAAAAAAAAAqYDDs54KAACeCgAALQAAAAAAAAAAAAAApIHGDAcAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEvc3JjL3RyYWNrLXR1cm5zLmpzUEsBAh4DCgAAAAAAAAAAAHuhoEdkAgAAZAIAACMAAAAAAAAAAAAAAKSBrxcHAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4xL3V0aWxzLmpzUEsBAh4DCgAAAAAAAAAAANxF2aNgAgAAYAIAABkAAAAAAAAAAAAAAKSBVBoHAEBlbmRvL2V4by12MS41LjkvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA4CDbws8XAADPFwAAIgAAAAAAAAAAAAAApIHrHAcAQGVuZG8vZXhvLXYxLjUuOS9zcmMvZXhvLW1ha2Vycy5qc1BLAQIeAwoAAAAAAAAAAADBKpYxAzgAAAM4AAAhAAAAAAAAAAAAAACkgfo0BwBAZW5kby9leG8tdjEuNS45L3NyYy9leG8tdG9vbHMuanNQSwECHgMKAAAAAAAAAAAA4MmhhUYCAABGAgAAJQAAAAAAAAAAAAAApIE8bQcAQGVuZG8vZXhvLXYxLjUuOS9zcmMvZ2V0LWludGVyZmFjZS5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAdAAAAAAAAAAAAAACkgcVvBwBAZW5kby9leG8tdjEuNS45L3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAgAAAAAAAAAAAAAACkgVhxBwBAZW5kby9mYXItdjEuMS4xMS9zcmMvZXhwb3J0cy5qc1BLAQIeAwoAAAAAAAAAAACpJtZQmAIAAJgCAAAeAAAAAAAAAAAAAACkge5yBwBAZW5kby9mYXItdjEuMS4xMS9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAALdVQBoIHAACCBwAAHQAAAAAAAAAAAAAApIHCdQcAQGVuZG8vbWFyc2hhbC12MS42LjQvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAlXxlmZpPAACaTwAAKgAAAAAAAAAAAAAApIF/fQcAQGVuZG8vbWFyc2hhbC12MS42LjQvc3JjL2VuY29kZVBhc3NhYmxlLmpzUEsBAh4DCgAAAAAAAAAAAM9ikvj0KwAA9CsAACsAAAAAAAAAAAAAAKSBYc0HAEBlbmRvL21hcnNoYWwtdjEuNi40L3NyYy9lbmNvZGVUb0NhcERhdGEuanNQSwECHgMKAAAAAAAAAAAA9hgbT0EsAABBLAAALQAAAAAAAAAAAAAApIGe+QcAQGVuZG8vbWFyc2hhbC12MS42LjQvc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzUEsBAh4DCgAAAAAAAAAAAOaLU7BoLwAAaC8AACoAAAAAAAAAAAAAAKSBKiYIAEBlbmRvL21hcnNoYWwtdjEuNi40L3NyYy9tYXJzaGFsLWp1c3Rpbi5qc1BLAQIeAwoAAAAAAAAAAAC+IqcbSgcAAEoHAAAtAAAAAAAAAAAAAACkgdpVCABAZW5kby9tYXJzaGFsLXYxLjYuNC9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanNQSwECHgMKAAAAAAAAAAAACTogbmEvAABhLwAAIwAAAAAAAAAAAAAApIFvXQgAQGVuZG8vbWFyc2hhbC12MS42LjQvc3JjL21hcnNoYWwuanNQSwECHgMKAAAAAAAAAAAASrDVXesuAADrLgAAJQAAAAAAAAAAAAAApIERjQgAQGVuZG8vbWFyc2hhbC12MS42LjQvc3JjL3JhbmtPcmRlci5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAhAAAAAAAAAAAAAACkgT+8CABAZW5kby9tYXJzaGFsLXYxLjYuNC9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAXpyzyswFAADMBQAAHQAAAAAAAAAAAAAApIHWvQgAQGVuZG8vbmF0LXY1LjEuMC9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAAvR2ak0KAABNCgAAIAAAAAAAAAAAAAAApIHdwwgAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAw+/2RbwGAAC8BgAAKAAAAAAAAAAAAAAApIFozggAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL2NvcHlBcnJheS5qc1BLAQIeAwoAAAAAAAAAAAAQgUTA9ggAAPYIAAApAAAAAAAAAAAAAACkgWrVCABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvY29weVJlY29yZC5qc1BLAQIeAwoAAAAAAAAAAADCN8mnngsAAJ4LAAAuAAAAAAAAAAAAAACkgafeCABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzUEsBAh4DCgAAAAAAAAAAABdXAiLTFAAA0xQAACQAAAAAAAAAAAAAAKSBkeoIAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9lcnJvci5qc1BLAQIeAwoAAAAAAAAAAADTopB8pAYAAKQGAAArAAAAAAAAAAAAAACkgab/CABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvaXRlci1oZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAGJ4eInZEgAA2RIAACcAAAAAAAAAAAAAAKSBkwYJAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9tYWtlLWZhci5qc1BLAQIeAwoAAAAAAAAAAABNwYjT3AQAANwEAAApAAAAAAAAAAAAAACkgbEZCQBAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvbWFrZVRhZ2dlZC5qc1BLAQIeAwoAAAAAAAAAAABwRFyEohcAAKIXAAAwAAAAAAAAAAAAAACkgdQeCQBAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAADJ1trdMrAADTKwAAKgAAAAAAAAAAAAAApIHENgkAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL3Bhc3NTdHlsZU9mLmpzUEsBAh4DCgAAAAAAAAAAAAOBJ0euHAAArhwAACgAAAAAAAAAAAAAAKSB32IJAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9yZW1vdGFibGUuanNQSwECHgMKAAAAAAAAAAAAx4x/OHoOAAB6DgAAKwAAAAAAAAAAAAAApIHTfwkAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL3NhZmUtcHJvbWlzZS5qc1BLAQIeAwoAAAAAAAAAAAC6Ps2heQgAAHkIAAAlAAAAAAAAAAAAAACkgZaOCQBAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvc3RyaW5nLmpzUEsBAh4DCgAAAAAAAAAAAB0bVHblCgAA5QoAACUAAAAAAAAAAAAAAKSBUpcJAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9zeW1ib2wuanNQSwECHgMKAAAAAAAAAAAA8uXyUMkHAADJBwAAJQAAAAAAAAAAAAAApIF6ogkAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL3RhZ2dlZC5qc1BLAQIeAwoAAAAAAAAAAADu3CKwZwkAAGcJAAApAAAAAAAAAAAAAACkgYaqCQBAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAkAAAAAAAAAAAAAACkgTS0CQBAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAdU2S3O8OAADvDgAAHgAAAAAAAAAAAAAApIHOtQkAQGVuZG8vcGF0dGVybnMtdjEuNS4wL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAMHqRqpVNwAAVTcAACoAAAAAAAAAAAAAAKSB+cQJAEBlbmRvL3BhdHRlcm5zLXYxLjUuMC9zcmMva2V5cy9jaGVja0tleS5qc1BLAQIeAwoAAAAAAAAAAADndpWarBkAAKwZAAAtAAAAAAAAAAAAAACkgZb8CQBAZW5kby9wYXR0ZXJucy12MS41LjAvc3JjL2tleXMvY29tcGFyZUtleXMuanNQSwECHgMKAAAAAAAAAAAAXNG2iOsOAADrDgAAKQAAAAAAAAAAAAAApIGNFgoAQGVuZG8vcGF0dGVybnMtdjEuNS4wL3NyYy9rZXlzL2NvcHlCYWcuanNQSwECHgMKAAAAAAAAAAAABxyd+3sMAAB7DAAAKQAAAAAAAAAAAAAApIG/JQoAQGVuZG8vcGF0dGVybnMtdjEuNS4wL3NyYy9rZXlzL2NvcHlTZXQuanNQSwECHgMKAAAAAAAAAAAAD8gfY3YWAAB2FgAAOQAAAAAAAAAAAAAApIGBMgoAQGVuZG8vcGF0dGVybnMtdjEuNS4wL3NyYy9rZXlzL2tleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzUEsBAh4DCgAAAAAAAAAAANICYgGRHAAAkRwAADUAAAAAAAAAAAAAAKSBTkkKAEBlbmRvL3BhdHRlcm5zLXYxLjUuMC9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzUEsBAh4DCgAAAAAAAAAAAPlRjhNJIwAASSMAADUAAAAAAAAAAAAAAKSBMmYKAEBlbmRvL3BhdHRlcm5zLXYxLjUuMC9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzUEsBAh4DCgAAAAAAAAAAAPB0UiUsGwAALBsAADYAAAAAAAAAAAAAAKSBzokKAEBlbmRvL3BhdHRlcm5zLXYxLjUuMC9zcmMvcGF0dGVybnMvZ2V0R3VhcmRQYXlsb2Fkcy5qc1BLAQIeAwoAAAAAAAAAAAAO7k4nauwAAGrsAAA1AAAAAAAAAAAAAACkgU6lCgBAZW5kby9wYXR0ZXJucy12MS41LjAvc3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAiAAAAAAAAAAAAAACkgQuSCwBAZW5kby9wYXR0ZXJucy12MS41LjAvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAD9F099iBgAAYgYAACIAAAAAAAAAAAAAAKSBo5MLAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTAvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAdYhBfmQCAABkAgAAKwAAAAAAAAAAAAAApIFFmgsAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMC9zcmMvaXMtcHJvbWlzZS5qc1BLAQIeAwoAAAAAAAAAAAA54azwWQkAAFkJAAAqAAAAAAAAAAAAAACkgfKcCwBAZW5kby9wcm9taXNlLWtpdC12MS4xLjEwL3NyYy9tZW1vLXJhY2UuanNQSwECHgMKAAAAAAAAAAAAjBsiNR8GAAAfBgAANQAAAAAAAAAAAAAApIGTpgsAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMC9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAJgAAAAAAAAAAAAAApIEFrQsAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMC9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAASdhWHrgUAAC4FAAAHQAAAAAAAAAAAAAApIGhrgsAQGVuZG8vc3RyZWFtLXYxLjIuMTAvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA7lv2v9EBAADRAQAAHAAAAAAAAAAAAAAApIGUwwsAamVzc2llLmpzLXYwLjMuNC9zcmMvbWFpbi5qc1BLAQIeAwoAAAAAAAAAAAD2YCXkgQEAAIEBAAAfAAAAAAAAAAAAAACkgZ/FCwBqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMC9FLmpzUEsBAh4DCgAAAAAAAAAAAE9a9b2mAgAApgIAACwAAAAAAAAAAAAAAKSBXccLAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcwL2FzeW5jLWdlbmVyYXRlLmpzUEsBAh4DCgAAAAAAAAAAAP56+f30AQAA9AEAACIAAAAAAAAAAAAAAKSBTcoLAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcwL21haW4uanNQSwECHgMKAAAAAAAAAAAASWghUOQHAADkBwAAJAAAAAAAAAAAAAAApIGBzAsAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzAvbWFrZXJzLmpzUEsBAh4DCgAAAAAAAAAAAGn1Uv+sAwAArAMAACkAAAAAAAAAAAAAAKSBp9QLAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcxL2FzeW5jLXRvb2xzLmpzUEsBAh4DCgAAAAAAAAAAABtoNwOWAQAAlgEAACIAAAAAAAAAAAAAAKSBmtgLAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcxL21haW4uanNQSwUGAAAAAKQApABjOQAAcNoLAAAA","endoZipBase64Sha512":"adf0f873ac86bfacdeb370f98372cf79cd9e11266c699a78cfb5155f305f6367b5d4a50ce179398dd8f7e93910b48fd93539ce2ffb1f28b5319663943af14ed1"};
|