@agoric/spawner 0.6.9-dev-a035a67.0 → 0.6.9-dev-decd4ff.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.
@@ -1 +1 @@
1
- export default {"moduleFormat":"endoZipBase64","endoZipBase64":"UEsDBAoAAAAAAAAAAAD58C96r3AAAK9wAAAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgInRhZ3MiOiBbXSwKICAiZW50cnkiOiB7CiAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zcGF3bmVyLXYwLjYuOCIsCiAgICAibW9kdWxlIjogIi4vc3JjL3ZhdC1zcGF3bmVkLmpzIgogIH0sCiAgImNvbXBhcnRtZW50cyI6IHsKICAgICJAYWdvcmljL3NwYXduZXItdjAuNi44IjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3NwYXduZXIiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9zcGF3bmVyLXYwLjYuOCIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3NwYXduZXItdjAuNi44IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2ltcG9ydC1idW5kbGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS40LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuNi40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy92YXQtc3Bhd25lZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdmF0LXNwYXduZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2YWJhMTIzYzA4MzcwZWEzZjI2ZDQ1NzU2MzY4NDY0ODE4NGY0NWIwN2RiNWJiN2YzODAwNGQ0M2Q3ZjdiZjM5ZDBmMDQyOWY3NTNhYjkzZjI0YTg4ZWFmMjc0MzIxYWM4N2I3OWU0ZDMyYTRlNGZiM2U2ZjRlZmQ0ZTRhYzNiNCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vYmFzZTY0LXYxLjAuOSI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vYmFzZTY0IiwKICAgICAgImxhYmVsIjogIkBlbmRvL2Jhc2U2NC12MS4wLjkiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vYmFzZTY0LXYxLjAuOSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICIuL2F0b2IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiYXRvYi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjJhMTkwZWQ3ZDJhYzc1Njc4NGZlMGExMDM5MzAzZmZkOWJmMDM3YzQ0MGJiZDIyZmViYTBmNDZkYzAzZGM1YjYyMTYwZmJlZTlkNDA0ZGE4Y2JmOTJkMDE0ZDlkYTY5NWFmOWZlZTkwODU3NDM0Y2UyZGI4MDU3ZDE4ZjVhNWQ3IgogICAgICAgIH0sCiAgICAgICAgIi4vYnRvYS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJidG9hLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2NjNjA4NTZhZDdkYjkwMDBlNzcyN2RhNjE0OTc4YjUwOGQ2MWZkYmQ0ZGM4MmI4MWQ0ZTM0M2UxZTEzOTJlY2JhODM5ZDQ2ZDA0OTJiMzQ1ZWE4YmFhNmZmODI2MTJiNThjZWMyYTc3ZjQ5OTc3YTY5MTc2NWQ2ZmMxNDU1MjQiCiAgICAgICAgfSwKICAgICAgICAiLi9kZWNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZGVjb2RlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTRmYTc3NmNmM2NiZDE2ZGQ4MmQ1YzMzYzgxYzIzODMwYjYyODEwMDZhZGM3ODE4MDUxNmZiMmI4MWJlNjM0NThhZGNhNTQyZTU0YWY4MDdmMmRjNzdjM2ViZjA5YWVkZGFjOGRiZTlmZDk2NDQwNmY4NGE1YjY4YjEzNTZlNmQiCiAgICAgICAgfSwKICAgICAgICAiLi9lbmNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZW5jb2RlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjk0Yjg2YWNlMDJkZGMyMjYxOTgxNTIxMWYyN2I5ZTczMmU5ZGRiZDZiMGZlYWM1MmU0Mjg1NjA1ZTk1ZTQxMWIzN2I3NTM5ZDFlNzZiMWM3Zjk4ZDJmYWRlNzlmZTcwNzFmZjgxZTc3YjQ5ZTQwYzJiOGU4ZWQyMTBlMzNkNmUiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjMxMzU4ODE5NjIzNTcwNzQ3ZDA1NjJhMjhjZjdjMmRhYTdjZjcxOGZiMDk5M2Y1ODc1N2FkZDQ5OWMwMzFkMTI4ZWU5MDEyNjBiODE5NTNjNGU5MDMyY2RhMzM4NjNiYzM4OTBjMTZjNGM1YjY5NDI4ZjRkY2RiZDg2NTM4OTZiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbW1vbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29tbW9uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTIzMjQyM2I5OWY2MDQxYzNhMGY3M2ZhNTQ3Yzg3MjhhYjdhZDkwN2ZmMTk2YTUwNWE3ZjZlNDA4MjFjZTkxNjEyNzY3MTU0ZDY0MzRjNTI4ODllZGRhODJmMTc1ZGIxYmQ2NzFkZDZlMDk5MWE2YTIwMTFjOTM2MjBjZTViYzIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGVjb2RlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kZWNvZGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiYzFlNmRiYWEyMDQwZWU5ZmIwNjViYzY2MjEzMjgyYzg1ODJhNzg2NDg0ZDBjYmE2ZDg1MzI4OWY1YjJlMTNmOWRkYzU2OTMxZTViOWMxZDExODUxYTMzN2JhNWQ0MjA2NGRhZTAwODVjZTRiMGQxMjE3NDQwOTM4MDI3MGZhNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjkxYmUyMjlkZGQwYTFhYmYyOTRmOGRiNmEyNjM1MjU4YjRhZWMzMmNjNzJmMzNkZTI4N2EwMTc1NWYyZjFhNDdiZjA3ZTc2MmFlZDhiMGMxM2JkMGUxZTc1NjhhOWI2YTQxNDI5ODJjMTkxYmRjN2I3MTI2YmMzYTFmZDQ3NjM5IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9jb21tb24tdjEuMi4xMCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vY29tbW9uIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2NvbW1vbi12MS4yLjEwIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2NvbW1vbi12MS4yLjEwIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vb2JqZWN0LW1hcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJvYmplY3QtbWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2IzZWYxYjBiOTRiNzBkNTUyYTQzYmJkYTFhYzQ2ZmJhYWQ1NjhlZTAyNDgxM2U4ZTVkODIwMjVjMTE2ZDRhMTc5MzM3MTNjYjM0MDI3NTg1OWZiM2JlM2Y1YTM5NzRhZTY1NmVmMWJlYjAxYWEwZWZhMDVlODBiZTVjMDhkMDYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlciIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vdHJhbXBvbGluZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby90cmFtcG9saW5lLXYxLjAuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vemlwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3ppcC12MS4wLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW1wb3J0LWFyY2hpdmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW1wb3J0LWFyY2hpdmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYjZhN2QzMjkzZjQzODJhZWI1YmE2Y2EzNDE2ODc1ZDQwZGZiMGQ2NDI0ZTg5YzA4MDk3NDFjYTQ3NDVlOWM2NmIyNjhlYWY1MjI5ZWY2YmNkNjIzZTg5ODc2Njg2ODI4MDViMjJiNzJhOWI3YjQwZTY1MDk4NWQyMGNhZjU4MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb21wYXJ0bWVudC1tYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbXBhcnRtZW50LW1hcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY0MzQ0NDRiYzhlYzRkZjU0NzRmMjY3NzgwMzA3ZWUxNzY0NTc4MDJkY2I0OTAzMDhmYWU2ZTE2OWM1NGM0MmVlNjIyNjg1NzJkODEzMjkzOTkwYzY4NDhkNWYzNDRkOGU1OTNhNjBlNmZjOWNlMjMxZDY4ZDNlN2FmY2YxNzk5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4dGVuc2lvbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXh0ZW5zaW9uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzRkYjAxM2JhMzVhYWM3YjJlNDNmNTk1NzBlNTcxYWUyZmQ4M2RjOGRmOTA2YWM5NzY3YjM5N2I2MTAxMmY0NmQzMjU0NmE1OWViNzg2YjRiNzliZmVkYTczZDNhMzljMTBjYTkwMGEyNjBjMjQxN2Y0YjVlZTgxZjAxYTA2OWIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW1wb3J0LWFyY2hpdmUtbGl0ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW1wb3J0LWFyY2hpdmUtbGl0ZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQwNmZjZTcxZTBjNTJiMDMyNDdmOTU5MWY4NzdmM2U4MDY3ODNiNTMyMzVhYTgxNTZkMTg5NzNiN2Q2ZGQyNTdhMWFlYjRhNzMyMjMwNzc1YjUzZDM1OTA2OTViNzhiNThlNjQxNGIyNTQzMjU2NzY4YWNmM2M5ZWY1MDI5NmJmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2ltcG9ydC1hcmNoaXZlLXBhcnNlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2ltcG9ydC1hcmNoaXZlLXBhcnNlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5Yjk5MDdmMjg0MmQzMzMwZThhMTE4ODNjMDg4OGRjZTk0ZTUwODdlNTAxNDBkNmM0Y2EwM2U0YzE3ZmUzZGI4YWRjZmExMjY0YWNhOWEzMjhjODBmZTQ5NmRkZWRjMGZhNTc0M2VhYjBiYWQyYjhkMjlhNmRlZmZiMWQwMTY4ZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbXBvcnQtYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW1wb3J0LWFyY2hpdmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkOGNiM2YxMjAyMjMzNjUxODMwYjhlODBiOWY1ZDE3MzVjZTJlZWNjMjY5NGVhYjNhNGU1MzhhMWQwMmI3MGE0YTFjZDQyYTkzMjdjMGNjYTc4MjhmYjQyYmQzODJiZGYwNTJmOWU2N2M3ZjE4NGQxN2Y5ZDMxNzc3Mzk1MmRhOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbXBvcnQtaG9vay5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW1wb3J0LWhvb2suanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhODBhNTU5ZmU5YzE2YzEwNjg2NGVjZjEyNjYwNmE0ZWQ5YWFjNGRkYmExNjEzYThhNDVhMjQ2ZWEzMWE0YzRkMjljNGU2NmM5ZjkxYzYzNDc5NDM3YzVhZWE1ZDgzZjhmN2I5NzViOTM3MzAzZTI0ZmFmNmRjYzg5ZTc4NzJjMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9qc29uLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9qc29uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMGViODNlMDkxNjMzZTU4NDdkYzc0ZDA2NDBkYTViZGM3YjQxMGRjOTA0NzJkZTA2OWNjZTU5MmFmMWQzM2I3NTY1YTlmNDVmMmMzZWEyZmZiMWUxZDBlODBkODVlNGI3M2I1OGQyOGM2OTQ4MmNiNDg5NWI3MjM3ODJlMGY0YzAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGluay5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGluay5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjMzMjQ3NjNjNjhmOGE4Y2EzNjk3NWQ5ZmRkZDgzNTQ2NzA3MTdhOWZmMWY5ODZlMTFhM2EyNjhlN2ViYzYyZjI0MTQxZDc1ZjY0YzkzMWYzMjY5OTcwYzNhNTdkMWZkOWUzMzEwOWFjMjlhM2M2OTRkMmU0Y2FhMWJlMzhkNjg5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcC1wYXJzZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcC1wYXJzZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmOTYzNjQxYjVhODg0YTAwZWZjZTYxNmExOWYzMmM0YTNhMDcwYTI0YjRkMGM3NWMzNDVmNmQyYmYxZjc3MTY1M2FjOTQyMTYyNDRjMDlmODE4ZWY0MzU0ZjE3NGZkNGQ1MzBkZDcyYmVjYjM1MmVjN2JkMTRlYjAxM2NmZWJmYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL25vZGUtbW9kdWxlLXNwZWNpZmllci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNkMDBiNGU0YmI3MTJkNjJhN2MxYmFiZTkxYzQ1MjRmNmFiM2Y0MzBkZWJhODRmYWNlY2ZhYTdlODU1M2RlMDNjMThkNDUwMmI4YTZkNjMzYWViM2U3YzU4ZTgxMWM5YTE2ZTU3MzRlOTQ0YjdkMjBkZWUzMTI2NzJmYTViYzMxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhcnNlLWJ5dGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXJzZS1ieXRlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUzZDcwN2ZiYTg3OGQ3NzlhZjAzMzdjOGFiMjllNzAwODY5NzYzMTkzMzZlNjg3M2M1NjQ5MjMyN2NlOWY4MWVjOTI3NzE1YzA0MTAzN2EyY2QwMjY3YjM5ZDBjZGYyNmUxMmIxN2IwODU4NmY3ZTI1ODU3ZjZjZmFjOWRmNmJkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhcnNlLWNqcy1zaGFyZWQtZXhwb3J0LXdyYXBwZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhcnNlLWNqcy1zaGFyZWQtZXhwb3J0LXdyYXBwZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzNWI4YjJhMGZkMzY4MmFmMTczYmZhYzFmNjBiNGJiY2U0OGRjMGE3MjIxZTc5MGIwMWJlNzhiMzMxMTNmODgyMWFhMDQyNDU0NTkwMmM2YmZhNjVhZWI3ODg4ZTFjNjUyZDA3YWFiMzA2OTU4NTYzMWE5YmRjYjRmYTZiYzZjYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXJzZS1qc29uLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXJzZS1qc29uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTM3ZTdiZWExOGY3Y2EwYWIxNTQwMzc0M2JiN2ZmZGI5MzNkMGI5YTNkZmFmMzE4ZTI4NzY2MWUwNmZkYTlhMDdjNDRjNGY4NjY0M2NlMDJlNzFkMzhiOGE1M2RjMWEyZDhjNjRhN2UzMTY5MTJjMWM0NDY3ZDhjNjY5MWMzNjkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFyc2UtcHJlLWNqcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFyc2UtcHJlLWNqcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNjZDJjZDgyZTc5OWIyYzQ0OWJlNjRjYzc3YTliOTYwMDRlN2ZhNDJhMmRmMzBhMmY2MzdiYzMzNjRmNDJmZDBjYjIzYzE5OTkwMmEzNjliYWExYmZkN2ZjYmQ4ODUwMzY5MzA1YzA4OWU3Y2U5NGZkNjMyM2JhYTg0NGUzODUzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhcnNlLXByZS1tanMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhcnNlLXByZS1tanMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1ZDA0NzlkZDZkNDAyMTQwNWFhYjEzMjMyZWU5ZDI5ZjE1NTQzZWJlYTU3MmNkOTgwMTJlYWJkY2MwN2M2MDQ3YWY1Nzk3NzJlODJmYzc2MmE0NWY1ZmY2YzY5MWQ1MWRkOWFkNjcxMGE2NDhkMDc3NjIyOTIzNDRhMmE4ZGEwNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXJzZS10ZXh0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXJzZS10ZXh0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMGY3ZDJiOGI4YjM0M2E4ZjRiYTdlNzE5NzY3NWNhYzQzZjNkYmE5MDQyMDMzN2U3MDE2MDI2ZDllMjc4ZDNiYzk1M2U5ZTgyOGE5YTczZDZiNGQ4MTQ1YTBmMGE4NmYwYjQ4NWViYjI1MWExYmY3ZWE2N2M5YmFjMzQ1Njg1MGEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcG9saWN5LWZvcm1hdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcG9saWN5LWZvcm1hdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU3NjQxMDk0MzY1OTUzNzVhNmQ2NGE1OWY5NWY3MjZlNWFhZTA4Nzg3Y2FmOWFhNTA1YTEwMWVjNmYzOTY5NGNjM2ZlZWIxODcyZDAzMDQwYTQ2ZjlkOWJhOTE2M2E1OTdlOTBiZjRkZDQwZDE5MTRmMTdmYTU1NTRlN2RkMDI3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BvbGljeS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcG9saWN5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjZkYTRkOWYwOWEyNTdiMzIwNzNlODhiMmIzNzAzNmY4ZTIxMmU1OWUyODJiOTk5NDZjMTkzNTdiODI5ZmFiNThlZDgxN2U2ZDQxNDQyNWU3YjZhNDVhNDI5OGE2M2U1NDdhZThhZDllZGU2NzQ2NDM1MTAxZDA4NTVjZjVkMTciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcG93ZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wb3dlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjMjEwMjJlNjE0ODFlZDc1YjU1NTM3ODRlODBmNDhjZTJjNWE2OTY2ZmZkMGRhNzNlZGVkOTYyNjQ4OTUzMjc4NWUzN2VhOWE1NGIyNjcwYTliZTM3ZTRkZmMyMTc3YTlhNmIzMGU1NjdlNDMzZmNlZmZiMTUwNjcwZWZjNjJhYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1leHRlcm5hbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMtZXh0ZXJuYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS44IjogewogICAgICAibmFtZSI6ICJAZW5kby9lbnYtb3B0aW9ucyIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjgiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS44IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiYmFjYTc2ZWQ3YzZiNjU2NzFmNzBiMjY0NmY2ODk0MzU3MjRkOGI5OTMwYTVmZjI5ZDFmYjMyN2VkOTZmZDQxNDQ2OTUyNTg5NjJkYWZiOTgyODYyYTJlZmMxYjAzZDBhZDk2YjMzYzJjYWU1YmViZmEzNzI2ODg2YTA2ZjY2NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbnYtb3B0aW9ucy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW52LW9wdGlvbnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5OWEzMjNjZWExOGYxOWQ3MGYyOWQ5NGU2NjdkMGMyNzU2ZDU2NmExZjg0NjliNWY2N2MxOGRiYzg1NzM0NDkxODVmNWJmNzhmYWIwNzg2ODNiMzQ5MWRhZWNkNmIzOGUwMDkyNmM1MmM3ZjQ1MGExNzAyNmVjOWE3YzliYjY5ZSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZXJyb3JzLXYxLjIuMTAiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2Vycm9ycyIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmJhYzkyYmMwYjkyMDc3ZmNhMDU3ZDA2MmNkNGY1OWJiODliZWI5MzBlODM1OTg2MzQ2YjYxYmUwMTA4MjI4MGUyODRmNWIxNDU2YmE4OGQwOTZmMjg2YjEwMWRhZDhhMmJkM2IyOGQ3MTlkNzdiOWIyZmQ2Y2ZkZmU1ZmQ5NjUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4xIjogewogICAgICAibmFtZSI6ICJAZW5kby9ldmVudHVhbC1zZW5kIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4xIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4xIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Vudi1vcHRpb25zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vudi1vcHRpb25zLXYxLjEuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvRS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvRS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQxNTVhYTNkNDE3ZDI4N2M5OWM5ODFkMjM3YjJkYWM0NzNlMTdmZmViYWUyZjNkYWEzMjk5MWJkNjEyNzVhZjBmYWZmMDc5MDdiMzA5ZDgzZDUwYjYzNTIzZmQ5MjcwOWE3YmZlOTFlODg5YmNiYzI3MWFlNWQ4ZTJjY2JlMWZmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4cG9ydHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4cG9ydHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9sb2NhbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbG9jYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlNTA3NzhmMWJlZmVjMDEwMmYwZmFjYjg3NTc3NDU5ZjgzYWJkNjZjNWQxZjkxNjA5YmI5YTMxYzM5MzQ4NGE2YTVjYzNhOTVlMTQyZTU2MjY0MWM2YWNjYTMxMjA3NjRiYTNjZmE2NTNiMjc5NmNlMzRlZDEwZjNiZWQ2NDlmZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmNmMjVjZmVhMWM0MzdiMzNhMTM0MjczMmNjODZjMThmMDM2MGE5YWRmOTY5YjViYzRjMTgyZmI3ZjM5NzQ5Zjk5NGM1NTEzOWU5ZTU2NTViZWJhOTdiNTQyZGMzNTMzNzUxZGEwNTg2OWUyMWVhMWUxZDA3YTgxMDA3MWViYTgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbm8tc2hpbS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbm8tc2hpbS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNjM2FkNzAwZDA2NTRlNmE0ZmYyNzdhZWMyNjExNTFjOTdiOTMwMDNmZDUwMjNjOGIzYTM2ZTUxZDhiOGM1OWVjZTJlOTVlMjQ1NDBhNDQ1OTNiYjY0NGY2YjEzZmFkMGZhNjRmNGI2MmQ2MDZiYzk5MDIyZDRmYzEzMjg5YjI4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RyYWNrLXR1cm5zLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90cmFjay10dXJucy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRjMDAyZjE3NTczMmQ1NTRhNGYwNzY0YTFkMjUyOThjZmEwOTIzZTQxMWQ4OTI4NDI4OTBkZmM2NGIxOGExMzUyZWE4MmIxZDhlZTc5NmQ5Y2M4ODU1NDlmNDQ3Mzg4YzljYzNhNDlmY2UwNTdhNmIxMDkyNzM2NWM1MDRmMWUxIgogICAgICAgIH0sCiAgICAgICAgIi4vdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAidXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0NjA3MTIzOGIyNWQzMDc2NmY0NDczYjM2MDc1ZGIwNTAwNGEzMDk1YjdiYTZhZGQwNDRkOTg2NjVjN2UwYzNjMzA5ZDA0ZDQzNThhYWQ4YjA1ZGQ4ZmNmMDBmN2RmMjk2MTU1YzVmODI5YjJmOGJmMzhkZGJlZmIxMGQ1ODM0OSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS40LjAiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2ltcG9ydC1idW5kbGUiLAogICAgICAibGFiZWwiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS40LjAiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS40LjAiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vYmFzZTY0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MS4wLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9pbXBvcnQtYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbXBvcnQtYXJjaGl2ZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbXBhcnRtZW50LXdyYXBwZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbXBhcnRtZW50LXdyYXBwZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmMjM0MjQwZDFmNzc1MTZjZTAxNTQ3ZmEyYzQyZDc0YjA3NzU5NTVjOGVlNTU3NjRiNDEzYTAwZjU0NTgyYjZiZWQ2MjVkODRkNDUyNjE5NGM5MDY1NzBkOTQ0OTY3NzA0Yzc5OTM5YzkyMTJiNjg5YmMxMWI4ODZjYmUxMmIzMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhY2VkODM1MmE3Zjg1NjY4NjdlYmE2MDY4YjdlMjRhODZmZGY1MDFkNzM2NGRkMDgxYzAwOTYwNmFlYTQ1MzA3MmRjN2M5MzZlOWFiOTMwZDZmMjQ5ODQwMTcxOTYzZmUzYmVjNWIyYjZiMDg5MDkxOWRhNmFlYmQ0ZDFmNGNhMyIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vbWFyc2hhbC12MS42LjQiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL21hcnNoYWwiLAogICAgICAibGFiZWwiOiAiQGVuZG8vbWFyc2hhbC12MS42LjQiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vbWFyc2hhbC12MS42LjQiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL29iamVjdC1tYXAuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY1LjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS41LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3NjM1MDMxMmYwZTJkYjZhNTAxMzdlNzJlOTY1ZGI4ZjZlMDI1YWMyYTNlOWMwOTEyYjJiMjcwN2MyZjUzYzAzZjlkN2JkNjM5NzgzMzY5M2QyZWU5MzMwYzUwNjI4ZWM4NDIxYzBjNzlkN2U2ODBjNGNmNWNmNjlhMDYyNDdjNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlUGFzc2FibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhN2M4OWU1ODQzZTEwMWVmOThkMDgxOWI1MWFlYzFjNDI0ZTFkMWViNGE0MjBlNDg0NDAyNjllMDc1OGVkMzlhOGM1NTdmNGZjOTM5NGI5MWY2MDU2MTNlNmE0NTk2YzU1MmMxODM4YmUxNGZkMzBiNWJkOGExNjk4ZTg1MTU1MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZVRvQ2FwRGF0YS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjI0ZmJmMWRlOWRiNDExMjRjZDE1NGUzNmY5MjgyNjllNWM2MTA1NjY1NzcyMjZmM2NjNDY2ODlmYTQ3ZGE5Y2I5ODU5MjM4NWZkMjg0YzcyNDZkZjY3OGI0ODFlZTA3OGYzOGEwNjE1MmJjMDQ1ZGNkZmJiMjI1MTJiZGU0MmFiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhiZDc0M2U2MzFmM2Y2ZDdkOGE4Zjc4NWE1MTZhNWMyZWJiZTcwZWJjNGY3OGNkYjJhYTcwOTNhNDYzYmM5N2M4NjZjNTc5NDg2ODE4ODZlMTllZTEwMGFmNjc2NjA1NjBhODE2MGZjMTBjMzJkNTcwNDVkYjQxNmNiMTBlMzZkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwtanVzdGluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLWp1c3Rpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE5YjIwZTUyMDU1ZmFjZDU3MTU2OTI4OThiODJiYTliZWVjOGU4ZjM3MzM1OTNkNWYxOTcxODlhOGNjYTEyY2M0OGE0ZDdkNGQ3ZTViZGY0NTNmNzM0NDRlNjI2ODRjZjVkMzlmMDVhNDBmMDQ2YjBmMzkwYWFiMTJlMjg0MzU5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjVkNGI1ZWNjYmI5YWZiYjZiYjJlNWZlNjEzMmM2OGQwMzQ0NGNiMDk0OTQ0ZGI3OTU3NTZlOGY0MjZmYjAyNDk1YWJhY2M5ZWYyMWQ2YTgxYTQ3NzAwZGNjZDAzNWI2MTQ0MTFmMDk1M2UzNmI1NzQ3NTkyYjUyNTUyZDIzNzhkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0YzQ3ODRhMzhhMzRkNTYxMzMxNmZjYzc2OGJkMzQzNTA5ZGIzODhhZWZhNTg0M2I2ZjA3MGQxMzhjNTI3OThjODBjMjYwZGZkN2E1NTZjOWVkNGNmZjNmNjgwNDUxOTNjM2RjMTM3YjM5YmRmNjYyZDFkMzQ0M2M0NWY1YzZjYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yYW5rT3JkZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JhbmtPcmRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU3MDUyOTJjZjcxZWE3ZjkxZTY1YzFlOTBjMDA3NDA4YmEwMThlODVlYTBlZjJlNzRlM2Y5OGMyOWJkYTRjNjA5NGI4ZTRlYjM4ODc1MjhjNmE2YzE5ZmZkYzFmNGI4OWZjZDQxMjNlNzMwMzAxYmRmNmE0YjY3OTU1MGNlYjQ3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9uYXQtdjUuMS4wIjogewogICAgICAibmFtZSI6ICJAZW5kby9uYXQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vbmF0LXY1LjEuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9uYXQtdjUuMS4wIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU3MzFjODI0YjFkOWI0MTc3ZmIzZmViNWExZWIwN2ExYzVkZjNjYTFlYTQ3NmExZTU1ODZlMTBjYjNmOTNjMTRkM2Q0MzZmOTE0ODk2MTkzMjkyMWVlZWYyM2ViZTMwZmI2YmIyMzMwNDRmYmVlYjc2YzZmOGUzMzU0YjllNmU1IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9wYXNzLXN0eWxlLXYxLjUuMCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcGFzcy1zdHlsZSIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjUuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjUuMCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9lbnYtb3B0aW9ucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdXRpbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU1ODQzMTYzYTc0YjkyZGUxMDZjMjI5ZTAxZTdkYWI3M2VlYzExMTdlMzgxNThkYTg1MzYyYWY5Y2ExMGZkOGVjNmZmODU3ZjlhMzliNGUyYTM3YmE2YTZiMGQ5MmY3NjM1MzA1MmE1MGFlZWQ5YzUwMDZiNDYyZTZkNjRiY2IwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvcHlBcnJheS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29weUFycmF5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDM2YzIzOGMzMGE5ZmY4NjYzZmQyNmI1NzhiYjkzZWMyMGRkNjVhYWE3ZWNkYTRjYzI4MzU2Nzk0OTE0NjQ1ODkxZGY4Zjc5ZTFiMjMyMjZhODQ5YTA3ZDRhOWY1ZGRlMzUzOTk1MzQyNmE5ZWE0MWY2MzhiZTY4ZjIxNDdkYTAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29weVJlY29yZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29weVJlY29yZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ1YmE5ZWVkMjFhYjYzZWEyZDA5ZmUyZTEyN2E0NjFjYzhhM2ViMTc4YmNmN2NmMTk1YTdmNGJhMjNhMDI1YzU4NjM3MjFjNjE5ZTQ0ZWY5NzU1MTgyM2ZhMzg4ZDI1ZjRjZDEwNTRjYjJhYzhhNjFhMGMxMWZjMzcyMWM2MGY2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZGVlcGx5RnVsZmlsbGVkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMGI2MTQwYjdjZTkwOTJmODZmNWYyMTE5ZDg3MTcxMjUyNGUyYTRlZGMzMjBlMDk3MjkyZmNiOGExYjViZjc5OWE3ZDJkZjAyOTA3Y2VkZGVhMmEyZmMzMmZjMDBiNGU5MjgzOWNjYmI2NThiNzVlNDQwMzI5MTA1ZjgxYWM5YWUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXJyb3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Vycm9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWJhZTJmMWY0MjYwMGJiOTcyOGVjMWQxZTdhY2U3ZTUzYTRmNjlkMzZkZTVhOGZjZmJjODUwZmM0ZmRhOGJlYjQ2MzdiYTYwYTVlYTBjNmNmYTBlZjVjYjlhMWQ4MjE2MWE3NzNkZDQ3ZTRkNGU3NjZjY2E2NTU4ODg4M2U5MjEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXRlci1oZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pdGVyLWhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiYWVmZDllMjM3MDlmZDFjZWM4ZDZkZDFlZDBhYzEyNTI1OWFlM2E4YmNhYTJiOTE4YmIzNzNhNjllN2VmNzlhMzljZDZkOWNmNjY3NDM2Njc2NzQ5NGUzOTM4MzMyZDI3MDM3MTA0MmY4MjMyNGM4MzQ2YmU1ODU3MThkN2JjZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlLWZhci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZS1mYXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiZTg3NTRjMjk4OTNiZGY4OGFlZDI5YzI2ZmFjMDczYjUwYTJmMDEyZWE5YzZjNDBhNTI0MTQwY2ZmY2VhZWE0YjllMmJlNGQ0NjRlMjczYmZhODRjY2QyN2RjMzQ5NzdkYzc2NzJhNDNlZmEzM2IyYTIyODg0NTFhMWEwMjE5NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlVGFnZ2VkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWtlVGFnZ2VkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWQ1ZjJjOWQ4YzQxZjFiOGJhOTg3ZWI4NzRjMjYzNTA5YjIyZDkwYWZhM2EzZjNiYjg4MWRiOWYwZTgwYmE2YTNiMzkzYTkzMGViYjI5MWU2ZjQ3M2VlNTYwNTMwZmNjZWVmM2YzMWZkMzYwZmUzMTI1OTEyNWFlZmE0ODc4ZjgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWJmNGFmOGY2OWNmMWQ0OWY3YmFmOWNhNDQyNzM0Y2M3OWI5NzJiOTk3YmRlMWIwZjhjODcwNDlhOWViZDRiZGY0ZjE2MWJmNzRkN2Q3ZGFkMTg4MTBiOWVhZGQxODIwNjhmNjIwMmQzNDZhMGJlNTBmNWM2NDI3YzA5NzA3NDYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFzc1N0eWxlT2YuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bhc3NTdHlsZU9mLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNGZjN2FmMmY2YTgxYWNlYWJmNTk5YjAxYjdiZjU2YWE2NzQ2NzQ5NGU4NTEyNTAxOWU1YjhiNTFkZmMwMWVmMGQ2NTk3OWY5MmY1ZTZiY2MzMGM1YTEyN2ExZWYxNjliOWNhOWU0ODcxODM3YmUxYjQ3MGIyODg2ZjdkYmU1Y2MiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmVtb3RhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yZW1vdGFibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiNGZjY2YwNjY3NmEwZjU1NjdkNzE3MzViZGJiZjE5OTk0NjQ4NjRhNGYyNGFhZjVjZTY1ZjE3OWZiOWM3YzcxNjMxNDVlMjE1OTE3ZWIzYjMwMWE2Zjg0YWNjY2UwZDFkMTg2YzlmNjRjOThiNmIzZTdmY2E5ZDY1M2FjOWI4OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zYWZlLXByb21pc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3NhZmUtcHJvbWlzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc2MDk3MWVkZGVjOWU5MzZiMjEyNzQ5MmZiYzZhMmQ1MDAwZTRmNGE1OTAzZTNmMTI4NmFmZjM4ODIzYmU2NTcyNWRiMjJiMDE0OGMzYzM2MjhkZGJhZWI2MzdmM2U0NDk2OWY0M2FjYTM3YjAyZjJkZDVjOGQyM2I4Zjc0YTY4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0cmluZy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RyaW5nLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmU1MzE1YTY0YmZkMzE4YWY5YjM1MGU0M2FhZGRlZjYxOGI5ZTA1MjMyMjdkZGI0MWRmM2IzNmJhNzA4NzYwMDQ1YjRjNGUxMmY4YmIwYzdlNTRhYzI0YmFkZDIxM2UwY2Y5ZDVjMDQzNmZkZDM4ZGJhNzBiNDg3MTYyYTI5MjUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3ltYm9sLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zeW1ib2wuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4OTAwMTQyODc0MTBiNzJjZjcwODhkMjY1ODQ2NjAxNzExNjcxM2Y0ZDE0MDdkY2E5NzE5ODkyNjk2NTY1ZDBhYmIxMmFmMTY0NTZlMjRkYTkxYzhhMjYyMGUwNThkMDZiOTBmOGI1MTA1ZTM1YzY5NzZiMDcwNDVmN2U1YzMxOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90YWdnZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RhZ2dlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE5MjdmMTFlYWVhNjE0YzE5MWY5OGM4ZDU3ZmM3MTQ5ZWY4ODM4MDMzN2JmZjQ5Y2FkOTM0YzdiM2ZmMWZhYjNhMDhiZTc0ZjY2ZmZlYTk1YWFhMmI5YzQ0M2IzZmUwNWNkN2Y5MDE3NWY4MzY3ZmViODc0NWJiYzI0MTg3MjczIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkYTZkY2EwM2E2OTRhYjdkYTg5OWNjY2FiMzhkNDdjMDYxODYwYjI2ZjFkNzI5MjlmMzBhZDY4NDE5MWY4MDc0M2Y4NTc3OGY0YWIwYTZjYjQ1ZDA5YzBlZWIzMGM0OThhYWIzOGE0OWM2NGU5NmFiYTRhNTQxODZkZDgyYzA4MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcHJvbWlzZS1raXQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjEwIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiZjQ2NTMzMDdmODA2ZjEzYjJhZGI1OTZiYjZlMjRjYWZlOGYwODM0NDJmOGI1MGIzMmEwZWNhYjFhZjhkZWU1MmI2YTliODNlNjRiYzJkNjZiZDVkZDQyM2RkZjA2YTEyMTQxZjlhYjhlNjRjYjI2MTQwNjRlZTY1MmQwNDAwNCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pcy1wcm9taXNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pcy1wcm9taXNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2QzYTI1NjM2ZTU0Mjc4YjMzZjZjMzYyMTQ3ODg5ZTZmZjEwYmVkYTgwYzA3ZTZhMTZkMTkwNDdiN2IzYzZhMzRkNzMwZTliM2NmYzlmODUxMWI2ZTI3YjZhNjk3NzY0Zjk2ODNkNzBkZjcwODZlMDg1ZjkzZDdmOTVmYzRmZmEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWVtby1yYWNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tZW1vLXJhY2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0MmViMGMxYTI0OTY2ZDRhYmZmYTJjMThjMmZiMjhkZDUwNGRjYjNiNzIzZDgzMDBjMTBlOTQzOTQ0OTNjNTRlMTgwMjQ1MjdmZGU3MDFkN2VkNTkzYjI2NWU0NTZkMmQ0OGMxNWUwZDUwMTAxMDhlZmQxODcyYjc0YTI1MTRjZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0Yzg0ZDA3NmUwYTQxOWZjODYzN2FiMzhmMjQ0MzM4YzQ3NmM1MDEzMmNmZTA5MDAyZGRkY2JiZmNkMzY1YmY2Y2YzZDMyYjA5ZGEzMjUyNWY3NWI2MGY1ZmM2NjBkZGMwZTA4ZjM2YTYwN2JhMDc3ZjU5OWJjNTVmMjllY2IzNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vdHJhbXBvbGluZS12MS4wLjMiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3RyYW1wb2xpbmUiLAogICAgICAibGFiZWwiOiAiQGVuZG8vdHJhbXBvbGluZS12MS4wLjMiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vdHJhbXBvbGluZS12MS4wLjMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjE0ZWFiOWFmZjc5ZTMyZDc0ZmNlOWZiYmQ1OGJmOGRjZWZkMDU2NGRiYjRkYmNlZGE5ZWJhYWM1NWY2MWUxZTMxZGViNTE1YWNmYTZjYzQzNmM3NjE4NmJlY2E2ODM0ODgxY2ZhM2Y1MmE3YjhiZDc2YTY5YjNjZDkxNjJhMjI2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RyYW1wb2xpbmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RyYW1wb2xpbmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmYmFlM2E2ZWFhYTkzNmU0YmFjYjc0YTlkZDM4ZWM1OGU4OTU3YTEyYTQwODk3NGUyMzM4MjJiZjYxNzEyZmY4MzYwMGY5OGRlOTI3YTRkM2M0NGY0ODNlMTZiNjA0ZjgxNzQ0MmUwMjdkMTdkYTk1YmYzNjY4ZTAwMzQ5NjQ5NiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vemlwLXYxLjAuOSI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vemlwIiwKICAgICAgImxhYmVsIjogIkBlbmRvL3ppcC12MS4wLjkiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vemlwLXYxLjAuOSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmRmZGI3YWQ4NDNhNzE4ODhiNTZhZTZmZGMzMWQ0MjJlMjUxMzE4ZDY4OWE4MWJhNjZmYjNkNTM0MWQwMTgzMzg5YzVhZTg4ZDZlYjA2OGMxNDA0OGQ1NzQzNDkxNzc5ZDUzNDkwNzQxYWFkMjkxYjlkZmNhMGJmYmJhNjgyODEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYnVmZmVyLXJlYWRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYnVmZmVyLXJlYWRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjllZjk1NGVhYzIwYzVlMTljMmY2ZDE4MzNjMmI1M2JkM2MzZmMxMDA0MDA4N2U3YmM3ZDY0YTJiM2ZjNTkzMzVjNjJkZWMxZGQ4YzBjY2RiMDI1ZWZkYmFjOTFiMzQ3ZTQzZjJiMzI0ZTNkOTE1NmU2N2JhZWQxN2ExNDNkZjMwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2J1ZmZlci13cml0ZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2J1ZmZlci13cml0ZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhZTc5NjhhYzZlYjg1YTVmMDVjOGM2ZTRkNjJmZjY0YTY4YWM5NDQ1MjkyN2QzY2FkZWJkYTE3ZDAzYTk1MWZmMTkzN2EyZjU3NDNiMTVlNjlhNDU1NDM5ODJlMTdjOWE4MWJmMzRjM2NhZTI2MzUzY2MxY2JiZjQzMTI1NzcyYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb21wcmVzc2lvbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29tcHJlc3Npb24uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0ZjZlMjM5ZTY0YWU2ZDk2M2IyMDhjODllZjc5ZWNjYWM4YzVhNjYzMzQ4N2NiZjY1ODNkNmY2NDdmYTlmM2VhNDVlNTlhZjRkODRjZmU4ZWFlNzliZDdkMTIyY2JjMmMyNzA4ZTYyOTAyNjc5MTI2YmYyMjFlYjZkZWRmZWU3NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jcmMzMi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY3JjMzIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3OWI3NDE3ZGE4ZGU2YTYzMTgyMDJhZTYzZGVjZDI5ZTYwMjNjOWY1ZmZlMTdkMWYyZmUxYTA2MGZlZDlmYzE4OGViMDljYTdmNWRlMDk1OGE3MzFmNGE0MmM4Njk2M2ZhODkxZTJhNmE2YTQyZDJlNzA2MWRlMjg0NmM1ZGRiYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9mb3JtYXQtcmVhZGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9mb3JtYXQtcmVhZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjU1MWQ1OWZhN2FkOTRjMjRhZjljMTBkZDRkMzYxMzNiNjUzNWNhYzIyYjI3Y2I5YmJiMjYxN2FhOWUwMmU5ZTdmZjhhMTkyODcxMmVhODM3OWMzMjhkMjc5OWJkOTA0ZTJjMGRmOWM5YzVhMmY1MjlkZjk2OGQ1NTVjZDhiMzUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZm9ybWF0LXdyaXRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZm9ybWF0LXdyaXRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjUzNzQ4M2MwODgxNjlkZTlhY2RkZDlhZjEwZjViYzRiZTBiMzU4YjRjZDg0M2VjNzE3OWFiYzMwMDJhZDBhMmQ4OTQ2OGZlZjliNTNhMzg3YjA3ZTE1ZjViZDg0MzAxMmRiZGY4M2YwOWNjOWNkY2EwNTlkYTVjMDkyNTUzYWY1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JlYWRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmVhZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDg3MDM0Yjg3ZjRlYzNlMjkzZTIxMjgzNjAwNGFiNWM5NTkwZTg2YTI1ZGMyZDc2ZWM4MWVjNzI5YzUwYzlkYTUyODQxMDY1ZmNhNDM0MzRjMWJkMDc5MjZkZDQ3NDIwMDNmNWUzODYwYTU3ZDM0NmVlMTdiZmRiZjhkNzdhZWIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc2lnbmF0dXJlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zaWduYXR1cmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyZGFlZDBmNGFiMWIxNWM5ODE2NGIxNGZkYTM1YTJmOTcwNjQ3Zjc1M2UwMTlmNzEwYmY1ZGRlOTVmZTQ0OTNiM2ZmMTExOWNmMWRmNDQ1MzdkYzE1NDNkZDdiNDJlNjcwYjRhMDVhMzVhYjBmNTI4ZGM2NjA0YzFmMWQzYjg4OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy93cml0ZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3dyaXRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI0MTA5MjlmZWFkZDYwYTZhYjIyNTUxZWQ0OWIwN2VlZjNmNjA3NDhlODYyMTBlMDA1NTU1MWRiNDlhYWUyNzViODI3Mjc0MTUxZjliOGQ4NjFiZTY5NDZmYmNkMjc5ZWJhMDVlYjIwZWQyM2MxNjhjYTY2ZGY5OTVlYjBlZDNlIgogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfVBLAwQKAAAAAAAAAAAAH1sUNdkEAADZBAAAKQAAAEBhZ29yaWMvc3Bhd25lci12MC42Ljgvc3JjL3ZhdC1zcGF3bmVkLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ltcG9ydC1idW5kbGUiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiYnVpbGRSb290T2JqZWN0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgaW1wb3J0QnVuZGxlLEZhcjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2ltcG9ydC1idW5kbGVcIiwgW1tcImltcG9ydEJ1bmRsZVwiLFskaM2PX2EgPT4gKGltcG9ydEJ1bmRsZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGJ1aWxkUm9vdE9iamVjdCwnbmFtZScse3ZhbHVlOlwiYnVpbGRSb290T2JqZWN0XCJ9KTskaM2PX29uY2UuYnVpbGRSb290T2JqZWN0KGJ1aWxkUm9vdE9iamVjdCk7XG5cblxuXG5cbmNvbnN0IGVuZG93bWVudHMgPSB7XG4gIFZhdERhdGEsXG4gIGNvbnNvbGUsXG4gIC8vXG4gIGFzc2VydDogZ2xvYmFsVGhpcy5hc3NlcnQsXG4gIEJhc2U2NDogZ2xvYmFsVGhpcy5CYXNlNjQsIC8vXG4gIFVSTDogZ2xvYmFsVGhpcy5VUkwgIC8vXG59O1xuXG4gICAgICAgZnVuY3Rpb24gYnVpbGRSb290T2JqZWN0KCkge1xuICByZXR1cm4gRmFyKCdyb290Jywge1xuICAgIGFzeW5jIGxvYWRCdW5kbGUoYnVuZGxlKSB7XG4gICAgICBjb25zdCBucyA9IGF3YWl0IGltcG9ydEJ1bmRsZShidW5kbGUsIHsgZW5kb3dtZW50cyB9KTtcbiAgICAgIGNvbnN0IHN0YXJ0Rm4gPSBucy5kZWZhdWx0O1xuICAgICAgcmV0dXJuIEZhcignc3Bhd25lZCBidW5kbGUnLCB7XG4gICAgICAgIGFzeW5jIHN0YXJ0KGFyZ3NQKSB7XG4gICAgICAgICAgY29uc3QgYXJncyA9IGF3YWl0IGFyZ3NQO1xuICAgICAgICAgIHJldHVybiBzdGFydEZuKGFyZ3MpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJidWlsZFJvb3RPYmplY3QiOlsiYnVpbGRSb290T2JqZWN0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADjUnGd1AgAAdQIAABsAAABAZW5kby9iYXNlNjQtdjEuMC45L2F0b2IuanN7ImltcG9ydHMiOlsiLi9kZWNvZGUuanMiXSwiZXhwb3J0cyI6WyJhdG9iIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZGVjb2RlQmFzZTY0OyRozY9faW1wb3J0cyhbW1wiLi9kZWNvZGUuanNcIiwgW1tcImRlY29kZUJhc2U2NFwiLFskaM2PX2EgPT4gKGRlY29kZUJhc2U2NCA9ICRozY9fYSldXV1dXSk7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgYXRvYiA9IGVuY29kZWREYXRhID0+IHtcbiAgY29uc3QgYnVmID0gZGVjb2RlQmFzZTY0KGVuY29kZWREYXRhKTtcbiAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoLi4uYnVmKTtcbn07JGjNj19vbmNlLmF0b2IoYXRvYik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhdG9iIjpbImF0b2IiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAksKTjzQDAAA0AwAAGwAAAEBlbmRvL2Jhc2U2NC12MS4wLjkvYnRvYS5qc3siaW1wb3J0cyI6WyIuL2VuY29kZS5qcyJdLCJleHBvcnRzIjpbImJ0b2EiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBlbmNvZGVCYXNlNjQ7JGjNj19pbXBvcnRzKFtbXCIuL2VuY29kZS5qc1wiLCBbW1wiZW5jb2RlQmFzZTY0XCIsWyRozY9fYSA9PiAoZW5jb2RlQmFzZTY0ID0gJGjNj19hKV1dXV1dKTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBidG9hID0gc3RyaW5nVG9FbmNvZGUgPT4ge1xuICBjb25zdCBieXRlcyA9IHN0cmluZ1RvRW5jb2RlLnNwbGl0KCcnKS5tYXAoY2hhciA9PiB7XG4gICAgY29uc3QgYiA9IGNoYXIuY2hhckNvZGVBdCgwKTtcbiAgICBpZiAoYiA+IDB4ZmYpIHtcbiAgICAgIHRocm93IEVycm9yKGBidG9hOiBjaGFyYWN0ZXIgb3V0IG9mIHJhbmdlOiAke2NoYXJ9YCk7XG4gICAgfVxuICAgIHJldHVybiBiO1xuICB9KTtcbiAgY29uc3QgYnVmID0gbmV3IFVpbnQ4QXJyYXkoYnl0ZXMpO1xuICByZXR1cm4gZW5jb2RlQmFzZTY0KGJ1Zik7XG59OyRozY9fb25jZS5idG9hKGJ0b2EpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYnRvYSI6WyJidG9hIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAR7dn+5AQAAuQEAAB0AAABAZW5kby9iYXNlNjQtdjEuMC45L2RlY29kZS5qc3siaW1wb3J0cyI6WyIuL3NyYy9kZWNvZGUuanMiXSwiZXhwb3J0cyI6W251bGxdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9kZWNvZGUuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9kZWNvZGUuanMiOltbImRlY29kZUJhc2U2NCIsImRlY29kZUJhc2U2NCJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAoValSLkBAAC5AQAAHQAAAEBlbmRvL2Jhc2U2NC12MS4wLjkvZW5jb2RlLmpzeyJpbXBvcnRzIjpbIi4vc3JjL2VuY29kZS5qcyJdLCJleHBvcnRzIjpbbnVsbF0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2VuY29kZS5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2VuY29kZS5qcyI6W1siZW5jb2RlQmFzZTY0IiwiZW5jb2RlQmFzZTY0Il1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAa++pXpAIAAKQCAAAcAAAAQGVuZG8vYmFzZTY0LXYxLjAuOS9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9lbmNvZGUuanMiLCIuL3NyYy9kZWNvZGUuanMiLCIuL2J0b2EuanMiLCIuL2F0b2IuanMiXSwiZXhwb3J0cyI6W251bGwsbnVsbCxudWxsLG51bGxdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9lbmNvZGUuanNcIiwgW11dLFtcIi4vc3JjL2RlY29kZS5qc1wiLCBbXV0sW1wiLi9idG9hLmpzXCIsIFtdXSxbXCIuL2F0b2IuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9lbmNvZGUuanMiOltbImVuY29kZUJhc2U2NCIsImVuY29kZUJhc2U2NCJdXSwiLi9zcmMvZGVjb2RlLmpzIjpbWyJkZWNvZGVCYXNlNjQiLCJkZWNvZGVCYXNlNjQiXV0sIi4vYnRvYS5qcyI6W1siYnRvYSIsImJ0b2EiXV0sIi4vYXRvYi5qcyI6W1siYXRvYiIsImF0b2IiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAB+XnPU3AwAANwMAACEAAABAZW5kby9iYXNlNjQtdjEuMC45L3NyYy9jb21tb24uanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImFscGhhYmV0NjQiLCJtb25vZHU2NCIsInBhZGRpbmciXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Ly9cblxuICAgICAgIGNvbnN0IHBhZGRpbmcgPSAnPSc7JGjNj19vbmNlLnBhZGRpbmcocGFkZGluZyk7XG5cbiAgICAgICBjb25zdCBhbHBoYWJldDY0ID1cbiAgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nO1xuXG4vKlxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5hbHBoYWJldDY0KGFscGhhYmV0NjQpO1xuICAgICAgIGNvbnN0IG1vbm9kdTY0ID0ge307JGjNj19vbmNlLm1vbm9kdTY0KG1vbm9kdTY0KTtcbmZvciAobGV0IGkgPSAwOyBpIDwgYWxwaGFiZXQ2NC5sZW5ndGg7IGkgKz0gMSkge1xuICBjb25zdCBjID0gYWxwaGFiZXQ2NFtpXTtcbiAgbW9ub2R1NjRbY10gPSBpO1xufVxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicGFkZGluZyI6WyJwYWRkaW5nIl0sImFscGhhYmV0NjQiOlsiYWxwaGFiZXQ2NCJdLCJtb25vZHU2NCI6WyJtb25vZHU2NCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADywE7BkggAAJIIAAAhAAAAQGVuZG8vYmFzZTY0LXYxLjAuOS9zcmMvZGVjb2RlLmpzeyJpbXBvcnRzIjpbIi4vY29tbW9uLmpzIl0sImV4cG9ydHMiOlsiZGVjb2RlQmFzZTY0IiwianNEZWNvZGVCYXNlNjQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtb25vZHU2NCxwYWRkaW5nOyRozY9faW1wb3J0cyhbW1wiLi9jb21tb24uanNcIiwgW1tcIm1vbm9kdTY0XCIsWyRozY9fYSA9PiAobW9ub2R1NjQgPSAkaM2PX2EpXV0sW1wicGFkZGluZ1wiLFskaM2PX2EgPT4gKHBhZGRpbmcgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBqc0RlY29kZUJhc2U2NCA9IChzdHJpbmcsIG5hbWUgPSAnPHVua25vd24+JykgPT4ge1xuICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoTWF0aC5jZWlsKChzdHJpbmcubGVuZ3RoICogNCkgLyAzKSk7XG4gIGxldCByZWdpc3RlciA9IDA7XG4gIGxldCBxdWFudHVtID0gMDtcbiAgbGV0IGkgPSAwOyAvL1xuICBsZXQgaiA9IDA7IC8vXG5cbiAgd2hpbGUgKGkgPCBzdHJpbmcubGVuZ3RoICYmIHN0cmluZ1tpXSAhPT0gcGFkZGluZykge1xuICAgIGNvbnN0IG51bWJlciA9IG1vbm9kdTY0W3N0cmluZ1tpXV07XG4gICAgaWYgKG51bWJlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBiYXNlNjQgY2hhcmFjdGVyICR7c3RyaW5nW2ldfSBpbiBzdHJpbmcgJHtuYW1lfWApO1xuICAgIH1cbiAgICByZWdpc3RlciA9IChyZWdpc3RlciA8PCA2KSB8IG51bWJlcjtcbiAgICBxdWFudHVtICs9IDY7XG4gICAgaWYgKHF1YW50dW0gPj0gOCkge1xuICAgICAgcXVhbnR1bSAtPSA4O1xuICAgICAgZGF0YVtqXSA9IHJlZ2lzdGVyID4+PiBxdWFudHVtO1xuICAgICAgaiArPSAxO1xuICAgICAgcmVnaXN0ZXIgJj0gKDEgPDwgcXVhbnR1bSkgLSAxO1xuICAgIH1cbiAgICBpICs9IDE7XG4gIH1cblxuICB3aGlsZSAocXVhbnR1bSA+IDApIHtcbiAgICBpZiAoaSA9PT0gc3RyaW5nLmxlbmd0aCB8fCBzdHJpbmdbaV0gIT09IHBhZGRpbmcpIHtcbiAgICAgIHRocm93IEVycm9yKGBNaXNzaW5nIHBhZGRpbmcgYXQgb2Zmc2V0ICR7aX0gb2Ygc3RyaW5nICR7bmFtZX1gKTtcbiAgICB9XG4gICAgLy9cbiAgICAvL1xuICAgIGkgKz0gMTtcbiAgICBxdWFudHVtIC09IDI7XG4gIH1cblxuICBpZiAoaSA8IHN0cmluZy5sZW5ndGgpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBCYXNlNjQgc3RyaW5nIGhhcyB0cmFpbGluZyBnYXJiYWdlICR7c3RyaW5nLnN1YnN0cihcbiAgICAgICAgaSxcbiAgICAgICl9IGluIHN0cmluZyAke25hbWV9YCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGRhdGEuc3ViYXJyYXkoMCwgaik7XG59O1xuXG4vL1xuLy9cbiRozY9fb25jZS5qc0RlY29kZUJhc2U2NChqc0RlY29kZUJhc2U2NCk7Y29uc3QgYWRhcHREZWNvZGVyPVxuICBuYXRpdmVEZWNvZGVCYXNlNjQgPT5cbiAgKC4uLmFyZ3MpID0+IHtcbiAgICBjb25zdCBkZWNvZGVkID0gbmF0aXZlRGVjb2RlQmFzZTY0KC4uLmFyZ3MpO1xuICAgIGlmIChkZWNvZGVkIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgcmV0dXJuIGRlY29kZWQ7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVWludDhBcnJheShkZWNvZGVkKTtcbiAgfTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgZGVjb2RlQmFzZTY0ID1cbiAgZ2xvYmFsVGhpcy5CYXNlNjQgIT09IHVuZGVmaW5lZFxuICAgID8gYWRhcHREZWNvZGVyKGdsb2JhbFRoaXMuQmFzZTY0LmRlY29kZSlcbiAgICA6IGpzRGVjb2RlQmFzZTY0OyRozY9fb25jZS5kZWNvZGVCYXNlNjQoZGVjb2RlQmFzZTY0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImpzRGVjb2RlQmFzZTY0IjpbImpzRGVjb2RlQmFzZTY0Il0sImRlY29kZUJhc2U2NCI6WyJkZWNvZGVCYXNlNjQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAjxNDN2sHAABrBwAAIQAAAEBlbmRvL2Jhc2U2NC12MS4wLjkvc3JjL2VuY29kZS5qc3siaW1wb3J0cyI6WyIuL2NvbW1vbi5qcyJdLCJleHBvcnRzIjpbImVuY29kZUJhc2U2NCIsImpzRW5jb2RlQmFzZTY0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYWxwaGFiZXQ2NCxwYWRkaW5nOyRozY9faW1wb3J0cyhbW1wiLi9jb21tb24uanNcIiwgW1tcImFscGhhYmV0NjRcIixbJGjNj19hID0+IChhbHBoYWJldDY0ID0gJGjNj19hKV1dLFtcInBhZGRpbmdcIixbJGjNj19hID0+IChwYWRkaW5nID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBqc0VuY29kZUJhc2U2NCA9IGRhdGEgPT4ge1xuICAvL1xuICAvL1xuICAvL1xuICBsZXQgc3RyaW5nID0gJyc7XG4gIGxldCByZWdpc3RlciA9IDA7XG4gIGxldCBxdWFudHVtID0gMDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCBiID0gZGF0YVtpXTtcbiAgICByZWdpc3RlciA9IChyZWdpc3RlciA8PCA4KSB8IGI7XG4gICAgcXVhbnR1bSArPSA4O1xuICAgIGlmIChxdWFudHVtID09PSAyNCkge1xuICAgICAgc3RyaW5nICs9XG4gICAgICAgIGFscGhhYmV0NjRbKHJlZ2lzdGVyID4+PiAxOCkgJiAweDNmXSArXG4gICAgICAgIGFscGhhYmV0NjRbKHJlZ2lzdGVyID4+PiAxMikgJiAweDNmXSArXG4gICAgICAgIGFscGhhYmV0NjRbKHJlZ2lzdGVyID4+PiA2KSAmIDB4M2ZdICtcbiAgICAgICAgYWxwaGFiZXQ2NFsocmVnaXN0ZXIgPj4+IDApICYgMHgzZl07XG4gICAgICByZWdpc3RlciA9IDA7XG4gICAgICBxdWFudHVtID0gMDtcbiAgICB9XG4gIH1cblxuICBzd2l0Y2ggKHF1YW50dW0pIHtcbiAgICBjYXNlIDA6XG4gICAgICBicmVhaztcbiAgICBjYXNlIDg6XG4gICAgICBzdHJpbmcgKz1cbiAgICAgICAgYWxwaGFiZXQ2NFsocmVnaXN0ZXIgPj4+IDIpICYgMHgzZl0gK1xuICAgICAgICBhbHBoYWJldDY0WyhyZWdpc3RlciA8PCA0KSAmIDB4M2ZdICtcbiAgICAgICAgcGFkZGluZyArXG4gICAgICAgIHBhZGRpbmc7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDE2OlxuICAgICAgc3RyaW5nICs9XG4gICAgICAgIGFscGhhYmV0NjRbKHJlZ2lzdGVyID4+PiAxMCkgJiAweDNmXSArXG4gICAgICAgIGFscGhhYmV0NjRbKHJlZ2lzdGVyID4+PiA0KSAmIDB4M2ZdICtcbiAgICAgICAgYWxwaGFiZXQ2NFsocmVnaXN0ZXIgPDwgMikgJiAweDNmXSArXG4gICAgICAgIHBhZGRpbmc7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgRXJyb3IoYGludGVybmFsOiBiYWQgcXVhbnR1bSAke3F1YW50dW19YCk7XG4gIH1cbiAgcmV0dXJuIHN0cmluZztcbn07XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS5qc0VuY29kZUJhc2U2NChqc0VuY29kZUJhc2U2NCk7XG4gICAgICAgY29uc3QgZW5jb2RlQmFzZTY0ID1cbiAgZ2xvYmFsVGhpcy5CYXNlNjQgIT09IHVuZGVmaW5lZCA/IGdsb2JhbFRoaXMuQmFzZTY0LmVuY29kZSA6IGpzRW5jb2RlQmFzZTY0OyRozY9fb25jZS5lbmNvZGVCYXNlNjQoZW5jb2RlQmFzZTY0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImpzRW5jb2RlQmFzZTY0IjpbImpzRW5jb2RlQmFzZTY0Il0sImVuY29kZUJhc2U2NCI6WyJlbmNvZGVCYXNlNjQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAf1UUszQDAAA0AwAAIgAAAEBlbmRvL2NvbW1vbi12MS4yLjEwL29iamVjdC1tYXAuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm9iamVjdE1hcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtjb25zdCB7IGVudHJpZXMsIGZyb21FbnRyaWVzIH0gPSBPYmplY3Q7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG9iamVjdE1hcCA9IChvcmlnaW5hbCwgbWFwRm4pID0+IHtcbiAgY29uc3QgZW50cyA9IGVudHJpZXMob3JpZ2luYWwpO1xuICBjb25zdCBtYXBFbnRzID0gZW50cy5tYXAoXG4gICAgKFtrLCB2XSkgPT4gLyogICAgICAgICAgICAgICAgICAgICAgICovIChbaywgbWFwRm4odiwgayldKSxcbiAgKTtcbiAgcmV0dXJuIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoaGFyZGVuKGZyb21FbnRyaWVzKG1hcEVudHMpKSk7XG59OyRozY9fb25jZS5vYmplY3RNYXAob2JqZWN0TWFwKTtcbmhhcmRlbihvYmplY3RNYXApO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsib2JqZWN0TWFwIjpbIm9iamVjdE1hcCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC3BWtwfQIAAH0CAAAxAAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9pbXBvcnQtYXJjaGl2ZS5qc3siaW1wb3J0cyI6WyIuL3NyYy90eXBlcy1leHRlcm5hbC5qcyIsIi4vc3JjL2ltcG9ydC1hcmNoaXZlLmpzIl0sImV4cG9ydHMiOlsibG9hZEFyY2hpdmUiLCJsb2FkQXJjaGl2ZSJdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdHlwZXMtZXh0ZXJuYWwuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvdHlwZXMtZXh0ZXJuYWwuanNcIiwgW11dLFtcIi4vc3JjL2ltcG9ydC1hcmNoaXZlLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvaW1wb3J0LWFyY2hpdmUuanMiOltbInBhcnNlQXJjaGl2ZSIsInBhcnNlQXJjaGl2ZSJdLFsibG9hZEFyY2hpdmUiLCJsb2FkQXJjaGl2ZSJdLFsiaW1wb3J0QXJjaGl2ZSIsImltcG9ydEFyY2hpdmUiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACjFBe6MLQAAjC0AADYAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9jb21wYXJ0bWVudC1tYXAuanN7ImltcG9ydHMiOlsiLi9wb2xpY3ktZm9ybWF0LmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0Q29tcGFydG1lbnRNYXAiLCJwYXRoQ29tcGFyZSIsInN0cmluZ0NvbXBhcmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnRQYWNrYWdlUG9saWN5OyRozY9faW1wb3J0cyhbW1wiLi9wb2xpY3ktZm9ybWF0LmpzXCIsIFtbXCJhc3NlcnRQYWNrYWdlUG9saWN5XCIsWyRozY9fYSA9PiAoYXNzZXJ0UGFja2FnZVBvbGljeSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vL1xuLy9cbi8vXG4vL1xuY29uc3QgcSA9IEpTT04uc3RyaW5naWZ5O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLy9cbiAgICAgICBjb25zdCBzdHJpbmdDb21wYXJlID0gKGEsIGIpID0+IChhID09PSBiID8gMCA6IGEgPCBiID8gLTEgOiAxKTtcblxuLypcblxuXG4gKi8kaM2PX29uY2Uuc3RyaW5nQ29tcGFyZShzdHJpbmdDb21wYXJlKTtcbmNvbnN0IGN1bXVsYXRpdmVMZW5ndGggPSAobGVuZ3RoLCB0ZXJtKSA9PiB7XG4gIHJldHVybiBsZW5ndGggKyB0ZXJtLmxlbmd0aDtcbn07XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgcGF0aENvbXBhcmUgPSAoYSwgYikgPT4ge1xuICAvL1xuICBpZiAoYSA9PT0gdW5kZWZpbmVkICYmIGIgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGlmIChhID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuICBpZiAoYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIC8vXG4gIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHtcbiAgICByZXR1cm4gYS5sZW5ndGggLSBiLmxlbmd0aDtcbiAgfVxuICAvL1xuICBjb25zdCBhU3VtID0gYS5yZWR1Y2UoY3VtdWxhdGl2ZUxlbmd0aCwgMCk7XG4gIGNvbnN0IGJTdW0gPSBiLnJlZHVjZShjdW11bGF0aXZlTGVuZ3RoLCAwKTtcbiAgaWYgKGFTdW0gIT09IGJTdW0pIHtcbiAgICByZXR1cm4gYVN1bSAtIGJTdW07XG4gIH1cbiAgLy9cbiAgYXNzZXJ0KGEubGVuZ3RoID09PSBiLmxlbmd0aCk7IC8vXG4gIC8vXG4gIC8vXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IGNvbXBhcmlzb24gPSBzdHJpbmdDb21wYXJlKGFbaV0sIGJbaV0pO1xuICAgIGlmIChjb21wYXJpc29uICE9PSAwKSB7XG4gICAgICByZXR1cm4gY29tcGFyaXNvbjtcbiAgICB9XG4gIH1cbiAgLy9cbiAgLy9cbiAgLy9cbiAgcmV0dXJuIDA7XG59O1xuXG4vKlxuXG5cbiAqLyRozY9fb25jZS5wYXRoQ29tcGFyZShwYXRoQ29tcGFyZSk7XG5mdW5jdGlvbiogZW51bWVyYXRlKGl0ZXJhYmxlKSB7XG4gIGxldCBpbmRleCA9IDA7XG4gIGZvciAoY29uc3QgdmFsdWUgb2YgaXRlcmFibGUpIHtcbiAgICB5aWVsZCBbaW5kZXgsIHZhbHVlXTtcbiAgICBpbmRleCArPSAxO1xuICB9XG59XG5cbi8qXG5cblxuICovXG5jb25zdCBhc3NlcnRFbXB0eU9iamVjdCA9IChvYmplY3QsIG1lc3NhZ2UpID0+IHtcbiAgYXNzZXJ0KE9iamVjdC5rZXlzKG9iamVjdCkubGVuZ3RoID09PSAwLCBtZXNzYWdlKTtcbn07XG5cbi8qXG5cblxuICovXG5jb25zdCBhc3NlcnRDb25kaXRpb25zID0gKGNvbmRpdGlvbnMsIHVybCkgPT4ge1xuICBpZiAoY29uZGl0aW9ucyA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gIGFzc2VydChcbiAgICBBcnJheS5pc0FycmF5KGNvbmRpdGlvbnMpLFxuICAgIGBjb25kaXRpb25zIG11c3QgYmUgYW4gYXJyYXksIGdvdCAke2NvbmRpdGlvbnN9IGluICR7cSh1cmwpfWAsXG4gICk7XG4gIGZvciAoY29uc3QgW2luZGV4LCB2YWx1ZV0gb2YgZW51bWVyYXRlKGNvbmRpdGlvbnMpKSB7XG4gICAgYXNzZXJ0LnR5cGVvZihcbiAgICAgIHZhbHVlLFxuICAgICAgJ3N0cmluZycsXG4gICAgICBgY29uZGl0aW9uc1ske2luZGV4fV0gbXVzdCBiZSBhIHN0cmluZywgZ290ICR7dmFsdWV9IGluICR7cSh1cmwpfWAsXG4gICAgKTtcbiAgfVxufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0Q29tcGFydG1lbnRNb2R1bGUgPSAoYWxsZWdlZE1vZHVsZSwgcGF0aCwgdXJsKSA9PiB7XG4gIGNvbnN0IHsgY29tcGFydG1lbnQsIG1vZHVsZSwgcmV0YWluZWQsIC4uLmV4dHJhIH0gPSBhbGxlZ2VkTW9kdWxlO1xuICBhc3NlcnRFbXB0eU9iamVjdChcbiAgICBleHRyYSxcbiAgICBgJHtwYXRofSBtdXN0IG5vdCBoYXZlIGV4dHJhIHByb3BlcnRpZXMsIGdvdCAke3Eoe1xuICAgICAgZXh0cmEsXG4gICAgICBjb21wYXJ0bWVudCxcbiAgICB9KX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcbiAgYXNzZXJ0LnR5cGVvZihcbiAgICBjb21wYXJ0bWVudCxcbiAgICAnc3RyaW5nJyxcbiAgICBgJHtwYXRofS5jb21wYXJ0bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtxKGNvbXBhcnRtZW50KX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcbiAgYXNzZXJ0LnR5cGVvZihcbiAgICBtb2R1bGUsXG4gICAgJ3N0cmluZycsXG4gICAgYCR7cGF0aH0ubW9kdWxlIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3EobW9kdWxlKX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcbiAgaWYgKHJldGFpbmVkICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnQudHlwZW9mKFxuICAgICAgcmV0YWluZWQsXG4gICAgICAnYm9vbGVhbicsXG4gICAgICBgJHtwYXRofS5yZXRhaW5lZCBtdXN0IGJlIGEgYm9vbGVhbiwgZ290ICR7cShyZXRhaW5lZCl9IGluICR7cSh1cmwpfWAsXG4gICAgKTtcbiAgfVxufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0RmlsZU1vZHVsZSA9IChhbGxlZ2VkTW9kdWxlLCBwYXRoLCB1cmwpID0+IHtcbiAgY29uc3QgeyBsb2NhdGlvbiwgcGFyc2VyLCBzaGE1MTIsIC4uLmV4dHJhIH0gPSBhbGxlZ2VkTW9kdWxlO1xuICBhc3NlcnRFbXB0eU9iamVjdChcbiAgICBleHRyYSxcbiAgICBgJHtwYXRofSBtdXN0IG5vdCBoYXZlIGV4dHJhIHByb3BlcnRpZXMsIGdvdCAke3EoXG4gICAgICBPYmplY3Qua2V5cyhleHRyYSksXG4gICAgKX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcbiAgYXNzZXJ0LnR5cGVvZihcbiAgICBsb2NhdGlvbixcbiAgICAnc3RyaW5nJyxcbiAgICBgJHtwYXRofS5sb2NhdGlvbiBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtxKGxvY2F0aW9uKX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcbiAgYXNzZXJ0LnR5cGVvZihcbiAgICBwYXJzZXIsXG4gICAgJ3N0cmluZycsXG4gICAgYCR7cGF0aH0ucGFyc2VyIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3EocGFyc2VyKX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcblxuICBpZiAoc2hhNTEyICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnQudHlwZW9mKFxuICAgICAgc2hhNTEyLFxuICAgICAgJ3N0cmluZycsXG4gICAgICBgJHtwYXRofS5zaGE1MTIgbXVzdCBiZSBhIHN0cmluZywgZ290ICR7cShzaGE1MTIpfSBpbiAke3EodXJsKX1gLFxuICAgICk7XG4gIH1cbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGFzc2VydEV4aXRNb2R1bGUgPSAoYWxsZWdlZE1vZHVsZSwgcGF0aCwgdXJsKSA9PiB7XG4gIGNvbnN0IHsgZXhpdCwgLi4uZXh0cmEgfSA9IGFsbGVnZWRNb2R1bGU7XG4gIGFzc2VydEVtcHR5T2JqZWN0KFxuICAgIGV4dHJhLFxuICAgIGAke3BhdGh9IG11c3Qgbm90IGhhdmUgZXh0cmEgcHJvcGVydGllcywgZ290ICR7cShcbiAgICAgIE9iamVjdC5rZXlzKGV4dHJhKSxcbiAgICApfSBpbiAke3EodXJsKX1gLFxuICApO1xuICBhc3NlcnQudHlwZW9mKFxuICAgIGV4aXQsXG4gICAgJ3N0cmluZycsXG4gICAgYCR7cGF0aH0uZXhpdCBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtxKGV4aXQpfSBpbiAke3EodXJsKX1gLFxuICApO1xufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0TW9kdWxlID0gKGFsbGVnZWRNb2R1bGUsIHBhdGgsIHVybCkgPT4ge1xuICBjb25zdCBtb2R1bGVEZXNjcmlwdG9yID0gT2JqZWN0KGFsbGVnZWRNb2R1bGUpO1xuICBhc3NlcnQoXG4gICAgYWxsZWdlZE1vZHVsZSA9PT0gbW9kdWxlRGVzY3JpcHRvciAmJiAhQXJyYXkuaXNBcnJheShtb2R1bGVEZXNjcmlwdG9yKSxcbiAgICBgJHtwYXRofSBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7YWxsZWdlZE1vZHVsZX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcblxuICBjb25zdCB7IGNvbXBhcnRtZW50LCBtb2R1bGUsIGxvY2F0aW9uLCBwYXJzZXIsIGV4aXQsIGRlZmVycmVkRXJyb3IgfSA9XG4gICAgbW9kdWxlRGVzY3JpcHRvcjtcbiAgaWYgKGNvbXBhcnRtZW50ICE9PSB1bmRlZmluZWQgfHwgbW9kdWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnRDb21wYXJ0bWVudE1vZHVsZShtb2R1bGVEZXNjcmlwdG9yLCBwYXRoLCB1cmwpO1xuICB9IGVsc2UgaWYgKGxvY2F0aW9uICE9PSB1bmRlZmluZWQgfHwgcGFyc2VyICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnRGaWxlTW9kdWxlKG1vZHVsZURlc2NyaXB0b3IsIHBhdGgsIHVybCk7XG4gIH0gZWxzZSBpZiAoZXhpdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0RXhpdE1vZHVsZShtb2R1bGVEZXNjcmlwdG9yLCBwYXRoLCB1cmwpO1xuICB9IGVsc2UgaWYgKGRlZmVycmVkRXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydC50eXBlb2YoXG4gICAgICBkZWZlcnJlZEVycm9yLFxuICAgICAgJ3N0cmluZycsXG4gICAgICBgJHtwYXRofS5kZWZlcnJlZEVycm9yIG11c3QgYmUgYSBzdHJpbmcgY29udGFpaW5nIGFuIGVycm9yIG1lc3NhZ2VgLFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgYXNzZXJ0LmZhaWwoXG4gICAgICBgJHtwYXRofSBpcyBub3QgYSB2YWxpZCBtb2R1bGUgZGVzY3JpcHRvciwgZ290ICR7cShhbGxlZ2VkTW9kdWxlKX0gaW4gJHtxKFxuICAgICAgICB1cmwsXG4gICAgICApfWAsXG4gICAgKTtcbiAgfVxufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0TW9kdWxlcyA9IChhbGxlZ2VkTW9kdWxlcywgcGF0aCwgdXJsKSA9PiB7XG4gIGNvbnN0IG1vZHVsZXMgPSBPYmplY3QoYWxsZWdlZE1vZHVsZXMpO1xuICBhc3NlcnQoXG4gICAgYWxsZWdlZE1vZHVsZXMgPT09IG1vZHVsZXMgfHwgIUFycmF5LmlzQXJyYXkobW9kdWxlcyksXG4gICAgYG1vZHVsZXMgbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke3EoYWxsZWdlZE1vZHVsZXMpfSBpbiAke3EodXJsKX1gLFxuICApO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhtb2R1bGVzKSkge1xuICAgIGFzc2VydE1vZHVsZSh2YWx1ZSwgYCR7cGF0aH0ubW9kdWxlc1ske3Eoa2V5KX1dYCwgdXJsKTtcbiAgfVxufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0UGFyc2VycyA9IChhbGxlZ2VkUGFyc2VycywgcGF0aCwgdXJsKSA9PiB7XG4gIGlmIChhbGxlZ2VkUGFyc2VycyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHBhcnNlcnMgPSBPYmplY3QoYWxsZWdlZFBhcnNlcnMpO1xuICBhc3NlcnQoXG4gICAgYWxsZWdlZFBhcnNlcnMgPT09IHBhcnNlcnMgJiYgIUFycmF5LmlzQXJyYXkocGFyc2VycyksXG4gICAgYCR7cGF0aH0ucGFyc2VycyBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7YWxsZWdlZFBhcnNlcnN9IGluICR7cSh1cmwpfWAsXG4gICk7XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGFyc2VycykpIHtcbiAgICBhc3NlcnQudHlwZW9mKFxuICAgICAga2V5LFxuICAgICAgJ3N0cmluZycsXG4gICAgICBgYWxsIGtleXMgb2YgJHtwYXRofS5wYXJzZXJzIG11c3QgYmUgc3RyaW5ncywgZ290ICR7a2V5fSBpbiAke3EodXJsKX1gLFxuICAgICk7XG4gICAgYXNzZXJ0LnR5cGVvZihcbiAgICAgIHZhbHVlLFxuICAgICAgJ3N0cmluZycsXG4gICAgICBgJHtwYXRofS5wYXJzZXJzWyR7cShrZXkpfV0gbXVzdCBiZSBhIHN0cmluZywgZ290ICR7dmFsdWV9IGluICR7cSh1cmwpfWAsXG4gICAgKTtcbiAgfVxufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0U2NvcGUgPSAoYWxsZWdlZFNjb3BlLCBwYXRoLCB1cmwpID0+IHtcbiAgY29uc3Qgc2NvcGUgPSBPYmplY3QoYWxsZWdlZFNjb3BlKTtcbiAgYXNzZXJ0KFxuICAgIGFsbGVnZWRTY29wZSA9PT0gc2NvcGUgJiYgIUFycmF5LmlzQXJyYXkoc2NvcGUpLFxuICAgIGAke3BhdGh9IG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHthbGxlZ2VkU2NvcGV9IGluICR7cSh1cmwpfWAsXG4gICk7XG5cbiAgY29uc3QgeyBjb21wYXJ0bWVudCwgLi4uZXh0cmEgfSA9IHNjb3BlO1xuICBhc3NlcnRFbXB0eU9iamVjdChcbiAgICBleHRyYSxcbiAgICBgJHtwYXRofSBtdXN0IG5vdCBoYXZlIGV4dHJhIHByb3BlcnRpZXMsIGdvdCAke3EoXG4gICAgICBPYmplY3Qua2V5cyhleHRyYSksXG4gICAgKX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcblxuICBhc3NlcnQudHlwZW9mKFxuICAgIGNvbXBhcnRtZW50LFxuICAgICdzdHJpbmcnLFxuICAgIGAke3BhdGh9LmNvbXBhcnRtZW50IG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3EoY29tcGFydG1lbnQpfSBpbiAke3EodXJsKX1gLFxuICApO1xufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0U2NvcGVzID0gKGFsbGVnZWRTY29wZXMsIHBhdGgsIHVybCkgPT4ge1xuICBpZiAoYWxsZWdlZFNjb3BlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHNjb3BlcyA9IE9iamVjdChhbGxlZ2VkU2NvcGVzKTtcbiAgYXNzZXJ0KFxuICAgIGFsbGVnZWRTY29wZXMgPT09IHNjb3BlcyAmJiAhQXJyYXkuaXNBcnJheShzY29wZXMpLFxuICAgIGAke3BhdGh9LnNjb3BlcyBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7cShhbGxlZ2VkU2NvcGVzKX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzY29wZXMpKSB7XG4gICAgYXNzZXJ0LnR5cGVvZihcbiAgICAgIGtleSxcbiAgICAgICdzdHJpbmcnLFxuICAgICAgYGFsbCBrZXlzIG9mICR7cGF0aH0uc2NvcGVzIG11c3QgYmUgc3RyaW5ncywgZ290ICR7a2V5fSBpbiAke3EodXJsKX1gLFxuICAgICk7XG4gICAgYXNzZXJ0U2NvcGUodmFsdWUsIGAke3BhdGh9LnNjb3Blc1ske3Eoa2V5KX1dYCwgdXJsKTtcbiAgfVxufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0VHlwZXMgPSAoYWxsZWdlZFR5cGVzLCBwYXRoLCB1cmwpID0+IHtcbiAgaWYgKGFsbGVnZWRUeXBlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHR5cGVzID0gT2JqZWN0KGFsbGVnZWRUeXBlcyk7XG4gIGFzc2VydChcbiAgICBhbGxlZ2VkVHlwZXMgPT09IHR5cGVzICYmICFBcnJheS5pc0FycmF5KHR5cGVzKSxcbiAgICBgJHtwYXRofS50eXBlcyBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7YWxsZWdlZFR5cGVzfSBpbiAke3EodXJsKX1gLFxuICApO1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHR5cGVzKSkge1xuICAgIGFzc2VydC50eXBlb2YoXG4gICAgICBrZXksXG4gICAgICAnc3RyaW5nJyxcbiAgICAgIGBhbGwga2V5cyBvZiAke3BhdGh9LnR5cGVzIG11c3QgYmUgc3RyaW5ncywgZ290ICR7a2V5fSBpbiAke3EodXJsKX1gLFxuICAgICk7XG4gICAgYXNzZXJ0LnR5cGVvZihcbiAgICAgIHZhbHVlLFxuICAgICAgJ3N0cmluZycsXG4gICAgICBgJHtwYXRofS50eXBlc1ske3Eoa2V5KX1dIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3ZhbHVlfSBpbiAke3EodXJsKX1gLFxuICAgICk7XG4gIH1cbn07XG5cbi8qXG5cblxuXG4gKi9cblxuY29uc3QgYXNzZXJ0UG9saWN5ID0gKFxuICBhbGxlZ2VkUG9saWN5LFxuICBwYXRoLFxuICB1cmwgPSAnPHVua25vd24tY29tcGFydG1lbnQtbWFwLmpzb24+JyxcbikgPT4ge1xuICBhc3NlcnRQYWNrYWdlUG9saWN5KGFsbGVnZWRQb2xpY3ksIGAke3BhdGh9LnBvbGljeWAsIHVybCk7XG59O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBhc3NlcnRDb21wYXJ0bWVudCA9IChhbGxlZ2VkQ29tcGFydG1lbnQsIHBhdGgsIHVybCkgPT4ge1xuICBjb25zdCBjb21wYXJ0bWVudCA9IE9iamVjdChhbGxlZ2VkQ29tcGFydG1lbnQpO1xuICBhc3NlcnQoXG4gICAgYWxsZWdlZENvbXBhcnRtZW50ID09PSBjb21wYXJ0bWVudCAmJiAhQXJyYXkuaXNBcnJheShjb21wYXJ0bWVudCksXG4gICAgYCR7cGF0aH0gbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke2FsbGVnZWRDb21wYXJ0bWVudH0gaW4gJHtxKHVybCl9YCxcbiAgKTtcblxuICBjb25zdCB7XG4gICAgbG9jYXRpb24sXG4gICAgbmFtZSxcbiAgICBsYWJlbCxcbiAgICBwYXJzZXJzLFxuICAgIHR5cGVzLFxuICAgIHNjb3BlcyxcbiAgICBtb2R1bGVzLFxuICAgIHBvbGljeSxcbiAgICAuLi5leHRyYVxuICB9ID0gY29tcGFydG1lbnQ7XG5cbiAgYXNzZXJ0RW1wdHlPYmplY3QoXG4gICAgZXh0cmEsXG4gICAgYCR7cGF0aH0gbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzLCBnb3QgJHtxKFxuICAgICAgT2JqZWN0LmtleXMoZXh0cmEpLFxuICAgICl9IGluICR7cSh1cmwpfWAsXG4gICk7XG5cbiAgYXNzZXJ0LnR5cGVvZihcbiAgICBsb2NhdGlvbixcbiAgICAnc3RyaW5nJyxcbiAgICBgJHtwYXRofS5sb2NhdGlvbiBpbiAke3EodXJsKX0gbXVzdCBiZSBzdHJpbmcsIGdvdCAke3EobG9jYXRpb24pfWAsXG4gICk7XG4gIGFzc2VydC50eXBlb2YoXG4gICAgbmFtZSxcbiAgICAnc3RyaW5nJyxcbiAgICBgJHtwYXRofS5uYW1lIGluICR7cSh1cmwpfSBtdXN0IGJlIHN0cmluZywgZ290ICR7cShuYW1lKX1gLFxuICApO1xuICBhc3NlcnQudHlwZW9mKFxuICAgIGxhYmVsLFxuICAgICdzdHJpbmcnLFxuICAgIGAke3BhdGh9LmxhYmVsIGluICR7cSh1cmwpfSBtdXN0IGJlIHN0cmluZywgZ290ICR7cShsYWJlbCl9YCxcbiAgKTtcblxuICBhc3NlcnRNb2R1bGVzKG1vZHVsZXMsIHBhdGgsIHVybCk7XG4gIGFzc2VydFBhcnNlcnMocGFyc2VycywgcGF0aCwgdXJsKTtcbiAgYXNzZXJ0U2NvcGVzKHNjb3BlcywgcGF0aCwgdXJsKTtcbiAgYXNzZXJ0VHlwZXModHlwZXMsIHBhdGgsIHVybCk7XG4gIGFzc2VydFBvbGljeShwb2xpY3ksIHBhdGgsIHVybCk7XG59O1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0Q29tcGFydG1lbnRzID0gKGFsbGVnZWRDb21wYXJ0bWVudHMsIHVybCkgPT4ge1xuICBjb25zdCBjb21wYXJ0bWVudHMgPSBPYmplY3QoYWxsZWdlZENvbXBhcnRtZW50cyk7XG4gIGFzc2VydChcbiAgICBhbGxlZ2VkQ29tcGFydG1lbnRzID09PSBjb21wYXJ0bWVudHMgfHwgIUFycmF5LmlzQXJyYXkoY29tcGFydG1lbnRzKSxcbiAgICBgY29tcGFydG1lbnRzIG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHtxKGFsbGVnZWRDb21wYXJ0bWVudHMpfSBpbiAke3EoXG4gICAgICB1cmwsXG4gICAgKX1gLFxuICApO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhjb21wYXJ0bWVudHMpKSB7XG4gICAgYXNzZXJ0Q29tcGFydG1lbnQodmFsdWUsIGBjb21wYXJ0bWVudHNbJHtxKGtleSl9XWAsIHVybCk7XG4gIH1cbn07XG5cbi8qXG5cblxuICovXG5jb25zdCBhc3NlcnRFbnRyeSA9IChhbGxlZ2VkRW50cnksIHVybCkgPT4ge1xuICBjb25zdCBlbnRyeSA9IE9iamVjdChhbGxlZ2VkRW50cnkpO1xuICBhc3NlcnQoXG4gICAgYWxsZWdlZEVudHJ5ID09PSBlbnRyeSAmJiAhQXJyYXkuaXNBcnJheShlbnRyeSksXG4gICAgYFwiZW50cnlcIiBtdXN0IGJlIGFuIG9iamVjdCBpbiBjb21wYXJ0bWVudCBtYXAsIGdvdCAke2FsbGVnZWRFbnRyeX0gaW4gJHtxKFxuICAgICAgdXJsLFxuICAgICl9YCxcbiAgKTtcbiAgY29uc3QgeyBjb21wYXJ0bWVudCwgbW9kdWxlLCAuLi5leHRyYSB9ID0gZW50cnk7XG4gIGFzc2VydEVtcHR5T2JqZWN0KFxuICAgIGV4dHJhLFxuICAgIGBcImVudHJ5XCIgbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzIGluIGNvbXBhcnRtZW50IG1hcCwgZ290ICR7cShcbiAgICAgIE9iamVjdC5rZXlzKGV4dHJhKSxcbiAgICApfSBpbiAke3EodXJsKX1gLFxuICApO1xuICBhc3NlcnQudHlwZW9mKFxuICAgIGNvbXBhcnRtZW50LFxuICAgICdzdHJpbmcnLFxuICAgIGBlbnRyeS5jb21wYXJ0bWVudCBtdXN0IGJlIGEgc3RyaW5nIGluIGNvbXBhcnRtZW50IG1hcCwgZ290ICR7Y29tcGFydG1lbnR9IGluICR7cShcbiAgICAgIHVybCxcbiAgICApfWAsXG4gICk7XG4gIGFzc2VydC50eXBlb2YoXG4gICAgbW9kdWxlLFxuICAgICdzdHJpbmcnLFxuICAgIGBlbnRyeS5tb2R1bGUgbXVzdCBiZSBhIHN0cmluZyBpbiBjb21wYXJ0bWVudCBtYXAsIGdvdCAke21vZHVsZX0gaW4gJHtxKFxuICAgICAgdXJsLFxuICAgICl9YCxcbiAgKTtcbn07XG5cbi8qXG5cblxuXG4gKi9cblxuICAgICAgIGNvbnN0IGFzc2VydENvbXBhcnRtZW50TWFwID0gKFxuICBhbGxlZ2VkQ29tcGFydG1lbnRNYXAsXG4gIHVybCA9ICc8dW5rbm93bi1jb21wYXJ0bWVudC1tYXAuanNvbj4nLFxuKSA9PiB7XG4gIGNvbnN0IGNvbXBhcnRtZW50TWFwID0gT2JqZWN0KGFsbGVnZWRDb21wYXJ0bWVudE1hcCk7XG4gIGFzc2VydChcbiAgICBhbGxlZ2VkQ29tcGFydG1lbnRNYXAgPT09IGNvbXBhcnRtZW50TWFwICYmICFBcnJheS5pc0FycmF5KGNvbXBhcnRtZW50TWFwKSxcbiAgICBgQ29tcGFydG1lbnQgbWFwIG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHthbGxlZ2VkQ29tcGFydG1lbnRNYXB9IGluICR7cShcbiAgICAgIHVybCxcbiAgICApfWAsXG4gICk7XG4gIGNvbnN0IHtcbiAgICAvL1xuICAgIC8vXG4gICAgdGFnczogY29uZGl0aW9ucyxcbiAgICBlbnRyeSxcbiAgICBjb21wYXJ0bWVudHMsXG4gICAgLi4uZXh0cmFcbiAgfSA9IE9iamVjdChjb21wYXJ0bWVudE1hcCk7XG4gIGFzc2VydEVtcHR5T2JqZWN0KFxuICAgIGV4dHJhLFxuICAgIGBDb21wYXJ0bWVudCBtYXAgbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzLCBnb3QgJHtxKFxuICAgICAgT2JqZWN0LmtleXMoZXh0cmEpLFxuICAgICl9IGluICR7cSh1cmwpfWAsXG4gICk7XG4gIGFzc2VydENvbmRpdGlvbnMoY29uZGl0aW9ucywgdXJsKTtcbiAgYXNzZXJ0RW50cnkoZW50cnksIHVybCk7XG4gIGFzc2VydENvbXBhcnRtZW50cyhjb21wYXJ0bWVudHMsIHVybCk7XG59OyRozY9fb25jZS5hc3NlcnRDb21wYXJ0bWVudE1hcChhc3NlcnRDb21wYXJ0bWVudE1hcCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzdHJpbmdDb21wYXJlIjpbInN0cmluZ0NvbXBhcmUiXSwicGF0aENvbXBhcmUiOlsicGF0aENvbXBhcmUiXSwiYXNzZXJ0Q29tcGFydG1lbnRNYXAiOlsiYXNzZXJ0Q29tcGFydG1lbnRNYXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARdfuCzoDAAA6AwAAMAAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL2V4dGVuc2lvbi5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsicGFyc2VFeHRlbnNpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcGFyc2VFeHRlbnNpb24gPSBsb2NhdGlvbiA9PiB7XG4gIGNvbnN0IGxhc3RTbGFzaCA9IGxvY2F0aW9uLmxhc3RJbmRleE9mKCcvJyk7XG4gIGlmIChsYXN0U2xhc2ggPCAwKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIGNvbnN0IGJhc2UgPSBsb2NhdGlvbi5zbGljZShsYXN0U2xhc2ggKyAxKTtcbiAgY29uc3QgbGFzdERvdCA9IGJhc2UubGFzdEluZGV4T2YoJy4nKTtcbiAgaWYgKGxhc3REb3QgPCAwKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIHJldHVybiBiYXNlLnNsaWNlKGxhc3REb3QgKyAxKTtcbn07JGjNj19vbmNlLnBhcnNlRXh0ZW5zaW9uKHBhcnNlRXh0ZW5zaW9uKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InBhcnNlRXh0ZW5zaW9uIjpbInBhcnNlRXh0ZW5zaW9uIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAi9oOyvLQAAry0AADoAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9pbXBvcnQtYXJjaGl2ZS1saXRlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3ppcCIsIi4vbGluay5qcyIsIi4vanNvbi5qcyIsIi4vcG93ZXJzLmpzIiwiLi9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanMiLCIuL2NvbXBhcnRtZW50LW1hcC5qcyIsIi4vaW1wb3J0LWhvb2suanMiLCIuL3BvbGljeS5qcyJdLCJleHBvcnRzIjpbImltcG9ydEFyY2hpdmUiLCJsb2FkQXJjaGl2ZSIsInBhcnNlQXJjaGl2ZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IFppcFJlYWRlcixsaW5rLHBhcnNlTG9jYXRlZEpzb24sdW5wYWNrUmVhZFBvd2Vycyxqb2luLGFzc2VydENvbXBhcnRtZW50TWFwLGV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIsYXR0ZW51YXRlTW9kdWxlSG9vayxlbmZvcmNlTW9kdWxlUG9saWN5OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vemlwXCIsIFtbXCJaaXBSZWFkZXJcIixbJGjNj19hID0+IChaaXBSZWFkZXIgPSAkaM2PX2EpXV1dXSxbXCIuL2xpbmsuanNcIiwgW1tcImxpbmtcIixbJGjNj19hID0+IChsaW5rID0gJGjNj19hKV1dXV0sW1wiLi9qc29uLmpzXCIsIFtbXCJwYXJzZUxvY2F0ZWRKc29uXCIsWyRozY9fYSA9PiAocGFyc2VMb2NhdGVkSnNvbiA9ICRozY9fYSldXV1dLFtcIi4vcG93ZXJzLmpzXCIsIFtbXCJ1bnBhY2tSZWFkUG93ZXJzXCIsWyRozY9fYSA9PiAodW5wYWNrUmVhZFBvd2VycyA9ICRozY9fYSldXV1dLFtcIi4vbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzXCIsIFtbXCJqb2luXCIsWyRozY9fYSA9PiAoam9pbiA9ICRozY9fYSldXV1dLFtcIi4vY29tcGFydG1lbnQtbWFwLmpzXCIsIFtbXCJhc3NlcnRDb21wYXJ0bWVudE1hcFwiLFskaM2PX2EgPT4gKGFzc2VydENvbXBhcnRtZW50TWFwID0gJGjNj19hKV1dXV0sW1wiLi9pbXBvcnQtaG9vay5qc1wiLCBbW1wiZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlclwiLFskaM2PX2EgPT4gKGV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIgPSAkaM2PX2EpXV1dXSxbXCIuL3BvbGljeS5qc1wiLCBbW1wiYXR0ZW51YXRlTW9kdWxlSG9va1wiLFskaM2PX2EgPT4gKGF0dGVudWF0ZU1vZHVsZUhvb2sgPSAkaM2PX2EpXV0sW1wiZW5mb3JjZU1vZHVsZVBvbGljeVwiLFskaM2PX2EgPT4gKGVuZm9yY2VNb2R1bGVQb2xpY3kgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgRmFpbCwgcXVvdGU6IHEgfSA9IGFzc2VydDtcblxuY29uc3QgdGV4dERlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcblxuY29uc3QgeyBhc3NpZ24sIGNyZWF0ZSwgZnJlZXplIH0gPSBPYmplY3Q7XG5cbi8qXG5cblxuICovXG5jb25zdCBwb3N0cG9uZUVycm9yVG9FeGVjdXRlID0gZXJyb3JNZXNzYWdlID0+IHtcbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cblxuICBjb25zdCByZWNvcmQgPSBmcmVlemUoe1xuICAgIGltcG9ydHM6IFtdLFxuICAgIGV4cG9ydHM6IFtdLFxuICAgIGV4ZWN1dGU6ICgpID0+IHtcbiAgICAgIHRocm93IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgfSxcbiAgfSk7XG5cbiAgcmV0dXJuIHJlY29yZDtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VBcmNoaXZlSW1wb3J0SG9va01ha2VyID0gKFxuICBnZXQsXG4gIGNvbXBhcnRtZW50cyxcbiAgYXJjaGl2ZUxvY2F0aW9uLFxuICBwYXJzZXJGb3JMYW5ndWFnZSxcbiAgY29tcHV0ZVNoYTUxMiA9IHVuZGVmaW5lZCxcbiAgY29tcHV0ZVNvdXJjZUxvY2F0aW9uID0gdW5kZWZpbmVkLFxuICBleGl0TW9kdWxlSW1wb3J0SG9vayA9IHVuZGVmaW5lZCxcbiAgY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uID0gdW5kZWZpbmVkLFxuKSA9PiB7XG4gIC8vXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBtYWtlSW1wb3J0SG9vayA9ICh7XG4gICAgcGFja2FnZUxvY2F0aW9uLFxuICAgIHBhY2thZ2VOYW1lLFxuICAgIGF0dGVudWF0b3JzXG4gICAgLy9cbiAgICAvL1xuICB9KSA9PiB7XG4gICAgLy9cbiAgICBjb25zdCBjb21wYXJ0bWVudERlc2NyaXB0b3IgPSBjb21wYXJ0bWVudHNbcGFja2FnZUxvY2F0aW9uXTtcbiAgICBjb25zdCB7IG1vZHVsZXMgfSA9IGNvbXBhcnRtZW50RGVzY3JpcHRvcjtcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgaW1wb3J0SG9vayA9IGFzeW5jIG1vZHVsZVNwZWNpZmllciA9PiB7XG4gICAgICBhd2FpdCBudWxsO1xuICAgICAgLy9cbiAgICAgIGNvbnN0IG1vZHVsZSA9IG1vZHVsZXNbbW9kdWxlU3BlY2lmaWVyXTtcbiAgICAgIGlmIChtb2R1bGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoZXhpdE1vZHVsZUltcG9ydEhvb2spIHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICBlbmZvcmNlTW9kdWxlUG9saWN5KG1vZHVsZVNwZWNpZmllciwgY29tcGFydG1lbnREZXNjcmlwdG9yLCB7XG4gICAgICAgICAgICBleGl0OiB0cnVlLFxuICAgICAgICAgICAgZXJyb3JIaW50OiBgQmxvY2tlZCBpbiBsb2FkaW5nLiAke3EoXG4gICAgICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICAgICl9IHdhcyBub3QgaW4gdGhlIGFyY2hpdmUgYW5kIGFuIGF0dGVtcHQgd2FzIG1hZGUgdG8gbG9hZCBpdCBhcyBhIGJ1aWx0aW5gLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IHJlY29yZCA9IGF3YWl0IGV4aXRNb2R1bGVJbXBvcnRIb29rKFxuICAgICAgICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICAgICAgcGFja2FnZUxvY2F0aW9uLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHJlY29yZCkge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgcmVjb3JkOiBhd2FpdCBhdHRlbnVhdGVNb2R1bGVIb29rKFxuICAgICAgICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICAgICAgICByZWNvcmQsXG4gICAgICAgICAgICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9yLnBvbGljeSxcbiAgICAgICAgICAgICAgICBhdHRlbnVhdG9ycyxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgc3BlY2lmaWVyOiBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICByZXR1cm4gcG9zdHBvbmVFcnJvclRvRXhlY3V0ZShcbiAgICAgICAgICAgICAgYENhbm5vdCBmaW5kIGV4dGVybmFsIG1vZHVsZSAke3EobW9kdWxlU3BlY2lmaWVyKX0gaW4gcGFja2FnZSAke3EoXG4gICAgICAgICAgICAgICAgcGFja2FnZUxvY2F0aW9uLFxuICAgICAgICAgICAgICApfSBpbiBhcmNoaXZlICR7cShhcmNoaXZlTG9jYXRpb24pfWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IGZpbmQgbW9kdWxlICR7cShtb2R1bGVTcGVjaWZpZXIpfSBpbiBwYWNrYWdlICR7cShcbiAgICAgICAgICAgIHBhY2thZ2VMb2NhdGlvbixcbiAgICAgICAgICApfSBpbiBhcmNoaXZlICR7cShhcmNoaXZlTG9jYXRpb24pfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAobW9kdWxlLmRlZmVycmVkRXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gcG9zdHBvbmVFcnJvclRvRXhlY3V0ZShtb2R1bGUuZGVmZXJyZWRFcnJvcik7XG4gICAgICB9XG4gICAgICBpZiAobW9kdWxlLnBhcnNlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgIGBDYW5ub3QgcGFyc2UgbW9kdWxlICR7cShtb2R1bGVTcGVjaWZpZXIpfSBpbiBwYWNrYWdlICR7cShcbiAgICAgICAgICAgIHBhY2thZ2VMb2NhdGlvbixcbiAgICAgICAgICApfSBpbiBhcmNoaXZlICR7cShhcmNoaXZlTG9jYXRpb24pfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXJzZXIgPSBwYXJzZXJGb3JMYW5ndWFnZVttb2R1bGUucGFyc2VyXTtcbiAgICAgIGlmIChwYXJzZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IHBhcnNlICR7cShtb2R1bGUucGFyc2VyKX0gbW9kdWxlICR7cShcbiAgICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICApfSBpbiBwYWNrYWdlICR7cShwYWNrYWdlTG9jYXRpb24pfSBpbiBhcmNoaXZlICR7cShhcmNoaXZlTG9jYXRpb24pfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCB7IHBhcnNlIH0gPSBwYXJzZXI7XG4gICAgICBjb25zdCBtb2R1bGVMb2NhdGlvbiA9IGAke3BhY2thZ2VMb2NhdGlvbn0vJHttb2R1bGUubG9jYXRpb259YDtcbiAgICAgIGNvbnN0IG1vZHVsZUJ5dGVzID0gZ2V0KG1vZHVsZUxvY2F0aW9uKTtcblxuICAgICAgaWYgKGNvbXB1dGVTaGE1MTIgIT09IHVuZGVmaW5lZCAmJiBtb2R1bGUuc2hhNTEyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3Qgc2hhNTEyID0gY29tcHV0ZVNoYTUxMihtb2R1bGVCeXRlcyk7XG4gICAgICAgIGlmIChzaGE1MTIgIT09IG1vZHVsZS5zaGE1MTIpIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgIGBNb2R1bGUgJHtxKG1vZHVsZS5sb2NhdGlvbil9IG9mIHBhY2thZ2UgJHtxKFxuICAgICAgICAgICAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICAgICApfSBpbiBhcmNoaXZlICR7cShcbiAgICAgICAgICAgICAgYXJjaGl2ZUxvY2F0aW9uLFxuICAgICAgICAgICAgKX0gZmFpbGVkIGEgU0hBLTUxMiBpbnRlZ3JpdHkgY2hlY2tgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IHNvdXJjZUxvY2F0aW9uID0gYGZpbGU6Ly8vJHttb2R1bGVMb2NhdGlvbn1gO1xuICAgICAgaWYgKHBhY2thZ2VOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgYmFzZSA9IHBhY2thZ2VOYW1lLnNwbGl0KCcvJykuc2xpY2UoLTEpLmpvaW4oJy8nKTtcbiAgICAgICAgc291cmNlTG9jYXRpb24gPSBgLi4uLyR7am9pbihiYXNlLCBtb2R1bGVTcGVjaWZpZXIpfWA7XG4gICAgICB9XG4gICAgICBpZiAoY29tcHV0ZVNvdXJjZUxvY2F0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc291cmNlTG9jYXRpb24gPVxuICAgICAgICAgIGNvbXB1dGVTb3VyY2VMb2NhdGlvbihwYWNrYWdlTG9jYXRpb24sIG1vZHVsZVNwZWNpZmllcikgfHxcbiAgICAgICAgICBzb3VyY2VMb2NhdGlvbjtcbiAgICAgIH1cblxuICAgICAgbGV0IHNvdXJjZU1hcFVybDtcbiAgICAgIGlmIChcbiAgICAgICAgY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgbW9kdWxlLnNoYTUxMiAhPT0gdW5kZWZpbmVkXG4gICAgICApIHtcbiAgICAgICAgc291cmNlTWFwVXJsID0gY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uKHtcbiAgICAgICAgICBjb21wYXJ0bWVudDogcGFja2FnZUxvY2F0aW9uLFxuICAgICAgICAgIG1vZHVsZTogbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICAgIGxvY2F0aW9uOiBzb3VyY2VMb2NhdGlvbixcbiAgICAgICAgICBzaGE1MTI6IG1vZHVsZS5zaGE1MTIsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvL1xuICAgICAgY29uc3QgeyByZWNvcmQgfSA9IGF3YWl0IHBhcnNlKFxuICAgICAgICBtb2R1bGVCeXRlcyxcbiAgICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICBzb3VyY2VMb2NhdGlvbixcbiAgICAgICAgcGFja2FnZUxvY2F0aW9uLFxuICAgICAgICB7XG4gICAgICAgICAgc291cmNlTWFwVXJsLFxuICAgICAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcixcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICByZXR1cm4geyByZWNvcmQsIHNwZWNpZmllcjogbW9kdWxlU3BlY2lmaWVyIH07XG4gICAgfTtcbiAgICByZXR1cm4gaW1wb3J0SG9vaztcbiAgfTtcbiAgcmV0dXJuIG1ha2VJbXBvcnRIb29rO1xufTtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcGFyc2VBcmNoaXZlID0gYXN5bmMgKFxuICBhcmNoaXZlQnl0ZXMsXG4gIGFyY2hpdmVMb2NhdGlvbiA9ICc8dW5rbm93bj4nLFxuICBvcHRpb25zID0ge30sXG4pID0+IHtcbiAgYXdhaXQgbnVsbDtcbiAgY29uc3Qge1xuICAgIGNvbXB1dGVTaGE1MTIgPSB1bmRlZmluZWQsXG4gICAgZXhwZWN0ZWRTaGE1MTIgPSB1bmRlZmluZWQsXG4gICAgY29tcHV0ZVNvdXJjZUxvY2F0aW9uID0gdW5kZWZpbmVkLFxuICAgIGNvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbiA9IHVuZGVmaW5lZCxcbiAgICBDb21wYXJ0bWVudDogQ29tcGFydG1lbnRQYXJzZU9wdGlvbiA9IENvbXBhcnRtZW50LFxuICAgIG1vZHVsZXMgPSB1bmRlZmluZWQsXG4gICAgaW1wb3J0SG9vazogZXhpdE1vZHVsZUltcG9ydEhvb2sgPSB1bmRlZmluZWQsXG4gICAgcGFyc2VyRm9yTGFuZ3VhZ2U6IHBhcnNlckZvckxhbmd1YWdlT3B0aW9uID0ge30sXG4gICAgX19uYXRpdmVfXyA9IGZhbHNlLFxuICB9ID0gb3B0aW9ucztcblxuICBjb25zdCBwYXJzZXJGb3JMYW5ndWFnZSA9IGZyZWV6ZShcbiAgICBhc3NpZ24oY3JlYXRlKG51bGwpLCBwYXJzZXJGb3JMYW5ndWFnZU9wdGlvbiksXG4gICk7XG5cbiAgY29uc3QgYXJjaGl2ZSA9IG5ldyBaaXBSZWFkZXIoYXJjaGl2ZUJ5dGVzLCB7IG5hbWU6IGFyY2hpdmVMb2NhdGlvbiB9KTtcblxuICAvL1xuICBjb25zdCB1bnNlZW4gPSBuZXcgU2V0KGFyY2hpdmUuZmlsZXMua2V5cygpKTtcbiAgdW5zZWVuLnNpemUgPj0gMiB8fFxuICAgIEZhaWxgQXJjaGl2ZSBmYWlsZWQgc2FuaXR5IGNoZWNrOiBzaG91bGQgY29udGFpbiBhdCBsZWFzdCBhIGNvbXBhcnRtZW50IG1hcCBmaWxlIGFuZCBvbmUgbW9kdWxlIGZpbGUgaW4gJHtxKFxuICAgICAgYXJjaGl2ZUxvY2F0aW9uLFxuICAgICl9YDtcblxuICAvKlxuXG4gICAqL1xuICBjb25zdCBnZXQgPSBwYXRoID0+IHtcbiAgICB1bnNlZW4uZGVsZXRlKHBhdGgpO1xuICAgIHJldHVybiBhcmNoaXZlLnJlYWQocGF0aCk7XG4gIH07XG5cbiAgY29uc3QgY29tcGFydG1lbnRNYXBCeXRlcyA9IGdldCgnY29tcGFydG1lbnQtbWFwLmpzb24nKTtcblxuICBsZXQgc2hhNTEyO1xuICBpZiAoY29tcHV0ZVNoYTUxMiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgc2hhNTEyID0gY29tcHV0ZVNoYTUxMihjb21wYXJ0bWVudE1hcEJ5dGVzKTtcbiAgfVxuICBpZiAoZXhwZWN0ZWRTaGE1MTIgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChzaGE1MTIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgdmVyaWZ5IGV4cGVjdGVkU2hhNTEyIHdpdGhvdXQgYWxzbyBwcm92aWRpbmcgY29tcHV0ZVNoYTUxMiwgZm9yIGFyY2hpdmUgJHthcmNoaXZlTG9jYXRpb259YCxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChzaGE1MTIgIT09IGV4cGVjdGVkU2hhNTEyKSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgYEFyY2hpdmUgY29tcGFydG1lbnQgbWFwIGZhaWxlZCBhIFNIQS01MTIgaW50ZWdyaXR5IGNoZWNrLCBleHBlY3RlZCAke2V4cGVjdGVkU2hhNTEyfSwgZ290ICR7c2hhNTEyfSwgZm9yIGFyY2hpdmUgJHthcmNoaXZlTG9jYXRpb259YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIGNvbnN0IGNvbXBhcnRtZW50TWFwVGV4dCA9IHRleHREZWNvZGVyLmRlY29kZShjb21wYXJ0bWVudE1hcEJ5dGVzKTtcbiAgY29uc3QgY29tcGFydG1lbnRNYXAgPSBwYXJzZUxvY2F0ZWRKc29uKFxuICAgIGNvbXBhcnRtZW50TWFwVGV4dCxcbiAgICAnY29tcGFydG1lbnQtbWFwLmpzb24nLFxuICApO1xuICBhc3NlcnRDb21wYXJ0bWVudE1hcChjb21wYXJ0bWVudE1hcCwgYXJjaGl2ZUxvY2F0aW9uKTtcblxuICBjb25zdCB7XG4gICAgY29tcGFydG1lbnRzLFxuICAgIGVudHJ5OiB7IG1vZHVsZTogZW50cnlNb2R1bGVTcGVjaWZpZXIsIGNvbXBhcnRtZW50OiBlbnRyeUNvbXBhcnRtZW50TmFtZSB9LFxuICB9ID0gY29tcGFydG1lbnRNYXA7XG5cbiAgY29uc3QgY29tcGFydG1lbnRFeGl0TW9kdWxlSW1wb3J0SG9vayA9IGV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIoe1xuICAgIG1vZHVsZXMsXG4gICAgZXhpdE1vZHVsZUltcG9ydEhvb2ssXG4gICAgZW50cnlDb21wYXJ0bWVudE5hbWUsXG4gIH0pO1xuXG4gIC8vXG4gIC8vXG4gIC8vXG4gIGlmIChjb21wdXRlU2hhNTEyICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBtYWtlSW1wb3J0SG9vayA9IG1ha2VBcmNoaXZlSW1wb3J0SG9va01ha2VyKFxuICAgICAgZ2V0LFxuICAgICAgY29tcGFydG1lbnRzLFxuICAgICAgYXJjaGl2ZUxvY2F0aW9uLFxuICAgICAgcGFyc2VyRm9yTGFuZ3VhZ2UsXG4gICAgICBjb21wdXRlU2hhNTEyLFxuICAgICAgY29tcHV0ZVNvdXJjZUxvY2F0aW9uLFxuICAgICAgY29tcGFydG1lbnRFeGl0TW9kdWxlSW1wb3J0SG9vayxcbiAgICAgIGNvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbixcbiAgICApO1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgY29uc3QgeyBjb21wYXJ0bWVudCwgcGVuZGluZ0pvYnNQcm9taXNlIH0gPSBsaW5rKGNvbXBhcnRtZW50TWFwLCB7XG4gICAgICBtYWtlSW1wb3J0SG9vayxcbiAgICAgIHBhcnNlckZvckxhbmd1YWdlLFxuICAgICAgbW9kdWxlczogT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3Qua2V5cyhtb2R1bGVzIHx8IHt9KS5tYXAoc3BlY2lmaWVyID0+IHtcbiAgICAgICAgICByZXR1cm4gW3NwZWNpZmllciwgeyBuYW1lc3BhY2U6IHt9IH1dO1xuICAgICAgICB9KSxcbiAgICAgICksXG4gICAgICBDb21wYXJ0bWVudDogQ29tcGFydG1lbnRQYXJzZU9wdGlvbixcbiAgICAgIF9fbmF0aXZlX18sXG4gICAgfSk7XG5cbiAgICBhd2FpdCBwZW5kaW5nSm9ic1Byb21pc2U7XG5cbiAgICBhd2FpdCBjb21wYXJ0bWVudC5sb2FkKGVudHJ5TW9kdWxlU3BlY2lmaWVyKTtcbiAgICB1bnNlZW4uc2l6ZSA9PT0gMCB8fFxuICAgICAgRmFpbGBBcmNoaXZlIGNvbnRhaW5zIGV4dHJhbmVvdXMgZmlsZXM6ICR7cShbLi4udW5zZWVuXSl9IGluICR7cShcbiAgICAgICAgYXJjaGl2ZUxvY2F0aW9uLFxuICAgICAgKX1gO1xuICB9XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGV4ZWN1dGUgPSBhc3luYyBvcHRpb25zID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBnbG9iYWxzLFxuICAgICAgbW9kdWxlcyxcbiAgICAgIHRyYW5zZm9ybXMsXG4gICAgICBfX3NoaW1UcmFuc2Zvcm1zX18sXG4gICAgICBDb21wYXJ0bWVudDogQ29tcGFydG1lbnRPcHRpb24gPSBDb21wYXJ0bWVudFBhcnNlT3B0aW9uLFxuICAgICAgX19uYXRpdmVfXyxcbiAgICAgIGltcG9ydEhvb2s6IGV4aXRNb2R1bGVJbXBvcnRIb29rLFxuICAgIH0gPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgY29uc3QgY29tcGFydG1lbnRFeGl0TW9kdWxlSW1wb3J0SG9vayA9IGV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIoe1xuICAgICAgbW9kdWxlcyxcbiAgICAgIGV4aXRNb2R1bGVJbXBvcnRIb29rLFxuICAgICAgZW50cnlDb21wYXJ0bWVudE5hbWUsXG4gICAgfSk7XG4gICAgY29uc3QgbWFrZUltcG9ydEhvb2sgPSBtYWtlQXJjaGl2ZUltcG9ydEhvb2tNYWtlcihcbiAgICAgIGdldCxcbiAgICAgIGNvbXBhcnRtZW50cyxcbiAgICAgIGFyY2hpdmVMb2NhdGlvbixcbiAgICAgIHBhcnNlckZvckxhbmd1YWdlLFxuICAgICAgY29tcHV0ZVNoYTUxMixcbiAgICAgIGNvbXB1dGVTb3VyY2VMb2NhdGlvbixcbiAgICAgIGNvbXBhcnRtZW50RXhpdE1vZHVsZUltcG9ydEhvb2ssXG4gICAgICBjb21wdXRlU291cmNlTWFwTG9jYXRpb24sXG4gICAgKTtcbiAgICBjb25zdCB7IGNvbXBhcnRtZW50LCBwZW5kaW5nSm9ic1Byb21pc2UgfSA9IGxpbmsoY29tcGFydG1lbnRNYXAsIHtcbiAgICAgIG1ha2VJbXBvcnRIb29rLFxuICAgICAgcGFyc2VyRm9yTGFuZ3VhZ2UsXG4gICAgICBnbG9iYWxzLFxuICAgICAgbW9kdWxlcyxcbiAgICAgIHRyYW5zZm9ybXMsXG4gICAgICBfX3NoaW1UcmFuc2Zvcm1zX18sXG4gICAgICBDb21wYXJ0bWVudDogQ29tcGFydG1lbnRPcHRpb24sXG4gICAgICBfX25hdGl2ZV9fLFxuICAgIH0pO1xuXG4gICAgYXdhaXQgcGVuZGluZ0pvYnNQcm9taXNlO1xuXG4gICAgLy9cbiAgICByZXR1cm4gY29tcGFydG1lbnRbJ2ltcG9ydCddKGVudHJ5TW9kdWxlU3BlY2lmaWVyKTtcbiAgfTtcblxuICByZXR1cm4geyBpbXBvcnQ6IGV4ZWN1dGUsIHNoYTUxMiB9O1xufTtcblxuLypcblxuXG5cblxuICovJGjNj19vbmNlLnBhcnNlQXJjaGl2ZShwYXJzZUFyY2hpdmUpO1xuICAgICAgIGNvbnN0IGxvYWRBcmNoaXZlID0gYXN5bmMgKFxuICByZWFkUG93ZXJzLFxuICBhcmNoaXZlTG9jYXRpb24sXG4gIG9wdGlvbnMgPSB7fSxcbikgPT4ge1xuICBjb25zdCB7IHJlYWQsIGNvbXB1dGVTaGE1MTIgfSA9IHVucGFja1JlYWRQb3dlcnMocmVhZFBvd2Vycyk7XG4gIGNvbnN0IHtcbiAgICBleHBlY3RlZFNoYTUxMixcbiAgICBjb21wdXRlU291cmNlTG9jYXRpb24sXG4gICAgbW9kdWxlcyxcbiAgICBjb21wdXRlU291cmNlTWFwTG9jYXRpb24sXG4gICAgcGFyc2VyRm9yTGFuZ3VhZ2UsXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBhcmNoaXZlQnl0ZXMgPSBhd2FpdCByZWFkKGFyY2hpdmVMb2NhdGlvbik7XG4gIHJldHVybiBwYXJzZUFyY2hpdmUoYXJjaGl2ZUJ5dGVzLCBhcmNoaXZlTG9jYXRpb24sIHtcbiAgICBjb21wdXRlU2hhNTEyLFxuICAgIGV4cGVjdGVkU2hhNTEyLFxuICAgIGNvbXB1dGVTb3VyY2VMb2NhdGlvbixcbiAgICBtb2R1bGVzLFxuICAgIGNvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbixcbiAgICBwYXJzZXJGb3JMYW5ndWFnZSxcbiAgfSk7XG59O1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UubG9hZEFyY2hpdmUobG9hZEFyY2hpdmUpO1xuICAgICAgIGNvbnN0IGltcG9ydEFyY2hpdmUgPSBhc3luYyAocmVhZFBvd2VycywgYXJjaGl2ZUxvY2F0aW9uLCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IGFyY2hpdmUgPSBhd2FpdCBsb2FkQXJjaGl2ZShyZWFkUG93ZXJzLCBhcmNoaXZlTG9jYXRpb24sIG9wdGlvbnMpO1xuICByZXR1cm4gYXJjaGl2ZS5pbXBvcnQob3B0aW9ucyk7XG59OyRozY9fb25jZS5pbXBvcnRBcmNoaXZlKGltcG9ydEFyY2hpdmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicGFyc2VBcmNoaXZlIjpbInBhcnNlQXJjaGl2ZSJdLCJsb2FkQXJjaGl2ZSI6WyJsb2FkQXJjaGl2ZSJdLCJpbXBvcnRBcmNoaXZlIjpbImltcG9ydEFyY2hpdmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAquzY4zYFAAA2BQAAPQAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL2ltcG9ydC1hcmNoaXZlLXBhcnNlcnMuanN7ImltcG9ydHMiOlsiLi9wYXJzZS1wcmUtY2pzLmpzIiwiLi9wYXJzZS1qc29uLmpzIiwiLi9wYXJzZS10ZXh0LmpzIiwiLi9wYXJzZS1ieXRlcy5qcyIsIi4vcGFyc2UtcHJlLW1qcy5qcyJdLCJleHBvcnRzIjpbImRlZmF1bHRQYXJzZXJGb3JMYW5ndWFnZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHBhcnNlclByZUNqcyxwYXJzZXJKc29uLHBhcnNlclRleHQscGFyc2VyQnl0ZXMscGFyc2VyUHJlTWpzOyRozY9faW1wb3J0cyhbW1wiLi9wYXJzZS1wcmUtY2pzLmpzXCIsIFtbXCJkZWZhdWx0XCIsWyRozY9fYSA9PiAocGFyc2VyUHJlQ2pzID0gJGjNj19hKV1dXV0sW1wiLi9wYXJzZS1qc29uLmpzXCIsIFtbXCJkZWZhdWx0XCIsWyRozY9fYSA9PiAocGFyc2VySnNvbiA9ICRozY9fYSldXV1dLFtcIi4vcGFyc2UtdGV4dC5qc1wiLCBbW1wiZGVmYXVsdFwiLFskaM2PX2EgPT4gKHBhcnNlclRleHQgPSAkaM2PX2EpXV1dXSxbXCIuL3BhcnNlLWJ5dGVzLmpzXCIsIFtbXCJkZWZhdWx0XCIsWyRozY9fYSA9PiAocGFyc2VyQnl0ZXMgPSAkaM2PX2EpXV1dXSxbXCIuL3BhcnNlLXByZS1tanMuanNcIiwgW1tcImRlZmF1bHRcIixbJGjNj19hID0+IChwYXJzZXJQcmVNanMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgZGVmYXVsdFBhcnNlckZvckxhbmd1YWdlID0gT2JqZWN0LmZyZWV6ZShcbiAgLyogICAgICAgICAgICAgICAgKi8gKHtcbiAgICAncHJlLWNqcy1qc29uJzogcGFyc2VyUHJlQ2pzLFxuICAgICdwcmUtbWpzLWpzb24nOiBwYXJzZXJQcmVNanMsXG4gICAganNvbjogcGFyc2VySnNvbixcbiAgICB0ZXh0OiBwYXJzZXJUZXh0LFxuICAgIGJ5dGVzOiBwYXJzZXJCeXRlcyxcbiAgfSksXG4pOyRozY9fb25jZS5kZWZhdWx0UGFyc2VyRm9yTGFuZ3VhZ2UoZGVmYXVsdFBhcnNlckZvckxhbmd1YWdlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmF1bHRQYXJzZXJGb3JMYW5ndWFnZSI6WyJkZWZhdWx0UGFyc2VyRm9yTGFuZ3VhZ2UiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAlxQl1NwIAADcCAAANQAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL2ltcG9ydC1hcmNoaXZlLmpzeyJpbXBvcnRzIjpbIi4vaW1wb3J0LWFyY2hpdmUtcGFyc2Vycy5qcyIsIi4vaW1wb3J0LWFyY2hpdmUtbGl0ZS5qcyJdLCJleHBvcnRzIjpbImltcG9ydEFyY2hpdmUiLCJsb2FkQXJjaGl2ZSIsInBhcnNlQXJjaGl2ZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGRlZmF1bHRQYXJzZXJGb3JMYW5ndWFnZSxwYXJzZUFyY2hpdmVMaXRlLGxvYWRBcmNoaXZlTGl0ZSxpbXBvcnRBcmNoaXZlTGl0ZTskaM2PX2ltcG9ydHMoW1tcIi4vaW1wb3J0LWFyY2hpdmUtcGFyc2Vycy5qc1wiLCBbW1wiZGVmYXVsdFBhcnNlckZvckxhbmd1YWdlXCIsWyRozY9fYSA9PiAoZGVmYXVsdFBhcnNlckZvckxhbmd1YWdlID0gJGjNj19hKV1dXV0sW1wiLi9pbXBvcnQtYXJjaGl2ZS1saXRlLmpzXCIsIFtbXCJwYXJzZUFyY2hpdmVcIixbJGjNj19hID0+IChwYXJzZUFyY2hpdmVMaXRlID0gJGjNj19hKV1dLFtcImxvYWRBcmNoaXZlXCIsWyRozY9fYSA9PiAobG9hZEFyY2hpdmVMaXRlID0gJGjNj19hKV1dLFtcImltcG9ydEFyY2hpdmVcIixbJGjNj19hID0+IChpbXBvcnRBcmNoaXZlTGl0ZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB7IGFzc2lnbiwgY3JlYXRlLCBmcmVlemUgfSA9IE9iamVjdDtcblxuLy9cbi8vXG4vL1xuLy9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzaWduUGFyc2VyRm9yTGFuZ3VhZ2UgPSAob3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHsgcGFyc2VyRm9yTGFuZ3VhZ2U6IHBhcnNlckZvckxhbmd1YWdlT3B0aW9uLCAuLi5yZXN0IH0gPSBvcHRpb25zO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBwYXJzZXJGb3JMYW5ndWFnZSA9IGZyZWV6ZShcbiAgICBhc3NpZ24oY3JlYXRlKG51bGwpLCBkZWZhdWx0UGFyc2VyRm9yTGFuZ3VhZ2UsIHBhcnNlckZvckxhbmd1YWdlT3B0aW9uKSxcbiAgKTtcbiAgcmV0dXJuIHsgLi4ucmVzdCwgcGFyc2VyRm9yTGFuZ3VhZ2UgfTtcbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHBhcnNlQXJjaGl2ZSA9IGFzeW5jIChcbiAgYXJjaGl2ZUJ5dGVzLFxuICBhcmNoaXZlTG9jYXRpb24gPSAnPHVua25vd24+JyxcbiAgb3B0aW9ucyA9IHt9LFxuKSA9PlxuICBwYXJzZUFyY2hpdmVMaXRlKFxuICAgIGFyY2hpdmVCeXRlcyxcbiAgICBhcmNoaXZlTG9jYXRpb24sXG4gICAgYXNzaWduUGFyc2VyRm9yTGFuZ3VhZ2Uob3B0aW9ucyksXG4gICk7XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS5wYXJzZUFyY2hpdmUocGFyc2VBcmNoaXZlKTtcbiAgICAgICBjb25zdCBsb2FkQXJjaGl2ZSA9IGFzeW5jIChyZWFkUG93ZXJzLCBhcmNoaXZlTG9jYXRpb24sIG9wdGlvbnMpID0+XG4gIGxvYWRBcmNoaXZlTGl0ZShcbiAgICByZWFkUG93ZXJzLFxuICAgIGFyY2hpdmVMb2NhdGlvbixcbiAgICBhc3NpZ25QYXJzZXJGb3JMYW5ndWFnZShvcHRpb25zKSxcbiAgKTtcblxuLypcblxuXG5cblxuICovJGjNj19vbmNlLmxvYWRBcmNoaXZlKGxvYWRBcmNoaXZlKTtcbiAgICAgICBjb25zdCBpbXBvcnRBcmNoaXZlID0gYXN5bmMgKHJlYWRQb3dlcnMsIGFyY2hpdmVMb2NhdGlvbiwgb3B0aW9ucykgPT5cbiAgaW1wb3J0QXJjaGl2ZUxpdGUoXG4gICAgcmVhZFBvd2VycyxcbiAgICBhcmNoaXZlTG9jYXRpb24sXG4gICAgYXNzaWduUGFyc2VyRm9yTGFuZ3VhZ2Uob3B0aW9ucyksXG4gICk7JGjNj19vbmNlLmltcG9ydEFyY2hpdmUoaW1wb3J0QXJjaGl2ZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwYXJzZUFyY2hpdmUiOlsicGFyc2VBcmNoaXZlIl0sImxvYWRBcmNoaXZlIjpbImxvYWRBcmNoaXZlIl0sImltcG9ydEFyY2hpdmUiOlsiaW1wb3J0QXJjaGl2ZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACKAUN4X0kAAF9JAAAyAAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9zcmMvaW1wb3J0LWhvb2suanN7ImltcG9ydHMiOlsiQGVuZG8vdHJhbXBvbGluZSIsIi4vbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzIiwiLi9wb2xpY3kuanMiLCIuL3Bvd2Vycy5qcyJdLCJleHBvcnRzIjpbImV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIiLCJtYWtlSW1wb3J0SG9va01ha2VyIiwibWFrZUltcG9ydE5vd0hvb2tNYWtlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzeW5jVHJhbXBvbGluZSxzeW5jVHJhbXBvbGluZSxyZXNvbHZlLGF0dGVudWF0ZU1vZHVsZUhvb2ssQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQsZW5mb3JjZU1vZHVsZVBvbGljeSx1bnBhY2tSZWFkUG93ZXJzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vdHJhbXBvbGluZVwiLCBbW1wiYXN5bmNUcmFtcG9saW5lXCIsWyRozY9fYSA9PiAoYXN5bmNUcmFtcG9saW5lID0gJGjNj19hKV1dLFtcInN5bmNUcmFtcG9saW5lXCIsWyRozY9fYSA9PiAoc3luY1RyYW1wb2xpbmUgPSAkaM2PX2EpXV1dXSxbXCIuL25vZGUtbW9kdWxlLXNwZWNpZmllci5qc1wiLCBbW1wicmVzb2x2ZVwiLFskaM2PX2EgPT4gKHJlc29sdmUgPSAkaM2PX2EpXV1dXSxbXCIuL3BvbGljeS5qc1wiLCBbW1wiYXR0ZW51YXRlTW9kdWxlSG9va1wiLFskaM2PX2EgPT4gKGF0dGVudWF0ZU1vZHVsZUhvb2sgPSAkaM2PX2EpXV0sW1wiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlRcIixbJGjNj19hID0+IChBVFRFTlVBVE9SU19DT01QQVJUTUVOVCA9ICRozY9fYSldXSxbXCJlbmZvcmNlTW9kdWxlUG9saWN5XCIsWyRozY9fYSA9PiAoZW5mb3JjZU1vZHVsZVBvbGljeSA9ICRozY9fYSldXV1dLFtcIi4vcG93ZXJzLmpzXCIsIFtbXCJ1bnBhY2tSZWFkUG93ZXJzXCIsWyRozY9fYSA9PiAodW5wYWNrUmVhZFBvd2VycyA9ICRozY9fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1ha2VJbXBvcnROb3dIb29rTWFrZXIsJ25hbWUnLHt2YWx1ZTpcIm1ha2VJbXBvcnROb3dIb29rTWFrZXJcIn0pOyRozY9fb25jZS5tYWtlSW1wb3J0Tm93SG9va01ha2VyKG1ha2VJbXBvcnROb3dIb29rTWFrZXIpO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8vXG5jb25zdCBxID0gSlNPTi5zdHJpbmdpZnk7XG5cbmNvbnN0IHsgYXBwbHkgfSA9IFJlZmxlY3Q7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgZnJlZXplID0gT2JqZWN0LmZyZWV6ZTtcblxuY29uc3QgeyBlbnRyaWVzLCBrZXlzLCBhc3NpZ24sIGNyZWF0ZSB9ID0gT2JqZWN0O1xuXG5jb25zdCB7IGhhc093blByb3BlcnR5IH0gPSBPYmplY3QucHJvdG90eXBlO1xuLypcblxuXG4gKi9cbmNvbnN0IGhhcyA9IChoYXlzdGFjaywgbmVlZGxlKSA9PiBhcHBseShoYXNPd25Qcm9wZXJ0eSwgaGF5c3RhY2ssIFtuZWVkbGVdKTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgcmVzb2x2ZUxvY2F0aW9uID0gKHJlbCwgYWJzKSA9PiBuZXcgVVJMKHJlbCwgYWJzKS50b1N0cmluZygpO1xuXG4vL1xuZnVuY3Rpb24gZ2V0SW1wb3J0c0Zyb21SZWNvcmQocmVjb3JkKSB7XG4gIHJldHVybiAoaGFzKHJlY29yZCwgJ3JlY29yZCcpID8gcmVjb3JkLnJlY29yZC5pbXBvcnRzIDogcmVjb3JkLmltcG9ydHMpIHx8IFtdO1xufVxuXG4vL1xuLy9cbmNvbnN0IG5vZGVqc0NvbnZlbnRpb25TZWFyY2hTdWZmaXhlcyA9IFtcbiAgLy9cbiAgJy5qcycsXG4gICcuanNvbicsXG4gICcubm9kZScsXG4gIC8vXG4gICcvaW5kZXguanMnLFxuICAnL2luZGV4Lmpzb24nLFxuICAnL2luZGV4Lm5vZGUnLFxuXTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuY29uc3QgZmluZFJlZGlyZWN0ID0gKHtcbiAgY29tcGFydG1lbnREZXNjcmlwdG9yLFxuICBjb21wYXJ0bWVudERlc2NyaXB0b3JzLFxuICBjb21wYXJ0bWVudHMsXG4gIGFic29sdXRlTW9kdWxlU3BlY2lmaWVyLFxuICBwYWNrYWdlTG9jYXRpb24sXG59KSA9PiB7XG4gIGNvbnN0IG1vZHVsZVNwZWNpZmllckxvY2F0aW9uID0gbmV3IFVSTChcbiAgICBhYnNvbHV0ZU1vZHVsZVNwZWNpZmllcixcbiAgICBwYWNrYWdlTG9jYXRpb24sXG4gICkuaHJlZjtcblxuICAvL1xuICBsZXQgc29tZUxvY2F0aW9uID0gbmV3IFVSTCgnLi8nLCBtb2R1bGVTcGVjaWZpZXJMb2NhdGlvbikuaHJlZjtcblxuICAvL1xuICAvL1xuXG4gIC8vXG4gIGZvciAoOzspIHtcbiAgICBpZiAoXG4gICAgICBzb21lTG9jYXRpb24gIT09IEFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UICYmXG4gICAgICBzb21lTG9jYXRpb24gaW4gY29tcGFydG1lbnRzXG4gICAgKSB7XG4gICAgICBjb25zdCBsb2NhdGlvbiA9IHNvbWVMb2NhdGlvbjtcbiAgICAgIGNvbnN0IHNvbWVDb21wYXJ0bWVudERlc2NyaXB0b3IgPSBjb21wYXJ0bWVudERlc2NyaXB0b3JzW2xvY2F0aW9uXTtcbiAgICAgIGlmIChjb21wYXJ0bWVudERlc2NyaXB0b3IgPT09IHNvbWVDb21wYXJ0bWVudERlc2NyaXB0b3IpIHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBpZiAoY29tcGFydG1lbnREZXNjcmlwdG9yLmNvbXBhcnRtZW50cy5oYXMobG9jYXRpb24pKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3BlY2lmaWVyOiBhYnNvbHV0ZU1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICBjb21wYXJ0bWVudDogY29tcGFydG1lbnRzW2xvY2F0aW9uXSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgaWYgKFxuICAgICAgICBzb21lQ29tcGFydG1lbnREZXNjcmlwdG9yLmNvbXBhcnRtZW50cy5oYXMoXG4gICAgICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9yLmxvY2F0aW9uLFxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgZW5mb3JjZU1vZHVsZVBvbGljeShcbiAgICAgICAgICBjb21wYXJ0bWVudERlc2NyaXB0b3IubmFtZSxcbiAgICAgICAgICBzb21lQ29tcGFydG1lbnREZXNjcmlwdG9yLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGVycm9ySGludDogYEJsb2NrZWQgaW4gaW1wb3J0IGhvb2suICR7cShhYnNvbHV0ZU1vZHVsZVNwZWNpZmllcil9IGlzIHBhcnQgb2YgdGhlIGNvbXBhcnRtZW50IG1hcCBhbmQgcmVzb2x2ZXMgdG8gJHtsb2NhdGlvbn1gLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3BlY2lmaWVyOiBhYnNvbHV0ZU1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICBjb21wYXJ0bWVudDogY29tcGFydG1lbnRzW2xvY2F0aW9uXSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgaW1wb3J0IG1vZHVsZTogJHtxKGFic29sdXRlTW9kdWxlU3BlY2lmaWVyKX1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy9cbiAgICAgIGNvbnN0IHBhcmVudExvY2F0aW9uID0gbmV3IFVSTCgnLi4vJywgc29tZUxvY2F0aW9uKS5ocmVmO1xuXG4gICAgICAvL1xuICAgICAgaWYgKHBhcmVudExvY2F0aW9uID09PSBzb21lTG9jYXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBDb3VsZCBub3QgaW1wb3J0IHVua25vd24gbW9kdWxlOiAke3EoYWJzb2x1dGVNb2R1bGVTcGVjaWZpZXIpfWAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHNvbWVMb2NhdGlvbiA9IHBhcmVudExvY2F0aW9uO1xuICAgIH1cbiAgfVxufTtcblxuLypcblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBleGl0TW9kdWxlSW1wb3J0SG9va01ha2VyID0gKHtcbiAgbW9kdWxlcyA9IHVuZGVmaW5lZCxcbiAgZXhpdE1vZHVsZUltcG9ydEhvb2sgPSB1bmRlZmluZWQsXG4gIGVudHJ5Q29tcGFydG1lbnROYW1lLFxufSkgPT4ge1xuICBpZiAoIW1vZHVsZXMgJiYgIWV4aXRNb2R1bGVJbXBvcnRIb29rKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gYXN5bmMgc3BlY2lmaWVyID0+IHtcbiAgICBpZiAobW9kdWxlcyAmJiBoYXMobW9kdWxlcywgc3BlY2lmaWVyKSkge1xuICAgICAgY29uc3QgbnMgPSBtb2R1bGVzW3NwZWNpZmllcl07XG4gICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgaW1wb3J0czogW10sXG4gICAgICAgIGV4cG9ydHM6IG5zID8ga2V5cyhucykgOiBbXSxcbiAgICAgICAgZXhlY3V0ZTogbW9kdWxlRXhwb3J0cyA9PiB7XG4gICAgICAgICAgbW9kdWxlRXhwb3J0cy5kZWZhdWx0ID0gbnM7XG4gICAgICAgICAgYXNzaWduKG1vZHVsZUV4cG9ydHMsIG5zKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoZXhpdE1vZHVsZUltcG9ydEhvb2spIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHJldHVybiBleGl0TW9kdWxlSW1wb3J0SG9vayhzcGVjaWZpZXIsIGVudHJ5Q29tcGFydG1lbnROYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIoZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlcik7XG5jb25zdCBub21pbmF0ZUNhbmRpZGF0ZXMgPSAobW9kdWxlU3BlY2lmaWVyLCBzZWFyY2hTdWZmaXhlcykgPT4ge1xuICAvL1xuICAvL1xuICBjb25zdCBjYW5kaWRhdGVzID0gW21vZHVsZVNwZWNpZmllcl07XG4gIGZvciAoY29uc3QgY2FuZGlkYXRlU3VmZml4IG9mIHNlYXJjaFN1ZmZpeGVzKSB7XG4gICAgY2FuZGlkYXRlcy5wdXNoKGAke21vZHVsZVNwZWNpZmllcn0ke2NhbmRpZGF0ZVN1ZmZpeH1gKTtcbiAgfVxuICByZXR1cm4gY2FuZGlkYXRlcztcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5mdW5jdGlvbiogY2hvb3NlTW9kdWxlRGVzY3JpcHRvcihcbiAge1xuICAgIGNhbmRpZGF0ZXMsXG4gICAgY29tcGFydG1lbnREZXNjcmlwdG9yLFxuICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcnMsXG4gICAgY29tcGFydG1lbnRzLFxuICAgIGNvbXB1dGVTaGE1MTIsXG4gICAgbW9kdWxlRGVzY3JpcHRvcnMsXG4gICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgIHBhY2thZ2VMb2NhdGlvbixcbiAgICBwYWNrYWdlU291cmNlcyxcbiAgICByZWFkUG93ZXJzLFxuICAgIGFyY2hpdmVPbmx5LFxuICAgIHNvdXJjZU1hcEhvb2ssXG4gICAgc3RyaWN0bHlSZXF1aXJlZEZvckNvbXBhcnRtZW50LFxuICB9LFxuICB7IG1heWJlUmVhZCwgcGFyc2UsIHNob3VsZERlZmVyRXJyb3IgPSAoKSA9PiBmYWxzZSB9LFxuKSB7XG4gIGNvbnN0IHsgc291cmNlRGlybmFtZSB9ID0gY29tcGFydG1lbnREZXNjcmlwdG9yO1xuICBmb3IgKGNvbnN0IGNhbmRpZGF0ZVNwZWNpZmllciBvZiBjYW5kaWRhdGVzKSB7XG4gICAgY29uc3QgY2FuZGlkYXRlTW9kdWxlRGVzY3JpcHRvciA9IG1vZHVsZURlc2NyaXB0b3JzW2NhbmRpZGF0ZVNwZWNpZmllcl07XG4gICAgaWYgKGNhbmRpZGF0ZU1vZHVsZURlc2NyaXB0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2FuZGlkYXRlTW9kdWxlRGVzY3JpcHRvci5yZXRhaW5lZCA9IHRydWU7XG4gICAgICBjb25zdCB7IGNvbXBhcnRtZW50OiBjYW5kaWRhdGVDb21wYXJ0bWVudE5hbWUgPSBwYWNrYWdlTG9jYXRpb24gfSA9XG4gICAgICAgIGNhbmRpZGF0ZU1vZHVsZURlc2NyaXB0b3I7XG4gICAgICBjb25zdCBjYW5kaWRhdGVDb21wYXJ0bWVudCA9IGNvbXBhcnRtZW50c1tjYW5kaWRhdGVDb21wYXJ0bWVudE5hbWVdO1xuICAgICAgaWYgKGNhbmRpZGF0ZUNvbXBhcnRtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgYGNvbXBhcnRtZW50IG1pc3NpbmcgZm9yIGNhbmRpZGF0ZSAke2NhbmRpZGF0ZVNwZWNpZmllcn0gaW4gJHtjYW5kaWRhdGVDb21wYXJ0bWVudE5hbWV9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8vXG4gICAgICBjb25zdCBjYW5kaWRhdGVDb21wYXJ0bWVudERlc2NyaXB0b3IgPVxuICAgICAgICBjb21wYXJ0bWVudERlc2NyaXB0b3JzW2NhbmRpZGF0ZUNvbXBhcnRtZW50TmFtZV07XG4gICAgICBpZiAoY2FuZGlkYXRlQ29tcGFydG1lbnREZXNjcmlwdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgYGNvbXBhcnRtZW50RGVzY3JpcHRvciBtaXNzaW5nIGZvciBjYW5kaWRhdGUgJHtjYW5kaWRhdGVTcGVjaWZpZXJ9IGluICR7Y2FuZGlkYXRlQ29tcGFydG1lbnROYW1lfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjYW5kaWRhdGVDb21wYXJ0bWVudERlc2NyaXB0b3IubW9kdWxlc1ttb2R1bGVTcGVjaWZpZXJdID1cbiAgICAgICAgY2FuZGlkYXRlTW9kdWxlRGVzY3JpcHRvcjtcbiAgICAgIC8vXG4gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgY29uc3QgcmVjb3JkID0ge1xuICAgICAgICBzcGVjaWZpZXI6IGNhbmRpZGF0ZVNwZWNpZmllcixcbiAgICAgICAgY29tcGFydG1lbnQ6IGNhbmRpZGF0ZUNvbXBhcnRtZW50LFxuICAgICAgfTtcbiAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgfVxuXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBjb25zdCBtb2R1bGVMb2NhdGlvbiA9IHJlc29sdmVMb2NhdGlvbihjYW5kaWRhdGVTcGVjaWZpZXIsIHBhY2thZ2VMb2NhdGlvbik7XG5cbiAgICAvL1xuICAgIC8vXG4gICAgY29uc3QgbW9kdWxlQnl0ZXMgPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoXG4gICAgICB5aWVsZCBtYXliZVJlYWQobW9kdWxlTG9jYXRpb24pXG4gICAgKTtcblxuICAgIGlmIChtb2R1bGVCeXRlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgIGxldCBzb3VyY2VNYXA7XG4gICAgICAvL1xuICAgICAgY29uc3QgZW52ZWxvcGUgPSAvKiAgICAgICAgICAgICAgICAgICAgICAqLyAoXG4gICAgICAgIHlpZWxkIHBhcnNlKFxuICAgICAgICAgIG1vZHVsZUJ5dGVzLFxuICAgICAgICAgIGNhbmRpZGF0ZVNwZWNpZmllcixcbiAgICAgICAgICBtb2R1bGVMb2NhdGlvbixcbiAgICAgICAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVhZFBvd2VycyxcbiAgICAgICAgICAgIGFyY2hpdmVPbmx5LFxuICAgICAgICAgICAgc291cmNlTWFwSG9vazpcbiAgICAgICAgICAgICAgc291cmNlTWFwSG9vayAmJlxuICAgICAgICAgICAgICAobmV4dFNvdXJjZU1hcE9iamVjdCA9PiB7XG4gICAgICAgICAgICAgICAgc291cmNlTWFwID0gSlNPTi5zdHJpbmdpZnkobmV4dFNvdXJjZU1hcE9iamVjdCk7XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9yLFxuICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHBhcnNlcixcbiAgICAgICAgYnl0ZXM6IHRyYW5zZm9ybWVkQnl0ZXMsXG4gICAgICAgIHJlY29yZDogY29uY3JldGVSZWNvcmQsXG4gICAgICB9ID0gZW52ZWxvcGU7XG5cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgaWYgKGNhbmRpZGF0ZVNwZWNpZmllciAhPT0gbW9kdWxlU3BlY2lmaWVyKSB7XG4gICAgICAgIG1vZHVsZURlc2NyaXB0b3JzW21vZHVsZVNwZWNpZmllcl0gPSB7XG4gICAgICAgICAgcmV0YWluZWQ6IHRydWUsXG4gICAgICAgICAgbW9kdWxlOiBjYW5kaWRhdGVTcGVjaWZpZXIsXG4gICAgICAgICAgY29tcGFydG1lbnQ6IHBhY2thZ2VMb2NhdGlvbixcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgIGNvbnN0IHJlY29yZCA9IHtcbiAgICAgICAgcmVjb3JkOiBjb25jcmV0ZVJlY29yZCxcbiAgICAgICAgc3BlY2lmaWVyOiBjYW5kaWRhdGVTcGVjaWZpZXIsXG4gICAgICAgIGltcG9ydE1ldGE6IHsgdXJsOiBtb2R1bGVMb2NhdGlvbiB9LFxuICAgICAgfTtcblxuICAgICAgbGV0IHNoYTUxMjtcbiAgICAgIGlmIChjb21wdXRlU2hhNTEyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2hhNTEyID0gY29tcHV0ZVNoYTUxMih0cmFuc2Zvcm1lZEJ5dGVzKTtcblxuICAgICAgICBpZiAoc291cmNlTWFwSG9vayAhPT0gdW5kZWZpbmVkICYmIHNvdXJjZU1hcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgc291cmNlTWFwSG9vayhzb3VyY2VNYXAsIHtcbiAgICAgICAgICAgIGNvbXBhcnRtZW50OiBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICAgICBtb2R1bGU6IGNhbmRpZGF0ZVNwZWNpZmllcixcbiAgICAgICAgICAgIGxvY2F0aW9uOiBtb2R1bGVMb2NhdGlvbixcbiAgICAgICAgICAgIHNoYTUxMixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBwYWNrYWdlUmVsYXRpdmVMb2NhdGlvbiA9IG1vZHVsZUxvY2F0aW9uLnNsaWNlKFxuICAgICAgICBwYWNrYWdlTG9jYXRpb24ubGVuZ3RoLFxuICAgICAgKTtcbiAgICAgIHBhY2thZ2VTb3VyY2VzW2NhbmRpZGF0ZVNwZWNpZmllcl0gPSB7XG4gICAgICAgIGxvY2F0aW9uOiBwYWNrYWdlUmVsYXRpdmVMb2NhdGlvbixcbiAgICAgICAgc291cmNlTG9jYXRpb246IG1vZHVsZUxvY2F0aW9uLFxuICAgICAgICBzb3VyY2VEaXJuYW1lLFxuICAgICAgICBwYXJzZXIsXG4gICAgICAgIGJ5dGVzOiB0cmFuc2Zvcm1lZEJ5dGVzLFxuICAgICAgICByZWNvcmQ6IGNvbmNyZXRlUmVjb3JkLFxuICAgICAgICBzaGE1MTIsXG4gICAgICB9O1xuICAgICAgaWYgKCFzaG91bGREZWZlckVycm9yKHBhcnNlcikpIHtcbiAgICAgICAgZm9yIChjb25zdCBpbXBvcnRTcGVjaWZpZXIgb2YgZ2V0SW1wb3J0c0Zyb21SZWNvcmQocmVjb3JkKSkge1xuICAgICAgICAgIHN0cmljdGx5UmVxdWlyZWRGb3JDb21wYXJ0bWVudChwYWNrYWdlTG9jYXRpb24pLmFkZChcbiAgICAgICAgICAgIHJlc29sdmUoaW1wb3J0U3BlY2lmaWVyLCBtb2R1bGVTcGVjaWZpZXIpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZUltcG9ydEhvb2tNYWtlciA9IChcbiAgcmVhZFBvd2VycyxcbiAgYmFzZUxvY2F0aW9uLFxuICB7XG4gICAgc291cmNlcyA9IGNyZWF0ZShudWxsKSxcbiAgICBjb21wYXJ0bWVudERlc2NyaXB0b3JzID0gY3JlYXRlKG51bGwpLFxuICAgIGFyY2hpdmVPbmx5ID0gZmFsc2UsXG4gICAgY29tcHV0ZVNoYTUxMiA9IHVuZGVmaW5lZCxcbiAgICBzZWFyY2hTdWZmaXhlcyA9IG5vZGVqc0NvbnZlbnRpb25TZWFyY2hTdWZmaXhlcyxcbiAgICBzb3VyY2VNYXBIb29rID0gdW5kZWZpbmVkLFxuICAgIGVudHJ5Q29tcGFydG1lbnROYW1lLFxuICAgIGVudHJ5TW9kdWxlU3BlY2lmaWVyLFxuICAgIGltcG9ydEhvb2s6IGV4aXRNb2R1bGVJbXBvcnRIb29rID0gdW5kZWZpbmVkLFxuICB9LFxuKSA9PiB7XG4gIC8vXG4gIC8vXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHN0cmljdGx5UmVxdWlyZWQgPSBuZXcgTWFwKFtcbiAgICBbZW50cnlDb21wYXJ0bWVudE5hbWUsIG5ldyBTZXQoW2VudHJ5TW9kdWxlU3BlY2lmaWVyXSldLFxuICBdKTtcblxuICAvKlxuXG4gICAqL1xuICBjb25zdCBzdHJpY3RseVJlcXVpcmVkRm9yQ29tcGFydG1lbnQgPSBjb21wYXJ0bWVudE5hbWUgPT4ge1xuICAgIGxldCBjb21wYXJ0bWVudFN0cmljdGx5UmVxdWlyZWQgPSBzdHJpY3RseVJlcXVpcmVkLmdldChjb21wYXJ0bWVudE5hbWUpO1xuICAgIGlmIChjb21wYXJ0bWVudFN0cmljdGx5UmVxdWlyZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGNvbXBhcnRtZW50U3RyaWN0bHlSZXF1aXJlZDtcbiAgICB9XG4gICAgY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkID0gbmV3IFNldCgpO1xuICAgIHN0cmljdGx5UmVxdWlyZWQuc2V0KGNvbXBhcnRtZW50TmFtZSwgY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkKTtcbiAgICByZXR1cm4gY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkO1xuICB9O1xuXG4gIC8vXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBtYWtlSW1wb3J0SG9vayA9ICh7XG4gICAgcGFja2FnZUxvY2F0aW9uLFxuICAgIHBhY2thZ2VOYW1lOiBfcGFja2FnZU5hbWUsXG4gICAgYXR0ZW51YXRvcnMsXG4gICAgcGFyc2UsXG4gICAgc2hvdWxkRGVmZXJFcnJvcixcbiAgICBjb21wYXJ0bWVudHMsXG4gIH0pID0+IHtcbiAgICAvL1xuICAgIHBhY2thZ2VMb2NhdGlvbiA9IHJlc29sdmVMb2NhdGlvbihwYWNrYWdlTG9jYXRpb24sIGJhc2VMb2NhdGlvbik7XG4gICAgY29uc3QgcGFja2FnZVNvdXJjZXMgPSBzb3VyY2VzW3BhY2thZ2VMb2NhdGlvbl0gfHwgY3JlYXRlKG51bGwpO1xuICAgIHNvdXJjZXNbcGFja2FnZUxvY2F0aW9uXSA9IHBhY2thZ2VTb3VyY2VzO1xuICAgIGNvbnN0IGNvbXBhcnRtZW50RGVzY3JpcHRvciA9IGNvbXBhcnRtZW50RGVzY3JpcHRvcnNbcGFja2FnZUxvY2F0aW9uXSB8fCB7fTtcbiAgICBjb25zdCB7IG1vZHVsZXM6IG1vZHVsZURlc2NyaXB0b3JzID0gY3JlYXRlKG51bGwpIH0gPSBjb21wYXJ0bWVudERlc2NyaXB0b3I7XG4gICAgY29tcGFydG1lbnREZXNjcmlwdG9yLm1vZHVsZXMgPSBtb2R1bGVEZXNjcmlwdG9ycztcblxuICAgIC8qXG5cblxuXG4gICAgICovXG4gICAgY29uc3QgZGVmZXJFcnJvciA9IChzcGVjaWZpZXIsIGVycm9yKSA9PiB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGlmIChzdHJpY3RseVJlcXVpcmVkRm9yQ29tcGFydG1lbnQocGFja2FnZUxvY2F0aW9uKS5oYXMoc3BlY2lmaWVyKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBjb25zdCByZWNvcmQgPSBmcmVlemUoe1xuICAgICAgICBpbXBvcnRzOiBbXSxcbiAgICAgICAgZXhwb3J0czogW10sXG4gICAgICAgIGV4ZWN1dGU6ICgpID0+IHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgcGFja2FnZVNvdXJjZXNbc3BlY2lmaWVyXSA9IHtcbiAgICAgICAgZGVmZXJyZWRFcnJvcjogZXJyb3IubWVzc2FnZSxcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgfTtcblxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCBpbXBvcnRIb29rID0gYXN5bmMgbW9kdWxlU3BlY2lmaWVyID0+IHtcbiAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvci5yZXRhaW5lZCA9IHRydWU7XG5cbiAgICAgIC8vXG4gICAgICBhd2FpdCBudWxsO1xuXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vXG5cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgaWYgKG1vZHVsZVNwZWNpZmllciAhPT0gJy4nICYmICFtb2R1bGVTcGVjaWZpZXIuc3RhcnRzV2l0aCgnLi8nKSkge1xuICAgICAgICAgIGlmIChleGl0TW9kdWxlSW1wb3J0SG9vaykge1xuICAgICAgICAgICAgY29uc3QgcmVjb3JkID0gYXdhaXQgZXhpdE1vZHVsZUltcG9ydEhvb2soXG4gICAgICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICAgICAgcGFja2FnZUxvY2F0aW9uLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChyZWNvcmQpIHtcbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgZW5mb3JjZU1vZHVsZVBvbGljeShtb2R1bGVTcGVjaWZpZXIsIGNvbXBhcnRtZW50RGVzY3JpcHRvciwge1xuICAgICAgICAgICAgICAgIGV4aXQ6IHRydWUsXG4gICAgICAgICAgICAgICAgZXJyb3JIaW50OiBgQmxvY2tlZCBpbiBsb2FkaW5nLiAke3EoXG4gICAgICAgICAgICAgICAgICBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgICAgICAgICAgKX0gd2FzIG5vdCBpbiB0aGUgY29tcGFydG1lbnQgbWFwIGFuZCBhbiBhdHRlbXB0IHdhcyBtYWRlIHRvIGxvYWQgaXQgYXMgYSBidWlsdGluYCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGlmIChhcmNoaXZlT25seSkge1xuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICByZXR1cm4gZnJlZXplKHsgaW1wb3J0czogW10sIGV4cG9ydHM6IFtdLCBleGVjdXRlKCkge30gfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgY29uc3QgYXR0ZW51YXRlZFJlY29yZCA9IGF3YWl0IGF0dGVudWF0ZU1vZHVsZUhvb2soXG4gICAgICAgICAgICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICAgICAgICAgIHJlY29yZCxcbiAgICAgICAgICAgICAgICBjb21wYXJ0bWVudERlc2NyaXB0b3IucG9saWN5LFxuICAgICAgICAgICAgICAgIGF0dGVudWF0b3JzLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICByZXR1cm4gYXR0ZW51YXRlZFJlY29yZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICBgQ2Fubm90IGZpbmQgZXh0ZXJuYWwgbW9kdWxlICR7cShcbiAgICAgICAgICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICAgICAgKX0gaW4gcGFja2FnZSAke3BhY2thZ2VMb2NhdGlvbn1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IG1heWJlUmVhZCB9ID0gdW5wYWNrUmVhZFBvd2VycyhyZWFkUG93ZXJzKTtcblxuICAgICAgICBjb25zdCBjYW5kaWRhdGVzID0gbm9taW5hdGVDYW5kaWRhdGVzKG1vZHVsZVNwZWNpZmllciwgc2VhcmNoU3VmZml4ZXMpO1xuXG4gICAgICAgIGNvbnN0IHJlY29yZCA9IGF3YWl0IGFzeW5jVHJhbXBvbGluZShcbiAgICAgICAgICBjaG9vc2VNb2R1bGVEZXNjcmlwdG9yLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNhbmRpZGF0ZXMsXG4gICAgICAgICAgICBjb21wYXJ0bWVudERlc2NyaXB0b3IsXG4gICAgICAgICAgICBjb21wYXJ0bWVudERlc2NyaXB0b3JzLFxuICAgICAgICAgICAgY29tcGFydG1lbnRzLFxuICAgICAgICAgICAgY29tcHV0ZVNoYTUxMixcbiAgICAgICAgICAgIG1vZHVsZURlc2NyaXB0b3JzLFxuICAgICAgICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICAgICAgcGFja2FnZUxvY2F0aW9uLFxuICAgICAgICAgICAgcGFja2FnZVNvdXJjZXMsXG4gICAgICAgICAgICByZWFkUG93ZXJzLFxuICAgICAgICAgICAgYXJjaGl2ZU9ubHksXG4gICAgICAgICAgICBzb3VyY2VNYXBIb29rLFxuICAgICAgICAgICAgc3RyaWN0bHlSZXF1aXJlZEZvckNvbXBhcnRtZW50LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBtYXliZVJlYWQsIHBhcnNlLCBzaG91bGREZWZlckVycm9yIH0sXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHJlY29yZCkge1xuICAgICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IGZpbmQgZmlsZSBmb3IgaW50ZXJuYWwgbW9kdWxlICR7cShcbiAgICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICApfSAod2l0aCBjYW5kaWRhdGVzICR7Y2FuZGlkYXRlc1xuICAgICAgICAgICAgLm1hcCh4ID0+IHEoeCkpXG4gICAgICAgICAgICAuam9pbignLCAnKX0pIGluIHBhY2thZ2UgJHtwYWNrYWdlTG9jYXRpb259YCxcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBkZWZlckVycm9yKG1vZHVsZVNwZWNpZmllciwgZXJyb3IpO1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIGltcG9ydEhvb2s7XG4gIH07XG4gIHJldHVybiBtYWtlSW1wb3J0SG9vaztcbn07XG5cbi8qXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UubWFrZUltcG9ydEhvb2tNYWtlcihtYWtlSW1wb3J0SG9va01ha2VyKTtcbiAgICAgICBmdW5jdGlvbiBtYWtlSW1wb3J0Tm93SG9va01ha2VyKFxuICByZWFkUG93ZXJzLFxuICBiYXNlTG9jYXRpb24sXG4gIHtcbiAgICBzb3VyY2VzID0gY3JlYXRlKG51bGwpLFxuICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcnMgPSBjcmVhdGUobnVsbCksXG4gICAgY29tcHV0ZVNoYTUxMiA9IHVuZGVmaW5lZCxcbiAgICBzZWFyY2hTdWZmaXhlcyA9IG5vZGVqc0NvbnZlbnRpb25TZWFyY2hTdWZmaXhlcyxcbiAgICBhcmNoaXZlT25seSA9IGZhbHNlLFxuICAgIHNvdXJjZU1hcEhvb2sgPSB1bmRlZmluZWQsXG4gICAgaW1wb3J0Tm93SG9vazogZXhpdE1vZHVsZUltcG9ydE5vd0hvb2sgPSB1bmRlZmluZWQsXG4gIH0sXG4pIHtcbiAgLy9cbiAgLy9cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3Qgc3RyaWN0bHlSZXF1aXJlZCA9IG5ldyBNYXAoKTtcblxuICAvKlxuXG4gICAqL1xuICBjb25zdCBzdHJpY3RseVJlcXVpcmVkRm9yQ29tcGFydG1lbnQgPSBjb21wYXJ0bWVudE5hbWUgPT4ge1xuICAgIGxldCBjb21wYXJ0bWVudFN0cmljdGx5UmVxdWlyZWQgPSBzdHJpY3RseVJlcXVpcmVkLmdldChjb21wYXJ0bWVudE5hbWUpO1xuICAgIGlmIChjb21wYXJ0bWVudFN0cmljdGx5UmVxdWlyZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGNvbXBhcnRtZW50U3RyaWN0bHlSZXF1aXJlZDtcbiAgICB9XG4gICAgY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkID0gbmV3IFNldCgpO1xuICAgIHN0cmljdGx5UmVxdWlyZWQuc2V0KGNvbXBhcnRtZW50TmFtZSwgY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkKTtcbiAgICByZXR1cm4gY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkO1xuICB9O1xuXG4gIC8qXG5cbiAgICovXG4gIGNvbnN0IG1ha2VJbXBvcnROb3dIb29rID0gKHtcbiAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgcGFja2FnZU5hbWU6IF9wYWNrYWdlTmFtZSxcbiAgICBwYXJzZSxcbiAgICBjb21wYXJ0bWVudHMsXG4gIH0pID0+IHtcbiAgICBpZiAoISgnaXNTeW5jUGFyc2VyJyBpbiBwYXJzZSkpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiBpbXBvc3NpYmxlVHJhbnNmb3JtSW1wb3J0Tm93SG9vaygpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdEeW5hbWljIHJlcXVpcmVzIGFyZSBvbmx5IHBvc3NpYmxlIHdpdGggc3luY2hyb25vdXMgcGFyc2VycyBhbmQgbm8gYXN5bmNocm9ub3VzIG1vZHVsZSB0cmFuc2Zvcm1zIGluIG9wdGlvbnMnLFxuICAgICAgICApO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wYXJ0bWVudERlc2NyaXB0b3IgPSBjb21wYXJ0bWVudERlc2NyaXB0b3JzW3BhY2thZ2VMb2NhdGlvbl0gfHwge307XG5cbiAgICBwYWNrYWdlTG9jYXRpb24gPSByZXNvbHZlTG9jYXRpb24ocGFja2FnZUxvY2F0aW9uLCBiYXNlTG9jYXRpb24pO1xuICAgIGNvbnN0IHBhY2thZ2VTb3VyY2VzID0gc291cmNlc1twYWNrYWdlTG9jYXRpb25dIHx8IGNyZWF0ZShudWxsKTtcbiAgICBzb3VyY2VzW3BhY2thZ2VMb2NhdGlvbl0gPSBwYWNrYWdlU291cmNlcztcbiAgICBjb25zdCB7XG4gICAgICBtb2R1bGVzOlxuICAgICAgICBtb2R1bGVEZXNjcmlwdG9ycyA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChcbiAgICAgICAgICBjcmVhdGUobnVsbClcbiAgICAgICAgKSxcbiAgICB9ID0gY29tcGFydG1lbnREZXNjcmlwdG9yO1xuICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvci5tb2R1bGVzID0gbW9kdWxlRGVzY3JpcHRvcnM7XG5cbiAgICBsZXQgeyBwb2xpY3kgfSA9IGNvbXBhcnRtZW50RGVzY3JpcHRvcjtcbiAgICBwb2xpY3kgPSBwb2xpY3kgfHwgY3JlYXRlKG51bGwpO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgaWYgKCdwYWNrYWdlcycgaW4gcG9saWN5ICYmIHR5cGVvZiBwb2xpY3kucGFja2FnZXMgPT09ICdvYmplY3QnKSB7XG4gICAgICBmb3IgKGNvbnN0IFtwYWNrYWdlTmFtZSwgcGFja2FnZVBvbGljeUl0ZW1dIG9mIGVudHJpZXMocG9saWN5LnBhY2thZ2VzKSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIShwYWNrYWdlTmFtZSBpbiBjb21wYXJ0bWVudERlc2NyaXB0b3IubW9kdWxlcykgJiZcbiAgICAgICAgICBwYWNrYWdlTmFtZSBpbiBjb21wYXJ0bWVudERlc2NyaXB0b3Iuc2NvcGVzICYmXG4gICAgICAgICAgcGFja2FnZVBvbGljeUl0ZW1cbiAgICAgICAgKSB7XG4gICAgICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9yLm1vZHVsZXNbcGFja2FnZU5hbWVdID1cbiAgICAgICAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvci5zY29wZXNbcGFja2FnZU5hbWVdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeyBtYXliZVJlYWROb3csIGlzQWJzb2x1dGUgfSA9IHJlYWRQb3dlcnM7XG5cbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgaW1wb3J0Tm93SG9vayA9IG1vZHVsZVNwZWNpZmllciA9PiB7XG4gICAgICBpZiAoaXNBYnNvbHV0ZShtb2R1bGVTcGVjaWZpZXIpKSB7XG4gICAgICAgIGNvbnN0IHJlY29yZCA9IGZpbmRSZWRpcmVjdCh7XG4gICAgICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9yLFxuICAgICAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcnMsXG4gICAgICAgICAgY29tcGFydG1lbnRzLFxuICAgICAgICAgIGFic29sdXRlTW9kdWxlU3BlY2lmaWVyOiBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgICAgcGFja2FnZUxvY2F0aW9uLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlY29yZCkge1xuICAgICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IG5vbWluYXRlQ2FuZGlkYXRlcyhtb2R1bGVTcGVjaWZpZXIsIHNlYXJjaFN1ZmZpeGVzKTtcblxuICAgICAgY29uc3QgcmVjb3JkID0gc3luY1RyYW1wb2xpbmUoXG4gICAgICAgIGNob29zZU1vZHVsZURlc2NyaXB0b3IsXG4gICAgICAgIHtcbiAgICAgICAgICBjYW5kaWRhdGVzLFxuICAgICAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcixcbiAgICAgICAgICBjb21wYXJ0bWVudERlc2NyaXB0b3JzLFxuICAgICAgICAgIGNvbXBhcnRtZW50cyxcbiAgICAgICAgICBjb21wdXRlU2hhNTEyLFxuICAgICAgICAgIG1vZHVsZURlc2NyaXB0b3JzLFxuICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICAgcGFja2FnZVNvdXJjZXMsXG4gICAgICAgICAgcmVhZFBvd2VycyxcbiAgICAgICAgICBhcmNoaXZlT25seSxcbiAgICAgICAgICBzb3VyY2VNYXBIb29rLFxuICAgICAgICAgIHN0cmljdGx5UmVxdWlyZWRGb3JDb21wYXJ0bWVudCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG1heWJlUmVhZDogbWF5YmVSZWFkTm93LFxuICAgICAgICAgIHBhcnNlLFxuICAgICAgICB9LFxuICAgICAgKTtcblxuICAgICAgaWYgKHJlY29yZCkge1xuICAgICAgICByZXR1cm4gcmVjb3JkO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXhpdE1vZHVsZUltcG9ydE5vd0hvb2spIHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgZXhpdFJlY29yZCA9IGV4aXRNb2R1bGVJbXBvcnROb3dIb29rKFxuICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCFleGl0UmVjb3JkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgaW1wb3J0IG1vZHVsZTogJHtxKG1vZHVsZVNwZWNpZmllcil9YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXhpdFJlY29yZDtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IGltcG9ydCBtb2R1bGU6ICR7cShcbiAgICAgICAgICBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgICl9OyB0cnkgcHJvdmlkaW5nIGFuIGltcG9ydE5vd0hvb2tgLFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGltcG9ydE5vd0hvb2s7XG4gIH07XG4gIHJldHVybiBtYWtlSW1wb3J0Tm93SG9vaztcbn1cbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIiOlsiZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlciJdLCJtYWtlSW1wb3J0SG9va01ha2VyIjpbIm1ha2VJbXBvcnRIb29rTWFrZXIiXSwibWFrZUltcG9ydE5vd0hvb2tNYWtlciI6WyJtYWtlSW1wb3J0Tm93SG9va01ha2VyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALJuhOsuAwAALgMAACsAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9qc29uLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJwYXJzZUxvY2F0ZWRKc29uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBwYXJzZUxvY2F0ZWRKc29uID0gKHNvdXJjZSwgbG9jYXRpb24pID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShzb3VyY2UpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFN5bnRheEVycm9yKSB7XG4gICAgICB0aHJvdyBTeW50YXhFcnJvcihgQ2Fubm90IHBhcnNlIEpTT04gZnJvbSAke2xvY2F0aW9ufSwgJHtlcnJvcn1gKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07JGjNj19vbmNlLnBhcnNlTG9jYXRlZEpzb24ocGFyc2VMb2NhdGVkSnNvbik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwYXJzZUxvY2F0ZWRKc29uIjpbInBhcnNlTG9jYXRlZEpzb24iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAVF1zgY8lAACPJQAAKwAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL2xpbmsuanN7ImltcG9ydHMiOlsiLi9tYXAtcGFyc2VyLmpzIiwiLi9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanMiLCIuL3BvbGljeS5qcyJdLCJleHBvcnRzIjpbImFzc2VtYmxlIiwibGluayJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG1ha2VNYXBQYXJzZXJzLHJlc29sdmVGYWxsYmFjayxBVFRFTlVBVE9SU19DT01QQVJUTUVOVCxhdHRlbnVhdGVHbG9iYWxzLGVuZm9yY2VNb2R1bGVQb2xpY3ksbWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcjskaM2PX2ltcG9ydHMoW1tcIi4vbWFwLXBhcnNlci5qc1wiLCBbW1wibWFrZU1hcFBhcnNlcnNcIixbJGjNj19hID0+IChtYWtlTWFwUGFyc2VycyA9ICRozY9fYSldXV1dLFtcIi4vbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzXCIsIFtbXCJyZXNvbHZlXCIsWyRozY9fYSA9PiAocmVzb2x2ZUZhbGxiYWNrID0gJGjNj19hKV1dXV0sW1wiLi9wb2xpY3kuanNcIiwgW1tcIkFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UXCIsWyRozY9fYSA9PiAoQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQgPSAkaM2PX2EpXV0sW1wiYXR0ZW51YXRlR2xvYmFsc1wiLFskaM2PX2EgPT4gKGF0dGVudWF0ZUdsb2JhbHMgPSAkaM2PX2EpXV0sW1wiZW5mb3JjZU1vZHVsZVBvbGljeVwiLFskaM2PX2EgPT4gKGVuZm9yY2VNb2R1bGVQb2xpY3kgPSAkaM2PX2EpXV0sW1wibWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlclwiLFskaM2PX2EgPT4gKG1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXIgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgYXNzaWduLCBjcmVhdGUsIGVudHJpZXMsIGZyZWV6ZSB9ID0gT2JqZWN0O1xuY29uc3QgeyBoYXNPd25Qcm9wZXJ0eSB9ID0gT2JqZWN0LnByb3RvdHlwZTtcbmNvbnN0IHsgYXBwbHkgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGFsbFNldHRsZWQgfSA9IFByb21pc2U7XG5cbi8qXG5cblxuICovXG5jb25zdCBwcm9taXNlQWxsU2V0dGxlZCA9IGFsbFNldHRsZWQuYmluZChQcm9taXNlKTtcblxuY29uc3QgZGVmYXVsdENvbXBhcnRtZW50ID0gQ29tcGFydG1lbnQ7XG5cbi8vXG5jb25zdCBxID0gSlNPTi5zdHJpbmdpZnk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGhhcyA9IChvYmplY3QsIGtleSkgPT4gYXBwbHkoaGFzT3duUHJvcGVydHksIG9iamVjdCwgW2tleV0pO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgdHJpbU1vZHVsZVNwZWNpZmllclByZWZpeCA9IChtb2R1bGVTcGVjaWZpZXIsIHByZWZpeCkgPT4ge1xuICBpZiAobW9kdWxlU3BlY2lmaWVyID09PSBwcmVmaXgpIHtcbiAgICByZXR1cm4gJy4nO1xuICB9XG4gIGlmIChtb2R1bGVTcGVjaWZpZXIuc3RhcnRzV2l0aChgJHtwcmVmaXh9L2ApKSB7XG4gICAgcmV0dXJuIGAuLyR7bW9kdWxlU3BlY2lmaWVyLnNsaWNlKHByZWZpeC5sZW5ndGggKyAxKX1gO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlTW9kdWxlTWFwSG9vayA9IChcbiAgY29tcGFydG1lbnREZXNjcmlwdG9yLFxuICBjb21wYXJ0bWVudHMsXG4gIGNvbXBhcnRtZW50TmFtZSxcbiAgbW9kdWxlRGVzY3JpcHRvcnMsXG4gIHNjb3BlRGVzY3JpcHRvcnMsXG4pID0+IHtcbiAgLypcblxuXG4gICAqL1xuICBjb25zdCBtb2R1bGVNYXBIb29rID0gbW9kdWxlU3BlY2lmaWVyID0+IHtcbiAgICBjb21wYXJ0bWVudERlc2NyaXB0b3IucmV0YWluZWQgPSB0cnVlO1xuXG4gICAgY29uc3QgbW9kdWxlRGVzY3JpcHRvciA9IG1vZHVsZURlc2NyaXB0b3JzW21vZHVsZVNwZWNpZmllcl07XG4gICAgaWYgKG1vZHVsZURlc2NyaXB0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbW9kdWxlRGVzY3JpcHRvci5yZXRhaW5lZCA9IHRydWU7XG5cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3Qge1xuICAgICAgICBjb21wYXJ0bWVudDogZm9yZWlnbkNvbXBhcnRtZW50TmFtZSA9IGNvbXBhcnRtZW50TmFtZSxcbiAgICAgICAgbW9kdWxlOiBmb3JlaWduTW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICBleGl0LFxuICAgICAgfSA9IG1vZHVsZURlc2NyaXB0b3I7XG4gICAgICBpZiAoZXhpdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7IC8vXG4gICAgICB9XG4gICAgICBpZiAoZm9yZWlnbk1vZHVsZVNwZWNpZmllciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vXG4gICAgICAgIGlmICghbW9kdWxlU3BlY2lmaWVyLnN0YXJ0c1dpdGgoJy4vJykpIHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgZW5mb3JjZU1vZHVsZVBvbGljeShtb2R1bGVTcGVjaWZpZXIsIGNvbXBhcnRtZW50RGVzY3JpcHRvciwge1xuICAgICAgICAgICAgZXhpdDogZmFsc2UsXG4gICAgICAgICAgICBlcnJvckhpbnQ6XG4gICAgICAgICAgICAgICdUaGlzIGNoZWNrIHNob3VsZCBub3QgYmUgcmVhY2hhYmxlLiBJZiB5b3Ugc2VlIHRoaXMgZXJyb3IsIHBsZWFzZSBmaWxlIGFuIGlzc3VlLicsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmb3JlaWduQ29tcGFydG1lbnQgPSBjb21wYXJ0bWVudHNbZm9yZWlnbkNvbXBhcnRtZW50TmFtZV07XG4gICAgICAgIGlmIChmb3JlaWduQ29tcGFydG1lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgYENhbm5vdCBpbXBvcnQgZnJvbSBtaXNzaW5nIGNvbXBhcnRtZW50ICR7cShcbiAgICAgICAgICAgICAgZm9yZWlnbkNvbXBhcnRtZW50TmFtZSxcbiAgICAgICAgICAgICl9fWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbXBhcnRtZW50OiBmb3JlaWduQ29tcGFydG1lbnQsXG4gICAgICAgICAgbmFtZXNwYWNlOiBmb3JlaWduTW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBmb3IgKGNvbnN0IFtzY29wZVByZWZpeCwgc2NvcGVEZXNjcmlwdG9yXSBvZiBlbnRyaWVzKHNjb3BlRGVzY3JpcHRvcnMpKSB7XG4gICAgICBjb25zdCBmb3JlaWduTW9kdWxlU3BlY2lmaWVyID0gdHJpbU1vZHVsZVNwZWNpZmllclByZWZpeChcbiAgICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICBzY29wZVByZWZpeCxcbiAgICAgICk7XG5cbiAgICAgIGlmIChmb3JlaWduTW9kdWxlU3BlY2lmaWVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgeyBjb21wYXJ0bWVudDogZm9yZWlnbkNvbXBhcnRtZW50TmFtZSB9ID0gc2NvcGVEZXNjcmlwdG9yO1xuICAgICAgICBpZiAoZm9yZWlnbkNvbXBhcnRtZW50TmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICBgQ2Fubm90IGltcG9ydCBmcm9tIHNjb3BlICR7c2NvcGVQcmVmaXh9IGR1ZSB0byBtaXNzaW5nIFwiY29tcGFydG1lbnRcIiBwcm9wZXJ0eWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmb3JlaWduQ29tcGFydG1lbnQgPSBjb21wYXJ0bWVudHNbZm9yZWlnbkNvbXBhcnRtZW50TmFtZV07XG4gICAgICAgIGlmIChmb3JlaWduQ29tcGFydG1lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgYENhbm5vdCBpbXBvcnQgZnJvbSBtaXNzaW5nIGNvbXBhcnRtZW50ICR7cShcbiAgICAgICAgICAgICAgZm9yZWlnbkNvbXBhcnRtZW50TmFtZSxcbiAgICAgICAgICAgICl9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgZW5mb3JjZU1vZHVsZVBvbGljeShzY29wZVByZWZpeCwgY29tcGFydG1lbnREZXNjcmlwdG9yLCB7XG4gICAgICAgICAgZXhpdDogZmFsc2UsXG4gICAgICAgICAgZXJyb3JIaW50OiBgQmxvY2tlZCBpbiBsaW5raW5nLiAke3EoXG4gICAgICAgICAgICBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgICAgKX0gaXMgcGFydCBvZiB0aGUgY29tcGFydG1lbnQgbWFwIGFuZCByZXNvbHZlcyB0byAke3EoXG4gICAgICAgICAgICBmb3JlaWduQ29tcGFydG1lbnROYW1lLFxuICAgICAgICAgICl9LmAsXG4gICAgICAgIH0pO1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBtb2R1bGVEZXNjcmlwdG9yc1ttb2R1bGVTcGVjaWZpZXJdID0ge1xuICAgICAgICAgIHJldGFpbmVkOiB0cnVlLFxuICAgICAgICAgIGNvbXBhcnRtZW50OiBmb3JlaWduQ29tcGFydG1lbnROYW1lLFxuICAgICAgICAgIG1vZHVsZTogZm9yZWlnbk1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb21wYXJ0bWVudDogZm9yZWlnbkNvbXBhcnRtZW50LFxuICAgICAgICAgIG5hbWVzcGFjZTogZm9yZWlnbk1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL1xuICAgIC8vXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfTtcblxuICByZXR1cm4gbW9kdWxlTWFwSG9vaztcbn07XG5cbi8qXG5cbiAqL1xuY29uc3QgaW1wb3NzaWJsZUltcG9ydE5vd0hvb2tNYWtlciA9ICgpID0+IHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGltcG9zc2libGVJbXBvcnROb3dIb29rKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignUHJvdmlkZWQgcmVhZCBwb3dlcnMgZG8gbm90IHN1cHBvcnQgZHluYW1pYyByZXF1aXJlcycpO1xuICB9O1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuICovXG4gICAgICAgY29uc3QgbGluayA9IChcbiAgeyBlbnRyeSwgY29tcGFydG1lbnRzOiBjb21wYXJ0bWVudERlc2NyaXB0b3JzIH0sXG4gIG9wdGlvbnMsXG4pID0+IHtcbiAgY29uc3Qge1xuICAgIHJlc29sdmUgPSByZXNvbHZlRmFsbGJhY2ssXG4gICAgbWFrZUltcG9ydEhvb2ssXG4gICAgbWFrZUltcG9ydE5vd0hvb2sgPSBpbXBvc3NpYmxlSW1wb3J0Tm93SG9va01ha2VyLFxuICAgIHBhcnNlckZvckxhbmd1YWdlOiBwYXJzZXJGb3JMYW5ndWFnZU9wdGlvbiA9IHt9LFxuICAgIGdsb2JhbHMgPSB7fSxcbiAgICB0cmFuc2Zvcm1zID0gW10sXG4gICAgbW9kdWxlVHJhbnNmb3JtcyxcbiAgICBzeW5jTW9kdWxlVHJhbnNmb3JtcyxcbiAgICBfX3NoaW1UcmFuc2Zvcm1zX18gPSBbXSxcbiAgICBfX25hdGl2ZV9fID0gZmFsc2UsXG4gICAgYXJjaGl2ZU9ubHkgPSBmYWxzZSxcbiAgICBDb21wYXJ0bWVudCA9IGRlZmF1bHRDb21wYXJ0bWVudCxcbiAgfSA9IG9wdGlvbnM7XG5cbiAgY29uc3QgeyBjb21wYXJ0bWVudDogZW50cnlDb21wYXJ0bWVudE5hbWUgfSA9IGVudHJ5O1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBjb21wYXJ0bWVudHMgPSBjcmVhdGUobnVsbCk7XG5cbiAgLypcblxuICAgKi9cbiAgY29uc3QgYXR0ZW51YXRvcnMgPSBtYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyKFxuICAgIGNvbXBhcnRtZW50cyxcbiAgICBjb21wYXJ0bWVudERlc2NyaXB0b3JzLFxuICApO1xuXG4gIGNvbnN0IHBlbmRpbmdKb2JzID0gW107XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgcGFyc2VyRm9yTGFuZ3VhZ2UgPSBmcmVlemUoXG4gICAgYXNzaWduKGNyZWF0ZShudWxsKSwgcGFyc2VyRm9yTGFuZ3VhZ2VPcHRpb24pLFxuICApO1xuXG4gIGNvbnN0IG1hcFBhcnNlcnMgPSBtYWtlTWFwUGFyc2Vycyh7XG4gICAgcGFyc2VyRm9yTGFuZ3VhZ2UsXG4gICAgbW9kdWxlVHJhbnNmb3JtcyxcbiAgICBzeW5jTW9kdWxlVHJhbnNmb3JtcyxcbiAgfSk7XG5cbiAgZm9yIChjb25zdCBbY29tcGFydG1lbnROYW1lLCBjb21wYXJ0bWVudERlc2NyaXB0b3JdIG9mIGVudHJpZXMoXG4gICAgY29tcGFydG1lbnREZXNjcmlwdG9ycyxcbiAgKSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgbmFtZSxcbiAgICAgIHBhcnNlcnM6IGxhbmd1YWdlRm9yRXh0ZW5zaW9uID0ge30sXG4gICAgICB0eXBlczogbGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIgPSB7fSxcbiAgICB9ID0gY29tcGFydG1lbnREZXNjcmlwdG9yO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IHsgc2NvcGVzOiBfc2NvcGVzLCBtb2R1bGVzOiBfbW9kdWxlcyB9ID0gY29tcGFydG1lbnREZXNjcmlwdG9yO1xuICAgIGNvbnN0IG1vZHVsZXMgPSBfbW9kdWxlcyB8fCBjcmVhdGUobnVsbCk7XG4gICAgY29uc3Qgc2NvcGVzID0gX3Njb3BlcyB8fCBjcmVhdGUobnVsbCk7XG5cbiAgICAvL1xuICAgIC8vXG4gICAgY29tcGFydG1lbnREZXNjcmlwdG9yLm1vZHVsZXMgPSBtb2R1bGVzO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IHBhcnNlID0gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKFxuICAgICAgbWFwUGFyc2VycyhsYW5ndWFnZUZvckV4dGVuc2lvbiwgbGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIpXG4gICAgKTtcblxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCBzaG91bGREZWZlckVycm9yID0gbGFuZ3VhZ2UgPT4ge1xuICAgICAgaWYgKGxhbmd1YWdlICYmIGhhcyhwYXJzZXJGb3JMYW5ndWFnZSwgbGFuZ3VhZ2UpKSB7XG4gICAgICAgIHJldHVybiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAocGFyc2VyRm9yTGFuZ3VhZ2VbbGFuZ3VhZ2VdKVxuICAgICAgICAgIC5oZXVyaXN0aWNJbXBvcnRzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvL1xuICAgIC8vXG4gICAgY29uc3QgcmVzb2x2ZUhvb2sgPSByZXNvbHZlO1xuICAgIGNvbnN0IGltcG9ydEhvb2sgPSBtYWtlSW1wb3J0SG9vayh7XG4gICAgICBwYWNrYWdlTG9jYXRpb246IGxvY2F0aW9uLFxuICAgICAgcGFja2FnZU5hbWU6IG5hbWUsXG4gICAgICBhdHRlbnVhdG9ycyxcbiAgICAgIHBhcnNlLFxuICAgICAgc2hvdWxkRGVmZXJFcnJvcixcbiAgICAgIGNvbXBhcnRtZW50cyxcbiAgICB9KTtcblxuICAgIGNvbnN0IGltcG9ydE5vd0hvb2sgPSBtYWtlSW1wb3J0Tm93SG9vayh7XG4gICAgICBwYWNrYWdlTG9jYXRpb246IGxvY2F0aW9uLFxuICAgICAgcGFja2FnZU5hbWU6IG5hbWUsXG4gICAgICBwYXJzZSxcbiAgICAgIGNvbXBhcnRtZW50cyxcbiAgICB9KTtcblxuICAgIGNvbnN0IG1vZHVsZU1hcEhvb2sgPSBtYWtlTW9kdWxlTWFwSG9vayhcbiAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcixcbiAgICAgIGNvbXBhcnRtZW50cyxcbiAgICAgIGNvbXBhcnRtZW50TmFtZSxcbiAgICAgIG1vZHVsZXMsXG4gICAgICBzY29wZXMsXG4gICAgKTtcblxuICAgIGNvbnN0IGNvbXBhcnRtZW50ID0gbmV3IENvbXBhcnRtZW50KHtcbiAgICAgIG5hbWU6IGxvY2F0aW9uLFxuICAgICAgcmVzb2x2ZUhvb2ssXG4gICAgICBpbXBvcnRIb29rLFxuICAgICAgaW1wb3J0Tm93SG9vayxcbiAgICAgIG1vZHVsZU1hcEhvb2ssXG4gICAgICB0cmFuc2Zvcm1zLFxuICAgICAgX19zaGltVHJhbnNmb3Jtc19fLFxuICAgICAgX19vcHRpb25zX186IHRydWUsXG4gICAgICBfX25hdGl2ZV9fLFxuICAgIH0pO1xuXG4gICAgaWYgKCFhcmNoaXZlT25seSkge1xuICAgICAgYXR0ZW51YXRlR2xvYmFscyhcbiAgICAgICAgY29tcGFydG1lbnQuZ2xvYmFsVGhpcyxcbiAgICAgICAgZ2xvYmFscyxcbiAgICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9yLnBvbGljeSxcbiAgICAgICAgYXR0ZW51YXRvcnMsXG4gICAgICAgIHBlbmRpbmdKb2JzLFxuICAgICAgICBjb21wYXJ0bWVudERlc2NyaXB0b3IubmFtZSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29tcGFydG1lbnRzW2NvbXBhcnRtZW50TmFtZV0gPSBjb21wYXJ0bWVudDtcbiAgfVxuXG4gIGNvbnN0IGNvbXBhcnRtZW50ID0gY29tcGFydG1lbnRzW2VudHJ5Q29tcGFydG1lbnROYW1lXTtcbiAgaWYgKGNvbXBhcnRtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBDYW5ub3QgYXNzZW1ibGUgY29tcGFydG1lbnQgZ3JhcGggYmVjYXVzZSB0aGUgcm9vdCBjb21wYXJ0bWVudCBuYW1lZCAke3EoXG4gICAgICAgIGVudHJ5Q29tcGFydG1lbnROYW1lLFxuICAgICAgKX0gaXMgbWlzc2luZyBmcm9tIHRoZSBjb21wYXJ0bWVudCBtYXBgLFxuICAgICk7XG4gIH1cbiAgY29uc3QgYXR0ZW51YXRvcnNDb21wYXJ0bWVudCA9IGNvbXBhcnRtZW50c1tBVFRFTlVBVE9SU19DT01QQVJUTUVOVF07XG5cbiAgcmV0dXJuIHtcbiAgICBjb21wYXJ0bWVudCxcbiAgICBjb21wYXJ0bWVudHMsXG4gICAgYXR0ZW51YXRvcnNDb21wYXJ0bWVudCxcbiAgICBwZW5kaW5nSm9ic1Byb21pc2U6IHByb21pc2VBbGxTZXR0bGVkKHBlbmRpbmdKb2JzKS50aGVuKFxuICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyByZXN1bHRzID0+IHtcbiAgICAgICAgY29uc3QgZXJyb3JzID0gcmVzdWx0c1xuICAgICAgICAgIC5maWx0ZXIocmVzdWx0ID0+IHJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpXG4gICAgICAgICAgLm1hcChcbiAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIHJlc3VsdCA9PlxuICAgICAgICAgICAgICByZXN1bHQucmVhc29uLFxuICAgICAgICAgICk7XG4gICAgICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgYEdsb2JhbHMgYXR0ZW51YXRpb24gZXJyb3JzOiAke2Vycm9yc1xuICAgICAgICAgICAgICAubWFwKGVycm9yID0+IGVycm9yLm1lc3NhZ2UpXG4gICAgICAgICAgICAgIC5qb2luKCcsICcpfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApLFxuICB9O1xufTtcblxuLypcblxuXG5cbiAqLyRozY9fb25jZS5saW5rKGxpbmspO1xuICAgICAgIGNvbnN0IGFzc2VtYmxlID0gKGNvbXBhcnRtZW50TWFwLCBvcHRpb25zKSA9PlxuICBsaW5rKGNvbXBhcnRtZW50TWFwLCBvcHRpb25zKS5jb21wYXJ0bWVudDskaM2PX29uY2UuYXNzZW1ibGUoYXNzZW1ibGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibGluayI6WyJsaW5rIl0sImFzc2VtYmxlIjpbImFzc2VtYmxlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANuM78w8FwAAPBcAADEAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9tYXAtcGFyc2VyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3RyYW1wb2xpbmUiLCIuL2V4dGVuc2lvbi5qcyJdLCJleHBvcnRzIjpbIm1ha2VNYXBQYXJzZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgc3luY1RyYW1wb2xpbmUsYXN5bmNUcmFtcG9saW5lLHBhcnNlRXh0ZW5zaW9uOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vdHJhbXBvbGluZVwiLCBbW1wic3luY1RyYW1wb2xpbmVcIixbJGjNj19hID0+IChzeW5jVHJhbXBvbGluZSA9ICRozY9fYSldXSxbXCJhc3luY1RyYW1wb2xpbmVcIixbJGjNj19hID0+IChhc3luY1RyYW1wb2xpbmUgPSAkaM2PX2EpXV1dXSxbXCIuL2V4dGVuc2lvbi5qc1wiLCBbW1wicGFyc2VFeHRlbnNpb25cIixbJGjNj19hID0+IChwYXJzZUV4dGVuc2lvbiA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB7IGVudHJpZXMsIGZyb21FbnRyaWVzLCBrZXlzLCBoYXNPd25Qcm9wZXJ0eSwgdmFsdWVzIH0gPSBPYmplY3Q7XG5jb25zdCB7IGFwcGx5IH0gPSBSZWZsZWN0O1xuLy9cbmNvbnN0IHEgPSBKU09OLnN0cmluZ2lmeTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgaGFzID0gKG9iamVjdCwga2V5KSA9PiBhcHBseShoYXNPd25Qcm9wZXJ0eSwgb2JqZWN0LCBba2V5XSk7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgZXh0ZW5zaW9uSW1wbGllc0xhbmd1YWdlID0gZXh0ZW5zaW9uID0+IGV4dGVuc2lvbiAhPT0gJ2pzJztcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VFeHRlbnNpb25QYXJzZXIgPSAoXG4gIHByZWZlclN5bmNocm9ub3VzLFxuICBsYW5ndWFnZUZvckV4dGVuc2lvbixcbiAgbGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIsXG4gIHBhcnNlckZvckxhbmd1YWdlLFxuICBtb2R1bGVUcmFuc2Zvcm1zLFxuICBzeW5jTW9kdWxlVHJhbnNmb3JtcyxcbikgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgdHJhbnNmb3JtcztcblxuICAvKlxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgZnVuY3Rpb24qIGdldFBhcnNlckdlbmVyYXRvcihcbiAgICBieXRlcyxcbiAgICBzcGVjaWZpZXIsXG4gICAgbG9jYXRpb24sXG4gICAgcGFja2FnZUxvY2F0aW9uLFxuICAgIG9wdGlvbnMsXG4gICkge1xuICAgIC8qICAgICAgICAgICAgICAgICAqL1xuICAgIGxldCBsYW5ndWFnZTtcbiAgICBjb25zdCBleHRlbnNpb24gPSBwYXJzZUV4dGVuc2lvbihsb2NhdGlvbik7XG5cbiAgICBpZiAoXG4gICAgICAhZXh0ZW5zaW9uSW1wbGllc0xhbmd1YWdlKGV4dGVuc2lvbikgJiZcbiAgICAgIGhhcyhsYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllciwgc3BlY2lmaWVyKVxuICAgICkge1xuICAgICAgbGFuZ3VhZ2UgPSBsYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllcltzcGVjaWZpZXJdO1xuICAgIH0gZWxzZSB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGxhbmd1YWdlID0gbGFuZ3VhZ2VGb3JFeHRlbnNpb25bZXh0ZW5zaW9uXSB8fCBleHRlbnNpb247XG4gICAgfVxuXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGxldCBzb3VyY2VNYXA7XG5cbiAgICBpZiAoaGFzKHRyYW5zZm9ybXMsIGxhbmd1YWdlKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgKHtcbiAgICAgICAgICBieXRlcyxcbiAgICAgICAgICBwYXJzZXI6IGxhbmd1YWdlLFxuICAgICAgICAgIHNvdXJjZU1hcCxcbiAgICAgICAgfSA9IHlpZWxkIHRyYW5zZm9ybXNbbGFuZ3VhZ2VdKFxuICAgICAgICAgIGJ5dGVzLFxuICAgICAgICAgIHNwZWNpZmllcixcbiAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICAge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgc291cmNlTWFwLFxuICAgICAgICAgIH0sXG4gICAgICAgICkpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgIGBFcnJvciB0cmFuc2Zvcm1pbmcgJHtxKGxhbmd1YWdlKX0gc291cmNlIGluICR7cShsb2NhdGlvbil9OiAke2Vyci5tZXNzYWdlfWAsXG4gICAgICAgICAgeyBjYXVzZTogZXJyIH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaGFzKHBhcnNlckZvckxhbmd1YWdlLCBsYW5ndWFnZSkpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBgQ2Fubm90IHBhcnNlIG1vZHVsZSAke3NwZWNpZmllcn0gYXQgJHtsb2NhdGlvbn0sIG5vIHBhcnNlciBjb25maWd1cmVkIGZvciB0aGUgbGFuZ3VhZ2UgJHtsYW5ndWFnZX1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgeyBwYXJzZSB9ID0gcGFyc2VyRm9yTGFuZ3VhZ2VbbGFuZ3VhZ2VdO1xuICAgIHJldHVybiBwYXJzZShieXRlcywgc3BlY2lmaWVyLCBsb2NhdGlvbiwgcGFja2FnZUxvY2F0aW9uLCB7XG4gICAgICBzb3VyY2VNYXAsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgLypcblxuICAgKi9cbiAgY29uc3Qgc3luY1BhcnNlciA9IChieXRlcywgc3BlY2lmaWVyLCBsb2NhdGlvbiwgcGFja2FnZUxvY2F0aW9uLCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gc3luY1RyYW1wb2xpbmUoXG4gICAgICBnZXRQYXJzZXJHZW5lcmF0b3IsXG4gICAgICBieXRlcyxcbiAgICAgIHNwZWNpZmllcixcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgcGFja2FnZUxvY2F0aW9uLFxuICAgICAgb3B0aW9ucyxcbiAgICApO1xuICAgIGlmICgndGhlbicgaW4gcmVzdWx0ICYmIHR5cGVvZiByZXN1bHQudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgJ1N5bmMgcGFyc2VyIGNhbm5vdCByZXR1cm4gYSBUaGVuYWJsZTsgZW5zdXJlIHBhcnNlciBpcyBhY3R1YWxseSBzeW5jaHJvbm91cycsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICBzeW5jUGFyc2VyLmlzU3luY1BhcnNlciA9IHRydWU7XG5cbiAgLypcblxuICAgKi9cbiAgY29uc3QgYXN5bmNQYXJzZXIgPSBhc3luYyAoXG4gICAgYnl0ZXMsXG4gICAgc3BlY2lmaWVyLFxuICAgIGxvY2F0aW9uLFxuICAgIHBhY2thZ2VMb2NhdGlvbixcbiAgICBvcHRpb25zLFxuICApID0+IHtcbiAgICByZXR1cm4gYXN5bmNUcmFtcG9saW5lKFxuICAgICAgZ2V0UGFyc2VyR2VuZXJhdG9yLFxuICAgICAgYnl0ZXMsXG4gICAgICBzcGVjaWZpZXIsXG4gICAgICBsb2NhdGlvbixcbiAgICAgIHBhY2thZ2VMb2NhdGlvbixcbiAgICAgIG9wdGlvbnMsXG4gICAgKTtcbiAgfTtcblxuICAvL1xuICAvL1xuICAvL1xuICBpZiAocHJlZmVyU3luY2hyb25vdXMpIHtcbiAgICB0cmFuc2Zvcm1zID0gc3luY01vZHVsZVRyYW5zZm9ybXM7XG4gICAgcmV0dXJuIHN5bmNQYXJzZXI7XG4gIH0gZWxzZSB7XG4gICAgLy9cbiAgICAvL1xuICAgIHRyYW5zZm9ybXMgPSB7XG4gICAgICAuLi5zeW5jTW9kdWxlVHJhbnNmb3JtcyxcbiAgICAgIC4uLm1vZHVsZVRyYW5zZm9ybXMsXG4gICAgfTtcblxuICAgIHJldHVybiBhc3luY1BhcnNlcjtcbiAgfVxufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmZ1bmN0aW9uIG1hcFBhcnNlcnMoXG4gIGxhbmd1YWdlRm9yRXh0ZW5zaW9uLFxuICBsYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllcixcbiAgcGFyc2VyRm9yTGFuZ3VhZ2UsXG4gIG1vZHVsZVRyYW5zZm9ybXMgPSB7fSxcbiAgc3luY01vZHVsZVRyYW5zZm9ybXMgPSB7fSxcbiAgcHJlZmVyU3luY2hyb25vdXMgPSBmYWxzZSxcbikge1xuICBjb25zdCBsYW5ndWFnZUZvckV4dGVuc2lvbkVudHJpZXMgPSBbXTtcbiAgY29uc3QgcHJvYmxlbXMgPSBbXTtcbiAgZm9yIChjb25zdCBbZXh0ZW5zaW9uLCBsYW5ndWFnZV0gb2YgZW50cmllcyhsYW5ndWFnZUZvckV4dGVuc2lvbikpIHtcbiAgICBpZiAoaGFzKHBhcnNlckZvckxhbmd1YWdlLCBsYW5ndWFnZSkpIHtcbiAgICAgIGxhbmd1YWdlRm9yRXh0ZW5zaW9uRW50cmllcy5wdXNoKFtleHRlbnNpb24sIGxhbmd1YWdlXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2JsZW1zLnB1c2goYCR7cShsYW5ndWFnZSl9IGZvciBleHRlbnNpb24gJHtxKGV4dGVuc2lvbil9YCk7XG4gICAgfVxuICB9XG4gIGlmIChwcm9ibGVtcy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgRXJyb3IoYE5vIHBhcnNlciBhdmFpbGFibGUgZm9yIGxhbmd1YWdlOiAke3Byb2JsZW1zLmpvaW4oJywgJyl9YCk7XG4gIH1cbiAgcmV0dXJuIG1ha2VFeHRlbnNpb25QYXJzZXIoXG4gICAgcHJlZmVyU3luY2hyb25vdXMsXG4gICAgZnJvbUVudHJpZXMobGFuZ3VhZ2VGb3JFeHRlbnNpb25FbnRyaWVzKSxcbiAgICBsYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllcixcbiAgICBwYXJzZXJGb3JMYW5ndWFnZSxcbiAgICBtb2R1bGVUcmFuc2Zvcm1zLFxuICAgIHN5bmNNb2R1bGVUcmFuc2Zvcm1zLFxuICApO1xufVxuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZU1hcFBhcnNlcnMgPSAoe1xuICBwYXJzZXJGb3JMYW5ndWFnZSxcbiAgbW9kdWxlVHJhbnNmb3JtcyxcbiAgc3luY01vZHVsZVRyYW5zZm9ybXMsXG59KSA9PiB7XG4gIC8qXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGFzeW5jUGFyc2VGbiA9IChsYW5ndWFnZUZvckV4dGVuc2lvbiwgbGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIpID0+XG4gICAgbWFwUGFyc2VycyhcbiAgICAgIGxhbmd1YWdlRm9yRXh0ZW5zaW9uLFxuICAgICAgbGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIsXG4gICAgICBwYXJzZXJGb3JMYW5ndWFnZSxcbiAgICAgIG1vZHVsZVRyYW5zZm9ybXMsXG4gICAgICBzeW5jTW9kdWxlVHJhbnNmb3JtcyxcbiAgICApO1xuXG4gIGlmIChtb2R1bGVUcmFuc2Zvcm1zICYmIGtleXMobW9kdWxlVHJhbnNmb3JtcykubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBhc3luY1BhcnNlRm47XG4gIH1cblxuICAvL1xuICAvL1xuICBpZiAodmFsdWVzKHBhcnNlckZvckxhbmd1YWdlKS5zb21lKCh7IHN5bmNocm9ub3VzIH0pID0+ICFzeW5jaHJvbm91cykpIHtcbiAgICByZXR1cm4gYXN5bmNQYXJzZUZuO1xuICB9XG5cbiAgLypcblxuXG5cblxuICAgKi9cbiAgcmV0dXJuIChsYW5ndWFnZUZvckV4dGVuc2lvbiwgbGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIpID0+XG4gICAgbWFwUGFyc2VycyhcbiAgICAgIGxhbmd1YWdlRm9yRXh0ZW5zaW9uLFxuICAgICAgbGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIsXG4gICAgICBwYXJzZXJGb3JMYW5ndWFnZSxcbiAgICAgIG1vZHVsZVRyYW5zZm9ybXMsXG4gICAgICBzeW5jTW9kdWxlVHJhbnNmb3JtcyxcbiAgICAgIHRydWUsXG4gICAgKTtcbn07JGjNj19vbmNlLm1ha2VNYXBQYXJzZXJzKG1ha2VNYXBQYXJzZXJzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VNYXBQYXJzZXJzIjpbIm1ha2VNYXBQYXJzZXJzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJscmtbPCwAAzwsAADwAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImpvaW4iLCJyZWxhdGl2aXplIiwicmVzb2x2ZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKlxuXG5cblxuICovXG5cbi8vXG5jb25zdCBxID0gSlNPTi5zdHJpbmdpZnk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBzb2x2ZSA9IChzb2x1dGlvbiwgcHJvYmxlbSkgPT4ge1xuICBmb3IgKGNvbnN0IHBhcnQgb2YgcHJvYmxlbSkge1xuICAgIGlmIChwYXJ0ID09PSAnLicgfHwgcGFydCA9PT0gJycpIHtcbiAgICAgIC8vXG4gICAgfSBlbHNlIGlmIChwYXJ0ID09PSAnLi4nKSB7XG4gICAgICBpZiAoc29sdXRpb24ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHNvbHV0aW9uLnBvcCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzb2x1dGlvbi5wdXNoKHBhcnQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHJlc29sdmUgPSAoc3BlYywgcmVmZXJyZXIpID0+IHtcbiAgc3BlYyA9IFN0cmluZyhzcGVjIHx8ICcnKTtcbiAgcmVmZXJyZXIgPSBTdHJpbmcocmVmZXJyZXIgfHwgJycpO1xuXG4gIGlmIChzcGVjLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgIHRocm93IEVycm9yKGBNb2R1bGUgc3BlY2lmaWVyICR7cShzcGVjKX0gbXVzdCBub3QgYmVnaW4gd2l0aCBcIi9cImApO1xuICB9XG4gIGlmICghcmVmZXJyZXIuc3RhcnRzV2l0aCgnLi8nKSkge1xuICAgIHRocm93IEVycm9yKGBNb2R1bGUgcmVmZXJyZXIgJHtxKHJlZmVycmVyKX0gbXVzdCBiZWdpbiB3aXRoIFwiLi9cImApO1xuICB9XG5cbiAgY29uc3Qgc3BlY1BhcnRzID0gc3BlYy5zcGxpdCgnLycpO1xuICBjb25zdCBzb2x1dGlvbiA9IFtdO1xuICBjb25zdCBwcm9ibGVtID0gW107XG4gIGlmIChzcGVjUGFydHNbMF0gPT09ICcuJyB8fCBzcGVjUGFydHNbMF0gPT09ICcuLicpIHtcbiAgICBjb25zdCByZWZlcnJlclBhcnRzID0gcmVmZXJyZXIuc3BsaXQoJy8nKTtcbiAgICBwcm9ibGVtLnB1c2goLi4ucmVmZXJyZXJQYXJ0cyk7XG4gICAgcHJvYmxlbS5wb3AoKTtcbiAgICBzb2x1dGlvbi5wdXNoKCcuJyk7XG4gIH1cbiAgcHJvYmxlbS5wdXNoKC4uLnNwZWNQYXJ0cyk7XG5cbiAgaWYgKCFzb2x2ZShzb2x1dGlvbiwgcHJvYmxlbSkpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBNb2R1bGUgc3BlY2lmaWVyICR7cShzcGVjKX0gdmlhIHJlZmVycmVyICR7cShcbiAgICAgICAgcmVmZXJyZXIsXG4gICAgICApfSBtdXN0IG5vdCB0cmF2ZXJzZSBiZWhpbmQgYW4gZW1wdHkgcGF0aGAsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBzb2x1dGlvbi5qb2luKCcvJyk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5yZXNvbHZlKHJlc29sdmUpO1xuICAgICAgIGNvbnN0IGpvaW4gPSAoYmFzZSwgc3BlYykgPT4ge1xuICBzcGVjID0gU3RyaW5nKHNwZWMgfHwgJycpO1xuICBiYXNlID0gU3RyaW5nKGJhc2UgfHwgJycpO1xuXG4gIGNvbnN0IHNwZWNQYXJ0cyA9IHNwZWMuc3BsaXQoJy8nKTtcbiAgY29uc3QgYmFzZVBhcnRzID0gYmFzZS5zcGxpdCgnLycpO1xuXG4gIGlmIChzcGVjUGFydHMubGVuZ3RoID4gMSAmJiBzcGVjUGFydHNbMF0gPT09ICcnKSB7XG4gICAgdGhyb3cgRXJyb3IoYE1vZHVsZSBzcGVjaWZpZXIgJHtxKHNwZWMpfSBtdXN0IG5vdCBzdGFydCB3aXRoIFwiL1wiYCk7XG4gIH1cbiAgaWYgKGJhc2VQYXJ0c1swXSA9PT0gJy4nIHx8IGJhc2VQYXJ0c1swXSA9PT0gJy4uJykge1xuICAgIHRocm93IEVycm9yKGBFeHRlcm5hbCBtb2R1bGUgc3BlY2lmaWVyICR7cShiYXNlKX0gbXVzdCBiZSBhYnNvbHV0ZWApO1xuICB9XG4gIGlmIChzcGVjUGFydHNbMF0gIT09ICcuJykge1xuICAgIHRocm93IEVycm9yKGBJbnRlcm5hbCBtb2R1bGUgc3BlY2lmaWVyICR7cShzcGVjKX0gbXVzdCBiZSByZWxhdGl2ZWApO1xuICB9XG5cbiAgY29uc3Qgc29sdXRpb24gPSBbXTtcbiAgaWYgKCFzb2x2ZShzb2x1dGlvbiwgc3BlY1BhcnRzKSkge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgYE1vZHVsZSBzcGVjaWZpZXIgJHtxKHNwZWMpfSB2aWEgYmFzZSAke3EoXG4gICAgICAgIGJhc2UsXG4gICAgICApfSBtdXN0IG5vdCByZWZlciB0byBhIG1vZHVsZSBvdXRzaWRlIG9mIHRoZSBiYXNlYCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIFtiYXNlLCAuLi5zb2x1dGlvbl0uam9pbignLycpO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5qb2luKGpvaW4pO1xuICAgICAgIGNvbnN0IHJlbGF0aXZpemUgPSBzcGVjID0+IHtcbiAgc3BlYyA9IFN0cmluZyhzcGVjIHx8ICcnKTtcblxuICBjb25zdCBzb2x1dGlvbiA9IFtdO1xuICBpZiAoIXNvbHZlKHNvbHV0aW9uLCBzcGVjLnNwbGl0KCcvJykpKSB7XG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICBgTW9kdWxlIHNwZWNpZmllciAke3Eoc3BlYyl9IG11c3Qgbm90IHRyYXZlcnNlIGJlaGluZCBhbiBlbXB0eSBwYXRoYCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIFsnLicsIC4uLnNvbHV0aW9uXS5qb2luKCcvJyk7XG59OyRozY9fb25jZS5yZWxhdGl2aXplKHJlbGF0aXZpemUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicmVzb2x2ZSI6WyJyZXNvbHZlIl0sImpvaW4iOlsiam9pbiJdLCJyZWxhdGl2aXplIjpbInJlbGF0aXZpemUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAuCqLH04FAABOBQAAMgAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3BhcnNlLWJ5dGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJkZWZhdWx0IiwicGFyc2VCeXRlcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKlxuXG5cbiAqL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuICovXG5jb25zdCBmcmVlemUgPSBPYmplY3QuZnJlZXplO1xuXG4vKiAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgcGFyc2VCeXRlcyA9IChieXRlcywgX3NwZWNpZmllciwgX2xvY2F0aW9uLCBfcGFja2FnZUxvY2F0aW9uKSA9PiB7XG4gIC8vXG4gIGNvbnN0IGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihieXRlcy5sZW5ndGgpO1xuICBjb25zdCBieXRlc1ZpZXcgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xuICBieXRlc1ZpZXcuc2V0KGJ5dGVzKTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGltcG9ydHMgPSBmcmVlemUoW10pO1xuXG4gIC8qXG5cbiAgICovXG4gIGNvbnN0IGV4ZWN1dGUgPSBleHBvcnRzID0+IHtcbiAgICBleHBvcnRzLmRlZmF1bHQgPSBidWZmZXI7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBwYXJzZXI6ICdieXRlcycsXG4gICAgYnl0ZXMsXG4gICAgcmVjb3JkOiBmcmVlemUoe1xuICAgICAgaW1wb3J0cyxcbiAgICAgIGV4cG9ydHM6IGZyZWV6ZShbJ2RlZmF1bHQnXSksXG4gICAgICBleGVjdXRlOiBmcmVlemUoZXhlY3V0ZSksXG4gICAgfSksXG4gIH07XG59O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5wYXJzZUJ5dGVzKHBhcnNlQnl0ZXMpO1xuY29uc3R7ZGVmYXVsdDokY82PX2RlZmF1bHR9PXtkZWZhdWx0OntcbiAgcGFyc2U6IHBhcnNlQnl0ZXMsXG4gIGhldXJpc3RpY0ltcG9ydHM6IGZhbHNlLFxuICBzeW5jaHJvbm91czogdHJ1ZSxcbn19OyRozY9fb25jZS5kZWZhdWx0KCRjzY9fZGVmYXVsdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXSwicGFyc2VCeXRlcyI6WyJwYXJzZUJ5dGVzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHU1Ym6pEwAAqRMAAEYAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9wYXJzZS1janMtc2hhcmVkLWV4cG9ydC13cmFwcGVyLmpzeyJpbXBvcnRzIjpbIi4vcG93ZXJzLmpzIl0sImV4cG9ydHMiOlsiZ2V0TW9kdWxlUGF0aHMiLCJ3cmFwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMsaXNSZWFkTm93UG93ZXJzOyRozY9faW1wb3J0cyhbW1wiLi9wb3dlcnMuanNcIiwgW1tcImZpbmRJbnZhbGlkUmVhZE5vd1Bvd2Vyc1Byb3BzXCIsWyRozY9fYSA9PiAoZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMgPSAkaM2PX2EpXV0sW1wiaXNSZWFkTm93UG93ZXJzXCIsWyRozY9fYSA9PiAoaXNSZWFkTm93UG93ZXJzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgYXBwbHkgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGZyZWV6ZSwga2V5cywgY3JlYXRlLCBoYXNPd25Qcm9wZXJ0eSwgZGVmaW5lUHJvcGVydHkgfSA9IE9iamVjdDtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgaGFzID0gKG9iamVjdCwga2V5KSA9PiBhcHBseShoYXNPd25Qcm9wZXJ0eSwgb2JqZWN0LCBba2V5XSk7XG5cbi8qXG5cbiAqL1xuY29uc3Qgbm9UcmFpbGluZ1NsYXNoID0gcGF0aCA9PiB7XG4gIGNvbnN0IGwgPSBwYXRoLmxlbmd0aCAtIDE7XG4gIHJldHVybiBwYXRoW2xdID09PSAnXFxcXCcgfHwgcGF0aFtsXSA9PT0gJy8nID8gcGF0aC5zbGljZSgwLCAtMSkgOiBwYXRoO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0TW9kdWxlUGF0aHMgPSAocmVhZFBvd2VycywgbG9jYXRpb24pID0+IHtcbiAgaWYgKFxuICAgIHJlYWRQb3dlcnMgJiZcbiAgICB0eXBlb2YgcmVhZFBvd2VycyAhPT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHJlYWRQb3dlcnMuZmlsZVVSTFRvUGF0aFxuICApIHtcbiAgICBsZXQgZmlsZW5hbWUgPSBsb2NhdGlvbjtcbiAgICBsZXQgZGlybmFtZTtcbiAgICB0cnkge1xuICAgICAgZGlybmFtZSA9IG5ldyBVUkwoJy4vJywgZmlsZW5hbWUpLmhyZWY7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZmlsZW5hbWU6IG51bGwsXG4gICAgICAgIGRpcm5hbWU6IG51bGwsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGZpbGVuYW1lID0gcmVhZFBvd2Vycy5maWxlVVJMVG9QYXRoKGZpbGVuYW1lKS50b1N0cmluZygpO1xuICAgIGRpcm5hbWUgPSBub1RyYWlsaW5nU2xhc2gocmVhZFBvd2Vycy5maWxlVVJMVG9QYXRoKGRpcm5hbWUpLnRvU3RyaW5nKCkpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbGVuYW1lLFxuICAgICAgZGlybmFtZSxcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7XG4gICAgICBmaWxlbmFtZTogbnVsbCxcbiAgICAgIGRpcm5hbWU6IG51bGwsXG4gICAgfTtcbiAgfVxufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5nZXRNb2R1bGVQYXRocyhnZXRNb2R1bGVQYXRocyk7XG4gICAgICAgY29uc3Qgd3JhcCA9ICh7XG4gIG1vZHVsZUVudmlyb25tZW50UmVjb3JkLFxuICBjb21wYXJ0bWVudCxcbiAgcmVzb2x2ZWRJbXBvcnRzLFxuICBsb2NhdGlvbixcbiAgcmVhZFBvd2Vycyxcbn0pID0+IHtcbiAgLy9cbiAgbW9kdWxlRW52aXJvbm1lbnRSZWNvcmQuZGVmYXVsdCA9IGNyZWF0ZShcbiAgICBjb21wYXJ0bWVudC5nbG9iYWxUaGlzLk9iamVjdC5wcm90b3R5cGUsXG4gICk7XG5cbiAgLy9cbiAgLy9cbiAgY29uc3QgcHJvbW90ZVRvTmFtZWRFeHBvcnQgPSAocHJvcCwgdmFsdWUpID0+IHtcbiAgICAvL1xuICAgIGlmIChwcm9wICE9PSAnZGVmYXVsdCcpIHtcbiAgICAgIG1vZHVsZUVudmlyb25tZW50UmVjb3JkW3Byb3BdID0gdmFsdWU7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHJlZGVmaW5lZCA9IG5ldyBTZXQoKTtcblxuICBjb25zdCBvcmlnaW5hbEV4cG9ydHMgPSBuZXcgUHJveHkobW9kdWxlRW52aXJvbm1lbnRSZWNvcmQuZGVmYXVsdCwge1xuICAgIHNldChfdGFyZ2V0LCBwcm9wLCB2YWx1ZSkge1xuICAgICAgcHJvbW90ZVRvTmFtZWRFeHBvcnQocHJvcCwgdmFsdWUpO1xuICAgICAgbW9kdWxlRW52aXJvbm1lbnRSZWNvcmQuZGVmYXVsdFtwcm9wXSA9IHZhbHVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3AsIGRlc2NyaXB0b3IpIHtcbiAgICAgIGlmIChoYXMoZGVzY3JpcHRvciwgJ3ZhbHVlJykpIHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgcHJvbW90ZVRvTmFtZWRFeHBvcnQocHJvcCwgZGVzY3JpcHRvci52YWx1ZSk7XG4gICAgICB9XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcCwgZGVzY3JpcHRvcik7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHJlZGVmaW5lZC5hZGQocHJvcCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICB9KTtcblxuICBjb25zdCBtb2R1bGUgPSB7IGV4cG9ydHM6IG9yaWdpbmFsRXhwb3J0cyB9O1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHJlcXVpcmUgPSBpbXBvcnRTcGVjaWZpZXIgPT4ge1xuICAgIC8vXG5cbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBsZXQgbmFtZXNwYWNlO1xuXG4gICAgaWYgKCFoYXMocmVzb2x2ZWRJbXBvcnRzLCBpbXBvcnRTcGVjaWZpZXIpKSB7XG4gICAgICBpZiAoaXNSZWFkTm93UG93ZXJzKHJlYWRQb3dlcnMpKSB7XG4gICAgICAgIG5hbWVzcGFjZSA9IGNvbXBhcnRtZW50LmltcG9ydE5vdyhpbXBvcnRTcGVjaWZpZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgaW52YWxpZFByb3BzID0gZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMocmVhZFBvd2Vycykuc29ydCgpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFN5bmNocm9ub3VzIHJlYWRQb3dlcnMgcmVxdWlyZWQgZm9yIGR5bmFtaWMgaW1wb3J0IG9mICR7YXNzZXJ0LnF1b3RlKGltcG9ydFNwZWNpZmllcil9OyBtaXNzaW5nIG9yIGludmFsaWQgcHJvcChzKTogJHtpbnZhbGlkUHJvcHMuam9pbignLCAnKX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuYW1lc3BhY2UgPSBjb21wYXJ0bWVudC5pbXBvcnROb3cocmVzb2x2ZWRJbXBvcnRzW2ltcG9ydFNwZWNpZmllcl0pO1xuICAgIH1cblxuICAgIC8vXG4gICAgLy9cbiAgICBpZiAoaGFzKG5hbWVzcGFjZSwgJ2RlZmF1bHQnKSkge1xuICAgICAgcmV0dXJuIG5hbWVzcGFjZS5kZWZhdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmFtZXNwYWNlO1xuICAgIH1cbiAgfTtcbiAgaWYgKHR5cGVvZiByZWFkUG93ZXJzID09PSAnb2JqZWN0JyAmJiByZWFkUG93ZXJzLnJlcXVpcmVSZXNvbHZlKSB7XG4gICAgY29uc3QgeyByZXF1aXJlUmVzb2x2ZSB9ID0gcmVhZFBvd2VycztcbiAgICByZXF1aXJlLnJlc29sdmUgPSBmcmVlemUoKHNwZWNpZmllciwgb3B0aW9ucykgPT5cbiAgICAgIHJlcXVpcmVSZXNvbHZlKGxvY2F0aW9uLCBzcGVjaWZpZXIsIG9wdGlvbnMpLFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgcmVxdWlyZS5yZXNvbHZlID0gZnJlZXplKHNwZWNpZmllciA9PiB7XG4gICAgICBjb25zdCBlcnJvciA9IEVycm9yKFxuICAgICAgICBgQ2Fubm90IGZpbmQgbW9kdWxlICcke3NwZWNpZmllcn0nXFxuQWRkIHJlcXVpcmVSZXNvbHZlIHRvIEVuZG8gQ29tcGFydG1lbnQgTWFwcGVyIHJlYWRQb3dlcnMuYCxcbiAgICAgICk7XG4gICAgICBkZWZpbmVQcm9wZXJ0eShlcnJvciwgJ2NvZGUnLCB7IHZhbHVlOiAnTU9EVUxFX05PVF9GT1VORCcgfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbiAgfVxuXG4gIGZyZWV6ZShyZXF1aXJlKTtcblxuICBjb25zdCBhZnRlckV4ZWN1dGUgPSAoKSA9PiB7XG4gICAgY29uc3QgZmluYWxFeHBvcnRzID0gbW9kdWxlLmV4cG9ydHM7IC8vXG4gICAgY29uc3QgZXhwb3J0c0hhdmVCZWVuT3ZlcndyaXR0ZW4gPSBmaW5hbEV4cG9ydHMgIT09IG9yaWdpbmFsRXhwb3J0cztcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBpZiAoZXhwb3J0c0hhdmVCZWVuT3ZlcndyaXR0ZW4pIHtcbiAgICAgIG1vZHVsZUVudmlyb25tZW50UmVjb3JkLmRlZmF1bHQgPSBmaW5hbEV4cG9ydHM7XG4gICAgICBmb3IgKGNvbnN0IHByb3Agb2Yga2V5cyhtb2R1bGVFbnZpcm9ubWVudFJlY29yZC5kZWZhdWx0IHx8IHt9KSkge1xuICAgICAgICBpZiAocHJvcCAhPT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgICAgbW9kdWxlRW52aXJvbm1lbnRSZWNvcmRbcHJvcF0gPSBtb2R1bGVFbnZpcm9ubWVudFJlY29yZC5kZWZhdWx0W3Byb3BdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiByZWRlZmluZWQpIHtcbiAgICAgICAgbW9kdWxlRW52aXJvbm1lbnRSZWNvcmRbcHJvcF0gPSBtb2R1bGVFbnZpcm9ubWVudFJlY29yZC5kZWZhdWx0W3Byb3BdO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICByZXR1cm4ge1xuICAgIG1vZHVsZSxcbiAgICBtb2R1bGVFeHBvcnRzOiBvcmlnaW5hbEV4cG9ydHMsXG4gICAgYWZ0ZXJFeGVjdXRlLFxuICAgIHJlcXVpcmUsXG4gIH07XG59OyRozY9fb25jZS53cmFwKHdyYXApO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0TW9kdWxlUGF0aHMiOlsiZ2V0TW9kdWxlUGF0aHMiXSwid3JhcCI6WyJ3cmFwIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAH6/VuZEBQAARAUAADEAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9wYXJzZS1qc29uLmpzeyJpbXBvcnRzIjpbIi4vanNvbi5qcyJdLCJleHBvcnRzIjpbImRlZmF1bHQiLCJwYXJzZUpzb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBwYXJzZUxvY2F0ZWRKc29uOyRozY9faW1wb3J0cyhbW1wiLi9qc29uLmpzXCIsIFtbXCJwYXJzZUxvY2F0ZWRKc29uXCIsWyRozY9fYSA9PiAocGFyc2VMb2NhdGVkSnNvbiA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuLypcblxuXG5cblxuICovXG5jb25zdCBmcmVlemUgPSBPYmplY3QuZnJlZXplO1xuXG5jb25zdCB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKiAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgcGFyc2VKc29uID0gKGJ5dGVzLCBfc3BlY2lmaWVyLCBsb2NhdGlvbiwgX3BhY2thZ2VMb2NhdGlvbikgPT4ge1xuICBjb25zdCBzb3VyY2UgPSB0ZXh0RGVjb2Rlci5kZWNvZGUoYnl0ZXMpO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGltcG9ydHMgPSBmcmVlemUoW10pO1xuXG4gIC8qXG5cbiAgICovXG4gIGNvbnN0IGV4ZWN1dGUgPSBleHBvcnRzID0+IHtcbiAgICBleHBvcnRzLmRlZmF1bHQgPSBwYXJzZUxvY2F0ZWRKc29uKHNvdXJjZSwgbG9jYXRpb24pO1xuICB9O1xuICByZXR1cm4ge1xuICAgIHBhcnNlcjogJ2pzb24nLFxuICAgIGJ5dGVzLFxuICAgIHJlY29yZDogZnJlZXplKHtcbiAgICAgIGltcG9ydHMsXG4gICAgICBleHBvcnRzOiBmcmVlemUoWydkZWZhdWx0J10pLFxuICAgICAgZXhlY3V0ZTogZnJlZXplKGV4ZWN1dGUpLFxuICAgIH0pLFxuICB9O1xufTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UucGFyc2VKc29uKHBhcnNlSnNvbik7XG5jb25zdHtkZWZhdWx0OiRjzY9fZGVmYXVsdH09e2RlZmF1bHQ6e1xuICBwYXJzZTogcGFyc2VKc29uLFxuICBoZXVyaXN0aWNJbXBvcnRzOiBmYWxzZSxcbiAgc3luY2hyb25vdXM6IHRydWUsXG59fTskaM2PX29uY2UuZGVmYXVsdCgkY82PX2RlZmF1bHQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il0sInBhcnNlSnNvbiI6WyJwYXJzZUpzb24iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAk1bSVB4IAAAeCAAANAAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3BhcnNlLXByZS1janMuanN7ImltcG9ydHMiOlsiLi9qc29uLmpzIiwiLi9wYXJzZS1janMtc2hhcmVkLWV4cG9ydC13cmFwcGVyLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdCIsInBhcnNlUHJlQ2pzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcGFyc2VMb2NhdGVkSnNvbix3cmFwLGdldE1vZHVsZVBhdGhzOyRozY9faW1wb3J0cyhbW1wiLi9qc29uLmpzXCIsIFtbXCJwYXJzZUxvY2F0ZWRKc29uXCIsWyRozY9fYSA9PiAocGFyc2VMb2NhdGVkSnNvbiA9ICRozY9fYSldXV1dLFtcIi4vcGFyc2UtY2pzLXNoYXJlZC1leHBvcnQtd3JhcHBlci5qc1wiLCBbW1wid3JhcFwiLFskaM2PX2EgPT4gKHdyYXAgPSAkaM2PX2EpXV0sW1wiZ2V0TW9kdWxlUGF0aHNcIixbJGjNj19hID0+IChnZXRNb2R1bGVQYXRocyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKiAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgcGFyc2VQcmVDanMgPSAoXG4gIGJ5dGVzLFxuICBfc3BlY2lmaWVyLFxuICBsb2NhdGlvbixcbiAgX3BhY2thZ2VMb2NhdGlvbixcbiAgeyByZWFkUG93ZXJzIH0gPSB7fSxcbikgPT4ge1xuICBjb25zdCB0ZXh0ID0gdGV4dERlY29kZXIuZGVjb2RlKGJ5dGVzKTtcbiAgY29uc3QgeyBzb3VyY2UsIGltcG9ydHMsIGV4cG9ydHMsIHJlZXhwb3J0cyB9ID0gcGFyc2VMb2NhdGVkSnNvbihcbiAgICB0ZXh0LFxuICAgIGxvY2F0aW9uLFxuICApO1xuXG4gIGNvbnN0IHsgZmlsZW5hbWUsIGRpcm5hbWUgfSA9IGdldE1vZHVsZVBhdGhzKHJlYWRQb3dlcnMsIGxvY2F0aW9uKTtcblxuICAvKlxuXG5cblxuICAgKi9cbiAgY29uc3QgZXhlY3V0ZSA9IChtb2R1bGVFbnZpcm9ubWVudFJlY29yZCwgY29tcGFydG1lbnQsIHJlc29sdmVkSW1wb3J0cykgPT4ge1xuICAgIGNvbnN0IGZ1bmN0b3IgPSBjb21wYXJ0bWVudC5ldmFsdWF0ZShzb3VyY2UpO1xuXG4gICAgY29uc3QgeyByZXF1aXJlLCBtb2R1bGVFeHBvcnRzLCBtb2R1bGUsIGFmdGVyRXhlY3V0ZSB9ID0gd3JhcCh7XG4gICAgICBtb2R1bGVFbnZpcm9ubWVudFJlY29yZCxcbiAgICAgIGNvbXBhcnRtZW50LFxuICAgICAgcmVzb2x2ZWRJbXBvcnRzLFxuICAgICAgbG9jYXRpb24sXG4gICAgICByZWFkUG93ZXJzLFxuICAgIH0pO1xuXG4gICAgLy9cbiAgICBmdW5jdG9yLmNhbGwoXG4gICAgICBtb2R1bGVFeHBvcnRzLFxuICAgICAgcmVxdWlyZSxcbiAgICAgIG1vZHVsZUV4cG9ydHMsXG4gICAgICBtb2R1bGUsXG4gICAgICBmaWxlbmFtZSxcbiAgICAgIGRpcm5hbWUsXG4gICAgKTtcblxuICAgIGFmdGVyRXhlY3V0ZSgpO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgcGFyc2VyOiAncHJlLWNqcy1qc29uJyxcbiAgICBieXRlcyxcbiAgICByZWNvcmQ6IHtcbiAgICAgIGltcG9ydHMsXG4gICAgICByZWV4cG9ydHMsXG4gICAgICBleHBvcnRzLFxuICAgICAgZXhlY3V0ZSxcbiAgICB9LFxuICB9O1xufTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UucGFyc2VQcmVDanMocGFyc2VQcmVDanMpO1xuY29uc3R7ZGVmYXVsdDokY82PX2RlZmF1bHR9PXtkZWZhdWx0OntcbiAgcGFyc2U6IHBhcnNlUHJlQ2pzLFxuICBoZXVyaXN0aWNJbXBvcnRzOiB0cnVlLFxuICBzeW5jaHJvbm91czogdHJ1ZSxcbn19OyRozY9fb25jZS5kZWZhdWx0KCRjzY9fZGVmYXVsdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXSwicGFyc2VQcmVDanMiOlsicGFyc2VQcmVDanMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA7KidoVEFAABRBQAANAAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3BhcnNlLXByZS1tanMuanN7ImltcG9ydHMiOlsiLi9qc29uLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdCIsInBhcnNlUHJlTWpzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcGFyc2VMb2NhdGVkSnNvbjskaM2PX2ltcG9ydHMoW1tcIi4vanNvbi5qc1wiLCBbW1wicGFyc2VMb2NhdGVkSnNvblwiLFskaM2PX2EgPT4gKHBhcnNlTG9jYXRlZEpzb24gPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKiAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgcGFyc2VQcmVNanMgPSAoXG4gIGJ5dGVzLFxuICBfc3BlY2lmaWVyLFxuICBsb2NhdGlvbixcbiAgX3BhY2thZ2VMb2NhdGlvbixcbiAgeyBzb3VyY2VNYXBVcmwgfSA9IHt9LFxuKSA9PiB7XG4gIGNvbnN0IHRleHQgPSB0ZXh0RGVjb2Rlci5kZWNvZGUoYnl0ZXMpO1xuICBjb25zdCByZWNvcmQgPSBwYXJzZUxvY2F0ZWRKc29uKHRleHQsIGxvY2F0aW9uKTtcbiAgaWYgKHNvdXJjZU1hcFVybCkge1xuICAgIC8vXG4gICAgcmVjb3JkLl9fc3luY01vZHVsZVByb2dyYW1fXyArPSBgLy8jIHNvdXJjZU1hcHBpbmdVUkw9JHtzb3VyY2VNYXBVcmx9XFxuYDtcbiAgfSBlbHNlIHtcbiAgICAvL1xuICAgIHJlY29yZC5fX3N5bmNNb2R1bGVQcm9ncmFtX18gKz0gYC8vIyBzb3VyY2VVUkw9JHtsb2NhdGlvbn1cXG5gO1xuICB9XG4gIHJldHVybiB7XG4gICAgcGFyc2VyOiAncHJlLW1qcy1qc29uJyxcbiAgICBieXRlcyxcbiAgICByZWNvcmQsXG4gIH07XG59O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5wYXJzZVByZU1qcyhwYXJzZVByZU1qcyk7XG5jb25zdHtkZWZhdWx0OiRjzY9fZGVmYXVsdH09e2RlZmF1bHQ6e1xuICBwYXJzZTogcGFyc2VQcmVNanMsXG4gIGhldXJpc3RpY0ltcG9ydHM6IGZhbHNlLFxuICBzeW5jaHJvbm91czogdHJ1ZSxcbn19OyRozY9fb25jZS5kZWZhdWx0KCRjzY9fZGVmYXVsdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXSwicGFyc2VQcmVNanMiOlsicGFyc2VQcmVNanMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAdmA97PoEAAD6BAAAMQAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3BhcnNlLXRleHQuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImRlZmF1bHQiLCJwYXJzZVRleHQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LypcblxuXG5cbiAqL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuICovXG5jb25zdCBmcmVlemUgPSBPYmplY3QuZnJlZXplO1xuXG5jb25zdCB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKiAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgcGFyc2VUZXh0ID0gKGJ5dGVzLCBfc3BlY2lmaWVyLCBfbG9jYXRpb24sIF9wYWNrYWdlTG9jYXRpb24pID0+IHtcbiAgY29uc3QgdGV4dCA9IHRleHREZWNvZGVyLmRlY29kZShieXRlcyk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBpbXBvcnRzID0gZnJlZXplKFtdKTtcblxuICAvKlxuXG4gICAqL1xuICBjb25zdCBleGVjdXRlID0gZXhwb3J0cyA9PiB7XG4gICAgZXhwb3J0cy5kZWZhdWx0ID0gdGV4dDtcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIHBhcnNlcjogJ3RleHQnLFxuICAgIGJ5dGVzLFxuICAgIHJlY29yZDogZnJlZXplKHtcbiAgICAgIGltcG9ydHMsXG4gICAgICBleHBvcnRzOiBmcmVlemUoWydkZWZhdWx0J10pLFxuICAgICAgZXhlY3V0ZTogZnJlZXplKGV4ZWN1dGUpLFxuICAgIH0pLFxuICB9O1xufTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UucGFyc2VUZXh0KHBhcnNlVGV4dCk7XG5jb25zdHtkZWZhdWx0OiRjzY9fZGVmYXVsdH09e2RlZmF1bHQ6e1xuICBwYXJzZTogcGFyc2VUZXh0LFxuICBoZXVyaXN0aWNJbXBvcnRzOiBmYWxzZSxcbiAgc3luY2hyb25vdXM6IHRydWUsXG59fTskaM2PX29uY2UuZGVmYXVsdCgkY82PX2RlZmF1bHQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il0sInBhcnNlVGV4dCI6WyJwYXJzZVRleHQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAABuT8atUYAADVGAAANAAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3BvbGljeS1mb3JtYXQuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImFzc2VydFBhY2thZ2VQb2xpY3kiLCJhc3NlcnRQb2xpY3kiLCJnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24iLCJpc0FsbG93aW5nRXZlcnl0aGluZyIsImlzQXR0ZW51YXRpb25EZWZpbml0aW9uIiwicG9saWN5TG9va3VwSGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qXG5cblxuICovXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuY29uc3QgeyBlbnRyaWVzLCBrZXlzIH0gPSBPYmplY3Q7XG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3QgcSA9IEpTT04uc3RyaW5naWZ5O1xuXG5jb25zdCBBVFRFTlVBVE9SX0tFWSA9ICdhdHRlbnVhdGUnO1xuY29uc3QgQVRURU5VQVRPUl9QQVJBTVNfS0VZID0gJ3BhcmFtcyc7XG5jb25zdCBXSUxEQ0FSRF9QT0xJQ1lfVkFMVUUgPSAnYW55JztcbmNvbnN0IFBPTElDWV9GSUVMRFNfTE9PS1VQID0gLyogICAgICAgICAgICAgICAgKi8gKFtcbiAgJ2J1aWx0aW5zJyxcbiAgJ2dsb2JhbHMnLFxuICAncGFja2FnZXMnLFxuXSk7XG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcG9saWN5TG9va3VwSGVscGVyID0gKHBhY2thZ2VQb2xpY3ksIGZpZWxkLCBpdGVtTmFtZSkgPT4ge1xuICBpZiAoIVBPTElDWV9GSUVMRFNfTE9PS1VQLmluY2x1ZGVzKGZpZWxkKSkge1xuICAgIHRocm93IEVycm9yKGBJbnZhbGlkIGZpZWxkICR7cShmaWVsZCl9YCk7XG4gIH1cbiAgaWYgKFxuICAgIHR5cGVvZiBwYWNrYWdlUG9saWN5ICE9PSAnb2JqZWN0JyB8fFxuICAgIHBhY2thZ2VQb2xpY3kgPT09IG51bGwgfHxcbiAgICAhcGFja2FnZVBvbGljeVtmaWVsZF1cbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHBhY2thZ2VQb2xpY3lbZmllbGRdID09PSBXSUxEQ0FSRF9QT0xJQ1lfVkFMVUUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlID0gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChcbiAgICBwYWNrYWdlUG9saWN5W2ZpZWxkXVxuICApO1xuICBpZiAoaXRlbU5hbWUgaW4gdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWVbaXRlbU5hbWVdO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS5wb2xpY3lMb29rdXBIZWxwZXIocG9saWN5TG9va3VwSGVscGVyKTtcbiAgICAgICBjb25zdCBpc0FsbG93aW5nRXZlcnl0aGluZyA9IHBvbGljeVZhbHVlID0+XG4gIHBvbGljeVZhbHVlID09PSBXSUxEQ0FSRF9QT0xJQ1lfVkFMVUU7XG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UuaXNBbGxvd2luZ0V2ZXJ5dGhpbmcoaXNBbGxvd2luZ0V2ZXJ5dGhpbmcpO1xuICAgICAgIGNvbnN0IGlzQXR0ZW51YXRpb25EZWZpbml0aW9uID0gYWxsZWdlZERlZmluaXRpb24gPT4ge1xuICByZXR1cm4gQm9vbGVhbihcbiAgICAoYWxsZWdlZERlZmluaXRpb24gJiZcbiAgICAgIHR5cGVvZiBhbGxlZ2VkRGVmaW5pdGlvbiA9PT0gJ29iamVjdCcgJiZcbiAgICAgIHR5cGVvZiBhbGxlZ2VkRGVmaW5pdGlvbltBVFRFTlVBVE9SX0tFWV0gPT09ICdzdHJpbmcnKSB8fCAvL1xuICAgICAgaXNBcnJheShhbGxlZ2VkRGVmaW5pdGlvbikgIC8vXG4gICk7XG59O1xuXG4vKlxuXG5cblxuICovJGjNj19vbmNlLmlzQXR0ZW51YXRpb25EZWZpbml0aW9uKGlzQXR0ZW51YXRpb25EZWZpbml0aW9uKTtcbiAgICAgICBjb25zdCBnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24gPSBhdHRlbnVhdGlvbkRlZmluaXRpb24gPT4ge1xuICBpZiAoIWlzQXR0ZW51YXRpb25EZWZpbml0aW9uKGF0dGVudWF0aW9uRGVmaW5pdGlvbikpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBJbnZhbGlkIGF0dGVudWF0aW9uICR7cShcbiAgICAgICAgYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuICAgICAgKX0sIG11c3QgYmUgYW4gYXJyYXkgb2YgcGFyYW1zIGZvciBkZWZhdWx0IGF0dGVudWF0b3Igb3IgYW4gb2JqZWN0IHdpdGggYW4gYXR0ZW51YXRvciBrZXlgLFxuICAgICk7XG4gIH1cbiAgaWYgKGlzQXJyYXkoYXR0ZW51YXRpb25EZWZpbml0aW9uKSkge1xuICAgIHJldHVybiB7XG4gICAgICBkaXNwbGF5TmFtZTogJzxkZWZhdWx0IGF0dGVudWF0b3I+JyxcbiAgICAgIHNwZWNpZmllcjogbnVsbCxcbiAgICAgIHBhcmFtczogYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRpc3BsYXlOYW1lOiBhdHRlbnVhdGlvbkRlZmluaXRpb25bQVRURU5VQVRPUl9LRVldLFxuICAgICAgc3BlY2lmaWVyOiBhdHRlbnVhdGlvbkRlZmluaXRpb25bQVRURU5VQVRPUl9LRVldLFxuICAgICAgcGFyYW1zOiBhdHRlbnVhdGlvbkRlZmluaXRpb25bQVRURU5VQVRPUl9QQVJBTVNfS0VZXSxcbiAgICB9O1xuICB9XG59O1xuXG4vL1xuJGjNj19vbmNlLmdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbihnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24pO2NvbnN0IGlzUmVjb3JkT2Y9KGl0ZW0scHJlZGljYXRlKT0+e1xuICBpZiAodHlwZW9mIGl0ZW0gIT09ICdvYmplY3QnIHx8IGl0ZW0gPT09IG51bGwgfHwgaXNBcnJheShpdGVtKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gZW50cmllcyhpdGVtKS5ldmVyeSgoW2tleSwgdmFsdWVdKSA9PiBwcmVkaWNhdGUodmFsdWUsIGtleSkpO1xufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgaXNCb29sZWFuID0gaXRlbSA9PiB0eXBlb2YgaXRlbSA9PT0gJ2Jvb2xlYW4nO1xuXG4vL1xuY29uc3QgcHJlZGljYXRlT3IgPVxuICAoLi4ucHJlZGljYXRlcykgPT5cbiAgaXRlbSA9PlxuICAgIHByZWRpY2F0ZXMuc29tZShwID0+IHAoaXRlbSkpO1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgaXNQb2xpY3lJdGVtID0gaXRlbSA9PlxuICBpdGVtID09PSB1bmRlZmluZWQgfHxcbiAgaXRlbSA9PT0gV0lMRENBUkRfUE9MSUNZX1ZBTFVFIHx8XG4gIGlzUmVjb3JkT2YoaXRlbSwgaXNCb29sZWFuKTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRQYWNrYWdlUG9saWN5ID0gKGFsbGVnZWRQYWNrYWdlUG9saWN5LCBwYXRoLCB1cmwpID0+IHtcbiAgaWYgKGFsbGVnZWRQYWNrYWdlUG9saWN5ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgaW5VcmwgPSB1cmwgPyBgIGluICR7cSh1cmwpfWAgOiAnJztcblxuICBjb25zdCBwYWNrYWdlUG9saWN5ID0gT2JqZWN0KGFsbGVnZWRQYWNrYWdlUG9saWN5KTtcbiAgYXNzZXJ0KFxuICAgIGFsbGVnZWRQYWNrYWdlUG9saWN5ID09PSBwYWNrYWdlUG9saWN5ICYmICFpc0FycmF5KGFsbGVnZWRQYWNrYWdlUG9saWN5KSxcbiAgICBgJHtwYXRofSBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7cShhbGxlZ2VkUGFja2FnZVBvbGljeSl9JHtpblVybH1gLFxuICApO1xuICBjb25zdCB7XG4gICAgcGFja2FnZXMsXG4gICAgYnVpbHRpbnMsXG4gICAgZ2xvYmFscyxcbiAgICBub0dsb2JhbEZyZWV6ZSxcbiAgICBkZWZhdWx0QXR0ZW51YXRvcjogX2lnbm9yZSwgLy9cbiAgICAvL1xuICAgIG9wdGlvbnMsIC8vXG4gICAgLi4uZXh0cmFcbiAgfSA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChwYWNrYWdlUG9saWN5KTtcblxuICBhc3NlcnQoXG4gICAga2V5cyhleHRyYSkubGVuZ3RoID09PSAwLFxuICAgIGAke3BhdGh9IG11c3Qgbm90IGhhdmUgZXh0cmEgcHJvcGVydGllcywgZ290ICR7cShrZXlzKGV4dHJhKSl9JHtpblVybH1gLFxuICApO1xuXG4gIGFzc2VydChcbiAgICBub0dsb2JhbEZyZWV6ZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBub0dsb2JhbEZyZWV6ZSA9PT0gJ2Jvb2xlYW4nLFxuICAgIGAke3BhdGh9Lm5vR2xvYmFsRnJlZXplIG11c3QgYmUgYSBib29sZWFuLCBnb3QgJHtxKHtcbiAgICAgIG5vR2xvYmFsRnJlZXplLFxuICAgIH0pfSR7aW5Vcmx9YCxcbiAgKTtcblxuICBpc1BvbGljeUl0ZW0ocGFja2FnZXMpIHx8XG4gICAgYXNzZXJ0LmZhaWwoXG4gICAgICBgJHtwYXRofS5wYWNrYWdlcyBtdXN0IGJlIGEgcmVjb3JkIG9mIGJvb2xlYW5zLCBnb3QgJHtxKHtcbiAgICAgICAgcGFja2FnZXMsXG4gICAgICB9KX0ke2luVXJsfWAsXG4gICAgKTtcblxuICBpc1BvbGljeUl0ZW0oZ2xvYmFscykgfHxcbiAgICBpc0F0dGVudWF0aW9uRGVmaW5pdGlvbihnbG9iYWxzKSB8fFxuICAgIGFzc2VydC5mYWlsKFxuICAgICAgYCR7cGF0aH0uZ2xvYmFscyBtdXN0IGJlIGEgcmVjb3JkIG9mIGJvb2xlYW5zIG9yIGEgc2luZ2xlIGF0dGVudWF0aW9uLCBnb3QgJHtxKFxuICAgICAgICB7XG4gICAgICAgICAgZ2xvYmFscyxcbiAgICAgICAgfSxcbiAgICAgICl9JHtpblVybH1gLFxuICAgICk7XG5cbiAgaXNQb2xpY3lJdGVtKGJ1aWx0aW5zKSB8fFxuICAgIGlzUmVjb3JkT2YoYnVpbHRpbnMsIHByZWRpY2F0ZU9yKGlzQm9vbGVhbiwgaXNBdHRlbnVhdGlvbkRlZmluaXRpb24pKSB8fFxuICAgIGFzc2VydC5mYWlsKFxuICAgICAgYCR7cGF0aH0uYnVpbHRpbnMgbXVzdCBiZSBhIHJlY29yZCBvZiBib29sZWFucyBvciBhdHRlbnVhdGlvbnMsIGdvdCAke3Eoe1xuICAgICAgICBidWlsdGlucyxcbiAgICAgIH0pfSR7aW5Vcmx9YCxcbiAgICApO1xufTtcblxuLypcblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5hc3NlcnRQYWNrYWdlUG9saWN5KGFzc2VydFBhY2thZ2VQb2xpY3kpO1xuICAgICAgIGNvbnN0IGFzc2VydFBvbGljeSA9IGFsbGVnZWRQb2xpY3kgPT4ge1xuICBpZiAoYWxsZWdlZFBvbGljeSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHBvbGljeSA9IE9iamVjdChhbGxlZ2VkUG9saWN5KTtcbiAgYXNzZXJ0KFxuICAgIGFsbGVnZWRQb2xpY3kgPT09IHBvbGljeSAmJiAhQXJyYXkuaXNBcnJheShwb2xpY3kpLFxuICAgIGBwb2xpY3kgbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke2FsbGVnZWRQb2xpY3l9YCxcbiAgKTtcblxuICBjb25zdCB7IHJlc291cmNlcywgZW50cnksIGRlZmF1bHRBdHRlbnVhdG9yLCAuLi5leHRyYSB9ID0gcG9saWN5O1xuICBhc3NlcnQoXG4gICAga2V5cyhleHRyYSkubGVuZ3RoID09PSAwLFxuICAgIGBwb2xpY3kgbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzLCBnb3QgJHtxKGtleXMoZXh0cmEpKX1gLFxuICApO1xuXG4gIGFzc2VydChcbiAgICB0eXBlb2YgcmVzb3VyY2VzID09PSAnb2JqZWN0JyAmJiByZXNvdXJjZXMgIT09IG51bGwgJiYgIWlzQXJyYXkocmVzb3VyY2VzKSxcbiAgICBgcG9saWN5LnJlc291cmNlcyBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7cShyZXNvdXJjZXMpfWAsXG4gICk7XG4gIGFzc2VydChcbiAgICAhZGVmYXVsdEF0dGVudWF0b3IgfHwgdHlwZW9mIGRlZmF1bHRBdHRlbnVhdG9yID09PSAnc3RyaW5nJyxcbiAgICBgcG9saWN5LmRlZmF1bHRBdHRlbnVhdG9yIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3EoZGVmYXVsdEF0dGVudWF0b3IpfWAsXG4gICk7XG5cbiAgYXNzZXJ0UGFja2FnZVBvbGljeShlbnRyeSwgYHBvbGljeS5lbnRyeWApO1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGVudHJpZXMocmVzb3VyY2VzKSkge1xuICAgIGFzc2VydFBhY2thZ2VQb2xpY3kodmFsdWUsIGBwb2xpY3kucmVzb3VyY2VzW1wiJHtrZXl9XCJdYCk7XG4gIH1cbn07JGjNj19vbmNlLmFzc2VydFBvbGljeShhc3NlcnRQb2xpY3kpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicG9saWN5TG9va3VwSGVscGVyIjpbInBvbGljeUxvb2t1cEhlbHBlciJdLCJpc0FsbG93aW5nRXZlcnl0aGluZyI6WyJpc0FsbG93aW5nRXZlcnl0aGluZyJdLCJpc0F0dGVudWF0aW9uRGVmaW5pdGlvbiI6WyJpc0F0dGVudWF0aW9uRGVmaW5pdGlvbiJdLCJnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24iOlsiZ2V0QXR0ZW51YXRvckZyb21EZWZpbml0aW9uIl0sImFzc2VydFBhY2thZ2VQb2xpY3kiOlsiYXNzZXJ0UGFja2FnZVBvbGljeSJdLCJhc3NlcnRQb2xpY3kiOlsiYXNzZXJ0UG9saWN5Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPE/zSY+KgAAPioAAC0AAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9wb2xpY3kuanN7ImltcG9ydHMiOlsiLi9wb2xpY3ktZm9ybWF0LmpzIl0sImV4cG9ydHMiOlsiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQiLCJhdHRlbnVhdGVHbG9iYWxzIiwiYXR0ZW51YXRlTW9kdWxlSG9vayIsImRlcGVuZGVuY3lBbGxvd2VkQnlQb2xpY3kiLCJkZXRlY3RBdHRlbnVhdG9ycyIsImVuZm9yY2VNb2R1bGVQb2xpY3kiLCJnZXRQb2xpY3lGb3JQYWNrYWdlIiwibWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbixpc0FsbG93aW5nRXZlcnl0aGluZyxpc0F0dGVudWF0aW9uRGVmaW5pdGlvbixwb2xpY3lMb29rdXBIZWxwZXI7JGjNj19pbXBvcnRzKFtbXCIuL3BvbGljeS1mb3JtYXQuanNcIiwgW1tcImdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvblwiLFskaM2PX2EgPT4gKGdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbiA9ICRozY9fYSldXSxbXCJpc0FsbG93aW5nRXZlcnl0aGluZ1wiLFskaM2PX2EgPT4gKGlzQWxsb3dpbmdFdmVyeXRoaW5nID0gJGjNj19hKV1dLFtcImlzQXR0ZW51YXRpb25EZWZpbml0aW9uXCIsWyRozY9fYSA9PiAoaXNBdHRlbnVhdGlvbkRlZmluaXRpb24gPSAkaM2PX2EpXV0sW1wicG9saWN5TG9va3VwSGVscGVyXCIsWyRozY9fYSA9PiAocG9saWN5TG9va3VwSGVscGVyID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB7IGNyZWF0ZSwgZW50cmllcywgdmFsdWVzLCBhc3NpZ24sIGZyZWV6ZSwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyB9ID1cbiAgT2JqZWN0O1xuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgcSA9IEpTT04uc3RyaW5naWZ5O1xuXG4vKlxuXG4gKi9cbiAgICAgICBjb25zdCBBVFRFTlVBVE9SU19DT01QQVJUTUVOVCA9ICc8QVRURU5VQVRPUlM+JztcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQoQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQpO1xuY29uc3Qgc2VsZWN0aXZlQ29weSA9IChmcm9tLCB0bywgbGlzdCkgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgcHJvcHM7XG4gIGlmICghbGlzdCkge1xuICAgIGNvbnN0IGRlc2NzID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhmcm9tKTtcbiAgICBwcm9wcyA9IG93bktleXMoZnJvbSkuZmlsdGVyKGtleSA9PiBkZXNjc1trZXldLmVudW1lcmFibGUpO1xuICB9IGVsc2Uge1xuICAgIHByb3BzID0gbGlzdDtcbiAgfVxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcHJvcHMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgY29uc3Qga2V5ID0gcHJvcHNbaW5kZXhdO1xuICAgIC8vXG4gICAgLy9cbiAgICB0b1trZXldID0gZnJvbVtrZXldO1xuICB9XG4gIHJldHVybiB0bztcbn07XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBjb2xsZWN0QXR0ZW51YXRvcnMgPSAoYXR0ZW51YXRvcnMsIHBvbGljeUZyYWdtZW50KSA9PiB7XG4gIGlmICgnYXR0ZW51YXRlJyBpbiBwb2xpY3lGcmFnbWVudCkge1xuICAgIGF0dGVudWF0b3JzLnB1c2gocG9saWN5RnJhZ21lbnQuYXR0ZW51YXRlKTtcbiAgfVxuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcyhwb2xpY3lGcmFnbWVudCkpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgY29sbGVjdEF0dGVudWF0b3JzKGF0dGVudWF0b3JzLCB2YWx1ZSk7XG4gICAgfVxuICB9XG59O1xuXG5jb25zdCBhdHRlbnVhdG9yc0NhY2hlID0gbmV3IFdlYWtNYXAoKTtcblxuLypcblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBkZXRlY3RBdHRlbnVhdG9ycyA9IHBvbGljeSA9PiB7XG4gIGlmICghcG9saWN5KSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGlmICghYXR0ZW51YXRvcnNDYWNoZS5oYXMocG9saWN5KSkge1xuICAgIGNvbnN0IGF0dGVudWF0b3JzID0gW107XG4gICAgaWYgKHBvbGljeS5kZWZhdWx0QXR0ZW51YXRvcikge1xuICAgICAgYXR0ZW51YXRvcnMucHVzaChwb2xpY3kuZGVmYXVsdEF0dGVudWF0b3IpO1xuICAgIH1cbiAgICBjb2xsZWN0QXR0ZW51YXRvcnMoYXR0ZW51YXRvcnMsIHBvbGljeSk7XG4gICAgYXR0ZW51YXRvcnNDYWNoZS5zZXQocG9saWN5LCBhdHRlbnVhdG9ycyk7XG4gIH1cbiAgcmV0dXJuIGF0dGVudWF0b3JzQ2FjaGUuZ2V0KHBvbGljeSk7XG59O1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UuZGV0ZWN0QXR0ZW51YXRvcnMoZGV0ZWN0QXR0ZW51YXRvcnMpO1xuY29uc3QgZ2VuZXJhdGVDYW5vbmljYWxOYW1lID0gKHsgaXNFbnRyeSA9IGZhbHNlLCBuYW1lLCBwYXRoIH0pID0+IHtcbiAgaWYgKGlzRW50cnkpIHtcbiAgICB0aHJvdyBFcnJvcignRW50cnkgbW9kdWxlIGNhbm5vdCBiZSBpZGVudGlmaWVkIHdpdGggYSBjYW5vbmljYWxOYW1lJyk7XG4gIH1cbiAgaWYgKG5hbWUgPT09IEFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UKSB7XG4gICAgcmV0dXJuIEFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UO1xuICB9XG4gIHJldHVybiBwYXRoLmpvaW4oJz4nKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBkZXBlbmRlbmN5QWxsb3dlZEJ5UG9saWN5ID0gKG5hbWluZ0tpdCwgcGFja2FnZVBvbGljeSkgPT4ge1xuICBpZiAobmFtaW5nS2l0LmlzRW50cnkpIHtcbiAgICAvL1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBjYW5vbmljYWxOYW1lID0gZ2VuZXJhdGVDYW5vbmljYWxOYW1lKG5hbWluZ0tpdCk7XG4gIHJldHVybiAhIXBvbGljeUxvb2t1cEhlbHBlcihwYWNrYWdlUG9saWN5LCAncGFja2FnZXMnLCBjYW5vbmljYWxOYW1lKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UuZGVwZW5kZW5jeUFsbG93ZWRCeVBvbGljeShkZXBlbmRlbmN5QWxsb3dlZEJ5UG9saWN5KTtcbiAgICAgICBjb25zdCBnZXRQb2xpY3lGb3JQYWNrYWdlID0gKG5hbWluZ0tpdCwgcG9saWN5KSA9PiB7XG4gIGlmICghcG9saWN5KSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBpZiAobmFtaW5nS2l0LmlzRW50cnkpIHtcbiAgICByZXR1cm4gcG9saWN5LmVudHJ5O1xuICB9XG4gIGNvbnN0IGNhbm9uaWNhbE5hbWUgPSBnZW5lcmF0ZUNhbm9uaWNhbE5hbWUobmFtaW5nS2l0KTtcbiAgaWYgKGNhbm9uaWNhbE5hbWUgPT09IEFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRlZmF1bHRBdHRlbnVhdG9yOiBwb2xpY3kuZGVmYXVsdEF0dGVudWF0b3IsXG4gICAgICBwYWNrYWdlczogJ2FueScsXG4gICAgfTtcbiAgfVxuICBpZiAocG9saWN5LnJlc291cmNlcyAmJiBwb2xpY3kucmVzb3VyY2VzW2Nhbm9uaWNhbE5hbWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gcG9saWN5LnJlc291cmNlc1tjYW5vbmljYWxOYW1lXTtcbiAgfSBlbHNlIHtcbiAgICAvL1xuICAgIHJldHVybiBjcmVhdGUobnVsbCk7XG4gIH1cbn07XG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UuZ2V0UG9saWN5Rm9yUGFja2FnZShnZXRQb2xpY3lGb3JQYWNrYWdlKTtcbmNvbnN0IGdldEdsb2JhbHNMaXN0ID0gcGFja2FnZVBvbGljeSA9PiB7XG4gIGlmICghcGFja2FnZVBvbGljeSB8fCAhcGFja2FnZVBvbGljeS5nbG9iYWxzKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHJldHVybiBlbnRyaWVzKHBhY2thZ2VQb2xpY3kuZ2xvYmFscylcbiAgICAuZmlsdGVyKChbX2tleSwgdmFsdWVdKSA9PiB2YWx1ZSlcbiAgICAubWFwKChba2V5LCBfdnZhbHVlXSkgPT4ga2V5KTtcbn07XG5cbmNvbnN0IEdMT0JBTF9BVFRFTlVBVE9SID0gJ2F0dGVudWF0ZUdsb2JhbHMnO1xuY29uc3QgTU9EVUxFX0FUVEVOVUFUT1IgPSAnYXR0ZW51YXRlTW9kdWxlJztcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IGltcG9ydEF0dGVudWF0b3JGb3JEZWZpbml0aW9uID0gYXN5bmMgKFxuICBhdHRlbnVhdGlvbkRlZmluaXRpb24sXG4gIGF0dGVudWF0b3JzUHJvdmlkZXIsXG4gIGF0dGVudWF0b3JFeHBvcnROYW1lLFxuKSA9PiB7XG4gIGlmICghYXR0ZW51YXRvcnNQcm92aWRlcikge1xuICAgIHRocm93IEVycm9yKGBhdHRlbnVhdG9yc1Byb3ZpZGVyIGlzIHJlcXVpcmVkIHRvIGltcG9ydCBhdHRlbnVhdG9yc2ApO1xuICB9XG4gIGNvbnN0IHsgc3BlY2lmaWVyLCBwYXJhbXMsIGRpc3BsYXlOYW1lIH0gPSBnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24oXG4gICAgYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuICApO1xuICBjb25zdCBhdHRlbnVhdG9yID0gYXdhaXQgYXR0ZW51YXRvcnNQcm92aWRlci5pbXBvcnQoc3BlY2lmaWVyKTtcbiAgaWYgKCFhdHRlbnVhdG9yW2F0dGVudWF0b3JFeHBvcnROYW1lXSkge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgYEF0dGVudWF0b3IgJHtxKGRpc3BsYXlOYW1lKX0gZG9lcyBub3QgZXhwb3J0ICR7cShhdHRlbnVhdG9yRXhwb3J0TmFtZSl9YCxcbiAgICApO1xuICB9XG4gIC8vXG4gIGNvbnN0IGF0dGVudWF0ZSA9IGF0dGVudWF0b3JbYXR0ZW51YXRvckV4cG9ydE5hbWVdLmJpbmQoYXR0ZW51YXRvciwgcGFyYW1zKTtcbiAgcmV0dXJuIGF0dGVudWF0ZTtcbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXIgPSAoXG4gIGNvbXBhcnRtZW50cyxcbiAgY29tcGFydG1lbnREZXNjcmlwdG9ycyxcbikgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGxldCBpbXBvcnRBdHRlbnVhdG9yO1xuICBsZXQgZGVmYXVsdEF0dGVudWF0b3I7XG4gIC8vXG4gIC8vXG4gIGlmICghY29tcGFydG1lbnREZXNjcmlwdG9yc1tBVFRFTlVBVE9SU19DT01QQVJUTUVOVF0pIHtcbiAgICBpbXBvcnRBdHRlbnVhdG9yID0gYXN5bmMgKCkgPT4ge1xuICAgICAgdGhyb3cgRXJyb3IoYE5vIGF0dGVudWF0b3JzIHNwZWNpZmllZCBpbiBwb2xpY3lgKTtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGRlZmF1bHRBdHRlbnVhdG9yID1cbiAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcnNbQVRURU5VQVRPUlNfQ09NUEFSVE1FTlRdLnBvbGljeS5kZWZhdWx0QXR0ZW51YXRvcjtcblxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGltcG9ydEF0dGVudWF0b3IgPSBhc3luYyBhdHRlbnVhdG9yU3BlY2lmaWVyID0+IHtcbiAgICAgIGlmICghYXR0ZW51YXRvclNwZWNpZmllcikge1xuICAgICAgICBpZiAoIWRlZmF1bHRBdHRlbnVhdG9yKSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoYE5vIGRlZmF1bHQgYXR0ZW51YXRvciBzcGVjaWZpZWQgaW4gcG9saWN5YCk7XG4gICAgICAgIH1cbiAgICAgICAgYXR0ZW51YXRvclNwZWNpZmllciA9IGRlZmF1bHRBdHRlbnVhdG9yO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBuYW1lc3BhY2UgfSA9IGF3YWl0IGNvbXBhcnRtZW50c1tBVFRFTlVBVE9SU19DT01QQVJUTUVOVF0uaW1wb3J0KFxuICAgICAgICAvKiAgICAgICAgICAgICAgICAgKi8gKGF0dGVudWF0b3JTcGVjaWZpZXIpLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBuYW1lc3BhY2U7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgaW1wb3J0OiBpbXBvcnRBdHRlbnVhdG9yLFxuICB9O1xufTtcblxuLypcblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLm1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXIobWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcik7XG5hc3luYyBmdW5jdGlvbiBhdHRlbnVhdGVHbG9iYWxUaGlzKHtcbiAgYXR0ZW51YXRvcnMsXG4gIGF0dGVudWF0aW9uRGVmaW5pdGlvbixcbiAgZ2xvYmFsVGhpcyxcbiAgZ2xvYmFscyxcbn0pIHtcbiAgY29uc3QgYXR0ZW51YXRlID0gYXdhaXQgaW1wb3J0QXR0ZW51YXRvckZvckRlZmluaXRpb24oXG4gICAgYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuICAgIGF0dGVudWF0b3JzLFxuICAgIEdMT0JBTF9BVFRFTlVBVE9SLFxuICApO1xuXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG5cbiAgLy9cbiAgLy9cbiAgLy9cblxuICAvL1xuXG4gIGNvbnN0IHJlc3VsdCA9IC8qICAgICAgICovIGF0dGVudWF0ZShnbG9iYWxzLCBnbG9iYWxUaGlzKTtcbiAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnICYmIHJlc3VsdCAhPT0gbnVsbCkge1xuICAgIGFzc2lnbihnbG9iYWxUaGlzLCByZXN1bHQpO1xuICB9XG59XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBhdHRlbnVhdGVHbG9iYWxzID0gKFxuICBnbG9iYWxUaGlzLFxuICBnbG9iYWxzLFxuICBwYWNrYWdlUG9saWN5LFxuICBhdHRlbnVhdG9ycyxcbiAgcGVuZGluZ0pvYnMsXG4gIG5hbWUgPSAnPHVua25vd24+JyxcbikgPT4ge1xuICBsZXQgZnJlZXplR2xvYmFsVGhpc1VubGVzc09wdGVkT3V0ID0gKCkgPT4ge1xuICAgIGZyZWV6ZShnbG9iYWxUaGlzKTtcbiAgfTtcbiAgaWYgKHBhY2thZ2VQb2xpY3kgJiYgcGFja2FnZVBvbGljeS5ub0dsb2JhbEZyZWV6ZSkge1xuICAgIGZyZWV6ZUdsb2JhbFRoaXNVbmxlc3NPcHRlZE91dCA9ICgpID0+IHt9O1xuICB9XG4gIGlmICghcGFja2FnZVBvbGljeSB8fCBpc0FsbG93aW5nRXZlcnl0aGluZyhwYWNrYWdlUG9saWN5Lmdsb2JhbHMpKSB7XG4gICAgc2VsZWN0aXZlQ29weShnbG9iYWxzLCBnbG9iYWxUaGlzKTtcbiAgICBmcmVlemVHbG9iYWxUaGlzVW5sZXNzT3B0ZWRPdXQoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGlzQXR0ZW51YXRpb25EZWZpbml0aW9uKHBhY2thZ2VQb2xpY3kuZ2xvYmFscykpIHtcbiAgICBjb25zdCBhdHRlbnVhdGlvbkRlZmluaXRpb24gPSBwYWNrYWdlUG9saWN5Lmdsb2JhbHM7XG4gICAgY29uc3QgeyBkaXNwbGF5TmFtZSB9ID0gZ2V0QXR0ZW51YXRvckZyb21EZWZpbml0aW9uKGF0dGVudWF0aW9uRGVmaW5pdGlvbik7XG4gICAgY29uc3QgYXR0ZW51YXRpb25Qcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCkgLy9cbiAgICAgIC50aGVuKCgpID0+XG4gICAgICAgIGF0dGVudWF0ZUdsb2JhbFRoaXMoe1xuICAgICAgICAgIGF0dGVudWF0b3JzLFxuICAgICAgICAgIGF0dGVudWF0aW9uRGVmaW5pdGlvbixcbiAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgIGdsb2JhbHMsXG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgICAgLnRoZW4oZnJlZXplR2xvYmFsVGhpc1VubGVzc09wdGVkT3V0LCBlcnJvciA9PiB7XG4gICAgICAgIGZyZWV6ZUdsb2JhbFRoaXNVbmxlc3NPcHRlZE91dCgpO1xuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBgRXJyb3Igd2hpbGUgYXR0ZW51YXRpbmcgZ2xvYmFscyBmb3IgJHtxKG5hbWUpfSB3aXRoICR7cShcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lLFxuICAgICAgICAgICl9OiAke3EoZXJyb3IubWVzc2FnZSl9YCAgLy9cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIHBlbmRpbmdKb2JzLnB1c2goYXR0ZW51YXRpb25Qcm9taXNlKTtcblxuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBsaXN0ID0gZ2V0R2xvYmFsc0xpc3QocGFja2FnZVBvbGljeSk7XG4gIHNlbGVjdGl2ZUNvcHkoZ2xvYmFscywgZ2xvYmFsVGhpcywgbGlzdCk7XG4gIGZyZWV6ZUdsb2JhbFRoaXNVbmxlc3NPcHRlZE91dCgpO1xufTtcblxuLypcblxuXG4gKi8kaM2PX29uY2UuYXR0ZW51YXRlR2xvYmFscyhhdHRlbnVhdGVHbG9iYWxzKTtcbmNvbnN0IGRpYWdub3NlTW9kdWxlUG9saWN5ID0gZXJyb3JIaW50ID0+IHtcbiAgaWYgKCFlcnJvckhpbnQpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgcmV0dXJuIGAgKGluZm86ICR7ZXJyb3JIaW50fSlgO1xufTtcblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZW5mb3JjZU1vZHVsZVBvbGljeSA9IChcbiAgc3BlY2lmaWVyLFxuICBjb21wYXJ0bWVudERlc2NyaXB0b3IsXG4gIHsgZXhpdCwgZXJyb3JIaW50IH0gPSB7fSxcbikgPT4ge1xuICBjb25zdCB7IHBvbGljeSwgbW9kdWxlcywgbGFiZWwgfSA9IGNvbXBhcnRtZW50RGVzY3JpcHRvcjtcbiAgaWYgKCFwb2xpY3kpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIWV4aXQpIHtcbiAgICBpZiAoIW1vZHVsZXNbc3BlY2lmaWVyXSkge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIGBJbXBvcnRpbmcgJHtxKHNwZWNpZmllcil9IGluICR7cShcbiAgICAgICAgICBsYWJlbCxcbiAgICAgICAgKX0gd2FzIG5vdCBhbGxvd2VkIGJ5IHBhY2thZ2VzIHBvbGljeSAke3EoXG4gICAgICAgICAgcG9saWN5LnBhY2thZ2VzLFxuICAgICAgICApfSR7ZGlhZ25vc2VNb2R1bGVQb2xpY3koZXJyb3JIaW50KX1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCFwb2xpY3lMb29rdXBIZWxwZXIocG9saWN5LCAnYnVpbHRpbnMnLCBzcGVjaWZpZXIpKSB7XG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICBgSW1wb3J0aW5nICR7cShzcGVjaWZpZXIpfSB3YXMgbm90IGFsbG93ZWQgYnkgcG9saWN5IGJ1aWx0aW5zOiR7cShcbiAgICAgICAgcG9saWN5LmJ1aWx0aW5zLFxuICAgICAgKX0ke2RpYWdub3NlTW9kdWxlUG9saWN5KGVycm9ySGludCl9YCxcbiAgICApO1xuICB9XG59O1xuXG4vKlxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmVuZm9yY2VNb2R1bGVQb2xpY3koZW5mb3JjZU1vZHVsZVBvbGljeSk7XG5hc3luYyBmdW5jdGlvbiBhdHRlbnVhdGVNb2R1bGUoe1xuICBhdHRlbnVhdG9ycyxcbiAgYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuICBvcmlnaW5hbE1vZHVsZVJlY29yZCxcbn0pIHtcbiAgY29uc3QgYXR0ZW51YXRlID0gYXdhaXQgaW1wb3J0QXR0ZW51YXRvckZvckRlZmluaXRpb24oXG4gICAgYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuICAgIGF0dGVudWF0b3JzLFxuICAgIE1PRFVMRV9BVFRFTlVBVE9SLFxuICApO1xuXG4gIC8vXG4gIC8vXG5cbiAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgaW1wb3J0czogb3JpZ2luYWxNb2R1bGVSZWNvcmQuaW1wb3J0cyxcbiAgICAvL1xuICAgIC8vXG4gICAgZXhwb3J0czogb3JpZ2luYWxNb2R1bGVSZWNvcmQuZXhwb3J0cyxcbiAgICBleGVjdXRlOiAobW9kdWxlRXhwb3J0cywgY29tcGFydG1lbnQsIHJlc29sdmVkSW1wb3J0cykgPT4ge1xuICAgICAgY29uc3QgbnMgPSB7fTtcbiAgICAgIG9yaWdpbmFsTW9kdWxlUmVjb3JkLmV4ZWN1dGUobnMsIGNvbXBhcnRtZW50LCByZXNvbHZlZEltcG9ydHMpO1xuICAgICAgY29uc3QgYXR0ZW51YXRlZCA9IGF0dGVudWF0ZShucyk7XG4gICAgICBtb2R1bGVFeHBvcnRzLmRlZmF1bHQgPSBhdHRlbnVhdGVkO1xuICAgICAgYXNzaWduKG1vZHVsZUV4cG9ydHMsIGF0dGVudWF0ZWQpO1xuICAgIH0sXG4gIH0pO1xufVxuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBhdHRlbnVhdGVNb2R1bGVIb29rID0gYXN5bmMgKFxuICBzcGVjaWZpZXIsXG4gIG9yaWdpbmFsTW9kdWxlUmVjb3JkLFxuICBwb2xpY3ksXG4gIGF0dGVudWF0b3JzLFxuKSA9PiB7XG4gIGNvbnN0IHBvbGljeVZhbHVlID0gcG9saWN5TG9va3VwSGVscGVyKHBvbGljeSwgJ2J1aWx0aW5zJywgc3BlY2lmaWVyKTtcbiAgaWYgKCFwb2xpY3kgfHwgcG9saWN5VmFsdWUgPT09IHRydWUpIHtcbiAgICByZXR1cm4gb3JpZ2luYWxNb2R1bGVSZWNvcmQ7XG4gIH1cblxuICBpZiAoIXBvbGljeVZhbHVlKSB7XG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICBgQXR0ZW51YXRpb24gZmFpbGVkICcke3NwZWNpZmllcn0nIHdhcyBub3QgaW4gcG9saWN5IGJ1aWx0aW5zOiR7cShcbiAgICAgICAgcG9saWN5LmJ1aWx0aW5zLFxuICAgICAgKX1gLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGF0dGVudWF0ZU1vZHVsZSh7XG4gICAgYXR0ZW51YXRvcnMsXG4gICAgYXR0ZW51YXRpb25EZWZpbml0aW9uOiBwb2xpY3lWYWx1ZSxcbiAgICBvcmlnaW5hbE1vZHVsZVJlY29yZCxcbiAgfSk7XG59OyRozY9fb25jZS5hdHRlbnVhdGVNb2R1bGVIb29rKGF0dGVudWF0ZU1vZHVsZUhvb2spO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQiOlsiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQiXSwiZGV0ZWN0QXR0ZW51YXRvcnMiOlsiZGV0ZWN0QXR0ZW51YXRvcnMiXSwiZGVwZW5kZW5jeUFsbG93ZWRCeVBvbGljeSI6WyJkZXBlbmRlbmN5QWxsb3dlZEJ5UG9saWN5Il0sImdldFBvbGljeUZvclBhY2thZ2UiOlsiZ2V0UG9saWN5Rm9yUGFja2FnZSJdLCJtYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyIjpbIm1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXIiXSwiYXR0ZW51YXRlR2xvYmFscyI6WyJhdHRlbnVhdGVHbG9iYWxzIl0sImVuZm9yY2VNb2R1bGVQb2xpY3kiOlsiZW5mb3JjZU1vZHVsZVBvbGljeSJdLCJhdHRlbnVhdGVNb2R1bGVIb29rIjpbImF0dGVudWF0ZU1vZHVsZUhvb2siXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAr2h7pdwIAADcCAAALQAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3Bvd2Vycy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMiLCJpc1JlYWROb3dQb3dlcnMiLCJ1bnBhY2tSZWFkUG93ZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuY29uc3QgeyBmcmVlemUgfSA9IE9iamVjdDtcblxuLyogICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGNhbm9uaWNhbFNoaW0gPSBhc3luYyBwYXRoID0+IHBhdGg7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgdW5wYWNrUmVhZFBvd2VycyA9IHBvd2VycyA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgcmVhZDtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgbGV0IG1heWJlUmVhZDtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgbGV0IGNhbm9uaWNhbDtcblxuICBpZiAodHlwZW9mIHBvd2VycyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJlYWQgPSBwb3dlcnM7XG4gIH0gZWxzZSB7XG4gICAgKHsgcmVhZCwgbWF5YmVSZWFkLCBjYW5vbmljYWwgfSA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAocG93ZXJzKSk7XG4gIH1cblxuICBpZiAoY2Fub25pY2FsID09PSB1bmRlZmluZWQpIHtcbiAgICBjYW5vbmljYWwgPSBjYW5vbmljYWxTaGltO1xuICB9XG5cbiAgaWYgKG1heWJlUmVhZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgbWF5YmVSZWFkID0gcGF0aCA9PlxuICAgICAgLyogICAgICAgICAgICAgICAgICovIChyZWFkKShwYXRoKS5jYXRjaChfZXJyb3IgPT4gdW5kZWZpbmVkKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4ucG93ZXJzLFxuICAgIHJlYWQsXG4gICAgbWF5YmVSZWFkLFxuICAgIGNhbm9uaWNhbCxcbiAgfTtcbn07XG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UudW5wYWNrUmVhZFBvd2Vycyh1bnBhY2tSZWFkUG93ZXJzKTtcbmNvbnN0IHJlcXVpcmVkUmVhZE5vd1Bvd2Vyc1Byb3BzID0gZnJlZXplKFxuICAvKiAgICAgICAgICAgICAgICAqLyAoWydmaWxlVVJMVG9QYXRoJywgJ2lzQWJzb2x1dGUnLCAnbWF5YmVSZWFkTm93J10pLFxuKTtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgaXNSZWFkTm93UG93ZXJzID0gdmFsdWUgPT5cbiAgQm9vbGVhbihcbiAgICB2YWx1ZSAmJlxuICAgICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgcmVxdWlyZWRSZWFkTm93UG93ZXJzUHJvcHMuZXZlcnkoXG4gICAgICAgIHByb3AgPT4gcHJvcCBpbiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWVbcHJvcF0gPT09ICdmdW5jdGlvbicsXG4gICAgICApLFxuICApO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuaXNSZWFkTm93UG93ZXJzKGlzUmVhZE5vd1Bvd2Vycyk7XG4gICAgICAgY29uc3QgZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMgPSB2YWx1ZSA9PiB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIFsuLi5yZXF1aXJlZFJlYWROb3dQb3dlcnNQcm9wc107XG4gIH1cbiAgcmV0dXJuIHJlcXVpcmVkUmVhZE5vd1Bvd2Vyc1Byb3BzLmZpbHRlcihcbiAgICBwcm9wID0+ICEocHJvcCBpbiB2YWx1ZSkgfHwgdHlwZW9mIHZhbHVlW3Byb3BdICE9PSAnZnVuY3Rpb24nLFxuICApO1xufTskaM2PX29uY2UuZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMoZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidW5wYWNrUmVhZFBvd2VycyI6WyJ1bnBhY2tSZWFkUG93ZXJzIl0sImlzUmVhZE5vd1Bvd2VycyI6WyJpc1JlYWROb3dQb3dlcnMiXSwiZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMiOlsiZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAANQAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3R5cGVzLWV4dGVybmFsLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADSioamiAQAAogEAACEAAABAZW5kby9lbnYtb3B0aW9ucy12MS4xLjgvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvZW52LW9wdGlvbnMuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL3NyYy9lbnYtb3B0aW9ucy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9lbnYtb3B0aW9ucy5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAusIkdug8AALoPAAArAAAAQGVuZG8vZW52LW9wdGlvbnMtdjEuMS44L3NyYy9lbnYtb3B0aW9ucy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyIsImdldEVudmlyb25tZW50T3B0aW9uIiwiZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCIsIm1ha2VFbnZpcm9ubWVudENhcHRvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKiAgICAgICAgICAgICAgICAgICAqL1xuLy9cblxuLy9cbi8vXG5cbi8vXG4vL1xuLy9cblxuY29uc3QgeyBmcmVlemUgfSA9IE9iamVjdDtcbmNvbnN0IHsgYXBwbHkgfSA9IFJlZmxlY3Q7XG5cbi8vXG4vL1xuY29uc3QgdW5jdXJyeVRoaXMgPVxuICBmbiA9PlxuICAocmVjZWl2ZXIsIC4uLmFyZ3MpID0+XG4gICAgYXBwbHkoZm4sIHJlY2VpdmVyLCBhcmdzKTtcbmNvbnN0IGFycmF5UHVzaCA9IHVuY3VycnlUaGlzKEFycmF5LnByb3RvdHlwZS5wdXNoKTtcbmNvbnN0IGFycmF5SW5jbHVkZXMgPSB1bmN1cnJ5VGhpcyhBcnJheS5wcm90b3R5cGUuaW5jbHVkZXMpO1xuY29uc3Qgc3RyaW5nU3BsaXQgPSB1bmN1cnJ5VGhpcyhTdHJpbmcucHJvdG90eXBlLnNwbGl0KTtcblxuY29uc3QgcSA9IEpTT04uc3RyaW5naWZ5O1xuXG5jb25zdCBGYWlsID0gKGxpdGVyYWxzLCAuLi5hcmdzKSA9PiB7XG4gIGxldCBtc2cgPSBsaXRlcmFsc1swXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgbXNnID0gYCR7bXNnfSR7YXJnc1tpXX0ke2xpdGVyYWxzW2kgKyAxXX1gO1xuICB9XG4gIHRocm93IEVycm9yKG1zZyk7XG59O1xuXG4vL1xuLy9cblxuLypcblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZUVudmlyb25tZW50Q2FwdG9yID0gKGFHbG9iYWwsIGRyb3BOYW1lcyA9IGZhbHNlKSA9PiB7XG4gIGNvbnN0IGNhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyA9IFtdO1xuXG4gIC8qXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgZ2V0RW52aXJvbm1lbnRPcHRpb24gPSAoXG4gICAgb3B0aW9uTmFtZSxcbiAgICBkZWZhdWx0U2V0dGluZyxcbiAgICBvcHRPdGhlclZhbHVlcyA9IHVuZGVmaW5lZCxcbiAgKSA9PiB7XG4gICAgdHlwZW9mIG9wdGlvbk5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICBGYWlsYEVudmlyb25tZW50IG9wdGlvbiBuYW1lICR7cShvcHRpb25OYW1lKX0gbXVzdCBiZSBhIHN0cmluZy5gO1xuICAgIHR5cGVvZiBkZWZhdWx0U2V0dGluZyA9PT0gJ3N0cmluZycgfHxcbiAgICAgIEZhaWxgRW52aXJvbm1lbnQgb3B0aW9uIGRlZmF1bHQgc2V0dGluZyAke3EoXG4gICAgICAgIGRlZmF1bHRTZXR0aW5nLFxuICAgICAgKX0gbXVzdCBiZSBhIHN0cmluZy5gO1xuXG4gICAgLyogICAgICAgICAgICAgICAgICovXG4gICAgbGV0IHNldHRpbmcgPSBkZWZhdWx0U2V0dGluZztcbiAgICBjb25zdCBnbG9iYWxQcm9jZXNzID0gYUdsb2JhbC5wcm9jZXNzIHx8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBnbG9iYWxFbnYgPVxuICAgICAgKHR5cGVvZiBnbG9iYWxQcm9jZXNzID09PSAnb2JqZWN0JyAmJiBnbG9iYWxQcm9jZXNzLmVudikgfHwgdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlb2YgZ2xvYmFsRW52ID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKG9wdGlvbk5hbWUgaW4gZ2xvYmFsRW52KSB7XG4gICAgICAgIGlmICghZHJvcE5hbWVzKSB7XG4gICAgICAgICAgYXJyYXlQdXNoKGNhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcywgb3B0aW9uTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3B0aW9uVmFsdWUgPSBnbG9iYWxFbnZbb3B0aW9uTmFtZV07XG4gICAgICAgIC8vXG4gICAgICAgIHR5cGVvZiBvcHRpb25WYWx1ZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICBGYWlsYEVudmlyb25tZW50IG9wdGlvbiBuYW1lZCAke3EoXG4gICAgICAgICAgICBvcHRpb25OYW1lLFxuICAgICAgICAgICl9LCBpZiBwcmVzZW50LCBtdXN0IGhhdmUgYSBjb3JyZXNwb25kaW5nIHN0cmluZyB2YWx1ZSwgZ290ICR7cShcbiAgICAgICAgICAgIG9wdGlvblZhbHVlLFxuICAgICAgICAgICl9YDtcbiAgICAgICAgc2V0dGluZyA9IG9wdGlvblZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBvcHRPdGhlclZhbHVlcyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICBzZXR0aW5nID09PSBkZWZhdWx0U2V0dGluZyB8fFxuICAgICAgYXJyYXlJbmNsdWRlcyhvcHRPdGhlclZhbHVlcywgc2V0dGluZykgfHxcbiAgICAgIEZhaWxgVW5yZWNvZ25pemVkICR7cShvcHRpb25OYW1lKX0gdmFsdWUgJHtxKFxuICAgICAgICBzZXR0aW5nLFxuICAgICAgKX0uIEV4cGVjdGVkIG9uZSBvZiAke3EoW2RlZmF1bHRTZXR0aW5nLCAuLi5vcHRPdGhlclZhbHVlc10pfWA7XG4gICAgcmV0dXJuIHNldHRpbmc7XG4gIH07XG4gIGZyZWV6ZShnZXRFbnZpcm9ubWVudE9wdGlvbik7XG5cbiAgLypcblxuXG4gICAqL1xuICBjb25zdCBnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0ID0gb3B0aW9uTmFtZSA9PiB7XG4gICAgY29uc3Qgb3B0aW9uID0gZ2V0RW52aXJvbm1lbnRPcHRpb24ob3B0aW9uTmFtZSwgJycpO1xuICAgIHJldHVybiBmcmVlemUob3B0aW9uID09PSAnJyA/IFtdIDogc3RyaW5nU3BsaXQob3B0aW9uLCAnLCcpKTtcbiAgfTtcbiAgZnJlZXplKGdldEVudmlyb25tZW50T3B0aW9uc0xpc3QpO1xuXG4gIGNvbnN0IGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMgPSAob3B0aW9uTmFtZSwgZWxlbWVudCkgPT5cbiAgICBhcnJheUluY2x1ZGVzKGdldEVudmlyb25tZW50T3B0aW9uc0xpc3Qob3B0aW9uTmFtZSksIGVsZW1lbnQpO1xuXG4gIGNvbnN0IGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyA9ICgpID0+IHtcbiAgICByZXR1cm4gZnJlZXplKFsuLi5jYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXNdKTtcbiAgfTtcbiAgZnJlZXplKGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyk7XG5cbiAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgZ2V0RW52aXJvbm1lbnRPcHRpb24sXG4gICAgZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCxcbiAgICBlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzLFxuICAgIGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlRW52aXJvbm1lbnRDYXB0b3IobWFrZUVudmlyb25tZW50Q2FwdG9yKTtcbmZyZWV6ZShtYWtlRW52aXJvbm1lbnRDYXB0b3IpO1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHtcbiAgZ2V0RW52aXJvbm1lbnRPcHRpb24sXG4gIGdldEVudmlyb25tZW50T3B0aW9uc0xpc3QsXG4gIGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMsXG59ID0gbWFrZUVudmlyb25tZW50Q2FwdG9yKGdsb2JhbFRoaXMsIHRydWUpOyRozY9fb25jZS5nZXRFbnZpcm9ubWVudE9wdGlvbihnZXRFbnZpcm9ubWVudE9wdGlvbik7JGjNj19vbmNlLmdldEVudmlyb25tZW50T3B0aW9uc0xpc3QoZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCk7JGjNj19vbmNlLmVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMoZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRW52aXJvbm1lbnRDYXB0b3IiOlsibWFrZUVudmlyb25tZW50Q2FwdG9yIl0sImdldEVudmlyb25tZW50T3B0aW9uIjpbImdldEVudmlyb25tZW50T3B0aW9uIl0sImdldEVudmlyb25tZW50T3B0aW9uc0xpc3QiOlsiZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCJdLCJlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzIjpbImVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAASTX26VQIAABUCAAAHQAAAEBlbmRvL2Vycm9ycy12MS4yLjEwL2luZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJGYWlsIiwiWCIsImFubm90YXRlRXJyb3IiLCJhc3NlcnQiLCJiIiwiYmFyZSIsIm1ha2VFcnJvciIsIm5vdGUiLCJxIiwicXVvdGUiLCJyZWRhY3RlZCIsInRocm93UmVkYWN0ZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogICAgICAgICAgICAgICAgICAgKi9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vL1xuLy9cblxuY29uc3QgZ2xvYmFsQXNzZXJ0ID0gZ2xvYmFsVGhpcy5hc3NlcnQ7XG5cbmlmIChnbG9iYWxBc3NlcnQgPT09IHVuZGVmaW5lZCkge1xuICB0aHJvdyBFcnJvcihcbiAgICBgQ2Fubm90IGluaXRpYWxpemUgQGVuZG8vZXJyb3JzLCBtaXNzaW5nIGdsb2JhbFRoaXMuYXNzZXJ0LCBpbXBvcnQgJ3NlcycgYmVmb3JlICdAZW5kby9lcnJvcnMnYCxcbiAgKTtcbn1cblxuY29uc3QgbWlzc2luZyA9IC8qICAgICAgICAgICAgICAgICovIChbXG4gICd0eXBlb2YnLFxuICAnZXJyb3InLFxuICAnZmFpbCcsXG4gICdlcXVhbCcsXG4gICdzdHJpbmcnLFxuICAnbm90ZScsXG4gICdkZXRhaWxzJyxcbiAgJ0ZhaWwnLFxuICAncXVvdGUnLFxuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAnbWFrZUFzc2VydCcsXG5dKS5maWx0ZXIobmFtZSA9PiBnbG9iYWxBc3NlcnRbbmFtZV0gPT09IHVuZGVmaW5lZCk7XG5pZiAobWlzc2luZy5sZW5ndGggPiAwKSB7XG4gIHRocm93IEVycm9yKFxuICAgIGBDYW5ub3QgaW5pdGlhbGl6ZSBAZW5kby9lcnJvcnMsIG1pc3NpbmcgZ2xvYmFsVGhpcy5hc3NlcnQgbWV0aG9kcyAke21pc3Npbmcuam9pbihcbiAgICAgICcsICcsXG4gICAgKX1gLFxuICApO1xufVxuXG4vL1xuLy9cbi8vXG5jb25zdCB7XG4gIGJhcmUsXG4gIGRldGFpbHM6IHJlZGFjdGVkLFxuICBlcnJvcjogbWFrZUVycm9yLFxuICBGYWlsOiB0aHJvd1JlZGFjdGVkLFxuICBtYWtlQXNzZXJ0OiBfb21pdHRlZE1ha2VBc3NlcnQsXG4gIG5vdGUsXG4gIHF1b3RlLFxuICAuLi5hc3NlcnRpb25zXG59ID0gZ2xvYmFsQXNzZXJ0O1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vL1xuJGjNj19vbmNlLnJlZGFjdGVkKHJlZGFjdGVkKTskaM2PX29uY2UubWFrZUVycm9yKG1ha2VFcnJvcik7JGjNj19vbmNlLnRocm93UmVkYWN0ZWQodGhyb3dSZWRhY3RlZCk7JGjNj19vbmNlLm5vdGUobm90ZSk7JGjNj19vbmNlLnF1b3RlKHF1b3RlKTtjb25zdCBhc3NlcnQ9KHZhbHVlLG9wdERldGFpbHMsZXJyQ29udHJ1Y3RvcixvcHRpb25zKT0+XG4gIGdsb2JhbEFzc2VydCh2YWx1ZSwgb3B0RGV0YWlscywgZXJyQ29udHJ1Y3Rvciwgb3B0aW9ucyk7JGjNj19vbmNlLmFzc2VydChhc3NlcnQpO1xuT2JqZWN0LmFzc2lnbihhc3NlcnQsIGFzc2VydGlvbnMpO1xuXG4vL1xuLy9cbi8vXG5jb25zdCBiYXJlT3JRdW90ZSA9IGJhcmUgfHwgcXVvdGU7XG5cbi8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UuYmFyZU9yUXVvdGUoYmFyZU9yUXVvdGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicmVkYWN0ZWQiOlsicmVkYWN0ZWQiXSwiWCI6WyJyZWRhY3RlZCJdLCJtYWtlRXJyb3IiOlsibWFrZUVycm9yIl0sInRocm93UmVkYWN0ZWQiOlsidGhyb3dSZWRhY3RlZCJdLCJGYWlsIjpbInRocm93UmVkYWN0ZWQiXSwibm90ZSI6WyJub3RlIl0sImFubm90YXRlRXJyb3IiOlsibm90ZSJdLCJxdW90ZSI6WyJxdW90ZSJdLCJxIjpbInF1b3RlIl0sImFzc2VydCI6WyJhc3NlcnQiXSwiYmFyZSI6WyJiYXJlT3JRdW90ZSJdLCJiIjpbImJhcmVPclF1b3RlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMmxgxkbFgAAGxYAACMAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMS9zcmMvRS5qc3siaW1wb3J0cyI6WyIuL3RyYWNrLXR1cm5zLmpzIiwiLi9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHRyYWNrVHVybnMsbWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyOyRozY9faW1wb3J0cyhbW1wiLi90cmFjay10dXJucy5qc1wiLCBbW1widHJhY2tUdXJuc1wiLFskaM2PX2EgPT4gKHRyYWNrVHVybnMgPSAkaM2PX2EpXV1dXSxbXCIuL21lc3NhZ2UtYnJlYWtwb2ludHMuanNcIiwgW1tcIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlclwiLFskaM2PX2EgPT4gKG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciA9ICRozY9fYSldXV1dXSk7XG5cblxuY29uc3QgeyBkZXRhaWxzOiBYLCBxdW90ZTogcSwgRmFpbCwgZXJyb3I6IG1ha2VFcnJvciB9ID0gYXNzZXJ0O1xuY29uc3QgeyBhc3NpZ24sIGZyZWV6ZSB9ID0gT2JqZWN0O1xuXG4vKlxuXG4gKi9cblxuY29uc3Qgb25TZW5kID0gbWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyKCdFTkRPX1NFTkRfQlJFQUtQT0lOVFMnKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIgPSB7XG4gIHNldChfdGFyZ2V0LCBfcHJvcCwgX3ZhbHVlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBpc0V4dGVuc2libGUoX3RhcmdldCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgc2V0UHJvdG90eXBlT2YoX3RhcmdldCwgX3ZhbHVlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBkZWxldGVQcm9wZXJ0eShfdGFyZ2V0LCBfcHJvcCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbn07XG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZUVQcm94eUhhbmRsZXIgPSAocmVjaXBpZW50LCBIYW5kbGVkUHJvbWlzZSkgPT5cbiAgaGFyZGVuKHtcbiAgICAuLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuICAgIGdldDogKF90YXJnZXQsIHByb3BlcnR5S2V5LCByZWNlaXZlcikgPT4ge1xuICAgICAgcmV0dXJuIGhhcmRlbihcbiAgICAgICAge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgW3Byb3BlcnR5S2V5XSguLi5hcmdzKSB7XG4gICAgICAgICAgICBpZiAodGhpcyAhPT0gcmVjZWl2ZXIpIHtcbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgcmV0dXJuIEhhbmRsZWRQcm9taXNlLnJlamVjdChcbiAgICAgICAgICAgICAgICBtYWtlRXJyb3IoXG4gICAgICAgICAgICAgICAgICBYYFVuZXhwZWN0ZWQgcmVjZWl2ZXIgZm9yIFwiJHtxKHByb3BlcnR5S2V5KX1cIiBtZXRob2Qgb2YgRSgke3EoXG4gICAgICAgICAgICAgICAgICAgIHJlY2lwaWVudCxcbiAgICAgICAgICAgICAgICAgICl9KWAsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9uU2VuZCAmJiBvblNlbmQuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIHByb3BlcnR5S2V5KSkge1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICBkZWJ1Z2dlcjsgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBIYW5kbGVkUHJvbWlzZS5hcHBseU1ldGhvZChyZWNpcGllbnQsIHByb3BlcnR5S2V5LCBhcmdzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy9cbiAgICAgICAgfVtwcm9wZXJ0eUtleV0sXG4gICAgICApO1xuICAgIH0sXG4gICAgYXBwbHk6IChfdGFyZ2V0LCBfdGhpc0FyZywgYXJnQXJyYXkgPSBbXSkgPT4ge1xuICAgICAgaWYgKG9uU2VuZCAmJiBvblNlbmQuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIHVuZGVmaW5lZCkpIHtcbiAgICAgICAgLy9cbiAgICAgICAgZGVidWdnZXI7IC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICB9XG4gICAgICByZXR1cm4gSGFuZGxlZFByb21pc2UuYXBwbHlGdW5jdGlvbihyZWNpcGllbnQsIGFyZ0FycmF5KTtcbiAgICB9LFxuICAgIGhhczogKF90YXJnZXQsIF9wKSA9PiB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgfSk7XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VFU2VuZE9ubHlQcm94eUhhbmRsZXIgPSAocmVjaXBpZW50LCBIYW5kbGVkUHJvbWlzZSkgPT5cbiAgaGFyZGVuKHtcbiAgICAuLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuICAgIGdldDogKF90YXJnZXQsIHByb3BlcnR5S2V5LCByZWNlaXZlcikgPT4ge1xuICAgICAgcmV0dXJuIGhhcmRlbihcbiAgICAgICAge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICBbcHJvcGVydHlLZXldKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICB0aGlzID09PSByZWNlaXZlciB8fFxuICAgICAgICAgICAgICBGYWlsYFVuZXhwZWN0ZWQgcmVjZWl2ZXIgZm9yIFwiJHtxKFxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5LFxuICAgICAgICAgICAgICApfVwiIG1ldGhvZCBvZiBFLnNlbmRPbmx5KCR7cShyZWNpcGllbnQpfSlgO1xuICAgICAgICAgICAgaWYgKG9uU2VuZCAmJiBvblNlbmQuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIHByb3BlcnR5S2V5KSkge1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICBkZWJ1Z2dlcjsgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEhhbmRsZWRQcm9taXNlLmFwcGx5TWV0aG9kU2VuZE9ubHkocmVjaXBpZW50LCBwcm9wZXJ0eUtleSwgYXJncyk7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvL1xuICAgICAgICB9W3Byb3BlcnR5S2V5XSxcbiAgICAgICk7XG4gICAgfSxcbiAgICBhcHBseTogKF90YXJnZXQsIF90aGlzQXJnLCBhcmdzQXJyYXkgPSBbXSkgPT4ge1xuICAgICAgaWYgKG9uU2VuZCAmJiBvblNlbmQuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIHVuZGVmaW5lZCkpIHtcbiAgICAgICAgLy9cbiAgICAgICAgZGVidWdnZXI7IC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICB9XG4gICAgICBIYW5kbGVkUHJvbWlzZS5hcHBseUZ1bmN0aW9uU2VuZE9ubHkocmVjaXBpZW50LCBhcmdzQXJyYXkpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9LFxuICAgIGhhczogKF90YXJnZXQsIF9wKSA9PiB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgfSk7XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VFR2V0UHJveHlIYW5kbGVyID0gKHgsIEhhbmRsZWRQcm9taXNlKSA9PlxuICBoYXJkZW4oe1xuICAgIC4uLmJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIsXG4gICAgaGFzOiAoX3RhcmdldCwgX3Byb3ApID0+IHRydWUsXG4gICAgZ2V0OiAoX3RhcmdldCwgcHJvcCkgPT4gSGFuZGxlZFByb21pc2UuZ2V0KHgsIHByb3ApLFxuICB9KTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBmdW5jVGFyZ2V0ID0gZnJlZXplKCgpID0+IHt9KTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IG9ialRhcmdldCA9IGZyZWV6ZSh7IF9fcHJvdG9fXzogbnVsbCB9KTtcblxuLypcblxuICovXG5jb25zdCBtYWtlRSA9IEhhbmRsZWRQcm9taXNlID0+IHtcbiAgcmV0dXJuIGhhcmRlbihcbiAgICBhc3NpZ24oXG4gICAgICAvKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgICAgICovXG4gICAgICAvL1xuICAgICAgeCA9PiBuZXcgUHJveHkoZnVuY1RhcmdldCwgbWFrZUVQcm94eUhhbmRsZXIoeCwgSGFuZGxlZFByb21pc2UpKSxcbiAgICAgIHtcbiAgICAgICAgLypcblxuXG5cblxuXG5cblxuXG5cbiAgICAgICAgICovXG4gICAgICAgIC8vXG4gICAgICAgIGdldDogeCA9PiBuZXcgUHJveHkob2JqVGFyZ2V0LCBtYWtlRUdldFByb3h5SGFuZGxlcih4LCBIYW5kbGVkUHJvbWlzZSkpLFxuXG4gICAgICAgIC8qXG5cblxuXG5cblxuXG5cbiAgICAgICAgICovXG4gICAgICAgIHJlc29sdmU6IEhhbmRsZWRQcm9taXNlLnJlc29sdmUsXG5cbiAgICAgICAgLypcblxuXG5cblxuXG5cblxuICAgICAgICAgKi9cbiAgICAgICAgc2VuZE9ubHk6IHggPT5cbiAgICAgICAgICAvL1xuICAgICAgICAgIG5ldyBQcm94eShmdW5jVGFyZ2V0LCBtYWtlRVNlbmRPbmx5UHJveHlIYW5kbGVyKHgsIEhhbmRsZWRQcm9taXNlKSksXG5cbiAgICAgICAgLypcblxuXG5cblxuXG5cblxuXG5cblxuICAgICAgICAgKi9cbiAgICAgICAgd2hlbjogKHgsIG9uZnVsZmlsbGVkLCBvbnJlamVjdGVkKSA9PlxuICAgICAgICAgIEhhbmRsZWRQcm9taXNlLnJlc29sdmUoeCkudGhlbihcbiAgICAgICAgICAgIC4uLnRyYWNrVHVybnMoW29uZnVsZmlsbGVkLCBvbnJlamVjdGVkXSksXG4gICAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgKSxcbiAgKTtcbn07XG5cbmNvbnN0e2RlZmF1bHQ6JGPNj19kZWZhdWx0fT17ZGVmYXVsdDptYWtlRX07XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuZGVmYXVsdCgkY82PX2RlZmF1bHQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACkAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMS9zcmMvZXhwb3J0cy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACk4yujkQ4AAJEOAAAnAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEvc3JjL2xvY2FsLmpzeyJpbXBvcnRzIjpbIi4vbWVzc2FnZS1icmVha3BvaW50cy5qcyJdLCJleHBvcnRzIjpbImdldE1ldGhvZE5hbWVzIiwibG9jYWxBcHBseUZ1bmN0aW9uIiwibG9jYWxBcHBseU1ldGhvZCIsImxvY2FsR2V0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgbWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyOyRozY9faW1wb3J0cyhbW1wiLi9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzXCIsIFtbXCJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXJcIixbJGjNj19hID0+IChtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIgPSAkaM2PX2EpXV1dXV0pO1xuXG5jb25zdCB7IGRldGFpbHM6IFgsIHF1b3RlOiBxLCBGYWlsIH0gPSBhc3NlcnQ7XG5cbmNvbnN0IHsgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycywgZ2V0UHJvdG90eXBlT2YsIGZyZWV6ZSB9ID0gT2JqZWN0O1xuY29uc3QgeyBhcHBseSwgb3duS2V5cyB9ID0gUmVmbGVjdDtcblxuY29uc3QgbnR5cGVvZiA9IHNwZWNpbWVuID0+IChzcGVjaW1lbiA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiBzcGVjaW1lbik7XG5cbmNvbnN0IG9uRGVsaXZlcnkgPSBtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIoJ0VORE9fREVMSVZFUllfQlJFQUtQT0lOVFMnKTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBpc09iamVjdCA9IHZhbCA9PiBPYmplY3QodmFsKSA9PT0gdmFsO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgY29tcGFyZVN0cmluZ2lmaWVkID0gKGEsIGIpID0+IHtcbiAgaWYgKHR5cGVvZiBhID09PSB0eXBlb2YgYikge1xuICAgIGNvbnN0IGxlZnQgPSBTdHJpbmcoYSk7XG4gICAgY29uc3QgcmlnaHQgPSBTdHJpbmcoYik7XG4gICAgLy9cbiAgICByZXR1cm4gbGVmdCA8IHJpZ2h0ID8gLTEgOiBsZWZ0ID4gcmlnaHQgPyAxIDogMDtcbiAgfVxuICBpZiAodHlwZW9mIGEgPT09ICdzeW1ib2wnKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBiID09PSAnc3RyaW5nJyk7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIGFzc2VydCh0eXBlb2YgYSA9PT0gJ3N0cmluZycpO1xuICBhc3NlcnQodHlwZW9mIGIgPT09ICdzeW1ib2wnKTtcbiAgcmV0dXJuIDE7XG59O1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGdldE1ldGhvZE5hbWVzID0gdmFsID0+IHtcbiAgbGV0IGxheWVyID0gdmFsO1xuICBjb25zdCBuYW1lcyA9IG5ldyBTZXQoKTsgLy9cbiAgd2hpbGUgKGxheWVyICE9PSBudWxsICYmIGxheWVyICE9PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgLy9cbiAgICBjb25zdCBkZXNjcyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobGF5ZXIpO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBvd25LZXlzKGRlc2NzKSkge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBpZiAodHlwZW9mIHZhbFtuYW1lXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBuYW1lcy5hZGQobmFtZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaXNPYmplY3QodmFsKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGxheWVyID0gZ2V0UHJvdG90eXBlT2YobGF5ZXIpO1xuICB9XG4gIHJldHVybiBoYXJkZW4oWy4uLm5hbWVzXS5zb3J0KGNvbXBhcmVTdHJpbmdpZmllZCkpO1xufTtcbi8vXG4vL1xuJGjNj19vbmNlLmdldE1ldGhvZE5hbWVzKGdldE1ldGhvZE5hbWVzKTtmcmVlemUoZ2V0TWV0aG9kTmFtZXMpO1xuXG4gICAgICAgY29uc3QgbG9jYWxBcHBseUZ1bmN0aW9uID0gKHJlY2lwaWVudCwgYXJncykgPT4ge1xuICB0eXBlb2YgcmVjaXBpZW50ID09PSAnZnVuY3Rpb24nIHx8XG4gICAgYXNzZXJ0LmZhaWwoXG4gICAgICBYYENhbm5vdCBpbnZva2UgdGFyZ2V0IGFzIGEgZnVuY3Rpb247IHR5cGVvZiB0YXJnZXQgaXMgJHtxKFxuICAgICAgICBudHlwZW9mKHJlY2lwaWVudCksXG4gICAgICApfWAsXG4gICAgICBUeXBlRXJyb3IsXG4gICAgKTtcbiAgaWYgKG9uRGVsaXZlcnkgJiYgb25EZWxpdmVyeS5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCwgdW5kZWZpbmVkKSkge1xuICAgIC8vXG4gICAgZGVidWdnZXI7IC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgfVxuICBjb25zdCByZXN1bHQgPSBhcHBseShyZWNpcGllbnQsIHVuZGVmaW5lZCwgYXJncyk7XG4gIHJldHVybiByZXN1bHQ7XG59OyRozY9fb25jZS5sb2NhbEFwcGx5RnVuY3Rpb24obG9jYWxBcHBseUZ1bmN0aW9uKTtcblxuICAgICAgIGNvbnN0IGxvY2FsQXBwbHlNZXRob2QgPSAocmVjaXBpZW50LCBtZXRob2ROYW1lLCBhcmdzKSA9PiB7XG4gIGlmIChtZXRob2ROYW1lID09PSB1bmRlZmluZWQgfHwgbWV0aG9kTmFtZSA9PT0gbnVsbCkge1xuICAgIC8vXG4gICAgcmV0dXJuIGxvY2FsQXBwbHlGdW5jdGlvbihyZWNpcGllbnQsIGFyZ3MpO1xuICB9XG4gIGlmIChyZWNpcGllbnQgPT09IHVuZGVmaW5lZCB8fCByZWNpcGllbnQgPT09IG51bGwpIHtcbiAgICBhc3NlcnQuZmFpbChcbiAgICAgIFhgQ2Fubm90IGRlbGl2ZXIgJHtxKG1ldGhvZE5hbWUpfSB0byB0YXJnZXQ7IHR5cGVvZiB0YXJnZXQgaXMgJHtxKFxuICAgICAgICBudHlwZW9mKHJlY2lwaWVudCksXG4gICAgICApfWAsXG4gICAgICBUeXBlRXJyb3IsXG4gICAgKTtcbiAgfVxuICBjb25zdCBmbiA9IHJlY2lwaWVudFttZXRob2ROYW1lXTtcbiAgaWYgKGZuID09PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnQuZmFpbChcbiAgICAgIFhgdGFyZ2V0IGhhcyBubyBtZXRob2QgJHtxKG1ldGhvZE5hbWUpfSwgaGFzICR7cShcbiAgICAgICAgZ2V0TWV0aG9kTmFtZXMocmVjaXBpZW50KSxcbiAgICAgICl9YCxcbiAgICAgIFR5cGVFcnJvcixcbiAgICApO1xuICB9XG4gIGNvbnN0IGZ0eXBlID0gbnR5cGVvZihmbik7XG4gIHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJyB8fFxuICAgIEZhaWxgaW52b2tlZCBtZXRob2QgJHtxKG1ldGhvZE5hbWUpfSBpcyBub3QgYSBmdW5jdGlvbjsgaXQgaXMgYSAke3EoXG4gICAgICBmdHlwZSxcbiAgICApfWA7XG4gIGlmIChvbkRlbGl2ZXJ5ICYmIG9uRGVsaXZlcnkuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIG1ldGhvZE5hbWUpKSB7XG4gICAgLy9cbiAgICBkZWJ1Z2dlcjsgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IGFwcGx5KGZuLCByZWNpcGllbnQsIGFyZ3MpO1xuICByZXR1cm4gcmVzdWx0O1xufTskaM2PX29uY2UubG9jYWxBcHBseU1ldGhvZChsb2NhbEFwcGx5TWV0aG9kKTtcblxuICAgICAgIGNvbnN0IGxvY2FsR2V0ID0gKHQsIGtleSkgPT4gdFtrZXldOyRozY9fb25jZS5sb2NhbEdldChsb2NhbEdldCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRNZXRob2ROYW1lcyI6WyJnZXRNZXRob2ROYW1lcyJdLCJsb2NhbEFwcGx5RnVuY3Rpb24iOlsibG9jYWxBcHBseUZ1bmN0aW9uIl0sImxvY2FsQXBwbHlNZXRob2QiOlsibG9jYWxBcHBseU1ldGhvZCJdLCJsb2NhbEdldCI6WyJsb2NhbEdldCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB5M+y4PA8AADwPAAA1AAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEvc3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanN7ImltcG9ydHMiOlsiQGVuZG8vZW52LW9wdGlvbnMiXSwiZXhwb3J0cyI6WyJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBnZXRFbnZpcm9ubWVudE9wdGlvbjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vudi1vcHRpb25zXCIsIFtbXCJnZXRFbnZpcm9ubWVudE9wdGlvblwiLFskaM2PX2EgPT4gKGdldEVudmlyb25tZW50T3B0aW9uID0gJGjNj19hKV1dXV1dKTtcblxuY29uc3QgeyBxdW90ZTogcSwgRmFpbCB9ID0gYXNzZXJ0O1xuXG5jb25zdCB7IGhhc093biwgZnJlZXplLCBlbnRyaWVzIH0gPSBPYmplY3Q7XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbi8qXG5cblxuXG5cblxuICovXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG4gKi9cbmNvbnN0IGlzSlNPTlJlY29yZCA9IHZhbCA9PlxuICB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiB2YWwgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3Qgc2ltcGxpZnlUYWcgPSB0YWcgPT4ge1xuICBmb3IgKGNvbnN0IHByZWZpeCBvZiBbJ0FsbGVnZWQ6ICcsICdEZWJ1Z05hbWU6ICddKSB7XG4gICAgaWYgKHRhZy5zdGFydHNXaXRoKHByZWZpeCkpIHtcbiAgICAgIHJldHVybiB0YWcuc2xpY2UocHJlZml4Lmxlbmd0aCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0YWc7XG59O1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciA9IG9wdGlvbk5hbWUgPT4ge1xuICBsZXQgYnJlYWtwb2ludHMgPSBKU09OLnBhcnNlKGdldEVudmlyb25tZW50T3B0aW9uKG9wdGlvbk5hbWUsICdudWxsJykpO1xuXG4gIGlmIChicmVha3BvaW50cyA9PT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgbGV0IGJyZWFrcG9pbnRzVGFibGU7XG5cbiAgY29uc3QgZ2V0QnJlYWtwb2ludHMgPSAoKSA9PiBicmVha3BvaW50cztcbiAgZnJlZXplKGdldEJyZWFrcG9pbnRzKTtcblxuICBjb25zdCBzZXRCcmVha3BvaW50cyA9IChuZXdCcmVha3BvaW50cyA9IGJyZWFrcG9pbnRzKSA9PiB7XG4gICAgaXNKU09OUmVjb3JkKG5ld0JyZWFrcG9pbnRzKSB8fFxuICAgICAgRmFpbGBFeHBlY3RlZCAke3Eob3B0aW9uTmFtZSl9IG9wdGlvbiB0byBiZSBhIEpTT04gYnJlYWtwb2ludHMgcmVjb3JkYDtcblxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIC8vXG4gICAgY29uc3QgbmV3QnJlYWtwb2ludHNUYWJsZSA9IHsgX19wcm90b19fOiBudWxsIH07XG5cbiAgICBmb3IgKGNvbnN0IFt0YWcsIG1ldGhvZEJQc10gb2YgZW50cmllcyhuZXdCcmVha3BvaW50cykpIHtcbiAgICAgIHRhZyA9PT0gc2ltcGxpZnlUYWcodGFnKSB8fFxuICAgICAgICBGYWlsYEp1c3QgdXNlIHNpbXBsZSB0YWcgJHtxKHNpbXBsaWZ5VGFnKHRhZykpfSByYXRoZXIgdGhhbiAke3EodGFnKX1gO1xuICAgICAgaXNKU09OUmVjb3JkKG1ldGhvZEJQcykgfHxcbiAgICAgICAgRmFpbGBFeHBlY3RlZCAke3Eob3B0aW9uTmFtZSl9IG9wdGlvbidzICR7cShcbiAgICAgICAgICB0YWcsXG4gICAgICAgICl9IHRvIGJlIGEgSlNPTiBtZXRob2RzIGJyZWFrcG9pbnRzIHJlY29yZGA7XG4gICAgICBmb3IgKGNvbnN0IFttZXRob2ROYW1lLCBjb3VudF0gb2YgZW50cmllcyhtZXRob2RCUHMpKSB7XG4gICAgICAgIGNvdW50ID09PSAnKicgfHxcbiAgICAgICAgICAodHlwZW9mIGNvdW50ID09PSAnbnVtYmVyJyAmJlxuICAgICAgICAgICAgTnVtYmVyLmlzU2FmZUludGVnZXIoY291bnQpICYmXG4gICAgICAgICAgICBjb3VudCA+PSAwKSB8fFxuICAgICAgICAgIEZhaWxgRXhwZWN0ZWQgJHtxKG9wdGlvbk5hbWUpfSBvcHRpb24ncyAke3EodGFnKX0uJHtxKFxuICAgICAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgICApfSB0byBiZSBcIipcIiBvciBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyYDtcblxuICAgICAgICBjb25zdCBjbGFzc0JQcyA9IGhhc093bihuZXdCcmVha3BvaW50c1RhYmxlLCBtZXRob2ROYW1lKVxuICAgICAgICAgID8gbmV3QnJlYWtwb2ludHNUYWJsZVttZXRob2ROYW1lXVxuICAgICAgICAgIDogKG5ld0JyZWFrcG9pbnRzVGFibGVbbWV0aG9kTmFtZV0gPSB7XG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBjbGFzc0JQc1t0YWddID0gY291bnQ7XG4gICAgICB9XG4gICAgfVxuICAgIGJyZWFrcG9pbnRzID0gbmV3QnJlYWtwb2ludHM7XG4gICAgYnJlYWtwb2ludHNUYWJsZSA9IG5ld0JyZWFrcG9pbnRzVGFibGU7XG4gIH07XG4gIGZyZWV6ZShzZXRCcmVha3BvaW50cyk7XG5cbiAgY29uc3Qgc2hvdWxkQnJlYWtwb2ludCA9IChyZWNpcGllbnQsIG1ldGhvZE5hbWUpID0+IHtcbiAgICBpZiAobWV0aG9kTmFtZSA9PT0gdW5kZWZpbmVkIHx8IG1ldGhvZE5hbWUgPT09IG51bGwpIHtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGNsYXNzQlBzID0gYnJlYWtwb2ludHNUYWJsZVttZXRob2ROYW1lXSB8fCBicmVha3BvaW50c1RhYmxlWycqJ107XG4gICAgaWYgKGNsYXNzQlBzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbGV0IHRhZyA9IHNpbXBsaWZ5VGFnKHJlY2lwaWVudFtTeW1ib2wudG9TdHJpbmdUYWddKTtcbiAgICBsZXQgY291bnQgPSBjbGFzc0JQc1t0YWddO1xuICAgIGlmIChjb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0YWcgPSAnKic7XG4gICAgICBjb3VudCA9IGNsYXNzQlBzW3RhZ107XG4gICAgICBpZiAoY291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjb3VudCA9PT0gJyonKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGNvdW50ID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgYXNzZXJ0KHR5cGVvZiBjb3VudCA9PT0gJ251bWJlcicgJiYgY291bnQgPj0gMSk7XG4gICAgY2xhc3NCUHNbdGFnXSA9IGNvdW50IC0gMTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG4gIGZyZWV6ZShzaG91bGRCcmVha3BvaW50KTtcblxuICBjb25zdCBicmVha3BvaW50VGVzdGVyID0gZnJlZXplKHtcbiAgICBnZXRCcmVha3BvaW50cyxcbiAgICBzZXRCcmVha3BvaW50cyxcbiAgICBzaG91bGRCcmVha3BvaW50LFxuICB9KTtcbiAgYnJlYWtwb2ludFRlc3Rlci5zZXRCcmVha3BvaW50cygpO1xuICByZXR1cm4gYnJlYWtwb2ludFRlc3Rlcjtcbn07JGjNj19vbmNlLm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlcihtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIpO1xuZnJlZXplKG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3Rlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIiOlsibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALh2lJ1fAwAAXwMAACkAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMS9zcmMvbm8tc2hpbS5qc3siaW1wb3J0cyI6WyIuL0UuanMiLCIuL2V4cG9ydHMuanMiXSwiZXhwb3J0cyI6WyJFIiwiSGFuZGxlZFByb21pc2UiXSwicmVleHBvcnRzIjpbIi4vZXhwb3J0cy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG1ha2VFOyRozY9faW1wb3J0cyhbW1wiLi9FLmpzXCIsIFtbXCJkZWZhdWx0XCIsWyRozY9fYSA9PiAobWFrZUUgPSAkaM2PX2EpXV1dXSxbXCIuL2V4cG9ydHMuanNcIiwgW11dXSk7XG5cbi8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCBocCA9IEhhbmRsZWRQcm9taXNlO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5ocChocCk7XG4gICAgICAgY29uc3QgRSA9IG1ha2VFKGhwKTskaM2PX29uY2UuRShFKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkhhbmRsZWRQcm9taXNlIjpbImhwIl0sIkUiOlsiRSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACpgMOzngoAAJ4KAAAtAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEvc3JjL3RyYWNrLXR1cm5zLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vudi1vcHRpb25zIl0sImV4cG9ydHMiOlsidHJhY2tUdXJucyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGdldEVudmlyb25tZW50T3B0aW9uLGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lbnYtb3B0aW9uc1wiLCBbW1wiZ2V0RW52aXJvbm1lbnRPcHRpb25cIixbJGjNj19hID0+IChnZXRFbnZpcm9ubWVudE9wdGlvbiA9ICRozY9fYSldXSxbXCJlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzXCIsWyRozY9fYSA9PiAoZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxubGV0IGhpZGRlblByaW9yRXJyb3I7XG5sZXQgaGlkZGVuQ3VycmVudFR1cm4gPSAwO1xubGV0IGhpZGRlbkN1cnJlbnRFdmVudCA9IDA7XG5cbi8vXG5jb25zdCBWRVJCT1NFID0gZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcygnREVCVUcnLCAndHJhY2stdHVybnMnKTtcblxuLy9cbi8vXG5jb25zdCBFTkFCTEVEID1cbiAgZ2V0RW52aXJvbm1lbnRPcHRpb24oJ1RSQUNLX1RVUk5TJywgJ2Rpc2FibGVkJywgWydlbmFibGVkJ10pID09PSAnZW5hYmxlZCc7XG5cbi8vXG4vL1xuLy9cbi8vXG5cbmNvbnN0IGFkZFJlamVjdGlvbk5vdGUgPSBkZXRhaWxzTm90ZSA9PiByZWFzb24gPT4ge1xuICBpZiAocmVhc29uIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICBnbG9iYWxUaGlzLmFzc2VydC5ub3RlKHJlYXNvbiwgZGV0YWlsc05vdGUpO1xuICB9XG4gIGlmIChWRVJCT1NFKSB7XG4gICAgY29uc29sZS5sb2coJ1JFSkVDVEVEIGF0IHRvcCBvZiBldmVudCBsb29wJywgcmVhc29uKTtcbiAgfVxufTtcblxuY29uc3Qgd3JhcEZ1bmN0aW9uID1cbiAgKGZ1bmMsIHNlbmRpbmdFcnJvciwgWCkgPT5cbiAgKC4uLmFyZ3MpID0+IHtcbiAgICBoaWRkZW5QcmlvckVycm9yID0gc2VuZGluZ0Vycm9yO1xuICAgIGhpZGRlbkN1cnJlbnRUdXJuICs9IDE7XG4gICAgaGlkZGVuQ3VycmVudEV2ZW50ID0gMDtcbiAgICB0cnkge1xuICAgICAgbGV0IHJlc3VsdDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdCA9IGZ1bmMoLi4uYXJncyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgZ2xvYmFsVGhpcy5hc3NlcnQubm90ZShcbiAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgIFhgVGhyb3duIGZyb206ICR7aGlkZGVuUHJpb3JFcnJvcn06JHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChWRVJCT1NFKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1RIUk9XTiB0byB0b3Agb2YgZXZlbnQgbG9vcCcsIGVycik7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgLy9cbiAgICAgIGNvbnN0IGRldGFpbHNOb3RlID0gWGBSZWplY3Rpb24gZnJvbTogJHtoaWRkZW5QcmlvckVycm9yfToke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gO1xuICAgICAgUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkuY2F0Y2goYWRkUmVqZWN0aW9uTm90ZShkZXRhaWxzTm90ZSkpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaGlkZGVuUHJpb3JFcnJvciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHRyYWNrVHVybnMgPSBmdW5jcyA9PiB7XG4gIGlmICghRU5BQkxFRCB8fCB0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWdsb2JhbFRoaXMuYXNzZXJ0KSB7XG4gICAgcmV0dXJuIGZ1bmNzO1xuICB9XG4gIGNvbnN0IHsgZGV0YWlsczogWCwgbm90ZTogYW5ub3RhdGVFcnJvciB9ID0gZ2xvYmFsVGhpcy5hc3NlcnQ7XG5cbiAgaGlkZGVuQ3VycmVudEV2ZW50ICs9IDE7XG4gIGNvbnN0IHNlbmRpbmdFcnJvciA9IEVycm9yKFxuICAgIGBFdmVudDogJHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCxcbiAgKTtcbiAgaWYgKGhpZGRlblByaW9yRXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgIGFubm90YXRlRXJyb3Ioc2VuZGluZ0Vycm9yLCBYYENhdXNlZCBieTogJHtoaWRkZW5QcmlvckVycm9yfWApO1xuICB9XG5cbiAgcmV0dXJuIC8qICAgICAgICAgICAgKi8gKFxuICAgIGZ1bmNzLm1hcChmdW5jID0+IGZ1bmMgJiYgd3JhcEZ1bmN0aW9uKGZ1bmMsIHNlbmRpbmdFcnJvciwgWCkpXG4gICk7XG59O1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UudHJhY2tUdXJucyh0cmFja1R1cm5zKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InRyYWNrVHVybnMiOlsidHJhY2tUdXJucyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB7oaBHZAIAAGQCAAAjAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEvdXRpbHMuanN7ImltcG9ydHMiOlsiLi9zcmMvbG9jYWwuanMiLCIuL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIl0sImV4cG9ydHMiOltudWxsLG51bGxdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9sb2NhbC5qc1wiLCBbXV0sW1wiLi9zcmMvbWVzc2FnZS1icmVha3BvaW50cy5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2xvY2FsLmpzIjpbWyJnZXRNZXRob2ROYW1lcyIsImdldE1ldGhvZE5hbWVzIl1dLCIuL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIjpbWyJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIiLCJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANaBKoBZDAAAWQwAADUAAABAZW5kby9pbXBvcnQtYnVuZGxlLXYxLjQuMC9zcmMvY29tcGFydG1lbnQtd3JhcHBlci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsid3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50LCduYW1lJyx7dmFsdWU6XCJ3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudFwifSk7JGjNj19vbmNlLndyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50KHdyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50KTsvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5jb25zdCBjb21wYXJ0bWVudE9wdGlvbnMgPSAoLi4uYXJncykgPT4ge1xuICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgaWYgKFxuICAgIGFyZ3MubGVuZ3RoID09PSAxICYmXG4gICAgdHlwZW9mIGFyZ3NbMF0gPT09ICdvYmplY3QnICYmXG4gICAgYXJnc1swXSAhPT0gbnVsbCAmJlxuICAgICdfX29wdGlvbnNfXycgaW4gYXJnc1swXVxuICApIHtcbiAgICBjb25zdCB7IF9fb3B0aW9uc19fLCAuLi5vcHRpb25zIH0gPSBhcmdzWzBdO1xuICAgIGFzc2VydChcbiAgICAgIF9fb3B0aW9uc19fID09PSB0cnVlLFxuICAgICAgYENvbXBhcnRtZW50IGNvbnN0cnVjdG9yIG9ubHkgc3VwcG9ydHMgdHJ1ZSBfX29wdGlvbnNfXyBzaWdpbCwgZ290ICR7X19vcHRpb25zX199YCxcbiAgICApO1xuICAgIHJldHVybiBvcHRpb25zO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IFtcbiAgICAgIGdsb2JhbHMgPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovICh7fSksXG4gICAgICBtb2R1bGVzID0gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKHt9KSxcbiAgICAgIG9wdGlvbnMgPSB7fSxcbiAgICBdID0gYXJncztcbiAgICBhc3NlcnQuZXF1YWwoXG4gICAgICBvcHRpb25zLm1vZHVsZXMsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBgQ29tcGFydG1lbnQgY29uc3RydWN0b3IgbXVzdCByZWNlaXZlIGVpdGhlciBhIG1vZHVsZSBtYXAgYXJndW1lbnQgb3IgbW9kdWxlcyBvcHRpb24sIG5vdCBib3RoYCxcbiAgICApO1xuICAgIGFzc2VydC5lcXVhbChcbiAgICAgIG9wdGlvbnMuZ2xvYmFscyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGBDb21wYXJ0bWVudCBjb25zdHJ1Y3RvciBtdXN0IHJlY2VpdmUgZWl0aGVyIGdsb2JhbHMgYXJndW1lbnQgb3Igb3B0aW9uLCBub3QgYm90aGAsXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGdsb2JhbHMsXG4gICAgICBtb2R1bGVzLFxuICAgIH07XG4gIH1cbn07XG5cbiAgICAgICBmdW5jdGlvbiB3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudChcbiAgT2xkQ29tcGFydG1lbnQsXG4gIGluZXNjYXBhYmxlVHJhbnNmb3JtcyxcbiAgaW5lc2NhcGFibGVHbG9iYWxQcm9wZXJ0aWVzLFxuKSB7XG4gIC8vXG4gIC8vXG4gIC8vXG4gIGNvbnN0IE5ld0NvbXBhcnRtZW50ID0gZnVuY3Rpb24gQ29tcGFydG1lbnQoLi4uYXJncykge1xuICAgIGNvbnN0IHsgdHJhbnNmb3Jtczogb2xkVHJhbnNmb3JtcyA9IFtdLCAuLi5vdGhlck9wdGlvbnMgfSA9XG4gICAgICBjb21wYXJ0bWVudE9wdGlvbnMoLi4uYXJncyk7XG4gICAgY29uc3QgbmV3VHJhbnNmb3JtcyA9IFsuLi5vbGRUcmFuc2Zvcm1zLCAuLi5pbmVzY2FwYWJsZVRyYW5zZm9ybXNdO1xuICAgIGNvbnN0IG5ld09wdGlvbnMgPSB7XG4gICAgICAuLi5vdGhlck9wdGlvbnMsXG4gICAgICB0cmFuc2Zvcm1zOiBuZXdUcmFuc2Zvcm1zLFxuICAgICAgX19vcHRpb25zX186IHRydWUsXG4gICAgfTtcblxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgaWYgKG5ldy50YXJnZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy9cbiAgICAgIHRocm93IEVycm9yKCdDb21wYXJ0bWVudCBtdXN0IGJlIGNhbGxlZCBhcyBhIGNvbnN0cnVjdG9yJyk7XG4gICAgfVxuXG4gICAgLy9cblxuICAgIGNvbnN0IGMgPSBSZWZsZWN0LmNvbnN0cnVjdChPbGRDb21wYXJ0bWVudCwgW25ld09wdGlvbnNdLCBuZXcudGFyZ2V0KTtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBjLmdsb2JhbFRoaXMuQ29tcGFydG1lbnQgPSBOZXdDb21wYXJ0bWVudDtcblxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGZvciAoY29uc3QgcHJvcCBvZiBSZWZsZWN0Lm93bktleXMoaW5lc2NhcGFibGVHbG9iYWxQcm9wZXJ0aWVzKSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGMuZ2xvYmFsVGhpcywgcHJvcCwge1xuICAgICAgICB2YWx1ZTogaW5lc2NhcGFibGVHbG9iYWxQcm9wZXJ0aWVzW3Byb3BdLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgLy9cbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBjO1xuICB9O1xuXG4gIC8vXG4gIE5ld0NvbXBhcnRtZW50LnByb3RvdHlwZSA9IE9sZENvbXBhcnRtZW50LnByb3RvdHlwZTtcblxuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuXG4gIHJldHVybiBOZXdDb21wYXJ0bWVudDtcbn1cblxuLy9cbi8vXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudCI6WyJ3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABWzftmiBYAAIgWAAAnAAAAQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS40LjAvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9pbXBvcnQtYXJjaGl2ZS5qcyIsIkBlbmRvL2Jhc2U2NCIsIkBlbmRvL2Vycm9ycyIsIi4vY29tcGFydG1lbnQtd3JhcHBlci5qcyJdLCJleHBvcnRzIjpbImJ1bmRsZVRlc3RFeHBvcnRzIiwiaW1wb3J0QnVuZGxlIiwidHlwZWRJbXBvcnRCdW5kbGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBwYXJzZUFyY2hpdmUsZGVjb2RlQmFzZTY0LEZhaWwsd3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvaW1wb3J0LWFyY2hpdmUuanNcIiwgW1tcInBhcnNlQXJjaGl2ZVwiLFskaM2PX2EgPT4gKHBhcnNlQXJjaGl2ZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Jhc2U2NFwiLCBbW1wiZGVjb2RlQmFzZTY0XCIsWyRozY9fYSA9PiAoZGVjb2RlQmFzZTY0ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vY29tcGFydG1lbnQtd3JhcHBlci5qc1wiLCBbW1wid3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnRcIixbJGjNj19hID0+ICh3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudCA9ICRozY9fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGltcG9ydEJ1bmRsZSwnbmFtZScse3ZhbHVlOlwiaW1wb3J0QnVuZGxlXCJ9KTskaM2PX29uY2UuaW1wb3J0QnVuZGxlKGltcG9ydEJ1bmRsZSk7XG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG4gKi9cblxuLypcblxuXG5cbiAqL1xuXG4vL1xuLy9cbiAgICAgICBhc3luYyBmdW5jdGlvbiBpbXBvcnRCdW5kbGUoYnVuZGxlLCBvcHRpb25zID0ge30sIHBvd2VycyA9IHt9KSB7XG4gIGF3YWl0IG51bGw7XG4gIGNvbnN0IHtcbiAgICBidW5kbGVVcmwgPSB1bmRlZmluZWQsXG4gICAgZmlsZVByZWZpeCxcbiAgICBlbmRvd21lbnRzOiBvcHRFbmRvd21lbnRzID0ge30sXG4gICAgLy9cbiAgICAvL1xuICAgIHRyYW5zZm9ybXMgPSBbXSxcbiAgICBpbmVzY2FwYWJsZVRyYW5zZm9ybXMgPSBbXSxcbiAgICBpbmVzY2FwYWJsZUdsb2JhbFByb3BlcnRpZXMgPSB7fSxcbiAgICBleHBlY3RlZFNoYTUxMiA9IHVuZGVmaW5lZCxcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHtcbiAgICBjb21wdXRlU2hhNTEyID0gdW5kZWZpbmVkLFxuICAgIGNvbXB1dGVTb3VyY2VMb2NhdGlvbiA9IHVuZGVmaW5lZCxcbiAgICBjb21wdXRlU291cmNlTWFwTG9jYXRpb24gPSB1bmRlZmluZWQsXG4gIH0gPSBwb3dlcnM7XG4gIGNvbnN0IGVuZG93bWVudHMgPSB7XG4gICAgVGV4dEVuY29kZXIsXG4gICAgVGV4dERlY29kZXIsXG4gICAgVVJMOiBnbG9iYWxUaGlzLlVSTCwgLy9cbiAgICBCYXNlNjQ6IGdsb2JhbFRoaXMuQmFzZTY0LCAvL1xuICAgIGF0b2I6IGdsb2JhbFRoaXMuYXRvYixcbiAgICBidG9hOiBnbG9iYWxUaGlzLmJ0b2EsXG4gICAgLi4ub3B0RW5kb3dtZW50cyxcbiAgfTtcblxuICBsZXQgQ29tcGFydG1lbnRUb1VzZSA9IENvbXBhcnRtZW50O1xuICBpZiAoXG4gICAgaW5lc2NhcGFibGVUcmFuc2Zvcm1zLmxlbmd0aCB8fFxuICAgIE9iamVjdC5rZXlzKGluZXNjYXBhYmxlR2xvYmFsUHJvcGVydGllcykubGVuZ3RoXG4gICkge1xuICAgIC8vXG4gICAgQ29tcGFydG1lbnRUb1VzZSA9IHdyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50KFxuICAgICAgQ29tcGFydG1lbnQsXG4gICAgICBpbmVzY2FwYWJsZVRyYW5zZm9ybXMsXG4gICAgICBpbmVzY2FwYWJsZUdsb2JhbFByb3BlcnRpZXMsXG4gICAgKTtcbiAgfVxuXG4gIGxldCBjb21wYXJ0bWVudDtcblxuICBhc3NlcnQoJ21vZHVsZUZvcm1hdCcgaW4gYnVuZGxlKTtcbiAgY29uc3QgeyBtb2R1bGVGb3JtYXQgfSA9IGJ1bmRsZTtcbiAgaWYgKG1vZHVsZUZvcm1hdCA9PT0gJ2VuZG9aaXBCYXNlNjQnKSB7XG4gICAgYXNzZXJ0KCdlbmRvWmlwQmFzZTY0JyBpbiBidW5kbGUpO1xuICAgIGNvbnN0IHsgZW5kb1ppcEJhc2U2NCB9ID0gYnVuZGxlO1xuICAgIGNvbnN0IGJ5dGVzID0gZGVjb2RlQmFzZTY0KGVuZG9aaXBCYXNlNjQpO1xuICAgIGNvbnN0IGFyY2hpdmUgPSBhd2FpdCBwYXJzZUFyY2hpdmUoYnl0ZXMsIGJ1bmRsZVVybCwge1xuICAgICAgY29tcHV0ZVNoYTUxMixcbiAgICAgIGV4cGVjdGVkU2hhNTEyLFxuICAgICAgY29tcHV0ZVNvdXJjZUxvY2F0aW9uLFxuICAgICAgY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uLFxuICAgIH0pO1xuICAgIC8vXG4gICAgLy9cbiAgICBjb25zdCB7IG5hbWVzcGFjZSB9ID0gYXdhaXQgYXJjaGl2ZVsnaW1wb3J0J10oe1xuICAgICAgZ2xvYmFsczogZW5kb3dtZW50cyxcbiAgICAgIF9fc2hpbVRyYW5zZm9ybXNfXzogdHJhbnNmb3JtcyxcbiAgICAgIENvbXBhcnRtZW50OiBDb21wYXJ0bWVudFRvVXNlLFxuICAgIH0pO1xuICAgIC8vXG4gICAgcmV0dXJuIG5hbWVzcGFjZTtcbiAgfVxuXG4gIC8vXG4gIC8vXG4gIGlmIChtb2R1bGVGb3JtYXQgPT09ICd0ZXN0Jykge1xuICAgIGNvbnN0IGV4cG9ydHMgPSBidW5kbGVbU3ltYm9sLmZvcignZXhwb3J0cycpXTtcbiAgICBpZiAoZXhwb3J0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdDYW5ub3QgaW1wb3J0IGJ1bmRsZSB3aXRoIG1vZHVsZUZvcm1hdCBcInRlc3RcIiB0aGF0IGxhY2tzIGFuIHN5bWJvbC1uYW1lZCBwcm9wZXJ0eSBAZXhwb3J0cyBhbmQgaGFzIGxpa2VseSBiZWVuIHBhcnRpYWxseSB0cmFuc3BvcnRlZCB2aWEgSlNPTiBvciBldmVudHVhbC1zZW5kJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgcmV0dXJuIE9iamVjdC5zZWFsKFxuICAgICAgT2JqZWN0LmNyZWF0ZShcbiAgICAgICAgbnVsbCxcbiAgICAgICAgT2JqZWN0LmZyb21FbnRyaWVzKFtcbiAgICAgICAgICAuLi5PYmplY3QuZW50cmllcyhPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhleHBvcnRzKSlcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAuc29ydCgoW2FdLCBbYl0pID0+IChhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMCkpXG4gICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAoW25hbWUsIGRlc2NyaXB0b3JdKSA9PlxuICAgICAgICAgICAgICAgIHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyAmJiBkZXNjcmlwdG9yLmVudW1lcmFibGUsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAubWFwKChbbmFtZV0pID0+IFtcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBleHBvcnRzW25hbWVdLFxuICAgICAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICBbXG4gICAgICAgICAgICBTeW1ib2wudG9TdHJpbmdUYWcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHZhbHVlOiAnTW9kdWxlJyxcbiAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgXSksXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBhc3NlcnQoJ3NvdXJjZScgaW4gYnVuZGxlKTtcbiAgbGV0IHsgc291cmNlIH0gPSBidW5kbGU7XG4gIGNvbnN0IHNvdXJjZU1hcCA9ICdzb3VyY2VNYXAnIGluIGJ1bmRsZSA/IGJ1bmRsZS5zb3VyY2VNYXAgOiAnJztcbiAgaWYgKG1vZHVsZUZvcm1hdCA9PT0gJ2dldEV4cG9ydCcpIHtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgc291cmNlID0gYCgke3NvdXJjZX0pXFxuJHtzb3VyY2VNYXB9YDtcbiAgfSBlbHNlIGlmIChtb2R1bGVGb3JtYXQgPT09ICduZXN0ZWRFdmFsdWF0ZScpIHtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGVuZG93bWVudHMubmVzdGVkRXZhbHVhdGUgPSBzcmMgPT4gY29tcGFydG1lbnQuZXZhbHVhdGUoc3JjKTtcbiAgICBzb3VyY2UgPSBgKCR7c291cmNlfSlcXG4ke3NvdXJjZU1hcH1gO1xuICB9IGVsc2UgaWYgKG1vZHVsZUZvcm1hdCA9PT0gJ2VuZG9TY3JpcHQnKSB7XG4gICAgLy9cbiAgfSBlbHNlIHtcbiAgICBGYWlsYHVucmVjb2duaXplZCBtb2R1bGVGb3JtYXQgJyR7bW9kdWxlRm9ybWF0fSdgO1xuICB9XG5cbiAgY29tcGFydG1lbnQgPSBuZXcgQ29tcGFydG1lbnRUb1VzZShlbmRvd21lbnRzLCB7fSwgeyB0cmFuc2Zvcm1zIH0pO1xuICBoYXJkZW4oY29tcGFydG1lbnQuZ2xvYmFsVGhpcyk7XG4gIGNvbnN0IHJlc3VsdCA9IGNvbXBhcnRtZW50LmV2YWx1YXRlKHNvdXJjZSk7XG4gIGlmIChtb2R1bGVGb3JtYXQgPT09ICdlbmRvU2NyaXB0Jykge1xuICAgIC8vXG4gICAgLy9cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGVsc2Uge1xuICAgIC8vXG4gICAgY29uc3QgbmFtZXNwYWNlID0gcmVzdWx0KGZpbGVQcmVmaXgpO1xuICAgIC8vXG4gICAgcmV0dXJuIG5hbWVzcGFjZTtcbiAgfVxufVxuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgdHlwZWRJbXBvcnRCdW5kbGUgPSBpbXBvcnRCdW5kbGU7XG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UudHlwZWRJbXBvcnRCdW5kbGUodHlwZWRJbXBvcnRCdW5kbGUpO1xuICAgICAgIGNvbnN0IGJ1bmRsZVRlc3RFeHBvcnRzID0gZXhwb3J0cyA9PiB7XG4gIGNvbnN0IHN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKGV4cG9ydHMpLmZpbHRlcihcbiAgICBuYW1lID0+IG5hbWUgIT09IFN5bWJvbC50b1N0cmluZ1RhZyxcbiAgKTtcbiAgc3ltYm9scy5sZW5ndGggPiAwICYmXG4gICAgRmFpbGBleHBvcnRzIG11c3Qgbm90IGhhdmUgc3ltYm9sLW5hbWVkIHByb3BlcnRpZXMsIGdvdDogJHtzeW1ib2xzLm1hcChTdHJpbmcpLmpvaW4oJywgJyl9YDtcbiAgcmV0dXJuIHtcbiAgICBtb2R1bGVGb3JtYXQ6ICd0ZXN0JyxcbiAgICBbU3ltYm9sLmZvcignZXhwb3J0cycpXTogZXhwb3J0cyxcbiAgfTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4qLyRozY9fb25jZS5idW5kbGVUZXN0RXhwb3J0cyhidW5kbGVUZXN0RXhwb3J0cyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpbXBvcnRCdW5kbGUiOlsiaW1wb3J0QnVuZGxlIl0sInR5cGVkSW1wb3J0QnVuZGxlIjpbInR5cGVkSW1wb3J0QnVuZGxlIl0sImJ1bmRsZVRlc3RFeHBvcnRzIjpbImJ1bmRsZVRlc3RFeHBvcnRzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAC3VUAaCBwAAggcAAB0AAABAZW5kby9tYXJzaGFsLXYxLjYuNC9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiLCIuL3NyYy9tYXJzaGFsLmpzIiwiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiLCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qcyIsIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzIiwiLi9zcmMvcmFua09yZGVyLmpzIiwiLi9zcmMvdHlwZXMuanMiLCJAZW5kby9wYXNzLXN0eWxlIl0sImV4cG9ydHMiOlsiYXNzZXJ0UmFua1NvcnRlZCIsImFzc2VydFJhbmtTb3J0ZWQiLCJtYWtlRW5jb2RlUGFzc2FibGUiLCJtYWtlRW5jb2RlUGFzc2FibGUiLCJwYXJzZSIsInBhcnNlIixudWxsLG51bGwsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIiwiQGVuZG8vcGFzcy1zdHlsZSJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanNcIiwgW11dLFtcIi4vc3JjL21hcnNoYWwuanNcIiwgW11dLFtcIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzXCIsIFtdXSxbXCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qc1wiLCBbXV0sW1wiLi9zcmMvZW5jb2RlUGFzc2FibGUuanNcIiwgW11dLFtcIi4vc3JjL3JhbmtPcmRlci5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiOltbIlFDTEFTUyIsIlFDTEFTUyJdXSwiLi9zcmMvbWFyc2hhbC5qcyI6W1sibWFrZU1hcnNoYWwiLCJtYWtlTWFyc2hhbCJdXSwiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiOltbInN0cmluZ2lmeSIsInN0cmluZ2lmeSJdLFsicGFyc2UiLCJwYXJzZSJdXSwiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiOltbImRlY29kZVRvSnVzdGluIiwiZGVjb2RlVG9KdXN0aW4iXV0sIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzIjpbWyJtYWtlUGFzc2FibGVLaXQiLCJtYWtlUGFzc2FibGVLaXQiXSxbIm1ha2VFbmNvZGVQYXNzYWJsZSIsIm1ha2VFbmNvZGVQYXNzYWJsZSJdLFsibWFrZURlY29kZVBhc3NhYmxlIiwibWFrZURlY29kZVBhc3NhYmxlIl0sWyJpc0VuY29kZWRSZW1vdGFibGUiLCJpc0VuY29kZWRSZW1vdGFibGUiXSxbInplcm9QYWQiLCJ6ZXJvUGFkIl0sWyJyZWNvcmROYW1lcyIsInJlY29yZE5hbWVzIl0sWyJyZWNvcmRWYWx1ZXMiLCJyZWNvcmRWYWx1ZXMiXV0sIi4vc3JjL3JhbmtPcmRlci5qcyI6W1sidHJpdmlhbENvbXBhcmF0b3IiLCJ0cml2aWFsQ29tcGFyYXRvciJdLFsiYXNzZXJ0UmFua1NvcnRlZCIsImFzc2VydFJhbmtTb3J0ZWQiXSxbImNvbXBhcmVSYW5rIiwiY29tcGFyZVJhbmsiXSxbImlzUmFua1NvcnRlZCIsImlzUmFua1NvcnRlZCJdLFsic29ydEJ5UmFuayIsInNvcnRCeVJhbmsiXSxbImNvbXBhcmVBbnRpUmFuayIsImNvbXBhcmVBbnRpUmFuayJdLFsibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiLCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCJdLFsiZ2V0UGFzc1N0eWxlQ292ZXIiLCJnZXRQYXNzU3R5bGVDb3ZlciJdLFsiaW50ZXJzZWN0UmFua0NvdmVycyIsImludGVyc2VjdFJhbmtDb3ZlcnMiXSxbInVuaW9uUmFua0NvdmVycyIsInVuaW9uUmFua0NvdmVycyJdXSwiQGVuZG8vcGFzcy1zdHlsZSI6W1siZGVlcGx5RnVsZmlsbGVkIiwiZGVlcGx5RnVsZmlsbGVkIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACVfGWZmk8AAJpPAAAqAAAAQGVuZG8vbWFyc2hhbC12MS42LjQvc3JjL2VuY29kZVBhc3NhYmxlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJpc0VuY29kZWRSZW1vdGFibGUiLCJtYWtlRGVjb2RlUGFzc2FibGUiLCJtYWtlRW5jb2RlUGFzc2FibGUiLCJtYWtlUGFzc2FibGVLaXQiLCJwYXNzU3R5bGVQcmVmaXhlcyIsInJlY29yZE5hbWVzIiwicmVjb3JkVmFsdWVzIiwiemVyb1BhZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGdldFRhZyxtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLGFzc2VydFJlY29yZCxpc0Vycm9yTGlrZSxuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc2FibGVTeW1ib2xGb3JOYW1lLGIscSxGYWlsOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiZ2V0VGFnXCIsWyRozY9fYSA9PiAoZ2V0VGFnID0gJGjNj19hKV1dLFtcIm1ha2VUYWdnZWRcIixbJGjNj19hID0+IChtYWtlVGFnZ2VkID0gJGjNj19hKV1dLFtcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UmVjb3JkXCIsWyRozY9fYSA9PiAoYXNzZXJ0UmVjb3JkID0gJGjNj19hKV1dLFtcImlzRXJyb3JMaWtlXCIsWyRozY9fYSA9PiAoaXNFcnJvckxpa2UgPSAkaM2PX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsWyRozY9fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjNj19hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLFskaM2PX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiYlwiLFskaM2PX2EgPT4gKGIgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3QgeyBmcm9tRW50cmllcywgaXMgfSA9IE9iamVjdDtcbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcblxuLy9cbmNvbnN0IHJDMCA9IC9bXFx4MDAtXFx4MUZdLztcblxuLypcblxuXG5cblxuXG5cblxuICovXG5jb25zdCBnZXRTdWZmaXggPSAoc3RyLCBpbmRleCkgPT4gKGluZGV4ID09PSAwID8gc3RyIDogc3RyLnN1YnN0cmluZyhpbmRleCkpO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCByZWNvcmROYW1lcyA9IHJlY29yZCA9PlxuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICBoYXJkZW4oLyogICAgICAgICAgICAgICAgICAgKi8gKG93bktleXMocmVjb3JkKSkuc29ydCgpLnJldmVyc2UoKSk7JGjNj19vbmNlLnJlY29yZE5hbWVzKHJlY29yZE5hbWVzKTtcbmhhcmRlbihyZWNvcmROYW1lcyk7XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHJlY29yZFZhbHVlcyA9IChyZWNvcmQsIG5hbWVzKSA9PlxuICBoYXJkZW4obmFtZXMubWFwKG5hbWUgPT4gcmVjb3JkW25hbWVdKSk7JGjNj19vbmNlLnJlY29yZFZhbHVlcyhyZWNvcmRWYWx1ZXMpO1xuaGFyZGVuKHJlY29yZFZhbHVlcyk7XG5cbmNvbnN0IHplcm9lcyA9IEFycmF5KDE2KVxuICAuZmlsbCh1bmRlZmluZWQpXG4gIC5tYXAoKF8sIGkpID0+ICcwJy5yZXBlYXQoaSkpO1xuXG4vKlxuXG5cblxuICovXG4gICAgICAgY29uc3QgemVyb1BhZCA9IChuLCBzaXplKSA9PiB7XG4gIGNvbnN0IG5TdHIgPSBgJHtufWA7XG4gIGNvbnN0IGZpbGxMZW4gPSBzaXplIC0gblN0ci5sZW5ndGg7XG4gIGlmIChmaWxsTGVuID09PSAwKSByZXR1cm4gblN0cjtcbiAgYXNzZXJ0KGZpbGxMZW4gPiAwICYmIGZpbGxMZW4gPCB6ZXJvZXMubGVuZ3RoKTtcbiAgcmV0dXJuIGAke3plcm9lc1tmaWxsTGVuXX0ke25TdHJ9YDtcbn07JGjNj19vbmNlLnplcm9QYWQoemVyb1BhZCk7XG5oYXJkZW4oemVyb1BhZCk7XG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuY29uc3QgYXNOdW1iZXIgPSBuZXcgRmxvYXQ2NEFycmF5KDEpO1xuY29uc3QgYXNCaXRzID0gbmV3IEJpZ1VpbnQ2NEFycmF5KGFzTnVtYmVyLmJ1ZmZlcik7XG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuLy9cbmNvbnN0IENhbm9uaWNhbE5hTkJpdHMgPSAnZmZmODAwMDAwMDAwMDAwMCc7XG5cbi8qXG5cblxuICovXG5jb25zdCBlbmNvZGVCaW5hcnk2NCA9IG4gPT4ge1xuICAvL1xuICBpZiAoaXMobiwgLTApKSB7XG4gICAgbiA9IDA7XG4gIH0gZWxzZSBpZiAoaXMobiwgTmFOKSkge1xuICAgIHJldHVybiBgZiR7Q2Fub25pY2FsTmFOQml0c31gO1xuICB9XG4gIGFzTnVtYmVyWzBdID0gbjtcbiAgbGV0IGJpdHMgPSBhc0JpdHNbMF07XG4gIGlmIChuIDwgMCkge1xuICAgIGJpdHMgXj0gMHhmZmZmZmZmZmZmZmZmZmZmbjtcbiAgfSBlbHNlIHtcbiAgICBiaXRzIF49IDB4ODAwMDAwMDAwMDAwMDAwMG47XG4gIH1cbiAgcmV0dXJuIGBmJHt6ZXJvUGFkKGJpdHMudG9TdHJpbmcoMTYpLCAxNil9YDtcbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGRlY29kZUJpbmFyeTY0ID0gKGVuY29kZWQsIHNraXAgPSAwKSA9PiB7XG4gIGVuY29kZWQuY2hhckF0KHNraXApID09PSAnZicgfHwgRmFpbGBFbmNvZGVkIG51bWJlciBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG4gIGxldCBiaXRzID0gQmlnSW50KGAweCR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXAgKyAxKX1gKTtcbiAgaWYgKGVuY29kZWQuY2hhckF0KHNraXAgKyAxKSA8ICc4Jykge1xuICAgIGJpdHMgXj0gMHhmZmZmZmZmZmZmZmZmZmZmbjtcbiAgfSBlbHNlIHtcbiAgICBiaXRzIF49IDB4ODAwMDAwMDAwMDAwMDAwMG47XG4gIH1cbiAgYXNCaXRzWzBdID0gYml0cztcbiAgY29uc3QgcmVzdWx0ID0gYXNOdW1iZXJbMF07XG4gICFpcyhyZXN1bHQsIC0wKSB8fFxuICAgIEZhaWxgVW5leHBlY3RlZCBuZWdhdGl2ZSB6ZXJvOiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgZW5jb2RlQmlnSW50ID0gbiA9PiB7XG4gIGNvbnN0IGFicyA9IG4gPCAwbiA/IC1uIDogbjtcbiAgY29uc3QgbkRpZ2l0cyA9IGFicy50b1N0cmluZygpLmxlbmd0aDtcbiAgY29uc3QgbERpZ2l0cyA9IG5EaWdpdHMudG9TdHJpbmcoKS5sZW5ndGg7XG4gIGlmIChuIDwgMG4pIHtcbiAgICByZXR1cm4gYG4ke1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAnIycucmVwZWF0KGxEaWdpdHMgLSAxKVxuICAgIH0ke1xuICAgICAgLy9cbiAgICAgICgxMCAqKiBsRGlnaXRzIC0gbkRpZ2l0cykudG9TdHJpbmcoKS5wYWRTdGFydChsRGlnaXRzLCAnMCcpXG4gICAgfToke1xuICAgICAgLy9cbiAgICAgICgxMG4gKiogQmlnSW50KG5EaWdpdHMpICsgbikudG9TdHJpbmcoKS5wYWRTdGFydChuRGlnaXRzLCAnMCcpXG4gICAgfWA7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGBwJHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgJ34nLnJlcGVhdChsRGlnaXRzIC0gMSlcbiAgICB9JHtcbiAgICAgIC8vXG4gICAgICBuRGlnaXRzXG4gICAgfToke1xuICAgICAgLy9cbiAgICAgIG5cbiAgICB9YDtcbiAgfVxufTtcblxuY29uc3QgckJpZ0ludFBheWxvYWQgPSAvKFswLTldKykoOihbMC05XSskfCl8KS9zO1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgZGVjb2RlQmlnSW50ID0gZW5jb2RlZCA9PiB7XG4gIGNvbnN0IHR5cGVQcmVmaXggPSBlbmNvZGVkLmNoYXJBdCgwKTsgLy9cbiAgdHlwZVByZWZpeCA9PT0gJ3AnIHx8XG4gICAgdHlwZVByZWZpeCA9PT0gJ24nIHx8XG4gICAgRmFpbGBFbmNvZGVkIGJpZ2ludCBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5cbiAgY29uc3Qge1xuICAgIGluZGV4OiBsRGlnaXRzLFxuICAgIDE6IHNuRGlnaXRzLFxuICAgIDI6IHRhaWwsXG4gICAgMzogZGlnaXRzLFxuICB9ID0gZW5jb2RlZC5tYXRjaChyQmlnSW50UGF5bG9hZCkgfHwgRmFpbGBEaWdpdCBjb3VudCBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG5cbiAgc25EaWdpdHMubGVuZ3RoID09PSBsRGlnaXRzIHx8XG4gICAgRmFpbGBVbmFyeS1wcmVmaXhlZCBkZWNpbWFsIGRpZ2l0IGNvdW50IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbiAgbGV0IG5EaWdpdHMgPSBwYXJzZUludChzbkRpZ2l0cywgMTApO1xuICBpZiAodHlwZVByZWZpeCA9PT0gJ24nKSB7XG4gICAgLy9cbiAgICAvL1xuICAgIG5EaWdpdHMgPSAxMCAqKiAvKiAgICAgICAgICAgICAgICAgKi8gKGxEaWdpdHMpIC0gbkRpZ2l0cztcbiAgfVxuXG4gIHRhaWwuY2hhckF0KDApID09PSAnOicgfHwgRmFpbGBTZXBhcmF0b3IgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuICBkaWdpdHMubGVuZ3RoID09PSBuRGlnaXRzIHx8XG4gICAgRmFpbGBGaXhlZC1sZW5ndGggZGlnaXQgc2VxdWVuY2UgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuICBsZXQgbiA9IEJpZ0ludChkaWdpdHMpO1xuICBpZiAodHlwZVByZWZpeCA9PT0gJ24nKSB7XG4gICAgLy9cbiAgICAvL1xuICAgIG4gPSAtKDEwbiAqKiBCaWdJbnQobkRpZ2l0cykgLSBuKTtcbiAgfVxuXG4gIHJldHVybiBuO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBzdHJpbmdFc2NhcGVzID0gQXJyYXkoMHgyMilcbiAgLmZpbGwodW5kZWZpbmVkKVxuICAubWFwKChfLCBjcCkgPT4ge1xuICAgIHN3aXRjaCAoU3RyaW5nLmZyb21DaGFyQ29kZShjcCkpIHtcbiAgICAgIGNhc2UgJyAnOlxuICAgICAgICByZXR1cm4gJyFfJztcbiAgICAgIGNhc2UgJyEnOlxuICAgICAgICByZXR1cm4gJyF8JztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBgISR7U3RyaW5nLmZyb21DaGFyQ29kZShjcCArIDB4MjEpfWA7XG4gICAgfVxuICB9KTtcbnN0cmluZ0VzY2FwZXNbJ14nLmNoYXJDb2RlQXQoMCldID0gJ19AJztcbnN0cmluZ0VzY2FwZXNbJ18nLmNoYXJDb2RlQXQoMCldID0gJ19fJztcblxuLypcblxuXG5cbiAqL1xuY29uc3QgZW5jb2RlQ29tcGFjdFN0cmluZ1N1ZmZpeCA9IHN0ciA9PlxuICBzdHIucmVwbGFjZSgvW1xcMC0hXl9dL2csIGNoID0+IHN0cmluZ0VzY2FwZXNbY2guY2hhckNvZGVBdCgwKV0pO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBkZWNvZGVDb21wYWN0U3RyaW5nU3VmZml4ID0gZW5jb2RlZCA9PiB7XG4gIHJldHVybiBlbmNvZGVkLnJlcGxhY2UoLyhbXFwwLSFfXSkoLnxcXG4pPy9nLCAoZXNjLCBwcmVmaXgsIHN1ZmZpeCkgPT4ge1xuICAgIHN3aXRjaCAoZXNjKSB7XG4gICAgICBjYXNlICchXyc6XG4gICAgICAgIHJldHVybiAnICc7XG4gICAgICBjYXNlICchfCc6XG4gICAgICAgIHJldHVybiAnISc7XG4gICAgICBjYXNlICdfQCc6XG4gICAgICAgIHJldHVybiAnXic7XG4gICAgICBjYXNlICdfXyc6XG4gICAgICAgIHJldHVybiAnXyc7XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGNvbnN0IGNoID0gLyogICAgICAgICAgICAgICAgICovIChzdWZmaXgpO1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAocHJlZml4ID09PSAnIScgJiYgc3VmZml4ICE9PSB1bmRlZmluZWQgJiYgY2ggPj0gJyEnICYmIGNoIDw9ICdAJykgfHxcbiAgICAgICAgICBGYWlsYGludmFsaWQgc3RyaW5nIGVzY2FwZTogJHtxKGVzYyl9YDtcbiAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoY2guY2hhckNvZGVBdCgwKSAtIDB4MjEpO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBlbmNvZGVMZWdhY3lTdHJpbmdTdWZmaXggPSBzdHIgPT4gc3RyO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBkZWNvZGVMZWdhY3lTdHJpbmdTdWZmaXggPSBlbmNvZGVkID0+IGVuY29kZWQ7XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgZW5jb2RlQ29tcGFjdEFycmF5ID0gKGFycmF5LCBlbmNvZGVQYXNzYWJsZSkgPT4ge1xuICBjb25zdCBjaGFycyA9IFsnXiddO1xuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgYXJyYXkpIHtcbiAgICBjb25zdCBlbmMgPSBlbmNvZGVQYXNzYWJsZShlbGVtZW50KTtcbiAgICBjaGFycy5wdXNoKGVuYywgJyAnKTtcbiAgfVxuICByZXR1cm4gY2hhcnMuam9pbignJyk7XG59O1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGRlY29kZUNvbXBhY3RBcnJheSA9IChlbmNvZGVkLCBkZWNvZGVQYXNzYWJsZSwgc2tpcCA9IDApID0+IHtcbiAgY29uc3QgZWxlbWVudHMgPSBbXTtcbiAgbGV0IGRlcHRoID0gMDtcbiAgLy9cbiAgLy9cbiAgbGV0IG5leHRJbmRleCA9IHNraXAgKyAxO1xuICBsZXQgY3VycmVudEVsZW1lbnRTdGFydCA9IHNraXAgKyAxO1xuICBmb3IgKGNvbnN0IHsgMDogY2gsIGluZGV4OiBpIH0gb2YgZW5jb2RlZC5tYXRjaEFsbCgvW1xcXiBdL2cpKSB7XG4gICAgY29uc3QgaW5kZXggPSAvKiAgICAgICAgICAgICAgICAgKi8gKGkpO1xuICAgIGlmIChpbmRleCA8PSBza2lwKSB7XG4gICAgICBpZiAoaW5kZXggPT09IHNraXApIHtcbiAgICAgICAgY2ggPT09ICdeJyB8fCBGYWlsYEVuY29kZWQgYXJyYXkgZXhwZWN0ZWQ6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChjaCA9PT0gJ14nKSB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGRlcHRoICs9IDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vXG4gICAgICBpZiAoaW5kZXggPT09IG5leHRJbmRleCkge1xuICAgICAgICAvL1xuICAgICAgICBkZXB0aCAtPSAxO1xuICAgICAgICBkZXB0aCA+PSAwIHx8XG4gICAgICAgICAgLy9cbiAgICAgICAgICBGYWlsYHVuZXhwZWN0ZWQgYXJyYXkgZWxlbWVudCB0ZXJtaW5hdG9yOiAke2VuY29kZWQuc2xpY2Uoc2tpcCwgaW5kZXggKyAyKX1gO1xuICAgICAgfVxuICAgICAgaWYgKGRlcHRoID09PSAwKSB7XG4gICAgICAgIC8vXG4gICAgICAgIGVsZW1lbnRzLnB1c2goXG4gICAgICAgICAgZGVjb2RlUGFzc2FibGUoZW5jb2RlZC5zbGljZShjdXJyZW50RWxlbWVudFN0YXJ0LCBpbmRleCkpLFxuICAgICAgICApO1xuICAgICAgICBjdXJyZW50RWxlbWVudFN0YXJ0ID0gaW5kZXggKyAxO1xuICAgICAgfVxuICAgIH1cbiAgICAvL1xuICAgIG5leHRJbmRleCA9IGluZGV4ICsgMTtcbiAgfVxuICBkZXB0aCA9PT0gMCB8fCBGYWlsYHVudGVybWluYXRlZCBhcnJheTogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgbmV4dEluZGV4ID09PSBlbmNvZGVkLmxlbmd0aCB8fFxuICAgIEZhaWxgdW50ZXJtaW5hdGVkIGFycmF5IGVsZW1lbnQ6ICR7Z2V0U3VmZml4KFxuICAgICAgZW5jb2RlZCxcbiAgICAgIGN1cnJlbnRFbGVtZW50U3RhcnQsXG4gICAgKX1gO1xuICByZXR1cm4gaGFyZGVuKGVsZW1lbnRzKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGVuY29kZUxlZ2FjeUFycmF5ID0gKGFycmF5LCBlbmNvZGVQYXNzYWJsZSkgPT4ge1xuICBjb25zdCBjaGFycyA9IFsnWyddO1xuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgYXJyYXkpIHtcbiAgICBjb25zdCBlbmMgPSBlbmNvZGVQYXNzYWJsZShlbGVtZW50KTtcbiAgICBmb3IgKGNvbnN0IGMgb2YgZW5jKSB7XG4gICAgICBpZiAoYyA9PT0gJ1xcdTAwMDAnIHx8IGMgPT09ICdcXHUwMDAxJykge1xuICAgICAgICBjaGFycy5wdXNoKCdcXHUwMDAxJyk7XG4gICAgICB9XG4gICAgICBjaGFycy5wdXNoKGMpO1xuICAgIH1cbiAgICBjaGFycy5wdXNoKCdcXHUwMDAwJyk7XG4gIH1cbiAgcmV0dXJuIGNoYXJzLmpvaW4oJycpO1xufTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBkZWNvZGVMZWdhY3lBcnJheSA9IChlbmNvZGVkLCBkZWNvZGVQYXNzYWJsZSwgc2tpcCA9IDApID0+IHtcbiAgY29uc3QgZWxlbWVudHMgPSBbXTtcbiAgY29uc3QgZWxlbUNoYXJzID0gW107XG4gIC8vXG4gIC8vXG4gIGxldCBzdGlsbFRvU2tpcCA9IHNraXAgKyAxO1xuICBsZXQgaW5Fc2NhcGUgPSBmYWxzZTtcbiAgZm9yIChjb25zdCBjIG9mIGVuY29kZWQpIHtcbiAgICBpZiAoc3RpbGxUb1NraXAgPiAwKSB7XG4gICAgICBzdGlsbFRvU2tpcCAtPSAxO1xuICAgICAgaWYgKHN0aWxsVG9Ta2lwID09PSAwKSB7XG4gICAgICAgIGMgPT09ICdbJyB8fCBGYWlsYEVuY29kZWQgYXJyYXkgZXhwZWN0ZWQ6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpbkVzY2FwZSkge1xuICAgICAgYyA9PT0gJ1xcdTAwMDAnIHx8XG4gICAgICAgIGMgPT09ICdcXHUwMDAxJyB8fFxuICAgICAgICBGYWlsYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGFmdGVyIHUwMDAxIGVzY2FwZTogJHtjfWA7XG4gICAgICBlbGVtQ2hhcnMucHVzaChjKTtcbiAgICB9IGVsc2UgaWYgKGMgPT09ICdcXHUwMDAwJykge1xuICAgICAgY29uc3QgZW5jb2RlZEVsZW1lbnQgPSBlbGVtQ2hhcnMuam9pbignJyk7XG4gICAgICBlbGVtQ2hhcnMubGVuZ3RoID0gMDtcbiAgICAgIGNvbnN0IGVsZW1lbnQgPSBkZWNvZGVQYXNzYWJsZShlbmNvZGVkRWxlbWVudCk7XG4gICAgICBlbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuICAgIH0gZWxzZSBpZiAoYyA9PT0gJ1xcdTAwMDEnKSB7XG4gICAgICBpbkVzY2FwZSA9IHRydWU7XG4gICAgICAvL1xuICAgICAgY29udGludWU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGVsZW1DaGFycy5wdXNoKGMpO1xuICAgIH1cbiAgICBpbkVzY2FwZSA9IGZhbHNlO1xuICB9XG4gICFpbkVzY2FwZSB8fCBGYWlsYHVuZXhwZWN0ZWQgZW5kIG9mIGVuY29kaW5nICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gIGVsZW1DaGFycy5sZW5ndGggPT09IDAgfHxcbiAgICBGYWlsYGVuY29kaW5nIHRlcm1pbmF0ZWQgZWFybHk6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gIHJldHVybiBoYXJkZW4oZWxlbWVudHMpO1xufTtcblxuY29uc3QgZW5jb2RlUmVjb3JkID0gKHJlY29yZCwgZW5jb2RlQXJyYXksIGVuY29kZVBhc3NhYmxlKSA9PiB7XG4gIGNvbnN0IG5hbWVzID0gcmVjb3JkTmFtZXMocmVjb3JkKTtcbiAgY29uc3QgdmFsdWVzID0gcmVjb3JkVmFsdWVzKHJlY29yZCwgbmFtZXMpO1xuICByZXR1cm4gYCgke2VuY29kZUFycmF5KGhhcmRlbihbbmFtZXMsIHZhbHVlc10pLCBlbmNvZGVQYXNzYWJsZSl9YDtcbn07XG5cbmNvbnN0IGRlY29kZVJlY29yZCA9IChlbmNvZGVkLCBkZWNvZGVBcnJheSwgZGVjb2RlUGFzc2FibGUsIHNraXAgPSAwKSA9PiB7XG4gIGFzc2VydChlbmNvZGVkLmNoYXJBdChza2lwKSA9PT0gJygnKTtcbiAgLy9cbiAgLy9cbiAgY29uc3QgdW56aXBwZWRFbnRyaWVzID0gZGVjb2RlQXJyYXkoZW5jb2RlZCwgZGVjb2RlUGFzc2FibGUsIHNraXAgKyAxKTtcbiAgdW56aXBwZWRFbnRyaWVzLmxlbmd0aCA9PT0gMiB8fFxuICAgIEZhaWxgZXhwZWN0ZWQga2V5cyx2YWx1ZXMgcGFpcjogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgY29uc3QgW2tleXMsIHZhbHNdID0gdW56aXBwZWRFbnRyaWVzO1xuXG4gIChwYXNzU3R5bGVPZihrZXlzKSA9PT0gJ2NvcHlBcnJheScgJiZcbiAgICBwYXNzU3R5bGVPZih2YWxzKSA9PT0gJ2NvcHlBcnJheScgJiZcbiAgICBrZXlzLmxlbmd0aCA9PT0gdmFscy5sZW5ndGggJiZcbiAgICBrZXlzLmV2ZXJ5KGtleSA9PiB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJykpIHx8XG4gICAgRmFpbGBub3QgYSB2YWxpZCByZWNvcmQgZW5jb2Rpbmc6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gIGNvbnN0IG1hcEVudHJpZXMgPSBrZXlzLm1hcCgoa2V5LCBpKSA9PiBba2V5LCB2YWxzW2ldXSk7XG4gIGNvbnN0IHJlY29yZCA9IGhhcmRlbihmcm9tRW50cmllcyhtYXBFbnRyaWVzKSk7XG4gIGFzc2VydFJlY29yZChyZWNvcmQsICdkZWNvZGVkIHJlY29yZCcpO1xuICByZXR1cm4gcmVjb3JkO1xufTtcblxuY29uc3QgZW5jb2RlVGFnZ2VkID0gKHRhZ2dlZCwgZW5jb2RlQXJyYXksIGVuY29kZVBhc3NhYmxlKSA9PlxuICBgOiR7ZW5jb2RlQXJyYXkoaGFyZGVuKFtnZXRUYWcodGFnZ2VkKSwgdGFnZ2VkLnBheWxvYWRdKSwgZW5jb2RlUGFzc2FibGUpfWA7XG5cbmNvbnN0IGRlY29kZVRhZ2dlZCA9IChlbmNvZGVkLCBkZWNvZGVBcnJheSwgZGVjb2RlUGFzc2FibGUsIHNraXAgPSAwKSA9PiB7XG4gIGFzc2VydChlbmNvZGVkLmNoYXJBdChza2lwKSA9PT0gJzonKTtcbiAgLy9cbiAgLy9cbiAgY29uc3QgdGFnZ2VkUGF5bG9hZCA9IGRlY29kZUFycmF5KGVuY29kZWQsIGRlY29kZVBhc3NhYmxlLCBza2lwICsgMSk7XG4gIHRhZ2dlZFBheWxvYWQubGVuZ3RoID09PSAyIHx8XG4gICAgRmFpbGBleHBlY3RlZCB0YWcscGF5bG9hZCBwYWlyOiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICBjb25zdCBbdGFnLCBwYXlsb2FkXSA9IHRhZ2dlZFBheWxvYWQ7XG4gIHBhc3NTdHlsZU9mKHRhZykgPT09ICdzdHJpbmcnIHx8XG4gICAgRmFpbGBub3QgYSB2YWxpZCB0YWdnZWQgZW5jb2Rpbmc6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gIHJldHVybiBtYWtlVGFnZ2VkKHRhZywgcGF5bG9hZCk7XG59O1xuXG5jb25zdCBtYWtlRW5jb2RlUmVtb3RhYmxlID0gKHVuc2FmZUVuY29kZVJlbW90YWJsZSwgdmVyaWZ5RW5jb2RpbmcpID0+IHtcbiAgY29uc3QgZW5jb2RlUmVtb3RhYmxlID0gKHIsIGlubmVyRW5jb2RlKSA9PiB7XG4gICAgY29uc3QgZW5jb2RpbmcgPSB1bnNhZmVFbmNvZGVSZW1vdGFibGUociwgaW5uZXJFbmNvZGUpO1xuICAgICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmIGVuY29kaW5nLmNoYXJBdCgwKSA9PT0gJ3InKSB8fFxuICAgICAgRmFpbGBSZW1vdGFibGUgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiclwiOiAke2VuY29kaW5nfWA7XG4gICAgdmVyaWZ5RW5jb2RpbmcoZW5jb2RpbmcsICdSZW1vdGFibGUnKTtcbiAgICByZXR1cm4gZW5jb2Rpbmc7XG4gIH07XG4gIHJldHVybiBlbmNvZGVSZW1vdGFibGU7XG59O1xuXG5jb25zdCBtYWtlRW5jb2RlUHJvbWlzZSA9ICh1bnNhZmVFbmNvZGVQcm9taXNlLCB2ZXJpZnlFbmNvZGluZykgPT4ge1xuICBjb25zdCBlbmNvZGVQcm9taXNlID0gKHAsIGlubmVyRW5jb2RlKSA9PiB7XG4gICAgY29uc3QgZW5jb2RpbmcgPSB1bnNhZmVFbmNvZGVQcm9taXNlKHAsIGlubmVyRW5jb2RlKTtcbiAgICAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJyAmJiBlbmNvZGluZy5jaGFyQXQoMCkgPT09ICc/JykgfHxcbiAgICAgIEZhaWxgUHJvbWlzZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCI/XCI6ICR7ZW5jb2Rpbmd9YDtcbiAgICB2ZXJpZnlFbmNvZGluZyhlbmNvZGluZywgJ1Byb21pc2UnKTtcbiAgICByZXR1cm4gZW5jb2Rpbmc7XG4gIH07XG4gIHJldHVybiBlbmNvZGVQcm9taXNlO1xufTtcblxuY29uc3QgbWFrZUVuY29kZUVycm9yID0gKHVuc2FmZUVuY29kZUVycm9yLCB2ZXJpZnlFbmNvZGluZykgPT4ge1xuICBjb25zdCBlbmNvZGVFcnJvciA9IChlcnIsIGlubmVyRW5jb2RlKSA9PiB7XG4gICAgY29uc3QgZW5jb2RpbmcgPSB1bnNhZmVFbmNvZGVFcnJvcihlcnIsIGlubmVyRW5jb2RlKTtcbiAgICAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJyAmJiBlbmNvZGluZy5jaGFyQXQoMCkgPT09ICchJykgfHxcbiAgICAgIEZhaWxgRXJyb3IgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiIVwiOiAke2VuY29kaW5nfWA7XG4gICAgdmVyaWZ5RW5jb2RpbmcoZW5jb2RpbmcsICdFcnJvcicpO1xuICAgIHJldHVybiBlbmNvZGluZztcbiAgfTtcbiAgcmV0dXJuIGVuY29kZUVycm9yO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuICovXG5jb25zdCBtYWtlSW5uZXJFbmNvZGUgPSAoZW5jb2RlU3RyaW5nU3VmZml4LCBlbmNvZGVBcnJheSwgb3B0aW9ucykgPT4ge1xuICBjb25zdCB7XG4gICAgZW5jb2RlUmVtb3RhYmxlOiB1bnNhZmVFbmNvZGVSZW1vdGFibGUsXG4gICAgZW5jb2RlUHJvbWlzZTogdW5zYWZlRW5jb2RlUHJvbWlzZSxcbiAgICBlbmNvZGVFcnJvcjogdW5zYWZlRW5jb2RlRXJyb3IsXG4gICAgdmVyaWZ5RW5jb2RpbmcgPSAoKSA9PiB7fSxcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGVuY29kZVJlbW90YWJsZSA9IG1ha2VFbmNvZGVSZW1vdGFibGUoXG4gICAgdW5zYWZlRW5jb2RlUmVtb3RhYmxlLFxuICAgIHZlcmlmeUVuY29kaW5nLFxuICApO1xuICBjb25zdCBlbmNvZGVQcm9taXNlID0gbWFrZUVuY29kZVByb21pc2UodW5zYWZlRW5jb2RlUHJvbWlzZSwgdmVyaWZ5RW5jb2RpbmcpO1xuICBjb25zdCBlbmNvZGVFcnJvciA9IG1ha2VFbmNvZGVFcnJvcih1bnNhZmVFbmNvZGVFcnJvciwgdmVyaWZ5RW5jb2RpbmcpO1xuXG4gIGNvbnN0IGlubmVyRW5jb2RlID0gcGFzc2FibGUgPT4ge1xuICAgIGlmIChpc0Vycm9yTGlrZShwYXNzYWJsZSkpIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICByZXR1cm4gZW5jb2RlRXJyb3IocGFzc2FibGUsIGlubmVyRW5jb2RlKTtcbiAgICB9XG4gICAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YocGFzc2FibGUpO1xuICAgIHN3aXRjaCAocGFzc1N0eWxlKSB7XG4gICAgICBjYXNlICdudWxsJzoge1xuICAgICAgICByZXR1cm4gJ3YnO1xuICAgICAgfVxuICAgICAgY2FzZSAndW5kZWZpbmVkJzoge1xuICAgICAgICByZXR1cm4gJ3onO1xuICAgICAgfVxuICAgICAgY2FzZSAnbnVtYmVyJzoge1xuICAgICAgICByZXR1cm4gZW5jb2RlQmluYXJ5NjQocGFzc2FibGUpO1xuICAgICAgfVxuICAgICAgY2FzZSAnc3RyaW5nJzoge1xuICAgICAgICByZXR1cm4gYHMke2VuY29kZVN0cmluZ1N1ZmZpeChwYXNzYWJsZSl9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOiB7XG4gICAgICAgIHJldHVybiBgYiR7cGFzc2FibGV9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2JpZ2ludCc6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kZUJpZ0ludChwYXNzYWJsZSk7XG4gICAgICB9XG4gICAgICBjYXNlICdyZW1vdGFibGUnOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVSZW1vdGFibGUocGFzc2FibGUsIGlubmVyRW5jb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICByZXR1cm4gZW5jb2RlRXJyb3IocGFzc2FibGUsIGlubmVyRW5jb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3Byb21pc2UnOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVQcm9taXNlKHBhc3NhYmxlLCBpbm5lckVuY29kZSk7XG4gICAgICB9XG4gICAgICBjYXNlICdzeW1ib2wnOiB7XG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IG5hbWUgPSBuYW1lRm9yUGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xuICAgICAgICBhc3NlcnQudHlwZW9mKG5hbWUsICdzdHJpbmcnKTtcbiAgICAgICAgcmV0dXJuIGB5JHtlbmNvZGVTdHJpbmdTdWZmaXgobmFtZSl9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kZUFycmF5KHBhc3NhYmxlLCBpbm5lckVuY29kZSk7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5UmVjb3JkJzoge1xuICAgICAgICByZXR1cm4gZW5jb2RlUmVjb3JkKHBhc3NhYmxlLCBlbmNvZGVBcnJheSwgaW5uZXJFbmNvZGUpO1xuICAgICAgfVxuICAgICAgY2FzZSAndGFnZ2VkJzoge1xuICAgICAgICByZXR1cm4gZW5jb2RlVGFnZ2VkKHBhc3NhYmxlLCBlbmNvZGVBcnJheSwgaW5uZXJFbmNvZGUpO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBGYWlsYGEgJHtxKHBhc3NTdHlsZSl9IGNhbm5vdCBiZSB1c2VkIGFzIGEgY29sbGVjdGlvbiBwYXNzYWJsZWA7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByZXR1cm4gaW5uZXJFbmNvZGU7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuY29uc3QgbGliZXJhbERlY29kZXJzID0gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKFxuICAvKiAgICAgICAgICAgICAgICAgICovICh7XG4gICAgZGVjb2RlUmVtb3RhYmxlOiAoX2VuY29kaW5nLCBfaW5uZXJEZWNvZGUpID0+IHVuZGVmaW5lZCxcbiAgICBkZWNvZGVQcm9taXNlOiAoX2VuY29kaW5nLCBfaW5uZXJEZWNvZGUpID0+IHVuZGVmaW5lZCxcbiAgICBkZWNvZGVFcnJvcjogKF9lbmNvZGluZywgX2lubmVyRGVjb2RlKSA9PiB1bmRlZmluZWQsXG4gIH0pXG4pO1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VJbm5lckRlY29kZSA9IChkZWNvZGVTdHJpbmdTdWZmaXgsIGRlY29kZUFycmF5LCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHsgZGVjb2RlUmVtb3RhYmxlLCBkZWNvZGVQcm9taXNlLCBkZWNvZGVFcnJvciB9ID0gb3B0aW9ucztcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgaW5uZXJEZWNvZGUgPSAoZW5jb2RlZCwgc2tpcCA9IDApID0+IHtcbiAgICBzd2l0Y2ggKGVuY29kZWQuY2hhckF0KHNraXApKSB7XG4gICAgICBjYXNlICd2Jzoge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3onOiB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBjYXNlICdmJzoge1xuICAgICAgICByZXR1cm4gZGVjb2RlQmluYXJ5NjQoZW5jb2RlZCwgc2tpcCk7XG4gICAgICB9XG4gICAgICBjYXNlICdzJzoge1xuICAgICAgICByZXR1cm4gZGVjb2RlU3RyaW5nU3VmZml4KGdldFN1ZmZpeChlbmNvZGVkLCBza2lwICsgMSkpO1xuICAgICAgfVxuICAgICAgY2FzZSAnYic6IHtcbiAgICAgICAgY29uc3Qgc3Vic3RyaW5nID0gZ2V0U3VmZml4KGVuY29kZWQsIHNraXAgKyAxKTtcbiAgICAgICAgaWYgKHN1YnN0cmluZyA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoc3Vic3RyaW5nID09PSAnZmFsc2UnKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IEZhaWxgZXhwZWN0ZWQgZW5jb2RlZCBib29sZWFuIHRvIGJlIFwiYnRydWVcIiBvciBcImJmYWxzZVwiOiAke3N1YnN0cmluZ31gO1xuICAgICAgfVxuICAgICAgY2FzZSAnbic6XG4gICAgICBjYXNlICdwJzoge1xuICAgICAgICByZXR1cm4gZGVjb2RlQmlnSW50KGdldFN1ZmZpeChlbmNvZGVkLCBza2lwKSk7XG4gICAgICB9XG4gICAgICBjYXNlICdyJzoge1xuICAgICAgICByZXR1cm4gZGVjb2RlUmVtb3RhYmxlKGdldFN1ZmZpeChlbmNvZGVkLCBza2lwKSwgaW5uZXJEZWNvZGUpO1xuICAgICAgfVxuICAgICAgY2FzZSAnPyc6IHtcbiAgICAgICAgcmV0dXJuIGRlY29kZVByb21pc2UoZ2V0U3VmZml4KGVuY29kZWQsIHNraXApLCBpbm5lckRlY29kZSk7XG4gICAgICB9XG4gICAgICBjYXNlICchJzoge1xuICAgICAgICByZXR1cm4gZGVjb2RlRXJyb3IoZ2V0U3VmZml4KGVuY29kZWQsIHNraXApLCBpbm5lckRlY29kZSk7XG4gICAgICB9XG4gICAgICBjYXNlICd5Jzoge1xuICAgICAgICAvL1xuICAgICAgICBjb25zdCBuYW1lID0gZGVjb2RlU3RyaW5nU3VmZml4KGdldFN1ZmZpeChlbmNvZGVkLCBza2lwICsgMSkpO1xuICAgICAgICByZXR1cm4gcGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuICAgICAgfVxuICAgICAgY2FzZSAnWyc6XG4gICAgICBjYXNlICdeJzoge1xuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gZGVjb2RlQXJyYXkoZW5jb2RlZCwgaW5uZXJEZWNvZGUsIHNraXApO1xuICAgICAgfVxuICAgICAgY2FzZSAnKCc6IHtcbiAgICAgICAgcmV0dXJuIGRlY29kZVJlY29yZChlbmNvZGVkLCBkZWNvZGVBcnJheSwgaW5uZXJEZWNvZGUsIHNraXApO1xuICAgICAgfVxuICAgICAgY2FzZSAnOic6IHtcbiAgICAgICAgcmV0dXJuIGRlY29kZVRhZ2dlZChlbmNvZGVkLCBkZWNvZGVBcnJheSwgaW5uZXJEZWNvZGUsIHNraXApO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBGYWlsYGludmFsaWQgZGF0YWJhc2Uga2V5OiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGlubmVyRGVjb2RlO1xufTtcblxuLypcblxuXG5cbiAqL1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VQYXNzYWJsZUtpdCA9IChvcHRpb25zID0ge30pID0+IHtcbiAgY29uc3Qge1xuICAgIGVuY29kZVJlbW90YWJsZSA9IChyLCBfKSA9PiBGYWlsYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3J9YCxcbiAgICBlbmNvZGVQcm9taXNlID0gKHAsIF8pID0+IEZhaWxgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3B9YCxcbiAgICBlbmNvZGVFcnJvciA9IChlcnIsIF8pID0+IEZhaWxgZXJyb3IgdW5leHBlY3RlZDogJHtlcnJ9YCxcbiAgICBmb3JtYXQgPSAnbGVnYWN5T3JkZXJlZCcsXG5cbiAgICBkZWNvZGVSZW1vdGFibGUgPSAoZW5jb2RpbmcsIF8pID0+IEZhaWxgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7ZW5jb2Rpbmd9YCxcbiAgICBkZWNvZGVQcm9taXNlID0gKGVuY29kaW5nLCBfKSA9PiBGYWlsYHByb21pc2UgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gLFxuICAgIGRlY29kZUVycm9yID0gKGVuY29kaW5nLCBfKSA9PiBGYWlsYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZW5jb2Rpbmd9YCxcbiAgfSA9IG9wdGlvbnM7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgbGV0IGVuY29kZVBhc3NhYmxlO1xuICBjb25zdCBlbmNvZGVPcHRpb25zID0geyBlbmNvZGVSZW1vdGFibGUsIGVuY29kZVByb21pc2UsIGVuY29kZUVycm9yLCBmb3JtYXQgfTtcbiAgaWYgKGZvcm1hdCA9PT0gJ2NvbXBhY3RPcmRlcmVkJykge1xuICAgIGNvbnN0IGxpYmVyYWxEZWNvZGUgPSBtYWtlSW5uZXJEZWNvZGUoXG4gICAgICBkZWNvZGVDb21wYWN0U3RyaW5nU3VmZml4LFxuICAgICAgZGVjb2RlQ29tcGFjdEFycmF5LFxuICAgICAgbGliZXJhbERlY29kZXJzLFxuICAgICk7XG4gICAgLypcblxuXG5cbiAgICAgKi9cbiAgICBjb25zdCB2ZXJpZnlFbmNvZGluZyA9IChlbmNvZGluZywgbGFiZWwpID0+IHtcbiAgICAgICFlbmNvZGluZy5tYXRjaChyQzApIHx8XG4gICAgICAgIEZhaWxgJHtiKFxuICAgICAgICAgIGxhYmVsLFxuICAgICAgICApfSBlbmNvZGluZyBtdXN0IG5vdCBjb250YWluIGEgQzAgY29udHJvbCBjaGFyYWN0ZXI6ICR7ZW5jb2Rpbmd9YDtcbiAgICAgIGNvbnN0IGRlY29kZWQgPSBkZWNvZGVDb21wYWN0QXJyYXkoYF52ICR7ZW5jb2Rpbmd9IHYgYCwgbGliZXJhbERlY29kZSk7XG4gICAgICAoaXNBcnJheShkZWNvZGVkKSAmJlxuICAgICAgICBkZWNvZGVkLmxlbmd0aCA9PT0gMyAmJlxuICAgICAgICBkZWNvZGVkWzBdID09PSBudWxsICYmXG4gICAgICAgIGRlY29kZWRbMl0gPT09IG51bGwpIHx8XG4gICAgICAgIEZhaWxgJHtiKGxhYmVsKX0gZW5jb2RpbmcgbXVzdCBiZSBlbWJlZGRhYmxlOiAke2VuY29kaW5nfWA7XG4gICAgfTtcbiAgICBjb25zdCBlbmNvZGVDb21wYWN0ID0gbWFrZUlubmVyRW5jb2RlKFxuICAgICAgZW5jb2RlQ29tcGFjdFN0cmluZ1N1ZmZpeCxcbiAgICAgIGVuY29kZUNvbXBhY3RBcnJheSxcbiAgICAgIHsgLi4uZW5jb2RlT3B0aW9ucywgdmVyaWZ5RW5jb2RpbmcgfSxcbiAgICApO1xuICAgIGVuY29kZVBhc3NhYmxlID0gcGFzc2FibGUgPT4gYH4ke2VuY29kZUNvbXBhY3QocGFzc2FibGUpfWA7XG4gIH0gZWxzZSBpZiAoZm9ybWF0ID09PSAnbGVnYWN5T3JkZXJlZCcpIHtcbiAgICBlbmNvZGVQYXNzYWJsZSA9IG1ha2VJbm5lckVuY29kZShcbiAgICAgIGVuY29kZUxlZ2FjeVN0cmluZ1N1ZmZpeCxcbiAgICAgIGVuY29kZUxlZ2FjeUFycmF5LFxuICAgICAgZW5jb2RlT3B0aW9ucyxcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIHRocm93IEZhaWxgVW5yZWNvZ25pemVkIGZvcm1hdDogJHtxKGZvcm1hdCl9YDtcbiAgfVxuXG4gIGNvbnN0IGRlY29kZU9wdGlvbnMgPSB7IGRlY29kZVJlbW90YWJsZSwgZGVjb2RlUHJvbWlzZSwgZGVjb2RlRXJyb3IgfTtcbiAgY29uc3QgZGVjb2RlQ29tcGFjdCA9IG1ha2VJbm5lckRlY29kZShcbiAgICBkZWNvZGVDb21wYWN0U3RyaW5nU3VmZml4LFxuICAgIGRlY29kZUNvbXBhY3RBcnJheSxcbiAgICBkZWNvZGVPcHRpb25zLFxuICApO1xuICBjb25zdCBkZWNvZGVMZWdhY3kgPSBtYWtlSW5uZXJEZWNvZGUoXG4gICAgZGVjb2RlTGVnYWN5U3RyaW5nU3VmZml4LFxuICAgIGRlY29kZUxlZ2FjeUFycmF5LFxuICAgIGRlY29kZU9wdGlvbnMsXG4gICk7XG4gIGNvbnN0IGRlY29kZVBhc3NhYmxlID0gZW5jb2RlZCA9PiB7XG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgaWYgKGVuY29kZWQuY2hhckF0KDApID09PSAnficpIHtcbiAgICAgIHJldHVybiBkZWNvZGVDb21wYWN0KGVuY29kZWQsIDEpO1xuICAgIH1cbiAgICByZXR1cm4gZGVjb2RlTGVnYWN5KGVuY29kZWQpO1xuICB9O1xuXG4gIHJldHVybiBoYXJkZW4oeyBlbmNvZGVQYXNzYWJsZSwgZGVjb2RlUGFzc2FibGUgfSk7XG59OyRozY9fb25jZS5tYWtlUGFzc2FibGVLaXQobWFrZVBhc3NhYmxlS2l0KTtcbmhhcmRlbihtYWtlUGFzc2FibGVLaXQpO1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VFbmNvZGVQYXNzYWJsZSA9IGVuY29kZU9wdGlvbnMgPT4ge1xuICBjb25zdCB7IGVuY29kZVBhc3NhYmxlIH0gPSBtYWtlUGFzc2FibGVLaXQoZW5jb2RlT3B0aW9ucyk7XG4gIHJldHVybiBlbmNvZGVQYXNzYWJsZTtcbn07JGjNj19vbmNlLm1ha2VFbmNvZGVQYXNzYWJsZShtYWtlRW5jb2RlUGFzc2FibGUpO1xuaGFyZGVuKG1ha2VFbmNvZGVQYXNzYWJsZSk7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZURlY29kZVBhc3NhYmxlID0gZGVjb2RlT3B0aW9ucyA9PiB7XG4gIGNvbnN0IHsgZGVjb2RlUGFzc2FibGUgfSA9IG1ha2VQYXNzYWJsZUtpdChkZWNvZGVPcHRpb25zKTtcbiAgcmV0dXJuIGRlY29kZVBhc3NhYmxlO1xufTskaM2PX29uY2UubWFrZURlY29kZVBhc3NhYmxlKG1ha2VEZWNvZGVQYXNzYWJsZSk7XG5oYXJkZW4obWFrZURlY29kZVBhc3NhYmxlKTtcblxuICAgICAgIGNvbnN0IGlzRW5jb2RlZFJlbW90YWJsZSA9IGVuY29kZWQgPT4gZW5jb2RlZC5jaGFyQXQoMCkgPT09ICdyJzskaM2PX29uY2UuaXNFbmNvZGVkUmVtb3RhYmxlKGlzRW5jb2RlZFJlbW90YWJsZSk7XG5oYXJkZW4oaXNFbmNvZGVkUmVtb3RhYmxlKTtcblxuLy9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHBhc3NTdHlsZVByZWZpeGVzID0ge1xuICBlcnJvcjogJyEnLFxuICBjb3B5UmVjb3JkOiAnKCcsXG4gIHRhZ2dlZDogJzonLFxuICBwcm9taXNlOiAnPycsXG4gIGNvcHlBcnJheTogJ1teJyxcbiAgYm9vbGVhbjogJ2InLFxuICBudW1iZXI6ICdmJyxcbiAgYmlnaW50OiAnbnAnLFxuICByZW1vdGFibGU6ICdyJyxcbiAgc3RyaW5nOiAncycsXG4gIG51bGw6ICd2JyxcbiAgc3ltYm9sOiAneScsXG4gIC8vXG4gIC8vXG4gIC8vXG4gIHVuZGVmaW5lZDogJ3onLFxufTskaM2PX29uY2UucGFzc1N0eWxlUHJlZml4ZXMocGFzc1N0eWxlUHJlZml4ZXMpO1xuT2JqZWN0LnNldFByb3RvdHlwZU9mKHBhc3NTdHlsZVByZWZpeGVzLCBudWxsKTtcbmhhcmRlbihwYXNzU3R5bGVQcmVmaXhlcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJyZWNvcmROYW1lcyI6WyJyZWNvcmROYW1lcyJdLCJyZWNvcmRWYWx1ZXMiOlsicmVjb3JkVmFsdWVzIl0sInplcm9QYWQiOlsiemVyb1BhZCJdLCJtYWtlUGFzc2FibGVLaXQiOlsibWFrZVBhc3NhYmxlS2l0Il0sIm1ha2VFbmNvZGVQYXNzYWJsZSI6WyJtYWtlRW5jb2RlUGFzc2FibGUiXSwibWFrZURlY29kZVBhc3NhYmxlIjpbIm1ha2VEZWNvZGVQYXNzYWJsZSJdLCJpc0VuY29kZWRSZW1vdGFibGUiOlsiaXNFbmNvZGVkUmVtb3RhYmxlIl0sInBhc3NTdHlsZVByZWZpeGVzIjpbInBhc3NTdHlsZVByZWZpeGVzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAM9ikvj0KwAA9CsAACsAAABAZW5kby9tYXJzaGFsLXYxLjYuNC9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJRQ0xBU1MiLCJtYWtlRGVjb2RlRnJvbUNhcERhdGEiLCJtYWtlRW5jb2RlVG9DYXBEYXRhIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcGFzc1N0eWxlT2YsaXNFcnJvckxpa2UsbWFrZVRhZ2dlZCxpc09iamVjdCxnZXRUYWcsaGFzT3duUHJvcGVydHlPZixhc3NlcnRQYXNzYWJsZVN5bWJvbCxuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc2FibGVTeW1ib2xGb3JOYW1lLFgsRmFpbCxxOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJpc0Vycm9yTGlrZVwiLFskaM2PX2EgPT4gKGlzRXJyb3JMaWtlID0gJGjNj19hKV1dLFtcIm1ha2VUYWdnZWRcIixbJGjNj19hID0+IChtYWtlVGFnZ2VkID0gJGjNj19hKV1dLFtcImlzT2JqZWN0XCIsWyRozY9fYSA9PiAoaXNPYmplY3QgPSAkaM2PX2EpXV0sW1wiZ2V0VGFnXCIsWyRozY9fYSA9PiAoZ2V0VGFnID0gJGjNj19hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIixbJGjNj19hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjNj19hKV1dLFtcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsWyRozY9fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjNj19hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLFskaM2PX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3Qge1xuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLFxuICBkZWZpbmVQcm9wZXJ0aWVzLFxuICBpcyxcbiAgZW50cmllcyxcbiAgZnJvbUVudHJpZXMsXG4gIGZyZWV6ZSxcbn0gPSBPYmplY3Q7XG5cbi8qXG5cblxuICovXG5jb25zdCBRQ0xBU1MgPSAnQHFjbGFzcyc7JGjNj19vbmNlLlFDTEFTUyhRQ0xBU1MpO1xuXG5cbi8qXG5cblxuICovXG5jb25zdCBoYXNRQ2xhc3MgPSBlbmNvZGVkID0+IGhhc093blByb3BlcnR5T2YoZW5jb2RlZCwgUUNMQVNTKTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgcWNsYXNzTWF0Y2hlcyA9IChlbmNvZGVkLCBxY2xhc3MpID0+XG4gIGlzT2JqZWN0KGVuY29kZWQpICYmXG4gICFpc0FycmF5KGVuY29kZWQpICYmXG4gIGhhc1FDbGFzcyhlbmNvZGVkKSAmJlxuICBlbmNvZGVkW1FDTEFTU10gPT09IHFjbGFzcztcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbmNvbnN0IGRvbnRFbmNvZGVSZW1vdGFibGVUb0NhcERhdGEgPSByZW0gPT4gRmFpbGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YDtcblxuY29uc3QgZG9udEVuY29kZVByb21pc2VUb0NhcERhdGEgPSBwcm9tID0+IEZhaWxgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Byb219YDtcblxuY29uc3QgZG9udEVuY29kZUVycm9yVG9DYXBEYXRhID0gZXJyID0+IEZhaWxgZXJyb3Igb2JqZWN0IHVuZXhwZWN0ZWQ6ICR7ZXJyfWA7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZUVuY29kZVRvQ2FwRGF0YSA9IChlbmNvZGVPcHRpb25zID0ge30pID0+IHtcbiAgY29uc3Qge1xuICAgIGVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSA9IGRvbnRFbmNvZGVSZW1vdGFibGVUb0NhcERhdGEsXG4gICAgZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YSA9IGRvbnRFbmNvZGVQcm9taXNlVG9DYXBEYXRhLFxuICAgIGVuY29kZUVycm9yVG9DYXBEYXRhID0gZG9udEVuY29kZUVycm9yVG9DYXBEYXRhLFxuICB9ID0gZW5jb2RlT3B0aW9ucztcblxuICAvKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBlbmNvZGVUb0NhcERhdGFSZWN1ciA9IHBhc3NhYmxlID0+IHtcbiAgICAvL1xuICAgIC8vXG4gICAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YocGFzc2FibGUpO1xuICAgIHN3aXRjaCAocGFzc1N0eWxlKSB7XG4gICAgICBjYXNlICdudWxsJzpcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgY2FzZSAnc3RyaW5nJzoge1xuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gcGFzc2FibGU7XG4gICAgICB9XG4gICAgICBjYXNlICd1bmRlZmluZWQnOiB7XG4gICAgICAgIHJldHVybiB7IFtRQ0xBU1NdOiAndW5kZWZpbmVkJyB9O1xuICAgICAgfVxuICAgICAgY2FzZSAnbnVtYmVyJzoge1xuICAgICAgICAvL1xuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHBhc3NhYmxlKSkge1xuICAgICAgICAgIHJldHVybiB7IFtRQ0xBU1NdOiAnTmFOJyB9O1xuICAgICAgICB9IGVsc2UgaWYgKHBhc3NhYmxlID09PSBJbmZpbml0eSkge1xuICAgICAgICAgIHJldHVybiB7IFtRQ0xBU1NdOiAnSW5maW5pdHknIH07XG4gICAgICAgIH0gZWxzZSBpZiAocGFzc2FibGUgPT09IC1JbmZpbml0eSkge1xuICAgICAgICAgIHJldHVybiB7IFtRQ0xBU1NdOiAnLUluZmluaXR5JyB9O1xuICAgICAgICB9XG4gICAgICAgIC8vXG4gICAgICAgIHJldHVybiBpcyhwYXNzYWJsZSwgLTApID8gMCA6IHBhc3NhYmxlO1xuICAgICAgfVxuICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIFtRQ0xBU1NdOiAnYmlnaW50JyxcbiAgICAgICAgICBkaWdpdHM6IFN0cmluZyhwYXNzYWJsZSksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjYXNlICdzeW1ib2wnOiB7XG4gICAgICAgIGFzc2VydFBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbiAgICAgICAgY29uc3QgbmFtZSA9IC8qICAgICAgICAgICAgICAgICAqLyAobmFtZUZvclBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgW1FDTEFTU106ICdzeW1ib2wnLFxuICAgICAgICAgIG5hbWUsXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5UmVjb3JkJzoge1xuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHlPZihwYXNzYWJsZSwgUUNMQVNTKSkge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgY29uc3QgeyBbUUNMQVNTXTogcWNsYXNzVmFsdWUsIC4uLnJlc3QgfSA9IHBhc3NhYmxlO1xuICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgW1FDTEFTU106ICdoaWxiZXJ0JyxcbiAgICAgICAgICAgIG9yaWdpbmFsOiBlbmNvZGVUb0NhcERhdGFSZWN1cihxY2xhc3NWYWx1ZSksXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAob3duS2V5cyhyZXN0KS5sZW5ndGggPj0gMSkge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgcmVzdWx0LnJlc3QgPSBlbmNvZGVUb0NhcERhdGFSZWN1cihmcmVlemUocmVzdCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IG5hbWVzID0gb3duS2V5cyhwYXNzYWJsZSkuc29ydCgpO1xuICAgICAgICByZXR1cm4gZnJvbUVudHJpZXMoXG4gICAgICAgICAgbmFtZXMubWFwKG5hbWUgPT4gW25hbWUsIGVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlW25hbWVdKV0pLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weUFycmF5Jzoge1xuICAgICAgICByZXR1cm4gcGFzc2FibGUubWFwKGVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBbUUNMQVNTXTogJ3RhZ2dlZCcsXG4gICAgICAgICAgdGFnOiBnZXRUYWcocGFzc2FibGUpLFxuICAgICAgICAgIHBheWxvYWQ6IGVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlLnBheWxvYWQpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY2FzZSAncmVtb3RhYmxlJzoge1xuICAgICAgICBjb25zdCBlbmNvZGVkID0gZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhKFxuICAgICAgICAgIHBhc3NhYmxlLFxuICAgICAgICAgIGVuY29kZVRvQ2FwRGF0YVJlY3VyLFxuICAgICAgICApO1xuICAgICAgICBpZiAocWNsYXNzTWF0Y2hlcyhlbmNvZGVkLCAnc2xvdCcpKSB7XG4gICAgICAgICAgcmV0dXJuIGVuY29kZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLy9cbiAgICAgICAgdGhyb3cgRmFpbGBpbnRlcm5hbDogUmVtb3RhYmxlIGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggJHtxKFxuICAgICAgICAgIFFDTEFTUyxcbiAgICAgICAgKX0gJHtxKCdzbG90Jyl9OiAke2VuY29kZWR9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3Byb21pc2UnOiB7XG4gICAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVQcm9taXNlVG9DYXBEYXRhKHBhc3NhYmxlLCBlbmNvZGVUb0NhcERhdGFSZWN1cik7XG4gICAgICAgIGlmIChxY2xhc3NNYXRjaGVzKGVuY29kZWQsICdzbG90JykpIHtcbiAgICAgICAgICByZXR1cm4gZW5jb2RlZDtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBQcm9taXNlIGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggJHtxKFxuICAgICAgICAgIFFDTEFTUyxcbiAgICAgICAgICAnc2xvdCcsXG4gICAgICAgICl9OiAke2VuY29kZWR9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICBjb25zdCBlbmNvZGVkID0gZW5jb2RlRXJyb3JUb0NhcERhdGEocGFzc2FibGUsIGVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcbiAgICAgICAgaWYgKHFjbGFzc01hdGNoZXMoZW5jb2RlZCwgJ2Vycm9yJykpIHtcbiAgICAgICAgICByZXR1cm4gZW5jb2RlZDtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoICR7cShcbiAgICAgICAgICBRQ0xBU1MsXG4gICAgICAgICAgJ2Vycm9yJyxcbiAgICAgICAgKX06ICR7ZW5jb2RlZH1gO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBhc3NlcnQuZmFpbChcbiAgICAgICAgICBYYGludGVybmFsOiBVbnJlY29nbml6ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfWAsXG4gICAgICAgICAgVHlwZUVycm9yLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgY29uc3QgZW5jb2RlVG9DYXBEYXRhID0gcGFzc2FibGUgPT4ge1xuICAgIGlmIChpc0Vycm9yTGlrZShwYXNzYWJsZSkpIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICByZXR1cm4gaGFyZGVuKGVuY29kZUVycm9yVG9DYXBEYXRhKHBhc3NhYmxlLCBlbmNvZGVUb0NhcERhdGFSZWN1cikpO1xuICAgIH1cbiAgICByZXR1cm4gaGFyZGVuKGVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlKSk7XG4gIH07XG4gIHJldHVybiBoYXJkZW4oZW5jb2RlVG9DYXBEYXRhKTtcbn07JGjNj19vbmNlLm1ha2VFbmNvZGVUb0NhcERhdGEobWFrZUVuY29kZVRvQ2FwRGF0YSk7XG5oYXJkZW4obWFrZUVuY29kZVRvQ2FwRGF0YSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG5jb25zdCBkb250RGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEgPSBzbG90RW5jb2RpbmcgPT5cbiAgRmFpbGByZW1vdGFibGUgb3IgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Nsb3RFbmNvZGluZ31gO1xuY29uc3QgZG9udERlY29kZUVycm9yRnJvbUNhcERhdGEgPSBlcnJvckVuY29kaW5nID0+XG4gIEZhaWxgZXJyb3IgdW5leHBlY3RlZDogJHtlcnJvckVuY29kaW5nfWA7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZURlY29kZUZyb21DYXBEYXRhID0gKGRlY29kZU9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEgPSBkb250RGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG4gICAgZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhID0gZG9udERlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuICAgIGRlY29kZUVycm9yRnJvbUNhcERhdGEgPSBkb250RGVjb2RlRXJyb3JGcm9tQ2FwRGF0YSxcbiAgfSA9IGRlY29kZU9wdGlvbnM7XG5cbiAgZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEgPT09IGRlY29kZVByb21pc2VGcm9tQ2FwRGF0YSB8fFxuICAgIEZhaWxgQW4gaW1wbGVtZW50YXRpb24gcmVzdHJpY3Rpb24gZm9yIG5vdzogSWYgZWl0aGVyIGRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhIG9yIGRlY29kZVByb21pc2VGcm9tQ2FwRGF0YSBpcyBwcm92aWRlZCwgYm90aCBtdXN0IGJlIHByb3ZpZGVkIGFuZCB0aGV5IG11c3QgYmUgdGhlIHNhbWU6ICR7cShcbiAgICAgIGRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhLFxuICAgICl9IHZzICR7cShkZWNvZGVQcm9taXNlRnJvbUNhcERhdGEpfWA7XG5cbiAgLypcblxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBkZWNvZGVGcm9tQ2FwRGF0YSA9IGpzb25FbmNvZGVkID0+IHtcbiAgICBpZiAoIWlzT2JqZWN0KGpzb25FbmNvZGVkKSkge1xuICAgICAgLy9cbiAgICAgIHJldHVybiBqc29uRW5jb2RlZDtcbiAgICB9XG4gICAgaWYgKGlzQXJyYXkoanNvbkVuY29kZWQpKSB7XG4gICAgICByZXR1cm4ganNvbkVuY29kZWQubWFwKGVuY29kZWRWYWwgPT4gZGVjb2RlRnJvbUNhcERhdGEoZW5jb2RlZFZhbCkpO1xuICAgIH0gZWxzZSBpZiAoaGFzUUNsYXNzKGpzb25FbmNvZGVkKSkge1xuICAgICAgY29uc3QgcWNsYXNzID0ganNvbkVuY29kZWRbUUNMQVNTXTtcbiAgICAgIHR5cGVvZiBxY2xhc3MgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgIEZhaWxgaW52YWxpZCAke3EoUUNMQVNTKX0gdHlwZW9mICR7cSh0eXBlb2YgcWNsYXNzKX1gO1xuICAgICAgc3dpdGNoIChxY2xhc3MpIHtcbiAgICAgICAgLy9cbiAgICAgICAgY2FzZSAndW5kZWZpbmVkJzoge1xuICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnTmFOJzoge1xuICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnSW5maW5pdHknOiB7XG4gICAgICAgICAgcmV0dXJuIEluZmluaXR5O1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJy1JbmZpbml0eSc6IHtcbiAgICAgICAgICByZXR1cm4gLUluZmluaXR5O1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2JpZ2ludCc6IHtcbiAgICAgICAgICBjb25zdCB7IGRpZ2l0cyB9ID0ganNvbkVuY29kZWQ7XG4gICAgICAgICAgdHlwZW9mIGRpZ2l0cyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIEZhaWxgaW52YWxpZCBkaWdpdHMgdHlwZW9mICR7cSh0eXBlb2YgZGlnaXRzKX1gO1xuICAgICAgICAgIHJldHVybiBCaWdJbnQoZGlnaXRzKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdAQGFzeW5jSXRlcmF0b3InOiB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICByZXR1cm4gU3ltYm9sLmFzeW5jSXRlcmF0b3I7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc3ltYm9sJzoge1xuICAgICAgICAgIGNvbnN0IHsgbmFtZSB9ID0ganNvbkVuY29kZWQ7XG4gICAgICAgICAgcmV0dXJuIHBhc3NhYmxlU3ltYm9sRm9yTmFtZShuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAgICAgY29uc3QgeyB0YWcsIHBheWxvYWQgfSA9IGpzb25FbmNvZGVkO1xuICAgICAgICAgIHJldHVybiBtYWtlVGFnZ2VkKHRhZywgZGVjb2RlRnJvbUNhcERhdGEocGF5bG9hZCkpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3Nsb3QnOiB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhKFxuICAgICAgICAgICAganNvbkVuY29kZWQsXG4gICAgICAgICAgICBkZWNvZGVGcm9tQ2FwRGF0YSxcbiAgICAgICAgICApO1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgcmV0dXJuIGRlY29kZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZUVycm9yRnJvbUNhcERhdGEoXG4gICAgICAgICAgICBqc29uRW5jb2RlZCxcbiAgICAgICAgICAgIGRlY29kZUZyb21DYXBEYXRhLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHBhc3NTdHlsZU9mKGRlY29kZWQpID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVjb2RlZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgRmFpbGBpbnRlcm5hbDogZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YSBvcHRpb24gbXVzdCByZXR1cm4gYW4gZXJyb3I6ICR7ZGVjb2RlZH1gO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2hpbGJlcnQnOiB7XG4gICAgICAgICAgY29uc3QgeyBvcmlnaW5hbCwgcmVzdCB9ID0ganNvbkVuY29kZWQ7XG4gICAgICAgICAgaGFzT3duUHJvcGVydHlPZihqc29uRW5jb2RlZCwgJ29yaWdpbmFsJykgfHxcbiAgICAgICAgICAgIEZhaWxgSW52YWxpZCBIaWxiZXJ0IEhvdGVsIGVuY29kaW5nICR7anNvbkVuY29kZWR9YDtcbiAgICAgICAgICAvL1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgW1FDTEFTU106IGRlY29kZUZyb21DYXBEYXRhKG9yaWdpbmFsKSB9O1xuICAgICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eU9mKGpzb25FbmNvZGVkLCAncmVzdCcpKSB7XG4gICAgICAgICAgICBjb25zdCBpc05vbkVtcHR5T2JqZWN0ID1cbiAgICAgICAgICAgICAgdHlwZW9mIHJlc3QgPT09ICdvYmplY3QnICYmXG4gICAgICAgICAgICAgIHJlc3QgIT09IG51bGwgJiZcbiAgICAgICAgICAgICAgb3duS2V5cyhyZXN0KS5sZW5ndGggPj0gMTtcbiAgICAgICAgICAgIGlmICghaXNOb25FbXB0eU9iamVjdCkge1xuICAgICAgICAgICAgICB0aHJvdyBGYWlsYFJlc3QgZW5jb2RpbmcgbXVzdCBiZSBhIG5vbi1lbXB0eSBvYmplY3Q6ICR7cmVzdH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVzdE9iaiA9IGRlY29kZUZyb21DYXBEYXRhKHJlc3QpO1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgIWhhc093blByb3BlcnR5T2YocmVzdE9iaiwgUUNMQVNTKSB8fFxuICAgICAgICAgICAgICBGYWlsYFJlc3QgbXVzdCBub3QgY29udGFpbiBpdHMgb3duIGRlZmluaXRpb24gb2YgJHtxKFFDTEFTUyl9YDtcbiAgICAgICAgICAgIGRlZmluZVByb3BlcnRpZXMocmVzdWx0LCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHJlc3RPYmopKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICAvL1xuICAgICAgICBjYXNlICdpYmlkJzoge1xuICAgICAgICAgIHRocm93IEZhaWxgVGhlIGNhcERhdGEgcHJvdG9jb2wgbm8gbG9uZ2VyIHN1cHBvcnRzICR7cShRQ0xBU1MpfSAke3EoXG4gICAgICAgICAgICBxY2xhc3MsXG4gICAgICAgICAgKX1gO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBhc3NlcnQuZmFpbChcbiAgICAgICAgICAgIFhgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLFxuICAgICAgICAgICAgVHlwZUVycm9yLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KHR5cGVvZiBqc29uRW5jb2RlZCA9PT0gJ29iamVjdCcgJiYganNvbkVuY29kZWQgIT09IG51bGwpO1xuICAgICAgY29uc3QgZGVjb2RlRW50cnkgPSAoW25hbWUsIGVuY29kZWRWYWxdKSA9PiB7XG4gICAgICAgIHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgIEZhaWxgUHJvcGVydHkgJHtxKG5hbWUpfSBvZiAke2pzb25FbmNvZGVkfSBtdXN0IGJlIGEgc3RyaW5nYDtcbiAgICAgICAgcmV0dXJuIFtuYW1lLCBkZWNvZGVGcm9tQ2FwRGF0YShlbmNvZGVkVmFsKV07XG4gICAgICB9O1xuICAgICAgY29uc3QgZGVjb2RlZEVudHJpZXMgPSBlbnRyaWVzKGpzb25FbmNvZGVkKS5tYXAoZGVjb2RlRW50cnkpO1xuICAgICAgcmV0dXJuIGZyb21FbnRyaWVzKGRlY29kZWRFbnRyaWVzKTtcbiAgICB9XG4gIH07XG4gIHJldHVybiBoYXJkZW4oZGVjb2RlRnJvbUNhcERhdGEpO1xufTskaM2PX29uY2UubWFrZURlY29kZUZyb21DYXBEYXRhKG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJRQ0xBU1MiOlsiUUNMQVNTIl0sIm1ha2VFbmNvZGVUb0NhcERhdGEiOlsibWFrZUVuY29kZVRvQ2FwRGF0YSJdLCJtYWtlRGVjb2RlRnJvbUNhcERhdGEiOlsibWFrZURlY29kZUZyb21DYXBEYXRhIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPYYG09BLAAAQSwAAC0AAABAZW5kby9tYXJzaGFsLXYxLjYuNC9zcmMvZW5jb2RlVG9TbWFsbGNhcHMuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzIiwibWFrZUVuY29kZVRvU21hbGxjYXBzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcGFzc1N0eWxlT2YsaXNFcnJvckxpa2UsbWFrZVRhZ2dlZCxnZXRUYWcsaGFzT3duUHJvcGVydHlPZixhc3NlcnRQYXNzYWJsZVN5bWJvbCxuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc2FibGVTeW1ib2xGb3JOYW1lLFgsRmFpbCxxOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJpc0Vycm9yTGlrZVwiLFskaM2PX2EgPT4gKGlzRXJyb3JMaWtlID0gJGjNj19hKV1dLFtcIm1ha2VUYWdnZWRcIixbJGjNj19hID0+IChtYWtlVGFnZ2VkID0gJGjNj19hKV1dLFtcImdldFRhZ1wiLFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsWyRozY9fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRozY9fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVN5bWJvbFwiLFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlU3ltYm9sID0gJGjNj19hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLFskaM2PX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIixbJGjNj19hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgaXNBcnJheSB9ID0gQXJyYXk7XG5jb25zdCB7IGlzLCBlbnRyaWVzLCBmcm9tRW50cmllcyB9ID0gT2JqZWN0O1xuXG5jb25zdCBCQU5HID0gJyEnLmNoYXJDb2RlQXQoMCk7XG5jb25zdCBEQVNIID0gJy0nLmNoYXJDb2RlQXQoMCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHN0YXJ0c1NwZWNpYWwgPSBlbmNvZGVkU3RyID0+IHtcbiAgaWYgKGVuY29kZWRTdHIgPT09ICcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vXG4gIGNvbnN0IGNvZGUgPSBlbmNvZGVkU3RyLmNoYXJDb2RlQXQoMCk7XG4gIC8vXG4gIHJldHVybiBCQU5HIDw9IGNvZGUgJiYgY29kZSA8PSBEQVNIO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbmNvbnN0IGRvbnRFbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyA9IHJlbSA9PlxuICBGYWlsYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gO1xuXG5jb25zdCBkb250RW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzID0gcHJvbSA9PiBGYWlsYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVFcnJvclRvU21hbGxjYXBzID0gZXJyID0+XG4gIEZhaWxgZXJyb3Igb2JqZWN0IHVuZXhwZWN0ZWQ6ICR7cShlcnIpfWA7XG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZUVuY29kZVRvU21hbGxjYXBzID0gKGVuY29kZU9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMgPSBkb250RW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMsXG4gICAgZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzID0gZG9udEVuY29kZVByb21pc2VUb1NtYWxsY2FwcyxcbiAgICBlbmNvZGVFcnJvclRvU21hbGxjYXBzID0gZG9udEVuY29kZUVycm9yVG9TbWFsbGNhcHMsXG4gIH0gPSBlbmNvZGVPcHRpb25zO1xuXG4gIGNvbnN0IGFzc2VydEVuY29kZWRFcnJvciA9IGVuY29kaW5nID0+IHtcbiAgICAodHlwZW9mIGVuY29kaW5nID09PSAnb2JqZWN0JyAmJiBoYXNPd25Qcm9wZXJ0eU9mKGVuY29kaW5nLCAnI2Vycm9yJykpIHx8XG4gICAgICBGYWlsYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IGhhdmUgXCIjZXJyb3JcIiBwcm9wZXJ0eTogJHtxKFxuICAgICAgICBlbmNvZGluZyxcbiAgICAgICl9YDtcbiAgICAvL1xuICAgIGNvbnN0IG1lc3NhZ2UgPSBlbmNvZGluZ1snI2Vycm9yJ107XG4gICAgKHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJyAmJlxuICAgICAgKCFzdGFydHNTcGVjaWFsKG1lc3NhZ2UpIHx8IG1lc3NhZ2UuY2hhckF0KDApID09PSAnIScpKSB8fFxuICAgICAgRmFpbGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBoYXZlIHN0cmluZyBtZXNzYWdlOiAke3EobWVzc2FnZSl9YDtcbiAgfTtcblxuICAvKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyID0gcGFzc2FibGUgPT4ge1xuICAgIC8vXG4gICAgLy9cbiAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihwYXNzYWJsZSk7XG4gICAgc3dpdGNoIChwYXNzU3R5bGUpIHtcbiAgICAgIGNhc2UgJ251bGwnOlxuICAgICAgY2FzZSAnYm9vbGVhbic6IHtcbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIHBhc3NhYmxlO1xuICAgICAgfVxuICAgICAgY2FzZSAnc3RyaW5nJzoge1xuICAgICAgICBpZiAoc3RhcnRzU3BlY2lhbChwYXNzYWJsZSkpIHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgcmV0dXJuIGAhJHtwYXNzYWJsZX1gO1xuICAgICAgICB9XG4gICAgICAgIC8vXG4gICAgICAgIHJldHVybiBwYXNzYWJsZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6IHtcbiAgICAgICAgcmV0dXJuICcjdW5kZWZpbmVkJztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ251bWJlcic6IHtcbiAgICAgICAgLy9cbiAgICAgICAgaWYgKE51bWJlci5pc05hTihwYXNzYWJsZSkpIHtcbiAgICAgICAgICByZXR1cm4gJyNOYU4nO1xuICAgICAgICB9IGVsc2UgaWYgKHBhc3NhYmxlID09PSBJbmZpbml0eSkge1xuICAgICAgICAgIHJldHVybiAnI0luZmluaXR5JztcbiAgICAgICAgfSBlbHNlIGlmIChwYXNzYWJsZSA9PT0gLUluZmluaXR5KSB7XG4gICAgICAgICAgcmV0dXJuICcjLUluZmluaXR5JztcbiAgICAgICAgfVxuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gaXMocGFzc2FibGUsIC0wKSA/IDAgOiBwYXNzYWJsZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2JpZ2ludCc6IHtcbiAgICAgICAgY29uc3Qgc3RyID0gU3RyaW5nKHBhc3NhYmxlKTtcbiAgICAgICAgcmV0dXJuIC8qICAgICAgICAgICAgICAgICAqLyAocGFzc2FibGUpIDwgMG4gPyBzdHIgOiBgKyR7c3RyfWA7XG4gICAgICB9XG4gICAgICBjYXNlICdzeW1ib2wnOiB7XG4gICAgICAgIGFzc2VydFBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKTtcbiAgICAgICAgY29uc3QgbmFtZSA9IC8qICAgICAgICAgICAgICAgICAqLyAobmFtZUZvclBhc3NhYmxlU3ltYm9sKHBhc3NhYmxlKSk7XG4gICAgICAgIHJldHVybiBgJSR7bmFtZX1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgbmFtZXMgPSBvd25LZXlzKHBhc3NhYmxlKS5zb3J0KCk7XG4gICAgICAgIHJldHVybiBmcm9tRW50cmllcyhcbiAgICAgICAgICBuYW1lcy5tYXAobmFtZSA9PiBbXG4gICAgICAgICAgICBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKG5hbWUpLFxuICAgICAgICAgICAgZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZVtuYW1lXSksXG4gICAgICAgICAgXSksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICAgIHJldHVybiBwYXNzYWJsZS5tYXAoZW5jb2RlVG9TbWFsbGNhcHNSZWN1cik7XG4gICAgICB9XG4gICAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgJyN0YWcnOiBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKGdldFRhZyhwYXNzYWJsZSkpLFxuICAgICAgICAgIHBheWxvYWQ6IGVuY29kZVRvU21hbGxjYXBzUmVjdXIocGFzc2FibGUucGF5bG9hZCksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjYXNlICdyZW1vdGFibGUnOiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzKFxuICAgICAgICAgIHBhc3NhYmxlLFxuICAgICAgICAgIGVuY29kZVRvU21hbGxjYXBzUmVjdXIsXG4gICAgICAgICk7XG4gICAgICAgIGlmICh0eXBlb2YgcmVzdWx0ID09PSAnc3RyaW5nJyAmJiByZXN1bHQuY2hhckF0KDApID09PSAnJCcpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIC8vXG4gICAgICAgIHRocm93IEZhaWxgaW50ZXJuYWw6IFJlbW90YWJsZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCIkXCI6ICR7cmVzdWx0fWA7XG4gICAgICB9XG4gICAgICBjYXNlICdwcm9taXNlJzoge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBlbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMoXG4gICAgICAgICAgcGFzc2FibGUsXG4gICAgICAgICAgZW5jb2RlVG9TbWFsbGNhcHNSZWN1cixcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnICYmIHJlc3VsdC5jaGFyQXQoMCkgPT09ICcmJykge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgRmFpbGBpbnRlcm5hbDogUHJvbWlzZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCImXCI6ICR7cmVzdWx0fWA7XG4gICAgICB9XG4gICAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZW5jb2RlRXJyb3JUb1NtYWxsY2FwcyhwYXNzYWJsZSwgZW5jb2RlVG9TbWFsbGNhcHNSZWN1cik7XG4gICAgICAgIGFzc2VydEVuY29kZWRFcnJvcihyZXN1bHQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBhc3NlcnQuZmFpbChcbiAgICAgICAgICBYYGludGVybmFsOiBVbnJlY29nbml6ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfWAsXG4gICAgICAgICAgVHlwZUVycm9yLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgY29uc3QgZW5jb2RlVG9TbWFsbGNhcHMgPSBwYXNzYWJsZSA9PiB7XG4gICAgaWYgKGlzRXJyb3JMaWtlKHBhc3NhYmxlKSkge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGhhcmRlbihcbiAgICAgICAgZW5jb2RlRXJyb3JUb1NtYWxsY2FwcyhwYXNzYWJsZSwgZW5jb2RlVG9TbWFsbGNhcHNSZWN1ciksXG4gICAgICApO1xuICAgICAgYXNzZXJ0RW5jb2RlZEVycm9yKHJlc3VsdCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gaGFyZGVuKGVuY29kZVRvU21hbGxjYXBzUmVjdXIocGFzc2FibGUpKTtcbiAgfTtcbiAgcmV0dXJuIGhhcmRlbihlbmNvZGVUb1NtYWxsY2Fwcyk7XG59OyRozY9fb25jZS5tYWtlRW5jb2RlVG9TbWFsbGNhcHMobWFrZUVuY29kZVRvU21hbGxjYXBzKTtcbmhhcmRlbihtYWtlRW5jb2RlVG9TbWFsbGNhcHMpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuY29uc3QgZG9udERlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMgPSBlbmNvZGluZyA9PlxuICBGYWlsYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMgPSBlbmNvZGluZyA9PlxuICBGYWlsYHByb21pc2UgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gO1xuY29uc3QgZG9udERlY29kZUVycm9yRnJvbVNtYWxsY2FwcyA9IGVuY29kaW5nID0+XG4gIEZhaWxgZXJyb3IgdW5leHBlY3RlZDogJHtxKGVuY29kaW5nKX1gO1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzID0gKGRlY29kZU9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyA9IGRvbnREZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzLFxuICAgIGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzID0gZG9udERlY29kZVByb21pc2VGcm9tU21hbGxjYXBzLFxuICAgIGRlY29kZUVycm9yRnJvbVNtYWxsY2FwcyA9IGRvbnREZWNvZGVFcnJvckZyb21TbWFsbGNhcHMsXG4gIH0gPSBkZWNvZGVPcHRpb25zO1xuXG4gIC8qXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgZGVjb2RlRnJvbVNtYWxsY2FwcyA9IGVuY29kaW5nID0+IHtcbiAgICBzd2l0Y2ggKHR5cGVvZiBlbmNvZGluZykge1xuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICBjYXNlICdudW1iZXInOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGluZztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N0cmluZyc6IHtcbiAgICAgICAgaWYgKCFzdGFydHNTcGVjaWFsKGVuY29kaW5nKSkge1xuICAgICAgICAgIHJldHVybiBlbmNvZGluZztcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBjID0gZW5jb2RpbmcuY2hhckF0KDApO1xuICAgICAgICBzd2l0Y2ggKGMpIHtcbiAgICAgICAgICBjYXNlICchJzoge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIHJldHVybiBlbmNvZGluZy5zbGljZSgxKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnJSc6IHtcbiAgICAgICAgICAgIHJldHVybiBwYXNzYWJsZVN5bWJvbEZvck5hbWUoZW5jb2Rpbmcuc2xpY2UoMSkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICcjJzoge1xuICAgICAgICAgICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgICAgICAgICBjYXNlICcjdW5kZWZpbmVkJzoge1xuICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FzZSAnI05hTic6IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGNhc2UgJyNJbmZpbml0eSc6IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSW5maW5pdHk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FzZSAnIy1JbmZpbml0eSc6IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gLUluZmluaXR5O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICB0aHJvdyBhc3NlcnQuZmFpbChcbiAgICAgICAgICAgICAgICAgIFhgdW5rbm93biBjb25zdGFudCBcIiR7cShlbmNvZGluZyl9XCJgLFxuICAgICAgICAgICAgICAgICAgVHlwZUVycm9yLFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnKyc6XG4gICAgICAgICAgY2FzZSAnLSc6IHtcbiAgICAgICAgICAgIHJldHVybiBCaWdJbnQoZW5jb2RpbmcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICckJzoge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyhcbiAgICAgICAgICAgICAgZW5jb2RpbmcsXG4gICAgICAgICAgICAgIGRlY29kZUZyb21TbWFsbGNhcHMsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIGlmIChwYXNzU3R5bGVPZihyZXN1bHQpICE9PSAncmVtb3RhYmxlJykge1xuICAgICAgICAgICAgICBGYWlsYGludGVybmFsOiBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhIHJlbW90YWJsZTogJHtyZXN1bHR9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJyYnOiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyhcbiAgICAgICAgICAgICAgZW5jb2RpbmcsXG4gICAgICAgICAgICAgIGRlY29kZUZyb21TbWFsbGNhcHMsXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKHBhc3NTdHlsZU9mKHJlc3VsdCkgIT09ICdwcm9taXNlJykge1xuICAgICAgICAgICAgICBGYWlsYGludGVybmFsOiBkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyBvcHRpb24gbXVzdCByZXR1cm4gYSBwcm9taXNlOiAke3Jlc3VsdH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgdGhyb3cgRmFpbGBTcGVjaWFsIGNoYXIgJHtxKFxuICAgICAgICAgICAgICBjLFxuICAgICAgICAgICAgKX0gcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2U6ICR7ZW5jb2Rpbmd9YDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNhc2UgJ29iamVjdCc6IHtcbiAgICAgICAgaWYgKGVuY29kaW5nID09PSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIGVuY29kaW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzQXJyYXkoZW5jb2RpbmcpKSB7XG4gICAgICAgICAgcmV0dXJuIGVuY29kaW5nLm1hcCh2YWwgPT4gZGVjb2RlRnJvbVNtYWxsY2Fwcyh2YWwpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eU9mKGVuY29kaW5nLCAnI3RhZycpKSB7XG4gICAgICAgICAgY29uc3QgeyAnI3RhZyc6IHRhZywgcGF5bG9hZCwgLi4ucmVzdCB9ID0gZW5jb2Rpbmc7XG4gICAgICAgICAgdHlwZW9mIHRhZyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIEZhaWxgVmFsdWUgb2YgXCIjdGFnXCIsIHRoZSB0YWcsIG11c3QgYmUgYSBzdHJpbmc6ICR7ZW5jb2Rpbmd9YDtcbiAgICAgICAgICBvd25LZXlzKHJlc3QpLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICAgICAgRmFpbGAjdGFnIHJlY29yZCB1bmV4cGVjdGVkIHByb3BlcnRpZXM6ICR7cShvd25LZXlzKHJlc3QpKX1gO1xuICAgICAgICAgIHJldHVybiBtYWtlVGFnZ2VkKFxuICAgICAgICAgICAgZGVjb2RlRnJvbVNtYWxsY2Fwcyh0YWcpLFxuICAgICAgICAgICAgZGVjb2RlRnJvbVNtYWxsY2FwcyhwYXlsb2FkKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5T2YoZW5jb2RpbmcsICcjZXJyb3InKSkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlY29kZUVycm9yRnJvbVNtYWxsY2FwcyhcbiAgICAgICAgICAgIGVuY29kaW5nLFxuICAgICAgICAgICAgZGVjb2RlRnJvbVNtYWxsY2FwcyxcbiAgICAgICAgICApO1xuICAgICAgICAgIHBhc3NTdHlsZU9mKHJlc3VsdCkgPT09ICdlcnJvcicgfHxcbiAgICAgICAgICAgIEZhaWxgaW50ZXJuYWw6IGRlY29kZUVycm9yRnJvbVNtYWxsY2FwcyBvcHRpb24gbXVzdCByZXR1cm4gYW4gZXJyb3I6ICR7cmVzdWx0fWA7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlY29kZUVudHJ5ID0gKFtlbmNvZGVkTmFtZSwgZW5jb2RlZFZhbF0pID0+IHtcbiAgICAgICAgICB0eXBlb2YgZW5jb2RlZE5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICBGYWlsYFByb3BlcnR5IG5hbWUgJHtxKFxuICAgICAgICAgICAgICBlbmNvZGVkTmFtZSxcbiAgICAgICAgICAgICl9IG9mICR7ZW5jb2Rpbmd9IG11c3QgYmUgYSBzdHJpbmdgO1xuICAgICAgICAgIGVuY29kZWROYW1lLmNoYXJBdCgwKSAhPT0gJyMnIHx8XG4gICAgICAgICAgICBGYWlsYFVucmVjb2duaXplZCByZWNvcmQgdHlwZSAke3EoZW5jb2RlZE5hbWUpfTogJHtlbmNvZGluZ31gO1xuICAgICAgICAgIGNvbnN0IG5hbWUgPSBkZWNvZGVGcm9tU21hbGxjYXBzKGVuY29kZWROYW1lKTtcbiAgICAgICAgICB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIEZhaWxgRGVjb2RlZCBwcm9wZXJ0eSBuYW1lICR7bmFtZX0gZnJvbSAke2VuY29kaW5nfSBtdXN0IGJlIGEgc3RyaW5nYDtcbiAgICAgICAgICByZXR1cm4gW25hbWUsIGRlY29kZUZyb21TbWFsbGNhcHMoZW5jb2RlZFZhbCldO1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBkZWNvZGVkRW50cmllcyA9IGVudHJpZXMoZW5jb2RpbmcpLm1hcChkZWNvZGVFbnRyeSk7XG4gICAgICAgIHJldHVybiBmcm9tRW50cmllcyhkZWNvZGVkRW50cmllcyk7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IGFzc2VydC5mYWlsKFxuICAgICAgICAgIFhgaW50ZXJuYWw6IHVucmVjb2duaXplZCBKU09OIHR5cGVvZiAke3EoXG4gICAgICAgICAgICB0eXBlb2YgZW5jb2RpbmcsXG4gICAgICAgICAgKX06ICR7ZW5jb2Rpbmd9YCxcbiAgICAgICAgICBUeXBlRXJyb3IsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByZXR1cm4gaGFyZGVuKGRlY29kZUZyb21TbWFsbGNhcHMpO1xufTskaM2PX29uY2UubWFrZURlY29kZUZyb21TbWFsbGNhcHMobWFrZURlY29kZUZyb21TbWFsbGNhcHMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUVuY29kZVRvU21hbGxjYXBzIjpbIm1ha2VFbmNvZGVUb1NtYWxsY2FwcyJdLCJtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyI6WyJtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADmi1OwaC8AAGgvAAAqAAAAQGVuZG8vbWFyc2hhbC12MS42LjQvc3JjL21hcnNoYWwtanVzdGluLmpzeyJpbXBvcnRzIjpbIkBlbmRvL25hdCIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9lcnJvcnMiLCIuL2VuY29kZVRvQ2FwRGF0YS5qcyJdLCJleHBvcnRzIjpbImRlY29kZVRvSnVzdGluIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgTmF0LGdldEVycm9yQ29uc3RydWN0b3IsaXNPYmplY3QscGFzc2FibGVTeW1ib2xGb3JOYW1lLHEsWCxGYWlsLFFDTEFTUzskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsWyRozY9fYSA9PiAoTmF0ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiZ2V0RXJyb3JDb25zdHJ1Y3RvclwiLFskaM2PX2EgPT4gKGdldEVycm9yQ29uc3RydWN0b3IgPSAkaM2PX2EpXV0sW1wiaXNPYmplY3RcIixbJGjNj19hID0+IChpc09iamVjdCA9ICRozY9fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIixbJGjNj19hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9lbmNvZGVUb0NhcERhdGEuanNcIiwgW1tcIlFDTEFTU1wiLFskaM2PX2EgPT4gKFFDTEFTUyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBpc0FycmF5IH0gPSBBcnJheTtcbmNvbnN0IHsgc3RyaW5naWZ5OiBxdW90ZSB9ID0gSlNPTjtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBtYWtlWWVzSW5kZW50ZXIgPSAoKSA9PiB7XG4gIGNvbnN0IHN0cmluZ3MgPSBbXTtcbiAgbGV0IGxldmVsID0gMDtcbiAgbGV0IG5lZWRTcGFjZSA9IGZhbHNlO1xuICBjb25zdCBsaW5lID0gKCkgPT4ge1xuICAgIG5lZWRTcGFjZSA9IGZhbHNlO1xuICAgIHJldHVybiBzdHJpbmdzLnB1c2goJ1xcbicsICcgICcucmVwZWF0KGxldmVsKSk7XG4gIH07XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIG9wZW46IG9wZW5CcmFja2V0ID0+IHtcbiAgICAgIGxldmVsICs9IDE7XG4gICAgICBpZiAobmVlZFNwYWNlKSB7XG4gICAgICAgIHN0cmluZ3MucHVzaCgnICcpO1xuICAgICAgfVxuICAgICAgbmVlZFNwYWNlID0gZmFsc2U7XG4gICAgICByZXR1cm4gc3RyaW5ncy5wdXNoKG9wZW5CcmFja2V0KTtcbiAgICB9LFxuICAgIGxpbmUsXG4gICAgbmV4dDogdG9rZW4gPT4ge1xuICAgICAgaWYgKG5lZWRTcGFjZSAmJiB0b2tlbiAhPT0gJywnKSB7XG4gICAgICAgIHN0cmluZ3MucHVzaCgnICcpO1xuICAgICAgfVxuICAgICAgbmVlZFNwYWNlID0gdHJ1ZTtcbiAgICAgIHJldHVybiBzdHJpbmdzLnB1c2godG9rZW4pO1xuICAgIH0sXG4gICAgY2xvc2U6IGNsb3NlQnJhY2tldCA9PiB7XG4gICAgICBhc3NlcnQobGV2ZWwgPj0gMSk7XG4gICAgICBsZXZlbCAtPSAxO1xuICAgICAgbGluZSgpO1xuICAgICAgcmV0dXJuIHN0cmluZ3MucHVzaChjbG9zZUJyYWNrZXQpO1xuICAgIH0sXG4gICAgZG9uZTogKCkgPT4ge1xuICAgICAgYXNzZXJ0LmVxdWFsKGxldmVsLCAwKTtcbiAgICAgIHJldHVybiBzdHJpbmdzLmpvaW4oJycpO1xuICAgIH0sXG4gIH0pO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGJhZFBhaXJQYXR0ZXJuID0gL14oPzpcXHdcXHd8PDx8Pj58XFwrXFwrfC0tfDwhfC0+KSQvO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBtYWtlTm9JbmRlbnRlciA9ICgpID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3Qgc3RyaW5ncyA9IFtdO1xuICByZXR1cm4gaGFyZGVuKHtcbiAgICBvcGVuOiBvcGVuQnJhY2tldCA9PiBzdHJpbmdzLnB1c2gob3BlbkJyYWNrZXQpLFxuICAgIGxpbmU6ICgpID0+IHN0cmluZ3MubGVuZ3RoLFxuICAgIG5leHQ6IHRva2VuID0+IHtcbiAgICAgIGlmIChzdHJpbmdzLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgIGNvbnN0IGxhc3QgPSBzdHJpbmdzW3N0cmluZ3MubGVuZ3RoIC0gMV07XG4gICAgICAgIC8vXG4gICAgICAgIGlmIChsYXN0Lmxlbmd0aCA+PSAxICYmIHRva2VuLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgY29uc3QgcGFpciA9IGAke2xhc3RbbGFzdC5sZW5ndGggLSAxXX0ke3Rva2VuWzBdfWA7XG4gICAgICAgICAgaWYgKGJhZFBhaXJQYXR0ZXJuLnRlc3QocGFpcikpIHtcbiAgICAgICAgICAgIHN0cmluZ3MucHVzaCgnICcpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHN0cmluZ3MucHVzaCh0b2tlbik7XG4gICAgfSxcbiAgICBjbG9zZTogY2xvc2VCcmFja2V0ID0+IHtcbiAgICAgIGlmIChzdHJpbmdzLmxlbmd0aCA+PSAxICYmIHN0cmluZ3Nbc3RyaW5ncy5sZW5ndGggLSAxXSA9PT0gJywnKSB7XG4gICAgICAgIHN0cmluZ3MucG9wKCk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RyaW5ncy5wdXNoKGNsb3NlQnJhY2tldCk7XG4gICAgfSxcbiAgICBkb25lOiAoKSA9PiBzdHJpbmdzLmpvaW4oJycpLFxuICB9KTtcbn07XG5cbmNvbnN0IGlkZW50UGF0dGVybiA9IC9eW2EtekEtWl1cXHcqJC87XG5oYXJkZW4oaWRlbnRQYXR0ZXJuKTtcbmNvbnN0IEF0QXRQcmVmaXhQYXR0ZXJuID0gL15AQCguKikkLztcbmhhcmRlbihBdEF0UHJlZml4UGF0dGVybik7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgZGVjb2RlVG9KdXN0aW4gPSAoZW5jb2RpbmcsIHNob3VsZEluZGVudCA9IGZhbHNlLCBzbG90cyA9IFtdKSA9PiB7XG4gIC8qXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IHByZXBhcmUgPSByYXdUcmVlID0+IHtcbiAgICBpZiAoIWlzT2JqZWN0KHJhd1RyZWUpKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vXG4gICAgYXNzZXJ0LnR5cGVvZihyYXdUcmVlLCAnb2JqZWN0Jyk7XG4gICAgYXNzZXJ0KHJhd1RyZWUgIT09IG51bGwpO1xuICAgIGlmIChRQ0xBU1MgaW4gcmF3VHJlZSkge1xuICAgICAgY29uc3QgcWNsYXNzID0gcmF3VHJlZVtRQ0xBU1NdO1xuICAgICAgdHlwZW9mIHFjbGFzcyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgRmFpbGBpbnZhbGlkIHFjbGFzcyB0eXBlb2YgJHtxKHR5cGVvZiBxY2xhc3MpfWA7XG4gICAgICBhc3NlcnQoIWlzQXJyYXkocmF3VHJlZSkpO1xuICAgICAgc3dpdGNoIChyYXdUcmVlWydAcWNsYXNzJ10pIHtcbiAgICAgICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgICAgY2FzZSAnTmFOJzpcbiAgICAgICAgY2FzZSAnSW5maW5pdHknOlxuICAgICAgICBjYXNlICctSW5maW5pdHknOiB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2JpZ2ludCc6IHtcbiAgICAgICAgICBjb25zdCB7IGRpZ2l0cyB9ID0gcmF3VHJlZTtcbiAgICAgICAgICB0eXBlb2YgZGlnaXRzID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgRmFpbGBpbnZhbGlkIGRpZ2l0cyB0eXBlb2YgJHtxKHR5cGVvZiBkaWdpdHMpfWA7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0BAYXN5bmNJdGVyYXRvcic6IHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc3ltYm9sJzoge1xuICAgICAgICAgIGNvbnN0IHsgbmFtZSB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBhc3NlcnQudHlwZW9mKG5hbWUsICdzdHJpbmcnKTtcbiAgICAgICAgICBjb25zdCBzeW0gPSBwYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG4gICAgICAgICAgYXNzZXJ0LnR5cGVvZihzeW0sICdzeW1ib2wnKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndGFnZ2VkJzoge1xuICAgICAgICAgIGNvbnN0IHsgdGFnLCBwYXlsb2FkIH0gPSByYXdUcmVlO1xuICAgICAgICAgIGFzc2VydC50eXBlb2YodGFnLCAnc3RyaW5nJyk7XG4gICAgICAgICAgcHJlcGFyZShwYXlsb2FkKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc2xvdCc6IHtcbiAgICAgICAgICBjb25zdCB7IGluZGV4LCBpZmFjZSB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBhc3NlcnQudHlwZW9mKGluZGV4LCAnbnVtYmVyJyk7XG4gICAgICAgICAgTmF0KGluZGV4KTtcbiAgICAgICAgICBpZiAoaWZhY2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYXNzZXJ0LnR5cGVvZihpZmFjZSwgJ3N0cmluZycpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnaGlsYmVydCc6IHtcbiAgICAgICAgICBjb25zdCB7IG9yaWdpbmFsLCByZXN0IH0gPSByYXdUcmVlO1xuICAgICAgICAgICdvcmlnaW5hbCcgaW4gcmF3VHJlZSB8fFxuICAgICAgICAgICAgRmFpbGBJbnZhbGlkIEhpbGJlcnQgSG90ZWwgZW5jb2RpbmcgJHtyYXdUcmVlfWA7XG4gICAgICAgICAgcHJlcGFyZShvcmlnaW5hbCk7XG4gICAgICAgICAgaWYgKCdyZXN0JyBpbiByYXdUcmVlKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlc3QgIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgIHRocm93IEZhaWxgUmVzdCAke3Jlc3R9IGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXN0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgIHRocm93IEZhaWxgUmVzdCAke3Jlc3R9IGVuY29kaW5nIG11c3Qgbm90IGJlIG51bGxgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzQXJyYXkocmVzdCkpIHtcbiAgICAgICAgICAgICAgdGhyb3cgRmFpbGBSZXN0ICR7cmVzdH0gZW5jb2RpbmcgbXVzdCBub3QgYmUgYW4gYXJyYXlgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFFDTEFTUyBpbiByZXN0KSB7XG4gICAgICAgICAgICAgIHRocm93IEZhaWxgUmVzdCBlbmNvZGluZyAke3Jlc3R9IG11c3Qgbm90IGNvbnRhaW4gJHtxKFFDTEFTUyl9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5hbWVzID0gb3duS2V5cyhyZXN0KTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgICAgICAgICB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgICAgICBGYWlsYFByb3BlcnR5IG5hbWUgJHtuYW1lfSBvZiAke3Jhd1RyZWV9IG11c3QgYmUgYSBzdHJpbmdgO1xuICAgICAgICAgICAgICBwcmVwYXJlKHJlc3RbbmFtZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgICAgY29uc3QgeyBuYW1lLCBtZXNzYWdlIH0gPSByYXdUcmVlO1xuICAgICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRocm93IEZhaWxgaW52YWxpZCBlcnJvciBuYW1lIHR5cGVvZiAke3EodHlwZW9mIG5hbWUpfWA7XG4gICAgICAgICAgfVxuICAgICAgICAgIGdldEVycm9yQ29uc3RydWN0b3IobmFtZSkgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgRmFpbGBNdXN0IGJlIHRoZSBuYW1lIG9mIGFuIEVycm9yIGNvbnN0cnVjdG9yICR7bmFtZX1gO1xuICAgICAgICAgIHR5cGVvZiBtZXNzYWdlID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgRmFpbGBpbnZhbGlkIGVycm9yIG1lc3NhZ2UgdHlwZW9mICR7cSh0eXBlb2YgbWVzc2FnZSl9YDtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgYXNzZXJ0LmZhaWwoWGB1bnJlY29nbml6ZWQgJHtxKFFDTEFTUyl9ICR7cShxY2xhc3MpfWAsIFR5cGVFcnJvcik7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkocmF3VHJlZSkpIHtcbiAgICAgIGNvbnN0IHsgbGVuZ3RoIH0gPSByYXdUcmVlO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICBwcmVwYXJlKHJhd1RyZWVbaV0pO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBuYW1lcyA9IG93bktleXMocmF3VHJlZSk7XG4gICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRocm93IEZhaWxgUHJvcGVydHkgbmFtZSAke25hbWV9IG9mICR7cmF3VHJlZX0gbXVzdCBiZSBhIHN0cmluZ2A7XG4gICAgICAgIH1cbiAgICAgICAgcHJlcGFyZShyYXdUcmVlW25hbWVdKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgY29uc3QgbWFrZUluZGVudGVyID0gc2hvdWxkSW5kZW50ID8gbWFrZVllc0luZGVudGVyIDogbWFrZU5vSW5kZW50ZXI7XG4gIGxldCBvdXQgPSBtYWtlSW5kZW50ZXIoKTtcblxuICAvKlxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgZGVjb2RlID0gcmF3VHJlZSA9PiB7XG4gICAgLy9cbiAgICByZXR1cm4gcmVjdXIocmF3VHJlZSk7XG4gIH07XG5cbiAgY29uc3QgZGVjb2RlUHJvcGVydHkgPSAobmFtZSwgdmFsdWUpID0+IHtcbiAgICBvdXQubGluZSgpO1xuICAgIGlmIChuYW1lID09PSAnX19wcm90b19fJykge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIG91dC5uZXh0KGBbXCJfX3Byb3RvX19cIl06YCk7XG4gICAgfSBlbHNlIGlmIChpZGVudFBhdHRlcm4udGVzdChuYW1lKSkge1xuICAgICAgb3V0Lm5leHQoYCR7bmFtZX06YCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dC5uZXh0KGAke3F1b3RlKG5hbWUpfTpgKTtcbiAgICB9XG4gICAgZGVjb2RlKHZhbHVlKTtcbiAgICBvdXQubmV4dCgnLCcpO1xuICB9O1xuXG4gIC8qXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IHJlY3VyID0gcmF3VHJlZSA9PiB7XG4gICAgaWYgKCFpc09iamVjdChyYXdUcmVlKSkge1xuICAgICAgLy9cbiAgICAgIHJldHVybiBvdXQubmV4dChxdW90ZShyYXdUcmVlKSk7XG4gICAgfVxuICAgIC8vXG4gICAgYXNzZXJ0LnR5cGVvZihyYXdUcmVlLCAnb2JqZWN0Jyk7XG4gICAgYXNzZXJ0KHJhd1RyZWUgIT09IG51bGwpO1xuICAgIGlmIChRQ0xBU1MgaW4gcmF3VHJlZSkge1xuICAgICAgY29uc3QgcWNsYXNzID0gcmF3VHJlZVtRQ0xBU1NdO1xuICAgICAgYXNzZXJ0LnR5cGVvZihxY2xhc3MsICdzdHJpbmcnKTtcbiAgICAgIGFzc2VydCghaXNBcnJheShyYXdUcmVlKSk7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBzd2l0Y2ggKHJhd1RyZWVbJ0BxY2xhc3MnXSkge1xuICAgICAgICAvL1xuICAgICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICBjYXNlICdOYU4nOlxuICAgICAgICBjYXNlICdJbmZpbml0eSc6XG4gICAgICAgIGNhc2UgJy1JbmZpbml0eSc6IHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIHJldHVybiBvdXQubmV4dChxY2xhc3MpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2JpZ2ludCc6IHtcbiAgICAgICAgICBjb25zdCB7IGRpZ2l0cyB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBhc3NlcnQudHlwZW9mKGRpZ2l0cywgJ3N0cmluZycpO1xuICAgICAgICAgIHJldHVybiBvdXQubmV4dChgJHtCaWdJbnQoZGlnaXRzKX1uYCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnQEBhc3luY0l0ZXJhdG9yJzoge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgcmV0dXJuIG91dC5uZXh0KCdTeW1ib2wuYXN5bmNJdGVyYXRvcicpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgICBjb25zdCB7IG5hbWUgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgYXNzZXJ0LnR5cGVvZihuYW1lLCAnc3RyaW5nJyk7XG4gICAgICAgICAgY29uc3Qgc3ltID0gcGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuICAgICAgICAgIGFzc2VydC50eXBlb2Yoc3ltLCAnc3ltYm9sJyk7XG4gICAgICAgICAgY29uc3QgcmVnaXN0ZXJlZE5hbWUgPSBTeW1ib2wua2V5Rm9yKHN5bSk7XG4gICAgICAgICAgaWYgKHJlZ2lzdGVyZWROYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gQXRBdFByZWZpeFBhdHRlcm4uZXhlYyhuYW1lKTtcbiAgICAgICAgICAgIGFzc2VydChtYXRjaCAhPT0gbnVsbCk7XG4gICAgICAgICAgICBjb25zdCBzdWZmaXggPSBtYXRjaFsxXTtcbiAgICAgICAgICAgIGFzc2VydChTeW1ib2xbc3VmZml4XSA9PT0gc3ltKTtcbiAgICAgICAgICAgIGFzc2VydChpZGVudFBhdHRlcm4udGVzdChzdWZmaXgpKTtcbiAgICAgICAgICAgIHJldHVybiBvdXQubmV4dChgU3ltYm9sLiR7c3VmZml4fWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gb3V0Lm5leHQoYFN5bWJvbC5mb3IoJHtxdW90ZShyZWdpc3RlcmVkTmFtZSl9KWApO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgICBjb25zdCB7IHRhZywgcGF5bG9hZCB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBvdXQubmV4dChgbWFrZVRhZ2dlZCgke3F1b3RlKHRhZyl9LGApO1xuICAgICAgICAgIGRlY29kZShwYXlsb2FkKTtcbiAgICAgICAgICByZXR1cm4gb3V0Lm5leHQoJyknKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ3Nsb3QnOiB7XG4gICAgICAgICAgbGV0IHsgaWZhY2UgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgY29uc3QgaW5kZXggPSBOdW1iZXIoTmF0KHJhd1RyZWUuaW5kZXgpKTtcbiAgICAgICAgICBjb25zdCBuZXN0ZWRSZW5kZXIgPSBhcmcgPT4ge1xuICAgICAgICAgICAgY29uc3Qgb2xkT3V0ID0gb3V0O1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgb3V0ID0gbWFrZU5vSW5kZW50ZXIoKTtcbiAgICAgICAgICAgICAgZGVjb2RlKGFyZyk7XG4gICAgICAgICAgICAgIHJldHVybiBvdXQuZG9uZSgpO1xuICAgICAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICAgICAgb3V0ID0gb2xkT3V0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH07XG4gICAgICAgICAgaWYgKGluZGV4IDwgc2xvdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICBjb25zdCBzbG90ID0gbmVzdGVkUmVuZGVyKHNsb3RzW2luZGV4XSk7XG4gICAgICAgICAgICBpZiAoaWZhY2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICByZXR1cm4gb3V0Lm5leHQoYHNsb3RUb1ZhbCgke3Nsb3R9KWApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWZhY2UgPSBuZXN0ZWRSZW5kZXIoaWZhY2UpO1xuICAgICAgICAgICAgcmV0dXJuIG91dC5uZXh0KGBzbG90VG9WYWwoJHtzbG90fSwke2lmYWNlfSlgKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGlmYWNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBvdXQubmV4dChgc2xvdCgke2luZGV4fSlgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWZhY2UgPSBuZXN0ZWRSZW5kZXIoaWZhY2UpO1xuICAgICAgICAgIHJldHVybiBvdXQubmV4dChgc2xvdCgke2luZGV4fSwke2lmYWNlfSlgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ2hpbGJlcnQnOiB7XG4gICAgICAgICAgY29uc3QgeyBvcmlnaW5hbCwgcmVzdCB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBvdXQub3BlbigneycpO1xuICAgICAgICAgIGRlY29kZVByb3BlcnR5KFFDTEFTUywgb3JpZ2luYWwpO1xuICAgICAgICAgIGlmICgncmVzdCcgaW4gcmF3VHJlZSkge1xuICAgICAgICAgICAgYXNzZXJ0LnR5cGVvZihyZXN0LCAnb2JqZWN0Jyk7XG4gICAgICAgICAgICBhc3NlcnQocmVzdCAhPT0gbnVsbCk7XG4gICAgICAgICAgICBjb25zdCBuYW1lcyA9IG93bktleXMocmVzdCk7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgICAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIHRocm93IEZhaWxgUHJvcGVydHkgbmFtZSAke3EoXG4gICAgICAgICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgICAgICl9IG9mICR7cmVzdH0gbXVzdCBiZSBhIHN0cmluZ2A7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZGVjb2RlUHJvcGVydHkobmFtZSwgcmVzdFtuYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvdXQuY2xvc2UoJ30nKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgY2F1c2UgPSB1bmRlZmluZWQsXG4gICAgICAgICAgICBlcnJvcnMgPSB1bmRlZmluZWQsXG4gICAgICAgICAgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgY2F1c2UgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgRmFpbGBlcnJvciBjYXVzZSBub3QgeWV0IGltcGxlbWVudGVkIGluIG1hcnNoYWwtanVzdGluYDtcbiAgICAgICAgICBuYW1lICE9PSBgQWdncmVnYXRlRXJyb3JgIHx8XG4gICAgICAgICAgICBGYWlsYEFnZ3JlZ2F0ZUVycm9yIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gbWFyc2hhbC1qdXN0aW5gO1xuICAgICAgICAgIGVycm9ycyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICBGYWlsYGVycm9yIGVycm9ycyBub3QgeWV0IGltcGxlbWVudGVkIGluIG1hcnNoYWwtanVzdGluYDtcbiAgICAgICAgICByZXR1cm4gb3V0Lm5leHQoYCR7bmFtZX0oJHtxdW90ZShtZXNzYWdlKX0pYCk7XG4gICAgICAgIH1cblxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoXG4gICAgICAgICAgICBYYHVucmVjb2duaXplZCAke3EoUUNMQVNTKX0gJHtxKHFjbGFzcyl9YCxcbiAgICAgICAgICAgIFR5cGVFcnJvcixcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChpc0FycmF5KHJhd1RyZWUpKSB7XG4gICAgICBjb25zdCB7IGxlbmd0aCB9ID0gcmF3VHJlZTtcbiAgICAgIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG91dC5uZXh0KCdbXScpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0Lm9wZW4oJ1snKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgICAgICAgIG91dC5saW5lKCk7XG4gICAgICAgICAgZGVjb2RlKHJhd1RyZWVbaV0pO1xuICAgICAgICAgIG91dC5uZXh0KCcsJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG91dC5jbG9zZSgnXScpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGNvbnN0IG5hbWVzID0gLyogICAgICAgICAgICAgICAgICAgKi8gKG93bktleXMocmF3VHJlZSkpO1xuICAgICAgaWYgKG5hbWVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gb3V0Lm5leHQoJ3t9Jyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQub3BlbigneycpO1xuICAgICAgICBmb3IgKGNvbnN0IG5hbWUgb2YgbmFtZXMpIHtcbiAgICAgICAgICBkZWNvZGVQcm9wZXJ0eShuYW1lLCByYXdUcmVlW25hbWVdKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0LmNsb3NlKCd9Jyk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBwcmVwYXJlKGVuY29kaW5nKTtcbiAgZGVjb2RlKGVuY29kaW5nKTtcbiAgcmV0dXJuIG91dC5kb25lKCk7XG59OyRozY9fb25jZS5kZWNvZGVUb0p1c3RpbihkZWNvZGVUb0p1c3Rpbik7XG5oYXJkZW4oZGVjb2RlVG9KdXN0aW4pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVjb2RlVG9KdXN0aW4iOlsiZGVjb2RlVG9KdXN0aW4iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAviKnG0oHAABKBwAALQAAAEBlbmRvL21hcnNoYWwtdjEuNi40L3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL21hcnNoYWwuanMiXSwiZXhwb3J0cyI6WyJwYXJzZSIsInN0cmluZ2lmeSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsbWFrZU1hcnNoYWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9tYXJzaGFsLmpzXCIsIFtbXCJtYWtlTWFyc2hhbFwiLFskaM2PX2EgPT4gKG1ha2VNYXJzaGFsID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCB7IGZyZWV6ZSB9ID0gT2JqZWN0O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGRvTm90Q29udmVydFZhbFRvU2xvdCA9IHZhbCA9PlxuICBGYWlsYE1hcnNoYWwncyBzdHJpbmdpZnkgcmVqZWN0cyBwcmVzZW5jZXMgYW5kIHByb21pc2VzICR7dmFsfWA7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgZG9Ob3RDb252ZXJ0U2xvdFRvVmFsID0gKHNsb3QsIF9pZmFjZSkgPT5cbiAgRmFpbGBNYXJzaGFsJ3MgcGFyc2UgbXVzdCBub3QgZW5jb2RlIGFueSBzbG90cyAke3Nsb3R9YDtcblxuY29uc3QgYmFkQXJyYXlIYW5kbGVyID0gaGFyZGVuKHtcbiAgZ2V0OiAoX3RhcmdldCwgbmFtZSwgX3JlY2VpdmVyKSA9PiB7XG4gICAgaWYgKG5hbWUgPT09ICdsZW5ndGgnKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgLy9cbiAgICB0aHJvdyBGYWlsYE1hcnNoYWwncyBwYXJzZSBtdXN0IG5vdCBlbmNvZGUgYW55IHNsb3QgcG9zaXRpb25zICR7bmFtZX1gO1xuICB9LFxufSk7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgYXJyYXlUYXJnZXQgPSBmcmVlemUoLyogICAgICAgICAgICAgICAgKi8gKFtdKSk7XG5jb25zdCBiYWRBcnJheSA9IG5ldyBQcm94eShhcnJheVRhcmdldCwgYmFkQXJyYXlIYW5kbGVyKTtcblxuY29uc3QgeyBzZXJpYWxpemUsIHVuc2VyaWFsaXplIH0gPSBtYWtlTWFyc2hhbChcbiAgZG9Ob3RDb252ZXJ0VmFsVG9TbG90LFxuICBkb05vdENvbnZlcnRTbG90VG9WYWwsXG4gIHtcbiAgICBlcnJvclRhZ2dpbmc6ICdvZmYnLFxuICAgIC8vXG4gICAgc2VyaWFsaXplQm9keUZvcm1hdDogJ2NhcGRhdGEnLFxuICB9LFxuKTtcblxuLypcblxuXG4gKi9cbmNvbnN0IHN0cmluZ2lmeSA9IHZhbCA9PiBzZXJpYWxpemUodmFsKS5ib2R5OyRozY9fb25jZS5zdHJpbmdpZnkoc3RyaW5naWZ5KTtcbmhhcmRlbihzdHJpbmdpZnkpO1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgcGFyc2UgPSBzdHIgPT5cbiAgdW5zZXJpYWxpemUoXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgZnJlZXplKHtcbiAgICAgIGJvZHk6IHN0cixcbiAgICAgIHNsb3RzOiBiYWRBcnJheSxcbiAgICB9KSxcbiAgKTskaM2PX29uY2UucGFyc2UocGFyc2UpO1xuaGFyZGVuKHBhcnNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InN0cmluZ2lmeSI6WyJzdHJpbmdpZnkiXSwicGFyc2UiOlsicGFyc2UiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAACTogbmEvAABhLwAAIwAAAEBlbmRvL21hcnNoYWwtdjEuNi40L3NyYy9tYXJzaGFsLmpzeyJpbXBvcnRzIjpbIkBlbmRvL25hdCIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9lcnJvcnMiLCJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyIsIi4vZW5jb2RlVG9DYXBEYXRhLmpzIiwiLi9lbmNvZGVUb1NtYWxsY2Fwcy5qcyJdLCJleHBvcnRzIjpbIm1ha2VNYXJzaGFsIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgTmF0LGFzc2VydFBhc3NhYmxlLGdldEludGVyZmFjZU9mLGdldEVycm9yQ29uc3RydWN0b3IsaGFzT3duUHJvcGVydHlPZix0b1Bhc3NhYmxlRXJyb3IsWCxGYWlsLHEsbWFrZUVycm9yLGFubm90YXRlRXJyb3Isb2JqZWN0TWFwLFFDTEFTUyxtYWtlRW5jb2RlVG9DYXBEYXRhLG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSxtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyxtYWtlRW5jb2RlVG9TbWFsbGNhcHM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLFskaM2PX2EgPT4gKE5hdCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImFzc2VydFBhc3NhYmxlXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaM2PX2EpXV0sW1wiZ2V0SW50ZXJmYWNlT2ZcIixbJGjNj19hID0+IChnZXRJbnRlcmZhY2VPZiA9ICRozY9fYSldXSxbXCJnZXRFcnJvckNvbnN0cnVjdG9yXCIsWyRozY9fYSA9PiAoZ2V0RXJyb3JDb25zdHJ1Y3RvciA9ICRozY9fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsWyRozY9fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRozY9fYSldXSxbXCJ0b1Bhc3NhYmxlRXJyb3JcIixbJGjNj19hID0+ICh0b1Bhc3NhYmxlRXJyb3IgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIm1ha2VFcnJvclwiLFskaM2PX2EgPT4gKG1ha2VFcnJvciA9ICRozY9fYSldXSxbXCJhbm5vdGF0ZUVycm9yXCIsWyRozY9fYSA9PiAoYW5ub3RhdGVFcnJvciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzXCIsIFtbXCJvYmplY3RNYXBcIixbJGjNj19hID0+IChvYmplY3RNYXAgPSAkaM2PX2EpXV1dXSxbXCIuL2VuY29kZVRvQ2FwRGF0YS5qc1wiLCBbW1wiUUNMQVNTXCIsWyRozY9fYSA9PiAoUUNMQVNTID0gJGjNj19hKV1dLFtcIm1ha2VFbmNvZGVUb0NhcERhdGFcIixbJGjNj19hID0+IChtYWtlRW5jb2RlVG9DYXBEYXRhID0gJGjNj19hKV1dLFtcIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YVwiLFskaM2PX2EgPT4gKG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSA9ICRozY9fYSldXV1dLFtcIi4vZW5jb2RlVG9TbWFsbGNhcHMuanNcIiwgW1tcIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzXCIsWyRozY9fYSA9PiAobWFrZURlY29kZUZyb21TbWFsbGNhcHMgPSAkaM2PX2EpXV0sW1wibWFrZUVuY29kZVRvU21hbGxjYXBzXCIsWyRozY9fYSA9PiAobWFrZUVuY29kZVRvU21hbGxjYXBzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLypcblxuXG5cblxuICovXG5cbmNvbnN0IHsgZGVmaW5lUHJvcGVydGllcyB9ID0gT2JqZWN0O1xuY29uc3QgeyBpc0FycmF5IH0gPSBBcnJheTtcbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBkZWZhdWx0VmFsVG9TbG90Rm4gPSB4ID0+IHg7XG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGRlZmF1bHRTbG90VG9WYWxGbiA9ICh4LCBfKSA9PiB4O1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlTWFyc2hhbCA9IChcbiAgY29udmVydFZhbFRvU2xvdCA9IGRlZmF1bHRWYWxUb1Nsb3RGbixcbiAgY29udmVydFNsb3RUb1ZhbCA9IGRlZmF1bHRTbG90VG9WYWxGbixcbiAge1xuICAgIGVycm9yVGFnZ2luZyA9ICdvbicsXG4gICAgbWFyc2hhbE5hbWUgPSAnYW5vbi1tYXJzaGFsJyxcbiAgICAvL1xuICAgIC8vXG4gICAgZXJyb3JJZE51bSA9IDEwMDAwLFxuICAgIC8vXG4gICAgLy9cbiAgICBtYXJzaGFsU2F2ZUVycm9yID0gZXJyID0+XG4gICAgICBjb25zb2xlLmxvZygnVGVtcG9yYXJ5IGxvZ2dpbmcgb2Ygc2VudCBlcnJvcicsIGVyciksXG4gICAgLy9cbiAgICAvL1xuICAgIHNlcmlhbGl6ZUJvZHlGb3JtYXQgPSAnY2FwZGF0YScsXG4gIH0gPSB7fSxcbikgPT4ge1xuICBhc3NlcnQudHlwZW9mKG1hcnNoYWxOYW1lLCAnc3RyaW5nJyk7XG4gIGVycm9yVGFnZ2luZyA9PT0gJ29uJyB8fFxuICAgIGVycm9yVGFnZ2luZyA9PT0gJ29mZicgfHxcbiAgICBGYWlsYFRoZSBlcnJvclRhZ2dpbmcgb3B0aW9uIGNhbiBvbmx5IGJlIFwib25cIiBvciBcIm9mZlwiICR7ZXJyb3JUYWdnaW5nfWA7XG4gIGNvbnN0IG5leHRFcnJvcklkID0gKCkgPT4ge1xuICAgIGVycm9ySWROdW0gKz0gMTtcbiAgICByZXR1cm4gYGVycm9yOiR7bWFyc2hhbE5hbWV9IyR7ZXJyb3JJZE51bX1gO1xuICB9O1xuXG4gIC8qXG5cbiAgICovXG4gIGNvbnN0IHRvQ2FwRGF0YSA9IHJvb3QgPT4ge1xuICAgIGNvbnN0IHNsb3RzID0gW107XG4gICAgLy9cbiAgICBjb25zdCBzbG90TWFwID0gbmV3IE1hcCgpO1xuXG4gICAgLypcblxuXG4gICAgICovXG4gICAgY29uc3QgZW5jb2RlU2xvdENvbW1vbiA9IHBhc3NhYmxlID0+IHtcbiAgICAgIGxldCBpbmRleCA9IHNsb3RNYXAuZ2V0KHBhc3NhYmxlKTtcbiAgICAgIGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vXG4gICAgICAgIGFzc2VydC50eXBlb2YoaW5kZXgsICdudW1iZXInKTtcbiAgICAgICAgcmV0dXJuIGhhcmRlbih7IGluZGV4LCByZXBlYXQ6IHRydWUgfSk7XG4gICAgICB9XG5cbiAgICAgIGluZGV4ID0gc2xvdHMubGVuZ3RoO1xuICAgICAgY29uc3Qgc2xvdCA9IGNvbnZlcnRWYWxUb1Nsb3QocGFzc2FibGUpO1xuICAgICAgc2xvdHMucHVzaChzbG90KTtcbiAgICAgIHNsb3RNYXAuc2V0KHBhc3NhYmxlLCBpbmRleCk7XG4gICAgICByZXR1cm4gaGFyZGVuKHsgaW5kZXgsIHJlcGVhdDogZmFsc2UgfSk7XG4gICAgfTtcblxuICAgIC8qXG5cblxuXG5cblxuXG5cblxuICAgICAqL1xuICAgIGNvbnN0IGVuY29kZUVycm9yQ29tbW9uID0gKGVyciwgZW5jb2RlUmVjdXIpID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlbmNvZGVSZWN1cihgJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIGFzc2VydC50eXBlb2YobWVzc2FnZSwgJ3N0cmluZycpO1xuICAgICAgY29uc3QgbmFtZSA9IGVuY29kZVJlY3VyKGAke2Vyci5uYW1lfWApO1xuICAgICAgYXNzZXJ0LnR5cGVvZihuYW1lLCAnc3RyaW5nJyk7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBpZiAoZXJyb3JUYWdnaW5nID09PSAnb24nKSB7XG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IGVycm9ySWQgPSBlbmNvZGVSZWN1cihuZXh0RXJyb3JJZCgpKTtcbiAgICAgICAgYXNzZXJ0LnR5cGVvZihlcnJvcklkLCAnc3RyaW5nJyk7XG4gICAgICAgIGFubm90YXRlRXJyb3IoZXJyLCBYYFNlbnQgYXMgJHtlcnJvcklkfWApO1xuICAgICAgICBtYXJzaGFsU2F2ZUVycm9yKGVycik7XG4gICAgICAgIHJldHVybiBoYXJkZW4oeyBlcnJvcklkLCBtZXNzYWdlLCBuYW1lIH0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGhhcmRlbih7IG1lc3NhZ2UsIG5hbWUgfSk7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmIChzZXJpYWxpemVCb2R5Rm9ybWF0ID09PSAnY2FwZGF0YScpIHtcbiAgICAgIC8qXG5cblxuXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IGVuY29kZVNsb3RUb0NhcERhdGEgPSAocGFzc2FibGUsIGlmYWNlID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgaW5kZXgsIHJlcGVhdCB9ID0gZW5jb2RlU2xvdENvbW1vbihwYXNzYWJsZSk7XG5cbiAgICAgICAgaWYgKHJlcGVhdCA9PT0gdHJ1ZSB8fCBpZmFjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGhhcmRlbih7IFtRQ0xBU1NdOiAnc2xvdCcsIGluZGV4IH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBoYXJkZW4oeyBbUUNMQVNTXTogJ3Nsb3QnLCBpZmFjZSwgaW5kZXggfSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgY29uc3QgZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhID0gKHZhbCwgX2VuY29kZVJlY3VyKSA9PlxuICAgICAgICBlbmNvZGVTbG90VG9DYXBEYXRhKHZhbCwgZ2V0SW50ZXJmYWNlT2YodmFsKSk7XG5cbiAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgIGNvbnN0IGVuY29kZVByb21pc2VUb0NhcERhdGEgPSAocHJvbWlzZSwgX2VuY29kZVJlY3VyKSA9PlxuICAgICAgICBlbmNvZGVTbG90VG9DYXBEYXRhKHByb21pc2UpO1xuXG4gICAgICAvKlxuXG5cblxuXG5cblxuXG5cbiAgICAgICAqL1xuICAgICAgY29uc3QgZW5jb2RlRXJyb3JUb0NhcERhdGEgPSAoZXJyLCBlbmNvZGVSZWN1cikgPT4ge1xuICAgICAgICBjb25zdCBlcnJEYXRhID0gZW5jb2RlRXJyb3JDb21tb24oZXJyLCBlbmNvZGVSZWN1cik7XG4gICAgICAgIHJldHVybiBoYXJkZW4oeyBbUUNMQVNTXTogJ2Vycm9yJywgLi4uZXJyRGF0YSB9KTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGVuY29kZVRvQ2FwRGF0YSA9IG1ha2VFbmNvZGVUb0NhcERhdGEoe1xuICAgICAgICBlbmNvZGVSZW1vdGFibGVUb0NhcERhdGEsXG4gICAgICAgIGVuY29kZVByb21pc2VUb0NhcERhdGEsXG4gICAgICAgIGVuY29kZUVycm9yVG9DYXBEYXRhLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVUb0NhcERhdGEocm9vdCk7XG4gICAgICBjb25zdCBib2R5ID0gSlNPTi5zdHJpbmdpZnkoZW5jb2RlZCk7XG4gICAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgICAgYm9keSxcbiAgICAgICAgc2xvdHMsXG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHNlcmlhbGl6ZUJvZHlGb3JtYXQgPT09ICdzbWFsbGNhcHMnKSB7XG4gICAgICAvKlxuXG5cblxuXG4gICAgICAgKi9cbiAgICAgIGNvbnN0IGVuY29kZVNsb3RUb1NtYWxsY2FwcyA9IChwcmVmaXgsIHBhc3NhYmxlLCBpZmFjZSA9IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgICBjb25zdCB7IGluZGV4LCByZXBlYXQgfSA9IGVuY29kZVNsb3RDb21tb24ocGFzc2FibGUpO1xuXG4gICAgICAgIC8vXG4gICAgICAgIGlmIChyZXBlYXQgPT09IHRydWUgfHwgaWZhY2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBgJHtwcmVmaXh9JHtpbmRleH1gO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHtwcmVmaXh9JHtpbmRleH0uJHtpZmFjZX1gO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMgPSAocmVtb3RhYmxlLCBfZW5jb2RlUmVjdXIpID0+XG4gICAgICAgIGVuY29kZVNsb3RUb1NtYWxsY2FwcygnJCcsIHJlbW90YWJsZSwgZ2V0SW50ZXJmYWNlT2YocmVtb3RhYmxlKSk7XG5cbiAgICAgIGNvbnN0IGVuY29kZVByb21pc2VUb1NtYWxsY2FwcyA9IChwcm9taXNlLCBfZW5jb2RlUmVjdXIpID0+XG4gICAgICAgIGVuY29kZVNsb3RUb1NtYWxsY2FwcygnJicsIHByb21pc2UpO1xuXG4gICAgICBjb25zdCBlbmNvZGVFcnJvclRvU21hbGxjYXBzID0gKGVyciwgZW5jb2RlUmVjdXIpID0+IHtcbiAgICAgICAgY29uc3QgZXJyRGF0YSA9IGVuY29kZUVycm9yQ29tbW9uKGVyciwgZW5jb2RlUmVjdXIpO1xuICAgICAgICBjb25zdCB7IG1lc3NhZ2UsIC4uLnJlc3QgfSA9IGVyckRhdGE7XG4gICAgICAgIHJldHVybiBoYXJkZW4oeyAnI2Vycm9yJzogbWVzc2FnZSwgLi4ucmVzdCB9KTtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGVuY29kZVRvU21hbGxjYXBzID0gbWFrZUVuY29kZVRvU21hbGxjYXBzKHtcbiAgICAgICAgZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMsXG4gICAgICAgIGVuY29kZVByb21pc2VUb1NtYWxsY2FwcyxcbiAgICAgICAgZW5jb2RlRXJyb3JUb1NtYWxsY2FwcyxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBlbmNvZGVkID0gZW5jb2RlVG9TbWFsbGNhcHMocm9vdCk7XG4gICAgICBjb25zdCBzbWFsbGNhcHNCb2R5ID0gSlNPTi5zdHJpbmdpZnkoZW5jb2RlZCk7XG4gICAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgYm9keTogYCMke3NtYWxsY2Fwc0JvZHl9YCxcbiAgICAgICAgc2xvdHMsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy9cbiAgICAgIHRocm93IEZhaWxgVW5yZWNvZ25pemVkIHNlcmlhbGl6ZUJvZHlGb3JtYXQ6ICR7cShzZXJpYWxpemVCb2R5Rm9ybWF0KX1gO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBtYWtlRnVsbFJldml2ZSA9IHNsb3RzID0+IHtcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGNvbnN0IHZhbE1hcCA9IG5ldyBNYXAoKTtcblxuICAgIC8qXG5cblxuICAgICAqL1xuICAgIGNvbnN0IGRlY29kZVNsb3RDb21tb24gPSBzbG90RGF0YSA9PiB7XG4gICAgICBjb25zdCB7IGlmYWNlID0gdW5kZWZpbmVkLCBpbmRleCwgLi4ucmVzdCB9ID0gc2xvdERhdGE7XG4gICAgICBvd25LZXlzKHJlc3QpLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICBGYWlsYHVuZXhwZWN0ZWQgZW5jb2RlZCBzbG90IHByb3BlcnRpZXMgJHtxKG93bktleXMocmVzdCkpfWA7XG4gICAgICBjb25zdCBleHRhbnQgPSB2YWxNYXAuZ2V0KGluZGV4KTtcbiAgICAgIGlmIChleHRhbnQpIHtcbiAgICAgICAgcmV0dXJuIGV4dGFudDtcbiAgICAgIH1cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3Qgc2xvdCA9IHNsb3RzW051bWJlcihOYXQoaW5kZXgpKV07XG4gICAgICBjb25zdCB2YWwgPSBjb252ZXJ0U2xvdFRvVmFsKHNsb3QsIGlmYWNlKTtcbiAgICAgIHZhbE1hcC5zZXQoaW5kZXgsIHZhbCk7XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH07XG5cbiAgICAvKlxuXG5cblxuXG5cblxuXG5cblxuICAgICAqL1xuICAgIGNvbnN0IGRlY29kZUVycm9yQ29tbW9uID0gKGVyckRhdGEsIGRlY29kZVJlY3VyKSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGVycm9ySWQgPSB1bmRlZmluZWQsXG4gICAgICAgIG1lc3NhZ2UsXG4gICAgICAgIG5hbWUsXG4gICAgICAgIGNhdXNlID0gdW5kZWZpbmVkLFxuICAgICAgICBlcnJvcnMgPSB1bmRlZmluZWQsXG4gICAgICAgIC4uLnJlc3RcbiAgICAgIH0gPSBlcnJEYXRhO1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGNvbnN0IGROYW1lID0gZGVjb2RlUmVjdXIobmFtZSk7XG4gICAgICBjb25zdCBkTWVzc2FnZSA9IGRlY29kZVJlY3VyKG1lc3NhZ2UpO1xuICAgICAgLy9cbiAgICAgIGNvbnN0IGRFcnJvcklkID0gLyogICAgICAgICAgICAgICAgICovIChlcnJvcklkICYmIGRlY29kZVJlY3VyKGVycm9ySWQpKTtcbiAgICAgIGlmICh0eXBlb2YgZE5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IEZhaWxgaW52YWxpZCBlcnJvciBuYW1lIHR5cGVvZiAke3EodHlwZW9mIGROYW1lKX1gO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBkTWVzc2FnZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgRmFpbGBpbnZhbGlkIGVycm9yIG1lc3NhZ2UgdHlwZW9mICR7cSh0eXBlb2YgZE1lc3NhZ2UpfWA7XG4gICAgICB9XG4gICAgICBjb25zdCBlcnJDb25zdHJ1Y3RvciA9IGdldEVycm9yQ29uc3RydWN0b3IoZE5hbWUpIHx8IEVycm9yO1xuICAgICAgY29uc3QgZXJyb3JOYW1lID1cbiAgICAgICAgZEVycm9ySWQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gYFJlbW90ZSR7ZXJyQ29uc3RydWN0b3IubmFtZX1gXG4gICAgICAgICAgOiBgUmVtb3RlJHtlcnJDb25zdHJ1Y3Rvci5uYW1lfSgke2RFcnJvcklkfSlgO1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgZXJyb3JOYW1lLFxuICAgICAgICBzYW5pdGl6ZTogZmFsc2UsXG4gICAgICB9O1xuICAgICAgaWYgKGNhdXNlKSB7XG4gICAgICAgIG9wdGlvbnMuY2F1c2UgPSBkZWNvZGVSZWN1cihjYXVzZSk7XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3JzKSB7XG4gICAgICAgIG9wdGlvbnMuZXJyb3JzID0gZGVjb2RlUmVjdXIoZXJyb3JzKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJhd0Vycm9yID0gbWFrZUVycm9yKGRNZXNzYWdlLCBlcnJDb25zdHJ1Y3Rvciwgb3B0aW9ucyk7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3QgZGVzY3MgPSBvYmplY3RNYXAocmVzdCwgZGF0YSA9PiAoe1xuICAgICAgICB2YWx1ZTogZGVjb2RlUmVjdXIoZGF0YSksXG4gICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICB9KSk7XG4gICAgICBkZWZpbmVQcm9wZXJ0aWVzKHJhd0Vycm9yLCBkZXNjcyk7XG4gICAgICBoYXJkZW4ocmF3RXJyb3IpO1xuICAgICAgcmV0dXJuIHRvUGFzc2FibGVFcnJvcihyYXdFcnJvcik7XG4gICAgfTtcblxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBjb25zdCBkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSA9IChyYXdUcmVlLCBfZGVjb2RlUmVjdXIpID0+IHtcbiAgICAgIGNvbnN0IHsgW1FDTEFTU106IF8sIC4uLnNsb3REYXRhIH0gPSByYXdUcmVlO1xuICAgICAgcmV0dXJuIGRlY29kZVNsb3RDb21tb24oc2xvdERhdGEpO1xuICAgIH07XG5cbiAgICBjb25zdCBkZWNvZGVFcnJvckZyb21DYXBEYXRhID0gKHJhd1RyZWUsIGRlY29kZVJlY3VyKSA9PiB7XG4gICAgICBjb25zdCB7IFtRQ0xBU1NdOiBfLCAuLi5lcnJEYXRhIH0gPSByYXdUcmVlO1xuICAgICAgcmV0dXJuIGRlY29kZUVycm9yQ29tbW9uKGVyckRhdGEsIGRlY29kZVJlY3VyKTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmV2aXZlRnJvbUNhcERhdGEgPSBtYWtlRGVjb2RlRnJvbUNhcERhdGEoe1xuICAgICAgZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGE6IGRlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuICAgICAgZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhOiBkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbiAgICAgIGRlY29kZUVycm9yRnJvbUNhcERhdGEsXG4gICAgfSk7XG5cbiAgICBjb25zdCBtYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHMgPSBwcmVmaXggPT4ge1xuICAgICAgLypcblxuXG5cbiAgICAgICAqL1xuICAgICAgcmV0dXJuIChzdHJpbmdFbmNvZGluZywgX2RlY29kZVJlY3VyKSA9PiB7XG4gICAgICAgIGFzc2VydChzdHJpbmdFbmNvZGluZy5jaGFyQXQoMCkgPT09IHByZWZpeCk7XG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IGkgPSBzdHJpbmdFbmNvZGluZy5pbmRleE9mKCcuJyk7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gTnVtYmVyKHN0cmluZ0VuY29kaW5nLnNsaWNlKDEsIGkgPCAwID8gdW5kZWZpbmVkIDogaSkpO1xuICAgICAgICAvL1xuICAgICAgICBjb25zdCBpZmFjZSA9IGkgPCAwID8gdW5kZWZpbmVkIDogc3RyaW5nRW5jb2Rpbmcuc2xpY2UoaSArIDEpO1xuICAgICAgICByZXR1cm4gZGVjb2RlU2xvdENvbW1vbih7IGlmYWNlLCBpbmRleCB9KTtcbiAgICAgIH07XG4gICAgfTtcbiAgICBjb25zdCBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzID0gbWFrZURlY29kZVNsb3RGcm9tU21hbGxjYXBzKCckJyk7XG4gICAgY29uc3QgZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMgPSBtYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHMoJyYnKTtcblxuICAgIGNvbnN0IGRlY29kZUVycm9yRnJvbVNtYWxsY2FwcyA9IChlbmNvZGluZywgZGVjb2RlUmVjdXIpID0+IHtcbiAgICAgIGNvbnN0IHsgJyNlcnJvcic6IG1lc3NhZ2UsIC4uLnJlc3RFcnJEYXRhIH0gPSBlbmNvZGluZztcbiAgICAgICFoYXNPd25Qcm9wZXJ0eU9mKHJlc3RFcnJEYXRhLCAnbWVzc2FnZScpIHx8XG4gICAgICAgIEZhaWxgdW5leHBlY3RlZCBlbmNvZGVkIGVycm9yIHByb3BlcnR5ICR7cSgnbWVzc2FnZScpfWA7XG4gICAgICByZXR1cm4gZGVjb2RlRXJyb3JDb21tb24oeyBtZXNzYWdlLCAuLi5yZXN0RXJyRGF0YSB9LCBkZWNvZGVSZWN1cik7XG4gICAgfTtcblxuICAgIGNvbnN0IHJldml2ZUZyb21TbWFsbGNhcHMgPSBtYWtlRGVjb2RlRnJvbVNtYWxsY2Fwcyh7XG4gICAgICAvL1xuICAgICAgZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyxcbiAgICAgIC8vXG4gICAgICBkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyxcbiAgICAgIGRlY29kZUVycm9yRnJvbVNtYWxsY2FwcyxcbiAgICB9KTtcblxuICAgIHJldHVybiBoYXJkZW4oeyByZXZpdmVGcm9tQ2FwRGF0YSwgcmV2aXZlRnJvbVNtYWxsY2FwcyB9KTtcbiAgfTtcblxuICAvKlxuXG4gICAqL1xuICBjb25zdCBmcm9tQ2FwRGF0YSA9IGRhdGEgPT4ge1xuICAgIGNvbnN0IHsgYm9keSwgc2xvdHMgfSA9IGRhdGE7XG4gICAgdHlwZW9mIGJvZHkgPT09ICdzdHJpbmcnIHx8XG4gICAgICBGYWlsYHVuc2VyaWFsaXplKCkgZ2l2ZW4gbm9uLWNhcGRhdGEgKC5ib2R5IGlzICR7Ym9keX0sIG5vdCBzdHJpbmcpYDtcbiAgICBpc0FycmF5KGRhdGEuc2xvdHMpIHx8XG4gICAgICBGYWlsYHVuc2VyaWFsaXplKCkgZ2l2ZW4gbm9uLWNhcGRhdGEgKC5zbG90cyBhcmUgbm90IEFycmF5KWA7XG4gICAgY29uc3QgeyByZXZpdmVGcm9tQ2FwRGF0YSwgcmV2aXZlRnJvbVNtYWxsY2FwcyB9ID0gbWFrZUZ1bGxSZXZpdmUoc2xvdHMpO1xuICAgIGxldCByZXN1bHQ7XG4gICAgLy9cbiAgICBpZiAoYm9keS5jaGFyQXQoMCkgPT09ICcjJykge1xuICAgICAgY29uc3Qgc21hbGxjYXBzQm9keSA9IGJvZHkuc2xpY2UoMSk7XG4gICAgICBjb25zdCBlbmNvZGluZyA9IGhhcmRlbihKU09OLnBhcnNlKHNtYWxsY2Fwc0JvZHkpKTtcbiAgICAgIHJlc3VsdCA9IGhhcmRlbihyZXZpdmVGcm9tU21hbGxjYXBzKGVuY29kaW5nKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHJhd1RyZWUgPSBoYXJkZW4oSlNPTi5wYXJzZShib2R5KSk7XG4gICAgICByZXN1bHQgPSBoYXJkZW4ocmV2aXZlRnJvbUNhcERhdGEocmF3VHJlZSkpO1xuICAgIH1cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBhc3NlcnRQYXNzYWJsZShyZXN1bHQpO1xuICAgIHJldHVybiAvKiAgICAgICAgICAgICAgICAgICAgICAqLyAocmVzdWx0KTtcbiAgfTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICB0b0NhcERhdGEsXG4gICAgZnJvbUNhcERhdGEsXG5cbiAgICAvL1xuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgc2VyaWFsaXplOiB0b0NhcERhdGEsXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIHVuc2VyaWFsaXplOiBmcm9tQ2FwRGF0YSxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlTWFyc2hhbChtYWtlTWFyc2hhbCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTWFyc2hhbCI6WyJtYWtlTWFyc2hhbCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABKsNVd6y4AAOsuAAAlAAAAQGVuZG8vbWFyc2hhbC12MS42LjQvc3JjL3JhbmtPcmRlci5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vZXJyb3JzIiwiLi9lbmNvZGVQYXNzYWJsZS5qcyJdLCJleHBvcnRzIjpbIkZ1bGxSYW5rQ292ZXIiLCJhc3NlcnRSYW5rU29ydGVkIiwiY29tcGFyYXRvck1pcnJvckltYWdlIiwiY29tcGFyZUFudGlSYW5rIiwiY29tcGFyZVJhbmsiLCJjb3ZlcmVkRW50cmllcyIsImdldEluZGV4Q292ZXIiLCJnZXRQYXNzU3R5bGVDb3ZlciIsImludGVyc2VjdFJhbmtDb3ZlcnMiLCJpc1JhbmtTb3J0ZWQiLCJtYWtlQ29tcGFyYXRvcktpdCIsIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0Iiwic29ydEJ5UmFuayIsInRyaXZpYWxDb21wYXJhdG9yIiwidW5pb25SYW5rQ292ZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZ2V0VGFnLHBhc3NTdHlsZU9mLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxGYWlsLHEscGFzc1N0eWxlUHJlZml4ZXMscmVjb3JkTmFtZXMscmVjb3JkVmFsdWVzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiZ2V0VGFnXCIsWyRozY9fYSA9PiAoZ2V0VGFnID0gJGjNj19hKV1dLFtcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsWyRozY9fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIi4vZW5jb2RlUGFzc2FibGUuanNcIiwgW1tcInBhc3NTdHlsZVByZWZpeGVzXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlUHJlZml4ZXMgPSAkaM2PX2EpXV0sW1wicmVjb3JkTmFtZXNcIixbJGjNj19hID0+IChyZWNvcmROYW1lcyA9ICRozY9fYSldXSxbXCJyZWNvcmRWYWx1ZXNcIixbJGjNj19hID0+IChyZWNvcmRWYWx1ZXMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG4vKlxuXG5cbiAqL1xuXG5jb25zdCB7IGVudHJpZXMsIGZyb21FbnRyaWVzLCBzZXRQcm90b3R5cGVPZiwgaXMgfSA9IE9iamVjdDtcblxuLypcblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuICovXG5cbi8qXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3Qgc2FtZVZhbHVlWmVybyA9ICh4LCB5KSA9PiB4ID09PSB5IHx8IGlzKHgsIHkpO1xuXG4gICAgICAgY29uc3QgdHJpdmlhbENvbXBhcmF0b3IgPSAobGVmdCwgcmlnaHQpID0+XG4gIC8vXG4gIGxlZnQgPCByaWdodCA/IC0xIDogbGVmdCA9PT0gcmlnaHQgPyAwIDogMTtcblxuLypcblxuICovJGjNj19vbmNlLnRyaXZpYWxDb21wYXJhdG9yKHRyaXZpYWxDb21wYXJhdG9yKTtcblxuY29uc3QgcGFzc1N0eWxlUmFua3MgPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoXG4gIGZyb21FbnRyaWVzKFxuICAgIGVudHJpZXMocGFzc1N0eWxlUHJlZml4ZXMpXG4gICAgICAvL1xuICAgICAgLnNvcnQoKFtfbGVmdFN0eWxlLCBsZWZ0UHJlZml4ZXNdLCBbX3JpZ2h0U3R5bGUsIHJpZ2h0UHJlZml4ZXNdKSA9PiB7XG4gICAgICAgIHJldHVybiB0cml2aWFsQ29tcGFyYXRvcihsZWZ0UHJlZml4ZXMsIHJpZ2h0UHJlZml4ZXMpO1xuICAgICAgfSlcbiAgICAgIC5tYXAoKFtwYXNzU3R5bGUsIHByZWZpeGVzXSwgaW5kZXgpID0+IHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgcHJlZml4ZXMgPT09IFsuLi5wcmVmaXhlc10uc29ydCgpLmpvaW4oJycpIHx8XG4gICAgICAgICAgRmFpbGB1bnNvcnRlZCBwcmVmaXhlcyBmb3IgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfTogJHtxKHByZWZpeGVzKX1gO1xuICAgICAgICBjb25zdCBjb3ZlciA9IFtcbiAgICAgICAgICBwcmVmaXhlcy5jaGFyQXQoMCksXG4gICAgICAgICAgU3RyaW5nLmZyb21DaGFyQ29kZShwcmVmaXhlcy5jaGFyQ29kZUF0KHByZWZpeGVzLmxlbmd0aCAtIDEpICsgMSksXG4gICAgICAgIF07XG4gICAgICAgIHJldHVybiBbcGFzc1N0eWxlLCB7IGluZGV4LCBjb3ZlciB9XTtcbiAgICAgIH0pLFxuICApXG4pO1xuc2V0UHJvdG90eXBlT2YocGFzc1N0eWxlUmFua3MsIG51bGwpO1xuaGFyZGVuKHBhc3NTdHlsZVJhbmtzKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGdldFBhc3NTdHlsZUNvdmVyID0gcGFzc1N0eWxlID0+IHBhc3NTdHlsZVJhbmtzW3Bhc3NTdHlsZV0uY292ZXI7JGjNj19vbmNlLmdldFBhc3NTdHlsZUNvdmVyKGdldFBhc3NTdHlsZUNvdmVyKTtcbmhhcmRlbihnZXRQYXNzU3R5bGVDb3Zlcik7XG5cbi8qXG5cbiAqL1xuY29uc3QgbWVtb09mU29ydGVkID0gbmV3IFdlYWtNYXAoKTtcblxuLypcblxuICovXG5jb25zdCBjb21wYXJhdG9yTWlycm9ySW1hZ2VzID0gbmV3IFdlYWtNYXAoKTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZUNvbXBhcmF0b3JLaXQgPSAoY29tcGFyZVJlbW90YWJsZXMgPSAoX3gsIF95KSA9PiBOYU4pID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgY29tcGFyYXRvciA9IChsZWZ0LCByaWdodCkgPT4ge1xuICAgIGlmIChzYW1lVmFsdWVaZXJvKGxlZnQsIHJpZ2h0KSkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGNvbnN0IGxlZnRTdHlsZSA9IHBhc3NTdHlsZU9mKGxlZnQpO1xuICAgIGNvbnN0IHJpZ2h0U3R5bGUgPSBwYXNzU3R5bGVPZihyaWdodCk7XG4gICAgaWYgKGxlZnRTdHlsZSAhPT0gcmlnaHRTdHlsZSkge1xuICAgICAgcmV0dXJuIHRyaXZpYWxDb21wYXJhdG9yKFxuICAgICAgICBwYXNzU3R5bGVSYW5rc1tsZWZ0U3R5bGVdLmluZGV4LFxuICAgICAgICBwYXNzU3R5bGVSYW5rc1tyaWdodFN0eWxlXS5pbmRleCxcbiAgICAgICk7XG4gICAgfVxuICAgIC8qXG5cbiAgICAgKi9cbiAgICBzd2l0Y2ggKGxlZnRTdHlsZSkge1xuICAgICAgY2FzZSAncmVtb3RhYmxlJzoge1xuICAgICAgICByZXR1cm4gY29tcGFyZVJlbW90YWJsZXMobGVmdCwgcmlnaHQpO1xuICAgICAgfVxuICAgICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgIGNhc2UgJ251bGwnOlxuICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgY2FzZSAncHJvbWlzZSc6IHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIDA7XG4gICAgICB9XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIGNhc2UgJ2JpZ2ludCc6XG4gICAgICBjYXNlICdzdHJpbmcnOiB7XG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIGlmIChsZWZ0IDwgcmlnaHQpIHtcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgYXNzZXJ0KGxlZnQgPiByaWdodCk7XG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmF0b3IoXG4gICAgICAgICAgbmFtZUZvclBhc3NhYmxlU3ltYm9sKGxlZnQpLFxuICAgICAgICAgIG5hbWVGb3JQYXNzYWJsZVN5bWJvbChyaWdodCksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjYXNlICdudW1iZXInOiB7XG4gICAgICAgIC8vXG4gICAgICAgIGlmIChOdW1iZXIuaXNOYU4obGVmdCkpIHtcbiAgICAgICAgICBhc3NlcnQoIU51bWJlci5pc05hTihyaWdodCkpO1xuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9IGVsc2UgaWYgKE51bWJlci5pc05hTihyaWdodCkpIHtcbiAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgaWYgKGxlZnQgPCByaWdodCkge1xuICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhc3NlcnQobGVmdCA+IHJpZ2h0KTtcbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cblxuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBjb25zdCBsZWZ0TmFtZXMgPSByZWNvcmROYW1lcyhsZWZ0KTtcbiAgICAgICAgY29uc3QgcmlnaHROYW1lcyA9IHJlY29yZE5hbWVzKHJpZ2h0KTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBjb21wYXJhdG9yKGxlZnROYW1lcywgcmlnaHROYW1lcyk7XG4gICAgICAgIGlmIChyZXN1bHQgIT09IDApIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxlZnRWYWx1ZXMgPSByZWNvcmRWYWx1ZXMobGVmdCwgbGVmdE5hbWVzKTtcbiAgICAgICAgY29uc3QgcmlnaHRWYWx1ZXMgPSByZWNvcmRWYWx1ZXMocmlnaHQsIHJpZ2h0TmFtZXMpO1xuICAgICAgICByZXR1cm4gY29tcGFyYXRvcihsZWZ0VmFsdWVzLCByaWdodFZhbHVlcyk7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IGxlbiA9IE1hdGgubWluKGxlZnQubGVuZ3RoLCByaWdodC5sZW5ndGgpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSArPSAxKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gY29tcGFyYXRvcihsZWZ0W2ldLCByaWdodFtpXSk7XG4gICAgICAgICAgaWYgKHJlc3VsdCAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIGNvbXBhcmF0b3IobGVmdC5sZW5ndGgsIHJpZ2h0Lmxlbmd0aCk7XG4gICAgICB9XG4gICAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IGxhYmVsQ29tcCA9IGNvbXBhcmF0b3IoZ2V0VGFnKGxlZnQpLCBnZXRUYWcocmlnaHQpKTtcbiAgICAgICAgaWYgKGxhYmVsQ29tcCAhPT0gMCkge1xuICAgICAgICAgIHJldHVybiBsYWJlbENvbXA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBhcmF0b3IobGVmdC5wYXlsb2FkLCByaWdodC5wYXlsb2FkKTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgdGhyb3cgRmFpbGBVbnJlY29nbml6ZWQgcGFzc1N0eWxlOiAke3EobGVmdFN0eWxlKX1gO1xuICAgICAgfVxuICAgIH1cbiAgICAvKiAgICAgICAgICAgICAgICovXG4gIH07XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3Qgb3V0ZXJDb21wYXJhdG9yID0gKHgsIHkpID0+XG4gICAgLy9cbiAgICAvL1xuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKGNvbXBhcmF0b3IoeCwgeSkgfHwgMCk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgYW50aUNvbXBhcmF0b3IgPSAoeCwgeSkgPT4gb3V0ZXJDb21wYXJhdG9yKHksIHgpO1xuXG4gIG1lbW9PZlNvcnRlZC5zZXQob3V0ZXJDb21wYXJhdG9yLCBuZXcgV2Vha1NldCgpKTtcbiAgbWVtb09mU29ydGVkLnNldChhbnRpQ29tcGFyYXRvciwgbmV3IFdlYWtTZXQoKSk7XG4gIGNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuc2V0KG91dGVyQ29tcGFyYXRvciwgYW50aUNvbXBhcmF0b3IpO1xuICBjb21wYXJhdG9yTWlycm9ySW1hZ2VzLnNldChhbnRpQ29tcGFyYXRvciwgb3V0ZXJDb21wYXJhdG9yKTtcblxuICByZXR1cm4gaGFyZGVuKHsgY29tcGFyYXRvcjogb3V0ZXJDb21wYXJhdG9yLCBhbnRpQ29tcGFyYXRvciB9KTtcbn07XG4vKlxuXG5cbiAqLyRozY9fb25jZS5tYWtlQ29tcGFyYXRvcktpdChtYWtlQ29tcGFyYXRvcktpdCk7XG4gICAgICAgY29uc3QgY29tcGFyYXRvck1pcnJvckltYWdlID0gY29tcGFyYXRvciA9PlxuICBjb21wYXJhdG9yTWlycm9ySW1hZ2VzLmdldChjb21wYXJhdG9yKTtcblxuLypcblxuXG5cbiAqLyRozY9fb25jZS5jb21wYXJhdG9yTWlycm9ySW1hZ2UoY29tcGFyYXRvck1pcnJvckltYWdlKTtcbiAgICAgICBjb25zdCBpc1JhbmtTb3J0ZWQgPSAocGFzc2FibGVzLCBjb21wYXJlKSA9PiB7XG4gIGNvbnN0IHN1Yk1lbW9PZlNvcnRlZCA9IG1lbW9PZlNvcnRlZC5nZXQoY29tcGFyZSk7XG4gIGFzc2VydChzdWJNZW1vT2ZTb3J0ZWQgIT09IHVuZGVmaW5lZCk7XG4gIGlmIChzdWJNZW1vT2ZTb3J0ZWQuaGFzKHBhc3NhYmxlcykpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBhc3NlcnQocGFzc1N0eWxlT2YocGFzc2FibGVzKSA9PT0gJ2NvcHlBcnJheScpO1xuICBmb3IgKGxldCBpID0gMTsgaSA8IHBhc3NhYmxlcy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGlmIChjb21wYXJlKHBhc3NhYmxlc1tpIC0gMV0sIHBhc3NhYmxlc1tpXSkgPj0gMSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICBzdWJNZW1vT2ZTb3J0ZWQuYWRkKHBhc3NhYmxlcyk7XG4gIHJldHVybiB0cnVlO1xufTskaM2PX29uY2UuaXNSYW5rU29ydGVkKGlzUmFua1NvcnRlZCk7XG5oYXJkZW4oaXNSYW5rU29ydGVkKTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRSYW5rU29ydGVkID0gKHNvcnRlZCwgY29tcGFyZSkgPT5cbiAgaXNSYW5rU29ydGVkKHNvcnRlZCwgY29tcGFyZSkgfHxcbiAgLy9cbiAgLy9cbiAgRmFpbGBNdXN0IGJlIHJhbmsgc29ydGVkOiAke3NvcnRlZH0gdnMgJHtzb3J0QnlSYW5rKHNvcnRlZCwgY29tcGFyZSl9YDskaM2PX29uY2UuYXNzZXJ0UmFua1NvcnRlZChhc3NlcnRSYW5rU29ydGVkKTtcbmhhcmRlbihhc3NlcnRSYW5rU29ydGVkKTtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3Qgc29ydEJ5UmFuayA9IChwYXNzYWJsZXMsIGNvbXBhcmUpID0+IHtcbiAgaWYgKEFycmF5LmlzQXJyYXkocGFzc2FibGVzKSkge1xuICAgIGhhcmRlbihwYXNzYWJsZXMpO1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGlmIChpc1JhbmtTb3J0ZWQocGFzc2FibGVzLCBjb21wYXJlKSkge1xuICAgICAgcmV0dXJuIHBhc3NhYmxlcztcbiAgICB9XG4gIH1cbiAgY29uc3QgdW5zb3J0ZWQgPSBbLi4ucGFzc2FibGVzXTtcbiAgdW5zb3J0ZWQuZm9yRWFjaChoYXJkZW4pO1xuICBjb25zdCBzb3J0ZWQgPSB1bnNvcnRlZC5zb3J0KGNvbXBhcmUpO1xuICAvL1xuICAvL1xuICAvL1xuICBpZiAoY29tcGFyZSh0cnVlLCB1bmRlZmluZWQpID4gMCkge1xuICAgIGxldCBpID0gc29ydGVkLmxlbmd0aCAtIDE7XG4gICAgd2hpbGUgKGkgPj0gMCAmJiBzb3J0ZWRbaV0gPT09IHVuZGVmaW5lZCkgaSAtPSAxO1xuICAgIGNvbnN0IG4gPSBzb3J0ZWQubGVuZ3RoIC0gaSAtIDE7XG4gICAgaWYgKG4gPiAwICYmIG4gPCBzb3J0ZWQubGVuZ3RoKSB7XG4gICAgICBzb3J0ZWQuY29weVdpdGhpbihuLCAwKTtcbiAgICAgIHNvcnRlZC5maWxsKC8qICAgICAgICAgICAgKi8gKHVuZGVmaW5lZCksIDAsIG4pO1xuICAgIH1cbiAgfVxuICBoYXJkZW4oc29ydGVkKTtcbiAgY29uc3Qgc3ViTWVtb09mU29ydGVkID0gbWVtb09mU29ydGVkLmdldChjb21wYXJlKTtcbiAgYXNzZXJ0KHN1Yk1lbW9PZlNvcnRlZCAhPT0gdW5kZWZpbmVkKTtcbiAgc3ViTWVtb09mU29ydGVkLmFkZChzb3J0ZWQpO1xuICByZXR1cm4gc29ydGVkO1xufTskaM2PX29uY2Uuc29ydEJ5UmFuayhzb3J0QnlSYW5rKTtcbmhhcmRlbihzb3J0QnlSYW5rKTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHJhbmtTZWFyY2ggPSAoc29ydGVkLCBjb21wYXJlLCBrZXksIGJpYXMgPSAnbGVmdE1vc3QnKSA9PiB7XG4gIGFzc2VydFJhbmtTb3J0ZWQoc29ydGVkLCBjb21wYXJlKTtcbiAgbGV0IGxlZnQgPSAwO1xuICBsZXQgcmlnaHQgPSBzb3J0ZWQubGVuZ3RoO1xuICB3aGlsZSAobGVmdCA8IHJpZ2h0KSB7XG4gICAgY29uc3QgbSA9IE1hdGguZmxvb3IoKGxlZnQgKyByaWdodCkgLyAyKTtcbiAgICBjb25zdCBjb21wID0gY29tcGFyZShzb3J0ZWRbbV0sIGtleSk7XG4gICAgaWYgKGNvbXAgPD0gLTEgfHwgKGNvbXAgPT09IDAgJiYgYmlhcyA9PT0gJ3JpZ2h0TW9zdCcpKSB7XG4gICAgICBsZWZ0ID0gbSArIDE7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydChjb21wID49IDEgfHwgKGNvbXAgPT09IDAgJiYgYmlhcyA9PT0gJ2xlZnRNb3N0JykpO1xuICAgICAgcmlnaHQgPSBtO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYmlhcyA9PT0gJ2xlZnRNb3N0JyA/IGxlZnQgOiByaWdodCAtIDE7XG59O1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBnZXRJbmRleENvdmVyID0gKHNvcnRlZCwgY29tcGFyZSwgW2xlZnRLZXksIHJpZ2h0S2V5XSkgPT4ge1xuICBhc3NlcnRSYW5rU29ydGVkKHNvcnRlZCwgY29tcGFyZSk7XG4gIGNvbnN0IGxlZnRJbmRleCA9IHJhbmtTZWFyY2goc29ydGVkLCBjb21wYXJlLCBsZWZ0S2V5LCAnbGVmdE1vc3QnKTtcbiAgY29uc3QgcmlnaHRJbmRleCA9IHJhbmtTZWFyY2goc29ydGVkLCBjb21wYXJlLCByaWdodEtleSwgJ3JpZ2h0TW9zdCcpO1xuICByZXR1cm4gW2xlZnRJbmRleCwgcmlnaHRJbmRleF07XG59OyRozY9fb25jZS5nZXRJbmRleENvdmVyKGdldEluZGV4Q292ZXIpO1xuaGFyZGVuKGdldEluZGV4Q292ZXIpO1xuXG4vKiAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICBjb25zdCBGdWxsUmFua0NvdmVyID0gaGFyZGVuKFsnJywgJ3snXSk7XG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UuRnVsbFJhbmtDb3ZlcihGdWxsUmFua0NvdmVyKTtcbiAgICAgICBjb25zdCBjb3ZlcmVkRW50cmllcyA9IChzb3J0ZWQsIFtsZWZ0SW5kZXgsIHJpZ2h0SW5kZXhdKSA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgaXRlcmFibGUgPSBoYXJkZW4oe1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICBsZXQgaSA9IGxlZnRJbmRleDtcbiAgICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgaWYgKGkgPD0gcmlnaHRJbmRleCkge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHNvcnRlZFtpXTtcbiAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgIHJldHVybiBoYXJkZW4oeyB2YWx1ZTogW2ksIGVsZW1lbnRdLCBkb25lOiBmYWxzZSB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGhhcmRlbih7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiBpdGVyYWJsZTtcbn07JGjNj19vbmNlLmNvdmVyZWRFbnRyaWVzKGNvdmVyZWRFbnRyaWVzKTtcbmhhcmRlbihjb3ZlcmVkRW50cmllcyk7XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBtYXhSYW5rID0gKGNvbXBhcmUsIGEsIGIpID0+IChjb21wYXJlKGEsIGIpID49IDAgPyBhIDogYik7XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBtaW5SYW5rID0gKGNvbXBhcmUsIGEsIGIpID0+IChjb21wYXJlKGEsIGIpIDw9IDAgPyBhIDogYik7XG5cbi8qXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCB1bmlvblJhbmtDb3ZlcnMgPSAoY29tcGFyZSwgY292ZXJzKSA9PiB7XG4gIC8qXG5cblxuXG4gICAqL1xuICBjb25zdCB1bmlvblJhbmtDb3ZlclBhaXIgPSAoW2xlZnRBLCByaWdodEFdLCBbbGVmdEIsIHJpZ2h0Ql0pID0+IFtcbiAgICBtaW5SYW5rKGNvbXBhcmUsIGxlZnRBLCBsZWZ0QiksXG4gICAgbWF4UmFuayhjb21wYXJlLCByaWdodEEsIHJpZ2h0QiksXG4gIF07XG4gIHJldHVybiBjb3ZlcnMucmVkdWNlKHVuaW9uUmFua0NvdmVyUGFpciwgWyd7JywgJyddKTtcbn07JGjNj19vbmNlLnVuaW9uUmFua0NvdmVycyh1bmlvblJhbmtDb3ZlcnMpO1xuaGFyZGVuKHVuaW9uUmFua0NvdmVycyk7XG5cbi8qXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBpbnRlcnNlY3RSYW5rQ292ZXJzID0gKGNvbXBhcmUsIGNvdmVycykgPT4ge1xuICAvKlxuXG5cblxuICAgKi9cbiAgY29uc3QgaW50ZXJzZWN0UmFua0NvdmVyUGFpciA9IChbbGVmdEEsIHJpZ2h0QV0sIFtsZWZ0QiwgcmlnaHRCXSkgPT4gW1xuICAgIG1heFJhbmsoY29tcGFyZSwgbGVmdEEsIGxlZnRCKSxcbiAgICBtaW5SYW5rKGNvbXBhcmUsIHJpZ2h0QSwgcmlnaHRCKSxcbiAgXTtcbiAgcmV0dXJuIGNvdmVycy5yZWR1Y2UoaW50ZXJzZWN0UmFua0NvdmVyUGFpciwgWycnLCAneyddKTtcbn07JGjNj19vbmNlLmludGVyc2VjdFJhbmtDb3ZlcnMoaW50ZXJzZWN0UmFua0NvdmVycyk7XG5cbiAgICAgICBjb25zdCB7IGNvbXBhcmF0b3I6IGNvbXBhcmVSYW5rLCBhbnRpQ29tcGFyYXRvcjogY29tcGFyZUFudGlSYW5rIH0gPVxuICBtYWtlQ29tcGFyYXRvcktpdCgpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmNvbXBhcmVSYW5rKGNvbXBhcmVSYW5rKTskaM2PX29uY2UuY29tcGFyZUFudGlSYW5rKGNvbXBhcmVBbnRpUmFuayk7XG4gICAgICAgY29uc3QgbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAobG9uZ0xpdmVkID0gZmFsc2UpID0+IHtcbiAgbGV0IG51bVNlZW4gPSAwO1xuICAvL1xuICAvL1xuICAvL1xuICBjb25zdCBNYXBDb25zdHJ1Y3RvciA9IGxvbmdMaXZlZCA/IFdlYWtNYXAgOiBNYXA7XG4gIGNvbnN0IHNlZW4gPSBuZXcgTWFwQ29uc3RydWN0b3IoKTtcbiAgY29uc3QgdGFnID0gciA9PiB7XG4gICAgaWYgKHNlZW4uaGFzKHIpKSB7XG4gICAgICByZXR1cm4gc2Vlbi5nZXQocik7XG4gICAgfVxuICAgIG51bVNlZW4gKz0gMTtcbiAgICBzZWVuLnNldChyLCBudW1TZWVuKTtcbiAgICByZXR1cm4gbnVtU2VlbjtcbiAgfTtcbiAgY29uc3QgY29tcGFyZVJlbW90YWJsZXMgPSAoeCwgeSkgPT4gY29tcGFyZVJhbmsodGFnKHgpLCB0YWcoeSkpO1xuICByZXR1cm4gbWFrZUNvbXBhcmF0b3JLaXQoY29tcGFyZVJlbW90YWJsZXMpO1xufTskaM2PX29uY2UubWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQpO1xuaGFyZGVuKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InRyaXZpYWxDb21wYXJhdG9yIjpbInRyaXZpYWxDb21wYXJhdG9yIl0sImdldFBhc3NTdHlsZUNvdmVyIjpbImdldFBhc3NTdHlsZUNvdmVyIl0sIm1ha2VDb21wYXJhdG9yS2l0IjpbIm1ha2VDb21wYXJhdG9yS2l0Il0sImNvbXBhcmF0b3JNaXJyb3JJbWFnZSI6WyJjb21wYXJhdG9yTWlycm9ySW1hZ2UiXSwiaXNSYW5rU29ydGVkIjpbImlzUmFua1NvcnRlZCJdLCJhc3NlcnRSYW5rU29ydGVkIjpbImFzc2VydFJhbmtTb3J0ZWQiXSwic29ydEJ5UmFuayI6WyJzb3J0QnlSYW5rIl0sImdldEluZGV4Q292ZXIiOlsiZ2V0SW5kZXhDb3ZlciJdLCJGdWxsUmFua0NvdmVyIjpbIkZ1bGxSYW5rQ292ZXIiXSwiY292ZXJlZEVudHJpZXMiOlsiY292ZXJlZEVudHJpZXMiXSwidW5pb25SYW5rQ292ZXJzIjpbInVuaW9uUmFua0NvdmVycyJdLCJpbnRlcnNlY3RSYW5rQ292ZXJzIjpbImludGVyc2VjdFJhbmtDb3ZlcnMiXSwiY29tcGFyZVJhbmsiOlsiY29tcGFyZVJhbmsiXSwiY29tcGFyZUFudGlSYW5rIjpbImNvbXBhcmVBbnRpUmFuayJdLCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCI6WyJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAAhAAAAQGVuZG8vbWFyc2hhbC12MS42LjQvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAF6cs8rMBQAAzAUAAB0AAABAZW5kby9uYXQtdjUuMS4wL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiTmF0IiwiaXNOYXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGlzTmF0LCduYW1lJyx7dmFsdWU6XCJpc05hdFwifSk7JGjNj19vbmNlLmlzTmF0KGlzTmF0KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoTmF0LCduYW1lJyx7dmFsdWU6XCJOYXRcIn0pOyRozY9fb25jZS5OYXQoTmF0KTsvL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuLy9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuZnVuY3Rpb24gaXNOYXQoYWxsZWdlZE51bSkge1xuICBpZiAodHlwZW9mIGFsbGVnZWROdW0gPT09ICdiaWdpbnQnKSB7XG4gICAgcmV0dXJuIGFsbGVnZWROdW0gPj0gMDtcbiAgfVxuICBpZiAodHlwZW9mIGFsbGVnZWROdW0gIT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIE51bWJlci5pc1NhZmVJbnRlZ2VyKGFsbGVnZWROdW0pICYmIGFsbGVnZWROdW0gPj0gMDtcbn1cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmZ1bmN0aW9uIE5hdChhbGxlZ2VkTnVtKSB7XG4gIGlmICh0eXBlb2YgYWxsZWdlZE51bSA9PT0gJ2JpZ2ludCcpIHtcbiAgICBpZiAoYWxsZWdlZE51bSA8IDBuKSB7XG4gICAgICB0aHJvdyBSYW5nZUVycm9yKGAke2FsbGVnZWROdW19IGlzIG5lZ2F0aXZlYCk7XG4gICAgfVxuICAgIHJldHVybiBhbGxlZ2VkTnVtO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBhbGxlZ2VkTnVtID09PSAnbnVtYmVyJykge1xuICAgIGlmICghTnVtYmVyLmlzU2FmZUludGVnZXIoYWxsZWdlZE51bSkpIHtcbiAgICAgIHRocm93IFJhbmdlRXJyb3IoYCR7YWxsZWdlZE51bX0gaXMgbm90IGEgc2FmZSBpbnRlZ2VyYCk7XG4gICAgfVxuICAgIGlmIChhbGxlZ2VkTnVtIDwgMCkge1xuICAgICAgdGhyb3cgUmFuZ2VFcnJvcihgJHthbGxlZ2VkTnVtfSBpcyBuZWdhdGl2ZWApO1xuICAgIH1cbiAgICByZXR1cm4gQmlnSW50KGFsbGVnZWROdW0pO1xuICB9XG5cbiAgdGhyb3cgVHlwZUVycm9yKFxuICAgIGAke2FsbGVnZWROdW19IGlzIGEgJHt0eXBlb2YgYWxsZWdlZE51bX0gYnV0IG11c3QgYmUgYSBiaWdpbnQgb3IgYSBudW1iZXJgLFxuICApO1xufVxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNOYXQiOlsiaXNOYXQiXSwiTmF0IjpbIk5hdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAC9HZqTQoAAE0KAAAgAAAAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvaXRlci1oZWxwZXJzLmpzIiwiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL3NyYy9lcnJvci5qcyIsIi4vc3JjL3JlbW90YWJsZS5qcyIsIi4vc3JjL3N5bWJvbC5qcyIsIi4vc3JjL3N0cmluZy5qcyIsIi4vc3JjL3Bhc3NTdHlsZU9mLmpzIiwiLi9zcmMvbWFrZVRhZ2dlZC5qcyIsIi4vc3JjL21ha2UtZmFyLmpzIiwiLi9zcmMvdHlwZUd1YXJkcy5qcyIsIi4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sImV4cG9ydHMiOlsiRmFyIiwiRmFyIiwiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyIsImFzc2VydFdlbGxGb3JtZWRTdHJpbmciLCJmaWx0ZXJJdGVyYWJsZSIsImZpbHRlckl0ZXJhYmxlIiwiaXNFcnJvckxpa2UiLCJpc0Vycm9yTGlrZSIsImlzT2JqZWN0IiwiaXNPYmplY3QiLCJpc1Bhc3NhYmxlIiwiaXNQYXNzYWJsZSIsImlzUGFzc2FibGVTeW1ib2wiLCJpc1Bhc3NhYmxlU3ltYm9sIixudWxsLG51bGxdLCJyZWV4cG9ydHMiOlsiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvaXRlci1oZWxwZXJzLmpzXCIsIFtdXSxbXCIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbXV0sW1wiLi9zcmMvZXJyb3IuanNcIiwgW11dLFtcIi4vc3JjL3JlbW90YWJsZS5qc1wiLCBbXV0sW1wiLi9zcmMvc3ltYm9sLmpzXCIsIFtdXSxbXCIuL3NyYy9zdHJpbmcuanNcIiwgW11dLFtcIi4vc3JjL3Bhc3NTdHlsZU9mLmpzXCIsIFtdXSxbXCIuL3NyYy9tYWtlVGFnZ2VkLmpzXCIsIFtdXSxbXCIuL3NyYy9tYWtlLWZhci5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZUd1YXJkcy5qc1wiLCBbXV0sW1wiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2l0ZXItaGVscGVycy5qcyI6W1sibWFwSXRlcmFibGUiLCJtYXBJdGVyYWJsZSJdLFsiZmlsdGVySXRlcmFibGUiLCJmaWx0ZXJJdGVyYWJsZSJdXSwiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiOltbIlBBU1NfU1RZTEUiLCJQQVNTX1NUWUxFIl0sWyJpc09iamVjdCIsImlzT2JqZWN0Il0sWyJhc3NlcnRDaGVja2VyIiwiYXNzZXJ0Q2hlY2tlciJdLFsiZ2V0VGFnIiwiZ2V0VGFnIl0sWyJoYXNPd25Qcm9wZXJ0eU9mIiwiaGFzT3duUHJvcGVydHlPZiJdXSwiLi9zcmMvZXJyb3IuanMiOltbImdldEVycm9yQ29uc3RydWN0b3IiLCJnZXRFcnJvckNvbnN0cnVjdG9yIl0sWyJpc0Vycm9yTGlrZSIsImlzRXJyb3JMaWtlIl1dLCIuL3NyYy9yZW1vdGFibGUuanMiOltbImdldEludGVyZmFjZU9mIiwiZ2V0SW50ZXJmYWNlT2YiXV0sIi4vc3JjL3N5bWJvbC5qcyI6W1siYXNzZXJ0UGFzc2FibGVTeW1ib2wiLCJhc3NlcnRQYXNzYWJsZVN5bWJvbCJdLFsiaXNQYXNzYWJsZVN5bWJvbCIsImlzUGFzc2FibGVTeW1ib2wiXSxbIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCIsIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCJdLFsicGFzc2FibGVTeW1ib2xGb3JOYW1lIiwicGFzc2FibGVTeW1ib2xGb3JOYW1lIl1dLCIuL3NyYy9zdHJpbmcuanMiOltbImlzV2VsbEZvcm1lZFN0cmluZyIsImlzV2VsbEZvcm1lZFN0cmluZyJdLFsiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyIsImFzc2VydFdlbGxGb3JtZWRTdHJpbmciXSxbImFzc2VydFBhc3NhYmxlU3RyaW5nIiwiYXNzZXJ0UGFzc2FibGVTdHJpbmciXV0sIi4vc3JjL3Bhc3NTdHlsZU9mLmpzIjpbWyJwYXNzU3R5bGVPZiIsInBhc3NTdHlsZU9mIl0sWyJpc1Bhc3NhYmxlIiwiaXNQYXNzYWJsZSJdLFsiYXNzZXJ0UGFzc2FibGUiLCJhc3NlcnRQYXNzYWJsZSJdLFsidG9QYXNzYWJsZUVycm9yIiwidG9QYXNzYWJsZUVycm9yIl0sWyJ0b1Rocm93YWJsZSIsInRvVGhyb3dhYmxlIl1dLCIuL3NyYy9tYWtlVGFnZ2VkLmpzIjpbWyJtYWtlVGFnZ2VkIiwibWFrZVRhZ2dlZCJdXSwiLi9zcmMvbWFrZS1mYXIuanMiOltbIlJlbW90YWJsZSIsIlJlbW90YWJsZSJdLFsiRmFyIiwiRmFyIl0sWyJUb0ZhckZ1bmN0aW9uIiwiVG9GYXJGdW5jdGlvbiJdLFsiR0VUX01FVEhPRF9OQU1FUyIsIkdFVF9NRVRIT0RfTkFNRVMiXV0sIi4vc3JjL3R5cGVHdWFyZHMuanMiOltbImFzc2VydFJlY29yZCIsImFzc2VydFJlY29yZCJdLFsiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0Q29weUFycmF5Il0sWyJhc3NlcnRSZW1vdGFibGUiLCJhc3NlcnRSZW1vdGFibGUiXSxbImlzUmVtb3RhYmxlIiwiaXNSZW1vdGFibGUiXSxbImlzUmVjb3JkIiwiaXNSZWNvcmQiXSxbImlzQ29weUFycmF5IiwiaXNDb3B5QXJyYXkiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMPv9kW8BgAAvAYAACgAAABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvY29weUFycmF5LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJDb3B5QXJyYXlIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBYLGFzc2VydENoZWNrZXIsZ2V0T3duRGF0YURlc2NyaXB0b3I7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiZ2V0T3duRGF0YURlc2NyaXB0b3JcIixbJGjNj19hID0+IChnZXRPd25EYXRhRGVzY3JpcHRvciA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbmNvbnN0IHsgZ2V0UHJvdG90eXBlT2YgfSA9IE9iamVjdDtcbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgaXNBcnJheSwgcHJvdG90eXBlOiBhcnJheVByb3RvdHlwZSB9ID0gQXJyYXk7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgQ29weUFycmF5SGVscGVyID0gaGFyZGVuKHtcbiAgc3R5bGVOYW1lOiAnY29weUFycmF5JyxcblxuICBjYW5CZVZhbGlkOiAoY2FuZGlkYXRlLCBjaGVjayA9IHVuZGVmaW5lZCkgPT5cbiAgICBpc0FycmF5KGNhbmRpZGF0ZSkgfHxcbiAgICAoISFjaGVjayAmJiBjaGVjayhmYWxzZSwgWGBBcnJheSBleHBlY3RlZDogJHtjYW5kaWRhdGV9YCkpLFxuXG4gIGFzc2VydFJlc3RWYWxpZDogKGNhbmRpZGF0ZSwgcGFzc1N0eWxlT2ZSZWN1cikgPT4ge1xuICAgIGdldFByb3RvdHlwZU9mKGNhbmRpZGF0ZSkgPT09IGFycmF5UHJvdG90eXBlIHx8XG4gICAgICBhc3NlcnQuZmFpbChYYE1hbGZvcm1lZCBhcnJheTogJHtjYW5kaWRhdGV9YCwgVHlwZUVycm9yKTtcbiAgICAvL1xuICAgIC8vXG4gICAgY29uc3QgbGVuID0gLyogICAgICAgICAgICAgICAgICovIChcbiAgICAgIGdldE93bkRhdGFEZXNjcmlwdG9yKGNhbmRpZGF0ZSwgJ2xlbmd0aCcsIGZhbHNlLCBhc3NlcnRDaGVja2VyKS52YWx1ZVxuICAgICk7XG4gICAgLy9cbiAgICAvL1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgIHBhc3NTdHlsZU9mUmVjdXIoXG4gICAgICAgIGdldE93bkRhdGFEZXNjcmlwdG9yKGNhbmRpZGF0ZSwgaSwgdHJ1ZSwgYXNzZXJ0Q2hlY2tlcikudmFsdWUsXG4gICAgICApO1xuICAgIH1cbiAgICAvL1xuICAgIG93bktleXMoY2FuZGlkYXRlKS5sZW5ndGggPT09IGxlbiArIDEgfHxcbiAgICAgIGFzc2VydC5mYWlsKFhgQXJyYXlzIG11c3Qgbm90IGhhdmUgbm9uLWluZGV4ZXM6ICR7Y2FuZGlkYXRlfWAsIFR5cGVFcnJvcik7XG4gIH0sXG59KTskaM2PX29uY2UuQ29weUFycmF5SGVscGVyKENvcHlBcnJheUhlbHBlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJDb3B5QXJyYXlIZWxwZXIiOlsiQ29weUFycmF5SGVscGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABCBRMD2CAAA9ggAACkAAABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvY29weVJlY29yZC5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiQ29weVJlY29yZEhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzc2VydENoZWNrZXIsY2FuQmVNZXRob2QsZ2V0T3duRGF0YURlc2NyaXB0b3IsQ1g7JGjNj19pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJjYW5CZU1ldGhvZFwiLFskaM2PX2EgPT4gKGNhbkJlTWV0aG9kID0gJGjNj19hKV1dLFtcImdldE93bkRhdGFEZXNjcmlwdG9yXCIsWyRozY9fYSA9PiAoZ2V0T3duRGF0YURlc2NyaXB0b3IgPSAkaM2PX2EpXV0sW1wiQ1hcIixbJGjNj19hID0+IChDWCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgZ2V0UHJvdG90eXBlT2YsIHByb3RvdHlwZTogb2JqZWN0UHJvdG90eXBlIH0gPSBPYmplY3Q7XG5cbi8qXG5cblxuICovXG5jb25zdCBjaGVja09iamVjdFByb3RvdHlwZSA9IChjYW5kaWRhdGUsIGNoZWNrID0gdW5kZWZpbmVkKSA9PiB7XG4gIHJldHVybiAoXG4gICAgZ2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKSA9PT0gb2JqZWN0UHJvdG90eXBlIHx8XG4gICAgKCEhY2hlY2sgJiZcbiAgICAgIENYKGNoZWNrKWBSZWNvcmRzIG11c3QgaW5oZXJpdCBmcm9tIE9iamVjdC5wcm90b3R5cGU6ICR7Y2FuZGlkYXRlfWApXG4gICk7XG59O1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGNoZWNrUHJvcGVydHlDYW5CZVZhbGlkID0gKGNhbmRpZGF0ZSwga2V5LCB2YWx1ZSwgY2hlY2sgPSB1bmRlZmluZWQpID0+IHtcbiAgcmV0dXJuIChcbiAgICAodHlwZW9mIGtleSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICghIWNoZWNrICYmXG4gICAgICAgIENYKFxuICAgICAgICAgIGNoZWNrLFxuICAgICAgICApYFJlY29yZHMgY2FuIG9ubHkgaGF2ZSBzdHJpbmctbmFtZWQgcHJvcGVydGllczogJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgKCFjYW5CZU1ldGhvZCh2YWx1ZSkgfHxcbiAgICAgICghIWNoZWNrICYmXG4gICAgICAgIC8vXG4gICAgICAgIENYKFxuICAgICAgICAgIGNoZWNrLFxuICAgICAgICApYFJlY29yZHMgY2Fubm90IGNvbnRhaW4gbm9uLWZhciBmdW5jdGlvbnMgYmVjYXVzZSB0aGV5IG1heSBiZSBtZXRob2RzIG9mIGFuIGltcGxpY2l0IFJlbW90YWJsZTogJHtjYW5kaWRhdGV9YCkpXG4gICk7XG59O1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IENvcHlSZWNvcmRIZWxwZXIgPSBoYXJkZW4oe1xuICBzdHlsZU5hbWU6ICdjb3B5UmVjb3JkJyxcblxuICBjYW5CZVZhbGlkOiAoY2FuZGlkYXRlLCBjaGVjayA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICBjaGVja09iamVjdFByb3RvdHlwZShjYW5kaWRhdGUsIGNoZWNrKSAmJlxuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBvd25LZXlzKGNhbmRpZGF0ZSkuZXZlcnkoa2V5ID0+XG4gICAgICAgIGNoZWNrUHJvcGVydHlDYW5CZVZhbGlkKGNhbmRpZGF0ZSwga2V5LCBjYW5kaWRhdGVba2V5XSwgY2hlY2spLFxuICAgICAgKVxuICAgICk7XG4gIH0sXG5cbiAgYXNzZXJ0UmVzdFZhbGlkOiAoY2FuZGlkYXRlLCBwYXNzU3R5bGVPZlJlY3VyKSA9PiB7XG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgZm9yIChjb25zdCBuYW1lIG9mIG93bktleXMoY2FuZGlkYXRlKSkge1xuICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gZ2V0T3duRGF0YURlc2NyaXB0b3IoXG4gICAgICAgIGNhbmRpZGF0ZSxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgYXNzZXJ0Q2hlY2tlcixcbiAgICAgICk7XG4gICAgICBwYXNzU3R5bGVPZlJlY3VyKHZhbHVlKTtcbiAgICB9XG4gIH0sXG59KTskaM2PX29uY2UuQ29weVJlY29yZEhlbHBlcihDb3B5UmVjb3JkSGVscGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkNvcHlSZWNvcmRIZWxwZXIiOlsiQ29weVJlY29yZEhlbHBlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADCN8mnngsAAJ4LAAAuAAAAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL2RlZXBseUZ1bGZpbGxlZC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vcHJvbWlzZS1raXQiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9wYXNzU3R5bGVPZi5qcyIsIi4vbWFrZVRhZ2dlZC5qcyJdLCJleHBvcnRzIjpbImRlZXBseUZ1bGZpbGxlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IFgscSxFLGlzUHJvbWlzZSxnZXRUYWcsaXNPYmplY3QscGFzc1N0eWxlT2YsbWFrZVRhZ2dlZDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIixbJGjNj19hID0+IChpc1Byb21pc2UgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wiaXNPYmplY3RcIixbJGjNj19hID0+IChpc09iamVjdCA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV1dXSxbXCIuL21ha2VUYWdnZWQuanNcIiwgW1tcIm1ha2VUYWdnZWRcIixbJGjNj19hID0+IChtYWtlVGFnZ2VkID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cbi8qXG5cbiAqL1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGZyb21FbnRyaWVzIH0gPSBPYmplY3Q7XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGRlZXBseUZ1bGZpbGxlZCA9IGFzeW5jIHZhbCA9PiB7XG4gIC8vXG4gIC8vXG4gIC8vXG5cbiAgaWYgKCFpc09iamVjdCh2YWwpKSB7XG4gICAgcmV0dXJuIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKHZhbCk7XG4gIH1cbiAgaWYgKGlzUHJvbWlzZSh2YWwpKSB7XG4gICAgcmV0dXJuIEUud2hlbih2YWwsIG5vbnAgPT4gZGVlcGx5RnVsZmlsbGVkKG5vbnApKTtcbiAgfVxuICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZih2YWwpO1xuICBzd2l0Y2ggKHBhc3NTdHlsZSkge1xuICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICBjb25zdCByZWMgPSAvKiAgICAgICAgICAgICAgICAgICAgICovICh2YWwpO1xuICAgICAgY29uc3QgbmFtZXMgPSAvKiAgICAgICAgICAgICAgICAgICAqLyAob3duS2V5cyhyZWMpKTtcbiAgICAgIGNvbnN0IHZhbFBzID0gbmFtZXMubWFwKG5hbWUgPT4gZGVlcGx5RnVsZmlsbGVkKHJlY1tuYW1lXSkpO1xuICAgICAgLy9cbiAgICAgIHJldHVybiBFLndoZW4oUHJvbWlzZS5hbGwodmFsUHMpLCB2YWxzID0+XG4gICAgICAgIGhhcmRlbihmcm9tRW50cmllcyh2YWxzLm1hcCgoYywgaSkgPT4gW25hbWVzW2ldLCBjXSkpKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgIGNvbnN0IGFyciA9IC8qICAgICAgICAgICAgICAgICAgICAqLyAodmFsKTtcbiAgICAgIGNvbnN0IHZhbFBzID0gYXJyLm1hcChwID0+IGRlZXBseUZ1bGZpbGxlZChwKSk7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIEUud2hlbihQcm9taXNlLmFsbCh2YWxQcyksIHZhbHMgPT4gaGFyZGVuKHZhbHMpKTtcbiAgICB9XG4gICAgY2FzZSAndGFnZ2VkJzoge1xuICAgICAgY29uc3QgdGdkID0gLyogICAgICAgICAgICAgICAgICAgICAqLyAodmFsKTtcbiAgICAgIGNvbnN0IHRhZyA9IGdldFRhZyh0Z2QpO1xuICAgICAgLy9cbiAgICAgIHJldHVybiBFLndoZW4oZGVlcGx5RnVsZmlsbGVkKHRnZC5wYXlsb2FkKSwgcGF5bG9hZCA9PlxuICAgICAgICBtYWtlVGFnZ2VkKHRhZywgcGF5bG9hZCksXG4gICAgICApO1xuICAgIH1cbiAgICBjYXNlICdyZW1vdGFibGUnOiB7XG4gICAgICBjb25zdCByZW0gPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKHZhbCk7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIHJlbTtcbiAgICB9XG4gICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICBjb25zdCBlcnIgPSAvKiAgICAgICAgICAgICAgICAqLyAodmFsKTtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gZXJyO1xuICAgIH1cbiAgICBjYXNlICdwcm9taXNlJzoge1xuICAgICAgY29uc3QgcHJvbSA9IC8qICAgICAgICAgICAgICAgICAgKi8gKC8qICAgICAgICAgICAgICAgICAgKi8gKHZhbCkpO1xuICAgICAgcmV0dXJuIEUud2hlbihwcm9tLCBub25wID0+IGRlZXBseUZ1bGZpbGxlZChub25wKSk7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHRocm93IGFzc2VydC5mYWlsKFhgVW5leHBlY3RlZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9YCwgVHlwZUVycm9yKTtcbiAgICB9XG4gIH1cbn07JGjNj19vbmNlLmRlZXBseUZ1bGZpbGxlZChkZWVwbHlGdWxmaWxsZWQpO1xuaGFyZGVuKGRlZXBseUZ1bGZpbGxlZCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWVwbHlGdWxmaWxsZWQiOlsiZGVlcGx5RnVsZmlsbGVkIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABdXAiLTFAAA0xQAACQAAABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvZXJyb3IuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIkVycm9ySGVscGVyIiwiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IiLCJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyIsImdldEVycm9yQ29uc3RydWN0b3IiLCJpc0Vycm9yTGlrZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHEsYXNzZXJ0Q2hlY2tlcixDWDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJDWFwiLFskaM2PX2EgPT4gKENYID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCB7IGdldFByb3RvdHlwZU9mLCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLCBoYXNPd24sIGVudHJpZXMgfSA9IE9iamVjdDtcblxuLy9cbi8vXG5jb25zdCBlcnJvckNvbnN0cnVjdG9ycyA9IG5ldyBNYXAoXG4gIC8vXG4gIC8vXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAoW1xuICAgIFsnRXJyb3InLCBFcnJvcl0sXG4gICAgWydFdmFsRXJyb3InLCBFdmFsRXJyb3JdLFxuICAgIFsnUmFuZ2VFcnJvcicsIFJhbmdlRXJyb3JdLFxuICAgIFsnUmVmZXJlbmNlRXJyb3InLCBSZWZlcmVuY2VFcnJvcl0sXG4gICAgWydTeW50YXhFcnJvcicsIFN5bnRheEVycm9yXSxcbiAgICBbJ1R5cGVFcnJvcicsIFR5cGVFcnJvcl0sXG4gICAgWydVUklFcnJvcicsIFVSSUVycm9yXVxuXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgXSksXG4pO1xuXG5pZiAodHlwZW9mIEFnZ3JlZ2F0ZUVycm9yICE9PSAndW5kZWZpbmVkJykge1xuICAvL1xuICBlcnJvckNvbnN0cnVjdG9ycy5zZXQoJ0FnZ3JlZ2F0ZUVycm9yJywgQWdncmVnYXRlRXJyb3IpO1xufVxuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGdldEVycm9yQ29uc3RydWN0b3IgPSBuYW1lID0+IGVycm9yQ29uc3RydWN0b3JzLmdldChuYW1lKTskaM2PX29uY2UuZ2V0RXJyb3JDb25zdHJ1Y3RvcihnZXRFcnJvckNvbnN0cnVjdG9yKTtcbmhhcmRlbihnZXRFcnJvckNvbnN0cnVjdG9yKTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgY2hlY2tFcnJvckxpa2UgPSAoY2FuZGlkYXRlLCBjaGVjayA9IHVuZGVmaW5lZCkgPT4ge1xuICAvL1xuICByZXR1cm4gKFxuICAgIGNhbmRpZGF0ZSBpbnN0YW5jZW9mIEVycm9yIHx8XG4gICAgKCEhY2hlY2sgJiYgQ1goY2hlY2spYEVycm9yIGV4cGVjdGVkOiAke2NhbmRpZGF0ZX1gKVxuICApO1xufTtcbmhhcmRlbihjaGVja0Vycm9yTGlrZSk7XG4vL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBpc0Vycm9yTGlrZSA9IGNhbmRpZGF0ZSA9PiBjaGVja0Vycm9yTGlrZShjYW5kaWRhdGUpOyRozY9fb25jZS5pc0Vycm9yTGlrZShpc0Vycm9yTGlrZSk7XG5oYXJkZW4oaXNFcnJvckxpa2UpO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjID0gKFxuICBwcm9wTmFtZSxcbiAgZGVzYyxcbiAgcGFzc1N0eWxlT2ZSZWN1cixcbiAgY2hlY2sgPSB1bmRlZmluZWQsXG4pID0+IHtcbiAgaWYgKGRlc2MuZW51bWVyYWJsZSkge1xuICAgIHJldHVybiAoXG4gICAgICAhIWNoZWNrICYmXG4gICAgICBDWChjaGVjaylgUGFzc2FibGUgRXJyb3IgJHtxKFxuICAgICAgICBwcm9wTmFtZSxcbiAgICAgICl9IG93biBwcm9wZXJ0eSBtdXN0IG5vdCBiZSBlbnVtZXJhYmxlOiAke2Rlc2N9YFxuICAgICk7XG4gIH1cbiAgaWYgKCFoYXNPd24oZGVzYywgJ3ZhbHVlJykpIHtcbiAgICByZXR1cm4gKFxuICAgICAgISFjaGVjayAmJlxuICAgICAgQ1goY2hlY2spYFBhc3NhYmxlIEVycm9yICR7cShcbiAgICAgICAgcHJvcE5hbWUsXG4gICAgICApfSBvd24gcHJvcGVydHkgbXVzdCBiZSBhIGRhdGEgcHJvcGVydHk6ICR7ZGVzY31gXG4gICAgKTtcbiAgfVxuICBjb25zdCB7IHZhbHVlIH0gPSBkZXNjO1xuICBzd2l0Y2ggKHByb3BOYW1lKSB7XG4gICAgY2FzZSAnbWVzc2FnZSc6XG4gICAgY2FzZSAnc3RhY2snOiB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgQ1goY2hlY2spYFBhc3NhYmxlIEVycm9yICR7cShcbiAgICAgICAgICAgIHByb3BOYW1lLFxuICAgICAgICAgICl9IG93biBwcm9wZXJ0eSBtdXN0IGJlIGEgc3RyaW5nOiAke3ZhbHVlfWApXG4gICAgICApO1xuICAgIH1cbiAgICBjYXNlICdjYXVzZSc6IHtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IodmFsdWUsIHBhc3NTdHlsZU9mUmVjdXIsIGNoZWNrKTtcbiAgICB9XG4gICAgY2FzZSAnZXJyb3JzJzoge1xuICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHZhbHVlKSB8fCBwYXNzU3R5bGVPZlJlY3VyKHZhbHVlKSAhPT0gJ2NvcHlBcnJheScpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAhIWNoZWNrICYmXG4gICAgICAgICAgQ1goY2hlY2spYFBhc3NhYmxlIEVycm9yICR7cShcbiAgICAgICAgICAgIHByb3BOYW1lLFxuICAgICAgICAgICl9IG93biBwcm9wZXJ0eSBtdXN0IGJlIGEgY29weUFycmF5OiAke3ZhbHVlfWBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB2YWx1ZS5ldmVyeShlcnIgPT5cbiAgICAgICAgLy9cbiAgICAgICAgY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IoZXJyLCBwYXNzU3R5bGVPZlJlY3VyLCBjaGVjayksXG4gICAgICApO1xuICAgIH1cbiAgICBkZWZhdWx0OiB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgcmV0dXJuIChcbiAgICAhIWNoZWNrICYmXG4gICAgQ1goY2hlY2spYFBhc3NhYmxlIEVycm9yIGhhcyBleHRyYSB1bnBhc3NlZCBwcm9wZXJ0eSAke3EocHJvcE5hbWUpfWBcbiAgKTtcbn07JGjNj19vbmNlLmNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKTtcbmhhcmRlbihjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyk7XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yID0gKFxuICBjYW5kaWRhdGUsXG4gIHBhc3NTdHlsZU9mUmVjdXIsXG4gIGNoZWNrID0gdW5kZWZpbmVkLFxuKSA9PiB7XG4gIGlmICghY2hlY2tFcnJvckxpa2UoY2FuZGlkYXRlLCBjaGVjaykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgcHJvdG8gPSBnZXRQcm90b3R5cGVPZihjYW5kaWRhdGUpO1xuICBjb25zdCB7IG5hbWUgfSA9IHByb3RvO1xuICBjb25zdCBlcnJDb25zdHJ1Y3RvciA9IGdldEVycm9yQ29uc3RydWN0b3IobmFtZSk7XG4gIGlmIChlcnJDb25zdHJ1Y3RvciA9PT0gdW5kZWZpbmVkIHx8IGVyckNvbnN0cnVjdG9yLnByb3RvdHlwZSAhPT0gcHJvdG8pIHtcbiAgICByZXR1cm4gKFxuICAgICAgISFjaGVjayAmJlxuICAgICAgQ1goXG4gICAgICAgIGNoZWNrLFxuICAgICAgKWBQYXNzYWJsZSBFcnJvciBtdXN0IGluaGVyaXQgZnJvbSBhbiBlcnJvciBjbGFzcyAucHJvdG90eXBlOiAke2NhbmRpZGF0ZX1gXG4gICAgKTtcbiAgfVxuICBjb25zdCBkZXNjcyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY2FuZGlkYXRlKTtcbiAgaWYgKCEoJ21lc3NhZ2UnIGluIGRlc2NzKSkge1xuICAgIHJldHVybiAoXG4gICAgICAhIWNoZWNrICYmXG4gICAgICBDWChcbiAgICAgICAgY2hlY2ssXG4gICAgICApYFBhc3NhYmxlIEVycm9yIG11c3QgaGF2ZSBhbiBvd24gXCJtZXNzYWdlXCIgc3RyaW5nIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBlbnRyaWVzKGRlc2NzKS5ldmVyeSgoW3Byb3BOYW1lLCBkZXNjXSkgPT5cbiAgICBjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyhcbiAgICAgIHByb3BOYW1lLFxuICAgICAgZGVzYyxcbiAgICAgIHBhc3NTdHlsZU9mUmVjdXIsXG4gICAgICBjaGVjayxcbiAgICApLFxuICApO1xufTskaM2PX29uY2UuY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IoY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IpO1xuaGFyZGVuKGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yKTtcblxuLypcblxuICovXG4gICAgICAgY29uc3QgRXJyb3JIZWxwZXIgPSBoYXJkZW4oe1xuICBzdHlsZU5hbWU6ICdlcnJvcicsXG5cbiAgY2FuQmVWYWxpZDogY2hlY2tFcnJvckxpa2UsXG5cbiAgYXNzZXJ0UmVzdFZhbGlkOiAoY2FuZGlkYXRlLCBwYXNzU3R5bGVPZlJlY3VyKSA9PlxuICAgIGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yKGNhbmRpZGF0ZSwgcGFzc1N0eWxlT2ZSZWN1ciwgYXNzZXJ0Q2hlY2tlciksXG59KTskaM2PX29uY2UuRXJyb3JIZWxwZXIoRXJyb3JIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0RXJyb3JDb25zdHJ1Y3RvciI6WyJnZXRFcnJvckNvbnN0cnVjdG9yIl0sImlzRXJyb3JMaWtlIjpbImlzRXJyb3JMaWtlIl0sImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjIjpbImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjIl0sImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yIjpbImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yIl0sIkVycm9ySGVscGVyIjpbIkVycm9ySGVscGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANOikHykBgAApAYAACsAAABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvaXRlci1oZWxwZXJzLmpzeyJpbXBvcnRzIjpbIi4vbWFrZS1mYXIuanMiXSwiZXhwb3J0cyI6WyJmaWx0ZXJJdGVyYWJsZSIsIm1hcEl0ZXJhYmxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFyOyRozY9faW1wb3J0cyhbW1wiLi9tYWtlLWZhci5qc1wiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV1dKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1hcEl0ZXJhYmxlID0gKGJhc2VJdGVyYWJsZSwgZnVuYykgPT5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgKi9cbiAgRmFyKCdtYXBwZWQgaXRlcmFibGUnLCB7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIGNvbnN0IGJhc2VJdGVyYXRvciA9IGJhc2VJdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgICByZXR1cm4gRmFyKCdtYXBwZWQgaXRlcmF0b3InLCB7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IHZhbHVlOiBiYXNlVmFsdWUsIGRvbmUgfSA9IGJhc2VJdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBkb25lID8gYmFzZVZhbHVlIDogZnVuYyhiYXNlVmFsdWUpO1xuICAgICAgICAgIHJldHVybiBoYXJkZW4oeyB2YWx1ZSwgZG9uZSB9KTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pOyRozY9fb25jZS5tYXBJdGVyYWJsZShtYXBJdGVyYWJsZSk7XG5oYXJkZW4obWFwSXRlcmFibGUpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZmlsdGVySXRlcmFibGUgPSAoYmFzZUl0ZXJhYmxlLCBwcmVkKSA9PlxuICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICBGYXIoJ2ZpbHRlcmVkIGl0ZXJhYmxlJywge1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICBjb25zdCBiYXNlSXRlcmF0b3IgPSBiYXNlSXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgcmV0dXJuIEZhcignZmlsdGVyZWQgaXRlcmF0b3InLCB7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICBmb3IgKDs7KSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBiYXNlSXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgICAgY29uc3QgeyB2YWx1ZSwgZG9uZSB9ID0gcmVzdWx0O1xuICAgICAgICAgICAgaWYgKGRvbmUgfHwgcHJlZCh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTskaM2PX29uY2UuZmlsdGVySXRlcmFibGUoZmlsdGVySXRlcmFibGUpO1xuaGFyZGVuKGZpbHRlckl0ZXJhYmxlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1hcEl0ZXJhYmxlIjpbIm1hcEl0ZXJhYmxlIl0sImZpbHRlckl0ZXJhYmxlIjpbImZpbHRlckl0ZXJhYmxlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGJ4eInZEgAA2RIAACcAAABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvbWFrZS1mYXIuanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qcyIsIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL3JlbW90YWJsZS5qcyJdLCJleHBvcnRzIjpbIkZhciIsIkdFVF9NRVRIT0RfTkFNRVMiLCJSZW1vdGFibGUiLCJUb0ZhckZ1bmN0aW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZ2V0TWV0aG9kTmFtZXMscSxGYWlsLGFzc2VydENoZWNrZXIsUEFTU19TVFlMRSxhc3NlcnRJZmFjZSxnZXRJbnRlcmZhY2VPZixSZW1vdGFibGVIZWxwZXI7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzXCIsIFtbXCJnZXRNZXRob2ROYW1lc1wiLFskaM2PX2EgPT4gKGdldE1ldGhvZE5hbWVzID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcIlBBU1NfU1RZTEVcIixbJGjNj19hID0+IChQQVNTX1NUWUxFID0gJGjNj19hKV1dXV0sW1wiLi9yZW1vdGFibGUuanNcIiwgW1tcImFzc2VydElmYWNlXCIsWyRozY9fYSA9PiAoYXNzZXJ0SWZhY2UgPSAkaM2PX2EpXV0sW1wiZ2V0SW50ZXJmYWNlT2ZcIixbJGjNj19hID0+IChnZXRJbnRlcmZhY2VPZiA9ICRozY9fYSldXSxbXCJSZW1vdGFibGVIZWxwZXJcIixbJGjNj19hID0+IChSZW1vdGFibGVIZWxwZXIgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuY29uc3QgeyBwcm90b3R5cGU6IGZ1bmN0aW9uUHJvdG90eXBlIH0gPSBGdW5jdGlvbjtcbmNvbnN0IHtcbiAgZ2V0UHJvdG90eXBlT2YsXG4gIHNldFByb3RvdHlwZU9mLFxuICBjcmVhdGUsXG4gIGlzRnJvemVuLFxuICBwcm90b3R5cGU6IG9iamVjdFByb3RvdHlwZSxcbn0gPSBPYmplY3Q7XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZVJlbW90YWJsZVByb3RvID0gKHJlbW90YWJsZSwgaWZhY2UpID0+IHtcbiAgbGV0IG9sZFByb3RvID0gZ2V0UHJvdG90eXBlT2YocmVtb3RhYmxlKTtcbiAgaWYgKHR5cGVvZiByZW1vdGFibGUgPT09ICdvYmplY3QnKSB7XG4gICAgaWYgKG9sZFByb3RvID09PSBudWxsKSB7XG4gICAgICBvbGRQcm90byA9IG9iamVjdFByb3RvdHlwZTtcbiAgICB9XG4gICAgb2xkUHJvdG8gPT09IG9iamVjdFByb3RvdHlwZSB8fFxuICAgICAgRmFpbGBGb3Igbm93LCByZW1vdGFibGVzIGNhbm5vdCBpbmhlcml0IGZyb20gYW55dGhpbmcgdW51c3VhbCwgaW4gJHtyZW1vdGFibGV9YDtcbiAgfSBlbHNlIGlmICh0eXBlb2YgcmVtb3RhYmxlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgb2xkUHJvdG8gIT09IG51bGwgfHxcbiAgICAgIEZhaWxgT3JpZ2luYWwgZnVuY3Rpb24gbXVzdCBub3QgaW5oZXJpdCBmcm9tIG51bGw6ICR7cmVtb3RhYmxlfWA7XG4gICAgb2xkUHJvdG8gPT09IGZ1bmN0aW9uUHJvdG90eXBlIHx8XG4gICAgICBnZXRQcm90b3R5cGVPZihvbGRQcm90bykgPT09IGZ1bmN0aW9uUHJvdG90eXBlIHx8XG4gICAgICBGYWlsYEZhciBmdW5jdGlvbnMgbXVzdCBvcmlnaW5hbGx5IGluaGVyaXQgZnJvbSBGdW5jdGlvbi5wcm90b3R5cGUsIGluICR7cmVtb3RhYmxlfWA7XG4gIH0gZWxzZSB7XG4gICAgRmFpbGB1bnJlY29nbml6ZWQgdHlwZW9mICR7cmVtb3RhYmxlfWA7XG4gIH1cbiAgcmV0dXJuIGhhcmRlbihcbiAgICBjcmVhdGUob2xkUHJvdG8sIHtcbiAgICAgIFtQQVNTX1NUWUxFXTogeyB2YWx1ZTogJ3JlbW90YWJsZScgfSxcbiAgICAgIFtTeW1ib2wudG9TdHJpbmdUYWddOiB7IHZhbHVlOiBpZmFjZSB9LFxuICAgIH0pLFxuICApO1xufTtcblxuY29uc3QgYXNzZXJ0Q2FuQmVSZW1vdGFibGUgPSBjYW5kaWRhdGUgPT5cbiAgUmVtb3RhYmxlSGVscGVyLmNhbkJlVmFsaWQoY2FuZGlkYXRlLCBhc3NlcnRDaGVja2VyKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IFJlbW90YWJsZSA9IChcbiAgLy9cbiAgaWZhY2UgPSAnUmVtb3RhYmxlJyxcbiAgcHJvcHMgPSB1bmRlZmluZWQsXG4gIHJlbW90YWJsZSA9IC8qICAgICAgICAgICAgKi8gKHt9KSxcbikgPT4ge1xuICBhc3NlcnRJZmFjZShpZmFjZSk7XG4gIGFzc2VydChpZmFjZSk7XG4gIC8vXG4gIC8vXG4gIHByb3BzID09PSB1bmRlZmluZWQgfHwgRmFpbGBSZW1vdGFibGUgcHJvcHMgbm90IHlldCBpbXBsZW1lbnRlZCAke3Byb3BzfWA7XG5cbiAgLy9cbiAgYXNzZXJ0Q2FuQmVSZW1vdGFibGUocmVtb3RhYmxlKTtcblxuICAvL1xuICAhKFBBU1NfU1RZTEUgaW4gcmVtb3RhYmxlKSB8fFxuICAgIEZhaWxgUmVtb3RhYmxlICR7cmVtb3RhYmxlfSBpcyBhbHJlYWR5IG1hcmtlZCBhcyBhICR7cShcbiAgICAgIHJlbW90YWJsZVtQQVNTX1NUWUxFXSxcbiAgICApfWA7XG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIGhhcmRlbi5pc0Zha2UgfHxcbiAgICAvL1xuICAgICFpc0Zyb3plbihyZW1vdGFibGUpIHx8XG4gICAgRmFpbGBSZW1vdGFibGUgJHtyZW1vdGFibGV9IGlzIGFscmVhZHkgZnJvemVuYDtcbiAgY29uc3QgcmVtb3RhYmxlUHJvdG8gPSBtYWtlUmVtb3RhYmxlUHJvdG8ocmVtb3RhYmxlLCBpZmFjZSk7XG5cbiAgLy9cbiAgLy9cbiAgY29uc3QgbXV0YXRlSGFyZGVuQW5kQ2hlY2sgPSB0YXJnZXQgPT4ge1xuICAgIC8vXG4gICAgc2V0UHJvdG90eXBlT2YodGFyZ2V0LCByZW1vdGFibGVQcm90byk7XG4gICAgaGFyZGVuKHRhcmdldCk7XG4gICAgYXNzZXJ0Q2FuQmVSZW1vdGFibGUodGFyZ2V0KTtcbiAgfTtcblxuICAvL1xuICBtdXRhdGVIYXJkZW5BbmRDaGVjayh7fSk7XG5cbiAgLy9cbiAgbXV0YXRlSGFyZGVuQW5kQ2hlY2socmVtb3RhYmxlKTtcblxuICAvL1xuICAvL1xuICBhc3NlcnQoaWZhY2UgIT09IHVuZGVmaW5lZCk7IC8vXG4gIHJldHVybiAvKiAgICAgICAgICAgICAgKi8gKHJlbW90YWJsZSk7XG59OyRozY9fb25jZS5SZW1vdGFibGUoUmVtb3RhYmxlKTtcbmhhcmRlbihSZW1vdGFibGUpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgR0VUX01FVEhPRF9OQU1FUyA9ICdfX2dldE1ldGhvZE5hbWVzX18nO1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UuR0VUX01FVEhPRF9OQU1FUyhHRVRfTUVUSE9EX05BTUVTKTtcbmNvbnN0IGdldE1ldGhvZE5hbWVzTWV0aG9kID0gaGFyZGVuKHtcbiAgW0dFVF9NRVRIT0RfTkFNRVNdKCkge1xuICAgIHJldHVybiBnZXRNZXRob2ROYW1lcyh0aGlzKTtcbiAgfSxcbn0pW0dFVF9NRVRIT0RfTkFNRVNdO1xuXG5jb25zdCBnZXRNZXRob2ROYW1lc0Rlc2NyaXB0b3IgPSBoYXJkZW4oe1xuICB2YWx1ZTogZ2V0TWV0aG9kTmFtZXNNZXRob2QsXG4gIGVudW1lcmFibGU6IGZhbHNlLFxuICBjb25maWd1cmFibGU6IGZhbHNlLFxuICB3cml0YWJsZTogZmFsc2UsXG59KTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IEZhciA9IChmYXJOYW1lLCByZW1vdGFibGUgPSB1bmRlZmluZWQpID0+IHtcbiAgY29uc3QgciA9IHJlbW90YWJsZSA9PT0gdW5kZWZpbmVkID8gLyogICAgICAgICAgICAqLyAoe30pIDogcmVtb3RhYmxlO1xuICBpZiAodHlwZW9mIHIgPT09ICdvYmplY3QnICYmICEoR0VUX01FVEhPRF9OQU1FUyBpbiByKSkge1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIEdFVF9NRVRIT0RfTkFNRVMsIGdldE1ldGhvZE5hbWVzRGVzY3JpcHRvcik7XG4gIH1cbiAgcmV0dXJuIFJlbW90YWJsZShgQWxsZWdlZDogJHtmYXJOYW1lfWAsIHVuZGVmaW5lZCwgcik7XG59OyRozY9fb25jZS5GYXIoRmFyKTtcbmhhcmRlbihGYXIpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgVG9GYXJGdW5jdGlvbiA9IChmYXJOYW1lLCBmdW5jKSA9PiB7XG4gIGlmIChnZXRJbnRlcmZhY2VPZihmdW5jKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLy9cbiAgICByZXR1cm4gZnVuYztcbiAgfVxuICAvL1xuICByZXR1cm4gRmFyKGZhck5hbWUsICguLi5hcmdzKSA9PiBmdW5jKC4uLmFyZ3MpKTtcbn07JGjNj19vbmNlLlRvRmFyRnVuY3Rpb24oVG9GYXJGdW5jdGlvbik7XG5oYXJkZW4oVG9GYXJGdW5jdGlvbik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJSZW1vdGFibGUiOlsiUmVtb3RhYmxlIl0sIkdFVF9NRVRIT0RfTkFNRVMiOlsiR0VUX01FVEhPRF9OQU1FUyJdLCJGYXIiOlsiRmFyIl0sIlRvRmFyRnVuY3Rpb24iOlsiVG9GYXJGdW5jdGlvbiJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABNwYjT3AQAANwEAAApAAAAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL21ha2VUYWdnZWQuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vcGFzc1N0eWxlT2YuanMiXSwiZXhwb3J0cyI6WyJtYWtlVGFnZ2VkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxQQVNTX1NUWUxFLGFzc2VydFBhc3NhYmxlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcIlBBU1NfU1RZTEVcIixbJGjNj19hID0+IChQQVNTX1NUWUxFID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wiYXNzZXJ0UGFzc2FibGVcIixbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuLypcblxuICovXG5cbmNvbnN0IHsgY3JlYXRlLCBwcm90b3R5cGU6IG9iamVjdFByb3RvdHlwZSB9ID0gT2JqZWN0O1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VUYWdnZWQgPSAodGFnLCBwYXlsb2FkKSA9PiB7XG4gIHR5cGVvZiB0YWcgPT09ICdzdHJpbmcnIHx8XG4gICAgRmFpbGBUaGUgdGFnIG9mIGEgdGFnZ2VkIHJlY29yZCBtdXN0IGJlIGEgc3RyaW5nOiAke3RhZ31gO1xuICBhc3NlcnRQYXNzYWJsZShoYXJkZW4ocGF5bG9hZCkpO1xuICByZXR1cm4gaGFyZGVuKFxuICAgIGNyZWF0ZShvYmplY3RQcm90b3R5cGUsIHtcbiAgICAgIFtQQVNTX1NUWUxFXTogeyB2YWx1ZTogJ3RhZ2dlZCcgfSxcbiAgICAgIFtTeW1ib2wudG9TdHJpbmdUYWddOiB7IHZhbHVlOiB0YWcgfSxcbiAgICAgIHBheWxvYWQ6IHsgdmFsdWU6IHBheWxvYWQsIGVudW1lcmFibGU6IHRydWUgfSxcbiAgICB9KSxcbiAgKTtcbn07JGjNj19vbmNlLm1ha2VUYWdnZWQobWFrZVRhZ2dlZCk7XG5oYXJkZW4obWFrZVRhZ2dlZCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlVGFnZ2VkIjpbIm1ha2VUYWdnZWQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAcERchKIXAACiFwAAMAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJDWCIsIlBBU1NfU1RZTEUiLCJhc3NlcnRDaGVja2VyIiwiY2FuQmVNZXRob2QiLCJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIiwiY2hlY2tQYXNzU3R5bGUiLCJjaGVja1RhZ1JlY29yZCIsImdldE93bkRhdGFEZXNjcmlwdG9yIiwiZ2V0VGFnIiwiaGFzT3duUHJvcGVydHlPZiIsImlzT2JqZWN0IiwiaXNUeXBlZEFycmF5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgWCxxOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3QgeyBwcm90b3R5cGU6IGZ1bmN0aW9uUHJvdG90eXBlIH0gPSBGdW5jdGlvbjtcbmNvbnN0IHtcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuICBnZXRQcm90b3R5cGVPZixcbiAgaGFzT3duUHJvcGVydHk6IG9iamVjdEhhc093blByb3BlcnR5LFxuICBpc0Zyb3plbixcbiAgcHJvdG90eXBlOiBvYmplY3RQcm90b3R5cGUsXG59ID0gT2JqZWN0O1xuY29uc3QgeyBhcHBseSB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgdG9TdHJpbmdUYWc6IHRvU3RyaW5nVGFnU3ltYm9sIH0gPSBTeW1ib2w7XG5cbmNvbnN0IHR5cGVkQXJyYXlQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZihVaW50OEFycmF5LnByb3RvdHlwZSk7XG5jb25zdCB0eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxuICB0eXBlZEFycmF5UHJvdG90eXBlLFxuICB0b1N0cmluZ1RhZ1N5bWJvbCxcbik7XG5hc3NlcnQodHlwZWRBcnJheVRvU3RyaW5nVGFnRGVzYyk7XG5jb25zdCBnZXRUeXBlZEFycmF5VG9TdHJpbmdUYWcgPSB0eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjLmdldDtcbmFzc2VydCh0eXBlb2YgZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnID09PSAnZnVuY3Rpb24nKTtcblxuICAgICAgIGNvbnN0IGhhc093blByb3BlcnR5T2YgPSAob2JqLCBwcm9wKSA9PlxuICBhcHBseShvYmplY3RIYXNPd25Qcm9wZXJ0eSwgb2JqLCBbcHJvcF0pOyRozY9fb25jZS5oYXNPd25Qcm9wZXJ0eU9mKGhhc093blByb3BlcnR5T2YpO1xuaGFyZGVuKGhhc093blByb3BlcnR5T2YpO1xuXG4vL1xuICAgICAgIGNvbnN0IGlzT2JqZWN0ID0gdmFsID0+IE9iamVjdCh2YWwpID09PSB2YWw7JGjNj19vbmNlLmlzT2JqZWN0KGlzT2JqZWN0KTtcbmhhcmRlbihpc09iamVjdCk7XG5cbi8qXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBpc1R5cGVkQXJyYXkgPSBvYmplY3QgPT4ge1xuICAvL1xuICBjb25zdCB0YWcgPSBhcHBseShnZXRUeXBlZEFycmF5VG9TdHJpbmdUYWcsIG9iamVjdCwgW10pO1xuICByZXR1cm4gdGFnICE9PSB1bmRlZmluZWQ7XG59OyRozY9fb25jZS5pc1R5cGVkQXJyYXkoaXNUeXBlZEFycmF5KTtcbmhhcmRlbihpc1R5cGVkQXJyYXkpO1xuXG4gICAgICAgY29uc3QgUEFTU19TVFlMRSA9IFN5bWJvbC5mb3IoJ3Bhc3NTdHlsZScpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5QQVNTX1NUWUxFKFBBU1NfU1RZTEUpO1xuICAgICAgIGNvbnN0IGNhbkJlTWV0aG9kID0gZnVuYyA9PlxuICB0eXBlb2YgZnVuYyA9PT0gJ2Z1bmN0aW9uJyAmJiAhKFBBU1NfU1RZTEUgaW4gZnVuYyk7JGjNj19vbmNlLmNhbkJlTWV0aG9kKGNhbkJlTWV0aG9kKTtcbmhhcmRlbihjYW5CZU1ldGhvZCk7XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRDaGVja2VyID0gKGNvbmQsIGRldGFpbHMpID0+IHtcbiAgYXNzZXJ0KGNvbmQsIGRldGFpbHMpO1xuICByZXR1cm4gdHJ1ZTtcbn07JGjNj19vbmNlLmFzc2VydENoZWNrZXIoYXNzZXJ0Q2hlY2tlcik7XG5oYXJkZW4oYXNzZXJ0Q2hlY2tlcik7XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IENYID0gY2hlY2sgPT4ge1xuICBjb25zdCByZWplY3QgPSAoVCwgLi4uc3VicykgPT4gY2hlY2soZmFsc2UsIFgoVCwgLi4uc3VicykpO1xuICByZXR1cm4gcmVqZWN0O1xufTskaM2PX29uY2UuQ1goQ1gpO1xuaGFyZGVuKENYKTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBnZXRPd25EYXRhRGVzY3JpcHRvciA9IChcbiAgY2FuZGlkYXRlLFxuICBwcm9wTmFtZSxcbiAgc2hvdWxkQmVFbnVtZXJhYmxlLFxuICBjaGVjayxcbikgPT4ge1xuICBjb25zdCBkZXNjID0gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChcbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY2FuZGlkYXRlLCBwcm9wTmFtZSlcbiAgKTtcbiAgcmV0dXJuIChkZXNjICE9PSB1bmRlZmluZWQgfHxcbiAgICAoISFjaGVjayAmJiBDWChjaGVjaylgJHtxKHByb3BOYW1lKX0gcHJvcGVydHkgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApKSAmJlxuICAgIChoYXNPd25Qcm9wZXJ0eU9mKGRlc2MsICd2YWx1ZScpIHx8XG4gICAgICAoISFjaGVjayAmJlxuICAgICAgICBDWChcbiAgICAgICAgICBjaGVjayxcbiAgICAgICAgKWAke3EocHJvcE5hbWUpfSBtdXN0IG5vdCBiZSBhbiBhY2Nlc3NvciBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgKHNob3VsZEJlRW51bWVyYWJsZVxuICAgICAgPyBkZXNjLmVudW1lcmFibGUgfHxcbiAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICBDWChcbiAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgIClgJHtxKHByb3BOYW1lKX0gbXVzdCBiZSBhbiBlbnVtZXJhYmxlIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gKVxuICAgICAgOiAhZGVzYy5lbnVtZXJhYmxlIHx8XG4gICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgQ1goXG4gICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICApYCR7cShwcm9wTmFtZSl9IG11c3Qgbm90IGJlIGFuIGVudW1lcmFibGUgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWApKVxuICAgID8gZGVzY1xuICAgIDogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICgvKiAgICAgICAgICAgICAgICAgICovICh1bmRlZmluZWQpKTtcbn07JGjNj19vbmNlLmdldE93bkRhdGFEZXNjcmlwdG9yKGdldE93bkRhdGFEZXNjcmlwdG9yKTtcbmhhcmRlbihnZXRPd25EYXRhRGVzY3JpcHRvcik7XG5cbi8qXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBnZXRUYWcgPSB0YWdSZWNvcmQgPT4gdGFnUmVjb3JkW1N5bWJvbC50b1N0cmluZ1RhZ107JGjNj19vbmNlLmdldFRhZyhnZXRUYWcpO1xuaGFyZGVuKGdldFRhZyk7XG5cbiAgICAgICBjb25zdCBjaGVja1Bhc3NTdHlsZSA9IChvYmosIHBhc3NTdHlsZSwgZXhwZWN0ZWRQYXNzU3R5bGUsIGNoZWNrKSA9PiB7XG4gIHJldHVybiAoXG4gICAgcGFzc1N0eWxlID09PSBleHBlY3RlZFBhc3NTdHlsZSB8fFxuICAgICghIWNoZWNrICYmXG4gICAgICBDWChjaGVjaylgRXhwZWN0ZWQgJHtxKGV4cGVjdGVkUGFzc1N0eWxlKX0sIG5vdCAke3EocGFzc1N0eWxlKX06ICR7b2JqfWApXG4gICk7XG59OyRozY9fb25jZS5jaGVja1Bhc3NTdHlsZShjaGVja1Bhc3NTdHlsZSk7XG5oYXJkZW4oY2hlY2tQYXNzU3R5bGUpO1xuXG5jb25zdCBtYWtlQ2hlY2tUYWdSZWNvcmQgPSBjaGVja1Byb3RvID0+IHtcbiAgLypcblxuXG5cblxuICAgKi9cbiAgY29uc3QgY2hlY2tUYWdSZWNvcmQgPSAodGFnUmVjb3JkLCBleHBlY3RlZFBhc3NTdHlsZSwgY2hlY2spID0+IHtcbiAgICByZXR1cm4gKFxuICAgICAgKGlzT2JqZWN0KHRhZ1JlY29yZCkgfHxcbiAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICBDWChjaGVjaylgQSBub24tb2JqZWN0IGNhbm5vdCBiZSBhIHRhZ1JlY29yZDogJHt0YWdSZWNvcmR9YCkpICYmXG4gICAgICAoaXNGcm96ZW4odGFnUmVjb3JkKSB8fFxuICAgICAgICAoISFjaGVjayAmJiBDWChjaGVjaylgQSB0YWdSZWNvcmQgbXVzdCBiZSBmcm96ZW46ICR7dGFnUmVjb3JkfWApKSAmJlxuICAgICAgKCFpc0FycmF5KHRhZ1JlY29yZCkgfHxcbiAgICAgICAgKCEhY2hlY2sgJiYgQ1goY2hlY2spYEFuIGFycmF5IGNhbm5vdCBiZSBhIHRhZ1JlY29yZDogJHt0YWdSZWNvcmR9YCkpICYmXG4gICAgICBjaGVja1Bhc3NTdHlsZShcbiAgICAgICAgdGFnUmVjb3JkLFxuICAgICAgICBnZXRPd25EYXRhRGVzY3JpcHRvcih0YWdSZWNvcmQsIFBBU1NfU1RZTEUsIGZhbHNlLCBjaGVjaykudmFsdWUsXG4gICAgICAgIGV4cGVjdGVkUGFzc1N0eWxlLFxuICAgICAgICBjaGVjayxcbiAgICAgICkgJiZcbiAgICAgICh0eXBlb2YgZ2V0T3duRGF0YURlc2NyaXB0b3IodGFnUmVjb3JkLCBTeW1ib2wudG9TdHJpbmdUYWcsIGZhbHNlLCBjaGVjaylcbiAgICAgICAgLnZhbHVlID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgIENYKFxuICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgKWBBIFtTeW1ib2wudG9TdHJpbmdUYWddLW5hbWVkIHByb3BlcnR5IG11c3QgYmUgYSBzdHJpbmc6ICR7dGFnUmVjb3JkfWApKSAmJlxuICAgICAgY2hlY2tQcm90byh0YWdSZWNvcmQsIGdldFByb3RvdHlwZU9mKHRhZ1JlY29yZCksIGNoZWNrKVxuICAgICk7XG4gIH07XG4gIHJldHVybiBoYXJkZW4oY2hlY2tUYWdSZWNvcmQpO1xufTtcblxuICAgICAgIGNvbnN0IGNoZWNrVGFnUmVjb3JkID0gbWFrZUNoZWNrVGFnUmVjb3JkKFxuICAodmFsLCBwcm90bywgY2hlY2spID0+XG4gICAgcHJvdG8gPT09IG9iamVjdFByb3RvdHlwZSB8fFxuICAgICghIWNoZWNrICYmXG4gICAgICBjaGVjayhmYWxzZSwgWGBBIHRhZ1JlY29yZCBtdXN0IGluaGVyaXQgZnJvbSBPYmplY3QucHJvdG90eXBlOiAke3ZhbH1gKSksXG4pOyRozY9fb25jZS5jaGVja1RhZ1JlY29yZChjaGVja1RhZ1JlY29yZCk7XG5oYXJkZW4oY2hlY2tUYWdSZWNvcmQpO1xuXG4gICAgICAgY29uc3QgY2hlY2tGdW5jdGlvblRhZ1JlY29yZCA9IG1ha2VDaGVja1RhZ1JlY29yZChcbiAgKHZhbCwgcHJvdG8sIGNoZWNrKSA9PlxuICAgIHByb3RvID09PSBmdW5jdGlvblByb3RvdHlwZSB8fFxuICAgIChwcm90byAhPT0gbnVsbCAmJiBnZXRQcm90b3R5cGVPZihwcm90bykgPT09IGZ1bmN0aW9uUHJvdG90eXBlKSB8fFxuICAgICghIWNoZWNrICYmXG4gICAgICBjaGVjayhcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIFhgRm9yIGZ1bmN0aW9ucywgYSB0YWdSZWNvcmQgbXVzdCBpbmhlcml0IGZyb20gRnVuY3Rpb24ucHJvdG90eXBlOiAke3ZhbH1gLFxuICAgICAgKSksXG4pOyRozY9fb25jZS5jaGVja0Z1bmN0aW9uVGFnUmVjb3JkKGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQpO1xuaGFyZGVuKGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaGFzT3duUHJvcGVydHlPZiI6WyJoYXNPd25Qcm9wZXJ0eU9mIl0sImlzT2JqZWN0IjpbImlzT2JqZWN0Il0sImlzVHlwZWRBcnJheSI6WyJpc1R5cGVkQXJyYXkiXSwiUEFTU19TVFlMRSI6WyJQQVNTX1NUWUxFIl0sImNhbkJlTWV0aG9kIjpbImNhbkJlTWV0aG9kIl0sImFzc2VydENoZWNrZXIiOlsiYXNzZXJ0Q2hlY2tlciJdLCJDWCI6WyJDWCJdLCJnZXRPd25EYXRhRGVzY3JpcHRvciI6WyJnZXRPd25EYXRhRGVzY3JpcHRvciJdLCJnZXRUYWciOlsiZ2V0VGFnIl0sImNoZWNrUGFzc1N0eWxlIjpbImNoZWNrUGFzc1N0eWxlIl0sImNoZWNrVGFnUmVjb3JkIjpbImNoZWNrVGFnUmVjb3JkIl0sImNoZWNrRnVuY3Rpb25UYWdSZWNvcmQiOlsiY2hlY2tGdW5jdGlvblRhZ1JlY29yZCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAMnW2t0ysAANMrAAAqAAAAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL3Bhc3NTdHlsZU9mLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Byb21pc2Uta2l0IiwiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vY29weUFycmF5LmpzIiwiLi9jb3B5UmVjb3JkLmpzIiwiLi90YWdnZWQuanMiLCIuL2Vycm9yLmpzIiwiLi9yZW1vdGFibGUuanMiLCIuL3N5bWJvbC5qcyIsIi4vc2FmZS1wcm9taXNlLmpzIiwiLi9zdHJpbmcuanMiXSwiZXhwb3J0cyI6WyJQYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbCIsImFzc2VydFBhc3NhYmxlIiwiaXNQYXNzYWJsZSIsInBhc3NTdHlsZU9mIiwidG9QYXNzYWJsZUVycm9yIiwidG9UaHJvd2FibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBpc1Byb21pc2UsWCxGYWlsLHEsYW5ub3RhdGVFcnJvcixtYWtlRXJyb3IsaXNPYmplY3QsaXNUeXBlZEFycmF5LFBBU1NfU1RZTEUsYXNzZXJ0Q2hlY2tlcixDb3B5QXJyYXlIZWxwZXIsQ29weVJlY29yZEhlbHBlcixUYWdnZWRIZWxwZXIsRXJyb3JIZWxwZXIsY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MsY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IsZ2V0RXJyb3JDb25zdHJ1Y3Rvcixpc0Vycm9yTGlrZSxSZW1vdGFibGVIZWxwZXIsYXNzZXJ0UGFzc2FibGVTeW1ib2wsYXNzZXJ0U2FmZVByb21pc2UsYXNzZXJ0UGFzc2FibGVTdHJpbmc7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsWyRozY9fYSA9PiAoaXNQcm9taXNlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJhbm5vdGF0ZUVycm9yXCIsWyRozY9fYSA9PiAoYW5ub3RhdGVFcnJvciA9ICRozY9fYSldXSxbXCJtYWtlRXJyb3JcIixbJGjNj19hID0+IChtYWtlRXJyb3IgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJpc09iamVjdFwiLFskaM2PX2EgPT4gKGlzT2JqZWN0ID0gJGjNj19hKV1dLFtcImlzVHlwZWRBcnJheVwiLFskaM2PX2EgPT4gKGlzVHlwZWRBcnJheSA9ICRozY9fYSldXSxbXCJQQVNTX1NUWUxFXCIsWyRozY9fYSA9PiAoUEFTU19TVFlMRSA9ICRozY9fYSldXSxbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXV1dLFtcIi4vY29weUFycmF5LmpzXCIsIFtbXCJDb3B5QXJyYXlIZWxwZXJcIixbJGjNj19hID0+IChDb3B5QXJyYXlIZWxwZXIgPSAkaM2PX2EpXV1dXSxbXCIuL2NvcHlSZWNvcmQuanNcIiwgW1tcIkNvcHlSZWNvcmRIZWxwZXJcIixbJGjNj19hID0+IChDb3B5UmVjb3JkSGVscGVyID0gJGjNj19hKV1dXV0sW1wiLi90YWdnZWQuanNcIiwgW1tcIlRhZ2dlZEhlbHBlclwiLFskaM2PX2EgPT4gKFRhZ2dlZEhlbHBlciA9ICRozY9fYSldXV1dLFtcIi4vZXJyb3IuanNcIiwgW1tcIkVycm9ySGVscGVyXCIsWyRozY9fYSA9PiAoRXJyb3JIZWxwZXIgPSAkaM2PX2EpXV0sW1wiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2NcIixbJGjNj19hID0+IChjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyA9ICRozY9fYSldXSxbXCJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclwiLFskaM2PX2EgPT4gKGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yID0gJGjNj19hKV1dLFtcImdldEVycm9yQ29uc3RydWN0b3JcIixbJGjNj19hID0+IChnZXRFcnJvckNvbnN0cnVjdG9yID0gJGjNj19hKV1dLFtcImlzRXJyb3JMaWtlXCIsWyRozY9fYSA9PiAoaXNFcnJvckxpa2UgPSAkaM2PX2EpXV1dXSxbXCIuL3JlbW90YWJsZS5qc1wiLCBbW1wiUmVtb3RhYmxlSGVscGVyXCIsWyRozY9fYSA9PiAoUmVtb3RhYmxlSGVscGVyID0gJGjNj19hKV1dXV0sW1wiLi9zeW1ib2wuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV1dXSxbXCIuL3NhZmUtcHJvbWlzZS5qc1wiLCBbW1wiYXNzZXJ0U2FmZVByb21pc2VcIixbJGjNj19hID0+IChhc3NlcnRTYWZlUHJvbWlzZSA9ICRozY9fYSldXV1dLFtcIi4vc3RyaW5nLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVN0cmluZ1wiLFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlU3RyaW5nID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBpc0Zyb3plbiwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycywgdmFsdWVzIH0gPSBPYmplY3Q7XG5cbi8qXG5cblxuICovXG5cbmNvbnN0IG1ha2VIZWxwZXJUYWJsZSA9IHBhc3NTdHlsZUhlbHBlcnMgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgSGVscGVyVGFibGUgPSB7XG4gICAgX19wcm90b19fOiBudWxsLFxuICAgIGNvcHlBcnJheTogdW5kZWZpbmVkLFxuICAgIGNvcHlSZWNvcmQ6IHVuZGVmaW5lZCxcbiAgICB0YWdnZWQ6IHVuZGVmaW5lZCxcbiAgICBlcnJvcjogdW5kZWZpbmVkLFxuICAgIHJlbW90YWJsZTogdW5kZWZpbmVkLFxuICB9O1xuICBmb3IgKGNvbnN0IGhlbHBlciBvZiBwYXNzU3R5bGVIZWxwZXJzKSB7XG4gICAgY29uc3QgeyBzdHlsZU5hbWUgfSA9IGhlbHBlcjtcbiAgICBzdHlsZU5hbWUgaW4gSGVscGVyVGFibGUgfHwgRmFpbGBVbnJlY29nbml6ZWQgaGVscGVyOiAke3Eoc3R5bGVOYW1lKX1gO1xuICAgIEhlbHBlclRhYmxlW3N0eWxlTmFtZV0gPT09IHVuZGVmaW5lZCB8fFxuICAgICAgRmFpbGBjb25mbGljdGluZyBoZWxwZXJzIGZvciAke3Eoc3R5bGVOYW1lKX1gO1xuICAgIEhlbHBlclRhYmxlW3N0eWxlTmFtZV0gPSBoZWxwZXI7XG4gIH1cbiAgZm9yIChjb25zdCBzdHlsZU5hbWUgb2Ygb3duS2V5cyhIZWxwZXJUYWJsZSkpIHtcbiAgICBIZWxwZXJUYWJsZVtzdHlsZU5hbWVdICE9PSB1bmRlZmluZWQgfHxcbiAgICAgIEZhaWxgbWlzc2luZyBoZWxwZXIgZm9yICR7cShzdHlsZU5hbWUpfWA7XG4gIH1cblxuICByZXR1cm4gaGFyZGVuKEhlbHBlclRhYmxlKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBhc3NlcnRWYWxpZCA9IChoZWxwZXIsIGNhbmRpZGF0ZSwgcGFzc1N0eWxlT2ZSZWN1cikgPT4ge1xuICBoZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsIGFzc2VydENoZWNrZXIpO1xuICBoZWxwZXIuYXNzZXJ0UmVzdFZhbGlkKGNhbmRpZGF0ZSwgcGFzc1N0eWxlT2ZSZWN1cik7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZVBhc3NTdHlsZU9mID0gcGFzc1N0eWxlSGVscGVycyA9PiB7XG4gIGNvbnN0IEhlbHBlclRhYmxlID0gbWFrZUhlbHBlclRhYmxlKHBhc3NTdHlsZUhlbHBlcnMpO1xuICBjb25zdCByZW1vdGFibGVIZWxwZXIgPSBIZWxwZXJUYWJsZS5yZW1vdGFibGU7XG5cbiAgLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBwYXNzU3R5bGVNZW1vID0gbmV3IFdlYWtNYXAoKTtcblxuICAvKlxuXG4gICAqL1xuICAvL1xuICBjb25zdCBwYXNzU3R5bGVPZiA9IHBhc3NhYmxlID0+IHtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBjb25zdCBpblByb2dyZXNzID0gbmV3IFNldCgpO1xuXG4gICAgY29uc3QgcGFzc1N0eWxlT2ZSZWN1ciA9IGlubmVyID0+IHtcbiAgICAgIGNvbnN0IGlubmVySXNPYmplY3QgPSBpc09iamVjdChpbm5lcik7XG4gICAgICBpZiAoaW5uZXJJc09iamVjdCkge1xuICAgICAgICBjb25zdCBpbm5lclN0eWxlID0gcGFzc1N0eWxlTWVtby5nZXQoaW5uZXIpO1xuICAgICAgICBpZiAoaW5uZXJTdHlsZSkge1xuICAgICAgICAgIHJldHVybiBpbm5lclN0eWxlO1xuICAgICAgICB9XG4gICAgICAgICFpblByb2dyZXNzLmhhcyhpbm5lcikgfHxcbiAgICAgICAgICBGYWlsYFBhc3MtYnktY29weSBkYXRhIGNhbm5vdCBiZSBjeWNsaWMgJHtpbm5lcn1gO1xuICAgICAgICBpblByb2dyZXNzLmFkZChpbm5lcik7XG4gICAgICB9XG4gICAgICAvL1xuICAgICAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2ZJbnRlcm5hbChpbm5lcik7XG4gICAgICBpZiAoaW5uZXJJc09iamVjdCkge1xuICAgICAgICBwYXNzU3R5bGVNZW1vLnNldChpbm5lciwgcGFzc1N0eWxlKTtcbiAgICAgICAgaW5Qcm9ncmVzcy5kZWxldGUoaW5uZXIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBhc3NTdHlsZTtcbiAgICB9O1xuXG4gICAgY29uc3QgcGFzc1N0eWxlT2ZJbnRlcm5hbCA9IGlubmVyID0+IHtcbiAgICAgIGNvbnN0IHR5cGVzdHIgPSB0eXBlb2YgaW5uZXI7XG4gICAgICBzd2l0Y2ggKHR5cGVzdHIpIHtcbiAgICAgICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgIGNhc2UgJ2JpZ2ludCc6IHtcbiAgICAgICAgICByZXR1cm4gdHlwZXN0cjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzdHJpbmcnOiB7XG4gICAgICAgICAgYXNzZXJ0UGFzc2FibGVTdHJpbmcoaW5uZXIpO1xuICAgICAgICAgIHJldHVybiAnc3RyaW5nJztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzeW1ib2wnOiB7XG4gICAgICAgICAgYXNzZXJ0UGFzc2FibGVTeW1ib2woaW5uZXIpO1xuICAgICAgICAgIHJldHVybiAnc3ltYm9sJztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdvYmplY3QnOiB7XG4gICAgICAgICAgaWYgKGlubmVyID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gJ251bGwnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWlzRnJvemVuKGlubmVyKSkge1xuICAgICAgICAgICAgYXNzZXJ0LmZhaWwoXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIGlzVHlwZWRBcnJheShpbm5lcilcbiAgICAgICAgICAgICAgICA/IFhgQ2Fubm90IHBhc3MgbXV0YWJsZSB0eXBlZCBhcnJheXMgbGlrZSAke2lubmVyfS5gXG4gICAgICAgICAgICAgICAgOiBYYENhbm5vdCBwYXNzIG5vbi1mcm96ZW4gb2JqZWN0cyBsaWtlICR7aW5uZXJ9LiBVc2UgaGFyZGVuKClgLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGlzUHJvbWlzZShpbm5lcikpIHtcbiAgICAgICAgICAgIGFzc2VydFNhZmVQcm9taXNlKGlubmVyKTtcbiAgICAgICAgICAgIHJldHVybiAncHJvbWlzZSc7XG4gICAgICAgICAgfVxuICAgICAgICAgIHR5cGVvZiBpbm5lci50aGVuICE9PSAnZnVuY3Rpb24nIHx8XG4gICAgICAgICAgICBGYWlsYENhbm5vdCBwYXNzIG5vbi1wcm9taXNlIHRoZW5hYmxlc2A7XG4gICAgICAgICAgY29uc3QgcGFzc1N0eWxlVGFnID0gaW5uZXJbUEFTU19TVFlMRV07XG4gICAgICAgICAgaWYgKHBhc3NTdHlsZVRhZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhc3NlcnQudHlwZW9mKHBhc3NTdHlsZVRhZywgJ3N0cmluZycpO1xuICAgICAgICAgICAgY29uc3QgaGVscGVyID0gSGVscGVyVGFibGVbcGFzc1N0eWxlVGFnXTtcbiAgICAgICAgICAgIGhlbHBlciAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAgIEZhaWxgVW5yZWNvZ25pemVkIFBhc3NTdHlsZTogJHtxKHBhc3NTdHlsZVRhZyl9YDtcbiAgICAgICAgICAgIGFzc2VydFZhbGlkKGhlbHBlciwgaW5uZXIsIHBhc3NTdHlsZU9mUmVjdXIpO1xuICAgICAgICAgICAgcmV0dXJuIC8qICAgICAgICAgICAgICAgICAgICAqLyAocGFzc1N0eWxlVGFnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yIChjb25zdCBoZWxwZXIgb2YgcGFzc1N0eWxlSGVscGVycykge1xuICAgICAgICAgICAgaWYgKGhlbHBlci5jYW5CZVZhbGlkKGlubmVyKSkge1xuICAgICAgICAgICAgICBoZWxwZXIuYXNzZXJ0UmVzdFZhbGlkKGlubmVyLCBwYXNzU3R5bGVPZlJlY3VyKTtcbiAgICAgICAgICAgICAgcmV0dXJuIGhlbHBlci5zdHlsZU5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGFzc2VydFZhbGlkKHJlbW90YWJsZUhlbHBlciwgaW5uZXIsIHBhc3NTdHlsZU9mUmVjdXIpO1xuICAgICAgICAgIHJldHVybiAncmVtb3RhYmxlJztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdmdW5jdGlvbic6IHtcbiAgICAgICAgICBpc0Zyb3plbihpbm5lcikgfHxcbiAgICAgICAgICAgIEZhaWxgQ2Fubm90IHBhc3Mgbm9uLWZyb3plbiBvYmplY3RzIGxpa2UgJHtpbm5lcn0uIFVzZSBoYXJkZW4oKWA7XG4gICAgICAgICAgdHlwZW9mIGlubmVyLnRoZW4gIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgICAgIEZhaWxgQ2Fubm90IHBhc3Mgbm9uLXByb21pc2UgdGhlbmFibGVzYDtcbiAgICAgICAgICBhc3NlcnRWYWxpZChyZW1vdGFibGVIZWxwZXIsIGlubmVyLCBwYXNzU3R5bGVPZlJlY3VyKTtcbiAgICAgICAgICByZXR1cm4gJ3JlbW90YWJsZSc7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IGFzc2VydC5mYWlsKFhgVW5yZWNvZ25pemVkIHR5cGVvZiAke3EodHlwZXN0cil9YCwgVHlwZUVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICByZXR1cm4gcGFzc1N0eWxlT2ZSZWN1cihwYXNzYWJsZSk7XG4gIH07XG4gIHJldHVybiBoYXJkZW4ocGFzc1N0eWxlT2YpO1xufTtcblxuICAgICAgIGNvbnN0IFBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sID0gU3ltYm9sLmZvcignQGVuZG8gcGFzc1N0eWxlT2YnKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLlBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sKFBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sKTtcbiAgICAgICBjb25zdCBwYXNzU3R5bGVPZiA9XG4gIChnbG9iYWxUaGlzICYmIGdsb2JhbFRoaXNbUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2xdKSB8fFxuICBtYWtlUGFzc1N0eWxlT2YoW1xuICAgIENvcHlBcnJheUhlbHBlcixcbiAgICBDb3B5UmVjb3JkSGVscGVyLFxuICAgIFRhZ2dlZEhlbHBlcixcbiAgICBFcnJvckhlbHBlcixcbiAgICBSZW1vdGFibGVIZWxwZXIsXG4gIF0pOyRozY9fb25jZS5wYXNzU3R5bGVPZihwYXNzU3R5bGVPZik7XG5cbiAgICAgICBjb25zdCBhc3NlcnRQYXNzYWJsZSA9IHZhbCA9PiB7XG4gIHBhc3NTdHlsZU9mKHZhbCk7IC8vXG59OyRozY9fb25jZS5hc3NlcnRQYXNzYWJsZShhc3NlcnRQYXNzYWJsZSk7XG5oYXJkZW4oYXNzZXJ0UGFzc2FibGUpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGlzUGFzc2FibGUgPSBzcGVjaW1lbiA9PiB7XG4gIHRyeSB7XG4gICAgLy9cbiAgICAvL1xuICAgIHJldHVybiBwYXNzU3R5bGVPZihzcGVjaW1lbikgIT09IHVuZGVmaW5lZDtcbiAgfSBjYXRjaCAoXykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufTskaM2PX29uY2UuaXNQYXNzYWJsZShpc1Bhc3NhYmxlKTtcbmhhcmRlbihpc1Bhc3NhYmxlKTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgaXNQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjID0gKG5hbWUsIGRlc2MpID0+XG4gIGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKG5hbWUsIGRlc2MsIHBhc3NTdHlsZU9mKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCB0b1Bhc3NhYmxlRXJyb3IgPSBlcnIgPT4ge1xuICBoYXJkZW4oZXJyKTtcbiAgaWYgKGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yKGVyciwgcGFzc1N0eWxlT2YpKSB7XG4gICAgcmV0dXJuIGVycjtcbiAgfVxuICBjb25zdCB7IG5hbWUsIG1lc3NhZ2UgfSA9IGVycjtcbiAgY29uc3QgeyBjYXVzZTogY2F1c2VEZXNjLCBlcnJvcnM6IGVycm9yc0Rlc2MgfSA9XG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhlcnIpO1xuICBsZXQgY2F1c2U7XG4gIGxldCBlcnJvcnM7XG4gIGlmIChjYXVzZURlc2MgJiYgaXNQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKCdjYXVzZScsIGNhdXNlRGVzYykpIHtcbiAgICBjYXVzZSA9IGNhdXNlRGVzYy52YWx1ZTtcbiAgfVxuICBpZiAoZXJyb3JzRGVzYyAmJiBpc1Bhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MoJ2Vycm9ycycsIGVycm9yc0Rlc2MpKSB7XG4gICAgZXJyb3JzID0gZXJyb3JzRGVzYy52YWx1ZTtcbiAgfVxuXG4gIGNvbnN0IGVyckNvbnN0cnVjdG9yID0gZ2V0RXJyb3JDb25zdHJ1Y3RvcihgJHtuYW1lfWApIHx8IEVycm9yO1xuICBjb25zdCBuZXdFcnJvciA9IG1ha2VFcnJvcihgJHttZXNzYWdlfWAsIGVyckNvbnN0cnVjdG9yLCB7XG4gICAgLy9cbiAgICBjYXVzZSxcbiAgICBlcnJvcnMsXG4gIH0pO1xuICAvL1xuICBoYXJkZW4obmV3RXJyb3IpO1xuICAvL1xuICAvL1xuICAvL1xuICBhbm5vdGF0ZUVycm9yKG5ld0Vycm9yLCBYYGNvcGllZCBmcm9tIGVycm9yICR7ZXJyfWApO1xuICBwYXNzU3R5bGVPZihuZXdFcnJvcikgPT09ICdlcnJvcicgfHxcbiAgICBGYWlsYEV4cGVjdGVkICR7bmV3RXJyb3J9IHRvIGJlIGEgcGFzc2FibGUgZXJyb3JgO1xuICByZXR1cm4gbmV3RXJyb3I7XG59OyRozY9fb25jZS50b1Bhc3NhYmxlRXJyb3IodG9QYXNzYWJsZUVycm9yKTtcbmhhcmRlbih0b1Bhc3NhYmxlRXJyb3IpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgdG9UaHJvd2FibGUgPSBzcGVjaW1lbiA9PiB7XG4gIGhhcmRlbihzcGVjaW1lbik7XG4gIGlmIChpc0Vycm9yTGlrZShzcGVjaW1lbikpIHtcbiAgICByZXR1cm4gdG9QYXNzYWJsZUVycm9yKC8qICAgICAgICAgICAgICAgICovIChzcGVjaW1lbikpO1xuICB9XG4gIC8vXG4gIC8vXG4gIC8vXG4gIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHNwZWNpbWVuKTtcbiAgaWYgKGlzT2JqZWN0KHNwZWNpbWVuKSkge1xuICAgIHN3aXRjaCAocGFzc1N0eWxlKSB7XG4gICAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gLyogICAgICAgICAgICAgICAgICAgICovIChzcGVjaW1lbik7XG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgICAgIGVsZW1lbnQgPT09IHRvVGhyb3dhYmxlKGVsZW1lbnQpIHx8XG4gICAgICAgICAgICBGYWlsYG5lc3RlZCB0b1Rocm93YWJsZSBjb2VyY2lvbiBub3QgeWV0IHN1cHBvcnRlZCAke2VsZW1lbnR9YDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICAgIGNvbnN0IHJlYyA9IC8qICAgICAgICAgICAgICAgICAgICAgKi8gKHNwZWNpbWVuKTtcbiAgICAgICAgZm9yIChjb25zdCB2YWwgb2YgdmFsdWVzKHJlYykpIHtcbiAgICAgICAgICB2YWwgPT09IHRvVGhyb3dhYmxlKHZhbCkgfHxcbiAgICAgICAgICAgIEZhaWxgbmVzdGVkIHRvVGhyb3dhYmxlIGNvZXJjaW9uIG5vdCB5ZXQgc3VwcG9ydGVkICR7dmFsfWA7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAgIGNvbnN0IHRnID0gLyogICAgICAgICAgICAgICAgICAgICAqLyAoc3BlY2ltZW4pO1xuICAgICAgICBjb25zdCB7IHBheWxvYWQgfSA9IHRnO1xuICAgICAgICBwYXlsb2FkID09PSB0b1Rocm93YWJsZShwYXlsb2FkKSB8fFxuICAgICAgICAgIEZhaWxgbmVzdGVkIHRvVGhyb3dhYmxlIGNvZXJjaW9uIG5vdCB5ZXQgc3VwcG9ydGVkICR7cGF5bG9hZH1gO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICBjb25zdCBlciA9IC8qICAgICAgICAgICAgICAgICovIChzcGVjaW1lbik7XG4gICAgICAgIGVyID09PSB0b1Rocm93YWJsZShlcikgfHxcbiAgICAgICAgICBGYWlsYG5lc3RlZCB0b1Rocm93YWJsZSBjb2VyY2lvbiBub3QgeWV0IHN1cHBvcnRlZCAke2VyfWA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBGYWlsYEEgJHtxKHBhc3NTdHlsZSl9IGlzIG5vdCB0aHJvd2FibGU6ICR7c3BlY2ltZW59YDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoc3BlY2ltZW4pO1xufTskaM2PX29uY2UudG9UaHJvd2FibGUodG9UaHJvd2FibGUpO1xuaGFyZGVuKHRvVGhyb3dhYmxlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sIjpbIlBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sIl0sInBhc3NTdHlsZU9mIjpbInBhc3NTdHlsZU9mIl0sImFzc2VydFBhc3NhYmxlIjpbImFzc2VydFBhc3NhYmxlIl0sImlzUGFzc2FibGUiOlsiaXNQYXNzYWJsZSJdLCJ0b1Bhc3NhYmxlRXJyb3IiOlsidG9QYXNzYWJsZUVycm9yIl0sInRvVGhyb3dhYmxlIjpbInRvVGhyb3dhYmxlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAOBJ0euHAAArhwAACgAAABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvcmVtb3RhYmxlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJSZW1vdGFibGVIZWxwZXIiLCJhc3NlcnRJZmFjZSIsImdldEludGVyZmFjZU9mIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxxLGFzc2VydENoZWNrZXIsY2FuQmVNZXRob2QsaGFzT3duUHJvcGVydHlPZixQQVNTX1NUWUxFLGNoZWNrVGFnUmVjb3JkLGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQsaXNPYmplY3QsZ2V0VGFnLENYOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcImNhbkJlTWV0aG9kXCIsWyRozY9fYSA9PiAoY2FuQmVNZXRob2QgPSAkaM2PX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLFskaM2PX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaM2PX2EpXV0sW1wiUEFTU19TVFlMRVwiLFskaM2PX2EgPT4gKFBBU1NfU1RZTEUgPSAkaM2PX2EpXV0sW1wiY2hlY2tUYWdSZWNvcmRcIixbJGjNj19hID0+IChjaGVja1RhZ1JlY29yZCA9ICRozY9fYSldXSxbXCJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkXCIsWyRozY9fYSA9PiAoY2hlY2tGdW5jdGlvblRhZ1JlY29yZCA9ICRozY9fYSldXSxbXCJpc09iamVjdFwiLFskaM2PX2EgPT4gKGlzT2JqZWN0ID0gJGjNj19hKV1dLFtcImdldFRhZ1wiLFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXSxbXCJDWFwiLFskaM2PX2EgPT4gKENYID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuXG4gKi9cblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBpc0FycmF5IH0gPSBBcnJheTtcbmNvbnN0IHtcbiAgZ2V0UHJvdG90eXBlT2YsXG4gIGlzRnJvemVuLFxuICBwcm90b3R5cGU6IG9iamVjdFByb3RvdHlwZSxcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyxcbn0gPSBPYmplY3Q7XG5cbi8qXG5cblxuICovXG5jb25zdCBjaGVja0lmYWNlID0gKGlmYWNlLCBjaGVjaykgPT4ge1xuICByZXR1cm4gKFxuICAgIC8vXG4gICAgKHR5cGVvZiBpZmFjZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICghIWNoZWNrICYmXG4gICAgICAgIENYKFxuICAgICAgICAgIGNoZWNrLFxuICAgICAgICApYEZvciBub3csIGludGVyZmFjZSAke2lmYWNlfSBtdXN0IGJlIGEgc3RyaW5nOyB1bmltcGxlbWVudGVkYCkpICYmXG4gICAgKGlmYWNlID09PSAnUmVtb3RhYmxlJyB8fFxuICAgICAgaWZhY2Uuc3RhcnRzV2l0aCgnQWxsZWdlZDogJykgfHxcbiAgICAgIGlmYWNlLnN0YXJ0c1dpdGgoJ0RlYnVnTmFtZTogJykgfHxcbiAgICAgICghIWNoZWNrICYmXG4gICAgICAgIENYKGNoZWNrKWBGb3Igbm93LCBpZmFjZSAke3EoXG4gICAgICAgICAgaWZhY2UsXG4gICAgICAgICl9IG11c3QgYmUgXCJSZW1vdGFibGVcIiBvciBiZWdpbiB3aXRoIFwiQWxsZWdlZDogXCIgb3IgXCJEZWJ1Z05hbWU6IFwiOyB1bmltcGxlbWVudGVkYCkpXG4gICk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydElmYWNlID0gaWZhY2UgPT4gY2hlY2tJZmFjZShpZmFjZSwgYXNzZXJ0Q2hlY2tlcik7JGjNj19vbmNlLmFzc2VydElmYWNlKGFzc2VydElmYWNlKTtcbmhhcmRlbihhc3NlcnRJZmFjZSk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGNoZWNrUmVtb3RhYmxlUHJvdG9PZiA9IChvcmlnaW5hbCwgY2hlY2spID0+IHtcbiAgaXNPYmplY3Qob3JpZ2luYWwpIHx8XG4gICAgRmFpbGBSZW1vdGFibGVzIG11c3QgYmUgb2JqZWN0cyBvciBmdW5jdGlvbnM6ICR7b3JpZ2luYWx9YDtcblxuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICBjb25zdCBwcm90byA9IGdldFByb3RvdHlwZU9mKG9yaWdpbmFsKTtcbiAgaWYgKFxuICAgIHByb3RvID09PSBvYmplY3RQcm90b3R5cGUgfHxcbiAgICBwcm90byA9PT0gbnVsbCB8fFxuICAgIHByb3RvID09PSBGdW5jdGlvbi5wcm90b3R5cGVcbiAgKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhY2hlY2sgJiZcbiAgICAgIENYKGNoZWNrKWBSZW1vdGFibGVzIG11c3QgYmUgZXhwbGljaXRseSBkZWNsYXJlZDogJHtxKG9yaWdpbmFsKX1gXG4gICAgKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb3JpZ2luYWwgPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3QgcHJvdG9Qcm90byA9IGdldFByb3RvdHlwZU9mKHByb3RvKTtcbiAgICBpZiAocHJvdG9Qcm90byAhPT0gb2JqZWN0UHJvdG90eXBlICYmIHByb3RvUHJvdG8gIT09IG51bGwpIHtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gY2hlY2tSZW1vdGFibGUocHJvdG8sIGNoZWNrKTtcbiAgICB9XG4gICAgaWYgKCFjaGVja1RhZ1JlY29yZChwcm90bywgJ3JlbW90YWJsZScsIGNoZWNrKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2Ygb3JpZ2luYWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAoIWNoZWNrRnVuY3Rpb25UYWdSZWNvcmQocHJvdG8sICdyZW1vdGFibGUnLCBjaGVjaykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvL1xuICBjb25zdCBwYXNzU3R5bGVLZXkgPSAvKiAgICAgICAgICAgICAgICAgICovIChQQVNTX1NUWUxFKTtcbiAgY29uc3QgdGFnS2V5ID0gLyogICAgICAgICAgICAgICAgICAqLyAoU3ltYm9sLnRvU3RyaW5nVGFnKTtcbiAgY29uc3Qge1xuICAgIC8vXG4gICAgWy8qICAgICAgICAgICAgICAgICAqLyAocGFzc1N0eWxlS2V5KV06IF9wYXNzU3R5bGVEZXNjLFxuICAgIFsvKiAgICAgICAgICAgICAgICAgKi8gKHRhZ0tleSldOiB7IHZhbHVlOiBpZmFjZSB9LFxuICAgIC4uLnJlc3REZXNjc1xuICB9ID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhwcm90byk7XG5cbiAgcmV0dXJuIChcbiAgICAob3duS2V5cyhyZXN0RGVzY3MpLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgQ1goXG4gICAgICAgICAgY2hlY2ssXG4gICAgICAgIClgVW5leHBlY3RlZCBwcm9wZXJ0aWVzIG9uIFJlbW90YWJsZSBQcm90byAke293bktleXMocmVzdERlc2NzKX1gKSkgJiZcbiAgICBjaGVja0lmYWNlKGlmYWNlLCBjaGVjaylcbiAgKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgY29uZmlybWVkUmVtb3RhYmxlcyA9IG5ldyBXZWFrU2V0KCk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGNoZWNrUmVtb3RhYmxlID0gKHZhbCwgY2hlY2spID0+IHtcbiAgaWYgKGNvbmZpcm1lZFJlbW90YWJsZXMuaGFzKHZhbCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoIWlzRnJvemVuKHZhbCkpIHtcbiAgICByZXR1cm4gKFxuICAgICAgISFjaGVjayAmJiBDWChjaGVjaylgY2Fubm90IHNlcmlhbGl6ZSBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke3ZhbH1gXG4gICAgKTtcbiAgfVxuICAvL1xuICBpZiAoIVJlbW90YWJsZUhlbHBlci5jYW5CZVZhbGlkKHZhbCwgY2hlY2spKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IGNoZWNrUmVtb3RhYmxlUHJvdG9PZih2YWwsIGNoZWNrKTtcbiAgaWYgKHJlc3VsdCkge1xuICAgIGNvbmZpcm1lZFJlbW90YWJsZXMuYWRkKHZhbCk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGdldEludGVyZmFjZU9mID0gdmFsID0+IHtcbiAgaWYgKFxuICAgICFpc09iamVjdCh2YWwpIHx8XG4gICAgdmFsW1BBU1NfU1RZTEVdICE9PSAncmVtb3RhYmxlJyB8fFxuICAgICFjaGVja1JlbW90YWJsZSh2YWwpXG4gICkge1xuICAgIC8vXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICAvL1xuICByZXR1cm4gZ2V0VGFnKHZhbCk7XG59OyRozY9fb25jZS5nZXRJbnRlcmZhY2VPZihnZXRJbnRlcmZhY2VPZik7XG5oYXJkZW4oZ2V0SW50ZXJmYWNlT2YpO1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IFJlbW90YWJsZUhlbHBlciA9IGhhcmRlbih7XG4gIHN0eWxlTmFtZTogJ3JlbW90YWJsZScsXG5cbiAgY2FuQmVWYWxpZDogKGNhbmRpZGF0ZSwgY2hlY2sgPSB1bmRlZmluZWQpID0+IHtcbiAgICBjb25zdCB2YWxpZFR5cGUgPVxuICAgICAgKGlzT2JqZWN0KGNhbmRpZGF0ZSkgfHxcbiAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICBDWChjaGVjaylgY2Fubm90IHNlcmlhbGl6ZSBub24tb2JqZWN0cyBhcyBSZW1vdGFibGUgJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgICAoIWlzQXJyYXkoY2FuZGlkYXRlKSB8fFxuICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgIENYKGNoZWNrKWBjYW5ub3Qgc2VyaWFsaXplIGFycmF5cyBhcyBSZW1vdGFibGUgJHtjYW5kaWRhdGV9YCkpO1xuICAgIGlmICghdmFsaWRUeXBlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgY29uc3QgZGVzY3MgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGNhbmRpZGF0ZSk7XG4gICAgaWYgKHR5cGVvZiBjYW5kaWRhdGUgPT09ICdvYmplY3QnKSB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHJldHVybiBvd25LZXlzKGRlc2NzKS5ldmVyeShrZXkgPT4ge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgIC8vXG4gICAgICAgICAgKGhhc093blByb3BlcnR5T2YoZGVzY3NbLyogICAgICAgICAgICAgICAgICovIChrZXkpXSwgJ3ZhbHVlJykgfHxcbiAgICAgICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgICAgIENYKGNoZWNrKWBjYW5ub3Qgc2VyaWFsaXplIFJlbW90YWJsZXMgd2l0aCBhY2Nlc3NvcnMgbGlrZSAke3EoXG4gICAgICAgICAgICAgICAgU3RyaW5nKGtleSksXG4gICAgICAgICAgICAgICl9IGluICR7Y2FuZGlkYXRlfWApKSAmJlxuICAgICAgICAgICgoa2V5ID09PSBTeW1ib2wudG9TdHJpbmdUYWcgJiYgY2hlY2tJZmFjZShjYW5kaWRhdGVba2V5XSwgY2hlY2spKSB8fFxuICAgICAgICAgICAgKChjYW5CZU1ldGhvZChjYW5kaWRhdGVba2V5XSkgfHxcbiAgICAgICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgICAgICBDWChjaGVjaylgY2Fubm90IHNlcmlhbGl6ZSBSZW1vdGFibGVzIHdpdGggbm9uLW1ldGhvZHMgbGlrZSAke3EoXG4gICAgICAgICAgICAgICAgICBTdHJpbmcoa2V5KSxcbiAgICAgICAgICAgICAgICApfSBpbiAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgICAgICAgICAgICAgKGtleSAhPT0gUEFTU19TVFlMRSB8fFxuICAgICAgICAgICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgICAgICAgICBDWChjaGVjaylgQSBwYXNzLWJ5LXJlbW90ZSBjYW5ub3Qgc2hhZG93ICR7cShQQVNTX1NUWUxFKX1gKSkpKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgY2FuZGlkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGNvbnN0IHtcbiAgICAgICAgbmFtZTogbmFtZURlc2MsXG4gICAgICAgIGxlbmd0aDogbGVuZ3RoRGVzYyxcbiAgICAgICAgLy9cbiAgICAgICAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHRvU3RyaW5nVGFnRGVzYyxcbiAgICAgICAgLi4ucmVzdERlc2NzXG4gICAgICB9ID0gZGVzY3M7XG4gICAgICBjb25zdCByZXN0S2V5cyA9IG93bktleXMocmVzdERlc2NzKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgICgobmFtZURlc2MgJiYgdHlwZW9mIG5hbWVEZXNjLnZhbHVlID09PSAnc3RyaW5nJykgfHxcbiAgICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgICAgQ1goY2hlY2spYEZhciBmdW5jdGlvbiBuYW1lIG11c3QgYmUgYSBzdHJpbmcsIGluICR7Y2FuZGlkYXRlfWApKSAmJlxuICAgICAgICAoKGxlbmd0aERlc2MgJiYgdHlwZW9mIGxlbmd0aERlc2MudmFsdWUgPT09ICdudW1iZXInKSB8fFxuICAgICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgICBDWChcbiAgICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgICApYEZhciBmdW5jdGlvbiBsZW5ndGggbXVzdCBiZSBhIG51bWJlciwgaW4gJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgICAgICh0b1N0cmluZ1RhZ0Rlc2MgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICgodHlwZW9mIHRvU3RyaW5nVGFnRGVzYy52YWx1ZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgICAgIENYKFxuICAgICAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgICAgICApYEZhciBmdW5jdGlvbiBAQHRvU3RyaW5nVGFnIG11c3QgYmUgYSBzdHJpbmcsIGluICR7Y2FuZGlkYXRlfWApKSAmJlxuICAgICAgICAgICAgY2hlY2tJZmFjZSh0b1N0cmluZ1RhZ0Rlc2MudmFsdWUsIGNoZWNrKSkpICYmXG4gICAgICAgIChyZXN0S2V5cy5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgICAgQ1goXG4gICAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgICAgKWBGYXIgZnVuY3Rpb25zIHVuZXhwZWN0ZWQgcHJvcGVydGllcyBiZXNpZGVzIC5uYW1lIGFuZCAubGVuZ3RoICR7cmVzdEtleXN9YCkpXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gISFjaGVjayAmJiBDWChjaGVjaylgdW5yZWNvZ25pemVkIHR5cGVvZiAke2NhbmRpZGF0ZX1gO1xuICB9LFxuXG4gIGFzc2VydFJlc3RWYWxpZDogY2FuZGlkYXRlID0+IGNoZWNrUmVtb3RhYmxlKGNhbmRpZGF0ZSwgYXNzZXJ0Q2hlY2tlciksXG5cbiAgZXZlcnk6IChfcGFzc2FibGUsIF9mbikgPT4gdHJ1ZSxcbn0pOyRozY9fb25jZS5SZW1vdGFibGVIZWxwZXIoUmVtb3RhYmxlSGVscGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydElmYWNlIjpbImFzc2VydElmYWNlIl0sImdldEludGVyZmFjZU9mIjpbImdldEludGVyZmFjZU9mIl0sIlJlbW90YWJsZUhlbHBlciI6WyJSZW1vdGFibGVIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAx4x/OHoOAAB6DgAAKwAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9zYWZlLXByb21pc2UuanN7ImltcG9ydHMiOlsiQGVuZG8vcHJvbWlzZS1raXQiLCJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0U2FmZVByb21pc2UiLCJpc1NhZmVQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgaXNQcm9taXNlLHEsYXNzZXJ0Q2hlY2tlcixoYXNPd25Qcm9wZXJ0eU9mLENYOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLFskaM2PX2EgPT4gKGlzUHJvbWlzZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsWyRozY9fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRozY9fYSldXSxbXCJDWFwiLFskaM2PX2EgPT4gKENYID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuY29uc3QgeyBpc0Zyb3plbiwgZ2V0UHJvdG90eXBlT2YsIGdldE93blByb3BlcnR5RGVzY3JpcHRvciB9ID0gT2JqZWN0O1xuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyB0b1N0cmluZ1RhZyB9ID0gU3ltYm9sO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBjaGVja1Byb21pc2VPd25LZXlzID0gKHByLCBjaGVjaykgPT4ge1xuICBjb25zdCBrZXlzID0gb3duS2V5cyhwcik7XG5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKlxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCB1bmtub3duS2V5cyA9IGtleXMuZmlsdGVyKFxuICAgIGtleSA9PiB0eXBlb2Yga2V5ICE9PSAnc3ltYm9sJyB8fCAhaGFzT3duUHJvcGVydHlPZihQcm9taXNlLnByb3RvdHlwZSwga2V5KSxcbiAgKTtcblxuICBpZiAodW5rbm93bktleXMubGVuZ3RoICE9PSAwKSB7XG4gICAgcmV0dXJuIENYKFxuICAgICAgY2hlY2ssXG4gICAgKWAke3ByfSAtIE11c3Qgbm90IGhhdmUgYW55IG93biBwcm9wZXJ0aWVzOiAke3EodW5rbm93bktleXMpfWA7XG4gIH1cblxuICAvKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBjaGVja1NhZmVPd25LZXkgPSBrZXkgPT4ge1xuICAgIGlmIChrZXkgPT09IHRvU3RyaW5nVGFnKSB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGNvbnN0IHRhZ0Rlc2MgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHIsIHRvU3RyaW5nVGFnKTtcbiAgICAgIGFzc2VydCh0YWdEZXNjICE9PSB1bmRlZmluZWQpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgKGhhc093blByb3BlcnR5T2YodGFnRGVzYywgJ3ZhbHVlJykgfHxcbiAgICAgICAgICBDWChcbiAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgIClgT3duIEBAdG9TdHJpbmdUYWcgbXVzdCBiZSBhIGRhdGEgcHJvcGVydHksIG5vdCBhbiBhY2Nlc3NvcjogJHtxKHRhZ0Rlc2MpfWApICYmXG4gICAgICAgICh0eXBlb2YgdGFnRGVzYy52YWx1ZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICBDWChcbiAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgIClgT3duIEBAdG9TdHJpbmdUYWcgdmFsdWUgbXVzdCBiZSBhIHN0cmluZzogJHtxKHRhZ0Rlc2MudmFsdWUpfWApICYmXG4gICAgICAgICghdGFnRGVzYy5lbnVtZXJhYmxlIHx8XG4gICAgICAgICAgQ1goY2hlY2spYE93biBAQHRvU3RyaW5nVGFnIG11c3Qgbm90IGJlIGVudW1lcmFibGU6ICR7cSh0YWdEZXNjKX1gKVxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgdmFsID0gcHJba2V5XTtcbiAgICBpZiAodmFsID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJlxuICAgICAgdmFsICE9PSBudWxsICYmXG4gICAgICBpc0Zyb3plbih2YWwpICYmXG4gICAgICBnZXRQcm90b3R5cGVPZih2YWwpID09PSBPYmplY3QucHJvdG90eXBlXG4gICAgKSB7XG4gICAgICBjb25zdCBzdWJLZXlzID0gb3duS2V5cyh2YWwpO1xuICAgICAgaWYgKHN1YktleXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHN1YktleXMubGVuZ3RoID09PSAxICYmXG4gICAgICAgIHN1YktleXNbMF0gPT09ICdkZXN0cm95ZWQnICYmXG4gICAgICAgIHZhbC5kZXN0cm95ZWQgPT09IGZhbHNlXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBDWChcbiAgICAgIGNoZWNrLFxuICAgIClgVW5leHBlY3RlZCBOb2RlIGFzeW5jX2hvb2tzIGFkZGl0aW9ucyB0byBwcm9taXNlOiAke3ByfS4ke3EoXG4gICAgICBTdHJpbmcoa2V5KSxcbiAgICApfSBpcyAke3ZhbH1gO1xuICB9O1xuXG4gIHJldHVybiBrZXlzLmV2ZXJ5KGNoZWNrU2FmZU93bktleSk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgY2hlY2tTYWZlUHJvbWlzZSA9IChwciwgY2hlY2spID0+IHtcbiAgcmV0dXJuIChcbiAgICAoaXNGcm96ZW4ocHIpIHx8IENYKGNoZWNrKWAke3ByfSAtIE11c3QgYmUgZnJvemVuYCkgJiZcbiAgICAoaXNQcm9taXNlKHByKSB8fCBDWChjaGVjaylgJHtwcn0gLSBNdXN0IGJlIGEgcHJvbWlzZWApICYmXG4gICAgKGdldFByb3RvdHlwZU9mKHByKSA9PT0gUHJvbWlzZS5wcm90b3R5cGUgfHxcbiAgICAgIENYKGNoZWNrKWAke3ByfSAtIE11c3QgaW5oZXJpdCBmcm9tIFByb21pc2UucHJvdG90eXBlOiAke3EoXG4gICAgICAgIGdldFByb3RvdHlwZU9mKHByKSxcbiAgICAgICl9YCkgJiZcbiAgICBjaGVja1Byb21pc2VPd25LZXlzKC8qICAgICAgICAgICAgICAgICAgKi8gKHByKSwgY2hlY2spXG4gICk7XG59O1xuaGFyZGVuKGNoZWNrU2FmZVByb21pc2UpO1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBpc1NhZmVQcm9taXNlID0gcHIgPT4gY2hlY2tTYWZlUHJvbWlzZShwciwgeCA9PiB4KTskaM2PX29uY2UuaXNTYWZlUHJvbWlzZShpc1NhZmVQcm9taXNlKTtcbmhhcmRlbihpc1NhZmVQcm9taXNlKTtcblxuICAgICAgIGNvbnN0IGFzc2VydFNhZmVQcm9taXNlID0gcHIgPT4gY2hlY2tTYWZlUHJvbWlzZShwciwgYXNzZXJ0Q2hlY2tlcik7JGjNj19vbmNlLmFzc2VydFNhZmVQcm9taXNlKGFzc2VydFNhZmVQcm9taXNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzU2FmZVByb21pc2UiOlsiaXNTYWZlUHJvbWlzZSJdLCJhc3NlcnRTYWZlUHJvbWlzZSI6WyJhc3NlcnRTYWZlUHJvbWlzZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC6Ps2heQgAAHkIAAAlAAAAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL3N0cmluZy5qc3siaW1wb3J0cyI6WyJAZW5kby9lbnYtb3B0aW9ucyIsIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbImFzc2VydFBhc3NhYmxlU3RyaW5nIiwiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyIsImlzV2VsbEZvcm1lZFN0cmluZyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGdldEVudmlyb25tZW50T3B0aW9uLEZhaWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lbnYtb3B0aW9uc1wiLCBbW1wiZ2V0RW52aXJvbm1lbnRPcHRpb25cIixbJGjNj19hID0+IChnZXRFbnZpcm9ubWVudE9wdGlvbiA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXV0pO1xuXG5cbi8vXG5jb25zdCBoYXNXZWxsRm9ybWVkU3RyaW5nTWV0aG9kID0gISFTdHJpbmcucHJvdG90eXBlLmlzV2VsbEZvcm1lZDtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBpc1dlbGxGb3JtZWRTdHJpbmcgPSBoYXNXZWxsRm9ybWVkU3RyaW5nTWV0aG9kXG4gID8gc3RyID0+IHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnICYmIHN0ci5pc1dlbGxGb3JtZWQoKVxuICA6IHN0ciA9PiB7XG4gICAgICBpZiAodHlwZW9mIHN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBjaCBvZiBzdHIpIHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgY3AgPSAvKiAgICAgICAgICAgICAgICAgKi8gKGNoLmNvZGVQb2ludEF0KDApKTtcbiAgICAgICAgaWYgKGNwID49IDB4ZDgwMCAmJiBjcCA8PSAweGRmZmYpIHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH07JGjNj19vbmNlLmlzV2VsbEZvcm1lZFN0cmluZyhpc1dlbGxGb3JtZWRTdHJpbmcpO1xuaGFyZGVuKGlzV2VsbEZvcm1lZFN0cmluZyk7XG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyA9IHN0ciA9PiB7XG4gIGlzV2VsbEZvcm1lZFN0cmluZyhzdHIpIHx8IEZhaWxgRXhwZWN0ZWQgd2VsbC1mb3JtZWQgdW5pY29kZSBzdHJpbmc6ICR7c3RyfWA7XG59OyRozY9fb25jZS5hc3NlcnRXZWxsRm9ybWVkU3RyaW5nKGFzc2VydFdlbGxGb3JtZWRTdHJpbmcpO1xuaGFyZGVuKGFzc2VydFdlbGxGb3JtZWRTdHJpbmcpO1xuXG5jb25zdCBPTkxZX1dFTExfRk9STUVEX1NUUklOR1NfUEFTU0FCTEUgPVxuICBnZXRFbnZpcm9ubWVudE9wdGlvbignT05MWV9XRUxMX0ZPUk1FRF9TVFJJTkdTX1BBU1NBQkxFJywgJ2Rpc2FibGVkJywgW1xuICAgICdlbmFibGVkJyxcbiAgXSkgPT09ICdlbmFibGVkJztcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydFBhc3NhYmxlU3RyaW5nID0gc3RyID0+IHtcbiAgdHlwZW9mIHN0ciA9PT0gJ3N0cmluZycgfHwgRmFpbGBFeHBlY3RlZCBzdHJpbmcgJHtzdHJ9YDtcbiAgIU9OTFlfV0VMTF9GT1JNRURfU1RSSU5HU19QQVNTQUJMRSB8fCBhc3NlcnRXZWxsRm9ybWVkU3RyaW5nKHN0cik7XG59OyRozY9fb25jZS5hc3NlcnRQYXNzYWJsZVN0cmluZyhhc3NlcnRQYXNzYWJsZVN0cmluZyk7XG5oYXJkZW4oYXNzZXJ0UGFzc2FibGVTdHJpbmcpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNXZWxsRm9ybWVkU3RyaW5nIjpbImlzV2VsbEZvcm1lZFN0cmluZyJdLCJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIjpbImFzc2VydFdlbGxGb3JtZWRTdHJpbmciXSwiYXNzZXJ0UGFzc2FibGVTdHJpbmciOlsiYXNzZXJ0UGFzc2FibGVTdHJpbmciXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAHRtUduUKAADlCgAAJQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9zeW1ib2wuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiYXNzZXJ0UGFzc2FibGVTeW1ib2wiLCJpc1Bhc3NhYmxlU3ltYm9sIiwibmFtZUZvclBhc3NhYmxlU3ltYm9sIiwicGFzc2FibGVTeW1ib2xGb3JOYW1lIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxxOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dXSk7XG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcblxuLypcblxuICovXG5jb25zdCB3ZWxsS25vd25TeW1ib2xOYW1lcyA9IG5ldyBNYXAoXG4gIG93bktleXMoU3ltYm9sKVxuICAgIC5maWx0ZXIoXG4gICAgICBuYW1lID0+IHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyAmJiB0eXBlb2YgU3ltYm9sW25hbWVdID09PSAnc3ltYm9sJyxcbiAgICApXG4gICAgLmZpbHRlcihuYW1lID0+IHtcbiAgICAgIC8vXG4gICAgICAhbmFtZS5zdGFydHNXaXRoKCdAQCcpIHx8XG4gICAgICAgIEZhaWxgRGlkIG5vdCBleHBlY3QgU3ltYm9sIHRvIGhhdmUgYSBzeW1ib2wtdmFsdWVkIHByb3BlcnR5IG5hbWUgc3RhcnRpbmcgd2l0aCBcIkBAXCIgJHtxKFxuICAgICAgICAgIG5hbWUsXG4gICAgICAgICl9YDtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pXG4gICAgLy9cbiAgICAubWFwKG5hbWUgPT4gW1N5bWJvbFtuYW1lXSwgYEBAJHtuYW1lfWBdKSxcbik7XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBpc1Bhc3NhYmxlU3ltYm9sID0gc3ltID0+XG4gIHR5cGVvZiBzeW0gPT09ICdzeW1ib2wnICYmXG4gICh0eXBlb2YgU3ltYm9sLmtleUZvcihzeW0pID09PSAnc3RyaW5nJyB8fCB3ZWxsS25vd25TeW1ib2xOYW1lcy5oYXMoc3ltKSk7JGjNj19vbmNlLmlzUGFzc2FibGVTeW1ib2woaXNQYXNzYWJsZVN5bWJvbCk7XG5oYXJkZW4oaXNQYXNzYWJsZVN5bWJvbCk7XG5cbiAgICAgICBjb25zdCBhc3NlcnRQYXNzYWJsZVN5bWJvbCA9IHN5bSA9PlxuICBpc1Bhc3NhYmxlU3ltYm9sKHN5bSkgfHxcbiAgRmFpbGBPbmx5IHJlZ2lzdGVyZWQgc3ltYm9scyBvciB3ZWxsLWtub3duIHN5bWJvbHMgYXJlIHBhc3NhYmxlOiAke3Eoc3ltKX1gOyRozY9fb25jZS5hc3NlcnRQYXNzYWJsZVN5bWJvbChhc3NlcnRQYXNzYWJsZVN5bWJvbCk7XG5oYXJkZW4oYXNzZXJ0UGFzc2FibGVTeW1ib2wpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSBzeW0gPT4ge1xuICBjb25zdCBuYW1lID0gU3ltYm9sLmtleUZvcihzeW0pO1xuICBpZiAobmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIHdlbGxLbm93blN5bWJvbE5hbWVzLmdldChzeW0pO1xuICB9XG4gIGlmIChuYW1lLnN0YXJ0c1dpdGgoJ0BAJykpIHtcbiAgICByZXR1cm4gYEBAJHtuYW1lfWA7XG4gIH1cbiAgcmV0dXJuIG5hbWU7XG59OyRozY9fb25jZS5uYW1lRm9yUGFzc2FibGVTeW1ib2wobmFtZUZvclBhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihuYW1lRm9yUGFzc2FibGVTeW1ib2wpO1xuXG5jb25zdCBBdEF0UHJlZml4UGF0dGVybiA9IC9eQEAoLiopJC87XG5oYXJkZW4oQXRBdFByZWZpeFBhdHRlcm4pO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9IG5hbWUgPT4ge1xuICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBjb25zdCBtYXRjaCA9IEF0QXRQcmVmaXhQYXR0ZXJuLmV4ZWMobmFtZSk7XG4gIGlmIChtYXRjaCkge1xuICAgIGNvbnN0IHN1ZmZpeCA9IG1hdGNoWzFdO1xuICAgIGlmIChzdWZmaXguc3RhcnRzV2l0aCgnQEAnKSkge1xuICAgICAgcmV0dXJuIFN5bWJvbC5mb3Ioc3VmZml4KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3Qgc3ltID0gU3ltYm9sW3N1ZmZpeF07XG4gICAgICBpZiAodHlwZW9mIHN5bSA9PT0gJ3N5bWJvbCcpIHtcbiAgICAgICAgcmV0dXJuIHN5bTtcbiAgICAgIH1cbiAgICAgIEZhaWxgUmVzZXJ2ZWQgZm9yIHdlbGwga25vd24gc3ltYm9sICR7cShzdWZmaXgpfTogJHtxKG5hbWUpfWA7XG4gICAgfVxuICB9XG4gIHJldHVybiBTeW1ib2wuZm9yKG5hbWUpO1xufTskaM2PX29uY2UucGFzc2FibGVTeW1ib2xGb3JOYW1lKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSk7XG5oYXJkZW4ocGFzc2FibGVTeW1ib2xGb3JOYW1lKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUGFzc2FibGVTeW1ib2wiOlsiaXNQYXNzYWJsZVN5bWJvbCJdLCJhc3NlcnRQYXNzYWJsZVN5bWJvbCI6WyJhc3NlcnRQYXNzYWJsZVN5bWJvbCJdLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiOlsibmFtZUZvclBhc3NhYmxlU3ltYm9sIl0sInBhc3NhYmxlU3ltYm9sRm9yTmFtZSI6WyJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA8uXyUMkHAADJBwAAJQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy90YWdnZWQuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIlRhZ2dlZEhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsYXNzZXJ0Q2hlY2tlcixjaGVja1RhZ1JlY29yZCxQQVNTX1NUWUxFLGdldE93bkRhdGFEZXNjcmlwdG9yLGNoZWNrUGFzc1N0eWxlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcImNoZWNrVGFnUmVjb3JkXCIsWyRozY9fYSA9PiAoY2hlY2tUYWdSZWNvcmQgPSAkaM2PX2EpXV0sW1wiUEFTU19TVFlMRVwiLFskaM2PX2EgPT4gKFBBU1NfU1RZTEUgPSAkaM2PX2EpXV0sW1wiZ2V0T3duRGF0YURlc2NyaXB0b3JcIixbJGjNj19hID0+IChnZXRPd25EYXRhRGVzY3JpcHRvciA9ICRozY9fYSldXSxbXCJjaGVja1Bhc3NTdHlsZVwiLFskaM2PX2EgPT4gKGNoZWNrUGFzc1N0eWxlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuLypcblxuICovXG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyB9ID0gT2JqZWN0O1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IFRhZ2dlZEhlbHBlciA9IGhhcmRlbih7XG4gIHN0eWxlTmFtZTogJ3RhZ2dlZCcsXG5cbiAgY2FuQmVWYWxpZDogKGNhbmRpZGF0ZSwgY2hlY2sgPSB1bmRlZmluZWQpID0+XG4gICAgY2hlY2tQYXNzU3R5bGUoY2FuZGlkYXRlLCBjYW5kaWRhdGVbUEFTU19TVFlMRV0sICd0YWdnZWQnLCBjaGVjayksXG5cbiAgYXNzZXJ0UmVzdFZhbGlkOiAoY2FuZGlkYXRlLCBwYXNzU3R5bGVPZlJlY3VyKSA9PiB7XG4gICAgY2hlY2tUYWdSZWNvcmQoY2FuZGlkYXRlLCAndGFnZ2VkJywgYXNzZXJ0Q2hlY2tlcik7XG5cbiAgICAvL1xuICAgIGNvbnN0IHBhc3NTdHlsZUtleSA9IC8qICAgICAgICAgICAgICAgICAgKi8gKFBBU1NfU1RZTEUpO1xuICAgIGNvbnN0IHRhZ0tleSA9IC8qICAgICAgICAgICAgICAgICAgKi8gKFN5bWJvbC50b1N0cmluZ1RhZyk7XG4gICAgY29uc3Qge1xuICAgICAgLy9cbiAgICAgIFsvKiAgICAgICAgICAgICAgICAgKi8gKHBhc3NTdHlsZUtleSldOiBfcGFzc1N0eWxlRGVzYyxcbiAgICAgIFsvKiAgICAgICAgICAgICAgICAgKi8gKHRhZ0tleSldOiBfbGFiZWxEZXNjLFxuICAgICAgcGF5bG9hZDogX3BheWxvYWREZXNjLCAvL1xuICAgICAgLi4ucmVzdERlc2NzXG4gICAgfSA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY2FuZGlkYXRlKTtcbiAgICBvd25LZXlzKHJlc3REZXNjcykubGVuZ3RoID09PSAwIHx8XG4gICAgICBGYWlsYFVuZXhwZWN0ZWQgcHJvcGVydGllcyBvbiB0YWdnZWQgcmVjb3JkICR7b3duS2V5cyhyZXN0RGVzY3MpfWA7XG5cbiAgICAvL1xuICAgIC8vXG4gICAgcGFzc1N0eWxlT2ZSZWN1cihcbiAgICAgIGdldE93bkRhdGFEZXNjcmlwdG9yKGNhbmRpZGF0ZSwgJ3BheWxvYWQnLCB0cnVlLCBhc3NlcnRDaGVja2VyKS52YWx1ZSxcbiAgICApO1xuICB9LFxufSk7JGjNj19vbmNlLlRhZ2dlZEhlbHBlcihUYWdnZWRIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiVGFnZ2VkSGVscGVyIjpbIlRhZ2dlZEhlbHBlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADu3CKwZwkAAGcJAAApAAAAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL3R5cGVHdWFyZHMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGVPZi5qcyJdLCJleHBvcnRzIjpbImFzc2VydENvcHlBcnJheSIsImFzc2VydFJlY29yZCIsImFzc2VydFJlbW90YWJsZSIsImlzQ29weUFycmF5IiwiaXNSZWNvcmQiLCJpc1JlbW90YWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwscSxwYXNzU3R5bGVPZjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dXV1dKTtcblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgaXNDb3B5QXJyYXkgPSBhcnIgPT4gcGFzc1N0eWxlT2YoYXJyKSA9PT0gJ2NvcHlBcnJheSc7JGjNj19vbmNlLmlzQ29weUFycmF5KGlzQ29weUFycmF5KTtcbmhhcmRlbihpc0NvcHlBcnJheSk7XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBpc1JlY29yZCA9IHJlY29yZCA9PiBwYXNzU3R5bGVPZihyZWNvcmQpID09PSAnY29weVJlY29yZCc7JGjNj19vbmNlLmlzUmVjb3JkKGlzUmVjb3JkKTtcbmhhcmRlbihpc1JlY29yZCk7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgaXNSZW1vdGFibGUgPSByZW1vdGFibGUgPT4gcGFzc1N0eWxlT2YocmVtb3RhYmxlKSA9PT0gJ3JlbW90YWJsZSc7JGjNj19vbmNlLmlzUmVtb3RhYmxlKGlzUmVtb3RhYmxlKTtcbmhhcmRlbihpc1JlbW90YWJsZSk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGFzc2VydENvcHlBcnJheSA9IChhcnIsIG9wdE5hbWVPZkFycmF5ID0gJ0FsbGVnZWQgYXJyYXknKSA9PiB7XG4gIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKGFycik7XG4gIHBhc3NTdHlsZSA9PT0gJ2NvcHlBcnJheScgfHxcbiAgICBGYWlsYCR7cShvcHROYW1lT2ZBcnJheSl9ICR7YXJyfSBtdXN0IGJlIGEgcGFzcy1ieS1jb3B5IGFycmF5LCBub3QgJHtxKFxuICAgICAgcGFzc1N0eWxlLFxuICAgICl9YDtcbn07JGjNj19vbmNlLmFzc2VydENvcHlBcnJheShhc3NlcnRDb3B5QXJyYXkpO1xuaGFyZGVuKGFzc2VydENvcHlBcnJheSk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGFzc2VydFJlY29yZCA9IChyZWNvcmQsIG9wdE5hbWVPZlJlY29yZCA9ICdBbGxlZ2VkIHJlY29yZCcpID0+IHtcbiAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YocmVjb3JkKTtcbiAgcGFzc1N0eWxlID09PSAnY29weVJlY29yZCcgfHxcbiAgICBGYWlsYCR7cShvcHROYW1lT2ZSZWNvcmQpfSAke3JlY29yZH0gbXVzdCBiZSBhIHBhc3MtYnktY29weSByZWNvcmQsIG5vdCAke3EoXG4gICAgICBwYXNzU3R5bGUsXG4gICAgKX1gO1xufTskaM2PX29uY2UuYXNzZXJ0UmVjb3JkKGFzc2VydFJlY29yZCk7XG5oYXJkZW4oYXNzZXJ0UmVjb3JkKTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0UmVtb3RhYmxlID0gKFxuICByZW1vdGFibGUsXG4gIG9wdE5hbWVPZlJlbW90YWJsZSA9ICdBbGxlZ2VkIHJlbW90YWJsZScsXG4pID0+IHtcbiAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YocmVtb3RhYmxlKTtcbiAgcGFzc1N0eWxlID09PSAncmVtb3RhYmxlJyB8fFxuICAgIEZhaWxgJHtxKG9wdE5hbWVPZlJlbW90YWJsZSl9ICR7cmVtb3RhYmxlfSBtdXN0IGJlIGEgcmVtb3RhYmxlLCBub3QgJHtxKFxuICAgICAgcGFzc1N0eWxlLFxuICAgICl9YDtcbn07JGjNj19vbmNlLmFzc2VydFJlbW90YWJsZShhc3NlcnRSZW1vdGFibGUpO1xuaGFyZGVuKGFzc2VydFJlbW90YWJsZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc0NvcHlBcnJheSI6WyJpc0NvcHlBcnJheSJdLCJpc1JlY29yZCI6WyJpc1JlY29yZCJdLCJpc1JlbW90YWJsZSI6WyJpc1JlbW90YWJsZSJdLCJhc3NlcnRDb3B5QXJyYXkiOlsiYXNzZXJ0Q29weUFycmF5Il0sImFzc2VydFJlY29yZCI6WyJhc3NlcnRSZWNvcmQiXSwiYXNzZXJ0UmVtb3RhYmxlIjpbImFzc2VydFJlbW90YWJsZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAAkAAAAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAD9F099iBgAAYgYAACIAAABAZW5kby9wcm9taXNlLWtpdC12MS4xLjEwL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzIiwiLi9zcmMvbWVtby1yYWNlLmpzIiwiLi9zcmMvaXMtcHJvbWlzZS5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sImV4cG9ydHMiOlsibWFrZVByb21pc2VLaXQiLCJyYWNlUHJvbWlzZXMiXSwicmVleHBvcnRzIjpbIi4vc3JjL2lzLXByb21pc2UuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCxtZW1vUmFjZTskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzXCIsIFtbXCJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXRcIixbJGjNj19hID0+IChtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQgPSAkaM2PX2EpXV1dXSxbXCIuL3NyYy9tZW1vLXJhY2UuanNcIiwgW1tcIm1lbW9SYWNlXCIsWyRozY9fYSA9PiAobWVtb1JhY2UgPSAkaM2PX2EpXV1dXSxbXCIuL3NyYy9pcy1wcm9taXNlLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkobWFrZVByb21pc2VLaXQsJ25hbWUnLHt2YWx1ZTpcIm1ha2VQcm9taXNlS2l0XCJ9KTskaM2PX29uY2UubWFrZVByb21pc2VLaXQobWFrZVByb21pc2VLaXQpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyYWNlUHJvbWlzZXMsJ25hbWUnLHt2YWx1ZTpcInJhY2VQcm9taXNlc1wifSk7JGjNj19vbmNlLnJhY2VQcm9taXNlcyhyYWNlUHJvbWlzZXMpO1xuXG5cblxuXG5cblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgQmVzdFBpcGVsaW5hYmxlUHJvbWlzZSA9IGdsb2JhbFRoaXMuSGFuZGxlZFByb21pc2UgfHwgUHJvbWlzZTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGZ1bmN0aW9uIG1ha2VQcm9taXNlS2l0KCkge1xuICBjb25zdCB7IHJlc29sdmUsIHJlamVjdCwgZXhlY3V0b3IgfSA9IG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCgpO1xuXG4gIGNvbnN0IHByb21pc2UgPSBuZXcgQmVzdFBpcGVsaW5hYmxlUHJvbWlzZShleGVjdXRvcik7XG5cbiAgcmV0dXJuIGhhcmRlbih7IHByb21pc2UsIHJlc29sdmUsIHJlamVjdCB9KTtcbn1cbmhhcmRlbihtYWtlUHJvbWlzZUtpdCk7XG5cbi8vXG4vL1xuLy9cblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGZ1bmN0aW9uIHJhY2VQcm9taXNlcyh2YWx1ZXMpIHtcbiAgcmV0dXJuIGhhcmRlbihtZW1vUmFjZS5jYWxsKEJlc3RQaXBlbGluYWJsZVByb21pc2UsIHZhbHVlcykpO1xufVxuaGFyZGVuKHJhY2VQcm9taXNlcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUHJvbWlzZUtpdCI6WyJtYWtlUHJvbWlzZUtpdCJdLCJyYWNlUHJvbWlzZXMiOlsicmFjZVByb21pc2VzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHWIQX5kAgAAZAIAACsAAABAZW5kby9wcm9taXNlLWtpdC12MS4xLjEwL3NyYy9pcy1wcm9taXNlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJpc1Byb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGlzUHJvbWlzZSwnbmFtZScse3ZhbHVlOlwiaXNQcm9taXNlXCJ9KTskaM2PX29uY2UuaXNQcm9taXNlKGlzUHJvbWlzZSk7LypcblxuXG5cblxuICovXG4gICAgICAgZnVuY3Rpb24gaXNQcm9taXNlKG1heWJlUHJvbWlzZSkge1xuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1heWJlUHJvbWlzZSkgPT09IG1heWJlUHJvbWlzZTtcbn1cbmhhcmRlbihpc1Byb21pc2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNQcm9taXNlIjpbImlzUHJvbWlzZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA54azwWQkAAFkJAAAqAAAAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMC9zcmMvbWVtby1yYWNlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtZW1vUmFjZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuKi9cblxuY29uc3QgaXNPYmplY3QgPSB2YWx1ZSA9PiBPYmplY3QodmFsdWUpID09PSB2YWx1ZTtcblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vL1xuLy9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGtub3duUHJvbWlzZXMgPSBuZXcgV2Vha01hcCgpO1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgbWFya1NldHRsZWQgPSByZWNvcmQgPT4ge1xuICBpZiAoIXJlY29yZCB8fCByZWNvcmQuc2V0dGxlZCkge1xuICAgIHJldHVybiBuZXcgU2V0KCk7XG4gIH1cblxuICBjb25zdCB7IGRlZmVycmVkcyB9ID0gcmVjb3JkO1xuICBPYmplY3QuYXNzaWduKHJlY29yZCwge1xuICAgIGRlZmVycmVkczogdW5kZWZpbmVkLFxuICAgIHNldHRsZWQ6IHRydWUsXG4gIH0pO1xuICBPYmplY3QuZnJlZXplKHJlY29yZCk7XG4gIHJldHVybiBkZWZlcnJlZHM7XG59O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBnZXRNZW1vUmVjb3JkID0gdmFsdWUgPT4ge1xuICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkge1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgcmV0dXJuIGhhcmRlbih7IHNldHRsZWQ6IHRydWUgfSk7XG4gIH1cblxuICBsZXQgcmVjb3JkID0ga25vd25Qcm9taXNlcy5nZXQodmFsdWUpO1xuXG4gIGlmICghcmVjb3JkKSB7XG4gICAgcmVjb3JkID0geyBkZWZlcnJlZHM6IG5ldyBTZXQoKSwgc2V0dGxlZDogZmFsc2UgfTtcbiAgICBrbm93blByb21pc2VzLnNldCh2YWx1ZSwgcmVjb3JkKTtcbiAgICAvL1xuICAgIFByb21pc2UucmVzb2x2ZSh2YWx1ZSkudGhlbihcbiAgICAgIHZhbCA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgeyByZXNvbHZlIH0gb2YgbWFya1NldHRsZWQocmVjb3JkKSkge1xuICAgICAgICAgIHJlc29sdmUodmFsKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGVyciA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgeyByZWplY3QgfSBvZiBtYXJrU2V0dGxlZChyZWNvcmQpKSB7XG4gICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgKTtcbiAgfVxuICByZXR1cm4gcmVjb3JkO1xufTtcblxuY29uc3QgeyByYWNlIH0gPSB7XG4gIC8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgcmFjZSh2YWx1ZXMpIHtcbiAgICBsZXQgZGVmZXJyZWQ7XG4gICAgLyogICAgICAgICAgICAgICAgICovXG4gICAgLy9cbiAgICBjb25zdCBjYWNoZWRWYWx1ZXMgPSBbXTtcbiAgICBjb25zdCBDID0gdGhpcztcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgQygocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICBkZWZlcnJlZCA9IHsgcmVzb2x2ZSwgcmVqZWN0IH07XG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcykge1xuICAgICAgICBjYWNoZWRWYWx1ZXMucHVzaCh2YWx1ZSk7XG4gICAgICAgIGNvbnN0IHsgc2V0dGxlZCwgZGVmZXJyZWRzIH0gPSBnZXRNZW1vUmVjb3JkKHZhbHVlKTtcbiAgICAgICAgaWYgKHNldHRsZWQpIHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgQy5yZXNvbHZlKHZhbHVlKS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVmZXJyZWRzLmFkZChkZWZlcnJlZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vXG4gICAgLy9cbiAgICByZXR1cm4gcmVzdWx0LmZpbmFsbHkoKCkgPT4ge1xuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBjYWNoZWRWYWx1ZXMpIHtcbiAgICAgICAgY29uc3QgeyBkZWZlcnJlZHMgfSA9IGdldE1lbW9SZWNvcmQodmFsdWUpO1xuICAgICAgICBpZiAoZGVmZXJyZWRzKSB7XG4gICAgICAgICAgZGVmZXJyZWRzLmRlbGV0ZShkZWZlcnJlZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcbiAgfSxcbn07JGjNj19vbmNlLnJhY2UocmFjZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtZW1vUmFjZSI6WyJyYWNlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIwbIjUfBgAAHwYAADUAAABAZW5kby9wcm9taXNlLWtpdC12MS4xLjEwL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8vXG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0ID0gKCkgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgbGV0IGludGVybmFsUmVzb2x2ZTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgaW50ZXJuYWxSZWplY3Q7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgcmVzb2x2ZSA9IHZhbHVlID0+IHtcbiAgICBpZiAoaW50ZXJuYWxSZXNvbHZlKSB7XG4gICAgICBpbnRlcm5hbFJlc29sdmUodmFsdWUpO1xuICAgICAgaW50ZXJuYWxSZXNvbHZlID0gbnVsbDtcbiAgICAgIGludGVybmFsUmVqZWN0ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KGludGVybmFsUmVzb2x2ZSA9PT0gbnVsbCk7XG4gICAgfVxuICB9O1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCByZWplY3QgPSByZWFzb24gPT4ge1xuICAgIGlmIChpbnRlcm5hbFJlamVjdCkge1xuICAgICAgaW50ZXJuYWxSZWplY3QocmVhc29uKTtcbiAgICAgIGludGVybmFsUmVzb2x2ZSA9IG51bGw7XG4gICAgICBpbnRlcm5hbFJlamVjdCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydChpbnRlcm5hbFJlamVjdCA9PT0gbnVsbCk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGV4ZWN1dG9yID0gKHJlcywgcmVqKSA9PiB7XG4gICAgYXNzZXJ0KGludGVybmFsUmVzb2x2ZSA9PT0gdW5kZWZpbmVkICYmIGludGVybmFsUmVqZWN0ID09PSB1bmRlZmluZWQpO1xuICAgIGludGVybmFsUmVzb2x2ZSA9IHJlcztcbiAgICBpbnRlcm5hbFJlamVjdCA9IHJlajtcbiAgfTtcblxuICByZXR1cm4gaGFyZGVuKHsgcmVzb2x2ZSwgcmVqZWN0LCBleGVjdXRvciB9KTtcbn07JGjNj19vbmNlLm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdChtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQpO1xuaGFyZGVuKG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiOlsibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACYAAABAZW5kby9wcm9taXNlLWtpdC12MS4xLjEwL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABOhXNrnwEAAJ8BAAAgAAAAQGVuZG8vdHJhbXBvbGluZS12MS4wLjMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvdHJhbXBvbGluZS5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vc3JjL3RyYW1wb2xpbmUuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvdHJhbXBvbGluZS5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADNeH6RswcAALMHAAApAAAAQGVuZG8vdHJhbXBvbGluZS12MS4wLjMvc3JjL3RyYW1wb2xpbmUuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImFzeW5jVHJhbXBvbGluZSIsImdlbmVyYXRvclByb3RvdHlwZSIsInN5bmNUcmFtcG9saW5lIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShzeW5jVHJhbXBvbGluZSwnbmFtZScse3ZhbHVlOlwic3luY1RyYW1wb2xpbmVcIn0pOyRozY9fb25jZS5zeW5jVHJhbXBvbGluZShzeW5jVHJhbXBvbGluZSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGFzeW5jVHJhbXBvbGluZSwnbmFtZScse3ZhbHVlOlwiYXN5bmNUcmFtcG9saW5lXCJ9KTskaM2PX29uY2UuYXN5bmNUcmFtcG9saW5lKGFzeW5jVHJhbXBvbGluZSk7LyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLypcblxuICovXG5jb25zdCB7IGdldFByb3RvdHlwZU9mIH0gPSBPYmplY3Q7XG5jb25zdCB7IGJpbmQgfSA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbmNvbnN0IHVuY3VycnlUaGlzID0gYmluZC5iaW5kKGJpbmQuY2FsbCk7IC8vXG4gICAgICAgY29uc3QgeyBwcm90b3R5cGU6IGdlbmVyYXRvclByb3RvdHlwZSB9ID0gZ2V0UHJvdG90eXBlT2YoXG4gIC8vXG4gIGZ1bmN0aW9uKiAoKSB7fSxcbik7JGjNj19vbmNlLmdlbmVyYXRvclByb3RvdHlwZShnZW5lcmF0b3JQcm90b3R5cGUpO1xuY29uc3QgZ2VuZXJhdG9yTmV4dCA9IHVuY3VycnlUaGlzKGdlbmVyYXRvclByb3RvdHlwZS5uZXh0KTtcbmNvbnN0IGdlbmVyYXRvclRocm93ID0gdW5jdXJyeVRoaXMoZ2VuZXJhdG9yUHJvdG90eXBlLnRocm93KTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG4gICAgICAgZnVuY3Rpb24gc3luY1RyYW1wb2xpbmUoZ2VuZXJhdG9yRm4sIC4uLmFyZ3MpIHtcbiAgY29uc3QgaXRlcmF0b3IgPSBnZW5lcmF0b3JGbiguLi5hcmdzKTtcbiAgbGV0IHJlc3VsdCA9IGdlbmVyYXRvck5leHQoaXRlcmF0b3IpO1xuICB3aGlsZSAoIXJlc3VsdC5kb25lKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IGdlbmVyYXRvck5leHQoaXRlcmF0b3IsIHJlc3VsdC52YWx1ZSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZXN1bHQgPSBnZW5lcmF0b3JUaHJvdyhpdGVyYXRvciwgZXJyKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdC52YWx1ZTtcbn1cblxuLypcblxuXG5cblxuXG5cblxuICovXG4gICAgICAgYXN5bmMgZnVuY3Rpb24gYXN5bmNUcmFtcG9saW5lKGdlbmVyYXRvckZuLCAuLi5hcmdzKSB7XG4gIGNvbnN0IGl0ZXJhdG9yID0gZ2VuZXJhdG9yRm4oLi4uYXJncyk7XG4gIGxldCByZXN1bHQgPSBnZW5lcmF0b3JOZXh0KGl0ZXJhdG9yKTtcbiAgd2hpbGUgKCFyZXN1bHQuZG9uZSkge1xuICAgIHRyeSB7XG4gICAgICAvL1xuICAgICAgY29uc3QgdmFsID0gYXdhaXQgcmVzdWx0LnZhbHVlO1xuICAgICAgcmVzdWx0ID0gZ2VuZXJhdG9yTmV4dChpdGVyYXRvciwgdmFsKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJlc3VsdCA9IGdlbmVyYXRvclRocm93KGl0ZXJhdG9yLCBlcnIpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0LnZhbHVlO1xufVxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2VuZXJhdG9yUHJvdG90eXBlIjpbImdlbmVyYXRvclByb3RvdHlwZSJdLCJzeW5jVHJhbXBvbGluZSI6WyJzeW5jVHJhbXBvbGluZSJdLCJhc3luY1RyYW1wb2xpbmUiOlsiYXN5bmNUcmFtcG9saW5lIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALz/AUOaAgAAmgIAABkAAABAZW5kby96aXAtdjEuMC45L2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIiwiLi9zcmMvcmVhZGVyLmpzIiwiLi9zcmMvd3JpdGVyLmpzIl0sImV4cG9ydHMiOlsicmVhZFppcCIsInJlYWRaaXAiLCJ3cml0ZVppcCIsIndyaXRlWmlwIl0sInJlZXhwb3J0cyI6WyIuL3NyYy90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV0sW1wiLi9zcmMvcmVhZGVyLmpzXCIsIFtdXSxbXCIuL3NyYy93cml0ZXIuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9yZWFkZXIuanMiOltbIlppcFJlYWRlciIsIlppcFJlYWRlciJdLFsicmVhZFppcCIsInJlYWRaaXAiXV0sIi4vc3JjL3dyaXRlci5qcyI6W1siWmlwV3JpdGVyIiwiWmlwV3JpdGVyIl0sWyJ3cml0ZVppcCIsIndyaXRlWmlwIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB1VqLpwRQAAMEUAAAlAAAAQGVuZG8vemlwLXYxLjAuOS9zcmMvYnVmZmVyLXJlYWRlci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiQnVmZmVyUmVhZGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCBxID0gSlNPTi5zdHJpbmdpZnk7XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgcHJpdmF0ZUZpZWxkcyA9IG5ldyBXZWFrTWFwKCk7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IHByaXZhdGVGaWVsZHNHZXQgPSBwcml2YXRlRmllbGRzLmdldC5iaW5kKHByaXZhdGVGaWVsZHMpO1xuXG4gICAgICAgY2xhc3MgQnVmZmVyUmVhZGVyIHtcbiAgLypcblxuICAgKi9cbiAgY29uc3RydWN0b3IoYnVmZmVyKSB7XG4gICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xuICAgIGNvbnN0IGRhdGEgPSBuZXcgRGF0YVZpZXcoYnl0ZXMuYnVmZmVyKTtcbiAgICBwcml2YXRlRmllbGRzLnNldCh0aGlzLCB7XG4gICAgICBieXRlcyxcbiAgICAgIGRhdGEsXG4gICAgICBsZW5ndGg6IGJ5dGVzLmxlbmd0aCxcbiAgICAgIGluZGV4OiAwLFxuICAgICAgb2Zmc2V0OiAwLFxuICAgIH0pO1xuICB9XG5cbiAgLypcblxuICAgKi9cbiAgZ2V0IGxlbmd0aCgpIHtcbiAgICByZXR1cm4gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKS5sZW5ndGg7XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICBnZXQgaW5kZXgoKSB7XG4gICAgcmV0dXJuIHByaXZhdGVGaWVsZHNHZXQodGhpcykuaW5kZXg7XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICBzZXQgaW5kZXgoaW5kZXgpIHtcbiAgICB0aGlzLnNlZWsoaW5kZXgpO1xuICB9XG5cbiAgLypcblxuICAgKi9cbiAgc2V0IG9mZnNldChvZmZzZXQpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBwcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuICAgIGlmIChvZmZzZXQgPiBmaWVsZHMuZGF0YS5ieXRlTGVuZ3RoKSB7XG4gICAgICB0aHJvdyBFcnJvcignQ2Fubm90IHNldCBvZmZzZXQgYmV5b25kIGxlbmd0aCBvZiB1bmRlcmx5aW5nIGRhdGEnKTtcbiAgICB9XG4gICAgaWYgKG9mZnNldCA8IDApIHtcbiAgICAgIHRocm93IEVycm9yKCdDYW5ub3Qgc2V0IG5lZ2F0aXZlIG9mZnNldCcpO1xuICAgIH1cbiAgICBmaWVsZHMub2Zmc2V0ID0gb2Zmc2V0O1xuICAgIGZpZWxkcy5sZW5ndGggPSBmaWVsZHMuZGF0YS5ieXRlTGVuZ3RoIC0gZmllbGRzLm9mZnNldDtcbiAgfVxuXG4gIC8qXG5cblxuXG4gICAqL1xuICBjYW5TZWVrKGluZGV4KSB7XG4gICAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbiAgICByZXR1cm4gaW5kZXggPj0gMCAmJiBmaWVsZHMub2Zmc2V0ICsgaW5kZXggPD0gZmllbGRzLmxlbmd0aDtcbiAgfVxuXG4gIC8qXG5cblxuICAgKi9cbiAgYXNzZXJ0Q2FuU2VlayhpbmRleCkge1xuICAgIGNvbnN0IGZpZWxkcyA9IHByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4gICAgaWYgKCF0aGlzLmNhblNlZWsoaW5kZXgpKSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgYEVuZCBvZiBkYXRhIHJlYWNoZWQgKGRhdGEgbGVuZ3RoID0gJHtmaWVsZHMubGVuZ3RofSwgYXNrZWQgaW5kZXggJHtpbmRleH1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKlxuXG5cbiAgICovXG4gIHNlZWsoaW5kZXgpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBwcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuICAgIGNvbnN0IHJlc3RvcmUgPSBmaWVsZHMuaW5kZXg7XG4gICAgdGhpcy5hc3NlcnRDYW5TZWVrKGluZGV4KTtcbiAgICBmaWVsZHMuaW5kZXggPSBpbmRleDtcbiAgICByZXR1cm4gcmVzdG9yZTtcbiAgfVxuXG4gIC8qXG5cblxuICAgKi9cbiAgcGVlayhzaXplKSB7XG4gICAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbiAgICAvL1xuICAgIHNpemUgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihmaWVsZHMubGVuZ3RoIC0gZmllbGRzLmluZGV4LCBzaXplKSk7XG4gICAgaWYgKHNpemUgPT09IDApIHtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGZpZWxkcy5ieXRlcy5zdWJhcnJheShcbiAgICAgIGZpZWxkcy5vZmZzZXQgKyBmaWVsZHMuaW5kZXgsXG4gICAgICBmaWVsZHMub2Zmc2V0ICsgZmllbGRzLmluZGV4ICsgc2l6ZSxcbiAgICApO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICBjYW5SZWFkKG9mZnNldCkge1xuICAgIGNvbnN0IGZpZWxkcyA9IHByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4gICAgcmV0dXJuIHRoaXMuY2FuU2VlayhmaWVsZHMuaW5kZXggKyBvZmZzZXQpO1xuICB9XG5cbiAgLypcblxuXG5cblxuICAgKi9cbiAgYXNzZXJ0Q2FuUmVhZChvZmZzZXQpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBwcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuICAgIHRoaXMuYXNzZXJ0Q2FuU2VlayhmaWVsZHMuaW5kZXggKyBvZmZzZXQpO1xuICB9XG5cbiAgLypcblxuXG5cblxuICAgKi9cbiAgcmVhZChzaXplKSB7XG4gICAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbiAgICB0aGlzLmFzc2VydENhblJlYWQoc2l6ZSk7XG4gICAgY29uc3QgcmVzdWx0ID0gdGhpcy5wZWVrKHNpemUpO1xuICAgIGZpZWxkcy5pbmRleCArPSBzaXplO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICByZWFkVWludDgoKSB7XG4gICAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbiAgICB0aGlzLmFzc2VydENhblJlYWQoMSk7XG4gICAgY29uc3QgaW5kZXggPSBmaWVsZHMub2Zmc2V0ICsgZmllbGRzLmluZGV4O1xuICAgIGNvbnN0IHZhbHVlID0gZmllbGRzLmRhdGEuZ2V0VWludDgoaW5kZXgpO1xuICAgIGZpZWxkcy5pbmRleCArPSAxO1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qXG5cblxuICAgKi9cbiAgcmVhZFVpbnQxNihsaXR0bGVFbmRpYW4pIHtcbiAgICBjb25zdCBmaWVsZHMgPSBwcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuICAgIHRoaXMuYXNzZXJ0Q2FuUmVhZCgyKTtcbiAgICBjb25zdCBpbmRleCA9IGZpZWxkcy5vZmZzZXQgKyBmaWVsZHMuaW5kZXg7XG4gICAgY29uc3QgdmFsdWUgPSBmaWVsZHMuZGF0YS5nZXRVaW50MTYoaW5kZXgsIGxpdHRsZUVuZGlhbik7XG4gICAgZmllbGRzLmluZGV4ICs9IDI7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLypcblxuXG4gICAqL1xuICByZWFkVWludDMyKGxpdHRsZUVuZGlhbikge1xuICAgIGNvbnN0IGZpZWxkcyA9IHByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4gICAgdGhpcy5hc3NlcnRDYW5SZWFkKDQpO1xuICAgIGNvbnN0IGluZGV4ID0gZmllbGRzLm9mZnNldCArIGZpZWxkcy5pbmRleDtcbiAgICBjb25zdCB2YWx1ZSA9IGZpZWxkcy5kYXRhLmdldFVpbnQzMihpbmRleCwgbGl0dGxlRW5kaWFuKTtcbiAgICBmaWVsZHMuaW5kZXggKz0gNDtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKlxuXG5cbiAgICovXG4gIGJ5dGVBdChpbmRleCkge1xuICAgIGNvbnN0IGZpZWxkcyA9IHByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4gICAgcmV0dXJuIGZpZWxkcy5ieXRlc1tmaWVsZHMub2Zmc2V0ICsgaW5kZXhdO1xuICB9XG5cbiAgLypcblxuICAgKi9cbiAgc2tpcChvZmZzZXQpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBwcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuICAgIHRoaXMuc2VlayhmaWVsZHMuaW5kZXggKyBvZmZzZXQpO1xuICB9XG5cbiAgLypcblxuXG4gICAqL1xuICBleHBlY3QoZXhwZWN0ZWQpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBwcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuICAgIGlmICghdGhpcy5tYXRjaEF0KGZpZWxkcy5pbmRleCwgZXhwZWN0ZWQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZpZWxkcy5pbmRleCArPSBleHBlY3RlZC5sZW5ndGg7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKlxuXG5cblxuICAgKi9cbiAgbWF0Y2hBdChpbmRleCwgZXhwZWN0ZWQpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBwcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuICAgIGlmIChpbmRleCArIGV4cGVjdGVkLmxlbmd0aCA+IGZpZWxkcy5sZW5ndGggfHwgaW5kZXggPCAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXhwZWN0ZWQubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgIGlmIChleHBlY3RlZFtpXSAhPT0gdGhpcy5ieXRlQXQoaW5kZXggKyBpKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgLypcblxuICAgKi9cbiAgYXNzZXJ0KGV4cGVjdGVkKSB7XG4gICAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbiAgICBpZiAoIXRoaXMuZXhwZWN0KGV4cGVjdGVkKSkge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIGBFeHBlY3RlZCAke3EoZXhwZWN0ZWQpfSBhdCAke2ZpZWxkcy5pbmRleH0sIGdvdCAke3RoaXMucGVlayhcbiAgICAgICAgICBleHBlY3RlZC5sZW5ndGgsXG4gICAgICAgICl9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLypcblxuXG4gICAqL1xuICBmaW5kTGFzdChleHBlY3RlZCkge1xuICAgIGNvbnN0IGZpZWxkcyA9IHByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4gICAgbGV0IGluZGV4ID0gZmllbGRzLmxlbmd0aCAtIGV4cGVjdGVkLmxlbmd0aDtcbiAgICB3aGlsZSAoaW5kZXggPj0gMCAmJiAhdGhpcy5tYXRjaEF0KGluZGV4LCBleHBlY3RlZCkpIHtcbiAgICAgIGluZGV4IC09IDE7XG4gICAgfVxuICAgIHJldHVybiBpbmRleDtcbiAgfVxufSRozY9fb25jZS4gICBCdWZmZXJSZWFkZXIoQnVmZmVyUmVhZGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkJ1ZmZlclJlYWRlciI6WyJCdWZmZXJSZWFkZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA9bKmuL4PAAC+DwAAJQAAAEBlbmRvL3ppcC12MS4wLjkvc3JjL2J1ZmZlci13cml0ZXIuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkJ1ZmZlcldyaXRlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuXG5cblxuICovXG5jb25zdCBwcml2YXRlRmllbGRzID0gbmV3IFdlYWtNYXAoKTtcblxuLypcblxuICovXG5jb25zdCBnZXRQcml2YXRlRmllbGRzID0gc2VsZiA9PiB7XG4gIGNvbnN0IGZpZWxkcyA9IHByaXZhdGVGaWVsZHMuZ2V0KHNlbGYpO1xuICBpZiAoIWZpZWxkcykge1xuICAgIHRocm93IEVycm9yKCdCdWZmZXJXcml0ZXIgZmllbGRzIGFyZSBub3QgaW5pdGlhbGl6ZWQnKTtcbiAgfVxuICByZXR1cm4gZmllbGRzO1xufTtcblxuY29uc3QgYXNzZXJ0TmF0TnVtYmVyID0gbiA9PiB7XG4gIGlmIChOdW1iZXIuaXNTYWZlSW50ZWdlcihuKSAmJiAvKiAgICAgICAgICAgICAgICAgKi8gKG4pID49IDApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhyb3cgVHlwZUVycm9yKGBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIsIGdvdCAke259YCk7XG59O1xuXG4gICAgICAgY2xhc3MgQnVmZmVyV3JpdGVyIHtcbiAgLypcblxuICAgKi9cbiAgZ2V0IGxlbmd0aCgpIHtcbiAgICByZXR1cm4gZ2V0UHJpdmF0ZUZpZWxkcyh0aGlzKS5sZW5ndGg7XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICBnZXQgaW5kZXgoKSB7XG4gICAgcmV0dXJuIGdldFByaXZhdGVGaWVsZHModGhpcykuaW5kZXg7XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICBzZXQgaW5kZXgoaW5kZXgpIHtcbiAgICB0aGlzLnNlZWsoaW5kZXgpO1xuICB9XG5cbiAgLypcblxuICAgKi9cbiAgY29uc3RydWN0b3IoY2FwYWNpdHkgPSAxNikge1xuICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoY2FwYWNpdHkpO1xuICAgIGNvbnN0IGRhdGEgPSBuZXcgRGF0YVZpZXcoYnl0ZXMuYnVmZmVyKTtcbiAgICBwcml2YXRlRmllbGRzLnNldCh0aGlzLCB7XG4gICAgICBieXRlcyxcbiAgICAgIGRhdGEsXG4gICAgICBpbmRleDogMCxcbiAgICAgIGxlbmd0aDogMCxcbiAgICAgIGNhcGFjaXR5LFxuICAgIH0pO1xuICB9XG5cbiAgLypcblxuICAgKi9cbiAgZW5zdXJlQ2FuU2VlayhyZXF1aXJlZCkge1xuICAgIGFzc2VydE5hdE51bWJlcihyZXF1aXJlZCk7XG4gICAgY29uc3QgZmllbGRzID0gZ2V0UHJpdmF0ZUZpZWxkcyh0aGlzKTtcbiAgICBsZXQgY2FwYWNpdHkgPSBmaWVsZHMuY2FwYWNpdHk7XG4gICAgd2hpbGUgKGNhcGFjaXR5IDwgcmVxdWlyZWQpIHtcbiAgICAgIGNhcGFjaXR5ICo9IDI7XG4gICAgfVxuICAgIGNvbnN0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoY2FwYWNpdHkpO1xuICAgIGNvbnN0IGRhdGEgPSBuZXcgRGF0YVZpZXcoYnl0ZXMuYnVmZmVyKTtcbiAgICBieXRlcy5zZXQoZmllbGRzLmJ5dGVzLnN1YmFycmF5KDAsIGZpZWxkcy5sZW5ndGgpKTtcbiAgICBmaWVsZHMuYnl0ZXMgPSBieXRlcztcbiAgICBmaWVsZHMuZGF0YSA9IGRhdGE7XG4gICAgZmllbGRzLmNhcGFjaXR5ID0gY2FwYWNpdHk7XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICBzZWVrKGluZGV4KSB7XG4gICAgY29uc3QgZmllbGRzID0gZ2V0UHJpdmF0ZUZpZWxkcyh0aGlzKTtcbiAgICB0aGlzLmVuc3VyZUNhblNlZWsoaW5kZXgpO1xuICAgIGZpZWxkcy5pbmRleCA9IGluZGV4O1xuICAgIGZpZWxkcy5sZW5ndGggPSBNYXRoLm1heChmaWVsZHMuaW5kZXgsIGZpZWxkcy5sZW5ndGgpO1xuICB9XG5cbiAgLypcblxuICAgKi9cbiAgZW5zdXJlQ2FuV3JpdGUoc2l6ZSkge1xuICAgIGFzc2VydE5hdE51bWJlcihzaXplKTtcbiAgICBjb25zdCBmaWVsZHMgPSBnZXRQcml2YXRlRmllbGRzKHRoaXMpO1xuICAgIHRoaXMuZW5zdXJlQ2FuU2VlayhmaWVsZHMuaW5kZXggKyBzaXplKTtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIHdyaXRlKGJ5dGVzKSB7XG4gICAgY29uc3QgZmllbGRzID0gZ2V0UHJpdmF0ZUZpZWxkcyh0aGlzKTtcbiAgICB0aGlzLmVuc3VyZUNhbldyaXRlKGJ5dGVzLmJ5dGVMZW5ndGgpO1xuICAgIGZpZWxkcy5ieXRlcy5zZXQoYnl0ZXMsIGZpZWxkcy5pbmRleCk7XG4gICAgZmllbGRzLmluZGV4ICs9IGJ5dGVzLmJ5dGVMZW5ndGg7XG4gICAgZmllbGRzLmxlbmd0aCA9IE1hdGgubWF4KGZpZWxkcy5pbmRleCwgZmllbGRzLmxlbmd0aCk7XG4gIH1cblxuICAvKlxuXG5cbiAgICovXG4gIHdyaXRlQ29weShzdGFydCwgZW5kKSB7XG4gICAgYXNzZXJ0TmF0TnVtYmVyKHN0YXJ0KTtcbiAgICBhc3NlcnROYXROdW1iZXIoZW5kKTtcbiAgICBjb25zdCBmaWVsZHMgPSBnZXRQcml2YXRlRmllbGRzKHRoaXMpO1xuICAgIGNvbnN0IHNpemUgPSBlbmQgLSBzdGFydDtcbiAgICB0aGlzLmVuc3VyZUNhbldyaXRlKHNpemUpO1xuICAgIGZpZWxkcy5ieXRlcy5jb3B5V2l0aGluKGZpZWxkcy5pbmRleCwgc3RhcnQsIGVuZCk7XG4gICAgZmllbGRzLmluZGV4ICs9IHNpemU7XG4gICAgZmllbGRzLmxlbmd0aCA9IE1hdGgubWF4KGZpZWxkcy5pbmRleCwgZmllbGRzLmxlbmd0aCk7XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICB3cml0ZVVpbnQ4KHZhbHVlKSB7XG4gICAgY29uc3QgZmllbGRzID0gZ2V0UHJpdmF0ZUZpZWxkcyh0aGlzKTtcbiAgICB0aGlzLmVuc3VyZUNhbldyaXRlKDEpO1xuICAgIGZpZWxkcy5kYXRhLnNldFVpbnQ4KGZpZWxkcy5pbmRleCwgdmFsdWUpO1xuICAgIGZpZWxkcy5pbmRleCArPSAxO1xuICAgIGZpZWxkcy5sZW5ndGggPSBNYXRoLm1heChmaWVsZHMuaW5kZXgsIGZpZWxkcy5sZW5ndGgpO1xuICB9XG5cbiAgLypcblxuXG4gICAqL1xuICB3cml0ZVVpbnQxNih2YWx1ZSwgbGl0dGxlRW5kaWFuKSB7XG4gICAgY29uc3QgZmllbGRzID0gZ2V0UHJpdmF0ZUZpZWxkcyh0aGlzKTtcbiAgICB0aGlzLmVuc3VyZUNhbldyaXRlKDIpO1xuICAgIGNvbnN0IGluZGV4ID0gZmllbGRzLmluZGV4O1xuICAgIGZpZWxkcy5kYXRhLnNldFVpbnQxNihpbmRleCwgdmFsdWUsIGxpdHRsZUVuZGlhbik7XG4gICAgZmllbGRzLmluZGV4ICs9IDI7XG4gICAgZmllbGRzLmxlbmd0aCA9IE1hdGgubWF4KGZpZWxkcy5pbmRleCwgZmllbGRzLmxlbmd0aCk7XG4gIH1cblxuICAvKlxuXG5cbiAgICovXG4gIHdyaXRlVWludDMyKHZhbHVlLCBsaXR0bGVFbmRpYW4pIHtcbiAgICBjb25zdCBmaWVsZHMgPSBnZXRQcml2YXRlRmllbGRzKHRoaXMpO1xuICAgIHRoaXMuZW5zdXJlQ2FuV3JpdGUoNCk7XG4gICAgY29uc3QgaW5kZXggPSBmaWVsZHMuaW5kZXg7XG4gICAgZmllbGRzLmRhdGEuc2V0VWludDMyKGluZGV4LCB2YWx1ZSwgbGl0dGxlRW5kaWFuKTtcbiAgICBmaWVsZHMuaW5kZXggKz0gNDtcbiAgICBmaWVsZHMubGVuZ3RoID0gTWF0aC5tYXgoZmllbGRzLmluZGV4LCBmaWVsZHMubGVuZ3RoKTtcbiAgfVxuXG4gIC8qXG5cblxuXG4gICAqL1xuICBzdWJhcnJheShiZWdpbiwgZW5kKSB7XG4gICAgY29uc3QgZmllbGRzID0gZ2V0UHJpdmF0ZUZpZWxkcyh0aGlzKTtcbiAgICByZXR1cm4gZmllbGRzLmJ5dGVzLnN1YmFycmF5KDAsIGZpZWxkcy5sZW5ndGgpLnN1YmFycmF5KGJlZ2luLCBlbmQpO1xuICB9XG5cbiAgLypcblxuXG5cbiAgICovXG4gIHNsaWNlKGJlZ2luLCBlbmQpIHtcbiAgICByZXR1cm4gdGhpcy5zdWJhcnJheShiZWdpbiwgZW5kKS5zbGljZSgpO1xuICB9XG59JGjNj19vbmNlLiAgIEJ1ZmZlcldyaXRlcihCdWZmZXJXcml0ZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQnVmZmVyV3JpdGVyIjpbIkJ1ZmZlcldyaXRlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADRkNr8qAEAAKgBAAAjAAAAQGVuZG8vemlwLXYxLjAuOS9zcmMvY29tcHJlc3Npb24uanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIlNUT1JFIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8vXG5cbi8vXG4gICAgICAgY29uc3QgU1RPUkUgPSAwOyRozY9fb25jZS5TVE9SRShTVE9SRSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJTVE9SRSI6WyJTVE9SRSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABe5tGBOAQAADgEAAAdAAAAQGVuZG8vemlwLXYxLjAuOS9zcmMvY3JjMzIuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImNyYzMyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShjcmMzMiwnbmFtZScse3ZhbHVlOlwiY3JjMzJcIn0pOyRozY9fb25jZS5jcmMzMihjcmMzMik7Ly9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qXG5cblxuXG4gKi9cblxuLy9cbi8qXG5cbiAqL1xuZnVuY3Rpb24gbWFrZVRhYmxlKCkge1xuICBsZXQgYztcbiAgY29uc3QgdGFibGUgPSBbXTtcblxuICBmb3IgKGxldCBuID0gMDsgbiA8IDI1NjsgbiArPSAxKSB7XG4gICAgYyA9IG47XG4gICAgZm9yIChsZXQgayA9IDA7IGsgPCA4OyBrICs9IDEpIHtcbiAgICAgIGMgPSBjICYgMSA/IDB4ZWRiODgzMjAgXiAoYyA+Pj4gMSkgOiBjID4+PiAxO1xuICAgIH1cbiAgICB0YWJsZVtuXSA9IGM7XG4gIH1cblxuICByZXR1cm4gdGFibGU7XG59XG5cbi8vXG5jb25zdCB0YWJsZSA9IG1ha2VUYWJsZSgpO1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBmdW5jdGlvbiBjcmMzMihieXRlcywgbGVuZ3RoID0gYnl0ZXMubGVuZ3RoLCBpbmRleCA9IDAsIGNyYyA9IDApIHtcbiAgY29uc3QgZW5kID0gaW5kZXggKyBsZW5ndGg7XG5cbiAgY3JjIF49IC0xO1xuXG4gIGZvciAobGV0IGkgPSBpbmRleDsgaSA8IGVuZDsgaSArPSAxKSB7XG4gICAgY3JjID0gKGNyYyA+Pj4gOCkgXiB0YWJsZVsoY3JjIF4gYnl0ZXNbaV0pICYgMHhmZl07XG4gIH1cblxuICByZXR1cm4gKGNyYyBeIC0xKSA+Pj4gMDtcbn1cbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNyYzMyIjpbImNyYzMyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJmqZKueKgAAnioAACUAAABAZW5kby96aXAtdjEuMC45L3NyYy9mb3JtYXQtcmVhZGVyLmpzeyJpbXBvcnRzIjpbIi4vdHlwZXMuanMiLCIuL2NyYzMyLmpzIiwiLi9zaWduYXR1cmUuanMiLCIuL2NvbXByZXNzaW9uLmpzIl0sImV4cG9ydHMiOlsicmVhZFppcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGNyYzMyLHNpZ25hdHVyZSxjb21wcmVzc2lvbjskaM2PX2ltcG9ydHMoW1tcIi4vdHlwZXMuanNcIiwgW11dLFtcIi4vY3JjMzIuanNcIiwgW1tcImNyYzMyXCIsWyRozY9fYSA9PiAoY3JjMzIgPSAkaM2PX2EpXV1dXSxbXCIuL3NpZ25hdHVyZS5qc1wiLCBbW1wiKlwiLFskaM2PX2EgPT4gKHNpZ25hdHVyZSA9ICRozY9fYSldXV1dLFtcIi4vY29tcHJlc3Npb24uanNcIiwgW1tcIipcIixbJGjNj19hID0+IChjb21wcmVzc2lvbiA9ICRozY9fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHJlYWRaaXAsJ25hbWUnLHt2YWx1ZTpcInJlYWRaaXBcIn0pOyRozY9fb25jZS5yZWFkWmlwKHJlYWRaaXApO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vL1xuY29uc3QgcSA9IEpTT04uc3RyaW5naWZ5O1xuXG5jb25zdCBNQVhfVkFMVUVfMTZCSVRTID0gNjU1MzU7XG5jb25zdCBNQVhfVkFMVUVfMzJCSVRTID0gNDI5NDk2NzI5NTtcblxuY29uc3QgdGV4dERlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcblxuLypcblxuXG4gKi9cbmZ1bmN0aW9uIGlzRW5jcnlwdGVkKGJpdEZsYWcpIHtcbiAgcmV0dXJuIChiaXRGbGFnICYgMHgwMDAxKSA9PT0gMHgwMDAxO1xufVxuXG4vKlxuXG5cblxuXG4gKi9cbmZ1bmN0aW9uIHJlYWREb3NEYXRlVGltZShyZWFkZXIpIHtcbiAgY29uc3QgZG9zVGltZSA9IHJlYWRlci5yZWFkVWludDMyKHRydWUpO1xuICByZXR1cm4gbmV3IERhdGUoXG4gICAgRGF0ZS5VVEMoXG4gICAgICAoKGRvc1RpbWUgPj4gMjUpICYgMHg3ZikgKyAxOTgwLCAvL1xuICAgICAgKChkb3NUaW1lID4+IDIxKSAmIDB4MGYpIC0gMSwgLy9cbiAgICAgIChkb3NUaW1lID4+IDE2KSAmIDB4MWYsIC8vXG4gICAgICAoZG9zVGltZSA+PiAxMSkgJiAweDFmLCAvL1xuICAgICAgKGRvc1RpbWUgPj4gNSkgJiAweDNmLCAvL1xuICAgICAgKGRvc1RpbWUgJiAweDFmKSA8PCAxICAvL1xuICAgICksXG4gICk7XG59XG5cbi8qXG5cblxuICovXG5mdW5jdGlvbiByZWFkSGVhZGVycyhyZWFkZXIpIHtcbiAgcmV0dXJuIHtcbiAgICB2ZXJzaW9uTmVlZGVkOiByZWFkZXIucmVhZFVpbnQxNih0cnVlKSxcbiAgICBiaXRGbGFnOiByZWFkZXIucmVhZFVpbnQxNih0cnVlKSxcbiAgICBjb21wcmVzc2lvbk1ldGhvZDogcmVhZGVyLnJlYWRVaW50MTYodHJ1ZSksXG4gICAgZGF0ZTogcmVhZERvc0RhdGVUaW1lKHJlYWRlciksXG4gICAgY3JjMzI6IHJlYWRlci5yZWFkVWludDMyKHRydWUpLFxuICAgIGNvbXByZXNzZWRMZW5ndGg6IHJlYWRlci5yZWFkVWludDMyKHRydWUpLFxuICAgIHVuY29tcHJlc3NlZExlbmd0aDogcmVhZGVyLnJlYWRVaW50MzIodHJ1ZSksXG4gIH07XG59XG5cbi8qXG5cblxuICovXG5mdW5jdGlvbiByZWFkQ2VudHJhbEZpbGVIZWFkZXIocmVhZGVyKSB7XG4gIGNvbnN0IHZlcnNpb24gPSByZWFkZXIucmVhZFVpbnQ4KCk7XG4gIGNvbnN0IG1hZGVCeSA9IHJlYWRlci5yZWFkVWludDgoKTtcbiAgY29uc3QgaGVhZGVycyA9IHJlYWRIZWFkZXJzKHJlYWRlcik7XG4gIGNvbnN0IG5hbWVMZW5ndGggPSByZWFkZXIucmVhZFVpbnQxNih0cnVlKTtcbiAgY29uc3QgZXh0cmFGaWVsZHNMZW5ndGggPSByZWFkZXIucmVhZFVpbnQxNih0cnVlKTtcbiAgY29uc3QgY29tbWVudExlbmd0aCA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBkaXNrTnVtYmVyU3RhcnQgPSByZWFkZXIucmVhZFVpbnQxNih0cnVlKTtcbiAgY29uc3QgaW50ZXJuYWxGaWxlQXR0cmlidXRlcyA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBleHRlcm5hbEZpbGVBdHRyaWJ1dGVzID0gcmVhZGVyLnJlYWRVaW50MzIodHJ1ZSk7XG4gIGNvbnN0IGZpbGVTdGFydCA9IHJlYWRlci5yZWFkVWludDMyKHRydWUpO1xuXG4gIGNvbnN0IG5hbWUgPSByZWFkZXIucmVhZChuYW1lTGVuZ3RoKTtcbiAgLy9cbiAgcmVhZGVyLnNraXAoZXh0cmFGaWVsZHNMZW5ndGgpO1xuXG4gIGlmIChoZWFkZXJzLnVuY29tcHJlc3NlZExlbmd0aCA9PT0gTUFYX1ZBTFVFXzMyQklUUykge1xuICAgIHRocm93IEVycm9yKCdDYW5ub3QgcmVhZCBaaXA2NCcpO1xuICB9XG4gIGlmIChoZWFkZXJzLmNvbXByZXNzZWRMZW5ndGggPT09IE1BWF9WQUxVRV8zMkJJVFMpIHtcbiAgICB0aHJvdyBFcnJvcignQ2Fubm90IHJlYWQgWmlwNjQnKTtcbiAgfVxuICBpZiAoZmlsZVN0YXJ0ID09PSBNQVhfVkFMVUVfMzJCSVRTKSB7XG4gICAgdGhyb3cgRXJyb3IoJ0Nhbm5vdCByZWFkIFppcDY0Jyk7XG4gIH1cbiAgaWYgKGRpc2tOdW1iZXJTdGFydCA9PT0gTUFYX1ZBTFVFXzMyQklUUykge1xuICAgIHRocm93IEVycm9yKCdDYW5ub3QgcmVhZCBaaXA2NCcpO1xuICB9XG5cbiAgY29uc3QgY29tbWVudCA9IHJlYWRlci5yZWFkKGNvbW1lbnRMZW5ndGgpO1xuXG4gIHJldHVybiB7XG4gICAgbmFtZSxcbiAgICB2ZXJzaW9uLFxuICAgIG1hZGVCeSxcbiAgICAuLi5oZWFkZXJzLFxuICAgIGRpc2tOdW1iZXJTdGFydCxcbiAgICBpbnRlcm5hbEZpbGVBdHRyaWJ1dGVzLFxuICAgIGV4dGVybmFsRmlsZUF0dHJpYnV0ZXMsXG4gICAgZmlsZVN0YXJ0LFxuICAgIGNvbW1lbnQsXG4gIH07XG59XG5cbi8qXG5cblxuXG4gKi9cbmZ1bmN0aW9uIHJlYWRDZW50cmFsRGlyZWN0b3J5KHJlYWRlciwgbG9jYXRvcikge1xuICBjb25zdCB7IGNlbnRyYWxEaXJlY3RvcnlPZmZzZXQsIGNlbnRyYWxEaXJlY3RvcnlSZWNvcmRzIH0gPSBsb2NhdG9yO1xuICByZWFkZXIuc2VlayhjZW50cmFsRGlyZWN0b3J5T2Zmc2V0KTtcblxuICBjb25zdCBlbnRyaWVzID0gW107XG4gIHdoaWxlIChyZWFkZXIuZXhwZWN0KHNpZ25hdHVyZS5DRU5UUkFMX0ZJTEVfSEVBREVSKSkge1xuICAgIGNvbnN0IGVudHJ5ID0gcmVhZENlbnRyYWxGaWxlSGVhZGVyKHJlYWRlcik7XG4gICAgZW50cmllcy5wdXNoKGVudHJ5KTtcbiAgfVxuXG4gIGlmIChjZW50cmFsRGlyZWN0b3J5UmVjb3JkcyAhPT0gZW50cmllcy5sZW5ndGgpIHtcbiAgICAvL1xuICAgIC8vXG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICBgQ29ycnVwdGVkIHppcCBvciBidWc6IGV4cGVjdGVkICR7Y2VudHJhbERpcmVjdG9yeVJlY29yZHN9IHJlY29yZHMgaW4gY2VudHJhbCBkaXIsIGdvdCAke2VudHJpZXMubGVuZ3RofWAsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBlbnRyaWVzO1xufVxuXG4vKlxuXG5cbiAqL1xuZnVuY3Rpb24gcmVhZEZpbGUocmVhZGVyKSB7XG4gIHJlYWRlci5leHBlY3Qoc2lnbmF0dXJlLkxPQ0FMX0ZJTEVfSEVBREVSKTtcbiAgY29uc3QgaGVhZGVycyA9IHJlYWRIZWFkZXJzKHJlYWRlcik7XG4gIGNvbnN0IG5hbWVMZW5ndGggPSByZWFkZXIucmVhZFVpbnQxNih0cnVlKTtcbiAgY29uc3QgZXh0cmFGaWVsZHNMZW5ndGggPSByZWFkZXIucmVhZFVpbnQxNih0cnVlKTtcbiAgY29uc3QgbmFtZSA9IHJlYWRlci5yZWFkKG5hbWVMZW5ndGgpO1xuICByZWFkZXIuc2tpcChleHRyYUZpZWxkc0xlbmd0aCk7XG4gIGNvbnN0IGNvbnRlbnQgPSByZWFkZXIucmVhZChoZWFkZXJzLmNvbXByZXNzZWRMZW5ndGgpO1xuICByZXR1cm4geyBuYW1lLCAuLi5oZWFkZXJzLCBjb250ZW50IH07XG59XG5cbi8qXG5cblxuXG4gKi9cbmZ1bmN0aW9uIHJlYWRMb2NhbEZpbGVzKHJlYWRlciwgcmVjb3Jkcykge1xuICBjb25zdCBmaWxlcyA9IFtdO1xuICBmb3IgKGNvbnN0IHJlY29yZCBvZiByZWNvcmRzKSB7XG4gICAgcmVhZGVyLnNlZWsocmVjb3JkLmZpbGVTdGFydCk7XG4gICAgY29uc3QgZmlsZSA9IHJlYWRGaWxlKHJlYWRlcik7XG4gICAgZmlsZXMucHVzaChmaWxlKTtcbiAgfVxuICByZXR1cm4gZmlsZXM7XG59XG5cbi8qXG5cblxuICovXG5mdW5jdGlvbiByZWFkQmxvY2tFbmRPZkNlbnRyYWwocmVhZGVyKSB7XG4gIGlmICghcmVhZGVyLmV4cGVjdChzaWduYXR1cmUuQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKSkge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgJ0NvcnJ1cHQgemlwIGZpbGUsIG9yIHppcCBmaWxlIGNvbnRhaW5pbmcgYW4gdW5zdXBwb3J0ZWQgdmFyaWFibGUtd2lkdGggZW5kLW9mLWFyY2hpdmUgY29tbWVudCwgb3IgYW4gdW5zdXBwb3J0ZWQgemlwIGZpbGUgd2l0aCA2NCBiaXQgc2l6ZXMnLFxuICAgICk7XG4gIH1cbiAgY29uc3QgZGlza051bWJlciA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBkaXNrV2l0aENlbnRyYWxEaXJTdGFydCA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBjZW50cmFsRGlyZWN0b3J5UmVjb3Jkc09uVGhpc0Rpc2sgPSByZWFkZXIucmVhZFVpbnQxNih0cnVlKTtcbiAgY29uc3QgY2VudHJhbERpcmVjdG9yeVJlY29yZHMgPSByZWFkZXIucmVhZFVpbnQxNih0cnVlKTtcbiAgY29uc3QgY2VudHJhbERpcmVjdG9yeVNpemUgPSByZWFkZXIucmVhZFVpbnQzMih0cnVlKTtcbiAgY29uc3QgY2VudHJhbERpcmVjdG9yeU9mZnNldCA9IHJlYWRlci5yZWFkVWludDMyKHRydWUpO1xuICBjb25zdCBjb21tZW50TGVuZ3RoID0gcmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIGNvbnN0IGNvbW1lbnQgPSB0ZXh0RGVjb2Rlci5kZWNvZGUocmVhZGVyLnJlYWQoY29tbWVudExlbmd0aCkpO1xuICByZXR1cm4ge1xuICAgIGRpc2tOdW1iZXIsXG4gICAgZGlza1dpdGhDZW50cmFsRGlyU3RhcnQsXG4gICAgY2VudHJhbERpcmVjdG9yeVJlY29yZHNPblRoaXNEaXNrLFxuICAgIGNlbnRyYWxEaXJlY3RvcnlSZWNvcmRzLFxuICAgIGNlbnRyYWxEaXJlY3RvcnlTaXplLFxuICAgIGNlbnRyYWxEaXJlY3RvcnlPZmZzZXQsXG4gICAgY29tbWVudCxcbiAgfTtcbn1cblxuLypcblxuXG4gKi9cbmZ1bmN0aW9uIHJlYWRFbmRPZkNlbnRyYWxEaXJlY3RvcnlSZWNvcmQocmVhZGVyKSB7XG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIGNvbnN0IGNlbnRyYWxEaXJlY3RvcnlFbmQgPSByZWFkZXIubGVuZ3RoIC0gMjI7XG4gIGlmIChjZW50cmFsRGlyZWN0b3J5RW5kIDwgMCkge1xuICAgIHRocm93IEVycm9yKCdDb3JydXB0ZWQgemlwOiBub3QgZW5vdWdoIGNvbnRlbnQnKTtcbiAgfVxuICByZWFkZXIuc2VlayhjZW50cmFsRGlyZWN0b3J5RW5kKTtcbiAgY29uc3QgbG9jYXRvciA9IHJlYWRCbG9ja0VuZE9mQ2VudHJhbChyZWFkZXIpO1xuXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIGNvbnN0IHppcDY0ID1cbiAgICBsb2NhdG9yLmRpc2tOdW1iZXIgPT09IE1BWF9WQUxVRV8xNkJJVFMgfHxcbiAgICBsb2NhdG9yLmRpc2tXaXRoQ2VudHJhbERpclN0YXJ0ID09PSBNQVhfVkFMVUVfMTZCSVRTIHx8XG4gICAgbG9jYXRvci5jZW50cmFsRGlyZWN0b3J5UmVjb3Jkc09uVGhpc0Rpc2sgPT09IE1BWF9WQUxVRV8xNkJJVFMgfHxcbiAgICBsb2NhdG9yLmNlbnRyYWxEaXJlY3RvcnlSZWNvcmRzID09PSBNQVhfVkFMVUVfMTZCSVRTIHx8XG4gICAgbG9jYXRvci5jZW50cmFsRGlyZWN0b3J5U2l6ZSA9PT0gTUFYX1ZBTFVFXzMyQklUUyB8fFxuICAgIGxvY2F0b3IuY2VudHJhbERpcmVjdG9yeU9mZnNldCA9PT0gTUFYX1ZBTFVFXzMyQklUUztcblxuICBpZiAoemlwNjQpIHtcbiAgICB0aHJvdyBFcnJvcignQ2Fubm90IHJlYWQgWmlwNjQnKTtcbiAgfVxuXG4gIGNvbnN0IHtcbiAgICBjZW50cmFsRGlyZWN0b3J5T2Zmc2V0LFxuICAgIGNlbnRyYWxEaXJlY3RvcnlTaXplXG4gICAgLy9cbiAgfSA9IGxvY2F0b3I7XG5cbiAgY29uc3QgZXhwZWN0ZWRDZW50cmFsRGlyZWN0b3J5RW5kID1cbiAgICBjZW50cmFsRGlyZWN0b3J5T2Zmc2V0ICsgY2VudHJhbERpcmVjdG9yeVNpemU7XG4gIGNvbnN0IGV4dHJhQnl0ZXMgPSBjZW50cmFsRGlyZWN0b3J5RW5kIC0gZXhwZWN0ZWRDZW50cmFsRGlyZWN0b3J5RW5kO1xuXG4gIHJlYWRlci5vZmZzZXQgPSBleHRyYUJ5dGVzO1xuXG4gIHJldHVybiBsb2NhdG9yO1xufVxuXG4vKlxuXG5cblxuICovXG5mdW5jdGlvbiBjaGVja1JlY29yZHMoY2VudHJhbFJlY29yZCwgbG9jYWxSZWNvcmQsIGFyY2hpdmVOYW1lKSB7XG4gIGNvbnN0IGNlbnRyYWxOYW1lID0gdGV4dERlY29kZXIuZGVjb2RlKGNlbnRyYWxSZWNvcmQubmFtZSk7XG4gIGNvbnN0IGxvY2FsTmFtZSA9IHRleHREZWNvZGVyLmRlY29kZShsb2NhbFJlY29yZC5uYW1lKTtcblxuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICBpZiAoY2VudHJhbE5hbWUucmVwbGFjZSgvXFxcXC9nLCAnLycpICE9PSBsb2NhbE5hbWUpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBaaXAgaW50ZWdyaXR5IGVycm9yOiBjZW50cmFsIHJlY29yZCBmaWxlIG5hbWUgJHtxKFxuICAgICAgICBjZW50cmFsTmFtZSxcbiAgICAgICl9IG11c3QgbWF0Y2ggbG9jYWwgZmlsZSBuYW1lICR7cShsb2NhbE5hbWUpfSBpbiBhcmNoaXZlICR7cShcbiAgICAgICAgYXJjaGl2ZU5hbWUsXG4gICAgICApfWAsXG4gICAgKTtcbiAgfVxuXG4gIC8qXG5cblxuICAgKi9cbiAgZnVuY3Rpb24gY2hlY2sodmFsdWUsIG1lc3NhZ2UpIHtcbiAgICBpZiAoIXZhbHVlKSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgYFppcCBpbnRlZ3JpdHkgZXJyb3I6ICR7bWVzc2FnZX0gZm9yIGZpbGUgJHtxKFxuICAgICAgICAgIGxvY2FsTmFtZSxcbiAgICAgICAgKX0gaW4gYXJjaGl2ZSAke3EoYXJjaGl2ZU5hbWUpfWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIGNoZWNrKFxuICAgIGNlbnRyYWxSZWNvcmQuYml0RmxhZyA9PT0gbG9jYWxSZWNvcmQuYml0RmxhZyxcbiAgICBgQ2VudHJhbCByZWNvcmQgYml0IGZsYWcgJHtjZW50cmFsUmVjb3JkLmJpdEZsYWcudG9TdHJpbmcoXG4gICAgICAxNixcbiAgICApfSBtdXN0IG1hdGNoIGxvY2FsIHJlY29yZCBiaXQgZmxhZyAke2xvY2FsUmVjb3JkLmJpdEZsYWcudG9TdHJpbmcoMTYpfWAsXG4gICk7XG4gIGNoZWNrKFxuICAgIGNlbnRyYWxSZWNvcmQuY29tcHJlc3Npb25NZXRob2QgPT09IGxvY2FsUmVjb3JkLmNvbXByZXNzaW9uTWV0aG9kLFxuICAgIGBDZW50cmFsIHJlY29yZCBjb21wcmVzc2lvbiBtZXRob2QgJHtxKFxuICAgICAgY2VudHJhbFJlY29yZC5jb21wcmVzc2lvbk1ldGhvZCxcbiAgICApfSBtdXN0IG1hdGNoIGxvY2FsIGNvbXByZXNzaW9uIG1ldGhvZCAke3EobG9jYWxSZWNvcmQuY29tcHJlc3Npb25NZXRob2QpfWAsXG4gICk7XG4gIC8vXG4gIC8vXG4gIGNoZWNrKFxuICAgIGNlbnRyYWxSZWNvcmQuY3JjMzIgPT09IGxvY2FsUmVjb3JkLmNyYzMyLFxuICAgIGBDZW50cmFsIHJlY29yZCBDUkMtMzIgY2hlY2tzdW0gJHtjZW50cmFsUmVjb3JkLmNyYzMyfSBtdXN0IG1hdGNoIGxvY2FsIGNoZWNrc3VtICR7bG9jYWxSZWNvcmQuY3JjMzJ9YCxcbiAgKTtcbiAgY2hlY2soXG4gICAgY2VudHJhbFJlY29yZC5jb21wcmVzc2VkTGVuZ3RoID09PSBsb2NhbFJlY29yZC5jb21wcmVzc2VkTGVuZ3RoLFxuICAgIGBDZW50cmFsIHJlY29yZCBjb21wcmVzc2VkIHNpemUgJHtjZW50cmFsUmVjb3JkLmNvbXByZXNzZWRMZW5ndGh9IG11c3QgbWF0Y2ggbG9jYWwgJHtsb2NhbFJlY29yZC5jb21wcmVzc2VkTGVuZ3RofWAsXG4gICk7XG4gIGNoZWNrKFxuICAgIGNlbnRyYWxSZWNvcmQudW5jb21wcmVzc2VkTGVuZ3RoID09PSBsb2NhbFJlY29yZC51bmNvbXByZXNzZWRMZW5ndGgsXG4gICAgYENlbnRyYWwgcmVjb3JkIHVuY29tcHJlc3NlZCBzaXplICR7Y2VudHJhbFJlY29yZC51bmNvbXByZXNzZWRMZW5ndGh9IG11c3QgbWF0Y2ggbG9jYWwgJHtsb2NhbFJlY29yZC51bmNvbXByZXNzZWRMZW5ndGh9YCxcbiAgKTtcblxuICBjb25zdCBjaGVja3N1bSA9IGNyYzMyKGxvY2FsUmVjb3JkLmNvbnRlbnQpO1xuICBjaGVjayhcbiAgICBjaGVja3N1bSA9PT0gbG9jYWxSZWNvcmQuY3JjMzIsXG4gICAgYENSQy0zMiBjaGVja3N1bSBtaXNtYXRjaCwgd2FudGVkICR7bG9jYWxSZWNvcmQuY3JjMzJ9IGJ1dCBhY3R1YWwgY29udGVudCBpcyAke2NoZWNrc3VtfWAsXG4gICk7XG59XG5cbi8qXG5cbiAqL1xuZnVuY3Rpb24gbW9kZUZvckV4dGVybmFsQXR0cmlidXRlcyhleHRlcm5hbEZpbGVBdHRyaWJ1dGVzKSB7XG4gIHJldHVybiAoZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyA+PiAxNikgJiAweGZmZmY7XG59XG5cbi8qXG5cblxuXG4gKi9cbmZ1bmN0aW9uIHJlY29yZFRvRmlsZShjZW50cmFsUmVjb3JkLCBsb2NhbFJlY29yZCkge1xuICBjb25zdCBtb2RlID0gbW9kZUZvckV4dGVybmFsQXR0cmlidXRlcyhjZW50cmFsUmVjb3JkLmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMpO1xuICByZXR1cm4ge1xuICAgIG5hbWU6IGNlbnRyYWxSZWNvcmQubmFtZSxcbiAgICBtb2RlLFxuICAgIGRhdGU6IGNlbnRyYWxSZWNvcmQuZGF0ZSxcbiAgICBjcmMzMjogY2VudHJhbFJlY29yZC5jcmMzMixcbiAgICBjb21wcmVzc2lvbk1ldGhvZDogY2VudHJhbFJlY29yZC5jb21wcmVzc2lvbk1ldGhvZCxcbiAgICBjb21wcmVzc2VkTGVuZ3RoOiBjZW50cmFsUmVjb3JkLmNvbXByZXNzZWRMZW5ndGgsXG4gICAgdW5jb21wcmVzc2VkTGVuZ3RoOiBjZW50cmFsUmVjb3JkLnVuY29tcHJlc3NlZExlbmd0aCxcbiAgICBjb250ZW50OiBsb2NhbFJlY29yZC5jb250ZW50LFxuICAgIGNvbW1lbnQ6IGNlbnRyYWxSZWNvcmQuY29tbWVudCxcbiAgfTtcbn1cblxuLypcblxuXG4gKi9cbmZ1bmN0aW9uIGRlY29tcHJlc3NGaWxlKGZpbGUpIHtcbiAgaWYgKGZpbGUuY29tcHJlc3Npb25NZXRob2QgIT09IGNvbXByZXNzaW9uLlNUT1JFKSB7XG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICBgQ2Fubm90IGZpbmQgZGVjb21wcmVzc29yIGZvciBjb21wcmVzc2lvbiBtZXRob2QgJHtxKFxuICAgICAgICBmaWxlLmNvbXByZXNzaW9uTWV0aG9kLFxuICAgICAgKX0gZm9yIGZpbGUgJHtmaWxlLm5hbWV9YCxcbiAgICApO1xuICB9XG4gIHJldHVybiB7XG4gICAgbmFtZTogZmlsZS5uYW1lLFxuICAgIG1vZGU6IGZpbGUubW9kZSxcbiAgICBkYXRlOiBmaWxlLmRhdGUsXG4gICAgY29udGVudDogZmlsZS5jb250ZW50LFxuICAgIGNvbW1lbnQ6IGZpbGUuY29tbWVudCxcbiAgfTtcbn1cblxuLypcblxuXG4gKi9cbmZ1bmN0aW9uIGRlY29kZUZpbGUoZmlsZSkge1xuICBjb25zdCBuYW1lID0gdGV4dERlY29kZXIuZGVjb2RlKGZpbGUubmFtZSk7XG4gIGNvbnN0IGNvbW1lbnQgPSB0ZXh0RGVjb2Rlci5kZWNvZGUoZmlsZS5jb21tZW50KTtcbiAgcmV0dXJuIHtcbiAgICBuYW1lLFxuICAgIHR5cGU6ICdmaWxlJyxcbiAgICBtb2RlOiBmaWxlLm1vZGUgJiAwbzc3NyxcbiAgICBkYXRlOiBmaWxlLmRhdGUsXG4gICAgY29udGVudDogZmlsZS5jb250ZW50LFxuICAgIGNvbW1lbnQsXG4gIH07XG59XG5cbi8qXG5cblxuICovXG4gICAgICAgZnVuY3Rpb24gcmVhZFppcChyZWFkZXIsIG5hbWUgPSAnPHVua25vd24+Jykge1xuICBjb25zdCBsb2NhdG9yID0gcmVhZEVuZE9mQ2VudHJhbERpcmVjdG9yeVJlY29yZChyZWFkZXIpO1xuICBjb25zdCBjZW50cmFsUmVjb3JkcyA9IHJlYWRDZW50cmFsRGlyZWN0b3J5KHJlYWRlciwgbG9jYXRvcik7XG4gIGNvbnN0IGxvY2FsUmVjb3JkcyA9IHJlYWRMb2NhbEZpbGVzKHJlYWRlciwgY2VudHJhbFJlY29yZHMpO1xuICBjb25zdCBmaWxlcyA9IG5ldyBNYXAoKTtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGNlbnRyYWxSZWNvcmRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgY29uc3QgY2VudHJhbFJlY29yZCA9IGNlbnRyYWxSZWNvcmRzW2ldO1xuICAgIGNvbnN0IGxvY2FsUmVjb3JkID0gbG9jYWxSZWNvcmRzW2ldO1xuXG4gICAgY2hlY2tSZWNvcmRzKGNlbnRyYWxSZWNvcmQsIGxvY2FsUmVjb3JkLCBuYW1lKTtcblxuICAgIGlmIChpc0VuY3J5cHRlZChjZW50cmFsUmVjb3JkLmJpdEZsYWcpKSB7XG4gICAgICB0aHJvdyBFcnJvcignRW5jcnlwdGVkIHppcCBhcmUgbm90IHN1cHBvcnRlZCcpO1xuICAgIH1cblxuICAgIGNvbnN0IGlzRGlyID0gKGNlbnRyYWxSZWNvcmQuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyAmIDB4MDAxMCkgIT09IDA7XG4gICAgaWYgKCFpc0Rpcikge1xuICAgICAgY29uc3QgY29tcHJlc3NlZEZpbGUgPSByZWNvcmRUb0ZpbGUoY2VudHJhbFJlY29yZCwgbG9jYWxSZWNvcmQpO1xuICAgICAgY29uc3QgZGVjb21wcmVzc2VkRmlsZSA9IGRlY29tcHJlc3NGaWxlKGNvbXByZXNzZWRGaWxlKTtcbiAgICAgIGNvbnN0IGRlY29kZWRGaWxlID0gZGVjb2RlRmlsZShkZWNvbXByZXNzZWRGaWxlKTtcbiAgICAgIGZpbGVzLnNldChkZWNvZGVkRmlsZS5uYW1lLCBkZWNvZGVkRmlsZSk7XG4gICAgfVxuICAgIC8vXG4gIH1cbiAgcmV0dXJuIGZpbGVzO1xufVxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicmVhZFppcCI6WyJyZWFkWmlwIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIr/B6LBFgAAwRYAACUAAABAZW5kby96aXAtdjEuMC45L3NyYy9mb3JtYXQtd3JpdGVyLmpzeyJpbXBvcnRzIjpbIi4vY3JjMzIuanMiLCIuL3NpZ25hdHVyZS5qcyIsIi4vY29tcHJlc3Npb24uanMiXSwiZXhwb3J0cyI6WyJ3cml0ZVppcCIsIndyaXRlWmlwUmVjb3JkcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGNyYzMyLHNpZ25hdHVyZSxjb21wcmVzc2lvbjskaM2PX2ltcG9ydHMoW1tcIi4vY3JjMzIuanNcIiwgW1tcImNyYzMyXCIsWyRozY9fYSA9PiAoY3JjMzIgPSAkaM2PX2EpXV1dXSxbXCIuL3NpZ25hdHVyZS5qc1wiLCBbW1wiKlwiLFskaM2PX2EgPT4gKHNpZ25hdHVyZSA9ICRozY9fYSldXV1dLFtcIi4vY29tcHJlc3Npb24uanNcIiwgW1tcIipcIixbJGjNj19hID0+IChjb21wcmVzc2lvbiA9ICRozY9fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdyaXRlWmlwUmVjb3JkcywnbmFtZScse3ZhbHVlOlwid3JpdGVaaXBSZWNvcmRzXCJ9KTskaM2PX29uY2Uud3JpdGVaaXBSZWNvcmRzKHdyaXRlWmlwUmVjb3Jkcyk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdyaXRlWmlwLCduYW1lJyx7dmFsdWU6XCJ3cml0ZVppcFwifSk7JGjNj19vbmNlLndyaXRlWmlwKHdyaXRlWmlwKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IFVOSVggPSAzO1xuY29uc3QgVU5JWF9WRVJTSU9OID0gMzA7XG5cbmNvbnN0IHRleHRFbmNvZGVyID0gbmV3IFRleHRFbmNvZGVyKCk7XG5cbi8qXG5cblxuXG5cbiAqL1xuZnVuY3Rpb24gd3JpdGVEb3NEYXRlVGltZSh3cml0ZXIsIGRhdGUpIHtcbiAgY29uc3QgZG9zVGltZSA9XG4gICAgZGF0ZSAhPT0gdW5kZWZpbmVkICYmIGRhdGUgIT09IG51bGxcbiAgICAgID8gKCgoZGF0ZS5nZXRVVENGdWxsWWVhcigpIC0gMTk4MCkgJiAweDdmKSA8PCAyNSkgfCAvL1xuICAgICAgICAoKGRhdGUuZ2V0VVRDTW9udGgoKSArIDEpIDw8IDIxKSB8IC8vXG4gICAgICAgIChkYXRlLmdldFVUQ0RhdGUoKSA8PCAxNikgfCAvL1xuICAgICAgICAoZGF0ZS5nZXRVVENIb3VycygpIDw8IDExKSB8IC8vXG4gICAgICAgIChkYXRlLmdldFVUQ01pbnV0ZXMoKSA8PCA1KSB8IC8vXG4gICAgICAgIChkYXRlLmdldFVUQ1NlY29uZHMoKSA+PiAxKSAvL1xuICAgICAgOiAwOyAvL1xuICB3cml0ZXIud3JpdGVVaW50MzIoZG9zVGltZSwgdHJ1ZSk7XG59XG5cbi8qXG5cblxuXG4gKi9cbmZ1bmN0aW9uIHdyaXRlRmlsZSh3cml0ZXIsIGZpbGUpIHtcbiAgLy9cbiAgY29uc3QgZmlsZVN0YXJ0ID0gd3JpdGVyLmluZGV4O1xuICB3cml0ZXIud3JpdGUoc2lnbmF0dXJlLkxPQ0FMX0ZJTEVfSEVBREVSKTtcbiAgY29uc3QgaGVhZGVyU3RhcnQgPSB3cml0ZXIuaW5kZXg7XG4gIC8vXG4gIHdyaXRlci53cml0ZVVpbnQxNigxMCwgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZVVpbnQxNihmaWxlLmJpdEZsYWcsIHRydWUpO1xuICB3cml0ZXIud3JpdGVVaW50MTYoZmlsZS5jb21wcmVzc2lvbk1ldGhvZCwgdHJ1ZSk7XG4gIHdyaXRlRG9zRGF0ZVRpbWUod3JpdGVyLCBmaWxlLmRhdGUpO1xuICB3cml0ZXIud3JpdGVVaW50MzIoZmlsZS5jcmMzMiwgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZVVpbnQzMihmaWxlLmNvbXByZXNzZWRMZW5ndGgsIHRydWUpO1xuICB3cml0ZXIud3JpdGVVaW50MzIoZmlsZS51bmNvbXByZXNzZWRMZW5ndGgsIHRydWUpO1xuICB3cml0ZXIud3JpdGVVaW50MTYoZmlsZS5uYW1lLmxlbmd0aCwgdHJ1ZSk7XG4gIGNvbnN0IGhlYWRlckVuZCA9IHdyaXRlci5sZW5ndGg7XG5cbiAgLy9cbiAgd3JpdGVyLndyaXRlVWludDE2KDAsIHRydWUpO1xuICB3cml0ZXIud3JpdGUoZmlsZS5uYW1lKTtcbiAgLy9cbiAgd3JpdGVyLndyaXRlKGZpbGUuY29udGVudCk7XG5cbiAgcmV0dXJuIHtcbiAgICBmaWxlU3RhcnQsXG4gICAgaGVhZGVyU3RhcnQsXG4gICAgaGVhZGVyRW5kLFxuICB9O1xufVxuXG4vKlxuXG5cblxuICovXG5mdW5jdGlvbiB3cml0ZUNlbnRyYWxGaWxlSGVhZGVyKHdyaXRlciwgZmlsZSwgbG9jYXRvcikge1xuICB3cml0ZXIud3JpdGUoc2lnbmF0dXJlLkNFTlRSQUxfRklMRV9IRUFERVIpO1xuICB3cml0ZXIud3JpdGVVaW50OChmaWxlLnZlcnNpb24pO1xuICB3cml0ZXIud3JpdGVVaW50OChmaWxlLm1hZGVCeSk7XG4gIHdyaXRlci53cml0ZUNvcHkobG9jYXRvci5oZWFkZXJTdGFydCwgbG9jYXRvci5oZWFkZXJFbmQpO1xuICAvL1xuICB3cml0ZXIud3JpdGVVaW50MTYoMCwgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZVVpbnQxNihmaWxlLmNvbW1lbnQubGVuZ3RoLCB0cnVlKTtcbiAgd3JpdGVyLndyaXRlVWludDE2KGZpbGUuZGlza051bWJlclN0YXJ0LCB0cnVlKTtcbiAgd3JpdGVyLndyaXRlVWludDE2KGZpbGUuaW50ZXJuYWxGaWxlQXR0cmlidXRlcywgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZVVpbnQzMihmaWxlLmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMsIHRydWUpO1xuICB3cml0ZXIud3JpdGVVaW50MzIobG9jYXRvci5maWxlU3RhcnQsIHRydWUpO1xuICB3cml0ZXIud3JpdGUoZmlsZS5jZW50cmFsTmFtZSk7XG4gIC8vXG4gIHdyaXRlci53cml0ZShmaWxlLmNvbW1lbnQpO1xufVxuXG4vKlxuXG5cblxuXG5cbiAqL1xuZnVuY3Rpb24gd3JpdGVFbmRPZkNlbnRyYWxEaXJlY3RvcnlSZWNvcmQoXG4gIHdyaXRlcixcbiAgZW50cmllc0NvdW50LFxuICBjZW50cmFsRGlyZWN0b3J5U3RhcnQsXG4gIGNlbnRyYWxEaXJlY3RvcnlMZW5ndGgsXG4gIGNvbW1lbnRCeXRlcyxcbikge1xuICB3cml0ZXIud3JpdGUoc2lnbmF0dXJlLkNFTlRSQUxfRElSRUNUT1JZX0VORCk7XG4gIHdyaXRlci53cml0ZVVpbnQxNigwLCB0cnVlKTtcbiAgd3JpdGVyLndyaXRlVWludDE2KDAsIHRydWUpO1xuICB3cml0ZXIud3JpdGVVaW50MTYoZW50cmllc0NvdW50LCB0cnVlKTtcbiAgd3JpdGVyLndyaXRlVWludDE2KGVudHJpZXNDb3VudCwgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZVVpbnQzMihjZW50cmFsRGlyZWN0b3J5TGVuZ3RoLCB0cnVlKTtcbiAgd3JpdGVyLndyaXRlVWludDMyKGNlbnRyYWxEaXJlY3RvcnlTdGFydCwgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZVVpbnQxNihjb21tZW50Qnl0ZXMubGVuZ3RoLCB0cnVlKTtcbiAgd3JpdGVyLndyaXRlKGNvbW1lbnRCeXRlcyk7XG59XG5cbi8qXG5cblxuXG4gKi9cbiAgICAgICBmdW5jdGlvbiB3cml0ZVppcFJlY29yZHMod3JpdGVyLCByZWNvcmRzLCBjb21tZW50ID0gJycpIHtcbiAgLy9cbiAgY29uc3QgbG9jYXRvcnMgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWNvcmRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgbG9jYXRvcnMucHVzaCh3cml0ZUZpbGUod3JpdGVyLCByZWNvcmRzW2ldKSk7XG4gIH1cblxuICAvL1xuICBjb25zdCBjZW50cmFsRGlyZWN0b3J5U3RhcnQgPSB3cml0ZXIuaW5kZXg7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgbG9jYXRvcnMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICB3cml0ZUNlbnRyYWxGaWxlSGVhZGVyKHdyaXRlciwgcmVjb3Jkc1tpXSwgbG9jYXRvcnNbaV0pO1xuICB9XG4gIGNvbnN0IGNlbnRyYWxEaXJlY3RvcnlMZW5ndGggPSB3cml0ZXIuaW5kZXggLSBjZW50cmFsRGlyZWN0b3J5U3RhcnQ7XG5cbiAgY29uc3QgY29tbWVudEJ5dGVzID0gdGV4dEVuY29kZXIuZW5jb2RlKGNvbW1lbnQpO1xuXG4gIC8vXG4gIHdyaXRlRW5kT2ZDZW50cmFsRGlyZWN0b3J5UmVjb3JkKFxuICAgIHdyaXRlcixcbiAgICByZWNvcmRzLmxlbmd0aCxcbiAgICBjZW50cmFsRGlyZWN0b3J5U3RhcnQsXG4gICAgY2VudHJhbERpcmVjdG9yeUxlbmd0aCxcbiAgICBjb21tZW50Qnl0ZXMsXG4gICk7XG59XG5cbi8qXG5cblxuICovXG5mdW5jdGlvbiBlbmNvZGVGaWxlKGZpbGUpIHtcbiAgY29uc3QgbmFtZSA9IHRleHRFbmNvZGVyLmVuY29kZShmaWxlLm5hbWUucmVwbGFjZSgvXFxcXC9nLCAnLycpKTtcbiAgY29uc3QgY29tbWVudCA9IHRleHRFbmNvZGVyLmVuY29kZShmaWxlLmNvbW1lbnQpO1xuICByZXR1cm4ge1xuICAgIG5hbWUsXG4gICAgbW9kZTogZmlsZS5tb2RlLFxuICAgIGRhdGU6IGZpbGUuZGF0ZSxcbiAgICBjb250ZW50OiBmaWxlLmNvbnRlbnQsXG4gICAgY29tbWVudCxcbiAgfTtcbn1cblxuLypcblxuXG4gKi9cbmZ1bmN0aW9uIGNvbXByZXNzRmlsZVdpdGhTdG9yZShmaWxlKSB7XG4gIHJldHVybiB7XG4gICAgbmFtZTogZmlsZS5uYW1lLFxuICAgIG1vZGU6IGZpbGUubW9kZSxcbiAgICBkYXRlOiBmaWxlLmRhdGUsXG4gICAgY3JjMzI6IGNyYzMyKGZpbGUuY29udGVudCksXG4gICAgY29tcHJlc3Npb25NZXRob2Q6IGNvbXByZXNzaW9uLlNUT1JFLFxuICAgIGNvbXByZXNzZWRMZW5ndGg6IGZpbGUuY29udGVudC5sZW5ndGgsXG4gICAgdW5jb21wcmVzc2VkTGVuZ3RoOiBmaWxlLmNvbnRlbnQubGVuZ3RoLFxuICAgIGNvbnRlbnQ6IGZpbGUuY29udGVudCxcbiAgICBjb21tZW50OiBmaWxlLmNvbW1lbnQsXG4gIH07XG59XG5cbi8qXG5cblxuXG5cbiAqL1xuZnVuY3Rpb24gZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyhtb2RlKSB7XG4gIHJldHVybiAoKG1vZGUgJiAwbzc3NykgfCAwbzEwMDAwMCkgPDwgMTY7XG59XG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxuLypcblxuXG4gKi9cbmZ1bmN0aW9uIG1ha2VGaWxlUmVjb3JkKGZpbGUpIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBmaWxlLm5hbWUsXG4gICAgY2VudHJhbE5hbWU6IGZpbGUubmFtZSxcbiAgICBtYWRlQnk6IFVOSVgsXG4gICAgdmVyc2lvbjogVU5JWF9WRVJTSU9OLFxuICAgIHZlcnNpb25OZWVkZWQ6IDAsIC8vXG4gICAgYml0RmxhZzogMCxcbiAgICBjb21wcmVzc2lvbk1ldGhvZDogY29tcHJlc3Npb24uU1RPUkUsXG4gICAgZGF0ZTogZmlsZS5kYXRlLFxuICAgIGNyYzMyOiBmaWxlLmNyYzMyLFxuICAgIGNvbXByZXNzZWRMZW5ndGg6IGZpbGUuY29tcHJlc3NlZExlbmd0aCxcbiAgICB1bmNvbXByZXNzZWRMZW5ndGg6IGZpbGUudW5jb21wcmVzc2VkTGVuZ3RoLFxuICAgIGRpc2tOdW1iZXJTdGFydDogMCxcbiAgICBpbnRlcm5hbEZpbGVBdHRyaWJ1dGVzOiAwLFxuICAgIGV4dGVybmFsRmlsZUF0dHJpYnV0ZXM6IGV4dGVybmFsRmlsZUF0dHJpYnV0ZXMoZmlsZS5tb2RlKSxcbiAgICBjb21tZW50OiBmaWxlLmNvbW1lbnQsXG4gICAgY29udGVudDogZmlsZS5jb250ZW50LFxuICB9O1xufVxuXG4vKlxuXG5cblxuICovXG4gICAgICAgZnVuY3Rpb24gd3JpdGVaaXAod3JpdGVyLCBmaWxlcywgY29tbWVudCA9ICcnKSB7XG4gIGNvbnN0IGVuY29kZWRGaWxlcyA9IGZpbGVzLm1hcChlbmNvZGVGaWxlKTtcbiAgY29uc3QgY29tcHJlc3NlZEZpbGVzID0gZW5jb2RlZEZpbGVzLm1hcChjb21wcmVzc0ZpbGVXaXRoU3RvcmUpO1xuICAvL1xuICBjb25zdCBmaWxlUmVjb3JkcyA9IGNvbXByZXNzZWRGaWxlcy5tYXAobWFrZUZpbGVSZWNvcmQpO1xuICB3cml0ZVppcFJlY29yZHMod3JpdGVyLCBmaWxlUmVjb3JkcywgY29tbWVudCk7XG59XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ3cml0ZVppcFJlY29yZHMiOlsid3JpdGVaaXBSZWNvcmRzIl0sIndyaXRlWmlwIjpbIndyaXRlWmlwIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGQygCyWBgAAlgYAAB4AAABAZW5kby96aXAtdjEuMC45L3NyYy9yZWFkZXIuanN7ImltcG9ydHMiOlsiLi9idWZmZXItcmVhZGVyLmpzIiwiLi9mb3JtYXQtcmVhZGVyLmpzIl0sImV4cG9ydHMiOlsiWmlwUmVhZGVyIiwicmVhZFppcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEJ1ZmZlclJlYWRlcixyZWFkWmlwRm9ybWF0OyRozY9faW1wb3J0cyhbW1wiLi9idWZmZXItcmVhZGVyLmpzXCIsIFtbXCJCdWZmZXJSZWFkZXJcIixbJGjNj19hID0+IChCdWZmZXJSZWFkZXIgPSAkaM2PX2EpXV1dXSxbXCIuL2Zvcm1hdC1yZWFkZXIuanNcIiwgW1tcInJlYWRaaXBcIixbJGjNj19hID0+IChyZWFkWmlwRm9ybWF0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuICAgICAgIGNsYXNzIFppcFJlYWRlciB7XG4gIC8qXG5cblxuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihkYXRhLCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7IG5hbWUgPSAnPHVua25vd24+JyB9ID0gb3B0aW9ucztcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgQnVmZmVyUmVhZGVyKGRhdGEpO1xuICAgIHRoaXMuZmlsZXMgPSByZWFkWmlwRm9ybWF0KHJlYWRlcik7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgfVxuXG4gIC8qXG5cblxuICAgKi9cbiAgcmVhZChuYW1lKSB7XG4gICAgY29uc3QgZmlsZSA9IHRoaXMuZmlsZXMuZ2V0KG5hbWUpO1xuICAgIGlmIChmaWxlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRocm93IEVycm9yKGBDYW5ub3QgZmluZCBmaWxlICR7bmFtZX0gaW4gWmlwIGZpbGUgJHt0aGlzLm5hbWV9YCk7XG4gICAgfVxuICAgIHJldHVybiBmaWxlLmNvbnRlbnQ7XG4gIH1cblxuICAvKlxuXG5cbiAgICovXG4gIHN0YXQobmFtZSkge1xuICAgIGNvbnN0IGZpbGUgPSB0aGlzLmZpbGVzLmdldChuYW1lKTtcbiAgICBpZiAoZmlsZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICByZXR1cm4ge1xuICAgICAgdHlwZTogZmlsZS50eXBlLFxuICAgICAgbW9kZTogZmlsZS5tb2RlLFxuICAgICAgZGF0ZTogZmlsZS5kYXRlLFxuICAgICAgY29tbWVudDogZmlsZS5jb21tZW50LFxuICAgIH07XG4gIH1cbn1cblxuLypcblxuXG5cbiAqLyRozY9fb25jZS4gWmlwUmVhZGVyKFppcFJlYWRlcik7XG4gICAgICAgY29uc3QgcmVhZFppcCA9IGFzeW5jIChkYXRhLCBsb2NhdGlvbikgPT4ge1xuICBjb25zdCByZWFkZXIgPSBuZXcgWmlwUmVhZGVyKGRhdGEsIHsgbmFtZTogbG9jYXRpb24gfSk7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCByZWFkID0gYXN5bmMgcGF0aCA9PiByZWFkZXIucmVhZChwYXRoKTtcbiAgcmV0dXJuIHsgcmVhZCB9O1xufTskaM2PX29uY2UucmVhZFppcChyZWFkWmlwKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlppcFJlYWRlciI6WyJaaXBSZWFkZXIiXSwicmVhZFppcCI6WyJyZWFkWmlwIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKtP/O27BgAAuwYAACEAAABAZW5kby96aXAtdjEuMC45L3NyYy9zaWduYXR1cmUuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkNFTlRSQUxfRElSRUNUT1JZX0VORCIsIkNFTlRSQUxfRklMRV9IRUFERVIiLCJEQVRBX0RFU0NSSVBUT1IiLCJMT0NBTF9GSUxFX0hFQURFUiIsIlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCIsIlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Ly9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qXG5cblxuICovXG5mdW5jdGlvbiB1KHN0cmluZykge1xuICBjb25zdCBhcnJheSA9IG5ldyBVaW50OEFycmF5KHN0cmluZy5sZW5ndGgpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHN0cmluZy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGFycmF5W2ldID0gc3RyaW5nLmNoYXJDb2RlQXQoaSkgJiAweGZmO1xuICB9XG4gIHJldHVybiBhcnJheTtcbn1cblxuICAgICAgIGNvbnN0IExPQ0FMX0ZJTEVfSEVBREVSID0gdSgnUEtcXHgwM1xceDA0Jyk7JGjNj19vbmNlLkxPQ0FMX0ZJTEVfSEVBREVSKExPQ0FMX0ZJTEVfSEVBREVSKTtcbiAgICAgICBjb25zdCBDRU5UUkFMX0ZJTEVfSEVBREVSID0gdSgnUEtcXHgwMVxceDAyJyk7JGjNj19vbmNlLkNFTlRSQUxfRklMRV9IRUFERVIoQ0VOVFJBTF9GSUxFX0hFQURFUik7XG4gICAgICAgY29uc3QgQ0VOVFJBTF9ESVJFQ1RPUllfRU5EID0gdSgnUEtcXHgwNVxceDA2Jyk7JGjNj19vbmNlLkNFTlRSQUxfRElSRUNUT1JZX0VORChDRU5UUkFMX0RJUkVDVE9SWV9FTkQpO1xuICAgICAgIGNvbnN0IFpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IgPSB1KCdQS1xceDA2XFx4MDcnKTskaM2PX29uY2UuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUihaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SKTtcbiAgICAgICBjb25zdCBaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQgPSB1KCdQS1xceDA2XFx4MDYnKTskaM2PX29uY2UuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKFpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCk7XG4gICAgICAgY29uc3QgREFUQV9ERVNDUklQVE9SID0gdSgnUEtcXHgwN1xceDA4Jyk7JGjNj19vbmNlLkRBVEFfREVTQ1JJUFRPUihEQVRBX0RFU0NSSVBUT1IpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiTE9DQUxfRklMRV9IRUFERVIiOlsiTE9DQUxfRklMRV9IRUFERVIiXSwiQ0VOVFJBTF9GSUxFX0hFQURFUiI6WyJDRU5UUkFMX0ZJTEVfSEVBREVSIl0sIkNFTlRSQUxfRElSRUNUT1JZX0VORCI6WyJDRU5UUkFMX0RJUkVDVE9SWV9FTkQiXSwiWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUiI6WyJaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SIl0sIlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCI6WyJaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQiXSwiREFUQV9ERVNDUklQVE9SIjpbIkRBVEFfREVTQ1JJUFRPUiJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAAdAAAAQGVuZG8vemlwLXYxLjAuOS9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAo+t4kA0HAAANBwAAHgAAAEBlbmRvL3ppcC12MS4wLjkvc3JjL3dyaXRlci5qc3siaW1wb3J0cyI6WyIuL2J1ZmZlci13cml0ZXIuanMiLCIuL2Zvcm1hdC13cml0ZXIuanMiXSwiZXhwb3J0cyI6WyJaaXBXcml0ZXIiLCJ3cml0ZVppcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEJ1ZmZlcldyaXRlcix3cml0ZVppcEZvcm1hdDskaM2PX2ltcG9ydHMoW1tcIi4vYnVmZmVyLXdyaXRlci5qc1wiLCBbW1wiQnVmZmVyV3JpdGVyXCIsWyRozY9fYSA9PiAoQnVmZmVyV3JpdGVyID0gJGjNj19hKV1dXV0sW1wiLi9mb3JtYXQtd3JpdGVyLmpzXCIsIFtbXCJ3cml0ZVppcFwiLFskaM2PX2EgPT4gKHdyaXRlWmlwRm9ybWF0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuICAgICAgIGNsYXNzIFppcFdyaXRlciB7XG4gIC8qXG5cblxuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zID0geyBkYXRlOiBuZXcgRGF0ZSgpIH0pIHtcbiAgICBjb25zdCB7IGRhdGUgfSA9IG9wdGlvbnM7XG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICB0aGlzLmZpbGVzID0gbmV3IE1hcCgpO1xuICAgIHRoaXMuZGF0ZSA9IGRhdGU7XG4gIH1cblxuICAvKlxuXG5cblxuXG5cblxuXG4gICAqL1xuICB3cml0ZShuYW1lLCBjb250ZW50LCBvcHRpb25zID0ge30pIHtcbiAgICBjb25zdCB7IG1vZGUgPSAwbzY0NCwgZGF0ZSA9IHVuZGVmaW5lZCwgY29tbWVudCA9ICcnIH0gPSBvcHRpb25zO1xuICAgIGlmICghY29udGVudCkge1xuICAgICAgdGhyb3cgRXJyb3IoYFppcFdyaXRlciB3cml0ZSByZXF1aXJlcyBjb250ZW50IGZvciAke25hbWV9YCk7XG4gICAgfVxuICAgIHRoaXMuZmlsZXMuc2V0KG5hbWUsIHtcbiAgICAgIG5hbWUsXG4gICAgICBtb2RlLFxuICAgICAgZGF0ZSxcbiAgICAgIGNvbnRlbnQsXG4gICAgICBjb21tZW50LFxuICAgIH0pO1xuICB9XG5cbiAgLypcblxuICAgKi9cbiAgc25hcHNob3QoKSB7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IEJ1ZmZlcldyaXRlcigpO1xuICAgIHdyaXRlWmlwRm9ybWF0KHdyaXRlciwgQXJyYXkuZnJvbSh0aGlzLmZpbGVzLnZhbHVlcygpKSk7XG4gICAgcmV0dXJuIHdyaXRlci5zdWJhcnJheSgpO1xuICB9XG59XG5cbi8qXG5cbiAqLyRozY9fb25jZS4gWmlwV3JpdGVyKFppcFdyaXRlcik7XG4gICAgICAgY29uc3Qgd3JpdGVaaXAgPSAoKSA9PiB7XG4gIGNvbnN0IHdyaXRlciA9IG5ldyBaaXBXcml0ZXIoKTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCB3cml0ZSA9IGFzeW5jIChwYXRoLCBkYXRhKSA9PiB7XG4gICAgd3JpdGVyLndyaXRlKHBhdGgsIGRhdGEpO1xuICB9O1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHNuYXBzaG90ID0gYXN5bmMgKCkgPT4gd3JpdGVyLnNuYXBzaG90KCk7XG4gIHJldHVybiB7IHdyaXRlLCBzbmFwc2hvdCB9O1xufTskaM2PX29uY2Uud3JpdGVaaXAod3JpdGVaaXApO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiWmlwV3JpdGVyIjpbIlppcFdyaXRlciJdLCJ3cml0ZVppcCI6WyJ3cml0ZVppcCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsBAh4DCgAAAAAAAAAAAPnwL3qvcAAAr3AAABQAAAAAAAAAAAAAAKSBAAAAAGNvbXBhcnRtZW50LW1hcC5qc29uUEsBAh4DCgAAAAAAAAAAAB9bFDXZBAAA2QQAACkAAAAAAAAAAAAAAKSB4XAAAEBhZ29yaWMvc3Bhd25lci12MC42Ljgvc3JjL3ZhdC1zcGF3bmVkLmpzUEsBAh4DCgAAAAAAAAAAADjUnGd1AgAAdQIAABsAAAAAAAAAAAAAAKSBAXYAAEBlbmRvL2Jhc2U2NC12MS4wLjkvYXRvYi5qc1BLAQIeAwoAAAAAAAAAAACSwpOPNAMAADQDAAAbAAAAAAAAAAAAAACkga94AABAZW5kby9iYXNlNjQtdjEuMC45L2J0b2EuanNQSwECHgMKAAAAAAAAAAAABHt2f7kBAAC5AQAAHQAAAAAAAAAAAAAApIEcfAAAQGVuZG8vYmFzZTY0LXYxLjAuOS9kZWNvZGUuanNQSwECHgMKAAAAAAAAAAAAoValSLkBAAC5AQAAHQAAAAAAAAAAAAAApIEQfgAAQGVuZG8vYmFzZTY0LXYxLjAuOS9lbmNvZGUuanNQSwECHgMKAAAAAAAAAAAAGvvqV6QCAACkAgAAHAAAAAAAAAAAAAAApIEEgAAAQGVuZG8vYmFzZTY0LXYxLjAuOS9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAAfl5z1NwMAADcDAAAhAAAAAAAAAAAAAACkgeKCAABAZW5kby9iYXNlNjQtdjEuMC45L3NyYy9jb21tb24uanNQSwECHgMKAAAAAAAAAAAA8sBOwZIIAACSCAAAIQAAAAAAAAAAAAAApIFYhgAAQGVuZG8vYmFzZTY0LXYxLjAuOS9zcmMvZGVjb2RlLmpzUEsBAh4DCgAAAAAAAAAAAI8TQzdrBwAAawcAACEAAAAAAAAAAAAAAKSBKY8AAEBlbmRvL2Jhc2U2NC12MS4wLjkvc3JjL2VuY29kZS5qc1BLAQIeAwoAAAAAAAAAAAB/VRSzNAMAADQDAAAiAAAAAAAAAAAAAACkgdOWAABAZW5kby9jb21tb24tdjEuMi4xMC9vYmplY3QtbWFwLmpzUEsBAh4DCgAAAAAAAAAAALcFa3B9AgAAfQIAADEAAAAAAAAAAAAAAKSBR5oAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvaW1wb3J0LWFyY2hpdmUuanNQSwECHgMKAAAAAAAAAAAAKMUF7owtAACMLQAANgAAAAAAAAAAAAAApIETnQAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9zcmMvY29tcGFydG1lbnQtbWFwLmpzUEsBAh4DCgAAAAAAAAAAAEXX7gs6AwAAOgMAADAAAAAAAAAAAAAAAKSB88oAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL2V4dGVuc2lvbi5qc1BLAQIeAwoAAAAAAAAAAAAIvaDsry0AAK8tAAA6AAAAAAAAAAAAAACkgXvOAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9pbXBvcnQtYXJjaGl2ZS1saXRlLmpzUEsBAh4DCgAAAAAAAAAAAKrs2OM2BQAANgUAAD0AAAAAAAAAAAAAAKSBgvwAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL2ltcG9ydC1hcmNoaXZlLXBhcnNlcnMuanNQSwECHgMKAAAAAAAAAAAAlxQl1NwIAADcCAAANQAAAAAAAAAAAAAApIETAgEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9zcmMvaW1wb3J0LWFyY2hpdmUuanNQSwECHgMKAAAAAAAAAAAAigFDeF9JAABfSQAAMgAAAAAAAAAAAAAApIFCCwEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9zcmMvaW1wb3J0LWhvb2suanNQSwECHgMKAAAAAAAAAAAAsm6E6y4DAAAuAwAAKwAAAAAAAAAAAAAApIHxVAEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9zcmMvanNvbi5qc1BLAQIeAwoAAAAAAAAAAABUXXOBjyUAAI8lAAArAAAAAAAAAAAAAACkgWhYAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9saW5rLmpzUEsBAh4DCgAAAAAAAAAAANuM78w8FwAAPBcAADEAAAAAAAAAAAAAAKSBQH4BAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL21hcC1wYXJzZXIuanNQSwECHgMKAAAAAAAAAAAAmxya1s8LAADPCwAAPAAAAAAAAAAAAAAApIHLlQEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9zcmMvbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzUEsBAh4DCgAAAAAAAAAAALgqix9OBQAATgUAADIAAAAAAAAAAAAAAKSB9KEBAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3BhcnNlLWJ5dGVzLmpzUEsBAh4DCgAAAAAAAAAAAHU1Ym6pEwAAqRMAAEYAAAAAAAAAAAAAAKSBkqcBAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3BhcnNlLWNqcy1zaGFyZWQtZXhwb3J0LXdyYXBwZXIuanNQSwECHgMKAAAAAAAAAAAAfr9W5kQFAABEBQAAMQAAAAAAAAAAAAAApIGfuwEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9zcmMvcGFyc2UtanNvbi5qc1BLAQIeAwoAAAAAAAAAAACTVtJUHggAAB4IAAA0AAAAAAAAAAAAAACkgTLBAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9wYXJzZS1wcmUtY2pzLmpzUEsBAh4DCgAAAAAAAAAAAOyonaFRBQAAUQUAADQAAAAAAAAAAAAAAKSBoskBAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3BhcnNlLXByZS1tanMuanNQSwECHgMKAAAAAAAAAAAAdmA97PoEAAD6BAAAMQAAAAAAAAAAAAAApIFFzwEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9zcmMvcGFyc2UtdGV4dC5qc1BLAQIeAwoAAAAAAAAAAAAG5Pxq1RgAANUYAAA0AAAAAAAAAAAAAACkgY7UAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9wb2xpY3ktZm9ybWF0LmpzUEsBAh4DCgAAAAAAAAAAAPE/zSY+KgAAPioAAC0AAAAAAAAAAAAAAKSBte0BAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3BvbGljeS5qc1BLAQIeAwoAAAAAAAAAAACvaHul3AgAANwIAAAtAAAAAAAAAAAAAACkgT4YAgBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9wb3dlcnMuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAANQAAAAAAAAAAAAAApIFlIQIAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9zcmMvdHlwZXMtZXh0ZXJuYWwuanNQSwECHgMKAAAAAAAAAAAANKKhqaIBAACiAQAAIQAAAAAAAAAAAAAApIEQIwIAQGVuZG8vZW52LW9wdGlvbnMtdjEuMS44L2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAC6wiR26DwAAug8AACsAAAAAAAAAAAAAAKSB8SQCAEBlbmRvL2Vudi1vcHRpb25zLXYxLjEuOC9zcmMvZW52LW9wdGlvbnMuanNQSwECHgMKAAAAAAAAAAAASTX26VQIAABUCAAAHQAAAAAAAAAAAAAApIH0NAIAQGVuZG8vZXJyb3JzLXYxLjIuMTAvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAybGDGRsWAAAbFgAAIwAAAAAAAAAAAAAApIGDPQIAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEvc3JjL0UuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAKQAAAAAAAAAAAAAApIHfUwIAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEvc3JjL2V4cG9ydHMuanNQSwECHgMKAAAAAAAAAAAApOMro5EOAACRDgAAJwAAAAAAAAAAAAAApIF+VQIAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEvc3JjL2xvY2FsLmpzUEsBAh4DCgAAAAAAAAAAAHkz7Lg8DwAAPA8AADUAAAAAAAAAAAAAAKSBVGQCAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4xL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzUEsBAh4DCgAAAAAAAAAAALh2lJ1fAwAAXwMAACkAAAAAAAAAAAAAAKSB43MCAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4xL3NyYy9uby1zaGltLmpzUEsBAh4DCgAAAAAAAAAAAKmAw7OeCgAAngoAAC0AAAAAAAAAAAAAAKSBiXcCAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4xL3NyYy90cmFjay10dXJucy5qc1BLAQIeAwoAAAAAAAAAAAB7oaBHZAIAAGQCAAAjAAAAAAAAAAAAAACkgXKCAgBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMS91dGlscy5qc1BLAQIeAwoAAAAAAAAAAADWgSqAWQwAAFkMAAA1AAAAAAAAAAAAAACkgReFAgBAZW5kby9pbXBvcnQtYnVuZGxlLXYxLjQuMC9zcmMvY29tcGFydG1lbnQtd3JhcHBlci5qc1BLAQIeAwoAAAAAAAAAAABWzftmiBYAAIgWAAAnAAAAAAAAAAAAAACkgcORAgBAZW5kby9pbXBvcnQtYnVuZGxlLXYxLjQuMC9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAALdVQBoIHAACCBwAAHQAAAAAAAAAAAAAApIGQqAIAQGVuZG8vbWFyc2hhbC12MS42LjQvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAlXxlmZpPAACaTwAAKgAAAAAAAAAAAAAApIFNsAIAQGVuZG8vbWFyc2hhbC12MS42LjQvc3JjL2VuY29kZVBhc3NhYmxlLmpzUEsBAh4DCgAAAAAAAAAAAM9ikvj0KwAA9CsAACsAAAAAAAAAAAAAAKSBLwADAEBlbmRvL21hcnNoYWwtdjEuNi40L3NyYy9lbmNvZGVUb0NhcERhdGEuanNQSwECHgMKAAAAAAAAAAAA9hgbT0EsAABBLAAALQAAAAAAAAAAAAAApIFsLAMAQGVuZG8vbWFyc2hhbC12MS42LjQvc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzUEsBAh4DCgAAAAAAAAAAAOaLU7BoLwAAaC8AACoAAAAAAAAAAAAAAKSB+FgDAEBlbmRvL21hcnNoYWwtdjEuNi40L3NyYy9tYXJzaGFsLWp1c3Rpbi5qc1BLAQIeAwoAAAAAAAAAAAC+IqcbSgcAAEoHAAAtAAAAAAAAAAAAAACkgaiIAwBAZW5kby9tYXJzaGFsLXYxLjYuNC9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanNQSwECHgMKAAAAAAAAAAAACTogbmEvAABhLwAAIwAAAAAAAAAAAAAApIE9kAMAQGVuZG8vbWFyc2hhbC12MS42LjQvc3JjL21hcnNoYWwuanNQSwECHgMKAAAAAAAAAAAASrDVXesuAADrLgAAJQAAAAAAAAAAAAAApIHfvwMAQGVuZG8vbWFyc2hhbC12MS42LjQvc3JjL3JhbmtPcmRlci5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAhAAAAAAAAAAAAAACkgQ3vAwBAZW5kby9tYXJzaGFsLXYxLjYuNC9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAXpyzyswFAADMBQAAHQAAAAAAAAAAAAAApIGk8AMAQGVuZG8vbmF0LXY1LjEuMC9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAAvR2ak0KAABNCgAAIAAAAAAAAAAAAAAApIGr9gMAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAw+/2RbwGAAC8BgAAKAAAAAAAAAAAAAAApIE2AQQAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL2NvcHlBcnJheS5qc1BLAQIeAwoAAAAAAAAAAAAQgUTA9ggAAPYIAAApAAAAAAAAAAAAAACkgTgIBABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvY29weVJlY29yZC5qc1BLAQIeAwoAAAAAAAAAAADCN8mnngsAAJ4LAAAuAAAAAAAAAAAAAACkgXURBABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzUEsBAh4DCgAAAAAAAAAAABdXAiLTFAAA0xQAACQAAAAAAAAAAAAAAKSBXx0EAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9lcnJvci5qc1BLAQIeAwoAAAAAAAAAAADTopB8pAYAAKQGAAArAAAAAAAAAAAAAACkgXQyBABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvaXRlci1oZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAGJ4eInZEgAA2RIAACcAAAAAAAAAAAAAAKSBYTkEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9tYWtlLWZhci5qc1BLAQIeAwoAAAAAAAAAAABNwYjT3AQAANwEAAApAAAAAAAAAAAAAACkgX9MBABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvbWFrZVRhZ2dlZC5qc1BLAQIeAwoAAAAAAAAAAABwRFyEohcAAKIXAAAwAAAAAAAAAAAAAACkgaJRBABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAADJ1trdMrAADTKwAAKgAAAAAAAAAAAAAApIGSaQQAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL3Bhc3NTdHlsZU9mLmpzUEsBAh4DCgAAAAAAAAAAAAOBJ0euHAAArhwAACgAAAAAAAAAAAAAAKSBrZUEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9yZW1vdGFibGUuanNQSwECHgMKAAAAAAAAAAAAx4x/OHoOAAB6DgAAKwAAAAAAAAAAAAAApIGhsgQAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL3NhZmUtcHJvbWlzZS5qc1BLAQIeAwoAAAAAAAAAAAC6Ps2heQgAAHkIAAAlAAAAAAAAAAAAAACkgWTBBABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvc3RyaW5nLmpzUEsBAh4DCgAAAAAAAAAAAB0bVHblCgAA5QoAACUAAAAAAAAAAAAAAKSBIMoEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9zeW1ib2wuanNQSwECHgMKAAAAAAAAAAAA8uXyUMkHAADJBwAAJQAAAAAAAAAAAAAApIFI1QQAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL3RhZ2dlZC5qc1BLAQIeAwoAAAAAAAAAAADu3CKwZwkAAGcJAAApAAAAAAAAAAAAAACkgVTdBABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAkAAAAAAAAAAAAAACkgQLnBABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAP0XT32IGAABiBgAAIgAAAAAAAAAAAAAApIGc6AQAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMC9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAB1iEF+ZAIAAGQCAAArAAAAAAAAAAAAAACkgT7vBABAZW5kby9wcm9taXNlLWtpdC12MS4xLjEwL3NyYy9pcy1wcm9taXNlLmpzUEsBAh4DCgAAAAAAAAAAADnhrPBZCQAAWQkAACoAAAAAAAAAAAAAAKSB6/EEAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTAvc3JjL21lbW8tcmFjZS5qc1BLAQIeAwoAAAAAAAAAAACMGyI1HwYAAB8GAAA1AAAAAAAAAAAAAACkgYz7BABAZW5kby9wcm9taXNlLWtpdC12MS4xLjEwL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAmAAAAAAAAAAAAAACkgf4BBQBAZW5kby9wcm9taXNlLWtpdC12MS4xLjEwL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAABOhXNrnwEAAJ8BAAAgAAAAAAAAAAAAAACkgZoDBQBAZW5kby90cmFtcG9saW5lLXYxLjAuMy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADNeH6RswcAALMHAAApAAAAAAAAAAAAAACkgXcFBQBAZW5kby90cmFtcG9saW5lLXYxLjAuMy9zcmMvdHJhbXBvbGluZS5qc1BLAQIeAwoAAAAAAAAAAAC8/wFDmgIAAJoCAAAZAAAAAAAAAAAAAACkgXENBQBAZW5kby96aXAtdjEuMC45L2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAHVWounBFAAAwRQAACUAAAAAAAAAAAAAAKSBQhAFAEBlbmRvL3ppcC12MS4wLjkvc3JjL2J1ZmZlci1yZWFkZXIuanNQSwECHgMKAAAAAAAAAAAA9bKmuL4PAAC+DwAAJQAAAAAAAAAAAAAApIFGJQUAQGVuZG8vemlwLXYxLjAuOS9zcmMvYnVmZmVyLXdyaXRlci5qc1BLAQIeAwoAAAAAAAAAAADRkNr8qAEAAKgBAAAjAAAAAAAAAAAAAACkgUc1BQBAZW5kby96aXAtdjEuMC45L3NyYy9jb21wcmVzc2lvbi5qc1BLAQIeAwoAAAAAAAAAAABe5tGBOAQAADgEAAAdAAAAAAAAAAAAAACkgTA3BQBAZW5kby96aXAtdjEuMC45L3NyYy9jcmMzMi5qc1BLAQIeAwoAAAAAAAAAAACZqmSrnioAAJ4qAAAlAAAAAAAAAAAAAACkgaM7BQBAZW5kby96aXAtdjEuMC45L3NyYy9mb3JtYXQtcmVhZGVyLmpzUEsBAh4DCgAAAAAAAAAAAIr/B6LBFgAAwRYAACUAAAAAAAAAAAAAAKSBhGYFAEBlbmRvL3ppcC12MS4wLjkvc3JjL2Zvcm1hdC13cml0ZXIuanNQSwECHgMKAAAAAAAAAAAAZDKALJYGAACWBgAAHgAAAAAAAAAAAAAApIGIfQUAQGVuZG8vemlwLXYxLjAuOS9zcmMvcmVhZGVyLmpzUEsBAh4DCgAAAAAAAAAAAKtP/O27BgAAuwYAACEAAAAAAAAAAAAAAKSBWoQFAEBlbmRvL3ppcC12MS4wLjkvc3JjL3NpZ25hdHVyZS5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAdAAAAAAAAAAAAAACkgVSLBQBAZW5kby96aXAtdjEuMC45L3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAACj63iQDQcAAA0HAAAeAAAAAAAAAAAAAACkgeeMBQBAZW5kby96aXAtdjEuMC45L3NyYy93cml0ZXIuanNQSwUGAAAAAFkAWQAUHgAAMJQFAAAA","endoZipBase64Sha512":"11abf2484aa511d4ec8a6590d6b79ca7c8b8da1dfe3e717af3876eaa9c5f71077d074485cf35cdb819617e8852dcb80c14a9399dff33bf26b1a17877a3bb9b49"};
1
+ export default {"moduleFormat":"endoZipBase64","endoZipBase64":"UEsDBAoAAAAAAAAAAAAU83kVr3AAAK9wAAAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgInRhZ3MiOiBbXSwKICAiZW50cnkiOiB7CiAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zcGF3bmVyLXYwLjYuOCIsCiAgICAibW9kdWxlIjogIi4vc3JjL3ZhdC1zcGF3bmVkLmpzIgogIH0sCiAgImNvbXBhcnRtZW50cyI6IHsKICAgICJAYWdvcmljL3NwYXduZXItdjAuNi44IjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3NwYXduZXIiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9zcGF3bmVyLXYwLjYuOCIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3NwYXduZXItdjAuNi44IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2ltcG9ydC1idW5kbGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS40LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuNi40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy92YXQtc3Bhd25lZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdmF0LXNwYXduZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2YWJhMTIzYzA4MzcwZWEzZjI2ZDQ1NzU2MzY4NDY0ODE4NGY0NWIwN2RiNWJiN2YzODAwNGQ0M2Q3ZjdiZjM5ZDBmMDQyOWY3NTNhYjkzZjI0YTg4ZWFmMjc0MzIxYWM4N2I3OWU0ZDMyYTRlNGZiM2U2ZjRlZmQ0ZTRhYzNiNCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vYmFzZTY0LXYxLjAuOSI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vYmFzZTY0IiwKICAgICAgImxhYmVsIjogIkBlbmRvL2Jhc2U2NC12MS4wLjkiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vYmFzZTY0LXYxLjAuOSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICIuL2F0b2IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiYXRvYi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjJhMTkwZWQ3ZDJhYzc1Njc4NGZlMGExMDM5MzAzZmZkOWJmMDM3YzQ0MGJiZDIyZmViYTBmNDZkYzAzZGM1YjYyMTYwZmJlZTlkNDA0ZGE4Y2JmOTJkMDE0ZDlkYTY5NWFmOWZlZTkwODU3NDM0Y2UyZGI4MDU3ZDE4ZjVhNWQ3IgogICAgICAgIH0sCiAgICAgICAgIi4vYnRvYS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJidG9hLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2NjNjA4NTZhZDdkYjkwMDBlNzcyN2RhNjE0OTc4YjUwOGQ2MWZkYmQ0ZGM4MmI4MWQ0ZTM0M2UxZTEzOTJlY2JhODM5ZDQ2ZDA0OTJiMzQ1ZWE4YmFhNmZmODI2MTJiNThjZWMyYTc3ZjQ5OTc3YTY5MTc2NWQ2ZmMxNDU1MjQiCiAgICAgICAgfSwKICAgICAgICAiLi9kZWNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZGVjb2RlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTRmYTc3NmNmM2NiZDE2ZGQ4MmQ1YzMzYzgxYzIzODMwYjYyODEwMDZhZGM3ODE4MDUxNmZiMmI4MWJlNjM0NThhZGNhNTQyZTU0YWY4MDdmMmRjNzdjM2ViZjA5YWVkZGFjOGRiZTlmZDk2NDQwNmY4NGE1YjY4YjEzNTZlNmQiCiAgICAgICAgfSwKICAgICAgICAiLi9lbmNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZW5jb2RlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjk0Yjg2YWNlMDJkZGMyMjYxOTgxNTIxMWYyN2I5ZTczMmU5ZGRiZDZiMGZlYWM1MmU0Mjg1NjA1ZTk1ZTQxMWIzN2I3NTM5ZDFlNzZiMWM3Zjk4ZDJmYWRlNzlmZTcwNzFmZjgxZTc3YjQ5ZTQwYzJiOGU4ZWQyMTBlMzNkNmUiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjMxMzU4ODE5NjIzNTcwNzQ3ZDA1NjJhMjhjZjdjMmRhYTdjZjcxOGZiMDk5M2Y1ODc1N2FkZDQ5OWMwMzFkMTI4ZWU5MDEyNjBiODE5NTNjNGU5MDMyY2RhMzM4NjNiYzM4OTBjMTZjNGM1YjY5NDI4ZjRkY2RiZDg2NTM4OTZiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbW1vbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29tbW9uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTIzMjQyM2I5OWY2MDQxYzNhMGY3M2ZhNTQ3Yzg3MjhhYjdhZDkwN2ZmMTk2YTUwNWE3ZjZlNDA4MjFjZTkxNjEyNzY3MTU0ZDY0MzRjNTI4ODllZGRhODJmMTc1ZGIxYmQ2NzFkZDZlMDk5MWE2YTIwMTFjOTM2MjBjZTViYzIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGVjb2RlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kZWNvZGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiYzFlNmRiYWEyMDQwZWU5ZmIwNjViYzY2MjEzMjgyYzg1ODJhNzg2NDg0ZDBjYmE2ZDg1MzI4OWY1YjJlMTNmOWRkYzU2OTMxZTViOWMxZDExODUxYTMzN2JhNWQ0MjA2NGRhZTAwODVjZTRiMGQxMjE3NDQwOTM4MDI3MGZhNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjkxYmUyMjlkZGQwYTFhYmYyOTRmOGRiNmEyNjM1MjU4YjRhZWMzMmNjNzJmMzNkZTI4N2EwMTc1NWYyZjFhNDdiZjA3ZTc2MmFlZDhiMGMxM2JkMGUxZTc1NjhhOWI2YTQxNDI5ODJjMTkxYmRjN2I3MTI2YmMzYTFmZDQ3NjM5IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9jb21tb24tdjEuMi4xMCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vY29tbW9uIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2NvbW1vbi12MS4yLjEwIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2NvbW1vbi12MS4yLjEwIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vb2JqZWN0LW1hcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJvYmplY3QtbWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2IzZWYxYjBiOTRiNzBkNTUyYTQzYmJkYTFhYzQ2ZmJhYWQ1NjhlZTAyNDgxM2U4ZTVkODIwMjVjMTE2ZDRhMTc5MzM3MTNjYjM0MDI3NTg1OWZiM2JlM2Y1YTM5NzRhZTY1NmVmMWJlYjAxYWEwZWZhMDVlODBiZTVjMDhkMDYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlciIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vdHJhbXBvbGluZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby90cmFtcG9saW5lLXYxLjAuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vemlwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3ppcC12MS4wLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW1wb3J0LWFyY2hpdmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW1wb3J0LWFyY2hpdmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYjZhN2QzMjkzZjQzODJhZWI1YmE2Y2EzNDE2ODc1ZDQwZGZiMGQ2NDI0ZTg5YzA4MDk3NDFjYTQ3NDVlOWM2NmIyNjhlYWY1MjI5ZWY2YmNkNjIzZTg5ODc2Njg2ODI4MDViMjJiNzJhOWI3YjQwZTY1MDk4NWQyMGNhZjU4MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb21wYXJ0bWVudC1tYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbXBhcnRtZW50LW1hcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY0MzQ0NDRiYzhlYzRkZjU0NzRmMjY3NzgwMzA3ZWUxNzY0NTc4MDJkY2I0OTAzMDhmYWU2ZTE2OWM1NGM0MmVlNjIyNjg1NzJkODEzMjkzOTkwYzY4NDhkNWYzNDRkOGU1OTNhNjBlNmZjOWNlMjMxZDY4ZDNlN2FmY2YxNzk5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4dGVuc2lvbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXh0ZW5zaW9uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzRkYjAxM2JhMzVhYWM3YjJlNDNmNTk1NzBlNTcxYWUyZmQ4M2RjOGRmOTA2YWM5NzY3YjM5N2I2MTAxMmY0NmQzMjU0NmE1OWViNzg2YjRiNzliZmVkYTczZDNhMzljMTBjYTkwMGEyNjBjMjQxN2Y0YjVlZTgxZjAxYTA2OWIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW1wb3J0LWFyY2hpdmUtbGl0ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW1wb3J0LWFyY2hpdmUtbGl0ZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQwNmZjZTcxZTBjNTJiMDMyNDdmOTU5MWY4NzdmM2U4MDY3ODNiNTMyMzVhYTgxNTZkMTg5NzNiN2Q2ZGQyNTdhMWFlYjRhNzMyMjMwNzc1YjUzZDM1OTA2OTViNzhiNThlNjQxNGIyNTQzMjU2NzY4YWNmM2M5ZWY1MDI5NmJmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2ltcG9ydC1hcmNoaXZlLXBhcnNlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2ltcG9ydC1hcmNoaXZlLXBhcnNlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5Yjk5MDdmMjg0MmQzMzMwZThhMTE4ODNjMDg4OGRjZTk0ZTUwODdlNTAxNDBkNmM0Y2EwM2U0YzE3ZmUzZGI4YWRjZmExMjY0YWNhOWEzMjhjODBmZTQ5NmRkZWRjMGZhNTc0M2VhYjBiYWQyYjhkMjlhNmRlZmZiMWQwMTY4ZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbXBvcnQtYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW1wb3J0LWFyY2hpdmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkOGNiM2YxMjAyMjMzNjUxODMwYjhlODBiOWY1ZDE3MzVjZTJlZWNjMjY5NGVhYjNhNGU1MzhhMWQwMmI3MGE0YTFjZDQyYTkzMjdjMGNjYTc4MjhmYjQyYmQzODJiZGYwNTJmOWU2N2M3ZjE4NGQxN2Y5ZDMxNzc3Mzk1MmRhOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbXBvcnQtaG9vay5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW1wb3J0LWhvb2suanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhODBhNTU5ZmU5YzE2YzEwNjg2NGVjZjEyNjYwNmE0ZWQ5YWFjNGRkYmExNjEzYThhNDVhMjQ2ZWEzMWE0YzRkMjljNGU2NmM5ZjkxYzYzNDc5NDM3YzVhZWE1ZDgzZjhmN2I5NzViOTM3MzAzZTI0ZmFmNmRjYzg5ZTc4NzJjMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9qc29uLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9qc29uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMGViODNlMDkxNjMzZTU4NDdkYzc0ZDA2NDBkYTViZGM3YjQxMGRjOTA0NzJkZTA2OWNjZTU5MmFmMWQzM2I3NTY1YTlmNDVmMmMzZWEyZmZiMWUxZDBlODBkODVlNGI3M2I1OGQyOGM2OTQ4MmNiNDg5NWI3MjM3ODJlMGY0YzAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGluay5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGluay5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjMzMjQ3NjNjNjhmOGE4Y2EzNjk3NWQ5ZmRkZDgzNTQ2NzA3MTdhOWZmMWY5ODZlMTFhM2EyNjhlN2ViYzYyZjI0MTQxZDc1ZjY0YzkzMWYzMjY5OTcwYzNhNTdkMWZkOWUzMzEwOWFjMjlhM2M2OTRkMmU0Y2FhMWJlMzhkNjg5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcC1wYXJzZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcC1wYXJzZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmOTYzNjQxYjVhODg0YTAwZWZjZTYxNmExOWYzMmM0YTNhMDcwYTI0YjRkMGM3NWMzNDVmNmQyYmYxZjc3MTY1M2FjOTQyMTYyNDRjMDlmODE4ZWY0MzU0ZjE3NGZkNGQ1MzBkZDcyYmVjYjM1MmVjN2JkMTRlYjAxM2NmZWJmYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL25vZGUtbW9kdWxlLXNwZWNpZmllci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNkMDBiNGU0YmI3MTJkNjJhN2MxYmFiZTkxYzQ1MjRmNmFiM2Y0MzBkZWJhODRmYWNlY2ZhYTdlODU1M2RlMDNjMThkNDUwMmI4YTZkNjMzYWViM2U3YzU4ZTgxMWM5YTE2ZTU3MzRlOTQ0YjdkMjBkZWUzMTI2NzJmYTViYzMxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhcnNlLWJ5dGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXJzZS1ieXRlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImUzZDcwN2ZiYTg3OGQ3NzlhZjAzMzdjOGFiMjllNzAwODY5NzYzMTkzMzZlNjg3M2M1NjQ5MjMyN2NlOWY4MWVjOTI3NzE1YzA0MTAzN2EyY2QwMjY3YjM5ZDBjZGYyNmUxMmIxN2IwODU4NmY3ZTI1ODU3ZjZjZmFjOWRmNmJkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhcnNlLWNqcy1zaGFyZWQtZXhwb3J0LXdyYXBwZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhcnNlLWNqcy1zaGFyZWQtZXhwb3J0LXdyYXBwZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzNWI4YjJhMGZkMzY4MmFmMTczYmZhYzFmNjBiNGJiY2U0OGRjMGE3MjIxZTc5MGIwMWJlNzhiMzMxMTNmODgyMWFhMDQyNDU0NTkwMmM2YmZhNjVhZWI3ODg4ZTFjNjUyZDA3YWFiMzA2OTU4NTYzMWE5YmRjYjRmYTZiYzZjYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXJzZS1qc29uLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXJzZS1qc29uLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTM3ZTdiZWExOGY3Y2EwYWIxNTQwMzc0M2JiN2ZmZGI5MzNkMGI5YTNkZmFmMzE4ZTI4NzY2MWUwNmZkYTlhMDdjNDRjNGY4NjY0M2NlMDJlNzFkMzhiOGE1M2RjMWEyZDhjNjRhN2UzMTY5MTJjMWM0NDY3ZDhjNjY5MWMzNjkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFyc2UtcHJlLWNqcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFyc2UtcHJlLWNqcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNjZDJjZDgyZTc5OWIyYzQ0OWJlNjRjYzc3YTliOTYwMDRlN2ZhNDJhMmRmMzBhMmY2MzdiYzMzNjRmNDJmZDBjYjIzYzE5OTkwMmEzNjliYWExYmZkN2ZjYmQ4ODUwMzY5MzA1YzA4OWU3Y2U5NGZkNjMyM2JhYTg0NGUzODUzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhcnNlLXByZS1tanMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhcnNlLXByZS1tanMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1ZDA0NzlkZDZkNDAyMTQwNWFhYjEzMjMyZWU5ZDI5ZjE1NTQzZWJlYTU3MmNkOTgwMTJlYWJkY2MwN2M2MDQ3YWY1Nzk3NzJlODJmYzc2MmE0NWY1ZmY2YzY5MWQ1MWRkOWFkNjcxMGE2NDhkMDc3NjIyOTIzNDRhMmE4ZGEwNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXJzZS10ZXh0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXJzZS10ZXh0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMGY3ZDJiOGI4YjM0M2E4ZjRiYTdlNzE5NzY3NWNhYzQzZjNkYmE5MDQyMDMzN2U3MDE2MDI2ZDllMjc4ZDNiYzk1M2U5ZTgyOGE5YTczZDZiNGQ4MTQ1YTBmMGE4NmYwYjQ4NWViYjI1MWExYmY3ZWE2N2M5YmFjMzQ1Njg1MGEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcG9saWN5LWZvcm1hdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcG9saWN5LWZvcm1hdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU3NjQxMDk0MzY1OTUzNzVhNmQ2NGE1OWY5NWY3MjZlNWFhZTA4Nzg3Y2FmOWFhNTA1YTEwMWVjNmYzOTY5NGNjM2ZlZWIxODcyZDAzMDQwYTQ2ZjlkOWJhOTE2M2E1OTdlOTBiZjRkZDQwZDE5MTRmMTdmYTU1NTRlN2RkMDI3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BvbGljeS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcG9saWN5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZjZkYTRkOWYwOWEyNTdiMzIwNzNlODhiMmIzNzAzNmY4ZTIxMmU1OWUyODJiOTk5NDZjMTkzNTdiODI5ZmFiNThlZDgxN2U2ZDQxNDQyNWU3YjZhNDVhNDI5OGE2M2U1NDdhZThhZDllZGU2NzQ2NDM1MTAxZDA4NTVjZjVkMTciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcG93ZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wb3dlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjMjEwMjJlNjE0ODFlZDc1YjU1NTM3ODRlODBmNDhjZTJjNWE2OTY2ZmZkMGRhNzNlZGVkOTYyNjQ4OTUzMjc4NWUzN2VhOWE1NGIyNjcwYTliZTM3ZTRkZmMyMTc3YTlhNmIzMGU1NjdlNDMzZmNlZmZiMTUwNjcwZWZjNjJhYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1leHRlcm5hbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMtZXh0ZXJuYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS44IjogewogICAgICAibmFtZSI6ICJAZW5kby9lbnYtb3B0aW9ucyIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjgiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS44IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiYmFjYTc2ZWQ3YzZiNjU2NzFmNzBiMjY0NmY2ODk0MzU3MjRkOGI5OTMwYTVmZjI5ZDFmYjMyN2VkOTZmZDQxNDQ2OTUyNTg5NjJkYWZiOTgyODYyYTJlZmMxYjAzZDBhZDk2YjMzYzJjYWU1YmViZmEzNzI2ODg2YTA2ZjY2NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbnYtb3B0aW9ucy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW52LW9wdGlvbnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5OWEzMjNjZWExOGYxOWQ3MGYyOWQ5NGU2NjdkMGMyNzU2ZDU2NmExZjg0NjliNWY2N2MxOGRiYzg1NzM0NDkxODVmNWJmNzhmYWIwNzg2ODNiMzQ5MWRhZWNkNmIzOGUwMDkyNmM1MmM3ZjQ1MGExNzAyNmVjOWE3YzliYjY5ZSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZXJyb3JzLXYxLjIuMTAiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2Vycm9ycyIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmJhYzkyYmMwYjkyMDc3ZmNhMDU3ZDA2MmNkNGY1OWJiODliZWI5MzBlODM1OTg2MzQ2YjYxYmUwMTA4MjI4MGUyODRmNWIxNDU2YmE4OGQwOTZmMjg2YjEwMWRhZDhhMmJkM2IyOGQ3MTlkNzdiOWIyZmQ2Y2ZkZmU1ZmQ5NjUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4xIjogewogICAgICAibmFtZSI6ICJAZW5kby9ldmVudHVhbC1zZW5kIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4xIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4xIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Vudi1vcHRpb25zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vudi1vcHRpb25zLXYxLjEuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvRS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvRS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQxNTVhYTNkNDE3ZDI4N2M5OWM5ODFkMjM3YjJkYWM0NzNlMTdmZmViYWUyZjNkYWEzMjk5MWJkNjEyNzVhZjBmYWZmMDc5MDdiMzA5ZDgzZDUwYjYzNTIzZmQ5MjcwOWE3YmZlOTFlODg5YmNiYzI3MWFlNWQ4ZTJjY2JlMWZmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4cG9ydHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4cG9ydHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9sb2NhbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbG9jYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlNTA3NzhmMWJlZmVjMDEwMmYwZmFjYjg3NTc3NDU5ZjgzYWJkNjZjNWQxZjkxNjA5YmI5YTMxYzM5MzQ4NGE2YTVjYzNhOTVlMTQyZTU2MjY0MWM2YWNjYTMxMjA3NjRiYTNjZmE2NTNiMjc5NmNlMzRlZDEwZjNiZWQ2NDlmZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmNmMjVjZmVhMWM0MzdiMzNhMTM0MjczMmNjODZjMThmMDM2MGE5YWRmOTY5YjViYzRjMTgyZmI3ZjM5NzQ5Zjk5NGM1NTEzOWU5ZTU2NTViZWJhOTdiNTQyZGMzNTMzNzUxZGEwNTg2OWUyMWVhMWUxZDA3YTgxMDA3MWViYTgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbm8tc2hpbS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbm8tc2hpbS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNjM2FkNzAwZDA2NTRlNmE0ZmYyNzdhZWMyNjExNTFjOTdiOTMwMDNmZDUwMjNjOGIzYTM2ZTUxZDhiOGM1OWVjZTJlOTVlMjQ1NDBhNDQ1OTNiYjY0NGY2YjEzZmFkMGZhNjRmNGI2MmQ2MDZiYzk5MDIyZDRmYzEzMjg5YjI4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RyYWNrLXR1cm5zLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90cmFjay10dXJucy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRjMDAyZjE3NTczMmQ1NTRhNGYwNzY0YTFkMjUyOThjZmEwOTIzZTQxMWQ4OTI4NDI4OTBkZmM2NGIxOGExMzUyZWE4MmIxZDhlZTc5NmQ5Y2M4ODU1NDlmNDQ3Mzg4YzljYzNhNDlmY2UwNTdhNmIxMDkyNzM2NWM1MDRmMWUxIgogICAgICAgIH0sCiAgICAgICAgIi4vdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAidXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0NjA3MTIzOGIyNWQzMDc2NmY0NDczYjM2MDc1ZGIwNTAwNGEzMDk1YjdiYTZhZGQwNDRkOTg2NjVjN2UwYzNjMzA5ZDA0ZDQzNThhYWQ4YjA1ZGQ4ZmNmMDBmN2RmMjk2MTU1YzVmODI5YjJmOGJmMzhkZGJlZmIxMGQ1ODM0OSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS40LjAiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2ltcG9ydC1idW5kbGUiLAogICAgICAibGFiZWwiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS40LjAiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS40LjAiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vYmFzZTY0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MS4wLjkiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9pbXBvcnQtYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbXBvcnQtYXJjaGl2ZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbXBhcnRtZW50LXdyYXBwZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbXBhcnRtZW50LXdyYXBwZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmMjM0MjQwZDFmNzc1MTZjZTAxNTQ3ZmEyYzQyZDc0YjA3NzU5NTVjOGVlNTU3NjRiNDEzYTAwZjU0NTgyYjZiZWQ2MjVkODRkNDUyNjE5NGM5MDY1NzBkOTQ0OTY3NzA0Yzc5OTM5YzkyMTJiNjg5YmMxMWI4ODZjYmUxMmIzMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3ZGVjMWMzMjA2Y2U4ODU4YTkxYWQxZWMwZDk4MzA5MTBhYTA2NTljYmJhNjZiZTdjMGZiODdjNTM4NzA3ZTBjZGJiYWMxMzdmYTY3NjIzMzhlMjBhNWYwODc1M2U5NTk4MzE0NDJkNmUwMjU2YWRhMWYwODdjODBkZDUwOTk0MiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vbWFyc2hhbC12MS42LjQiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL21hcnNoYWwiLAogICAgICAibGFiZWwiOiAiQGVuZG8vbWFyc2hhbC12MS42LjQiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vbWFyc2hhbC12MS42LjQiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL29iamVjdC1tYXAuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEwIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY1LjEuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS41LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3NjM1MDMxMmYwZTJkYjZhNTAxMzdlNzJlOTY1ZGI4ZjZlMDI1YWMyYTNlOWMwOTEyYjJiMjcwN2MyZjUzYzAzZjlkN2JkNjM5NzgzMzY5M2QyZWU5MzMwYzUwNjI4ZWM4NDIxYzBjNzlkN2U2ODBjNGNmNWNmNjlhMDYyNDdjNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlUGFzc2FibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhN2M4OWU1ODQzZTEwMWVmOThkMDgxOWI1MWFlYzFjNDI0ZTFkMWViNGE0MjBlNDg0NDAyNjllMDc1OGVkMzlhOGM1NTdmNGZjOTM5NGI5MWY2MDU2MTNlNmE0NTk2YzU1MmMxODM4YmUxNGZkMzBiNWJkOGExNjk4ZTg1MTU1MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZVRvQ2FwRGF0YS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjI0ZmJmMWRlOWRiNDExMjRjZDE1NGUzNmY5MjgyNjllNWM2MTA1NjY1NzcyMjZmM2NjNDY2ODlmYTQ3ZGE5Y2I5ODU5MjM4NWZkMjg0YzcyNDZkZjY3OGI0ODFlZTA3OGYzOGEwNjE1MmJjMDQ1ZGNkZmJiMjI1MTJiZGU0MmFiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhiZDc0M2U2MzFmM2Y2ZDdkOGE4Zjc4NWE1MTZhNWMyZWJiZTcwZWJjNGY3OGNkYjJhYTcwOTNhNDYzYmM5N2M4NjZjNTc5NDg2ODE4ODZlMTllZTEwMGFmNjc2NjA1NjBhODE2MGZjMTBjMzJkNTcwNDVkYjQxNmNiMTBlMzZkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwtanVzdGluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLWp1c3Rpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE5YjIwZTUyMDU1ZmFjZDU3MTU2OTI4OThiODJiYTliZWVjOGU4ZjM3MzM1OTNkNWYxOTcxODlhOGNjYTEyY2M0OGE0ZDdkNGQ3ZTViZGY0NTNmNzM0NDRlNjI2ODRjZjVkMzlmMDVhNDBmMDQ2YjBmMzkwYWFiMTJlMjg0MzU5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjVkNGI1ZWNjYmI5YWZiYjZiYjJlNWZlNjEzMmM2OGQwMzQ0NGNiMDk0OTQ0ZGI3OTU3NTZlOGY0MjZmYjAyNDk1YWJhY2M5ZWYyMWQ2YTgxYTQ3NzAwZGNjZDAzNWI2MTQ0MTFmMDk1M2UzNmI1NzQ3NTkyYjUyNTUyZDIzNzhkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hcnNoYWwuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0YzQ3ODRhMzhhMzRkNTYxMzMxNmZjYzc2OGJkMzQzNTA5ZGIzODhhZWZhNTg0M2I2ZjA3MGQxMzhjNTI3OThjODBjMjYwZGZkN2E1NTZjOWVkNGNmZjNmNjgwNDUxOTNjM2RjMTM3YjM5YmRmNjYyZDFkMzQ0M2M0NWY1YzZjYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yYW5rT3JkZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JhbmtPcmRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU3MDUyOTJjZjcxZWE3ZjkxZTY1YzFlOTBjMDA3NDA4YmEwMThlODVlYTBlZjJlNzRlM2Y5OGMyOWJkYTRjNjA5NGI4ZTRlYjM4ODc1MjhjNmE2YzE5ZmZkYzFmNGI4OWZjZDQxMjNlNzMwMzAxYmRmNmE0YjY3OTU1MGNlYjQ3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9uYXQtdjUuMS4wIjogewogICAgICAibmFtZSI6ICJAZW5kby9uYXQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vbmF0LXY1LjEuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9uYXQtdjUuMS4wIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU3MzFjODI0YjFkOWI0MTc3ZmIzZmViNWExZWIwN2ExYzVkZjNjYTFlYTQ3NmExZTU1ODZlMTBjYjNmOTNjMTRkM2Q0MzZmOTE0ODk2MTkzMjkyMWVlZWYyM2ViZTMwZmI2YmIyMzMwNDRmYmVlYjc2YzZmOGUzMzU0YjllNmU1IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9wYXNzLXN0eWxlLXYxLjUuMCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcGFzcy1zdHlsZSIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjUuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjUuMCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9lbnYtb3B0aW9ucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdXRpbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU1ODQzMTYzYTc0YjkyZGUxMDZjMjI5ZTAxZTdkYWI3M2VlYzExMTdlMzgxNThkYTg1MzYyYWY5Y2ExMGZkOGVjNmZmODU3ZjlhMzliNGUyYTM3YmE2YTZiMGQ5MmY3NjM1MzA1MmE1MGFlZWQ5YzUwMDZiNDYyZTZkNjRiY2IwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvcHlBcnJheS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29weUFycmF5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDM2YzIzOGMzMGE5ZmY4NjYzZmQyNmI1NzhiYjkzZWMyMGRkNjVhYWE3ZWNkYTRjYzI4MzU2Nzk0OTE0NjQ1ODkxZGY4Zjc5ZTFiMjMyMjZhODQ5YTA3ZDRhOWY1ZGRlMzUzOTk1MzQyNmE5ZWE0MWY2MzhiZTY4ZjIxNDdkYTAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29weVJlY29yZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29weVJlY29yZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ1YmE5ZWVkMjFhYjYzZWEyZDA5ZmUyZTEyN2E0NjFjYzhhM2ViMTc4YmNmN2NmMTk1YTdmNGJhMjNhMDI1YzU4NjM3MjFjNjE5ZTQ0ZWY5NzU1MTgyM2ZhMzg4ZDI1ZjRjZDEwNTRjYjJhYzhhNjFhMGMxMWZjMzcyMWM2MGY2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZGVlcGx5RnVsZmlsbGVkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMGI2MTQwYjdjZTkwOTJmODZmNWYyMTE5ZDg3MTcxMjUyNGUyYTRlZGMzMjBlMDk3MjkyZmNiOGExYjViZjc5OWE3ZDJkZjAyOTA3Y2VkZGVhMmEyZmMzMmZjMDBiNGU5MjgzOWNjYmI2NThiNzVlNDQwMzI5MTA1ZjgxYWM5YWUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXJyb3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Vycm9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWJhZTJmMWY0MjYwMGJiOTcyOGVjMWQxZTdhY2U3ZTUzYTRmNjlkMzZkZTVhOGZjZmJjODUwZmM0ZmRhOGJlYjQ2MzdiYTYwYTVlYTBjNmNmYTBlZjVjYjlhMWQ4MjE2MWE3NzNkZDQ3ZTRkNGU3NjZjY2E2NTU4ODg4M2U5MjEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXRlci1oZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pdGVyLWhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiYWVmZDllMjM3MDlmZDFjZWM4ZDZkZDFlZDBhYzEyNTI1OWFlM2E4YmNhYTJiOTE4YmIzNzNhNjllN2VmNzlhMzljZDZkOWNmNjY3NDM2Njc2NzQ5NGUzOTM4MzMyZDI3MDM3MTA0MmY4MjMyNGM4MzQ2YmU1ODU3MThkN2JjZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlLWZhci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZS1mYXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiZTg3NTRjMjk4OTNiZGY4OGFlZDI5YzI2ZmFjMDczYjUwYTJmMDEyZWE5YzZjNDBhNTI0MTQwY2ZmY2VhZWE0YjllMmJlNGQ0NjRlMjczYmZhODRjY2QyN2RjMzQ5NzdkYzc2NzJhNDNlZmEzM2IyYTIyODg0NTFhMWEwMjE5NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlVGFnZ2VkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWtlVGFnZ2VkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWQ1ZjJjOWQ4YzQxZjFiOGJhOTg3ZWI4NzRjMjYzNTA5YjIyZDkwYWZhM2EzZjNiYjg4MWRiOWYwZTgwYmE2YTNiMzkzYTkzMGViYjI5MWU2ZjQ3M2VlNTYwNTMwZmNjZWVmM2YzMWZkMzYwZmUzMTI1OTEyNWFlZmE0ODc4ZjgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWJmNGFmOGY2OWNmMWQ0OWY3YmFmOWNhNDQyNzM0Y2M3OWI5NzJiOTk3YmRlMWIwZjhjODcwNDlhOWViZDRiZGY0ZjE2MWJmNzRkN2Q3ZGFkMTg4MTBiOWVhZGQxODIwNjhmNjIwMmQzNDZhMGJlNTBmNWM2NDI3YzA5NzA3NDYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGFzc1N0eWxlT2YuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3Bhc3NTdHlsZU9mLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNGZjN2FmMmY2YTgxYWNlYWJmNTk5YjAxYjdiZjU2YWE2NzQ2NzQ5NGU4NTEyNTAxOWU1YjhiNTFkZmMwMWVmMGQ2NTk3OWY5MmY1ZTZiY2MzMGM1YTEyN2ExZWYxNjliOWNhOWU0ODcxODM3YmUxYjQ3MGIyODg2ZjdkYmU1Y2MiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmVtb3RhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yZW1vdGFibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiNGZjY2YwNjY3NmEwZjU1NjdkNzE3MzViZGJiZjE5OTk0NjQ4NjRhNGYyNGFhZjVjZTY1ZjE3OWZiOWM3YzcxNjMxNDVlMjE1OTE3ZWIzYjMwMWE2Zjg0YWNjY2UwZDFkMTg2YzlmNjRjOThiNmIzZTdmY2E5ZDY1M2FjOWI4OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zYWZlLXByb21pc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3NhZmUtcHJvbWlzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc2MDk3MWVkZGVjOWU5MzZiMjEyNzQ5MmZiYzZhMmQ1MDAwZTRmNGE1OTAzZTNmMTI4NmFmZjM4ODIzYmU2NTcyNWRiMjJiMDE0OGMzYzM2MjhkZGJhZWI2MzdmM2U0NDk2OWY0M2FjYTM3YjAyZjJkZDVjOGQyM2I4Zjc0YTY4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0cmluZy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RyaW5nLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmU1MzE1YTY0YmZkMzE4YWY5YjM1MGU0M2FhZGRlZjYxOGI5ZTA1MjMyMjdkZGI0MWRmM2IzNmJhNzA4NzYwMDQ1YjRjNGUxMmY4YmIwYzdlNTRhYzI0YmFkZDIxM2UwY2Y5ZDVjMDQzNmZkZDM4ZGJhNzBiNDg3MTYyYTI5MjUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3ltYm9sLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zeW1ib2wuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4OTAwMTQyODc0MTBiNzJjZjcwODhkMjY1ODQ2NjAxNzExNjcxM2Y0ZDE0MDdkY2E5NzE5ODkyNjk2NTY1ZDBhYmIxMmFmMTY0NTZlMjRkYTkxYzhhMjYyMGUwNThkMDZiOTBmOGI1MTA1ZTM1YzY5NzZiMDcwNDVmN2U1YzMxOCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90YWdnZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RhZ2dlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE5MjdmMTFlYWVhNjE0YzE5MWY5OGM4ZDU3ZmM3MTQ5ZWY4ODM4MDMzN2JmZjQ5Y2FkOTM0YzdiM2ZmMWZhYjNhMDhiZTc0ZjY2ZmZlYTk1YWFhMmI5YzQ0M2IzZmUwNWNkN2Y5MDE3NWY4MzY3ZmViODc0NWJiYzI0MTg3MjczIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkYTZkY2EwM2E2OTRhYjdkYTg5OWNjY2FiMzhkNDdjMDYxODYwYjI2ZjFkNzI5MjlmMzBhZDY4NDE5MWY4MDc0M2Y4NTc3OGY0YWIwYTZjYjQ1ZDA5YzBlZWIzMGM0OThhYWIzOGE0OWM2NGU5NmFiYTRhNTQxODZkZDgyYzA4MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcHJvbWlzZS1raXQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjEwIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiZjQ2NTMzMDdmODA2ZjEzYjJhZGI1OTZiYjZlMjRjYWZlOGYwODM0NDJmOGI1MGIzMmEwZWNhYjFhZjhkZWU1MmI2YTliODNlNjRiYzJkNjZiZDVkZDQyM2RkZjA2YTEyMTQxZjlhYjhlNjRjYjI2MTQwNjRlZTY1MmQwNDAwNCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pcy1wcm9taXNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pcy1wcm9taXNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2QzYTI1NjM2ZTU0Mjc4YjMzZjZjMzYyMTQ3ODg5ZTZmZjEwYmVkYTgwYzA3ZTZhMTZkMTkwNDdiN2IzYzZhMzRkNzMwZTliM2NmYzlmODUxMWI2ZTI3YjZhNjk3NzY0Zjk2ODNkNzBkZjcwODZlMDg1ZjkzZDdmOTVmYzRmZmEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWVtby1yYWNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tZW1vLXJhY2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0MmViMGMxYTI0OTY2ZDRhYmZmYTJjMThjMmZiMjhkZDUwNGRjYjNiNzIzZDgzMDBjMTBlOTQzOTQ0OTNjNTRlMTgwMjQ1MjdmZGU3MDFkN2VkNTkzYjI2NWU0NTZkMmQ0OGMxNWUwZDUwMTAxMDhlZmQxODcyYjc0YTI1MTRjZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0Yzg0ZDA3NmUwYTQxOWZjODYzN2FiMzhmMjQ0MzM4YzQ3NmM1MDEzMmNmZTA5MDAyZGRkY2JiZmNkMzY1YmY2Y2YzZDMyYjA5ZGEzMjUyNWY3NWI2MGY1ZmM2NjBkZGMwZTA4ZjM2YTYwN2JhMDc3ZjU5OWJjNTVmMjllY2IzNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vdHJhbXBvbGluZS12MS4wLjMiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3RyYW1wb2xpbmUiLAogICAgICAibGFiZWwiOiAiQGVuZG8vdHJhbXBvbGluZS12MS4wLjMiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vdHJhbXBvbGluZS12MS4wLjMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjE0ZWFiOWFmZjc5ZTMyZDc0ZmNlOWZiYmQ1OGJmOGRjZWZkMDU2NGRiYjRkYmNlZGE5ZWJhYWM1NWY2MWUxZTMxZGViNTE1YWNmYTZjYzQzNmM3NjE4NmJlY2E2ODM0ODgxY2ZhM2Y1MmE3YjhiZDc2YTY5YjNjZDkxNjJhMjI2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RyYW1wb2xpbmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RyYW1wb2xpbmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmYmFlM2E2ZWFhYTkzNmU0YmFjYjc0YTlkZDM4ZWM1OGU4OTU3YTEyYTQwODk3NGUyMzM4MjJiZjYxNzEyZmY4MzYwMGY5OGRlOTI3YTRkM2M0NGY0ODNlMTZiNjA0ZjgxNzQ0MmUwMjdkMTdkYTk1YmYzNjY4ZTAwMzQ5NjQ5NiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vemlwLXYxLjAuOSI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vemlwIiwKICAgICAgImxhYmVsIjogIkBlbmRvL3ppcC12MS4wLjkiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vemlwLXYxLjAuOSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMmRmZGI3YWQ4NDNhNzE4ODhiNTZhZTZmZGMzMWQ0MjJlMjUxMzE4ZDY4OWE4MWJhNjZmYjNkNTM0MWQwMTgzMzg5YzVhZTg4ZDZlYjA2OGMxNDA0OGQ1NzQzNDkxNzc5ZDUzNDkwNzQxYWFkMjkxYjlkZmNhMGJmYmJhNjgyODEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYnVmZmVyLXJlYWRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYnVmZmVyLXJlYWRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjllZjk1NGVhYzIwYzVlMTljMmY2ZDE4MzNjMmI1M2JkM2MzZmMxMDA0MDA4N2U3YmM3ZDY0YTJiM2ZjNTkzMzVjNjJkZWMxZGQ4YzBjY2RiMDI1ZWZkYmFjOTFiMzQ3ZTQzZjJiMzI0ZTNkOTE1NmU2N2JhZWQxN2ExNDNkZjMwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2J1ZmZlci13cml0ZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2J1ZmZlci13cml0ZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhZTc5NjhhYzZlYjg1YTVmMDVjOGM2ZTRkNjJmZjY0YTY4YWM5NDQ1MjkyN2QzY2FkZWJkYTE3ZDAzYTk1MWZmMTkzN2EyZjU3NDNiMTVlNjlhNDU1NDM5ODJlMTdjOWE4MWJmMzRjM2NhZTI2MzUzY2MxY2JiZjQzMTI1NzcyYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb21wcmVzc2lvbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29tcHJlc3Npb24uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0ZjZlMjM5ZTY0YWU2ZDk2M2IyMDhjODllZjc5ZWNjYWM4YzVhNjYzMzQ4N2NiZjY1ODNkNmY2NDdmYTlmM2VhNDVlNTlhZjRkODRjZmU4ZWFlNzliZDdkMTIyY2JjMmMyNzA4ZTYyOTAyNjc5MTI2YmYyMjFlYjZkZWRmZWU3NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jcmMzMi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY3JjMzIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3OWI3NDE3ZGE4ZGU2YTYzMTgyMDJhZTYzZGVjZDI5ZTYwMjNjOWY1ZmZlMTdkMWYyZmUxYTA2MGZlZDlmYzE4OGViMDljYTdmNWRlMDk1OGE3MzFmNGE0MmM4Njk2M2ZhODkxZTJhNmE2YTQyZDJlNzA2MWRlMjg0NmM1ZGRiYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9mb3JtYXQtcmVhZGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9mb3JtYXQtcmVhZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjU1MWQ1OWZhN2FkOTRjMjRhZjljMTBkZDRkMzYxMzNiNjUzNWNhYzIyYjI3Y2I5YmJiMjYxN2FhOWUwMmU5ZTdmZjhhMTkyODcxMmVhODM3OWMzMjhkMjc5OWJkOTA0ZTJjMGRmOWM5YzVhMmY1MjlkZjk2OGQ1NTVjZDhiMzUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZm9ybWF0LXdyaXRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZm9ybWF0LXdyaXRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjUzNzQ4M2MwODgxNjlkZTlhY2RkZDlhZjEwZjViYzRiZTBiMzU4YjRjZDg0M2VjNzE3OWFiYzMwMDJhZDBhMmQ4OTQ2OGZlZjliNTNhMzg3YjA3ZTE1ZjViZDg0MzAxMmRiZGY4M2YwOWNjOWNkY2EwNTlkYTVjMDkyNTUzYWY1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JlYWRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmVhZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDg3MDM0Yjg3ZjRlYzNlMjkzZTIxMjgzNjAwNGFiNWM5NTkwZTg2YTI1ZGMyZDc2ZWM4MWVjNzI5YzUwYzlkYTUyODQxMDY1ZmNhNDM0MzRjMWJkMDc5MjZkZDQ3NDIwMDNmNWUzODYwYTU3ZDM0NmVlMTdiZmRiZjhkNzdhZWIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc2lnbmF0dXJlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zaWduYXR1cmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyZGFlZDBmNGFiMWIxNWM5ODE2NGIxNGZkYTM1YTJmOTcwNjQ3Zjc1M2UwMTlmNzEwYmY1ZGRlOTVmZTQ0OTNiM2ZmMTExOWNmMWRmNDQ1MzdkYzE1NDNkZDdiNDJlNjcwYjRhMDVhMzVhYjBmNTI4ZGM2NjA0YzFmMWQzYjg4OSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy93cml0ZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3dyaXRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI0MTA5MjlmZWFkZDYwYTZhYjIyNTUxZWQ0OWIwN2VlZjNmNjA3NDhlODYyMTBlMDA1NTU1MWRiNDlhYWUyNzViODI3Mjc0MTUxZjliOGQ4NjFiZTY5NDZmYmNkMjc5ZWJhMDVlYjIwZWQyM2MxNjhjYTY2ZGY5OTVlYjBlZDNlIgogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KfVBLAwQKAAAAAAAAAAAAH1sUNdkEAADZBAAAKQAAAEBhZ29yaWMvc3Bhd25lci12MC42Ljgvc3JjL3ZhdC1zcGF3bmVkLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ltcG9ydC1idW5kbGUiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiYnVpbGRSb290T2JqZWN0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgaW1wb3J0QnVuZGxlLEZhcjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2ltcG9ydC1idW5kbGVcIiwgW1tcImltcG9ydEJ1bmRsZVwiLFskaM2PX2EgPT4gKGltcG9ydEJ1bmRsZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGJ1aWxkUm9vdE9iamVjdCwnbmFtZScse3ZhbHVlOlwiYnVpbGRSb290T2JqZWN0XCJ9KTskaM2PX29uY2UuYnVpbGRSb290T2JqZWN0KGJ1aWxkUm9vdE9iamVjdCk7XG5cblxuXG5cbmNvbnN0IGVuZG93bWVudHMgPSB7XG4gIFZhdERhdGEsXG4gIGNvbnNvbGUsXG4gIC8vXG4gIGFzc2VydDogZ2xvYmFsVGhpcy5hc3NlcnQsXG4gIEJhc2U2NDogZ2xvYmFsVGhpcy5CYXNlNjQsIC8vXG4gIFVSTDogZ2xvYmFsVGhpcy5VUkwgIC8vXG59O1xuXG4gICAgICAgZnVuY3Rpb24gYnVpbGRSb290T2JqZWN0KCkge1xuICByZXR1cm4gRmFyKCdyb290Jywge1xuICAgIGFzeW5jIGxvYWRCdW5kbGUoYnVuZGxlKSB7XG4gICAgICBjb25zdCBucyA9IGF3YWl0IGltcG9ydEJ1bmRsZShidW5kbGUsIHsgZW5kb3dtZW50cyB9KTtcbiAgICAgIGNvbnN0IHN0YXJ0Rm4gPSBucy5kZWZhdWx0O1xuICAgICAgcmV0dXJuIEZhcignc3Bhd25lZCBidW5kbGUnLCB7XG4gICAgICAgIGFzeW5jIHN0YXJ0KGFyZ3NQKSB7XG4gICAgICAgICAgY29uc3QgYXJncyA9IGF3YWl0IGFyZ3NQO1xuICAgICAgICAgIHJldHVybiBzdGFydEZuKGFyZ3MpO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJidWlsZFJvb3RPYmplY3QiOlsiYnVpbGRSb290T2JqZWN0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADjUnGd1AgAAdQIAABsAAABAZW5kby9iYXNlNjQtdjEuMC45L2F0b2IuanN7ImltcG9ydHMiOlsiLi9kZWNvZGUuanMiXSwiZXhwb3J0cyI6WyJhdG9iIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZGVjb2RlQmFzZTY0OyRozY9faW1wb3J0cyhbW1wiLi9kZWNvZGUuanNcIiwgW1tcImRlY29kZUJhc2U2NFwiLFskaM2PX2EgPT4gKGRlY29kZUJhc2U2NCA9ICRozY9fYSldXV1dXSk7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgYXRvYiA9IGVuY29kZWREYXRhID0+IHtcbiAgY29uc3QgYnVmID0gZGVjb2RlQmFzZTY0KGVuY29kZWREYXRhKTtcbiAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoLi4uYnVmKTtcbn07JGjNj19vbmNlLmF0b2IoYXRvYik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhdG9iIjpbImF0b2IiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAksKTjzQDAAA0AwAAGwAAAEBlbmRvL2Jhc2U2NC12MS4wLjkvYnRvYS5qc3siaW1wb3J0cyI6WyIuL2VuY29kZS5qcyJdLCJleHBvcnRzIjpbImJ0b2EiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBlbmNvZGVCYXNlNjQ7JGjNj19pbXBvcnRzKFtbXCIuL2VuY29kZS5qc1wiLCBbW1wiZW5jb2RlQmFzZTY0XCIsWyRozY9fYSA9PiAoZW5jb2RlQmFzZTY0ID0gJGjNj19hKV1dXV1dKTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBidG9hID0gc3RyaW5nVG9FbmNvZGUgPT4ge1xuICBjb25zdCBieXRlcyA9IHN0cmluZ1RvRW5jb2RlLnNwbGl0KCcnKS5tYXAoY2hhciA9PiB7XG4gICAgY29uc3QgYiA9IGNoYXIuY2hhckNvZGVBdCgwKTtcbiAgICBpZiAoYiA+IDB4ZmYpIHtcbiAgICAgIHRocm93IEVycm9yKGBidG9hOiBjaGFyYWN0ZXIgb3V0IG9mIHJhbmdlOiAke2NoYXJ9YCk7XG4gICAgfVxuICAgIHJldHVybiBiO1xuICB9KTtcbiAgY29uc3QgYnVmID0gbmV3IFVpbnQ4QXJyYXkoYnl0ZXMpO1xuICByZXR1cm4gZW5jb2RlQmFzZTY0KGJ1Zik7XG59OyRozY9fb25jZS5idG9hKGJ0b2EpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYnRvYSI6WyJidG9hIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAR7dn+5AQAAuQEAAB0AAABAZW5kby9iYXNlNjQtdjEuMC45L2RlY29kZS5qc3siaW1wb3J0cyI6WyIuL3NyYy9kZWNvZGUuanMiXSwiZXhwb3J0cyI6W251bGxdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9kZWNvZGUuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9kZWNvZGUuanMiOltbImRlY29kZUJhc2U2NCIsImRlY29kZUJhc2U2NCJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAoValSLkBAAC5AQAAHQAAAEBlbmRvL2Jhc2U2NC12MS4wLjkvZW5jb2RlLmpzeyJpbXBvcnRzIjpbIi4vc3JjL2VuY29kZS5qcyJdLCJleHBvcnRzIjpbbnVsbF0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2VuY29kZS5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2VuY29kZS5qcyI6W1siZW5jb2RlQmFzZTY0IiwiZW5jb2RlQmFzZTY0Il1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAa++pXpAIAAKQCAAAcAAAAQGVuZG8vYmFzZTY0LXYxLjAuOS9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9lbmNvZGUuanMiLCIuL3NyYy9kZWNvZGUuanMiLCIuL2J0b2EuanMiLCIuL2F0b2IuanMiXSwiZXhwb3J0cyI6W251bGwsbnVsbCxudWxsLG51bGxdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9lbmNvZGUuanNcIiwgW11dLFtcIi4vc3JjL2RlY29kZS5qc1wiLCBbXV0sW1wiLi9idG9hLmpzXCIsIFtdXSxbXCIuL2F0b2IuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9lbmNvZGUuanMiOltbImVuY29kZUJhc2U2NCIsImVuY29kZUJhc2U2NCJdXSwiLi9zcmMvZGVjb2RlLmpzIjpbWyJkZWNvZGVCYXNlNjQiLCJkZWNvZGVCYXNlNjQiXV0sIi4vYnRvYS5qcyI6W1siYnRvYSIsImJ0b2EiXV0sIi4vYXRvYi5qcyI6W1siYXRvYiIsImF0b2IiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAB+XnPU3AwAANwMAACEAAABAZW5kby9iYXNlNjQtdjEuMC45L3NyYy9jb21tb24uanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImFscGhhYmV0NjQiLCJtb25vZHU2NCIsInBhZGRpbmciXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Ly9cblxuICAgICAgIGNvbnN0IHBhZGRpbmcgPSAnPSc7JGjNj19vbmNlLnBhZGRpbmcocGFkZGluZyk7XG5cbiAgICAgICBjb25zdCBhbHBoYWJldDY0ID1cbiAgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nO1xuXG4vKlxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5hbHBoYWJldDY0KGFscGhhYmV0NjQpO1xuICAgICAgIGNvbnN0IG1vbm9kdTY0ID0ge307JGjNj19vbmNlLm1vbm9kdTY0KG1vbm9kdTY0KTtcbmZvciAobGV0IGkgPSAwOyBpIDwgYWxwaGFiZXQ2NC5sZW5ndGg7IGkgKz0gMSkge1xuICBjb25zdCBjID0gYWxwaGFiZXQ2NFtpXTtcbiAgbW9ub2R1NjRbY10gPSBpO1xufVxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicGFkZGluZyI6WyJwYWRkaW5nIl0sImFscGhhYmV0NjQiOlsiYWxwaGFiZXQ2NCJdLCJtb25vZHU2NCI6WyJtb25vZHU2NCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADywE7BkggAAJIIAAAhAAAAQGVuZG8vYmFzZTY0LXYxLjAuOS9zcmMvZGVjb2RlLmpzeyJpbXBvcnRzIjpbIi4vY29tbW9uLmpzIl0sImV4cG9ydHMiOlsiZGVjb2RlQmFzZTY0IiwianNEZWNvZGVCYXNlNjQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBtb25vZHU2NCxwYWRkaW5nOyRozY9faW1wb3J0cyhbW1wiLi9jb21tb24uanNcIiwgW1tcIm1vbm9kdTY0XCIsWyRozY9fYSA9PiAobW9ub2R1NjQgPSAkaM2PX2EpXV0sW1wicGFkZGluZ1wiLFskaM2PX2EgPT4gKHBhZGRpbmcgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBqc0RlY29kZUJhc2U2NCA9IChzdHJpbmcsIG5hbWUgPSAnPHVua25vd24+JykgPT4ge1xuICBjb25zdCBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoTWF0aC5jZWlsKChzdHJpbmcubGVuZ3RoICogNCkgLyAzKSk7XG4gIGxldCByZWdpc3RlciA9IDA7XG4gIGxldCBxdWFudHVtID0gMDtcbiAgbGV0IGkgPSAwOyAvL1xuICBsZXQgaiA9IDA7IC8vXG5cbiAgd2hpbGUgKGkgPCBzdHJpbmcubGVuZ3RoICYmIHN0cmluZ1tpXSAhPT0gcGFkZGluZykge1xuICAgIGNvbnN0IG51bWJlciA9IG1vbm9kdTY0W3N0cmluZ1tpXV07XG4gICAgaWYgKG51bWJlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBiYXNlNjQgY2hhcmFjdGVyICR7c3RyaW5nW2ldfSBpbiBzdHJpbmcgJHtuYW1lfWApO1xuICAgIH1cbiAgICByZWdpc3RlciA9IChyZWdpc3RlciA8PCA2KSB8IG51bWJlcjtcbiAgICBxdWFudHVtICs9IDY7XG4gICAgaWYgKHF1YW50dW0gPj0gOCkge1xuICAgICAgcXVhbnR1bSAtPSA4O1xuICAgICAgZGF0YVtqXSA9IHJlZ2lzdGVyID4+PiBxdWFudHVtO1xuICAgICAgaiArPSAxO1xuICAgICAgcmVnaXN0ZXIgJj0gKDEgPDwgcXVhbnR1bSkgLSAxO1xuICAgIH1cbiAgICBpICs9IDE7XG4gIH1cblxuICB3aGlsZSAocXVhbnR1bSA+IDApIHtcbiAgICBpZiAoaSA9PT0gc3RyaW5nLmxlbmd0aCB8fCBzdHJpbmdbaV0gIT09IHBhZGRpbmcpIHtcbiAgICAgIHRocm93IEVycm9yKGBNaXNzaW5nIHBhZGRpbmcgYXQgb2Zmc2V0ICR7aX0gb2Ygc3RyaW5nICR7bmFtZX1gKTtcbiAgICB9XG4gICAgLy9cbiAgICAvL1xuICAgIGkgKz0gMTtcbiAgICBxdWFudHVtIC09IDI7XG4gIH1cblxuICBpZiAoaSA8IHN0cmluZy5sZW5ndGgpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBCYXNlNjQgc3RyaW5nIGhhcyB0cmFpbGluZyBnYXJiYWdlICR7c3RyaW5nLnN1YnN0cihcbiAgICAgICAgaSxcbiAgICAgICl9IGluIHN0cmluZyAke25hbWV9YCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGRhdGEuc3ViYXJyYXkoMCwgaik7XG59O1xuXG4vL1xuLy9cbiRozY9fb25jZS5qc0RlY29kZUJhc2U2NChqc0RlY29kZUJhc2U2NCk7Y29uc3QgYWRhcHREZWNvZGVyPVxuICBuYXRpdmVEZWNvZGVCYXNlNjQgPT5cbiAgKC4uLmFyZ3MpID0+IHtcbiAgICBjb25zdCBkZWNvZGVkID0gbmF0aXZlRGVjb2RlQmFzZTY0KC4uLmFyZ3MpO1xuICAgIGlmIChkZWNvZGVkIGluc3RhbmNlb2YgVWludDhBcnJheSkge1xuICAgICAgcmV0dXJuIGRlY29kZWQ7XG4gICAgfVxuICAgIHJldHVybiBuZXcgVWludDhBcnJheShkZWNvZGVkKTtcbiAgfTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgZGVjb2RlQmFzZTY0ID1cbiAgZ2xvYmFsVGhpcy5CYXNlNjQgIT09IHVuZGVmaW5lZFxuICAgID8gYWRhcHREZWNvZGVyKGdsb2JhbFRoaXMuQmFzZTY0LmRlY29kZSlcbiAgICA6IGpzRGVjb2RlQmFzZTY0OyRozY9fb25jZS5kZWNvZGVCYXNlNjQoZGVjb2RlQmFzZTY0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImpzRGVjb2RlQmFzZTY0IjpbImpzRGVjb2RlQmFzZTY0Il0sImRlY29kZUJhc2U2NCI6WyJkZWNvZGVCYXNlNjQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAjxNDN2sHAABrBwAAIQAAAEBlbmRvL2Jhc2U2NC12MS4wLjkvc3JjL2VuY29kZS5qc3siaW1wb3J0cyI6WyIuL2NvbW1vbi5qcyJdLCJleHBvcnRzIjpbImVuY29kZUJhc2U2NCIsImpzRW5jb2RlQmFzZTY0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYWxwaGFiZXQ2NCxwYWRkaW5nOyRozY9faW1wb3J0cyhbW1wiLi9jb21tb24uanNcIiwgW1tcImFscGhhYmV0NjRcIixbJGjNj19hID0+IChhbHBoYWJldDY0ID0gJGjNj19hKV1dLFtcInBhZGRpbmdcIixbJGjNj19hID0+IChwYWRkaW5nID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBqc0VuY29kZUJhc2U2NCA9IGRhdGEgPT4ge1xuICAvL1xuICAvL1xuICAvL1xuICBsZXQgc3RyaW5nID0gJyc7XG4gIGxldCByZWdpc3RlciA9IDA7XG4gIGxldCBxdWFudHVtID0gMDtcblxuICBmb3IgKGxldCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCBiID0gZGF0YVtpXTtcbiAgICByZWdpc3RlciA9IChyZWdpc3RlciA8PCA4KSB8IGI7XG4gICAgcXVhbnR1bSArPSA4O1xuICAgIGlmIChxdWFudHVtID09PSAyNCkge1xuICAgICAgc3RyaW5nICs9XG4gICAgICAgIGFscGhhYmV0NjRbKHJlZ2lzdGVyID4+PiAxOCkgJiAweDNmXSArXG4gICAgICAgIGFscGhhYmV0NjRbKHJlZ2lzdGVyID4+PiAxMikgJiAweDNmXSArXG4gICAgICAgIGFscGhhYmV0NjRbKHJlZ2lzdGVyID4+PiA2KSAmIDB4M2ZdICtcbiAgICAgICAgYWxwaGFiZXQ2NFsocmVnaXN0ZXIgPj4+IDApICYgMHgzZl07XG4gICAgICByZWdpc3RlciA9IDA7XG4gICAgICBxdWFudHVtID0gMDtcbiAgICB9XG4gIH1cblxuICBzd2l0Y2ggKHF1YW50dW0pIHtcbiAgICBjYXNlIDA6XG4gICAgICBicmVhaztcbiAgICBjYXNlIDg6XG4gICAgICBzdHJpbmcgKz1cbiAgICAgICAgYWxwaGFiZXQ2NFsocmVnaXN0ZXIgPj4+IDIpICYgMHgzZl0gK1xuICAgICAgICBhbHBoYWJldDY0WyhyZWdpc3RlciA8PCA0KSAmIDB4M2ZdICtcbiAgICAgICAgcGFkZGluZyArXG4gICAgICAgIHBhZGRpbmc7XG4gICAgICBicmVhaztcbiAgICBjYXNlIDE2OlxuICAgICAgc3RyaW5nICs9XG4gICAgICAgIGFscGhhYmV0NjRbKHJlZ2lzdGVyID4+PiAxMCkgJiAweDNmXSArXG4gICAgICAgIGFscGhhYmV0NjRbKHJlZ2lzdGVyID4+PiA0KSAmIDB4M2ZdICtcbiAgICAgICAgYWxwaGFiZXQ2NFsocmVnaXN0ZXIgPDwgMikgJiAweDNmXSArXG4gICAgICAgIHBhZGRpbmc7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhyb3cgRXJyb3IoYGludGVybmFsOiBiYWQgcXVhbnR1bSAke3F1YW50dW19YCk7XG4gIH1cbiAgcmV0dXJuIHN0cmluZztcbn07XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS5qc0VuY29kZUJhc2U2NChqc0VuY29kZUJhc2U2NCk7XG4gICAgICAgY29uc3QgZW5jb2RlQmFzZTY0ID1cbiAgZ2xvYmFsVGhpcy5CYXNlNjQgIT09IHVuZGVmaW5lZCA/IGdsb2JhbFRoaXMuQmFzZTY0LmVuY29kZSA6IGpzRW5jb2RlQmFzZTY0OyRozY9fb25jZS5lbmNvZGVCYXNlNjQoZW5jb2RlQmFzZTY0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImpzRW5jb2RlQmFzZTY0IjpbImpzRW5jb2RlQmFzZTY0Il0sImVuY29kZUJhc2U2NCI6WyJlbmNvZGVCYXNlNjQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAf1UUszQDAAA0AwAAIgAAAEBlbmRvL2NvbW1vbi12MS4yLjEwL29iamVjdC1tYXAuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm9iamVjdE1hcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtjb25zdCB7IGVudHJpZXMsIGZyb21FbnRyaWVzIH0gPSBPYmplY3Q7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG9iamVjdE1hcCA9IChvcmlnaW5hbCwgbWFwRm4pID0+IHtcbiAgY29uc3QgZW50cyA9IGVudHJpZXMob3JpZ2luYWwpO1xuICBjb25zdCBtYXBFbnRzID0gZW50cy5tYXAoXG4gICAgKFtrLCB2XSkgPT4gLyogICAgICAgICAgICAgICAgICAgICAgICovIChbaywgbWFwRm4odiwgayldKSxcbiAgKTtcbiAgcmV0dXJuIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoaGFyZGVuKGZyb21FbnRyaWVzKG1hcEVudHMpKSk7XG59OyRozY9fb25jZS5vYmplY3RNYXAob2JqZWN0TWFwKTtcbmhhcmRlbihvYmplY3RNYXApO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsib2JqZWN0TWFwIjpbIm9iamVjdE1hcCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC3BWtwfQIAAH0CAAAxAAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9pbXBvcnQtYXJjaGl2ZS5qc3siaW1wb3J0cyI6WyIuL3NyYy90eXBlcy1leHRlcm5hbC5qcyIsIi4vc3JjL2ltcG9ydC1hcmNoaXZlLmpzIl0sImV4cG9ydHMiOlsibG9hZEFyY2hpdmUiLCJsb2FkQXJjaGl2ZSJdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdHlwZXMtZXh0ZXJuYWwuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvdHlwZXMtZXh0ZXJuYWwuanNcIiwgW11dLFtcIi4vc3JjL2ltcG9ydC1hcmNoaXZlLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvaW1wb3J0LWFyY2hpdmUuanMiOltbInBhcnNlQXJjaGl2ZSIsInBhcnNlQXJjaGl2ZSJdLFsibG9hZEFyY2hpdmUiLCJsb2FkQXJjaGl2ZSJdLFsiaW1wb3J0QXJjaGl2ZSIsImltcG9ydEFyY2hpdmUiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACjFBe6MLQAAjC0AADYAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9jb21wYXJ0bWVudC1tYXAuanN7ImltcG9ydHMiOlsiLi9wb2xpY3ktZm9ybWF0LmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0Q29tcGFydG1lbnRNYXAiLCJwYXRoQ29tcGFyZSIsInN0cmluZ0NvbXBhcmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnRQYWNrYWdlUG9saWN5OyRozY9faW1wb3J0cyhbW1wiLi9wb2xpY3ktZm9ybWF0LmpzXCIsIFtbXCJhc3NlcnRQYWNrYWdlUG9saWN5XCIsWyRozY9fYSA9PiAoYXNzZXJ0UGFja2FnZVBvbGljeSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vL1xuLy9cbi8vXG4vL1xuY29uc3QgcSA9IEpTT04uc3RyaW5naWZ5O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLy9cbiAgICAgICBjb25zdCBzdHJpbmdDb21wYXJlID0gKGEsIGIpID0+IChhID09PSBiID8gMCA6IGEgPCBiID8gLTEgOiAxKTtcblxuLypcblxuXG4gKi8kaM2PX29uY2Uuc3RyaW5nQ29tcGFyZShzdHJpbmdDb21wYXJlKTtcbmNvbnN0IGN1bXVsYXRpdmVMZW5ndGggPSAobGVuZ3RoLCB0ZXJtKSA9PiB7XG4gIHJldHVybiBsZW5ndGggKyB0ZXJtLmxlbmd0aDtcbn07XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgcGF0aENvbXBhcmUgPSAoYSwgYikgPT4ge1xuICAvL1xuICBpZiAoYSA9PT0gdW5kZWZpbmVkICYmIGIgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiAwO1xuICB9XG4gIGlmIChhID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuICBpZiAoYiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIC8vXG4gIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHtcbiAgICByZXR1cm4gYS5sZW5ndGggLSBiLmxlbmd0aDtcbiAgfVxuICAvL1xuICBjb25zdCBhU3VtID0gYS5yZWR1Y2UoY3VtdWxhdGl2ZUxlbmd0aCwgMCk7XG4gIGNvbnN0IGJTdW0gPSBiLnJlZHVjZShjdW11bGF0aXZlTGVuZ3RoLCAwKTtcbiAgaWYgKGFTdW0gIT09IGJTdW0pIHtcbiAgICByZXR1cm4gYVN1bSAtIGJTdW07XG4gIH1cbiAgLy9cbiAgYXNzZXJ0KGEubGVuZ3RoID09PSBiLmxlbmd0aCk7IC8vXG4gIC8vXG4gIC8vXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IGNvbXBhcmlzb24gPSBzdHJpbmdDb21wYXJlKGFbaV0sIGJbaV0pO1xuICAgIGlmIChjb21wYXJpc29uICE9PSAwKSB7XG4gICAgICByZXR1cm4gY29tcGFyaXNvbjtcbiAgICB9XG4gIH1cbiAgLy9cbiAgLy9cbiAgLy9cbiAgcmV0dXJuIDA7XG59O1xuXG4vKlxuXG5cbiAqLyRozY9fb25jZS5wYXRoQ29tcGFyZShwYXRoQ29tcGFyZSk7XG5mdW5jdGlvbiogZW51bWVyYXRlKGl0ZXJhYmxlKSB7XG4gIGxldCBpbmRleCA9IDA7XG4gIGZvciAoY29uc3QgdmFsdWUgb2YgaXRlcmFibGUpIHtcbiAgICB5aWVsZCBbaW5kZXgsIHZhbHVlXTtcbiAgICBpbmRleCArPSAxO1xuICB9XG59XG5cbi8qXG5cblxuICovXG5jb25zdCBhc3NlcnRFbXB0eU9iamVjdCA9IChvYmplY3QsIG1lc3NhZ2UpID0+IHtcbiAgYXNzZXJ0KE9iamVjdC5rZXlzKG9iamVjdCkubGVuZ3RoID09PSAwLCBtZXNzYWdlKTtcbn07XG5cbi8qXG5cblxuICovXG5jb25zdCBhc3NlcnRDb25kaXRpb25zID0gKGNvbmRpdGlvbnMsIHVybCkgPT4ge1xuICBpZiAoY29uZGl0aW9ucyA9PT0gdW5kZWZpbmVkKSByZXR1cm47XG4gIGFzc2VydChcbiAgICBBcnJheS5pc0FycmF5KGNvbmRpdGlvbnMpLFxuICAgIGBjb25kaXRpb25zIG11c3QgYmUgYW4gYXJyYXksIGdvdCAke2NvbmRpdGlvbnN9IGluICR7cSh1cmwpfWAsXG4gICk7XG4gIGZvciAoY29uc3QgW2luZGV4LCB2YWx1ZV0gb2YgZW51bWVyYXRlKGNvbmRpdGlvbnMpKSB7XG4gICAgYXNzZXJ0LnR5cGVvZihcbiAgICAgIHZhbHVlLFxuICAgICAgJ3N0cmluZycsXG4gICAgICBgY29uZGl0aW9uc1ske2luZGV4fV0gbXVzdCBiZSBhIHN0cmluZywgZ290ICR7dmFsdWV9IGluICR7cSh1cmwpfWAsXG4gICAgKTtcbiAgfVxufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0Q29tcGFydG1lbnRNb2R1bGUgPSAoYWxsZWdlZE1vZHVsZSwgcGF0aCwgdXJsKSA9PiB7XG4gIGNvbnN0IHsgY29tcGFydG1lbnQsIG1vZHVsZSwgcmV0YWluZWQsIC4uLmV4dHJhIH0gPSBhbGxlZ2VkTW9kdWxlO1xuICBhc3NlcnRFbXB0eU9iamVjdChcbiAgICBleHRyYSxcbiAgICBgJHtwYXRofSBtdXN0IG5vdCBoYXZlIGV4dHJhIHByb3BlcnRpZXMsIGdvdCAke3Eoe1xuICAgICAgZXh0cmEsXG4gICAgICBjb21wYXJ0bWVudCxcbiAgICB9KX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcbiAgYXNzZXJ0LnR5cGVvZihcbiAgICBjb21wYXJ0bWVudCxcbiAgICAnc3RyaW5nJyxcbiAgICBgJHtwYXRofS5jb21wYXJ0bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtxKGNvbXBhcnRtZW50KX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcbiAgYXNzZXJ0LnR5cGVvZihcbiAgICBtb2R1bGUsXG4gICAgJ3N0cmluZycsXG4gICAgYCR7cGF0aH0ubW9kdWxlIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3EobW9kdWxlKX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcbiAgaWYgKHJldGFpbmVkICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnQudHlwZW9mKFxuICAgICAgcmV0YWluZWQsXG4gICAgICAnYm9vbGVhbicsXG4gICAgICBgJHtwYXRofS5yZXRhaW5lZCBtdXN0IGJlIGEgYm9vbGVhbiwgZ290ICR7cShyZXRhaW5lZCl9IGluICR7cSh1cmwpfWAsXG4gICAgKTtcbiAgfVxufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0RmlsZU1vZHVsZSA9IChhbGxlZ2VkTW9kdWxlLCBwYXRoLCB1cmwpID0+IHtcbiAgY29uc3QgeyBsb2NhdGlvbiwgcGFyc2VyLCBzaGE1MTIsIC4uLmV4dHJhIH0gPSBhbGxlZ2VkTW9kdWxlO1xuICBhc3NlcnRFbXB0eU9iamVjdChcbiAgICBleHRyYSxcbiAgICBgJHtwYXRofSBtdXN0IG5vdCBoYXZlIGV4dHJhIHByb3BlcnRpZXMsIGdvdCAke3EoXG4gICAgICBPYmplY3Qua2V5cyhleHRyYSksXG4gICAgKX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcbiAgYXNzZXJ0LnR5cGVvZihcbiAgICBsb2NhdGlvbixcbiAgICAnc3RyaW5nJyxcbiAgICBgJHtwYXRofS5sb2NhdGlvbiBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtxKGxvY2F0aW9uKX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcbiAgYXNzZXJ0LnR5cGVvZihcbiAgICBwYXJzZXIsXG4gICAgJ3N0cmluZycsXG4gICAgYCR7cGF0aH0ucGFyc2VyIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3EocGFyc2VyKX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcblxuICBpZiAoc2hhNTEyICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnQudHlwZW9mKFxuICAgICAgc2hhNTEyLFxuICAgICAgJ3N0cmluZycsXG4gICAgICBgJHtwYXRofS5zaGE1MTIgbXVzdCBiZSBhIHN0cmluZywgZ290ICR7cShzaGE1MTIpfSBpbiAke3EodXJsKX1gLFxuICAgICk7XG4gIH1cbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGFzc2VydEV4aXRNb2R1bGUgPSAoYWxsZWdlZE1vZHVsZSwgcGF0aCwgdXJsKSA9PiB7XG4gIGNvbnN0IHsgZXhpdCwgLi4uZXh0cmEgfSA9IGFsbGVnZWRNb2R1bGU7XG4gIGFzc2VydEVtcHR5T2JqZWN0KFxuICAgIGV4dHJhLFxuICAgIGAke3BhdGh9IG11c3Qgbm90IGhhdmUgZXh0cmEgcHJvcGVydGllcywgZ290ICR7cShcbiAgICAgIE9iamVjdC5rZXlzKGV4dHJhKSxcbiAgICApfSBpbiAke3EodXJsKX1gLFxuICApO1xuICBhc3NlcnQudHlwZW9mKFxuICAgIGV4aXQsXG4gICAgJ3N0cmluZycsXG4gICAgYCR7cGF0aH0uZXhpdCBtdXN0IGJlIGEgc3RyaW5nLCBnb3QgJHtxKGV4aXQpfSBpbiAke3EodXJsKX1gLFxuICApO1xufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0TW9kdWxlID0gKGFsbGVnZWRNb2R1bGUsIHBhdGgsIHVybCkgPT4ge1xuICBjb25zdCBtb2R1bGVEZXNjcmlwdG9yID0gT2JqZWN0KGFsbGVnZWRNb2R1bGUpO1xuICBhc3NlcnQoXG4gICAgYWxsZWdlZE1vZHVsZSA9PT0gbW9kdWxlRGVzY3JpcHRvciAmJiAhQXJyYXkuaXNBcnJheShtb2R1bGVEZXNjcmlwdG9yKSxcbiAgICBgJHtwYXRofSBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7YWxsZWdlZE1vZHVsZX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcblxuICBjb25zdCB7IGNvbXBhcnRtZW50LCBtb2R1bGUsIGxvY2F0aW9uLCBwYXJzZXIsIGV4aXQsIGRlZmVycmVkRXJyb3IgfSA9XG4gICAgbW9kdWxlRGVzY3JpcHRvcjtcbiAgaWYgKGNvbXBhcnRtZW50ICE9PSB1bmRlZmluZWQgfHwgbW9kdWxlICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnRDb21wYXJ0bWVudE1vZHVsZShtb2R1bGVEZXNjcmlwdG9yLCBwYXRoLCB1cmwpO1xuICB9IGVsc2UgaWYgKGxvY2F0aW9uICE9PSB1bmRlZmluZWQgfHwgcGFyc2VyICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnRGaWxlTW9kdWxlKG1vZHVsZURlc2NyaXB0b3IsIHBhdGgsIHVybCk7XG4gIH0gZWxzZSBpZiAoZXhpdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0RXhpdE1vZHVsZShtb2R1bGVEZXNjcmlwdG9yLCBwYXRoLCB1cmwpO1xuICB9IGVsc2UgaWYgKGRlZmVycmVkRXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydC50eXBlb2YoXG4gICAgICBkZWZlcnJlZEVycm9yLFxuICAgICAgJ3N0cmluZycsXG4gICAgICBgJHtwYXRofS5kZWZlcnJlZEVycm9yIG11c3QgYmUgYSBzdHJpbmcgY29udGFpaW5nIGFuIGVycm9yIG1lc3NhZ2VgLFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgYXNzZXJ0LmZhaWwoXG4gICAgICBgJHtwYXRofSBpcyBub3QgYSB2YWxpZCBtb2R1bGUgZGVzY3JpcHRvciwgZ290ICR7cShhbGxlZ2VkTW9kdWxlKX0gaW4gJHtxKFxuICAgICAgICB1cmwsXG4gICAgICApfWAsXG4gICAgKTtcbiAgfVxufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0TW9kdWxlcyA9IChhbGxlZ2VkTW9kdWxlcywgcGF0aCwgdXJsKSA9PiB7XG4gIGNvbnN0IG1vZHVsZXMgPSBPYmplY3QoYWxsZWdlZE1vZHVsZXMpO1xuICBhc3NlcnQoXG4gICAgYWxsZWdlZE1vZHVsZXMgPT09IG1vZHVsZXMgfHwgIUFycmF5LmlzQXJyYXkobW9kdWxlcyksXG4gICAgYG1vZHVsZXMgbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke3EoYWxsZWdlZE1vZHVsZXMpfSBpbiAke3EodXJsKX1gLFxuICApO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhtb2R1bGVzKSkge1xuICAgIGFzc2VydE1vZHVsZSh2YWx1ZSwgYCR7cGF0aH0ubW9kdWxlc1ske3Eoa2V5KX1dYCwgdXJsKTtcbiAgfVxufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0UGFyc2VycyA9IChhbGxlZ2VkUGFyc2VycywgcGF0aCwgdXJsKSA9PiB7XG4gIGlmIChhbGxlZ2VkUGFyc2VycyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHBhcnNlcnMgPSBPYmplY3QoYWxsZWdlZFBhcnNlcnMpO1xuICBhc3NlcnQoXG4gICAgYWxsZWdlZFBhcnNlcnMgPT09IHBhcnNlcnMgJiYgIUFycmF5LmlzQXJyYXkocGFyc2VycyksXG4gICAgYCR7cGF0aH0ucGFyc2VycyBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7YWxsZWdlZFBhcnNlcnN9IGluICR7cSh1cmwpfWAsXG4gICk7XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMocGFyc2VycykpIHtcbiAgICBhc3NlcnQudHlwZW9mKFxuICAgICAga2V5LFxuICAgICAgJ3N0cmluZycsXG4gICAgICBgYWxsIGtleXMgb2YgJHtwYXRofS5wYXJzZXJzIG11c3QgYmUgc3RyaW5ncywgZ290ICR7a2V5fSBpbiAke3EodXJsKX1gLFxuICAgICk7XG4gICAgYXNzZXJ0LnR5cGVvZihcbiAgICAgIHZhbHVlLFxuICAgICAgJ3N0cmluZycsXG4gICAgICBgJHtwYXRofS5wYXJzZXJzWyR7cShrZXkpfV0gbXVzdCBiZSBhIHN0cmluZywgZ290ICR7dmFsdWV9IGluICR7cSh1cmwpfWAsXG4gICAgKTtcbiAgfVxufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0U2NvcGUgPSAoYWxsZWdlZFNjb3BlLCBwYXRoLCB1cmwpID0+IHtcbiAgY29uc3Qgc2NvcGUgPSBPYmplY3QoYWxsZWdlZFNjb3BlKTtcbiAgYXNzZXJ0KFxuICAgIGFsbGVnZWRTY29wZSA9PT0gc2NvcGUgJiYgIUFycmF5LmlzQXJyYXkoc2NvcGUpLFxuICAgIGAke3BhdGh9IG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHthbGxlZ2VkU2NvcGV9IGluICR7cSh1cmwpfWAsXG4gICk7XG5cbiAgY29uc3QgeyBjb21wYXJ0bWVudCwgLi4uZXh0cmEgfSA9IHNjb3BlO1xuICBhc3NlcnRFbXB0eU9iamVjdChcbiAgICBleHRyYSxcbiAgICBgJHtwYXRofSBtdXN0IG5vdCBoYXZlIGV4dHJhIHByb3BlcnRpZXMsIGdvdCAke3EoXG4gICAgICBPYmplY3Qua2V5cyhleHRyYSksXG4gICAgKX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcblxuICBhc3NlcnQudHlwZW9mKFxuICAgIGNvbXBhcnRtZW50LFxuICAgICdzdHJpbmcnLFxuICAgIGAke3BhdGh9LmNvbXBhcnRtZW50IG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3EoY29tcGFydG1lbnQpfSBpbiAke3EodXJsKX1gLFxuICApO1xufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0U2NvcGVzID0gKGFsbGVnZWRTY29wZXMsIHBhdGgsIHVybCkgPT4ge1xuICBpZiAoYWxsZWdlZFNjb3BlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHNjb3BlcyA9IE9iamVjdChhbGxlZ2VkU2NvcGVzKTtcbiAgYXNzZXJ0KFxuICAgIGFsbGVnZWRTY29wZXMgPT09IHNjb3BlcyAmJiAhQXJyYXkuaXNBcnJheShzY29wZXMpLFxuICAgIGAke3BhdGh9LnNjb3BlcyBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7cShhbGxlZ2VkU2NvcGVzKX0gaW4gJHtxKHVybCl9YCxcbiAgKTtcblxuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhzY29wZXMpKSB7XG4gICAgYXNzZXJ0LnR5cGVvZihcbiAgICAgIGtleSxcbiAgICAgICdzdHJpbmcnLFxuICAgICAgYGFsbCBrZXlzIG9mICR7cGF0aH0uc2NvcGVzIG11c3QgYmUgc3RyaW5ncywgZ290ICR7a2V5fSBpbiAke3EodXJsKX1gLFxuICAgICk7XG4gICAgYXNzZXJ0U2NvcGUodmFsdWUsIGAke3BhdGh9LnNjb3Blc1ske3Eoa2V5KX1dYCwgdXJsKTtcbiAgfVxufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0VHlwZXMgPSAoYWxsZWdlZFR5cGVzLCBwYXRoLCB1cmwpID0+IHtcbiAgaWYgKGFsbGVnZWRUeXBlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHR5cGVzID0gT2JqZWN0KGFsbGVnZWRUeXBlcyk7XG4gIGFzc2VydChcbiAgICBhbGxlZ2VkVHlwZXMgPT09IHR5cGVzICYmICFBcnJheS5pc0FycmF5KHR5cGVzKSxcbiAgICBgJHtwYXRofS50eXBlcyBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7YWxsZWdlZFR5cGVzfSBpbiAke3EodXJsKX1gLFxuICApO1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKHR5cGVzKSkge1xuICAgIGFzc2VydC50eXBlb2YoXG4gICAgICBrZXksXG4gICAgICAnc3RyaW5nJyxcbiAgICAgIGBhbGwga2V5cyBvZiAke3BhdGh9LnR5cGVzIG11c3QgYmUgc3RyaW5ncywgZ290ICR7a2V5fSBpbiAke3EodXJsKX1gLFxuICAgICk7XG4gICAgYXNzZXJ0LnR5cGVvZihcbiAgICAgIHZhbHVlLFxuICAgICAgJ3N0cmluZycsXG4gICAgICBgJHtwYXRofS50eXBlc1ske3Eoa2V5KX1dIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3ZhbHVlfSBpbiAke3EodXJsKX1gLFxuICAgICk7XG4gIH1cbn07XG5cbi8qXG5cblxuXG4gKi9cblxuY29uc3QgYXNzZXJ0UG9saWN5ID0gKFxuICBhbGxlZ2VkUG9saWN5LFxuICBwYXRoLFxuICB1cmwgPSAnPHVua25vd24tY29tcGFydG1lbnQtbWFwLmpzb24+JyxcbikgPT4ge1xuICBhc3NlcnRQYWNrYWdlUG9saWN5KGFsbGVnZWRQb2xpY3ksIGAke3BhdGh9LnBvbGljeWAsIHVybCk7XG59O1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBhc3NlcnRDb21wYXJ0bWVudCA9IChhbGxlZ2VkQ29tcGFydG1lbnQsIHBhdGgsIHVybCkgPT4ge1xuICBjb25zdCBjb21wYXJ0bWVudCA9IE9iamVjdChhbGxlZ2VkQ29tcGFydG1lbnQpO1xuICBhc3NlcnQoXG4gICAgYWxsZWdlZENvbXBhcnRtZW50ID09PSBjb21wYXJ0bWVudCAmJiAhQXJyYXkuaXNBcnJheShjb21wYXJ0bWVudCksXG4gICAgYCR7cGF0aH0gbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke2FsbGVnZWRDb21wYXJ0bWVudH0gaW4gJHtxKHVybCl9YCxcbiAgKTtcblxuICBjb25zdCB7XG4gICAgbG9jYXRpb24sXG4gICAgbmFtZSxcbiAgICBsYWJlbCxcbiAgICBwYXJzZXJzLFxuICAgIHR5cGVzLFxuICAgIHNjb3BlcyxcbiAgICBtb2R1bGVzLFxuICAgIHBvbGljeSxcbiAgICAuLi5leHRyYVxuICB9ID0gY29tcGFydG1lbnQ7XG5cbiAgYXNzZXJ0RW1wdHlPYmplY3QoXG4gICAgZXh0cmEsXG4gICAgYCR7cGF0aH0gbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzLCBnb3QgJHtxKFxuICAgICAgT2JqZWN0LmtleXMoZXh0cmEpLFxuICAgICl9IGluICR7cSh1cmwpfWAsXG4gICk7XG5cbiAgYXNzZXJ0LnR5cGVvZihcbiAgICBsb2NhdGlvbixcbiAgICAnc3RyaW5nJyxcbiAgICBgJHtwYXRofS5sb2NhdGlvbiBpbiAke3EodXJsKX0gbXVzdCBiZSBzdHJpbmcsIGdvdCAke3EobG9jYXRpb24pfWAsXG4gICk7XG4gIGFzc2VydC50eXBlb2YoXG4gICAgbmFtZSxcbiAgICAnc3RyaW5nJyxcbiAgICBgJHtwYXRofS5uYW1lIGluICR7cSh1cmwpfSBtdXN0IGJlIHN0cmluZywgZ290ICR7cShuYW1lKX1gLFxuICApO1xuICBhc3NlcnQudHlwZW9mKFxuICAgIGxhYmVsLFxuICAgICdzdHJpbmcnLFxuICAgIGAke3BhdGh9LmxhYmVsIGluICR7cSh1cmwpfSBtdXN0IGJlIHN0cmluZywgZ290ICR7cShsYWJlbCl9YCxcbiAgKTtcblxuICBhc3NlcnRNb2R1bGVzKG1vZHVsZXMsIHBhdGgsIHVybCk7XG4gIGFzc2VydFBhcnNlcnMocGFyc2VycywgcGF0aCwgdXJsKTtcbiAgYXNzZXJ0U2NvcGVzKHNjb3BlcywgcGF0aCwgdXJsKTtcbiAgYXNzZXJ0VHlwZXModHlwZXMsIHBhdGgsIHVybCk7XG4gIGFzc2VydFBvbGljeShwb2xpY3ksIHBhdGgsIHVybCk7XG59O1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0Q29tcGFydG1lbnRzID0gKGFsbGVnZWRDb21wYXJ0bWVudHMsIHVybCkgPT4ge1xuICBjb25zdCBjb21wYXJ0bWVudHMgPSBPYmplY3QoYWxsZWdlZENvbXBhcnRtZW50cyk7XG4gIGFzc2VydChcbiAgICBhbGxlZ2VkQ29tcGFydG1lbnRzID09PSBjb21wYXJ0bWVudHMgfHwgIUFycmF5LmlzQXJyYXkoY29tcGFydG1lbnRzKSxcbiAgICBgY29tcGFydG1lbnRzIG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHtxKGFsbGVnZWRDb21wYXJ0bWVudHMpfSBpbiAke3EoXG4gICAgICB1cmwsXG4gICAgKX1gLFxuICApO1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhjb21wYXJ0bWVudHMpKSB7XG4gICAgYXNzZXJ0Q29tcGFydG1lbnQodmFsdWUsIGBjb21wYXJ0bWVudHNbJHtxKGtleSl9XWAsIHVybCk7XG4gIH1cbn07XG5cbi8qXG5cblxuICovXG5jb25zdCBhc3NlcnRFbnRyeSA9IChhbGxlZ2VkRW50cnksIHVybCkgPT4ge1xuICBjb25zdCBlbnRyeSA9IE9iamVjdChhbGxlZ2VkRW50cnkpO1xuICBhc3NlcnQoXG4gICAgYWxsZWdlZEVudHJ5ID09PSBlbnRyeSAmJiAhQXJyYXkuaXNBcnJheShlbnRyeSksXG4gICAgYFwiZW50cnlcIiBtdXN0IGJlIGFuIG9iamVjdCBpbiBjb21wYXJ0bWVudCBtYXAsIGdvdCAke2FsbGVnZWRFbnRyeX0gaW4gJHtxKFxuICAgICAgdXJsLFxuICAgICl9YCxcbiAgKTtcbiAgY29uc3QgeyBjb21wYXJ0bWVudCwgbW9kdWxlLCAuLi5leHRyYSB9ID0gZW50cnk7XG4gIGFzc2VydEVtcHR5T2JqZWN0KFxuICAgIGV4dHJhLFxuICAgIGBcImVudHJ5XCIgbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzIGluIGNvbXBhcnRtZW50IG1hcCwgZ290ICR7cShcbiAgICAgIE9iamVjdC5rZXlzKGV4dHJhKSxcbiAgICApfSBpbiAke3EodXJsKX1gLFxuICApO1xuICBhc3NlcnQudHlwZW9mKFxuICAgIGNvbXBhcnRtZW50LFxuICAgICdzdHJpbmcnLFxuICAgIGBlbnRyeS5jb21wYXJ0bWVudCBtdXN0IGJlIGEgc3RyaW5nIGluIGNvbXBhcnRtZW50IG1hcCwgZ290ICR7Y29tcGFydG1lbnR9IGluICR7cShcbiAgICAgIHVybCxcbiAgICApfWAsXG4gICk7XG4gIGFzc2VydC50eXBlb2YoXG4gICAgbW9kdWxlLFxuICAgICdzdHJpbmcnLFxuICAgIGBlbnRyeS5tb2R1bGUgbXVzdCBiZSBhIHN0cmluZyBpbiBjb21wYXJ0bWVudCBtYXAsIGdvdCAke21vZHVsZX0gaW4gJHtxKFxuICAgICAgdXJsLFxuICAgICl9YCxcbiAgKTtcbn07XG5cbi8qXG5cblxuXG4gKi9cblxuICAgICAgIGNvbnN0IGFzc2VydENvbXBhcnRtZW50TWFwID0gKFxuICBhbGxlZ2VkQ29tcGFydG1lbnRNYXAsXG4gIHVybCA9ICc8dW5rbm93bi1jb21wYXJ0bWVudC1tYXAuanNvbj4nLFxuKSA9PiB7XG4gIGNvbnN0IGNvbXBhcnRtZW50TWFwID0gT2JqZWN0KGFsbGVnZWRDb21wYXJ0bWVudE1hcCk7XG4gIGFzc2VydChcbiAgICBhbGxlZ2VkQ29tcGFydG1lbnRNYXAgPT09IGNvbXBhcnRtZW50TWFwICYmICFBcnJheS5pc0FycmF5KGNvbXBhcnRtZW50TWFwKSxcbiAgICBgQ29tcGFydG1lbnQgbWFwIG11c3QgYmUgYW4gb2JqZWN0LCBnb3QgJHthbGxlZ2VkQ29tcGFydG1lbnRNYXB9IGluICR7cShcbiAgICAgIHVybCxcbiAgICApfWAsXG4gICk7XG4gIGNvbnN0IHtcbiAgICAvL1xuICAgIC8vXG4gICAgdGFnczogY29uZGl0aW9ucyxcbiAgICBlbnRyeSxcbiAgICBjb21wYXJ0bWVudHMsXG4gICAgLi4uZXh0cmFcbiAgfSA9IE9iamVjdChjb21wYXJ0bWVudE1hcCk7XG4gIGFzc2VydEVtcHR5T2JqZWN0KFxuICAgIGV4dHJhLFxuICAgIGBDb21wYXJ0bWVudCBtYXAgbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzLCBnb3QgJHtxKFxuICAgICAgT2JqZWN0LmtleXMoZXh0cmEpLFxuICAgICl9IGluICR7cSh1cmwpfWAsXG4gICk7XG4gIGFzc2VydENvbmRpdGlvbnMoY29uZGl0aW9ucywgdXJsKTtcbiAgYXNzZXJ0RW50cnkoZW50cnksIHVybCk7XG4gIGFzc2VydENvbXBhcnRtZW50cyhjb21wYXJ0bWVudHMsIHVybCk7XG59OyRozY9fb25jZS5hc3NlcnRDb21wYXJ0bWVudE1hcChhc3NlcnRDb21wYXJ0bWVudE1hcCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzdHJpbmdDb21wYXJlIjpbInN0cmluZ0NvbXBhcmUiXSwicGF0aENvbXBhcmUiOlsicGF0aENvbXBhcmUiXSwiYXNzZXJ0Q29tcGFydG1lbnRNYXAiOlsiYXNzZXJ0Q29tcGFydG1lbnRNYXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARdfuCzoDAAA6AwAAMAAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL2V4dGVuc2lvbi5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsicGFyc2VFeHRlbnNpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcGFyc2VFeHRlbnNpb24gPSBsb2NhdGlvbiA9PiB7XG4gIGNvbnN0IGxhc3RTbGFzaCA9IGxvY2F0aW9uLmxhc3RJbmRleE9mKCcvJyk7XG4gIGlmIChsYXN0U2xhc2ggPCAwKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIGNvbnN0IGJhc2UgPSBsb2NhdGlvbi5zbGljZShsYXN0U2xhc2ggKyAxKTtcbiAgY29uc3QgbGFzdERvdCA9IGJhc2UubGFzdEluZGV4T2YoJy4nKTtcbiAgaWYgKGxhc3REb3QgPCAwKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIHJldHVybiBiYXNlLnNsaWNlKGxhc3REb3QgKyAxKTtcbn07JGjNj19vbmNlLnBhcnNlRXh0ZW5zaW9uKHBhcnNlRXh0ZW5zaW9uKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InBhcnNlRXh0ZW5zaW9uIjpbInBhcnNlRXh0ZW5zaW9uIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAi9oOyvLQAAry0AADoAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9pbXBvcnQtYXJjaGl2ZS1saXRlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3ppcCIsIi4vbGluay5qcyIsIi4vanNvbi5qcyIsIi4vcG93ZXJzLmpzIiwiLi9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanMiLCIuL2NvbXBhcnRtZW50LW1hcC5qcyIsIi4vaW1wb3J0LWhvb2suanMiLCIuL3BvbGljeS5qcyJdLCJleHBvcnRzIjpbImltcG9ydEFyY2hpdmUiLCJsb2FkQXJjaGl2ZSIsInBhcnNlQXJjaGl2ZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IFppcFJlYWRlcixsaW5rLHBhcnNlTG9jYXRlZEpzb24sdW5wYWNrUmVhZFBvd2Vycyxqb2luLGFzc2VydENvbXBhcnRtZW50TWFwLGV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIsYXR0ZW51YXRlTW9kdWxlSG9vayxlbmZvcmNlTW9kdWxlUG9saWN5OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vemlwXCIsIFtbXCJaaXBSZWFkZXJcIixbJGjNj19hID0+IChaaXBSZWFkZXIgPSAkaM2PX2EpXV1dXSxbXCIuL2xpbmsuanNcIiwgW1tcImxpbmtcIixbJGjNj19hID0+IChsaW5rID0gJGjNj19hKV1dXV0sW1wiLi9qc29uLmpzXCIsIFtbXCJwYXJzZUxvY2F0ZWRKc29uXCIsWyRozY9fYSA9PiAocGFyc2VMb2NhdGVkSnNvbiA9ICRozY9fYSldXV1dLFtcIi4vcG93ZXJzLmpzXCIsIFtbXCJ1bnBhY2tSZWFkUG93ZXJzXCIsWyRozY9fYSA9PiAodW5wYWNrUmVhZFBvd2VycyA9ICRozY9fYSldXV1dLFtcIi4vbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzXCIsIFtbXCJqb2luXCIsWyRozY9fYSA9PiAoam9pbiA9ICRozY9fYSldXV1dLFtcIi4vY29tcGFydG1lbnQtbWFwLmpzXCIsIFtbXCJhc3NlcnRDb21wYXJ0bWVudE1hcFwiLFskaM2PX2EgPT4gKGFzc2VydENvbXBhcnRtZW50TWFwID0gJGjNj19hKV1dXV0sW1wiLi9pbXBvcnQtaG9vay5qc1wiLCBbW1wiZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlclwiLFskaM2PX2EgPT4gKGV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIgPSAkaM2PX2EpXV1dXSxbXCIuL3BvbGljeS5qc1wiLCBbW1wiYXR0ZW51YXRlTW9kdWxlSG9va1wiLFskaM2PX2EgPT4gKGF0dGVudWF0ZU1vZHVsZUhvb2sgPSAkaM2PX2EpXV0sW1wiZW5mb3JjZU1vZHVsZVBvbGljeVwiLFskaM2PX2EgPT4gKGVuZm9yY2VNb2R1bGVQb2xpY3kgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgRmFpbCwgcXVvdGU6IHEgfSA9IGFzc2VydDtcblxuY29uc3QgdGV4dERlY29kZXIgPSBuZXcgVGV4dERlY29kZXIoKTtcblxuY29uc3QgeyBhc3NpZ24sIGNyZWF0ZSwgZnJlZXplIH0gPSBPYmplY3Q7XG5cbi8qXG5cblxuICovXG5jb25zdCBwb3N0cG9uZUVycm9yVG9FeGVjdXRlID0gZXJyb3JNZXNzYWdlID0+IHtcbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cblxuICBjb25zdCByZWNvcmQgPSBmcmVlemUoe1xuICAgIGltcG9ydHM6IFtdLFxuICAgIGV4cG9ydHM6IFtdLFxuICAgIGV4ZWN1dGU6ICgpID0+IHtcbiAgICAgIHRocm93IEVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgfSxcbiAgfSk7XG5cbiAgcmV0dXJuIHJlY29yZDtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VBcmNoaXZlSW1wb3J0SG9va01ha2VyID0gKFxuICBnZXQsXG4gIGNvbXBhcnRtZW50cyxcbiAgYXJjaGl2ZUxvY2F0aW9uLFxuICBwYXJzZXJGb3JMYW5ndWFnZSxcbiAgY29tcHV0ZVNoYTUxMiA9IHVuZGVmaW5lZCxcbiAgY29tcHV0ZVNvdXJjZUxvY2F0aW9uID0gdW5kZWZpbmVkLFxuICBleGl0TW9kdWxlSW1wb3J0SG9vayA9IHVuZGVmaW5lZCxcbiAgY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uID0gdW5kZWZpbmVkLFxuKSA9PiB7XG4gIC8vXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBtYWtlSW1wb3J0SG9vayA9ICh7XG4gICAgcGFja2FnZUxvY2F0aW9uLFxuICAgIHBhY2thZ2VOYW1lLFxuICAgIGF0dGVudWF0b3JzXG4gICAgLy9cbiAgICAvL1xuICB9KSA9PiB7XG4gICAgLy9cbiAgICBjb25zdCBjb21wYXJ0bWVudERlc2NyaXB0b3IgPSBjb21wYXJ0bWVudHNbcGFja2FnZUxvY2F0aW9uXTtcbiAgICBjb25zdCB7IG1vZHVsZXMgfSA9IGNvbXBhcnRtZW50RGVzY3JpcHRvcjtcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgaW1wb3J0SG9vayA9IGFzeW5jIG1vZHVsZVNwZWNpZmllciA9PiB7XG4gICAgICBhd2FpdCBudWxsO1xuICAgICAgLy9cbiAgICAgIGNvbnN0IG1vZHVsZSA9IG1vZHVsZXNbbW9kdWxlU3BlY2lmaWVyXTtcbiAgICAgIGlmIChtb2R1bGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBpZiAoZXhpdE1vZHVsZUltcG9ydEhvb2spIHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICBlbmZvcmNlTW9kdWxlUG9saWN5KG1vZHVsZVNwZWNpZmllciwgY29tcGFydG1lbnREZXNjcmlwdG9yLCB7XG4gICAgICAgICAgICBleGl0OiB0cnVlLFxuICAgICAgICAgICAgZXJyb3JIaW50OiBgQmxvY2tlZCBpbiBsb2FkaW5nLiAke3EoXG4gICAgICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICAgICl9IHdhcyBub3QgaW4gdGhlIGFyY2hpdmUgYW5kIGFuIGF0dGVtcHQgd2FzIG1hZGUgdG8gbG9hZCBpdCBhcyBhIGJ1aWx0aW5gLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIGNvbnN0IHJlY29yZCA9IGF3YWl0IGV4aXRNb2R1bGVJbXBvcnRIb29rKFxuICAgICAgICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICAgICAgcGFja2FnZUxvY2F0aW9uLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHJlY29yZCkge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgcmVjb3JkOiBhd2FpdCBhdHRlbnVhdGVNb2R1bGVIb29rKFxuICAgICAgICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICAgICAgICByZWNvcmQsXG4gICAgICAgICAgICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9yLnBvbGljeSxcbiAgICAgICAgICAgICAgICBhdHRlbnVhdG9ycyxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgc3BlY2lmaWVyOiBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICByZXR1cm4gcG9zdHBvbmVFcnJvclRvRXhlY3V0ZShcbiAgICAgICAgICAgICAgYENhbm5vdCBmaW5kIGV4dGVybmFsIG1vZHVsZSAke3EobW9kdWxlU3BlY2lmaWVyKX0gaW4gcGFja2FnZSAke3EoXG4gICAgICAgICAgICAgICAgcGFja2FnZUxvY2F0aW9uLFxuICAgICAgICAgICAgICApfSBpbiBhcmNoaXZlICR7cShhcmNoaXZlTG9jYXRpb24pfWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IGZpbmQgbW9kdWxlICR7cShtb2R1bGVTcGVjaWZpZXIpfSBpbiBwYWNrYWdlICR7cShcbiAgICAgICAgICAgIHBhY2thZ2VMb2NhdGlvbixcbiAgICAgICAgICApfSBpbiBhcmNoaXZlICR7cShhcmNoaXZlTG9jYXRpb24pfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBpZiAobW9kdWxlLmRlZmVycmVkRXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gcG9zdHBvbmVFcnJvclRvRXhlY3V0ZShtb2R1bGUuZGVmZXJyZWRFcnJvcik7XG4gICAgICB9XG4gICAgICBpZiAobW9kdWxlLnBhcnNlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgIGBDYW5ub3QgcGFyc2UgbW9kdWxlICR7cShtb2R1bGVTcGVjaWZpZXIpfSBpbiBwYWNrYWdlICR7cShcbiAgICAgICAgICAgIHBhY2thZ2VMb2NhdGlvbixcbiAgICAgICAgICApfSBpbiBhcmNoaXZlICR7cShhcmNoaXZlTG9jYXRpb24pfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCBwYXJzZXIgPSBwYXJzZXJGb3JMYW5ndWFnZVttb2R1bGUucGFyc2VyXTtcbiAgICAgIGlmIChwYXJzZXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IHBhcnNlICR7cShtb2R1bGUucGFyc2VyKX0gbW9kdWxlICR7cShcbiAgICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICApfSBpbiBwYWNrYWdlICR7cShwYWNrYWdlTG9jYXRpb24pfSBpbiBhcmNoaXZlICR7cShhcmNoaXZlTG9jYXRpb24pfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjb25zdCB7IHBhcnNlIH0gPSBwYXJzZXI7XG4gICAgICBjb25zdCBtb2R1bGVMb2NhdGlvbiA9IGAke3BhY2thZ2VMb2NhdGlvbn0vJHttb2R1bGUubG9jYXRpb259YDtcbiAgICAgIGNvbnN0IG1vZHVsZUJ5dGVzID0gZ2V0KG1vZHVsZUxvY2F0aW9uKTtcblxuICAgICAgaWYgKGNvbXB1dGVTaGE1MTIgIT09IHVuZGVmaW5lZCAmJiBtb2R1bGUuc2hhNTEyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3Qgc2hhNTEyID0gY29tcHV0ZVNoYTUxMihtb2R1bGVCeXRlcyk7XG4gICAgICAgIGlmIChzaGE1MTIgIT09IG1vZHVsZS5zaGE1MTIpIHtcbiAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgIGBNb2R1bGUgJHtxKG1vZHVsZS5sb2NhdGlvbil9IG9mIHBhY2thZ2UgJHtxKFxuICAgICAgICAgICAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICAgICApfSBpbiBhcmNoaXZlICR7cShcbiAgICAgICAgICAgICAgYXJjaGl2ZUxvY2F0aW9uLFxuICAgICAgICAgICAgKX0gZmFpbGVkIGEgU0hBLTUxMiBpbnRlZ3JpdHkgY2hlY2tgLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IHNvdXJjZUxvY2F0aW9uID0gYGZpbGU6Ly8vJHttb2R1bGVMb2NhdGlvbn1gO1xuICAgICAgaWYgKHBhY2thZ2VOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgYmFzZSA9IHBhY2thZ2VOYW1lLnNwbGl0KCcvJykuc2xpY2UoLTEpLmpvaW4oJy8nKTtcbiAgICAgICAgc291cmNlTG9jYXRpb24gPSBgLi4uLyR7am9pbihiYXNlLCBtb2R1bGVTcGVjaWZpZXIpfWA7XG4gICAgICB9XG4gICAgICBpZiAoY29tcHV0ZVNvdXJjZUxvY2F0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc291cmNlTG9jYXRpb24gPVxuICAgICAgICAgIGNvbXB1dGVTb3VyY2VMb2NhdGlvbihwYWNrYWdlTG9jYXRpb24sIG1vZHVsZVNwZWNpZmllcikgfHxcbiAgICAgICAgICBzb3VyY2VMb2NhdGlvbjtcbiAgICAgIH1cblxuICAgICAgbGV0IHNvdXJjZU1hcFVybDtcbiAgICAgIGlmIChcbiAgICAgICAgY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgbW9kdWxlLnNoYTUxMiAhPT0gdW5kZWZpbmVkXG4gICAgICApIHtcbiAgICAgICAgc291cmNlTWFwVXJsID0gY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uKHtcbiAgICAgICAgICBjb21wYXJ0bWVudDogcGFja2FnZUxvY2F0aW9uLFxuICAgICAgICAgIG1vZHVsZTogbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICAgIGxvY2F0aW9uOiBzb3VyY2VMb2NhdGlvbixcbiAgICAgICAgICBzaGE1MTI6IG1vZHVsZS5zaGE1MTIsXG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICAvL1xuICAgICAgY29uc3QgeyByZWNvcmQgfSA9IGF3YWl0IHBhcnNlKFxuICAgICAgICBtb2R1bGVCeXRlcyxcbiAgICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICBzb3VyY2VMb2NhdGlvbixcbiAgICAgICAgcGFja2FnZUxvY2F0aW9uLFxuICAgICAgICB7XG4gICAgICAgICAgc291cmNlTWFwVXJsLFxuICAgICAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcixcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICByZXR1cm4geyByZWNvcmQsIHNwZWNpZmllcjogbW9kdWxlU3BlY2lmaWVyIH07XG4gICAgfTtcbiAgICByZXR1cm4gaW1wb3J0SG9vaztcbiAgfTtcbiAgcmV0dXJuIG1ha2VJbXBvcnRIb29rO1xufTtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcGFyc2VBcmNoaXZlID0gYXN5bmMgKFxuICBhcmNoaXZlQnl0ZXMsXG4gIGFyY2hpdmVMb2NhdGlvbiA9ICc8dW5rbm93bj4nLFxuICBvcHRpb25zID0ge30sXG4pID0+IHtcbiAgYXdhaXQgbnVsbDtcbiAgY29uc3Qge1xuICAgIGNvbXB1dGVTaGE1MTIgPSB1bmRlZmluZWQsXG4gICAgZXhwZWN0ZWRTaGE1MTIgPSB1bmRlZmluZWQsXG4gICAgY29tcHV0ZVNvdXJjZUxvY2F0aW9uID0gdW5kZWZpbmVkLFxuICAgIGNvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbiA9IHVuZGVmaW5lZCxcbiAgICBDb21wYXJ0bWVudDogQ29tcGFydG1lbnRQYXJzZU9wdGlvbiA9IENvbXBhcnRtZW50LFxuICAgIG1vZHVsZXMgPSB1bmRlZmluZWQsXG4gICAgaW1wb3J0SG9vazogZXhpdE1vZHVsZUltcG9ydEhvb2sgPSB1bmRlZmluZWQsXG4gICAgcGFyc2VyRm9yTGFuZ3VhZ2U6IHBhcnNlckZvckxhbmd1YWdlT3B0aW9uID0ge30sXG4gICAgX19uYXRpdmVfXyA9IGZhbHNlLFxuICB9ID0gb3B0aW9ucztcblxuICBjb25zdCBwYXJzZXJGb3JMYW5ndWFnZSA9IGZyZWV6ZShcbiAgICBhc3NpZ24oY3JlYXRlKG51bGwpLCBwYXJzZXJGb3JMYW5ndWFnZU9wdGlvbiksXG4gICk7XG5cbiAgY29uc3QgYXJjaGl2ZSA9IG5ldyBaaXBSZWFkZXIoYXJjaGl2ZUJ5dGVzLCB7IG5hbWU6IGFyY2hpdmVMb2NhdGlvbiB9KTtcblxuICAvL1xuICBjb25zdCB1bnNlZW4gPSBuZXcgU2V0KGFyY2hpdmUuZmlsZXMua2V5cygpKTtcbiAgdW5zZWVuLnNpemUgPj0gMiB8fFxuICAgIEZhaWxgQXJjaGl2ZSBmYWlsZWQgc2FuaXR5IGNoZWNrOiBzaG91bGQgY29udGFpbiBhdCBsZWFzdCBhIGNvbXBhcnRtZW50IG1hcCBmaWxlIGFuZCBvbmUgbW9kdWxlIGZpbGUgaW4gJHtxKFxuICAgICAgYXJjaGl2ZUxvY2F0aW9uLFxuICAgICl9YDtcblxuICAvKlxuXG4gICAqL1xuICBjb25zdCBnZXQgPSBwYXRoID0+IHtcbiAgICB1bnNlZW4uZGVsZXRlKHBhdGgpO1xuICAgIHJldHVybiBhcmNoaXZlLnJlYWQocGF0aCk7XG4gIH07XG5cbiAgY29uc3QgY29tcGFydG1lbnRNYXBCeXRlcyA9IGdldCgnY29tcGFydG1lbnQtbWFwLmpzb24nKTtcblxuICBsZXQgc2hhNTEyO1xuICBpZiAoY29tcHV0ZVNoYTUxMiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgc2hhNTEyID0gY29tcHV0ZVNoYTUxMihjb21wYXJ0bWVudE1hcEJ5dGVzKTtcbiAgfVxuICBpZiAoZXhwZWN0ZWRTaGE1MTIgIT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChzaGE1MTIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIGBDYW5ub3QgdmVyaWZ5IGV4cGVjdGVkU2hhNTEyIHdpdGhvdXQgYWxzbyBwcm92aWRpbmcgY29tcHV0ZVNoYTUxMiwgZm9yIGFyY2hpdmUgJHthcmNoaXZlTG9jYXRpb259YCxcbiAgICAgICk7XG4gICAgfVxuICAgIGlmIChzaGE1MTIgIT09IGV4cGVjdGVkU2hhNTEyKSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgYEFyY2hpdmUgY29tcGFydG1lbnQgbWFwIGZhaWxlZCBhIFNIQS01MTIgaW50ZWdyaXR5IGNoZWNrLCBleHBlY3RlZCAke2V4cGVjdGVkU2hhNTEyfSwgZ290ICR7c2hhNTEyfSwgZm9yIGFyY2hpdmUgJHthcmNoaXZlTG9jYXRpb259YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG4gIGNvbnN0IGNvbXBhcnRtZW50TWFwVGV4dCA9IHRleHREZWNvZGVyLmRlY29kZShjb21wYXJ0bWVudE1hcEJ5dGVzKTtcbiAgY29uc3QgY29tcGFydG1lbnRNYXAgPSBwYXJzZUxvY2F0ZWRKc29uKFxuICAgIGNvbXBhcnRtZW50TWFwVGV4dCxcbiAgICAnY29tcGFydG1lbnQtbWFwLmpzb24nLFxuICApO1xuICBhc3NlcnRDb21wYXJ0bWVudE1hcChjb21wYXJ0bWVudE1hcCwgYXJjaGl2ZUxvY2F0aW9uKTtcblxuICBjb25zdCB7XG4gICAgY29tcGFydG1lbnRzLFxuICAgIGVudHJ5OiB7IG1vZHVsZTogZW50cnlNb2R1bGVTcGVjaWZpZXIsIGNvbXBhcnRtZW50OiBlbnRyeUNvbXBhcnRtZW50TmFtZSB9LFxuICB9ID0gY29tcGFydG1lbnRNYXA7XG5cbiAgY29uc3QgY29tcGFydG1lbnRFeGl0TW9kdWxlSW1wb3J0SG9vayA9IGV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIoe1xuICAgIG1vZHVsZXMsXG4gICAgZXhpdE1vZHVsZUltcG9ydEhvb2ssXG4gICAgZW50cnlDb21wYXJ0bWVudE5hbWUsXG4gIH0pO1xuXG4gIC8vXG4gIC8vXG4gIC8vXG4gIGlmIChjb21wdXRlU2hhNTEyICE9PSB1bmRlZmluZWQpIHtcbiAgICBjb25zdCBtYWtlSW1wb3J0SG9vayA9IG1ha2VBcmNoaXZlSW1wb3J0SG9va01ha2VyKFxuICAgICAgZ2V0LFxuICAgICAgY29tcGFydG1lbnRzLFxuICAgICAgYXJjaGl2ZUxvY2F0aW9uLFxuICAgICAgcGFyc2VyRm9yTGFuZ3VhZ2UsXG4gICAgICBjb21wdXRlU2hhNTEyLFxuICAgICAgY29tcHV0ZVNvdXJjZUxvY2F0aW9uLFxuICAgICAgY29tcGFydG1lbnRFeGl0TW9kdWxlSW1wb3J0SG9vayxcbiAgICAgIGNvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbixcbiAgICApO1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgY29uc3QgeyBjb21wYXJ0bWVudCwgcGVuZGluZ0pvYnNQcm9taXNlIH0gPSBsaW5rKGNvbXBhcnRtZW50TWFwLCB7XG4gICAgICBtYWtlSW1wb3J0SG9vayxcbiAgICAgIHBhcnNlckZvckxhbmd1YWdlLFxuICAgICAgbW9kdWxlczogT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgICBPYmplY3Qua2V5cyhtb2R1bGVzIHx8IHt9KS5tYXAoc3BlY2lmaWVyID0+IHtcbiAgICAgICAgICByZXR1cm4gW3NwZWNpZmllciwgeyBuYW1lc3BhY2U6IHt9IH1dO1xuICAgICAgICB9KSxcbiAgICAgICksXG4gICAgICBDb21wYXJ0bWVudDogQ29tcGFydG1lbnRQYXJzZU9wdGlvbixcbiAgICAgIF9fbmF0aXZlX18sXG4gICAgfSk7XG5cbiAgICBhd2FpdCBwZW5kaW5nSm9ic1Byb21pc2U7XG5cbiAgICBhd2FpdCBjb21wYXJ0bWVudC5sb2FkKGVudHJ5TW9kdWxlU3BlY2lmaWVyKTtcbiAgICB1bnNlZW4uc2l6ZSA9PT0gMCB8fFxuICAgICAgRmFpbGBBcmNoaXZlIGNvbnRhaW5zIGV4dHJhbmVvdXMgZmlsZXM6ICR7cShbLi4udW5zZWVuXSl9IGluICR7cShcbiAgICAgICAgYXJjaGl2ZUxvY2F0aW9uLFxuICAgICAgKX1gO1xuICB9XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGV4ZWN1dGUgPSBhc3luYyBvcHRpb25zID0+IHtcbiAgICBjb25zdCB7XG4gICAgICBnbG9iYWxzLFxuICAgICAgbW9kdWxlcyxcbiAgICAgIHRyYW5zZm9ybXMsXG4gICAgICBfX3NoaW1UcmFuc2Zvcm1zX18sXG4gICAgICBDb21wYXJ0bWVudDogQ29tcGFydG1lbnRPcHRpb24gPSBDb21wYXJ0bWVudFBhcnNlT3B0aW9uLFxuICAgICAgX19uYXRpdmVfXyxcbiAgICAgIGltcG9ydEhvb2s6IGV4aXRNb2R1bGVJbXBvcnRIb29rLFxuICAgIH0gPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgY29uc3QgY29tcGFydG1lbnRFeGl0TW9kdWxlSW1wb3J0SG9vayA9IGV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIoe1xuICAgICAgbW9kdWxlcyxcbiAgICAgIGV4aXRNb2R1bGVJbXBvcnRIb29rLFxuICAgICAgZW50cnlDb21wYXJ0bWVudE5hbWUsXG4gICAgfSk7XG4gICAgY29uc3QgbWFrZUltcG9ydEhvb2sgPSBtYWtlQXJjaGl2ZUltcG9ydEhvb2tNYWtlcihcbiAgICAgIGdldCxcbiAgICAgIGNvbXBhcnRtZW50cyxcbiAgICAgIGFyY2hpdmVMb2NhdGlvbixcbiAgICAgIHBhcnNlckZvckxhbmd1YWdlLFxuICAgICAgY29tcHV0ZVNoYTUxMixcbiAgICAgIGNvbXB1dGVTb3VyY2VMb2NhdGlvbixcbiAgICAgIGNvbXBhcnRtZW50RXhpdE1vZHVsZUltcG9ydEhvb2ssXG4gICAgICBjb21wdXRlU291cmNlTWFwTG9jYXRpb24sXG4gICAgKTtcbiAgICBjb25zdCB7IGNvbXBhcnRtZW50LCBwZW5kaW5nSm9ic1Byb21pc2UgfSA9IGxpbmsoY29tcGFydG1lbnRNYXAsIHtcbiAgICAgIG1ha2VJbXBvcnRIb29rLFxuICAgICAgcGFyc2VyRm9yTGFuZ3VhZ2UsXG4gICAgICBnbG9iYWxzLFxuICAgICAgbW9kdWxlcyxcbiAgICAgIHRyYW5zZm9ybXMsXG4gICAgICBfX3NoaW1UcmFuc2Zvcm1zX18sXG4gICAgICBDb21wYXJ0bWVudDogQ29tcGFydG1lbnRPcHRpb24sXG4gICAgICBfX25hdGl2ZV9fLFxuICAgIH0pO1xuXG4gICAgYXdhaXQgcGVuZGluZ0pvYnNQcm9taXNlO1xuXG4gICAgLy9cbiAgICByZXR1cm4gY29tcGFydG1lbnRbJ2ltcG9ydCddKGVudHJ5TW9kdWxlU3BlY2lmaWVyKTtcbiAgfTtcblxuICByZXR1cm4geyBpbXBvcnQ6IGV4ZWN1dGUsIHNoYTUxMiB9O1xufTtcblxuLypcblxuXG5cblxuICovJGjNj19vbmNlLnBhcnNlQXJjaGl2ZShwYXJzZUFyY2hpdmUpO1xuICAgICAgIGNvbnN0IGxvYWRBcmNoaXZlID0gYXN5bmMgKFxuICByZWFkUG93ZXJzLFxuICBhcmNoaXZlTG9jYXRpb24sXG4gIG9wdGlvbnMgPSB7fSxcbikgPT4ge1xuICBjb25zdCB7IHJlYWQsIGNvbXB1dGVTaGE1MTIgfSA9IHVucGFja1JlYWRQb3dlcnMocmVhZFBvd2Vycyk7XG4gIGNvbnN0IHtcbiAgICBleHBlY3RlZFNoYTUxMixcbiAgICBjb21wdXRlU291cmNlTG9jYXRpb24sXG4gICAgbW9kdWxlcyxcbiAgICBjb21wdXRlU291cmNlTWFwTG9jYXRpb24sXG4gICAgcGFyc2VyRm9yTGFuZ3VhZ2UsXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBhcmNoaXZlQnl0ZXMgPSBhd2FpdCByZWFkKGFyY2hpdmVMb2NhdGlvbik7XG4gIHJldHVybiBwYXJzZUFyY2hpdmUoYXJjaGl2ZUJ5dGVzLCBhcmNoaXZlTG9jYXRpb24sIHtcbiAgICBjb21wdXRlU2hhNTEyLFxuICAgIGV4cGVjdGVkU2hhNTEyLFxuICAgIGNvbXB1dGVTb3VyY2VMb2NhdGlvbixcbiAgICBtb2R1bGVzLFxuICAgIGNvbXB1dGVTb3VyY2VNYXBMb2NhdGlvbixcbiAgICBwYXJzZXJGb3JMYW5ndWFnZSxcbiAgfSk7XG59O1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UubG9hZEFyY2hpdmUobG9hZEFyY2hpdmUpO1xuICAgICAgIGNvbnN0IGltcG9ydEFyY2hpdmUgPSBhc3luYyAocmVhZFBvd2VycywgYXJjaGl2ZUxvY2F0aW9uLCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IGFyY2hpdmUgPSBhd2FpdCBsb2FkQXJjaGl2ZShyZWFkUG93ZXJzLCBhcmNoaXZlTG9jYXRpb24sIG9wdGlvbnMpO1xuICByZXR1cm4gYXJjaGl2ZS5pbXBvcnQob3B0aW9ucyk7XG59OyRozY9fb25jZS5pbXBvcnRBcmNoaXZlKGltcG9ydEFyY2hpdmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicGFyc2VBcmNoaXZlIjpbInBhcnNlQXJjaGl2ZSJdLCJsb2FkQXJjaGl2ZSI6WyJsb2FkQXJjaGl2ZSJdLCJpbXBvcnRBcmNoaXZlIjpbImltcG9ydEFyY2hpdmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAquzY4zYFAAA2BQAAPQAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL2ltcG9ydC1hcmNoaXZlLXBhcnNlcnMuanN7ImltcG9ydHMiOlsiLi9wYXJzZS1wcmUtY2pzLmpzIiwiLi9wYXJzZS1qc29uLmpzIiwiLi9wYXJzZS10ZXh0LmpzIiwiLi9wYXJzZS1ieXRlcy5qcyIsIi4vcGFyc2UtcHJlLW1qcy5qcyJdLCJleHBvcnRzIjpbImRlZmF1bHRQYXJzZXJGb3JMYW5ndWFnZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHBhcnNlclByZUNqcyxwYXJzZXJKc29uLHBhcnNlclRleHQscGFyc2VyQnl0ZXMscGFyc2VyUHJlTWpzOyRozY9faW1wb3J0cyhbW1wiLi9wYXJzZS1wcmUtY2pzLmpzXCIsIFtbXCJkZWZhdWx0XCIsWyRozY9fYSA9PiAocGFyc2VyUHJlQ2pzID0gJGjNj19hKV1dXV0sW1wiLi9wYXJzZS1qc29uLmpzXCIsIFtbXCJkZWZhdWx0XCIsWyRozY9fYSA9PiAocGFyc2VySnNvbiA9ICRozY9fYSldXV1dLFtcIi4vcGFyc2UtdGV4dC5qc1wiLCBbW1wiZGVmYXVsdFwiLFskaM2PX2EgPT4gKHBhcnNlclRleHQgPSAkaM2PX2EpXV1dXSxbXCIuL3BhcnNlLWJ5dGVzLmpzXCIsIFtbXCJkZWZhdWx0XCIsWyRozY9fYSA9PiAocGFyc2VyQnl0ZXMgPSAkaM2PX2EpXV1dXSxbXCIuL3BhcnNlLXByZS1tanMuanNcIiwgW1tcImRlZmF1bHRcIixbJGjNj19hID0+IChwYXJzZXJQcmVNanMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgZGVmYXVsdFBhcnNlckZvckxhbmd1YWdlID0gT2JqZWN0LmZyZWV6ZShcbiAgLyogICAgICAgICAgICAgICAgKi8gKHtcbiAgICAncHJlLWNqcy1qc29uJzogcGFyc2VyUHJlQ2pzLFxuICAgICdwcmUtbWpzLWpzb24nOiBwYXJzZXJQcmVNanMsXG4gICAganNvbjogcGFyc2VySnNvbixcbiAgICB0ZXh0OiBwYXJzZXJUZXh0LFxuICAgIGJ5dGVzOiBwYXJzZXJCeXRlcyxcbiAgfSksXG4pOyRozY9fb25jZS5kZWZhdWx0UGFyc2VyRm9yTGFuZ3VhZ2UoZGVmYXVsdFBhcnNlckZvckxhbmd1YWdlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmF1bHRQYXJzZXJGb3JMYW5ndWFnZSI6WyJkZWZhdWx0UGFyc2VyRm9yTGFuZ3VhZ2UiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAlxQl1NwIAADcCAAANQAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL2ltcG9ydC1hcmNoaXZlLmpzeyJpbXBvcnRzIjpbIi4vaW1wb3J0LWFyY2hpdmUtcGFyc2Vycy5qcyIsIi4vaW1wb3J0LWFyY2hpdmUtbGl0ZS5qcyJdLCJleHBvcnRzIjpbImltcG9ydEFyY2hpdmUiLCJsb2FkQXJjaGl2ZSIsInBhcnNlQXJjaGl2ZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGRlZmF1bHRQYXJzZXJGb3JMYW5ndWFnZSxwYXJzZUFyY2hpdmVMaXRlLGxvYWRBcmNoaXZlTGl0ZSxpbXBvcnRBcmNoaXZlTGl0ZTskaM2PX2ltcG9ydHMoW1tcIi4vaW1wb3J0LWFyY2hpdmUtcGFyc2Vycy5qc1wiLCBbW1wiZGVmYXVsdFBhcnNlckZvckxhbmd1YWdlXCIsWyRozY9fYSA9PiAoZGVmYXVsdFBhcnNlckZvckxhbmd1YWdlID0gJGjNj19hKV1dXV0sW1wiLi9pbXBvcnQtYXJjaGl2ZS1saXRlLmpzXCIsIFtbXCJwYXJzZUFyY2hpdmVcIixbJGjNj19hID0+IChwYXJzZUFyY2hpdmVMaXRlID0gJGjNj19hKV1dLFtcImxvYWRBcmNoaXZlXCIsWyRozY9fYSA9PiAobG9hZEFyY2hpdmVMaXRlID0gJGjNj19hKV1dLFtcImltcG9ydEFyY2hpdmVcIixbJGjNj19hID0+IChpbXBvcnRBcmNoaXZlTGl0ZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB7IGFzc2lnbiwgY3JlYXRlLCBmcmVlemUgfSA9IE9iamVjdDtcblxuLy9cbi8vXG4vL1xuLy9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzaWduUGFyc2VyRm9yTGFuZ3VhZ2UgPSAob3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHsgcGFyc2VyRm9yTGFuZ3VhZ2U6IHBhcnNlckZvckxhbmd1YWdlT3B0aW9uLCAuLi5yZXN0IH0gPSBvcHRpb25zO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBwYXJzZXJGb3JMYW5ndWFnZSA9IGZyZWV6ZShcbiAgICBhc3NpZ24oY3JlYXRlKG51bGwpLCBkZWZhdWx0UGFyc2VyRm9yTGFuZ3VhZ2UsIHBhcnNlckZvckxhbmd1YWdlT3B0aW9uKSxcbiAgKTtcbiAgcmV0dXJuIHsgLi4ucmVzdCwgcGFyc2VyRm9yTGFuZ3VhZ2UgfTtcbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHBhcnNlQXJjaGl2ZSA9IGFzeW5jIChcbiAgYXJjaGl2ZUJ5dGVzLFxuICBhcmNoaXZlTG9jYXRpb24gPSAnPHVua25vd24+JyxcbiAgb3B0aW9ucyA9IHt9LFxuKSA9PlxuICBwYXJzZUFyY2hpdmVMaXRlKFxuICAgIGFyY2hpdmVCeXRlcyxcbiAgICBhcmNoaXZlTG9jYXRpb24sXG4gICAgYXNzaWduUGFyc2VyRm9yTGFuZ3VhZ2Uob3B0aW9ucyksXG4gICk7XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS5wYXJzZUFyY2hpdmUocGFyc2VBcmNoaXZlKTtcbiAgICAgICBjb25zdCBsb2FkQXJjaGl2ZSA9IGFzeW5jIChyZWFkUG93ZXJzLCBhcmNoaXZlTG9jYXRpb24sIG9wdGlvbnMpID0+XG4gIGxvYWRBcmNoaXZlTGl0ZShcbiAgICByZWFkUG93ZXJzLFxuICAgIGFyY2hpdmVMb2NhdGlvbixcbiAgICBhc3NpZ25QYXJzZXJGb3JMYW5ndWFnZShvcHRpb25zKSxcbiAgKTtcblxuLypcblxuXG5cblxuICovJGjNj19vbmNlLmxvYWRBcmNoaXZlKGxvYWRBcmNoaXZlKTtcbiAgICAgICBjb25zdCBpbXBvcnRBcmNoaXZlID0gYXN5bmMgKHJlYWRQb3dlcnMsIGFyY2hpdmVMb2NhdGlvbiwgb3B0aW9ucykgPT5cbiAgaW1wb3J0QXJjaGl2ZUxpdGUoXG4gICAgcmVhZFBvd2VycyxcbiAgICBhcmNoaXZlTG9jYXRpb24sXG4gICAgYXNzaWduUGFyc2VyRm9yTGFuZ3VhZ2Uob3B0aW9ucyksXG4gICk7JGjNj19vbmNlLmltcG9ydEFyY2hpdmUoaW1wb3J0QXJjaGl2ZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwYXJzZUFyY2hpdmUiOlsicGFyc2VBcmNoaXZlIl0sImxvYWRBcmNoaXZlIjpbImxvYWRBcmNoaXZlIl0sImltcG9ydEFyY2hpdmUiOlsiaW1wb3J0QXJjaGl2ZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACKAUN4X0kAAF9JAAAyAAAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9zcmMvaW1wb3J0LWhvb2suanN7ImltcG9ydHMiOlsiQGVuZG8vdHJhbXBvbGluZSIsIi4vbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzIiwiLi9wb2xpY3kuanMiLCIuL3Bvd2Vycy5qcyJdLCJleHBvcnRzIjpbImV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIiLCJtYWtlSW1wb3J0SG9va01ha2VyIiwibWFrZUltcG9ydE5vd0hvb2tNYWtlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzeW5jVHJhbXBvbGluZSxzeW5jVHJhbXBvbGluZSxyZXNvbHZlLGF0dGVudWF0ZU1vZHVsZUhvb2ssQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQsZW5mb3JjZU1vZHVsZVBvbGljeSx1bnBhY2tSZWFkUG93ZXJzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vdHJhbXBvbGluZVwiLCBbW1wiYXN5bmNUcmFtcG9saW5lXCIsWyRozY9fYSA9PiAoYXN5bmNUcmFtcG9saW5lID0gJGjNj19hKV1dLFtcInN5bmNUcmFtcG9saW5lXCIsWyRozY9fYSA9PiAoc3luY1RyYW1wb2xpbmUgPSAkaM2PX2EpXV1dXSxbXCIuL25vZGUtbW9kdWxlLXNwZWNpZmllci5qc1wiLCBbW1wicmVzb2x2ZVwiLFskaM2PX2EgPT4gKHJlc29sdmUgPSAkaM2PX2EpXV1dXSxbXCIuL3BvbGljeS5qc1wiLCBbW1wiYXR0ZW51YXRlTW9kdWxlSG9va1wiLFskaM2PX2EgPT4gKGF0dGVudWF0ZU1vZHVsZUhvb2sgPSAkaM2PX2EpXV0sW1wiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlRcIixbJGjNj19hID0+IChBVFRFTlVBVE9SU19DT01QQVJUTUVOVCA9ICRozY9fYSldXSxbXCJlbmZvcmNlTW9kdWxlUG9saWN5XCIsWyRozY9fYSA9PiAoZW5mb3JjZU1vZHVsZVBvbGljeSA9ICRozY9fYSldXV1dLFtcIi4vcG93ZXJzLmpzXCIsIFtbXCJ1bnBhY2tSZWFkUG93ZXJzXCIsWyRozY9fYSA9PiAodW5wYWNrUmVhZFBvd2VycyA9ICRozY9fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1ha2VJbXBvcnROb3dIb29rTWFrZXIsJ25hbWUnLHt2YWx1ZTpcIm1ha2VJbXBvcnROb3dIb29rTWFrZXJcIn0pOyRozY9fb25jZS5tYWtlSW1wb3J0Tm93SG9va01ha2VyKG1ha2VJbXBvcnROb3dIb29rTWFrZXIpO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8vXG5jb25zdCBxID0gSlNPTi5zdHJpbmdpZnk7XG5cbmNvbnN0IHsgYXBwbHkgfSA9IFJlZmxlY3Q7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgZnJlZXplID0gT2JqZWN0LmZyZWV6ZTtcblxuY29uc3QgeyBlbnRyaWVzLCBrZXlzLCBhc3NpZ24sIGNyZWF0ZSB9ID0gT2JqZWN0O1xuXG5jb25zdCB7IGhhc093blByb3BlcnR5IH0gPSBPYmplY3QucHJvdG90eXBlO1xuLypcblxuXG4gKi9cbmNvbnN0IGhhcyA9IChoYXlzdGFjaywgbmVlZGxlKSA9PiBhcHBseShoYXNPd25Qcm9wZXJ0eSwgaGF5c3RhY2ssIFtuZWVkbGVdKTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgcmVzb2x2ZUxvY2F0aW9uID0gKHJlbCwgYWJzKSA9PiBuZXcgVVJMKHJlbCwgYWJzKS50b1N0cmluZygpO1xuXG4vL1xuZnVuY3Rpb24gZ2V0SW1wb3J0c0Zyb21SZWNvcmQocmVjb3JkKSB7XG4gIHJldHVybiAoaGFzKHJlY29yZCwgJ3JlY29yZCcpID8gcmVjb3JkLnJlY29yZC5pbXBvcnRzIDogcmVjb3JkLmltcG9ydHMpIHx8IFtdO1xufVxuXG4vL1xuLy9cbmNvbnN0IG5vZGVqc0NvbnZlbnRpb25TZWFyY2hTdWZmaXhlcyA9IFtcbiAgLy9cbiAgJy5qcycsXG4gICcuanNvbicsXG4gICcubm9kZScsXG4gIC8vXG4gICcvaW5kZXguanMnLFxuICAnL2luZGV4Lmpzb24nLFxuICAnL2luZGV4Lm5vZGUnLFxuXTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuY29uc3QgZmluZFJlZGlyZWN0ID0gKHtcbiAgY29tcGFydG1lbnREZXNjcmlwdG9yLFxuICBjb21wYXJ0bWVudERlc2NyaXB0b3JzLFxuICBjb21wYXJ0bWVudHMsXG4gIGFic29sdXRlTW9kdWxlU3BlY2lmaWVyLFxuICBwYWNrYWdlTG9jYXRpb24sXG59KSA9PiB7XG4gIGNvbnN0IG1vZHVsZVNwZWNpZmllckxvY2F0aW9uID0gbmV3IFVSTChcbiAgICBhYnNvbHV0ZU1vZHVsZVNwZWNpZmllcixcbiAgICBwYWNrYWdlTG9jYXRpb24sXG4gICkuaHJlZjtcblxuICAvL1xuICBsZXQgc29tZUxvY2F0aW9uID0gbmV3IFVSTCgnLi8nLCBtb2R1bGVTcGVjaWZpZXJMb2NhdGlvbikuaHJlZjtcblxuICAvL1xuICAvL1xuXG4gIC8vXG4gIGZvciAoOzspIHtcbiAgICBpZiAoXG4gICAgICBzb21lTG9jYXRpb24gIT09IEFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UICYmXG4gICAgICBzb21lTG9jYXRpb24gaW4gY29tcGFydG1lbnRzXG4gICAgKSB7XG4gICAgICBjb25zdCBsb2NhdGlvbiA9IHNvbWVMb2NhdGlvbjtcbiAgICAgIGNvbnN0IHNvbWVDb21wYXJ0bWVudERlc2NyaXB0b3IgPSBjb21wYXJ0bWVudERlc2NyaXB0b3JzW2xvY2F0aW9uXTtcbiAgICAgIGlmIChjb21wYXJ0bWVudERlc2NyaXB0b3IgPT09IHNvbWVDb21wYXJ0bWVudERlc2NyaXB0b3IpIHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBpZiAoY29tcGFydG1lbnREZXNjcmlwdG9yLmNvbXBhcnRtZW50cy5oYXMobG9jYXRpb24pKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3BlY2lmaWVyOiBhYnNvbHV0ZU1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICBjb21wYXJ0bWVudDogY29tcGFydG1lbnRzW2xvY2F0aW9uXSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgaWYgKFxuICAgICAgICBzb21lQ29tcGFydG1lbnREZXNjcmlwdG9yLmNvbXBhcnRtZW50cy5oYXMoXG4gICAgICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9yLmxvY2F0aW9uLFxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgZW5mb3JjZU1vZHVsZVBvbGljeShcbiAgICAgICAgICBjb21wYXJ0bWVudERlc2NyaXB0b3IubmFtZSxcbiAgICAgICAgICBzb21lQ29tcGFydG1lbnREZXNjcmlwdG9yLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGVycm9ySGludDogYEJsb2NrZWQgaW4gaW1wb3J0IGhvb2suICR7cShhYnNvbHV0ZU1vZHVsZVNwZWNpZmllcil9IGlzIHBhcnQgb2YgdGhlIGNvbXBhcnRtZW50IG1hcCBhbmQgcmVzb2x2ZXMgdG8gJHtsb2NhdGlvbn1gLFxuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgc3BlY2lmaWVyOiBhYnNvbHV0ZU1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICBjb21wYXJ0bWVudDogY29tcGFydG1lbnRzW2xvY2F0aW9uXSxcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgaW1wb3J0IG1vZHVsZTogJHtxKGFic29sdXRlTW9kdWxlU3BlY2lmaWVyKX1gKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy9cbiAgICAgIGNvbnN0IHBhcmVudExvY2F0aW9uID0gbmV3IFVSTCgnLi4vJywgc29tZUxvY2F0aW9uKS5ocmVmO1xuXG4gICAgICAvL1xuICAgICAgaWYgKHBhcmVudExvY2F0aW9uID09PSBzb21lTG9jYXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgIGBDb3VsZCBub3QgaW1wb3J0IHVua25vd24gbW9kdWxlOiAke3EoYWJzb2x1dGVNb2R1bGVTcGVjaWZpZXIpfWAsXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIHNvbWVMb2NhdGlvbiA9IHBhcmVudExvY2F0aW9uO1xuICAgIH1cbiAgfVxufTtcblxuLypcblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBleGl0TW9kdWxlSW1wb3J0SG9va01ha2VyID0gKHtcbiAgbW9kdWxlcyA9IHVuZGVmaW5lZCxcbiAgZXhpdE1vZHVsZUltcG9ydEhvb2sgPSB1bmRlZmluZWQsXG4gIGVudHJ5Q29tcGFydG1lbnROYW1lLFxufSkgPT4ge1xuICBpZiAoIW1vZHVsZXMgJiYgIWV4aXRNb2R1bGVJbXBvcnRIb29rKSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICByZXR1cm4gYXN5bmMgc3BlY2lmaWVyID0+IHtcbiAgICBpZiAobW9kdWxlcyAmJiBoYXMobW9kdWxlcywgc3BlY2lmaWVyKSkge1xuICAgICAgY29uc3QgbnMgPSBtb2R1bGVzW3NwZWNpZmllcl07XG4gICAgICByZXR1cm4gZnJlZXplKHtcbiAgICAgICAgaW1wb3J0czogW10sXG4gICAgICAgIGV4cG9ydHM6IG5zID8ga2V5cyhucykgOiBbXSxcbiAgICAgICAgZXhlY3V0ZTogbW9kdWxlRXhwb3J0cyA9PiB7XG4gICAgICAgICAgbW9kdWxlRXhwb3J0cy5kZWZhdWx0ID0gbnM7XG4gICAgICAgICAgYXNzaWduKG1vZHVsZUV4cG9ydHMsIG5zKTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAoZXhpdE1vZHVsZUltcG9ydEhvb2spIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHJldHVybiBleGl0TW9kdWxlSW1wb3J0SG9vayhzcGVjaWZpZXIsIGVudHJ5Q29tcGFydG1lbnROYW1lKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIoZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlcik7XG5jb25zdCBub21pbmF0ZUNhbmRpZGF0ZXMgPSAobW9kdWxlU3BlY2lmaWVyLCBzZWFyY2hTdWZmaXhlcykgPT4ge1xuICAvL1xuICAvL1xuICBjb25zdCBjYW5kaWRhdGVzID0gW21vZHVsZVNwZWNpZmllcl07XG4gIGZvciAoY29uc3QgY2FuZGlkYXRlU3VmZml4IG9mIHNlYXJjaFN1ZmZpeGVzKSB7XG4gICAgY2FuZGlkYXRlcy5wdXNoKGAke21vZHVsZVNwZWNpZmllcn0ke2NhbmRpZGF0ZVN1ZmZpeH1gKTtcbiAgfVxuICByZXR1cm4gY2FuZGlkYXRlcztcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5mdW5jdGlvbiogY2hvb3NlTW9kdWxlRGVzY3JpcHRvcihcbiAge1xuICAgIGNhbmRpZGF0ZXMsXG4gICAgY29tcGFydG1lbnREZXNjcmlwdG9yLFxuICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcnMsXG4gICAgY29tcGFydG1lbnRzLFxuICAgIGNvbXB1dGVTaGE1MTIsXG4gICAgbW9kdWxlRGVzY3JpcHRvcnMsXG4gICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgIHBhY2thZ2VMb2NhdGlvbixcbiAgICBwYWNrYWdlU291cmNlcyxcbiAgICByZWFkUG93ZXJzLFxuICAgIGFyY2hpdmVPbmx5LFxuICAgIHNvdXJjZU1hcEhvb2ssXG4gICAgc3RyaWN0bHlSZXF1aXJlZEZvckNvbXBhcnRtZW50LFxuICB9LFxuICB7IG1heWJlUmVhZCwgcGFyc2UsIHNob3VsZERlZmVyRXJyb3IgPSAoKSA9PiBmYWxzZSB9LFxuKSB7XG4gIGNvbnN0IHsgc291cmNlRGlybmFtZSB9ID0gY29tcGFydG1lbnREZXNjcmlwdG9yO1xuICBmb3IgKGNvbnN0IGNhbmRpZGF0ZVNwZWNpZmllciBvZiBjYW5kaWRhdGVzKSB7XG4gICAgY29uc3QgY2FuZGlkYXRlTW9kdWxlRGVzY3JpcHRvciA9IG1vZHVsZURlc2NyaXB0b3JzW2NhbmRpZGF0ZVNwZWNpZmllcl07XG4gICAgaWYgKGNhbmRpZGF0ZU1vZHVsZURlc2NyaXB0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgY2FuZGlkYXRlTW9kdWxlRGVzY3JpcHRvci5yZXRhaW5lZCA9IHRydWU7XG4gICAgICBjb25zdCB7IGNvbXBhcnRtZW50OiBjYW5kaWRhdGVDb21wYXJ0bWVudE5hbWUgPSBwYWNrYWdlTG9jYXRpb24gfSA9XG4gICAgICAgIGNhbmRpZGF0ZU1vZHVsZURlc2NyaXB0b3I7XG4gICAgICBjb25zdCBjYW5kaWRhdGVDb21wYXJ0bWVudCA9IGNvbXBhcnRtZW50c1tjYW5kaWRhdGVDb21wYXJ0bWVudE5hbWVdO1xuICAgICAgaWYgKGNhbmRpZGF0ZUNvbXBhcnRtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgYGNvbXBhcnRtZW50IG1pc3NpbmcgZm9yIGNhbmRpZGF0ZSAke2NhbmRpZGF0ZVNwZWNpZmllcn0gaW4gJHtjYW5kaWRhdGVDb21wYXJ0bWVudE5hbWV9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8vXG4gICAgICBjb25zdCBjYW5kaWRhdGVDb21wYXJ0bWVudERlc2NyaXB0b3IgPVxuICAgICAgICBjb21wYXJ0bWVudERlc2NyaXB0b3JzW2NhbmRpZGF0ZUNvbXBhcnRtZW50TmFtZV07XG4gICAgICBpZiAoY2FuZGlkYXRlQ29tcGFydG1lbnREZXNjcmlwdG9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgYGNvbXBhcnRtZW50RGVzY3JpcHRvciBtaXNzaW5nIGZvciBjYW5kaWRhdGUgJHtjYW5kaWRhdGVTcGVjaWZpZXJ9IGluICR7Y2FuZGlkYXRlQ29tcGFydG1lbnROYW1lfWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjYW5kaWRhdGVDb21wYXJ0bWVudERlc2NyaXB0b3IubW9kdWxlc1ttb2R1bGVTcGVjaWZpZXJdID1cbiAgICAgICAgY2FuZGlkYXRlTW9kdWxlRGVzY3JpcHRvcjtcbiAgICAgIC8vXG4gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgY29uc3QgcmVjb3JkID0ge1xuICAgICAgICBzcGVjaWZpZXI6IGNhbmRpZGF0ZVNwZWNpZmllcixcbiAgICAgICAgY29tcGFydG1lbnQ6IGNhbmRpZGF0ZUNvbXBhcnRtZW50LFxuICAgICAgfTtcbiAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgfVxuXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBjb25zdCBtb2R1bGVMb2NhdGlvbiA9IHJlc29sdmVMb2NhdGlvbihjYW5kaWRhdGVTcGVjaWZpZXIsIHBhY2thZ2VMb2NhdGlvbik7XG5cbiAgICAvL1xuICAgIC8vXG4gICAgY29uc3QgbW9kdWxlQnl0ZXMgPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoXG4gICAgICB5aWVsZCBtYXliZVJlYWQobW9kdWxlTG9jYXRpb24pXG4gICAgKTtcblxuICAgIGlmIChtb2R1bGVCeXRlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgIGxldCBzb3VyY2VNYXA7XG4gICAgICAvL1xuICAgICAgY29uc3QgZW52ZWxvcGUgPSAvKiAgICAgICAgICAgICAgICAgICAgICAqLyAoXG4gICAgICAgIHlpZWxkIHBhcnNlKFxuICAgICAgICAgIG1vZHVsZUJ5dGVzLFxuICAgICAgICAgIGNhbmRpZGF0ZVNwZWNpZmllcixcbiAgICAgICAgICBtb2R1bGVMb2NhdGlvbixcbiAgICAgICAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcmVhZFBvd2VycyxcbiAgICAgICAgICAgIGFyY2hpdmVPbmx5LFxuICAgICAgICAgICAgc291cmNlTWFwSG9vazpcbiAgICAgICAgICAgICAgc291cmNlTWFwSG9vayAmJlxuICAgICAgICAgICAgICAobmV4dFNvdXJjZU1hcE9iamVjdCA9PiB7XG4gICAgICAgICAgICAgICAgc291cmNlTWFwID0gSlNPTi5zdHJpbmdpZnkobmV4dFNvdXJjZU1hcE9iamVjdCk7XG4gICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9yLFxuICAgICAgICAgIH0sXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgICBjb25zdCB7XG4gICAgICAgIHBhcnNlcixcbiAgICAgICAgYnl0ZXM6IHRyYW5zZm9ybWVkQnl0ZXMsXG4gICAgICAgIHJlY29yZDogY29uY3JldGVSZWNvcmQsXG4gICAgICB9ID0gZW52ZWxvcGU7XG5cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgaWYgKGNhbmRpZGF0ZVNwZWNpZmllciAhPT0gbW9kdWxlU3BlY2lmaWVyKSB7XG4gICAgICAgIG1vZHVsZURlc2NyaXB0b3JzW21vZHVsZVNwZWNpZmllcl0gPSB7XG4gICAgICAgICAgcmV0YWluZWQ6IHRydWUsXG4gICAgICAgICAgbW9kdWxlOiBjYW5kaWRhdGVTcGVjaWZpZXIsXG4gICAgICAgICAgY29tcGFydG1lbnQ6IHBhY2thZ2VMb2NhdGlvbixcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgIGNvbnN0IHJlY29yZCA9IHtcbiAgICAgICAgcmVjb3JkOiBjb25jcmV0ZVJlY29yZCxcbiAgICAgICAgc3BlY2lmaWVyOiBjYW5kaWRhdGVTcGVjaWZpZXIsXG4gICAgICAgIGltcG9ydE1ldGE6IHsgdXJsOiBtb2R1bGVMb2NhdGlvbiB9LFxuICAgICAgfTtcblxuICAgICAgbGV0IHNoYTUxMjtcbiAgICAgIGlmIChjb21wdXRlU2hhNTEyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgc2hhNTEyID0gY29tcHV0ZVNoYTUxMih0cmFuc2Zvcm1lZEJ5dGVzKTtcblxuICAgICAgICBpZiAoc291cmNlTWFwSG9vayAhPT0gdW5kZWZpbmVkICYmIHNvdXJjZU1hcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgc291cmNlTWFwSG9vayhzb3VyY2VNYXAsIHtcbiAgICAgICAgICAgIGNvbXBhcnRtZW50OiBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICAgICBtb2R1bGU6IGNhbmRpZGF0ZVNwZWNpZmllcixcbiAgICAgICAgICAgIGxvY2F0aW9uOiBtb2R1bGVMb2NhdGlvbixcbiAgICAgICAgICAgIHNoYTUxMixcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCBwYWNrYWdlUmVsYXRpdmVMb2NhdGlvbiA9IG1vZHVsZUxvY2F0aW9uLnNsaWNlKFxuICAgICAgICBwYWNrYWdlTG9jYXRpb24ubGVuZ3RoLFxuICAgICAgKTtcbiAgICAgIHBhY2thZ2VTb3VyY2VzW2NhbmRpZGF0ZVNwZWNpZmllcl0gPSB7XG4gICAgICAgIGxvY2F0aW9uOiBwYWNrYWdlUmVsYXRpdmVMb2NhdGlvbixcbiAgICAgICAgc291cmNlTG9jYXRpb246IG1vZHVsZUxvY2F0aW9uLFxuICAgICAgICBzb3VyY2VEaXJuYW1lLFxuICAgICAgICBwYXJzZXIsXG4gICAgICAgIGJ5dGVzOiB0cmFuc2Zvcm1lZEJ5dGVzLFxuICAgICAgICByZWNvcmQ6IGNvbmNyZXRlUmVjb3JkLFxuICAgICAgICBzaGE1MTIsXG4gICAgICB9O1xuICAgICAgaWYgKCFzaG91bGREZWZlckVycm9yKHBhcnNlcikpIHtcbiAgICAgICAgZm9yIChjb25zdCBpbXBvcnRTcGVjaWZpZXIgb2YgZ2V0SW1wb3J0c0Zyb21SZWNvcmQocmVjb3JkKSkge1xuICAgICAgICAgIHN0cmljdGx5UmVxdWlyZWRGb3JDb21wYXJ0bWVudChwYWNrYWdlTG9jYXRpb24pLmFkZChcbiAgICAgICAgICAgIHJlc29sdmUoaW1wb3J0U3BlY2lmaWVyLCBtb2R1bGVTcGVjaWZpZXIpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHJlY29yZDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZUltcG9ydEhvb2tNYWtlciA9IChcbiAgcmVhZFBvd2VycyxcbiAgYmFzZUxvY2F0aW9uLFxuICB7XG4gICAgc291cmNlcyA9IGNyZWF0ZShudWxsKSxcbiAgICBjb21wYXJ0bWVudERlc2NyaXB0b3JzID0gY3JlYXRlKG51bGwpLFxuICAgIGFyY2hpdmVPbmx5ID0gZmFsc2UsXG4gICAgY29tcHV0ZVNoYTUxMiA9IHVuZGVmaW5lZCxcbiAgICBzZWFyY2hTdWZmaXhlcyA9IG5vZGVqc0NvbnZlbnRpb25TZWFyY2hTdWZmaXhlcyxcbiAgICBzb3VyY2VNYXBIb29rID0gdW5kZWZpbmVkLFxuICAgIGVudHJ5Q29tcGFydG1lbnROYW1lLFxuICAgIGVudHJ5TW9kdWxlU3BlY2lmaWVyLFxuICAgIGltcG9ydEhvb2s6IGV4aXRNb2R1bGVJbXBvcnRIb29rID0gdW5kZWZpbmVkLFxuICB9LFxuKSA9PiB7XG4gIC8vXG4gIC8vXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHN0cmljdGx5UmVxdWlyZWQgPSBuZXcgTWFwKFtcbiAgICBbZW50cnlDb21wYXJ0bWVudE5hbWUsIG5ldyBTZXQoW2VudHJ5TW9kdWxlU3BlY2lmaWVyXSldLFxuICBdKTtcblxuICAvKlxuXG4gICAqL1xuICBjb25zdCBzdHJpY3RseVJlcXVpcmVkRm9yQ29tcGFydG1lbnQgPSBjb21wYXJ0bWVudE5hbWUgPT4ge1xuICAgIGxldCBjb21wYXJ0bWVudFN0cmljdGx5UmVxdWlyZWQgPSBzdHJpY3RseVJlcXVpcmVkLmdldChjb21wYXJ0bWVudE5hbWUpO1xuICAgIGlmIChjb21wYXJ0bWVudFN0cmljdGx5UmVxdWlyZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGNvbXBhcnRtZW50U3RyaWN0bHlSZXF1aXJlZDtcbiAgICB9XG4gICAgY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkID0gbmV3IFNldCgpO1xuICAgIHN0cmljdGx5UmVxdWlyZWQuc2V0KGNvbXBhcnRtZW50TmFtZSwgY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkKTtcbiAgICByZXR1cm4gY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkO1xuICB9O1xuXG4gIC8vXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBtYWtlSW1wb3J0SG9vayA9ICh7XG4gICAgcGFja2FnZUxvY2F0aW9uLFxuICAgIHBhY2thZ2VOYW1lOiBfcGFja2FnZU5hbWUsXG4gICAgYXR0ZW51YXRvcnMsXG4gICAgcGFyc2UsXG4gICAgc2hvdWxkRGVmZXJFcnJvcixcbiAgICBjb21wYXJ0bWVudHMsXG4gIH0pID0+IHtcbiAgICAvL1xuICAgIHBhY2thZ2VMb2NhdGlvbiA9IHJlc29sdmVMb2NhdGlvbihwYWNrYWdlTG9jYXRpb24sIGJhc2VMb2NhdGlvbik7XG4gICAgY29uc3QgcGFja2FnZVNvdXJjZXMgPSBzb3VyY2VzW3BhY2thZ2VMb2NhdGlvbl0gfHwgY3JlYXRlKG51bGwpO1xuICAgIHNvdXJjZXNbcGFja2FnZUxvY2F0aW9uXSA9IHBhY2thZ2VTb3VyY2VzO1xuICAgIGNvbnN0IGNvbXBhcnRtZW50RGVzY3JpcHRvciA9IGNvbXBhcnRtZW50RGVzY3JpcHRvcnNbcGFja2FnZUxvY2F0aW9uXSB8fCB7fTtcbiAgICBjb25zdCB7IG1vZHVsZXM6IG1vZHVsZURlc2NyaXB0b3JzID0gY3JlYXRlKG51bGwpIH0gPSBjb21wYXJ0bWVudERlc2NyaXB0b3I7XG4gICAgY29tcGFydG1lbnREZXNjcmlwdG9yLm1vZHVsZXMgPSBtb2R1bGVEZXNjcmlwdG9ycztcblxuICAgIC8qXG5cblxuXG4gICAgICovXG4gICAgY29uc3QgZGVmZXJFcnJvciA9IChzcGVjaWZpZXIsIGVycm9yKSA9PiB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGlmIChzdHJpY3RseVJlcXVpcmVkRm9yQ29tcGFydG1lbnQocGFja2FnZUxvY2F0aW9uKS5oYXMoc3BlY2lmaWVyKSkge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBjb25zdCByZWNvcmQgPSBmcmVlemUoe1xuICAgICAgICBpbXBvcnRzOiBbXSxcbiAgICAgICAgZXhwb3J0czogW10sXG4gICAgICAgIGV4ZWN1dGU6ICgpID0+IHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgICAgcGFja2FnZVNvdXJjZXNbc3BlY2lmaWVyXSA9IHtcbiAgICAgICAgZGVmZXJyZWRFcnJvcjogZXJyb3IubWVzc2FnZSxcbiAgICAgIH07XG5cbiAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgfTtcblxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCBpbXBvcnRIb29rID0gYXN5bmMgbW9kdWxlU3BlY2lmaWVyID0+IHtcbiAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvci5yZXRhaW5lZCA9IHRydWU7XG5cbiAgICAgIC8vXG4gICAgICBhd2FpdCBudWxsO1xuXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vXG5cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgaWYgKG1vZHVsZVNwZWNpZmllciAhPT0gJy4nICYmICFtb2R1bGVTcGVjaWZpZXIuc3RhcnRzV2l0aCgnLi8nKSkge1xuICAgICAgICAgIGlmIChleGl0TW9kdWxlSW1wb3J0SG9vaykge1xuICAgICAgICAgICAgY29uc3QgcmVjb3JkID0gYXdhaXQgZXhpdE1vZHVsZUltcG9ydEhvb2soXG4gICAgICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICAgICAgcGFja2FnZUxvY2F0aW9uLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChyZWNvcmQpIHtcbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgZW5mb3JjZU1vZHVsZVBvbGljeShtb2R1bGVTcGVjaWZpZXIsIGNvbXBhcnRtZW50RGVzY3JpcHRvciwge1xuICAgICAgICAgICAgICAgIGV4aXQ6IHRydWUsXG4gICAgICAgICAgICAgICAgZXJyb3JIaW50OiBgQmxvY2tlZCBpbiBsb2FkaW5nLiAke3EoXG4gICAgICAgICAgICAgICAgICBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgICAgICAgICAgKX0gd2FzIG5vdCBpbiB0aGUgY29tcGFydG1lbnQgbWFwIGFuZCBhbiBhdHRlbXB0IHdhcyBtYWRlIHRvIGxvYWQgaXQgYXMgYSBidWlsdGluYCxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGlmIChhcmNoaXZlT25seSkge1xuICAgICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgICByZXR1cm4gZnJlZXplKHsgaW1wb3J0czogW10sIGV4cG9ydHM6IFtdLCBleGVjdXRlKCkge30gfSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgY29uc3QgYXR0ZW51YXRlZFJlY29yZCA9IGF3YWl0IGF0dGVudWF0ZU1vZHVsZUhvb2soXG4gICAgICAgICAgICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICAgICAgICAgIHJlY29yZCxcbiAgICAgICAgICAgICAgICBjb21wYXJ0bWVudERlc2NyaXB0b3IucG9saWN5LFxuICAgICAgICAgICAgICAgIGF0dGVudWF0b3JzLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICByZXR1cm4gYXR0ZW51YXRlZFJlY29yZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICBgQ2Fubm90IGZpbmQgZXh0ZXJuYWwgbW9kdWxlICR7cShcbiAgICAgICAgICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICAgICAgKX0gaW4gcGFja2FnZSAke3BhY2thZ2VMb2NhdGlvbn1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB7IG1heWJlUmVhZCB9ID0gdW5wYWNrUmVhZFBvd2VycyhyZWFkUG93ZXJzKTtcblxuICAgICAgICBjb25zdCBjYW5kaWRhdGVzID0gbm9taW5hdGVDYW5kaWRhdGVzKG1vZHVsZVNwZWNpZmllciwgc2VhcmNoU3VmZml4ZXMpO1xuXG4gICAgICAgIGNvbnN0IHJlY29yZCA9IGF3YWl0IGFzeW5jVHJhbXBvbGluZShcbiAgICAgICAgICBjaG9vc2VNb2R1bGVEZXNjcmlwdG9yLFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGNhbmRpZGF0ZXMsXG4gICAgICAgICAgICBjb21wYXJ0bWVudERlc2NyaXB0b3IsXG4gICAgICAgICAgICBjb21wYXJ0bWVudERlc2NyaXB0b3JzLFxuICAgICAgICAgICAgY29tcGFydG1lbnRzLFxuICAgICAgICAgICAgY29tcHV0ZVNoYTUxMixcbiAgICAgICAgICAgIG1vZHVsZURlc2NyaXB0b3JzLFxuICAgICAgICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICAgICAgcGFja2FnZUxvY2F0aW9uLFxuICAgICAgICAgICAgcGFja2FnZVNvdXJjZXMsXG4gICAgICAgICAgICByZWFkUG93ZXJzLFxuICAgICAgICAgICAgYXJjaGl2ZU9ubHksXG4gICAgICAgICAgICBzb3VyY2VNYXBIb29rLFxuICAgICAgICAgICAgc3RyaWN0bHlSZXF1aXJlZEZvckNvbXBhcnRtZW50LFxuICAgICAgICAgIH0sXG4gICAgICAgICAgeyBtYXliZVJlYWQsIHBhcnNlLCBzaG91bGREZWZlckVycm9yIH0sXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHJlY29yZCkge1xuICAgICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgICAgIH1cblxuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBgQ2Fubm90IGZpbmQgZmlsZSBmb3IgaW50ZXJuYWwgbW9kdWxlICR7cShcbiAgICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICApfSAod2l0aCBjYW5kaWRhdGVzICR7Y2FuZGlkYXRlc1xuICAgICAgICAgICAgLm1hcCh4ID0+IHEoeCkpXG4gICAgICAgICAgICAuam9pbignLCAnKX0pIGluIHBhY2thZ2UgJHtwYWNrYWdlTG9jYXRpb259YCxcbiAgICAgICAgKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIHJldHVybiBkZWZlckVycm9yKG1vZHVsZVNwZWNpZmllciwgZXJyb3IpO1xuICAgICAgfVxuICAgIH07XG4gICAgcmV0dXJuIGltcG9ydEhvb2s7XG4gIH07XG4gIHJldHVybiBtYWtlSW1wb3J0SG9vaztcbn07XG5cbi8qXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UubWFrZUltcG9ydEhvb2tNYWtlcihtYWtlSW1wb3J0SG9va01ha2VyKTtcbiAgICAgICBmdW5jdGlvbiBtYWtlSW1wb3J0Tm93SG9va01ha2VyKFxuICByZWFkUG93ZXJzLFxuICBiYXNlTG9jYXRpb24sXG4gIHtcbiAgICBzb3VyY2VzID0gY3JlYXRlKG51bGwpLFxuICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcnMgPSBjcmVhdGUobnVsbCksXG4gICAgY29tcHV0ZVNoYTUxMiA9IHVuZGVmaW5lZCxcbiAgICBzZWFyY2hTdWZmaXhlcyA9IG5vZGVqc0NvbnZlbnRpb25TZWFyY2hTdWZmaXhlcyxcbiAgICBhcmNoaXZlT25seSA9IGZhbHNlLFxuICAgIHNvdXJjZU1hcEhvb2sgPSB1bmRlZmluZWQsXG4gICAgaW1wb3J0Tm93SG9vazogZXhpdE1vZHVsZUltcG9ydE5vd0hvb2sgPSB1bmRlZmluZWQsXG4gIH0sXG4pIHtcbiAgLy9cbiAgLy9cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3Qgc3RyaWN0bHlSZXF1aXJlZCA9IG5ldyBNYXAoKTtcblxuICAvKlxuXG4gICAqL1xuICBjb25zdCBzdHJpY3RseVJlcXVpcmVkRm9yQ29tcGFydG1lbnQgPSBjb21wYXJ0bWVudE5hbWUgPT4ge1xuICAgIGxldCBjb21wYXJ0bWVudFN0cmljdGx5UmVxdWlyZWQgPSBzdHJpY3RseVJlcXVpcmVkLmdldChjb21wYXJ0bWVudE5hbWUpO1xuICAgIGlmIChjb21wYXJ0bWVudFN0cmljdGx5UmVxdWlyZWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGNvbXBhcnRtZW50U3RyaWN0bHlSZXF1aXJlZDtcbiAgICB9XG4gICAgY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkID0gbmV3IFNldCgpO1xuICAgIHN0cmljdGx5UmVxdWlyZWQuc2V0KGNvbXBhcnRtZW50TmFtZSwgY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkKTtcbiAgICByZXR1cm4gY29tcGFydG1lbnRTdHJpY3RseVJlcXVpcmVkO1xuICB9O1xuXG4gIC8qXG5cbiAgICovXG4gIGNvbnN0IG1ha2VJbXBvcnROb3dIb29rID0gKHtcbiAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgcGFja2FnZU5hbWU6IF9wYWNrYWdlTmFtZSxcbiAgICBwYXJzZSxcbiAgICBjb21wYXJ0bWVudHMsXG4gIH0pID0+IHtcbiAgICBpZiAoISgnaXNTeW5jUGFyc2VyJyBpbiBwYXJzZSkpIHtcbiAgICAgIHJldHVybiBmdW5jdGlvbiBpbXBvc3NpYmxlVHJhbnNmb3JtSW1wb3J0Tm93SG9vaygpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAgICdEeW5hbWljIHJlcXVpcmVzIGFyZSBvbmx5IHBvc3NpYmxlIHdpdGggc3luY2hyb25vdXMgcGFyc2VycyBhbmQgbm8gYXN5bmNocm9ub3VzIG1vZHVsZSB0cmFuc2Zvcm1zIGluIG9wdGlvbnMnLFxuICAgICAgICApO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdCBjb21wYXJ0bWVudERlc2NyaXB0b3IgPSBjb21wYXJ0bWVudERlc2NyaXB0b3JzW3BhY2thZ2VMb2NhdGlvbl0gfHwge307XG5cbiAgICBwYWNrYWdlTG9jYXRpb24gPSByZXNvbHZlTG9jYXRpb24ocGFja2FnZUxvY2F0aW9uLCBiYXNlTG9jYXRpb24pO1xuICAgIGNvbnN0IHBhY2thZ2VTb3VyY2VzID0gc291cmNlc1twYWNrYWdlTG9jYXRpb25dIHx8IGNyZWF0ZShudWxsKTtcbiAgICBzb3VyY2VzW3BhY2thZ2VMb2NhdGlvbl0gPSBwYWNrYWdlU291cmNlcztcbiAgICBjb25zdCB7XG4gICAgICBtb2R1bGVzOlxuICAgICAgICBtb2R1bGVEZXNjcmlwdG9ycyA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChcbiAgICAgICAgICBjcmVhdGUobnVsbClcbiAgICAgICAgKSxcbiAgICB9ID0gY29tcGFydG1lbnREZXNjcmlwdG9yO1xuICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvci5tb2R1bGVzID0gbW9kdWxlRGVzY3JpcHRvcnM7XG5cbiAgICBsZXQgeyBwb2xpY3kgfSA9IGNvbXBhcnRtZW50RGVzY3JpcHRvcjtcbiAgICBwb2xpY3kgPSBwb2xpY3kgfHwgY3JlYXRlKG51bGwpO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgaWYgKCdwYWNrYWdlcycgaW4gcG9saWN5ICYmIHR5cGVvZiBwb2xpY3kucGFja2FnZXMgPT09ICdvYmplY3QnKSB7XG4gICAgICBmb3IgKGNvbnN0IFtwYWNrYWdlTmFtZSwgcGFja2FnZVBvbGljeUl0ZW1dIG9mIGVudHJpZXMocG9saWN5LnBhY2thZ2VzKSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgIShwYWNrYWdlTmFtZSBpbiBjb21wYXJ0bWVudERlc2NyaXB0b3IubW9kdWxlcykgJiZcbiAgICAgICAgICBwYWNrYWdlTmFtZSBpbiBjb21wYXJ0bWVudERlc2NyaXB0b3Iuc2NvcGVzICYmXG4gICAgICAgICAgcGFja2FnZVBvbGljeUl0ZW1cbiAgICAgICAgKSB7XG4gICAgICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9yLm1vZHVsZXNbcGFja2FnZU5hbWVdID1cbiAgICAgICAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvci5zY29wZXNbcGFja2FnZU5hbWVdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgeyBtYXliZVJlYWROb3csIGlzQWJzb2x1dGUgfSA9IHJlYWRQb3dlcnM7XG5cbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgaW1wb3J0Tm93SG9vayA9IG1vZHVsZVNwZWNpZmllciA9PiB7XG4gICAgICBpZiAoaXNBYnNvbHV0ZShtb2R1bGVTcGVjaWZpZXIpKSB7XG4gICAgICAgIGNvbnN0IHJlY29yZCA9IGZpbmRSZWRpcmVjdCh7XG4gICAgICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9yLFxuICAgICAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcnMsXG4gICAgICAgICAgY29tcGFydG1lbnRzLFxuICAgICAgICAgIGFic29sdXRlTW9kdWxlU3BlY2lmaWVyOiBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgICAgcGFja2FnZUxvY2F0aW9uLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKHJlY29yZCkge1xuICAgICAgICAgIHJldHVybiByZWNvcmQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29uc3QgY2FuZGlkYXRlcyA9IG5vbWluYXRlQ2FuZGlkYXRlcyhtb2R1bGVTcGVjaWZpZXIsIHNlYXJjaFN1ZmZpeGVzKTtcblxuICAgICAgY29uc3QgcmVjb3JkID0gc3luY1RyYW1wb2xpbmUoXG4gICAgICAgIGNob29zZU1vZHVsZURlc2NyaXB0b3IsXG4gICAgICAgIHtcbiAgICAgICAgICBjYW5kaWRhdGVzLFxuICAgICAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcixcbiAgICAgICAgICBjb21wYXJ0bWVudERlc2NyaXB0b3JzLFxuICAgICAgICAgIGNvbXBhcnRtZW50cyxcbiAgICAgICAgICBjb21wdXRlU2hhNTEyLFxuICAgICAgICAgIG1vZHVsZURlc2NyaXB0b3JzLFxuICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICAgcGFja2FnZVNvdXJjZXMsXG4gICAgICAgICAgcmVhZFBvd2VycyxcbiAgICAgICAgICBhcmNoaXZlT25seSxcbiAgICAgICAgICBzb3VyY2VNYXBIb29rLFxuICAgICAgICAgIHN0cmljdGx5UmVxdWlyZWRGb3JDb21wYXJ0bWVudCxcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIG1heWJlUmVhZDogbWF5YmVSZWFkTm93LFxuICAgICAgICAgIHBhcnNlLFxuICAgICAgICB9LFxuICAgICAgKTtcblxuICAgICAgaWYgKHJlY29yZCkge1xuICAgICAgICByZXR1cm4gcmVjb3JkO1xuICAgICAgfVxuXG4gICAgICBpZiAoZXhpdE1vZHVsZUltcG9ydE5vd0hvb2spIHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgZXhpdFJlY29yZCA9IGV4aXRNb2R1bGVJbXBvcnROb3dIb29rKFxuICAgICAgICAgIG1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCFleGl0UmVjb3JkKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgaW1wb3J0IG1vZHVsZTogJHtxKG1vZHVsZVNwZWNpZmllcil9YCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZXhpdFJlY29yZDtcbiAgICAgIH1cblxuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICBgQ291bGQgbm90IGltcG9ydCBtb2R1bGU6ICR7cShcbiAgICAgICAgICBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgICl9OyB0cnkgcHJvdmlkaW5nIGFuIGltcG9ydE5vd0hvb2tgLFxuICAgICAgKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGltcG9ydE5vd0hvb2s7XG4gIH07XG4gIHJldHVybiBtYWtlSW1wb3J0Tm93SG9vaztcbn1cbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImV4aXRNb2R1bGVJbXBvcnRIb29rTWFrZXIiOlsiZXhpdE1vZHVsZUltcG9ydEhvb2tNYWtlciJdLCJtYWtlSW1wb3J0SG9va01ha2VyIjpbIm1ha2VJbXBvcnRIb29rTWFrZXIiXSwibWFrZUltcG9ydE5vd0hvb2tNYWtlciI6WyJtYWtlSW1wb3J0Tm93SG9va01ha2VyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALJuhOsuAwAALgMAACsAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9qc29uLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJwYXJzZUxvY2F0ZWRKc29uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBwYXJzZUxvY2F0ZWRKc29uID0gKHNvdXJjZSwgbG9jYXRpb24pID0+IHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShzb3VyY2UpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIFN5bnRheEVycm9yKSB7XG4gICAgICB0aHJvdyBTeW50YXhFcnJvcihgQ2Fubm90IHBhcnNlIEpTT04gZnJvbSAke2xvY2F0aW9ufSwgJHtlcnJvcn1gKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cbn07JGjNj19vbmNlLnBhcnNlTG9jYXRlZEpzb24ocGFyc2VMb2NhdGVkSnNvbik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwYXJzZUxvY2F0ZWRKc29uIjpbInBhcnNlTG9jYXRlZEpzb24iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAVF1zgY8lAACPJQAAKwAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL2xpbmsuanN7ImltcG9ydHMiOlsiLi9tYXAtcGFyc2VyLmpzIiwiLi9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanMiLCIuL3BvbGljeS5qcyJdLCJleHBvcnRzIjpbImFzc2VtYmxlIiwibGluayJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG1ha2VNYXBQYXJzZXJzLHJlc29sdmVGYWxsYmFjayxBVFRFTlVBVE9SU19DT01QQVJUTUVOVCxhdHRlbnVhdGVHbG9iYWxzLGVuZm9yY2VNb2R1bGVQb2xpY3ksbWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcjskaM2PX2ltcG9ydHMoW1tcIi4vbWFwLXBhcnNlci5qc1wiLCBbW1wibWFrZU1hcFBhcnNlcnNcIixbJGjNj19hID0+IChtYWtlTWFwUGFyc2VycyA9ICRozY9fYSldXV1dLFtcIi4vbm9kZS1tb2R1bGUtc3BlY2lmaWVyLmpzXCIsIFtbXCJyZXNvbHZlXCIsWyRozY9fYSA9PiAocmVzb2x2ZUZhbGxiYWNrID0gJGjNj19hKV1dXV0sW1wiLi9wb2xpY3kuanNcIiwgW1tcIkFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UXCIsWyRozY9fYSA9PiAoQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQgPSAkaM2PX2EpXV0sW1wiYXR0ZW51YXRlR2xvYmFsc1wiLFskaM2PX2EgPT4gKGF0dGVudWF0ZUdsb2JhbHMgPSAkaM2PX2EpXV0sW1wiZW5mb3JjZU1vZHVsZVBvbGljeVwiLFskaM2PX2EgPT4gKGVuZm9yY2VNb2R1bGVQb2xpY3kgPSAkaM2PX2EpXV0sW1wibWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlclwiLFskaM2PX2EgPT4gKG1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXIgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgYXNzaWduLCBjcmVhdGUsIGVudHJpZXMsIGZyZWV6ZSB9ID0gT2JqZWN0O1xuY29uc3QgeyBoYXNPd25Qcm9wZXJ0eSB9ID0gT2JqZWN0LnByb3RvdHlwZTtcbmNvbnN0IHsgYXBwbHkgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGFsbFNldHRsZWQgfSA9IFByb21pc2U7XG5cbi8qXG5cblxuICovXG5jb25zdCBwcm9taXNlQWxsU2V0dGxlZCA9IGFsbFNldHRsZWQuYmluZChQcm9taXNlKTtcblxuY29uc3QgZGVmYXVsdENvbXBhcnRtZW50ID0gQ29tcGFydG1lbnQ7XG5cbi8vXG5jb25zdCBxID0gSlNPTi5zdHJpbmdpZnk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGhhcyA9IChvYmplY3QsIGtleSkgPT4gYXBwbHkoaGFzT3duUHJvcGVydHksIG9iamVjdCwgW2tleV0pO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgdHJpbU1vZHVsZVNwZWNpZmllclByZWZpeCA9IChtb2R1bGVTcGVjaWZpZXIsIHByZWZpeCkgPT4ge1xuICBpZiAobW9kdWxlU3BlY2lmaWVyID09PSBwcmVmaXgpIHtcbiAgICByZXR1cm4gJy4nO1xuICB9XG4gIGlmIChtb2R1bGVTcGVjaWZpZXIuc3RhcnRzV2l0aChgJHtwcmVmaXh9L2ApKSB7XG4gICAgcmV0dXJuIGAuLyR7bW9kdWxlU3BlY2lmaWVyLnNsaWNlKHByZWZpeC5sZW5ndGggKyAxKX1gO1xuICB9XG4gIHJldHVybiB1bmRlZmluZWQ7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlTW9kdWxlTWFwSG9vayA9IChcbiAgY29tcGFydG1lbnREZXNjcmlwdG9yLFxuICBjb21wYXJ0bWVudHMsXG4gIGNvbXBhcnRtZW50TmFtZSxcbiAgbW9kdWxlRGVzY3JpcHRvcnMsXG4gIHNjb3BlRGVzY3JpcHRvcnMsXG4pID0+IHtcbiAgLypcblxuXG4gICAqL1xuICBjb25zdCBtb2R1bGVNYXBIb29rID0gbW9kdWxlU3BlY2lmaWVyID0+IHtcbiAgICBjb21wYXJ0bWVudERlc2NyaXB0b3IucmV0YWluZWQgPSB0cnVlO1xuXG4gICAgY29uc3QgbW9kdWxlRGVzY3JpcHRvciA9IG1vZHVsZURlc2NyaXB0b3JzW21vZHVsZVNwZWNpZmllcl07XG4gICAgaWYgKG1vZHVsZURlc2NyaXB0b3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbW9kdWxlRGVzY3JpcHRvci5yZXRhaW5lZCA9IHRydWU7XG5cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3Qge1xuICAgICAgICBjb21wYXJ0bWVudDogZm9yZWlnbkNvbXBhcnRtZW50TmFtZSA9IGNvbXBhcnRtZW50TmFtZSxcbiAgICAgICAgbW9kdWxlOiBmb3JlaWduTW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICBleGl0LFxuICAgICAgfSA9IG1vZHVsZURlc2NyaXB0b3I7XG4gICAgICBpZiAoZXhpdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7IC8vXG4gICAgICB9XG4gICAgICBpZiAoZm9yZWlnbk1vZHVsZVNwZWNpZmllciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vXG4gICAgICAgIGlmICghbW9kdWxlU3BlY2lmaWVyLnN0YXJ0c1dpdGgoJy4vJykpIHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgZW5mb3JjZU1vZHVsZVBvbGljeShtb2R1bGVTcGVjaWZpZXIsIGNvbXBhcnRtZW50RGVzY3JpcHRvciwge1xuICAgICAgICAgICAgZXhpdDogZmFsc2UsXG4gICAgICAgICAgICBlcnJvckhpbnQ6XG4gICAgICAgICAgICAgICdUaGlzIGNoZWNrIHNob3VsZCBub3QgYmUgcmVhY2hhYmxlLiBJZiB5b3Ugc2VlIHRoaXMgZXJyb3IsIHBsZWFzZSBmaWxlIGFuIGlzc3VlLicsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBmb3JlaWduQ29tcGFydG1lbnQgPSBjb21wYXJ0bWVudHNbZm9yZWlnbkNvbXBhcnRtZW50TmFtZV07XG4gICAgICAgIGlmIChmb3JlaWduQ29tcGFydG1lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgYENhbm5vdCBpbXBvcnQgZnJvbSBtaXNzaW5nIGNvbXBhcnRtZW50ICR7cShcbiAgICAgICAgICAgICAgZm9yZWlnbkNvbXBhcnRtZW50TmFtZSxcbiAgICAgICAgICAgICl9fWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGNvbXBhcnRtZW50OiBmb3JlaWduQ29tcGFydG1lbnQsXG4gICAgICAgICAgbmFtZXNwYWNlOiBmb3JlaWduTW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBmb3IgKGNvbnN0IFtzY29wZVByZWZpeCwgc2NvcGVEZXNjcmlwdG9yXSBvZiBlbnRyaWVzKHNjb3BlRGVzY3JpcHRvcnMpKSB7XG4gICAgICBjb25zdCBmb3JlaWduTW9kdWxlU3BlY2lmaWVyID0gdHJpbU1vZHVsZVNwZWNpZmllclByZWZpeChcbiAgICAgICAgbW9kdWxlU3BlY2lmaWVyLFxuICAgICAgICBzY29wZVByZWZpeCxcbiAgICAgICk7XG5cbiAgICAgIGlmIChmb3JlaWduTW9kdWxlU3BlY2lmaWVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgY29uc3QgeyBjb21wYXJ0bWVudDogZm9yZWlnbkNvbXBhcnRtZW50TmFtZSB9ID0gc2NvcGVEZXNjcmlwdG9yO1xuICAgICAgICBpZiAoZm9yZWlnbkNvbXBhcnRtZW50TmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgICBgQ2Fubm90IGltcG9ydCBmcm9tIHNjb3BlICR7c2NvcGVQcmVmaXh9IGR1ZSB0byBtaXNzaW5nIFwiY29tcGFydG1lbnRcIiBwcm9wZXJ0eWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBmb3JlaWduQ29tcGFydG1lbnQgPSBjb21wYXJ0bWVudHNbZm9yZWlnbkNvbXBhcnRtZW50TmFtZV07XG4gICAgICAgIGlmIChmb3JlaWduQ29tcGFydG1lbnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgYENhbm5vdCBpbXBvcnQgZnJvbSBtaXNzaW5nIGNvbXBhcnRtZW50ICR7cShcbiAgICAgICAgICAgICAgZm9yZWlnbkNvbXBhcnRtZW50TmFtZSxcbiAgICAgICAgICAgICl9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgZW5mb3JjZU1vZHVsZVBvbGljeShzY29wZVByZWZpeCwgY29tcGFydG1lbnREZXNjcmlwdG9yLCB7XG4gICAgICAgICAgZXhpdDogZmFsc2UsXG4gICAgICAgICAgZXJyb3JIaW50OiBgQmxvY2tlZCBpbiBsaW5raW5nLiAke3EoXG4gICAgICAgICAgICBtb2R1bGVTcGVjaWZpZXIsXG4gICAgICAgICAgKX0gaXMgcGFydCBvZiB0aGUgY29tcGFydG1lbnQgbWFwIGFuZCByZXNvbHZlcyB0byAke3EoXG4gICAgICAgICAgICBmb3JlaWduQ29tcGFydG1lbnROYW1lLFxuICAgICAgICAgICl9LmAsXG4gICAgICAgIH0pO1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBtb2R1bGVEZXNjcmlwdG9yc1ttb2R1bGVTcGVjaWZpZXJdID0ge1xuICAgICAgICAgIHJldGFpbmVkOiB0cnVlLFxuICAgICAgICAgIGNvbXBhcnRtZW50OiBmb3JlaWduQ29tcGFydG1lbnROYW1lLFxuICAgICAgICAgIG1vZHVsZTogZm9yZWlnbk1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgfTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBjb21wYXJ0bWVudDogZm9yZWlnbkNvbXBhcnRtZW50LFxuICAgICAgICAgIG5hbWVzcGFjZTogZm9yZWlnbk1vZHVsZVNwZWNpZmllcixcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvL1xuICAgIC8vXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfTtcblxuICByZXR1cm4gbW9kdWxlTWFwSG9vaztcbn07XG5cbi8qXG5cbiAqL1xuY29uc3QgaW1wb3NzaWJsZUltcG9ydE5vd0hvb2tNYWtlciA9ICgpID0+IHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGltcG9zc2libGVJbXBvcnROb3dIb29rKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignUHJvdmlkZWQgcmVhZCBwb3dlcnMgZG8gbm90IHN1cHBvcnQgZHluYW1pYyByZXF1aXJlcycpO1xuICB9O1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuICovXG4gICAgICAgY29uc3QgbGluayA9IChcbiAgeyBlbnRyeSwgY29tcGFydG1lbnRzOiBjb21wYXJ0bWVudERlc2NyaXB0b3JzIH0sXG4gIG9wdGlvbnMsXG4pID0+IHtcbiAgY29uc3Qge1xuICAgIHJlc29sdmUgPSByZXNvbHZlRmFsbGJhY2ssXG4gICAgbWFrZUltcG9ydEhvb2ssXG4gICAgbWFrZUltcG9ydE5vd0hvb2sgPSBpbXBvc3NpYmxlSW1wb3J0Tm93SG9va01ha2VyLFxuICAgIHBhcnNlckZvckxhbmd1YWdlOiBwYXJzZXJGb3JMYW5ndWFnZU9wdGlvbiA9IHt9LFxuICAgIGdsb2JhbHMgPSB7fSxcbiAgICB0cmFuc2Zvcm1zID0gW10sXG4gICAgbW9kdWxlVHJhbnNmb3JtcyxcbiAgICBzeW5jTW9kdWxlVHJhbnNmb3JtcyxcbiAgICBfX3NoaW1UcmFuc2Zvcm1zX18gPSBbXSxcbiAgICBfX25hdGl2ZV9fID0gZmFsc2UsXG4gICAgYXJjaGl2ZU9ubHkgPSBmYWxzZSxcbiAgICBDb21wYXJ0bWVudCA9IGRlZmF1bHRDb21wYXJ0bWVudCxcbiAgfSA9IG9wdGlvbnM7XG5cbiAgY29uc3QgeyBjb21wYXJ0bWVudDogZW50cnlDb21wYXJ0bWVudE5hbWUgfSA9IGVudHJ5O1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBjb21wYXJ0bWVudHMgPSBjcmVhdGUobnVsbCk7XG5cbiAgLypcblxuICAgKi9cbiAgY29uc3QgYXR0ZW51YXRvcnMgPSBtYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyKFxuICAgIGNvbXBhcnRtZW50cyxcbiAgICBjb21wYXJ0bWVudERlc2NyaXB0b3JzLFxuICApO1xuXG4gIGNvbnN0IHBlbmRpbmdKb2JzID0gW107XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3QgcGFyc2VyRm9yTGFuZ3VhZ2UgPSBmcmVlemUoXG4gICAgYXNzaWduKGNyZWF0ZShudWxsKSwgcGFyc2VyRm9yTGFuZ3VhZ2VPcHRpb24pLFxuICApO1xuXG4gIGNvbnN0IG1hcFBhcnNlcnMgPSBtYWtlTWFwUGFyc2Vycyh7XG4gICAgcGFyc2VyRm9yTGFuZ3VhZ2UsXG4gICAgbW9kdWxlVHJhbnNmb3JtcyxcbiAgICBzeW5jTW9kdWxlVHJhbnNmb3JtcyxcbiAgfSk7XG5cbiAgZm9yIChjb25zdCBbY29tcGFydG1lbnROYW1lLCBjb21wYXJ0bWVudERlc2NyaXB0b3JdIG9mIGVudHJpZXMoXG4gICAgY29tcGFydG1lbnREZXNjcmlwdG9ycyxcbiAgKSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgbmFtZSxcbiAgICAgIHBhcnNlcnM6IGxhbmd1YWdlRm9yRXh0ZW5zaW9uID0ge30sXG4gICAgICB0eXBlczogbGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIgPSB7fSxcbiAgICB9ID0gY29tcGFydG1lbnREZXNjcmlwdG9yO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IHsgc2NvcGVzOiBfc2NvcGVzLCBtb2R1bGVzOiBfbW9kdWxlcyB9ID0gY29tcGFydG1lbnREZXNjcmlwdG9yO1xuICAgIGNvbnN0IG1vZHVsZXMgPSBfbW9kdWxlcyB8fCBjcmVhdGUobnVsbCk7XG4gICAgY29uc3Qgc2NvcGVzID0gX3Njb3BlcyB8fCBjcmVhdGUobnVsbCk7XG5cbiAgICAvL1xuICAgIC8vXG4gICAgY29tcGFydG1lbnREZXNjcmlwdG9yLm1vZHVsZXMgPSBtb2R1bGVzO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IHBhcnNlID0gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKFxuICAgICAgbWFwUGFyc2VycyhsYW5ndWFnZUZvckV4dGVuc2lvbiwgbGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIpXG4gICAgKTtcblxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBjb25zdCBzaG91bGREZWZlckVycm9yID0gbGFuZ3VhZ2UgPT4ge1xuICAgICAgaWYgKGxhbmd1YWdlICYmIGhhcyhwYXJzZXJGb3JMYW5ndWFnZSwgbGFuZ3VhZ2UpKSB7XG4gICAgICAgIHJldHVybiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAocGFyc2VyRm9yTGFuZ3VhZ2VbbGFuZ3VhZ2VdKVxuICAgICAgICAgIC5oZXVyaXN0aWNJbXBvcnRzO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvL1xuICAgIC8vXG4gICAgY29uc3QgcmVzb2x2ZUhvb2sgPSByZXNvbHZlO1xuICAgIGNvbnN0IGltcG9ydEhvb2sgPSBtYWtlSW1wb3J0SG9vayh7XG4gICAgICBwYWNrYWdlTG9jYXRpb246IGxvY2F0aW9uLFxuICAgICAgcGFja2FnZU5hbWU6IG5hbWUsXG4gICAgICBhdHRlbnVhdG9ycyxcbiAgICAgIHBhcnNlLFxuICAgICAgc2hvdWxkRGVmZXJFcnJvcixcbiAgICAgIGNvbXBhcnRtZW50cyxcbiAgICB9KTtcblxuICAgIGNvbnN0IGltcG9ydE5vd0hvb2sgPSBtYWtlSW1wb3J0Tm93SG9vayh7XG4gICAgICBwYWNrYWdlTG9jYXRpb246IGxvY2F0aW9uLFxuICAgICAgcGFja2FnZU5hbWU6IG5hbWUsXG4gICAgICBwYXJzZSxcbiAgICAgIGNvbXBhcnRtZW50cyxcbiAgICB9KTtcblxuICAgIGNvbnN0IG1vZHVsZU1hcEhvb2sgPSBtYWtlTW9kdWxlTWFwSG9vayhcbiAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcixcbiAgICAgIGNvbXBhcnRtZW50cyxcbiAgICAgIGNvbXBhcnRtZW50TmFtZSxcbiAgICAgIG1vZHVsZXMsXG4gICAgICBzY29wZXMsXG4gICAgKTtcblxuICAgIGNvbnN0IGNvbXBhcnRtZW50ID0gbmV3IENvbXBhcnRtZW50KHtcbiAgICAgIG5hbWU6IGxvY2F0aW9uLFxuICAgICAgcmVzb2x2ZUhvb2ssXG4gICAgICBpbXBvcnRIb29rLFxuICAgICAgaW1wb3J0Tm93SG9vayxcbiAgICAgIG1vZHVsZU1hcEhvb2ssXG4gICAgICB0cmFuc2Zvcm1zLFxuICAgICAgX19zaGltVHJhbnNmb3Jtc19fLFxuICAgICAgX19vcHRpb25zX186IHRydWUsXG4gICAgICBfX25hdGl2ZV9fLFxuICAgIH0pO1xuXG4gICAgaWYgKCFhcmNoaXZlT25seSkge1xuICAgICAgYXR0ZW51YXRlR2xvYmFscyhcbiAgICAgICAgY29tcGFydG1lbnQuZ2xvYmFsVGhpcyxcbiAgICAgICAgZ2xvYmFscyxcbiAgICAgICAgY29tcGFydG1lbnREZXNjcmlwdG9yLnBvbGljeSxcbiAgICAgICAgYXR0ZW51YXRvcnMsXG4gICAgICAgIHBlbmRpbmdKb2JzLFxuICAgICAgICBjb21wYXJ0bWVudERlc2NyaXB0b3IubmFtZSxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgY29tcGFydG1lbnRzW2NvbXBhcnRtZW50TmFtZV0gPSBjb21wYXJ0bWVudDtcbiAgfVxuXG4gIGNvbnN0IGNvbXBhcnRtZW50ID0gY29tcGFydG1lbnRzW2VudHJ5Q29tcGFydG1lbnROYW1lXTtcbiAgaWYgKGNvbXBhcnRtZW50ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBDYW5ub3QgYXNzZW1ibGUgY29tcGFydG1lbnQgZ3JhcGggYmVjYXVzZSB0aGUgcm9vdCBjb21wYXJ0bWVudCBuYW1lZCAke3EoXG4gICAgICAgIGVudHJ5Q29tcGFydG1lbnROYW1lLFxuICAgICAgKX0gaXMgbWlzc2luZyBmcm9tIHRoZSBjb21wYXJ0bWVudCBtYXBgLFxuICAgICk7XG4gIH1cbiAgY29uc3QgYXR0ZW51YXRvcnNDb21wYXJ0bWVudCA9IGNvbXBhcnRtZW50c1tBVFRFTlVBVE9SU19DT01QQVJUTUVOVF07XG5cbiAgcmV0dXJuIHtcbiAgICBjb21wYXJ0bWVudCxcbiAgICBjb21wYXJ0bWVudHMsXG4gICAgYXR0ZW51YXRvcnNDb21wYXJ0bWVudCxcbiAgICBwZW5kaW5nSm9ic1Byb21pc2U6IHByb21pc2VBbGxTZXR0bGVkKHBlbmRpbmdKb2JzKS50aGVuKFxuICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyByZXN1bHRzID0+IHtcbiAgICAgICAgY29uc3QgZXJyb3JzID0gcmVzdWx0c1xuICAgICAgICAgIC5maWx0ZXIocmVzdWx0ID0+IHJlc3VsdC5zdGF0dXMgPT09ICdyZWplY3RlZCcpXG4gICAgICAgICAgLm1hcChcbiAgICAgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIHJlc3VsdCA9PlxuICAgICAgICAgICAgICByZXN1bHQucmVhc29uLFxuICAgICAgICAgICk7XG4gICAgICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICAgYEdsb2JhbHMgYXR0ZW51YXRpb24gZXJyb3JzOiAke2Vycm9yc1xuICAgICAgICAgICAgICAubWFwKGVycm9yID0+IGVycm9yLm1lc3NhZ2UpXG4gICAgICAgICAgICAgIC5qb2luKCcsICcpfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApLFxuICB9O1xufTtcblxuLypcblxuXG5cbiAqLyRozY9fb25jZS5saW5rKGxpbmspO1xuICAgICAgIGNvbnN0IGFzc2VtYmxlID0gKGNvbXBhcnRtZW50TWFwLCBvcHRpb25zKSA9PlxuICBsaW5rKGNvbXBhcnRtZW50TWFwLCBvcHRpb25zKS5jb21wYXJ0bWVudDskaM2PX29uY2UuYXNzZW1ibGUoYXNzZW1ibGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibGluayI6WyJsaW5rIl0sImFzc2VtYmxlIjpbImFzc2VtYmxlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANuM78w8FwAAPBcAADEAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9tYXAtcGFyc2VyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3RyYW1wb2xpbmUiLCIuL2V4dGVuc2lvbi5qcyJdLCJleHBvcnRzIjpbIm1ha2VNYXBQYXJzZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgc3luY1RyYW1wb2xpbmUsYXN5bmNUcmFtcG9saW5lLHBhcnNlRXh0ZW5zaW9uOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vdHJhbXBvbGluZVwiLCBbW1wic3luY1RyYW1wb2xpbmVcIixbJGjNj19hID0+IChzeW5jVHJhbXBvbGluZSA9ICRozY9fYSldXSxbXCJhc3luY1RyYW1wb2xpbmVcIixbJGjNj19hID0+IChhc3luY1RyYW1wb2xpbmUgPSAkaM2PX2EpXV1dXSxbXCIuL2V4dGVuc2lvbi5qc1wiLCBbW1wicGFyc2VFeHRlbnNpb25cIixbJGjNj19hID0+IChwYXJzZUV4dGVuc2lvbiA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB7IGVudHJpZXMsIGZyb21FbnRyaWVzLCBrZXlzLCBoYXNPd25Qcm9wZXJ0eSwgdmFsdWVzIH0gPSBPYmplY3Q7XG5jb25zdCB7IGFwcGx5IH0gPSBSZWZsZWN0O1xuLy9cbmNvbnN0IHEgPSBKU09OLnN0cmluZ2lmeTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgaGFzID0gKG9iamVjdCwga2V5KSA9PiBhcHBseShoYXNPd25Qcm9wZXJ0eSwgb2JqZWN0LCBba2V5XSk7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgZXh0ZW5zaW9uSW1wbGllc0xhbmd1YWdlID0gZXh0ZW5zaW9uID0+IGV4dGVuc2lvbiAhPT0gJ2pzJztcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VFeHRlbnNpb25QYXJzZXIgPSAoXG4gIHByZWZlclN5bmNocm9ub3VzLFxuICBsYW5ndWFnZUZvckV4dGVuc2lvbixcbiAgbGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIsXG4gIHBhcnNlckZvckxhbmd1YWdlLFxuICBtb2R1bGVUcmFuc2Zvcm1zLFxuICBzeW5jTW9kdWxlVHJhbnNmb3JtcyxcbikgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgdHJhbnNmb3JtcztcblxuICAvKlxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgZnVuY3Rpb24qIGdldFBhcnNlckdlbmVyYXRvcihcbiAgICBieXRlcyxcbiAgICBzcGVjaWZpZXIsXG4gICAgbG9jYXRpb24sXG4gICAgcGFja2FnZUxvY2F0aW9uLFxuICAgIG9wdGlvbnMsXG4gICkge1xuICAgIC8qICAgICAgICAgICAgICAgICAqL1xuICAgIGxldCBsYW5ndWFnZTtcbiAgICBjb25zdCBleHRlbnNpb24gPSBwYXJzZUV4dGVuc2lvbihsb2NhdGlvbik7XG5cbiAgICBpZiAoXG4gICAgICAhZXh0ZW5zaW9uSW1wbGllc0xhbmd1YWdlKGV4dGVuc2lvbikgJiZcbiAgICAgIGhhcyhsYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllciwgc3BlY2lmaWVyKVxuICAgICkge1xuICAgICAgbGFuZ3VhZ2UgPSBsYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllcltzcGVjaWZpZXJdO1xuICAgIH0gZWxzZSB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGxhbmd1YWdlID0gbGFuZ3VhZ2VGb3JFeHRlbnNpb25bZXh0ZW5zaW9uXSB8fCBleHRlbnNpb247XG4gICAgfVxuXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIGxldCBzb3VyY2VNYXA7XG5cbiAgICBpZiAoaGFzKHRyYW5zZm9ybXMsIGxhbmd1YWdlKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgKHtcbiAgICAgICAgICBieXRlcyxcbiAgICAgICAgICBwYXJzZXI6IGxhbmd1YWdlLFxuICAgICAgICAgIHNvdXJjZU1hcCxcbiAgICAgICAgfSA9IHlpZWxkIHRyYW5zZm9ybXNbbGFuZ3VhZ2VdKFxuICAgICAgICAgIGJ5dGVzLFxuICAgICAgICAgIHNwZWNpZmllcixcbiAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICBwYWNrYWdlTG9jYXRpb24sXG4gICAgICAgICAge1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgc291cmNlTWFwLFxuICAgICAgICAgIH0sXG4gICAgICAgICkpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgIGBFcnJvciB0cmFuc2Zvcm1pbmcgJHtxKGxhbmd1YWdlKX0gc291cmNlIGluICR7cShsb2NhdGlvbil9OiAke2Vyci5tZXNzYWdlfWAsXG4gICAgICAgICAgeyBjYXVzZTogZXJyIH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaGFzKHBhcnNlckZvckxhbmd1YWdlLCBsYW5ndWFnZSkpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBgQ2Fubm90IHBhcnNlIG1vZHVsZSAke3NwZWNpZmllcn0gYXQgJHtsb2NhdGlvbn0sIG5vIHBhcnNlciBjb25maWd1cmVkIGZvciB0aGUgbGFuZ3VhZ2UgJHtsYW5ndWFnZX1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgY29uc3QgeyBwYXJzZSB9ID0gcGFyc2VyRm9yTGFuZ3VhZ2VbbGFuZ3VhZ2VdO1xuICAgIHJldHVybiBwYXJzZShieXRlcywgc3BlY2lmaWVyLCBsb2NhdGlvbiwgcGFja2FnZUxvY2F0aW9uLCB7XG4gICAgICBzb3VyY2VNYXAsXG4gICAgICAuLi5vcHRpb25zLFxuICAgIH0pO1xuICB9XG5cbiAgLypcblxuICAgKi9cbiAgY29uc3Qgc3luY1BhcnNlciA9IChieXRlcywgc3BlY2lmaWVyLCBsb2NhdGlvbiwgcGFja2FnZUxvY2F0aW9uLCBvcHRpb25zKSA9PiB7XG4gICAgY29uc3QgcmVzdWx0ID0gc3luY1RyYW1wb2xpbmUoXG4gICAgICBnZXRQYXJzZXJHZW5lcmF0b3IsXG4gICAgICBieXRlcyxcbiAgICAgIHNwZWNpZmllcixcbiAgICAgIGxvY2F0aW9uLFxuICAgICAgcGFja2FnZUxvY2F0aW9uLFxuICAgICAgb3B0aW9ucyxcbiAgICApO1xuICAgIGlmICgndGhlbicgaW4gcmVzdWx0ICYmIHR5cGVvZiByZXN1bHQudGhlbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcbiAgICAgICAgJ1N5bmMgcGFyc2VyIGNhbm5vdCByZXR1cm4gYSBUaGVuYWJsZTsgZW5zdXJlIHBhcnNlciBpcyBhY3R1YWxseSBzeW5jaHJvbm91cycsXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICBzeW5jUGFyc2VyLmlzU3luY1BhcnNlciA9IHRydWU7XG5cbiAgLypcblxuICAgKi9cbiAgY29uc3QgYXN5bmNQYXJzZXIgPSBhc3luYyAoXG4gICAgYnl0ZXMsXG4gICAgc3BlY2lmaWVyLFxuICAgIGxvY2F0aW9uLFxuICAgIHBhY2thZ2VMb2NhdGlvbixcbiAgICBvcHRpb25zLFxuICApID0+IHtcbiAgICByZXR1cm4gYXN5bmNUcmFtcG9saW5lKFxuICAgICAgZ2V0UGFyc2VyR2VuZXJhdG9yLFxuICAgICAgYnl0ZXMsXG4gICAgICBzcGVjaWZpZXIsXG4gICAgICBsb2NhdGlvbixcbiAgICAgIHBhY2thZ2VMb2NhdGlvbixcbiAgICAgIG9wdGlvbnMsXG4gICAgKTtcbiAgfTtcblxuICAvL1xuICAvL1xuICAvL1xuICBpZiAocHJlZmVyU3luY2hyb25vdXMpIHtcbiAgICB0cmFuc2Zvcm1zID0gc3luY01vZHVsZVRyYW5zZm9ybXM7XG4gICAgcmV0dXJuIHN5bmNQYXJzZXI7XG4gIH0gZWxzZSB7XG4gICAgLy9cbiAgICAvL1xuICAgIHRyYW5zZm9ybXMgPSB7XG4gICAgICAuLi5zeW5jTW9kdWxlVHJhbnNmb3JtcyxcbiAgICAgIC4uLm1vZHVsZVRyYW5zZm9ybXMsXG4gICAgfTtcblxuICAgIHJldHVybiBhc3luY1BhcnNlcjtcbiAgfVxufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmZ1bmN0aW9uIG1hcFBhcnNlcnMoXG4gIGxhbmd1YWdlRm9yRXh0ZW5zaW9uLFxuICBsYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllcixcbiAgcGFyc2VyRm9yTGFuZ3VhZ2UsXG4gIG1vZHVsZVRyYW5zZm9ybXMgPSB7fSxcbiAgc3luY01vZHVsZVRyYW5zZm9ybXMgPSB7fSxcbiAgcHJlZmVyU3luY2hyb25vdXMgPSBmYWxzZSxcbikge1xuICBjb25zdCBsYW5ndWFnZUZvckV4dGVuc2lvbkVudHJpZXMgPSBbXTtcbiAgY29uc3QgcHJvYmxlbXMgPSBbXTtcbiAgZm9yIChjb25zdCBbZXh0ZW5zaW9uLCBsYW5ndWFnZV0gb2YgZW50cmllcyhsYW5ndWFnZUZvckV4dGVuc2lvbikpIHtcbiAgICBpZiAoaGFzKHBhcnNlckZvckxhbmd1YWdlLCBsYW5ndWFnZSkpIHtcbiAgICAgIGxhbmd1YWdlRm9yRXh0ZW5zaW9uRW50cmllcy5wdXNoKFtleHRlbnNpb24sIGxhbmd1YWdlXSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByb2JsZW1zLnB1c2goYCR7cShsYW5ndWFnZSl9IGZvciBleHRlbnNpb24gJHtxKGV4dGVuc2lvbil9YCk7XG4gICAgfVxuICB9XG4gIGlmIChwcm9ibGVtcy5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgRXJyb3IoYE5vIHBhcnNlciBhdmFpbGFibGUgZm9yIGxhbmd1YWdlOiAke3Byb2JsZW1zLmpvaW4oJywgJyl9YCk7XG4gIH1cbiAgcmV0dXJuIG1ha2VFeHRlbnNpb25QYXJzZXIoXG4gICAgcHJlZmVyU3luY2hyb25vdXMsXG4gICAgZnJvbUVudHJpZXMobGFuZ3VhZ2VGb3JFeHRlbnNpb25FbnRyaWVzKSxcbiAgICBsYW5ndWFnZUZvck1vZHVsZVNwZWNpZmllcixcbiAgICBwYXJzZXJGb3JMYW5ndWFnZSxcbiAgICBtb2R1bGVUcmFuc2Zvcm1zLFxuICAgIHN5bmNNb2R1bGVUcmFuc2Zvcm1zLFxuICApO1xufVxuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZU1hcFBhcnNlcnMgPSAoe1xuICBwYXJzZXJGb3JMYW5ndWFnZSxcbiAgbW9kdWxlVHJhbnNmb3JtcyxcbiAgc3luY01vZHVsZVRyYW5zZm9ybXMsXG59KSA9PiB7XG4gIC8qXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGFzeW5jUGFyc2VGbiA9IChsYW5ndWFnZUZvckV4dGVuc2lvbiwgbGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIpID0+XG4gICAgbWFwUGFyc2VycyhcbiAgICAgIGxhbmd1YWdlRm9yRXh0ZW5zaW9uLFxuICAgICAgbGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIsXG4gICAgICBwYXJzZXJGb3JMYW5ndWFnZSxcbiAgICAgIG1vZHVsZVRyYW5zZm9ybXMsXG4gICAgICBzeW5jTW9kdWxlVHJhbnNmb3JtcyxcbiAgICApO1xuXG4gIGlmIChtb2R1bGVUcmFuc2Zvcm1zICYmIGtleXMobW9kdWxlVHJhbnNmb3JtcykubGVuZ3RoID4gMCkge1xuICAgIHJldHVybiBhc3luY1BhcnNlRm47XG4gIH1cblxuICAvL1xuICAvL1xuICBpZiAodmFsdWVzKHBhcnNlckZvckxhbmd1YWdlKS5zb21lKCh7IHN5bmNocm9ub3VzIH0pID0+ICFzeW5jaHJvbm91cykpIHtcbiAgICByZXR1cm4gYXN5bmNQYXJzZUZuO1xuICB9XG5cbiAgLypcblxuXG5cblxuICAgKi9cbiAgcmV0dXJuIChsYW5ndWFnZUZvckV4dGVuc2lvbiwgbGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIpID0+XG4gICAgbWFwUGFyc2VycyhcbiAgICAgIGxhbmd1YWdlRm9yRXh0ZW5zaW9uLFxuICAgICAgbGFuZ3VhZ2VGb3JNb2R1bGVTcGVjaWZpZXIsXG4gICAgICBwYXJzZXJGb3JMYW5ndWFnZSxcbiAgICAgIG1vZHVsZVRyYW5zZm9ybXMsXG4gICAgICBzeW5jTW9kdWxlVHJhbnNmb3JtcyxcbiAgICAgIHRydWUsXG4gICAgKTtcbn07JGjNj19vbmNlLm1ha2VNYXBQYXJzZXJzKG1ha2VNYXBQYXJzZXJzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VNYXBQYXJzZXJzIjpbIm1ha2VNYXBQYXJzZXJzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJscmtbPCwAAzwsAADwAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImpvaW4iLCJyZWxhdGl2aXplIiwicmVzb2x2ZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKlxuXG5cblxuICovXG5cbi8vXG5jb25zdCBxID0gSlNPTi5zdHJpbmdpZnk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBzb2x2ZSA9IChzb2x1dGlvbiwgcHJvYmxlbSkgPT4ge1xuICBmb3IgKGNvbnN0IHBhcnQgb2YgcHJvYmxlbSkge1xuICAgIGlmIChwYXJ0ID09PSAnLicgfHwgcGFydCA9PT0gJycpIHtcbiAgICAgIC8vXG4gICAgfSBlbHNlIGlmIChwYXJ0ID09PSAnLi4nKSB7XG4gICAgICBpZiAoc29sdXRpb24ubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHNvbHV0aW9uLnBvcCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzb2x1dGlvbi5wdXNoKHBhcnQpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHJlc29sdmUgPSAoc3BlYywgcmVmZXJyZXIpID0+IHtcbiAgc3BlYyA9IFN0cmluZyhzcGVjIHx8ICcnKTtcbiAgcmVmZXJyZXIgPSBTdHJpbmcocmVmZXJyZXIgfHwgJycpO1xuXG4gIGlmIChzcGVjLnN0YXJ0c1dpdGgoJy8nKSkge1xuICAgIHRocm93IEVycm9yKGBNb2R1bGUgc3BlY2lmaWVyICR7cShzcGVjKX0gbXVzdCBub3QgYmVnaW4gd2l0aCBcIi9cImApO1xuICB9XG4gIGlmICghcmVmZXJyZXIuc3RhcnRzV2l0aCgnLi8nKSkge1xuICAgIHRocm93IEVycm9yKGBNb2R1bGUgcmVmZXJyZXIgJHtxKHJlZmVycmVyKX0gbXVzdCBiZWdpbiB3aXRoIFwiLi9cImApO1xuICB9XG5cbiAgY29uc3Qgc3BlY1BhcnRzID0gc3BlYy5zcGxpdCgnLycpO1xuICBjb25zdCBzb2x1dGlvbiA9IFtdO1xuICBjb25zdCBwcm9ibGVtID0gW107XG4gIGlmIChzcGVjUGFydHNbMF0gPT09ICcuJyB8fCBzcGVjUGFydHNbMF0gPT09ICcuLicpIHtcbiAgICBjb25zdCByZWZlcnJlclBhcnRzID0gcmVmZXJyZXIuc3BsaXQoJy8nKTtcbiAgICBwcm9ibGVtLnB1c2goLi4ucmVmZXJyZXJQYXJ0cyk7XG4gICAgcHJvYmxlbS5wb3AoKTtcbiAgICBzb2x1dGlvbi5wdXNoKCcuJyk7XG4gIH1cbiAgcHJvYmxlbS5wdXNoKC4uLnNwZWNQYXJ0cyk7XG5cbiAgaWYgKCFzb2x2ZShzb2x1dGlvbiwgcHJvYmxlbSkpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBNb2R1bGUgc3BlY2lmaWVyICR7cShzcGVjKX0gdmlhIHJlZmVycmVyICR7cShcbiAgICAgICAgcmVmZXJyZXIsXG4gICAgICApfSBtdXN0IG5vdCB0cmF2ZXJzZSBiZWhpbmQgYW4gZW1wdHkgcGF0aGAsXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBzb2x1dGlvbi5qb2luKCcvJyk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5yZXNvbHZlKHJlc29sdmUpO1xuICAgICAgIGNvbnN0IGpvaW4gPSAoYmFzZSwgc3BlYykgPT4ge1xuICBzcGVjID0gU3RyaW5nKHNwZWMgfHwgJycpO1xuICBiYXNlID0gU3RyaW5nKGJhc2UgfHwgJycpO1xuXG4gIGNvbnN0IHNwZWNQYXJ0cyA9IHNwZWMuc3BsaXQoJy8nKTtcbiAgY29uc3QgYmFzZVBhcnRzID0gYmFzZS5zcGxpdCgnLycpO1xuXG4gIGlmIChzcGVjUGFydHMubGVuZ3RoID4gMSAmJiBzcGVjUGFydHNbMF0gPT09ICcnKSB7XG4gICAgdGhyb3cgRXJyb3IoYE1vZHVsZSBzcGVjaWZpZXIgJHtxKHNwZWMpfSBtdXN0IG5vdCBzdGFydCB3aXRoIFwiL1wiYCk7XG4gIH1cbiAgaWYgKGJhc2VQYXJ0c1swXSA9PT0gJy4nIHx8IGJhc2VQYXJ0c1swXSA9PT0gJy4uJykge1xuICAgIHRocm93IEVycm9yKGBFeHRlcm5hbCBtb2R1bGUgc3BlY2lmaWVyICR7cShiYXNlKX0gbXVzdCBiZSBhYnNvbHV0ZWApO1xuICB9XG4gIGlmIChzcGVjUGFydHNbMF0gIT09ICcuJykge1xuICAgIHRocm93IEVycm9yKGBJbnRlcm5hbCBtb2R1bGUgc3BlY2lmaWVyICR7cShzcGVjKX0gbXVzdCBiZSByZWxhdGl2ZWApO1xuICB9XG5cbiAgY29uc3Qgc29sdXRpb24gPSBbXTtcbiAgaWYgKCFzb2x2ZShzb2x1dGlvbiwgc3BlY1BhcnRzKSkge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgYE1vZHVsZSBzcGVjaWZpZXIgJHtxKHNwZWMpfSB2aWEgYmFzZSAke3EoXG4gICAgICAgIGJhc2UsXG4gICAgICApfSBtdXN0IG5vdCByZWZlciB0byBhIG1vZHVsZSBvdXRzaWRlIG9mIHRoZSBiYXNlYCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIFtiYXNlLCAuLi5zb2x1dGlvbl0uam9pbignLycpO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5qb2luKGpvaW4pO1xuICAgICAgIGNvbnN0IHJlbGF0aXZpemUgPSBzcGVjID0+IHtcbiAgc3BlYyA9IFN0cmluZyhzcGVjIHx8ICcnKTtcblxuICBjb25zdCBzb2x1dGlvbiA9IFtdO1xuICBpZiAoIXNvbHZlKHNvbHV0aW9uLCBzcGVjLnNwbGl0KCcvJykpKSB7XG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICBgTW9kdWxlIHNwZWNpZmllciAke3Eoc3BlYyl9IG11c3Qgbm90IHRyYXZlcnNlIGJlaGluZCBhbiBlbXB0eSBwYXRoYCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIFsnLicsIC4uLnNvbHV0aW9uXS5qb2luKCcvJyk7XG59OyRozY9fb25jZS5yZWxhdGl2aXplKHJlbGF0aXZpemUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicmVzb2x2ZSI6WyJyZXNvbHZlIl0sImpvaW4iOlsiam9pbiJdLCJyZWxhdGl2aXplIjpbInJlbGF0aXZpemUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAuCqLH04FAABOBQAAMgAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3BhcnNlLWJ5dGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJkZWZhdWx0IiwicGFyc2VCeXRlcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKlxuXG5cbiAqL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuICovXG5jb25zdCBmcmVlemUgPSBPYmplY3QuZnJlZXplO1xuXG4vKiAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgcGFyc2VCeXRlcyA9IChieXRlcywgX3NwZWNpZmllciwgX2xvY2F0aW9uLCBfcGFja2FnZUxvY2F0aW9uKSA9PiB7XG4gIC8vXG4gIGNvbnN0IGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcihieXRlcy5sZW5ndGgpO1xuICBjb25zdCBieXRlc1ZpZXcgPSBuZXcgVWludDhBcnJheShidWZmZXIpO1xuICBieXRlc1ZpZXcuc2V0KGJ5dGVzKTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGltcG9ydHMgPSBmcmVlemUoW10pO1xuXG4gIC8qXG5cbiAgICovXG4gIGNvbnN0IGV4ZWN1dGUgPSBleHBvcnRzID0+IHtcbiAgICBleHBvcnRzLmRlZmF1bHQgPSBidWZmZXI7XG4gIH07XG5cbiAgcmV0dXJuIHtcbiAgICBwYXJzZXI6ICdieXRlcycsXG4gICAgYnl0ZXMsXG4gICAgcmVjb3JkOiBmcmVlemUoe1xuICAgICAgaW1wb3J0cyxcbiAgICAgIGV4cG9ydHM6IGZyZWV6ZShbJ2RlZmF1bHQnXSksXG4gICAgICBleGVjdXRlOiBmcmVlemUoZXhlY3V0ZSksXG4gICAgfSksXG4gIH07XG59O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5wYXJzZUJ5dGVzKHBhcnNlQnl0ZXMpO1xuY29uc3R7ZGVmYXVsdDokY82PX2RlZmF1bHR9PXtkZWZhdWx0OntcbiAgcGFyc2U6IHBhcnNlQnl0ZXMsXG4gIGhldXJpc3RpY0ltcG9ydHM6IGZhbHNlLFxuICBzeW5jaHJvbm91czogdHJ1ZSxcbn19OyRozY9fb25jZS5kZWZhdWx0KCRjzY9fZGVmYXVsdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXSwicGFyc2VCeXRlcyI6WyJwYXJzZUJ5dGVzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHU1Ym6pEwAAqRMAAEYAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9wYXJzZS1janMtc2hhcmVkLWV4cG9ydC13cmFwcGVyLmpzeyJpbXBvcnRzIjpbIi4vcG93ZXJzLmpzIl0sImV4cG9ydHMiOlsiZ2V0TW9kdWxlUGF0aHMiLCJ3cmFwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMsaXNSZWFkTm93UG93ZXJzOyRozY9faW1wb3J0cyhbW1wiLi9wb3dlcnMuanNcIiwgW1tcImZpbmRJbnZhbGlkUmVhZE5vd1Bvd2Vyc1Byb3BzXCIsWyRozY9fYSA9PiAoZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMgPSAkaM2PX2EpXV0sW1wiaXNSZWFkTm93UG93ZXJzXCIsWyRozY9fYSA9PiAoaXNSZWFkTm93UG93ZXJzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgYXBwbHkgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGZyZWV6ZSwga2V5cywgY3JlYXRlLCBoYXNPd25Qcm9wZXJ0eSwgZGVmaW5lUHJvcGVydHkgfSA9IE9iamVjdDtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgaGFzID0gKG9iamVjdCwga2V5KSA9PiBhcHBseShoYXNPd25Qcm9wZXJ0eSwgb2JqZWN0LCBba2V5XSk7XG5cbi8qXG5cbiAqL1xuY29uc3Qgbm9UcmFpbGluZ1NsYXNoID0gcGF0aCA9PiB7XG4gIGNvbnN0IGwgPSBwYXRoLmxlbmd0aCAtIDE7XG4gIHJldHVybiBwYXRoW2xdID09PSAnXFxcXCcgfHwgcGF0aFtsXSA9PT0gJy8nID8gcGF0aC5zbGljZSgwLCAtMSkgOiBwYXRoO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0TW9kdWxlUGF0aHMgPSAocmVhZFBvd2VycywgbG9jYXRpb24pID0+IHtcbiAgaWYgKFxuICAgIHJlYWRQb3dlcnMgJiZcbiAgICB0eXBlb2YgcmVhZFBvd2VycyAhPT0gJ2Z1bmN0aW9uJyAmJlxuICAgIHJlYWRQb3dlcnMuZmlsZVVSTFRvUGF0aFxuICApIHtcbiAgICBsZXQgZmlsZW5hbWUgPSBsb2NhdGlvbjtcbiAgICBsZXQgZGlybmFtZTtcbiAgICB0cnkge1xuICAgICAgZGlybmFtZSA9IG5ldyBVUkwoJy4vJywgZmlsZW5hbWUpLmhyZWY7XG4gICAgfSBjYXRjaCAoXykge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgZmlsZW5hbWU6IG51bGwsXG4gICAgICAgIGRpcm5hbWU6IG51bGwsXG4gICAgICB9O1xuICAgIH1cblxuICAgIGZpbGVuYW1lID0gcmVhZFBvd2Vycy5maWxlVVJMVG9QYXRoKGZpbGVuYW1lKS50b1N0cmluZygpO1xuICAgIGRpcm5hbWUgPSBub1RyYWlsaW5nU2xhc2gocmVhZFBvd2Vycy5maWxlVVJMVG9QYXRoKGRpcm5hbWUpLnRvU3RyaW5nKCkpO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIGZpbGVuYW1lLFxuICAgICAgZGlybmFtZSxcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiB7XG4gICAgICBmaWxlbmFtZTogbnVsbCxcbiAgICAgIGRpcm5hbWU6IG51bGwsXG4gICAgfTtcbiAgfVxufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5nZXRNb2R1bGVQYXRocyhnZXRNb2R1bGVQYXRocyk7XG4gICAgICAgY29uc3Qgd3JhcCA9ICh7XG4gIG1vZHVsZUVudmlyb25tZW50UmVjb3JkLFxuICBjb21wYXJ0bWVudCxcbiAgcmVzb2x2ZWRJbXBvcnRzLFxuICBsb2NhdGlvbixcbiAgcmVhZFBvd2Vycyxcbn0pID0+IHtcbiAgLy9cbiAgbW9kdWxlRW52aXJvbm1lbnRSZWNvcmQuZGVmYXVsdCA9IGNyZWF0ZShcbiAgICBjb21wYXJ0bWVudC5nbG9iYWxUaGlzLk9iamVjdC5wcm90b3R5cGUsXG4gICk7XG5cbiAgLy9cbiAgLy9cbiAgY29uc3QgcHJvbW90ZVRvTmFtZWRFeHBvcnQgPSAocHJvcCwgdmFsdWUpID0+IHtcbiAgICAvL1xuICAgIGlmIChwcm9wICE9PSAnZGVmYXVsdCcpIHtcbiAgICAgIG1vZHVsZUVudmlyb25tZW50UmVjb3JkW3Byb3BdID0gdmFsdWU7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IHJlZGVmaW5lZCA9IG5ldyBTZXQoKTtcblxuICBjb25zdCBvcmlnaW5hbEV4cG9ydHMgPSBuZXcgUHJveHkobW9kdWxlRW52aXJvbm1lbnRSZWNvcmQuZGVmYXVsdCwge1xuICAgIHNldChfdGFyZ2V0LCBwcm9wLCB2YWx1ZSkge1xuICAgICAgcHJvbW90ZVRvTmFtZWRFeHBvcnQocHJvcCwgdmFsdWUpO1xuICAgICAgbW9kdWxlRW52aXJvbm1lbnRSZWNvcmQuZGVmYXVsdFtwcm9wXSA9IHZhbHVlO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHByb3AsIGRlc2NyaXB0b3IpIHtcbiAgICAgIGlmIChoYXMoZGVzY3JpcHRvciwgJ3ZhbHVlJykpIHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgcHJvbW90ZVRvTmFtZWRFeHBvcnQocHJvcCwgZGVzY3JpcHRvci52YWx1ZSk7XG4gICAgICB9XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcCwgZGVzY3JpcHRvcik7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHJlZGVmaW5lZC5hZGQocHJvcCk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICB9KTtcblxuICBjb25zdCBtb2R1bGUgPSB7IGV4cG9ydHM6IG9yaWdpbmFsRXhwb3J0cyB9O1xuXG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHJlcXVpcmUgPSBpbXBvcnRTcGVjaWZpZXIgPT4ge1xuICAgIC8vXG5cbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBsZXQgbmFtZXNwYWNlO1xuXG4gICAgaWYgKCFoYXMocmVzb2x2ZWRJbXBvcnRzLCBpbXBvcnRTcGVjaWZpZXIpKSB7XG4gICAgICBpZiAoaXNSZWFkTm93UG93ZXJzKHJlYWRQb3dlcnMpKSB7XG4gICAgICAgIG5hbWVzcGFjZSA9IGNvbXBhcnRtZW50LmltcG9ydE5vdyhpbXBvcnRTcGVjaWZpZXIpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3QgaW52YWxpZFByb3BzID0gZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMocmVhZFBvd2Vycykuc29ydCgpO1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgYFN5bmNocm9ub3VzIHJlYWRQb3dlcnMgcmVxdWlyZWQgZm9yIGR5bmFtaWMgaW1wb3J0IG9mICR7YXNzZXJ0LnF1b3RlKGltcG9ydFNwZWNpZmllcil9OyBtaXNzaW5nIG9yIGludmFsaWQgcHJvcChzKTogJHtpbnZhbGlkUHJvcHMuam9pbignLCAnKX1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBuYW1lc3BhY2UgPSBjb21wYXJ0bWVudC5pbXBvcnROb3cocmVzb2x2ZWRJbXBvcnRzW2ltcG9ydFNwZWNpZmllcl0pO1xuICAgIH1cblxuICAgIC8vXG4gICAgLy9cbiAgICBpZiAoaGFzKG5hbWVzcGFjZSwgJ2RlZmF1bHQnKSkge1xuICAgICAgcmV0dXJuIG5hbWVzcGFjZS5kZWZhdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gbmFtZXNwYWNlO1xuICAgIH1cbiAgfTtcbiAgaWYgKHR5cGVvZiByZWFkUG93ZXJzID09PSAnb2JqZWN0JyAmJiByZWFkUG93ZXJzLnJlcXVpcmVSZXNvbHZlKSB7XG4gICAgY29uc3QgeyByZXF1aXJlUmVzb2x2ZSB9ID0gcmVhZFBvd2VycztcbiAgICByZXF1aXJlLnJlc29sdmUgPSBmcmVlemUoKHNwZWNpZmllciwgb3B0aW9ucykgPT5cbiAgICAgIHJlcXVpcmVSZXNvbHZlKGxvY2F0aW9uLCBzcGVjaWZpZXIsIG9wdGlvbnMpLFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgcmVxdWlyZS5yZXNvbHZlID0gZnJlZXplKHNwZWNpZmllciA9PiB7XG4gICAgICBjb25zdCBlcnJvciA9IEVycm9yKFxuICAgICAgICBgQ2Fubm90IGZpbmQgbW9kdWxlICcke3NwZWNpZmllcn0nXFxuQWRkIHJlcXVpcmVSZXNvbHZlIHRvIEVuZG8gQ29tcGFydG1lbnQgTWFwcGVyIHJlYWRQb3dlcnMuYCxcbiAgICAgICk7XG4gICAgICBkZWZpbmVQcm9wZXJ0eShlcnJvciwgJ2NvZGUnLCB7IHZhbHVlOiAnTU9EVUxFX05PVF9GT1VORCcgfSk7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9KTtcbiAgfVxuXG4gIGZyZWV6ZShyZXF1aXJlKTtcblxuICBjb25zdCBhZnRlckV4ZWN1dGUgPSAoKSA9PiB7XG4gICAgY29uc3QgZmluYWxFeHBvcnRzID0gbW9kdWxlLmV4cG9ydHM7IC8vXG4gICAgY29uc3QgZXhwb3J0c0hhdmVCZWVuT3ZlcndyaXR0ZW4gPSBmaW5hbEV4cG9ydHMgIT09IG9yaWdpbmFsRXhwb3J0cztcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBpZiAoZXhwb3J0c0hhdmVCZWVuT3ZlcndyaXR0ZW4pIHtcbiAgICAgIG1vZHVsZUVudmlyb25tZW50UmVjb3JkLmRlZmF1bHQgPSBmaW5hbEV4cG9ydHM7XG4gICAgICBmb3IgKGNvbnN0IHByb3Agb2Yga2V5cyhtb2R1bGVFbnZpcm9ubWVudFJlY29yZC5kZWZhdWx0IHx8IHt9KSkge1xuICAgICAgICBpZiAocHJvcCAhPT0gJ2RlZmF1bHQnKSB7XG4gICAgICAgICAgbW9kdWxlRW52aXJvbm1lbnRSZWNvcmRbcHJvcF0gPSBtb2R1bGVFbnZpcm9ubWVudFJlY29yZC5kZWZhdWx0W3Byb3BdO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoY29uc3QgcHJvcCBvZiByZWRlZmluZWQpIHtcbiAgICAgICAgbW9kdWxlRW52aXJvbm1lbnRSZWNvcmRbcHJvcF0gPSBtb2R1bGVFbnZpcm9ubWVudFJlY29yZC5kZWZhdWx0W3Byb3BdO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICByZXR1cm4ge1xuICAgIG1vZHVsZSxcbiAgICBtb2R1bGVFeHBvcnRzOiBvcmlnaW5hbEV4cG9ydHMsXG4gICAgYWZ0ZXJFeGVjdXRlLFxuICAgIHJlcXVpcmUsXG4gIH07XG59OyRozY9fb25jZS53cmFwKHdyYXApO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0TW9kdWxlUGF0aHMiOlsiZ2V0TW9kdWxlUGF0aHMiXSwid3JhcCI6WyJ3cmFwIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAH6/VuZEBQAARAUAADEAAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9wYXJzZS1qc29uLmpzeyJpbXBvcnRzIjpbIi4vanNvbi5qcyJdLCJleHBvcnRzIjpbImRlZmF1bHQiLCJwYXJzZUpzb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBwYXJzZUxvY2F0ZWRKc29uOyRozY9faW1wb3J0cyhbW1wiLi9qc29uLmpzXCIsIFtbXCJwYXJzZUxvY2F0ZWRKc29uXCIsWyRozY9fYSA9PiAocGFyc2VMb2NhdGVkSnNvbiA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuLypcblxuXG5cblxuICovXG5jb25zdCBmcmVlemUgPSBPYmplY3QuZnJlZXplO1xuXG5jb25zdCB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKiAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgcGFyc2VKc29uID0gKGJ5dGVzLCBfc3BlY2lmaWVyLCBsb2NhdGlvbiwgX3BhY2thZ2VMb2NhdGlvbikgPT4ge1xuICBjb25zdCBzb3VyY2UgPSB0ZXh0RGVjb2Rlci5kZWNvZGUoYnl0ZXMpO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IGltcG9ydHMgPSBmcmVlemUoW10pO1xuXG4gIC8qXG5cbiAgICovXG4gIGNvbnN0IGV4ZWN1dGUgPSBleHBvcnRzID0+IHtcbiAgICBleHBvcnRzLmRlZmF1bHQgPSBwYXJzZUxvY2F0ZWRKc29uKHNvdXJjZSwgbG9jYXRpb24pO1xuICB9O1xuICByZXR1cm4ge1xuICAgIHBhcnNlcjogJ2pzb24nLFxuICAgIGJ5dGVzLFxuICAgIHJlY29yZDogZnJlZXplKHtcbiAgICAgIGltcG9ydHMsXG4gICAgICBleHBvcnRzOiBmcmVlemUoWydkZWZhdWx0J10pLFxuICAgICAgZXhlY3V0ZTogZnJlZXplKGV4ZWN1dGUpLFxuICAgIH0pLFxuICB9O1xufTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UucGFyc2VKc29uKHBhcnNlSnNvbik7XG5jb25zdHtkZWZhdWx0OiRjzY9fZGVmYXVsdH09e2RlZmF1bHQ6e1xuICBwYXJzZTogcGFyc2VKc29uLFxuICBoZXVyaXN0aWNJbXBvcnRzOiBmYWxzZSxcbiAgc3luY2hyb25vdXM6IHRydWUsXG59fTskaM2PX29uY2UuZGVmYXVsdCgkY82PX2RlZmF1bHQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il0sInBhcnNlSnNvbiI6WyJwYXJzZUpzb24iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAk1bSVB4IAAAeCAAANAAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3BhcnNlLXByZS1janMuanN7ImltcG9ydHMiOlsiLi9qc29uLmpzIiwiLi9wYXJzZS1janMtc2hhcmVkLWV4cG9ydC13cmFwcGVyLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdCIsInBhcnNlUHJlQ2pzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcGFyc2VMb2NhdGVkSnNvbix3cmFwLGdldE1vZHVsZVBhdGhzOyRozY9faW1wb3J0cyhbW1wiLi9qc29uLmpzXCIsIFtbXCJwYXJzZUxvY2F0ZWRKc29uXCIsWyRozY9fYSA9PiAocGFyc2VMb2NhdGVkSnNvbiA9ICRozY9fYSldXV1dLFtcIi4vcGFyc2UtY2pzLXNoYXJlZC1leHBvcnQtd3JhcHBlci5qc1wiLCBbW1wid3JhcFwiLFskaM2PX2EgPT4gKHdyYXAgPSAkaM2PX2EpXV0sW1wiZ2V0TW9kdWxlUGF0aHNcIixbJGjNj19hID0+IChnZXRNb2R1bGVQYXRocyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKiAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgcGFyc2VQcmVDanMgPSAoXG4gIGJ5dGVzLFxuICBfc3BlY2lmaWVyLFxuICBsb2NhdGlvbixcbiAgX3BhY2thZ2VMb2NhdGlvbixcbiAgeyByZWFkUG93ZXJzIH0gPSB7fSxcbikgPT4ge1xuICBjb25zdCB0ZXh0ID0gdGV4dERlY29kZXIuZGVjb2RlKGJ5dGVzKTtcbiAgY29uc3QgeyBzb3VyY2UsIGltcG9ydHMsIGV4cG9ydHMsIHJlZXhwb3J0cyB9ID0gcGFyc2VMb2NhdGVkSnNvbihcbiAgICB0ZXh0LFxuICAgIGxvY2F0aW9uLFxuICApO1xuXG4gIGNvbnN0IHsgZmlsZW5hbWUsIGRpcm5hbWUgfSA9IGdldE1vZHVsZVBhdGhzKHJlYWRQb3dlcnMsIGxvY2F0aW9uKTtcblxuICAvKlxuXG5cblxuICAgKi9cbiAgY29uc3QgZXhlY3V0ZSA9IChtb2R1bGVFbnZpcm9ubWVudFJlY29yZCwgY29tcGFydG1lbnQsIHJlc29sdmVkSW1wb3J0cykgPT4ge1xuICAgIGNvbnN0IGZ1bmN0b3IgPSBjb21wYXJ0bWVudC5ldmFsdWF0ZShzb3VyY2UpO1xuXG4gICAgY29uc3QgeyByZXF1aXJlLCBtb2R1bGVFeHBvcnRzLCBtb2R1bGUsIGFmdGVyRXhlY3V0ZSB9ID0gd3JhcCh7XG4gICAgICBtb2R1bGVFbnZpcm9ubWVudFJlY29yZCxcbiAgICAgIGNvbXBhcnRtZW50LFxuICAgICAgcmVzb2x2ZWRJbXBvcnRzLFxuICAgICAgbG9jYXRpb24sXG4gICAgICByZWFkUG93ZXJzLFxuICAgIH0pO1xuXG4gICAgLy9cbiAgICBmdW5jdG9yLmNhbGwoXG4gICAgICBtb2R1bGVFeHBvcnRzLFxuICAgICAgcmVxdWlyZSxcbiAgICAgIG1vZHVsZUV4cG9ydHMsXG4gICAgICBtb2R1bGUsXG4gICAgICBmaWxlbmFtZSxcbiAgICAgIGRpcm5hbWUsXG4gICAgKTtcblxuICAgIGFmdGVyRXhlY3V0ZSgpO1xuICB9O1xuXG4gIHJldHVybiB7XG4gICAgcGFyc2VyOiAncHJlLWNqcy1qc29uJyxcbiAgICBieXRlcyxcbiAgICByZWNvcmQ6IHtcbiAgICAgIGltcG9ydHMsXG4gICAgICByZWV4cG9ydHMsXG4gICAgICBleHBvcnRzLFxuICAgICAgZXhlY3V0ZSxcbiAgICB9LFxuICB9O1xufTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UucGFyc2VQcmVDanMocGFyc2VQcmVDanMpO1xuY29uc3R7ZGVmYXVsdDokY82PX2RlZmF1bHR9PXtkZWZhdWx0OntcbiAgcGFyc2U6IHBhcnNlUHJlQ2pzLFxuICBoZXVyaXN0aWNJbXBvcnRzOiB0cnVlLFxuICBzeW5jaHJvbm91czogdHJ1ZSxcbn19OyRozY9fb25jZS5kZWZhdWx0KCRjzY9fZGVmYXVsdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXSwicGFyc2VQcmVDanMiOlsicGFyc2VQcmVDanMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA7KidoVEFAABRBQAANAAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3BhcnNlLXByZS1tanMuanN7ImltcG9ydHMiOlsiLi9qc29uLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdCIsInBhcnNlUHJlTWpzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcGFyc2VMb2NhdGVkSnNvbjskaM2PX2ltcG9ydHMoW1tcIi4vanNvbi5qc1wiLCBbW1wicGFyc2VMb2NhdGVkSnNvblwiLFskaM2PX2EgPT4gKHBhcnNlTG9jYXRlZEpzb24gPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKiAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgcGFyc2VQcmVNanMgPSAoXG4gIGJ5dGVzLFxuICBfc3BlY2lmaWVyLFxuICBsb2NhdGlvbixcbiAgX3BhY2thZ2VMb2NhdGlvbixcbiAgeyBzb3VyY2VNYXBVcmwgfSA9IHt9LFxuKSA9PiB7XG4gIGNvbnN0IHRleHQgPSB0ZXh0RGVjb2Rlci5kZWNvZGUoYnl0ZXMpO1xuICBjb25zdCByZWNvcmQgPSBwYXJzZUxvY2F0ZWRKc29uKHRleHQsIGxvY2F0aW9uKTtcbiAgaWYgKHNvdXJjZU1hcFVybCkge1xuICAgIC8vXG4gICAgcmVjb3JkLl9fc3luY01vZHVsZVByb2dyYW1fXyArPSBgLy8jIHNvdXJjZU1hcHBpbmdVUkw9JHtzb3VyY2VNYXBVcmx9XFxuYDtcbiAgfSBlbHNlIHtcbiAgICAvL1xuICAgIHJlY29yZC5fX3N5bmNNb2R1bGVQcm9ncmFtX18gKz0gYC8vIyBzb3VyY2VVUkw9JHtsb2NhdGlvbn1cXG5gO1xuICB9XG4gIHJldHVybiB7XG4gICAgcGFyc2VyOiAncHJlLW1qcy1qc29uJyxcbiAgICBieXRlcyxcbiAgICByZWNvcmQsXG4gIH07XG59O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyRozY9fb25jZS5wYXJzZVByZU1qcyhwYXJzZVByZU1qcyk7XG5jb25zdHtkZWZhdWx0OiRjzY9fZGVmYXVsdH09e2RlZmF1bHQ6e1xuICBwYXJzZTogcGFyc2VQcmVNanMsXG4gIGhldXJpc3RpY0ltcG9ydHM6IGZhbHNlLFxuICBzeW5jaHJvbm91czogdHJ1ZSxcbn19OyRozY9fb25jZS5kZWZhdWx0KCRjzY9fZGVmYXVsdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXSwicGFyc2VQcmVNanMiOlsicGFyc2VQcmVNanMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAdmA97PoEAAD6BAAAMQAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3BhcnNlLXRleHQuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImRlZmF1bHQiLCJwYXJzZVRleHQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LypcblxuXG5cbiAqL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cblxuICovXG5jb25zdCBmcmVlemUgPSBPYmplY3QuZnJlZXplO1xuXG5jb25zdCB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKiAgICAgICAgICAgICAgICAgICovXG4gICAgICAgY29uc3QgcGFyc2VUZXh0ID0gKGJ5dGVzLCBfc3BlY2lmaWVyLCBfbG9jYXRpb24sIF9wYWNrYWdlTG9jYXRpb24pID0+IHtcbiAgY29uc3QgdGV4dCA9IHRleHREZWNvZGVyLmRlY29kZShieXRlcyk7XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBpbXBvcnRzID0gZnJlZXplKFtdKTtcblxuICAvKlxuXG4gICAqL1xuICBjb25zdCBleGVjdXRlID0gZXhwb3J0cyA9PiB7XG4gICAgZXhwb3J0cy5kZWZhdWx0ID0gdGV4dDtcbiAgfTtcblxuICByZXR1cm4ge1xuICAgIHBhcnNlcjogJ3RleHQnLFxuICAgIGJ5dGVzLFxuICAgIHJlY29yZDogZnJlZXplKHtcbiAgICAgIGltcG9ydHMsXG4gICAgICBleHBvcnRzOiBmcmVlemUoWydkZWZhdWx0J10pLFxuICAgICAgZXhlY3V0ZTogZnJlZXplKGV4ZWN1dGUpLFxuICAgIH0pLFxuICB9O1xufTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UucGFyc2VUZXh0KHBhcnNlVGV4dCk7XG5jb25zdHtkZWZhdWx0OiRjzY9fZGVmYXVsdH09e2RlZmF1bHQ6e1xuICBwYXJzZTogcGFyc2VUZXh0LFxuICBoZXVyaXN0aWNJbXBvcnRzOiBmYWxzZSxcbiAgc3luY2hyb25vdXM6IHRydWUsXG59fTskaM2PX29uY2UuZGVmYXVsdCgkY82PX2RlZmF1bHQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il0sInBhcnNlVGV4dCI6WyJwYXJzZVRleHQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAABuT8atUYAADVGAAANAAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3BvbGljeS1mb3JtYXQuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImFzc2VydFBhY2thZ2VQb2xpY3kiLCJhc3NlcnRQb2xpY3kiLCJnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24iLCJpc0FsbG93aW5nRXZlcnl0aGluZyIsImlzQXR0ZW51YXRpb25EZWZpbml0aW9uIiwicG9saWN5TG9va3VwSGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qXG5cblxuICovXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuY29uc3QgeyBlbnRyaWVzLCBrZXlzIH0gPSBPYmplY3Q7XG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3QgcSA9IEpTT04uc3RyaW5naWZ5O1xuXG5jb25zdCBBVFRFTlVBVE9SX0tFWSA9ICdhdHRlbnVhdGUnO1xuY29uc3QgQVRURU5VQVRPUl9QQVJBTVNfS0VZID0gJ3BhcmFtcyc7XG5jb25zdCBXSUxEQ0FSRF9QT0xJQ1lfVkFMVUUgPSAnYW55JztcbmNvbnN0IFBPTElDWV9GSUVMRFNfTE9PS1VQID0gLyogICAgICAgICAgICAgICAgKi8gKFtcbiAgJ2J1aWx0aW5zJyxcbiAgJ2dsb2JhbHMnLFxuICAncGFja2FnZXMnLFxuXSk7XG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcG9saWN5TG9va3VwSGVscGVyID0gKHBhY2thZ2VQb2xpY3ksIGZpZWxkLCBpdGVtTmFtZSkgPT4ge1xuICBpZiAoIVBPTElDWV9GSUVMRFNfTE9PS1VQLmluY2x1ZGVzKGZpZWxkKSkge1xuICAgIHRocm93IEVycm9yKGBJbnZhbGlkIGZpZWxkICR7cShmaWVsZCl9YCk7XG4gIH1cbiAgaWYgKFxuICAgIHR5cGVvZiBwYWNrYWdlUG9saWN5ICE9PSAnb2JqZWN0JyB8fFxuICAgIHBhY2thZ2VQb2xpY3kgPT09IG51bGwgfHxcbiAgICAhcGFja2FnZVBvbGljeVtmaWVsZF1cbiAgKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKHBhY2thZ2VQb2xpY3lbZmllbGRdID09PSBXSUxEQ0FSRF9QT0xJQ1lfVkFMVUUpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGNvbnN0IHZhbHVlID0gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChcbiAgICBwYWNrYWdlUG9saWN5W2ZpZWxkXVxuICApO1xuICBpZiAoaXRlbU5hbWUgaW4gdmFsdWUpIHtcbiAgICByZXR1cm4gdmFsdWVbaXRlbU5hbWVdO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn07XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS5wb2xpY3lMb29rdXBIZWxwZXIocG9saWN5TG9va3VwSGVscGVyKTtcbiAgICAgICBjb25zdCBpc0FsbG93aW5nRXZlcnl0aGluZyA9IHBvbGljeVZhbHVlID0+XG4gIHBvbGljeVZhbHVlID09PSBXSUxEQ0FSRF9QT0xJQ1lfVkFMVUU7XG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UuaXNBbGxvd2luZ0V2ZXJ5dGhpbmcoaXNBbGxvd2luZ0V2ZXJ5dGhpbmcpO1xuICAgICAgIGNvbnN0IGlzQXR0ZW51YXRpb25EZWZpbml0aW9uID0gYWxsZWdlZERlZmluaXRpb24gPT4ge1xuICByZXR1cm4gQm9vbGVhbihcbiAgICAoYWxsZWdlZERlZmluaXRpb24gJiZcbiAgICAgIHR5cGVvZiBhbGxlZ2VkRGVmaW5pdGlvbiA9PT0gJ29iamVjdCcgJiZcbiAgICAgIHR5cGVvZiBhbGxlZ2VkRGVmaW5pdGlvbltBVFRFTlVBVE9SX0tFWV0gPT09ICdzdHJpbmcnKSB8fCAvL1xuICAgICAgaXNBcnJheShhbGxlZ2VkRGVmaW5pdGlvbikgIC8vXG4gICk7XG59O1xuXG4vKlxuXG5cblxuICovJGjNj19vbmNlLmlzQXR0ZW51YXRpb25EZWZpbml0aW9uKGlzQXR0ZW51YXRpb25EZWZpbml0aW9uKTtcbiAgICAgICBjb25zdCBnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24gPSBhdHRlbnVhdGlvbkRlZmluaXRpb24gPT4ge1xuICBpZiAoIWlzQXR0ZW51YXRpb25EZWZpbml0aW9uKGF0dGVudWF0aW9uRGVmaW5pdGlvbikpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBJbnZhbGlkIGF0dGVudWF0aW9uICR7cShcbiAgICAgICAgYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuICAgICAgKX0sIG11c3QgYmUgYW4gYXJyYXkgb2YgcGFyYW1zIGZvciBkZWZhdWx0IGF0dGVudWF0b3Igb3IgYW4gb2JqZWN0IHdpdGggYW4gYXR0ZW51YXRvciBrZXlgLFxuICAgICk7XG4gIH1cbiAgaWYgKGlzQXJyYXkoYXR0ZW51YXRpb25EZWZpbml0aW9uKSkge1xuICAgIHJldHVybiB7XG4gICAgICBkaXNwbGF5TmFtZTogJzxkZWZhdWx0IGF0dGVudWF0b3I+JyxcbiAgICAgIHNwZWNpZmllcjogbnVsbCxcbiAgICAgIHBhcmFtczogYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuICAgIH07XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRpc3BsYXlOYW1lOiBhdHRlbnVhdGlvbkRlZmluaXRpb25bQVRURU5VQVRPUl9LRVldLFxuICAgICAgc3BlY2lmaWVyOiBhdHRlbnVhdGlvbkRlZmluaXRpb25bQVRURU5VQVRPUl9LRVldLFxuICAgICAgcGFyYW1zOiBhdHRlbnVhdGlvbkRlZmluaXRpb25bQVRURU5VQVRPUl9QQVJBTVNfS0VZXSxcbiAgICB9O1xuICB9XG59O1xuXG4vL1xuJGjNj19vbmNlLmdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbihnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24pO2NvbnN0IGlzUmVjb3JkT2Y9KGl0ZW0scHJlZGljYXRlKT0+e1xuICBpZiAodHlwZW9mIGl0ZW0gIT09ICdvYmplY3QnIHx8IGl0ZW0gPT09IG51bGwgfHwgaXNBcnJheShpdGVtKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gZW50cmllcyhpdGVtKS5ldmVyeSgoW2tleSwgdmFsdWVdKSA9PiBwcmVkaWNhdGUodmFsdWUsIGtleSkpO1xufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgaXNCb29sZWFuID0gaXRlbSA9PiB0eXBlb2YgaXRlbSA9PT0gJ2Jvb2xlYW4nO1xuXG4vL1xuY29uc3QgcHJlZGljYXRlT3IgPVxuICAoLi4ucHJlZGljYXRlcykgPT5cbiAgaXRlbSA9PlxuICAgIHByZWRpY2F0ZXMuc29tZShwID0+IHAoaXRlbSkpO1xuXG4vKlxuXG5cbiAqL1xuY29uc3QgaXNQb2xpY3lJdGVtID0gaXRlbSA9PlxuICBpdGVtID09PSB1bmRlZmluZWQgfHxcbiAgaXRlbSA9PT0gV0lMRENBUkRfUE9MSUNZX1ZBTFVFIHx8XG4gIGlzUmVjb3JkT2YoaXRlbSwgaXNCb29sZWFuKTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRQYWNrYWdlUG9saWN5ID0gKGFsbGVnZWRQYWNrYWdlUG9saWN5LCBwYXRoLCB1cmwpID0+IHtcbiAgaWYgKGFsbGVnZWRQYWNrYWdlUG9saWN5ID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3QgaW5VcmwgPSB1cmwgPyBgIGluICR7cSh1cmwpfWAgOiAnJztcblxuICBjb25zdCBwYWNrYWdlUG9saWN5ID0gT2JqZWN0KGFsbGVnZWRQYWNrYWdlUG9saWN5KTtcbiAgYXNzZXJ0KFxuICAgIGFsbGVnZWRQYWNrYWdlUG9saWN5ID09PSBwYWNrYWdlUG9saWN5ICYmICFpc0FycmF5KGFsbGVnZWRQYWNrYWdlUG9saWN5KSxcbiAgICBgJHtwYXRofSBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7cShhbGxlZ2VkUGFja2FnZVBvbGljeSl9JHtpblVybH1gLFxuICApO1xuICBjb25zdCB7XG4gICAgcGFja2FnZXMsXG4gICAgYnVpbHRpbnMsXG4gICAgZ2xvYmFscyxcbiAgICBub0dsb2JhbEZyZWV6ZSxcbiAgICBkZWZhdWx0QXR0ZW51YXRvcjogX2lnbm9yZSwgLy9cbiAgICAvL1xuICAgIG9wdGlvbnMsIC8vXG4gICAgLi4uZXh0cmFcbiAgfSA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChwYWNrYWdlUG9saWN5KTtcblxuICBhc3NlcnQoXG4gICAga2V5cyhleHRyYSkubGVuZ3RoID09PSAwLFxuICAgIGAke3BhdGh9IG11c3Qgbm90IGhhdmUgZXh0cmEgcHJvcGVydGllcywgZ290ICR7cShrZXlzKGV4dHJhKSl9JHtpblVybH1gLFxuICApO1xuXG4gIGFzc2VydChcbiAgICBub0dsb2JhbEZyZWV6ZSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBub0dsb2JhbEZyZWV6ZSA9PT0gJ2Jvb2xlYW4nLFxuICAgIGAke3BhdGh9Lm5vR2xvYmFsRnJlZXplIG11c3QgYmUgYSBib29sZWFuLCBnb3QgJHtxKHtcbiAgICAgIG5vR2xvYmFsRnJlZXplLFxuICAgIH0pfSR7aW5Vcmx9YCxcbiAgKTtcblxuICBpc1BvbGljeUl0ZW0ocGFja2FnZXMpIHx8XG4gICAgYXNzZXJ0LmZhaWwoXG4gICAgICBgJHtwYXRofS5wYWNrYWdlcyBtdXN0IGJlIGEgcmVjb3JkIG9mIGJvb2xlYW5zLCBnb3QgJHtxKHtcbiAgICAgICAgcGFja2FnZXMsXG4gICAgICB9KX0ke2luVXJsfWAsXG4gICAgKTtcblxuICBpc1BvbGljeUl0ZW0oZ2xvYmFscykgfHxcbiAgICBpc0F0dGVudWF0aW9uRGVmaW5pdGlvbihnbG9iYWxzKSB8fFxuICAgIGFzc2VydC5mYWlsKFxuICAgICAgYCR7cGF0aH0uZ2xvYmFscyBtdXN0IGJlIGEgcmVjb3JkIG9mIGJvb2xlYW5zIG9yIGEgc2luZ2xlIGF0dGVudWF0aW9uLCBnb3QgJHtxKFxuICAgICAgICB7XG4gICAgICAgICAgZ2xvYmFscyxcbiAgICAgICAgfSxcbiAgICAgICl9JHtpblVybH1gLFxuICAgICk7XG5cbiAgaXNQb2xpY3lJdGVtKGJ1aWx0aW5zKSB8fFxuICAgIGlzUmVjb3JkT2YoYnVpbHRpbnMsIHByZWRpY2F0ZU9yKGlzQm9vbGVhbiwgaXNBdHRlbnVhdGlvbkRlZmluaXRpb24pKSB8fFxuICAgIGFzc2VydC5mYWlsKFxuICAgICAgYCR7cGF0aH0uYnVpbHRpbnMgbXVzdCBiZSBhIHJlY29yZCBvZiBib29sZWFucyBvciBhdHRlbnVhdGlvbnMsIGdvdCAke3Eoe1xuICAgICAgICBidWlsdGlucyxcbiAgICAgIH0pfSR7aW5Vcmx9YCxcbiAgICApO1xufTtcblxuLypcblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5hc3NlcnRQYWNrYWdlUG9saWN5KGFzc2VydFBhY2thZ2VQb2xpY3kpO1xuICAgICAgIGNvbnN0IGFzc2VydFBvbGljeSA9IGFsbGVnZWRQb2xpY3kgPT4ge1xuICBpZiAoYWxsZWdlZFBvbGljeSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IHBvbGljeSA9IE9iamVjdChhbGxlZ2VkUG9saWN5KTtcbiAgYXNzZXJ0KFxuICAgIGFsbGVnZWRQb2xpY3kgPT09IHBvbGljeSAmJiAhQXJyYXkuaXNBcnJheShwb2xpY3kpLFxuICAgIGBwb2xpY3kgbXVzdCBiZSBhbiBvYmplY3QsIGdvdCAke2FsbGVnZWRQb2xpY3l9YCxcbiAgKTtcblxuICBjb25zdCB7IHJlc291cmNlcywgZW50cnksIGRlZmF1bHRBdHRlbnVhdG9yLCAuLi5leHRyYSB9ID0gcG9saWN5O1xuICBhc3NlcnQoXG4gICAga2V5cyhleHRyYSkubGVuZ3RoID09PSAwLFxuICAgIGBwb2xpY3kgbXVzdCBub3QgaGF2ZSBleHRyYSBwcm9wZXJ0aWVzLCBnb3QgJHtxKGtleXMoZXh0cmEpKX1gLFxuICApO1xuXG4gIGFzc2VydChcbiAgICB0eXBlb2YgcmVzb3VyY2VzID09PSAnb2JqZWN0JyAmJiByZXNvdXJjZXMgIT09IG51bGwgJiYgIWlzQXJyYXkocmVzb3VyY2VzKSxcbiAgICBgcG9saWN5LnJlc291cmNlcyBtdXN0IGJlIGFuIG9iamVjdCwgZ290ICR7cShyZXNvdXJjZXMpfWAsXG4gICk7XG4gIGFzc2VydChcbiAgICAhZGVmYXVsdEF0dGVudWF0b3IgfHwgdHlwZW9mIGRlZmF1bHRBdHRlbnVhdG9yID09PSAnc3RyaW5nJyxcbiAgICBgcG9saWN5LmRlZmF1bHRBdHRlbnVhdG9yIG11c3QgYmUgYSBzdHJpbmcsIGdvdCAke3EoZGVmYXVsdEF0dGVudWF0b3IpfWAsXG4gICk7XG5cbiAgYXNzZXJ0UGFja2FnZVBvbGljeShlbnRyeSwgYHBvbGljeS5lbnRyeWApO1xuXG4gIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIGVudHJpZXMocmVzb3VyY2VzKSkge1xuICAgIGFzc2VydFBhY2thZ2VQb2xpY3kodmFsdWUsIGBwb2xpY3kucmVzb3VyY2VzW1wiJHtrZXl9XCJdYCk7XG4gIH1cbn07JGjNj19vbmNlLmFzc2VydFBvbGljeShhc3NlcnRQb2xpY3kpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicG9saWN5TG9va3VwSGVscGVyIjpbInBvbGljeUxvb2t1cEhlbHBlciJdLCJpc0FsbG93aW5nRXZlcnl0aGluZyI6WyJpc0FsbG93aW5nRXZlcnl0aGluZyJdLCJpc0F0dGVudWF0aW9uRGVmaW5pdGlvbiI6WyJpc0F0dGVudWF0aW9uRGVmaW5pdGlvbiJdLCJnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24iOlsiZ2V0QXR0ZW51YXRvckZyb21EZWZpbml0aW9uIl0sImFzc2VydFBhY2thZ2VQb2xpY3kiOlsiYXNzZXJ0UGFja2FnZVBvbGljeSJdLCJhc3NlcnRQb2xpY3kiOlsiYXNzZXJ0UG9saWN5Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPE/zSY+KgAAPioAAC0AAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9wb2xpY3kuanN7ImltcG9ydHMiOlsiLi9wb2xpY3ktZm9ybWF0LmpzIl0sImV4cG9ydHMiOlsiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQiLCJhdHRlbnVhdGVHbG9iYWxzIiwiYXR0ZW51YXRlTW9kdWxlSG9vayIsImRlcGVuZGVuY3lBbGxvd2VkQnlQb2xpY3kiLCJkZXRlY3RBdHRlbnVhdG9ycyIsImVuZm9yY2VNb2R1bGVQb2xpY3kiLCJnZXRQb2xpY3lGb3JQYWNrYWdlIiwibWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbixpc0FsbG93aW5nRXZlcnl0aGluZyxpc0F0dGVudWF0aW9uRGVmaW5pdGlvbixwb2xpY3lMb29rdXBIZWxwZXI7JGjNj19pbXBvcnRzKFtbXCIuL3BvbGljeS1mb3JtYXQuanNcIiwgW1tcImdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvblwiLFskaM2PX2EgPT4gKGdldEF0dGVudWF0b3JGcm9tRGVmaW5pdGlvbiA9ICRozY9fYSldXSxbXCJpc0FsbG93aW5nRXZlcnl0aGluZ1wiLFskaM2PX2EgPT4gKGlzQWxsb3dpbmdFdmVyeXRoaW5nID0gJGjNj19hKV1dLFtcImlzQXR0ZW51YXRpb25EZWZpbml0aW9uXCIsWyRozY9fYSA9PiAoaXNBdHRlbnVhdGlvbkRlZmluaXRpb24gPSAkaM2PX2EpXV0sW1wicG9saWN5TG9va3VwSGVscGVyXCIsWyRozY9fYSA9PiAocG9saWN5TG9va3VwSGVscGVyID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB7IGNyZWF0ZSwgZW50cmllcywgdmFsdWVzLCBhc3NpZ24sIGZyZWV6ZSwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyB9ID1cbiAgT2JqZWN0O1xuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgcSA9IEpTT04uc3RyaW5naWZ5O1xuXG4vKlxuXG4gKi9cbiAgICAgICBjb25zdCBBVFRFTlVBVE9SU19DT01QQVJUTUVOVCA9ICc8QVRURU5VQVRPUlM+JztcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQoQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQpO1xuY29uc3Qgc2VsZWN0aXZlQ29weSA9IChmcm9tLCB0bywgbGlzdCkgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgcHJvcHM7XG4gIGlmICghbGlzdCkge1xuICAgIGNvbnN0IGRlc2NzID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhmcm9tKTtcbiAgICBwcm9wcyA9IG93bktleXMoZnJvbSkuZmlsdGVyKGtleSA9PiBkZXNjc1trZXldLmVudW1lcmFibGUpO1xuICB9IGVsc2Uge1xuICAgIHByb3BzID0gbGlzdDtcbiAgfVxuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgcHJvcHMubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgY29uc3Qga2V5ID0gcHJvcHNbaW5kZXhdO1xuICAgIC8vXG4gICAgLy9cbiAgICB0b1trZXldID0gZnJvbVtrZXldO1xuICB9XG4gIHJldHVybiB0bztcbn07XG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBjb2xsZWN0QXR0ZW51YXRvcnMgPSAoYXR0ZW51YXRvcnMsIHBvbGljeUZyYWdtZW50KSA9PiB7XG4gIGlmICgnYXR0ZW51YXRlJyBpbiBwb2xpY3lGcmFnbWVudCkge1xuICAgIGF0dGVudWF0b3JzLnB1c2gocG9saWN5RnJhZ21lbnQuYXR0ZW51YXRlKTtcbiAgfVxuICBmb3IgKGNvbnN0IHZhbHVlIG9mIHZhbHVlcyhwb2xpY3lGcmFnbWVudCkpIHtcbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPT0gbnVsbCkge1xuICAgICAgY29sbGVjdEF0dGVudWF0b3JzKGF0dGVudWF0b3JzLCB2YWx1ZSk7XG4gICAgfVxuICB9XG59O1xuXG5jb25zdCBhdHRlbnVhdG9yc0NhY2hlID0gbmV3IFdlYWtNYXAoKTtcblxuLypcblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBkZXRlY3RBdHRlbnVhdG9ycyA9IHBvbGljeSA9PiB7XG4gIGlmICghcG9saWN5KSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIGlmICghYXR0ZW51YXRvcnNDYWNoZS5oYXMocG9saWN5KSkge1xuICAgIGNvbnN0IGF0dGVudWF0b3JzID0gW107XG4gICAgaWYgKHBvbGljeS5kZWZhdWx0QXR0ZW51YXRvcikge1xuICAgICAgYXR0ZW51YXRvcnMucHVzaChwb2xpY3kuZGVmYXVsdEF0dGVudWF0b3IpO1xuICAgIH1cbiAgICBjb2xsZWN0QXR0ZW51YXRvcnMoYXR0ZW51YXRvcnMsIHBvbGljeSk7XG4gICAgYXR0ZW51YXRvcnNDYWNoZS5zZXQocG9saWN5LCBhdHRlbnVhdG9ycyk7XG4gIH1cbiAgcmV0dXJuIGF0dGVudWF0b3JzQ2FjaGUuZ2V0KHBvbGljeSk7XG59O1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UuZGV0ZWN0QXR0ZW51YXRvcnMoZGV0ZWN0QXR0ZW51YXRvcnMpO1xuY29uc3QgZ2VuZXJhdGVDYW5vbmljYWxOYW1lID0gKHsgaXNFbnRyeSA9IGZhbHNlLCBuYW1lLCBwYXRoIH0pID0+IHtcbiAgaWYgKGlzRW50cnkpIHtcbiAgICB0aHJvdyBFcnJvcignRW50cnkgbW9kdWxlIGNhbm5vdCBiZSBpZGVudGlmaWVkIHdpdGggYSBjYW5vbmljYWxOYW1lJyk7XG4gIH1cbiAgaWYgKG5hbWUgPT09IEFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UKSB7XG4gICAgcmV0dXJuIEFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UO1xuICB9XG4gIHJldHVybiBwYXRoLmpvaW4oJz4nKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBkZXBlbmRlbmN5QWxsb3dlZEJ5UG9saWN5ID0gKG5hbWluZ0tpdCwgcGFja2FnZVBvbGljeSkgPT4ge1xuICBpZiAobmFtaW5nS2l0LmlzRW50cnkpIHtcbiAgICAvL1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBjYW5vbmljYWxOYW1lID0gZ2VuZXJhdGVDYW5vbmljYWxOYW1lKG5hbWluZ0tpdCk7XG4gIHJldHVybiAhIXBvbGljeUxvb2t1cEhlbHBlcihwYWNrYWdlUG9saWN5LCAncGFja2FnZXMnLCBjYW5vbmljYWxOYW1lKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UuZGVwZW5kZW5jeUFsbG93ZWRCeVBvbGljeShkZXBlbmRlbmN5QWxsb3dlZEJ5UG9saWN5KTtcbiAgICAgICBjb25zdCBnZXRQb2xpY3lGb3JQYWNrYWdlID0gKG5hbWluZ0tpdCwgcG9saWN5KSA9PiB7XG4gIGlmICghcG9saWN5KSB7XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuICBpZiAobmFtaW5nS2l0LmlzRW50cnkpIHtcbiAgICByZXR1cm4gcG9saWN5LmVudHJ5O1xuICB9XG4gIGNvbnN0IGNhbm9uaWNhbE5hbWUgPSBnZW5lcmF0ZUNhbm9uaWNhbE5hbWUobmFtaW5nS2l0KTtcbiAgaWYgKGNhbm9uaWNhbE5hbWUgPT09IEFUVEVOVUFUT1JTX0NPTVBBUlRNRU5UKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGRlZmF1bHRBdHRlbnVhdG9yOiBwb2xpY3kuZGVmYXVsdEF0dGVudWF0b3IsXG4gICAgICBwYWNrYWdlczogJ2FueScsXG4gICAgfTtcbiAgfVxuICBpZiAocG9saWN5LnJlc291cmNlcyAmJiBwb2xpY3kucmVzb3VyY2VzW2Nhbm9uaWNhbE5hbWVdICE9PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gcG9saWN5LnJlc291cmNlc1tjYW5vbmljYWxOYW1lXTtcbiAgfSBlbHNlIHtcbiAgICAvL1xuICAgIHJldHVybiBjcmVhdGUobnVsbCk7XG4gIH1cbn07XG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UuZ2V0UG9saWN5Rm9yUGFja2FnZShnZXRQb2xpY3lGb3JQYWNrYWdlKTtcbmNvbnN0IGdldEdsb2JhbHNMaXN0ID0gcGFja2FnZVBvbGljeSA9PiB7XG4gIGlmICghcGFja2FnZVBvbGljeSB8fCAhcGFja2FnZVBvbGljeS5nbG9iYWxzKSB7XG4gICAgcmV0dXJuIFtdO1xuICB9XG4gIHJldHVybiBlbnRyaWVzKHBhY2thZ2VQb2xpY3kuZ2xvYmFscylcbiAgICAuZmlsdGVyKChbX2tleSwgdmFsdWVdKSA9PiB2YWx1ZSlcbiAgICAubWFwKChba2V5LCBfdnZhbHVlXSkgPT4ga2V5KTtcbn07XG5cbmNvbnN0IEdMT0JBTF9BVFRFTlVBVE9SID0gJ2F0dGVudWF0ZUdsb2JhbHMnO1xuY29uc3QgTU9EVUxFX0FUVEVOVUFUT1IgPSAnYXR0ZW51YXRlTW9kdWxlJztcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IGltcG9ydEF0dGVudWF0b3JGb3JEZWZpbml0aW9uID0gYXN5bmMgKFxuICBhdHRlbnVhdGlvbkRlZmluaXRpb24sXG4gIGF0dGVudWF0b3JzUHJvdmlkZXIsXG4gIGF0dGVudWF0b3JFeHBvcnROYW1lLFxuKSA9PiB7XG4gIGlmICghYXR0ZW51YXRvcnNQcm92aWRlcikge1xuICAgIHRocm93IEVycm9yKGBhdHRlbnVhdG9yc1Byb3ZpZGVyIGlzIHJlcXVpcmVkIHRvIGltcG9ydCBhdHRlbnVhdG9yc2ApO1xuICB9XG4gIGNvbnN0IHsgc3BlY2lmaWVyLCBwYXJhbXMsIGRpc3BsYXlOYW1lIH0gPSBnZXRBdHRlbnVhdG9yRnJvbURlZmluaXRpb24oXG4gICAgYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuICApO1xuICBjb25zdCBhdHRlbnVhdG9yID0gYXdhaXQgYXR0ZW51YXRvcnNQcm92aWRlci5pbXBvcnQoc3BlY2lmaWVyKTtcbiAgaWYgKCFhdHRlbnVhdG9yW2F0dGVudWF0b3JFeHBvcnROYW1lXSkge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgYEF0dGVudWF0b3IgJHtxKGRpc3BsYXlOYW1lKX0gZG9lcyBub3QgZXhwb3J0ICR7cShhdHRlbnVhdG9yRXhwb3J0TmFtZSl9YCxcbiAgICApO1xuICB9XG4gIC8vXG4gIGNvbnN0IGF0dGVudWF0ZSA9IGF0dGVudWF0b3JbYXR0ZW51YXRvckV4cG9ydE5hbWVdLmJpbmQoYXR0ZW51YXRvciwgcGFyYW1zKTtcbiAgcmV0dXJuIGF0dGVudWF0ZTtcbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXIgPSAoXG4gIGNvbXBhcnRtZW50cyxcbiAgY29tcGFydG1lbnREZXNjcmlwdG9ycyxcbikgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGxldCBpbXBvcnRBdHRlbnVhdG9yO1xuICBsZXQgZGVmYXVsdEF0dGVudWF0b3I7XG4gIC8vXG4gIC8vXG4gIGlmICghY29tcGFydG1lbnREZXNjcmlwdG9yc1tBVFRFTlVBVE9SU19DT01QQVJUTUVOVF0pIHtcbiAgICBpbXBvcnRBdHRlbnVhdG9yID0gYXN5bmMgKCkgPT4ge1xuICAgICAgdGhyb3cgRXJyb3IoYE5vIGF0dGVudWF0b3JzIHNwZWNpZmllZCBpbiBwb2xpY3lgKTtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGRlZmF1bHRBdHRlbnVhdG9yID1cbiAgICAgIGNvbXBhcnRtZW50RGVzY3JpcHRvcnNbQVRURU5VQVRPUlNfQ09NUEFSVE1FTlRdLnBvbGljeS5kZWZhdWx0QXR0ZW51YXRvcjtcblxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGltcG9ydEF0dGVudWF0b3IgPSBhc3luYyBhdHRlbnVhdG9yU3BlY2lmaWVyID0+IHtcbiAgICAgIGlmICghYXR0ZW51YXRvclNwZWNpZmllcikge1xuICAgICAgICBpZiAoIWRlZmF1bHRBdHRlbnVhdG9yKSB7XG4gICAgICAgICAgdGhyb3cgRXJyb3IoYE5vIGRlZmF1bHQgYXR0ZW51YXRvciBzcGVjaWZpZWQgaW4gcG9saWN5YCk7XG4gICAgICAgIH1cbiAgICAgICAgYXR0ZW51YXRvclNwZWNpZmllciA9IGRlZmF1bHRBdHRlbnVhdG9yO1xuICAgICAgfVxuICAgICAgY29uc3QgeyBuYW1lc3BhY2UgfSA9IGF3YWl0IGNvbXBhcnRtZW50c1tBVFRFTlVBVE9SU19DT01QQVJUTUVOVF0uaW1wb3J0KFxuICAgICAgICAvKiAgICAgICAgICAgICAgICAgKi8gKGF0dGVudWF0b3JTcGVjaWZpZXIpLFxuICAgICAgKTtcbiAgICAgIHJldHVybiBuYW1lc3BhY2U7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgaW1wb3J0OiBpbXBvcnRBdHRlbnVhdG9yLFxuICB9O1xufTtcblxuLypcblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLm1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXIobWFrZURlZmVycmVkQXR0ZW51YXRvcnNQcm92aWRlcik7XG5hc3luYyBmdW5jdGlvbiBhdHRlbnVhdGVHbG9iYWxUaGlzKHtcbiAgYXR0ZW51YXRvcnMsXG4gIGF0dGVudWF0aW9uRGVmaW5pdGlvbixcbiAgZ2xvYmFsVGhpcyxcbiAgZ2xvYmFscyxcbn0pIHtcbiAgY29uc3QgYXR0ZW51YXRlID0gYXdhaXQgaW1wb3J0QXR0ZW51YXRvckZvckRlZmluaXRpb24oXG4gICAgYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuICAgIGF0dGVudWF0b3JzLFxuICAgIEdMT0JBTF9BVFRFTlVBVE9SLFxuICApO1xuXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG5cbiAgLy9cbiAgLy9cbiAgLy9cblxuICAvL1xuXG4gIGNvbnN0IHJlc3VsdCA9IC8qICAgICAgICovIGF0dGVudWF0ZShnbG9iYWxzLCBnbG9iYWxUaGlzKTtcbiAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdvYmplY3QnICYmIHJlc3VsdCAhPT0gbnVsbCkge1xuICAgIGFzc2lnbihnbG9iYWxUaGlzLCByZXN1bHQpO1xuICB9XG59XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBhdHRlbnVhdGVHbG9iYWxzID0gKFxuICBnbG9iYWxUaGlzLFxuICBnbG9iYWxzLFxuICBwYWNrYWdlUG9saWN5LFxuICBhdHRlbnVhdG9ycyxcbiAgcGVuZGluZ0pvYnMsXG4gIG5hbWUgPSAnPHVua25vd24+JyxcbikgPT4ge1xuICBsZXQgZnJlZXplR2xvYmFsVGhpc1VubGVzc09wdGVkT3V0ID0gKCkgPT4ge1xuICAgIGZyZWV6ZShnbG9iYWxUaGlzKTtcbiAgfTtcbiAgaWYgKHBhY2thZ2VQb2xpY3kgJiYgcGFja2FnZVBvbGljeS5ub0dsb2JhbEZyZWV6ZSkge1xuICAgIGZyZWV6ZUdsb2JhbFRoaXNVbmxlc3NPcHRlZE91dCA9ICgpID0+IHt9O1xuICB9XG4gIGlmICghcGFja2FnZVBvbGljeSB8fCBpc0FsbG93aW5nRXZlcnl0aGluZyhwYWNrYWdlUG9saWN5Lmdsb2JhbHMpKSB7XG4gICAgc2VsZWN0aXZlQ29weShnbG9iYWxzLCBnbG9iYWxUaGlzKTtcbiAgICBmcmVlemVHbG9iYWxUaGlzVW5sZXNzT3B0ZWRPdXQoKTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGlzQXR0ZW51YXRpb25EZWZpbml0aW9uKHBhY2thZ2VQb2xpY3kuZ2xvYmFscykpIHtcbiAgICBjb25zdCBhdHRlbnVhdGlvbkRlZmluaXRpb24gPSBwYWNrYWdlUG9saWN5Lmdsb2JhbHM7XG4gICAgY29uc3QgeyBkaXNwbGF5TmFtZSB9ID0gZ2V0QXR0ZW51YXRvckZyb21EZWZpbml0aW9uKGF0dGVudWF0aW9uRGVmaW5pdGlvbik7XG4gICAgY29uc3QgYXR0ZW51YXRpb25Qcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCkgLy9cbiAgICAgIC50aGVuKCgpID0+XG4gICAgICAgIGF0dGVudWF0ZUdsb2JhbFRoaXMoe1xuICAgICAgICAgIGF0dGVudWF0b3JzLFxuICAgICAgICAgIGF0dGVudWF0aW9uRGVmaW5pdGlvbixcbiAgICAgICAgICBnbG9iYWxUaGlzLFxuICAgICAgICAgIGdsb2JhbHMsXG4gICAgICAgIH0pLFxuICAgICAgKVxuICAgICAgLnRoZW4oZnJlZXplR2xvYmFsVGhpc1VubGVzc09wdGVkT3V0LCBlcnJvciA9PiB7XG4gICAgICAgIGZyZWV6ZUdsb2JhbFRoaXNVbmxlc3NPcHRlZE91dCgpO1xuICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICBgRXJyb3Igd2hpbGUgYXR0ZW51YXRpbmcgZ2xvYmFscyBmb3IgJHtxKG5hbWUpfSB3aXRoICR7cShcbiAgICAgICAgICAgIGRpc3BsYXlOYW1lLFxuICAgICAgICAgICl9OiAke3EoZXJyb3IubWVzc2FnZSl9YCAgLy9cbiAgICAgICAgKTtcbiAgICAgIH0pO1xuICAgIHBlbmRpbmdKb2JzLnB1c2goYXR0ZW51YXRpb25Qcm9taXNlKTtcblxuICAgIHJldHVybjtcbiAgfVxuICBjb25zdCBsaXN0ID0gZ2V0R2xvYmFsc0xpc3QocGFja2FnZVBvbGljeSk7XG4gIHNlbGVjdGl2ZUNvcHkoZ2xvYmFscywgZ2xvYmFsVGhpcywgbGlzdCk7XG4gIGZyZWV6ZUdsb2JhbFRoaXNVbmxlc3NPcHRlZE91dCgpO1xufTtcblxuLypcblxuXG4gKi8kaM2PX29uY2UuYXR0ZW51YXRlR2xvYmFscyhhdHRlbnVhdGVHbG9iYWxzKTtcbmNvbnN0IGRpYWdub3NlTW9kdWxlUG9saWN5ID0gZXJyb3JIaW50ID0+IHtcbiAgaWYgKCFlcnJvckhpbnQpIHtcbiAgICByZXR1cm4gJyc7XG4gIH1cbiAgcmV0dXJuIGAgKGluZm86ICR7ZXJyb3JIaW50fSlgO1xufTtcblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZW5mb3JjZU1vZHVsZVBvbGljeSA9IChcbiAgc3BlY2lmaWVyLFxuICBjb21wYXJ0bWVudERlc2NyaXB0b3IsXG4gIHsgZXhpdCwgZXJyb3JIaW50IH0gPSB7fSxcbikgPT4ge1xuICBjb25zdCB7IHBvbGljeSwgbW9kdWxlcywgbGFiZWwgfSA9IGNvbXBhcnRtZW50RGVzY3JpcHRvcjtcbiAgaWYgKCFwb2xpY3kpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBpZiAoIWV4aXQpIHtcbiAgICBpZiAoIW1vZHVsZXNbc3BlY2lmaWVyXSkge1xuICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgIGBJbXBvcnRpbmcgJHtxKHNwZWNpZmllcil9IGluICR7cShcbiAgICAgICAgICBsYWJlbCxcbiAgICAgICAgKX0gd2FzIG5vdCBhbGxvd2VkIGJ5IHBhY2thZ2VzIHBvbGljeSAke3EoXG4gICAgICAgICAgcG9saWN5LnBhY2thZ2VzLFxuICAgICAgICApfSR7ZGlhZ25vc2VNb2R1bGVQb2xpY3koZXJyb3JIaW50KX1gLFxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKCFwb2xpY3lMb29rdXBIZWxwZXIocG9saWN5LCAnYnVpbHRpbnMnLCBzcGVjaWZpZXIpKSB7XG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICBgSW1wb3J0aW5nICR7cShzcGVjaWZpZXIpfSB3YXMgbm90IGFsbG93ZWQgYnkgcG9saWN5IGJ1aWx0aW5zOiR7cShcbiAgICAgICAgcG9saWN5LmJ1aWx0aW5zLFxuICAgICAgKX0ke2RpYWdub3NlTW9kdWxlUG9saWN5KGVycm9ySGludCl9YCxcbiAgICApO1xuICB9XG59O1xuXG4vKlxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLmVuZm9yY2VNb2R1bGVQb2xpY3koZW5mb3JjZU1vZHVsZVBvbGljeSk7XG5hc3luYyBmdW5jdGlvbiBhdHRlbnVhdGVNb2R1bGUoe1xuICBhdHRlbnVhdG9ycyxcbiAgYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuICBvcmlnaW5hbE1vZHVsZVJlY29yZCxcbn0pIHtcbiAgY29uc3QgYXR0ZW51YXRlID0gYXdhaXQgaW1wb3J0QXR0ZW51YXRvckZvckRlZmluaXRpb24oXG4gICAgYXR0ZW51YXRpb25EZWZpbml0aW9uLFxuICAgIGF0dGVudWF0b3JzLFxuICAgIE1PRFVMRV9BVFRFTlVBVE9SLFxuICApO1xuXG4gIC8vXG4gIC8vXG5cbiAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgaW1wb3J0czogb3JpZ2luYWxNb2R1bGVSZWNvcmQuaW1wb3J0cyxcbiAgICAvL1xuICAgIC8vXG4gICAgZXhwb3J0czogb3JpZ2luYWxNb2R1bGVSZWNvcmQuZXhwb3J0cyxcbiAgICBleGVjdXRlOiAobW9kdWxlRXhwb3J0cywgY29tcGFydG1lbnQsIHJlc29sdmVkSW1wb3J0cykgPT4ge1xuICAgICAgY29uc3QgbnMgPSB7fTtcbiAgICAgIG9yaWdpbmFsTW9kdWxlUmVjb3JkLmV4ZWN1dGUobnMsIGNvbXBhcnRtZW50LCByZXNvbHZlZEltcG9ydHMpO1xuICAgICAgY29uc3QgYXR0ZW51YXRlZCA9IGF0dGVudWF0ZShucyk7XG4gICAgICBtb2R1bGVFeHBvcnRzLmRlZmF1bHQgPSBhdHRlbnVhdGVkO1xuICAgICAgYXNzaWduKG1vZHVsZUV4cG9ydHMsIGF0dGVudWF0ZWQpO1xuICAgIH0sXG4gIH0pO1xufVxuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBhdHRlbnVhdGVNb2R1bGVIb29rID0gYXN5bmMgKFxuICBzcGVjaWZpZXIsXG4gIG9yaWdpbmFsTW9kdWxlUmVjb3JkLFxuICBwb2xpY3ksXG4gIGF0dGVudWF0b3JzLFxuKSA9PiB7XG4gIGNvbnN0IHBvbGljeVZhbHVlID0gcG9saWN5TG9va3VwSGVscGVyKHBvbGljeSwgJ2J1aWx0aW5zJywgc3BlY2lmaWVyKTtcbiAgaWYgKCFwb2xpY3kgfHwgcG9saWN5VmFsdWUgPT09IHRydWUpIHtcbiAgICByZXR1cm4gb3JpZ2luYWxNb2R1bGVSZWNvcmQ7XG4gIH1cblxuICBpZiAoIXBvbGljeVZhbHVlKSB7XG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICBgQXR0ZW51YXRpb24gZmFpbGVkICcke3NwZWNpZmllcn0nIHdhcyBub3QgaW4gcG9saWN5IGJ1aWx0aW5zOiR7cShcbiAgICAgICAgcG9saWN5LmJ1aWx0aW5zLFxuICAgICAgKX1gLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIGF0dGVudWF0ZU1vZHVsZSh7XG4gICAgYXR0ZW51YXRvcnMsXG4gICAgYXR0ZW51YXRpb25EZWZpbml0aW9uOiBwb2xpY3lWYWx1ZSxcbiAgICBvcmlnaW5hbE1vZHVsZVJlY29yZCxcbiAgfSk7XG59OyRozY9fb25jZS5hdHRlbnVhdGVNb2R1bGVIb29rKGF0dGVudWF0ZU1vZHVsZUhvb2spO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQiOlsiQVRURU5VQVRPUlNfQ09NUEFSVE1FTlQiXSwiZGV0ZWN0QXR0ZW51YXRvcnMiOlsiZGV0ZWN0QXR0ZW51YXRvcnMiXSwiZGVwZW5kZW5jeUFsbG93ZWRCeVBvbGljeSI6WyJkZXBlbmRlbmN5QWxsb3dlZEJ5UG9saWN5Il0sImdldFBvbGljeUZvclBhY2thZ2UiOlsiZ2V0UG9saWN5Rm9yUGFja2FnZSJdLCJtYWtlRGVmZXJyZWRBdHRlbnVhdG9yc1Byb3ZpZGVyIjpbIm1ha2VEZWZlcnJlZEF0dGVudWF0b3JzUHJvdmlkZXIiXSwiYXR0ZW51YXRlR2xvYmFscyI6WyJhdHRlbnVhdGVHbG9iYWxzIl0sImVuZm9yY2VNb2R1bGVQb2xpY3kiOlsiZW5mb3JjZU1vZHVsZVBvbGljeSJdLCJhdHRlbnVhdGVNb2R1bGVIb29rIjpbImF0dGVudWF0ZU1vZHVsZUhvb2siXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAr2h7pdwIAADcCAAALQAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3Bvd2Vycy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMiLCJpc1JlYWROb3dQb3dlcnMiLCJ1bnBhY2tSZWFkUG93ZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuY29uc3QgeyBmcmVlemUgfSA9IE9iamVjdDtcblxuLyogICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGNhbm9uaWNhbFNoaW0gPSBhc3luYyBwYXRoID0+IHBhdGg7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgdW5wYWNrUmVhZFBvd2VycyA9IHBvd2VycyA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgcmVhZDtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgbGV0IG1heWJlUmVhZDtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgbGV0IGNhbm9uaWNhbDtcblxuICBpZiAodHlwZW9mIHBvd2VycyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJlYWQgPSBwb3dlcnM7XG4gIH0gZWxzZSB7XG4gICAgKHsgcmVhZCwgbWF5YmVSZWFkLCBjYW5vbmljYWwgfSA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAocG93ZXJzKSk7XG4gIH1cblxuICBpZiAoY2Fub25pY2FsID09PSB1bmRlZmluZWQpIHtcbiAgICBjYW5vbmljYWwgPSBjYW5vbmljYWxTaGltO1xuICB9XG5cbiAgaWYgKG1heWJlUmVhZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgbWF5YmVSZWFkID0gcGF0aCA9PlxuICAgICAgLyogICAgICAgICAgICAgICAgICovIChyZWFkKShwYXRoKS5jYXRjaChfZXJyb3IgPT4gdW5kZWZpbmVkKTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgLi4ucG93ZXJzLFxuICAgIHJlYWQsXG4gICAgbWF5YmVSZWFkLFxuICAgIGNhbm9uaWNhbCxcbiAgfTtcbn07XG5cbi8qXG5cblxuXG4gKi8kaM2PX29uY2UudW5wYWNrUmVhZFBvd2Vycyh1bnBhY2tSZWFkUG93ZXJzKTtcbmNvbnN0IHJlcXVpcmVkUmVhZE5vd1Bvd2Vyc1Byb3BzID0gZnJlZXplKFxuICAvKiAgICAgICAgICAgICAgICAqLyAoWydmaWxlVVJMVG9QYXRoJywgJ2lzQWJzb2x1dGUnLCAnbWF5YmVSZWFkTm93J10pLFxuKTtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgaXNSZWFkTm93UG93ZXJzID0gdmFsdWUgPT5cbiAgQm9vbGVhbihcbiAgICB2YWx1ZSAmJlxuICAgICAgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJlxuICAgICAgcmVxdWlyZWRSZWFkTm93UG93ZXJzUHJvcHMuZXZlcnkoXG4gICAgICAgIHByb3AgPT4gcHJvcCBpbiB2YWx1ZSAmJiB0eXBlb2YgdmFsdWVbcHJvcF0gPT09ICdmdW5jdGlvbicsXG4gICAgICApLFxuICApO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuaXNSZWFkTm93UG93ZXJzKGlzUmVhZE5vd1Bvd2Vycyk7XG4gICAgICAgY29uc3QgZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMgPSB2YWx1ZSA9PiB7XG4gIGlmICghdmFsdWUgfHwgdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgcmV0dXJuIFsuLi5yZXF1aXJlZFJlYWROb3dQb3dlcnNQcm9wc107XG4gIH1cbiAgcmV0dXJuIHJlcXVpcmVkUmVhZE5vd1Bvd2Vyc1Byb3BzLmZpbHRlcihcbiAgICBwcm9wID0+ICEocHJvcCBpbiB2YWx1ZSkgfHwgdHlwZW9mIHZhbHVlW3Byb3BdICE9PSAnZnVuY3Rpb24nLFxuICApO1xufTskaM2PX29uY2UuZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMoZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidW5wYWNrUmVhZFBvd2VycyI6WyJ1bnBhY2tSZWFkUG93ZXJzIl0sImlzUmVhZE5vd1Bvd2VycyI6WyJpc1JlYWROb3dQb3dlcnMiXSwiZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMiOlsiZmluZEludmFsaWRSZWFkTm93UG93ZXJzUHJvcHMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAANQAAAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3R5cGVzLWV4dGVybmFsLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADSioamiAQAAogEAACEAAABAZW5kby9lbnYtb3B0aW9ucy12MS4xLjgvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvZW52LW9wdGlvbnMuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL3NyYy9lbnYtb3B0aW9ucy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9lbnYtb3B0aW9ucy5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAusIkdug8AALoPAAArAAAAQGVuZG8vZW52LW9wdGlvbnMtdjEuMS44L3NyYy9lbnYtb3B0aW9ucy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyIsImdldEVudmlyb25tZW50T3B0aW9uIiwiZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCIsIm1ha2VFbnZpcm9ubWVudENhcHRvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKiAgICAgICAgICAgICAgICAgICAqL1xuLy9cblxuLy9cbi8vXG5cbi8vXG4vL1xuLy9cblxuY29uc3QgeyBmcmVlemUgfSA9IE9iamVjdDtcbmNvbnN0IHsgYXBwbHkgfSA9IFJlZmxlY3Q7XG5cbi8vXG4vL1xuY29uc3QgdW5jdXJyeVRoaXMgPVxuICBmbiA9PlxuICAocmVjZWl2ZXIsIC4uLmFyZ3MpID0+XG4gICAgYXBwbHkoZm4sIHJlY2VpdmVyLCBhcmdzKTtcbmNvbnN0IGFycmF5UHVzaCA9IHVuY3VycnlUaGlzKEFycmF5LnByb3RvdHlwZS5wdXNoKTtcbmNvbnN0IGFycmF5SW5jbHVkZXMgPSB1bmN1cnJ5VGhpcyhBcnJheS5wcm90b3R5cGUuaW5jbHVkZXMpO1xuY29uc3Qgc3RyaW5nU3BsaXQgPSB1bmN1cnJ5VGhpcyhTdHJpbmcucHJvdG90eXBlLnNwbGl0KTtcblxuY29uc3QgcSA9IEpTT04uc3RyaW5naWZ5O1xuXG5jb25zdCBGYWlsID0gKGxpdGVyYWxzLCAuLi5hcmdzKSA9PiB7XG4gIGxldCBtc2cgPSBsaXRlcmFsc1swXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgbXNnID0gYCR7bXNnfSR7YXJnc1tpXX0ke2xpdGVyYWxzW2kgKyAxXX1gO1xuICB9XG4gIHRocm93IEVycm9yKG1zZyk7XG59O1xuXG4vL1xuLy9cblxuLypcblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZUVudmlyb25tZW50Q2FwdG9yID0gKGFHbG9iYWwsIGRyb3BOYW1lcyA9IGZhbHNlKSA9PiB7XG4gIGNvbnN0IGNhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyA9IFtdO1xuXG4gIC8qXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgZ2V0RW52aXJvbm1lbnRPcHRpb24gPSAoXG4gICAgb3B0aW9uTmFtZSxcbiAgICBkZWZhdWx0U2V0dGluZyxcbiAgICBvcHRPdGhlclZhbHVlcyA9IHVuZGVmaW5lZCxcbiAgKSA9PiB7XG4gICAgdHlwZW9mIG9wdGlvbk5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICBGYWlsYEVudmlyb25tZW50IG9wdGlvbiBuYW1lICR7cShvcHRpb25OYW1lKX0gbXVzdCBiZSBhIHN0cmluZy5gO1xuICAgIHR5cGVvZiBkZWZhdWx0U2V0dGluZyA9PT0gJ3N0cmluZycgfHxcbiAgICAgIEZhaWxgRW52aXJvbm1lbnQgb3B0aW9uIGRlZmF1bHQgc2V0dGluZyAke3EoXG4gICAgICAgIGRlZmF1bHRTZXR0aW5nLFxuICAgICAgKX0gbXVzdCBiZSBhIHN0cmluZy5gO1xuXG4gICAgLyogICAgICAgICAgICAgICAgICovXG4gICAgbGV0IHNldHRpbmcgPSBkZWZhdWx0U2V0dGluZztcbiAgICBjb25zdCBnbG9iYWxQcm9jZXNzID0gYUdsb2JhbC5wcm9jZXNzIHx8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBnbG9iYWxFbnYgPVxuICAgICAgKHR5cGVvZiBnbG9iYWxQcm9jZXNzID09PSAnb2JqZWN0JyAmJiBnbG9iYWxQcm9jZXNzLmVudikgfHwgdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlb2YgZ2xvYmFsRW52ID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKG9wdGlvbk5hbWUgaW4gZ2xvYmFsRW52KSB7XG4gICAgICAgIGlmICghZHJvcE5hbWVzKSB7XG4gICAgICAgICAgYXJyYXlQdXNoKGNhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcywgb3B0aW9uTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3B0aW9uVmFsdWUgPSBnbG9iYWxFbnZbb3B0aW9uTmFtZV07XG4gICAgICAgIC8vXG4gICAgICAgIHR5cGVvZiBvcHRpb25WYWx1ZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICBGYWlsYEVudmlyb25tZW50IG9wdGlvbiBuYW1lZCAke3EoXG4gICAgICAgICAgICBvcHRpb25OYW1lLFxuICAgICAgICAgICl9LCBpZiBwcmVzZW50LCBtdXN0IGhhdmUgYSBjb3JyZXNwb25kaW5nIHN0cmluZyB2YWx1ZSwgZ290ICR7cShcbiAgICAgICAgICAgIG9wdGlvblZhbHVlLFxuICAgICAgICAgICl9YDtcbiAgICAgICAgc2V0dGluZyA9IG9wdGlvblZhbHVlO1xuICAgICAgfVxuICAgIH1cbiAgICBvcHRPdGhlclZhbHVlcyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICBzZXR0aW5nID09PSBkZWZhdWx0U2V0dGluZyB8fFxuICAgICAgYXJyYXlJbmNsdWRlcyhvcHRPdGhlclZhbHVlcywgc2V0dGluZykgfHxcbiAgICAgIEZhaWxgVW5yZWNvZ25pemVkICR7cShvcHRpb25OYW1lKX0gdmFsdWUgJHtxKFxuICAgICAgICBzZXR0aW5nLFxuICAgICAgKX0uIEV4cGVjdGVkIG9uZSBvZiAke3EoW2RlZmF1bHRTZXR0aW5nLCAuLi5vcHRPdGhlclZhbHVlc10pfWA7XG4gICAgcmV0dXJuIHNldHRpbmc7XG4gIH07XG4gIGZyZWV6ZShnZXRFbnZpcm9ubWVudE9wdGlvbik7XG5cbiAgLypcblxuXG4gICAqL1xuICBjb25zdCBnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0ID0gb3B0aW9uTmFtZSA9PiB7XG4gICAgY29uc3Qgb3B0aW9uID0gZ2V0RW52aXJvbm1lbnRPcHRpb24ob3B0aW9uTmFtZSwgJycpO1xuICAgIHJldHVybiBmcmVlemUob3B0aW9uID09PSAnJyA/IFtdIDogc3RyaW5nU3BsaXQob3B0aW9uLCAnLCcpKTtcbiAgfTtcbiAgZnJlZXplKGdldEVudmlyb25tZW50T3B0aW9uc0xpc3QpO1xuXG4gIGNvbnN0IGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMgPSAob3B0aW9uTmFtZSwgZWxlbWVudCkgPT5cbiAgICBhcnJheUluY2x1ZGVzKGdldEVudmlyb25tZW50T3B0aW9uc0xpc3Qob3B0aW9uTmFtZSksIGVsZW1lbnQpO1xuXG4gIGNvbnN0IGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyA9ICgpID0+IHtcbiAgICByZXR1cm4gZnJlZXplKFsuLi5jYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXNdKTtcbiAgfTtcbiAgZnJlZXplKGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyk7XG5cbiAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgZ2V0RW52aXJvbm1lbnRPcHRpb24sXG4gICAgZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCxcbiAgICBlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzLFxuICAgIGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlRW52aXJvbm1lbnRDYXB0b3IobWFrZUVudmlyb25tZW50Q2FwdG9yKTtcbmZyZWV6ZShtYWtlRW52aXJvbm1lbnRDYXB0b3IpO1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHtcbiAgZ2V0RW52aXJvbm1lbnRPcHRpb24sXG4gIGdldEVudmlyb25tZW50T3B0aW9uc0xpc3QsXG4gIGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMsXG59ID0gbWFrZUVudmlyb25tZW50Q2FwdG9yKGdsb2JhbFRoaXMsIHRydWUpOyRozY9fb25jZS5nZXRFbnZpcm9ubWVudE9wdGlvbihnZXRFbnZpcm9ubWVudE9wdGlvbik7JGjNj19vbmNlLmdldEVudmlyb25tZW50T3B0aW9uc0xpc3QoZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCk7JGjNj19vbmNlLmVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMoZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRW52aXJvbm1lbnRDYXB0b3IiOlsibWFrZUVudmlyb25tZW50Q2FwdG9yIl0sImdldEVudmlyb25tZW50T3B0aW9uIjpbImdldEVudmlyb25tZW50T3B0aW9uIl0sImdldEVudmlyb25tZW50T3B0aW9uc0xpc3QiOlsiZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCJdLCJlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzIjpbImVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAASTX26VQIAABUCAAAHQAAAEBlbmRvL2Vycm9ycy12MS4yLjEwL2luZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJGYWlsIiwiWCIsImFubm90YXRlRXJyb3IiLCJhc3NlcnQiLCJiIiwiYmFyZSIsIm1ha2VFcnJvciIsIm5vdGUiLCJxIiwicXVvdGUiLCJyZWRhY3RlZCIsInRocm93UmVkYWN0ZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogICAgICAgICAgICAgICAgICAgKi9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vL1xuLy9cblxuY29uc3QgZ2xvYmFsQXNzZXJ0ID0gZ2xvYmFsVGhpcy5hc3NlcnQ7XG5cbmlmIChnbG9iYWxBc3NlcnQgPT09IHVuZGVmaW5lZCkge1xuICB0aHJvdyBFcnJvcihcbiAgICBgQ2Fubm90IGluaXRpYWxpemUgQGVuZG8vZXJyb3JzLCBtaXNzaW5nIGdsb2JhbFRoaXMuYXNzZXJ0LCBpbXBvcnQgJ3NlcycgYmVmb3JlICdAZW5kby9lcnJvcnMnYCxcbiAgKTtcbn1cblxuY29uc3QgbWlzc2luZyA9IC8qICAgICAgICAgICAgICAgICovIChbXG4gICd0eXBlb2YnLFxuICAnZXJyb3InLFxuICAnZmFpbCcsXG4gICdlcXVhbCcsXG4gICdzdHJpbmcnLFxuICAnbm90ZScsXG4gICdkZXRhaWxzJyxcbiAgJ0ZhaWwnLFxuICAncXVvdGUnLFxuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAnbWFrZUFzc2VydCcsXG5dKS5maWx0ZXIobmFtZSA9PiBnbG9iYWxBc3NlcnRbbmFtZV0gPT09IHVuZGVmaW5lZCk7XG5pZiAobWlzc2luZy5sZW5ndGggPiAwKSB7XG4gIHRocm93IEVycm9yKFxuICAgIGBDYW5ub3QgaW5pdGlhbGl6ZSBAZW5kby9lcnJvcnMsIG1pc3NpbmcgZ2xvYmFsVGhpcy5hc3NlcnQgbWV0aG9kcyAke21pc3Npbmcuam9pbihcbiAgICAgICcsICcsXG4gICAgKX1gLFxuICApO1xufVxuXG4vL1xuLy9cbi8vXG5jb25zdCB7XG4gIGJhcmUsXG4gIGRldGFpbHM6IHJlZGFjdGVkLFxuICBlcnJvcjogbWFrZUVycm9yLFxuICBGYWlsOiB0aHJvd1JlZGFjdGVkLFxuICBtYWtlQXNzZXJ0OiBfb21pdHRlZE1ha2VBc3NlcnQsXG4gIG5vdGUsXG4gIHF1b3RlLFxuICAuLi5hc3NlcnRpb25zXG59ID0gZ2xvYmFsQXNzZXJ0O1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vL1xuJGjNj19vbmNlLnJlZGFjdGVkKHJlZGFjdGVkKTskaM2PX29uY2UubWFrZUVycm9yKG1ha2VFcnJvcik7JGjNj19vbmNlLnRocm93UmVkYWN0ZWQodGhyb3dSZWRhY3RlZCk7JGjNj19vbmNlLm5vdGUobm90ZSk7JGjNj19vbmNlLnF1b3RlKHF1b3RlKTtjb25zdCBhc3NlcnQ9KHZhbHVlLG9wdERldGFpbHMsZXJyQ29udHJ1Y3RvcixvcHRpb25zKT0+XG4gIGdsb2JhbEFzc2VydCh2YWx1ZSwgb3B0RGV0YWlscywgZXJyQ29udHJ1Y3Rvciwgb3B0aW9ucyk7JGjNj19vbmNlLmFzc2VydChhc3NlcnQpO1xuT2JqZWN0LmFzc2lnbihhc3NlcnQsIGFzc2VydGlvbnMpO1xuXG4vL1xuLy9cbi8vXG5jb25zdCBiYXJlT3JRdW90ZSA9IGJhcmUgfHwgcXVvdGU7XG5cbi8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8kaM2PX29uY2UuYmFyZU9yUXVvdGUoYmFyZU9yUXVvdGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicmVkYWN0ZWQiOlsicmVkYWN0ZWQiXSwiWCI6WyJyZWRhY3RlZCJdLCJtYWtlRXJyb3IiOlsibWFrZUVycm9yIl0sInRocm93UmVkYWN0ZWQiOlsidGhyb3dSZWRhY3RlZCJdLCJGYWlsIjpbInRocm93UmVkYWN0ZWQiXSwibm90ZSI6WyJub3RlIl0sImFubm90YXRlRXJyb3IiOlsibm90ZSJdLCJxdW90ZSI6WyJxdW90ZSJdLCJxIjpbInF1b3RlIl0sImFzc2VydCI6WyJhc3NlcnQiXSwiYmFyZSI6WyJiYXJlT3JRdW90ZSJdLCJiIjpbImJhcmVPclF1b3RlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMmxgxkbFgAAGxYAACMAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMS9zcmMvRS5qc3siaW1wb3J0cyI6WyIuL3RyYWNrLXR1cm5zLmpzIiwiLi9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHRyYWNrVHVybnMsbWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyOyRozY9faW1wb3J0cyhbW1wiLi90cmFjay10dXJucy5qc1wiLCBbW1widHJhY2tUdXJuc1wiLFskaM2PX2EgPT4gKHRyYWNrVHVybnMgPSAkaM2PX2EpXV1dXSxbXCIuL21lc3NhZ2UtYnJlYWtwb2ludHMuanNcIiwgW1tcIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlclwiLFskaM2PX2EgPT4gKG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciA9ICRozY9fYSldXV1dXSk7XG5cblxuY29uc3QgeyBkZXRhaWxzOiBYLCBxdW90ZTogcSwgRmFpbCwgZXJyb3I6IG1ha2VFcnJvciB9ID0gYXNzZXJ0O1xuY29uc3QgeyBhc3NpZ24sIGZyZWV6ZSB9ID0gT2JqZWN0O1xuXG4vKlxuXG4gKi9cblxuY29uc3Qgb25TZW5kID0gbWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyKCdFTkRPX1NFTkRfQlJFQUtQT0lOVFMnKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIgPSB7XG4gIHNldChfdGFyZ2V0LCBfcHJvcCwgX3ZhbHVlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBpc0V4dGVuc2libGUoX3RhcmdldCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgc2V0UHJvdG90eXBlT2YoX3RhcmdldCwgX3ZhbHVlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBkZWxldGVQcm9wZXJ0eShfdGFyZ2V0LCBfcHJvcCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbn07XG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZUVQcm94eUhhbmRsZXIgPSAocmVjaXBpZW50LCBIYW5kbGVkUHJvbWlzZSkgPT5cbiAgaGFyZGVuKHtcbiAgICAuLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuICAgIGdldDogKF90YXJnZXQsIHByb3BlcnR5S2V5LCByZWNlaXZlcikgPT4ge1xuICAgICAgcmV0dXJuIGhhcmRlbihcbiAgICAgICAge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgW3Byb3BlcnR5S2V5XSguLi5hcmdzKSB7XG4gICAgICAgICAgICBpZiAodGhpcyAhPT0gcmVjZWl2ZXIpIHtcbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgcmV0dXJuIEhhbmRsZWRQcm9taXNlLnJlamVjdChcbiAgICAgICAgICAgICAgICBtYWtlRXJyb3IoXG4gICAgICAgICAgICAgICAgICBYYFVuZXhwZWN0ZWQgcmVjZWl2ZXIgZm9yIFwiJHtxKHByb3BlcnR5S2V5KX1cIiBtZXRob2Qgb2YgRSgke3EoXG4gICAgICAgICAgICAgICAgICAgIHJlY2lwaWVudCxcbiAgICAgICAgICAgICAgICAgICl9KWAsXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9uU2VuZCAmJiBvblNlbmQuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIHByb3BlcnR5S2V5KSkge1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICBkZWJ1Z2dlcjsgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBIYW5kbGVkUHJvbWlzZS5hcHBseU1ldGhvZChyZWNpcGllbnQsIHByb3BlcnR5S2V5LCBhcmdzKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy9cbiAgICAgICAgfVtwcm9wZXJ0eUtleV0sXG4gICAgICApO1xuICAgIH0sXG4gICAgYXBwbHk6IChfdGFyZ2V0LCBfdGhpc0FyZywgYXJnQXJyYXkgPSBbXSkgPT4ge1xuICAgICAgaWYgKG9uU2VuZCAmJiBvblNlbmQuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIHVuZGVmaW5lZCkpIHtcbiAgICAgICAgLy9cbiAgICAgICAgZGVidWdnZXI7IC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICB9XG4gICAgICByZXR1cm4gSGFuZGxlZFByb21pc2UuYXBwbHlGdW5jdGlvbihyZWNpcGllbnQsIGFyZ0FycmF5KTtcbiAgICB9LFxuICAgIGhhczogKF90YXJnZXQsIF9wKSA9PiB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgfSk7XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VFU2VuZE9ubHlQcm94eUhhbmRsZXIgPSAocmVjaXBpZW50LCBIYW5kbGVkUHJvbWlzZSkgPT5cbiAgaGFyZGVuKHtcbiAgICAuLi5iYXNlRnJlZXphYmxlUHJveHlIYW5kbGVyLFxuICAgIGdldDogKF90YXJnZXQsIHByb3BlcnR5S2V5LCByZWNlaXZlcikgPT4ge1xuICAgICAgcmV0dXJuIGhhcmRlbihcbiAgICAgICAge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICBbcHJvcGVydHlLZXldKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICB0aGlzID09PSByZWNlaXZlciB8fFxuICAgICAgICAgICAgICBGYWlsYFVuZXhwZWN0ZWQgcmVjZWl2ZXIgZm9yIFwiJHtxKFxuICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5LFxuICAgICAgICAgICAgICApfVwiIG1ldGhvZCBvZiBFLnNlbmRPbmx5KCR7cShyZWNpcGllbnQpfSlgO1xuICAgICAgICAgICAgaWYgKG9uU2VuZCAmJiBvblNlbmQuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIHByb3BlcnR5S2V5KSkge1xuICAgICAgICAgICAgICAvL1xuICAgICAgICAgICAgICBkZWJ1Z2dlcjsgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIEhhbmRsZWRQcm9taXNlLmFwcGx5TWV0aG9kU2VuZE9ubHkocmVjaXBpZW50LCBwcm9wZXJ0eUtleSwgYXJncyk7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvL1xuICAgICAgICB9W3Byb3BlcnR5S2V5XSxcbiAgICAgICk7XG4gICAgfSxcbiAgICBhcHBseTogKF90YXJnZXQsIF90aGlzQXJnLCBhcmdzQXJyYXkgPSBbXSkgPT4ge1xuICAgICAgaWYgKG9uU2VuZCAmJiBvblNlbmQuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIHVuZGVmaW5lZCkpIHtcbiAgICAgICAgLy9cbiAgICAgICAgZGVidWdnZXI7IC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICB9XG4gICAgICBIYW5kbGVkUHJvbWlzZS5hcHBseUZ1bmN0aW9uU2VuZE9ubHkocmVjaXBpZW50LCBhcmdzQXJyYXkpO1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9LFxuICAgIGhhczogKF90YXJnZXQsIF9wKSA9PiB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgfSk7XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VFR2V0UHJveHlIYW5kbGVyID0gKHgsIEhhbmRsZWRQcm9taXNlKSA9PlxuICBoYXJkZW4oe1xuICAgIC4uLmJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIsXG4gICAgaGFzOiAoX3RhcmdldCwgX3Byb3ApID0+IHRydWUsXG4gICAgZ2V0OiAoX3RhcmdldCwgcHJvcCkgPT4gSGFuZGxlZFByb21pc2UuZ2V0KHgsIHByb3ApLFxuICB9KTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBmdW5jVGFyZ2V0ID0gZnJlZXplKCgpID0+IHt9KTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IG9ialRhcmdldCA9IGZyZWV6ZSh7IF9fcHJvdG9fXzogbnVsbCB9KTtcblxuLypcblxuICovXG5jb25zdCBtYWtlRSA9IEhhbmRsZWRQcm9taXNlID0+IHtcbiAgcmV0dXJuIGhhcmRlbihcbiAgICBhc3NpZ24oXG4gICAgICAvKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgICAgICovXG4gICAgICAvL1xuICAgICAgeCA9PiBuZXcgUHJveHkoZnVuY1RhcmdldCwgbWFrZUVQcm94eUhhbmRsZXIoeCwgSGFuZGxlZFByb21pc2UpKSxcbiAgICAgIHtcbiAgICAgICAgLypcblxuXG5cblxuXG5cblxuXG5cbiAgICAgICAgICovXG4gICAgICAgIC8vXG4gICAgICAgIGdldDogeCA9PiBuZXcgUHJveHkob2JqVGFyZ2V0LCBtYWtlRUdldFByb3h5SGFuZGxlcih4LCBIYW5kbGVkUHJvbWlzZSkpLFxuXG4gICAgICAgIC8qXG5cblxuXG5cblxuXG5cbiAgICAgICAgICovXG4gICAgICAgIHJlc29sdmU6IEhhbmRsZWRQcm9taXNlLnJlc29sdmUsXG5cbiAgICAgICAgLypcblxuXG5cblxuXG5cblxuICAgICAgICAgKi9cbiAgICAgICAgc2VuZE9ubHk6IHggPT5cbiAgICAgICAgICAvL1xuICAgICAgICAgIG5ldyBQcm94eShmdW5jVGFyZ2V0LCBtYWtlRVNlbmRPbmx5UHJveHlIYW5kbGVyKHgsIEhhbmRsZWRQcm9taXNlKSksXG5cbiAgICAgICAgLypcblxuXG5cblxuXG5cblxuXG5cblxuICAgICAgICAgKi9cbiAgICAgICAgd2hlbjogKHgsIG9uZnVsZmlsbGVkLCBvbnJlamVjdGVkKSA9PlxuICAgICAgICAgIEhhbmRsZWRQcm9taXNlLnJlc29sdmUoeCkudGhlbihcbiAgICAgICAgICAgIC4uLnRyYWNrVHVybnMoW29uZnVsZmlsbGVkLCBvbnJlamVjdGVkXSksXG4gICAgICAgICAgKSxcbiAgICAgIH0sXG4gICAgKSxcbiAgKTtcbn07XG5cbmNvbnN0e2RlZmF1bHQ6JGPNj19kZWZhdWx0fT17ZGVmYXVsdDptYWtlRX07XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuZGVmYXVsdCgkY82PX2RlZmF1bHQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACkAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMS9zcmMvZXhwb3J0cy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACk4yujkQ4AAJEOAAAnAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEvc3JjL2xvY2FsLmpzeyJpbXBvcnRzIjpbIi4vbWVzc2FnZS1icmVha3BvaW50cy5qcyJdLCJleHBvcnRzIjpbImdldE1ldGhvZE5hbWVzIiwibG9jYWxBcHBseUZ1bmN0aW9uIiwibG9jYWxBcHBseU1ldGhvZCIsImxvY2FsR2V0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgbWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyOyRozY9faW1wb3J0cyhbW1wiLi9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzXCIsIFtbXCJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXJcIixbJGjNj19hID0+IChtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIgPSAkaM2PX2EpXV1dXV0pO1xuXG5jb25zdCB7IGRldGFpbHM6IFgsIHF1b3RlOiBxLCBGYWlsIH0gPSBhc3NlcnQ7XG5cbmNvbnN0IHsgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycywgZ2V0UHJvdG90eXBlT2YsIGZyZWV6ZSB9ID0gT2JqZWN0O1xuY29uc3QgeyBhcHBseSwgb3duS2V5cyB9ID0gUmVmbGVjdDtcblxuY29uc3QgbnR5cGVvZiA9IHNwZWNpbWVuID0+IChzcGVjaW1lbiA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiBzcGVjaW1lbik7XG5cbmNvbnN0IG9uRGVsaXZlcnkgPSBtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIoJ0VORE9fREVMSVZFUllfQlJFQUtQT0lOVFMnKTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBpc09iamVjdCA9IHZhbCA9PiBPYmplY3QodmFsKSA9PT0gdmFsO1xuXG4vKlxuXG5cblxuXG5cbiAqL1xuY29uc3QgY29tcGFyZVN0cmluZ2lmaWVkID0gKGEsIGIpID0+IHtcbiAgaWYgKHR5cGVvZiBhID09PSB0eXBlb2YgYikge1xuICAgIGNvbnN0IGxlZnQgPSBTdHJpbmcoYSk7XG4gICAgY29uc3QgcmlnaHQgPSBTdHJpbmcoYik7XG4gICAgLy9cbiAgICByZXR1cm4gbGVmdCA8IHJpZ2h0ID8gLTEgOiBsZWZ0ID4gcmlnaHQgPyAxIDogMDtcbiAgfVxuICBpZiAodHlwZW9mIGEgPT09ICdzeW1ib2wnKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBiID09PSAnc3RyaW5nJyk7XG4gICAgcmV0dXJuIC0xO1xuICB9XG4gIGFzc2VydCh0eXBlb2YgYSA9PT0gJ3N0cmluZycpO1xuICBhc3NlcnQodHlwZW9mIGIgPT09ICdzeW1ib2wnKTtcbiAgcmV0dXJuIDE7XG59O1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGdldE1ldGhvZE5hbWVzID0gdmFsID0+IHtcbiAgbGV0IGxheWVyID0gdmFsO1xuICBjb25zdCBuYW1lcyA9IG5ldyBTZXQoKTsgLy9cbiAgd2hpbGUgKGxheWVyICE9PSBudWxsICYmIGxheWVyICE9PSBPYmplY3QucHJvdG90eXBlKSB7XG4gICAgLy9cbiAgICBjb25zdCBkZXNjcyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMobGF5ZXIpO1xuICAgIGZvciAoY29uc3QgbmFtZSBvZiBvd25LZXlzKGRlc2NzKSkge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBpZiAodHlwZW9mIHZhbFtuYW1lXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBuYW1lcy5hZGQobmFtZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmICghaXNPYmplY3QodmFsKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICAgIGxheWVyID0gZ2V0UHJvdG90eXBlT2YobGF5ZXIpO1xuICB9XG4gIHJldHVybiBoYXJkZW4oWy4uLm5hbWVzXS5zb3J0KGNvbXBhcmVTdHJpbmdpZmllZCkpO1xufTtcbi8vXG4vL1xuJGjNj19vbmNlLmdldE1ldGhvZE5hbWVzKGdldE1ldGhvZE5hbWVzKTtmcmVlemUoZ2V0TWV0aG9kTmFtZXMpO1xuXG4gICAgICAgY29uc3QgbG9jYWxBcHBseUZ1bmN0aW9uID0gKHJlY2lwaWVudCwgYXJncykgPT4ge1xuICB0eXBlb2YgcmVjaXBpZW50ID09PSAnZnVuY3Rpb24nIHx8XG4gICAgYXNzZXJ0LmZhaWwoXG4gICAgICBYYENhbm5vdCBpbnZva2UgdGFyZ2V0IGFzIGEgZnVuY3Rpb247IHR5cGVvZiB0YXJnZXQgaXMgJHtxKFxuICAgICAgICBudHlwZW9mKHJlY2lwaWVudCksXG4gICAgICApfWAsXG4gICAgICBUeXBlRXJyb3IsXG4gICAgKTtcbiAgaWYgKG9uRGVsaXZlcnkgJiYgb25EZWxpdmVyeS5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCwgdW5kZWZpbmVkKSkge1xuICAgIC8vXG4gICAgZGVidWdnZXI7IC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgfVxuICBjb25zdCByZXN1bHQgPSBhcHBseShyZWNpcGllbnQsIHVuZGVmaW5lZCwgYXJncyk7XG4gIHJldHVybiByZXN1bHQ7XG59OyRozY9fb25jZS5sb2NhbEFwcGx5RnVuY3Rpb24obG9jYWxBcHBseUZ1bmN0aW9uKTtcblxuICAgICAgIGNvbnN0IGxvY2FsQXBwbHlNZXRob2QgPSAocmVjaXBpZW50LCBtZXRob2ROYW1lLCBhcmdzKSA9PiB7XG4gIGlmIChtZXRob2ROYW1lID09PSB1bmRlZmluZWQgfHwgbWV0aG9kTmFtZSA9PT0gbnVsbCkge1xuICAgIC8vXG4gICAgcmV0dXJuIGxvY2FsQXBwbHlGdW5jdGlvbihyZWNpcGllbnQsIGFyZ3MpO1xuICB9XG4gIGlmIChyZWNpcGllbnQgPT09IHVuZGVmaW5lZCB8fCByZWNpcGllbnQgPT09IG51bGwpIHtcbiAgICBhc3NlcnQuZmFpbChcbiAgICAgIFhgQ2Fubm90IGRlbGl2ZXIgJHtxKG1ldGhvZE5hbWUpfSB0byB0YXJnZXQ7IHR5cGVvZiB0YXJnZXQgaXMgJHtxKFxuICAgICAgICBudHlwZW9mKHJlY2lwaWVudCksXG4gICAgICApfWAsXG4gICAgICBUeXBlRXJyb3IsXG4gICAgKTtcbiAgfVxuICBjb25zdCBmbiA9IHJlY2lwaWVudFttZXRob2ROYW1lXTtcbiAgaWYgKGZuID09PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnQuZmFpbChcbiAgICAgIFhgdGFyZ2V0IGhhcyBubyBtZXRob2QgJHtxKG1ldGhvZE5hbWUpfSwgaGFzICR7cShcbiAgICAgICAgZ2V0TWV0aG9kTmFtZXMocmVjaXBpZW50KSxcbiAgICAgICl9YCxcbiAgICAgIFR5cGVFcnJvcixcbiAgICApO1xuICB9XG4gIGNvbnN0IGZ0eXBlID0gbnR5cGVvZihmbik7XG4gIHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJyB8fFxuICAgIEZhaWxgaW52b2tlZCBtZXRob2QgJHtxKG1ldGhvZE5hbWUpfSBpcyBub3QgYSBmdW5jdGlvbjsgaXQgaXMgYSAke3EoXG4gICAgICBmdHlwZSxcbiAgICApfWA7XG4gIGlmIChvbkRlbGl2ZXJ5ICYmIG9uRGVsaXZlcnkuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIG1ldGhvZE5hbWUpKSB7XG4gICAgLy9cbiAgICBkZWJ1Z2dlcjsgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9IGFwcGx5KGZuLCByZWNpcGllbnQsIGFyZ3MpO1xuICByZXR1cm4gcmVzdWx0O1xufTskaM2PX29uY2UubG9jYWxBcHBseU1ldGhvZChsb2NhbEFwcGx5TWV0aG9kKTtcblxuICAgICAgIGNvbnN0IGxvY2FsR2V0ID0gKHQsIGtleSkgPT4gdFtrZXldOyRozY9fb25jZS5sb2NhbEdldChsb2NhbEdldCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRNZXRob2ROYW1lcyI6WyJnZXRNZXRob2ROYW1lcyJdLCJsb2NhbEFwcGx5RnVuY3Rpb24iOlsibG9jYWxBcHBseUZ1bmN0aW9uIl0sImxvY2FsQXBwbHlNZXRob2QiOlsibG9jYWxBcHBseU1ldGhvZCJdLCJsb2NhbEdldCI6WyJsb2NhbEdldCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB5M+y4PA8AADwPAAA1AAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEvc3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanN7ImltcG9ydHMiOlsiQGVuZG8vZW52LW9wdGlvbnMiXSwiZXhwb3J0cyI6WyJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBnZXRFbnZpcm9ubWVudE9wdGlvbjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vudi1vcHRpb25zXCIsIFtbXCJnZXRFbnZpcm9ubWVudE9wdGlvblwiLFskaM2PX2EgPT4gKGdldEVudmlyb25tZW50T3B0aW9uID0gJGjNj19hKV1dXV1dKTtcblxuY29uc3QgeyBxdW90ZTogcSwgRmFpbCB9ID0gYXNzZXJ0O1xuXG5jb25zdCB7IGhhc093biwgZnJlZXplLCBlbnRyaWVzIH0gPSBPYmplY3Q7XG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbi8qXG5cblxuXG5cblxuICovXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG4gKi9cbmNvbnN0IGlzSlNPTlJlY29yZCA9IHZhbCA9PlxuICB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiB2YWwgIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3Qgc2ltcGxpZnlUYWcgPSB0YWcgPT4ge1xuICBmb3IgKGNvbnN0IHByZWZpeCBvZiBbJ0FsbGVnZWQ6ICcsICdEZWJ1Z05hbWU6ICddKSB7XG4gICAgaWYgKHRhZy5zdGFydHNXaXRoKHByZWZpeCkpIHtcbiAgICAgIHJldHVybiB0YWcuc2xpY2UocHJlZml4Lmxlbmd0aCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0YWc7XG59O1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciA9IG9wdGlvbk5hbWUgPT4ge1xuICBsZXQgYnJlYWtwb2ludHMgPSBKU09OLnBhcnNlKGdldEVudmlyb25tZW50T3B0aW9uKG9wdGlvbk5hbWUsICdudWxsJykpO1xuXG4gIGlmIChicmVha3BvaW50cyA9PT0gbnVsbCkge1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgbGV0IGJyZWFrcG9pbnRzVGFibGU7XG5cbiAgY29uc3QgZ2V0QnJlYWtwb2ludHMgPSAoKSA9PiBicmVha3BvaW50cztcbiAgZnJlZXplKGdldEJyZWFrcG9pbnRzKTtcblxuICBjb25zdCBzZXRCcmVha3BvaW50cyA9IChuZXdCcmVha3BvaW50cyA9IGJyZWFrcG9pbnRzKSA9PiB7XG4gICAgaXNKU09OUmVjb3JkKG5ld0JyZWFrcG9pbnRzKSB8fFxuICAgICAgRmFpbGBFeHBlY3RlZCAke3Eob3B0aW9uTmFtZSl9IG9wdGlvbiB0byBiZSBhIEpTT04gYnJlYWtwb2ludHMgcmVjb3JkYDtcblxuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIC8vXG4gICAgY29uc3QgbmV3QnJlYWtwb2ludHNUYWJsZSA9IHsgX19wcm90b19fOiBudWxsIH07XG5cbiAgICBmb3IgKGNvbnN0IFt0YWcsIG1ldGhvZEJQc10gb2YgZW50cmllcyhuZXdCcmVha3BvaW50cykpIHtcbiAgICAgIHRhZyA9PT0gc2ltcGxpZnlUYWcodGFnKSB8fFxuICAgICAgICBGYWlsYEp1c3QgdXNlIHNpbXBsZSB0YWcgJHtxKHNpbXBsaWZ5VGFnKHRhZykpfSByYXRoZXIgdGhhbiAke3EodGFnKX1gO1xuICAgICAgaXNKU09OUmVjb3JkKG1ldGhvZEJQcykgfHxcbiAgICAgICAgRmFpbGBFeHBlY3RlZCAke3Eob3B0aW9uTmFtZSl9IG9wdGlvbidzICR7cShcbiAgICAgICAgICB0YWcsXG4gICAgICAgICl9IHRvIGJlIGEgSlNPTiBtZXRob2RzIGJyZWFrcG9pbnRzIHJlY29yZGA7XG4gICAgICBmb3IgKGNvbnN0IFttZXRob2ROYW1lLCBjb3VudF0gb2YgZW50cmllcyhtZXRob2RCUHMpKSB7XG4gICAgICAgIGNvdW50ID09PSAnKicgfHxcbiAgICAgICAgICAodHlwZW9mIGNvdW50ID09PSAnbnVtYmVyJyAmJlxuICAgICAgICAgICAgTnVtYmVyLmlzU2FmZUludGVnZXIoY291bnQpICYmXG4gICAgICAgICAgICBjb3VudCA+PSAwKSB8fFxuICAgICAgICAgIEZhaWxgRXhwZWN0ZWQgJHtxKG9wdGlvbk5hbWUpfSBvcHRpb24ncyAke3EodGFnKX0uJHtxKFxuICAgICAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgICApfSB0byBiZSBcIipcIiBvciBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyYDtcblxuICAgICAgICBjb25zdCBjbGFzc0JQcyA9IGhhc093bihuZXdCcmVha3BvaW50c1RhYmxlLCBtZXRob2ROYW1lKVxuICAgICAgICAgID8gbmV3QnJlYWtwb2ludHNUYWJsZVttZXRob2ROYW1lXVxuICAgICAgICAgIDogKG5ld0JyZWFrcG9pbnRzVGFibGVbbWV0aG9kTmFtZV0gPSB7XG4gICAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICBjbGFzc0JQc1t0YWddID0gY291bnQ7XG4gICAgICB9XG4gICAgfVxuICAgIGJyZWFrcG9pbnRzID0gbmV3QnJlYWtwb2ludHM7XG4gICAgYnJlYWtwb2ludHNUYWJsZSA9IG5ld0JyZWFrcG9pbnRzVGFibGU7XG4gIH07XG4gIGZyZWV6ZShzZXRCcmVha3BvaW50cyk7XG5cbiAgY29uc3Qgc2hvdWxkQnJlYWtwb2ludCA9IChyZWNpcGllbnQsIG1ldGhvZE5hbWUpID0+IHtcbiAgICBpZiAobWV0aG9kTmFtZSA9PT0gdW5kZWZpbmVkIHx8IG1ldGhvZE5hbWUgPT09IG51bGwpIHtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGNsYXNzQlBzID0gYnJlYWtwb2ludHNUYWJsZVttZXRob2ROYW1lXSB8fCBicmVha3BvaW50c1RhYmxlWycqJ107XG4gICAgaWYgKGNsYXNzQlBzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbGV0IHRhZyA9IHNpbXBsaWZ5VGFnKHJlY2lwaWVudFtTeW1ib2wudG9TdHJpbmdUYWddKTtcbiAgICBsZXQgY291bnQgPSBjbGFzc0JQc1t0YWddO1xuICAgIGlmIChjb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0YWcgPSAnKic7XG4gICAgICBjb3VudCA9IGNsYXNzQlBzW3RhZ107XG4gICAgICBpZiAoY291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjb3VudCA9PT0gJyonKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGNvdW50ID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgYXNzZXJ0KHR5cGVvZiBjb3VudCA9PT0gJ251bWJlcicgJiYgY291bnQgPj0gMSk7XG4gICAgY2xhc3NCUHNbdGFnXSA9IGNvdW50IC0gMTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG4gIGZyZWV6ZShzaG91bGRCcmVha3BvaW50KTtcblxuICBjb25zdCBicmVha3BvaW50VGVzdGVyID0gZnJlZXplKHtcbiAgICBnZXRCcmVha3BvaW50cyxcbiAgICBzZXRCcmVha3BvaW50cyxcbiAgICBzaG91bGRCcmVha3BvaW50LFxuICB9KTtcbiAgYnJlYWtwb2ludFRlc3Rlci5zZXRCcmVha3BvaW50cygpO1xuICByZXR1cm4gYnJlYWtwb2ludFRlc3Rlcjtcbn07JGjNj19vbmNlLm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlcihtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIpO1xuZnJlZXplKG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3Rlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIiOlsibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALh2lJ1fAwAAXwMAACkAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMS9zcmMvbm8tc2hpbS5qc3siaW1wb3J0cyI6WyIuL0UuanMiLCIuL2V4cG9ydHMuanMiXSwiZXhwb3J0cyI6WyJFIiwiSGFuZGxlZFByb21pc2UiXSwicmVleHBvcnRzIjpbIi4vZXhwb3J0cy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG1ha2VFOyRozY9faW1wb3J0cyhbW1wiLi9FLmpzXCIsIFtbXCJkZWZhdWx0XCIsWyRozY9fYSA9PiAobWFrZUUgPSAkaM2PX2EpXV1dXSxbXCIuL2V4cG9ydHMuanNcIiwgW11dXSk7XG5cbi8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCBocCA9IEhhbmRsZWRQcm9taXNlO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqLyRozY9fb25jZS5ocChocCk7XG4gICAgICAgY29uc3QgRSA9IG1ha2VFKGhwKTskaM2PX29uY2UuRShFKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkhhbmRsZWRQcm9taXNlIjpbImhwIl0sIkUiOlsiRSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACpgMOzngoAAJ4KAAAtAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEvc3JjL3RyYWNrLXR1cm5zLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vudi1vcHRpb25zIl0sImV4cG9ydHMiOlsidHJhY2tUdXJucyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGdldEVudmlyb25tZW50T3B0aW9uLGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lbnYtb3B0aW9uc1wiLCBbW1wiZ2V0RW52aXJvbm1lbnRPcHRpb25cIixbJGjNj19hID0+IChnZXRFbnZpcm9ubWVudE9wdGlvbiA9ICRozY9fYSldXSxbXCJlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzXCIsWyRozY9fYSA9PiAoZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuLy9cbi8vXG4vL1xuLy9cbi8vXG5cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cblxubGV0IGhpZGRlblByaW9yRXJyb3I7XG5sZXQgaGlkZGVuQ3VycmVudFR1cm4gPSAwO1xubGV0IGhpZGRlbkN1cnJlbnRFdmVudCA9IDA7XG5cbi8vXG5jb25zdCBWRVJCT1NFID0gZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcygnREVCVUcnLCAndHJhY2stdHVybnMnKTtcblxuLy9cbi8vXG5jb25zdCBFTkFCTEVEID1cbiAgZ2V0RW52aXJvbm1lbnRPcHRpb24oJ1RSQUNLX1RVUk5TJywgJ2Rpc2FibGVkJywgWydlbmFibGVkJ10pID09PSAnZW5hYmxlZCc7XG5cbi8vXG4vL1xuLy9cbi8vXG5cbmNvbnN0IGFkZFJlamVjdGlvbk5vdGUgPSBkZXRhaWxzTm90ZSA9PiByZWFzb24gPT4ge1xuICBpZiAocmVhc29uIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICBnbG9iYWxUaGlzLmFzc2VydC5ub3RlKHJlYXNvbiwgZGV0YWlsc05vdGUpO1xuICB9XG4gIGlmIChWRVJCT1NFKSB7XG4gICAgY29uc29sZS5sb2coJ1JFSkVDVEVEIGF0IHRvcCBvZiBldmVudCBsb29wJywgcmVhc29uKTtcbiAgfVxufTtcblxuY29uc3Qgd3JhcEZ1bmN0aW9uID1cbiAgKGZ1bmMsIHNlbmRpbmdFcnJvciwgWCkgPT5cbiAgKC4uLmFyZ3MpID0+IHtcbiAgICBoaWRkZW5QcmlvckVycm9yID0gc2VuZGluZ0Vycm9yO1xuICAgIGhpZGRlbkN1cnJlbnRUdXJuICs9IDE7XG4gICAgaGlkZGVuQ3VycmVudEV2ZW50ID0gMDtcbiAgICB0cnkge1xuICAgICAgbGV0IHJlc3VsdDtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdCA9IGZ1bmMoLi4uYXJncyk7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgZ2xvYmFsVGhpcy5hc3NlcnQubm90ZShcbiAgICAgICAgICAgIGVycixcbiAgICAgICAgICAgIFhgVGhyb3duIGZyb206ICR7aGlkZGVuUHJpb3JFcnJvcn06JHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChWRVJCT1NFKSB7XG4gICAgICAgICAgY29uc29sZS5sb2coJ1RIUk9XTiB0byB0b3Agb2YgZXZlbnQgbG9vcCcsIGVycik7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgLy9cbiAgICAgIGNvbnN0IGRldGFpbHNOb3RlID0gWGBSZWplY3Rpb24gZnJvbTogJHtoaWRkZW5QcmlvckVycm9yfToke2hpZGRlbkN1cnJlbnRUdXJufS4ke2hpZGRlbkN1cnJlbnRFdmVudH1gO1xuICAgICAgUHJvbWlzZS5yZXNvbHZlKHJlc3VsdCkuY2F0Y2goYWRkUmVqZWN0aW9uTm90ZShkZXRhaWxzTm90ZSkpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9IGZpbmFsbHkge1xuICAgICAgaGlkZGVuUHJpb3JFcnJvciA9IHVuZGVmaW5lZDtcbiAgICB9XG4gIH07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHRyYWNrVHVybnMgPSBmdW5jcyA9PiB7XG4gIGlmICghRU5BQkxFRCB8fCB0eXBlb2YgZ2xvYmFsVGhpcyA9PT0gJ3VuZGVmaW5lZCcgfHwgIWdsb2JhbFRoaXMuYXNzZXJ0KSB7XG4gICAgcmV0dXJuIGZ1bmNzO1xuICB9XG4gIGNvbnN0IHsgZGV0YWlsczogWCwgbm90ZTogYW5ub3RhdGVFcnJvciB9ID0gZ2xvYmFsVGhpcy5hc3NlcnQ7XG5cbiAgaGlkZGVuQ3VycmVudEV2ZW50ICs9IDE7XG4gIGNvbnN0IHNlbmRpbmdFcnJvciA9IEVycm9yKFxuICAgIGBFdmVudDogJHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCxcbiAgKTtcbiAgaWYgKGhpZGRlblByaW9yRXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgIGFubm90YXRlRXJyb3Ioc2VuZGluZ0Vycm9yLCBYYENhdXNlZCBieTogJHtoaWRkZW5QcmlvckVycm9yfWApO1xuICB9XG5cbiAgcmV0dXJuIC8qICAgICAgICAgICAgKi8gKFxuICAgIGZ1bmNzLm1hcChmdW5jID0+IGZ1bmMgJiYgd3JhcEZ1bmN0aW9uKGZ1bmMsIHNlbmRpbmdFcnJvciwgWCkpXG4gICk7XG59O1xuXG4vKlxuXG5cblxuXG4gKi8kaM2PX29uY2UudHJhY2tUdXJucyh0cmFja1R1cm5zKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InRyYWNrVHVybnMiOlsidHJhY2tUdXJucyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB7oaBHZAIAAGQCAAAjAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEvdXRpbHMuanN7ImltcG9ydHMiOlsiLi9zcmMvbG9jYWwuanMiLCIuL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIl0sImV4cG9ydHMiOltudWxsLG51bGxdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9sb2NhbC5qc1wiLCBbXV0sW1wiLi9zcmMvbWVzc2FnZS1icmVha3BvaW50cy5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2xvY2FsLmpzIjpbWyJnZXRNZXRob2ROYW1lcyIsImdldE1ldGhvZE5hbWVzIl1dLCIuL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIjpbWyJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIiLCJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANaBKoBZDAAAWQwAADUAAABAZW5kby9pbXBvcnQtYnVuZGxlLXYxLjQuMC9zcmMvY29tcGFydG1lbnQtd3JhcHBlci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsid3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50LCduYW1lJyx7dmFsdWU6XCJ3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudFwifSk7JGjNj19vbmNlLndyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50KHdyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50KTsvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5jb25zdCBjb21wYXJ0bWVudE9wdGlvbnMgPSAoLi4uYXJncykgPT4ge1xuICBpZiAoYXJncy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4ge307XG4gIH1cbiAgaWYgKFxuICAgIGFyZ3MubGVuZ3RoID09PSAxICYmXG4gICAgdHlwZW9mIGFyZ3NbMF0gPT09ICdvYmplY3QnICYmXG4gICAgYXJnc1swXSAhPT0gbnVsbCAmJlxuICAgICdfX29wdGlvbnNfXycgaW4gYXJnc1swXVxuICApIHtcbiAgICBjb25zdCB7IF9fb3B0aW9uc19fLCAuLi5vcHRpb25zIH0gPSBhcmdzWzBdO1xuICAgIGFzc2VydChcbiAgICAgIF9fb3B0aW9uc19fID09PSB0cnVlLFxuICAgICAgYENvbXBhcnRtZW50IGNvbnN0cnVjdG9yIG9ubHkgc3VwcG9ydHMgdHJ1ZSBfX29wdGlvbnNfXyBzaWdpbCwgZ290ICR7X19vcHRpb25zX199YCxcbiAgICApO1xuICAgIHJldHVybiBvcHRpb25zO1xuICB9IGVsc2Uge1xuICAgIGNvbnN0IFtcbiAgICAgIGdsb2JhbHMgPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICovICh7fSksXG4gICAgICBtb2R1bGVzID0gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKHt9KSxcbiAgICAgIG9wdGlvbnMgPSB7fSxcbiAgICBdID0gYXJncztcbiAgICBhc3NlcnQuZXF1YWwoXG4gICAgICBvcHRpb25zLm1vZHVsZXMsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBgQ29tcGFydG1lbnQgY29uc3RydWN0b3IgbXVzdCByZWNlaXZlIGVpdGhlciBhIG1vZHVsZSBtYXAgYXJndW1lbnQgb3IgbW9kdWxlcyBvcHRpb24sIG5vdCBib3RoYCxcbiAgICApO1xuICAgIGFzc2VydC5lcXVhbChcbiAgICAgIG9wdGlvbnMuZ2xvYmFscyxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIGBDb21wYXJ0bWVudCBjb25zdHJ1Y3RvciBtdXN0IHJlY2VpdmUgZWl0aGVyIGdsb2JhbHMgYXJndW1lbnQgb3Igb3B0aW9uLCBub3QgYm90aGAsXG4gICAgKTtcbiAgICByZXR1cm4ge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIGdsb2JhbHMsXG4gICAgICBtb2R1bGVzLFxuICAgIH07XG4gIH1cbn07XG5cbiAgICAgICBmdW5jdGlvbiB3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudChcbiAgT2xkQ29tcGFydG1lbnQsXG4gIGluZXNjYXBhYmxlVHJhbnNmb3JtcyxcbiAgaW5lc2NhcGFibGVHbG9iYWxQcm9wZXJ0aWVzLFxuKSB7XG4gIC8vXG4gIC8vXG4gIC8vXG4gIGNvbnN0IE5ld0NvbXBhcnRtZW50ID0gZnVuY3Rpb24gQ29tcGFydG1lbnQoLi4uYXJncykge1xuICAgIGNvbnN0IHsgdHJhbnNmb3Jtczogb2xkVHJhbnNmb3JtcyA9IFtdLCAuLi5vdGhlck9wdGlvbnMgfSA9XG4gICAgICBjb21wYXJ0bWVudE9wdGlvbnMoLi4uYXJncyk7XG4gICAgY29uc3QgbmV3VHJhbnNmb3JtcyA9IFsuLi5vbGRUcmFuc2Zvcm1zLCAuLi5pbmVzY2FwYWJsZVRyYW5zZm9ybXNdO1xuICAgIGNvbnN0IG5ld09wdGlvbnMgPSB7XG4gICAgICAuLi5vdGhlck9wdGlvbnMsXG4gICAgICB0cmFuc2Zvcm1zOiBuZXdUcmFuc2Zvcm1zLFxuICAgICAgX19vcHRpb25zX186IHRydWUsXG4gICAgfTtcblxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgaWYgKG5ldy50YXJnZXQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy9cbiAgICAgIHRocm93IEVycm9yKCdDb21wYXJ0bWVudCBtdXN0IGJlIGNhbGxlZCBhcyBhIGNvbnN0cnVjdG9yJyk7XG4gICAgfVxuXG4gICAgLy9cblxuICAgIGNvbnN0IGMgPSBSZWZsZWN0LmNvbnN0cnVjdChPbGRDb21wYXJ0bWVudCwgW25ld09wdGlvbnNdLCBuZXcudGFyZ2V0KTtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBjLmdsb2JhbFRoaXMuQ29tcGFydG1lbnQgPSBOZXdDb21wYXJ0bWVudDtcblxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGZvciAoY29uc3QgcHJvcCBvZiBSZWZsZWN0Lm93bktleXMoaW5lc2NhcGFibGVHbG9iYWxQcm9wZXJ0aWVzKSkge1xuICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGMuZ2xvYmFsVGhpcywgcHJvcCwge1xuICAgICAgICB2YWx1ZTogaW5lc2NhcGFibGVHbG9iYWxQcm9wZXJ0aWVzW3Byb3BdLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgLy9cbiAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBjO1xuICB9O1xuXG4gIC8vXG4gIE5ld0NvbXBhcnRtZW50LnByb3RvdHlwZSA9IE9sZENvbXBhcnRtZW50LnByb3RvdHlwZTtcblxuICAvL1xuICAvL1xuICAvL1xuICAvL1xuICAvL1xuXG4gIHJldHVybiBOZXdDb21wYXJ0bWVudDtcbn1cblxuLy9cbi8vXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudCI6WyJ3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACrtsVhihYAAIoWAAAnAAAAQGVuZG8vaW1wb3J0LWJ1bmRsZS12MS40LjAvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9pbXBvcnQtYXJjaGl2ZS5qcyIsIkBlbmRvL2Jhc2U2NCIsIkBlbmRvL2Vycm9ycyIsIi4vY29tcGFydG1lbnQtd3JhcHBlci5qcyJdLCJleHBvcnRzIjpbImJ1bmRsZVRlc3RFeHBvcnRzIiwiaW1wb3J0QnVuZGxlIiwidHlwZWRJbXBvcnRCdW5kbGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBwYXJzZUFyY2hpdmUsZGVjb2RlQmFzZTY0LEZhaWwsd3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvaW1wb3J0LWFyY2hpdmUuanNcIiwgW1tcInBhcnNlQXJjaGl2ZVwiLFskaM2PX2EgPT4gKHBhcnNlQXJjaGl2ZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Jhc2U2NFwiLCBbW1wiZGVjb2RlQmFzZTY0XCIsWyRozY9fYSA9PiAoZGVjb2RlQmFzZTY0ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vY29tcGFydG1lbnQtd3JhcHBlci5qc1wiLCBbW1wid3JhcEluZXNjYXBhYmxlQ29tcGFydG1lbnRcIixbJGjNj19hID0+ICh3cmFwSW5lc2NhcGFibGVDb21wYXJ0bWVudCA9ICRozY9fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGltcG9ydEJ1bmRsZSwnbmFtZScse3ZhbHVlOlwiaW1wb3J0QnVuZGxlXCJ9KTskaM2PX29uY2UuaW1wb3J0QnVuZGxlKGltcG9ydEJ1bmRsZSk7XG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG4gKi9cblxuLypcblxuXG5cbiAqL1xuXG4vL1xuLy9cbiAgICAgICBhc3luYyBmdW5jdGlvbiBpbXBvcnRCdW5kbGUoYnVuZGxlLCBvcHRpb25zID0ge30sIHBvd2VycyA9IHt9KSB7XG4gIGF3YWl0IG51bGw7XG4gIGNvbnN0IHtcbiAgICBidW5kbGVVcmwgPSB1bmRlZmluZWQsXG4gICAgZmlsZVByZWZpeCxcbiAgICBlbmRvd21lbnRzOiBvcHRFbmRvd21lbnRzID0ge30sXG4gICAgLy9cbiAgICAvL1xuICAgIHRyYW5zZm9ybXMgPSBbXSxcbiAgICBpbmVzY2FwYWJsZVRyYW5zZm9ybXMgPSBbXSxcbiAgICBpbmVzY2FwYWJsZUdsb2JhbFByb3BlcnRpZXMgPSB7fSxcbiAgICBleHBlY3RlZFNoYTUxMiA9IHVuZGVmaW5lZCxcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IHtcbiAgICBjb21wdXRlU2hhNTEyID0gdW5kZWZpbmVkLFxuICAgIGNvbXB1dGVTb3VyY2VMb2NhdGlvbiA9IHVuZGVmaW5lZCxcbiAgICBjb21wdXRlU291cmNlTWFwTG9jYXRpb24gPSB1bmRlZmluZWQsXG4gIH0gPSBwb3dlcnM7XG4gIGNvbnN0IGVuZG93bWVudHMgPSB7XG4gICAgVGV4dEVuY29kZXIsXG4gICAgVGV4dERlY29kZXIsXG4gICAgVVJMOiBnbG9iYWxUaGlzLlVSTCwgLy9cbiAgICBCYXNlNjQ6IGdsb2JhbFRoaXMuQmFzZTY0LCAvL1xuICAgIGF0b2I6IGdsb2JhbFRoaXMuYXRvYixcbiAgICBidG9hOiBnbG9iYWxUaGlzLmJ0b2EsXG4gICAgLi4ub3B0RW5kb3dtZW50cyxcbiAgfTtcblxuICBsZXQgQ29tcGFydG1lbnRUb1VzZSA9IENvbXBhcnRtZW50O1xuICBpZiAoXG4gICAgaW5lc2NhcGFibGVUcmFuc2Zvcm1zLmxlbmd0aCB8fFxuICAgIE9iamVjdC5rZXlzKGluZXNjYXBhYmxlR2xvYmFsUHJvcGVydGllcykubGVuZ3RoXG4gICkge1xuICAgIC8vXG4gICAgQ29tcGFydG1lbnRUb1VzZSA9IHdyYXBJbmVzY2FwYWJsZUNvbXBhcnRtZW50KFxuICAgICAgQ29tcGFydG1lbnQsXG4gICAgICBpbmVzY2FwYWJsZVRyYW5zZm9ybXMsXG4gICAgICBpbmVzY2FwYWJsZUdsb2JhbFByb3BlcnRpZXMsXG4gICAgKTtcbiAgfVxuXG4gIGxldCBjb21wYXJ0bWVudDtcblxuICBhc3NlcnQoJ21vZHVsZUZvcm1hdCcgaW4gYnVuZGxlKTtcbiAgY29uc3QgeyBtb2R1bGVGb3JtYXQgfSA9IGJ1bmRsZTtcbiAgaWYgKG1vZHVsZUZvcm1hdCA9PT0gJ2VuZG9aaXBCYXNlNjQnKSB7XG4gICAgYXNzZXJ0KCdlbmRvWmlwQmFzZTY0JyBpbiBidW5kbGUpO1xuICAgIGNvbnN0IHsgZW5kb1ppcEJhc2U2NCB9ID0gYnVuZGxlO1xuICAgIGNvbnN0IGJ5dGVzID0gZGVjb2RlQmFzZTY0KGVuZG9aaXBCYXNlNjQpO1xuICAgIGNvbnN0IGFyY2hpdmUgPSBhd2FpdCBwYXJzZUFyY2hpdmUoYnl0ZXMsIGJ1bmRsZVVybCwge1xuICAgICAgY29tcHV0ZVNoYTUxMixcbiAgICAgIGV4cGVjdGVkU2hhNTEyLFxuICAgICAgY29tcHV0ZVNvdXJjZUxvY2F0aW9uLFxuICAgICAgY29tcHV0ZVNvdXJjZU1hcExvY2F0aW9uLFxuICAgIH0pO1xuICAgIC8vXG4gICAgLy9cbiAgICBjb25zdCB7IG5hbWVzcGFjZSB9ID0gYXdhaXQgYXJjaGl2ZVsnaW1wb3J0J10oe1xuICAgICAgZ2xvYmFsczogZW5kb3dtZW50cyxcbiAgICAgIF9fc2hpbVRyYW5zZm9ybXNfXzogdHJhbnNmb3JtcyxcbiAgICAgIENvbXBhcnRtZW50OiBDb21wYXJ0bWVudFRvVXNlLFxuICAgIH0pO1xuICAgIC8vXG4gICAgcmV0dXJuIG5hbWVzcGFjZTtcbiAgfVxuXG4gIC8vXG4gIC8vXG4gIGlmIChtb2R1bGVGb3JtYXQgPT09ICd0ZXN0Jykge1xuICAgIGNvbnN0IGV4cG9ydHMgPSBidW5kbGVbU3ltYm9sLmZvcignZXhwb3J0cycpXTtcbiAgICBpZiAoZXhwb3J0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdDYW5ub3QgaW1wb3J0IGJ1bmRsZSB3aXRoIG1vZHVsZUZvcm1hdCBcInRlc3RcIiB0aGF0IGxhY2tzIGFuIHN5bWJvbC1uYW1lZCBwcm9wZXJ0eSBAZXhwb3J0cyBhbmQgaGFzIGxpa2VseSBiZWVuIHBhcnRpYWxseSB0cmFuc3BvcnRlZCB2aWEgSlNPTiBvciBldmVudHVhbC1zZW5kJyxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgcmV0dXJuIE9iamVjdC5zZWFsKFxuICAgICAgT2JqZWN0LmNyZWF0ZShcbiAgICAgICAgbnVsbCxcbiAgICAgICAgT2JqZWN0LmZyb21FbnRyaWVzKFtcbiAgICAgICAgICAuLi5PYmplY3QuZW50cmllcyhPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhleHBvcnRzKSlcbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAuc29ydCgoW2FdLCBbYl0pID0+IChhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogMCkpXG4gICAgICAgICAgICAuZmlsdGVyKFxuICAgICAgICAgICAgICAoW25hbWUsIGRlc2NyaXB0b3JdKSA9PlxuICAgICAgICAgICAgICAgIHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyAmJiBkZXNjcmlwdG9yLmVudW1lcmFibGUsXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAubWFwKChbbmFtZV0pID0+IFtcbiAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHZhbHVlOiBleHBvcnRzW25hbWVdLFxuICAgICAgICAgICAgICAgIHdyaXRhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdKSxcbiAgICAgICAgICBbXG4gICAgICAgICAgICBTeW1ib2wudG9TdHJpbmdUYWcsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHZhbHVlOiAnTW9kdWxlJyxcbiAgICAgICAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgXSksXG4gICAgICApLFxuICAgICk7XG4gIH1cblxuICBhc3NlcnQoJ3NvdXJjZScgaW4gYnVuZGxlKTtcbiAgbGV0IHsgc291cmNlIH0gPSBidW5kbGU7XG4gIGNvbnN0IHNvdXJjZU1hcCA9ICdzb3VyY2VNYXAnIGluIGJ1bmRsZSA/IGJ1bmRsZS5zb3VyY2VNYXAgOiAnJztcbiAgaWYgKG1vZHVsZUZvcm1hdCA9PT0gJ2dldEV4cG9ydCcpIHtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgc291cmNlID0gYCgke3NvdXJjZX0pXFxuJHtzb3VyY2VNYXB9YDtcbiAgfSBlbHNlIGlmIChtb2R1bGVGb3JtYXQgPT09ICduZXN0ZWRFdmFsdWF0ZScpIHtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGVuZG93bWVudHMubmVzdGVkRXZhbHVhdGUgPSBzcmMgPT4gY29tcGFydG1lbnQuZXZhbHVhdGUoc3JjKTtcbiAgICBzb3VyY2UgPSBgKCR7c291cmNlfSlcXG4ke3NvdXJjZU1hcH1gO1xuICB9IGVsc2UgaWYgKG1vZHVsZUZvcm1hdCA9PT0gJ2VuZG9TY3JpcHQnKSB7XG4gICAgLy9cbiAgfSBlbHNlIHtcbiAgICBGYWlsYHVucmVjb2duaXplZCBtb2R1bGVGb3JtYXQgJyR7bW9kdWxlRm9ybWF0fSdgO1xuICB9XG5cbiAgY29tcGFydG1lbnQgPSBuZXcgQ29tcGFydG1lbnRUb1VzZShlbmRvd21lbnRzLCB7fSwgeyB0cmFuc2Zvcm1zIH0pO1xuICBoYXJkZW4oY29tcGFydG1lbnQuZ2xvYmFsVGhpcyk7XG4gIGNvbnN0IHJlc3VsdCA9IGNvbXBhcnRtZW50LmV2YWx1YXRlKHNvdXJjZSk7XG4gIGlmIChtb2R1bGVGb3JtYXQgPT09ICdlbmRvU2NyaXB0Jykge1xuICAgIC8vXG4gICAgLy9cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9IGVsc2Uge1xuICAgIC8vXG4gICAgY29uc3QgbmFtZXNwYWNlID0gcmVzdWx0KGZpbGVQcmVmaXgpO1xuICAgIC8vXG4gICAgcmV0dXJuIG5hbWVzcGFjZTtcbiAgfVxufVxuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgdHlwZWRJbXBvcnRCdW5kbGUgPSBpbXBvcnRCdW5kbGU7XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS50eXBlZEltcG9ydEJ1bmRsZSh0eXBlZEltcG9ydEJ1bmRsZSk7XG4gICAgICAgY29uc3QgYnVuZGxlVGVzdEV4cG9ydHMgPSBleHBvcnRzID0+IHtcbiAgY29uc3Qgc3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMoZXhwb3J0cykuZmlsdGVyKFxuICAgIG5hbWUgPT4gbmFtZSAhPT0gU3ltYm9sLnRvU3RyaW5nVGFnLFxuICApO1xuICBzeW1ib2xzLmxlbmd0aCA+IDAgJiZcbiAgICBGYWlsYGV4cG9ydHMgbXVzdCBub3QgaGF2ZSBzeW1ib2wtbmFtZWQgcHJvcGVydGllcywgZ290OiAke3N5bWJvbHMubWFwKFN0cmluZykuam9pbignLCAnKX1gO1xuICByZXR1cm4ge1xuICAgIG1vZHVsZUZvcm1hdDogJ3Rlc3QnLFxuICAgIFtTeW1ib2wuZm9yKCdleHBvcnRzJyldOiBleHBvcnRzLFxuICB9O1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiovJGjNj19vbmNlLmJ1bmRsZVRlc3RFeHBvcnRzKGJ1bmRsZVRlc3RFeHBvcnRzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImltcG9ydEJ1bmRsZSI6WyJpbXBvcnRCdW5kbGUiXSwidHlwZWRJbXBvcnRCdW5kbGUiOlsidHlwZWRJbXBvcnRCdW5kbGUiXSwiYnVuZGxlVGVzdEV4cG9ydHMiOlsiYnVuZGxlVGVzdEV4cG9ydHMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAALdVQBoIHAACCBwAAHQAAAEBlbmRvL21hcnNoYWwtdjEuNi40L2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qcyIsIi4vc3JjL21hcnNoYWwuanMiLCIuL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyIsIi4vc3JjL21hcnNoYWwtanVzdGluLmpzIiwiLi9zcmMvZW5jb2RlUGFzc2FibGUuanMiLCIuL3NyYy9yYW5rT3JkZXIuanMiLCIuL3NyYy90eXBlcy5qcyIsIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiZXhwb3J0cyI6WyJhc3NlcnRSYW5rU29ydGVkIiwiYXNzZXJ0UmFua1NvcnRlZCIsIm1ha2VFbmNvZGVQYXNzYWJsZSIsIm1ha2VFbmNvZGVQYXNzYWJsZSIsInBhcnNlIiwicGFyc2UiLG51bGwsbnVsbCxudWxsLG51bGxdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdHlwZXMuanMiLCJAZW5kby9wYXNzLXN0eWxlIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qc1wiLCBbXV0sW1wiLi9zcmMvbWFyc2hhbC5qc1wiLCBbXV0sW1wiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanNcIiwgW11dLFtcIi4vc3JjL21hcnNoYWwtanVzdGluLmpzXCIsIFtdXSxbXCIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qc1wiLCBbXV0sW1wiLi9zcmMvcmFua09yZGVyLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qcyI6W1siUUNMQVNTIiwiUUNMQVNTIl1dLCIuL3NyYy9tYXJzaGFsLmpzIjpbWyJtYWtlTWFyc2hhbCIsIm1ha2VNYXJzaGFsIl1dLCIuL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyI6W1sic3RyaW5naWZ5Iiwic3RyaW5naWZ5Il0sWyJwYXJzZSIsInBhcnNlIl1dLCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qcyI6W1siZGVjb2RlVG9KdXN0aW4iLCJkZWNvZGVUb0p1c3RpbiJdXSwiLi9zcmMvZW5jb2RlUGFzc2FibGUuanMiOltbIm1ha2VQYXNzYWJsZUtpdCIsIm1ha2VQYXNzYWJsZUtpdCJdLFsibWFrZUVuY29kZVBhc3NhYmxlIiwibWFrZUVuY29kZVBhc3NhYmxlIl0sWyJtYWtlRGVjb2RlUGFzc2FibGUiLCJtYWtlRGVjb2RlUGFzc2FibGUiXSxbImlzRW5jb2RlZFJlbW90YWJsZSIsImlzRW5jb2RlZFJlbW90YWJsZSJdLFsiemVyb1BhZCIsInplcm9QYWQiXSxbInJlY29yZE5hbWVzIiwicmVjb3JkTmFtZXMiXSxbInJlY29yZFZhbHVlcyIsInJlY29yZFZhbHVlcyJdXSwiLi9zcmMvcmFua09yZGVyLmpzIjpbWyJ0cml2aWFsQ29tcGFyYXRvciIsInRyaXZpYWxDb21wYXJhdG9yIl0sWyJhc3NlcnRSYW5rU29ydGVkIiwiYXNzZXJ0UmFua1NvcnRlZCJdLFsiY29tcGFyZVJhbmsiLCJjb21wYXJlUmFuayJdLFsiaXNSYW5rU29ydGVkIiwiaXNSYW5rU29ydGVkIl0sWyJzb3J0QnlSYW5rIiwic29ydEJ5UmFuayJdLFsiY29tcGFyZUFudGlSYW5rIiwiY29tcGFyZUFudGlSYW5rIl0sWyJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCIsIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0Il0sWyJnZXRQYXNzU3R5bGVDb3ZlciIsImdldFBhc3NTdHlsZUNvdmVyIl0sWyJpbnRlcnNlY3RSYW5rQ292ZXJzIiwiaW50ZXJzZWN0UmFua0NvdmVycyJdLFsidW5pb25SYW5rQ292ZXJzIiwidW5pb25SYW5rQ292ZXJzIl1dLCJAZW5kby9wYXNzLXN0eWxlIjpbWyJkZWVwbHlGdWxmaWxsZWQiLCJkZWVwbHlGdWxmaWxsZWQiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJV8ZZmaTwAAmk8AACoAAABAZW5kby9tYXJzaGFsLXYxLjYuNC9zcmMvZW5jb2RlUGFzc2FibGUuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbImlzRW5jb2RlZFJlbW90YWJsZSIsIm1ha2VEZWNvZGVQYXNzYWJsZSIsIm1ha2VFbmNvZGVQYXNzYWJsZSIsIm1ha2VQYXNzYWJsZUtpdCIsInBhc3NTdHlsZVByZWZpeGVzIiwicmVjb3JkTmFtZXMiLCJyZWNvcmRWYWx1ZXMiLCJ6ZXJvUGFkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZ2V0VGFnLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsYXNzZXJ0UmVjb3JkLGlzRXJyb3JMaWtlLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWUsYixxLEZhaWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wibWFrZVRhZ2dlZFwiLFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJhc3NlcnRSZWNvcmRcIixbJGjNj19hID0+IChhc3NlcnRSZWNvcmQgPSAkaM2PX2EpXV0sW1wiaXNFcnJvckxpa2VcIixbJGjNj19hID0+IChpc0Vycm9yTGlrZSA9ICRozY9fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsWyRozY9fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJiXCIsWyRozY9fYSA9PiAoYiA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgaXNBcnJheSB9ID0gQXJyYXk7XG5jb25zdCB7IGZyb21FbnRyaWVzLCBpcyB9ID0gT2JqZWN0O1xuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG4vL1xuY29uc3QgckMwID0gL1tcXHgwMC1cXHgxRl0vO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGdldFN1ZmZpeCA9IChzdHIsIGluZGV4KSA9PiAoaW5kZXggPT09IDAgPyBzdHIgOiBzdHIuc3Vic3RyaW5nKGluZGV4KSk7XG5cbi8qXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHJlY29yZE5hbWVzID0gcmVjb3JkID0+XG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIGhhcmRlbigvKiAgICAgICAgICAgICAgICAgICAqLyAob3duS2V5cyhyZWNvcmQpKS5zb3J0KCkucmV2ZXJzZSgpKTskaM2PX29uY2UucmVjb3JkTmFtZXMocmVjb3JkTmFtZXMpO1xuaGFyZGVuKHJlY29yZE5hbWVzKTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcmVjb3JkVmFsdWVzID0gKHJlY29yZCwgbmFtZXMpID0+XG4gIGhhcmRlbihuYW1lcy5tYXAobmFtZSA9PiByZWNvcmRbbmFtZV0pKTskaM2PX29uY2UucmVjb3JkVmFsdWVzKHJlY29yZFZhbHVlcyk7XG5oYXJkZW4ocmVjb3JkVmFsdWVzKTtcblxuY29uc3QgemVyb2VzID0gQXJyYXkoMTYpXG4gIC5maWxsKHVuZGVmaW5lZClcbiAgLm1hcCgoXywgaSkgPT4gJzAnLnJlcGVhdChpKSk7XG5cbi8qXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCB6ZXJvUGFkID0gKG4sIHNpemUpID0+IHtcbiAgY29uc3QgblN0ciA9IGAke259YDtcbiAgY29uc3QgZmlsbExlbiA9IHNpemUgLSBuU3RyLmxlbmd0aDtcbiAgaWYgKGZpbGxMZW4gPT09IDApIHJldHVybiBuU3RyO1xuICBhc3NlcnQoZmlsbExlbiA+IDAgJiYgZmlsbExlbiA8IHplcm9lcy5sZW5ndGgpO1xuICByZXR1cm4gYCR7emVyb2VzW2ZpbGxMZW5dfSR7blN0cn1gO1xufTskaM2PX29uY2UuemVyb1BhZCh6ZXJvUGFkKTtcbmhhcmRlbih6ZXJvUGFkKTtcblxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG5jb25zdCBhc051bWJlciA9IG5ldyBGbG9hdDY0QXJyYXkoMSk7XG5jb25zdCBhc0JpdHMgPSBuZXcgQmlnVWludDY0QXJyYXkoYXNOdW1iZXIuYnVmZmVyKTtcblxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vL1xuY29uc3QgQ2Fub25pY2FsTmFOQml0cyA9ICdmZmY4MDAwMDAwMDAwMDAwJztcblxuLypcblxuXG4gKi9cbmNvbnN0IGVuY29kZUJpbmFyeTY0ID0gbiA9PiB7XG4gIC8vXG4gIGlmIChpcyhuLCAtMCkpIHtcbiAgICBuID0gMDtcbiAgfSBlbHNlIGlmIChpcyhuLCBOYU4pKSB7XG4gICAgcmV0dXJuIGBmJHtDYW5vbmljYWxOYU5CaXRzfWA7XG4gIH1cbiAgYXNOdW1iZXJbMF0gPSBuO1xuICBsZXQgYml0cyA9IGFzQml0c1swXTtcbiAgaWYgKG4gPCAwKSB7XG4gICAgYml0cyBePSAweGZmZmZmZmZmZmZmZmZmZmZuO1xuICB9IGVsc2Uge1xuICAgIGJpdHMgXj0gMHg4MDAwMDAwMDAwMDAwMDAwbjtcbiAgfVxuICByZXR1cm4gYGYke3plcm9QYWQoYml0cy50b1N0cmluZygxNiksIDE2KX1gO1xufTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgZGVjb2RlQmluYXJ5NjQgPSAoZW5jb2RlZCwgc2tpcCA9IDApID0+IHtcbiAgZW5jb2RlZC5jaGFyQXQoc2tpcCkgPT09ICdmJyB8fCBGYWlsYEVuY29kZWQgbnVtYmVyIGV4cGVjdGVkOiAke2VuY29kZWR9YDtcbiAgbGV0IGJpdHMgPSBCaWdJbnQoYDB4JHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCArIDEpfWApO1xuICBpZiAoZW5jb2RlZC5jaGFyQXQoc2tpcCArIDEpIDwgJzgnKSB7XG4gICAgYml0cyBePSAweGZmZmZmZmZmZmZmZmZmZmZuO1xuICB9IGVsc2Uge1xuICAgIGJpdHMgXj0gMHg4MDAwMDAwMDAwMDAwMDAwbjtcbiAgfVxuICBhc0JpdHNbMF0gPSBiaXRzO1xuICBjb25zdCByZXN1bHQgPSBhc051bWJlclswXTtcbiAgIWlzKHJlc3VsdCwgLTApIHx8XG4gICAgRmFpbGBVbmV4cGVjdGVkIG5lZ2F0aXZlIHplcm86ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBlbmNvZGVCaWdJbnQgPSBuID0+IHtcbiAgY29uc3QgYWJzID0gbiA8IDBuID8gLW4gOiBuO1xuICBjb25zdCBuRGlnaXRzID0gYWJzLnRvU3RyaW5nKCkubGVuZ3RoO1xuICBjb25zdCBsRGlnaXRzID0gbkRpZ2l0cy50b1N0cmluZygpLmxlbmd0aDtcbiAgaWYgKG4gPCAwbikge1xuICAgIHJldHVybiBgbiR7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgICcjJy5yZXBlYXQobERpZ2l0cyAtIDEpXG4gICAgfSR7XG4gICAgICAvL1xuICAgICAgKDEwICoqIGxEaWdpdHMgLSBuRGlnaXRzKS50b1N0cmluZygpLnBhZFN0YXJ0KGxEaWdpdHMsICcwJylcbiAgICB9OiR7XG4gICAgICAvL1xuICAgICAgKDEwbiAqKiBCaWdJbnQobkRpZ2l0cykgKyBuKS50b1N0cmluZygpLnBhZFN0YXJ0KG5EaWdpdHMsICcwJylcbiAgICB9YDtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYHAke1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAnficucmVwZWF0KGxEaWdpdHMgLSAxKVxuICAgIH0ke1xuICAgICAgLy9cbiAgICAgIG5EaWdpdHNcbiAgICB9OiR7XG4gICAgICAvL1xuICAgICAgblxuICAgIH1gO1xuICB9XG59O1xuXG5jb25zdCByQmlnSW50UGF5bG9hZCA9IC8oWzAtOV0rKSg6KFswLTldKyR8KXwpL3M7XG5cbi8qXG5cblxuICovXG5jb25zdCBkZWNvZGVCaWdJbnQgPSBlbmNvZGVkID0+IHtcbiAgY29uc3QgdHlwZVByZWZpeCA9IGVuY29kZWQuY2hhckF0KDApOyAvL1xuICB0eXBlUHJlZml4ID09PSAncCcgfHxcbiAgICB0eXBlUHJlZml4ID09PSAnbicgfHxcbiAgICBGYWlsYEVuY29kZWQgYmlnaW50IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcblxuICBjb25zdCB7XG4gICAgaW5kZXg6IGxEaWdpdHMsXG4gICAgMTogc25EaWdpdHMsXG4gICAgMjogdGFpbCxcbiAgICAzOiBkaWdpdHMsXG4gIH0gPSBlbmNvZGVkLm1hdGNoKHJCaWdJbnRQYXlsb2FkKSB8fCBGYWlsYERpZ2l0IGNvdW50IGV4cGVjdGVkOiAke2VuY29kZWR9YDtcblxuICBzbkRpZ2l0cy5sZW5ndGggPT09IGxEaWdpdHMgfHxcbiAgICBGYWlsYFVuYXJ5LXByZWZpeGVkIGRlY2ltYWwgZGlnaXQgY291bnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuICBsZXQgbkRpZ2l0cyA9IHBhcnNlSW50KHNuRGlnaXRzLCAxMCk7XG4gIGlmICh0eXBlUHJlZml4ID09PSAnbicpIHtcbiAgICAvL1xuICAgIC8vXG4gICAgbkRpZ2l0cyA9IDEwICoqIC8qICAgICAgICAgICAgICAgICAqLyAobERpZ2l0cykgLSBuRGlnaXRzO1xuICB9XG5cbiAgdGFpbC5jaGFyQXQoMCkgPT09ICc6JyB8fCBGYWlsYFNlcGFyYXRvciBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG4gIGRpZ2l0cy5sZW5ndGggPT09IG5EaWdpdHMgfHxcbiAgICBGYWlsYEZpeGVkLWxlbmd0aCBkaWdpdCBzZXF1ZW5jZSBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG4gIGxldCBuID0gQmlnSW50KGRpZ2l0cyk7XG4gIGlmICh0eXBlUHJlZml4ID09PSAnbicpIHtcbiAgICAvL1xuICAgIC8vXG4gICAgbiA9IC0oMTBuICoqIEJpZ0ludChuRGlnaXRzKSAtIG4pO1xuICB9XG5cbiAgcmV0dXJuIG47XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHN0cmluZ0VzY2FwZXMgPSBBcnJheSgweDIyKVxuICAuZmlsbCh1bmRlZmluZWQpXG4gIC5tYXAoKF8sIGNwKSA9PiB7XG4gICAgc3dpdGNoIChTdHJpbmcuZnJvbUNoYXJDb2RlKGNwKSkge1xuICAgICAgY2FzZSAnICc6XG4gICAgICAgIHJldHVybiAnIV8nO1xuICAgICAgY2FzZSAnISc6XG4gICAgICAgIHJldHVybiAnIXwnO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIGAhJHtTdHJpbmcuZnJvbUNoYXJDb2RlKGNwICsgMHgyMSl9YDtcbiAgICB9XG4gIH0pO1xuc3RyaW5nRXNjYXBlc1snXicuY2hhckNvZGVBdCgwKV0gPSAnX0AnO1xuc3RyaW5nRXNjYXBlc1snXycuY2hhckNvZGVBdCgwKV0gPSAnX18nO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBlbmNvZGVDb21wYWN0U3RyaW5nU3VmZml4ID0gc3RyID0+XG4gIHN0ci5yZXBsYWNlKC9bXFwwLSFeX10vZywgY2ggPT4gc3RyaW5nRXNjYXBlc1tjaC5jaGFyQ29kZUF0KDApXSk7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGRlY29kZUNvbXBhY3RTdHJpbmdTdWZmaXggPSBlbmNvZGVkID0+IHtcbiAgcmV0dXJuIGVuY29kZWQucmVwbGFjZSgvKFtcXDAtIV9dKSgufFxcbik/L2csIChlc2MsIHByZWZpeCwgc3VmZml4KSA9PiB7XG4gICAgc3dpdGNoIChlc2MpIHtcbiAgICAgIGNhc2UgJyFfJzpcbiAgICAgICAgcmV0dXJuICcgJztcbiAgICAgIGNhc2UgJyF8JzpcbiAgICAgICAgcmV0dXJuICchJztcbiAgICAgIGNhc2UgJ19AJzpcbiAgICAgICAgcmV0dXJuICdeJztcbiAgICAgIGNhc2UgJ19fJzpcbiAgICAgICAgcmV0dXJuICdfJztcbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgY29uc3QgY2ggPSAvKiAgICAgICAgICAgICAgICAgKi8gKHN1ZmZpeCk7XG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIChwcmVmaXggPT09ICchJyAmJiBzdWZmaXggIT09IHVuZGVmaW5lZCAmJiBjaCA+PSAnIScgJiYgY2ggPD0gJ0AnKSB8fFxuICAgICAgICAgIEZhaWxgaW52YWxpZCBzdHJpbmcgZXNjYXBlOiAke3EoZXNjKX1gO1xuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjaC5jaGFyQ29kZUF0KDApIC0gMHgyMSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGVuY29kZUxlZ2FjeVN0cmluZ1N1ZmZpeCA9IHN0ciA9PiBzdHI7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGRlY29kZUxlZ2FjeVN0cmluZ1N1ZmZpeCA9IGVuY29kZWQgPT4gZW5jb2RlZDtcblxuLypcblxuXG5cblxuXG5cblxuICovXG5jb25zdCBlbmNvZGVDb21wYWN0QXJyYXkgPSAoYXJyYXksIGVuY29kZVBhc3NhYmxlKSA9PiB7XG4gIGNvbnN0IGNoYXJzID0gWydeJ107XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBhcnJheSkge1xuICAgIGNvbnN0IGVuYyA9IGVuY29kZVBhc3NhYmxlKGVsZW1lbnQpO1xuICAgIGNoYXJzLnB1c2goZW5jLCAnICcpO1xuICB9XG4gIHJldHVybiBjaGFycy5qb2luKCcnKTtcbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgZGVjb2RlQ29tcGFjdEFycmF5ID0gKGVuY29kZWQsIGRlY29kZVBhc3NhYmxlLCBza2lwID0gMCkgPT4ge1xuICBjb25zdCBlbGVtZW50cyA9IFtdO1xuICBsZXQgZGVwdGggPSAwO1xuICAvL1xuICAvL1xuICBsZXQgbmV4dEluZGV4ID0gc2tpcCArIDE7XG4gIGxldCBjdXJyZW50RWxlbWVudFN0YXJ0ID0gc2tpcCArIDE7XG4gIGZvciAoY29uc3QgeyAwOiBjaCwgaW5kZXg6IGkgfSBvZiBlbmNvZGVkLm1hdGNoQWxsKC9bXFxeIF0vZykpIHtcbiAgICBjb25zdCBpbmRleCA9IC8qICAgICAgICAgICAgICAgICAqLyAoaSk7XG4gICAgaWYgKGluZGV4IDw9IHNraXApIHtcbiAgICAgIGlmIChpbmRleCA9PT0gc2tpcCkge1xuICAgICAgICBjaCA9PT0gJ14nIHx8IEZhaWxgRW5jb2RlZCBhcnJheSBleHBlY3RlZDogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGNoID09PSAnXicpIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgZGVwdGggKz0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy9cbiAgICAgIGlmIChpbmRleCA9PT0gbmV4dEluZGV4KSB7XG4gICAgICAgIC8vXG4gICAgICAgIGRlcHRoIC09IDE7XG4gICAgICAgIGRlcHRoID49IDAgfHxcbiAgICAgICAgICAvL1xuICAgICAgICAgIEZhaWxgdW5leHBlY3RlZCBhcnJheSBlbGVtZW50IHRlcm1pbmF0b3I6ICR7ZW5jb2RlZC5zbGljZShza2lwLCBpbmRleCArIDIpfWA7XG4gICAgICB9XG4gICAgICBpZiAoZGVwdGggPT09IDApIHtcbiAgICAgICAgLy9cbiAgICAgICAgZWxlbWVudHMucHVzaChcbiAgICAgICAgICBkZWNvZGVQYXNzYWJsZShlbmNvZGVkLnNsaWNlKGN1cnJlbnRFbGVtZW50U3RhcnQsIGluZGV4KSksXG4gICAgICAgICk7XG4gICAgICAgIGN1cnJlbnRFbGVtZW50U3RhcnQgPSBpbmRleCArIDE7XG4gICAgICB9XG4gICAgfVxuICAgIC8vXG4gICAgbmV4dEluZGV4ID0gaW5kZXggKyAxO1xuICB9XG4gIGRlcHRoID09PSAwIHx8IEZhaWxgdW50ZXJtaW5hdGVkIGFycmF5OiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICBuZXh0SW5kZXggPT09IGVuY29kZWQubGVuZ3RoIHx8XG4gICAgRmFpbGB1bnRlcm1pbmF0ZWQgYXJyYXkgZWxlbWVudDogJHtnZXRTdWZmaXgoXG4gICAgICBlbmNvZGVkLFxuICAgICAgY3VycmVudEVsZW1lbnRTdGFydCxcbiAgICApfWA7XG4gIHJldHVybiBoYXJkZW4oZWxlbWVudHMpO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgZW5jb2RlTGVnYWN5QXJyYXkgPSAoYXJyYXksIGVuY29kZVBhc3NhYmxlKSA9PiB7XG4gIGNvbnN0IGNoYXJzID0gWydbJ107XG4gIGZvciAoY29uc3QgZWxlbWVudCBvZiBhcnJheSkge1xuICAgIGNvbnN0IGVuYyA9IGVuY29kZVBhc3NhYmxlKGVsZW1lbnQpO1xuICAgIGZvciAoY29uc3QgYyBvZiBlbmMpIHtcbiAgICAgIGlmIChjID09PSAnXFx1MDAwMCcgfHwgYyA9PT0gJ1xcdTAwMDEnKSB7XG4gICAgICAgIGNoYXJzLnB1c2goJ1xcdTAwMDEnKTtcbiAgICAgIH1cbiAgICAgIGNoYXJzLnB1c2goYyk7XG4gICAgfVxuICAgIGNoYXJzLnB1c2goJ1xcdTAwMDAnKTtcbiAgfVxuICByZXR1cm4gY2hhcnMuam9pbignJyk7XG59O1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IGRlY29kZUxlZ2FjeUFycmF5ID0gKGVuY29kZWQsIGRlY29kZVBhc3NhYmxlLCBza2lwID0gMCkgPT4ge1xuICBjb25zdCBlbGVtZW50cyA9IFtdO1xuICBjb25zdCBlbGVtQ2hhcnMgPSBbXTtcbiAgLy9cbiAgLy9cbiAgbGV0IHN0aWxsVG9Ta2lwID0gc2tpcCArIDE7XG4gIGxldCBpbkVzY2FwZSA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IGMgb2YgZW5jb2RlZCkge1xuICAgIGlmIChzdGlsbFRvU2tpcCA+IDApIHtcbiAgICAgIHN0aWxsVG9Ta2lwIC09IDE7XG4gICAgICBpZiAoc3RpbGxUb1NraXAgPT09IDApIHtcbiAgICAgICAgYyA9PT0gJ1snIHx8IEZhaWxgRW5jb2RlZCBhcnJheSBleHBlY3RlZDogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGluRXNjYXBlKSB7XG4gICAgICBjID09PSAnXFx1MDAwMCcgfHxcbiAgICAgICAgYyA9PT0gJ1xcdTAwMDEnIHx8XG4gICAgICAgIEZhaWxgVW5leHBlY3RlZCBjaGFyYWN0ZXIgYWZ0ZXIgdTAwMDEgZXNjYXBlOiAke2N9YDtcbiAgICAgIGVsZW1DaGFycy5wdXNoKGMpO1xuICAgIH0gZWxzZSBpZiAoYyA9PT0gJ1xcdTAwMDAnKSB7XG4gICAgICBjb25zdCBlbmNvZGVkRWxlbWVudCA9IGVsZW1DaGFycy5qb2luKCcnKTtcbiAgICAgIGVsZW1DaGFycy5sZW5ndGggPSAwO1xuICAgICAgY29uc3QgZWxlbWVudCA9IGRlY29kZVBhc3NhYmxlKGVuY29kZWRFbGVtZW50KTtcbiAgICAgIGVsZW1lbnRzLnB1c2goZWxlbWVudCk7XG4gICAgfSBlbHNlIGlmIChjID09PSAnXFx1MDAwMScpIHtcbiAgICAgIGluRXNjYXBlID0gdHJ1ZTtcbiAgICAgIC8vXG4gICAgICBjb250aW51ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbUNoYXJzLnB1c2goYyk7XG4gICAgfVxuICAgIGluRXNjYXBlID0gZmFsc2U7XG4gIH1cbiAgIWluRXNjYXBlIHx8IEZhaWxgdW5leHBlY3RlZCBlbmQgb2YgZW5jb2RpbmcgJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgZWxlbUNoYXJzLmxlbmd0aCA9PT0gMCB8fFxuICAgIEZhaWxgZW5jb2RpbmcgdGVybWluYXRlZCBlYXJseTogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgcmV0dXJuIGhhcmRlbihlbGVtZW50cyk7XG59O1xuXG5jb25zdCBlbmNvZGVSZWNvcmQgPSAocmVjb3JkLCBlbmNvZGVBcnJheSwgZW5jb2RlUGFzc2FibGUpID0+IHtcbiAgY29uc3QgbmFtZXMgPSByZWNvcmROYW1lcyhyZWNvcmQpO1xuICBjb25zdCB2YWx1ZXMgPSByZWNvcmRWYWx1ZXMocmVjb3JkLCBuYW1lcyk7XG4gIHJldHVybiBgKCR7ZW5jb2RlQXJyYXkoaGFyZGVuKFtuYW1lcywgdmFsdWVzXSksIGVuY29kZVBhc3NhYmxlKX1gO1xufTtcblxuY29uc3QgZGVjb2RlUmVjb3JkID0gKGVuY29kZWQsIGRlY29kZUFycmF5LCBkZWNvZGVQYXNzYWJsZSwgc2tpcCA9IDApID0+IHtcbiAgYXNzZXJ0KGVuY29kZWQuY2hhckF0KHNraXApID09PSAnKCcpO1xuICAvL1xuICAvL1xuICBjb25zdCB1bnppcHBlZEVudHJpZXMgPSBkZWNvZGVBcnJheShlbmNvZGVkLCBkZWNvZGVQYXNzYWJsZSwgc2tpcCArIDEpO1xuICB1bnppcHBlZEVudHJpZXMubGVuZ3RoID09PSAyIHx8XG4gICAgRmFpbGBleHBlY3RlZCBrZXlzLHZhbHVlcyBwYWlyOiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICBjb25zdCBba2V5cywgdmFsc10gPSB1bnppcHBlZEVudHJpZXM7XG5cbiAgKHBhc3NTdHlsZU9mKGtleXMpID09PSAnY29weUFycmF5JyAmJlxuICAgIHBhc3NTdHlsZU9mKHZhbHMpID09PSAnY29weUFycmF5JyAmJlxuICAgIGtleXMubGVuZ3RoID09PSB2YWxzLmxlbmd0aCAmJlxuICAgIGtleXMuZXZlcnkoa2V5ID0+IHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnKSkgfHxcbiAgICBGYWlsYG5vdCBhIHZhbGlkIHJlY29yZCBlbmNvZGluZzogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgY29uc3QgbWFwRW50cmllcyA9IGtleXMubWFwKChrZXksIGkpID0+IFtrZXksIHZhbHNbaV1dKTtcbiAgY29uc3QgcmVjb3JkID0gaGFyZGVuKGZyb21FbnRyaWVzKG1hcEVudHJpZXMpKTtcbiAgYXNzZXJ0UmVjb3JkKHJlY29yZCwgJ2RlY29kZWQgcmVjb3JkJyk7XG4gIHJldHVybiByZWNvcmQ7XG59O1xuXG5jb25zdCBlbmNvZGVUYWdnZWQgPSAodGFnZ2VkLCBlbmNvZGVBcnJheSwgZW5jb2RlUGFzc2FibGUpID0+XG4gIGA6JHtlbmNvZGVBcnJheShoYXJkZW4oW2dldFRhZyh0YWdnZWQpLCB0YWdnZWQucGF5bG9hZF0pLCBlbmNvZGVQYXNzYWJsZSl9YDtcblxuY29uc3QgZGVjb2RlVGFnZ2VkID0gKGVuY29kZWQsIGRlY29kZUFycmF5LCBkZWNvZGVQYXNzYWJsZSwgc2tpcCA9IDApID0+IHtcbiAgYXNzZXJ0KGVuY29kZWQuY2hhckF0KHNraXApID09PSAnOicpO1xuICAvL1xuICAvL1xuICBjb25zdCB0YWdnZWRQYXlsb2FkID0gZGVjb2RlQXJyYXkoZW5jb2RlZCwgZGVjb2RlUGFzc2FibGUsIHNraXAgKyAxKTtcbiAgdGFnZ2VkUGF5bG9hZC5sZW5ndGggPT09IDIgfHxcbiAgICBGYWlsYGV4cGVjdGVkIHRhZyxwYXlsb2FkIHBhaXI6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gIGNvbnN0IFt0YWcsIHBheWxvYWRdID0gdGFnZ2VkUGF5bG9hZDtcbiAgcGFzc1N0eWxlT2YodGFnKSA9PT0gJ3N0cmluZycgfHxcbiAgICBGYWlsYG5vdCBhIHZhbGlkIHRhZ2dlZCBlbmNvZGluZzogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgcmV0dXJuIG1ha2VUYWdnZWQodGFnLCBwYXlsb2FkKTtcbn07XG5cbmNvbnN0IG1ha2VFbmNvZGVSZW1vdGFibGUgPSAodW5zYWZlRW5jb2RlUmVtb3RhYmxlLCB2ZXJpZnlFbmNvZGluZykgPT4ge1xuICBjb25zdCBlbmNvZGVSZW1vdGFibGUgPSAociwgaW5uZXJFbmNvZGUpID0+IHtcbiAgICBjb25zdCBlbmNvZGluZyA9IHVuc2FmZUVuY29kZVJlbW90YWJsZShyLCBpbm5lckVuY29kZSk7XG4gICAgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycgJiYgZW5jb2RpbmcuY2hhckF0KDApID09PSAncicpIHx8XG4gICAgICBGYWlsYFJlbW90YWJsZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCJyXCI6ICR7ZW5jb2Rpbmd9YDtcbiAgICB2ZXJpZnlFbmNvZGluZyhlbmNvZGluZywgJ1JlbW90YWJsZScpO1xuICAgIHJldHVybiBlbmNvZGluZztcbiAgfTtcbiAgcmV0dXJuIGVuY29kZVJlbW90YWJsZTtcbn07XG5cbmNvbnN0IG1ha2VFbmNvZGVQcm9taXNlID0gKHVuc2FmZUVuY29kZVByb21pc2UsIHZlcmlmeUVuY29kaW5nKSA9PiB7XG4gIGNvbnN0IGVuY29kZVByb21pc2UgPSAocCwgaW5uZXJFbmNvZGUpID0+IHtcbiAgICBjb25zdCBlbmNvZGluZyA9IHVuc2FmZUVuY29kZVByb21pc2UocCwgaW5uZXJFbmNvZGUpO1xuICAgICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmIGVuY29kaW5nLmNoYXJBdCgwKSA9PT0gJz8nKSB8fFxuICAgICAgRmFpbGBQcm9taXNlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIj9cIjogJHtlbmNvZGluZ31gO1xuICAgIHZlcmlmeUVuY29kaW5nKGVuY29kaW5nLCAnUHJvbWlzZScpO1xuICAgIHJldHVybiBlbmNvZGluZztcbiAgfTtcbiAgcmV0dXJuIGVuY29kZVByb21pc2U7XG59O1xuXG5jb25zdCBtYWtlRW5jb2RlRXJyb3IgPSAodW5zYWZlRW5jb2RlRXJyb3IsIHZlcmlmeUVuY29kaW5nKSA9PiB7XG4gIGNvbnN0IGVuY29kZUVycm9yID0gKGVyciwgaW5uZXJFbmNvZGUpID0+IHtcbiAgICBjb25zdCBlbmNvZGluZyA9IHVuc2FmZUVuY29kZUVycm9yKGVyciwgaW5uZXJFbmNvZGUpO1xuICAgICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmIGVuY29kaW5nLmNoYXJBdCgwKSA9PT0gJyEnKSB8fFxuICAgICAgRmFpbGBFcnJvciBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCIhXCI6ICR7ZW5jb2Rpbmd9YDtcbiAgICB2ZXJpZnlFbmNvZGluZyhlbmNvZGluZywgJ0Vycm9yJyk7XG4gICAgcmV0dXJuIGVuY29kaW5nO1xuICB9O1xuICByZXR1cm4gZW5jb2RlRXJyb3I7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VJbm5lckVuY29kZSA9IChlbmNvZGVTdHJpbmdTdWZmaXgsIGVuY29kZUFycmF5LCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBlbmNvZGVSZW1vdGFibGU6IHVuc2FmZUVuY29kZVJlbW90YWJsZSxcbiAgICBlbmNvZGVQcm9taXNlOiB1bnNhZmVFbmNvZGVQcm9taXNlLFxuICAgIGVuY29kZUVycm9yOiB1bnNhZmVFbmNvZGVFcnJvcixcbiAgICB2ZXJpZnlFbmNvZGluZyA9ICgpID0+IHt9LFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgZW5jb2RlUmVtb3RhYmxlID0gbWFrZUVuY29kZVJlbW90YWJsZShcbiAgICB1bnNhZmVFbmNvZGVSZW1vdGFibGUsXG4gICAgdmVyaWZ5RW5jb2RpbmcsXG4gICk7XG4gIGNvbnN0IGVuY29kZVByb21pc2UgPSBtYWtlRW5jb2RlUHJvbWlzZSh1bnNhZmVFbmNvZGVQcm9taXNlLCB2ZXJpZnlFbmNvZGluZyk7XG4gIGNvbnN0IGVuY29kZUVycm9yID0gbWFrZUVuY29kZUVycm9yKHVuc2FmZUVuY29kZUVycm9yLCB2ZXJpZnlFbmNvZGluZyk7XG5cbiAgY29uc3QgaW5uZXJFbmNvZGUgPSBwYXNzYWJsZSA9PiB7XG4gICAgaWYgKGlzRXJyb3JMaWtlKHBhc3NhYmxlKSkge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHJldHVybiBlbmNvZGVFcnJvcihwYXNzYWJsZSwgaW5uZXJFbmNvZGUpO1xuICAgIH1cbiAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihwYXNzYWJsZSk7XG4gICAgc3dpdGNoIChwYXNzU3R5bGUpIHtcbiAgICAgIGNhc2UgJ251bGwnOiB7XG4gICAgICAgIHJldHVybiAndic7XG4gICAgICB9XG4gICAgICBjYXNlICd1bmRlZmluZWQnOiB7XG4gICAgICAgIHJldHVybiAneic7XG4gICAgICB9XG4gICAgICBjYXNlICdudW1iZXInOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVCaW5hcnk2NChwYXNzYWJsZSk7XG4gICAgICB9XG4gICAgICBjYXNlICdzdHJpbmcnOiB7XG4gICAgICAgIHJldHVybiBgcyR7ZW5jb2RlU3RyaW5nU3VmZml4KHBhc3NhYmxlKX1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnYm9vbGVhbic6IHtcbiAgICAgICAgcmV0dXJuIGBiJHtwYXNzYWJsZX1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICByZXR1cm4gZW5jb2RlQmlnSW50KHBhc3NhYmxlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3JlbW90YWJsZSc6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kZVJlbW90YWJsZShwYXNzYWJsZSwgaW5uZXJFbmNvZGUpO1xuICAgICAgfVxuICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVFcnJvcihwYXNzYWJsZSwgaW5uZXJFbmNvZGUpO1xuICAgICAgfVxuICAgICAgY2FzZSAncHJvbWlzZSc6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kZVByb21pc2UocGFzc2FibGUsIGlubmVyRW5jb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgbmFtZSA9IG5hbWVGb3JQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG4gICAgICAgIGFzc2VydC50eXBlb2YobmFtZSwgJ3N0cmluZycpO1xuICAgICAgICByZXR1cm4gYHkke2VuY29kZVN0cmluZ1N1ZmZpeChuYW1lKX1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weUFycmF5Jzoge1xuICAgICAgICByZXR1cm4gZW5jb2RlQXJyYXkocGFzc2FibGUsIGlubmVyRW5jb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVSZWNvcmQocGFzc2FibGUsIGVuY29kZUFycmF5LCBpbm5lckVuY29kZSk7XG4gICAgICB9XG4gICAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVUYWdnZWQocGFzc2FibGUsIGVuY29kZUFycmF5LCBpbm5lckVuY29kZSk7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IEZhaWxgYSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIHVzZWQgYXMgYSBjb2xsZWN0aW9uIHBhc3NhYmxlYDtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBpbm5lckVuY29kZTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG5jb25zdCBsaWJlcmFsRGVjb2RlcnMgPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoXG4gIC8qICAgICAgICAgICAgICAgICAgKi8gKHtcbiAgICBkZWNvZGVSZW1vdGFibGU6IChfZW5jb2RpbmcsIF9pbm5lckRlY29kZSkgPT4gdW5kZWZpbmVkLFxuICAgIGRlY29kZVByb21pc2U6IChfZW5jb2RpbmcsIF9pbm5lckRlY29kZSkgPT4gdW5kZWZpbmVkLFxuICAgIGRlY29kZUVycm9yOiAoX2VuY29kaW5nLCBfaW5uZXJEZWNvZGUpID0+IHVuZGVmaW5lZCxcbiAgfSlcbik7XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgbWFrZUlubmVyRGVjb2RlID0gKGRlY29kZVN0cmluZ1N1ZmZpeCwgZGVjb2RlQXJyYXksIG9wdGlvbnMpID0+IHtcbiAgY29uc3QgeyBkZWNvZGVSZW1vdGFibGUsIGRlY29kZVByb21pc2UsIGRlY29kZUVycm9yIH0gPSBvcHRpb25zO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBpbm5lckRlY29kZSA9IChlbmNvZGVkLCBza2lwID0gMCkgPT4ge1xuICAgIHN3aXRjaCAoZW5jb2RlZC5jaGFyQXQoc2tpcCkpIHtcbiAgICAgIGNhc2UgJ3YnOiB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuICAgICAgY2FzZSAneic6IHtcbiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2YnOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVCaW5hcnk2NChlbmNvZGVkLCBza2lwKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3MnOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVTdHJpbmdTdWZmaXgoZ2V0U3VmZml4KGVuY29kZWQsIHNraXAgKyAxKSk7XG4gICAgICB9XG4gICAgICBjYXNlICdiJzoge1xuICAgICAgICBjb25zdCBzdWJzdHJpbmcgPSBnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCArIDEpO1xuICAgICAgICBpZiAoc3Vic3RyaW5nID09PSAndHJ1ZScpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIGlmIChzdWJzdHJpbmcgPT09ICdmYWxzZScpIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgRmFpbGBleHBlY3RlZCBlbmNvZGVkIGJvb2xlYW4gdG8gYmUgXCJidHJ1ZVwiIG9yIFwiYmZhbHNlXCI6ICR7c3Vic3RyaW5nfWA7XG4gICAgICB9XG4gICAgICBjYXNlICduJzpcbiAgICAgIGNhc2UgJ3AnOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVCaWdJbnQoZ2V0U3VmZml4KGVuY29kZWQsIHNraXApKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3InOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVSZW1vdGFibGUoZ2V0U3VmZml4KGVuY29kZWQsIHNraXApLCBpbm5lckRlY29kZSk7XG4gICAgICB9XG4gICAgICBjYXNlICc/Jzoge1xuICAgICAgICByZXR1cm4gZGVjb2RlUHJvbWlzZShnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCksIGlubmVyRGVjb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJyEnOiB7XG4gICAgICAgIHJldHVybiBkZWNvZGVFcnJvcihnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCksIGlubmVyRGVjb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3knOiB7XG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IG5hbWUgPSBkZWNvZGVTdHJpbmdTdWZmaXgoZ2V0U3VmZml4KGVuY29kZWQsIHNraXAgKyAxKSk7XG4gICAgICAgIHJldHVybiBwYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG4gICAgICB9XG4gICAgICBjYXNlICdbJzpcbiAgICAgIGNhc2UgJ14nOiB7XG4gICAgICAgIC8vXG4gICAgICAgIHJldHVybiBkZWNvZGVBcnJheShlbmNvZGVkLCBpbm5lckRlY29kZSwgc2tpcCk7XG4gICAgICB9XG4gICAgICBjYXNlICcoJzoge1xuICAgICAgICByZXR1cm4gZGVjb2RlUmVjb3JkKGVuY29kZWQsIGRlY29kZUFycmF5LCBpbm5lckRlY29kZSwgc2tpcCk7XG4gICAgICB9XG4gICAgICBjYXNlICc6Jzoge1xuICAgICAgICByZXR1cm4gZGVjb2RlVGFnZ2VkKGVuY29kZWQsIGRlY29kZUFycmF5LCBpbm5lckRlY29kZSwgc2tpcCk7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IEZhaWxgaW52YWxpZCBkYXRhYmFzZSBrZXk6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICByZXR1cm4gaW5uZXJEZWNvZGU7XG59O1xuXG4vKlxuXG5cblxuICovXG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZVBhc3NhYmxlS2l0ID0gKG9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZW5jb2RlUmVtb3RhYmxlID0gKHIsIF8pID0+IEZhaWxgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cn1gLFxuICAgIGVuY29kZVByb21pc2UgPSAocCwgXykgPT4gRmFpbGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cH1gLFxuICAgIGVuY29kZUVycm9yID0gKGVyciwgXykgPT4gRmFpbGBlcnJvciB1bmV4cGVjdGVkOiAke2Vycn1gLFxuICAgIGZvcm1hdCA9ICdsZWdhY3lPcmRlcmVkJyxcblxuICAgIGRlY29kZVJlbW90YWJsZSA9IChlbmNvZGluZywgXykgPT4gRmFpbGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gLFxuICAgIGRlY29kZVByb21pc2UgPSAoZW5jb2RpbmcsIF8pID0+IEZhaWxgcHJvbWlzZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWAsXG4gICAgZGVjb2RlRXJyb3IgPSAoZW5jb2RpbmcsIF8pID0+IEZhaWxgZXJyb3IgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gLFxuICB9ID0gb3B0aW9ucztcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgZW5jb2RlUGFzc2FibGU7XG4gIGNvbnN0IGVuY29kZU9wdGlvbnMgPSB7IGVuY29kZVJlbW90YWJsZSwgZW5jb2RlUHJvbWlzZSwgZW5jb2RlRXJyb3IsIGZvcm1hdCB9O1xuICBpZiAoZm9ybWF0ID09PSAnY29tcGFjdE9yZGVyZWQnKSB7XG4gICAgY29uc3QgbGliZXJhbERlY29kZSA9IG1ha2VJbm5lckRlY29kZShcbiAgICAgIGRlY29kZUNvbXBhY3RTdHJpbmdTdWZmaXgsXG4gICAgICBkZWNvZGVDb21wYWN0QXJyYXksXG4gICAgICBsaWJlcmFsRGVjb2RlcnMsXG4gICAgKTtcbiAgICAvKlxuXG5cblxuICAgICAqL1xuICAgIGNvbnN0IHZlcmlmeUVuY29kaW5nID0gKGVuY29kaW5nLCBsYWJlbCkgPT4ge1xuICAgICAgIWVuY29kaW5nLm1hdGNoKHJDMCkgfHxcbiAgICAgICAgRmFpbGAke2IoXG4gICAgICAgICAgbGFiZWwsXG4gICAgICAgICl9IGVuY29kaW5nIG11c3Qgbm90IGNvbnRhaW4gYSBDMCBjb250cm9sIGNoYXJhY3RlcjogJHtlbmNvZGluZ31gO1xuICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZUNvbXBhY3RBcnJheShgXnYgJHtlbmNvZGluZ30gdiBgLCBsaWJlcmFsRGVjb2RlKTtcbiAgICAgIChpc0FycmF5KGRlY29kZWQpICYmXG4gICAgICAgIGRlY29kZWQubGVuZ3RoID09PSAzICYmXG4gICAgICAgIGRlY29kZWRbMF0gPT09IG51bGwgJiZcbiAgICAgICAgZGVjb2RlZFsyXSA9PT0gbnVsbCkgfHxcbiAgICAgICAgRmFpbGAke2IobGFiZWwpfSBlbmNvZGluZyBtdXN0IGJlIGVtYmVkZGFibGU6ICR7ZW5jb2Rpbmd9YDtcbiAgICB9O1xuICAgIGNvbnN0IGVuY29kZUNvbXBhY3QgPSBtYWtlSW5uZXJFbmNvZGUoXG4gICAgICBlbmNvZGVDb21wYWN0U3RyaW5nU3VmZml4LFxuICAgICAgZW5jb2RlQ29tcGFjdEFycmF5LFxuICAgICAgeyAuLi5lbmNvZGVPcHRpb25zLCB2ZXJpZnlFbmNvZGluZyB9LFxuICAgICk7XG4gICAgZW5jb2RlUGFzc2FibGUgPSBwYXNzYWJsZSA9PiBgfiR7ZW5jb2RlQ29tcGFjdChwYXNzYWJsZSl9YDtcbiAgfSBlbHNlIGlmIChmb3JtYXQgPT09ICdsZWdhY3lPcmRlcmVkJykge1xuICAgIGVuY29kZVBhc3NhYmxlID0gbWFrZUlubmVyRW5jb2RlKFxuICAgICAgZW5jb2RlTGVnYWN5U3RyaW5nU3VmZml4LFxuICAgICAgZW5jb2RlTGVnYWN5QXJyYXksXG4gICAgICBlbmNvZGVPcHRpb25zLFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgRmFpbGBVbnJlY29nbml6ZWQgZm9ybWF0OiAke3EoZm9ybWF0KX1gO1xuICB9XG5cbiAgY29uc3QgZGVjb2RlT3B0aW9ucyA9IHsgZGVjb2RlUmVtb3RhYmxlLCBkZWNvZGVQcm9taXNlLCBkZWNvZGVFcnJvciB9O1xuICBjb25zdCBkZWNvZGVDb21wYWN0ID0gbWFrZUlubmVyRGVjb2RlKFxuICAgIGRlY29kZUNvbXBhY3RTdHJpbmdTdWZmaXgsXG4gICAgZGVjb2RlQ29tcGFjdEFycmF5LFxuICAgIGRlY29kZU9wdGlvbnMsXG4gICk7XG4gIGNvbnN0IGRlY29kZUxlZ2FjeSA9IG1ha2VJbm5lckRlY29kZShcbiAgICBkZWNvZGVMZWdhY3lTdHJpbmdTdWZmaXgsXG4gICAgZGVjb2RlTGVnYWN5QXJyYXksXG4gICAgZGVjb2RlT3B0aW9ucyxcbiAgKTtcbiAgY29uc3QgZGVjb2RlUGFzc2FibGUgPSBlbmNvZGVkID0+IHtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBpZiAoZW5jb2RlZC5jaGFyQXQoMCkgPT09ICd+Jykge1xuICAgICAgcmV0dXJuIGRlY29kZUNvbXBhY3QoZW5jb2RlZCwgMSk7XG4gICAgfVxuICAgIHJldHVybiBkZWNvZGVMZWdhY3koZW5jb2RlZCk7XG4gIH07XG5cbiAgcmV0dXJuIGhhcmRlbih7IGVuY29kZVBhc3NhYmxlLCBkZWNvZGVQYXNzYWJsZSB9KTtcbn07JGjNj19vbmNlLm1ha2VQYXNzYWJsZUtpdChtYWtlUGFzc2FibGVLaXQpO1xuaGFyZGVuKG1ha2VQYXNzYWJsZUtpdCk7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZUVuY29kZVBhc3NhYmxlID0gZW5jb2RlT3B0aW9ucyA9PiB7XG4gIGNvbnN0IHsgZW5jb2RlUGFzc2FibGUgfSA9IG1ha2VQYXNzYWJsZUtpdChlbmNvZGVPcHRpb25zKTtcbiAgcmV0dXJuIGVuY29kZVBhc3NhYmxlO1xufTskaM2PX29uY2UubWFrZUVuY29kZVBhc3NhYmxlKG1ha2VFbmNvZGVQYXNzYWJsZSk7XG5oYXJkZW4obWFrZUVuY29kZVBhc3NhYmxlKTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlRGVjb2RlUGFzc2FibGUgPSBkZWNvZGVPcHRpb25zID0+IHtcbiAgY29uc3QgeyBkZWNvZGVQYXNzYWJsZSB9ID0gbWFrZVBhc3NhYmxlS2l0KGRlY29kZU9wdGlvbnMpO1xuICByZXR1cm4gZGVjb2RlUGFzc2FibGU7XG59OyRozY9fb25jZS5tYWtlRGVjb2RlUGFzc2FibGUobWFrZURlY29kZVBhc3NhYmxlKTtcbmhhcmRlbihtYWtlRGVjb2RlUGFzc2FibGUpO1xuXG4gICAgICAgY29uc3QgaXNFbmNvZGVkUmVtb3RhYmxlID0gZW5jb2RlZCA9PiBlbmNvZGVkLmNoYXJBdCgwKSA9PT0gJ3InOyRozY9fb25jZS5pc0VuY29kZWRSZW1vdGFibGUoaXNFbmNvZGVkUmVtb3RhYmxlKTtcbmhhcmRlbihpc0VuY29kZWRSZW1vdGFibGUpO1xuXG4vL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcGFzc1N0eWxlUHJlZml4ZXMgPSB7XG4gIGVycm9yOiAnIScsXG4gIGNvcHlSZWNvcmQ6ICcoJyxcbiAgdGFnZ2VkOiAnOicsXG4gIHByb21pc2U6ICc/JyxcbiAgY29weUFycmF5OiAnW14nLFxuICBib29sZWFuOiAnYicsXG4gIG51bWJlcjogJ2YnLFxuICBiaWdpbnQ6ICducCcsXG4gIHJlbW90YWJsZTogJ3InLFxuICBzdHJpbmc6ICdzJyxcbiAgbnVsbDogJ3YnLFxuICBzeW1ib2w6ICd5JyxcbiAgLy9cbiAgLy9cbiAgLy9cbiAgdW5kZWZpbmVkOiAneicsXG59OyRozY9fb25jZS5wYXNzU3R5bGVQcmVmaXhlcyhwYXNzU3R5bGVQcmVmaXhlcyk7XG5PYmplY3Quc2V0UHJvdG90eXBlT2YocGFzc1N0eWxlUHJlZml4ZXMsIG51bGwpO1xuaGFyZGVuKHBhc3NTdHlsZVByZWZpeGVzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InJlY29yZE5hbWVzIjpbInJlY29yZE5hbWVzIl0sInJlY29yZFZhbHVlcyI6WyJyZWNvcmRWYWx1ZXMiXSwiemVyb1BhZCI6WyJ6ZXJvUGFkIl0sIm1ha2VQYXNzYWJsZUtpdCI6WyJtYWtlUGFzc2FibGVLaXQiXSwibWFrZUVuY29kZVBhc3NhYmxlIjpbIm1ha2VFbmNvZGVQYXNzYWJsZSJdLCJtYWtlRGVjb2RlUGFzc2FibGUiOlsibWFrZURlY29kZVBhc3NhYmxlIl0sImlzRW5jb2RlZFJlbW90YWJsZSI6WyJpc0VuY29kZWRSZW1vdGFibGUiXSwicGFzc1N0eWxlUHJlZml4ZXMiOlsicGFzc1N0eWxlUHJlZml4ZXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAz2KS+PQrAAD0KwAAKwAAAEBlbmRvL21hcnNoYWwtdjEuNi40L3NyYy9lbmNvZGVUb0NhcERhdGEuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIlFDTEFTUyIsIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSIsIm1ha2VFbmNvZGVUb0NhcERhdGEiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBwYXNzU3R5bGVPZixpc0Vycm9yTGlrZSxtYWtlVGFnZ2VkLGlzT2JqZWN0LGdldFRhZyxoYXNPd25Qcm9wZXJ0eU9mLGFzc2VydFBhc3NhYmxlU3ltYm9sLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWUsWCxGYWlsLHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImlzRXJyb3JMaWtlXCIsWyRozY9fYSA9PiAoaXNFcnJvckxpa2UgPSAkaM2PX2EpXV0sW1wibWFrZVRhZ2dlZFwiLFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV0sW1wiaXNPYmplY3RcIixbJGjNj19hID0+IChpc09iamVjdCA9ICRozY9fYSldXSxbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLFskaM2PX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsWyRozY9fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgaXNBcnJheSB9ID0gQXJyYXk7XG5jb25zdCB7XG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsXG4gIGRlZmluZVByb3BlcnRpZXMsXG4gIGlzLFxuICBlbnRyaWVzLFxuICBmcm9tRW50cmllcyxcbiAgZnJlZXplLFxufSA9IE9iamVjdDtcblxuLypcblxuXG4gKi9cbmNvbnN0IFFDTEFTUyA9ICdAcWNsYXNzJzskaM2PX29uY2UuUUNMQVNTKFFDTEFTUyk7XG5cblxuLypcblxuXG4gKi9cbmNvbnN0IGhhc1FDbGFzcyA9IGVuY29kZWQgPT4gaGFzT3duUHJvcGVydHlPZihlbmNvZGVkLCBRQ0xBU1MpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBxY2xhc3NNYXRjaGVzID0gKGVuY29kZWQsIHFjbGFzcykgPT5cbiAgaXNPYmplY3QoZW5jb2RlZCkgJiZcbiAgIWlzQXJyYXkoZW5jb2RlZCkgJiZcbiAgaGFzUUNsYXNzKGVuY29kZWQpICYmXG4gIGVuY29kZWRbUUNMQVNTXSA9PT0gcWNsYXNzO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuY29uc3QgZG9udEVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSA9IHJlbSA9PiBGYWlsYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gO1xuXG5jb25zdCBkb250RW5jb2RlUHJvbWlzZVRvQ2FwRGF0YSA9IHByb20gPT4gRmFpbGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cHJvbX1gO1xuXG5jb25zdCBkb250RW5jb2RlRXJyb3JUb0NhcERhdGEgPSBlcnIgPT4gRmFpbGBlcnJvciBvYmplY3QgdW5leHBlY3RlZDogJHtlcnJ9YDtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlRW5jb2RlVG9DYXBEYXRhID0gKGVuY29kZU9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhID0gZG9udEVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSxcbiAgICBlbmNvZGVQcm9taXNlVG9DYXBEYXRhID0gZG9udEVuY29kZVByb21pc2VUb0NhcERhdGEsXG4gICAgZW5jb2RlRXJyb3JUb0NhcERhdGEgPSBkb250RW5jb2RlRXJyb3JUb0NhcERhdGEsXG4gIH0gPSBlbmNvZGVPcHRpb25zO1xuXG4gIC8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGVuY29kZVRvQ2FwRGF0YVJlY3VyID0gcGFzc2FibGUgPT4ge1xuICAgIC8vXG4gICAgLy9cbiAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihwYXNzYWJsZSk7XG4gICAgc3dpdGNoIChwYXNzU3R5bGUpIHtcbiAgICAgIGNhc2UgJ251bGwnOlxuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICBjYXNlICdzdHJpbmcnOiB7XG4gICAgICAgIC8vXG4gICAgICAgIHJldHVybiBwYXNzYWJsZTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6IHtcbiAgICAgICAgcmV0dXJuIHsgW1FDTEFTU106ICd1bmRlZmluZWQnIH07XG4gICAgICB9XG4gICAgICBjYXNlICdudW1iZXInOiB7XG4gICAgICAgIC8vXG4gICAgICAgIGlmIChOdW1iZXIuaXNOYU4ocGFzc2FibGUpKSB7XG4gICAgICAgICAgcmV0dXJuIHsgW1FDTEFTU106ICdOYU4nIH07XG4gICAgICAgIH0gZWxzZSBpZiAocGFzc2FibGUgPT09IEluZmluaXR5KSB7XG4gICAgICAgICAgcmV0dXJuIHsgW1FDTEFTU106ICdJbmZpbml0eScgfTtcbiAgICAgICAgfSBlbHNlIGlmIChwYXNzYWJsZSA9PT0gLUluZmluaXR5KSB7XG4gICAgICAgICAgcmV0dXJuIHsgW1FDTEFTU106ICctSW5maW5pdHknIH07XG4gICAgICAgIH1cbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIGlzKHBhc3NhYmxlLCAtMCkgPyAwIDogcGFzc2FibGU7XG4gICAgICB9XG4gICAgICBjYXNlICdiaWdpbnQnOiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgW1FDTEFTU106ICdiaWdpbnQnLFxuICAgICAgICAgIGRpZ2l0czogU3RyaW5nKHBhc3NhYmxlKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgYXNzZXJ0UGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xuICAgICAgICBjb25zdCBuYW1lID0gLyogICAgICAgICAgICAgICAgICovIChuYW1lRm9yUGFzc2FibGVTeW1ib2wocGFzc2FibGUpKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBbUUNMQVNTXTogJ3N5bWJvbCcsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eU9mKHBhc3NhYmxlLCBRQ0xBU1MpKSB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICBjb25zdCB7IFtRQ0xBU1NdOiBxY2xhc3NWYWx1ZSwgLi4ucmVzdCB9ID0gcGFzc2FibGU7XG4gICAgICAgICAgLyogICAgICAgICAgICAgICAgICAgKi9cbiAgICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICBbUUNMQVNTXTogJ2hpbGJlcnQnLFxuICAgICAgICAgICAgb3JpZ2luYWw6IGVuY29kZVRvQ2FwRGF0YVJlY3VyKHFjbGFzc1ZhbHVlKSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChvd25LZXlzKHJlc3QpLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICByZXN1bHQucmVzdCA9IGVuY29kZVRvQ2FwRGF0YVJlY3VyKGZyZWV6ZShyZXN0KSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgbmFtZXMgPSBvd25LZXlzKHBhc3NhYmxlKS5zb3J0KCk7XG4gICAgICAgIHJldHVybiBmcm9tRW50cmllcyhcbiAgICAgICAgICBuYW1lcy5tYXAobmFtZSA9PiBbbmFtZSwgZW5jb2RlVG9DYXBEYXRhUmVjdXIocGFzc2FibGVbbmFtZV0pXSksXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICAgIHJldHVybiBwYXNzYWJsZS5tYXAoZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuICAgICAgfVxuICAgICAgY2FzZSAndGFnZ2VkJzoge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIFtRQ0xBU1NdOiAndGFnZ2VkJyxcbiAgICAgICAgICB0YWc6IGdldFRhZyhwYXNzYWJsZSksXG4gICAgICAgICAgcGF5bG9hZDogZW5jb2RlVG9DYXBEYXRhUmVjdXIocGFzc2FibGUucGF5bG9hZCksXG4gICAgICAgIH07XG4gICAgICB9XG4gICAgICBjYXNlICdyZW1vdGFibGUnOiB7XG4gICAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVSZW1vdGFibGVUb0NhcERhdGEoXG4gICAgICAgICAgcGFzc2FibGUsXG4gICAgICAgICAgZW5jb2RlVG9DYXBEYXRhUmVjdXIsXG4gICAgICAgICk7XG4gICAgICAgIGlmIChxY2xhc3NNYXRjaGVzKGVuY29kZWQsICdzbG90JykpIHtcbiAgICAgICAgICByZXR1cm4gZW5jb2RlZDtcbiAgICAgICAgfVxuICAgICAgICAvL1xuICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBSZW1vdGFibGUgZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCAke3EoXG4gICAgICAgICAgUUNMQVNTLFxuICAgICAgICApfSAke3EoJ3Nsb3QnKX06ICR7ZW5jb2RlZH1gO1xuICAgICAgfVxuICAgICAgY2FzZSAncHJvbWlzZSc6IHtcbiAgICAgICAgY29uc3QgZW5jb2RlZCA9IGVuY29kZVByb21pc2VUb0NhcERhdGEocGFzc2FibGUsIGVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcbiAgICAgICAgaWYgKHFjbGFzc01hdGNoZXMoZW5jb2RlZCwgJ3Nsb3QnKSkge1xuICAgICAgICAgIHJldHVybiBlbmNvZGVkO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IEZhaWxgaW50ZXJuYWw6IFByb21pc2UgZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCAke3EoXG4gICAgICAgICAgUUNMQVNTLFxuICAgICAgICAgICdzbG90JyxcbiAgICAgICAgKX06ICR7ZW5jb2RlZH1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVFcnJvclRvQ2FwRGF0YShwYXNzYWJsZSwgZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuICAgICAgICBpZiAocWNsYXNzTWF0Y2hlcyhlbmNvZGVkLCAnZXJyb3InKSkge1xuICAgICAgICAgIHJldHVybiBlbmNvZGVkO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IEZhaWxgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggJHtxKFxuICAgICAgICAgIFFDTEFTUyxcbiAgICAgICAgICAnZXJyb3InLFxuICAgICAgICApfTogJHtlbmNvZGVkfWA7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IGFzc2VydC5mYWlsKFxuICAgICAgICAgIFhgaW50ZXJuYWw6IFVucmVjb2duaXplZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9YCxcbiAgICAgICAgICBUeXBlRXJyb3IsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBlbmNvZGVUb0NhcERhdGEgPSBwYXNzYWJsZSA9PiB7XG4gICAgaWYgKGlzRXJyb3JMaWtlKHBhc3NhYmxlKSkge1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHJldHVybiBoYXJkZW4oZW5jb2RlRXJyb3JUb0NhcERhdGEocGFzc2FibGUsIGVuY29kZVRvQ2FwRGF0YVJlY3VyKSk7XG4gICAgfVxuICAgIHJldHVybiBoYXJkZW4oZW5jb2RlVG9DYXBEYXRhUmVjdXIocGFzc2FibGUpKTtcbiAgfTtcbiAgcmV0dXJuIGhhcmRlbihlbmNvZGVUb0NhcERhdGEpO1xufTskaM2PX29uY2UubWFrZUVuY29kZVRvQ2FwRGF0YShtYWtlRW5jb2RlVG9DYXBEYXRhKTtcbmhhcmRlbihtYWtlRW5jb2RlVG9DYXBEYXRhKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5cbmNvbnN0IGRvbnREZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSA9IHNsb3RFbmNvZGluZyA9PlxuICBGYWlsYHJlbW90YWJsZSBvciBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7c2xvdEVuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlRXJyb3JGcm9tQ2FwRGF0YSA9IGVycm9yRW5jb2RpbmcgPT5cbiAgRmFpbGBlcnJvciB1bmV4cGVjdGVkOiAke2Vycm9yRW5jb2Rpbmd9YDtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlRGVjb2RlRnJvbUNhcERhdGEgPSAoZGVjb2RlT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YSA9IGRvbnREZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbiAgICBkZWNvZGVQcm9taXNlRnJvbUNhcERhdGEgPSBkb250RGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG4gICAgZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YSA9IGRvbnREZWNvZGVFcnJvckZyb21DYXBEYXRhLFxuICB9ID0gZGVjb2RlT3B0aW9ucztcblxuICBkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YSA9PT0gZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhIHx8XG4gICAgRmFpbGBBbiBpbXBsZW1lbnRhdGlvbiByZXN0cmljdGlvbiBmb3Igbm93OiBJZiBlaXRoZXIgZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEgb3IgZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhIGlzIHByb3ZpZGVkLCBib3RoIG11c3QgYmUgcHJvdmlkZWQgYW5kIHRoZXkgbXVzdCBiZSB0aGUgc2FtZTogJHtxKFxuICAgICAgZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEsXG4gICAgKX0gdnMgJHtxKGRlY29kZVByb21pc2VGcm9tQ2FwRGF0YSl9YDtcblxuICAvKlxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGRlY29kZUZyb21DYXBEYXRhID0ganNvbkVuY29kZWQgPT4ge1xuICAgIGlmICghaXNPYmplY3QoanNvbkVuY29kZWQpKSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIGpzb25FbmNvZGVkO1xuICAgIH1cbiAgICBpZiAoaXNBcnJheShqc29uRW5jb2RlZCkpIHtcbiAgICAgIHJldHVybiBqc29uRW5jb2RlZC5tYXAoZW5jb2RlZFZhbCA9PiBkZWNvZGVGcm9tQ2FwRGF0YShlbmNvZGVkVmFsKSk7XG4gICAgfSBlbHNlIGlmIChoYXNRQ2xhc3MoanNvbkVuY29kZWQpKSB7XG4gICAgICBjb25zdCBxY2xhc3MgPSBqc29uRW5jb2RlZFtRQ0xBU1NdO1xuICAgICAgdHlwZW9mIHFjbGFzcyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgRmFpbGBpbnZhbGlkICR7cShRQ0xBU1MpfSB0eXBlb2YgJHtxKHR5cGVvZiBxY2xhc3MpfWA7XG4gICAgICBzd2l0Y2ggKHFjbGFzcykge1xuICAgICAgICAvL1xuICAgICAgICBjYXNlICd1bmRlZmluZWQnOiB7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdOYU4nOiB7XG4gICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdJbmZpbml0eSc6IHtcbiAgICAgICAgICByZXR1cm4gSW5maW5pdHk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnLUluZmluaXR5Jzoge1xuICAgICAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICAgIGNvbnN0IHsgZGlnaXRzIH0gPSBqc29uRW5jb2RlZDtcbiAgICAgICAgICB0eXBlb2YgZGlnaXRzID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgRmFpbGBpbnZhbGlkIGRpZ2l0cyB0eXBlb2YgJHtxKHR5cGVvZiBkaWdpdHMpfWA7XG4gICAgICAgICAgcmV0dXJuIEJpZ0ludChkaWdpdHMpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0BAYXN5bmNJdGVyYXRvcic6IHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIHJldHVybiBTeW1ib2wuYXN5bmNJdGVyYXRvcjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzeW1ib2wnOiB7XG4gICAgICAgICAgY29uc3QgeyBuYW1lIH0gPSBqc29uRW5jb2RlZDtcbiAgICAgICAgICByZXR1cm4gcGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgICBjb25zdCB7IHRhZywgcGF5bG9hZCB9ID0ganNvbkVuY29kZWQ7XG4gICAgICAgICAgcmV0dXJuIG1ha2VUYWdnZWQodGFnLCBkZWNvZGVGcm9tQ2FwRGF0YShwYXlsb2FkKSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc2xvdCc6IHtcbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEoXG4gICAgICAgICAgICBqc29uRW5jb2RlZCxcbiAgICAgICAgICAgIGRlY29kZUZyb21DYXBEYXRhLFxuICAgICAgICAgICk7XG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICByZXR1cm4gZGVjb2RlZDtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgICAgICBjb25zdCBkZWNvZGVkID0gZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YShcbiAgICAgICAgICAgIGpzb25FbmNvZGVkLFxuICAgICAgICAgICAgZGVjb2RlRnJvbUNhcERhdGEsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBpZiAocGFzc1N0eWxlT2YoZGVjb2RlZCkgPT09ICdlcnJvcicpIHtcbiAgICAgICAgICAgIHJldHVybiBkZWNvZGVkO1xuICAgICAgICAgIH1cbiAgICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBkZWNvZGVFcnJvckZyb21DYXBEYXRhIG9wdGlvbiBtdXN0IHJldHVybiBhbiBlcnJvcjogJHtkZWNvZGVkfWA7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnaGlsYmVydCc6IHtcbiAgICAgICAgICBjb25zdCB7IG9yaWdpbmFsLCByZXN0IH0gPSBqc29uRW5jb2RlZDtcbiAgICAgICAgICBoYXNPd25Qcm9wZXJ0eU9mKGpzb25FbmNvZGVkLCAnb3JpZ2luYWwnKSB8fFxuICAgICAgICAgICAgRmFpbGBJbnZhbGlkIEhpbGJlcnQgSG90ZWwgZW5jb2RpbmcgJHtqc29uRW5jb2RlZH1gO1xuICAgICAgICAgIC8vXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0geyBbUUNMQVNTXTogZGVjb2RlRnJvbUNhcERhdGEob3JpZ2luYWwpIH07XG4gICAgICAgICAgaWYgKGhhc093blByb3BlcnR5T2YoanNvbkVuY29kZWQsICdyZXN0JykpIHtcbiAgICAgICAgICAgIGNvbnN0IGlzTm9uRW1wdHlPYmplY3QgPVxuICAgICAgICAgICAgICB0eXBlb2YgcmVzdCA9PT0gJ29iamVjdCcgJiZcbiAgICAgICAgICAgICAgcmVzdCAhPT0gbnVsbCAmJlxuICAgICAgICAgICAgICBvd25LZXlzKHJlc3QpLmxlbmd0aCA+PSAxO1xuICAgICAgICAgICAgaWYgKCFpc05vbkVtcHR5T2JqZWN0KSB7XG4gICAgICAgICAgICAgIHRocm93IEZhaWxgUmVzdCBlbmNvZGluZyBtdXN0IGJlIGEgbm9uLWVtcHR5IG9iamVjdDogJHtyZXN0fWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCByZXN0T2JqID0gZGVjb2RlRnJvbUNhcERhdGEocmVzdCk7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vXG4gICAgICAgICAgICAhaGFzT3duUHJvcGVydHlPZihyZXN0T2JqLCBRQ0xBU1MpIHx8XG4gICAgICAgICAgICAgIEZhaWxgUmVzdCBtdXN0IG5vdCBjb250YWluIGl0cyBvd24gZGVmaW5pdGlvbiBvZiAke3EoUUNMQVNTKX1gO1xuICAgICAgICAgICAgZGVmaW5lUHJvcGVydGllcyhyZXN1bHQsIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocmVzdE9iaikpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIC8vXG4gICAgICAgIGNhc2UgJ2liaWQnOiB7XG4gICAgICAgICAgdGhyb3cgRmFpbGBUaGUgY2FwRGF0YSBwcm90b2NvbCBubyBsb25nZXIgc3VwcG9ydHMgJHtxKFFDTEFTUyl9ICR7cShcbiAgICAgICAgICAgIHFjbGFzcyxcbiAgICAgICAgICApfWA7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IGFzc2VydC5mYWlsKFxuICAgICAgICAgICAgWGB1bnJlY29nbml6ZWQgJHtxKFFDTEFTUyl9ICR7cShxY2xhc3MpfWAsXG4gICAgICAgICAgICBUeXBlRXJyb3IsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQodHlwZW9mIGpzb25FbmNvZGVkID09PSAnb2JqZWN0JyAmJiBqc29uRW5jb2RlZCAhPT0gbnVsbCk7XG4gICAgICBjb25zdCBkZWNvZGVFbnRyeSA9IChbbmFtZSwgZW5jb2RlZFZhbF0pID0+IHtcbiAgICAgICAgdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgRmFpbGBQcm9wZXJ0eSAke3EobmFtZSl9IG9mICR7anNvbkVuY29kZWR9IG11c3QgYmUgYSBzdHJpbmdgO1xuICAgICAgICByZXR1cm4gW25hbWUsIGRlY29kZUZyb21DYXBEYXRhKGVuY29kZWRWYWwpXTtcbiAgICAgIH07XG4gICAgICBjb25zdCBkZWNvZGVkRW50cmllcyA9IGVudHJpZXMoanNvbkVuY29kZWQpLm1hcChkZWNvZGVFbnRyeSk7XG4gICAgICByZXR1cm4gZnJvbUVudHJpZXMoZGVjb2RlZEVudHJpZXMpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGhhcmRlbihkZWNvZGVGcm9tQ2FwRGF0YSk7XG59OyRozY9fb25jZS5tYWtlRGVjb2RlRnJvbUNhcERhdGEobWFrZURlY29kZUZyb21DYXBEYXRhKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlFDTEFTUyI6WyJRQ0xBU1MiXSwibWFrZUVuY29kZVRvQ2FwRGF0YSI6WyJtYWtlRW5jb2RlVG9DYXBEYXRhIl0sIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSI6WyJtYWtlRGVjb2RlRnJvbUNhcERhdGEiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA9hgbT0EsAABBLAAALQAAAEBlbmRvL21hcnNoYWwtdjEuNi40L3NyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsibWFrZURlY29kZUZyb21TbWFsbGNhcHMiLCJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBwYXNzU3R5bGVPZixpc0Vycm9yTGlrZSxtYWtlVGFnZ2VkLGdldFRhZyxoYXNPd25Qcm9wZXJ0eU9mLGFzc2VydFBhc3NhYmxlU3ltYm9sLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWUsWCxGYWlsLHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImlzRXJyb3JMaWtlXCIsWyRozY9fYSA9PiAoaXNFcnJvckxpa2UgPSAkaM2PX2EpXV0sW1wibWFrZVRhZ2dlZFwiLFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV0sW1wiZ2V0VGFnXCIsWyRozY9fYSA9PiAoZ2V0VGFnID0gJGjNj19hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIixbJGjNj19hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjNj19hKV1dLFtcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsWyRozY9fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjNj19hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLFskaM2PX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLy9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBpc0FycmF5IH0gPSBBcnJheTtcbmNvbnN0IHsgaXMsIGVudHJpZXMsIGZyb21FbnRyaWVzIH0gPSBPYmplY3Q7XG5cbmNvbnN0IEJBTkcgPSAnIScuY2hhckNvZGVBdCgwKTtcbmNvbnN0IERBU0ggPSAnLScuY2hhckNvZGVBdCgwKTtcblxuLypcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3Qgc3RhcnRzU3BlY2lhbCA9IGVuY29kZWRTdHIgPT4ge1xuICBpZiAoZW5jb2RlZFN0ciA9PT0gJycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgLy9cbiAgY29uc3QgY29kZSA9IGVuY29kZWRTdHIuY2hhckNvZGVBdCgwKTtcbiAgLy9cbiAgcmV0dXJuIEJBTkcgPD0gY29kZSAmJiBjb2RlIDw9IERBU0g7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cblxuY29uc3QgZG9udEVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzID0gcmVtID0+XG4gIEZhaWxgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cmVtfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMgPSBwcm9tID0+IEZhaWxgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Byb219YDtcblxuY29uc3QgZG9udEVuY29kZUVycm9yVG9TbWFsbGNhcHMgPSBlcnIgPT5cbiAgRmFpbGBlcnJvciBvYmplY3QgdW5leHBlY3RlZDogJHtxKGVycil9YDtcblxuLypcblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlRW5jb2RlVG9TbWFsbGNhcHMgPSAoZW5jb2RlT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBlbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyA9IGRvbnRFbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyxcbiAgICBlbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMgPSBkb250RW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzLFxuICAgIGVuY29kZUVycm9yVG9TbWFsbGNhcHMgPSBkb250RW5jb2RlRXJyb3JUb1NtYWxsY2FwcyxcbiAgfSA9IGVuY29kZU9wdGlvbnM7XG5cbiAgY29uc3QgYXNzZXJ0RW5jb2RlZEVycm9yID0gZW5jb2RpbmcgPT4ge1xuICAgICh0eXBlb2YgZW5jb2RpbmcgPT09ICdvYmplY3QnICYmIGhhc093blByb3BlcnR5T2YoZW5jb2RpbmcsICcjZXJyb3InKSkgfHxcbiAgICAgIEZhaWxgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgaGF2ZSBcIiNlcnJvclwiIHByb3BlcnR5OiAke3EoXG4gICAgICAgIGVuY29kaW5nLFxuICAgICAgKX1gO1xuICAgIC8vXG4gICAgY29uc3QgbWVzc2FnZSA9IGVuY29kaW5nWycjZXJyb3InXTtcbiAgICAodHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnICYmXG4gICAgICAoIXN0YXJ0c1NwZWNpYWwobWVzc2FnZSkgfHwgbWVzc2FnZS5jaGFyQXQoMCkgPT09ICchJykpIHx8XG4gICAgICBGYWlsYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IGhhdmUgc3RyaW5nIG1lc3NhZ2U6ICR7cShtZXNzYWdlKX1gO1xuICB9O1xuXG4gIC8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGVuY29kZVRvU21hbGxjYXBzUmVjdXIgPSBwYXNzYWJsZSA9PiB7XG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbiAgICBzd2l0Y2ggKHBhc3NTdHlsZSkge1xuICAgICAgY2FzZSAnbnVsbCc6XG4gICAgICBjYXNlICdib29sZWFuJzoge1xuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gcGFzc2FibGU7XG4gICAgICB9XG4gICAgICBjYXNlICdzdHJpbmcnOiB7XG4gICAgICAgIGlmIChzdGFydHNTcGVjaWFsKHBhc3NhYmxlKSkge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICByZXR1cm4gYCEke3Bhc3NhYmxlfWA7XG4gICAgICAgIH1cbiAgICAgICAgLy9cbiAgICAgICAgcmV0dXJuIHBhc3NhYmxlO1xuICAgICAgfVxuICAgICAgY2FzZSAndW5kZWZpbmVkJzoge1xuICAgICAgICByZXR1cm4gJyN1bmRlZmluZWQnO1xuICAgICAgfVxuICAgICAgY2FzZSAnbnVtYmVyJzoge1xuICAgICAgICAvL1xuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHBhc3NhYmxlKSkge1xuICAgICAgICAgIHJldHVybiAnI05hTic7XG4gICAgICAgIH0gZWxzZSBpZiAocGFzc2FibGUgPT09IEluZmluaXR5KSB7XG4gICAgICAgICAgcmV0dXJuICcjSW5maW5pdHknO1xuICAgICAgICB9IGVsc2UgaWYgKHBhc3NhYmxlID09PSAtSW5maW5pdHkpIHtcbiAgICAgICAgICByZXR1cm4gJyMtSW5maW5pdHknO1xuICAgICAgICB9XG4gICAgICAgIC8vXG4gICAgICAgIHJldHVybiBpcyhwYXNzYWJsZSwgLTApID8gMCA6IHBhc3NhYmxlO1xuICAgICAgfVxuICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICBjb25zdCBzdHIgPSBTdHJpbmcocGFzc2FibGUpO1xuICAgICAgICByZXR1cm4gLyogICAgICAgICAgICAgICAgICovIChwYXNzYWJsZSkgPCAwbiA/IHN0ciA6IGArJHtzdHJ9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgYXNzZXJ0UGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xuICAgICAgICBjb25zdCBuYW1lID0gLyogICAgICAgICAgICAgICAgICovIChuYW1lRm9yUGFzc2FibGVTeW1ib2wocGFzc2FibGUpKTtcbiAgICAgICAgcmV0dXJuIGAlJHtuYW1lfWA7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5UmVjb3JkJzoge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBjb25zdCBuYW1lcyA9IG93bktleXMocGFzc2FibGUpLnNvcnQoKTtcbiAgICAgICAgcmV0dXJuIGZyb21FbnRyaWVzKFxuICAgICAgICAgIG5hbWVzLm1hcChuYW1lID0+IFtcbiAgICAgICAgICAgIGVuY29kZVRvU21hbGxjYXBzUmVjdXIobmFtZSksXG4gICAgICAgICAgICBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKHBhc3NhYmxlW25hbWVdKSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgcmV0dXJuIHBhc3NhYmxlLm1hcChlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAnI3RhZyc6IGVuY29kZVRvU21hbGxjYXBzUmVjdXIoZ2V0VGFnKHBhc3NhYmxlKSksXG4gICAgICAgICAgcGF5bG9hZDogZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZS5wYXlsb2FkKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3JlbW90YWJsZSc6IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMoXG4gICAgICAgICAgcGFzc2FibGUsXG4gICAgICAgICAgZW5jb2RlVG9TbWFsbGNhcHNSZWN1cixcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnICYmIHJlc3VsdC5jaGFyQXQoMCkgPT09ICckJykge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgLy9cbiAgICAgICAgdGhyb3cgRmFpbGBpbnRlcm5hbDogUmVtb3RhYmxlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiRcIjogJHtyZXN1bHR9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3Byb21pc2UnOiB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGVuY29kZVByb21pc2VUb1NtYWxsY2FwcyhcbiAgICAgICAgICBwYXNzYWJsZSxcbiAgICAgICAgICBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyLFxuICAgICAgICApO1xuICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycgJiYgcmVzdWx0LmNoYXJBdCgwKSA9PT0gJyYnKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBQcm9taXNlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcIiZcIjogJHtyZXN1bHR9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBlbmNvZGVFcnJvclRvU21hbGxjYXBzKHBhc3NhYmxlLCBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcbiAgICAgICAgYXNzZXJ0RW5jb2RlZEVycm9yKHJlc3VsdCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IGFzc2VydC5mYWlsKFxuICAgICAgICAgIFhgaW50ZXJuYWw6IFVucmVjb2duaXplZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9YCxcbiAgICAgICAgICBUeXBlRXJyb3IsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBlbmNvZGVUb1NtYWxsY2FwcyA9IHBhc3NhYmxlID0+IHtcbiAgICBpZiAoaXNFcnJvckxpa2UocGFzc2FibGUpKSB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3QgcmVzdWx0ID0gaGFyZGVuKFxuICAgICAgICBlbmNvZGVFcnJvclRvU21hbGxjYXBzKHBhc3NhYmxlLCBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKSxcbiAgICAgICk7XG4gICAgICBhc3NlcnRFbmNvZGVkRXJyb3IocmVzdWx0KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiBoYXJkZW4oZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZSkpO1xuICB9O1xuICByZXR1cm4gaGFyZGVuKGVuY29kZVRvU21hbGxjYXBzKTtcbn07JGjNj19vbmNlLm1ha2VFbmNvZGVUb1NtYWxsY2FwcyhtYWtlRW5jb2RlVG9TbWFsbGNhcHMpO1xuaGFyZGVuKG1ha2VFbmNvZGVUb1NtYWxsY2Fwcyk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG5jb25zdCBkb250RGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyA9IGVuY29kaW5nID0+XG4gIEZhaWxgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7ZW5jb2Rpbmd9YDtcbmNvbnN0IGRvbnREZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyA9IGVuY29kaW5nID0+XG4gIEZhaWxgcHJvbWlzZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzID0gZW5jb2RpbmcgPT5cbiAgRmFpbGBlcnJvciB1bmV4cGVjdGVkOiAke3EoZW5jb2RpbmcpfWA7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZURlY29kZUZyb21TbWFsbGNhcHMgPSAoZGVjb2RlT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzID0gZG9udERlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMsXG4gICAgZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMgPSBkb250RGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMsXG4gICAgZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzID0gZG9udERlY29kZUVycm9yRnJvbVNtYWxsY2FwcyxcbiAgfSA9IGRlY29kZU9wdGlvbnM7XG5cbiAgLypcblxuXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBkZWNvZGVGcm9tU21hbGxjYXBzID0gZW5jb2RpbmcgPT4ge1xuICAgIHN3aXRjaCAodHlwZW9mIGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIGNhc2UgJ251bWJlcic6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kaW5nO1xuICAgICAgfVxuICAgICAgY2FzZSAnc3RyaW5nJzoge1xuICAgICAgICBpZiAoIXN0YXJ0c1NwZWNpYWwoZW5jb2RpbmcpKSB7XG4gICAgICAgICAgcmV0dXJuIGVuY29kaW5nO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGMgPSBlbmNvZGluZy5jaGFyQXQoMCk7XG4gICAgICAgIHN3aXRjaCAoYykge1xuICAgICAgICAgIGNhc2UgJyEnOiB7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgcmV0dXJuIGVuY29kaW5nLnNsaWNlKDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICclJzoge1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NhYmxlU3ltYm9sRm9yTmFtZShlbmNvZGluZy5zbGljZSgxKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJyMnOiB7XG4gICAgICAgICAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICAgICAgICAgIGNhc2UgJyN1bmRlZmluZWQnOiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlICcjTmFOJzoge1xuICAgICAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FzZSAnI0luZmluaXR5Jzoge1xuICAgICAgICAgICAgICAgIHJldHVybiBJbmZpbml0eTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlICcjLUluZmluaXR5Jzoge1xuICAgICAgICAgICAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIHRocm93IGFzc2VydC5mYWlsKFxuICAgICAgICAgICAgICAgICAgWGB1bmtub3duIGNvbnN0YW50IFwiJHtxKGVuY29kaW5nKX1cImAsXG4gICAgICAgICAgICAgICAgICBUeXBlRXJyb3IsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICcrJzpcbiAgICAgICAgICBjYXNlICctJzoge1xuICAgICAgICAgICAgcmV0dXJuIEJpZ0ludChlbmNvZGluZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJyQnOiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzKFxuICAgICAgICAgICAgICBlbmNvZGluZyxcbiAgICAgICAgICAgICAgZGVjb2RlRnJvbVNtYWxsY2FwcyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgaWYgKHBhc3NTdHlsZU9mKHJlc3VsdCkgIT09ICdyZW1vdGFibGUnKSB7XG4gICAgICAgICAgICAgIEZhaWxgaW50ZXJuYWw6IGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMgb3B0aW9uIG11c3QgcmV0dXJuIGEgcmVtb3RhYmxlOiAke3Jlc3VsdH1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgY2FzZSAnJic6IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzKFxuICAgICAgICAgICAgICBlbmNvZGluZyxcbiAgICAgICAgICAgICAgZGVjb2RlRnJvbVNtYWxsY2FwcyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAocGFzc1N0eWxlT2YocmVzdWx0KSAhPT0gJ3Byb21pc2UnKSB7XG4gICAgICAgICAgICAgIEZhaWxgaW50ZXJuYWw6IGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhIHByb21pc2U6ICR7cmVzdWx0fWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICB0aHJvdyBGYWlsYFNwZWNpYWwgY2hhciAke3EoXG4gICAgICAgICAgICAgIGMsXG4gICAgICAgICAgICApfSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZTogJHtlbmNvZGluZ31gO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2FzZSAnb2JqZWN0Jzoge1xuICAgICAgICBpZiAoZW5jb2RpbmcgPT09IG51bGwpIHtcbiAgICAgICAgICByZXR1cm4gZW5jb2Rpbmc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaXNBcnJheShlbmNvZGluZykpIHtcbiAgICAgICAgICByZXR1cm4gZW5jb2RpbmcubWFwKHZhbCA9PiBkZWNvZGVGcm9tU21hbGxjYXBzKHZhbCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc093blByb3BlcnR5T2YoZW5jb2RpbmcsICcjdGFnJykpIHtcbiAgICAgICAgICBjb25zdCB7ICcjdGFnJzogdGFnLCBwYXlsb2FkLCAuLi5yZXN0IH0gPSBlbmNvZGluZztcbiAgICAgICAgICB0eXBlb2YgdGFnID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgRmFpbGBWYWx1ZSBvZiBcIiN0YWdcIiwgdGhlIHRhZywgbXVzdCBiZSBhIHN0cmluZzogJHtlbmNvZGluZ31gO1xuICAgICAgICAgIG93bktleXMocmVzdCkubGVuZ3RoID09PSAwIHx8XG4gICAgICAgICAgICBGYWlsYCN0YWcgcmVjb3JkIHVuZXhwZWN0ZWQgcHJvcGVydGllczogJHtxKG93bktleXMocmVzdCkpfWA7XG4gICAgICAgICAgcmV0dXJuIG1ha2VUYWdnZWQoXG4gICAgICAgICAgICBkZWNvZGVGcm9tU21hbGxjYXBzKHRhZyksXG4gICAgICAgICAgICBkZWNvZGVGcm9tU21hbGxjYXBzKHBheWxvYWQpLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzT3duUHJvcGVydHlPZihlbmNvZGluZywgJyNlcnJvcicpKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzKFxuICAgICAgICAgICAgZW5jb2RpbmcsXG4gICAgICAgICAgICBkZWNvZGVGcm9tU21hbGxjYXBzLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcGFzc1N0eWxlT2YocmVzdWx0KSA9PT0gJ2Vycm9yJyB8fFxuICAgICAgICAgICAgRmFpbGBpbnRlcm5hbDogZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhbiBlcnJvcjogJHtyZXN1bHR9YDtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVjb2RlRW50cnkgPSAoW2VuY29kZWROYW1lLCBlbmNvZGVkVmFsXSkgPT4ge1xuICAgICAgICAgIHR5cGVvZiBlbmNvZGVkTmFtZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIEZhaWxgUHJvcGVydHkgbmFtZSAke3EoXG4gICAgICAgICAgICAgIGVuY29kZWROYW1lLFxuICAgICAgICAgICAgKX0gb2YgJHtlbmNvZGluZ30gbXVzdCBiZSBhIHN0cmluZ2A7XG4gICAgICAgICAgZW5jb2RlZE5hbWUuY2hhckF0KDApICE9PSAnIycgfHxcbiAgICAgICAgICAgIEZhaWxgVW5yZWNvZ25pemVkIHJlY29yZCB0eXBlICR7cShlbmNvZGVkTmFtZSl9OiAke2VuY29kaW5nfWA7XG4gICAgICAgICAgY29uc3QgbmFtZSA9IGRlY29kZUZyb21TbWFsbGNhcHMoZW5jb2RlZE5hbWUpO1xuICAgICAgICAgIHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgRmFpbGBEZWNvZGVkIHByb3BlcnR5IG5hbWUgJHtuYW1lfSBmcm9tICR7ZW5jb2Rpbmd9IG11c3QgYmUgYSBzdHJpbmdgO1xuICAgICAgICAgIHJldHVybiBbbmFtZSwgZGVjb2RlRnJvbVNtYWxsY2FwcyhlbmNvZGVkVmFsKV07XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGRlY29kZWRFbnRyaWVzID0gZW50cmllcyhlbmNvZGluZykubWFwKGRlY29kZUVudHJ5KTtcbiAgICAgICAgcmV0dXJuIGZyb21FbnRyaWVzKGRlY29kZWRFbnRyaWVzKTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoXG4gICAgICAgICAgWGBpbnRlcm5hbDogdW5yZWNvZ25pemVkIEpTT04gdHlwZW9mICR7cShcbiAgICAgICAgICAgIHR5cGVvZiBlbmNvZGluZyxcbiAgICAgICAgICApfTogJHtlbmNvZGluZ31gLFxuICAgICAgICAgIFR5cGVFcnJvcixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBoYXJkZW4oZGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG59OyRozY9fb25jZS5tYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyhtYWtlRGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiOlsibWFrZUVuY29kZVRvU21hbGxjYXBzIl0sIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzIjpbIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOaLU7BoLwAAaC8AACoAAABAZW5kby9tYXJzaGFsLXYxLjYuNC9zcmMvbWFyc2hhbC1qdXN0aW4uanN7ImltcG9ydHMiOlsiQGVuZG8vbmF0IiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2Vycm9ycyIsIi4vZW5jb2RlVG9DYXBEYXRhLmpzIl0sImV4cG9ydHMiOlsiZGVjb2RlVG9KdXN0aW4iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBOYXQsZ2V0RXJyb3JDb25zdHJ1Y3Rvcixpc09iamVjdCxwYXNzYWJsZVN5bWJvbEZvck5hbWUscSxYLEZhaWwsUUNMQVNTOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIixbJGjNj19hID0+IChOYXQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRFcnJvckNvbnN0cnVjdG9yXCIsWyRozY9fYSA9PiAoZ2V0RXJyb3JDb25zdHJ1Y3RvciA9ICRozY9fYSldXSxbXCJpc09iamVjdFwiLFskaM2PX2EgPT4gKGlzT2JqZWN0ID0gJGjNj19hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLFskaM2PX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL2VuY29kZVRvQ2FwRGF0YS5qc1wiLCBbW1wiUUNMQVNTXCIsWyRozY9fYSA9PiAoUUNMQVNTID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3QgeyBzdHJpbmdpZnk6IHF1b3RlIH0gPSBKU09OO1xuXG4vKlxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VZZXNJbmRlbnRlciA9ICgpID0+IHtcbiAgY29uc3Qgc3RyaW5ncyA9IFtdO1xuICBsZXQgbGV2ZWwgPSAwO1xuICBsZXQgbmVlZFNwYWNlID0gZmFsc2U7XG4gIGNvbnN0IGxpbmUgPSAoKSA9PiB7XG4gICAgbmVlZFNwYWNlID0gZmFsc2U7XG4gICAgcmV0dXJuIHN0cmluZ3MucHVzaCgnXFxuJywgJyAgJy5yZXBlYXQobGV2ZWwpKTtcbiAgfTtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgb3Blbjogb3BlbkJyYWNrZXQgPT4ge1xuICAgICAgbGV2ZWwgKz0gMTtcbiAgICAgIGlmIChuZWVkU3BhY2UpIHtcbiAgICAgICAgc3RyaW5ncy5wdXNoKCcgJyk7XG4gICAgICB9XG4gICAgICBuZWVkU3BhY2UgPSBmYWxzZTtcbiAgICAgIHJldHVybiBzdHJpbmdzLnB1c2gob3BlbkJyYWNrZXQpO1xuICAgIH0sXG4gICAgbGluZSxcbiAgICBuZXh0OiB0b2tlbiA9PiB7XG4gICAgICBpZiAobmVlZFNwYWNlICYmIHRva2VuICE9PSAnLCcpIHtcbiAgICAgICAgc3RyaW5ncy5wdXNoKCcgJyk7XG4gICAgICB9XG4gICAgICBuZWVkU3BhY2UgPSB0cnVlO1xuICAgICAgcmV0dXJuIHN0cmluZ3MucHVzaCh0b2tlbik7XG4gICAgfSxcbiAgICBjbG9zZTogY2xvc2VCcmFja2V0ID0+IHtcbiAgICAgIGFzc2VydChsZXZlbCA+PSAxKTtcbiAgICAgIGxldmVsIC09IDE7XG4gICAgICBsaW5lKCk7XG4gICAgICByZXR1cm4gc3RyaW5ncy5wdXNoKGNsb3NlQnJhY2tldCk7XG4gICAgfSxcbiAgICBkb25lOiAoKSA9PiB7XG4gICAgICBhc3NlcnQuZXF1YWwobGV2ZWwsIDApO1xuICAgICAgcmV0dXJuIHN0cmluZ3Muam9pbignJyk7XG4gICAgfSxcbiAgfSk7XG59O1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgYmFkUGFpclBhdHRlcm4gPSAvXig/Olxcd1xcd3w8PHw+PnxcXCtcXCt8LS18PCF8LT4pJC87XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IG1ha2VOb0luZGVudGVyID0gKCkgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBzdHJpbmdzID0gW107XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIG9wZW46IG9wZW5CcmFja2V0ID0+IHN0cmluZ3MucHVzaChvcGVuQnJhY2tldCksXG4gICAgbGluZTogKCkgPT4gc3RyaW5ncy5sZW5ndGgsXG4gICAgbmV4dDogdG9rZW4gPT4ge1xuICAgICAgaWYgKHN0cmluZ3MubGVuZ3RoID49IDEpIHtcbiAgICAgICAgY29uc3QgbGFzdCA9IHN0cmluZ3Nbc3RyaW5ncy5sZW5ndGggLSAxXTtcbiAgICAgICAgLy9cbiAgICAgICAgaWYgKGxhc3QubGVuZ3RoID49IDEgJiYgdG9rZW4ubGVuZ3RoID49IDEpIHtcbiAgICAgICAgICBjb25zdCBwYWlyID0gYCR7bGFzdFtsYXN0Lmxlbmd0aCAtIDFdfSR7dG9rZW5bMF19YDtcbiAgICAgICAgICBpZiAoYmFkUGFpclBhdHRlcm4udGVzdChwYWlyKSkge1xuICAgICAgICAgICAgc3RyaW5ncy5wdXNoKCcgJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RyaW5ncy5wdXNoKHRva2VuKTtcbiAgICB9LFxuICAgIGNsb3NlOiBjbG9zZUJyYWNrZXQgPT4ge1xuICAgICAgaWYgKHN0cmluZ3MubGVuZ3RoID49IDEgJiYgc3RyaW5nc1tzdHJpbmdzLmxlbmd0aCAtIDFdID09PSAnLCcpIHtcbiAgICAgICAgc3RyaW5ncy5wb3AoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdHJpbmdzLnB1c2goY2xvc2VCcmFja2V0KTtcbiAgICB9LFxuICAgIGRvbmU6ICgpID0+IHN0cmluZ3Muam9pbignJyksXG4gIH0pO1xufTtcblxuY29uc3QgaWRlbnRQYXR0ZXJuID0gL15bYS16QS1aXVxcdyokLztcbmhhcmRlbihpZGVudFBhdHRlcm4pO1xuY29uc3QgQXRBdFByZWZpeFBhdHRlcm4gPSAvXkBAKC4qKSQvO1xuaGFyZGVuKEF0QXRQcmVmaXhQYXR0ZXJuKTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBkZWNvZGVUb0p1c3RpbiA9IChlbmNvZGluZywgc2hvdWxkSW5kZW50ID0gZmFsc2UsIHNsb3RzID0gW10pID0+IHtcbiAgLypcblxuXG5cblxuXG5cblxuXG5cblxuICAgKi9cbiAgY29uc3QgcHJlcGFyZSA9IHJhd1RyZWUgPT4ge1xuICAgIGlmICghaXNPYmplY3QocmF3VHJlZSkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy9cbiAgICBhc3NlcnQudHlwZW9mKHJhd1RyZWUsICdvYmplY3QnKTtcbiAgICBhc3NlcnQocmF3VHJlZSAhPT0gbnVsbCk7XG4gICAgaWYgKFFDTEFTUyBpbiByYXdUcmVlKSB7XG4gICAgICBjb25zdCBxY2xhc3MgPSByYXdUcmVlW1FDTEFTU107XG4gICAgICB0eXBlb2YgcWNsYXNzID09PSAnc3RyaW5nJyB8fFxuICAgICAgICBGYWlsYGludmFsaWQgcWNsYXNzIHR5cGVvZiAke3EodHlwZW9mIHFjbGFzcyl9YDtcbiAgICAgIGFzc2VydCghaXNBcnJheShyYXdUcmVlKSk7XG4gICAgICBzd2l0Y2ggKHJhd1RyZWVbJ0BxY2xhc3MnXSkge1xuICAgICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICBjYXNlICdOYU4nOlxuICAgICAgICBjYXNlICdJbmZpbml0eSc6XG4gICAgICAgIGNhc2UgJy1JbmZpbml0eSc6IHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICAgIGNvbnN0IHsgZGlnaXRzIH0gPSByYXdUcmVlO1xuICAgICAgICAgIHR5cGVvZiBkaWdpdHMgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICBGYWlsYGludmFsaWQgZGlnaXRzIHR5cGVvZiAke3EodHlwZW9mIGRpZ2l0cyl9YDtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnQEBhc3luY0l0ZXJhdG9yJzoge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzeW1ib2wnOiB7XG4gICAgICAgICAgY29uc3QgeyBuYW1lIH0gPSByYXdUcmVlO1xuICAgICAgICAgIGFzc2VydC50eXBlb2YobmFtZSwgJ3N0cmluZycpO1xuICAgICAgICAgIGNvbnN0IHN5bSA9IHBhc3NhYmxlU3ltYm9sRm9yTmFtZShuYW1lKTtcbiAgICAgICAgICBhc3NlcnQudHlwZW9mKHN5bSwgJ3N5bWJvbCcpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAgICAgY29uc3QgeyB0YWcsIHBheWxvYWQgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgYXNzZXJ0LnR5cGVvZih0YWcsICdzdHJpbmcnKTtcbiAgICAgICAgICBwcmVwYXJlKHBheWxvYWQpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzbG90Jzoge1xuICAgICAgICAgIGNvbnN0IHsgaW5kZXgsIGlmYWNlIH0gPSByYXdUcmVlO1xuICAgICAgICAgIGFzc2VydC50eXBlb2YoaW5kZXgsICdudW1iZXInKTtcbiAgICAgICAgICBOYXQoaW5kZXgpO1xuICAgICAgICAgIGlmIChpZmFjZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhc3NlcnQudHlwZW9mKGlmYWNlLCAnc3RyaW5nJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdoaWxiZXJ0Jzoge1xuICAgICAgICAgIGNvbnN0IHsgb3JpZ2luYWwsIHJlc3QgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgJ29yaWdpbmFsJyBpbiByYXdUcmVlIHx8XG4gICAgICAgICAgICBGYWlsYEludmFsaWQgSGlsYmVydCBIb3RlbCBlbmNvZGluZyAke3Jhd1RyZWV9YDtcbiAgICAgICAgICBwcmVwYXJlKG9yaWdpbmFsKTtcbiAgICAgICAgICBpZiAoJ3Jlc3QnIGluIHJhd1RyZWUpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzdCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgdGhyb3cgRmFpbGBSZXN0ICR7cmVzdH0gZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3RgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlc3QgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdGhyb3cgRmFpbGBSZXN0ICR7cmVzdH0gZW5jb2RpbmcgbXVzdCBub3QgYmUgbnVsbGA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNBcnJheShyZXN0KSkge1xuICAgICAgICAgICAgICB0aHJvdyBGYWlsYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IG5vdCBiZSBhbiBhcnJheWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoUUNMQVNTIGluIHJlc3QpIHtcbiAgICAgICAgICAgICAgdGhyb3cgRmFpbGBSZXN0IGVuY29kaW5nICR7cmVzdH0gbXVzdCBub3QgY29udGFpbiAke3EoUUNMQVNTKX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbmFtZXMgPSBvd25LZXlzKHJlc3QpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICAgICAgICAgIHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgICAgIEZhaWxgUHJvcGVydHkgbmFtZSAke25hbWV9IG9mICR7cmF3VHJlZX0gbXVzdCBiZSBhIHN0cmluZ2A7XG4gICAgICAgICAgICAgIHByZXBhcmUocmVzdFtuYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgICAgICBjb25zdCB7IG5hbWUsIG1lc3NhZ2UgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgRmFpbGBpbnZhbGlkIGVycm9yIG5hbWUgdHlwZW9mICR7cSh0eXBlb2YgbmFtZSl9YDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZ2V0RXJyb3JDb25zdHJ1Y3RvcihuYW1lKSAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICBGYWlsYE11c3QgYmUgdGhlIG5hbWUgb2YgYW4gRXJyb3IgY29uc3RydWN0b3IgJHtuYW1lfWA7XG4gICAgICAgICAgdHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICBGYWlsYGludmFsaWQgZXJyb3IgbWVzc2FnZSB0eXBlb2YgJHtxKHR5cGVvZiBtZXNzYWdlKX1gO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBhc3NlcnQuZmFpbChYYHVucmVjb2duaXplZCAke3EoUUNMQVNTKX0gJHtxKHFjbGFzcyl9YCwgVHlwZUVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNBcnJheShyYXdUcmVlKSkge1xuICAgICAgY29uc3QgeyBsZW5ndGggfSA9IHJhd1RyZWU7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHByZXBhcmUocmF3VHJlZVtpXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG5hbWVzID0gb3duS2V5cyhyYXdUcmVlKTtcbiAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgRmFpbGBQcm9wZXJ0eSBuYW1lICR7bmFtZX0gb2YgJHtyYXdUcmVlfSBtdXN0IGJlIGEgc3RyaW5nYDtcbiAgICAgICAgfVxuICAgICAgICBwcmVwYXJlKHJhd1RyZWVbbmFtZV0pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBjb25zdCBtYWtlSW5kZW50ZXIgPSBzaG91bGRJbmRlbnQgPyBtYWtlWWVzSW5kZW50ZXIgOiBtYWtlTm9JbmRlbnRlcjtcbiAgbGV0IG91dCA9IG1ha2VJbmRlbnRlcigpO1xuXG4gIC8qXG5cblxuXG5cblxuXG4gICAqL1xuICBjb25zdCBkZWNvZGUgPSByYXdUcmVlID0+IHtcbiAgICAvL1xuICAgIHJldHVybiByZWN1cihyYXdUcmVlKTtcbiAgfTtcblxuICBjb25zdCBkZWNvZGVQcm9wZXJ0eSA9IChuYW1lLCB2YWx1ZSkgPT4ge1xuICAgIG91dC5saW5lKCk7XG4gICAgaWYgKG5hbWUgPT09ICdfX3Byb3RvX18nKSB7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgb3V0Lm5leHQoYFtcIl9fcHJvdG9fX1wiXTpgKTtcbiAgICB9IGVsc2UgaWYgKGlkZW50UGF0dGVybi50ZXN0KG5hbWUpKSB7XG4gICAgICBvdXQubmV4dChgJHtuYW1lfTpgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0Lm5leHQoYCR7cXVvdGUobmFtZSl9OmApO1xuICAgIH1cbiAgICBkZWNvZGUodmFsdWUpO1xuICAgIG91dC5uZXh0KCcsJyk7XG4gIH07XG5cbiAgLypcblxuXG5cblxuICAgKi9cbiAgY29uc3QgcmVjdXIgPSByYXdUcmVlID0+IHtcbiAgICBpZiAoIWlzT2JqZWN0KHJhd1RyZWUpKSB7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIG91dC5uZXh0KHF1b3RlKHJhd1RyZWUpKTtcbiAgICB9XG4gICAgLy9cbiAgICBhc3NlcnQudHlwZW9mKHJhd1RyZWUsICdvYmplY3QnKTtcbiAgICBhc3NlcnQocmF3VHJlZSAhPT0gbnVsbCk7XG4gICAgaWYgKFFDTEFTUyBpbiByYXdUcmVlKSB7XG4gICAgICBjb25zdCBxY2xhc3MgPSByYXdUcmVlW1FDTEFTU107XG4gICAgICBhc3NlcnQudHlwZW9mKHFjbGFzcywgJ3N0cmluZycpO1xuICAgICAgYXNzZXJ0KCFpc0FycmF5KHJhd1RyZWUpKTtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIHN3aXRjaCAocmF3VHJlZVsnQHFjbGFzcyddKSB7XG4gICAgICAgIC8vXG4gICAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICAgIGNhc2UgJ05hTic6XG4gICAgICAgIGNhc2UgJ0luZmluaXR5JzpcbiAgICAgICAgY2FzZSAnLUluZmluaXR5Jzoge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgcmV0dXJuIG91dC5uZXh0KHFjbGFzcyk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICAgIGNvbnN0IHsgZGlnaXRzIH0gPSByYXdUcmVlO1xuICAgICAgICAgIGFzc2VydC50eXBlb2YoZGlnaXRzLCAnc3RyaW5nJyk7XG4gICAgICAgICAgcmV0dXJuIG91dC5uZXh0KGAke0JpZ0ludChkaWdpdHMpfW5gKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdAQGFzeW5jSXRlcmF0b3InOiB7XG4gICAgICAgICAgLy9cbiAgICAgICAgICByZXR1cm4gb3V0Lm5leHQoJ1N5bWJvbC5hc3luY0l0ZXJhdG9yJyk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnc3ltYm9sJzoge1xuICAgICAgICAgIGNvbnN0IHsgbmFtZSB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBhc3NlcnQudHlwZW9mKG5hbWUsICdzdHJpbmcnKTtcbiAgICAgICAgICBjb25zdCBzeW0gPSBwYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG4gICAgICAgICAgYXNzZXJ0LnR5cGVvZihzeW0sICdzeW1ib2wnKTtcbiAgICAgICAgICBjb25zdCByZWdpc3RlcmVkTmFtZSA9IFN5bWJvbC5rZXlGb3Ioc3ltKTtcbiAgICAgICAgICBpZiAocmVnaXN0ZXJlZE5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBBdEF0UHJlZml4UGF0dGVybi5leGVjKG5hbWUpO1xuICAgICAgICAgICAgYXNzZXJ0KG1hdGNoICE9PSBudWxsKTtcbiAgICAgICAgICAgIGNvbnN0IHN1ZmZpeCA9IG1hdGNoWzFdO1xuICAgICAgICAgICAgYXNzZXJ0KFN5bWJvbFtzdWZmaXhdID09PSBzeW0pO1xuICAgICAgICAgICAgYXNzZXJ0KGlkZW50UGF0dGVybi50ZXN0KHN1ZmZpeCkpO1xuICAgICAgICAgICAgcmV0dXJuIG91dC5uZXh0KGBTeW1ib2wuJHtzdWZmaXh9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvdXQubmV4dChgU3ltYm9sLmZvcigke3F1b3RlKHJlZ2lzdGVyZWROYW1lKX0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndGFnZ2VkJzoge1xuICAgICAgICAgIGNvbnN0IHsgdGFnLCBwYXlsb2FkIH0gPSByYXdUcmVlO1xuICAgICAgICAgIG91dC5uZXh0KGBtYWtlVGFnZ2VkKCR7cXVvdGUodGFnKX0sYCk7XG4gICAgICAgICAgZGVjb2RlKHBheWxvYWQpO1xuICAgICAgICAgIHJldHVybiBvdXQubmV4dCgnKScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnc2xvdCc6IHtcbiAgICAgICAgICBsZXQgeyBpZmFjZSB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IE51bWJlcihOYXQocmF3VHJlZS5pbmRleCkpO1xuICAgICAgICAgIGNvbnN0IG5lc3RlZFJlbmRlciA9IGFyZyA9PiB7XG4gICAgICAgICAgICBjb25zdCBvbGRPdXQgPSBvdXQ7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBvdXQgPSBtYWtlTm9JbmRlbnRlcigpO1xuICAgICAgICAgICAgICBkZWNvZGUoYXJnKTtcbiAgICAgICAgICAgICAgcmV0dXJuIG91dC5kb25lKCk7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICBvdXQgPSBvbGRPdXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoaW5kZXggPCBzbG90cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHNsb3QgPSBuZXN0ZWRSZW5kZXIoc2xvdHNbaW5kZXhdKTtcbiAgICAgICAgICAgIGlmIChpZmFjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHJldHVybiBvdXQubmV4dChgc2xvdFRvVmFsKCR7c2xvdH0pYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZmFjZSA9IG5lc3RlZFJlbmRlcihpZmFjZSk7XG4gICAgICAgICAgICByZXR1cm4gb3V0Lm5leHQoYHNsb3RUb1ZhbCgke3Nsb3R9LCR7aWZhY2V9KWApO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaWZhY2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIG91dC5uZXh0KGBzbG90KCR7aW5kZXh9KWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZmFjZSA9IG5lc3RlZFJlbmRlcihpZmFjZSk7XG4gICAgICAgICAgcmV0dXJuIG91dC5uZXh0KGBzbG90KCR7aW5kZXh9LCR7aWZhY2V9KWApO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnaGlsYmVydCc6IHtcbiAgICAgICAgICBjb25zdCB7IG9yaWdpbmFsLCByZXN0IH0gPSByYXdUcmVlO1xuICAgICAgICAgIG91dC5vcGVuKCd7Jyk7XG4gICAgICAgICAgZGVjb2RlUHJvcGVydHkoUUNMQVNTLCBvcmlnaW5hbCk7XG4gICAgICAgICAgaWYgKCdyZXN0JyBpbiByYXdUcmVlKSB7XG4gICAgICAgICAgICBhc3NlcnQudHlwZW9mKHJlc3QsICdvYmplY3QnKTtcbiAgICAgICAgICAgIGFzc2VydChyZXN0ICE9PSBudWxsKTtcbiAgICAgICAgICAgIGNvbnN0IG5hbWVzID0gb3duS2V5cyhyZXN0KTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRmFpbGBQcm9wZXJ0eSBuYW1lICR7cShcbiAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgKX0gb2YgJHtyZXN0fSBtdXN0IGJlIGEgc3RyaW5nYDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBkZWNvZGVQcm9wZXJ0eShuYW1lLCByZXN0W25hbWVdKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG91dC5jbG9zZSgnfScpO1xuICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgICBjYXVzZSA9IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIGVycm9ycyA9IHVuZGVmaW5lZCxcbiAgICAgICAgICB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBjYXVzZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICBGYWlsYGVycm9yIGNhdXNlIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gbWFyc2hhbC1qdXN0aW5gO1xuICAgICAgICAgIG5hbWUgIT09IGBBZ2dyZWdhdGVFcnJvcmAgfHxcbiAgICAgICAgICAgIEZhaWxgQWdncmVnYXRlRXJyb3Igbm90IHlldCBpbXBsZW1lbnRlZCBpbiBtYXJzaGFsLWp1c3RpbmA7XG4gICAgICAgICAgZXJyb3JzID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIEZhaWxgZXJyb3IgZXJyb3JzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgaW4gbWFyc2hhbC1qdXN0aW5gO1xuICAgICAgICAgIHJldHVybiBvdXQubmV4dChgJHtuYW1lfSgke3F1b3RlKG1lc3NhZ2UpfSlgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICB0aHJvdyBhc3NlcnQuZmFpbChcbiAgICAgICAgICAgIFhgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLFxuICAgICAgICAgICAgVHlwZUVycm9yLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkocmF3VHJlZSkpIHtcbiAgICAgIGNvbnN0IHsgbGVuZ3RoIH0gPSByYXdUcmVlO1xuICAgICAgaWYgKGxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gb3V0Lm5leHQoJ1tdJyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXQub3BlbignWycpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgICAgb3V0LmxpbmUoKTtcbiAgICAgICAgICBkZWNvZGUocmF3VHJlZVtpXSk7XG4gICAgICAgICAgb3V0Lm5leHQoJywnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gb3V0LmNsb3NlKCddJyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3QgbmFtZXMgPSAvKiAgICAgICAgICAgICAgICAgICAqLyAob3duS2V5cyhyYXdUcmVlKSk7XG4gICAgICBpZiAobmFtZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBvdXQubmV4dCgne30nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dC5vcGVuKCd7Jyk7XG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgICAgIGRlY29kZVByb3BlcnR5KG5hbWUsIHJhd1RyZWVbbmFtZV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXQuY2xvc2UoJ30nKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHByZXBhcmUoZW5jb2RpbmcpO1xuICBkZWNvZGUoZW5jb2RpbmcpO1xuICByZXR1cm4gb3V0LmRvbmUoKTtcbn07JGjNj19vbmNlLmRlY29kZVRvSnVzdGluKGRlY29kZVRvSnVzdGluKTtcbmhhcmRlbihkZWNvZGVUb0p1c3Rpbik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWNvZGVUb0p1c3RpbiI6WyJkZWNvZGVUb0p1c3RpbiJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC+IqcbSgcAAEoHAAAtAAAAQGVuZG8vbWFyc2hhbC12MS42LjQvc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIi4vbWFyc2hhbC5qcyJdLCJleHBvcnRzIjpbInBhcnNlIiwic3RyaW5naWZ5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxtYWtlTWFyc2hhbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL21hcnNoYWwuanNcIiwgW1tcIm1ha2VNYXJzaGFsXCIsWyRozY9fYSA9PiAobWFrZU1hcnNoYWwgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbmNvbnN0IHsgZnJlZXplIH0gPSBPYmplY3Q7XG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgZG9Ob3RDb252ZXJ0VmFsVG9TbG90ID0gdmFsID0+XG4gIEZhaWxgTWFyc2hhbCdzIHN0cmluZ2lmeSByZWplY3RzIHByZXNlbmNlcyBhbmQgcHJvbWlzZXMgJHt2YWx9YDtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBkb05vdENvbnZlcnRTbG90VG9WYWwgPSAoc2xvdCwgX2lmYWNlKSA9PlxuICBGYWlsYE1hcnNoYWwncyBwYXJzZSBtdXN0IG5vdCBlbmNvZGUgYW55IHNsb3RzICR7c2xvdH1gO1xuXG5jb25zdCBiYWRBcnJheUhhbmRsZXIgPSBoYXJkZW4oe1xuICBnZXQ6IChfdGFyZ2V0LCBuYW1lLCBfcmVjZWl2ZXIpID0+IHtcbiAgICBpZiAobmFtZSA9PT0gJ2xlbmd0aCcpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICAvL1xuICAgIHRocm93IEZhaWxgTWFyc2hhbCdzIHBhcnNlIG11c3Qgbm90IGVuY29kZSBhbnkgc2xvdCBwb3NpdGlvbnMgJHtuYW1lfWA7XG4gIH0sXG59KTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBhcnJheVRhcmdldCA9IGZyZWV6ZSgvKiAgICAgICAgICAgICAgICAqLyAoW10pKTtcbmNvbnN0IGJhZEFycmF5ID0gbmV3IFByb3h5KGFycmF5VGFyZ2V0LCBiYWRBcnJheUhhbmRsZXIpO1xuXG5jb25zdCB7IHNlcmlhbGl6ZSwgdW5zZXJpYWxpemUgfSA9IG1ha2VNYXJzaGFsKFxuICBkb05vdENvbnZlcnRWYWxUb1Nsb3QsXG4gIGRvTm90Q29udmVydFNsb3RUb1ZhbCxcbiAge1xuICAgIGVycm9yVGFnZ2luZzogJ29mZicsXG4gICAgLy9cbiAgICBzZXJpYWxpemVCb2R5Rm9ybWF0OiAnY2FwZGF0YScsXG4gIH0sXG4pO1xuXG4vKlxuXG5cbiAqL1xuY29uc3Qgc3RyaW5naWZ5ID0gdmFsID0+IHNlcmlhbGl6ZSh2YWwpLmJvZHk7JGjNj19vbmNlLnN0cmluZ2lmeShzdHJpbmdpZnkpO1xuaGFyZGVuKHN0cmluZ2lmeSk7XG5cbi8qXG5cblxuICovXG5jb25zdCBwYXJzZSA9IHN0ciA9PlxuICB1bnNlcmlhbGl6ZShcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBmcmVlemUoe1xuICAgICAgYm9keTogc3RyLFxuICAgICAgc2xvdHM6IGJhZEFycmF5LFxuICAgIH0pLFxuICApOyRozY9fb25jZS5wYXJzZShwYXJzZSk7XG5oYXJkZW4ocGFyc2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic3RyaW5naWZ5IjpbInN0cmluZ2lmeSJdLCJwYXJzZSI6WyJwYXJzZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAJOiBuYS8AAGEvAAAjAAAAQGVuZG8vbWFyc2hhbC12MS42LjQvc3JjL21hcnNoYWwuanN7ImltcG9ydHMiOlsiQGVuZG8vbmF0IiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIiwiLi9lbmNvZGVUb0NhcERhdGEuanMiLCIuL2VuY29kZVRvU21hbGxjYXBzLmpzIl0sImV4cG9ydHMiOlsibWFrZU1hcnNoYWwiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBOYXQsYXNzZXJ0UGFzc2FibGUsZ2V0SW50ZXJmYWNlT2YsZ2V0RXJyb3JDb25zdHJ1Y3RvcixoYXNPd25Qcm9wZXJ0eU9mLHRvUGFzc2FibGVFcnJvcixYLEZhaWwscSxtYWtlRXJyb3IsYW5ub3RhdGVFcnJvcixvYmplY3RNYXAsUUNMQVNTLG1ha2VFbmNvZGVUb0NhcERhdGEsbWFrZURlY29kZUZyb21DYXBEYXRhLG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzLG1ha2VFbmNvZGVUb1NtYWxsY2FwczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsWyRozY9fYSA9PiAoTmF0ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiYXNzZXJ0UGFzc2FibGVcIixbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRozY9fYSldXSxbXCJnZXRJbnRlcmZhY2VPZlwiLFskaM2PX2EgPT4gKGdldEludGVyZmFjZU9mID0gJGjNj19hKV1dLFtcImdldEVycm9yQ29uc3RydWN0b3JcIixbJGjNj19hID0+IChnZXRFcnJvckNvbnN0cnVjdG9yID0gJGjNj19hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIixbJGjNj19hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjNj19hKV1dLFtcInRvUGFzc2FibGVFcnJvclwiLFskaM2PX2EgPT4gKHRvUGFzc2FibGVFcnJvciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wibWFrZUVycm9yXCIsWyRozY9fYSA9PiAobWFrZUVycm9yID0gJGjNj19hKV1dLFtcImFubm90YXRlRXJyb3JcIixbJGjNj19hID0+IChhbm5vdGF0ZUVycm9yID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanNcIiwgW1tcIm9iamVjdE1hcFwiLFskaM2PX2EgPT4gKG9iamVjdE1hcCA9ICRozY9fYSldXV1dLFtcIi4vZW5jb2RlVG9DYXBEYXRhLmpzXCIsIFtbXCJRQ0xBU1NcIixbJGjNj19hID0+IChRQ0xBU1MgPSAkaM2PX2EpXV0sW1wibWFrZUVuY29kZVRvQ2FwRGF0YVwiLFskaM2PX2EgPT4gKG1ha2VFbmNvZGVUb0NhcERhdGEgPSAkaM2PX2EpXV0sW1wibWFrZURlY29kZUZyb21DYXBEYXRhXCIsWyRozY9fYSA9PiAobWFrZURlY29kZUZyb21DYXBEYXRhID0gJGjNj19hKV1dXV0sW1wiLi9lbmNvZGVUb1NtYWxsY2Fwcy5qc1wiLCBbW1wibWFrZURlY29kZUZyb21TbWFsbGNhcHNcIixbJGjNj19hID0+IChtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyA9ICRozY9fYSldXSxbXCJtYWtlRW5jb2RlVG9TbWFsbGNhcHNcIixbJGjNj19hID0+IChtYWtlRW5jb2RlVG9TbWFsbGNhcHMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG5cblxuXG4gKi9cblxuY29uc3QgeyBkZWZpbmVQcm9wZXJ0aWVzIH0gPSBPYmplY3Q7XG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbmNvbnN0IGRlZmF1bHRWYWxUb1Nsb3RGbiA9IHggPT4geDtcbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgZGVmYXVsdFNsb3RUb1ZhbEZuID0gKHgsIF8pID0+IHg7XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VNYXJzaGFsID0gKFxuICBjb252ZXJ0VmFsVG9TbG90ID0gZGVmYXVsdFZhbFRvU2xvdEZuLFxuICBjb252ZXJ0U2xvdFRvVmFsID0gZGVmYXVsdFNsb3RUb1ZhbEZuLFxuICB7XG4gICAgZXJyb3JUYWdnaW5nID0gJ29uJyxcbiAgICBtYXJzaGFsTmFtZSA9ICdhbm9uLW1hcnNoYWwnLFxuICAgIC8vXG4gICAgLy9cbiAgICBlcnJvcklkTnVtID0gMTAwMDAsXG4gICAgLy9cbiAgICAvL1xuICAgIG1hcnNoYWxTYXZlRXJyb3IgPSBlcnIgPT5cbiAgICAgIGNvbnNvbGUubG9nKCdUZW1wb3JhcnkgbG9nZ2luZyBvZiBzZW50IGVycm9yJywgZXJyKSxcbiAgICAvL1xuICAgIC8vXG4gICAgc2VyaWFsaXplQm9keUZvcm1hdCA9ICdjYXBkYXRhJyxcbiAgfSA9IHt9LFxuKSA9PiB7XG4gIGFzc2VydC50eXBlb2YobWFyc2hhbE5hbWUsICdzdHJpbmcnKTtcbiAgZXJyb3JUYWdnaW5nID09PSAnb24nIHx8XG4gICAgZXJyb3JUYWdnaW5nID09PSAnb2ZmJyB8fFxuICAgIEZhaWxgVGhlIGVycm9yVGFnZ2luZyBvcHRpb24gY2FuIG9ubHkgYmUgXCJvblwiIG9yIFwib2ZmXCIgJHtlcnJvclRhZ2dpbmd9YDtcbiAgY29uc3QgbmV4dEVycm9ySWQgPSAoKSA9PiB7XG4gICAgZXJyb3JJZE51bSArPSAxO1xuICAgIHJldHVybiBgZXJyb3I6JHttYXJzaGFsTmFtZX0jJHtlcnJvcklkTnVtfWA7XG4gIH07XG5cbiAgLypcblxuICAgKi9cbiAgY29uc3QgdG9DYXBEYXRhID0gcm9vdCA9PiB7XG4gICAgY29uc3Qgc2xvdHMgPSBbXTtcbiAgICAvL1xuICAgIGNvbnN0IHNsb3RNYXAgPSBuZXcgTWFwKCk7XG5cbiAgICAvKlxuXG5cbiAgICAgKi9cbiAgICBjb25zdCBlbmNvZGVTbG90Q29tbW9uID0gcGFzc2FibGUgPT4ge1xuICAgICAgbGV0IGluZGV4ID0gc2xvdE1hcC5nZXQocGFzc2FibGUpO1xuICAgICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLy9cbiAgICAgICAgYXNzZXJ0LnR5cGVvZihpbmRleCwgJ251bWJlcicpO1xuICAgICAgICByZXR1cm4gaGFyZGVuKHsgaW5kZXgsIHJlcGVhdDogdHJ1ZSB9KTtcbiAgICAgIH1cblxuICAgICAgaW5kZXggPSBzbG90cy5sZW5ndGg7XG4gICAgICBjb25zdCBzbG90ID0gY29udmVydFZhbFRvU2xvdChwYXNzYWJsZSk7XG4gICAgICBzbG90cy5wdXNoKHNsb3QpO1xuICAgICAgc2xvdE1hcC5zZXQocGFzc2FibGUsIGluZGV4KTtcbiAgICAgIHJldHVybiBoYXJkZW4oeyBpbmRleCwgcmVwZWF0OiBmYWxzZSB9KTtcbiAgICB9O1xuXG4gICAgLypcblxuXG5cblxuXG5cblxuXG4gICAgICovXG4gICAgY29uc3QgZW5jb2RlRXJyb3JDb21tb24gPSAoZXJyLCBlbmNvZGVSZWN1cikgPT4ge1xuICAgICAgY29uc3QgbWVzc2FnZSA9IGVuY29kZVJlY3VyKGAke2Vyci5tZXNzYWdlfWApO1xuICAgICAgYXNzZXJ0LnR5cGVvZihtZXNzYWdlLCAnc3RyaW5nJyk7XG4gICAgICBjb25zdCBuYW1lID0gZW5jb2RlUmVjdXIoYCR7ZXJyLm5hbWV9YCk7XG4gICAgICBhc3NlcnQudHlwZW9mKG5hbWUsICdzdHJpbmcnKTtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIGlmIChlcnJvclRhZ2dpbmcgPT09ICdvbicpIHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgZXJyb3JJZCA9IGVuY29kZVJlY3VyKG5leHRFcnJvcklkKCkpO1xuICAgICAgICBhc3NlcnQudHlwZW9mKGVycm9ySWQsICdzdHJpbmcnKTtcbiAgICAgICAgYW5ub3RhdGVFcnJvcihlcnIsIFhgU2VudCBhcyAke2Vycm9ySWR9YCk7XG4gICAgICAgIG1hcnNoYWxTYXZlRXJyb3IoZXJyKTtcbiAgICAgICAgcmV0dXJuIGhhcmRlbih7IGVycm9ySWQsIG1lc3NhZ2UsIG5hbWUgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gaGFyZGVuKHsgbWVzc2FnZSwgbmFtZSB9KTtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKHNlcmlhbGl6ZUJvZHlGb3JtYXQgPT09ICdjYXBkYXRhJykge1xuICAgICAgLypcblxuXG5cbiAgICAgICAqL1xuICAgICAgY29uc3QgZW5jb2RlU2xvdFRvQ2FwRGF0YSA9IChwYXNzYWJsZSwgaWZhY2UgPSB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgY29uc3QgeyBpbmRleCwgcmVwZWF0IH0gPSBlbmNvZGVTbG90Q29tbW9uKHBhc3NhYmxlKTtcblxuICAgICAgICBpZiAocmVwZWF0ID09PSB0cnVlIHx8IGlmYWNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgW1FDTEFTU106ICdzbG90JywgaW5kZXggfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGhhcmRlbih7IFtRQ0xBU1NdOiAnc2xvdCcsIGlmYWNlLCBpbmRleCB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgICBjb25zdCBlbmNvZGVSZW1vdGFibGVUb0NhcERhdGEgPSAodmFsLCBfZW5jb2RlUmVjdXIpID0+XG4gICAgICAgIGVuY29kZVNsb3RUb0NhcERhdGEodmFsLCBnZXRJbnRlcmZhY2VPZih2YWwpKTtcblxuICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgY29uc3QgZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YSA9IChwcm9taXNlLCBfZW5jb2RlUmVjdXIpID0+XG4gICAgICAgIGVuY29kZVNsb3RUb0NhcERhdGEocHJvbWlzZSk7XG5cbiAgICAgIC8qXG5cblxuXG5cblxuXG5cblxuICAgICAgICovXG4gICAgICBjb25zdCBlbmNvZGVFcnJvclRvQ2FwRGF0YSA9IChlcnIsIGVuY29kZVJlY3VyKSA9PiB7XG4gICAgICAgIGNvbnN0IGVyckRhdGEgPSBlbmNvZGVFcnJvckNvbW1vbihlcnIsIGVuY29kZVJlY3VyKTtcbiAgICAgICAgcmV0dXJuIGhhcmRlbih7IFtRQ0xBU1NdOiAnZXJyb3InLCAuLi5lcnJEYXRhIH0pO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgZW5jb2RlVG9DYXBEYXRhID0gbWFrZUVuY29kZVRvQ2FwRGF0YSh7XG4gICAgICAgIGVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSxcbiAgICAgICAgZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YSxcbiAgICAgICAgZW5jb2RlRXJyb3JUb0NhcERhdGEsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZW5jb2RlZCA9IGVuY29kZVRvQ2FwRGF0YShyb290KTtcbiAgICAgIGNvbnN0IGJvZHkgPSBKU09OLnN0cmluZ2lmeShlbmNvZGVkKTtcbiAgICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgICBib2R5LFxuICAgICAgICBzbG90cyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSBpZiAoc2VyaWFsaXplQm9keUZvcm1hdCA9PT0gJ3NtYWxsY2FwcycpIHtcbiAgICAgIC8qXG5cblxuXG5cbiAgICAgICAqL1xuICAgICAgY29uc3QgZW5jb2RlU2xvdFRvU21hbGxjYXBzID0gKHByZWZpeCwgcGFzc2FibGUsIGlmYWNlID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgICAgIGNvbnN0IHsgaW5kZXgsIHJlcGVhdCB9ID0gZW5jb2RlU2xvdENvbW1vbihwYXNzYWJsZSk7XG5cbiAgICAgICAgLy9cbiAgICAgICAgaWYgKHJlcGVhdCA9PT0gdHJ1ZSB8fCBpZmFjZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgcmV0dXJuIGAke3ByZWZpeH0ke2luZGV4fWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke3ByZWZpeH0ke2luZGV4fS4ke2lmYWNlfWA7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBlbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyA9IChyZW1vdGFibGUsIF9lbmNvZGVSZWN1cikgPT5cbiAgICAgICAgZW5jb2RlU2xvdFRvU21hbGxjYXBzKCckJywgcmVtb3RhYmxlLCBnZXRJbnRlcmZhY2VPZihyZW1vdGFibGUpKTtcblxuICAgICAgY29uc3QgZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzID0gKHByb21pc2UsIF9lbmNvZGVSZWN1cikgPT5cbiAgICAgICAgZW5jb2RlU2xvdFRvU21hbGxjYXBzKCcmJywgcHJvbWlzZSk7XG5cbiAgICAgIGNvbnN0IGVuY29kZUVycm9yVG9TbWFsbGNhcHMgPSAoZXJyLCBlbmNvZGVSZWN1cikgPT4ge1xuICAgICAgICBjb25zdCBlcnJEYXRhID0gZW5jb2RlRXJyb3JDb21tb24oZXJyLCBlbmNvZGVSZWN1cik7XG4gICAgICAgIGNvbnN0IHsgbWVzc2FnZSwgLi4ucmVzdCB9ID0gZXJyRGF0YTtcbiAgICAgICAgcmV0dXJuIGhhcmRlbih7ICcjZXJyb3InOiBtZXNzYWdlLCAuLi5yZXN0IH0pO1xuICAgICAgfTtcblxuICAgICAgY29uc3QgZW5jb2RlVG9TbWFsbGNhcHMgPSBtYWtlRW5jb2RlVG9TbWFsbGNhcHMoe1xuICAgICAgICBlbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyxcbiAgICAgICAgZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzLFxuICAgICAgICBlbmNvZGVFcnJvclRvU21hbGxjYXBzLFxuICAgICAgfSk7XG5cbiAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVUb1NtYWxsY2Fwcyhyb290KTtcbiAgICAgIGNvbnN0IHNtYWxsY2Fwc0JvZHkgPSBKU09OLnN0cmluZ2lmeShlbmNvZGVkKTtcbiAgICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBib2R5OiBgIyR7c21hbGxjYXBzQm9keX1gLFxuICAgICAgICBzbG90cyxcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvL1xuICAgICAgdGhyb3cgRmFpbGBVbnJlY29nbml6ZWQgc2VyaWFsaXplQm9keUZvcm1hdDogJHtxKHNlcmlhbGl6ZUJvZHlGb3JtYXQpfWA7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IG1ha2VGdWxsUmV2aXZlID0gc2xvdHMgPT4ge1xuICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgY29uc3QgdmFsTWFwID0gbmV3IE1hcCgpO1xuXG4gICAgLypcblxuXG4gICAgICovXG4gICAgY29uc3QgZGVjb2RlU2xvdENvbW1vbiA9IHNsb3REYXRhID0+IHtcbiAgICAgIGNvbnN0IHsgaWZhY2UgPSB1bmRlZmluZWQsIGluZGV4LCAuLi5yZXN0IH0gPSBzbG90RGF0YTtcbiAgICAgIG93bktleXMocmVzdCkubGVuZ3RoID09PSAwIHx8XG4gICAgICAgIEZhaWxgdW5leHBlY3RlZCBlbmNvZGVkIHNsb3QgcHJvcGVydGllcyAke3Eob3duS2V5cyhyZXN0KSl9YDtcbiAgICAgIGNvbnN0IGV4dGFudCA9IHZhbE1hcC5nZXQoaW5kZXgpO1xuICAgICAgaWYgKGV4dGFudCkge1xuICAgICAgICByZXR1cm4gZXh0YW50O1xuICAgICAgfVxuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBjb25zdCBzbG90ID0gc2xvdHNbTnVtYmVyKE5hdChpbmRleCkpXTtcbiAgICAgIGNvbnN0IHZhbCA9IGNvbnZlcnRTbG90VG9WYWwoc2xvdCwgaWZhY2UpO1xuICAgICAgdmFsTWFwLnNldChpbmRleCwgdmFsKTtcbiAgICAgIHJldHVybiB2YWw7XG4gICAgfTtcblxuICAgIC8qXG5cblxuXG5cblxuXG5cblxuXG4gICAgICovXG4gICAgY29uc3QgZGVjb2RlRXJyb3JDb21tb24gPSAoZXJyRGF0YSwgZGVjb2RlUmVjdXIpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZXJyb3JJZCA9IHVuZGVmaW5lZCxcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgY2F1c2UgPSB1bmRlZmluZWQsXG4gICAgICAgIGVycm9ycyA9IHVuZGVmaW5lZCxcbiAgICAgICAgLi4ucmVzdFxuICAgICAgfSA9IGVyckRhdGE7XG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3QgZE5hbWUgPSBkZWNvZGVSZWN1cihuYW1lKTtcbiAgICAgIGNvbnN0IGRNZXNzYWdlID0gZGVjb2RlUmVjdXIobWVzc2FnZSk7XG4gICAgICAvL1xuICAgICAgY29uc3QgZEVycm9ySWQgPSAvKiAgICAgICAgICAgICAgICAgKi8gKGVycm9ySWQgJiYgZGVjb2RlUmVjdXIoZXJyb3JJZCkpO1xuICAgICAgaWYgKHR5cGVvZiBkTmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgRmFpbGBpbnZhbGlkIGVycm9yIG5hbWUgdHlwZW9mICR7cSh0eXBlb2YgZE5hbWUpfWA7XG4gICAgICB9XG4gICAgICBpZiAodHlwZW9mIGRNZXNzYWdlICE9PSAnc3RyaW5nJykge1xuICAgICAgICB0aHJvdyBGYWlsYGludmFsaWQgZXJyb3IgbWVzc2FnZSB0eXBlb2YgJHtxKHR5cGVvZiBkTWVzc2FnZSl9YDtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGVyckNvbnN0cnVjdG9yID0gZ2V0RXJyb3JDb25zdHJ1Y3RvcihkTmFtZSkgfHwgRXJyb3I7XG4gICAgICBjb25zdCBlcnJvck5hbWUgPVxuICAgICAgICBkRXJyb3JJZCA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgPyBgUmVtb3RlJHtlcnJDb25zdHJ1Y3Rvci5uYW1lfWBcbiAgICAgICAgICA6IGBSZW1vdGUke2VyckNvbnN0cnVjdG9yLm5hbWV9KCR7ZEVycm9ySWR9KWA7XG4gICAgICBjb25zdCBvcHRpb25zID0ge1xuICAgICAgICBlcnJvck5hbWUsXG4gICAgICAgIHNhbml0aXplOiBmYWxzZSxcbiAgICAgIH07XG4gICAgICBpZiAoY2F1c2UpIHtcbiAgICAgICAgb3B0aW9ucy5jYXVzZSA9IGRlY29kZVJlY3VyKGNhdXNlKTtcbiAgICAgIH1cbiAgICAgIGlmIChlcnJvcnMpIHtcbiAgICAgICAgb3B0aW9ucy5lcnJvcnMgPSBkZWNvZGVSZWN1cihlcnJvcnMpO1xuICAgICAgfVxuICAgICAgY29uc3QgcmF3RXJyb3IgPSBtYWtlRXJyb3IoZE1lc3NhZ2UsIGVyckNvbnN0cnVjdG9yLCBvcHRpb25zKTtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIC8vXG4gICAgICBjb25zdCBkZXNjcyA9IG9iamVjdE1hcChyZXN0LCBkYXRhID0+ICh7XG4gICAgICAgIHZhbHVlOiBkZWNvZGVSZWN1cihkYXRhKSxcbiAgICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiBmYWxzZSxcbiAgICAgIH0pKTtcbiAgICAgIGRlZmluZVByb3BlcnRpZXMocmF3RXJyb3IsIGRlc2NzKTtcbiAgICAgIGhhcmRlbihyYXdFcnJvcik7XG4gICAgICByZXR1cm4gdG9QYXNzYWJsZUVycm9yKHJhd0Vycm9yKTtcbiAgICB9O1xuXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IGRlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhID0gKHJhd1RyZWUsIF9kZWNvZGVSZWN1cikgPT4ge1xuICAgICAgY29uc3QgeyBbUUNMQVNTXTogXywgLi4uc2xvdERhdGEgfSA9IHJhd1RyZWU7XG4gICAgICByZXR1cm4gZGVjb2RlU2xvdENvbW1vbihzbG90RGF0YSk7XG4gICAgfTtcblxuICAgIGNvbnN0IGRlY29kZUVycm9yRnJvbUNhcERhdGEgPSAocmF3VHJlZSwgZGVjb2RlUmVjdXIpID0+IHtcbiAgICAgIGNvbnN0IHsgW1FDTEFTU106IF8sIC4uLmVyckRhdGEgfSA9IHJhd1RyZWU7XG4gICAgICByZXR1cm4gZGVjb2RlRXJyb3JDb21tb24oZXJyRGF0YSwgZGVjb2RlUmVjdXIpO1xuICAgIH07XG5cbiAgICBjb25zdCByZXZpdmVGcm9tQ2FwRGF0YSA9IG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSh7XG4gICAgICBkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YTogZGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG4gICAgICBkZWNvZGVQcm9taXNlRnJvbUNhcERhdGE6IGRlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuICAgICAgZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YSxcbiAgICB9KTtcblxuICAgIGNvbnN0IG1ha2VEZWNvZGVTbG90RnJvbVNtYWxsY2FwcyA9IHByZWZpeCA9PiB7XG4gICAgICAvKlxuXG5cblxuICAgICAgICovXG4gICAgICByZXR1cm4gKHN0cmluZ0VuY29kaW5nLCBfZGVjb2RlUmVjdXIpID0+IHtcbiAgICAgICAgYXNzZXJ0KHN0cmluZ0VuY29kaW5nLmNoYXJBdCgwKSA9PT0gcHJlZml4KTtcbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgaSA9IHN0cmluZ0VuY29kaW5nLmluZGV4T2YoJy4nKTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBOdW1iZXIoc3RyaW5nRW5jb2Rpbmcuc2xpY2UoMSwgaSA8IDAgPyB1bmRlZmluZWQgOiBpKSk7XG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IGlmYWNlID0gaSA8IDAgPyB1bmRlZmluZWQgOiBzdHJpbmdFbmNvZGluZy5zbGljZShpICsgMSk7XG4gICAgICAgIHJldHVybiBkZWNvZGVTbG90Q29tbW9uKHsgaWZhY2UsIGluZGV4IH0pO1xuICAgICAgfTtcbiAgICB9O1xuICAgIGNvbnN0IGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMgPSBtYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHMoJyQnKTtcbiAgICBjb25zdCBkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyA9IG1ha2VEZWNvZGVTbG90RnJvbVNtYWxsY2FwcygnJicpO1xuXG4gICAgY29uc3QgZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzID0gKGVuY29kaW5nLCBkZWNvZGVSZWN1cikgPT4ge1xuICAgICAgY29uc3QgeyAnI2Vycm9yJzogbWVzc2FnZSwgLi4ucmVzdEVyckRhdGEgfSA9IGVuY29kaW5nO1xuICAgICAgIWhhc093blByb3BlcnR5T2YocmVzdEVyckRhdGEsICdtZXNzYWdlJykgfHxcbiAgICAgICAgRmFpbGB1bmV4cGVjdGVkIGVuY29kZWQgZXJyb3IgcHJvcGVydHkgJHtxKCdtZXNzYWdlJyl9YDtcbiAgICAgIHJldHVybiBkZWNvZGVFcnJvckNvbW1vbih7IG1lc3NhZ2UsIC4uLnJlc3RFcnJEYXRhIH0sIGRlY29kZVJlY3VyKTtcbiAgICB9O1xuXG4gICAgY29uc3QgcmV2aXZlRnJvbVNtYWxsY2FwcyA9IG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzKHtcbiAgICAgIC8vXG4gICAgICBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzLFxuICAgICAgLy9cbiAgICAgIGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzLFxuICAgICAgZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGhhcmRlbih7IHJldml2ZUZyb21DYXBEYXRhLCByZXZpdmVGcm9tU21hbGxjYXBzIH0pO1xuICB9O1xuXG4gIC8qXG5cbiAgICovXG4gIGNvbnN0IGZyb21DYXBEYXRhID0gZGF0YSA9PiB7XG4gICAgY29uc3QgeyBib2R5LCBzbG90cyB9ID0gZGF0YTtcbiAgICB0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycgfHxcbiAgICAgIEZhaWxgdW5zZXJpYWxpemUoKSBnaXZlbiBub24tY2FwZGF0YSAoLmJvZHkgaXMgJHtib2R5fSwgbm90IHN0cmluZylgO1xuICAgIGlzQXJyYXkoZGF0YS5zbG90cykgfHxcbiAgICAgIEZhaWxgdW5zZXJpYWxpemUoKSBnaXZlbiBub24tY2FwZGF0YSAoLnNsb3RzIGFyZSBub3QgQXJyYXkpYDtcbiAgICBjb25zdCB7IHJldml2ZUZyb21DYXBEYXRhLCByZXZpdmVGcm9tU21hbGxjYXBzIH0gPSBtYWtlRnVsbFJldml2ZShzbG90cyk7XG4gICAgbGV0IHJlc3VsdDtcbiAgICAvL1xuICAgIGlmIChib2R5LmNoYXJBdCgwKSA9PT0gJyMnKSB7XG4gICAgICBjb25zdCBzbWFsbGNhcHNCb2R5ID0gYm9keS5zbGljZSgxKTtcbiAgICAgIGNvbnN0IGVuY29kaW5nID0gaGFyZGVuKEpTT04ucGFyc2Uoc21hbGxjYXBzQm9keSkpO1xuICAgICAgcmVzdWx0ID0gaGFyZGVuKHJldml2ZUZyb21TbWFsbGNhcHMoZW5jb2RpbmcpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcmF3VHJlZSA9IGhhcmRlbihKU09OLnBhcnNlKGJvZHkpKTtcbiAgICAgIHJlc3VsdCA9IGhhcmRlbihyZXZpdmVGcm9tQ2FwRGF0YShyYXdUcmVlKSk7XG4gICAgfVxuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGFzc2VydFBhc3NhYmxlKHJlc3VsdCk7XG4gICAgcmV0dXJuIC8qICAgICAgICAgICAgICAgICAgICAgICovIChyZXN1bHQpO1xuICB9O1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIHRvQ2FwRGF0YSxcbiAgICBmcm9tQ2FwRGF0YSxcblxuICAgIC8vXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgICBzZXJpYWxpemU6IHRvQ2FwRGF0YSxcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gICAgdW5zZXJpYWxpemU6IGZyb21DYXBEYXRhLFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VNYXJzaGFsKG1ha2VNYXJzaGFsKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VNYXJzaGFsIjpbIm1ha2VNYXJzaGFsIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEqw1V3rLgAA6y4AACUAAABAZW5kby9tYXJzaGFsLXYxLjYuNC9zcmMvcmFua09yZGVyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9lcnJvcnMiLCIuL2VuY29kZVBhc3NhYmxlLmpzIl0sImV4cG9ydHMiOlsiRnVsbFJhbmtDb3ZlciIsImFzc2VydFJhbmtTb3J0ZWQiLCJjb21wYXJhdG9yTWlycm9ySW1hZ2UiLCJjb21wYXJlQW50aVJhbmsiLCJjb21wYXJlUmFuayIsImNvdmVyZWRFbnRyaWVzIiwiZ2V0SW5kZXhDb3ZlciIsImdldFBhc3NTdHlsZUNvdmVyIiwiaW50ZXJzZWN0UmFua0NvdmVycyIsImlzUmFua1NvcnRlZCIsIm1ha2VDb21wYXJhdG9yS2l0IiwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiLCJzb3J0QnlSYW5rIiwidHJpdmlhbENvbXBhcmF0b3IiLCJ1bmlvblJhbmtDb3ZlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBnZXRUYWcscGFzc1N0eWxlT2YsbmFtZUZvclBhc3NhYmxlU3ltYm9sLEZhaWwscSxwYXNzU3R5bGVQcmVmaXhlcyxyZWNvcmROYW1lcyxyZWNvcmRWYWx1ZXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiLi9lbmNvZGVQYXNzYWJsZS5qc1wiLCBbW1wicGFzc1N0eWxlUHJlZml4ZXNcIixbJGjNj19hID0+IChwYXNzU3R5bGVQcmVmaXhlcyA9ICRozY9fYSldXSxbXCJyZWNvcmROYW1lc1wiLFskaM2PX2EgPT4gKHJlY29yZE5hbWVzID0gJGjNj19hKV1dLFtcInJlY29yZFZhbHVlc1wiLFskaM2PX2EgPT4gKHJlY29yZFZhbHVlcyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cbi8qXG5cblxuICovXG5cbmNvbnN0IHsgZW50cmllcywgZnJvbUVudHJpZXMsIHNldFByb3RvdHlwZU9mLCBpcyB9ID0gT2JqZWN0O1xuXG4vKlxuXG5cblxuICovXG5cbi8qXG5cblxuXG4gKi9cblxuLypcblxuICovXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBzYW1lVmFsdWVaZXJvID0gKHgsIHkpID0+IHggPT09IHkgfHwgaXMoeCwgeSk7XG5cbiAgICAgICBjb25zdCB0cml2aWFsQ29tcGFyYXRvciA9IChsZWZ0LCByaWdodCkgPT5cbiAgLy9cbiAgbGVmdCA8IHJpZ2h0ID8gLTEgOiBsZWZ0ID09PSByaWdodCA/IDAgOiAxO1xuXG4vKlxuXG4gKi8kaM2PX29uY2UudHJpdmlhbENvbXBhcmF0b3IodHJpdmlhbENvbXBhcmF0b3IpO1xuXG5jb25zdCBwYXNzU3R5bGVSYW5rcyA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChcbiAgZnJvbUVudHJpZXMoXG4gICAgZW50cmllcyhwYXNzU3R5bGVQcmVmaXhlcylcbiAgICAgIC8vXG4gICAgICAuc29ydCgoW19sZWZ0U3R5bGUsIGxlZnRQcmVmaXhlc10sIFtfcmlnaHRTdHlsZSwgcmlnaHRQcmVmaXhlc10pID0+IHtcbiAgICAgICAgcmV0dXJuIHRyaXZpYWxDb21wYXJhdG9yKGxlZnRQcmVmaXhlcywgcmlnaHRQcmVmaXhlcyk7XG4gICAgICB9KVxuICAgICAgLm1hcCgoW3Bhc3NTdHlsZSwgcHJlZml4ZXNdLCBpbmRleCkgPT4ge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBwcmVmaXhlcyA9PT0gWy4uLnByZWZpeGVzXS5zb3J0KCkuam9pbignJykgfHxcbiAgICAgICAgICBGYWlsYHVuc29ydGVkIHByZWZpeGVzIGZvciBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9OiAke3EocHJlZml4ZXMpfWA7XG4gICAgICAgIGNvbnN0IGNvdmVyID0gW1xuICAgICAgICAgIHByZWZpeGVzLmNoYXJBdCgwKSxcbiAgICAgICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKHByZWZpeGVzLmNoYXJDb2RlQXQocHJlZml4ZXMubGVuZ3RoIC0gMSkgKyAxKSxcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIFtwYXNzU3R5bGUsIHsgaW5kZXgsIGNvdmVyIH1dO1xuICAgICAgfSksXG4gIClcbik7XG5zZXRQcm90b3R5cGVPZihwYXNzU3R5bGVSYW5rcywgbnVsbCk7XG5oYXJkZW4ocGFzc1N0eWxlUmFua3MpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0UGFzc1N0eWxlQ292ZXIgPSBwYXNzU3R5bGUgPT4gcGFzc1N0eWxlUmFua3NbcGFzc1N0eWxlXS5jb3ZlcjskaM2PX29uY2UuZ2V0UGFzc1N0eWxlQ292ZXIoZ2V0UGFzc1N0eWxlQ292ZXIpO1xuaGFyZGVuKGdldFBhc3NTdHlsZUNvdmVyKTtcblxuLypcblxuICovXG5jb25zdCBtZW1vT2ZTb3J0ZWQgPSBuZXcgV2Vha01hcCgpO1xuXG4vKlxuXG4gKi9cbmNvbnN0IGNvbXBhcmF0b3JNaXJyb3JJbWFnZXMgPSBuZXcgV2Vha01hcCgpO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlQ29tcGFyYXRvcktpdCA9IChjb21wYXJlUmVtb3RhYmxlcyA9IChfeCwgX3kpID0+IE5hTikgPT4ge1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBjb21wYXJhdG9yID0gKGxlZnQsIHJpZ2h0KSA9PiB7XG4gICAgaWYgKHNhbWVWYWx1ZVplcm8obGVmdCwgcmlnaHQpKSB7XG4gICAgICByZXR1cm4gMDtcbiAgICB9XG4gICAgY29uc3QgbGVmdFN0eWxlID0gcGFzc1N0eWxlT2YobGVmdCk7XG4gICAgY29uc3QgcmlnaHRTdHlsZSA9IHBhc3NTdHlsZU9mKHJpZ2h0KTtcbiAgICBpZiAobGVmdFN0eWxlICE9PSByaWdodFN0eWxlKSB7XG4gICAgICByZXR1cm4gdHJpdmlhbENvbXBhcmF0b3IoXG4gICAgICAgIHBhc3NTdHlsZVJhbmtzW2xlZnRTdHlsZV0uaW5kZXgsXG4gICAgICAgIHBhc3NTdHlsZVJhbmtzW3JpZ2h0U3R5bGVdLmluZGV4LFxuICAgICAgKTtcbiAgICB9XG4gICAgLypcblxuICAgICAqL1xuICAgIHN3aXRjaCAobGVmdFN0eWxlKSB7XG4gICAgICBjYXNlICdyZW1vdGFibGUnOiB7XG4gICAgICAgIHJldHVybiBjb21wYXJlUmVtb3RhYmxlcyhsZWZ0LCByaWdodCk7XG4gICAgICB9XG4gICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgY2FzZSAnbnVsbCc6XG4gICAgICBjYXNlICdlcnJvcic6XG4gICAgICBjYXNlICdwcm9taXNlJzoge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gMDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgY2FzZSAnYmlnaW50JzpcbiAgICAgIGNhc2UgJ3N0cmluZyc6IHtcbiAgICAgICAgLy9cbiAgICAgICAgLy9cbiAgICAgICAgaWYgKGxlZnQgPCByaWdodCkge1xuICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBhc3NlcnQobGVmdCA+IHJpZ2h0KTtcbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2FzZSAnc3ltYm9sJzoge1xuICAgICAgICByZXR1cm4gY29tcGFyYXRvcihcbiAgICAgICAgICBuYW1lRm9yUGFzc2FibGVTeW1ib2wobGVmdCksXG4gICAgICAgICAgbmFtZUZvclBhc3NhYmxlU3ltYm9sKHJpZ2h0KSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ251bWJlcic6IHtcbiAgICAgICAgLy9cbiAgICAgICAgaWYgKE51bWJlci5pc05hTihsZWZ0KSkge1xuICAgICAgICAgIGFzc2VydCghTnVtYmVyLmlzTmFOKHJpZ2h0KSk7XG4gICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH0gZWxzZSBpZiAoTnVtYmVyLmlzTmFOKHJpZ2h0KSkge1xuICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBpZiAobGVmdCA8IHJpZ2h0KSB7XG4gICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFzc2VydChsZWZ0ID4gcmlnaHQpO1xuICAgICAgICAgIHJldHVybiAxO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5UmVjb3JkJzoge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIC8vXG4gICAgICAgIGNvbnN0IGxlZnROYW1lcyA9IHJlY29yZE5hbWVzKGxlZnQpO1xuICAgICAgICBjb25zdCByaWdodE5hbWVzID0gcmVjb3JkTmFtZXMocmlnaHQpO1xuXG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBhcmF0b3IobGVmdE5hbWVzLCByaWdodE5hbWVzKTtcbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gMCkge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbGVmdFZhbHVlcyA9IHJlY29yZFZhbHVlcyhsZWZ0LCBsZWZ0TmFtZXMpO1xuICAgICAgICBjb25zdCByaWdodFZhbHVlcyA9IHJlY29yZFZhbHVlcyhyaWdodCwgcmlnaHROYW1lcyk7XG4gICAgICAgIHJldHVybiBjb21wYXJhdG9yKGxlZnRWYWx1ZXMsIHJpZ2h0VmFsdWVzKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgbGVuID0gTWF0aC5taW4obGVmdC5sZW5ndGgsIHJpZ2h0Lmxlbmd0aCk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb21wYXJhdG9yKGxlZnRbaV0sIHJpZ2h0W2ldKTtcbiAgICAgICAgICBpZiAocmVzdWx0ICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICByZXR1cm4gY29tcGFyYXRvcihsZWZ0Lmxlbmd0aCwgcmlnaHQubGVuZ3RoKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgLy9cbiAgICAgICAgY29uc3QgbGFiZWxDb21wID0gY29tcGFyYXRvcihnZXRUYWcobGVmdCksIGdldFRhZyhyaWdodCkpO1xuICAgICAgICBpZiAobGFiZWxDb21wICE9PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIGxhYmVsQ29tcDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY29tcGFyYXRvcihsZWZ0LnBheWxvYWQsIHJpZ2h0LnBheWxvYWQpO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBGYWlsYFVucmVjb2duaXplZCBwYXNzU3R5bGU6ICR7cShsZWZ0U3R5bGUpfWA7XG4gICAgICB9XG4gICAgfVxuICAgIC8qICAgICAgICAgICAgICAgKi9cbiAgfTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBvdXRlckNvbXBhcmF0b3IgPSAoeCwgeSkgPT5cbiAgICAvL1xuICAgIC8vXG4gICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAoY29tcGFyYXRvcih4LCB5KSB8fCAwKTtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBhbnRpQ29tcGFyYXRvciA9ICh4LCB5KSA9PiBvdXRlckNvbXBhcmF0b3IoeSwgeCk7XG5cbiAgbWVtb09mU29ydGVkLnNldChvdXRlckNvbXBhcmF0b3IsIG5ldyBXZWFrU2V0KCkpO1xuICBtZW1vT2ZTb3J0ZWQuc2V0KGFudGlDb21wYXJhdG9yLCBuZXcgV2Vha1NldCgpKTtcbiAgY29tcGFyYXRvck1pcnJvckltYWdlcy5zZXQob3V0ZXJDb21wYXJhdG9yLCBhbnRpQ29tcGFyYXRvcik7XG4gIGNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuc2V0KGFudGlDb21wYXJhdG9yLCBvdXRlckNvbXBhcmF0b3IpO1xuXG4gIHJldHVybiBoYXJkZW4oeyBjb21wYXJhdG9yOiBvdXRlckNvbXBhcmF0b3IsIGFudGlDb21wYXJhdG9yIH0pO1xufTtcbi8qXG5cblxuICovJGjNj19vbmNlLm1ha2VDb21wYXJhdG9yS2l0KG1ha2VDb21wYXJhdG9yS2l0KTtcbiAgICAgICBjb25zdCBjb21wYXJhdG9yTWlycm9ySW1hZ2UgPSBjb21wYXJhdG9yID0+XG4gIGNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuZ2V0KGNvbXBhcmF0b3IpO1xuXG4vKlxuXG5cblxuICovJGjNj19vbmNlLmNvbXBhcmF0b3JNaXJyb3JJbWFnZShjb21wYXJhdG9yTWlycm9ySW1hZ2UpO1xuICAgICAgIGNvbnN0IGlzUmFua1NvcnRlZCA9IChwYXNzYWJsZXMsIGNvbXBhcmUpID0+IHtcbiAgY29uc3Qgc3ViTWVtb09mU29ydGVkID0gbWVtb09mU29ydGVkLmdldChjb21wYXJlKTtcbiAgYXNzZXJ0KHN1Yk1lbW9PZlNvcnRlZCAhPT0gdW5kZWZpbmVkKTtcbiAgaWYgKHN1Yk1lbW9PZlNvcnRlZC5oYXMocGFzc2FibGVzKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGFzc2VydChwYXNzU3R5bGVPZihwYXNzYWJsZXMpID09PSAnY29weUFycmF5Jyk7XG4gIGZvciAobGV0IGkgPSAxOyBpIDwgcGFzc2FibGVzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgaWYgKGNvbXBhcmUocGFzc2FibGVzW2kgLSAxXSwgcGFzc2FibGVzW2ldKSA+PSAxKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHN1Yk1lbW9PZlNvcnRlZC5hZGQocGFzc2FibGVzKTtcbiAgcmV0dXJuIHRydWU7XG59OyRozY9fb25jZS5pc1JhbmtTb3J0ZWQoaXNSYW5rU29ydGVkKTtcbmhhcmRlbihpc1JhbmtTb3J0ZWQpO1xuXG4vKlxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydFJhbmtTb3J0ZWQgPSAoc29ydGVkLCBjb21wYXJlKSA9PlxuICBpc1JhbmtTb3J0ZWQoc29ydGVkLCBjb21wYXJlKSB8fFxuICAvL1xuICAvL1xuICBGYWlsYE11c3QgYmUgcmFuayBzb3J0ZWQ6ICR7c29ydGVkfSB2cyAke3NvcnRCeVJhbmsoc29ydGVkLCBjb21wYXJlKX1gOyRozY9fb25jZS5hc3NlcnRSYW5rU29ydGVkKGFzc2VydFJhbmtTb3J0ZWQpO1xuaGFyZGVuKGFzc2VydFJhbmtTb3J0ZWQpO1xuXG4vKlxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBzb3J0QnlSYW5rID0gKHBhc3NhYmxlcywgY29tcGFyZSkgPT4ge1xuICBpZiAoQXJyYXkuaXNBcnJheShwYXNzYWJsZXMpKSB7XG4gICAgaGFyZGVuKHBhc3NhYmxlcyk7XG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgaWYgKGlzUmFua1NvcnRlZChwYXNzYWJsZXMsIGNvbXBhcmUpKSB7XG4gICAgICByZXR1cm4gcGFzc2FibGVzO1xuICAgIH1cbiAgfVxuICBjb25zdCB1bnNvcnRlZCA9IFsuLi5wYXNzYWJsZXNdO1xuICB1bnNvcnRlZC5mb3JFYWNoKGhhcmRlbik7XG4gIGNvbnN0IHNvcnRlZCA9IHVuc29ydGVkLnNvcnQoY29tcGFyZSk7XG4gIC8vXG4gIC8vXG4gIC8vXG4gIGlmIChjb21wYXJlKHRydWUsIHVuZGVmaW5lZCkgPiAwKSB7XG4gICAgbGV0IGkgPSBzb3J0ZWQubGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAoaSA+PSAwICYmIHNvcnRlZFtpXSA9PT0gdW5kZWZpbmVkKSBpIC09IDE7XG4gICAgY29uc3QgbiA9IHNvcnRlZC5sZW5ndGggLSBpIC0gMTtcbiAgICBpZiAobiA+IDAgJiYgbiA8IHNvcnRlZC5sZW5ndGgpIHtcbiAgICAgIHNvcnRlZC5jb3B5V2l0aGluKG4sIDApO1xuICAgICAgc29ydGVkLmZpbGwoLyogICAgICAgICAgICAqLyAodW5kZWZpbmVkKSwgMCwgbik7XG4gICAgfVxuICB9XG4gIGhhcmRlbihzb3J0ZWQpO1xuICBjb25zdCBzdWJNZW1vT2ZTb3J0ZWQgPSBtZW1vT2ZTb3J0ZWQuZ2V0KGNvbXBhcmUpO1xuICBhc3NlcnQoc3ViTWVtb09mU29ydGVkICE9PSB1bmRlZmluZWQpO1xuICBzdWJNZW1vT2ZTb3J0ZWQuYWRkKHNvcnRlZCk7XG4gIHJldHVybiBzb3J0ZWQ7XG59OyRozY9fb25jZS5zb3J0QnlSYW5rKHNvcnRCeVJhbmspO1xuaGFyZGVuKHNvcnRCeVJhbmspO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuY29uc3QgcmFua1NlYXJjaCA9IChzb3J0ZWQsIGNvbXBhcmUsIGtleSwgYmlhcyA9ICdsZWZ0TW9zdCcpID0+IHtcbiAgYXNzZXJ0UmFua1NvcnRlZChzb3J0ZWQsIGNvbXBhcmUpO1xuICBsZXQgbGVmdCA9IDA7XG4gIGxldCByaWdodCA9IHNvcnRlZC5sZW5ndGg7XG4gIHdoaWxlIChsZWZ0IDwgcmlnaHQpIHtcbiAgICBjb25zdCBtID0gTWF0aC5mbG9vcigobGVmdCArIHJpZ2h0KSAvIDIpO1xuICAgIGNvbnN0IGNvbXAgPSBjb21wYXJlKHNvcnRlZFttXSwga2V5KTtcbiAgICBpZiAoY29tcCA8PSAtMSB8fCAoY29tcCA9PT0gMCAmJiBiaWFzID09PSAncmlnaHRNb3N0JykpIHtcbiAgICAgIGxlZnQgPSBtICsgMTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KGNvbXAgPj0gMSB8fCAoY29tcCA9PT0gMCAmJiBiaWFzID09PSAnbGVmdE1vc3QnKSk7XG4gICAgICByaWdodCA9IG07XG4gICAgfVxuICB9XG4gIHJldHVybiBiaWFzID09PSAnbGVmdE1vc3QnID8gbGVmdCA6IHJpZ2h0IC0gMTtcbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGdldEluZGV4Q292ZXIgPSAoc29ydGVkLCBjb21wYXJlLCBbbGVmdEtleSwgcmlnaHRLZXldKSA9PiB7XG4gIGFzc2VydFJhbmtTb3J0ZWQoc29ydGVkLCBjb21wYXJlKTtcbiAgY29uc3QgbGVmdEluZGV4ID0gcmFua1NlYXJjaChzb3J0ZWQsIGNvbXBhcmUsIGxlZnRLZXksICdsZWZ0TW9zdCcpO1xuICBjb25zdCByaWdodEluZGV4ID0gcmFua1NlYXJjaChzb3J0ZWQsIGNvbXBhcmUsIHJpZ2h0S2V5LCAncmlnaHRNb3N0Jyk7XG4gIHJldHVybiBbbGVmdEluZGV4LCByaWdodEluZGV4XTtcbn07JGjNj19vbmNlLmdldEluZGV4Q292ZXIoZ2V0SW5kZXhDb3Zlcik7XG5oYXJkZW4oZ2V0SW5kZXhDb3Zlcik7XG5cbi8qICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgIGNvbnN0IEZ1bGxSYW5rQ292ZXIgPSBoYXJkZW4oWycnLCAneyddKTtcblxuLypcblxuXG5cbiAqLyRozY9fb25jZS5GdWxsUmFua0NvdmVyKEZ1bGxSYW5rQ292ZXIpO1xuICAgICAgIGNvbnN0IGNvdmVyZWRFbnRyaWVzID0gKHNvcnRlZCwgW2xlZnRJbmRleCwgcmlnaHRJbmRleF0pID0+IHtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBpdGVyYWJsZSA9IGhhcmRlbih7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIGxldCBpID0gbGVmdEluZGV4O1xuICAgICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICBpZiAoaSA8PSByaWdodEluZGV4KSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gc29ydGVkW2ldO1xuICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgcmV0dXJuIGhhcmRlbih7IHZhbHVlOiBbaSwgZWxlbWVudF0sIGRvbmU6IGZhbHNlIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIGl0ZXJhYmxlO1xufTskaM2PX29uY2UuY292ZXJlZEVudHJpZXMoY292ZXJlZEVudHJpZXMpO1xuaGFyZGVuKGNvdmVyZWRFbnRyaWVzKTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IG1heFJhbmsgPSAoY29tcGFyZSwgYSwgYikgPT4gKGNvbXBhcmUoYSwgYikgPj0gMCA/IGEgOiBiKTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IG1pblJhbmsgPSAoY29tcGFyZSwgYSwgYikgPT4gKGNvbXBhcmUoYSwgYikgPD0gMCA/IGEgOiBiKTtcblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHVuaW9uUmFua0NvdmVycyA9IChjb21wYXJlLCBjb3ZlcnMpID0+IHtcbiAgLypcblxuXG5cbiAgICovXG4gIGNvbnN0IHVuaW9uUmFua0NvdmVyUGFpciA9IChbbGVmdEEsIHJpZ2h0QV0sIFtsZWZ0QiwgcmlnaHRCXSkgPT4gW1xuICAgIG1pblJhbmsoY29tcGFyZSwgbGVmdEEsIGxlZnRCKSxcbiAgICBtYXhSYW5rKGNvbXBhcmUsIHJpZ2h0QSwgcmlnaHRCKSxcbiAgXTtcbiAgcmV0dXJuIGNvdmVycy5yZWR1Y2UodW5pb25SYW5rQ292ZXJQYWlyLCBbJ3snLCAnJ10pO1xufTskaM2PX29uY2UudW5pb25SYW5rQ292ZXJzKHVuaW9uUmFua0NvdmVycyk7XG5oYXJkZW4odW5pb25SYW5rQ292ZXJzKTtcblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGludGVyc2VjdFJhbmtDb3ZlcnMgPSAoY29tcGFyZSwgY292ZXJzKSA9PiB7XG4gIC8qXG5cblxuXG4gICAqL1xuICBjb25zdCBpbnRlcnNlY3RSYW5rQ292ZXJQYWlyID0gKFtsZWZ0QSwgcmlnaHRBXSwgW2xlZnRCLCByaWdodEJdKSA9PiBbXG4gICAgbWF4UmFuayhjb21wYXJlLCBsZWZ0QSwgbGVmdEIpLFxuICAgIG1pblJhbmsoY29tcGFyZSwgcmlnaHRBLCByaWdodEIpLFxuICBdO1xuICByZXR1cm4gY292ZXJzLnJlZHVjZShpbnRlcnNlY3RSYW5rQ292ZXJQYWlyLCBbJycsICd7J10pO1xufTskaM2PX29uY2UuaW50ZXJzZWN0UmFua0NvdmVycyhpbnRlcnNlY3RSYW5rQ292ZXJzKTtcblxuICAgICAgIGNvbnN0IHsgY29tcGFyYXRvcjogY29tcGFyZVJhbmssIGFudGlDb21wYXJhdG9yOiBjb21wYXJlQW50aVJhbmsgfSA9XG4gIG1ha2VDb21wYXJhdG9yS2l0KCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuY29tcGFyZVJhbmsoY29tcGFyZVJhbmspOyRozY9fb25jZS5jb21wYXJlQW50aVJhbmsoY29tcGFyZUFudGlSYW5rKTtcbiAgICAgICBjb25zdCBtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9IChsb25nTGl2ZWQgPSBmYWxzZSkgPT4ge1xuICBsZXQgbnVtU2VlbiA9IDA7XG4gIC8vXG4gIC8vXG4gIC8vXG4gIGNvbnN0IE1hcENvbnN0cnVjdG9yID0gbG9uZ0xpdmVkID8gV2Vha01hcCA6IE1hcDtcbiAgY29uc3Qgc2VlbiA9IG5ldyBNYXBDb25zdHJ1Y3RvcigpO1xuICBjb25zdCB0YWcgPSByID0+IHtcbiAgICBpZiAoc2Vlbi5oYXMocikpIHtcbiAgICAgIHJldHVybiBzZWVuLmdldChyKTtcbiAgICB9XG4gICAgbnVtU2VlbiArPSAxO1xuICAgIHNlZW4uc2V0KHIsIG51bVNlZW4pO1xuICAgIHJldHVybiBudW1TZWVuO1xuICB9O1xuICBjb25zdCBjb21wYXJlUmVtb3RhYmxlcyA9ICh4LCB5KSA9PiBjb21wYXJlUmFuayh0YWcoeCksIHRhZyh5KSk7XG4gIHJldHVybiBtYWtlQ29tcGFyYXRvcktpdChjb21wYXJlUmVtb3RhYmxlcyk7XG59OyRozY9fb25jZS5tYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCk7XG5oYXJkZW4obWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidHJpdmlhbENvbXBhcmF0b3IiOlsidHJpdmlhbENvbXBhcmF0b3IiXSwiZ2V0UGFzc1N0eWxlQ292ZXIiOlsiZ2V0UGFzc1N0eWxlQ292ZXIiXSwibWFrZUNvbXBhcmF0b3JLaXQiOlsibWFrZUNvbXBhcmF0b3JLaXQiXSwiY29tcGFyYXRvck1pcnJvckltYWdlIjpbImNvbXBhcmF0b3JNaXJyb3JJbWFnZSJdLCJpc1JhbmtTb3J0ZWQiOlsiaXNSYW5rU29ydGVkIl0sImFzc2VydFJhbmtTb3J0ZWQiOlsiYXNzZXJ0UmFua1NvcnRlZCJdLCJzb3J0QnlSYW5rIjpbInNvcnRCeVJhbmsiXSwiZ2V0SW5kZXhDb3ZlciI6WyJnZXRJbmRleENvdmVyIl0sIkZ1bGxSYW5rQ292ZXIiOlsiRnVsbFJhbmtDb3ZlciJdLCJjb3ZlcmVkRW50cmllcyI6WyJjb3ZlcmVkRW50cmllcyJdLCJ1bmlvblJhbmtDb3ZlcnMiOlsidW5pb25SYW5rQ292ZXJzIl0sImludGVyc2VjdFJhbmtDb3ZlcnMiOlsiaW50ZXJzZWN0UmFua0NvdmVycyJdLCJjb21wYXJlUmFuayI6WyJjb21wYXJlUmFuayJdLCJjb21wYXJlQW50aVJhbmsiOlsiY29tcGFyZUFudGlSYW5rIl0sIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0IjpbIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACEAAABAZW5kby9tYXJzaGFsLXYxLjYuNC9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAXpyzyswFAADMBQAAHQAAAEBlbmRvL25hdC12NS4xLjAvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJOYXQiLCJpc05hdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXNOYXQsJ25hbWUnLHt2YWx1ZTpcImlzTmF0XCJ9KTskaM2PX29uY2UuaXNOYXQoaXNOYXQpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShOYXQsJ25hbWUnLHt2YWx1ZTpcIk5hdFwifSk7JGjNj19vbmNlLk5hdChOYXQpOy8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5mdW5jdGlvbiBpc05hdChhbGxlZ2VkTnVtKSB7XG4gIGlmICh0eXBlb2YgYWxsZWdlZE51bSA9PT0gJ2JpZ2ludCcpIHtcbiAgICByZXR1cm4gYWxsZWdlZE51bSA+PSAwO1xuICB9XG4gIGlmICh0eXBlb2YgYWxsZWdlZE51bSAhPT0gJ251bWJlcicpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gTnVtYmVyLmlzU2FmZUludGVnZXIoYWxsZWdlZE51bSkgJiYgYWxsZWdlZE51bSA+PSAwO1xufVxuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuZnVuY3Rpb24gTmF0KGFsbGVnZWROdW0pIHtcbiAgaWYgKHR5cGVvZiBhbGxlZ2VkTnVtID09PSAnYmlnaW50Jykge1xuICAgIGlmIChhbGxlZ2VkTnVtIDwgMG4pIHtcbiAgICAgIHRocm93IFJhbmdlRXJyb3IoYCR7YWxsZWdlZE51bX0gaXMgbmVnYXRpdmVgKTtcbiAgICB9XG4gICAgcmV0dXJuIGFsbGVnZWROdW07XG4gIH1cblxuICBpZiAodHlwZW9mIGFsbGVnZWROdW0gPT09ICdudW1iZXInKSB7XG4gICAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihhbGxlZ2VkTnVtKSkge1xuICAgICAgdGhyb3cgUmFuZ2VFcnJvcihgJHthbGxlZ2VkTnVtfSBpcyBub3QgYSBzYWZlIGludGVnZXJgKTtcbiAgICB9XG4gICAgaWYgKGFsbGVnZWROdW0gPCAwKSB7XG4gICAgICB0aHJvdyBSYW5nZUVycm9yKGAke2FsbGVnZWROdW19IGlzIG5lZ2F0aXZlYCk7XG4gICAgfVxuICAgIHJldHVybiBCaWdJbnQoYWxsZWdlZE51bSk7XG4gIH1cblxuICB0aHJvdyBUeXBlRXJyb3IoXG4gICAgYCR7YWxsZWdlZE51bX0gaXMgYSAke3R5cGVvZiBhbGxlZ2VkTnVtfSBidXQgbXVzdCBiZSBhIGJpZ2ludCBvciBhIG51bWJlcmAsXG4gICk7XG59XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc05hdCI6WyJpc05hdCJdLCJOYXQiOlsiTmF0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAL0dmpNCgAATQoAACAAAABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9pdGVyLWhlbHBlcnMuanMiLCIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vc3JjL2Vycm9yLmpzIiwiLi9zcmMvcmVtb3RhYmxlLmpzIiwiLi9zcmMvc3ltYm9sLmpzIiwiLi9zcmMvc3RyaW5nLmpzIiwiLi9zcmMvcGFzc1N0eWxlT2YuanMiLCIuL3NyYy9tYWtlVGFnZ2VkLmpzIiwiLi9zcmMvbWFrZS1mYXIuanMiLCIuL3NyYy90eXBlR3VhcmRzLmpzIiwiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJGYXIiLCJGYXIiLCJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIiwiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyIsImZpbHRlckl0ZXJhYmxlIiwiZmlsdGVySXRlcmFibGUiLCJpc0Vycm9yTGlrZSIsImlzRXJyb3JMaWtlIiwiaXNPYmplY3QiLCJpc09iamVjdCIsImlzUGFzc2FibGUiLCJpc1Bhc3NhYmxlIiwiaXNQYXNzYWJsZVN5bWJvbCIsImlzUGFzc2FibGVTeW1ib2wiLG51bGwsbnVsbF0sInJlZXhwb3J0cyI6WyIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9pdGVyLWhlbHBlcnMuanNcIiwgW11dLFtcIi4vc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtdXSxbXCIuL3NyYy9lcnJvci5qc1wiLCBbXV0sW1wiLi9zcmMvcmVtb3RhYmxlLmpzXCIsIFtdXSxbXCIuL3NyYy9zeW1ib2wuanNcIiwgW11dLFtcIi4vc3JjL3N0cmluZy5qc1wiLCBbXV0sW1wiLi9zcmMvcGFzc1N0eWxlT2YuanNcIiwgW11dLFtcIi4vc3JjL21ha2VUYWdnZWQuanNcIiwgW11dLFtcIi4vc3JjL21ha2UtZmFyLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlR3VhcmRzLmpzXCIsIFtdXSxbXCIuL3NyYy9kZWVwbHlGdWxmaWxsZWQuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiLi9zcmMvaXRlci1oZWxwZXJzLmpzIjpbWyJtYXBJdGVyYWJsZSIsIm1hcEl0ZXJhYmxlIl0sWyJmaWx0ZXJJdGVyYWJsZSIsImZpbHRlckl0ZXJhYmxlIl1dLCIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qcyI6W1siUEFTU19TVFlMRSIsIlBBU1NfU1RZTEUiXSxbImlzT2JqZWN0IiwiaXNPYmplY3QiXSxbImFzc2VydENoZWNrZXIiLCJhc3NlcnRDaGVja2VyIl0sWyJnZXRUYWciLCJnZXRUYWciXSxbImhhc093blByb3BlcnR5T2YiLCJoYXNPd25Qcm9wZXJ0eU9mIl1dLCIuL3NyYy9lcnJvci5qcyI6W1siZ2V0RXJyb3JDb25zdHJ1Y3RvciIsImdldEVycm9yQ29uc3RydWN0b3IiXSxbImlzRXJyb3JMaWtlIiwiaXNFcnJvckxpa2UiXV0sIi4vc3JjL3JlbW90YWJsZS5qcyI6W1siZ2V0SW50ZXJmYWNlT2YiLCJnZXRJbnRlcmZhY2VPZiJdXSwiLi9zcmMvc3ltYm9sLmpzIjpbWyJhc3NlcnRQYXNzYWJsZVN5bWJvbCIsImFzc2VydFBhc3NhYmxlU3ltYm9sIl0sWyJpc1Bhc3NhYmxlU3ltYm9sIiwiaXNQYXNzYWJsZVN5bWJvbCJdLFsibmFtZUZvclBhc3NhYmxlU3ltYm9sIiwibmFtZUZvclBhc3NhYmxlU3ltYm9sIl0sWyJwYXNzYWJsZVN5bWJvbEZvck5hbWUiLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXV0sIi4vc3JjL3N0cmluZy5qcyI6W1siaXNXZWxsRm9ybWVkU3RyaW5nIiwiaXNXZWxsRm9ybWVkU3RyaW5nIl0sWyJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIiwiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyJdLFsiYXNzZXJ0UGFzc2FibGVTdHJpbmciLCJhc3NlcnRQYXNzYWJsZVN0cmluZyJdXSwiLi9zcmMvcGFzc1N0eWxlT2YuanMiOltbInBhc3NTdHlsZU9mIiwicGFzc1N0eWxlT2YiXSxbImlzUGFzc2FibGUiLCJpc1Bhc3NhYmxlIl0sWyJhc3NlcnRQYXNzYWJsZSIsImFzc2VydFBhc3NhYmxlIl0sWyJ0b1Bhc3NhYmxlRXJyb3IiLCJ0b1Bhc3NhYmxlRXJyb3IiXSxbInRvVGhyb3dhYmxlIiwidG9UaHJvd2FibGUiXV0sIi4vc3JjL21ha2VUYWdnZWQuanMiOltbIm1ha2VUYWdnZWQiLCJtYWtlVGFnZ2VkIl1dLCIuL3NyYy9tYWtlLWZhci5qcyI6W1siUmVtb3RhYmxlIiwiUmVtb3RhYmxlIl0sWyJGYXIiLCJGYXIiXSxbIlRvRmFyRnVuY3Rpb24iLCJUb0ZhckZ1bmN0aW9uIl0sWyJHRVRfTUVUSE9EX05BTUVTIiwiR0VUX01FVEhPRF9OQU1FUyJdXSwiLi9zcmMvdHlwZUd1YXJkcy5qcyI6W1siYXNzZXJ0UmVjb3JkIiwiYXNzZXJ0UmVjb3JkIl0sWyJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRDb3B5QXJyYXkiXSxbImFzc2VydFJlbW90YWJsZSIsImFzc2VydFJlbW90YWJsZSJdLFsiaXNSZW1vdGFibGUiLCJpc1JlbW90YWJsZSJdLFsiaXNSZWNvcmQiLCJpc1JlY29yZCJdLFsiaXNDb3B5QXJyYXkiLCJpc0NvcHlBcnJheSJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAw+/2RbwGAAC8BgAAKAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9jb3B5QXJyYXkuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIkNvcHlBcnJheUhlbHBlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IFgsYXNzZXJ0Q2hlY2tlcixnZXRPd25EYXRhRGVzY3JpcHRvcjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJnZXRPd25EYXRhRGVzY3JpcHRvclwiLFskaM2PX2EgPT4gKGdldE93bkRhdGFEZXNjcmlwdG9yID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuY29uc3QgeyBnZXRQcm90b3R5cGVPZiB9ID0gT2JqZWN0O1xuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBpc0FycmF5LCBwcm90b3R5cGU6IGFycmF5UHJvdG90eXBlIH0gPSBBcnJheTtcblxuLypcblxuXG4gKi9cbiAgICAgICBjb25zdCBDb3B5QXJyYXlIZWxwZXIgPSBoYXJkZW4oe1xuICBzdHlsZU5hbWU6ICdjb3B5QXJyYXknLFxuXG4gIGNhbkJlVmFsaWQ6IChjYW5kaWRhdGUsIGNoZWNrID0gdW5kZWZpbmVkKSA9PlxuICAgIGlzQXJyYXkoY2FuZGlkYXRlKSB8fFxuICAgICghIWNoZWNrICYmIGNoZWNrKGZhbHNlLCBYYEFycmF5IGV4cGVjdGVkOiAke2NhbmRpZGF0ZX1gKSksXG5cbiAgYXNzZXJ0UmVzdFZhbGlkOiAoY2FuZGlkYXRlLCBwYXNzU3R5bGVPZlJlY3VyKSA9PiB7XG4gICAgZ2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKSA9PT0gYXJyYXlQcm90b3R5cGUgfHxcbiAgICAgIGFzc2VydC5mYWlsKFhgTWFsZm9ybWVkIGFycmF5OiAke2NhbmRpZGF0ZX1gLCBUeXBlRXJyb3IpO1xuICAgIC8vXG4gICAgLy9cbiAgICBjb25zdCBsZW4gPSAvKiAgICAgICAgICAgICAgICAgKi8gKFxuICAgICAgZ2V0T3duRGF0YURlc2NyaXB0b3IoY2FuZGlkYXRlLCAnbGVuZ3RoJywgZmFsc2UsIGFzc2VydENoZWNrZXIpLnZhbHVlXG4gICAgKTtcbiAgICAvL1xuICAgIC8vXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgcGFzc1N0eWxlT2ZSZWN1cihcbiAgICAgICAgZ2V0T3duRGF0YURlc2NyaXB0b3IoY2FuZGlkYXRlLCBpLCB0cnVlLCBhc3NlcnRDaGVja2VyKS52YWx1ZSxcbiAgICAgICk7XG4gICAgfVxuICAgIC8vXG4gICAgb3duS2V5cyhjYW5kaWRhdGUpLmxlbmd0aCA9PT0gbGVuICsgMSB8fFxuICAgICAgYXNzZXJ0LmZhaWwoWGBBcnJheXMgbXVzdCBub3QgaGF2ZSBub24taW5kZXhlczogJHtjYW5kaWRhdGV9YCwgVHlwZUVycm9yKTtcbiAgfSxcbn0pOyRozY9fb25jZS5Db3B5QXJyYXlIZWxwZXIoQ29weUFycmF5SGVscGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkNvcHlBcnJheUhlbHBlciI6WyJDb3B5QXJyYXlIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAEIFEwPYIAAD2CAAAKQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9jb3B5UmVjb3JkLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJDb3B5UmVjb3JkSGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYXNzZXJ0Q2hlY2tlcixjYW5CZU1ldGhvZCxnZXRPd25EYXRhRGVzY3JpcHRvcixDWDskaM2PX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcImNhbkJlTWV0aG9kXCIsWyRozY9fYSA9PiAoY2FuQmVNZXRob2QgPSAkaM2PX2EpXV0sW1wiZ2V0T3duRGF0YURlc2NyaXB0b3JcIixbJGjNj19hID0+IChnZXRPd25EYXRhRGVzY3JpcHRvciA9ICRozY9fYSldXSxbXCJDWFwiLFskaM2PX2EgPT4gKENYID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBnZXRQcm90b3R5cGVPZiwgcHJvdG90eXBlOiBvYmplY3RQcm90b3R5cGUgfSA9IE9iamVjdDtcblxuLypcblxuXG4gKi9cbmNvbnN0IGNoZWNrT2JqZWN0UHJvdG90eXBlID0gKGNhbmRpZGF0ZSwgY2hlY2sgPSB1bmRlZmluZWQpID0+IHtcbiAgcmV0dXJuIChcbiAgICBnZXRQcm90b3R5cGVPZihjYW5kaWRhdGUpID09PSBvYmplY3RQcm90b3R5cGUgfHxcbiAgICAoISFjaGVjayAmJlxuICAgICAgQ1goY2hlY2spYFJlY29yZHMgbXVzdCBpbmhlcml0IGZyb20gT2JqZWN0LnByb3RvdHlwZTogJHtjYW5kaWRhdGV9YClcbiAgKTtcbn07XG5cbi8qXG5cblxuXG5cbiAqL1xuY29uc3QgY2hlY2tQcm9wZXJ0eUNhbkJlVmFsaWQgPSAoY2FuZGlkYXRlLCBrZXksIHZhbHVlLCBjaGVjayA9IHVuZGVmaW5lZCkgPT4ge1xuICByZXR1cm4gKFxuICAgICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyB8fFxuICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgQ1goXG4gICAgICAgICAgY2hlY2ssXG4gICAgICAgIClgUmVjb3JkcyBjYW4gb25seSBoYXZlIHN0cmluZy1uYW1lZCBwcm9wZXJ0aWVzOiAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgICAoIWNhbkJlTWV0aG9kKHZhbHVlKSB8fFxuICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgLy9cbiAgICAgICAgQ1goXG4gICAgICAgICAgY2hlY2ssXG4gICAgICAgIClgUmVjb3JkcyBjYW5ub3QgY29udGFpbiBub24tZmFyIGZ1bmN0aW9ucyBiZWNhdXNlIHRoZXkgbWF5IGJlIG1ldGhvZHMgb2YgYW4gaW1wbGljaXQgUmVtb3RhYmxlOiAke2NhbmRpZGF0ZX1gKSlcbiAgKTtcbn07XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgQ29weVJlY29yZEhlbHBlciA9IGhhcmRlbih7XG4gIHN0eWxlTmFtZTogJ2NvcHlSZWNvcmQnLFxuXG4gIGNhbkJlVmFsaWQ6IChjYW5kaWRhdGUsIGNoZWNrID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNoZWNrT2JqZWN0UHJvdG90eXBlKGNhbmRpZGF0ZSwgY2hlY2spICYmXG4gICAgICAvL1xuICAgICAgLy9cbiAgICAgIG93bktleXMoY2FuZGlkYXRlKS5ldmVyeShrZXkgPT5cbiAgICAgICAgY2hlY2tQcm9wZXJ0eUNhbkJlVmFsaWQoY2FuZGlkYXRlLCBrZXksIGNhbmRpZGF0ZVtrZXldLCBjaGVjayksXG4gICAgICApXG4gICAgKTtcbiAgfSxcblxuICBhc3NlcnRSZXN0VmFsaWQ6IChjYW5kaWRhdGUsIHBhc3NTdHlsZU9mUmVjdXIpID0+IHtcbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBmb3IgKGNvbnN0IG5hbWUgb2Ygb3duS2V5cyhjYW5kaWRhdGUpKSB7XG4gICAgICBjb25zdCB7IHZhbHVlIH0gPSBnZXRPd25EYXRhRGVzY3JpcHRvcihcbiAgICAgICAgY2FuZGlkYXRlLFxuICAgICAgICBuYW1lLFxuICAgICAgICB0cnVlLFxuICAgICAgICBhc3NlcnRDaGVja2VyLFxuICAgICAgKTtcbiAgICAgIHBhc3NTdHlsZU9mUmVjdXIodmFsdWUpO1xuICAgIH1cbiAgfSxcbn0pOyRozY9fb25jZS5Db3B5UmVjb3JkSGVscGVyKENvcHlSZWNvcmRIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ29weVJlY29yZEhlbHBlciI6WyJDb3B5UmVjb3JkSGVscGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMI3yaeeCwAAngsAAC4AAABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9wcm9taXNlLWtpdCIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL3Bhc3NTdHlsZU9mLmpzIiwiLi9tYWtlVGFnZ2VkLmpzIl0sImV4cG9ydHMiOlsiZGVlcGx5RnVsZmlsbGVkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgWCxxLEUsaXNQcm9taXNlLGdldFRhZyxpc09iamVjdCxwYXNzU3R5bGVPZixtYWtlVGFnZ2VkOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLFskaM2PX2EgPT4gKGlzUHJvbWlzZSA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImdldFRhZ1wiLFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXSxbXCJpc09iamVjdFwiLFskaM2PX2EgPT4gKGlzT2JqZWN0ID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXV1dLFtcIi4vbWFrZVRhZ2dlZC5qc1wiLCBbW1wibWFrZVRhZ2dlZFwiLFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuLypcblxuICovXG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgZnJvbUVudHJpZXMgfSA9IE9iamVjdDtcblxuLypcblxuXG5cblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuXG5cblxuXG5cbiAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZGVlcGx5RnVsZmlsbGVkID0gYXN5bmMgdmFsID0+IHtcbiAgLy9cbiAgLy9cbiAgLy9cblxuICBpZiAoIWlzT2JqZWN0KHZhbCkpIHtcbiAgICByZXR1cm4gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAodmFsKTtcbiAgfVxuICBpZiAoaXNQcm9taXNlKHZhbCkpIHtcbiAgICByZXR1cm4gRS53aGVuKHZhbCwgbm9ucCA9PiBkZWVwbHlGdWxmaWxsZWQobm9ucCkpO1xuICB9XG4gIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHZhbCk7XG4gIHN3aXRjaCAocGFzc1N0eWxlKSB7XG4gICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgIGNvbnN0IHJlYyA9IC8qICAgICAgICAgICAgICAgICAgICAgKi8gKHZhbCk7XG4gICAgICBjb25zdCBuYW1lcyA9IC8qICAgICAgICAgICAgICAgICAgICovIChvd25LZXlzKHJlYykpO1xuICAgICAgY29uc3QgdmFsUHMgPSBuYW1lcy5tYXAobmFtZSA9PiBkZWVwbHlGdWxmaWxsZWQocmVjW25hbWVdKSk7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIEUud2hlbihQcm9taXNlLmFsbCh2YWxQcyksIHZhbHMgPT5cbiAgICAgICAgaGFyZGVuKGZyb21FbnRyaWVzKHZhbHMubWFwKChjLCBpKSA9PiBbbmFtZXNbaV0sIGNdKSkpLFxuICAgICAgKTtcbiAgICB9XG4gICAgY2FzZSAnY29weUFycmF5Jzoge1xuICAgICAgY29uc3QgYXJyID0gLyogICAgICAgICAgICAgICAgICAgICovICh2YWwpO1xuICAgICAgY29uc3QgdmFsUHMgPSBhcnIubWFwKHAgPT4gZGVlcGx5RnVsZmlsbGVkKHApKTtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gRS53aGVuKFByb21pc2UuYWxsKHZhbFBzKSwgdmFscyA9PiBoYXJkZW4odmFscykpO1xuICAgIH1cbiAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICBjb25zdCB0Z2QgPSAvKiAgICAgICAgICAgICAgICAgICAgICovICh2YWwpO1xuICAgICAgY29uc3QgdGFnID0gZ2V0VGFnKHRnZCk7XG4gICAgICAvL1xuICAgICAgcmV0dXJuIEUud2hlbihkZWVwbHlGdWxmaWxsZWQodGdkLnBheWxvYWQpLCBwYXlsb2FkID0+XG4gICAgICAgIG1ha2VUYWdnZWQodGFnLCBwYXlsb2FkKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGNhc2UgJ3JlbW90YWJsZSc6IHtcbiAgICAgIGNvbnN0IHJlbSA9IC8qICAgICAgICAgICAgICAgICAgICAgICAgICAqLyAodmFsKTtcbiAgICAgIC8vXG4gICAgICByZXR1cm4gcmVtO1xuICAgIH1cbiAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgIGNvbnN0IGVyciA9IC8qICAgICAgICAgICAgICAgICovICh2YWwpO1xuICAgICAgLy9cbiAgICAgIHJldHVybiBlcnI7XG4gICAgfVxuICAgIGNhc2UgJ3Byb21pc2UnOiB7XG4gICAgICBjb25zdCBwcm9tID0gLyogICAgICAgICAgICAgICAgICAqLyAoLyogICAgICAgICAgICAgICAgICAqLyAodmFsKSk7XG4gICAgICByZXR1cm4gRS53aGVuKHByb20sIG5vbnAgPT4gZGVlcGx5RnVsZmlsbGVkKG5vbnApKTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoWGBVbmV4cGVjdGVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX1gLCBUeXBlRXJyb3IpO1xuICAgIH1cbiAgfVxufTskaM2PX29uY2UuZGVlcGx5RnVsZmlsbGVkKGRlZXBseUZ1bGZpbGxlZCk7XG5oYXJkZW4oZGVlcGx5RnVsZmlsbGVkKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZXBseUZ1bGZpbGxlZCI6WyJkZWVwbHlGdWxmaWxsZWQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAF1cCItMUAADTFAAAJAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9lcnJvci5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiRXJyb3JIZWxwZXIiLCJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvciIsImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjIiwiZ2V0RXJyb3JDb25zdHJ1Y3RvciIsImlzRXJyb3JMaWtlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxhc3NlcnRDaGVja2VyLENYOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcIkNYXCIsWyRozY9fYSA9PiAoQ1ggPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbmNvbnN0IHsgZ2V0UHJvdG90eXBlT2YsIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsIGhhc093biwgZW50cmllcyB9ID0gT2JqZWN0O1xuXG4vL1xuLy9cbmNvbnN0IGVycm9yQ29uc3RydWN0b3JzID0gbmV3IE1hcChcbiAgLy9cbiAgLy9cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIChbXG4gICAgWydFcnJvcicsIEVycm9yXSxcbiAgICBbJ0V2YWxFcnJvcicsIEV2YWxFcnJvcl0sXG4gICAgWydSYW5nZUVycm9yJywgUmFuZ2VFcnJvcl0sXG4gICAgWydSZWZlcmVuY2VFcnJvcicsIFJlZmVyZW5jZUVycm9yXSxcbiAgICBbJ1N5bnRheEVycm9yJywgU3ludGF4RXJyb3JdLFxuICAgIFsnVHlwZUVycm9yJywgVHlwZUVycm9yXSxcbiAgICBbJ1VSSUVycm9yJywgVVJJRXJyb3JdXG5cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICBdKSxcbik7XG5cbmlmICh0eXBlb2YgQWdncmVnYXRlRXJyb3IgIT09ICd1bmRlZmluZWQnKSB7XG4gIC8vXG4gIGVycm9yQ29uc3RydWN0b3JzLnNldCgnQWdncmVnYXRlRXJyb3InLCBBZ2dyZWdhdGVFcnJvcik7XG59XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0RXJyb3JDb25zdHJ1Y3RvciA9IG5hbWUgPT4gZXJyb3JDb25zdHJ1Y3RvcnMuZ2V0KG5hbWUpOyRozY9fb25jZS5nZXRFcnJvckNvbnN0cnVjdG9yKGdldEVycm9yQ29uc3RydWN0b3IpO1xuaGFyZGVuKGdldEVycm9yQ29uc3RydWN0b3IpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBjaGVja0Vycm9yTGlrZSA9IChjYW5kaWRhdGUsIGNoZWNrID0gdW5kZWZpbmVkKSA9PiB7XG4gIC8vXG4gIHJldHVybiAoXG4gICAgY2FuZGlkYXRlIGluc3RhbmNlb2YgRXJyb3IgfHxcbiAgICAoISFjaGVjayAmJiBDWChjaGVjaylgRXJyb3IgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApXG4gICk7XG59O1xuaGFyZGVuKGNoZWNrRXJyb3JMaWtlKTtcbi8vXG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGlzRXJyb3JMaWtlID0gY2FuZGlkYXRlID0+IGNoZWNrRXJyb3JMaWtlKGNhbmRpZGF0ZSk7JGjNj19vbmNlLmlzRXJyb3JMaWtlKGlzRXJyb3JMaWtlKTtcbmhhcmRlbihpc0Vycm9yTGlrZSk7XG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MgPSAoXG4gIHByb3BOYW1lLFxuICBkZXNjLFxuICBwYXNzU3R5bGVPZlJlY3VyLFxuICBjaGVjayA9IHVuZGVmaW5lZCxcbikgPT4ge1xuICBpZiAoZGVzYy5lbnVtZXJhYmxlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhY2hlY2sgJiZcbiAgICAgIENYKGNoZWNrKWBQYXNzYWJsZSBFcnJvciAke3EoXG4gICAgICAgIHByb3BOYW1lLFxuICAgICAgKX0gb3duIHByb3BlcnR5IG11c3Qgbm90IGJlIGVudW1lcmFibGU6ICR7ZGVzY31gXG4gICAgKTtcbiAgfVxuICBpZiAoIWhhc093bihkZXNjLCAndmFsdWUnKSkge1xuICAgIHJldHVybiAoXG4gICAgICAhIWNoZWNrICYmXG4gICAgICBDWChjaGVjaylgUGFzc2FibGUgRXJyb3IgJHtxKFxuICAgICAgICBwcm9wTmFtZSxcbiAgICAgICl9IG93biBwcm9wZXJ0eSBtdXN0IGJlIGEgZGF0YSBwcm9wZXJ0eTogJHtkZXNjfWBcbiAgICApO1xuICB9XG4gIGNvbnN0IHsgdmFsdWUgfSA9IGRlc2M7XG4gIHN3aXRjaCAocHJvcE5hbWUpIHtcbiAgICBjYXNlICdtZXNzYWdlJzpcbiAgICBjYXNlICdzdGFjayc6IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICBDWChjaGVjaylgUGFzc2FibGUgRXJyb3IgJHtxKFxuICAgICAgICAgICAgcHJvcE5hbWUsXG4gICAgICAgICAgKX0gb3duIHByb3BlcnR5IG11c3QgYmUgYSBzdHJpbmc6ICR7dmFsdWV9YClcbiAgICAgICk7XG4gICAgfVxuICAgIGNhc2UgJ2NhdXNlJzoge1xuICAgICAgLy9cbiAgICAgIHJldHVybiBjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcih2YWx1ZSwgcGFzc1N0eWxlT2ZSZWN1ciwgY2hlY2spO1xuICAgIH1cbiAgICBjYXNlICdlcnJvcnMnOiB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpIHx8IHBhc3NTdHlsZU9mUmVjdXIodmFsdWUpICE9PSAnY29weUFycmF5Jykge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICEhY2hlY2sgJiZcbiAgICAgICAgICBDWChjaGVjaylgUGFzc2FibGUgRXJyb3IgJHtxKFxuICAgICAgICAgICAgcHJvcE5hbWUsXG4gICAgICAgICAgKX0gb3duIHByb3BlcnR5IG11c3QgYmUgYSBjb3B5QXJyYXk6ICR7dmFsdWV9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlLmV2ZXJ5KGVyciA9PlxuICAgICAgICAvL1xuICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcihlcnIsIHBhc3NTdHlsZU9mUmVjdXIsIGNoZWNrKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gKFxuICAgICEhY2hlY2sgJiZcbiAgICBDWChjaGVjaylgUGFzc2FibGUgRXJyb3IgaGFzIGV4dHJhIHVucGFzc2VkIHByb3BlcnR5ICR7cShwcm9wTmFtZSl9YFxuICApO1xufTskaM2PX29uY2UuY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MoY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MpO1xuaGFyZGVuKGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKTtcblxuLypcblxuXG5cblxuICovXG4gICAgICAgY29uc3QgY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IgPSAoXG4gIGNhbmRpZGF0ZSxcbiAgcGFzc1N0eWxlT2ZSZWN1cixcbiAgY2hlY2sgPSB1bmRlZmluZWQsXG4pID0+IHtcbiAgaWYgKCFjaGVja0Vycm9yTGlrZShjYW5kaWRhdGUsIGNoZWNrKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCBwcm90byA9IGdldFByb3RvdHlwZU9mKGNhbmRpZGF0ZSk7XG4gIGNvbnN0IHsgbmFtZSB9ID0gcHJvdG87XG4gIGNvbnN0IGVyckNvbnN0cnVjdG9yID0gZ2V0RXJyb3JDb25zdHJ1Y3RvcihuYW1lKTtcbiAgaWYgKGVyckNvbnN0cnVjdG9yID09PSB1bmRlZmluZWQgfHwgZXJyQ29uc3RydWN0b3IucHJvdG90eXBlICE9PSBwcm90bykge1xuICAgIHJldHVybiAoXG4gICAgICAhIWNoZWNrICYmXG4gICAgICBDWChcbiAgICAgICAgY2hlY2ssXG4gICAgICApYFBhc3NhYmxlIEVycm9yIG11c3QgaW5oZXJpdCBmcm9tIGFuIGVycm9yIGNsYXNzIC5wcm90b3R5cGU6ICR7Y2FuZGlkYXRlfWBcbiAgICApO1xuICB9XG4gIGNvbnN0IGRlc2NzID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xuICBpZiAoISgnbWVzc2FnZScgaW4gZGVzY3MpKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhY2hlY2sgJiZcbiAgICAgIENYKFxuICAgICAgICBjaGVjayxcbiAgICAgIClgUGFzc2FibGUgRXJyb3IgbXVzdCBoYXZlIGFuIG93biBcIm1lc3NhZ2VcIiBzdHJpbmcgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWBcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGVudHJpZXMoZGVzY3MpLmV2ZXJ5KChbcHJvcE5hbWUsIGRlc2NdKSA9PlxuICAgIGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKFxuICAgICAgcHJvcE5hbWUsXG4gICAgICBkZXNjLFxuICAgICAgcGFzc1N0eWxlT2ZSZWN1cixcbiAgICAgIGNoZWNrLFxuICAgICksXG4gICk7XG59OyRozY9fb25jZS5jaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcihjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcik7XG5oYXJkZW4oY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IpO1xuXG4vKlxuXG4gKi9cbiAgICAgICBjb25zdCBFcnJvckhlbHBlciA9IGhhcmRlbih7XG4gIHN0eWxlTmFtZTogJ2Vycm9yJyxcblxuICBjYW5CZVZhbGlkOiBjaGVja0Vycm9yTGlrZSxcblxuICBhc3NlcnRSZXN0VmFsaWQ6IChjYW5kaWRhdGUsIHBhc3NTdHlsZU9mUmVjdXIpID0+XG4gICAgY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IoY2FuZGlkYXRlLCBwYXNzU3R5bGVPZlJlY3VyLCBhc3NlcnRDaGVja2VyKSxcbn0pOyRozY9fb25jZS5FcnJvckhlbHBlcihFcnJvckhlbHBlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRFcnJvckNvbnN0cnVjdG9yIjpbImdldEVycm9yQ29uc3RydWN0b3IiXSwiaXNFcnJvckxpa2UiOlsiaXNFcnJvckxpa2UiXSwiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MiOlsiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MiXSwiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IiOlsiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IiXSwiRXJyb3JIZWxwZXIiOlsiRXJyb3JIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA06KQfKQGAACkBgAAKwAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9pdGVyLWhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi9tYWtlLWZhci5qcyJdLCJleHBvcnRzIjpbImZpbHRlckl0ZXJhYmxlIiwibWFwSXRlcmFibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYXI7JGjNj19pbXBvcnRzKFtbXCIuL21ha2UtZmFyLmpzXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXV0pO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFwSXRlcmFibGUgPSAoYmFzZUl0ZXJhYmxlLCBmdW5jKSA9PlxuICAvKiAgICAgICAgICAgICAgICAgICAgICAqL1xuICBGYXIoJ21hcHBlZCBpdGVyYWJsZScsIHtcbiAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgY29uc3QgYmFzZUl0ZXJhdG9yID0gYmFzZUl0ZXJhYmxlW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICAgIHJldHVybiBGYXIoJ21hcHBlZCBpdGVyYXRvcicsIHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgdmFsdWU6IGJhc2VWYWx1ZSwgZG9uZSB9ID0gYmFzZUl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGRvbmUgPyBiYXNlVmFsdWUgOiBmdW5jKGJhc2VWYWx1ZSk7XG4gICAgICAgICAgcmV0dXJuIGhhcmRlbih7IHZhbHVlLCBkb25lIH0pO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7JGjNj19vbmNlLm1hcEl0ZXJhYmxlKG1hcEl0ZXJhYmxlKTtcbmhhcmRlbihtYXBJdGVyYWJsZSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBmaWx0ZXJJdGVyYWJsZSA9IChiYXNlSXRlcmFibGUsIHByZWQpID0+XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICovXG4gIEZhcignZmlsdGVyZWQgaXRlcmFibGUnLCB7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIGNvbnN0IGJhc2VJdGVyYXRvciA9IGJhc2VJdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgICByZXR1cm4gRmFyKCdmaWx0ZXJlZCBpdGVyYXRvcicsIHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGJhc2VJdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICBjb25zdCB7IHZhbHVlLCBkb25lIH0gPSByZXN1bHQ7XG4gICAgICAgICAgICBpZiAoZG9uZSB8fCBwcmVkKHZhbHVlKSkge1xuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pOyRozY9fb25jZS5maWx0ZXJJdGVyYWJsZShmaWx0ZXJJdGVyYWJsZSk7XG5oYXJkZW4oZmlsdGVySXRlcmFibGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFwSXRlcmFibGUiOlsibWFwSXRlcmFibGUiXSwiZmlsdGVySXRlcmFibGUiOlsiZmlsdGVySXRlcmFibGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAYnh4idkSAADZEgAAJwAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9tYWtlLWZhci5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzIiwiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vcmVtb3RhYmxlLmpzIl0sImV4cG9ydHMiOlsiRmFyIiwiR0VUX01FVEhPRF9OQU1FUyIsIlJlbW90YWJsZSIsIlRvRmFyRnVuY3Rpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBnZXRNZXRob2ROYW1lcyxxLEZhaWwsYXNzZXJ0Q2hlY2tlcixQQVNTX1NUWUxFLGFzc2VydElmYWNlLGdldEludGVyZmFjZU9mLFJlbW90YWJsZUhlbHBlcjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanNcIiwgW1tcImdldE1ldGhvZE5hbWVzXCIsWyRozY9fYSA9PiAoZ2V0TWV0aG9kTmFtZXMgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiUEFTU19TVFlMRVwiLFskaM2PX2EgPT4gKFBBU1NfU1RZTEUgPSAkaM2PX2EpXV1dXSxbXCIuL3JlbW90YWJsZS5qc1wiLCBbW1wiYXNzZXJ0SWZhY2VcIixbJGjNj19hID0+IChhc3NlcnRJZmFjZSA9ICRozY9fYSldXSxbXCJnZXRJbnRlcmZhY2VPZlwiLFskaM2PX2EgPT4gKGdldEludGVyZmFjZU9mID0gJGjNj19hKV1dLFtcIlJlbW90YWJsZUhlbHBlclwiLFskaM2PX2EgPT4gKFJlbW90YWJsZUhlbHBlciA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCB7IHByb3RvdHlwZTogZnVuY3Rpb25Qcm90b3R5cGUgfSA9IEZ1bmN0aW9uO1xuY29uc3Qge1xuICBnZXRQcm90b3R5cGVPZixcbiAgc2V0UHJvdG90eXBlT2YsXG4gIGNyZWF0ZSxcbiAgaXNGcm96ZW4sXG4gIHByb3RvdHlwZTogb2JqZWN0UHJvdG90eXBlLFxufSA9IE9iamVjdDtcblxuLypcblxuXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlUmVtb3RhYmxlUHJvdG8gPSAocmVtb3RhYmxlLCBpZmFjZSkgPT4ge1xuICBsZXQgb2xkUHJvdG8gPSBnZXRQcm90b3R5cGVPZihyZW1vdGFibGUpO1xuICBpZiAodHlwZW9mIHJlbW90YWJsZSA9PT0gJ29iamVjdCcpIHtcbiAgICBpZiAob2xkUHJvdG8gPT09IG51bGwpIHtcbiAgICAgIG9sZFByb3RvID0gb2JqZWN0UHJvdG90eXBlO1xuICAgIH1cbiAgICBvbGRQcm90byA9PT0gb2JqZWN0UHJvdG90eXBlIHx8XG4gICAgICBGYWlsYEZvciBub3csIHJlbW90YWJsZXMgY2Fubm90IGluaGVyaXQgZnJvbSBhbnl0aGluZyB1bnVzdWFsLCBpbiAke3JlbW90YWJsZX1gO1xuICB9IGVsc2UgaWYgKHR5cGVvZiByZW1vdGFibGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBvbGRQcm90byAhPT0gbnVsbCB8fFxuICAgICAgRmFpbGBPcmlnaW5hbCBmdW5jdGlvbiBtdXN0IG5vdCBpbmhlcml0IGZyb20gbnVsbDogJHtyZW1vdGFibGV9YDtcbiAgICBvbGRQcm90byA9PT0gZnVuY3Rpb25Qcm90b3R5cGUgfHxcbiAgICAgIGdldFByb3RvdHlwZU9mKG9sZFByb3RvKSA9PT0gZnVuY3Rpb25Qcm90b3R5cGUgfHxcbiAgICAgIEZhaWxgRmFyIGZ1bmN0aW9ucyBtdXN0IG9yaWdpbmFsbHkgaW5oZXJpdCBmcm9tIEZ1bmN0aW9uLnByb3RvdHlwZSwgaW4gJHtyZW1vdGFibGV9YDtcbiAgfSBlbHNlIHtcbiAgICBGYWlsYHVucmVjb2duaXplZCB0eXBlb2YgJHtyZW1vdGFibGV9YDtcbiAgfVxuICByZXR1cm4gaGFyZGVuKFxuICAgIGNyZWF0ZShvbGRQcm90bywge1xuICAgICAgW1BBU1NfU1RZTEVdOiB7IHZhbHVlOiAncmVtb3RhYmxlJyB9LFxuICAgICAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHsgdmFsdWU6IGlmYWNlIH0sXG4gICAgfSksXG4gICk7XG59O1xuXG5jb25zdCBhc3NlcnRDYW5CZVJlbW90YWJsZSA9IGNhbmRpZGF0ZSA9PlxuICBSZW1vdGFibGVIZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsIGFzc2VydENoZWNrZXIpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgUmVtb3RhYmxlID0gKFxuICAvL1xuICBpZmFjZSA9ICdSZW1vdGFibGUnLFxuICBwcm9wcyA9IHVuZGVmaW5lZCxcbiAgcmVtb3RhYmxlID0gLyogICAgICAgICAgICAqLyAoe30pLFxuKSA9PiB7XG4gIGFzc2VydElmYWNlKGlmYWNlKTtcbiAgYXNzZXJ0KGlmYWNlKTtcbiAgLy9cbiAgLy9cbiAgcHJvcHMgPT09IHVuZGVmaW5lZCB8fCBGYWlsYFJlbW90YWJsZSBwcm9wcyBub3QgeWV0IGltcGxlbWVudGVkICR7cHJvcHN9YDtcblxuICAvL1xuICBhc3NlcnRDYW5CZVJlbW90YWJsZShyZW1vdGFibGUpO1xuXG4gIC8vXG4gICEoUEFTU19TVFlMRSBpbiByZW1vdGFibGUpIHx8XG4gICAgRmFpbGBSZW1vdGFibGUgJHtyZW1vdGFibGV9IGlzIGFscmVhZHkgbWFya2VkIGFzIGEgJHtxKFxuICAgICAgcmVtb3RhYmxlW1BBU1NfU1RZTEVdLFxuICAgICl9YDtcbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgaGFyZGVuLmlzRmFrZSB8fFxuICAgIC8vXG4gICAgIWlzRnJvemVuKHJlbW90YWJsZSkgfHxcbiAgICBGYWlsYFJlbW90YWJsZSAke3JlbW90YWJsZX0gaXMgYWxyZWFkeSBmcm96ZW5gO1xuICBjb25zdCByZW1vdGFibGVQcm90byA9IG1ha2VSZW1vdGFibGVQcm90byhyZW1vdGFibGUsIGlmYWNlKTtcblxuICAvL1xuICAvL1xuICBjb25zdCBtdXRhdGVIYXJkZW5BbmRDaGVjayA9IHRhcmdldCA9PiB7XG4gICAgLy9cbiAgICBzZXRQcm90b3R5cGVPZih0YXJnZXQsIHJlbW90YWJsZVByb3RvKTtcbiAgICBoYXJkZW4odGFyZ2V0KTtcbiAgICBhc3NlcnRDYW5CZVJlbW90YWJsZSh0YXJnZXQpO1xuICB9O1xuXG4gIC8vXG4gIG11dGF0ZUhhcmRlbkFuZENoZWNrKHt9KTtcblxuICAvL1xuICBtdXRhdGVIYXJkZW5BbmRDaGVjayhyZW1vdGFibGUpO1xuXG4gIC8vXG4gIC8vXG4gIGFzc2VydChpZmFjZSAhPT0gdW5kZWZpbmVkKTsgLy9cbiAgcmV0dXJuIC8qICAgICAgICAgICAgICAqLyAocmVtb3RhYmxlKTtcbn07JGjNj19vbmNlLlJlbW90YWJsZShSZW1vdGFibGUpO1xuaGFyZGVuKFJlbW90YWJsZSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBHRVRfTUVUSE9EX05BTUVTID0gJ19fZ2V0TWV0aG9kTmFtZXNfXyc7XG5cbi8qXG5cblxuXG5cbiAqLyRozY9fb25jZS5HRVRfTUVUSE9EX05BTUVTKEdFVF9NRVRIT0RfTkFNRVMpO1xuY29uc3QgZ2V0TWV0aG9kTmFtZXNNZXRob2QgPSBoYXJkZW4oe1xuICBbR0VUX01FVEhPRF9OQU1FU10oKSB7XG4gICAgcmV0dXJuIGdldE1ldGhvZE5hbWVzKHRoaXMpO1xuICB9LFxufSlbR0VUX01FVEhPRF9OQU1FU107XG5cbmNvbnN0IGdldE1ldGhvZE5hbWVzRGVzY3JpcHRvciA9IGhhcmRlbih7XG4gIHZhbHVlOiBnZXRNZXRob2ROYW1lc01ldGhvZCxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gIHdyaXRhYmxlOiBmYWxzZSxcbn0pO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgRmFyID0gKGZhck5hbWUsIHJlbW90YWJsZSA9IHVuZGVmaW5lZCkgPT4ge1xuICBjb25zdCByID0gcmVtb3RhYmxlID09PSB1bmRlZmluZWQgPyAvKiAgICAgICAgICAgICovICh7fSkgOiByZW1vdGFibGU7XG4gIGlmICh0eXBlb2YgciA9PT0gJ29iamVjdCcgJiYgIShHRVRfTUVUSE9EX05BTUVTIGluIHIpKSB7XG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkociwgR0VUX01FVEhPRF9OQU1FUywgZ2V0TWV0aG9kTmFtZXNEZXNjcmlwdG9yKTtcbiAgfVxuICByZXR1cm4gUmVtb3RhYmxlKGBBbGxlZ2VkOiAke2Zhck5hbWV9YCwgdW5kZWZpbmVkLCByKTtcbn07JGjNj19vbmNlLkZhcihGYXIpO1xuaGFyZGVuKEZhcik7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBUb0ZhckZ1bmN0aW9uID0gKGZhck5hbWUsIGZ1bmMpID0+IHtcbiAgaWYgKGdldEludGVyZmFjZU9mKGZ1bmMpICE9PSB1bmRlZmluZWQpIHtcbiAgICAvL1xuICAgIHJldHVybiBmdW5jO1xuICB9XG4gIC8vXG4gIHJldHVybiBGYXIoZmFyTmFtZSwgKC4uLmFyZ3MpID0+IGZ1bmMoLi4uYXJncykpO1xufTskaM2PX29uY2UuVG9GYXJGdW5jdGlvbihUb0ZhckZ1bmN0aW9uKTtcbmhhcmRlbihUb0ZhckZ1bmN0aW9uKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlJlbW90YWJsZSI6WyJSZW1vdGFibGUiXSwiR0VUX01FVEhPRF9OQU1FUyI6WyJHRVRfTUVUSE9EX05BTUVTIl0sIkZhciI6WyJGYXIiXSwiVG9GYXJGdW5jdGlvbiI6WyJUb0ZhckZ1bmN0aW9uIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAE3BiNPcBAAA3AQAACkAAABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvbWFrZVRhZ2dlZC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9wYXNzU3R5bGVPZi5qcyJdLCJleHBvcnRzIjpbIm1ha2VUYWdnZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLFBBU1NfU1RZTEUsYXNzZXJ0UGFzc2FibGU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiUEFTU19TVFlMRVwiLFskaM2PX2EgPT4gKFBBU1NfU1RZTEUgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVwiLFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4vKlxuXG4gKi9cblxuY29uc3QgeyBjcmVhdGUsIHByb3RvdHlwZTogb2JqZWN0UHJvdG90eXBlIH0gPSBPYmplY3Q7XG5cbi8qXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgbWFrZVRhZ2dlZCA9ICh0YWcsIHBheWxvYWQpID0+IHtcbiAgdHlwZW9mIHRhZyA9PT0gJ3N0cmluZycgfHxcbiAgICBGYWlsYFRoZSB0YWcgb2YgYSB0YWdnZWQgcmVjb3JkIG11c3QgYmUgYSBzdHJpbmc6ICR7dGFnfWA7XG4gIGFzc2VydFBhc3NhYmxlKGhhcmRlbihwYXlsb2FkKSk7XG4gIHJldHVybiBoYXJkZW4oXG4gICAgY3JlYXRlKG9iamVjdFByb3RvdHlwZSwge1xuICAgICAgW1BBU1NfU1RZTEVdOiB7IHZhbHVlOiAndGFnZ2VkJyB9LFxuICAgICAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHsgdmFsdWU6IHRhZyB9LFxuICAgICAgcGF5bG9hZDogeyB2YWx1ZTogcGF5bG9hZCwgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIH0pLFxuICApO1xufTskaM2PX29uY2UubWFrZVRhZ2dlZChtYWtlVGFnZ2VkKTtcbmhhcmRlbihtYWtlVGFnZ2VkKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VUYWdnZWQiOlsibWFrZVRhZ2dlZCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABwRFyEohcAAKIXAAAwAAAAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIkNYIiwiUEFTU19TVFlMRSIsImFzc2VydENoZWNrZXIiLCJjYW5CZU1ldGhvZCIsImNoZWNrRnVuY3Rpb25UYWdSZWNvcmQiLCJjaGVja1Bhc3NTdHlsZSIsImNoZWNrVGFnUmVjb3JkIiwiZ2V0T3duRGF0YURlc2NyaXB0b3IiLCJnZXRUYWciLCJoYXNPd25Qcm9wZXJ0eU9mIiwiaXNPYmplY3QiLCJpc1R5cGVkQXJyYXkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBYLHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cbmNvbnN0IHsgaXNBcnJheSB9ID0gQXJyYXk7XG5jb25zdCB7IHByb3RvdHlwZTogZnVuY3Rpb25Qcm90b3R5cGUgfSA9IEZ1bmN0aW9uO1xuY29uc3Qge1xuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsXG4gIGdldFByb3RvdHlwZU9mLFxuICBoYXNPd25Qcm9wZXJ0eTogb2JqZWN0SGFzT3duUHJvcGVydHksXG4gIGlzRnJvemVuLFxuICBwcm90b3R5cGU6IG9iamVjdFByb3RvdHlwZSxcbn0gPSBPYmplY3Q7XG5jb25zdCB7IGFwcGx5IH0gPSBSZWZsZWN0O1xuY29uc3QgeyB0b1N0cmluZ1RhZzogdG9TdHJpbmdUYWdTeW1ib2wgfSA9IFN5bWJvbDtcblxuY29uc3QgdHlwZWRBcnJheVByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKFVpbnQ4QXJyYXkucHJvdG90eXBlKTtcbmNvbnN0IHR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2MgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoXG4gIHR5cGVkQXJyYXlQcm90b3R5cGUsXG4gIHRvU3RyaW5nVGFnU3ltYm9sLFxuKTtcbmFzc2VydCh0eXBlZEFycmF5VG9TdHJpbmdUYWdEZXNjKTtcbmNvbnN0IGdldFR5cGVkQXJyYXlUb1N0cmluZ1RhZyA9IHR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2MuZ2V0O1xuYXNzZXJ0KHR5cGVvZiBnZXRUeXBlZEFycmF5VG9TdHJpbmdUYWcgPT09ICdmdW5jdGlvbicpO1xuXG4gICAgICAgY29uc3QgaGFzT3duUHJvcGVydHlPZiA9IChvYmosIHByb3ApID0+XG4gIGFwcGx5KG9iamVjdEhhc093blByb3BlcnR5LCBvYmosIFtwcm9wXSk7JGjNj19vbmNlLmhhc093blByb3BlcnR5T2YoaGFzT3duUHJvcGVydHlPZik7XG5oYXJkZW4oaGFzT3duUHJvcGVydHlPZik7XG5cbi8vXG4gICAgICAgY29uc3QgaXNPYmplY3QgPSB2YWwgPT4gT2JqZWN0KHZhbCkgPT09IHZhbDskaM2PX29uY2UuaXNPYmplY3QoaXNPYmplY3QpO1xuaGFyZGVuKGlzT2JqZWN0KTtcblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGlzVHlwZWRBcnJheSA9IG9iamVjdCA9PiB7XG4gIC8vXG4gIGNvbnN0IHRhZyA9IGFwcGx5KGdldFR5cGVkQXJyYXlUb1N0cmluZ1RhZywgb2JqZWN0LCBbXSk7XG4gIHJldHVybiB0YWcgIT09IHVuZGVmaW5lZDtcbn07JGjNj19vbmNlLmlzVHlwZWRBcnJheShpc1R5cGVkQXJyYXkpO1xuaGFyZGVuKGlzVHlwZWRBcnJheSk7XG5cbiAgICAgICBjb25zdCBQQVNTX1NUWUxFID0gU3ltYm9sLmZvcigncGFzc1N0eWxlJyk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovJGjNj19vbmNlLlBBU1NfU1RZTEUoUEFTU19TVFlMRSk7XG4gICAgICAgY29uc3QgY2FuQmVNZXRob2QgPSBmdW5jID0+XG4gIHR5cGVvZiBmdW5jID09PSAnZnVuY3Rpb24nICYmICEoUEFTU19TVFlMRSBpbiBmdW5jKTskaM2PX29uY2UuY2FuQmVNZXRob2QoY2FuQmVNZXRob2QpO1xuaGFyZGVuKGNhbkJlTWV0aG9kKTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydENoZWNrZXIgPSAoY29uZCwgZGV0YWlscykgPT4ge1xuICBhc3NlcnQoY29uZCwgZGV0YWlscyk7XG4gIHJldHVybiB0cnVlO1xufTskaM2PX29uY2UuYXNzZXJ0Q2hlY2tlcihhc3NlcnRDaGVja2VyKTtcbmhhcmRlbihhc3NlcnRDaGVja2VyKTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgQ1ggPSBjaGVjayA9PiB7XG4gIGNvbnN0IHJlamVjdCA9IChULCAuLi5zdWJzKSA9PiBjaGVjayhmYWxzZSwgWChULCAuLi5zdWJzKSk7XG4gIHJldHVybiByZWplY3Q7XG59OyRozY9fb25jZS5DWChDWCk7XG5oYXJkZW4oQ1gpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGdldE93bkRhdGFEZXNjcmlwdG9yID0gKFxuICBjYW5kaWRhdGUsXG4gIHByb3BOYW1lLFxuICBzaG91bGRCZUVudW1lcmFibGUsXG4gIGNoZWNrLFxuKSA9PiB7XG4gIGNvbnN0IGRlc2MgPSAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKFxuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihjYW5kaWRhdGUsIHByb3BOYW1lKVxuICApO1xuICByZXR1cm4gKGRlc2MgIT09IHVuZGVmaW5lZCB8fFxuICAgICghIWNoZWNrICYmIENYKGNoZWNrKWAke3EocHJvcE5hbWUpfSBwcm9wZXJ0eSBleHBlY3RlZDogJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgKGhhc093blByb3BlcnR5T2YoZGVzYywgJ3ZhbHVlJykgfHxcbiAgICAgICghIWNoZWNrICYmXG4gICAgICAgIENYKFxuICAgICAgICAgIGNoZWNrLFxuICAgICAgICApYCR7cShwcm9wTmFtZSl9IG11c3Qgbm90IGJlIGFuIGFjY2Vzc29yIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgICAoc2hvdWxkQmVFbnVtZXJhYmxlXG4gICAgICA/IGRlc2MuZW51bWVyYWJsZSB8fFxuICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgIENYKFxuICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgKWAke3EocHJvcE5hbWUpfSBtdXN0IGJlIGFuIGVudW1lcmFibGUgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWApXG4gICAgICA6ICFkZXNjLmVudW1lcmFibGUgfHxcbiAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICBDWChcbiAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgIClgJHtxKHByb3BOYW1lKX0gbXVzdCBub3QgYmUgYW4gZW51bWVyYWJsZSBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YCkpXG4gICAgPyBkZXNjXG4gICAgOiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gKC8qICAgICAgICAgICAgICAgICAgKi8gKHVuZGVmaW5lZCkpO1xufTskaM2PX29uY2UuZ2V0T3duRGF0YURlc2NyaXB0b3IoZ2V0T3duRGF0YURlc2NyaXB0b3IpO1xuaGFyZGVuKGdldE93bkRhdGFEZXNjcmlwdG9yKTtcblxuLypcblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGdldFRhZyA9IHRhZ1JlY29yZCA9PiB0YWdSZWNvcmRbU3ltYm9sLnRvU3RyaW5nVGFnXTskaM2PX29uY2UuZ2V0VGFnKGdldFRhZyk7XG5oYXJkZW4oZ2V0VGFnKTtcblxuICAgICAgIGNvbnN0IGNoZWNrUGFzc1N0eWxlID0gKG9iaiwgcGFzc1N0eWxlLCBleHBlY3RlZFBhc3NTdHlsZSwgY2hlY2spID0+IHtcbiAgcmV0dXJuIChcbiAgICBwYXNzU3R5bGUgPT09IGV4cGVjdGVkUGFzc1N0eWxlIHx8XG4gICAgKCEhY2hlY2sgJiZcbiAgICAgIENYKGNoZWNrKWBFeHBlY3RlZCAke3EoZXhwZWN0ZWRQYXNzU3R5bGUpfSwgbm90ICR7cShwYXNzU3R5bGUpfTogJHtvYmp9YClcbiAgKTtcbn07JGjNj19vbmNlLmNoZWNrUGFzc1N0eWxlKGNoZWNrUGFzc1N0eWxlKTtcbmhhcmRlbihjaGVja1Bhc3NTdHlsZSk7XG5cbmNvbnN0IG1ha2VDaGVja1RhZ1JlY29yZCA9IGNoZWNrUHJvdG8gPT4ge1xuICAvKlxuXG5cblxuXG4gICAqL1xuICBjb25zdCBjaGVja1RhZ1JlY29yZCA9ICh0YWdSZWNvcmQsIGV4cGVjdGVkUGFzc1N0eWxlLCBjaGVjaykgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICAoaXNPYmplY3QodGFnUmVjb3JkKSB8fFxuICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgIENYKGNoZWNrKWBBIG5vbi1vYmplY3QgY2Fubm90IGJlIGEgdGFnUmVjb3JkOiAke3RhZ1JlY29yZH1gKSkgJiZcbiAgICAgIChpc0Zyb3plbih0YWdSZWNvcmQpIHx8XG4gICAgICAgICghIWNoZWNrICYmIENYKGNoZWNrKWBBIHRhZ1JlY29yZCBtdXN0IGJlIGZyb3plbjogJHt0YWdSZWNvcmR9YCkpICYmXG4gICAgICAoIWlzQXJyYXkodGFnUmVjb3JkKSB8fFxuICAgICAgICAoISFjaGVjayAmJiBDWChjaGVjaylgQW4gYXJyYXkgY2Fubm90IGJlIGEgdGFnUmVjb3JkOiAke3RhZ1JlY29yZH1gKSkgJiZcbiAgICAgIGNoZWNrUGFzc1N0eWxlKFxuICAgICAgICB0YWdSZWNvcmQsXG4gICAgICAgIGdldE93bkRhdGFEZXNjcmlwdG9yKHRhZ1JlY29yZCwgUEFTU19TVFlMRSwgZmFsc2UsIGNoZWNrKS52YWx1ZSxcbiAgICAgICAgZXhwZWN0ZWRQYXNzU3R5bGUsXG4gICAgICAgIGNoZWNrLFxuICAgICAgKSAmJlxuICAgICAgKHR5cGVvZiBnZXRPd25EYXRhRGVzY3JpcHRvcih0YWdSZWNvcmQsIFN5bWJvbC50b1N0cmluZ1RhZywgZmFsc2UsIGNoZWNrKVxuICAgICAgICAudmFsdWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgQ1goXG4gICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICApYEEgW1N5bWJvbC50b1N0cmluZ1RhZ10tbmFtZWQgcHJvcGVydHkgbXVzdCBiZSBhIHN0cmluZzogJHt0YWdSZWNvcmR9YCkpICYmXG4gICAgICBjaGVja1Byb3RvKHRhZ1JlY29yZCwgZ2V0UHJvdG90eXBlT2YodGFnUmVjb3JkKSwgY2hlY2spXG4gICAgKTtcbiAgfTtcbiAgcmV0dXJuIGhhcmRlbihjaGVja1RhZ1JlY29yZCk7XG59O1xuXG4gICAgICAgY29uc3QgY2hlY2tUYWdSZWNvcmQgPSBtYWtlQ2hlY2tUYWdSZWNvcmQoXG4gICh2YWwsIHByb3RvLCBjaGVjaykgPT5cbiAgICBwcm90byA9PT0gb2JqZWN0UHJvdG90eXBlIHx8XG4gICAgKCEhY2hlY2sgJiZcbiAgICAgIGNoZWNrKGZhbHNlLCBYYEEgdGFnUmVjb3JkIG11c3QgaW5oZXJpdCBmcm9tIE9iamVjdC5wcm90b3R5cGU6ICR7dmFsfWApKSxcbik7JGjNj19vbmNlLmNoZWNrVGFnUmVjb3JkKGNoZWNrVGFnUmVjb3JkKTtcbmhhcmRlbihjaGVja1RhZ1JlY29yZCk7XG5cbiAgICAgICBjb25zdCBjaGVja0Z1bmN0aW9uVGFnUmVjb3JkID0gbWFrZUNoZWNrVGFnUmVjb3JkKFxuICAodmFsLCBwcm90bywgY2hlY2spID0+XG4gICAgcHJvdG8gPT09IGZ1bmN0aW9uUHJvdG90eXBlIHx8XG4gICAgKHByb3RvICE9PSBudWxsICYmIGdldFByb3RvdHlwZU9mKHByb3RvKSA9PT0gZnVuY3Rpb25Qcm90b3R5cGUpIHx8XG4gICAgKCEhY2hlY2sgJiZcbiAgICAgIGNoZWNrKFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgWGBGb3IgZnVuY3Rpb25zLCBhIHRhZ1JlY29yZCBtdXN0IGluaGVyaXQgZnJvbSBGdW5jdGlvbi5wcm90b3R5cGU6ICR7dmFsfWAsXG4gICAgICApKSxcbik7JGjNj19vbmNlLmNoZWNrRnVuY3Rpb25UYWdSZWNvcmQoY2hlY2tGdW5jdGlvblRhZ1JlY29yZCk7XG5oYXJkZW4oY2hlY2tGdW5jdGlvblRhZ1JlY29yZCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJoYXNPd25Qcm9wZXJ0eU9mIjpbImhhc093blByb3BlcnR5T2YiXSwiaXNPYmplY3QiOlsiaXNPYmplY3QiXSwiaXNUeXBlZEFycmF5IjpbImlzVHlwZWRBcnJheSJdLCJQQVNTX1NUWUxFIjpbIlBBU1NfU1RZTEUiXSwiY2FuQmVNZXRob2QiOlsiY2FuQmVNZXRob2QiXSwiYXNzZXJ0Q2hlY2tlciI6WyJhc3NlcnRDaGVja2VyIl0sIkNYIjpbIkNYIl0sImdldE93bkRhdGFEZXNjcmlwdG9yIjpbImdldE93bkRhdGFEZXNjcmlwdG9yIl0sImdldFRhZyI6WyJnZXRUYWciXSwiY2hlY2tQYXNzU3R5bGUiOlsiY2hlY2tQYXNzU3R5bGUiXSwiY2hlY2tUYWdSZWNvcmQiOlsiY2hlY2tUYWdSZWNvcmQiXSwiY2hlY2tGdW5jdGlvblRhZ1JlY29yZCI6WyJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAydba3TKwAA0ysAACoAAABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvcGFzc1N0eWxlT2YuanN7ImltcG9ydHMiOlsiQGVuZG8vcHJvbWlzZS1raXQiLCJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9jb3B5QXJyYXkuanMiLCIuL2NvcHlSZWNvcmQuanMiLCIuL3RhZ2dlZC5qcyIsIi4vZXJyb3IuanMiLCIuL3JlbW90YWJsZS5qcyIsIi4vc3ltYm9sLmpzIiwiLi9zYWZlLXByb21pc2UuanMiLCIuL3N0cmluZy5qcyJdLCJleHBvcnRzIjpbIlBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sIiwiYXNzZXJ0UGFzc2FibGUiLCJpc1Bhc3NhYmxlIiwicGFzc1N0eWxlT2YiLCJ0b1Bhc3NhYmxlRXJyb3IiLCJ0b1Rocm93YWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGlzUHJvbWlzZSxYLEZhaWwscSxhbm5vdGF0ZUVycm9yLG1ha2VFcnJvcixpc09iamVjdCxpc1R5cGVkQXJyYXksUEFTU19TVFlMRSxhc3NlcnRDaGVja2VyLENvcHlBcnJheUhlbHBlcixDb3B5UmVjb3JkSGVscGVyLFRhZ2dlZEhlbHBlcixFcnJvckhlbHBlcixjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyxjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcixnZXRFcnJvckNvbnN0cnVjdG9yLGlzRXJyb3JMaWtlLFJlbW90YWJsZUhlbHBlcixhc3NlcnRQYXNzYWJsZVN5bWJvbCxhc3NlcnRTYWZlUHJvbWlzZSxhc3NlcnRQYXNzYWJsZVN0cmluZzskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIixbJGjNj19hID0+IChpc1Byb21pc2UgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcImFubm90YXRlRXJyb3JcIixbJGjNj19hID0+IChhbm5vdGF0ZUVycm9yID0gJGjNj19hKV1dLFtcIm1ha2VFcnJvclwiLFskaM2PX2EgPT4gKG1ha2VFcnJvciA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImlzT2JqZWN0XCIsWyRozY9fYSA9PiAoaXNPYmplY3QgPSAkaM2PX2EpXV0sW1wiaXNUeXBlZEFycmF5XCIsWyRozY9fYSA9PiAoaXNUeXBlZEFycmF5ID0gJGjNj19hKV1dLFtcIlBBU1NfU1RZTEVcIixbJGjNj19hID0+IChQQVNTX1NUWUxFID0gJGjNj19hKV1dLFtcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dXV0sW1wiLi9jb3B5QXJyYXkuanNcIiwgW1tcIkNvcHlBcnJheUhlbHBlclwiLFskaM2PX2EgPT4gKENvcHlBcnJheUhlbHBlciA9ICRozY9fYSldXV1dLFtcIi4vY29weVJlY29yZC5qc1wiLCBbW1wiQ29weVJlY29yZEhlbHBlclwiLFskaM2PX2EgPT4gKENvcHlSZWNvcmRIZWxwZXIgPSAkaM2PX2EpXV1dXSxbXCIuL3RhZ2dlZC5qc1wiLCBbW1wiVGFnZ2VkSGVscGVyXCIsWyRozY9fYSA9PiAoVGFnZ2VkSGVscGVyID0gJGjNj19hKV1dXV0sW1wiLi9lcnJvci5qc1wiLCBbW1wiRXJyb3JIZWxwZXJcIixbJGjNj19hID0+IChFcnJvckhlbHBlciA9ICRozY9fYSldXSxbXCJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzY1wiLFskaM2PX2EgPT4gKGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjID0gJGjNj19hKV1dLFtcImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yXCIsWyRozY9fYSA9PiAoY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IgPSAkaM2PX2EpXV0sW1wiZ2V0RXJyb3JDb25zdHJ1Y3RvclwiLFskaM2PX2EgPT4gKGdldEVycm9yQ29uc3RydWN0b3IgPSAkaM2PX2EpXV0sW1wiaXNFcnJvckxpa2VcIixbJGjNj19hID0+IChpc0Vycm9yTGlrZSA9ICRozY9fYSldXV1dLFtcIi4vcmVtb3RhYmxlLmpzXCIsIFtbXCJSZW1vdGFibGVIZWxwZXJcIixbJGjNj19hID0+IChSZW1vdGFibGVIZWxwZXIgPSAkaM2PX2EpXV1dXSxbXCIuL3N5bWJvbC5qc1wiLCBbW1wiYXNzZXJ0UGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXV1dLFtcIi4vc2FmZS1wcm9taXNlLmpzXCIsIFtbXCJhc3NlcnRTYWZlUHJvbWlzZVwiLFskaM2PX2EgPT4gKGFzc2VydFNhZmVQcm9taXNlID0gJGjNj19hKV1dXV0sW1wiLi9zdHJpbmcuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlU3RyaW5nXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGFzc2FibGVTdHJpbmcgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGlzRnJvemVuLCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLCB2YWx1ZXMgfSA9IE9iamVjdDtcblxuLypcblxuXG4gKi9cblxuY29uc3QgbWFrZUhlbHBlclRhYmxlID0gcGFzc1N0eWxlSGVscGVycyA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCBIZWxwZXJUYWJsZSA9IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgY29weUFycmF5OiB1bmRlZmluZWQsXG4gICAgY29weVJlY29yZDogdW5kZWZpbmVkLFxuICAgIHRhZ2dlZDogdW5kZWZpbmVkLFxuICAgIGVycm9yOiB1bmRlZmluZWQsXG4gICAgcmVtb3RhYmxlOiB1bmRlZmluZWQsXG4gIH07XG4gIGZvciAoY29uc3QgaGVscGVyIG9mIHBhc3NTdHlsZUhlbHBlcnMpIHtcbiAgICBjb25zdCB7IHN0eWxlTmFtZSB9ID0gaGVscGVyO1xuICAgIHN0eWxlTmFtZSBpbiBIZWxwZXJUYWJsZSB8fCBGYWlsYFVucmVjb2duaXplZCBoZWxwZXI6ICR7cShzdHlsZU5hbWUpfWA7XG4gICAgSGVscGVyVGFibGVbc3R5bGVOYW1lXSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICBGYWlsYGNvbmZsaWN0aW5nIGhlbHBlcnMgZm9yICR7cShzdHlsZU5hbWUpfWA7XG4gICAgSGVscGVyVGFibGVbc3R5bGVOYW1lXSA9IGhlbHBlcjtcbiAgfVxuICBmb3IgKGNvbnN0IHN0eWxlTmFtZSBvZiBvd25LZXlzKEhlbHBlclRhYmxlKSkge1xuICAgIEhlbHBlclRhYmxlW3N0eWxlTmFtZV0gIT09IHVuZGVmaW5lZCB8fFxuICAgICAgRmFpbGBtaXNzaW5nIGhlbHBlciBmb3IgJHtxKHN0eWxlTmFtZSl9YDtcbiAgfVxuXG4gIHJldHVybiBoYXJkZW4oSGVscGVyVGFibGUpO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IGFzc2VydFZhbGlkID0gKGhlbHBlciwgY2FuZGlkYXRlLCBwYXNzU3R5bGVPZlJlY3VyKSA9PiB7XG4gIGhlbHBlci5jYW5CZVZhbGlkKGNhbmRpZGF0ZSwgYXNzZXJ0Q2hlY2tlcik7XG4gIGhlbHBlci5hc3NlcnRSZXN0VmFsaWQoY2FuZGlkYXRlLCBwYXNzU3R5bGVPZlJlY3VyKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBtYWtlUGFzc1N0eWxlT2YgPSBwYXNzU3R5bGVIZWxwZXJzID0+IHtcbiAgY29uc3QgSGVscGVyVGFibGUgPSBtYWtlSGVscGVyVGFibGUocGFzc1N0eWxlSGVscGVycyk7XG4gIGNvbnN0IHJlbW90YWJsZUhlbHBlciA9IEhlbHBlclRhYmxlLnJlbW90YWJsZTtcblxuICAvKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IHBhc3NTdHlsZU1lbW8gPSBuZXcgV2Vha01hcCgpO1xuXG4gIC8qXG5cbiAgICovXG4gIC8vXG4gIGNvbnN0IHBhc3NTdHlsZU9mID0gcGFzc2FibGUgPT4ge1xuICAgIC8vXG4gICAgLy9cbiAgICAvL1xuICAgIGNvbnN0IGluUHJvZ3Jlc3MgPSBuZXcgU2V0KCk7XG5cbiAgICBjb25zdCBwYXNzU3R5bGVPZlJlY3VyID0gaW5uZXIgPT4ge1xuICAgICAgY29uc3QgaW5uZXJJc09iamVjdCA9IGlzT2JqZWN0KGlubmVyKTtcbiAgICAgIGlmIChpbm5lcklzT2JqZWN0KSB7XG4gICAgICAgIGNvbnN0IGlubmVyU3R5bGUgPSBwYXNzU3R5bGVNZW1vLmdldChpbm5lcik7XG4gICAgICAgIGlmIChpbm5lclN0eWxlKSB7XG4gICAgICAgICAgcmV0dXJuIGlubmVyU3R5bGU7XG4gICAgICAgIH1cbiAgICAgICAgIWluUHJvZ3Jlc3MuaGFzKGlubmVyKSB8fFxuICAgICAgICAgIEZhaWxgUGFzcy1ieS1jb3B5IGRhdGEgY2Fubm90IGJlIGN5Y2xpYyAke2lubmVyfWA7XG4gICAgICAgIGluUHJvZ3Jlc3MuYWRkKGlubmVyKTtcbiAgICAgIH1cbiAgICAgIC8vXG4gICAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZkludGVybmFsKGlubmVyKTtcbiAgICAgIGlmIChpbm5lcklzT2JqZWN0KSB7XG4gICAgICAgIHBhc3NTdHlsZU1lbW8uc2V0KGlubmVyLCBwYXNzU3R5bGUpO1xuICAgICAgICBpblByb2dyZXNzLmRlbGV0ZShpbm5lcik7XG4gICAgICB9XG4gICAgICByZXR1cm4gcGFzc1N0eWxlO1xuICAgIH07XG5cbiAgICBjb25zdCBwYXNzU3R5bGVPZkludGVybmFsID0gaW5uZXIgPT4ge1xuICAgICAgY29uc3QgdHlwZXN0ciA9IHR5cGVvZiBpbm5lcjtcbiAgICAgIHN3aXRjaCAodHlwZXN0cikge1xuICAgICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICBjYXNlICdib29sZWFuJzpcbiAgICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICAgIHJldHVybiB0eXBlc3RyO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N0cmluZyc6IHtcbiAgICAgICAgICBhc3NlcnRQYXNzYWJsZVN0cmluZyhpbm5lcik7XG4gICAgICAgICAgcmV0dXJuICdzdHJpbmcnO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgICBhc3NlcnRQYXNzYWJsZVN5bWJvbChpbm5lcik7XG4gICAgICAgICAgcmV0dXJuICdzeW1ib2wnO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ29iamVjdCc6IHtcbiAgICAgICAgICBpZiAoaW5uZXIgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiAnbnVsbCc7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICghaXNGcm96ZW4oaW5uZXIpKSB7XG4gICAgICAgICAgICBhc3NlcnQuZmFpbChcbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgLy9cbiAgICAgICAgICAgICAgaXNUeXBlZEFycmF5KGlubmVyKVxuICAgICAgICAgICAgICAgID8gWGBDYW5ub3QgcGFzcyBtdXRhYmxlIHR5cGVkIGFycmF5cyBsaWtlICR7aW5uZXJ9LmBcbiAgICAgICAgICAgICAgICA6IFhgQ2Fubm90IHBhc3Mgbm9uLWZyb3plbiBvYmplY3RzIGxpa2UgJHtpbm5lcn0uIFVzZSBoYXJkZW4oKWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNQcm9taXNlKGlubmVyKSkge1xuICAgICAgICAgICAgYXNzZXJ0U2FmZVByb21pc2UoaW5uZXIpO1xuICAgICAgICAgICAgcmV0dXJuICdwcm9taXNlJztcbiAgICAgICAgICB9XG4gICAgICAgICAgdHlwZW9mIGlubmVyLnRoZW4gIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgICAgIEZhaWxgQ2Fubm90IHBhc3Mgbm9uLXByb21pc2UgdGhlbmFibGVzYDtcbiAgICAgICAgICBjb25zdCBwYXNzU3R5bGVUYWcgPSBpbm5lcltQQVNTX1NUWUxFXTtcbiAgICAgICAgICBpZiAocGFzc1N0eWxlVGFnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGFzc2VydC50eXBlb2YocGFzc1N0eWxlVGFnLCAnc3RyaW5nJyk7XG4gICAgICAgICAgICBjb25zdCBoZWxwZXIgPSBIZWxwZXJUYWJsZVtwYXNzU3R5bGVUYWddO1xuICAgICAgICAgICAgaGVscGVyICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgRmFpbGBVbnJlY29nbml6ZWQgUGFzc1N0eWxlOiAke3EocGFzc1N0eWxlVGFnKX1gO1xuICAgICAgICAgICAgYXNzZXJ0VmFsaWQoaGVscGVyLCBpbm5lciwgcGFzc1N0eWxlT2ZSZWN1cik7XG4gICAgICAgICAgICByZXR1cm4gLyogICAgICAgICAgICAgICAgICAgICovIChwYXNzU3R5bGVUYWcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKGNvbnN0IGhlbHBlciBvZiBwYXNzU3R5bGVIZWxwZXJzKSB7XG4gICAgICAgICAgICBpZiAoaGVscGVyLmNhbkJlVmFsaWQoaW5uZXIpKSB7XG4gICAgICAgICAgICAgIGhlbHBlci5hc3NlcnRSZXN0VmFsaWQoaW5uZXIsIHBhc3NTdHlsZU9mUmVjdXIpO1xuICAgICAgICAgICAgICByZXR1cm4gaGVscGVyLnN0eWxlTmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYXNzZXJ0VmFsaWQocmVtb3RhYmxlSGVscGVyLCBpbm5lciwgcGFzc1N0eWxlT2ZSZWN1cik7XG4gICAgICAgICAgcmV0dXJuICdyZW1vdGFibGUnO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2Z1bmN0aW9uJzoge1xuICAgICAgICAgIGlzRnJvemVuKGlubmVyKSB8fFxuICAgICAgICAgICAgRmFpbGBDYW5ub3QgcGFzcyBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke2lubmVyfS4gVXNlIGhhcmRlbigpYDtcbiAgICAgICAgICB0eXBlb2YgaW5uZXIudGhlbiAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICAgICAgRmFpbGBDYW5ub3QgcGFzcyBub24tcHJvbWlzZSB0aGVuYWJsZXNgO1xuICAgICAgICAgIGFzc2VydFZhbGlkKHJlbW90YWJsZUhlbHBlciwgaW5uZXIsIHBhc3NTdHlsZU9mUmVjdXIpO1xuICAgICAgICAgIHJldHVybiAncmVtb3RhYmxlJztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoWGBVbnJlY29nbml6ZWQgdHlwZW9mICR7cSh0eXBlc3RyKX1gLCBUeXBlRXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBwYXNzU3R5bGVPZlJlY3VyKHBhc3NhYmxlKTtcbiAgfTtcbiAgcmV0dXJuIGhhcmRlbihwYXNzU3R5bGVPZik7XG59O1xuXG4gICAgICAgY29uc3QgUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wgPSBTeW1ib2wuZm9yKCdAZW5kbyBwYXNzU3R5bGVPZicpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi8kaM2PX29uY2UuUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2woUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wpO1xuICAgICAgIGNvbnN0IHBhc3NTdHlsZU9mID1cbiAgKGdsb2JhbFRoaXMgJiYgZ2xvYmFsVGhpc1tQYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbF0pIHx8XG4gIG1ha2VQYXNzU3R5bGVPZihbXG4gICAgQ29weUFycmF5SGVscGVyLFxuICAgIENvcHlSZWNvcmRIZWxwZXIsXG4gICAgVGFnZ2VkSGVscGVyLFxuICAgIEVycm9ySGVscGVyLFxuICAgIFJlbW90YWJsZUhlbHBlcixcbiAgXSk7JGjNj19vbmNlLnBhc3NTdHlsZU9mKHBhc3NTdHlsZU9mKTtcblxuICAgICAgIGNvbnN0IGFzc2VydFBhc3NhYmxlID0gdmFsID0+IHtcbiAgcGFzc1N0eWxlT2YodmFsKTsgLy9cbn07JGjNj19vbmNlLmFzc2VydFBhc3NhYmxlKGFzc2VydFBhc3NhYmxlKTtcbmhhcmRlbihhc3NlcnRQYXNzYWJsZSk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgaXNQYXNzYWJsZSA9IHNwZWNpbWVuID0+IHtcbiAgdHJ5IHtcbiAgICAvL1xuICAgIC8vXG4gICAgcmV0dXJuIHBhc3NTdHlsZU9mKHNwZWNpbWVuKSAhPT0gdW5kZWZpbmVkO1xuICB9IGNhdGNoIChfKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59OyRozY9fb25jZS5pc1Bhc3NhYmxlKGlzUGFzc2FibGUpO1xuaGFyZGVuKGlzUGFzc2FibGUpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBpc1Bhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MgPSAobmFtZSwgZGVzYykgPT5cbiAgY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MobmFtZSwgZGVzYywgcGFzc1N0eWxlT2YpO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IHRvUGFzc2FibGVFcnJvciA9IGVyciA9PiB7XG4gIGhhcmRlbihlcnIpO1xuICBpZiAoY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IoZXJyLCBwYXNzU3R5bGVPZikpIHtcbiAgICByZXR1cm4gZXJyO1xuICB9XG4gIGNvbnN0IHsgbmFtZSwgbWVzc2FnZSB9ID0gZXJyO1xuICBjb25zdCB7IGNhdXNlOiBjYXVzZURlc2MsIGVycm9yczogZXJyb3JzRGVzYyB9ID1cbiAgICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGVycik7XG4gIGxldCBjYXVzZTtcbiAgbGV0IGVycm9ycztcbiAgaWYgKGNhdXNlRGVzYyAmJiBpc1Bhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MoJ2NhdXNlJywgY2F1c2VEZXNjKSkge1xuICAgIGNhdXNlID0gY2F1c2VEZXNjLnZhbHVlO1xuICB9XG4gIGlmIChlcnJvcnNEZXNjICYmIGlzUGFzc2FibGVFcnJvclByb3BlcnR5RGVzYygnZXJyb3JzJywgZXJyb3JzRGVzYykpIHtcbiAgICBlcnJvcnMgPSBlcnJvcnNEZXNjLnZhbHVlO1xuICB9XG5cbiAgY29uc3QgZXJyQ29uc3RydWN0b3IgPSBnZXRFcnJvckNvbnN0cnVjdG9yKGAke25hbWV9YCkgfHwgRXJyb3I7XG4gIGNvbnN0IG5ld0Vycm9yID0gbWFrZUVycm9yKGAke21lc3NhZ2V9YCwgZXJyQ29uc3RydWN0b3IsIHtcbiAgICAvL1xuICAgIGNhdXNlLFxuICAgIGVycm9ycyxcbiAgfSk7XG4gIC8vXG4gIGhhcmRlbihuZXdFcnJvcik7XG4gIC8vXG4gIC8vXG4gIC8vXG4gIGFubm90YXRlRXJyb3IobmV3RXJyb3IsIFhgY29waWVkIGZyb20gZXJyb3IgJHtlcnJ9YCk7XG4gIHBhc3NTdHlsZU9mKG5ld0Vycm9yKSA9PT0gJ2Vycm9yJyB8fFxuICAgIEZhaWxgRXhwZWN0ZWQgJHtuZXdFcnJvcn0gdG8gYmUgYSBwYXNzYWJsZSBlcnJvcmA7XG4gIHJldHVybiBuZXdFcnJvcjtcbn07JGjNj19vbmNlLnRvUGFzc2FibGVFcnJvcih0b1Bhc3NhYmxlRXJyb3IpO1xuaGFyZGVuKHRvUGFzc2FibGVFcnJvcik7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCB0b1Rocm93YWJsZSA9IHNwZWNpbWVuID0+IHtcbiAgaGFyZGVuKHNwZWNpbWVuKTtcbiAgaWYgKGlzRXJyb3JMaWtlKHNwZWNpbWVuKSkge1xuICAgIHJldHVybiB0b1Bhc3NhYmxlRXJyb3IoLyogICAgICAgICAgICAgICAgKi8gKHNwZWNpbWVuKSk7XG4gIH1cbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2Yoc3BlY2ltZW4pO1xuICBpZiAoaXNPYmplY3Qoc3BlY2ltZW4pKSB7XG4gICAgc3dpdGNoIChwYXNzU3R5bGUpIHtcbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgY29uc3QgZWxlbWVudHMgPSAvKiAgICAgICAgICAgICAgICAgICAgKi8gKHNwZWNpbWVuKTtcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50IG9mIGVsZW1lbnRzKSB7XG4gICAgICAgICAgZWxlbWVudCA9PT0gdG9UaHJvd2FibGUoZWxlbWVudCkgfHxcbiAgICAgICAgICAgIEZhaWxgbmVzdGVkIHRvVGhyb3dhYmxlIGNvZXJjaW9uIG5vdCB5ZXQgc3VwcG9ydGVkICR7ZWxlbWVudH1gO1xuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgICAgY29uc3QgcmVjID0gLyogICAgICAgICAgICAgICAgICAgICAqLyAoc3BlY2ltZW4pO1xuICAgICAgICBmb3IgKGNvbnN0IHZhbCBvZiB2YWx1ZXMocmVjKSkge1xuICAgICAgICAgIHZhbCA9PT0gdG9UaHJvd2FibGUodmFsKSB8fFxuICAgICAgICAgICAgRmFpbGBuZXN0ZWQgdG9UaHJvd2FibGUgY29lcmNpb24gbm90IHlldCBzdXBwb3J0ZWQgJHt2YWx9YDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgY29uc3QgdGcgPSAvKiAgICAgICAgICAgICAgICAgICAgICovIChzcGVjaW1lbik7XG4gICAgICAgIGNvbnN0IHsgcGF5bG9hZCB9ID0gdGc7XG4gICAgICAgIHBheWxvYWQgPT09IHRvVGhyb3dhYmxlKHBheWxvYWQpIHx8XG4gICAgICAgICAgRmFpbGBuZXN0ZWQgdG9UaHJvd2FibGUgY29lcmNpb24gbm90IHlldCBzdXBwb3J0ZWQgJHtwYXlsb2FkfWA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgIGNvbnN0IGVyID0gLyogICAgICAgICAgICAgICAgKi8gKHNwZWNpbWVuKTtcbiAgICAgICAgZXIgPT09IHRvVGhyb3dhYmxlKGVyKSB8fFxuICAgICAgICAgIEZhaWxgbmVzdGVkIHRvVGhyb3dhYmxlIGNvZXJjaW9uIG5vdCB5ZXQgc3VwcG9ydGVkICR7ZXJ9YDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IEZhaWxgQSAke3EocGFzc1N0eWxlKX0gaXMgbm90IHRocm93YWJsZTogJHtzcGVjaW1lbn1gO1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovIChzcGVjaW1lbik7XG59OyRozY9fb25jZS50b1Rocm93YWJsZSh0b1Rocm93YWJsZSk7XG5oYXJkZW4odG9UaHJvd2FibGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wiOlsiUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wiXSwicGFzc1N0eWxlT2YiOlsicGFzc1N0eWxlT2YiXSwiYXNzZXJ0UGFzc2FibGUiOlsiYXNzZXJ0UGFzc2FibGUiXSwiaXNQYXNzYWJsZSI6WyJpc1Bhc3NhYmxlIl0sInRvUGFzc2FibGVFcnJvciI6WyJ0b1Bhc3NhYmxlRXJyb3IiXSwidG9UaHJvd2FibGUiOlsidG9UaHJvd2FibGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAA4EnR64cAACuHAAAKAAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9yZW1vdGFibGUuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIlJlbW90YWJsZUhlbHBlciIsImFzc2VydElmYWNlIiwiZ2V0SW50ZXJmYWNlT2YiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHEsYXNzZXJ0Q2hlY2tlcixjYW5CZU1ldGhvZCxoYXNPd25Qcm9wZXJ0eU9mLFBBU1NfU1RZTEUsY2hlY2tUYWdSZWNvcmQsY2hlY2tGdW5jdGlvblRhZ1JlY29yZCxpc09iamVjdCxnZXRUYWcsQ1g7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiY2FuQmVNZXRob2RcIixbJGjNj19hID0+IChjYW5CZU1ldGhvZCA9ICRozY9fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsWyRozY9fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRozY9fYSldXSxbXCJQQVNTX1NUWUxFXCIsWyRozY9fYSA9PiAoUEFTU19TVFlMRSA9ICRozY9fYSldXSxbXCJjaGVja1RhZ1JlY29yZFwiLFskaM2PX2EgPT4gKGNoZWNrVGFnUmVjb3JkID0gJGjNj19hKV1dLFtcImNoZWNrRnVuY3Rpb25UYWdSZWNvcmRcIixbJGjNj19hID0+IChjaGVja0Z1bmN0aW9uVGFnUmVjb3JkID0gJGjNj19hKV1dLFtcImlzT2JqZWN0XCIsWyRozY9fYSA9PiAoaXNPYmplY3QgPSAkaM2PX2EpXV0sW1wiZ2V0VGFnXCIsWyRozY9fYSA9PiAoZ2V0VGFnID0gJGjNj19hKV1dLFtcIkNYXCIsWyRozY9fYSA9PiAoQ1ggPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qXG5cblxuXG5cbiAqL1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3Qge1xuICBnZXRQcm90b3R5cGVPZixcbiAgaXNGcm96ZW4sXG4gIHByb3RvdHlwZTogb2JqZWN0UHJvdG90eXBlLFxuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLFxufSA9IE9iamVjdDtcblxuLypcblxuXG4gKi9cbmNvbnN0IGNoZWNrSWZhY2UgPSAoaWZhY2UsIGNoZWNrKSA9PiB7XG4gIHJldHVybiAoXG4gICAgLy9cbiAgICAodHlwZW9mIGlmYWNlID09PSAnc3RyaW5nJyB8fFxuICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgQ1goXG4gICAgICAgICAgY2hlY2ssXG4gICAgICAgIClgRm9yIG5vdywgaW50ZXJmYWNlICR7aWZhY2V9IG11c3QgYmUgYSBzdHJpbmc7IHVuaW1wbGVtZW50ZWRgKSkgJiZcbiAgICAoaWZhY2UgPT09ICdSZW1vdGFibGUnIHx8XG4gICAgICBpZmFjZS5zdGFydHNXaXRoKCdBbGxlZ2VkOiAnKSB8fFxuICAgICAgaWZhY2Uuc3RhcnRzV2l0aCgnRGVidWdOYW1lOiAnKSB8fFxuICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgQ1goY2hlY2spYEZvciBub3csIGlmYWNlICR7cShcbiAgICAgICAgICBpZmFjZSxcbiAgICAgICAgKX0gbXVzdCBiZSBcIlJlbW90YWJsZVwiIG9yIGJlZ2luIHdpdGggXCJBbGxlZ2VkOiBcIiBvciBcIkRlYnVnTmFtZTogXCI7IHVuaW1wbGVtZW50ZWRgKSlcbiAgKTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0SWZhY2UgPSBpZmFjZSA9PiBjaGVja0lmYWNlKGlmYWNlLCBhc3NlcnRDaGVja2VyKTskaM2PX29uY2UuYXNzZXJ0SWZhY2UoYXNzZXJ0SWZhY2UpO1xuaGFyZGVuKGFzc2VydElmYWNlKTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgY2hlY2tSZW1vdGFibGVQcm90b09mID0gKG9yaWdpbmFsLCBjaGVjaykgPT4ge1xuICBpc09iamVjdChvcmlnaW5hbCkgfHxcbiAgICBGYWlsYFJlbW90YWJsZXMgbXVzdCBiZSBvYmplY3RzIG9yIGZ1bmN0aW9uczogJHtvcmlnaW5hbH1gO1xuXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIGNvbnN0IHByb3RvID0gZ2V0UHJvdG90eXBlT2Yob3JpZ2luYWwpO1xuICBpZiAoXG4gICAgcHJvdG8gPT09IG9iamVjdFByb3RvdHlwZSB8fFxuICAgIHByb3RvID09PSBudWxsIHx8XG4gICAgcHJvdG8gPT09IEZ1bmN0aW9uLnByb3RvdHlwZVxuICApIHtcbiAgICByZXR1cm4gKFxuICAgICAgISFjaGVjayAmJlxuICAgICAgQ1goY2hlY2spYFJlbW90YWJsZXMgbXVzdCBiZSBleHBsaWNpdGx5IGRlY2xhcmVkOiAke3Eob3JpZ2luYWwpfWBcbiAgICApO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvcmlnaW5hbCA9PT0gJ29iamVjdCcpIHtcbiAgICBjb25zdCBwcm90b1Byb3RvID0gZ2V0UHJvdG90eXBlT2YocHJvdG8pO1xuICAgIGlmIChwcm90b1Byb3RvICE9PSBvYmplY3RQcm90b3R5cGUgJiYgcHJvdG9Qcm90byAhPT0gbnVsbCkge1xuICAgICAgLy9cbiAgICAgIHJldHVybiBjaGVja1JlbW90YWJsZShwcm90bywgY2hlY2spO1xuICAgIH1cbiAgICBpZiAoIWNoZWNrVGFnUmVjb3JkKHByb3RvLCAncmVtb3RhYmxlJywgY2hlY2spKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9IGVsc2UgaWYgKHR5cGVvZiBvcmlnaW5hbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIGlmICghY2hlY2tGdW5jdGlvblRhZ1JlY29yZChwcm90bywgJ3JlbW90YWJsZScsIGNoZWNrKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuXG4gIC8vXG4gIGNvbnN0IHBhc3NTdHlsZUtleSA9IC8qICAgICAgICAgICAgICAgICAgKi8gKFBBU1NfU1RZTEUpO1xuICBjb25zdCB0YWdLZXkgPSAvKiAgICAgICAgICAgICAgICAgICovIChTeW1ib2wudG9TdHJpbmdUYWcpO1xuICBjb25zdCB7XG4gICAgLy9cbiAgICBbLyogICAgICAgICAgICAgICAgICovIChwYXNzU3R5bGVLZXkpXTogX3Bhc3NTdHlsZURlc2MsXG4gICAgWy8qICAgICAgICAgICAgICAgICAqLyAodGFnS2V5KV06IHsgdmFsdWU6IGlmYWNlIH0sXG4gICAgLi4ucmVzdERlc2NzXG4gIH0gPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHByb3RvKTtcblxuICByZXR1cm4gKFxuICAgIChvd25LZXlzKHJlc3REZXNjcykubGVuZ3RoID09PSAwIHx8XG4gICAgICAoISFjaGVjayAmJlxuICAgICAgICBDWChcbiAgICAgICAgICBjaGVjayxcbiAgICAgICAgKWBVbmV4cGVjdGVkIHByb3BlcnRpZXMgb24gUmVtb3RhYmxlIFByb3RvICR7b3duS2V5cyhyZXN0RGVzY3MpfWApKSAmJlxuICAgIGNoZWNrSWZhY2UoaWZhY2UsIGNoZWNrKVxuICApO1xufTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG5jb25zdCBjb25maXJtZWRSZW1vdGFibGVzID0gbmV3IFdlYWtTZXQoKTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgY2hlY2tSZW1vdGFibGUgPSAodmFsLCBjaGVjaykgPT4ge1xuICBpZiAoY29uZmlybWVkUmVtb3RhYmxlcy5oYXModmFsKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGlmICghaXNGcm96ZW4odmFsKSkge1xuICAgIHJldHVybiAoXG4gICAgICAhIWNoZWNrICYmIENYKGNoZWNrKWBjYW5ub3Qgc2VyaWFsaXplIG5vbi1mcm96ZW4gb2JqZWN0cyBsaWtlICR7dmFsfWBcbiAgICApO1xuICB9XG4gIC8vXG4gIGlmICghUmVtb3RhYmxlSGVscGVyLmNhbkJlVmFsaWQodmFsLCBjaGVjaykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gY2hlY2tSZW1vdGFibGVQcm90b09mKHZhbCwgY2hlY2spO1xuICBpZiAocmVzdWx0KSB7XG4gICAgY29uZmlybWVkUmVtb3RhYmxlcy5hZGQodmFsKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLypcblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgZ2V0SW50ZXJmYWNlT2YgPSB2YWwgPT4ge1xuICBpZiAoXG4gICAgIWlzT2JqZWN0KHZhbCkgfHxcbiAgICB2YWxbUEFTU19TVFlMRV0gIT09ICdyZW1vdGFibGUnIHx8XG4gICAgIWNoZWNrUmVtb3RhYmxlKHZhbClcbiAgKSB7XG4gICAgLy9cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIC8vXG4gIHJldHVybiBnZXRUYWcodmFsKTtcbn07JGjNj19vbmNlLmdldEludGVyZmFjZU9mKGdldEludGVyZmFjZU9mKTtcbmhhcmRlbihnZXRJbnRlcmZhY2VPZik7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgUmVtb3RhYmxlSGVscGVyID0gaGFyZGVuKHtcbiAgc3R5bGVOYW1lOiAncmVtb3RhYmxlJyxcblxuICBjYW5CZVZhbGlkOiAoY2FuZGlkYXRlLCBjaGVjayA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIGNvbnN0IHZhbGlkVHlwZSA9XG4gICAgICAoaXNPYmplY3QoY2FuZGlkYXRlKSB8fFxuICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgIENYKGNoZWNrKWBjYW5ub3Qgc2VyaWFsaXplIG5vbi1vYmplY3RzIGFzIFJlbW90YWJsZSAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgICAgICghaXNBcnJheShjYW5kaWRhdGUpIHx8XG4gICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgQ1goY2hlY2spYGNhbm5vdCBzZXJpYWxpemUgYXJyYXlzIGFzIFJlbW90YWJsZSAke2NhbmRpZGF0ZX1gKSk7XG4gICAgaWYgKCF2YWxpZFR5cGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBkZXNjcyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY2FuZGlkYXRlKTtcbiAgICBpZiAodHlwZW9mIGNhbmRpZGF0ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgcmV0dXJuIG93bktleXMoZGVzY3MpLmV2ZXJ5KGtleSA9PiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgLy9cbiAgICAgICAgICAoaGFzT3duUHJvcGVydHlPZihkZXNjc1svKiAgICAgICAgICAgICAgICAgKi8gKGtleSldLCAndmFsdWUnKSB8fFxuICAgICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgICAgQ1goY2hlY2spYGNhbm5vdCBzZXJpYWxpemUgUmVtb3RhYmxlcyB3aXRoIGFjY2Vzc29ycyBsaWtlICR7cShcbiAgICAgICAgICAgICAgICBTdHJpbmcoa2V5KSxcbiAgICAgICAgICAgICAgKX0gaW4gJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgICAgICAgKChrZXkgPT09IFN5bWJvbC50b1N0cmluZ1RhZyAmJiBjaGVja0lmYWNlKGNhbmRpZGF0ZVtrZXldLCBjaGVjaykpIHx8XG4gICAgICAgICAgICAoKGNhbkJlTWV0aG9kKGNhbmRpZGF0ZVtrZXldKSB8fFxuICAgICAgICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgICAgICAgIENYKGNoZWNrKWBjYW5ub3Qgc2VyaWFsaXplIFJlbW90YWJsZXMgd2l0aCBub24tbWV0aG9kcyBsaWtlICR7cShcbiAgICAgICAgICAgICAgICAgIFN0cmluZyhrZXkpLFxuICAgICAgICAgICAgICAgICl9IGluICR7Y2FuZGlkYXRlfWApKSAmJlxuICAgICAgICAgICAgICAoa2V5ICE9PSBQQVNTX1NUWUxFIHx8XG4gICAgICAgICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgICAgICAgIENYKGNoZWNrKWBBIHBhc3MtYnktcmVtb3RlIGNhbm5vdCBzaGFkb3cgJHtxKFBBU1NfU1RZTEUpfWApKSkpXG4gICAgICAgICk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjYW5kaWRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3Qge1xuICAgICAgICBuYW1lOiBuYW1lRGVzYyxcbiAgICAgICAgbGVuZ3RoOiBsZW5ndGhEZXNjLFxuICAgICAgICAvL1xuICAgICAgICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogdG9TdHJpbmdUYWdEZXNjLFxuICAgICAgICAuLi5yZXN0RGVzY3NcbiAgICAgIH0gPSBkZXNjcztcbiAgICAgIGNvbnN0IHJlc3RLZXlzID0gb3duS2V5cyhyZXN0RGVzY3MpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgKChuYW1lRGVzYyAmJiB0eXBlb2YgbmFtZURlc2MudmFsdWUgPT09ICdzdHJpbmcnKSB8fFxuICAgICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgICBDWChjaGVjaylgRmFyIGZ1bmN0aW9uIG5hbWUgbXVzdCBiZSBhIHN0cmluZywgaW4gJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgICAgICgobGVuZ3RoRGVzYyAmJiB0eXBlb2YgbGVuZ3RoRGVzYy52YWx1ZSA9PT0gJ251bWJlcicpIHx8XG4gICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgIENYKFxuICAgICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICAgIClgRmFyIGZ1bmN0aW9uIGxlbmd0aCBtdXN0IGJlIGEgbnVtYmVyLCBpbiAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgICAgICAgKHRvU3RyaW5nVGFnRGVzYyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgKCh0eXBlb2YgdG9TdHJpbmdUYWdEZXNjLnZhbHVlID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgICAgQ1goXG4gICAgICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgICAgIClgRmFyIGZ1bmN0aW9uIEBAdG9TdHJpbmdUYWcgbXVzdCBiZSBhIHN0cmluZywgaW4gJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgICAgICAgICBjaGVja0lmYWNlKHRvU3RyaW5nVGFnRGVzYy52YWx1ZSwgY2hlY2spKSkgJiZcbiAgICAgICAgKHJlc3RLZXlzLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgICBDWChcbiAgICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgICApYEZhciBmdW5jdGlvbnMgdW5leHBlY3RlZCBwcm9wZXJ0aWVzIGJlc2lkZXMgLm5hbWUgYW5kIC5sZW5ndGggJHtyZXN0S2V5c31gKSlcbiAgICAgICk7XG4gICAgfVxuICAgIHJldHVybiAhIWNoZWNrICYmIENYKGNoZWNrKWB1bnJlY29nbml6ZWQgdHlwZW9mICR7Y2FuZGlkYXRlfWA7XG4gIH0sXG5cbiAgYXNzZXJ0UmVzdFZhbGlkOiBjYW5kaWRhdGUgPT4gY2hlY2tSZW1vdGFibGUoY2FuZGlkYXRlLCBhc3NlcnRDaGVja2VyKSxcblxuICBldmVyeTogKF9wYXNzYWJsZSwgX2ZuKSA9PiB0cnVlLFxufSk7JGjNj19vbmNlLlJlbW90YWJsZUhlbHBlcihSZW1vdGFibGVIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0SWZhY2UiOlsiYXNzZXJ0SWZhY2UiXSwiZ2V0SW50ZXJmYWNlT2YiOlsiZ2V0SW50ZXJmYWNlT2YiXSwiUmVtb3RhYmxlSGVscGVyIjpbIlJlbW90YWJsZUhlbHBlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADHjH84eg4AAHoOAAArAAAAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL3NhZmUtcHJvbWlzZS5qc3siaW1wb3J0cyI6WyJAZW5kby9wcm9taXNlLWtpdCIsIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRTYWZlUHJvbWlzZSIsImlzU2FmZVByb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBpc1Byb21pc2UscSxhc3NlcnRDaGVja2VyLGhhc093blByb3BlcnR5T2YsQ1g7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsWyRozY9fYSA9PiAoaXNQcm9taXNlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIixbJGjNj19hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjNj19hKV1dLFtcIkNYXCIsWyRozY9fYSA9PiAoQ1ggPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG5jb25zdCB7IGlzRnJvemVuLCBnZXRQcm90b3R5cGVPZiwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yIH0gPSBPYmplY3Q7XG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IHRvU3RyaW5nVGFnIH0gPSBTeW1ib2w7XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGNoZWNrUHJvbWlzZU93bktleXMgPSAocHIsIGNoZWNrKSA9PiB7XG4gIGNvbnN0IGtleXMgPSBvd25LZXlzKHByKTtcblxuICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IHVua25vd25LZXlzID0ga2V5cy5maWx0ZXIoXG4gICAga2V5ID0+IHR5cGVvZiBrZXkgIT09ICdzeW1ib2wnIHx8ICFoYXNPd25Qcm9wZXJ0eU9mKFByb21pc2UucHJvdG90eXBlLCBrZXkpLFxuICApO1xuXG4gIGlmICh1bmtub3duS2V5cy5sZW5ndGggIT09IDApIHtcbiAgICByZXR1cm4gQ1goXG4gICAgICBjaGVjayxcbiAgICApYCR7cHJ9IC0gTXVzdCBub3QgaGF2ZSBhbnkgb3duIHByb3BlcnRpZXM6ICR7cSh1bmtub3duS2V5cyl9YDtcbiAgfVxuXG4gIC8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAgICovXG4gIGNvbnN0IGNoZWNrU2FmZU93bktleSA9IGtleSA9PiB7XG4gICAgaWYgKGtleSA9PT0gdG9TdHJpbmdUYWcpIHtcbiAgICAgIC8vXG4gICAgICAvL1xuICAgICAgY29uc3QgdGFnRGVzYyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihwciwgdG9TdHJpbmdUYWcpO1xuICAgICAgYXNzZXJ0KHRhZ0Rlc2MgIT09IHVuZGVmaW5lZCk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICAoaGFzT3duUHJvcGVydHlPZih0YWdEZXNjLCAndmFsdWUnKSB8fFxuICAgICAgICAgIENYKFxuICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgKWBPd24gQEB0b1N0cmluZ1RhZyBtdXN0IGJlIGEgZGF0YSBwcm9wZXJ0eSwgbm90IGFuIGFjY2Vzc29yOiAke3EodGFnRGVzYyl9YCkgJiZcbiAgICAgICAgKHR5cGVvZiB0YWdEZXNjLnZhbHVlID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgIENYKFxuICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgKWBPd24gQEB0b1N0cmluZ1RhZyB2YWx1ZSBtdXN0IGJlIGEgc3RyaW5nOiAke3EodGFnRGVzYy52YWx1ZSl9YCkgJiZcbiAgICAgICAgKCF0YWdEZXNjLmVudW1lcmFibGUgfHxcbiAgICAgICAgICBDWChjaGVjaylgT3duIEBAdG9TdHJpbmdUYWcgbXVzdCBub3QgYmUgZW51bWVyYWJsZTogJHtxKHRhZ0Rlc2MpfWApXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCB2YWwgPSBwcltrZXldO1xuICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmXG4gICAgICB2YWwgIT09IG51bGwgJiZcbiAgICAgIGlzRnJvemVuKHZhbCkgJiZcbiAgICAgIGdldFByb3RvdHlwZU9mKHZhbCkgPT09IE9iamVjdC5wcm90b3R5cGVcbiAgICApIHtcbiAgICAgIGNvbnN0IHN1YktleXMgPSBvd25LZXlzKHZhbCk7XG4gICAgICBpZiAoc3ViS2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgc3ViS2V5cy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgc3ViS2V5c1swXSA9PT0gJ2Rlc3Ryb3llZCcgJiZcbiAgICAgICAgdmFsLmRlc3Ryb3llZCA9PT0gZmFsc2VcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIENYKFxuICAgICAgY2hlY2ssXG4gICAgKWBVbmV4cGVjdGVkIE5vZGUgYXN5bmNfaG9va3MgYWRkaXRpb25zIHRvIHByb21pc2U6ICR7cHJ9LiR7cShcbiAgICAgIFN0cmluZyhrZXkpLFxuICAgICl9IGlzICR7dmFsfWA7XG4gIH07XG5cbiAgcmV0dXJuIGtleXMuZXZlcnkoY2hlY2tTYWZlT3duS2V5KTtcbn07XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG5jb25zdCBjaGVja1NhZmVQcm9taXNlID0gKHByLCBjaGVjaykgPT4ge1xuICByZXR1cm4gKFxuICAgIChpc0Zyb3plbihwcikgfHwgQ1goY2hlY2spYCR7cHJ9IC0gTXVzdCBiZSBmcm96ZW5gKSAmJlxuICAgIChpc1Byb21pc2UocHIpIHx8IENYKGNoZWNrKWAke3ByfSAtIE11c3QgYmUgYSBwcm9taXNlYCkgJiZcbiAgICAoZ2V0UHJvdG90eXBlT2YocHIpID09PSBQcm9taXNlLnByb3RvdHlwZSB8fFxuICAgICAgQ1goY2hlY2spYCR7cHJ9IC0gTXVzdCBpbmhlcml0IGZyb20gUHJvbWlzZS5wcm90b3R5cGU6ICR7cShcbiAgICAgICAgZ2V0UHJvdG90eXBlT2YocHIpLFxuICAgICAgKX1gKSAmJlxuICAgIGNoZWNrUHJvbWlzZU93bktleXMoLyogICAgICAgICAgICAgICAgICAqLyAocHIpLCBjaGVjaylcbiAgKTtcbn07XG5oYXJkZW4oY2hlY2tTYWZlUHJvbWlzZSk7XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGlzU2FmZVByb21pc2UgPSBwciA9PiBjaGVja1NhZmVQcm9taXNlKHByLCB4ID0+IHgpOyRozY9fb25jZS5pc1NhZmVQcm9taXNlKGlzU2FmZVByb21pc2UpO1xuaGFyZGVuKGlzU2FmZVByb21pc2UpO1xuXG4gICAgICAgY29uc3QgYXNzZXJ0U2FmZVByb21pc2UgPSBwciA9PiBjaGVja1NhZmVQcm9taXNlKHByLCBhc3NlcnRDaGVja2VyKTskaM2PX29uY2UuYXNzZXJ0U2FmZVByb21pc2UoYXNzZXJ0U2FmZVByb21pc2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNTYWZlUHJvbWlzZSI6WyJpc1NhZmVQcm9taXNlIl0sImFzc2VydFNhZmVQcm9taXNlIjpbImFzc2VydFNhZmVQcm9taXNlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALo+zaF5CAAAeQgAACUAAABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvc3RyaW5nLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vudi1vcHRpb25zIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsiYXNzZXJ0UGFzc2FibGVTdHJpbmciLCJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIiwiaXNXZWxsRm9ybWVkU3RyaW5nIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZ2V0RW52aXJvbm1lbnRPcHRpb24sRmFpbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vudi1vcHRpb25zXCIsIFtbXCJnZXRFbnZpcm9ubWVudE9wdGlvblwiLFskaM2PX2EgPT4gKGdldEVudmlyb25tZW50T3B0aW9uID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dXSk7XG5cblxuLy9cbmNvbnN0IGhhc1dlbGxGb3JtZWRTdHJpbmdNZXRob2QgPSAhIVN0cmluZy5wcm90b3R5cGUuaXNXZWxsRm9ybWVkO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGlzV2VsbEZvcm1lZFN0cmluZyA9IGhhc1dlbGxGb3JtZWRTdHJpbmdNZXRob2RcbiAgPyBzdHIgPT4gdHlwZW9mIHN0ciA9PT0gJ3N0cmluZycgJiYgc3RyLmlzV2VsbEZvcm1lZCgpXG4gIDogc3RyID0+IHtcbiAgICAgIGlmICh0eXBlb2Ygc3RyICE9PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGNoIG9mIHN0cikge1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICAvL1xuICAgICAgICBjb25zdCBjcCA9IC8qICAgICAgICAgICAgICAgICAqLyAoY2guY29kZVBvaW50QXQoMCkpO1xuICAgICAgICBpZiAoY3AgPj0gMHhkODAwICYmIGNwIDw9IDB4ZGZmZikge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICAvL1xuICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTskaM2PX29uY2UuaXNXZWxsRm9ybWVkU3RyaW5nKGlzV2VsbEZvcm1lZFN0cmluZyk7XG5oYXJkZW4oaXNXZWxsRm9ybWVkU3RyaW5nKTtcblxuLypcblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRXZWxsRm9ybWVkU3RyaW5nID0gc3RyID0+IHtcbiAgaXNXZWxsRm9ybWVkU3RyaW5nKHN0cikgfHwgRmFpbGBFeHBlY3RlZCB3ZWxsLWZvcm1lZCB1bmljb2RlIHN0cmluZzogJHtzdHJ9YDtcbn07JGjNj19vbmNlLmFzc2VydFdlbGxGb3JtZWRTdHJpbmcoYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyk7XG5oYXJkZW4oYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyk7XG5cbmNvbnN0IE9OTFlfV0VMTF9GT1JNRURfU1RSSU5HU19QQVNTQUJMRSA9XG4gIGdldEVudmlyb25tZW50T3B0aW9uKCdPTkxZX1dFTExfRk9STUVEX1NUUklOR1NfUEFTU0FCTEUnLCAnZGlzYWJsZWQnLCBbXG4gICAgJ2VuYWJsZWQnLFxuICBdKSA9PT0gJ2VuYWJsZWQnO1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0UGFzc2FibGVTdHJpbmcgPSBzdHIgPT4ge1xuICB0eXBlb2Ygc3RyID09PSAnc3RyaW5nJyB8fCBGYWlsYEV4cGVjdGVkIHN0cmluZyAke3N0cn1gO1xuICAhT05MWV9XRUxMX0ZPUk1FRF9TVFJJTkdTX1BBU1NBQkxFIHx8IGFzc2VydFdlbGxGb3JtZWRTdHJpbmcoc3RyKTtcbn07JGjNj19vbmNlLmFzc2VydFBhc3NhYmxlU3RyaW5nKGFzc2VydFBhc3NhYmxlU3RyaW5nKTtcbmhhcmRlbihhc3NlcnRQYXNzYWJsZVN0cmluZyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1dlbGxGb3JtZWRTdHJpbmciOlsiaXNXZWxsRm9ybWVkU3RyaW5nIl0sImFzc2VydFdlbGxGb3JtZWRTdHJpbmciOlsiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyJdLCJhc3NlcnRQYXNzYWJsZVN0cmluZyI6WyJhc3NlcnRQYXNzYWJsZVN0cmluZyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAdG1R25QoAAOUKAAAlAAAAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL3N5bWJvbC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJhc3NlcnRQYXNzYWJsZVN5bWJvbCIsImlzUGFzc2FibGVTeW1ib2wiLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTtcblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuXG4vKlxuXG4gKi9cbmNvbnN0IHdlbGxLbm93blN5bWJvbE5hbWVzID0gbmV3IE1hcChcbiAgb3duS2V5cyhTeW1ib2wpXG4gICAgLmZpbHRlcihcbiAgICAgIG5hbWUgPT4gdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnICYmIHR5cGVvZiBTeW1ib2xbbmFtZV0gPT09ICdzeW1ib2wnLFxuICAgIClcbiAgICAuZmlsdGVyKG5hbWUgPT4ge1xuICAgICAgLy9cbiAgICAgICFuYW1lLnN0YXJ0c1dpdGgoJ0BAJykgfHxcbiAgICAgICAgRmFpbGBEaWQgbm90IGV4cGVjdCBTeW1ib2wgdG8gaGF2ZSBhIHN5bWJvbC12YWx1ZWQgcHJvcGVydHkgbmFtZSBzdGFydGluZyB3aXRoIFwiQEBcIiAke3EoXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgKX1gO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSlcbiAgICAvL1xuICAgIC5tYXAobmFtZSA9PiBbU3ltYm9sW25hbWVdLCBgQEAke25hbWV9YF0pLFxuKTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IGlzUGFzc2FibGVTeW1ib2wgPSBzeW0gPT5cbiAgdHlwZW9mIHN5bSA9PT0gJ3N5bWJvbCcgJiZcbiAgKHR5cGVvZiBTeW1ib2wua2V5Rm9yKHN5bSkgPT09ICdzdHJpbmcnIHx8IHdlbGxLbm93blN5bWJvbE5hbWVzLmhhcyhzeW0pKTskaM2PX29uY2UuaXNQYXNzYWJsZVN5bWJvbChpc1Bhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihpc1Bhc3NhYmxlU3ltYm9sKTtcblxuICAgICAgIGNvbnN0IGFzc2VydFBhc3NhYmxlU3ltYm9sID0gc3ltID0+XG4gIGlzUGFzc2FibGVTeW1ib2woc3ltKSB8fFxuICBGYWlsYE9ubHkgcmVnaXN0ZXJlZCBzeW1ib2xzIG9yIHdlbGwta25vd24gc3ltYm9scyBhcmUgcGFzc2FibGU6ICR7cShzeW0pfWA7JGjNj19vbmNlLmFzc2VydFBhc3NhYmxlU3ltYm9sKGFzc2VydFBhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihhc3NlcnRQYXNzYWJsZVN5bWJvbCk7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiAqL1xuICAgICAgIGNvbnN0IG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9IHN5bSA9PiB7XG4gIGNvbnN0IG5hbWUgPSBTeW1ib2wua2V5Rm9yKHN5bSk7XG4gIGlmIChuYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gd2VsbEtub3duU3ltYm9sTmFtZXMuZ2V0KHN5bSk7XG4gIH1cbiAgaWYgKG5hbWUuc3RhcnRzV2l0aCgnQEAnKSkge1xuICAgIHJldHVybiBgQEAke25hbWV9YDtcbiAgfVxuICByZXR1cm4gbmFtZTtcbn07JGjNj19vbmNlLm5hbWVGb3JQYXNzYWJsZVN5bWJvbChuYW1lRm9yUGFzc2FibGVTeW1ib2wpO1xuaGFyZGVuKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCk7XG5cbmNvbnN0IEF0QXRQcmVmaXhQYXR0ZXJuID0gL15AQCguKikkLztcbmhhcmRlbihBdEF0UHJlZml4UGF0dGVybik7XG5cbi8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgY29uc3QgcGFzc2FibGVTeW1ib2xGb3JOYW1lID0gbmFtZSA9PiB7XG4gIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGNvbnN0IG1hdGNoID0gQXRBdFByZWZpeFBhdHRlcm4uZXhlYyhuYW1lKTtcbiAgaWYgKG1hdGNoKSB7XG4gICAgY29uc3Qgc3VmZml4ID0gbWF0Y2hbMV07XG4gICAgaWYgKHN1ZmZpeC5zdGFydHNXaXRoKCdAQCcpKSB7XG4gICAgICByZXR1cm4gU3ltYm9sLmZvcihzdWZmaXgpO1xuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBzeW0gPSBTeW1ib2xbc3VmZml4XTtcbiAgICAgIGlmICh0eXBlb2Ygc3ltID09PSAnc3ltYm9sJykge1xuICAgICAgICByZXR1cm4gc3ltO1xuICAgICAgfVxuICAgICAgRmFpbGBSZXNlcnZlZCBmb3Igd2VsbCBrbm93biBzeW1ib2wgJHtxKHN1ZmZpeCl9OiAke3EobmFtZSl9YDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIFN5bWJvbC5mb3IobmFtZSk7XG59OyRozY9fb25jZS5wYXNzYWJsZVN5bWJvbEZvck5hbWUocGFzc2FibGVTeW1ib2xGb3JOYW1lKTtcbmhhcmRlbihwYXNzYWJsZVN5bWJvbEZvck5hbWUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNQYXNzYWJsZVN5bWJvbCI6WyJpc1Bhc3NhYmxlU3ltYm9sIl0sImFzc2VydFBhc3NhYmxlU3ltYm9sIjpbImFzc2VydFBhc3NhYmxlU3ltYm9sIl0sIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCI6WyJuYW1lRm9yUGFzc2FibGVTeW1ib2wiXSwicGFzc2FibGVTeW1ib2xGb3JOYW1lIjpbInBhc3NhYmxlU3ltYm9sRm9yTmFtZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADy5fJQyQcAAMkHAAAlAAAAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL3RhZ2dlZC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiVGFnZ2VkSGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxhc3NlcnRDaGVja2VyLGNoZWNrVGFnUmVjb3JkLFBBU1NfU1RZTEUsZ2V0T3duRGF0YURlc2NyaXB0b3IsY2hlY2tQYXNzU3R5bGU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiY2hlY2tUYWdSZWNvcmRcIixbJGjNj19hID0+IChjaGVja1RhZ1JlY29yZCA9ICRozY9fYSldXSxbXCJQQVNTX1NUWUxFXCIsWyRozY9fYSA9PiAoUEFTU19TVFlMRSA9ICRozY9fYSldXSxbXCJnZXRPd25EYXRhRGVzY3JpcHRvclwiLFskaM2PX2EgPT4gKGdldE93bkRhdGFEZXNjcmlwdG9yID0gJGjNj19hKV1dLFtcImNoZWNrUGFzc1N0eWxlXCIsWyRozY9fYSA9PiAoY2hlY2tQYXNzU3R5bGUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG4vKlxuXG4gKi9cblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzIH0gPSBPYmplY3Q7XG5cbi8qXG5cblxuICovXG4gICAgICAgY29uc3QgVGFnZ2VkSGVscGVyID0gaGFyZGVuKHtcbiAgc3R5bGVOYW1lOiAndGFnZ2VkJyxcblxuICBjYW5CZVZhbGlkOiAoY2FuZGlkYXRlLCBjaGVjayA9IHVuZGVmaW5lZCkgPT5cbiAgICBjaGVja1Bhc3NTdHlsZShjYW5kaWRhdGUsIGNhbmRpZGF0ZVtQQVNTX1NUWUxFXSwgJ3RhZ2dlZCcsIGNoZWNrKSxcblxuICBhc3NlcnRSZXN0VmFsaWQ6IChjYW5kaWRhdGUsIHBhc3NTdHlsZU9mUmVjdXIpID0+IHtcbiAgICBjaGVja1RhZ1JlY29yZChjYW5kaWRhdGUsICd0YWdnZWQnLCBhc3NlcnRDaGVja2VyKTtcblxuICAgIC8vXG4gICAgY29uc3QgcGFzc1N0eWxlS2V5ID0gLyogICAgICAgICAgICAgICAgICAqLyAoUEFTU19TVFlMRSk7XG4gICAgY29uc3QgdGFnS2V5ID0gLyogICAgICAgICAgICAgICAgICAqLyAoU3ltYm9sLnRvU3RyaW5nVGFnKTtcbiAgICBjb25zdCB7XG4gICAgICAvL1xuICAgICAgWy8qICAgICAgICAgICAgICAgICAqLyAocGFzc1N0eWxlS2V5KV06IF9wYXNzU3R5bGVEZXNjLFxuICAgICAgWy8qICAgICAgICAgICAgICAgICAqLyAodGFnS2V5KV06IF9sYWJlbERlc2MsXG4gICAgICBwYXlsb2FkOiBfcGF5bG9hZERlc2MsIC8vXG4gICAgICAuLi5yZXN0RGVzY3NcbiAgICB9ID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xuICAgIG93bktleXMocmVzdERlc2NzKS5sZW5ndGggPT09IDAgfHxcbiAgICAgIEZhaWxgVW5leHBlY3RlZCBwcm9wZXJ0aWVzIG9uIHRhZ2dlZCByZWNvcmQgJHtvd25LZXlzKHJlc3REZXNjcyl9YDtcblxuICAgIC8vXG4gICAgLy9cbiAgICBwYXNzU3R5bGVPZlJlY3VyKFxuICAgICAgZ2V0T3duRGF0YURlc2NyaXB0b3IoY2FuZGlkYXRlLCAncGF5bG9hZCcsIHRydWUsIGFzc2VydENoZWNrZXIpLnZhbHVlLFxuICAgICk7XG4gIH0sXG59KTskaM2PX29uY2UuVGFnZ2VkSGVscGVyKFRhZ2dlZEhlbHBlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJUYWdnZWRIZWxwZXIiOlsiVGFnZ2VkSGVscGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAO7cIrBnCQAAZwkAACkAAABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZU9mLmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0UmVjb3JkIiwiYXNzZXJ0UmVtb3RhYmxlIiwiaXNDb3B5QXJyYXkiLCJpc1JlY29yZCIsImlzUmVtb3RhYmxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxxLHBhc3NTdHlsZU9mOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlT2YuanNcIiwgW1tcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV1dXV0pO1xuXG5cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbi8qXG5cblxuXG5cblxuICovXG5jb25zdCBpc0NvcHlBcnJheSA9IGFyciA9PiBwYXNzU3R5bGVPZihhcnIpID09PSAnY29weUFycmF5JzskaM2PX29uY2UuaXNDb3B5QXJyYXkoaXNDb3B5QXJyYXkpO1xuaGFyZGVuKGlzQ29weUFycmF5KTtcblxuLypcblxuXG5cblxuXG4gKi9cbmNvbnN0IGlzUmVjb3JkID0gcmVjb3JkID0+IHBhc3NTdHlsZU9mKHJlY29yZCkgPT09ICdjb3B5UmVjb3JkJzskaM2PX29uY2UuaXNSZWNvcmQoaXNSZWNvcmQpO1xuaGFyZGVuKGlzUmVjb3JkKTtcblxuLypcblxuXG5cblxuICovXG5jb25zdCBpc1JlbW90YWJsZSA9IHJlbW90YWJsZSA9PiBwYXNzU3R5bGVPZihyZW1vdGFibGUpID09PSAncmVtb3RhYmxlJzskaM2PX29uY2UuaXNSZW1vdGFibGUoaXNSZW1vdGFibGUpO1xuaGFyZGVuKGlzUmVtb3RhYmxlKTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0Q29weUFycmF5ID0gKGFyciwgb3B0TmFtZU9mQXJyYXkgPSAnQWxsZWdlZCBhcnJheScpID0+IHtcbiAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YoYXJyKTtcbiAgcGFzc1N0eWxlID09PSAnY29weUFycmF5JyB8fFxuICAgIEZhaWxgJHtxKG9wdE5hbWVPZkFycmF5KX0gJHthcnJ9IG11c3QgYmUgYSBwYXNzLWJ5LWNvcHkgYXJyYXksIG5vdCAke3EoXG4gICAgICBwYXNzU3R5bGUsXG4gICAgKX1gO1xufTskaM2PX29uY2UuYXNzZXJ0Q29weUFycmF5KGFzc2VydENvcHlBcnJheSk7XG5oYXJkZW4oYXNzZXJ0Q29weUFycmF5KTtcblxuLypcblxuXG5cbiAqL1xuY29uc3QgYXNzZXJ0UmVjb3JkID0gKHJlY29yZCwgb3B0TmFtZU9mUmVjb3JkID0gJ0FsbGVnZWQgcmVjb3JkJykgPT4ge1xuICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihyZWNvcmQpO1xuICBwYXNzU3R5bGUgPT09ICdjb3B5UmVjb3JkJyB8fFxuICAgIEZhaWxgJHtxKG9wdE5hbWVPZlJlY29yZCl9ICR7cmVjb3JkfSBtdXN0IGJlIGEgcGFzcy1ieS1jb3B5IHJlY29yZCwgbm90ICR7cShcbiAgICAgIHBhc3NTdHlsZSxcbiAgICApfWA7XG59OyRozY9fb25jZS5hc3NlcnRSZWNvcmQoYXNzZXJ0UmVjb3JkKTtcbmhhcmRlbihhc3NlcnRSZWNvcmQpO1xuXG4vKlxuXG5cblxuICovXG5jb25zdCBhc3NlcnRSZW1vdGFibGUgPSAoXG4gIHJlbW90YWJsZSxcbiAgb3B0TmFtZU9mUmVtb3RhYmxlID0gJ0FsbGVnZWQgcmVtb3RhYmxlJyxcbikgPT4ge1xuICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihyZW1vdGFibGUpO1xuICBwYXNzU3R5bGUgPT09ICdyZW1vdGFibGUnIHx8XG4gICAgRmFpbGAke3Eob3B0TmFtZU9mUmVtb3RhYmxlKX0gJHtyZW1vdGFibGV9IG11c3QgYmUgYSByZW1vdGFibGUsIG5vdCAke3EoXG4gICAgICBwYXNzU3R5bGUsXG4gICAgKX1gO1xufTskaM2PX29uY2UuYXNzZXJ0UmVtb3RhYmxlKGFzc2VydFJlbW90YWJsZSk7XG5oYXJkZW4oYXNzZXJ0UmVtb3RhYmxlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzQ29weUFycmF5IjpbImlzQ29weUFycmF5Il0sImlzUmVjb3JkIjpbImlzUmVjb3JkIl0sImlzUmVtb3RhYmxlIjpbImlzUmVtb3RhYmxlIl0sImFzc2VydENvcHlBcnJheSI6WyJhc3NlcnRDb3B5QXJyYXkiXSwiYXNzZXJ0UmVjb3JkIjpbImFzc2VydFJlY29yZCJdLCJhc3NlcnRSZW1vdGFibGUiOlsiYXNzZXJ0UmVtb3RhYmxlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACQAAABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAP0XT32IGAABiBgAAIgAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTAvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiLCIuL3NyYy9tZW1vLXJhY2UuanMiLCIuL3NyYy9pcy1wcm9taXNlLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJtYWtlUHJvbWlzZUtpdCIsInJhY2VQcm9taXNlcyJdLCJyZWV4cG9ydHMiOlsiLi9zcmMvaXMtcHJvbWlzZS5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0LG1lbW9SYWNlOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanNcIiwgW1tcIm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdFwiLFskaM2PX2EgPT4gKG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCA9ICRozY9fYSldXV1dLFtcIi4vc3JjL21lbW8tcmFjZS5qc1wiLCBbW1wibWVtb1JhY2VcIixbJGjNj19hID0+IChtZW1vUmFjZSA9ICRozY9fYSldXV1dLFtcIi4vc3JjL2lzLXByb21pc2UuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShtYWtlUHJvbWlzZUtpdCwnbmFtZScse3ZhbHVlOlwibWFrZVByb21pc2VLaXRcIn0pOyRozY9fb25jZS5tYWtlUHJvbWlzZUtpdChtYWtlUHJvbWlzZUtpdCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHJhY2VQcm9taXNlcywnbmFtZScse3ZhbHVlOlwicmFjZVByb21pc2VzXCJ9KTskaM2PX29uY2UucmFjZVByb21pc2VzKHJhY2VQcm9taXNlcyk7XG5cblxuXG5cblxuXG5cblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBCZXN0UGlwZWxpbmFibGVQcm9taXNlID0gZ2xvYmFsVGhpcy5IYW5kbGVkUHJvbWlzZSB8fCBQcm9taXNlO1xuXG4vKlxuXG5cblxuXG5cblxuICovXG4gICAgICAgZnVuY3Rpb24gbWFrZVByb21pc2VLaXQoKSB7XG4gIGNvbnN0IHsgcmVzb2x2ZSwgcmVqZWN0LCBleGVjdXRvciB9ID0gbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KCk7XG5cbiAgY29uc3QgcHJvbWlzZSA9IG5ldyBCZXN0UGlwZWxpbmFibGVQcm9taXNlKGV4ZWN1dG9yKTtcblxuICByZXR1cm4gaGFyZGVuKHsgcHJvbWlzZSwgcmVzb2x2ZSwgcmVqZWN0IH0pO1xufVxuaGFyZGVuKG1ha2VQcm9taXNlS2l0KTtcblxuLy9cbi8vXG4vL1xuXG4vKlxuXG5cblxuXG5cblxuXG5cblxuICovXG4gICAgICAgZnVuY3Rpb24gcmFjZVByb21pc2VzKHZhbHVlcykge1xuICByZXR1cm4gaGFyZGVuKG1lbW9SYWNlLmNhbGwoQmVzdFBpcGVsaW5hYmxlUHJvbWlzZSwgdmFsdWVzKSk7XG59XG5oYXJkZW4ocmFjZVByb21pc2VzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VQcm9taXNlS2l0IjpbIm1ha2VQcm9taXNlS2l0Il0sInJhY2VQcm9taXNlcyI6WyJyYWNlUHJvbWlzZXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAdYhBfmQCAABkAgAAKwAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTAvc3JjL2lzLXByb21pc2UuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImlzUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoaXNQcm9taXNlLCduYW1lJyx7dmFsdWU6XCJpc1Byb21pc2VcIn0pOyRozY9fb25jZS5pc1Byb21pc2UoaXNQcm9taXNlKTsvKlxuXG5cblxuXG4gKi9cbiAgICAgICBmdW5jdGlvbiBpc1Byb21pc2UobWF5YmVQcm9taXNlKSB7XG4gIHJldHVybiBQcm9taXNlLnJlc29sdmUobWF5YmVQcm9taXNlKSA9PT0gbWF5YmVQcm9taXNlO1xufVxuaGFyZGVuKGlzUHJvbWlzZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1Byb21pc2UiOlsiaXNQcm9taXNlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADnhrPBZCQAAWQkAACoAAABAZW5kby9wcm9taXNlLWtpdC12MS4xLjEwL3NyYy9tZW1vLXJhY2UuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1lbW9SYWNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4qL1xuXG5jb25zdCBpc09iamVjdCA9IHZhbHVlID0+IE9iamVjdCh2YWx1ZSkgPT09IHZhbHVlO1xuXG4vKlxuXG5cblxuXG4gKi9cblxuLypcblxuXG5cblxuICovXG5cbi8vXG4vL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3Qga25vd25Qcm9taXNlcyA9IG5ldyBXZWFrTWFwKCk7XG5cbi8qXG5cblxuICovXG5jb25zdCBtYXJrU2V0dGxlZCA9IHJlY29yZCA9PiB7XG4gIGlmICghcmVjb3JkIHx8IHJlY29yZC5zZXR0bGVkKSB7XG4gICAgcmV0dXJuIG5ldyBTZXQoKTtcbiAgfVxuXG4gIGNvbnN0IHsgZGVmZXJyZWRzIH0gPSByZWNvcmQ7XG4gIE9iamVjdC5hc3NpZ24ocmVjb3JkLCB7XG4gICAgZGVmZXJyZWRzOiB1bmRlZmluZWQsXG4gICAgc2V0dGxlZDogdHJ1ZSxcbiAgfSk7XG4gIE9iamVjdC5mcmVlemUocmVjb3JkKTtcbiAgcmV0dXJuIGRlZmVycmVkcztcbn07XG5cbi8qXG5cblxuXG4gKi9cbmNvbnN0IGdldE1lbW9SZWNvcmQgPSB2YWx1ZSA9PiB7XG4gIGlmICghaXNPYmplY3QodmFsdWUpKSB7XG4gICAgLy9cbiAgICAvL1xuICAgIC8vXG4gICAgLy9cbiAgICByZXR1cm4gaGFyZGVuKHsgc2V0dGxlZDogdHJ1ZSB9KTtcbiAgfVxuXG4gIGxldCByZWNvcmQgPSBrbm93blByb21pc2VzLmdldCh2YWx1ZSk7XG5cbiAgaWYgKCFyZWNvcmQpIHtcbiAgICByZWNvcmQgPSB7IGRlZmVycmVkczogbmV3IFNldCgpLCBzZXR0bGVkOiBmYWxzZSB9O1xuICAgIGtub3duUHJvbWlzZXMuc2V0KHZhbHVlLCByZWNvcmQpO1xuICAgIC8vXG4gICAgUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKFxuICAgICAgdmFsID0+IHtcbiAgICAgICAgZm9yIChjb25zdCB7IHJlc29sdmUgfSBvZiBtYXJrU2V0dGxlZChyZWNvcmQpKSB7XG4gICAgICAgICAgcmVzb2x2ZSh2YWwpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyID0+IHtcbiAgICAgICAgZm9yIChjb25zdCB7IHJlamVjdCB9IG9mIG1hcmtTZXR0bGVkKHJlY29yZCkpIHtcbiAgICAgICAgICByZWplY3QoZXJyKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICApO1xuICB9XG4gIHJldHVybiByZWNvcmQ7XG59O1xuXG5jb25zdCB7IHJhY2UgfSA9IHtcbiAgLypcblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAqL1xuICByYWNlKHZhbHVlcykge1xuICAgIGxldCBkZWZlcnJlZDtcbiAgICAvKiAgICAgICAgICAgICAgICAgKi9cbiAgICAvL1xuICAgIGNvbnN0IGNhY2hlZFZhbHVlcyA9IFtdO1xuICAgIGNvbnN0IEMgPSB0aGlzO1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBDKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGRlZmVycmVkID0geyByZXNvbHZlLCByZWplY3QgfTtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICAgIGNhY2hlZFZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgY29uc3QgeyBzZXR0bGVkLCBkZWZlcnJlZHMgfSA9IGdldE1lbW9SZWNvcmQodmFsdWUpO1xuICAgICAgICBpZiAoc2V0dGxlZCkge1xuICAgICAgICAgIC8vXG4gICAgICAgICAgLy9cbiAgICAgICAgICBDLnJlc29sdmUodmFsdWUpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBkZWZlcnJlZHMuYWRkKGRlZmVycmVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy9cbiAgICAvL1xuICAgIHJldHVybiByZXN1bHQuZmluYWxseSgoKSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIGNhY2hlZFZhbHVlcykge1xuICAgICAgICBjb25zdCB7IGRlZmVycmVkcyB9ID0gZ2V0TWVtb1JlY29yZCh2YWx1ZSk7XG4gICAgICAgIGlmIChkZWZlcnJlZHMpIHtcbiAgICAgICAgICBkZWZlcnJlZHMuZGVsZXRlKGRlZmVycmVkKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9LFxufTskaM2PX29uY2UucmFjZShyYWNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1lbW9SYWNlIjpbInJhY2UiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAjBsiNR8GAAAfBgAANQAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTAvc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Ly9cblxuLypcblxuXG5cblxuICovXG5cbi8qXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQgPSAoKSA9PiB7XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBsZXQgaW50ZXJuYWxSZXNvbHZlO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGxldCBpbnRlcm5hbFJlamVjdDtcblxuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICBjb25zdCByZXNvbHZlID0gdmFsdWUgPT4ge1xuICAgIGlmIChpbnRlcm5hbFJlc29sdmUpIHtcbiAgICAgIGludGVybmFsUmVzb2x2ZSh2YWx1ZSk7XG4gICAgICBpbnRlcm5hbFJlc29sdmUgPSBudWxsO1xuICAgICAgaW50ZXJuYWxSZWplY3QgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQoaW50ZXJuYWxSZXNvbHZlID09PSBudWxsKTtcbiAgICB9XG4gIH07XG5cbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHJlamVjdCA9IHJlYXNvbiA9PiB7XG4gICAgaWYgKGludGVybmFsUmVqZWN0KSB7XG4gICAgICBpbnRlcm5hbFJlamVjdChyZWFzb24pO1xuICAgICAgaW50ZXJuYWxSZXNvbHZlID0gbnVsbDtcbiAgICAgIGludGVybmFsUmVqZWN0ID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0KGludGVybmFsUmVqZWN0ID09PSBudWxsKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgZXhlY3V0b3IgPSAocmVzLCByZWopID0+IHtcbiAgICBhc3NlcnQoaW50ZXJuYWxSZXNvbHZlID09PSB1bmRlZmluZWQgJiYgaW50ZXJuYWxSZWplY3QgPT09IHVuZGVmaW5lZCk7XG4gICAgaW50ZXJuYWxSZXNvbHZlID0gcmVzO1xuICAgIGludGVybmFsUmVqZWN0ID0gcmVqO1xuICB9O1xuXG4gIHJldHVybiBoYXJkZW4oeyByZXNvbHZlLCByZWplY3QsIGV4ZWN1dG9yIH0pO1xufTskaM2PX29uY2UubWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCk7XG5oYXJkZW4obWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCI6WyJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAJgAAAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTAvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAE6Fc2ufAQAAnwEAACAAAABAZW5kby90cmFtcG9saW5lLXYxLjAuMy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy90cmFtcG9saW5lLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdHJhbXBvbGluZS5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy90cmFtcG9saW5lLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAM14fpGzBwAAswcAACkAAABAZW5kby90cmFtcG9saW5lLXYxLjAuMy9zcmMvdHJhbXBvbGluZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiYXN5bmNUcmFtcG9saW5lIiwiZ2VuZXJhdG9yUHJvdG90eXBlIiwic3luY1RyYW1wb2xpbmUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KHN5bmNUcmFtcG9saW5lLCduYW1lJyx7dmFsdWU6XCJzeW5jVHJhbXBvbGluZVwifSk7JGjNj19vbmNlLnN5bmNUcmFtcG9saW5lKHN5bmNUcmFtcG9saW5lKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoYXN5bmNUcmFtcG9saW5lLCduYW1lJyx7dmFsdWU6XCJhc3luY1RyYW1wb2xpbmVcIn0pOyRozY9fb25jZS5hc3luY1RyYW1wb2xpbmUoYXN5bmNUcmFtcG9saW5lKTsvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4vKlxuXG4gKi9cbmNvbnN0IHsgZ2V0UHJvdG90eXBlT2YgfSA9IE9iamVjdDtcbmNvbnN0IHsgYmluZCB9ID0gRnVuY3Rpb24ucHJvdG90eXBlO1xuY29uc3QgdW5jdXJyeVRoaXMgPSBiaW5kLmJpbmQoYmluZC5jYWxsKTsgLy9cbiAgICAgICBjb25zdCB7IHByb3RvdHlwZTogZ2VuZXJhdG9yUHJvdG90eXBlIH0gPSBnZXRQcm90b3R5cGVPZihcbiAgLy9cbiAgZnVuY3Rpb24qICgpIHt9LFxuKTskaM2PX29uY2UuZ2VuZXJhdG9yUHJvdG90eXBlKGdlbmVyYXRvclByb3RvdHlwZSk7XG5jb25zdCBnZW5lcmF0b3JOZXh0ID0gdW5jdXJyeVRoaXMoZ2VuZXJhdG9yUHJvdG90eXBlLm5leHQpO1xuY29uc3QgZ2VuZXJhdG9yVGhyb3cgPSB1bmN1cnJ5VGhpcyhnZW5lcmF0b3JQcm90b3R5cGUudGhyb3cpO1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBmdW5jdGlvbiBzeW5jVHJhbXBvbGluZShnZW5lcmF0b3JGbiwgLi4uYXJncykge1xuICBjb25zdCBpdGVyYXRvciA9IGdlbmVyYXRvckZuKC4uLmFyZ3MpO1xuICBsZXQgcmVzdWx0ID0gZ2VuZXJhdG9yTmV4dChpdGVyYXRvcik7XG4gIHdoaWxlICghcmVzdWx0LmRvbmUpIHtcbiAgICB0cnkge1xuICAgICAgcmVzdWx0ID0gZ2VuZXJhdG9yTmV4dChpdGVyYXRvciwgcmVzdWx0LnZhbHVlKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIHJlc3VsdCA9IGdlbmVyYXRvclRocm93KGl0ZXJhdG9yLCBlcnIpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0LnZhbHVlO1xufVxuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbiAgICAgICBhc3luYyBmdW5jdGlvbiBhc3luY1RyYW1wb2xpbmUoZ2VuZXJhdG9yRm4sIC4uLmFyZ3MpIHtcbiAgY29uc3QgaXRlcmF0b3IgPSBnZW5lcmF0b3JGbiguLi5hcmdzKTtcbiAgbGV0IHJlc3VsdCA9IGdlbmVyYXRvck5leHQoaXRlcmF0b3IpO1xuICB3aGlsZSAoIXJlc3VsdC5kb25lKSB7XG4gICAgdHJ5IHtcbiAgICAgIC8vXG4gICAgICBjb25zdCB2YWwgPSBhd2FpdCByZXN1bHQudmFsdWU7XG4gICAgICByZXN1bHQgPSBnZW5lcmF0b3JOZXh0KGl0ZXJhdG9yLCB2YWwpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgcmVzdWx0ID0gZ2VuZXJhdG9yVGhyb3coaXRlcmF0b3IsIGVycik7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQudmFsdWU7XG59XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZW5lcmF0b3JQcm90b3R5cGUiOlsiZ2VuZXJhdG9yUHJvdG90eXBlIl0sInN5bmNUcmFtcG9saW5lIjpbInN5bmNUcmFtcG9saW5lIl0sImFzeW5jVHJhbXBvbGluZSI6WyJhc3luY1RyYW1wb2xpbmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAvP8BQ5oCAACaAgAAGQAAAEBlbmRvL3ppcC12MS4wLjkvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvdHlwZXMuanMiLCIuL3NyYy9yZWFkZXIuanMiLCIuL3NyYy93cml0ZXIuanMiXSwiZXhwb3J0cyI6WyJyZWFkWmlwIiwicmVhZFppcCIsIndyaXRlWmlwIiwid3JpdGVaaXAiXSwicmVleHBvcnRzIjpbIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXSxbXCIuL3NyYy9yZWFkZXIuanNcIiwgW11dLFtcIi4vc3JjL3dyaXRlci5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL3JlYWRlci5qcyI6W1siWmlwUmVhZGVyIiwiWmlwUmVhZGVyIl0sWyJyZWFkWmlwIiwicmVhZFppcCJdXSwiLi9zcmMvd3JpdGVyLmpzIjpbWyJaaXBXcml0ZXIiLCJaaXBXcml0ZXIiXSxbIndyaXRlWmlwIiwid3JpdGVaaXAiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHVWounBFAAAwRQAACUAAABAZW5kby96aXAtdjEuMC45L3NyYy9idWZmZXItcmVhZGVyLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJCdWZmZXJSZWFkZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Ly9cbi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5cbmNvbnN0IHEgPSBKU09OLnN0cmluZ2lmeTtcblxuLypcblxuXG5cblxuXG5cbiAqL1xuXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG5jb25zdCBwcml2YXRlRmllbGRzID0gbmV3IFdlYWtNYXAoKTtcblxuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuY29uc3QgcHJpdmF0ZUZpZWxkc0dldCA9IHByaXZhdGVGaWVsZHMuZ2V0LmJpbmQocHJpdmF0ZUZpZWxkcyk7XG5cbiAgICAgICBjbGFzcyBCdWZmZXJSZWFkZXIge1xuICAvKlxuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihidWZmZXIpIHtcbiAgICBjb25zdCBieXRlcyA9IG5ldyBVaW50OEFycmF5KGJ1ZmZlcik7XG4gICAgY29uc3QgZGF0YSA9IG5ldyBEYXRhVmlldyhieXRlcy5idWZmZXIpO1xuICAgIHByaXZhdGVGaWVsZHMuc2V0KHRoaXMsIHtcbiAgICAgIGJ5dGVzLFxuICAgICAgZGF0YSxcbiAgICAgIGxlbmd0aDogYnl0ZXMubGVuZ3RoLFxuICAgICAgaW5kZXg6IDAsXG4gICAgICBvZmZzZXQ6IDAsXG4gICAgfSk7XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICBnZXQgbGVuZ3RoKCkge1xuICAgIHJldHVybiBwcml2YXRlRmllbGRzR2V0KHRoaXMpLmxlbmd0aDtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIGdldCBpbmRleCgpIHtcbiAgICByZXR1cm4gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKS5pbmRleDtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIHNldCBpbmRleChpbmRleCkge1xuICAgIHRoaXMuc2VlayhpbmRleCk7XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICBzZXQgb2Zmc2V0KG9mZnNldCkge1xuICAgIGNvbnN0IGZpZWxkcyA9IHByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4gICAgaWYgKG9mZnNldCA+IGZpZWxkcy5kYXRhLmJ5dGVMZW5ndGgpIHtcbiAgICAgIHRocm93IEVycm9yKCdDYW5ub3Qgc2V0IG9mZnNldCBiZXlvbmQgbGVuZ3RoIG9mIHVuZGVybHlpbmcgZGF0YScpO1xuICAgIH1cbiAgICBpZiAob2Zmc2V0IDwgMCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0Nhbm5vdCBzZXQgbmVnYXRpdmUgb2Zmc2V0Jyk7XG4gICAgfVxuICAgIGZpZWxkcy5vZmZzZXQgPSBvZmZzZXQ7XG4gICAgZmllbGRzLmxlbmd0aCA9IGZpZWxkcy5kYXRhLmJ5dGVMZW5ndGggLSBmaWVsZHMub2Zmc2V0O1xuICB9XG5cbiAgLypcblxuXG5cbiAgICovXG4gIGNhblNlZWsoaW5kZXgpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBwcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuICAgIHJldHVybiBpbmRleCA+PSAwICYmIGZpZWxkcy5vZmZzZXQgKyBpbmRleCA8PSBmaWVsZHMubGVuZ3RoO1xuICB9XG5cbiAgLypcblxuXG4gICAqL1xuICBhc3NlcnRDYW5TZWVrKGluZGV4KSB7XG4gICAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbiAgICBpZiAoIXRoaXMuY2FuU2VlayhpbmRleCkpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBgRW5kIG9mIGRhdGEgcmVhY2hlZCAoZGF0YSBsZW5ndGggPSAke2ZpZWxkcy5sZW5ndGh9LCBhc2tlZCBpbmRleCAke2luZGV4fWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8qXG5cblxuICAgKi9cbiAgc2VlayhpbmRleCkge1xuICAgIGNvbnN0IGZpZWxkcyA9IHByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4gICAgY29uc3QgcmVzdG9yZSA9IGZpZWxkcy5pbmRleDtcbiAgICB0aGlzLmFzc2VydENhblNlZWsoaW5kZXgpO1xuICAgIGZpZWxkcy5pbmRleCA9IGluZGV4O1xuICAgIHJldHVybiByZXN0b3JlO1xuICB9XG5cbiAgLypcblxuXG4gICAqL1xuICBwZWVrKHNpemUpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBwcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuICAgIC8vXG4gICAgc2l6ZSA9IE1hdGgubWF4KDAsIE1hdGgubWluKGZpZWxkcy5sZW5ndGggLSBmaWVsZHMuaW5kZXgsIHNpemUpKTtcbiAgICBpZiAoc2l6ZSA9PT0gMCkge1xuICAgICAgLy9cbiAgICAgIHJldHVybiBuZXcgVWludDhBcnJheSgwKTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gZmllbGRzLmJ5dGVzLnN1YmFycmF5KFxuICAgICAgZmllbGRzLm9mZnNldCArIGZpZWxkcy5pbmRleCxcbiAgICAgIGZpZWxkcy5vZmZzZXQgKyBmaWVsZHMuaW5kZXggKyBzaXplLFxuICAgICk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIGNhblJlYWQob2Zmc2V0KSB7XG4gICAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbiAgICByZXR1cm4gdGhpcy5jYW5TZWVrKGZpZWxkcy5pbmRleCArIG9mZnNldCk7XG4gIH1cblxuICAvKlxuXG5cblxuXG4gICAqL1xuICBhc3NlcnRDYW5SZWFkKG9mZnNldCkge1xuICAgIGNvbnN0IGZpZWxkcyA9IHByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4gICAgdGhpcy5hc3NlcnRDYW5TZWVrKGZpZWxkcy5pbmRleCArIG9mZnNldCk7XG4gIH1cblxuICAvKlxuXG5cblxuXG4gICAqL1xuICByZWFkKHNpemUpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBwcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuICAgIHRoaXMuYXNzZXJ0Q2FuUmVhZChzaXplKTtcbiAgICBjb25zdCByZXN1bHQgPSB0aGlzLnBlZWsoc2l6ZSk7XG4gICAgZmllbGRzLmluZGV4ICs9IHNpemU7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIHJlYWRVaW50OCgpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBwcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuICAgIHRoaXMuYXNzZXJ0Q2FuUmVhZCgxKTtcbiAgICBjb25zdCBpbmRleCA9IGZpZWxkcy5vZmZzZXQgKyBmaWVsZHMuaW5kZXg7XG4gICAgY29uc3QgdmFsdWUgPSBmaWVsZHMuZGF0YS5nZXRVaW50OChpbmRleCk7XG4gICAgZmllbGRzLmluZGV4ICs9IDE7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgLypcblxuXG4gICAqL1xuICByZWFkVWludDE2KGxpdHRsZUVuZGlhbikge1xuICAgIGNvbnN0IGZpZWxkcyA9IHByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4gICAgdGhpcy5hc3NlcnRDYW5SZWFkKDIpO1xuICAgIGNvbnN0IGluZGV4ID0gZmllbGRzLm9mZnNldCArIGZpZWxkcy5pbmRleDtcbiAgICBjb25zdCB2YWx1ZSA9IGZpZWxkcy5kYXRhLmdldFVpbnQxNihpbmRleCwgbGl0dGxlRW5kaWFuKTtcbiAgICBmaWVsZHMuaW5kZXggKz0gMjtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH1cblxuICAvKlxuXG5cbiAgICovXG4gIHJlYWRVaW50MzIobGl0dGxlRW5kaWFuKSB7XG4gICAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbiAgICB0aGlzLmFzc2VydENhblJlYWQoNCk7XG4gICAgY29uc3QgaW5kZXggPSBmaWVsZHMub2Zmc2V0ICsgZmllbGRzLmluZGV4O1xuICAgIGNvbnN0IHZhbHVlID0gZmllbGRzLmRhdGEuZ2V0VWludDMyKGluZGV4LCBsaXR0bGVFbmRpYW4pO1xuICAgIGZpZWxkcy5pbmRleCArPSA0O1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8qXG5cblxuICAgKi9cbiAgYnl0ZUF0KGluZGV4KSB7XG4gICAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbiAgICByZXR1cm4gZmllbGRzLmJ5dGVzW2ZpZWxkcy5vZmZzZXQgKyBpbmRleF07XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICBza2lwKG9mZnNldCkge1xuICAgIGNvbnN0IGZpZWxkcyA9IHByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4gICAgdGhpcy5zZWVrKGZpZWxkcy5pbmRleCArIG9mZnNldCk7XG4gIH1cblxuICAvKlxuXG5cbiAgICovXG4gIGV4cGVjdChleHBlY3RlZCkge1xuICAgIGNvbnN0IGZpZWxkcyA9IHByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4gICAgaWYgKCF0aGlzLm1hdGNoQXQoZmllbGRzLmluZGV4LCBleHBlY3RlZCkpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZmllbGRzLmluZGV4ICs9IGV4cGVjdGVkLmxlbmd0aDtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qXG5cblxuXG4gICAqL1xuICBtYXRjaEF0KGluZGV4LCBleHBlY3RlZCkge1xuICAgIGNvbnN0IGZpZWxkcyA9IHByaXZhdGVGaWVsZHNHZXQodGhpcyk7XG4gICAgaWYgKGluZGV4ICsgZXhwZWN0ZWQubGVuZ3RoID4gZmllbGRzLmxlbmd0aCB8fCBpbmRleCA8IDApIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHBlY3RlZC5sZW5ndGg7IGkgKz0gMSkge1xuICAgICAgaWYgKGV4cGVjdGVkW2ldICE9PSB0aGlzLmJ5dGVBdChpbmRleCArIGkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICBhc3NlcnQoZXhwZWN0ZWQpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBwcml2YXRlRmllbGRzR2V0KHRoaXMpO1xuICAgIGlmICghdGhpcy5leHBlY3QoZXhwZWN0ZWQpKSB7XG4gICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgYEV4cGVjdGVkICR7cShleHBlY3RlZCl9IGF0ICR7ZmllbGRzLmluZGV4fSwgZ290ICR7dGhpcy5wZWVrKFxuICAgICAgICAgIGV4cGVjdGVkLmxlbmd0aCxcbiAgICAgICAgKX1gLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKlxuXG5cbiAgICovXG4gIGZpbmRMYXN0KGV4cGVjdGVkKSB7XG4gICAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkc0dldCh0aGlzKTtcbiAgICBsZXQgaW5kZXggPSBmaWVsZHMubGVuZ3RoIC0gZXhwZWN0ZWQubGVuZ3RoO1xuICAgIHdoaWxlIChpbmRleCA+PSAwICYmICF0aGlzLm1hdGNoQXQoaW5kZXgsIGV4cGVjdGVkKSkge1xuICAgICAgaW5kZXggLT0gMTtcbiAgICB9XG4gICAgcmV0dXJuIGluZGV4O1xuICB9XG59JGjNj19vbmNlLiAgIEJ1ZmZlclJlYWRlcihCdWZmZXJSZWFkZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQnVmZmVyUmVhZGVyIjpbIkJ1ZmZlclJlYWRlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD1sqa4vg8AAL4PAAAlAAAAQGVuZG8vemlwLXYxLjAuOS9zcmMvYnVmZmVyLXdyaXRlci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiQnVmZmVyV3JpdGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8vXG4vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuXG4vKlxuXG5cblxuXG5cblxuXG4gKi9cbmNvbnN0IHByaXZhdGVGaWVsZHMgPSBuZXcgV2Vha01hcCgpO1xuXG4vKlxuXG4gKi9cbmNvbnN0IGdldFByaXZhdGVGaWVsZHMgPSBzZWxmID0+IHtcbiAgY29uc3QgZmllbGRzID0gcHJpdmF0ZUZpZWxkcy5nZXQoc2VsZik7XG4gIGlmICghZmllbGRzKSB7XG4gICAgdGhyb3cgRXJyb3IoJ0J1ZmZlcldyaXRlciBmaWVsZHMgYXJlIG5vdCBpbml0aWFsaXplZCcpO1xuICB9XG4gIHJldHVybiBmaWVsZHM7XG59O1xuXG5jb25zdCBhc3NlcnROYXROdW1iZXIgPSBuID0+IHtcbiAgaWYgKE51bWJlci5pc1NhZmVJbnRlZ2VyKG4pICYmIC8qICAgICAgICAgICAgICAgICAqLyAobikgPj0gMCkge1xuICAgIHJldHVybjtcbiAgfVxuICB0aHJvdyBUeXBlRXJyb3IoYG11c3QgYmUgYSBub24tbmVnYXRpdmUgaW50ZWdlciwgZ290ICR7bn1gKTtcbn07XG5cbiAgICAgICBjbGFzcyBCdWZmZXJXcml0ZXIge1xuICAvKlxuXG4gICAqL1xuICBnZXQgbGVuZ3RoKCkge1xuICAgIHJldHVybiBnZXRQcml2YXRlRmllbGRzKHRoaXMpLmxlbmd0aDtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIGdldCBpbmRleCgpIHtcbiAgICByZXR1cm4gZ2V0UHJpdmF0ZUZpZWxkcyh0aGlzKS5pbmRleDtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIHNldCBpbmRleChpbmRleCkge1xuICAgIHRoaXMuc2VlayhpbmRleCk7XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihjYXBhY2l0eSA9IDE2KSB7XG4gICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShjYXBhY2l0eSk7XG4gICAgY29uc3QgZGF0YSA9IG5ldyBEYXRhVmlldyhieXRlcy5idWZmZXIpO1xuICAgIHByaXZhdGVGaWVsZHMuc2V0KHRoaXMsIHtcbiAgICAgIGJ5dGVzLFxuICAgICAgZGF0YSxcbiAgICAgIGluZGV4OiAwLFxuICAgICAgbGVuZ3RoOiAwLFxuICAgICAgY2FwYWNpdHksXG4gICAgfSk7XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICBlbnN1cmVDYW5TZWVrKHJlcXVpcmVkKSB7XG4gICAgYXNzZXJ0TmF0TnVtYmVyKHJlcXVpcmVkKTtcbiAgICBjb25zdCBmaWVsZHMgPSBnZXRQcml2YXRlRmllbGRzKHRoaXMpO1xuICAgIGxldCBjYXBhY2l0eSA9IGZpZWxkcy5jYXBhY2l0eTtcbiAgICB3aGlsZSAoY2FwYWNpdHkgPCByZXF1aXJlZCkge1xuICAgICAgY2FwYWNpdHkgKj0gMjtcbiAgICB9XG4gICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShjYXBhY2l0eSk7XG4gICAgY29uc3QgZGF0YSA9IG5ldyBEYXRhVmlldyhieXRlcy5idWZmZXIpO1xuICAgIGJ5dGVzLnNldChmaWVsZHMuYnl0ZXMuc3ViYXJyYXkoMCwgZmllbGRzLmxlbmd0aCkpO1xuICAgIGZpZWxkcy5ieXRlcyA9IGJ5dGVzO1xuICAgIGZpZWxkcy5kYXRhID0gZGF0YTtcbiAgICBmaWVsZHMuY2FwYWNpdHkgPSBjYXBhY2l0eTtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIHNlZWsoaW5kZXgpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBnZXRQcml2YXRlRmllbGRzKHRoaXMpO1xuICAgIHRoaXMuZW5zdXJlQ2FuU2VlayhpbmRleCk7XG4gICAgZmllbGRzLmluZGV4ID0gaW5kZXg7XG4gICAgZmllbGRzLmxlbmd0aCA9IE1hdGgubWF4KGZpZWxkcy5pbmRleCwgZmllbGRzLmxlbmd0aCk7XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICBlbnN1cmVDYW5Xcml0ZShzaXplKSB7XG4gICAgYXNzZXJ0TmF0TnVtYmVyKHNpemUpO1xuICAgIGNvbnN0IGZpZWxkcyA9IGdldFByaXZhdGVGaWVsZHModGhpcyk7XG4gICAgdGhpcy5lbnN1cmVDYW5TZWVrKGZpZWxkcy5pbmRleCArIHNpemUpO1xuICB9XG5cbiAgLypcblxuICAgKi9cbiAgd3JpdGUoYnl0ZXMpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBnZXRQcml2YXRlRmllbGRzKHRoaXMpO1xuICAgIHRoaXMuZW5zdXJlQ2FuV3JpdGUoYnl0ZXMuYnl0ZUxlbmd0aCk7XG4gICAgZmllbGRzLmJ5dGVzLnNldChieXRlcywgZmllbGRzLmluZGV4KTtcbiAgICBmaWVsZHMuaW5kZXggKz0gYnl0ZXMuYnl0ZUxlbmd0aDtcbiAgICBmaWVsZHMubGVuZ3RoID0gTWF0aC5tYXgoZmllbGRzLmluZGV4LCBmaWVsZHMubGVuZ3RoKTtcbiAgfVxuXG4gIC8qXG5cblxuICAgKi9cbiAgd3JpdGVDb3B5KHN0YXJ0LCBlbmQpIHtcbiAgICBhc3NlcnROYXROdW1iZXIoc3RhcnQpO1xuICAgIGFzc2VydE5hdE51bWJlcihlbmQpO1xuICAgIGNvbnN0IGZpZWxkcyA9IGdldFByaXZhdGVGaWVsZHModGhpcyk7XG4gICAgY29uc3Qgc2l6ZSA9IGVuZCAtIHN0YXJ0O1xuICAgIHRoaXMuZW5zdXJlQ2FuV3JpdGUoc2l6ZSk7XG4gICAgZmllbGRzLmJ5dGVzLmNvcHlXaXRoaW4oZmllbGRzLmluZGV4LCBzdGFydCwgZW5kKTtcbiAgICBmaWVsZHMuaW5kZXggKz0gc2l6ZTtcbiAgICBmaWVsZHMubGVuZ3RoID0gTWF0aC5tYXgoZmllbGRzLmluZGV4LCBmaWVsZHMubGVuZ3RoKTtcbiAgfVxuXG4gIC8qXG5cbiAgICovXG4gIHdyaXRlVWludDgodmFsdWUpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBnZXRQcml2YXRlRmllbGRzKHRoaXMpO1xuICAgIHRoaXMuZW5zdXJlQ2FuV3JpdGUoMSk7XG4gICAgZmllbGRzLmRhdGEuc2V0VWludDgoZmllbGRzLmluZGV4LCB2YWx1ZSk7XG4gICAgZmllbGRzLmluZGV4ICs9IDE7XG4gICAgZmllbGRzLmxlbmd0aCA9IE1hdGgubWF4KGZpZWxkcy5pbmRleCwgZmllbGRzLmxlbmd0aCk7XG4gIH1cblxuICAvKlxuXG5cbiAgICovXG4gIHdyaXRlVWludDE2KHZhbHVlLCBsaXR0bGVFbmRpYW4pIHtcbiAgICBjb25zdCBmaWVsZHMgPSBnZXRQcml2YXRlRmllbGRzKHRoaXMpO1xuICAgIHRoaXMuZW5zdXJlQ2FuV3JpdGUoMik7XG4gICAgY29uc3QgaW5kZXggPSBmaWVsZHMuaW5kZXg7XG4gICAgZmllbGRzLmRhdGEuc2V0VWludDE2KGluZGV4LCB2YWx1ZSwgbGl0dGxlRW5kaWFuKTtcbiAgICBmaWVsZHMuaW5kZXggKz0gMjtcbiAgICBmaWVsZHMubGVuZ3RoID0gTWF0aC5tYXgoZmllbGRzLmluZGV4LCBmaWVsZHMubGVuZ3RoKTtcbiAgfVxuXG4gIC8qXG5cblxuICAgKi9cbiAgd3JpdGVVaW50MzIodmFsdWUsIGxpdHRsZUVuZGlhbikge1xuICAgIGNvbnN0IGZpZWxkcyA9IGdldFByaXZhdGVGaWVsZHModGhpcyk7XG4gICAgdGhpcy5lbnN1cmVDYW5Xcml0ZSg0KTtcbiAgICBjb25zdCBpbmRleCA9IGZpZWxkcy5pbmRleDtcbiAgICBmaWVsZHMuZGF0YS5zZXRVaW50MzIoaW5kZXgsIHZhbHVlLCBsaXR0bGVFbmRpYW4pO1xuICAgIGZpZWxkcy5pbmRleCArPSA0O1xuICAgIGZpZWxkcy5sZW5ndGggPSBNYXRoLm1heChmaWVsZHMuaW5kZXgsIGZpZWxkcy5sZW5ndGgpO1xuICB9XG5cbiAgLypcblxuXG5cbiAgICovXG4gIHN1YmFycmF5KGJlZ2luLCBlbmQpIHtcbiAgICBjb25zdCBmaWVsZHMgPSBnZXRQcml2YXRlRmllbGRzKHRoaXMpO1xuICAgIHJldHVybiBmaWVsZHMuYnl0ZXMuc3ViYXJyYXkoMCwgZmllbGRzLmxlbmd0aCkuc3ViYXJyYXkoYmVnaW4sIGVuZCk7XG4gIH1cblxuICAvKlxuXG5cblxuICAgKi9cbiAgc2xpY2UoYmVnaW4sIGVuZCkge1xuICAgIHJldHVybiB0aGlzLnN1YmFycmF5KGJlZ2luLCBlbmQpLnNsaWNlKCk7XG4gIH1cbn0kaM2PX29uY2UuICAgQnVmZmVyV3JpdGVyKEJ1ZmZlcldyaXRlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJCdWZmZXJXcml0ZXIiOlsiQnVmZmVyV3JpdGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANGQ2vyoAQAAqAEAACMAAABAZW5kby96aXAtdjEuMC45L3NyYy9jb21wcmVzc2lvbi5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiU1RPUkUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Ly9cblxuLy9cbiAgICAgICBjb25zdCBTVE9SRSA9IDA7JGjNj19vbmNlLlNUT1JFKFNUT1JFKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlNUT1JFIjpbIlNUT1JFIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAF7m0YE4BAAAOAQAAB0AAABAZW5kby96aXAtdjEuMC45L3NyYy9jcmMzMi5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiY3JjMzIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGNyYzMyLCduYW1lJyx7dmFsdWU6XCJjcmMzMlwifSk7JGjNj19vbmNlLmNyYzMyKGNyYzMyKTsvL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG5cbiAqL1xuXG4vL1xuLypcblxuICovXG5mdW5jdGlvbiBtYWtlVGFibGUoKSB7XG4gIGxldCBjO1xuICBjb25zdCB0YWJsZSA9IFtdO1xuXG4gIGZvciAobGV0IG4gPSAwOyBuIDwgMjU2OyBuICs9IDEpIHtcbiAgICBjID0gbjtcbiAgICBmb3IgKGxldCBrID0gMDsgayA8IDg7IGsgKz0gMSkge1xuICAgICAgYyA9IGMgJiAxID8gMHhlZGI4ODMyMCBeIChjID4+PiAxKSA6IGMgPj4+IDE7XG4gICAgfVxuICAgIHRhYmxlW25dID0gYztcbiAgfVxuXG4gIHJldHVybiB0YWJsZTtcbn1cblxuLy9cbmNvbnN0IHRhYmxlID0gbWFrZVRhYmxlKCk7XG5cbi8qXG5cblxuXG5cbiAqL1xuICAgICAgIGZ1bmN0aW9uIGNyYzMyKGJ5dGVzLCBsZW5ndGggPSBieXRlcy5sZW5ndGgsIGluZGV4ID0gMCwgY3JjID0gMCkge1xuICBjb25zdCBlbmQgPSBpbmRleCArIGxlbmd0aDtcblxuICBjcmMgXj0gLTE7XG5cbiAgZm9yIChsZXQgaSA9IGluZGV4OyBpIDwgZW5kOyBpICs9IDEpIHtcbiAgICBjcmMgPSAoY3JjID4+PiA4KSBeIHRhYmxlWyhjcmMgXiBieXRlc1tpXSkgJiAweGZmXTtcbiAgfVxuXG4gIHJldHVybiAoY3JjIF4gLTEpID4+PiAwO1xufVxufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY3JjMzIiOlsiY3JjMzIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAmapkq54qAACeKgAAJQAAAEBlbmRvL3ppcC12MS4wLjkvc3JjL2Zvcm1hdC1yZWFkZXIuanN7ImltcG9ydHMiOlsiLi90eXBlcy5qcyIsIi4vY3JjMzIuanMiLCIuL3NpZ25hdHVyZS5qcyIsIi4vY29tcHJlc3Npb24uanMiXSwiZXhwb3J0cyI6WyJyZWFkWmlwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgY3JjMzIsc2lnbmF0dXJlLGNvbXByZXNzaW9uOyRozY9faW1wb3J0cyhbW1wiLi90eXBlcy5qc1wiLCBbXV0sW1wiLi9jcmMzMi5qc1wiLCBbW1wiY3JjMzJcIixbJGjNj19hID0+IChjcmMzMiA9ICRozY9fYSldXV1dLFtcIi4vc2lnbmF0dXJlLmpzXCIsIFtbXCIqXCIsWyRozY9fYSA9PiAoc2lnbmF0dXJlID0gJGjNj19hKV1dXV0sW1wiLi9jb21wcmVzc2lvbi5qc1wiLCBbW1wiKlwiLFskaM2PX2EgPT4gKGNvbXByZXNzaW9uID0gJGjNj19hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkocmVhZFppcCwnbmFtZScse3ZhbHVlOlwicmVhZFppcFwifSk7JGjNj19vbmNlLnJlYWRaaXAocmVhZFppcCk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8vXG5jb25zdCBxID0gSlNPTi5zdHJpbmdpZnk7XG5cbmNvbnN0IE1BWF9WQUxVRV8xNkJJVFMgPSA2NTUzNTtcbmNvbnN0IE1BWF9WQUxVRV8zMkJJVFMgPSA0Mjk0OTY3Mjk1O1xuXG5jb25zdCB0ZXh0RGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcigpO1xuXG4vKlxuXG5cbiAqL1xuZnVuY3Rpb24gaXNFbmNyeXB0ZWQoYml0RmxhZykge1xuICByZXR1cm4gKGJpdEZsYWcgJiAweDAwMDEpID09PSAweDAwMDE7XG59XG5cbi8qXG5cblxuXG5cbiAqL1xuZnVuY3Rpb24gcmVhZERvc0RhdGVUaW1lKHJlYWRlcikge1xuICBjb25zdCBkb3NUaW1lID0gcmVhZGVyLnJlYWRVaW50MzIodHJ1ZSk7XG4gIHJldHVybiBuZXcgRGF0ZShcbiAgICBEYXRlLlVUQyhcbiAgICAgICgoZG9zVGltZSA+PiAyNSkgJiAweDdmKSArIDE5ODAsIC8vXG4gICAgICAoKGRvc1RpbWUgPj4gMjEpICYgMHgwZikgLSAxLCAvL1xuICAgICAgKGRvc1RpbWUgPj4gMTYpICYgMHgxZiwgLy9cbiAgICAgIChkb3NUaW1lID4+IDExKSAmIDB4MWYsIC8vXG4gICAgICAoZG9zVGltZSA+PiA1KSAmIDB4M2YsIC8vXG4gICAgICAoZG9zVGltZSAmIDB4MWYpIDw8IDEgIC8vXG4gICAgKSxcbiAgKTtcbn1cblxuLypcblxuXG4gKi9cbmZ1bmN0aW9uIHJlYWRIZWFkZXJzKHJlYWRlcikge1xuICByZXR1cm4ge1xuICAgIHZlcnNpb25OZWVkZWQ6IHJlYWRlci5yZWFkVWludDE2KHRydWUpLFxuICAgIGJpdEZsYWc6IHJlYWRlci5yZWFkVWludDE2KHRydWUpLFxuICAgIGNvbXByZXNzaW9uTWV0aG9kOiByZWFkZXIucmVhZFVpbnQxNih0cnVlKSxcbiAgICBkYXRlOiByZWFkRG9zRGF0ZVRpbWUocmVhZGVyKSxcbiAgICBjcmMzMjogcmVhZGVyLnJlYWRVaW50MzIodHJ1ZSksXG4gICAgY29tcHJlc3NlZExlbmd0aDogcmVhZGVyLnJlYWRVaW50MzIodHJ1ZSksXG4gICAgdW5jb21wcmVzc2VkTGVuZ3RoOiByZWFkZXIucmVhZFVpbnQzMih0cnVlKSxcbiAgfTtcbn1cblxuLypcblxuXG4gKi9cbmZ1bmN0aW9uIHJlYWRDZW50cmFsRmlsZUhlYWRlcihyZWFkZXIpIHtcbiAgY29uc3QgdmVyc2lvbiA9IHJlYWRlci5yZWFkVWludDgoKTtcbiAgY29uc3QgbWFkZUJ5ID0gcmVhZGVyLnJlYWRVaW50OCgpO1xuICBjb25zdCBoZWFkZXJzID0gcmVhZEhlYWRlcnMocmVhZGVyKTtcbiAgY29uc3QgbmFtZUxlbmd0aCA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBleHRyYUZpZWxkc0xlbmd0aCA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBjb21tZW50TGVuZ3RoID0gcmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG4gIGNvbnN0IGRpc2tOdW1iZXJTdGFydCA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBpbnRlcm5hbEZpbGVBdHRyaWJ1dGVzID0gcmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG4gIGNvbnN0IGV4dGVybmFsRmlsZUF0dHJpYnV0ZXMgPSByZWFkZXIucmVhZFVpbnQzMih0cnVlKTtcbiAgY29uc3QgZmlsZVN0YXJ0ID0gcmVhZGVyLnJlYWRVaW50MzIodHJ1ZSk7XG5cbiAgY29uc3QgbmFtZSA9IHJlYWRlci5yZWFkKG5hbWVMZW5ndGgpO1xuICAvL1xuICByZWFkZXIuc2tpcChleHRyYUZpZWxkc0xlbmd0aCk7XG5cbiAgaWYgKGhlYWRlcnMudW5jb21wcmVzc2VkTGVuZ3RoID09PSBNQVhfVkFMVUVfMzJCSVRTKSB7XG4gICAgdGhyb3cgRXJyb3IoJ0Nhbm5vdCByZWFkIFppcDY0Jyk7XG4gIH1cbiAgaWYgKGhlYWRlcnMuY29tcHJlc3NlZExlbmd0aCA9PT0gTUFYX1ZBTFVFXzMyQklUUykge1xuICAgIHRocm93IEVycm9yKCdDYW5ub3QgcmVhZCBaaXA2NCcpO1xuICB9XG4gIGlmIChmaWxlU3RhcnQgPT09IE1BWF9WQUxVRV8zMkJJVFMpIHtcbiAgICB0aHJvdyBFcnJvcignQ2Fubm90IHJlYWQgWmlwNjQnKTtcbiAgfVxuICBpZiAoZGlza051bWJlclN0YXJ0ID09PSBNQVhfVkFMVUVfMzJCSVRTKSB7XG4gICAgdGhyb3cgRXJyb3IoJ0Nhbm5vdCByZWFkIFppcDY0Jyk7XG4gIH1cblxuICBjb25zdCBjb21tZW50ID0gcmVhZGVyLnJlYWQoY29tbWVudExlbmd0aCk7XG5cbiAgcmV0dXJuIHtcbiAgICBuYW1lLFxuICAgIHZlcnNpb24sXG4gICAgbWFkZUJ5LFxuICAgIC4uLmhlYWRlcnMsXG4gICAgZGlza051bWJlclN0YXJ0LFxuICAgIGludGVybmFsRmlsZUF0dHJpYnV0ZXMsXG4gICAgZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyxcbiAgICBmaWxlU3RhcnQsXG4gICAgY29tbWVudCxcbiAgfTtcbn1cblxuLypcblxuXG5cbiAqL1xuZnVuY3Rpb24gcmVhZENlbnRyYWxEaXJlY3RvcnkocmVhZGVyLCBsb2NhdG9yKSB7XG4gIGNvbnN0IHsgY2VudHJhbERpcmVjdG9yeU9mZnNldCwgY2VudHJhbERpcmVjdG9yeVJlY29yZHMgfSA9IGxvY2F0b3I7XG4gIHJlYWRlci5zZWVrKGNlbnRyYWxEaXJlY3RvcnlPZmZzZXQpO1xuXG4gIGNvbnN0IGVudHJpZXMgPSBbXTtcbiAgd2hpbGUgKHJlYWRlci5leHBlY3Qoc2lnbmF0dXJlLkNFTlRSQUxfRklMRV9IRUFERVIpKSB7XG4gICAgY29uc3QgZW50cnkgPSByZWFkQ2VudHJhbEZpbGVIZWFkZXIocmVhZGVyKTtcbiAgICBlbnRyaWVzLnB1c2goZW50cnkpO1xuICB9XG5cbiAgaWYgKGNlbnRyYWxEaXJlY3RvcnlSZWNvcmRzICE9PSBlbnRyaWVzLmxlbmd0aCkge1xuICAgIC8vXG4gICAgLy9cbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBDb3JydXB0ZWQgemlwIG9yIGJ1ZzogZXhwZWN0ZWQgJHtjZW50cmFsRGlyZWN0b3J5UmVjb3Jkc30gcmVjb3JkcyBpbiBjZW50cmFsIGRpciwgZ290ICR7ZW50cmllcy5sZW5ndGh9YCxcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuIGVudHJpZXM7XG59XG5cbi8qXG5cblxuICovXG5mdW5jdGlvbiByZWFkRmlsZShyZWFkZXIpIHtcbiAgcmVhZGVyLmV4cGVjdChzaWduYXR1cmUuTE9DQUxfRklMRV9IRUFERVIpO1xuICBjb25zdCBoZWFkZXJzID0gcmVhZEhlYWRlcnMocmVhZGVyKTtcbiAgY29uc3QgbmFtZUxlbmd0aCA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBleHRyYUZpZWxkc0xlbmd0aCA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBuYW1lID0gcmVhZGVyLnJlYWQobmFtZUxlbmd0aCk7XG4gIHJlYWRlci5za2lwKGV4dHJhRmllbGRzTGVuZ3RoKTtcbiAgY29uc3QgY29udGVudCA9IHJlYWRlci5yZWFkKGhlYWRlcnMuY29tcHJlc3NlZExlbmd0aCk7XG4gIHJldHVybiB7IG5hbWUsIC4uLmhlYWRlcnMsIGNvbnRlbnQgfTtcbn1cblxuLypcblxuXG5cbiAqL1xuZnVuY3Rpb24gcmVhZExvY2FsRmlsZXMocmVhZGVyLCByZWNvcmRzKSB7XG4gIGNvbnN0IGZpbGVzID0gW107XG4gIGZvciAoY29uc3QgcmVjb3JkIG9mIHJlY29yZHMpIHtcbiAgICByZWFkZXIuc2VlayhyZWNvcmQuZmlsZVN0YXJ0KTtcbiAgICBjb25zdCBmaWxlID0gcmVhZEZpbGUocmVhZGVyKTtcbiAgICBmaWxlcy5wdXNoKGZpbGUpO1xuICB9XG4gIHJldHVybiBmaWxlcztcbn1cblxuLypcblxuXG4gKi9cbmZ1bmN0aW9uIHJlYWRCbG9ja0VuZE9mQ2VudHJhbChyZWFkZXIpIHtcbiAgaWYgKCFyZWFkZXIuZXhwZWN0KHNpZ25hdHVyZS5DRU5UUkFMX0RJUkVDVE9SWV9FTkQpKSB7XG4gICAgdGhyb3cgRXJyb3IoXG4gICAgICAnQ29ycnVwdCB6aXAgZmlsZSwgb3IgemlwIGZpbGUgY29udGFpbmluZyBhbiB1bnN1cHBvcnRlZCB2YXJpYWJsZS13aWR0aCBlbmQtb2YtYXJjaGl2ZSBjb21tZW50LCBvciBhbiB1bnN1cHBvcnRlZCB6aXAgZmlsZSB3aXRoIDY0IGJpdCBzaXplcycsXG4gICAgKTtcbiAgfVxuICBjb25zdCBkaXNrTnVtYmVyID0gcmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG4gIGNvbnN0IGRpc2tXaXRoQ2VudHJhbERpclN0YXJ0ID0gcmVhZGVyLnJlYWRVaW50MTYodHJ1ZSk7XG4gIGNvbnN0IGNlbnRyYWxEaXJlY3RvcnlSZWNvcmRzT25UaGlzRGlzayA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBjZW50cmFsRGlyZWN0b3J5UmVjb3JkcyA9IHJlYWRlci5yZWFkVWludDE2KHRydWUpO1xuICBjb25zdCBjZW50cmFsRGlyZWN0b3J5U2l6ZSA9IHJlYWRlci5yZWFkVWludDMyKHRydWUpO1xuICBjb25zdCBjZW50cmFsRGlyZWN0b3J5T2Zmc2V0ID0gcmVhZGVyLnJlYWRVaW50MzIodHJ1ZSk7XG4gIGNvbnN0IGNvbW1lbnRMZW5ndGggPSByZWFkZXIucmVhZFVpbnQxNih0cnVlKTtcbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgY29tbWVudCA9IHRleHREZWNvZGVyLmRlY29kZShyZWFkZXIucmVhZChjb21tZW50TGVuZ3RoKSk7XG4gIHJldHVybiB7XG4gICAgZGlza051bWJlcixcbiAgICBkaXNrV2l0aENlbnRyYWxEaXJTdGFydCxcbiAgICBjZW50cmFsRGlyZWN0b3J5UmVjb3Jkc09uVGhpc0Rpc2ssXG4gICAgY2VudHJhbERpcmVjdG9yeVJlY29yZHMsXG4gICAgY2VudHJhbERpcmVjdG9yeVNpemUsXG4gICAgY2VudHJhbERpcmVjdG9yeU9mZnNldCxcbiAgICBjb21tZW50LFxuICB9O1xufVxuXG4vKlxuXG5cbiAqL1xuZnVuY3Rpb24gcmVhZEVuZE9mQ2VudHJhbERpcmVjdG9yeVJlY29yZChyZWFkZXIpIHtcbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgY2VudHJhbERpcmVjdG9yeUVuZCA9IHJlYWRlci5sZW5ndGggLSAyMjtcbiAgaWYgKGNlbnRyYWxEaXJlY3RvcnlFbmQgPCAwKSB7XG4gICAgdGhyb3cgRXJyb3IoJ0NvcnJ1cHRlZCB6aXA6IG5vdCBlbm91Z2ggY29udGVudCcpO1xuICB9XG4gIHJlYWRlci5zZWVrKGNlbnRyYWxEaXJlY3RvcnlFbmQpO1xuICBjb25zdCBsb2NhdG9yID0gcmVhZEJsb2NrRW5kT2ZDZW50cmFsKHJlYWRlcik7XG5cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgLy9cbiAgY29uc3QgemlwNjQgPVxuICAgIGxvY2F0b3IuZGlza051bWJlciA9PT0gTUFYX1ZBTFVFXzE2QklUUyB8fFxuICAgIGxvY2F0b3IuZGlza1dpdGhDZW50cmFsRGlyU3RhcnQgPT09IE1BWF9WQUxVRV8xNkJJVFMgfHxcbiAgICBsb2NhdG9yLmNlbnRyYWxEaXJlY3RvcnlSZWNvcmRzT25UaGlzRGlzayA9PT0gTUFYX1ZBTFVFXzE2QklUUyB8fFxuICAgIGxvY2F0b3IuY2VudHJhbERpcmVjdG9yeVJlY29yZHMgPT09IE1BWF9WQUxVRV8xNkJJVFMgfHxcbiAgICBsb2NhdG9yLmNlbnRyYWxEaXJlY3RvcnlTaXplID09PSBNQVhfVkFMVUVfMzJCSVRTIHx8XG4gICAgbG9jYXRvci5jZW50cmFsRGlyZWN0b3J5T2Zmc2V0ID09PSBNQVhfVkFMVUVfMzJCSVRTO1xuXG4gIGlmICh6aXA2NCkge1xuICAgIHRocm93IEVycm9yKCdDYW5ub3QgcmVhZCBaaXA2NCcpO1xuICB9XG5cbiAgY29uc3Qge1xuICAgIGNlbnRyYWxEaXJlY3RvcnlPZmZzZXQsXG4gICAgY2VudHJhbERpcmVjdG9yeVNpemVcbiAgICAvL1xuICB9ID0gbG9jYXRvcjtcblxuICBjb25zdCBleHBlY3RlZENlbnRyYWxEaXJlY3RvcnlFbmQgPVxuICAgIGNlbnRyYWxEaXJlY3RvcnlPZmZzZXQgKyBjZW50cmFsRGlyZWN0b3J5U2l6ZTtcbiAgY29uc3QgZXh0cmFCeXRlcyA9IGNlbnRyYWxEaXJlY3RvcnlFbmQgLSBleHBlY3RlZENlbnRyYWxEaXJlY3RvcnlFbmQ7XG5cbiAgcmVhZGVyLm9mZnNldCA9IGV4dHJhQnl0ZXM7XG5cbiAgcmV0dXJuIGxvY2F0b3I7XG59XG5cbi8qXG5cblxuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrUmVjb3JkcyhjZW50cmFsUmVjb3JkLCBsb2NhbFJlY29yZCwgYXJjaGl2ZU5hbWUpIHtcbiAgY29uc3QgY2VudHJhbE5hbWUgPSB0ZXh0RGVjb2Rlci5kZWNvZGUoY2VudHJhbFJlY29yZC5uYW1lKTtcbiAgY29uc3QgbG9jYWxOYW1lID0gdGV4dERlY29kZXIuZGVjb2RlKGxvY2FsUmVjb3JkLm5hbWUpO1xuXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIC8vXG4gIGlmIChjZW50cmFsTmFtZS5yZXBsYWNlKC9cXFxcL2csICcvJykgIT09IGxvY2FsTmFtZSkge1xuICAgIHRocm93IEVycm9yKFxuICAgICAgYFppcCBpbnRlZ3JpdHkgZXJyb3I6IGNlbnRyYWwgcmVjb3JkIGZpbGUgbmFtZSAke3EoXG4gICAgICAgIGNlbnRyYWxOYW1lLFxuICAgICAgKX0gbXVzdCBtYXRjaCBsb2NhbCBmaWxlIG5hbWUgJHtxKGxvY2FsTmFtZSl9IGluIGFyY2hpdmUgJHtxKFxuICAgICAgICBhcmNoaXZlTmFtZSxcbiAgICAgICl9YCxcbiAgICApO1xuICB9XG5cbiAgLypcblxuXG4gICAqL1xuICBmdW5jdGlvbiBjaGVjayh2YWx1ZSwgbWVzc2FnZSkge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHRocm93IEVycm9yKFxuICAgICAgICBgWmlwIGludGVncml0eSBlcnJvcjogJHttZXNzYWdlfSBmb3IgZmlsZSAke3EoXG4gICAgICAgICAgbG9jYWxOYW1lLFxuICAgICAgICApfSBpbiBhcmNoaXZlICR7cShhcmNoaXZlTmFtZSl9YCxcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgY2hlY2soXG4gICAgY2VudHJhbFJlY29yZC5iaXRGbGFnID09PSBsb2NhbFJlY29yZC5iaXRGbGFnLFxuICAgIGBDZW50cmFsIHJlY29yZCBiaXQgZmxhZyAke2NlbnRyYWxSZWNvcmQuYml0RmxhZy50b1N0cmluZyhcbiAgICAgIDE2LFxuICAgICl9IG11c3QgbWF0Y2ggbG9jYWwgcmVjb3JkIGJpdCBmbGFnICR7bG9jYWxSZWNvcmQuYml0RmxhZy50b1N0cmluZygxNil9YCxcbiAgKTtcbiAgY2hlY2soXG4gICAgY2VudHJhbFJlY29yZC5jb21wcmVzc2lvbk1ldGhvZCA9PT0gbG9jYWxSZWNvcmQuY29tcHJlc3Npb25NZXRob2QsXG4gICAgYENlbnRyYWwgcmVjb3JkIGNvbXByZXNzaW9uIG1ldGhvZCAke3EoXG4gICAgICBjZW50cmFsUmVjb3JkLmNvbXByZXNzaW9uTWV0aG9kLFxuICAgICl9IG11c3QgbWF0Y2ggbG9jYWwgY29tcHJlc3Npb24gbWV0aG9kICR7cShsb2NhbFJlY29yZC5jb21wcmVzc2lvbk1ldGhvZCl9YCxcbiAgKTtcbiAgLy9cbiAgLy9cbiAgY2hlY2soXG4gICAgY2VudHJhbFJlY29yZC5jcmMzMiA9PT0gbG9jYWxSZWNvcmQuY3JjMzIsXG4gICAgYENlbnRyYWwgcmVjb3JkIENSQy0zMiBjaGVja3N1bSAke2NlbnRyYWxSZWNvcmQuY3JjMzJ9IG11c3QgbWF0Y2ggbG9jYWwgY2hlY2tzdW0gJHtsb2NhbFJlY29yZC5jcmMzMn1gLFxuICApO1xuICBjaGVjayhcbiAgICBjZW50cmFsUmVjb3JkLmNvbXByZXNzZWRMZW5ndGggPT09IGxvY2FsUmVjb3JkLmNvbXByZXNzZWRMZW5ndGgsXG4gICAgYENlbnRyYWwgcmVjb3JkIGNvbXByZXNzZWQgc2l6ZSAke2NlbnRyYWxSZWNvcmQuY29tcHJlc3NlZExlbmd0aH0gbXVzdCBtYXRjaCBsb2NhbCAke2xvY2FsUmVjb3JkLmNvbXByZXNzZWRMZW5ndGh9YCxcbiAgKTtcbiAgY2hlY2soXG4gICAgY2VudHJhbFJlY29yZC51bmNvbXByZXNzZWRMZW5ndGggPT09IGxvY2FsUmVjb3JkLnVuY29tcHJlc3NlZExlbmd0aCxcbiAgICBgQ2VudHJhbCByZWNvcmQgdW5jb21wcmVzc2VkIHNpemUgJHtjZW50cmFsUmVjb3JkLnVuY29tcHJlc3NlZExlbmd0aH0gbXVzdCBtYXRjaCBsb2NhbCAke2xvY2FsUmVjb3JkLnVuY29tcHJlc3NlZExlbmd0aH1gLFxuICApO1xuXG4gIGNvbnN0IGNoZWNrc3VtID0gY3JjMzIobG9jYWxSZWNvcmQuY29udGVudCk7XG4gIGNoZWNrKFxuICAgIGNoZWNrc3VtID09PSBsb2NhbFJlY29yZC5jcmMzMixcbiAgICBgQ1JDLTMyIGNoZWNrc3VtIG1pc21hdGNoLCB3YW50ZWQgJHtsb2NhbFJlY29yZC5jcmMzMn0gYnV0IGFjdHVhbCBjb250ZW50IGlzICR7Y2hlY2tzdW19YCxcbiAgKTtcbn1cblxuLypcblxuICovXG5mdW5jdGlvbiBtb2RlRm9yRXh0ZXJuYWxBdHRyaWJ1dGVzKGV4dGVybmFsRmlsZUF0dHJpYnV0ZXMpIHtcbiAgcmV0dXJuIChleHRlcm5hbEZpbGVBdHRyaWJ1dGVzID4+IDE2KSAmIDB4ZmZmZjtcbn1cblxuLypcblxuXG5cbiAqL1xuZnVuY3Rpb24gcmVjb3JkVG9GaWxlKGNlbnRyYWxSZWNvcmQsIGxvY2FsUmVjb3JkKSB7XG4gIGNvbnN0IG1vZGUgPSBtb2RlRm9yRXh0ZXJuYWxBdHRyaWJ1dGVzKGNlbnRyYWxSZWNvcmQuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyk7XG4gIHJldHVybiB7XG4gICAgbmFtZTogY2VudHJhbFJlY29yZC5uYW1lLFxuICAgIG1vZGUsXG4gICAgZGF0ZTogY2VudHJhbFJlY29yZC5kYXRlLFxuICAgIGNyYzMyOiBjZW50cmFsUmVjb3JkLmNyYzMyLFxuICAgIGNvbXByZXNzaW9uTWV0aG9kOiBjZW50cmFsUmVjb3JkLmNvbXByZXNzaW9uTWV0aG9kLFxuICAgIGNvbXByZXNzZWRMZW5ndGg6IGNlbnRyYWxSZWNvcmQuY29tcHJlc3NlZExlbmd0aCxcbiAgICB1bmNvbXByZXNzZWRMZW5ndGg6IGNlbnRyYWxSZWNvcmQudW5jb21wcmVzc2VkTGVuZ3RoLFxuICAgIGNvbnRlbnQ6IGxvY2FsUmVjb3JkLmNvbnRlbnQsXG4gICAgY29tbWVudDogY2VudHJhbFJlY29yZC5jb21tZW50LFxuICB9O1xufVxuXG4vKlxuXG5cbiAqL1xuZnVuY3Rpb24gZGVjb21wcmVzc0ZpbGUoZmlsZSkge1xuICBpZiAoZmlsZS5jb21wcmVzc2lvbk1ldGhvZCAhPT0gY29tcHJlc3Npb24uU1RPUkUpIHtcbiAgICB0aHJvdyBFcnJvcihcbiAgICAgIGBDYW5ub3QgZmluZCBkZWNvbXByZXNzb3IgZm9yIGNvbXByZXNzaW9uIG1ldGhvZCAke3EoXG4gICAgICAgIGZpbGUuY29tcHJlc3Npb25NZXRob2QsXG4gICAgICApfSBmb3IgZmlsZSAke2ZpbGUubmFtZX1gLFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBmaWxlLm5hbWUsXG4gICAgbW9kZTogZmlsZS5tb2RlLFxuICAgIGRhdGU6IGZpbGUuZGF0ZSxcbiAgICBjb250ZW50OiBmaWxlLmNvbnRlbnQsXG4gICAgY29tbWVudDogZmlsZS5jb21tZW50LFxuICB9O1xufVxuXG4vKlxuXG5cbiAqL1xuZnVuY3Rpb24gZGVjb2RlRmlsZShmaWxlKSB7XG4gIGNvbnN0IG5hbWUgPSB0ZXh0RGVjb2Rlci5kZWNvZGUoZmlsZS5uYW1lKTtcbiAgY29uc3QgY29tbWVudCA9IHRleHREZWNvZGVyLmRlY29kZShmaWxlLmNvbW1lbnQpO1xuICByZXR1cm4ge1xuICAgIG5hbWUsXG4gICAgdHlwZTogJ2ZpbGUnLFxuICAgIG1vZGU6IGZpbGUubW9kZSAmIDBvNzc3LFxuICAgIGRhdGU6IGZpbGUuZGF0ZSxcbiAgICBjb250ZW50OiBmaWxlLmNvbnRlbnQsXG4gICAgY29tbWVudCxcbiAgfTtcbn1cblxuLypcblxuXG4gKi9cbiAgICAgICBmdW5jdGlvbiByZWFkWmlwKHJlYWRlciwgbmFtZSA9ICc8dW5rbm93bj4nKSB7XG4gIGNvbnN0IGxvY2F0b3IgPSByZWFkRW5kT2ZDZW50cmFsRGlyZWN0b3J5UmVjb3JkKHJlYWRlcik7XG4gIGNvbnN0IGNlbnRyYWxSZWNvcmRzID0gcmVhZENlbnRyYWxEaXJlY3RvcnkocmVhZGVyLCBsb2NhdG9yKTtcbiAgY29uc3QgbG9jYWxSZWNvcmRzID0gcmVhZExvY2FsRmlsZXMocmVhZGVyLCBjZW50cmFsUmVjb3Jkcyk7XG4gIGNvbnN0IGZpbGVzID0gbmV3IE1hcCgpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgY2VudHJhbFJlY29yZHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCBjZW50cmFsUmVjb3JkID0gY2VudHJhbFJlY29yZHNbaV07XG4gICAgY29uc3QgbG9jYWxSZWNvcmQgPSBsb2NhbFJlY29yZHNbaV07XG5cbiAgICBjaGVja1JlY29yZHMoY2VudHJhbFJlY29yZCwgbG9jYWxSZWNvcmQsIG5hbWUpO1xuXG4gICAgaWYgKGlzRW5jcnlwdGVkKGNlbnRyYWxSZWNvcmQuYml0RmxhZykpIHtcbiAgICAgIHRocm93IEVycm9yKCdFbmNyeXB0ZWQgemlwIGFyZSBub3Qgc3VwcG9ydGVkJyk7XG4gICAgfVxuXG4gICAgY29uc3QgaXNEaXIgPSAoY2VudHJhbFJlY29yZC5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzICYgMHgwMDEwKSAhPT0gMDtcbiAgICBpZiAoIWlzRGlyKSB7XG4gICAgICBjb25zdCBjb21wcmVzc2VkRmlsZSA9IHJlY29yZFRvRmlsZShjZW50cmFsUmVjb3JkLCBsb2NhbFJlY29yZCk7XG4gICAgICBjb25zdCBkZWNvbXByZXNzZWRGaWxlID0gZGVjb21wcmVzc0ZpbGUoY29tcHJlc3NlZEZpbGUpO1xuICAgICAgY29uc3QgZGVjb2RlZEZpbGUgPSBkZWNvZGVGaWxlKGRlY29tcHJlc3NlZEZpbGUpO1xuICAgICAgZmlsZXMuc2V0KGRlY29kZWRGaWxlLm5hbWUsIGRlY29kZWRGaWxlKTtcbiAgICB9XG4gICAgLy9cbiAgfVxuICByZXR1cm4gZmlsZXM7XG59XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJyZWFkWmlwIjpbInJlYWRaaXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAiv8HosEWAADBFgAAJQAAAEBlbmRvL3ppcC12MS4wLjkvc3JjL2Zvcm1hdC13cml0ZXIuanN7ImltcG9ydHMiOlsiLi9jcmMzMi5qcyIsIi4vc2lnbmF0dXJlLmpzIiwiLi9jb21wcmVzc2lvbi5qcyJdLCJleHBvcnRzIjpbIndyaXRlWmlwIiwid3JpdGVaaXBSZWNvcmRzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgY3JjMzIsc2lnbmF0dXJlLGNvbXByZXNzaW9uOyRozY9faW1wb3J0cyhbW1wiLi9jcmMzMi5qc1wiLCBbW1wiY3JjMzJcIixbJGjNj19hID0+IChjcmMzMiA9ICRozY9fYSldXV1dLFtcIi4vc2lnbmF0dXJlLmpzXCIsIFtbXCIqXCIsWyRozY9fYSA9PiAoc2lnbmF0dXJlID0gJGjNj19hKV1dXV0sW1wiLi9jb21wcmVzc2lvbi5qc1wiLCBbW1wiKlwiLFskaM2PX2EgPT4gKGNvbXByZXNzaW9uID0gJGjNj19hKV1dXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkod3JpdGVaaXBSZWNvcmRzLCduYW1lJyx7dmFsdWU6XCJ3cml0ZVppcFJlY29yZHNcIn0pOyRozY9fb25jZS53cml0ZVppcFJlY29yZHMod3JpdGVaaXBSZWNvcmRzKTtPYmplY3QuZGVmaW5lUHJvcGVydHkod3JpdGVaaXAsJ25hbWUnLHt2YWx1ZTpcIndyaXRlWmlwXCJ9KTskaM2PX29uY2Uud3JpdGVaaXAod3JpdGVaaXApO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgVU5JWCA9IDM7XG5jb25zdCBVTklYX1ZFUlNJT04gPSAzMDtcblxuY29uc3QgdGV4dEVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcblxuLypcblxuXG5cblxuICovXG5mdW5jdGlvbiB3cml0ZURvc0RhdGVUaW1lKHdyaXRlciwgZGF0ZSkge1xuICBjb25zdCBkb3NUaW1lID1cbiAgICBkYXRlICE9PSB1bmRlZmluZWQgJiYgZGF0ZSAhPT0gbnVsbFxuICAgICAgPyAoKChkYXRlLmdldFVUQ0Z1bGxZZWFyKCkgLSAxOTgwKSAmIDB4N2YpIDw8IDI1KSB8IC8vXG4gICAgICAgICgoZGF0ZS5nZXRVVENNb250aCgpICsgMSkgPDwgMjEpIHwgLy9cbiAgICAgICAgKGRhdGUuZ2V0VVRDRGF0ZSgpIDw8IDE2KSB8IC8vXG4gICAgICAgIChkYXRlLmdldFVUQ0hvdXJzKCkgPDwgMTEpIHwgLy9cbiAgICAgICAgKGRhdGUuZ2V0VVRDTWludXRlcygpIDw8IDUpIHwgLy9cbiAgICAgICAgKGRhdGUuZ2V0VVRDU2Vjb25kcygpID4+IDEpIC8vXG4gICAgICA6IDA7IC8vXG4gIHdyaXRlci53cml0ZVVpbnQzMihkb3NUaW1lLCB0cnVlKTtcbn1cblxuLypcblxuXG5cbiAqL1xuZnVuY3Rpb24gd3JpdGVGaWxlKHdyaXRlciwgZmlsZSkge1xuICAvL1xuICBjb25zdCBmaWxlU3RhcnQgPSB3cml0ZXIuaW5kZXg7XG4gIHdyaXRlci53cml0ZShzaWduYXR1cmUuTE9DQUxfRklMRV9IRUFERVIpO1xuICBjb25zdCBoZWFkZXJTdGFydCA9IHdyaXRlci5pbmRleDtcbiAgLy9cbiAgd3JpdGVyLndyaXRlVWludDE2KDEwLCB0cnVlKTtcbiAgd3JpdGVyLndyaXRlVWludDE2KGZpbGUuYml0RmxhZywgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZVVpbnQxNihmaWxlLmNvbXByZXNzaW9uTWV0aG9kLCB0cnVlKTtcbiAgd3JpdGVEb3NEYXRlVGltZSh3cml0ZXIsIGZpbGUuZGF0ZSk7XG4gIHdyaXRlci53cml0ZVVpbnQzMihmaWxlLmNyYzMyLCB0cnVlKTtcbiAgd3JpdGVyLndyaXRlVWludDMyKGZpbGUuY29tcHJlc3NlZExlbmd0aCwgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZVVpbnQzMihmaWxlLnVuY29tcHJlc3NlZExlbmd0aCwgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZVVpbnQxNihmaWxlLm5hbWUubGVuZ3RoLCB0cnVlKTtcbiAgY29uc3QgaGVhZGVyRW5kID0gd3JpdGVyLmxlbmd0aDtcblxuICAvL1xuICB3cml0ZXIud3JpdGVVaW50MTYoMCwgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZShmaWxlLm5hbWUpO1xuICAvL1xuICB3cml0ZXIud3JpdGUoZmlsZS5jb250ZW50KTtcblxuICByZXR1cm4ge1xuICAgIGZpbGVTdGFydCxcbiAgICBoZWFkZXJTdGFydCxcbiAgICBoZWFkZXJFbmQsXG4gIH07XG59XG5cbi8qXG5cblxuXG4gKi9cbmZ1bmN0aW9uIHdyaXRlQ2VudHJhbEZpbGVIZWFkZXIod3JpdGVyLCBmaWxlLCBsb2NhdG9yKSB7XG4gIHdyaXRlci53cml0ZShzaWduYXR1cmUuQ0VOVFJBTF9GSUxFX0hFQURFUik7XG4gIHdyaXRlci53cml0ZVVpbnQ4KGZpbGUudmVyc2lvbik7XG4gIHdyaXRlci53cml0ZVVpbnQ4KGZpbGUubWFkZUJ5KTtcbiAgd3JpdGVyLndyaXRlQ29weShsb2NhdG9yLmhlYWRlclN0YXJ0LCBsb2NhdG9yLmhlYWRlckVuZCk7XG4gIC8vXG4gIHdyaXRlci53cml0ZVVpbnQxNigwLCB0cnVlKTtcbiAgd3JpdGVyLndyaXRlVWludDE2KGZpbGUuY29tbWVudC5sZW5ndGgsIHRydWUpO1xuICB3cml0ZXIud3JpdGVVaW50MTYoZmlsZS5kaXNrTnVtYmVyU3RhcnQsIHRydWUpO1xuICB3cml0ZXIud3JpdGVVaW50MTYoZmlsZS5pbnRlcm5hbEZpbGVBdHRyaWJ1dGVzLCB0cnVlKTtcbiAgd3JpdGVyLndyaXRlVWludDMyKGZpbGUuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcywgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZVVpbnQzMihsb2NhdG9yLmZpbGVTdGFydCwgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZShmaWxlLmNlbnRyYWxOYW1lKTtcbiAgLy9cbiAgd3JpdGVyLndyaXRlKGZpbGUuY29tbWVudCk7XG59XG5cbi8qXG5cblxuXG5cblxuICovXG5mdW5jdGlvbiB3cml0ZUVuZE9mQ2VudHJhbERpcmVjdG9yeVJlY29yZChcbiAgd3JpdGVyLFxuICBlbnRyaWVzQ291bnQsXG4gIGNlbnRyYWxEaXJlY3RvcnlTdGFydCxcbiAgY2VudHJhbERpcmVjdG9yeUxlbmd0aCxcbiAgY29tbWVudEJ5dGVzLFxuKSB7XG4gIHdyaXRlci53cml0ZShzaWduYXR1cmUuQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKTtcbiAgd3JpdGVyLndyaXRlVWludDE2KDAsIHRydWUpO1xuICB3cml0ZXIud3JpdGVVaW50MTYoMCwgdHJ1ZSk7XG4gIHdyaXRlci53cml0ZVVpbnQxNihlbnRyaWVzQ291bnQsIHRydWUpO1xuICB3cml0ZXIud3JpdGVVaW50MTYoZW50cmllc0NvdW50LCB0cnVlKTtcbiAgd3JpdGVyLndyaXRlVWludDMyKGNlbnRyYWxEaXJlY3RvcnlMZW5ndGgsIHRydWUpO1xuICB3cml0ZXIud3JpdGVVaW50MzIoY2VudHJhbERpcmVjdG9yeVN0YXJ0LCB0cnVlKTtcbiAgd3JpdGVyLndyaXRlVWludDE2KGNvbW1lbnRCeXRlcy5sZW5ndGgsIHRydWUpO1xuICB3cml0ZXIud3JpdGUoY29tbWVudEJ5dGVzKTtcbn1cblxuLypcblxuXG5cbiAqL1xuICAgICAgIGZ1bmN0aW9uIHdyaXRlWmlwUmVjb3Jkcyh3cml0ZXIsIHJlY29yZHMsIGNvbW1lbnQgPSAnJykge1xuICAvL1xuICBjb25zdCBsb2NhdG9ycyA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHJlY29yZHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBsb2NhdG9ycy5wdXNoKHdyaXRlRmlsZSh3cml0ZXIsIHJlY29yZHNbaV0pKTtcbiAgfVxuXG4gIC8vXG4gIGNvbnN0IGNlbnRyYWxEaXJlY3RvcnlTdGFydCA9IHdyaXRlci5pbmRleDtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NhdG9ycy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIHdyaXRlQ2VudHJhbEZpbGVIZWFkZXIod3JpdGVyLCByZWNvcmRzW2ldLCBsb2NhdG9yc1tpXSk7XG4gIH1cbiAgY29uc3QgY2VudHJhbERpcmVjdG9yeUxlbmd0aCA9IHdyaXRlci5pbmRleCAtIGNlbnRyYWxEaXJlY3RvcnlTdGFydDtcblxuICBjb25zdCBjb21tZW50Qnl0ZXMgPSB0ZXh0RW5jb2Rlci5lbmNvZGUoY29tbWVudCk7XG5cbiAgLy9cbiAgd3JpdGVFbmRPZkNlbnRyYWxEaXJlY3RvcnlSZWNvcmQoXG4gICAgd3JpdGVyLFxuICAgIHJlY29yZHMubGVuZ3RoLFxuICAgIGNlbnRyYWxEaXJlY3RvcnlTdGFydCxcbiAgICBjZW50cmFsRGlyZWN0b3J5TGVuZ3RoLFxuICAgIGNvbW1lbnRCeXRlcyxcbiAgKTtcbn1cblxuLypcblxuXG4gKi9cbmZ1bmN0aW9uIGVuY29kZUZpbGUoZmlsZSkge1xuICBjb25zdCBuYW1lID0gdGV4dEVuY29kZXIuZW5jb2RlKGZpbGUubmFtZS5yZXBsYWNlKC9cXFxcL2csICcvJykpO1xuICBjb25zdCBjb21tZW50ID0gdGV4dEVuY29kZXIuZW5jb2RlKGZpbGUuY29tbWVudCk7XG4gIHJldHVybiB7XG4gICAgbmFtZSxcbiAgICBtb2RlOiBmaWxlLm1vZGUsXG4gICAgZGF0ZTogZmlsZS5kYXRlLFxuICAgIGNvbnRlbnQ6IGZpbGUuY29udGVudCxcbiAgICBjb21tZW50LFxuICB9O1xufVxuXG4vKlxuXG5cbiAqL1xuZnVuY3Rpb24gY29tcHJlc3NGaWxlV2l0aFN0b3JlKGZpbGUpIHtcbiAgcmV0dXJuIHtcbiAgICBuYW1lOiBmaWxlLm5hbWUsXG4gICAgbW9kZTogZmlsZS5tb2RlLFxuICAgIGRhdGU6IGZpbGUuZGF0ZSxcbiAgICBjcmMzMjogY3JjMzIoZmlsZS5jb250ZW50KSxcbiAgICBjb21wcmVzc2lvbk1ldGhvZDogY29tcHJlc3Npb24uU1RPUkUsXG4gICAgY29tcHJlc3NlZExlbmd0aDogZmlsZS5jb250ZW50Lmxlbmd0aCxcbiAgICB1bmNvbXByZXNzZWRMZW5ndGg6IGZpbGUuY29udGVudC5sZW5ndGgsXG4gICAgY29udGVudDogZmlsZS5jb250ZW50LFxuICAgIGNvbW1lbnQ6IGZpbGUuY29tbWVudCxcbiAgfTtcbn1cblxuLypcblxuXG5cblxuICovXG5mdW5jdGlvbiBleHRlcm5hbEZpbGVBdHRyaWJ1dGVzKG1vZGUpIHtcbiAgcmV0dXJuICgobW9kZSAmIDBvNzc3KSB8IDBvMTAwMDAwKSA8PCAxNjtcbn1cblxuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuLy9cbi8vXG4vL1xuXG4vKlxuXG5cbiAqL1xuZnVuY3Rpb24gbWFrZUZpbGVSZWNvcmQoZmlsZSkge1xuICByZXR1cm4ge1xuICAgIG5hbWU6IGZpbGUubmFtZSxcbiAgICBjZW50cmFsTmFtZTogZmlsZS5uYW1lLFxuICAgIG1hZGVCeTogVU5JWCxcbiAgICB2ZXJzaW9uOiBVTklYX1ZFUlNJT04sXG4gICAgdmVyc2lvbk5lZWRlZDogMCwgLy9cbiAgICBiaXRGbGFnOiAwLFxuICAgIGNvbXByZXNzaW9uTWV0aG9kOiBjb21wcmVzc2lvbi5TVE9SRSxcbiAgICBkYXRlOiBmaWxlLmRhdGUsXG4gICAgY3JjMzI6IGZpbGUuY3JjMzIsXG4gICAgY29tcHJlc3NlZExlbmd0aDogZmlsZS5jb21wcmVzc2VkTGVuZ3RoLFxuICAgIHVuY29tcHJlc3NlZExlbmd0aDogZmlsZS51bmNvbXByZXNzZWRMZW5ndGgsXG4gICAgZGlza051bWJlclN0YXJ0OiAwLFxuICAgIGludGVybmFsRmlsZUF0dHJpYnV0ZXM6IDAsXG4gICAgZXh0ZXJuYWxGaWxlQXR0cmlidXRlczogZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyhmaWxlLm1vZGUpLFxuICAgIGNvbW1lbnQ6IGZpbGUuY29tbWVudCxcbiAgICBjb250ZW50OiBmaWxlLmNvbnRlbnQsXG4gIH07XG59XG5cbi8qXG5cblxuXG4gKi9cbiAgICAgICBmdW5jdGlvbiB3cml0ZVppcCh3cml0ZXIsIGZpbGVzLCBjb21tZW50ID0gJycpIHtcbiAgY29uc3QgZW5jb2RlZEZpbGVzID0gZmlsZXMubWFwKGVuY29kZUZpbGUpO1xuICBjb25zdCBjb21wcmVzc2VkRmlsZXMgPSBlbmNvZGVkRmlsZXMubWFwKGNvbXByZXNzRmlsZVdpdGhTdG9yZSk7XG4gIC8vXG4gIGNvbnN0IGZpbGVSZWNvcmRzID0gY29tcHJlc3NlZEZpbGVzLm1hcChtYWtlRmlsZVJlY29yZCk7XG4gIHdyaXRlWmlwUmVjb3Jkcyh3cml0ZXIsIGZpbGVSZWNvcmRzLCBjb21tZW50KTtcbn1cbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IndyaXRlWmlwUmVjb3JkcyI6WyJ3cml0ZVppcFJlY29yZHMiXSwid3JpdGVaaXAiOlsid3JpdGVaaXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAZDKALJYGAACWBgAAHgAAAEBlbmRvL3ppcC12MS4wLjkvc3JjL3JlYWRlci5qc3siaW1wb3J0cyI6WyIuL2J1ZmZlci1yZWFkZXIuanMiLCIuL2Zvcm1hdC1yZWFkZXIuanMiXSwiZXhwb3J0cyI6WyJaaXBSZWFkZXIiLCJyZWFkWmlwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgQnVmZmVyUmVhZGVyLHJlYWRaaXBGb3JtYXQ7JGjNj19pbXBvcnRzKFtbXCIuL2J1ZmZlci1yZWFkZXIuanNcIiwgW1tcIkJ1ZmZlclJlYWRlclwiLFskaM2PX2EgPT4gKEJ1ZmZlclJlYWRlciA9ICRozY9fYSldXV1dLFtcIi4vZm9ybWF0LXJlYWRlci5qc1wiLCBbW1wicmVhZFppcFwiLFskaM2PX2EgPT4gKHJlYWRaaXBGb3JtYXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4gICAgICAgY2xhc3MgWmlwUmVhZGVyIHtcbiAgLypcblxuXG5cbiAgICovXG4gIGNvbnN0cnVjdG9yKGRhdGEsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHsgbmFtZSA9ICc8dW5rbm93bj4nIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBCdWZmZXJSZWFkZXIoZGF0YSk7XG4gICAgdGhpcy5maWxlcyA9IHJlYWRaaXBGb3JtYXQocmVhZGVyKTtcbiAgICB0aGlzLm5hbWUgPSBuYW1lO1xuICB9XG5cbiAgLypcblxuXG4gICAqL1xuICByZWFkKG5hbWUpIHtcbiAgICBjb25zdCBmaWxlID0gdGhpcy5maWxlcy5nZXQobmFtZSk7XG4gICAgaWYgKGZpbGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgRXJyb3IoYENhbm5vdCBmaW5kIGZpbGUgJHtuYW1lfSBpbiBaaXAgZmlsZSAke3RoaXMubmFtZX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIGZpbGUuY29udGVudDtcbiAgfVxuXG4gIC8qXG5cblxuICAgKi9cbiAgc3RhdChuYW1lKSB7XG4gICAgY29uc3QgZmlsZSA9IHRoaXMuZmlsZXMuZ2V0KG5hbWUpO1xuICAgIGlmIChmaWxlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxuICAgIHJldHVybiB7XG4gICAgICB0eXBlOiBmaWxlLnR5cGUsXG4gICAgICBtb2RlOiBmaWxlLm1vZGUsXG4gICAgICBkYXRlOiBmaWxlLmRhdGUsXG4gICAgICBjb21tZW50OiBmaWxlLmNvbW1lbnQsXG4gICAgfTtcbiAgfVxufVxuXG4vKlxuXG5cblxuICovJGjNj19vbmNlLiBaaXBSZWFkZXIoWmlwUmVhZGVyKTtcbiAgICAgICBjb25zdCByZWFkWmlwID0gYXN5bmMgKGRhdGEsIGxvY2F0aW9uKSA9PiB7XG4gIGNvbnN0IHJlYWRlciA9IG5ldyBaaXBSZWFkZXIoZGF0YSwgeyBuYW1lOiBsb2NhdGlvbiB9KTtcbiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHJlYWQgPSBhc3luYyBwYXRoID0+IHJlYWRlci5yZWFkKHBhdGgpO1xuICByZXR1cm4geyByZWFkIH07XG59OyRozY9fb25jZS5yZWFkWmlwKHJlYWRaaXApO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiWmlwUmVhZGVyIjpbIlppcFJlYWRlciJdLCJyZWFkWmlwIjpbInJlYWRaaXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAq0/87bsGAAC7BgAAIQAAAEBlbmRvL3ppcC12MS4wLjkvc3JjL3NpZ25hdHVyZS5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiQ0VOVFJBTF9ESVJFQ1RPUllfRU5EIiwiQ0VOVFJBTF9GSUxFX0hFQURFUiIsIkRBVEFfREVTQ1JJUFRPUiIsIkxPQ0FMX0ZJTEVfSEVBREVSIiwiWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EIiwiWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvL1xuLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cblxuLypcblxuXG4gKi9cbmZ1bmN0aW9uIHUoc3RyaW5nKSB7XG4gIGNvbnN0IGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoc3RyaW5nLmxlbmd0aCk7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgc3RyaW5nLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgYXJyYXlbaV0gPSBzdHJpbmcuY2hhckNvZGVBdChpKSAmIDB4ZmY7XG4gIH1cbiAgcmV0dXJuIGFycmF5O1xufVxuXG4gICAgICAgY29uc3QgTE9DQUxfRklMRV9IRUFERVIgPSB1KCdQS1xceDAzXFx4MDQnKTskaM2PX29uY2UuTE9DQUxfRklMRV9IRUFERVIoTE9DQUxfRklMRV9IRUFERVIpO1xuICAgICAgIGNvbnN0IENFTlRSQUxfRklMRV9IRUFERVIgPSB1KCdQS1xceDAxXFx4MDInKTskaM2PX29uY2UuQ0VOVFJBTF9GSUxFX0hFQURFUihDRU5UUkFMX0ZJTEVfSEVBREVSKTtcbiAgICAgICBjb25zdCBDRU5UUkFMX0RJUkVDVE9SWV9FTkQgPSB1KCdQS1xceDA1XFx4MDYnKTskaM2PX29uY2UuQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKENFTlRSQUxfRElSRUNUT1JZX0VORCk7XG4gICAgICAgY29uc3QgWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUiA9IHUoJ1BLXFx4MDZcXHgwNycpOyRozY9fb25jZS5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SKFpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IpO1xuICAgICAgIGNvbnN0IFpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCA9IHUoJ1BLXFx4MDZcXHgwNicpOyRozY9fb25jZS5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQoWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKTtcbiAgICAgICBjb25zdCBEQVRBX0RFU0NSSVBUT1IgPSB1KCdQS1xceDA3XFx4MDgnKTskaM2PX29uY2UuREFUQV9ERVNDUklQVE9SKERBVEFfREVTQ1JJUFRPUik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJMT0NBTF9GSUxFX0hFQURFUiI6WyJMT0NBTF9GSUxFX0hFQURFUiJdLCJDRU5UUkFMX0ZJTEVfSEVBREVSIjpbIkNFTlRSQUxfRklMRV9IRUFERVIiXSwiQ0VOVFJBTF9ESVJFQ1RPUllfRU5EIjpbIkNFTlRSQUxfRElSRUNUT1JZX0VORCJdLCJaSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9MT0NBVE9SIjpbIlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IiXSwiWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EIjpbIlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCJdLCJEQVRBX0RFU0NSSVBUT1IiOlsiREFUQV9ERVNDUklQVE9SIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAAB0AAABAZW5kby96aXAtdjEuMC45L3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACj63iQDQcAAA0HAAAeAAAAQGVuZG8vemlwLXYxLjAuOS9zcmMvd3JpdGVyLmpzeyJpbXBvcnRzIjpbIi4vYnVmZmVyLXdyaXRlci5qcyIsIi4vZm9ybWF0LXdyaXRlci5qcyJdLCJleHBvcnRzIjpbIlppcFdyaXRlciIsIndyaXRlWmlwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgQnVmZmVyV3JpdGVyLHdyaXRlWmlwRm9ybWF0OyRozY9faW1wb3J0cyhbW1wiLi9idWZmZXItd3JpdGVyLmpzXCIsIFtbXCJCdWZmZXJXcml0ZXJcIixbJGjNj19hID0+IChCdWZmZXJXcml0ZXIgPSAkaM2PX2EpXV1dXSxbXCIuL2Zvcm1hdC13cml0ZXIuanNcIiwgW1tcIndyaXRlWmlwXCIsWyRozY9fYSA9PiAod3JpdGVaaXBGb3JtYXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4gICAgICAgY2xhc3MgWmlwV3JpdGVyIHtcbiAgLypcblxuXG5cbiAgICovXG4gIGNvbnN0cnVjdG9yKG9wdGlvbnMgPSB7IGRhdGU6IG5ldyBEYXRlKCkgfSkge1xuICAgIGNvbnN0IHsgZGF0ZSB9ID0gb3B0aW9ucztcbiAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqL1xuICAgIHRoaXMuZmlsZXMgPSBuZXcgTWFwKCk7XG4gICAgdGhpcy5kYXRlID0gZGF0ZTtcbiAgfVxuXG4gIC8qXG5cblxuXG5cblxuXG5cbiAgICovXG4gIHdyaXRlKG5hbWUsIGNvbnRlbnQsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHsgbW9kZSA9IDBvNjQ0LCBkYXRlID0gdW5kZWZpbmVkLCBjb21tZW50ID0gJycgfSA9IG9wdGlvbnM7XG4gICAgaWYgKCFjb250ZW50KSB7XG4gICAgICB0aHJvdyBFcnJvcihgWmlwV3JpdGVyIHdyaXRlIHJlcXVpcmVzIGNvbnRlbnQgZm9yICR7bmFtZX1gKTtcbiAgICB9XG4gICAgdGhpcy5maWxlcy5zZXQobmFtZSwge1xuICAgICAgbmFtZSxcbiAgICAgIG1vZGUsXG4gICAgICBkYXRlLFxuICAgICAgY29udGVudCxcbiAgICAgIGNvbW1lbnQsXG4gICAgfSk7XG4gIH1cblxuICAvKlxuXG4gICAqL1xuICBzbmFwc2hvdCgpIHtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgQnVmZmVyV3JpdGVyKCk7XG4gICAgd3JpdGVaaXBGb3JtYXQod3JpdGVyLCBBcnJheS5mcm9tKHRoaXMuZmlsZXMudmFsdWVzKCkpKTtcbiAgICByZXR1cm4gd3JpdGVyLnN1YmFycmF5KCk7XG4gIH1cbn1cblxuLypcblxuICovJGjNj19vbmNlLiBaaXBXcml0ZXIoWmlwV3JpdGVyKTtcbiAgICAgICBjb25zdCB3cml0ZVppcCA9ICgpID0+IHtcbiAgY29uc3Qgd3JpdGVyID0gbmV3IFppcFdyaXRlcigpO1xuICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovXG4gIGNvbnN0IHdyaXRlID0gYXN5bmMgKHBhdGgsIGRhdGEpID0+IHtcbiAgICB3cml0ZXIud3JpdGUocGF0aCwgZGF0YSk7XG4gIH07XG4gIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi9cbiAgY29uc3Qgc25hcHNob3QgPSBhc3luYyAoKSA9PiB3cml0ZXIuc25hcHNob3QoKTtcbiAgcmV0dXJuIHsgd3JpdGUsIHNuYXBzaG90IH07XG59OyRozY9fb25jZS53cml0ZVppcCh3cml0ZVppcCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJaaXBXcml0ZXIiOlsiWmlwV3JpdGVyIl0sIndyaXRlWmlwIjpbIndyaXRlWmlwIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwECHgMKAAAAAAAAAAAAFPN5Fa9wAACvcAAAFAAAAAAAAAAAAAAApIEAAAAAY29tcGFydG1lbnQtbWFwLmpzb25QSwECHgMKAAAAAAAAAAAAH1sUNdkEAADZBAAAKQAAAAAAAAAAAAAApIHhcAAAQGFnb3JpYy9zcGF3bmVyLXYwLjYuOC9zcmMvdmF0LXNwYXduZWQuanNQSwECHgMKAAAAAAAAAAAAONScZ3UCAAB1AgAAGwAAAAAAAAAAAAAApIEBdgAAQGVuZG8vYmFzZTY0LXYxLjAuOS9hdG9iLmpzUEsBAh4DCgAAAAAAAAAAAJLCk480AwAANAMAABsAAAAAAAAAAAAAAKSBr3gAAEBlbmRvL2Jhc2U2NC12MS4wLjkvYnRvYS5qc1BLAQIeAwoAAAAAAAAAAAAEe3Z/uQEAALkBAAAdAAAAAAAAAAAAAACkgRx8AABAZW5kby9iYXNlNjQtdjEuMC45L2RlY29kZS5qc1BLAQIeAwoAAAAAAAAAAAChVqVIuQEAALkBAAAdAAAAAAAAAAAAAACkgRB+AABAZW5kby9iYXNlNjQtdjEuMC45L2VuY29kZS5qc1BLAQIeAwoAAAAAAAAAAAAa++pXpAIAAKQCAAAcAAAAAAAAAAAAAACkgQSAAABAZW5kby9iYXNlNjQtdjEuMC45L2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAB+XnPU3AwAANwMAACEAAAAAAAAAAAAAAKSB4oIAAEBlbmRvL2Jhc2U2NC12MS4wLjkvc3JjL2NvbW1vbi5qc1BLAQIeAwoAAAAAAAAAAADywE7BkggAAJIIAAAhAAAAAAAAAAAAAACkgViGAABAZW5kby9iYXNlNjQtdjEuMC45L3NyYy9kZWNvZGUuanNQSwECHgMKAAAAAAAAAAAAjxNDN2sHAABrBwAAIQAAAAAAAAAAAAAApIEpjwAAQGVuZG8vYmFzZTY0LXYxLjAuOS9zcmMvZW5jb2RlLmpzUEsBAh4DCgAAAAAAAAAAAH9VFLM0AwAANAMAACIAAAAAAAAAAAAAAKSB05YAAEBlbmRvL2NvbW1vbi12MS4yLjEwL29iamVjdC1tYXAuanNQSwECHgMKAAAAAAAAAAAAtwVrcH0CAAB9AgAAMQAAAAAAAAAAAAAApIFHmgAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9pbXBvcnQtYXJjaGl2ZS5qc1BLAQIeAwoAAAAAAAAAAAAoxQXujC0AAIwtAAA2AAAAAAAAAAAAAACkgROdAABAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9jb21wYXJ0bWVudC1tYXAuanNQSwECHgMKAAAAAAAAAAAARdfuCzoDAAA6AwAAMAAAAAAAAAAAAAAApIHzygAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9zcmMvZXh0ZW5zaW9uLmpzUEsBAh4DCgAAAAAAAAAAAAi9oOyvLQAAry0AADoAAAAAAAAAAAAAAKSBe84AAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL2ltcG9ydC1hcmNoaXZlLWxpdGUuanNQSwECHgMKAAAAAAAAAAAAquzY4zYFAAA2BQAAPQAAAAAAAAAAAAAApIGC/AAAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9zcmMvaW1wb3J0LWFyY2hpdmUtcGFyc2Vycy5qc1BLAQIeAwoAAAAAAAAAAACXFCXU3AgAANwIAAA1AAAAAAAAAAAAAACkgRMCAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9pbXBvcnQtYXJjaGl2ZS5qc1BLAQIeAwoAAAAAAAAAAACKAUN4X0kAAF9JAAAyAAAAAAAAAAAAAACkgUILAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9pbXBvcnQtaG9vay5qc1BLAQIeAwoAAAAAAAAAAACyboTrLgMAAC4DAAArAAAAAAAAAAAAAACkgfFUAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9qc29uLmpzUEsBAh4DCgAAAAAAAAAAAFRdc4GPJQAAjyUAACsAAAAAAAAAAAAAAKSBaFgBAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL2xpbmsuanNQSwECHgMKAAAAAAAAAAAA24zvzDwXAAA8FwAAMQAAAAAAAAAAAAAApIFAfgEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9zcmMvbWFwLXBhcnNlci5qc1BLAQIeAwoAAAAAAAAAAACbHJrWzwsAAM8LAAA8AAAAAAAAAAAAAACkgcuVAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9ub2RlLW1vZHVsZS1zcGVjaWZpZXIuanNQSwECHgMKAAAAAAAAAAAAuCqLH04FAABOBQAAMgAAAAAAAAAAAAAApIH0oQEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9zcmMvcGFyc2UtYnl0ZXMuanNQSwECHgMKAAAAAAAAAAAAdTVibqkTAACpEwAARgAAAAAAAAAAAAAApIGSpwEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9zcmMvcGFyc2UtY2pzLXNoYXJlZC1leHBvcnQtd3JhcHBlci5qc1BLAQIeAwoAAAAAAAAAAAB+v1bmRAUAAEQFAAAxAAAAAAAAAAAAAACkgZ+7AQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9wYXJzZS1qc29uLmpzUEsBAh4DCgAAAAAAAAAAAJNW0lQeCAAAHggAADQAAAAAAAAAAAAAAKSBMsEBAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3BhcnNlLXByZS1janMuanNQSwECHgMKAAAAAAAAAAAA7KidoVEFAABRBQAANAAAAAAAAAAAAAAApIGiyQEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9zcmMvcGFyc2UtcHJlLW1qcy5qc1BLAQIeAwoAAAAAAAAAAAB2YD3s+gQAAPoEAAAxAAAAAAAAAAAAAACkgUXPAQBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy9wYXJzZS10ZXh0LmpzUEsBAh4DCgAAAAAAAAAAAAbk/GrVGAAA1RgAADQAAAAAAAAAAAAAAKSBjtQBAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3BvbGljeS1mb3JtYXQuanNQSwECHgMKAAAAAAAAAAAA8T/NJj4qAAA+KgAALQAAAAAAAAAAAAAApIG17QEAQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYxLjYuMC9zcmMvcG9saWN5LmpzUEsBAh4DCgAAAAAAAAAAAK9oe6XcCAAA3AgAAC0AAAAAAAAAAAAAAKSBPhgCAEBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MS42LjAvc3JjL3Bvd2Vycy5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAA1AAAAAAAAAAAAAACkgWUhAgBAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjEuNi4wL3NyYy90eXBlcy1leHRlcm5hbC5qc1BLAQIeAwoAAAAAAAAAAAA0oqGpogEAAKIBAAAhAAAAAAAAAAAAAACkgRAjAgBAZW5kby9lbnYtb3B0aW9ucy12MS4xLjgvaW5kZXguanNQSwECHgMKAAAAAAAAAAAALrCJHboPAAC6DwAAKwAAAAAAAAAAAAAApIHxJAIAQGVuZG8vZW52LW9wdGlvbnMtdjEuMS44L3NyYy9lbnYtb3B0aW9ucy5qc1BLAQIeAwoAAAAAAAAAAABJNfbpVAgAAFQIAAAdAAAAAAAAAAAAAACkgfQ0AgBAZW5kby9lcnJvcnMtdjEuMi4xMC9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADJsYMZGxYAABsWAAAjAAAAAAAAAAAAAACkgYM9AgBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMS9zcmMvRS5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAApAAAAAAAAAAAAAACkgd9TAgBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMS9zcmMvZXhwb3J0cy5qc1BLAQIeAwoAAAAAAAAAAACk4yujkQ4AAJEOAAAnAAAAAAAAAAAAAACkgX5VAgBAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuMS9zcmMvbG9jYWwuanNQSwECHgMKAAAAAAAAAAAAeTPsuDwPAAA8DwAANQAAAAAAAAAAAAAApIFUZAIAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEvc3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanNQSwECHgMKAAAAAAAAAAAAuHaUnV8DAABfAwAAKQAAAAAAAAAAAAAApIHjcwIAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEvc3JjL25vLXNoaW0uanNQSwECHgMKAAAAAAAAAAAAqYDDs54KAACeCgAALQAAAAAAAAAAAAAApIGJdwIAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjEvc3JjL3RyYWNrLXR1cm5zLmpzUEsBAh4DCgAAAAAAAAAAAHuhoEdkAgAAZAIAACMAAAAAAAAAAAAAAKSBcoICAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy4xL3V0aWxzLmpzUEsBAh4DCgAAAAAAAAAAANaBKoBZDAAAWQwAADUAAAAAAAAAAAAAAKSBF4UCAEBlbmRvL2ltcG9ydC1idW5kbGUtdjEuNC4wL3NyYy9jb21wYXJ0bWVudC13cmFwcGVyLmpzUEsBAh4DCgAAAAAAAAAAAKu2xWGKFgAAihYAACcAAAAAAAAAAAAAAKSBw5ECAEBlbmRvL2ltcG9ydC1idW5kbGUtdjEuNC4wL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAAt1VAGggcAAIIHAAAdAAAAAAAAAAAAAACkgZKoAgBAZW5kby9tYXJzaGFsLXYxLjYuNC9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACVfGWZmk8AAJpPAAAqAAAAAAAAAAAAAACkgU+wAgBAZW5kby9tYXJzaGFsLXYxLjYuNC9zcmMvZW5jb2RlUGFzc2FibGUuanNQSwECHgMKAAAAAAAAAAAAz2KS+PQrAAD0KwAAKwAAAAAAAAAAAAAApIExAAMAQGVuZG8vbWFyc2hhbC12MS42LjQvc3JjL2VuY29kZVRvQ2FwRGF0YS5qc1BLAQIeAwoAAAAAAAAAAAD2GBtPQSwAAEEsAAAtAAAAAAAAAAAAAACkgW4sAwBAZW5kby9tYXJzaGFsLXYxLjYuNC9zcmMvZW5jb2RlVG9TbWFsbGNhcHMuanNQSwECHgMKAAAAAAAAAAAA5otTsGgvAABoLwAAKgAAAAAAAAAAAAAApIH6WAMAQGVuZG8vbWFyc2hhbC12MS42LjQvc3JjL21hcnNoYWwtanVzdGluLmpzUEsBAh4DCgAAAAAAAAAAAL4ipxtKBwAASgcAAC0AAAAAAAAAAAAAAKSBqogDAEBlbmRvL21hcnNoYWwtdjEuNi40L3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qc1BLAQIeAwoAAAAAAAAAAAAJOiBuYS8AAGEvAAAjAAAAAAAAAAAAAACkgT+QAwBAZW5kby9tYXJzaGFsLXYxLjYuNC9zcmMvbWFyc2hhbC5qc1BLAQIeAwoAAAAAAAAAAABKsNVd6y4AAOsuAAAlAAAAAAAAAAAAAACkgeG/AwBAZW5kby9tYXJzaGFsLXYxLjYuNC9zcmMvcmFua09yZGVyLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACEAAAAAAAAAAAAAAKSBD+8DAEBlbmRvL21hcnNoYWwtdjEuNi40L3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAABenLPKzAUAAMwFAAAdAAAAAAAAAAAAAACkgabwAwBAZW5kby9uYXQtdjUuMS4wL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAAC9HZqTQoAAE0KAAAgAAAAAAAAAAAAAACkga32AwBAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADD7/ZFvAYAALwGAAAoAAAAAAAAAAAAAACkgTgBBABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvY29weUFycmF5LmpzUEsBAh4DCgAAAAAAAAAAABCBRMD2CAAA9ggAACkAAAAAAAAAAAAAAKSBOggEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9jb3B5UmVjb3JkLmpzUEsBAh4DCgAAAAAAAAAAAMI3yaeeCwAAngsAAC4AAAAAAAAAAAAAAKSBdxEEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9kZWVwbHlGdWxmaWxsZWQuanNQSwECHgMKAAAAAAAAAAAAF1cCItMUAADTFAAAJAAAAAAAAAAAAAAApIFhHQQAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL2Vycm9yLmpzUEsBAh4DCgAAAAAAAAAAANOikHykBgAApAYAACsAAAAAAAAAAAAAAKSBdjIEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9pdGVyLWhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAYnh4idkSAADZEgAAJwAAAAAAAAAAAAAApIFjOQQAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL21ha2UtZmFyLmpzUEsBAh4DCgAAAAAAAAAAAE3BiNPcBAAA3AQAACkAAAAAAAAAAAAAAKSBgUwEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9tYWtlVGFnZ2VkLmpzUEsBAh4DCgAAAAAAAAAAAHBEXISiFwAAohcAADAAAAAAAAAAAAAAAKSBpFEEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAAMnW2t0ysAANMrAAAqAAAAAAAAAAAAAACkgZRpBABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvcGFzc1N0eWxlT2YuanNQSwECHgMKAAAAAAAAAAAAA4EnR64cAACuHAAAKAAAAAAAAAAAAAAApIGvlQQAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL3JlbW90YWJsZS5qc1BLAQIeAwoAAAAAAAAAAADHjH84eg4AAHoOAAArAAAAAAAAAAAAAACkgaOyBABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvc2FmZS1wcm9taXNlLmpzUEsBAh4DCgAAAAAAAAAAALo+zaF5CAAAeQgAACUAAAAAAAAAAAAAAKSBZsEEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy9zdHJpbmcuanNQSwECHgMKAAAAAAAAAAAAHRtUduUKAADlCgAAJQAAAAAAAAAAAAAApIEiygQAQGVuZG8vcGFzcy1zdHlsZS12MS41LjAvc3JjL3N5bWJvbC5qc1BLAQIeAwoAAAAAAAAAAADy5fJQyQcAAMkHAAAlAAAAAAAAAAAAAACkgUrVBABAZW5kby9wYXNzLXN0eWxlLXYxLjUuMC9zcmMvdGFnZ2VkLmpzUEsBAh4DCgAAAAAAAAAAAO7cIrBnCQAAZwkAACkAAAAAAAAAAAAAAKSBVt0EAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACQAAAAAAAAAAAAAAKSBBOcEAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNS4wL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAA/RdPfYgYAAGIGAAAiAAAAAAAAAAAAAACkgZ7oBABAZW5kby9wcm9taXNlLWtpdC12MS4xLjEwL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAHWIQX5kAgAAZAIAACsAAAAAAAAAAAAAAKSBQO8EAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTAvc3JjL2lzLXByb21pc2UuanNQSwECHgMKAAAAAAAAAAAAOeGs8FkJAABZCQAAKgAAAAAAAAAAAAAApIHt8QQAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMC9zcmMvbWVtby1yYWNlLmpzUEsBAh4DCgAAAAAAAAAAAIwbIjUfBgAAHwYAADUAAAAAAAAAAAAAAKSBjvsEAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTAvc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACYAAAAAAAAAAAAAAKSBAAIFAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTAvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAE6Fc2ufAQAAnwEAACAAAAAAAAAAAAAAAKSBnAMFAEBlbmRvL3RyYW1wb2xpbmUtdjEuMC4zL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAM14fpGzBwAAswcAACkAAAAAAAAAAAAAAKSBeQUFAEBlbmRvL3RyYW1wb2xpbmUtdjEuMC4zL3NyYy90cmFtcG9saW5lLmpzUEsBAh4DCgAAAAAAAAAAALz/AUOaAgAAmgIAABkAAAAAAAAAAAAAAKSBcw0FAEBlbmRvL3ppcC12MS4wLjkvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAdVai6cEUAADBFAAAJQAAAAAAAAAAAAAApIFEEAUAQGVuZG8vemlwLXYxLjAuOS9zcmMvYnVmZmVyLXJlYWRlci5qc1BLAQIeAwoAAAAAAAAAAAD1sqa4vg8AAL4PAAAlAAAAAAAAAAAAAACkgUglBQBAZW5kby96aXAtdjEuMC45L3NyYy9idWZmZXItd3JpdGVyLmpzUEsBAh4DCgAAAAAAAAAAANGQ2vyoAQAAqAEAACMAAAAAAAAAAAAAAKSBSTUFAEBlbmRvL3ppcC12MS4wLjkvc3JjL2NvbXByZXNzaW9uLmpzUEsBAh4DCgAAAAAAAAAAAF7m0YE4BAAAOAQAAB0AAAAAAAAAAAAAAKSBMjcFAEBlbmRvL3ppcC12MS4wLjkvc3JjL2NyYzMyLmpzUEsBAh4DCgAAAAAAAAAAAJmqZKueKgAAnioAACUAAAAAAAAAAAAAAKSBpTsFAEBlbmRvL3ppcC12MS4wLjkvc3JjL2Zvcm1hdC1yZWFkZXIuanNQSwECHgMKAAAAAAAAAAAAiv8HosEWAADBFgAAJQAAAAAAAAAAAAAApIGGZgUAQGVuZG8vemlwLXYxLjAuOS9zcmMvZm9ybWF0LXdyaXRlci5qc1BLAQIeAwoAAAAAAAAAAABkMoAslgYAAJYGAAAeAAAAAAAAAAAAAACkgYp9BQBAZW5kby96aXAtdjEuMC45L3NyYy9yZWFkZXIuanNQSwECHgMKAAAAAAAAAAAAq0/87bsGAAC7BgAAIQAAAAAAAAAAAAAApIFchAUAQGVuZG8vemlwLXYxLjAuOS9zcmMvc2lnbmF0dXJlLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAAB0AAAAAAAAAAAAAAKSBVosFAEBlbmRvL3ppcC12MS4wLjkvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAKPreJANBwAADQcAAB4AAAAAAAAAAAAAAKSB6YwFAEBlbmRvL3ppcC12MS4wLjkvc3JjL3dyaXRlci5qc1BLBQYAAAAAWQBZABQeAAAylAUAAAA=","endoZipBase64Sha512":"0a99b0ddf5fb937e31f4a9aa7896f077f4ee8c2fcd57f2a228299acf3655f3987cc40451227164d05519c671bd79ad8287ece1644cac771e11be9e21a4b4039c"};