@agoric/builders 0.3.0-u23.0 → 0.3.0-u23.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/package.json +17 -17
- package/scripts/bundles/bundle-binaryVoteCounter-js-meta.json +0 -790
- package/scripts/bundles/bundle-binaryVoteCounter.js +0 -1
- package/scripts/bundles/bundle-committee-js-meta.json +0 -810
- package/scripts/bundles/bundle-committee.js +0 -1
- package/scripts/bundles/bundle-contractGovernor-js-meta.json +0 -805
- package/scripts/bundles/bundle-contractGovernor.js +0 -1
- package/scripts/bundles/bundle-econCommitteeCharter-js-meta.json +0 -765
- package/scripts/bundles/bundle-econCommitteeCharter.js +0 -1
- package/scripts/bundles/bundle-feeDistributor-js-meta.json +0 -770
- package/scripts/bundles/bundle-feeDistributor.js +0 -1
- package/scripts/bundles/bundle-fluxAggregatorKit-js-meta.json +0 -960
- package/scripts/bundles/bundle-fluxAggregatorKit.js +0 -1
- package/scripts/bundles/bundle-mintHolder-js-meta.json +0 -740
- package/scripts/bundles/bundle-mintHolder.js +0 -1
- package/scripts/bundles/bundle-priceAggregator-js-meta.json +0 -990
- package/scripts/bundles/bundle-priceAggregator.js +0 -1
- package/scripts/bundles/bundle-provisionPool-js-meta.json +0 -915
- package/scripts/bundles/bundle-provisionPool.js +0 -1
- package/scripts/bundles/bundle-psm-js-meta.json +0 -980
- package/scripts/bundles/bundle-psm.js +0 -1
- package/scripts/bundles/bundle-reserve-js-meta.json +0 -975
- package/scripts/bundles/bundle-reserve.js +0 -1
- package/scripts/bundles/bundle-scaledPriceAuthority-js-meta.json +0 -880
- package/scripts/bundles/bundle-scaledPriceAuthority.js +0 -1
- package/scripts/bundles/bundle-vaultFactory-js-meta.json +0 -1045
- package/scripts/bundles/bundle-vaultFactory.js +0 -1
- package/scripts/bundles/bundle-walletFactory-js-meta.json +0 -990
- package/scripts/bundles/bundle-walletFactory.js +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export default {"moduleFormat":"endoZipBase64","endoZipBase64":"UEsDBAoAAAAAAAAAAABdtoCPUzEBAFMxAQAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgInRhZ3MiOiBbXSwKICAiZW50cnkiOiB7CiAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xIiwKICAgICJtb2R1bGUiOiAiLi9zcmMvcHJpY2UvZmx1eEFnZ3JlZ2F0b3JDb250cmFjdC5qcyIKICB9LAogICJjb21wYXJ0bWVudHMiOiB7CiAgICAiQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL2Jhc2Utem9uZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vZnJvbS11bmlxdWUtZW50cmllcy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZnJvbS11bmlxdWUtZW50cmllcy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V4byI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9leG8tdjEuNS4xMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MS4xLjE0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjYuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjEuNy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL2hlYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaGVhcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjMyZmM5NmFlMmZlMDg2NmU2N2Q3YTI4NmI1MjM0MzE5NThlZGRhNjZlNjAwYjJiYzRjNDVjZmMxZDJjNjIxZjY0NDAzZmEwMmFiNTVhZjY3NzA4N2YyMjYwZDJiNGU2ZDY1ZDM2NmY5ODc4YWRlNTk2N2U5ZTA5YTVmNjYyOGRhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4cG9ydHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4cG9ydHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9oZWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9oZWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTJmNmE4Njg2NGNiNTE3ZjllZTVlMGU5NzM1ZTNkYjE4YzcyYWI1MTI1ODQ4ZmI4ZmI1ZmJiMjc0NmQyYWEyNDUyM2FkZGEyOTI0Y2FjZTE1ZTc2ZWIzMTI5ZjIwNzU2MWVhYTRiOGY4MWIwOGE4Mjk5MWY1YzkzMWMwOTQyOTgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDViYTc5MTUzZGI4ODNkZWEwODA4YTkwNjM2ZDcxNmRmMDM0YTcwNmI3Zjg1ZGFkMzc3NzMyODUwOWFjNmZkZjllOTU0YWNmOTk5OTkzMDk1NzRmMTNjM2Y3YWNjOTYxMDM5Yjk0NDliODM1ODQzZGQ5ZDk5NDU1M2FkNzcwMjAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXMtcGFzc2FibGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2lzLXBhc3NhYmxlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODc4MTgzN2U0YWE1ZTEyZjJiZmU5MmFjMjJmY2Q3ZmNiY2JjYmE0OTRjMmMzMGM1MjU1NjI5Yzc4MzYwNDMwMWZkY2Y3YWFhN2UyYWU5YTY1YWE5ODEyZjljYzRlZGQyNDQ5NGIzYmY0MmYwNTU2N2JjZmM3MzljYmUxZTZhMzAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjM0MWNkNjFlNDM5YTRhNzM3MWRlM2UzZTFmYzNmMWEyYmY0MzhhZDkwMWFjMmNiZDRjMWNlMGJiZTJmMWI0MmUyZWQ0N2ViMGYxYjU4ZDI1ZTMyNjFmZTVkYTY5YTY2MjY2MDkwYzA5MThmN2M0MTljMGYwNDY4ZjI1ZGQwNGMyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ha2Utb25jZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZS1vbmNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2ZlMjE0MzJiYWJmOWEzODUyM2JmY2MyNzNkOWE0YWE3NTM1MjQzMmQ5MGYzN2U4YjJhNjRhYmUzZTBiZjA4YmI4M2RkYzI5NGQ2Yzk1NjcwMzE4ZDU1NDA1M2VhNDhlNjQ3ZTk2OWVhOGMzMDFlNjQyNDM3N2RkMjM0OTM1N2QiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHJlcGFyZS1hdHRlbnVhdG9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wcmVwYXJlLWF0dGVudWF0b3IuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyNmI0YWIzMWViMjkzMjJhN2E3MjIzOTViYmI2YmQ5NGE0MDEwNWQyMmU4NTI4YTA2NDQwOTBhNDllZWIzYmU2ODgzODBiNjZjZmEyYWU1MWIwNTZiOGQxMjJhMzI1ZGY1NjE5YzYwZjJmZWFhODUwOGE1YjJiZjNkZmUyM2YzNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wcmVwYXJlLXJldm9jYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcHJlcGFyZS1yZXZvY2FibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwZWZmZDFjYTczNWY1ZDgxNDE3NGEzMDdlMzdhYWFjZjU0NTc2NjQyNTRhY2Y4NGUxZTNhNmQxMzBmZjhlNDhmNjA2YmZlOTgwMzE4OWM0ZDg4YmRmZDkzYzJjMWFhYWM3NThlMjJjMWU4NGJiYjc5ZmI5OWZjNjE4NjM1MjMyNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy93YXRjaC1wcm9taXNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy93YXRjaC1wcm9taXNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTRkODk4ZTg1N2VlOWQ4ZjY3MGU3MmRjOTBjODZkYWE2YTRkOTViMDAxYzIxMDc5ZjdlMDQ2OTA2MDRjYjliZjY5ZTZiMjdjMTRkZjdjNmQ0ODI4ZTdhMTg0OGJkOTNjMjA1YzYyNjhiYzVkN2QzYjcyNmNkOGYyZDgzODA2ZDgiCiAgICAgICAgfSwKICAgICAgICAiLi96b25lLWhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiem9uZS1oZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTFmYjk1N2FiMjM2ZjdjOTNjMzk5ZDZiODk4MzY5ZmYxMjMwYWEwN2EwOWZlZmVhYTQ1NDk3ZjRjNjc3Yjk3YmJlZjQxMGRjODg5NWEwM2ZjYmE2NWI0YmM1MTYzZWY0MmEzMjc4Zjc3MGYyNjcwYTU2ZTg5M2Y0ZWZiZTM5ZWQiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvZXJ0cC12MC4xNi4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL2VydHAiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9lcnRwLXYwLjE2LjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9lcnRwLXYwLjE2LjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9ub3RpZmllciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b25lL2R1cmFibGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b25lLXYwLjIuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZHVyYWJsZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MS44LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjUuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGF0dGVybnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGF0dGVybnMtdjEuNy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9hbW91bnRNYXRoLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9hbW91bnRNYXRoLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTIxZjhjYTVhMmRiZDRhZTU2ZWEwOTcxM2IzN2Q5YTUxNTM2NzJmODhkMWIxYWI5OTE0Y2EyYjk5MjhhNDQ3Y2FkNmEyY2RlNDkyNTEyYWI1ZThiMDFjZjg0YTkwOTdmNzU3YTZmNWZiY2I1NWI1MzY4MGQ1OTVmYTBmYzk2ZTYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYW1vdW50U3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Ftb3VudFN0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZWY1OTk1MTkzM2M1NjJkZWRkYjM5NTQ4OWU1Nzk5MjYzZTYwMDU0YjRhNzZhNWI4NjljNjQ1MjE4OGEwNDlmYTEzODg3YmZhODM2ODI2NjljMzQyYzRhYmY3MjFiNmM4ZDRmN2ZjMGZmMTVjZjcxODc4YTk2Y2QyZDk3NDRlOGIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGlzcGxheUluZm8uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Rpc3BsYXlJbmZvLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMThjNTYxZTI5NDZhMjcyYTY5YTNhZjA2M2YyNTk1MzI4MDgwMmM3YjQxNDBkYjZjM2YxOWY4ZjJlZTMzYTljMjVkYzA4MWJhMDNlOTIwM2ExODA5ZDc2YWViNzM2MzEzZDdjM2ZhMThiZGM4MWQwYTJlZTBkNWNmZGRiMjk0Y2UiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZmFlNDYxZTA2YWE3OTQxMGVhYTcwZTE2NWMzNTQxNjdlZGFlNzUzNGJlOTI3MGFjNDU2ZmQ3OTI3MGJmN2Q4Y2IyMDYxNDAxMmM1MjgzMzUyYzgyNDJkYTE3ZWM1YWE3N2ZlMDJlZGQ3N2Y5ZjliMTU5MTk1MTlkYWNmZDQ5YTgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaXNzdWVyS2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pc3N1ZXJLaXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhZDY4OWUxZmVmNGI5NTMwZjMyYjliOTExYzE1ZWZjMTY1NmY0NGFhMGQ0NWIxMmExZDI0ZDgwOWU3MDNhM2NlNDFhMDI1YjYzYjg5ZjNiN2Y0ZTljYWY3NWQzOGE3ZWM2M2ZkNTk4NTMwYmRlNTFjNmY2NGM1NmM1YmM1NzEwMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImRiNWRkNTY1MWY5NDJlZmZhMGE2ZmM5NmI0ZDc0MzczODU4YzAwYzMzZGMxNmNlNTMzMzRkMzIwNmQzZTk5MTVlMzUyYzBmNmQ3YTQ4ZTlhNzY0N2NhOGUwNzgwNzNhNWQ3ZGZjNWYzNjU5ODI4YjFiNDAxNWMyZWUzODZiNWJiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2RlZWY5YjAwNTc5ZjFhYTZiYzZiYjkwYTZhM2U2MjllZjc5YTdkYjgwNWNjNTEyYWQ5ZDVhZWIwNTYwNzhiY2UwZTQ1Y2VkZWEyMWFiMGJlNzhiMGU2MGMwMWJmNTEwM2Q0ZjliMTExMDZiNzVlZGZkMTgxZTMyMjhlYWMxNzQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTYyNDc2NDMzYTU0N2I3ZDY5YzE5YWIwZDAxMjA4NTgxZDg4ZmRiNWRhMjYxOTkwMWU2MTNiMTU3YmIyNDA1ZjlmZWU5ZGVhZjkxYjdhY2RiMTg2ZDQyNjgxNzQzNTczNDYwZTBlYzY0YmMxNDlmNzI0Y2Q3M2U0NmU4ZTBjYjciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjY4N2ZkMzkxZjM1Nzg1MTdhOGFhYTMyMmJjNTg0NGI2MGU1YWQ5Y2UxMzExMWJmMDY5YmFlYTE2MDFmODg4NjljZjc5MmQ4YjcwZTNmZTE2NWVkZTExYTc5ZWU1ZTQ0NmRhNmI5ZGMxYjFjNGEyMDU1OGM0ZTdlYTU0ZTU0MzgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF5bWVudC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF5bWVudC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ2MzEyMDlkZTM4NmViZTMzZjRlMDZhOGM4YjFiOWYyM2YwZTRlZjg1MDhmNGRhZTI0ZjA5ZmIxOTExNjA2Mzg0NTZjODViNGE1OWVlNzIzYWY4NzIyYzc5ZWY5ZGM2MmY5NThkN2U4NTNiMDU4YzZiNjQ0NDFjYmZmYWYyNjQ5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BheW1lbnRMZWRnZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BheW1lbnRMZWRnZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyYTViMTI0MWNhMDU0NTYwMGJlNzRhMDIwMWY5ODczMjI2NjVmMzVlMDZmN2JhZGRjMjIwY2RjYTQ3OTQzYzZjMGZjZWMxYTYyOWFkMTY5YzYyNTRhMTgxY2E3MjZjMzAwYTg5YTA1ZTRjODYwNzBmZmYwZWRlN2Q3NjNiYTY3MiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wdXJzZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcHVyc2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjZWY1Nzg3OTQxNWQ3OGI4ODMzNjBmZTkxYmRiNzQ1MTFhMjczNDFiNDhjMzlmZmJmOTYxYjFlNzg2Nzk0MmU0NWNhNTg5MTk0NDViNThiMDcwY2Y0ZWE3ZWMzM2VhMDM0NWNhMGVlOTE1MTQyYzI4OGM5MDYxYzQzZjQyMTU2MiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yYXRpby5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmF0aW8uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5ODQzMjk0NTllY2I2NTk2ZmRiOTVlMzM0YzMxYjY4M2ZmNDU1YjNlODhmOWZkY2E0NzM1NmU0OGRkNjY5NmU5MWY0MzdkZWVkMWEyNmEwNmUwN2ZkODg1ZDk0Mjc5NGE5NDczZTlmYTc1ODdiZmJjMzgyNmU1MTJkMDYxN2YxOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zYWZlTWF0aC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc2FmZU1hdGguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3MTk2NjIxMTgxN2MwMzNhZDY1NjNmNDRhMTFmYWEzM2E1YTgxN2QwZDM0MWM1NWI1ZTA2ZWJiNTk1ZWI4MmIxOWFlOGVmYmYxYjBjYTlkYzgyZDE5NGFjMTMwYjk1YjMyYzhmYmU3MzYwMjYzZmYzZTRjYTk2OTYwMzJjMmM2NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90cmFuc2llbnROb3RpZmllci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHJhbnNpZW50Tm90aWZpZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2MGY2NGFkM2RkNjhiM2FkNGFhZjcxYmViOTA1YWE3MTk2MzYwYzc0NTk1YjZkZjRiNjRlOTdmMWE4OTE4NzkzYmRiNjI4ZWYzNzZhZWVkYTI5MWViMTI4MDg4OGI4Mjc4YjQwMWM2YWUxODZiYzBlZDY1NzkyZjI2Y2I0MzY1NiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjQwNDdmNTgzMjQ3MDFhOWIyMjJjNzk4OGI4NzQ3MDA0YjE3ZThjMjY1YTY3ZmVjNTQwYWFmNTU4ZjEwNTMxNDQ5MWEzMzMzNDM5ODdmNTk0NjAzMzU4MGI1MjAxZTJkY2EwNjc1YmY1NzliMDcwMzhiZmZmYjcyYWZmNjcwMmIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMtaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLWluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL2dvdmVybmFuY2UiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9lcnRwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvZXJ0cC12MC4xNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9lcnRwL3NyYy9yYXRpby5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3JhdGlvLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdGltZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3RpbWUtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b2Uvc3JjL2NsZWFuUHJvcG9zYWwuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2NsZWFuUHJvcG9zYWwuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9kdXJhYmlsaXR5LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9lLXYwLjI2LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9jb250cmFjdFN1cHBvcnQvZHVyYWJpbGl0eS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvZS9zcmMvbWFrZUhhbmRsZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvZS12MC4yNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbWFrZUhhbmRsZS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvZS9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvZS12MC4yNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvdHlwZUd1YXJkcy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3V0aWxzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MS44LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjUuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29uc3RhbnRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb25zdGFudHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0ZTA4YzM0NTU1NTI1OTU2NDcxY2E5ZTRmYmYxMjAxZDA2ZmE5ZGI5YmU5ZTExYjg0M2VlNmMwZGQ5ZjI2M2U0NDc3NWFiZjg5ODhkZGQ1MTRlMTM1ZjVhYTI2NzdlZjA0ODMwZDU2YTAzZTI1NmU3NjgxOTI1YWJmZmFhNjYyMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdEdvdmVybmFuY2UvYXNzZXJ0aW9ucy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RHb3Zlcm5hbmNlL2Fzc2VydGlvbnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkMzhhYjA1NTI2MTg3N2QwNmEyZWU0NzA2MjhiNmRmMWFhOTlmMmU5Mzc5ZTVmMDc0NDU1YWFmNTNhM2ZiZThjZWVmZmYwOThiYzhhNGNjZTY1MmMzN2Y4ODIxZDg0MTc1YzdmYTcwYzkzOTFiNDc3OTJiZDI2NmVmYjVmNjY1YyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuQXBpLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuQXBpLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTllZTBiMGUzNDRmYjU0NDQ3MWNiMDE4NjMyNTczMzkxOTk3ZmNiZjZlODM3ZjcyNDU1ZmM0N2YxNzg2MDZjZjM0ZDMxYjUwODg2M2NjZDY3ZDY4YWIxODIyNTc5MWRiNGFkM2M3YTYzOTkxYWE3MWFhNGQ5NGRmN2VjZTY4ZTEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVybkZpbHRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVybkZpbHRlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjUyNzRmZWYxNDc5NDUxNzhlYzg1NzBkNzM2NjAxYWRiYTNkNzg3MzhlNTNkMmEyY2QwOTU3ODcyMTNlYWU2ZmYzYmMwMWFjMjgwNmMzN2VhNGE1ZjAwNWNhZmUyZjE5ZWQ5ODI1NzgxNTM2YmQzMzc3NTAyYjRkZjY1NjI1MTVlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5QYXJhbS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVyblBhcmFtLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYmI1MzhkYWYzNjc4ZDVjYmExNzRkZmEyMzliNmMyMzJlOTEwNjE1ZWNkYWMwNzE1NjU0MzliMjIzZmM4ZTYxNzAwZTNlNmUyODhmM2VjMjJjOWM0YzAzZGU5ODY4ZDNmZmYwMGZmZDUzZmQ4YjYzZGQ2ZmFhYjlmMDczOTQ3MWIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL3BhcmFtTWFuYWdlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RHb3Zlcm5hbmNlL3BhcmFtTWFuYWdlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc4MjE5ZWY0YjM4MmRhMjQ0MzQ5MmNjYzE4N2Y2ZjAwNGQzOWY3YWEwMDUxYzRkMmQyZGU2ZjkxNjVkMjFkNjNmODU2YTg2OTFjYTUxNTkwNzcwZjU5MTdmMDFmZTRhOTA5MjI3ZWVkMjMwYzg3OTE1Y2M4ZGJhN2ExZmJkYTYyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0R292ZXJuYW5jZS90eXBlZFBhcmFtTWFuYWdlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RHb3Zlcm5hbmNlL3R5cGVkUGFyYW1NYW5hZ2VyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjUxYmI5NmNmMWZiNzZiYTg5NjRkNzRhOWE3MDVhNzI1MjVlMzk3ZTZiY2ZhOWViMDhhNzFmN2QwYzgyYmRlZDhiZDQwYjk3OWI0ZTI0M2RkMzZhYTcyMzYzMDViMWE4NGY5ZDkwNjlhOGRjODM4NTVlZjM5YzVmNTdjNDhmNGEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RHb3Zlcm5vci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RHb3Zlcm5vci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU0OTk0MTk5MDY3MDEyYTdlNGUxZjFhYzUwNGQyNjBiNTRiYjFmYWJhNjlhYzFiNTQwNGJiMTIxM2FkYTEzMWZlMDEyOGFlMDdkNzI2ZGQyOGY3NTg1NWUyMDFmMzc2NzcxNmIyMjc0ZDI2NjFlYTg4NmJlNmVkNzg3NTVhODZlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0R292ZXJub3JLaXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0R292ZXJub3JLaXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3MGRjMzIzOGFiMTQyMjZhZWYxMWVkMDU5OWI1NjRkYWRhODZkM2EwODNmY2VhYjdhZDM0NjY0ZmQwMzg0NzNiODZkN2UwNTI5YmMyYmU0ZDdhN2ZiZDUzYTU3YmJmZDBhNTAyMjMxNWE5NTAzNWM5NTcwYmZmYmVlMTAxNjZlZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdEhlbHBlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RIZWxwZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmZGU2MTYxMmE5ZGM2ZGNjOTc0NDQzY2UzZjgzNWZiMWQ5NWE4YmM3Y2FlNGM0M2ZlNGY5ZGNkYWJhYTE4YWMzMjBiZDY2YTJmMWIxNDVlMGM5NzE0MWU5YzBhYWQ3MWMxOTQ5MDE2YzBkMjM3MzRmY2E2NjM1MTdlMzVkODY1YiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5M2I1NDFkYzU2MDZmMWEwNzQxZWRhY2IzYmU5MGM1ZGMzOWY5MmMxN2JkNTg3NTk3M2IzZDJkMWE5MWQ2ZDI4OTQzNTkzNjU4NTA2NTkwYzMwYmEwYzAzZjk2MTkxNmY4YzYzNjNhMDc5N2E4MmE2ZmUwM2Q5YmNjNDQxN2Q4MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9xdWVzdGlvbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcXVlc3Rpb24uanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiZGQwYTE4YzgwY2Y2NTE2NzY4N2E5ZDNmNTVkNThhOWZkZTYwM2VkMjIwMjMxNjUwMzNhOTEzNjc2YzExMmEwYTI3Yzk3NTg4MTJjZjRmYjAxY2QzM2QzM2NjNzkyZmI1MDYyNzhiZDA1Zjc1ODAwOGZhNmNjOGNiZGQyZTViNSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWEzYzg4YjY1MTcxNTdhMTRhN2E0N2MyZmFmMDNlN2JlMWUyZWRhODNhMGVjZjIyNDkzNWViMzYxZjQ3NjVlNDE1ZGJkODY4NTU4NjZjZWRjZDM2ZmEwNDYyOTMwOTJjNjEwY2Q4NGQ4MzA3NTk5ODQ2MzljOGUyNmU3N2U4Y2IiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdmFsaWRhdG9ycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdmFsaWRhdG9ycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU5N2VhNjYwZjQ4ZGVlOTBjYWRkYTI1YjIwNWU5ZDg5YTkzNGYwZTQxOGVhMWFlODkzNTNiNTc5OGYyMzUyYzBmMDIwNDgwY2ZkZmNkYzFmYjQwYWIwMTJiZmQ3MTNlYjM3NzE3ZDFkYzU1NTkyOTY4N2Y4MjAxODA5NDEyMzAzIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE2LjEiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTYuMSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2VydHAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9lcnRwLXYwLjE2LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2dvdmVybmFuY2UiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbWFyc2hhbC93cmFwLW1hcnNoYWxsZXIuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9tYXJzaGFsL3dyYXAtbWFyc2hhbGxlci5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvdHlwZUd1YXJkcy5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdGltZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3RpbWUtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9kdXJhYmlsaXR5LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9lLXYwLjI2LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9jb250cmFjdFN1cHBvcnQvZHVyYWJpbGl0eS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9lLXYwLjI2LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9yZWNvcmRlci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvZS12MC4yNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3JlY29yZGVyLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MS4xLjE0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYxLjguMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NS4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wcmljZS9mbHV4QWdncmVnYXRvckNvbnRyYWN0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wcmljZS9mbHV4QWdncmVnYXRvckNvbnRyYWN0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzcyMGRhMTQyYzZiNjVhYzkxNzMzM2JlZTRkY2Y0YTYzYWYzODlmNmNjZjhjNGY5ZTZhNTM5MjBhZWEzNGE4MjczOWExM2NmNTI3MGY3M2ZiMDEwMzA0OWU4Nzg3ZDQxYWM4NzI1ZmZlMTJjNDg2ZjYzZmZiYWE1ZjBkNWUzMGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHJpY2UvZmx1eEFnZ3JlZ2F0b3JLaXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3ByaWNlL2ZsdXhBZ2dyZWdhdG9yS2l0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDM3MjI2MTY1YmEyMTI0NzhhY2M1YWNlODI5N2FmNWZhNGU5YjIwNzUyYTI3OGE3NGM4N2EyZDc3MGQxZjE3NzFhMDg1MTNlNTJkOWYwOTg3MGUzNDk4YjE0ZjdkMGQxZTc2M2Y4MjUzOGEyODE5MDE2MjFiNjg0NDZmZmRlZTEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHJpY2UvcHJpY2VPcmFjbGVLaXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3ByaWNlL3ByaWNlT3JhY2xlS2l0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjdiYzY5NzM0OWIxMTU2ZDNlNjM0MDVkZDkyYjU5OTNmNWZjZDlkZmIyYTA1OWFhNmY0NzI1MzkxMTljMTA0YWUyYTZlZTRlYWE5M2MxNGIwODY4OTdlOTUwZmVjZDJmMjI4YWIzMjQ2OWJjMzYxNDQyM2E5Y2JiOWY5OGJlZWMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHJpY2Uvcm91bmRzTWFuYWdlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcHJpY2Uvcm91bmRzTWFuYWdlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImVjOTFlYzZkNTg2M2EwODhhZjFiOTJhMTI4YmFhOTcyMmYyODcyNzNhM2UyZTljYjI0ZDcyNmNhNDlkODY0OGM4ODg4NzkyZWY3MjViNzQ2MTI0NDg2NDMzZGRmZWViNTY5OWU1ZTg2MDExYmFmYjcyMWVkMzI2ZmM3YzZhZTU4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Byb3Bvc2Fscy91dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcHJvcG9zYWxzL3V0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzE4ZmQzNjY5YzY0ZGFlMzkyMmJhM2M1ZWFkYzk1OTE5NmI1MWVlN2I0M2QzYzhiYTc2MDUyODgxMjlhZjM3ZDc4YjE5MjMyOWUyMTg2ODYxNDM3N2ZjZmIzNWZhOTk0MDRiNmZmYmM4MTdlNTliYjJiMDYwM2Y0ODkxMDZlY2MiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL2ludGVybmFsIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYmFzZS16b25lL2hlYXAuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9oZWFwLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NhY2hlLW1hcCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jYWNoZS1tYXAtdjEuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vZnJvbS11bmlxdWUtZW50cmllcy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZnJvbS11bmlxdWUtZW50cmllcy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vb2JqZWN0LW1hcC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vb2JqZWN0LW1ldGEtbWFwLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9vYmplY3QtbWV0YS1tYXAuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi91dGlscy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYxLjEuMTQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY1LjEuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS42LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYxLjcuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vc3RyZWFtIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3N0cmVhbS12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJqZXNzaWUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiamVzc2llLmpzLXYwLjMuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL21haW4uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY2FsbGJhY2suanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NhbGxiYWNrLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjBlZDI2ZDM4NmM0ZTY2Y2I2ZTNiOTA3MTVjOTdhZTZkMGRhNmVjMzMyZjM2ODQ4OWU2MzUwYjY5Mzc3YzBiZGE2MGUwMTBjNjQxYzFkZjc4YmJmMWZhZThkYmMxZTM5MmRhNzMyZmJhM2MzYTdiMzZmOGI1ZDYxMjYzY2U3MTAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY2xpLXV0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jbGktdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyMzIyODFkZmIyYzg0MTRmNTE2ODhhM2RmZDk2MWM2MjdlODk3YzlkN2VmMDQ1Y2M2ZDNjZTQ1NzEwYmQwNzFjYjhlNTZlZDVjZDljMDNjYjgwNzc2NDllOTUzNzQ5OWViYzg5ZGRmNTY3ZjE2NDQ1NGVjNmVmNGUxZmYwMzA1ZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb25maWcuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbmZpZy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImYwYjEwYjdhNWFmMjQxYWEwYWUyZDZjYzkxYjBjYTBmZDFkMmJlNWYzZWI2ZjRiY2NhNDY5NmZiOTQ5ZWEwMGUwMzljYzMwMDAxM2E2NDU1ZGNkNTg1MmExMTcwZjUyZjM4MjA3NjE3ZGJiMTMyZjc0Mzg4NDBmOTdmOGY1ZTFmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2RlYnVnLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kZWJ1Zy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjkyZGYzNDgxOWJlYjhmZjcyMmM3OGFmMWI3OTFlZjgwOTFlNTgzMDg5YWFiNzQ2YWY0OWZlZGE4MDRkOGRjNmUyZWUyMGQ1OGMyNmFmMjYyNjcxNGNkYzJlYzUzMTBhNjQxMDg3YzYyODUyOTA5YjUzYWU0OWIxMGNkMTRmNTU5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Vycm9ycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXJyb3JzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTQyMjRiNTlmOGQ2NWU3YWQyMzM1MzAzNjg0YjFhODFmNTMwYWQ3NTM4YjUxM2QzYjA0YTE1ZjhkZGZkZDM2MWE5NzdhNTdkZThiMjcxNjllMmU3MjQ5OTU3OTY4N2MyODJkNTNhMzFlN2EzZTg1NTNhMzZkMWRkNTBkMmE0YzQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDJhZDQ3YzY2MzI1YTZjNTAwMjk4MDExMjg5ZjIzMjE3MjVjNmY2NmM0ZmVmZTc5YzY4NmY4NWY3Y2I2NTYzMmMyNTI0NDVhNDIxZGM1OWNhZjUyNzI0YWQyYjE3NDk1MWNjZDFlZWNjNzcwZTNlNmJhYzY5ZmYxOWY0MmUxNTMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvanMtdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2pzLXV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWNhMjU0MDBjZTcyY2E4MTA5MDQ5YzM4Y2Q5NzRhODI4MjQwMDE4NzkwNzc4MjZkYWRkMmRkYzZlYTM0ZTZhMDVkNjc4NzhlZmVhYjRmZGNiNDc2NjI4NzU2ZjRiMjk4ZGVkODBiOGE0OTgzZDU2NTIwOGFjODQwNTY1NWY0OTIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5TWlycm9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlNaXJyb3IuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3NzJjZGVmODIzMDRjYTRlYTY0MDZmZjM0YmExZTczZmE3NDcyNzAwOWZiYjBkMDdmMDMwZDFkNmVjN2RjMzcyNjg1NzBiMTU3N2JiZTVjY2RiOGI4ZDc4MGM3NjZjMmE1YjBlYmQ2Nzg5MzhmMDUyZjMzNTZkNmExN2QxN2VhMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9saWItY2hhaW5TdG9yYWdlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWYyMjBhMWM5ZDhiYjkwMjk0NmQyOTRkM2JjNzhmMWNhZmVhNmU3N2Y3OWNjMDY3MDM3OTM4MWUxODk2YjRkMTYwNzA5YzVkYzBlMjhjNjllYjdmYmRjY2U4NmQyMGQ4N2Y0MjNhNzQyNzg4YzdmNGE1YjEwMjc3NGMzMDM1NzYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC9pbmFjY2Vzc2libGUtdmFsLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXJzaGFsL2luYWNjZXNzaWJsZS12YWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmNzBkNjhkYTZiZjc2OWJmOTBhODQyNGI4MjRjYThmMWMxYWExZjQ2MDQwZjY0NTZiZDQ3NTgxNjgyNzM2YjQ1OTZiMTViZjg2MzEyMGJmODI4YWM5N2FmOWExYTNmZjU3OWI3MWYwZWE5ZDQxYWZjNzExNmUxYzJlY2I5YTQ4MiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXJzaGFsL3B1cmUtZGF0YS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFyc2hhbC9wdXJlLWRhdGEuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhNDBhMzlmZWUyZmRmZDZiZTI1OTczMzk5YWJjNjY5ZjZjMTkwZTc2N2RiMTdiNjQzMWZiY2NkNzM3Y2RhYzkyZWZhZjliZTA0NjQ2Mzc2NjM0MTNlMTYzM2FiYWI0YTI1M2U5NmNmYTU4ODIwYmNhN2U4NWQ1MWNkZWZlYzhlYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXJzaGFsL3dyYXAtbWFyc2hhbGxlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFyc2hhbC93cmFwLW1hcnNoYWxsZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlZTVmMDNmMzVmMjlkZThhZTIzZjljYWUzMzJhZjI4OWU2Nzg0M2Q0Y2M5YzMzMTYzYzM4MzNhZjEzYzFiNzdmNTRjYmU1ZjRmNmEwZjMzMjg3N2IyMGM3MTMwZjgzZDRhZWZiNmYxZjBhMGM0OTU0MGQyYjkzOWFmNTQwYzAwYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tZXRob2QtdG9vbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ldGhvZC10b29scy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjM0MmZjNjI0ZDg5ODA1NmZkNmE0NTZmYmE2MGYwNDNhYWRkZTk0YTBmYzkzNmVkN2ZhYzc2Y2E3YWFiZTA2YzY2ODBkOTgwYzc1NDE2ZWI5ZDc0MDhkM2EyMGFhNGM3M2QxN2Y0MDI2YjhhNmMyN2FkOTlkNDc1OTRiNTcyMmY4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ldHJpY3MuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ldHJpY3MuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1NjdlZjNhYWFlYTczNTJmNGIyM2UyNmQxMjA5OGNmNTNmN2JlMDVlOTczMWE5Mzk2NDM4NmM1OTZlMjJjMDJhYmM1OThlZDFkNDJlNDQxYzY0YmIxZDEwN2Y5ZDQwNTk2OWFiNWE1YmI2YzhkZjA1NDgyMDZiMTQ0ZDUyMjI1YiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9uYXR1cmFsLXNvcnQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL25hdHVyYWwtc29ydC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdiMTRlMTMwYjdhNDcxNWI4MTkyNzZiYmQ1ZTM4NjkzYmEzMDc2MDg1OGU2OGMwZjM1OGZjZTkwMjU5Y2Y2NjEzZWVmOWE4Nzg4MjQ3OGFjNGE0MmE4M2FkNzY2NDc1ZDFmNTc2MDI0ODBmYzhlYWNlZDI1M2RlNWIzMDRiYjBhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Nlcy11dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc2VzLXV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzBjNzllZGIyZGQxODdhMzUxYTI5OTNlZjhhOWE1OWZmZDUzNWEyZDM2Yjk2M2U3ZjNmZWRkYmQwZmJjMDhmOTlkZTc5MjEyYTE3Y2I1ZGFmYTFiMzZlNmMyMmQwZjJlNjQ5MDQyYzE0YjcyYWU3OTBmNmZhNDVmMGYyZGJjYjAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdGVzdGluZy11dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdGVzdGluZy11dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhmNDVhZjdkNDdlN2JlNTk0ZmIyNDBlYzliYWQ5ZTFjODk1MTAzYTc5YzRmNjE1NmY1NjNiOTQ2NzI2M2RmZTdkNzBhNjczYjFjMjFkNzgyMTEzMzA0NTk0NDllYTEyMmQ1N2E1MDJiOWYzZDczMmM2ZGQ2ZmY0OTI5NWJlMTM5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RtcERpci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdG1wRGlyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiN2Y1NWMxNWY3ZmFmZDZmYWVjOTJkMDNmMzdjZjI0NjM3MzdjZTQxZGM5YTA3M2U2NGE4NWMwZTk5OTVlNmYwYjA0ZjBkMmRiMjI3NjU0NGRhMTQwY2MzYzYzNTk4MDk5NjQ0N2Y4ODI0NTM3NTNlMWQ4MGE2YTE2MGZhYWZjOGQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUNoZWNrLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlQ2hlY2suanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5ZjNiYzdkMjQwODAyMzNjNTE3OTZjNWQwOTQ3NmMyOWNlNzIxYzdmYjIxNjE1ZWJlOTMyM2I3YmFkOTVjMTA5MzI0NGRhYzI2MDViOGYxYmQ4YmU3ZmUxMDI1N2VmNGJiZmM3MjdkMzQ0MDBiNjI2NWM3YjI0M2QwYmQwNjIyZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMWJiNGYyNmQ2NDM1MWJhNjZhYTMyNzhkNTA2MDkwMWFjOWJjMDZhYmQ5YjUwMmE1NmMyYmNlODMxNTg3YWFhZjk4OWFiYzkwN2RhYzAzOTZmNTUwMDU2ODUwYjVkNTAxMzMyMTA0NGMzZTkxMzIyYWFjNGRlMGZhNGQ1M2FjMGUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMtaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLWluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdXBncmFkZS1hcGkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3VwZ3JhZGUtYXBpLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTUyOGVmMDQ1NWNlMzc3M2I2NTA3OTc0ZDY0ZTQzMzRmOTYxNDhjOWYxMTM3NDkzYWMyOTRlMWYwYzg0YzQ5OTQ4NjIzZmEwNzNmNjdjZDI5Mjg2OThiNTcyYzgzNDViZDA0ODFlNDNiNmZhMmRmYzBiNGJjOGUwMWE1YTkyYjYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL25vdGlmaWVyIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsL3NyYy90ZXN0aW5nLXV0aWxzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvdGVzdGluZy11dGlscy5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsL3NyYy91cGdyYWRlLWFwaS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3VwZ3JhZGUtYXBpLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0LWRhdGEiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy92YXQtZGF0YS12MC41LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjEuMS4xNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MS44LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYxLjcuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTExYzBlZGEwZTZiYzQzMjEwOWVlNjUwMTJhNjU4ZWY5ZjEzNTgyZjkxNmY4OWIzZmNlYTM3MzYzMzIwYmI1ZTk2YWQ0MjRmODEyZmU2NjBkNDA1ZmFiZjA3YTM3YjEzYjY0MTA4MGE5ZmYzMzQ2OWJmMDkwMmM1NzhkNjQwMDEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODI3ZGVkYTQxZjRlZmZkNDFkMmM5Y2ViYjdlZjkxNDcxNmU4MDM5MjUwYTNmYzY0ZTMyYWZkYTY1ZmNkMmViMTUzYmMyZWY4NzQ2NWY4OTBkMzFhOWY5NDBjMGQ0MDA3ZGQ4ODU2ODZkNWZjMjViYzBjY2U3MWQxZTJmNzBlZDMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbm90aWZpZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL25vdGlmaWVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOGFhY2ViMTdjN2I0YmYwMDEzMDI4MmU5YWM0Nzk0YWJiNWQ1MTk1MjI2NzMzYjc4NmI2ZmRmNjA1MDU1MGRkYTFhZWQyM2Q2ZTE2MzBlMzAwZjNkODU3OGFhZDkzZmEzZDg2N2Y0OTAwODBhN2VmZWIyNDdmMjZhOGMzMzMwNTYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcHVibGlzaC1raXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3B1Ymxpc2gta2l0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTMwMTgwNGRmYzRjMzUwNjg2NmY4MDkzM2ZmM2ZmYTZkNzQzZTNjZTA1MmRiY2MzNzk0N2Y2NGRjNjc5NGVjN2Y1ODM3MmFhNzk3OWI2MDlkNzY2MWJjYWYyOWNkOTljMTYzY2Q5ZDU4M2I0MDRlMjQ3ZjU2NWIwZTE4ZGIxNDQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVkLW5vdGlmaWVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZWQtbm90aWZpZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjNWRiMGQxNTkzNzA0MTg4YmM2NzllZDRkNTIxNmVmYTIzODhiODczYWRhYWJlM2U2MzU0YWIzNTVjYzg0N2Y2NDQ1ZDk4YTVlMDhhNzU2ZjNlOThjMmQyMTQ3Mzg5NjgzZWQ1MTEyNDNiYzAxZjg5YTU1YmY0YzA1YmExY2RlNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXN1Yi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzdWIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0YjI3OGU0NTE2OTE0NTVjY2ExYmJjOWE4M2IzZDM3ODVhODQyYmZjYWNjMDUwMzk3OWEwNDRlM2Q1YzYxYzZkYzA5ZDNhMDE4N2ZmOTUxOTJiNDBhNDg3MmY5OGMxYTgxYzc3NDkzNWFkMTJkMzc0ZWFkMmZjOThhZDkwYWYyMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdWJzY3JpYmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N1YnNjcmliZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY1NGFmMTdkZTBjMDFiY2RmMTM2YWViNjA2MTIyZjU4YzlkNjM0ZmVmMTM1N2Q2ZGY4Y2RkY2QwNTI3Zjc3ZTk1MTBlN2RiMmU3YjE0OGMyNzJhOWEyMTk2ZGFkNjBmYmZiMTM5YzMyZTFiYzkwN2RiYmIyN2E3ZDM4MTNhMDlmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N1YnNjcmliZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N1YnNjcmliZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmMjc5MjYyYjRjNzljNzBjNDgyOGYxOWIwOWY0NWZjYWFkYWM1ODFkNmExZDU0MDUwZGVlMTEyNjI0YjYwNWI5NGE3MmZlNjViOGQxNDYxZmIwYTViN2Q3NDUyOGE1NDlmMDA3ZDg0MjZiZjM1OTM3NThlYzNmMmRiYTRjMTkyYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90b3BpYy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdG9waWMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyZTg3ZDJlMTI0Njk1NGU1YzQxNDRlNThkYzc2NmU1NjAwMTliN2M3MTA0YWEzNzIxNDgyNGEyZDhjYWYwODA3YjBiZWE0NzU4ZDU4YWViNTc1ZmM3ZmZjYWFiNjE4MjFjOGVlNjA1ODEwZjY0ZTZlOWJhMzYxMTE4YTYyNWVkZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMtaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9LAogICAgICAgICIuL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJ0b29scy90ZXN0U3VwcG9ydHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmZWQ4NDEyYzkyZWJhODA0ZDY5NzE0YmIyNWQ0OTE2MWI2MWQzMjk3YWZiMjg1MGE5MGViNzQ1NTg3NzM2MTQ4ZGFlNDA2ZDI2NmZhZjU2NTYyNTRlY2NhNzZmNTQxMTRhZTk4YTljZWE4NzhjMjNlNjAyZWM2YWRjOTdkNGM4MSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9zdG9yZS12MC45LjIiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvc3RvcmUiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9leG8iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXhvLXYxLjUuMTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MS44LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Bhc3Mtc3R5bGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcGFzcy1zdHlsZS12MS42LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYxLjcuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTU4Yzc5NmE2N2Q3OTQyODc5ZmQ3MmNiZmQ4MDliOGU2MDEyNjFmNWU4NDI2ZDBkMDMzM2NiZDAzNDk1YWNmZDJkODFmOTQ2YzA5Y2QyNzBiNmM2YWFmOWRlZGY5NzljNGViOGYyY2I1NDNkNzI0N2RiOWJkYjIzYjQxMTI2YjEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGVnYWN5L2xlZ2FjeU1hcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGVnYWN5L2xlZ2FjeU1hcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImRjMDNkNWE4MGY3MzlkNGVhZjZmMjY4NDUwMTZhMjQyMGQ2MmQyNGRhNzcyOWI4MDlkNzAyNGZiNjhkMTQ4NDQ5ZTViMTVlNzgwMmU4NDZiZTU5NWU2MGNkOTUxNDc4MzM2ODY0ZGFjNmRiM2QyMjJkNzEzMjcwY2JhYTcwZWMzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9sZWdhY3kvbGVnYWN5V2Vha01hcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImRjN2UzYjI5NzE5NGEwMDUxMTNhMWE2M2Y1ODZjNjMxN2FlMjQ0YjA2ZDQ5OWI3NWRiZjEzOTFiYTg1NjE3Y2RlMjIzZTg3NWFhNDUxMmRmYTRjMmM0ZGM0NDEzZTI1YTk2ODdjMGRkNTUxNzE2N2RhMzg0ODQzZmUyMTRhNTc5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTMxNGM0ZWE0MjQ4MGI1MGE0OTgxZGM4YzZiNDg5MjNkMDg5OTU0ODU1YzczZjZhMzhjOGE0ZDYzYjVkZDUyOWEyNjhkZDgzN2RkMGFlMTc1OTljY2VjMTA4M2YyMDI5ZTA4NzIzMmJkMzJkNzZmNzI3MjI5YzIyYjgxMzgzZTQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzZWU5OWZkYWQxNWRhYTk0YmQzMTg1MTMyNjliNzkyZWFmYWVjYTcwZTY0NDg1NzlhMjQ2ZjNjMzU1ZDBiZTAwMjVmZjI5MGQ3NmNkOGRkZmQzYzMxYTI0YmZjMzdmN2VlNWEzYzg4ZDU3ZGJhYTUyZjFmNjc1NjBhMzM0MzEwNCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzI0ZjQ5ZjJmNDA0MzQzNGI4Mzc5OTZkNDU2OGEyYTYwNjUzZTZlM2IxNTE1NWMwYWY4MmIxM2Q0MjBiMjA1NzllOTFjZTAyZTIyZjE0MGE0ZDUyNTk4NDdjMTllNzI4YjNmZjI0ZThhMGRiZDc3YWM3YzdiZDQ0MTc2M2ViYTUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjIzMGRlOGNlOTM5Y2UyMDBkMGMxMDYxNDZkYmYxOWUzZmNkOGFlYWExYWVkZDNiMTNlZDAzOTc4MmU5OWY2N2ZlMGFiZDI2ZmM0MWFjMjM4MTEyOTE3MjYzNGQ5MGE0ZjY1NGZkMTgwNThlMzNhN2IyMDU3ZWQyMDNlNjVjM2RiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzL3N0b3JlLXV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjdjZmVkYzIyY2U5NDgyOGM0ZThkOTA3YWI3ZDQwZTE4MjJiZWVmODU1OWUzMTZiYzA4ODNlMDZiZDgzYWJlMGUxZTJjZDc1YTI3YTI4MDU4N2ExMjEwZTFkMWIyNmJlZDc1NDlhNWQyZjU3ZDBhNmNhZDVlZTlhZDBkNWI2ZGUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMtaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLWluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvdGltZS12MC4zLjIiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvdGltZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3RpbWUtdjAuMy4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvdGltZS12MC4zLjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NS4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MS43LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwMGJjNGIyMWEyOGMzYTViNzZmNDdmYWRhNGVjMTc2MWUxMTU5YzQxZTFmZWJiZjA5NWVhZWQ2MTE4ZTE3MzZlNTk0NjAzYzE4ZWYwMjRhYzU2ZjZhNWFiM2YzY2YwODZjNWY1YjU0NGVkZTEwMDMwMWZiMzU4MjljNTFhYjI3ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90aW1lTWF0aC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdGltZU1hdGguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0NzA1YTQ4YTkzMjc2Y2IyMzE2ZTNjNmI4MGZjMWJkNDM5ZjZmZWM1NzZiNTJhODQ1ZGM5ODhiNmUyYmU5NGExZWRlOTIyNmM2YTIyYzZmYjg4MDg3YWZkMWEyMzVhYzgwYWNiYzJhMTlkMjlhZTk5MTgyZmQxZDhjZWIwNjhjZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzYxYjA2MDI0YzJkZDMyZjdjZTFjODRjM2ZlYzNjZmI1N2FmOGQyOTJmMjFlN2I4ZjI0MDE1MzcxYzE3ZjIzMWMxYWUyZDRkMTdhMGQzNDg2NmExYzZmODA3MzI4Y2VmYWYyODlhYWU5Y2FiNWJiMWFjMGJlNjI0MmI5M2I5MTgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMtaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLWluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3ZhdC1kYXRhIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC45LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4by11dGlscy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXhvLXV0aWxzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTY5YmIxNTcyODI0OTk2ZThjYzY5N2NlYmFiNTRhMjBhY2MxOWNiZWFkMGZiZWEwNTM4ZTY0NjE2MzJiZjI5MTdkY2E0ZTc0MzlhZGE0YzJkOGI2M2YwMWU3OTJiYTc0MDU5NzU5N2RjMzdlN2MzNmE0MmJhN2U3NjRlOTU1YzYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDcyZmUzYTY4Mzg4M2U4NWNjNGRkM2I4NmE4YjVmYzFmMmJhMWY2NzdlYjgwMzMxOTkwZmQ1NDUwNTZmOGYxYTMxYmQ0ZTY5MzU4ZWJhMTNjZTkwZDFhMmM1Y2MxYzMyZmY5NTkwZDI5MGY0Y2Q4NzQ1OThlODdkMDI3OTczOTIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdmF0LWRhdGEtYmluZGluZ3MuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODM0NGYxZGFkOGYyYTY1MDUzZDdhZWVhMGI5NmNlYzBmZmQwMmI5OWE2MWFjNzIxNzUwYmZiY2ZjYWNjNGNiY2NkMGNjZGFlY2Q4MzQ4NDM1YzNhZjcxY2UzODZjNjgwYTMwYzM0MjhmNzRiYTE1ZjMxMDk3Nzc2MjY2NDhjNTMiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvem9lLXYwLjI2LjIiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvem9lIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvem9lLXYwLjI2LjIiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy96b2UtdjAuMjYuMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Jhc2Utem9uZS96b25lLWhlbHBlcnMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi96b25lLWhlbHBlcnMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9lcnRwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvZXJ0cC12MC4xNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9lcnRwL3NyYy9yYXRpby5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3JhdGlvLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZXJ0cC9zcmMvc2FmZU1hdGguanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9lcnRwLXYwLjE2LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9zYWZlTWF0aC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjYuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIvdG9vbHMvdGVzdFN1cHBvcnRzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNi4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy90ZXN0U3VwcG9ydHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjkuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdGltZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3RpbWUtdjAuMy4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNS4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYxLjEuMTQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY1LjEuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3BhdHRlcm5zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3BhdHRlcm5zLXYxLjcuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY2xlYW5Qcm9wb3NhbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY2xlYW5Qcm9wb3NhbC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQwOTMzMjk2YTdiNDEzZjYwOTM1OGZkMTkwN2ZhYjRkMmU0MTAxNGRmNTlmNWNjZGVkYmJhNGVkNDlhNzFkNDkxZThkMjA3NzJiZmRlODc4MGQxN2EwZGZkZTVjNzAwYTFkODJiNWE2YmQ4NDUyNzk1NDg2MTg1MGFjYWMzNmU1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0RmFjZXQvb2ZmZXJTYWZldHkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0RmFjZXQvb2ZmZXJTYWZldHkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkNTdjNTY2MzZlYjFlNzUxMzBhODFiZDAzZTFjN2ViMWFlZTcwMmZhMTMyZGVhZjEzMzlhZmQ1NGQyYzQwNTBiYjQyMmNjNDMxN2M3ZjQ2ZDU2ZTBhNzdhMTRmNjE4MTQxMmQxYzZmMmY3MmVhZGVhMTViMWM0OGFhYzJjMTQ2YiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvYXRvbWljVHJhbnNmZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC9hdG9taWNUcmFuc2Zlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ1NGM5NTFhZmRhNzY5ZmZmMGNkYzI1MzI4ZThkMzc1M2EzYmYzNjRlOThlNjRhMDAwMGEyYjhlMWVlOWQwOTQ5MzM1ZDVkNGM0NzQwMmU4M2I2ZjQ1ZmNlZmJiOWEwZTY4YjdkMzY3NzZiNTcyNzlmMjIxMDNmY2U2OTllZjA0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9ib25kaW5nQ3VydmVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvYm9uZGluZ0N1cnZlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY3MjNkNWM2ODY3NTgyODI5MzkzMTRjODE5ZGM1OGNhZTQ1MGM2MWM0ODljNThkMTNmNGE4NmE3MzA0YjE5NWQ1ZGUyMDE0Yjc2ZTRmN2FlOWViMmJlMzYxOTJiZmU1OWZiZDg5MjYyZjk5NWJlNjA1NGMxZGY0ZTczZmZlNWIzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9kdXJhYmlsaXR5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvZHVyYWJpbGl0eS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjk1ZjkyMDBmNzEwZjc5NzIxMjllNzc3MzRjNTVmZjk4MzI5YWY1ZGZlNzEzMDQyODk4NzJiOGVlYmU5NDQ5Nzc0ODE5ZDdkNzIxMDU2ZTA4N2U1MTkzMGNjMjYxOTMwY2RkZWUzZDVmYTRlM2VjMjAxZWNjMjBmZThhMzZhM2FkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzhhOGI0YjZlNWFmNjgyYTUyZGE4NWM1OTFiM2MyYzVmMjI5YTljNDRmNGFhNGI0OTVjZThmMjZiMzdlZTIyMmY3YWY0ZDhlY2RmN2RjYTFlYzMzMDYwOTFkNjU4MDExZTlmZGEyZDUyZTQyYTllMmZiZWMzOTE5MjMzMThlZWUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3ByZXBhcmUtb3duYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L3ByZXBhcmUtb3duYWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFhYjQ0YzcwYzlkMzcxN2QyZWIwNzM0MTRkMThhZGViNDhlYjkzNzAxNDlmY2ViMmJiNzJmODY0Mzc2MDY0ODExNzY1YmNhYWI0ZTcwODkxZWY2OGMyZDI0NTBjMTAwZjYyZjJkYzc2YTAyMWQ0MTU5OWJkMTUzOTAyMmJlM2ZkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC9wcmljZUF1dGhvcml0eS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L3ByaWNlQXV0aG9yaXR5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTY4NTZhYjdhMmUyMDdiYjcxOGM5Mzc2ZDdiZDIzMDg5N2VhNTQyOWM1NDBlMzYwMWM0ZTY5Y2FmYmM3N2I5OThlMTE0MDhlNWI3NmYyNTEzMjIxYTE5YWUyMzdmZmRlZjliMDJhMmZiYzBkMzUxODZmNDBjM2NiNTFlZjdlMDUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3ByaWNlUXVvdGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC9wcmljZVF1b3RlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYWQyMzBkMDFiZjE0YThjZmEzNTYwOTdlZjU5MzY2OTMzZjdmYjBmMTJmMTMwNGMyN2ZjMmU3MDg4ODA0ZTdhYTI2ZWJjNGQwY2NlYzMwNjBmZDMzMjgxOTliNTgwNzIxZGY3NzU4ZTI5OWRiMmUxZDdhNGM3N2VmYWI1ODMzMzkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3JlY29yZGVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvcmVjb3JkZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3Y2RjNTk4YjMwNzUxNmZhMDM4MmI1NTFiNjI4NzM3YzVkZTcxYWFjNGUzMjMxZTc4Y2FhZmI0NDhjYjM3ZGVkNzQ5ZTlhMDUzMWI4NThjZTQzYzAwOWZlNDE3Mjg5YjU3MGRiNDM1YmYxNzk0NzFhMzAyZmU0NTA3ZDM5YjY0ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdFN1cHBvcnQvc3RhdGVNYWNoaW5lLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvc3RhdGVNYWNoaW5lLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODRiYWZlMGVjN2YyZWQ0MmEzYTdlODk5MDUwMjQ4MzAxYWE0YWQxN2NlMDU0ZDdkZjQ2ZWJhZWM0MzMxMzg2ZGY3NWE3MGI3YzVmMTc5NWZkMDhkODQ5MTZkMGU1NjA5Nzc5N2U4MjM2MmQ5YmU0NjY5M2JiZDU3NjBmNmEwZTYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3N0YXRpc3RpY3MuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0U3VwcG9ydC9zdGF0aXN0aWNzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZmYyOTY1MzM3MzE2NDdjYjM5MzNhYmE5M2QyMWY2MDQwZTM1MGY1NTYyOTAwNGU3M2NmYWY2YzQ2ZTlhZTcyY2EzNDFhMDNlYzZlYWY2ZWE4MDZlNjE4OGU1MDBlNzQyMDkzNzY2ZjMxOWJmYjY1NDc3NzRjZjJiYzhiZjFkYzMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3RvcGljcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RTdXBwb3J0L3RvcGljcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjFkMWNlNDk4MzM5MWE4OWJmMTk4M2U4NWNkOTc1ZTJjMjg1Y2ZhMGViNGZlZTJkNjMwMzRjZWY5OWFhMzlmYWY3OWU1YzlkZTNhOWI5MTA2ZDQ4NWY1ZTNlZDE3YWNhMmI2ZDhkNmViYjdlYmFlM2JiYmVmZDBjZDg1OTI5YWEwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0U3VwcG9ydC96b2VIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvem9lSGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjg3OWI4NTBhZjhhYmYyNmY1Zjg5MDA4ZTA1ZmZkNDBkZjcxMmIwZGUyNTNlMGEzODQ3MWIwN2I2NTQ0OWYzMWZkZjc3MzI2MGMyMzFmYjY3ZGFjMGJlYTRlMGNkNmEzZTYyOGExY2E2ZDJjNjY1MTA2YzFjNmYxZTNiYzA0OTZmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ha2VIYW5kbGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ha2VIYW5kbGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0N2M1ZDVmZmQ2NDZiMDAxMGRiODM5NWEwMWQ5YTNkYTI4OTNmZjA2N2VhYmFhZGViNDM2YTlkZGY3NTZhNDg3YzNlN2IxYTA2Mzg5ZDk1NzFkNmRiMjViMGZkMGRmMjM1YmFhNDJlMTlmZmViMmRhMGQ4YWM2N2IyOGMzY2YxZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjUwNjA5YzdmOGM1Nzg2NjgzOGFlMGM0MjA1ZTM3N2U3MzYxMjc5M2MxNTgyZjJmODcwNDIxYmNmNzNhMGVhZDE5NzA2NjRjM2UzNDgxZDZiNDA0NDYxNWQ3NjAxMzg5ZWI1YjM2ZTcxOTE2MmM4NjI2MTIwODYzNzBjZTYyZjUiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvem9uZS12MC4yLjIiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvem9uZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3pvbmUtdjAuMi4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvem9uZS12MC4yLjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9iYXNlLXpvbmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjYuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9kdXJhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImR1cmFibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiMjA4ZGVmOGRmMWNiZTE0MTg2NjlkZWRmODBiZGY1OTUzNThmNTM2NmQxMTg4YWMwNGZlNGEyY2I5YzUzY2E4ODRkODUyMTVjOTBmMWI4N2Y5NDliYjA0OGE3OTZlZTViNmZkYTEzZDUxYTI1OWUyNTc0NDY0ODE5ZDYyMmNkMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9kdXJhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kdXJhYmxlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTEzMDE1MmVmNDFlMDM1MDA1NGQ1MDY5YTVmNDM3ZTFmMmExNDNmYjZmOGRlNmFjYjQ3ZjA5NGQxNzkzYjFkM2MzZGIwNzEwMDg4OGRmNzU1OWI0ZGI3YzM3ZTc2M2ZiOTg4YjkzNGVlMThiZjA0MmI2Y2NhMDI5M2QyOTdkMzciCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2NhY2hlLW1hcC12MS4xLjAiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2NhY2hlLW1hcCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9jYWNoZS1tYXAtdjEuMS4wIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2NhY2hlLW1hcC12MS4xLjAiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImU0OWFlZjRmNTgxZTgxMDJmOThjYTQ5YWU0MmVlM2IxYjVhYzdiMjEwNTdkM2IxN2YwOWJmMDg4M2QwYzE1YmExMzVkNDNjYzMwMzM1MzdkNjI3NzU0YWJmZWQxM2U1ZTk1NjU2MDE1MmMzOGI1OTU4NTVkODcxZTc3NGExMTI0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NhY2hlbWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jYWNoZW1hcC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI0MjIzZTdiM2EzNmRmMzljNWNlYzcyMGM5NGMzNzRiZWQ3NWI0MTUyYTE0MDI2YTY5NWNlZjZiZGFmMzhkZDI2NjIxNTM3ZTgwNDNmODM0ZmY5MDcyMTY4MDVmNDg1Y2JlYWJiNDJhODhlMzk0NDFkZDE0ZmZmZmYwZDM5NzIwIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9jb21tb24tdjEuMi4xMyI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vY29tbW9uIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9hcHBseS1sYWJlbGluZy1lcnJvci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJhcHBseS1sYWJlbGluZy1lcnJvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ5NzQ5Y2QzNzg1ODg3Y2RlZTZmYzZkYjgwZmViOWZjZWY3MWY1MmRmMzViMzI3NGE5Yzc0YmIyOGVlMzZjODMwZTVlNzkyNGExMmU5NzNmM2ZhNGI2YjI2MGI1YWQ5ZDUxNDNkZThmODNlZWZiMTlhMGEyOGUzMTNiN2Q0MGI3IgogICAgICAgIH0sCiAgICAgICAgIi4vZnJvbS11bmlxdWUtZW50cmllcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJmcm9tLXVuaXF1ZS1lbnRyaWVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTVmMmU1NTY1Y2E0MWM4YjJmMWEwYjIxZjczMzU3MmJiMGU2Zjk3NTUwM2Y3YzI2ZDdjMTgxNzVjYTU5NmIxOWJiYmUyODEzMzQwN2JiNzYzZjgwZjQ0ODVjMDYzYTAyNGVlNWNmZDllMDgxNjlkNzU2MGRjNDg5OWM2N2FiNWUiCiAgICAgICAgfSwKICAgICAgICAiLi9pZGVudC1jaGVja2VyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImlkZW50LWNoZWNrZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjOTkwNDAyOGYxYzU2MTE2YTQ2NzM1Yzc1NGU1NmJmMzkxZjU4YTJmYTJkMzBiNTE1N2E4ZDljOWQ1ODUxNzIzZDY3MWZiZjUyMjdkYzJjYmYzYzFiYjU3NjQ0N2FjZjBkNGQ5MDlhZWViMWY4MWFjMjQ5Mjc4YTU2NjBmYmYyYiIKICAgICAgICB9LAogICAgICAgICIuL2xpc3QtZGlmZmVyZW5jZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJsaXN0LWRpZmZlcmVuY2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjNzdjMGVmYTk5ZjI4YWM3N2Y0YzA5NDljODQ0ODM5YjE2ZWFiMjM2Y2I5MTllOGVhNDhiNjQ5YzQ4ZDc5MThiZWRkY2QwYzJjZDhhYTQwMTc4MjU0YzRjNjAxZGJmZWExNjc5YWY4MWUyNjYyYTc5YjZjMTMwOTg0Njk2NDJiYiIKICAgICAgICB9LAogICAgICAgICIuL21ha2UtYXJyYXktaXRlcmF0b3IuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAibWFrZS1hcnJheS1pdGVyYXRvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU1OWVlM2FlOTkyYWFhODg4YmJlNDFiMzMwMmIyMDRkMWZkZjM2MDBmY2RlN2Q4NmU0NGY5NGJmYTUzNDE0MjM0OTg4YjI5MjQ5ZjI3YTY0Njg5OWIzZWZhOWMxYWJhMWNhYjk0MDMzODlhNmI5ZjQ1ODk4OTRhZjI4MDQ5ZTk4IgogICAgICAgIH0sCiAgICAgICAgIi4vbWFrZS1pdGVyYXRvci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJtYWtlLWl0ZXJhdG9yLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTA5MmRkODE4ZThlMGNiYzZlYTFiNmFmMGMyMWRmNWEyZTg2ZWQxODk2ZTFlN2I3MTJhNzliZGIxMDg0YmUwNjk4OWRiMWJiYjk4NGVhOTQ0MzU1YjkxZmI2NjRlNDFhMTY3ZDMzYWI1MGNhMWVhMDI4MThmZDkyNGY3MTVlMzMiCiAgICAgICAgfSwKICAgICAgICAiLi9vYmplY3QtbWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogIm9iamVjdC1tYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3ZGY1OTJjYWM3MWM4NWMzMWViOTc1YzkyMTc2NmYwZmMxYWMwMjUxMTEyOGM5YWYzNWYyMTU1ODNmNjk0OGE4NThiNzliOGZmZWMzMWQ0ZTk4ODBhMzVlZjliYWI3YjJjMmUwNmIxMzhhMDYzMmIxMThmNTg4ZjExODcyM2MzYyIKICAgICAgICB9LAogICAgICAgICIuL29iamVjdC1tZXRhLW1hcC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJvYmplY3QtbWV0YS1tYXAuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlNzgwM2U5MDg1ZjE2Y2EwMWJjYWY1NTA2YjRlNTViOWViMTRmNzdmZDlhMzA3NTlhMjk4ODIyY2JjNDhmMTI1NTk5M2JhNjFmZGYyMTEzYmExOTljMTBjMGY1MzQ4MzE4MWM3YjdhYTNlY2Y4ZTE3YjFmM2Y4MGFhNTMwN2Q1ZSIKICAgICAgICB9LAogICAgICAgICIuL3Rocm93LWxhYmVsZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAidGhyb3ctbGFiZWxlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImQ3YTEwNTU4YzY1NmE5OGI1ZjlkMDM4NGM3OWY5NGRmOTgyMTE4MGQwMGU5YzI2OTc3YjAxZjlhYmI2OGM1MTk2YmRlNTFjMzBmMTI2MTVmZGM5NTdhNTA4MDU3NTkzM2QwOTNiMjdmZTM5NWQyMDAxMjBlMzRhYjNkODliZDAyIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjExIjogewogICAgICAibmFtZSI6ICJAZW5kby9lbnYtb3B0aW9ucyIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjExIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMTEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJiYWNhNzZlZDdjNmI2NTY3MWY3MGIyNjQ2ZjY4OTQzNTcyNGQ4Yjk5MzBhNWZmMjlkMWZiMzI3ZWQ5NmZkNDE0NDY5NTI1ODk2MmRhZmI5ODI4NjJhMmVmYzFiMDNkMGFkOTZiMzNjMmNhZTViZWJmYTM3MjY4ODZhMDZmNjY0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Vudi1vcHRpb25zLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbnYtb3B0aW9ucy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjBjODMxMzkxNjdmYjUyNDY2ODBjZjNiNjA4OWFlNmZlMjJjZTJhZDgxNjg1YzYzZmRjNjNlYjY5YzY1MjI5ODE0YTdmOGJkNWJhYmExNjBjMjY1YmRiNDU5NTJhMzE1MzkxZGM1MzdiZTMwMzk1NjVlYTdmMDFjODg5NmRkYmNmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9lcnJvcnMtdjEuMi4xMyI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vZXJyb3JzIiwKICAgICAgImxhYmVsIjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjMGQ3ZmYxN2IzZDIyYjVlM2NkOTI5Y2FiMmJmYTFhNTFjNzcxMjM3MDIwNTZmZGM2NjRlNzdmZDYwODE1MzMzNjMwNjA3MDk4MDdkOTkxNGFhMGVkOGNhOGVhODI0OWYwMWM1ODE0NWE0MmQyN2JkYWY3YzNkNzExZDhkMzE4MiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZW52LW9wdGlvbnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvRS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvRS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ5MjQ5YWE3MmFiZTA1YTEyMDEyZDkzZmU1MjVlMGRmZmU0MzllNzc2ZWJjZmViMTljMjIxYWRkNjc5YmEyZDhjZmUwYzE1MTdmZTI3ZjgzMGUxYWRhOTY5MDVhYTZiYTg2MTQwYzVkOTBiMjljOWU1NmI0YTM0ZDYyZDQ4OWZhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2V4cG9ydHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2V4cG9ydHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9sb2NhbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbG9jYWwuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmOGY4MzI3NWZjNzVmMTgxMDhmYWU0ODYwN2RhMGJkMzlmMjVhODBkMWMyNTkyM2QzNjYyZTYyZGI0ZmZlYTIwMGU4YjVhZDg1OTczNmFhMWY0YTFiZmNmMTBmNTYxNjc1ODMyNTFmOWYxOGYwZDliZWQxOWQyNzUyZTAzNmJlMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTAyZWMzZGNkYzYxNzM0OWFmOWYyZTI1Y2FkZTA5YzhkZTI4YTJhMTBiYjM2YTlmMzNlMWE3ODRlOGQxYmQ3NGFkZThhMDIyOGM3MmIwZTU1MTBlYmRlOGFhZmZlODc2NmY3ZGUyOTcxOGQxZDc1OGU1M2VlMTYwMWVlNmRmMjMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbm8tc2hpbS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbm8tc2hpbS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU4YjMxNTkwNTk0ZDllNzU2NGM5ZDYxNTU0ZTU2NzBlMzUwMDVlMmFkZjIwYzE0MDUzNTM0MjRlMDA5ZGUxNzQ2MjI3ZTEyY2ZlYjA3NTljODE4MzkxMGNkMmFjMTBmODIwMWFlMGJiN2UwYjM4NDhmZTY3Mjc2MGI2M2FkYTRkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RyYWNrLXR1cm5zLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90cmFjay10dXJucy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjBkODIzMTA5OWRjMzU1MzAxODViM2U2MzYyOTYzY2M5ZTIyODVjNDQ0ODc1Yzk5N2Q1MDdhYTEzMTNhODY5ZjdlNTVjOTZjZTdkNjFmMTgxODYxYjE2OGIyNjcxNWRjYWQ4NzA4NjExNzFlMjYzYjk4ZDNmZTUzNjc3Mzg1NDExIgogICAgICAgIH0sCiAgICAgICAgIi4vdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAidXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0NjA3MTIzOGIyNWQzMDc2NmY0NDczYjM2MDc1ZGIwNTAwNGEzMDk1YjdiYTZhZGQwNDRkOTg2NjVjN2UwYzNjMzA5ZDA0ZDQzNThhYWQ4YjA1ZGQ4ZmNmMDBmN2RmMjk2MTU1YzVmODI5YjJmOGJmMzhkZGJlZmIxMGQ1ODM0OSIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vZXhvLXYxLjUuMTIiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2V4byIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9leG8tdjEuNS4xMiIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9leG8tdjEuNS4xMiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9jb21tb24vbGlzdC1kaWZmZXJlbmNlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9saXN0LWRpZmZlcmVuY2UuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL29iamVjdC1tYXAuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZW52LW9wdGlvbnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXR0ZXJucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXR0ZXJucy12MS43LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjOTQxNDczYzMwNWJlNTdlNzc4MzFiODQ2YjVkZDcyZjA1YjAzZTk3NzA2OTg0MTc0YWNkMWYzYTEzZmY4Y2NhNDZjMmQ1MTAwZjM1ZmNhN2Q4ZjA3MTRhNWRiZDkzZGQwOWI3ZTZkYjZkYjRjNjA4OTM5OWMyNDRlYzQ2Y2NiNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9leG8tbWFrZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9leG8tbWFrZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDQ0NzRmNzFmNjdjNzc4M2M3N2JhZTI2MzlkYTk2NDAxY2FiN2ZiZGY2ZTUwNjA3MjYxMjU5MDY3MTY2MDllN2Y4NzBmOTIxYzIyZmE4YzM0OWJkYmRiNGI4NDMzZDE4OGUyZWFmOTdmOWVmMjA0MjkwNTQyMmI1MDdhYWQ3ZGYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXhvLXRvb2xzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9leG8tdG9vbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyOWVlOWJhYzJmYTYzZTgzZDVlZTdiOTZkMWNmOTA2ZDljYTJmMmY1YTgyYmNhODRmZmM2MzZjYmMwOTg1MmYwMmIyYmI5ZThjNWQ5MmU1ODUyMjcyMTM1NmE3ZmRjZWQ1ZGNkZTA0ODE1ZDRmMzgyNWYyYWMzY2I1ODMyNDg5NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9nZXQtaW50ZXJmYWNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9nZXQtaW50ZXJmYWNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzZiYWNjZWJiM2I2Y2Y0ZTU2NGMyMDZhMjVkOWYzODcxYzY1ZGU2ZjcyNzQ2OGY0ZTdkMGI0ZTEwMTJkYWEzNzZjYThlOTM2MDUwYzVhMmJiOWQ0OGFhMjhhYzExYWYxYzIwZjc2ZmNlYWI0MDE1ZTBlZmVmMjgyODE3NTM2ZTEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2Zhci12MS4xLjE0IjogewogICAgICAibmFtZSI6ICJAZW5kby9mYXIiLAogICAgICAibGFiZWwiOiAiQGVuZG8vZmFyLXYxLjEuMTQiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZmFyLXYxLjEuMTQiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjYuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXhwb3J0cy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXhwb3J0cy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRhYmNlNWIwNTg0NjAxYWI1NTA2OTkwNDJkMTZlNjZkMDc0YzI1NWIwNDE5MzZkMmIwNzg3MzJhNjQ5MjdjMzUxNWEzZDRmOTUwZWU5NjA5OWVhMDRlZDFkYzE2ZTRmNGE4OGFlYjBkODExYjRlZWI0ZDk3YTQ5MmRmNTA0ZDNiIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9tYXJzaGFsLXYxLjguMCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vbWFyc2hhbCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9tYXJzaGFsLXYxLjguMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9tYXJzaGFsLXYxLjguMCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vb2JqZWN0LW1hcC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lbnYtb3B0aW9ucyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lbnYtb3B0aW9ucy12MS4xLjExIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9lcnJvcnMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXJyb3JzLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjUuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcGFzcy1zdHlsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wYXNzLXN0eWxlLXYxLjYuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc4ODQzMGZjYjc4NmI1NjFjZjAzZWNmNjU5ZGE4ODBmYzhjNGE2YmUyMWVjNmEyNTZmZDg4NDNjOTJiYzY2YzFmMTBmOTgzNzFjYzg1YzM2NzBlYTdjY2Y3NDQwMGFiMTEyZTRkMTBiY2MzOWI2NWNlMDViNDg3NTJhMjhkMmNkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbmNvZGVQYXNzYWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ4ZDQwMDEzMmUxZTM1YzFhOWYyNjMwMWQwODgxOGIyZGQyMGJlNmE4OWU4NzQ5MzdiM2JjOTFkNzZiOTA4NmExMDNjM2I3YmJhYjJiNTMyNTc2NWEwMTI4NWJhZDJjZDYyMzljYjMwOTlkMzk4MzdmMzc0NmNmYjdhNTQ5MmEyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlVG9DYXBEYXRhLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZmM4YjQyNjk3ZGJlZTAyMzI5OTQyNDllYmIwOWQyYTdkMjlkM2M4NzlhMWEzOWMwNjI4YzA3MjBkZDJhZTViNThhMTU3ZjQ2MjExZjk1MzlmMTZkYzJjNjEyNTliYmJhYzVmMzA0MjAyNjIyZDdmYWQ3NTcwOGRiMDA0OWFmNzciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZW5jb2RlVG9TbWFsbGNhcHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZVRvU21hbGxjYXBzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzQ0YTI5NjUzZGQxMjUyNGJiNzgxZWM2ZTc5NGVkMGY1NTRlMjFiODFjM2U5N2IzOWI2ZWM1YjM5OTdkZGFhYzA1YWU1Yzc2NzdjYjNiZjMwMzRjODc2ZTkxYjA4ZWYyMTYxOWQ1NTViZTFlYmRlZTAzMDZjYWQ3NGRhNTc0ZDciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwtanVzdGluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDg2YWU5ZjNmZmY5ZWMwOGUwNGMxMzI2MGI4YTczNjcwZDhmY2Y1N2U2YmVlOTc0NGM2MjcyZDFhMDYwNzA3Y2UzNGZlNGQ1ZDQ5OTA3NjRlZjRmZjE0Yzk5MjMzNzY1YjU3NzU2NDQxMzhiY2UxMzI1NjA3OGVjZmFmYzE3MzEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTIyODkxZTRjMDY0MzFiNTc4NDEwZDM3NmMyOWVlMTc1NjM4OWQ5ZTY3MjUxNTkwMmNmYWEwN2ZjYWU4ZGIyNDZmNGY0NDBkZGYwNTliNzlmNGViNjJmMWM3NTc3N2ZkZDViZmE4ZmNjZDVhYWY0MTgxNjc0MmVkYTc2M2NiNzAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFyc2hhbC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc4MGNiNWYwNjdjZTIyYTcxMzM0MDJkMjcyMGI3M2Y0MTgzYTU3ODFmMjI4ZGFjMjBhNmE0MzU0ODg3MmVlZDViM2MyNGUwZmI1MzhlM2FhMmQzODM5MWZlYjhjZWQ4NDYwNDBjODc2YTgyZmNjNjhhNzRkM2E3NDU5NmI1NzVmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JhbmtPcmRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmFua09yZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjcwNTI5ZWI0MWVlNDg4NDAxMjdiYzJkZDdhYjdmOGEyMjQ0ZGUzZjFmYTMzNGU0ZjU4ZWVhNDIxY2MzMDVmNTQyZjJlN2EzYTE3Nzg2Yzg3ZmM5MDQzMDE3ZTdkN2M2Mzc1ZGE0ZTUxNGMxNjYwYmI4MzAzMDBlZTZkMzhhMWMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2FiOGI0MzBlOTE0ZjdjNDA3M2NjNWYwMWYzZDUwZGY1ODhiYWIwYzM5ZjhjODU3MGFmNzNmODg3MGE2OTI0ODRhYTU3YzE1MmM3MThjOTA2N2U4YTE5MzdlMjVjNGZjYjBmZjZiYTA4NGFlMGJmNmU0Mzc2YTMwNjQ4MjA1OGYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL25hdC12NS4xLjMiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL25hdCIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9uYXQtdjUuMS4zIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL25hdC12NS4xLjMiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDg3MGIxMWUwZDk1ODQ2OTE1NmViMDcxMWNmMWEwYThhOGRmNDA3OTdiMjIyNWYxNGI2YjRhZTc2Yzk5ODVjMjc0MjI0MDZiMDc5NjEwOTQyMzQ2MDMzOTZiMGI1Y2FhOGFiYTc2YTkyY2RlNmJlNDJkODViMTg2Zjg0N2MwMGYiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zIjogewogICAgICAibmFtZSI6ICJAZW5kby9wYXNzLXN0eWxlIiwKICAgICAgImxhYmVsIjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBlbmRvL2NvbW1vbi9pZGVudC1jaGVja2VyLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pZGVudC1jaGVja2VyLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vudi1vcHRpb25zIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMTEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Vycm9ycyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9lcnJvcnMtdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdXRpbHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjllMjQ0ZDk0MDhjZWRiNWYwOGQwMmIxMWViYzNkOTIwNTM0NTIwNmRhOGEyZTA4ZDZlMWI2YWY1MGVjOThmYTA0ZDAyYTdjMDg1MWM5ZWUwNTJjMWU3ZjJkYzA4NmY0OWQ1OGY4MGNmY2M0YmQ5NmEyOTM4ZDgxZDRkOTJhYzIzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2J5dGVBcnJheS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYnl0ZUFycmF5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWY3YWRmOTRkZDFiMTY5YjAzNzBiOTRhYWM0Y2I5Yzg2YTQwOGFjZmEyMDRhNjllZjY0ZjE0YzQ2ZWQwNDJmODQ4MDNjMzliNGQ4MTU1NzkxMGMxZDZlOTNkMzA0YTIyMTQ5NmJkNzBlZjhhYjg4YjNlN2JkMWM5ZTk0YTRiZTUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29weUFycmF5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb3B5QXJyYXkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmYzRmMWM2NmNjZGNmMTAyNWQ1NWUyNDFkNTU5OWQzYThhOThiMDAyNmFiMTJmYWNhNTRhMDE1YzQxODFmZDM2ZTFmMmRlYTY0ODg5YmI2ZDk3MWJmZmIyYzUwNmI3OTAyODJmNWI3NGRlZTZmNmM0MjUwNzZjZGFhNTNmZWMyYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb3B5UmVjb3JkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb3B5UmVjb3JkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTZiNDYwMTJjYjgwZjUxZGY2ZDZkNjIwMDMyZTM1OTcxYmRhM2I5NTEwNTJiODAyZDdhNTUzNzNiYzBhNjVlZGY4MWM3YjJkZGMzNzk5MjdmMTJlZWJhZjFkYzRjOTBiZDc0ZTQxNDk2YzQ5ZmJlM2UzOGY0NDliMzAxMzBlMjEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kZWVwbHlGdWxmaWxsZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkNzI5NzI0ZTEwM2QzMTdhMTY2YjYzODRlYWJmZTBhNDFkZjcyMmVlODhlMDhmY2IwMmVhMTczZmQxNjc2Y2M3ZWM0NTc3MzVlN2JmMDJjOTUyNDBhNjVkYzk1YjkxMjFkNTRhMjA3MWQ0OGFhZWFiYmY0ZDQ0M2FlYTUxZjU4YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lcnJvci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZXJyb3IuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkZDIyY2JkZjk5ZDQ1MjFkMmUxN2JiOWQ1YzFjZmUwZDU5ZTc1NGIxNWQxYTg1OWE4YWI5YmUxMmUxY2ZjMjMzMDA0ODM4Y2QzNjk5ZWE0MDc2ZjcyZTlmMjg0Y2Q5YWJjZDk2NmI3YWQ4MmYwODdkM2NhYzI4ZDZiMTMyZmExYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pdGVyLWhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2l0ZXItaGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRhNWRmMDY2ZDgwMjY2NWNiY2ZjODEwNzBmY2RhYmZkMTNjNzMwOWFhNTQ5NGU1OGU1YWM5ZDIwM2M2MDFjN2RlNWYxMDJhNGNjNjdhMmMzNDBmNzAwYjZkNGNjZGFmMDE5YTRhMmNjYzljZmExZmQ4NzRkMjUyYzhiNDdhMWU5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ha2UtZmFyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWtlLWZhci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImEyMjAwYWM1OTBjNmRmYjFjMTMyYWI4NDVjZGQ0M2EzNjAyMGYwODJkN2IxYzliNzRjMWNiM2Y1YWI0NWFjNWExNDU1YzA2ZTk4NDlhM2ZkNGU2MjIwMTRhMjk5NDEzYzU3NTdhYzA2MjBhN2JiMzhkMzc5YWM3ODcyMjFkMzE4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ha2VUYWdnZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21ha2VUYWdnZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjY2Q1MmIwODRjMjJhYTE5NzFlZTA0ZmJlYWQyODVkN2FiNDNjODA2ZmE1M2RlOWIyYmRjODg4ZTc1NzY4ODU0NzQ1ZTVhNzAxN2RjNDQ0M2YzYWEzODQ3OGNkM2ZiM2MxYWRiMzE5ZGQzODE3ZjIxM2I5YmU3MjcyY2EwMjc3ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzZTVlZTIyZjk1MTcwOTVjOTg2YjQ0ZGU5N2UzNzdhZWRlNTFmNmI2MjVkOTkwY2M4NDFmMTI5MGU1NzkxMmY4YzFhMTRiZTRjMGM2YWRiYjNkOTY2MjBmZmZmZTFhMmE4NzcyOGFmNmRkODA3OGU0YjM5ODk4MDJlODU5ODRiMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXNzU3R5bGVPZi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGFzc1N0eWxlT2YuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIxYTgyNDNkYWQ3NTk0ZjMzMTNhY2QzMjgzNDBmNjc2YzNjYmI4NThmZmI1YjZmZDQ5NDRlYjdjNDYyOTJmZjYyNTQ2NjlmYmU1Nzc1MTM2MTMyNzczNjFiZjU2ODg5ZjAxNDUwZDU4YWUyNTIwN2QzNzYzYTk4OGE4NmNhMGUyYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yZW1vdGFibGUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JlbW90YWJsZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjI5OGE4MjAyZjkxYzQ3ZmZhOGFmYTgzMDExNmI4MDFhNGMwYjMyYWJjOTg2MTQyNmY0M2I5ZDJhZjk4MzQyMDM4MDI4MWY3ZmFhYTRkZmYzZGMxNzBiOWNmMDQ5OTExNTM4MThiNGFkOGFiMGNkOTBkN2ZhNGYyM2U4Y2I4YTU3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3NhZmUtcHJvbWlzZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc2FmZS1wcm9taXNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOGE3MGYyMTNkYzIyNTExZmYzNWVhNDQ4ZTQwZDJhMWYyODEzMTg2ODA1MGMzMWVkMzQyZjc2NTJjMTkyMTRhYjc2ODRhZmRhYjdhMDBkYWY0NzEwOThlMTI5M2Q2NjUxYmU4ODU2MmEwZDFiOTQxZTc4OThkOTUzNzU4ZjcyZmYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RyaW5nLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdHJpbmcuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjYWI5MjYwOGU1MTRhZTA3MjQ3YjQ1N2EyODZiNTU5MWNiYWI0MmFhN2I0YTMwOTY2YmNiNTg3NzgyOTYwZTczNTgxODQ1ZjQ2OTg0NGRlZTQ2ZGM3MWJlOTkzMWFkOWJmNTczOTcxNzA2NWFjMzI2N2I5NWJmN2QzMmJhYjZlYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zeW1ib2wuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N5bWJvbC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjRkMmYxZjhjNDg2NzFkNjk0YTM5MzdjYjcwNTg3MDZmYzkzYmQ2NjE2ZmE5NjZjY2NjNDUyYWFjMzk0ZTljZTAyMmZjYzQ4MDM0YjM3NDY1OTk3NDI0MjkxOTcwMjFmNWZhOGFiYjUzZTljMGY5N2RhZjI2ZjhmODkwYzdkOGFmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RhZ2dlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdGFnZ2VkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTU4M2RlZDE4MDgxNTM5ZjQxYTgxMTk3MTU3Y2MwNWFlOGRjMWJhZTk1YzJhNjc4NzY4YTgyYWNlMTE4OTU0MjcyMzFhMzZlOWIyYWFhNzlhZGJlNWVkNThjM2VjNTgwMjZiMmU3ZmY1ODU2NjYwNjE3OGZiODkxYmViNTc1YTciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNiMThlM2JiZDFmNmEwZDIzMGIwNDIwZWUxMjY2ZjY3ZjFjYjUzYTFhMjZiYzFmMTQ5NjRkNmFlZDQxOTk5NmEyYWNiZTQ0NWUwODJmYWE3MzRhZmQ4NzYyMTkxZTkyNWUyZDFkNTgxNTI0MWM4MjkwZTViZDE5YjdjOWU3YzI5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNhYjhiNDMwZTkxNGY3YzQwNzNjYzVmMDFmM2Q1MGRmNTg4YmFiMGMzOWY4Yzg1NzBhZjczZjg4NzBhNjkyNDg0YWE1N2MxNTJjNzE4YzkwNjdlOGExOTM3ZTI1YzRmY2IwZmY2YmEwODRhZTBiZjZlNDM3NmEzMDY0ODIwNThmIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9wYXR0ZXJucy12MS43LjAiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3BhdHRlcm5zIiwKICAgICAgImxhYmVsIjogIkBlbmRvL3BhdHRlcm5zLXYxLjcuMCIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9wYXR0ZXJucy12MS43LjAiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vY29tbW9uL2FwcGx5LWxhYmVsaW5nLWVycm9yLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9hcHBseS1sYWJlbGluZy1lcnJvci5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vZnJvbS11bmlxdWUtZW50cmllcy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZnJvbS11bmlxdWUtZW50cmllcy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vaWRlbnQtY2hlY2tlci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21tb24tdjEuMi4xMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaWRlbnQtY2hlY2tlci5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21tb24vbGlzdC1kaWZmZXJlbmNlLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbW1vbi12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9saXN0LWRpZmZlcmVuY2UuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL21ha2UtYXJyYXktaXRlcmF0b3IuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL21ha2UtYXJyYXktaXRlcmF0b3IuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL21ha2UtaXRlcmF0b3IuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL21ha2UtaXRlcmF0b3IuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tbW9uLXYxLjIuMTMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL29iamVjdC1tYXAuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXJyb3JzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Vycm9ycy12MS4yLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjEuOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wYXNzLXN0eWxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNGM5YjdhYmEzMjViM2E5NDA4YmI5NzczZDJiODIzNDhlMGVjNWM4YThlZmRkNDdmY2NjZTUxZDRjNTJhYmYyZmQ1MDIwZmRhYjllYWYwZDBkMDUyOGI3OTE3MGJmMDNmYzI5MDZjMzI2MmNjZDAyYjExZWZhMzJlZTIyMzdjNzMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9jaGVja0tleS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9jaGVja0tleS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdiYmEzYWQzNTJiYzVkNDM5ZjA3ZjI5OGE0YjlhOTI2ZjFkMGJjNTMzN2FhYjg4ZTg2MDlkNWM0NjUxNjI1MTY1ZTE0N2I0Nzk3YjExNzU0YjlhZTEwNDJiNmJlMDg5N2MxNzhhOWQ2ZmIzZGZhMTM3YTg5NmI5YjNiODIzNWMxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvY29tcGFyZUtleXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY29tcGFyZUtleXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0Nzk4YTA3MDQ5ZGU5ZTg3MTYyYmE1MzJiMjMwMDdhYWExNzgyY2UyOWE4Nzk3NDkyYTQzODAzODQyNDdiOGFjNDljZjFkZWEyYWQzMDU0NjU0MjA2OTdmMjNlZWE0NWY2NDdhOWQyMmVkNDJhMmZhMDA5OTA4Mjg1YzU2OTIyYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NvcHlCYWcuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY29weUJhZy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjNiYzRjZjhjNDEzNWUxZDJlMTg3NjJkZThiNjdhYWMzMWM5NmUzYWEzMWNjNGFiNGQ2MTE5ODdlMzdkZjg2OGMyYmQ5MmQwY2M3M2JiNDc3NGJkYjMxY2I2YmFiMTFiYWFhODgyNmNjMjFlOGNhNzFjZmM3Zjk0NTc2MTEwMjU3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvY29weVNldC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9jb3B5U2V0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYzE3ZjgzZjUzZjkxMmFhOTNlOGRlZDhlOTc2NmNkYzNhMjY3MTczZWVkMzVkNTFmMDU0ODJhYzVkNzYxMDJjNmNkNDAzNWZlOTk5Y2I4ZjUwM2JjYWQyODg1MmJjN2I0MDgxNDhhMzk3ZmY3NGY5MjViMjljMzg1OTVjYTgwZDMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9rZXljb2xsZWN0aW9uLW9wZXJhdG9ycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9rZXljb2xsZWN0aW9uLW9wZXJhdG9ycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImJkMWNlZDVmMTM3NTRjY2ZmNDlkYzBmODEwYzhlNmQ1MjcyN2JmMmM0ZWM3N2E4ZGQ5YTVmZjU3NzQ5NWM0YWZjZjRkYTJiOGFmNDM2Yzg0MzM2YWY5OWE3MWMxY2NiNzQ5MGY2YmEyOTdlYzE5NWYzZjM3Y2M3ODAxZWFkZjZiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNGUwOTVmN2M0NTg1NzJiNTEwZmEzMzYwM2MyMDczZDMxMjkxNTJkZjNmNzRkM2U2MjdiMzkzMTkxOWY2Njk0YTU2ZmViODQ5NzlmOGFlOTU0MGRkNDYyYzA2ODRiNmU1YmI4OWJiZDBhODdkZWYyMmVhOTM3NTNkZWY3OTM0YTAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2MzQxZDhmNTY1ZGQ2YWEwMzA4MmEzNmUxMjVhYzk4YzUwY2RlYTljMzIzYTYzM2RhOGNjNDJlNmJjZTkwZjRkMDA2MDdkNDUxNjQ5NDExMGUxYmZlZGE0Y2YzYjIyMWUwM2IzZWVjZjQ2OTZlY2E5ZGJhNmQ2ZTk4YTIyNGQ4ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXR0ZXJucy9nZXRHdWFyZFBheWxvYWRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXR0ZXJucy9nZXRHdWFyZFBheWxvYWRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTM1YTZkMGIzMGFjNzhlZWMzODI3YWEwZjkxOWU5NmU5MmY1M2QxNmE3NTM5ZmJhNjgyZjczOWUxNmRmMWNmM2I3MjA4NmZkNjc1NDJmNzkwMDJiYjc3NmI2YTBmNDg5ODdmNGMwOTQ1ZTVjNmQzOWVjMDljYTYxOTc4MzNlZTUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlODM5ZjkzMzY2ZjY4ZjA4ZDNlNTk2MWI5NDUxODVjMDk0MTAxYjdiNzMwN2I1ZGZmN2YzNDU4ODg4Njk0NDhkMTcyMDZkNjE4ODk3NDU4MGExNzg5ZDc0YTdjODQ5ZGZlNzY1ZTQzZTQ0NTUzMzZhZWQxMzdiOGIwY2Y5ZDQ0ZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMyI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vcHJvbWlzZS1raXQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMyIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2ZGIzMjQwMDM0YzkxYWYxYzBiNGQ1OWNlNWMwOWNkOGZiMjIzZmM1MWIxNTcwMTJlZWZlMmQzMzJiZGY3YTQzOTIwNTQ2ZmU1NzEzMmYwYzUxMzYzMmE5MDk1M2ZmMzcxMDA0Mjk0OTZiN2IxYzBjMDljNTc3NDVlMzNmN2FmYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pcy1wcm9taXNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pcy1wcm9taXNlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzdlMzUyZmRjNWZjYTM3N2I0MDFhYzE0YTAzNDY4ZTE0NmUzNTcyYTAwOTE0YWYyMDI5MzFlNThmZmI5ZTFhNDMyNDYwNmZiYmQxZjIxNGQzZjU3NjgxOTVkY2RjYzk0YjcyMWUxMGZlYWZkYTMwYTM3ODU4ZTJmMzQxNDc3YzEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWVtby1yYWNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tZW1vLXJhY2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmYmFjNDc2MDE1NjkzMjE5M2IxMGUxZTUxYmQ1YTgxNWEzYTcxMTA4MTA3YjVlY2UzMmQ1OGRmMmQxNDgyNmYwYmY4NWFlNzg4MTljNjM3NDc5NzY3NDA0ODhiZmFjODQ4NWNiMGYyYTRkOTc3NWU2YTI1YmYzZmViMzFjNDE2MCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJjMTE3ODZhMGE1Y2E4MDljY2FjMWYxOTgwN2EzYjYxMGM0MTEzMDE4MTc5NmFlZDJlMzdkY2JlMWNkOGU0NTc4YmQyMDU1MTJhNWZjOWZiMzEwZjRmY2Q1OTQ1ZDk2MmVmMjQ5M2MzMTIzNDE1N2E5MzRjNWQ1YWMzNDViZTdhNyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIzYWI4YjQzMGU5MTRmN2M0MDczY2M1ZjAxZjNkNTBkZjU4OGJhYjBjMzlmOGM4NTcwYWY3M2Y4ODcwYTY5MjQ4NGFhNTdjMTUyYzcxOGM5MDY3ZThhMTkzN2UyNWM0ZmNiMGZmNmJhMDg0YWUwYmY2ZTQzNzZhMzA2NDgyMDU4ZiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGVuZG8vc3RyZWFtLXYxLjIuMTMiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3N0cmVhbSIsCiAgICAgICJsYWJlbCI6ICJAZW5kby9zdHJlYW0tdjEuMi4xMyIsCiAgICAgICJsb2NhdGlvbiI6ICJAZW5kby9zdHJlYW0tdjEuMi4xMyIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTEwMWRmMTYwOThiNzhhNmEzMWNjMzZhZDA3NmY5M2ZlMjVkOTQ2MTYxZDc2MzViODk4NTQ2ZTZjMGZmOWQ5ODhmYzk3MThlOWQ0OGViZjdiM2VkZDg5ZTRmMjczNGI4OGMwOTRkODE3ODhmMDU0N2M5M2ZhOGFhMzdjOTcxYjQiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgImplc3NpZS5qcy12MC4zLjQiOiB7CiAgICAgICJuYW1lIjogImplc3NpZS5qcyIsCiAgICAgICJsYWJlbCI6ICJqZXNzaWUuanMtdjAuMy40IiwKICAgICAgImxvY2F0aW9uIjogImplc3NpZS5qcy12MC4zLjQiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MS4xLjE0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFpbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjBhZjEwOTk3MjkwMWVlYzNlN2Q5YzAxZGFlMjZhZWQ2NzlmZjEwYzZiOGMyZWFiOWY3Yjg1MDJhMjdkOTE1ZjRmYzBkODhjZmYyNWYxNWI2OTg1ZjRlMWNlMmJkNDUzYjc4MzEwYmY2YzNjNmEyNTgzM2M1MWIwNzA2NWIwMzI4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JpbmcwL0UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JpbmcwL0UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkN2RlNmNiYjUxZTE2YTJkZDUyMGY3ZTU2NjBhZGZhM2QzNmI5ZDIwZWViYTdjZDNkMDM2YTBkNWJmZDZkMTRhZDg1ZjU2MzkwMGYxNmM2YTA3YmM1NzJmZjg0MzZjM2ZkMWFmZGM3NTY3NzIzNzA5ODM3NDNlNmQyNGQ3NDdjMSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMC9hc3luYy1nZW5lcmF0ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzAvYXN5bmMtZ2VuZXJhdGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiNTdlOGNhOWY1MDQwM2UwZDQ2OTYyZmM4NDUzOTU4ZWZkYzUzMDM1YWQ4OWJiMGY0NmNmMTI2MzY3ZDc2OTI5ZTliM2JlMTNlZjk1YzQ1Mjc2ZmNiODQ2MDc5YTY0MTVkNzNiZDM1MzkxZmE2NjBkZjE2MjA3OWJhNzE5YjJkZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMC9tYWluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMC9tYWluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOGZkNTJlZjMwMmMxZjE0YzYyMGZkZGQ0MzcyN2Q4MjMyNDAzYjliZDM1NjFlMWYxMjNkY2U5ZDRlOWExM2I1NWEyZDFlZTRhZDgwNzAyZjI1MTExOWU5ZDQ5MmE4YzdhMzQ1ZmU1NzFhNDc5ZDM5MWUyYjc4MWZmYjEzOGMwMDYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmluZzAvbWFrZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMC9tYWtlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhOGQzYzVkYzdkNDJiYTcyZmZjNmZlYjJkOTkxMzFhNzkzYzM0MTkyYzU5MTc4MzMwOWUwZGE5MWQxMDI5MjFkOGVkNTA2ZDk3OTVjZjNiZWZjNmE3OTNmYzZhYjE4MDMxZmYyYmJhZGRiZGI0NzY0YzZmNDlmZjhlOTAzYmJlMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMS9hc3luYy10b29scy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzEvYXN5bmMtdG9vbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmMjJjZDIzMGRjMjFmNmE5MTc0Mjc0NWM1OGRmNTkyODA2YWRlOGYxM2I4N2YyOTBmMDg2ODliY2NjYzRlNjE0NzQ0Y2RmNDNmOGQ5ZjNlZTZhMWM1NmQ5MTA4MzFlMzk3YjY2NmJjYjgwOThhMTEyNjIwMDI1Mzg0MGZlNjUwMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMS9tYWluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMS9tYWluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNzQ2YjZhYmJjZWE3MGI1MTIwYTA1NDI2MzlhOTg1ZDg5OGEyNWYyNWEyMzk0MGVjYzBmYTI2ZTZlZmM4ZDY1MmE1ZGI5YWU1YTc1ZWMyNzhmNzljNDRkODgwMGQ5N2E3YmRlZWJmZTY1NzMzYjNhYjY2NGJiMjM1M2M0NjU1ZWUiCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9UEsDBAoAAAAAAAAAAAAxgEj4jQEAAI0BAAAgAAAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL2hlYXAuanN7ImltcG9ydHMiOlsiLi9zcmMvaGVhcC5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vc3JjL2hlYXAuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvaGVhcC5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAAnAAAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9leHBvcnRzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABMzBZHzCwAA8wsAACQAAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL2hlYXAuanN7ImltcG9ydHMiOlsiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL2V4byIsIkBhZ29yaWMvc3RvcmUiLCIuL21ha2Utb25jZS5qcyIsIi4va2V5cy5qcyIsIi4vd2F0Y2gtcHJvbWlzZS5qcyJdLCJleHBvcnRzIjpbIm1ha2VIZWFwWm9uZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhcixpc1Bhc3NhYmxlLG1ha2VFeG8sZGVmaW5lRXhvQ2xhc3MsZGVmaW5lRXhvQ2xhc3NLaXQsbWFrZVNjYWxhck1hcFN0b3JlLG1ha2VTY2FsYXJTZXRTdG9yZSxtYWtlU2NhbGFyV2Vha01hcFN0b3JlLG1ha2VTY2FsYXJXZWFrU2V0U3RvcmUsbWFrZU9uY2VLaXQsa2V5cyx3YXRjaFByb21pc2U7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wiaXNQYXNzYWJsZVwiLFskaM2PX2EgPT4gKGlzUGFzc2FibGUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9leG9cIiwgW1tcIm1ha2VFeG9cIixbJGjNj19hID0+IChtYWtlRXhvID0gJGjNj19hKV1dLFtcImRlZmluZUV4b0NsYXNzXCIsWyRozY9fYSA9PiAoZGVmaW5lRXhvQ2xhc3MgPSAkaM2PX2EpXV0sW1wiZGVmaW5lRXhvQ2xhc3NLaXRcIixbJGjNj19hID0+IChkZWZpbmVFeG9DbGFzc0tpdCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm1ha2VTY2FsYXJNYXBTdG9yZVwiLFskaM2PX2EgPT4gKG1ha2VTY2FsYXJNYXBTdG9yZSA9ICRozY9fYSldXSxbXCJtYWtlU2NhbGFyU2V0U3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyU2V0U3RvcmUgPSAkaM2PX2EpXV0sW1wibWFrZVNjYWxhcldlYWtNYXBTdG9yZVwiLFskaM2PX2EgPT4gKG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUgPSAkaM2PX2EpXV0sW1wibWFrZVNjYWxhcldlYWtTZXRTdG9yZVwiLFskaM2PX2EgPT4gKG1ha2VTY2FsYXJXZWFrU2V0U3RvcmUgPSAkaM2PX2EpXV1dXSxbXCIuL21ha2Utb25jZS5qc1wiLCBbW1wibWFrZU9uY2VLaXRcIixbJGjNj19hID0+IChtYWtlT25jZUtpdCA9ICRozY9fYSldXV1dLFtcIi4va2V5cy5qc1wiLCBbW1wiYWdvcmljVmF0RGF0YUtleXNcIixbJGjNj19hID0+IChrZXlzID0gJGjNj19hKV1dXV0sW1wiLi93YXRjaC1wcm9taXNlLmpzXCIsIFtbXCJ3YXRjaFByb21pc2VcIixbJGjNj19hID0+ICh3YXRjaFByb21pc2UgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtTdG9yZXN9IGZyb20gJy4vdHlwZXMuanMnO1xuICogQGltcG9ydCB7Wm9uZX0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKi9cblxuLyoqXG4gKiBAdHlwZSB7U3RvcmVzfVxuICovXG5jb25zdCBkZXRhY2hlZEhlYXBTdG9yZXMgPSBGYXIoJ2hlYXBTdG9yZXMnLCB7XG4gIGRldGFjaGVkOiAoKSA9PiBkZXRhY2hlZEhlYXBTdG9yZXMsXG4gIGlzU3RvcmFibGU6IGlzUGFzc2FibGUsXG5cbiAgc2V0U3RvcmU6IG1ha2VTY2FsYXJTZXRTdG9yZSxcbiAgbWFwU3RvcmU6IG1ha2VTY2FsYXJNYXBTdG9yZSxcbiAgd2Vha01hcFN0b3JlOiBtYWtlU2NhbGFyV2Vha01hcFN0b3JlLFxuICB3ZWFrU2V0U3RvcmU6IG1ha2VTY2FsYXJXZWFrU2V0U3RvcmUsXG59KTtcblxuLyoqXG4gKiBDcmVhdGUgYSBoZWFwIChpbi1tZW1vcnkpIHpvbmUgdGhhdCB1c2VzIHRoZSBkZWZhdWx0IGV4byBhbmQgc3RvcmUgaW1wbGVtZW50YXRpb25zLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbYmFzZUxhYmVsXVxuICogQHJldHVybnMge1pvbmV9XG4gKi9cbiAgICAgICBjb25zdCBtYWtlSGVhcFpvbmUgPSAoYmFzZUxhYmVsID0gJ2hlYXBab25lJykgPT4ge1xuICBjb25zdCB7IG1ha2VPbmNlLCB3cmFwUHJvdmlkZXIgfSA9IG1ha2VPbmNlS2l0KGJhc2VMYWJlbCwgZGV0YWNoZWRIZWFwU3RvcmVzKTtcblxuICAvKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbFxuICogQHBhcmFtIHthbnl9IF9vcHRpb25zXG4gKi9cbiAgY29uc3QgbWFrZVN1YlpvbmUgPSAobGFiZWwsIF9vcHRpb25zKSA9PlxuICAgIG1ha2VIZWFwWm9uZShgJHtiYXNlTGFiZWx9LiR7bGFiZWx9YCk7XG5cbiAgcmV0dXJuIEZhcignaGVhcFpvbmUnLCB7XG4gICAgZXhvOiB3cmFwUHJvdmlkZXIobWFrZUV4bywga2V5cy5leG8pLFxuICAgIGV4b0NsYXNzOiB3cmFwUHJvdmlkZXIoZGVmaW5lRXhvQ2xhc3MsIGtleXMuZXhvQ2xhc3MpLFxuICAgIGV4b0NsYXNzS2l0OiB3cmFwUHJvdmlkZXIoZGVmaW5lRXhvQ2xhc3NLaXQsIGtleXMuZXhvQ2xhc3NLaXQpLFxuICAgIHN1YlpvbmU6IHdyYXBQcm92aWRlcihtYWtlU3ViWm9uZSksXG5cbiAgICBtYWtlT25jZSxcbiAgICB3YXRjaFByb21pc2UsXG4gICAgZGV0YWNoZWQ6IGRldGFjaGVkSGVhcFN0b3Jlcy5kZXRhY2hlZCxcbiAgICBpc1N0b3JhYmxlOiBkZXRhY2hlZEhlYXBTdG9yZXMuaXNTdG9yYWJsZSxcblxuICAgIG1hcFN0b3JlOiB3cmFwUHJvdmlkZXIoZGV0YWNoZWRIZWFwU3RvcmVzLm1hcFN0b3JlKSxcbiAgICBzZXRTdG9yZTogd3JhcFByb3ZpZGVyKGRldGFjaGVkSGVhcFN0b3Jlcy5zZXRTdG9yZSksXG4gICAgd2Vha01hcFN0b3JlOiB3cmFwUHJvdmlkZXIoZGV0YWNoZWRIZWFwU3RvcmVzLndlYWtNYXBTdG9yZSksXG4gICAgd2Vha1NldFN0b3JlOiB3cmFwUHJvdmlkZXIoZGV0YWNoZWRIZWFwU3RvcmVzLndlYWtTZXRTdG9yZSksXG4gIH0pO1xufTskaM2PX29uY2UubWFrZUhlYXBab25lKG1ha2VIZWFwWm9uZSk7XG5oYXJkZW4obWFrZUhlYXBab25lKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VIZWFwWm9uZSI6WyJtYWtlSGVhcFpvbmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAFW6x+nkCAAB5AgAAJQAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9leHBvcnRzLmpzIiwiLi9tYWtlLW9uY2UuanMiLCIuL2tleXMuanMiLCIuL2lzLXBhc3NhYmxlLmpzIiwiLi93YXRjaC1wcm9taXNlLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9leHBvcnRzLmpzIiwiLi9pcy1wYXNzYWJsZS5qcyIsIi4va2V5cy5qcyIsIi4vbWFrZS1vbmNlLmpzIiwiLi93YXRjaC1wcm9taXNlLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vZXhwb3J0cy5qc1wiLCBbXV0sW1wiLi9tYWtlLW9uY2UuanNcIiwgW11dLFtcIi4va2V5cy5qc1wiLCBbXV0sW1wiLi9pcy1wYXNzYWJsZS5qc1wiLCBbXV0sW1wiLi93YXRjaC1wcm9taXNlLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAC1M1ZEhAwAAIQMAACsAAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL2lzLXBhc3NhYmxlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiZXhwb3J0cyI6WyJpc1Bhc3NhYmxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcmVhbElzUGFzc2FibGU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJpc1Bhc3NhYmxlXCIsWyRozY9fYSA9PiAocmVhbElzUGFzc2FibGUgPSAkaM2PX2EpXV1dXV0pO1xuXG4vKipcbiAqIEBpbXBvcnQge1Bhc3NhYmxlfSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJztcbiAqL1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIEltcG9ydCBgaXNQYXNzYWJsZWAgZGlyZWN0bHkgZnJvbSBgQGVuZG8vcGFzcy1zdHlsZWBcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHJldHVybnMge3NwZWNpbWVuIGlzIFBhc3NhYmxlfVxuICovXG4gICAgICAgY29uc3QgaXNQYXNzYWJsZSA9IHNwZWNpbWVuID0+IHJlYWxJc1Bhc3NhYmxlKHNwZWNpbWVuKTskaM2PX29uY2UuaXNQYXNzYWJsZShpc1Bhc3NhYmxlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUGFzc2FibGUiOlsiaXNQYXNzYWJsZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABsFac/IgQAACIEAAAkAAAAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9rZXlzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJhZ29yaWNWYXREYXRhS2V5cyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKiBAdHMtY2hlY2sqL1xuXG4vKipcbiAqIEBpbXBvcnQge0tleU1ha2Vyc30gZnJvbSAnLi90eXBlcy5qcyc7XG4gKi9cblxuLyoqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbCAqL1xuY29uc3Qga2luZCA9IGxhYmVsID0+IGAke2xhYmVsfV9raW5kSGFuZGxlYDtcblxuLyoqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbCAqL1xuY29uc3Qgc2luZ2xldG9uID0gbGFiZWwgPT4gYCR7bGFiZWx9X3NpbmdsZXRvbmA7XG5cbi8qKlxuICogS2V5TWFrZXJzIGNvbXBhdGlibGUgd2l0aCBgQGFnb3JpYy92YXQtZGF0YWAuXG4gKlxuICogQHR5cGUge0tleU1ha2Vyc31cbiAqL1xuICAgICAgIGNvbnN0IGFnb3JpY1ZhdERhdGFLZXlzID0ge1xuICBleG9DbGFzczogbGFiZWwgPT4gaGFyZGVuKFtraW5kKGxhYmVsKV0pLFxuICBleG9DbGFzc0tpdDogbGFiZWwgPT4gaGFyZGVuKFtraW5kKGxhYmVsKV0pLFxuICBleG86IGxhYmVsID0+IGhhcmRlbihba2luZChsYWJlbCksIHNpbmdsZXRvbihsYWJlbCldKSxcbiAgc3RvcmU6IGxhYmVsID0+IGhhcmRlbihbbGFiZWxdKSxcbiAgem9uZTogbGFiZWwgPT4gaGFyZGVuKFtsYWJlbF0pLFxufTskaM2PX29uY2UuYWdvcmljVmF0RGF0YUtleXMoYWdvcmljVmF0RGF0YUtleXMpO1xuaGFyZGVuKGFnb3JpY1ZhdERhdGFLZXlzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFnb3JpY1ZhdERhdGFLZXlzIjpbImFnb3JpY1ZhdERhdGFLZXlzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKkbjar6DgAA+g4AACkAAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL21ha2Utb25jZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJtYWtlT25jZUtpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV1dKTtcblxuXG4vKipcbiAqIEBpbXBvcnQge1N0b3Jlc30gZnJvbSAnLi90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtNYXBTdG9yZX0gZnJvbSAnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnO1xuICovXG5cbi8qKiBAcGFyYW0ge3N0cmluZ30gbGFiZWwgKi9cbmNvbnN0IGRlZmF1bHRMYWJlbFRvS2V5cyA9IGxhYmVsID0+IGhhcmRlbihbbGFiZWxdKTtcbmhhcmRlbihkZWZhdWx0TGFiZWxUb0tleXMpO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZWJ1Z05hbWUgT25seSB1c2VkIGludGVybmFsbHkgZm9yIGRpYWdub3N0aWNzLCBub3QgYXZhaWxhYmxlIHRvIHVzZXIgY29kZVxuICogQHBhcmFtIHtTdG9yZXN9IHN0b3Jlc1xuICogQHBhcmFtIHtNYXBTdG9yZTxzdHJpbmcsIGFueT59IFtiYWNraW5nU3RvcmVdXG4gKi9cbiAgICAgICBjb25zdCBtYWtlT25jZUtpdCA9IChkZWJ1Z05hbWUsIHN0b3JlcywgYmFja2luZ1N0b3JlID0gdW5kZWZpbmVkKSA9PiB7XG4gIC8qIFdlIG5lZWQgYSBkZXRhY2hlZCBzZXRTdG9yZSBzbyB0aGF0IGl0IGlzbid0IHBlcnNpc3RlZCBhcyBwYXJ0IG9mIHRoZSB6b25lLiovXG4gIC8qIFRoYXQgd2F5LCBvdXIgdXNlZEtleXMgYXJlIG9ubHkgdHJhY2tlZCBmb3IgdGhlIGN1cnJlbnQgaW5jYXJuYXRpb24sIHdoaWNoKi9cbiAgLyogaXMgd2hhdCB3ZSB3YW50LiAgVXNpbmcgYGRlYnVnTmFtZWAgaW4gdGhlIGxhYmVsIGlzIGdvb2QgZm9yIGRpYWdub3N0aWNzLCovXG4gIC8qIGFuZCBzaW5jZSBpdCBpcyBvbmx5IGZvciBhIGRldGFjaGVkIHN0b3JlLCBpdCBzaG91bGQgbm90IGJlIHZpc2libGUgdG8gdGhlKi9cbiAgLyogYmFja2luZyBzdG9yZS4qL1xuICBjb25zdCB1c2VkS2V5cyA9IHN0b3Jlcy5kZXRhY2hlZCgpLnNldFN0b3JlKGAke2RlYnVnTmFtZX0gdXNlZCBrZXlzYCk7XG5cbiAgLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKi9cbiAgY29uc3QgYXNzZXJ0T25seU9uY2UgPSBrZXkgPT4ge1xuICAgIHR5cGVvZiBrZXkgPT09ICdzdHJpbmcnIHx8IEZhaWxga2V5ICR7a2V5fSBtdXN0IGJlIGEgc3RyaW5nYDtcbiAgICAhdXNlZEtleXMuaGFzKGtleSkgfHxcbiAgICAgIEZhaWxga2V5ICR7a2V5fSBoYXMgYWxyZWFkeSBiZWVuIHVzZWQgaW4gdGhpcyB6b25lIGFuZCBpbmNhcm5hdGlvbmA7XG5cbiAgICAvKiBNYXJrIHRoaXMga2V5IGFzIHVzZWQuICBXZSBtYWtlIG5vIGF0dGVtcHQgdG8gcmVjb3ZlciBmcm9tIGludmFsaWQgbWFrZXJzKi9cbiAgICAvKiBvciBiYWNraW5nU3RvcmVzLiovXG4gICAgdXNlZEtleXMuYWRkKGtleSk7XG4gIH07XG5cbiAgLyoqXG4gKiBFbnN1cmUgdGhlIHdyYXBwZWQgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgb25jZSBwZXIgaW5jYXJuYXRpb24uICBJdCBpc1xuICogZXhwZWN0ZWQgdG8gdXBkYXRlIHRoZSBiYWNraW5nIHN0b3JlIGRpcmVjdGx5LlxuICpcbiAqIEB0ZW1wbGF0ZSB7KGtleTogc3RyaW5nLCAuLi5yZXN0OiBhbnlbXSkgPT4gYW55fSBUXG4gKiBAcGFyYW0ge1R9IHByb3ZpZGVyXG4gKiBAcGFyYW0geyhsYWJlbDogc3RyaW5nKSA9PiBzdHJpbmdbXX0gW2xhYmVsVG9LZXlzXVxuICogQHJldHVybnMge1R9XG4gKi9cbiAgY29uc3Qgd3JhcFByb3ZpZGVyID0gKHByb3ZpZGVyLCBsYWJlbFRvS2V5cyA9IGRlZmF1bHRMYWJlbFRvS2V5cykgPT4ge1xuICAgIC8qKiBAdHlwZSB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8VD4pID0+IFJldHVyblR5cGU8VD59ICovXG4gICAgY29uc3Qgd3JhcHBlciA9IChsYWJlbCwgLi4ucmVzdCkgPT4ge1xuICAgICAgZm9yIChjb25zdCBrZXkgb2YgbGFiZWxUb0tleXMobGFiZWwpKSB7XG4gICAgICAgIGFzc2VydE9ubHlPbmNlKGtleSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcHJvdmlkZXIobGFiZWwsIC4uLnJlc3QpO1xuICAgIH07XG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7VH0gKi8gKHdyYXBwZXIpO1xuICB9O1xuXG4gIC8qKlxuICogVGhlIGJlc3Qgd2F5IHRvIHVuZGVyc3RhbmQgdGhlIHB1cnBvc2Ugb2YgYG1ha2VPbmNlYCBpcyB0byBmaXJzdCB1bmRlcnN0YW5kXG4gKiB3aGF0IGBtYWtlT25jZWAgZG9lcyBvbiBhIGR1cmFibGUgem9uZS4gVXNlZCBjb3JyZWN0bHksIGBtYWtlT25jZWAgc2hvdWxkIG9ubHlcbiAqIGJlIGNhbGxlZCBhdCBtb3N0IG9uY2Ugb24gYW55IHpvbmUsa2V5IHBhaXIgZHVyaW5nIGFueSB2YXQgaW5jYXJuYXRpb24uXG4gKiBHaXZlbiB0aGF0IGNvbnN0cmFpbnQsIGlmIHRoZXJlIGlzIGFscmVhZHkgYSB2YWx1ZSBib3VuZCB0byB0aGF0XG4gKiB6b25lLGtleSBwYWlyLCBpdCBtdXN0IGhhdmUgYmVlbiBsZWZ0IHRoZXJlIGJ5IGEgcHJldmlvdXMgaW5jYXJuYXRpb24gYW5kXG4gKiBgbWFrZU9uY2VgIHdpbGwgc2ltcGx5IHJldHVybiBpdC4gSWYgbm90LCB0aGVuIGBtYWtlcihrZXkpYCBpcyBjYWxsZWQgdG9cbiAqIGRldGVybWluZSB0aGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGF0IHNsb3QsIHdoaWNoIHdpbGwgbm9ybWFsbHkgYmUgcHJlc2VydmVkXG4gKiBieSBzaW1pbGFyIGNhbGxzIHRvIGBtYWtlT25jZWAgaW4gZnV0dXJlIGluY2FybmF0aW9ucyAtLS0gdGhvdWdoIHRoYXQgd2lsbCBiZVxuICogdXAgdG8gdGhlbS5cbiAqXG4gKiBBbHNvIGVuc3VyZXMgdGhlIG1ha2VyIHJldHVybnMgYSBzdG9yYWJsZSB2YWx1ZS5cbiAqXG4gKiBAdGVtcGxhdGUgVlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUgc3RyaW5nIG5hbWUgb2YgdGhlIFpvbmUgc2xvdCB0byBwcm92aWRlLlxuICogQHBhcmFtIHsoa2V5OiBzdHJpbmcpID0+IFZ9IG1ha2VyIENhbGxlZCB0byBjcmVhdGUgYSBmcmVzaCB2YWx1ZSB0byBmaWxsIGFuIGVtcHR5IHNsb3QuXG4gKiBAcmV0dXJucyB7Vn0gVGhlIHZhbHVlIG9mIHRoZSBrZXkncyBzbG90LlxuICovXG4gIGNvbnN0IG1ha2VPbmNlID0gKGtleSwgbWFrZXIpID0+IHtcbiAgICBhc3NlcnRPbmx5T25jZShrZXkpO1xuICAgIGlmIChiYWNraW5nU3RvcmUgJiYgYmFja2luZ1N0b3JlLmhhcyhrZXkpKSB7XG4gICAgICByZXR1cm4gYmFja2luZ1N0b3JlLmdldChrZXkpO1xuICAgIH1cbiAgICBjb25zdCB2YWx1ZSA9IG1ha2VyKGtleSk7XG4gICAgc3RvcmVzLmlzU3RvcmFibGUodmFsdWUpIHx8XG4gICAgICBGYWlsYG1ha2VyIHJldHVybiB2YWx1ZSAke3ZhbHVlfSBpcyBub3Qgc3RvcmFibGVgO1xuICAgIGJhY2tpbmdTdG9yZSAmJiBiYWNraW5nU3RvcmUuaW5pdChrZXksIHZhbHVlKTtcbiAgICByZXR1cm4gdmFsdWU7XG4gIH07XG5cbiAgcmV0dXJuIGhhcmRlbih7IG1ha2VPbmNlLCB3cmFwUHJvdmlkZXIgfSk7XG59OyRozY9fb25jZS5tYWtlT25jZUtpdChtYWtlT25jZUtpdCk7XG5oYXJkZW4obWFrZU9uY2VLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU9uY2VLaXQiOlsibWFrZU9uY2VLaXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAAgE7lIAaAACAGgAAMgAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvcHJlcGFyZS1hdHRlbnVhdG9yLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2NvbW1vbi9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzIiwiQGVuZG8vcGF0dGVybnMiLCIuL2hlYXAuanMiXSwiZXhwb3J0cyI6WyJhdHRlbnVhdGVPbmUiLCJwcmVwYXJlQXR0ZW51YXRvck1ha2VyIiwid3JhcHBlck1ldGhvZHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHEsZnJvbVVuaXF1ZUVudHJpZXMsTSxtYWtlSGVhcFpvbmU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL2Zyb20tdW5pcXVlLWVudHJpZXMuanNcIiwgW1tcImZyb21VbmlxdWVFbnRyaWVzXCIsWyRozY9fYSA9PiAoZnJvbVVuaXF1ZUVudHJpZXMgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXSxbXCIuL2hlYXAuanNcIiwgW1tcIm1ha2VIZWFwWm9uZVwiLFskaM2PX2EgPT4gKG1ha2VIZWFwWm9uZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7TWV0aG9kR3VhcmR9IGZyb20gJ0BlbmRvL3BhdHRlcm5zJztcbiAqIEBpbXBvcnQge1pvbmV9IGZyb20gJ0BhZ29yaWMvYmFzZS16b25lJztcbiAqL1xuXG4vKiBUaGlzIGF0dGVudWF0b3IgaW1wbGVtZW50YXRpb24gaXMganVzdCBhIHNpbXBsaWZpY2F0aW9uIG9mIHRoZSovXG4vKiByZXZvY2FibGUga2l0IGltcGxlbWVudGF0aW9uIGluIHByZXBhcmUtcmV2b2NhYmxlLmpzLiBUaGUgcmV2b2NhYmxlIGtpdCovXG4vKiBwcm92aWRlcyBib3RoIGF0dGVudWF0aW9uIGFuZCByZXZvY2F0aW9uLCBzaW5jZSB3ZSBjYW4gaGF2ZSBib3RoIGZvciB0aGUqL1xuLyogcHJpY2Ugb2YganVzdCBvbmUgbGV2ZWwgb2YgaW5kaXJlY3Rpb24uIEJ1dCBpZiB5b3UgZG9uJ3QgbmVlZCByZXZvY2F0aW9uLCovXG4vKiB0aGUgcmV2b2NhYmxlIGtpdCBoYXMgbW9yZSBBUEkgY29tcGxleGl0eSB0aGFuIHlvdSBuZWVkLiovXG4vKiovXG4vKiBXZSBjb3VsZCBoYXZlIGJ1aWx0IGBwcmVwYXJlQXR0ZW51YXRvck1ha2VyYCBhcyBhIHRyaXZpYWwgd3JhcHBlciBhcm91bmQqL1xuLyogYHByZXBhcmVSZXZvY2FibGVNYWtlcktpdGAuIEJ1dCB0aGVuIHdlJ2QgaGF2ZSB0aGUgd2VpcmQgYXJ0aWZhY3QgdGhhdCB0aGUqL1xuLyogYGV4dHJhTWV0aG9kc2Agd291bGQgc2VlIGEgYHsgc3RhdGUsIGZhY2V0czogeyByZXZvY2FibGUsIHJldm9rZXIgfX1gIGNvbnRleHQqL1xuLyogcmF0aGVyIHRoYW4gYSBgeyBzdGF0ZSwgc2VsZiB9YCBjb250ZXh0LiBTbyBpbnN0ZWFkLCB3ZSBjb3BpZWQgYW5kIGVkaXRlZCBpdCovXG4vKiBkb3duLiBQbGVhc2UgY28tbWFpbnRhaW4gdGhlc2UgdHdvIG1vZHVsZXMuKi9cblxuLyogQmVjYXVzZSB0aGUgYXR0ZW51YXRvciBqdXN0IHVzZXMgYW4gZXhvIGNsYXNzIHJhdGhlciB0aGFuIGEgY2xhc3Mga2l0LCovXG4vKiBpdCBjYW5ub3Qgc3VwcG9ydCB0aGUgcHJpdmlsZWdlIHNlcGFyYXRpb24gb2YgYSBkaXN0aW5jdCByZXZva2VyIGZhY2V0LiovXG4vKiBCdXQgaXQgY2FuIHN0aWxsIHN1cHBvcnQgYHNlbGZSZXZva2VgIGFzIGEgc2VwYXJhdGUgYGV4dHJhTWV0aG9kYCwgYXMgc2hvd24qL1xuLyogaW4gYSB0ZXN0Y2FzZSBhdCBgcHJlcGFyZS1hdHRlbnVhdG9yLnRlc3QuanNgKi9cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gd3JhcHBlcktpbmROYW1lXG4gKiBAcGFyYW0ge1Byb3BlcnR5S2V5W119IHVNZXRob2ROYW1lc1xuICogQHBhcmFtIHtSZWNvcmQ8UHJvcGVydHlLZXksICguLi5hcmdzOiBhbnlbXSkgPT4gYW55Pn0gW2V4dHJhTWV0aG9kc11cbiAqL1xuICAgICAgIGNvbnN0IHdyYXBwZXJNZXRob2RzID0gKFxuICB3cmFwcGVyS2luZE5hbWUsXG4gIHVNZXRob2ROYW1lcyxcbiAgZXh0cmFNZXRob2RzID0ge30sXG4pID0+XG4gIGhhcmRlbih7XG4gICAgLi4uZnJvbVVuaXF1ZUVudHJpZXMoXG4gICAgICB1TWV0aG9kTmFtZXMubWFwKG5hbWUgPT4gW1xuICAgICAgICBuYW1lLFxuICAgICAgICB7XG4gICAgICAgICAgLyogVXNlIGNvbmNpc2UgbWV0aG9kIHN5bnRheCBmb3IgZXhvIG1ldGhvZHMqL1xuICAgICAgICAgIFtuYW1lXSguLi5hcmdzKSB7XG4gICAgICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5vcm1hbCBleG8tdGhpcyB0eXBpbmcgY29uZnVzaW9uKi9cbiAgICAgICAgICAgIGNvbnN0IHsgdW5kZXJseWluZyB9ID0gdGhpcy5zdGF0ZTtcblxuICAgICAgICAgICAgLyogQmVjYXVzZSBhdHRlbnVhdG9ycyBzdGlsbCBzdXBwb3J0IHNvbWVvbmUgYWRkaW5nIGBzZWxmUmV2b2tlYCovXG4gICAgICAgICAgICAvKiBhcyBhbiBgZXh0cmFNZXRob2RgLCB0aGlzIHRlc3QgaXMgc3RpbGwgdXNlZnVsLiBTZWUgdGhlKi9cbiAgICAgICAgICAgIC8qIHRlc3RjYXNlIGluIGBwcmVwYXJlLWF0dGVudWF0b3IudGVzdC5qc2AuKi9cbiAgICAgICAgICAgIHVuZGVybHlpbmcgIT09IHVuZGVmaW5lZCB8fCBGYWlsYCR7cSh3cmFwcGVyS2luZE5hbWUpfSByZXZva2VkYDtcblxuICAgICAgICAgICAgcmV0dXJuIHVuZGVybHlpbmdbbmFtZV0oLi4uYXJncyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgdXNpbmcgcG9zc2libGUgc3ltYm9sIGFzIGluZGV4IHR5cGUqL1xuICAgICAgICB9W25hbWVdLFxuICAgICAgXSksXG4gICAgKSxcbiAgICAuLi5leHRyYU1ldGhvZHMsXG4gIH0pOyRozY9fb25jZS53cmFwcGVyTWV0aG9kcyh3cmFwcGVyTWV0aG9kcyk7XG5oYXJkZW4od3JhcHBlck1ldGhvZHMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbVT1hbnldXG4gKiBAY2FsbGJhY2sgTWFrZUF0dGVudWF0b3JcbiAqIEBwYXJhbSB7VX0gdW5kZXJseWluZ1xuICogQHJldHVybnMge1BhcnRpYWw8VT59XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgW1U9YW55XVxuICogQHR5cGVkZWYge29iamVjdH0gQXR0ZW51YXRvclRoaXNcbiAqIEBwcm9wZXJ0eSB7UGFydGlhbDxVPn0gc2VsZlxuICogQHByb3BlcnR5IHt7IHVuZGVybHlpbmc6IFUgfX0gc3RhdGVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbVT1hbnldXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBdHRlbnVhdG9yT3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFt1SW50ZXJmYWNlTmFtZV1cbiAqICAgVGhlIGBpbnRlcmZhY2VOYW1lYCBvZiB0aGUgdW5kZXJseWluZyBpbnRlcmZhY2UgZ3VhcmQuXG4gKiAgIERlZmF1bHRzIHRvIHRoZSBgdUtpbmROYW1lYC5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPFxuICogICBQcm9wZXJ0eUtleSxcbiAqICAgTWV0aG9kR3VhcmRcbiAqID59IFtleHRyYU1ldGhvZEd1YXJkc11cbiAqIEZvciBndWFyZGluZyB0aGUgYGV4dHJhTWV0aG9kc2AsIGlmIHlvdSBpbmNsdWRlIHRoZW0gYmVsb3cuIFRoZXNlIGFwcGVhclxuICogb25seSBvbiB0aGUgc3ludGhlc2l6ZWQgaW50ZXJmYWNlIGd1YXJkIGZvciB0aGUgYXR0ZW51YXRvciwgYW5kXG4gKiBkbyBub3QgbmVjZXNzYXJpbHkgY29ycmVzcG9uZCB0byBhbnkgbWV0aG9kIG9mIHRoZSB1bmRlcmx5aW5nLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8XG4gKiAgIFByb3BlcnR5S2V5LFxuICogICAodGhpczogQXR0ZW51YXRvclRoaXM8VT4sIC4uLmFyZ3M6IGFueVtdKSA9PiBhbnlcbiAqID59IFtleHRyYU1ldGhvZHNdXG4gKiBFeHRyYSBtZXRob2RzIGFkZGluZyBiZWhhdmlvciBvbmx5IHRvIHRoZSBhdHRlbnVhdG9yLCBhbmRcbiAqIGRvIG5vdCBuZWNlc3NhcmlseSBjb3JyZXNwb25kIHRvIGFueSBtZXRob2RzIG9mIHRoZSB1bmRlcmx5aW5nLlxuICovXG5cbi8qKlxuICogTWFrZSBhbiBleG8gY2xhc3MgZm9yIHdyYXBwaW5nIGFuIHVuZGVybHlpbmcgZXhvIGNsYXNzLFxuICogd2hlcmUgdGhlIHdyYXBwZXIgaXMgYW4gYXR0ZW51YXRvciBvZiB0aGUgdW5kZXJseWluZy5cbiAqXG4gKiBAdGVtcGxhdGUgW1U9YW55XVxuICogQHBhcmFtIHtab25lfSB6b25lXG4gKiBAcGFyYW0ge3N0cmluZ30gdUtpbmROYW1lXG4gKiAgIFRoZSBga2luZE5hbWVgIG9mIHRoZSB1bmRlcmx5aW5nIGV4byBjbGFzc1xuICogQHBhcmFtIHsoa2V5b2YgVSlbXX0gdU1ldGhvZE5hbWVzXG4gKiAgIFRoZSBtZXRob2QgbmFtZXMgb2YgdGhlIHVuZGVybHlpbmcgZXhvIGNsYXNzIHRoYXQgc2hvdWxkIGJlIHJlcHJlc2VudGVkXG4gKiAgIGJ5IHRyYW5zcGFyZW50bHktZm9yd2FyZGluZyBtZXRob2RzIG9mIHRoZSBhdHRlbnVhdG9yLlxuICogQHBhcmFtIHtBdHRlbnVhdG9yT3B0aW9uczxVPn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7TWFrZUF0dGVudWF0b3J9XG4gKi9cbiAgICAgICBjb25zdCBwcmVwYXJlQXR0ZW51YXRvck1ha2VyID0gKFxuICB6b25lLFxuICB1S2luZE5hbWUsXG4gIHVNZXRob2ROYW1lcyxcbiAgb3B0aW9ucyA9IHt9LFxuKSA9PiB7XG4gIGNvbnN0IHtcbiAgICB1SW50ZXJmYWNlTmFtZSA9IHVLaW5kTmFtZSxcbiAgICBleHRyYU1ldGhvZEd1YXJkcyA9IHt9LFxuICAgIGV4dHJhTWV0aG9kcyA9IHt9LFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgQXR0ZW51YXRvckkgPSBNLmludGVyZmFjZShcbiAgICBgJHt1SW50ZXJmYWNlTmFtZX1fYXR0ZW51YXRvcmAsXG4gICAgZXh0cmFNZXRob2RHdWFyZHMsXG4gICAgeyBkZWZhdWx0R3VhcmRzOiAncmF3JyB9LFxuICApO1xuXG4gIGNvbnN0IGF0dGVudWF0b3JLaW5kTmFtZSA9IGAke3VLaW5kTmFtZX1fYXR0ZW51YXRvcmA7XG5cbiAgcmV0dXJuIHpvbmUuZXhvQ2xhc3MoXG4gICAgYXR0ZW51YXRvcktpbmROYW1lLFxuICAgIEF0dGVudWF0b3JJLFxuICAgIHVuZGVybHlpbmcgPT4gKHsgdW5kZXJseWluZyB9KSxcbiAgICB3cmFwcGVyTWV0aG9kcyhhdHRlbnVhdG9yS2luZE5hbWUsIHVNZXRob2ROYW1lcywgZXh0cmFNZXRob2RzKSxcbiAgICB7XG4gICAgICBzdGF0ZVNoYXBlOiB7IHVuZGVybHlpbmc6IE0ub3B0KE0ucmVtb3RhYmxlKCd1bmRlcmx5aW5nJykpIH0sXG4gICAgfSxcbiAgKTtcbn07JGjNj19vbmNlLnByZXBhcmVBdHRlbnVhdG9yTWFrZXIocHJlcGFyZUF0dGVudWF0b3JNYWtlcik7XG5oYXJkZW4ocHJlcGFyZUF0dGVudWF0b3JNYWtlcik7XG5cbi8qIGNmLiBodHRwczovL2VuZG9qcy5naXRodWIuaW8vZW5kby9mdW5jdGlvbnMvX2VuZG9fcGFzc19zdHlsZS5SZW1vdGFibGUuaHRtbCovXG5jb25zdCBSZW1vdGFibGVQcmVmaXhSRSA9IC9eKEFsbGVnZWQ6IHxEZWJ1Z05hbWU6ICkvO1xuXG4vKipcbiAqIEEgY29udmVuaWVuY2UgYWJvdmUgYHByZXBhcmVBdHRlbnVhdG9yTWFrZXJgIGZvciBkb2luZyBhIHNpbmdsZXRvblxuICogZXBoZW1lcmFsIGF0dGVudWF0b3IsIGkuZS4sIGEgbmV3IGF0dGVudWF0b3IgaW5zdGFuY2UgKGFuZCBoaWRkZW4gY2xhc3MpXG4gKiB0aGF0IGlzIGFsbG9jYXRlZCBpbiB0aGUgaGVhcCB6b25lLCBhbmQgdGhlcmVmb3JlIGVwaGVtZXJhbC4gVGhlIHVuZGVybHlpbmdcbiAqIGNhbiBiZSBkdXJhYmxlIG9yIG5vdCwgd2l0aCBubyBjb25mbGljdCB3aXRoIHRoZSBhdHRlbnVhdG9yIGJlaW5nXG4gKiBlcGhlbWVyYWwuIFRoZSBwcmljZSBvZiB0aGlzIGNvbnZlbmllbmNlIGlzIHRoZSBhbGxvY2F0aW9uIG9mIHRoZSBoaWRkZW5cbiAqIGNsYXNzIGFuZCB3cmFwcGVyIG1ldGhvZHMgcGVyIGBhdHRlbnVhdGVPbmVgIGNhbGwsIGkuZS4sIHBlciBhdHRlbnVhdG9yXG4gKiBpbnN0YW5jZS5cbiAqXG4gKiBAdGVtcGxhdGUge2FueX0gVVxuICogQHBhcmFtIHtVfSB1bmRlcmx5aW5nXG4gKiBAcGFyYW0geyhrZXlvZiBVKVtdfSB1TWV0aG9kTmFtZXNcbiAqIEBwYXJhbSB7QXR0ZW51YXRvck9wdGlvbnM8VT59IFtvcHRpb25zXVxuICogQHJldHVybnMge1BhcnRpYWw8VT59XG4gKi9cbiAgICAgICBjb25zdCBhdHRlbnVhdGVPbmUgPSAodW5kZXJseWluZywgdU1ldGhvZE5hbWVzLCBvcHRpb25zID0gdW5kZWZpbmVkKSA9PiB7XG4gIGNvbnN0IGhlYXBab25lID0gbWFrZUhlYXBab25lKCk7XG4gIGNvbnN0IHVLaW5kTmFtZSA9ICh1bmRlcmx5aW5nW1N5bWJvbC50b1N0cmluZ1RhZ10gfHwgJ1VuZGVybHlpbmcnKS5yZXBsYWNlKFxuICAgIFJlbW90YWJsZVByZWZpeFJFLFxuICAgICcnLFxuICApO1xuICBjb25zdCBtYWtlQXR0ZW51YXRvciA9IHByZXBhcmVBdHRlbnVhdG9yTWFrZXIoXG4gICAgaGVhcFpvbmUsXG4gICAgdUtpbmROYW1lLFxuICAgIHVNZXRob2ROYW1lcyxcbiAgICBvcHRpb25zLFxuICApO1xuICByZXR1cm4gbWFrZUF0dGVudWF0b3IodW5kZXJseWluZyk7XG59OyRozY9fb25jZS5hdHRlbnVhdGVPbmUoYXR0ZW51YXRlT25lKTtcbmhhcmRlbihhdHRlbnVhdGVPbmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsid3JhcHBlck1ldGhvZHMiOlsid3JhcHBlck1ldGhvZHMiXSwicHJlcGFyZUF0dGVudWF0b3JNYWtlciI6WyJwcmVwYXJlQXR0ZW51YXRvck1ha2VyIl0sImF0dGVudWF0ZU9uZSI6WyJhdHRlbnVhdGVPbmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAHds9iHIUAAByFAAAMQAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvcHJlcGFyZS1yZXZvY2FibGUuanN7ImltcG9ydHMiOlsiQGVuZG8vcGF0dGVybnMiLCIuL3ByZXBhcmUtYXR0ZW51YXRvci5qcyJdLCJleHBvcnRzIjpbInByZXBhcmVSZXZvY2FibGVNYWtlcktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IE0sd3JhcHBlck1ldGhvZHM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXSxbXCIuL3ByZXBhcmUtYXR0ZW51YXRvci5qc1wiLCBbW1wid3JhcHBlck1ldGhvZHNcIixbJGjNj19hID0+ICh3cmFwcGVyTWV0aG9kcyA9ICRozY9fYSldXV1dXSk7XG5cblxuLyoqXG4gKiBAaW1wb3J0IHtBbXBsaWZ5fSBmcm9tICdAZW5kby9leG8nO1xuICogQGltcG9ydCB7TWV0aG9kR3VhcmR9IGZyb20gJ0BlbmRvL3BhdHRlcm5zJztcbiAqIEBpbXBvcnQge1pvbmV9IGZyb20gJ0BhZ29yaWMvYmFzZS16b25lJztcbiAqL1xuXG4vKiBUaGlzIHJldm9jYWJsZSBraXQgaW1wbGVtZW50YXRpb24gcHJvdmlkZXMgZm9yIGJvdGggYXR0ZW51YXRpb24gYW5kKi9cbi8qIHJldm9jYXRpb24sIHNpbmNlIGJvdGggY2FuIGJlIHByb3ZpZGVkIGF0IHRoZSBjb3N0IG9mIG9uZSBsZXZlbCBvZiovXG4vKiBpbmRpcmVjdGlvbi4gQnV0IGlmIHlvdSBqdXN0IG5lZWQgYXR0ZW51YXRpb24gd2l0aG91dCByZXZvY2F0aW9uLCBiZXR0ZXIgdG8qL1xuLyogdXNlIHRoZSBhdHRlbnVhdG9yIGltcGxlbWVudGF0aW9uIGluIHByZXBhcmUtYXR0ZW51YXRvci5qcy4qL1xuLyogUGxlYXNlIGNvLW1haW50YWluIHRoZXNlIHR3byBtb2R1bGVzLiovXG5cbi8qKlxuICogQHRlbXBsYXRlIFtVPWFueV1cbiAqIEBjYWxsYmFjayBNYWtlUmV2b2NhYmxlXG4gKiBAcGFyYW0ge1V9IHVuZGVybHlpbmdcbiAqIEByZXR1cm5zIHtQYXJ0aWFsPFU+fVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFtVPWFueV1cbiAqIEBjYWxsYmFjayBNYWtlUmV2b2NhYmxlS2l0XG4gKiBAcGFyYW0ge1V9IHVuZGVybHlpbmdcbiAqIEByZXR1cm5zIHtSZXZvY2FibGVLaXQ8VT59XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgW1U9YW55XVxuICogQHR5cGVkZWYge29iamVjdH0gUmV2b2NhYmxlTWFrZXJLaXRcbiAqIEBwcm9wZXJ0eSB7KHJldm9jYWJsZTogVSkgPT4gYm9vbGVhbn0gcmV2b2tlXG4gKiBAcHJvcGVydHkge01ha2VSZXZvY2FibGU8VT59IG1ha2VSZXZvY2FibGVcbiAqICAgRm9yd2FyZHMgdG8gdGhlIHVuZGVybHlpbmcgZXhvIG9iamVjdCwgdW50aWwgcmV2b2tlZFxuICogQHByb3BlcnR5IHtNYWtlUmV2b2NhYmxlS2l0PFU+fSBtYWtlUmV2b2NhYmxlS2l0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBSZXZva2VyRmFjZXRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gYm9vbGVhbn0gcmV2b2tlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgW1U9YW55XVxuICogQHR5cGVkZWYge29iamVjdH0gUmV2b2NhYmxlS2l0XG4gKiBAcHJvcGVydHkge1Jldm9rZXJGYWNldH0gcmV2b2tlclxuICogQHByb3BlcnR5IHtQYXJ0aWFsPFU+fSByZXZvY2FibGVcbiAqICAgRm9yd2FyZHMgdG8gdGhlIHVuZGVybHlpbmcgZXhvIG9iamVjdCwgdW50aWwgcmV2b2tlZFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFtVPWFueV1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJldm9jYWJsZUtpdFRoaXNcbiAqIEBwcm9wZXJ0eSB7UmV2b2NhYmxlS2l0PFU+fSBmYWNldHNcbiAqIEBwcm9wZXJ0eSB7eyB1bmRlcmx5aW5nOiBVIH19IHN0YXRlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgW1U9YW55XVxuICogQHR5cGVkZWYge29iamVjdH0gUmV2b2NhYmxlS2l0T3B0aW9uc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFt1SW50ZXJmYWNlTmFtZV1cbiAqICAgVGhlIGBpbnRlcmZhY2VOYW1lYCBvZiB0aGUgdW5kZXJseWluZyBpbnRlcmZhY2UgZ3VhcmQuXG4gKiAgIERlZmF1bHRzIHRvIHRoZSBgdUtpbmROYW1lYC5cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPFxuICogICBQcm9wZXJ0eUtleSxcbiAqICAgTWV0aG9kR3VhcmRcbiAqID59IFtleHRyYU1ldGhvZEd1YXJkc11cbiAqIEZvciBndWFyZGluZyB0aGUgYGV4dHJhTWV0aG9kc2AsIGlmIHlvdSBpbmNsdWRlIHRoZW0gYmVsb3cuIFRoZXNlIGFwcGVhclxuICogb25seSBvbiB0aGUgc3ludGhlc2l6ZWQgaW50ZXJmYWNlIGd1YXJkIGZvciB0aGUgcmV2b2NhYmxlIGNhcmV0YWtlciwgYW5kXG4gKiBkbyBub3QgbmVjZXNzYXJpbHkgY29ycmVzcG9uZCB0byBhbnkgbWV0aG9kIG9mIHRoZSB1bmRlcmx5aW5nLlxuICogQHByb3BlcnR5IHtSZWNvcmQ8XG4gKiAgIFByb3BlcnR5S2V5LFxuICogICAodGhpczogUmV2b2NhYmxlS2l0VGhpczxVPiwgLi4uYXJnczogYW55W10pID0+IGFueVxuICogPn0gW2V4dHJhTWV0aG9kc11cbiAqIEV4dHJhIG1ldGhvZHMgYWRkaW5nIGJlaGF2aW9yIG9ubHkgdG8gdGhlIHJldm9jYWJsZSBjYXJldGFrZXIsIGFuZFxuICogZG8gbm90IG5lY2Vzc2FyaWx5IGNvcnJlc3BvbmQgdG8gYW55IG1ldGhvZHMgb2YgdGhlIHVuZGVybHlpbmcuXG4gKi9cblxuLyoqXG4gKiBNYWtlIGFuIGV4byBjbGFzcyBraXQgZm9yIHdyYXBwaW5nIGFuIHVuZGVybHlpbmcgZXhvIGNsYXNzLFxuICogd2hlcmUgdGhlIHdyYXBwZXIgaXMgYSByZXZvY2FibGUgZm9yd2FyZGVyLlxuICpcbiAqIEB0ZW1wbGF0ZSBbVT1hbnldXG4gKiBAcGFyYW0ge1pvbmV9IHpvbmVcbiAqIEBwYXJhbSB7c3RyaW5nfSB1S2luZE5hbWVcbiAqICAgVGhlIGBraW5kTmFtZWAgb2YgdGhlIHVuZGVybHlpbmcgZXhvIGNsYXNzXG4gKiBAcGFyYW0ge1Byb3BlcnR5S2V5W119IHVNZXRob2ROYW1lc1xuICogICBUaGUgbWV0aG9kIG5hbWVzIG9mIHRoZSB1bmRlcmx5aW5nIGV4byBjbGFzcyB0aGF0IHNob3VsZCBiZSByZXByZXNlbnRlZFxuICogICBieSB0cmFuc3BhcmVudGx5LWZvcndhcmRpbmcgbWV0aG9kcyBvZiB0aGUgcmV2b2NhYmxlIGNhcmV0YWtlci5cbiAqIEBwYXJhbSB7UmV2b2NhYmxlS2l0T3B0aW9uczxVPn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7UmV2b2NhYmxlTWFrZXJLaXQ8VT59XG4gKi9cbiAgICAgICBjb25zdCBwcmVwYXJlUmV2b2NhYmxlTWFrZXJLaXQgPSAoXG4gIHpvbmUsXG4gIHVLaW5kTmFtZSxcbiAgdU1ldGhvZE5hbWVzLFxuICBvcHRpb25zID0ge30sXG4pID0+IHtcbiAgY29uc3Qge1xuICAgIHVJbnRlcmZhY2VOYW1lID0gdUtpbmROYW1lLFxuICAgIGV4dHJhTWV0aG9kR3VhcmRzID0ge30sXG4gICAgZXh0cmFNZXRob2RzID0ge30sXG4gIH0gPSBvcHRpb25zO1xuICBjb25zdCBSZXZvY2FibGVJS2l0ID0gaGFyZGVuKHtcbiAgICByZXZva2VyOiBNLmludGVyZmFjZShgJHt1SW50ZXJmYWNlTmFtZX1fcmV2b2tlcmAsIHtcbiAgICAgIHJldm9rZTogTS5jYWxsKCkucmV0dXJucyhNLmJvb2xlYW4oKSksXG4gICAgfSksXG4gICAgcmV2b2NhYmxlOiBNLmludGVyZmFjZShgJHt1SW50ZXJmYWNlTmFtZX1fcmV2b2NhYmxlYCwgZXh0cmFNZXRob2RHdWFyZHMsIHtcbiAgICAgIGRlZmF1bHRHdWFyZHM6ICdyYXcnLFxuICAgIH0pLFxuICB9KTtcblxuICBjb25zdCByZXZvY2FibGVLaW5kTmFtZSA9IGAke3VLaW5kTmFtZX1fY2FyZXRha2VyYDtcblxuICAvKiogQHR5cGUge0FtcGxpZnk8YW55Pn0gKi9cbiAgbGV0IGFtcGxpZmllcjtcblxuICBjb25zdCBtYWtlUmV2b2NhYmxlS2l0ID0gem9uZS5leG9DbGFzc0tpdChcbiAgICByZXZvY2FibGVLaW5kTmFtZSxcbiAgICBSZXZvY2FibGVJS2l0LFxuICAgIHVuZGVybHlpbmcgPT4gKHsgdW5kZXJseWluZyB9KSxcbiAgICB7XG4gICAgICByZXZva2VyOiB7XG4gICAgICAgIHJldm9rZSgpIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXRlIH0gPSB0aGlzO1xuICAgICAgICAgIGlmIChzdGF0ZS51bmRlcmx5aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG4gICAgICAgICAgc3RhdGUudW5kZXJseWluZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICByZXZvY2FibGU6IHdyYXBwZXJNZXRob2RzKHJldm9jYWJsZUtpbmROYW1lLCB1TWV0aG9kTmFtZXMsIGV4dHJhTWV0aG9kcyksXG4gICAgfSxcbiAgICB7XG4gICAgICBzdGF0ZVNoYXBlOiB7IHVuZGVybHlpbmc6IE0ub3B0KE0ucmVtb3RhYmxlKCd1bmRlcmx5aW5nJykpIH0sXG4gICAgICByZWNlaXZlQW1wbGlmaWVyOiBhbXAgPT4ge1xuICAgICAgICBhbXBsaWZpZXIgPSBhbXA7XG4gICAgICB9LFxuICAgIH0sXG4gICk7XG5cbiAgLyoqXG4gKiBAdHlwZSB7TWFrZVJldm9jYWJsZX1cbiAqL1xuICBjb25zdCBtYWtlUmV2b2NhYmxlID0gdW5kZXJseWluZyA9PiBtYWtlUmV2b2NhYmxlS2l0KHVuZGVybHlpbmcpLnJldm9jYWJsZTtcblxuICAvKipcbiAqIEBwYXJhbSB7VX0gcmV2b2NhYmxlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICBjb25zdCByZXZva2UgPSByZXZvY2FibGUgPT4ge1xuICAgIC8qKiBAdHlwZSB7UmV2b2NhYmxlS2l0PFU+fSAqL1xuICAgIGNvbnN0IGZhY2V0cyA9IGFtcGxpZmllcihyZXZvY2FibGUpO1xuICAgIGlmIChmYWNldHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gZmFjZXRzLnJldm9rZXIucmV2b2tlKCk7XG4gIH07XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgcmV2b2tlLFxuICAgIG1ha2VSZXZvY2FibGUsXG4gICAgLyoqIEB0eXBlIHtNYWtlUmV2b2NhYmxlS2l0fSAqL1xuICAgIG1ha2VSZXZvY2FibGVLaXQsXG4gIH0pO1xufTskaM2PX29uY2UucHJlcGFyZVJldm9jYWJsZU1ha2VyS2l0KHByZXBhcmVSZXZvY2FibGVNYWtlcktpdCk7XG5oYXJkZW4ocHJlcGFyZVJldm9jYWJsZU1ha2VyS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InByZXBhcmVSZXZvY2FibGVNYWtlcktpdCI6WyJwcmVwYXJlUmV2b2NhYmxlTWFrZXJLaXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAYL/aGKsNAACrDQAALQAAAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvd2F0Y2gtcHJvbWlzZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9wYXR0ZXJucyIsIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbIlByb21pc2VXYXRjaGVyRnVsZmlsbGVkSSIsIlByb21pc2VXYXRjaGVySGFuZGxlciIsIlByb21pc2VXYXRjaGVySSIsIlByb21pc2VXYXRjaGVyUmVqZWN0ZWRJIiwid2F0Y2hQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxNLEU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbmNvbnN0IHsgYXBwbHkgfSA9IFJlZmxlY3Q7XG5cbi8qKlxuICogQSBQcm9taXNlV2F0Y2hlciBtZXRob2QgZ3VhcmQgY2FsbGFibGUgd2l0aCBvciBtb3JlIGFyZ3VtZW50cywgcmV0dXJuaW5nIHZvaWQuXG4gKi9cbiAgICAgICBjb25zdCBQcm9taXNlV2F0Y2hlckhhbmRsZXIgPSBNLmNhbGwoTS5yYXcoKSkucmVzdChNLnJhdygpKS5yZXR1cm5zKCk7XG5cbi8qKlxuICogQSBQcm9taXNlV2F0Y2hlciBpbnRlcmZhY2UgdGhhdCBoYXMgYm90aCBvbkZ1bGZpbGxlZCBhbmQgb25SZWplY3RlZCBoYW5kbGVycy5cbiAqLyRozY9fb25jZS5Qcm9taXNlV2F0Y2hlckhhbmRsZXIoUHJvbWlzZVdhdGNoZXJIYW5kbGVyKTtcbiAgICAgICBjb25zdCBQcm9taXNlV2F0Y2hlckkgPSBNLmludGVyZmFjZSgnUHJvbWlzZVdhdGNoZXInLCB7XG4gIG9uRnVsZmlsbGVkOiBQcm9taXNlV2F0Y2hlckhhbmRsZXIsXG4gIG9uUmVqZWN0ZWQ6IFByb21pc2VXYXRjaGVySGFuZGxlcixcbn0pO1xuXG4vKipcbiAqIEEgUHJvbWlzZVdhdGNoZXIgaW50ZXJmYWNlIHRoYXQgaGFzIG9ubHkgYW4gb25GdWxmaWxsZWQgaGFuZGxlci5cbiAqLyRozY9fb25jZS5Qcm9taXNlV2F0Y2hlckkoUHJvbWlzZVdhdGNoZXJJKTtcbiAgICAgICBjb25zdCBQcm9taXNlV2F0Y2hlckZ1bGZpbGxlZEkgPSBNLmludGVyZmFjZSgnUHJvbWlzZVdhdGNoZXJGdWxmaWxsZWQnLCB7XG4gIG9uRnVsZmlsbGVkOiBQcm9taXNlV2F0Y2hlckhhbmRsZXIsXG59KTtcblxuLyoqXG4gKiBBIFByb21pc2VXYXRjaGVyIGludGVyZmFjZSB0aGF0IGhhcyBvbmx5IGFuIG9uUmVqZWN0ZWQgaGFuZGxlci5cbiAqLyRozY9fb25jZS5Qcm9taXNlV2F0Y2hlckZ1bGZpbGxlZEkoUHJvbWlzZVdhdGNoZXJGdWxmaWxsZWRJKTtcbiAgICAgICBjb25zdCBQcm9taXNlV2F0Y2hlclJlamVjdGVkSSA9IE0uaW50ZXJmYWNlKCdQcm9taXNlV2F0Y2hlclJlamVjdGVkJywge1xuICBvblJlamVjdGVkOiBQcm9taXNlV2F0Y2hlckhhbmRsZXIsXG59KTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQcm9taXNlV2F0Y2hlclxuICogQHByb3BlcnR5IHsoZnVsZmlsbWVudDogdW5rbm93biwgLi4uYXJnczogdW5rbm93bltdKSA9PiB2b2lkfSBbb25GdWxmaWxsZWRdXG4gKiBAcHJvcGVydHkgeyhyZWFzb246IHVua25vd24sIC4uLmFyZ3M6IHVua25vd25bXSkgPT4gdm9pZH0gW29uUmVqZWN0ZWRdXG4gKi9cblxuLyoqXG4gKiBBZGFwdCBhIHByb21pc2Ugd2F0Y2hlciBtZXRob2QgdG8gRS53aGVuLlxuICogQHBhcmFtIHtSZWNvcmQ8UHJvcGVydHlLZXksICguLi5hcmdzOiB1bmtub3duW10pID0+IHVua25vd24+fSB0aGF0XG4gKiBAcGFyYW0ge1Byb3BlcnR5S2V5fSBwcm9wXG4gKiBAcGFyYW0ge3Vua25vd25bXX0gcG9zdEFyZ3NcbiAqLyRozY9fb25jZS5Qcm9taXNlV2F0Y2hlclJlamVjdGVkSShQcm9taXNlV2F0Y2hlclJlamVjdGVkSSk7XG5jb25zdCBjYWxsTWVNYXliZSA9ICh0aGF0LCBwcm9wLCBwb3N0QXJncykgPT4ge1xuICBjb25zdCBmbiA9IHRoYXRbcHJvcF07XG4gIGlmICghZm4pIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGFzc2VydC50eXBlb2YoZm4sICdmdW5jdGlvbicpO1xuICAvKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gYXJnIHZhbHVlIG9yIHJlYXNvblxuICovXG4gIGNvbnN0IHdyYXBwZWQgPSBhcmcgPT4ge1xuICAgIC8qIERvbid0IHJldHVybiBhIHZhbHVlLCB0byBwcmV2ZW50IEUud2hlbiBmcm9tIHN1YnNjcmliaW5nIHRvIGEgcmVzdWx0aW5nKi9cbiAgICAvKiBwcm9taXNlLiovXG4gICAgYXBwbHkoZm4sIHRoYXQsIFthcmcsIC4uLnBvc3RBcmdzXSk7XG4gIH07XG4gIHJldHVybiB3cmFwcGVkO1xufTtcblxuLyoqXG4gKiBTaGltIHRoZSBwcm9taXNlIHdhdGNoZXIgYmVoYXZpb3VyIHdoZW4gVmF0RGF0YS53YXRjaFByb21pc2UgaXMgbm90IGF2YWlsYWJsZS5cbiAqXG4gKiBAcGFyYW0ge1Byb21pc2U8YW55Pn0gcFxuICogQHBhcmFtIHtQcm9taXNlV2F0Y2hlcn0gd2F0Y2hlclxuICogQHBhcmFtIHsuLi51bmtub3dufSB3YXRjaGVyQXJnc1xuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbiAgICAgICBjb25zdCB3YXRjaFByb21pc2UgPSAocCwgd2F0Y2hlciwgLi4ud2F0Y2hlckFyZ3MpID0+IHtcbiAgUHJvbWlzZS5yZXNvbHZlKHApID09PSBwIHx8IEZhaWxgd2F0Y2hQcm9taXNlIG9ubHkgd2F0Y2hlcyBwcm9taXNlc2A7XG4gIGNvbnN0IG9uRnVsZmlsbGVkID0gY2FsbE1lTWF5YmUod2F0Y2hlciwgJ29uRnVsZmlsbGVkJywgd2F0Y2hlckFyZ3MpO1xuICBjb25zdCBvblJlamVjdGVkID0gY2FsbE1lTWF5YmUod2F0Y2hlciwgJ29uUmVqZWN0ZWQnLCB3YXRjaGVyQXJncyk7XG4gIG9uRnVsZmlsbGVkIHx8XG4gICAgb25SZWplY3RlZCB8fFxuICAgIEZhaWxgcHJvbWlzZSB3YXRjaGVyIG11c3QgaW1wbGVtZW50IGF0IGxlYXN0IG9uZSBoYW5kbGVyIG1ldGhvZGA7XG4gIHZvaWQgRS53aGVuKHAsIG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTtcbn07JGjNj19vbmNlLndhdGNoUHJvbWlzZSh3YXRjaFByb21pc2UpO1xuaGFyZGVuKHdhdGNoUHJvbWlzZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJQcm9taXNlV2F0Y2hlckhhbmRsZXIiOlsiUHJvbWlzZVdhdGNoZXJIYW5kbGVyIl0sIlByb21pc2VXYXRjaGVySSI6WyJQcm9taXNlV2F0Y2hlckkiXSwiUHJvbWlzZVdhdGNoZXJGdWxmaWxsZWRJIjpbIlByb21pc2VXYXRjaGVyRnVsZmlsbGVkSSJdLCJQcm9taXNlV2F0Y2hlclJlamVjdGVkSSI6WyJQcm9taXNlV2F0Y2hlclJlamVjdGVkSSJdLCJ3YXRjaFByb21pc2UiOlsid2F0Y2hQcm9taXNlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGwksGoWAgAAFgIAACgAAABAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvem9uZS1oZWxwZXJzLmpzeyJpbXBvcnRzIjpbIi4vc3JjL3ByZXBhcmUtcmV2b2NhYmxlLmpzIiwiLi9zcmMvcHJlcGFyZS1hdHRlbnVhdG9yLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9zcmMvcHJlcGFyZS1hdHRlbnVhdG9yLmpzIiwiLi9zcmMvcHJlcGFyZS1yZXZvY2FibGUuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvcHJlcGFyZS1yZXZvY2FibGUuanNcIiwgW11dLFtcIi4vc3JjL3ByZXBhcmUtYXR0ZW51YXRvci5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADhg52A5zwAAOc8AAAmAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2Ftb3VudE1hdGguanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvc3RvcmUiLCIuL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzIiwiLi9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qcyIsIi4vbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzIiwiLi9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJBbW91bnRNYXRoIiwiQXNzZXRLaW5kIiwiYXNzZXJ0QXNzZXRLaW5kIiwiYXNzZXJ0VmFsdWVHZXRIZWxwZXJzIiwiZ2V0QXNzZXRLaW5kIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxGYWlsLHBhc3NTdHlsZU9mLGFzc2VydFJlbW90YWJsZSxhc3NlcnRSZWNvcmQsTSxtYXRjaGVzLG5hdE1hdGhIZWxwZXJzLHNldE1hdGhIZWxwZXJzLGNvcHlTZXRNYXRoSGVscGVycyxjb3B5QmFnTWF0aEhlbHBlcnM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJhc3NlcnRSZW1vdGFibGVcIixbJGjNj19hID0+IChhc3NlcnRSZW1vdGFibGUgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UmVjb3JkXCIsWyRozY9fYSA9PiAoYXNzZXJ0UmVjb3JkID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wibWF0Y2hlc1wiLFskaM2PX2EgPT4gKG1hdGNoZXMgPSAkaM2PX2EpXV1dXSxbXCIuL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzXCIsIFtbXCJuYXRNYXRoSGVscGVyc1wiLFskaM2PX2EgPT4gKG5hdE1hdGhIZWxwZXJzID0gJGjNj19hKV1dXV0sW1wiLi9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qc1wiLCBbW1wic2V0TWF0aEhlbHBlcnNcIixbJGjNj19hID0+IChzZXRNYXRoSGVscGVycyA9ICRozY9fYSldXV1dLFtcIi4vbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzXCIsIFtbXCJjb3B5U2V0TWF0aEhlbHBlcnNcIixbJGjNj19hID0+IChjb3B5U2V0TWF0aEhlbHBlcnMgPSAkaM2PX2EpXV1dXSxbXCIuL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qc1wiLCBbW1wiY29weUJhZ01hdGhIZWxwZXJzXCIsWyRozY9fYSA9PiAoY29weUJhZ01hdGhIZWxwZXJzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0NvcHlCYWcsIENvcHlTZXR9IGZyb20gJ0BlbmRvL3BhdHRlcm5zJztcbiAqIEBpbXBvcnQge0Ftb3VudCwgQW1vdW50VmFsdWUsIEFzc2V0VmFsdWVGb3JLaW5kLCBCcmFuZCwgQ29weUJhZ0Ftb3VudCwgQ29weVNldEFtb3VudCwgTWF0aEhlbHBlcnMsIE5hdEFtb3VudCwgTmF0VmFsdWUsIFNldEFtb3VudCwgU2V0VmFsdWV9IGZyb20gJy4vdHlwZXMuanMnO1xuICovXG5cbi8qIE5COiBBc3NldEtpbmQgaXMgYm90aCBhIGNvbnN0YW50IGZvciBlbnVtZXJhdGVkIHZhbHVlcyBhbmQgYSB0eXBlIGZvciB0aG9zZSB2YWx1ZXMuKi9cbi8qKlxuICogQ29uc3RhbnRzIGZvciB0aGUga2luZHMgb2YgYXNzZXRzIHdlIHN1cHBvcnQuXG4gKlxuICogQGVudW0geyh0eXBlb2YgQXNzZXRLaW5kKVtrZXlvZiB0eXBlb2YgQXNzZXRLaW5kXX1cbiAqL1xuICAgICAgIGNvbnN0IEFzc2V0S2luZCA9IC8qKiBAdHlwZSB7Y29uc3R9ICovICh7XG4gIE5BVDogJ25hdCcsXG4gIFNFVDogJ3NldCcsXG4gIENPUFlfU0VUOiAnY29weVNldCcsXG4gIENPUFlfQkFHOiAnY29weUJhZycsXG59KTskaM2PX29uY2UuQXNzZXRLaW5kKEFzc2V0S2luZCk7XG5oYXJkZW4oQXNzZXRLaW5kKTtcbmNvbnN0IGFzc2V0S2luZE5hbWVzID0gaGFyZGVuKE9iamVjdC52YWx1ZXMoQXNzZXRLaW5kKS5zb3J0KCkpO1xuXG4vKiogQHBhcmFtIHtBc3NldEtpbmR9IGFsbGVnZWRBSyAqL1xuICAgICAgIGNvbnN0IGFzc2VydEFzc2V0S2luZCA9IGFsbGVnZWRBSyA9PiB7XG4gIGFzc2V0S2luZE5hbWVzLmluY2x1ZGVzKGFsbGVnZWRBSykgfHxcbiAgICBGYWlsYFRoZSBhc3NldEtpbmQgJHthbGxlZ2VkQUt9IG11c3QgYmUgb25lIG9mICR7cShhc3NldEtpbmROYW1lcyl9YDtcbn07JGjNj19vbmNlLmFzc2VydEFzc2V0S2luZChhc3NlcnRBc3NldEtpbmQpO1xuaGFyZGVuKGFzc2VydEFzc2V0S2luZCk7XG5cbi8qKlxuICogQW1vdW50cyBkZXNjcmliZSBkaWdpdGFsIGFzc2V0cy4gRnJvbSBhbiBhbW91bnQsIHlvdSBjYW4gbGVhcm4gdGhlIGJyYW5kIG9mXG4gKiBkaWdpdGFsIGFzc2V0IGFzIHdlbGwgYXMgXCJob3cgbXVjaFwiIG9yIFwiaG93IG1hbnlcIi4gQW1vdW50cyBoYXZlIHR3byBwYXJ0czogYVxuICogYnJhbmQgKGxvb3NlbHkgc3BlYWtpbmcsIHRoZSB0eXBlIG9mIGRpZ2l0YWwgYXNzZXQpIGFuZCB0aGUgdmFsdWUgKHRoZSBhbnN3ZXJcbiAqIHRvIFwiaG93IG11Y2hcIikuIEZvciBleGFtcGxlLCBpbiB0aGUgcGhyYXNlIFwiNSBidWNrc1wiLCBcImJ1Y2tzXCIgdGFrZXMgdGhlIHJvbGVcbiAqIG9mIHRoZSBicmFuZCBhbmQgdGhlIHZhbHVlIGlzIDUuIEFtb3VudHMgY2FuIGRlc2NyaWJlIGZ1bmdpYmxlIGFuZFxuICogbm9uLWZ1bmdpYmxlIGRpZ2l0YWwgYXNzZXRzLiBBbW91bnRzIGFyZSBwYXNzLWJ5LWNvcHkgYW5kIGNhbiBiZSBtYWRlIGJ5IGFuZFxuICogc2VudCB0byBhbnlvbmUuXG4gKlxuICogVGhlIGlzc3VlciBpcyB0aGUgYXV0aG9yaXRhdGl2ZSBzb3VyY2Ugb2YgdGhlIGFtb3VudCBpbiBwYXltZW50cyBhbmQgcHVyc2VzLlxuICogVGhlIGlzc3VlciBtdXN0IGJlIGFibGUgdG8gZG8gdGhpbmdzIHN1Y2ggYXMgYWRkIGRpZ2l0YWwgYXNzZXRzIHRvIGEgcHVyc2VcbiAqIGFuZCB3aXRoZHJhdyBkaWdpdGFsIGFzc2V0cyBmcm9tIGEgcHVyc2UuIFRvIGRvIHNvLCBpdCBtdXN0IGtub3cgaG93IHRvIGFkZFxuICogYW5kIHN1YnRyYWN0IGRpZ2l0YWwgYXNzZXRzLiBSYXRoZXIgdGhhbiBoYXJkLWNvZGluZyBhIHBhcnRpY3VsYXIgc29sdXRpb24sXG4gKiB3ZSBjaG9zZSB0byBwYXJhbWV0ZXJpemUgdGhlIGlzc3VlciB3aXRoIGEgY29sbGVjdGlvbiBvZiBwb2x5bW9ycGhpY1xuICogZnVuY3Rpb25zLCB3aGljaCB3ZSBjYWxsIGBBbW91bnRNYXRoYC4gVGhlc2UgbWF0aCBmdW5jdGlvbnMgaW5jbHVkZSBjb25jZXB0c1xuICogbGlrZSBhZGRpdGlvbiwgc3VidHJhY3Rpb24sIGFuZCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8uXG4gKlxuICogV2UgYWxzbyB3YW50IHRvIG1ha2Ugc3VyZSB0aGVyZSBpcyBubyBjb25mdXNpb24gYXMgdG8gd2hhdCBraW5kIG9mIGFzc2V0IHdlXG4gKiBhcmUgdXNpbmcuIFRodXMsIEFtb3VudE1hdGggaW5jbHVkZXMgY2hlY2tzIG9mIHRoZSBgYnJhbmRgLCB0aGUgdW5pcXVlXG4gKiBpZGVudGlmaWVyIGZvciB0aGUgdHlwZSBvZiBkaWdpdGFsIGFzc2V0LiBJZiB0aGUgd3JvbmcgYnJhbmQgaXMgdXNlZCBpblxuICogQW1vdW50TWF0aCwgYW4gZXJyb3IgaXMgdGhyb3duIGFuZCB0aGUgb3BlcmF0aW9uIGRvZXMgbm90IHN1Y2NlZWQuXG4gKlxuICogQW1vdW50TWF0aCB1c2VzIG1hdGhIZWxwZXJzIHRvIGRvIG1vc3Qgb2YgdGhlIHdvcmssIGJ1dCB0aGVuIGFkZHMgdGhlIGJyYW5kXG4gKiB0byB0aGUgcmVzdWx0LiBUaGUgZnVuY3Rpb24gYHZhbHVlYCBnZXRzIHRoZSB2YWx1ZSBmcm9tIHRoZSBhbW91bnQgYnlcbiAqIHJlbW92aW5nIHRoZSBicmFuZCAoYW1vdW50IC0+IHZhbHVlKSwgYW5kIHRoZSBmdW5jdGlvbiBgbWFrZWAgYWRkcyB0aGUgYnJhbmRcbiAqIHRvIHByb2R1Y2UgYW4gYW1vdW50ICh2YWx1ZSAtPiBhbW91bnQpLiBUaGUgZnVuY3Rpb24gYGNvZXJjZWAgdGFrZXMgYW4gYW1vdW50XG4gKiBhbmQgY2hlY2tzIGl0LCByZXR1cm5pbmcgYW4gYW1vdW50IChhbW91bnQgLT4gYW1vdW50KS5cbiAqXG4gKiBFYWNoIGlzc3VlciBvZiBkaWdpdGFsIGFzc2V0cyBoYXMgYW4gYXNzb2NpYXRlZCBicmFuZCBpbiBhIG9uZS10by1vbmVcbiAqIG1hcHBpbmcuIEluIHVudHJ1c3RlZCBjb250ZXh0cywgc3VjaCBhcyBpbiBhbmFseXppbmcgcGF5bWVudHMgYW5kIGFtb3VudHMsIHdlXG4gKiBjYW4gZ2V0IHRoZSBicmFuZCBhbmQgZmluZCB0aGUgaXNzdWVyIHdoaWNoIG1hdGNoZXMgdGhlIGJyYW5kLiBUaGUgaXNzdWVyIGFuZFxuICogdGhlIGJyYW5kIG11dHVhbGx5IHZhbGlkYXRlIGVhY2ggb3RoZXIuXG4gKi9cblxuY29uc3QgaGVscGVycyA9IHtcbiAgbmF0OiBuYXRNYXRoSGVscGVycyxcbiAgc2V0OiBzZXRNYXRoSGVscGVycyxcbiAgY29weVNldDogY29weVNldE1hdGhIZWxwZXJzLFxuICBjb3B5QmFnOiBjb3B5QmFnTWF0aEhlbHBlcnMsXG59O1xuXG4vKiogQHR5cGUgeyh2YWx1ZTogdW5rbm93bikgPT4gJ25hdCcgfCAnc2V0JyB8ICdjb3B5U2V0JyB8ICdjb3B5QmFnJ30gfSAqL1xuY29uc3QgYXNzZXJ0VmFsdWVHZXRBc3NldEtpbmQgPSB2YWx1ZSA9PiB7XG4gIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHZhbHVlKTtcbiAgaWYgKHBhc3NTdHlsZSA9PT0gJ2JpZ2ludCcpIHtcbiAgICByZXR1cm4gJ25hdCc7XG4gIH1cbiAgaWYgKHBhc3NTdHlsZSA9PT0gJ2NvcHlBcnJheScpIHtcbiAgICByZXR1cm4gJ3NldCc7XG4gIH1cbiAgaWYgKG1hdGNoZXModmFsdWUsIE0uc2V0KCkpKSB7XG4gICAgcmV0dXJuICdjb3B5U2V0JztcbiAgfVxuICBpZiAobWF0Y2hlcyh2YWx1ZSwgTS5iYWcoKSkpIHtcbiAgICByZXR1cm4gJ2NvcHlCYWcnO1xuICB9XG4gIC8qIFRPRE8gVGhpcyBpc24ndCBxdWl0ZSB0aGUgcmlnaHQgZXJyb3IgbWVzc2FnZSwgaW4gY2FzZSB2YWx1ZVBhc3NTdHlsZSovXG4gIC8qIGlzICd0YWdnZWQnLiBXZSB3b3VsZCBuZWVkIHRvIGRpc3Rpbmd1aXNoIHdoYXQga2luZCBvZiB0YWdnZWQqL1xuICAvKiBvYmplY3QgaXQgaXMuKi9cbiAgLyogQWxzbywgdGhpcyBraW5kIG9mIG1hbnVhbCBsaXN0aW5nIGlzIGEgbWFpbnRlbmFuY2UgaGF6YXJkIHdlKi9cbiAgLyogKFRPRE8pIHdpbGwgZW5jb3VudGVyIHdoZW4gd2UgZXh0ZW5kIHRoZSBtYXRoIGhlbHBlcnMgZnVydGhlci4qL1xuICB0aHJvdyBGYWlsYHZhbHVlICR7dmFsdWV9IG11c3QgYmUgYSBiaWdpbnQsIGNvcHlTZXQsIGNvcHlCYWcsIG9yIGFuIGFycmF5LCBub3QgJHtxKFxuICAgIHBhc3NTdHlsZSxcbiAgKX1gO1xufTtcblxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgdmFsdWUgaXMgYSB2YWxpZCBBbW91bnRNYXRoIGFuZCByZXR1cm5zIHRoZSBhcHByb3ByaWF0ZSBoZWxwZXJzLlxuICpcbiAqIE1hZGUgYXZhaWxhYmxlIG9ubHkgZm9yIHRlc3RpbmcsIGJ1dCBpdCBpcyBoYXJtbGVzcyBmb3Igb3RoZXIgdXNlcy5cbiAqXG4gKiBAdGVtcGxhdGUge0Ftb3VudFZhbHVlfSBWXG4gKiBAcGFyYW0ge1Z9IHZhbHVlXG4gKiBAcmV0dXJucyB7TWF0aEhlbHBlcnM8Vj59XG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRWYWx1ZUdldEhlbHBlcnMgPSB2YWx1ZSA9PlxuICAvKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuICBoZWxwZXJzW2Fzc2VydFZhbHVlR2V0QXNzZXRLaW5kKHZhbHVlKV07XG5cbi8qKlxuICogQHR5cGUgeyhhbGxlZ2VkQnJhbmQ6IEJyYW5kPGFueT4sIGJyYW5kPzogQnJhbmQ8YW55PikgPT4gdm9pZH1cbiAqLyRozY9fb25jZS5hc3NlcnRWYWx1ZUdldEhlbHBlcnMoYXNzZXJ0VmFsdWVHZXRIZWxwZXJzKTtcbmNvbnN0IG9wdGlvbmFsQnJhbmRDaGVjayA9IChhbGxlZ2VkQnJhbmQsIGJyYW5kKSA9PiB7XG4gIGlmIChicmFuZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0UmVtb3RhYmxlKGJyYW5kLCAnYnJhbmQnKTtcbiAgICBhbGxlZ2VkQnJhbmQgPT09IGJyYW5kIHx8XG4gICAgICBGYWlsYGFtb3VudCdzIGJyYW5kICR7cShhbGxlZ2VkQnJhbmQpfSBkaWQgbm90IG1hdGNoIGV4cGVjdGVkIGJyYW5kICR7cShcbiAgICAgICAgYnJhbmQsXG4gICAgICApfWA7XG4gIH1cbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcmlnaHRBbW91bnRcbiAqIEBwYXJhbSB7QnJhbmQ8Sz4gfCB1bmRlZmluZWR9IGJyYW5kXG4gKiBAcmV0dXJucyB7TWF0aEhlbHBlcnM8YW55Pn1cbiAqL1xuY29uc3QgY2hlY2tMUkFuZEdldEhlbHBlcnMgPSAobGVmdEFtb3VudCwgcmlnaHRBbW91bnQsIGJyYW5kID0gdW5kZWZpbmVkKSA9PiB7XG4gIGFzc2VydFJlY29yZChsZWZ0QW1vdW50LCAnbGVmdEFtb3VudCcpO1xuICBhc3NlcnRSZWNvcmQocmlnaHRBbW91bnQsICdyaWdodEFtb3VudCcpO1xuICBjb25zdCB7IHZhbHVlOiBsZWZ0VmFsdWUsIGJyYW5kOiBsZWZ0QnJhbmQgfSA9IGxlZnRBbW91bnQ7XG4gIGNvbnN0IHsgdmFsdWU6IHJpZ2h0VmFsdWUsIGJyYW5kOiByaWdodEJyYW5kIH0gPSByaWdodEFtb3VudDtcbiAgYXNzZXJ0UmVtb3RhYmxlKGxlZnRCcmFuZCwgJ2xlZnRCcmFuZCcpO1xuICBhc3NlcnRSZW1vdGFibGUocmlnaHRCcmFuZCwgJ3JpZ2h0QnJhbmQnKTtcbiAgb3B0aW9uYWxCcmFuZENoZWNrKGxlZnRCcmFuZCwgYnJhbmQpO1xuICBvcHRpb25hbEJyYW5kQ2hlY2socmlnaHRCcmFuZCwgYnJhbmQpO1xuICBsZWZ0QnJhbmQgPT09IHJpZ2h0QnJhbmQgfHxcbiAgICBGYWlsYEJyYW5kcyBpbiBsZWZ0ICR7cShsZWZ0QnJhbmQpfSBhbmQgcmlnaHQgJHtxKFxuICAgICAgcmlnaHRCcmFuZCxcbiAgICApfSBzaG91bGQgbWF0Y2ggYnV0IGRvIG5vdGA7XG4gIGNvbnN0IGxlZnRIZWxwZXJzID0gYXNzZXJ0VmFsdWVHZXRIZWxwZXJzKGxlZnRWYWx1ZSk7XG4gIGNvbnN0IHJpZ2h0SGVscGVycyA9IGFzc2VydFZhbHVlR2V0SGVscGVycyhyaWdodFZhbHVlKTtcbiAgbGVmdEhlbHBlcnMgPT09IHJpZ2h0SGVscGVycyB8fFxuICAgIEZhaWxgVGhlIGxlZnQgJHtsZWZ0QW1vdW50fSBhbmQgcmlnaHQgYW1vdW50ICR7cmlnaHRBbW91bnR9IGhhZCBkaWZmZXJlbnQgYXNzZXRLaW5kc2A7XG4gIHJldHVybiBsZWZ0SGVscGVycztcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7TWF0aEhlbHBlcnM8QXNzZXRWYWx1ZUZvcktpbmQ8Sz4+fSBoXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHJpZ2h0QW1vdW50XG4gKiBAcmV0dXJucyB7W0Fzc2V0VmFsdWVGb3JLaW5kPEs+LCBBc3NldFZhbHVlRm9yS2luZDxLPl19XG4gKi9cbmNvbnN0IGNvZXJjZUxSID0gKGgsIGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50KSA9PiB7XG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgY291bGQgYmUgYXJiaXRyYXJ5IHN1YnR5cGUqL1xuICByZXR1cm4gW2guZG9Db2VyY2UobGVmdEFtb3VudC52YWx1ZSksIGguZG9Db2VyY2UocmlnaHRBbW91bnQudmFsdWUpXTtcbn07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBsZWZ0QW1vdW50IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgcmlnaHRBbW91bnQuXG4gKiBUaGUgbm90aW9uIG9mIFwiZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvXCIgZGVwZW5kcyBvbiB0aGUga2luZCBvZiBhbW91bnQsIGFzXG4gKiBkZWZpbmVkIGJ5IHRoZSBNYXRoSGVscGVycy4gRm9yIGV4YW1wbGUsIHdoZXRoZXIgcmVjdGFuZ2xlIEEgaXMgZ3JlYXRlciB0aGFuXG4gKiByZWN0YW5nbGUgQiBkZXBlbmRzIG9uIHdoZXRoZXIgcmVjdGFuZ2xlIEEgaW5jbHVkZXMgcmVjdGFuZ2xlIEIgYXMgZGVmaW5lZCBieVxuICogdGhlIGxvZ2ljIGluIE1hdGhIZWxwZXJzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHJpZ2h0QW1vdW50XG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBbYnJhbmRdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXNHVEUgPSAobGVmdEFtb3VudCwgcmlnaHRBbW91bnQsIGJyYW5kID0gdW5kZWZpbmVkKSA9PiB7XG4gIGNvbnN0IGggPSBjaGVja0xSQW5kR2V0SGVscGVycyhsZWZ0QW1vdW50LCByaWdodEFtb3VudCwgYnJhbmQpO1xuICByZXR1cm4gaC5kb0lzR1RFKC4uLmNvZXJjZUxSKGgsIGxlZnRBbW91bnQsIHJpZ2h0QW1vdW50KSk7XG59O1xuXG4vKipcbiAqIExvZ2ljIGZvciBtYW5pcHVsYXRpbmcgYW1vdW50cy5cbiAqXG4gKiBBbW91bnRzIGFyZSB0aGUgY2Fub25pY2FsIGRlc2NyaXB0aW9uIG9mIHRyYWRhYmxlIGdvb2RzLiBUaGV5IGFyZSBtYW5pcHVsYXRlZFxuICogYnkgaXNzdWVycyBhbmQgbWludHMsIGFuZCByZXByZXNlbnQgdGhlIGdvb2RzIGFuZCBjdXJyZW5jeSBjYXJyaWVkIGJ5IHB1cnNlc1xuICogYW5kIHBheW1lbnRzLiBUaGV5IGNhbiBiZSB1c2VkIHRvIHJlcHJlc2VudCB0aGluZ3MgbGlrZSBjdXJyZW5jeSwgc3RvY2ssIGFuZFxuICogdGhlIGFic3RyYWN0IHJpZ2h0IHRvIHBhcnRpY2lwYXRlIGluIGEgcGFydGljdWxhciBleGNoYW5nZS5cbiAqL1xuICAgICAgIGNvbnN0IEFtb3VudE1hdGggPSB7XG4gIC8qIFRPRE8gdXNlIG92ZXJsb2FkaW5nIHRvIGhhbmRsZSB3aGVuIEJyYW5kIGhhcyBhbiBBc3NldEtpbmQgYW5kIHdoZW4gaXQgZG9lc24ndC4qL1xuICAvKiBhIEFtb3VudEZvclZhbHVlIHV0aWxpdHkgY291bGQgaGVscCBEUlkgdGhvc2UgY2FzZXMuKi9cbiAgLyoqXG4gKiBNYWtlIGFuIGFtb3VudCBmcm9tIGEgdmFsdWUgYnkgYWRkaW5nIHRoZSBicmFuZC5cbiAqXG4gKiBEb2VzIG5vdCB2ZXJpZnkgdGhhdCB0aGUgQnJhbmQncyBBc3NldEtpbmQgbWF0Y2hlcyB0aGUgdmFsdWUncy5cbiAqXG4gKiBAdGVtcGxhdGUge0JyYW5kPGFueT59IEJcbiAqIEB0ZW1wbGF0ZSB7TmF0VmFsdWUgfCBDb3B5U2V0IHwgQ29weUJhZyB8IFNldFZhbHVlfSBWXG4gKiBAcGFyYW0ge0J9IGJyYW5kXG4gKiBAcGFyYW0ge1Z9IGFsbGVnZWRWYWx1ZVxuICogQHJldHVybnMge0IgZXh0ZW5kcyBCcmFuZDwnbmF0Jz5cbiAqICAgICA/IE5hdEFtb3VudFxuICogICAgIDogViBleHRlbmRzIE5hdFZhbHVlXG4gKiAgICAgICA/IE5hdEFtb3VudFxuICogICAgICAgOiBWIGV4dGVuZHMgQ29weVNldFxuICogICAgICAgICA/IENvcHlTZXRBbW91bnQ8VlsncGF5bG9hZCddWzBdPlxuICogICAgICAgICA6IFYgZXh0ZW5kcyBDb3B5QmFnXG4gKiAgICAgICAgICAgPyBDb3B5QmFnQW1vdW50PFZbJ3BheWxvYWQnXVswXVswXT5cbiAqICAgICAgICAgICA6IFYgZXh0ZW5kcyBTZXRWYWx1ZVxuICogICAgICAgICAgICAgPyBTZXRBbW91bnQ8VlswXT5cbiAqICAgICAgICAgICAgIDogbmV2ZXJ9XG4gKi9cbiAgbWFrZTogKGJyYW5kLCBhbGxlZ2VkVmFsdWUpID0+IHtcbiAgICBhc3NlcnRSZW1vdGFibGUoYnJhbmQsICdicmFuZCcpO1xuICAgIGNvbnN0IGggPSBhc3NlcnRWYWx1ZUdldEhlbHBlcnMoYWxsZWdlZFZhbHVlKTtcbiAgICBjb25zdCB2YWx1ZSA9IGguZG9Db2VyY2UoYWxsZWdlZFZhbHVlKTtcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuICAgIHJldHVybiBoYXJkZW4oeyBicmFuZCwgdmFsdWUgfSk7XG4gIH0sXG4gIC8qKlxuICogTWFrZSBzdXJlIHRoaXMgYW1vdW50IGlzIHZhbGlkIGVub3VnaCwgYW5kIHJldHVybiBhIGNvcnJlc3BvbmRpbmcgdmFsaWRcbiAqIGFtb3VudCBpZiBzby5cbiAqXG4gKiBAdGVtcGxhdGUge0Ftb3VudH0gQVxuICogQHBhcmFtIHtCcmFuZH0gYnJhbmRcbiAqIEBwYXJhbSB7QX0gYWxsZWdlZEFtb3VudFxuICogQHJldHVybnMge0F9XG4gKi9cbiAgY29lcmNlOiAoYnJhbmQsIGFsbGVnZWRBbW91bnQpID0+IHtcbiAgICBhc3NlcnRSZW1vdGFibGUoYnJhbmQsICdicmFuZCcpO1xuICAgIGFzc2VydFJlY29yZChhbGxlZ2VkQW1vdW50LCAnYW1vdW50Jyk7XG4gICAgY29uc3QgeyBicmFuZDogYWxsZWdlZEJyYW5kLCB2YWx1ZTogYWxsZWdlZFZhbHVlIH0gPSBhbGxlZ2VkQW1vdW50O1xuICAgIGJyYW5kID09PSBhbGxlZ2VkQnJhbmQgfHxcbiAgICAgIEZhaWxgVGhlIGJyYW5kIGluIHRoZSBhbGxlZ2VkQW1vdW50ICR7YWxsZWdlZEFtb3VudH0gaW4gJ2NvZXJjZScgZGlkbid0IG1hdGNoIHRoZSBzcGVjaWZpZWQgYnJhbmQgJHticmFuZH0uYDtcbiAgICAvKiBXaWxsIHRocm93IG9uIGluYXBwcm9wcmlhdGUgdmFsdWUqL1xuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG4gICAgcmV0dXJuIEFtb3VudE1hdGgubWFrZShicmFuZCwgYWxsZWdlZFZhbHVlKTtcbiAgfSxcbiAgLyoqXG4gKiBFeHRyYWN0IGFuZCByZXR1cm4gdGhlIHZhbHVlLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50fSBBXG4gKiBAcGFyYW0ge0JyYW5kfSBicmFuZFxuICogQHBhcmFtIHtBfSBhbW91bnRcbiAqIEByZXR1cm5zIHtBWyd2YWx1ZSddfVxuICovXG4gIGdldFZhbHVlOiAoYnJhbmQsIGFtb3VudCkgPT4gQW1vdW50TWF0aC5jb2VyY2UoYnJhbmQsIGFtb3VudCkudmFsdWUsXG4gIC8qKlxuICogUmV0dXJuIHRoZSBhbW91bnQgcmVwcmVzZW50aW5nIGFuIGVtcHR5IGFtb3VudC4gVGhpcyBpcyB0aGUgaWRlbnRpdHlcbiAqIGVsZW1lbnQgZm9yIE1hdGhIZWxwZXJzLmFkZCBhbmQgTWF0SGVscGVycy5zdWJ0cmFjdC5cbiAqXG4gKiBAdHlwZSB7e1xuICogICAoYnJhbmQ6IEJyYW5kKTogQW1vdW50PCduYXQnPjtcbiAqICAgPEsgZXh0ZW5kcyBBc3NldEtpbmQ+KGJyYW5kOiBCcmFuZDxLPiwgYXNzZXRLaW5kOiBLKTogQW1vdW50PEs+O1xuICogfX1cbiAqL1xuICBtYWtlRW1wdHk6IChicmFuZCwgYXNzZXRLaW5kID0gLyoqIEB0eXBlIHtjb25zdH0gKi8gKCduYXQnKSkgPT4ge1xuICAgIGFzc2VydFJlbW90YWJsZShicmFuZCwgJ2JyYW5kJyk7XG4gICAgYXNzZXJ0QXNzZXRLaW5kKGFzc2V0S2luZCk7XG4gICAgY29uc3QgdmFsdWUgPSBoZWxwZXJzW2Fzc2V0S2luZF0uZG9NYWtlRW1wdHkoKTtcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFhYWCBuYXJyb3dpbmcgZnJvbSBmdW5jdGlvbiBvdmVybG9hZCovXG4gICAgcmV0dXJuIGhhcmRlbih7IGJyYW5kLCB2YWx1ZSB9KTtcbiAgfSxcbiAgLyoqXG4gKiBSZXR1cm4gdGhlIGFtb3VudCByZXByZXNlbnRpbmcgYW4gZW1wdHkgYW1vdW50LCB1c2luZyBhbm90aGVyIGFtb3VudCBhcyB0aGVcbiAqIHRlbXBsYXRlIGZvciB0aGUgYnJhbmQgYW5kIGFzc2V0S2luZC5cbiAqXG4gKiBAdGVtcGxhdGUge0Ftb3VudH0gQVxuICogQHBhcmFtIHtBfSBhbW91bnRcbiAqIEByZXR1cm5zIHtBfVxuICovXG4gIG1ha2VFbXB0eUZyb21BbW91bnQ6IGFtb3VudCA9PiB7XG4gICAgYXNzZXJ0UmVjb3JkKGFtb3VudCwgJ2Ftb3VudCcpO1xuICAgIGNvbnN0IHsgYnJhbmQsIHZhbHVlIH0gPSBhbW91bnQ7XG4gICAgY29uc3QgYXNzZXRLaW5kID0gYXNzZXJ0VmFsdWVHZXRBc3NldEtpbmQodmFsdWUpO1xuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgZGlmZmVyZW50IHN1YnR5cGUqL1xuICAgIHJldHVybiBBbW91bnRNYXRoLm1ha2VFbXB0eShicmFuZCwgYXNzZXRLaW5kKTtcbiAgfSxcbiAgLyoqXG4gKiBSZXR1cm4gdHJ1ZSBpZiB0aGUgQW1vdW50IGlzIGVtcHR5LiBPdGhlcndpc2UgZmFsc2UuXG4gKlxuICogQHBhcmFtIHtBbW91bnR9IGFtb3VudFxuICogQHBhcmFtIHtCcmFuZH0gW2JyYW5kXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgaXNFbXB0eTogKGFtb3VudCwgYnJhbmQgPSB1bmRlZmluZWQpID0+IHtcbiAgICBhc3NlcnRSZWNvcmQoYW1vdW50LCAnYW1vdW50Jyk7XG4gICAgY29uc3QgeyBicmFuZDogYWxsZWdlZEJyYW5kLCB2YWx1ZSB9ID0gYW1vdW50O1xuICAgIGFzc2VydFJlbW90YWJsZShhbGxlZ2VkQnJhbmQsICdicmFuZCcpO1xuICAgIG9wdGlvbmFsQnJhbmRDaGVjayhhbGxlZ2VkQnJhbmQsIGJyYW5kKTtcbiAgICBjb25zdCBoID0gYXNzZXJ0VmFsdWVHZXRIZWxwZXJzKHZhbHVlKTtcbiAgICByZXR1cm4gaC5kb0lzRW1wdHkoaC5kb0NvZXJjZSh2YWx1ZSkpO1xuICB9LFxuICBpc0dURSxcbiAgLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGxlZnRBbW91bnQgZXF1YWxzIHRoZSByaWdodEFtb3VudC4gV2UgYXNzdW1lIHRoYXQgaWZcbiAqIGlzR1RFIGlzIHRydWUgaW4gYm90aCBkaXJlY3Rpb25zLCBpc0VxdWFsIGlzIGFsc28gdHJ1ZVxuICpcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50fSBBXG4gKiBAcGFyYW0ge0F9IGxlZnRBbW91bnRcbiAqIEBwYXJhbSB7QX0gcmlnaHRBbW91bnRcbiAqIEBwYXJhbSB7QnJhbmR9IFticmFuZF1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gIGlzRXF1YWw6IChsZWZ0QW1vdW50LCByaWdodEFtb3VudCwgYnJhbmQgPSB1bmRlZmluZWQpID0+IHtcbiAgICBjb25zdCBoID0gY2hlY2tMUkFuZEdldEhlbHBlcnMobGVmdEFtb3VudCwgcmlnaHRBbW91bnQsIGJyYW5kKTtcbiAgICByZXR1cm4gaC5kb0lzRXF1YWwoLi4uY29lcmNlTFIoaCwgbGVmdEFtb3VudCwgcmlnaHRBbW91bnQpKTtcbiAgfSxcbiAgLyoqXG4gKiBSZXR1cm5zIGEgbmV3IGFtb3VudCB0aGF0IGlzIHRoZSB1bmlvbiBvZiBib3RoIGxlZnRBbW91bnQgYW5kIHJpZ2h0QW1vdW50LlxuICpcbiAqIEZvciBmdW5naWJsZSBhbW91bnQgdGhpcyBtZWFucyBhZGRpbmcgdGhlIHZhbHVlcy4gRm9yIG90aGVyIGtpbmRzIG9mXG4gKiBhbW91bnQsIGl0IHVzdWFsbHkgbWVhbnMgaW5jbHVkaW5nIGFsbCBvZiB0aGUgZWxlbWVudHMgZnJvbSBib3RoIGxlZnQgYW5kXG4gKiByaWdodC5cbiAqXG4gKiBAdHlwZSB7e1xuICogICA8QSBleHRlbmRzIENvcHlCYWcsIEIgZXh0ZW5kcyBDb3B5QmFnPihcbiAqICAgICBsZWZ0QW1vdW50OiBDb3B5QmFnQW1vdW50PEE+LFxuICogICAgIHJpZ2h0QW1vdW50OiBDb3B5QmFnQW1vdW50PEI+LFxuICogICAgIGJyYW5kPzogQnJhbmQsXG4gKiAgICk6IENvcHlCYWdBbW91bnQ8QSB8IEI+O1xuICogICA8QSBleHRlbmRzIEFtb3VudD4obGVmdEFtb3VudDogQSwgcmlnaHRBbW91bnQ6IEEsIGJyYW5kPzogQnJhbmQpOiBBO1xuICogfX1cbiAqL1xuICBhZGQ6IChsZWZ0QW1vdW50LCByaWdodEFtb3VudCwgYnJhbmQgPSB1bmRlZmluZWQpID0+IHtcbiAgICBjb25zdCBoID0gY2hlY2tMUkFuZEdldEhlbHBlcnMobGVmdEFtb3VudCwgcmlnaHRBbW91bnQsIGJyYW5kKTtcbiAgICBjb25zdCB2YWx1ZSA9IGguZG9BZGQoLi4uY29lcmNlTFIoaCwgbGVmdEFtb3VudCwgcmlnaHRBbW91bnQpKTtcbiAgICByZXR1cm4gaGFyZGVuKHsgYnJhbmQ6IGxlZnRBbW91bnQuYnJhbmQsIHZhbHVlIH0pO1xuICB9LFxuICAvKipcbiAqIFJldHVybnMgYSBuZXcgYW1vdW50IHRoYXQgaXMgdGhlIGxlZnRBbW91bnQgbWludXMgdGhlIHJpZ2h0QW1vdW50IChpLmUuXG4gKiBldmVyeXRoaW5nIGluIHRoZSBsZWZ0QW1vdW50IHRoYXQgaXMgbm90IGluIHRoZSByaWdodEFtb3VudCkuIElmIGxlZnRBbW91bnRcbiAqIGRvZXNuJ3QgaW5jbHVkZSByaWdodEFtb3VudCAoc3VidHJhY3Rpb24gcmVzdWx0cyBpbiBhIG5lZ2F0aXZlKSwgdGhyb3cgYW5cbiAqIGVycm9yLiBCZWNhdXNlIHRoZSBsZWZ0IGFtb3VudCBtdXN0IGluY2x1ZGUgdGhlIHJpZ2h0IGFtb3VudCwgdGhpcyBpcyBOT1RcbiAqIGVxdWl2YWxlbnQgdG8gc2V0IHN1YnRyYWN0aW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50fSBMXG4gKiBAdGVtcGxhdGUge0Ftb3VudH0gUlxuICogQHBhcmFtIHtMfSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge1J9IHJpZ2h0QW1vdW50XG4gKiBAcGFyYW0ge0JyYW5kfSBbYnJhbmRdXG4gKiBAcmV0dXJucyB7TCBleHRlbmRzIFIgPyBMIDogbmV2ZXJ9XG4gKi9cbiAgc3VidHJhY3Q6IChsZWZ0QW1vdW50LCByaWdodEFtb3VudCwgYnJhbmQgPSB1bmRlZmluZWQpID0+IHtcbiAgICBjb25zdCBoID0gY2hlY2tMUkFuZEdldEhlbHBlcnMobGVmdEFtb3VudCwgcmlnaHRBbW91bnQsIGJyYW5kKTtcbiAgICBjb25zdCB2YWx1ZSA9IGguZG9TdWJ0cmFjdCguLi5jb2VyY2VMUihoLCBsZWZ0QW1vdW50LCByaWdodEFtb3VudCkpO1xuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgZGlmZmVyZW50IHN1YnR5cGUqL1xuICAgIHJldHVybiBoYXJkZW4oeyBicmFuZDogbGVmdEFtb3VudC5icmFuZCwgdmFsdWUgfSk7XG4gIH0sXG4gIC8qKlxuICogUmV0dXJucyB0aGUgbWluIHZhbHVlIGJldHdlZW4geCBhbmQgeSB1c2luZyBpc0dURVxuICpcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50fSBBXG4gKiBAcGFyYW0ge0F9IHhcbiAqIEBwYXJhbSB7QX0geVxuICogQHBhcmFtIHtCcmFuZH0gW2JyYW5kXVxuICogQHJldHVybnMge0F9XG4gKi9cbiAgbWluOiAoeCwgeSwgYnJhbmQgPSB1bmRlZmluZWQpID0+XG4gICAgaXNHVEUoeCwgeSwgYnJhbmQpXG4gICAgICA/IHlcbiAgICAgIDogaXNHVEUoeSwgeCwgYnJhbmQpXG4gICAgICAgID8geFxuICAgICAgICA6IEZhaWxgJHt4fSBhbmQgJHt5fSBhcmUgaW5jb21wYXJhYmxlYCxcbiAgLyoqXG4gKiBSZXR1cm5zIHRoZSBtYXggdmFsdWUgYmV0d2VlbiB4IGFuZCB5IHVzaW5nIGlzR1RFXG4gKlxuICogQHRlbXBsYXRlIHtBbW91bnR9IEFcbiAqIEBwYXJhbSB7QX0geFxuICogQHBhcmFtIHtBfSB5XG4gKiBAcGFyYW0ge0JyYW5kfSBbYnJhbmRdXG4gKiBAcmV0dXJucyB7QX1cbiAqL1xuICBtYXg6ICh4LCB5LCBicmFuZCA9IHVuZGVmaW5lZCkgPT5cbiAgICBpc0dURSh4LCB5LCBicmFuZClcbiAgICAgID8geFxuICAgICAgOiBpc0dURSh5LCB4KVxuICAgICAgICA/IHlcbiAgICAgICAgOiBGYWlsYCR7eH0gYW5kICR7eX0gYXJlIGluY29tcGFyYWJsZWAsXG59OyRozY9fb25jZS5BbW91bnRNYXRoKEFtb3VudE1hdGgpO1xuaGFyZGVuKEFtb3VudE1hdGgpO1xuXG4vKiogQHBhcmFtIHtBbW91bnR9IGFtb3VudCAqL1xuICAgICAgIGNvbnN0IGdldEFzc2V0S2luZCA9IGFtb3VudCA9PiB7XG4gIGFzc2VydFJlY29yZChhbW91bnQsICdhbW91bnQnKTtcbiAgY29uc3QgeyB2YWx1ZSB9ID0gYW1vdW50O1xuICByZXR1cm4gYXNzZXJ0VmFsdWVHZXRBc3NldEtpbmQodmFsdWUpO1xufTskaM2PX29uY2UuZ2V0QXNzZXRLaW5kKGdldEFzc2V0S2luZCk7XG5oYXJkZW4oZ2V0QXNzZXRLaW5kKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkFzc2V0S2luZCI6WyJBc3NldEtpbmQiXSwiYXNzZXJ0QXNzZXRLaW5kIjpbImFzc2VydEFzc2V0S2luZCJdLCJhc3NlcnRWYWx1ZUdldEhlbHBlcnMiOlsiYXNzZXJ0VmFsdWVHZXRIZWxwZXJzIl0sIkFtb3VudE1hdGgiOlsiQW1vdW50TWF0aCJdLCJnZXRBc3NldEtpbmQiOlsiZ2V0QXNzZXRLaW5kIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAF/pvV56BQAAegUAACcAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvYW1vdW50U3RvcmUuanN7ImltcG9ydHMiOlsiLi9hbW91bnRNYXRoLmpzIl0sImV4cG9ydHMiOlsibWFrZUFtb3VudFN0b3JlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgQW1vdW50TWF0aDskaM2PX2ltcG9ydHMoW1tcIi4vYW1vdW50TWF0aC5qc1wiLCBbW1wiQW1vdW50TWF0aFwiLFskaM2PX2EgPT4gKEFtb3VudE1hdGggPSAkaM2PX2EpXV1dXV0pO1xuXG4vKiogQGltcG9ydCB7QW1vdW50LCBBc3NldEtpbmR9IGZyb20gJy4vdHlwZXMuanMnICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFtb3VudFN0b3JlXG4gKiBAcHJvcGVydHkgeygpID0+IEFtb3VudDxLPn0gZ2V0QW1vdW50XG4gKiBAcHJvcGVydHkgeyhkZWx0YTogQW1vdW50PEs+KSA9PiB2b2lkfSBpbmNyZW1lbnRcbiAqIEBwcm9wZXJ0eSB7KGRlbHRhOiBBbW91bnQ8Sz4pID0+IGJvb2xlYW59IGRlY3JlbWVudFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEBwYXJhbSB7b2JqZWN0fSBzdGF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICogQHJldHVybnMge0Ftb3VudFN0b3JlPEs+fVxuICovXG4gICAgICAgY29uc3QgbWFrZUFtb3VudFN0b3JlID0gKHN0YXRlLCBrZXkpID0+IHtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgZ2V0QW1vdW50OiAoKSA9PiBzdGF0ZVtrZXldLFxuICAgIGluY3JlbWVudDogZGVsdGEgPT4ge1xuICAgICAgc3RhdGVba2V5XSA9IEFtb3VudE1hdGguYWRkKHN0YXRlW2tleV0sIGRlbHRhKTtcbiAgICB9LFxuICAgIGRlY3JlbWVudDogZGVsdGEgPT4ge1xuICAgICAgaWYgKEFtb3VudE1hdGguaXNHVEUoc3RhdGVba2V5XSwgZGVsdGEpKSB7XG4gICAgICAgIHN0YXRlW2tleV0gPSBBbW91bnRNYXRoLnN1YnRyYWN0KHN0YXRlW2tleV0sIGRlbHRhKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlQW1vdW50U3RvcmUobWFrZUFtb3VudFN0b3JlKTtcbmhhcmRlbihtYWtlQW1vdW50U3RvcmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUFtb3VudFN0b3JlIjpbIm1ha2VBbW91bnRTdG9yZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABDvXvZdAYAAHQGAAAnAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2Rpc3BsYXlJbmZvLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBhZ29yaWMvc3RvcmUiLCIuL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6WyJjb2VyY2VEaXNwbGF5SW5mbyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsbXVzdE1hdGNoLERpc3BsYXlJbmZvU2hhcGU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJEaXNwbGF5SW5mb1NoYXBlXCIsWyRozY9fYSA9PiAoRGlzcGxheUluZm9TaGFwZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG4vKiogQGltcG9ydCB7QWRkaXRpb25hbERpc3BsYXlJbmZvLCBBc3NldEtpbmQsIERpc3BsYXlJbmZvfSBmcm9tICcuL3R5cGVzLmpzJyAqL1xuXG4vKipcbiAqIEBwYXJhbSB7QWRkaXRpb25hbERpc3BsYXlJbmZvfSBhbGxlZ2VkRGlzcGxheUluZm9cbiAqIEBwYXJhbSB7QXNzZXRLaW5kfSBhc3NldEtpbmRcbiAqIEByZXR1cm5zIHtEaXNwbGF5SW5mb31cbiAqL1xuICAgICAgIGNvbnN0IGNvZXJjZURpc3BsYXlJbmZvID0gKGFsbGVnZWREaXNwbGF5SW5mbywgYXNzZXRLaW5kKSA9PiB7XG4gIG11c3RNYXRjaChhbGxlZ2VkRGlzcGxheUluZm8sIERpc3BsYXlJbmZvU2hhcGUsICdkaXNwbGF5SW5mbycpO1xuXG4gIGlmIChhbGxlZ2VkRGlzcGxheUluZm8uYXNzZXRLaW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICBhbGxlZ2VkRGlzcGxheUluZm8uYXNzZXRLaW5kID09PSBhc3NldEtpbmQgfHxcbiAgICAgIEZhaWxgZGlzcGxheUluZm8uYXNzZXRLaW5kIHdhcyBwcmVzZW50ICgke2FsbGVnZWREaXNwbGF5SW5mby5hc3NldEtpbmR9KSBhbmQgZGlkIG5vdCBtYXRjaCB0aGUgYXNzZXRLaW5kIGFyZ3VtZW50ICgke2Fzc2V0S2luZH0pYDtcbiAgfVxuICBjb25zdCBkaXNwbGF5SW5mbyA9IGhhcmRlbih7IC4uLmFsbGVnZWREaXNwbGF5SW5mbywgYXNzZXRLaW5kIH0pO1xuXG4gIGlmIChkaXNwbGF5SW5mby5kZWNpbWFsUGxhY2VzICE9PSB1bmRlZmluZWQpIHtcbiAgICBOdW1iZXIuaXNTYWZlSW50ZWdlcihkaXNwbGF5SW5mby5kZWNpbWFsUGxhY2VzKSB8fFxuICAgICAgRmFpbGBkZWNpbWFsUGxhY2VzICR7ZGlzcGxheUluZm8uZGVjaW1hbFBsYWNlc30gaXMgbm90IGEgc2FmZSBpbnRlZ2VyYDtcbiAgfVxuXG4gIHJldHVybiBkaXNwbGF5SW5mbztcbn07JGjNj19vbmNlLmNvZXJjZURpc3BsYXlJbmZvKGNvZXJjZURpc3BsYXlJbmZvKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNvZXJjZURpc3BsYXlJbmZvIjpbImNvZXJjZURpc3BsYXlJbmZvIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPNfTQNNAgAATQIAACEAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9hbW91bnRNYXRoLmpzIiwiLi9pc3N1ZXJLaXQuanMiLCIuL3R5cGVHdWFyZHMuanMiLCIuL3R5cGVzLWluZGV4LmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9hbW91bnRNYXRoLmpzIiwiLi9pc3N1ZXJLaXQuanMiLCIuL3R5cGVHdWFyZHMuanMiLCIuL3R5cGVzLWluZGV4LmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vYW1vdW50TWF0aC5qc1wiLCBbXV0sW1wiLi9pc3N1ZXJLaXQuanNcIiwgW11dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbXV0sW1wiLi90eXBlcy1pbmRleC5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABoPpBzxzwAAMc8AAAlAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2lzc3VlcktpdC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBhZ29yaWMvem9uZS9kdXJhYmxlLmpzIiwiLi9hbW91bnRNYXRoLmpzIiwiLi9kaXNwbGF5SW5mby5qcyIsIi4vcGF5bWVudExlZGdlci5qcyJdLCJleHBvcnRzIjpbImhhc0lzc3VlciIsIm1ha2VEdXJhYmxlSXNzdWVyS2l0IiwibWFrZUlzc3VlcktpdCIsInByZXBhcmVJc3N1ZXJLaXQiLCJ1cGdyYWRlSXNzdWVyS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYXNzZXJ0LEZhaWwsYXNzZXJ0UGF0dGVybixtYWtlU2NhbGFyQmlnTWFwU3RvcmUsbWFrZUR1cmFibGVab25lLEFzc2V0S2luZCxhc3NlcnRBc3NldEtpbmQsY29lcmNlRGlzcGxheUluZm8scHJlcGFyZVBheW1lbnRMZWRnZXI7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcImFzc2VydFwiLFskaM2PX2EgPT4gKGFzc2VydCA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImFzc2VydFBhdHRlcm5cIixbJGjNj19hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wibWFrZVNjYWxhckJpZ01hcFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZVNjYWxhckJpZ01hcFN0b3JlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy96b25lL2R1cmFibGUuanNcIiwgW1tcIm1ha2VEdXJhYmxlWm9uZVwiLFskaM2PX2EgPT4gKG1ha2VEdXJhYmxlWm9uZSA9ICRozY9fYSldXV1dLFtcIi4vYW1vdW50TWF0aC5qc1wiLCBbW1wiQXNzZXRLaW5kXCIsWyRozY9fYSA9PiAoQXNzZXRLaW5kID0gJGjNj19hKV1dLFtcImFzc2VydEFzc2V0S2luZFwiLFskaM2PX2EgPT4gKGFzc2VydEFzc2V0S2luZCA9ICRozY9fYSldXV1dLFtcIi4vZGlzcGxheUluZm8uanNcIiwgW1tcImNvZXJjZURpc3BsYXlJbmZvXCIsWyRozY9fYSA9PiAoY29lcmNlRGlzcGxheUluZm8gPSAkaM2PX2EpXV1dXSxbXCIuL3BheW1lbnRMZWRnZXIuanNcIiwgW1tcInByZXBhcmVQYXltZW50TGVkZ2VyXCIsWyRozY9fYSA9PiAocHJlcGFyZVBheW1lbnRMZWRnZXIgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0tleSwgUGF0dGVybn0gZnJvbSAnQGVuZG8vcGF0dGVybnMnO1xuICogQGltcG9ydCB7Wm9uZX0gZnJvbSAnQGFnb3JpYy9iYXNlLXpvbmUnO1xuICogQGltcG9ydCB7U2h1dGRvd25XaXRoRmFpbHVyZX0gZnJvbSAnQGFnb3JpYy9zd2luZ3NldC12YXQnO1xuICogQGltcG9ydCB7VHlwZWRQYXR0ZXJufSBmcm9tICdAYWdvcmljL2ludGVybmFsJztcbiAqIEBpbXBvcnQge0JhZ2dhZ2V9IGZyb20gJ0BhZ29yaWMvdmF0LWRhdGEnO1xuICogQGltcG9ydCB7QWRkaXRpb25hbERpc3BsYXlJbmZvLCBSZWNvdmVyeVNldHNPcHRpb24sIElzc3VlcktpdCwgUGF5bWVudExlZGdlcn0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHR5cGVkZWYge29iamVjdH0gSXNzdWVyUmVjb3JkXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZVxuICogQHByb3BlcnR5IHtLfSBhc3NldEtpbmRcbiAqIEBwcm9wZXJ0eSB7QWRkaXRpb25hbERpc3BsYXlJbmZvfSBkaXNwbGF5SW5mb1xuICogQHByb3BlcnR5IHtQYXR0ZXJufSBlbGVtZW50U2hhcGVcbiAqL1xuXG4vKipcbiAqIFVzZWQgX29ubHlfIGludGVybmFsbHksIHRvIG1ha2UgYSBuZXcgaXNzdWVyS2l0IG9yIHRvIHJldml2ZSBhbiBvbGQgb25lLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0lzc3VlclJlY29yZDxLPn0gaXNzdWVyUmVjb3JkXG4gKiBAcGFyYW0ge1pvbmV9IGlzc3VlclpvbmVcbiAqIEBwYXJhbSB7UmVjb3ZlcnlTZXRzT3B0aW9ufSByZWNvdmVyeVNldHNTdGF0ZSBPbWl0dGVkIGZyb20gaXNzdWVyUmVjb3JkXG4gKiAgIGJlY2F1c2UgaXQgd2FzIGFkZGVkIGluIGFuIHVwZ3JhZGUuXG4gKiBAcGFyYW0ge1NodXRkb3duV2l0aEZhaWx1cmV9IFtvcHRTaHV0ZG93bldpdGhGYWlsdXJlXSBJZiB0aGlzIGlzc3VlciBmYWlscyBpblxuICogICB0aGUgbWlkZGxlIG9mIGFuIGF0b21pYyBhY3Rpb24gKHdoaWNoIGJ0dyBzaG91bGQgbmV2ZXIgaGFwcGVuKSwgaXRcbiAqICAgcG90ZW50aWFsbHkgbGVhdmVzIGl0cyBsZWRnZXIgaW4gYSBjb3JydXB0ZWQgc3RhdGUuIElmIHRoaXMgZnVuY3Rpb24gd2FzXG4gKiAgIHByb3ZpZGVkLCB0aGVuIHRoZSBmYWlsZWQgYXRvbWljIGFjdGlvbiB3aWxsIGNhbGwgaXQsIHNvIHRoYXQgc29tZSBsYXJnZXJcbiAqICAgdW5pdCBvZiBjb21wdXRhdGlvbiwgbGlrZSB0aGUgZW5jbG9zaW5nIHZhdCwgY2FuIGJlIHNodXRkb3duIGJlZm9yZVxuICogICBhbnl0aGluZyBlbHNlIGlzIGNvcnJ1cHRlZCBieSB0aGF0IGNvcnJ1cHRlZCBzdGF0ZS4gU2VlXG4gKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzQzNFxuICogQHJldHVybnMge0lzc3VlcktpdDxLPn1cbiAqL1xuY29uc3Qgc2V0dXBJc3N1ZXJLaXQgPSAoXG4gIHsgbmFtZSwgYXNzZXRLaW5kLCBkaXNwbGF5SW5mbywgZWxlbWVudFNoYXBlIH0sXG4gIGlzc3VlclpvbmUsXG4gIHJlY292ZXJ5U2V0c1N0YXRlLFxuICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlID0gdW5kZWZpbmVkLFxuKSA9PiB7XG4gIGFzc2VydC50eXBlb2YobmFtZSwgJ3N0cmluZycpO1xuICBhc3NlcnRBc3NldEtpbmQoYXNzZXRLaW5kKTtcblxuICAvKiBBZGQgYXNzZXRLaW5kIHRvIGRpc3BsYXlJbmZvLCBvciBvdmVycmlkZSBpZiBwcmVzZW50Ki9cbiAgY29uc3QgY2xlYW5EaXNwbGF5SW5mbyA9IGNvZXJjZURpc3BsYXlJbmZvKGRpc3BsYXlJbmZvLCBhc3NldEtpbmQpO1xuICBpZiAob3B0U2h1dGRvd25XaXRoRmFpbHVyZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0LnR5cGVvZihvcHRTaHV0ZG93bldpdGhGYWlsdXJlLCAnZnVuY3Rpb24nKTtcbiAgfVxuXG4gIGlmIChlbGVtZW50U2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydFBhdHRlcm4oZWxlbWVudFNoYXBlKTtcbiAgfVxuXG4gIC8qIEF0dGVudWF0ZSB0aGUgcG93ZXJmdWwgYXV0aG9yaXR5IHRvIG1pbnQgYW5kIGNoYW5nZSBiYWxhbmNlcyovXG4gIC8qKiBAdHlwZSB7UGF5bWVudExlZGdlcjxLPn0gKi9cbiAgLyogQHRzLWV4cGVjdC1lcnJvciBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIGRpZmZlcmVudCBzdWJ0eXBlKi9cbiAgY29uc3QgeyBpc3N1ZXIsIG1pbnQsIGJyYW5kLCBtaW50UmVjb3ZlcnlQdXJzZSB9ID0gcHJlcGFyZVBheW1lbnRMZWRnZXIoXG4gICAgaXNzdWVyWm9uZSxcbiAgICBuYW1lLFxuICAgIGFzc2V0S2luZCxcbiAgICBjbGVhbkRpc3BsYXlJbmZvLFxuICAgIGVsZW1lbnRTaGFwZSxcbiAgICByZWNvdmVyeVNldHNTdGF0ZSxcbiAgICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlLFxuICApO1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGJyYW5kLFxuICAgIGlzc3VlcixcbiAgICBtaW50LFxuICAgIG1pbnRSZWNvdmVyeVB1cnNlLFxuICAgIGRpc3BsYXlJbmZvOiBjbGVhbkRpc3BsYXlJbmZvLFxuICB9KTtcbn07XG5oYXJkZW4oc2V0dXBJc3N1ZXJLaXQpO1xuXG4vKiogVGhlIGtleSBhdCB3aGljaCB0aGUgaXNzdWVyIHJlY29yZCBpcyBzdG9yZWQuICovXG5jb25zdCBJTlNUQU5DRV9LRVkgPSAnaXNzdWVyJztcbi8qKlxuICogVGhlIGtleSBhdCB3aGljaCB0aGUgaXNzdWVyS2l0J3MgYFJlY292ZXJ5U2V0c09wdGlvbmAgc3RhdGUgaXMgc3RvcmVkLlxuICogSW50cm9kdWNlZCBieSBhbiB1cGdyYWRlLCBzbyBtYXkgYmUgYWJzZW50IG9uIGEgcHJlZGVjZXNzb3IgaW5jYXJuYXRpb24uIFNlZVxuICogYFJlY292ZXJ5U2V0c09wdGlvbmAgZm9yIGRlZmF1bHRpbmcgYmVoYXZpb3IuXG4gKi9cbmNvbnN0IFJFQ09WRVJZX1NFVFNfU1RBVEUgPSAncmVjb3ZlcnlTZXRzU3RhdGUnO1xuXG4vKipcbiAqIFVzZWQgX29ubHlfIHRvIHVwZ3JhZGUgYSBwcmVkZWNlc3NvciBpc3N1ZXJLaXQuIFVzZSBgbWFrZUR1cmFibGVJc3N1ZXJLaXRgIHRvXG4gKiBtYWtlIGEgbmV3IG9uZS5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtCYWdnYWdlfSBpc3N1ZXJCYWdnYWdlXG4gKiBAcGFyYW0ge1NodXRkb3duV2l0aEZhaWx1cmV9IFtvcHRTaHV0ZG93bldpdGhGYWlsdXJlXSBJZiB0aGlzIGlzc3VlciBmYWlscyBpblxuICogICB0aGUgbWlkZGxlIG9mIGFuIGF0b21pYyBhY3Rpb24gKHdoaWNoIGJ0dyBzaG91bGQgbmV2ZXIgaGFwcGVuKSwgaXRcbiAqICAgcG90ZW50aWFsbHkgbGVhdmVzIGl0cyBsZWRnZXIgaW4gYSBjb3JydXB0ZWQgc3RhdGUuIElmIHRoaXMgZnVuY3Rpb24gd2FzXG4gKiAgIHByb3ZpZGVkLCB0aGVuIHRoZSBmYWlsZWQgYXRvbWljIGFjdGlvbiB3aWxsIGNhbGwgaXQsIHNvIHRoYXQgc29tZSBsYXJnZXJcbiAqICAgdW5pdCBvZiBjb21wdXRhdGlvbiwgbGlrZSB0aGUgZW5jbG9zaW5nIHZhdCwgY2FuIGJlIHNodXRkb3duIGJlZm9yZVxuICogICBhbnl0aGluZyBlbHNlIGlzIGNvcnJ1cHRlZCBieSB0aGF0IGNvcnJ1cHRlZCBzdGF0ZS4gU2VlXG4gKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzQzNFxuICogQHBhcmFtIHtSZWNvdmVyeVNldHNPcHRpb259IFtyZWNvdmVyeVNldHNPcHRpb25dIEFkZGVkIGluIHVwZ3JhZGUsIHNvIGxhc3RcbiAqICAgYW5kIG9wdGlvbmFsLiBTZWUgYFJlY292ZXJ5U2V0c09wdGlvbmAgZm9yIGRlZmF1bHRpbmcgYmVoYXZpb3IuXG4gKiBAcmV0dXJucyB7SXNzdWVyS2l0PEs+fVxuICovXG4gICAgICAgY29uc3QgdXBncmFkZUlzc3VlcktpdCA9IChcbiAgaXNzdWVyQmFnZ2FnZSxcbiAgb3B0U2h1dGRvd25XaXRoRmFpbHVyZSA9IHVuZGVmaW5lZCxcbiAgcmVjb3ZlcnlTZXRzT3B0aW9uID0gdW5kZWZpbmVkLFxuKSA9PiB7XG4gIGNvbnN0IGlzc3VlclJlY29yZCA9IGlzc3VlckJhZ2dhZ2UuZ2V0KElOU1RBTkNFX0tFWSk7XG4gIGNvbnN0IGlzc3VlclpvbmUgPSBtYWtlRHVyYWJsZVpvbmUoaXNzdWVyQmFnZ2FnZSk7XG4gIGNvbnN0IG9sZFJlY292ZXJ5U2V0c1N0YXRlID0gaXNzdWVyQmFnZ2FnZS5oYXMoUkVDT1ZFUllfU0VUU19TVEFURSlcbiAgICA/IGlzc3VlckJhZ2dhZ2UuZ2V0KFJFQ09WRVJZX1NFVFNfU1RBVEUpXG4gICAgOiAnaGFzUmVjb3ZlcnlTZXRzJztcbiAgaWYgKFxuICAgIG9sZFJlY292ZXJ5U2V0c1N0YXRlID09PSAnbm9SZWNvdmVyeVNldHMnICYmXG4gICAgcmVjb3ZlcnlTZXRzT3B0aW9uID09PSAnaGFzUmVjb3ZlcnlTZXRzJ1xuICApIHtcbiAgICBGYWlsYENhbm5vdCAoeWV0PykgdXBncmFkZSBmcm9tICdub1JlY292ZXJ5U2V0cycgdG8gJ2hhc1JlY292ZXJ5U2V0cydgO1xuICB9XG4gIC8qIEV4dGFudCBzZXRzIGFyZSBub3QgY3VycmVudGx5IGRlbGV0ZWQuIElmIHRoZSBuZXcgb3B0aW9uIGlzKi9cbiAgLyogJ25vUmVjb3ZlcnlTZXRzJywgdGhleSB3b24ndCBiZSB1c2VkIGJ1dCBleHRhbnQgb25lcyB3aWxsIHJlbWFpbi4gRnV0dXJlKi9cbiAgLyogdXBncmFkZXMgbWF5IG1ha2UgaXQgcG9zc2libGUgdG8gZGVsZXRlIGVsZW1lbnRzIGZyb20gdGhlbS4qL1xuICBjb25zdCByZWNvdmVyeVNldHNTdGF0ZSA9IHJlY292ZXJ5U2V0c09wdGlvbiB8fCBvbGRSZWNvdmVyeVNldHNTdGF0ZTtcbiAgcmV0dXJuIHNldHVwSXNzdWVyS2l0KFxuICAgIGlzc3VlclJlY29yZCxcbiAgICBpc3N1ZXJab25lLFxuICAgIHJlY292ZXJ5U2V0c1N0YXRlLFxuICAgIG9wdFNodXRkb3duV2l0aEZhaWx1cmUsXG4gICk7XG59OyRozY9fb25jZS51cGdyYWRlSXNzdWVyS2l0KHVwZ3JhZGVJc3N1ZXJLaXQpO1xuaGFyZGVuKHVwZ3JhZGVJc3N1ZXJLaXQpO1xuXG4vKipcbiAqIERvZXMgYmFnZ2FnZSBhbHJlYWR5IGhhdmUgYW4gaXNzdWVyS2l0P1xuICpcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICovXG4gICAgICAgY29uc3QgaGFzSXNzdWVyID0gYmFnZ2FnZSA9PiBiYWdnYWdlLmhhcyhJTlNUQU5DRV9LRVkpO1xuXG4vKipcbiAqIGBlbGVtZW50U2hhcGVgLCBtYXkgb25seSBiZSBwcmVzZW50IGZvciBjb2xsZWN0aW9uLXN0eWxlIGFtb3VudHMuIElmIHByZXNlbnQsXG4gKiBpdCBpcyBhIGBQYXR0ZXJuYCB0aGF0IGV2ZXJ5IGVsZW1lbnQgb2YgdGhpcyBpc3N1ZXJLaXRzJ3MgYW1vdW50cyBtdXN0XG4gKiBzYXRpc2Z5LiBGb3IgZXhhbXBsZSwgdGhlIFpvZSBJbnZpdGF0aW9uIGlzc3VlcktpdCB1c2VzIGFuIGVsZW1lbnRTaGFwZVxuICogZGVzY3JpYmluZyB0aGUgaW52aXRhdGlvbiBkZXRhaWxzIGZvciBhbiBpbmRpdmlkdWFsIGludml0YXRpb24uIEFuIGludml0YXRpb25cbiAqIHB1cnNlIG9yIHBheW1lbnQgaGFzIGFuIGFtb3VudCB0aGF0IGNhbiBvbmx5IGJlIGEgc2V0IG9mIHRoZXNlLiAoVGhvdWdoXG4gKiB0eXBpY2FsbHksIHRoZSBhbW91bnQgb2YgYW4gaW52aXRhdGlvbiBwYXltZW50IGlzIGEgc2luZ2xldG9uIHNldC4gU3VjaCBhXG4gKiBwYXltZW50IGlzIG9mdGVuIHJlZmVycmVkIHRvIGluIHRoZSBzaW5ndWxhciBhcyBcImFuIGludml0YXRpb25cIi4pXG4gKlxuICogYHJlY292ZXJ5U2V0c09wdGlvbmAgYWRkZWQgaW4gdXBncmFkZS4gTm90ZSB0aGF0IGBJc3N1ZXJPcHRpb25zUmVjb3JkYCBpc1xuICogbmV2ZXIgc3RvcmVkLCBzbyB3ZSBuZXZlciBuZWVkIHRvIHdvcnJ5IGFib3V0IGluaGVyaXRpbmcgb25lIGZyb20gYVxuICogcHJlZGVjZXNzb3IgcHJlZGF0aW5nIHRoZSBpbnRyb2R1Y3Rpb24gb2YgcmVjb3Zlcnkgc2V0cy4gU2VlXG4gKiBgUmVjb3ZlcnlTZXRzT3B0aW9uYCBmb3IgZGVmYXVsdGluZyBiZWhhdmlvci5cbiAqXG4gKiBAdHlwZWRlZiB7UGFydGlhbDx7XG4gKiAgIGVsZW1lbnRTaGFwZTogUGF0dGVybjtcbiAqICAgcmVjb3ZlcnlTZXRzT3B0aW9uOiBSZWNvdmVyeVNldHNPcHRpb247XG4gKiB9Pn0gSXNzdWVyT3B0aW9uc1JlY29yZFxuICovXG5cbi8qKlxuICogVXNlZCBfb25seV8gdG8gbWFrZSBhIF9uZXdfIGR1cmFibGUgaXNzdWVyLCBpLmUuLCB0aGUgaW5pdGlhbCBpbmNhcm5hdGlvbiBvZlxuICogdGhhdCBpc3N1ZXIuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEsgVGhlIG5hbWUgYmVjb21lcyBwYXJ0IG9mIHRoZSBicmFuZCBpbiBhc3NldFxuICogICBkZXNjcmlwdGlvbnMuIFRoZSBuYW1lIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nIGFuZCBkb3VibGUtY2hlY2tpbmdcbiAqICAgYXNzdW1wdGlvbnMsIGJ1dCBzaG91bGQgbm90IGJlIHRydXN0ZWQgd3J0IGFueSBleHRlcm5hbCBuYW1lc3BhY2UuIEZvclxuICogICBleGFtcGxlLCBhbnlvbmUgY291bGQgY3JlYXRlIGEgbmV3IGlzc3VlciBraXQgd2l0aCBuYW1lICdCVEMnLCBidXQgaXQgaXNcbiAqICAgbm90IGJpdGNvaW4gb3IgZXZlbiByZWxhdGVkLiBJdCBpcyBvbmx5IHRoZSBuYW1lIGFjY29yZGluZyB0byB0aGF0IGlzc3VlclxuICogICBhbmQgYnJhbmQuXG4gKlxuICogICBUaGUgYXNzZXRLaW5kIHdpbGwgYmUgdXNlZCB0byBpbXBvcnQgYSBzcGVjaWZpYyBtYXRoSGVscGVycyBmcm9tIHRoZVxuICogICBtYXRoSGVscGVycyBsaWJyYXJ5LiBGb3IgZXhhbXBsZSwgbmF0TWF0aEhlbHBlcnMsIHRoZSBkZWZhdWx0LCBpcyB1c2VkIGZvclxuICogICBiYXNpYyBmdW5naWJsZSB0b2tlbnMuXG4gKlxuICogICBgZGlzcGxheUluZm9gIGdpdmVzIGluZm9ybWF0aW9uIHRvIHRoZSBVSSBvbiBob3cgdG8gZGlzcGxheSB0aGUgYW1vdW50LlxuICogQHBhcmFtIHtCYWdnYWdlfSBpc3N1ZXJCYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtLfSBbYXNzZXRLaW5kXVxuICogQHBhcmFtIHtBZGRpdGlvbmFsRGlzcGxheUluZm99IFtkaXNwbGF5SW5mb11cbiAqIEBwYXJhbSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gW29wdFNodXRkb3duV2l0aEZhaWx1cmVdIElmIHRoaXMgaXNzdWVyIGZhaWxzIGluXG4gKiAgIHRoZSBtaWRkbGUgb2YgYW4gYXRvbWljIGFjdGlvbiAod2hpY2ggYnR3IHNob3VsZCBuZXZlciBoYXBwZW4pLCBpdFxuICogICBwb3RlbnRpYWxseSBsZWF2ZXMgaXRzIGxlZGdlciBpbiBhIGNvcnJ1cHRlZCBzdGF0ZS4gSWYgdGhpcyBmdW5jdGlvbiB3YXNcbiAqICAgcHJvdmlkZWQsIHRoZW4gdGhlIGZhaWxlZCBhdG9taWMgYWN0aW9uIHdpbGwgY2FsbCBpdCwgc28gdGhhdCBzb21lIGxhcmdlclxuICogICB1bml0IG9mIGNvbXB1dGF0aW9uLCBsaWtlIHRoZSBlbmNsb3NpbmcgdmF0LCBjYW4gYmUgc2h1dGRvd24gYmVmb3JlXG4gKiAgIGFueXRoaW5nIGVsc2UgaXMgY29ycnVwdGVkIGJ5IHRoYXQgY29ycnVwdGVkIHN0YXRlLiBTZWVcbiAqICAgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNDM0XG4gKiBAcGFyYW0ge0lzc3Vlck9wdGlvbnNSZWNvcmR9IFtvcHRpb25zXVxuICogQHJldHVybnMge0lzc3VlcktpdDxLPn1cbiAqLyRozY9fb25jZS5oYXNJc3N1ZXIoaGFzSXNzdWVyKTtcbiAgICAgICBjb25zdCBtYWtlRHVyYWJsZUlzc3VlcktpdCA9IChcbiAgaXNzdWVyQmFnZ2FnZSxcbiAgbmFtZSxcbiAgLyogQHRzLWV4cGVjdC1lcnJvciBLIGNvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGEgZGlmZmVyZW50IHN1YnR5cGUgb2YgQXNzZXRLaW5kKi9cbiAgYXNzZXRLaW5kID0gQXNzZXRLaW5kLk5BVCxcbiAgZGlzcGxheUluZm8gPSBoYXJkZW4oe30pLFxuICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlID0gdW5kZWZpbmVkLFxuICB7IGVsZW1lbnRTaGFwZSA9IHVuZGVmaW5lZCwgcmVjb3ZlcnlTZXRzT3B0aW9uID0gdW5kZWZpbmVkIH0gPSB7fSxcbikgPT4ge1xuICBjb25zdCBpc3N1ZXJEYXRhID0gaGFyZGVuKHtcbiAgICBuYW1lLFxuICAgIGFzc2V0S2luZCxcbiAgICBkaXNwbGF5SW5mbyxcbiAgICBlbGVtZW50U2hhcGUsXG4gIH0pO1xuICBpc3N1ZXJCYWdnYWdlLmluaXQoSU5TVEFOQ0VfS0VZLCBpc3N1ZXJEYXRhKTtcbiAgY29uc3QgaXNzdWVyWm9uZSA9IG1ha2VEdXJhYmxlWm9uZShpc3N1ZXJCYWdnYWdlKTtcbiAgY29uc3QgcmVjb3ZlcnlTZXRzU3RhdGUgPSByZWNvdmVyeVNldHNPcHRpb24gfHwgJ2hhc1JlY292ZXJ5U2V0cyc7XG4gIGlzc3VlckJhZ2dhZ2UuaW5pdChSRUNPVkVSWV9TRVRTX1NUQVRFLCByZWNvdmVyeVNldHNTdGF0ZSk7XG4gIHJldHVybiBzZXR1cElzc3VlcktpdChcbiAgICBpc3N1ZXJEYXRhLFxuICAgIGlzc3VlclpvbmUsXG4gICAgcmVjb3ZlcnlTZXRzU3RhdGUsXG4gICAgb3B0U2h1dGRvd25XaXRoRmFpbHVyZSxcbiAgKTtcbn07JGjNj19vbmNlLm1ha2VEdXJhYmxlSXNzdWVyS2l0KG1ha2VEdXJhYmxlSXNzdWVyS2l0KTtcbmhhcmRlbihtYWtlRHVyYWJsZUlzc3VlcktpdCk7XG5cbi8qKlxuICogVXNlZCB0byBlaXRoZXIgcmV2aXZlIGEgcHJlZGVjZXNzb3IgaXNzdWVyS2l0LCBvciB0byBtYWtlIGEgbmV3IGR1cmFibGUgb25lXG4gKiBpZiBpdCBpcyBhYnNlbnQsIGFuZCB0byBwbGFjZSBpdCBpbiBiYWdnYWdlIGZvciB0aGUgbmV4dCBzdWNjZXNzb3IuXG4gKlxuICogQHRlbXBsYXRlIHtJc3N1ZXJPcHRpb25zUmVjb3JkfSBPXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gSyBUaGUgbmFtZSBiZWNvbWVzIHBhcnQgb2YgdGhlIGJyYW5kIGluIGFzc2V0XG4gKiAgIGRlc2NyaXB0aW9ucy4gVGhlIG5hbWUgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgYW5kIGRvdWJsZS1jaGVja2luZ1xuICogICBhc3N1bXB0aW9ucywgYnV0IHNob3VsZCBub3QgYmUgdHJ1c3RlZCB3cnQgYW55IGV4dGVybmFsIG5hbWVzcGFjZS4gRm9yXG4gKiAgIGV4YW1wbGUsIGFueW9uZSBjb3VsZCBjcmVhdGUgYSBuZXcgaXNzdWVyIGtpdCB3aXRoIG5hbWUgJ0JUQycsIGJ1dCBpdCBpc1xuICogICBub3QgYml0Y29pbiBvciBldmVuIHJlbGF0ZWQuIEl0IGlzIG9ubHkgdGhlIG5hbWUgYWNjb3JkaW5nIHRvIHRoYXQgaXNzdWVyXG4gKiAgIGFuZCBicmFuZC5cbiAqXG4gKiAgIFRoZSBhc3NldEtpbmQgd2lsbCBiZSB1c2VkIHRvIGltcG9ydCBhIHNwZWNpZmljIG1hdGhIZWxwZXJzIGZyb20gdGhlXG4gKiAgIG1hdGhIZWxwZXJzIGxpYnJhcnkuIEZvciBleGFtcGxlLCBuYXRNYXRoSGVscGVycywgdGhlIGRlZmF1bHQsIGlzIHVzZWQgZm9yXG4gKiAgIGJhc2ljIGZ1bmdpYmxlIHRva2Vucy5cbiAqXG4gKiAgIGBkaXNwbGF5SW5mb2AgZ2l2ZXMgaW5mb3JtYXRpb24gdG8gdGhlIFVJIG9uIGhvdyB0byBkaXNwbGF5IHRoZSBhbW91bnQuXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGlzc3VlckJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0t9IFthc3NldEtpbmRdXG4gKiBAcGFyYW0ge0FkZGl0aW9uYWxEaXNwbGF5SW5mb30gW2Rpc3BsYXlJbmZvXVxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlfSBbb3B0U2h1dGRvd25XaXRoRmFpbHVyZV0gSWYgdGhpcyBpc3N1ZXIgZmFpbHMgaW5cbiAqICAgdGhlIG1pZGRsZSBvZiBhbiBhdG9taWMgYWN0aW9uICh3aGljaCBidHcgc2hvdWxkIG5ldmVyIGhhcHBlbiksIGl0XG4gKiAgIHBvdGVudGlhbGx5IGxlYXZlcyBpdHMgbGVkZ2VyIGluIGEgY29ycnVwdGVkIHN0YXRlLiBJZiB0aGlzIGZ1bmN0aW9uIHdhc1xuICogICBwcm92aWRlZCwgdGhlbiB0aGUgZmFpbGVkIGF0b21pYyBhY3Rpb24gd2lsbCBjYWxsIGl0LCBzbyB0aGF0IHNvbWUgbGFyZ2VyXG4gKiAgIHVuaXQgb2YgY29tcHV0YXRpb24sIGxpa2UgdGhlIGVuY2xvc2luZyB2YXQsIGNhbiBiZSBzaHV0ZG93biBiZWZvcmVcbiAqICAgYW55dGhpbmcgZWxzZSBpcyBjb3JydXB0ZWQgYnkgdGhhdCBjb3JydXB0ZWQgc3RhdGUuIFNlZVxuICogICBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM0MzRcbiAqIEBwYXJhbSB7T30gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7T1snZWxlbWVudFNoYXBlJ10gZXh0ZW5kcyBUeXBlZFBhdHRlcm48aW5mZXIgVCBleHRlbmRzIEtleT5cbiAqICAgICA/IElzc3VlcktpdDxLLCBUPlxuICogICAgIDogSXNzdWVyS2l0PEs+fVxuICovXG4gICAgICAgY29uc3QgcHJlcGFyZUlzc3VlcktpdCA9IChcbiAgaXNzdWVyQmFnZ2FnZSxcbiAgbmFtZSxcbiAgLyogQHRzLWV4cGVjdC1lcnJvciBLIGNvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGEgZGlmZmVyZW50IHN1YnR5cGUgb2YgQXNzZXRLaW5kKi9cbiAgYXNzZXRLaW5kID0gQXNzZXRLaW5kLk5BVCxcbiAgZGlzcGxheUluZm8gPSBoYXJkZW4oe30pLFxuICBvcHRTaHV0ZG93bldpdGhGYWlsdXJlID0gdW5kZWZpbmVkLFxuICAvKiBAdHMtZXhwZWN0LWVycm9yIGNvdWxkIGhhdmUgYSBkaWZmZXJlbnQgc3VidHlwZSBvZiBJc3N1ZXJPcHRpb25zUmVjb3JkKi9cbiAgb3B0aW9ucyA9IHt9LFxuKSA9PiB7XG4gIGlmIChoYXNJc3N1ZXIoaXNzdWVyQmFnZ2FnZSkpIHtcbiAgICBjb25zdCB7IGVsZW1lbnRTaGFwZTogXyA9IHVuZGVmaW5lZCwgcmVjb3ZlcnlTZXRzT3B0aW9uID0gdW5kZWZpbmVkIH0gPVxuICAgICAgb3B0aW9ucztcbiAgICBjb25zdCBpc3N1ZXJLaXQgPSB1cGdyYWRlSXNzdWVyS2l0KFxuICAgICAgaXNzdWVyQmFnZ2FnZSxcbiAgICAgIG9wdFNodXRkb3duV2l0aEZhaWx1cmUsXG4gICAgICByZWNvdmVyeVNldHNPcHRpb24sXG4gICAgKTtcblxuICAgIC8qIFRPRE8gY2hlY2sgY29uc2lzdGVuY3kgd2l0aCBuYW1lLCBhc3NldEtpbmQsIGRpc3BsYXlJbmZvLCBlbGVtZW50U2hhcGUuKi9cbiAgICAvKiBDb25zaXN0ZW5jeSBlaXRoZXIgbWVhbnMgdGhhdCB0aGVzZSBhcmUgdGhlIHNhbWUsIG9yIHRoYXQgdGhleSBkaWZmZXIqL1xuICAgIC8qIGluIGEgZGlyZWN0aW9uIHdlIGFyZSBwcmVwYXJlZCB0byB1cGdyYWRlLiBOb3RlIHRoYXQgaXQgaXMgdGhlKi9cbiAgICAvKiByZXNwb25zaWJpbGl0eSBvZiBgdXBncmFkZUlzc3VlcktpdGAgdG8gY2hlY2sgY29uc2lzdGVuY3kgb2YqL1xuICAgIC8qIGByZWNvdmVyeVNldHNPcHRpb25gLCBzbyBjb250aW51ZSB0byBub3QgZG8gdGhhdCBoZXJlLiovXG5cbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFR5cGUgcGFyYW1ldGVyIGNvbmZ1c2lvbi4qL1xuICAgIHJldHVybiBpc3N1ZXJLaXQ7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgaXNzdWVyS2l0ID0gbWFrZUR1cmFibGVJc3N1ZXJLaXQoXG4gICAgICBpc3N1ZXJCYWdnYWdlLFxuICAgICAgbmFtZSxcbiAgICAgIGFzc2V0S2luZCxcbiAgICAgIGRpc3BsYXlJbmZvLFxuICAgICAgb3B0U2h1dGRvd25XaXRoRmFpbHVyZSxcbiAgICAgIG9wdGlvbnMsXG4gICAgKTtcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QgdG8gdGhlIHR5cGUgcGFyYW1ldGVyKi9cbiAgICByZXR1cm4gaXNzdWVyS2l0O1xuICB9XG59OyRozY9fb25jZS5wcmVwYXJlSXNzdWVyS2l0KHByZXBhcmVJc3N1ZXJLaXQpO1xuaGFyZGVuKHByZXBhcmVJc3N1ZXJLaXQpO1xuXG4vKipcbiAqIFVzZWQgX29ubHlfIHRvIG1ha2UgYSBuZXcgaXNzdWVyS2l0IHRoYXQgaXMgZWZmZWN0aXZlbHkgbm9uLWR1cmFibGUuIFRoaXMgaXNcbiAqIGN1cnJlbnRseSBkb25lIGJ5IG1ha2luZyBhIGR1cmFibGUgb25lIGluIGEgYmFnZ2FnZSBub3QgcmVhY2hhYmxlIGZyb21cbiAqIGFueXdoZXJlLiBUT0RPIE9uY2UgcmVidWlsdCBvbiB6b25lcywgdGhpcyBzaG91bGQgaW5zdGVhZCBqdXN0IGJ1aWxkIG9uIHRoZVxuICogdmlydHVhbCB6b25lLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvNzExNlxuICpcbiAqIEN1cnJlbnRseSB1c2VkIGZvciB0ZXN0aW5nIG9ubHkuIFNob3VsZCBwcm9iYWJseSBjb250aW51ZSB0byBiZSB1c2VkIGZvclxuICogdGVzdGluZyBvbmx5LlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz0nbmF0J11cbiAqIEB0ZW1wbGF0ZSB7SXNzdWVyT3B0aW9uc1JlY29yZH0gW089e31dXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBUaGUgbmFtZSBiZWNvbWVzIHBhcnQgb2YgdGhlIGJyYW5kIGluIGFzc2V0XG4gKiAgIGRlc2NyaXB0aW9ucy4gVGhlIG5hbWUgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgYW5kIGRvdWJsZS1jaGVja2luZ1xuICogICBhc3N1bXB0aW9ucywgYnV0IHNob3VsZCBub3QgYmUgdHJ1c3RlZCB3cnQgYW55IGV4dGVybmFsIG5hbWVzcGFjZS4gRm9yXG4gKiAgIGV4YW1wbGUsIGFueW9uZSBjb3VsZCBjcmVhdGUgYSBuZXcgaXNzdWVyIGtpdCB3aXRoIG5hbWUgJ0JUQycsIGJ1dCBpdCBpc1xuICogICBub3QgYml0Y29pbiBvciBldmVuIHJlbGF0ZWQuIEl0IGlzIG9ubHkgdGhlIG5hbWUgYWNjb3JkaW5nIHRvIHRoYXQgaXNzdWVyXG4gKiAgIGFuZCBicmFuZC5cbiAqIEBwYXJhbSB7S30gW2Fzc2V0S2luZF0gVGhlIGFzc2V0S2luZCB3aWxsIGJlIHVzZWQgdG8gaW1wb3J0IGEgc3BlY2lmaWNcbiAqICAgbWF0aEhlbHBlcnMgZnJvbSB0aGUgbWF0aEhlbHBlcnMgbGlicmFyeS4gRm9yIGV4YW1wbGUsIG5hdE1hdGhIZWxwZXJzLCB0aGVcbiAqICAgZGVmYXVsdCwgaXMgdXNlZCBmb3IgYmFzaWMgZnVuZ2libGUgdG9rZW5zLlxuICogQHBhcmFtIHtBZGRpdGlvbmFsRGlzcGxheUluZm99IFtkaXNwbGF5SW5mb10gYGRpc3BsYXlJbmZvYCBnaXZlcyBpbmZvcm1hdGlvblxuICogICB0byB0aGUgVUkgb24gaG93IHRvIGRpc3BsYXkgdGhlIGFtb3VudC5cbiAqIEBwYXJhbSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gW29wdFNodXRkb3duV2l0aEZhaWx1cmVdIElmIHRoaXMgaXNzdWVyIGZhaWxzIGluXG4gKiAgIHRoZSBtaWRkbGUgb2YgYW4gYXRvbWljIGFjdGlvbiAod2hpY2ggYnR3IHNob3VsZCBuZXZlciBoYXBwZW4pLCBpdFxuICogICBwb3RlbnRpYWxseSBsZWF2ZXMgaXRzIGxlZGdlciBpbiBhIGNvcnJ1cHRlZCBzdGF0ZS4gSWYgdGhpcyBmdW5jdGlvbiB3YXNcbiAqICAgcHJvdmlkZWQsIHRoZW4gdGhlIGZhaWxlZCBhdG9taWMgYWN0aW9uIHdpbGwgY2FsbCBpdCwgc28gdGhhdCBzb21lIGxhcmdlclxuICogICB1bml0IG9mIGNvbXB1dGF0aW9uLCBsaWtlIHRoZSBlbmNsb3NpbmcgdmF0LCBjYW4gYmUgc2h1dGRvd24gYmVmb3JlXG4gKiAgIGFueXRoaW5nIGVsc2UgaXMgY29ycnVwdGVkIGJ5IHRoYXQgY29ycnVwdGVkIHN0YXRlLiBTZWVcbiAqICAgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNDM0XG4gKiBAcGFyYW0ge099IFtvcHRpb25zXVxuICogQHJldHVybnMge09bJ2VsZW1lbnRTaGFwZSddIGV4dGVuZHMgVHlwZWRQYXR0ZXJuPGluZmVyIFQgZXh0ZW5kcyBLZXk+XG4gKiAgICAgPyBJc3N1ZXJLaXQ8SywgVD5cbiAqICAgICA6IElzc3VlcktpdDxLPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VJc3N1ZXJLaXQgPSAoXG4gIG5hbWUsXG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgSyBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIGRpZmZlcmVudCBzdWJ0eXBlIG9mIEFzc2V0S2luZCovXG4gIGFzc2V0S2luZCA9IEFzc2V0S2luZC5OQVQsXG4gIGRpc3BsYXlJbmZvID0gaGFyZGVuKHt9KSxcbiAgb3B0U2h1dGRvd25XaXRoRmFpbHVyZSA9IHVuZGVmaW5lZCxcbiAgLyogQHRzLWV4cGVjdC1lcnJvciBPIGNvdWxkIGJlIGluc3RhbnRpYXRlZCB3aXRoIGEgZGlmZmVyZW50IHN1YnR5cGUqL1xuICB7IGVsZW1lbnRTaGFwZSA9IHVuZGVmaW5lZCwgcmVjb3ZlcnlTZXRzT3B0aW9uID0gdW5kZWZpbmVkIH0gPSB7fSxcbikgPT5cbiAgLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbiAgbWFrZUR1cmFibGVJc3N1ZXJLaXQoXG4gICAgbWFrZVNjYWxhckJpZ01hcFN0b3JlKCdkcm9wcGVkIGlzc3VlciBraXQnLCB7IGR1cmFibGU6IHRydWUgfSksXG4gICAgbmFtZSxcbiAgICBhc3NldEtpbmQsXG4gICAgZGlzcGxheUluZm8sXG4gICAgb3B0U2h1dGRvd25XaXRoRmFpbHVyZSxcbiAgICB7IGVsZW1lbnRTaGFwZSwgcmVjb3ZlcnlTZXRzT3B0aW9uIH0sXG4gICk7JGjNj19vbmNlLm1ha2VJc3N1ZXJLaXQobWFrZUlzc3VlcktpdCk7XG5oYXJkZW4obWFrZUlzc3VlcktpdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ1cGdyYWRlSXNzdWVyS2l0IjpbInVwZ3JhZGVJc3N1ZXJLaXQiXSwiaGFzSXNzdWVyIjpbImhhc0lzc3VlciJdLCJtYWtlRHVyYWJsZUlzc3VlcktpdCI6WyJtYWtlRHVyYWJsZUlzc3VlcktpdCJdLCJwcmVwYXJlSXNzdWVyS2l0IjpbInByZXBhcmVJc3N1ZXJLaXQiXSwibWFrZUlzc3VlcktpdCI6WyJtYWtlSXNzdWVyS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFTn3CUTBgAAEwYAADoAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJjb3B5QmFnTWF0aEhlbHBlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBrZXlFUSxtYWtlQ29weUJhZyxtdXN0TWF0Y2gsTSxnZXRDb3B5QmFnRW50cmllcyxiYWdJc1N1cGVyYmFnLGJhZ1VuaW9uLGJhZ0Rpc2pvaW50U3VidHJhY3Q7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJrZXlFUVwiLFskaM2PX2EgPT4gKGtleUVRID0gJGjNj19hKV1dLFtcIm1ha2VDb3B5QmFnXCIsWyRozY9fYSA9PiAobWFrZUNvcHlCYWcgPSAkaM2PX2EpXV0sW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcImdldENvcHlCYWdFbnRyaWVzXCIsWyRozY9fYSA9PiAoZ2V0Q29weUJhZ0VudHJpZXMgPSAkaM2PX2EpXV0sW1wiYmFnSXNTdXBlcmJhZ1wiLFskaM2PX2EgPT4gKGJhZ0lzU3VwZXJiYWcgPSAkaM2PX2EpXV0sW1wiYmFnVW5pb25cIixbJGjNj19hID0+IChiYWdVbmlvbiA9ICRozY9fYSldXSxbXCJiYWdEaXNqb2ludFN1YnRyYWN0XCIsWyRozY9fYSA9PiAoYmFnRGlzam9pbnRTdWJ0cmFjdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge01hdGhIZWxwZXJzfSBmcm9tICcuLi90eXBlcy5qcydcbiAqIEBpbXBvcnQge0NvcHlCYWd9IGZyb20gJ0BlbmRvL3BhdHRlcm5zJztcbiAqL1xuXG4vKiogQHR5cGUge0NvcHlCYWd9ICovXG5jb25zdCBlbXB0eSA9IG1ha2VDb3B5QmFnKFtdKTtcblxuLyoqIEB0eXBlIHtNYXRoSGVscGVyczxDb3B5QmFnPn0gKi9cbiAgICAgICBjb25zdCBjb3B5QmFnTWF0aEhlbHBlcnMgPSBoYXJkZW4oe1xuICBkb0NvZXJjZTogYmFnID0+IHtcbiAgICBtdXN0TWF0Y2goYmFnLCBNLmJhZygpLCAnYmFnIG9mIGFtb3VudCcpO1xuICAgIHJldHVybiBiYWc7XG4gIH0sXG4gIGRvTWFrZUVtcHR5OiAoKSA9PiBlbXB0eSxcbiAgZG9Jc0VtcHR5OiBiYWcgPT4gZ2V0Q29weUJhZ0VudHJpZXMoYmFnKS5sZW5ndGggPT09IDAsXG4gIGRvSXNHVEU6IGJhZ0lzU3VwZXJiYWcsXG4gIGRvSXNFcXVhbDoga2V5RVEsXG4gIGRvQWRkOiBiYWdVbmlvbixcbiAgZG9TdWJ0cmFjdDogYmFnRGlzam9pbnRTdWJ0cmFjdCxcbn0pOyRozY9fb25jZS5jb3B5QmFnTWF0aEhlbHBlcnMoY29weUJhZ01hdGhIZWxwZXJzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNvcHlCYWdNYXRoSGVscGVycyI6WyJjb3B5QmFnTWF0aEhlbHBlcnMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAWh3vSSYGAAAmBgAAOgAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbImNvcHlTZXRNYXRoSGVscGVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGtleUVRLG1ha2VDb3B5U2V0LG11c3RNYXRjaCxNLGdldENvcHlTZXRLZXlzLHNldElzU3VwZXJzZXQsc2V0RGlzam9pbnRVbmlvbixzZXREaXNqb2ludFN1YnRyYWN0OyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wia2V5RVFcIixbJGjNj19hID0+IChrZXlFUSA9ICRozY9fYSldXSxbXCJtYWtlQ29weVNldFwiLFskaM2PX2EgPT4gKG1ha2VDb3B5U2V0ID0gJGjNj19hKV1dLFtcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXSxbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJnZXRDb3B5U2V0S2V5c1wiLFskaM2PX2EgPT4gKGdldENvcHlTZXRLZXlzID0gJGjNj19hKV1dLFtcInNldElzU3VwZXJzZXRcIixbJGjNj19hID0+IChzZXRJc1N1cGVyc2V0ID0gJGjNj19hKV1dLFtcInNldERpc2pvaW50VW5pb25cIixbJGjNj19hID0+IChzZXREaXNqb2ludFVuaW9uID0gJGjNj19hKV1dLFtcInNldERpc2pvaW50U3VidHJhY3RcIixbJGjNj19hID0+IChzZXREaXNqb2ludFN1YnRyYWN0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7TWF0aEhlbHBlcnN9IGZyb20gJy4uL3R5cGVzLmpzJ1xuICogQGltcG9ydCB7Q29weVNldH0gZnJvbSAnQGVuZG8vcGF0dGVybnMnXG4gKi9cblxuLyoqIEB0eXBlIHtDb3B5U2V0fSAqL1xuY29uc3QgZW1wdHkgPSBtYWtlQ29weVNldChbXSk7XG5cbi8qKiBAdHlwZSB7TWF0aEhlbHBlcnM8Q29weVNldD59ICovXG4gICAgICAgY29uc3QgY29weVNldE1hdGhIZWxwZXJzID0gaGFyZGVuKHtcbiAgZG9Db2VyY2U6IHNldCA9PiB7XG4gICAgbXVzdE1hdGNoKHNldCwgTS5zZXQoKSwgJ3NldCBvZiBhbW91bnQnKTtcbiAgICByZXR1cm4gc2V0O1xuICB9LFxuICBkb01ha2VFbXB0eTogKCkgPT4gZW1wdHksXG4gIGRvSXNFbXB0eTogc2V0ID0+IGdldENvcHlTZXRLZXlzKHNldCkubGVuZ3RoID09PSAwLFxuICBkb0lzR1RFOiBzZXRJc1N1cGVyc2V0LFxuICBkb0lzRXF1YWw6IGtleUVRLFxuICBkb0FkZDogc2V0RGlzam9pbnRVbmlvbixcbiAgZG9TdWJ0cmFjdDogc2V0RGlzam9pbnRTdWJ0cmFjdCxcbn0pOyRozY9fb25jZS5jb3B5U2V0TWF0aEhlbHBlcnMoY29weVNldE1hdGhIZWxwZXJzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNvcHlTZXRNYXRoSGVscGVycyI6WyJjb3B5U2V0TWF0aEhlbHBlcnMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAGfMtfs8GAADPBgAANgAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9uYXQiXSwiZXhwb3J0cyI6WyJuYXRNYXRoSGVscGVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsTmF0LGlzTmF0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsWyRozY9fYSA9PiAoTmF0ID0gJGjNj19hKV1dLFtcImlzTmF0XCIsWyRozY9fYSA9PiAoaXNOYXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKiogQGltcG9ydCB7TWF0aEhlbHBlcnMsIE5hdFZhbHVlfSBmcm9tICcuLi90eXBlcy5qcycgKi9cblxuY29uc3QgZW1wdHkgPSAwbjtcblxuLyoqXG4gKiBGdW5naWJsZSBkaWdpdGFsIGFzc2V0cyB1c2UgdGhlIG5hdE1hdGhIZWxwZXJzIHRvIG1hbmFnZSBiYWxhbmNlcyAtIHRoZVxuICogb3BlcmF0aW9ucyBhcmUgbWVyZWx5IGFyaXRobWV0aWMgb24gbmF0dXJhbCwgbm9uLW5lZ2F0aXZlIG51bWJlcnMuXG4gKlxuICogTmF0dXJhbCBudW1iZXJzIGFyZSB1c2VkIGZvciBmdW5naWJsZSBlcmlnaHRzIHN1Y2ggYXMgbW9uZXkgYmVjYXVzZSByb3VuZGluZ1xuICogaXNzdWVzIG1ha2UgZmxvYXRzIHByb2JsZW1hdGljLiBBbGwgb3BlcmF0aW9ucyBzaG91bGQgYmUgZG9uZSB3aXRoIHRoZVxuICogc21hbGxlc3Qgd2hvbGUgdW5pdCBzdWNoIHRoYXQgdGhlIGBuYXRNYXRoSGVscGVyc2AgbmV2ZXIgZGVhbHMgd2l0aFxuICogZnJhY3Rpb25hbCBwYXJ0cy5cbiAqXG4gKiBAdHlwZSB7TWF0aEhlbHBlcnM8TmF0VmFsdWU+fVxuICovXG4gICAgICAgY29uc3QgbmF0TWF0aEhlbHBlcnMgPSBoYXJkZW4oe1xuICBkb0NvZXJjZTogbmF0ID0+IHtcbiAgICAvKiBUT0RPOiB0aWdodGVuIHRoZSBkZWZpbml0aW9uIG9mIE5hdCBpbiBAYWdvcmljL25hdCB0byB0aHJvdyBvbiBgbnVtYmVyYCovXG4gICAgYXNzZXJ0LnR5cGVvZihuYXQsICdiaWdpbnQnKTtcbiAgICBpc05hdChuYXQpIHx8IEZhaWxgdmFsdWUgJHtuYXR9IG11c3QgYmUgYSBuYXR1cmFsIG51bWJlcmA7XG4gICAgcmV0dXJuIE5hdChuYXQpO1xuICB9LFxuICBkb01ha2VFbXB0eTogKCkgPT4gZW1wdHksXG4gIGRvSXNFbXB0eTogbmF0ID0+IG5hdCA9PT0gZW1wdHksXG4gIGRvSXNHVEU6IChsZWZ0LCByaWdodCkgPT4gbGVmdCA+PSByaWdodCxcbiAgZG9Jc0VxdWFsOiAobGVmdCwgcmlnaHQpID0+IGxlZnQgPT09IHJpZ2h0LFxuICAvKiBCaWdJbnRzIGRvbid0IG9ic2VydmFibHkgb3ZlcmZsb3cqL1xuICBkb0FkZDogKGxlZnQsIHJpZ2h0KSA9PiBsZWZ0ICsgcmlnaHQsXG4gIGRvU3VidHJhY3Q6IChsZWZ0LCByaWdodCkgPT4gTmF0KGxlZnQgLSByaWdodCksXG59KTskaM2PX29uY2UubmF0TWF0aEhlbHBlcnMobmF0TWF0aEhlbHBlcnMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibmF0TWF0aEhlbHBlcnMiOlsibmF0TWF0aEhlbHBlcnMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAPdw1//0HAAD9BwAANgAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbInNldE1hdGhIZWxwZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcGFzc1N0eWxlT2YsYXNzZXJ0S2V5LGVsZW1lbnRzSXNTdXBlcnNldCxlbGVtZW50c0Rpc2pvaW50VW5pb24sZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0LGNvZXJjZVRvRWxlbWVudHMsZWxlbWVudHNDb21wYXJlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImFzc2VydEtleVwiLFskaM2PX2EgPT4gKGFzc2VydEtleSA9ICRozY9fYSldXSxbXCJlbGVtZW50c0lzU3VwZXJzZXRcIixbJGjNj19hID0+IChlbGVtZW50c0lzU3VwZXJzZXQgPSAkaM2PX2EpXV0sW1wiZWxlbWVudHNEaXNqb2ludFVuaW9uXCIsWyRozY9fYSA9PiAoZWxlbWVudHNEaXNqb2ludFVuaW9uID0gJGjNj19hKV1dLFtcImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdFwiLFskaM2PX2EgPT4gKGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCA9ICRozY9fYSldXSxbXCJjb2VyY2VUb0VsZW1lbnRzXCIsWyRozY9fYSA9PiAoY29lcmNlVG9FbGVtZW50cyA9ICRozY9fYSldXSxbXCJlbGVtZW50c0NvbXBhcmVcIixbJGjNj19hID0+IChlbGVtZW50c0NvbXBhcmUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAaW1wb3J0IHtNYXRoSGVscGVycywgU2V0VmFsdWV9IGZyb20gJy4uL3R5cGVzLmpzJyAqL1xuXG4vKiBPcGVyYXRpb25zIGZvciBhcnJheXMgd2l0aCB1bmlxdWUgb2JqZWN0cyBpZGVudGlmeWluZyBhbmQgcHJvdmlkaW5nKi9cbi8qIGluZm9ybWF0aW9uIGFib3V0IGRpZ2l0YWwgYXNzZXRzLiBVc2VkIGZvciBab2UgaW52aXRlcy4qL1xuLyoqIEB0eXBlIHtTZXRWYWx1ZX0gKi9cbmNvbnN0IGVtcHR5ID0gaGFyZGVuKFtdKTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBSZXBsYWNlIGFycmF5LWJhc2VkIFNldE1hdGggd2l0aCBDb3B5U2V0LWJhc2VkIENvcHlTZXRNYXRoXG4gKiBAdHlwZSB7TWF0aEhlbHBlcnM8U2V0VmFsdWU+fVxuICovXG4gICAgICAgY29uc3Qgc2V0TWF0aEhlbHBlcnMgPSBoYXJkZW4oe1xuICBkb0NvZXJjZTogbGlzdCA9PiB7XG4gICAgbGlzdCA9IGNvZXJjZVRvRWxlbWVudHMobGlzdCk7XG4gICAgLyogQXNzZXJ0IHRoYXQgbGlzdCBjb250YWlucyBvbmx5Ki9cbiAgICAvKiAqIHBhc3MtYnktY29weSBwcmltaXRpdmVzLCovXG4gICAgLyogKiBwYXNzLWJ5LWNvcHkgY29udGFpbmVycyBjb250YWluaW5nIGtleXMsKi9cbiAgICAvKiAqIHJlbW90YWJsZXMuKi9cbiAgICBhc3NlcnRLZXkobGlzdCk7XG4gICAgcmV0dXJuIGxpc3Q7XG4gIH0sXG4gIGRvTWFrZUVtcHR5OiAoKSA9PiBlbXB0eSxcbiAgZG9Jc0VtcHR5OiBsaXN0ID0+IHBhc3NTdHlsZU9mKGxpc3QpID09PSAnY29weUFycmF5JyAmJiBsaXN0Lmxlbmd0aCA9PT0gMCxcbiAgZG9Jc0dURTogZWxlbWVudHNJc1N1cGVyc2V0LFxuICBkb0lzRXF1YWw6ICh4LCB5KSA9PiBlbGVtZW50c0NvbXBhcmUoeCwgeSkgPT09IDAsXG4gIGRvQWRkOiBlbGVtZW50c0Rpc2pvaW50VW5pb24sXG4gIGRvU3VidHJhY3Q6IGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCxcbn0pOyRozY9fb25jZS5zZXRNYXRoSGVscGVycyhzZXRNYXRoSGVscGVycyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzZXRNYXRoSGVscGVycyI6WyJzZXRNYXRoSGVscGVycyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAycsRKWAUAAFgFAAAjAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3BheW1lbnQuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbInByZXBhcmVQYXltZW50S2luZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGluaXRFbXB0eTskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImluaXRFbXB0eVwiLFskaM2PX2EgPT4gKGluaXRFbXB0eSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0Fzc2V0S2luZCwgQnJhbmQsIFBheW1lbnR9IGZyb20gJy4vdHlwZXMuanMnXG4gKiBAaW1wb3J0IHtab25lfSBmcm9tICdAYWdvcmljL3pvbmUnO1xuICogQGltcG9ydCB7SW50ZXJmYWNlR3VhcmR9IGZyb20gJ0BlbmRvL3BhdHRlcm5zJztcbiAqL1xuXG4vKiBUT0RPIFR5cGUgSW50ZXJmYWNlR3VhcmQgYmV0dGVyIHRoYW4gSW50ZXJmYWNlR3VhcmQ8YW55PiovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge1pvbmV9IGlzc3VlclpvbmVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBicmFuZFxuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZDxhbnk+fSBQYXltZW50SVxuICogQHJldHVybnMgeygpID0+IFBheW1lbnQ8SywgYW55Pn1cbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVQYXltZW50S2luZCA9IChpc3N1ZXJab25lLCBuYW1lLCBicmFuZCwgUGF5bWVudEkpID0+IHtcbiAgY29uc3QgbWFrZVBheW1lbnQgPSBpc3N1ZXJab25lLmV4b0NsYXNzKFxuICAgIGAke25hbWV9IHBheW1lbnRgLFxuICAgIFBheW1lbnRJLFxuICAgIGluaXRFbXB0eSxcbiAgICB7XG4gICAgICBnZXRBbGxlZ2VkQnJhbmQoKSB7XG4gICAgICAgIHJldHVybiBicmFuZDtcbiAgICAgIH0sXG4gICAgfSxcbiAgKTtcbiAgLyogQHRzLWV4cGVjdC1lcnJvciBbdGFnXSBmb3IgdGFnZ2VkIHR5cGUgbm90IGRlZmluZWQgaW4gcnVudGltZSovXG4gIHJldHVybiBtYWtlUGF5bWVudDtcbn07JGjNj19vbmNlLnByZXBhcmVQYXltZW50S2luZChwcmVwYXJlUGF5bWVudEtpbmQpO1xuaGFyZGVuKHByZXBhcmVQYXltZW50S2luZCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwcmVwYXJlUGF5bWVudEtpbmQiOlsicHJlcGFyZVBheW1lbnRLaW5kIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANgnSHa+NgAAvjYAACkAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvcGF5bWVudExlZGdlci5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9wcm9taXNlLWtpdCIsIkBlbmRvL3BhdHRlcm5zIiwiLi9hbW91bnRNYXRoLmpzIiwiLi9wYXltZW50LmpzIiwiLi9wdXJzZS5qcyIsIi4vdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbInByZXBhcmVQYXltZW50TGVkZ2VyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxGYWlsLGFubm90YXRlRXJyb3IsWCxpc1Byb21pc2UsbXVzdE1hdGNoLE0sa2V5RVEsQW1vdW50TWF0aCxwcmVwYXJlUGF5bWVudEtpbmQscHJlcGFyZVB1cnNlS2luZCxCcmFuZEksbWFrZUlzc3VlckludGVyZmFjZXM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcImFubm90YXRlRXJyb3JcIixbJGjNj19hID0+IChhbm5vdGF0ZUVycm9yID0gJGjNj19hKV1dLFtcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLFskaM2PX2EgPT4gKGlzUHJvbWlzZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV0sW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wia2V5RVFcIixbJGjNj19hID0+IChrZXlFUSA9ICRozY9fYSldXV1dLFtcIi4vYW1vdW50TWF0aC5qc1wiLCBbW1wiQW1vdW50TWF0aFwiLFskaM2PX2EgPT4gKEFtb3VudE1hdGggPSAkaM2PX2EpXV1dXSxbXCIuL3BheW1lbnQuanNcIiwgW1tcInByZXBhcmVQYXltZW50S2luZFwiLFskaM2PX2EgPT4gKHByZXBhcmVQYXltZW50S2luZCA9ICRozY9fYSldXV1dLFtcIi4vcHVyc2UuanNcIiwgW1tcInByZXBhcmVQdXJzZUtpbmRcIixbJGjNj19hID0+IChwcmVwYXJlUHVyc2VLaW5kID0gJGjNj19hKV1dXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJCcmFuZElcIixbJGjNj19hID0+IChCcmFuZEkgPSAkaM2PX2EpXV0sW1wibWFrZUlzc3VlckludGVyZmFjZXNcIixbJGjNj19hID0+IChtYWtlSXNzdWVySW50ZXJmYWNlcyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0tleSwgUGF0dGVybn0gZnJvbSAnQGVuZG8vcGF0dGVybnMnO1xuICogQGltcG9ydCB7Wm9uZX0gZnJvbSAnQGFnb3JpYy9iYXNlLXpvbmUnO1xuICogQGltcG9ydCB7VHlwZWRQYXR0ZXJufSBmcm9tICdAYWdvcmljL2ludGVybmFsJztcbiAqIEBpbXBvcnQge1NodXRkb3duV2l0aEZhaWx1cmV9IGZyb20gJ0BhZ29yaWMvc3dpbmdzZXQtdmF0JztcbiAqIEBpbXBvcnQge0Ftb3VudFN0b3JlfSBmcm9tICcuL2Ftb3VudFN0b3JlLmpzJztcbiAqIEBpbXBvcnQge0Ftb3VudCwgQXNzZXRLaW5kLCBEaXNwbGF5SW5mbywgUGF5bWVudExlZGdlciwgUGF5bWVudCwgQnJhbmQsIFJlY292ZXJ5U2V0c09wdGlvbiwgUHVyc2UsIElzc3VlciwgTWludH0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtXZWFrTWFwU3RvcmV9IGZyb20gJ0BhZ29yaWMvc3RvcmUnO1xuICogQGltcG9ydCB7U2V0U3RvcmV9IGZyb20gJ0BhZ29yaWMvc3RvcmUnO1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QnJhbmR9IGJyYW5kXG4gKiBAcGFyYW0ge0t9IGFzc2V0S2luZFxuICogQHBhcmFtIHtQYXR0ZXJufSBlbGVtZW50U2hhcGVcbiAqIEByZXR1cm5zIHtUeXBlZFBhdHRlcm48QW1vdW50PEs+Pn1cbiAqL1xuY29uc3QgYW1vdW50U2hhcGVGcm9tRWxlbWVudFNoYXBlID0gKGJyYW5kLCBhc3NldEtpbmQsIGVsZW1lbnRTaGFwZSkgPT4ge1xuICBsZXQgdmFsdWVTaGFwZTtcbiAgc3dpdGNoIChhc3NldEtpbmQpIHtcbiAgICBjYXNlICduYXQnOiB7XG4gICAgICB2YWx1ZVNoYXBlID0gTS5uYXQoKTtcbiAgICAgIGVsZW1lbnRTaGFwZSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIEZhaWxgRnVuZ2libGUgYXNzZXRzIGNhbm5vdCBoYXZlIGFuIGVsZW1lbnRTaGFwZTogJHtxKGVsZW1lbnRTaGFwZSl9YDtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgICBjYXNlICdzZXQnOiB7XG4gICAgICBpZiAoZWxlbWVudFNoYXBlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgdmFsdWVTaGFwZSA9IE0uYXJyYXlPZihNLmtleSgpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlU2hhcGUgPSBNLmFycmF5T2YoTS5hbmQoTS5rZXkoKSwgZWxlbWVudFNoYXBlKSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAnY29weVNldCc6IHtcbiAgICAgIGlmIChlbGVtZW50U2hhcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YWx1ZVNoYXBlID0gTS5zZXQoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlU2hhcGUgPSBNLnNldE9mKGVsZW1lbnRTaGFwZSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgY2FzZSAnY29weUJhZyc6IHtcbiAgICAgIGlmIChlbGVtZW50U2hhcGUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YWx1ZVNoYXBlID0gTS5iYWcoKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlU2hhcGUgPSBNLmJhZ09mKGVsZW1lbnRTaGFwZSk7XG4gICAgICB9XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgRmFpbGB1bmV4cGVjdGVkIGFzc2V0IGtpbmQgJHtxKGFzc2V0S2luZCl9YDtcbiAgICB9XG4gIH1cblxuICBjb25zdCBhbW91bnRTaGFwZSA9IGhhcmRlbih7XG4gICAgYnJhbmQsIC8qIG1hdGNoZXMgb25seSB0aGlzIGV4YWN0IGJyYW5kKi9cbiAgICB2YWx1ZTogdmFsdWVTaGFwZSxcbiAgfSk7XG4gIHJldHVybiBhbW91bnRTaGFwZTtcbn07XG5cbi8qKlxuICogTWFrZSB0aGUgcGF5bWVudExlZGdlciwgdGhlIHNvdXJjZSBvZiB0cnV0aCBmb3IgdGhlIGJhbGFuY2VzIG9mIHBheW1lbnRzLiBBbGxcbiAqIG1pbnRpbmcgYW5kIHRyYW5zZmVyIGF1dGhvcml0eSBvcmlnaW5hdGVzIGhlcmUuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7Wm9uZX0gaXNzdWVyWm9uZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7S30gYXNzZXRLaW5kXG4gKiBAcGFyYW0ge0Rpc3BsYXlJbmZvPEs+fSBkaXNwbGF5SW5mb1xuICogQHBhcmFtIHtQYXR0ZXJufSBlbGVtZW50U2hhcGVcbiAqIEBwYXJhbSB7UmVjb3ZlcnlTZXRzT3B0aW9ufSByZWNvdmVyeVNldHNTdGF0ZVxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlfSBbb3B0U2h1dGRvd25XaXRoRmFpbHVyZV1cbiAqIEByZXR1cm5zIHtQYXltZW50TGVkZ2VyPEs+fVxuICovXG4gICAgICAgY29uc3QgcHJlcGFyZVBheW1lbnRMZWRnZXIgPSAoXG4gIGlzc3VlclpvbmUsXG4gIG5hbWUsXG4gIGFzc2V0S2luZCxcbiAgZGlzcGxheUluZm8sXG4gIGVsZW1lbnRTaGFwZSxcbiAgcmVjb3ZlcnlTZXRzU3RhdGUsXG4gIG9wdFNodXRkb3duV2l0aEZhaWx1cmUgPSB1bmRlZmluZWQsXG4pID0+IHtcbiAgLyoqIEB0eXBlIHtCcmFuZDxLPn0gKi9cbiAgLyogQHRzLWV4cGVjdC1lcnJvciBYWFggY2FsbFdoZW4qL1xuICBjb25zdCBicmFuZCA9IGlzc3VlclpvbmUuZXhvKGAke25hbWV9IGJyYW5kYCwgQnJhbmRJLCB7XG4gICAgaXNNeUlzc3VlcihhbGxlZ2VkSXNzdWVyKSB7XG4gICAgICAvKiBCcmFuZEkgZGVsYXlzIGNhbGxpbmcgdGhpcyBtZXRob2QgdW50aWwgYGFsbGVnZWRJc3N1ZXJgIGlzIGEgUmVtb3RhYmxlKi9cbiAgICAgIHJldHVybiBhbGxlZ2VkSXNzdWVyID09PSBpc3N1ZXI7XG4gICAgfSxcbiAgICBnZXRBbGxlZ2VkTmFtZSgpIHtcbiAgICAgIHJldHVybiBuYW1lO1xuICAgIH0sXG4gICAgLyogR2l2ZSBpbmZvcm1hdGlvbiB0byBVSSBvbiBob3cgdG8gZGlzcGxheSB0aGUgYW1vdW50LiovXG4gICAgZ2V0RGlzcGxheUluZm8oKSB7XG4gICAgICByZXR1cm4gZGlzcGxheUluZm87XG4gICAgfSxcbiAgICBnZXRBbW91bnRTaGFwZSgpIHtcbiAgICAgIHJldHVybiBhbW91bnRTaGFwZTtcbiAgICB9LFxuICB9KTtcblxuICBjb25zdCBhbW91bnRTaGFwZSA9IGFtb3VudFNoYXBlRnJvbUVsZW1lbnRTaGFwZShcbiAgICBicmFuZCxcbiAgICBhc3NldEtpbmQsXG4gICAgZWxlbWVudFNoYXBlLFxuICApO1xuXG4gIGNvbnN0IHsgSXNzdWVySSwgTWludEksIFBheW1lbnRJLCBQdXJzZUlLaXQgfSA9IG1ha2VJc3N1ZXJJbnRlcmZhY2VzKFxuICAgIGJyYW5kLFxuICAgIGFzc2V0S2luZCxcbiAgICBhbW91bnRTaGFwZSxcbiAgKTtcblxuICBjb25zdCBtYWtlUGF5bWVudCA9IHByZXBhcmVQYXltZW50S2luZChpc3N1ZXJab25lLCBuYW1lLCBicmFuZCwgUGF5bWVudEkpO1xuXG4gIC8qKiBAdHlwZSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gKi9cbiAgY29uc3Qgc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZSA9IHJlYXNvbiA9PiB7XG4gICAgLyogVE9ETyBUaGlzIHNob3VsZCBhbHNvIGRlc3Ryb3kgbGVkZ2VyIHN0YXRlLiovXG4gICAgLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzQzNCovXG4gICAgaWYgKG9wdFNodXRkb3duV2l0aEZhaWx1cmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgb3B0U2h1dGRvd25XaXRoRmFpbHVyZShyZWFzb24pO1xuICAgICAgfSBjYXRjaCAoZXJySW5TaHV0ZG93bikge1xuICAgICAgICBhbm5vdGF0ZUVycm9yKGVyckluU2h1dGRvd24sIFhgQ2F1c2VkIGJ5OiAke3JlYXNvbn1gKTtcbiAgICAgICAgdGhyb3cgZXJySW5TaHV0ZG93bjtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhyb3cgcmVhc29uO1xuICB9O1xuXG4gIC8qKiBAdHlwZSB7V2Vha01hcFN0b3JlPFBheW1lbnQsIEFtb3VudD59ICovXG4gIGNvbnN0IHBheW1lbnRMZWRnZXIgPSBpc3N1ZXJab25lLndlYWtNYXBTdG9yZSgncGF5bWVudExlZGdlcicsIHtcbiAgICB2YWx1ZVNoYXBlOiBhbW91bnRTaGFwZSxcbiAgfSk7XG5cbiAgLyoqXG4gKiBBIChub24tZW1wdHkpIHdpdGhkcmF3biBsaXZlIHBheW1lbnQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWNvdmVyeSBzZXQgb2ZcbiAqIHRoZSBwdXJzZSBpdCB3YXMgd2l0aGRyYXduIGZyb20uIExldCdzIGNhbGwgdGhlc2UgXCJyZWNvdmVyYWJsZVwiIHBheW1lbnRzLlxuICogQWxsIHJlY292ZXJhYmxlIHBheW1lbnRzIGFyZSBsaXZlLCBidXQgbm90IGFsbCBsaXZlIHBheW1lbnRzIGFyZVxuICogcmVjb3ZlcmFibGUuIFdlIGRvIHRoZSBib29ra2VlcGluZyBmb3IgcGF5bWVudCByZWNvdmVyeSB3aXRoIHRoaXMgd2Vha21hcFxuICogZnJvbSByZWNvdmVyYWJsZSBwYXltZW50cyB0byB0aGUgcmVjb3Zlcnkgc2V0IHRoZXkgYXJlIGluLiBBIGJ1bmNoIG9mXG4gKiBpbnRlcmVzdGluZyBpbnZhcmlhbnRzIGhlcmU6XG4gKlxuICogLSBFdmVyeSBwYXltZW50IHRoYXQgaXMgYSBrZXkgaW4gdGhlIG91dGVyIGBwYXltZW50UmVjb3ZlcnlTZXRzYCB3ZWFrTWFwIGlzXG4gKiAgIGFsc28gaW4gdGhlIHJlY292ZXJ5IHNldCBpbmRleGVkIGJ5IHRoYXQgcGF5bWVudC5cbiAqIC0gSW1wbGllZCBieSB0aGUgYWJvdmUgYnV0IHdvcnRoIHN0YXRpbmc6IHRoZSBwYXltZW50IGlzIG9ubHkgaW4gYXQgbW9zdCBvbmVcbiAqICAgcmVjb3Zlcnkgc2V0LlxuICogLSBBIHJlY292ZXJ5IHNldCBvbmx5IGNvbnRhaW5zIHN1Y2ggcGF5bWVudHMuXG4gKiAtIEV2ZXJ5IHB1cnNlIGlzIGFzc29jaWF0ZWQgd2l0aCBleGFjdGx5IG9uZSByZWNvdmVyeSBzZXQgdW5pcXVlIHRvIGl0LlxuICogLSBBIHB1cnNlJ3MgcmVjb3Zlcnkgc2V0IG9ubHkgY29udGFpbnMgcGF5bWVudHMgd2l0aGRyYXduIGZyb20gdGhhdCBwdXJzZSBhbmRcbiAqICAgbm90IHlldCBjb25zdW1lZC5cbiAqXG4gKiBJZiBgcmVjb3ZlcnlTZXRzU3RhdGUgPT09ICdub1JlY292ZXJ5U2V0cydgLCB0aGVuIG5vdGhpbmcgc2hvdWxkIGV2ZXIgYmVcbiAqIGFkZGVkIHRvIHRoaXMgV2Vha1N0b3JlLlxuICpcbiAqIEB0eXBlIHtXZWFrTWFwU3RvcmU8UGF5bWVudCwgU2V0U3RvcmU8UGF5bWVudD4+fVxuICovXG4gIGNvbnN0IHBheW1lbnRSZWNvdmVyeVNldHMgPSBpc3N1ZXJab25lLndlYWtNYXBTdG9yZSgncGF5bWVudFJlY292ZXJ5U2V0cycpO1xuXG4gIC8qKlxuICogVG8gbWFpbnRhaW4gdGhlIGludmFyaWFudHMgbGlzdGVkIGluIHRoZSBgcGF5bWVudFJlY292ZXJ5U2V0c2AgY29tbWVudCxcbiAqIGBpbml0UGF5bWVudGAgc2hvdWxkIGNvbnRhaW4gdGhlIG9ubHkgY2FsbCB0byBgcGF5bWVudExlZGdlci5pbml0YC5cbiAqXG4gKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnRcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRcbiAqIEBwYXJhbSB7U2V0U3RvcmU8UGF5bWVudD59IFtvcHRSZWNvdmVyeVNldF1cbiAqL1xuICBjb25zdCBpbml0UGF5bWVudCA9IChwYXltZW50LCBhbW91bnQsIG9wdFJlY292ZXJ5U2V0ID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgaWYgKHJlY292ZXJ5U2V0c1N0YXRlID09PSAnbm9SZWNvdmVyeVNldHMnKSB7XG4gICAgICBvcHRSZWNvdmVyeVNldCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgIEZhaWxgd2hlbiByZWNvdmVyU2V0c1N0YXRlID09PSAnbm9SZWNvdmVyeVNldHMnLCBvcHRSZWNvdmVyeVNldCBtdXN0IGJlIGVtcHR5YDtcbiAgICB9XG4gICAgaWYgKG9wdFJlY292ZXJ5U2V0ICE9PSB1bmRlZmluZWQgJiYgIUFtb3VudE1hdGguaXNFbXB0eShhbW91bnQpKSB7XG4gICAgICBvcHRSZWNvdmVyeVNldC5hZGQocGF5bWVudCk7XG4gICAgICBwYXltZW50UmVjb3ZlcnlTZXRzLmluaXQocGF5bWVudCwgb3B0UmVjb3ZlcnlTZXQpO1xuICAgIH1cbiAgICBwYXltZW50TGVkZ2VyLmluaXQocGF5bWVudCwgYW1vdW50KTtcbiAgfTtcblxuICAvKipcbiAqIFRvIG1haW50YWluIHRoZSBpbnZhcmlhbnRzIGxpc3RlZCBpbiB0aGUgYHBheW1lbnRSZWNvdmVyeVNldHNgIGNvbW1lbnQsXG4gKiBgZGVsZXRlUGF5bWVudGAgc2hvdWxkIGNvbnRhaW4gdGhlIG9ubHkgY2FsbCB0byBgcGF5bWVudExlZGdlci5kZWxldGVgLlxuICpcbiAqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudFxuICovXG4gIGNvbnN0IGRlbGV0ZVBheW1lbnQgPSBwYXltZW50ID0+IHtcbiAgICBwYXltZW50TGVkZ2VyLmRlbGV0ZShwYXltZW50KTtcbiAgICBpZiAocGF5bWVudFJlY292ZXJ5U2V0cy5oYXMocGF5bWVudCkpIHtcbiAgICAgIGNvbnN0IHJlY292ZXJ5U2V0ID0gcGF5bWVudFJlY292ZXJ5U2V0cy5nZXQocGF5bWVudCk7XG4gICAgICBwYXltZW50UmVjb3ZlcnlTZXRzLmRlbGV0ZShwYXltZW50KTtcbiAgICAgIHJlY292ZXJ5U2V0LmRlbGV0ZShwYXltZW50KTtcbiAgICB9XG4gIH07XG5cbiAgLyoqIEB0eXBlIHsoYWxsZWdlZEFtb3VudDogQW1vdW50KSA9PiBBbW91bnR9ICovXG4gIGNvbnN0IGNvZXJjZSA9IGFsbGVnZWRBbW91bnQgPT4gQW1vdW50TWF0aC5jb2VyY2UoYnJhbmQsIGFsbGVnZWRBbW91bnQpO1xuICAvKiogQHR5cGUgeyhsZWZ0OiBBbW91bnQsIHJpZ2h0OiBBbW91bnQpID0+IGJvb2xlYW59ICovXG5cbiAgLyoqXG4gKiBNZXRob2RzIGxpa2UgZGVwb3NpdCgpIGhhdmUgYW4gb3B0aW9uYWwgc2Vjb25kIHBhcmFtZXRlciBgb3B0QW1vdW50U2hhcGVgXG4gKiB3aGljaCwgaWYgcHJlc2VudCwgaXMgc3VwcG9zZWQgdG8gbWF0Y2ggdGhlIGJhbGFuY2Ugb2YgdGhlIHBheW1lbnQuIFRoaXNcbiAqIGhlbHBlciBmdW5jdGlvbiBkb2VzIHRoYXQgY2hlY2suXG4gKlxuICogTm90ZTogYG9wdEFtb3VudFNoYXBlYCBpcyB1c2VyLXN1cHBsaWVkIHdpdGggbm8gcHJldmlvdXMgdmFsaWRhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0Ftb3VudH0gcGF5bWVudEJhbGFuY2VcbiAqIEBwYXJhbSB7UGF0dGVybn0gW29wdEFtb3VudFNoYXBlXVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbiAgY29uc3QgYXNzZXJ0QW1vdW50Q29uc2lzdGVudCA9IChwYXltZW50QmFsYW5jZSwgb3B0QW1vdW50U2hhcGUpID0+IHtcbiAgICBpZiAob3B0QW1vdW50U2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbXVzdE1hdGNoKHBheW1lbnRCYWxhbmNlLCBvcHRBbW91bnRTaGFwZSwgJ2Ftb3VudCcpO1xuICAgIH1cbiAgfTtcblxuICAvKipcbiAqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudFxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbiAgY29uc3QgYXNzZXJ0TGl2ZVBheW1lbnQgPSBwYXltZW50ID0+IHtcbiAgICBwYXltZW50TGVkZ2VyLmhhcyhwYXltZW50KSB8fFxuICAgICAgRmFpbGAke3BheW1lbnR9IHdhcyBub3QgYSBsaXZlIHBheW1lbnQgZm9yIGJyYW5kICR7cShcbiAgICAgICAgYnJhbmQsXG4gICAgICApfS4gSXQgY291bGQgYmUgYSB1c2VkLXVwIHBheW1lbnQsIGEgcGF5bWVudCBmb3IgYW5vdGhlciBicmFuZCwgb3IgaXQgbWlnaHQgbm90IGJlIGEgcGF5bWVudCBhdCBhbGwuYDtcbiAgfTtcblxuICAvKipcbiAqIFVzZWQgYnkgdGhlIHB1cnNlIGNvZGUgdG8gaW1wbGVtZW50IHB1cnNlLmRlcG9zaXRcbiAqXG4gKiBAcGFyYW0ge0Ftb3VudFN0b3JlfSBiYWxhbmNlU3RvcmVcbiAqIEBwYXJhbSB7UGF5bWVudH0gc3JjUGF5bWVudFxuICogQHBhcmFtIHtQYXR0ZXJufSBbb3B0QW1vdW50U2hhcGVdXG4gKiBAcmV0dXJucyB7QW1vdW50fVxuICovXG4gIGNvbnN0IGRlcG9zaXRJbnRlcm5hbCA9IChcbiAgICBiYWxhbmNlU3RvcmUsXG4gICAgc3JjUGF5bWVudCxcbiAgICBvcHRBbW91bnRTaGFwZSA9IHVuZGVmaW5lZCxcbiAgKSA9PiB7XG4gICAgIWlzUHJvbWlzZShzcmNQYXltZW50KSB8fFxuICAgICAgYXNzZXJ0LmZhaWwoXG4gICAgICAgIGBkZXBvc2l0IGRvZXMgbm90IGFjY2VwdCBwcm9taXNlcyBhcyBmaXJzdCBhcmd1bWVudC4gSW5zdGVhZCBvZiBwYXNzaW5nIHRoZSBwcm9taXNlIChkZXBvc2l0KHBheW1lbnRQcm9taXNlKSksIGNvbnNpZGVyIHVud3JhcHBpbmcgdGhlIHByb21pc2UgZmlyc3Q6IEUud2hlbihwYXltZW50UHJvbWlzZSwgKGFjdHVhbFBheW1lbnQgPT4gZGVwb3NpdChhY3R1YWxQYXltZW50KSlgLFxuICAgICAgICBUeXBlRXJyb3IsXG4gICAgICApO1xuICAgIGFzc2VydExpdmVQYXltZW50KHNyY1BheW1lbnQpO1xuICAgIGNvbnN0IHNyY1BheW1lbnRCYWxhbmNlID0gcGF5bWVudExlZGdlci5nZXQoc3JjUGF5bWVudCk7XG4gICAgYXNzZXJ0QW1vdW50Q29uc2lzdGVudChzcmNQYXltZW50QmFsYW5jZSwgb3B0QW1vdW50U2hhcGUpO1xuICAgIHRyeSB7XG4gICAgICAvKiBDT01NSVQgUE9JTlQqL1xuICAgICAgLyogTW92ZSB0aGUgYXNzZXRzIGluIGBzcmNQYXltZW50YCBpbnRvIHRoaXMgcHVyc2UsIHVzaW5nIHVwIHRoZSovXG4gICAgICAvKiBzb3VyY2UgcGF5bWVudCwgc3VjaCB0aGF0IHRvdGFsIGFzc2V0cyBhcmUgY29uc2VydmVkLiovXG4gICAgICBkZWxldGVQYXltZW50KHNyY1BheW1lbnQpO1xuICAgICAgYmFsYW5jZVN0b3JlLmluY3JlbWVudChzcmNQYXltZW50QmFsYW5jZSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBzaHV0ZG93bkxlZGdlcldpdGhGYWlsdXJlKGVycik7XG4gICAgICB0aHJvdyBlcnI7XG4gICAgfVxuICAgIHJldHVybiBzcmNQYXltZW50QmFsYW5jZTtcbiAgfTtcblxuICAvKipcbiAqIFVzZWQgYnkgdGhlIHB1cnNlIGNvZGUgdG8gaW1wbGVtZW50IHB1cnNlLndpdGhkcmF3XG4gKlxuICogQHBhcmFtIHtBbW91bnRTdG9yZX0gYmFsYW5jZVN0b3JlXG4gKiBAcGFyYW0ge0Ftb3VudH0gYW1vdW50IC0gdGhlIGFtb3VudCB0byBiZSB3aXRoZHJhd25cbiAqIEBwYXJhbSB7U2V0U3RvcmU8UGF5bWVudD59IFtyZWNvdmVyeVNldF1cbiAqIEByZXR1cm5zIHtQYXltZW50fVxuICovXG4gIGNvbnN0IHdpdGhkcmF3SW50ZXJuYWwgPSAoYmFsYW5jZVN0b3JlLCBhbW91bnQsIHJlY292ZXJ5U2V0ID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgYW1vdW50ID0gY29lcmNlKGFtb3VudCk7XG4gICAgY29uc3QgcGF5bWVudCA9IG1ha2VQYXltZW50KCk7XG4gICAgLyogQ09NTUlUIFBPSU5UIE1vdmUgdGhlIHdpdGhkcmF3biBhc3NldHMgZnJvbSB0aGlzIHB1cnNlIGludG8qL1xuICAgIC8qIHBheW1lbnQuIFRvdGFsIGFzc2V0cyBtdXN0IHJlbWFpbiBjb25zZXJ2ZWQuKi9cbiAgICBiYWxhbmNlU3RvcmUuZGVjcmVtZW50KGFtb3VudCkgfHxcbiAgICAgIEZhaWxgV2l0aGRyYXdhbCBvZiAke2Ftb3VudH0gZmFpbGVkIGJlY2F1c2UgdGhlIHB1cnNlIG9ubHkgY29udGFpbmVkICR7YmFsYW5jZVN0b3JlLmdldEFtb3VudCgpfWA7XG4gICAgdHJ5IHtcbiAgICAgIGluaXRQYXltZW50KHBheW1lbnQsIGFtb3VudCwgcmVjb3ZlcnlTZXQpO1xuICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZShlcnIpO1xuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgICByZXR1cm4gcGF5bWVudDtcbiAgfTtcblxuICAvKiogQHR5cGUgeygpID0+IFB1cnNlPEs+fSAqL1xuICAvKiBAdHMtZXhwZWN0LWVycm9yIFhYWCBhbW91bnQga2luZHMqL1xuICBjb25zdCBtYWtlRW1wdHlQdXJzZSA9IHByZXBhcmVQdXJzZUtpbmQoXG4gICAgaXNzdWVyWm9uZSxcbiAgICBuYW1lLFxuICAgIGFzc2V0S2luZCxcbiAgICBicmFuZCxcbiAgICBQdXJzZUlLaXQsXG4gICAgaGFyZGVuKHtcbiAgICAgIGRlcG9zaXRJbnRlcm5hbCxcbiAgICAgIHdpdGhkcmF3SW50ZXJuYWwsXG4gICAgfSksXG4gICAgcmVjb3ZlcnlTZXRzU3RhdGUsXG4gICAgcGF5bWVudFJlY292ZXJ5U2V0cyxcbiAgKTtcblxuICAvKiogQHR5cGUge0lzc3VlcjxLPn0gKi9cbiAgLyogQHRzLWV4cGVjdC1lcnJvciBYWFggY2FsbFdoZW4qL1xuICBjb25zdCBpc3N1ZXIgPSBpc3N1ZXJab25lLmV4byhgJHtuYW1lfSBpc3N1ZXJgLCBJc3N1ZXJJLCB7XG4gICAgZ2V0QnJhbmQoKSB7XG4gICAgICByZXR1cm4gYnJhbmQ7XG4gICAgfSxcbiAgICBnZXRBbGxlZ2VkTmFtZSgpIHtcbiAgICAgIHJldHVybiBuYW1lO1xuICAgIH0sXG4gICAgZ2V0QXNzZXRLaW5kKCkge1xuICAgICAgcmV0dXJuIGFzc2V0S2luZDtcbiAgICB9LFxuICAgIGdldERpc3BsYXlJbmZvKCkge1xuICAgICAgcmV0dXJuIGRpc3BsYXlJbmZvO1xuICAgIH0sXG4gICAgbWFrZUVtcHR5UHVyc2UoKSB7XG4gICAgICByZXR1cm4gbWFrZUVtcHR5UHVyc2UoKTtcbiAgICB9LFxuICAgIC8qKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnQgYXdhaXRlZCBieSBjYWxsV2hlbiAqL1xuICAgIGlzTGl2ZShwYXltZW50KSB7XG4gICAgICAvKiBJc3N1ZXJJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBwYXltZW50YCBpcyBhIFJlbW90YWJsZSovXG4gICAgICByZXR1cm4gcGF5bWVudExlZGdlci5oYXMocGF5bWVudCk7XG4gICAgfSxcbiAgICAvKiogQHBhcmFtIHtQYXltZW50fSBwYXltZW50IGF3YWl0ZWQgYnkgY2FsbFdoZW4gKi9cbiAgICBnZXRBbW91bnRPZihwYXltZW50KSB7XG4gICAgICAvKiBJc3N1ZXJJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBwYXltZW50YCBpcyBhIFJlbW90YWJsZSovXG4gICAgICBhc3NlcnRMaXZlUGF5bWVudChwYXltZW50KTtcbiAgICAgIHJldHVybiBwYXltZW50TGVkZ2VyLmdldChwYXltZW50KTtcbiAgICB9LFxuICAgIC8qKlxuICogQHBhcmFtIHtQYXltZW50fSBwYXltZW50IGF3YWl0ZWQgYnkgY2FsbFdoZW5cbiAqIEBwYXJhbSB7UGF0dGVybn0gb3B0QW1vdW50U2hhcGVcbiAqL1xuICAgIGJ1cm4ocGF5bWVudCwgb3B0QW1vdW50U2hhcGUgPSB1bmRlZmluZWQpIHtcbiAgICAgIC8qIElzc3VlckkgZGVsYXlzIGNhbGxpbmcgdGhpcyBtZXRob2QgdW50aWwgYHBheW1lbnRgIGlzIGEgUmVtb3RhYmxlKi9cbiAgICAgIGFzc2VydExpdmVQYXltZW50KHBheW1lbnQpO1xuICAgICAgY29uc3QgcGF5bWVudEJhbGFuY2UgPSBwYXltZW50TGVkZ2VyLmdldChwYXltZW50KTtcbiAgICAgIGFzc2VydEFtb3VudENvbnNpc3RlbnQocGF5bWVudEJhbGFuY2UsIG9wdEFtb3VudFNoYXBlKTtcbiAgICAgIHRyeSB7XG4gICAgICAgIC8qIENPTU1JVCBQT0lOVC4qL1xuICAgICAgICBkZWxldGVQYXltZW50KHBheW1lbnQpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIHNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmUoZXJyKTtcbiAgICAgICAgdGhyb3cgZXJyO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBheW1lbnRCYWxhbmNlO1xuICAgIH0sXG4gIH0pO1xuXG4gIC8qKlxuICogUHJvdmlkZXMgZm9yIHRoZSByZWNvdmVyeSBvZiBuZXdseSBtaW50ZWQgYnV0IG5vdC15ZXQtZGVwb3NpdGVkIHBheW1lbnRzLlxuICpcbiAqIEJlY2F1c2UgdGhlIGBtaW50UmVjb3ZlcnlQdXJzZWAgaXMgcGxhY2VkIGluIGJhZ2dhZ2UsIGV2ZW4gaWYgdGhlIGNhbGxlciBvZlxuICogYG1ha2VJc3N1ZXJLaXRgIGRyb3BzIGl0IG9uIHRoZSBmbG9vciwgaXQgY2FuIHN0aWxsIGJlIHJlY292ZXJlZCBpbiBhblxuICogZW1lcmdlbmN5IHVwZ3JhZGUuXG4gKi9cbiAgY29uc3QgbWludFJlY292ZXJ5UHVyc2UgPSAvKiogQHR5cGUge1B1cnNlPEs+fSAqLyAoXG4gICAgaXNzdWVyWm9uZS5tYWtlT25jZSgnbWludFJlY292ZXJ5UHVyc2UnLCAoKSA9PiBtYWtlRW1wdHlQdXJzZSgpKVxuICApO1xuXG4gIC8qKiBAdHlwZSB7TWludDxLPn0gKi9cbiAgY29uc3QgbWludCA9IGlzc3VlclpvbmUuZXhvKGAke25hbWV9IG1pbnRgLCBNaW50SSwge1xuICAgIGdldElzc3VlcigpIHtcbiAgICAgIHJldHVybiBpc3N1ZXI7XG4gICAgfSxcbiAgICBtaW50UGF5bWVudChuZXdBbW91bnQpIHtcbiAgICAgIG5ld0Ftb3VudCA9IGNvZXJjZShuZXdBbW91bnQpO1xuICAgICAgbXVzdE1hdGNoKG5ld0Ftb3VudCwgYW1vdW50U2hhcGUsICdtaW50ZWQgYW1vdW50Jyk7XG4gICAgICAvKiBgcmF3UGF5bWVudGAgaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhbnkgcmVjb3Zlcnkgc2V0LCBhbmQqL1xuICAgICAgLyogc28gbXVzdCBub3QgZXNjYXBlLiovXG4gICAgICBjb25zdCByYXdQYXltZW50ID0gbWFrZVBheW1lbnQoKTtcbiAgICAgIGluaXRQYXltZW50KHJhd1BheW1lbnQsIG5ld0Ftb3VudCwgdW5kZWZpbmVkKTtcblxuICAgICAgY29uc3QgbWludFJlY292ZXJ5UHVyc2VCZWZvcmUgPSBtaW50UmVjb3ZlcnlQdXJzZS5nZXRDdXJyZW50QW1vdW50KCk7XG4gICAgICBtaW50UmVjb3ZlcnlQdXJzZS5kZXBvc2l0KHJhd1BheW1lbnQsIG5ld0Ftb3VudCk7XG4gICAgICBjb25zdCBwYXltZW50ID0gbWludFJlY292ZXJ5UHVyc2Uud2l0aGRyYXcobmV3QW1vdW50KTtcbiAgICAgIGNvbnN0IG1pbnRSZWNvdmVyeVB1cnNlQWZ0ZXIgPSBtaW50UmVjb3ZlcnlQdXJzZS5nZXRDdXJyZW50QW1vdW50KCk7XG4gICAgICBhc3NlcnQoa2V5RVEobWludFJlY292ZXJ5UHVyc2VCZWZvcmUsIG1pbnRSZWNvdmVyeVB1cnNlQWZ0ZXIpKTtcbiAgICAgIHJldHVybiBwYXltZW50O1xuICAgIH0sXG4gIH0pO1xuXG4gIGNvbnN0IGlzc3VlcktpdCA9IGhhcmRlbih7IGlzc3VlciwgbWludCwgYnJhbmQsIG1pbnRSZWNvdmVyeVB1cnNlIH0pO1xuICByZXR1cm4gaXNzdWVyS2l0O1xufTskaM2PX29uY2UucHJlcGFyZVBheW1lbnRMZWRnZXIocHJlcGFyZVBheW1lbnRMZWRnZXIpO1xuaGFyZGVuKHByZXBhcmVQYXltZW50TGVkZ2VyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InByZXBhcmVQYXltZW50TGVkZ2VyIjpbInByZXBhcmVQYXltZW50TGVkZ2VyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAD4gnomXHAAAlxwAACEAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvcHVyc2UuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGFnb3JpYy9zdG9yZSIsIi4vYW1vdW50TWF0aC5qcyIsIi4vdHJhbnNpZW50Tm90aWZpZXIuanMiLCIuL2Ftb3VudFN0b3JlLmpzIl0sImV4cG9ydHMiOlsicHJlcGFyZVB1cnNlS2luZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsTSxtYWtlQ29weVNldCxBbW91bnRNYXRoLG1ha2VUcmFuc2llbnROb3RpZmllcktpdCxtYWtlQW1vdW50U3RvcmU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wibWFrZUNvcHlTZXRcIixbJGjNj19hID0+IChtYWtlQ29weVNldCA9ICRozY9fYSldXV1dLFtcIi4vYW1vdW50TWF0aC5qc1wiLCBbW1wiQW1vdW50TWF0aFwiLFskaM2PX2EgPT4gKEFtb3VudE1hdGggPSAkaM2PX2EpXV1dXSxbXCIuL3RyYW5zaWVudE5vdGlmaWVyLmpzXCIsIFtbXCJtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXRcIixbJGjNj19hID0+IChtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQgPSAkaM2PX2EpXV1dXSxbXCIuL2Ftb3VudFN0b3JlLmpzXCIsIFtbXCJtYWtlQW1vdW50U3RvcmVcIixbJGjNj19hID0+IChtYWtlQW1vdW50U3RvcmUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7QXNzZXRLaW5kLCBSZWNvdmVyeVNldHNPcHRpb24sIEJyYW5kLCBQYXltZW50fSBmcm9tICcuL3R5cGVzLmpzJ1xuICogQGltcG9ydCB7Wm9uZX0gZnJvbSAnQGFnb3JpYy96b25lJztcbiAqIEBpbXBvcnQge0ludGVyZmFjZUd1YXJkfSBmcm9tICdAZW5kby9wYXR0ZXJucyc7XG4gKiBAaW1wb3J0IHtXZWFrTWFwU3RvcmV9IGZyb20gJ0BhZ29yaWMvc3RvcmUnO1xuICogQGltcG9ydCB7U2V0U3RvcmV9IGZyb20gJ0BhZ29yaWMvc3RvcmUnO1xuICovXG5cbmNvbnN0IEVNUFRZX0NPUFlfU0VUID0gbWFrZUNvcHlTZXQoW10pO1xuXG4vKiBUT0RPIFR5cGUgSW50ZXJmYWNlR3VhcmQgYmV0dGVyIHRoYW4gSW50ZXJmYWNlR3VhcmQ8YW55PiovXG4vKipcbiAqIEBwYXJhbSB7Wm9uZX0gaXNzdWVyWm9uZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7QXNzZXRLaW5kfSBhc3NldEtpbmRcbiAqIEBwYXJhbSB7QnJhbmR9IGJyYW5kXG4gKiBAcGFyYW0ge3tcbiAqICAgcHVyc2U6IEludGVyZmFjZUd1YXJkPGFueT47XG4gKiAgIGRlcG9zaXRGYWNldDogSW50ZXJmYWNlR3VhcmQ8YW55PjtcbiAqIH19IFB1cnNlSUtpdFxuICogQHBhcmFtIHt7XG4gKiAgIGRlcG9zaXRJbnRlcm5hbDogYW55O1xuICogICB3aXRoZHJhd0ludGVybmFsOiBhbnk7XG4gKiB9fSBwdXJzZU1ldGhvZHNcbiAqIEBwYXJhbSB7UmVjb3ZlcnlTZXRzT3B0aW9ufSByZWNvdmVyeVNldHNTdGF0ZVxuICogQHBhcmFtIHtXZWFrTWFwU3RvcmU8UGF5bWVudCwgU2V0U3RvcmU8UGF5bWVudD4+fSBwYXltZW50UmVjb3ZlcnlTZXRzXG4gKi9cbiAgICAgICBjb25zdCBwcmVwYXJlUHVyc2VLaW5kID0gKFxuICBpc3N1ZXJab25lLFxuICBuYW1lLFxuICBhc3NldEtpbmQsXG4gIGJyYW5kLFxuICBQdXJzZUlLaXQsXG4gIHB1cnNlTWV0aG9kcyxcbiAgcmVjb3ZlcnlTZXRzU3RhdGUsXG4gIHBheW1lbnRSZWNvdmVyeVNldHMsXG4pID0+IHtcbiAgY29uc3QgYW1vdW50U2hhcGUgPSBicmFuZC5nZXRBbW91bnRTaGFwZSgpO1xuXG4gIC8qIE5vdGU6IFZpcnR1YWwgZm9yIGhpZ2ggY2FyZGluYWxpdHksIGJ1dCAqbm90KiBkdXJhYmxlLCBhbmQgc28qL1xuICAvKiBicm9rZW4gYWNyb3NzIGFuIHVwZ3JhZGUuKi9cbiAgLyogVE9ETyBwcm9wYWdhdGUgem9uaWZ5aW5nIHRvIG5vdGlmaWVycywgbWF5YmU/Ki9cbiAgY29uc3QgeyBwcm92aWRlTm90aWZpZXIsIHVwZGF0ZTogdXBkYXRlQmFsYW5jZSB9ID0gbWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0KCk7XG5cbiAgLyoqXG4gKiBJZiBgcmVjb3ZlcnlTZXRzU3RhdGUgPT09ICdoYXNSZWNvdmVyeVNldHMnYCAodGhlIG5vcm1hbCBzdGF0ZSksIHRoZW4ganVzdFxuICogcmV0dXJuIGBzdGF0ZS5yZWNvdmVyeVNldGAuXG4gKlxuICogSWYgYHJlY292ZXJ5U2V0c1N0YXRlID09PSAnbm9SZWNvdmVyeVNldHMnYCwgcmV0dXJuIGB1bmRlZmluZWRgLiBDYWxsZXJzXG4gKiBtdXN0IGJlIGF3YXJlIHRoYXQgdGhlIGB1bmRlZmluZWRgIHJldHVybiBoYXBwZW5zIGlmZiBgcmVjb3ZlcnlTZXRzU3RhdGVcbiAqID09PSAnbm9SZWNvdmVyeVNldHMnYCwgYW5kIHRvIGF2b2lkIHN0b3Jpbmcgb3IgcmV0cmlldmluZyBhbnl0aGluZyBmcm9tIHRoZVxuICogYWN0dWFsIHJlY292ZXJ5IHNldC5cbiAqXG4gKiBAcGFyYW0ge3sgcmVjb3ZlcnlTZXQ6IFNldFN0b3JlPFBheW1lbnQ+IH19IHN0YXRlXG4gKiBAcmV0dXJucyB7U2V0U3RvcmU8UGF5bWVudD4gfCB1bmRlZmluZWR9XG4gKi9cbiAgY29uc3QgbWF5YmVSZWNvdmVyeVNldCA9IHN0YXRlID0+IHtcbiAgICBjb25zdCB7IHJlY292ZXJ5U2V0IH0gPSBzdGF0ZTtcbiAgICBpZiAocmVjb3ZlcnlTZXRzU3RhdGUgPT09ICdoYXNSZWNvdmVyeVNldHMnKSB7XG4gICAgICByZXR1cm4gcmVjb3ZlcnlTZXQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlY292ZXJ5U2V0c1N0YXRlID09PSAnbm9SZWNvdmVyeVNldHMnIHx8XG4gICAgICAgIEZhaWxgcmVjb3ZlclNldHNTdGF0ZSBtdXN0IGJlIG5vUmVjb3ZlcnlTZXRzIGlmIGl0IGlzbid0IGhhc1JlY292ZXJTZXRzYDtcbiAgICAgIHBheW1lbnRSZWNvdmVyeVNldHMgIT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBGYWlsYHBheW1lbnRSZWNvdmVyeVNldHMgbXVzdCBhbHdheXMgYmUgZGVmaW5lZGA7XG4gICAgICByZWNvdmVyeVNldC5nZXRTaXplKCkgPT09IDAgfHxcbiAgICAgICAgRmFpbGBXaXRoIG5vUmVjb3ZlcnlTZXRzLCByZWNvdmVyeVNldCBtdXN0IGJlIGVtcHR5YDtcblxuICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG4gIH07XG5cbiAgLyogLSBUaGlzIGtpbmQgaXMgYSBwYWlyIG9mIHB1cnNlIGFuZCBkZXBvc2l0RmFjZXQgdGhhdCBoYXZlIGEgMToxKi9cbiAgLyogY29ycmVzcG9uZGVuY2UuKi9cbiAgLyogLSBUaGV5IGFyZSB2aXJ0dWFsaXplZCB0b2dldGhlciB0byBzaGFyZSBhIHNpbmdsZSBzdGF0ZSByZWNvcmQuKi9cbiAgLyogLSBBbiBhbHRlcm5hdGl2ZSBkZXNpZ24gY29uc2lkZXJlZCB3YXMgdG8gaGF2ZSB0aGlzIHJldHVybiBhIFB1cnNlIGFsb25lKi9cbiAgLyogdGhhdCBjcmVhdGVkIGRlcG9zaXRGYWNldCBhcyBuZWVkZWQuIEJ1dCB0aGlzIGFwcHJvYWNoIGVuc3VyZXMgYSBjb25zdGFudCovXG4gIC8qIGlkZW50aXR5IGZvciB0aGUgZmFjZXQgYW5kIGV4ZXJjaXNlcyB0aGUgbXVsdGktZmFjZXRlZCBvYmplY3Qgc3R5bGUuKi9cbiAgY29uc3QgeyBkZXBvc2l0SW50ZXJuYWwsIHdpdGhkcmF3SW50ZXJuYWwgfSA9IHB1cnNlTWV0aG9kcztcbiAgY29uc3QgbWFrZVB1cnNlS2l0ID0gaXNzdWVyWm9uZS5leG9DbGFzc0tpdChcbiAgICBgJHtuYW1lfSBQdXJzZWAsXG4gICAgUHVyc2VJS2l0LFxuICAgICgpID0+IHtcbiAgICAgIGNvbnN0IGN1cnJlbnRCYWxhbmNlID0gQW1vdW50TWF0aC5tYWtlRW1wdHkoYnJhbmQsIGFzc2V0S2luZCk7XG5cbiAgICAgIC8qKiBAdHlwZSB7U2V0U3RvcmU8UGF5bWVudD59ICovXG4gICAgICBjb25zdCByZWNvdmVyeVNldCA9IGlzc3VlclpvbmUuZGV0YWNoZWQoKS5zZXRTdG9yZSgncmVjb3Zlcnkgc2V0Jyk7XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIGN1cnJlbnRCYWxhbmNlLFxuICAgICAgICByZWNvdmVyeVNldCxcbiAgICAgIH07XG4gICAgfSxcbiAgICB7XG4gICAgICBwdXJzZToge1xuICAgICAgICBkZXBvc2l0KHNyY1BheW1lbnQsIG9wdEFtb3VudFNoYXBlID0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgLyogUHVyc2VJIGRvZXMgKm5vdCogZGVsYXkgYGRlcG9zaXRgIHVudGlsIGBzcmNQYXltZW50YCBpcyBmdWxmdWxsZWQuKi9cbiAgICAgICAgICAvKiBTZWUgdGhlIGNvbW1lbnRzIG9uIFB1cnNlSS5kZXBvc2l0IGluIHR5cGVHdWFyZHMuanMqL1xuICAgICAgICAgIGNvbnN0IHsgc3RhdGUgfSA9IHRoaXM7XG4gICAgICAgICAgY29uc3QgeyBwdXJzZSB9ID0gdGhpcy5mYWNldHM7XG4gICAgICAgICAgY29uc3QgYmFsYW5jZVN0b3JlID0gbWFrZUFtb3VudFN0b3JlKHN0YXRlLCAnY3VycmVudEJhbGFuY2UnKTtcbiAgICAgICAgICAvKiBOb3RlIENPTU1JVCBQT0lOVCB3aXRoaW4gZGVwb3NpdC4qL1xuICAgICAgICAgIGNvbnN0IHNyY1BheW1lbnRCYWxhbmNlID0gZGVwb3NpdEludGVybmFsKFxuICAgICAgICAgICAgYmFsYW5jZVN0b3JlLFxuICAgICAgICAgICAgc3JjUGF5bWVudCxcbiAgICAgICAgICAgIG9wdEFtb3VudFNoYXBlLFxuICAgICAgICAgICk7XG4gICAgICAgICAgdXBkYXRlQmFsYW5jZShwdXJzZSwgYmFsYW5jZVN0b3JlLmdldEFtb3VudCgpKTtcbiAgICAgICAgICByZXR1cm4gc3JjUGF5bWVudEJhbGFuY2U7XG4gICAgICAgIH0sXG4gICAgICAgIHdpdGhkcmF3KGFtb3VudCkge1xuICAgICAgICAgIGNvbnN0IHsgc3RhdGUgfSA9IHRoaXM7XG4gICAgICAgICAgY29uc3QgeyBwdXJzZSB9ID0gdGhpcy5mYWNldHM7XG5cbiAgICAgICAgICBjb25zdCBvcHRSZWNvdmVyeVNldCA9IG1heWJlUmVjb3ZlcnlTZXQoc3RhdGUpO1xuICAgICAgICAgIGNvbnN0IGJhbGFuY2VTdG9yZSA9IG1ha2VBbW91bnRTdG9yZShzdGF0ZSwgJ2N1cnJlbnRCYWxhbmNlJyk7XG4gICAgICAgICAgLyogTm90ZSBDT01NSVQgUE9JTlQgd2l0aGluIHdpdGhkcmF3LiovXG4gICAgICAgICAgY29uc3QgcGF5bWVudCA9IHdpdGhkcmF3SW50ZXJuYWwoXG4gICAgICAgICAgICBiYWxhbmNlU3RvcmUsXG4gICAgICAgICAgICBhbW91bnQsXG4gICAgICAgICAgICBvcHRSZWNvdmVyeVNldCxcbiAgICAgICAgICApO1xuICAgICAgICAgIHVwZGF0ZUJhbGFuY2UocHVyc2UsIGJhbGFuY2VTdG9yZS5nZXRBbW91bnQoKSk7XG4gICAgICAgICAgcmV0dXJuIHBheW1lbnQ7XG4gICAgICAgIH0sXG4gICAgICAgIGdldEN1cnJlbnRBbW91bnQoKSB7XG4gICAgICAgICAgY29uc3QgeyBzdGF0ZSB9ID0gdGhpcztcbiAgICAgICAgICBjb25zdCBiYWxhbmNlU3RvcmUgPSBtYWtlQW1vdW50U3RvcmUoc3RhdGUsICdjdXJyZW50QmFsYW5jZScpO1xuICAgICAgICAgIHJldHVybiBiYWxhbmNlU3RvcmUuZ2V0QW1vdW50KCk7XG4gICAgICAgIH0sXG4gICAgICAgIGdldEN1cnJlbnRBbW91bnROb3RpZmllcigpIHtcbiAgICAgICAgICByZXR1cm4gcHJvdmlkZU5vdGlmaWVyKHRoaXMuZmFjZXRzLnB1cnNlKTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0QWxsZWdlZEJyYW5kKCkge1xuICAgICAgICAgIHJldHVybiBicmFuZDtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXREZXBvc2l0RmFjZXQoKSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMuZmFjZXRzLmRlcG9zaXRGYWNldDtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXRSZWNvdmVyeVNldCgpIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXRlIH0gPSB0aGlzO1xuICAgICAgICAgIGNvbnN0IG9wdFJlY292ZXJ5U2V0ID0gbWF5YmVSZWNvdmVyeVNldChzdGF0ZSk7XG4gICAgICAgICAgaWYgKG9wdFJlY292ZXJ5U2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBFTVBUWV9DT1BZX1NFVDtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG9wdFJlY292ZXJ5U2V0LnNuYXBzaG90KCk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlY292ZXJBbGwoKSB7XG4gICAgICAgICAgY29uc3QgeyBzdGF0ZSwgZmFjZXRzIH0gPSB0aGlzO1xuICAgICAgICAgIGxldCBhbW91bnQgPSBBbW91bnRNYXRoLm1ha2VFbXB0eShicmFuZCwgYXNzZXRLaW5kKTtcbiAgICAgICAgICBjb25zdCBvcHRSZWNvdmVyeVNldCA9IG1heWJlUmVjb3ZlcnlTZXQoc3RhdGUpO1xuICAgICAgICAgIGlmIChvcHRSZWNvdmVyeVNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYW1vdW50OyAvKiBlbXB0eSBhdCB0aGlzIHRpbWUqL1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKGNvbnN0IHBheW1lbnQgb2Ygb3B0UmVjb3ZlcnlTZXQua2V5cygpKSB7XG4gICAgICAgICAgICAvKiBUaGlzIGRvZXMgY2F1c2UgZGVsZXRpb25zIGZyb20gdGhlIHNldCB3aGlsZSBpdGVyYXRpbmcsKi9cbiAgICAgICAgICAgIC8qIGJ1dCB0aGlzIHNwZWNpYWwgY2FzZSBpcyBhbGxvd2VkLiovXG4gICAgICAgICAgICBjb25zdCBkZWx0YSA9IGZhY2V0cy5wdXJzZS5kZXBvc2l0KHBheW1lbnQpO1xuICAgICAgICAgICAgYW1vdW50ID0gQW1vdW50TWF0aC5hZGQoYW1vdW50LCBkZWx0YSwgYnJhbmQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBvcHRSZWNvdmVyeVNldC5nZXRTaXplKCkgPT09IDAgfHxcbiAgICAgICAgICAgIEZhaWxgaW50ZXJuYWw6IFJlbWFpbmluZyB1bnJlY292ZXJlZCBwYXltZW50czogJHtmYWNldHMucHVyc2UuZ2V0UmVjb3ZlcnlTZXQoKX1gO1xuICAgICAgICAgIHJldHVybiBhbW91bnQ7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgZGVwb3NpdEZhY2V0OiB7XG4gICAgICAgIHJlY2VpdmUoLi4uYXJncykge1xuICAgICAgICAgIHJldHVybiB0aGlzLmZhY2V0cy5wdXJzZS5kZXBvc2l0KC4uLmFyZ3MpO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICAgIHtcbiAgICAgIHN0YXRlU2hhcGU6IHtcbiAgICAgICAgY3VycmVudEJhbGFuY2U6IGFtb3VudFNoYXBlLFxuICAgICAgICByZWNvdmVyeVNldDogTS5yZW1vdGFibGUoJ3JlY292ZXJ5U2V0JyksXG4gICAgICB9LFxuICAgIH0sXG4gICk7XG4gIHJldHVybiAoKSA9PiBtYWtlUHVyc2VLaXQoKS5wdXJzZTtcbn07JGjNj19vbmNlLnByZXBhcmVQdXJzZUtpbmQocHJlcGFyZVB1cnNlS2luZCk7XG5oYXJkZW4ocHJlcGFyZVB1cnNlS2luZCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwcmVwYXJlUHVyc2VLaW5kIjpbInByZXBhcmVQdXJzZUtpbmQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAvquhcic9AAAnPQAAIQAAAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9yYXRpby5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vbmF0IiwiLi9hbW91bnRNYXRoLmpzIiwiLi9zYWZlTWF0aC5qcyJdLCJleHBvcnRzIjpbImFkZFJhdGlvcyIsImFzc2VydElzUmF0aW8iLCJhc3NlcnRQYXJzYWJsZU51bWJlciIsImNlaWxEaXZpZGVCeSIsImNlaWxNdWx0aXBseUJ5IiwiZGl2aWRlQnkiLCJmbG9vckRpdmlkZUJ5IiwiZmxvb3JNdWx0aXBseUJ5IiwiaW52ZXJ0UmF0aW8iLCJtYWtlUmF0aW8iLCJtYWtlUmF0aW9Gcm9tQW1vdW50cyIsIm11bHRpcGx5QnkiLCJtdWx0aXBseVJhdGlvcyIsIm9uZU1pbnVzIiwicGFyc2VSYXRpbyIsInF1YW50aXplIiwicmF0aW9HVEUiLCJyYXRpb1RvTnVtYmVyIiwicmF0aW9zU2FtZSIsInN1YnRyYWN0UmF0aW9zIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxGYWlsLGFzc2VydFJlY29yZCxpc05hdCxBbW91bnRNYXRoLG5hdFNhZmVNYXRoOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydFJlY29yZFwiLFskaM2PX2EgPT4gKGFzc2VydFJlY29yZCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL25hdFwiLCBbW1wiaXNOYXRcIixbJGjNj19hID0+IChpc05hdCA9ICRozY9fYSldXV1dLFtcIi4vYW1vdW50TWF0aC5qc1wiLCBbW1wiQW1vdW50TWF0aFwiLFskaM2PX2EgPT4gKEFtb3VudE1hdGggPSAkaM2PX2EpXV1dXSxbXCIuL3NhZmVNYXRoLmpzXCIsIFtbXCJuYXRTYWZlTWF0aFwiLFskaM2PX2EgPT4gKG5hdFNhZmVNYXRoID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7QW1vdW50LCBCcmFuZCwgSXNzdWVyLCBQYXltZW50LCBQdXJzZX0gZnJvbSAnQGFnb3JpYy9lcnRwJztcbiAqL1xuXG5jb25zdCB7IG11bHRpcGx5LCBmbG9vckRpdmlkZSwgY2VpbERpdmlkZSwgYmFua2Vyc0RpdmlkZSwgYWRkLCBzdWJ0cmFjdCB9ID1cbiAgbmF0U2FmZU1hdGg7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUmF0aW9cbiAqIEBwcm9wZXJ0eSB7QW1vdW50PCduYXQnPn0gbnVtZXJhdG9yXG4gKiBAcHJvcGVydHkge0Ftb3VudDwnbmF0Jz59IGRlbm9taW5hdG9yXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgU2NhbGVBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gYW1vdW50XG4gKiBAcGFyYW0ge1JhdGlvfSByYXRpb1xuICogQHJldHVybnMge0Ftb3VudDwnbmF0Jz59XG4gKi9cblxuLyogbWFrZSBhIFJhdGlvLCB3aGljaCByZXByZXNlbnRzIGEgZnJhY3Rpb24uIEl0IGlzIGEgcGFzcy1ieS1jb3B5IHJlY29yZC4qL1xuLyoqL1xuLyogVGhlIG5hdHVyYWwgc3ludGF4IGZvciB0aGUgbW9zdCBjb21tb24gb3BlcmF0aW9ucyB3ZSB3YW50IHRvIHN1cHBvcnQqL1xuLyogYXJlIEFtb3VudCAqIFJhdGlvIGFuZCBBbW91bnQgLyBSYXRpby4gU2luY2UgdGhlIG9wZXJhdGlvbnMgd2FudCB0byBhZGhlcmUgdG8qL1xuLyogdGhlIHJhdGlvIHJhdGhlciB0aGFuIHRoZSBhbW91bnQsIHdlIHNldHRsZWQgb24gYSBjYWxsaW5nIGNvbnZlbnRpb24gb2YqL1xuLyogW2NlaWx8Zmxvb3JdTXVsdGlwbHlCeShBbW91bnQsIFJhdGlvKSBhbmQgW2NlaWx8Zmxvb3JdRGl2aWRlQnkoQW1vdW50LCBSYXRpbykqL1xuLyoqL1xuLyogVGhlIG1vc3QgY29tbW9uIGtpbmQgb2YgUmF0aW8gY2FuIGJlIGFwcGxpZWQgdG8gQW1vdW50cyBvZiBhIHBhcnRpY3VsYXIqL1xuLyogYnJhbmQsIGFuZCBwcm9kdWNlcyByZXN1bHRzIG9mIHRoZSBzYW1lIGJyYW5kLiBUaGlzIHJlcHJlc2VudHMgYSBtdWx0aXBsaWVyKi9cbi8qIHRoYXQgaXMgb25seSBhcHBsaWNhYmxlIHRvIHRoYXQgYnJhbmQuIFRoZSBsZXNzIGNvbW1vbiBraW5kIG9mIFJhdGlvIGNhbiBiZSovXG4vKiBhcHBsaWVkIHRvIG9uZSBwYXJ0aWN1bGFyIGJyYW5kIG9mIGFtb3VudHMsIGFuZCBwcm9kdWNlcyByZXN1bHRzIG9mIGFub3RoZXIqL1xuLyogcGFydGljdWxhciBicmFuZC4gVGhpcyByZXByZXNlbnRzIHNvbWUga2luZCBvZiBleGNoYW5nZSByYXRlLiBUaGUqL1xuLyogYnJhbmQtY2hlY2tpbmcgaGVscHMgdXMgZW5zdXJlIHRoYXQgbm9ybWFsIFJhdGlvcyBhcmVuJ3QgYXBwbGllZCB0byBhbW91bnRzKi9cbi8qIG9mIHRoZSB3cm9uZyBicmFuZCwgYW5kIHRoYXQgZXhjaGFuZ2UgcmF0ZXMgYXJlIG9ubHkgdXNlZCBpbiB0aGUgYXBwcm9wcmlhdGUqL1xuLyogZGlyZWN0aW9uLiovXG4vKiovXG4vKiBTaW5jZSB0aGUgcmF0aW9zIGFyZSByZXByZXNlbnRlZCBieSBhIG51bWVyYXRvciBhbmQgYSBkZW5vbWluYXRvciwgZXZlcnkqL1xuLyogbXVsdGlwbGljYXRpb24gb3IgZGl2aXNpb24gb3BlcmF0aW9uIHRoYXQgcHJvZHVjZXMgYW4gYW1vdW50IGVuZHMgd2l0aCBhKi9cbi8qIGRpdmlzaW9uIG9mIHRoZSB1bmRlcmx5aW5nIGJpZ2ludHMsIGFuZCBpbnRlZ2VyIGRpdmlzaW9uIHJlcXVpcmVzIGEgbW9kZSovXG4vKiBvZiBbcm91bmRpbmcgdG8gaW50ZWdlcl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUm91bmRpbmcjUm91bmRpbmdfdG9faW50ZWdlcikuKi9cbi8qIEJlY2F1c2UgYFJhdGlvYCBvbmx5IHdvcmsgd2l0aCBOYXR1cmFsIG51bWJlcnMsIGp1c3QgdGhyZWUgbW9kZXMgc3VmZmljZToqL1xuLyogLSBmbG9vciByb3VuZHMgZG93biovXG4vKiAtIGNlaWwgcm91bmRzIHVwKi9cbi8qIC0gZGVmYXVsdCAod2l0aG91dCBwcmVmaXgpIG1pbmltaXplcyBiaWFzIGJ5IHJvdW5kaW5nIGhhbGYgdG8gZXZlbiovXG5cbmNvbnN0IFBFUkNFTlQgPSAxMDBuO1xuXG5jb25zdCByYXRpb1Byb3BlcnR5TmFtZXMgPSBbJ251bWVyYXRvcicsICdkZW5vbWluYXRvciddO1xuXG4gICAgICAgY29uc3QgYXNzZXJ0SXNSYXRpbyA9IHJhdGlvID0+IHtcbiAgYXNzZXJ0UmVjb3JkKHJhdGlvLCAncmF0aW8nKTtcbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHJhdGlvKTtcbiAga2V5cy5sZW5ndGggPT09IDIgfHwgRmFpbGBSYXRpbyAke3JhdGlvfSBtdXN0IGJlIGEgcmVjb3JkIHdpdGggMiBmaWVsZHMuYDtcbiAgZm9yIChjb25zdCBuYW1lIG9mIGtleXMpIHtcbiAgICByYXRpb1Byb3BlcnR5TmFtZXMuaW5jbHVkZXMobmFtZSkgfHxcbiAgICAgIEZhaWxgUGFyYW1ldGVyIG11c3QgYmUgYSBSYXRpbyByZWNvcmQsIGJ1dCAke3JhdGlvfSBoYXMgJHtxKG5hbWUpfWA7XG4gIH1cbiAgY29uc3QgbnVtZXJhdG9yVmFsdWUgPSByYXRpby5udW1lcmF0b3IudmFsdWU7XG4gIGNvbnN0IGRlbm9taW5hdG9yVmFsdWUgPSByYXRpby5kZW5vbWluYXRvci52YWx1ZTtcbiAgaXNOYXQobnVtZXJhdG9yVmFsdWUpIHx8XG4gICAgRmFpbGBUaGUgbnVtZXJhdG9yIHZhbHVlIG11c3QgYmUgYSBOYXRWYWx1ZSwgbm90ICR7bnVtZXJhdG9yVmFsdWV9YDtcbiAgaXNOYXQoZGVub21pbmF0b3JWYWx1ZSkgfHxcbiAgICBGYWlsYFRoZSBkZW5vbWluYXRvciB2YWx1ZSBtdXN0IGJlIGEgTmF0VmFsdWUsIG5vdCAke2Rlbm9taW5hdG9yVmFsdWV9YDtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtiaWdpbnR9IG51bWVyYXRvclxuICogQHBhcmFtIHtCcmFuZH0gbnVtZXJhdG9yQnJhbmRcbiAqIEBwYXJhbSB7YmlnaW50fSBbZGVub21pbmF0b3JdIFRoZSBkZWZhdWx0IGRlbm9taW5hdG9yIGlzIDEwMFxuICogQHBhcmFtIHtCcmFuZH0gW2Rlbm9taW5hdG9yQnJhbmRdIFRoZSBkZWZhdWx0IGlzIHRvIHJldXNlIHRoZSBudW1lcmF0b3JCcmFuZFxuICogQHJldHVybnMge1JhdGlvfVxuICovJGjNj19vbmNlLmFzc2VydElzUmF0aW8oYXNzZXJ0SXNSYXRpbyk7XG4gICAgICAgY29uc3QgbWFrZVJhdGlvID0gKFxuICBudW1lcmF0b3IsXG4gIG51bWVyYXRvckJyYW5kLFxuICBkZW5vbWluYXRvciA9IFBFUkNFTlQsXG4gIGRlbm9taW5hdG9yQnJhbmQgPSBudW1lcmF0b3JCcmFuZCxcbikgPT4ge1xuICBkZW5vbWluYXRvciA+IDBuIHx8XG4gICAgRmFpbGBObyBpbmZpbml0ZSByYXRpb3MhIERlbm9taW5hdG9yIHdhcyAwICR7cShkZW5vbWluYXRvckJyYW5kKX1gO1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIG51bWVyYXRvcjogQW1vdW50TWF0aC5tYWtlKG51bWVyYXRvckJyYW5kLCBudW1lcmF0b3IpLFxuICAgIGRlbm9taW5hdG9yOiBBbW91bnRNYXRoLm1ha2UoZGVub21pbmF0b3JCcmFuZCwgZGVub21pbmF0b3IpLFxuICB9KTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtBbW91bnR9IG51bWVyYXRvckFtb3VudFxuICogQHBhcmFtIHtBbW91bnR9IGRlbm9taW5hdG9yQW1vdW50XG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi8kaM2PX29uY2UubWFrZVJhdGlvKG1ha2VSYXRpbyk7XG4gICAgICAgY29uc3QgbWFrZVJhdGlvRnJvbUFtb3VudHMgPSAobnVtZXJhdG9yQW1vdW50LCBkZW5vbWluYXRvckFtb3VudCkgPT4ge1xuICBBbW91bnRNYXRoLmNvZXJjZShudW1lcmF0b3JBbW91bnQuYnJhbmQsIG51bWVyYXRvckFtb3VudCk7XG4gIEFtb3VudE1hdGguY29lcmNlKGRlbm9taW5hdG9yQW1vdW50LmJyYW5kLCBkZW5vbWluYXRvckFtb3VudCk7XG4gIHJldHVybiBtYWtlUmF0aW8oXG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciB2YWx1ZSBjYW4gYmUgYW55IEFtb3VudFZhbHVlIGJ1dCBtYWtlUmF0aW8oKSBzdXBwb3J0cyBvbmx5IGJpZ2ludCovXG4gICAgbnVtZXJhdG9yQW1vdW50LnZhbHVlLFxuICAgIG51bWVyYXRvckFtb3VudC5icmFuZCxcbiAgICBkZW5vbWluYXRvckFtb3VudC52YWx1ZSxcbiAgICBkZW5vbWluYXRvckFtb3VudC5icmFuZCxcbiAgKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBhbW91bnRcbiAqIEBwYXJhbSB7UmF0aW99IHJhdGlvXG4gKiBAcGFyYW0ge2FueX0gZGl2aWRlT3BcbiAqIEByZXR1cm5zIHtBbW91bnQ8J25hdCc+fVxuICovJGjNj19vbmNlLm1ha2VSYXRpb0Zyb21BbW91bnRzKG1ha2VSYXRpb0Zyb21BbW91bnRzKTtcbmNvbnN0IG11bHRpcGx5SGVscGVyID0gKGFtb3VudCwgcmF0aW8sIGRpdmlkZU9wKSA9PiB7XG4gIEFtb3VudE1hdGguY29lcmNlKGFtb3VudC5icmFuZCwgYW1vdW50KTtcbiAgYXNzZXJ0SXNSYXRpbyhyYXRpbyk7XG4gIGFtb3VudC5icmFuZCA9PT0gcmF0aW8uZGVub21pbmF0b3IuYnJhbmQgfHxcbiAgICBGYWlsYGFtb3VudCdzIGJyYW5kICR7cShhbW91bnQuYnJhbmQpfSBtdXN0IG1hdGNoIHJhdGlvJ3MgZGVub21pbmF0b3IgJHtxKFxuICAgICAgcmF0aW8uZGVub21pbmF0b3IuYnJhbmQsXG4gICAgKX1gO1xuXG4gIHJldHVybiAvKiogQHR5cGUge0Ftb3VudDwnbmF0Jz59ICovIChcbiAgICBBbW91bnRNYXRoLm1ha2UoXG4gICAgICByYXRpby5udW1lcmF0b3IuYnJhbmQsXG4gICAgICBkaXZpZGVPcChcbiAgICAgICAgbXVsdGlwbHkoYW1vdW50LnZhbHVlLCByYXRpby5udW1lcmF0b3IudmFsdWUpLFxuICAgICAgICByYXRpby5kZW5vbWluYXRvci52YWx1ZSxcbiAgICAgICksXG4gICAgKVxuICApO1xufTtcblxuLyoqIEB0eXBlIHtTY2FsZUFtb3VudH0gKi9cbiAgICAgICBjb25zdCBmbG9vck11bHRpcGx5QnkgPSAoYW1vdW50LCByYXRpbykgPT4ge1xuICByZXR1cm4gbXVsdGlwbHlIZWxwZXIoYW1vdW50LCByYXRpbywgZmxvb3JEaXZpZGUpO1xufTtcblxuLyoqIEB0eXBlIHtTY2FsZUFtb3VudH0gKi8kaM2PX29uY2UuZmxvb3JNdWx0aXBseUJ5KGZsb29yTXVsdGlwbHlCeSk7XG4gICAgICAgY29uc3QgY2VpbE11bHRpcGx5QnkgPSAoYW1vdW50LCByYXRpbykgPT4ge1xuICByZXR1cm4gbXVsdGlwbHlIZWxwZXIoYW1vdW50LCByYXRpbywgY2VpbERpdmlkZSk7XG59O1xuXG4vKiogQHR5cGUge1NjYWxlQW1vdW50fSAqLyRozY9fb25jZS5jZWlsTXVsdGlwbHlCeShjZWlsTXVsdGlwbHlCeSk7XG4gICAgICAgY29uc3QgbXVsdGlwbHlCeSA9IChhbW91bnQsIHJhdGlvKSA9PiB7XG4gIHJldHVybiBtdWx0aXBseUhlbHBlcihhbW91bnQsIHJhdGlvLCBiYW5rZXJzRGl2aWRlKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBhbW91bnRcbiAqIEBwYXJhbSB7UmF0aW99IHJhdGlvXG4gKiBAcGFyYW0ge2FueX0gZGl2aWRlT3BcbiAqIEByZXR1cm5zIHtBbW91bnQ8J25hdCc+fVxuICovJGjNj19vbmNlLm11bHRpcGx5QnkobXVsdGlwbHlCeSk7XG5jb25zdCBkaXZpZGVIZWxwZXIgPSAoYW1vdW50LCByYXRpbywgZGl2aWRlT3ApID0+IHtcbiAgQW1vdW50TWF0aC5jb2VyY2UoYW1vdW50LmJyYW5kLCBhbW91bnQpO1xuICBhc3NlcnRJc1JhdGlvKHJhdGlvKTtcbiAgYW1vdW50LmJyYW5kID09PSByYXRpby5udW1lcmF0b3IuYnJhbmQgfHxcbiAgICBGYWlsYGFtb3VudCdzIGJyYW5kICR7cShhbW91bnQuYnJhbmQpfSBtdXN0IG1hdGNoIHJhdGlvJ3MgbnVtZXJhdG9yICR7cShcbiAgICAgIHJhdGlvLm51bWVyYXRvci5icmFuZCxcbiAgICApfWA7XG5cbiAgcmV0dXJuIC8qKiBAdHlwZSB7QW1vdW50PCduYXQnPn0gKi8gKFxuICAgIEFtb3VudE1hdGgubWFrZShcbiAgICAgIHJhdGlvLmRlbm9taW5hdG9yLmJyYW5kLFxuICAgICAgZGl2aWRlT3AoXG4gICAgICAgIG11bHRpcGx5KGFtb3VudC52YWx1ZSwgcmF0aW8uZGVub21pbmF0b3IudmFsdWUpLFxuICAgICAgICByYXRpby5udW1lcmF0b3IudmFsdWUsXG4gICAgICApLFxuICAgIClcbiAgKTtcbn07XG5cbi8qKlxuICogRGl2aWRlIHRoZSBhbW91bnQgYnkgdGhlIHJhdGlvLCB0cnVuY2F0aW5nIHRoZSByZW1haW5kZXIuXG4gKlxuICogQHR5cGUge1NjYWxlQW1vdW50fVxuICovXG4gICAgICAgY29uc3QgZmxvb3JEaXZpZGVCeSA9IChhbW91bnQsIHJhdGlvKSA9PiB7XG4gIHJldHVybiBkaXZpZGVIZWxwZXIoYW1vdW50LCByYXRpbywgZmxvb3JEaXZpZGUpO1xufTtcblxuLyoqXG4gKiBEaXZpZGUgdGhlIGFtb3VudCBieSB0aGUgcmF0aW8sIHJvdW5kaW5nIHVwIHRoZSByZW1haW5kZXIuXG4gKlxuICogQHR5cGUge1NjYWxlQW1vdW50fVxuICovJGjNj19vbmNlLmZsb29yRGl2aWRlQnkoZmxvb3JEaXZpZGVCeSk7XG4gICAgICAgY29uc3QgY2VpbERpdmlkZUJ5ID0gKGFtb3VudCwgcmF0aW8pID0+IHtcbiAgcmV0dXJuIGRpdmlkZUhlbHBlcihhbW91bnQsIHJhdGlvLCBjZWlsRGl2aWRlKTtcbn07XG5cbi8qKlxuICogRGl2aWRlIHRoZSBhbW91bnQgYnkgdGhlIHJhdGlvLCByb3VuZGluZyB0byBuZWFyZXN0IHdpdGggdGllcyB0byBldmVuIChha2FcbiAqIEJhbmtlcidzIFJvdW5kaW5nKSBhcyBpbiBJRUVFIDc1NCBkZWZhdWx0IHJvdW5kaW5nLlxuICpcbiAqIEB0eXBlIHtTY2FsZUFtb3VudH1cbiAqLyRozY9fb25jZS5jZWlsRGl2aWRlQnkoY2VpbERpdmlkZUJ5KTtcbiAgICAgICBjb25zdCBkaXZpZGVCeSA9IChhbW91bnQsIHJhdGlvKSA9PiB7XG4gIHJldHVybiBkaXZpZGVIZWxwZXIoYW1vdW50LCByYXRpbywgYmFua2Vyc0RpdmlkZSk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7UmF0aW99IHJhdGlvXG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi8kaM2PX29uY2UuZGl2aWRlQnkoZGl2aWRlQnkpO1xuICAgICAgIGNvbnN0IGludmVydFJhdGlvID0gcmF0aW8gPT4ge1xuICBhc3NlcnRJc1JhdGlvKHJhdGlvKTtcblxuICByZXR1cm4gbWFrZVJhdGlvKFxuICAgIHJhdGlvLmRlbm9taW5hdG9yLnZhbHVlLFxuICAgIHJhdGlvLmRlbm9taW5hdG9yLmJyYW5kLFxuICAgIHJhdGlvLm51bWVyYXRvci52YWx1ZSxcbiAgICByYXRpby5udW1lcmF0b3IuYnJhbmQsXG4gICk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7UmF0aW99IGxlZnRcbiAqIEBwYXJhbSB7UmF0aW99IHJpZ2h0XG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi8kaM2PX29uY2UuaW52ZXJ0UmF0aW8oaW52ZXJ0UmF0aW8pO1xuICAgICAgIGNvbnN0IGFkZFJhdGlvcyA9IChsZWZ0LCByaWdodCkgPT4ge1xuICBhc3NlcnRJc1JhdGlvKHJpZ2h0KTtcbiAgYXNzZXJ0SXNSYXRpbyhsZWZ0KTtcbiAgbGVmdC5udW1lcmF0b3IuYnJhbmQgPT09IHJpZ2h0Lm51bWVyYXRvci5icmFuZCB8fFxuICAgIEZhaWxgbnVtZXJhdG9yIGJyYW5kcyBtdXN0IG1hdGNoOiAke3EobGVmdCl9ICR7cShyaWdodCl9YDtcbiAgbGVmdC5kZW5vbWluYXRvci5icmFuZCA9PT0gcmlnaHQuZGVub21pbmF0b3IuYnJhbmQgfHxcbiAgICBGYWlsYGRlbm9taW5hdG9yIGJyYW5kcyBtdXN0IG1hdGNoOiAke3EobGVmdCl9ICR7cShyaWdodCl9YDtcblxuICAvKiBTaW1wbGlmeWluZyB0aGUgZXhwcmVzc2lvbjoqL1xuICAvKiAoYW5kICsgYm5kKSAvIHkgZCoqMiovXG4gIC8qIChhICsgYikgbmQgLyB5IGQqKjIqL1xuICAvKiAoKGEgKyBiKSBuIC8geSBkKSAqIChkIC8gZCkqL1xuICAvKiAoYSArIGIpIG4gLyB5ZCovXG4gIHJldHVybiBtYWtlUmF0aW8oXG4gICAgYWRkKFxuICAgICAgbXVsdGlwbHkobGVmdC5udW1lcmF0b3IudmFsdWUsIHJpZ2h0LmRlbm9taW5hdG9yLnZhbHVlKSwgLyogYSBuZCovXG4gICAgICBtdWx0aXBseShsZWZ0LmRlbm9taW5hdG9yLnZhbHVlLCByaWdodC5udW1lcmF0b3IudmFsdWUpICAvKiBiIG5kKi9cbiAgICApLCAvKiAoYSArIGIpIG5kKi9cbiAgICBsZWZ0Lm51bWVyYXRvci5icmFuZCxcbiAgICBtdWx0aXBseShsZWZ0LmRlbm9taW5hdG9yLnZhbHVlLCByaWdodC5kZW5vbWluYXRvci52YWx1ZSksIC8qIHkgZCoqMiovXG4gICAgbGVmdC5kZW5vbWluYXRvci5icmFuZCxcbiAgKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtSYXRpb30gbGVmdFxuICogQHBhcmFtIHtSYXRpb30gcmlnaHRcbiAqIEByZXR1cm5zIHtSYXRpb31cbiAqLyRozY9fb25jZS5hZGRSYXRpb3MoYWRkUmF0aW9zKTtcbiAgICAgICBjb25zdCBzdWJ0cmFjdFJhdGlvcyA9IChsZWZ0LCByaWdodCkgPT4ge1xuICBhc3NlcnRJc1JhdGlvKHJpZ2h0KTtcbiAgYXNzZXJ0SXNSYXRpbyhsZWZ0KTtcbiAgbGVmdC5udW1lcmF0b3IuYnJhbmQgPT09IHJpZ2h0Lm51bWVyYXRvci5icmFuZCB8fFxuICAgIEZhaWxgbnVtZXJhdG9yIGJyYW5kcyBtdXN0IG1hdGNoOiAke3EobGVmdCl9ICR7cShyaWdodCl9YDtcbiAgbGVmdC5kZW5vbWluYXRvci5icmFuZCA9PT0gcmlnaHQuZGVub21pbmF0b3IuYnJhbmQgfHxcbiAgICBGYWlsYGRlbm9taW5hdG9yIGJyYW5kcyBtdXN0IG1hdGNoOiAke3EobGVmdCl9ICR7cShyaWdodCl9YDtcblxuICByZXR1cm4gbWFrZVJhdGlvKFxuICAgIHN1YnRyYWN0KFxuICAgICAgbXVsdGlwbHkobGVmdC5udW1lcmF0b3IudmFsdWUsIHJpZ2h0LmRlbm9taW5hdG9yLnZhbHVlKSwgLyogYSBuZCovXG4gICAgICBtdWx0aXBseShsZWZ0LmRlbm9taW5hdG9yLnZhbHVlLCByaWdodC5udW1lcmF0b3IudmFsdWUpICAvKiBiIG5kKi9cbiAgICApLCAvKiAoYSAtIGIpIG5kKi9cbiAgICBsZWZ0Lm51bWVyYXRvci5icmFuZCxcbiAgICBtdWx0aXBseShsZWZ0LmRlbm9taW5hdG9yLnZhbHVlLCByaWdodC5kZW5vbWluYXRvci52YWx1ZSksIC8qIHkgZCoqMiovXG4gICAgbGVmdC5kZW5vbWluYXRvci5icmFuZCxcbiAgKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtSYXRpb30gbGVmdFxuICogQHBhcmFtIHtSYXRpb30gcmlnaHRcbiAqIEByZXR1cm5zIHtSYXRpb31cbiAqLyRozY9fb25jZS5zdWJ0cmFjdFJhdGlvcyhzdWJ0cmFjdFJhdGlvcyk7XG4gICAgICAgY29uc3QgbXVsdGlwbHlSYXRpb3MgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgYXNzZXJ0SXNSYXRpbyhyaWdodCk7XG4gIGFzc2VydElzUmF0aW8obGVmdCk7XG5cbiAgY29uc3QgZ2V0UmVtYWluaW5nQnJhbmRzID0gKCkgPT4ge1xuICAgIC8qIFByZWZlciByZXN1bHRzIHRoYXQgaGF2ZSB0aGUgc2FtZSBicmFuZCBhcyB0aGUgbGVmdCBvcGVyYW5kLiovXG4gICAgaWYgKHJpZ2h0Lm51bWVyYXRvci5icmFuZCA9PT0gcmlnaHQuZGVub21pbmF0b3IuYnJhbmQpIHtcbiAgICAgIHJldHVybiBbbGVmdC5udW1lcmF0b3IuYnJhbmQsIGxlZnQuZGVub21pbmF0b3IuYnJhbmRdO1xuICAgIH1cbiAgICBpZiAocmlnaHQubnVtZXJhdG9yLmJyYW5kID09PSBsZWZ0LmRlbm9taW5hdG9yLmJyYW5kKSB7XG4gICAgICByZXR1cm4gW2xlZnQubnVtZXJhdG9yLmJyYW5kLCByaWdodC5kZW5vbWluYXRvci5icmFuZF07XG4gICAgfVxuICAgIGlmIChsZWZ0Lm51bWVyYXRvci5icmFuZCA9PT0gcmlnaHQuZGVub21pbmF0b3IuYnJhbmQpIHtcbiAgICAgIHJldHVybiBbcmlnaHQubnVtZXJhdG9yLmJyYW5kLCBsZWZ0LmRlbm9taW5hdG9yLmJyYW5kXTtcbiAgICB9XG4gICAgaWYgKGxlZnQubnVtZXJhdG9yLmJyYW5kID09PSBsZWZ0LmRlbm9taW5hdG9yLmJyYW5kKSB7XG4gICAgICByZXR1cm4gW3JpZ2h0Lm51bWVyYXRvci5icmFuZCwgcmlnaHQuZGVub21pbmF0b3IuYnJhbmRdO1xuICAgIH1cbiAgICB0aHJvdyBGYWlsYGF0IGxlYXN0IG9uZSBicmFuZCBtdXN0IGNhbmNlbCBvdXQ6ICR7cShsZWZ0KX0gJHtxKHJpZ2h0KX1gO1xuICB9O1xuXG4gIGNvbnN0IFtudW1lcmF0b3JCcmFuZCwgZGVub21pbmF0b3JCcmFuZF0gPSBnZXRSZW1haW5pbmdCcmFuZHMoKTtcbiAgcmV0dXJuIG1ha2VSYXRpbyhcbiAgICBtdWx0aXBseShsZWZ0Lm51bWVyYXRvci52YWx1ZSwgcmlnaHQubnVtZXJhdG9yLnZhbHVlKSxcbiAgICBudW1lcmF0b3JCcmFuZCxcbiAgICBtdWx0aXBseShsZWZ0LmRlbm9taW5hdG9yLnZhbHVlLCByaWdodC5kZW5vbWluYXRvci52YWx1ZSksXG4gICAgZGVub21pbmF0b3JCcmFuZCxcbiAgKTtcbn07XG5cbi8qKlxuICogSWYgcmF0aW8gaXMgYmV0d2VlbiAwIGFuZCAxLCBzdWJ0cmFjdCBmcm9tIDEuXG4gKlxuICogQHBhcmFtIHtSYXRpb30gcmF0aW9cbiAqIEByZXR1cm5zIHtSYXRpb31cbiAqLyRozY9fb25jZS5tdWx0aXBseVJhdGlvcyhtdWx0aXBseVJhdGlvcyk7XG4gICAgICAgY29uc3Qgb25lTWludXMgPSByYXRpbyA9PiB7XG4gIGFzc2VydElzUmF0aW8ocmF0aW8pO1xuICByYXRpby5udW1lcmF0b3IuYnJhbmQgPT09IHJhdGlvLmRlbm9taW5hdG9yLmJyYW5kIHx8XG4gICAgRmFpbGBvbmVNaW51cyBvbmx5IHN1cHBvcnRzIHJhdGlvcyB3aXRoIGEgc2luZ2xlIGJyYW5kLCBidXQgJHtyYXRpby5udW1lcmF0b3IuYnJhbmR9IGRvZXNuJ3QgbWF0Y2ggJHtyYXRpby5kZW5vbWluYXRvci5icmFuZH1gO1xuICByYXRpby5udW1lcmF0b3IudmFsdWUgPD0gcmF0aW8uZGVub21pbmF0b3IudmFsdWUgfHxcbiAgICBGYWlsYFBhcmFtZXRlciBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byAxOiAke3JhdGlvLm51bWVyYXRvci52YWx1ZX0vJHtyYXRpby5kZW5vbWluYXRvci52YWx1ZX1gO1xuICByZXR1cm4gbWFrZVJhdGlvKFxuICAgIHN1YnRyYWN0KHJhdGlvLmRlbm9taW5hdG9yLnZhbHVlLCByYXRpby5udW1lcmF0b3IudmFsdWUpLFxuICAgIHJhdGlvLm51bWVyYXRvci5icmFuZCxcbiAgICByYXRpby5kZW5vbWluYXRvci52YWx1ZSxcbiAgICByYXRpby5udW1lcmF0b3IuYnJhbmQsXG4gICk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7UmF0aW99IGxlZnRcbiAqIEBwYXJhbSB7UmF0aW99IHJpZ2h0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRozY9fb25jZS5vbmVNaW51cyhvbmVNaW51cyk7XG4gICAgICAgY29uc3QgcmF0aW9HVEUgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgaWYgKGxlZnQubnVtZXJhdG9yLmJyYW5kID09PSByaWdodC5udW1lcmF0b3IuYnJhbmQpIHtcbiAgICBsZWZ0LmRlbm9taW5hdG9yLmJyYW5kID09PSByaWdodC5kZW5vbWluYXRvci5icmFuZCB8fFxuICAgICAgRmFpbGBudW1lcmF0b3IgYnJhbmRzIG1hdGNoLCBidXQgZGVub21pbmF0b3IgYnJhbmRzIGRvbid0OiAke3EobGVmdCl9ICR7cShcbiAgICAgICAgcmlnaHQsXG4gICAgICApfWA7XG4gIH0gZWxzZSBpZiAobGVmdC5udW1lcmF0b3IuYnJhbmQgPT09IGxlZnQuZGVub21pbmF0b3IuYnJhbmQpIHtcbiAgICByaWdodC5udW1lcmF0b3IuYnJhbmQgPT09IHJpZ2h0LmRlbm9taW5hdG9yLmJyYW5kIHx8XG4gICAgICBGYWlsYGxlZnRoYW5kIGJyYW5kcyBtYXRjaCwgYnV0IHJpZ2h0aGFuZCBicmFuZHMgZG9uJ3Q6ICR7cShsZWZ0KX0gJHtxKFxuICAgICAgICByaWdodCxcbiAgICAgICl9YDtcbiAgfVxuICByZXR1cm4gbmF0U2FmZU1hdGguaXNHVEUoXG4gICAgbXVsdGlwbHkobGVmdC5udW1lcmF0b3IudmFsdWUsIHJpZ2h0LmRlbm9taW5hdG9yLnZhbHVlKSxcbiAgICBtdWx0aXBseShyaWdodC5udW1lcmF0b3IudmFsdWUsIGxlZnQuZGVub21pbmF0b3IudmFsdWUpLFxuICApO1xufTtcblxuLyoqXG4gKiBUcnVlIGlmZiB0aGUgcmF0aW9zIGFyZSB0aGUgc2FtZSB2YWx1ZXMgKGVxdWFsIG9yIGVxdWl2YWxhbnQgbWF5IHJldHVyblxuICogZmFsc2UpXG4gKlxuICogQHBhcmFtIHtSYXRpb30gbGVmdFxuICogQHBhcmFtIHtSYXRpb30gcmlnaHRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjNj19vbmNlLnJhdGlvR1RFKHJhdGlvR1RFKTtcbiAgICAgICBjb25zdCByYXRpb3NTYW1lID0gKGxlZnQsIHJpZ2h0KSA9PiB7XG4gIHJldHVybiAoXG4gICAgQW1vdW50TWF0aC5pc0VxdWFsKGxlZnQubnVtZXJhdG9yLCByaWdodC5udW1lcmF0b3IpICYmXG4gICAgQW1vdW50TWF0aC5pc0VxdWFsKGxlZnQuZGVub21pbmF0b3IsIHJpZ2h0LmRlbm9taW5hdG9yKVxuICApO1xufTtcblxuLyoqXG4gKiBNYWtlIGEgbmV3IHJhdGlvIHdpdGggYSBzbWFsbGVyIGRlbm9taW5hdG9yIHRoYXQgYXBwcm94aW1hdGVzIHRoZSByYXRpby4gSWZcbiAqIHRoZSBwcm9wb3NlZCBkZW5vbWluYXRvciBpcyBsYXJnZXIgdGhhbiB0aGUgY3VycmVudCBvbmUsIHJldHVybiB0aGVcbiAqIG9yaWdpbmFsLlxuICpcbiAqIEBwYXJhbSB7UmF0aW99IHJhdGlvXG4gKiBAcGFyYW0ge2JpZ2ludH0gbmV3RGVuXG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi8kaM2PX29uY2UucmF0aW9zU2FtZShyYXRpb3NTYW1lKTtcbiAgICAgICBjb25zdCBxdWFudGl6ZSA9IChyYXRpbywgbmV3RGVuKSA9PiB7XG4gIGNvbnN0IG9sZERlbiA9IHJhdGlvLmRlbm9taW5hdG9yLnZhbHVlO1xuICBjb25zdCBvbGROdW0gPSByYXRpby5udW1lcmF0b3IudmFsdWU7XG4gIGlmIChuZXdEZW4gPiBvbGREZW4pIHtcbiAgICByZXR1cm4gcmF0aW87XG4gIH1cblxuICBjb25zdCBuZXdOdW0gPVxuICAgIG5ld0RlbiA9PT0gb2xkRGVuID8gb2xkTnVtIDogYmFua2Vyc0RpdmlkZShvbGROdW0gKiBuZXdEZW4sIG9sZERlbik7XG4gIHJldHVybiBtYWtlUmF0aW8oXG4gICAgbmV3TnVtLFxuICAgIHJhdGlvLm51bWVyYXRvci5icmFuZCxcbiAgICBuZXdEZW4sXG4gICAgcmF0aW8uZGVub21pbmF0b3IuYnJhbmQsXG4gICk7XG59OyRozY9fb25jZS5xdWFudGl6ZShxdWFudGl6ZSk7XG5cbmNvbnN0IE5VTUVSSUNfUkUgPSAvXihcXGRcXGQqKSg/OlxcLihcXGQqKSk/JC87XG4vKiogQHR5cGVkZWYge2JpZ2ludCB8IG51bWJlciB8IHN0cmluZ30gUGFyc2FibGVOdW1iZXIgKi9cblxuLyoqXG4gKiBDcmVhdGUgYSByYXRpbyBmcm9tIGEgZ2l2ZW4gbnVtZXJpYyB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge1BhcnNhYmxlTnVtYmVyfSBudW1lcmljXG4gKiBAcGFyYW0ge0JyYW5kPCduYXQnPn0gbnVtZXJhdG9yQnJhbmRcbiAqIEBwYXJhbSB7QnJhbmQ8J25hdCc+fSBbZGVub21pbmF0b3JCcmFuZF1cbiAqIEByZXR1cm5zIHtSYXRpb31cbiAqL1xuICAgICAgIGNvbnN0IHBhcnNlUmF0aW8gPSAoXG4gIG51bWVyaWMsXG4gIG51bWVyYXRvckJyYW5kLFxuICBkZW5vbWluYXRvckJyYW5kID0gbnVtZXJhdG9yQnJhbmQsXG4pID0+IHtcbiAgY29uc3QgbWF0Y2ggPSBgJHtudW1lcmljfWAubWF0Y2goTlVNRVJJQ19SRSk7XG4gIGlmICghbWF0Y2gpIHtcbiAgICB0aHJvdyBGYWlsYEludmFsaWQgbnVtZXJpYyBkYXRhOiAke251bWVyaWN9YDtcbiAgfVxuXG4gIGNvbnN0IFtfLCB3aG9sZSwgcGFydCA9ICcnXSA9IG1hdGNoO1xuICByZXR1cm4gbWFrZVJhdGlvKFxuICAgIEJpZ0ludChgJHt3aG9sZX0ke3BhcnR9YCksXG4gICAgbnVtZXJhdG9yQnJhbmQsXG4gICAgMTBuICoqIEJpZ0ludChwYXJ0Lmxlbmd0aCksXG4gICAgZGVub21pbmF0b3JCcmFuZCxcbiAgKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBzcGVjaW1lblxuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgUGFyc2FibGVOdW1iZXJ9XG4gKi8kaM2PX29uY2UucGFyc2VSYXRpbyhwYXJzZVJhdGlvKTtcbiAgICAgICBjb25zdCBhc3NlcnRQYXJzYWJsZU51bWJlciA9IHNwZWNpbWVuID0+IHtcbiAgY29uc3QgbWF0Y2ggPSBgJHtzcGVjaW1lbn1gLm1hdGNoKE5VTUVSSUNfUkUpO1xuICBtYXRjaCB8fCBGYWlsYEludmFsaWQgbnVtZXJpYyBkYXRhOiAke3NwZWNpbWVufWA7XG59O1xuXG4vKipcbiAqIFJhdGlvcyBtaWdodCBiZSBncmVhdGVyIG9yIGxlc3MgdGhhbiBvbmUuXG4gKlxuICogQHBhcmFtIHtSYXRpb30gcmF0aW9cbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi8kaM2PX29uY2UuYXNzZXJ0UGFyc2FibGVOdW1iZXIoYXNzZXJ0UGFyc2FibGVOdW1iZXIpO1xuICAgICAgIGNvbnN0IHJhdGlvVG9OdW1iZXIgPSByYXRpbyA9PiB7XG4gIGNvbnN0IG4gPSBOdW1iZXIocmF0aW8ubnVtZXJhdG9yLnZhbHVlKTtcbiAgY29uc3QgZCA9IE51bWJlcihyYXRpby5kZW5vbWluYXRvci52YWx1ZSk7XG4gIHJldHVybiBuIC8gZDtcbn07JGjNj19vbmNlLnJhdGlvVG9OdW1iZXIocmF0aW9Ub051bWJlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3NlcnRJc1JhdGlvIjpbImFzc2VydElzUmF0aW8iXSwibWFrZVJhdGlvIjpbIm1ha2VSYXRpbyJdLCJtYWtlUmF0aW9Gcm9tQW1vdW50cyI6WyJtYWtlUmF0aW9Gcm9tQW1vdW50cyJdLCJmbG9vck11bHRpcGx5QnkiOlsiZmxvb3JNdWx0aXBseUJ5Il0sImNlaWxNdWx0aXBseUJ5IjpbImNlaWxNdWx0aXBseUJ5Il0sIm11bHRpcGx5QnkiOlsibXVsdGlwbHlCeSJdLCJmbG9vckRpdmlkZUJ5IjpbImZsb29yRGl2aWRlQnkiXSwiY2VpbERpdmlkZUJ5IjpbImNlaWxEaXZpZGVCeSJdLCJkaXZpZGVCeSI6WyJkaXZpZGVCeSJdLCJpbnZlcnRSYXRpbyI6WyJpbnZlcnRSYXRpbyJdLCJhZGRSYXRpb3MiOlsiYWRkUmF0aW9zIl0sInN1YnRyYWN0UmF0aW9zIjpbInN1YnRyYWN0UmF0aW9zIl0sIm11bHRpcGx5UmF0aW9zIjpbIm11bHRpcGx5UmF0aW9zIl0sIm9uZU1pbnVzIjpbIm9uZU1pbnVzIl0sInJhdGlvR1RFIjpbInJhdGlvR1RFIl0sInJhdGlvc1NhbWUiOlsicmF0aW9zU2FtZSJdLCJxdWFudGl6ZSI6WyJxdWFudGl6ZSJdLCJwYXJzZVJhdGlvIjpbInBhcnNlUmF0aW8iXSwiYXNzZXJ0UGFyc2FibGVOdW1iZXIiOlsiYXNzZXJ0UGFyc2FibGVOdW1iZXIiXSwicmF0aW9Ub051bWJlciI6WyJyYXRpb1RvTnVtYmVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHAvFuWKBwAAigcAACQAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvc2FmZU1hdGguanN7ImltcG9ydHMiOlsiQGVuZG8vbmF0Il0sImV4cG9ydHMiOlsibmF0U2FmZU1hdGgiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBOYXQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLFskaM2PX2EgPT4gKE5hdCA9ICRozY9fYSldXV1dXSk7XG5cbi8qKiBAdHlwZWRlZiB7KHg6IG51bWJlciB8IGJpZ2ludCwgeTogbnVtYmVyIHwgYmlnaW50KSA9PiBiaWdpbnR9IE5hdE9wICovXG5cbi8qKlxuICogVGhlc2Ugb3BlcmF0aW9ucyBzaG91bGQgYmUgdXNlZCBmb3IgY2FsY3VsYXRpb25zIHdpdGggdGhlIHZhbHVlcyBvZiBiYXNpY1xuICogZnVuZ2libGUgdG9rZW5zLlxuICpcbiAqIG5hdFNhZmVNYXRoIGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgZGlyZWN0bHksIGFuZCBzbyBpdCBuZWVkcyB0byB2YWxpZGF0ZSB0aGVcbiAqIGlucHV0cywgYXMgd2VsbCBhcyB0aGUgb3V0cHV0cyB3aGVuIG5lY2Vzc2FyeS5cbiAqL1xuICAgICAgIGNvbnN0IG5hdFNhZmVNYXRoID0gaGFyZGVuKHtcbiAgLyoqIEB0eXBlIHtOYXRPcH0gKi9cbiAgLyogQmlnSW50cyBkb24ndCBvYnNlcnZhYmx5IG92ZXJmbG93Ki9cbiAgYWRkOiAoeCwgeSkgPT4gTmF0KHgpICsgTmF0KHkpLFxuICAvKiogQHR5cGUge05hdE9wfSAqL1xuICBzdWJ0cmFjdDogKHgsIHkpID0+IE5hdChOYXQoeCkgLSBOYXQoeSkpLFxuICAvKiogQHR5cGUge05hdE9wfSAqL1xuICBtdWx0aXBseTogKHgsIHkpID0+IE5hdCh4KSAqIE5hdCh5KSxcbiAgLyoqIEB0eXBlIHtOYXRPcH0gKi9cbiAgZmxvb3JEaXZpZGU6ICh4LCB5KSA9PiBOYXQoeCkgLyBOYXQoeSksXG4gIC8qKiBAdHlwZSB7TmF0T3B9ICovXG4gIGNlaWxEaXZpZGU6ICh4LCB5KSA9PiB7XG4gICAgeSA9IE5hdCh5KTtcbiAgICByZXR1cm4gTmF0KE5hdCh4KSArIHkgLSAxbikgLyB5O1xuICB9LFxuICAvKipcbiAqIERpdmlkZSB1c2luZyBoYWxmLXRvLWV2ZW4gKGFrYSBCYW5rZXIncyBSb3VuZGluZykgYXMgaW4gSUVFRSA3NzQgZGVmYXVsdFxuICogcm91bmRpbmdcbiAqXG4gKiBAdHlwZSB7TmF0T3B9XG4gKi9cbiAgYmFua2Vyc0RpdmlkZTogKGEsIGIpID0+IHtcbiAgICBhID0gTmF0KGEpO1xuICAgIGIgPSBOYXQoYik7XG5cbiAgICBjb25zdCBkaXYgPSBhIC8gYjtcbiAgICBjb25zdCByZW0gPSBhICUgYjtcbiAgICAvKiBpZiByZW1haW5kZXIgPiBoYWxmIGRpdmlzb3IsIHNob3VsZCBoYXZlIHJvdW5kZWQgdXAgaW5zdGVhZCBvZiBkb3duLCBzbyBhZGQgMSovXG4gICAgaWYgKHJlbSAqIDJuID4gYikge1xuICAgICAgcmV0dXJuIGRpdiArIDFuO1xuICAgIH0gZWxzZSBpZiAocmVtICogMm4gPT09IGIpIHtcbiAgICAgIC8qIEFkZCAxIGlmIHJlc3VsdCBpcyBvZGQgdG8gZ2V0IGFuIGV2ZW4gcmV0dXJuIHZhbHVlKi9cbiAgICAgIGlmIChkaXYgJSAybiA9PT0gMW4pIHJldHVybiBkaXYgKyAxbjtcbiAgICB9XG4gICAgcmV0dXJuIGRpdjtcbiAgfSxcbiAgLyoqIEB0eXBlIHsoeDogbnVtYmVyIHwgYmlnaW50LCB5OiBudW1iZXIgfCBiaWdpbnQpID0+IGJvb2xlYW59ICovXG4gIGlzR1RFOiAoeCwgeSkgPT4gTmF0KHgpID49IE5hdCh5KSxcbn0pOyRozY9fb25jZS5uYXRTYWZlTWF0aChuYXRTYWZlTWF0aCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJuYXRTYWZlTWF0aCI6WyJuYXRTYWZlTWF0aCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABg5KxbGQcAABkHAAAtAAAAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3RyYW5zaWVudE5vdGlmaWVyLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvdmF0LWRhdGEiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy9ub3RpZmllciJdLCJleHBvcnRzIjpbIm1ha2VUcmFuc2llbnROb3RpZmllcktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUscHJvdmlkZUxhenksbWFrZU5vdGlmaWVyS2l0OyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZVwiLFskaM2PX2EgPT4gKG1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJwcm92aWRlTGF6eVwiLFskaM2PX2EgPT4gKHByb3ZpZGVMYXp5ID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wibWFrZU5vdGlmaWVyS2l0XCIsWyRozY9fYSA9PiAobWFrZU5vdGlmaWVyS2l0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1B1cnNlfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge05vdGlmaWVyUmVjb3JkfSBmcm9tICdAYWdvcmljL25vdGlmaWVyJztcbiAqIEBpbXBvcnQge1dlYWtNYXBTdG9yZX0gZnJvbSAnQGFnb3JpYy9zdG9yZSc7XG4gKi9cblxuLyogTm90ZTogVmlydHVhbCBmb3IgaGlnaCBjYXJkaW5hbGl0eSwgYnV0ICpub3QqIGR1cmFibGUsIGFuZCBzbyovXG4vKiBicm9rZW4gYWNyb3NzIGFuIHVwZ3JhZGUuKi9cbiAgICAgICBjb25zdCBtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQgPSAoKSA9PiB7XG4gIC8qKiBAdHlwZSB7V2Vha01hcFN0b3JlPFB1cnNlLCBOb3RpZmllclJlY29yZDxhbnk+Pn0gKi9cbiAgY29uc3QgdHJhbnNpZW50Tm90aWZlcktpdHMgPSBtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlKFxuICAgICd0cmFuc2llbnROb3RpZmVyS2l0cycsXG4gICk7XG5cbiAgY29uc3QgcHJvdmlkZU5vdGlmaWVyS2l0ID0ga2V5ID0+XG4gICAgcHJvdmlkZUxhenkodHJhbnNpZW50Tm90aWZlcktpdHMsIGtleSwgKCkgPT5cbiAgICAgIG1ha2VOb3RpZmllcktpdChrZXkuZ2V0Q3VycmVudEFtb3VudCgpKSxcbiAgICApO1xuXG4gIGNvbnN0IHByb3ZpZGVOb3RpZmllciA9IGtleSA9PiBwcm92aWRlTm90aWZpZXJLaXQoa2V5KS5ub3RpZmllcjtcbiAgY29uc3QgdXBkYXRlID0gKGtleSwgbmV3VmFsdWUpID0+IHtcbiAgICBpZiAodHJhbnNpZW50Tm90aWZlcktpdHMuaGFzKGtleSkpIHtcbiAgICAgIGNvbnN0IHsgdXBkYXRlciB9ID0gdHJhbnNpZW50Tm90aWZlcktpdHMuZ2V0KGtleSk7XG4gICAgICB1cGRhdGVyLnVwZGF0ZVN0YXRlKG5ld1ZhbHVlKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIHsgcHJvdmlkZU5vdGlmaWVyLCB1cGRhdGUgfTtcbn07JGjNj19vbmNlLm1ha2VUcmFuc2llbnROb3RpZmllcktpdChtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQpO1xuaGFyZGVuKG1ha2VUcmFuc2llbnROb3RpZmllcktpdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQiOlsibWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOX636tALQAAQC0AACYAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbIkFtb3VudFBhdHRlcm5TaGFwZSIsIkFtb3VudFNoYXBlIiwiQXNzZXRLaW5kU2hhcGUiLCJCcmFuZEkiLCJCcmFuZFNoYXBlIiwiRGVwb3NpdEZhY2V0U2hhcGUiLCJEaXNwbGF5SW5mb1NoYXBlIiwiSXNzdWVyS2l0U2hhcGUiLCJJc3N1ZXJTaGFwZSIsIk1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyIsIk1pbnRTaGFwZSIsIk5vdGlmaWVyU2hhcGUiLCJQYXltZW50U2hhcGUiLCJQdXJzZVNoYXBlIiwiUmF0aW9TaGFwZSIsImlzQ29weUJhZ1ZhbHVlIiwiaXNDb3B5U2V0VmFsdWUiLCJpc05hdFZhbHVlIiwiaXNTZXRWYWx1ZSIsIm1ha2VJc3N1ZXJJbnRlcmZhY2VzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgTSxtYXRjaGVzLGdldEludGVyZmFjZUd1YXJkUGF5bG9hZDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJtYXRjaGVzXCIsWyRozY9fYSA9PiAobWF0Y2hlcyA9ICRozY9fYSldXSxbXCJnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWRcIixbJGjNj19hID0+IChnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cbi8qKlxuICogQGltcG9ydCB7QW1vdW50VmFsdWUsIFJhdGlvfSBmcm9tICcuL3R5cGVzLmpzJ1xuICogQGltcG9ydCB7VHlwZWRQYXR0ZXJufSBmcm9tICdAYWdvcmljL2ludGVybmFsJ1xuICogQGltcG9ydCB7Q29weUJhZywgQ29weVNldCwgUGF0dGVybn0gZnJvbSAnQGVuZG8vcGF0dGVybnMnO1xuICogQGltcG9ydCB7TmF0VmFsdWUsIFNldFZhbHVlfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqL1xuXG4gICAgICAgY29uc3QgQnJhbmRTaGFwZSA9IE0ucmVtb3RhYmxlKCdCcmFuZCcpOyRozY9fb25jZS5CcmFuZFNoYXBlKEJyYW5kU2hhcGUpO1xuICAgICAgIGNvbnN0IElzc3VlclNoYXBlID0gTS5yZW1vdGFibGUoJ0lzc3VlcicpOyRozY9fb25jZS5Jc3N1ZXJTaGFwZShJc3N1ZXJTaGFwZSk7XG4gICAgICAgY29uc3QgUGF5bWVudFNoYXBlID0gTS5yZW1vdGFibGUoJ1BheW1lbnQnKTskaM2PX29uY2UuUGF5bWVudFNoYXBlKFBheW1lbnRTaGFwZSk7XG4gICAgICAgY29uc3QgUHVyc2VTaGFwZSA9IE0ucmVtb3RhYmxlKCdQdXJzZScpOyRozY9fb25jZS5QdXJzZVNoYXBlKFB1cnNlU2hhcGUpO1xuICAgICAgIGNvbnN0IERlcG9zaXRGYWNldFNoYXBlID0gTS5yZW1vdGFibGUoJ0RlcG9zaXRGYWNldCcpOyRozY9fb25jZS5EZXBvc2l0RmFjZXRTaGFwZShEZXBvc2l0RmFjZXRTaGFwZSk7XG4gICAgICAgY29uc3QgTm90aWZpZXJTaGFwZSA9IE0ucmVtb3RhYmxlKCdOb3RpZmllcicpOyRozY9fb25jZS5Ob3RpZmllclNoYXBlKE5vdGlmaWVyU2hhcGUpO1xuICAgICAgIGNvbnN0IE1pbnRTaGFwZSA9IE0ucmVtb3RhYmxlKCdNaW50Jyk7XG5cbi8qKlxuICogV2hlbiB0aGUgQW1vdW50VmFsdWUgb2YgYW4gQW1vdW50IGZpdHMgdGhlIE5hdFZhbHVlU2hhcGUsIGkuZS4sIHdoZW4gaXQgaXMgYVxuICogbm9uLW5lZ2F0aXZlIGJpZ2ludCwgdGhlbiBpdCByZXByZXNlbnRzIHRoYXQgbWFueSB1bml0cyBvZiB0aGUgZnVuZ2libGUgYXNzZXRcbiAqIHJlcHJlc2VudGVkIGJ5IHRoYXQgYW1vdW50LiBUaGUgYnJhbmQgb2YgdGhhdCBhbW91bnQgc2hvdWxkIGluZGVlZCByZXByZXNlbnRcbiAqIGEga2luZCBvZiBhc3NldCBjb25zaXN0aW5nIG9mIGEgY291bnRhYmxlIHNldCBvZiBmdW5naWJsZSB1bml0cy5cbiAqLyRozY9fb25jZS5NaW50U2hhcGUoTWludFNoYXBlKTtcbmNvbnN0IE5hdFZhbHVlU2hhcGUgPSBNLm5hdCgpO1xuXG4vKipcbiAqIFdoZW4gdGhlIEFtb3VudFZhbHVlIG9mIGFuIEFtb3VudCBmaXRzIHRoZSBDb3B5U2V0VmFsdWVTaGFwZSwgaS5lLiwgd2hlbiBpdFxuICogaXMgYSBDb3B5U2V0LCB0aGVuIGl0IHJlcHJlc2VudHMgdGhlIHNldCBvZiB0aG9zZSBrZXlzLCB3aGVyZSBlYWNoIGtleVxuICogcmVwcmVzZW50cyBzb21lIGluZGl2aWR1YWwgbm9uLWZ1bmdpYmxlIGl0ZW0sIGxpa2UgYSBjb25jZXJ0IHRpY2tldCwgZnJvbSB0aGVcbiAqIG5vbi1mdW5naWJsZSBhc3NldCBjbGFzcyByZXByZXNlbnRlZCBieSB0aGF0IGFtb3VudCdzIGJyYW5kLiBUaGUgYW1vdW50XG4gKiBpdHNlbGYgcmVwcmVzZW50cyB0aGUgc2V0IG9mIHRoZXNlIGl0ZW1zLCBhcyBvcHBvc2VkIHRvIGFueSBvZiB0aGUgb3RoZXJcbiAqIGl0ZW1zIGZyb20gdGhlIHNhbWUgYXNzZXQgY2xhc3MuXG4gKlxuICogSWYgYSBnaXZlbiB2YWx1ZSBjbGFzcyByZXByZXNlbnRzIGNvbmNlcnQgdGlja2V0cywgaXQgc2VlbXMgYml6YXJyZSB0aGF0IHdlXG4gKiBjYW4gZm9ybSBhbW91bnRzIG9mIGFueSBrZXkuIFRoZSBoYXJkIGNvbnN0cmFpbnQgaXMgdGhhdCB0aGUgY29kZSB0aGF0IGhvbGRzXG4gKiB0aGUgbWludCBmb3IgdGhhdCBhc3NldCBjbGFzcy0tLXRoZSBvbmUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgYnJhbmQsIG9ubHlcbiAqIG1pbnRzIHRoZSBpdGVtcyByZXByZXNlbnRpbmcgdGhlIHJlYWwgdW5pdHMgb2YgdGhhdCBhc3NldCBjbGFzcyBhcyBkZWZpbmVkIGJ5XG4gKiBpdC4gQW55b25lIGVsc2UgY2FuIHB1dCB0b2dldGhlciBhbiBhbW91bnQgZXhwcmVzc2luZywgZm9yIGV4YW1wbGUsIHRoYXQgdGhleVxuICogXCJ3YW50XCIgc29tZSBpdGVtcyB0aGF0IHdpbGwgbmV2ZXIgYmUgbWludGVkLiBUaGF0IHdhbnQgd2lsbCBuZXZlciBiZVxuICogc2F0aXNmaWVkLiBcIllvdSBjYW4ndCBhbHdheXMgZ2V0Li4uXCJcbiAqL1xuY29uc3QgQ29weVNldFZhbHVlU2hhcGUgPSBNLnNldCgpO1xuXG4vKipcbiAqIFdoZW4gdGhlIEFtb3VudFZhbHVlIG9mIGFuIEFtb3VudCBmaXRzIHRoZSBTZXRWYWx1ZVNoYXBlLCBpLmUuLCB3aGVuIGl0IGlzIGFcbiAqIENvcHlBcnJheSBvZiBwYXNzYWJsZSBLZXlzLiBUaGlzIHJlcHJlc2VudGF0aW9uIGlzIGRlcHJlY2F0ZWQuXG4gKlxuICogQGRlcHJlY2F0ZWQgUGxlYXNlIGNoYW5nZSBmcm9tIHVzaW5nIGFycmF5LWJhc2VkIFNldFZhbHVlcyB0byBDb3B5U2V0LWJhc2VkXG4gKiAgIENvcHlTZXRWYWx1ZXMuXG4gKi9cbmNvbnN0IFNldFZhbHVlU2hhcGUgPSBNLmFycmF5T2YoTS5rZXkoKSk7XG5cbi8qKlxuICogV2hlbiB0aGUgQW1vdW50VmFsdWUgb2YgYW4gQW1vdW50IGZpdHMgdGhlIENvcHlCYWdWYWx1ZVNoYXBlLCBpLmUuLCB3aGVuIGl0XG4gKiBpcyBhIENvcHlCYWcsIHRoZW4gaXQgcmVwcmVzZW50cyB0aGUgYmFnIChtdWx0aXNldCkgb2YgdGhvc2Uga2V5cywgd2hlcmUgZWFjaFxuICoga2V5IHJlcHJlc2VudHMgc29tZSBpbmRpdmlkdWFsIHNlbWktZnVuZ2libGUgaXRlbSwgbGlrZSBhIGNvbmNlcnQgdGlja2V0LFxuICogZnJvbSB0aGUgc2VtaS1mdW5naWJsZSBhc3NldCBjbGFzcyByZXByZXNlbnRlZCBieSB0aGF0IGFtb3VudCdzIGJyYW5kLiBUaGVcbiAqIG51bWJlciBvZiB0aW1lcyB0aGF0IGtleSBhcHBlYXJzIGluIHRoZSBiYWcgaXMgdGhlIG51bWJlciBvZiBmdW5naWJsZSB1bml0c1xuICogb2YgdGhhdCBrZXkuIFRoZSBhbW91bnQgaXRzZWxmIHJlcHJlc2VudHMgdGhlIGJhZyBvZiB0aGVzZSBpdGVtcywgYXMgb3Bwb3NlZFxuICogdG8gYW55IG9mIHRoZSBvdGhlciBpdGVtcyBmcm9tIHRoZSBzYW1lIGFzc2V0IGNsYXNzLlxuICpcbiAqIElmIGEgZ2l2ZW4gdmFsdWUgY2xhc3MgcmVwcmVzZW50cyBjb25jZXJ0IHRpY2tldHMsIGl0IHNlZW1zIGJpemFycmUgdGhhdCB3ZVxuICogY2FuIGZvcm0gYW1vdW50cyBvZiBhbnkga2V5LiBUaGUgaGFyZCBjb25zdHJhaW50IGlzIHRoYXQgdGhlIGNvZGUgdGhhdCBob2xkc1xuICogdGhlIG1pbnQgZm9yIHRoYXQgYXNzZXQgY2xhc3MtLS10aGUgb25lIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGJyYW5kLCBvbmx5XG4gKiBtaW50cyB0aGUgaXRlbXMgcmVwcmVzZW50aW5nIHRoZSByZWFsIHVuaXRzIG9mIHRoYXQgYXNzZXQgY2xhc3MgYXMgZGVmaW5lZCBieVxuICogaXQuIEFueW9uZSBlbHNlIGNhbiBwdXQgdG9nZXRoZXIgYW4gYW1vdW50IGV4cHJlc3NpbmcsIGZvciBleGFtcGxlLCB0aGF0IHRoZXlcbiAqIFwid2FudFwiIHNvbWUgaXRlbXMgdGhhdCB3aWxsIG5ldmVyIGJlIG1pbnRlZC4gVGhhdCB3YW50IHdpbGwgbmV2ZXIgYmVcbiAqIHNhdGlzZmllZC4gXCJZb3UgY2FuJ3QgYWx3YXlzIGdldC4uLlwiXG4gKi9cbmNvbnN0IENvcHlCYWdWYWx1ZVNoYXBlID0gTS5iYWcoKTtcblxuY29uc3QgQW1vdW50VmFsdWVTaGFwZSA9IE0ub3IoXG4gIE5hdFZhbHVlU2hhcGUsXG4gIENvcHlTZXRWYWx1ZVNoYXBlLFxuICBTZXRWYWx1ZVNoYXBlLFxuICBDb3B5QmFnVmFsdWVTaGFwZSxcbik7XG5cbiAgICAgICBjb25zdCBBbW91bnRTaGFwZSA9IHsgYnJhbmQ6IEJyYW5kU2hhcGUsIHZhbHVlOiBBbW91bnRWYWx1ZVNoYXBlIH07JGjNj19vbmNlLkFtb3VudFNoYXBlKEFtb3VudFNoYXBlKTtcbmhhcmRlbihBbW91bnRTaGFwZSk7XG5cbi8qKlxuICogVG8gYmUgdXNlZCB0byBndWFyZCBhbiBhbW91bnQgcGF0dGVybiBhcmd1bWVudCwgaS5lLiwgYW4gYXJndW1lbnQgd2hpY2ggaXMgYVxuICogcGF0dGVybiB0aGF0IGNhbiBiZSB1c2VkIHRvIHRlc3QgYW1vdW50cy4gU2luY2UgYW1vdW50cyBhcmUga2V5cywgYW55d2hlcmUgYW5cbiAqIGFtb3VudCBwYXR0ZXJuIGlzIGV4cGVjdGVkLCBhbiBhbW91bnQgY2FuIGJlIHByb3ZpZGVkIGFuZCB3aWxsIG1hdGNoIG9ubHlcbiAqIHRoYXQgY29uY3JldGUgYW1vdW50LCBpLmUuLCBhbW91bnRzIHRoYXQgYXJlIGBrZXlFUWAgdG8gdGhhdCBhbW91bnQuXG4gKlxuICogVGhlIGBBbW91bnRTaGFwZWAgZ3VhcmQgYWJvdmUgaXMgYW4gYW1vdW50IHBhdHRlcm4uIEJ1dCBub3QgYWxsIGFtb3VudFxuICogcGF0dGVybnMgYXJlIGxpa2UgYEFtb3VudFNoYXBlYC4gRm9yIGV4YW1wbGUsIGBNLmFueSgpYCBpcyBhIHZhbGlkIGFtb3VudFxuICogcGF0dGVybiB0aGF0IHdpbGwgYWRtaXQgYW55IGFtb3VudCwgYnV0IGlzIGRvZXMgbm90IHJlc2VtYmxlIHRoZVxuICogYEFtb3VudFNoYXBlYCBwYXR0ZXJuIGFib3ZlLlxuICovXG4gICAgICAgY29uc3QgQW1vdW50UGF0dGVyblNoYXBlID0gTS5wYXR0ZXJuKCk7XG5cbi8qKiBAdHlwZSB7VHlwZWRQYXR0ZXJuPFJhdGlvPn0gKi8kaM2PX29uY2UuQW1vdW50UGF0dGVyblNoYXBlKEFtb3VudFBhdHRlcm5TaGFwZSk7XG4gICAgICAgY29uc3QgUmF0aW9TaGFwZSA9IHsgbnVtZXJhdG9yOiBBbW91bnRTaGFwZSwgZGVub21pbmF0b3I6IEFtb3VudFNoYXBlIH07JGjNj19vbmNlLlJhdGlvU2hhcGUoUmF0aW9TaGFwZSk7XG5oYXJkZW4oUmF0aW9TaGFwZSk7XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGEgTmF0IGJpZ2ludC5cbiAqXG4gKiBAcGFyYW0ge0Ftb3VudFZhbHVlfSB2YWx1ZVxuICogQHJldHVybnMge3ZhbHVlIGlzIE5hdFZhbHVlfVxuICovXG4gICAgICAgY29uc3QgaXNOYXRWYWx1ZSA9IHZhbHVlID0+IG1hdGNoZXModmFsdWUsIE5hdFZhbHVlU2hhcGUpOyRozY9fb25jZS5pc05hdFZhbHVlKGlzTmF0VmFsdWUpO1xuaGFyZGVuKGlzTmF0VmFsdWUpO1xuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBhIENvcHlTZXRcbiAqXG4gKiBAcGFyYW0ge0Ftb3VudFZhbHVlfSB2YWx1ZVxuICogQHJldHVybnMge3ZhbHVlIGlzIENvcHlTZXR9XG4gKi9cbiAgICAgICBjb25zdCBpc0NvcHlTZXRWYWx1ZSA9IHZhbHVlID0+IG1hdGNoZXModmFsdWUsIENvcHlTZXRWYWx1ZVNoYXBlKTskaM2PX29uY2UuaXNDb3B5U2V0VmFsdWUoaXNDb3B5U2V0VmFsdWUpO1xuaGFyZGVuKGlzQ29weVNldFZhbHVlKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgYSBwYXNzIGJ5IGNvcHkgYXJyYXkgc3RydWN0dXJlLiBEb2VzIG5vdCBjaGVjayBmb3JcbiAqIGR1cGxpY2F0ZXMuIFRvIGNoZWNrIGZvciBkdXBsaWNhdGVzLCB1c2Ugc2V0TWF0aEhlbHBlcnMuY29lcmNlLlxuICpcbiAqIEBkZXByZWNhdGVkIFBsZWFzZSBjaGFuZ2UgZnJvbSB1c2luZyBhcnJheS1iYXNlZCBTZXRWYWx1ZXMgdG8gQ29weVNldC1iYXNlZFxuICogICBDb3B5U2V0VmFsdWVzLlxuICogQHBhcmFtIHtBbW91bnRWYWx1ZX0gdmFsdWVcbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBTZXRWYWx1ZX1cbiAqL1xuICAgICAgIGNvbnN0IGlzU2V0VmFsdWUgPSB2YWx1ZSA9PiBtYXRjaGVzKHZhbHVlLCBTZXRWYWx1ZVNoYXBlKTskaM2PX29uY2UuaXNTZXRWYWx1ZShpc1NldFZhbHVlKTtcbmhhcmRlbihpc1NldFZhbHVlKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgYSBDb3B5QmFnXG4gKlxuICogQHBhcmFtIHtBbW91bnRWYWx1ZX0gdmFsdWVcbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBDb3B5QmFnfVxuICovXG4gICAgICAgY29uc3QgaXNDb3B5QmFnVmFsdWUgPSB2YWx1ZSA9PiBtYXRjaGVzKHZhbHVlLCBDb3B5QmFnVmFsdWVTaGFwZSk7JGjNj19vbmNlLmlzQ29weUJhZ1ZhbHVlKGlzQ29weUJhZ1ZhbHVlKTtcbmhhcmRlbihpc0NvcHlCYWdWYWx1ZSk7XG5cbi8qIE9uZSBHT09HT0x0aCBzaG91bGQgYmUgZW5vdWdoIGRlY2ltYWwgcGxhY2VzIGZvciBhbnlib2R5LiovXG4gICAgICAgY29uc3QgTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTID0gMTAwOyRozY9fb25jZS5NQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMoTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTKTtcblxuICAgICAgIGNvbnN0IEFzc2V0S2luZFNoYXBlID0gTS5vcignbmF0JywgJ3NldCcsICdjb3B5U2V0JywgJ2NvcHlCYWcnKTskaM2PX29uY2UuQXNzZXRLaW5kU2hhcGUoQXNzZXRLaW5kU2hhcGUpO1xuXG4gICAgICAgY29uc3QgRGlzcGxheUluZm9TaGFwZSA9IE0uc3BsaXRSZWNvcmQoXG4gIHt9LFxuICB7XG4gICAgZGVjaW1hbFBsYWNlczogTS5hbmQoXG4gICAgICBNLmd0ZSgtTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTKSxcbiAgICAgIE0ubHRlKE1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyksXG4gICAgKSxcbiAgICBhc3NldEtpbmQ6IEFzc2V0S2luZFNoYXBlLFxuICB9LFxuICB7XG4gICAgLyogSW5jbHVkaW5nIHRoaXMgZW1wdHkgYHJlc3RgIGVuc3VyZXMgdGhhdCB0aGVyZSBhcmUgbm8gb3RoZXIqL1xuICAgIC8qIHByb3BlcnRpZXMgYmV5b25kIHRob3NlIGluIHRoZSBgYmFzZWAgcmVjb3JkLiovXG4gIH0sXG4pOyRozY9fb25jZS5EaXNwbGF5SW5mb1NoYXBlKERpc3BsYXlJbmZvU2hhcGUpO1xuXG4gICAgICAgY29uc3QgSXNzdWVyS2l0U2hhcGUgPSB7XG4gIGJyYW5kOiBCcmFuZFNoYXBlLFxuICBtaW50OiBNaW50U2hhcGUsXG4gIG1pbnRSZWNvdmVyeVB1cnNlOiBQdXJzZVNoYXBlLFxuICBpc3N1ZXI6IElzc3VlclNoYXBlLFxuICBkaXNwbGF5SW5mbzogRGlzcGxheUluZm9TaGFwZSxcbn07JGjNj19vbmNlLklzc3VlcktpdFNoYXBlKElzc3VlcktpdFNoYXBlKTtcbmhhcmRlbihJc3N1ZXJLaXRTaGFwZSk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBJbnRlcmZhY2VzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuICAgICAgIGNvbnN0IEJyYW5kSSA9IE0uaW50ZXJmYWNlKCdCcmFuZCcsIHtcbiAgaXNNeUlzc3VlcjogTS5jYWxsV2hlbihNLmF3YWl0KElzc3VlclNoYXBlKSkucmV0dXJucyhNLmJvb2xlYW4oKSksXG4gIGdldEFsbGVnZWROYW1lOiBNLmNhbGwoKS5yZXR1cm5zKE0uc3RyaW5nKCkpLFxuICBnZXREaXNwbGF5SW5mbzogTS5jYWxsKCkucmV0dXJucyhEaXNwbGF5SW5mb1NoYXBlKSxcbiAgZ2V0QW1vdW50U2hhcGU6IE0uY2FsbCgpLnJldHVybnMoTS5wYXR0ZXJuKCkpLFxufSk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBbYnJhbmRTaGFwZV1cbiAqIEBwYXJhbSB7UGF0dGVybn0gW2Fzc2V0S2luZFNoYXBlXVxuICogQHBhcmFtIHtQYXR0ZXJufSBbYW1vdW50U2hhcGVdXG4gKi8kaM2PX29uY2UuQnJhbmRJKEJyYW5kSSk7XG4gICAgICAgY29uc3QgbWFrZUlzc3VlckludGVyZmFjZXMgPSAoXG4gIGJyYW5kU2hhcGUgPSBCcmFuZFNoYXBlLFxuICBhc3NldEtpbmRTaGFwZSA9IEFzc2V0S2luZFNoYXBlLFxuICBhbW91bnRTaGFwZSA9IEFtb3VudFNoYXBlLFxuKSA9PiB7XG4gIGNvbnN0IElzc3VlckkgPSBNLmludGVyZmFjZSgnSXNzdWVyJywge1xuICAgIGdldEJyYW5kOiBNLmNhbGwoKS5yZXR1cm5zKGJyYW5kU2hhcGUpLFxuICAgIGdldEFsbGVnZWROYW1lOiBNLmNhbGwoKS5yZXR1cm5zKE0uc3RyaW5nKCkpLFxuICAgIGdldEFzc2V0S2luZDogTS5jYWxsKCkucmV0dXJucyhhc3NldEtpbmRTaGFwZSksXG4gICAgZ2V0RGlzcGxheUluZm86IE0uY2FsbCgpLnJldHVybnMoRGlzcGxheUluZm9TaGFwZSksXG4gICAgbWFrZUVtcHR5UHVyc2U6IE0uY2FsbCgpLnJldHVybnMoUHVyc2VTaGFwZSksXG5cbiAgICBpc0xpdmU6IE0uY2FsbFdoZW4oTS5hd2FpdChQYXltZW50U2hhcGUpKS5yZXR1cm5zKE0uYm9vbGVhbigpKSxcbiAgICBnZXRBbW91bnRPZjogTS5jYWxsV2hlbihNLmF3YWl0KFBheW1lbnRTaGFwZSkpLnJldHVybnMoYW1vdW50U2hhcGUpLFxuICAgIGJ1cm46IE0uY2FsbFdoZW4oTS5hd2FpdChQYXltZW50U2hhcGUpKVxuICAgICAgLm9wdGlvbmFsKEFtb3VudFBhdHRlcm5TaGFwZSlcbiAgICAgIC5yZXR1cm5zKGFtb3VudFNoYXBlKSxcbiAgfSk7XG5cbiAgY29uc3QgTWludEkgPSBNLmludGVyZmFjZSgnTWludCcsIHtcbiAgICBnZXRJc3N1ZXI6IE0uY2FsbCgpLnJldHVybnMoSXNzdWVyU2hhcGUpLFxuICAgIG1pbnRQYXltZW50OiBNLmNhbGwoYW1vdW50U2hhcGUpLnJldHVybnMoUGF5bWVudFNoYXBlKSxcbiAgfSk7XG5cbiAgY29uc3QgUGF5bWVudEkgPSBNLmludGVyZmFjZSgnUGF5bWVudCcsIHtcbiAgICBnZXRBbGxlZ2VkQnJhbmQ6IE0uY2FsbCgpLnJldHVybnMoYnJhbmRTaGFwZSksXG4gIH0pO1xuXG4gIGNvbnN0IFB1cnNlSSA9IE0uaW50ZXJmYWNlKCdQdXJzZScsIHtcbiAgICBnZXRBbGxlZ2VkQnJhbmQ6IE0uY2FsbCgpLnJldHVybnMoYnJhbmRTaGFwZSksXG4gICAgZ2V0Q3VycmVudEFtb3VudDogTS5jYWxsKCkucmV0dXJucyhhbW91bnRTaGFwZSksXG4gICAgZ2V0Q3VycmVudEFtb3VudE5vdGlmaWVyOiBNLmNhbGwoKS5yZXR1cm5zKE5vdGlmaWVyU2hhcGUpLFxuICAgIC8qIFB1cnNlSSBkb2VzICpub3QqIGRlbGF5IGBkZXBvc2l0YCB1bnRpbCBgc3JjUGF5bWVudGAgaXMgZnVsZnVsbGVkLiovXG4gICAgLyogUmF0aGVyLCB0aGUgc2VtYW50aWNzIG9mIGBkZXBvc2l0YCByZXF1aXJlIGl0IHRvIHByb3ZpZGUgaXRzKi9cbiAgICAvKiBjYWxsZXJzIHdpdGggYSBzdHJvbmcgZ3VhcmFudGVlIHRoYXQgYGRlcG9zaXRgIG1lc3NhZ2VzIGFyZSovXG4gICAgLyogcHJvY2Vzc2VkIHdpdGhvdXQgZnVydGhlciBkZWxheSBpbiB0aGUgb3JkZXIgdGhleSBhcnJpdmUuKi9cbiAgICAvKiBQdXJzZUkgdGhlcmVmb3JlIHJlcXVpcmVzIHRoYXQgdGhlIGBzcmNQYXltZW50YCBhcmd1bWVudCBhbHJlYWR5Ki9cbiAgICAvKiBiZSBhIHJlbW90YWJsZSwgbm90IGEgcHJvbWlzZS4qL1xuICAgIC8qIFB1cnNlSSBvbmx5IGNhbGxzIHRoaXMgcmF3IG1ldGhvZCBhZnRlciB2YWxpZGF0aW5nIHRoYXQqL1xuICAgIC8qIGBzcmNQYXltZW50YCBpcyBhIHJlbW90YWJsZSwgbGVhdmluZyBpdCovXG4gICAgLyogdG8gdGhpcyByYXcgbWV0aG9kIHRvIHZhbGlkYXRlIHRoYXQgdGhpcyByZW1vdGFibGUgaXMgYWN0dWFsbHkqL1xuICAgIC8qIGEgbGl2ZSBwYXltZW50IG9mIHRoZSBjb3JyZWN0IGJyYW5kIHdpdGggc3VmZmljaWVudCBmdW5kcy4qL1xuICAgIGRlcG9zaXQ6IE0uY2FsbChQYXltZW50U2hhcGUpXG4gICAgICAub3B0aW9uYWwoQW1vdW50UGF0dGVyblNoYXBlKVxuICAgICAgLnJldHVybnMoYW1vdW50U2hhcGUpLFxuICAgIGdldERlcG9zaXRGYWNldDogTS5jYWxsKCkucmV0dXJucyhEZXBvc2l0RmFjZXRTaGFwZSksXG4gICAgd2l0aGRyYXc6IE0uY2FsbChhbW91bnRTaGFwZSkucmV0dXJucyhQYXltZW50U2hhcGUpLFxuICAgIGdldFJlY292ZXJ5U2V0OiBNLmNhbGwoKS5yZXR1cm5zKE0uc2V0T2YoUGF5bWVudFNoYXBlKSksXG4gICAgcmVjb3ZlckFsbDogTS5jYWxsKCkucmV0dXJucyhhbW91bnRTaGFwZSksXG4gIH0pO1xuXG4gIGNvbnN0IERlcG9zaXRGYWNldEkgPSBNLmludGVyZmFjZSgnRGVwb3NpdEZhY2V0Jywge1xuICAgIHJlY2VpdmU6IGdldEludGVyZmFjZUd1YXJkUGF5bG9hZChQdXJzZUkpLm1ldGhvZEd1YXJkcy5kZXBvc2l0LFxuICB9KTtcblxuICBjb25zdCBQdXJzZUlLaXQgPSB7XG4gICAgcHVyc2U6IFB1cnNlSSxcbiAgICBkZXBvc2l0RmFjZXQ6IERlcG9zaXRGYWNldEksXG4gIH07XG4gIGhhcmRlbihQdXJzZUlLaXQpO1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIElzc3VlckksXG4gICAgTWludEksXG4gICAgUGF5bWVudEksXG4gICAgUHVyc2VJS2l0LFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VJc3N1ZXJJbnRlcmZhY2VzKG1ha2VJc3N1ZXJJbnRlcmZhY2VzKTtcbmhhcmRlbihtYWtlSXNzdWVySW50ZXJmYWNlcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJCcmFuZFNoYXBlIjpbIkJyYW5kU2hhcGUiXSwiSXNzdWVyU2hhcGUiOlsiSXNzdWVyU2hhcGUiXSwiUGF5bWVudFNoYXBlIjpbIlBheW1lbnRTaGFwZSJdLCJQdXJzZVNoYXBlIjpbIlB1cnNlU2hhcGUiXSwiRGVwb3NpdEZhY2V0U2hhcGUiOlsiRGVwb3NpdEZhY2V0U2hhcGUiXSwiTm90aWZpZXJTaGFwZSI6WyJOb3RpZmllclNoYXBlIl0sIk1pbnRTaGFwZSI6WyJNaW50U2hhcGUiXSwiQW1vdW50U2hhcGUiOlsiQW1vdW50U2hhcGUiXSwiQW1vdW50UGF0dGVyblNoYXBlIjpbIkFtb3VudFBhdHRlcm5TaGFwZSJdLCJSYXRpb1NoYXBlIjpbIlJhdGlvU2hhcGUiXSwiaXNOYXRWYWx1ZSI6WyJpc05hdFZhbHVlIl0sImlzQ29weVNldFZhbHVlIjpbImlzQ29weVNldFZhbHVlIl0sImlzU2V0VmFsdWUiOlsiaXNTZXRWYWx1ZSJdLCJpc0NvcHlCYWdWYWx1ZSI6WyJpc0NvcHlCYWdWYWx1ZSJdLCJNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMiOlsiTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTIl0sIkFzc2V0S2luZFNoYXBlIjpbIkFzc2V0S2luZFNoYXBlIl0sIkRpc3BsYXlJbmZvU2hhcGUiOlsiRGlzcGxheUluZm9TaGFwZSJdLCJJc3N1ZXJLaXRTaGFwZSI6WyJJc3N1ZXJLaXRTaGFwZSJdLCJCcmFuZEkiOlsiQnJhbmRJIl0sIm1ha2VJc3N1ZXJJbnRlcmZhY2VzIjpbIm1ha2VJc3N1ZXJJbnRlcmZhY2VzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACcAAABAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvdHlwZXMtaW5kZXguanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAApexJrxsFAAAbBQAAKwAAAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9jb25zdGFudHMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIlBhcmFtVHlwZSIsIlBhcmFtVHlwZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyoqXG4gKiBFbnVtIG9mIHBhcmFtZXRlciB0eXBlc1xuICpcbiAqIFVOS05PV04gaXMgYW4gZXNjYXBlIGhhdGNoIGZvciB0eXBlcyB3ZSBoYXZlbid0IGFkZGVkIHlldC4gSWYgeW91IGFyZVxuICogZGV2ZWxvcGluZyBhIG5ldyBjb250cmFjdCBhbmQgdXNlIFVOS05PV04sIHBsZWFzZSBhbHNvIGZpbGUgYW4gaXNzdWUgdG8gYXNrXG4gKiB1cyB0byBzdXBwb3J0IHRoZSBuZXcgdHlwZS5cbiAqIEBlbnVtIHt0eXBlb2YgUGFyYW1UeXBlW2tleW9mIHR5cGVvZiBQYXJhbVR5cGVdfVxuICovXG4gICAgICAgY29uc3QgUGFyYW1UeXBlID0gLyoqIEB0eXBlIHtjb25zdH0gKi8gKHtcbiAgQU1PVU5UOiAnYW1vdW50JyxcbiAgQlJBTkQ6ICdicmFuZCcsXG4gIElOU1RBTExBVElPTjogJ2luc3RhbGxhdGlvbicsXG4gIElOU1RBTkNFOiAnaW5zdGFuY2UnLFxuICBJTlZJVEFUSU9OOiAnaW52aXRhdGlvbicsXG4gIE5BVDogJ25hdCcsXG4gIFJBVElPOiAncmF0aW8nLFxuICBTVFJJTkc6ICdzdHJpbmcnLFxuICBQQVNTQUJMRV9SRUNPUkQ6ICdyZWNvcmQnLFxuICBUSU1FU1RBTVA6ICd0aW1lc3RhbXAnLFxuICBSRUxBVElWRV9USU1FOiAncmVsYXRpdmVUaW1lJyxcbiAgVU5LTk9XTjogJ3Vua25vd24nLFxufSk7JGjNj19vbmNlLlBhcmFtVHlwZShQYXJhbVR5cGUpO1xuaGFyZGVuKFBhcmFtVHlwZSk7XG5cbi8qIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSovXG4vKiBTaGFsbG93IGNvcHkgdG8gd29yayBhcm91bmQgVFMgZC50cyBkZWZpbmluZyBhbiBlbXB0eSBuYW1lc3BhY2UgaW5zdGVhZCBvZiBhbiBvYmplY3QqL1xuICAgICAgIGNvbnN0IFBhcmFtVHlwZXMgPSB7IC4uLlBhcmFtVHlwZSB9OyRozY9fb25jZS5QYXJhbVR5cGVzKFBhcmFtVHlwZXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUGFyYW1UeXBlIjpbIlBhcmFtVHlwZSJdLCJQYXJhbVR5cGVzIjpbIlBhcmFtVHlwZXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAIugF88UMAADFDAAAPwAAAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9jb250cmFjdEdvdmVybmFuY2UvYXNzZXJ0aW9ucy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9tYXJzaGFsIiwiQGFnb3JpYy9lcnRwL3NyYy9yYXRpby5qcyIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3RpbWUiXSwiZXhwb3J0cyI6WyJhc3NlcnRSZWxhdGl2ZVRpbWUiLCJhc3NlcnRUaW1lc3RhbXAiLCJtYWtlQXNzZXJ0QnJhbmRlZFJhdGlvIiwibWFrZUFzc2VydEluc3RhbGxhdGlvbiIsIm1ha2VBc3NlcnRJbnN0YW5jZSIsIm1ha2VMb29rc0xpa2VCcmFuZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsaXNSZW1vdGFibGUsYXNzZXJ0SXNSYXRpbyxtdXN0TWF0Y2gsUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUsVGltZXN0YW1wUmVjb3JkU2hhcGU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiaXNSZW1vdGFibGVcIixbJGjNj19hID0+IChpc1JlbW90YWJsZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvZXJ0cC9zcmMvcmF0aW8uanNcIiwgW1tcImFzc2VydElzUmF0aW9cIixbJGjNj19hID0+IChhc3NlcnRJc1JhdGlvID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy90aW1lXCIsIFtbXCJSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZVwiLFskaM2PX2EgPT4gKFJlbGF0aXZlVGltZVJlY29yZFNoYXBlID0gJGjNj19hKV1dLFtcIlRpbWVzdGFtcFJlY29yZFNoYXBlXCIsWyRozY9fYSA9PiAoVGltZXN0YW1wUmVjb3JkU2hhcGUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7QnJhbmR9IGZyb20gJ0BhZ29yaWMvZXJ0cCc7XG4gKi9cblxuY29uc3QgbWFrZUxvb2tzTGlrZUJyYW5kID0gbmFtZSA9PiB7XG4gIC8qKiBAcGFyYW0ge0JyYW5kfSBicmFuZCAqL1xuICByZXR1cm4gYnJhbmQgPT4ge1xuICAgIGlzUmVtb3RhYmxlKGJyYW5kKSB8fCBGYWlsYHZhbHVlIGZvciAke25hbWV9IG11c3QgYmUgYSBicmFuZCwgd2FzICR7YnJhbmR9YDtcbiAgfTtcbn07JGjNj19vbmNlLm1ha2VMb29rc0xpa2VCcmFuZChtYWtlTG9va3NMaWtlQnJhbmQpO1xuaGFyZGVuKG1ha2VMb29rc0xpa2VCcmFuZCk7XG5cbmNvbnN0IG1ha2VBc3NlcnRJbnN0YWxsYXRpb24gPSBuYW1lID0+IHtcbiAgcmV0dXJuIGluc3RhbGxhdGlvbiA9PiB7XG4gICAgLyogVE9ETygzMzQ0KTogYWRkIGEgYmV0dGVyIGFzc2VydGlvbiBvbmNlIFpvZSB2YWxpZGF0ZXMgaW5zdGFsbGF0aW9ucyovXG4gICAgdHlwZW9mIGluc3RhbGxhdGlvbiA9PT0gJ29iamVjdCcgfHxcbiAgICAgIEZhaWxgdmFsdWUgZm9yICR7bmFtZX0gbXVzdCBiZSBhbiBJbnN0YWxsYXRpb24sIHdhcyAke2luc3RhbGxhdGlvbn1gO1xuICB9O1xufTskaM2PX29uY2UubWFrZUFzc2VydEluc3RhbGxhdGlvbihtYWtlQXNzZXJ0SW5zdGFsbGF0aW9uKTtcbmhhcmRlbihtYWtlQXNzZXJ0SW5zdGFsbGF0aW9uKTtcblxuY29uc3QgbWFrZUFzc2VydEluc3RhbmNlID0gbmFtZSA9PiB7XG4gIHJldHVybiBpbnN0YW5jZSA9PiB7XG4gICAgLyogVE9ETygzMzQ0KTogYWRkIGEgYmV0dGVyIGFzc2VydGlvbiBvbmNlIFpvZSB2YWxpZGF0ZXMgaW5zdGFuY2VzKi9cbiAgICB0eXBlb2YgaW5zdGFuY2UgPT09ICdvYmplY3QnIHx8XG4gICAgICBGYWlsYHZhbHVlIGZvciAke25hbWV9IG11c3QgYmUgYW4gSW5zdGFuY2UsIHdhcyAke2luc3RhbmNlfWA7XG4gIH07XG59OyRozY9fb25jZS5tYWtlQXNzZXJ0SW5zdGFuY2UobWFrZUFzc2VydEluc3RhbmNlKTtcbmhhcmRlbihtYWtlQXNzZXJ0SW5zdGFuY2UpO1xuXG5jb25zdCBtYWtlQXNzZXJ0QnJhbmRlZFJhdGlvID0gKG5hbWUsIG1vZGVsUmF0aW8pID0+IHtcbiAgcmV0dXJuIHJhdGlvID0+IHtcbiAgICBhc3NlcnRJc1JhdGlvKHJhdGlvKTtcbiAgICByYXRpby5udW1lcmF0b3IuYnJhbmQgPT09IG1vZGVsUmF0aW8ubnVtZXJhdG9yLmJyYW5kIHx8XG4gICAgICBGYWlsYE51bWVyYXRvciBicmFuZCBmb3IgJHtuYW1lfSBtdXN0IGJlICR7bW9kZWxSYXRpby5udW1lcmF0b3IuYnJhbmR9YDtcbiAgICByYXRpby5kZW5vbWluYXRvci5icmFuZCA9PT0gbW9kZWxSYXRpby5kZW5vbWluYXRvci5icmFuZCB8fFxuICAgICAgRmFpbGBEZW5vbWluYXRvciBicmFuZCBmb3IgJHtuYW1lfSBtdXN0IGJlICR7bW9kZWxSYXRpby5kZW5vbWluYXRvci5icmFuZH1gO1xuICAgIHJldHVybiB0cnVlO1xuICB9O1xufTskaM2PX29uY2UubWFrZUFzc2VydEJyYW5kZWRSYXRpbyhtYWtlQXNzZXJ0QnJhbmRlZFJhdGlvKTtcbmhhcmRlbihtYWtlQXNzZXJ0QnJhbmRlZFJhdGlvKTtcblxuY29uc3QgYXNzZXJ0UmVsYXRpdmVUaW1lID0gdmFsdWUgPT4ge1xuICBtdXN0TWF0Y2godmFsdWUsIFJlbGF0aXZlVGltZVJlY29yZFNoYXBlKTtcbn07JGjNj19vbmNlLmFzc2VydFJlbGF0aXZlVGltZShhc3NlcnRSZWxhdGl2ZVRpbWUpO1xuaGFyZGVuKGFzc2VydFJlbGF0aXZlVGltZSk7XG5cbmNvbnN0IGFzc2VydFRpbWVzdGFtcCA9IHZhbHVlID0+IHtcbiAgbXVzdE1hdGNoKHZhbHVlLCBUaW1lc3RhbXBSZWNvcmRTaGFwZSwgJ3RpbWVzdGFtcCcpO1xufTskaM2PX29uY2UuYXNzZXJ0VGltZXN0YW1wKGFzc2VydFRpbWVzdGFtcCk7XG5oYXJkZW4oYXNzZXJ0VGltZXN0YW1wKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VMb29rc0xpa2VCcmFuZCI6WyJtYWtlTG9va3NMaWtlQnJhbmQiXSwibWFrZUFzc2VydEluc3RhbGxhdGlvbiI6WyJtYWtlQXNzZXJ0SW5zdGFsbGF0aW9uIl0sIm1ha2VBc3NlcnRJbnN0YW5jZSI6WyJtYWtlQXNzZXJ0SW5zdGFuY2UiXSwibWFrZUFzc2VydEJyYW5kZWRSYXRpbyI6WyJtYWtlQXNzZXJ0QnJhbmRlZFJhdGlvIl0sImFzc2VydFJlbGF0aXZlVGltZSI6WyJhc3NlcnRSZWxhdGl2ZVRpbWUiXSwiYXNzZXJ0VGltZXN0YW1wIjpbImFzc2VydFRpbWVzdGFtcCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABi0T1+1BUAANQVAAA+AAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5BcGkuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiLCJAYWdvcmljL3N0b3JlIiwiLi4vcXVlc3Rpb24uanMiXSwiZXhwb3J0cyI6WyJtYWtlQXBpSW52b2NhdGlvblBvc2l0aW9ucyIsInNldHVwQXBpR292ZXJuYW5jZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwscSxFLEZhcixrZXlFUSxDaG9pY2VNZXRob2QsUXVvcnVtUnVsZSxFbGVjdGlvblR5cGUsY29lcmNlUXVlc3Rpb25TcGVjOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wia2V5RVFcIixbJGjNj19hID0+IChrZXlFUSA9ICRozY9fYSldXV1dLFtcIi4uL3F1ZXN0aW9uLmpzXCIsIFtbXCJDaG9pY2VNZXRob2RcIixbJGjNj19hID0+IChDaG9pY2VNZXRob2QgPSAkaM2PX2EpXV0sW1wiUXVvcnVtUnVsZVwiLFskaM2PX2EgPT4gKFF1b3J1bVJ1bGUgPSAkaM2PX2EpXV0sW1wiRWxlY3Rpb25UeXBlXCIsWyRozY9fYSA9PiAoRWxlY3Rpb25UeXBlID0gJGjNj19hKV1dLFtcImNvZXJjZVF1ZXN0aW9uU3BlY1wiLFskaM2PX2EgPT4gKGNvZXJjZVF1ZXN0aW9uU3BlYyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtDb250cmFjdE1ldGEsIEluc3RhbGxhdGlvbiwgSW5zdGFuY2UsIEludml0YXRpb24sIFpDRn0gZnJvbSAnQGFnb3JpYy96b2UnO1xuICogQGltcG9ydCB7UGFzc2FibGUsIFJlbW90YWJsZU9iamVjdH0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSc7XG4gKiBAaW1wb3J0IHtQb3NpdGlvbiwgQXBpR292ZXJub3IsIEFwaUludm9jYXRpb25Jc3N1ZSwgUG9zZXJGYWNldCwgVm90ZU9uQXBpSW52b2NhdGlvbiwgR292ZXJuZWRBcGlzfSBmcm9tICcuLi90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtUaW1lclNlcnZpY2V9IGZyb20gJ0BhZ29yaWMvdGltZSc7XG4gKiBAaW1wb3J0IHtFUmVmfSBmcm9tICdAYWdvcmljL3Zvdyc7XG4gKi9cblxuLyoqXG4gKiBNYWtlIGEgcGFpciBvZiBwb3NpdGlvbnMgZm9yIGEgcXVlc3Rpb24gYWJvdXQgd2hldGhlciB0byBpbnZva2UgYW4gQVBJLiBJZlxuICogdGhlIHZvdGUgcGFzc2VzLCB0aGUgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIG9uIHRoZSBnb3Zlcm5lZEFwaXMgZmFjZXQgd2l0aCB0aGVcbiAqIGFyZ3VtZW50cyB0aGF0IHdlcmUgcHJvdmlkZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFwaU1ldGhvZE5hbWVcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gbWV0aG9kQXJnc1xuICovXG5jb25zdCBtYWtlQXBpSW52b2NhdGlvblBvc2l0aW9ucyA9IChhcGlNZXRob2ROYW1lLCBtZXRob2RBcmdzKSA9PiB7XG4gIGNvbnN0IHBvc2l0aXZlID0gaGFyZGVuKHsgYXBpTWV0aG9kTmFtZSwgbWV0aG9kQXJncyB9KTtcbiAgY29uc3QgbmVnYXRpdmUgPSBoYXJkZW4oeyBkb250SW52b2tlOiBhcGlNZXRob2ROYW1lIH0pO1xuICByZXR1cm4gaGFyZGVuKHsgcG9zaXRpdmUsIG5lZ2F0aXZlIH0pO1xufTtcblxuLyoqXG4gKiBtYW5hZ2UgY29udHJhY3RzIHRoYXQgYWxsb3cgZ292ZXJuYW5jZSB0byBpbnZva2UgZnVuY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7KCkgPT4gRVJlZjxHb3Zlcm5lZEFwaXM+fSBnZXRHb3Zlcm5lZEFwaXNcbiAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxBcnJheTxzdHJpbmcgfCBzeW1ib2w+Pn0gZ2V0R292ZXJuZWROYW1lcyBuYW1lcyBvZiB0aGUgZ292ZXJuZWQgQVBJIG1ldGhvZHNcbiAqIEBwYXJhbSB7RVJlZjxUaW1lclNlcnZpY2U+fSB0aW1lclxuICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPFBvc2VyRmFjZXQ+fSBnZXRVcGRhdGVkUG9zZXJGYWNldFxuICogQHJldHVybnMge0FwaUdvdmVybm9yfVxuICovJGjNj19vbmNlLm1ha2VBcGlJbnZvY2F0aW9uUG9zaXRpb25zKG1ha2VBcGlJbnZvY2F0aW9uUG9zaXRpb25zKTtcbmNvbnN0IHNldHVwQXBpR292ZXJuYW5jZSA9IChcbiAgZ2V0R292ZXJuZWRBcGlzLFxuICBnZXRHb3Zlcm5lZE5hbWVzLFxuICB0aW1lcixcbiAgZ2V0VXBkYXRlZFBvc2VyRmFjZXQsXG4pID0+IHtcbiAgLyoqIEB0eXBlIHtXZWFrU2V0PEluc3RhbmNlPn0gKi9cbiAgY29uc3Qgdm90ZUNvdW50ZXJzID0gbmV3IFdlYWtTZXQoKTtcblxuICAvKiogQHR5cGUge1ZvdGVPbkFwaUludm9jYXRpb259ICovXG4gIGNvbnN0IHZvdGVPbkFwaUludm9jYXRpb24gPSBhc3luYyAoXG4gICAgYXBpTWV0aG9kTmFtZSxcbiAgICBtZXRob2RBcmdzLFxuICAgIHZvdGVDb3VudGVySW5zdGFsbGF0aW9uLFxuICAgIGRlYWRsaW5lLFxuICApID0+IHtcbiAgICBjb25zdCBnb3Zlcm5lZE5hbWVzID0gYXdhaXQgZ2V0R292ZXJuZWROYW1lcygpO1xuICAgIGdvdmVybmVkTmFtZXMuaW5jbHVkZXMoYXBpTWV0aG9kTmFtZSkgfHxcbiAgICAgIEZhaWxgJHthcGlNZXRob2ROYW1lfSBpcyBub3QgYSBnb3Zlcm5lZCBBUEkuYDtcblxuICAgIGNvbnN0IHsgcG9zaXRpdmUsIG5lZ2F0aXZlIH0gPSBtYWtlQXBpSW52b2NhdGlvblBvc2l0aW9ucyhcbiAgICAgIGFwaU1ldGhvZE5hbWUsXG4gICAgICBtZXRob2RBcmdzLFxuICAgICk7XG5cbiAgICAvKiogQHR5cGUge0FwaUludm9jYXRpb25Jc3N1ZX0gKi9cbiAgICBjb25zdCBpc3N1ZSA9IGhhcmRlbih7IGFwaU1ldGhvZE5hbWUsIG1ldGhvZEFyZ3MgfSk7XG4gICAgY29uc3QgcXVlc3Rpb25TcGVjID0gY29lcmNlUXVlc3Rpb25TcGVjKHtcbiAgICAgIG1ldGhvZDogQ2hvaWNlTWV0aG9kLlVOUkFOS0VELFxuICAgICAgaXNzdWUsXG4gICAgICBwb3NpdGlvbnM6IFtwb3NpdGl2ZSwgbmVnYXRpdmVdLFxuICAgICAgZWxlY3Rpb25UeXBlOiBFbGVjdGlvblR5cGUuQVBJX0lOVk9DQVRJT04sXG4gICAgICBtYXhDaG9pY2VzOiAxLFxuICAgICAgbWF4V2lubmVyczogMSxcbiAgICAgIGNsb3NpbmdSdWxlOiB7IHRpbWVyLCBkZWFkbGluZSB9LFxuICAgICAgcXVvcnVtUnVsZTogUXVvcnVtUnVsZS5NQUpPUklUWSxcbiAgICAgIHRpZU91dGNvbWU6IG5lZ2F0aXZlLFxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBwdWJsaWNGYWNldDogY291bnRlclB1YmxpY0ZhY2V0LCBpbnN0YW5jZTogdm90ZUNvdW50ZXIgfSA9IGF3YWl0IEUoXG4gICAgICBnZXRVcGRhdGVkUG9zZXJGYWNldCgpLFxuICAgICkuYWRkUXVlc3Rpb24odm90ZUNvdW50ZXJJbnN0YWxsYXRpb24sIHF1ZXN0aW9uU3BlYyk7XG5cbiAgICB2b3RlQ291bnRlcnMuYWRkKHZvdGVDb3VudGVyKTtcblxuICAgIC8qIENSVUNJQUw6IEhlcmUgd2Ugd2FpdCBmb3IgdGhlIHZvdGVDb3VudGVyIHRvIGRlY2xhcmUgYW4gb3V0Y29tZSwgYW5kIHRoZW4qL1xuICAgIC8qIGF0dGVtcHQgdG8gaW52b2tlIHRoZSBBUEkgaWYgdGhhdCdzIHdoYXQgdGhlIHZvdGUgY2FsbGVkIGZvci4gV2UgbmVlZCB0byovXG4gICAgLyogbWFrZSBzdXJlIHRoYXQgb3V0Y29tZU9mVXBkYXRlUCBpcyB1cGRhdGVkIHdoYXRldmVyIGhhcHBlbnMuKi9cbiAgICAvKiovXG4gICAgLyogKiBJZiB0aGUgdm90ZSBwYXNzZWQsIGludm9rZSB0aGUgQVBJLCBhbmQgcmV0dXJuIHRoZSBwb3NpdGl2ZSBwb3NpdGlvbiovXG4gICAgLyogKiBJZiB0aGUgdm90ZSB3YXMgbmVnYXRpdmUsIHJldHVybiB0aGUgbmVnYXRpdmUgcG9zaXRpb24qL1xuICAgIC8qICogSWYgd2UgY2FuJ3QgZG8gZWl0aGVyLCAodGhlIHZvdGUgZmFpbGVkIG9yIHRoZSBBUEkgaW52b2NhdGlvbiBmYWlsZWQpKi9cbiAgICAvKiByZXR1cm4gYSBicm9rZW4gcHJvbWlzZS4qL1xuICAgIGNvbnN0IG91dGNvbWVPZlVwZGF0ZSA9IEUoY291bnRlclB1YmxpY0ZhY2V0KVxuICAgICAgLmdldE91dGNvbWUoKVxuICAgICAgLnRoZW4oXG4gICAgICAgIC8qKiBAdHlwZSB7KG91dGNvbWU6IFBvc2l0aW9uKSA9PiBQcm9taXNlPFBvc2l0aW9uPn0gKi9cbiAgICAgICAgYXN5bmMgb3V0Y29tZSA9PiB7XG4gICAgICAgICAgYXdhaXQgbnVsbDtcblxuICAgICAgICAgIGlmIChrZXlFUShwb3NpdGl2ZSwgb3V0Y29tZSkpIHtcbiAgICAgICAgICAgIGtleUVRKG91dGNvbWUsIGhhcmRlbih7IGFwaU1ldGhvZE5hbWUsIG1ldGhvZEFyZ3MgfSkpIHx8XG4gICAgICAgICAgICAgIEZhaWxgVGhlIHF1ZXN0aW9uJ3MgbWV0aG9kIG5hbWUgKCR7cShcbiAgICAgICAgICAgICAgICBhcGlNZXRob2ROYW1lLFxuICAgICAgICAgICAgICApfSkgYW5kIGFyZ3MgKCR7bWV0aG9kQXJnc30pIGRpZG4ndCBtYXRjaCB0aGUgb3V0Y29tZSAke291dGNvbWV9YDtcblxuICAgICAgICAgICAgLyogRShyZW1vdGUpW25hbWVdKGFyZ3MpIGludm9rZXMgdGhlIG1ldGhvZCBuYW1lZCAnbmFtZScgb24gcmVtb3RlLiovXG4gICAgICAgICAgICBjb25zdCBnb3Zlcm5lZEFwaXMgPSBhd2FpdCBnZXRHb3Zlcm5lZEFwaXMoKTtcbiAgICAgICAgICAgIHJldHVybiBFKGdvdmVybmVkQXBpcylcbiAgICAgICAgICAgICAgW2FwaU1ldGhvZE5hbWVdKC4uLm1ldGhvZEFyZ3MpXG4gICAgICAgICAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcG9zaXRpdmU7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmVnYXRpdmU7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgKTtcblxuICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgb3V0Y29tZU9mVXBkYXRlLFxuICAgICAgaW5zdGFuY2U6IHZvdGVDb3VudGVyLFxuICAgICAgZGV0YWlsczogRShjb3VudGVyUHVibGljRmFjZXQpLmdldERldGFpbHMoKSxcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gRmFyKCdwYXJhbUdvdmVybm9yJywge1xuICAgIHZvdGVPbkFwaUludm9jYXRpb24sXG4gICAgY3JlYXRlZFF1ZXN0aW9uOiBiID0+IHZvdGVDb3VudGVycy5oYXMoYiksXG4gIH0pO1xufTskaM2PX29uY2Uuc2V0dXBBcGlHb3Zlcm5hbmNlKHNldHVwQXBpR292ZXJuYW5jZSk7XG5cbmhhcmRlbihzZXR1cEFwaUdvdmVybmFuY2UpO1xuaGFyZGVuKG1ha2VBcGlJbnZvY2F0aW9uUG9zaXRpb25zKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VBcGlJbnZvY2F0aW9uUG9zaXRpb25zIjpbIm1ha2VBcGlJbnZvY2F0aW9uUG9zaXRpb25zIl0sInNldHVwQXBpR292ZXJuYW5jZSI6WyJzZXR1cEFwaUdvdmVybmFuY2UiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAbUXms7sSAAC7EgAAQQAAAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuRmlsdGVyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9tYXJzaGFsIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiLCIuLi9xdWVzdGlvbi5qcyJdLCJleHBvcnRzIjpbIm1ha2VPZmZlckZpbHRlclBvc2l0aW9ucyIsInNldHVwRmlsdGVyR292ZXJuYW5jZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEUsRmFyLG11c3RNYXRjaCxrZXlFUSxNLENob2ljZU1ldGhvZCxRdW9ydW1SdWxlLEVsZWN0aW9uVHlwZSxjb2VyY2VRdWVzdGlvblNwZWM7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXSxbXCJrZXlFUVwiLFskaM2PX2EgPT4gKGtleUVRID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXSxbXCIuLi9xdWVzdGlvbi5qc1wiLCBbW1wiQ2hvaWNlTWV0aG9kXCIsWyRozY9fYSA9PiAoQ2hvaWNlTWV0aG9kID0gJGjNj19hKV1dLFtcIlF1b3J1bVJ1bGVcIixbJGjNj19hID0+IChRdW9ydW1SdWxlID0gJGjNj19hKV1dLFtcIkVsZWN0aW9uVHlwZVwiLFskaM2PX2EgPT4gKEVsZWN0aW9uVHlwZSA9ICRozY9fYSldXSxbXCJjb2VyY2VRdWVzdGlvblNwZWNcIixbJGjNj19hID0+IChjb2VyY2VRdWVzdGlvblNwZWMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7Q29udHJhY3RNZXRhLCBJbnN0YWxsYXRpb24sIEluc3RhbmNlLCBJbnZpdGF0aW9uLCBaQ0Z9IGZyb20gJ0BhZ29yaWMvem9lJztcbiAqIEBpbXBvcnQge1Bvc2l0aW9uLCBBcGlHb3Zlcm5vciwgQXBpSW52b2NhdGlvbklzc3VlLCBQb3NlckZhY2V0LCBWb3RlT25BcGlJbnZvY2F0aW9uLCBGaWx0ZXJHb3Zlcm5vciwgR292ZXJuZWRDcmVhdG9yRmFjZXQsIE9mZmVyRmlsdGVySXNzdWUsIFZvdGVPbk9mZmVyRmlsdGVyfSBmcm9tICcuLi90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtUaW1lclNlcnZpY2V9IGZyb20gJ0BhZ29yaWMvdGltZSc7XG4gKiBAaW1wb3J0IHtFUmVmfSBmcm9tICdAYWdvcmljL3Zvdyc7XG4gKi9cblxuLyoqXG4gKiBNYWtlIGEgcGFpciBvZiBwb3NpdGlvbnMgZm9yIGEgcXVlc3Rpb24gYWJvdXQgd2hldGhlciB0byB1cGRhdGUgdGhlIG9mZmVyXG4gKiBmaWx0ZXIuIElmIHRoZSB2b3RlIHBhc3NlcywgdGhlIGxpc3Qgb2YgYmxvY2tlZCBpbnZpdGF0aW9uIHN0cmluZ3Mgd2lsbCBiZVxuICogdXBkYXRlZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBzdHJpbmdzXG4gKi9cbmNvbnN0IG1ha2VPZmZlckZpbHRlclBvc2l0aW9ucyA9IHN0cmluZ3MgPT4ge1xuICBjb25zdCBwb3NpdGl2ZSA9IGhhcmRlbih7IHN0cmluZ3MgfSk7XG4gIGNvbnN0IG5lZ2F0aXZlID0gaGFyZGVuKHsgZG9udFVwZGF0ZTogc3RyaW5ncyB9KTtcbiAgcmV0dXJuIHsgcG9zaXRpdmUsIG5lZ2F0aXZlIH07XG59O1xuXG4vKipcbiAqIFNldHVwIHRvIGFsbG93IGdvdmVybmFuY2UgdG8gYmxvY2sgc29tZSBpbnZpdGF0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8VGltZXJTZXJ2aWNlPn0gdGltZXJcbiAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxQb3NlckZhY2V0Pn0gZ2V0VXBkYXRlZFBvc2VyRmFjZXRcbiAqIEBwYXJhbSB7R292ZXJuZWRDcmVhdG9yRmFjZXQ8e30+fSBnb3Zlcm5lZENGXG4gKiBAcmV0dXJucyB7RmlsdGVyR292ZXJub3J9XG4gKi8kaM2PX29uY2UubWFrZU9mZmVyRmlsdGVyUG9zaXRpb25zKG1ha2VPZmZlckZpbHRlclBvc2l0aW9ucyk7XG5jb25zdCBzZXR1cEZpbHRlckdvdmVybmFuY2UgPSAodGltZXIsIGdldFVwZGF0ZWRQb3NlckZhY2V0LCBnb3Zlcm5lZENGKSA9PiB7XG4gIC8qKiBAdHlwZSB7V2Vha1NldDxJbnN0YW5jZT59ICovXG4gIGNvbnN0IHZvdGVDb3VudGVycyA9IG5ldyBXZWFrU2V0KCk7XG5cbiAgLyoqIEB0eXBlIHtWb3RlT25PZmZlckZpbHRlcn0gKi9cbiAgY29uc3Qgdm90ZU9uRmlsdGVyID0gYXN5bmMgKHZvdGVDb3VudGVySW5zdGFsbGF0aW9uLCBkZWFkbGluZSwgc3RyaW5ncykgPT4ge1xuICAgIG11c3RNYXRjaChzdHJpbmdzLCBNLmFycmF5T2YoTS5zdHJpbmcoKSkpO1xuICAgIGNvbnN0IHsgcG9zaXRpdmUsIG5lZ2F0aXZlIH0gPSBtYWtlT2ZmZXJGaWx0ZXJQb3NpdGlvbnMoc3RyaW5ncyk7XG5cbiAgICAvKiogQHR5cGUge09mZmVyRmlsdGVySXNzdWV9ICovXG4gICAgY29uc3QgaXNzdWUgPSBoYXJkZW4oeyBzdHJpbmdzIH0pO1xuICAgIGNvbnN0IHF1ZXN0aW9uU3BlYyA9IGNvZXJjZVF1ZXN0aW9uU3BlYyh7XG4gICAgICBtZXRob2Q6IENob2ljZU1ldGhvZC5VTlJBTktFRCxcbiAgICAgIGlzc3VlLFxuICAgICAgcG9zaXRpb25zOiBbcG9zaXRpdmUsIG5lZ2F0aXZlXSxcbiAgICAgIGVsZWN0aW9uVHlwZTogRWxlY3Rpb25UeXBlLk9GRkVSX0ZJTFRFUixcbiAgICAgIG1heENob2ljZXM6IDEsXG4gICAgICBtYXhXaW5uZXJzOiAxLFxuICAgICAgY2xvc2luZ1J1bGU6IHsgdGltZXIsIGRlYWRsaW5lIH0sXG4gICAgICBxdW9ydW1SdWxlOiBRdW9ydW1SdWxlLk1BSk9SSVRZLFxuICAgICAgdGllT3V0Y29tZTogbmVnYXRpdmUsXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IHB1YmxpY0ZhY2V0OiBjb3VudGVyUHVibGljRmFjZXQsIGluc3RhbmNlOiB2b3RlQ291bnRlciB9ID0gYXdhaXQgRShcbiAgICAgIGdldFVwZGF0ZWRQb3NlckZhY2V0KCksXG4gICAgKS5hZGRRdWVzdGlvbih2b3RlQ291bnRlckluc3RhbGxhdGlvbiwgcXVlc3Rpb25TcGVjKTtcblxuICAgIHZvdGVDb3VudGVycy5hZGQodm90ZUNvdW50ZXIpO1xuXG4gICAgLyogQ1JVQ0lBTDogSGVyZSB3ZSB3YWl0IGZvciB0aGUgdm90ZUNvdW50ZXIgdG8gZGVjbGFyZSBhbiBvdXRjb21lLCBhbmQgdGhlbiovXG4gICAgLyogYXR0ZW1wdCB0byBpbnZva2UgdGhlIEFQSSBpZiB0aGF0J3Mgd2hhdCB0aGUgdm90ZSBjYWxsZWQgZm9yLiBXZSBuZWVkIHRvKi9cbiAgICAvKiBtYWtlIHN1cmUgdGhhdCBvdXRjb21lT2ZVcGRhdGVQIGlzIHVwZGF0ZWQgd2hhdGV2ZXIgaGFwcGVucy4qL1xuICAgIC8qKi9cbiAgICAvKiAqIElmIHRoZSB2b3RlIHBhc3NlZCwgaW52b2tlIHRoZSBBUEksIGFuZCByZXR1cm4gdGhlIHBvc2l0aXZlIHBvc2l0aW9uKi9cbiAgICAvKiAqIElmIHRoZSB2b3RlIHdhcyBuZWdhdGl2ZSwgcmV0dXJuIHRoZSBuZWdhdGl2ZSBwb3NpdGlvbiovXG4gICAgLyogKiBJZiB3ZSBjYW4ndCBkbyBlaXRoZXIsICh0aGUgdm90ZSBmYWlsZWQgb3IgdGhlIEFQSSBpbnZvY2F0aW9uIGZhaWxlZCkqL1xuICAgIC8qIHJldHVybiBhIGJyb2tlbiBwcm9taXNlLiovXG4gICAgY29uc3Qgb3V0Y29tZU9mVXBkYXRlID0gRShjb3VudGVyUHVibGljRmFjZXQpXG4gICAgICAuZ2V0T3V0Y29tZSgpXG4gICAgICAudGhlbihcbiAgICAgICAgLyoqIEB0eXBlIHsob3V0Y29tZTogUG9zaXRpb24pID0+IEVSZWY8UG9zaXRpb24+fSAqL1xuICAgICAgICBvdXRjb21lID0+IHtcbiAgICAgICAgICBpZiAoa2V5RVEob3V0Y29tZSwgcG9zaXRpdmUpKSB7XG4gICAgICAgICAgICByZXR1cm4gRShnb3Zlcm5lZENGKVxuICAgICAgICAgICAgICAuc2V0T2ZmZXJGaWx0ZXIoc3RyaW5ncylcbiAgICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBwb3NpdGl2ZTtcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSBlbHNlIGlmIChrZXlFUShvdXRjb21lLCBuZWdhdGl2ZSkpIHtcbiAgICAgICAgICAgIHJldHVybiBuZWdhdGl2ZTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXNzZXJ0LmZhaWwoJ3VucmVjb2duaXplZCBvdXRjb21lJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgKTtcblxuICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgb3V0Y29tZU9mVXBkYXRlLFxuICAgICAgaW5zdGFuY2U6IHZvdGVDb3VudGVyLFxuICAgICAgZGV0YWlsczogRShjb3VudGVyUHVibGljRmFjZXQpLmdldERldGFpbHMoKSxcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gRmFyKCdmaWx0ZXJHb3Zlcm5vcicsIHtcbiAgICB2b3RlT25GaWx0ZXIsXG4gICAgY3JlYXRlZFF1ZXN0aW9uOiBiID0+IHZvdGVDb3VudGVycy5oYXMoYiksXG4gIH0pO1xufTskaM2PX29uY2Uuc2V0dXBGaWx0ZXJHb3Zlcm5hbmNlKHNldHVwRmlsdGVyR292ZXJuYW5jZSk7XG5cbmhhcmRlbihzZXR1cEZpbHRlckdvdmVybmFuY2UpO1xuaGFyZGVuKG1ha2VPZmZlckZpbHRlclBvc2l0aW9ucyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlT2ZmZXJGaWx0ZXJQb3NpdGlvbnMiOlsibWFrZU9mZmVyRmlsdGVyUG9zaXRpb25zIl0sInNldHVwRmlsdGVyR292ZXJuYW5jZSI6WyJzZXR1cEZpbHRlckdvdmVybmFuY2UiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAyTVIIHEaAABxGgAAQAAAAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuUGFyYW0uanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiLCJAYWdvcmljL3N0b3JlIiwiLi4vcXVlc3Rpb24uanMiLCIuLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsiQ09OVFJBQ1RfRUxFQ1RPUkFURSIsImFzc2VydEJhbGxvdENvbmNlcm5zUGFyYW0iLCJtYWtlUGFyYW1DaGFuZ2VQb3NpdGlvbnMiLCJzZXR1cFBhcmFtR292ZXJuYW5jZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsRSxkZWVwbHlGdWxmaWxsZWQsRmFyLG11c3RNYXRjaCxrZXlFUSxDaG9pY2VNZXRob2QsY29lcmNlUXVlc3Rpb25TcGVjLEVsZWN0aW9uVHlwZSxRdW9ydW1SdWxlLFBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiZGVlcGx5RnVsZmlsbGVkXCIsWyRozY9fYSA9PiAoZGVlcGx5RnVsZmlsbGVkID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXSxbXCJrZXlFUVwiLFskaM2PX2EgPT4gKGtleUVRID0gJGjNj19hKV1dXV0sW1wiLi4vcXVlc3Rpb24uanNcIiwgW1tcIkNob2ljZU1ldGhvZFwiLFskaM2PX2EgPT4gKENob2ljZU1ldGhvZCA9ICRozY9fYSldXSxbXCJjb2VyY2VRdWVzdGlvblNwZWNcIixbJGjNj19hID0+IChjb2VyY2VRdWVzdGlvblNwZWMgPSAkaM2PX2EpXV0sW1wiRWxlY3Rpb25UeXBlXCIsWyRozY9fYSA9PiAoRWxlY3Rpb25UeXBlID0gJGjNj19hKV1dLFtcIlF1b3J1bVJ1bGVcIixbJGjNj19hID0+IChRdW9ydW1SdWxlID0gJGjNj19hKV1dXV0sW1wiLi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGVcIixbJGjNj19hID0+IChQYXJhbUNoYW5nZXNRdWVzdGlvbkRldGFpbHNTaGFwZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0NvbnRyYWN0TWV0YSwgSW5zdGFsbGF0aW9uLCBJbnN0YW5jZSwgSW52aXRhdGlvbiwgWkNGfSBmcm9tICdAYWdvcmljL3pvZSc7XG4gKiBAaW1wb3J0IHtQYXJhbVZhbHVlLCBQYXJhbUNoYW5nZVBvc2l0aW9ucywgUXVlc3Rpb25TcGVjLCBDaGFuZ2VQYXJhbXNQb3NpdGlvbiwgUGFyYW1DaGFuZ2VJc3N1ZSwgUGFyYW1Hb3Zlcm5vciwgUGFyYW1NYW5hZ2VyUmV0cmlldmVyLCBQb3NlckZhY2V0LCBWb3RlT25QYXJhbUNoYW5nZXN9IGZyb20gJy4uL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge1RpbWVyU2VydmljZX0gZnJvbSAnQGFnb3JpYy90aW1lJztcbiAqIEBpbXBvcnQge1Bhc3NhYmxlfSBmcm9tICdAZW5kby9tYXJzaGFsJztcbiAqIEBpbXBvcnQge0VSZWZ9IGZyb20gJ0BhZ29yaWMvdm93JztcbiAqL1xuXG4vKipcbiAqIFRoZSBlbGVjdG9yYXRlIHRoYXQgZ292ZXJucyBjaGFuZ2VzIHRvIHRoZSBjb250cmFjdCdzIHBhcmFtZXRlcnMuIEl0IG11c3QgYmVcbiAqIGRlY2xhcmVkIGluIHRoZSBnb3Zlcm5lZCBjb250cmFjdC5cbiAqL1xuY29uc3QgQ09OVFJBQ1RfRUxFQ1RPUkFURSA9ICdFbGVjdG9yYXRlJztcblxuLyoqXG4gKiBSZXR1cm4gYSByZWNvcmQgY29udGFpbmluZyB0aGUgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHBvc2l0aW9ucyBmb3IgYVxuICogcXVlc3Rpb24gb24gY2hhbmdpbmcgdGhlIHBhcmFtIHRvIHRoZSBwcm9wb3NlZFZhbHVlLlxuICpcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUGFyYW1WYWx1ZT59IGNoYW5nZXNcbiAqIEByZXR1cm5zIHtQYXJhbUNoYW5nZVBvc2l0aW9uc31cbiAqLyRozY9fb25jZS5DT05UUkFDVF9FTEVDVE9SQVRFKENPTlRSQUNUX0VMRUNUT1JBVEUpO1xuY29uc3QgbWFrZVBhcmFtQ2hhbmdlUG9zaXRpb25zID0gY2hhbmdlcyA9PiB7XG4gIC8qKiBAdHlwZSB7Q2hhbmdlUGFyYW1zUG9zaXRpb259ICovXG4gIGNvbnN0IHBvc2l0aXZlID0geyBjaGFuZ2VzIH07XG4gIGNvbnN0IG5hbWVzT25seSA9IE9iamVjdC5rZXlzKGNoYW5nZXMpO1xuICBjb25zdCBuZWdhdGl2ZSA9IHsgbm9DaGFuZ2U6IG5hbWVzT25seSB9O1xuICByZXR1cm4gaGFyZGVuKHsgcG9zaXRpdmUsIG5lZ2F0aXZlIH0pO1xufTtcblxuLyoqXG4gKiBhc3NlcnQgdGhhdCB0aGUgcGFyYW1ldGVyIGRlc2NyaWJlZCBieSBwYXJhbVNwZWMgaXMgcHJvcG9zZWQgdG8gYmUgY2hhbmdlZCBpblxuICogdGhlIHF1ZXN0aW9uIGRlc2NyaWJlZCBieSBxdWVzdGlvblNwZWMuXG4gKlxuICogQHBhcmFtIHt7IHBhcmFtZXRlck5hbWU6IHN0cmluZywgcGFyYW1QYXRoOiB1bmtub3dufX0gcGFyYW1TcGVjXG4gKiBAcGFyYW0ge1F1ZXN0aW9uU3BlYzxQYXJhbUNoYW5nZUlzc3VlPn0gcXVlc3Rpb25TcGVjXG4gKi8kaM2PX29uY2UubWFrZVBhcmFtQ2hhbmdlUG9zaXRpb25zKG1ha2VQYXJhbUNoYW5nZVBvc2l0aW9ucyk7XG5jb25zdCBhc3NlcnRCYWxsb3RDb25jZXJuc1BhcmFtID0gKHBhcmFtU3BlYywgcXVlc3Rpb25TcGVjKSA9PiB7XG4gIG11c3RNYXRjaChxdWVzdGlvblNwZWMsIFBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlKTtcblxuICBjb25zdCB7IHBhcmFtZXRlck5hbWUsIHBhcmFtUGF0aCB9ID0gcGFyYW1TcGVjO1xuICBjb25zdCB7IGlzc3VlIH0gPSBxdWVzdGlvblNwZWM7XG4gIGlzc3VlLnNwZWMuY2hhbmdlc1twYXJhbWV0ZXJOYW1lXSB8fFxuICAgIEZhaWxgUXVlc3Rpb24gKCR7aXNzdWUuc3BlYy5jaGFuZ2VzfSkgZG9lcyBub3QgY29uY2VybiAke3BhcmFtZXRlck5hbWV9YDtcbiAga2V5RVEoaXNzdWUuc3BlYy5wYXJhbVBhdGgsIHBhcmFtUGF0aCkgfHxcbiAgICBGYWlsYFF1ZXN0aW9uIHBhdGggKCR7aXNzdWUuc3BlYy5wYXJhbVBhdGh9KSBkb2Vzbid0IG1hdGNoIHJlcXVlc3QgKCR7cGFyYW1QYXRofSlgO1xufTtcblxuLyoqXG4gKiBAcGFyYW0geygpID0+IEVSZWY8UGFyYW1NYW5hZ2VyUmV0cmlldmVyPn0gcGFyYW1NYW5hZ2VyUmV0cmlldmVyQWNjZXNzb3JcbiAqIEBwYXJhbSB7SW5zdGFuY2V9IGNvbnRyYWN0SW5zdGFuY2VcbiAqIEBwYXJhbSB7VGltZXJTZXJ2aWNlfSB0aW1lclxuICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPFBvc2VyRmFjZXQ+fSBnZXRVcGRhdGVkUG9zZXJGYWNldFxuICogQHJldHVybnMge1BhcmFtR292ZXJub3J9XG4gKi8kaM2PX29uY2UuYXNzZXJ0QmFsbG90Q29uY2VybnNQYXJhbShhc3NlcnRCYWxsb3RDb25jZXJuc1BhcmFtKTtcbmNvbnN0IHNldHVwUGFyYW1Hb3Zlcm5hbmNlID0gKFxuICBwYXJhbU1hbmFnZXJSZXRyaWV2ZXJBY2Nlc3NvcixcbiAgY29udHJhY3RJbnN0YW5jZSxcbiAgdGltZXIsXG4gIGdldFVwZGF0ZWRQb3NlckZhY2V0LFxuKSA9PiB7XG4gIC8qKiBAdHlwZSB7V2Vha1NldDxJbnN0YW5jZT59ICovXG4gIGNvbnN0IHZvdGVDb3VudGVycyA9IG5ldyBXZWFrU2V0KCk7XG5cbiAgLyoqIEB0eXBlIHtWb3RlT25QYXJhbUNoYW5nZXN9ICovXG4gIGNvbnN0IHZvdGVPblBhcmFtQ2hhbmdlcyA9IGFzeW5jIChcbiAgICB2b3RlQ291bnRlckluc3RhbGxhdGlvbixcbiAgICBkZWFkbGluZSxcbiAgICBwYXJhbVNwZWMsXG4gICkgPT4ge1xuICAgIGNvbnN0IHBhcmFtTWFuYWdlclJldHJpZXZlciA9IHBhcmFtTWFuYWdlclJldHJpZXZlckFjY2Vzc29yKCk7XG4gICAgY29uc3QgcGFyYW1NZ3IgPSBhd2FpdCBFKHBhcmFtTWFuYWdlclJldHJpZXZlcikuZ2V0KHBhcmFtU3BlYy5wYXJhbVBhdGgpO1xuICAgIC8qKiBAdHlwZSB7UGFzc2FibGV9ICovXG4gICAgY29uc3QgY2hhbmdlUHMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2YgT2JqZWN0LmtleXMocGFyYW1TcGVjLmNoYW5nZXMpKSB7XG4gICAgICBjb25zdCBwcm9wb3NlZFZhbHVlID0gRShwYXJhbU1ncikuZ2V0VmlzaWJsZVZhbHVlKFxuICAgICAgICBuYW1lLFxuICAgICAgICBwYXJhbVNwZWMuY2hhbmdlc1tuYW1lXSxcbiAgICAgICk7XG4gICAgICBjaGFuZ2VQc1tuYW1lXSA9IHByb3Bvc2VkVmFsdWU7XG4gICAgfVxuICAgIGNvbnN0IGNoYW5nZXMgPSBhd2FpdCBkZWVwbHlGdWxmaWxsZWQoaGFyZGVuKGNoYW5nZVBzKSk7XG5cbiAgICBjb25zdCB7IHBvc2l0aXZlLCBuZWdhdGl2ZSB9ID0gbWFrZVBhcmFtQ2hhbmdlUG9zaXRpb25zKGNoYW5nZXMpO1xuXG4gICAgLyoqIEB0eXBlIHtQYXJhbUNoYW5nZUlzc3VlfSAqL1xuICAgIGNvbnN0IGlzc3VlID0gaGFyZGVuKHtcbiAgICAgIHNwZWM6IHtcbiAgICAgICAgcGFyYW1QYXRoOiBwYXJhbVNwZWMucGFyYW1QYXRoLFxuICAgICAgICBjaGFuZ2VzLFxuICAgICAgfSxcbiAgICAgIGNvbnRyYWN0OiBjb250cmFjdEluc3RhbmNlLFxuICAgIH0pO1xuXG4gICAgY29uc3QgcXVlc3Rpb25TcGVjID0gY29lcmNlUXVlc3Rpb25TcGVjKHtcbiAgICAgIG1ldGhvZDogQ2hvaWNlTWV0aG9kLlVOUkFOS0VELFxuICAgICAgaXNzdWUsXG4gICAgICBwb3NpdGlvbnM6IFtwb3NpdGl2ZSwgbmVnYXRpdmVdLFxuICAgICAgZWxlY3Rpb25UeXBlOiBFbGVjdGlvblR5cGUuUEFSQU1fQ0hBTkdFLFxuICAgICAgbWF4Q2hvaWNlczogMSxcbiAgICAgIG1heFdpbm5lcnM6IDEsXG4gICAgICBjbG9zaW5nUnVsZTogeyB0aW1lciwgZGVhZGxpbmUgfSxcbiAgICAgIHF1b3J1bVJ1bGU6IFF1b3J1bVJ1bGUuTUFKT1JJVFksXG4gICAgICB0aWVPdXRjb21lOiBuZWdhdGl2ZSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgcHVibGljRmFjZXQ6IGNvdW50ZXJQdWJsaWNGYWNldCwgaW5zdGFuY2U6IHZvdGVDb3VudGVyIH0gPSBhd2FpdCBFKFxuICAgICAgZ2V0VXBkYXRlZFBvc2VyRmFjZXQoKSxcbiAgICApLmFkZFF1ZXN0aW9uKHZvdGVDb3VudGVySW5zdGFsbGF0aW9uLCBxdWVzdGlvblNwZWMpO1xuXG4gICAgdm90ZUNvdW50ZXJzLmFkZCh2b3RlQ291bnRlcik7XG5cbiAgICAvKiBDUlVDSUFMOiBIZXJlIHdlIHdhaXQgZm9yIHRoZSB2b3RlQ291bnRlciB0byBkZWNsYXJlIGFuIG91dGNvbWUsIGFuZCB0aGVuKi9cbiAgICAvKiBhdHRlbXB0IHRvIHVwZGF0ZSB0aGUgdmFsdWUgb2YgdGhlIHBhcmFtZXRlciBpZiB0aGF0J3Mgd2hhdCB0aGUgdm90ZSovXG4gICAgLyogZGVjaWRlZC4gV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBvdXRjb21lT2ZVcGRhdGVQIGlzIHVwZGF0ZWQgd2hhdGV2ZXIqL1xuICAgIC8qIGhhcHBlbnMuKi9cbiAgICAvKiAqIElmIHRoZSB2b3RlIHdhcyBuZWdhdGl2ZSwgcmVzb2x2ZSB0byB0aGUgb3V0Y29tZSovXG4gICAgLyogKiBJZiB3ZSB1cGRhdGUgdGhlIHZhbHVlLCBzYXkgc28qL1xuICAgIC8qICogSWYgdGhlIHVwZGF0ZSBmYWlscywgcmVqZWN0IHRoZSBwcm9taXNlKi9cbiAgICAvKiAqIGlmIHRoZSB2b3RlIG91dGNvbWUgZmFpbGVkLCByZWplY3QgdGhlIHByb21pc2UuKi9cbiAgICBjb25zdCBvdXRjb21lT2ZVcGRhdGUgPSBFKGNvdW50ZXJQdWJsaWNGYWNldClcbiAgICAgIC5nZXRPdXRjb21lKClcbiAgICAgIC50aGVuKGFzeW5jIG91dGNvbWUgPT4ge1xuICAgICAgICBpZiAoa2V5RVEocG9zaXRpdmUsIG91dGNvbWUpKSB7XG4gICAgICAgICAgcmV0dXJuIEUud2hlbihcbiAgICAgICAgICAgIEUocGFyYW1NZ3IpLnVwZGF0ZVBhcmFtcyhwYXJhbVNwZWMuY2hhbmdlcyksXG4gICAgICAgICAgICAoKSA9PiBwb3NpdGl2ZSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZWdhdGl2ZTtcbiAgICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG91dGNvbWVPZlVwZGF0ZSxcbiAgICAgIGluc3RhbmNlOiB2b3RlQ291bnRlcixcbiAgICAgIGRldGFpbHM6IEUoY291bnRlclB1YmxpY0ZhY2V0KS5nZXREZXRhaWxzKCksXG4gICAgfTtcbiAgfTtcblxuICByZXR1cm4gRmFyKCdwYXJhbUdvdmVybm9yJywge1xuICAgIHZvdGVPblBhcmFtQ2hhbmdlcyxcbiAgICBjcmVhdGVkUXVlc3Rpb246IGIgPT4gdm90ZUNvdW50ZXJzLmhhcyhiKSxcbiAgfSk7XG59OyRozY9fb25jZS5zZXR1cFBhcmFtR292ZXJuYW5jZShzZXR1cFBhcmFtR292ZXJuYW5jZSk7XG5cbmhhcmRlbihzZXR1cFBhcmFtR292ZXJuYW5jZSk7XG5oYXJkZW4obWFrZVBhcmFtQ2hhbmdlUG9zaXRpb25zKTtcbmhhcmRlbihhc3NlcnRCYWxsb3RDb25jZXJuc1BhcmFtKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkNPTlRSQUNUX0VMRUNUT1JBVEUiOlsiQ09OVFJBQ1RfRUxFQ1RPUkFURSJdLCJtYWtlUGFyYW1DaGFuZ2VQb3NpdGlvbnMiOlsibWFrZVBhcmFtQ2hhbmdlUG9zaXRpb25zIl0sImFzc2VydEJhbGxvdENvbmNlcm5zUGFyYW0iOlsiYXNzZXJ0QmFsbG90Q29uY2VybnNQYXJhbSJdLCJzZXR1cFBhcmFtR292ZXJuYW5jZSI6WyJzZXR1cFBhcmFtR292ZXJuYW5jZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABL1nYatkkAALZJAABBAAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL2NvbnRyYWN0R292ZXJuYW5jZS9wYXJhbU1hbmFnZXIuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvem9lL3NyYy9jbGVhblByb3Bvc2FsLmpzIiwiQGVuZG8vbmF0IiwiQGFnb3JpYy9zdG9yZSIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAYWdvcmljL2ludGVybmFsIiwiLi4vY29uc3RhbnRzLmpzIiwiLi9hc3NlcnRpb25zLmpzIiwiLi9nb3Zlcm5QYXJhbS5qcyJdLCJleHBvcnRzIjpbImFzc2VydEVsZWN0b3JhdGVNYXRjaGVzIiwibWFrZVBhcmFtTWFuYWdlckJ1aWxkZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHEsRmFyLHBhc3NTdHlsZU9mLEFtb3VudE1hdGgsYXNzZXJ0S2V5d29yZE5hbWUsTmF0LGtleUVRLG1ha2VTY2FsYXJNYXBTdG9yZSxFLGFzc2VydEFsbERlZmluZWQsUGFyYW1UeXBlcyxhc3NlcnRUaW1lc3RhbXAsYXNzZXJ0UmVsYXRpdmVUaW1lLG1ha2VBc3NlcnRCcmFuZGVkUmF0aW8sbWFrZUFzc2VydEluc3RhbGxhdGlvbixtYWtlQXNzZXJ0SW5zdGFuY2UsbWFrZUxvb2tzTGlrZUJyYW5kLENPTlRSQUNUX0VMRUNUT1JBVEU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dLFtcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudE1hdGhcIixbJGjNj19hID0+IChBbW91bnRNYXRoID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy96b2Uvc3JjL2NsZWFuUHJvcG9zYWwuanNcIiwgW1tcImFzc2VydEtleXdvcmROYW1lXCIsWyRozY9fYSA9PiAoYXNzZXJ0S2V5d29yZE5hbWUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLFskaM2PX2EgPT4gKE5hdCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImtleUVRXCIsWyRozY9fYSA9PiAoa2V5RVEgPSAkaM2PX2EpXV0sW1wibWFrZVNjYWxhck1hcFN0b3JlXCIsWyRozY9fYSA9PiAobWFrZVNjYWxhck1hcFN0b3JlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJhc3NlcnRBbGxEZWZpbmVkXCIsWyRozY9fYSA9PiAoYXNzZXJ0QWxsRGVmaW5lZCA9ICRozY9fYSldXV1dLFtcIi4uL2NvbnN0YW50cy5qc1wiLCBbW1wiUGFyYW1UeXBlc1wiLFskaM2PX2EgPT4gKFBhcmFtVHlwZXMgPSAkaM2PX2EpXV1dXSxbXCIuL2Fzc2VydGlvbnMuanNcIiwgW1tcImFzc2VydFRpbWVzdGFtcFwiLFskaM2PX2EgPT4gKGFzc2VydFRpbWVzdGFtcCA9ICRozY9fYSldXSxbXCJhc3NlcnRSZWxhdGl2ZVRpbWVcIixbJGjNj19hID0+IChhc3NlcnRSZWxhdGl2ZVRpbWUgPSAkaM2PX2EpXV0sW1wibWFrZUFzc2VydEJyYW5kZWRSYXRpb1wiLFskaM2PX2EgPT4gKG1ha2VBc3NlcnRCcmFuZGVkUmF0aW8gPSAkaM2PX2EpXV0sW1wibWFrZUFzc2VydEluc3RhbGxhdGlvblwiLFskaM2PX2EgPT4gKG1ha2VBc3NlcnRJbnN0YWxsYXRpb24gPSAkaM2PX2EpXV0sW1wibWFrZUFzc2VydEluc3RhbmNlXCIsWyRozY9fYSA9PiAobWFrZUFzc2VydEluc3RhbmNlID0gJGjNj19hKV1dLFtcIm1ha2VMb29rc0xpa2VCcmFuZFwiLFskaM2PX2EgPT4gKG1ha2VMb29rc0xpa2VCcmFuZCA9ICRozY9fYSldXV1dLFtcIi4vZ292ZXJuUGFyYW0uanNcIiwgW1tcIkNPTlRSQUNUX0VMRUNUT1JBVEVcIixbJGjNj19hID0+IChDT05UUkFDVF9FTEVDVE9SQVRFID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtNYXBTdG9yZX0gZnJvbSAnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnO1xuICogQGltcG9ydCB7Q29udHJhY3RNZXRhLCBJbnN0YWxsYXRpb24sIEluc3RhbmNlLCBJbnZpdGF0aW9uLCBLZXl3b3JkLCBaQ0YsIFpvZVNlcnZpY2V9IGZyb20gJ0BhZ29yaWMvem9lJztcbiAqIEBpbXBvcnQge0FueVBhcmFtTWFuYWdlciwgR292ZXJuYW5jZVN1YnNjcmlwdGlvblN0YXRlLCBQYXJhbU1hbmFnZXJCYXNlLCBQYXJhbVN0YXRlUmVjb3JkLCBQYXJhbVZhbHVlVHlwZWQsIFVwZGF0ZVBhcmFtc30gZnJvbSAnLi4vdHlwZXMuanMnO1xuICogQGltcG9ydCB7Q29weVJlY29yZH0gZnJvbSAnQGVuZG8vbWFyc2hhbCc7XG4gKiBAaW1wb3J0IHtUaW1lc3RhbXB9IGZyb20gJ0BhZ29yaWMvdGltZSc7XG4gKiBAaW1wb3J0IHtSZWxhdGl2ZVRpbWV9IGZyb20gJ0BhZ29yaWMvdGltZSc7XG4gKiBAaW1wb3J0IHtTdG9yZWRQdWJsaXNoZXJLaXR9IGZyb20gJ0BhZ29yaWMvbm90aWZpZXInO1xuICogQGltcG9ydCB7UGFyYW1UeXBlfSBmcm9tICcuLi9jb25zdGFudHMuanMnO1xuICogQGltcG9ydCB7UmF0aW99IGZyb20gJ0BhZ29yaWMvZXJ0cCc7XG4gKiBAaW1wb3J0IHtBbW91bnR9IGZyb20gJ0BhZ29yaWMvZXJ0cCc7XG4gKiBAaW1wb3J0IHtCcmFuZH0gZnJvbSAnQGFnb3JpYy9lcnRwJztcbiAqIEBpbXBvcnQge0VSZWZ9IGZyb20gJ0BhZ29yaWMvdm93JztcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7UGFyYW1NYW5hZ2VyQmFzZX0gcGFyYW1NYW5hZ2VyXG4gKiBAcGFyYW0ge3tbQ09OVFJBQ1RfRUxFQ1RPUkFURV06IFBhcmFtVmFsdWVUeXBlZDwnaW52aXRhdGlvbic+fX0gZ292ZXJuZWRQYXJhbXNcbiAqL1xuY29uc3QgYXNzZXJ0RWxlY3RvcmF0ZU1hdGNoZXMgPSAocGFyYW1NYW5hZ2VyLCBnb3Zlcm5lZFBhcmFtcykgPT4ge1xuICBjb25zdCBtYW5hZ2VyRWxlY3RvcmF0ZSA9XG4gICAgcGFyYW1NYW5hZ2VyLmdldEludml0YXRpb25BbW91bnQoQ09OVFJBQ1RfRUxFQ1RPUkFURSk7XG4gIGNvbnN0IHtcbiAgICBbQ09OVFJBQ1RfRUxFQ1RPUkFURV06IHsgdmFsdWU6IHBhcmFtRWxlY3RvcmF0ZSB9LFxuICB9ID0gZ292ZXJuZWRQYXJhbXM7XG4gIHBhcmFtRWxlY3RvcmF0ZSB8fFxuICAgIEZhaWxgTWlzc2luZyAke3EoQ09OVFJBQ1RfRUxFQ1RPUkFURSl9IHRlcm0gaW4gJHtxKGdvdmVybmVkUGFyYW1zKX1gO1xuICBrZXlFUShtYW5hZ2VyRWxlY3RvcmF0ZSwgcGFyYW1FbGVjdG9yYXRlKSB8fFxuICAgIEZhaWxgRWxlY3RvcmF0ZSBpbiBtYW5hZ2VyICgke21hbmFnZXJFbGVjdG9yYXRlfSl9IGluY29tcGF0aWJsZSB3aXRoIHRlcm1zICgke3BhcmFtRWxlY3RvcmF0ZX1gO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQYXJhbU1hbmFnZXJCdWlsZGVyXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBBbW91bnQpID0+IFBhcmFtTWFuYWdlckJ1aWxkZXJ9IGFkZEFtb3VudFxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nLCB2YWx1ZTogQnJhbmQpID0+IFBhcmFtTWFuYWdlckJ1aWxkZXJ9IGFkZEJyYW5kXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBJbnN0YWxsYXRpb24pID0+IFBhcmFtTWFuYWdlckJ1aWxkZXJ9IGFkZEluc3RhbGxhdGlvblxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nLCB2YWx1ZTogSW5zdGFuY2UpID0+IFBhcmFtTWFuYWdlckJ1aWxkZXJ9IGFkZEluc3RhbmNlXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBJbnZpdGF0aW9uKSA9PiBQYXJhbU1hbmFnZXJCdWlsZGVyfSBhZGRJbnZpdGF0aW9uXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBiaWdpbnQpID0+IFBhcmFtTWFuYWdlckJ1aWxkZXJ9IGFkZE5hdFxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nLCB2YWx1ZTogUmF0aW8pID0+IFBhcmFtTWFuYWdlckJ1aWxkZXJ9IGFkZFJhdGlvXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBDb3B5UmVjb3JkPGFueT4pID0+IFBhcmFtTWFuYWdlckJ1aWxkZXJ9IGFkZFJlY29yZFxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKSA9PiBQYXJhbU1hbmFnZXJCdWlsZGVyfSBhZGRTdHJpbmdcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IFRpbWVzdGFtcCkgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gYWRkVGltZXN0YW1wXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBSZWxhdGl2ZVRpbWUpID0+IFBhcmFtTWFuYWdlckJ1aWxkZXJ9IGFkZFJlbGF0aXZlVGltZVxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KSA9PiBQYXJhbU1hbmFnZXJCdWlsZGVyfSBhZGRVbmtub3duXG4gKiBAcHJvcGVydHkgeygpID0+IEFueVBhcmFtTWFuYWdlcn0gYnVpbGRcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7U3RvcmVkUHVibGlzaGVyS2l0PEdvdmVybmFuY2VTdWJzY3JpcHRpb25TdGF0ZT59IHB1Ymxpc2hlcktpdFxuICogQHBhcmFtIHtFUmVmPFpvZVNlcnZpY2U+fSBbem9lXVxuICovJGjNj19vbmNlLmFzc2VydEVsZWN0b3JhdGVNYXRjaGVzKGFzc2VydEVsZWN0b3JhdGVNYXRjaGVzKTtcbmNvbnN0IG1ha2VQYXJhbU1hbmFnZXJCdWlsZGVyID0gKHB1Ymxpc2hlcktpdCwgem9lKSA9PiB7XG4gIC8qKiBAdHlwZSB7TWFwU3RvcmU8S2V5d29yZCwgYW55Pn0gKi9cbiAgY29uc3QgbmFtZXNUb1BhcmFtcyA9IG1ha2VTY2FsYXJNYXBTdG9yZSgnUGFyYW1ldGVyIE5hbWUnKTtcbiAgY29uc3QgeyBwdWJsaXNoZXIsIHN1YnNjcmliZXIgfSA9IHB1Ymxpc2hlcktpdDtcbiAgYXNzZXJ0QWxsRGVmaW5lZCh7IHB1Ymxpc2hlciwgc3Vic2NyaWJlciB9KTtcblxuICBjb25zdCBnZXR0ZXJzID0ge307XG4gIGNvbnN0IHNldHRlcnMgPSB7fTtcbiAgY29uc3QgdW5maW5pc2hlZFBhcmFtcyA9IFtdO1xuXG4gIC8qIFhYWCBsZXQgcGFyYW1zIGJlIGZpbmlzaGVkIGFzeW5jLiBBIGNvbmNlc3Npb24gdG8gdXBncmFkYWJpbGl0eSovXG4gIC8qIFVOVElMIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDM0MyovXG4gIGNvbnN0IGZpbmlzaEJ1aWxkaW5nID0gYXN5bmMgKCkgPT4ge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKHVuZmluaXNoZWRQYXJhbXMpO1xuICAgIHVuZmluaXNoZWRQYXJhbXMubGVuZ3RoID0gMDtcbiAgfTtcblxuICBjb25zdCBwdWJsaXNoID0gKCkgPT4ge1xuICAgIC8qKiBAdHlwZSB7UGFyYW1TdGF0ZVJlY29yZH0gKi9cbiAgICBjb25zdCBjdXJyZW50ID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuICAgICAgWy4uLm5hbWVzVG9QYXJhbXMuZW50cmllcygpXS5tYXAoKFtrLCB2XSkgPT4gW2ssIHYubWFrZURlc2NyaXB0aW9uKCldKSxcbiAgICApO1xuICAgIHB1Ymxpc2hlci51cGRhdGVTdGF0ZSh7IGN1cnJlbnQgfSk7XG4gIH07XG5cbiAgLyoqXG4gKiBTdXBwb3J0IGZvciBwYXJhbWV0ZXJzIHRoYXQgYXJlIGNvcHkgb2JqZWN0c1xuICpcbiAqIEBzZWUgYnVpbGRJbnZpdGF0aW9uUGFyYW1cbiAqXG4gKiBAcGFyYW0ge0tleXdvcmR9IG5hbWVcbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWVcbiAqIEBwYXJhbSB7KHZhbCkgPT4gdm9pZH0gYXNzZXJ0aW9uXG4gKiBAcGFyYW0ge1BhcmFtVHlwZX0gdHlwZVxuICovXG4gIGNvbnN0IGJ1aWxkQ29weVBhcmFtID0gKG5hbWUsIHZhbHVlLCBhc3NlcnRpb24sIHR5cGUpID0+IHtcbiAgICBsZXQgY3VycmVudDtcbiAgICBhc3NlcnRLZXl3b3JkTmFtZShuYW1lKTtcbiAgICB2YWx1ZSAhPT0gdW5kZWZpbmVkIHx8IEZhaWxgcGFyYW0gJHtxKG5hbWUpfSBtdXN0IGJlIGRlZmluZWRgO1xuXG4gICAgY29uc3Qgc2V0UGFyYW1WYWx1ZSA9IG5ld1ZhbHVlID0+IHtcbiAgICAgIGFzc2VydGlvbihuZXdWYWx1ZSk7XG4gICAgICBjdXJyZW50ID0gbmV3VmFsdWU7XG4gICAgICByZXR1cm4gaGFyZGVuKHsgW25hbWVdOiBuZXdWYWx1ZSB9KTtcbiAgICB9O1xuICAgIHNldFBhcmFtVmFsdWUodmFsdWUpO1xuXG4gICAgY29uc3QgZ2V0VmlzaWJsZVZhbHVlID0gcHJvcG9zZWQgPT4ge1xuICAgICAgYXNzZXJ0aW9uKHByb3Bvc2VkKTtcbiAgICAgIHJldHVybiBwcm9wb3NlZDtcbiAgICB9O1xuXG4gICAgY29uc3QgcHVibGljTWV0aG9kcyA9IEZhcihgUGFyYW1ldGVyICR7bmFtZX1gLCB7XG4gICAgICBnZXRWYWx1ZTogKCkgPT4gY3VycmVudCxcbiAgICAgIGFzc2VydFR5cGU6IGFzc2VydGlvbixcbiAgICAgIG1ha2VEZXNjcmlwdGlvbjogKCkgPT4gKHsgdHlwZSwgdmFsdWU6IGN1cnJlbnQgfSksXG4gICAgICBnZXRWaXNpYmxlVmFsdWUsXG4gICAgICBnZXRUeXBlOiAoKSA9PiB0eXBlLFxuICAgIH0pO1xuXG4gICAgLyogbmFtZXMgYXJlIGtleXdvcmRzIHNvIHRoZXkgd2lsbCBuZWNlc3NhcmlseSBiZSBUaXRsZUNhc2UqL1xuICAgIGdldHRlcnNbYGdldCR7bmFtZX1gXSA9ICgpID0+IGdldFR5cGVkUGFyYW0odHlwZSwgbmFtZSk7XG4gICAgLyogQ1JVQ0lBTDogaGVyZSB3ZSdyZSBjcmVhdGluZyB0aGUgdXBkYXRlIGZ1bmN0aW9ucyB0aGF0IGNhbiBjaGFuZ2UgdGhlKi9cbiAgICAvKiB2YWx1ZXMgb2YgdGhlIGdvdmVybmVkIGNvbnRyYWN0J3MgcGFyYW1ldGVycy4gV2UnbGwgcmV0dXJuIHRoZSB1cGRhdGVGbnMqL1xuICAgIC8qIHRvIG91ciBjYWxsZXIuIFRoZXkgbXVzdCBoYW5kbGUgdGhlbSBjYXJlZnVsbHkgdG8gZW5zdXJlIHRoYXQgdGhleSBlbmQgdXAqL1xuICAgIC8qIGluIGFwcHJvcHJpYXRlIGhhbmRzLiovXG4gICAgc2V0dGVyc1tgdXBkYXRlJHtuYW1lfWBdID0gc2V0UGFyYW1WYWx1ZTtcbiAgICBzZXR0ZXJzW2BwcmVwYXJlVG9VcGRhdGUke25hbWV9YF0gPSBwcm9wb3NlZFZhbHVlID0+IHByb3Bvc2VkVmFsdWU7XG4gICAgbmFtZXNUb1BhcmFtcy5pbml0KG5hbWUsIHB1YmxpY01ldGhvZHMpO1xuICB9O1xuXG4gIC8qIEhBTkRMRVJTIEZPUiBFQUNIIFBBUkFNRVRFUiBUWVBFIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuICAvKiogQHR5cGUgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBBbW91bnQsIGJ1aWxkZXI6IFBhcmFtTWFuYWdlckJ1aWxkZXIpID0+IFBhcmFtTWFuYWdlckJ1aWxkZXJ9ICovXG4gIGNvbnN0IGFkZEFtb3VudCA9IChuYW1lLCB2YWx1ZSwgYnVpbGRlcikgPT4ge1xuICAgIGNvbnN0IGFzc2VydEFtb3VudCA9IGEgPT4ge1xuICAgICAgYS5icmFuZCB8fCBGYWlsYEV4cGVjdGVkIGFuIEFtb3VudCBmb3IgJHtxKG5hbWUpfSwgZ290OiAke2F9YDtcbiAgICAgIHJldHVybiBBbW91bnRNYXRoLmNvZXJjZSh2YWx1ZS5icmFuZCwgYSk7XG4gICAgfTtcbiAgICBidWlsZENvcHlQYXJhbShuYW1lLCB2YWx1ZSwgYXNzZXJ0QW1vdW50LCBQYXJhbVR5cGVzLkFNT1VOVCk7XG4gICAgcmV0dXJuIGJ1aWxkZXI7XG4gIH07XG5cbiAgLyoqIEB0eXBlIHsobmFtZTogc3RyaW5nLCB2YWx1ZTogQnJhbmQsIGJ1aWxkZXI6IFBhcmFtTWFuYWdlckJ1aWxkZXIpID0+IFBhcmFtTWFuYWdlckJ1aWxkZXJ9ICovXG4gIGNvbnN0IGFkZEJyYW5kID0gKG5hbWUsIHZhbHVlLCBidWlsZGVyKSA9PiB7XG4gICAgY29uc3QgYXNzZXJ0QnJhbmQgPSBtYWtlTG9va3NMaWtlQnJhbmQobmFtZSk7XG4gICAgYnVpbGRDb3B5UGFyYW0obmFtZSwgdmFsdWUsIGFzc2VydEJyYW5kLCBQYXJhbVR5cGVzLkJSQU5EKTtcbiAgICByZXR1cm4gYnVpbGRlcjtcbiAgfTtcblxuICAvKiogQHR5cGUgeyhuYW1lOiBzdHJpbmcsIHZhbHVlOiBJbnN0YWxsYXRpb248dW5rbm93bj4sIGJ1aWxkZXI6IFBhcmFtTWFuYWdlckJ1aWxkZXIpID0+IFBhcmFtTWFuYWdlckJ1aWxkZXJ9ICovXG4gIGNvbnN0IGFkZEluc3RhbGxhdGlvbiA9IChuYW1lLCB2YWx1ZSwgYnVpbGRlcikgPT4ge1xuICAgIGNvbnN0IGFzc2VydEluc3RhbGxhdGlvbiA9IG1ha2VBc3NlcnRJbnN0YWxsYXRpb24obmFtZSk7XG4gICAgYnVpbGRDb3B5UGFyYW0obmFtZSwgdmFsdWUsIGFzc2VydEluc3RhbGxhdGlvbiwgUGFyYW1UeXBlcy5JTlNUQUxMQVRJT04pO1xuICAgIHJldHVybiBidWlsZGVyO1xuICB9O1xuXG4gIC8qKiBAdHlwZSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IEluc3RhbmNlLCBidWlsZGVyOiBQYXJhbU1hbmFnZXJCdWlsZGVyKSA9PiBQYXJhbU1hbmFnZXJCdWlsZGVyfSAqL1xuICBjb25zdCBhZGRJbnN0YW5jZSA9IChuYW1lLCB2YWx1ZSwgYnVpbGRlcikgPT4ge1xuICAgIGNvbnN0IGFzc2VydEluc3RhbmNlID0gbWFrZUFzc2VydEluc3RhbmNlKG5hbWUpO1xuICAgIGJ1aWxkQ29weVBhcmFtKG5hbWUsIHZhbHVlLCBhc3NlcnRJbnN0YW5jZSwgUGFyYW1UeXBlcy5JTlNUQU5DRSk7XG4gICAgcmV0dXJuIGJ1aWxkZXI7XG4gIH07XG5cbiAgLyoqIEB0eXBlIHsobmFtZTogc3RyaW5nLCB2YWx1ZTogYmlnaW50LCBidWlsZGVyOiBQYXJhbU1hbmFnZXJCdWlsZGVyKSA9PiBQYXJhbU1hbmFnZXJCdWlsZGVyfSAqL1xuICBjb25zdCBhZGROYXQgPSAobmFtZSwgdmFsdWUsIGJ1aWxkZXIpID0+IHtcbiAgICBjb25zdCBhc3NlcnROYXQgPSB2ID0+IHtcbiAgICAgIGFzc2VydC50eXBlb2YodiwgJ2JpZ2ludCcpO1xuICAgICAgTmF0KHYpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfTtcbiAgICBidWlsZENvcHlQYXJhbShuYW1lLCB2YWx1ZSwgYXNzZXJ0TmF0LCBQYXJhbVR5cGVzLk5BVCk7XG4gICAgcmV0dXJuIGJ1aWxkZXI7XG4gIH07XG5cbiAgLyoqIEB0eXBlIHsobmFtZTogc3RyaW5nLCB2YWx1ZTogUmF0aW8sIGJ1aWxkZXI6IFBhcmFtTWFuYWdlckJ1aWxkZXIpID0+IFBhcmFtTWFuYWdlckJ1aWxkZXJ9ICovXG4gIGNvbnN0IGFkZFJhdGlvID0gKG5hbWUsIHZhbHVlLCBidWlsZGVyKSA9PiB7XG4gICAgY29uc3QgYXNzZXJ0QnJhbmRlZFJhdGlvID0gbWFrZUFzc2VydEJyYW5kZWRSYXRpbyhuYW1lLCB2YWx1ZSk7XG4gICAgYnVpbGRDb3B5UGFyYW0obmFtZSwgdmFsdWUsIGFzc2VydEJyYW5kZWRSYXRpbywgUGFyYW1UeXBlcy5SQVRJTyk7XG4gICAgcmV0dXJuIGJ1aWxkZXI7XG4gIH07XG5cbiAgLyoqIEB0eXBlIHsobmFtZTogc3RyaW5nLCB2YWx1ZTogQ29weVJlY29yZCwgYnVpbGRlcjogUGFyYW1NYW5hZ2VyQnVpbGRlcikgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gKi9cbiAgY29uc3QgYWRkUmVjb3JkID0gKG5hbWUsIHZhbHVlLCBidWlsZGVyKSA9PiB7XG4gICAgY29uc3QgYXNzZXJ0UmVjb3JkID0gdiA9PiB7XG4gICAgICBwYXNzU3R5bGVPZih2KTtcbiAgICAgIGFzc2VydC50eXBlb2YodiwgJ29iamVjdCcpO1xuICAgIH07XG4gICAgYnVpbGRDb3B5UGFyYW0obmFtZSwgdmFsdWUsIGFzc2VydFJlY29yZCwgUGFyYW1UeXBlcy5QQVNTQUJMRV9SRUNPUkQpO1xuICAgIHJldHVybiBidWlsZGVyO1xuICB9O1xuXG4gIC8qKiBAdHlwZSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IHN0cmluZywgYnVpbGRlcjogUGFyYW1NYW5hZ2VyQnVpbGRlcikgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gKi9cbiAgY29uc3QgYWRkU3RyaW5nID0gKG5hbWUsIHZhbHVlLCBidWlsZGVyKSA9PiB7XG4gICAgY29uc3QgYXNzZXJ0U3RyaW5nID0gdiA9PiBhc3NlcnQudHlwZW9mKHYsICdzdHJpbmcnKTtcbiAgICBidWlsZENvcHlQYXJhbShuYW1lLCB2YWx1ZSwgYXNzZXJ0U3RyaW5nLCBQYXJhbVR5cGVzLlNUUklORyk7XG4gICAgcmV0dXJuIGJ1aWxkZXI7XG4gIH07XG5cbiAgLyoqIEB0eXBlIHsobmFtZTogc3RyaW5nLCB2YWx1ZTogVGltZXN0YW1wLCBidWlsZGVyOiBQYXJhbU1hbmFnZXJCdWlsZGVyKSA9PiBQYXJhbU1hbmFnZXJCdWlsZGVyfSAqL1xuICBjb25zdCBhZGRUaW1lc3RhbXAgPSAobmFtZSwgdmFsdWUsIGJ1aWxkZXIpID0+IHtcbiAgICBidWlsZENvcHlQYXJhbShuYW1lLCB2YWx1ZSwgYXNzZXJ0VGltZXN0YW1wLCBQYXJhbVR5cGVzLlRJTUVTVEFNUCk7XG4gICAgcmV0dXJuIGJ1aWxkZXI7XG4gIH07XG5cbiAgLyoqIEB0eXBlIHsobmFtZTogc3RyaW5nLCB2YWx1ZTogUmVsYXRpdmVUaW1lLCBidWlsZGVyOiBQYXJhbU1hbmFnZXJCdWlsZGVyKSA9PiBQYXJhbU1hbmFnZXJCdWlsZGVyfSAqL1xuICBjb25zdCBhZGRSZWxhdGl2ZVRpbWUgPSAobmFtZSwgdmFsdWUsIGJ1aWxkZXIpID0+IHtcbiAgICBidWlsZENvcHlQYXJhbShuYW1lLCB2YWx1ZSwgYXNzZXJ0UmVsYXRpdmVUaW1lLCBQYXJhbVR5cGVzLlJFTEFUSVZFX1RJTUUpO1xuICAgIHJldHVybiBidWlsZGVyO1xuICB9O1xuXG4gIC8qKiBAdHlwZSB7KG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSwgYnVpbGRlcjogUGFyYW1NYW5hZ2VyQnVpbGRlcikgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gKi9cbiAgY29uc3QgYWRkVW5rbm93biA9IChuYW1lLCB2YWx1ZSwgYnVpbGRlcikgPT4ge1xuICAgIGNvbnN0IGFzc2VydFVua25vd24gPSBfdiA9PiB0cnVlO1xuICAgIGJ1aWxkQ29weVBhcmFtKG5hbWUsIHZhbHVlLCBhc3NlcnRVbmtub3duLCBQYXJhbVR5cGVzLlVOS05PV04pO1xuICAgIHJldHVybiBidWlsZGVyO1xuICB9O1xuXG4gIGNvbnN0IGFzc2VydEludml0YXRpb24gPSBhc3luYyBpID0+IHtcbiAgICBpZiAoIXpvZSkge1xuICAgICAgdGhyb3cgRmFpbGB6b2UgbXVzdCBiZSBwcm92aWRlZCBmb3IgZ292ZXJuZWQgSW52aXRhdGlvbnMgJHt6b2V9YDtcbiAgICB9XG5cbiAgICAvKiBsb2NhbCBjaGVjayBvbiBpc0xpdmUoKSBnaXZlcyBiZXR0ZXIgcmVwb3J0IHRoYW4gLmdldEludml0YXRpb25EZXRhaWxzKCkqL1xuICAgIGNvbnN0IGlzTGl2ZSA9IGF3YWl0IEUoRSh6b2UpLmdldEludml0YXRpb25Jc3N1ZXIoKSkuaXNMaXZlKGkpO1xuICAgIGlzTGl2ZSB8fCBGYWlsYEludml0YXRpb24gcGFzc2VkIHRvIHBhcmFtTWFuYWdlciBpcyBub3QgbGl2ZSAke2l9YDtcbiAgfTtcblxuICAvKipcbiAqIEludml0YXRpb25zIGFyZSBjbG9zZWx5IGhlbGQsIHNvIHdlIHNob3VsZCBwdWJsaWNseSByZXZlYWwgb25seSB0aGUgYW1vdW50LlxuICogVGhlIGFwcHJvYWNoIGhlcmUgbWFrZXMgaXQgcG9zc2libGUgZm9yIGNvbnRyYWN0cyB0byBnZXQgdGhlIGFjdHVhbFxuICogaW52aXRhdGlvbiBwcml2YXRlbHksIGFuZCBsZWdpYmx5IGFzc3VyZSBjbGllbnRzIHRoYXQgaXQgbWF0Y2hlcyB0aGVcbiAqIHB1YmxpY2x5IHZpc2libGUgaW52aXRhdGlvbiBhbW91bnQuIENvbnRyYWN0IHJldmlld2VycyBzdGlsbCBoYXZlIHRvXG4gKiBtYW51YWxseSB2ZXJpZnkgdGhhdCB0aGUgYWN0dWFsIGludml0YXRpb24gaXMgaGFuZGxlZCBjYXJlZnVsbHkuXG4gKiBgZ2V0SW50ZXJuYWxWYWx1ZSgpYCB3aWxsIG9ubHkgYmUgYWNjZXNzaWJsZSB3aXRoaW4gdGhlIGNvbnRyYWN0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0ludml0YXRpb259IGludml0YXRpb25cbiAqL1xuICBjb25zdCBidWlsZEludml0YXRpb25QYXJhbSA9IChuYW1lLCBpbnZpdGF0aW9uKSA9PiB7XG4gICAgaWYgKCF6b2UpIHtcbiAgICAgIHRocm93IEZhaWxgem9lIG11c3QgYmUgcHJvdmlkZWQgZm9yIGdvdmVybmVkIEludml0YXRpb25zICR7em9lfWA7XG4gICAgfVxuICAgIGxldCBjdXJyZW50SW52aXRhdGlvbjtcbiAgICBsZXQgY3VycmVudEFtb3VudDtcblxuICAgIC8qKlxuICogQHR5cGVkZWYge1tJbnZpdGF0aW9uLCBBbW91bnRdfSBTZXRJbnZpdGF0aW9uUGFyYW1cbiAqL1xuXG4gICAgLyoqXG4gKiBBc3luYyBwaGFzZSB0byBwcmVwYXJlIGZvciBzeW5jaHJvbm91cyBzZXR0aW5nXG4gKlxuICogQHBhcmFtIHtJbnZpdGF0aW9ufSBpbnZpdGVcbiAqIEByZXR1cm5zIHtQcm9taXNlPFNldEludml0YXRpb25QYXJhbT59XG4gKi9cbiAgICBjb25zdCBwcmVwYXJlVG9TZXRJbnZpdGF0aW9uID0gYXN5bmMgaW52aXRlID0+IHtcbiAgICAgIGNvbnN0IFtwcmVwYXJlZEFtb3VudF0gPSBhd2FpdCBQcm9taXNlLmFsbChbXG4gICAgICAgIEUoRSh6b2UpLmdldEludml0YXRpb25Jc3N1ZXIoKSkuZ2V0QW1vdW50T2YoaW52aXRlKSxcbiAgICAgICAgYXNzZXJ0SW52aXRhdGlvbihpbnZpdGUpLFxuICAgICAgXSk7XG5cbiAgICAgIHJldHVybiBbaW52aXRlLCBwcmVwYXJlZEFtb3VudF07XG4gICAgfTtcblxuICAgIC8qKlxuICogU3luY2hyb25vdXMgcGhhc2Ugb2YgdmFsdWUgc2V0dGluZ1xuICpcbiAqIEBwYXJhbSB7U2V0SW52aXRhdGlvblBhcmFtfSBwYXJhbTBcbiAqL1xuICAgIGNvbnN0IHNldEludml0YXRpb24gPSAoW25ld0ludml0YXRpb24sIGFtb3VudF0pID0+IHtcbiAgICAgIGN1cnJlbnRBbW91bnQgPSBhbW91bnQ7XG4gICAgICBjdXJyZW50SW52aXRhdGlvbiA9IG5ld0ludml0YXRpb247XG4gICAgICByZXR1cm4gaGFyZGVuKHsgW25hbWVdOiBjdXJyZW50QW1vdW50IH0pO1xuICAgIH07XG5cbiAgICBjb25zdCBtYWtlRGVzY3JpcHRpb24gPSAoKSA9PiB7XG4gICAgICByZXR1cm4geyB0eXBlOiBQYXJhbVR5cGVzLklOVklUQVRJT04sIHZhbHVlOiBjdXJyZW50QW1vdW50IH07XG4gICAgfTtcblxuICAgIGNvbnN0IGdldFZpc2libGVWYWx1ZSA9IGFzeW5jIGFsbGVnZWRJbnZpdGF0aW9uID0+XG4gICAgICBFKEUoem9lKS5nZXRJbnZpdGF0aW9uSXNzdWVyKCkpLmdldEFtb3VudE9mKGFsbGVnZWRJbnZpdGF0aW9uKTtcblxuICAgIGNvbnN0IHB1YmxpY01ldGhvZHMgPSBGYXIoYFBhcmFtZXRlciAke25hbWV9YCwge1xuICAgICAgZ2V0VmFsdWU6ICgpID0+IGN1cnJlbnRBbW91bnQsXG4gICAgICBnZXRJbnRlcm5hbFZhbHVlOiAoKSA9PiBjdXJyZW50SW52aXRhdGlvbixcbiAgICAgIGFzc2VydFR5cGU6IGFzc2VydEludml0YXRpb24sXG4gICAgICBtYWtlRGVzY3JpcHRpb24sXG4gICAgICBnZXRUeXBlOiAoKSA9PiBQYXJhbVR5cGVzLklOVklUQVRJT04sXG4gICAgICBnZXRWaXNpYmxlVmFsdWUsXG4gICAgfSk7XG5cbiAgICBnZXR0ZXJzW2BnZXQke25hbWV9YF0gPSAoKSA9PiBnZXRUeXBlZFBhcmFtKFBhcmFtVHlwZXMuSU5WSVRBVElPTiwgbmFtZSk7XG4gICAgLyogQ1JVQ0lBTDogaGVyZSB3ZSdyZSBjcmVhdGluZyB0aGUgdXBkYXRlIGZ1bmN0aW9ucyB0aGF0IGNhbiBjaGFuZ2UgdGhlKi9cbiAgICAvKiB2YWx1ZXMgb2YgdGhlIGdvdmVybmVkIGNvbnRyYWN0J3MgcGFyYW1ldGVycy4gV2UnbGwgcmV0dXJuIHVwZGF0ZVBhcmFtcyovXG4gICAgLyogKHdoaWNoIGNhbiBpbnZva2UgYWxsIG9mIHRoZW0pIHRvIG91ciBjYWxsZXIuIFRoZXkgbXVzdCBoYW5kbGUgaXQqL1xuICAgIC8qIGNhcmVmdWxseSB0byBlbnN1cmUgdGhhdCB0aGV5IGVuZCB1cCBpbiBhcHByb3ByaWF0ZSBoYW5kcy4qL1xuICAgIHNldHRlcnNbYHByZXBhcmVUb1VwZGF0ZSR7bmFtZX1gXSA9IHByZXBhcmVUb1NldEludml0YXRpb247XG4gICAgc2V0dGVyc1tgdXBkYXRlJHtuYW1lfWBdID0gc2V0SW52aXRhdGlvbjtcblxuICAgIC8qIFhYWCBsZXQgdGhlIHZhbHVlIGJlIHNldCBhc3luYy4gQSBjb25jZXNzaW9uIHRvIHVwZ3JhZGFiaWxpdHkqL1xuICAgIC8qIFVOVElMIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDM0MyovXG4gICAgY29uc3QgZmluaXNoSW52aXRhdGlvblBhcmFtID0gRS53aGVuKFxuICAgICAgcHJlcGFyZVRvU2V0SW52aXRhdGlvbihpbnZpdGF0aW9uKSxcbiAgICAgIGludml0YXRpb25BbmRBbW91bnQgPT4ge1xuICAgICAgICBzZXRJbnZpdGF0aW9uKGludml0YXRpb25BbmRBbW91bnQpO1xuICAgICAgICAvKiBkZWxheSB1bnRpbCBjdXJyZW50QW1vdW50IGlzIGRlZmluZWQgYmVjYXVzZSByZWFkZXJzIGV4cGVjdCBhIHZhbGlkIHZhbHVlKi9cbiAgICAgICAgbmFtZXNUb1BhcmFtcy5pbml0KG5hbWUsIHB1YmxpY01ldGhvZHMpO1xuICAgICAgfSxcbiAgICApO1xuICAgIHVuZmluaXNoZWRQYXJhbXMucHVzaChmaW5pc2hJbnZpdGF0aW9uUGFyYW0pO1xuXG4gICAgcmV0dXJuIG5hbWU7XG4gIH07XG5cbiAgLyoqIEB0eXBlIHsobmFtZTogc3RyaW5nLCB2YWx1ZTogSW52aXRhdGlvbiwgYnVpbGRlcjogUGFyYW1NYW5hZ2VyQnVpbGRlcikgPT4gUGFyYW1NYW5hZ2VyQnVpbGRlcn0gKi9cbiAgY29uc3QgYWRkSW52aXRhdGlvbiA9IChuYW1lLCB2YWx1ZSwgYnVpbGRlcikgPT4ge1xuICAgIGFzc2VydEtleXdvcmROYW1lKG5hbWUpO1xuICAgIHZhbHVlICE9PSBudWxsIHx8IEZhaWxgcGFyYW0gJHtxKG5hbWUpfSBtdXN0IGJlIGRlZmluZWRgO1xuXG4gICAgYnVpbGRJbnZpdGF0aW9uUGFyYW0obmFtZSwgdmFsdWUpO1xuXG4gICAgcmV0dXJuIGJ1aWxkZXI7XG4gIH07XG5cbiAgLyogUEFSQU0gTUFOQUdFUiBNRVRIT0RTIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4gIGNvbnN0IGdldFR5cGVkUGFyYW0gPSAodHlwZSwgbmFtZSkgPT4ge1xuICAgIGNvbnN0IHBhcmFtID0gbmFtZXNUb1BhcmFtcy5nZXQobmFtZSk7XG4gICAgdHlwZSA9PT0gcGFyYW0uZ2V0VHlwZSgpIHx8IEZhaWxgJHtuYW1lfSBpcyBub3QgJHt0eXBlfWA7XG4gICAgcmV0dXJuIHBhcmFtLmdldFZhbHVlKCk7XG4gIH07XG5cbiAgY29uc3QgZ2V0VmlzaWJsZVZhbHVlID0gKG5hbWUsIHByb3Bvc2VkKSA9PiB7XG4gICAgY29uc3QgcGFyYW0gPSBuYW1lc1RvUGFyYW1zLmdldChuYW1lKTtcbiAgICByZXR1cm4gcGFyYW0uZ2V0VmlzaWJsZVZhbHVlKHByb3Bvc2VkKTtcbiAgfTtcblxuICAvKiBzaG91bGQgYmUgZXhwb3NlZCB3aXRoaW4gY29udHJhY3RzLCBhbmQgbm90IGV4dGVybmFsbHksIGZvciBpbnZpdGF0aW9ucyovXG4gIC8qKiBAdHlwZSB7KG5hbWU6IHN0cmluZykgPT4gUHJvbWlzZTxJbnZpdGF0aW9uPn0gKi9cbiAgY29uc3QgZ2V0SW50ZXJuYWxQYXJhbVZhbHVlID0gYXN5bmMgbmFtZSA9PiB7XG4gICAgYXdhaXQgZmluaXNoQnVpbGRpbmcoKTtcbiAgICByZXR1cm4gbmFtZXNUb1BhcmFtcy5nZXQobmFtZSkuZ2V0SW50ZXJuYWxWYWx1ZSgpO1xuICB9O1xuXG4gIGNvbnN0IGdldFBhcmFtcyA9IGFzeW5jICgpID0+IHtcbiAgICBhd2FpdCBmaW5pc2hCdWlsZGluZygpO1xuICAgIC8qKiBAdHlwZSB7UGFyYW1TdGF0ZVJlY29yZH0gKi9cbiAgICBjb25zdCBkZXNjcmlwdGlvbnMgPSB7fTtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBwYXJhbV0gb2YgbmFtZXNUb1BhcmFtcy5lbnRyaWVzKCkpIHtcbiAgICAgIGRlc2NyaXB0aW9uc1tuYW1lXSA9IHBhcmFtLm1ha2VEZXNjcmlwdGlvbigpO1xuICAgIH1cbiAgICByZXR1cm4gaGFyZGVuKGRlc2NyaXB0aW9ucyk7XG4gIH07XG5cbiAgLyoqIEB0eXBlIHtVcGRhdGVQYXJhbXN9ICovXG4gIGNvbnN0IHVwZGF0ZVBhcmFtcyA9IGFzeW5jIHBhcmFtQ2hhbmdlcyA9PiB7XG4gICAgYXdhaXQgZmluaXNoQnVpbGRpbmcoKTtcbiAgICBjb25zdCBwYXJhbU5hbWVzID0gT2JqZWN0LmtleXMocGFyYW1DaGFuZ2VzKTtcblxuICAgIC8qIHByb21pc2VzIHRvIHByZXBhcmUgZXZlcnkgdXBkYXRlKi9cbiAgICBjb25zdCBhc3luY1Jlc3VsdHMgPSBwYXJhbU5hbWVzLm1hcChuYW1lID0+XG4gICAgICBzZXR0ZXJzW2BwcmVwYXJlVG9VcGRhdGUke25hbWV9YF0ocGFyYW1DaGFuZ2VzW25hbWVdKSxcbiAgICApO1xuICAgIC8qIGlmIGFueSB1cGRhdGUgZG9lc24ndCBzdWNjZWVkLCBmYWlsIHRoZSByZXF1ZXN0Ki9cbiAgICBjb25zdCBwcmVwYXJlZCA9IGF3YWl0IFByb21pc2UuYWxsKGFzeW5jUmVzdWx0cyk7XG5cbiAgICAvKiBhY3R1YWxseSB1cGRhdGUqL1xuICAgIGZvciAoY29uc3QgW2ksIG5hbWVdIG9mIHBhcmFtTmFtZXMuZW50cmllcygpKSB7XG4gICAgICBjb25zdCBzZXRGbiA9IHNldHRlcnNbYHVwZGF0ZSR7bmFtZX1gXTtcbiAgICAgIHNldEZuKHByZXBhcmVkW2ldKTtcbiAgICB9XG4gICAgcHVibGlzaCgpO1xuICB9O1xuXG4gIC8qIENhbGxlZCBhZnRlciBhbGwgcGFyYW1zIGhhdmUgYmVlbiBhZGRlZCB3aXRoIHRoZWlyIGluaXRpYWwgdmFsdWVzKi9cbiAgY29uc3QgYnVpbGQgPSAoKSA9PiB7XG4gICAgLyogWFhYIGxldCBwYXJhbXMgYmUgZmluaXNoZWQgYXN5bmMuIEEgY29uY2Vzc2lvbiB0byB1cGdyYWRhYmlsaXR5Ki9cbiAgICAvKiBVTlRJTCBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQzNDMqL1xuICAgIHZvaWQgRS53aGVuKGZpbmlzaEJ1aWxkaW5nKCksICgpID0+IHB1Ymxpc2goKSk7XG5cbiAgICAvKiBDUlVDSUFMOiBDb250cmFjdHMgdGhhdCBjYWxsIGJ1aWxkUGFyYW1NYW5hZ2VyIHNob3VsZCBvbmx5IGV4cG9ydCB0aGUqL1xuICAgIC8qIHJlc3VsdGluZyBwYXJhbU1hbmFnZXIgdG8gdGhlaXIgY3JlYXRvckZhY2V0LCB3aGVyZSBpdCB3aWxsIGJlIHBpY2tlZCB1cCBieSovXG4gICAgLyogY29udHJhY3RHb3Zlcm5vci4gVGhlIGdldFBhcmFtcyBtZXRob2QgY2FuIGJlIHNoYXJlZCB3aWRlbHkuKi9cbiAgICByZXR1cm4gRmFyKCdwYXJhbSBtYW5hZ2VyJywge1xuICAgICAgZ2V0UGFyYW1zLFxuICAgICAgZ2V0U3Vic2NyaXB0aW9uOiAoKSA9PiBzdWJzY3JpYmVyLFxuICAgICAgZ2V0QW1vdW50OiBuYW1lID0+IGdldFR5cGVkUGFyYW0oUGFyYW1UeXBlcy5BTU9VTlQsIG5hbWUpLFxuICAgICAgZ2V0QnJhbmQ6IG5hbWUgPT4gZ2V0VHlwZWRQYXJhbShQYXJhbVR5cGVzLkJSQU5ELCBuYW1lKSxcbiAgICAgIGdldEluc3RhbmNlOiBuYW1lID0+IGdldFR5cGVkUGFyYW0oUGFyYW1UeXBlcy5JTlNUQU5DRSwgbmFtZSksXG4gICAgICBnZXRJbnN0YWxsYXRpb246IG5hbWUgPT4gZ2V0VHlwZWRQYXJhbShQYXJhbVR5cGVzLklOU1RBTExBVElPTiwgbmFtZSksXG4gICAgICBnZXRJbnZpdGF0aW9uQW1vdW50OiBuYW1lID0+IGdldFR5cGVkUGFyYW0oUGFyYW1UeXBlcy5JTlZJVEFUSU9OLCBuYW1lKSxcbiAgICAgIGdldE5hdDogbmFtZSA9PiBnZXRUeXBlZFBhcmFtKFBhcmFtVHlwZXMuTkFULCBuYW1lKSxcbiAgICAgIGdldFJhdGlvOiBuYW1lID0+IGdldFR5cGVkUGFyYW0oUGFyYW1UeXBlcy5SQVRJTywgbmFtZSksXG4gICAgICBnZXRSZWNvcmQ6IG5hbWUgPT4gZ2V0VHlwZWRQYXJhbShQYXJhbVR5cGVzLlBBU1NBQkxFX1JFQ09SRCwgbmFtZSksXG4gICAgICBnZXRTdHJpbmc6IG5hbWUgPT4gZ2V0VHlwZWRQYXJhbShQYXJhbVR5cGVzLlNUUklORywgbmFtZSksXG4gICAgICBnZXRUaW1lc3RhbXA6IG5hbWUgPT4gZ2V0VHlwZWRQYXJhbShQYXJhbVR5cGVzLlRJTUVTVEFNUCwgbmFtZSksXG4gICAgICBnZXRSZWxhdGl2ZVRpbWU6IG5hbWUgPT4gZ2V0VHlwZWRQYXJhbShQYXJhbVR5cGVzLlJFTEFUSVZFX1RJTUUsIG5hbWUpLFxuICAgICAgZ2V0VW5rbm93bjogbmFtZSA9PiBnZXRUeXBlZFBhcmFtKFBhcmFtVHlwZXMuVU5LTk9XTiwgbmFtZSksXG4gICAgICBnZXRWaXNpYmxlVmFsdWUsXG4gICAgICBnZXRJbnRlcm5hbFBhcmFtVmFsdWUsXG4gICAgICAvKiBHZXR0ZXJzIGFuZCBzZXR0ZXJzIGZvciBlYWNoIHBhcmFtIHZhbHVlKi9cbiAgICAgIC4uLmdldHRlcnMsXG4gICAgICB1cGRhdGVQYXJhbXMsXG4gICAgICAvKiBDb2xsZWN0aW9uIG9mIGFsbCBnZXR0ZXJzIGZvciBwYXNzaW5nIHRvIHJlYWQtb25seSBjb250ZXh0cyovXG4gICAgICByZWFkb25seTogKCkgPT4gaGFyZGVuKGdldHRlcnMpLFxuICAgIH0pO1xuICB9O1xuXG4gIC8qKiBAdHlwZSB7UGFyYW1NYW5hZ2VyQnVpbGRlcn0gKi9cbiAgY29uc3QgYnVpbGRlciA9IHtcbiAgICBhZGRBbW91bnQ6IChuLCB2KSA9PiBhZGRBbW91bnQobiwgdiwgYnVpbGRlciksXG4gICAgYWRkQnJhbmQ6IChuLCB2KSA9PiBhZGRCcmFuZChuLCB2LCBidWlsZGVyKSxcbiAgICBhZGRJbnN0YWxsYXRpb246IChuLCB2KSA9PiBhZGRJbnN0YWxsYXRpb24obiwgdiwgYnVpbGRlciksXG4gICAgYWRkSW5zdGFuY2U6IChuLCB2KSA9PiBhZGRJbnN0YW5jZShuLCB2LCBidWlsZGVyKSxcbiAgICBhZGRVbmtub3duOiAobiwgdikgPT4gYWRkVW5rbm93bihuLCB2LCBidWlsZGVyKSxcbiAgICBhZGRJbnZpdGF0aW9uOiAobiwgdikgPT4gYWRkSW52aXRhdGlvbihuLCB2LCBidWlsZGVyKSxcbiAgICBhZGROYXQ6IChuLCB2KSA9PiBhZGROYXQobiwgdiwgYnVpbGRlciksXG4gICAgYWRkUmF0aW86IChuLCB2KSA9PiBhZGRSYXRpbyhuLCB2LCBidWlsZGVyKSxcbiAgICBhZGRSZWNvcmQ6IChuLCB2KSA9PiBhZGRSZWNvcmQobiwgdiwgYnVpbGRlciksXG4gICAgYWRkU3RyaW5nOiAobiwgdikgPT4gYWRkU3RyaW5nKG4sIHYsIGJ1aWxkZXIpLFxuICAgIGFkZFJlbGF0aXZlVGltZTogKG4sIHYpID0+IGFkZFJlbGF0aXZlVGltZShuLCB2LCBidWlsZGVyKSxcbiAgICBhZGRUaW1lc3RhbXA6IChuLCB2KSA9PiBhZGRUaW1lc3RhbXAobiwgdiwgYnVpbGRlciksXG4gICAgYnVpbGQsXG4gIH07XG4gIHJldHVybiBidWlsZGVyO1xufTskaM2PX29uY2UubWFrZVBhcmFtTWFuYWdlckJ1aWxkZXIobWFrZVBhcmFtTWFuYWdlckJ1aWxkZXIpO1xuXG5oYXJkZW4oYXNzZXJ0RWxlY3RvcmF0ZU1hdGNoZXMpO1xuaGFyZGVuKG1ha2VQYXJhbU1hbmFnZXJCdWlsZGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydEVsZWN0b3JhdGVNYXRjaGVzIjpbImFzc2VydEVsZWN0b3JhdGVNYXRjaGVzIl0sIm1ha2VQYXJhbU1hbmFnZXJCdWlsZGVyIjpbIm1ha2VQYXJhbU1hbmFnZXJCdWlsZGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKaX7U68GwAAvBsAAEYAAABAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL3R5cGVkUGFyYW1NYW5hZ2VyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9lcnJvcnMiLCIuLi9jb25zdGFudHMuanMiLCIuL2dvdmVyblBhcmFtLmpzIiwiLi9wYXJhbU1hbmFnZXIuanMiXSwiZXhwb3J0cyI6WyJtYWtlUGFyYW1NYW5hZ2VyIiwibWFrZVBhcmFtTWFuYWdlckZyb21UZXJtcyIsIm1ha2VQYXJhbU1hbmFnZXJTeW5jIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRSxGYWlsLHEsUGFyYW1UeXBlcyxDT05UUkFDVF9FTEVDVE9SQVRFLG1ha2VQYXJhbU1hbmFnZXJCdWlsZGVyOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiLi4vY29uc3RhbnRzLmpzXCIsIFtbXCJQYXJhbVR5cGVzXCIsWyRozY9fYSA9PiAoUGFyYW1UeXBlcyA9ICRozY9fYSldXV1dLFtcIi4vZ292ZXJuUGFyYW0uanNcIiwgW1tcIkNPTlRSQUNUX0VMRUNUT1JBVEVcIixbJGjNj19hID0+IChDT05UUkFDVF9FTEVDVE9SQVRFID0gJGjNj19hKV1dXV0sW1wiLi9wYXJhbU1hbmFnZXIuanNcIiwgW1tcIm1ha2VQYXJhbU1hbmFnZXJCdWlsZGVyXCIsWyRozY9fYSA9PiAobWFrZVBhcmFtTWFuYWdlckJ1aWxkZXIgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7Q29udHJhY3RNZXRhLCBJbnN0YWxsYXRpb24sIEluc3RhbmNlLCBJbnZpdGF0aW9uLCBLZXl3b3JkLCBaQ0Z9IGZyb20gJ0BhZ29yaWMvem9lJztcbiAqIEBpbXBvcnQge1ZvdGVDb3VudGVyQ3JlYXRvckZhY2V0LCBWb3RlQ291bnRlclB1YmxpY0ZhY2V0LCBRdWVzdGlvblNwZWMsIE91dGNvbWVSZWNvcmQsIEFkZFF1ZXN0aW9uLCBBZGRRdWVzdGlvblJldHVybiwgR292ZXJuYW5jZVN1YnNjcmlwdGlvblN0YXRlLCBHb3Zlcm5hbmNlVGVybXMsIFBhcmFtTWFuYWdlckJhc2UsIFBhcmFtU3RhdGVSZWNvcmQsIFBhcmFtVmFsdWVGb3JUeXBlLCBVcGRhdGVQYXJhbXN9IGZyb20gJy4uL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge1BhcmFtVHlwZX0gZnJvbSAnLi4vY29uc3RhbnRzLmpzJztcbiAqIEBpbXBvcnQge1N0b3JlZFB1Ymxpc2hlcktpdH0gZnJvbSAnQGFnb3JpYy9ub3RpZmllcic7XG4gKiBAaW1wb3J0IHtBbW91bnR9IGZyb20gJ0BhZ29yaWMvZXJ0cCc7XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPEtleXdvcmQsIFBhcmFtVHlwZT59IFBhcmFtVHlwZXNNYXBcbiAqL1xuLyoqXG4gKiBAdGVtcGxhdGUge1BhcmFtU3RhdGVSZWNvcmR9IE1cbiAqIEB0eXBlZGVmIHt7IFtSIGluIGtleW9mIE1dOiBNW1JdWyd0eXBlJ119fSBQYXJhbVR5cGVzTWFwRnJvbVJlY29yZFxuICovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UGFyYW1UeXBlc01hcH0gTVxuICogQHR5cGVkZWYge3sgW1QgaW4ga2V5b2YgTV06IHsgdHlwZTogTVtUXSwgdmFsdWU6IFBhcmFtVmFsdWVGb3JUeXBlPE1bVF0+IH0gfX0gUGFyYW1SZWNvcmRzRnJvbVR5cGVzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge1BhcmFtVHlwZXNNYXB9IE1cbiAqIEB0eXBlZGVmIHt7XG4gKiAgIFtLIGluIGtleW9mIE0gYXMgYGdldCR7c3RyaW5nICYgS31gXTogKCkgPT4gUGFyYW1WYWx1ZUZvclR5cGU8TVtLXT5cbiAqIH19IEdldHRlcnNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UGFyYW1UeXBlc01hcH0gVFxuICogQHR5cGVkZWYge3tcbiAqICAgW0sgaW4ga2V5b2YgVCBhcyBgdXBkYXRlJHtzdHJpbmcgJiBLfWBdOiAodmFsdWU6IFBhcmFtVmFsdWVGb3JUeXBlPFRbS10+KSA9PiB2b2lkXG4gKiB9fSBVcGRhdGVyc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtQYXJhbVR5cGVzTWFwfSBNXG4gKiBAdHlwZWRlZiB7UGFyYW1NYW5hZ2VyQmFzZSAmIEdldHRlcnM8TT4gJiBVcGRhdGVyczxNPiAmIHtyZWFkb25seTogKCkgPT4gR2V0dGVyczxNPn0gJiB7dXBkYXRlUGFyYW1zOiBVcGRhdGVQYXJhbXN9fSBUeXBlZFBhcmFtTWFuYWdlclxuICovXG5cbi8qKlxuICogQHBhcmFtIHtQYXJhbVR5cGV9IHR5cGVcbiAqL1xuY29uc3QgYnVpbGRlck1ldGhvZE5hbWUgPSB0eXBlID0+XG4gIGBhZGQke3R5cGVbMF0udG9VcHBlckNhc2UoKSArIHR5cGUuc3Vic3RyaW5nKDEpfWA7XG5cbi8qKiBAdHlwZSB7UGFydGlhbDxSZWNvcmQ8UGFyYW1UeXBlLCBib29sZWFuPj59ICovXG5jb25zdCBpc0FzeW5jID0ge1xuICBpbnZpdGF0aW9uOiB0cnVlLFxufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1BhcmFtVHlwZX0gVFxuICogQHR5cGVkZWYge1t0eXBlOiBULCB2YWx1ZTogUGFyYW1WYWx1ZUZvclR5cGU8VD5dfSBTVCBwYXJhbSBzcGVjIHR1cGxlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7eyB0eXBlOiAnaW52aXRhdGlvbicsIHZhbHVlOiBBbW91bnQ8J3NldCc+IH19IEludml0YXRpb25QYXJhbVxuICovXG5cbi8qIFhYWCBiZXR0ZXIgdG8gdXNlIHRoZSBtYW5pZmVzdCBjb25zdGFudCBQYXJhbVR5cGVzKi9cbi8qIGJ1dCBpbXBvcnRpbmcgdGhhdCBoZXJlIHR1cm5zIHRoaXMgZmlsZSBpbnRvIGEgbW9kdWxlLCovXG4vKiBicmVha2luZyB0aGUgYW1iaWVudCB0eXBpbmcqL1xuLyoqXG4gKiBAdHlwZWRlZiB7U1Q8J2Ftb3VudCc+XG4gKiB8IFNUPCdicmFuZCc+XG4gKiB8IFNUPCdpbnN0YWxsYXRpb24nPlxuICogfCBTVDwnaW5zdGFuY2UnPlxuICogfCBTVDwnbmF0Jz5cbiAqIHwgU1Q8J3JhdGlvJz5cbiAqIHwgU1Q8J3N0cmluZyc+XG4gKiB8IFNUPCd0aW1lc3RhbXAnPlxuICogfCBTVDwncmVsYXRpdmVUaW1lJz5cbiAqIHwgU1Q8J3Vua25vd24nPn0gU3luY1NwZWNUdXBsZVxuICpcbiAqIEB0eXBlZGVmIHtbJ2ludml0YXRpb24nLCBJbnZpdGF0aW9uXX0gQXN5bmNTcGVjVHVwbGVcbiAqL1xuXG4vKipcbiAqIEBzZWUgbWFrZVBhcmFtTWFuYWdlclN5bmNcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPEtleXdvcmQsIEFzeW5jU3BlY1R1cGxlIHwgU3luY1NwZWNUdXBsZT59IFRcbiAqIEBwYXJhbSB7U3RvcmVkUHVibGlzaGVyS2l0PEdvdmVybmFuY2VTdWJzY3JpcHRpb25TdGF0ZT59IHB1Ymxpc2hlcktpdFxuICogQHBhcmFtIHtUfSBzcGVjXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcmV0dXJucyB7VHlwZWRQYXJhbU1hbmFnZXI8e1tLIGluIGtleW9mIFRdOiBUW0tdWzBdfT59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlUGFyYW1NYW5hZ2VyID0gKHB1Ymxpc2hlcktpdCwgc3BlYywgemNmKSA9PiB7XG4gIGNvbnN0IGJ1aWxkZXIgPSBtYWtlUGFyYW1NYW5hZ2VyQnVpbGRlcihwdWJsaXNoZXJLaXQsIHpjZi5nZXRab2VTZXJ2aWNlKCkpO1xuXG4gIGNvbnN0IHByb21pc2VzID0gW107XG4gIGZvciAoY29uc3QgW25hbWUsIFt0eXBlLCB2YWx1ZV1dIG9mIE9iamVjdC5lbnRyaWVzKHNwZWMpKSB7XG4gICAgY29uc3QgYWRkID0gYnVpbGRlcltidWlsZGVyTWV0aG9kTmFtZSh0eXBlKV07XG4gICAgaWYgKGlzQXN5bmNbdHlwZV0pIHtcbiAgICAgIHByb21pc2VzLnB1c2goYWRkKG5hbWUsIHZhbHVlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFkZChuYW1lLCB2YWx1ZSk7XG4gICAgfVxuICB9XG4gIC8qIFhYWCBraWNrIG9mZiBwcm9taXNlcyBidXQgZG9uJ3QgYmxvY2suIFRoaXMgaXMgYSBjb25jZXNzaW9uIHRvIGNvbnRyYWN0IHJlaW5jYXJuYXRpb24qL1xuICAvKiB3aGljaCBjYW5ub3QgYmxvY2sgb24gYSByZW1vdGUgY2FsbC4qL1xuICAvKiBVTlRJTCBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQzNDMqL1xuICB2b2lkIEUud2hlbihQcm9taXNlLmFsbChwcm9taXNlcyksIHVuZGVmaW5lZCwgcmVhc29uID0+XG4gICAgemNmLnNodXRkb3duV2l0aEZhaWx1cmUocmVhc29uKSxcbiAgKTtcblxuICAvKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuICByZXR1cm4gYnVpbGRlci5idWlsZCgpO1xufTskaM2PX29uY2UubWFrZVBhcmFtTWFuYWdlcihtYWtlUGFyYW1NYW5hZ2VyKTtcbmhhcmRlbihtYWtlUGFyYW1NYW5hZ2VyKTtcblxuLyoqXG4gKiBVc2VkIG9ubHkgd2hlbiB0aGUgY29udHJhY3QgaGFzIG11bHRpcGxlIHBhcmFtIG1hbmFnZXJzLlxuICogRXhhY3RseSBvbmUgbXVzdCBtYW5hZ2UgdGhlIGVsZWN0b3JhdGUsIHdoaWNoIHJlcXVpcmVzIHRoZSBhc3luYyB2ZXJzaW9uLlxuICpcbiAqIEBzZWUgbWFrZVBhcmFtTWFuYWdlclxuICogQHRlbXBsYXRlIHtSZWNvcmQ8S2V5d29yZCwgU3luY1NwZWNUdXBsZT59IFRcbiAqIEBwYXJhbSB7U3RvcmVkUHVibGlzaGVyS2l0PEdvdmVybmFuY2VTdWJzY3JpcHRpb25TdGF0ZT59IHB1Ymxpc2hlcktpdFxuICogQHBhcmFtIHtUfSBzcGVjXG4gKiBAcmV0dXJucyB7VHlwZWRQYXJhbU1hbmFnZXI8e1tLIGluIGtleW9mIFRdOiBUW0tdWzBdfT59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlUGFyYW1NYW5hZ2VyU3luYyA9IChwdWJsaXNoZXJLaXQsIHNwZWMpID0+IHtcbiAgY29uc3QgYnVpbGRlciA9IG1ha2VQYXJhbU1hbmFnZXJCdWlsZGVyKHB1Ymxpc2hlcktpdCk7XG5cbiAgZm9yIChjb25zdCBbbmFtZSwgW3R5cGUsIHZhbHVlXV0gb2YgT2JqZWN0LmVudHJpZXMoc3BlYykpIHtcbiAgICBjb25zdCBhZGQgPSBidWlsZGVyW2J1aWxkZXJNZXRob2ROYW1lKHR5cGUpXTtcbiAgICBhZGQgfHwgRmFpbGBObyBidWlsZGVyIG1ldGhvZCBmb3IgcGFyYW0gdHlwZSAke3EodHlwZSl9YDtcbiAgICBhZGQobmFtZSwgdmFsdWUpO1xuICB9XG5cbiAgLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbiAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTtcbn07JGjNj19vbmNlLm1ha2VQYXJhbU1hbmFnZXJTeW5jKG1ha2VQYXJhbU1hbmFnZXJTeW5jKTtcbmhhcmRlbihtYWtlUGFyYW1NYW5hZ2VyU3luYyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCBJbnZpdGF0aW9uPiAmIHtFbGVjdG9yYXRlOiBJbnZpdGF0aW9ufX0gSSBQcml2YXRlIGludml0YXRpb24gdmFsdWVzXG4gKiBAdGVtcGxhdGUge1BhcmFtVHlwZXNNYXB9IE0gTWFwIG9mIHR5cGVzIG9mIGN1c3RvbSBnb3Zlcm5lZCB0ZXJtc1xuICogQHBhcmFtIHtTdG9yZWRQdWJsaXNoZXJLaXQ8R292ZXJuYW5jZVN1YnNjcmlwdGlvblN0YXRlPn0gcHVibGlzaGVyS2l0XG4gKiBAcGFyYW0ge1pDRjxHb3Zlcm5hbmNlVGVybXM8TT4+fSB6Y2ZcbiAqIEBwYXJhbSB7SX0gaW52aXRhdGlvbnMgaW52aXRhdGlvbiBvYmplY3RzLCB3aGljaCBtdXN0IGNvbWUgZnJvbSBwcml2YXRlQXJnc1xuICogQHBhcmFtIHtNfSBwYXJhbVR5cGVzTWFwXG4gKiBAcGFyYW0ge29iamVjdH0gW292ZXJyaWRlc11cbiAqIEByZXR1cm5zIHtUeXBlZFBhcmFtTWFuYWdlcjxNICYge1tLIGluIGtleW9mIEldOiAnaW52aXRhdGlvbid9Pn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VQYXJhbU1hbmFnZXJGcm9tVGVybXMgPSAoXG4gIHB1Ymxpc2hlcktpdCxcbiAgemNmLFxuICBpbnZpdGF0aW9ucyxcbiAgcGFyYW1UeXBlc01hcCxcbiAgb3ZlcnJpZGVzLFxuKSA9PiB7XG4gIGlmIChvdmVycmlkZXMpIHtcbiAgICBjb25zb2xlLmxvZygnVFBNICcsIHsgb3ZlcnJpZGVzIH0pO1xuICB9XG5cbiAgY29uc3QgeyBnb3Zlcm5lZFBhcmFtcyB9ID0gemNmLmdldFRlcm1zKCk7XG4gIC8qKiBAdHlwZSB7QXJyYXk8W0tleXdvcmQsIChTeW5jU3BlY1R1cGxlIHwgQXN5bmNTcGVjVHVwbGUpXT59ICovXG4gIGNvbnN0IG1ha2VyU3BlY0VudHJpZXMgPSBPYmplY3QuZW50cmllcyhwYXJhbVR5cGVzTWFwKS5tYXAoXG4gICAgKFtwYXJhbUtleSwgcGFyYW1UeXBlXSkgPT4ge1xuICAgICAgY29uc3QgdmFsdWUgPVxuICAgICAgICBvdmVycmlkZXMgJiYgb3ZlcnJpZGVzW3BhcmFtS2V5XVxuICAgICAgICAgID8gb3ZlcnJpZGVzW3BhcmFtS2V5XVxuICAgICAgICAgIDogZ292ZXJuZWRQYXJhbXNbcGFyYW1LZXldLnZhbHVlO1xuXG4gICAgICByZXR1cm4gW3BhcmFtS2V5LCAvKiogQHR5cGUge1N5bmNTcGVjVHVwbGV9ICovIChbcGFyYW1UeXBlLCB2YWx1ZV0pXTtcbiAgICB9LFxuICApO1xuICAvKiBFdmVyeSBnb3Zlcm5lZCBjb250cmFjdCBoYXMgYW4gRWxlY3RvcmF0ZSBwYXJhbSB0aGF0IHN0YXJ0cyBhcyBgaW5pdGlhbFBvc2VySW52aXRhdGlvbmAgcHJpdmF0ZSBhcmcqL1xuICBmb3IgKGNvbnN0IFtuYW1lLCBpbnZpdGF0aW9uXSBvZiBPYmplY3QuZW50cmllcyhpbnZpdGF0aW9ucykpIHtcbiAgICBtYWtlclNwZWNFbnRyaWVzLnB1c2goW25hbWUsIFtQYXJhbVR5cGVzLklOVklUQVRJT04sIGludml0YXRpb25dXSk7XG4gIH1cbiAgY29uc3QgbWFrZXJTcGVjID0gT2JqZWN0LmZyb21FbnRyaWVzKG1ha2VyU3BlY0VudHJpZXMpO1xuICBtYWtlclNwZWNbQ09OVFJBQ1RfRUxFQ1RPUkFURV0gfHxcbiAgICBGYWlsYG1pc3NpbmcgRWxlY3RvcmF0ZSBpbnZpdGF0aW9uIHBhcmFtIHZhbHVlYDtcblxuICAvKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuICByZXR1cm4gbWFrZVBhcmFtTWFuYWdlcihwdWJsaXNoZXJLaXQsIG1ha2VyU3BlYywgemNmKTtcbn07JGjNj19vbmNlLm1ha2VQYXJhbU1hbmFnZXJGcm9tVGVybXMobWFrZVBhcmFtTWFuYWdlckZyb21UZXJtcyk7XG5oYXJkZW4obWFrZVBhcmFtTWFuYWdlckZyb21UZXJtcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUGFyYW1NYW5hZ2VyIjpbIm1ha2VQYXJhbU1hbmFnZXIiXSwibWFrZVBhcmFtTWFuYWdlclN5bmMiOlsibWFrZVBhcmFtTWFuYWdlclN5bmMiXSwibWFrZVBhcmFtTWFuYWdlckZyb21UZXJtcyI6WyJtYWtlUGFyYW1NYW5hZ2VyRnJvbVRlcm1zIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMEVxH8cJgAAHCYAADIAAABAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29udHJhY3RHb3Zlcm5vci5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L2R1cmFiaWxpdHkuanMiLCIuL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5QYXJhbS5qcyIsIi4vY29udHJhY3RHb3Zlcm5vcktpdC5qcyIsIi4vdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbIm1ldGEiLCJzdGFydCIsInZhbGlkYXRlUXVlc3Rpb25EZXRhaWxzIiwidmFsaWRhdGVRdWVzdGlvbkZyb21Db3VudGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxFLG11c3RNYXRjaCxtYWtlVHJhY2VyLHByb3ZpZGVTaW5nbGV0b24sQ09OVFJBQ1RfRUxFQ1RPUkFURSxwcmVwYXJlQ29udHJhY3RHb3Zlcm5vcktpdCxQYXJhbUNoYW5nZXNRdWVzdGlvbkRldGFpbHNTaGFwZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcIm1ha2VUcmFjZXJcIixbJGjNj19hID0+IChtYWtlVHJhY2VyID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9kdXJhYmlsaXR5LmpzXCIsIFtbXCJwcm92aWRlU2luZ2xldG9uXCIsWyRozY9fYSA9PiAocHJvdmlkZVNpbmdsZXRvbiA9ICRozY9fYSldXV1dLFtcIi4vY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVyblBhcmFtLmpzXCIsIFtbXCJDT05UUkFDVF9FTEVDVE9SQVRFXCIsWyRozY9fYSA9PiAoQ09OVFJBQ1RfRUxFQ1RPUkFURSA9ICRozY9fYSldXV1dLFtcIi4vY29udHJhY3RHb3Zlcm5vcktpdC5qc1wiLCBbW1wicHJlcGFyZUNvbnRyYWN0R292ZXJub3JLaXRcIixbJGjNj19hID0+IChwcmVwYXJlQ29udHJhY3RHb3Zlcm5vcktpdCA9ICRozY9fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGVcIixbJGjNj19hID0+IChQYXJhbUNoYW5nZXNRdWVzdGlvbkRldGFpbHNTaGFwZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0NvbnRyYWN0TWV0YSwgSW5zdGFsbGF0aW9uLCBJbnN0YW5jZSwgSW52aXRhdGlvbiwgSXNzdWVyS2V5d29yZFJlY29yZCwgU3RhbmRhcmRUZXJtcywgWkNGLCBab2VTZXJ2aWNlfSBmcm9tICdAYWdvcmljL3pvZSc7XG4gKiBAaW1wb3J0IHtHb3Zlcm5hYmxlU3RhcnRGbiwgR292ZXJub3JDcmVhdG9yRmFjZXQsIEdvdmVybm9yUHVibGljLCBQYXJhbUNoYW5nZUlzc3VlRGV0YWlsc30gZnJvbSAnLi90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtUaW1lclNlcnZpY2V9IGZyb20gJ0BhZ29yaWMvdGltZSc7XG4gKiBAaW1wb3J0IHtJbnZpdGF0aW9uUGFyYW19IGZyb20gJy4vY29udHJhY3RHb3Zlcm5hbmNlL3R5cGVkUGFyYW1NYW5hZ2VyLmpzJztcbiAqIEBpbXBvcnQge0JhZ2dhZ2V9IGZyb20gJ0BhZ29yaWMvdmF0LWRhdGEnO1xuICogQGltcG9ydCB7RVJlZn0gZnJvbSAnQGFnb3JpYy92b3cnO1xuICovXG5cbmNvbnN0IHRyYWNlID0gbWFrZVRyYWNlcignQ0dvdicsIGZhbHNlKTtcblxuLyoqIEB0eXBlIHtDb250cmFjdE1ldGE8dHlwZW9mIHN0YXJ0Pn0gKi9cbiAgICAgICBjb25zdCBtZXRhID0ge1xuICB1cGdyYWRhYmlsaXR5OiAnY2FuVXBncmFkZScsXG59OyRozY9fb25jZS5tZXRhKG1ldGEpO1xuaGFyZGVuKG1ldGEpO1xuXG4vKipcbiAqIFZhbGlkYXRlIHRoYXQgdGhlIHF1ZXN0aW9uIGRldGFpbHMgY29ycmVzcG9uZCB0byBhIHBhcmFtZXRlciBjaGFuZ2UgcXVlc3Rpb25cbiAqIHRoYXQgdGhlIGVsZWN0b3JhdGUgaG9zdHMsIGFuZCB0aGF0IHRoZSB2b3RlQ291bnRlciBhbmQgb3RoZXIgZGV0YWlscyBhcmVcbiAqIGNvbnNpc3RlbnQgd2l0aCBpdC5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8Wm9lU2VydmljZT59IHpvZVxuICogQHBhcmFtIHtJbnN0YW5jZX0gZWxlY3RvcmF0ZVxuICogQHBhcmFtIHtQYXJhbUNoYW5nZUlzc3VlRGV0YWlsc30gZGV0YWlsc1xuICovXG4gICAgICAgY29uc3QgdmFsaWRhdGVRdWVzdGlvbkRldGFpbHMgPSBhc3luYyAoem9lLCBlbGVjdG9yYXRlLCBkZXRhaWxzKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBjb3VudGVySW5zdGFuY2UsXG4gICAgaXNzdWU6IHsgY29udHJhY3Q6IGdvdmVybmVkSW5zdGFuY2UgfSxcbiAgfSA9IGRldGFpbHM7XG4gIG11c3RNYXRjaChkZXRhaWxzLCBQYXJhbUNoYW5nZXNRdWVzdGlvbkRldGFpbHNTaGFwZSk7XG5cbiAgY29uc3QgZ292ZXJub3JJbnN0YW5jZSA9IGF3YWl0IEUuZ2V0KEUoem9lKS5nZXRUZXJtcyhnb3Zlcm5lZEluc3RhbmNlKSlcbiAgICAuZWxlY3Rpb25NYW5hZ2VyO1xuICBjb25zdCBnb3Zlcm5vclB1YmxpYyA9IEUoem9lKS5nZXRQdWJsaWNGYWNldChnb3Zlcm5vckluc3RhbmNlKTtcblxuICByZXR1cm4gUHJvbWlzZS5hbGwoW1xuICAgIEUoZ292ZXJub3JQdWJsaWMpLnZhbGlkYXRlVm90ZUNvdW50ZXIoY291bnRlckluc3RhbmNlKSxcbiAgICBFKGdvdmVybm9yUHVibGljKS52YWxpZGF0ZUVsZWN0b3JhdGUoZWxlY3RvcmF0ZSksXG4gICAgRShnb3Zlcm5vclB1YmxpYykudmFsaWRhdGVUaW1lcihkZXRhaWxzLmNsb3NpbmdSdWxlKSxcbiAgXSk7XG59OyRozY9fb25jZS52YWxpZGF0ZVF1ZXN0aW9uRGV0YWlscyh2YWxpZGF0ZVF1ZXN0aW9uRGV0YWlscyk7XG5oYXJkZW4odmFsaWRhdGVRdWVzdGlvbkRldGFpbHMpO1xuXG4vKipcbiAqIFZhbGlkYXRlIHRoYXQgdGhlIHF1ZXN0aW9ucyBjb3VudGVkIGJ5IHRoZSB2b3RlQ291bnRlciBjb3JyZXNwb25kIHRvIGFcbiAqIHBhcmFtZXRlciBjaGFuZ2UgcXVlc3Rpb24gdGhhdCB0aGUgZWxlY3RvcmF0ZSBob3N0cywgYW5kIHRoYXQgdGhlXG4gKiB2b3RlQ291bnRlciBhbmQgb3RoZXIgZGV0YWlscyBhcmUgY29uc2lzdGVudC5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8Wm9lU2VydmljZT59IHpvZVxuICogQHBhcmFtIHtJbnN0YW5jZX0gZWxlY3RvcmF0ZVxuICogQHBhcmFtIHtJbnN0YW5jZX0gdm90ZUNvdW50ZXJcbiAqL1xuICAgICAgIGNvbnN0IHZhbGlkYXRlUXVlc3Rpb25Gcm9tQ291bnRlciA9IGFzeW5jIChcbiAgem9lLFxuICBlbGVjdG9yYXRlLFxuICB2b3RlQ291bnRlcixcbikgPT4ge1xuICAvKiogQHR5cGUge1Byb21pc2U8YW55Pn0gKi9cbiAgY29uc3QgY291bnRlclB1YmxpY1AgPSBFKHpvZSkuZ2V0UHVibGljRmFjZXQodm90ZUNvdW50ZXIpO1xuICBjb25zdCBxdWVzdGlvbkRldGFpbHMgPSBhd2FpdCBFKGNvdW50ZXJQdWJsaWNQKS5nZXREZXRhaWxzKCk7XG5cbiAgcmV0dXJuIHZhbGlkYXRlUXVlc3Rpb25EZXRhaWxzKHpvZSwgZWxlY3RvcmF0ZSwgcXVlc3Rpb25EZXRhaWxzKTtcbn07JGjNj19vbmNlLnZhbGlkYXRlUXVlc3Rpb25Gcm9tQ291bnRlcih2YWxpZGF0ZVF1ZXN0aW9uRnJvbUNvdW50ZXIpO1xuaGFyZGVuKHZhbGlkYXRlUXVlc3Rpb25Gcm9tQ291bnRlcik7XG5cbi8qKlxuICogQHR5cGVkZWYge1N0YW5kYXJkVGVybXN9IENvbnRyYWN0R292ZXJub3JUZXJtc1xuICogQHByb3BlcnR5IHtUaW1lclNlcnZpY2V9IHRpbWVyXG4gKiBAcHJvcGVydHkge0luc3RhbGxhdGlvbn0gZ292ZXJuZWRDb250cmFjdEluc3RhbGxhdGlvblxuICovXG5cbi8qKlxuICogQ29udHJhY3RHb3Zlcm5vciBpcyBhbiBFbGVjdGlvbk1hbmFnZXIgdGhhdCBzdGFydHMgdXAgYSBjb250cmFjdCBhbmQgaGFuZHNcbiAqIGl0cyBvd24gY3JlYXRvciBhIGZhY2V0IHRoYXQgYWxsb3dzIHRoZW0gdG8gbWFuYWdlIHRoYXQgY29udHJhY3QncyBBUElzLFxuICogb2ZmZXIgZmlsdGVycywgYW5kIHBhcmFtZXRlcnMuXG4gKlxuICogVGhlIHRlcm1zIGZvciB0aGlzIGNvbnRyYWN0IGluY2x1ZGUgdGhlIFRpbWVyLCBhbmQgdGhlIEluc3RhbGxhdGlvbiB0byBiZVxuICogc3RhcnRlZCwgYXMgd2VsbCBhcyBhbiBpc3N1ZXJLZXl3b3JkUmVjb3JkIG9yIHRlcm1zIG5lZWRlZCBieSB0aGUgZ292ZXJuZWRcbiAqIGNvbnRyYWN0LiBUaG9zZSBkZXRhaWxzIGZvciB0aGUgZ292ZXJuZWQgY29udHJhY3QgYXJlIGluY2x1ZGVkIGluIHRoaXNcbiAqIGNvbnRyYWN0J3MgdGVybXMgYXMgYSBcImdvdmVybmVkXCIgcmVjb3JkLiBJZiB0aGUgY29udHJhY3QgZXhwZWN0cyBwcml2YXRlQXJncyxcbiAqIHRob3NlIHdpbGwgYmUgcHJvdmlkZWQgaW4gdGhpcyBjb250cmFjdCdzIGBwcml2YXRlQXJnc2AgdW5kZXIgJ2dvdmVybmVkOicuXG4gKlxuICogdGVybXMgPSB7XG4gKiAgICB0aW1lcixcbiAqICAgIGdvdmVybmVkQ29udHJhY3RJbnN0YWxsYXRpb24sXG4gKiAgICBnb3Zlcm5lZDogeyBpc3N1ZXJLZXl3b3JkUmVjb3JkLCB0ZXJtcyB9LFxuICogfTtcbiAqXG4gKiBUaGUgZWxlY3RvcmF0ZSB0aGF0IHdpbGwgdm90ZSBvbiBnb3Zlcm5hbmNlIHF1ZXN0aW9ucyBpcyBpdHNlbGYgYSBnb3Zlcm5lZFxuICogcGFyYW1ldGVyLiBJdHMgdmFsdWUgaXMgYXZhaWxhYmxlIGZyb20gdGhlIHB1YmxpY0ZhY2V0IHVzaW5nXG4gKiBnZXRFbGVjdG9yYXRlSW5zdGFuY2UoKS4gV2hlbiBjcmVhdGluZyBuZXcgcXVlc3Rpb25zLCB3ZSB1c2VcbiAqIGdldFVwZGF0ZWRQb3NlckZhY2V0KCkgdG8gaW5mb3JtIHRoZSBlbGVjdG9yYXRlIGFib3V0IHRoZSBuZXcgcXVlc3Rpb24uXG4gKlxuICogVGhlIGdvdmVybmVkQ29udHJhY3QgaXMgcmVzcG9uc2libGUgZm9yIHN1cHBseWluZyBnZXRQYXJhbU1nclJldHJpZXZlcigpIGluXG4gKiBpdHMgY3JlYXRvckZhY2V0LiBnZXRQYXJhbU1nclJldHJpZXZlcigpIHRha2VzIGEgUGFyYW1TcGVjaWZpY2F0aW9uLCB3aGljaFxuICogaWRlbnRpZmllcyB0aGUgcGFyYW1ldGVyIHRvIGJlIHZvdGVkIG9uLiBBIG1pbmltYWwgUGFyYW1TcGVjaWZpY2F0aW9uXG4gKiBzcGVjaWZpZXMgdGhlIGtleSB3aGljaCBpZGVudGlmaWVzIGEgcGFydGljdWxhciBwYXJhbU1hbmFnZXIgKGV2ZW4gaWYgdGhlcmUnc1xuICogb25seSBvbmUpIGFuZCB0aGUgcGFyYW1ldGVyTmFtZS4gVGhlIGludGVycHJldGF0aW9uIG9mIFBhcmFtU3BlY2lmaWNhdGlvbiBpc1xuICogdXAgdG8gdGhlIGNvbnRyYWN0LlxuICpcbiAqIFRoZSBjb250cmFjdEdvdmVybm9yIGNyZWF0b3JGYWNldCBpbmNsdWRlcyBgdm90ZU9uUGFyYW1DaGFuZ2VzYCxcbiAqIGB2b3RlT25GaWx0ZXJgLCBhbmQgYHZvdGVPbkFwaUludm9jYXRpb25gLiBgdm90ZU9uUGFyYW1DaGFuZ2VzYCBpcyB1c2VkIHRvXG4gKiBjcmVhdGUgcXVlc3Rpb25zIHRoYXQgd2lsbCBhdXRvbWF0aWNhbGx5IHVwZGF0ZSBjb250cmFjdCBwYXJhbWV0ZXJzIGlmXG4gKiBwYXNzZWQuIGB2b3RlT25GaWx0ZXJgIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBxdWVzdGlvbnMgdGhhdCB3aWxsIHByZXZlbnQgdGhlXG4gKiBleGVyY2lzZSBvZiBjZXJ0YWluIGludml0YXRpb25zIGlmIHBhc3NlZC4gYHZvdGVPbkFwaUludm9jYXRpb25gIGNyZWF0ZXNcbiAqIHF1ZXN0aW9ucyB0aGF0IHdpbGwgaW52b2tlIHByZS1kZWZpbmVkIEFQSXMgaW4gdGhlIGNvbnRyYWN0LlxuICpcbiAqIFRoaXMgZmFjZXQgd2lsbCB1c3VhbGx5IGJlIGNsb3NlbHkgaGVsZC4gVGhlIGNyZWF0b3JGYWNldCBjYW4gYWxzbyBiZSB1c2VkIHRvXG4gKiByZXRyaWV2ZSB0aGUgZ292ZXJuZWQgaW5zdGFuY2UsIHB1YmxpY0ZhY2V0LCBhbmQgaXRzIGNyZWF0b3JGYWNldCB3aXRoXG4gKiB0aGUgdm90ZU9uKigpIG1ldGhvZHMgb21pdHRlZC5cbiAqXG4gKiBUaGUgZ292ZXJuZWQgY29udHJhY3QncyB0ZXJtcyBpbmNsdWRlIHRoZSBpbnN0YW5jZSBvZiB0aGlzIChnb3Zlcm5pbmcpXG4gKiBjb250cmFjdCAoYXMgZWxlY3Rpb25NYW5hZ2VyKSBzbyBjbGllbnRzIHdpbGwgYmUgYWJsZSB0byBsb29rIHVwIHRoZSBzdGF0ZVxuICogb2YgdGhlIGdvdmVybmVkIHBhcmFtZXRlcnMuXG4gKlxuICogdGVtcGxhdGUge3t9fSBQRiBQdWJsaWMgZmFjZXQgb2YgZ292ZXJuZWRcbiAqIHRlbXBsYXRlIHtDb250cmFjdFBvd2VyZnVsQ3JlYXRvckZhY2V0fSBDRiBDcmVhdG9yIGZhY2V0IG9mIGdvdmVybmVkXG4gKiB0eXBlIHtDb250cmFjdFN0YXJ0Rm48XG4gKiBHb3Zlcm5vclB1YmxpYyxcbiAqIEdvdmVybm9yQ3JlYXRvckZhY2V0PFBGLENGPixcbiAqIHtcbiAqICAgdGltZXI6IFRpbWVyU2VydmljZSxcbiAqICAgZ292ZXJuZWRDb250cmFjdEluc3RhbGxhdGlvbjogSW5zdGFsbGF0aW9uPENGPixcbiAqICAgZ292ZXJuZWQ6IHtcbiAqICAgICBpc3N1ZXJLZXl3b3JkUmVjb3JkOiBJc3N1ZXJLZXl3b3JkUmVjb3JkLFxuICogICAgIHRlcm1zOiB7Z292ZXJuZWRQYXJhbXM6IHtbQ09OVFJBQ1RfRUxFQ1RPUkFURV06IEludml0YXRpb25QYXJhbX19LFxuICogICB9XG4gKiB9Pn1cbiAqL1xuXG4vKipcbiAqIFN0YXJ0IGFuIGluc3RhbmNlIG9mIGEgZ292ZXJub3IsIGdvdmVybmluZyBhIFwiZ292ZXJuZWRcIiBjb250cmFjdCBzcGVjaWZpZWQgaW4gdGVybXMuXG4gKlxuICogQHRlbXBsYXRlIHtHb3Zlcm5hYmxlU3RhcnRGbn0gU0YgU3RhcnQgZnVuY3Rpb24gb2YgZ292ZXJuZWQgY29udHJhY3RcbiAqIEBwYXJhbSB7WkNGPHtcbiAqICAgdGltZXI6IFRpbWVyU2VydmljZSxcbiAqICAgZ292ZXJuZWRDb250cmFjdEluc3RhbGxhdGlvbjogSW5zdGFsbGF0aW9uPFNGPixcbiAqICAgZ292ZXJuZWQ6IHtcbiAqICAgICBpc3N1ZXJLZXl3b3JkUmVjb3JkOiBJc3N1ZXJLZXl3b3JkUmVjb3JkLFxuICogICAgIHRlcm1zOiB7Z292ZXJuZWRQYXJhbXM6IHtbQ09OVFJBQ1RfRUxFQ1RPUkFURV06IEludml0YXRpb25QYXJhbX19LFxuICogICAgIGxhYmVsPzogc3RyaW5nLFxuICogICB9XG4gKiB9Pn0gemNmXG4gKiBAcGFyYW0ge3tcbiAqICAgZ292ZXJuZWQ6IFJlY29yZDxzdHJpbmcsIHVua25vd24+XG4gKiB9fSBwcml2YXRlQXJnc1xuICogQHJldHVybnMge1Byb21pc2U8e1xuICogICBjcmVhdG9yRmFjZXQ6IEdvdmVybm9yQ3JlYXRvckZhY2V0PFNGPixcbiAqICAgcHVibGljRmFjZXQ6IEdvdmVybm9yUHVibGljLFxuICogfT59XG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqL1xuICAgICAgIGNvbnN0IHN0YXJ0ID0gYXN5bmMgKHpjZiwgcHJpdmF0ZUFyZ3MsIGJhZ2dhZ2UpID0+IHtcbiAgdHJhY2UoJ3N0YXJ0Jyk7XG4gIGNvbnN0IHpvZSA9IHpjZi5nZXRab2VTZXJ2aWNlKCk7XG4gIHRyYWNlKCdnZXRUZXJtcycsIHpjZi5nZXRUZXJtcygpKTtcbiAgY29uc3Qge1xuICAgIHRpbWVyLFxuICAgIGdvdmVybmVkQ29udHJhY3RJbnN0YWxsYXRpb24sXG4gICAgZ292ZXJuZWQ6IHtcbiAgICAgIGlzc3VlcktleXdvcmRSZWNvcmQ6IGdvdmVybmVkSXNzdWVyS2V5d29yZFJlY29yZCxcbiAgICAgIHRlcm1zOiBjb250cmFjdFRlcm1zLFxuICAgICAgbGFiZWw6IGdvdmVybmVkQ29udHJhY3RMYWJlbCxcbiAgICB9LFxuICB9ID0gemNmLmdldFRlcm1zKCk7XG4gIHRyYWNlKCdjb250cmFjdFRlcm1zJywgY29udHJhY3RUZXJtcyk7XG4gIGNvbnRyYWN0VGVybXMuZ292ZXJuZWRQYXJhbXNbQ09OVFJBQ1RfRUxFQ1RPUkFURV0gfHxcbiAgICBGYWlsYENvbnRyYWN0IG11c3QgZGVjbGFyZSAke0NPTlRSQUNUX0VMRUNUT1JBVEV9IGFzIGEgZ292ZXJuZWQgcGFyYW1ldGVyYDtcblxuICBjb25zdCBtYWtlQ29udHJhY3RHb3Zlcm5vcktpdCA9IHByZXBhcmVDb250cmFjdEdvdmVybm9yS2l0KGJhZ2dhZ2UsIHtcbiAgICB0aW1lcixcbiAgICB6b2UsXG4gIH0pO1xuXG4gIHRyYWNlKCdhd2FpdGluZyBwcm92aWRlU2luZ2xldG9uKCknKTtcbiAgY29uc3QgZ292ZXJub3JLaXQgPSBhd2FpdCBwcm92aWRlU2luZ2xldG9uKFxuICAgIGJhZ2dhZ2UsXG4gICAgJ2NvbnRyYWN0R292ZXJub3JLaXQnLFxuICAgIGFzeW5jICgpID0+IHtcbiAgICAgIGNvbnN0IGF1Z21lbnRlZFRlcm1zID0gaGFyZGVuKHtcbiAgICAgICAgLi4uY29udHJhY3RUZXJtcyxcbiAgICAgICAgZWxlY3Rpb25NYW5hZ2VyOiB6Y2YuZ2V0SW5zdGFuY2UoKSxcbiAgICAgIH0pO1xuXG4gICAgICB0cmFjZSgnc3RhcnRpbmcgZ292ZXJuZWRDb250cmFjdEluc3RhbGxhdGlvbiBvZicsIGdvdmVybmVkQ29udHJhY3RMYWJlbCk7XG4gICAgICBjb25zdCBzdGFydGVkSW5zdGFuY2VLaXQgPSBhd2FpdCBFKHpvZSkuc3RhcnRJbnN0YW5jZShcbiAgICAgICAgZ292ZXJuZWRDb250cmFjdEluc3RhbGxhdGlvbixcbiAgICAgICAgZ292ZXJuZWRJc3N1ZXJLZXl3b3JkUmVjb3JkLFxuXG4gICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgWFhYIGdvdmVybmFuY2UgdHlwZXMgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy83MTc4Ki9cbiAgICAgICAgYXVnbWVudGVkVGVybXMsXG4gICAgICAgIHByaXZhdGVBcmdzLmdvdmVybmVkLFxuICAgICAgICBnb3Zlcm5lZENvbnRyYWN0TGFiZWwsXG4gICAgICApO1xuICAgICAgdHJhY2UoJ2F3YWl0aW5nIHJlbW90ZSBsaW1pdGVkQ3JlYXRvckZhY2V0Jyk7XG4gICAgICBjb25zdCBsaW1pdGVkQ3JlYXRvckZhY2V0ID0gYXdhaXQgRShcbiAgICAgICAgc3RhcnRlZEluc3RhbmNlS2l0LmNyZWF0b3JGYWNldCxcbiAgICAgICkuZ2V0TGltaXRlZENyZWF0b3JGYWNldCgpO1xuXG4gICAgICByZXR1cm4gbWFrZUNvbnRyYWN0R292ZXJub3JLaXQoc3RhcnRlZEluc3RhbmNlS2l0LCBsaW1pdGVkQ3JlYXRvckZhY2V0KTtcbiAgICB9LFxuICApO1xuXG4gIC8qIEF0IHRoaXMgcG9pbnQsIHNvbWUgcmVtb3RlIGNhbGxzIHN0aWxsIG5lZWQgdG8gYmUgbWFkZSB3aXRoaW4gdGhlIGdvdmVybm9yS2l0LiovXG4gIC8qIFNwZWNpZmljYWxseSwgdG8gdGhlIHZhdCBvZiB0aGUgZ292ZXJuZWQgY29udHJhY3QgZm9yIGl0cyBBUEkgbmFtZXMuIFRoZSBleG8qL1xuICAvKiBkZWZlcnMgdGhhdCB1bnRpbCBBUEkgZ292ZXJuYW5jZSBpcyByZXF1ZXN0ZWQgdG8gYmUgaW52b2tlZCBvciB2YWxpZGF0ZWQuKi9cblxuICB0cmFjZSgnc3RhcnQgY29tcGxldGUnKTtcblxuICAvKiBDUlVDSUFMOiBvbmx5IGNvbnRyYWN0R292ZXJub3Igc2hvdWxkIGdldCB0aGUgYWJpbGl0eSB0byB1cGRhdGUgcGFyYW1zKi9cbiAgcmV0dXJuIHsgY3JlYXRvckZhY2V0OiBnb3Zlcm5vcktpdC5jcmVhdG9yLCBwdWJsaWNGYWNldDogZ292ZXJub3JLaXQucHVibGljIH07XG59OyRozY9fb25jZS5zdGFydChzdGFydCk7XG5oYXJkZW4oc3RhcnQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWV0YSI6WyJtZXRhIl0sInZhbGlkYXRlUXVlc3Rpb25EZXRhaWxzIjpbInZhbGlkYXRlUXVlc3Rpb25EZXRhaWxzIl0sInZhbGlkYXRlUXVlc3Rpb25Gcm9tQ291bnRlciI6WyJ2YWxpZGF0ZVF1ZXN0aW9uRnJvbUNvdW50ZXIiXSwic3RhcnQiOlsic3RhcnQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAnW3DHeUuAADlLgAANQAAAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9jb250cmFjdEdvdmVybm9yS2l0LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBhZ29yaWMvem9lL3NyYy90eXBlR3VhcmRzLmpzIiwiQGFnb3JpYy90aW1lIiwiLi9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuQXBpLmpzIiwiLi9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuRmlsdGVyLmpzIiwiLi9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuUGFyYW0uanMiLCIuL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6WyJwcmVwYXJlQ29udHJhY3RHb3Zlcm5vcktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsVW5ndWFyZGVkSGVscGVySSxtYWtlVHJhY2VyLE0scHJlcGFyZUV4b0NsYXNzS2l0LEUsSW52aXRhdGlvblNoYXBlLEluc3RhbmNlSGFuZGxlU2hhcGUsSW5zdGFsbGF0aW9uU2hhcGUsVGltZXN0YW1wU2hhcGUsc2V0dXBBcGlHb3Zlcm5hbmNlLHNldHVwRmlsdGVyR292ZXJuYW5jZSxDT05UUkFDVF9FTEVDVE9SQVRFLHNldHVwUGFyYW1Hb3Zlcm5hbmNlLENsb3NpbmdSdWxlU2hhcGUsUGFyYW1DaGFuZ2VzU3BlY1NoYXBlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcIlVuZ3VhcmRlZEhlbHBlcklcIixbJGjNj19hID0+IChVbmd1YXJkZWRIZWxwZXJJID0gJGjNj19hKV1dLFtcIm1ha2VUcmFjZXJcIixbJGjNj19hID0+IChtYWtlVHJhY2VyID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wicHJlcGFyZUV4b0NsYXNzS2l0XCIsWyRozY9fYSA9PiAocHJlcGFyZUV4b0NsYXNzS2l0ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3pvZS9zcmMvdHlwZUd1YXJkcy5qc1wiLCBbW1wiSW52aXRhdGlvblNoYXBlXCIsWyRozY9fYSA9PiAoSW52aXRhdGlvblNoYXBlID0gJGjNj19hKV1dLFtcIkluc3RhbmNlSGFuZGxlU2hhcGVcIixbJGjNj19hID0+IChJbnN0YW5jZUhhbmRsZVNoYXBlID0gJGjNj19hKV1dLFtcIkluc3RhbGxhdGlvblNoYXBlXCIsWyRozY9fYSA9PiAoSW5zdGFsbGF0aW9uU2hhcGUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3RpbWVcIiwgW1tcIlRpbWVzdGFtcFNoYXBlXCIsWyRozY9fYSA9PiAoVGltZXN0YW1wU2hhcGUgPSAkaM2PX2EpXV1dXSxbXCIuL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5BcGkuanNcIiwgW1tcInNldHVwQXBpR292ZXJuYW5jZVwiLFskaM2PX2EgPT4gKHNldHVwQXBpR292ZXJuYW5jZSA9ICRozY9fYSldXV1dLFtcIi4vY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVybkZpbHRlci5qc1wiLCBbW1wic2V0dXBGaWx0ZXJHb3Zlcm5hbmNlXCIsWyRozY9fYSA9PiAoc2V0dXBGaWx0ZXJHb3Zlcm5hbmNlID0gJGjNj19hKV1dXV0sW1wiLi9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuUGFyYW0uanNcIiwgW1tcIkNPTlRSQUNUX0VMRUNUT1JBVEVcIixbJGjNj19hID0+IChDT05UUkFDVF9FTEVDVE9SQVRFID0gJGjNj19hKV1dLFtcInNldHVwUGFyYW1Hb3Zlcm5hbmNlXCIsWyRozY9fYSA9PiAoc2V0dXBQYXJhbUdvdmVybmFuY2UgPSAkaM2PX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIkNsb3NpbmdSdWxlU2hhcGVcIixbJGjNj19hID0+IChDbG9zaW5nUnVsZVNoYXBlID0gJGjNj19hKV1dLFtcIlBhcmFtQ2hhbmdlc1NwZWNTaGFwZVwiLFskaM2PX2EgPT4gKFBhcmFtQ2hhbmdlc1NwZWNTaGFwZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtFUmV0dXJufSBmcm9tICdAZW5kby9mYXInO1xuICogQGltcG9ydCB7Q29udHJhY3RNZXRhLCBJbnN0YWxsYXRpb24sIEluc3RhbmNlLCBJbnZpdGF0aW9uLCBaQ0YsIFpvZVNlcnZpY2V9IGZyb20gJ0BhZ29yaWMvem9lJztcbiAqIEBpbXBvcnQge0Nsb3NpbmdSdWxlLCBHb3Zlcm5hYmxlU3RhcnRGbiwgTGltaXRlZENGLCBQb3NlckZhY2V0LCBWb3RlT25BcGlJbnZvY2F0aW9uLCBWb3RlT25PZmZlckZpbHRlciwgVm90ZU9uUGFyYW1DaGFuZ2VzfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge0JhZ2dhZ2V9IGZyb20gJ0BhZ29yaWMvdmF0LWRhdGEnO1xuICogQGltcG9ydCB7VGltZXJTZXJ2aWNlfSBmcm9tICdAYWdvcmljL3RpbWUnO1xuICogQGltcG9ydCB7U3RhcnRlZEluc3RhbmNlS2l0fSBmcm9tICdAYWdvcmljL3pvZS9zcmMvem9lU2VydmljZS91dGlscy5qcyc7XG4gKiBAaW1wb3J0IHtUeXBlZFBhcmFtTWFuYWdlcn0gZnJvbSAnLi9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXIuanMnO1xuICogQGltcG9ydCB7RVJlZn0gZnJvbSAnQGFnb3JpYy92b3cnO1xuICovXG5cbmNvbnN0IHRyYWNlID0gbWFrZVRyYWNlcignQ0dLJywgZmFsc2UpO1xuXG5jb25zdCBDb250cmFjdEdvdmVybm9yS2l0SSA9IHtcbiAgaGVscGVyOiBVbmd1YXJkZWRIZWxwZXJJLFxuICBjcmVhdG9yOiBNLmludGVyZmFjZSgnQ29udHJhY3QgR292ZXJub3IgS2l0IGNyZWF0b3InLCB7XG4gICAgcmVwbGFjZUVsZWN0b3JhdGU6IE0uY2FsbChJbnZpdGF0aW9uU2hhcGUpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICAgIHZvdGVPblBhcmFtQ2hhbmdlczogTS5jYWxsKFxuICAgICAgSW5zdGFsbGF0aW9uU2hhcGUsXG4gICAgICBUaW1lc3RhbXBTaGFwZSxcbiAgICAgIFBhcmFtQ2hhbmdlc1NwZWNTaGFwZSxcbiAgICApLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICAgIHZvdGVPbkFwaUludm9jYXRpb246IE0uY2FsbChcbiAgICAgIE0uc3RyaW5nKCksXG4gICAgICBNLmFycmF5T2YoTS5hbnkoKSksXG4gICAgICBJbnN0YWxsYXRpb25TaGFwZSxcbiAgICAgIFRpbWVzdGFtcFNoYXBlLFxuICAgICkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgdm90ZU9uT2ZmZXJGaWx0ZXI6IE0uY2FsbChcbiAgICAgIEluc3RhbGxhdGlvblNoYXBlLFxuICAgICAgVGltZXN0YW1wU2hhcGUsXG4gICAgICBNLmFycmF5T2YoTS5zdHJpbmcoKSksXG4gICAgKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgICBnZXRDcmVhdG9yRmFjZXQ6IE0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoJ0VsZWN0b3JhdGVDcmVhdG9yJykpLFxuICAgIGdldEFkbWluRmFjZXQ6IE0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoJ0VsZWN0b3JhdGVBZG1pbicpKSxcbiAgICBnZXRJbnN0YW5jZTogTS5jYWxsKCkucmV0dXJucyhJbnN0YW5jZUhhbmRsZVNoYXBlKSxcbiAgICBnZXRQdWJsaWNGYWNldDogTS5jYWxsKCkucmV0dXJucyhNLnJlbW90YWJsZSgnRWxlY3RvcmF0ZVB1YmxpYycpKSxcbiAgfSksXG4gIHB1YmxpYzogTS5pbnRlcmZhY2UoJ0NvbnRyYWN0IEdvdmVybm9yIEtpdCBwdWJsaWMnLCB7XG4gICAgZ2V0RWxlY3RvcmF0ZTogTS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoLyogSW5zdGFuY2UgKi8pKSxcbiAgICBnZXRHb3Zlcm5lZENvbnRyYWN0OiBNLmNhbGwoKS5yZXR1cm5zKEluc3RhbmNlSGFuZGxlU2hhcGUpLFxuICAgIHZhbGlkYXRlVm90ZUNvdW50ZXI6IE0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgICB2YWxpZGF0ZUVsZWN0b3JhdGU6IE0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgICB2YWxpZGF0ZVRpbWVyOiBNLmNhbGwoQ2xvc2luZ1J1bGVTaGFwZSkucmV0dXJucygpLFxuICB9KSxcbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHt7XG4gKiAgIHRpbWVyOiBUaW1lclNlcnZpY2UsXG4gKiAgIHpvZTogRVJlZjxab2VTZXJ2aWNlPixcbiAqIH19IHBvd2Vyc1xuICovXG4gICAgICAgY29uc3QgcHJlcGFyZUNvbnRyYWN0R292ZXJub3JLaXQgPSAoYmFnZ2FnZSwgcG93ZXJzKSA9PiB7XG4gIC8qIFRoZXNlIGFyZSBwcm9kdWNlZCBqdXN0LWluLXRpbWUgYmVjYXVzZSBBUEkgZ292ZXJuYW5jZSBtYWtlcyByZW1vdGUgY2FsbHMsIHdoaWNoIHByZXZlbnQgdmF0IHJlc3RhcnQuKi9cbiAgLyogVGhlIG90aGVyIHR3byBjb3VsZCBoYXBwZW4gZHVyaW5nIHJlc3RhcnQgYnV0IHRoZXknZCBuZWVkIHRvIGhhdmUgYSBzZXBhcmF0ZSBob29rLCBzbyBmb3IgY29uc2lzdGVuY3kqL1xuICAvKiB0aGV5J3JlIGFsbCBsYXp5LiovXG4gIC8qKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2Ygc2V0dXBGaWx0ZXJHb3Zlcm5hbmNlPn0gKi9cbiAgbGV0IGZpbHRlckdvdmVybmFuY2U7XG4gIC8qKiBAdHlwZSB7UmV0dXJuVHlwZTx0eXBlb2Ygc2V0dXBQYXJhbUdvdmVybmFuY2U+fSAqL1xuICBsZXQgcGFyYW1Hb3Zlcm5hbmNlO1xuICAvKiogQHR5cGUge0VSZXR1cm48dHlwZW9mIHNldHVwQXBpR292ZXJuYW5jZT59ICovXG4gIGxldCBhcGlHb3Zlcm5hbmNlO1xuXG4gIC8qKiBAdHlwZSB7YW55fSAqL1xuICBsZXQgcG9zZXJGYWNldDtcblxuICBjb25zdCBtYWtlQ29udHJhY3RHb3Zlcm5vcktpdCA9IHByZXBhcmVFeG9DbGFzc0tpdChcbiAgICBiYWdnYWdlLFxuICAgICdDb250cmFjdEdvdmVybm9yS2l0JyxcbiAgICBDb250cmFjdEdvdmVybm9yS2l0SSxcbiAgICAvKipcbiAqIEBwYXJhbSB7U3RhcnRlZEluc3RhbmNlS2l0PEdvdmVybmFibGVTdGFydEZuPn0gc3RhcnRlZEluc3RhbmNlS2l0XG4gKiBAcGFyYW0ge0xpbWl0ZWRDRjx1bmtub3duPn0gbGltaXRlZENyZWF0b3JGYWNldFxuICovXG4gICAgKHN0YXJ0ZWRJbnN0YW5jZUtpdCwgbGltaXRlZENyZWF0b3JGYWNldCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4uc3RhcnRlZEluc3RhbmNlS2l0LFxuICAgICAgICBsaW1pdGVkQ3JlYXRvckZhY2V0LFxuICAgICAgICBjdXJyZW50SW52aXRhdGlvbjogLyoqIEB0eXBlIHtJbnZpdGF0aW9uPHVua25vd24sIG5ldmVyPj99ICovIChudWxsKSxcbiAgICAgIH07XG4gICAgfSxcbiAgICB7XG4gICAgICBoZWxwZXI6IHtcbiAgICAgICAgLyoqIEB0eXBlIHsoKSA9PiBQcm9taXNlPEluc3RhbmNlPn0gKi9cbiAgICAgICAgYXN5bmMgZ2V0RWxlY3RvcmF0ZUluc3RhbmNlKCkge1xuICAgICAgICAgIGNvbnN0IHsgcHVibGljRmFjZXQgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgICAgY29uc3QgaW52aXRhdGlvbkFtb3VudCA9XG4gICAgICAgICAgICBhd2FpdCBFKHB1YmxpY0ZhY2V0KS5nZXRJbnZpdGF0aW9uQW1vdW50KENPTlRSQUNUX0VMRUNUT1JBVEUpO1xuICAgICAgICAgIHJldHVybiBpbnZpdGF0aW9uQW1vdW50LnZhbHVlWzBdLmluc3RhbmNlO1xuICAgICAgICB9LFxuICAgICAgICAvKiogQHR5cGUgeygpID0+IFByb21pc2U8UG9zZXJGYWNldD59ICovXG4gICAgICAgIGFzeW5jIGdldFVwZGF0ZWRQb3NlckZhY2V0KCkge1xuICAgICAgICAgIGNvbnN0IHsgY3JlYXRvckZhY2V0IH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgIGNvbnN0IG5ld0ludml0YXRpb24gPSBhd2FpdCBFKFxuICAgICAgICAgICAgRShFKGNyZWF0b3JGYWNldCkuZ2V0UGFyYW1NZ3JSZXRyaWV2ZXIoKSkuZ2V0KHtcbiAgICAgICAgICAgICAga2V5OiAnZ292ZXJuZWRQYXJhbXMnLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgKS5nZXRJbnRlcm5hbFBhcmFtVmFsdWUoQ09OVFJBQ1RfRUxFQ1RPUkFURSk7XG5cbiAgICAgICAgICBpZiAobmV3SW52aXRhdGlvbiAhPT0gdGhpcy5zdGF0ZS5jdXJyZW50SW52aXRhdGlvbikge1xuICAgICAgICAgICAgcG9zZXJGYWNldCA9IEUoRShwb3dlcnMuem9lKS5vZmZlcihuZXdJbnZpdGF0aW9uKSkuZ2V0T2ZmZXJSZXN1bHQoKTtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUuY3VycmVudEludml0YXRpb24gPSBuZXdJbnZpdGF0aW9uO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcG9zZXJGYWNldDtcbiAgICAgICAgfSxcbiAgICAgICAgYXN5bmMgcHJvdmlkZUFwaUdvdmVybmFuY2UoKSB7XG4gICAgICAgICAgY29uc3QgeyB0aW1lciB9ID0gcG93ZXJzO1xuICAgICAgICAgIGNvbnN0IHsgY3JlYXRvckZhY2V0IH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgIGF3YWl0IG51bGw7XG4gICAgICAgICAgaWYgKCFhcGlHb3Zlcm5hbmNlKSB7XG4gICAgICAgICAgICB0cmFjZSgnYXdhaXRpbmcgZ292ZXJuZWQgQVBJIGRlcGVuZGVuY2llcycpO1xuICAgICAgICAgICAgY29uc3QgZ292ZXJuZWROYW1lcyA9IGF3YWl0IEUoY3JlYXRvckZhY2V0KS5nZXRHb3Zlcm5lZEFwaU5hbWVzKCk7XG4gICAgICAgICAgICB0cmFjZSgnc2V0dXBBcGlHb3Zlcm5hbmNlJyk7XG4gICAgICAgICAgICBhcGlHb3Zlcm5hbmNlID0gZ292ZXJuZWROYW1lcy5sZW5ndGhcbiAgICAgICAgICAgICAgPyBzZXR1cEFwaUdvdmVybmFuY2UoXG4gICAgICAgICAgICAgICAgICAoKSA9PiBFKGNyZWF0b3JGYWNldCkuZ2V0R292ZXJuZWRBcGlzKCksXG4gICAgICAgICAgICAgICAgICAoKSA9PiBFKGNyZWF0b3JGYWNldCkuZ2V0R292ZXJuZWRBcGlOYW1lcygpLFxuICAgICAgICAgICAgICAgICAgdGltZXIsXG4gICAgICAgICAgICAgICAgICAoKSA9PiB0aGlzLmZhY2V0cy5oZWxwZXIuZ2V0VXBkYXRlZFBvc2VyRmFjZXQoKSxcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgLyogaWYgd2UgYXJlbid0IGdvdmVybmluZyBBUElzLCB2b3RlT25BcGlJbnZvY2F0aW9uIHNob3VsZG4ndCBiZSBjYWxsZWQqL1xuICAgICAgICAgICAgICAgICAgdm90ZU9uQXBpSW52b2NhdGlvbjogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignYXBpIGdvdmVybmFuY2Ugbm90IGNvbmZpZ3VyZWQnKTtcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICBjcmVhdGVkUXVlc3Rpb246ICgpID0+IGZhbHNlLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBhcGlHb3Zlcm5hbmNlO1xuICAgICAgICB9LFxuICAgICAgICBwcm92aWRlRmlsdGVyR292ZXJuYW5jZSgpIHtcbiAgICAgICAgICBpZiAoIWZpbHRlckdvdmVybmFuY2UpIHtcbiAgICAgICAgICAgIGNvbnN0IHsgdGltZXIgfSA9IHBvd2VycztcbiAgICAgICAgICAgIGNvbnN0IHsgY3JlYXRvckZhY2V0IH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgICAgZmlsdGVyR292ZXJuYW5jZSA9IHNldHVwRmlsdGVyR292ZXJuYW5jZShcbiAgICAgICAgICAgICAgdGltZXIsXG4gICAgICAgICAgICAgICgpID0+IHRoaXMuZmFjZXRzLmhlbHBlci5nZXRVcGRhdGVkUG9zZXJGYWNldCgpLFxuICAgICAgICAgICAgICBjcmVhdG9yRmFjZXQsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmlsdGVyR292ZXJuYW5jZTtcbiAgICAgICAgfSxcbiAgICAgICAgcHJvdmlkZVBhcmFtR292ZXJuYW5jZSgpIHtcbiAgICAgICAgICBpZiAoIXBhcmFtR292ZXJuYW5jZSkge1xuICAgICAgICAgICAgY29uc3QgeyB0aW1lciB9ID0gcG93ZXJzO1xuICAgICAgICAgICAgY29uc3QgeyBjcmVhdG9yRmFjZXQsIGluc3RhbmNlIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgICAgcGFyYW1Hb3Zlcm5hbmNlID0gc2V0dXBQYXJhbUdvdmVybmFuY2UoXG4gICAgICAgICAgICAgICgpID0+IEUoY3JlYXRvckZhY2V0KS5nZXRQYXJhbU1nclJldHJpZXZlcigpLFxuICAgICAgICAgICAgICBpbnN0YW5jZSxcbiAgICAgICAgICAgICAgdGltZXIsXG4gICAgICAgICAgICAgICgpID0+IHRoaXMuZmFjZXRzLmhlbHBlci5nZXRVcGRhdGVkUG9zZXJGYWNldCgpLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHBhcmFtR292ZXJuYW5jZTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBjcmVhdG9yOiB7XG4gICAgICAgIC8qKlxuICogQHBhcmFtIHtJbnZpdGF0aW9ufSBwb3Nlckludml0YXRpb25cbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG4gICAgICAgIHJlcGxhY2VFbGVjdG9yYXRlKHBvc2VySW52aXRhdGlvbikge1xuICAgICAgICAgIGNvbnN0IHsgY3JlYXRvckZhY2V0IH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgIC8qKiBAdHlwZSB7UHJvbWlzZTxUeXBlZFBhcmFtTWFuYWdlcjx7J0VsZWN0b3JhdGUnOiAnaW52aXRhdGlvbid9Pj59ICovXG5cbiAgICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuICAgICAgICAgIGNvbnN0IHBhcmFtTWdyID0gRShFKGNyZWF0b3JGYWNldCkuZ2V0UGFyYW1NZ3JSZXRyaWV2ZXIoKSkuZ2V0KHtcbiAgICAgICAgICAgIGtleTogJ2dvdmVybmVkUGFyYW1zJyxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIC8qIFRPRE8gdXNlIHVwZGF0ZUVsZWN0b3JhdGUqL1xuICAgICAgICAgIHJldHVybiBFKHBhcmFtTWdyKS51cGRhdGVQYXJhbXMoe1xuICAgICAgICAgICAgRWxlY3RvcmF0ZTogcG9zZXJJbnZpdGF0aW9uLFxuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICAvKiogQHR5cGUge1ZvdGVPblBhcmFtQ2hhbmdlc30gKi9cbiAgICAgICAgdm90ZU9uUGFyYW1DaGFuZ2VzKHZvdGVDb3VudGVySW5zdGFsbGF0aW9uLCBkZWFkbGluZSwgcGFyYW1TcGVjKSB7XG4gICAgICAgICAgY29uc3QgeyBoZWxwZXIgfSA9IHRoaXMuZmFjZXRzO1xuICAgICAgICAgIHJldHVybiBoZWxwZXJcbiAgICAgICAgICAgIC5wcm92aWRlUGFyYW1Hb3Zlcm5hbmNlKClcbiAgICAgICAgICAgIC52b3RlT25QYXJhbUNoYW5nZXModm90ZUNvdW50ZXJJbnN0YWxsYXRpb24sIGRlYWRsaW5lLCBwYXJhbVNwZWMpO1xuICAgICAgICB9LFxuICAgICAgICAvKiogQHR5cGUge1ZvdGVPbkFwaUludm9jYXRpb259ICovXG4gICAgICAgIHZvdGVPbkFwaUludm9jYXRpb24oXG4gICAgICAgICAgYXBpTWV0aG9kTmFtZSxcbiAgICAgICAgICBtZXRob2RBcmdzLFxuICAgICAgICAgIHZvdGVDb3VudGVySW5zdGFsbGF0aW9uLFxuICAgICAgICAgIGRlYWRsaW5lLFxuICAgICAgICApIHtcbiAgICAgICAgICBjb25zdCB7IGhlbHBlciB9ID0gdGhpcy5mYWNldHM7XG4gICAgICAgICAgcmV0dXJuIEUoaGVscGVyLnByb3ZpZGVBcGlHb3Zlcm5hbmNlKCkpLnZvdGVPbkFwaUludm9jYXRpb24oXG4gICAgICAgICAgICBhcGlNZXRob2ROYW1lLFxuICAgICAgICAgICAgbWV0aG9kQXJncyxcbiAgICAgICAgICAgIHZvdGVDb3VudGVySW5zdGFsbGF0aW9uLFxuICAgICAgICAgICAgZGVhZGxpbmUsXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqIEB0eXBlIHtWb3RlT25PZmZlckZpbHRlcn0gKi9cbiAgICAgICAgdm90ZU9uT2ZmZXJGaWx0ZXIodm90ZUNvdW50ZXJJbnN0YWxsYXRpb24sIGRlYWRsaW5lLCBzdHJpbmdzKSB7XG4gICAgICAgICAgY29uc3QgeyBoZWxwZXIgfSA9IHRoaXMuZmFjZXRzO1xuICAgICAgICAgIHJldHVybiBoZWxwZXJcbiAgICAgICAgICAgIC5wcm92aWRlRmlsdGVyR292ZXJuYW5jZSgpXG4gICAgICAgICAgICAudm90ZU9uRmlsdGVyKHZvdGVDb3VudGVySW5zdGFsbGF0aW9uLCBkZWFkbGluZSwgc3RyaW5ncyk7XG4gICAgICAgIH0sXG4gICAgICAgIGdldENyZWF0b3JGYWNldCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5saW1pdGVkQ3JlYXRvckZhY2V0O1xuICAgICAgICB9LFxuICAgICAgICBnZXRBZG1pbkZhY2V0KCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnN0YXRlLmFkbWluRmFjZXQ7XG4gICAgICAgIH0sXG4gICAgICAgIGdldEluc3RhbmNlKCkge1xuICAgICAgICAgIHJldHVybiB0aGlzLnN0YXRlLmluc3RhbmNlO1xuICAgICAgICB9LFxuICAgICAgICBnZXRQdWJsaWNGYWNldCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5wdWJsaWNGYWNldDtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBwdWJsaWM6IHtcbiAgICAgICAgZ2V0RWxlY3RvcmF0ZSgpIHtcbiAgICAgICAgICBjb25zdCB7IGhlbHBlciB9ID0gdGhpcy5mYWNldHM7XG4gICAgICAgICAgcmV0dXJuIGhlbHBlci5nZXRFbGVjdG9yYXRlSW5zdGFuY2UoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0R292ZXJuZWRDb250cmFjdCgpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5zdGF0ZS5pbnN0YW5jZTtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqIEBwYXJhbSB7SW5zdGFuY2V9IGNvdW50ZXIgKi9cbiAgICAgICAgYXN5bmMgdmFsaWRhdGVWb3RlQ291bnRlcihjb3VudGVyKSB7XG4gICAgICAgICAgY29uc3QgeyBoZWxwZXIgfSA9IHRoaXMuZmFjZXRzO1xuICAgICAgICAgIGNvbnN0IHZhbGlkYXRvcnMgPSBbXG4gICAgICAgICAgICBFLmdldChoZWxwZXIucHJvdmlkZUFwaUdvdmVybmFuY2UoKSksXG4gICAgICAgICAgICBoZWxwZXIucHJvdmlkZUZpbHRlckdvdmVybmFuY2UoKSxcbiAgICAgICAgICAgIGhlbHBlci5wcm92aWRlUGFyYW1Hb3Zlcm5hbmNlKCksXG4gICAgICAgICAgXTtcbiAgICAgICAgICBjb25zdCBjaGVja3MgPSBhd2FpdCBQcm9taXNlLmFsbChcbiAgICAgICAgICAgIHZhbGlkYXRvcnMubWFwKHZhbGlkYXRlID0+IEUodmFsaWRhdGUuY3JlYXRlZFF1ZXN0aW9uKShjb3VudGVyKSksXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGNoZWNrcy5zb21lKEJvb2xlYW4pIHx8XG4gICAgICAgICAgICBGYWlsYFZvdGVDb3VudGVyIHdhcyBub3QgY3JlYXRlZCBieSB0aGlzIGNvbnRyYWN0R292ZXJub3JgO1xuICAgICAgICB9LFxuICAgICAgICAvKiogQHBhcmFtIHtJbnN0YW5jZX0gcmVnUCAqL1xuICAgICAgICB2YWxpZGF0ZUVsZWN0b3JhdGUocmVnUCkge1xuICAgICAgICAgIGNvbnN0IHsgaGVscGVyIH0gPSB0aGlzLmZhY2V0cztcbiAgICAgICAgICByZXR1cm4gRS53aGVuKHJlZ1AsIGFzeW5jIHJlZyA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbGVjdG9yYXRlSW5zdGFuY2UgPSBhd2FpdCBoZWxwZXIuZ2V0RWxlY3RvcmF0ZUluc3RhbmNlKCk7XG4gICAgICAgICAgICBhc3NlcnQoXG4gICAgICAgICAgICAgIHJlZyA9PT0gZWxlY3RvcmF0ZUluc3RhbmNlLFxuICAgICAgICAgICAgICBcIkVsZWN0b3JhdGUgZG9lc24ndCBtYXRjaCBteSBFbGVjdG9yYXRlXCIsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICAvKiogQHBhcmFtIHtDbG9zaW5nUnVsZX0gY2xvc2luZ1J1bGUgKi9cbiAgICAgICAgdmFsaWRhdGVUaW1lcihjbG9zaW5nUnVsZSkge1xuICAgICAgICAgIGFzc2VydChcbiAgICAgICAgICAgIGNsb3NpbmdSdWxlLnRpbWVyID09PSBwb3dlcnMudGltZXIsXG4gICAgICAgICAgICAnY2xvc2luZyBydWxlIG11c3QgdXNlIG15IHRpbWVyJyxcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICApO1xuXG4gIHJldHVybiBtYWtlQ29udHJhY3RHb3Zlcm5vcktpdDtcbn07XG5cbi8qKiBAdHlwZWRlZiB7RVJldHVybjxFUmV0dXJuPHR5cGVvZiBwcmVwYXJlQ29udHJhY3RHb3Zlcm5vcktpdD4+fSBDb250cmFjdEdvdmVybm9yS2l0ICovJGjNj19vbmNlLnByZXBhcmVDb250cmFjdEdvdmVybm9yS2l0KHByZXBhcmVDb250cmFjdEdvdmVybm9yS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InByZXBhcmVDb250cmFjdEdvdmVybm9yS2l0IjpbInByZXBhcmVDb250cmFjdEdvdmVybm9yS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOOx0ynhMQAA4TEAADAAAABAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29udHJhY3RIZWxwZXIuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanMiLCJAYWdvcmljL25vdGlmaWVyIiwiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvdmF0LWRhdGEiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy9lcnRwIiwiQGFnb3JpYy90aW1lIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIi4vY29udHJhY3RHb3Zlcm5hbmNlL3R5cGVkUGFyYW1NYW5hZ2VyLmpzIiwiLi90eXBlR3VhcmRzLmpzIiwiLi9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuUGFyYW0uanMiXSwiZXhwb3J0cyI6WyJHT1ZFUk5BTkNFX1NUT1JBR0VfS0VZIiwiaGFuZGxlUGFyYW1Hb3Zlcm5hbmNlIiwicHVibGljTWl4aW5BUEkiLCJ2YWxpZGF0ZUVsZWN0b3JhdGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLEZhcixnZXRNZXRob2ROYW1lcyxtYWtlU3RvcmVkUHVibGlzaGVyS2l0LG9iamVjdE1hcCxpZ25vcmVDb250ZXh0LHByZXBhcmVFeG8sTSxBbW91bnRTaGFwZSxCcmFuZFNoYXBlLFJlbGF0aXZlVGltZVJlY29yZFNoYXBlLFRpbWVzdGFtcFJlY29yZFNoYXBlLEUsbWFrZVBhcmFtTWFuYWdlckZyb21UZXJtcyxHb3Zlcm5vckZhY2V0U2hhcGUsQ09OVFJBQ1RfRUxFQ1RPUkFURTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzXCIsIFtbXCJnZXRNZXRob2ROYW1lc1wiLFskaM2PX2EgPT4gKGdldE1ldGhvZE5hbWVzID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wibWFrZVN0b3JlZFB1Ymxpc2hlcktpdFwiLFskaM2PX2EgPT4gKG1ha2VTdG9yZWRQdWJsaXNoZXJLaXQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJvYmplY3RNYXBcIixbJGjNj19hID0+IChvYmplY3RNYXAgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJpZ25vcmVDb250ZXh0XCIsWyRozY9fYSA9PiAoaWdub3JlQ29udGV4dCA9ICRozY9fYSldXSxbXCJwcmVwYXJlRXhvXCIsWyRozY9fYSA9PiAocHJlcGFyZUV4byA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRTaGFwZVwiLFskaM2PX2EgPT4gKEFtb3VudFNoYXBlID0gJGjNj19hKV1dLFtcIkJyYW5kU2hhcGVcIixbJGjNj19hID0+IChCcmFuZFNoYXBlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy90aW1lXCIsIFtbXCJSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZVwiLFskaM2PX2EgPT4gKFJlbGF0aXZlVGltZVJlY29yZFNoYXBlID0gJGjNj19hKV1dLFtcIlRpbWVzdGFtcFJlY29yZFNoYXBlXCIsWyRozY9fYSA9PiAoVGltZXN0YW1wUmVjb3JkU2hhcGUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIi4vY29udHJhY3RHb3Zlcm5hbmNlL3R5cGVkUGFyYW1NYW5hZ2VyLmpzXCIsIFtbXCJtYWtlUGFyYW1NYW5hZ2VyRnJvbVRlcm1zXCIsWyRozY9fYSA9PiAobWFrZVBhcmFtTWFuYWdlckZyb21UZXJtcyA9ICRozY9fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiR292ZXJub3JGYWNldFNoYXBlXCIsWyRozY9fYSA9PiAoR292ZXJub3JGYWNldFNoYXBlID0gJGjNj19hKV1dXV0sW1wiLi9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuUGFyYW0uanNcIiwgW1tcIkNPTlRSQUNUX0VMRUNUT1JBVEVcIixbJGjNj19hID0+IChDT05UUkFDVF9FTEVDVE9SQVRFID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtFUmVtb3RlfSBmcm9tICdAYWdvcmljL2ludGVybmFsJztcbiAqIEBpbXBvcnQge0VNYXJzaGFsbGVyfSBmcm9tICdAYWdvcmljL2ludGVybmFsL3NyYy9tYXJzaGFsL3dyYXAtbWFyc2hhbGxlci5qcyc7XG4gKiBAaW1wb3J0IHtDb250cmFjdE1ldGEsIEluc3RhbGxhdGlvbiwgSW5zdGFuY2UsIEludml0YXRpb24sIFpDRn0gZnJvbSAnQGFnb3JpYy96b2UnO1xuICogQGltcG9ydCB7Vm90ZUNvdW50ZXJDcmVhdG9yRmFjZXQsIFZvdGVDb3VudGVyUHVibGljRmFjZXQsIFF1ZXN0aW9uU3BlYywgT3V0Y29tZVJlY29yZCwgQWRkUXVlc3Rpb24sIEFkZFF1ZXN0aW9uUmV0dXJuLCBHb3Zlcm5hbmNlU3Vic2NyaXB0aW9uU3RhdGUsIEdvdmVybmFuY2VUZXJtcywgR292ZXJuZWRBcGlzLCBHb3Zlcm5lZENyZWF0b3JGYWNldCwgR292ZXJuZWRQdWJsaWNGYWNldH0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtCYWdnYWdlfSBmcm9tICdAYWdvcmljL3ZhdC1kYXRhJztcbiAqIEBpbXBvcnQge1R5cGVkUGFyYW1NYW5hZ2VyfSBmcm9tICcuL2NvbnRyYWN0R292ZXJuYW5jZS90eXBlZFBhcmFtTWFuYWdlci5qcyc7XG4gKiBAaW1wb3J0IHtQYXJhbVR5cGVzTWFwfSBmcm9tICcuL2NvbnRyYWN0R292ZXJuYW5jZS90eXBlZFBhcmFtTWFuYWdlci5qcyc7XG4gKiBAaW1wb3J0IHtGdW5jdGlvbnNQbHVzQ29udGV4dH0gZnJvbSAnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnO1xuICogQGltcG9ydCB7U3RvcmVkUHVibGlzaGVyS2l0fSBmcm9tICdAYWdvcmljL25vdGlmaWVyJztcbiAqIEBpbXBvcnQge1N0b3JhZ2VOb2RlfSBmcm9tICdAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzJztcbiAqL1xuXG4gICAgICAgY29uc3QgR09WRVJOQU5DRV9TVE9SQUdFX0tFWSA9ICdnb3Zlcm5hbmNlJzskaM2PX29uY2UuR09WRVJOQU5DRV9TVE9SQUdFX0tFWShHT1ZFUk5BTkNFX1NUT1JBR0VfS0VZKTtcblxuY29uc3QgcHVibGljTWl4aW5BUEkgPSBoYXJkZW4oe1xuICBnZXRTdWJzY3JpcHRpb246IE0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoJ1N0b3JlZFN1YnNjcmlwdGlvbicpKSxcbiAgZ2V0R292ZXJuZWRQYXJhbXM6IE0uY2FsbCgpLnJldHVybnMoTS5vcihNLnJlY29yZCgpLCBNLnByb21pc2UoKSkpLFxuICBnZXRBbW91bnQ6IE0uY2FsbCgpLnJldHVybnMoQW1vdW50U2hhcGUpLFxuICBnZXRCcmFuZDogTS5jYWxsKCkucmV0dXJucyhCcmFuZFNoYXBlKSxcbiAgZ2V0SW5zdGFuY2U6IE0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoJ0luc3RhbmNlJykpLFxuICBnZXRJbnN0YWxsYXRpb246IE0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoJ0luc3RhbGxhdGlvbicpKSxcbiAgZ2V0SW52aXRhdGlvbkFtb3VudDogTS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIGdldE5hdDogTS5jYWxsKCkucmV0dXJucyhNLmJpZ2ludCgpKSxcbiAgZ2V0UmF0aW86IE0uY2FsbCgpLnJldHVybnMoTS5yZWNvcmQoKSksXG4gIGdldFN0cmluZzogTS5jYWxsKCkucmV0dXJucyhNLnN0cmluZygpKSxcbiAgZ2V0VGltZXN0YW1wOiBNLmNhbGwoKS5yZXR1cm5zKFRpbWVzdGFtcFJlY29yZFNoYXBlKSxcbiAgZ2V0UmVsYXRpdmVUaW1lOiBNLmNhbGwoKS5yZXR1cm5zKFJlbGF0aXZlVGltZVJlY29yZFNoYXBlKSxcbiAgZ2V0VW5rbm93bjogTS5jYWxsKCkucmV0dXJucyhNLmFueSgpKSxcbn0pO1xuXG4vKipcbiAqIFZlcmlmeSB0aGF0IHRoZSBlbGVjdG9yYXRlIGlzIHJlcHJlc2VudGVkIGJ5IGEgbGl2ZSBpbnZpdGF0aW9uLlxuICpcbiAqIEBwYXJhbSB7WkNGPEdvdmVybmFuY2VUZXJtczx7fT4gJiB7fT59IHpjZlxuICogQHBhcmFtIHtUeXBlZFBhcmFtTWFuYWdlcjxhbnk+fSBwYXJhbU1hbmFnZXJcbiAqLyRozY9fb25jZS5wdWJsaWNNaXhpbkFQSShwdWJsaWNNaXhpbkFQSSk7XG4gICAgICAgY29uc3QgdmFsaWRhdGVFbGVjdG9yYXRlID0gKHpjZiwgcGFyYW1NYW5hZ2VyKSA9PiB7XG4gIGNvbnN0IGludml0YXRpb24gPSBwYXJhbU1hbmFnZXIuZ2V0SW50ZXJuYWxQYXJhbVZhbHVlKENPTlRSQUNUX0VMRUNUT1JBVEUpO1xuICByZXR1cm4gRS53aGVuKFxuICAgIEUoemNmLmdldEludml0YXRpb25Jc3N1ZXIoKSkuaXNMaXZlKGludml0YXRpb24pLFxuICAgIGlzTGl2ZSA9PiBpc0xpdmUgfHwgRmFpbGBFbGVjdG9yYXRlIGludml0YXRpb24gaXMgbm90IGxpdmUuYCxcbiAgKTtcbn07JGjNj19vbmNlLnZhbGlkYXRlRWxlY3RvcmF0ZSh2YWxpZGF0ZUVsZWN0b3JhdGUpO1xuaGFyZGVuKHZhbGlkYXRlRWxlY3RvcmF0ZSk7XG5cbi8qKlxuICogVXRpbGl0eSBmdW5jdGlvbiBmb3IgYG1ha2VQYXJhbUdvdmVybmFuY2VgLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UGFyYW1UeXBlc01hcH0gVFxuICogQHBhcmFtIHtaQ0Y8R292ZXJuYW5jZVRlcm1zPHt9PiAmIHt9Pn0gemNmXG4gKiBAcGFyYW0ge1R5cGVkUGFyYW1NYW5hZ2VyPFQ+fSBwYXJhbU1hbmFnZXJcbiAqL1xuY29uc3QgZmFjZXRIZWxwZXJzID0gKHpjZiwgcGFyYW1NYW5hZ2VyKSA9PiB7XG4gIC8qIHZhbGlkYXRlIGFzeW5jIHRvIHdhaXQgZm9yIHBhcmFtcyB0byBiZSBmaW5pc2hlZCovXG4gIC8qIFVOVElMIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDM0MyovXG4gIHZvaWQgdmFsaWRhdGVFbGVjdG9yYXRlKHpjZiwgcGFyYW1NYW5hZ2VyKTtcblxuICBjb25zdCB0eXBlZEFjY2Vzc29ycyA9IHtcbiAgICBnZXRBbW91bnQ6IHBhcmFtTWFuYWdlci5nZXRBbW91bnQsXG4gICAgZ2V0QnJhbmQ6IHBhcmFtTWFuYWdlci5nZXRCcmFuZCxcbiAgICBnZXRJbnN0YW5jZTogcGFyYW1NYW5hZ2VyLmdldEluc3RhbmNlLFxuICAgIGdldEluc3RhbGxhdGlvbjogcGFyYW1NYW5hZ2VyLmdldEluc3RhbGxhdGlvbixcbiAgICBnZXRJbnZpdGF0aW9uQW1vdW50OiBwYXJhbU1hbmFnZXIuZ2V0SW52aXRhdGlvbkFtb3VudCxcbiAgICBnZXROYXQ6IHBhcmFtTWFuYWdlci5nZXROYXQsXG4gICAgZ2V0UmF0aW86IHBhcmFtTWFuYWdlci5nZXRSYXRpbyxcbiAgICBnZXRTdHJpbmc6IHBhcmFtTWFuYWdlci5nZXRTdHJpbmcsXG4gICAgZ2V0VGltZXN0YW1wOiBwYXJhbU1hbmFnZXIuZ2V0VGltZXN0YW1wLFxuICAgIGdldFJlbGF0aXZlVGltZTogcGFyYW1NYW5hZ2VyLmdldFJlbGF0aXZlVGltZSxcbiAgICBnZXRVbmtub3duOiBwYXJhbU1hbmFnZXIuZ2V0VW5rbm93bixcbiAgfTtcblxuICBjb25zdCBjb21tb25QdWJsaWNNZXRob2RzID0ge1xuICAgIGdldFN1YnNjcmlwdGlvbjogKCkgPT4gcGFyYW1NYW5hZ2VyLmdldFN1YnNjcmlwdGlvbigpLFxuICAgIGdldEdvdmVybmVkUGFyYW1zOiAoKSA9PiBwYXJhbU1hbmFnZXIuZ2V0UGFyYW1zKCksXG4gIH07XG5cbiAgLyoqXG4gKiBBZGQgcmVxdWlyZWQgbWV0aG9kcyB0byBwdWJsaWNGYWNldFxuICpcbiAqIEB0ZW1wbGF0ZSB7e319IFBGIHB1YmxpYyBmYWNldFxuICogQHBhcmFtIHtQRn0gb3JpZ2luYWxQdWJsaWNGYWNldFxuICogQHJldHVybnMge0dvdmVybmVkUHVibGljRmFjZXQ8UEY+fVxuICovXG4gIGNvbnN0IGF1Z21lbnRQdWJsaWNGYWNldCA9IG9yaWdpbmFsUHVibGljRmFjZXQgPT4ge1xuICAgIHJldHVybiBGYXIoJ3B1YmxpY0ZhY2V0Jywge1xuICAgICAgLi4ub3JpZ2luYWxQdWJsaWNGYWNldCxcbiAgICAgIC4uLmNvbW1vblB1YmxpY01ldGhvZHMsXG4gICAgICAuLi50eXBlZEFjY2Vzc29ycyxcbiAgICB9KTtcbiAgfTtcblxuICAvKipcbiAqIEFkZCByZXF1aXJlZCBtZXRob2RzIHRvIHB1YmxpY0ZhY2V0LCBmb3IgYSB2aXJ0dWFsL2R1cmFibGUgY29udHJhY3RcbiAqXG4gKiBAcGFyYW0ge09QRn0gb3JpZ2luYWxQdWJsaWNGYWNldFxuICogQHRlbXBsYXRlIHt7fX0gT1BGXG4gKi9cbiAgY29uc3QgYXVnbWVudFZpcnR1YWxQdWJsaWNGYWNldCA9IG9yaWdpbmFsUHVibGljRmFjZXQgPT4ge1xuICAgIHJldHVybiBGYXIoJ3B1YmxpY0ZhY2V0Jywge1xuICAgICAgLi4ub3JpZ2luYWxQdWJsaWNGYWNldCxcbiAgICAgIC4uLmNvbW1vblB1YmxpY01ldGhvZHMsXG4gICAgICAuLi5vYmplY3RNYXAodHlwZWRBY2Nlc3NvcnMsIGlnbm9yZUNvbnRleHQpLFxuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICogQHRlbXBsYXRlIHt7fX0gQ0ZcbiAqIEBwYXJhbSB7Q0Z9IGxpbWl0ZWRDcmVhdG9yRmFjZXRcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgKC4uLmFueSkgPT4gdW5rbm93bj59IFtnb3Zlcm5lZEFwaXNdXG4gKiBAcmV0dXJucyB7R292ZXJuZWRDcmVhdG9yRmFjZXQ8Q0Y+fVxuICovXG4gIGNvbnN0IG1ha2VGYXJHb3Zlcm5vckZhY2V0ID0gKGxpbWl0ZWRDcmVhdG9yRmFjZXQsIGdvdmVybmVkQXBpcyA9IHt9KSA9PiB7XG4gICAgY29uc3QgZ292ZXJub3JGYWNldCA9IEZhcignZ292ZXJub3JGYWNldCcsIHtcbiAgICAgIGdldFBhcmFtTWdyUmV0cmlldmVyOiAoKSA9PlxuICAgICAgICBGYXIoJ3BhcmFtUmV0cmlldmVyJywgeyBnZXQ6ICgpID0+IHBhcmFtTWFuYWdlciB9KSxcbiAgICAgIGdldEludml0YXRpb246IG5hbWUgPT4gcGFyYW1NYW5hZ2VyLmdldEludGVybmFsUGFyYW1WYWx1ZShuYW1lKSxcbiAgICAgIGdldExpbWl0ZWRDcmVhdG9yRmFjZXQ6ICgpID0+IGxpbWl0ZWRDcmVhdG9yRmFjZXQsXG4gICAgICAvKiBUaGUgY29udHJhY3QgcHJvdmlkZXMgYSBmYWNldCB3aXRoIHRoZSBBUElzIHRoYXQgY2FuIGJlIGludm9rZWQgYnkqL1xuICAgICAgLyogZ292ZXJuYW5jZSovXG4gICAgICAvKiogQHR5cGUgeygpID0+IEdvdmVybmVkQXBpc30gKi9cbiAgICAgIGdldEdvdmVybmVkQXBpczogKCkgPT4gRmFyKCdnb3Zlcm5lZEFQSXMnLCBnb3Zlcm5lZEFwaXMpLFxuICAgICAgLyogVGhlIGZhY2V0IHJldHVybmVkIGJ5IGdldEdvdmVybmVkQXBpcyBpcyBGYXIsIHNvIHdlIGNhbid0IHNlZSB3aGF0Ki9cbiAgICAgIC8qIG1ldGhvZHMgaXQgaGFzLiBUaGVyZSdzIG5vIGNsZWFuIHdheSB0byBoYXZlIGNvbnRyYWN0cyBzcGVjaWZ5IHRoZSBBUElzKi9cbiAgICAgIC8qIHdpdGhvdXQgYWxzbyBzZXBhcmF0ZWx5IHByb3ZpZGluZyB0aGVpciBuYW1lcy4qL1xuICAgICAgZ2V0R292ZXJuZWRBcGlOYW1lczogKCkgPT4gT2JqZWN0LmtleXMoZ292ZXJuZWRBcGlzKSxcbiAgICAgIHNldE9mZmVyRmlsdGVyOiBzdHJpbmdzID0+IHpjZi5zZXRPZmZlckZpbHRlcihzdHJpbmdzKSxcbiAgICB9KTtcblxuICAgIC8qIGV4Y2x1c2l2ZWx5IGZvciBjb250cmFjdEdvdmVybm9yLCB3aGljaCBvbmx5IHJldmVhbHMgbGltaXRlZENyZWF0b3JGYWNldCovXG4gICAgcmV0dXJuIGdvdmVybm9yRmFjZXQ7XG4gIH07XG5cbiAgLyoqXG4gKiBAdGVtcGxhdGUge3t9fSBDRlxuICogQHBhcmFtIHtDRn0gb3JpZ2luYWxDcmVhdG9yRmFjZXRcbiAqIEBwYXJhbSB7e319IFtnb3Zlcm5lZEFwaXNdXG4gKiBAcmV0dXJucyB7R292ZXJuZWRDcmVhdG9yRmFjZXQ8Q0Y+fVxuICovXG4gIGNvbnN0IG1ha2VHb3Zlcm5vckZhY2V0ID0gKG9yaWdpbmFsQ3JlYXRvckZhY2V0LCBnb3Zlcm5lZEFwaXMgPSB7fSkgPT4ge1xuICAgIHJldHVybiBtYWtlRmFyR292ZXJub3JGYWNldChvcmlnaW5hbENyZWF0b3JGYWNldCwgZ292ZXJuZWRBcGlzKTtcbiAgfTtcblxuICAvKipcbiAqIEFkZCByZXF1aXJlZCBtZXRob2RzIHRvIGEgY3JlYXRvckZhY2V0IGZvciBhIGR1cmFibGUgY29udHJhY3QuXG4gKlxuICogQHNlZSB7bWFrZUR1cmFibGVHb3Zlcm5vckZhY2V0fVxuICpcbiAqIEB0ZW1wbGF0ZSB7eyBbbWV0aG9kTmFtZTogc3RyaW5nXTogKGNvbnRleHQ/OiB1bmtub3duLCAuLi5yZXN0OiB1bmtub3duW10pID0+IHVua25vd259fSBMQ0ZcbiAqIEBwYXJhbSB7TENGfSBsaW1pdGVkQ3JlYXRvckZhY2V0XG4gKi9cbiAgY29uc3QgbWFrZVZpcnR1YWxHb3Zlcm5vckZhY2V0ID0gbGltaXRlZENyZWF0b3JGYWNldCA9PiB7XG4gICAgLyoqIEB0eXBlIHtGdW5jdGlvbnNQbHVzQ29udGV4dDx1bmtub3duLCBHb3Zlcm5lZENyZWF0b3JGYWNldDx0eXBlb2YgbGltaXRlZENyZWF0b3JGYWNldD4+fSAqL1xuICAgIGNvbnN0IGdvdmVybm9yRmFjZXQgPSBoYXJkZW4oe1xuICAgICAgZ2V0UGFyYW1NZ3JSZXRyaWV2ZXI6ICgpID0+XG4gICAgICAgIEZhcigncGFyYW1SZXRyaWV2ZXInLCB7IGdldDogKCkgPT4gcGFyYW1NYW5hZ2VyIH0pLFxuICAgICAgZ2V0SW52aXRhdGlvbjogKF9jb250ZXh0LCAvKiogQHR5cGUge3N0cmluZ30gKi8gbmFtZSkgPT5cbiAgICAgICAgcGFyYW1NYW5hZ2VyLmdldEludGVybmFsUGFyYW1WYWx1ZShuYW1lKSxcbiAgICAgIGdldExpbWl0ZWRDcmVhdG9yRmFjZXQ6ICh7IGZhY2V0cyB9KSA9PiBmYWNldHMubGltaXRlZENyZWF0b3JGYWNldCxcbiAgICAgIC8qIFRoZSBjb250cmFjdCBwcm92aWRlcyBhIGZhY2V0IHdpdGggdGhlIEFQSXMgdGhhdCBjYW4gYmUgaW52b2tlZCBieSovXG4gICAgICAvKiBnb3Zlcm5hbmNlKi9cbiAgICAgIGdldEdvdmVybmVkQXBpczogKHsgZmFjZXRzIH0pID0+IGZhY2V0cy5nb3Zlcm5lZEFwaXMsXG4gICAgICAvKiBUaGUgZmFjZXQgcmV0dXJuZWQgYnkgZ2V0R292ZXJuZWRBcGlzIGlzIEZhciwgc28gd2UgY2FuJ3Qgc2VlIHdoYXQqL1xuICAgICAgLyogbWV0aG9kcyBpdCBoYXMuIFRoZXJlJ3Mgbm8gY2xlYW4gd2F5IHRvIGhhdmUgY29udHJhY3RzIHNwZWNpZnkgdGhlIEFQSXMqL1xuICAgICAgLyogd2l0aG91dCBhbHNvIHNlcGFyYXRlbHkgcHJvdmlkaW5nIHRoZWlyIG5hbWVzLiovXG4gICAgICBnZXRHb3Zlcm5lZEFwaU5hbWVzOiAoeyBmYWNldHMgfSkgPT5cbiAgICAgICAgZ2V0TWV0aG9kTmFtZXMoZmFjZXRzLmdvdmVybmVkQXBpcyB8fCB7fSksXG4gICAgICBzZXRPZmZlckZpbHRlcjogKF9jb250ZXh0LCBzdHJpbmdzKSA9PiB6Y2Yuc2V0T2ZmZXJGaWx0ZXIoc3RyaW5ncyksXG4gICAgfSk7XG5cbiAgICByZXR1cm4geyBnb3Zlcm5vckZhY2V0LCBsaW1pdGVkQ3JlYXRvckZhY2V0IH07XG4gIH07XG5cbiAgLyoqXG4gKiBBZGQgcmVxdWlyZWQgbWV0aG9kcyB0byBhIGNyZWF0b3JGYWNldCBmb3IgYSBkdXJhYmxlIGNvbnRyYWN0LlxuICpcbiAqIEBzZWUge21ha2VWaXJ0dWFsR292ZXJub3JGYWNldH1cbiAqXG4gKiBAdGVtcGxhdGUgQ0ZcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtDRn0gbGltaXRlZENyZWF0b3JGYWNldFxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCAoLi4uYW55KSA9PiB1bmtub3duPn0gW2dvdmVybmVkQXBpc11cbiAqL1xuICBjb25zdCBtYWtlRHVyYWJsZUdvdmVybm9yRmFjZXQgPSAoXG4gICAgYmFnZ2FnZSxcbiAgICBsaW1pdGVkQ3JlYXRvckZhY2V0LFxuICAgIGdvdmVybmVkQXBpcyA9IHt9LFxuICApID0+IHtcbiAgICBjb25zdCBmYXJHb3Zlcm5lZEFwaXMgPSBGYXIoJ2dvdmVybmVkQVBJcycsIHsgLi4uZ292ZXJuZWRBcGlzIH0pO1xuICAgIGNvbnN0IGdvdmVybm9yRmFjZXQgPSBwcmVwYXJlRXhvKFxuICAgICAgYmFnZ2FnZSxcbiAgICAgICdnb3Zlcm5vckZhY2V0JyxcbiAgICAgIE0uaW50ZXJmYWNlKCdnb3Zlcm5vckZhY2V0JywgR292ZXJub3JGYWNldFNoYXBlKSxcbiAgICAgIHtcbiAgICAgICAgZ2V0UGFyYW1NZ3JSZXRyaWV2ZXI6ICgpID0+XG4gICAgICAgICAgRmFyKCdwYXJhbVJldHJpZXZlcicsIHsgZ2V0OiAoKSA9PiBwYXJhbU1hbmFnZXIgfSksXG4gICAgICAgIGdldEludml0YXRpb246IG5hbWUgPT4gcGFyYW1NYW5hZ2VyLmdldEludGVybmFsUGFyYW1WYWx1ZShuYW1lKSxcbiAgICAgICAgZ2V0TGltaXRlZENyZWF0b3JGYWNldDogKCkgPT4gbGltaXRlZENyZWF0b3JGYWNldCxcbiAgICAgICAgLyogVGhlIGNvbnRyYWN0IHByb3ZpZGVzIGEgZmFjZXQgd2l0aCB0aGUgQVBJcyB0aGF0IGNhbiBiZSBpbnZva2VkIGJ5Ki9cbiAgICAgICAgLyogZ292ZXJuYW5jZSovXG4gICAgICAgIC8qKiBAdHlwZSB7KCkgPT4gR292ZXJuZWRBcGlzfSAqL1xuICAgICAgICBnZXRHb3Zlcm5lZEFwaXM6ICgpID0+IGZhckdvdmVybmVkQXBpcyxcbiAgICAgICAgLyogVGhlIGZhY2V0IHJldHVybmVkIGJ5IGdldEdvdmVybmVkQXBpcyBpcyBGYXIsIHNvIHdlIGNhbid0IHNlZSB3aGF0Ki9cbiAgICAgICAgLyogbWV0aG9kcyBpdCBoYXMuIFRoZXJlJ3Mgbm8gY2xlYW4gd2F5IHRvIGhhdmUgY29udHJhY3RzIHNwZWNpZnkgdGhlIEFQSXMqL1xuICAgICAgICAvKiB3aXRob3V0IGFsc28gc2VwYXJhdGVseSBwcm92aWRpbmcgdGhlaXIgbmFtZXMuKi9cbiAgICAgICAgZ2V0R292ZXJuZWRBcGlOYW1lczogKCkgPT4gT2JqZWN0LmtleXMoZ292ZXJuZWRBcGlzIHx8IHt9KSxcbiAgICAgICAgc2V0T2ZmZXJGaWx0ZXI6IHN0cmluZ3MgPT4gemNmLnNldE9mZmVyRmlsdGVyKHN0cmluZ3MpLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgcmV0dXJuIHsgZ292ZXJub3JGYWNldCwgbGltaXRlZENyZWF0b3JGYWNldCB9O1xuICB9O1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIHB1YmxpY01peGluOiB7XG4gICAgICAuLi5jb21tb25QdWJsaWNNZXRob2RzLFxuICAgICAgLi4udHlwZWRBY2Nlc3NvcnMsXG4gICAgfSxcbiAgICBhdWdtZW50UHVibGljRmFjZXQsXG4gICAgYXVnbWVudFZpcnR1YWxQdWJsaWNGYWNldCxcbiAgICBtYWtlR292ZXJub3JGYWNldCxcblxuICAgIG1ha2VGYXJHb3Zlcm5vckZhY2V0LFxuICAgIG1ha2VWaXJ0dWFsR292ZXJub3JGYWNldCxcbiAgICBtYWtlRHVyYWJsZUdvdmVybm9yRmFjZXQsXG5cbiAgICBwYXJhbXM6IHBhcmFtTWFuYWdlci5yZWFkb25seSgpLFxuICB9KTtcbn07XG5cbi8qKlxuICogSGVscGVyIGZvciB0aGUgOTAlIG9mIGNvbnRyYWN0cyB0aGF0IHdpbGwgaGF2ZSBvbmx5IGEgc2luZ2xlIHNldCBvZlxuICogcGFyYW1ldGVycy4gVXNpbmcgdGhpcyBmb3IgbWFuYWdlZCBwYXJhbWV0ZXJzLCBhIGNvbnRyYWN0IG9ubHkgaGFzIHRvXG4gKlxuICogLSBEZWZpbmUgdGhlIHBhcmFtZXRlciB0ZW1wbGF0ZSwgd2hpY2ggaW5jbHVkZXMgbmFtZSwgdHlwZSBhbmQgdmFsdWVcbiAqIC0gQWRkIGFueSBtZXRob2RzIG5lZWRlZCBpbiB0aGUgcHVibGljIGFuZCBjcmVhdG9yIGZhY2V0cy5cbiAqXG4gKiBJdCdzIGFsc28gY3J1Y2lhbCB0aGF0IHRoZSBnb3Zlcm5lZCBjb250cmFjdCBub3QgaW50ZXJhY3Qgd2l0aCB0aGUgcHJvZHVjdCBvZlxuICogbWFrZUdvdmVybm9yRmFjZXQoKS4gVGhlIHdyYXBwZWQgY3JlYXRvckZhY2V0IGhhcyB0aGUgcG93ZXIgdG8gY2hhbmdlXG4gKiBwYXJhbWV0ZXIgdmFsdWVzLCBhbmQgdGhlIGdvdmVybmFuY2UgZ3VhcmFudGVlcyBvbmx5IGhvbGQgaWYgdGhleSdyZSBub3QgdXNlZFxuICogZGlyZWN0bHkgYnkgdGhlIGdvdmVybmVkIGNvbnRyYWN0LlxuICpcbiAqIEB0ZW1wbGF0ZSB7UGFyYW1UeXBlc01hcH0gTVxuICogICBNYXAgb2YgdHlwZXMgb2YgY3VzdG9tIGdvdmVybmVkIHRlcm1zXG4gKiBAcGFyYW0ge1pDRjxHb3Zlcm5hbmNlVGVybXM8TT4+fSB6Y2ZcbiAqIEBwYXJhbSB7SW52aXRhdGlvbn0gaW5pdGlhbFBvc2VySW52aXRhdGlvblxuICogQHBhcmFtIHtNfSBwYXJhbVR5cGVzTWFwXG4gKiBAcGFyYW0ge0VSZW1vdGU8U3RvcmFnZU5vZGU+fSBbc3RvcmFnZU5vZGVdXG4gKiBAcGFyYW0ge0VSZW1vdGU8RU1hcnNoYWxsZXI+fSBbbWFyc2hhbGxlcl1cbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3ZlcnJpZGVzXVxuICovXG5jb25zdCBoYW5kbGVQYXJhbUdvdmVybmFuY2UgPSAoXG4gIHpjZixcbiAgaW5pdGlhbFBvc2VySW52aXRhdGlvbixcbiAgcGFyYW1UeXBlc01hcCxcbiAgc3RvcmFnZU5vZGUsXG4gIG1hcnNoYWxsZXIsXG4gIG92ZXJyaWRlcyxcbikgPT4ge1xuICAvKiogQHR5cGUge1N0b3JlZFB1Ymxpc2hlcktpdDxHb3Zlcm5hbmNlU3Vic2NyaXB0aW9uU3RhdGU+fSAqL1xuICBjb25zdCBwdWJsaXNoZXJLaXQgPSBtYWtlU3RvcmVkUHVibGlzaGVyS2l0KFxuICAgIHN0b3JhZ2VOb2RlLFxuICAgIG1hcnNoYWxsZXIsXG4gICAgR09WRVJOQU5DRV9TVE9SQUdFX0tFWSxcbiAgKTtcbiAgY29uc3QgcGFyYW1NYW5hZ2VyID0gbWFrZVBhcmFtTWFuYWdlckZyb21UZXJtcyhcbiAgICBwdWJsaXNoZXJLaXQsXG4gICAgemNmLFxuICAgIHsgRWxlY3RvcmF0ZTogaW5pdGlhbFBvc2VySW52aXRhdGlvbiB9LFxuICAgIHBhcmFtVHlwZXNNYXAsXG4gICAgb3ZlcnJpZGVzLFxuICApO1xuXG4gIHJldHVybiBmYWNldEhlbHBlcnMoemNmLCBwYXJhbU1hbmFnZXIpO1xufTskaM2PX29uY2UuaGFuZGxlUGFyYW1Hb3Zlcm5hbmNlKGhhbmRsZVBhcmFtR292ZXJuYW5jZSk7XG5cbmhhcmRlbihoYW5kbGVQYXJhbUdvdmVybmFuY2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHVibGljTWl4aW5BUEkiOlsicHVibGljTWl4aW5BUEkiXSwiaGFuZGxlUGFyYW1Hb3Zlcm5hbmNlIjpbImhhbmRsZVBhcmFtR292ZXJuYW5jZSJdLCJHT1ZFUk5BTkNFX1NUT1JBR0VfS0VZIjpbIkdPVkVSTkFOQ0VfU1RPUkFHRV9LRVkiXSwidmFsaWRhdGVFbGVjdG9yYXRlIjpbInZhbGlkYXRlRWxlY3RvcmF0ZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC5ZH1qawkAAGsJAAAnAAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vcXVlc3Rpb24uanMiLCIuL2NvbnRyYWN0R292ZXJub3IuanMiLCIuL2NvbnRyYWN0SGVscGVyLmpzIiwiLi9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuUGFyYW0uanMiLCIuL2NvbnRyYWN0R292ZXJuYW5jZS9wYXJhbU1hbmFnZXIuanMiLCIuL2NvbnRyYWN0R292ZXJuYW5jZS90eXBlZFBhcmFtTWFuYWdlci5qcyIsIi4vdmFsaWRhdG9ycy5qcyIsIi4vY29uc3RhbnRzLmpzIiwiLi90eXBlcy5qcyJdLCJleHBvcnRzIjpbIkVsZWN0aW9uVHlwZSIsIkVsZWN0aW9uVHlwZSIsImFzc2VydENvbnRyYWN0RWxlY3RvcmF0ZSIsImFzc2VydENvbnRyYWN0RWxlY3RvcmF0ZSIsIm1ha2VQYXJhbUNoYW5nZVBvc2l0aW9ucyIsIm1ha2VQYXJhbUNoYW5nZVBvc2l0aW9ucyIsIm1ha2VQYXJhbU1hbmFnZXJCdWlsZGVyIiwibWFrZVBhcmFtTWFuYWdlckJ1aWxkZXIiLCJtYWtlUGFyYW1NYW5hZ2VyU3luYyIsIm1ha2VQYXJhbU1hbmFnZXJTeW5jIiwicHVibGljTWl4aW5BUEkiLCJwdWJsaWNNaXhpbkFQSSIsInZhbGlkYXRlUXVlc3Rpb25Gcm9tQ291bnRlciIsInZhbGlkYXRlUXVlc3Rpb25Gcm9tQ291bnRlciIsbnVsbF0sInJlZXhwb3J0cyI6WyIuL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vcXVlc3Rpb24uanNcIiwgW11dLFtcIi4vY29udHJhY3RHb3Zlcm5vci5qc1wiLCBbXV0sW1wiLi9jb250cmFjdEhlbHBlci5qc1wiLCBbXV0sW1wiLi9jb250cmFjdEdvdmVybmFuY2UvZ292ZXJuUGFyYW0uanNcIiwgW11dLFtcIi4vY29udHJhY3RHb3Zlcm5hbmNlL3BhcmFtTWFuYWdlci5qc1wiLCBbXV0sW1wiLi9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXIuanNcIiwgW11dLFtcIi4vdmFsaWRhdG9ycy5qc1wiLCBbXV0sW1wiLi9jb25zdGFudHMuanNcIiwgW11dLFtcIi4vdHlwZXMuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3F1ZXN0aW9uLmpzIjpbWyJDaG9pY2VNZXRob2QiLCJDaG9pY2VNZXRob2QiXSxbIkVsZWN0aW9uVHlwZSIsIkVsZWN0aW9uVHlwZSJdLFsiUXVvcnVtUnVsZSIsIlF1b3J1bVJ1bGUiXSxbImNvZXJjZVF1ZXN0aW9uU3BlYyIsImNvZXJjZVF1ZXN0aW9uU3BlYyJdLFsicG9zaXRpb25JbmNsdWRlZCIsInBvc2l0aW9uSW5jbHVkZWQiXSxbImJ1aWxkUXVlc3Rpb24iLCJidWlsZFF1ZXN0aW9uIl1dLCIuL2NvbnRyYWN0R292ZXJub3IuanMiOltbInZhbGlkYXRlUXVlc3Rpb25EZXRhaWxzIiwidmFsaWRhdGVRdWVzdGlvbkRldGFpbHMiXSxbInZhbGlkYXRlUXVlc3Rpb25Gcm9tQ291bnRlciIsInZhbGlkYXRlUXVlc3Rpb25Gcm9tQ291bnRlciJdXSwiLi9jb250cmFjdEhlbHBlci5qcyI6W1siaGFuZGxlUGFyYW1Hb3Zlcm5hbmNlIiwiaGFuZGxlUGFyYW1Hb3Zlcm5hbmNlIl0sWyJwdWJsaWNNaXhpbkFQSSIsInB1YmxpY01peGluQVBJIl1dLCIuL2NvbnRyYWN0R292ZXJuYW5jZS9nb3Zlcm5QYXJhbS5qcyI6W1siYXNzZXJ0QmFsbG90Q29uY2VybnNQYXJhbSIsImFzc2VydEJhbGxvdENvbmNlcm5zUGFyYW0iXSxbIm1ha2VQYXJhbUNoYW5nZVBvc2l0aW9ucyIsIm1ha2VQYXJhbUNoYW5nZVBvc2l0aW9ucyJdLFsic2V0dXBQYXJhbUdvdmVybmFuY2UiLCJzZXR1cFBhcmFtR292ZXJuYW5jZSJdLFsiQ09OVFJBQ1RfRUxFQ1RPUkFURSIsIkNPTlRSQUNUX0VMRUNUT1JBVEUiXV0sIi4vY29udHJhY3RHb3Zlcm5hbmNlL3BhcmFtTWFuYWdlci5qcyI6W1siYXNzZXJ0RWxlY3RvcmF0ZU1hdGNoZXMiLCJhc3NlcnRFbGVjdG9yYXRlTWF0Y2hlcyJdLFsibWFrZVBhcmFtTWFuYWdlckJ1aWxkZXIiLCJtYWtlUGFyYW1NYW5hZ2VyQnVpbGRlciJdXSwiLi9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXIuanMiOltbIm1ha2VQYXJhbU1hbmFnZXIiLCJtYWtlUGFyYW1NYW5hZ2VyIl0sWyJtYWtlUGFyYW1NYW5hZ2VyU3luYyIsIm1ha2VQYXJhbU1hbmFnZXJTeW5jIl1dLCIuL3ZhbGlkYXRvcnMuanMiOltbImFzc2VydENvbnRyYWN0R292ZXJuYW5jZSIsImFzc2VydENvbnRyYWN0R292ZXJuYW5jZSJdLFsiYXNzZXJ0Q29udHJhY3RFbGVjdG9yYXRlIiwiYXNzZXJ0Q29udHJhY3RFbGVjdG9yYXRlIl1dLCIuL2NvbnN0YW50cy5qcyI6W1siUGFyYW1UeXBlcyIsIlBhcmFtVHlwZXMiXV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALeYYl0DEQAAAxEAACoAAABAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvcXVlc3Rpb24uanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvem9lL3NyYy9tYWtlSGFuZGxlLmpzIiwiLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsiQ2hvaWNlTWV0aG9kIiwiRWxlY3Rpb25UeXBlIiwiUXVvcnVtUnVsZSIsImJ1aWxkUXVlc3Rpb24iLCJjb2VyY2VRdWVzdGlvblNwZWMiLCJwb3NpdGlvbkluY2x1ZGVkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgbWFrZUV4byxtdXN0TWF0Y2gsa2V5RVEsTSxtYWtlSGFuZGxlLFF1ZXN0aW9uSSxRdWVzdGlvblNwZWNTaGFwZTskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm1ha2VFeG9cIixbJGjNj19hID0+IChtYWtlRXhvID0gJGjNj19hKV1dLFtcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXSxbXCJrZXlFUVwiLFskaM2PX2EgPT4gKGtleUVRID0gJGjNj19hKV1dLFtcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy96b2Uvc3JjL21ha2VIYW5kbGUuanNcIiwgW1tcIm1ha2VIYW5kbGVcIixbJGjNj19hID0+IChtYWtlSGFuZGxlID0gJGjNj19hKV1dXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJRdWVzdGlvbklcIixbJGjNj19hID0+IChRdWVzdGlvbkkgPSAkaM2PX2EpXV0sW1wiUXVlc3Rpb25TcGVjU2hhcGVcIixbJGjNj19hID0+IChRdWVzdGlvblNwZWNTaGFwZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7QnVpbGRRdWVzdGlvbiwgUG9zaXRpb25JbmNsdWRlZCwgUXVlc3Rpb24sIFF1ZXN0aW9uU3BlY30gZnJvbSAnLi90eXBlcy5qcyc7XG4gKi9cblxuLyogVG9waWNzIGJlaW5nIHZvdGVkIG9uIGFyZSAnUXVlc3Rpb25zJy4gQmVmb3JlIGEgUXVlc3Rpb24gaXMga25vd24gdG8gYSovXG4vKiBlbGVjdG9yYXRlLCB0aGUgcGFyYW1ldGVycyBjYW4gYmUgZGVzY3JpYmVkIHdpdGggYSBRdWVzdGlvblNwZWMuIE9uY2UgdGhlKi9cbi8qIHF1ZXN0aW9uIGhhcyBiZWVuIHByZXNlbnRlZCB0byBhbiBFbGVjdG9yYXRlLCB0aGVyZSBpcyBhIFF1ZXN0aW9uRGV0YWlscyovXG4vKiByZWNvcmQgdGhhdCBhbHNvIGluY2x1ZGVzIHRoZSBWb3RlQ291bnRlciB3aGljaCB3aWxsIGRldGVybWluZSB0aGUgb3V0Y29tZSovXG4vKiBhbmQgdGhlIHF1ZXN0aW9uSGFuZGxlIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyBpdC4qL1xuXG4vKipcbiAqIFwidW5yYW5rZWRcIiBpcyBtb3JlIGZvcm1hbGx5IGtub3duIGFzIFwiYXBwcm92YWxcIiB2b3RpbmcsIGJ1dCB0aGlzIGlzIGhhcmQgZm9yXG4gKiBwZW9wbGUgdG8gaW50dWl0IHdoZW4gdGhlcmUgYXJlIG9ubHkgdHdvIGFsdGVybmF0aXZlcy5cbiAqL1xuY29uc3QgQ2hvaWNlTWV0aG9kID0gLyoqIEB0eXBlIHtjb25zdH0gKi8gKHtcbiAgVU5SQU5LRUQ6ICd1bnJhbmtlZCcsXG4gIE9SREVSOiAnb3JkZXInLFxuICBQTFVSQUxJVFk6ICdwbHVyYWxpdHknLFxufSk7JGjNj19vbmNlLkNob2ljZU1ldGhvZChDaG9pY2VNZXRob2QpO1xuXG5jb25zdCBFbGVjdGlvblR5cGUgPSAvKiogQHR5cGUge2NvbnN0fSAqLyAoe1xuICAvKiBBIHBhcmFtZXRlciBpcyBuYW1lZCwgYW5kIGEgbmV3IHZhbHVlIHByb3Bvc2VkKi9cbiAgUEFSQU1fQ0hBTkdFOiAncGFyYW1fY2hhbmdlJyxcbiAgLyogY2hvb3NlIG9uZSBvciBtdWx0aXBsZSB3aW5uZXJzLCBkZXBlbmRpbmcgb24gQ2hvaWNlTWV0aG9kKi9cbiAgRUxFQ1RJT046ICdlbGVjdGlvbicsXG4gIFNVUlZFWTogJ3N1cnZleScsXG4gIC8qIHdoZXRoZXIgb3Igbm90IHRvIGludm9rZSBhbiBBUEkgbWV0aG9kKi9cbiAgQVBJX0lOVk9DQVRJT046ICdhcGlfaW52b2NhdGlvbicsXG4gIE9GRkVSX0ZJTFRFUjogJ29mZmVyX2ZpbHRlcicsXG59KTskaM2PX29uY2UuRWxlY3Rpb25UeXBlKEVsZWN0aW9uVHlwZSk7XG5cbmNvbnN0IFF1b3J1bVJ1bGUgPSAvKiogQHR5cGUge2NvbnN0fSAqLyAoe1xuICBNQUpPUklUWTogJ21ham9yaXR5JyxcbiAgTk9fUVVPUlVNOiAnbm9fcXVvcnVtJyxcbiAgLyogVGhlIGVsZWN0aW9uIGlzbid0IHZhbGlkIHVubGVzcyBhbGwgdm90ZXJzIHZvdGUqL1xuICBBTEw6ICdhbGwnLFxufSk7XG5cbi8qKiBAdHlwZSB7UG9zaXRpb25JbmNsdWRlZH0gKi8kaM2PX29uY2UuUXVvcnVtUnVsZShRdW9ydW1SdWxlKTtcbmNvbnN0IHBvc2l0aW9uSW5jbHVkZWQgPSAocG9zaXRpb25zLCBwKSA9PiBwb3NpdGlvbnMuc29tZShlID0+IGtleUVRKGUsIHApKTtcblxuLyoqXG4gKiBAaW50ZXJuYWxcbiAqIEBwYXJhbSB7UXVlc3Rpb25TcGVjfSBhbGxlZ2VkUXVlc3Rpb25TcGVjXG4gKiBAcmV0dXJucyB7UXVlc3Rpb25TcGVjfVxuICovJGjNj19vbmNlLnBvc2l0aW9uSW5jbHVkZWQocG9zaXRpb25JbmNsdWRlZCk7XG5jb25zdCBjb2VyY2VRdWVzdGlvblNwZWMgPSAoe1xuICBtZXRob2QsXG4gIGlzc3VlLFxuICBwb3NpdGlvbnMsXG4gIGVsZWN0aW9uVHlwZSxcbiAgbWF4Q2hvaWNlcyxcbiAgbWF4V2lubmVycyxcbiAgY2xvc2luZ1J1bGUsXG4gIHF1b3J1bVJ1bGUsXG4gIHRpZU91dGNvbWUsXG59KSA9PiB7XG4gIGNvbnN0IHF1ZXN0aW9uID0gaGFyZGVuKHtcbiAgICBtZXRob2QsXG4gICAgaXNzdWUsXG4gICAgcG9zaXRpb25zLFxuICAgIG1heENob2ljZXM6IE51bWJlcihtYXhDaG9pY2VzKSxcbiAgICBtYXhXaW5uZXJzOiBOdW1iZXIobWF4V2lubmVycyksXG4gICAgZWxlY3Rpb25UeXBlLFxuICAgIGNsb3NpbmdSdWxlLFxuICAgIHF1b3J1bVJ1bGUsXG4gICAgdGllT3V0Y29tZSxcbiAgfSk7XG5cbiAgbXVzdE1hdGNoKHF1ZXN0aW9uLCBRdWVzdGlvblNwZWNTaGFwZSk7XG5cbiAgLyogWFhYIEl0IHdvdWxkIGJlIG5pY2UgdG8gZW5mb3JjZSB0aGlzIHVzaW5nIHBhcmFtZXRlcml6ZWQgdHlwZXMsIGJ1dCB0aGF0Ki9cbiAgLyogc2VlbXMgdG8gb25seSBlbmZvcmNlIHR5cGUgY29uc3RyYWludHMsIChpLmUuIHRoZSB0aWVPdXRjb21lIHdpbGwgYmUgdGhlKi9cbiAgLyogc2FtZSB0eXBlIGFzIGFueSBvZiB0aGUgcG9zaXRpb25zKSB1bmxlc3MgeW91IGNhbiBwcm92aWRlIHRoZSBjb25jcmV0ZSovXG4gIC8qIHZhbHVlIGF0IHBhdHRlcm4gY3JlYXRpb24gdGltZS4qL1xuICBtdXN0TWF0Y2gocXVlc3Rpb24udGllT3V0Y29tZSwgTS5vciguLi5xdWVzdGlvbi5wb3NpdGlvbnMpKTtcblxuICByZXR1cm4gcXVlc3Rpb247XG59O1xuXG4vKiogQHR5cGUge0J1aWxkUXVlc3Rpb259ICovJGjNj19vbmNlLmNvZXJjZVF1ZXN0aW9uU3BlYyhjb2VyY2VRdWVzdGlvblNwZWMpO1xuY29uc3QgYnVpbGRRdWVzdGlvbiA9IChxdWVzdGlvblNwZWMsIGNvdW50ZXJJbnN0YW5jZSkgPT4ge1xuICBjb25zdCBxdWVzdGlvbkhhbmRsZSA9IG1ha2VIYW5kbGUoJ1F1ZXN0aW9uJyk7XG5cbiAgLyoqIEB0eXBlIHtRdWVzdGlvbn0gKi9cbiAgcmV0dXJuIG1ha2VFeG8oJ3F1ZXN0aW9uIGRldGFpbHMnLCBRdWVzdGlvbkksIHtcbiAgICBnZXRWb3RlQ291bnRlcigpIHtcbiAgICAgIHJldHVybiBjb3VudGVySW5zdGFuY2U7XG4gICAgfSxcbiAgICBnZXREZXRhaWxzKCkge1xuICAgICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICAgIC4uLnF1ZXN0aW9uU3BlYyxcbiAgICAgICAgcXVlc3Rpb25IYW5kbGUsXG4gICAgICAgIGNvdW50ZXJJbnN0YW5jZSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pO1xufTskaM2PX29uY2UuYnVpbGRRdWVzdGlvbihidWlsZFF1ZXN0aW9uKTtcblxuaGFyZGVuKGJ1aWxkUXVlc3Rpb24pO1xuaGFyZGVuKENob2ljZU1ldGhvZCk7XG5oYXJkZW4oRWxlY3Rpb25UeXBlKTtcbmhhcmRlbihjb2VyY2VRdWVzdGlvblNwZWMpO1xuaGFyZGVuKHBvc2l0aW9uSW5jbHVkZWQpO1xuaGFyZGVuKFF1b3J1bVJ1bGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ2hvaWNlTWV0aG9kIjpbIkNob2ljZU1ldGhvZCJdLCJFbGVjdGlvblR5cGUiOlsiRWxlY3Rpb25UeXBlIl0sIlF1b3J1bVJ1bGUiOlsiUXVvcnVtUnVsZSJdLCJwb3NpdGlvbkluY2x1ZGVkIjpbInBvc2l0aW9uSW5jbHVkZWQiXSwiY29lcmNlUXVlc3Rpb25TcGVjIjpbImNvZXJjZVF1ZXN0aW9uU3BlYyJdLCJidWlsZFF1ZXN0aW9uIjpbImJ1aWxkUXVlc3Rpb24iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAm0DIbSxAAAAsQAAALAAAAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3RpbWUiLCJAYWdvcmljL3pvZS9zcmMvdHlwZUd1YXJkcy5qcyIsIkBhZ29yaWMvbm90aWZpZXIiXSwiZXhwb3J0cyI6WyJBcGlJbnZvY2F0aW9uUG9zaXRpb25zU2hhcGUiLCJBcGlJbnZvY2F0aW9uUXVlc3Rpb25EZXRhaWxzU2hhcGUiLCJBcGlJbnZvY2F0aW9uUXVlc3Rpb25TcGVjU2hhcGUiLCJCaW5hcnlWb3RlQ291bnRlckFkbWluSSIsIkJpbmFyeVZvdGVDb3VudGVyQ2xvc2VJIiwiQmluYXJ5Vm90ZUNvdW50ZXJQdWJsaWNJIiwiQ2hvaWNlTWV0aG9kU2hhcGUiLCJDbG9zaW5nUnVsZVNoYXBlIiwiRWxlY3Rpb25UeXBlU2hhcGUiLCJFbGVjdG9yYXRlQ3JlYXRvckkiLCJFbGVjdG9yYXRlUHVibGljSSIsIkdvdmVybm9yRmFjZXRTaGFwZSIsIkludml0YXRpb25TaGFwZSIsIk5vQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUiLCJOb09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSIsIk5vUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSIsIk5vU2ltcGxlUG9zaXRpb25TaGFwZSIsIk9mZmVyRmlsdGVySXNzdWVTaGFwZSIsIk9mZmVyRmlsdGVyUG9zaXRpb25zU2hhcGUiLCJPZmZlckZpbHRlclF1ZXN0aW9uRGV0YWlsc1NoYXBlIiwiT2ZmZXJGaWx0ZXJRdWVzdGlvblNwZWNTaGFwZSIsIlBhcmFtQ2hhbmdlc0lzc3VlU2hhcGUiLCJQYXJhbUNoYW5nZXNQb3NpdGlvbnNTaGFwZSIsIlBhcmFtQ2hhbmdlc1F1ZXN0aW9uRGV0YWlsc1NoYXBlIiwiUGFyYW1DaGFuZ2VzUXVlc3Rpb25TcGVjU2hhcGUiLCJQYXJhbUNoYW5nZXNTcGVjU2hhcGUiLCJQYXJhbVBhdGhTaGFwZSIsIlBvc2l0aW9uU2hhcGUiLCJRdWVzdGlvbkRldGFpbHNTaGFwZSIsIlF1ZXN0aW9uSGFuZGxlU2hhcGUiLCJRdWVzdGlvbkkiLCJRdWVzdGlvblNwZWNTaGFwZSIsIlF1ZXN0aW9uU3RhdHNTaGFwZSIsIlF1b3J1bVJ1bGVTaGFwZSIsIlNpbXBsZUlzc3VlU2hhcGUiLCJTaW1wbGVQb3NpdGlvbnNTaGFwZSIsIlNpbXBsZVF1ZXN0aW9uRGV0YWlsc1NoYXBlIiwiU2ltcGxlUXVlc3Rpb25TcGVjU2hhcGUiLCJWb3RlQ291bnRlckFkbWluSSIsIlZvdGVDb3VudGVyQ2xvc2VJIiwiVm90ZUNvdW50ZXJQdWJsaWNJIiwiVm90ZXJIYW5kbGUiLCJZZXNBcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSIsIlllc09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSIsIlllc1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUiLCJZZXNTaW1wbGVQb3NpdGlvblNoYXBlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgTSxUaW1lc3RhbXBTaGFwZSxJbnN0YW5jZUhhbmRsZVNoYXBlLFRpbWVyU2hhcGUsbWFrZUhhbmRsZVNoYXBlLFN1YnNjcmliZXJTaGFwZTskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy90aW1lXCIsIFtbXCJUaW1lc3RhbXBTaGFwZVwiLFskaM2PX2EgPT4gKFRpbWVzdGFtcFNoYXBlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy96b2Uvc3JjL3R5cGVHdWFyZHMuanNcIiwgW1tcIkluc3RhbmNlSGFuZGxlU2hhcGVcIixbJGjNj19hID0+IChJbnN0YW5jZUhhbmRsZVNoYXBlID0gJGjNj19hKV1dLFtcIlRpbWVyU2hhcGVcIixbJGjNj19hID0+IChUaW1lclNoYXBlID0gJGjNj19hKV1dLFtcIm1ha2VIYW5kbGVTaGFwZVwiLFskaM2PX2EgPT4gKG1ha2VIYW5kbGVTaGFwZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcIlN1YnNjcmliZXJTaGFwZVwiLFskaM2PX2EgPT4gKFN1YnNjcmliZXJTaGFwZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuICAgICAgIGNvbnN0IENob2ljZU1ldGhvZFNoYXBlID0gTS5vcigndW5yYW5rZWQnLCAnb3JkZXInLCAncGx1cmFsaXR5Jyk7JGjNj19vbmNlLkNob2ljZU1ldGhvZFNoYXBlKENob2ljZU1ldGhvZFNoYXBlKTtcbiAgICAgICBjb25zdCBRdW9ydW1SdWxlU2hhcGUgPSBNLm9yKCdtYWpvcml0eScsICdub19xdW9ydW0nLCAnYWxsJyk7JGjNj19vbmNlLlF1b3J1bVJ1bGVTaGFwZShRdW9ydW1SdWxlU2hhcGUpO1xuICAgICAgIGNvbnN0IEVsZWN0aW9uVHlwZVNoYXBlID0gTS5vcihcbiAgJ3BhcmFtX2NoYW5nZScsXG4gICdlbGVjdGlvbicsXG4gICdzdXJ2ZXknLFxuICAnYXBpX2ludm9jYXRpb24nLFxuICAnb2ZmZXJfZmlsdGVyJyxcbik7JGjNj19vbmNlLkVsZWN0aW9uVHlwZVNoYXBlKEVsZWN0aW9uVHlwZVNoYXBlKTtcblxuICAgICAgIGNvbnN0IENsb3NpbmdSdWxlU2hhcGUgPSB7XG4gIHRpbWVyOiBNLmVyZWYoVGltZXJTaGFwZSksXG4gIGRlYWRsaW5lOiBUaW1lc3RhbXBTaGFwZSxcbn07JGjNj19vbmNlLkNsb3NpbmdSdWxlU2hhcGUoQ2xvc2luZ1J1bGVTaGFwZSk7XG5oYXJkZW4oQ2xvc2luZ1J1bGVTaGFwZSk7XG5cbi8qIGFsbCB0aGUgc3RyaW5ncyB0aGF0IHdpbGwgYmUgaW4gdGhlIGZpbHRlciBhZnRlciBwYXNzaW5nKi9cbiAgICAgICBjb25zdCBZZXNPZmZlckZpbHRlclBvc2l0aW9uU2hhcGUgPSB7XG4gIHN0cmluZ3M6IE0uYXJyYXlPZihNLnN0cmluZygpKSxcbn07JGjNj19vbmNlLlllc09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZShZZXNPZmZlckZpbHRlclBvc2l0aW9uU2hhcGUpO1xuaGFyZGVuKFllc09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSk7XG5cbiAgICAgICBjb25zdCBOb09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSA9IHsgZG9udFVwZGF0ZTogTS5hcnJheU9mKE0uc3RyaW5nKCkpIH07JGjNj19vbmNlLk5vT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlKE5vT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlKTtcbmhhcmRlbihOb09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSk7XG5cbiAgICAgICBjb25zdCBPZmZlckZpbHRlclBvc2l0aW9uc1NoYXBlID0gW1xuICBZZXNPZmZlckZpbHRlclBvc2l0aW9uU2hhcGUsXG4gIE5vT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlLFxuXTskaM2PX29uY2UuT2ZmZXJGaWx0ZXJQb3NpdGlvbnNTaGFwZShPZmZlckZpbHRlclBvc2l0aW9uc1NoYXBlKTtcbmhhcmRlbihPZmZlckZpbHRlclBvc2l0aW9uc1NoYXBlKTtcblxuICAgICAgIGNvbnN0IE9mZmVyRmlsdGVySXNzdWVTaGFwZSA9IHsgc3RyaW5nczogTS5hcnJheU9mKE0uc3RyaW5nKCkpIH07JGjNj19vbmNlLk9mZmVyRmlsdGVySXNzdWVTaGFwZShPZmZlckZpbHRlcklzc3VlU2hhcGUpO1xuaGFyZGVuKE9mZmVyRmlsdGVySXNzdWVTaGFwZSk7XG5cbiAgICAgICBjb25zdCBPZmZlckZpbHRlclF1ZXN0aW9uU3BlY1NoYXBlID0ge1xuICBtZXRob2Q6IENob2ljZU1ldGhvZFNoYXBlLFxuICBpc3N1ZTogT2ZmZXJGaWx0ZXJJc3N1ZVNoYXBlLFxuICBwb3NpdGlvbnM6IE9mZmVyRmlsdGVyUG9zaXRpb25zU2hhcGUsXG4gIGVsZWN0aW9uVHlwZTogJ29mZmVyX2ZpbHRlcicsXG4gIG1heENob2ljZXM6IDEsXG4gIG1heFdpbm5lcnM6IDEsXG4gIGNsb3NpbmdSdWxlOiBDbG9zaW5nUnVsZVNoYXBlLFxuICBxdW9ydW1SdWxlOiBRdW9ydW1SdWxlU2hhcGUsXG4gIHRpZU91dGNvbWU6IE5vT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlLFxufTskaM2PX29uY2UuT2ZmZXJGaWx0ZXJRdWVzdGlvblNwZWNTaGFwZShPZmZlckZpbHRlclF1ZXN0aW9uU3BlY1NoYXBlKTtcbmhhcmRlbihPZmZlckZpbHRlclF1ZXN0aW9uU3BlY1NoYXBlKTtcblxuICAgICAgIGNvbnN0IE9mZmVyRmlsdGVyUXVlc3Rpb25EZXRhaWxzU2hhcGUgPSB7XG4gIC4uLk9mZmVyRmlsdGVyUXVlc3Rpb25TcGVjU2hhcGUsXG4gIHF1ZXN0aW9uSGFuZGxlOiBtYWtlSGFuZGxlU2hhcGUoJ1F1ZXN0aW9uJyksXG4gIGNvdW50ZXJJbnN0YW5jZTogSW5zdGFuY2VIYW5kbGVTaGFwZSxcbn07JGjNj19vbmNlLk9mZmVyRmlsdGVyUXVlc3Rpb25EZXRhaWxzU2hhcGUoT2ZmZXJGaWx0ZXJRdWVzdGlvbkRldGFpbHNTaGFwZSk7XG5oYXJkZW4oT2ZmZXJGaWx0ZXJRdWVzdGlvbkRldGFpbHNTaGFwZSk7XG5cbi8qIGtleXMgYXJlIHBhcmFtZXRlciBuYW1lcywgdmFsdWVzIGFyZSBwcm9wb3NlZCB2YWx1ZXMqL1xuICAgICAgIGNvbnN0IFBhcmFtQ2hhbmdlc1NwZWNTaGFwZSA9IE0ucmVjb3JkT2YoTS5zdHJpbmcoKSwgTS5hbnkoKSk7JGjNj19vbmNlLlBhcmFtQ2hhbmdlc1NwZWNTaGFwZShQYXJhbUNoYW5nZXNTcGVjU2hhcGUpO1xuICAgICAgIGNvbnN0IFllc1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUgPSBQYXJhbUNoYW5nZXNTcGVjU2hhcGU7JGjNj19vbmNlLlllc1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUoWWVzUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSk7XG4gICAgICAgY29uc3QgTm9QYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlID0geyBub0NoYW5nZTogTS5hcnJheU9mKE0uc3RyaW5nKCkpIH07JGjNj19vbmNlLk5vUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZShOb1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUpO1xuaGFyZGVuKE5vUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSk7XG5cbiAgICAgICBjb25zdCBQYXJhbUNoYW5nZXNQb3NpdGlvbnNTaGFwZSA9IFtcbiAgWWVzUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSxcbiAgTm9QYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlLFxuXTskaM2PX29uY2UuUGFyYW1DaGFuZ2VzUG9zaXRpb25zU2hhcGUoUGFyYW1DaGFuZ2VzUG9zaXRpb25zU2hhcGUpO1xuaGFyZGVuKFBhcmFtQ2hhbmdlc1Bvc2l0aW9uc1NoYXBlKTtcblxuICAgICAgIGNvbnN0IFBhcmFtUGF0aFNoYXBlID0geyBrZXk6IE0uYW55KCkgfTskaM2PX29uY2UuUGFyYW1QYXRoU2hhcGUoUGFyYW1QYXRoU2hhcGUpO1xuaGFyZGVuKFBhcmFtUGF0aFNoYXBlKTtcblxuICAgICAgIGNvbnN0IFBhcmFtQ2hhbmdlc0lzc3VlU2hhcGUgPSB7XG4gIHNwZWM6IHtcbiAgICBwYXJhbVBhdGg6IFBhcmFtUGF0aFNoYXBlLFxuICAgIGNoYW5nZXM6IFBhcmFtQ2hhbmdlc1NwZWNTaGFwZSxcbiAgfSxcbiAgY29udHJhY3Q6IEluc3RhbmNlSGFuZGxlU2hhcGUsXG59OyRozY9fb25jZS5QYXJhbUNoYW5nZXNJc3N1ZVNoYXBlKFBhcmFtQ2hhbmdlc0lzc3VlU2hhcGUpO1xuaGFyZGVuKFBhcmFtQ2hhbmdlc0lzc3VlU2hhcGUpO1xuXG4gICAgICAgY29uc3QgUGFyYW1DaGFuZ2VzUXVlc3Rpb25TcGVjU2hhcGUgPSB7XG4gIG1ldGhvZDogJ3VucmFua2VkJyxcbiAgaXNzdWU6IFBhcmFtQ2hhbmdlc0lzc3VlU2hhcGUsXG4gIHBvc2l0aW9uczogUGFyYW1DaGFuZ2VzUG9zaXRpb25zU2hhcGUsXG4gIGVsZWN0aW9uVHlwZTogJ3BhcmFtX2NoYW5nZScsXG4gIG1heENob2ljZXM6IDEsXG4gIG1heFdpbm5lcnM6IDEsXG4gIGNsb3NpbmdSdWxlOiBDbG9zaW5nUnVsZVNoYXBlLFxuICBxdW9ydW1SdWxlOiAnbWFqb3JpdHknLFxuICB0aWVPdXRjb21lOiBOb1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUsXG59OyRozY9fb25jZS5QYXJhbUNoYW5nZXNRdWVzdGlvblNwZWNTaGFwZShQYXJhbUNoYW5nZXNRdWVzdGlvblNwZWNTaGFwZSk7XG5oYXJkZW4oUGFyYW1DaGFuZ2VzUXVlc3Rpb25TcGVjU2hhcGUpO1xuXG4gICAgICAgY29uc3QgUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGUgPSB7XG4gIC4uLlBhcmFtQ2hhbmdlc1F1ZXN0aW9uU3BlY1NoYXBlLFxuICBxdWVzdGlvbkhhbmRsZTogbWFrZUhhbmRsZVNoYXBlKCdRdWVzdGlvbicpLFxuICBjb3VudGVySW5zdGFuY2U6IEluc3RhbmNlSGFuZGxlU2hhcGUsXG59OyRozY9fb25jZS5QYXJhbUNoYW5nZXNRdWVzdGlvbkRldGFpbHNTaGFwZShQYXJhbUNoYW5nZXNRdWVzdGlvbkRldGFpbHNTaGFwZSk7XG5oYXJkZW4oUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGUpO1xuXG5jb25zdCBBcGlJbnZvY2F0aW9uU3BlY1NoYXBlID0ge1xuICBhcGlNZXRob2ROYW1lOiBNLnN0cmluZygpLFxuICBtZXRob2RBcmdzOiBNLmFycmF5T2YoTS5hbnkoKSksXG59O1xuaGFyZGVuKEFwaUludm9jYXRpb25TcGVjU2hhcGUpO1xuXG4gICAgICAgY29uc3QgWWVzQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUgPSBBcGlJbnZvY2F0aW9uU3BlY1NoYXBlOyRozY9fb25jZS5ZZXNBcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZShZZXNBcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSk7XG4gICAgICAgY29uc3QgTm9BcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSA9IHsgZG9udEludm9rZTogTS5zdHJpbmcoKSB9OyRozY9fb25jZS5Ob0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlKE5vQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUpO1xuaGFyZGVuKE5vQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUpO1xuXG4gICAgICAgY29uc3QgQXBpSW52b2NhdGlvblBvc2l0aW9uc1NoYXBlID0gW1xuICBZZXNBcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSxcbiAgTm9BcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSxcbl07JGjNj19vbmNlLkFwaUludm9jYXRpb25Qb3NpdGlvbnNTaGFwZShBcGlJbnZvY2F0aW9uUG9zaXRpb25zU2hhcGUpO1xuaGFyZGVuKEFwaUludm9jYXRpb25Qb3NpdGlvbnNTaGFwZSk7XG5cbiAgICAgICBjb25zdCBBcGlJbnZvY2F0aW9uUXVlc3Rpb25TcGVjU2hhcGUgPSB7XG4gIG1ldGhvZDogJ3VucmFua2VkJyxcbiAgaXNzdWU6IEFwaUludm9jYXRpb25TcGVjU2hhcGUsXG4gIHBvc2l0aW9uczogQXBpSW52b2NhdGlvblBvc2l0aW9uc1NoYXBlLFxuICBlbGVjdGlvblR5cGU6ICdhcGlfaW52b2NhdGlvbicsXG4gIG1heENob2ljZXM6IDEsXG4gIG1heFdpbm5lcnM6IDEsXG4gIGNsb3NpbmdSdWxlOiBDbG9zaW5nUnVsZVNoYXBlLFxuICBxdW9ydW1SdWxlOiBRdW9ydW1SdWxlU2hhcGUsXG4gIHRpZU91dGNvbWU6IE5vQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUsXG59OyRozY9fb25jZS5BcGlJbnZvY2F0aW9uUXVlc3Rpb25TcGVjU2hhcGUoQXBpSW52b2NhdGlvblF1ZXN0aW9uU3BlY1NoYXBlKTtcbmhhcmRlbihBcGlJbnZvY2F0aW9uUXVlc3Rpb25TcGVjU2hhcGUpO1xuXG4gICAgICAgY29uc3QgQXBpSW52b2NhdGlvblF1ZXN0aW9uRGV0YWlsc1NoYXBlID0ge1xuICAuLi5BcGlJbnZvY2F0aW9uUXVlc3Rpb25TcGVjU2hhcGUsXG4gIHF1ZXN0aW9uSGFuZGxlOiBtYWtlSGFuZGxlU2hhcGUoJ1F1ZXN0aW9uJyksXG4gIGNvdW50ZXJJbnN0YW5jZTogSW5zdGFuY2VIYW5kbGVTaGFwZSxcbn07JGjNj19vbmNlLkFwaUludm9jYXRpb25RdWVzdGlvbkRldGFpbHNTaGFwZShBcGlJbnZvY2F0aW9uUXVlc3Rpb25EZXRhaWxzU2hhcGUpO1xuaGFyZGVuKEFwaUludm9jYXRpb25RdWVzdGlvbkRldGFpbHNTaGFwZSk7XG5cbmNvbnN0IFNpbXBsZVNwZWNTaGFwZSA9IHsgdGV4dDogTS5zdHJpbmcoKSB9O1xuaGFyZGVuKFNpbXBsZVNwZWNTaGFwZSk7XG5cbiAgICAgICBjb25zdCBZZXNTaW1wbGVQb3NpdGlvblNoYXBlID0geyB0ZXh0OiBNLnN0cmluZygpIH07JGjNj19vbmNlLlllc1NpbXBsZVBvc2l0aW9uU2hhcGUoWWVzU2ltcGxlUG9zaXRpb25TaGFwZSk7XG5oYXJkZW4oWWVzU2ltcGxlUG9zaXRpb25TaGFwZSk7XG5cbiAgICAgICBjb25zdCBOb1NpbXBsZVBvc2l0aW9uU2hhcGUgPSB7IHRleHQ6IE0uc3RyaW5nKCkgfTskaM2PX29uY2UuTm9TaW1wbGVQb3NpdGlvblNoYXBlKE5vU2ltcGxlUG9zaXRpb25TaGFwZSk7XG5oYXJkZW4oTm9TaW1wbGVQb3NpdGlvblNoYXBlKTtcblxuICAgICAgIGNvbnN0IFNpbXBsZVBvc2l0aW9uc1NoYXBlID0gW1xuICBZZXNTaW1wbGVQb3NpdGlvblNoYXBlLFxuICBOb1NpbXBsZVBvc2l0aW9uU2hhcGUsXG5dOyRozY9fb25jZS5TaW1wbGVQb3NpdGlvbnNTaGFwZShTaW1wbGVQb3NpdGlvbnNTaGFwZSk7XG5oYXJkZW4oU2ltcGxlUG9zaXRpb25zU2hhcGUpO1xuXG4gICAgICAgY29uc3QgU2ltcGxlSXNzdWVTaGFwZSA9IFNpbXBsZVNwZWNTaGFwZTskaM2PX29uY2UuU2ltcGxlSXNzdWVTaGFwZShTaW1wbGVJc3N1ZVNoYXBlKTtcbmhhcmRlbihTaW1wbGVJc3N1ZVNoYXBlKTtcblxuICAgICAgIGNvbnN0IFNpbXBsZVF1ZXN0aW9uU3BlY1NoYXBlID0ge1xuICBtZXRob2Q6IENob2ljZU1ldGhvZFNoYXBlLFxuICBpc3N1ZTogU2ltcGxlSXNzdWVTaGFwZSxcbiAgcG9zaXRpb25zOiBNLmFycmF5T2YoeyB0ZXh0OiBNLnN0cmluZygpIH0pLFxuICBlbGVjdGlvblR5cGU6IE0ub3IoJ2VsZWN0aW9uJywgJ3N1cnZleScpLFxuICBtYXhDaG9pY2VzOiBNLmd0ZSgxKSxcbiAgbWF4V2lubmVyczogTS5ndGUoMSksXG4gIGNsb3NpbmdSdWxlOiBDbG9zaW5nUnVsZVNoYXBlLFxuICBxdW9ydW1SdWxlOiBRdW9ydW1SdWxlU2hhcGUsXG4gIHRpZU91dGNvbWU6IE5vU2ltcGxlUG9zaXRpb25TaGFwZSxcbn07JGjNj19vbmNlLlNpbXBsZVF1ZXN0aW9uU3BlY1NoYXBlKFNpbXBsZVF1ZXN0aW9uU3BlY1NoYXBlKTtcbmhhcmRlbihTaW1wbGVRdWVzdGlvblNwZWNTaGFwZSk7XG5cbiAgICAgICBjb25zdCBTaW1wbGVRdWVzdGlvbkRldGFpbHNTaGFwZSA9IHtcbiAgLi4uU2ltcGxlUXVlc3Rpb25TcGVjU2hhcGUsXG4gIHF1ZXN0aW9uSGFuZGxlOiBtYWtlSGFuZGxlU2hhcGUoJ1F1ZXN0aW9uJyksXG4gIGNvdW50ZXJJbnN0YW5jZTogSW5zdGFuY2VIYW5kbGVTaGFwZSxcbn07JGjNj19vbmNlLlNpbXBsZVF1ZXN0aW9uRGV0YWlsc1NoYXBlKFNpbXBsZVF1ZXN0aW9uRGV0YWlsc1NoYXBlKTtcbmhhcmRlbihTaW1wbGVRdWVzdGlvbkRldGFpbHNTaGFwZSk7XG5cbiAgICAgICBjb25zdCBRdWVzdGlvblNwZWNTaGFwZSA9IE0ub3IoXG4gIEFwaUludm9jYXRpb25RdWVzdGlvblNwZWNTaGFwZSxcbiAgT2ZmZXJGaWx0ZXJRdWVzdGlvblNwZWNTaGFwZSxcbiAgUGFyYW1DaGFuZ2VzUXVlc3Rpb25TcGVjU2hhcGUsXG4gIFNpbXBsZVF1ZXN0aW9uU3BlY1NoYXBlLFxuKTskaM2PX29uY2UuUXVlc3Rpb25TcGVjU2hhcGUoUXVlc3Rpb25TcGVjU2hhcGUpO1xuXG4gICAgICAgY29uc3QgUG9zaXRpb25TaGFwZSA9IE0ub3IoXG4gIFllc0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlLFxuICBOb0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlLFxuICBZZXNPZmZlckZpbHRlclBvc2l0aW9uU2hhcGUsXG4gIE5vT2ZmZXJGaWx0ZXJQb3NpdGlvblNoYXBlLFxuICBZZXNTaW1wbGVQb3NpdGlvblNoYXBlLFxuICBOb1NpbXBsZVBvc2l0aW9uU2hhcGUsXG4gIFllc1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUsXG4gIE5vUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSxcbik7JGjNj19vbmNlLlBvc2l0aW9uU2hhcGUoUG9zaXRpb25TaGFwZSk7XG5cbiAgICAgICBjb25zdCBRdWVzdGlvbkhhbmRsZVNoYXBlID0gbWFrZUhhbmRsZVNoYXBlKCdxdWVzdGlvbicpO1xuXG4vKiBUT0RPKGhpYmJlcnQpOiBhZGQgZGV0YWlsczsgbW92ZSB0byBhIG1vcmUgYXBwcm9wcmlhdGUgbG9jYXRpb24qLyRozY9fb25jZS5RdWVzdGlvbkhhbmRsZVNoYXBlKFF1ZXN0aW9uSGFuZGxlU2hhcGUpO1xuICAgICAgIGNvbnN0IEludml0YXRpb25TaGFwZSA9IE0ucmVtb3RhYmxlKCdJbnZpdGF0aW9uJyk7XG5cbi8qIFhYWCBJIHdhbnQgdG8gYWRkIHF1ZXN0aW9uSGFuZGxlIGFuZCBjb3VudGVySW5zdGFuY2UgdG8qL1xuLyogUGFyYW1DaGFuZ2VzUXVlc3Rpb25TcGVjU2hhcGUuIEkgZG9uJ3Qgc2VlIGFueSBhbHRlcm5hdGl2ZSB0byBhZGRpbmcgdGhlKi9cbi8qIG1ldGhvZHMgdG8gZWFjaCBtZW1iZXIgc2VwYXJhdGVseSovJGjNj19vbmNlLkludml0YXRpb25TaGFwZShJbnZpdGF0aW9uU2hhcGUpO1xuICAgICAgIGNvbnN0IFF1ZXN0aW9uRGV0YWlsc1NoYXBlID0gTS5vcihcbiAgUGFyYW1DaGFuZ2VzUXVlc3Rpb25EZXRhaWxzU2hhcGUsXG4gIEFwaUludm9jYXRpb25RdWVzdGlvbkRldGFpbHNTaGFwZSxcbiAgT2ZmZXJGaWx0ZXJRdWVzdGlvbkRldGFpbHNTaGFwZSxcbiAgU2ltcGxlUXVlc3Rpb25EZXRhaWxzU2hhcGUsXG4pOyRozY9fb25jZS5RdWVzdGlvbkRldGFpbHNTaGFwZShRdWVzdGlvbkRldGFpbHNTaGFwZSk7XG5cbiAgICAgICBjb25zdCBFbGVjdG9yYXRlUHVibGljSSA9IE0uaW50ZXJmYWNlKCdDb21taXR0ZWUgUHVibGljRmFjZXQnLCB7XG4gIGdldFF1ZXN0aW9uU3Vic2NyaWJlcjogTS5jYWxsKCkucmV0dXJucyhTdWJzY3JpYmVyU2hhcGUpLFxuICBnZXRPcGVuUXVlc3Rpb25zOiBNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgZ2V0TmFtZTogTS5jYWxsKCkucmV0dXJucyhNLnN0cmluZygpKSxcbiAgZ2V0SW5zdGFuY2U6IE0uY2FsbCgpLnJldHVybnMoSW5zdGFuY2VIYW5kbGVTaGFwZSksXG4gIGdldFF1ZXN0aW9uOiBNLmNhbGwoUXVlc3Rpb25IYW5kbGVTaGFwZSkucmV0dXJucyhNLnByb21pc2UoKSksXG59KTskaM2PX29uY2UuRWxlY3RvcmF0ZVB1YmxpY0koRWxlY3RvcmF0ZVB1YmxpY0kpO1xuY29uc3QgRWxlY3RvcmF0ZVB1YmxpY1NoYXBlID0gTS5yZW1vdGFibGUoJ0VsZWN0b3JhdGVQdWJsaWMnKTtcblxuICAgICAgIGNvbnN0IEVsZWN0b3JhdGVDcmVhdG9ySSA9IE0uaW50ZXJmYWNlKCdDb21taXR0ZWUgQWRtaW5GYWNldCcsIHtcbiAgZ2V0UG9zZXJJbnZpdGF0aW9uOiBNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgYWRkUXVlc3Rpb246IE0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlLCBRdWVzdGlvblNwZWNTaGFwZSkucmV0dXJucyhcbiAgICBNLnByb21pc2UoKSxcbiAgKSxcbiAgZ2V0Vm90ZXJJbnZpdGF0aW9uczogTS5jYWxsKCkucmV0dXJucyhNLmFycmF5T2YoTS5wcm9taXNlKCkpKSxcbiAgZ2V0UXVlc3Rpb25TdWJzY3JpYmVyOiBNLmNhbGwoKS5yZXR1cm5zKFN1YnNjcmliZXJTaGFwZSksXG4gIGdldFB1YmxpY0ZhY2V0OiBNLmNhbGwoKS5yZXR1cm5zKEVsZWN0b3JhdGVQdWJsaWNTaGFwZSksXG59KTskaM2PX29uY2UuRWxlY3RvcmF0ZUNyZWF0b3JJKEVsZWN0b3JhdGVDcmVhdG9ySSk7XG5cbiAgICAgICBjb25zdCBRdWVzdGlvblN0YXRzU2hhcGUgPSB7XG4gIHNwb2lsZWQ6IE0ubmF0KCksXG4gIHZvdGVzOiBNLm5hdCgpLFxuICByZXN1bHRzOiBNLmFycmF5T2YoeyBwb3NpdGlvbjogUG9zaXRpb25TaGFwZSwgdG90YWw6IE0ubmF0KCkgfSksXG59OyRozY9fb25jZS5RdWVzdGlvblN0YXRzU2hhcGUoUXVlc3Rpb25TdGF0c1NoYXBlKTtcbmhhcmRlbihRdWVzdGlvblN0YXRzU2hhcGUpO1xuXG4gICAgICAgY29uc3QgUXVlc3Rpb25JID0gTS5pbnRlcmZhY2UoJ1F1ZXN0aW9uJywge1xuICBnZXRWb3RlQ291bnRlcjogTS5jYWxsKCkucmV0dXJucyhJbnN0YW5jZUhhbmRsZVNoYXBlKSxcbiAgZ2V0RGV0YWlsczogTS5jYWxsKCkucmV0dXJucyhRdWVzdGlvbkRldGFpbHNTaGFwZSksXG59KTskaM2PX29uY2UuUXVlc3Rpb25JKFF1ZXN0aW9uSSk7XG5jb25zdCBRdWVzdGlvblNoYXBlID0gTS5yZW1vdGFibGUoJ1F1ZXN0aW9uJyk7XG5cbiAgICAgICBjb25zdCBCaW5hcnlWb3RlQ291bnRlclB1YmxpY0kgPSBNLmludGVyZmFjZShcbiAgJ0JpbmFyeVZvdGVDb3VudGVyIFB1YmxpY0ZhY2V0JyxcbiAge1xuICAgIGdldFF1ZXN0aW9uOiBNLmNhbGwoKS5yZXR1cm5zKFF1ZXN0aW9uU2hhcGUpLFxuICAgIGlzT3BlbjogTS5jYWxsKCkucmV0dXJucyhNLmJvb2xlYW4oKSksXG4gICAgZ2V0T3V0Y29tZTogTS5jYWxsKCkucmV0dXJucyhNLmVyZWYoTS5wcm9taXNlKCkpKSxcbiAgICBnZXRTdGF0czogTS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgZ2V0RGV0YWlsczogTS5jYWxsKCkucmV0dXJucyhRdWVzdGlvbkRldGFpbHNTaGFwZSksXG4gICAgZ2V0SW5zdGFuY2U6IE0uY2FsbCgpLnJldHVybnMoSW5zdGFuY2VIYW5kbGVTaGFwZSksXG4gIH0sXG4pOyRozY9fb25jZS5CaW5hcnlWb3RlQ291bnRlclB1YmxpY0koQmluYXJ5Vm90ZUNvdW50ZXJQdWJsaWNJKTtcblxuICAgICAgIGNvbnN0IFZvdGVySGFuZGxlID0gTS5yZW1vdGFibGUoKTskaM2PX29uY2UuVm90ZXJIYW5kbGUoVm90ZXJIYW5kbGUpO1xuICAgICAgIGNvbnN0IEJpbmFyeVZvdGVDb3VudGVyQWRtaW5JID0gTS5pbnRlcmZhY2UoXG4gICdCaW5hcnlWb3RlQ291bnRlciBBZG1pbkZhY2V0JyxcbiAge1xuICAgIHN1Ym1pdFZvdGU6IE0uY2FsbChWb3RlckhhbmRsZSwgTS5hcnJheU9mKFBvc2l0aW9uU2hhcGUpKVxuICAgICAgLm9wdGlvbmFsKE0ubmF0KCkpXG4gICAgICAucmV0dXJucyh7IGNob3NlbjogUG9zaXRpb25TaGFwZSwgc2hhcmVzOiBNLm5hdCgpIH0pLFxuICB9LFxuKTskaM2PX29uY2UuQmluYXJ5Vm90ZUNvdW50ZXJBZG1pbkkoQmluYXJ5Vm90ZUNvdW50ZXJBZG1pbkkpO1xuXG4gICAgICAgY29uc3QgQmluYXJ5Vm90ZUNvdW50ZXJDbG9zZUkgPSBNLmludGVyZmFjZShcbiAgJ0JpbmFyeVZvdGVDb3VudGVyIENsb3NlRmFjZXQnLFxuICB7XG4gICAgY2xvc2VWb3Rpbmc6IE0uY2FsbCgpLnJldHVybnMoKSxcbiAgfSxcbik7JGjNj19vbmNlLkJpbmFyeVZvdGVDb3VudGVyQ2xvc2VJKEJpbmFyeVZvdGVDb3VudGVyQ2xvc2VJKTtcblxuICAgICAgIGNvbnN0IFZvdGVDb3VudGVyUHVibGljSSA9IE0uaW50ZXJmYWNlKCdWb3RlQ291bnRlciBQdWJsaWNGYWNldCcsIHtcbiAgZ2V0UXVlc3Rpb246IE0uY2FsbCgpLnJldHVybnMoUXVlc3Rpb25TaGFwZSksXG4gIGlzT3BlbjogTS5jYWxsKCkucmV0dXJucyhNLmJvb2xlYW4oKSksXG4gIGdldE91dGNvbWU6IE0uY2FsbCgpLnJldHVybnMoTS5lcmVmKE0ucHJvbWlzZSgpKSksXG4gIGdldFN0YXRzOiBNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgZ2V0RGV0YWlsczogTS5jYWxsKCkucmV0dXJucyhRdWVzdGlvbkRldGFpbHNTaGFwZSksXG4gIGdldEluc3RhbmNlOiBNLmNhbGwoKS5yZXR1cm5zKEluc3RhbmNlSGFuZGxlU2hhcGUpLFxufSk7JGjNj19vbmNlLlZvdGVDb3VudGVyUHVibGljSShWb3RlQ291bnRlclB1YmxpY0kpO1xuXG4gICAgICAgY29uc3QgVm90ZUNvdW50ZXJBZG1pbkkgPSBNLmludGVyZmFjZSgnVm90ZUNvdW50ZXIgQWRtaW5GYWNldCcsIHtcbiAgc3VibWl0Vm90ZTogTS5jYWxsKFZvdGVySGFuZGxlLCBNLmFycmF5T2YoUG9zaXRpb25TaGFwZSkpXG4gICAgLm9wdGlvbmFsKE0ubmF0KCkpXG4gICAgLnJldHVybnMoeyBjaG9zZW46IE0uYXJyYXlPZihQb3NpdGlvblNoYXBlKSwgc2hhcmVzOiBNLm5hdCgpIH0pLFxufSk7JGjNj19vbmNlLlZvdGVDb3VudGVyQWRtaW5JKFZvdGVDb3VudGVyQWRtaW5JKTtcblxuICAgICAgIGNvbnN0IFZvdGVDb3VudGVyQ2xvc2VJID0gTS5pbnRlcmZhY2UoJ1ZvdGVDb3VudGVyIENsb3NlRmFjZXQnLCB7XG4gIGNsb3NlVm90aW5nOiBNLmNhbGwoKS5yZXR1cm5zKCksXG59KTskaM2PX29uY2UuVm90ZUNvdW50ZXJDbG9zZUkoVm90ZUNvdW50ZXJDbG9zZUkpO1xuXG4gICAgICAgY29uc3QgR292ZXJub3JGYWNldFNoYXBlID0ge1xuICBnZXRQYXJhbU1nclJldHJpZXZlcjogTS5jYWxsKCkucmV0dXJucyhNLnJlbW90YWJsZSgncGFyYW1SZXRyaWV2ZXInKSksXG4gIGdldEludml0YXRpb246IE0uY2FsbCgpLnJldHVybnMoSW52aXRhdGlvblNoYXBlKSxcbiAgZ2V0TGltaXRlZENyZWF0b3JGYWNldDogTS5jYWxsKCkucmV0dXJucyhNLnJlbW90YWJsZSgpKSxcbiAgZ2V0R292ZXJuZWRBcGlzOiBNLmNhbGwoKS5yZXR1cm5zKE0ucmVtb3RhYmxlKCdnb3Zlcm5lZEFQSXMnKSksXG4gIGdldEdvdmVybmVkQXBpTmFtZXM6IE0uY2FsbCgpLnJldHVybnMoTS5hcnJheU9mKE0uc3RyaW5nKCkpKSxcbiAgc2V0T2ZmZXJGaWx0ZXI6IE0uY2FsbChNLmFycmF5T2YoTS5zdHJpbmcoKSkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxufTskaM2PX29uY2UuR292ZXJub3JGYWNldFNoYXBlKEdvdmVybm9yRmFjZXRTaGFwZSk7XG5oYXJkZW4oR292ZXJub3JGYWNldFNoYXBlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkNob2ljZU1ldGhvZFNoYXBlIjpbIkNob2ljZU1ldGhvZFNoYXBlIl0sIlF1b3J1bVJ1bGVTaGFwZSI6WyJRdW9ydW1SdWxlU2hhcGUiXSwiRWxlY3Rpb25UeXBlU2hhcGUiOlsiRWxlY3Rpb25UeXBlU2hhcGUiXSwiQ2xvc2luZ1J1bGVTaGFwZSI6WyJDbG9zaW5nUnVsZVNoYXBlIl0sIlllc09mZmVyRmlsdGVyUG9zaXRpb25TaGFwZSI6WyJZZXNPZmZlckZpbHRlclBvc2l0aW9uU2hhcGUiXSwiTm9PZmZlckZpbHRlclBvc2l0aW9uU2hhcGUiOlsiTm9PZmZlckZpbHRlclBvc2l0aW9uU2hhcGUiXSwiT2ZmZXJGaWx0ZXJQb3NpdGlvbnNTaGFwZSI6WyJPZmZlckZpbHRlclBvc2l0aW9uc1NoYXBlIl0sIk9mZmVyRmlsdGVySXNzdWVTaGFwZSI6WyJPZmZlckZpbHRlcklzc3VlU2hhcGUiXSwiT2ZmZXJGaWx0ZXJRdWVzdGlvblNwZWNTaGFwZSI6WyJPZmZlckZpbHRlclF1ZXN0aW9uU3BlY1NoYXBlIl0sIk9mZmVyRmlsdGVyUXVlc3Rpb25EZXRhaWxzU2hhcGUiOlsiT2ZmZXJGaWx0ZXJRdWVzdGlvbkRldGFpbHNTaGFwZSJdLCJQYXJhbUNoYW5nZXNTcGVjU2hhcGUiOlsiUGFyYW1DaGFuZ2VzU3BlY1NoYXBlIl0sIlllc1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUiOlsiWWVzUGFyYW1DaGFuZ2VzUG9zaXRpb25TaGFwZSJdLCJOb1BhcmFtQ2hhbmdlc1Bvc2l0aW9uU2hhcGUiOlsiTm9QYXJhbUNoYW5nZXNQb3NpdGlvblNoYXBlIl0sIlBhcmFtQ2hhbmdlc1Bvc2l0aW9uc1NoYXBlIjpbIlBhcmFtQ2hhbmdlc1Bvc2l0aW9uc1NoYXBlIl0sIlBhcmFtUGF0aFNoYXBlIjpbIlBhcmFtUGF0aFNoYXBlIl0sIlBhcmFtQ2hhbmdlc0lzc3VlU2hhcGUiOlsiUGFyYW1DaGFuZ2VzSXNzdWVTaGFwZSJdLCJQYXJhbUNoYW5nZXNRdWVzdGlvblNwZWNTaGFwZSI6WyJQYXJhbUNoYW5nZXNRdWVzdGlvblNwZWNTaGFwZSJdLCJQYXJhbUNoYW5nZXNRdWVzdGlvbkRldGFpbHNTaGFwZSI6WyJQYXJhbUNoYW5nZXNRdWVzdGlvbkRldGFpbHNTaGFwZSJdLCJZZXNBcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSI6WyJZZXNBcGlJbnZvY2F0aW9uUG9zaXRpb25TaGFwZSJdLCJOb0FwaUludm9jYXRpb25Qb3NpdGlvblNoYXBlIjpbIk5vQXBpSW52b2NhdGlvblBvc2l0aW9uU2hhcGUiXSwiQXBpSW52b2NhdGlvblBvc2l0aW9uc1NoYXBlIjpbIkFwaUludm9jYXRpb25Qb3NpdGlvbnNTaGFwZSJdLCJBcGlJbnZvY2F0aW9uUXVlc3Rpb25TcGVjU2hhcGUiOlsiQXBpSW52b2NhdGlvblF1ZXN0aW9uU3BlY1NoYXBlIl0sIkFwaUludm9jYXRpb25RdWVzdGlvbkRldGFpbHNTaGFwZSI6WyJBcGlJbnZvY2F0aW9uUXVlc3Rpb25EZXRhaWxzU2hhcGUiXSwiWWVzU2ltcGxlUG9zaXRpb25TaGFwZSI6WyJZZXNTaW1wbGVQb3NpdGlvblNoYXBlIl0sIk5vU2ltcGxlUG9zaXRpb25TaGFwZSI6WyJOb1NpbXBsZVBvc2l0aW9uU2hhcGUiXSwiU2ltcGxlUG9zaXRpb25zU2hhcGUiOlsiU2ltcGxlUG9zaXRpb25zU2hhcGUiXSwiU2ltcGxlSXNzdWVTaGFwZSI6WyJTaW1wbGVJc3N1ZVNoYXBlIl0sIlNpbXBsZVF1ZXN0aW9uU3BlY1NoYXBlIjpbIlNpbXBsZVF1ZXN0aW9uU3BlY1NoYXBlIl0sIlNpbXBsZVF1ZXN0aW9uRGV0YWlsc1NoYXBlIjpbIlNpbXBsZVF1ZXN0aW9uRGV0YWlsc1NoYXBlIl0sIlF1ZXN0aW9uU3BlY1NoYXBlIjpbIlF1ZXN0aW9uU3BlY1NoYXBlIl0sIlBvc2l0aW9uU2hhcGUiOlsiUG9zaXRpb25TaGFwZSJdLCJRdWVzdGlvbkhhbmRsZVNoYXBlIjpbIlF1ZXN0aW9uSGFuZGxlU2hhcGUiXSwiSW52aXRhdGlvblNoYXBlIjpbIkludml0YXRpb25TaGFwZSJdLCJRdWVzdGlvbkRldGFpbHNTaGFwZSI6WyJRdWVzdGlvbkRldGFpbHNTaGFwZSJdLCJFbGVjdG9yYXRlUHVibGljSSI6WyJFbGVjdG9yYXRlUHVibGljSSJdLCJFbGVjdG9yYXRlQ3JlYXRvckkiOlsiRWxlY3RvcmF0ZUNyZWF0b3JJIl0sIlF1ZXN0aW9uU3RhdHNTaGFwZSI6WyJRdWVzdGlvblN0YXRzU2hhcGUiXSwiUXVlc3Rpb25JIjpbIlF1ZXN0aW9uSSJdLCJCaW5hcnlWb3RlQ291bnRlclB1YmxpY0kiOlsiQmluYXJ5Vm90ZUNvdW50ZXJQdWJsaWNJIl0sIlZvdGVySGFuZGxlIjpbIlZvdGVySGFuZGxlIl0sIkJpbmFyeVZvdGVDb3VudGVyQWRtaW5JIjpbIkJpbmFyeVZvdGVDb3VudGVyQWRtaW5JIl0sIkJpbmFyeVZvdGVDb3VudGVyQ2xvc2VJIjpbIkJpbmFyeVZvdGVDb3VudGVyQ2xvc2VJIl0sIlZvdGVDb3VudGVyUHVibGljSSI6WyJWb3RlQ291bnRlclB1YmxpY0kiXSwiVm90ZUNvdW50ZXJBZG1pbkkiOlsiVm90ZUNvdW50ZXJBZG1pbkkiXSwiVm90ZUNvdW50ZXJDbG9zZUkiOlsiVm90ZUNvdW50ZXJDbG9zZUkiXSwiR292ZXJub3JGYWNldFNoYXBlIjpbIkdvdmVybm9yRmFjZXRTaGFwZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAAnAAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABpMRidJDAAASQwAACwAAABAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvdmFsaWRhdG9ycy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9ldmVudHVhbC1zZW5kIl0sImV4cG9ydHMiOlsiYXNzZXJ0Q29udHJhY3RFbGVjdG9yYXRlIiwiYXNzZXJ0Q29udHJhY3RHb3Zlcm5hbmNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxxLEU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cbi8qKlxuICogQGltcG9ydCB7Vm90ZUNvdW50ZXJDcmVhdG9yRmFjZXQsIFZvdGVDb3VudGVyUHVibGljRmFjZXQsIFF1ZXN0aW9uU3BlYywgT3V0Y29tZVJlY29yZCwgQWRkUXVlc3Rpb24sIEFkZFF1ZXN0aW9uUmV0dXJuLCBBc3NlcnRDb250cmFjdEdvdmVybmFuY2UsIEFzc2VydENvbnRyYWN0RWxlY3RvcmF0ZX0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKi9cblxuLyoqXG4gKiBBc3NlcnQgdGhhdCB0aGUgZ292ZXJuZWQgY29udHJhY3Qgd2FzIHN0YXJ0ZWQgYnkgdGhlIGdvdmVybm9yLiBUaHJvd3MgaWZcbiAqIGVpdGhlciBkaXJlY3Rpb24gY2FuJ3QgYmUgZXN0YWJsaXNoZWQuIElmIHRoZSBjYWxsIHN1Y2NlZWRzLCB0aGVuIHRoZVxuICogZ292ZXJub3IgZ290IGV4Y2x1c2l2ZSBhY2Nlc3MgdG8gdGhlIGdvdmVybmVkIGNvbnRyYWN0J3MgY3JlYXRvckZhY2V0LCBhbmRcbiAqIGNhbiBiZSB0cnVzdGVkIHRvIG1hbmFnZSBpdHMgcGFyYW1ldGVycy5cbiAqXG4gKiBAdHlwZSB7QXNzZXJ0Q29udHJhY3RHb3Zlcm5hbmNlfVxuICovXG5jb25zdCBhc3NlcnRDb250cmFjdEdvdmVybmFuY2UgPSBhc3luYyAoXG4gIHpvZSxcbiAgYWxsZWdlZEdvdmVybmVkLFxuICBhbGxlZ2VkR292ZXJub3IsXG4gIGNvbnRyYWN0R292ZXJub3JJbnN0YWxsYXRpb24sXG4pID0+IHtcbiAgY29uc3QgYWxsZWdlZEdvdmVybm9yUEYgPSBFKHpvZSkuZ2V0UHVibGljRmFjZXQoYWxsZWdlZEdvdmVybm9yKTtcbiAgY29uc3QgcmVhbEdvdmVybmVkUCA9IEUoYWxsZWdlZEdvdmVybm9yUEYpLmdldEdvdmVybmVkQ29udHJhY3QoKTtcbiAgY29uc3QgYWxsZWdlZEdvdmVybmVkVGVybXNQID0gRSh6b2UpLmdldFRlcm1zKGFsbGVnZWRHb3Zlcm5lZCk7XG5cbiAgY29uc3QgW3sgZWxlY3Rpb25NYW5hZ2VyOiByZWFsR292ZXJub3JJbnN0YW5jZSB9LCByZWFsR292ZXJuZWRJbnN0YW5jZV0gPVxuICAgIGF3YWl0IFByb21pc2UuYWxsKFthbGxlZ2VkR292ZXJuZWRUZXJtc1AsIHJlYWxHb3Zlcm5lZFBdKTtcblxuICBhc3NlcnQoXG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBYWFggdHlwZXMqL1xuICAgIGFsbGVnZWRHb3Zlcm5vciA9PT0gcmVhbEdvdmVybm9ySW5zdGFuY2UsXG4gICAgJ1RoZSBhbGxlZ2VkIGdvdmVybm9yIGRpZCBub3QgbWF0Y2ggdGhlIGdvdmVybm9yIHJldHJpZXZlZCBmcm9tIHRoZSBnb3Zlcm5lZCBjb250cmFjdCcsXG4gICk7XG5cbiAgYXNzZXJ0KFxuICAgIGFsbGVnZWRHb3Zlcm5lZCA9PT0gcmVhbEdvdmVybmVkSW5zdGFuY2UsXG4gICAgJ1RoZSBhbGxlZ2VkIGdvdmVybmVkIGRpZCBub3QgbWF0Y2ggdGhlIGdvdmVybmVkIGNvbnRyYWN0IHJldHJpZXZlZCBmcm9tIHRoZSBnb3Zlcm5vcicsXG4gICk7XG5cbiAgY29uc3QgZ292ZXJub3JJbnN0YWxsYXRpb25Gcm9tR292ZXJuZWQgPVxuICAgIGF3YWl0IEUoem9lKS5nZXRJbnN0YWxsYXRpb25Gb3JJbnN0YW5jZShyZWFsR292ZXJub3JJbnN0YW5jZSk7XG5cbiAgYXNzZXJ0KFxuICAgIGdvdmVybm9ySW5zdGFsbGF0aW9uRnJvbUdvdmVybmVkID09PSBjb250cmFjdEdvdmVybm9ySW5zdGFsbGF0aW9uLFxuICAgICdUaGUgZ292ZXJuZWQgY29udHJhY3QgaXMgbm90IGdvdmVybmVkIGJ5IGFuIGluc3RhbmNlIG9mIHRoZSBwcm92aWRlZCBpbnN0YWxsYXRpb24uJyxcbiAgKTtcblxuICByZXR1cm4geyBnb3Zlcm5vcjogcmVhbEdvdmVybm9ySW5zdGFuY2UsIGdvdmVybmVkOiByZWFsR292ZXJuZWRJbnN0YW5jZSB9O1xufTtcblxuLyoqXG4gKiBBc3NlcnQgdGhhdCB0aGUgZ292ZXJub3IgcmVmZXJzIHRvIHRoZSBpbmRpY2F0ZWQgZWxlY3RvcmF0ZS5cbiAqXG4gKiBAdHlwZSB7QXNzZXJ0Q29udHJhY3RFbGVjdG9yYXRlfVxuICovJGjNj19vbmNlLmFzc2VydENvbnRyYWN0R292ZXJuYW5jZShhc3NlcnRDb250cmFjdEdvdmVybmFuY2UpO1xuY29uc3QgYXNzZXJ0Q29udHJhY3RFbGVjdG9yYXRlID0gYXN5bmMgKFxuICB6b2UsXG4gIGFsbGVnZWRHb3Zlcm5vcixcbiAgYWxsZWdlZEVsZWN0b3JhdGUsXG4pID0+IHtcbiAgY29uc3QgYWxsZWdlZEdvdmVybm9yUEYgPSBFKHpvZSkuZ2V0UHVibGljRmFjZXQoYWxsZWdlZEdvdmVybm9yKTtcbiAgY29uc3QgZWxlY3RvcmF0ZSA9IGF3YWl0IEUoYWxsZWdlZEdvdmVybm9yUEYpLmdldEVsZWN0b3JhdGUoKTtcbiAgZWxlY3RvcmF0ZSA9PT0gYWxsZWdlZEVsZWN0b3JhdGUgfHxcbiAgICBGYWlsYFRoZSBhbGxlZ2VkRWxlY3RvcmF0ZSBkaWRuJ3QgbWF0Y2ggdGhlIGFjdHVhbCAke3EoZWxlY3RvcmF0ZSl9YDtcblxuICByZXR1cm4gdHJ1ZTtcbn07JGjNj19vbmNlLmFzc2VydENvbnRyYWN0RWxlY3RvcmF0ZShhc3NlcnRDb250cmFjdEVsZWN0b3JhdGUpO1xuXG5oYXJkZW4oYXNzZXJ0Q29udHJhY3RHb3Zlcm5hbmNlKTtcbmhhcmRlbihhc3NlcnRDb250cmFjdEVsZWN0b3JhdGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0Q29udHJhY3RHb3Zlcm5hbmNlIjpbImFzc2VydENvbnRyYWN0R292ZXJuYW5jZSJdLCJhc3NlcnRDb250cmFjdEVsZWN0b3JhdGUiOlsiYXNzZXJ0Q29udHJhY3RFbGVjdG9yYXRlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAC7hJHKSHwAAkh8AAEIAAABAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE2LjEvc3JjL3ByaWNlL2ZsdXhBZ2dyZWdhdG9yQ29udHJhY3QuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9lcnRwIiwiQGFnb3JpYy9nb3Zlcm5hbmNlIiwiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvaW50ZXJuYWwvc3JjL21hcnNoYWwvd3JhcC1tYXJzaGFsbGVyLmpzIiwiQGFnb3JpYy9ub3RpZmllciIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L2R1cmFiaWxpdHkuanMiLCJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L3JlY29yZGVyLmpzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIi4uL3Byb3Bvc2Fscy91dGlscy5qcyIsIi4vZmx1eEFnZ3JlZ2F0b3JLaXQuanMiXSwiZXhwb3J0cyI6WyJtZXRhIiwic3RhcnQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBwcmVwYXJlSXNzdWVyS2l0LGhhbmRsZVBhcmFtR292ZXJuYW5jZSxtYWtlVHJhY2VyLFN0b3JhZ2VOb2RlU2hhcGUsd3JhcFJlbW90ZU1hcnNoYWxsZXIscHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0LE0scHJvdmlkZUFsbCxwcmVwYXJlUmVjb3JkZXIsRSxyZXNlcnZlVGhlbkRlcG9zaXQscHJlcGFyZUZsdXhBZ2dyZWdhdG9yS2l0OyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJwcmVwYXJlSXNzdWVyS2l0XCIsWyRozY9fYSA9PiAocHJlcGFyZUlzc3VlcktpdCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvZ292ZXJuYW5jZVwiLCBbW1wiaGFuZGxlUGFyYW1Hb3Zlcm5hbmNlXCIsWyRozY9fYSA9PiAoaGFuZGxlUGFyYW1Hb3Zlcm5hbmNlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wibWFrZVRyYWNlclwiLFskaM2PX2EgPT4gKG1ha2VUcmFjZXIgPSAkaM2PX2EpXV0sW1wiU3RvcmFnZU5vZGVTaGFwZVwiLFskaM2PX2EgPT4gKFN0b3JhZ2VOb2RlU2hhcGUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsL3NyYy9tYXJzaGFsL3dyYXAtbWFyc2hhbGxlci5qc1wiLCBbW1wid3JhcFJlbW90ZU1hcnNoYWxsZXJcIixbJGjNj19hID0+ICh3cmFwUmVtb3RlTWFyc2hhbGxlciA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdFwiLFskaM2PX2EgPT4gKHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9kdXJhYmlsaXR5LmpzXCIsIFtbXCJwcm92aWRlQWxsXCIsWyRozY9fYSA9PiAocHJvdmlkZUFsbCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvcmVjb3JkZXIuanNcIiwgW1tcInByZXBhcmVSZWNvcmRlclwiLFskaM2PX2EgPT4gKHByZXBhcmVSZWNvcmRlciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiLi4vcHJvcG9zYWxzL3V0aWxzLmpzXCIsIFtbXCJyZXNlcnZlVGhlbkRlcG9zaXRcIixbJGjNj19hID0+IChyZXNlcnZlVGhlbkRlcG9zaXQgPSAkaM2PX2EpXV1dXSxbXCIuL2ZsdXhBZ2dyZWdhdG9yS2l0LmpzXCIsIFtbXCJwcmVwYXJlRmx1eEFnZ3JlZ2F0b3JLaXRcIixbJGjNj19hID0+IChwcmVwYXJlRmx1eEFnZ3JlZ2F0b3JLaXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB0cmFjZSA9IG1ha2VUcmFjZXIoJ0ZsdXhBZ2cnLCBmYWxzZSk7XG4vKipcbiAqIEBpbXBvcnQge0JhZ2dhZ2V9IGZyb20gJ0BhZ29yaWMvdmF0LWRhdGEnXG4gKiBAaW1wb3J0IHtUaW1lclNlcnZpY2V9IGZyb20gJ0BhZ29yaWMvdGltZSdcbiAqIEBpbXBvcnQge1JlbW90ZX0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbCc7XG4gKiBAaW1wb3J0IHtDaGFpbmxpbmtDb25maWd9IGZyb20gJy4vZmx1eEFnZ3JlZ2F0b3JLaXQuanMnO1xuICogQGltcG9ydCB7UHJpb3JpdHlTZW5kZXJzTWFuYWdlcn0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbC9zcmMvcHJpb3JpdHktc2VuZGVycy5qcyc7XG4gKiBAaW1wb3J0IHtOYW1lQWRtaW59IGZyb20gJ0BhZ29yaWMvdmF0cyc7XG4gKiBAaW1wb3J0IHtRdW90ZUtpdH0gZnJvbSAnLi9yb3VuZHNNYW5hZ2VyLmpzJztcbiAqIEBpbXBvcnQge0ludml0YXRpb259IGZyb20gJ0BhZ29yaWMvem9lJztcbiAqIEBpbXBvcnQge0NvbnRyYWN0TWV0YSwgWkNGfSBmcm9tICdAYWdvcmljL3pvZSc7XG4gKiBAaW1wb3J0IHtCcmFuZH0gZnJvbSAnQGFnb3JpYy9lcnRwJztcbiAqIEBpbXBvcnQge0Ftb3VudH0gZnJvbSAnQGFnb3JpYy9lcnRwJztcbiAqIEBpbXBvcnQge01hcnNoYWxsZXJ9IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMnO1xuICogQGltcG9ydCB7U3RvcmFnZU5vZGV9IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMnO1xuICogQGltcG9ydCB7RVJlZn0gZnJvbSAnQGFnb3JpYy92b3cnO1xuICovXG5cbi8qKiBAdHlwZSB7Q29udHJhY3RNZXRhPHR5cGVvZiBzdGFydD59ICovXG4gICAgICAgY29uc3QgbWV0YSA9IHtcbiAgLyogQHRzLWV4cGVjdC1lcnJvciBzcGxpdFJlY29yZCBsb3NlcyB0aGUgcHJvcGVydHkga2V5cyovXG4gIHByaXZhdGVBcmdzU2hhcGU6IE0uc3BsaXRSZWNvcmQoXG4gICAge1xuICAgICAgc3RvcmFnZU5vZGU6IFN0b3JhZ2VOb2RlU2hhcGUsXG4gICAgICBtYXJzaGFsbGVyOiBNLmVyZWYoTS5yZW1vdGFibGUoJ21hcnNoYWxsZXInKSksXG4gICAgICBuYW1lc0J5QWRkcmVzc0FkbWluOiBNLmFueSgpLFxuICAgIH0sXG4gICAge1xuICAgICAgLyogYWx3YXlzIG9wdGlvbmFsLiBYWFggc29tZSBjb2RlIGlzIGluY2x1ZGluZyB0aGUga2V5LCBzZXQgdG8gbnVsbCovXG4gICAgICBoaWdoUHJpb3JpdHlTZW5kZXJzTWFuYWdlcjogTS5vcihcbiAgICAgICAgTS5yZW1vdGFibGUoJ3ByaW9yaXR5U2VuZGVycyBtYW5hZ2VyJyksXG4gICAgICAgIE0ubnVsbCgpLFxuICAgICAgKSxcbiAgICAgIC8qIG9ubHkgbmVjZXNzYXJ5IG9uIGZpcnN0IGludm9jYXRpb24sIG5vdCBzdWJzZXF1ZW50Ki9cbiAgICAgIGluaXRpYWxQb3Nlckludml0YXRpb246IE0ucmVtb3RhYmxlKCdJbnZpdGF0aW9uJyksXG4gICAgfSxcbiAgKSxcbiAgdXBncmFkYWJpbGl0eTogJ2NhblVwZ3JhZGUnLFxufTskaM2PX29uY2UubWV0YShtZXRhKTtcbmhhcmRlbihtZXRhKTtcblxuLyoqXG4gKiBQcmljZUF1dGhvcml0eSBmb3IgdGhlaXIgbWVkaWFuLiBVbmxpa2UgdGhlIHNpbXBsZXIgYHByaWNlQWdncmVnYXRvci5qc2AsXG4gKiB0aGlzIGFwcHJveGltYXRlcyB0aGUgX05vZGUgT3BlcmF0b3IgQWdncmVnYXRpb25fIGxvZ2ljIG9mIFtDaGFpbmxpbmsgcHJpY2VcbiAqIGZlZWRzXShodHRwczovL2Jsb2cuY2hhaW4ubGluay9sZXZlbHMtb2YtZGF0YS1hZ2dyZWdhdGlvbi1pbi1jaGFpbmxpbmstcHJpY2UtZmVlZHMvKS5cbiAqXG4gKiBAcGFyYW0ge1pDRjxcbiAqICAgQ2hhaW5saW5rQ29uZmlnICYge1xuICogICAgIHRpbWVyOiBUaW1lclNlcnZpY2U7XG4gKiAgICAgYnJhbmRJbjogQnJhbmQ8J25hdCc+O1xuICogICAgIGJyYW5kT3V0OiBCcmFuZDwnbmF0Jz47XG4gKiAgICAgZGVzY3JpcHRpb246IHN0cmluZztcbiAqICAgICB1bml0QW1vdW50SW4/OiBBbW91bnQ8J25hdCc+O1xuICogICB9XG4gKiA+fSB6Y2ZcbiAqIEBwYXJhbSB7e1xuICogICBoaWdoUHJpb3JpdHlTZW5kZXJzTWFuYWdlcj86IFByaW9yaXR5U2VuZGVyc01hbmFnZXI7XG4gKiAgIGluaXRpYWxQb3Nlckludml0YXRpb246IEludml0YXRpb247XG4gKiAgIG1hcnNoYWxsZXI6IFJlbW90ZTxNYXJzaGFsbGVyPjtcbiAqICAgbmFtZXNCeUFkZHJlc3NBZG1pbjogRVJlZjxOYW1lQWRtaW4+O1xuICogICBzdG9yYWdlTm9kZTogUmVtb3RlPFN0b3JhZ2VOb2RlPjtcbiAqIH19IHByaXZhdGVBcmdzXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqL1xuICAgICAgIGNvbnN0IHN0YXJ0ID0gYXN5bmMgKHpjZiwgcHJpdmF0ZUFyZ3MsIGJhZ2dhZ2UpID0+IHtcbiAgdHJhY2UoJ3ByZXBhcmUgd2l0aCBiYWdnYWdlIGtleXMnLCBbLi4uYmFnZ2FnZS5rZXlzKCldKTtcblxuICAvKiB4eHggdXNlcyBjb250cmFjdCBiYWdnYWdlIGFzIGlzc3VlckJhZ2FnZSwgYXNzdW1lcyBvbmUgaXNzdWVyIGluIHRoaXMgY29udHJhY3QqL1xuICAvKiogQHR5cGUge1F1b3RlS2l0fSAqL1xuICAvKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuICBjb25zdCBxdW90ZUlzc3VlcktpdCA9IHByZXBhcmVJc3N1ZXJLaXQoXG4gICAgYmFnZ2FnZSxcbiAgICAncXVvdGUnLFxuICAgICdzZXQnLFxuICAgIHVuZGVmaW5lZCxcbiAgICB1bmRlZmluZWQsXG4gICAgeyByZWNvdmVyeVNldHNPcHRpb246ICdub1JlY292ZXJ5U2V0cycgfSxcbiAgKTtcblxuICBjb25zdCB7XG4gICAgaGlnaFByaW9yaXR5U2VuZGVyc01hbmFnZXIsXG4gICAgaW5pdGlhbFBvc2VySW52aXRhdGlvbixcbiAgICBtYXJzaGFsbGVyOiByZW1vdGVNYXJzaGFsbGVyLFxuICAgIG5hbWVzQnlBZGRyZXNzQWRtaW4sXG4gICAgc3RvcmFnZU5vZGUsXG4gIH0gPSBwcml2YXRlQXJncztcblxuICBjb25zdCB7IGRlc2NyaXB0aW9uLCB0aW1lciB9ID0gemNmLmdldFRlcm1zKCk7XG5cbiAgdHJhY2UoJ2F3YWl0ZWQgYXJncycpO1xuXG4gIGNvbnN0IGNhY2hpbmdNYXJzaGFsbGVyID0gd3JhcFJlbW90ZU1hcnNoYWxsZXIocmVtb3RlTWFyc2hhbGxlcik7XG5cbiAgY29uc3QgbWFrZUR1cmFibGVQdWJsaXNoS2l0ID0gcHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0KFxuICAgIGJhZ2dhZ2UsXG4gICAgJ1ByaWNlIEFnZ3JlZ2F0b3IgcHVibGlzaCBraXQnLFxuICApO1xuICBjb25zdCBtYWtlUmVjb3JkZXIgPSBwcmVwYXJlUmVjb3JkZXIoYmFnZ2FnZSwgY2FjaGluZ01hcnNoYWxsZXIpO1xuXG4gIGNvbnN0IG1ha2VGbHV4QWdncmVnYXRvcktpdCA9IGF3YWl0IHByZXBhcmVGbHV4QWdncmVnYXRvcktpdChcbiAgICBiYWdnYWdlLFxuICAgIHpjZixcbiAgICB0aW1lcixcbiAgICBxdW90ZUlzc3VlcktpdCxcbiAgICBzdG9yYWdlTm9kZSxcbiAgICBtYWtlRHVyYWJsZVB1Ymxpc2hLaXQsXG4gICAgbWFrZVJlY29yZGVyLFxuICApO1xuXG4gIGNvbnN0IHsgZmFLaXQgfSA9IGF3YWl0IHByb3ZpZGVBbGwoYmFnZ2FnZSwge1xuICAgIGZhS2l0OiAoKSA9PiBtYWtlRmx1eEFnZ3JlZ2F0b3JLaXQoKSxcbiAgfSk7XG4gIHRyYWNlKCdnb3QgZmFLaXQnLCBmYUtpdCk7XG5cbiAgLyogY2Fubm90IGJlIHN0b3JlZCBpbiBiYWdnYWdlIGJlY2F1c2Ugbm90IGR1cmFibGUqL1xuICAvKiBVTlRJTCBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQzNDMqL1xuICBjb25zdCB7IG1ha2VEdXJhYmxlR292ZXJub3JGYWNldCB9ID0gaGFuZGxlUGFyYW1Hb3Zlcm5hbmNlKFxuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgRklYTUUgaW5jbHVkZSBHb3Zlcm5hbmNlIHBhcmFtcyovXG4gICAgemNmLFxuICAgIGluaXRpYWxQb3Nlckludml0YXRpb24sXG4gICAge1xuICAgICAgLyogTm8gZ292ZXJuZWQgcGFyYW1ldGVycy4gR292ZXJuYW5jZSBqdXN0IGZvciBBUEkgbWV0aG9kcy4qL1xuICAgIH0sXG4gICAgc3RvcmFnZU5vZGUsXG4gICAgY2FjaGluZ01hcnNoYWxsZXIsXG4gICk7XG5cbiAgdHJhY2UoJ2dvdCBtYWtlRHVyYWJsZUdvdmVybm9yRmFjZXQnLCBtYWtlRHVyYWJsZUdvdmVybm9yRmFjZXQpO1xuXG4gIC8qKlxuICogSW5pdGlhbGl6ZSBhIG5ldyBvcmFjbGUgYW5kIHNlbmQgYW4gaW52aXRhdGlvbiB0byBjb250cm9sIGl0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhZGRyXG4gKi9cbiAgY29uc3QgYWRkT3JhY2xlID0gYXN5bmMgYWRkciA9PiB7XG4gICAgdHJhY2UoJ2FkZE9yYWNsZScsIGFkZHIpO1xuICAgIGNvbnN0IGludml0YXRpb24gPSBhd2FpdCBFKGZhS2l0LmNyZWF0b3IpLm1ha2VPcmFjbGVJbnZpdGF0aW9uKGFkZHIpO1xuICAgIC8qIFhYWCBpbXBvcnRlZCBmcm9tICdwcm9wb3NhbHMnIHBhdGgqL1xuICAgIGF3YWl0IHJlc2VydmVUaGVuRGVwb3NpdChcbiAgICAgIGBmbHV4QWdncmVnYXRvciBvcmFjbGUgJHthZGRyfWAsXG4gICAgICBuYW1lc0J5QWRkcmVzc0FkbWluLFxuICAgICAgYWRkcixcbiAgICAgIFtpbnZpdGF0aW9uXSxcbiAgICApO1xuICAgIGF3YWl0IChoaWdoUHJpb3JpdHlTZW5kZXJzTWFuYWdlciAmJlxuICAgICAgRShoaWdoUHJpb3JpdHlTZW5kZXJzTWFuYWdlcikuYWRkKGRlc2NyaXB0aW9uLCBhZGRyKSk7XG4gICAgcmV0dXJuIGBhZGRlZCAke2FkZHJ9YDtcbiAgfTtcblxuICAvKipcbiAqIFJlbW92ZSBhbiBvcmFjbGUgZnJvbSBhZ2dyZWdhdGlvbiBhbmQgZGlzYWJsZSBpdHMgZmFjZXQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGFkZHJcbiAqL1xuICBjb25zdCByZW1vdmVPcmFjbGUgPSBhc3luYyBhZGRyID0+IHtcbiAgICB0cmFjZSgncmVtb3ZlT3JhY2xlJywgYWRkcik7XG4gICAgYXdhaXQgRShmYUtpdC5jcmVhdG9yKS5yZW1vdmVPcmFjbGUoYWRkcik7XG4gICAgYXdhaXQgKGhpZ2hQcmlvcml0eVNlbmRlcnNNYW5hZ2VyICYmXG4gICAgICBFKGhpZ2hQcmlvcml0eVNlbmRlcnNNYW5hZ2VyKS5yZW1vdmUoZGVzY3JpcHRpb24sIGFkZHIpKTtcbiAgICByZXR1cm4gYHJlbW92ZWQgJHthZGRyfWA7XG4gIH07XG5cbiAgY29uc3QgZ292ZXJuZWRBcGlzID0ge1xuICAgIC8qKlxuICogQWRkIHRoZSBzcGVjaWZpZWQgb3JhY2xlcy4gTWF5IHBhcnRpYWxseSBmYWlsLCBzdWNoIHRoYXQgc29tZSBvcmFjbGVzIGFyZVxuICogYWRkZWQgYW5kIG90aGVycyBhcmVuJ3QuXG4gKlxuICogQHBhcmFtIHtzdHJpbmdbXX0gYWRkcnNcbiAqIEByZXR1cm5zIHtQcm9taXNlPFByb21pc2VTZXR0bGVkUmVzdWx0PHN0cmluZz5bXT59XG4gKi9cbiAgICBhZGRPcmFjbGVzOiBhZGRycyA9PiB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKGFkZHJzLm1hcChhZGRPcmFjbGUpKTtcbiAgICB9LFxuICAgIC8qKlxuICogUmVtb3ZlIHRoZSBzcGVjaWZpZWQgb3JhY2xlcy4gTWF5IHBhcnRpYWxseSBmYWlsLCBzdWNoIHRoYXQgc29tZSBvcmFjbGVzXG4gKiBhcmUgcmVtb3ZlZCBhbmQgb3RoZXJzIGFyZW4ndC4gSWYgdGhlIG9yYWNsZSB3YXMgbmV2ZXIgcGFydCBvZiB0aGUgc2V0XG4gKiB0aGF0J3MgYSBQcm9taXNlUmVqZWN0ZWRSZXN1bHRcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBhZGRyc1xuICogQHJldHVybnMge1Byb21pc2U8UHJvbWlzZVNldHRsZWRSZXN1bHQ8c3RyaW5nPltdPn1cbiAqL1xuICAgIHJlbW92ZU9yYWNsZXM6IGFkZHJzID0+IHtcbiAgICAgIHJldHVybiBQcm9taXNlLmFsbFNldHRsZWQoYWRkcnMubWFwKHJlbW92ZU9yYWNsZSkpO1xuICAgIH0sXG4gIH07XG5cbiAgY29uc3QgeyBnb3Zlcm5vckZhY2V0IH0gPSBtYWtlRHVyYWJsZUdvdmVybm9yRmFjZXQoXG4gICAgYmFnZ2FnZSxcbiAgICBmYUtpdC5jcmVhdG9yLFxuICAgIGdvdmVybmVkQXBpcyxcbiAgKTtcbiAgdHJhY2UoJ21hZGUgZ292ZXJub3JGYWNldCcsIGdvdmVybm9yRmFjZXQpO1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGNyZWF0b3JGYWNldDogZ292ZXJub3JGYWNldCxcbiAgICBwdWJsaWNGYWNldDogZmFLaXQucHVibGljLFxuICB9KTtcbn07JGjNj19vbmNlLnN0YXJ0KHN0YXJ0KTtcbmhhcmRlbihzdGFydCk7XG5cbi8qKiBAdHlwZWRlZiB7dHlwZW9mIHN0YXJ0fSBGbHV4U3RhcnRGbiAqL1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWV0YSI6WyJtZXRhIl0sInN0YXJ0IjpbInN0YXJ0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKzWdBVGOAAARjgAAD0AAABAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE2LjEvc3JjL3ByaWNlL2ZsdXhBZ2dyZWdhdG9yS2l0LmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL25vdGlmaWVyIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdFN1cHBvcnQvaW5kZXguanMiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCIsIi4vcHJpY2VPcmFjbGVLaXQuanMiLCIuL3JvdW5kc01hbmFnZXIuanMiXSwiZXhwb3J0cyI6WyJJTlZJVEFUSU9OX01BS0VSU19ERVNDIiwicHJlcGFyZUZsdXhBZ2dyZWdhdG9yS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgQW1vdW50TWF0aCxhc3NlcnRBbGxEZWZpbmVkLG1ha2VUcmFjZXIsbWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIsb2JzZXJ2ZU5vdGlmaWVyLE0sbWFrZVNjYWxhckJpZ01hcFN0b3JlLHByZXBhcmVFeG9DbGFzc0tpdCxkZWZpbmVSZWNvcmRlcktpdCxtYWtlT25ld2F5UHJpY2VBdXRob3JpdHlLaXQsbWFrZVJlY29yZGVyVG9waWMscHJvdmlkZUFsbCxFLEZhcixwcmVwYXJlT3JhY2xlQWRtaW5LaXQscHJlcGFyZVJvdW5kc01hbmFnZXJLaXQ7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudE1hdGhcIixbJGjNj19hID0+IChBbW91bnRNYXRoID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wiYXNzZXJ0QWxsRGVmaW5lZFwiLFskaM2PX2EgPT4gKGFzc2VydEFsbERlZmluZWQgPSAkaM2PX2EpXV0sW1wibWFrZVRyYWNlclwiLFskaM2PX2EgPT4gKG1ha2VUcmFjZXIgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL25vdGlmaWVyXCIsIFtbXCJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlclwiLFskaM2PX2EgPT4gKG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyID0gJGjNj19hKV1dLFtcIm9ic2VydmVOb3RpZmllclwiLFskaM2PX2EgPT4gKG9ic2VydmVOb3RpZmllciA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcIm1ha2VTY2FsYXJCaWdNYXBTdG9yZVwiLFskaM2PX2EgPT4gKG1ha2VTY2FsYXJCaWdNYXBTdG9yZSA9ICRozY9fYSldXSxbXCJwcmVwYXJlRXhvQ2xhc3NLaXRcIixbJGjNj19hID0+IChwcmVwYXJlRXhvQ2xhc3NLaXQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzXCIsIFtbXCJkZWZpbmVSZWNvcmRlcktpdFwiLFskaM2PX2EgPT4gKGRlZmluZVJlY29yZGVyS2l0ID0gJGjNj19hKV1dLFtcIm1ha2VPbmV3YXlQcmljZUF1dGhvcml0eUtpdFwiLFskaM2PX2EgPT4gKG1ha2VPbmV3YXlQcmljZUF1dGhvcml0eUtpdCA9ICRozY9fYSldXSxbXCJtYWtlUmVjb3JkZXJUb3BpY1wiLFskaM2PX2EgPT4gKG1ha2VSZWNvcmRlclRvcGljID0gJGjNj19hKV1dLFtcInByb3ZpZGVBbGxcIixbJGjNj19hID0+IChwcm92aWRlQWxsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCIuL3ByaWNlT3JhY2xlS2l0LmpzXCIsIFtbXCJwcmVwYXJlT3JhY2xlQWRtaW5LaXRcIixbJGjNj19hID0+IChwcmVwYXJlT3JhY2xlQWRtaW5LaXQgPSAkaM2PX2EpXV1dXSxbXCIuL3JvdW5kc01hbmFnZXIuanNcIiwgW1tcInByZXBhcmVSb3VuZHNNYW5hZ2VyS2l0XCIsWyRozY9fYSA9PiAocHJlcGFyZVJvdW5kc01hbmFnZXJLaXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0VSZXR1cm59IGZyb20gJ0BlbmRvL2Zhcic7XG4gKiBAaW1wb3J0IHtUeXBlZFBhdHRlcm4sIFJlbW90ZX0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbCc7XG4gKiBAaW1wb3J0IHtQcmljZUF1dGhvcml0eSwgUHJpY2VEZXNjcmlwdGlvbiwgUHJpY2VRdW90ZSwgUHJpY2VRdW90ZVZhbHVlLCBQcmljZVF1ZXJ5LH0gZnJvbSAnQGFnb3JpYy96b2UvdG9vbHMvdHlwZXMuanMnO1xuICogQGltcG9ydCB7UHVibGlzaEtpdH0gZnJvbSAnQGFnb3JpYy9ub3RpZmllcic7XG4gKiBAaW1wb3J0IHtNYXBTdG9yZSwgU2V0U3RvcmV9IGZyb20gJ0BhZ29yaWMvc3RvcmUnO1xuICogQGltcG9ydCB7WkNGLCBaQ0ZTZWF0fSBmcm9tICdAYWdvcmljL3pvZSc7XG4gKiBAaW1wb3J0IHtRdW90ZUtpdH0gZnJvbSAnLi9yb3VuZHNNYW5hZ2VyLmpzJztcbiAqIEBpbXBvcnQge01ha2VSZWNvcmRlcn0gZnJvbSAnQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9yZWNvcmRlci5qcyc7XG4gKiBAaW1wb3J0IHtMYXRlc3RSb3VuZH0gZnJvbSAnLi9yb3VuZHNNYW5hZ2VyLmpzJztcbiAqIEBpbXBvcnQge09yYWNsZUtpdH0gZnJvbSAnLi9wcmljZU9yYWNsZUtpdC5qcyc7XG4gKiBAaW1wb3J0IHtQcmljZVJvdW5kfSBmcm9tICcuL3JvdW5kc01hbmFnZXIuanMnO1xuICogQGltcG9ydCB7QnJhbmR9IGZyb20gJ0BhZ29yaWMvZXJ0cCc7XG4gKiBAaW1wb3J0IHtBbW91bnR9IGZyb20gJ0BhZ29yaWMvZXJ0cCc7XG4gKiBAaW1wb3J0IHtTdG9yYWdlTm9kZX0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyc7XG4gKi9cblxuY29uc3QgdHJhY2UgPSBtYWtlVHJhY2VyKCdGbHhBZ2cnLCB0cnVlKTtcblxuICAgICAgIGNvbnN0IElOVklUQVRJT05fTUFLRVJTX0RFU0MgPSAnb3JhY2xlIGludml0YXRpb24nO1xuXG4vKipcbiAqIEBpbXBvcnQge0JhZ2dhZ2V9IGZyb20gJ0BhZ29yaWMvdmF0LWRhdGEnXG4gKiBAaW1wb3J0IHtUaW1lc3RhbXB9IGZyb20gJ0BhZ29yaWMvdGltZSdcbiAqIEBpbXBvcnQge1JlbGF0aXZlVGltZX0gZnJvbSAnQGFnb3JpYy90aW1lJ1xuICogICBSZWxhdGl2ZVRpbWUsIG5vdCBSZWxhdGl2ZVRpbWVWYWx1ZVxuICogQGltcG9ydCB7UmVsYXRpdmVUaW1lVmFsdWV9IGZyb20gJ0BhZ29yaWMvdGltZSdcbiAqIEBpbXBvcnQge1RpbWVyU2VydmljZX0gZnJvbSAnQGFnb3JpYy90aW1lJ1xuICovXG5cbi8qKiBAdHlwZSB7KHF1b3RlOiBQcmljZVF1b3RlKSA9PiBQcmljZURlc2NyaXB0aW9ufSAqLyRozY9fb25jZS5JTlZJVEFUSU9OX01BS0VSU19ERVNDKElOVklUQVRJT05fTUFLRVJTX0RFU0MpO1xuY29uc3QgcHJpY2VEZXNjcmlwdGlvbkZyb21RdW90ZSA9IHF1b3RlID0+IHF1b3RlLnF1b3RlQW1vdW50LnZhbHVlWzBdO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJvdW5kU3RhdGVcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gZWxpZ2libGVGb3JTcGVjaWZpY1JvdW5kXG4gKiBAcHJvcGVydHkge2JpZ2ludH0gcXVlcmllZFJvdW5kSWRcbiAqIEBwcm9wZXJ0eSB7YmlnaW50fSBsYXRlc3RTdWJtaXNzaW9uXG4gKiBAcHJvcGVydHkge1RpbWVzdGFtcH0gc3RhcnRlZEF0XG4gKiBAcHJvcGVydHkge251bWJlcn0gcm91bmRUaW1lb3V0XG4gKiBAcHJvcGVydHkge251bWJlcn0gb3JhY2xlQ291bnRcbiAqL1xuXG4vKiBQYXJ0bHkgZG9jdW1lbnRlZCBhdCBodHRwczovL2dpdGh1Yi5jb20vc21hcnRjb250cmFjdGtpdC9jaGFpbmxpbmsvYmxvYi9iMDQ1NDE2ZWJjYTc2OWFhNjliZGUyZGEyM2I1MTA5YWJlMDdhOGI1L2NvbnRyYWN0cy9zcmMvdjAuNi9GbHV4QWdncmVnYXRvci5zb2wjTDE1MyovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENoYWlubGlua0NvbmZpZ1xuICogQHByb3BlcnR5IHtudW1iZXJ9IG1heFN1Ym1pc3Npb25Db3VudFxuICogQHByb3BlcnR5IHtudW1iZXJ9IG1pblN1Ym1pc3Npb25Db3VudFxuICogQHByb3BlcnR5IHtiaWdpbnR9IHJlc3RhcnREZWxheSB0aGUgbnVtYmVyIG9mIHJvdW5kcyBhbiBPcmFjbGUgaGFzIHRvIHdhaXRcbiAqICAgYmVmb3JlIHRoZXkgY2FuIGluaXRpYXRlIGEgcm91bmRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBtaW5TdWJtaXNzaW9uVmFsdWUgYW4gaW1tdXRhYmxlIGNoZWNrIGZvciBhIGxvd2VyIGJvdW5kIG9mXG4gKiAgIHdoYXQgc3VibWlzc2lvbiB2YWx1ZXMgYXJlIGFjY2VwdGVkIGZyb20gYW4gb3JhY2xlXG4gKiBAcHJvcGVydHkge251bWJlcn0gbWF4U3VibWlzc2lvblZhbHVlIGFuIGltbXV0YWJsZSBjaGVjayBmb3IgYW4gdXBwZXIgYm91bmRcbiAqICAgb2Ygd2hhdCBzdWJtaXNzaW9uIHZhbHVlcyBhcmUgYWNjZXB0ZWQgZnJvbSBhbiBvcmFjbGVcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSB0aW1lb3V0IHRoZSBudW1iZXIgb2Ygc2Vjb25kcyBhZnRlciB0aGUgcHJldmlvdXMgcm91bmRcbiAqICAgdGhhdCBhbGxvd2VkIHRvIGxhcHNlIGJlZm9yZSBhbGxvd2luZyBhbiBvcmFjbGUgdG8gc2tpcCBhbiB1bmZpbmlzaGVkXG4gKiAgIHJvdW5kXG4gKi9cblxuLyoqXG4gKiBSZXR1cm5zIGEgbWFrZXIgZm9yIGEgc2luZ2xlIGR1cmFibGUgRmx1eEFnZ3JlZ2F0b3JLaXQsIGNsb3NlZCBvdmVyIHRoZVxuICogcHJlcGFyZSgpIGFyZ3VtZW50cy5cbiAqXG4gKiBUaGUga2l0IGFnZ3JlZ2F0ZXMgcHJpY2UgaW5wdXRzIHRvIHByb2R1Y2UgYSBQcmljZUF1dGhvcml0eS4gVW5saWtlIHRoZVxuICogc2ltcGxlciBgcHJpY2VBZ2dyZWdhdG9yLmpzYCwgdGhpcyBhcHByb3hpbWF0ZXMgdGhlIF9Ob2RlIE9wZXJhdG9yXG4gKiBBZ2dyZWdhdGlvbl8gbG9naWMgb2YgW0NoYWlubGluayBwcmljZVxuICogZmVlZHNdKGh0dHBzOi8vYmxvZy5jaGFpbi5saW5rL2xldmVscy1vZi1kYXRhLWFnZ3JlZ2F0aW9uLWluLWNoYWlubGluay1wcmljZS1mZWVkcy8pLlxuICpcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtaQ0Y8XG4gKiAgIENoYWlubGlua0NvbmZpZyAmIHtcbiAqICAgICB0aW1lcjogVGltZXJTZXJ2aWNlO1xuICogICAgIGJyYW5kSW46IEJyYW5kPCduYXQnPjtcbiAqICAgICBicmFuZE91dDogQnJhbmQ8J25hdCc+O1xuICogICAgIHVuaXRBbW91bnRJbj86IEFtb3VudDwnbmF0Jz47XG4gKiAgIH1cbiAqID59IHpjZlxuICogQHBhcmFtIHtUaW1lclNlcnZpY2V9IHRpbWVyUHJlc2VuY2VcbiAqIEBwYXJhbSB7UXVvdGVLaXR9IHF1b3RlS2l0XG4gKiBAcGFyYW0ge1JlbW90ZTxTdG9yYWdlTm9kZT59IHN0b3JhZ2VOb2RlXG4gKiBAcGFyYW0geygpID0+IFB1Ymxpc2hLaXQ8YW55Pn0gbWFrZUR1cmFibGVQdWJsaXNoS2l0XG4gKiBAcGFyYW0ge01ha2VSZWNvcmRlcn0gbWFrZVJlY29yZGVyXG4gKi9cbiAgICAgICBjb25zdCBwcmVwYXJlRmx1eEFnZ3JlZ2F0b3JLaXQgPSBhc3luYyAoXG4gIGJhZ2dhZ2UsXG4gIHpjZixcbiAgdGltZXJQcmVzZW5jZSxcbiAgcXVvdGVLaXQsXG4gIHN0b3JhZ2VOb2RlLFxuICBtYWtlRHVyYWJsZVB1Ymxpc2hLaXQsXG4gIG1ha2VSZWNvcmRlcixcbikgPT4ge1xuICAvKiBicmFuZHMgY29tZSBmcm9tIG5hbWVkIHRlcm1zIGluc3RlYWQgb2YgYGJyYW5kc2Aga2V5IGJlY2F1c2UgdGhlIGxhdHRlciBpcyovXG4gIC8qIGEgU3RhbmRhcmRUZXJtIHRoYXQgWm9lIGNyZWF0ZXMgZnJvbSB0aGUgYGlzc3VlcktleXdvcmRSZWNvcmRgIGFyZ3VtZW50IGFuZCovXG4gIC8qIE9yYWNsZSBicmFuZHMgYXJlIGluZXJ0ICh3aXRob3V0IGlzc3VlcnMgb3IgbWludHMpLiovXG4gIGNvbnN0IHtcbiAgICBicmFuZEluLFxuICAgIGJyYW5kT3V0LFxuICAgIG1heFN1Ym1pc3Npb25Db3VudCxcbiAgICBtYXhTdWJtaXNzaW9uVmFsdWUsXG4gICAgbWluU3VibWlzc2lvbkNvdW50LFxuICAgIG1pblN1Ym1pc3Npb25WYWx1ZSxcbiAgICByZXN0YXJ0RGVsYXksXG4gICAgdGltZW91dCxcblxuICAgIHVuaXRBbW91bnRJbiA9IEFtb3VudE1hdGgubWFrZShicmFuZEluLCAxbiksXG4gIH0gPSB6Y2YuZ2V0VGVybXMoKTtcblxuICBhc3NlcnRBbGxEZWZpbmVkKHtcbiAgICBicmFuZEluLFxuICAgIGJyYW5kT3V0LFxuICAgIG1heFN1Ym1pc3Npb25Db3VudCxcbiAgICBtYXhTdWJtaXNzaW9uVmFsdWUsXG4gICAgbWluU3VibWlzc2lvbkNvdW50LFxuICAgIG1pblN1Ym1pc3Npb25WYWx1ZSxcbiAgICByZXN0YXJ0RGVsYXksXG4gICAgdGltZW91dCxcbiAgICB1bml0QW1vdW50SW4sXG4gIH0pO1xuXG4gIGNvbnN0IG1ha2VSb3VuZHNNYW5hZ2VyS2l0ID0gcHJlcGFyZVJvdW5kc01hbmFnZXJLaXQoYmFnZ2FnZSk7XG4gIGNvbnN0IG1ha2VPcmFjbGVBZG1pbktpdCA9IHByZXBhcmVPcmFjbGVBZG1pbktpdChiYWdnYWdlKTtcblxuICBjb25zdCBtYWtlUmVjb3JkZXJLaXQgPSBkZWZpbmVSZWNvcmRlcktpdCh7XG4gICAgbWFrZUR1cmFibGVQdWJsaXNoS2l0LFxuICAgIG1ha2VSZWNvcmRlcixcbiAgfSk7XG5cbiAgLyogZW5kIG9mIG1ha2VyIGRlZmluaXRpb25zIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbiAgY29uc3QgeyBhbnN3ZXJLaXQsIGxhdGVzdFJvdW5kS2l0LCBwcmljZUtpdCB9ID0gYXdhaXQgcHJvdmlkZUFsbChiYWdnYWdlLCB7XG4gICAgLyoqXG4gKiBUaGlzIGlzIGp1c3QgYSBzaWduYWwgdGhhdCB0aGVyZSdzIGEgbmV3IGFuc3dlciwgd2hpY2ggaXMgcmVhZCBmcm9tXG4gKiBgbGFzdFZhbHVlT3V0Rm9yVW5pdEluYFxuICovXG4gICAgYW5zd2VyS2l0OiAoKSA9PiBtYWtlRHVyYWJsZVB1Ymxpc2hLaXQoKSxcbiAgICAvKiogRm9yIHB1Ymxpc2hpbmcgcHJpY2VBdXRob3JpdHkgdmFsdWVzIHRvIG9mZi1jaGFpbiBzdG9yYWdlICovXG4gICAgcHJpY2VLaXQ6ICgpID0+XG4gICAgICBtYWtlUmVjb3JkZXJLaXQoXG4gICAgICAgIHN0b3JhZ2VOb2RlLFxuICAgICAgICAvKiogQHR5cGUge1R5cGVkUGF0dGVybjxQcmljZURlc2NyaXB0aW9uPn0gKi8gKE0uYW55KCkpLFxuICAgICAgKSxcbiAgICBsYXRlc3RSb3VuZEtpdDogKCkgPT5cbiAgICAgIEUud2hlbihFKHN0b3JhZ2VOb2RlKS5tYWtlQ2hpbGROb2RlKCdsYXRlc3RSb3VuZCcpLCBub2RlID0+XG4gICAgICAgIG1ha2VSZWNvcmRlcktpdChcbiAgICAgICAgICBub2RlLFxuICAgICAgICAgIC8qKlxuICogQHR5cGUge1R5cGVkUGF0dGVybjxMYXRlc3RSb3VuZD59XG4gKi8gICAgICAgICAgIChNLmFueSgpKSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gIH0pO1xuXG4gIGNvbnN0IHsgcm91bmRzTWFuYWdlcktpdCB9ID0gYXdhaXQgcHJvdmlkZUFsbChiYWdnYWdlLCB7XG4gICAgcm91bmRzTWFuYWdlcktpdDogKCkgPT5cbiAgICAgIG1ha2VSb3VuZHNNYW5hZ2VyS2l0KFxuICAgICAgICBoYXJkZW4oe1xuICAgICAgICAgIGFuc3dlclB1Ymxpc2hlcjogYW5zd2VyS2l0LnB1Ymxpc2hlcixcbiAgICAgICAgICBicmFuZEluLFxuICAgICAgICAgIGJyYW5kT3V0LFxuICAgICAgICAgIGxhdGVzdFJvdW5kUHVibGlzaGVyOiBsYXRlc3RSb3VuZEtpdC5yZWNvcmRlcixcbiAgICAgICAgICBtaW5TdWJtaXNzaW9uQ291bnQsXG4gICAgICAgICAgbWF4U3VibWlzc2lvbkNvdW50LFxuICAgICAgICAgIG1pblN1Ym1pc3Npb25WYWx1ZSxcbiAgICAgICAgICBtYXhTdWJtaXNzaW9uVmFsdWUsXG4gICAgICAgICAgcXVvdGVLaXQsXG4gICAgICAgICAgcmVzdGFydERlbGF5LFxuICAgICAgICAgIHRpbWVyUHJlc2VuY2UsXG4gICAgICAgICAgdGltZW91dCxcbiAgICAgICAgICB1bml0QW1vdW50SW4sXG4gICAgICAgIH0pLFxuICAgICAgKSxcbiAgfSk7XG5cbiAgLyogbm90IGR1cmFibGUsIGhlbGQgaW4gY2xvc3VyZSBhbmQgcmVtYWRlIGluIGV2ZXJ5IGNhbGwgb2YgZW5jbG9zaW5nKi9cbiAgY29uc3QgeyBwcmljZUF1dGhvcml0eSB9ID0gbWFrZU9uZXdheVByaWNlQXV0aG9yaXR5S2l0KHtcbiAgICBjcmVhdGVRdW90ZTogcm91bmRzTWFuYWdlcktpdC5jb250cmFjdC5tYWtlQ3JlYXRlUXVvdGUoKSxcbiAgICBub3RpZmllcjogbWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIoYW5zd2VyS2l0LnN1YnNjcmliZXIpLFxuICAgIHF1b3RlSXNzdWVyOiBxdW90ZUtpdC5pc3N1ZXIsXG4gICAgdGltZXI6IHRpbWVyUHJlc2VuY2UsXG4gICAgYWN0dWFsQnJhbmRJbjogYnJhbmRJbixcbiAgICBhY3R1YWxCcmFuZE91dDogYnJhbmRPdXQsXG4gIH0pO1xuXG4gIC8qIGZvciBlYWNoIG5ldyBxdW90ZSBmcm9tIHRoZSBwcmljZUF1dGhvcml0eSwgcHVibGlzaCBpdCB0byBvZmYtY2hhaW4gc3RvcmFnZSovXG4gIHZvaWQgb2JzZXJ2ZU5vdGlmaWVyKFxuICAgIHByaWNlQXV0aG9yaXR5Lm1ha2VRdW90ZU5vdGlmaWVyKHVuaXRBbW91bnRJbiwgYnJhbmRPdXQpLFxuICAgIHtcbiAgICAgIHVwZGF0ZVN0YXRlOiBxdW90ZSA9PiB7XG4gICAgICAgIHRyYWNlKCduZXcgcXVvdGUnLCBxdW90ZSk7XG4gICAgICAgIHZvaWQgcHJpY2VLaXQucmVjb3JkZXIud3JpdGUocHJpY2VEZXNjcmlwdGlvbkZyb21RdW90ZShxdW90ZSkpO1xuICAgICAgfSxcbiAgICAgIGZhaWw6IHJlYXNvbiA9PiB7XG4gICAgICAgIHRocm93IEVycm9yKGBwcmljZUF1dGhvcml0eSBvYnNlcnZlciBmYWlsZWQ6ICR7cmVhc29ufWApO1xuICAgICAgfSxcbiAgICAgIGZpbmlzaDogZG9uZSA9PiB7XG4gICAgICAgIHRocm93IEVycm9yKGBwcmljZUF1dGhvcml0eSBvYnNlcnZlciBkaWVkOiAke2RvbmV9YCk7XG4gICAgICB9LFxuICAgIH0sXG4gICk7XG5cbiAgY29uc3QgbWFrZUZsdXhBZ2dyZWdhdG9yS2l0ID0gcHJlcGFyZUV4b0NsYXNzS2l0KFxuICAgIGJhZ2dhZ2UsXG4gICAgJ2ZsdXhBZ2dyZWdhdG9yJyxcbiAgICB7XG4gICAgICBjcmVhdG9yOiBNLmludGVyZmFjZShcbiAgICAgICAgJ2ZsdXhBZ2dyZWdhdG9yIGNyZWF0b3JGYWNldCcsXG4gICAgICAgIHt9LFxuICAgICAgICB7IGRlZmF1bHRHdWFyZHM6ICdwYXNzYWJsZScgfSxcbiAgICAgICksXG4gICAgICBwdWJsaWM6IE0uaW50ZXJmYWNlKCdmbHV4QWdncmVnYXRvciBwdWJsaWNGYWNldCcsIHtcbiAgICAgICAgZ2V0UHJpY2VBdXRob3JpdHk6IE0uY2FsbCgpLnJldHVybnMoTS5hbnkoKSksXG4gICAgICAgIGdldFB1YmxpY1RvcGljczogTS5jYWxsKCkucmV0dXJucyh7XG4gICAgICAgICAgcXVvdGVzOiBNLmFueSgpLFxuICAgICAgICAgIGxhdGVzdFJvdW5kOiBNLmFueSgpLFxuICAgICAgICB9KSxcbiAgICAgIH0pLFxuICAgIH0sXG4gICAgKCkgPT4ge1xuICAgICAgLyoqIEB0eXBlIHtNYXBTdG9yZTxzdHJpbmcsIE9yYWNsZUtpdD59ICovXG4gICAgICBjb25zdCBvcmFjbGVzID0gbWFrZVNjYWxhckJpZ01hcFN0b3JlKCdvcmFjbGVzJywge1xuICAgICAgICBkdXJhYmxlOiB0cnVlLFxuICAgICAgfSk7XG4gICAgICByZXR1cm4geyBvcmFjbGVzIH07XG4gICAgfSxcbiAgICB7XG4gICAgICBjcmVhdG9yOiB7XG4gICAgICAgIC8qKlxuICogQW4gXCJvcmFjbGUgaW52aXRhdGlvblwiIGlzIGFuIGludml0YXRpb24gdG8gYmUgYWJsZSB0byBzdWJtaXQgZGF0YSB0b1xuICogaW5jbHVkZSBpbiB0aGUgcHJpY2VBZ2dyZWdhdG9yJ3MgcmVzdWx0cy5cbiAqXG4gKiBUaGUgb2ZmZXIgcmVzdWx0IGZyb20gdGhpcyBpbnZpdGF0aW9uIGlzIGEgT3JhY2xlQWRtaW4sIHdoaWNoIGNhbiBiZVxuICogdXNlZCBkaXJlY3RseSB0byBtYW5hZ2UgdGhlIHByaWNlIHN1Ym1pc3Npb25zIGFzIHdlbGwgYXMgdG8gdGVybWluYXRlXG4gKiB0aGUgcmVsYXRpb25zaGlwLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBvcmFjbGVJZCB1bmlxdWUgcGVyIGNvbnRyYWN0IGluc3RhbmNlXG4gKi9cbiAgICAgICAgYXN5bmMgbWFrZU9yYWNsZUludml0YXRpb24ob3JhY2xlSWQpIHtcbiAgICAgICAgICBjb25zdCB7IGZhY2V0cyB9ID0gdGhpcztcbiAgICAgICAgICB0cmFjZSgnbWFrZU9yYWNsZUludml0YXRpb24nLCBvcmFjbGVJZCk7XG4gICAgICAgICAgLyoqXG4gKiBJZiBjdXN0b20gYXJndW1lbnRzIGFyZSBzdXBwbGllZCB0byB0aGUgYHpvZS5vZmZlcmAgY2FsbCwgdGhleSBjYW5cbiAqIGluZGljYXRlIGFuIE9yYWNsZVByaWNlU3VibWlzc2lvbiBub3RpZmllciBhbmQgYSBjb3JyZXNwb25kaW5nXG4gKiBgc2hpZnRWYWx1ZU91dGAgdGhhdCBzaG91bGQgYmUgYWRhcHRlZCBhcyBwYXJ0IG9mIHRoZVxuICogcHJpY2VBdXRob3JpdHkncyByZXBvcnRlZCBkYXRhLlxuICpcbiAqIEBwYXJhbSB7WkNGU2VhdH0gc2VhdFxuICovXG4gICAgICAgICAgY29uc3Qgb2ZmZXJIYW5kbGVyID0gYXN5bmMgc2VhdCA9PiB7XG4gICAgICAgICAgICBzZWF0LmV4aXQoKTtcbiAgICAgICAgICAgIGNvbnN0IHsgb3JhY2xlIH0gPSBhd2FpdCBmYWNldHMuY3JlYXRvci5pbml0T3JhY2xlKG9yYWNsZUlkKTtcbiAgICAgICAgICAgIGNvbnN0IGludml0YXRpb25NYWtlcnMgPSBGYXIoJ2ludml0YXRpb24gbWFrZXJzJywge1xuICAgICAgICAgICAgICAvKiogQHBhcmFtIHtQcmljZVJvdW5kfSByZXN1bHQgKi9cbiAgICAgICAgICAgICAgUHVzaFByaWNlKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB6Y2YubWFrZUludml0YXRpb24oXG4gICAgICAgICAgICAgICAgICAvKiogQHBhcmFtIHtaQ0ZTZWF0fSBjU2VhdCAqL1xuICAgICAgICAgICAgICAgICAgYXN5bmMgY1NlYXQgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjU2VhdC5leGl0KCk7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IG9yYWNsZS5wdXNoUHJpY2UocmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAnUHVzaFByaWNlJyxcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgICAgICAgICBpbnZpdGF0aW9uTWFrZXJzLFxuICAgICAgICAgICAgICBvcmFjbGUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgcmV0dXJuIHpjZi5tYWtlSW52aXRhdGlvbihvZmZlckhhbmRsZXIsIElOVklUQVRJT05fTUFLRVJTX0RFU0MpO1xuICAgICAgICB9LFxuICAgICAgICAvKiogQHBhcmFtIHtzdHJpbmd9IG9yYWNsZUlkICovXG4gICAgICAgIGFzeW5jIHJlbW92ZU9yYWNsZShvcmFjbGVJZCkge1xuICAgICAgICAgIGNvbnN0IHsgb3JhY2xlcyB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgICB0cmFjZSgnZGVsZXRlT3JhY2xlJywgb3JhY2xlSWQpO1xuICAgICAgICAgIGNvbnN0IGtpdCA9IG9yYWNsZXMuZ2V0KG9yYWNsZUlkKTtcbiAgICAgICAgICBraXQuYWRtaW4uZGlzYWJsZSgpO1xuICAgICAgICAgIG9yYWNsZXMuZGVsZXRlKG9yYWNsZUlkKTtcbiAgICAgICAgfSxcblxuICAgICAgICBnZXRSb3VuZERhdGE6IHJvdW5kSWRSYXcgPT4ge1xuICAgICAgICAgIHJldHVybiByb3VuZHNNYW5hZ2VyS2l0LmNvbnRyYWN0LmdldFJvdW5kRGF0YShyb3VuZElkUmF3KTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKiogQHBhcmFtIHtzdHJpbmd9IG9yYWNsZUlkICovXG4gICAgICAgIGFzeW5jIGluaXRPcmFjbGUob3JhY2xlSWQpIHtcbiAgICAgICAgICBjb25zdCB7IG9yYWNsZXMgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgICAgdHJhY2UoJ2luaXRPcmFjbGUnLCBvcmFjbGVJZCk7XG4gICAgICAgICAgYXNzZXJ0LnR5cGVvZihvcmFjbGVJZCwgJ3N0cmluZycpO1xuXG4gICAgICAgICAgY29uc3Qgb3JhY2xlS2l0ID0gbWFrZU9yYWNsZUFkbWluS2l0KFxuICAgICAgICAgICAgaGFyZGVuKHtcbiAgICAgICAgICAgICAgbWluU3VibWlzc2lvblZhbHVlLFxuICAgICAgICAgICAgICBtYXhTdWJtaXNzaW9uVmFsdWUsXG4gICAgICAgICAgICAgIG9yYWNsZUlkLCAvKiBtdXN0IGJlIHVuaXF1ZSBwZXIgdmF0Ki9cbiAgICAgICAgICAgICAgcm91bmRQb3dlcnM6IHJvdW5kc01hbmFnZXJLaXQub3JhY2xlLFxuICAgICAgICAgICAgICB0aW1lcjogdGltZXJQcmVzZW5jZSxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG4gICAgICAgICAgb3JhY2xlcy5pbml0KG9yYWNsZUlkLCBvcmFjbGVLaXQpO1xuXG4gICAgICAgICAgcmV0dXJuIG9yYWNsZUtpdDtcbiAgICAgICAgfSxcblxuICAgICAgICAvKipcbiAqIGEgbWV0aG9kIHRvIHByb3ZpZGUgYWxsIGN1cnJlbnQgaW5mbyBvcmFjbGVTdGF0dXNlcyBuZWVkLiBJbnRlbmRlZFxuICogb25seSBvbmx5IHRvIGJlIGNhbGxhYmxlIGJ5IG9yYWNsZVN0YXR1c2VzLiBOb3QgZm9yIHVzZSBieSBjb250cmFjdHNcbiAqIHRvIHJlYWQgc3RhdGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG9yYWNsZUlkXG4gKiBAcGFyYW0ge2JpZ2ludH0gcXVlcmllZFJvdW5kSWRcbiAqIEByZXR1cm5zIHtQcm9taXNlPFJvdW5kU3RhdGU+fVxuICovXG4gICAgICAgIGFzeW5jIG9yYWNsZVJvdW5kU3RhdGUob3JhY2xlSWQsIHF1ZXJpZWRSb3VuZElkKSB7XG4gICAgICAgICAgY29uc3QgeyBvcmFjbGVzIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgIGNvbnN0IGJsb2NrVGltZXN0YW1wID0gYXdhaXQgRSh0aW1lclByZXNlbmNlKS5nZXRDdXJyZW50VGltZXN0YW1wKCk7XG4gICAgICAgICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgRShvcmFjbGVzLmdldChvcmFjbGVJZCkub3JhY2xlKS5nZXRTdGF0dXMoKTtcblxuICAgICAgICAgIGNvbnN0IG9yYWNsZUNvdW50ID0gb3JhY2xlcy5nZXRTaXplKCk7XG5cbiAgICAgICAgICBjb25zdCB7IGNvbnRyYWN0IH0gPSByb3VuZHNNYW5hZ2VyS2l0O1xuICAgICAgICAgIGlmIChxdWVyaWVkUm91bmRJZCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHJvdW5kU3RhdHVzID0gY29udHJhY3QuZ2V0Um91bmRTdGF0dXMocXVlcmllZFJvdW5kSWQpO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgZWxpZ2libGVGb3JTcGVjaWZpY1JvdW5kOiBjb250cmFjdC5lbGlnaWJsZUZvclNwZWNpZmljUm91bmQoXG4gICAgICAgICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgICAgICAgIHF1ZXJpZWRSb3VuZElkLFxuICAgICAgICAgICAgICAgIGJsb2NrVGltZXN0YW1wLFxuICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICBxdWVyaWVkUm91bmRJZCxcbiAgICAgICAgICAgICAgbGF0ZXN0U3VibWlzc2lvbjogc3RhdHVzLmxhdGVzdFN1Ym1pc3Npb24sXG4gICAgICAgICAgICAgIHN0YXJ0ZWRBdDogcm91bmRTdGF0dXMuc3RhcnRlZEF0LFxuICAgICAgICAgICAgICByb3VuZFRpbWVvdXQ6IHJvdW5kU3RhdHVzLnJvdW5kVGltZW91dCxcbiAgICAgICAgICAgICAgb3JhY2xlQ291bnQsXG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAuLi5jb250cmFjdC5vcmFjbGVSb3VuZFN0YXRlU3VnZ2VzdFJvdW5kKHN0YXR1cywgYmxvY2tUaW1lc3RhbXApLFxuICAgICAgICAgICAgICBvcmFjbGVDb3VudCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIHB1YmxpYzoge1xuICAgICAgICBnZXRQcmljZUF1dGhvcml0eSgpIHtcbiAgICAgICAgICByZXR1cm4gcHJpY2VBdXRob3JpdHk7XG4gICAgICAgIH0sXG4gICAgICAgIGdldFB1YmxpY1RvcGljcygpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcXVvdGVzOiBtYWtlUmVjb3JkZXJUb3BpYyhcbiAgICAgICAgICAgICAgJ1F1b3RlcyBmcm9tIHRoaXMgcHJpY2UgYWdncmVnYXRvcicsXG4gICAgICAgICAgICAgIHByaWNlS2l0LFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGxhdGVzdFJvdW5kOiBtYWtlUmVjb3JkZXJUb3BpYyhcbiAgICAgICAgICAgICAgJ05vdGlmaWNhdGlvbiBvZiBlYWNoIHJvdW5kJyxcbiAgICAgICAgICAgICAgbGF0ZXN0Um91bmRLaXQsXG4gICAgICAgICAgICApLFxuICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0sXG4gICk7XG5cbiAgcmV0dXJuIG1ha2VGbHV4QWdncmVnYXRvcktpdDtcbn07JGjNj19vbmNlLnByZXBhcmVGbHV4QWdncmVnYXRvcktpdChwcmVwYXJlRmx1eEFnZ3JlZ2F0b3JLaXQpO1xuaGFyZGVuKHByZXBhcmVGbHV4QWdncmVnYXRvcktpdCk7XG4vKiogQHR5cGVkZWYge0VSZXR1cm48RVJldHVybjx0eXBlb2YgcHJlcGFyZUZsdXhBZ2dyZWdhdG9yS2l0Pj59IEZsdXhBZ2dyZWdhdG9yS2l0ICovXG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJJTlZJVEFUSU9OX01BS0VSU19ERVNDIjpbIklOVklUQVRJT05fTUFLRVJTX0RFU0MiXSwicHJlcGFyZUZsdXhBZ2dyZWdhdG9yS2l0IjpbInByZXBhcmVGbHV4QWdncmVnYXRvcktpdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADl9LS/CBEAAAgRAAA6AAAAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xL3NyYy9wcmljZS9wcmljZU9yYWNsZUtpdC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAYWdvcmljL2ludGVybmFsIiwiQGFnb3JpYy92YXQtZGF0YSJdLCJleHBvcnRzIjpbIklOVklUQVRJT05fTUFLRVJTX0RFU0MiLCJwcmVwYXJlT3JhY2xlQWRtaW5LaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLG1ha2VUcmFjZXIsTSxwcmVwYXJlRXhvQ2xhc3NLaXQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wibWFrZVRyYWNlclwiLFskaM2PX2EgPT4gKG1ha2VUcmFjZXIgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJwcmVwYXJlRXhvQ2xhc3NLaXRcIixbJGjNj19hID0+IChwcmVwYXJlRXhvQ2xhc3NLaXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuY29uc3QgdHJhY2UgPSBtYWtlVHJhY2VyKCdPcktpdCcsIHRydWUpO1xuXG4gICAgICAgY29uc3QgSU5WSVRBVElPTl9NQUtFUlNfREVTQyA9ICdvcmFjbGUgaW52aXRhdGlvbic7XG5cbi8qKlxuICogQGltcG9ydCB7RVJldHVybn0gZnJvbSAnQGVuZG8vZmFyJztcbiAqIEBpbXBvcnQge1ByaWNlUm91bmR9IGZyb20gJy4vcm91bmRzTWFuYWdlci5qcyc7XG4gKiBAaW1wb3J0IHtOYXRWYWx1ZX0gZnJvbSAnQGFnb3JpYy9lcnRwJztcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIG9yYWNsZUlkOiBzdHJpbmc7XG4gKiAgIHJvdW5kUG93ZXJzOiB7XG4gKiAgICAgaGFuZGxlUHVzaDogKFxuICogICAgICAgc3RhdHVzOiBPcmFjbGVTdGF0dXMsXG4gKiAgICAgICByZXN1bHQ6IFByaWNlUm91bmQsXG4gKiAgICAgKSA9PiBQcm9taXNlPE9yYWNsZVN0YXR1cz47XG4gKiAgIH07XG4gKiB9fSBIZWxkUGFyYW1zXG4gKi9cblxuLyoqIEB0eXBlZGVmIHt7IHJvdW5kSWQ6IG51bWJlciB8IHVuZGVmaW5lZDsgdW5pdFByaWNlOiBOYXRWYWx1ZSB9fSBQcmljZURhdHVtICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gT3JhY2xlU3RhdHVzXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtkaXNhYmxlZF1cbiAqIEBwcm9wZXJ0eSB7YmlnaW50fSBsYXN0UmVwb3J0ZWRSb3VuZFxuICogQHByb3BlcnR5IHtiaWdpbnR9IGxhc3RTdGFydGVkUm91bmRcbiAqIEBwcm9wZXJ0eSB7YmlnaW50fSBsYXRlc3RTdWJtaXNzaW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gb3JhY2xlSWRcbiAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7UmVhZG9ubHk8SGVsZFBhcmFtcyAmIHt9Pn0gSW1tdXRhYmxlU3RhdGVcbiAqXG4gKiBAdHlwZWRlZiB7T3JhY2xlU3RhdHVzICYge319IE11dGFibGVTdGF0ZVxuICovXG4vKiogQHR5cGVkZWYge0ltbXV0YWJsZVN0YXRlICYgTXV0YWJsZVN0YXRlfSBTdGF0ZSAqL1xuXG4vKipcbiAqIEBwYXJhbSB7SGVsZFBhcmFtc30gaGVsZFBhcmFtc1xuICogQHJldHVybnMge1N0YXRlfVxuICovJGjNj19vbmNlLklOVklUQVRJT05fTUFLRVJTX0RFU0MoSU5WSVRBVElPTl9NQUtFUlNfREVTQyk7XG5jb25zdCBpbml0U3RhdGUgPSAoeyBvcmFjbGVJZCwgcm91bmRQb3dlcnMgfSkgPT4ge1xuICByZXR1cm4ge1xuICAgIG9yYWNsZUlkLFxuICAgIHJvdW5kUG93ZXJzLFxuICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICBsYXN0UmVwb3J0ZWRSb3VuZDogMG4sXG4gICAgbGFzdFN0YXJ0ZWRSb3VuZDogMG4sXG4gICAgbGF0ZXN0U3VibWlzc2lvbjogMG4sXG4gIH07XG59O1xuXG5jb25zdCBBZG1pbkkgPSBNLmludGVyZmFjZSgnT3JhY2xlS2l0QWRtaW4nLCB7XG4gIGRpc2FibGU6IE0uY2FsbCgpLnJldHVybnMoKSxcbn0pO1xuXG5jb25zdCBPcmFjbGVJID0gTS5pbnRlcmZhY2UoJ09yYWNsZScsIHtcbiAgcHVzaFByaWNlOiBNLmNhbGwoXG4gICAgTS5zcGxpdFJlY29yZChcbiAgICAgIHsgdW5pdFByaWNlOiBNLmJpZ2ludCgpIH0sXG4gICAgICB7IHJvdW5kSWQ6IE0ub3IoTS5iaWdpbnQoKSwgTS5udW1iZXIoKSkgfSxcbiAgICApLFxuICApLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBnZXRTdGF0dXM6IE0uY2FsbCgpLnJldHVybnMoTS5yZWNvcmQoKSksXG59KTtcblxuICAgICAgIGNvbnN0IHByZXBhcmVPcmFjbGVBZG1pbktpdCA9IGJhZ2dhZ2UgPT5cbiAgcHJlcGFyZUV4b0NsYXNzS2l0KFxuICAgIGJhZ2dhZ2UsXG4gICAgJ09yYWNsZUtpdCcsXG4gICAgeyBhZG1pbjogQWRtaW5JLCBvcmFjbGU6IE9yYWNsZUkgfSxcbiAgICBpbml0U3RhdGUsXG4gICAge1xuICAgICAgYWRtaW46IHtcbiAgICAgICAgZGlzYWJsZSgpIHtcbiAgICAgICAgICB0cmFjZShgb3JhY2xlICR7dGhpcy5zdGF0ZS5vcmFjbGVJZH0gZGlzYWJsZWRgKTtcbiAgICAgICAgICB0aGlzLnN0YXRlLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBvcmFjbGU6IHtcbiAgICAgICAgLyoqXG4gKiBwdXNoIGEgdW5pdFByaWNlIHJlc3VsdCBmcm9tIHRoaXMgb3JhY2xlXG4gKlxuICogQHBhcmFtIHtQcmljZURhdHVtfSBkYXR1bVxuICovXG4gICAgICAgIGFzeW5jIHB1c2hQcmljZSh7XG4gICAgICAgICAgcm91bmRJZDogcm91bmRJZFJhdyA9IHVuZGVmaW5lZCxcbiAgICAgICAgICB1bml0UHJpY2U6IHZhbHVlUmF3LFxuICAgICAgICB9KSB7XG4gICAgICAgICAgY29uc3QgeyBzdGF0ZSB9ID0gdGhpcztcbiAgICAgICAgICAhc3RhdGUuZGlzYWJsZWQgfHwgRmFpbGBwdXNoUHJpY2UgZm9yIGRpc2FibGVkIG9yYWNsZWA7XG4gICAgICAgICAgY29uc3QgeyByb3VuZFBvd2VycyB9ID0gc3RhdGU7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcm91bmRQb3dlcnMuaGFuZGxlUHVzaChcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgb3JhY2xlSWQ6IHN0YXRlLm9yYWNsZUlkLFxuICAgICAgICAgICAgICBsYXN0UmVwb3J0ZWRSb3VuZDogc3RhdGUubGFzdFJlcG9ydGVkUm91bmQsXG4gICAgICAgICAgICAgIGxhc3RTdGFydGVkUm91bmQ6IHN0YXRlLmxhc3RTdGFydGVkUm91bmQsXG4gICAgICAgICAgICAgIGxhdGVzdFN1Ym1pc3Npb246IHN0YXRlLmxhdGVzdFN1Ym1pc3Npb24sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICByb3VuZElkOiByb3VuZElkUmF3LFxuICAgICAgICAgICAgICB1bml0UHJpY2U6IHZhbHVlUmF3LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgc3RhdGUubGFzdFJlcG9ydGVkUm91bmQgPSByZXN1bHQubGFzdFJlcG9ydGVkUm91bmQ7XG4gICAgICAgICAgc3RhdGUubGFzdFN0YXJ0ZWRSb3VuZCA9IHJlc3VsdC5sYXN0U3RhcnRlZFJvdW5kO1xuICAgICAgICAgIHN0YXRlLmxhdGVzdFN1Ym1pc3Npb24gPSByZXN1bHQubGF0ZXN0U3VibWlzc2lvbjtcbiAgICAgICAgfSxcbiAgICAgICAgLyoqIEByZXR1cm5zIHtPcmFjbGVTdGF0dXN9ICovXG4gICAgICAgIGdldFN0YXR1cygpIHtcbiAgICAgICAgICBjb25zdCB7IHN0YXRlIH0gPSB0aGlzO1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBvcmFjbGVJZDogc3RhdGUub3JhY2xlSWQsXG4gICAgICAgICAgICBkaXNhYmxlZDogc3RhdGUuZGlzYWJsZWQsXG4gICAgICAgICAgICBsYXN0UmVwb3J0ZWRSb3VuZDogc3RhdGUubGFzdFJlcG9ydGVkUm91bmQsXG4gICAgICAgICAgICBsYXN0U3RhcnRlZFJvdW5kOiBzdGF0ZS5sYXN0U3RhcnRlZFJvdW5kLFxuICAgICAgICAgICAgbGF0ZXN0U3VibWlzc2lvbjogc3RhdGUubGF0ZXN0U3VibWlzc2lvbixcbiAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9LFxuICApO1xuXG4vKiogQHR5cGVkZWYge0VSZXR1cm48RVJldHVybjx0eXBlb2YgcHJlcGFyZU9yYWNsZUFkbWluS2l0Pj59IE9yYWNsZUtpdCAqLyRozY9fb25jZS5wcmVwYXJlT3JhY2xlQWRtaW5LaXQocHJlcGFyZU9yYWNsZUFkbWluS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IklOVklUQVRJT05fTUFLRVJTX0RFU0MiOlsiSU5WSVRBVElPTl9NQUtFUlNfREVTQyJdLCJwcmVwYXJlT3JhY2xlQWRtaW5LaXQiOlsicHJlcGFyZU9yYWNsZUFkbWluS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGr9PUHTagAA02oAADkAAABAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE2LjEvc3JjL3ByaWNlL3JvdW5kc01hbmFnZXIuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGFnb3JpYy9lcnRwIiwiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvdGltZSIsIkBhZ29yaWMvdmF0LWRhdGEiLCJAYWdvcmljL3pvZS9zcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9uYXQiLCJAYWdvcmljL2ludGVybmFsL3NyYy90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsiUk9VTkRfTUFYIiwicHJlcGFyZVJvdW5kc01hbmFnZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHEsQW1vdW50TWF0aCxtYWtlVHJhY2VyLFRpbWVNYXRoLFRpbWVzdGFtcFNoYXBlLE0sbWFrZVNjYWxhckJpZ01hcFN0b3JlLHByZXBhcmVFeG9DbGFzc0tpdCxjYWxjdWxhdGVNZWRpYW4sbmF0U2FmZU1hdGgsRSxGYXIsaXNOYXQsTmF0LFVuZ3VhcmRlZEhlbHBlckk7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRNYXRoXCIsWyRozY9fYSA9PiAoQW1vdW50TWF0aCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcIm1ha2VUcmFjZXJcIixbJGjNj19hID0+IChtYWtlVHJhY2VyID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy90aW1lXCIsIFtbXCJUaW1lTWF0aFwiLFskaM2PX2EgPT4gKFRpbWVNYXRoID0gJGjNj19hKV1dLFtcIlRpbWVzdGFtcFNoYXBlXCIsWyRozY9fYSA9PiAoVGltZXN0YW1wU2hhcGUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXSxbXCJtYWtlU2NhbGFyQmlnTWFwU3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyQmlnTWFwU3RvcmUgPSAkaM2PX2EpXV0sW1wicHJlcGFyZUV4b0NsYXNzS2l0XCIsWyRozY9fYSA9PiAocHJlcGFyZUV4b0NsYXNzS2l0ID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9pbmRleC5qc1wiLCBbW1wiY2FsY3VsYXRlTWVkaWFuXCIsWyRozY9fYSA9PiAoY2FsY3VsYXRlTWVkaWFuID0gJGjNj19hKV1dLFtcIm5hdFNhZmVNYXRoXCIsWyRozY9fYSA9PiAobmF0U2FmZU1hdGggPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL25hdFwiLCBbW1wiaXNOYXRcIixbJGjNj19hID0+IChpc05hdCA9ICRozY9fYSldXSxbXCJOYXRcIixbJGjNj19hID0+IChOYXQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsL3NyYy90eXBlR3VhcmRzLmpzXCIsIFtbXCJVbmd1YXJkZWRIZWxwZXJJXCIsWyRozY9fYSA9PiAoVW5ndWFyZGVkSGVscGVySSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgYWRkLCBzdWJ0cmFjdCwgbXVsdGlwbHksIGZsb29yRGl2aWRlLCBjZWlsRGl2aWRlLCBpc0dURSB9ID0gbmF0U2FmZU1hdGg7XG5cbi8qKlxuICogQGltcG9ydCB7UHJpY2VBdXRob3JpdHksIFByaWNlRGVzY3JpcHRpb24sIFByaWNlUXVvdGUsIFByaWNlUXVvdGVWYWx1ZSwgUHJpY2VRdWVyeSx9IGZyb20gJ0BhZ29yaWMvem9lL3Rvb2xzL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge1RpbWVzdGFtcCwgVGltZXJTZXJ2aWNlfSBmcm9tICdAYWdvcmljL3RpbWUnXG4gKiBAaW1wb3J0IHtQdWJsaXNoZXJ9IGZyb20gJ0BhZ29yaWMvbm90aWZpZXInO1xuICogQGltcG9ydCB7TWFwU3RvcmUsIFNldFN0b3JlfSBmcm9tICdAYWdvcmljL3N0b3JlJztcbiAqIEBpbXBvcnQge09yYWNsZVN0YXR1c30gZnJvbSAnLi9wcmljZU9yYWNsZUtpdC5qcydcbiAqIEBpbXBvcnQge0NoYWlubGlua0NvbmZpZ30gZnJvbSAnLi9mbHV4QWdncmVnYXRvcktpdC5qcyc7XG4gKiBAaW1wb3J0IHtSZWNvcmRlcn0gZnJvbSAnQGFnb3JpYy96b2Uvc3JjL2NvbnRyYWN0U3VwcG9ydC9yZWNvcmRlci5qcyc7XG4gKiBAaW1wb3J0IHtOYXRWYWx1ZX0gZnJvbSAnQGFnb3JpYy9lcnRwJztcbiAqIEBpbXBvcnQge0lzc3VlcktpdH0gZnJvbSAnQGFnb3JpYy9lcnRwJztcbiAqIEBpbXBvcnQge0Ftb3VudH0gZnJvbSAnQGFnb3JpYy9lcnRwJztcbiAqIEBpbXBvcnQge0JyYW5kfSBmcm9tICdAYWdvcmljL2VydHAnO1xuICovXG5cbi8qKiBAdHlwZSB7c3RyaW5nfSAqL1xuY29uc3QgVjNfTk9fREFUQV9FUlJPUiA9ICdObyBkYXRhIHByZXNlbnQnO1xuXG4vKiogQHR5cGUge2JpZ2ludH0gKi9cbiAgICAgICBjb25zdCBST1VORF9NQVggPSBCaWdJbnQoMiAqKiAzMiAtIDEpOyRozY9fb25jZS5ST1VORF9NQVgoUk9VTkRfTUFYKTtcblxuY29uc3QgdHJhY2UgPSBtYWtlVHJhY2VyKCdSb3VuZHNNJywgdHJ1ZSk7XG5cbi8qKiBAcGFyYW0ge2JpZ2ludH0gcm91bmRJZCAqL1xuY29uc3QgdmFsaWRSb3VuZElkID0gcm91bmRJZCA9PiB7XG4gIHJldHVybiByb3VuZElkIDw9IFJPVU5EX01BWDtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge3sgcm91bmRJZDogbnVtYmVyIHwgdW5kZWZpbmVkOyB1bml0UHJpY2U6IE5hdFZhbHVlIH19IFByaWNlUm91bmRcbiAqXG4gKiBAdHlwZWRlZiB7UGljazxSb3VuZERhdGEsICdyb3VuZElkJyB8ICdzdGFydGVkQXQnPiAmIHsgc3RhcnRlZEJ5OiBzdHJpbmcgfX0gTGF0ZXN0Um91bmRcbiAqL1xuXG4vKiogQHR5cGVkZWYge1JvdW5kICYgeyByb3VuZElkOiBiaWdpbnQgfX0gUm91bmREYXRhICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUm91bmRcbiAqIEBwcm9wZXJ0eSB7YmlnaW50fSBhbnN3ZXIgdGhlIGFuc3dlciBmb3IgdGhlIGdpdmVuIHJvdW5kXG4gKiBAcHJvcGVydHkge1RpbWVzdGFtcH0gc3RhcnRlZEF0IHRoZSB0aW1lc3RhbXAgd2hlbiB0aGUgcm91bmQgd2FzIHN0YXJ0ZWQuXG4gKiAgIFRoaXMgaXMgMCBpZiB0aGUgcm91bmQgaGFzbid0IGJlZW4gc3RhcnRlZCB5ZXQuXG4gKiBAcHJvcGVydHkge1RpbWVzdGFtcH0gdXBkYXRlZEF0IHRoZSB0aW1lc3RhbXAgd2hlbiB0aGUgcm91bmQgbGFzdCB3YXMgdXBkYXRlZFxuICogICAoaS5lLiBhbnN3ZXIgd2FzIGxhc3QgY29tcHV0ZWQpXG4gKiBAcHJvcGVydHkge2JpZ2ludH0gYW5zd2VyZWRJblJvdW5kIHRoZSByb3VuZCBJRCBvZiB0aGUgcm91bmQgaW4gd2hpY2ggdGhlXG4gKiAgIGFuc3dlciB3YXMgY29tcHV0ZWQuIGFuc3dlcmVkSW5Sb3VuZCBtYXkgYmUgc21hbGxlciB0aGFuIHJvdW5kSWQgd2hlbiB0aGVcbiAqICAgcm91bmQgdGltZWQgb3V0LiBhbnN3ZXJlZEluUm91bmQgaXMgZXF1YWwgdG8gcm91bmRJZCB3aGVuIHRoZSByb3VuZCBkaWRuJ3RcbiAqICAgdGltZSBvdXQgYW5kIHdhcyBjb21wbGV0ZWQgcmVndWxhcmx5LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUm91bmREZXRhaWxzXG4gKiBAcHJvcGVydHkge2JpZ2ludFtdfSBzdWJtaXNzaW9uc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IG1heFN1Ym1pc3Npb25zXG4gKiBAcHJvcGVydHkge251bWJlcn0gbWluU3VibWlzc2lvbnNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSByb3VuZFRpbWVvdXRcbiAqL1xuXG4vKiogQHR5cGVkZWYge0lzc3VlcktpdDwnc2V0JywgUHJpY2VEZXNjcmlwdGlvbj59IFF1b3RlS2l0ICovXG5cbi8qKlxuICogQHR5cGVkZWYge1JlYWRvbmx5PFxuICogICBDaGFpbmxpbmtDb25maWcgJiB7XG4gKiAgICAgcXVvdGVLaXQ6IFF1b3RlS2l0O1xuICogICAgIGFuc3dlclB1Ymxpc2hlcjogUHVibGlzaGVyPHZvaWQ+O1xuICogICAgIGJyYW5kSW46IEJyYW5kPCduYXQnPjtcbiAqICAgICBicmFuZE91dDogQnJhbmQ8J25hdCc+O1xuICogICAgIGxhdGVzdFJvdW5kUHVibGlzaGVyOiBSZWNvcmRlcjxMYXRlc3RSb3VuZD47XG4gKiAgICAgdGltZXJQcmVzZW5jZTogVGltZXJTZXJ2aWNlO1xuICogICB9XG4gKiA+fSBIZWxkUGFyYW1zXG4gKlxuICpcbiAqIEB0eXBlZGVmIHtSZWFkb25seTxcbiAqICAgSGVsZFBhcmFtcyAmIHtcbiAqICAgICBkZXRhaWxzOiBNYXBTdG9yZTxiaWdpbnQsIFJvdW5kRGV0YWlscz47XG4gKiAgICAgcm91bmRzOiBNYXBTdG9yZTxiaWdpbnQsIFJvdW5kPjtcbiAqICAgICB1bml0SW46IGJpZ2ludDtcbiAqICAgfVxuICogPn0gSW1tdXRhYmxlU3RhdGVcbiAqXG4gKlxuICogQHR5cGVkZWYge3tcbiAqICAgbGFzdFZhbHVlT3V0Rm9yVW5pdEluOiBiaWdpbnQ/O1xuICogICByZXBvcnRpbmdSb3VuZElkOiBiaWdpbnQ7XG4gKiB9fSBNdXRhYmxlU3RhdGVcbiAqL1xuLyoqIEB0eXBlZGVmIHtJbW11dGFibGVTdGF0ZSAmIE11dGFibGVTdGF0ZX0gU3RhdGUgKi9cblxuICAgICAgIGNvbnN0IHByZXBhcmVSb3VuZHNNYW5hZ2VyS2l0ID0gYmFnZ2FnZSA9PlxuICBwcmVwYXJlRXhvQ2xhc3NLaXQoXG4gICAgYmFnZ2FnZSxcbiAgICAnUm91bmRzTWFuYWdlcicsXG4gICAge1xuICAgICAgaGVscGVyOiBVbmd1YXJkZWRIZWxwZXJJLFxuICAgICAgY29udHJhY3Q6IE0uaW50ZXJmYWNlKCdjb250cmFjdCcsIHtcbiAgICAgICAgYXV0aGVudGljYXRlUXVvdGU6IE0uY2FsbChbTS5yZWNvcmQoKV0pLnJldHVybnMoTS5hbnkoKSksXG4gICAgICAgIG1ha2VDcmVhdGVRdW90ZTogTS5jYWxsKClcbiAgICAgICAgICAub3B0aW9uYWwoe1xuICAgICAgICAgICAgb3ZlcnJpZGVWYWx1ZU91dDogTS5udW1iZXIoKSxcbiAgICAgICAgICAgIHRpbWVzdGFtcDogVGltZXN0YW1wU2hhcGUsXG4gICAgICAgICAgfSlcbiAgICAgICAgICAucmV0dXJucyhNLmFueSgpKSxcbiAgICAgICAgZWxpZ2libGVGb3JTcGVjaWZpY1JvdW5kOiBNLmNhbGwoXG4gICAgICAgICAgTS5hbnkoKSxcbiAgICAgICAgICBNLmJpZ2ludCgpLFxuICAgICAgICAgIFRpbWVzdGFtcFNoYXBlLFxuICAgICAgICApLnJldHVybnMoTS5ib29sZWFuKCkpLFxuICAgICAgICBnZXRSb3VuZERhdGE6IE0uY2FsbChNLmFueSgpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgICAgICAgZ2V0Um91bmRTdGF0dXM6IE0uY2FsbChNLmJpZ2ludCgpKS5yZXR1cm5zKE0ucmVjb3JkKCkpLFxuICAgICAgICBvcmFjbGVSb3VuZFN0YXRlU3VnZ2VzdFJvdW5kOiBNLmNhbGwoTS5hbnkoKSwgVGltZXN0YW1wU2hhcGUpLnJldHVybnMoXG4gICAgICAgICAgTS5yZWNvcmQoKSxcbiAgICAgICAgKSxcbiAgICAgIH0pLFxuICAgICAgb3JhY2xlOiBNLmludGVyZmFjZSgnb3JhY2xlJywge1xuICAgICAgICBoYW5kbGVQdXNoOiBNLmNhbGwoTS5yZWNvcmQoKSwgTS5yZWNvcmQoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgICB9KSxcbiAgICB9LFxuICAgIC8qKlxuICogQHR5cGUgeyhcbiAqICAgb3B0czogSGVsZFBhcmFtcyAmIHsgdW5pdEFtb3VudEluOiBBbW91bnQ8J25hdCc+IH0sXG4gKiApID0+IFN0YXRlfVxuICovXG4gICAgKHtcbiAgICAgIC8qIENoYWlubGlua0NvbmZpZyovXG4gICAgICBtYXhTdWJtaXNzaW9uQ291bnQsXG4gICAgICBtaW5TdWJtaXNzaW9uQ291bnQsXG4gICAgICByZXN0YXJ0RGVsYXksXG4gICAgICBtaW5TdWJtaXNzaW9uVmFsdWUsXG4gICAgICBtYXhTdWJtaXNzaW9uVmFsdWUsXG4gICAgICB0aW1lb3V0LFxuICAgICAgLyogb3RoZXIgSGVsZFBhcmFtcyovXG4gICAgICBxdW90ZUtpdCxcbiAgICAgIGFuc3dlclB1Ymxpc2hlcixcbiAgICAgIGJyYW5kSW4sXG4gICAgICBicmFuZE91dCxcbiAgICAgIGxhdGVzdFJvdW5kUHVibGlzaGVyLFxuICAgICAgdGltZXJQcmVzZW5jZSxcbiAgICAgIC8qIG90aGVyIG9wdGlvbiovXG4gICAgICB1bml0QW1vdW50SW4sXG4gICAgfSkgPT4ge1xuICAgICAgY29uc3QgdW5pdEluID0gQW1vdW50TWF0aC5nZXRWYWx1ZShicmFuZEluLCB1bml0QW1vdW50SW4pO1xuXG4gICAgICBjb25zdCByb3VuZHMgPSBtYWtlU2NhbGFyQmlnTWFwU3RvcmUoJ3JvdW5kcycsIHsgZHVyYWJsZTogdHJ1ZSB9KTtcblxuICAgICAgY29uc3QgZGV0YWlscyA9IG1ha2VTY2FsYXJCaWdNYXBTdG9yZSgnZGV0YWlscycsIHsgZHVyYWJsZTogdHJ1ZSB9KTtcblxuICAgICAgLyoqIEB0eXBlIHtJbW11dGFibGVTdGF0ZX0gKi9cbiAgICAgIGNvbnN0IGltbXV0YWJsZSA9IHtcbiAgICAgICAgLyogQ2hhaW5saW5rQ29uZmlnKi9cbiAgICAgICAgbWF4U3VibWlzc2lvbkNvdW50LFxuICAgICAgICBtaW5TdWJtaXNzaW9uQ291bnQsXG4gICAgICAgIHJlc3RhcnREZWxheSxcbiAgICAgICAgbWluU3VibWlzc2lvblZhbHVlLFxuICAgICAgICBtYXhTdWJtaXNzaW9uVmFsdWUsXG4gICAgICAgIHRpbWVvdXQsXG4gICAgICAgIC8qIG90aGVyIEhlbGRQYXJhbXMqL1xuICAgICAgICBxdW90ZUtpdCxcbiAgICAgICAgYW5zd2VyUHVibGlzaGVyLFxuICAgICAgICBicmFuZEluLFxuICAgICAgICBicmFuZE91dCxcbiAgICAgICAgbGF0ZXN0Um91bmRQdWJsaXNoZXIsXG4gICAgICAgIHRpbWVyUHJlc2VuY2UsXG4gICAgICAgIC8qIGNvbXB1dGVkKi9cbiAgICAgICAgZGV0YWlscyxcbiAgICAgICAgcm91bmRzLFxuICAgICAgICB1bml0SW4sXG4gICAgICB9O1xuXG4gICAgICBjb25zdCByb3VuZElkID0gMG47XG5cbiAgICAgIHJldHVybiB7XG4gICAgICAgIC4uLmltbXV0YWJsZSxcbiAgICAgICAgbGFzdFZhbHVlT3V0Rm9yVW5pdEluOiBudWxsLFxuICAgICAgICByZXBvcnRpbmdSb3VuZElkOiByb3VuZElkLFxuICAgICAgfTtcbiAgICB9LFxuICAgIHtcbiAgICAgIGhlbHBlcjoge1xuICAgICAgICAvKiogQHBhcmFtIHtiaWdpbnR9IHJvdW5kSWQgKi9cbiAgICAgICAgYWNjZXB0aW5nU3VibWlzc2lvbnMocm91bmRJZCkge1xuICAgICAgICAgIGNvbnN0IHsgZGV0YWlscyB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgZGV0YWlscy5oYXMocm91bmRJZCkgJiYgZGV0YWlscy5nZXQocm91bmRJZCkubWF4U3VibWlzc2lvbnMgIT09IDBcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICogQHBhcmFtIHtPcmFjbGVTdGF0dXN9IHN0YXR1c1xuICogQHBhcmFtIHtiaWdpbnR9IHJvdW5kSWRcbiAqL1xuICAgICAgICBkZWxheWVkKHN0YXR1cywgcm91bmRJZCkge1xuICAgICAgICAgIGNvbnN0IHsgcmVzdGFydERlbGF5IH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgIGNvbnN0IGxhc3RTdGFydGVkID0gc3RhdHVzLmxhc3RTdGFydGVkUm91bmQ7XG4gICAgICAgICAgcmV0dXJuIHJvdW5kSWQgPiBhZGQobGFzdFN0YXJ0ZWQsIHJlc3RhcnREZWxheSkgfHwgbGFzdFN0YXJ0ZWQgPT09IDBuO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKiBAcGFyYW0ge2JpZ2ludH0gcm91bmRJZCAqL1xuICAgICAgICBkZWxldGVSb3VuZERldGFpbHMocm91bmRJZCkge1xuICAgICAgICAgIGNvbnN0IHsgZGV0YWlscyB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgICBjb25zdCByb3VuZERldGFpbHMgPSBkZXRhaWxzLmdldChyb3VuZElkKTtcbiAgICAgICAgICBpZiAocm91bmREZXRhaWxzLnN1Ym1pc3Npb25zLmxlbmd0aCA8IHJvdW5kRGV0YWlscy5tYXhTdWJtaXNzaW9ucylcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICBkZXRhaWxzLmRlbGV0ZShyb3VuZElkKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKiogQHBhcmFtIHtiaWdpbnR9IHJvdW5kSWQgKi9cbiAgICAgICAgaXNOZXh0Um91bmQocm91bmRJZCkge1xuICAgICAgICAgIGNvbnN0IHsgcmVwb3J0aW5nUm91bmRJZCB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgICByZXR1cm4gcm91bmRJZCA9PT0gYWRkKHJlcG9ydGluZ1JvdW5kSWQsIDEpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICogQHBhcmFtIHtiaWdpbnR9IHJvdW5kSWRcbiAqIEBwYXJhbSB7VGltZXN0YW1wfSBibG9ja1RpbWVzdGFtcFxuICogQHBhcmFtIHtzdHJpbmd9IG9yYWNsZUlkXG4gKi9cbiAgICAgICAgaW5pdGlhbGl6ZU5ld1JvdW5kKHJvdW5kSWQsIGJsb2NrVGltZXN0YW1wLCBvcmFjbGVJZCkge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGRldGFpbHMsXG4gICAgICAgICAgICBsYXRlc3RSb3VuZFB1Ymxpc2hlcixcbiAgICAgICAgICAgIG1pblN1Ym1pc3Npb25Db3VudCxcbiAgICAgICAgICAgIG1heFN1Ym1pc3Npb25Db3VudCxcbiAgICAgICAgICAgIHJvdW5kcyxcbiAgICAgICAgICAgIHRpbWVvdXQsXG4gICAgICAgICAgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgICAgY29uc3QgeyBoZWxwZXIgfSA9IHRoaXMuZmFjZXRzO1xuICAgICAgICAgIGhlbHBlci5pc05leHRSb3VuZChyb3VuZElkKSB8fCBGYWlsYFJvdW5kICR7cm91bmRJZH0gYWxyZWFkeSBzdGFydGVkYDtcblxuICAgICAgICAgIGhlbHBlci51cGRhdGVUaW1lZE91dFJvdW5kSW5mbyhzdWJ0cmFjdChyb3VuZElkLCAxKSwgYmxvY2tUaW1lc3RhbXApO1xuXG4gICAgICAgICAgdGhpcy5zdGF0ZS5yZXBvcnRpbmdSb3VuZElkID0gcm91bmRJZDtcblxuICAgICAgICAgIGRldGFpbHMuaW5pdChcbiAgICAgICAgICAgIHJvdW5kSWQsXG4gICAgICAgICAgICBoYXJkZW4oe1xuICAgICAgICAgICAgICBzdWJtaXNzaW9uczogW10sXG4gICAgICAgICAgICAgIG1heFN1Ym1pc3Npb25zOiBtYXhTdWJtaXNzaW9uQ291bnQsXG4gICAgICAgICAgICAgIG1pblN1Ym1pc3Npb25zOiBtaW5TdWJtaXNzaW9uQ291bnQsXG4gICAgICAgICAgICAgIHJvdW5kVGltZW91dDogdGltZW91dCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBjb25zdCByb3VuZCA9IGhhcmRlbih7XG4gICAgICAgICAgICBhbnN3ZXI6IDBuLFxuICAgICAgICAgICAgc3RhcnRlZEF0OiBibG9ja1RpbWVzdGFtcCxcbiAgICAgICAgICAgIHVwZGF0ZWRBdDogMG4sXG4gICAgICAgICAgICBhbnN3ZXJlZEluUm91bmQ6IDBuLFxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHJvdW5kcy5pbml0KHJvdW5kSWQsIHJvdW5kKTtcbiAgICAgICAgICAvKiBhc3N1bWUgaXQgc3VjY2VlZHMuIGlmIG5vdCwgZXhwZWN0IHRoZSBuZXh0IHRvLiovXG4gICAgICAgICAgLyogaWYgaXQgZmFpbHMgY29udGludW91c2x5IGl0J2xsIGJlIGFwcGFyZW50IGluIHRoZSB1bmhhbmRsZWQgcmVqZWN0aW9uIGxvZ2dpbmcuKi9cbiAgICAgICAgICB2b2lkIGxhdGVzdFJvdW5kUHVibGlzaGVyLndyaXRlKHtcbiAgICAgICAgICAgIHJvdW5kSWQsXG4gICAgICAgICAgICBzdGFydGVkQXQ6IHJvdW5kLnN0YXJ0ZWRBdCxcbiAgICAgICAgICAgIHN0YXJ0ZWRCeTogb3JhY2xlSWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gKiBAcGFyYW0ge2JpZ2ludH0gcm91bmRJZFxuICogQHBhcmFtIHtiaWdpbnR9IHJySWQgcmVwb3J0aW5nIHJvdW5kIElEXG4gKi9cbiAgICAgICAgcHJldmlvdXNBbmRDdXJyZW50VW5hbnN3ZXJlZChyb3VuZElkLCBycklkKSB7XG4gICAgICAgICAgY29uc3QgeyByb3VuZHMgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgICAgcmV0dXJuIGFkZChyb3VuZElkLCAxKSA9PT0gcnJJZCAmJiByb3VuZHMuZ2V0KHJySWQpLnVwZGF0ZWRBdCA9PT0gMG47XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gKiBAcGFyYW0ge2JpZ2ludH0gcm91bmRJZFxuICogQHBhcmFtIHtPcmFjbGVTdGF0dXN9IHN0YXR1c1xuICogQHBhcmFtIHtUaW1lc3RhbXB9IGJsb2NrVGltZXN0YW1wXG4gKiBAcmV0dXJucyB7T3JhY2xlU3RhdHVzIHwgdW5kZWZpbmVkfSB0aGUgbmV3IHN0YXR1c1xuICovXG4gICAgICAgIHByb3Bvc2VOZXdSb3VuZChyb3VuZElkLCBzdGF0dXMsIGJsb2NrVGltZXN0YW1wKSB7XG4gICAgICAgICAgY29uc3QgeyBoZWxwZXIgfSA9IHRoaXMuZmFjZXRzO1xuICAgICAgICAgIGlmICghaGVscGVyLmlzTmV4dFJvdW5kKHJvdW5kSWQpKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgIGNvbnN0IHsgcmVzdGFydERlbGF5IH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgIGNvbnN0IGxhc3RTdGFydGVkID0gc3RhdHVzLmxhc3RTdGFydGVkUm91bmQ7IC8qIGNhY2hlIHN0b3JhZ2UgcmVhZHMqL1xuICAgICAgICAgIGlmIChyb3VuZElkIDw9IGFkZChsYXN0U3RhcnRlZCwgcmVzdGFydERlbGF5KSAmJiBsYXN0U3RhcnRlZCAhPT0gMG4pXG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgIGhlbHBlci5pbml0aWFsaXplTmV3Um91bmQocm91bmRJZCwgYmxvY2tUaW1lc3RhbXAsIHN0YXR1cy5vcmFjbGVJZCk7XG5cbiAgICAgICAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgICAgICAgIC4uLnN0YXR1cyxcbiAgICAgICAgICAgIGxhc3RTdGFydGVkUm91bmQ6IHJvdW5kSWQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gKiBAcGFyYW0ge2JpZ2ludH0gc3VibWlzc2lvblxuICogQHBhcmFtIHtiaWdpbnR9IHJvdW5kSWRcbiAqIEBwYXJhbSB7T3JhY2xlU3RhdHVzfSBzdGF0dXNcbiAqIEByZXR1cm5zIHtPcmFjbGVTdGF0dXN9IHRoZSBuZXcgc3RhdHVzXG4gKi9cbiAgICAgICAgcmVjb3JkU3VibWlzc2lvbihzdWJtaXNzaW9uLCByb3VuZElkLCBzdGF0dXMpIHtcbiAgICAgICAgICB0cmFjZSgncmVjb3JkU3VibWlzc2lvbicsIHN1Ym1pc3Npb24sIHJvdW5kSWQsIHN0YXR1cyk7XG4gICAgICAgICAgY29uc3QgeyBoZWxwZXIgfSA9IHRoaXMuZmFjZXRzO1xuICAgICAgICAgIGNvbnN0IHsgZGV0YWlscyB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgICBoZWxwZXIuYWNjZXB0aW5nU3VibWlzc2lvbnMocm91bmRJZCkgfHxcbiAgICAgICAgICAgIEZhaWxgcm91bmQgJHtxKFxuICAgICAgICAgICAgICBOdW1iZXIocm91bmRJZCksXG4gICAgICAgICAgICApfSBub3QgYWNjZXB0aW5nIHN1Ym1pc3Npb25zIGZyb20gb3JhY2xlICR7cShzdGF0dXMub3JhY2xlSWQpfWA7XG5cbiAgICAgICAgICBjb25zdCBsYXN0Um91bmREZXRhaWxzID0gZGV0YWlscy5nZXQocm91bmRJZCk7XG4gICAgICAgICAgZGV0YWlscy5zZXQocm91bmRJZCwge1xuICAgICAgICAgICAgLi4ubGFzdFJvdW5kRGV0YWlscyxcbiAgICAgICAgICAgIHN1Ym1pc3Npb25zOiBbLi4ubGFzdFJvdW5kRGV0YWlscy5zdWJtaXNzaW9ucywgc3VibWlzc2lvbl0sXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgLi4uc3RhdHVzLFxuICAgICAgICAgICAgbGFzdFJlcG9ydGVkUm91bmQ6IHJvdW5kSWQsXG4gICAgICAgICAgICBsYXRlc3RTdWJtaXNzaW9uOiBzdWJtaXNzaW9uLFxuICAgICAgICAgIH07XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gKiBAcGFyYW0ge2JpZ2ludH0gcm91bmRJZFxuICogQHBhcmFtIHtUaW1lc3RhbXB9IGJsb2NrVGltZXN0YW1wXG4gKi9cbiAgICAgICAgc3VwZXJzZWRhYmxlKHJvdW5kSWQsIGJsb2NrVGltZXN0YW1wKSB7XG4gICAgICAgICAgY29uc3QgeyByb3VuZHMgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgICAgY29uc3QgeyBoZWxwZXIgfSA9IHRoaXMuZmFjZXRzO1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICByb3VuZHMuaGFzKHJvdW5kSWQpICYmXG4gICAgICAgICAgICAoVGltZU1hdGguYWJzVmFsdWUocm91bmRzLmdldChyb3VuZElkKS51cGRhdGVkQXQpID4gMG4gfHxcbiAgICAgICAgICAgICAgaGVscGVyLnRpbWVkT3V0KHJvdW5kSWQsIGJsb2NrVGltZXN0YW1wKSlcbiAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgICAgICAvKipcbiAqIEBwYXJhbSB7YmlnaW50fSByb3VuZElkXG4gKiBAcGFyYW0ge1RpbWVzdGFtcH0gYmxvY2tUaW1lc3RhbXBcbiAqL1xuICAgICAgICB0aW1lZE91dChyb3VuZElkLCBibG9ja1RpbWVzdGFtcCkge1xuICAgICAgICAgIGNvbnN0IHsgZGV0YWlscywgcm91bmRzIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgIGlmICghZGV0YWlscy5oYXMocm91bmRJZCkgfHwgIXJvdW5kcy5oYXMocm91bmRJZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBzdGFydGVkQXQgPSByb3VuZHMuZ2V0KHJvdW5kSWQpLnN0YXJ0ZWRBdDtcbiAgICAgICAgICBjb25zdCByb3VuZFRpbWVvdXQgPSBkZXRhaWxzLmdldChyb3VuZElkKS5yb3VuZFRpbWVvdXQ7XG4gICAgICAgICAgLyogVE9ETyBCZXR0ZXIgd291bGQgYmUgdG8gbWFrZSBgcm91bmRUaW1lb3V0YCBhIGBSZWxhdGl2ZVRpbWVgKi9cbiAgICAgICAgICAvKiBldmVyeXdoZXJlLCBhbmQgdG8gcmVuYW1lIGl0IHRvIGEgbmFtZSB0aGF0IGRvZXMgbm90Ki9cbiAgICAgICAgICAvKiBtaXN0YWtlbmx5IGltcGx5IHRoYXQgaXQgaXMgYW4gYWJzb2x1dGUgdGltZS4qL1xuICAgICAgICAgIGNvbnN0IHJvdW5kVGltZW91dER1cmF0aW9uID0gVGltZU1hdGgucmVsVmFsdWUoQmlnSW50KHJvdW5kVGltZW91dCkpO1xuICAgICAgICAgIGNvbnN0IHJvdW5kVGltZWRPdXQgPVxuICAgICAgICAgICAgVGltZU1hdGguYWJzVmFsdWUoc3RhcnRlZEF0KSA+IDBuICYmXG4gICAgICAgICAgICBUaW1lTWF0aC5yZWxWYWx1ZShyb3VuZFRpbWVvdXREdXJhdGlvbikgPiAwbiAmJlxuICAgICAgICAgICAgVGltZU1hdGguY29tcGFyZUFicyhcbiAgICAgICAgICAgICAgVGltZU1hdGguYWRkQWJzUmVsKHN0YXJ0ZWRBdCwgcm91bmRUaW1lb3V0RHVyYXRpb24pLFxuICAgICAgICAgICAgICBibG9ja1RpbWVzdGFtcCxcbiAgICAgICAgICAgICkgPCAwO1xuXG4gICAgICAgICAgcmV0dXJuIHJvdW5kVGltZWRPdXQ7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gKiBAcGFyYW0ge2JpZ2ludH0gcm91bmRJZFxuICogQHBhcmFtIHtUaW1lc3RhbXB9IGJsb2NrVGltZXN0YW1wXG4gKi9cbiAgICAgICAgdXBkYXRlUm91bmRBbnN3ZXIocm91bmRJZCwgYmxvY2tUaW1lc3RhbXApIHtcbiAgICAgICAgICBjb25zdCB7IGFuc3dlclB1Ymxpc2hlciwgZGV0YWlscywgcm91bmRzIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgIGNvbnN0IHJvdW5kRGV0YWlscyA9IGRldGFpbHMuZ2V0KHJvdW5kSWQpO1xuICAgICAgICAgIGlmIChyb3VuZERldGFpbHMuc3VibWlzc2lvbnMubGVuZ3RoIDwgcm91bmREZXRhaWxzLm1pblN1Ym1pc3Npb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gW2ZhbHNlLCAwXTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICAvKiogQHR5cGUge2JpZ2ludCB8IHVuZGVmaW5lZH0gKi9cbiAgICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGZhdWx0eSBpbmZlcmVuY2UqL1xuICAgICAgICAgIGNvbnN0IG5ld0Fuc3dlciA9IGNhbGN1bGF0ZU1lZGlhbihcbiAgICAgICAgICAgIHJvdW5kRGV0YWlscy5zdWJtaXNzaW9ucy5maWx0ZXIoXG4gICAgICAgICAgICAgIHNhbXBsZSA9PiBpc05hdChzYW1wbGUpICYmIHNhbXBsZSA+IDBuLFxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHsgYWRkLCBkaXZpZGU6IGZsb29yRGl2aWRlLCBpc0dURSB9LFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBhc3NlcnQobmV3QW5zd2VyLCAnaW5zdWZmaWNpZW50IHNhbXBsZXMnKTtcblxuICAgICAgICAgIHJvdW5kcy5zZXQocm91bmRJZCwge1xuICAgICAgICAgICAgLi4ucm91bmRzLmdldChyb3VuZElkKSxcbiAgICAgICAgICAgIGFuc3dlcjogbmV3QW5zd2VyLFxuICAgICAgICAgICAgdXBkYXRlZEF0OiBibG9ja1RpbWVzdGFtcCxcbiAgICAgICAgICAgIGFuc3dlcmVkSW5Sb3VuZDogcm91bmRJZCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIHRoaXMuc3RhdGUubGFzdFZhbHVlT3V0Rm9yVW5pdEluID0gbmV3QW5zd2VyO1xuICAgICAgICAgIGFuc3dlclB1Ymxpc2hlci5wdWJsaXNoKHVuZGVmaW5lZCk7XG5cbiAgICAgICAgICByZXR1cm4gW3RydWUsIG5ld0Fuc3dlcl07XG4gICAgICAgIH0sXG4gICAgICAgIC8qKlxuICogQHBhcmFtIHtiaWdpbnR9IHJvdW5kSWRcbiAqIEBwYXJhbSB7VGltZXN0YW1wfSBibG9ja1RpbWVzdGFtcFxuICovXG4gICAgICAgIHVwZGF0ZVRpbWVkT3V0Um91bmRJbmZvKHJvdW5kSWQsIGJsb2NrVGltZXN0YW1wKSB7XG4gICAgICAgICAgY29uc3QgeyBkZXRhaWxzLCByb3VuZHMgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgICAgY29uc3QgeyBoZWxwZXIgfSA9IHRoaXMuZmFjZXRzO1xuXG4gICAgICAgICAgLyogcm91bmQgMCBpcyBub24tZXhpc3RlbnQsIHNvIHdlIGF2b2lkIHRoYXQgY2FzZSAtLSByb3VuZCAxIGlzIGlnbm9yZWQqL1xuICAgICAgICAgIC8qIGJlY2F1c2Ugd2UgY2FuJ3QgY29weSBmcm9tIHJvdW5kIDAgaW4gdGhhdCBjYXNlKi9cbiAgICAgICAgICBpZiAocm91bmRJZCA9PT0gMG4gfHwgcm91bmRJZCA9PT0gMW4pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCByb3VuZFRpbWVkT3V0ID0gaGVscGVyLnRpbWVkT3V0KHJvdW5kSWQsIGJsb2NrVGltZXN0YW1wKTtcbiAgICAgICAgICBpZiAoIXJvdW5kVGltZWRPdXQpIHJldHVybjtcblxuICAgICAgICAgIGNvbnN0IHByZXZSb3VuZCA9IHJvdW5kcy5nZXQoc3VidHJhY3Qocm91bmRJZCwgMSkpO1xuXG4gICAgICAgICAgcm91bmRzLnNldChyb3VuZElkLCB7XG4gICAgICAgICAgICAuLi5yb3VuZHMuZ2V0KHJvdW5kSWQpLFxuICAgICAgICAgICAgYW5zd2VyOiBwcmV2Um91bmQuYW5zd2VyLFxuICAgICAgICAgICAgYW5zd2VyZWRJblJvdW5kOiBwcmV2Um91bmQuYW5zd2VyZWRJblJvdW5kLFxuICAgICAgICAgICAgdXBkYXRlZEF0OiBibG9ja1RpbWVzdGFtcCxcbiAgICAgICAgICB9KTtcblxuICAgICAgICAgIGRldGFpbHMuZGVsZXRlKHJvdW5kSWQpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICogQHBhcmFtIHtPcmFjbGVTdGF0dXN9IHN0YXR1c1xuICogQHBhcmFtIHtiaWdpbnR9IHJvdW5kSWRcbiAqIEBwYXJhbSB7VGltZXN0YW1wfSBibG9ja1RpbWVzdGFtcFxuICogQHJldHVybnMge3N0cmluZyB8IG51bGx9IGVycm9yIG1lc3NhZ2UsIGlmIHRoZXJlIGlzIG9uZVxuICovXG4gICAgICAgIHZhbGlkYXRlT3JhY2xlUm91bmQoc3RhdHVzLCByb3VuZElkLCBibG9ja1RpbWVzdGFtcCkge1xuICAgICAgICAgIGNvbnN0IHsgcmVwb3J0aW5nUm91bmRJZCB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgICBjb25zdCB7IGhlbHBlciB9ID0gdGhpcy5mYWNldHM7XG5cbiAgICAgICAgICBsZXQgY2FuU3VwZXJzZWRlID0gdHJ1ZTtcbiAgICAgICAgICBpZiAocm91bmRJZCA+IDFuKSB7XG4gICAgICAgICAgICBjYW5TdXBlcnNlZGUgPSBoZWxwZXIuc3VwZXJzZWRhYmxlKFxuICAgICAgICAgICAgICBzdWJ0cmFjdChyb3VuZElkLCAxKSxcbiAgICAgICAgICAgICAgYmxvY2tUaW1lc3RhbXAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzdGF0dXMubGFzdFJlcG9ydGVkUm91bmQgPj0gcm91bmRJZCkge1xuICAgICAgICAgICAgcmV0dXJuICdjYW5ub3QgcmVwb3J0IG9uIHByZXZpb3VzIHJvdW5kcyc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKFxuICAgICAgICAgICAgcm91bmRJZCAhPT0gcmVwb3J0aW5nUm91bmRJZCAmJlxuICAgICAgICAgICAgcm91bmRJZCAhPT0gYWRkKHJlcG9ydGluZ1JvdW5kSWQsIDEpICYmXG4gICAgICAgICAgICAhaGVscGVyLnByZXZpb3VzQW5kQ3VycmVudFVuYW5zd2VyZWQocm91bmRJZCwgcmVwb3J0aW5nUm91bmRJZClcbiAgICAgICAgICApXG4gICAgICAgICAgICByZXR1cm4gJ2ludmFsaWQgcm91bmQgdG8gcmVwb3J0JztcbiAgICAgICAgICBpZiAocm91bmRJZCAhPT0gMW4gJiYgIWNhblN1cGVyc2VkZSlcbiAgICAgICAgICAgIHJldHVybiAncHJldmlvdXMgcm91bmQgbm90IHN1cGVyc2VkYWJsZSc7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgY29udHJhY3Q6IHtcbiAgICAgICAgLyoqIEBwYXJhbSB7UHJpY2VRdW90ZVZhbHVlfSBxdW90ZSAqL1xuICAgICAgICBhc3luYyBhdXRoZW50aWNhdGVRdW90ZShxdW90ZSkge1xuICAgICAgICAgIGNvbnN0IHsgcXVvdGVLaXQgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgICAgY29uc3QgcXVvdGVBbW91bnQgPSBBbW91bnRNYXRoLm1ha2UocXVvdGVLaXQuYnJhbmQsIGhhcmRlbihxdW90ZSkpO1xuICAgICAgICAgIGNvbnN0IHF1b3RlUGF5bWVudCA9IGF3YWl0IEUocXVvdGVLaXQubWludCkubWludFBheW1lbnQocXVvdGVBbW91bnQpO1xuICAgICAgICAgIHJldHVybiBoYXJkZW4oeyBxdW90ZUFtb3VudCwgcXVvdGVQYXltZW50IH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8qKlxuICogQHBhcmFtIHtvYmplY3R9IHBhcmFtMFxuICogQHBhcmFtIHtudW1iZXJ9IFtwYXJhbTAub3ZlcnJpZGVWYWx1ZU91dF1cbiAqIEBwYXJhbSB7VGltZXN0YW1wfSBbcGFyYW0wLnRpbWVzdGFtcF1cbiAqL1xuICAgICAgICBtYWtlQ3JlYXRlUXVvdGUoeyBvdmVycmlkZVZhbHVlT3V0LCB0aW1lc3RhbXAgfSA9IHt9KSB7XG4gICAgICAgICAgY29uc3QgeyBzdGF0ZSB9ID0gdGhpcztcbiAgICAgICAgICBjb25zdCB7IGJyYW5kSW4sIGJyYW5kT3V0LCB0aW1lclByZXNlbmNlIH0gPSBzdGF0ZTtcbiAgICAgICAgICBjb25zdCB7IGNvbnRyYWN0IH0gPSB0aGlzLmZhY2V0cztcblxuICAgICAgICAgIC8qKiBAcGFyYW0ge1ByaWNlUXVlcnl9IHByaWNlUXVlcnkgKi9cbiAgICAgICAgICByZXR1cm4gRmFyKCdjcmVhdGVRdW90ZScsIHByaWNlUXVlcnkgPT4ge1xuICAgICAgICAgICAgY29uc3QgeyBsYXN0VmFsdWVPdXRGb3JVbml0SW4sIHVuaXRJbiB9ID0gc3RhdGU7XG5cbiAgICAgICAgICAgIC8qIFNuaWZmIHRoZSBjdXJyZW50IGJhc2VWYWx1ZU91dC4qL1xuICAgICAgICAgICAgY29uc3QgdmFsdWVPdXRGb3JVbml0SW4gPVxuICAgICAgICAgICAgICBvdmVycmlkZVZhbHVlT3V0ID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgICA/IGxhc3RWYWx1ZU91dEZvclVuaXRJbiAvKiBVc2UgdGhlIGxhdGVzdCB2YWx1ZS4qL1xuICAgICAgICAgICAgICAgIDogb3ZlcnJpZGVWYWx1ZU91dDsgLyogT3ZlcnJpZGUgdGhlIHZhbHVlLiovXG4gICAgICAgICAgICBpZiAodmFsdWVPdXRGb3JVbml0SW4gPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgLyogV2UgZG9uJ3QgaGF2ZSBhIHF1b3RlLCBzbyBhYm9ydC4qL1xuICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvKiogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBhbW91bnRJbiB0aGUgZ2l2ZW4gYW1vdW50SW4gKi9cbiAgICAgICAgICAgIGNvbnN0IGNhbGNBbW91bnRPdXQgPSBhbW91bnRJbiA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlSW4gPSBBbW91bnRNYXRoLmdldFZhbHVlKGJyYW5kSW4sIGFtb3VudEluKTtcbiAgICAgICAgICAgICAgcmV0dXJuIEFtb3VudE1hdGgubWFrZShcbiAgICAgICAgICAgICAgICBicmFuZE91dCxcbiAgICAgICAgICAgICAgICBmbG9vckRpdmlkZShtdWx0aXBseSh2YWx1ZUluLCB2YWx1ZU91dEZvclVuaXRJbiksIHVuaXRJbiksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvKiogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBhbW91bnRPdXQgdGhlIHdhbnRlZCBhbW91bnRPdXQgKi9cbiAgICAgICAgICAgIGNvbnN0IGNhbGNBbW91bnRJbiA9IGFtb3VudE91dCA9PiB7XG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlT3V0ID0gQW1vdW50TWF0aC5nZXRWYWx1ZShicmFuZE91dCwgYW1vdW50T3V0KTtcbiAgICAgICAgICAgICAgcmV0dXJuIEFtb3VudE1hdGgubWFrZShcbiAgICAgICAgICAgICAgICBicmFuZEluLFxuICAgICAgICAgICAgICAgIGNlaWxEaXZpZGUobXVsdGlwbHkodmFsdWVPdXQsIHVuaXRJbiksIHZhbHVlT3V0Rm9yVW5pdEluKSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIC8qIENhbGN1bGF0ZSB0aGUgcXVvdGUuKi9cbiAgICAgICAgICAgIGNvbnN0IHF1b3RlID0gcHJpY2VRdWVyeShjYWxjQW1vdW50T3V0LCBjYWxjQW1vdW50SW4pO1xuICAgICAgICAgICAgaWYgKCFxdW90ZSkge1xuICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICAgIGFtb3VudEluLFxuICAgICAgICAgICAgICBhbW91bnRPdXQsXG4gICAgICAgICAgICAgIHRpbWVzdGFtcDogdGhlaXJUaW1lc3RhbXAgPSB0aW1lc3RhbXAsXG4gICAgICAgICAgICB9ID0gcXVvdGU7XG4gICAgICAgICAgICBBbW91bnRNYXRoLmNvZXJjZShicmFuZEluLCBhbW91bnRJbik7XG4gICAgICAgICAgICBBbW91bnRNYXRoLmNvZXJjZShicmFuZE91dCwgYW1vdW50T3V0KTtcbiAgICAgICAgICAgIGlmICh0aGVpclRpbWVzdGFtcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgIHJldHVybiBjb250cmFjdC5hdXRoZW50aWNhdGVRdW90ZShbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgYW1vdW50SW4sXG4gICAgICAgICAgICAgICAgICBhbW91bnRPdXQsXG4gICAgICAgICAgICAgICAgICB0aW1lcjogdGltZXJQcmVzZW5jZSxcbiAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcDogdGhlaXJUaW1lc3RhbXAsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gRSh0aW1lclByZXNlbmNlKVxuICAgICAgICAgICAgICAuZ2V0Q3VycmVudFRpbWVzdGFtcCgpXG4gICAgICAgICAgICAgIC50aGVuKG5vdyA9PlxuICAgICAgICAgICAgICAgIGNvbnRyYWN0LmF1dGhlbnRpY2F0ZVF1b3RlKFtcbiAgICAgICAgICAgICAgICAgIHsgYW1vdW50SW4sIGFtb3VudE91dCwgdGltZXI6IHRpbWVyUHJlc2VuY2UsIHRpbWVzdGFtcDogbm93IH0sXG4gICAgICAgICAgICAgICAgXSksXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gKiBAcGFyYW0ge09yYWNsZVN0YXR1c30gc3RhdHVzXG4gKiBAcGFyYW0ge2JpZ2ludH0gcXVlcmllZFJvdW5kSWRcbiAqIEBwYXJhbSB7VGltZXN0YW1wfSBibG9ja1RpbWVzdGFtcFxuICovXG4gICAgICAgIGVsaWdpYmxlRm9yU3BlY2lmaWNSb3VuZChzdGF0dXMsIHF1ZXJpZWRSb3VuZElkLCBibG9ja1RpbWVzdGFtcCkge1xuICAgICAgICAgIGNvbnN0IHsgcm91bmRzIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgIGNvbnN0IHsgaGVscGVyIH0gPSB0aGlzLmZhY2V0cztcbiAgICAgICAgICBjb25zdCBlcnJvciA9IGhlbHBlci52YWxpZGF0ZU9yYWNsZVJvdW5kKFxuICAgICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgICAgcXVlcmllZFJvdW5kSWQsXG4gICAgICAgICAgICBibG9ja1RpbWVzdGFtcCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChUaW1lTWF0aC5hYnNWYWx1ZShyb3VuZHMuZ2V0KHF1ZXJpZWRSb3VuZElkKS5zdGFydGVkQXQpID4gMG4pIHtcbiAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgIGhlbHBlci5hY2NlcHRpbmdTdWJtaXNzaW9ucyhxdWVyaWVkUm91bmRJZCkgJiYgZXJyb3IgPT09IG51bGxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBoZWxwZXIuZGVsYXllZChzdGF0dXMsIHF1ZXJpZWRSb3VuZElkKSAmJiBlcnJvciA9PT0gbnVsbDtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gKiBjb25zdW1lcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhhdCB0aGV5J3JlIHJlY2VpdmluZyBmcmVzaCBkYXRhXG4gKiBieSBpbnNwZWN0aW5nIHRoZSB1cGRhdGVkQXQgYW5kIGFuc3dlcmVkSW5Sb3VuZCByZXR1cm4gdmFsdWVzLlxuICpcbiAqIEBwYXJhbSB7YmlnaW50IHwgbnVtYmVyfSByb3VuZElkUmF3XG4gKiBAcmV0dXJucyB7UHJvbWlzZTxSb3VuZERhdGE+fVxuICovXG4gICAgICAgIGFzeW5jIGdldFJvdW5kRGF0YShyb3VuZElkUmF3KSB7XG4gICAgICAgICAgY29uc3Qgcm91bmRJZCA9IE5hdChyb3VuZElkUmF3KTtcbiAgICAgICAgICBjb25zdCB7IHJvdW5kcyB9ID0gdGhpcy5zdGF0ZTtcblxuICAgICAgICAgIHJvdW5kcy5oYXMocm91bmRJZCkgfHwgYXNzZXJ0LmZhaWwoVjNfTk9fREFUQV9FUlJPUik7XG5cbiAgICAgICAgICBjb25zdCByID0gcm91bmRzLmdldChyb3VuZElkKTtcblxuICAgICAgICAgIGFzc2VydChcbiAgICAgICAgICAgIHIuYW5zd2VyZWRJblJvdW5kID4gMCAmJiB2YWxpZFJvdW5kSWQocm91bmRJZCksXG4gICAgICAgICAgICBWM19OT19EQVRBX0VSUk9SLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcm91bmRJZCxcbiAgICAgICAgICAgIGFuc3dlcjogci5hbnN3ZXIsXG4gICAgICAgICAgICBzdGFydGVkQXQ6IHIuc3RhcnRlZEF0LFxuICAgICAgICAgICAgdXBkYXRlZEF0OiByLnVwZGF0ZWRBdCxcbiAgICAgICAgICAgIGFuc3dlcmVkSW5Sb3VuZDogci5hbnN3ZXJlZEluUm91bmQsXG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKiogQHR5cGUgeyhyb3VuZElkOiBiaWdpbnQpID0+IFJlYWRvbmx5PFJvdW5kRGV0YWlscyAmIFJvdW5kPn0gKi9cbiAgICAgICAgZ2V0Um91bmRTdGF0dXMocm91bmRJZCkge1xuICAgICAgICAgIGNvbnN0IHsgZGV0YWlscywgcm91bmRzIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAgIHJvdW5kcy5oYXMocm91bmRJZCkgfHwgRmFpbGBWM19OT19EQVRBX0VSUk9SYDtcbiAgICAgICAgICBjb25zdCBkZXRhaWwgPSBkZXRhaWxzLmdldChyb3VuZElkKTtcbiAgICAgICAgICBjb25zdCByb3VuZCA9IHJvdW5kcy5nZXQocm91bmRJZCk7XG4gICAgICAgICAgcmV0dXJuIGhhcmRlbih7IC4uLmRldGFpbCwgLi4ucm91bmQgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyoqXG4gKiBhIG1ldGhvZCB0byBwcm92aWRlIGFsbCBjdXJyZW50IGluZm8gb3JhY2xlU3RhdHVzZXMgbmVlZC4gSW50ZW5kZWRcbiAqIG9ubHkgdG8gYmUgY2FsbGFibGUgYnkgb3JhY2xlU3RhdHVzZXMuIE5vdCBmb3IgdXNlIGJ5IGNvbnRyYWN0cyB0b1xuICogcmVhZCBzdGF0ZS5cbiAqXG4gKiBAcGFyYW0ge09yYWNsZVN0YXR1c30gc3RhdHVzXG4gKiBAcGFyYW0ge1RpbWVzdGFtcH0gYmxvY2tUaW1lc3RhbXBcbiAqL1xuICAgICAgICBvcmFjbGVSb3VuZFN0YXRlU3VnZ2VzdFJvdW5kKHN0YXR1cywgYmxvY2tUaW1lc3RhbXApIHtcbiAgICAgICAgICBjb25zdCB7IGhlbHBlciB9ID0gdGhpcy5mYWNldHM7XG4gICAgICAgICAgY29uc3QgeyBkZXRhaWxzLCByZXBvcnRpbmdSb3VuZElkLCByb3VuZHMgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgICAgY29uc3Qgc2hvdWxkU3VwZXJzZWRlID1cbiAgICAgICAgICAgIHN0YXR1cy5sYXN0UmVwb3J0ZWRSb3VuZCA9PT0gcmVwb3J0aW5nUm91bmRJZCB8fFxuICAgICAgICAgICAgIWhlbHBlci5hY2NlcHRpbmdTdWJtaXNzaW9ucyhyZXBvcnRpbmdSb3VuZElkKTtcbiAgICAgICAgICAvKiBJbnN0ZWFkIG9mIG51ZGdpbmcgb3JhY2xlU3RhdHVzZXMgdG8gc3VibWl0IHRvIHRoZSBuZXh0IHJvdW5kLCB0aGUgaW5jbHVzaW9uIG9mKi9cbiAgICAgICAgICAvKiB0aGUgc2hvdWxkU3VwZXJzZWRlIEJvb2xlYW4gaW4gdGhlIGlmIGNvbmRpdGlvbiBwdXNoZXMgdGhlbSB0b3dhcmRzKi9cbiAgICAgICAgICAvKiBzdWJtaXR0aW5nIGluIGEgY3VycmVudGx5IG9wZW4gcm91bmQuKi9cbiAgICAgICAgICBjb25zdCBjYW5TdXBlcnNlZGUgPSBoZWxwZXIuc3VwZXJzZWRhYmxlKFxuICAgICAgICAgICAgcmVwb3J0aW5nUm91bmRJZCxcbiAgICAgICAgICAgIGJsb2NrVGltZXN0YW1wLFxuICAgICAgICAgICk7XG5cbiAgICAgICAgICBsZXQgcm91bmRJZDtcbiAgICAgICAgICBsZXQgZWxpZ2libGVUb1N1Ym1pdDtcbiAgICAgICAgICBpZiAoY2FuU3VwZXJzZWRlICYmIHNob3VsZFN1cGVyc2VkZSkge1xuICAgICAgICAgICAgcm91bmRJZCA9IGFkZChyZXBvcnRpbmdSb3VuZElkLCAxKTtcbiAgICAgICAgICAgIGVsaWdpYmxlVG9TdWJtaXQgPSBoZWxwZXIuZGVsYXllZChzdGF0dXMsIHJvdW5kSWQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByb3VuZElkID0gcmVwb3J0aW5nUm91bmRJZDtcbiAgICAgICAgICAgIGVsaWdpYmxlVG9TdWJtaXQgPSBoZWxwZXIuYWNjZXB0aW5nU3VibWlzc2lvbnMocm91bmRJZCk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbGV0IHJvdW5kO1xuICAgICAgICAgIGxldCBzdGFydGVkQXQ7XG4gICAgICAgICAgbGV0IHJvdW5kVGltZW91dDtcbiAgICAgICAgICBpZiAocm91bmRzLmhhcyhyb3VuZElkKSkge1xuICAgICAgICAgICAgcm91bmQgPSByb3VuZHMuZ2V0KHJvdW5kSWQpO1xuICAgICAgICAgICAgc3RhcnRlZEF0ID0gcm91bmQuc3RhcnRlZEF0O1xuICAgICAgICAgICAgcm91bmRUaW1lb3V0ID0gZGV0YWlscy5nZXQocm91bmRJZCkucm91bmRUaW1lb3V0O1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdGFydGVkQXQgPSAwbjtcbiAgICAgICAgICAgIHJvdW5kVGltZW91dCA9IDA7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29uc3QgZXJyb3IgPSBoZWxwZXIudmFsaWRhdGVPcmFjbGVSb3VuZChcbiAgICAgICAgICAgIHN0YXR1cyxcbiAgICAgICAgICAgIHJvdW5kSWQsXG4gICAgICAgICAgICBibG9ja1RpbWVzdGFtcCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChlcnJvciAhPT0gbnVsbCkge1xuICAgICAgICAgICAgZWxpZ2libGVUb1N1Ym1pdCA9IGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBlbGlnaWJsZUZvclNwZWNpZmljUm91bmQ6IGVsaWdpYmxlVG9TdWJtaXQsXG4gICAgICAgICAgICBxdWVyaWVkUm91bmRJZDogcm91bmRJZCxcbiAgICAgICAgICAgIGxhdGVzdFN1Ym1pc3Npb246IHN0YXR1cy5sYXRlc3RTdWJtaXNzaW9uLFxuICAgICAgICAgICAgc3RhcnRlZEF0LFxuICAgICAgICAgICAgcm91bmRUaW1lb3V0LFxuICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgb3JhY2xlOiB7XG4gICAgICAgIC8qKlxuICogcHVzaCBhIHVuaXRQcmljZSByZXN1bHQgZnJvbSB0aGlzIG9yYWNsZVxuICpcbiAqIEBwYXJhbSB7T3JhY2xlU3RhdHVzfSBzdGF0dXNcbiAqIEBwYXJhbSB7UHJpY2VSb3VuZH0gcmVzdWx0XG4gKi9cbiAgICAgICAgYXN5bmMgaGFuZGxlUHVzaChcbiAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgeyByb3VuZElkOiByb3VuZElkUmF3ID0gdW5kZWZpbmVkLCB1bml0UHJpY2U6IHZhbHVlUmF3IH0sXG4gICAgICAgICkge1xuICAgICAgICAgIHRyYWNlKCdoYW5kbGVQdXNoJywgc3RhdHVzLCByb3VuZElkUmF3LCB2YWx1ZVJhdyk7XG4gICAgICAgICAgY29uc3QgdmFsdWUgPSBOYXQodmFsdWVSYXcpO1xuICAgICAgICAgIGNvbnN0IHsgbWluU3VibWlzc2lvblZhbHVlLCBtYXhTdWJtaXNzaW9uVmFsdWUsIHRpbWVyUHJlc2VuY2UgfSA9XG4gICAgICAgICAgICB0aGlzLnN0YXRlO1xuXG4gICAgICAgICAgY29uc3QgeyBjb250cmFjdCwgaGVscGVyIH0gPSB0aGlzLmZhY2V0cztcbiAgICAgICAgICB2YWx1ZSA+PSBtaW5TdWJtaXNzaW9uVmFsdWUgfHxcbiAgICAgICAgICAgIEZhaWxgdmFsdWUgYmVsb3cgbWluU3VibWlzc2lvblZhbHVlICR7cShtaW5TdWJtaXNzaW9uVmFsdWUpfWA7XG4gICAgICAgICAgdmFsdWUgPD0gbWF4U3VibWlzc2lvblZhbHVlIHx8XG4gICAgICAgICAgICBGYWlsYHZhbHVlIGFib3ZlIG1heFN1Ym1pc3Npb25WYWx1ZSAke3EobWF4U3VibWlzc2lvblZhbHVlKX1gO1xuXG4gICAgICAgICAgY29uc3QgYmxvY2tUaW1lc3RhbXAgPSBhd2FpdCBFKHRpbWVyUHJlc2VuY2UpLmdldEN1cnJlbnRUaW1lc3RhbXAoKTtcbiAgICAgICAgICB0cmFjZSgnaGFuZGxlUHVzaCBibG9ja1RpbWVzdGFtcCcsIGJsb2NrVGltZXN0YW1wLmFic1ZhbHVlKTtcblxuICAgICAgICAgIGxldCByb3VuZElkO1xuICAgICAgICAgIGlmIChyb3VuZElkUmF3ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IHN1Z2dlc3RlZFJvdW5kID0gY29udHJhY3Qub3JhY2xlUm91bmRTdGF0ZVN1Z2dlc3RSb3VuZChcbiAgICAgICAgICAgICAgc3RhdHVzLFxuICAgICAgICAgICAgICBibG9ja1RpbWVzdGFtcCxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByb3VuZElkID0gc3VnZ2VzdGVkUm91bmQuZWxpZ2libGVGb3JTcGVjaWZpY1JvdW5kXG4gICAgICAgICAgICAgID8gc3VnZ2VzdGVkUm91bmQucXVlcmllZFJvdW5kSWRcbiAgICAgICAgICAgICAgOiBhZGQoc3VnZ2VzdGVkUm91bmQucXVlcmllZFJvdW5kSWQsIDEpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByb3VuZElkID0gTmF0KHJvdW5kSWRSYXcpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IGVycm9yTXNnID0gaGVscGVyLnZhbGlkYXRlT3JhY2xlUm91bmQoXG4gICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICByb3VuZElkLFxuICAgICAgICAgICAgYmxvY2tUaW1lc3RhbXAsXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIGlmICghKGVycm9yTXNnID09PSBudWxsKSkge1xuICAgICAgICAgICAgYXNzZXJ0LmZhaWwoZXJyb3JNc2cpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHByb3Bvc2VkU3RhdHVzID0gaGVscGVyLnByb3Bvc2VOZXdSb3VuZChcbiAgICAgICAgICAgIHJvdW5kSWQsXG4gICAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgICBibG9ja1RpbWVzdGFtcCxcbiAgICAgICAgICApO1xuICAgICAgICAgIGNvbnN0IHNldHRsZWRTdGF0dXMgPSBoZWxwZXIucmVjb3JkU3VibWlzc2lvbihcbiAgICAgICAgICAgIHZhbHVlLFxuICAgICAgICAgICAgcm91bmRJZCxcbiAgICAgICAgICAgIHByb3Bvc2VkU3RhdHVzIHx8IHN0YXR1cyxcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaGVscGVyLnVwZGF0ZVJvdW5kQW5zd2VyKHJvdW5kSWQsIGJsb2NrVGltZXN0YW1wKTtcbiAgICAgICAgICBoZWxwZXIuZGVsZXRlUm91bmREZXRhaWxzKHJvdW5kSWQpO1xuXG4gICAgICAgICAgdHJhY2UoJ2hhbmRsZVB1c2ggcmV0dXJuaW5nJywgc2V0dGxlZFN0YXR1cyk7XG5cbiAgICAgICAgICByZXR1cm4gc2V0dGxlZFN0YXR1cztcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBmaW5pc2g6ICh7IHN0YXRlIH0pID0+IHtcbiAgICAgICAgY29uc3QgeyBkZXRhaWxzLCByb3VuZHMsIHRpbWVyUHJlc2VuY2UgfSA9IHN0YXRlO1xuICAgICAgICAvKiBaZXJvIGlzIHRyZWF0ZWQgYXMgc3BlY2lhbCBhcyByb3VuZElkIGFuZCBpbiB0aW1lcy4gSXQncyBoYXJkIHRvKi9cbiAgICAgICAgLyogYXZvaWQgb24gcmVzdGFydCBhbmQgaW4gdGVzdHMsIHNvIG1ha2UgMSB0aGUgbWluaW11bSovXG5cbiAgICAgICAgY29uc3QgZmlyc3RSb3VuZCA9IDFuO1xuICAgICAgICBzdGF0ZS5yZXBvcnRpbmdSb3VuZElkID0gZmlyc3RSb3VuZDtcbiAgICAgICAgZGV0YWlscy5pbml0KFxuICAgICAgICAgIGZpcnN0Um91bmQsXG4gICAgICAgICAgaGFyZGVuKHtcbiAgICAgICAgICAgIHN1Ym1pc3Npb25zOiBbXSxcbiAgICAgICAgICAgIG1heFN1Ym1pc3Npb25zOiBzdGF0ZS5tYXhTdWJtaXNzaW9uQ291bnQsXG4gICAgICAgICAgICBtaW5TdWJtaXNzaW9uczogc3RhdGUubWluU3VibWlzc2lvbkNvdW50LFxuICAgICAgICAgICAgcm91bmRUaW1lb3V0OiBzdGF0ZS50aW1lb3V0LFxuICAgICAgICAgIH0pLFxuICAgICAgICApO1xuXG4gICAgICAgIC8qIENhbm5vdCBhd2FpdCBpbiBmaXJzdCBjcmFuay4gRmFpbCBpZiBubyB0aW1lc3RhbXAgYXZhaWxhYmxlKi9cbiAgICAgICAgdm9pZCBFLndoZW4oXG4gICAgICAgICAgRSh0aW1lclByZXNlbmNlKS5nZXRDdXJyZW50VGltZXN0YW1wKCksXG4gICAgICAgICAgbm93TWF5YmUgPT4ge1xuICAgICAgICAgICAgY29uc3Qgbm93ID1cbiAgICAgICAgICAgICAgVGltZU1hdGguY29tcGFyZUFicyhub3dNYXliZSwgMW4pIDwgMFxuICAgICAgICAgICAgICAgID8gVGltZU1hdGguY29lcmNlVGltZXN0YW1wUmVjb3JkKDFuLCBub3dNYXliZS50aW1lckJyYW5kKVxuICAgICAgICAgICAgICAgIDogbm93TWF5YmU7XG5cbiAgICAgICAgICAgIGNvbnN0IHJvdW5kID0gaGFyZGVuKHtcbiAgICAgICAgICAgICAgYW5zd2VyOiAwbixcbiAgICAgICAgICAgICAgc3RhcnRlZEF0OiBub3csXG4gICAgICAgICAgICAgIHVwZGF0ZWRBdDogMG4sXG4gICAgICAgICAgICAgIGFuc3dlcmVkSW5Sb3VuZDogMG4sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJvdW5kcy5pbml0KGZpcnN0Um91bmQsIHJvdW5kKTtcblxuICAgICAgICAgICAgLyogSW4gY2FzZSB0aGlzIGlzIGEgcmVwbGFjZW1lbnQgcHJpY2VGZWVkLCBzZXQgcm91bmRJZCBpbiB2c3RvcmFnZS4qL1xuICAgICAgICAgICAgdm9pZCBzdGF0ZS5sYXRlc3RSb3VuZFB1Ymxpc2hlci53cml0ZSh7XG4gICAgICAgICAgICAgIHJvdW5kSWQ6IGZpcnN0Um91bmQsXG4gICAgICAgICAgICAgIHN0YXJ0ZWRBdDogcm91bmQuc3RhcnRlZEF0LFxuICAgICAgICAgICAgICBzdGFydGVkQnk6ICd1bmluaXRpYWxpemVkJyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgcmVhc29uID0+IEZhaWxgbmVlZCBhIHRpbWVzdGFtcCB0byBzdGFydCByb3VuZHNNYW5hZ2VyICR7cmVhc29ufWAsXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgIH0sXG4gICk7JGjNj19vbmNlLnByZXBhcmVSb3VuZHNNYW5hZ2VyS2l0KHByZXBhcmVSb3VuZHNNYW5hZ2VyS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlJPVU5EX01BWCI6WyJST1VORF9NQVgiXSwicHJlcGFyZVJvdW5kc01hbmFnZXJLaXQiOlsicHJlcGFyZVJvdW5kc01hbmFnZXJLaXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAzFzhtQweAAAMHgAANQAAAEBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTYuMS9zcmMvcHJvcG9zYWxzL3V0aWxzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2ZhciIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyIsIkBhZ29yaWMvdmF0LWRhdGEiXSwiZXhwb3J0cyI6WyJtYWtlSW5zdGFsbENhY2hlIiwib3JhY2xlQnJhbmRGZWVkTmFtZSIsInByb3ZpZGVSZXRpcmVkSW5zdGFuY2VzIiwicmVzZXJ2ZVRoZW5EZXBvc2l0IiwicmVzZXJ2ZVRoZW5HZXROYW1lUGF0aHMiLCJyZXNlcnZlVGhlbkdldE5hbWVzIiwic2FuaXRpemVQYXRoU2VnbWVudCIsInNjYWxlZFByaWNlRmVlZE5hbWUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLEUsV2FsbGV0TmFtZSxnZXRDb3B5TWFwRW50cmllcyxtYWtlQ29weU1hcCxhc3NlcnRQYXRoU2VnbWVudCxtYWtlU2NhbGFyQmlnTWFwU3RvcmU7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcIldhbGxldE5hbWVcIixbJGjNj19hID0+IChXYWxsZXROYW1lID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiZ2V0Q29weU1hcEVudHJpZXNcIixbJGjNj19hID0+IChnZXRDb3B5TWFwRW50cmllcyA9ICRozY9fYSldXSxbXCJtYWtlQ29weU1hcFwiLFskaM2PX2EgPT4gKG1ha2VDb3B5TWFwID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qc1wiLCBbW1wiYXNzZXJ0UGF0aFNlZ21lbnRcIixbJGjNj19hID0+IChhc3NlcnRQYXRoU2VnbWVudCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIm1ha2VTY2FsYXJCaWdNYXBTdG9yZVwiLFskaM2PX2EgPT4gKG1ha2VTY2FsYXJCaWdNYXBTdG9yZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0NvcHlNYXB9IGZyb20gJ0BlbmRvL3BhdHRlcm5zJztcbiAqIEBpbXBvcnQge01hcFN0b3JlLCBTZXRTdG9yZX0gZnJvbSAnQGFnb3JpYy9zdG9yZSc7XG4gKiBAaW1wb3J0IHtOYW1lQWRtaW59IGZyb20gJ0BhZ29yaWMvdmF0cyc7XG4gKiBAaW1wb3J0IHtTY3JhdGNoUGFkfSBmcm9tICdAYWdvcmljL2ludGVybmFsL3NyYy9zY3JhdGNoLmpzJztcbiAqIEBpbXBvcnQge0J1bmRsZX0gZnJvbSAnQGFnb3JpYy9zd2luZ3NldC12YXQnO1xuICogQGltcG9ydCB7SW5zdGFsbGF0aW9ufSBmcm9tICdAYWdvcmljL3pvZSc7XG4gKiBAaW1wb3J0IHtQYXltZW50fSBmcm9tICdAYWdvcmljL2VydHAnO1xuICogQGltcG9ydCB7RVJlZn0gZnJvbSAnQGFnb3JpYy92b3cnO1xuICogQGltcG9ydCB7UHJvZHVjZXJ9IGZyb20gJ0BhZ29yaWMvdmF0cy9zcmMvY29yZS90eXBlcy5qcyc7XG4gKi9cblxuLyoqXG4gKiBAcGFyYW0ge0VSZWY8TmFtZUFkbWluPn0gbmFtZUFkbWluXG4gKiBAcGFyYW0ge3N0cmluZ1tdW119IHBhdGhzXG4gKi9cbiAgICAgICBjb25zdCByZXNlcnZlVGhlbkdldE5hbWVQYXRocyA9IGFzeW5jIChuYW1lQWRtaW4sIHBhdGhzKSA9PiB7XG4gIC8qKlxuICogQHBhcmFtIHtFUmVmPE5hbWVBZG1pbj59IG5leHRBZG1pblxuICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aFxuICogQHJldHVybnMge1Byb21pc2U8dW5rbm93bj59XG4gKi9cbiAgY29uc3QgbmV4dFBhdGggPSBhc3luYyAobmV4dEFkbWluLCBwYXRoKSA9PiB7XG4gICAgY29uc3QgW25leHROYW1lLCAuLi5yZXN0XSA9IHBhdGg7XG4gICAgYXNzZXJ0LnR5cGVvZihuZXh0TmFtZSwgJ3N0cmluZycpO1xuXG4gICAgLyogRW5zdXJlIHdlIHdhaXQgZm9yIHRoZSBuZXh0IG5hbWUgdW50aWwgaXQgZXhpc3RzLiovXG4gICAgYXdhaXQgRShuZXh0QWRtaW4pLnJlc2VydmUobmV4dE5hbWUpO1xuXG4gICAgaWYgKHJlc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICAvKiBOb3cgcmV0dXJuIHRoZSByZWFkb25seSBsb29rdXAgb2YgdGhlIG5hbWUuKi9cbiAgICAgIGNvbnN0IG5hbWVIdWIgPSBFKG5leHRBZG1pbikucmVhZG9ubHkoKTtcbiAgICAgIHJldHVybiBFKG5hbWVIdWIpLmxvb2t1cChuZXh0TmFtZSk7XG4gICAgfVxuXG4gICAgLyogV2FpdCB1bnRpbCB0aGUgbmV4dCBhZG1pbiBpcyByZXNvbHZlZC4qL1xuICAgIGNvbnN0IHJlc3RBZG1pbiA9IGF3YWl0IEUobmV4dEFkbWluKS5sb29rdXBBZG1pbihuZXh0TmFtZSk7XG4gICAgcmV0dXJuIG5leHRQYXRoKHJlc3RBZG1pbiwgcmVzdCk7XG4gIH07XG5cbiAgcmV0dXJuIFByb21pc2UuYWxsKFxuICAgIHBhdGhzLm1hcChhc3luYyBwYXRoID0+IHtcbiAgICAgIEFycmF5LmlzQXJyYXkocGF0aCkgfHwgRmFpbGBwYXRoICR7cGF0aH0gaXMgbm90IGFuIGFycmF5YDtcbiAgICAgIHJldHVybiBuZXh0UGF0aChuYW1lQWRtaW4sIHBhdGgpO1xuICAgIH0pLFxuICApO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge0VSZWY8TmFtZUFkbWluPn0gbmFtZUFkbWluXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBuYW1lc1xuICogQHJldHVybnMge1Byb21pc2U8YW55W10+fVxuICovJGjNj19vbmNlLnJlc2VydmVUaGVuR2V0TmFtZVBhdGhzKHJlc2VydmVUaGVuR2V0TmFtZVBhdGhzKTtcbiAgICAgICBjb25zdCByZXNlcnZlVGhlbkdldE5hbWVzID0gYXN5bmMgKG5hbWVBZG1pbiwgbmFtZXMpID0+XG4gIHJlc2VydmVUaGVuR2V0TmFtZVBhdGhzKFxuICAgIG5hbWVBZG1pbixcbiAgICBuYW1lcy5tYXAobmFtZSA9PiBbbmFtZV0pLFxuICApO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBkZWJ1Z05hbWVcbiAqIEBwYXJhbSB7RVJlZjxOYW1lQWRtaW4+fSBuYW1lc0J5QWRkcmVzc0FkbWluXG4gKiBAcGFyYW0ge3N0cmluZ30gYWRkclxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ+W119IHBheW1lbnRzXG4gKi8kaM2PX29uY2UucmVzZXJ2ZVRoZW5HZXROYW1lcyhyZXNlcnZlVGhlbkdldE5hbWVzKTtcbiAgICAgICBjb25zdCByZXNlcnZlVGhlbkRlcG9zaXQgPSBhc3luYyAoXG4gIGRlYnVnTmFtZSxcbiAgbmFtZXNCeUFkZHJlc3NBZG1pbixcbiAgYWRkcixcbiAgcGF5bWVudHMsXG4pID0+IHtcbiAgY29uc29sZS5pbmZvKCdhd2FpdGluZyBkZXBvc2l0RmFjZXQgZm9yJywgZGVidWdOYW1lKTtcbiAgLyoqIEB0eXBlIHthbnl9ICovXG4gIGNvbnN0IFtkZXBvc2l0RmFjZXRdID0gYXdhaXQgcmVzZXJ2ZVRoZW5HZXROYW1lUGF0aHMobmFtZXNCeUFkZHJlc3NBZG1pbiwgW1xuICAgIFthZGRyLCBXYWxsZXROYW1lLmRlcG9zaXRGYWNldF0sXG4gIF0pO1xuICBjb25zb2xlLmluZm8oJ2RlcG9zaXRpbmcgdG8nLCBkZWJ1Z05hbWUpO1xuICBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQoXG4gICAgcGF5bWVudHMubWFwKGFzeW5jIChwYXltZW50UCwgaSkgPT4ge1xuICAgICAgY29uc3QgcGF5bWVudCA9IGF3YWl0IHBheW1lbnRQO1xuICAgICAgYXdhaXQgRShkZXBvc2l0RmFjZXQpLnJlY2VpdmUocGF5bWVudCk7XG4gICAgICBjb25zb2xlLmluZm8oXG4gICAgICAgIGBjb25maXJtZWQgZGVwb3NpdCAke2kgKyAxfS8ke3BheW1lbnRzLmxlbmd0aH0gZm9yYCxcbiAgICAgICAgZGVidWdOYW1lLFxuICAgICAgKTtcbiAgICB9KSxcbiAgKTtcbn07XG5cbi8qKlxuICogQHR5cGUgezxUPihcbiAqICAgc3RvcmU6IEVSZWY8TWFwPHN0cmluZywgVD4gfCBTY3JhdGNoUGFkPixcbiAqICAga2V5OiBzdHJpbmcsXG4gKiAgIG1ha2U6ICgpID0+IFQsXG4gKiApID0+IFByb21pc2U8VD59XG4gKi8kaM2PX29uY2UucmVzZXJ2ZVRoZW5EZXBvc2l0KHJlc2VydmVUaGVuRGVwb3NpdCk7XG5jb25zdCBwcm92aWRlV2hlbiA9IGFzeW5jIChzdG9yZSwga2V5LCBtYWtlKSA9PiB7XG4gIGNvbnN0IGZvdW5kID0gYXdhaXQgRShzdG9yZSkuZ2V0KGtleSk7XG4gIGlmIChmb3VuZCkge1xuICAgIHJldHVybiBmb3VuZDtcbiAgfVxuICBjb25zdCB2YWx1ZSA9IG1ha2UoKTtcbiAgYXdhaXQgRShzdG9yZSkuc2V0KGtleSwgdmFsdWUpO1xuICByZXR1cm4gdmFsdWU7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7UHJvbWlzZTx7XG4gKiAgIHNjcmF0Y2g6IEVSZWY8U2NyYXRjaFBhZD47XG4gKiB9Pn0gaG9tZVBcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gKiBAcGFyYW0geyhzcGVjaWZpZXI6IHN0cmluZykgPT4gUHJvbWlzZTx7IGRlZmF1bHQ6IEJ1bmRsZSB9Pn0gb3B0cy5sb2FkQnVuZGxlXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdHMuaW5zdGFsbENhY2hlS2V5XVxuICovXG4gICAgICAgY29uc3QgbWFrZUluc3RhbGxDYWNoZSA9IGFzeW5jIChcbiAgaG9tZVAsXG4gIHsgaW5zdGFsbENhY2hlS2V5ID0gJ2luc3RhbGxDYWNoZScsIGxvYWRCdW5kbGUgfSxcbikgPT4ge1xuICAvKipcbiAqIEB0eXBlIHtDb3B5TWFwPFxuICogICBzdHJpbmcsXG4gKiAgIHsgaW5zdGFsbGF0aW9uOiBJbnN0YWxsYXRpb247IGJvYXJkSWQ6IHN0cmluZzsgcGF0aD86IHN0cmluZyB9XG4gKiA+fVxuICovXG4gIGNvbnN0IGluaXRpYWwgPSBhd2FpdCBwcm92aWRlV2hlbihFLmdldChob21lUCkuc2NyYXRjaCwgaW5zdGFsbENhY2hlS2V5LCAoKSA9PlxuICAgIG1ha2VDb3B5TWFwKFtdKSxcbiAgKTtcbiAgLyogSVNTVUU6IGdldENvcHlNYXBFbnRyaWVzIG9mIENvcHlNYXA8SywgVj4gbG9zZXMgSywgVi4qL1xuICAvKipcbiAqIEB0eXBlIHtNYXA8XG4gKiAgIHN0cmluZyxcbiAqICAgeyBpbnN0YWxsYXRpb246IEluc3RhbGxhdGlvbjsgYm9hcmRJZDogc3RyaW5nOyBwYXRoPzogc3RyaW5nIH1cbiAqID59XG4gKi9cbiAgY29uc3Qgd29ya2luZyA9IG5ldyBNYXAoZ2V0Q29weU1hcEVudHJpZXMoaW5pdGlhbCkpO1xuXG4gIGNvbnN0IHNhdmVDYWNoZSA9IGFzeW5jICgpID0+IHtcbiAgICBjb25zdCBmaW5hbCA9IG1ha2VDb3B5TWFwKHdvcmtpbmcpO1xuICAgIGFzc2VydC5lcXVhbChmaW5hbC5wYXlsb2FkLmtleXMubGVuZ3RoLCB3b3JraW5nLnNpemUpO1xuICAgIGF3YWl0IEUoRS5nZXQoaG9tZVApLnNjcmF0Y2gpLnNldChpbnN0YWxsQ2FjaGVLZXksIGZpbmFsKTtcbiAgICBjb25zb2xlLmxvZyh7XG4gICAgICBpbml0aWFsOiBpbml0aWFsLnBheWxvYWQua2V5cy5sZW5ndGgsXG4gICAgICB0b3RhbDogd29ya2luZy5zaXplLFxuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IHdyYXBJbnN0YWxsID0gaW5zdGFsbCA9PiBhc3luYyAobVBhdGgsIGJQYXRoLCBvcHRzKSA9PiB7XG4gICAgY29uc3QgYnVuZGxlID0gYXdhaXQgbG9hZEJ1bmRsZShiUGF0aCkudGhlbihtID0+IG0uZGVmYXVsdCk7XG4gICAgYXNzZXJ0KFxuICAgICAgJ2VuZG9aaXBCYXNlNjRTaGE1MTInIGluIGJ1bmRsZSxcbiAgICAgICdidW5kbGUgbXVzdCBiZSBFbmRvWmlwQmFzZTY0QnVuZGxlJyxcbiAgICApO1xuICAgIGNvbnN0IHsgZW5kb1ppcEJhc2U2NFNoYTUxMjogc2hhNTEyIH0gPSBidW5kbGU7XG4gICAgY29uc3QgZGV0YWlsID0gYXdhaXQgcHJvdmlkZVdoZW4od29ya2luZywgc2hhNTEyLCAoKSA9PlxuICAgICAgaW5zdGFsbChtUGF0aCwgYlBhdGgsIG9wdHMpLnRoZW4oaW5zdGFsbGF0aW9uID0+ICh7XG4gICAgICAgIGluc3RhbGxhdGlvbixcbiAgICAgICAgc2hhNTEyLFxuICAgICAgICBwYXRoOiBiUGF0aCxcbiAgICAgIH0pKSxcbiAgICApO1xuICAgIHJldHVybiBkZXRhaWwuaW5zdGFsbGF0aW9uO1xuICB9O1xuXG4gIHJldHVybiB7IHdyYXBJbnN0YWxsLCBzYXZlQ2FjaGUgfTtcbn07JGjNj19vbmNlLm1ha2VJbnN0YWxsQ2FjaGUobWFrZUluc3RhbGxDYWNoZSk7XG5cbiAgICAgICBjb25zdCBvcmFjbGVCcmFuZEZlZWROYW1lID0gKGluQnJhbmROYW1lLCBvdXRCcmFuZE5hbWUpID0+XG4gIGAke2luQnJhbmROYW1lfS0ke291dEJyYW5kTmFtZX0gcHJpY2UgZmVlZGA7JGjNj19vbmNlLm9yYWNsZUJyYW5kRmVlZE5hbWUob3JhY2xlQnJhbmRGZWVkTmFtZSk7XG5cbiAgICAgICBjb25zdCBzY2FsZWRQcmljZUZlZWROYW1lID0gaXNzdWVyTmFtZSA9PlxuICBgc2NhbGVkUHJpY2VBdXRob3JpdHktJHtpc3N1ZXJOYW1lfWA7XG5cbi8qKiBAdHlwZSB7KG5hbWU6IHN0cmluZykgPT4gc3RyaW5nfSAqLyRozY9fb25jZS5zY2FsZWRQcmljZUZlZWROYW1lKHNjYWxlZFByaWNlRmVlZE5hbWUpO1xuICAgICAgIGNvbnN0IHNhbml0aXplUGF0aFNlZ21lbnQgPSBuYW1lID0+IHtcbiAgY29uc3QgY2FuZGlkYXRlID0gbmFtZS5yZXBsYWNlKC8gL2csICdfJyk7XG4gIGFzc2VydFBhdGhTZWdtZW50KGNhbmRpZGF0ZSk7XG4gIHJldHVybiBjYW5kaWRhdGU7XG59O1xuXG4vKipcbiAqIElkZW1wb3RlbnRseSBwcm92aWRlIGFuIGVtcHR5IE1hcFN0b3JlIGZvciB0aGUgYHJldGlyZWRDb250cmFjdEluc3RhbmNlc2BcbiAqIHZhbHVlIGluIHByb21pc2Ugc3BhY2VcbiAqXG4gKiBAcGFyYW0ge1Byb21pc2U8TWFwU3RvcmU+fSBjb25zdW1lXG4gKiBAcGFyYW0ge1Byb2R1Y2VyPE1hcFN0b3JlPn0gcHJvZHVjZVxuICogQHJldHVybnMge1Byb21pc2U8TWFwU3RvcmU+fVxuICovJGjNj19vbmNlLnNhbml0aXplUGF0aFNlZ21lbnQoc2FuaXRpemVQYXRoU2VnbWVudCk7XG4gICAgICAgY29uc3QgcHJvdmlkZVJldGlyZWRJbnN0YW5jZXMgPSBhc3luYyAoY29uc3VtZSwgcHJvZHVjZSkgPT4ge1xuICAvKiBQcm9taXNlIHNwYWNlIGhhcyBubyB3YXkgdG8gbG9vayBmb3IgYW4gZXhpc3RpbmcgdmFsdWUgb3RoZXIgdGhhbiBhd2FpdGluZyBhIHByb21pc2UsKi9cbiAgLyogYnV0IGl0IGRvZXMgYWxsb3cgZXh0cmEgcHJvZHVjdGlvbiBzbyBpdCdzIHNhZmUgdG8gZG8gdGhpcyByZWR1bmRhbnRseS4qL1xuICBwcm9kdWNlLnJlc29sdmUoXG4gICAgbWFrZVNjYWxhckJpZ01hcFN0b3JlKCdyZXRpcmVkQ29udHJhY3RJbnN0YW5jZXMnLCB7XG4gICAgICBkdXJhYmxlOiB0cnVlLFxuICAgIH0pLFxuICApO1xuICByZXR1cm4gY29uc3VtZTtcbn07JGjNj19vbmNlLnByb3ZpZGVSZXRpcmVkSW5zdGFuY2VzKHByb3ZpZGVSZXRpcmVkSW5zdGFuY2VzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InJlc2VydmVUaGVuR2V0TmFtZVBhdGhzIjpbInJlc2VydmVUaGVuR2V0TmFtZVBhdGhzIl0sInJlc2VydmVUaGVuR2V0TmFtZXMiOlsicmVzZXJ2ZVRoZW5HZXROYW1lcyJdLCJyZXNlcnZlVGhlbkRlcG9zaXQiOlsicmVzZXJ2ZVRoZW5EZXBvc2l0Il0sIm1ha2VJbnN0YWxsQ2FjaGUiOlsibWFrZUluc3RhbGxDYWNoZSJdLCJvcmFjbGVCcmFuZEZlZWROYW1lIjpbIm9yYWNsZUJyYW5kRmVlZE5hbWUiXSwic2NhbGVkUHJpY2VGZWVkTmFtZSI6WyJzY2FsZWRQcmljZUZlZWROYW1lIl0sInNhbml0aXplUGF0aFNlZ21lbnQiOlsic2FuaXRpemVQYXRoU2VnbWVudCJdLCJwcm92aWRlUmV0aXJlZEluc3RhbmNlcyI6WyJwcm92aWRlUmV0aXJlZEluc3RhbmNlcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAFGAvc2SwAANksAAAnAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2NhbGxiYWNrLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2ZhciIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbImNhbGxFIiwiY2FsbFN5bmMiLCJpc0NhbGxiYWNrIiwibWFrZUZ1bmN0aW9uQ2FsbGJhY2siLCJtYWtlTWV0aG9kQ2FsbGJhY2siLCJtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2siLCJtYWtlU3luY01ldGhvZENhbGxiYWNrIiwicHJlcGFyZUF0dGVudWF0b3IiLCJwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLG1ha2VFcnJvcixxLEUsaXNQcmltaXRpdmUsaXNQYXNzYWJsZVN5bWJvbCxnZXRJbnRlcmZhY2VNZXRob2RLZXlzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJtYWtlRXJyb3JcIixbJGjNj19hID0+IChtYWtlRXJyb3IgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiaXNQcmltaXRpdmVcIixbJGjNj19hID0+IChpc1ByaW1pdGl2ZSA9ICRozY9fYSldXSxbXCJpc1Bhc3NhYmxlU3ltYm9sXCIsWyRozY9fYSA9PiAoaXNQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJnZXRJbnRlcmZhY2VNZXRob2RLZXlzXCIsWyRozY9fYSA9PiAoZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtFUmVmfSBmcm9tICdAZW5kby9mYXInXG4gKiBAaW1wb3J0IHtNZXRob2RzfSBmcm9tICdAZW5kby9leG8nO1xuICogQGltcG9ydCB7RmFyYWJsZX0gZnJvbSAnQGVuZG8vZXhvJztcbiAqIEBpbXBvcnQge1pvbmV9IGZyb20gJ0BhZ29yaWMvYmFzZS16b25lJztcbiAqIEBpbXBvcnQge0ludGVyZmFjZUd1YXJkfSBmcm9tICdAZW5kby9wYXR0ZXJucyc7XG4gKiBAaW1wb3J0IHtNZXRob2RHdWFyZH0gZnJvbSAnQGVuZG8vcGF0dGVybnMnO1xuICovXG4vKiogQGltcG9ydCB7Q2FsbGJhY2ssIFN5bmNDYWxsYmFja30gZnJvbSAnLi90eXBlcy5qcycgKi9cblxuY29uc3QgeyBmcm9tRW50cmllcyB9ID0gT2JqZWN0O1xuXG5jb25zdCB7IG93bktleXM6IHJhd093bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCBvd25LZXlzID1cbiAgLyoqIEB0eXBlIHs8VCBleHRlbmRzIFByb3BlcnR5S2V5PihvYmo6IHsgW0sgaW4gVF0/OiB1bmtub3duIH0pID0+IFRbXX0gKi8gKFxuICAgIHJhd093bktleXNcbiAgKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge01ldGhvZHN9IFRcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIC4uLmFyZ3M6IFBhcmFtZXRlcnM8UmV0dXJuVHlwZTx0eXBlb2YgcHJlcGFyZUF0dGVudWF0b3I+PlxuICogKSA9PiBGYXJhYmxlPFQ+fSBNYWtlQXR0ZW51YXRvclxuICovXG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSBrZXlcbiAqIEByZXR1cm5zIHtrZXkgaXMgUHJvcGVydHlLZXl9IEZJWE1FOiBzaG91bGQgYmUganVzdCBgUHJvcGVydHlLZXlgIGJ1dCBUU1xuICogICBjb21wbGFpbnMgaXQgY2FuJ3QgYmUgdXNlZCBhcyBhbiBpbmRleCB0eXBlLlxuICovXG5jb25zdCBpc1Byb3BlcnR5S2V5ID0ga2V5ID0+IHtcbiAgc3dpdGNoICh0eXBlb2Yga2V5KSB7XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICBjYXNlICdudW1iZXInOlxuICAgIGNhc2UgJ3N5bWJvbCc6XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG59O1xuXG4vKipcbiAqIFN5bmNocm9ub3VzbHkgY2FsbCBhIGNhbGxiYWNrLlxuICpcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IElcbiAqIEBwYXJhbSB7U3luY0NhbGxiYWNrPEk+fSBjYWxsYmFja1xuICogQHBhcmFtIHtQYXJhbWV0ZXJzPEk+fSBhcmdzXG4gKiBAcmV0dXJucyB7UmV0dXJuVHlwZTxJPn1cbiAqL1xuICAgICAgIGNvbnN0IGNhbGxTeW5jID0gKGNhbGxiYWNrLCAuLi5hcmdzKSA9PiB7XG4gIGNvbnN0IHsgdGFyZ2V0LCBtZXRob2ROYW1lLCBib3VuZCB9ID0gY2FsbGJhY2s7XG4gIGlmIChtZXRob2ROYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gdGFyZ2V0KC4uLmJvdW5kLCAuLi5hcmdzKTtcbiAgfVxuICByZXR1cm4gdGFyZ2V0W21ldGhvZE5hbWVdKC4uLmJvdW5kLCAuLi5hcmdzKTtcbn07JGjNj19vbmNlLmNhbGxTeW5jKGNhbGxTeW5jKTtcbmhhcmRlbihjYWxsU3luYyk7XG5cbi8qKlxuICogRXZlbnR1YWwgc2VuZCB0byBhIGNhbGxiYWNrLlxuICpcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IElcbiAqIEBwYXJhbSB7Q2FsbGJhY2s8ST59IGNhbGxiYWNrXG4gKiBAcGFyYW0ge1BhcmFtZXRlcnM8ST59IGFyZ3NcbiAqIEByZXR1cm5zIHtQcm9taXNlPEF3YWl0ZWQ8UmV0dXJuVHlwZTxJPj4+fVxuICovXG4gICAgICAgY29uc3QgY2FsbEUgPSAoY2FsbGJhY2ssIC4uLmFyZ3MpID0+IHtcbiAgY29uc3QgeyB0YXJnZXQsIG1ldGhvZE5hbWUsIGJvdW5kIH0gPSBjYWxsYmFjaztcbiAgaWYgKG1ldGhvZE5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiBFKHRhcmdldCkoLi4uYm91bmQsIC4uLmFyZ3MpO1xuICB9XG4gIHJldHVybiBFKHRhcmdldClbbWV0aG9kTmFtZV0oLi4uYm91bmQsIC4uLmFyZ3MpO1xufTskaM2PX29uY2UuY2FsbEUoY2FsbEUpO1xuaGFyZGVuKGNhbGxFKTtcblxuLyoqXG4gKiBDcmVhdGUgYSBjYWxsYmFjayBmcm9tIGEgbmVhciBmdW5jdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBJXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBbLi4uQiwgLi4uUGFyYW1ldGVyczxJPl0pID0+IFJldHVyblR5cGU8ST59IFtUPUldXG4gKiBAdGVtcGxhdGUge2FueVtdfSBbQj1bXV1cbiAqIEBwYXJhbSB7VH0gdGFyZ2V0XG4gKiBAcGFyYW0ge0J9IGJvdW5kXG4gKiBAcmV0dXJucyB7U3luY0NhbGxiYWNrPEk+fVxuICovXG4gICAgICAgY29uc3QgbWFrZVN5bmNGdW5jdGlvbkNhbGxiYWNrID0gKHRhcmdldCwgLi4uYm91bmQpID0+IHtcbiAgdHlwZW9mIHRhcmdldCA9PT0gJ2Z1bmN0aW9uJyB8fFxuICAgIEZhaWxgc3luYyBmdW5jdGlvbiBjYWxsYmFjayB0YXJnZXQgbXVzdCBiZSBhIGZ1bmN0aW9uOiAke3RhcmdldH1gO1xuICAvKiogQHR5cGUge3Vua25vd259ICovXG4gIGNvbnN0IGNiID0gaGFyZGVuKHsgdGFyZ2V0LCBib3VuZCwgaXNTeW5jOiB0cnVlIH0pO1xuICByZXR1cm4gLyoqIEB0eXBlIHtTeW5jQ2FsbGJhY2s8ST59ICovIChjYik7XG59OyRozY9fb25jZS5tYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2sobWFrZVN5bmNGdW5jdGlvbkNhbGxiYWNrKTtcbmhhcmRlbihtYWtlU3luY0Z1bmN0aW9uQ2FsbGJhY2spO1xuXG4vKipcbiAqIENyZWF0ZSBhIGNhbGxiYWNrIGZyb20gYSBwb3RlbnRpYWxseSBmYXIgZnVuY3Rpb24uXG4gKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gSVxuICogQHRlbXBsYXRlIHtFUmVmPCguLi5hcmdzOiBbLi4uQiwgLi4uUGFyYW1ldGVyczxJPl0pID0+IFJldHVyblR5cGU8ST4+fSBbVD1FUmVmPEk+XVxuICogQHRlbXBsYXRlIHthbnlbXX0gW0I9W11dXG4gKiBAcGFyYW0ge1R9IHRhcmdldFxuICogQHBhcmFtIHtCfSBib3VuZFxuICogQHJldHVybnMge0NhbGxiYWNrPEk+fVxuICovXG4gICAgICAgY29uc3QgbWFrZUZ1bmN0aW9uQ2FsbGJhY2sgPSAodGFyZ2V0LCAuLi5ib3VuZCkgPT4ge1xuICAhaXNQcmltaXRpdmUodGFyZ2V0KSB8fFxuICAgIEZhaWxgZnVuY3Rpb24gY2FsbGJhY2sgdGFyZ2V0IG11c3QgYmUgYSBmdW5jdGlvbiBwcmVzZW5jZTogJHt0YXJnZXR9YDtcbiAgLyoqIEB0eXBlIHt1bmtub3dufSAqL1xuICBjb25zdCBjYiA9IGhhcmRlbih7IHRhcmdldCwgYm91bmQgfSk7XG4gIHJldHVybiAvKiogQHR5cGUge0NhbGxiYWNrPEk+fSAqLyAoY2IpO1xufTskaM2PX29uY2UubWFrZUZ1bmN0aW9uQ2FsbGJhY2sobWFrZUZ1bmN0aW9uQ2FsbGJhY2spO1xuaGFyZGVuKG1ha2VGdW5jdGlvbkNhbGxiYWNrKTtcblxuLyoqXG4gKiBDcmVhdGUgYSBjYWxsYmFjayBmcm9tIGEgbmVhciBtZXRob2QuXG4gKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gSVxuICogQHRlbXBsYXRlIHtQcm9wZXJ0eUtleX0gUFxuICogQHRlbXBsYXRlIHt7XG4gKiAgIFt4IGluIFBdOiAoLi4uYXJnczogWy4uLkIsIC4uLlBhcmFtZXRlcnM8ST5dKSA9PiBSZXR1cm5UeXBlPEk+O1xuICogfX0gW1Q9eyBbeCBpbiBQXTogSSB9XVxuICogQHRlbXBsYXRlIHthbnlbXX0gW0I9W11dXG4gKiBAcGFyYW0ge1R9IHRhcmdldFxuICogQHBhcmFtIHtQfSBtZXRob2ROYW1lXG4gKiBAcGFyYW0ge0J9IGJvdW5kXG4gKiBAcmV0dXJucyB7U3luY0NhbGxiYWNrPEk+fVxuICovXG4gICAgICAgY29uc3QgbWFrZVN5bmNNZXRob2RDYWxsYmFjayA9ICh0YXJnZXQsIG1ldGhvZE5hbWUsIC4uLmJvdW5kKSA9PiB7XG4gICFpc1ByaW1pdGl2ZSh0YXJnZXQpIHx8XG4gICAgRmFpbGBzeW5jIG1ldGhvZCBjYWxsYmFjayB0YXJnZXQgbXVzdCBiZSBhbiBvYmplY3Q6ICR7dGFyZ2V0fWA7XG4gIHR5cGVvZiBtZXRob2ROYW1lID09PSAnc3RyaW5nJyB8fFxuICAgIGlzUGFzc2FibGVTeW1ib2wobWV0aG9kTmFtZSkgfHxcbiAgICBGYWlsYG1ldGhvZCBuYW1lIG11c3QgYmUgYSBzdHJpbmcgb3IgcGFzc2FibGUgc3ltYm9sOiAke21ldGhvZE5hbWV9YDtcbiAgLyoqIEB0eXBlIHt1bmtub3dufSAqL1xuICBjb25zdCBjYiA9IGhhcmRlbih7IHRhcmdldCwgbWV0aG9kTmFtZSwgYm91bmQsIGlzU3luYzogdHJ1ZSB9KTtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7U3luY0NhbGxiYWNrPEk+fSAqLyAoY2IpO1xufTskaM2PX29uY2UubWFrZVN5bmNNZXRob2RDYWxsYmFjayhtYWtlU3luY01ldGhvZENhbGxiYWNrKTtcbmhhcmRlbihtYWtlU3luY01ldGhvZENhbGxiYWNrKTtcblxuLyoqXG4gKiBDcmVhdGUgYSBjYWxsYmFjayBmcm9tIGEgcG90ZW50aWFsbHkgZmFyIG1ldGhvZC5cbiAqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBJXG4gKiBAdGVtcGxhdGUge1Byb3BlcnR5S2V5fSBQXG4gKiBAdGVtcGxhdGUge0VSZWY8e1xuICogICBbeCBpbiBQXTogKC4uLmFyZ3M6IFsuLi5CLCAuLi5QYXJhbWV0ZXJzPEk+XSkgPT4gUmV0dXJuVHlwZTxJPjtcbiAqIH0+fSBbVD1FUmVmPHsgW3ggaW4gUF06IEkgfT5dXG4gKiBAdGVtcGxhdGUge2FueVtdfSBbQj1bXV1cbiAqIEBwYXJhbSB7VH0gdGFyZ2V0XG4gKiBAcGFyYW0ge1B9IG1ldGhvZE5hbWVcbiAqIEBwYXJhbSB7Qn0gYm91bmRcbiAqIEByZXR1cm5zIHtDYWxsYmFjazxJPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VNZXRob2RDYWxsYmFjayA9ICh0YXJnZXQsIG1ldGhvZE5hbWUsIC4uLmJvdW5kKSA9PiB7XG4gICFpc1ByaW1pdGl2ZSh0YXJnZXQpIHx8XG4gICAgRmFpbGBtZXRob2QgY2FsbGJhY2sgdGFyZ2V0IG11c3QgYmUgYW4gb2JqZWN0OiAke3RhcmdldH1gO1xuICB0eXBlb2YgbWV0aG9kTmFtZSA9PT0gJ3N0cmluZycgfHxcbiAgICBpc1Bhc3NhYmxlU3ltYm9sKG1ldGhvZE5hbWUpIHx8XG4gICAgRmFpbGBtZXRob2QgbmFtZSBtdXN0IGJlIGEgc3RyaW5nIG9yIHBhc3NhYmxlIHN5bWJvbDogJHttZXRob2ROYW1lfWA7XG4gIC8qKiBAdHlwZSB7dW5rbm93bn0gKi9cbiAgY29uc3QgY2IgPSBoYXJkZW4oeyB0YXJnZXQsIG1ldGhvZE5hbWUsIGJvdW5kIH0pO1xuICByZXR1cm4gLyoqIEB0eXBlIHtDYWxsYmFjazxJPn0gKi8gKGNiKTtcbn07JGjNj19vbmNlLm1ha2VNZXRob2RDYWxsYmFjayhtYWtlTWV0aG9kQ2FsbGJhY2spO1xuaGFyZGVuKG1ha2VNZXRob2RDYWxsYmFjayk7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IGNhbGxiYWNrXG4gKiBAcmV0dXJucyB7Y2FsbGJhY2sgaXMgQ2FsbGJhY2s8YW55Pn1cbiAqL1xuICAgICAgIGNvbnN0IGlzQ2FsbGJhY2sgPSBjYWxsYmFjayA9PiB7XG4gIGlmIChpc1ByaW1pdGl2ZShjYWxsYmFjaykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgeyB0YXJnZXQsIG1ldGhvZE5hbWUsIGJvdW5kIH0gPSBjYWxsYmFjaztcbiAgcmV0dXJuIChcbiAgICAhaXNQcmltaXRpdmUodGFyZ2V0KSAmJlxuICAgIChtZXRob2ROYW1lID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHR5cGVvZiBtZXRob2ROYW1lID09PSAnc3RyaW5nJyB8fFxuICAgICAgaXNQYXNzYWJsZVN5bWJvbChtZXRob2ROYW1lKSkgJiZcbiAgICBBcnJheS5pc0FycmF5KGJvdW5kKVxuICApO1xufTskaM2PX29uY2UuaXNDYWxsYmFjayhpc0NhbGxiYWNrKTtcbmhhcmRlbihpc0NhbGxiYWNrKTtcblxuLyoqXG4gKiBQcmVwYXJlIGFuIGF0dGVudWF0b3IgY2xhc3Mgd2hvc2UgbWV0aG9kcyBjYW4gYmUgcmVkaXJlY3RlZCB2aWEgY2FsbGJhY2tzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7UHJvcGVydHlLZXl9IE1cbiAqIEBwYXJhbSB7Wm9uZX0gem9uZSBUaGUgem9uZSBpbiB3aGljaCB0byBhbGxvY2F0ZSBhdHRlbnVhdG9ycy5cbiAqIEBwYXJhbSB7TVtdfSBtZXRob2ROYW1lcyBNZXRob2RzIHRvIGZvcndhcmQuXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZDx7XG4gKiAgIFtLIGluIE1dOiBNZXRob2RHdWFyZDtcbiAqIH0+fSBbb3B0cy5pbnRlcmZhY2VHdWFyZF1cbiAqICAgQW4gaW50ZXJmYWNlIGd1YXJkIGZvciB0aGUgbmV3IGF0dGVudWF0b3IuXG4gKiBAcGFyYW0ge3N0cmluZ30gW29wdHMudGFnXSBBIHRhZyBmb3IgdGhlIG5ldyBhdHRlbnVhdG9yIGV4b0NsYXNzLlxuICovXG4gICAgICAgY29uc3QgcHJlcGFyZUF0dGVudWF0b3IgPSAoXG4gIHpvbmUsXG4gIG1ldGhvZE5hbWVzLFxuICB7IGludGVyZmFjZUd1YXJkLCB0YWcgPSAnQXR0ZW51YXRvcicgfSA9IHt9LFxuKSA9PiB7XG4gIC8qKlxuICogQHR5cGVkZWYgeyh0aGlzOiBhbnksIC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IE1ldGhvZFxuICpcbiAqIEB0eXBlZGVmIHt7IFtLIGluIE1dPzogQ2FsbGJhY2s8YW55PiB8IG51bGwgfX0gT3ZlcnJpZGVzXG4gKlxuICogQHR5cGVkZWYge3sgW0sgaW4gTV06ICh0aGlzOiBhbnksIC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkgfX0gTWV0aG9kc1xuICovXG4gIGNvbnN0IG1ldGhvZHMgPSAvKiogQHR5cGUge01ldGhvZHN9ICovIChcbiAgICBmcm9tRW50cmllcyhcbiAgICAgIG1ldGhvZE5hbWVzLm1hcChrZXkgPT4ge1xuICAgICAgICAvKiBPbmx5IGFsbG93IHRoZSBgUHJvcGVydHlLZXlgIHR5cGUgZm9yIHRoZSB0YXJnZXQgbWV0aG9kIGtleS4qL1xuICAgICAgICBpZiAoIWlzUHJvcGVydHlLZXkoa2V5KSkge1xuICAgICAgICAgIHRocm93IEZhaWxga2V5ICR7cShrZXkpfSBpcyBub3QgYSBQcm9wZXJ0eUtleWA7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBtID0gLyoqIEB0eXBlIHtNZXRob2RzfSAqLyAoe1xuICAgICAgICAgIC8qIEV4cGxpY2l0bHkgdXNlIGNvbmNpc2UgbWV0aG9kIHN5bnRheCB0byBwcmVzZXJ2ZSBgdGhpc2AgYnV0IHByZXZlbnQqL1xuICAgICAgICAgIC8qIGNvbnN0cnVjdG9yIGJlaGF2aW9yLiovXG4gICAgICAgICAgLyoqIEB0eXBlIHtNZXRob2R9ICovXG4gICAgICAgICAgW2tleV0oLi4uYXJncykge1xuICAgICAgICAgICAgLyogU3VwcG9ydCBib3RoIHN5bmNocm9ub3VzIGFuZCBhc3luYyBjYWxsYmFja3MuKi9cbiAgICAgICAgICAgIGNvbnN0IGNiID0gdGhpcy5zdGF0ZS5jYnNba2V5XTtcbiAgICAgICAgICAgIGlmICghY2IpIHtcbiAgICAgICAgICAgICAgY29uc3QgZXJyID0gbWFrZUVycm9yKGB1bmltcGxlbWVudGVkICR7cSh0YWcpfSBtZXRob2QgJHtxKGtleSl9YCk7XG4gICAgICAgICAgICAgIGlmICh0aGlzLnN0YXRlLmlzU3luYykge1xuICAgICAgICAgICAgICAgIHRocm93IGVycjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChjYi5pc1N5bmMpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGNhbGxTeW5jKGNiLCAuLi5hcmdzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjYWxsRShjYiwgLi4uYXJncyk7XG4gICAgICAgICAgfSxcbiAgICAgICAgfSlba2V5XTtcbiAgICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7Y29uc3R9ICovIChba2V5LCBtXSk7XG4gICAgICB9KSxcbiAgICApXG4gICk7XG5cbiAgLyoqXG4gKiBDcmVhdGUgYW4gZXhvIG9iamVjdCB3aG9zZSBiZWhhdmlvciBpcyBjb21wb3NlZCBmcm9tIGEgZGVmYXVsdCB0YXJnZXRcbiAqIGFuZC9vciBpbmRpdmlkdWFsIG1ldGhvZCBvdmVycmlkZSBjYWxsYmFja3MuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IG9wdHNcbiAqIEBwYXJhbSB7dW5rbm93bn0gW29wdHMudGFyZ2V0XSBUaGUgdGFyZ2V0IGZvciBhbnkgbWV0aG9kcyB0aGF0IHdlcmVuJ3RcbiAqICAgc3BlY2lmaWVkIGluIGBvcHRzLm92ZXJyaWRlc2AuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRzLmlzU3luYz1mYWxzZV0gV2hldGhlciB0aGUgdGFyZ2V0IHNob3VsZCBiZSB0cmVhdGVkXG4gKiAgIGFzIHN5bmNocm9ub3VzbHkgYXZhaWxhYmxlLlxuICogQHBhcmFtIHtPdmVycmlkZXN9IFtvcHRzLm92ZXJyaWRlc10gU2V0IGluZGl2aWR1YWwgY2FsbGJhY2tzIGZvciBtZXRob2RzXG4gKiAgICh3aG9zZSBuYW1lcyBtdXN0IGJlIGRlZmluZWQgaW4gdGhlIGBwcmVwYXJlQXR0ZW51YXRvcmAgb3JcbiAqICAgYHByZXBhcmVHdWFyZGVkQXR0ZW51YXRvcmAgY2FsbCkuIE51bGxpc2ggb3ZlcnJpZGVzIG1lYW4gdG8gdGhyb3cuXG4gKi9cbiAgY29uc3QgbWFrZUF0dGVudWF0b3IgPSB6b25lLmV4b0NsYXNzKFxuICAgIHRhZyxcbiAgICBpbnRlcmZhY2VHdWFyZCxcbiAgICAvKipcbiAqIEBwYXJhbSB7b2JqZWN0fSBvcHRzXG4gKiBAcGFyYW0ge2FueX0gW29wdHMudGFyZ2V0XVxuICogQHBhcmFtIHtib29sZWFufSBbb3B0cy5pc1N5bmNdXG4gKiBAcGFyYW0ge092ZXJyaWRlc30gW29wdHMub3ZlcnJpZGVzXVxuICovXG4gICAgKHtcbiAgICAgIHRhcmdldCA9IG51bGwsXG4gICAgICBpc1N5bmMgPSBmYWxzZSxcbiAgICAgIG92ZXJyaWRlcyA9IC8qKiBAdHlwZSB7T3ZlcnJpZGVzfSAqLyAoe30pLFxuICAgIH0pID0+IHtcbiAgICAgIGNvbnN0IGNicyA9IC8qKiBAdHlwZSB7T3ZlcnJpZGVzfSAqLyAoe30pO1xuXG4gICAgICBjb25zdCByZW1haW5pbmcgPSBuZXcgU2V0KG1ldGhvZE5hbWVzKTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIG93bktleXMob3ZlcnJpZGVzKSkge1xuICAgICAgICByZW1haW5pbmcuaGFzKGtleSkgfHxcbiAgICAgICAgICBGYWlsYCR7cSh0YWcpfSBvdmVycmlkZXNbJHtxKGtleSl9XSBub3QgYWxsb3dlZCBieSBtZXRob2ROYW1lc2A7XG5cbiAgICAgICAgcmVtYWluaW5nLmRlbGV0ZShrZXkpO1xuICAgICAgICBjb25zdCBjYiA9IG92ZXJyaWRlc1trZXldO1xuICAgICAgICBjYiA9PSBudWxsIHx8XG4gICAgICAgICAgaXNDYWxsYmFjayhjYikgfHxcbiAgICAgICAgICBGYWlsYCR7cSh0YWcpfSBvdmVycmlkZXNbJHtxKGtleSl9XSBpcyBub3QgYSBjYWxsYmFjazsgZ290ICR7Y2J9YDtcbiAgICAgICAgY2JzW2tleV0gPSBjYjtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIHJlbWFpbmluZykge1xuICAgICAgICBpZiAoaXNTeW5jKSB7XG4gICAgICAgICAgY2JzW2tleV0gPSBtYWtlU3luY01ldGhvZENhbGxiYWNrKHRhcmdldCwga2V5KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjYnNba2V5XSA9IG1ha2VNZXRob2RDYWxsYmFjayh0YXJnZXQsIGtleSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBoYXJkZW4oeyBjYnMsIGlzU3luYyB9KTtcbiAgICB9LFxuICAgIC8qKiBAdHlwZSB7TWV0aG9kc30gKi8gKG1ldGhvZHMpLFxuICApO1xuICByZXR1cm4gbWFrZUF0dGVudWF0b3I7XG59OyRozY9fb25jZS5wcmVwYXJlQXR0ZW51YXRvcihwcmVwYXJlQXR0ZW51YXRvcik7XG5oYXJkZW4ocHJlcGFyZUF0dGVudWF0b3IpO1xuXG4vKipcbiAqIFByZXBhcmUgYW4gYXR0ZW51YXRvciB3aG9zZSBtZXRob2ROYW1lcyBhcmUgZGVyaXZlZCBmcm9tIHRoZSBpbnRlcmZhY2VHdWFyZC5cbiAqXG4gKiBAdGVtcGxhdGUge0ludGVyZmFjZUd1YXJkfSBHXG4gKiBAcGFyYW0ge1pvbmV9IHpvbmVcbiAqIEBwYXJhbSB7R30gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0c11cbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0cy50YWddXG4gKi9cbiAgICAgICBjb25zdCBwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IgPSAoem9uZSwgaW50ZXJmYWNlR3VhcmQsIG9wdHMgPSB7fSkgPT4ge1xuICBjb25zdCBtZXRob2ROYW1lcyA9IGdldEludGVyZmFjZU1ldGhvZEtleXMoaW50ZXJmYWNlR3VhcmQpO1xuICBjb25zdCBtYWtlQXR0ZW51YXRvciA9IHByZXBhcmVBdHRlbnVhdG9yKHpvbmUsIG1ldGhvZE5hbWVzLCB7XG4gICAgLi4ub3B0cyxcbiAgICBpbnRlcmZhY2VHdWFyZCxcbiAgfSk7XG4gIHJldHVybiAvKiogQHR5cGUge01ha2VBdHRlbnVhdG9yPGFueT59ICovIChtYWtlQXR0ZW51YXRvcik7XG59OyRozY9fb25jZS5wcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IocHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yKTtcbmhhcmRlbihwcmVwYXJlR3VhcmRlZEF0dGVudWF0b3IpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY2FsbFN5bmMiOlsiY2FsbFN5bmMiXSwiY2FsbEUiOlsiY2FsbEUiXSwibWFrZVN5bmNGdW5jdGlvbkNhbGxiYWNrIjpbIm1ha2VTeW5jRnVuY3Rpb25DYWxsYmFjayJdLCJtYWtlRnVuY3Rpb25DYWxsYmFjayI6WyJtYWtlRnVuY3Rpb25DYWxsYmFjayJdLCJtYWtlU3luY01ldGhvZENhbGxiYWNrIjpbIm1ha2VTeW5jTWV0aG9kQ2FsbGJhY2siXSwibWFrZU1ldGhvZENhbGxiYWNrIjpbIm1ha2VNZXRob2RDYWxsYmFjayJdLCJpc0NhbGxiYWNrIjpbImlzQ2FsbGJhY2siXSwicHJlcGFyZUF0dGVudWF0b3IiOlsicHJlcGFyZUF0dGVudWF0b3IiXSwicHJlcGFyZUd1YXJkZWRBdHRlbnVhdG9yIjpbInByZXBhcmVHdWFyZGVkQXR0ZW51YXRvciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACjNk+m9QQAAPUEAAAoAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2NsaS11dGlscy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsidG9DTElPcHRpb25zIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qKlxuICogQ29udmVydCBhIHN0cmluZy1rZXllZCBvYmplY3QgaW50byBhbiBhcnJheSBvZiBDTEkgb3B0aW9ucywgdXNpbmcgZWFjaCBrZXkgYXNcbiAqIHRoZSBuYW1lIG9mIGEgR05VLXN0eWxlIGxvbmcgb3B0aW9uIGAtLSR7a2V5fWAsIGlnbm9yaW5nIGVhY2gga2V5IHdpdGggYW5cbiAqIHVuZGVmaW5lZCB2YWx1ZSBhbmQgY29udmVydGluZyBib29sZWFuIHZhbHVlcyBpbnRvIG5vLWFyZ3VtZW50IGAtLSR7a2V5fWAgb3JcbiAqIGAtLW5vLSR7a2V5fWAgb3B0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIHVuZGVmaW5lZCB8IGJvb2xlYW4gfCBzdHJpbmcgfCBzdHJpbmdbXT59IHJlY29yZCAtXG4gKiAgIGUuZy4geyBjb2xvcjogJ2JsdWUnIH1cbiAqIEByZXR1cm5zIHtzdHJpbmdbXX0gLSBlLmcuIFsnLS1jb2xvcicsICdibHVlJ11cbiAqL1xuICAgICAgIGNvbnN0IHRvQ0xJT3B0aW9ucyA9IHJlY29yZCA9PlxuICBPYmplY3QuZW50cmllcyhyZWNvcmQpLmZsYXRNYXAoKFtrZXksIHZhbHVlXSkgPT4ge1xuICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSByZXR1cm4gW107XG4gICAgaWYgKHZhbHVlID09PSB0cnVlKSByZXR1cm4gW2AtLSR7a2V5fWBdO1xuICAgIGlmICh2YWx1ZSA9PT0gZmFsc2UpIHJldHVybiBbYC0tbm8tJHtrZXl9YF07XG4gICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAvKiBSZXByZXNlbnQgYXMgYSByZXBlYXRlZCBvcHRpb24uKi9cbiAgICAgIHJldHVybiB2YWx1ZS5mbGF0TWFwKHYgPT4gW2AtLSR7a2V5fWAsIHZdKTtcbiAgICB9XG4gICAgcmV0dXJuIFtgLS0ke2tleX1gLCB2YWx1ZV07XG4gIH0pOyRozY9fb25jZS50b0NMSU9wdGlvbnModG9DTElPcHRpb25zKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InRvQ0xJT3B0aW9ucyI6WyJ0b0NMSU9wdGlvbnMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAbQ14FcoMAADKDAAAJQAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9jb25maWcuanN7ImltcG9ydHMiOlsiLi9rZXlNaXJyb3IuanMiXSwiZXhwb3J0cyI6WyJCcmlkZ2VJZCIsIkNvc21vc0luaXRLZXlUb0JyaWRnZUlkIiwiVkJhbmtBY2NvdW50IiwiV2FsbGV0TmFtZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGtleU1pcnJvcjskaM2PX2ltcG9ydHMoW1tcIi4va2V5TWlycm9yLmpzXCIsIFtbXCJrZXlNaXJyb3JcIixbJGjNj19hID0+IChrZXlNaXJyb3IgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKipcbiAqIEBmaWxlXG4gKlxuICogICBTb21lIG9mIHRoaXMgY29uZmlnIGluZm8gbWF5IG1ha2UgbW9yZSBzZW5zZSBpbiBhIHBhcnRpY3VsYXIgcGFja2FnZS4gSG93ZXZlclxuICogICBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80NjIwIGFuZCBvdXIgbGF4IHBhY2thZ2VcbiAqICAgZGVwZW5kZW5jeSBncmFwaCwgc29tZXRpbWVzIHJhdGlvbmFsIHBsYWNlbWVudHMgY2F1c2UgdHlwZSByZXNvbHV0aW9uXG4gKiAgIGVycm9ycy5cbiAqXG4gKiAgIFNvIGFzIGEgd29yay1hcm91bmQgc29tZSBjb25zdGFudHMgdGhhdCBuZWVkIGFjY2VzcyBmcm9tIG1vcmUgdGhhbiBvbmVcbiAqICAgcGFja2FnZSBhcmUgcGxhY2VkIGhlcmUuXG4gKi9cblxuLyoqXG4gKiBDbHVzdGVyTmFtZSBzcGVjaWZpZXMgYSBjb2xsZWN0aW9uIG9mIG5ldHdvcmtzLiBUaGUgc3BlY2lmaWMgbmV0d29ya3NcbiAqIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgbmFtZSBtYXkgdmFyeSBmcm9tIGNvbnRleHQgdG8gY29udGV4dCwgYW5kIG1heVxuICogYWxzbyBvdmVybGFwIChlLmcuIGEgXCJsb2NhbFwiIGNsdXN0ZXIgbWF5IGNvbm5lY3QgdG8gdGhlIHNhbWUgcmVtb3RlIG5ldHdvcmtzXG4gKiBhcyBhIFwidGVzdG5ldFwiIGNsdXN0ZXIpLCBidXQgdGhpcyB0eXBlIG5ldmVydGhlbGVzcyBzdXBwb3J0cyBjcm9zcy1wYWNrYWdlXG4gKiBjb29yZGluYXRpb24gd2hlcmUgdGhlIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggc3RhdGljIGxhYmVscyBhcmUgc3ViamVjdCB0b1xuICogY2hvaWNlIG9mIGNsdXN0ZXIuIFNvbWUgZXhhbXBsZXM6XG4gKlxuICogLSB0aGUgY2hhaW4gSUQgZm9yIGEgc3RhdGljIGxhYmVsIGxpa2UgXCJBZ29yaWNcIiBvciBcIkV0aGVyZXVtXCJcbiAqIC0gdGhlIGNyeXB0b2dyYXBoaWMgaGFzaCBmb3IgYSBzdGF0aWMgbGFiZWwgbGlrZSBcIkJMRFwiIG9yIFwiVVNEQ1wiXG4gKiAtIHRoZSBVUkwgZm9yIGEgc2VydmljZSBsaWtlIFwiQWdvcmljIFJQQ1wiIG9yIFwiQXhlbGFyXCIgb3IgXCJTcGVjdHJ1bVwiXG4gKlxuICogXCJtYWlubmV0XCIgc2hvdWxkIGFsd2F5cyBpbmNsdWRlIHRoZSBBZ29yaWMgbmV0d29yayBkZXNjcmliZWQgYnlcbiAqIGh0dHBzOi8vbWFpbi5hZ29yaWMubmV0L25ldHdvcmstY29uZmlnIHJhdGhlciB0aGFuIHNvbWUgb3RoZXIgYWx0ZXJuYXRpdmUuXG4gKlxuICogWFhYIFRoaXMgYWN0dWFsbHkgYmVsb25ncyBzb21ld2hlcmUgZWxzZSwgcG9zc2libHkgd2l0aCByZWZhY3RvcmluZy5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9wdWxsLzEyMTg1I2Rpc2N1c3Npb25fcjI1MDAxMjMyMjZcbiAqXG4gKiBAdHlwZWRlZiB7J2xvY2FsJyB8ICd0ZXN0bmV0JyB8ICdtYWlubmV0J30gQ2x1c3Rlck5hbWVcbiAqL1xuXG4vKipcbiAqIEV2ZW50IHNvdXJjZSBpZHMgdXNlZCBieSB0aGUgYnJpZGdlIGRldmljZS5cbiAqXG4gKiBAZW51bSB7KHR5cGVvZiBCcmlkZ2VJZClba2V5b2YgdHlwZW9mIEJyaWRnZUlkXX1cbiAqL1xuICAgICAgIGNvbnN0IEJyaWRnZUlkID0gLyoqIEB0eXBlIHtjb25zdH0gKi8gKHtcbiAgQkFOSzogJ2JhbmsnLFxuICBDT1JFOiAnY29yZScsXG4gIERJQkM6ICdkaWJjJyxcbiAgU1RPUkFHRTogJ3N0b3JhZ2UnLFxuICBQUk9WSVNJT046ICdwcm92aXNpb24nLFxuICBQUk9WSVNJT05fU01BUlRfV0FMTEVUOiAncHJvdmlzaW9uV2FsbGV0JyxcbiAgVkxPQ0FMQ0hBSU46ICd2bG9jYWxjaGFpbicsXG4gIFZUUkFOU0ZFUjogJ3Z0cmFuc2ZlcicsXG4gIFdBTExFVDogJ3dhbGxldCcsXG59KTskaM2PX29uY2UuQnJpZGdlSWQoQnJpZGdlSWQpO1xuaGFyZGVuKEJyaWRnZUlkKTtcblxuLyoqIEBzYXRpc2ZpZXMge1JlY29yZDxzdHJpbmcsIEJyaWRnZUlkPn0gKi9cbiAgICAgICBjb25zdCBDb3Ntb3NJbml0S2V5VG9CcmlkZ2VJZCA9IHtcbiAgdmJhbmtQb3J0OiAnYmFuaycsXG4gIHZpYmNQb3J0OiAnZGliYycsXG59OyRozY9fb25jZS5Db3Ntb3NJbml0S2V5VG9CcmlkZ2VJZChDb3Ntb3NJbml0S2V5VG9CcmlkZ2VJZCk7XG5oYXJkZW4oQ29zbW9zSW5pdEtleVRvQnJpZGdlSWQpO1xuXG4gICAgICAgY29uc3QgV2FsbGV0TmFtZSA9IGtleU1pcnJvcih7XG4gIGRlcG9zaXRGYWNldDogbnVsbCxcbn0pOyRozY9fb25jZS5XYWxsZXROYW1lKFdhbGxldE5hbWUpO1xuaGFyZGVuKFdhbGxldE5hbWUpO1xuXG4vKiBkZWZpbmVkIGluIGdvbGFuZy9jb3Ntb3MveC92YmFuayovXG4gICAgICAgY29uc3QgVkJhbmtBY2NvdW50ID0gLyoqIEB0eXBlIHtjb25zdH0gKi8gKHtcbiAgcmVzZXJ2ZToge1xuICAgIG1vZHVsZTogJ3ZiYW5rL3Jlc2VydmUnLFxuICAgIGFkZHJlc3M6ICdhZ29yaWMxYWUwbG10emxncmNubGE5eGprcGFhcnE1ZDVkZmV6NjNoM251Y2wnLFxuICB9LFxuICBwcm92aXNpb246IHtcbiAgICBtb2R1bGU6ICd2YmFuay9wcm92aXNpb24nLFxuICAgIGFkZHJlc3M6ICdhZ29yaWMxbWVnenl0ZzY1Y3lyZ3pzNmZ2enhncmNxdnd3bDd1Z3B0NjIzNDYnLFxuICB9LFxufSk7JGjNj19vbmNlLlZCYW5rQWNjb3VudChWQmFua0FjY291bnQpO1xuaGFyZGVuKFZCYW5rQWNjb3VudCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJCcmlkZ2VJZCI6WyJCcmlkZ2VJZCJdLCJDb3Ntb3NJbml0S2V5VG9CcmlkZ2VJZCI6WyJDb3Ntb3NJbml0S2V5VG9CcmlkZ2VJZCJdLCJXYWxsZXROYW1lIjpbIldhbGxldE5hbWUiXSwiVkJhbmtBY2NvdW50IjpbIlZCYW5rQWNjb3VudCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACNvaYBrggAAK4IAAAkAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2RlYnVnLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlVHJhY2VyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qIEBqZXNzaWUtY2hlY2sqL1xuXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8xMTg0NCovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8xMTg0NSovXG5sZXQgZGVidWdJbnN0YW5jZSA9IDE7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsXG4gKiBAcGFyYW0ge2Jvb2xlYW4gfCAndmVyYm9zZSd9IGVuYWJsZVxuICovXG4gICAgICAgY29uc3QgbWFrZVRyYWNlciA9IChsYWJlbCwgZW5hYmxlID0gdHJ1ZSkgPT4ge1xuICBjb25zdCBzdWIgPSAoc3ViTGFiZWwsIHN1YkVuYWJsZSA9IGVuYWJsZSkgPT5cbiAgICBtYWtlVHJhY2VyKGAke2xhYmVsfS4ke3N1YkxhYmVsfWAsIHN1YkVuYWJsZSk7XG4gIGNvbnN0IGtleSA9IGAtLS0tLSAke2xhYmVsfSwke2RlYnVnSW5zdGFuY2V9IGA7XG4gIGRlYnVnSW5zdGFuY2UgKz0gMTtcbiAgLyogdGhlIGNhc2VzIGJlbG93IGRlZmluZSBhIG5hbWVkIHZhcmlhYmxlIHRvIHByb3ZpZGUgYmV0dGVyIGRlYnVnIGluZm8qL1xuICBzd2l0Y2ggKGVuYWJsZSkge1xuICAgIGNhc2UgZmFsc2U6IHtcbiAgICAgIGNvbnN0IGxvZ0Rpc2FibGVkID0gKC4uLl9hcmdzKSA9PiB7fTtcbiAgICAgIHJldHVybiBoYXJkZW4oT2JqZWN0LmFzc2lnbihsb2dEaXNhYmxlZCwgeyBzdWIgfSkpO1xuICAgIH1cbiAgICBjYXNlICd2ZXJib3NlJzoge1xuICAgICAgY29uc3QgaW5mb1RpY2sgPSAob3B0TG9nLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgIC8qIFhYWCBTbmlmZiB0ZXN0cyBzdWNoIGFzIHRoaXMgYXJlIGluaGVyZW50bHkgdW5yZWxpYWJsZSBhbmQgc21lbGwgYmFkLiovXG4gICAgICAgIC8qIEV2ZW4gYXNpZGUgZnJvbSB0aGUgc2VjdXJpdHkgaGF6YXJkIG9mKi9cbiAgICAgICAgLyogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8xMTg0NSovXG4gICAgICAgIC8qIGFuIG9iamVjdCBpbnRlbmRlZCBhcyBhIG5vcm1hbCBsb2dnaW5nIGFyZ3VtZW50IG1heSBhY2NpZGVudGFsbHkqL1xuICAgICAgICAvKiBwYXNzIHRoaXMgc25pZmYgdGVzdCwgY2F1c2luZyBjb25mdXNpb24uKi9cbiAgICAgICAgaWYgKHR5cGVvZiBvcHRMb2c/LmxvZyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhrZXksIC4uLmFyZ3MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhrZXksIG9wdExvZywgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZXR1cm4gaGFyZGVuKE9iamVjdC5hc3NpZ24oaW5mb1RpY2ssIHsgc3ViIH0pKTtcbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgY29uc3QgZGVidWdUaWNrID0gKG9wdExvZywgLi4uYXJncykgPT4ge1xuICAgICAgICAvKiBBbm90aGVyIHVucmVsaWFibGUgc25pZmYgdGVzdCBsaWtlIHRoZSBvbmUgYWJvdmUqL1xuICAgICAgICBpZiAodHlwZW9mIG9wdExvZz8ubG9nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgb3B0TG9nLmxvZyhrZXksIC4uLmFyZ3MpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnNvbGUuaW5mbyhrZXksIG9wdExvZywgLi4uYXJncyk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgICByZXR1cm4gaGFyZGVuKE9iamVjdC5hc3NpZ24oZGVidWdUaWNrLCB7IHN1YiB9KSk7XG4gICAgfVxuICB9XG59OyRozY9fb25jZS5tYWtlVHJhY2VyKG1ha2VUcmFjZXIpO1xuaGFyZGVuKG1ha2VUcmFjZXIpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBtYWtlVHJhY2VyPn0gVHJhY2VMb2dnZXJcbiAqL1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVRyYWNlciI6WyJtYWtlVHJhY2VyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALGT1Y5eAwAAXgMAACUAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvZXJyb3JzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIk5vbk51bGxpc2giXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBxOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dXSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VCB8IG51bGwgfCB1bmRlZmluZWR9IHZhbFxuICogQHBhcmFtIHtzdHJpbmd9IFtvcHREZXRhaWxzXVxuICogQHJldHVybnMge1R9XG4gKi9cbiAgICAgICBjb25zdCBOb25OdWxsaXNoID0gKHZhbCwgb3B0RGV0YWlscyA9IGB1bmV4cGVjdGVkICR7cSh2YWwpfWApID0+IHtcbiAgaWYgKHZhbCAhPSBudWxsKSB7XG4gICAgLyogVGhpcyBgIT0gbnVsbGAgaWRpb20gY2hlY2tzIHRoYXQgYHZhbGAgaXMgbmVpdGhlciBgbnVsbGAgbm9yIGB1bmRlZmluZWRgLiovXG4gICAgcmV0dXJuIHZhbDtcbiAgfVxuICBhc3NlcnQuZmFpbChvcHREZXRhaWxzKTtcbn07JGjNj19vbmNlLk5vbk51bGxpc2goTm9uTnVsbGlzaCk7XG5oYXJkZW4oTm9uTnVsbGlzaCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJOb25OdWxsaXNoIjpbIk5vbk51bGxpc2giXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAaBzsGv4EAAD+BAAAJAAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL2NsaS11dGlscy5qcyIsIi4vY29uZmlnLmpzIiwiLi9kZWJ1Zy5qcyIsIi4vZXJyb3JzLmpzIiwiLi9qcy11dGlscy5qcyIsIi4va2V5TWlycm9yLmpzIiwiLi9tYXJzaGFsL3B1cmUtZGF0YS5qcyIsIi4vbWV0aG9kLXRvb2xzLmpzIiwiLi9tZXRyaWNzLmpzIiwiLi9uYXR1cmFsLXNvcnQuanMiLCIuL3Nlcy11dGlscy5qcyIsIi4vdG1wRGlyLmpzIiwiLi90eXBlQ2hlY2suanMiLCIuL3R5cGVHdWFyZHMuanMiLCIuL3R5cGVzLWluZGV4LmpzIl0sImV4cG9ydHMiOltudWxsXSwicmVleHBvcnRzIjpbIi4vY2xpLXV0aWxzLmpzIiwiLi9jb25maWcuanMiLCIuL2RlYnVnLmpzIiwiLi9lcnJvcnMuanMiLCIuL2pzLXV0aWxzLmpzIiwiLi9rZXlNaXJyb3IuanMiLCIuL21ldGhvZC10b29scy5qcyIsIi4vbWV0cmljcy5qcyIsIi4vbmF0dXJhbC1zb3J0LmpzIiwiLi9zZXMtdXRpbHMuanMiLCIuL3RtcERpci5qcyIsIi4vdHlwZUNoZWNrLmpzIiwiLi90eXBlR3VhcmRzLmpzIiwiLi90eXBlcy1pbmRleC5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL2NsaS11dGlscy5qc1wiLCBbXV0sW1wiLi9jb25maWcuanNcIiwgW11dLFtcIi4vZGVidWcuanNcIiwgW11dLFtcIi4vZXJyb3JzLmpzXCIsIFtdXSxbXCIuL2pzLXV0aWxzLmpzXCIsIFtdXSxbXCIuL2tleU1pcnJvci5qc1wiLCBbXV0sW1wiLi9tYXJzaGFsL3B1cmUtZGF0YS5qc1wiLCBbXV0sW1wiLi9tZXRob2QtdG9vbHMuanNcIiwgW11dLFtcIi4vbWV0cmljcy5qc1wiLCBbXV0sW1wiLi9uYXR1cmFsLXNvcnQuanNcIiwgW11dLFtcIi4vc2VzLXV0aWxzLmpzXCIsIFtdXSxbXCIuL3RtcERpci5qc1wiLCBbXV0sW1wiLi90eXBlQ2hlY2suanNcIiwgW11dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbXV0sW1wiLi90eXBlcy1pbmRleC5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vbWFyc2hhbC9wdXJlLWRhdGEuanMiOltbInB1cmVEYXRhTWFyc2hhbGxlciIsInB1cmVEYXRhTWFyc2hhbGxlciJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAqtWvjaYlAACmJQAAJwAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9qcy11dGlscy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiVFJVRSIsImRlZXBDb3B5SnNvbmFibGUiLCJkZWVwTWFwT2JqZWN0IiwiZGVmaW5lTmFtZSIsImZyb21UeXBlZEVudHJpZXMiLCJsb2dMZXZlbHMiLCJtYWtlTWVhc3VyZVNlY29uZHMiLCJvYmplY3RNYXBNdXRhYmxlIiwicGFydGlhbE1hcCIsInByb3ZpZGVMYXp5TWFwIiwidHlwZWRFbnRyaWVzIiwidHlwZWRNYXAiLCJ1bnByZWZpeGVkUHJvcGVydGllcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKiBAdHMtY2hlY2sqL1xuLyogQGplc3NpZS1jaGVjayovXG4vKipcbiAqIEBmaWxlIFB1cmUgSmF2YVNjcmlwdCB1dGlsaXR5IGZ1bmN0aW9ucyB0aGF0IGFyZSBjb21wYXRpYmxlIHdpdGggYnV0IG5vdFxuICogICBkZXBlbmRlbnQgdXBvbiBhIGhhcmRlbmVkIGVudmlyb25tZW50LlxuICovXG5cbmNvbnN0IHsgZGVmaW5lUHJvcGVydHkgfSA9IE9iamVjdDtcblxuLyoqIEZvciBvdmVycmlkaW5nIFR5cGVTY3JpcHQgaW5mZXJyaW5nIHRoZSB0eXBlIG9mIGB0cnVlYCBhcyBib29sZWFuLiAqL1xuICAgICAgIGNvbnN0IFRSVUUgPSAvKiogQHR5cGUge2NvbnN0fSAqLyAodHJ1ZSk7XG5cbi8qKlxuICogQHR5cGVkZWYgezxPIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KFxuICogICBvYmo6IE8sXG4gKiApID0+IEV4Y2x1ZGU8XG4gKiAgIHsgW0sgaW4ga2V5b2YgT106IEsgZXh0ZW5kcyBzdHJpbmcgPyBbSywgT1tLXV0gOiBuZXZlciB9W2tleW9mIE9dLFxuICogICB1bmRlZmluZWRcbiAqID5bXX0gVHlwZWRFbnRyaWVzXG4gKi8kaM2PX29uY2UuVFJVRShUUlVFKTtcbiAgICAgICBjb25zdCB0eXBlZEVudHJpZXMgPSAvKiogQHR5cGUge1R5cGVkRW50cmllc30gKi8gKE9iamVjdC5lbnRyaWVzKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7PFxuICogICBjb25zdCBFbnRyaWVzIGV4dGVuZHMgUmVhZG9ubHlBcnJheTxyZWFkb25seSBbUHJvcGVydHlLZXksIHVua25vd25dPixcbiAqID4oXG4gKiAgIGVudHJpZXM6IEVudHJpZXMsXG4gKiApID0+IHsgW0VudHJ5IGluIEVudHJpZXNbbnVtYmVyXSBhcyBFbnRyeVswXV06IEVudHJ5WzFdIH19IEZyb21UeXBlZEVudHJpZXNcbiAqLyRozY9fb25jZS50eXBlZEVudHJpZXModHlwZWRFbnRyaWVzKTtcbiAgICAgICBjb25zdCBmcm9tVHlwZWRFbnRyaWVzID0gLyoqIEB0eXBlIHtGcm9tVHlwZWRFbnRyaWVzfSAqLyAoXG4gIE9iamVjdC5mcm9tRW50cmllc1xuKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7PEEgZXh0ZW5kcyB1bmtub3duW10sIFY+KFxuICogICBhcnI6IEEsXG4gKiAgIG1hcHBlcjogPEsgZXh0ZW5kcyBudW1iZXI+KGVsOiBBW0tdLCBpZHg6IEssIGFycjogQSkgPT4gVixcbiAqICkgPT4gVltdfSBUeXBlZE1hcFxuICovJGjNj19vbmNlLmZyb21UeXBlZEVudHJpZXMoZnJvbVR5cGVkRW50cmllcyk7XG4gICAgICAgY29uc3QgdHlwZWRNYXAgPSAvKiogQHR5cGUge1R5cGVkTWFwfSAqLyAoXG4gIEZ1bmN0aW9uLnByb3RvdHlwZS5jYWxsLmJpbmQoQXJyYXkucHJvdG90eXBlLm1hcClcbik7JGjNj19vbmNlLnR5cGVkTWFwKHR5cGVkTWFwKTtcblxuICAgICAgIGNvbnN0IGxvZ0xldmVscyA9IC8qKiBAdHlwZSB7Y29uc3R9ICovIChbXG4gICdkZWJ1ZycsXG4gICdsb2cnLFxuICAnaW5mbycsXG4gICd3YXJuJyxcbiAgJ2Vycm9yJyxcbl0pOyRozY9fb25jZS5sb2dMZXZlbHMobG9nTGV2ZWxzKTtcbk9iamVjdC5mcmVlemUobG9nTGV2ZWxzKTtcblxuLyoqIEB0eXBlZGVmIHsodHlwZW9mIGxvZ0xldmVscylba2V5b2YgbG9nTGV2ZWxzICYgbnVtYmVyXX0gTG9nTGV2ZWwgKi9cblxuLyoqIEB0eXBlZGVmIHtQaWNrPENvbnNvbGUsIExvZ0xldmVsPn0gTGltaXRlZENvbnNvbGUgKi9cblxuLyoqXG4gKiBEZWVwLWNvcHkgYSB2YWx1ZSBieSByb3VuZC10cmlwcGluZyBpdCB0aHJvdWdoIEpTT04gKHdoaWNoIGRyb3BzXG4gKiBmdW5jdGlvbi9zeW1ib2wvdW5kZWZpbmVkIHZhbHVlcyBhbmQgcHJvcGVydGllcyB0aGF0IGFyZSBub24tZW51bWVyYWJsZVxuICogYW5kL29yIHN5bWJvbC1rZXllZCwgYW5kIHJlamVjdHMgYmlnaW50IHZhbHVlcykuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VH0gdmFsdWVcbiAqIEByZXR1cm5zIHtUfVxuICovXG4gICAgICAgY29uc3QgZGVlcENvcHlKc29uYWJsZSA9IHZhbHVlID0+IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkodmFsdWUpKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxQcm9wZXJ0eUtleSwgdW5rbm93bj59IE9cbiAqIEB0ZW1wbGF0ZSB7c3RyaW5nICYga2V5b2YgT30gS1xuICogQHRlbXBsYXRlIE1cbiAqIEBwYXJhbSB7T1tLXX0gdmFsdWVcbiAqIEBwYXJhbSB7SyB8IHVuZGVmaW5lZH0gbmFtZVxuICogQHBhcmFtIHtPIHwgdW5kZWZpbmVkfSBjb250YWluZXJcbiAqIEBwYXJhbSB7KHZhbHVlOiBPW0tdLCBuYW1lOiBzdHJpbmcsIHJlY29yZDogTykgPT4gT1tLXSB8IE19IG1hcHBlclxuICogQHJldHVybnMge09bS10gfCBNIHwgeyBbSzIgaW4ga2V5b2YgT1tLXV06IE9bS11bSzJdIHwgTSB9fVxuICovJGjNj19vbmNlLmRlZXBDb3B5SnNvbmFibGUoZGVlcENvcHlKc29uYWJsZSk7XG5jb25zdCBkZWVwTWFwT2JqZWN0SW50ZXJuYWwgPSAodmFsdWUsIG5hbWUsIGNvbnRhaW5lciwgbWFwcGVyKSA9PiB7XG4gIGlmIChjb250YWluZXIgJiYgdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uc3QgbWFwcGVkID0gbWFwcGVyKHZhbHVlLCBuYW1lLCBjb250YWluZXIpO1xuICAgIGlmIChtYXBwZWQgIT09IHZhbHVlKSB7XG4gICAgICByZXR1cm4gbWFwcGVkO1xuICAgIH1cbiAgfVxuXG4gIGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnIHx8ICF2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGxldCB3YXNNYXBwZWQgPSBmYWxzZTtcbiAgY29uc3QgdmFsdWVPYmogPSAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqLyAodmFsdWUpO1xuICAvKipcbiAqIEB0eXBlIHs8VCBleHRlbmRzIHR5cGVvZiB2YWx1ZSwgSzIgZXh0ZW5kcyBzdHJpbmcgJiBrZXlvZiBUPihcbiAqICAgZW50cnk6IFtLMiwgVFtLMl1dLFxuICogKSA9PiBbSzIsIFRbSzJdIHwgTV19XG4gKi9cbiAgY29uc3QgbWFwRW50cnkgPSAoW2lubmVyTmFtZSwgaW5uZXJWYWx1ZV0pID0+IHtcbiAgICBjb25zdCBtYXBwZWRJbm5lclZhbHVlID0gZGVlcE1hcE9iamVjdEludGVybmFsKFxuICAgICAgaW5uZXJWYWx1ZSxcbiAgICAgIGlubmVyTmFtZSxcbiAgICAgIHZhbHVlT2JqLFxuICAgICAgbWFwcGVyLFxuICAgICk7XG4gICAgd2FzTWFwcGVkIHx8PSBtYXBwZWRJbm5lclZhbHVlICE9PSBpbm5lclZhbHVlO1xuICAgIHJldHVybiBbaW5uZXJOYW1lLCAvKiogQHR5cGUge2FueX0gKi8gKG1hcHBlZElubmVyVmFsdWUpXTtcbiAgfTtcbiAgY29uc3QgbWFwcGVkRW50cmllcyA9IHR5cGVkRW50cmllcyh2YWx1ZU9iaikubWFwKG1hcEVudHJ5KTtcblxuICBpZiAoIXdhc01hcHBlZCkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIGNvbnN0IG1hcHBlZE9iaiA9IGZyb21UeXBlZEVudHJpZXMobWFwcGVkRW50cmllcyk7XG4gIHJldHVybiAvKiogQHR5cGUge2FueX0gKi8gKG1hcHBlZE9iaik7XG59O1xuXG4vKipcbiAqIFJlY3Vyc2l2ZWx5IHRyYXZlcnNlcyBhIHJlY29yZCBvYmplY3Qgc3RydWN0dXJlLCBjYWxsaW5nIGEgbWFwcGVyIGZ1bmN0aW9uXG4gKiBmb3IgZWFjaCBlbnVtZXJhYmxlIHN0cmluZy1rZXllZCBwcm9wZXJ0eSBhbmQgcmV0dXJuaW5nIGEgcmVjb3JkIGNvbXBvc2VkIG9mXG4gKiB0aGUgcmVzdWx0cy4gSWYgbm9uZSBvZiB0aGUgdmFsdWVzIGFyZSBjaGFuZ2VkLCB0aGUgb3JpZ2luYWwgb2JqZWN0IGlzXG4gKiByZXR1cm5lZCwgbWFpbnRhaW5pbmcgaXRzIGlkZW50aXR5LlxuICpcbiAqIFdoZW4gdGhlIHByb3BlcnR5IHZhbHVlIGlzIGFuIG9iamVjdCwgaXQgaXMgc2VudCB0byB0aGUgbWFwcGVyIGxpa2UgYW55IG90aGVyXG4gKiB2YWx1ZSwgYW5kIHRoZW4gcmVjdXJzaXZlbHkgdHJhdmVyc2VkIHVubGVzcyByZXBsYWNlZCB3aXRoIGEgZGlzdGluY3QgdmFsdWUuXG4gKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gT1xuICogQHRlbXBsYXRlIE1cbiAqIEBwYXJhbSB7T30gb2JqXG4gKiBAcGFyYW0gezxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4sIEsgZXh0ZW5kcyBzdHJpbmcgJiBrZXlvZiBUPihcbiAqICAgdmFsdWU6IFRbS10sXG4gKiAgIG5hbWU6IEssXG4gKiAgIHJlY29yZDogVCxcbiAqICkgPT4gVFtLXSB8IE19IG1hcHBlclxuICogQHJldHVybnMge08gfCB7IFtLIGluIGtleW9mIE9dOiBLIGV4dGVuZHMgc3RyaW5nID8gT1tLXSB8IE0gOiBuZXZlciB9fVxuICovXG4gICAgICAgY29uc3QgZGVlcE1hcE9iamVjdCA9IChvYmosIG1hcHBlcikgPT5cbiAgLyoqIEB0eXBlIHthbnl9ICovIChkZWVwTWFwT2JqZWN0SW50ZXJuYWwob2JqLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgbWFwcGVyKSk7XG5cbi8qKlxuICogRXhwbGljaXRseSBzZXQgYSBmdW5jdGlvbidzIG5hbWUsIHN1cHBvcnRpbmcgdXNlIG9mIGFycm93IGZ1bmN0aW9ucyBmb3Igd2hpY2hcbiAqIHNvdXJjZSB0ZXh0IGRvZXNuJ3QgaW5jbHVkZSBhIG5hbWUgYW5kIG5vIGluaXRpYWwgbmFtZSBpcyBzZXQgYnlcbiAqIE5hbWVkRXZhbHVhdGlvblxuICogaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvbXVsdGlwYWdlL3N5bnRheC1kaXJlY3RlZC1vcGVyYXRpb25zLmh0bWwjc2VjLXJ1bnRpbWUtc2VtYW50aWNzLW5hbWVkZXZhbHVhdGlvblxuICpcbiAqIGBuYW1lYCBpcyB0aGUgZmlyc3QgcGFyYW1ldGVyIGZvciBiZXR0ZXIgcmVhZGFiaWxpdHkgYXQgY2FsbCBzaXRlcyAoZS5nLixcbiAqIGByZXR1cm4gZGVmaW5lTmFtZSgnZm9vJywgKCkgPT4geyAuLi4gfSlgKS5cbiAqXG4gKiBAdGVtcGxhdGUge0Z1bmN0aW9ufSBGXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtGfSBmblxuICogQHJldHVybnMge0Z9XG4gKi8kaM2PX29uY2UuZGVlcE1hcE9iamVjdChkZWVwTWFwT2JqZWN0KTtcbiAgICAgICBjb25zdCBkZWZpbmVOYW1lID0gKG5hbWUsIGZuKSA9PlxuICBkZWZpbmVQcm9wZXJ0eShmbiwgJ25hbWUnLCB7IHZhbHVlOiBuYW1lIH0pO1xuXG4vKipcbiAqIEJ5IGFuYWxvZ3kgd2l0aCBob3cgYEFycmF5LnByb3RvdHlwZS5tYXBgIHdpbGwgbWFwIHRoZSBlbGVtZW50cyBvZiBhbiBhcnJheVxuICogdG8gdHJhbnNmb3JtZWQgZWxlbWVudHMgb2YgYW4gYXJyYXkgb2YgdGhlIHNhbWUgc2hhcGUsIGBvYmplY3RNYXBNdXRhYmxlYFxuICogd2lsbCBkbyBsaWtld2lzZSBmb3IgdGhlIGVudW1lcmFibGUgc3RyaW5nLWtleWVkIHByb3BlcnRpZXMgb2YgYW4gb2JqZWN0LlxuICpcbiAqIFVubGlrZSBlbmRvJ3MgYG9iamVjdE1hcGAsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIG5vbi1oYXJkZW5lZCBvYmplY3QuXG4gKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gT1xuICogQHRlbXBsYXRlIE1cbiAqIEBwYXJhbSB7T30gb2JqXG4gKiBAcGFyYW0gezxLIGV4dGVuZHMga2V5b2YgTz4odmFsdWU6IE9bS10sIGtleTogSykgPT4gTX0gbWFwcGVyXG4gKiBAcmV0dXJucyB7eyBbSyBpbiBrZXlvZiBPXTogSyBleHRlbmRzIHN0cmluZyA/IE0gOiBuZXZlciB9fVxuICovJGjNj19vbmNlLmRlZmluZU5hbWUoZGVmaW5lTmFtZSk7XG4gICAgICAgY29uc3Qgb2JqZWN0TWFwTXV0YWJsZSA9IChvYmosIG1hcHBlcikgPT4ge1xuICBjb25zdCBvbGRFbnRyaWVzID0gdHlwZWRFbnRyaWVzKG9iaik7XG4gIC8qKiBAdHlwZSB7PEsgZXh0ZW5kcyBrZXlvZiBPPihlbnRyeTogW0ssIE9bS11dKSA9PiBbSywgTV19ICovXG4gIGNvbnN0IG1hcEVudHJ5ID0gKFtrLCB2XSkgPT4gW2ssIG1hcHBlcih2LCBrKV07XG4gIGNvbnN0IG5ld0VudHJpZXMgPSB0eXBlZE1hcChvbGRFbnRyaWVzLCBtYXBFbnRyeSk7XG4gIGNvbnN0IG5ld09iaiA9IGZyb21UeXBlZEVudHJpZXMobmV3RW50cmllcyk7XG4gIHJldHVybiAvKiogQHR5cGUge2FueX0gKi8gKG5ld09iaik7XG59O1xuXG4vKipcbiAqIE1hcCB0aGUgZWxlbWVudHMgb2YgYW4gYXJyYXkgdG8gbmV3IHZhbHVlcywgc2tpcHBpbmcgZWxlbWVudHMgZm9yIHdoaWNoIHRoZVxuICogbWFwcGluZyByZXN1bHRzIGluIGVpdGhlciBgdW5kZWZpbmVkYCBvciBgZmFsc2VgLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdGVtcGxhdGUgVVxuICogQHBhcmFtIHtUW119IGFyclxuICogQHBhcmFtIHsodmFsdWU6IFQsIGluZGV4OiBudW1iZXIsIGFycjogVFtdKSA9PiBVIHwgdW5kZWZpbmVkIHwgZmFsc2V9IG1hcE9yRHJvcFxuICogQHJldHVybnMge1VbXX1cbiAqLyRozY9fb25jZS5vYmplY3RNYXBNdXRhYmxlKG9iamVjdE1hcE11dGFibGUpO1xuICAgICAgIGNvbnN0IHBhcnRpYWxNYXAgPSAoYXJyLCBtYXBPckRyb3ApID0+XG4gIGFyci5yZWR1Y2UoKHJlc3VsdHMsIGVsLCBpLCBhcnJBcmcpID0+IHtcbiAgICBjb25zdCByZXN1bHQgPSBtYXBPckRyb3AoZWwsIGksIGFyckFyZyk7XG4gICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkICYmIHJlc3VsdCAhPT0gZmFsc2UpIHtcbiAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfSwgLyoqIEB0eXBlIHtVW119ICovIChbXSkpO1xuXG4vKipcbiAqIFJldHVybiB0aGUgdmFsdWUgZnJvbSBgbWFwYCBhc3NvY2lhdGVkIHdpdGggYGtleWAuIElmIHRoZXJlIGlzIG5vdCB5ZXQgc3VjaCBhXG4gKiB2YWx1ZSwgZ2V0IG9uZSBmcm9tIGBtYWtlVmFsdWUoa2V5KWAgYW5kIHVwZGF0ZSBgbWFwYCBiZWZvcmUgcmV0dXJuaW5nIHRoZVxuICogbmV3IHZhbHVlLlxuICpcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAdGVtcGxhdGUgVlxuICogQHBhcmFtIHtbS10gZXh0ZW5kcyBbV2Vha0tleV0gPyBXZWFrTWFwPEssIFY+IDogTWFwPEssIFY+fSBtYXBcbiAqIEBwYXJhbSB7S30ga2V5XG4gKiBAcGFyYW0geyhrZXk6IEspID0+IFZ9IG1ha2VWYWx1ZVxuICogQHJldHVybnMge1Z9XG4gKi8kaM2PX29uY2UucGFydGlhbE1hcChwYXJ0aWFsTWFwKTtcbiAgICAgICBjb25zdCBwcm92aWRlTGF6eU1hcCA9IChtYXAsIGtleSwgbWFrZVZhbHVlKSA9PiB7XG4gIGNvbnN0IGZvdW5kID0gbWFwLmdldChrZXkpO1xuICBpZiAoZm91bmQgIT09IHVuZGVmaW5lZCB8fCBtYXAuaGFzKGtleSkpIHtcbiAgICByZXR1cm4gLyoqIEB0eXBlIHtWfSAqLyAoZm91bmQpO1xuICB9XG4gIGNvbnN0IHZhbHVlID0gbWFrZVZhbHVlKGtleSk7XG4gIG1hcC5zZXQoa2V5LCB2YWx1ZSk7XG4gIHJldHVybiB2YWx1ZTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgdXNlcyBhIG1pbGxpc2Vjb25kLWJhc2VkIGN1cnJlbnQtdGltZSBjYXBhYmlsaXR5XG4gKiAoc3VjaCBhcyBgcGVyZm9ybWFuY2Uubm93YCkgdG8gbWVhc3VyZSBleGVjdXRpb24gZHVyYXRpb24gb2YgYW4gYXN5bmNcbiAqIGZ1bmN0aW9uIGFuZCByZXBvcnQgdGhlIHJlc3VsdCBpbiBzZWNvbmRzIHRvIG1hdGNoIG91ciB0ZWxlbWV0cnkgc3RhbmRhcmQuXG4gKlxuICogQHBhcmFtIHsoKSA9PiBudW1iZXJ9IGN1cnJlbnRUaW1lTWlsbGlzZWNcbiAqLyRozY9fb25jZS5wcm92aWRlTGF6eU1hcChwcm92aWRlTGF6eU1hcCk7XG4gICAgICAgY29uc3QgbWFrZU1lYXN1cmVTZWNvbmRzID0gY3VycmVudFRpbWVNaWxsaXNlYyA9PiB7XG4gIC8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxUPn0gZm5cbiAqIEByZXR1cm5zIHtQcm9taXNlPHsgcmVzdWx0OiBUOyBkdXJhdGlvbjogbnVtYmVyIH0+fVxuICovXG4gIGNvbnN0IG1lYXN1cmVTZWNvbmRzID0gYXN5bmMgZm4gPT4ge1xuICAgIGNvbnN0IHQwID0gY3VycmVudFRpbWVNaWxsaXNlYygpO1xuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGZuKCk7XG4gICAgY29uc3QgZHVyYXRpb25NaWxsaXNlYyA9IGN1cnJlbnRUaW1lTWlsbGlzZWMoKSAtIHQwO1xuICAgIHJldHVybiB7IHJlc3VsdCwgZHVyYXRpb246IGR1cmF0aW9uTWlsbGlzZWMgLyAxMDAwIH07XG4gIH07XG4gIHJldHVybiBtZWFzdXJlU2Vjb25kcztcbn07XG5cbi8qKlxuICogRmluZCBhbGwgb2YgYW4gb2JqZWN0J3MgcHJvcGVydGllcyB3aG9zZSBuYW1lIHN0YXJ0cyB3aXRoIGEgcHJlZml4LCBhbmRcbiAqIHJldHVybiBhIG5ldyBvYmplY3QgY29uc2lzdGluZyBvZiB0aG9zZSBwcm9wZXJ0aWVzIHdpdGhvdXQgdGhhdCBwcmVmaXguXG4gKiBVc2VmdWwgZm9yIGZpbHRlcmluZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcmVsZXZhbnQgdG8gYSBwYXJ0aWN1bGFyIHB1cnBvc2UuXG4gKlxuICogQHRlbXBsYXRlIHtzdHJpbmd9IFBcbiAqIEB0ZW1wbGF0ZSB7c3RyaW5nfSBLXG4gKiBAdGVtcGxhdGUgVlxuICogQHBhcmFtIHtSZWNvcmQ8YCR7UH0ke0t9YCwgVj59IG9ialxuICogQHBhcmFtIHtQfSBwcmVmaXhcbiAqLyRozY9fb25jZS5tYWtlTWVhc3VyZVNlY29uZHMobWFrZU1lYXN1cmVTZWNvbmRzKTtcbiAgICAgICBjb25zdCB1bnByZWZpeGVkUHJvcGVydGllcyA9IChvYmosIHByZWZpeCkgPT5cbiAgLyoqIEB0eXBlIHtSZWNvcmQ8SywgVj59ICovIChcbiAgICBmcm9tVHlwZWRFbnRyaWVzKFxuICAgICAgdHlwZWRFbnRyaWVzKG9iailcbiAgICAgICAgLmZpbHRlcigoW2tleV0pID0+IGtleS5zdGFydHNXaXRoKHByZWZpeCkpXG4gICAgICAgIC5tYXAoKFtrZXksIHZhbHVlXSkgPT4gW2tleS5zbGljZShwcmVmaXgubGVuZ3RoKSwgdmFsdWVdKSxcbiAgICApXG4gICk7JGjNj19vbmNlLnVucHJlZml4ZWRQcm9wZXJ0aWVzKHVucHJlZml4ZWRQcm9wZXJ0aWVzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlRSVUUiOlsiVFJVRSJdLCJ0eXBlZEVudHJpZXMiOlsidHlwZWRFbnRyaWVzIl0sImZyb21UeXBlZEVudHJpZXMiOlsiZnJvbVR5cGVkRW50cmllcyJdLCJ0eXBlZE1hcCI6WyJ0eXBlZE1hcCJdLCJsb2dMZXZlbHMiOlsibG9nTGV2ZWxzIl0sImRlZXBDb3B5SnNvbmFibGUiOlsiZGVlcENvcHlKc29uYWJsZSJdLCJkZWVwTWFwT2JqZWN0IjpbImRlZXBNYXBPYmplY3QiXSwiZGVmaW5lTmFtZSI6WyJkZWZpbmVOYW1lIl0sIm9iamVjdE1hcE11dGFibGUiOlsib2JqZWN0TWFwTXV0YWJsZSJdLCJwYXJ0aWFsTWFwIjpbInBhcnRpYWxNYXAiXSwicHJvdmlkZUxhenlNYXAiOlsicHJvdmlkZUxhenlNYXAiXSwibWFrZU1lYXN1cmVTZWNvbmRzIjpbIm1ha2VNZWFzdXJlU2Vjb25kcyJdLCJ1bnByZWZpeGVkUHJvcGVydGllcyI6WyJ1bnByZWZpeGVkUHJvcGVydGllcyJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAi9VLVrAcAAKwHAAAoAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2tleU1pcnJvci5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsia2V5TWlycm9yIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qIEB0cy1jaGVjayovXG5cbmNvbnN0IHsgZnJlZXplLCBlbnRyaWVzIH0gPSBPYmplY3Q7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCBudWxsPiAmIFJlY29yZDxFeGNsdWRlPFByb3BlcnR5S2V5LCBzdHJpbmc+LCBuZXZlcj59IEluaXRcbiAqIEB0eXBlZGVmIHt7IHJlYWRvbmx5IFtLIGluIGtleW9mIEluaXRdOiBLIH19IEtleU1pcnJvclJlc3VsdFxuICovXG5cbi8qKlxuICogTWlycm9yIHRoZSBrZXlzIG9mIGFuIG9iamVjdCB0byBzdHJpbmcgdmFsdWVzIHRoYXQgbWF0Y2ggdGhlIGtleSBuYW1lcy4gVGhpc1xuICogd29ya3Mgd2VsbCB0byBkZWZpbmUgYSBUeXBlU2NyaXB0IGVudW0gdHlwZSBjb21wYXRpYmxlIHdpdGggZXJhc2FibGUgc3ludGF4OlxuICpcbiAqICAgIGBAZW51bSB7KHR5cGVvZiBNeUVudW0pW2tleW9mIHR5cGVvZiBNeUVudW1dfWBcbiAqXG4gKiBUaGUgcHJvdmlkZWQgcmVjb3JkIG11c3Qgb25seSBtYXAgcHJvcGVydHkgbmFtZXMgdG8gZWl0aGVyIGBudWxsYCBvciB0aGVcbiAqIHByb3BlcnR5IG5hbWUgaXRzZWxmLiBUaGUgcmV0dXJuZWQgb2JqZWN0IGhhcyBpZGVudGljYWwga2V5cyB3aG9zZSB2YWx1ZXMgYXJlXG4gKiB0aGUgc3RyaW5nIGZvcm0gb2YgdGhlIGtleS5cbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIHN0cmluZyB8IG51bGw+ICYgUmVjb3JkPEV4Y2x1ZGU8UHJvcGVydHlLZXksIHN0cmluZz4sIG5ldmVyPn0gSW5pdFxuICogQHBhcmFtIHtJbml0ICYgeyByZWFkb25seSBbSyBpbiBrZXlvZiBJbml0XTogSW5pdFtLXSBleHRlbmRzIG51bGwgPyBudWxsIDogSyB9fSByZWNvcmRcbiAqIEByZXR1cm5zIHtLZXlNaXJyb3JSZXN1bHQ8SW5pdD59XG4gKi9cbiAgICAgICBjb25zdCBrZXlNaXJyb3IgPSByZWNvcmQgPT4ge1xuICBpZiAocmVjb3JkID09PSBudWxsIHx8IHR5cGVvZiByZWNvcmQgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKCdrZXlNaXJyb3IgZXhwZWN0cyBhIHJlY29yZCBvZiBzdHJpbmcga2V5cy4nKTtcbiAgfVxuXG4gIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gKi9cbiAgY29uc3QgbWlycm9yZWQgPSB7XG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBSZWNvcmQgY29uZnVzZWQgYnkgbnVsbCBwcm90b3R5cGUqL1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgfTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZW50cmllcyhyZWNvcmQpKSB7XG4gICAgaWYgKHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSBrZXkpIHtcbiAgICAgIHRocm93IFR5cGVFcnJvcihcbiAgICAgICAgYFZhbHVlIGZvciBrZXkgXCIke2tleX1cIiBtdXN0IGJlIG51bGwgb3IgdGhlIGtleSBzdHJpbmc7IGdvdCAke1N0cmluZyh2YWx1ZSl9LmAsXG4gICAgICApO1xuICAgIH1cbiAgICBtaXJyb3JlZFtrZXldID0ga2V5O1xuICB9XG4gIHJldHVybiAvKiogQHR5cGUge0tleU1pcnJvclJlc3VsdDxJbml0Pn0gKi8gKGZyZWV6ZShtaXJyb3JlZCkpO1xufTskaM2PX29uY2Uua2V5TWlycm9yKGtleU1pcnJvcik7XG5cbmZyZWV6ZShrZXlNaXJyb3IpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsia2V5TWlycm9yIjpbImtleU1pcnJvciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAClbB70VS0AAFUtAAAvAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZmFyIiwiQGVuZG8vcGF0dGVybnMiLCJAYWdvcmljL2Jhc2Utem9uZS9oZWFwLmpzIiwiLi9jYWxsYmFjay5qcyJdLCJleHBvcnRzIjpbIlN0cmVhbUNlbGxTaGFwZSIsImFzc2VydFBhdGhTZWdtZW50IiwiaXNTdHJlYW1DZWxsIiwibWFrZUNoYWluU3RvcmFnZVJvb3QiLCJtYWtlU2VyaWFsaXplVG9TdG9yYWdlIiwibWFrZVN0b3JhZ2VOb2RlQ2hpbGQiLCJwcmVwYXJlQ2hhaW5TdG9yYWdlTm9kZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsRSxGYXIsTSxtYWtlSGVhcFpvbmUsY2I7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXSxbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2Jhc2Utem9uZS9oZWFwLmpzXCIsIFtbXCJtYWtlSGVhcFpvbmVcIixbJGjNj19hID0+IChtYWtlSGVhcFpvbmUgPSAkaM2PX2EpXV1dXSxbXCIuL2NhbGxiYWNrLmpzXCIsIFtbXCIqXCIsWyRozY9fYSA9PiAoY2IgPSAkaM2PX2EpXV1dXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShtYWtlQ2hhaW5TdG9yYWdlUm9vdCwnbmFtZScse3ZhbHVlOlwibWFrZUNoYWluU3RvcmFnZVJvb3RcIn0pOyRozY9fb25jZS5tYWtlQ2hhaW5TdG9yYWdlUm9vdChtYWtlQ2hhaW5TdG9yYWdlUm9vdCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1ha2VTdG9yYWdlTm9kZUNoaWxkLCduYW1lJyx7dmFsdWU6XCJtYWtlU3RvcmFnZU5vZGVDaGlsZFwifSk7JGjNj19vbmNlLm1ha2VTdG9yYWdlTm9kZUNoaWxkKG1ha2VTdG9yYWdlTm9kZUNoaWxkKTtcblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtFUmVmfSBmcm9tICdAZW5kby9mYXInO1xuICogQGltcG9ydCB7TWFyc2hhbCwgUGFzc2FibGV9IGZyb20gJ0BlbmRvL21hcnNoYWwnO1xuICogQGltcG9ydCB7UmVtb3RlLCBFUmVtb3RlLCBUeXBlZFBhdHRlcm59IGZyb20gJy4vdHlwZXMuanMnO1xuICogQGltcG9ydCB7RU1hcnNoYWxsZXJ9IGZyb20gJy4vbWFyc2hhbC93cmFwLW1hcnNoYWxsZXIuanMnO1xuICogQGltcG9ydCB7Wm9uZX0gZnJvbSAnQGFnb3JpYy9iYXNlLXpvbmUnO1xuICogQGltcG9ydCB7Q2FsbGJhY2t9IGZyb20gJy4vdHlwZXMuanMnO1xuICovXG5cbi8qKiBAdHlwZWRlZiB7TWFyc2hhbDx1bmtub3duPn0gTWFyc2hhbGxlciAqL1xuLyoqIEB0eXBlZGVmIHtQaWNrPE1hcnNoYWxsZXIsICdmcm9tQ2FwRGF0YSc+fSBVbnNlcmlhbGl6ZXIgKi9cblxuLyoqXG4gKiBEZWZpbmVkIGJ5IHZzdG9yYWdlU3RvcmVLZXkgaW4gdnN0b3JhZ2UuZ29cbiAqXG4gKiBAdHlwZWRlZiBWU3RvcmFnZUtleVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0b3JlTmFtZVxuICogQHByb3BlcnR5IHtzdHJpbmd9IHN0b3JlU3Via2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gZGF0YVByZWZpeEJ5dGVzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW25vRGF0YVZhbHVlXVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFtUPXVua25vd25dXG4gKiBAdHlwZWRlZiBTdHJlYW1DZWxsXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYmxvY2tIZWlnaHQgY29ycmVzcG9uZGluZyB3aXRoIHRoZSB3cml0ZSBvZiBgdmFsdWVzYFxuICogICAoZGVjaW1hbCByZXByZXNlbnRhdGlvbiBvZiBhIG5hdHVyYWwgbnVtYmVyKVxuICogQHByb3BlcnR5IHtUW119IHZhbHVlc1xuICovXG5cbi8qKiBAdHlwZSB7VHlwZWRQYXR0ZXJuPFN0cmVhbUNlbGw+fSAqL1xuICAgICAgIGNvbnN0IFN0cmVhbUNlbGxTaGFwZSA9IGhhcmRlbih7XG4gIGJsb2NrSGVpZ2h0OiBNLnN0cmluZygpLFxuICB2YWx1ZXM6IE0uYXJyYXkoKSxcbn0pO1xuXG4vKipcbiAqIFRoaXMgcmVwcmVzZW50cyBhIG5vZGUgaW4gYW4gSUFWTCB0cmVlLlxuICpcbiAqIFRoZSBhY3RpdmUgaW1wbGVtZW50YXRpb24gaXMgeC92c3RvcmFnZSwgYW4gQWdvcmljIGV4dGVuc2lvbiBvZiB0aGUgQ29zbW9zXG4gKiBTREsuXG4gKlxuICogVnN0b3JhZ2UgaXMgYSBoaWVyYXJjaGljYWwgZXh0ZXJuYWxseS1yZWFjaGFibGUgc3RvcmFnZSBzdHJ1Y3R1cmUgdGhhdFxuICogaWRlbnRpZmllcyBjaGlsZHJlbiBieSByZXN0cmljdGVkIEFTQ0lJIG5hbWUgYW5kIGlzIGFzc29jaWF0ZWQgd2l0aCBhcmJpdHJhcnlcbiAqIHN0cmluZy12YWx1ZWQgZGF0YSBmb3IgZWFjaCBub2RlLCBkZWZhdWx0aW5nIHRvIHRoZSBlbXB0eSBzdHJpbmcuXG4gKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmFnZU5vZGVcbiAqIEBwcm9wZXJ0eSB7KGRhdGE6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPn0gc2V0VmFsdWUgcHVibGlzaGVzIHNvbWUgZGF0YVxuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmd9IGdldFBhdGggdGhlIGNoYWluIHN0b3JhZ2UgcGF0aCBhdCB3aGljaCB0aGUgbm9kZSB3YXNcbiAqICAgY29uc3RydWN0ZWRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxWU3RvcmFnZUtleT59IGdldFN0b3JlS2V5IERFUFJFQ0FURUQgdXNlIGdldFBhdGhcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBzdWJQYXRoOiBzdHJpbmcsXG4gKiAgIG9wdGlvbnM/OiB7IHNlcXVlbmNlPzogYm9vbGVhbiB9LFxuICogKSA9PiBTdG9yYWdlTm9kZX0gbWFrZUNoaWxkTm9kZVxuICovJGjNj19vbmNlLlN0cmVhbUNlbGxTaGFwZShTdHJlYW1DZWxsU2hhcGUpO1xuXG5jb25zdCBDaGFpblN0b3JhZ2VOb2RlSSA9IE0uaW50ZXJmYWNlKCdTdG9yYWdlTm9kZScsIHtcbiAgc2V0VmFsdWU6IE0uY2FsbFdoZW4oTS5zdHJpbmcoKSkucmV0dXJucygpLFxuICBnZXRQYXRoOiBNLmNhbGwoKS5yZXR1cm5zKE0uc3RyaW5nKCkpLFxuICBnZXRTdG9yZUtleTogTS5jYWxsV2hlbigpLnJldHVybnMoTS5yZWNvcmQoKSksXG4gIG1ha2VDaGlsZE5vZGU6IE0uY2FsbChNLnN0cmluZygpKVxuICAgIC5vcHRpb25hbChNLnNwbGl0UmVjb3JkKHt9LCB7IHNlcXVlbmNlOiBNLmJvb2xlYW4oKSB9LCB7fSkpXG4gICAgLnJldHVybnMoTS5yZW1vdGFibGUoJ1N0b3JhZ2VOb2RlJykpLFxufSk7XG5cbi8qKlxuICogVGhpcyBpcyBhbiBpbXBlcmZlY3QgaGV1cmlzdGljIHRvIG5hdmlnYXRlIHRoZSBtaWdyYXRpb24gZnJvbSB2YWx1ZSBjZWxscyB0b1xuICogc3RyZWFtIGNlbGxzLiBBdCB0aW1lIG9mIHdyaXRpbmcsIG5vIGxlZ2FjeSBjZWxscyBoYXZlIHRoZSBzYW1lIHNoYXBlIGFzIGFcbiAqIHN0cmVhbSBjZWxsLCBhbmQgd2UgZG8gbm90IGludGVuZCB0byBjcmVhdGUgYW55IG1vcmUgbGVnYWN5IHZhbHVlIGNlbGxzLlxuICpcbiAqIEBwYXJhbSB7YW55fSBjZWxsXG4gKiBAcmV0dXJucyB7Y2VsbCBpcyBTdHJlYW1DZWxsfVxuICovXG4gICAgICAgY29uc3QgaXNTdHJlYW1DZWxsID0gY2VsbCA9PlxuICBjZWxsICYmXG4gIHR5cGVvZiBjZWxsID09PSAnb2JqZWN0JyAmJlxuICBBcnJheS5pc0FycmF5KGNlbGwudmFsdWVzKSAmJlxuICB0eXBlb2YgY2VsbC5ibG9ja0hlaWdodCA9PT0gJ3N0cmluZycgJiZcbiAgL14wJHxeWzEtOV1bMC05XSokLy50ZXN0KGNlbGwuYmxvY2tIZWlnaHQpOyRozY9fb25jZS5pc1N0cmVhbUNlbGwoaXNTdHJlYW1DZWxsKTtcbmhhcmRlbihpc1N0cmVhbUNlbGwpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0b3JlZEZhY2V0XG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8c3RyaW5nPn0gZ2V0UGF0aCB0aGUgY2hhaW4gc3RvcmFnZSBwYXRoIGF0IHdoaWNoIHRoZVxuICogICBub2RlIHdhcyBjb25zdHJ1Y3RlZFxuICogQHByb3BlcnR5IHtTdG9yYWdlTm9kZVsnZ2V0U3RvcmVLZXknXX0gZ2V0U3RvcmVLZXkgREVQUkVDQVRFRCB1c2UgZ2V0UGF0aFxuICogQHByb3BlcnR5IHsoKSA9PiBVbnNlcmlhbGl6ZXJ9IGdldFVuc2VyaWFsaXplciBnZXQgdGhlIHVuc2VyaWFsaXplciBmb3IgdGhlXG4gKiAgIHN0b3JlZCBkYXRhXG4gKi9cblxuLyogVE9ETzogRm9ybWFsaXplIHNlZ21lbnQgY29uc3RyYWludHMuKi9cbi8qIE11c3QgYmUgbm9uZW1wdHkgYW5kIGRpc2FsbG93ICh1bmVzY2FwZWQpIGAuYCwgYW5kIGZvciBzaW1wbGljaXR5Ki9cbi8qIChhbmQgZnV0dXJlIHBvc3NpYmlsaXR5IG9mIGUuZy4gZXNjYXBpbmcpIHdlIGN1cnJlbnRseSBsaW1pdCB0byovXG4vKiBBU0NJSSBhbHBoYW51bWVyaWMgcGx1cyB1bmRlcnNjb3JlIGFuZCBkYXNoLiovXG4vKiBTaG91bGQgcmVtYWluIGNvbnNpc3RlbnQgd2l0aCBnb2xhbmcvY29zbW9zL3gvdnN0b3JhZ2UvdHlwZXMvcGF0aF9rZXlzLmdvKi9cbmNvbnN0IHBhdGhTZWdtZW50UGF0dGVybiA9IC9eW2EtekEtWjAtOV8tXXsxLDEwMH0kLztcblxuLyoqIEB0eXBlIHsobmFtZTogc3RyaW5nKSA9PiB2b2lkfSAqL1xuICAgICAgIGNvbnN0IGFzc2VydFBhdGhTZWdtZW50ID0gbmFtZSA9PiB7XG4gIHBhdGhTZWdtZW50UGF0dGVybi50ZXN0KG5hbWUpIHx8XG4gICAgRmFpbGBQYXRoIHNlZ21lbnQgbmFtZXMgbXVzdCBjb25zaXN0IG9mIDEgdG8gMTAwIGNoYXJhY3RlcnMgbGltaXRlZCB0byBBU0NJSSBhbHBoYW51bWVyaWNzLCB1bmRlcnNjb3JlcywgYW5kL29yIGRhc2hlczogJHtuYW1lfWA7XG59OyRozY9fb25jZS5hc3NlcnRQYXRoU2VnbWVudChhc3NlcnRQYXRoU2VnbWVudCk7XG5oYXJkZW4oYXNzZXJ0UGF0aFNlZ21lbnQpO1xuXG4vKipcbiAqIE11c3QgbWF0Y2ggdGhlIHN3aXRjaCBpbiB2c3RvcmFnZS5nbyB1c2luZyBgdnN0b3JhZ2VNZXNzYWdlYCB0eXBlXG4gKlxuICogQHR5cGVkZWYgeydnZXQnXG4gKiAgIHwgJ2dldFN0b3JlS2V5J1xuICogICB8ICdoYXMnXG4gKiAgIHwgJ2NoaWxkcmVuJ1xuICogICB8ICdlbnRyaWVzJ1xuICogICB8ICd2YWx1ZXMnXG4gKiAgIHwgJ3NpemUnfSBTdG9yYWdlR2V0QnlQYXRoTWVzc2FnZU1ldGhvZFxuICpcbiAqXG4gKiBAdHlwZWRlZiB7J3NldCcgfCAnc2V0V2l0aG91dE5vdGlmeScgfCAnYXBwZW5kJ30gU3RvcmFnZVVwZGF0ZUVudHJpZXNNZXNzYWdlTWV0aG9kXG4gKlxuICpcbiAqIEB0eXBlZGVmIHtTdG9yYWdlR2V0QnlQYXRoTWVzc2FnZU1ldGhvZFxuICogICB8IFN0b3JhZ2VVcGRhdGVFbnRyaWVzTWVzc2FnZU1ldGhvZH0gU3RvcmFnZU1lc3NhZ2VNZXRob2RcbiAqXG4gKlxuICogQHR5cGVkZWYge1twYXRoOiBzdHJpbmddfSBTdG9yYWdlR2V0QnlQYXRoTWVzc2FnZUFyZ3NcbiAqXG4gKiBAdHlwZWRlZiB7W3BhdGg6IHN0cmluZywgdmFsdWU/OiBzdHJpbmcgfCBudWxsXX0gU3RvcmFnZUVudHJ5XG4gKlxuICogQHR5cGVkZWYge1N0b3JhZ2VFbnRyeVtdfSBTdG9yYWdlVXBkYXRlRW50cmllc01lc3NhZ2VBcmdzXG4gKlxuICogQHR5cGVkZWYge3tcbiAqICAgICAgIG1ldGhvZDogU3RvcmFnZUdldEJ5UGF0aE1lc3NhZ2VNZXRob2Q7XG4gKiAgICAgICBhcmdzOiBTdG9yYWdlR2V0QnlQYXRoTWVzc2FnZUFyZ3M7XG4gKiAgICAgfVxuICogICB8IHtcbiAqICAgICAgIG1ldGhvZDogU3RvcmFnZVVwZGF0ZUVudHJpZXNNZXNzYWdlTWV0aG9kO1xuICogICAgICAgYXJnczogU3RvcmFnZVVwZGF0ZUVudHJpZXNNZXNzYWdlQXJncztcbiAqICAgICB9fSBTdG9yYWdlTWVzc2FnZVxuICovXG5cbi8qKlxuICogQHBhcmFtIHtab25lfSB6b25lXG4gKi9cbiAgICAgICBjb25zdCBwcmVwYXJlQ2hhaW5TdG9yYWdlTm9kZSA9IHpvbmUgPT4ge1xuICAvKipcbiAqIENyZWF0ZSBhIHN0b3JhZ2Ugbm9kZSBmb3IgYSBnaXZlbiBiYWNraW5nIHN0b3JhZ2UgaW50ZXJmYWNlIGFuZCBwYXRoLlxuICpcbiAqIEBwYXJhbSB7Q2FsbGJhY2s8KG1lc3NhZ2U6IFN0b3JhZ2VNZXNzYWdlKSA9PiBhbnk+fSBtZXNzZW5nZXIgYSBjYWxsYmFja1xuICogICBmb3Igc2VuZGluZyBhIHN0b3JhZ2VNZXNzYWdlIG9iamVjdCB0byB0aGUgc3RvcmFnZSBpbXBsZW1lbnRhdGlvbiAoY2YuXG4gKiAgIGdvbGFuZy9jb3Ntb3MveC92c3RvcmFnZS92c3RvcmFnZS5nbylcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLnNlcXVlbmNlXSBzZXQgdmFsdWVzIHdpdGggYGFwcGVuZGAgbWVzc2FnZXNcbiAqICAgcmF0aGVyIHRoYW4gYHNldGAgbWVzc2FnZXMgc28gdGhlIGJhY2tpbmcgaW1wbGVtZW50YXRpb24gZW1wbG95cyBhXG4gKiAgIHdyYXBwaW5nIHN0cnVjdHVyZSB0aGF0IHByZXNlcnZlcyBlYWNoIHZhbHVlIHNldCB3aXRoaW4gYSBzaW5nbGUgYmxvY2suXG4gKiAgIENoaWxkIG5vZGVzIGRlZmF1bHQgdG8gaW5oZXJpdGluZyB0aGlzIG9wdGlvbiBmcm9tIHRoZWlyIHBhcmVudC5cbiAqIEByZXR1cm5zIHtTdG9yYWdlTm9kZX1cbiAqL1xuICBjb25zdCBtYWtlQ2hhaW5TdG9yYWdlTm9kZSA9IHpvbmUuZXhvQ2xhc3MoXG4gICAgJ0NoYWluU3RvcmFnZU5vZGUnLFxuICAgIENoYWluU3RvcmFnZU5vZGVJLFxuICAgIC8qKlxuICogQHBhcmFtIHtDYWxsYmFjazwobWVzc2FnZTogU3RvcmFnZU1lc3NhZ2UpID0+IGFueT59IG1lc3NlbmdlclxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqIEBwYXJhbSB7b2JqZWN0fSBbb3B0aW9uc11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMuc2VxdWVuY2VdXG4gKi9cbiAgICAobWVzc2VuZ2VyLCBwYXRoLCB7IHNlcXVlbmNlID0gZmFsc2UgfSA9IHt9KSA9PiB7XG4gICAgICBhc3NlcnQudHlwZW9mKHBhdGgsICdzdHJpbmcnKTtcbiAgICAgIGFzc2VydC50eXBlb2Yoc2VxdWVuY2UsICdib29sZWFuJyk7XG4gICAgICByZXR1cm4gaGFyZGVuKHsgcGF0aCwgbWVzc2VuZ2VyLCBzZXF1ZW5jZSB9KTtcbiAgICB9LFxuICAgIHtcbiAgICAgIGdldFBhdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLnBhdGg7XG4gICAgICB9LFxuICAgICAgLyoqXG4gKiBAZGVwcmVjYXRlZCB1c2UgZ2V0UGF0aFxuICogQHR5cGUgeygpID0+IFByb21pc2U8VlN0b3JhZ2VLZXk+fVxuICovXG4gICAgICBhc3luYyBnZXRTdG9yZUtleSgpIHtcbiAgICAgICAgY29uc3QgeyBwYXRoLCBtZXNzZW5nZXIgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgIHJldHVybiBjYi5jYWxsRShtZXNzZW5nZXIsIHtcbiAgICAgICAgICBtZXRob2Q6ICdnZXRTdG9yZUtleScsXG4gICAgICAgICAgYXJnczogW3BhdGhdLFxuICAgICAgICB9KTtcbiAgICAgIH0sXG4gICAgICAvKipcbiAqIEB0eXBlIHsoXG4gKiAgIG5hbWU6IHN0cmluZyxcbiAqICAgY2hpbGROb2RlT3B0aW9ucz86IHsgc2VxdWVuY2U/OiBib29sZWFuIH0sXG4gKiApID0+IFN0b3JhZ2VOb2RlfVxuICovXG4gICAgICBtYWtlQ2hpbGROb2RlKG5hbWUsIGNoaWxkTm9kZU9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCB7IHNlcXVlbmNlLCBwYXRoLCBtZXNzZW5nZXIgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgIGFzc2VydFBhdGhTZWdtZW50KG5hbWUpO1xuICAgICAgICBjb25zdCBtZXJnZWRPcHRpb25zID0geyBzZXF1ZW5jZSwgLi4uY2hpbGROb2RlT3B0aW9ucyB9O1xuICAgICAgICByZXR1cm4gbWFrZUNoYWluU3RvcmFnZU5vZGUoXG4gICAgICAgICAgbWVzc2VuZ2VyLFxuICAgICAgICAgIGAke3BhdGh9LiR7bmFtZX1gLFxuICAgICAgICAgIG1lcmdlZE9wdGlvbnMsXG4gICAgICAgICk7XG4gICAgICB9LFxuICAgICAgLyoqIEB0eXBlIHsodmFsdWU6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPn0gKi9cbiAgICAgIGFzeW5jIHNldFZhbHVlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHsgc2VxdWVuY2UsIHBhdGgsIG1lc3NlbmdlciB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgYXNzZXJ0LnR5cGVvZih2YWx1ZSwgJ3N0cmluZycpO1xuICAgICAgICAvKiogQHR5cGUge1N0b3JhZ2VFbnRyeX0gKi9cbiAgICAgICAgbGV0IGVudHJ5O1xuICAgICAgICBpZiAoIXNlcXVlbmNlICYmICF2YWx1ZSkge1xuICAgICAgICAgIGVudHJ5ID0gW3BhdGhdO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGVudHJ5ID0gW3BhdGgsIHZhbHVlXTtcbiAgICAgICAgfVxuICAgICAgICBhd2FpdCBjYi5jYWxsRShtZXNzZW5nZXIsIHtcbiAgICAgICAgICBtZXRob2Q6IHNlcXVlbmNlID8gJ2FwcGVuZCcgOiAnc2V0JyxcbiAgICAgICAgICBhcmdzOiBbZW50cnldLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8qIFBvc3NpYmxlIGV4dGVuc2lvbnM6Ki9cbiAgICAgIC8qICogZ2V0VmFsdWUoKSovXG4gICAgICAvKiAqIGdldENoaWxkTmFtZXMoKSBhbmQvb3IgbWFrZUNoaWxkTm9kZXMoKSovXG4gICAgICAvKiAqIGdldE5hbWUoKSovXG4gICAgICAvKiAqIHJlY3Vyc2l2ZSBkZWxldGUqL1xuICAgICAgLyogKiBiYXRjaCBvcGVyYXRpb25zKi9cbiAgICAgIC8qICogbG9jYWwgYnVmZmVyaW5nICh3aXRoIGVuZC1vZi1ibG9jayBjb21taXQpKi9cbiAgICB9LFxuICApO1xuICByZXR1cm4gbWFrZUNoYWluU3RvcmFnZU5vZGU7XG59OyRozY9fb25jZS5wcmVwYXJlQ2hhaW5TdG9yYWdlTm9kZShwcmVwYXJlQ2hhaW5TdG9yYWdlTm9kZSk7XG5cbmNvbnN0IG1ha2VIZWFwQ2hhaW5TdG9yYWdlTm9kZSA9IHByZXBhcmVDaGFpblN0b3JhZ2VOb2RlKG1ha2VIZWFwWm9uZSgpKTtcblxuLyoqXG4gKiBDcmVhdGUgYSBoZWFwLWJhc2VkIHJvb3Qgc3RvcmFnZSBub2RlIGZvciBhIGdpdmVuIGJhY2tpbmcgZnVuY3Rpb24gYW5kIHJvb3RcbiAqIHBhdGguXG4gKlxuICogQHBhcmFtIHsobWVzc2FnZTogU3RvcmFnZU1lc3NhZ2UpID0+IGFueX0gaGFuZGxlU3RvcmFnZU1lc3NhZ2UgYSBmdW5jdGlvbiBmb3JcbiAqICAgc2VuZGluZyBhIHN0b3JhZ2VNZXNzYWdlIG9iamVjdCB0byB0aGUgc3RvcmFnZSBpbXBsZW1lbnRhdGlvbiAoY2YuXG4gKiAgIGdvbGFuZy9jb3Ntb3MveC92c3RvcmFnZS92c3RvcmFnZS5nbylcbiAqIEBwYXJhbSB7c3RyaW5nfSByb290UGF0aFxuICogQHBhcmFtIHtvYmplY3R9IFtyb290T3B0aW9uc11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Jvb3RPcHRpb25zLnNlcXVlbmNlXSBlbXBsb3kgYSB3cmFwcGluZyBzdHJ1Y3R1cmUgdGhhdFxuICogICBwcmVzZXJ2ZXMgZWFjaCB2YWx1ZSBzZXQgd2l0aGluIGEgc2luZ2xlIGJsb2NrLCBhbmQgZGVmYXVsdCBjaGlsZCBub2RlcyB0b1xuICogICBkbyB0aGUgc2FtZVxuICovXG4gICAgICAgZnVuY3Rpb24gbWFrZUNoYWluU3RvcmFnZVJvb3QoXG4gIGhhbmRsZVN0b3JhZ2VNZXNzYWdlLFxuICByb290UGF0aCxcbiAgcm9vdE9wdGlvbnMgPSB7fSxcbikge1xuICBjb25zdCBtZXNzZW5nZXIgPSBjYi5tYWtlRnVuY3Rpb25DYWxsYmFjayhoYW5kbGVTdG9yYWdlTWVzc2FnZSk7XG5cbiAgLyogVXNlIHRoZSBoZWFwWm9uZSBkaXJlY3RseS4qL1xuICBjb25zdCByb290Tm9kZSA9IG1ha2VIZWFwQ2hhaW5TdG9yYWdlTm9kZShtZXNzZW5nZXIsIHJvb3RQYXRoLCByb290T3B0aW9ucyk7XG4gIHJldHVybiByb290Tm9kZTtcbn1cblxuLyoqXG4gKiBAcmV0dXJucyB7U3RvcmFnZU5vZGV9IGFuIG9iamVjdCB0aGF0IGNvbmZpcm1zIHRvIFN0b3JhZ2VOb2RlIEFQSSBidXQgZG9lc1xuICogICBub3Qgc3RvcmUgYW55d2hlcmUuXG4gKi9cbmNvbnN0IG1ha2VOdWxsU3RvcmFnZU5vZGUgPSAoKSA9PiB7XG4gIC8qIFhYWCByZS11c2UgXCJDaGFpblN0b3JhZ2VcIiBtZXRob2RzIGFib3ZlIHdoaWNoIGRvbid0IGFjdHVhbGx5IGRlcGVuZCBvbiBjaGFpbnMqL1xuICByZXR1cm4gbWFrZUNoYWluU3RvcmFnZVJvb3QoXG4gICAgRmFyKCdOdWxsTWVzc2VuZ2VyJywgKCkgPT4gbnVsbCksXG4gICAgJ251bGwnLFxuICApO1xufTtcblxuLyoqXG4gKiBDb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgcmV0dXJuaW5nIGEgc3RvcmFnZSBub2RlIGF0IG9yIHVuZGVyIGl0cyBpbnB1dCxcbiAqIGZhbGxpbmcgYmFjayB0byBhbiBpbmVydCBvYmplY3Qgd2l0aCB0aGUgY29ycmVjdCBpbnRlcmZhY2UgKGJ1dCBpbmNvbXBsZXRlXG4gKiBiZWhhdmlvcikgd2hlbiB0aGF0IGlzIHVuYXZhaWxhYmxlLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxSZW1vdGU8U3RvcmFnZU5vZGU+IHwgbnVsbD59IHN0b3JhZ2VOb2RlUmVmXG4gKiBAcGFyYW0ge3N0cmluZ30gY2hpbGROYW1lXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxSZW1vdGU8U3RvcmFnZU5vZGU+Pn1cbiAqL1xuICAgICAgIGFzeW5jIGZ1bmN0aW9uIG1ha2VTdG9yYWdlTm9kZUNoaWxkKHN0b3JhZ2VOb2RlUmVmLCBjaGlsZE5hbWUpIHtcbiAgY29uc3QgZXhpc3RpbmdTdG9yYWdlTm9kZSA9IGF3YWl0IHN0b3JhZ2VOb2RlUmVmO1xuICBjb25zdCBzdG9yYWdlTm9kZSA9IGV4aXN0aW5nU3RvcmFnZU5vZGUgfHwgbWFrZU51bGxTdG9yYWdlTm9kZSgpO1xuICByZXR1cm4gRShzdG9yYWdlTm9kZSkubWFrZUNoaWxkTm9kZShjaGlsZE5hbWUpO1xufVxuaGFyZGVuKG1ha2VTdG9yYWdlTm9kZUNoaWxkKTtcblxuLyogVE9ETyBmaW5kIGEgYmV0dGVyIG1vZHVsZSBmb3IgdGhpcyovXG4vKipcbiAqIEBwYXJhbSB7RVJlbW90ZTxTdG9yYWdlTm9kZT59IHN0b3JhZ2VOb2RlXG4gKiBAcGFyYW0ge0VSZW1vdGU8RU1hcnNoYWxsZXI+fSBtYXJzaGFsbGVyXG4gKiBAcmV0dXJucyB7KHZhbHVlOiBQYXNzYWJsZSkgPT4gUHJvbWlzZTx2b2lkPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VTZXJpYWxpemVUb1N0b3JhZ2UgPSAoc3RvcmFnZU5vZGUsIG1hcnNoYWxsZXIpID0+IHtcbiAgcmV0dXJuIGFzeW5jIHZhbHVlID0+IHtcbiAgICBjb25zdCBtYXJzaGFsbGVkID0gYXdhaXQgRShtYXJzaGFsbGVyKS50b0NhcERhdGEodmFsdWUpO1xuICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBKU09OLnN0cmluZ2lmeShtYXJzaGFsbGVkKTtcbiAgICByZXR1cm4gRShzdG9yYWdlTm9kZSkuc2V0VmFsdWUoc2VyaWFsaXplZCk7XG4gIH07XG59OyRozY9fb25jZS5tYWtlU2VyaWFsaXplVG9TdG9yYWdlKG1ha2VTZXJpYWxpemVUb1N0b3JhZ2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiU3RyZWFtQ2VsbFNoYXBlIjpbIlN0cmVhbUNlbGxTaGFwZSJdLCJpc1N0cmVhbUNlbGwiOlsiaXNTdHJlYW1DZWxsIl0sImFzc2VydFBhdGhTZWdtZW50IjpbImFzc2VydFBhdGhTZWdtZW50Il0sInByZXBhcmVDaGFpblN0b3JhZ2VOb2RlIjpbInByZXBhcmVDaGFpblN0b3JhZ2VOb2RlIl0sIm1ha2VDaGFpblN0b3JhZ2VSb290IjpbIm1ha2VDaGFpblN0b3JhZ2VSb290Il0sIm1ha2VTdG9yYWdlTm9kZUNoaWxkIjpbIm1ha2VTdG9yYWdlTm9kZUNoaWxkIl0sIm1ha2VTZXJpYWxpemVUb1N0b3JhZ2UiOlsibWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAjRXL6pwMAAKcDAAA3AAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL21hcnNoYWwvaW5hY2Nlc3NpYmxlLXZhbC5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiXSwiZXhwb3J0cyI6WyJtYWtlSW5hY2Nlc3NpYmxlVmFsIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFyOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXV0pO1xuXG5cbmNvbnN0IGlmYWNlQWxsZWdlZFByZWZpeCA9ICdBbGxlZ2VkOiAnO1xuY29uc3QgaWZhY2VJbmFjY2Vzc2libGVQcmVmaXggPSAnU0VWRVJFRDogJztcbi8qKlxuICogQHBhcmFtIHtzdHJpbmcgfCB1bmRlZmluZWR9IGlmYWNlXG4gKiBAcmV0dXJucyB7YW55fVxuICovXG4gICAgICAgY29uc3QgbWFrZUluYWNjZXNzaWJsZVZhbCA9IGlmYWNlID0+IHtcbiAgaWYgKHR5cGVvZiBpZmFjZSA9PT0gJ3N0cmluZycgJiYgaWZhY2Uuc3RhcnRzV2l0aChpZmFjZUFsbGVnZWRQcmVmaXgpKSB7XG4gICAgaWZhY2UgPSBpZmFjZS5zbGljZShpZmFjZUFsbGVnZWRQcmVmaXgubGVuZ3RoKTtcbiAgfVxuICByZXR1cm4gRmFyKGAke2lmYWNlSW5hY2Nlc3NpYmxlUHJlZml4fSR7aWZhY2V9YCwge30pO1xufTskaM2PX29uY2UubWFrZUluYWNjZXNzaWJsZVZhbChtYWtlSW5hY2Nlc3NpYmxlVmFsKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VJbmFjY2Vzc2libGVWYWwiOlsibWFrZUluYWNjZXNzaWJsZVZhbCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACkg8+esQMAALEDAAAwAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL21hcnNoYWwvcHVyZS1kYXRhLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJwdXJlRGF0YU1hcnNoYWxsZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLG1ha2VNYXJzaGFsOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIm1ha2VNYXJzaGFsXCIsWyRozY9fYSA9PiAobWFrZU1hcnNoYWwgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtDYXBEYXRhfSBmcm9tICdAZW5kby9tYXJzaGFsJztcbiAqL1xuXG4vKiogQHBhcmFtIHtDYXBEYXRhPHVua25vd24+fSBjYXAgKi9cbmNvbnN0IHJlamVjdE9DYXAgPSBjYXAgPT4gRmFpbGAke2NhcH0gaXMgbm90IHB1cmUgZGF0YWA7XG4gICAgICAgY29uc3QgcHVyZURhdGFNYXJzaGFsbGVyID0gbWFrZU1hcnNoYWwocmVqZWN0T0NhcCwgcmVqZWN0T0NhcCwge1xuICBzZXJpYWxpemVCb2R5Rm9ybWF0OiAnc21hbGxjYXBzJyxcbn0pOyRozY9fb25jZS5wdXJlRGF0YU1hcnNoYWxsZXIocHVyZURhdGFNYXJzaGFsbGVyKTtcbmhhcmRlbihwdXJlRGF0YU1hcnNoYWxsZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHVyZURhdGFNYXJzaGFsbGVyIjpbInB1cmVEYXRhTWFyc2hhbGxlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADWXTPe5TwAAOU8AAA2AAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL21hcnNoYWwvd3JhcC1tYXJzaGFsbGVyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2NhY2hlLW1hcCIsIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9mYXIiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vbWFyc2hhbCIsIi4vaW5hY2Nlc3NpYmxlLXZhbC5qcyJdLCJleHBvcnRzIjpbIndyYXBSZW1vdGVNYXJzaGFsbGVyIiwid3JhcFJlbW90ZU1hcnNoYWxsZXJEaXJlY3RTZW5kIiwid3JhcFJlbW90ZU1hcnNoYWxsZXJTZW5kU2xvdHNPbmx5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgbWFrZUNhY2hlTWFwS2l0LEZhaWwscSxFLEZhcixQQVNTX1NUWUxFLG1ha2VNYXJzaGFsLG1ha2VJbmFjY2Vzc2libGVWYWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9jYWNoZS1tYXBcIiwgW1tcIm1ha2VDYWNoZU1hcEtpdFwiLFskaM2PX2EgPT4gKG1ha2VDYWNoZU1hcEtpdCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiUEFTU19TVFlMRVwiLFskaM2PX2EgPT4gKFBBU1NfU1RZTEUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJtYWtlTWFyc2hhbFwiLFskaM2PX2EgPT4gKG1ha2VNYXJzaGFsID0gJGjNj19hKV1dXV0sW1wiLi9pbmFjY2Vzc2libGUtdmFsLmpzXCIsIFtbXCJtYWtlSW5hY2Nlc3NpYmxlVmFsXCIsWyRozY9fYSA9PiAobWFrZUluYWNjZXNzaWJsZVZhbCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtXZWFrTWFwQVBJfSBmcm9tICdAZW5kby9jYWNoZS1tYXAnO1xuICogQGltcG9ydCB7RU9ubHl9IGZyb20gJ0BlbmRvL2V2ZW50dWFsLXNlbmQnO1xuICogQGltcG9ydCB7UGFzc1N0eWxlZCwgU2ltcGxpZnl9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnO1xuICogQGltcG9ydCB7Q2FwRGF0YSwgUGFzc2FibGUsIE1hcnNoYWwsIE1ha2VNYXJzaGFsT3B0aW9uc30gZnJvbSAnQGVuZG8vbWFyc2hhbCc7XG4gKiBAaW1wb3J0IHtFUmVtb3RlfSBmcm9tICcuLi90eXBlcy5qcyc7XG4gKi9cblxuLyoqXG4gKiBBIE1hcnNoYWxsZXIgd2hpY2ggbWV0aG9kcyBtYXkgYmUgYXN5bmMuIFVzZSB0aGlzIHR5cGUgdG8gaW5kaWNhdGUgYWNjZXB0aW5nXG4gKiBlaXRoZXIgYSBzeW5jIG9yIGFzeW5jIG1hcnNoYWxsZXIsIHVzdWFsbHkgdGhyb3VnaCBgRWAgZXZlbnR1YWwtc2VuZHMuXG4gKlxuICogQHRlbXBsYXRlIFtTbG90PXVua25vd25dXG4gKiBAdHlwZWRlZiB7U2ltcGxpZnk8RU9ubHk8TWFyc2hhbDxTbG90Pj4+fSBFTWFyc2hhbGxlclxuICovXG5cbi8qKiBAdHlwZWRlZiB7J1JlbW90YWJsZScgfCBgQWxsZWdlZDogJHtzdHJpbmd9YH0gSW50ZXJmYWNlU3BlYyAqL1xuXG4vKiogQHRlbXBsYXRlIFtTbG90PXVua25vd25dICovXG5jbGFzcyBTbG90V3JhcHBlciB7XG4gIC8qKiBAdHlwZSB7U2xvdH0gKi9cbiAgI3Nsb3Q7XG5cbiAgLyoqIEB0eXBlIHtJbnRlcmZhY2VTcGVjfSAqL1xuICBbU3ltYm9sLnRvU3RyaW5nVGFnXSA9ICdBbGxlZ2VkOiBTbG90V3JhcHBlcic7XG5cbiAgLyoqXG4gKiBAcGFyYW0ge1Nsb3R9IHNsb3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBbaWZhY2VdXG4gKi9cbiAgY29uc3RydWN0b3Ioc2xvdCwgaWZhY2UpIHtcbiAgICBpZiAoaWZhY2UgPT0gbnVsbCB8fCBpZmFjZSA9PT0gJ1JlbW90YWJsZScpIHtcbiAgICAgIGlmYWNlID0gJ1JlbW90YWJsZSc7XG4gICAgfSBlbHNlIGlmICghaWZhY2Uuc3RhcnRzV2l0aCgnQWxsZWdlZDogJykpIHtcbiAgICAgIGlmYWNlID0gYEFsbGVnZWQ6ICR7aWZhY2V9YDtcbiAgICB9XG4gICAgdGhpcy4jc2xvdCA9IHNsb3Q7XG4gICAgdGhpc1tTeW1ib2wudG9TdHJpbmdUYWddID0gLyoqIEB0eXBlIHtJbnRlcmZhY2VTcGVjfSAqLyAoaWZhY2UpO1xuICB9XG5cbiAgLyoqXG4gKiBAdGVtcGxhdGUgW1Nsb3Q9dW5rbm93bl1cbiAqIEBwYXJhbSB7U2xvdFdyYXBwZXI8U2xvdD59IHdyYXBwZXJcbiAqIEByZXR1cm5zIHtTbG90fVxuICovXG4gIHN0YXRpYyBnZXRTbG90KHdyYXBwZXIpIHtcbiAgICByZXR1cm4gd3JhcHBlci4jc2xvdDtcbiAgfVxufVxuT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoU2xvdFdyYXBwZXIucHJvdG90eXBlLCB7XG4gIFtQQVNTX1NUWUxFXTogeyB2YWx1ZTogJ3JlbW90YWJsZScgfSxcbiAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHsgdmFsdWU6ICdBbGxlZ2VkOiBTbG90V3JhcHBlcicgfSxcbn0pO1xuUmVmbGVjdC5kZWxldGVQcm9wZXJ0eShTbG90V3JhcHBlci5wcm90b3R5cGUsICdjb25zdHJ1Y3RvcicpO1xuaGFyZGVuKFNsb3RXcmFwcGVyKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgW1Nsb3Q9dW5rbm93bl1cbiAqIEB0eXBlZGVmIHtTbG90V3JhcHBlcjxTbG90PiAmIFBhc3NTdHlsZWQ8J3JlbW90YWJsZScsIEludGVyZmFjZVNwZWM+fSBSZW1vdGFibGVTbG90V3JhcHBlclxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFtTbG90PXVua25vd25dXG4gKiBAcGFyYW0ge1Nsb3R9IHNsb3RcbiAqIEBwYXJhbSB7c3RyaW5nfSBbaWZhY2VdXG4gKi9cbmNvbnN0IHNsb3RUb1dyYXBwZXIgPSAoc2xvdCwgaWZhY2UpID0+XG4gIC8qKiBAdHlwZSB7UmVtb3RhYmxlU2xvdFdyYXBwZXI8U2xvdD59ICovIChcbiAgICBoYXJkZW4obmV3IFNsb3RXcmFwcGVyKHNsb3QsIGlmYWNlKSlcbiAgKTtcblxuY29uc3Qgd3JhcHBlclRvU2xvdCA9IFNsb3RXcmFwcGVyLmdldFNsb3Q7XG5cbmNvbnN0IGNhcGFjaXR5T2ZEZWZhdWx0Q2FjaGUgPSA1MDtcblxuLyogVE9ETyhodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzEyMTExKSovXG4vKiBDaGVjayBjb3N0IG9mIHVzaW5nIHZpcnR1YWwtYXdhcmUgV2Vha01hcCBpbiBsaXZlc2xvdHMqL1xuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHRlbXBsYXRlIFZcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3dlYWtLZXldXG4gKi9cbmNvbnN0IG1ha2VEZWZhdWx0Q2FjaGVNYXAgPSB3ZWFrS2V5ID0+XG4gIC8qKiBAdHlwZSB7V2Vha01hcEFQSTxLLCBWPn0gKi8gKFxuICAgIG1ha2VDYWNoZU1hcEtpdChjYXBhY2l0eU9mRGVmYXVsdENhY2hlLCB7XG4gICAgICBtYWtlTWFwOiB3ZWFrS2V5ID8gV2Vha01hcCA6IE1hcCxcbiAgICB9KS5jYWNoZVxuICApO1xuXG4vKipcbiAqIFdyYXBzIGEgbWFyc2hhbGxlciwgZWl0aGVyIHN5bmMgb3IgYXN5bmMsIGxvY2FsIG9yIHJlbW90ZSwgaW50byBhIGxvY2FsIGFzeW5jXG4gKiBtYXJzaGFsbGVyIHdoaWNoIG9ubHkgc2VuZHMgc2xvdHMgZm9yIHJlc29sdXRpb24gdG8gdGhlIHdyYXBwZWQgbWFyc2hhbGxlci5cbiAqIE9wdGlvbmFsbHkgYW5kIGJ5IGRlZmF1bHQsIGNhY2hlcyB0aGUgcmVzb2x1dGlvbiBvZiBzbG90cy5cbiAqXG4gKiBBc3N1bWVzIHRoYXQgYSBudWxsLWlzaCBzbG90IHZhbHVlIGlzIGEgc2V2ZXJlZCBwcmVzZW5jZSB0aGF0IGNhbiBiZSByZXNvbHZlZFxuICogbG9jYWxseS4gQnkgZGVmYXVsdCBpZiBhIHByZXNlbmNlIGlzIG1hcHBlZCB0byBhIG51bGwtaXNoIHNsb3QgYnkgdGhlIHdyYXBwZWRcbiAqIG1hcnNoYWxsZXIsIHRoYXQgbWFwcGluZyBpcyBub3QgY2FjaGVkLCBhbGxvd2luZyB0aGUgd3JhcHBlZCBtYXJzaGFsbGVyIHRvXG4gKiBjcmVhdGUgYSBtYXBwaW5nIGluIHRoZSBmdXR1cmUuXG4gKlxuICogQHRlbXBsYXRlIFtTbG90PXVua25vd25dXG4gKiBAcGFyYW0ge0VSZW1vdGU8UGljazxFTWFyc2hhbGxlcjxTbG90PiwgJ2Zyb21DYXBEYXRhJyB8ICd0b0NhcERhdGEnPj59IG1hcnNoYWxsZXJcbiAqIEBwYXJhbSB7TWFrZU1hcnNoYWxPcHRpb25zfSBbbWFyc2hhbE9wdGlvbnNdXG4gKiBAcGFyYW0ge29iamVjdH0gW2NhY2hlc11cbiAqIEBwYXJhbSB7V2Vha01hcEFQSTxvYmplY3QsIFNsb3Q+IHwgbnVsbH0gW2NhY2hlcy52YWxUb1Nsb3RdXG4gKiBAcGFyYW0ge1dlYWtNYXBBUEk8U2xvdCwgb2JqZWN0PiB8IG51bGx9IFtjYWNoZXMuc2xvdFRvVmFsXVxuICogQHBhcmFtIHtib29sZWFufSBbY2FjaGVzLmNhY2hlU2V2ZXJlZFZhbF1cbiAqIEByZXR1cm5zIHtSZXR1cm5UeXBlPHR5cGVvZiBGYXI8RU1hcnNoYWxsZXI8U2xvdD4+Pn1cbiAqL1xuICAgICAgIGNvbnN0IHdyYXBSZW1vdGVNYXJzaGFsbGVyU2VuZFNsb3RzT25seSA9IChcbiAgbWFyc2hhbGxlcixcbiAge1xuICAgIHNlcmlhbGl6ZUJvZHlGb3JtYXQgPSAnc21hbGxjYXBzJyxcbiAgICBlcnJvclRhZ2dpbmcgPSAnb2ZmJywgLyogRGlzYWJsZSBlcnJvciB0YWdnaW5nIGJ5IGRlZmF1bHQqL1xuICAgIC4uLm90aGVyTWFyc2hhbE9wdGlvbnNcbiAgfSA9IHt9LFxuICB7XG4gICAgdmFsVG9TbG90ID0gbWFrZURlZmF1bHRDYWNoZU1hcCh0cnVlKSxcbiAgICBzbG90VG9WYWwgPSBtYWtlRGVmYXVsdENhY2hlTWFwKGZhbHNlKSxcbiAgICBjYWNoZVNldmVyZWRWYWwgPSBmYWxzZSxcbiAgfSA9IHt9LFxuKSA9PiB7XG4gIGNvbnN0IG1hcnNoYWxPcHRpb25zID0gaGFyZGVuKHtcbiAgICBzZXJpYWxpemVCb2R5Rm9ybWF0LFxuICAgIGVycm9yVGFnZ2luZyxcbiAgICAuLi5vdGhlck1hcnNoYWxPcHRpb25zLFxuICB9KTtcbiAgLyogVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgd3JhcHBlZCBtYXJzaGFsbGVyIGludGVybmFsbHkgdXNlcyAyIG1hcnNoYWxsZXJzKi9cbiAgLyogdG8gdHJhbnNmb3JtIHRoZSBDYXBEYXRhIGludG8gYSBQYXNzYWJsZSBzdHJ1Y3R1cmUgYW5kIHZpY2UtdmVyc2E6Ki9cbiAgLyogLSBBIGNhcCBwYXNzLXRocm91Z2ggbWFyc2hhbGxlciB3aGljaCBwbGFjZXMgY2FwYWJpbGl0aWVzIGFzLWlzIGluIHRoZSBzbG90cy4qL1xuICAvKiBXaGVuIHVuc2VyaWFsaXppbmcgQ2FwRGF0YSB3aXRoIG51bGwtaXNoIHNsb3RzLCBhIHNldmVyZWQgcHJlc2VuY2UgaXMgY3JlYXRlZC4qL1xuICAvKiBUaGlzIHBhc3MtdGhyb3VnaCBtYXJzaGFsbGVyIGlzIHVzZWQgdG8gbG9jYWxseSBwcm9jZXNzIHRoZSBzdHJ1Y3R1cmUsIGFuZCovXG4gIC8qIHNlcGFyYXRlIGNhcGFiaWxpdGllcyBpbnRvIGEgc2xvdHMgYXJyYXkgZm9yIHBvdGVudGlhbCByZXNvbHV0aW9uIGJ5IHRoZSovXG4gIC8qIHdyYXBwZWQgbWFyc2hhbGxlci4qL1xuICAvKiAtIEEgXCJTbG90V3JhcHBlclwiIG1hcnNoYWxsZXIgdXNlZCB0byB3cmFwIGludG8gcmVtb3RhYmxlcyB0aGUgc2xvdHMgb2YgdGhlKi9cbiAgLyogd3JhcHBlZCBtYXJzaGFsbGVyLiBXaGVuIHVuc2VyaWFsaXppbmcgQ2FwRGF0YSwgaXQgaXMgdXNlZCB0byByZWNyZWF0ZSovXG4gIC8qIENhcERhdGEgb2YgYSBzaW1wbGUgYXJyYXkgb2Ygbm9uLXNldmVyZWQgY2FwYWJpbGl0aWVzIGZvciByZXNvbHV0aW9uIGJ5Ki9cbiAgLyogdGhlIHdyYXBwZWQgbWFyc2hhbGxlci4gV2hlbiBzZXJpYWxpemluZyB0byBDYXBEYXRhLCBpdCBhbGxvd3MgZXh0cmFjdGluZyovXG4gIC8qIHRoZSBzbG90cyBmcm9tIHRoZSBjYXBhYmlsaXRpZXMgYXJyYXkgc2VyaWFsaXplZCBieSB0aGUgd3JhcHBlZCBtYXJzaGFsbGVyLiovXG5cbiAgLyoqIEB0eXBlIHtNYXJzaGFsPG9iamVjdCB8IG51bGw+fSAqL1xuICBjb25zdCBwYXNzVGhyb3VnaE1hcnNoYWxsZXIgPSBtYWtlTWFyc2hhbChcbiAgICB1bmRlZmluZWQsXG4gICAgKHNsb3QsIGlmYWNlKSA9PiBzbG90ID8/IG1ha2VJbmFjY2Vzc2libGVWYWwoaWZhY2UpLFxuICAgIG1hcnNoYWxPcHRpb25zLFxuICApO1xuXG4gIC8qKiBAdHlwZSB7TWFwPFNsb3QsIFJlbW90YWJsZVNsb3RXcmFwcGVyPE5vbk51bGxhYmxlPFNsb3Q+Pj59ICovXG4gIGNvbnN0IGN1cnJlbnRTbG90VG9XcmFwcGVyID0gbmV3IE1hcCgpO1xuXG4gIGNvbnN0IGNvbnZlcnRXcmFwcGVyVG9TbG90ID0gLyoqIEB0eXBlIHt0eXBlb2Ygd3JhcHBlclRvU2xvdDxTbG90Pn0gKi8gKFxuICAgIHdyYXBwZXJUb1Nsb3RcbiAgKTtcbiAgLyoqXG4gKiBAcGFyYW0ge1Nsb3R9IHNsb3RcbiAqIEBwYXJhbSB7c3RyaW5nIHwgdW5kZWZpbmVkfSBbaWZhY2VdXG4gKi9cbiAgY29uc3QgY29udmVydFNsb3RUb1dyYXBwZXIgPSAoc2xvdCwgaWZhY2UpID0+IHtcbiAgICBpZiAoc2xvdCA9PSBudWxsKSB7XG4gICAgICAvKiBUaGUgd3JhcHBlZCBtYXJzaGFsbGVyIG1heSBzZW5kIHVzIENhcERhdGEgd2l0aCBhIG51bGwgc2xvdC4gVGhlc2UgYXJlIG5vdCovXG4gICAgICAvKiBtZWFudCB0byBiZSBjb25zaWRlcmVkIGVxdWl2YWxlbnQgd2l0aCBlYWNoIG90aGVyLCBzbyBieXBhc3MgbWFwcGluZy4qL1xuICAgICAgcmV0dXJuIHNsb3RUb1dyYXBwZXIoc2xvdCwgaWZhY2UpO1xuICAgIH1cbiAgICBsZXQgd3JhcHBlciA9IGN1cnJlbnRTbG90VG9XcmFwcGVyLmdldChzbG90KTtcbiAgICBpZiAoIXdyYXBwZXIpIHtcbiAgICAgIHdyYXBwZXIgPSBzbG90VG9XcmFwcGVyKHNsb3QsIGlmYWNlKTtcbiAgICAgIGN1cnJlbnRTbG90VG9XcmFwcGVyLnNldChzbG90LCB3cmFwcGVyKTtcbiAgICB9XG5cbiAgICByZXR1cm4gd3JhcHBlcjtcbiAgfTtcblxuICAvKiogQHR5cGUge1BpY2s8TWFyc2hhbDxTbG90PiwgJ3RvQ2FwRGF0YScgfCAnZnJvbUNhcERhdGEnPn0gKi9cbiAgY29uc3Qgc2xvdFdyYXBwZXJNYXJzaGFsbGVyID0gbWFrZU1hcnNoYWwoXG4gICAgY29udmVydFdyYXBwZXJUb1Nsb3QsXG4gICAgY29udmVydFNsb3RUb1dyYXBwZXIsXG4gICAgbWFyc2hhbE9wdGlvbnMsXG4gICk7XG5cbiAgLyoqXG4gKiBSZXNvbHZlcyBhbiBhcnJheSBvZiB3cmFwcGVkIG1hcnNoYWxsZXIncyBzbG90cyB0byBhbiBhcnJheSBvZlxuICogY2FwYWJpbGl0aWVzLlxuICpcbiAqIFRoaXMgaXMgdXNlZCBieSBgZnJvbUNhcERhdGFgIHRvIG1hcCBzbG90cyBiZWZvcmUgdXNpbmcgdGhlIHBhc3MtdGhyb3VnaFxuICogbWFyc2hhbGxlciB0byByZWNyZWF0ZSB0aGUgcGFzc2FibGUgZGF0YS5cbiAqXG4gKiBAcGFyYW0ge1Nsb3RbXX0gc2xvdHNcbiAqIEBwYXJhbSB7KGluZGV4OiBudW1iZXIpID0+IFJlbW90YWJsZVNsb3RXcmFwcGVyPE5vbk51bGxhYmxlPFNsb3Q+Pn0gZ2V0V3JhcHBlclxuICogQHJldHVybnMge1Byb21pc2U8KG9iamVjdCB8IG51bGwpW10+fVxuICovXG4gIGNvbnN0IG1hcFNsb3RzVG9DYXBzID0gYXN5bmMgKHNsb3RzLCBnZXRXcmFwcGVyKSA9PiB7XG4gICAgbGV0IGhhc1JlbW90ZUNhcCA9IGZhbHNlO1xuICAgIGNvbnN0IHsgbGVuZ3RoIH0gPSBzbG90cztcbiAgICAvKiogQHR5cGUgeyhSZW1vdGFibGVTbG90V3JhcHBlcjxOb25OdWxsYWJsZTxTbG90Pj4gfCBudWxsIHwgdW5kZWZpbmVkKVtdfSAqL1xuICAgIGNvbnN0IHNsb3RXcmFwcGVyTWFwcGVkU2xvdHMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoIH0pO1xuICAgIC8qKiBAdHlwZSB7KG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQpW119ICovXG4gICAgY29uc3QgbG9jYWxseVJlc29sdmVkQ2FwU2xvdHMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoIH0pO1xuXG4gICAgZm9yIChjb25zdCBbaW5kZXgsIHNsb3RdIG9mIHNsb3RzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKHNsb3QgPT09IG51bGwpIHtcbiAgICAgICAgY29uc3QgbnVsbFNsb3QgPSAvKiogQHR5cGUge251bGx9ICovIChzbG90KTtcbiAgICAgICAgc2xvdFdyYXBwZXJNYXBwZWRTbG90c1tpbmRleF0gPSBudWxsU2xvdDtcbiAgICAgICAgbG9jYWxseVJlc29sdmVkQ2FwU2xvdHNbaW5kZXhdID0gbnVsbFNsb3Q7XG4gICAgICB9IGVsc2UgaWYgKHNsb3QgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCBjYWNoZWRDYXAgPSBzbG90VG9WYWw/LmdldChzbG90KTtcbiAgICAgICAgaWYgKGNhY2hlZENhcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgdmFsVG9TbG90Py5zZXQoY2FjaGVkQ2FwLCBzbG90KTtcbiAgICAgICAgICBsb2NhbGx5UmVzb2x2ZWRDYXBTbG90c1tpbmRleF0gPSBjYWNoZWRDYXA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaGFzUmVtb3RlQ2FwID0gdHJ1ZTtcbiAgICAgICAgICBzbG90V3JhcHBlck1hcHBlZFNsb3RzW2luZGV4XSA9IGdldFdyYXBwZXIoaW5kZXgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgbnVsbDtcbiAgICBpZiAoaGFzUmVtb3RlQ2FwKSB7XG4gICAgICBoYXJkZW4oc2xvdFdyYXBwZXJNYXBwZWRTbG90cyk7XG4gICAgICBjb25zdCBzbG90c09ubHlDYXBEYXRhID0gc2xvdFdyYXBwZXJNYXJzaGFsbGVyLnRvQ2FwRGF0YShcbiAgICAgICAgc2xvdFdyYXBwZXJNYXBwZWRTbG90cyxcbiAgICAgICk7XG5cbiAgICAgIC8qKiBAdHlwZSB7KG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQpW119ICovXG4gICAgICBjb25zdCByZW1vdGVseVJlc29sdmVkQ2FwU2xvdHMgPVxuICAgICAgICBhd2FpdCBFKG1hcnNoYWxsZXIpLmZyb21DYXBEYXRhKHNsb3RzT25seUNhcERhdGEpO1xuXG4gICAgICBmb3IgKGNvbnN0IFtpbmRleCwgdmFsXSBvZiByZW1vdGVseVJlc29sdmVkQ2FwU2xvdHMuZW50cmllcygpKSB7XG4gICAgICAgIGlmICh2YWwgIT0gbnVsbCkge1xuICAgICAgICAgIGNvbnN0IHNsb3QgPSBzbG90c1tpbmRleF07XG4gICAgICAgICAgc2xvdFRvVmFsPy5zZXQoc2xvdCwgdmFsKTtcbiAgICAgICAgICB2YWxUb1Nsb3Q/LnNldCh2YWwsIHNsb3QpO1xuICAgICAgICAgIGxvY2FsbHlSZXNvbHZlZENhcFNsb3RzW2luZGV4XSA9IHZhbDtcbiAgICAgICAgfSBlbHNlIGlmIChsb2NhbGx5UmVzb2x2ZWRDYXBTbG90c1tpbmRleF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIGNvbnN0IHNsb3QgPSBzbG90c1tpbmRleF07XG4gICAgICAgICAgY29uc29sZS53YXJuKCfimqDvuI8gVW5yZXNvbHZlZCBsb2NhbCBzbG90IGluIHdyYXBwZWQgbWFyc2hhbGxlcicsIHtcbiAgICAgICAgICAgIGluZGV4LFxuICAgICAgICAgICAgc2xvdCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBoYXJkZW4obG9jYWxseVJlc29sdmVkQ2FwU2xvdHMpO1xuICB9O1xuXG4gIC8qKlxuICogUmVzb2x2ZXMgYW4gYXJyYXkgb2YgY2FwYWJpbGl0aWVzIGludG8gYW4gYXJyYXkgb2Ygc2xvdHMgb2YgdGhlIHdyYXBwZWRcbiAqIG1hcnNoYWxsZXIuXG4gKlxuICogVGhpcyBpcyB1c2VkIGJ5IGB0b0NhcERhdGFgIHRvIG1hcCBzbG90cyBhZnRlciB0aGUgcGFzcy10aHJvdWdoIG1hcnNoYWxsZXJcbiAqIGhhcyBzZXJpYWxpemVkIHRoZSBwYXNzYWJsZSBkYXRhLlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0W119IGNhcHNcbiAqIEByZXR1cm5zIHtQcm9taXNlPFNsb3RbXT59XG4gKi9cbiAgY29uc3QgbWFwQ2Fwc1RvU2xvdHMgPSBhc3luYyBjYXBzID0+IHtcbiAgICBpZiAoY2Fwcy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBjYXBzO1xuICAgIH1cbiAgICBsZXQgaGFzUmVtb3RlQ2FwID0gZmFsc2U7XG4gICAgY29uc3QgeyBsZW5ndGggfSA9IGNhcHM7XG4gICAgLyoqIEB0eXBlIHsoU2xvdCB8IG51bGwgfCB1bmRlZmluZWQpW119ICovXG4gICAgY29uc3QgbG9jYWxseVJlc29sdmVkU2xvdHMgPSBBcnJheS5mcm9tKHsgbGVuZ3RoIH0pO1xuICAgIC8qKiBAdHlwZSB7KG9iamVjdCB8IG51bGwgfCB1bmRlZmluZWQpW119ICovXG4gICAgY29uc3QgcmVtb3RlQ2Fwc1RvUmVzb2x2ZSA9IEFycmF5LmZyb20oeyBsZW5ndGggfSk7XG5cbiAgICBmb3IgKGNvbnN0IFtpbmRleCwgY2FwXSBvZiBjYXBzLmVudHJpZXMoKSkge1xuICAgICAgaWYgKGNhcCA9PT0gbnVsbCkge1xuICAgICAgICAvKiBXZSBzaG91bGRuJ3QgZ2V0IG51bGwgY2FwcyBoZXJlLCBidXQgd2UgbWlycm9yIGhhbmRsZSB0aGVtIGFueXdheSovXG4gICAgICAgIGNvbnN0IG51bGxDYXAgPSAvKiogQHR5cGUge251bGx9ICovIChjYXApO1xuICAgICAgICByZW1vdGVDYXBzVG9SZXNvbHZlW2luZGV4XSA9IG51bGxDYXA7XG4gICAgICAgIGxvY2FsbHlSZXNvbHZlZFNsb3RzW2luZGV4XSA9IG51bGxDYXA7XG4gICAgICB9IGVsc2UgaWYgKGNhcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGNvbnN0IGNhY2hlZFNsb3QgPSB2YWxUb1Nsb3Q/LmdldChjYXApO1xuICAgICAgICBpZiAoY2FjaGVkU2xvdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgaWYgKGNhY2hlZFNsb3QgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHNsb3RUb1ZhbD8uc2V0KGNhY2hlZFNsb3QsIGNhcCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxvY2FsbHlSZXNvbHZlZFNsb3RzW2luZGV4XSA9IGNhY2hlZFNsb3Q7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgaGFzUmVtb3RlQ2FwID0gdHJ1ZTtcbiAgICAgICAgICByZW1vdGVDYXBzVG9SZXNvbHZlW2luZGV4XSA9IGNhcDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IG51bGw7XG4gICAgaWYgKGhhc1JlbW90ZUNhcCkge1xuICAgICAgY29uc3QgcmVtb3RlbHlSZXNvbHZlZFNsb3RzQ2FwRGF0YSA9XG4gICAgICAgIGF3YWl0IEUobWFyc2hhbGxlcikudG9DYXBEYXRhKHJlbW90ZUNhcHNUb1Jlc29sdmUpO1xuICAgICAgdHJ5IHtcbiAgICAgICAgLyoqIEB0eXBlIHsoUmVtb3RhYmxlU2xvdFdyYXBwZXI8U2xvdD4gfCBudWxsIHwgdW5kZWZpbmVkKVtdfSAqL1xuICAgICAgICBjb25zdCBzbG90V3JhcHBlck1hcHBlZFNsb3RzID0gc2xvdFdyYXBwZXJNYXJzaGFsbGVyLmZyb21DYXBEYXRhKFxuICAgICAgICAgIHJlbW90ZWx5UmVzb2x2ZWRTbG90c0NhcERhdGEsXG4gICAgICAgICk7XG4gICAgICAgIGZvciAoY29uc3QgW2luZGV4LCBzbG90V3JhcHBlcl0gb2Ygc2xvdFdyYXBwZXJNYXBwZWRTbG90cy5lbnRyaWVzKCkpIHtcbiAgICAgICAgICBpZiAoc2xvdFdyYXBwZXIgIT0gbnVsbCkge1xuICAgICAgICAgICAgY29uc3Qgc2xvdCA9IGNvbnZlcnRXcmFwcGVyVG9TbG90KHNsb3RXcmFwcGVyKTtcbiAgICAgICAgICAgIGNvbnN0IHZhbCA9IGNhcHNbaW5kZXhdO1xuICAgICAgICAgICAgbG9jYWxseVJlc29sdmVkU2xvdHNbaW5kZXhdID0gc2xvdDtcbiAgICAgICAgICAgIGlmIChzbG90ICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgc2xvdFRvVmFsPy5zZXQoc2xvdCwgdmFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzbG90ICE9IG51bGwgfHwgY2FjaGVTZXZlcmVkVmFsKSB7XG4gICAgICAgICAgICAgIHZhbFRvU2xvdD8uc2V0KHZhbCwgc2xvdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIGlmIChsb2NhbGx5UmVzb2x2ZWRTbG90c1tpbmRleF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgY2FwID0gY2Fwc1tpbmRleF07XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oJ+KaoO+4jyBVbnJlc29sdmVkIGxvY2FsIHNsb3QgaW4gd3JhcHBlZCBtYXJzaGFsbGVyJywge1xuICAgICAgICAgICAgICBpbmRleCxcbiAgICAgICAgICAgICAgY2FwLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICAvKiBXZSdyZSBkb25lIHdpdGggdGhlIHNsb3RXcmFwcGVyTWFyc2hhbGxlciwgY2xlYXIgaXRzIHN0YXRlKi9cbiAgICAgICAgY3VycmVudFNsb3RUb1dyYXBwZXIuY2xlYXIoKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBBbGwgc2xvdHMgc2hvdWxkIGhhdmUgYmVlbiByZXNvbHZlZCBieSBub3cgKG9yIHdhcm5lZCBhYm91dCkqL1xuICAgIHJldHVybiAvKiogQHR5cGUge1Nsb3RbXX0gKi8gKGhhcmRlbihsb2NhbGx5UmVzb2x2ZWRTbG90cykpO1xuICB9O1xuXG4gIC8qKlxuICogVW5mb3J0dW5hdGVseSBDYXBEYXRhIG9ubHkgY29udGFpbnMgaWZhY2UgaW5mb3JtYXRpb24gZm9yIHNsb3R0ZWRcbiAqIGNhcGFiaWxpdGllcyBuZXN0ZWQgaW5zaWRlIHRoZSBib2R5LCB3aGljaCBtZWFucyB3ZSBuZWVkIHRvIHByb2Nlc3MgdGhlXG4gKiBib2R5IHRvIGV4dHJhY3QgaXQuIE1heWJlIGluIHRoZSBmdXR1cmUgQ2FwRGF0YSBjb3VsZCBiZSBleHRlbmRlZCB0byBjYXJyeVxuICogdGhpcyBzZXBhcmF0ZWx5LiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8yOTkxXG4gKlxuICogU2luY2UgdGhpcyBoZWxwZXIgaXMgdXNlZCBpbnRlcm5hbGx5IHRvIHVsdGltYXRlbHkgcHJvdmlkZSBTbG90V3JhcHBlclxuICogb2JqZWN0cyB0byB0aGUgY29ycmVzcG9uZGluZyBtYXJzaGFsbGVyLCBhbmQgdGhhdCB3ZSB1c2UgdGhlIHNhbWVcbiAqIG1hcnNoYWxsZXIgdG8gZXh0cmFjdCB0aGUgaWZhY2UgaW5mb3JtYXRpb24sIGRpcmVjdGx5IHJldHVybiB0aGUgZnVsbFxuICogU2xvdFdyYXBwZXIgb2JqZWN0IGluc3RlYWQgb2YganVzdCB0aGUgaWZhY2UuXG4gKlxuICogQHBhcmFtIHtDYXBEYXRhPFNsb3Q+fSBkYXRhXG4gKi9cbiAgY29uc3QgbWFrZUlmYWNlRXh0cmFjdG9yID0gZGF0YSA9PiB7XG4gICAgY29uc3QgeyBzbG90cyB9ID0gZGF0YTtcbiAgICAvKiogQHBhcmFtIHtudW1iZXJ9IGluZGV4ICovXG4gICAgY29uc3QgZ2V0V3JhcHBlciA9IGluZGV4ID0+IHtcbiAgICAgIGNvbnN0IHNsb3QgPSBzbG90c1tpbmRleF07XG4gICAgICBsZXQgd3JhcHBlciA9IGN1cnJlbnRTbG90VG9XcmFwcGVyLmdldChzbG90KTtcbiAgICAgIGlmICghd3JhcHBlcikge1xuICAgICAgICB2b2lkIHNsb3RXcmFwcGVyTWFyc2hhbGxlci5mcm9tQ2FwRGF0YShkYXRhKTtcbiAgICAgIH1cbiAgICAgIHdyYXBwZXIgPSBjdXJyZW50U2xvdFRvV3JhcHBlci5nZXQoc2xvdCk7XG4gICAgICBpZiAoIXdyYXBwZXIpIHtcbiAgICAgICAgdGhyb3cgRmFpbGBNYXJzaGFsbGVyIGRpZG4ndCBjcmVhdGUgd3JhcHBlciBmb3Igc2xvdCAke3Eoc2xvdCl9IChpbmRleD0ke3EoaW5kZXgpfSlgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHdyYXBwZXI7XG4gICAgfTtcblxuICAgIHJldHVybiBnZXRXcmFwcGVyO1xuICB9O1xuXG4gIC8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxDYXBEYXRhPFNsb3Q+Pn1cbiAqL1xuICBjb25zdCB0b0NhcERhdGEgPSBhc3luYyB2YWwgPT4ge1xuICAgIGNvbnN0IGNhcERhdGEgPSBwYXNzVGhyb3VnaE1hcnNoYWxsZXIudG9DYXBEYXRhKHZhbCk7XG4gICAgY29uc3QgbWFwcGVkU2xvdHMgPSBhd2FpdCBtYXBDYXBzVG9TbG90cyhjYXBEYXRhLnNsb3RzKTtcbiAgICByZXR1cm4gaGFyZGVuKHsgLi4uY2FwRGF0YSwgc2xvdHM6IG1hcHBlZFNsb3RzIH0pO1xuICB9O1xuXG4gIC8qKlxuICogQHBhcmFtIHtDYXBEYXRhPFNsb3Q+fSBkYXRhXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxQYXNzYWJsZT59XG4gKi9cbiAgY29uc3QgZnJvbUNhcERhdGEgPSBhc3luYyBkYXRhID0+IHtcbiAgICBjb25zdCBnZXRXcmFwcGVyID0gbWFrZUlmYWNlRXh0cmFjdG9yKGRhdGEpO1xuICAgIGF3YWl0IG51bGw7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG1hcHBlZFNsb3RzID0gYXdhaXQgbWFwU2xvdHNUb0NhcHMoZGF0YS5zbG90cywgZ2V0V3JhcHBlcik7XG4gICAgICByZXR1cm4gcGFzc1Rocm91Z2hNYXJzaGFsbGVyLmZyb21DYXBEYXRhKHsgLi4uZGF0YSwgc2xvdHM6IG1hcHBlZFNsb3RzIH0pO1xuICAgIH0gZmluYWxseSB7XG4gICAgICBjdXJyZW50U2xvdFRvV3JhcHBlci5jbGVhcigpO1xuICAgIH1cbiAgfTtcblxuICByZXR1cm4gRmFyKCd3cmFwcGVkIHJlbW90ZSBtYXJzaGFsbGVyJywge1xuICAgIHRvQ2FwRGF0YSxcbiAgICBmcm9tQ2FwRGF0YSxcblxuICAgIC8qIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSovXG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSB0b0NhcERhdGEgKi9cbiAgICBzZXJpYWxpemU6IHRvQ2FwRGF0YSxcbiAgICAvKiogQGRlcHJlY2F0ZWQgdXNlIGZyb21DYXBEYXRhICovXG4gICAgdW5zZXJpYWxpemU6IGZyb21DYXBEYXRhLFxuICB9KTtcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIFtTbG90PXVua25vd25dXG4gKiBAcGFyYW0ge0VSZW1vdGU8UGljazxFTWFyc2hhbGxlcjxTbG90PiwgJ2Zyb21DYXBEYXRhJyB8ICd0b0NhcERhdGEnPj59IG1hcnNoYWxsZXJcbiAqIEByZXR1cm5zIHtSZXR1cm5UeXBlPHR5cGVvZiBGYXI8RU1hcnNoYWxsZXI8U2xvdD4+Pn1cbiAqLyRozY9fb25jZS53cmFwUmVtb3RlTWFyc2hhbGxlclNlbmRTbG90c09ubHkod3JhcFJlbW90ZU1hcnNoYWxsZXJTZW5kU2xvdHNPbmx5KTtcbiAgICAgICBjb25zdCB3cmFwUmVtb3RlTWFyc2hhbGxlckRpcmVjdFNlbmQgPSBtYXJzaGFsbGVyID0+IHtcbiAgLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHtQcm9taXNlPENhcERhdGE8U2xvdD4+fVxuICovXG4gIGNvbnN0IHRvQ2FwRGF0YSA9IHZhbCA9PiBFKG1hcnNoYWxsZXIpLnRvQ2FwRGF0YSh2YWwpO1xuXG4gIC8qKlxuICogQHBhcmFtIHtDYXBEYXRhPFNsb3Q+fSBkYXRhXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxQYXNzYWJsZT59XG4gKi9cbiAgY29uc3QgZnJvbUNhcERhdGEgPSBkYXRhID0+IEUobWFyc2hhbGxlcikuZnJvbUNhcERhdGEoZGF0YSk7XG5cbiAgcmV0dXJuIEZhcignd3JhcHBlZCByZW1vdGUgbWFyc2hhbGxlcicsIHtcbiAgICB0b0NhcERhdGEsXG4gICAgZnJvbUNhcERhdGEsXG5cbiAgICAvKiBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkqL1xuICAgIC8qKiBAZGVwcmVjYXRlZCB1c2UgdG9DYXBEYXRhICovXG4gICAgc2VyaWFsaXplOiB0b0NhcERhdGEsXG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSBmcm9tQ2FwRGF0YSAqL1xuICAgIHVuc2VyaWFsaXplOiBmcm9tQ2FwRGF0YSxcbiAgfSk7XG59OyRozY9fb25jZS53cmFwUmVtb3RlTWFyc2hhbGxlckRpcmVjdFNlbmQod3JhcFJlbW90ZU1hcnNoYWxsZXJEaXJlY3RTZW5kKTtcblxuICAgICAgIGNvbnN0IHdyYXBSZW1vdGVNYXJzaGFsbGVyID0gd3JhcFJlbW90ZU1hcnNoYWxsZXJTZW5kU2xvdHNPbmx5OyRozY9fb25jZS53cmFwUmVtb3RlTWFyc2hhbGxlcih3cmFwUmVtb3RlTWFyc2hhbGxlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ3cmFwUmVtb3RlTWFyc2hhbGxlclNlbmRTbG90c09ubHkiOlsid3JhcFJlbW90ZU1hcnNoYWxsZXJTZW5kU2xvdHNPbmx5Il0sIndyYXBSZW1vdGVNYXJzaGFsbGVyRGlyZWN0U2VuZCI6WyJ3cmFwUmVtb3RlTWFyc2hhbGxlckRpcmVjdFNlbmQiXSwid3JhcFJlbW90ZU1hcnNoYWxsZXIiOlsid3JhcFJlbW90ZU1hcnNoYWxsZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAK+0QRfENAADxDQAAKwAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9tZXRob2QtdG9vbHMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qcyJdLCJleHBvcnRzIjpbImJpbmRBbGxNZXRob2RzIiwiZ2V0TWV0aG9kTmFtZXMiLCJnZXRTdHJpbmdNZXRob2ROYW1lcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHJlYWxHZXRNZXRob2ROYW1lczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanNcIiwgW1tcImdldE1ldGhvZE5hbWVzXCIsWyRozY9fYSA9PiAocmVhbEdldE1ldGhvZE5hbWVzID0gJGjNj19hKV1dXV1dKTtcblxuXG4vKipcbiAqIEBmaWxlIG1ldGhvZC10b29scyB1c2UgZHluYW1pYyBwcm9wZXJ0eSBsb29rdXAsIHdoaWNoIGlzIG5vdFxuICogICBKZXNzaWUtY29tcGF0aWJsZVxuICovXG5cbmNvbnN0IHsgY3JlYXRlLCBmcm9tRW50cmllcyB9ID0gT2JqZWN0O1xuY29uc3QgeyBhcHBseSB9ID0gUmVmbGVjdDtcblxuLyoqXG4gKiBUT0RPIENvbnNvbGlkYXRlIHdpdGggdGhlIGBnZXRNZXRob2ROYW1lc2AgaW4gYEBlbmRvL2V2ZW50dWFsLXNlbmRgXG4gKlxuICogQGRlcHJlY2F0ZWQgVXNlIGBnZXRNZXRob2ROYW1lc2AgZnJvbSBgQGVuZG8vZXZlbnR1YWwtc2VuZC91dGlscy5qc2AgaW5zdGVhZC5cbiAqIEB0ZW1wbGF0ZSB7UHJvcGVydHlLZXl9IEtcbiAqIEBwYXJhbSB7UmVjb3JkPEssIGFueT59IHZhbFxuICogQHJldHVybnMge0tbXX1cbiAqL1xuICAgICAgIGNvbnN0IGdldE1ldGhvZE5hbWVzID0gdmFsID0+XG4gIC8qKiBAdHlwZSB7S1tdfSAqLyAocmVhbEdldE1ldGhvZE5hbWVzKHZhbCkpOyRozY9fb25jZS5nZXRNZXRob2ROYW1lcyhnZXRNZXRob2ROYW1lcyk7XG5oYXJkZW4oZ2V0TWV0aG9kTmFtZXMpO1xuXG4vKipcbiAqIFRoZSBzdWJzZXQgb2YgYGdldE1ldGhvZE5hbWVzYCBjb250YWluaW5nIG9ubHkgc3RyaW5nIG5hbWVzLCB3aXRob3V0IHN5bWJvbHNcbiAqXG4gKiBAdGVtcGxhdGUge1Byb3BlcnR5S2V5fSBLXG4gKiBAcGFyYW0ge1JlY29yZDxLLCBhbnk+fSB2YWxcbiAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAqL1xuICAgICAgIGNvbnN0IGdldFN0cmluZ01ldGhvZE5hbWVzID0gdmFsID0+XG4gIC8qKiBAdHlwZSB7c3RyaW5nW119ICovIChcbiAgICByZWFsR2V0TWV0aG9kTmFtZXModmFsKS5maWx0ZXIobmFtZSA9PiB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycpXG4gICk7XG5cbi8qKlxuICogVE9ETyBUaGlzIGZ1bmN0aW9uIGV4aXN0cyBvbmx5IHRvIGVhc2UgdGhlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC81OTcwIHRyYW5zaXRpb24sIGZyb20gYWxsIG1ldGhvZHNcbiAqIGJlaW5nIG93biBwcm9wZXJ0aWVzIHRvIG1ldGhvZHMgYmVpbmcgaW5oZXJpdGVkIGZyb20gYSBjb21tb24gcHJvdG90eXBlLiBUaGlzXG4gKiB0cmFuc2l0aW9uIGJyZWFrcyB0d28gcGF0dGVybnMgdXNlZCBpbiBwcmlvciBjb2RlOiBhdXRvYmluZGluZywgYW5kXG4gKiBlbnVtZXJhdGluZyBtZXRob2RzIGJ5IGVudW1lcmF0aW5nIG93biBwcm9wZXJ0aWVzLiBGb3IgYm90aCwgdGhlIHByZWZlcnJlZFxuICogcmVwYWlycyBhcmVcbiAqXG4gKiAtIGF1dG9iaW5kaW5nOiBSZXBsYWNlLCBmb3IgZXhhbXBsZSwgYGZvbyhvYmoubWV0aG9kKWAgd2l0aCBgZm9vKGFyZyA9PlxuICogICBgb2JqLm1ldGhvZChhcmcpKWAuIElPVywgc3RvcCByZWx5aW5nIG9uIGV4cHJlc3Npb25zIGxpa2UgYG9iai5tZXRob2RgdG9cbiAqICAgZXh0cmFjdCBhIG1ldGhvZCBzdGlsbCBib3VuZCB0byB0aGUgc3RhdGUgb2Zgb2JqYCBiZWNhdXNlLCBmb3IgdmlydHVhbCBhbmRcbiAqICAgZHVyYWJsZSBvYmplY3RzLCB0aGV5IG5vIGxvbmdlciB3aWxsIGFmdGVyICM1OTcwLlxuICogLSBtZXRob2QgZW51bWVyYXRpb246IFJlcGxhY2UsIGZvciBleGFtcGxlIGBSZWZsZWN0Lm93bktleXMob2JqKWAgd2l0aFxuICogICBgZ2V0TWV0aG9kTmFtZXMob2JqKWAuXG4gKlxuICogT25jZSBhbGwgcHJvYmxlbWF0aWMgY2FzZXMgaGF2ZSBiZWVuIGNvbnZlcnRlZCBpbiB0aGlzIG1hbm5lciwgdGhpc1xuICogYGJpbmRBbGxNZXRob2RzYCBoYWNrIGNhbiBhbmQgVE9ETyBzaG91bGQgYmUgZGVsZXRlZC4gSG93ZXZlciwgd2UgY3VycmVudGx5XG4gKiBoYXZlIG5vIHJlbGlhYmxlIHN0YXRpYyB3YXkgdG8gdHJhY2sgZG93biBhbmQgZml4IGFsbCBhdXRvYmluZGluZyBzaXRlcy4gRm9yXG4gKiB0aG9zZSBvYmplY3RzIHRoYXQgaGF2ZSBub3QgeWV0IGJlZW4gZnVsbHkgcmVwYWlyZWQgYnkgdGhlIGFib3ZlIHR3b1xuICogdGVjaG5pcXVlcywgYGJpbmRBbGxNZXRob2RzYCBjcmVhdGVzIGFuIG9iamVjdCB0aGF0IGFjdHMgbXVjaCBsaWtlIHRoZVxuICogcHJlLSM1OTcwIG9iamVjdHMsIHdpdGggYWxsIHRoZWlyIG1ldGhvZHMgYXMgaW5zdGFuY2UtYm91bmQgb3duIHByb3BlcnRpZXMuXG4gKiBJdCBkb2VzIHRoaXMgYnkgbWFraW5nIGEgbmV3IG9iamVjdCBpbmhlcml0aW5nIGZyb20gYG9iamAgd2hlcmUgdGhlIG5ld1xuICogb2JqZWN0IGhhcyBib3VuZCBvd24gbWV0aG9kcyBvdmVycmlkZGluZyBhbGwgdGhlIG1ldGhvZHMgaXQgd291bGQgaGF2ZVxuICogaW5oZXJpdGVkIGZyb20gYG9iamAuXG4gKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8UHJvcGVydHlLZXksIGFueT59IFRcbiAqIEBwYXJhbSB7VH0gb2JqXG4gKiBAcmV0dXJucyB7VH1cbiAqLyRozY9fb25jZS5nZXRTdHJpbmdNZXRob2ROYW1lcyhnZXRTdHJpbmdNZXRob2ROYW1lcyk7XG4gICAgICAgY29uc3QgYmluZEFsbE1ldGhvZHMgPSBvYmogPT5cbiAgaGFyZGVuKFxuICAgIGNyZWF0ZShcbiAgICAgIG9iaixcbiAgICAgIGZyb21FbnRyaWVzKFxuICAgICAgICByZWFsR2V0TWV0aG9kTmFtZXMob2JqKS5tYXAobmFtZSA9PiBbXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICB2YWx1ZTogKC8qKiBAdHlwZSB7dW5rbm93bltdfSAqLyAuLi5hcmdzKSA9PlxuICAgICAgICAgICAgICBhcHBseShvYmpbbmFtZV0sIG9iaiwgYXJncyksXG4gICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLFxuICAgICAgICAgIH0sXG4gICAgICAgIF0pLFxuICAgICAgKSxcbiAgICApLFxuICApOyRozY9fb25jZS5iaW5kQWxsTWV0aG9kcyhiaW5kQWxsTWV0aG9kcyk7XG5oYXJkZW4oYmluZEFsbE1ldGhvZHMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0TWV0aG9kTmFtZXMiOlsiZ2V0TWV0aG9kTmFtZXMiXSwiZ2V0U3RyaW5nTWV0aG9kTmFtZXMiOlsiZ2V0U3RyaW5nTWV0aG9kTmFtZXMiXSwiYmluZEFsbE1ldGhvZHMiOlsiYmluZEFsbE1ldGhvZHMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAkP0geKBCAACgQgAAJgAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9tZXRyaWNzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL25hdCJdLCJleHBvcnRzIjpbIkJMT0NLX0hJU1RPR1JBTV9NRVRSSUNTIiwiSElTVE9HUkFNX01FVFJJQ1MiLCJLRVJORUxfU1RBVFNfTUVUUklDUyIsIktFUk5FTF9TVEFUU19TVU1fTUVUUklDUyIsIktFUk5FTF9TVEFUU19VUERPV05fTUVUUklDUyIsIlF1ZXVlTWV0cmljQXNwZWN0IiwibWFrZVF1ZXVlTWV0cmljcyIsIm1ha2VRdWV1ZU1ldHJpY3NNZXRhIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxpc05hdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9uYXRcIiwgW1tcImlzTmF0XCIsWyRozY9fYSA9PiAoaXNOYXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7TWV0ZXIgYXMgT1RlbE1ldGVyLCBNZXRyaWNBdHRyaWJ1dGVzfSBmcm9tICdAb3BlbnRlbGVtZXRyeS9hcGknO1xuICogQGltcG9ydCB7VG90YWxNYXB9IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwnO1xuICovXG5cbmNvbnN0IEhJU1RPR1JBTV9NU19MQVRFTkNZX0JPVU5EQVJJRVMgPSBbXG4gIDUsXG4gIDEwLFxuICAyNSxcbiAgNTAsXG4gIDEwMCxcbiAgMjUwLFxuICA1MDAsXG4gIDEwMDAsXG4gIDI1MDAsXG4gIDUwMDAsXG4gIDEwMDAwLFxuICBJbmZpbml0eSxcbl07XG5jb25zdCBISVNUT0dSQU1fU0VDT05EU19MQVRFTkNZX0JPVU5EQVJJRVMgPVxuICBISVNUT0dSQU1fTVNfTEFURU5DWV9CT1VOREFSSUVTLm1hcChtcyA9PiBtcyAvIDEwMDApO1xuXG4vKiBUT0RPOiBWYWxpZGF0ZSB0aGVzZSBib3VuZGFyaWVzLiBXZSdyZSBub3QgZ29pbmcgdG8gaGF2ZSA1bXMgYmxvY2tzLCBidXQqL1xuLyogd2UgcHJvYmFibHkgY2FyZSBhYm91dCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIDEwIHZzLiAzMCBzZWNvbmRzLiovXG4gICAgICAgY29uc3QgSElTVE9HUkFNX01FVFJJQ1MgPSAvKiogQHR5cGUge2NvbnN0fSAqLyAoe1xuICBzd2luZ3NldF9jcmFua19wcm9jZXNzaW5nX3RpbWU6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1Byb2Nlc3NpbmcgdGltZSBwZXIgY3JhbmsgKG1zKScsXG4gICAgdW5pdDogJ21zJyxcbiAgICBib3VuZGFyaWVzOiBBcnJheS5vZigxLCAxMSwgMjEsIDMxLCA0MSwgNTEsIDYxLCA3MSwgODEsIDkxLCBJbmZpbml0eSksXG4gIH0sXG4gIHN3aW5nc2V0X2Jsb2NrX3Byb2Nlc3Npbmdfc2Vjb25kczoge1xuICAgIGRlc2NyaXB0aW9uOiAnUHJvY2Vzc2luZyB0aW1lIHBlciBibG9jaycsXG4gICAgdW5pdDogJ3MnLFxuICAgIGJvdW5kYXJpZXM6IEhJU1RPR1JBTV9TRUNPTkRTX0xBVEVOQ1lfQk9VTkRBUklFUyxcbiAgfSxcbiAgc3dpbmdzZXRfdmF0X3N0YXJ0dXA6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1ZhdCBzdGFydHVwIHRpbWUgKG1zKScsXG4gICAgdW5pdDogJ21zJyxcbiAgICBib3VuZGFyaWVzOiBISVNUT0dSQU1fTVNfTEFURU5DWV9CT1VOREFSSUVTLFxuICB9LFxuICBzd2luZ3NldF92YXRfZGVsaXZlcnk6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1ZhdCBkZWxpdmVyeSB0aW1lIChtcyknLFxuICAgIHVuaXQ6ICdtcycsXG4gICAgYm91bmRhcmllczogSElTVE9HUkFNX01TX0xBVEVOQ1lfQk9VTkRBUklFUyxcbiAgfSxcbiAgc3dpbmdzZXRfbWV0ZXJfdXNhZ2U6IHtcbiAgICBkZXNjcmlwdGlvbjogJ1ZhdCBtZXRlciB1c2FnZScsXG4gICAgdW5pdDogJ21zJyxcbiAgICBib3VuZGFyaWVzOiBISVNUT0dSQU1fTVNfTEFURU5DWV9CT1VOREFSSUVTLFxuICB9LFxufSk7JGjNj19vbmNlLkhJU1RPR1JBTV9NRVRSSUNTKEhJU1RPR1JBTV9NRVRSSUNTKTtcblxuY29uc3QgYmxvY2tIaXN0b2dyYW1NZXRyaWNEZXNjID0ge1xuICAvKiBEaXNhYmxlZCBiZWNhdXNlIGltcG9ydGluZyBmcm9tIEBvcGVudGVsZW1ldHJ5L2FwaSBicmVha3Mga2VybmVsIGJ1bmRsaW5nLiovXG4gIC8qIFRoYW5rZnVsbHksIGl0J3MgdGhlIGRlZmF1bHQgYW55d2F5OiovXG4gIC8qIGh0dHBzOi8vZ2l0aHViLmNvbS9vcGVuLXRlbGVtZXRyeS9vcGVudGVsZW1ldHJ5LWpzL2Jsb2IvZjRkZDJhMTA2MmY5ODBjZDM0NGNmYjE3MmE1MTVkMDAxMTVkZjU3MC9hcGkvc3JjL21ldHJpY3MvTWV0cmljLnRzI0w1My1MNTcqL1xuICAvKiB2YWx1ZVR5cGU6IFZhbHVlVHlwZS5ET1VCTEUsKi9cbiAgdW5pdDogJ3MnLFxuICBhZHZpY2U6IHtcbiAgICBleHBsaWNpdEJ1Y2tldEJvdW5kYXJpZXM6IFtcbiAgICAgIDAuMSwgMC4yLCAwLjMsIDAuNCwgMC41LCAxLCAyLCAzLCA0LCA1LCA2LCA3LCAxMCwgMTUsIDMwLFxuICAgIF0sXG4gIH0sXG59O1xuICAgICAgIGNvbnN0IEJMT0NLX0hJU1RPR1JBTV9NRVRSSUNTID0gLyoqIEB0eXBlIHtjb25zdH0gKi8gKHtcbiAgc3dpbmdzZXRSdW5TZWNvbmRzOiB7XG4gICAgZGVzY3JpcHRpb246ICdQZXItYmxvY2sgdGltZSBzcGVudCBleGVjdXRpbmcgU3dpbmdTZXQnLFxuICAgIC4uLmJsb2NrSGlzdG9ncmFtTWV0cmljRGVzYyxcbiAgfSxcbiAgc3dpbmdzZXRDaGFpblNhdmVTZWNvbmRzOiB7XG4gICAgZGVzY3JpcHRpb246ICdQZXItYmxvY2sgdGltZSBzcGVudCBwcm9wYWdhdGluZyBTd2luZ1NldCBzdGF0ZSBpbnRvIGNvc21vcycsXG4gICAgLi4uYmxvY2tIaXN0b2dyYW1NZXRyaWNEZXNjLFxuICB9LFxuICBzd2luZ3NldENvbW1pdFNlY29uZHM6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdQZXItYmxvY2sgdGltZSBzcGVudCBjb21taXR0aW5nIFN3aW5nU2V0IHN0YXRlIHRvIGhvc3Qgc3RvcmFnZScsXG4gICAgLi4uYmxvY2tIaXN0b2dyYW1NZXRyaWNEZXNjLFxuICB9LFxuICBjb3Ntb3NDb21taXRTZWNvbmRzOiB7XG4gICAgZGVzY3JpcHRpb246ICdQZXItYmxvY2sgdGltZSBzcGVudCBjb21taXR0aW5nIGNvc21vcyBzdGF0ZScsXG4gICAgLi4uYmxvY2tIaXN0b2dyYW1NZXRyaWNEZXNjLFxuICB9LFxuICBmdWxsQ29tbWl0U2Vjb25kczoge1xuICAgIGRlc2NyaXB0aW9uOlxuICAgICAgJ1Blci1ibG9jayB0aW1lIHNwZW50IGNvbW1pdHRpbmcgc3RhdGUsIGluY2x1c2l2ZSBvZiBDT01NSVRfQkxPQ0sgcHJvY2Vzc2luZyBwbHVzIHRpbWUgc3BlbnQgW291dHNpZGUgb2YgY29zbWljLXN3aW5nc2V0XSBiZWZvcmUgYW5kIGFmdGVyIGl0JyxcbiAgICAuLi5ibG9ja0hpc3RvZ3JhbU1ldHJpY0Rlc2MsXG4gIH0sXG4gIGludGVyQmxvY2tTZWNvbmRzOiB7XG4gICAgZGVzY3JpcHRpb246ICdUaW1lIHNwZW50IGlkbGUgYmV0d2VlbiBibG9ja3MnLFxuICAgIC4uLmJsb2NrSGlzdG9ncmFtTWV0cmljRGVzYyxcbiAgfSxcbiAgYWZ0ZXJDb21taXRIYW5nb3ZlclNlY29uZHM6IHtcbiAgICBkZXNjcmlwdGlvbjpcbiAgICAgICdQZXItYmxvY2sgdGltZSBzcGVudCB3YWl0aW5nIGZvciBwcmV2aW91cy1ibG9jayBhZnRlckNvbW1pdCB3b3JrJyxcbiAgICAuLi5ibG9ja0hpc3RvZ3JhbU1ldHJpY0Rlc2MsXG4gIH0sXG4gIGJsb2NrTGFnU2Vjb25kczoge1xuICAgIGRlc2NyaXB0aW9uOiAnVGhlIGRlbGF5IG9mIGVhY2ggYmxvY2sgZnJvbSBpdHMgZXhwZWN0ZWQgYmVnaW4gdGltZScsXG4gICAgLi4uYmxvY2tIaXN0b2dyYW1NZXRyaWNEZXNjLFxuICAgIC8qIEFkZCBidWNrZXRzIGZvciBleGNlc3NpdmVseSBsb25nIGRlbGF5cy4qL1xuICAgIGFkdmljZToge1xuICAgICAgLi4uYmxvY2tIaXN0b2dyYW1NZXRyaWNEZXNjLmFkdmljZSxcbiAgICAgIGV4cGxpY2l0QnVja2V0Qm91bmRhcmllczogLyoqIEB0eXBlIHtudW1iZXJbXX0gKi8gKFtcbiAgICAgICAgLi4uYmxvY2tIaXN0b2dyYW1NZXRyaWNEZXNjLmFkdmljZS5leHBsaWNpdEJ1Y2tldEJvdW5kYXJpZXMsXG4gICAgICAgIC4uLls2MCwgMTIwLCAxODAsIDI0MCwgMzAwLCA2MDAsIDM2MDBdLFxuICAgICAgXSksXG4gICAgfSxcbiAgfSxcbn0pO1xuXG4vKiogQGVudW0geyh0eXBlb2YgUXVldWVNZXRyaWNBc3BlY3QpW2tleW9mIHR5cGVvZiBRdWV1ZU1ldHJpY0FzcGVjdF19ICovJGjNj19vbmNlLkJMT0NLX0hJU1RPR1JBTV9NRVRSSUNTKEJMT0NLX0hJU1RPR1JBTV9NRVRSSUNTKTtcbiAgICAgICBjb25zdCBRdWV1ZU1ldHJpY0FzcGVjdCA9IC8qKiBAdHlwZSB7Y29uc3R9ICovICh7XG4gIExlbmd0aDogJ2xlbmd0aCcsXG4gIEluY3JlbWVudENvdW50OiAnaW5jcmVtZW50cycsXG4gIERlY3JlbWVudENvdW50OiAnZGVjcmVtZW50cycsXG59KTtcblxuLyoqXG4gKiBRdWV1ZSBtZXRyaWNzIGNvbWUgaW4ge2xlbmd0aCxhZGQscmVtb3ZlfSB0cmlwbGVzIHNoYXJpbmcgYSBjb21tb24gcHJlZml4LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lUHJlZml4XG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzY1ByZWZpeFxuICogQHJldHVybnMge1JlY29yZDxcbiAqICAgUXVldWVNZXRyaWNBc3BlY3QsXG4gKiAgIHsgbmFtZTogc3RyaW5nOyBvcHRpb25zOiBNZXRyaWNBdHRyaWJ1dGVzIH1cbiAqID59XG4gKi8kaM2PX29uY2UuUXVldWVNZXRyaWNBc3BlY3QoUXVldWVNZXRyaWNBc3BlY3QpO1xuICAgICAgIGNvbnN0IG1ha2VRdWV1ZU1ldHJpY3NNZXRhID0gKG5hbWVQcmVmaXgsIGRlc2NQcmVmaXgpID0+IHtcbiAgLyoqIEB0eXBlIHtbUXVldWVNZXRyaWNBc3BlY3QsIHN0cmluZywgc3RyaW5nXVtdfSAqL1xuICBjb25zdCBtZXRyaWNzTWV0YSA9IFtcbiAgICBbUXVldWVNZXRyaWNBc3BlY3QuTGVuZ3RoLCAnbGVuZ3RoJywgJ2xlbmd0aCddLFxuICAgIFtRdWV1ZU1ldHJpY0FzcGVjdC5JbmNyZW1lbnRDb3VudCwgJ2FkZCcsICdpbmNyZW1lbnRzJ10sXG4gICAgW1F1ZXVlTWV0cmljQXNwZWN0LkRlY3JlbWVudENvdW50LCAncmVtb3ZlJywgJ2RlY3JlbWVudHMnXSxcbiAgXTtcbiAgY29uc3QgZW50cmllcyA9IG1ldHJpY3NNZXRhLm1hcCgoW2FzcGVjdCwgbmFtZVN1ZmZpeCwgZGVzY1N1ZmZpeF0pID0+IHtcbiAgICBjb25zdCBuYW1lID0gYCR7bmFtZVByZWZpeH1fJHtuYW1lU3VmZml4fWA7XG4gICAgY29uc3QgZGVzY3JpcHRpb24gPSBgJHtkZXNjUHJlZml4fSAke2Rlc2NTdWZmaXh9YDtcbiAgICAvKiBGdXR1cmUgT3BlblRlbGVtZXRyeSBTREtzIHNob3VsZCBhbHNvIHN1cHBvcnQgY3JlYXRpbmcgSW5zdHJ1bWVudHMgd2l0aCovXG4gICAgLyogYXR0cmlidXRlIGtleXMgKHN1Y2ggYXMgdGhlIFwicXVldWVcIiBhdHRyaWJ1dGUgZm9yKi9cbiAgICAvKiBcImNvc21pY19zd2luZ3NldF9pbmJvdW5kX3F1ZXVlX3tsZW5ndGgsYWRkLHJlbW92ZX1cIiBtZWFzdXJlbWVudHMpOiovXG4gICAgLyogaHR0cHM6Ly9vcGVudGVsZW1ldHJ5LmlvL2RvY3Mvc3BlY3Mvb3RlbC9tZXRyaWNzL2FwaS8jaW5zdHJ1bWVudC1hZHZpc29yeS1wYXJhbWV0ZXItYXR0cmlidXRlcyovXG4gICAgLyogQXQgdGhhdCB0aW1lLCBhIG5ldyBmaWVsZCB3aWxsIGJlIGFkZGVkIHRvIHRoaXMgcmVjb3JkLiovXG4gICAgcmV0dXJuIFthc3BlY3QsIHsgbmFtZSwgb3B0aW9uczogeyBkZXNjcmlwdGlvbiB9IH1dO1xuICB9KTtcbiAgcmV0dXJuIE9iamVjdC5mcm9tRW50cmllcyhlbnRyaWVzKTtcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIHtzdHJpbmd9IFF1ZXVlTmFtZVxuICogQHR5cGVkZWYgUXVldWVNZXRyaWNzXG4gKiBAcHJvcGVydHkgeyhsZW5ndGhzOiBSZWNvcmQ8UXVldWVOYW1lLCBudW1iZXI+KSA9PiB2b2lkfSBpbml0TGVuZ3RocyBtdXN0IGJlXG4gKiAgIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIGZ1bmN0aW9uXG4gKiBAcHJvcGVydHkgeyhsZW5ndGhzOiBSZWNvcmQ8UXVldWVOYW1lLCBudW1iZXI+KSA9PiB2b2lkfSB1cGRhdGVMZW5ndGhzXG4gKiBAcHJvcGVydHkgeyhxdWV1ZTogUXVldWVOYW1lLCBkZWx0YT86IG51bWJlcikgPT4gdm9pZH0gaW5jTGVuZ3RoIGZvciBhXG4gKiAgIG5vbi1uZWdhdGl2ZSBkZWx0YVxuICogQHByb3BlcnR5IHsocXVldWU6IFF1ZXVlTmFtZSwgZGVsdGE/OiBudW1iZXIpID0+IHZvaWR9IGRlY0xlbmd0aCBmb3IgYVxuICogICBub24tbmVnYXRpdmUgZGVsdGFcbiAqL1xuXG4vKipcbiAqIENyZWF0ZSB7bGVuZ3RoLGFkZCxyZW1vdmV9IEluc3RydW1lbnRzIGZvciBhIHF1ZXVlIGFuZCByZXR1cm4gZnVuY3Rpb25zIGZvclxuICogY29uc2lzdGVudGx5IGluaXRpYWxpemluZyBhbmQgdXBkYXRpbmcgdGhlbS5cbiAqXG4gKiBAdGVtcGxhdGUge3N0cmluZ30gUXVldWVOYW1lXG4gKiBAcGFyYW0ge29iamVjdH0gY29uZmlnXG4gKiBAcGFyYW0ge09UZWxNZXRlcn0gY29uZmlnLm90ZWxNZXRlclxuICogQHBhcmFtIHtzdHJpbmd9IGNvbmZpZy5uYW1lUHJlZml4XG4gKiBAcGFyYW0ge3N0cmluZ30gY29uZmlnLmRlc2NQcmVmaXhcbiAqIEBwYXJhbSB7UGljazxDb25zb2xlLCAnd2Fybic+fSBbY29uZmlnLmNvbnNvbGVdXG4gKiBAcmV0dXJucyB7UXVldWVNZXRyaWNzPFF1ZXVlTmFtZT59XG4gKi8kaM2PX29uY2UubWFrZVF1ZXVlTWV0cmljc01ldGEobWFrZVF1ZXVlTWV0cmljc01ldGEpO1xuICAgICAgIGNvbnN0IG1ha2VRdWV1ZU1ldHJpY3MgPSAoe1xuICBvdGVsTWV0ZXIsXG4gIG5hbWVQcmVmaXgsXG4gIGRlc2NQcmVmaXgsXG4gIGNvbnNvbGUsXG59KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBbUXVldWVNZXRyaWNBc3BlY3QuTGVuZ3RoXTogbGVuZ3RoTWV0YSxcbiAgICBbUXVldWVNZXRyaWNBc3BlY3QuSW5jcmVtZW50Q291bnRdOiB1cE1ldGEsXG4gICAgW1F1ZXVlTWV0cmljQXNwZWN0LkRlY3JlbWVudENvdW50XTogZG93bk1ldGEsXG4gIH0gPSBtYWtlUXVldWVNZXRyaWNzTWV0YShuYW1lUHJlZml4LCBkZXNjUHJlZml4KTtcbiAgLyogVE9ETzogV2hlbiBpdCdzIGRlZW1lZCBzYWZlIHRvIGNoYW5nZSByZXBvcnRlZCBtZXRyaWNzLCBtYWtlIHVwQ291bnRlciBhbmQqL1xuICAvKiBkb3duQ291bnRlciBzeW5jaHJvbm91cyAoYW5kIGRyb3AgYGluY3JlbWVudHNgIGFuZCBgZGVjcmVtZW50c2AgbWFwcykuKi9cbiAgLyogV2UgY2FuJ3QgZG8gc28gdW50aWwgdGhlbiBiZWNhdXNlIGl0IHdpbGwgYWRkIGEgXCJfdG90YWxcIiBzdWZmaXggdG8gdGhlKi9cbiAgLyogUHJvbWV0aGV1cyBleHBvcnQgbWV0cmljIG5hbWUsIGRpdmVyZ2luZyBmcm9tIGBtYWtlSW5ib3VuZFF1ZXVlTWV0cmljc2AgaW4qL1xuICAvKiBwYWNrYWdlcy9jb3NtaWMtc3dpbmdzZXQvc3JjL2tlcm5lbC1zdGF0cy5qcy4qL1xuICAvKiBodHRwczovL2dpdGh1Yi5jb20vb3Blbi10ZWxlbWV0cnkvb3BlbnRlbGVtZXRyeS1qcy9ibG9iL21haW4vZG9jL3VwZ3JhZGUtdG8tMi54Lm1kIy1vdGhlci1jaGFuZ2VzKi9cbiAgY29uc3QgbGVuZ3RoQ291bnRlciA9IG90ZWxNZXRlci5jcmVhdGVVcERvd25Db3VudGVyKFxuICAgIGxlbmd0aE1ldGEubmFtZSxcbiAgICBsZW5ndGhNZXRhLm9wdGlvbnMsXG4gICk7XG4gIC8qIGNvbnN0IHVwQ291bnRlciA9IG90ZWxNZXRlci5jcmVhdGVDb3VudGVyKHVwTWV0YS5uYW1lLCB1cE1ldGEub3B0aW9ucyk7Ki9cbiAgLyogY29uc3QgZG93bkNvdW50ZXIgPSBvdGVsTWV0ZXIuY3JlYXRlQ291bnRlcihkb3duTWV0YS5uYW1lLCBkb3duTWV0YS5vcHRpb25zKTsqL1xuICBjb25zdCB1cENvdW50ZXIgPSBvdGVsTWV0ZXIuY3JlYXRlT2JzZXJ2YWJsZUNvdW50ZXIoXG4gICAgdXBNZXRhLm5hbWUsXG4gICAgdXBNZXRhLm9wdGlvbnMsXG4gICk7XG4gIGNvbnN0IGRvd25Db3VudGVyID0gb3RlbE1ldGVyLmNyZWF0ZU9ic2VydmFibGVDb3VudGVyKFxuICAgIGRvd25NZXRhLm5hbWUsXG4gICAgZG93bk1ldGEub3B0aW9ucyxcbiAgKTtcbiAgY29uc3QgaW5jcmVtZW50cyA9IC8qKiBAdHlwZSB7VG90YWxNYXA8c3RyaW5nLCBudW1iZXI+fSAqLyAobmV3IE1hcCgpKTtcbiAgY29uc3QgZGVjcmVtZW50cyA9IC8qKiBAdHlwZSB7VG90YWxNYXA8c3RyaW5nLCBudW1iZXI+fSAqLyAobmV3IE1hcCgpKTtcbiAgdXBDb3VudGVyLmFkZENhbGxiYWNrKG9ic2VydmVyID0+IHtcbiAgICBmb3IgKGNvbnN0IFtxdWV1ZU5hbWUsIHZhbHVlXSBvZiBpbmNyZW1lbnRzLmVudHJpZXMoKSkge1xuICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZSh2YWx1ZSwgeyBxdWV1ZTogcXVldWVOYW1lIH0pO1xuICAgIH1cbiAgfSk7XG4gIGRvd25Db3VudGVyLmFkZENhbGxiYWNrKG9ic2VydmVyID0+IHtcbiAgICBmb3IgKGNvbnN0IFtxdWV1ZU5hbWUsIHZhbHVlXSBvZiBkZWNyZW1lbnRzLmVudHJpZXMoKSkge1xuICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZSh2YWx1ZSwgeyBxdWV1ZTogcXVldWVOYW1lIH0pO1xuICAgIH1cbiAgfSk7XG5cbiAgbGV0IHJlYWR5ID0gZmFsc2U7XG4gIGNvbnN0IGxlbmd0aHMgPSAvKiogQHR5cGUge1RvdGFsTWFwPHN0cmluZywgbnVtYmVyPn0gKi8gKG5ldyBNYXAoKSk7XG4gIGNvbnN0IG51ZGdlID0gKHF1ZXVlTmFtZSwgZGVsdGEsIGluaXQgPSBmYWxzZSkgPT4ge1xuICAgIGlmICghbGVuZ3Rocy5oYXMocXVldWVOYW1lKSkge1xuICAgICAgaWYgKCFpbml0KSBjb25zb2xlPy53YXJuKCdVbmtub3duIHF1ZXVlJywgcXVldWVOYW1lKTtcbiAgICAgIGxlbmd0aHMuc2V0KHF1ZXVlTmFtZSwgMCk7XG4gICAgICBpbmNyZW1lbnRzLnNldChxdWV1ZU5hbWUsIDApO1xuICAgICAgZGVjcmVtZW50cy5zZXQocXVldWVOYW1lLCAwKTtcbiAgICB9XG4gICAgY29uc3Qgb2xkTGVuZ3RoID0gbGVuZ3Rocy5nZXQocXVldWVOYW1lKTtcbiAgICBsZW5ndGhzLnNldChxdWV1ZU5hbWUsIG9sZExlbmd0aCArIGRlbHRhKTtcbiAgICBjb25zdCBkaW1lbnNpb25zID0geyBxdWV1ZTogcXVldWVOYW1lIH07XG4gICAgbGVuZ3RoQ291bnRlci5hZGQoZGVsdGEsIGRpbWVuc2lvbnMpO1xuICAgIGlmIChpbml0KSB7XG4gICAgICByZXR1cm47XG4gICAgfSBlbHNlIGlmIChkZWx0YSA+IDApIHtcbiAgICAgIC8qIFRPRE8gcGVyIGFib3ZlOiB1cENvdW50ZXIuYWRkKGRlbHRhLCBkaW1lbnNpb25zKTsqL1xuICAgICAgaW5jcmVtZW50cy5zZXQocXVldWVOYW1lLCAoaW5jcmVtZW50cy5nZXQocXVldWVOYW1lKSB8fCAwKSArIGRlbHRhKTtcbiAgICB9IGVsc2UgaWYgKGRlbHRhIDwgMCkge1xuICAgICAgLyogVE9ETyBwZXIgYWJvdmU6IGRvd25Db3VudGVyLmFkZCgtZGVsdGEsIGRpbWVuc2lvbnMpOyovXG4gICAgICBkZWNyZW1lbnRzLnNldChxdWV1ZU5hbWUsIChkZWNyZW1lbnRzLmdldChxdWV1ZU5hbWUpIHx8IDApIC0gZGVsdGEpO1xuICAgIH1cbiAgICByZWFkeSA9IHRydWU7XG4gIH07XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgaW5pdExlbmd0aHM6IGluaXRpYWxMZW5ndGhzID0+IHtcbiAgICAgICFyZWFkeSB8fFxuICAgICAgICBjb25zb2xlPy53YXJuKFxuICAgICAgICAgIGBVbmV4cGVjdGVkIHJlcGVhdCBxdWV1ZSBsZW5ndGggaW5pdGlhbGl6YXRpb24gZnJvbSAke3EobGVuZ3Rocyl9IHRvICR7cShpbml0aWFsTGVuZ3Rocyl9YFxuICAgICAgICApO1xuICAgICAgZm9yIChjb25zdCBbcXVldWVOYW1lLCBuZXdMZW5ndGhdIG9mIE9iamVjdC5lbnRyaWVzKGluaXRpYWxMZW5ndGhzKSkge1xuICAgICAgICBpZiAoIWlzTmF0KG5ld0xlbmd0aCkpIHtcbiAgICAgICAgICBjb25zb2xlPy53YXJuKGBJbnZhbGlkIGxlbmd0aCBmb3IgcXVldWUgJHtxKHF1ZXVlTmFtZSl9OmAsIG5ld0xlbmd0aCk7XG4gICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgbnVkZ2UocXVldWVOYW1lLCBuZXdMZW5ndGgsIHRydWUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgdXBkYXRlTGVuZ3RoczogbmV3TGVuZ3RocyA9PiB7XG4gICAgICByZWFkeSB8fCBjb25zb2xlPy53YXJuKCdNaXNzaW5nIGluaXRpYWwgcXVldWUgbGVuZ3RocycpO1xuICAgICAgZm9yIChjb25zdCBbcXVldWVOYW1lLCBuZXdMZW5ndGhdIG9mIE9iamVjdC5lbnRyaWVzKG5ld0xlbmd0aHMpKSB7XG4gICAgICAgIGlmICghaXNOYXQobmV3TGVuZ3RoKSkge1xuICAgICAgICAgIGNvbnNvbGU/Lndhcm4oYEludmFsaWQgbGVuZ3RoIGZvciBxdWV1ZSAke3EocXVldWVOYW1lKX06YCwgbmV3TGVuZ3RoKTtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBudWRnZShxdWV1ZU5hbWUsIG5ld0xlbmd0aCAtIChsZW5ndGhzLmdldChxdWV1ZU5hbWUpIHx8IDApKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGluY0xlbmd0aDogKHF1ZXVlTmFtZSwgZGVsdGEgPSAxKSA9PiB7XG4gICAgICBpZiAoIWlzTmF0KGRlbHRhKSkge1xuICAgICAgICBjb25zb2xlPy53YXJuKGBJbnZhbGlkIGluY3JlbWVudCBmb3IgcXVldWUgJHtxKHF1ZXVlTmFtZSl9OmAsIGRlbHRhKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbnVkZ2UocXVldWVOYW1lLCBkZWx0YSk7XG4gICAgfSxcbiAgICBkZWNMZW5ndGg6IChxdWV1ZU5hbWUsIGRlbHRhID0gMSkgPT4ge1xuICAgICAgaWYgKCFpc05hdChkZWx0YSkpIHtcbiAgICAgICAgY29uc29sZT8ud2FybihgSW52YWxpZCBkZWNyZW1lbnQgZm9yIHF1ZXVlICR7cShxdWV1ZU5hbWUpfTpgLCBkZWx0YSk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIG51ZGdlKHF1ZXVlTmFtZSwgLWRlbHRhKTtcbiAgICB9LFxuICB9KTtcbn07XG5cbi8qIEFsbCB0aGUga2VybmVsIG1ldHJpY3Mgd2UgYXJlIHByZXBhcmVkIGZvci4qL1xuLyoqIEBlbnVtIHsodHlwZW9mIE1ldHJpY1R5cGUpW2tleW9mIHR5cGVvZiBNZXRyaWNUeXBlXX0gTWV0cmljVHlwZSAqLyRozY9fb25jZS5tYWtlUXVldWVNZXRyaWNzKG1ha2VRdWV1ZU1ldHJpY3MpO1xuY29uc3QgTWV0cmljVHlwZSA9IC8qKiBAdHlwZSB7Y29uc3R9ICovICh7XG4gIENvdW50ZXI6ICdjb3VudGVyJyxcbiAgR2F1Z2U6ICdnYXVnZScsXG59KTtcbi8qKlxuICogQHR5cGVkZWYgS2VybmVsTWV0cmljTWV0YVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGtleVxuICogQHByb3BlcnR5IHtzdHJpbmd9IG5hbWVcbiAqIEBwcm9wZXJ0eSB7eyBkaW1lbnNpb246IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9fSBbc3ViXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRlc2NyaXB0aW9uXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjb25zZW5zdXNdXG4gKiBAcHJvcGVydHkge01ldHJpY1R5cGV9IG1ldHJpY1R5cGVcbiAqL1xuLyoqIEB0eXBlIHtPbWl0PEtlcm5lbE1ldHJpY01ldGEsICdtZXRyaWNUeXBlJz5bXX0gKi9cbiAgICAgICBjb25zdCBLRVJORUxfU1RBVFNfU1VNX01FVFJJQ1MgPSBbXG4gIHtcbiAgICBrZXk6ICdzeXNjYWxscycsXG4gICAgbmFtZTogJ3N3aW5nc2V0X2FsbF9zeXNjYWxsX3RvdGFsJyxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCBrZXJuZWwgY2FsbHMnLFxuICB9LFxuICB7XG4gICAga2V5OiAnc3lzY2FsbFNlbmQnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9zeXNjYWxsX3RvdGFsJyxcbiAgICBzdWI6IHsgZGltZW5zaW9uOiAnc3lzY2FsbCcsIHZhbHVlOiAnc2VuZCcgfSxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCBtZXNzYWdlIHNlbmQga2VybmVsIGNhbGxzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3N5c2NhbGxDYWxsTm93JyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfc3lzY2FsbF90b3RhbCcsXG4gICAgc3ViOiB7IGRpbWVuc2lvbjogJ3N5c2NhbGwnLCB2YWx1ZTogJ2NhbGxOb3cnIH0sXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgc3luY2hyb25vdXMgZGV2aWNlIGtlcm5lbCBjYWxscycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdzeXNjYWxsU3Vic2NyaWJlJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfc3lzY2FsbF90b3RhbCcsXG4gICAgc3ViOiB7IGRpbWVuc2lvbjogJ3N5c2NhbGwnLCB2YWx1ZTogJ3N1YnNjcmliZScgfSxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCBwcm9taXNlIHN1YnNjcmlwdGlvbiBrZXJuZWwgY2FsbHMnLFxuICB9LFxuICB7XG4gICAga2V5OiAnc3lzY2FsbFJlc29sdmUnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9zeXNjYWxsX3RvdGFsJyxcbiAgICBzdWI6IHsgZGltZW5zaW9uOiAnc3lzY2FsbCcsIHZhbHVlOiAncmVzb2x2ZScgfSxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCBwcm9taXNlIHJlc29sdXRpb24ga2VybmVsIGNhbGxzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3N5c2NhbGxFeGl0JyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfc3lzY2FsbF90b3RhbCcsXG4gICAgc3ViOiB7IGRpbWVuc2lvbjogJ3N5c2NhbGwnLCB2YWx1ZTogJ2V4aXQnIH0sXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgdmF0IGV4aXQga2VybmVsIGNhbGxzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3N5c2NhbGxWYXRzdG9yZUdldCcsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3N5c2NhbGxfdG90YWwnLFxuICAgIHN1YjogeyBkaW1lbnNpb246ICdzeXNjYWxsJywgdmFsdWU6ICd2YXRzdG9yZUdldCcgfSxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCB2YXRzdG9yZSBnZXQga2VybmVsIGNhbGxzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3N5c2NhbGxWYXRzdG9yZVNldCcsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3N5c2NhbGxfdG90YWwnLFxuICAgIHN1YjogeyBkaW1lbnNpb246ICdzeXNjYWxsJywgdmFsdWU6ICd2YXRzdG9yZVNldCcgfSxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCB2YXRzdG9yZSBzZXQga2VybmVsIGNhbGxzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3N5c2NhbGxWYXRzdG9yZUdldE5leHRLZXknLFxuICAgIG5hbWU6ICdzd2luZ3NldF9zeXNjYWxsX3RvdGFsJyxcbiAgICBzdWI6IHsgZGltZW5zaW9uOiAnc3lzY2FsbCcsIHZhbHVlOiAndmF0c3RvcmVHZXROZXh0JyB9LFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IHZhdHN0b3JlIGdldE5leHRLZXkga2VybmVsIGNhbGxzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3N5c2NhbGxWYXRzdG9yZURlbGV0ZScsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3N5c2NhbGxfdG90YWwnLFxuICAgIHN1YjogeyBkaW1lbnNpb246ICdzeXNjYWxsJywgdmFsdWU6ICd2YXRzdG9yZURlbGV0ZScgfSxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCB2YXRzdG9yZSBkZWxldGUga2VybmVsIGNhbGxzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ3N5c2NhbGxEcm9wSW1wb3J0cycsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3N5c2NhbGxfdG90YWwnLFxuICAgIHN1YjogeyBkaW1lbnNpb246ICdzeXNjYWxsJywgdmFsdWU6ICdkcm9wSW1wb3J0cycgfSxcbiAgICBkZXNjcmlwdGlvbjogJ1RvdGFsIG51bWJlciBvZiBTd2luZ1NldCBkcm9wIGltcG9ydHMga2VybmVsIGNhbGxzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2Rpc3BhdGNoZXMnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9kaXNwYXRjaF90b3RhbCcsXG4gICAgZGVzY3JpcHRpb246ICdUb3RhbCBudW1iZXIgb2YgU3dpbmdTZXQgdmF0IGNhbGxzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2Rpc3BhdGNoRGVsaXZlcicsXG4gICAgbmFtZTogJ3N3aW5nc2V0X2Rpc3BhdGNoX2RlbGl2ZXJfdG90YWwnLFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IHZhdCBtZXNzYWdlIGRlbGl2ZXJpZXMnLFxuICB9LFxuICB7XG4gICAga2V5OiAnZGlzcGF0Y2hOb3RpZnknLFxuICAgIG5hbWU6ICdzd2luZ3NldF9kaXNwYXRjaF9ub3RpZnlfdG90YWwnLFxuICAgIGRlc2NyaXB0aW9uOiAnVG90YWwgbnVtYmVyIG9mIFN3aW5nU2V0IHZhdCBwcm9taXNlIG5vdGlmaWNhdGlvbnMnLFxuICB9LFxuXTtcblxuLyoqIEB0eXBlIHtPbWl0PEtlcm5lbE1ldHJpY01ldGEsICdtZXRyaWNUeXBlJz5bXX0gKi8kaM2PX29uY2UuS0VSTkVMX1NUQVRTX1NVTV9NRVRSSUNTKEtFUk5FTF9TVEFUU19TVU1fTUVUUklDUyk7XG4gICAgICAgY29uc3QgS0VSTkVMX1NUQVRTX1VQRE9XTl9NRVRSSUNTID0gW1xuICB7XG4gICAga2V5OiAna2VybmVsT2JqZWN0cycsXG4gICAgbmFtZTogJ3N3aW5nc2V0X2tlcm5lbF9vYmplY3RzJyxcbiAgICBkZXNjcmlwdGlvbjogJ0FjdGl2ZSBrZXJuZWwgb2JqZWN0cycsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICdrZXJuZWxEZXZpY2VzJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfa2VybmVsX2RldmljZXMnLFxuICAgIGRlc2NyaXB0aW9uOiAnQWN0aXZlIGtlcm5lbCBkZXZpY2VzJyxcbiAgfSxcbiAge1xuICAgIGtleTogJ2tlcm5lbFByb21pc2VzJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfa2VybmVsX3Byb21pc2VzJyxcbiAgICBkZXNjcmlwdGlvbjogJ0FjdGl2ZSBrZXJuZWwgcHJvbWlzZXMnLFxuICB9LFxuICB7XG4gICAga2V5OiAna3BVbnJlc29sdmVkJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfdW5yZXNvbHZlZF9rZXJuZWxfcHJvbWlzZXMnLFxuICAgIGRlc2NyaXB0aW9uOiAnVW5yZXNvbHZlZCBrZXJuZWwgcHJvbWlzZXMnLFxuICB9LFxuICB7XG4gICAga2V5OiAna3BGdWxmaWxsZWQnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9mdWxmaWxsZWRfa2VybmVsX3Byb21pc2VzJyxcbiAgICBkZXNjcmlwdGlvbjogJ0Z1bGZpbGxlZCBrZXJuZWwgcHJvbWlzZXMnLFxuICB9LFxuICB7XG4gICAga2V5OiAna3BSZWplY3RlZCcsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3JlamVjdGVkX2tlcm5lbF9wcm9taXNlcycsXG4gICAgZGVzY3JpcHRpb246ICdSZWplY3RlZCBrZXJuZWwgcHJvbWlzZXMnLFxuICB9LFxuICB7XG4gICAga2V5OiAncnVuUXVldWVMZW5ndGgnLFxuICAgIG5hbWU6ICdzd2luZ3NldF9ydW5fcXVldWVfbGVuZ3RoJyxcbiAgICBjb25zZW5zdXM6IHRydWUsXG4gICAgZGVzY3JpcHRpb246ICdMZW5ndGggb2YgdGhlIGtlcm5lbCBydW4gcXVldWUnLFxuICB9LFxuICB7XG4gICAga2V5OiAnYWNjZXB0YW5jZVF1ZXVlTGVuZ3RoJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfYWNjZXB0YW5jZV9xdWV1ZV9sZW5ndGgnLFxuICAgIGNvbnNlbnN1czogdHJ1ZSxcbiAgICBkZXNjcmlwdGlvbjogJ0xlbmd0aCBvZiB0aGUga2VybmVsIGFjY2VwdGFuY2UgcXVldWUnLFxuICB9LFxuICB7XG4gICAga2V5OiAncHJvbWlzZVF1ZXVlc0xlbmd0aCcsXG4gICAgbmFtZTogJ3N3aW5nc2V0X3Byb21pc2VfcXVldWVzX2xlbmd0aCcsXG4gICAgY29uc2Vuc3VzOiB0cnVlLFxuICAgIGRlc2NyaXB0aW9uOiAnQ29tYmluZWQgbGVuZ3RoIG9mIGFsbCBrZXJuZWwgcHJvbWlzZSBxdWV1ZXMnLFxuICB9LFxuICB7XG4gICAga2V5OiAnY2xpc3RFbnRyaWVzJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfY2xpc3RfZW50cmllcycsXG4gICAgZGVzY3JpcHRpb246ICdOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUga2VybmVsIGMtbGlzdCcsXG4gIH0sXG4gIHtcbiAgICBrZXk6ICd2YXRzJyxcbiAgICBuYW1lOiAnc3dpbmdzZXRfdmF0cycsXG4gICAgZGVzY3JpcHRpb246ICdOdW1iZXIgb2YgYWN0aXZlIHZhdHMnLFxuICB9LFxuXTskaM2PX29uY2UuS0VSTkVMX1NUQVRTX1VQRE9XTl9NRVRSSUNTKEtFUk5FTF9TVEFUU19VUERPV05fTUVUUklDUyk7XG5cbmNvbnN0IHsgQ291bnRlciwgR2F1Z2UgfSA9IE1ldHJpY1R5cGU7XG4vKiogQHR5cGUge0tlcm5lbE1ldHJpY01ldGFbXX0gKi9cbiAgICAgICBjb25zdCBLRVJORUxfU1RBVFNfTUVUUklDUyA9IGhhcmRlbihbXG4gIC4uLktFUk5FTF9TVEFUU19TVU1fTUVUUklDUy5tYXAobSA9PiAoeyAuLi5tLCBtZXRyaWNUeXBlOiBDb3VudGVyIH0pKSxcbiAgLi4uS0VSTkVMX1NUQVRTX1VQRE9XTl9NRVRSSUNTLm1hcChtID0+ICh7IC4uLm0sIG1ldHJpY1R5cGU6IEdhdWdlIH0pKSxcbl0pO1xuXG4vKiBFbnN1cmUga2VybmVsIHN0YXRzIGtleSB1bmlxdWVuZXNzLiovJGjNj19vbmNlLktFUk5FTF9TVEFUU19NRVRSSUNTKEtFUk5FTF9TVEFUU19NRVRSSUNTKTtcbmNvbnN0IGtlcm5lbFN0YXRzS2V5cyA9IG5ldyBNYXAoKTtcbmZvciAoY29uc3QgeyBrZXkgfSBvZiBLRVJORUxfU1RBVFNfTUVUUklDUykge1xuICBrZXJuZWxTdGF0c0tleXMuc2V0KGtleSwgKGtlcm5lbFN0YXRzS2V5cy5nZXQoa2V5KSB8fCAwKSArIDEpO1xufVxuY29uc3QgZHVwbGljYXRlS2VybmVsU3RhdHNLZXlzID0gWy4uLmtlcm5lbFN0YXRzS2V5cy5lbnRyaWVzKCldLmZsYXRNYXAoXG4gIChba2V5LCB2YWx1ZV0pID0+ICh2YWx1ZSA+IDEgPyBba2V5XSA6IFtdKSxcbik7XG5pZiAoZHVwbGljYXRlS2VybmVsU3RhdHNLZXlzLmxlbmd0aCA+IDApIHtcbiAgY29uc3QgbXNnID0gYER1cGxpY2F0ZSBrZXJuZWwgc3RhdHMga2V5cyAke0pTT04uc3RyaW5naWZ5KGR1cGxpY2F0ZUtlcm5lbFN0YXRzS2V5cyl9YDtcbiAgdGhyb3cgRXJyb3IobXNnKTtcbn1cbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkhJU1RPR1JBTV9NRVRSSUNTIjpbIkhJU1RPR1JBTV9NRVRSSUNTIl0sIkJMT0NLX0hJU1RPR1JBTV9NRVRSSUNTIjpbIkJMT0NLX0hJU1RPR1JBTV9NRVRSSUNTIl0sIlF1ZXVlTWV0cmljQXNwZWN0IjpbIlF1ZXVlTWV0cmljQXNwZWN0Il0sIm1ha2VRdWV1ZU1ldHJpY3NNZXRhIjpbIm1ha2VRdWV1ZU1ldHJpY3NNZXRhIl0sIm1ha2VRdWV1ZU1ldHJpY3MiOlsibWFrZVF1ZXVlTWV0cmljcyJdLCJLRVJORUxfU1RBVFNfU1VNX01FVFJJQ1MiOlsiS0VSTkVMX1NUQVRTX1NVTV9NRVRSSUNTIl0sIktFUk5FTF9TVEFUU19VUERPV05fTUVUUklDUyI6WyJLRVJORUxfU1RBVFNfVVBET1dOX01FVFJJQ1MiXSwiS0VSTkVMX1NUQVRTX01FVFJJQ1MiOlsiS0VSTkVMX1NUQVRTX01FVFJJQ1MiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAirla8rYOAAC2DgAAKwAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9uYXR1cmFsLXNvcnQuanN7ImltcG9ydHMiOlsiLi9qcy11dGlscy5qcyJdLCJleHBvcnRzIjpbIm5hdHVyYWxDb21wYXJlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcHJvdmlkZUxhenlNYXA7JGjNj19pbXBvcnRzKFtbXCIuL2pzLXV0aWxzLmpzXCIsIFtbXCJwcm92aWRlTGF6eU1hcFwiLFskaM2PX2EgPT4gKHByb3ZpZGVMYXp5TWFwID0gJGjNj19hKV1dXV1dKTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gYVxuICogQHBhcmFtIHtzdHJpbmd9IGJcbiAqIEByZXR1cm5zIHstMSB8IDAgfCAxfVxuICovXG5jb25zdCBjb21wYXJlTmF0cyA9IChhLCBiKSA9PiB7XG4gIC8qIERlZmF1bHQgdG8gSUVFRSA3NTQgbnVtYmVyIGFyaXRobWV0aWMgZm9yIHNwZWVkLCBidXQgZmFsbCBiYWNrIG9uIGJpZ2ludCovXG4gIC8qIGFyaXRobWV0aWMgdG8gcmVzb2x2ZSB0aWVzIGJlY2F1c2UgYmlnIG51bWJlcnMgY2FuIGxvc2UgcmVzb2x1dGlvbiovXG4gIC8qIChzb21ldGltZXMgZXZlbiBiZWNvbWluZyBpbmZpbml0ZSkgYW5kIHRoZW4gdWx0aW1hdGVseSBvbiBsZW5ndGggdG8gcmVzb2x2ZSovXG4gIC8qIHRpZXMgYnkgYXNjZW5kaW5nIGNvdW50IG9mIGxlYWRpbmcgemVyb3MuKi9cbiAgY29uc3QgZGlmZiA9ICthIC0gK2I7XG4gIGNvbnN0IGZpbml0ZURpZmYgPVxuICAgIChOdW1iZXIuaXNGaW5pdGUoZGlmZikgJiYgZGlmZikgfHxcbiAgICAoYSA9PT0gYiA/IDAgOiBOdW1iZXIoQmlnSW50KGEpIC0gQmlnSW50KGIpKSB8fCBhLmxlbmd0aCAtIGIubGVuZ3RoKTtcblxuICAvKiBAdHMtZXhwZWN0LWVycm9yIHRoaXMgY2FsbCByZWFsbHkgZG9lcyByZXR1cm4gLTEgfCAwIHwgMSovXG4gIHJldHVybiBNYXRoLnNpZ24oZmluaXRlRGlmZik7XG59O1xuXG4vKiBUT0RPOiBjb21wYXJlQnlDb2RlUG9pbnRzKi9cbi8qIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzIwMDgqL1xuXG5jb25zdCBjb21wYXJlU3RyaW5ncyA9IChhLCBiKSA9PiAoYSA+IGIgPyAxIDogYSA8IGIgPyAtMSA6IDApO1xuXG5jb25zdCByQ2FwdHVyZURpZ2l0cyA9IC8oWzAtOV0rKS87XG5cbi8qKlxuICogU3BsaXR0aW5nIGJ5IHJlZ3VsYXIgZXhwcmVzc2lvbiBjYW4gYmUgZXhwZW5zaXZlOyB3ZSBkb24ndCB3YW50IHRvIHJlcGVhdFxuICogdGhhdCBmb3IgZXZlcnkgY29tcGFyaXNvbiBhZ2FpbnN0IHRoZSBzYW1lIHN0cmluZy5cbiAqXG4gKiBAdHlwZSB7TWFwPHN0cmluZywgc3RyaW5nW10+fVxuICovXG5jb25zdCBwYXJ0c0NhY2hlID0gbmV3IE1hcCgpO1xuXG4vKipcbiAqIFBlcmZvcm0gYSBtdWx0aS1sZXZlbCBuYXR1cmFsLXNvcnQgY29tcGFyaXNvbiwgZmluZGluZyB0aGUgZGVjaW1hbCBkaWdpdFxuICogc2VxdWVuY2VzIGluIGVhY2ggb3BlcmFuZCBhbmQgY29tcGFyaW5nIGZpcnN0IGJ5IGVhY2ggKFtwb3NzaWJseSBlbXB0eV1cbiAqIHN0cmluZyBwcmVmaXgsIGludGVnZXIpIHBhaXIgaW4gdHVybiwgd2l0aCBhIGZpbmFsIGNvbXBhcmlzaW9uIGJ5IHN0cmluZ1xuICogc3VmZml4IGFzIG5lY2Vzc2FyeSAoZS5nLiwgc29ydGluZyAna280MicgYmVmb3JlICdrbzEwMCcgYXMgWydrbycsIDQyXSB2cy5cbiAqIFsna28nLCAxMDBdIGFuZCAncGFyZW50MS5jaGlsZDgnIGJlZm9yZSAncGFyZW50MS5jaGlsZDEwJyBhcyBbJ3BhcmVudCcsIDEsXG4gKiAnY2hpbGQnLCA4XSB2cy4gWydwYXJlbnQnLCAxLCAnY2hpbGQnLCAxMF0pLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBhXG4gKiBAcGFyYW0ge3N0cmluZ30gYlxuICogQHJldHVybnMgey0xIHwgMCB8IDF9XG4gKi9cbiAgICAgICBjb25zdCBuYXR1cmFsQ29tcGFyZSA9IChhLCBiKSA9PiB7XG4gIC8qIFdlIHdhbnQgdG8gbWFpbnRhaW4gYSBjYWNoZSBvbmx5IGZvciB0aGUgZHVyYXRpb24gb2YgZWFjaCBjYWxsIHRvKi9cbiAgLyogYXJyYXkuc29ydCwgYW5kIGxldmVyYWdlIHRoZSBzeW5jaHJvbm91cyBuYXR1cmUgb2YgdGhhdCBtZXRob2QgaW4gdGhlIGZpcnN0Ki9cbiAgLyogaW52b2NhdGlvbiBvZiBlYWNoIHR1cm4gKGluZGljYXRlZCBieSBhbiBlbXB0eSBjYWNoZSkgdG8gc2NoZWR1bGUgY2FjaGUqL1xuICAvKiBjbGVhcmluZyBpbiB0aGUgKm5leHQqIHR1cm4uKi9cbiAgaWYgKCFwYXJ0c0NhY2hlLnNpemUpIHZvaWQgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoKSA9PiBwYXJ0c0NhY2hlLmNsZWFyKCkpO1xuXG4gIGNvbnN0IGFQYXJ0cyA9IHByb3ZpZGVMYXp5TWFwKHBhcnRzQ2FjaGUsIGEsICgpID0+IGEuc3BsaXQockNhcHR1cmVEaWdpdHMpKTtcbiAgY29uc3QgYlBhcnRzID0gcHJvdmlkZUxhenlNYXAocGFydHNDYWNoZSwgYiwgKCkgPT4gYi5zcGxpdChyQ2FwdHVyZURpZ2l0cykpO1xuXG4gIC8qIEFuIGV2ZW4gaW5kZXggY29ycmVzcG9uZHMgd2l0aCBhIHN0cmluZyBwYXJ0OyBhbiBvZGQgb25lIHdpdGggYSBkaWdpdCBwYXJ0LiovXG4gIGxldCBpID0gMDtcbiAgZm9yICg7IGkgKyAxIDwgYVBhcnRzLmxlbmd0aDsgaSArPSAyKSB7XG4gICAgaWYgKGkgKyAxIDwgYlBhcnRzLmxlbmd0aCkge1xuICAgICAgLyogQm90aCBgYWAgYW5kIGBiYCBoYXZlIGEgZGlnaXQgcGFydCBoZXJlLCBidXQgd2UgY29tcGFyZSB0aGUgcHJlY2VkaW5nKi9cbiAgICAgIC8qIHN0cmluZyBwYXJ0IGZpcnN0IGluIGNhc2UgdGhvc2UgYXJlIHVuZXF1YWwuKi9cbiAgICAgIGNvbnN0IHJlc3VsdCA9XG4gICAgICAgIGNvbXBhcmVTdHJpbmdzKGFQYXJ0c1tpXSwgYlBhcnRzW2ldKSB8fFxuICAgICAgICBjb21wYXJlTmF0cyhhUGFydHNbaSArIDFdLCBiUGFydHNbaSArIDFdKTtcbiAgICAgIGlmIChyZXN1bHQpIHJldHVybiByZXN1bHQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIEFmdGVyIGEgKHBvc3NpYmx5IGVtcHR5KSBjb21tb24gcHJlZml4LCBgYWAgaGFzIGRpZ2l0cyB3aGVyZSBgYmAgZG9lcyovXG4gICAgICAvKiBub3QsIHNvIHdlIHVzZSBzdHJpbmcgY29tcGFyaXNvbiBvZiBgJHthU3RyaW5nfSR7YURpZ2l0c31gIHZzLiovXG4gICAgICAvKiBgJHtiU3RyaW5nfWAuKi9cbiAgICAgIHJldHVybiBjb21wYXJlU3RyaW5ncyhgJHthUGFydHNbaV19JHthUGFydHNbaSArIDFdfWAsIGJQYXJ0c1tpXSk7XG4gICAgfVxuICB9XG4gIGlmIChiUGFydHMubGVuZ3RoID4gYVBhcnRzLmxlbmd0aCkge1xuICAgIC8qIGBiYCBoYXMgZGlnaXRzIHdoZXJlIGBhYCBkb2VzIG5vdC4qL1xuICAgIHJldHVybiBjb21wYXJlU3RyaW5ncyhhUGFydHNbaV0sIGAke2JQYXJ0c1tpXX0ke2JQYXJ0c1tpICsgMV19YCk7XG4gIH1cbiAgLyogSWYgYGFgIGFuZCBgYmAgZGlmZmVyLCBpdCdzIG9ubHkgaW4gdGhlIGZpbmFsIHN0cmluZyBzdWZmaXguKi9cbiAgcmV0dXJuIGNvbXBhcmVTdHJpbmdzKGFQYXJ0c1tpXSwgYlBhcnRzW2ldKTtcbn07JGjNj19vbmNlLm5hdHVyYWxDb21wYXJlKG5hdHVyYWxDb21wYXJlKTtcbmhhcmRlbihuYXR1cmFsQ29tcGFyZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJuYXR1cmFsQ29tcGFyZSI6WyJuYXR1cmFsQ29tcGFyZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABPxCWXakgAAGpIAAAoAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3Nlcy11dGlscy5qc3siaW1wb3J0cyI6WyJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyIsIkBlbmRvL2NvbW1vbi9vYmplY3QtbWV0YS1tYXAuanMiLCJAZW5kby9jb21tb24vZnJvbS11bmlxdWUtZW50cmllcy5qcyIsIkBlbmRvL2Vycm9ycyIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9wcm9taXNlLWtpdCIsIkBlbmRvL3N0cmVhbSIsImplc3NpZS5qcyIsIi4vanMtdXRpbHMuanMiXSwiZXhwb3J0cyI6WyJQcm9taXNlQWxsT3JFcnJvcnMiLCJhZ2dyZWdhdGVUcnlGaW5hbGx5IiwiYWxsVmFsdWVzIiwiYXNzZXJ0QWxsRGVmaW5lZCIsImF0dGVudWF0ZSIsImRlZXBseUZ1bGZpbGxlZE9iamVjdCIsImZvcmV2ZXIiLCJmcm9tVW5pcXVlRW50cmllcyIsIm1ha2VMaW1pdGVkQ29uc29sZSIsIm9iamVjdE1hcCIsIm9iamVjdE1ldGFNYXAiLCJzdHJpcFByZWZpeCIsInN5bmNocm9uaXplZFRlZSIsInRocm93RXJyb3JDb2RlIiwidHJ5SnNvblBhcnNlIiwidHJ5Tm93IiwidW50aWxUcnVlIiwid2hpbGVUcnVlIiwid2l0aERlZmVycmVkQ2xlYW51cCIsInppcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG9iamVjdE1hcCxvYmplY3RNZXRhTWFwLGZyb21VbmlxdWVFbnRyaWVzLHEsYixGYWlsLG1ha2VFcnJvcixhbm5vdGF0ZUVycm9yLFgsZGVlcGx5RnVsZmlsbGVkLGlzUHJpbWl0aXZlLG1ha2VQcm9taXNlS2l0LG1ha2VRdWV1ZSxhc3luY0dlbmVyYXRlLGxvZ0xldmVsczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzXCIsIFtbXCJvYmplY3RNYXBcIixbJGjNj19hID0+IChvYmplY3RNYXAgPSAkaM2PX2EpLCRozY9fbGl2ZVtcIm9iamVjdE1hcFwiXV1dXV0sW1wiQGVuZG8vY29tbW9uL29iamVjdC1tZXRhLW1hcC5qc1wiLCBbW1wib2JqZWN0TWV0YU1hcFwiLFskaM2PX2EgPT4gKG9iamVjdE1ldGFNYXAgPSAkaM2PX2EpLCRozY9fbGl2ZVtcIm9iamVjdE1ldGFNYXBcIl1dXV1dLFtcIkBlbmRvL2NvbW1vbi9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzXCIsIFtbXCJmcm9tVW5pcXVlRW50cmllc1wiLFskaM2PX2EgPT4gKGZyb21VbmlxdWVFbnRyaWVzID0gJGjNj19hKSwkaM2PX2xpdmVbXCJmcm9tVW5pcXVlRW50cmllc1wiXV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJiXCIsWyRozY9fYSA9PiAoYiA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJtYWtlRXJyb3JcIixbJGjNj19hID0+IChtYWtlRXJyb3IgPSAkaM2PX2EpXV0sW1wiYW5ub3RhdGVFcnJvclwiLFskaM2PX2EgPT4gKGFubm90YXRlRXJyb3IgPSAkaM2PX2EpXV0sW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJkZWVwbHlGdWxmaWxsZWRcIixbJGjNj19hID0+IChkZWVwbHlGdWxmaWxsZWQgPSAkaM2PX2EpXV0sW1wiaXNQcmltaXRpdmVcIixbJGjNj19hID0+IChpc1ByaW1pdGl2ZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJtYWtlUHJvbWlzZUtpdFwiLFskaM2PX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vc3RyZWFtXCIsIFtbXCJtYWtlUXVldWVcIixbJGjNj19hID0+IChtYWtlUXVldWUgPSAkaM2PX2EpXV1dXSxbXCJqZXNzaWUuanNcIiwgW1tcImFzeW5jR2VuZXJhdGVcIixbJGjNj19hID0+IChhc3luY0dlbmVyYXRlID0gJGjNj19hKV1dXV0sW1wiLi9qcy11dGlscy5qc1wiLCBbW1wibG9nTGV2ZWxzXCIsWyRozY9fYSA9PiAobG9nTGV2ZWxzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3QgeyBmcm9tRW50cmllcywga2V5cywgdmFsdWVzIH0gPSBPYmplY3Q7XG5cbi8qKiBAcGFyYW0geyhsZXZlbDogc3RyaW5nKSA9PiAoLi4uYXJnczogdW5rbm93bltdKSA9PiB2b2lkfSBtYWtlTG9nZ2VyICovXG4gICAgICAgY29uc3QgbWFrZUxpbWl0ZWRDb25zb2xlID0gbWFrZUxvZ2dlciA9PiB7XG4gIGNvbnN0IGxpbWl0ZWRDb25zb2xlID0gLyoqIEB0eXBlIHthbnl9ICovIChcbiAgICBmcm9tRW50cmllcyhsb2dMZXZlbHMubWFwKGxldmVsID0+IFtsZXZlbCwgbWFrZUxvZ2dlcihsZXZlbCldKSlcbiAgKTtcbiAgcmV0dXJuIC8qKiBAdHlwZSB7TGltaXRlZENvbnNvbGV9ICovIChoYXJkZW4obGltaXRlZENvbnNvbGUpKTtcbn07JGjNj19vbmNlLm1ha2VMaW1pdGVkQ29uc29sZShtYWtlTGltaXRlZENvbnNvbGUpO1xuaGFyZGVuKG1ha2VMaW1pdGVkQ29uc29sZSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHt7IFtLZXlUeXBlIGluIGtleW9mIFRdOiBUW0tleVR5cGVdIH0gJiB7fX0gU2ltcGxpZnkgZmxhdHRlbiB0aGVcbiAqICAgdHlwZSBvdXRwdXQgdG8gaW1wcm92ZSB0eXBlIGhpbnRzIHNob3duIGluIGVkaXRvcnNcbiAqICAgaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy90eXBlLWZlc3QvYmxvYi9tYWluL3NvdXJjZS9zaW1wbGlmeS5kLnRzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IENhbGxhYmxlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge3t9fSBUXG4gKiBAdHlwZWRlZiB7e1xuICogICBbSyBpbiBrZXlvZiBUXTogVFtLXSBleHRlbmRzIENhbGxhYmxlID8gVFtLXSA6IERlZXBseUF3YWl0ZWQ8VFtLXT47XG4gKiB9fSBEZWVwbHlBd2FpdGVkT2JqZWN0XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1QgZXh0ZW5kcyBQcm9taXNlTGlrZTxhbnk+XG4gKiAgICAgPyBBd2FpdGVkPFQ+XG4gKiAgICAgOiBUIGV4dGVuZHMgUmVtb3RhYmxlQnJhbmQ8YW55LCBhbnk+IHwgUmVtb3RhYmxlT2JqZWN0XG4gKiAgICAgICA/IFRcbiAqICAgICAgIDogVCBleHRlbmRzIHt9XG4gKiAgICAgICAgID8gU2ltcGxpZnk8RGVlcGx5QXdhaXRlZE9iamVjdDxUPj5cbiAqICAgICAgICAgOiBBd2FpdGVkPFQ+fSBEZWVwbHlBd2FpdGVkXG4gKi9cblxuLyoqXG4gKiBBIG1vcmUgY29uc3RyYWluZWQgdmVyc2lvbiBvZiB7ZGVlcGx5RnVsZmlsbGVkfSBmb3IgdHlwZSBzYWZldHkgdW50aWxcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMTI1NyBVc2VmdWwgaW4gc3RhcnRpbmcgY29udHJhY3RzIHRoYXRcbiAqIG5lZWQgYWxsIHRlcm1zIHRvIGJlIGZ1bGZpbGxlZCBpbiBvcmRlciB0byBiZSBkdXJhYmxlLlxuICpcbiAqIEB0eXBlIHs8VCBleHRlbmRzIHt9Pih1bmZ1bGZpbGxlZFRlcm1zOiBUKSA9PiBQcm9taXNlPERlZXBseUF3YWl0ZWQ8VD4+fVxuICovXG4gICAgICAgY29uc3QgZGVlcGx5RnVsZmlsbGVkT2JqZWN0ID0gYXN5bmMgb2JqID0+IHtcbiAgIWlzUHJpbWl0aXZlKG9iaikgfHwgRmFpbGBwYXJhbSBtdXN0IGJlIGFuIG9iamVjdGA7XG4gIHJldHVybiBkZWVwbHlGdWxmaWxsZWQob2JqKTtcbn07XG5cbi8qKlxuICogVG9sZXJhdGUgYWJzZW5jZSBvZiBBZ2dyZWdhdGVFcnJvciBpbiBlLmcuIHhzbmFwLlxuICpcbiAqIEB0eXBlIHsoZXJyb3JzOiBFcnJvcltdLCBtZXNzYWdlPzogc3RyaW5nLCBvcHRpb25zPzogb2JqZWN0KSA9PiBFcnJvcn1cbiAqLyRozY9fb25jZS5kZWVwbHlGdWxmaWxsZWRPYmplY3QoZGVlcGx5RnVsZmlsbGVkT2JqZWN0KTtcbmNvbnN0IG1ha2VBZ2dyZWdhdGVFcnJvciA9XG4gIHR5cGVvZiBBZ2dyZWdhdGVFcnJvciA9PT0gJ2Z1bmN0aW9uJ1xuICAgID8gKGVycm9ycywgbWVzc2FnZSwgb3B0aW9ucykgPT4gQWdncmVnYXRlRXJyb3IoZXJyb3JzLCBtZXNzYWdlLCBvcHRpb25zKVxuICAgIDogKGVycm9ycywgbWVzc2FnZSwgb3B0aW9ucykgPT4ge1xuICAgICAgICByZXR1cm4gbWFrZUVycm9yKG1lc3NhZ2UgPz8gJ211bHRpcGxlIGVycm9ycycsIHVuZGVmaW5lZCwge1xuICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgZXJyb3JzLFxuICAgICAgICB9KTtcbiAgICAgIH07XG5cbi8qKlxuICogQXNzZXJ0IHRoYXQgYSBzdHJpbmcgaGFzIGEgcHJlZml4LCBhbmQgcmV0dXJuIHRoZSBwYXJ0IHRoYXQgZm9sbG93cyBpdC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4XG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG4gICAgICAgY29uc3Qgc3RyaXBQcmVmaXggPSAocHJlZml4LCBzdHIpID0+IHtcbiAgc3RyLnN0YXJ0c1dpdGgocHJlZml4KSB8fCBGYWlsYCR7c3RyfSBpcyBtaXNzaW5nIHByZWZpeCAke3EocHJlZml4KX1gO1xuICByZXR1cm4gc3RyLnNsaWNlKHByZWZpeC5sZW5ndGgpO1xufTtcblxuLyoqXG4gKiBUaHJvdyBhbiBlcnJvciB3aXRoIGFuIG93biBcImNvZGVcIiBkYXRhIHByb3BlcnR5LCBzdXBwb3J0aW5nIGlkZW50aWZpY2F0aW9uXG4gKiB3aXRob3V0IHBhcnNpbmcgYG1lc3NhZ2VgLiBOb3RlIHRoYXQgc3VjaCBlcnJvcnMgYXJlIG5vdCBQYXNzYWJsZSBhbmQgdGh1c1xuICogY2Fubm90IGFwcGVhciBpbnNpZGUgYSBQYXNzYWJsZSBzdHJ1Y3R1cmUsIGFuZCBldmVuIGF0IHRvcCBsZXZlbCB0aGUgXCJjb2RlXCJcbiAqIHByb3BlcnR5IHdpbGwgYmUgc2lsZW50bHkgZHJvcHBlZCBieSBtYXJzaGFsbGluZy5cbiAqXG4gKiBAdGVtcGxhdGUge3N0cmluZ30gQ29kZVxuICogQHBhcmFtIHtQYXJhbWV0ZXJzPHR5cGVvZiBtYWtlRXJyb3I+WzBdfSBkZXRhaWxzXG4gKiBAcGFyYW0ge0NvZGV9IGNvZGVcbiAqIEBwYXJhbSB7UGFyYW1ldGVyczx0eXBlb2YgbWFrZUVycm9yPlsyXSAmIHtcbiAqICAgY29uc3RydWN0b3I/OiBQYXJhbWV0ZXJzPHR5cGVvZiBtYWtlRXJyb3I+WzFdO1xuICogfX0gW29wdHNdXG4gKi8kaM2PX29uY2Uuc3RyaXBQcmVmaXgoc3RyaXBQcmVmaXgpO1xuICAgICAgIGNvbnN0IHRocm93RXJyb3JDb2RlID0gKGRldGFpbHMsIGNvZGUsIG9wdHMpID0+IHtcbiAgY29uc3QgZXJyID0gbWFrZUVycm9yKGRldGFpbHMsIG9wdHM/LmNvbnN0cnVjdG9yLCB7XG4gICAgLi4ub3B0cyxcbiAgICBzYW5pdGl6ZTogZmFsc2UsXG4gIH0pO1xuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXJyLCAnY29kZScsIHsgdmFsdWU6IGNvZGUsIGVudW1lcmFibGU6IHRydWUgfSk7XG4gIGhhcmRlbihlcnIpO1xuICB0aHJvdyBlcnI7XG59O1xuXG4vKipcbiAqIFN5bmNocm9udXNseSBpbnZva2UgYSBmdW5jdGlvbiB3aXRoIHRoZSBvcHBvcnR1bml0eSB0byBoYW5kbGUgYW55IGVycm9yXG4gKiBzaW1pbGFybHkgdG8gYSBQcm9taXNlIGBjYXRjaGAgY2FsbGJhY2sgKGUuZy4sIHN1YnN0aXR1dGluZyBhIG5vbi1lcnJvclxuICogcmV0dXJuZWQgdmFsdWUgb3IgdGhyb3dpbmcgYSBwb3NzaWJseS1uZXcgZXJyb3IpLiBUaGlzIGlzIHVzZWZ1bCBmb3IgKGFtb25nXG4gKiBvdGhlciB0aGluZ3MpIHJlcGxhY2luZyBnZW5lcmljIGVycm9yIG1lc3NhZ2VzIHdpdGggc3BlY2lmaWMgb25lcyAoYXMgaW5cbiAqIHtAc2VlIHRyeUpzb25QYXJzZX0pLlxuICpcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IEZcbiAqIEB0ZW1wbGF0ZSBbVT1SZXR1cm5UeXBlPEY+XVxuICogQHBhcmFtIHtGfSBmbiB0byBpbnZva2VcbiAqIEBwYXJhbSB7KGVycjogRXJyb3IpID0+IFV9IHRyYW5zZm9ybUVycm9yIGNhbGxiYWNrIHRvIHJlY2VpdmUgYW55IGVycm9yIGZyb21cbiAqICAgaW52b2tpbmcgYGZuYCBhbmQgZWl0aGVyIHJldHVybiBhIHN1YnN0aXR1dGUgdmFsdWUgb3IgdGhyb3cgYSBwb3RlbnRpYWxseVxuICogICBuZXcgZXJyb3JcbiAqIEBwYXJhbSB7UGFyYW1ldGVyczxGPn0gYXJncyBmb3IgYGZuYFxuICogQHJldHVybnMge1JldHVyblR5cGU8Rj4gfCBVfVxuICovJGjNj19vbmNlLnRocm93RXJyb3JDb2RlKHRocm93RXJyb3JDb2RlKTtcbiAgICAgICBjb25zdCB0cnlOb3cgPSAoZm4sIHRyYW5zZm9ybUVycm9yLCAuLi5hcmdzKSA9PiB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGZuKC4uLmFyZ3MpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuIHRyYW5zZm9ybUVycm9yKGVycik7XG4gICAgfSBjYXRjaCAobmV3RXJyKSB7XG4gICAgICAvKiBUcnkgdG8gYXNzb2NpYXRlIGBlcnJgIHdpdGggYG5ld0VycmAuKi9cbiAgICAgIGlmICghbmV3RXJyLmNhdXNlKSB7XG4gICAgICAgIGNvbnN0IGRlc2MgPSB7XG4gICAgICAgICAgdmFsdWU6IGVycixcbiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIH07XG4gICAgICAgIGlmICghUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eShuZXdFcnIsICdjYXVzZScsIGRlc2MpKSB7XG4gICAgICAgICAgYXNzZXJ0Lm5vdGUobmV3RXJyLCBlcnIubWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRocm93IG5ld0VycjtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogUGFyc2UgSlNPTiB0ZXh0LCBvciBoYW5kbGUgYW4gZXJyb3IgYnkgZS5nLiBzdWJzdGl0dXRpbmcgYSBkZWZhdWx0IHZhbHVlIG9yXG4gKiByZXBsYWNpbmcgaXQgd2l0aCBvbmUgYmVhcmluZyBhIG5vbi1nZW5lcmljIG1lc3NhZ2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGpzb25UZXh0XG4gKiBAcGFyYW0ge3N0cmluZyB8ICgoZXJyOiBFcnJvcikgPT4gdW5rbm93bil9IG9uRXJyb3IgYW4gZXJyb3IgbWVzc2FnZSBvclxuICogICBjYWxsYmFja1xuICovJGjNj19vbmNlLnRyeU5vdyh0cnlOb3cpO1xuICAgICAgIGNvbnN0IHRyeUpzb25QYXJzZSA9IChqc29uVGV4dCwgb25FcnJvcikgPT4ge1xuICBjb25zdCB0cmFuc2Zvcm1FcnJvciA9XG4gICAgdHlwZW9mIG9uRXJyb3IgPT09ICdmdW5jdGlvbidcbiAgICAgID8gb25FcnJvclxuICAgICAgOiBlcnIgPT4gRmFpbChbYCR7b25FcnJvcn06ICR7ZXJyLm1lc3NhZ2V9IGZvciBpbnB1dCBgLCAnJ10sIGpzb25UZXh0KTtcbiAgcmV0dXJuIHRyeU5vdygoKSA9PiB7XG4gICAgY29uc3QgdHlwZSA9IHR5cGVvZiBqc29uVGV4dDtcbiAgICB0eXBlID09PSAnc3RyaW5nJyB8fCBGYWlsYElucHV0IG11c3QgYmUgYSBzdHJpbmcsIG5vdCAke2IodHlwZSl9YDtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShqc29uVGV4dCk7XG4gIH0sIHRyYW5zZm9ybUVycm9yKTtcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7cmVhZG9ubHkgKFQgfCBQcm9taXNlTGlrZTxUPilbXX0gaXRlbXNcbiAqIEByZXR1cm5zIHtQcm9taXNlPFRbXT59XG4gKi8kaM2PX29uY2UudHJ5SnNvblBhcnNlKHRyeUpzb25QYXJzZSk7XG4gICAgICAgY29uc3QgUHJvbWlzZUFsbE9yRXJyb3JzID0gYXN5bmMgaXRlbXMgPT4ge1xuICByZXR1cm4gUHJvbWlzZS5hbGxTZXR0bGVkKGl0ZW1zKS50aGVuKHJlc3VsdHMgPT4ge1xuICAgIGNvbnN0IGVycm9ycyA9IC8qKiBAdHlwZSB7UHJvbWlzZVJlamVjdGVkUmVzdWx0W119ICovIChcbiAgICAgIHJlc3VsdHMuZmlsdGVyKCh7IHN0YXR1cyB9KSA9PiBzdGF0dXMgPT09ICdyZWplY3RlZCcpXG4gICAgKS5tYXAocmVzdWx0ID0+IHJlc3VsdC5yZWFzb24pO1xuICAgIGlmICghZXJyb3JzLmxlbmd0aCkge1xuICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7UHJvbWlzZUZ1bGZpbGxlZFJlc3VsdDxUPltdfSAqLyAocmVzdWx0cykubWFwKFxuICAgICAgICByZXN1bHQgPT4gcmVzdWx0LnZhbHVlLFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGVycm9ycy5sZW5ndGggPT09IDEpIHtcbiAgICAgIHRocm93IGVycm9yc1swXTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbWFrZUFnZ3JlZ2F0ZUVycm9yKGVycm9ycyk7XG4gICAgfVxuICB9KTtcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7KCkgPT4gUHJvbWlzZTxUPn0gdHJpZXJcbiAqIEBwYXJhbSB7KGVycm9yPzogdW5rbm93bikgPT4gUHJvbWlzZTx1bmtub3duPn0gZmluYWxpemVyXG4gKiBAcmV0dXJucyB7UmV0dXJuVHlwZTx0cmllcj59XG4gKi8kaM2PX29uY2UuUHJvbWlzZUFsbE9yRXJyb3JzKFByb21pc2VBbGxPckVycm9ycyk7XG4gICAgICAgY29uc3QgYWdncmVnYXRlVHJ5RmluYWxseSA9IGFzeW5jICh0cmllciwgZmluYWxpemVyKSA9PlxuICB0cmllcigpLnRoZW4oXG4gICAgYXN5bmMgcmVzdWx0ID0+IGZpbmFsaXplcigpLnRoZW4oKCkgPT4gcmVzdWx0KSxcbiAgICBhc3luYyB0cnlFcnJvciA9PlxuICAgICAgZmluYWxpemVyKHRyeUVycm9yKVxuICAgICAgICAudGhlbihcbiAgICAgICAgICAoKSA9PiB0cnlFcnJvcixcbiAgICAgICAgICBmaW5hbGl6ZUVycm9yID0+IG1ha2VBZ2dyZWdhdGVFcnJvcihbdHJ5RXJyb3IsIGZpbmFsaXplRXJyb3JdKSxcbiAgICAgICAgKVxuICAgICAgICAudGhlbihlcnJvciA9PiBQcm9taXNlLnJlamVjdChlcnJvcikpLFxuICApO1xuXG4vKipcbiAqIFJ1biBhIGZ1bmN0aW9uIHdpdGggdGhlIGFiaWxpdHkgdG8gZGVmZXIgbGFzdC1pbi1maXJzdC1vdXQgY2xlYW51cCBjYWxsYmFja3MuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7KFxuICogICBhZGRDbGVhbnVwOiAoZm46IChlcnI/OiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+KSA9PiB2b2lkLFxuICogKSA9PiBQcm9taXNlPFQ+fSBmblxuICogQHJldHVybnMge1JldHVyblR5cGU8Zm4+fVxuICovJGjNj19vbmNlLmFnZ3JlZ2F0ZVRyeUZpbmFsbHkoYWdncmVnYXRlVHJ5RmluYWxseSk7XG4gICAgICAgY29uc3Qgd2l0aERlZmVycmVkQ2xlYW51cCA9IGFzeW5jIGZuID0+IHtcbiAgLyoqIEB0eXBlIHsoKGVycj86IHVua25vd24pID0+IHVua25vd24pW119ICovXG4gIGNvbnN0IGNsZWFudXBzTElGTyA9IFtdO1xuICAvKiogQHR5cGUgeyhjbGVhbnVwOiAoZXJyPzogdW5rbm93bikgPT4gdW5rbm93bikgPT4gdm9pZH0gKi9cbiAgY29uc3QgYWRkQ2xlYW51cCA9IGNsZWFudXAgPT4ge1xuICAgIGNsZWFudXBzTElGTy51bnNoaWZ0KGNsZWFudXApO1xuICB9O1xuICAvKiogQHR5cGUgeyhlcnI/OiB1bmtub3duKSA9PiBQcm9taXNlPHZvaWQ+fSAqL1xuICBjb25zdCBmaW5hbGl6ZXIgPSBhc3luYyBlcnIgPT4ge1xuICAgIC8qIFJ1biBlYWNoIGNsZWFudXAgaW4gaXRzIG93biBpc29sYXRlZCBzdGFjay4qL1xuICAgIGNvbnN0IGNsZWFudXBSZXN1bHRzID0gY2xlYW51cHNMSUZPLm1hcChhc3luYyBjbGVhbnVwID0+IHtcbiAgICAgIGF3YWl0IG51bGw7XG4gICAgICByZXR1cm4gY2xlYW51cChlcnIpO1xuICAgIH0pO1xuICAgIGF3YWl0IFByb21pc2VBbGxPckVycm9ycyhjbGVhbnVwUmVzdWx0cyk7XG4gIH07XG4gIHJldHVybiBhZ2dyZWdhdGVUcnlGaW5hbGx5KCgpID0+IGZuKGFkZENsZWFudXApLCBmaW5hbGl6ZXIpO1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBUXG4gKiBAdHlwZWRlZiB7eyBbUCBpbiBrZXlvZiBUXTogRXhjbHVkZTxUW1BdLCB1bmRlZmluZWQ+IH19IEFsbERlZmluZWRcbiAqL1xuXG4vKipcbiAqIENvbmNpc2Ugd2F5IHRvIGNoZWNrIHZhbHVlcyBhcmUgYXZhaWxhYmxlIGZyb20gb2JqZWN0IGxpdGVyYWwgc2hvcnRoYW5kLlxuICogVGhyb3dzIGVycm9yIG1lc3NhZ2UgdG8gc3BlY2lmeSB0aGUgbWlzc2luZyB2YWx1ZXMuXG4gKlxuICogQHR5cGUgezxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgdW5rbm93bj4+KG9iajogVCkgPT4gYXNzZXJ0cyBvYmogaXMgQWxsRGVmaW5lZDxUPn1cbiAqIEB0aHJvd3MgaWYgYW55IHZhbHVlIGluIHRoZSBvYmplY3QgZW50cmllcyBpcyBub3QgZGVmaW5lZFxuICovJGjNj19vbmNlLndpdGhEZWZlcnJlZENsZWFudXAod2l0aERlZmVycmVkQ2xlYW51cCk7XG4gICAgICAgY29uc3QgYXNzZXJ0QWxsRGVmaW5lZCA9IG9iaiA9PiB7XG4gIGNvbnN0IG1pc3NpbmcgPSBbXTtcbiAgZm9yIChjb25zdCBba2V5LCB2YWxdIG9mIE9iamVjdC5lbnRyaWVzKG9iaikpIHtcbiAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgIG1pc3NpbmcucHVzaChrZXkpO1xuICAgIH1cbiAgfVxuICBpZiAobWlzc2luZy5sZW5ndGggPiAwKSB7XG4gICAgRmFpbGBtaXNzaW5nICR7cShtaXNzaW5nKX1gO1xuICB9XG59O1xuXG4vKipcbiAqIEF0dGVudWF0ZSBgc3BlY2ltZW5gIHRvIG9ubHkgcHJvcGVydGllcyBhbGxvd2VkIGJ5IGBwZXJtaXRgLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdGVtcGxhdGUge1Blcm1pdDxUPn0gUFxuICogQHBhcmFtIHtUfSBzcGVjaW1lblxuICogQHBhcmFtIHtQfSBwZXJtaXRcbiAqIEBwYXJhbSB7PFUsIFN1YlAgZXh0ZW5kcyBQZXJtaXQ8VT4+KGF0dGVudWF0aW9uOiBVLCBwZXJtaXQ6IFN1YlApID0+IFV9IFt0cmFuc2Zvcm1dXG4gKiAgIHVzZWQgdG8gcmVwbGFjZSB0aGUgcmVzdWx0cyBvZiByZWN1cnNpdmUgcGlja3MgKGJ1dCBub3QgYmxhbmtldCBwZXJtaXRzKVxuICogQHJldHVybnMge0F0dGVudWF0ZWQ8VCwgUD59XG4gKi8kaM2PX29uY2UuYXNzZXJ0QWxsRGVmaW5lZChhc3NlcnRBbGxEZWZpbmVkKTtcbiAgICAgICBjb25zdCBhdHRlbnVhdGUgPSAoc3BlY2ltZW4sIHBlcm1pdCwgdHJhbnNmb3JtID0geCA9PiB4KSA9PiB7XG4gIC8qIEZhc3QtcGF0aCBmb3Igbm8gYXR0ZW51YXRpb24uKi9cbiAgaWYgKHBlcm1pdCA9PT0gdHJ1ZSB8fCB0eXBlb2YgcGVybWl0ID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiAvKiogQHR5cGUge0F0dGVudWF0ZWQ8VCwgUD59ICovIChzcGVjaW1lbik7XG4gIH1cblxuICAvKiogQHR5cGUge3N0cmluZ1tdfSAqL1xuICBjb25zdCBwYXRoID0gW107XG4gIC8qKlxuICogQHRlbXBsYXRlIFN1YlRcbiAqIEB0ZW1wbGF0ZSB7RXhjbHVkZTxQZXJtaXQ8U3ViVD4sIFByaW1pdGl2ZT59IFN1YlBcbiAqIEB0eXBlIHsoc3BlY2ltZW46IFN1YlQsIHBlcm1pdDogU3ViUCkgPT4gQXR0ZW51YXRlZDxTdWJULCBTdWJQPn1cbiAqL1xuICBjb25zdCBleHRyYWN0ID0gKHN1YlNwZWNpbWVuLCBzdWJQZXJtaXQpID0+IHtcbiAgICBpZiAoc3ViUGVybWl0ID09PSBudWxsIHx8IHR5cGVvZiBzdWJQZXJtaXQgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBwYXRoLmxlbmd0aCA9PT0gMFxuICAgICAgICA/IEZhaWxgaW52YWxpZCBwZXJtaXQ6ICR7cShwZXJtaXQpfWBcbiAgICAgICAgOiBGYWlsYGludmFsaWQgcGVybWl0IGF0IHBhdGggJHtxKHBhdGgpfTogJHtxKHN1YlBlcm1pdCl9YDtcbiAgICB9IGVsc2UgaWYgKHN1YlNwZWNpbWVuID09PSBudWxsIHx8IHR5cGVvZiBzdWJTcGVjaW1lbiAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IHBhdGgubGVuZ3RoID09PSAwXG4gICAgICAgID8gRmFpbGBzcGVjaW1lbiBtdXN0IGJlIGFuIG9iamVjdCBmb3IgcGVybWl0ICR7cShwZXJtaXQpfWBcbiAgICAgICAgOiBGYWlsYHNwZWNpbWVuIGF0IHBhdGggJHtxKHBhdGgpfSBtdXN0IGJlIGFuIG9iamVjdCBmb3IgcGVybWl0ICR7cShzdWJQZXJtaXQpfWA7XG4gICAgfVxuICAgIGNvbnN0IHBpY2tzID0gT2JqZWN0LmVudHJpZXMoc3ViUGVybWl0KS5tYXAoKFtzdWJLZXksIGRlZXBQZXJtaXRdKSA9PiB7XG4gICAgICBpZiAoIU9iamVjdC5oYXNPd24oc3ViU3BlY2ltZW4sIHN1YktleSkpIHtcbiAgICAgICAgdGhyb3cgRmFpbGBzcGVjaW1lbiBpcyBtaXNzaW5nIHBhdGggJHtxKHBhdGguY29uY2F0KHN1YktleSkpfWA7XG4gICAgICB9XG4gICAgICBjb25zdCBkZWVwU3BlY2ltZW4gPSBSZWZsZWN0LmdldChzdWJTcGVjaW1lbiwgc3ViS2V5KTtcbiAgICAgIGlmIChkZWVwUGVybWl0ID09PSB0cnVlIHx8IHR5cGVvZiBkZWVwUGVybWl0ID09PSAnc3RyaW5nJykge1xuICAgICAgICByZXR1cm4gW3N1YktleSwgZGVlcFNwZWNpbWVuXTtcbiAgICAgIH1cbiAgICAgIHBhdGgucHVzaChzdWJLZXkpO1xuICAgICAgY29uc3QgZXh0cmFjdGVkID0gZXh0cmFjdCgvKiogQHR5cGUge2FueX0gKi8gKGRlZXBTcGVjaW1lbiksIGRlZXBQZXJtaXQpO1xuICAgICAgY29uc3QgZW50cnkgPSBbc3ViS2V5LCBleHRyYWN0ZWRdO1xuICAgICAgcGF0aC5wb3AoKTtcbiAgICAgIHJldHVybiBlbnRyeTtcbiAgICB9KTtcbiAgICByZXR1cm4gdHJhbnNmb3JtKE9iamVjdC5mcm9tRW50cmllcyhwaWNrcyksIHN1YlBlcm1pdCk7XG4gIH07XG5cbiAgLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbiAgcmV0dXJuIGV4dHJhY3Qoc3BlY2ltZW4sIHBlcm1pdCk7XG59O1xuXG4vKiogQHR5cGUge0l0ZXJhdG9yUmVzdWx0PHVuZGVmaW5lZCwgbmV2ZXI+fSAqLyRozY9fb25jZS5hdHRlbnVhdGUoYXR0ZW51YXRlKTtcbmNvbnN0IG5vdERvbmUgPSBoYXJkZW4oeyBkb25lOiBmYWxzZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcblxuLyoqIEB0eXBlIHtJdGVyYXRvclJlc3VsdDxuZXZlciwgdm9pZD59ICovXG5jb25zdCBhbHdheXNEb25lID0gaGFyZGVuKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcblxuICAgICAgIGNvbnN0IGZvcmV2ZXIgPSBhc3luY0dlbmVyYXRlKCgpID0+IG5vdERvbmUpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0geygpID0+IFR9IHByb2R1Y2UgVGhlIHZhbHVlIG9mIGBhd2FpdCBwcm9kdWNlKClgIGlzIHVzZWQgZm9yIGl0c1xuICogICB0cnV0aGluZXNzIHZzIGZhbHNpbmVzcy4gSU9XLCBpdCBpcyBjb2VyY2VkIHRvIGEgYm9vbGVhbiBzbyB0aGUgY2FsbGVyIG5lZWRcbiAqICAgbm90IGJvdGhlciBkb2luZyB0aGlzIHRoZW1zZWx2ZXMuXG4gKiBAcmV0dXJucyB7QXN5bmNJdGVyYWJsZTxBd2FpdGVkPFQ+Pn1cbiAqLyRozY9fb25jZS5mb3JldmVyKGZvcmV2ZXIpO1xuICAgICAgIGNvbnN0IHdoaWxlVHJ1ZSA9IHByb2R1Y2UgPT5cbiAgYXN5bmNHZW5lcmF0ZShhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSBhd2FpdCBwcm9kdWNlKCk7XG4gICAgaWYgKCF2YWx1ZSkge1xuICAgICAgcmV0dXJuIGFsd2F5c0RvbmU7XG4gICAgfVxuICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgZG9uZTogZmFsc2UsXG4gICAgICB2YWx1ZSxcbiAgICB9KTtcbiAgfSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7KCkgPT4gVH0gcHJvZHVjZSBUaGUgdmFsdWUgb2YgYGF3YWl0IHByb2R1Y2UoKWAgaXMgdXNlZCBmb3IgaXRzXG4gKiAgIHRydXRoaW5lc3MgdnMgZmFsc2luZXNzLiBJT1csIGl0IGlzIGNvZXJjZWQgdG8gYSBib29sZWFuIHNvIHRoZSBjYWxsZXIgbmVlZFxuICogICBub3QgYm90aGVyIGRvaW5nIHRoaXMgdGhlbXNlbHZlcy5cbiAqIEByZXR1cm5zIHtBc3luY0l0ZXJhYmxlPEF3YWl0ZWQ8VD4+fVxuICovJGjNj19vbmNlLndoaWxlVHJ1ZSh3aGlsZVRydWUpO1xuICAgICAgIGNvbnN0IHVudGlsVHJ1ZSA9IHByb2R1Y2UgPT5cbiAgYXN5bmNHZW5lcmF0ZShhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgdmFsdWUgPSBhd2FpdCBwcm9kdWNlKCk7XG4gICAgaWYgKHZhbHVlKSB7XG4gICAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgICAgZG9uZTogdHJ1ZSxcbiAgICAgICAgdmFsdWUsXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICBkb25lOiBmYWxzZSxcbiAgICAgIHZhbHVlLFxuICAgIH0pO1xuICB9KTtcblxuLyoqIEB0eXBlIHs8WCwgWT4oeHM6IFhbXSwgeXM6IFlbXSkgPT4gW1gsIFldW119ICovJGjNj19vbmNlLnVudGlsVHJ1ZSh1bnRpbFRydWUpO1xuICAgICAgIGNvbnN0IHppcCA9ICh4cywgeXMpID0+IGhhcmRlbih4cy5tYXAoKHgsIGkpID0+IFt4LCB5c1sraV1dKSk7XG5cbi8qKlxuICogQHR5cGUgezxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgRVJlZjxhbnk+Pj4oXG4gKiAgIG9iajogVCxcbiAqICkgPT4gUHJvbWlzZTx7IFtLIGluIGtleW9mIFRdOiBBd2FpdGVkPFRbS10+IH0+fVxuICovJGjNj19vbmNlLnppcCh6aXApO1xuICAgICAgIGNvbnN0IGFsbFZhbHVlcyA9IGFzeW5jIG9iaiA9PiB7XG4gIGNvbnN0IHJlc29sdmVkID0gYXdhaXQgUHJvbWlzZS5hbGwodmFsdWVzKG9iaikpO1xuICAvKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuICByZXR1cm4gaGFyZGVuKGZyb21FbnRyaWVzKHppcChrZXlzKG9iaiksIHJlc29sdmVkKSkpO1xufTtcblxuLyoqXG4gKiBBIHRlZSBpbXBsZW1lbnRhdGlvbiB3aGVyZSBhbGwgcmVhZGVycyBhcmUgc3luY2hyb25pemVkIHdpdGggZWFjaCBvdGhlci4gVGhleVxuICogYWxsIGNvbnN1bWUgdGhlIHNvdXJjZSBzdHJlYW0gaW4gbG9ja3N0ZXAsIGFuZCBhbnkgb25lIHJldHVybmluZyBvciB0aHJvd2luZ1xuICogZWFybHkgd2lsbCBhZmZlY3QgdGhlIG90aGVycy5cbiAqXG4gKiBAdGVtcGxhdGUgW1Q9dW5rbm93bl1cbiAqIEBwYXJhbSB7QXN5bmNJdGVyYXRvcjxULCB2b2lkLCB2b2lkPn0gc291cmNlU3RyZWFtXG4gKiBAcGFyYW0ge251bWJlcn0gcmVhZGVyQ291bnRcbiAqLyRozY9fb25jZS5hbGxWYWx1ZXMoYWxsVmFsdWVzKTtcbiAgICAgICBjb25zdCBzeW5jaHJvbml6ZWRUZWUgPSAoc291cmNlU3RyZWFtLCByZWFkZXJDb3VudCkgPT4ge1xuICAvKiogQHR5cGUge0l0ZXJhdG9yUmV0dXJuUmVzdWx0PHZvaWQ+IHwgdW5kZWZpbmVkfSAqL1xuICBsZXQgZG9uZVJlc3VsdDtcblxuICAvKipcbiAqIEB0eXBlZGVmIHtJdGVyYXRvclJlc3VsdDxcbiAqICAgKHZhbHVlOiBQcm9taXNlTGlrZTxJdGVyYXRvclJlc3VsdDxUPj4pID0+IHZvaWRcbiAqID59IFF1ZXVlUGF5bG9hZFxuICovXG4gIC8qKiBAdHlwZSB7QXN5bmNRdWV1ZTxRdWV1ZVBheWxvYWQ+W119ICovXG4gIGNvbnN0IHF1ZXVlcyA9IFtdO1xuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gKi9cbiAgY29uc3QgcHVsbE5leHQgPSBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgcmVxdWVzdHMgPSBhd2FpdCBQcm9taXNlLmFsbFNldHRsZWQocXVldWVzLm1hcChxdWV1ZSA9PiBxdWV1ZS5nZXQoKSkpO1xuICAgIGNvbnN0IHJlamVjdGlvbnMgPSBbXTtcbiAgICAvKiogQHR5cGUge0FycmF5PCh2YWx1ZTogUHJvbWlzZUxpa2U8SXRlcmF0b3JSZXN1bHQ8VD4+KSA9PiB2b2lkPn0gKi9cbiAgICBjb25zdCByZXNvbHZlcnMgPSBbXTtcbiAgICBsZXQgZG9uZSA9IGZhbHNlO1xuICAgIGZvciAoY29uc3Qgc2V0dGxlZFJlc3VsdCBvZiByZXF1ZXN0cykge1xuICAgICAgaWYgKHNldHRsZWRSZXN1bHQuc3RhdHVzID09PSAncmVqZWN0ZWQnKSB7XG4gICAgICAgIHJlamVjdGlvbnMucHVzaChzZXR0bGVkUmVzdWx0LnJlYXNvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBkb25lIHx8PSAhIXNldHRsZWRSZXN1bHQudmFsdWUuZG9uZTtcbiAgICAgICAgcmVzb2x2ZXJzLnB1c2goc2V0dGxlZFJlc3VsdC52YWx1ZS52YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICAgIC8qKiBAdHlwZSB7UHJvbWlzZTxJdGVyYXRvclJlc3VsdDxUPj59ICovXG4gICAgbGV0IHJlc3VsdDtcbiAgICBpZiAoZG9uZVJlc3VsdCkge1xuICAgICAgcmVzdWx0ID0gUHJvbWlzZS5yZXNvbHZlKGRvbmVSZXN1bHQpO1xuICAgIH0gZWxzZSBpZiAocmVqZWN0aW9ucy5sZW5ndGgpIHtcbiAgICAgIGNvbnN0IGVycm9yID0gbWFrZUVycm9yKFhgVGVlZCBzdHJlYW0gdGhyZXdgKTtcbiAgICAgIGFubm90YXRlRXJyb3IoZXJyb3IsIFhgVGVlZCByZWplY3Rpb25zOiAke3JlamVjdGlvbnN9YCk7XG4gICAgICByZXN1bHQgPVxuICAgICAgICBzb3VyY2VTdHJlYW0udGhyb3c/LihlcnJvcikgfHxcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHNvdXJjZVN0cmVhbS5yZXR1cm4/LigpKS50aGVuKCgpID0+XG4gICAgICAgICAgUHJvbWlzZS5yZWplY3QoZXJyb3IpLFxuICAgICAgICApO1xuICAgIH0gZWxzZSBpZiAoZG9uZSkge1xuICAgICAgcmVzdWx0ID1cbiAgICAgICAgc291cmNlU3RyZWFtLnJldHVybj8uKCkgfHxcbiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVzdWx0ID0gc291cmNlU3RyZWFtLm5leHQoKTtcbiAgICB9XG4gICAgcmVzdWx0LnRoZW4oXG4gICAgICByID0+IHtcbiAgICAgICAgaWYgKHIuZG9uZSkge1xuICAgICAgICAgIGRvbmVSZXN1bHQgPSByO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgKCkgPT4ge1xuICAgICAgICBkb25lUmVzdWx0ID0geyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH07XG4gICAgICB9LFxuICAgICk7XG4gICAgZm9yIChjb25zdCByZXNvbHZlIG9mIHJlc29sdmVycykge1xuICAgICAgcmVzb2x2ZShyZXN1bHQpO1xuICAgIH1cbiAgICByZXR1cm4gcHVsbE5leHQoKTtcbiAgfTtcblxuICBjb25zdCByZWFkZXJzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogcmVhZGVyQ291bnQgfSkubWFwKCgpID0+IHtcbiAgICAvKiogQHR5cGUge0FzeW5jUXVldWU8UXVldWVQYXlsb2FkPn0gKi9cbiAgICBjb25zdCBxdWV1ZSA9IG1ha2VRdWV1ZSgpO1xuICAgIHF1ZXVlcy5wdXNoKHF1ZXVlKTtcblxuICAgIC8qKiBAdHlwZSB7QXN5bmNHZW5lcmF0b3I8VCwgdm9pZCwgdm9pZD59ICovXG4gICAgY29uc3QgcmVhZGVyID0gaGFyZGVuKHtcbiAgICAgIGFzeW5jIG5leHQoKSB7XG4gICAgICAgIC8qKlxuICogQHR5cGUge1Byb21pc2VLaXQ8SXRlcmF0b3JSZXN1bHQ8VD4+fVxuICovXG4gICAgICAgIGNvbnN0IHsgcHJvbWlzZSwgcmVzb2x2ZSB9ID0gbWFrZVByb21pc2VLaXQoKTtcbiAgICAgICAgcXVldWUucHV0KHsgdmFsdWU6IHJlc29sdmUsIGRvbmU6IGZhbHNlIH0pO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICAgIH0sXG4gICAgICBhc3luYyByZXR1cm4oKSB7XG4gICAgICAgIC8qKlxuICogQHR5cGUge1Byb21pc2VLaXQ8SXRlcmF0b3JSZXN1bHQ8VD4+fVxuICovXG4gICAgICAgIGNvbnN0IHsgcHJvbWlzZSwgcmVzb2x2ZSB9ID0gbWFrZVByb21pc2VLaXQoKTtcbiAgICAgICAgcXVldWUucHV0KHsgdmFsdWU6IHJlc29sdmUsIGRvbmU6IHRydWUgfSk7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgICAgfSxcbiAgICAgIGFzeW5jIHRocm93KHJlYXNvbikge1xuICAgICAgICBjb25zdCByZWplY3Rpb24gPSBQcm9taXNlLnJlamVjdChyZWFzb24pO1xuICAgICAgICBxdWV1ZS5wdXQocmVqZWN0aW9uKTtcbiAgICAgICAgcmV0dXJuIHJlamVjdGlvbjtcbiAgICAgIH0sXG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzKi9cbiAgICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICAgIHJldHVybiByZWFkZXI7XG4gICAgICB9LFxuICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFscyovXG4gICAgICBhc3luYyBbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKSB7XG4gICAgICAgIGF3YWl0IHJlYWRlci5yZXR1cm4oKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gICAgcmV0dXJuIHJlYWRlcjtcbiAgfSk7XG5cbiAgdm9pZCBwdWxsTmV4dCgpO1xuICByZXR1cm4gcmVhZGVycztcbn07JGjNj19vbmNlLnN5bmNocm9uaXplZFRlZShzeW5jaHJvbml6ZWRUZWUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnsib2JqZWN0TWFwIjpbIm9iamVjdE1hcCIsZmFsc2VdLCJvYmplY3RNZXRhTWFwIjpbIm9iamVjdE1ldGFNYXAiLGZhbHNlXSwiZnJvbVVuaXF1ZUVudHJpZXMiOlsiZnJvbVVuaXF1ZUVudHJpZXMiLGZhbHNlXX0sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTGltaXRlZENvbnNvbGUiOlsibWFrZUxpbWl0ZWRDb25zb2xlIl0sImRlZXBseUZ1bGZpbGxlZE9iamVjdCI6WyJkZWVwbHlGdWxmaWxsZWRPYmplY3QiXSwic3RyaXBQcmVmaXgiOlsic3RyaXBQcmVmaXgiXSwidGhyb3dFcnJvckNvZGUiOlsidGhyb3dFcnJvckNvZGUiXSwidHJ5Tm93IjpbInRyeU5vdyJdLCJ0cnlKc29uUGFyc2UiOlsidHJ5SnNvblBhcnNlIl0sIlByb21pc2VBbGxPckVycm9ycyI6WyJQcm9taXNlQWxsT3JFcnJvcnMiXSwiYWdncmVnYXRlVHJ5RmluYWxseSI6WyJhZ2dyZWdhdGVUcnlGaW5hbGx5Il0sIndpdGhEZWZlcnJlZENsZWFudXAiOlsid2l0aERlZmVycmVkQ2xlYW51cCJdLCJhc3NlcnRBbGxEZWZpbmVkIjpbImFzc2VydEFsbERlZmluZWQiXSwiYXR0ZW51YXRlIjpbImF0dGVudWF0ZSJdLCJmb3JldmVyIjpbImZvcmV2ZXIiXSwid2hpbGVUcnVlIjpbIndoaWxlVHJ1ZSJdLCJ1bnRpbFRydWUiOlsidW50aWxUcnVlIl0sInppcCI6WyJ6aXAiXSwiYWxsVmFsdWVzIjpbImFsbFZhbHVlcyJdLCJzeW5jaHJvbml6ZWRUZWUiOlsic3luY2hyb25pemVkVGVlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANHeDdCREgAAkRIAACwAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdGVzdGluZy11dGlscy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiZXZlbnRMb29wSXRlcmF0aW9uIiwiaW5zcGVjdE1hcFN0b3JlIiwidGVzdEludGVycnVwdGVkU3RlcHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogQHRzLWNoZWNrKi9cbi8qKlxuICogQGZpbGUgbm90ZSB0aGlzIGNhbm5vdCBiZSBjYWxsZWQgdGVzdC11dGlscy5qcyBkdWUgdG9cbiAqICAgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy83NTAzXG4gKi9cbi8qIGdsb2JhbCBzZXRJbW1lZGlhdGUgKi9cbi8qKlxuICogQGltcG9ydCB7TWFwU3RvcmV9IGZyb20gJ0BhZ29yaWMvc3RvcmUnO1xuICogQGltcG9ydCB7RXhlY3V0aW9uQ29udGV4dCBhcyBBdmFUfSBmcm9tICdhdmEnO1xuICogQGltcG9ydCB7RVJlZn0gZnJvbSAnQGVuZG8vZXZlbnR1YWwtc2VuZCc7XG4gKi9cblxuLyoqXG4gKiBBIHdvcmthcm91bmQgZm9yIHNvbWUgaXNzdWVzIHdpdGggZmFrZSB0aW1lIGluIHRlc3RzLlxuICpcbiAqIExpbmVzIG9mIHRlc3QgY29kZSBjYW4gZGVwZW5kIG9uIGFzeW5jIHByb21pc2VzIG91dHNpZGUgdGhlIHRlc3QgcmVzb2x2aW5nXG4gKiBiZWZvcmUgdGhleSBydW4uIEF3YWl0aW5nIHRoaXMgZnVuY3Rpb24gcmVzdWx0IGVuc3VyZXMgdGhhdCBhbGwgcHJvbWlzZXMgdGhhdFxuICogY2FuIGRvIHJlc29sdmUuIE5vdGUgdGhhdCB0aGlzIGRvZXNuJ3QgbWVhbiBhbGwgb3V0c3RhbmRpbmcgcHJvbWlzZXMuXG4gKi9cbiAgICAgICBjb25zdCBldmVudExvb3BJdGVyYXRpb24gPSBhc3luYyAoKSA9PlxuICBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldEltbWVkaWF0ZShyZXNvbHZlKSk7JGjNj19vbmNlLmV2ZW50TG9vcEl0ZXJhdGlvbihldmVudExvb3BJdGVyYXRpb24pO1xuaGFyZGVuKGV2ZW50TG9vcEl0ZXJhdGlvbik7XG5cbi8qKiBAdHlwZSB7KHZhbHVlOiBhbnkpID0+IHN0cmluZ30gKi9cbmNvbnN0IHN0cmluZ09yVGFnID0gdmFsdWUgPT4ge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIFN5bWJvbC50b1N0cmluZ1RhZyBpbiB2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZVtTeW1ib2wudG9TdHJpbmdUYWddO1xuICB9XG4gIHJldHVybiBTdHJpbmcodmFsdWUpO1xufTtcbi8qKlxuICogQHBhcmFtIHtNYXBTdG9yZX0gc3RvcmVcbiAqIEByZXR1cm5zIHtvYmplY3R9IHRyZWUgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSBzdG9yZVxuICovXG4gICAgICAgY29uc3QgaW5zcGVjdE1hcFN0b3JlID0gc3RvcmUgPT4ge1xuICAvKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSAqL1xuICBjb25zdCBvYmogPSB7fTtcbiAgZm9yIChjb25zdCBrZXkgb2Ygc3RvcmUua2V5cygpKSB7XG4gICAgY29uc3QgdmFsdWUgPSBzdG9yZS5nZXQoa2V5KTtcbiAgICBjb25zdCBoYXNLZXlzID1cbiAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT0gbnVsbCAmJiAna2V5cycgaW4gdmFsdWU7XG4gICAgY29uc3QgaW5kZXggPSBzdHJpbmdPclRhZyhrZXkpO1xuICAgIGlmIChoYXNLZXlzICYmICdnZXQnIGluIHZhbHVlKSB7XG4gICAgICBvYmpbaW5kZXhdID0gaW5zcGVjdE1hcFN0b3JlKHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKGhhc0tleXMpIHtcbiAgICAgIG9ialtpbmRleF0gPSBBcnJheS5mcm9tKHZhbHVlLmtleXMoKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9ialtpbmRleF0gPVxuICAgICAgICB2YWx1ZSBpbnN0YW5jZW9mIE9iamVjdCAmJiBTeW1ib2wudG9TdHJpbmdUYWcgaW4gdmFsdWVcbiAgICAgICAgICA/IHZhbHVlW1N5bWJvbC50b1N0cmluZ1RhZ11cbiAgICAgICAgICA6IHZhbHVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gb2JqO1xufTskaM2PX29uY2UuaW5zcGVjdE1hcFN0b3JlKGluc3BlY3RNYXBTdG9yZSk7XG5oYXJkZW4oaW5zcGVjdE1hcFN0b3JlKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgW0lucHV0PWFueV1cbiAqIEB0eXBlZGVmIHtyZWFkb25seSBbXG4gKiAgIHN0ZXBOYW1lOiBzdHJpbmcsXG4gKiAgIGZuOiAoaW5wdXQ6IFBhcnRpYWw8SW5wdXQ+LCBsYWJlbDogc3RyaW5nKSA9PiBQYXJ0aWFsPElucHV0PiB8IFByb21pc2VMaWtlPFBhcnRpYWw8SW5wdXQ+PixcbiAqIF19IFRlc3RTdGVwXG4gKi9cblxuLyoqXG4gKiBGb3IgZWFjaCBzdGVwLCBydW4gdG8ganVzdCBiZWZvcmUgdGhhdCBwb2ludCBhbmQgcGF1c2UgZm9yIGNvbnRpbnVhdGlvbiBhZnRlclxuICogaW50ZXJydXB0LlxuICpcbiAqIEB0ZW1wbGF0ZSBbSW5wdXQ9YW55XVxuICogQHRlbXBsYXRlIFtDb250ZXh0PXVua25vd25dXG4gKiBAcGFyYW0ge0F2YVQ8Q29udGV4dD59IHRcbiAqIEBwYXJhbSB7cmVhZG9ubHkgVGVzdFN0ZXA8SW5wdXQ+W119IGFsbFN0ZXBzXG4gKiBAcGFyYW0geyh0OiBBdmFUPENvbnRleHQ+KSA9PiBFUmVmPHZvaWQ+fSBbZG9JbnRlcnJ1cHRdXG4gKi9cbiAgICAgICBjb25zdCB0ZXN0SW50ZXJydXB0ZWRTdGVwcyA9IGFzeW5jICh0LCBhbGxTdGVwcywgZG9JbnRlcnJ1cHQpID0+IHtcbiAgLyoqXG4gKiBAdHlwZWRlZiB7e1xuICogICBsYWJlbDogc3RyaW5nO1xuICogICBhY2N1bTogUGFydGlhbDxJbnB1dD47XG4gKiB9fSBSdW5TdGF0ZVxuICovXG5cbiAgLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWxcbiAqIEBwYXJhbSB7cmVhZG9ubHkgVGVzdFN0ZXA8SW5wdXQ+W119IHN0ZXBzXG4gKiBAcGFyYW0ge1J1blN0YXRlfSBbcnVuU3RhdGVdXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxSdW5TdGF0ZT59XG4gKi9cbiAgY29uc3QgcnVuU3RlcHMgPSBhc3luYyAobGFiZWwsIHN0ZXBzLCBydW5TdGF0ZSA9IHsgbGFiZWwsIGFjY3VtOiB7fSB9KSA9PiB7XG4gICAgYXdhaXQgbnVsbDtcbiAgICBsZXQgYWNjdW0gPSBydW5TdGF0ZS5hY2N1bTtcbiAgICBjb25zdCBydW5MYWJlbCA9IHJ1blN0YXRlLmxhYmVsO1xuICAgIGZvciAoY29uc3QgW3N0ZXBOYW1lLCBmbl0gb2Ygc3RlcHMpIHtcbiAgICAgIGF3YWl0IHQubm90VGhyb3dzQXN5bmMoYXN5bmMgKCkgPT4ge1xuICAgICAgICBhY2N1bSA9IGF3YWl0IGZuKGFjY3VtLCBydW5MYWJlbCk7XG4gICAgICB9LCBgJHtsYWJlbH0gJHtzdGVwTmFtZX0gbXVzdCBjb21wbGV0ZSBzdWNjZXNzZnVsbHlgKTtcbiAgICB9XG4gICAgcmV0dXJuIHsgbGFiZWw6IHJ1bkxhYmVsLCBhY2N1bSB9O1xuICB9O1xuXG4gIC8qIFNhbml0eSBjaGVjayovXG4gIGF3YWl0IHJ1blN0ZXBzKCdwcmUtaW50ZXJydXB0JywgYWxsU3RlcHMpO1xuICBpZiAoIWRvSW50ZXJydXB0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLyoqXG4gKiBAdHlwZSB7e1xuICogICBydW5TdGF0ZTogUnVuU3RhdGU7XG4gKiAgIHJlbWFpbmluZ1N0ZXBzOiByZWFkb25seSBUZXN0U3RlcDxJbnB1dD5bXTtcbiAqIH1bXX1cbiAqL1xuICBjb25zdCBwYXVzZWRSdW5zID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYWxsU3RlcHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBjb25zdCBbYmVmb3JlU3RlcE5hbWVdID0gYWxsU3RlcHNbaV07XG4gICAgY29uc3QgcnVuU3RhdGUgPSBhd2FpdCBydW5TdGVwcyhcbiAgICAgIGBwcmUtJHtiZWZvcmVTdGVwTmFtZX1gLFxuICAgICAgYWxsU3RlcHMuc2xpY2UoMCwgaSksXG4gICAgICB7IGxhYmVsOiBgcGF1c2UtYmVmb3JlLSR7YmVmb3JlU3RlcE5hbWV9YCwgYWNjdW06IHt9IH0sXG4gICAgKTtcbiAgICBwYXVzZWRSdW5zLnB1c2goeyBydW5TdGF0ZSwgcmVtYWluaW5nU3RlcHM6IGFsbFN0ZXBzLnNsaWNlKGkpIH0pO1xuICB9XG5cbiAgLyogUnVuIHRoZSB1c2VyIGNvZGUgdGhhdCBpbnRlcnJ1cHRzIHRoZSBzdGVwcy4qL1xuICBhd2FpdCBkb0ludGVycnVwdCh0KTtcblxuICAvKiBWZXJpZnkgYSBjb21wbGV0ZSBydW4gcG9zdC1pbnRlcnJ1cHQuKi9cbiAgYXdhaXQgcnVuU3RlcHMoJ3Bvc3QtaW50ZXJydXB0JywgYWxsU3RlcHMpO1xuXG4gIC8qIFZlcmlmeSBjb21wbGV0aW9uIG9mIGVhY2ggcGF1c2VkIHN0ZXAuKi9cbiAgZm9yIChjb25zdCB7IHJ1blN0YXRlLCByZW1haW5pbmdTdGVwcyB9IG9mIHBhdXNlZFJ1bnMpIHtcbiAgICBjb25zdCBbYmVmb3JlU3RlcE5hbWVdID0gcmVtYWluaW5nU3RlcHNbMF07XG4gICAgYXdhaXQgcnVuU3RlcHMoYHJlc3VtZWQtJHtiZWZvcmVTdGVwTmFtZX1gLCByZW1haW5pbmdTdGVwcywgcnVuU3RhdGUpO1xuICB9XG59OyRozY9fb25jZS50ZXN0SW50ZXJydXB0ZWRTdGVwcyh0ZXN0SW50ZXJydXB0ZWRTdGVwcyk7XG5oYXJkZW4odGVzdEludGVycnVwdGVkU3RlcHMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZXZlbnRMb29wSXRlcmF0aW9uIjpbImV2ZW50TG9vcEl0ZXJhdGlvbiJdLCJpbnNwZWN0TWFwU3RvcmUiOlsiaW5zcGVjdE1hcFN0b3JlIl0sInRlc3RJbnRlcnJ1cHRlZFN0ZXBzIjpbInRlc3RJbnRlcnJ1cHRlZFN0ZXBzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANqI2yvWAwAA1gMAACUAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdG1wRGlyLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlVGVtcERpckZhY3RvcnkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyoqXG4gKiBDcmVhdGUgYSBgdG1wRGlyYCBmdW5jdGlvbiB0aGF0IHN5bmNocm9ub3VzbHkgY3JlYXRlcyBhIHRlbXBvcmFyeSBkaXJlY3RvcnlcbiAqIGFuZCBhIGZ1bmN0aW9uIGZvciBkZWxldGluZyBpdCBhbG9uZyB3aXRoIGFueSBhZGRlZCBjb250ZW50cy5cbiAqXG4gKiBAcGFyYW0ge1BpY2s8SU1QT1JUKCd0bXAnKSwgJ2RpclN5bmMnPn0gdG1wXG4gKi9cbiAgICAgICBjb25zdCBtYWtlVGVtcERpckZhY3RvcnkgPSB0bXAgPT4ge1xuICAvKiogQHR5cGUgeyhwcmVmaXg/OiBzdHJpbmcpID0+IFtkaXJOYW1lOiBzdHJpbmcsIGNsZWFudXA6ICgpID0+IHZvaWRdfSAqL1xuICBjb25zdCB0bXBEaXIgPSBwcmVmaXggPT4ge1xuICAgIGNvbnN0IHsgbmFtZSwgcmVtb3ZlQ2FsbGJhY2sgfSA9IHRtcC5kaXJTeW5jKHtcbiAgICAgIHByZWZpeCxcbiAgICAgIHVuc2FmZUNsZWFudXA6IHRydWUsXG4gICAgfSk7XG4gICAgcmV0dXJuIFtuYW1lLCByZW1vdmVDYWxsYmFja107XG4gIH07XG4gIHJldHVybiB0bXBEaXI7XG59OyRozY9fb25jZS5tYWtlVGVtcERpckZhY3RvcnkobWFrZVRlbXBEaXJGYWN0b3J5KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VUZW1wRGlyRmFjdG9yeSI6WyJtYWtlVGVtcERpckZhY3RvcnkiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAATmKnlqEEAAChBAAAKAAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy90eXBlQ2hlY2suanN7ImltcG9ydHMiOlsiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJjYXN0IiwibXVzdE1hdGNoIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgdHlwZWxlc3NNdXN0TWF0Y2g7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAodHlwZWxlc3NNdXN0TWF0Y2ggPSAkaM2PX2EpXV1dXV0pO1xuXG5cbi8qKlxuICogQGltcG9ydCB7TXVzdE1hdGNoLCBQYXR0ZXJuVHlwZSwgVHlwZWRQYXR0ZXJufSBmcm9tICcuL3R5cGVzLmpzJztcbiAqL1xuXG4vKiogQHR5cGUge011c3RNYXRjaH0gKi9cbiAgICAgICBjb25zdCBtdXN0TWF0Y2ggPSB0eXBlbGVzc011c3RNYXRjaDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgTVxuICogQHBhcmFtIHt1bmtub3dufSBzcGVjaW1lblxuICogQHBhcmFtIHtUeXBlZFBhdHRlcm48TT59IHBhdHRcbiAqIEByZXR1cm5zIHtNfVxuICovJGjNj19vbmNlLm11c3RNYXRjaChtdXN0TWF0Y2gpO1xuICAgICAgIGNvbnN0IGNhc3QgPSAoc3BlY2ltZW4sIHBhdHQpID0+IHtcbiAgLyogbXVzdE1hdGNoIHRocm93cyBpZiB0aGV5IGRvbid0LCB3aGljaCBtZWFucyB0aGF0IGBjYXN0YCBhbHNvIG5hcnJvd3MgdGhlKi9cbiAgLyogdHlwZSBidXQgYSBmdW5jdGlvbiBjYW4ndCBib3RoIG5hcnJvdyBhbmQgcmV0dXJuIGEgdHlwZS4gVGhhdCBpcyBieSBkZXNpZ246Ki9cbiAgLyogaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8zNDYzNiNpc3N1ZWNvbW1lbnQtNTQ1MDI1OTE2Ki9cbiAgbXVzdE1hdGNoKHNwZWNpbWVuLCBwYXR0KTtcbiAgcmV0dXJuIHNwZWNpbWVuO1xufTskaM2PX29uY2UuY2FzdChjYXN0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im11c3RNYXRjaCI6WyJtdXN0TWF0Y2giXSwiY2FzdCI6WyJjYXN0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKt8dcSjBQAAowUAACkAAABAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbIkJyaWRnZUJpZ0ludFNoYXBlIiwiU3RvcmFnZU5vZGVTaGFwZSIsIlVuZ3VhcmRlZEhlbHBlckkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBNOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtUeXBlZFBhdHRlcm59IGZyb20gJy4vdHlwZXMuanMnO1xuICovXG5cbiAgICAgICBjb25zdCBTdG9yYWdlTm9kZVNoYXBlID0gTS5yZW1vdGFibGUoJ1N0b3JhZ2VOb2RlJyk7XG5cbi8qKiBUbyBiZSB1c2VkIG9ubHkgZm9yICdoZWxwZXInIGZhY2V0cyB3aGVyZSB0aGUgY2FsbHMgYXJlIGZyb20gdHJ1c3RlZCBjb2RlLiAqLyRozY9fb25jZS5TdG9yYWdlTm9kZVNoYXBlKFN0b3JhZ2VOb2RlU2hhcGUpO1xuICAgICAgIGNvbnN0IFVuZ3VhcmRlZEhlbHBlckkgPSBNLmludGVyZmFjZShcbiAgJ2hlbHBlcicsXG4gIHt9LFxuICAvKiBub3QgZXhwb3NlZCBzbyB1c2luZyBgZGVmYXVsdEd1YXJkc2AgaXMgZmluZS4qL1xuICB7IGRlZmF1bHRHdWFyZHM6ICdwYXNzYWJsZScgfSxcbik7XG5cbi8qKlxuICogQHR5cGVkZWYge251bWJlciB8IGAke2JpZ2ludH1gfSBCcmlkZ2VCaWdJbnQgRW5zdXJlIHRoYXQgY2FsbGVlcyBwYXNzZWQgYVxuICogICBicmlkZ2UgbWVzc2FnZSB0aGF0IHdhcyBzZXJpYWxpc2VkIGZyb20gYSBHb2xhbmcgaW50NjQgb3IgdWludDY0IGFjY2VwdFxuICogICBlaXRoZXIgYSBKUyBudW1iZXIgb3IgYSBzdHJpbmdpZmllZCBKUyBiaWdpbnQuXG4gKi9cblxuLyoqXG4gKiBAdHlwZSB7VHlwZWRQYXR0ZXJuPEJyaWRnZUJpZ0ludD59XG4gKi8kaM2PX29uY2UuVW5ndWFyZGVkSGVscGVySShVbmd1YXJkZWRIZWxwZXJJKTtcbiAgICAgICBjb25zdCBCcmlkZ2VCaWdJbnRTaGFwZSA9IE0ub3IoTS5udW1iZXIoKSwgTS5zdHJpbmcoKSk7JGjNj19vbmNlLkJyaWRnZUJpZ0ludFNoYXBlKEJyaWRnZUJpZ0ludFNoYXBlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlN0b3JhZ2VOb2RlU2hhcGUiOlsiU3RvcmFnZU5vZGVTaGFwZSJdLCJVbmd1YXJkZWRIZWxwZXJJIjpbIlVuZ3VhcmRlZEhlbHBlckkiXSwiQnJpZGdlQmlnSW50U2hhcGUiOlsiQnJpZGdlQmlnSW50U2hhcGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAKgAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy90eXBlcy1pbmRleC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADXhxk9cAwAAHAMAAAqAAAAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3VwZ3JhZGUtYXBpLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3BhdHRlcm5zIl0sImV4cG9ydHMiOlsiVXBncmFkZURpc2Nvbm5lY3Rpb25TaGFwZSIsImlzQWJhbmRvbmVkRXJyb3IiLCJpc1VwZ3JhZGVEaXNjb25uZWN0aW9uIiwibWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgTSxtYXRjaGVzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcIm1hdGNoZXNcIixbJGjNj19hID0+IChtYXRjaGVzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuY29uc3QgeyBpc0Zyb3plbiB9ID0gT2JqZWN0O1xuXG4vKipcbiAqIEFuIEVycm9yLWxpa2Ugb2JqZWN0IGZvciB1c2UgYXMgdGhlIHJlamVjdGlvbiByZWFzb24gb2YgcHJvbWlzZXMgYWJhbmRvbmVkIGJ5XG4gKiB1cGdyYWRlLlxuICpcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIG5hbWU6ICd2YXRVcGdyYWRlZCc7XG4gKiAgIHVwZ3JhZGVNZXNzYWdlOiBzdHJpbmc7XG4gKiAgIGluY2FybmF0aW9uTnVtYmVyOiBudW1iZXI7XG4gKiB9fSBVcGdyYWRlRGlzY29ubmVjdGlvblxuICovXG5cbiAgICAgICBjb25zdCBVcGdyYWRlRGlzY29ubmVjdGlvblNoYXBlID0gaGFyZGVuKHtcbiAgbmFtZTogJ3ZhdFVwZ3JhZGVkJyxcbiAgdXBncmFkZU1lc3NhZ2U6IE0uc3RyaW5nKCksXG4gIGluY2FybmF0aW9uTnVtYmVyOiBNLm51bWJlcigpLFxufSk7XG5cbi8qKlxuICogTWFrZXMgYW4gRXJyb3ItbGlrZSBvYmplY3QgZm9yIHVzZSBhcyB0aGUgcmVqZWN0aW9uIHJlYXNvbiBvZiBwcm9taXNlc1xuICogYWJhbmRvbmVkIGJ5IHVwZ3JhZGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVwZ3JhZGVNZXNzYWdlXG4gKiBAcGFyYW0ge251bWJlcn0gdG9JbmNhcm5hdGlvbk51bWJlclxuICogQHJldHVybnMge1VwZ3JhZGVEaXNjb25uZWN0aW9ufVxuICovJGjNj19vbmNlLlVwZ3JhZGVEaXNjb25uZWN0aW9uU2hhcGUoVXBncmFkZURpc2Nvbm5lY3Rpb25TaGFwZSk7XG4gICAgICAgY29uc3QgbWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uID0gKHVwZ3JhZGVNZXNzYWdlLCB0b0luY2FybmF0aW9uTnVtYmVyKSA9PlxuICBoYXJkZW4oe1xuICAgIG5hbWU6ICd2YXRVcGdyYWRlZCcsXG4gICAgdXBncmFkZU1lc3NhZ2UsXG4gICAgaW5jYXJuYXRpb25OdW1iZXI6IHRvSW5jYXJuYXRpb25OdW1iZXIsXG4gIH0pOyRozY9fb25jZS5tYWtlVXBncmFkZURpc2Nvbm5lY3Rpb24obWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uKTtcbmhhcmRlbihtYWtlVXBncmFkZURpc2Nvbm5lY3Rpb24pO1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSByZWFzb24gSWYgYHJlYXNvbmAgaXMgbm90IGZyb3plbiwgaXQgY2Fubm90IGJlIGFuXG4gKiAgIFVwZ3JhZGVEaXNjb25uZWN0aW9uLCBzbyByZXR1cm5zIGZhbHNlIHdpdGhvdXQgZXZlbiBjaGVja2luZyBhZ2FpbnN0IHRoZVxuICogICBzaGFwZS5cbiAqIEByZXR1cm5zIHtyZWFzb24gaXMgVXBncmFkZURpc2Nvbm5lY3Rpb259XG4gKi9cbiAgICAgICBjb25zdCBpc1VwZ3JhZGVEaXNjb25uZWN0aW9uID0gcmVhc29uID0+XG4gIHJlYXNvbiAhPSBudWxsICYmIC8qIGVzbGludC1kaXNhYmxlLWxpbmUgZXFlcWVxKi9cbiAgaXNGcm96ZW4ocmVhc29uKSAmJlxuICBtYXRjaGVzKHJlYXNvbiwgVXBncmFkZURpc2Nvbm5lY3Rpb25TaGFwZSk7JGjNj19vbmNlLmlzVXBncmFkZURpc2Nvbm5lY3Rpb24oaXNVcGdyYWRlRGlzY29ubmVjdGlvbik7XG5oYXJkZW4oaXNVcGdyYWRlRGlzY29ubmVjdGlvbik7XG5cbi8qKlxuICogUmV0dXJucyB3aGV0aGVyIGEgcmVhc29uIGlzIGEgJ3ZhdCB0ZXJtaW5hdGVkJyBlcnJvciBnZW5lcmF0ZWQgd2hlbiBhbiBvYmplY3RcbiAqIGlzIGFiYW5kb25lZCBieSBhIHZhdCBkdXJpbmcgYW4gdXBncmFkZS5cbiAqXG4gKiBOb3JtYWxseSB3ZSBkbyBub3Qgd2FudCB0byByZWx5IG9uIHRoZSBgbWVzc2FnZWAgb2YgYW4gZXJyb3Igb2JqZWN0LCBidXQgdGhpc1xuICogaXMgYSBwcmFnbWF0aWMgc29sdXRpb24gdG8gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdmF0IHVwZ3JhZGUgZXJyb3JzLiBJbiB0aGVcbiAqIGZ1dHVyZSB3ZSdkIHByZWZlciBoYXZpbmcgYW4gZXJyb3Igd2l0aCBhIGNhdXNlIHJlZmVyZW5jaW5nIGEgZGlzY29ubmVjdGlvblxuICogb2JqZWN0IGxpa2UgZm9yIHByb21pc2UgcmVqZWN0aW9ucy4gU2VlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzk1ODJcbiAqXG4gKiBAcGFyYW0ge2FueX0gcmVhc29uXG4gKiBAcmV0dXJucyB7cmVhc29uIGlzIEVycm9yfVxuICovXG4gICAgICAgY29uc3QgaXNBYmFuZG9uZWRFcnJvciA9IHJlYXNvbiA9PlxuICByZWFzb24gIT0gbnVsbCAmJiAvKiBlc2xpbnQtZGlzYWJsZS1saW5lIGVxZXFlcSovXG4gIGlzRnJvemVuKHJlYXNvbikgJiZcbiAgbWF0Y2hlcyhyZWFzb24sIE0uZXJyb3IoKSkgJiZcbiAgLyogV2UncmUgbm90IHVzaW5nIGEgY29uc3RhbnQgaGVyZSBzaW5jZSB0aGlzIHNwZWNpYWwgdmFsdWUgaXMgYWxyZWFkeSovXG4gIC8qIHNwcmlua2xlZCB0aHJvdWdob3V0IHRoZSBTREsqL1xuICByZWFzb24ubWVzc2FnZSA9PT0gJ3ZhdCB0ZXJtaW5hdGVkJzskaM2PX29uY2UuaXNBYmFuZG9uZWRFcnJvcihpc0FiYW5kb25lZEVycm9yKTtcbmhhcmRlbihpc0FiYW5kb25lZEVycm9yKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlVwZ3JhZGVEaXNjb25uZWN0aW9uU2hhcGUiOlsiVXBncmFkZURpc2Nvbm5lY3Rpb25TaGFwZSJdLCJtYWtlVXBncmFkZURpc2Nvbm5lY3Rpb24iOlsibWFrZVVwZ3JhZGVEaXNjb25uZWN0aW9uIl0sImlzVXBncmFkZURpc2Nvbm5lY3Rpb24iOlsiaXNVcGdyYWRlRGlzY29ubmVjdGlvbiJdLCJpc0FiYW5kb25lZEVycm9yIjpbImlzQWJhbmRvbmVkRXJyb3IiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAP+FBPBkUAAAZFAAAMwAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc3siaW1wb3J0cyI6WyJAZW5kby9mYXIiLCIuL3N1YnNjcmliZS5qcyJdLCJleHBvcnRzIjpbIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIiwib2JzZXJ2ZUl0ZXJhdGlvbiIsIm9ic2VydmVJdGVyYXRvciIsIm9ic2VydmVOb3RpZmllciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEUsc3Vic2NyaWJlTGF0ZXN0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIi4vc3Vic2NyaWJlLmpzXCIsIFtbXCJzdWJzY3JpYmVMYXRlc3RcIixbJGjNj19hID0+IChzdWJzY3JpYmVMYXRlc3QgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0VSZWZ9IGZyb20gJ0BlbmRvL2Zhcic7XG4gKiBAaW1wb3J0IHtCYXNlTm90aWZpZXIsIEl0ZXJhdGlvbk9ic2VydmVyLCBMYXRlc3RUb3BpY30gZnJvbSAnLi4vc3JjL3R5cGVzLmpzJztcbiAqL1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBgc3Vic2NyaWJlTGF0ZXN0YCBmcm9tIGBAYWdvcmljL25vdGlmaWVyL3N1YnNjcmliZS5qc2AgaW5zdGVhZC5cbiAqXG4gKiBBZGFwdG9yIGZyb20gYSBub3RpZmllclAgdG8gYW4gYXN5bmMgaXRlcmFibGUuXG4gKiBUaGUgbm90aWZpZXJQIGNhbiBiZSBhbnkgb2JqZWN0IHRoYXQgaGFzIGFuIGV2ZW50dWFsbHkgaW52b2NhYmxlXG4gKiBgZ2V0VXBkYXRlU2luY2VgIG1ldGhvZCB0aGF0IGJlaGF2ZXMgYWNjb3JkaW5nIHRvIHRoZSBub3RpZmllclxuICogc3BlYy4gVGhpcyBjYW4gYmUgYSBub3RpZmllciwgYSBwcm9taXNlIGZvciBhIGxvY2FsIG9yIHJlbW90ZVxuICogbm90aWZpZXIsIG9yIGEgcHJlc2VuY2Ugb2YgYSByZW1vdGUgbm90aWZpZXIuXG4gKlxuICogSXQgaXMgYWxzbyB1c2VkIGludGVybmFsbHkgYnkgbm90aWZpZXIuanMgc28gdGhhdCBhIG5vdGlmaWVyIGl0c2VsZiBpcyBhblxuICogYXN5bmMgaXRlcmFibGUuXG4gKlxuICogQW4gYXN5bmMgaXRlcmFibGUgaXMgYW4gb2JqZWN0IHdpdGggYSBgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpYCBtZXRob2RcbiAqIHRoYXQgcmV0dXJucyBhbiBhc3luYyBpdGVyYXRvci4gVGhlIGFzeW5jIGl0ZXJhdG9yIHdlIHJldHVybiBoZXJlIGhhcyBvbmx5XG4gKiBhIGBuZXh0KClgIG1ldGhvZCwgd2l0aG91dCB0aGUgb3B0aW9uYWwgYHJldHVybmAgYW5kIGB0aHJvd2AgbWV0aG9kcy4gVGhlXG4gKiBvbWl0dGVkIG1ldGhvZHMsIGlmIHByZXNlbnQsIHdvdWxkIGJlIHVzZWQgYnkgdGhlIGZvci9hd2FpdC9vZiBsb29wIHRvXG4gKiBpbmZvcm0gdGhlIGl0ZXJhdG9yIG9mIGVhcmx5IHRlcm1pbmF0aW9uLiBCdXQgdGhpcyBhZGFwdG9yIHdvdWxkIG5vdCBkb1xuICogYW55dGhpbmcgdXNlZnVsIGluIHJlYWN0aW9uIHRvIHRoaXMgbm90aWZpY2F0aW9uLlxuICpcbiAqIEFuIGFzeW5jIGl0ZXJhdG9yJ3MgYG5leHQoKWAgbWV0aG9kIHJldHVybnMgYSBwcm9taXNlIGZvciBhbiBpdGVyYXRpb25cbiAqIHJlc3VsdC4gQW4gaXRlcmF0aW9uIHJlc3VsdCBpcyBhIHJlY29yZCB3aXRoIGB2YWx1ZWAgYW5kIGBkb25lYCBwcm9wZXJ0aWVzLlxuICpcbiAqIFRoZSBwdXJwb3NlIG9mIGJ1aWxkaW5nIG9uIHRoZSBub3RpZmllciBwcm90b2NvbCBpcyB0byBoYXZlIGEgbG9zc3lcbiAqIGFkYXB0b3IsIHdoZXJlIGludGVybWVkaWF0ZSByZXN1bHRzIGNhbiBiZSBtaXNzZWQgaW4gZmF2b3Igb2YgbW9yZSByZWNlbnRcbiAqIHJlc3VsdHMgd2hpY2ggYXJlIHRoZXJlZm9yZSBsZXNzIHN0YWxlLiBTZWVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvZG9jdW1lbnRhdGlvbi9ibG9iL0hFQUQvbWFpbi9ndWlkZXMvanMtcHJvZ3JhbW1pbmcvbm90aWZpZXJzLm1kXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxCYXNlTm90aWZpZXI8VD4+fSBub3RpZmllclBcbiAqIEByZXR1cm5zIHtGb3JrYWJsZUFzeW5jSXRlcmFibGU8VD59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciA9IHN1YnNjcmliZUxhdGVzdDtcblxuLyoqXG4gKiBUaGlzIGFkdmFuY2VzIGBhc3luY0l0ZXJhdG9yUGAgdXBkYXRpbmcgYGl0ZXJhdGlvbk9ic2VydmVyYCB3aXRoIGVhY2hcbiAqIHN1Y2Nlc3NpdmUgdmFsdWUuIFRoZSBgaXRlcmF0aW9uT2JzZXJ2ZXJgIG1heSBvbmx5IGJlIGludGVyZXN0ZWQgaW4gY2VydGFpblxuICogb2NjdXJyZW5jZXMgKGB1cGRhdGVTdGF0ZWAsIGBmaW5pc2hgLCBgZmFpbGApLCBzbyBmb3IgY29udmVuaWVuY2UsXG4gKiBgb2JzZXJ2ZUl0ZXJhdG9yYCBmZWF0dXJlIHRlc3RzIGZvciB0aG9zZSBtZXRob2RzIGJlZm9yZSBjYWxsaW5nIHRoZW0uXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxBc3luY0l0ZXJhdG9yPFQ+Pn0gYXN5bmNJdGVyYXRvclBcbiAqIEBwYXJhbSB7UGFydGlhbDxJdGVyYXRpb25PYnNlcnZlcjxUPj59IGl0ZXJhdGlvbk9ic2VydmVyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx1bmRlZmluZWQ+fVxuICovJGjNj19vbmNlLm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyKG1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyKTtcbiAgICAgICBjb25zdCBvYnNlcnZlSXRlcmF0b3IgPSAoYXN5bmNJdGVyYXRvclAsIGl0ZXJhdGlvbk9ic2VydmVyKSA9PiB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgoYWNrLCBvYnNlcnZlckVycm9yKSA9PiB7XG4gICAgY29uc3QgcmVjdXIgPSAoKSA9PiB7XG4gICAgICBFLndoZW4oXG4gICAgICAgIEUoYXN5bmNJdGVyYXRvclApLm5leHQoKSxcbiAgICAgICAgKHsgdmFsdWUsIGRvbmUgfSkgPT4ge1xuICAgICAgICAgIGlmIChkb25lKSB7XG4gICAgICAgICAgICBpdGVyYXRpb25PYnNlcnZlci5maW5pc2ggJiYgaXRlcmF0aW9uT2JzZXJ2ZXIuZmluaXNoKHZhbHVlKTtcbiAgICAgICAgICAgIGFjayh1bmRlZmluZWQpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBpdGVyYXRpb25PYnNlcnZlci51cGRhdGVTdGF0ZSAmJlxuICAgICAgICAgICAgICBpdGVyYXRpb25PYnNlcnZlci51cGRhdGVTdGF0ZSh2YWx1ZSk7XG4gICAgICAgICAgICByZWN1cigpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgcmVhc29uID0+IHtcbiAgICAgICAgICBpdGVyYXRpb25PYnNlcnZlci5mYWlsICYmIGl0ZXJhdGlvbk9ic2VydmVyLmZhaWwocmVhc29uKTtcbiAgICAgICAgICBhY2sodW5kZWZpbmVkKTtcbiAgICAgICAgfSxcbiAgICAgICkuY2F0Y2gob2JzZXJ2ZXJFcnJvcik7XG4gICAgfTtcbiAgICByZWN1cigpO1xuICB9KTtcbn07XG5cbi8qKlxuICogVGhpcyByZWFkcyBmcm9tIGBhc3luY0l0ZXJhYmxlUGAgdXBkYXRpbmcgYGl0ZXJhdGlvbk9ic2VydmVyYCB3aXRoIGVhY2hcbiAqIHN1Y2Nlc3NpdmUgdmFsdWUuIFRoZSBgaXRlcmF0aW9uT2JzZXJ2ZXJgIG1heSBvbmx5IGJlIGludGVyZXN0ZWQgaW4gY2VydGFpblxuICogb2NjdXJyZW5jZXMgKGB1cGRhdGVTdGF0ZWAsIGBmaW5pc2hgLCBgZmFpbGApLCBzbyBmb3IgY29udmVuaWVuY2UsXG4gKiBgb2JzZXJ2ZUl0ZXJhdGlvbmAgZmVhdHVyZSB0ZXN0cyBmb3IgdGhvc2UgbWV0aG9kcyBiZWZvcmUgY2FsbGluZyB0aGVtLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QXN5bmNJdGVyYWJsZTxUPj59IGFzeW5jSXRlcmFibGVQXG4gKiBAcGFyYW0ge1BhcnRpYWw8SXRlcmF0aW9uT2JzZXJ2ZXI8VD4+fSBpdGVyYXRpb25PYnNlcnZlclxuICogQHJldHVybnMge1Byb21pc2U8dW5kZWZpbmVkPn1cbiAqLyRozY9fb25jZS5vYnNlcnZlSXRlcmF0b3Iob2JzZXJ2ZUl0ZXJhdG9yKTtcbiAgICAgICBjb25zdCBvYnNlcnZlSXRlcmF0aW9uID0gKGFzeW5jSXRlcmFibGVQLCBpdGVyYXRpb25PYnNlcnZlcikgPT4ge1xuICBjb25zdCBpdGVyYXRvclAgPSBFKGFzeW5jSXRlcmFibGVQKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcbiAgcmV0dXJuIG9ic2VydmVJdGVyYXRvcihpdGVyYXRvclAsIGl0ZXJhdGlvbk9ic2VydmVyKTtcbn07XG5cbi8qKlxuICogQXMgdXBkYXRlcyBjb21lIGluIGZyb20gdGhlIHBvc3NpYmx5IHJlbW90ZSBgbm90aWZpZXJQYCwgdXBkYXRlXG4gKiB0aGUgbG9jYWwgYHVwZGF0ZXJgLiBTaW5jZSB0aGUgdXBkYXRlcyBjb21lIGZyb20gYSBub3RpZmllciwgdGhleVxuICogYXJlIGxvc3N5LCBpLmUuLCBvbmNlIGEgbW9yZSByZWNlbnQgc3RhdGUgY2FuIGJlIHJlcG9ydGVkLCBsZXNzIHJlY2VudFxuICogc3RhdGVzIGFyZSBhc3N1bWVkIGlycmVsZXZhbnQgYW5kIGRyb3BwZWQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxMYXRlc3RUb3BpYzxUPj59IG5vdGlmaWVyUFxuICogQHBhcmFtIHtQYXJ0aWFsPEl0ZXJhdGlvbk9ic2VydmVyPFQ+Pn0gaXRlcmF0aW9uT2JzZXJ2ZXJcbiAqIEByZXR1cm5zIHtQcm9taXNlPHVuZGVmaW5lZD59XG4gKi8kaM2PX29uY2Uub2JzZXJ2ZUl0ZXJhdGlvbihvYnNlcnZlSXRlcmF0aW9uKTtcbiAgICAgICBjb25zdCBvYnNlcnZlTm90aWZpZXIgPSAobm90aWZpZXJQLCBpdGVyYXRpb25PYnNlcnZlcikgPT5cbiAgb2JzZXJ2ZUl0ZXJhdGlvbihzdWJzY3JpYmVMYXRlc3Qobm90aWZpZXJQKSwgaXRlcmF0aW9uT2JzZXJ2ZXIpOyRozY9fb25jZS5vYnNlcnZlTm90aWZpZXIob2JzZXJ2ZU5vdGlmaWVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIjpbIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIl0sIm9ic2VydmVJdGVyYXRvciI6WyJvYnNlcnZlSXRlcmF0b3IiXSwib2JzZXJ2ZUl0ZXJhdGlvbiI6WyJvYnNlcnZlSXRlcmF0aW9uIl0sIm9ic2VydmVOb3RpZmllciI6WyJvYnNlcnZlTm90aWZpZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAwj7tuOsHAADrBwAAJAAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3B1Ymxpc2gta2l0LmpzIiwiLi9zdWJzY3JpYmUuanMiLCIuL25vdGlmaWVyLmpzIiwiLi9zdWJzY3JpYmVyLmpzIiwiLi90b3BpYy5qcyIsIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiLCIuL3N0b3Jlc3ViLmpzIiwiLi9zdG9yZWQtbm90aWZpZXIuanMiLCIuL3R5cGVzLWluZGV4LmpzIl0sImV4cG9ydHMiOlsibWFrZU5vdGlmaWVyS2l0IiwibWFrZU5vdGlmaWVyS2l0IiwibWFrZVN1YnNjcmlwdGlvbktpdCIsIm1ha2VTdWJzY3JpcHRpb25LaXQiLCJvYnNlcnZlSXRlcmF0b3IiLCJvYnNlcnZlSXRlcmF0b3IiLCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiLCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiLCJzdWJzY3JpYmVMYXRlc3QiLCJzdWJzY3JpYmVMYXRlc3QiLG51bGxdLCJyZWV4cG9ydHMiOlsiLi9zdG9yZWQtbm90aWZpZXIuanMiLCIuL3N0b3Jlc3ViLmpzIiwiLi90eXBlcy1pbmRleC5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3B1Ymxpc2gta2l0LmpzXCIsIFtdXSxbXCIuL3N1YnNjcmliZS5qc1wiLCBbXV0sW1wiLi9ub3RpZmllci5qc1wiLCBbXV0sW1wiLi9zdWJzY3JpYmVyLmpzXCIsIFtdXSxbXCIuL3RvcGljLmpzXCIsIFtdXSxbXCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzXCIsIFtdXSxbXCIuL3N0b3Jlc3ViLmpzXCIsIFtdXSxbXCIuL3N0b3JlZC1ub3RpZmllci5qc1wiLCBbXV0sW1wiLi90eXBlcy1pbmRleC5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vcHVibGlzaC1raXQuanMiOltbIm1ha2VQdWJsaXNoS2l0IiwibWFrZVB1Ymxpc2hLaXQiXSxbInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCIsInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCJdLFsiRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSIsIkZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUiXSxbIkl0ZXJhYmxlRWFjaFRvcGljSSIsIkl0ZXJhYmxlRWFjaFRvcGljSSJdLFsiSXRlcmFibGVMYXRlc3RUb3BpY0kiLCJJdGVyYWJsZUxhdGVzdFRvcGljSSJdLFsiU3Vic2NyaWJlclNoYXBlIiwiU3Vic2NyaWJlclNoYXBlIl1dLCIuL3N1YnNjcmliZS5qcyI6W1sic3Vic2NyaWJlRWFjaCIsInN1YnNjcmliZUVhY2giXSxbInN1YnNjcmliZUxhdGVzdCIsInN1YnNjcmliZUxhdGVzdCJdXSwiLi9ub3RpZmllci5qcyI6W1sibWFrZU5vdGlmaWVyIiwibWFrZU5vdGlmaWVyIl0sWyJtYWtlTm90aWZpZXJLaXQiLCJtYWtlTm90aWZpZXJLaXQiXSxbIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIiwibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUiXSxbIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIiwibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiXV0sIi4vc3Vic2NyaWJlci5qcyI6W1sibWFrZVN1YnNjcmlwdGlvbiIsIm1ha2VTdWJzY3JpcHRpb24iXSxbIm1ha2VTdWJzY3JpcHRpb25LaXQiLCJtYWtlU3Vic2NyaXB0aW9uS2l0Il1dLCIuL3RvcGljLmpzIjpbWyJtYWtlUGlubmVkSGlzdG9yeVRvcGljIiwibWFrZVBpbm5lZEhpc3RvcnlUb3BpYyJdXSwiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyI6W1sib2JzZXJ2ZU5vdGlmaWVyIiwib2JzZXJ2ZU5vdGlmaWVyIl0sWyJvYnNlcnZlSXRlcmF0b3IiLCJvYnNlcnZlSXRlcmF0b3IiXSxbIm9ic2VydmVJdGVyYXRpb24iLCJvYnNlcnZlSXRlcmF0aW9uIl0sWyJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllciIsIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACzSf9OxRsAAMUbAAAnAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL25vdGlmaWVyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2ZhciIsIi4vcHVibGlzaC1raXQuanMiLCIuL3N1YnNjcmliZS5qcyJdLCJleHBvcnRzIjpbIm1ha2VOb3RpZmllciIsIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIiwibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiLCJtYWtlTm90aWZpZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnQsRSxGYXIsbWFrZVB1Ymxpc2hLaXQsc3Vic2NyaWJlTGF0ZXN0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJhc3NlcnRcIixbJGjNj19hID0+IChhc3NlcnQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dLFtcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXV1dLFtcIi4vcHVibGlzaC1raXQuanNcIiwgW1tcIm1ha2VQdWJsaXNoS2l0XCIsWyRozY9fYSA9PiAobWFrZVB1Ymxpc2hLaXQgPSAkaM2PX2EpXV1dXSxbXCIuL3N1YnNjcmliZS5qc1wiLCBbW1wic3Vic2NyaWJlTGF0ZXN0XCIsWyRozY9fYSA9PiAoc3Vic2NyaWJlTGF0ZXN0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtSZW1vdGV9IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwnO1xuICogQGltcG9ydCB7TGF0ZXN0VG9waWMsIE5vdGlmaWVyLCBOb3RpZmllclJlY29yZCwgUHVibGlzaEtpdCwgU3Vic2NyaWJlciwgVXBkYXRlUmVjb3JkfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge0VSZWZ9IGZyb20gJ0BhZ29yaWMvdm93JztcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8TGF0ZXN0VG9waWM8VD4+fSBzaGFyYWJsZUludGVybmFsc1BcbiAqIEByZXR1cm5zIHtOb3RpZmllcjxUPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VOb3RpZmllciA9IHNoYXJhYmxlSW50ZXJuYWxzUCA9PiB7XG4gIC8qKiBAdHlwZSB7Tm90aWZpZXI8VD59ICovXG4gIGNvbnN0IG5vdGlmaWVyID0gRmFyKCdub3RpZmllcicsIHtcbiAgICAuLi5zdWJzY3JpYmVMYXRlc3Qoc2hhcmFibGVJbnRlcm5hbHNQKSxcbiAgICBnZXRVcGRhdGVTaW5jZTogYXN5bmMgdXBkYXRlQ291bnQgPT5cbiAgICAgIEUoc2hhcmFibGVJbnRlcm5hbHNQKS5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCksXG5cbiAgICAvKipcbiAqIFVzZSB0aGlzIHRvIGRpc3RyaWJ1dGUgYSBOb3RpZmllciBlZmZpY2llbnRseSBvdmVyIHRoZSBuZXR3b3JrLFxuICogYnkgb2J0YWluaW5nIHRoaXMgZnJvbSB0aGUgTm90aWZpZXIgdG8gYmUgcmVwbGljYXRlZCwgYW5kIGFwcGx5aW5nXG4gKiBgbWFrZU5vdGlmaWVyYCB0byBpdCBhdCB0aGUgbmV3IHNpdGUgdG8gZ2V0IGFuIGVxdWl2YWxlbnQgbG9jYWxcbiAqIE5vdGlmaWVyIGF0IHRoYXQgc2l0ZS5cbiAqL1xuICAgIGdldFNoYXJhYmxlTm90aWZpZXJJbnRlcm5hbHM6IGFzeW5jICgpID0+IHNoYXJhYmxlSW50ZXJuYWxzUCxcbiAgICAvKipcbiAqIEBkZXByZWNhdGVkXG4gKiBVc2VkIG9ubHkgYnkgYG1ha2VDYXN0aW5nU3BlY0Zyb21SZWZgLiAgSW5zdGVhZCB0aGF0IGZ1bmN0aW9uIHNob3VsZCB1c2VcbiAqIHRoZSBgU3RvcmVkRmFjZXRgIEFQSS5cbiAqL1xuICAgIGdldFN0b3JlS2V5OiAoKSA9PiBoYXJkZW4oeyBub3RpZmllciB9KSxcbiAgfSk7XG4gIHJldHVybiBub3RpZmllcjtcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxTdWJzY3JpYmVyPFQ+PiB8IFJlbW90ZTxTdWJzY3JpYmVyPFQ+Pn0gc3Vic2NyaWJlclxuICogQHJldHVybnMge05vdGlmaWVyPFQ+fVxuICovJGjNj19vbmNlLm1ha2VOb3RpZmllcihtYWtlTm90aWZpZXIpO1xuICAgICAgIGNvbnN0IG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyID0gc3Vic2NyaWJlciA9PiB7XG4gIC8qKlxuICogQHR5cGUge0xhdGVzdFRvcGljPFQ+fVxuICovXG4gIGNvbnN0IGJhc2VOb3RpZmllciA9IGhhcmRlbih7XG4gICAgZ2V0VXBkYXRlU2luY2U6ICh1cGRhdGVDb3VudCA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIEUoc3Vic2NyaWJlcikuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpLFxuICB9KTtcblxuICAvKiogQHR5cGUge05vdGlmaWVyPFQ+fSAqL1xuICBjb25zdCBub3RpZmllciA9IEZhcignbm90aWZpZXInLCB7XG4gICAgLi4ubWFrZU5vdGlmaWVyKGJhc2VOb3RpZmllciksXG4gICAgLi4uYmFzZU5vdGlmaWVyLFxuICB9KTtcbiAgcmV0dXJuIG5vdGlmaWVyO1xufTskaM2PX29uY2UubWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIobWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIpO1xuaGFyZGVuKG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyKTtcblxuLyoqXG4gKiBQcm9kdWNlcyBhIHBhaXIgb2Ygb2JqZWN0cywgd2hpY2ggYWxsb3cgYSBzZXJ2aWNlIHRvIHByb2R1Y2UgYSBzdHJlYW0gb2ZcbiAqIHVwZGF0ZSBwcm9taXNlcy5cbiAqXG4gKiBUaGUgaW5pdGlhbCBzdGF0ZSBhcmd1bWVudCBoYXMgdG8gYmUgdHJ1bHkgb3B0aW9uYWwgZXZlbiB0aG91Z2ggaXQgY2FuXG4gKiBiZSBhbnkgZmlyc3QgY2xhc3MgdmFsdWUgaW5jbHVkaW5nIGB1bmRlZmluZWRgLiBXZSBuZWVkIHRvIGRpc3Rpbmd1aXNoIHRoZVxuICogcHJlc2VuY2UgdnMgdGhlIGFic2VuY2Ugb2YgaXQsIHdoaWNoIHdlIGNhbm5vdCBkbyB3aXRoIHRoZSBvcHRpb25hbCBhcmd1bWVudFxuICogc3ludGF4LiBSYXRoZXIgd2UgdXNlIHRoZSBhcml0eSBvZiB0aGUgYGluaXRpYWxTdGF0ZUFycmAgYXJyYXkuXG4gKlxuICogSWYgbm8gaW5pdGlhbCBzdGF0ZSBpcyBwcm92aWRlZCB0byBgbWFrZU5vdGlmaWVyS2l0YCwgdGhlbiBpdCBzdGFydHMgd2l0aG91dFxuICogYW4gaW5pdGlhbCBzdGF0ZS4gSXRzIGluaXRpYWwgc3RhdGUgd2lsbCBpbnN0ZWFkIGJlIHRoZSBzdGF0ZSBvZiB0aGUgZmlyc3RcbiAqIHVwZGF0ZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtbXSB8IFtUXX0gaW5pdGlhbFN0YXRlQXJyIHRoZSBmaXJzdCBzdGF0ZSB0byBiZSByZXR1cm5lZCAodHlwZWQgYXMgcmVzdCBhcnJheSB0byBwZXJtaXQgYHVuZGVmaW5lZGApXG4gKiBAcmV0dXJucyB7Tm90aWZpZXJSZWNvcmQ8VD59IHRoZSBub3RpZmllciBhbmQgdXBkYXRlclxuICovXG4gICAgICAgY29uc3QgbWFrZU5vdGlmaWVyS2l0ID0gKC4uLmluaXRpYWxTdGF0ZUFycikgPT4ge1xuICAvKiogQHR5cGUge1B1Ymxpc2hLaXQ8VD59ICovXG4gIGNvbnN0IHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH0gPSBtYWtlUHVibGlzaEtpdCgpO1xuXG4gIGNvbnN0IG5vdGlmaWVyID0gbWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIoc3Vic2NyaWJlcik7XG5cbiAgY29uc3QgdXBkYXRlciA9IEZhcigndXBkYXRlcicsIHtcbiAgICB1cGRhdGVTdGF0ZTogc3RhdGUgPT4gcHVibGlzaGVyLnB1Ymxpc2goc3RhdGUpLFxuICAgIGZpbmlzaDogY29tcGxldGlvbiA9PiBwdWJsaXNoZXIuZmluaXNoKGNvbXBsZXRpb24pLFxuICAgIGZhaWw6IHJlYXNvbiA9PiBwdWJsaXNoZXIuZmFpbChyZWFzb24pLFxuICB9KTtcblxuICBhc3NlcnQoaW5pdGlhbFN0YXRlQXJyLmxlbmd0aCA8PSAxLCAndG9vIG1hbnkgYXJndW1lbnRzJyk7XG4gIGlmIChpbml0aWFsU3RhdGVBcnIubGVuZ3RoID09PSAxKSB7XG4gICAgdXBkYXRlci51cGRhdGVTdGF0ZShpbml0aWFsU3RhdGVBcnJbMF0pO1xuICB9XG5cbiAgLyogbm90aWZpZXIgZmFjZXQgaXMgc2VwYXJhdGUgc28gaXQgY2FuIGJlIGhhbmRlZCBvdXQgd2hpbGUgdXBkYXRlciovXG4gIC8qIGlzIHRpZ2h0bHkgaGVsZCovXG4gIHJldHVybiBoYXJkZW4oeyBub3RpZmllciwgdXBkYXRlciB9KTtcbn07XG5cbi8qKlxuICogQWRhcHRvciBmcm9tIGFzeW5jIGl0ZXJhYmxlIHRvIG5vdGlmaWVyLlxuICpcbiAqIEBkZXByZWNhdGVkIFRoZSByZXN1bHRpbmcgbm90aWZpZXIgaXMgbG9zc2xlc3MsIHdoaWNoIGlzIG5vdCBkZXNpcmFibGUuXG4gKiBQcmVmZXIgbWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIsIGFuZCByZWZlciB0b1xuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy81NDEzIGFuZFxuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvNTY5NSBmb3IgY29udGV4dC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEFzeW5jSXRlcmFibGU8VD4+fSBhc3luY0l0ZXJhYmxlUFxuICogQHJldHVybnMge05vdGlmaWVyPFQ+fVxuICovJGjNj19vbmNlLm1ha2VOb3RpZmllcktpdChtYWtlTm90aWZpZXJLaXQpO1xuICAgICAgIGNvbnN0IG1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlID0gYXN5bmNJdGVyYWJsZVAgPT4ge1xuICBjb25zdCBpdGVyYXRvclAgPSBFKGFzeW5jSXRlcmFibGVQKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcblxuICAvKiogQHR5cGUge1Byb21pc2U8VXBkYXRlUmVjb3JkPFQ+Pnx1bmRlZmluZWR9ICovXG4gIGxldCBvcHROZXh0UHJvbWlzZTtcbiAgbGV0IGN1cnJlbnRVcGRhdGVDb3VudCA9IDBuO1xuICAvKiogQHR5cGUge0VSZWY8VXBkYXRlUmVjb3JkPFQ+Pnx1bmRlZmluZWR9ICovXG4gIGxldCBjdXJyZW50UmVzcG9uc2U7XG4gIGxldCBmaW5hbCA9IGZhbHNlO1xuXG4gIC8qKlxuICogQHR5cGUge0xhdGVzdFRvcGljPFQ+fVxuICovXG4gIGNvbnN0IGJhc2VOb3RpZmllciA9IEZhcignYmFzZU5vdGlmaWVyJywge1xuICAgIGdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50ID0gLTFuKSB7XG4gICAgICBpZiAodXBkYXRlQ291bnQgPCBjdXJyZW50VXBkYXRlQ291bnQpIHtcbiAgICAgICAgaWYgKGN1cnJlbnRSZXNwb25zZSkge1xuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoY3VycmVudFJlc3BvbnNlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh1cGRhdGVDb3VudCAhPT0gY3VycmVudFVwZGF0ZUNvdW50KSB7XG4gICAgICAgIHRocm93IEVycm9yKFxuICAgICAgICAgICdnZXRVcGRhdGVTaW5jZSBhcmd1bWVudCBtdXN0IGJlIGEgcHJldmlvdXNseS1pc3N1ZWQgdXBkYXRlQ291bnQuJyxcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgLyogUmV0dXJuIGEgZmluYWwgcmVzcG9uc2UgaWYgd2UgaGF2ZSBvbmUsIG90aGVyd2lzZSBhIHByb21pc2UgZm9yIHRoZSBuZXh0IHN0YXRlLiovXG4gICAgICBpZiAoZmluYWwpIHtcbiAgICAgICAgYXNzZXJ0KGN1cnJlbnRSZXNwb25zZSAhPT0gdW5kZWZpbmVkKTtcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShjdXJyZW50UmVzcG9uc2UpO1xuICAgICAgfVxuICAgICAgaWYgKCFvcHROZXh0UHJvbWlzZSkge1xuICAgICAgICBjb25zdCBuZXh0SXRlclJlc3VsdFAgPSBFKGl0ZXJhdG9yUCkubmV4dCgpO1xuICAgICAgICBvcHROZXh0UHJvbWlzZSA9IEUud2hlbihcbiAgICAgICAgICBuZXh0SXRlclJlc3VsdFAsXG4gICAgICAgICAgKHsgZG9uZSwgdmFsdWUgfSkgPT4ge1xuICAgICAgICAgICAgYXNzZXJ0KCFmaW5hbCk7XG4gICAgICAgICAgICBpZiAoZG9uZSkge1xuICAgICAgICAgICAgICBmaW5hbCA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjdXJyZW50VXBkYXRlQ291bnQgKz0gMW47XG4gICAgICAgICAgICBjdXJyZW50UmVzcG9uc2UgPSBoYXJkZW4oe1xuICAgICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgICAgdXBkYXRlQ291bnQ6IGRvbmUgPyB1bmRlZmluZWQgOiBjdXJyZW50VXBkYXRlQ291bnQsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG9wdE5leHRQcm9taXNlID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRSZXNwb25zZTtcbiAgICAgICAgICB9LFxuICAgICAgICAgIF9yZWFzb24gPT4ge1xuICAgICAgICAgICAgZmluYWwgPSB0cnVlO1xuICAgICAgICAgICAgY3VycmVudFJlc3BvbnNlID1cbiAgICAgICAgICAgICAgLyoqIEB0eXBlIHtQcm9taXNlPFVwZGF0ZVJlY29yZDxUPj59ICovXG4gICAgICAgICAgICAgIChuZXh0SXRlclJlc3VsdFApO1xuICAgICAgICAgICAgb3B0TmV4dFByb21pc2UgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudFJlc3BvbnNlO1xuICAgICAgICAgIH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gb3B0TmV4dFByb21pc2U7XG4gICAgfSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtOb3RpZmllcjxUPn0gKi9cbiAgY29uc3Qgbm90aWZpZXIgPSBGYXIoJ25vdGlmaWVyJywge1xuICAgIC8qIERvbid0IGxlYWsgdGhlIG9yaWdpbmFsIGFzeW5jSXRlcmFibGVQIHNpbmNlIGl0IG1heSBiZSByZW1vdGUgYW5kIHdlIGFsc28qL1xuICAgIC8qIHdhbnQgdGhlIHNhbWUgc2VtYW50aWNzIGZvciB0aGlzIGV4cG9zZWQgaXRlcmFibGUgYW5kIHRoZSBiYXNlTm90aWZpZXIuKi9cbiAgICAuLi5tYWtlTm90aWZpZXIoYmFzZU5vdGlmaWVyKSxcbiAgICAuLi5iYXNlTm90aWZpZXIsXG4gIH0pO1xuICByZXR1cm4gbm90aWZpZXI7XG59OyRozY9fb25jZS5tYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZShtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSk7XG5oYXJkZW4obWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU5vdGlmaWVyIjpbIm1ha2VOb3RpZmllciJdLCJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciI6WyJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciJdLCJtYWtlTm90aWZpZXJLaXQiOlsibWFrZU5vdGlmaWVyS2l0Il0sIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIjpbIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABshF6MzQgAAM0IAACoAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvcHVibGlzaC1raXQuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZmFyIiwiQGVuZG8vcHJvbWlzZS1raXQiLCJAZW5kby9wYXR0ZXJucyIsIkBhZ29yaWMvdmF0LWRhdGEiXSwiZXhwb3J0cyI6WyJGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclNoYXBlIiwiSXRlcmFibGVFYWNoVG9waWNJIiwiSXRlcmFibGVMYXRlc3RUb3BpY0kiLCJQdWJsaXNoZXJJIiwiU3Vic2NyaWJlckkiLCJTdWJzY3JpYmVyU2hhcGUiLCJVcGRhdGVDb3VudFNoYXBlIiwibWFrZVB1Ymxpc2hLaXQiLCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiLCJwdWJsaXNoS2l0SUtpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwscSxFLEZhcixtYWtlUHJvbWlzZUtpdCxNLGdldEludGVyZmFjZUd1YXJkUGF5bG9hZCxjYW5CZUR1cmFibGUscHJlcGFyZUV4b0NsYXNzS2l0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV0sW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcIm1ha2VQcm9taXNlS2l0XCIsWyRozY9fYSA9PiAobWFrZVByb21pc2VLaXQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV0sW1wiZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkXCIsWyRozY9fYSA9PiAoZ2V0SW50ZXJmYWNlR3VhcmRQYXlsb2FkID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wiY2FuQmVEdXJhYmxlXCIsWyRozY9fYSA9PiAoY2FuQmVEdXJhYmxlID0gJGjNj19hKV1dLFtcInByZXBhcmVFeG9DbGFzc0tpdFwiLFskaM2PX2EgPT4gKHByZXBhcmVFeG9DbGFzc0tpdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7RVJlZn0gZnJvbSAnQGVuZG8vZmFyJztcbiAqIEBpbXBvcnQge0R1cmFibGVQdWJsaXNoS2l0U3RhdGUsIER1cmFibGVQdWJsaXNoS2l0VmFsdWVEdXJhYmlsaXR5LCBMYXRlc3RUb3BpYywgTm90aWZpZXIsIE5vdGlmaWVyUmVjb3JkLCBQdWJsaWNhdGlvblJlY29yZCwgUHVibGlzaGVyLCBQdWJsaXNoS2l0LCBTdWJzY3JpYmVyLCBVcGRhdGVSZWNvcmR9IGZyb20gJy4uL3NyYy90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtCYWdnYWdlfSBmcm9tICdAYWdvcmljL3N3aW5nc2V0LWxpdmVzbG90cyc7XG4gKi9cblxuY29uc3Qgc2luayA9ICgpID0+IHt9O1xuY29uc3QgbWFrZVF1aWV0UmVqZWN0aW9uID0gcmVhc29uID0+IHtcbiAgY29uc3QgcmVqZWN0aW9uID0gaGFyZGVuKFByb21pc2UucmVqZWN0KHJlYXNvbikpO1xuICB2b2lkIEUud2hlbihyZWplY3Rpb24sIHNpbmssIHNpbmspO1xuICByZXR1cm4gcmVqZWN0aW9uO1xufTtcbmNvbnN0IHRvb0ZhclJlamVjdGlvbiA9IG1ha2VRdWlldFJlamVjdGlvbihcbiAgaGFyZGVuKEVycm9yKCdDYW5ub3QgcmVhZCBwYXN0IGVuZCBvZiBpdGVyYXRpb24uJykpLFxuKTtcblxuICAgICAgIGNvbnN0IFB1Ymxpc2hlckkgPSBNLmludGVyZmFjZSgnUHVibGlzaGVyJywge1xuICBwdWJsaXNoOiBNLmNhbGwoTS5hbnkoKSkucmV0dXJucygpLFxuICBmaW5pc2g6IE0uY2FsbChNLmFueSgpKS5yZXR1cm5zKCksXG4gIGZhaWw6IE0uY2FsbChNLmFueSgpKS5yZXR1cm5zKCksXG59KTtcblxuLyogRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHdpdGggTm90aWZpZXIgYGdldFVwZGF0ZVNpbmNlYC4qLyRozY9fb25jZS5QdWJsaXNoZXJJKFB1Ymxpc2hlckkpO1xuICAgICAgIGNvbnN0IFVwZGF0ZUNvdW50U2hhcGUgPSBNLm9yKE0uYmlnaW50KCksIE0ubnVtYmVyKCkpOyRozY9fb25jZS5VcGRhdGVDb3VudFNoYXBlKFVwZGF0ZUNvdW50U2hhcGUpO1xuICAgICAgIGNvbnN0IFN1YnNjcmliZXJJID0gTS5pbnRlcmZhY2UoJ1N1YnNjcmliZXInLCB7XG4gIHN1YnNjcmliZUFmdGVyOiBNLmNhbGwoKS5vcHRpb25hbChNLmJpZ2ludCgpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgZ2V0VXBkYXRlU2luY2U6IE0uY2FsbCgpLm9wdGlvbmFsKFVwZGF0ZUNvdW50U2hhcGUpLnJldHVybnMoTS5wcm9taXNlKCkpLFxufSk7JGjNj19vbmNlLlN1YnNjcmliZXJJKFN1YnNjcmliZXJJKTtcbiAgICAgICBjb25zdCBwdWJsaXNoS2l0SUtpdCA9IGhhcmRlbih7XG4gIHB1Ymxpc2hlcjogUHVibGlzaGVySSxcbiAgc3Vic2NyaWJlcjogU3Vic2NyaWJlckksXG59KTskaM2PX29uY2UucHVibGlzaEtpdElLaXQocHVibGlzaEtpdElLaXQpO1xuXG4gICAgICAgY29uc3QgRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSA9IE0uaW50ZXJmYWNlKFxuICAnRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3InLFxuICB7XG4gICAgZm9yazogTS5jYWxsKCkucmV0dXJucyhNLmFueSgpKSxcbiAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiBNLmNhbGwoKS5yZXR1cm5zKE0uYW55KCkpLCAvKiBvb3BzOiByZWN1cnNpdmUgdHlwZSovXG4gICAgbmV4dDogTS5jYWxsV2hlbigpLnJldHVybnMoTS5hbnkoKSksXG4gIH0sXG4pOyRozY9fb25jZS5Gb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclNoYXBlKEZvcmthYmxlQXN5bmNJdGVyYWJsZUl0ZXJhdG9yU2hhcGUpO1xuXG4gICAgICAgY29uc3QgSXRlcmFibGVFYWNoVG9waWNJID0gTS5pbnRlcmZhY2UoJ0l0ZXJhYmxlRWFjaFRvcGljJywge1xuICBzdWJzY3JpYmVBZnRlcjpcbiAgICBnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQoU3Vic2NyaWJlckkpLm1ldGhvZEd1YXJkcy5zdWJzY3JpYmVBZnRlcixcbiAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogTS5jYWxsKCkucmV0dXJucyhcbiAgICBNLnJlbW90YWJsZSgnRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3InKSxcbiAgKSxcbn0pOyRozY9fb25jZS5JdGVyYWJsZUVhY2hUb3BpY0koSXRlcmFibGVFYWNoVG9waWNJKTtcblxuICAgICAgIGNvbnN0IEl0ZXJhYmxlTGF0ZXN0VG9waWNJID0gTS5pbnRlcmZhY2UoJ0l0ZXJhYmxlTGF0ZXN0VG9waWMnLCB7XG4gIGdldFVwZGF0ZVNpbmNlOlxuICAgIGdldEludGVyZmFjZUd1YXJkUGF5bG9hZChTdWJzY3JpYmVySSkubWV0aG9kR3VhcmRzLmdldFVwZGF0ZVNpbmNlLFxuICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiBNLmNhbGwoKS5yZXR1cm5zKFxuICAgIE0ucmVtb3RhYmxlKCdGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvcicpLFxuICApLFxufSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtvYmplY3R9IEFyZ1xuICogQHRlbXBsYXRlIFJldFxuICogQHBhcmFtIHsoYXJnOiBBcmcpID0+IFJldH0gZm5cbiAqIEByZXR1cm5zIHsoYXJnOiBBcmcpID0+IFJldH1cbiAqLyRozY9fb25jZS5JdGVyYWJsZUxhdGVzdFRvcGljSShJdGVyYWJsZUxhdGVzdFRvcGljSSk7XG5jb25zdCB3ZWFrTWVtb2l6ZVVuYXJ5ID0gZm4gPT4ge1xuICBjb25zdCBjYWNoZSA9IG5ldyBXZWFrTWFwKCk7XG4gIHJldHVybiBhcmcgPT4ge1xuICAgIC8qKiBAdHlwZSB7b2JqZWN0fSAqL1xuICAgIGNvbnN0IG9hcmcgPSBhcmc7XG4gICAgaWYgKGNhY2hlLmhhcyhvYXJnKSkge1xuICAgICAgcmV0dXJuIGNhY2hlLmdldChvYXJnKTtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gZm4oYXJnKTtcbiAgICBjYWNoZS5zZXQob2FyZywgcmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtQdWJsaWNhdGlvblJlY29yZDxUPn0gcmVjb3JkXG4gKiBAcmV0dXJucyB7VXBkYXRlUmVjb3JkPFQ+fVxuICovXG5jb25zdCBtYWtlVXBkYXRlUmVjb3JkRnJvbVB1YmxpY2F0aW9uUmVjb3JkID0gcmVjb3JkID0+IHtcbiAgY29uc3Qge1xuICAgIGhlYWQ6IHsgdmFsdWUsIGRvbmUgfSxcbiAgICBwdWJsaXNoQ291bnQsXG4gIH0gPSByZWNvcmQ7XG4gIGlmIChkb25lKSB7XG4gICAgLyogRmluYWwgcmVzdWx0cyBoYXZlIHVuZGVmaW5lZCB1cGRhdGVDb3VudC4qL1xuICAgIHJldHVybiBoYXJkZW4oeyB2YWx1ZSwgdXBkYXRlQ291bnQ6IHVuZGVmaW5lZCB9KTtcbiAgfVxuICByZXR1cm4gaGFyZGVuKHsgdmFsdWUsIHVwZGF0ZUNvdW50OiBwdWJsaXNoQ291bnQgfSk7XG59O1xuXG4vKipcbiAqIE1ha2VzIGEgYHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH1gIHBhaXIgZm9yIGRvaW5nIGVmZmljaWVudFxuICogZGlzdHJpYnV0ZWQgcHViL3N1YiBzdXBwb3J0aW5nIGJvdGggXCJlYWNoXCIgYW5kIFwibGF0ZXN0XCIgaXRlcmF0aW9uXG4gKiBvZiBwdWJsaXNoZWQgdmFsdWVzLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcmV0dXJucyB7UHVibGlzaEtpdDxUPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VQdWJsaXNoS2l0ID0gKCkgPT4ge1xuICAvKiogQHR5cGUge1Byb21pc2U8UHVibGljYXRpb25SZWNvcmQ8VD4+fSAqL1xuICBsZXQgdGFpbFA7XG4gIC8qKiBAdHlwZSB7dW5kZWZpbmVkIHwgKCh2YWx1ZTogRVJlZjxQdWJsaWNhdGlvblJlY29yZDxUPj4pID0+IHZvaWQpfSAqL1xuICBsZXQgdGFpbFI7XG4gICh7IHByb21pc2U6IHRhaWxQLCByZXNvbHZlOiB0YWlsUiB9ID0gbWFrZVByb21pc2VLaXQoKSk7XG5cbiAgbGV0IGN1cnJlbnRQdWJsaXNoQ291bnQgPSAwbjtcbiAgbGV0IGN1cnJlbnRQID0gdGFpbFA7XG4gIGNvbnN0IGFkdmFuY2VDdXJyZW50ID0gKGRvbmUsIHZhbHVlLCByZWplY3Rpb24pID0+IHtcbiAgICBpZiAodGFpbFIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0Nhbm5vdCB1cGRhdGUgc3RhdGUgYWZ0ZXIgdGVybWluYXRpb24uJyk7XG4gICAgfVxuXG4gICAgY3VycmVudFB1Ymxpc2hDb3VudCArPSAxbjtcbiAgICBjdXJyZW50UCA9IHRhaWxQO1xuICAgIGNvbnN0IHJlc29sdmVDdXJyZW50ID0gdGFpbFI7XG5cbiAgICBpZiAoZG9uZSkge1xuICAgICAgdGFpbFAgPSB0b29GYXJSZWplY3Rpb247XG4gICAgICB0YWlsUiA9IHVuZGVmaW5lZDtcbiAgICB9IGVsc2Uge1xuICAgICAgKHsgcHJvbWlzZTogdGFpbFAsIHJlc29sdmU6IHRhaWxSIH0gPSBtYWtlUHJvbWlzZUtpdCgpKTtcbiAgICB9XG5cbiAgICBpZiAocmVqZWN0aW9uKSB7XG4gICAgICByZXNvbHZlQ3VycmVudChyZWplY3Rpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXNvbHZlQ3VycmVudChcbiAgICAgICAgaGFyZGVuKHtcbiAgICAgICAgICBoZWFkOiB7IHZhbHVlLCBkb25lIH0sXG4gICAgICAgICAgcHVibGlzaENvdW50OiBjdXJyZW50UHVibGlzaENvdW50LFxuICAgICAgICAgIHRhaWw6IHRhaWxQLFxuICAgICAgICB9KSxcbiAgICAgICk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IG1ha2VNZW1vaXplZFVwZGF0ZVJlY29yZCA9IHdlYWtNZW1vaXplVW5hcnkoXG4gICAgbWFrZVVwZGF0ZVJlY29yZEZyb21QdWJsaWNhdGlvblJlY29yZCxcbiAgKTtcblxuICAvKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZSB7U3Vic2NyaWJlcjxUPn1cbiAqL1xuICBjb25zdCBzdWJzY3JpYmVyID0gRmFyKCdTdWJzY3JpYmVyJywge1xuICAgIHN1YnNjcmliZUFmdGVyOiAocHVibGlzaENvdW50ID0gLTFuKSA9PiB7XG4gICAgICBhc3NlcnQudHlwZW9mKHB1Ymxpc2hDb3VudCwgJ2JpZ2ludCcpO1xuICAgICAgaWYgKHB1Ymxpc2hDb3VudCA9PT0gY3VycmVudFB1Ymxpc2hDb3VudCkge1xuICAgICAgICByZXR1cm4gdGFpbFA7XG4gICAgICB9IGVsc2UgaWYgKHB1Ymxpc2hDb3VudCA8IGN1cnJlbnRQdWJsaXNoQ291bnQpIHtcbiAgICAgICAgcmV0dXJuIGN1cnJlbnRQO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoXG4gICAgICAgICAgJ3N1YnNjcmliZUFmdGVyIGFyZ3VtZW50IG11c3QgYmUgYSBwcmV2aW91c2x5LWlzc3VlZCBwdWJsaXNoQ291bnQuJyxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9LFxuICAgIGdldFVwZGF0ZVNpbmNlOiB1cGRhdGVDb3VudCA9PiB7XG4gICAgICBpZiAodXBkYXRlQ291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gc3Vic2NyaWJlci5zdWJzY3JpYmVBZnRlcigpLnRoZW4obWFrZU1lbW9pemVkVXBkYXRlUmVjb3JkKTtcbiAgICAgIH1cbiAgICAgIHVwZGF0ZUNvdW50ID0gQmlnSW50KHVwZGF0ZUNvdW50KTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHN1YnNjcmliZXJcbiAgICAgICAgICAvKiBgc3Vic2NyaWJlQWZ0ZXJgIG1heSByZXNvbHZlIHdpdGggdGhlIHVwZGF0ZSByZWNvcmQgbnVtYmVyZWQqL1xuICAgICAgICAgIC8qIGB1cGRhdGVDb3VudCArIDFgLCBldmVuIGlmIHNldmVyYWwgdXBkYXRlcyBhcmUgcHVibGlzaGVkIGluIHRoZSovXG4gICAgICAgICAgLyogc2FtZSBjcmFuay4uLiovXG4gICAgICAgICAgLnN1YnNjcmliZUFmdGVyKHVwZGF0ZUNvdW50KVxuICAgICAgICAgIC8qIC4uLiBzbyB3ZSBwb2xsIHRoZSBsYXRlc3QgcHVibGlzaGVkIHVwZGF0ZSwgd2l0aG91dCB3YWl0aW5nIGZvciBhbnkqL1xuICAgICAgICAgIC8qIGZ1cnRoZXIgb25lcy4qL1xuICAgICAgICAgIC50aGVuKCgpID0+IHN1YnNjcmliZXIuZ2V0VXBkYXRlU2luY2UoKSlcbiAgICAgICk7XG4gICAgfSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtQdWJsaXNoZXI8VD59ICovXG4gIGNvbnN0IHB1Ymxpc2hlciA9IEZhcignUHVibGlzaGVyJywge1xuICAgIHB1Ymxpc2g6IHZhbHVlID0+IHtcbiAgICAgIGFkdmFuY2VDdXJyZW50KGZhbHNlLCB2YWx1ZSk7XG4gICAgfSxcbiAgICBmaW5pc2g6IGZpbmFsVmFsdWUgPT4ge1xuICAgICAgYWR2YW5jZUN1cnJlbnQodHJ1ZSwgZmluYWxWYWx1ZSk7XG4gICAgfSxcbiAgICBmYWlsOiByZWFzb24gPT4ge1xuICAgICAgYWR2YW5jZUN1cnJlbnQodHJ1ZSwgdW5kZWZpbmVkLCBtYWtlUXVpZXRSZWplY3Rpb24ocmVhc29uKSk7XG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiBoYXJkZW4oeyBwdWJsaXNoZXIsIHN1YnNjcmliZXIgfSk7XG59OyRozY9fb25jZS5tYWtlUHVibGlzaEtpdChtYWtlUHVibGlzaEtpdCk7XG5oYXJkZW4obWFrZVB1Ymxpc2hLaXQpO1xuXG5jb25zdCBEdXJhYmxlUHVibGlzaEtpdFN0YXRlU2hhcGUgPSBoYXJkZW4oe1xuICB2YWx1ZUR1cmFiaWxpdHk6IE0uYW55KCksXG4gIHB1Ymxpc2hDb3VudDogTS5hbnkoKSxcbiAgc3RhdHVzOiBNLmFueSgpLFxuICBoYXNWYWx1ZTogTS5hbnkoKSxcbiAgdmFsdWU6IE0uYW55KCksXG59KTtcblxuLyogVE9ETzogTW92ZSBkdXJhYmxlIHB1Ymxpc2gga2l0IHRvIGEgbmV3IGZpbGU/Ki9cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge0R1cmFibGVQdWJsaXNoS2l0VmFsdWVEdXJhYmlsaXR5ICYgJ21hbmRhdG9yeSd9IFtvcHRpb25zLnZhbHVlRHVyYWJpbGl0eV1cbiAqIEByZXR1cm5zIHtEdXJhYmxlUHVibGlzaEtpdFN0YXRlfVxuICovXG5jb25zdCBpbml0RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZSA9IChvcHRpb25zID0ge30pID0+IHtcbiAgY29uc3QgeyB2YWx1ZUR1cmFiaWxpdHkgPSAnbWFuZGF0b3J5JyB9ID0gb3B0aW9ucztcbiAgYXNzZXJ0LmVxdWFsKHZhbHVlRHVyYWJpbGl0eSwgJ21hbmRhdG9yeScpO1xuICByZXR1cm4ge1xuICAgIC8qIGNvbmZpZ3VyYXRpb24qL1xuICAgIHZhbHVlRHVyYWJpbGl0eSxcblxuICAgIC8qIGxpZmVjeWNsZSBwcm9ncmVzcyovXG4gICAgcHVibGlzaENvdW50OiAwbixcbiAgICBzdGF0dXM6ICdsaXZlJywgLyogfCAnZmluaXNoZWQnIHwgJ2ZhaWxlZCcqL1xuXG4gICAgLyogcGVyc2lzdGVkIHJlc3VsdCBkYXRhKi9cbiAgICAvKiBOb3RlIHRoYXQgaW4gYWRkaXRpb24gdG8gbm9uLXRlcm1pbmFsIHZhbHVlcyBmcm9tIGBwdWJsaXNoYCwqL1xuICAgIC8qIHZhbHVlIGFsc28gaG9sZHMgdGhlIHRlcm1pbmFsIHZhbHVlIGZyb20gYGZpbmlzaGAgb3IgYGZhaWxgLiovXG4gICAgaGFzVmFsdWU6IGZhbHNlLFxuICAgIHZhbHVlOiB1bmRlZmluZWQsXG4gIH07XG59O1xuXG4vKiBXZSBuZWVkIHRoZSBXZWFrTWFwIGtleSBmb3IgYSBraXQgdG8gYmUgYSB2cmVmLWJlYXJpbmcgb2JqZWN0Ki9cbi8qIGluIGl0cyBjb2hvcnQsIGFuZCBoYXZlIGFyYml0cmFyaWx5IGNob3NlbiB0aGUgcHVibGlzaGVyIGZhY2V0LiovXG4vKiogQHR5cGVkZWYge1B1Ymxpc2hlcjwqPn0gRHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxLZXkgKi9cbi8qKlxuICogQHBhcmFtIHtQdWJsaXNoS2l0PCo+fSBmYWNldHNcbiAqIEByZXR1cm5zIHtEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbEtleX1cbiAqL1xuY29uc3QgZ2V0RXBoZW1lcmFsS2V5ID0gZmFjZXRzID0+IGZhY2V0cy5wdWJsaXNoZXI7XG5cbi8qKlxuICogQHR5cGVkZWYgRHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhXG4gKiBAcHJvcGVydHkge1Byb21pc2U8Kj4gfCB1bmRlZmluZWR9IGN1cnJlbnRQIFRoZSBjdXJyZW50LXJlc3VsdCBwcm9taXNlXG4gKiAgICh1bmRlZmluZWQgdW5sZXNzIHJlc29sdmVkIHdpdGggdW5yZWNvdmVyYWJsZSBlcGhlbWVyYWwgZGF0YSlcbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZTwqPn0gdGFpbFAgVGhlIG5leHQtcmVzdWx0IHByb21pc2VcbiAqIEBwcm9wZXJ0eSB7KCh2YWx1ZTogYW55KSA9PiB2b2lkKSB8IHVuZGVmaW5lZH0gdGFpbFIgVGhlIG5leHQtcmVzdWx0IHJlc29sdmVyXG4gKiAgICh1bmRlZmluZWQgd2hlbiB0aGUgcHVibGlzaCBraXQgaGFzIHRlcm1pbmF0ZWQpXG4gKi9cblxuLyoqIEB0eXBlIHtXZWFrTWFwPER1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsS2V5LCBEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGE+fSAqL1xuY29uc3QgZHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhID0gbmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBjdXJyZW50LXJlc3VsdCBwcm9taXNlIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGR1cmFibGVcbiAqIHB1Ymxpc2gga2l0LCByZWNyZWF0ZWQgdW5sZXNzIHdlIGFscmVhZHkgaGF2ZSBvbmUgd2l0aCByZXRhaW5lZFxuICogZXBoZW1lcmFsIGRhdGEuXG4gKlxuICogQHBhcmFtIHtEdXJhYmxlUHVibGlzaEtpdFN0YXRlfSBzdGF0ZVxuICogQHBhcmFtIHtQdWJsaXNoS2l0PCo+fSBmYWNldHNcbiAqIEBwYXJhbSB7UHJvbWlzZTwqPn0gdGFpbFxuICogQHJldHVybnMge1Byb21pc2U8Kj59XG4gKi9cbmNvbnN0IHByb3ZpZGVDdXJyZW50UCA9IChzdGF0ZSwgZmFjZXRzLCB0YWlsKSA9PiB7XG4gIGNvbnN0IGVwaGVtZXJhbEtleSA9IGdldEVwaGVtZXJhbEtleShmYWNldHMpO1xuICBjb25zdCBmb3VuZERhdGEgPSBkdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEuZ2V0KGVwaGVtZXJhbEtleSk7XG4gIGNvbnN0IGN1cnJlbnRQID0gZm91bmREYXRhICYmIGZvdW5kRGF0YS5jdXJyZW50UDtcbiAgaWYgKGN1cnJlbnRQKSB7XG4gICAgcmV0dXJuIGN1cnJlbnRQO1xuICB9XG5cbiAgY29uc3QgeyBwdWJsaXNoQ291bnQsIHN0YXR1cywgaGFzVmFsdWUsIHZhbHVlIH0gPSBzdGF0ZTtcbiAgaWYgKCFoYXNWYWx1ZSkge1xuICAgIGFzc2VydChzdGF0dXMgPT09ICdsaXZlJyk7XG4gICAgcmV0dXJuIHRhaWw7XG4gIH1cbiAgaWYgKHN0YXR1cyA9PT0gJ2xpdmUnIHx8IHN0YXR1cyA9PT0gJ2ZpbmlzaGVkJykge1xuICAgIGNvbnN0IGNlbGwgPSBoYXJkZW4oe1xuICAgICAgaGVhZDogeyB2YWx1ZSwgZG9uZTogc3RhdHVzICE9PSAnbGl2ZScgfSxcbiAgICAgIHB1Ymxpc2hDb3VudCxcbiAgICAgIHRhaWwsXG4gICAgfSk7XG4gICAgcmV0dXJuIEUucmVzb2x2ZShjZWxsKTtcbiAgfSBlbHNlIGlmIChzdGF0dXMgPT09ICdmYWlsZWQnKSB7XG4gICAgcmV0dXJuIG1ha2VRdWlldFJlamVjdGlvbih2YWx1ZSk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgRmFpbGBJbnZhbGlkIGR1cmFibGUgcHJvbWlzZSBraXQgc3RhdHVzOiAke3Eoc3RhdHVzKX1gO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIG5leHQtcmVzdWx0IHByb21pc2UgYW5kIHJlc29sdmVyIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuXG4gKiBkdXJhYmxlIHB1Ymxpc2gga2l0LlxuICogVGhlc2UgYXJlIGxvc3Qgb24gdXBncmFkZSBidXQgcmVjcmVhdGVkIG9uLWRlbWFuZCwgcHJlc2VydmluZyB0aGVcbiAqIHZhbHVlIGluIChidXQgbm90IHRoZSBpZGVudGl0eSBvZikgdGhlIGN1cnJlbnQgeyB2YWx1ZSwgZG9uZSB9IHJlc3VsdFxuICogd2hlbiBwb3NzaWJsZSwgd2hpY2ggaXMgYWx3YXlzIHRoZSBjYXNlIHdoZW4gdGhhdCB2YWx1ZSBpcyB0ZXJtaW5hbFxuICogKGkuZS4sIGZyb20gYGZpbmlzaGAgb3IgYGZhaWxgKSBvciB3aGVuIHRoZSBkdXJhYmxlIHB1Ymxpc2gga2l0IGlzXG4gKiBjb25maWd1cmVkIHdpdGggYHZhbHVlRHVyYWJpbGl0eTogJ21hbmRhdG9yeSdgLlxuICpcbiAqIEBwYXJhbSB7RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZX0gc3RhdGVcbiAqIEBwYXJhbSB7UHVibGlzaEtpdDwqPn0gZmFjZXRzXG4gKiBAcmV0dXJucyB7RHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhfVxuICovXG5jb25zdCBwcm92aWRlRHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhID0gKHN0YXRlLCBmYWNldHMpID0+IHtcbiAgY29uc3QgZXBoZW1lcmFsS2V5ID0gZ2V0RXBoZW1lcmFsS2V5KGZhY2V0cyk7XG4gIGNvbnN0IGZvdW5kRGF0YSA9IGR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YS5nZXQoZXBoZW1lcmFsS2V5KTtcbiAgaWYgKGZvdW5kRGF0YSkge1xuICAgIHJldHVybiBmb3VuZERhdGE7XG4gIH1cblxuICBjb25zdCB7IHN0YXR1cyB9ID0gc3RhdGU7XG4gIGxldCB0YWlsUDtcbiAgbGV0IHRhaWxSO1xuICBpZiAoc3RhdHVzID09PSAnbGl2ZScpIHtcbiAgICAoeyBwcm9taXNlOiB0YWlsUCwgcmVzb2x2ZTogdGFpbFIgfSA9IG1ha2VQcm9taXNlS2l0KCkpO1xuICAgIHZvaWQgRS53aGVuKHRhaWxQLCBzaW5rLCBzaW5rKTtcbiAgfSBlbHNlIGlmIChzdGF0dXMgPT09ICdmaW5pc2hlZCcgfHwgc3RhdHVzID09PSAnZmFpbGVkJykge1xuICAgIHRhaWxQID0gdG9vRmFyUmVqZWN0aW9uO1xuICB9IGVsc2Uge1xuICAgIHRocm93IEZhaWxgSW52YWxpZCBkdXJhYmxlIHByb21pc2Uga2l0IHN0YXR1czogJHtxKHN0YXR1cyl9YDtcbiAgfVxuICAvKiBjdXJyZW50UCBpcyBub3QgZXBoZW1lcmFsIHdoZW4gcmVzdG9yaW5nIGZyb20gcGVyc2lzdGVkIHN0YXRlLiovXG4gIGNvbnN0IG9iaiA9IGhhcmRlbih7IGN1cnJlbnRQOiB1bmRlZmluZWQsIHRhaWxQLCB0YWlsUiB9KTtcbiAgZHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhLnNldChlcGhlbWVyYWxLZXksIG9iaik7XG4gIHJldHVybiBvYmo7XG59O1xuXG4vKipcbiAqIEV4dGVuZHMgdGhlIHNlcXVlbmNlIG9mIHJlc3VsdHMuXG4gKlxuICogQHBhcmFtIHt7c3RhdGU6IER1cmFibGVQdWJsaXNoS2l0U3RhdGUsIGZhY2V0czogUHVibGlzaEtpdDwqPn19IGNvbnRleHRcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICogQHBhcmFtIHtEdXJhYmxlUHVibGlzaEtpdFN0YXRlWydzdGF0dXMnXX0gW3RhcmdldFN0YXR1c11cbiAqL1xuY29uc3QgYWR2YW5jZUR1cmFibGVQdWJsaXNoS2l0ID0gKGNvbnRleHQsIHZhbHVlLCB0YXJnZXRTdGF0dXMgPSAnbGl2ZScpID0+IHtcbiAgY29uc3QgeyBzdGF0ZSwgZmFjZXRzIH0gPSBjb250ZXh0O1xuICBjb25zdCB7IHZhbHVlRHVyYWJpbGl0eSwgc3RhdHVzIH0gPSBzdGF0ZTtcbiAgaWYgKHN0YXR1cyAhPT0gJ2xpdmUnKSB7XG4gICAgdGhyb3cgRXJyb3IoJ0Nhbm5vdCB1cGRhdGUgc3RhdGUgYWZ0ZXIgdGVybWluYXRpb24uJyk7XG4gIH1cbiAgY29uc3QgZG9uZSA9IHRhcmdldFN0YXR1cyAhPT0gJ2xpdmUnO1xuICBpZiAoZG9uZSB8fCB2YWx1ZUR1cmFiaWxpdHkgPT09ICdtYW5kYXRvcnknKSB7XG4gICAgY2FuQmVEdXJhYmxlKHZhbHVlKSB8fCBGYWlsYENhbm5vdCBhY2NlcHQgbm9uLWR1cmFibGUgdmFsdWU6ICR7dmFsdWV9YDtcbiAgfVxuICBjb25zdCB7IHRhaWxQOiBvbGRUYWlsUCwgdGFpbFI6IHJlc29sdmVPbGRUYWlsIH0gPVxuICAgIHByb3ZpZGVEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEoc3RhdGUsIGZhY2V0cyk7XG4gIGFzc2VydC50eXBlb2YocmVzb2x2ZU9sZFRhaWwsICdmdW5jdGlvbicpO1xuXG4gIGNvbnN0IHB1Ymxpc2hDb3VudCA9IHN0YXRlLnB1Ymxpc2hDb3VudCArIDFuO1xuICBzdGF0ZS5wdWJsaXNoQ291bnQgPSBwdWJsaXNoQ291bnQ7XG5cbiAgbGV0IHRhaWxQO1xuICBsZXQgdGFpbFI7XG4gIGlmIChkb25lKSB7XG4gICAgc3RhdGUuc3RhdHVzID0gdGFyZ2V0U3RhdHVzO1xuICAgIHRhaWxQID0gdG9vRmFyUmVqZWN0aW9uO1xuICAgIHRhaWxSID0gdW5kZWZpbmVkO1xuICB9IGVsc2Uge1xuICAgICh7IHByb21pc2U6IHRhaWxQLCByZXNvbHZlOiB0YWlsUiB9ID0gbWFrZVByb21pc2VLaXQoKSk7XG4gICAgdm9pZCBFLndoZW4odGFpbFAsIHNpbmssIHNpbmspO1xuICB9XG5cbiAgbGV0IGN1cnJlbnRQO1xuICBpZiAodGFyZ2V0U3RhdHVzID09PSAnZmFpbGVkJykge1xuICAgIHN0YXRlLmhhc1ZhbHVlID0gdHJ1ZTtcbiAgICBzdGF0ZS52YWx1ZSA9IHZhbHVlO1xuICAgIGNvbnN0IHJlamVjdGlvbiA9IG1ha2VRdWlldFJlamVjdGlvbih2YWx1ZSk7XG4gICAgcmVzb2x2ZU9sZFRhaWwocmVqZWN0aW9uKTtcbiAgfSBlbHNlIHtcbiAgICAvKiBQZXJzaXN0IGEgdGVybWluYWwgdmFsdWUsIG9yIGEgbm9uLXRlcm1pbmFsIHZhbHVlKi9cbiAgICAvKiBpZiBjb25maWd1cmVkIGFzICdtYW5kYXRvcnknIG9yICdvcHBvcnR1bmlzdGljJy4qL1xuICAgIGlmIChkb25lIHx8ICh2YWx1ZUR1cmFiaWxpdHkgIT09ICdpZ25vcmVkJyAmJiBjYW5CZUR1cmFibGUodmFsdWUpKSkge1xuICAgICAgc3RhdGUuaGFzVmFsdWUgPSB0cnVlO1xuICAgICAgc3RhdGUudmFsdWUgPSB2YWx1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUuaGFzVmFsdWUgPSBmYWxzZTtcbiAgICAgIHN0YXRlLnZhbHVlID0gdW5kZWZpbmVkO1xuICAgICAgLyogUmV0YWluIGFueSBwcm9taXNlIHdpdGggbm9uLWR1cmFibGUgcmVzb2x1dGlvbi4qL1xuICAgICAgY3VycmVudFAgPSBvbGRUYWlsUDtcbiAgICB9XG5cbiAgICByZXNvbHZlT2xkVGFpbChcbiAgICAgIGhhcmRlbih7XG4gICAgICAgIGhlYWQ6IHsgdmFsdWUsIGRvbmUgfSxcbiAgICAgICAgcHVibGlzaENvdW50LFxuICAgICAgICB0YWlsOiB0YWlsUCxcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBkdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEuc2V0KFxuICAgIGdldEVwaGVtZXJhbEtleShmYWNldHMpLFxuICAgIGhhcmRlbih7IGN1cnJlbnRQLCB0YWlsUCwgdGFpbFIgfSksXG4gICk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IGtpbmROYW1lXG4gKiBAcmV0dXJucyB7PFQ+KG9wdGlvbnM/OiBQYXJhbWV0ZXJzPHR5cGVvZiBpbml0RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZT5bMF0pID0+IFB1Ymxpc2hLaXQ8VD59XG4gKi9cbiAgICAgICBjb25zdCBwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQgPSAoYmFnZ2FnZSwga2luZE5hbWUpID0+IHtcbiAgLyogVE9ETzogT25jZSB3ZSB1bmlmeSB3aXRoIG1ha2VQdWJsaXNoS2l0LCB3ZSB3aWxsIHVzZSBhIFpvbmUtY29tcGF0aWJsZSB3ZWFrKi9cbiAgLyogbWFwIGZvciBtZW1vaXphdGlvbi4qL1xuICBjb25zdCBtYWtlTWVtb2l6ZWRVcGRhdGVSZWNvcmQgPSBtYWtlVXBkYXRlUmVjb3JkRnJvbVB1YmxpY2F0aW9uUmVjb3JkO1xuXG4gIHJldHVybiBwcmVwYXJlRXhvQ2xhc3NLaXQoXG4gICAgYmFnZ2FnZSxcbiAgICBraW5kTmFtZSxcbiAgICBwdWJsaXNoS2l0SUtpdCxcbiAgICBpbml0RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZSxcbiAgICB7XG4gICAgICAvKiBUaGUgcHVibGlzaGVyIGZhY2V0IG9mIGEgZHVyYWJsZSBwdWJsaXNoIGtpdCovXG4gICAgICAvKiBhY2NlcHRzIG5ldyB2YWx1ZXMuKi9cbiAgICAgIHB1Ymxpc2hlcjoge1xuICAgICAgICBwdWJsaXNoKHZhbHVlKSB7XG4gICAgICAgICAgYWR2YW5jZUR1cmFibGVQdWJsaXNoS2l0KHRoaXMsIHZhbHVlKTtcbiAgICAgICAgfSxcbiAgICAgICAgZmluaXNoKGZpbmFsVmFsdWUpIHtcbiAgICAgICAgICBhZHZhbmNlRHVyYWJsZVB1Ymxpc2hLaXQodGhpcywgZmluYWxWYWx1ZSwgJ2ZpbmlzaGVkJyk7XG4gICAgICAgIH0sXG4gICAgICAgIGZhaWwocmVhc29uKSB7XG4gICAgICAgICAgYWR2YW5jZUR1cmFibGVQdWJsaXNoS2l0KHRoaXMsIHJlYXNvbiwgJ2ZhaWxlZCcpO1xuICAgICAgICB9LFxuICAgICAgfSxcblxuICAgICAgLyogVGhlIHN1YnNjcmliZXIgZmFjZXQgb2YgYSBkdXJhYmxlIHB1Ymxpc2gga2l0Ki9cbiAgICAgIC8qIHByb3BhZ2F0ZXMgdmFsdWVzLiovXG4gICAgICBzdWJzY3JpYmVyOiB7XG4gICAgICAgIHN1YnNjcmliZUFmdGVyKHB1Ymxpc2hDb3VudCA9IC0xbikge1xuICAgICAgICAgIGNvbnN0IHsgc3RhdGUsIGZhY2V0cyB9ID0gdGhpcztcbiAgICAgICAgICBjb25zdCB7IHB1Ymxpc2hDb3VudDogY3VycmVudFB1Ymxpc2hDb3VudCB9ID0gc3RhdGU7XG4gICAgICAgICAgY29uc3QgeyBjdXJyZW50UCwgdGFpbFAgfSA9IHByb3ZpZGVEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEoXG4gICAgICAgICAgICBzdGF0ZSxcbiAgICAgICAgICAgIGZhY2V0cyxcbiAgICAgICAgICApO1xuICAgICAgICAgIGlmIChwdWJsaXNoQ291bnQgPT09IGN1cnJlbnRQdWJsaXNoQ291bnQpIHtcbiAgICAgICAgICAgIHJldHVybiB0YWlsUDtcbiAgICAgICAgICB9IGVsc2UgaWYgKHB1Ymxpc2hDb3VudCA8IGN1cnJlbnRQdWJsaXNoQ291bnQpIHtcbiAgICAgICAgICAgIHJldHVybiBjdXJyZW50UCB8fCBwcm92aWRlQ3VycmVudFAoc3RhdGUsIGZhY2V0cywgdGFpbFApO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcihcbiAgICAgICAgICAgICAgJ3N1YnNjcmliZUFmdGVyIGFyZ3VtZW50IG11c3QgYmUgYSBwcmV2aW91c2x5LWlzc3VlZCBwdWJsaXNoQ291bnQuJyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBnZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCkge1xuICAgICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGZhY2V0czogeyBzdWJzY3JpYmVyIH0sXG4gICAgICAgICAgfSA9IHRoaXM7XG4gICAgICAgICAgaWYgKHVwZGF0ZUNvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzdWJzY3JpYmVyLnN1YnNjcmliZUFmdGVyKCkudGhlbihtYWtlTWVtb2l6ZWRVcGRhdGVSZWNvcmQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICB1cGRhdGVDb3VudCA9IEJpZ0ludCh1cGRhdGVDb3VudCk7XG4gICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHN1YnNjcmliZXJcbiAgICAgICAgICAgICAgLyogYHN1YnNjcmliZUFmdGVyYCBtYXkgcmVzb2x2ZSB3aXRoIHRoZSB1cGRhdGUgcmVjb3JkIG51bWJlcmVkKi9cbiAgICAgICAgICAgICAgLyogYHVwZGF0ZUNvdW50ICsgMWAsIGV2ZW4gaWYgc2V2ZXJhbCB1cGRhdGVzIGFyZSBwdWJsaXNoZWQgaW4gdGhlKi9cbiAgICAgICAgICAgICAgLyogc2FtZSBjcmFuay4uLiovXG4gICAgICAgICAgICAgIC5zdWJzY3JpYmVBZnRlcih1cGRhdGVDb3VudClcbiAgICAgICAgICAgICAgLyogLi4uIHNvIHdlIHBvbGwgdGhlIGxhdGVzdCBwdWJsaXNoZWQgdXBkYXRlLCB3aXRob3V0IHdhaXRpbmcgZm9yIGFueSovXG4gICAgICAgICAgICAgIC8qIGZ1cnRoZXIgb25lcy4qL1xuICAgICAgICAgICAgICAudGhlbigoKSA9PiBzdWJzY3JpYmVyLmdldFVwZGF0ZVNpbmNlKCkpXG4gICAgICAgICAgKTtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7XG4gICAgICBzdGF0ZVNoYXBlOiBEdXJhYmxlUHVibGlzaEtpdFN0YXRlU2hhcGUsXG4gICAgfSxcbiAgKTtcbn07JGjNj19vbmNlLnByZXBhcmVEdXJhYmxlUHVibGlzaEtpdChwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQpO1xuaGFyZGVuKHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCk7XG5cbiAgICAgICBjb25zdCBTdWJzY3JpYmVyU2hhcGUgPSBNLnJlbW90YWJsZSgnU3Vic2NyaWJlcicpOyRozY9fb25jZS5TdWJzY3JpYmVyU2hhcGUoU3Vic2NyaWJlclNoYXBlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlB1Ymxpc2hlckkiOlsiUHVibGlzaGVySSJdLCJVcGRhdGVDb3VudFNoYXBlIjpbIlVwZGF0ZUNvdW50U2hhcGUiXSwiU3Vic2NyaWJlckkiOlsiU3Vic2NyaWJlckkiXSwicHVibGlzaEtpdElLaXQiOlsicHVibGlzaEtpdElLaXQiXSwiRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3JTaGFwZSI6WyJGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvclNoYXBlIl0sIkl0ZXJhYmxlRWFjaFRvcGljSSI6WyJJdGVyYWJsZUVhY2hUb3BpY0kiXSwiSXRlcmFibGVMYXRlc3RUb3BpY0kiOlsiSXRlcmFibGVMYXRlc3RUb3BpY0kiXSwibWFrZVB1Ymxpc2hLaXQiOlsibWFrZVB1Ymxpc2hLaXQiXSwicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0IjpbInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCJdLCJTdWJzY3JpYmVyU2hhcGUiOlsiU3Vic2NyaWJlclNoYXBlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACxIRDeqDAAAqgwAAC4AAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3RvcmVkLW5vdGlmaWVyLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzIiwiQGVuZG8vZmFyIiwiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyJdLCJleHBvcnRzIjpbIm1ha2VTdG9yZWROb3RpZmllciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzc2VydEFsbERlZmluZWQsbWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSxFLEZhcixvYnNlcnZlTm90aWZpZXI7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJhc3NlcnRBbGxEZWZpbmVkXCIsWyRozY9fYSA9PiAoYXNzZXJ0QWxsRGVmaW5lZCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanNcIiwgW1tcIm1ha2VTZXJpYWxpemVUb1N0b3JhZ2VcIixbJGjNj19hID0+IChtYWtlU2VyaWFsaXplVG9TdG9yYWdlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXSxbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzXCIsIFtbXCJvYnNlcnZlTm90aWZpZXJcIixbJGjNj19hID0+IChvYnNlcnZlTm90aWZpZXIgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtFUmVmfSBmcm9tICdAZW5kby9mYXInO1xuICogQGltcG9ydCB7QmFzZU5vdGlmaWVyLCBOb3RpZmllcn0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtFUmVtb3RlfSBmcm9tICdAYWdvcmljL2ludGVybmFsJztcbiAqIEBpbXBvcnQge0VNYXJzaGFsbGVyfSBmcm9tICdAYWdvcmljL2ludGVybmFsL3NyYy9tYXJzaGFsL3dyYXAtbWFyc2hhbGxlci5qcyc7XG4gKiBAaW1wb3J0IHtTdG9yZWRGYWNldCwgU3RvcmFnZU5vZGUsIFVuc2VyaWFsaXplcn0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyc7XG4gKiBAaW1wb3J0IHtQYXNzYWJsZUNhcH0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSc7XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge0Jhc2VOb3RpZmllcjxUPiAmIE9taXQ8U3RvcmVkRmFjZXQsICdnZXRTdG9yZUtleSc+fSBTdG9yZWROb3RpZmllclxuICovXG5cbi8qKlxuICogQmVnaW4gaXRlcmF0aW5nIHRoZSBzb3VyY2UsIHN0b3Jpbmcgc2VyaWFsaXplZCBpdGVyYXRpb24gdmFsdWVzLiAgSWYgdGhlXG4gKiBzdG9yYWdlTm9kZSdzIGBzZXRWYWx1ZWAgb3BlcmF0aW9uIHJlamVjdHMsIG5vIGZ1cnRoZXIgd3JpdGVzIHRvIGl0IHdpbGxcbiAqIGJlIGF0dGVtcHRlZCAoYnV0IHJlc3VsdHMgd2lsbCByZW1haW4gYXZhaWxhYmxlIGZyb20gdGhlIHN1YnNjcmliZXIpLlxuICpcbiAqIFJldHVybnMgYSBTdG9yZWROb3RpZmllciB0aGF0IGNhbiBiZSB1c2VkIGJ5IGEgY2xpZW50IHRvIGRpcmVjdGx5IGZvbGxvd1xuICogdGhlIGl0ZXJhdGlvbiB0aGVtc2VsdmVzLCBvciBvYnRhaW4gaW5mb3JtYXRpb24gdG8gc3Vic2NyaWJlIHRvIHRoZSBzdG9yZWRcbiAqIGRhdGEgb3V0LW9mLWJhbmQuXG4gKlxuICogQHRlbXBsYXRlIHtQYXNzYWJsZUNhcH0gVFxuICogQHBhcmFtIHtFUmVmPE5vdGlmaWVyPFQ+Pn0gbm90aWZpZXJcbiAqIEBwYXJhbSB7RVJlbW90ZTxTdG9yYWdlTm9kZT59IHN0b3JhZ2VOb2RlXG4gKiBAcGFyYW0ge0VSZW1vdGU8RU1hcnNoYWxsZXI+fSBtYXJzaGFsbGVyXG4gKiBAcmV0dXJucyB7U3RvcmVkTm90aWZpZXI8VD59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlU3RvcmVkTm90aWZpZXIgPSAobm90aWZpZXIsIHN0b3JhZ2VOb2RlLCBtYXJzaGFsbGVyKSA9PiB7XG4gIGFzc2VydEFsbERlZmluZWQoeyBub3RpZmllciwgc3RvcmFnZU5vZGUsIG1hcnNoYWxsZXIgfSk7XG5cbiAgY29uc3QgbWFyc2hhbGxUb1N0b3JhZ2UgPSBtYWtlU2VyaWFsaXplVG9TdG9yYWdlKHN0b3JhZ2VOb2RlLCBtYXJzaGFsbGVyKTtcblxuICBvYnNlcnZlTm90aWZpZXIobm90aWZpZXIsIHtcbiAgICB1cGRhdGVTdGF0ZSh2YWx1ZSkge1xuICAgICAgbWFyc2hhbGxUb1N0b3JhZ2UodmFsdWUpLmNhdGNoKHJlYXNvbiA9PlxuICAgICAgICBjb25zb2xlLmVycm9yKCdTdG9yZWROb3RpZmllciBmYWlsZWQgdG8gdXBkYXRlU3RhdGUnLCByZWFzb24pLFxuICAgICAgKTtcbiAgICB9LFxuICAgIGZhaWwocmVhc29uKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdTdG9yZWROb3RpZmllciBmYWlsZWQgdG8gaXRlcmF0ZScsIHJlYXNvbik7XG4gICAgfSxcbiAgfSkuY2F0Y2gocmVhc29uID0+IHtcbiAgICBjb25zb2xlLmVycm9yKCdTdG9yZWROb3RpZmllciBoYWx0ZWQgaXRlcmF0aW9uJywgcmVhc29uKTtcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtVbnNlcmlhbGl6ZXJ9ICovXG4gIGNvbnN0IHVuc2VyaWFsaXplciA9IEZhcigndW5zZXJpYWxpemVyJywge1xuICAgIGZyb21DYXBEYXRhOiBkYXRhID0+IEUobWFyc2hhbGxlcikuZnJvbUNhcERhdGEoZGF0YSksXG4gICAgdW5zZXJpYWxpemU6IGRhdGEgPT4gRShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtTdG9yZWROb3RpZmllcjxUPn0gKi9cbiAgY29uc3Qgc3RvcmVkTm90aWZpZXIgPSBGYXIoJ1N0b3JlZE5vdGlmaWVyJywge1xuICAgIGdldFVwZGF0ZVNpbmNlOiB1cGRhdGVDb3VudCA9PiBFKG5vdGlmaWVyKS5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCksXG4gICAgZ2V0UGF0aDogKCkgPT4gRShzdG9yYWdlTm9kZSkuZ2V0UGF0aCgpLFxuICAgIGdldFVuc2VyaWFsaXplcjogKCkgPT4gdW5zZXJpYWxpemVyLFxuICB9KTtcbiAgcmV0dXJuIHN0b3JlZE5vdGlmaWVyO1xufTskaM2PX29uY2UubWFrZVN0b3JlZE5vdGlmaWVyKG1ha2VTdG9yZWROb3RpZmllcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlU3RvcmVkTm90aWZpZXIiOlsibWFrZVN0b3JlZE5vdGlmaWVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHrmTl4kJgAAJCYAACcAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3RvcmVzdWIuanN7ImltcG9ydHMiOlsiQGVuZG8vZmFyIiwiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL2ludGVybmFsL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzIiwiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyIsIi4vcHVibGlzaC1raXQuanMiLCIuL3N1YnNjcmliZXIuanMiLCIuL3N1YnNjcmliZS5qcyJdLCJleHBvcnRzIjpbImZvckVhY2hQdWJsaWNhdGlvblJlY29yZCIsIm1ha2VTdG9yZWRQdWJsaXNoS2l0IiwibWFrZVN0b3JlZFB1Ymxpc2hlcktpdCIsIm1ha2VTdG9yZWRTdWJzY3JpYmVyIiwibWFrZVN0b3JlZFN1YnNjcmlwdGlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEUsRmFyLG1ha2VNYXJzaGFsLGFzc2VydEFsbERlZmluZWQsbWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSxvYnNlcnZlSXRlcmF0aW9uLG1ha2VQdWJsaXNoS2l0LG1ha2VTdWJzY3JpcHRpb25LaXQsc3Vic2NyaWJlRWFjaDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV0sW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wibWFrZU1hcnNoYWxcIixbJGjNj19hID0+IChtYWtlTWFyc2hhbCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcImFzc2VydEFsbERlZmluZWRcIixbJGjNj19hID0+IChhc3NlcnRBbGxEZWZpbmVkID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qc1wiLCBbW1wibWFrZVNlcmlhbGl6ZVRvU3RvcmFnZVwiLFskaM2PX2EgPT4gKG1ha2VTZXJpYWxpemVUb1N0b3JhZ2UgPSAkaM2PX2EpXV1dXSxbXCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzXCIsIFtbXCJvYnNlcnZlSXRlcmF0aW9uXCIsWyRozY9fYSA9PiAob2JzZXJ2ZUl0ZXJhdGlvbiA9ICRozY9fYSldXV1dLFtcIi4vcHVibGlzaC1raXQuanNcIiwgW1tcIm1ha2VQdWJsaXNoS2l0XCIsWyRozY9fYSA9PiAobWFrZVB1Ymxpc2hLaXQgPSAkaM2PX2EpXV1dXSxbXCIuL3N1YnNjcmliZXIuanNcIiwgW1tcIm1ha2VTdWJzY3JpcHRpb25LaXRcIixbJGjNj19hID0+IChtYWtlU3Vic2NyaXB0aW9uS2l0ID0gJGjNj19hKV1dXV0sW1wiLi9zdWJzY3JpYmUuanNcIiwgW1tcInN1YnNjcmliZUVhY2hcIixbJGjNj19hID0+IChzdWJzY3JpYmVFYWNoID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0VSZW1vdGV9IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwnO1xuICogQGltcG9ydCB7RVJlZn0gZnJvbSAnQGVuZG8vZmFyJztcbiAqIEBpbXBvcnQge0l0ZXJhdGlvbk9ic2VydmVyLCBMYXRlc3RUb3BpYywgTm90aWZpZXIsIE5vdGlmaWVyUmVjb3JkLCBQdWJsaWNhdGlvblJlY29yZCwgUHVibGlzaGVyLCBQdWJsaXNoS2l0LCBTdG9yZWRQdWJsaXNoS2l0LCBTdG9yZWRTdWJzY3JpcHRpb24sIFN0b3JlZFN1YnNjcmliZXIsIFN1YnNjcmliZXIsIFN1YnNjcmlwdGlvbiwgVXBkYXRlUmVjb3JkfSBmcm9tICcuLi9zcmMvdHlwZXMuanMnO1xuICogQGltcG9ydCB7U3RvcmFnZU5vZGUsIFVuc2VyaWFsaXplcn0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyc7XG4gKiBAaW1wb3J0IHtFTWFyc2hhbGxlcn0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbC9zcmMvbWFyc2hhbC93cmFwLW1hcnNoYWxsZXIuanMnO1xuICogQGltcG9ydCB7UGFzc2FibGVDYXB9IGZyb20gJ0BlbmRvL21hcnNoYWwnO1xuICovXG5cbi8qKlxuICogTkI6IGRvZXMgbm90IHlldCBzdXJ2aXZlIHVwZ3JhZGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82ODkzXG4gKlxuICogQGFscGhhXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtTdWJzY3JpYmVyPFQ+fSBzdWJzY3JpYmVyXG4gKiBAcGFyYW0geyh2OiBUKSA9PiB2b2lkfSBjb25zdW1lVmFsdWVcbiAqL1xuICAgICAgIGNvbnN0IGZvckVhY2hQdWJsaWNhdGlvblJlY29yZCA9IGFzeW5jIChzdWJzY3JpYmVyLCBjb25zdW1lVmFsdWUpID0+IHtcbiAgLyogV2Ugb3Blbi1jb2RlIHRoZSBmb3ItYXdhaXQtb2YgaW1wbGVtZW50YXRpb24gcmF0aGVyIHRoYW4gdXNpbmcgdGhhdCBzeW50YXgqL1xuICAvKiBkaXJlY3RseSBiZWNhdXNlIHdlIHdhbnQgdG8gcnVuIHRoZSBjb25zdW1lciBvbiB0aGUgZG9uZSB2YWx1ZSBhcyB3ZWxsLiovXG4gIGNvbnN0IGl0ZXJhdG9yID0gc3Vic2NyaWJlRWFjaChzdWJzY3JpYmVyKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcblxuICBsZXQgZmluaXNoZWQgPSBmYWxzZTtcbiAgYXdhaXQgbnVsbDtcbiAgd2hpbGUgKCFmaW5pc2hlZCkge1xuICAgIGNvbnN0IHsgdmFsdWUsIGRvbmUgfSA9IGF3YWl0IGl0ZXJhdG9yLm5leHQoKTtcbiAgICBhd2FpdCBjb25zdW1lVmFsdWUodmFsdWUpO1xuICAgIGZpbmlzaGVkID0gISFkb25lO1xuICB9XG59O1xuXG4vKipcbiAqIEJlZ2luIGl0ZXJhdGluZyB0aGUgc291cmNlLCBzdG9yaW5nIHNlcmlhbGl6ZWQgaXRlcmF0aW9uIHZhbHVlcy4gIElmIHRoZVxuICogc3RvcmFnZU5vZGUncyBgc2V0VmFsdWVgIG9wZXJhdGlvbiByZWplY3RzLCBubyBmdXJ0aGVyIHdyaXRlcyB0byBpdCB3aWxsXG4gKiBiZSBhdHRlbXB0ZWQgKGJ1dCByZXN1bHRzIHdpbGwgcmVtYWluIGF2YWlsYWJsZSBmcm9tIHRoZSBzdWJzY3JpYmVyKS5cbiAqXG4gKiBSZXR1cm5zIGEgU3RvcmVkU3Vic2NyaWJlciB0aGF0IGNhbiBiZSB1c2VkIGJ5IGEgY2xpZW50IHRvIGRpcmVjdGx5IGZvbGxvd1xuICogdGhlIGl0ZXJhdGlvbiB0aGVtc2VsdmVzLCBvciBvYnRhaW4gaW5mb3JtYXRpb24gdG8gc3Vic2NyaWJlIHRvIHRoZSBzdG9yZWRcbiAqIGRhdGEgb3V0LW9mLWJhbmQuXG4gKlxuICogQHRlbXBsYXRlIHtQYXNzYWJsZUNhcH0gVFxuICogQHBhcmFtIHtTdWJzY3JpYmVyPFQ+fSBzdWJzY3JpYmVyXG4gKiBAcGFyYW0ge0VSZW1vdGU8U3RvcmFnZU5vZGU+fSBzdG9yYWdlTm9kZVxuICogQHBhcmFtIHtFUmVtb3RlPEVNYXJzaGFsbGVyPn0gbWFyc2hhbGxlclxuICogQHJldHVybnMge1N0b3JlZFN1YnNjcmliZXI8VD59XG4gKi8kaM2PX29uY2UuZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkKGZvckVhY2hQdWJsaWNhdGlvblJlY29yZCk7XG4gICAgICAgY29uc3QgbWFrZVN0b3JlZFN1YnNjcmliZXIgPSAoc3Vic2NyaWJlciwgc3RvcmFnZU5vZGUsIG1hcnNoYWxsZXIpID0+IHtcbiAgYXNzZXJ0QWxsRGVmaW5lZCh7IHN1YnNjcmliZXIsIHN0b3JhZ2VOb2RlLCBtYXJzaGFsbGVyIH0pO1xuXG4gIGNvbnN0IG1hcnNoYWxsVG9TdG9yYWdlID0gbWFrZVNlcmlhbGl6ZVRvU3RvcmFnZShzdG9yYWdlTm9kZSwgbWFyc2hhbGxlcik7XG5cbiAgLyogU3RhcnQgcHVibGlzaGluZyB0aGUgc291cmNlLiovXG4gIGZvckVhY2hQdWJsaWNhdGlvblJlY29yZChzdWJzY3JpYmVyLCBtYXJzaGFsbFRvU3RvcmFnZSkuY2F0Y2goZXJyID0+IHtcbiAgICAvKiBUT0RPOiBIb3cgc2hvdWxkIHdlIGhhbmRsZSBhbmQvb3Igc3VyZmFjZSB0aGlzIGZhaWx1cmU/Ki9cbiAgICAvKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC81NzY2I2Rpc2N1c3Npb25fcjkyMjQ5ODA4OCovXG4gICAgY29uc29sZS5lcnJvcignU3RvcmVkU3Vic2NyaWJlciBmYWlsZWQgdG8gaXRlcmF0ZScsIGVycik7XG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7VW5zZXJpYWxpemVyfSAqL1xuICBjb25zdCB1bnNlcmlhbGl6ZXIgPSBGYXIoJ3Vuc2VyaWFsaXplcicsIHtcbiAgICBmcm9tQ2FwRGF0YTogZGF0YSA9PiBFKG1hcnNoYWxsZXIpLmZyb21DYXBEYXRhKGRhdGEpLFxuICAgIHVuc2VyaWFsaXplOiBkYXRhID0+IEUobWFyc2hhbGxlcikuZnJvbUNhcERhdGEoZGF0YSksXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7U3RvcmVkU3Vic2NyaWJlcjxUPn0gKi9cbiAgY29uc3Qgc3RvcmVzdWIgPSBGYXIoJ1N0b3JlZFN1YnNjcmliZXInLCB7XG4gICAgc3Vic2NyaWJlQWZ0ZXI6IHB1Ymxpc2hDb3VudCA9PiBzdWJzY3JpYmVyLnN1YnNjcmliZUFmdGVyKHB1Ymxpc2hDb3VudCksXG4gICAgZ2V0VXBkYXRlU2luY2U6IHVwZGF0ZUNvdW50ID0+IHN1YnNjcmliZXIuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpLFxuICAgIGdldFBhdGg6ICgpID0+IEUoc3RvcmFnZU5vZGUpLmdldFBhdGgoKSxcbiAgICBnZXRTdG9yZUtleTogKCkgPT4gRShzdG9yYWdlTm9kZSkuZ2V0U3RvcmVLZXkoKSxcbiAgICBnZXRVbnNlcmlhbGl6ZXI6ICgpID0+IHVuc2VyaWFsaXplcixcbiAgfSk7XG4gIHJldHVybiBzdG9yZXN1Yjtcbn07XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIG1ha2VTdG9yZWRTdWJzY3JpYmVyXG4gKlxuICogQmVnaW4gaXRlcmF0aW5nIHRoZSBzb3VyY2UsIHN0b3Jpbmcgc2VyaWFsaXplZCBpdGVyYXRpb24gdmFsdWVzLiAgSWYgdGhlXG4gKiBzdG9yYWdlTm9kZSdzIGBzZXRWYWx1ZWAgb3BlcmF0aW9uIHJlamVjdHMsIHRoZSBpdGVyYXRpb24gd2lsbCBiZSB0ZXJtaW5hdGVkLlxuICpcbiAqIFJldHVybnMgYSBTdG9yZWRTdWJzY3JpcHRpb24gdGhhdCBjYW4gYmUgdXNlZCBieSBhIGNsaWVudCB0byBkaXJlY3RseSBmb2xsb3dcbiAqIHRoZSBpdGVyYXRpb24gdGhlbXNlbHZlcywgb3Igb2J0YWluIGluZm9ybWF0aW9uIHRvIHN1YnNjcmliZSB0byB0aGUgc3RvcmVkXG4gKiBkYXRhIG91dC1vZi1iYW5kLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1N1YnNjcmlwdGlvbjxUPn0gc3Vic2NyaXB0aW9uXG4gKiBAcGFyYW0ge0VSZW1vdGU8U3RvcmFnZU5vZGU+IHwgbnVsbH0gW3N0b3JhZ2VOb2RlXVxuICogQHBhcmFtIHtFUmVtb3RlPEVNYXJzaGFsbGVyPn0gW21hcnNoYWxsZXJdXG4gKiBAcmV0dXJucyB7U3RvcmVkU3Vic2NyaXB0aW9uPFQ+fVxuICovJGjNj19vbmNlLm1ha2VTdG9yZWRTdWJzY3JpYmVyKG1ha2VTdG9yZWRTdWJzY3JpYmVyKTtcbiAgICAgICBjb25zdCBtYWtlU3RvcmVkU3Vic2NyaXB0aW9uID0gKFxuICBzdWJzY3JpcHRpb24sXG4gIHN0b3JhZ2VOb2RlLFxuICBtYXJzaGFsbGVyID0gbWFrZU1hcnNoYWwodW5kZWZpbmVkLCB1bmRlZmluZWQsIHtcbiAgICBtYXJzaGFsU2F2ZUVycm9yOiAoKSA9PiB7fSxcbiAgICBzZXJpYWxpemVCb2R5Rm9ybWF0OiAnc21hbGxjYXBzJyxcbiAgfSksXG4pID0+IHtcbiAgLyoqIEB0eXBlIHtVbnNlcmlhbGl6ZXJ9ICovXG4gIGNvbnN0IHVuc2VyaWFsaXplciA9IEZhcigndW5zZXJpYWxpemVyJywge1xuICAgIGZyb21DYXBEYXRhOiBkYXRhID0+IEUobWFyc2hhbGxlcikuZnJvbUNhcERhdGEoZGF0YSksXG4gICAgdW5zZXJpYWxpemU6IGRhdGEgPT4gRShtYXJzaGFsbGVyKS5mcm9tQ2FwRGF0YShkYXRhKSxcbiAgfSk7XG5cbiAgLyogQWJvcnQgdGhlIGl0ZXJhdGlvbiBvbiB0aGUgbmV4dCBvYnNlcnZhdGlvbiBpZiB0aGUgcHVibGlzaGVyIGV2ZXIgZmFpbHMuKi9cbiAgbGV0IHB1Ymxpc2hGYWlsZWQgPSBmYWxzZTtcbiAgbGV0IHB1Ymxpc2hFeGNlcHRpb247XG5cbiAgY29uc3QgZmFpbCA9IGVyciA9PiB7XG4gICAgcHVibGlzaEZhaWxlZCA9IHRydWU7XG4gICAgcHVibGlzaEV4Y2VwdGlvbiA9IGVycjtcbiAgfTtcblxuICAvKiBNdXN0ICpub3QqIGJlIGFuIGFzeW5jIGZ1bmN0aW9uLCBiZWNhdXNlIGl0IHNvbWV0aW1lcyBtdXN0IHRocm93IHRvIGFib3J0Ki9cbiAgLyogdGhlIGl0ZXJhdGlvbi4qL1xuICBjb25zdCBwdWJsaXNoVmFsdWUgPSBvYmogPT4ge1xuICAgIGFzc2VydChzdG9yYWdlTm9kZSk7XG4gICAgaWYgKHB1Ymxpc2hGYWlsZWQpIHtcbiAgICAgIC8qIFRvIHByb3Blcmx5IGFib3J0IHRoZSBpdGVyYXRpb24sIHRoaXMgbXVzdCBiZSBhIHN5bmNocm9ub3VzIGV4Y2VwdGlvbi4qL1xuICAgICAgdGhyb3cgcHVibGlzaEV4Y2VwdGlvbjtcbiAgICB9XG5cbiAgICAvKiBQdWJsaXNoIHRoZSB2YWx1ZSwgY2FwdHVyaW5nIGFueSBlcnJvci4qL1xuICAgIEUobWFyc2hhbGxlcilcbiAgICAgIC50b0NhcERhdGEob2JqKVxuICAgICAgLnRoZW4oc2VyaWFsaXplZCA9PiB7XG4gICAgICAgIGNvbnN0IGVuY29kZWQgPSBKU09OLnN0cmluZ2lmeShzZXJpYWxpemVkKTtcbiAgICAgICAgcmV0dXJuIEUoc3RvcmFnZU5vZGUpLnNldFZhbHVlKGVuY29kZWQpO1xuICAgICAgfSlcbiAgICAgIC5jYXRjaChmYWlsKTtcbiAgfTtcblxuICBpZiAoc3RvcmFnZU5vZGUpIHtcbiAgICAvKiBTdGFydCBwdWJsaXNoaW5nIHRoZSBzb3VyY2UuKi9cbiAgICBvYnNlcnZlSXRlcmF0aW9uKHN1YnNjcmlwdGlvbiwge1xuICAgICAgdXBkYXRlU3RhdGU6IHB1Ymxpc2hWYWx1ZSxcbiAgICAgIGZpbmlzaDogcHVibGlzaFZhbHVlLFxuICAgIH0pLmNhdGNoKGZhaWwpO1xuICB9XG5cbiAgLyoqIEB0eXBlIHtTdG9yZWRTdWJzY3JpcHRpb248VD59ICovXG4gIGNvbnN0IHN0b3Jlc3ViID0gRmFyKCdTdG9yZWRTdWJzY3JpcHRpb24nLCB7XG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBnZXRTdG9yZUtleSB0eXBlIGRvZXMgbm90IGhhdmUgYHN1YnNjcmlwdGlvbmAqL1xuICAgIGdldFN0b3JlS2V5OiBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIXN0b3JhZ2VOb2RlKSB7XG4gICAgICAgIHJldHVybiBoYXJkZW4oeyBzdWJzY3JpcHRpb24gfSk7XG4gICAgICB9XG4gICAgICBjb25zdCBzdG9yZUtleSA9IGF3YWl0IEUoc3RvcmFnZU5vZGUpLmdldFN0b3JlS2V5KCk7XG4gICAgICByZXR1cm4gaGFyZGVuKHsgLi4uc3RvcmVLZXksIHN1YnNjcmlwdGlvbiB9KTtcbiAgICB9LFxuICAgIGdldFVuc2VyaWFsaXplcjogKCkgPT4gdW5zZXJpYWxpemVyLFxuICAgIGdldFNoYXJhYmxlU3Vic2NyaXB0aW9uSW50ZXJuYWxzOiAoKSA9PlxuICAgICAgc3Vic2NyaXB0aW9uLmdldFNoYXJhYmxlU3Vic2NyaXB0aW9uSW50ZXJuYWxzKCksXG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogKCkgPT4gc3Vic2NyaXB0aW9uW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpLFxuICAgIHN1YnNjcmliZUFmdGVyOiBwdWJsaXNoQ291bnQgPT4gc3Vic2NyaXB0aW9uLnN1YnNjcmliZUFmdGVyKHB1Ymxpc2hDb3VudCksXG4gIH0pO1xuICByZXR1cm4gc3RvcmVzdWI7XG59OyRozY9fb25jZS5tYWtlU3RvcmVkU3Vic2NyaXB0aW9uKG1ha2VTdG9yZWRTdWJzY3JpcHRpb24pO1xuaGFyZGVuKG1ha2VTdG9yZWRTdWJzY3JpcHRpb24pO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSBTdG9yZWRQdWJsaXNoS2l0XG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVkUHVibGlzaGVyS2l0XG4gKiBAcHJvcGVydHkge1N0b3JlZFN1YnNjcmlwdGlvbjxUPn0gc3Vic2NyaWJlclxuICogQHByb3BlcnR5IHtJdGVyYXRpb25PYnNlcnZlcjxUPn0gcHVibGlzaGVyXG4gKi9cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBpbmNvbXBhdGlibGUgd2l0aCBkdXJhYmlsaXR5OyBpbnN0ZWFkIGhhbmRsZSB2c3RvcmFnZSBlcGhlbWVyYWxseSBvbiBhIGR1cmFibGUgUHVibGlzaEtpdFxuICpcbiAqIEB0ZW1wbGF0ZSBbVD11bmtub3duXVxuICogQHBhcmFtIHtFUmVtb3RlPFN0b3JhZ2VOb2RlPiB8IG51bGx9IFtzdG9yYWdlTm9kZV1cbiAqIEBwYXJhbSB7RVJlbW90ZTxFTWFyc2hhbGxlcj59IFttYXJzaGFsbGVyXVxuICogQHBhcmFtIHtzdHJpbmd9IFtjaGlsZFBhdGhdXG4gKiBAcmV0dXJucyB7U3RvcmVkUHVibGlzaGVyS2l0PFQ+fVxuICovXG4gICAgICAgY29uc3QgbWFrZVN0b3JlZFB1Ymxpc2hlcktpdCA9IChzdG9yYWdlTm9kZSwgbWFyc2hhbGxlciwgY2hpbGRQYXRoKSA9PiB7XG4gIGNvbnN0IHsgcHVibGljYXRpb24sIHN1YnNjcmlwdGlvbiB9ID0gbWFrZVN1YnNjcmlwdGlvbktpdCgpO1xuXG4gIGlmIChzdG9yYWdlTm9kZSAmJiBjaGlsZFBhdGgpIHtcbiAgICBzdG9yYWdlTm9kZSA9IEUoc3RvcmFnZU5vZGUpLm1ha2VDaGlsZE5vZGUoY2hpbGRQYXRoKTtcbiAgfVxuXG4gIC8qIHdyYXAgdGhlIHN1YnNjcmlwdGlvbiB0byB0ZWUgZXZlbnRzIHRvIHN0b3JhZ2UsIHJlcGVhdGluZyB0byB0aGlzIGBzdWJzY3JpYmVyYCovXG4gIGNvbnN0IHN1YnNjcmliZXIgPSBtYWtlU3RvcmVkU3Vic2NyaXB0aW9uKFxuICAgIHN1YnNjcmlwdGlvbixcbiAgICBzdG9yYWdlTm9kZSxcbiAgICBtYXJzaGFsbGVyLFxuICApO1xuXG4gIHJldHVybiB7XG4gICAgcHVibGlzaGVyOiBwdWJsaWNhdGlvbixcbiAgICBzdWJzY3JpYmVyLFxuICB9O1xufTtcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBpbmNvbXBhdGlibGUgd2l0aCBkdXJhYmlsaXR5OyBpbnN0ZWFkIGhhbmRsZSB2c3RvcmFnZSBlcGhlbWVyYWxseSBvbiBhIGR1cmFibGUgUHVibGlzaEtpdFxuICpcbiAqIExpa2UgbWFrZVB1Ymxpc2hLaXQgdGhpcyBtYWtlcyBhIGB7IHB1Ymxpc2hlciwgc3Vic2NyaWJlciB9YCBwYWlyIGZvciBkb2luZyBlZmZpY2llbnRcbiAqIGRpc3RyaWJ1dGVkIHB1Yi9zdWIgc3VwcG9ydGluZyBib3RoIFwiZWFjaFwiIGFuZCBcImxhdGVzdFwiIGl0ZXJhdGlvblxuICogb2YgcHVibGlzaGVkIHZhbHVlcy5cbiAqXG4gKiBXaGF0J3MgZGlmZmVyZW50IGlzIGBzdWJzY3JpYmVyYCB0ZWVzIHJlY29yZHMsIHdyaXRpbmcgb3V0IHRvIHN0b3JhZ2VOb2RlLlxuICpcbiAqIEB0ZW1wbGF0ZSBbVD11bmtub3duXVxuICogQHBhcmFtIHtFUmVtb3RlPFN0b3JhZ2VOb2RlPn0gc3RvcmFnZU5vZGVcbiAqIEBwYXJhbSB7RVJlbW90ZTxFTWFyc2hhbGxlcj59IG1hcnNoYWxsZXJcbiAqIEByZXR1cm5zIHtTdG9yZWRQdWJsaXNoS2l0PFQ+fVxuICovJGjNj19vbmNlLm1ha2VTdG9yZWRQdWJsaXNoZXJLaXQobWFrZVN0b3JlZFB1Ymxpc2hlcktpdCk7XG4gICAgICAgY29uc3QgbWFrZVN0b3JlZFB1Ymxpc2hLaXQgPSAoc3RvcmFnZU5vZGUsIG1hcnNoYWxsZXIpID0+IHtcbiAgY29uc3QgeyBwdWJsaXNoZXIsIHN1YnNjcmliZXIgfSA9IG1ha2VQdWJsaXNoS2l0KCk7XG5cbiAgcmV0dXJuIHtcbiAgICBwdWJsaXNoZXIsXG4gICAgLyogd3JhcCB0aGUgc3Vic2NyaWJlciB0byB0ZWUgZXZlbnRzIHRvIHN0b3JhZ2UqL1xuICAgIHN1YnNjcmliZXI6IG1ha2VTdG9yZWRTdWJzY3JpYmVyKHN1YnNjcmliZXIsIHN0b3JhZ2VOb2RlLCBtYXJzaGFsbGVyKSxcbiAgfTtcbn07JGjNj19vbmNlLm1ha2VTdG9yZWRQdWJsaXNoS2l0KG1ha2VTdG9yZWRQdWJsaXNoS2l0KTtcbmhhcmRlbihtYWtlU3RvcmVkUHVibGlzaEtpdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJmb3JFYWNoUHVibGljYXRpb25SZWNvcmQiOlsiZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkIl0sIm1ha2VTdG9yZWRTdWJzY3JpYmVyIjpbIm1ha2VTdG9yZWRTdWJzY3JpYmVyIl0sIm1ha2VTdG9yZWRTdWJzY3JpcHRpb24iOlsibWFrZVN0b3JlZFN1YnNjcmlwdGlvbiJdLCJtYWtlU3RvcmVkUHVibGlzaGVyS2l0IjpbIm1ha2VTdG9yZWRQdWJsaXNoZXJLaXQiXSwibWFrZVN0b3JlZFB1Ymxpc2hLaXQiOlsibWFrZVN0b3JlZFB1Ymxpc2hLaXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAZA69fPIpAADyKQAAKAAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9zdWJzY3JpYmUuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZmFyIiwiQGVuZG8vbWFyc2hhbCIsIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3VwZ3JhZGUtYXBpLmpzIl0sImV4cG9ydHMiOlsic3Vic2NyaWJlIiwic3Vic2NyaWJlRWFjaCIsInN1YnNjcmliZUxhdGVzdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IFgsRmFpbCxhbm5vdGF0ZUVycm9yLEUsRmFyLGlzUHJpbWl0aXZlLGlzVXBncmFkZURpc2Nvbm5lY3Rpb247JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcImFubm90YXRlRXJyb3JcIixbJGjNj19hID0+IChhbm5vdGF0ZUVycm9yID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXSxbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJpc1ByaW1pdGl2ZVwiLFskaM2PX2EgPT4gKGlzUHJpbWl0aXZlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbC9zcmMvdXBncmFkZS1hcGkuanNcIiwgW1tcImlzVXBncmFkZURpc2Nvbm5lY3Rpb25cIixbJGjNj19hID0+IChpc1VwZ3JhZGVEaXNjb25uZWN0aW9uID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtFUmVmfSBmcm9tICdAZW5kby9mYXInO1xuICogQGltcG9ydCB7SXRlcmF0aW9uT2JzZXJ2ZXIsIExhdGVzdFRvcGljLCBOb3RpZmllciwgTm90aWZpZXJSZWNvcmQsIFB1YmxpY2F0aW9uUmVjb3JkLCBQdWJsaXNoZXIsIFB1Ymxpc2hLaXQsIFN0b3JlZFB1Ymxpc2hLaXQsIFN0b3JlZFN1YnNjcmlwdGlvbiwgU3RvcmVkU3Vic2NyaWJlciwgU3Vic2NyaWJlciwgU3Vic2NyaXB0aW9uLCBVcGRhdGVSZWNvcmQsIEVhY2hUb3BpYywgRm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3J9IGZyb20gJy4uL3NyYy90eXBlcy5qcyc7XG4gKi9cblxuY29uc3Qgc2luayA9ICgpID0+IHt9O1xuXG4vKipcbiAqIENoZWNrIHRoZSBwcm9taXNlIHJldHVybmVkIGJ5IGEgZnVuY3Rpb24gZm9yIHJlamVjdGlvbiBieSB2YXQgdXBncmFkZSxcbiAqIGFuZCByZWZldGNoIHVwb24gZW5jb3VudGVyaW5nIHRoYXQgY29uZGl0aW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0geygpID0+IEVSZWY8VD59IGdldHRlclxuICogQHBhcmFtIHtFUmVmPFQ+W119IFtzZWVkXVxuICogQHJldHVybnMge1Byb21pc2U8VD59XG4gKi9cbmNvbnN0IHJlY29ubmVjdEFzTmVlZGVkID0gYXN5bmMgKGdldHRlciwgc2VlZCA9IFtdKSA9PiB7XG4gIGxldCBkaXNjb25uZWN0aW9uO1xuICBsZXQgbGFzdFZlcnNpb24gPSAtSW5maW5pdHk7XG4gIC8qIEVuZCBzeW5jaHJvbm91cyBwcmVsdWRlLiovXG4gIGF3YWl0IG51bGw7XG4gIGZvciAobGV0IGkgPSAwOyA7IGkgKz0gMSkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCByZXN1bHRQID0gaSA8IHNlZWQubGVuZ3RoID8gc2VlZFtpXSA6IGdldHRlcigpO1xuICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcmVzdWx0UDtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICBpZiAoaXNVcGdyYWRlRGlzY29ubmVjdGlvbihlcnIpKSB7XG4gICAgICAgIGlmICghZGlzY29ubmVjdGlvbikge1xuICAgICAgICAgIGRpc2Nvbm5lY3Rpb24gPSBlcnI7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgeyBpbmNhcm5hdGlvbk51bWJlcjogdmVyc2lvbiB9ID0gZXJyO1xuICAgICAgICBpZiAodmVyc2lvbiA+IGxhc3RWZXJzaW9uKSB7XG4gICAgICAgICAgLyogV2UgZG9uJ3QgZXhwZWN0IGFub3RoZXIgdXBncmFkZSBpbiBiZXR3ZWVuIHJlY2VpdmluZyovXG4gICAgICAgICAgLyogYSBkaXNjb25uZWN0aW9uIGFuZCByZS1yZXF1ZXN0aW5nIGFuIHVwZGF0ZSwgYnV0IG11c3QqL1xuICAgICAgICAgIC8qIG5ldmVydGhlbGVzcyBiZSBwcmVwYXJlZCBmb3IgdGhhdC4qL1xuICAgICAgICAgIGxhc3RWZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLyogaWYgYGVycmAgaXMgYW4gKEVycm9yKSBvYmplY3QsIHdlIGNhbiB0cnkgdG8gYXNzb2NpYXRlIGl0IHdpdGgqL1xuICAgICAgLyogaW5mb3JtYXRpb24gYWJvdXQgdGhlIGRpc2Nvbm5lY3Rpb24gdGhhdCBwcm9tcHRlZCB0aGUgcmVxdWVzdCovXG4gICAgICAvKiBmb3Igd2hpY2ggaXQgaXMgYSByZXN1bHQuKi9cbiAgICAgIGlmICghaXNQcmltaXRpdmUoZXJyKSAmJiBkaXNjb25uZWN0aW9uICYmIGRpc2Nvbm5lY3Rpb24gIT09IGVycikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGFubm90YXRlRXJyb3IoXG4gICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICBYYEF0dGVtcHRpbmcgdG8gcmVjb3ZlciBmcm9tIGRpc2Nvbm5lY3Rpb246ICR7ZGlzY29ubmVjdGlvbn1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH0gY2F0Y2ggKF9lcnIpIHtcbiAgICAgICAgICAvKiBub29wKi9cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgdGhyb3cgZXJyO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBDcmVhdGUgYSBuZWFyIGl0ZXJhYmxlIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBwb3RlbnRpYWxseSBmYXIgb25lLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QXN5bmNJdGVyYWJsZUl0ZXJhdG9yPFQ+Pn0gaXRQXG4gKi9cbiAgICAgICBjb25zdCBzdWJzY3JpYmUgPSBpdFAgPT5cbiAgRmFyKCdBc3luY0l0ZXJhYmxlJywge1xuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIGNvbnN0IGl0ID0gRShpdFApW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpO1xuICAgICAgY29uc3Qgc2VsZiA9IEZhcignQXN5bmNJdGVyYWJsZUl0ZXJhdG9yJywge1xuICAgICAgICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiBzZWxmLFxuICAgICAgICBuZXh0OiBhc3luYyAoKSA9PiBFKGl0KS5uZXh0KCksXG4gICAgICB9KTtcbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0sXG4gIH0pO1xuXG4vKipcbiAqIEFzeW5jcm9ub3VzbHkgaXRlcmF0ZXMgb3ZlciB0aGUgY29udGVudHMgb2YgYSBQdWJsaWNhdGlvblJlY29yZCBjaGFpbiBhcyB0aGV5XG4gKiBhcHBlYXIuICBUaGlzIGl0ZXJhdGlvbiBtdXN0IGRyb3AgcGFydHMgb2YgcHVibGljYXRpb24gcmVjb3JkcyB0aGF0IGFyZSBub1xuICogbG9uZ2VyIG5lZWRlZCBzbyB0aGV5IGNhbiBiZSBnYXJiYWdlIGNvbGxlY3RlZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEVhY2hUb3BpYzxUPj59IHRvcGljXG4gKiBAcGFyYW0ge0VSZWY8UHVibGljYXRpb25SZWNvcmQ8VD4+fSBuZXh0Q2VsbFBcbiAqICAgUHVibGljYXRpb25SZWNvcmQgY29ycmVzcG9uZGluZyB3aXRoIHRoZSBmaXJzdCBpdGVyYXRpb24gcmVzdWx0XG4gKiBAcmV0dXJucyB7Rm9ya2FibGVBc3luY0l0ZXJhYmxlSXRlcmF0b3I8VCwgVD59XG4gKi8kaM2PX29uY2Uuc3Vic2NyaWJlKHN1YnNjcmliZSk7XG5jb25zdCBtYWtlRWFjaEl0ZXJhdG9yID0gKHRvcGljLCBuZXh0Q2VsbFApID0+IHtcbiAgLyogVG8gdW5kZXJzdGFuZCB0aGUgaW1wbGVtZW50YXRpb24sIHN0YXJ0IHdpdGgqL1xuICAvKiBodHRwczovL3dlYi5hcmNoaXZlLm9yZy93ZWIvMjAxNjA0MDQxMjIyNTAvaHR0cDovL3dpa2kuZWNtYXNjcmlwdC5vcmcvZG9rdS5waHA/aWQ9c3RyYXdtYW46Y29uY3VycmVuY3kjaW5maW5pdGVfcXVldWUqL1xuICBjb25zdCBzZWxmID0gRmFyKCdFYWNoSXRlcmF0b3InLCB7XG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogKCkgPT4gc2VsZixcbiAgICBuZXh0OiAoKSA9PiB7XG4gICAgICBjb25zdCB7XG4gICAgICAgIGhlYWQ6IHJlc3VsdFAsXG4gICAgICAgIHB1Ymxpc2hDb3VudDogcHVibGlzaENvdW50UCxcbiAgICAgICAgdGFpbDogdGFpbFAsXG4gICAgICB9ID0gRS5nZXQobmV4dENlbGxQKTtcblxuICAgICAgLyogSWYgdGFpbFAgaXMgYnJva2VuIGJ5IHVwZ3JhZGUsIHdlIHdpbGwgbmVlZCB0byByZS1yZXF1ZXN0IGl0Ki9cbiAgICAgIC8qIGRpcmVjdGx5IGZyb20gYHRvcGljYC4qL1xuICAgICAgY29uc3QgZ2V0U3VjY2Vzc29yID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICBjb25zdCBwdWJsaXNoQ291bnQgPSBhd2FpdCBwdWJsaXNoQ291bnRQO1xuICAgICAgICBhc3NlcnQudHlwZW9mKHB1Ymxpc2hDb3VudCwgJ2JpZ2ludCcpO1xuICAgICAgICBjb25zdCBzdWNjZXNzb3IgPSBhd2FpdCBFKHRvcGljKS5zdWJzY3JpYmVBZnRlcihwdWJsaXNoQ291bnQpO1xuICAgICAgICBjb25zdCBuZXdQdWJsaXNoQ291bnQgPSBzdWNjZXNzb3IucHVibGlzaENvdW50O1xuICAgICAgICBpZiAobmV3UHVibGlzaENvdW50ICE9PSBwdWJsaXNoQ291bnQgKyAxbikge1xuICAgICAgICAgIEZhaWxgZWFjaEl0ZXJhdG9yIGJyb2tlbiBieSBnYXAgZnJvbSBwdWJsaXNoQ291bnQgJHtwdWJsaXNoQ291bnR9IHRvICR7bmV3UHVibGlzaENvdW50fWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1Y2Nlc3NvcjtcbiAgICAgIH07XG5cbiAgICAgIC8qIFJlcGxhY2UgbmV4dENlbGxQIG9uIGV2ZXJ5IGNhbGwgdG8gbmV4dCgpIHNvIHRoaW5ncyB3b3JrIGV2ZW4qL1xuICAgICAgLyogd2l0aCBhbiBlYWdlciBjb25zdW1lciB0aGF0IGRvZXNuJ3Qgd2FpdCBmb3IgcmVzdWx0cyB0byBzZXR0bGUuKi9cbiAgICAgIG5leHRDZWxsUCA9IHJlY29ubmVjdEFzTmVlZGVkKGdldFN1Y2Nlc3NvciwgW3RhaWxQXSk7XG5cbiAgICAgIC8qIEF2b2lkIHVuaGFuZGxlZCByZWplY3Rpb24gd2FybmluZ3MgaGVyZSBpZiB0aGUgcHJldmlvdXMgY2VsbCB3YXMgcmVqZWN0ZWQgb3IqL1xuICAgICAgLyogdGhlcmUgaXMgbm8gZnVydGhlciByZXF1ZXN0IG9mIHRoaXMgaXRlcmF0b3IuKi9cbiAgICAgIC8qIGB0YWlsUGAgaXMgaGFuZGxlZCBpbnNpZGUgYHJlY29ubmVjdEFzTmVlZGVkYCBhbmQgYHJlc3VsdFBgIGlzIHRoZSBjYWxsZXIncyovXG4gICAgICAvKiBjb25jZXJuLCBsZWF2aW5nIG9ubHkgYHB1Ymxpc2hDb3VudFBgIGFuZCB0aGUgbmV3IGBuZXh0Q2VsbFBgLiovXG4gICAgICB2b2lkIEUud2hlbihwdWJsaXNoQ291bnRQLCBzaW5rLCBzaW5rKTtcbiAgICAgIHZvaWQgRS53aGVuKG5leHRDZWxsUCwgc2luaywgc2luayk7XG4gICAgICByZXR1cm4gcmVzdWx0UDtcbiAgICB9LFxuICAgIGZvcms6ICgpID0+IG1ha2VFYWNoSXRlcmF0b3IodG9waWMsIG5leHRDZWxsUCksXG4gIH0pO1xuICByZXR1cm4gc2VsZjtcbn07XG5cbi8qKlxuICogR2l2ZW4gYSBsb2NhbCBvciByZW1vdGUgc3Vic2NyaWJlciwgcmV0dXJucyBhIGxvY2FsIEFzeW5jSXRlcmFibGUgd2hpY2hcbiAqIHByb3ZpZGVzIFwicHJlZml4IGxvc3N5XCIgaXRlcmF0aW9ucyBvZiB0aGUgdW5kZXJseWluZyBQdWJsaWNhdGlvbkxpc3QuXG4gKiBCeSBcInByZWZpeCBsb3NzeVwiLCB3ZSBtZWFuIHRoYXQgeW91IG1heSBtaXNzIGV2ZXJ5dGhpbmcgcHVibGlzaGVkIGJlZm9yZVxuICogeW91IGFzayB0aGUgcmV0dXJuZWQgaXRlcmFibGUgZm9yIGFuIGl0ZXJhdG9yLiBCdXQgdGhlIHJldHVybmVkIGl0ZXJhdG9yXG4gKiB3aWxsIGVudW1lcmF0ZSBlYWNoIHRoaW5nIHB1Ymxpc2hlZCBmcm9tIHRoYXQgaXRlcmF0b3IncyBzdGFydGluZyBwb2ludFxuICogdXAgdG8gYSBkaXNjb25uZWN0aW9uIHJlc3VsdCBpbmRpY2F0aW5nIHVwZ3JhZGUgb2YgdGhlIHByb2R1Y2VyXG4gKiAod2hpY2ggYnJlYWtzIHRoZSBnYXAtZnJlZSBndWFyYW50ZWUgYW5kIHRoZXJlZm9yZSB0ZXJtaW5hdGVzIGFueSBhY3RpdmVcbiAqIGl0ZXJhdG9yIHdoaWxlIHN0aWxsIHN1cHBvcnRpbmcgY3JlYXRpb24gb2YgbmV3IGl0ZXJhdG9ycykuXG4gKlxuICogSWYgdGhlIHVuZGVybHlpbmcgUHVibGljYXRpb25MaXN0IGlzIHRlcm1pbmF0ZWQsIHRoYXQgdGVybWluYWwgdmFsdWUgd2lsbCBiZVxuICogcmVwb3J0ZWQgbG9zc2xlc3NseS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEVhY2hUb3BpYzxUPj59IHRvcGljXG4gKi9cbiAgICAgICBjb25zdCBzdWJzY3JpYmVFYWNoID0gdG9waWMgPT4ge1xuICBjb25zdCBpdGVyYWJsZSA9IEZhcignRWFjaEl0ZXJhYmxlJywge1xuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIGNvbnN0IGZpcnN0Q2VsbFAgPSByZWNvbm5lY3RBc05lZWRlZCgoKSA9PiBFKHRvcGljKS5zdWJzY3JpYmVBZnRlcigpKTtcbiAgICAgIHJldHVybiBtYWtlRWFjaEl0ZXJhdG9yKHRvcGljLCBmaXJzdENlbGxQKTtcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIGl0ZXJhYmxlO1xufTskaM2PX29uY2Uuc3Vic2NyaWJlRWFjaChzdWJzY3JpYmVFYWNoKTtcbmhhcmRlbihzdWJzY3JpYmVFYWNoKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPExhdGVzdFRvcGljPFQ+Pn0gdG9waWNcbiAqIEBwYXJhbSB7YmlnaW50fSBbbG9jYWxVcGRhdGVDb3VudF1cbiAqIEBwYXJhbSB7SXRlcmF0b3JSZXR1cm5SZXN1bHQ8VD59IFt0ZXJtaW5hbFJlc3VsdF1cbiAqIEByZXR1cm5zIHtGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvcjxULCBUPn1cbiAqL1xuY29uc3QgY2xvbmVMYXRlc3RJdGVyYXRvciA9ICh0b3BpYywgbG9jYWxVcGRhdGVDb3VudCwgdGVybWluYWxSZXN1bHQpID0+IHtcbiAgbGV0IG11dGV4ID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgLyoqXG4gKiBSZXF1ZXN0IHRoZSBuZXh0IHVwZGF0ZSByZWNvcmQgZnJvbSB0aGUgdG9waWMsIHVwZGF0aW5nIG91ciBsb2NhbCBzdGF0ZSxcbiAqIGFuZCBjb252ZXJ0IGl0IHRvIGFuIGl0ZXJhdG9yIHJlc3VsdC5cbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJdGVyYXRvclJlc3VsdDxULCBUPj59XG4gKi9cbiAgY29uc3QgbWF5YmVSZXF1ZXN0TmV4dFJlc3VsdCA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAodGVybWluYWxSZXN1bHQpIHtcbiAgICAgIC8qIFdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgdG9waWMsIGp1c3Qga2VlcCByZXR1cm5pbmcgdGhlIGxhc3QgcmVzdWx0Ki9cbiAgICAgIC8qIHdpdGhvdXQgZnVydGhlciByZXF1ZXN0cy4qL1xuICAgICAgcmV0dXJuIHRlcm1pbmFsUmVzdWx0O1xuICAgIH1cblxuICAgIC8qIFNlbmQgdGhlIG5leHQgcmVxdWVzdCBub3csIHNraXBwaW5nIHBhc3QgaW50ZXJtZWRpYXRlIHVwZGF0ZXMqL1xuICAgIC8qIGFuZCB1cGdyYWRlIGRpc2Nvbm5lY3Rpb25zLiovXG4gICAgY29uc3QgeyB2YWx1ZSwgdXBkYXRlQ291bnQgfSA9IGF3YWl0IHJlY29ubmVjdEFzTmVlZGVkKCgpID0+XG4gICAgICBFKHRvcGljKS5nZXRVcGRhdGVTaW5jZShsb2NhbFVwZGF0ZUNvdW50KSxcbiAgICApO1xuICAgIC8qIE1ha2Ugc3VyZSB0aGUgbmV4dCByZXF1ZXN0IGlzIGZvciBhIGZyZXNoZXIgdmFsdWUuKi9cbiAgICBsb2NhbFVwZGF0ZUNvdW50ID0gdXBkYXRlQ291bnQ7XG5cbiAgICAvKiBNYWtlIGFuIEl0ZXJhdG9yUmVzdWx0LiovXG4gICAgaWYgKHVwZGF0ZUNvdW50ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHRlcm1pbmFsUmVzdWx0ID0gaGFyZGVuKHsgZG9uZTogdHJ1ZSwgdmFsdWUgfSk7XG4gICAgICByZXR1cm4gdGVybWluYWxSZXN1bHQ7XG4gICAgfVxuICAgIHJldHVybiBoYXJkZW4oeyBkb25lOiBmYWxzZSwgdmFsdWUgfSk7XG4gIH07XG5cbiAgY29uc3Qgc2VsZiA9IEZhcignTGF0ZXN0SXRlcmF0b3InLCB7XG4gICAgZm9yazogKCkgPT4gY2xvbmVMYXRlc3RJdGVyYXRvcih0b3BpYywgbG9jYWxVcGRhdGVDb3VudCwgdGVybWluYWxSZXN1bHQpLFxuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06ICgpID0+IHNlbGYsXG4gICAgbmV4dDogYXN5bmMgKCkgPT4ge1xuICAgICAgLyogSW4gdGhpcyBhZGFwdG9yLCBvbmNlIGBuZXh0KClgIGlzIGNhbGxlZCBhbmQgcmV0dXJucyBhbiB1bnJlc29sdmVkKi9cbiAgICAgIC8qIHByb21pc2UsIGZ1cnRoZXIgYG5leHQoKWAgY2FsbHMgd2lsbCBhbHNvIHJldHVybiB1bnJlc29sdmVkIHByb21pc2VzKi9cbiAgICAgIC8qIGJ1dCBlYWNoIGNhbGwgd2lsbCBub3QgdHJpZ2dlciBhbm90aGVyIGB0b3BpY2AgcmVxdWVzdCB1bnRpbCB0aGUgcHJpb3IqL1xuICAgICAgLyogb25lIGhhcyBzZXR0bGVkLiovXG4gICAgICAvKiovXG4gICAgICAvKiBUaGlzIGxpbmVhciBxdWV1ZWluZyBiZWhhdmlvciBpcyBvbmx5IG5lZWRlZCBmb3IgY29kZSB0aGF0IHVzZXMgdGhlKi9cbiAgICAgIC8qIGFzeW5jIGl0ZXJhdG9yIHByb3RvY29sIGV4cGxpY2l0bHkuIFdoZW4gdGhpcyBhc3luYyBpdGVyYXRvciBpcyovXG4gICAgICAvKiBjb25zdW1lZCBieSBhIGZvci9hd2FpdC9vZiBsb29wLCBgbmV4dCgpYCB3aWxsIG9ubHkgYmUgY2FsbGVkIGFmdGVyIHRoZSovXG4gICAgICAvKiBwcm9taXNlIGZvciB0aGUgcHJldmlvdXMgaXRlcmF0aW9uIHJlc3VsdCBoYXMgZnVsZmlsbGVkLiBJZiBpdCBmdWxmaWxscyovXG4gICAgICAvKiB3aXRoIGBkb25lOiB0cnVlYCwgdGhlIGZvci9hd2FpdC9vZiBsb29wIHdpbGwgbmV2ZXIgY2FsbCBgbmV4dCgpYCovXG4gICAgICAvKiBhZ2Fpbi4qL1xuICAgICAgLyoqL1xuICAgICAgLyogU2VlKi9cbiAgICAgIC8qIGh0dHBzOi8vMmFsaXR5LmNvbS8yMDE2LzEwL2FzeW5jaHJvbm91cy1pdGVyYXRpb24uaHRtbCNxdWV1aW5nLW5leHQoKS1pbnZvY2F0aW9ucyovXG4gICAgICAvKiBmb3IgYW4gZXhwbGljaXQgdXNlIHRoYXQgc2VuZHMgYG5leHQoKWAgd2l0aG91dCB3YWl0aW5nLiovXG5cbiAgICAgIGlmICh0ZXJtaW5hbFJlc3VsdCkge1xuICAgICAgICAvKiBXZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHRvcGljLCBqdXN0IGtlZXAgcmV0dXJuaW5nIHRoZSBsYXN0Ki9cbiAgICAgICAgLyogcmVzdWx0LiovXG4gICAgICAgIHJldHVybiB0ZXJtaW5hbFJlc3VsdDtcbiAgICAgIH1cblxuICAgICAgLyogQkVHSU4gQ1JJVElDQUwgU0VDVElPTiAtIHN5bmNocm9ub3VzbHkgZW5xdWV1ZSBhbmQgcmVhc3NpZ24gYG11dGV4YCovXG4gICAgICAvKiovXG4gICAgICAvKiBVc2UgYG11dGV4YCB0byBlbnN1cmUgdGhhdCB3ZSBoYXZlIG5vIG1vcmUgdGhhbiBhIHNpbmdsZSByZXF1ZXN0IGluKi9cbiAgICAgIC8qIGZsaWdodC4qL1xuICAgICAgY29uc3QgbmV4dFJlc3VsdCA9IG11dGV4LnRoZW4obWF5YmVSZXF1ZXN0TmV4dFJlc3VsdCk7XG4gICAgICBtdXRleCA9IG5leHRSZXN1bHQudGhlbihzaW5rLCBzaW5rKTtcbiAgICAgIC8qIEVORCBDUklUSUNBTCBTRUNUSU9OKi9cblxuICAgICAgcmV0dXJuIG5leHRSZXN1bHQ7XG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiBzZWxmO1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPExhdGVzdFRvcGljPFQ+Pn0gdG9waWNcbiAqIEByZXR1cm5zIHtGb3JrYWJsZUFzeW5jSXRlcmFibGVJdGVyYXRvcjxULCBUPn1cbiAqL1xuY29uc3QgbWFrZUxhdGVzdEl0ZXJhdG9yID0gdG9waWMgPT4gY2xvbmVMYXRlc3RJdGVyYXRvcih0b3BpYyk7XG5cbi8qKlxuICogR2l2ZW4gYSBsb2NhbCBvciByZW1vdGUgc3Vic2NyaWJlciwgcmV0dXJucyBhIGxvY2FsIEFzeW5jSXRlcmFibGUgd2hpY2hcbiAqIHByb3ZpZGVzIFwibG9zc3lcIiBpdGVyYXRpb25zIG9mIHRoZSB1bmRlcmx5aW5nIFB1YmxpY2F0aW9uTGlzdC5cbiAqIEJ5IFwibG9zc3lcIiwgd2UgbWVhbiB0aGF0IHlvdSBtYXkgbWlzcyBhbnkgcHVibGlzaGVkIHN0YXRlIGlmIGEgbW9yZVxuICogcmVjZW50IHB1Ymxpc2hlZCBzdGF0ZSBjYW4gYmUgcmVwb3J0ZWQgaW5zdGVhZC5cbiAqXG4gKiBJZiB0aGUgdW5kZXJseWluZyBQdWJsaWNhdGlvbkxpc3QgaXMgdGVybWluYXRlZCBieSB1cGdyYWRlIG9mIHRoZSBwcm9kdWNlcixcbiAqIGl0IHdpbGwgYmUgcmUtcmVxdWVzdGVkLiBBbGwgb3RoZXIgdGVybWluYWwgdmFsdWVzIHdpbGwgYmUgbG9zc2xlc3NseVxuICogcHJvcGFnYXRlZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPExhdGVzdFRvcGljPFQ+Pn0gdG9waWNcbiAqL1xuICAgICAgIGNvbnN0IHN1YnNjcmliZUxhdGVzdCA9IHRvcGljID0+IHtcbiAgY29uc3QgaXRlcmFibGUgPSBGYXIoJ0xhdGVzdEl0ZXJhYmxlJywge1xuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl06ICgpID0+IG1ha2VMYXRlc3RJdGVyYXRvcih0b3BpYyksXG4gIH0pO1xuICByZXR1cm4gaXRlcmFibGU7XG59OyRozY9fb25jZS5zdWJzY3JpYmVMYXRlc3Qoc3Vic2NyaWJlTGF0ZXN0KTtcbmhhcmRlbihzdWJzY3JpYmVMYXRlc3QpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic3Vic2NyaWJlIjpbInN1YnNjcmliZSJdLCJzdWJzY3JpYmVFYWNoIjpbInN1YnNjcmliZUVhY2giXSwic3Vic2NyaWJlTGF0ZXN0IjpbInN1YnNjcmliZUxhdGVzdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABXqgSRKQ0AACkNAAApAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3N1YnNjcmliZXIuanN7ImltcG9ydHMiOlsiQGVuZG8vZmFyIiwiLi9zdWJzY3JpYmUuanMiLCIuL3B1Ymxpc2gta2l0LmpzIiwiLi90b3BpYy5qcyJdLCJleHBvcnRzIjpbIm1ha2VTdWJzY3JpcHRpb24iLCJtYWtlU3Vic2NyaXB0aW9uS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRSxGYXIsc3Vic2NyaWJlRWFjaCxtYWtlUHVibGlzaEtpdCxtYWtlUGlubmVkSGlzdG9yeVRvcGljOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXSxbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCIuL3N1YnNjcmliZS5qc1wiLCBbW1wic3Vic2NyaWJlRWFjaFwiLFskaM2PX2EgPT4gKHN1YnNjcmliZUVhY2ggPSAkaM2PX2EpXV1dXSxbXCIuL3B1Ymxpc2gta2l0LmpzXCIsIFtbXCJtYWtlUHVibGlzaEtpdFwiLFskaM2PX2EgPT4gKG1ha2VQdWJsaXNoS2l0ID0gJGjNj19hKV1dXV0sW1wiLi90b3BpYy5qc1wiLCBbW1wibWFrZVBpbm5lZEhpc3RvcnlUb3BpY1wiLFskaM2PX2EgPT4gKG1ha2VQaW5uZWRIaXN0b3J5VG9waWMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtFYWNoVG9waWMsIEl0ZXJhdGlvbk9ic2VydmVyLCBMYXRlc3RUb3BpYywgTm90aWZpZXIsIE5vdGlmaWVyUmVjb3JkLCBTdWJzY3JpcHRpb25SZWNvcmQsIFB1Ymxpc2hlciwgUHVibGlzaEtpdCwgU3RvcmVkUHVibGlzaEtpdCwgU3RvcmVkU3Vic2NyaXB0aW9uLCBTdG9yZWRTdWJzY3JpYmVyLCBTdWJzY3JpYmVyLCBTdWJzY3JpcHRpb24sIFVwZGF0ZVJlY29yZH0gZnJvbSAnLi4vc3JjL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge0VSZWZ9IGZyb20gJ0BhZ29yaWMvdm93JztcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8RWFjaFRvcGljPFQ+Pn0gdG9waWNcbiAqIEByZXR1cm5zIHtTdWJzY3JpcHRpb248VD59XG4gKi9cbmNvbnN0IG1ha2VTdWJzY3JpcHRpb24gPSB0b3BpYyA9PiB7XG4gIGNvbnN0IHN1YnNjcmlwdGlvbiA9IEZhcignU3Vic2NyaXB0aW9uJywge1xuICAgIC4uLnN1YnNjcmliZUVhY2godG9waWMpLFxuICAgIHN1YnNjcmliZUFmdGVyOiBhc3luYyBwdWJsaXNoQ291bnQgPT4gRSh0b3BpYykuc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50KSxcblxuICAgIC8qKlxuICogVXNlIHRoaXMgdG8gZGlzdHJpYnV0ZSBhIFN1YnNjcmlwdGlvbiBlZmZpY2llbnRseSBvdmVyIHRoZSBuZXR3b3JrLFxuICogYnkgb2J0YWluaW5nIHRoaXMgZnJvbSB0aGUgU3Vic2NyaXB0aW9uIHRvIGJlIHJlcGxpY2F0ZWQsIGFuZCBhcHBseWluZ1xuICogYG1ha2VTdWJzY3JpcHRpb25gIHRvIGl0IGF0IHRoZSBuZXcgc2l0ZSB0byBnZXQgYW4gZXF1aXZhbGVudCBsb2NhbFxuICogU3Vic2NyaXB0aW9uIGF0IHRoYXQgc2l0ZS5cbiAqL1xuICAgIGdldFNoYXJhYmxlU3Vic2NyaXB0aW9uSW50ZXJuYWxzOiBhc3luYyAoKSA9PiB0b3BpYyxcblxuICAgIGdldFN0b3JlS2V5OiAoKSA9PiBoYXJkZW4oeyBzdWJzY3JpcHRpb24gfSksXG4gIH0pO1xuICByZXR1cm4gc3Vic2NyaXB0aW9uO1xufTskaM2PX29uY2UubWFrZVN1YnNjcmlwdGlvbihtYWtlU3Vic2NyaXB0aW9uKTtcbmhhcmRlbihtYWtlU3Vic2NyaXB0aW9uKTtcblxuXG4vKipcbiAqIEBkZXByZWNhdGVkIFByb2R1Y2VycyBzaG91bGQgdXNlXG4gKiBgYGBqc1xuICogY29uc3QgeyBwdWJsaXNoZXIsIHN1YnNjcmliZXIgfSA9IG1ha2VQdWJsaXNoS2l0KCk7XG4gKiBjb25zdCB0b3BpYyA9IG1ha2VQaW5uZWRIaXN0b3J5VG9waWMoc3Vic2NyaWJlcik7XG4gKiBgYGBcbiAqIGluc3RlYWQsIHdoaWNoIG1ha2VzIGl0IGNsZWFyZXIgdGhhdCBhbGwgdGhlIHN1YnNjcmliZXIncyBoaXN0b3J5IGlzXG4gKiByZXRhaW5lZCwgcHJldmVudGluZyBHQy4gIFBvdGVudGlhbGx5IHJlbW90ZSBjb25zdW1lcnMgdXNlXG4gKiBgYGBqc1xuICogZm9yIGF3YWl0IChjb25zdCB2YWx1ZSBvZiBzdWJzY3JpYmVFYWNoKHRvcGljKSkgeyAuLi4gfVxuICogYGBgXG4gKlxuICogTWFrZXMgYSBgeyBwdWJsaWNhdGlvbiwgc3Vic2NyaXB0aW9uIH1gIGZvciBkb2luZyBsb3NzbGVzcyBlZmZpY2llbnRcbiAqIGRpc3RyaWJ1dGVkIHB1Yi9zdWIuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtTdWJzY3JpcHRpb25SZWNvcmQ8VD59XG4gKi9cbmNvbnN0IG1ha2VTdWJzY3JpcHRpb25LaXQgPSAoKSA9PiB7XG4gIGNvbnN0IHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH0gPSBtYWtlUHVibGlzaEtpdCgpO1xuXG4gIC8qIFRoZSBwdWJsaXNoIGtpdCBzdWJzY3JpYmVyIGlzIHByZWZpeC1sb3NzeSwgc28gbWFraW5nICp0aGlzKiBzdWJzY3JpYmVyIGNvbXBsZXRlbHkqL1xuICAvKiBsb3NzbGVzcyBmcm9tIGluaXRpYWxpc2F0aW9uIHJlcXVpcmVzIHBpbm5pbmcgdGhlIGZvcm1lcidzIGhpc3RvcnkuKi9cblxuICBjb25zdCBwaW5uZWRIaXN0b3J5VG9waWMgPSBtYWtlUGlubmVkSGlzdG9yeVRvcGljKHN1YnNjcmliZXIpO1xuICBjb25zdCBzdWJzY3JpcHRpb24gPSBtYWtlU3Vic2NyaXB0aW9uKHBpbm5lZEhpc3RvcnlUb3BpYyk7XG5cbiAgLyoqIEB0eXBlIHtJdGVyYXRpb25PYnNlcnZlcjxUPn0gKi9cbiAgY29uc3QgcHVibGljYXRpb24gPSBGYXIoJ3B1YmxpY2F0aW9uJywge1xuICAgIHVwZGF0ZVN0YXRlOiBub25GaW5hbFZhbHVlID0+IHB1Ymxpc2hlci5wdWJsaXNoKG5vbkZpbmFsVmFsdWUpLFxuICAgIGZpbmlzaDogY29tcGxldGlvbiA9PiBwdWJsaXNoZXIuZmluaXNoKGNvbXBsZXRpb24pLFxuICAgIGZhaWw6IHJlYXNvbiA9PiBwdWJsaXNoZXIuZmFpbChyZWFzb24pLFxuICB9KTtcblxuICByZXR1cm4gaGFyZGVuKHsgcHVibGljYXRpb24sIHN1YnNjcmlwdGlvbiB9KTtcbn07JGjNj19vbmNlLm1ha2VTdWJzY3JpcHRpb25LaXQobWFrZVN1YnNjcmlwdGlvbktpdCk7XG5oYXJkZW4obWFrZVN1YnNjcmlwdGlvbktpdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlU3Vic2NyaXB0aW9uIjpbIm1ha2VTdWJzY3JpcHRpb24iXSwibWFrZVN1YnNjcmlwdGlvbktpdCI6WyJtYWtlU3Vic2NyaXB0aW9uS2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHfmSkaVBgAAlQYAACQAAABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvdG9waWMuanN7ImltcG9ydHMiOlsiQGVuZG8vZmFyIl0sImV4cG9ydHMiOlsibWFrZVBpbm5lZEhpc3RvcnlUb3BpYyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhcjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV1dKTtcblxuXG5cbi8qKlxuICogQGltcG9ydCB7RWFjaFRvcGljLCBMYXRlc3RUb3BpY30gZnJvbSAnLi4vc3JjL3R5cGVzLmpzJztcbiAqL1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIEEgcGlubmVkLWhpc3RvcnkgdG9waWMgcHJlc2VydmVzIGFsbCBvZiBpdHMgcHVibGlzaGVkIHZhbHVlcyBpblxuICogbWVtb3J5LiAgVXNlIGEgcHJlZml4LWxvc3N5IG1ha2VQdWJsaXNoS2l0IGluc3RlYWQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RWFjaFRvcGljPFQ+ICYgTGF0ZXN0VG9waWM8VD59IHRvcGljIG5lZWRzIHRvIGJlIG5lYXIgaW4gb3JkZXIgdG9cbiAqIHByZXNlcnZlIHN1YnNjcmlwdGlvbiB0aW1pbmdzLiAgVE9ETzogZHJvcCBgTGF0ZXN0VG9waWM8VD5gIHJlcXVpcmVtZW50XG4gKiBAcmV0dXJucyB7RWFjaFRvcGljPFQ+ICYgTGF0ZXN0VG9waWM8VD59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlUGlubmVkSGlzdG9yeVRvcGljID0gdG9waWMgPT4ge1xuICAvKiBTdWNoIGxvc3NsZXNzbmVzcyBpbmhpYml0cyBHQywgd2hpY2ggaXMgd2h5IHdlJ3JlIG1vdmluZyBhd2F5IGZyb20gaXQuKi9cblxuICAvKiBXZSBuZWVkIHRvIHRha2UgYW4gaW1tZWRpYXRlIHNuYXBzaG90IG9mIHRoZSB0b3BpYydzIGN1cnJlbnQgc3RhdGUuKi9cbiAgY29uc3QgcGlubmVkUHViTGlzdCA9IHRvcGljLnN1YnNjcmliZUFmdGVyKCk7XG5cbiAgcmV0dXJuIEZhcignUGlubmVkSGlzdG9yeVRvcGljJywge1xuICAgIHN1YnNjcmliZUFmdGVyOiBhc3luYyAocHVibGlzaENvdW50ID0gLTFuKSA9PiB7XG4gICAgICBpZiAocHVibGlzaENvdW50ID09PSAtMW4pIHtcbiAgICAgICAgcmV0dXJuIHBpbm5lZFB1Ykxpc3Q7XG4gICAgICB9XG4gICAgICByZXR1cm4gdG9waWMuc3Vic2NyaWJlQWZ0ZXIocHVibGlzaENvdW50KTtcbiAgICB9LFxuICAgIGdldFVwZGF0ZVNpbmNlOiBhc3luYyAodXBkYXRlQ291bnQgPSB1bmRlZmluZWQpID0+IHtcbiAgICAgIC8qIFRPRE86IEJ1aWxkIHRoaXMgb3V0IG9mIEVhY2hUb3BpYzxUPi4qL1xuICAgICAgcmV0dXJuIHRvcGljLmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50KTtcbiAgICB9LFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VQaW5uZWRIaXN0b3J5VG9waWMobWFrZVBpbm5lZEhpc3RvcnlUb3BpYyk7XG5oYXJkZW4obWFrZVBpbm5lZEhpc3RvcnlUb3BpYyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUGlubmVkSGlzdG9yeVRvcGljIjpbIm1ha2VQaW5uZWRIaXN0b3J5VG9waWMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAKgAAAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy90eXBlcy1pbmRleC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADcc9M9YAcAAGAHAAAtAAAAQGFnb3JpYy9ub3RpZmllci12MC42LjIvdG9vbHMvdGVzdFN1cHBvcnRzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAYWdvcmljL2ludGVybmFsL3NyYy90ZXN0aW5nLXV0aWxzLmpzIl0sImV4cG9ydHMiOlsibWFrZUZha2VNYXJzaGFsbGVyIiwibWFrZUZha2VTdG9yYWdlIixudWxsXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYXIsbWFrZU1hcnNoYWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wibWFrZU1hcnNoYWxcIixbJGjNj19hID0+IChtYWtlTWFyc2hhbCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWwvc3JjL3Rlc3RpbmctdXRpbHMuanNcIiwgW11dXSk7XG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtJdGVyYXRpb25PYnNlcnZlcjx1bmtub3duPn0gW3B1YmxpY2F0aW9uXVxuICovXG4gICAgICAgY29uc3QgbWFrZUZha2VTdG9yYWdlID0gKHBhdGgsIHB1YmxpY2F0aW9uKSA9PiB7XG4gIGxldCBzZXRWYWx1ZUNhbGxzID0gMDtcbiAgY29uc3QgZnVsbFBhdGggPSBgcHVibGlzaC4ke3BhdGh9YDtcbiAgY29uc3Qgc3RvcmVLZXkgPSBoYXJkZW4oe1xuICAgIHN0b3JlTmFtZTogJ3N3aW5nc2V0JyxcbiAgICBzdG9yZVN1YmtleTogYHN3aW5nc2V0L2RhdGE6JHtmdWxsUGF0aH1gLFxuICAgIGRhdGFQcmVmaXhCeXRlczogJycsXG4gIH0pO1xuICAvKiogQHR5cGUge1N0b3JhZ2VOb2RlICYgeyBjb3VudFNldFZhbHVlQ2FsbHM6ICgpID0+IG51bWJlcn19ICovXG4gIGNvbnN0IHN0b3JhZ2UgPSBGYXIoJ1N0b3JhZ2VOb2RlJywge1xuICAgIGdldFBhdGg6ICgpID0+IHBhdGgsXG4gICAgZ2V0U3RvcmVLZXk6IGFzeW5jICgpID0+IHN0b3JlS2V5LFxuICAgIHNldFZhbHVlOiBhc3luYyB2YWx1ZSA9PiB7XG4gICAgICBzZXRWYWx1ZUNhbGxzICs9IDE7XG4gICAgICBhc3NlcnQudHlwZW9mKHZhbHVlLCAnc3RyaW5nJyk7XG4gICAgICBpZiAocHVibGljYXRpb24pIHtcbiAgICAgICAgcHVibGljYXRpb24udXBkYXRlU3RhdGUodmFsdWUpO1xuICAgICAgfVxuICAgIH0sXG4gICAgbWFrZUNoaWxkTm9kZTogKCkgPT4gc3RvcmFnZSxcbiAgICBjb3VudFNldFZhbHVlQ2FsbHM6ICgpID0+IHNldFZhbHVlQ2FsbHMsXG4gIH0pO1xuICByZXR1cm4gc3RvcmFnZTtcbn07JGjNj19vbmNlLm1ha2VGYWtlU3RvcmFnZShtYWtlRmFrZVN0b3JhZ2UpO1xuaGFyZGVuKG1ha2VGYWtlU3RvcmFnZSk7XG5cbiAgICAgICBjb25zdCBtYWtlRmFrZU1hcnNoYWxsZXIgPSAoKSA9PlxuICBtYWtlTWFyc2hhbCh1bmRlZmluZWQsIHVuZGVmaW5lZCwge1xuICAgIG1hcnNoYWxTYXZlRXJyb3I6ICgpID0+IHt9LFxuICB9KTskaM2PX29uY2UubWFrZUZha2VNYXJzaGFsbGVyKG1ha2VGYWtlTWFyc2hhbGxlcik7XG5oYXJkZW4obWFrZUZha2VNYXJzaGFsbGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7IkBhZ29yaWMvaW50ZXJuYWwvc3JjL3Rlc3RpbmctdXRpbHMuanMiOltbImV2ZW50TG9vcEl0ZXJhdGlvbiIsImV2ZW50TG9vcEl0ZXJhdGlvbiJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRmFrZVN0b3JhZ2UiOlsibWFrZUZha2VTdG9yYWdlIl0sIm1ha2VGYWtlTWFyc2hhbGxlciI6WyJtYWtlRmFrZU1hcnNoYWxsZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARxpyk0YOAABGDgAAIQAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXR0ZXJucyIsIi4vc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qcyIsIi4vc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzIiwiLi9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzIiwiLi9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanMiLCIuL3N0b3Jlcy9zdG9yZS11dGlscy5qcyIsIkBlbmRvL2V4byIsIi4vbGVnYWN5L2xlZ2FjeU1hcC5qcyIsIi4vbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanMiLCIuL3R5cGVzLWluZGV4LmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0S2V5IiwiYXNzZXJ0S2V5IiwiZGVmaW5lRXhvQ2xhc3MiLCJkZWZpbmVFeG9DbGFzcyIsIm11c3RNYXRjaCIsInByb3ZpZGVMYXp5IiwicHJvdmlkZUxhenkiLG51bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbIi4vdHlwZXMtaW5kZXguanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCB0eXBlbGVzc011c3RNYXRjaDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+ICh0eXBlbGVzc011c3RNYXRjaCA9ICRozY9fYSldXV1dLFtcIi4vc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qc1wiLCBbXV0sW1wiLi9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanNcIiwgW11dLFtcIi4vc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qc1wiLCBbXV0sW1wiLi9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanNcIiwgW11dLFtcIi4vc3RvcmVzL3N0b3JlLXV0aWxzLmpzXCIsIFtdXSxbXCJAZW5kby9leG9cIiwgW11dLFtcIi4vbGVnYWN5L2xlZ2FjeU1hcC5qc1wiLCBbXV0sW1wiLi9sZWdhY3kvbGVnYWN5V2Vha01hcC5qc1wiLCBbXV0sW1wiLi90eXBlcy1pbmRleC5qc1wiLCBbXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyogWFhYIEBhZ29yaWMvc3RvcmUgc2hvdWxkIG5vdCBkZXBlbmQgb24gQGFnb3JpYy9pbnRlcm5hbCovXG4vKiBUT0RPIG1vdmUgdG8gRW5kbyovXG4vKiogQHR5cGUge011c3RNYXRjaH0gKi9cbiAgICAgICBjb25zdCBtdXN0TWF0Y2ggPSB0eXBlbGVzc011c3RNYXRjaDskaM2PX29uY2UubXVzdE1hdGNoKG11c3RNYXRjaCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanMiOltbIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiLCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIl1dLCIuL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qcyI6W1sibWFrZVNjYWxhclNldFN0b3JlIiwibWFrZVNjYWxhclNldFN0b3JlIl1dLCIuL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanMiOltbIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiLCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIl1dLCIuL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qcyI6W1sibWFrZVNjYWxhck1hcFN0b3JlIiwibWFrZVNjYWxhck1hcFN0b3JlIl1dLCIuL3N0b3Jlcy9zdG9yZS11dGlscy5qcyI6W1sibWFrZUF0b21pY1Byb3ZpZGVyIiwibWFrZUF0b21pY1Byb3ZpZGVyIl0sWyJwcm92aWRlTGF6eSIsInByb3ZpZGVMYXp5Il1dLCJAZW5kby9wYXR0ZXJucyI6W1siaXNLZXkiLCJpc0tleSJdLFsiYXNzZXJ0S2V5IiwiYXNzZXJ0S2V5Il0sWyJhc3NlcnRTY2FsYXJLZXkiLCJhc3NlcnRTY2FsYXJLZXkiXSxbIm1ha2VDb3B5U2V0IiwibWFrZUNvcHlTZXQiXSxbImdldENvcHlTZXRLZXlzIiwiZ2V0Q29weVNldEtleXMiXSxbIm1ha2VDb3B5QmFnIiwibWFrZUNvcHlCYWciXSxbIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIiwibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiXSxbImdldENvcHlCYWdFbnRyaWVzIiwiZ2V0Q29weUJhZ0VudHJpZXMiXSxbIm1ha2VDb3B5TWFwIiwibWFrZUNvcHlNYXAiXSxbImdldENvcHlNYXBFbnRyaWVzIiwiZ2V0Q29weU1hcEVudHJpZXMiXSxbImNvZXJjZVRvRWxlbWVudHMiLCJjb2VyY2VUb0VsZW1lbnRzIl0sWyJjb2VyY2VUb0JhZ0VudHJpZXMiLCJjb2VyY2VUb0JhZ0VudHJpZXMiXSxbImNvbXBhcmVLZXlzIiwiY29tcGFyZUtleXMiXSxbImtleUxUIiwia2V5TFQiXSxbImtleUxURSIsImtleUxURSJdLFsia2V5RVEiLCJrZXlFUSJdLFsia2V5R1RFIiwia2V5R1RFIl0sWyJrZXlHVCIsImtleUdUIl0sWyJlbGVtZW50c0lzU3VwZXJzZXQiLCJlbGVtZW50c0lzU3VwZXJzZXQiXSxbImVsZW1lbnRzSXNEaXNqb2ludCIsImVsZW1lbnRzSXNEaXNqb2ludCJdLFsiZWxlbWVudHNDb21wYXJlIiwiZWxlbWVudHNDb21wYXJlIl0sWyJlbGVtZW50c1VuaW9uIiwiZWxlbWVudHNVbmlvbiJdLFsiZWxlbWVudHNEaXNqb2ludFVuaW9uIiwiZWxlbWVudHNEaXNqb2ludFVuaW9uIl0sWyJlbGVtZW50c0ludGVyc2VjdGlvbiIsImVsZW1lbnRzSW50ZXJzZWN0aW9uIl0sWyJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiLCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiXSxbInNldElzU3VwZXJzZXQiLCJzZXRJc1N1cGVyc2V0Il0sWyJzZXRJc0Rpc2pvaW50Iiwic2V0SXNEaXNqb2ludCJdLFsic2V0Q29tcGFyZSIsInNldENvbXBhcmUiXSxbInNldFVuaW9uIiwic2V0VW5pb24iXSxbInNldERpc2pvaW50VW5pb24iLCJzZXREaXNqb2ludFVuaW9uIl0sWyJzZXRJbnRlcnNlY3Rpb24iLCJzZXRJbnRlcnNlY3Rpb24iXSxbInNldERpc2pvaW50U3VidHJhY3QiLCJzZXREaXNqb2ludFN1YnRyYWN0Il0sWyJiYWdJc1N1cGVyYmFnIiwiYmFnSXNTdXBlcmJhZyJdLFsiYmFnQ29tcGFyZSIsImJhZ0NvbXBhcmUiXSxbImJhZ1VuaW9uIiwiYmFnVW5pb24iXSxbImJhZ0ludGVyc2VjdGlvbiIsImJhZ0ludGVyc2VjdGlvbiJdLFsiYmFnRGlzam9pbnRTdWJ0cmFjdCIsImJhZ0Rpc2pvaW50U3VidHJhY3QiXSxbIk0iLCJNIl0sWyJnZXRSYW5rQ292ZXIiLCJnZXRSYW5rQ292ZXIiXSxbImlzUGF0dGVybiIsImlzUGF0dGVybiJdLFsiYXNzZXJ0UGF0dGVybiIsImFzc2VydFBhdHRlcm4iXSxbIm1hdGNoZXMiLCJtYXRjaGVzIl0sWyJpc0NvcHlTZXQiLCJpc0NvcHlTZXQiXSxbImlzQ29weU1hcCIsImlzQ29weU1hcCJdXSwiQGVuZG8vZXhvIjpbWyJpbml0RW1wdHkiLCJpbml0RW1wdHkiXSxbImRlZmluZUV4b0NsYXNzIiwiZGVmaW5lRXhvQ2xhc3MiXSxbImRlZmluZUV4b0NsYXNzS2l0IiwiZGVmaW5lRXhvQ2xhc3NLaXQiXSxbIm1ha2VFeG8iLCJtYWtlRXhvIl1dLCIuL2xlZ2FjeS9sZWdhY3lNYXAuanMiOltbIm1ha2VMZWdhY3lNYXAiLCJtYWtlTGVnYWN5TWFwIl1dLCIuL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzIjpbWyJtYWtlTGVnYWN5V2Vha01hcCIsIm1ha2VMZWdhY3lXZWFrTWFwIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im11c3RNYXRjaCI6WyJtdXN0TWF0Y2giXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAD9JGLuILAADiCwAALAAAAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9sZWdhY3kvbGVnYWN5TWFwLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIm1ha2VMZWdhY3lNYXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLyoqXG4gKiBUaGlzIG1vZHVsZSBhbmQgaXRzIGZyYXRlcm5hbCBzaWJsaW5nIGxlZ2FjeVdlYWtNYXAgZXhpc3Qgb25seSB0byBlYXNlIGFcbiAqIHRyYW5zaXRpb24gdG8gdGhlIG1vZGVybiBgc3RvcmVgIHN5c3RlbSwgYXJlIGRlcHJlY2F0ZWQsIGFuZCB3aWxsIGV2ZW50dWFsbHlcbiAqIGRpc2FwcGVhci4gVGhleSBhcmUgbmVlZGVkIGZvciBub3cgdG8gc3VwcG9ydCBzb21lIG9mIHRoZSB1c2VzIG9mIHRoZSBvbGRcbiAqIGJlaGF2aW9yIHRoYXQgYXJlIG5vdCBjb21wYXRpYmxlIHdpdGggdGhlIG5ldy4gVGhlIGNvbnN0cmFpbnQgaW1wb3NlZCBieSB0aGVcbiAqIG5ldyBpcyB0aGF0IG9ubHkgcGFzc2FibGVzIGNhbiBiZSB1c2VkIGFzIHZhbHVlcywgYW5kIG9ubHkga2V5cyAocm91Z2hseSxcbiAqIHN0cnVjdHVyZXMsIGFrYSBjb21wYXJhYmxlcykgY2FuIGJlIHVzZWQgYXMgdmFsdWVzLlxuICpcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC8zNTY3XG4gKlxuICogVE9ETyBPbmNlIHRoYXQgUFIgaXMgbWVyZ2VkLCBsaW5rIHRvIHRoZSBkb2N1bWVudHMgcmF0aGVyIHRoYW4gdGhlIFBScy5cbiAqXG4gKiBFYWNoIG9mIHRoZXNlIG5vbi1jb25mb3JtaW5nIHVzZXMgc2hvdWxkIGJlIG1hcmtlZCB3aXRoIGFcbiAqXG4gKiBgYGBqc1xuICogLy8gTGVnYWN5IGJlY2F1c2UuLi5cbiAqIGBgYFxuICpcbiAqIGNvbW1lbnQgZXhwbGFpbmluZyB0aGUgcHJvYmxlbSBpbmhpYml0aW5nIGNvbnZlcnNpb24gdG8gdGhlIG5ldyBzeXN0ZW0uIFNvbWVcbiAqIG9mIHRoZXNlIHByb2JsZW1zIGFzIG9mIHRoaXMgd3JpdGluZzpcbiAqXG4gKiAtIEEgcHJvbWlzZUtpdCB1c2VkIGFzIGEgdmFsdWUsIGV2ZW4gdGhvdWdoIGEgcHJvbWlzZUtpdCBpcyBub3QgYSBwYXNzYWJsZS5cbiAqICAgU29sdXRpb25zIGFyZSB0byBtYWtlIGl0IGEgcGFzc2FibGUsIG9yIHRvIGNvbnZlcnQgdGhlIGNvbnRhaW5lciBiYWNrIHRvIGFcbiAqICAgY29udmVudGlvbmFsIEphdmFTY3JpcHQgTWFwLlxuICogLSBBIG11dGFibGUgYXJyYXkgdXNlZCBhcyBhIHZhbHVlLCB0aGF0IGlzIHN1YnNlcXVlbnRseSBtdXRhdGVkLiBGcmVlemluZyB0aGVcbiAqICAgYXJyYXkgd291bGRuJ3Qgd29yayBvZiBjb3Vyc2UgYmVjYXVzZSBpdCB3b3VsZCBicmVhayB0aGUgc3Vic2VxdWVudFxuICogICBtdXRhdGlvbi4gVXNpbmcgYSBmYXIgb2JqZWN0IHdyYXBwaW5nIGFuIGFycmF5IHdvdWxkIGxpa2VseSB3b3JrIGZpbmUuXG4gKlxuICogQGRlcHJlY2F0ZWQgc3dpdGNoIHRvIFNjYWxhck1hcCBpZiBwb3NzaWJsZSwgTWFwIG90aGVyd2lzZVxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtzdHJpbmd9IFt0YWddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEByZXR1cm5zIHtMZWdhY3lNYXA8SywgVj59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlTGVnYWN5TWFwID0gKHRhZyA9ICdrZXknKSA9PiB7XG4gIGNvbnN0IG0gPSBuZXcgTWFwKCk7XG4gIGNvbnN0IGFzc2VydEtleURvZXNOb3RFeGlzdCA9IGtleSA9PlxuICAgICFtLmhhcyhrZXkpIHx8IEZhaWxgJHtxKHRhZyl9IGFscmVhZHkgcmVnaXN0ZXJlZDogJHtrZXl9YDtcbiAgY29uc3QgYXNzZXJ0S2V5RXhpc3RzID0ga2V5ID0+XG4gICAgbS5oYXMoa2V5KSB8fCBGYWlsYCR7cSh0YWcpfSBub3QgZm91bmQ6ICR7a2V5fWA7XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGhhczoga2V5ID0+IHtcbiAgICAgIC8qIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsKi9cbiAgICAgIC8qIHRob3VnaCB0aGUgYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kKi9cbiAgICAgIC8qIGluIHRoaXMgbWFwLiovXG4gICAgICByZXR1cm4gbS5oYXMoa2V5KTtcbiAgICB9LFxuICAgIGluaXQ6IChrZXksIHZhbHVlKSA9PiB7XG4gICAgICBhc3NlcnRLZXlEb2VzTm90RXhpc3Qoa2V5KTtcbiAgICAgIG0uc2V0KGtleSwgdmFsdWUpO1xuICAgIH0sXG4gICAgZ2V0OiBrZXkgPT4ge1xuICAgICAgYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4gICAgICByZXR1cm4gbS5nZXQoa2V5KTtcbiAgICB9LFxuICAgIHNldDogKGtleSwgdmFsdWUpID0+IHtcbiAgICAgIGFzc2VydEtleUV4aXN0cyhrZXkpO1xuICAgICAgbS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfSxcbiAgICBkZWxldGU6IGtleSA9PiB7XG4gICAgICBhc3NlcnRLZXlFeGlzdHMoa2V5KTtcbiAgICAgIG0uZGVsZXRlKGtleSk7XG4gICAgfSxcbiAgICBrZXlzOiAoKSA9PiBtLmtleXMoKSxcbiAgICB2YWx1ZXM6ICgpID0+IG0udmFsdWVzKCksXG4gICAgZW50cmllczogKCkgPT4gbS5lbnRyaWVzKCksXG4gICAgZ2V0U2l6ZTogKCkgPT4gbS5zaXplLFxuICAgIGNsZWFyOiAoKSA9PiBtLmNsZWFyKCksXG4gIH0pO1xufTskaM2PX29uY2UubWFrZUxlZ2FjeU1hcChtYWtlTGVnYWN5TWFwKTtcbmhhcmRlbihtYWtlTGVnYWN5TWFwKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VMZWdhY3lNYXAiOlsibWFrZUxlZ2FjeU1hcCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADbxEI1bQcAAG0HAAAwAAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIm1ha2VMZWdhY3lXZWFrTWFwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxxOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbi8qKlxuICogU2VlIGRvY2NvbW1lbnQgaW4gdGhlIGNsb3NlbHkgcmVsYXRlZCBgbGVnYWN5TWFwLmpzYCBtb2R1bGUuXG4gKlxuICogQGRlcHJlY2F0ZWQgc3dpdGNoIHRvIFNjYWxhcldlYWtNYXAgaWYgcG9zc2libGUsIFdlYWtNYXAgb3RoZXJ3aXNlXG4gKiBAdGVtcGxhdGUge1dlYWtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSBWXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZ10gLSB0YWcgZm9yIGRlYnVnZ2luZ1xuICogQHJldHVybnMge0xlZ2FjeVdlYWtNYXA8SywgVj59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlTGVnYWN5V2Vha01hcCA9ICh0YWcgPSAna2V5JykgPT4ge1xuICAvKiogQHR5cGUge1dlYWtNYXA8SyAmIG9iamVjdCwgVj59ICovXG4gIGNvbnN0IHdtID0gbmV3IFdlYWtNYXAoKTtcbiAgY29uc3QgYXNzZXJ0S2V5RG9lc05vdEV4aXN0ID0ga2V5ID0+XG4gICAgIXdtLmhhcyhrZXkpIHx8IEZhaWxgJHtxKHRhZyl9IGFscmVhZHkgcmVnaXN0ZXJlZDogJHtrZXl9YDtcbiAgY29uc3QgYXNzZXJ0S2V5RXhpc3RzID0ga2V5ID0+XG4gICAgd20uaGFzKGtleSkgfHwgRmFpbGAke3EodGFnKX0gbm90IGZvdW5kOiAke2tleX1gO1xuICByZXR1cm4gaGFyZGVuKHtcbiAgICBoYXM6IGtleSA9PiB7XG4gICAgICAvKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCovXG4gICAgICAvKiB0aG91Z2ggdGhlIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCovXG4gICAgICAvKiBpbiB0aGlzIG1hcC4qL1xuICAgICAgcmV0dXJuIHdtLmhhcyhrZXkpO1xuICAgIH0sXG4gICAgaW5pdDogKGtleSwgdmFsdWUpID0+IHtcbiAgICAgIGFzc2VydEtleURvZXNOb3RFeGlzdChrZXkpO1xuICAgICAgd20uc2V0KGtleSwgdmFsdWUpO1xuICAgIH0sXG4gICAgZ2V0OiBrZXkgPT4ge1xuICAgICAgYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4gICAgICAvKiBIb3cgdG8gdGVsbCB0eXBlc2NyaXB0IEkgYmVsaWV2ZSB0aGUgYGdldGAgd2lsbCBzdWNjZWVkLiovXG4gICAgICByZXR1cm4gLyoqIEB0eXBlIHtWfSAqLyAod20uZ2V0KGtleSkpO1xuICAgIH0sXG4gICAgc2V0OiAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4gICAgICB3bS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfSxcbiAgICBkZWxldGU6IGtleSA9PiB7XG4gICAgICBhc3NlcnRLZXlFeGlzdHMoa2V5KTtcbiAgICAgIHdtLmRlbGV0ZShrZXkpO1xuICAgIH0sXG4gIH0pO1xufTskaM2PX29uY2UubWFrZUxlZ2FjeVdlYWtNYXAobWFrZUxlZ2FjeVdlYWtNYXApO1xuaGFyZGVuKG1ha2VMZWdhY3lXZWFrTWFwKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VMZWdhY3lXZWFrTWFwIjpbIm1ha2VMZWdhY3lXZWFrTWFwIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANehQUbqGAAA6hgAADEAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vcGF0dGVybnMiLCIuL3NjYWxhcldlYWtNYXBTdG9yZS5qcyIsIi4vc3RvcmUtdXRpbHMuanMiXSwiZXhwb3J0cyI6WyJtYWtlTWFwU3RvcmVNZXRob2RzIiwibWFrZVNjYWxhck1hcFN0b3JlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcSxGYXIsYXNzZXJ0UGFzc2FibGUsZmlsdGVySXRlcmFibGUsbWFwSXRlcmFibGUsY29tcGFyZVJhbmssYXNzZXJ0U2NhbGFyS2V5LG1ha2VDb3B5TWFwLG1hdGNoZXMsbXVzdE1hdGNoLGFzc2VydFBhdHRlcm4sbWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMsbWFrZUN1cnJlbnRLZXlzS2l0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVwiLFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjNj19hKV1dLFtcImZpbHRlckl0ZXJhYmxlXCIsWyRozY9fYSA9PiAoZmlsdGVySXRlcmFibGUgPSAkaM2PX2EpXV0sW1wibWFwSXRlcmFibGVcIixbJGjNj19hID0+IChtYXBJdGVyYWJsZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImNvbXBhcmVSYW5rXCIsWyRozY9fYSA9PiAoY29tcGFyZVJhbmsgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiYXNzZXJ0U2NhbGFyS2V5XCIsWyRozY9fYSA9PiAoYXNzZXJ0U2NhbGFyS2V5ID0gJGjNj19hKV1dLFtcIm1ha2VDb3B5TWFwXCIsWyRozY9fYSA9PiAobWFrZUNvcHlNYXAgPSAkaM2PX2EpXV0sW1wibWF0Y2hlc1wiLFskaM2PX2EgPT4gKG1hdGNoZXMgPSAkaM2PX2EpXV0sW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcImFzc2VydFBhdHRlcm5cIixbJGjNj19hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjNj19hKV1dXV0sW1wiLi9zY2FsYXJXZWFrTWFwU3RvcmUuanNcIiwgW1tcIm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzXCIsWyRozY9fYSA9PiAobWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMgPSAkaM2PX2EpXV1dXSxbXCIuL3N0b3JlLXV0aWxzLmpzXCIsIFtbXCJtYWtlQ3VycmVudEtleXNLaXRcIixbJGjNj19hID0+IChtYWtlQ3VycmVudEtleXNLaXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7UGFzc2FibGV9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnO1xuICogQGltcG9ydCB7S2V5LCBQYXR0ZXJufSBmcm9tICdAZW5kby9wYXR0ZXJucyc7XG4gKiBAaW1wb3J0IHtNYXBTdG9yZSwgTWFwU3RvcmVNZXRob2RzLCBTdG9yZU9wdGlvbnN9IGZyb20gJy4uL3R5cGVzLmpzJztcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge01hcDxLLCBWPn0ganNtYXBcbiAqIEBwYXJhbSB7KGs6IEssIHY6IFYpID0+IHZvaWR9IGFzc2VydEtWT2tUb0FkZFxuICogQHBhcmFtIHsoazogSywgdjogVikgPT4gdm9pZH0gYXNzZXJ0S1ZPa1RvU2V0XG4gKiBAcGFyYW0geyhrOiBLKSA9PiB2b2lkfSBbYXNzZXJ0S2V5T2tUb0RlbGV0ZV1cbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnXVxuICogQHJldHVybnMge01hcFN0b3JlTWV0aG9kczxLLCBWPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VNYXBTdG9yZU1ldGhvZHMgPSAoXG4gIGpzbWFwLFxuICBhc3NlcnRLVk9rVG9BZGQsXG4gIGFzc2VydEtWT2tUb1NldCxcbiAgYXNzZXJ0S2V5T2tUb0RlbGV0ZSxcbiAgdGFnID0gJ2tleScsXG4pID0+IHtcbiAgY29uc3QgeyBhc3NlcnRVcGRhdGVPbkFkZCwgYXNzZXJ0VXBkYXRlT25EZWxldGUsIGl0ZXJhYmxlS2V5cyB9ID1cbiAgICBtYWtlQ3VycmVudEtleXNLaXQoXG4gICAgICAoKSA9PiBqc21hcC5rZXlzKCksXG4gICAgICBrID0+IGpzbWFwLmhhcyhrKSxcbiAgICAgIGNvbXBhcmVSYW5rLFxuICAgICAgYXNzZXJ0S1ZPa1RvQWRkLFxuICAgICAgYXNzZXJ0S2V5T2tUb0RlbGV0ZSxcbiAgICAgIHRhZyxcbiAgICApO1xuXG4gIC8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBba2V5UGF0dF1cbiAqIEBwYXJhbSB7UGF0dGVybn0gW3ZhbHVlUGF0dF1cbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxLPn1cbiAqL1xuICBjb25zdCBrZXlzID0gKGtleVBhdHQsIHZhbHVlUGF0dCkgPT4ge1xuICAgIGlmIChrZXlQYXR0ID09PSB1bmRlZmluZWQgJiYgdmFsdWVQYXR0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBpdGVyYWJsZUtleXM7XG4gICAgfVxuICAgIGNvbnN0IGZpbHRlciA9IGsgPT4ge1xuICAgICAgaWYgKGtleVBhdHQgIT09IHVuZGVmaW5lZCAmJiAhbWF0Y2hlcyhrLCBrZXlQYXR0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICAvKiBVc2VzIHRoZSBjdXJyZW50IGpzbWFwIHZhbHVlLCBzaW5jZSB0aGUgaXRlcmF0YXRvciBzdXJ2aXZlcyBgLnNldGAqL1xuICAgICAgaWYgKHZhbHVlUGF0dCAhPT0gdW5kZWZpbmVkICYmICFtYXRjaGVzKGpzbWFwLmdldChrKSwgdmFsdWVQYXR0KSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9O1xuICAgIHJldHVybiBmaWx0ZXJJdGVyYWJsZShpdGVyYWJsZUtleXMsIGZpbHRlcik7XG4gIH07XG5cbiAgLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm59IFtrZXlQYXR0XVxuICogQHBhcmFtIHtQYXR0ZXJufSBbdmFsdWVQYXR0XVxuICogQHJldHVybnMge0l0ZXJhYmxlPFY+fVxuICovXG4gIGNvbnN0IHZhbHVlcyA9IChrZXlQYXR0LCB2YWx1ZVBhdHQpID0+XG4gICAgbWFwSXRlcmFibGUoa2V5cyhrZXlQYXR0LCB2YWx1ZVBhdHQpLCBrID0+IC8qKiBAdHlwZSB7Vn0gKi8gKGpzbWFwLmdldChrKSkpO1xuXG4gIC8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBba2V5UGF0dF1cbiAqIEBwYXJhbSB7UGF0dGVybn0gW3ZhbHVlUGF0dF1cbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbSywgVl0+fVxuICovXG4gIGNvbnN0IGVudHJpZXMgPSAoa2V5UGF0dCwgdmFsdWVQYXR0KSA9PlxuICAgIG1hcEl0ZXJhYmxlKGtleXMoa2V5UGF0dCwgdmFsdWVQYXR0KSwgayA9PiBbXG4gICAgICBrLFxuICAgICAgLyoqIEB0eXBlIHtWfSAqLyAoanNtYXAuZ2V0KGspKSxcbiAgICBdKTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICAuLi5tYWtlV2Vha01hcFN0b3JlTWV0aG9kcyhcbiAgICAgIGpzbWFwLFxuICAgICAgLyoqIEB0eXBlIHsoazogSywgdjogVikgPT4gdm9pZH0gKi8gKGFzc2VydFVwZGF0ZU9uQWRkKSxcbiAgICAgIGFzc2VydEtWT2tUb1NldCxcbiAgICAgIGFzc2VydFVwZGF0ZU9uRGVsZXRlLFxuICAgICAgdGFnLFxuICAgICksXG4gICAga2V5cyxcbiAgICB2YWx1ZXMsXG4gICAgZW50cmllcyxcblxuICAgIHNuYXBzaG90OiAoa2V5UGF0dCA9IHVuZGVmaW5lZCwgdmFsdWVQYXR0ID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbWFrZUNvcHlNYXAoZW50cmllcyhrZXlQYXR0LCB2YWx1ZVBhdHQpKSxcblxuICAgIGdldFNpemU6IChrZXlQYXR0ID0gdW5kZWZpbmVkLCB2YWx1ZVBhdHQgPSB1bmRlZmluZWQpID0+XG4gICAgICBrZXlQYXR0ID09PSB1bmRlZmluZWQgJiYgdmFsdWVQYXR0ID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBqc21hcC5zaXplXG4gICAgICAgIDogWy4uLmtleXMoa2V5UGF0dCwgdmFsdWVQYXR0KV0ubGVuZ3RoLFxuXG4gICAgY2xlYXI6IChrZXlQYXR0ID0gdW5kZWZpbmVkLCB2YWx1ZVBhdHQgPSB1bmRlZmluZWQpID0+IHtcbiAgICAgIGlmIChrZXlQYXR0ID09PSB1bmRlZmluZWQgJiYgdmFsdWVQYXR0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAganNtYXAuY2xlYXIoKTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGtleXMoa2V5UGF0dCwgdmFsdWVQYXR0KSkge1xuICAgICAgICBqc21hcC5kZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn07XG5cbi8qKlxuICogRGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGFkZGluZyBhIG5ldyBrZXkgKGluaXQpIGFuZCB1cGRhdGluZyBvciByZWZlcmVuY2luZyBhXG4gKiBrZXkgKGdldCwgc2V0LCBkZWxldGUpLlxuICpcbiAqIGBpbml0YCBpcyBvbmx5IGFsbG93ZWQgaWYgdGhlIGtleSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LiBgR2V0YCwgYHNldGAgYW5kXG4gKiBgZGVsZXRlYCBhcmUgb25seSBhbGxvd2VkIGlmIHRoZSBrZXkgZG9lcyBhbHJlYWR5IGV4aXN0LlxuICpcbiAqIFRoaXMgaXMgYSBfc2NhbGFyXyBtYXAgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzLCBwcmltaXRpdmVzXG4gKiBvciByZW1vdGFibGVzLiBPdGhlciBzdG9yZU1hcHMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLCBjb3B5QXJyYXlzIGFuZFxuICogY29weVJlY29yZHMsIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBAdGVtcGxhdGUgSz1hbnlcbiAqIEB0ZW1wbGF0ZSBWPWFueVxuICogQHBhcmFtIHtzdHJpbmd9IFt0YWddIC0gdGhlIGNvbHVtbiBuYW1lIGZvciB0aGUga2V5XG4gKiBAcGFyYW0ge1N0b3JlT3B0aW9uc30gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7TWFwU3RvcmU8SywgVj59XG4gKi8kaM2PX29uY2UubWFrZU1hcFN0b3JlTWV0aG9kcyhtYWtlTWFwU3RvcmVNZXRob2RzKTtcbiAgICAgICBjb25zdCBtYWtlU2NhbGFyTWFwU3RvcmUgPSAoXG4gIHRhZyA9ICdrZXknLFxuICB7IGtleVNoYXBlLCB2YWx1ZVNoYXBlIH0gPSB7fSxcbikgPT4ge1xuICBjb25zdCBqc21hcCA9IG5ldyBNYXAoKTtcbiAgaWYgKGtleVNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnRQYXR0ZXJuKGtleVNoYXBlKTtcbiAgfVxuICBpZiAodmFsdWVTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0UGF0dGVybih2YWx1ZVNoYXBlKTtcbiAgfVxuXG4gIGNvbnN0IGFzc2VydEtWT2tUb1NldCA9IChfa2V5LCB2YWx1ZSkgPT4ge1xuICAgIC8qIFRPRE86IEp1c3QgYSB0cmFuc2l0aW9uIGtsdWRnZS4gUmVtb3ZlIHdoZW4gcG9zc2libGUuKi9cbiAgICAvKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNjA2Ki9cbiAgICBoYXJkZW4odmFsdWUpO1xuXG4gICAgYXNzZXJ0UGFzc2FibGUodmFsdWUpO1xuICAgIGlmICh2YWx1ZVNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG11c3RNYXRjaCh2YWx1ZSwgdmFsdWVTaGFwZSwgJ21hcFN0b3JlIHZhbHVlJyk7XG4gICAgfVxuICB9O1xuXG4gIGNvbnN0IGFzc2VydEtWT2tUb0FkZCA9IChrZXksIHZhbHVlKSA9PiB7XG4gICAgLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuICAgIC8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuICAgIGhhcmRlbihrZXkpO1xuXG4gICAgYXNzZXJ0U2NhbGFyS2V5KGtleSk7XG4gICAgaWYgKGtleVNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIG11c3RNYXRjaChrZXksIGtleVNoYXBlLCAnbWFwU3RvcmUga2V5Jyk7XG4gICAgfVxuICAgIGFzc2VydEtWT2tUb1NldChrZXksIHZhbHVlKTtcbiAgfTtcblxuICByZXR1cm4gRmFyKGBzY2FsYXIgTWFwU3RvcmUgb2YgJHtxKHRhZyl9YCwge1xuICAgIC4uLm1ha2VNYXBTdG9yZU1ldGhvZHMoXG4gICAgICBqc21hcCxcbiAgICAgIGFzc2VydEtWT2tUb0FkZCxcbiAgICAgIGFzc2VydEtWT2tUb1NldCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRhZyxcbiAgICApLFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VTY2FsYXJNYXBTdG9yZShtYWtlU2NhbGFyTWFwU3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJNYXBTdG9yZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTWFwU3RvcmVNZXRob2RzIjpbIm1ha2VNYXBTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhck1hcFN0b3JlIjpbIm1ha2VTY2FsYXJNYXBTdG9yZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACmQkq1EREAABERAAAxAAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL3BhdHRlcm5zIiwiLi9zY2FsYXJXZWFrU2V0U3RvcmUuanMiLCIuL3N0b3JlLXV0aWxzLmpzIl0sImV4cG9ydHMiOlsibWFrZVNjYWxhclNldFN0b3JlIiwibWFrZVNldFN0b3JlTWV0aG9kcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHEsRmFyLGZpbHRlckl0ZXJhYmxlLGNvbXBhcmVSYW5rLGFzc2VydFNjYWxhcktleSxtYWtlQ29weVNldCxtYXRjaGVzLG11c3RNYXRjaCxhc3NlcnRQYXR0ZXJuLG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzLG1ha2VDdXJyZW50S2V5c0tpdDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wiZmlsdGVySXRlcmFibGVcIixbJGjNj19hID0+IChmaWx0ZXJJdGVyYWJsZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImNvbXBhcmVSYW5rXCIsWyRozY9fYSA9PiAoY29tcGFyZVJhbmsgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiYXNzZXJ0U2NhbGFyS2V5XCIsWyRozY9fYSA9PiAoYXNzZXJ0U2NhbGFyS2V5ID0gJGjNj19hKV1dLFtcIm1ha2VDb3B5U2V0XCIsWyRozY9fYSA9PiAobWFrZUNvcHlTZXQgPSAkaM2PX2EpXV0sW1wibWF0Y2hlc1wiLFskaM2PX2EgPT4gKG1hdGNoZXMgPSAkaM2PX2EpXV0sW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcImFzc2VydFBhdHRlcm5cIixbJGjNj19hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjNj19hKV1dXV0sW1wiLi9zY2FsYXJXZWFrU2V0U3RvcmUuanNcIiwgW1tcIm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzXCIsWyRozY9fYSA9PiAobWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMgPSAkaM2PX2EpXV1dXSxbXCIuL3N0b3JlLXV0aWxzLmpzXCIsIFtbXCJtYWtlQ3VycmVudEtleXNLaXRcIixbJGjNj19hID0+IChtYWtlQ3VycmVudEtleXNLaXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtLZXksIFBhdHRlcm59IGZyb20gJ0BlbmRvL3BhdHRlcm5zJztcbiAqIEBpbXBvcnQge1NldFN0b3JlLCBTZXRTdG9yZU1ldGhvZHMsIFN0b3JlT3B0aW9uc30gZnJvbSAnLi4vdHlwZXMuanMnO1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEBwYXJhbSB7U2V0PEs+fSBqc3NldFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gYXNzZXJ0S2V5T2tUb0FkZFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gW2Fzc2VydEtleU9rVG9EZWxldGVdXG4gKiBAcGFyYW0ge3N0cmluZ30gW2tleU5hbWVdXG4gKiBAcmV0dXJucyB7U2V0U3RvcmVNZXRob2RzPEs+fVxuICovXG4gICAgICAgY29uc3QgbWFrZVNldFN0b3JlTWV0aG9kcyA9IChcbiAganNzZXQsXG4gIGFzc2VydEtleU9rVG9BZGQsXG4gIGFzc2VydEtleU9rVG9EZWxldGUsXG4gIGtleU5hbWUgPSAna2V5JyxcbikgPT4ge1xuICBjb25zdCB7IGFzc2VydFVwZGF0ZU9uQWRkLCBhc3NlcnRVcGRhdGVPbkRlbGV0ZSwgaXRlcmFibGVLZXlzIH0gPVxuICAgIG1ha2VDdXJyZW50S2V5c0tpdChcbiAgICAgICgpID0+IGpzc2V0LmtleXMoKSxcbiAgICAgIGsgPT4ganNzZXQuaGFzKGspLFxuICAgICAgY29tcGFyZVJhbmssXG4gICAgICBhc3NlcnRLZXlPa1RvQWRkLFxuICAgICAgYXNzZXJ0S2V5T2tUb0RlbGV0ZSxcbiAgICAgIGtleU5hbWUsXG4gICAgKTtcblxuICAvKipcbiAqIEBwYXJhbSB7UGF0dGVybn0gW2tleVBhdHRdXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8Sz59XG4gKi9cbiAgY29uc3Qga2V5cyA9IGtleVBhdHQgPT5cbiAgICBrZXlQYXR0ID09PSB1bmRlZmluZWRcbiAgICAgID8gaXRlcmFibGVLZXlzXG4gICAgICA6IGZpbHRlckl0ZXJhYmxlKGl0ZXJhYmxlS2V5cywgayA9PiBtYXRjaGVzKGssIGtleVBhdHQpKTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICAuLi5tYWtlV2Vha1NldFN0b3JlTWV0aG9kcyhcbiAgICAgIGpzc2V0LFxuICAgICAgYXNzZXJ0VXBkYXRlT25BZGQsXG4gICAgICBhc3NlcnRVcGRhdGVPbkRlbGV0ZSxcbiAgICAgIGtleU5hbWUsXG4gICAgKSxcblxuICAgIGtleXMsXG5cbiAgICB2YWx1ZXM6IGtleXMsXG5cbiAgICBzbmFwc2hvdDogKGtleVBhdHQgPSB1bmRlZmluZWQpID0+IG1ha2VDb3B5U2V0KGtleXMoa2V5UGF0dCkpLFxuXG4gICAgZ2V0U2l6ZTogKGtleVBhdHQgPSB1bmRlZmluZWQpID0+XG4gICAgICBrZXlQYXR0ID09PSB1bmRlZmluZWQgPyBqc3NldC5zaXplIDogWy4uLmtleXMoa2V5UGF0dCldLmxlbmd0aCxcblxuICAgIGNsZWFyOiAoa2V5UGF0dCA9IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgaWYgKGtleVBhdHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBqc3NldC5jbGVhcigpO1xuICAgICAgfVxuICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cyhrZXlQYXR0KSkge1xuICAgICAgICBqc3NldC5kZWxldGUoa2V5KTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn07XG5cbi8qKlxuICogRGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGFkZGluZyBhIG5ldyBrZXkgKGluaXQpIGFuZCB1cGRhdGluZyBvciByZWZlcmVuY2luZyBhXG4gKiBrZXkgKGdldCwgc2V0LCBkZWxldGUpLlxuICpcbiAqIGBpbml0YCBpcyBvbmx5IGFsbG93ZWQgaWYgdGhlIGtleSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LiBgR2V0YCwgYHNldGAgYW5kXG4gKiBgZGVsZXRlYCBhcmUgb25seSBhbGxvd2VkIGlmIHRoZSBrZXkgZG9lcyBhbHJlYWR5IGV4aXN0LlxuICpcbiAqIFRoaXMgaXMgYSBfc2NhbGFyXyBzZXQgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzLCBwcmltaXRpdmVzXG4gKiBvciByZW1vdGFibGVzLiBPdGhlciBzdG9yZVNldHMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLCBjb3B5QXJyYXlzIGFuZFxuICogY29weVJlY29yZHMsIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtzdHJpbmd9IFt0YWddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7U3RvcmVPcHRpb25zfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtTZXRTdG9yZTxLPn1cbiAqLyRozY9fb25jZS5tYWtlU2V0U3RvcmVNZXRob2RzKG1ha2VTZXRTdG9yZU1ldGhvZHMpO1xuICAgICAgIGNvbnN0IG1ha2VTY2FsYXJTZXRTdG9yZSA9ICh0YWcgPSAna2V5JywgeyBrZXlTaGFwZSB9ID0ge30pID0+IHtcbiAgY29uc3QganNzZXQgPSBuZXcgU2V0KCk7XG4gIGlmIChrZXlTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0UGF0dGVybihrZXlTaGFwZSk7XG4gIH1cblxuICBjb25zdCBhc3NlcnRLZXlPa1RvQWRkID0ga2V5ID0+IHtcbiAgICAvKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4gICAgLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG4gICAgaGFyZGVuKGtleSk7XG5cbiAgICBhc3NlcnRTY2FsYXJLZXkoa2V5KTtcbiAgICBpZiAoa2V5U2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbXVzdE1hdGNoKGtleSwga2V5U2hhcGUsICdzZXRTdG9yZSBrZXknKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIEZhcihgc2NhbGFyIFNldFN0b3JlIG9mICR7cSh0YWcpfWAsIHtcbiAgICAuLi5tYWtlU2V0U3RvcmVNZXRob2RzKGpzc2V0LCBhc3NlcnRLZXlPa1RvQWRkLCB1bmRlZmluZWQsIHRhZyksXG4gIH0pO1xufTskaM2PX29uY2UubWFrZVNjYWxhclNldFN0b3JlKG1ha2VTY2FsYXJTZXRTdG9yZSk7XG5oYXJkZW4obWFrZVNjYWxhclNldFN0b3JlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VTZXRTdG9yZU1ldGhvZHMiOlsibWFrZVNldFN0b3JlTWV0aG9kcyJdLCJtYWtlU2NhbGFyU2V0U3RvcmUiOlsibWFrZVNjYWxhclNldFN0b3JlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPk186ftFgAA7RYAADUAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIiwibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBxLEZhaWwsRmFyLGFzc2VydFBhc3NhYmxlLHBhc3NTdHlsZU9mLGdldENvcHlNYXBFbnRyaWVzLG11c3RNYXRjaCxhc3NlcnRQYXR0ZXJuLGlzQ29weU1hcDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UGFzc2FibGVcIixbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRozY9fYSldXSxbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcImdldENvcHlNYXBFbnRyaWVzXCIsWyRozY9fYSA9PiAoZ2V0Q29weU1hcEVudHJpZXMgPSAkaM2PX2EpXV0sW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcImFzc2VydFBhdHRlcm5cIixbJGjNj19hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjNj19hKV1dLFtcImlzQ29weU1hcFwiLFskaM2PX2EgPT4gKGlzQ29weU1hcCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtLZXl9IGZyb20gJ0BlbmRvL3BhdHRlcm5zJztcbiAqIEBpbXBvcnQge1Bhc3NhYmxlLCBSZW1vdGFibGVPYmplY3R9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnO1xuICogQGltcG9ydCB7V2Vha01hcFN0b3JlLCBTdG9yZU9wdGlvbnN9IGZyb20gJy4uL3R5cGVzLmpzJztcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge1dlYWtNYXA8SyAmIG9iamVjdCwgVj59IGpzbWFwXG4gKiBAcGFyYW0geyhrOiBLLCB2OiBWKSA9PiB2b2lkfSBhc3NlcnRLVk9rVG9BZGRcbiAqIEBwYXJhbSB7KGs6IEssIHY6IFYpID0+IHZvaWR9IGFzc2VydEtWT2tUb1NldFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gW2Fzc2VydEtleU9rVG9EZWxldGVdXG4gKiBAcGFyYW0ge3N0cmluZ30gW2tleU5hbWVdXG4gKiBAcmV0dXJucyB7V2Vha01hcFN0b3JlPEssIFY+fVxuICovXG4gICAgICAgY29uc3QgbWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMgPSAoXG4gIGpzbWFwLFxuICBhc3NlcnRLVk9rVG9BZGQsXG4gIGFzc2VydEtWT2tUb1NldCxcbiAgYXNzZXJ0S2V5T2tUb0RlbGV0ZSA9IHVuZGVmaW5lZCxcbiAga2V5TmFtZSA9ICdrZXknLFxuKSA9PiB7XG4gIGNvbnN0IGFzc2VydEtleURvZXNOb3RFeGlzdCA9IGtleSA9PlxuICAgICFqc21hcC5oYXMoa2V5KSB8fCBGYWlsYCR7cShrZXlOYW1lKX0gYWxyZWFkeSByZWdpc3RlcmVkOiAke2tleX1gO1xuXG4gIGNvbnN0IGFzc2VydEtleUV4aXN0cyA9IGtleSA9PlxuICAgIGpzbWFwLmhhcyhrZXkpIHx8IEZhaWxgJHtxKGtleU5hbWUpfSBub3QgZm91bmQ6ICR7a2V5fWA7XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgaGFzOiBrZXkgPT4ge1xuICAgICAgLyogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwqL1xuICAgICAgLyogdGhvdWdoIHRoZSBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQqL1xuICAgICAgLyogaW4gdGhpcyBtYXAuKi9cbiAgICAgIHJldHVybiBqc21hcC5oYXMoa2V5KTtcbiAgICB9LFxuICAgIGdldDoga2V5ID0+IHtcbiAgICAgIGFzc2VydEtleUV4aXN0cyhrZXkpO1xuICAgICAgLyogSG93IHRvIHRlbGwgdHlwZXNjcmlwdCBJIGJlbGlldmUgdGhlIGBnZXRgIHdpbGwgc3VjY2VlZC4qL1xuICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7Vn0gKi8gKGpzbWFwLmdldChrZXkpKTtcbiAgICB9LFxuXG4gICAgaW5pdDogKGtleSwgdmFsdWUpID0+IHtcbiAgICAgIGFzc2VydEtleURvZXNOb3RFeGlzdChrZXkpO1xuICAgICAgYXNzZXJ0S1ZPa1RvQWRkKGtleSwgdmFsdWUpO1xuICAgICAganNtYXAuc2V0KGtleSwgdmFsdWUpO1xuICAgIH0sXG4gICAgc2V0OiAoa2V5LCB2YWx1ZSkgPT4ge1xuICAgICAgYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4gICAgICBhc3NlcnRLVk9rVG9TZXQoa2V5LCB2YWx1ZSk7XG4gICAgICBqc21hcC5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgfSxcbiAgICBkZWxldGU6IGtleSA9PiB7XG4gICAgICBhc3NlcnRLZXlFeGlzdHMoa2V5KTtcbiAgICAgIGlmIChhc3NlcnRLZXlPa1RvRGVsZXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXNzZXJ0S2V5T2tUb0RlbGV0ZShrZXkpO1xuICAgICAgfVxuICAgICAganNtYXAuZGVsZXRlKGtleSk7XG4gICAgfSxcblxuICAgIGFkZEFsbDogZW50cmllcyA9PiB7XG4gICAgICBpZiAodHlwZW9mIGVudHJpZXNbU3ltYm9sLml0ZXJhdG9yXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpZiAoT2JqZWN0LmlzRnJvemVuKGVudHJpZXMpICYmIGlzQ29weU1hcChlbnRyaWVzKSkge1xuICAgICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgWFhYKi9cbiAgICAgICAgICBlbnRyaWVzID0gZ2V0Q29weU1hcEVudHJpZXMoZW50cmllcyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgRmFpbGBwcm92aWRlZCBkYXRhIHNvdXJjZSBpcyBub3QgaXRlcmFibGU6ICR7ZW50cmllc31gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiAvKiogQHR5cGUge0l0ZXJhYmxlPFtLLCBWXT59ICovIChlbnRyaWVzKSkge1xuICAgICAgICAvKiBEb24ndCBhc3NlcnQgdGhhdCB0aGUga2V5IGVpdGhlciBkb2VzIG9yIGRvZXMgbm90IGV4aXN0LiovXG4gICAgICAgIGFzc2VydEtWT2tUb0FkZChrZXksIHZhbHVlKTtcbiAgICAgICAganNtYXAuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgfVxuICAgIH0sXG4gIH0pO1xufTtcblxuLyoqXG4gKiBUaGlzIGlzIGEgX3NjYWxhcl8gbWFwU3RvcmUgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzOlxuICogcHJpbWl0aXZlcyBvciByZW1vdGFibGVzLiBPdGhlciBtYXBTdG9yZXMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLFxuICogY29weUFycmF5cyBhbmQgY29weVJlY29yZHMgYXMga2V5cyBhbmQgbG9vayB0aGVtIHVwIGJhc2VkIG9uIGVxdWFsaXR5IG9mXG4gKiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBUT0RPIEZvciBub3csIHRoaXMgc2NhbGFyV2Vha01hcCBhY2NlcHRzIG9ubHkgcmVtb3RhYmxlcywgcmVmbGVjdGluZyB0aGVcbiAqIGNvbnN0cmFpbnRzIG9mIHRoZSB1bmRlcmx5aW5nIEphdmFTY3JpcHQgV2Vha01hcCBpdCB1c2VzIGludGVybmFsbHkuIEJ1dCBpdFxuICogc2hvdWxkIGFjY2VwdCB0aGUgcHJpbWl0aXZlcyBhcyB3ZWxsLCBzdG9yaW5nIHRoZW0gaW4gYSBzZXBhcmF0ZSBpbnRlcm5hbFxuICogbWFwLiBXaGF0IG1ha2VzIGl0IFwid2Vha1wiIGlzIHRoYXQgaXQgcHJvdmlkZXMgbm8gQVBJIGZvciBlbnVtZXJhdGluZyB3aGF0J3NcbiAqIHRoZXJlLiBUaG91Z2ggbm90ZSB0aGF0IHRoaXMgd291bGQgb25seSBlbmFibGVzIGNvbGxlY3Rpb24gb2YgdGhlIHJlbW90YWJsZXMsXG4gKiBzaW5jZSB0aGUgb3RoZXIgcHJpbWl0aXZlcyBtYXkgYWx3YXlzIHJlYXBwZWFyLlxuICpcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnXSAtIHRhZyBmb3IgZGVidWdnaW5nXG4gKiBAcGFyYW0ge1N0b3JlT3B0aW9uc30gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7UmVtb3RhYmxlT2JqZWN0ICYgV2Vha01hcFN0b3JlPEssIFY+fVxuICovJGjNj19vbmNlLm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzKG1ha2VXZWFrTWFwU3RvcmVNZXRob2RzKTtcbiAgICAgICBjb25zdCBtYWtlU2NhbGFyV2Vha01hcFN0b3JlID0gKFxuICB0YWcgPSAna2V5JyxcbiAgeyBsb25nTGl2ZWQgPSB0cnVlLCBrZXlTaGFwZSA9IHVuZGVmaW5lZCwgdmFsdWVTaGFwZSA9IHVuZGVmaW5lZCB9ID0ge30sXG4pID0+IHtcbiAgLyoqIEB0eXBlIHtXZWFrTWFwPEsgJiBvYmplY3QsIFY+fSAqL1xuICBjb25zdCBqc21hcCA9IGxvbmdMaXZlZCA/IG5ldyBXZWFrTWFwKCkgOiBuZXcgTWFwKCk7XG4gIGlmIChrZXlTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXNzZXJ0UGF0dGVybihrZXlTaGFwZSk7XG4gIH1cbiAgaWYgKHZhbHVlU2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydFBhdHRlcm4odmFsdWVTaGFwZSk7XG4gIH1cblxuICBjb25zdCBhc3NlcnRLVk9rVG9TZXQgPSAoX2tleSwgdmFsdWUpID0+IHtcbiAgICAvKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4gICAgLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG4gICAgaGFyZGVuKHZhbHVlKTtcblxuICAgIGFzc2VydFBhc3NhYmxlKHZhbHVlKTtcbiAgICBpZiAodmFsdWVTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtdXN0TWF0Y2godmFsdWUsIHZhbHVlU2hhcGUsICd3ZWFrTWFwU3RvcmUgdmFsdWUnKTtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgYXNzZXJ0S1ZPa1RvQWRkID0gKGtleSwgdmFsdWUpID0+IHtcbiAgICAvKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4gICAgLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG4gICAgaGFyZGVuKGtleSk7XG4gICAgcGFzc1N0eWxlT2Yoa2V5KSA9PT0gJ3JlbW90YWJsZScgfHxcbiAgICAgIEZhaWxgT25seSByZW1vdGFibGVzIGNhbiBiZSBrZXlzIG9mIHNjYWxhciBXZWFrTWFwU3RvcmVzOiAke2tleX1gO1xuICAgIGlmIChrZXlTaGFwZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBtdXN0TWF0Y2goa2V5LCBrZXlTaGFwZSwgJ3dlYWtNYXBTdG9yZSBrZXknKTtcbiAgICB9XG4gICAgYXNzZXJ0S1ZPa1RvU2V0KGtleSwgdmFsdWUpO1xuICB9O1xuXG4gIHJldHVybiBGYXIoYHNjYWxhciBXZWFrTWFwU3RvcmUgb2YgJHtxKHRhZyl9YCwge1xuICAgIC4uLm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzKFxuICAgICAganNtYXAsXG4gICAgICBhc3NlcnRLVk9rVG9BZGQsXG4gICAgICBhc3NlcnRLVk9rVG9TZXQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0YWcsXG4gICAgKSxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlU2NhbGFyV2Vha01hcFN0b3JlKG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJXZWFrTWFwU3RvcmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiOlsibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhcldlYWtNYXBTdG9yZSI6WyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJRapRtOEQAAThEAADUAAABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIiwibWFrZVdlYWtTZXRTdG9yZU1ldGhvZHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBxLEZhaWwsRmFyLHBhc3NTdHlsZU9mLGdldENvcHlTZXRLZXlzLG11c3RNYXRjaCxhc3NlcnRQYXR0ZXJuLGlzQ29weVNldDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJnZXRDb3B5U2V0S2V5c1wiLFskaM2PX2EgPT4gKGdldENvcHlTZXRLZXlzID0gJGjNj19hKV1dLFtcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXSxbXCJhc3NlcnRQYXR0ZXJuXCIsWyRozY9fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRozY9fYSldXSxbXCJpc0NvcHlTZXRcIixbJGjNj19hID0+IChpc0NvcHlTZXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7S2V5fSBmcm9tICdAZW5kby9wYXR0ZXJucyc7XG4gKiBAaW1wb3J0IHtTdG9yZU9wdGlvbnMsIFdlYWtTZXRTdG9yZSwgV2Vha1NldFN0b3JlTWV0aG9kc30gZnJvbSAnQGFnb3JpYy9zdG9yZSc7XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHBhcmFtIHtXZWFrU2V0PEsgJiBvYmplY3Q+fSBqc3NldFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gYXNzZXJ0S2V5T2tUb0FkZFxuICogQHBhcmFtIHsoazogSykgPT4gdm9pZH0gW2Fzc2VydEtleU9rVG9EZWxldGVdXG4gKiBAcGFyYW0ge3N0cmluZ30gW2tleU5hbWVdXG4gKiBAcmV0dXJucyB7V2Vha1NldFN0b3JlTWV0aG9kczxLPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzID0gKFxuICBqc3NldCxcbiAgYXNzZXJ0S2V5T2tUb0FkZCxcbiAgYXNzZXJ0S2V5T2tUb0RlbGV0ZSA9IHVuZGVmaW5lZCxcbiAga2V5TmFtZSA9ICdrZXknLFxuKSA9PiB7XG4gIGNvbnN0IGFzc2VydEtleUV4aXN0cyA9IGtleSA9PlxuICAgIGpzc2V0LmhhcyhrZXkpIHx8IEZhaWxgJHtxKGtleU5hbWUpfSBub3QgZm91bmQ6ICR7a2V5fWA7XG5cbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgaGFzOiBrZXkgPT4ge1xuICAgICAgLyogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwqL1xuICAgICAgLyogdGhvdWdoIHRoZSBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQqL1xuICAgICAgLyogaW4gdGhpcyBzZXQuKi9cbiAgICAgIHJldHVybiBqc3NldC5oYXMoa2V5KTtcbiAgICB9LFxuXG4gICAgYWRkOiBrZXkgPT4ge1xuICAgICAgYXNzZXJ0S2V5T2tUb0FkZChrZXkpO1xuICAgICAganNzZXQuYWRkKGtleSk7XG4gICAgfSxcbiAgICBkZWxldGU6IGtleSA9PiB7XG4gICAgICBhc3NlcnRLZXlFeGlzdHMoa2V5KTtcbiAgICAgIGlmIChhc3NlcnRLZXlPa1RvRGVsZXRlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYXNzZXJ0S2V5T2tUb0RlbGV0ZShrZXkpO1xuICAgICAgfVxuICAgICAganNzZXQuZGVsZXRlKGtleSk7XG4gICAgfSxcblxuICAgIGFkZEFsbDoga2V5cyA9PiB7XG4gICAgICBpZiAodHlwZW9mIGtleXNbU3ltYm9sLml0ZXJhdG9yXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBpZiAoT2JqZWN0LmlzRnJvemVuKGtleXMpICYmIGlzQ29weVNldChrZXlzKSkge1xuICAgICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgWFhYKi9cbiAgICAgICAgICBrZXlzID0gZ2V0Q29weVNldEtleXMoa2V5cyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgRmFpbGBwcm92aWRlZCBkYXRhIHNvdXJjZSBpcyBub3QgaXRlcmFibGU6ICR7a2V5c31gO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGtleSBvZiAvKiogQHR5cGUge0l0ZXJhYmxlPEs+fSAqLyAoa2V5cykpIHtcbiAgICAgICAgYXNzZXJ0S2V5T2tUb0FkZChrZXkpO1xuICAgICAgICBqc3NldC5hZGQoa2V5KTtcbiAgICAgIH1cbiAgICB9LFxuICB9KTtcbn07XG5cbi8qKlxuICogVGhpcyBpcyBhIF9zY2FsYXJfIHNldCBpbiB0aGF0IHRoZSBrZXlzIGNhbiBvbmx5IGJlIGF0b21pYyB2YWx1ZXMsIHByaW1pdGl2ZXNcbiAqIG9yIHJlbW90YWJsZXMuIE90aGVyIHN0b3JlU2V0cyB3aWxsIGFjY2VwdCwgZm9yIGV4YW1wbGUsIGNvcHlBcnJheXMgYW5kXG4gKiBjb3B5UmVjb3JkcywgYXMga2V5cyBhbmQgbG9vayB0aGVtIHVwIGJhc2VkIG9uIGVxdWFsaXR5IG9mIHRoZWlyIGNvbnRlbnRzLlxuICpcbiAqIFRPRE8gRm9yIG5vdywgdGhpcyBzY2FsYXJXZWFrU2V0IGFjY2VwdHMgb25seSByZW1vdGFibGVzLCByZWZsZWN0aW5nIHRoZVxuICogY29uc3RyYWludHMgb2YgdGhlIHVuZGVybHlpbmcgSmF2YVNjcmlwdCBXZWFrU2V0IGl0IHVzZXMgaW50ZXJuYWxseS4gQnV0IGl0XG4gKiBzaG91bGQgYWNjZXB0IHRoZSBwcmltaXRpdmVzIGFzIHdlbGwsIHN0b3JpbmcgdGhlbSBpbiBhIHNlcGFyYXRlIGludGVybmFsXG4gKiBzZXQuIFdoYXQgbWFrZXMgaXQgXCJ3ZWFrXCIgaXMgdGhhdCBpdCBwcm92aWRlcyBubyBBUEkgZm9yIGVudW1lcmF0aW5nIHdoYXQnc1xuICogdGhlcmUuIFRob3VnaCBub3RlIHRoYXQgdGhpcyB3b3VsZCBvbmx5IGVuYWJsZXMgY29sbGVjdGlvbiBvZiB0aGUgcmVtb3RhYmxlcyxcbiAqIHNpbmNlIHRoZSBvdGhlciBwcmltaXRpdmVzIG1heSBhbHdheXMgYXBwZWFyLlxuICpcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZ10gLSB0YWcgZm9yIGRlYnVnZ2luZ1xuICogQHBhcmFtIHtTdG9yZU9wdGlvbnN9IFtvcHRpb25zXVxuICogQHJldHVybnMge1dlYWtTZXRTdG9yZTxLPn1cbiAqLyRozY9fb25jZS5tYWtlV2Vha1NldFN0b3JlTWV0aG9kcyhtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyk7XG4gICAgICAgY29uc3QgbWFrZVNjYWxhcldlYWtTZXRTdG9yZSA9IChcbiAgdGFnID0gJ2tleScsXG4gIHsgbG9uZ0xpdmVkID0gdHJ1ZSwga2V5U2hhcGUgPSB1bmRlZmluZWQgfSA9IHt9LFxuKSA9PiB7XG4gIGNvbnN0IGpzc2V0ID0gbmV3IChsb25nTGl2ZWQgPyBXZWFrU2V0IDogU2V0KSgpO1xuICBpZiAoa2V5U2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgIGFzc2VydFBhdHRlcm4oa2V5U2hhcGUpO1xuICB9XG5cbiAgY29uc3QgYXNzZXJ0S2V5T2tUb0FkZCA9IGtleSA9PiB7XG4gICAgLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuICAgIC8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuICAgIGhhcmRlbihrZXkpO1xuICAgIHBhc3NTdHlsZU9mKGtleSkgPT09ICdyZW1vdGFibGUnIHx8XG4gICAgICBGYWlsYE9ubHkgcmVtb3RhYmxlcyBjYW4gYmUga2V5cyBvZiBzY2FsYXIgV2Vha1N0b3JlczogJHtrZXl9YDtcbiAgICBpZiAoa2V5U2hhcGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgbXVzdE1hdGNoKGtleSwga2V5U2hhcGUsICd3ZWFrU2V0U3RvcmUga2V5Jyk7XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBGYXIoYHNjYWxhciBXZWFrU2V0U3RvcmUgb2YgJHtxKHRhZyl9YCwge1xuICAgIC4uLm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzKGpzc2V0LCBhc3NlcnRLZXlPa1RvQWRkLCB1bmRlZmluZWQsIHRhZyksXG4gIH0pO1xufTskaM2PX29uY2UubWFrZVNjYWxhcldlYWtTZXRTdG9yZShtYWtlU2NhbGFyV2Vha1NldFN0b3JlKTtcbmhhcmRlbihtYWtlU2NhbGFyV2Vha1NldFN0b3JlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VXZWFrU2V0U3RvcmVNZXRob2RzIjpbIm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzIl0sIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiOlsibWFrZVNjYWxhcldlYWtTZXRTdG9yZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACqV+8u2xoAANsaAAAuAAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vcGF0dGVybnMiXSwiZXhwb3J0cyI6WyJhcHBlbmRUb1N0b3JlZEFycmF5IiwiaXNDb3B5TWFwIiwiaXNDb3B5U2V0IiwibWFrZUF0b21pY1Byb3ZpZGVyIiwibWFrZUN1cnJlbnRLZXlzS2l0IiwicHJvdmlkZUxhenkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHEsRmFyLGlzQ29weU1hcCxpc0NvcHlTZXQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGF0dGVybnNcIiwgW1tcImlzQ29weU1hcFwiLFskaM2PX2EgPT4gKGlzQ29weU1hcCA9ICRozY9fYSksJGjNj19saXZlW1wiaXNDb3B5TWFwXCJdXV0sW1wiaXNDb3B5U2V0XCIsWyRozY9fYSA9PiAoaXNDb3B5U2V0ID0gJGjNj19hKSwkaM2PX2xpdmVbXCJpc0NvcHlTZXRcIl1dXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDdXJyZW50S2V5c0tpdFxuICogQHByb3BlcnR5IHsoazogSywgdj86IFYpID0+IHZvaWR9IGFzc2VydFVwZGF0ZU9uQWRkXG4gKiBAcHJvcGVydHkgeyhrOiBLKSA9PiB2b2lkfSBhc3NlcnRVcGRhdGVPbkRlbGV0ZVxuICogQHByb3BlcnR5IHtJdGVyYWJsZTxLPn0gaXRlcmFibGVLZXlzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHsoKSA9PiBJdGVyYWJsZTxLPn0gZ2V0UmF3S2V5c1xuICogQHBhcmFtIHsoazogSykgPT4gYm9vbGVhbn0gY2hlY2tIYXNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7KGs6IEssIHY/OiBWKSA9PiB2b2lkfSBhc3NlcnRPa1RvQWRkXG4gKiBAcGFyYW0geyhrOiBLKSA9PiB2b2lkfSBbYXNzZXJ0T2tUb0RlbGV0ZV1cbiAqIEBwYXJhbSB7c3RyaW5nfSBba2V5TmFtZV1cbiAqIEByZXR1cm5zIHtDdXJyZW50S2V5c0tpdDxLLCBWPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VDdXJyZW50S2V5c0tpdCA9IChcbiAgZ2V0UmF3S2V5cyxcbiAgY2hlY2tIYXMsXG4gIGNvbXBhcmUsXG4gIGFzc2VydE9rVG9BZGQsXG4gIGFzc2VydE9rVG9EZWxldGUsXG4gIGtleU5hbWUgPSAna2V5JyxcbikgPT4ge1xuICBsZXQgdXBkYXRlQ291bnQgPSAwO1xuICAvKiogQHR5cGUge0FycmF5PEs+IHwgdW5kZWZpbmVkfSAqL1xuICBsZXQgc29ydGVkS2V5c01lbW87XG5cbiAgY29uc3QgYXNzZXJ0VXBkYXRlT25BZGQgPSAoaywgdiA9IHVuZGVmaW5lZCkgPT4ge1xuICAgIGFzc2VydE9rVG9BZGQoaywgdik7XG4gICAgdXBkYXRlQ291bnQgKz0gMTtcbiAgICBzb3J0ZWRLZXlzTWVtbyA9IHVuZGVmaW5lZDtcbiAgfTtcblxuICBjb25zdCBhc3NlcnRVcGRhdGVPbkRlbGV0ZSA9IGsgPT4gYXNzZXJ0T2tUb0RlbGV0ZSAmJiBhc3NlcnRPa1RvRGVsZXRlKGspO1xuXG4gIGNvbnN0IGdldFNvcnRlZEtleXMgPSAoKSA9PiB7XG4gICAgaWYgKHNvcnRlZEtleXNNZW1vID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHNvcnRlZEtleXNNZW1vID0gaGFyZGVuKFsuLi5nZXRSYXdLZXlzKCldLnNvcnQoY29tcGFyZSkpO1xuICAgIH1cbiAgICByZXR1cm4gc29ydGVkS2V5c01lbW87XG4gIH07XG5cbiAgY29uc3QgaXRlcmFibGVLZXlzID0gRmFyKCdJdGVyYWJsZSBvZiBrZXlzJywge1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICBjb25zdCBnZW5lcmF0aW9uID0gdXBkYXRlQ291bnQ7XG4gICAgICBnZXRTb3J0ZWRLZXlzKCk7XG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFRTIGRvZXNuJ3QgdHJhY2sgdGhhdCBzb3J0ZWRLZXlzTWVtbyBpcyBkZWZpbmVkKi9cbiAgICAgIGNvbnN0IGxlbiA9IHNvcnRlZEtleXNNZW1vLmxlbmd0aDtcbiAgICAgIGxldCBpID0gMDtcbiAgICAgIHJldHVybiBGYXIoJ0l0ZXJhdG9yIG9mIGtleXMnLCB7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICBnZW5lcmF0aW9uID09PSB1cGRhdGVDb3VudCB8fCBGYWlsYFN0b3JlICR7cShrZXlOYW1lKX0gY3Vyc29yIHN0YWxlYDtcbiAgICAgICAgICAvKiBJZiB0aGV5J3JlIGVxdWFsLCB0aGVuIHRoZSBzb3J0ZWRLZXlNZW1vIGlzIHRoZSBzYW1lIG9uZSovXG4gICAgICAgICAgLyogd2Ugc3RhcnRlZCB3aXRoLiovXG4gICAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgICAgaWYgKGkgPCBsZW4pIHtcbiAgICAgICAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBUUyBkb2Vzbid0IHRyYWNrIHRoYXQgc29ydGVkS2V5c01lbW8gaXMgZGVmaW5lZCovXG4gICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gc29ydGVkS2V5c01lbW9baV07XG4gICAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgICAgaWYgKGNoZWNrSGFzKHZhbHVlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBoYXJkZW4oLyoqIEB0eXBlIHtjb25zdH0gKi8gKHsgZG9uZTogZmFsc2UsIHZhbHVlIH0pKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhcmRlbihcbiAgICAgICAgICAgICAgICAvKiogQHR5cGUge2NvbnN0fSAqLyAoeyBkb25lOiB0cnVlLCB2YWx1ZTogdW5kZWZpbmVkIH0pLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pO1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGFzc2VydFVwZGF0ZU9uQWRkLFxuICAgIGFzc2VydFVwZGF0ZU9uRGVsZXRlLFxuICAgIGl0ZXJhYmxlS2V5cyxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlQ3VycmVudEtleXNLaXQobWFrZUN1cnJlbnRLZXlzS2l0KTtcbmhhcmRlbihtYWtlQ3VycmVudEtleXNLaXQpO1xuXG4vKipcbiAqIENhbGwgYHByb3ZpZGVMYXp5YCB0byBnZXQgb3IgbWFrZSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXkuIElmIHRoZXJlXG4gKiBhbHJlYWR5IGlzIG9uZSwgcmV0dXJuIHRoYXQuIE90aGVyd2lzZSwgY2FsbCBgbWFrZVZhbHVlKGtleSlgLCByZW1lbWJlciBpdCBhc1xuICogdGhlIHZhbHVlIGZvciB0aGF0IGtleSwgYW5kIHJldHVybiBpdC5cbiAqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtXZWFrTWFwU3RvcmU8SywgVj59IG1hcFN0b3JlXG4gKiBAcGFyYW0ge0t9IGtleVxuICogQHBhcmFtIHsoa2V5OiBLKSA9PiBWfSBtYWtlVmFsdWVcbiAqIEByZXR1cm5zIHtWfVxuICovXG4gICAgICAgY29uc3QgcHJvdmlkZUxhenkgPSAobWFwU3RvcmUsIGtleSwgbWFrZVZhbHVlKSA9PiB7XG4gIGlmICghbWFwU3RvcmUuaGFzKGtleSkpIHtcbiAgICBtYXBTdG9yZS5pbml0KGtleSwgbWFrZVZhbHVlKGtleSkpO1xuICB9XG4gIHJldHVybiBtYXBTdG9yZS5nZXQoa2V5KTtcbn07JGjNj19vbmNlLnByb3ZpZGVMYXp5KHByb3ZpZGVMYXp5KTtcbmhhcmRlbihwcm92aWRlTGF6eSk7XG5cbi8qKlxuICogSGVscGVyIGZvciB1c2UgY2FzZXMgaW4gd2hpY2ggdGhlIG1ha2VyIGZ1bmN0aW9uIGlzIGFzeW5jLiBGb3IgdHdvXG4gKiBwcm92aWRlTGF6eSBjYWxscyB3aXRoIHRoZSBzYW1lIGtleSwgb25lIG1heSBiZSBtYWtpbmcgd2hlbiB0aGUgb3RoZXIgY2FsbFxuICogc3RhcnRzIGFuZCBpdCB3b3VsZCBtYWtlIGFnYWluLiAoVGhlbiB0aGVyZSdkIGJlIGEgY29sbGlzaW9uIHdoZW4gdGhlIHNlY29uZFxuICogdHJpZXMgdG8gc3RvcmUgdGhlIGtleS4pIFRoaXMgcHJldmVudHMgdGhhdCByYWNlIGNvbmRpdGlvbiBieSBpbW1lZGlhdGVseVxuICogc3RvcmluZyBhIFByb21pc2UgZm9yIHRoZSBtYWtlciBpbiBhbiBlcGhlbWVyYWwgc3RvcmUuXG4gKlxuICogV2hlbiB0aGUgYHN0b3JlYCBhcmd1bWVudCBpcyBkdXJhYmxlIHN0b3JhZ2UsIG5vdGUgdGhhdCBpdCdzIHBvc3NpYmxlIGZvclxuICogdGVybWluYXRpb24gdG8gaGFwcGVuIGFmdGVyIHRoZSBtYWtlIGNvbXBsZXRlcyBhbmQgYmVmb3JlIGl0IHJlYWNoZXMgZHVyYWJsZVxuICogc3RvcmFnZS5cbiAqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtXZWFrTWFwU3RvcmU8SywgVj59IHN0b3JlXG4gKi9cbiAgICAgICBjb25zdCBtYWtlQXRvbWljUHJvdmlkZXIgPSBzdG9yZSA9PiB7XG4gIC8qKiBAdHlwZSB7TWFwPEssIFByb21pc2U8Vj4+fSAqL1xuICBjb25zdCBwZW5kaW5nID0gbmV3IE1hcCgpO1xuXG4gIC8qKlxuICogQ2FsbCBgcHJvdmlkZUFzeW5jYCB0byBnZXQgb3IgbWFrZSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXksIHdoZW5cbiAqIHRoZSBtYWtlciBpcyBhc3luY2hyb25vdXMuIElmIHRoZXJlIGFscmVhZHkgaXMgb25lLCByZXR1cm4gdGhhdC4gT3RoZXJ3aXNlLFxuICogY2FsbCBgbWFrZVZhbHVlKGtleSlgLCByZW1lbWJlciBpdCBhcyB0aGUgdmFsdWUgZm9yIHRoYXQga2V5LCBhbmQgcmV0dXJuXG4gKiBpdC5cbiAqXG4gKiBAcGFyYW0ge0t9IGtleVxuICogQHBhcmFtIHsoa2V5OiBLKSA9PiBQcm9taXNlPFY+fSBtYWtlVmFsdWUgbWFrZSB0aGUgdmFsdWUgZm9yIHRoZSBzdG9yZSBpZlxuICogICBpdCBoYXNuJ3QgYmVlbiBtYWRlIHlldCBvciB0aGUgbGFzdCBtYWtlIGZhaWxlZFxuICogQHBhcmFtIHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gUHJvbWlzZTx2b2lkPn0gW2ZpbmlzaFZhbHVlXSBydW5zIGV4YWN0bHlcbiAqICAgb25jZSBhZnRlciBhIG5ldyB2YWx1ZSBpcyBhZGRlZCB0byB0aGUgc3RvcmVcbiAqIEByZXR1cm5zIHtQcm9taXNlPFY+fVxuICovXG4gIGNvbnN0IHByb3ZpZGVBc3luYyA9IChrZXksIG1ha2VWYWx1ZSwgZmluaXNoVmFsdWUpID0+IHtcbiAgICBpZiAoc3RvcmUuaGFzKGtleSkpIHtcbiAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoc3RvcmUuZ2V0KGtleSkpO1xuICAgIH1cbiAgICBpZiAoIXBlbmRpbmcuaGFzKGtleSkpIHtcbiAgICAgIGNvbnN0IHZhbFAgPSBtYWtlVmFsdWUoa2V5KVxuICAgICAgICAudGhlbih2ID0+IHtcbiAgICAgICAgICBzdG9yZS5pbml0KGtleSwgdik7XG4gICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH0pXG4gICAgICAgIC50aGVuKHYgPT4ge1xuICAgICAgICAgIGlmIChmaW5pc2hWYWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZpbmlzaFZhbHVlKGtleSwgdikudGhlbigoKSA9PiB2KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH0pXG4gICAgICAgIC5maW5hbGx5KCgpID0+IHtcbiAgICAgICAgICBwZW5kaW5nLmRlbGV0ZShrZXkpO1xuICAgICAgICB9KTtcbiAgICAgIHBlbmRpbmcuc2V0KGtleSwgdmFsUCk7XG4gICAgfVxuICAgIGNvbnN0IHZhbFAgPSBwZW5kaW5nLmdldChrZXkpO1xuICAgIGFzc2VydCh2YWxQKTtcbiAgICByZXR1cm4gdmFsUDtcbiAgfTtcblxuICByZXR1cm4gaGFyZGVuKHsgcHJvdmlkZUFzeW5jIH0pO1xufTskaM2PX29uY2UubWFrZUF0b21pY1Byb3ZpZGVyKG1ha2VBdG9taWNQcm92aWRlcik7XG5oYXJkZW4obWFrZUF0b21pY1Byb3ZpZGVyKTtcbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBtYWtlQXRvbWljUHJvdmlkZXI8SywgVj4+fSBBdG9taWNQcm92aWRlcjxLLCBWPlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7TWFwU3RvcmU8SywgVltdPn0gbWFwU3RvcmVcbiAqIEBwYXJhbSB7S30ga2V5XG4gKiBAcGFyYW0ge1Z9IGl0ZW1cbiAqL1xuICAgICAgIGNvbnN0IGFwcGVuZFRvU3RvcmVkQXJyYXkgPSAobWFwU3RvcmUsIGtleSwgaXRlbSkgPT4ge1xuICBpZiAobWFwU3RvcmUuaGFzKGtleSkpIHtcbiAgICBjb25zdCBleHRhbnQgPSBtYXBTdG9yZS5nZXQoa2V5KTtcbiAgICBtYXBTdG9yZS5zZXQoa2V5LCBoYXJkZW4oWy4uLmV4dGFudCwgaXRlbV0pKTtcbiAgfSBlbHNlIHtcbiAgICBtYXBTdG9yZS5pbml0KGtleSwgaGFyZGVuKFtpdGVtXSkpO1xuICB9XG59OyRozY9fb25jZS5hcHBlbmRUb1N0b3JlZEFycmF5KGFwcGVuZFRvU3RvcmVkQXJyYXkpO1xuaGFyZGVuKGFwcGVuZFRvU3RvcmVkQXJyYXkpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnsiaXNDb3B5TWFwIjpbImlzQ29weU1hcCIsZmFsc2VdLCJpc0NvcHlTZXQiOlsiaXNDb3B5U2V0IixmYWxzZV19LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUN1cnJlbnRLZXlzS2l0IjpbIm1ha2VDdXJyZW50S2V5c0tpdCJdLCJwcm92aWRlTGF6eSI6WyJwcm92aWRlTGF6eSJdLCJtYWtlQXRvbWljUHJvdmlkZXIiOlsibWFrZUF0b21pY1Byb3ZpZGVyIl0sImFwcGVuZFRvU3RvcmVkQXJyYXkiOlsiYXBwZW5kVG9TdG9yZWRBcnJheSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAAnAAAAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3R5cGVzLWluZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAO31mJswAgAAMAIAABwAAABAYWdvcmljL3RpbWUtdjAuMy4yL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL3RpbWVNYXRoLmpzIiwiLi9zcmMvdHlwZUd1YXJkcy5qcyIsIi4vc3JjL3R5cGVzLWluZGV4LmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdGltZU1hdGguanMiLCIuL3NyYy90eXBlR3VhcmRzLmpzIiwiLi9zcmMvdHlwZXMtaW5kZXguanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvdGltZU1hdGguanNcIiwgW11dLFtcIi4vc3JjL3R5cGVHdWFyZHMuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLWluZGV4LmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALQzbZQKJQAACiUAACMAAABAYWdvcmljL3RpbWUtdjAuMy4yL3NyYy90aW1lTWF0aC5qc3siaW1wb3J0cyI6WyJAZW5kby9uYXQiLCJAZW5kby9lcnJvcnMiLCJAYWdvcmljL3N0b3JlIiwiLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsiVGltZU1hdGgiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBOYXQsRmFpbCxxLG11c3RNYXRjaCxSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSxUaW1lc3RhbXBSZWNvcmRTaGFwZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsWyRozY9fYSA9PiAoTmF0ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGVcIixbJGjNj19hID0+IChSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSA9ICRozY9fYSldXSxbXCJUaW1lc3RhbXBSZWNvcmRTaGFwZVwiLFskaM2PX2EgPT4gKFRpbWVzdGFtcFJlY29yZFNoYXBlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtSZWxhdGl2ZVRpbWUsIFJlbGF0aXZlVGltZVZhbHVlLCBUaW1lckJyYW5kLCBUaW1lTWF0aFR5cGUsIFRpbWVzdGFtcCwgVGltZXN0YW1wUmVjb3JkLCBUaW1lc3RhbXBWYWx1ZX0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtSYW5rQ29tcGFyaXNvbn0gZnJvbSAnQGVuZG8vbWFyc2hhbCc7XG4gKi9cblxuLyoqXG4gKiBgYWdyZWVkVGltZXJCcmFuZGAgaXMgaW50ZXJuYWwgdG8gdGhpcyBtb2R1bGUuXG4gKlxuICogQHBhcmFtIHtUaW1lckJyYW5kIHwgdW5kZWZpbmVkfSBsZWZ0QnJhbmRcbiAqIEBwYXJhbSB7VGltZXJCcmFuZCB8IHVuZGVmaW5lZH0gcmlnaHRCcmFuZFxuICogQHJldHVybnMge1RpbWVyQnJhbmQgfCB1bmRlZmluZWR9XG4gKi9cbmNvbnN0IGFncmVlZFRpbWVyQnJhbmQgPSAobGVmdEJyYW5kLCByaWdodEJyYW5kKSA9PiB7XG4gIGlmIChsZWZ0QnJhbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIGlmIChyaWdodEJyYW5kID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiByaWdodEJyYW5kO1xuICAgIH1cbiAgfSBlbHNlIGlmIChyaWdodEJyYW5kID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4gbGVmdEJyYW5kO1xuICB9IGVsc2Uge1xuICAgIGxlZnRCcmFuZCA9PT0gcmlnaHRCcmFuZCB8fFxuICAgICAgRmFpbGBUaW1lckJyYW5kcyBtdXN0IG1hdGNoOiAke3EobGVmdEJyYW5kKX0gdnMgJHtxKHJpZ2h0QnJhbmQpfWA7XG4gICAgcmV0dXJuIGxlZnRCcmFuZDtcbiAgfVxufTtcblxuLyoqXG4gKiBgc2hhcmVkVGltZXJCcmFuZGAgaXMgaW50ZXJuYWwgdG8gdGhpcyBtb2R1bGUsIGFuZCBpbXBsZW1lbnRzIHRoZVxuICogdHJhbnNpdGlvbmFsIGJyYW5kIGNoZWNraW5nIGFuZCBjb250YWlnaW9uIGxvZ2ljIGV4cGxhaW5lZCBpbiB0aGUgYFRpbWVNYXRoYFxuICogY29tbWVudC4gSXQgaXMgdXNlZCB0byBkZWZpbmUgdGhlIGJpbmFyeSBvcGVyYXRvcnMgdGhhdCBzaG91bGQgZm9sbG93XG4gKiB0aGlzIGxvZ2ljLiBJdCBkb2VzIHRoZSBlcnJvciBjaGVja2luZyBiZXR3ZWVuIHRoZSBvcGVyYW5kcywgYW5kIHJldHVybnNcbiAqIHRoZSBicmFuZCwgaWYgYW55LCB0aGF0IHNob3VsZCBsYWJlbCB0aGUgcmVzdWx0aW5nIHRpbWUgdmFsdWUuXG4gKlxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IGxlZnRcbiAqIEBwYXJhbSB7VGltZXN0YW1wIHwgUmVsYXRpdmVUaW1lfSByaWdodFxuICogQHJldHVybnMge1RpbWVyQnJhbmQgfCB1bmRlZmluZWR9XG4gKi9cbmNvbnN0IHNoYXJlZFRpbWVyQnJhbmQgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgY29uc3QgbGVmdEJyYW5kID0gdHlwZW9mIGxlZnQgPT09ICdiaWdpbnQnID8gdW5kZWZpbmVkIDogbGVmdC50aW1lckJyYW5kO1xuICBjb25zdCByaWdodEJyYW5kID0gdHlwZW9mIHJpZ2h0ID09PSAnYmlnaW50JyA/IHVuZGVmaW5lZCA6IHJpZ2h0LnRpbWVyQnJhbmQ7XG4gIHJldHVybiBhZ3JlZWRUaW1lckJyYW5kKGxlZnRCcmFuZCwgcmlnaHRCcmFuZCk7XG59O1xuXG4vKipcbiAqIGBhYnNMaWtlYCBpcyBpbnRlcm5hbCB0byB0aGlzIG1vZHVsZSwgYW5kIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBiaW5hcnlcbiAqIG9wZXJhdG9ycyBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgcmV0dXJuZWQgdGltZSBzaG91bGQgYmUgYSBgVGltZXN0YW1wYFxuICogcmF0aGVyIHRoYW4gYSBgUmVsYXRpdmVUaW1lYC5cbiAqXG4gKiBAcGFyYW0ge1RpbWVzdGFtcCB8IFJlbGF0aXZlVGltZX0gbGVmdFxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IHJpZ2h0XG4gKiBAcGFyYW0ge1RpbWVzdGFtcFZhbHVlfSBhYnNWYWx1ZVxuICogQHJldHVybnMge1RpbWVzdGFtcH1cbiAqL1xuY29uc3QgYWJzTGlrZSA9IChsZWZ0LCByaWdodCwgYWJzVmFsdWUpID0+IHtcbiAgTmF0KGFic1ZhbHVlKTtcbiAgY29uc3QgdGltZXJCcmFuZCA9IHNoYXJlZFRpbWVyQnJhbmQobGVmdCwgcmlnaHQpO1xuICBpZiAodGltZXJCcmFuZCkge1xuICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgdGltZXJCcmFuZCxcbiAgICAgIGFic1ZhbHVlLFxuICAgIH0pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBhYnNWYWx1ZTtcbiAgfVxufTtcblxuLyoqXG4gKiBgcmVsTGlrZWAgaXMgaW50ZXJuYWwgdG8gdGhpcyBtb2R1bGUsIGFuZCB1c2VkIHRvIGltcGxlbWVudCB0aGUgYmluYXJ5XG4gKiBvcGVyYXRvcnMgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHJldHVybmVkIHRpbWUgc2hvdWxkIGJlIGEgYFJlbGF0aXZlVGltZWBcbiAqIHJhdGhlciB0aGFuIGEgYFRpbWVzdGFtcGAuXG4gKlxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IGxlZnRcbiAqIEBwYXJhbSB7VGltZXN0YW1wIHwgUmVsYXRpdmVUaW1lfSByaWdodFxuICogQHBhcmFtIHtSZWxhdGl2ZVRpbWVWYWx1ZX0gcmVsVmFsdWVcbiAqIEByZXR1cm5zIHtSZWxhdGl2ZVRpbWV9XG4gKi9cbmNvbnN0IHJlbExpa2UgPSAobGVmdCwgcmlnaHQsIHJlbFZhbHVlKSA9PiB7XG4gIE5hdChyZWxWYWx1ZSk7XG4gIGNvbnN0IHRpbWVyQnJhbmQgPSBzaGFyZWRUaW1lckJyYW5kKGxlZnQsIHJpZ2h0KTtcbiAgaWYgKHRpbWVyQnJhbmQpIHtcbiAgICByZXR1cm4gaGFyZGVuKHtcbiAgICAgIHRpbWVyQnJhbmQsXG4gICAgICByZWxWYWx1ZSxcbiAgICB9KTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcmVsVmFsdWU7XG4gIH1cbn07XG5cbi8qIEZvciBhbGwgdGhlIGZvbGxvd2luZyB0aW1lIG9wZXJhdG9ycywgdGhlaXIgZG9jdW1lbnRhdGlvbiBpcyBpbiovXG4vKiB0aGUgYFRpbWVNYXRoVHlwZWAsIHNpbmNlIHRoYXQgaXMgdGhlIGRvY3VtZW50YXRpb24gdGhhdCBzaG93cyB1cCovXG4vKiBpbiB0aGUgSURFLiBXZWxsLCBhdCBsZWFzdCB0aGUgdnNjb2RlIElERS4qL1xuXG5jb25zdCBhYnNWYWx1ZSA9IGFicyA9PiB7XG4gIGlmICh0eXBlb2YgYWJzID09PSAnYmlnaW50Jykge1xuICAgIHJldHVybiBOYXQoYWJzKTtcbiAgfVxuICBtdXN0TWF0Y2goYWJzLCBUaW1lc3RhbXBSZWNvcmRTaGFwZSwgJ3RpbWVzdGFtcCcpO1xuICByZXR1cm4gTmF0KGFicy5hYnNWYWx1ZSk7XG59O1xuXG5jb25zdCByZWxWYWx1ZSA9IHJlbCA9PiB7XG4gIGlmICh0eXBlb2YgcmVsID09PSAnYmlnaW50Jykge1xuICAgIHJldHVybiBOYXQocmVsKTtcbiAgfVxuICBtdXN0TWF0Y2gocmVsLCBSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSwgJ3JlbGF0aXZlJyk7XG4gIHJldHVybiBOYXQocmVsLnJlbFZhbHVlKTtcbn07XG5cbmNvbnN0IG1ha2VUaW1lc3RhbXBSZWNvcmQgPSAoYWJzLCB0aW1lckJyYW5kKSA9PlxuICBoYXJkZW4oeyBhYnNWYWx1ZTogYWJzLCB0aW1lckJyYW5kIH0pO1xuY29uc3QgbWFrZVJlbGF0aXZlVGltZVJlY29yZCA9IChyZWwsIHRpbWVyQnJhbmQpID0+XG4gIGhhcmRlbih7IHJlbFZhbHVlOiByZWwsIHRpbWVyQnJhbmQgfSk7XG5cbmNvbnN0IGNvZXJjZVRpbWVzdGFtcFJlY29yZCA9ICh0cywgYnJhbmQpID0+IHtcbiAgYnJhbmQgfHwgRmFpbGBtdXN0IGhhdmUgYSBicmFuZGA7XG4gIGlmICh0eXBlb2YgdHMgPT09ICdudW1iZXInKSB7XG4gICAgdHMgPSBOYXQodHMpO1xuICB9XG4gIGlmICh0eXBlb2YgdHMgPT09ICdiaWdpbnQnKSB7XG4gICAgcmV0dXJuIG1ha2VUaW1lc3RhbXBSZWNvcmQodHMsIGJyYW5kKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB7IHRpbWVyQnJhbmQgfSA9IHRzO1xuICAgIG11c3RNYXRjaCh0cywgVGltZXN0YW1wUmVjb3JkU2hhcGUsICd0aW1lc3RhbXAnKTtcbiAgICBhZ3JlZWRUaW1lckJyYW5kKHRpbWVyQnJhbmQsIGJyYW5kKTtcbiAgICByZXR1cm4gdHM7XG4gIH1cbn07XG5cbmNvbnN0IGNvZXJjZVJlbGF0aXZlVGltZVJlY29yZCA9IChydCwgYnJhbmQpID0+IHtcbiAgYnJhbmQgfHwgRmFpbGBtdXN0IGhhdmUgYSBicmFuZGA7XG4gIGlmICh0eXBlb2YgcnQgPT09ICdudW1iZXInKSB7XG4gICAgcnQgPSBOYXQocnQpO1xuICB9XG4gIGlmICh0eXBlb2YgcnQgPT09ICdiaWdpbnQnKSB7XG4gICAgcmV0dXJuIG1ha2VSZWxhdGl2ZVRpbWVSZWNvcmQocnQsIGJyYW5kKTtcbiAgfSBlbHNlIHtcbiAgICBjb25zdCB7IHRpbWVyQnJhbmQgfSA9IHJ0O1xuICAgIG11c3RNYXRjaChydCwgUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUsICdyZWxhdGl2ZVRpbWUnKTtcbiAgICBhZ3JlZWRUaW1lckJyYW5kKHRpbWVyQnJhbmQsIGJyYW5kKTtcbiAgICByZXR1cm4gcnQ7XG4gIH1cbn07XG5cbmNvbnN0IGFkZEFic1JlbCA9IChhYnMsIHJlbCkgPT5cbiAgYWJzTGlrZShhYnMsIHJlbCwgYWJzVmFsdWUoYWJzKSArIHJlbFZhbHVlKHJlbCkpO1xuXG5jb25zdCBhZGRSZWxSZWwgPSAocmVsMSwgcmVsMikgPT5cbiAgcmVsTGlrZShyZWwxLCByZWwyLCByZWxWYWx1ZShyZWwxKSArIHJlbFZhbHVlKHJlbDIpKTtcblxuY29uc3Qgc3VidHJhY3RBYnNBYnMgPSAoYWJzMSwgYWJzMikgPT5cbiAgcmVsTGlrZShhYnMxLCBhYnMyLCBhYnNWYWx1ZShhYnMxKSAtIGFic1ZhbHVlKGFiczIpKTtcblxuY29uc3QgY2xhbXBlZFN1YnRyYWN0QWJzQWJzID0gKGFiczEsIGFiczIpID0+IHtcbiAgY29uc3QgdmFsMSA9IGFic1ZhbHVlKGFiczEpO1xuICBjb25zdCB2YWwyID0gYWJzVmFsdWUoYWJzMik7XG4gIHJldHVybiByZWxMaWtlKGFiczEsIGFiczIsIHZhbDEgPiB2YWwyID8gdmFsMSAtIHZhbDIgOiAwbik7XG59O1xuXG5jb25zdCBzdWJ0cmFjdEFic1JlbCA9IChhYnMsIHJlbCkgPT5cbiAgYWJzTGlrZShhYnMsIHJlbCwgYWJzVmFsdWUoYWJzKSAtIHJlbFZhbHVlKHJlbCkpO1xuXG5jb25zdCBzdWJ0cmFjdFJlbFJlbCA9IChyZWwxLCByZWwyKSA9PlxuICByZWxMaWtlKHJlbDEsIHJlbDIsIHJlbFZhbHVlKHJlbDEpIC0gcmVsVmFsdWUocmVsMikpO1xuXG5jb25zdCBpc1JlbFplcm8gPSByZWwgPT4gcmVsVmFsdWUocmVsKSA9PT0gMG47XG5cbmNvbnN0IG11bHRpcGx5UmVsTmF0ID0gKHJlbCwgbmF0KSA9PiByZWxMaWtlKHJlbCwgbmF0LCByZWxWYWx1ZShyZWwpICogbmF0KTtcblxuY29uc3QgZGl2aWRlUmVsTmF0ID0gKHJlbCwgbmF0KSA9PiByZWxMaWtlKHJlbCwgbmF0LCByZWxWYWx1ZShyZWwpIC8gbmF0KTtcblxuY29uc3QgZGl2aWRlUmVsUmVsID0gKHJlbDEsIHJlbDIpID0+IHtcbiAgc2hhcmVkVGltZXJCcmFuZChyZWwxLCByZWwyKTsgLyoganVzdCBlcnJvciBjaGVjayovXG4gIHJldHVybiByZWxWYWx1ZShyZWwxKSAvIHJlbFZhbHVlKHJlbDIpO1xufTtcblxuY29uc3QgbW9kQWJzUmVsID0gKGFicywgc3RlcCkgPT5cbiAgcmVsTGlrZShhYnMsIHN0ZXAsIGFic1ZhbHVlKGFicykgJSByZWxWYWx1ZShzdGVwKSk7XG5cbmNvbnN0IG1vZFJlbFJlbCA9IChyZWwsIHN0ZXApID0+XG4gIHJlbExpa2UocmVsLCBzdGVwLCByZWxWYWx1ZShyZWwpICUgcmVsVmFsdWUoc3RlcCkpO1xuXG4vKipcbiAqIGBjb21wYXJlVmFsdWVzYCBpcyBpbnRlcm5hbCB0byB0aGlzIG1vZHVsZSwgYW5kIHVzZWQgdG8gaW1wbGVtZW50XG4gKiB0aGUgdGltZSBjb21wYXJpc29uIG9wZXJhdG9ycy5cbiAqXG4gKiBAcGFyYW0ge1RpbWVzdGFtcCB8IFJlbGF0aXZlVGltZX0gbGVmdFxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IHJpZ2h0XG4gKiBAcGFyYW0ge2JpZ2ludH0gdjFcbiAqIEBwYXJhbSB7YmlnaW50fSB2MlxuICogQHJldHVybnMge1JhbmtDb21wYXJpc29ufVxuICovXG5jb25zdCBjb21wYXJlVmFsdWVzID0gKGxlZnQsIHJpZ2h0LCB2MSwgdjIpID0+IHtcbiAgc2hhcmVkVGltZXJCcmFuZChsZWZ0LCByaWdodCk7XG4gIGlmICh2MSA8IHYyKSB7XG4gICAgcmV0dXJuIC0xO1xuICB9IGVsc2UgaWYgKHYxID09PSB2Mikge1xuICAgIHJldHVybiAwO1xuICB9IGVsc2Uge1xuICAgIGFzc2VydCh2MSA+IHYyKTtcbiAgICByZXR1cm4gMTtcbiAgfVxufTtcblxuLyoqXG4gKiBUaGUgYFRpbWVNYXRoYCBvYmplY3QgcHJvdmlkZXMgaGVscGVyIG1ldGhvZHMgdG8gZG8gYXJpdGhtZXRpYyBvbiBsYWJlbGVkXG4gKiB0aW1lIHZhbHVlcywgbXVjaCBsaWtlIGBBbW91bnRNYXRoYCBwcm92aWRlcyBoZWxwZXIgbWV0aG9kcyB0byBkbyBhcml0aG1ldGljXG4gKiBvbiBsYWJlbGVkIGFzc2V0L21vbmV5IHZhbHVlcy4gQm90aCBjaGVjayBmb3IgY29uc2lzdGVuY3kgb2YgbGFiZWxzOiBhXG4gKiBiaW5hcnkgb3BlcmF0aW9uIG9uIHR3byBsYWJlbGVkIG9iamVjdHMgZW5zdXJlcyB0aGF0IHRoZSBib3RoIGNhcnJ5XG4gKiB0aGUgc2FtZSBsYWJlbC4gSWYgdGhleSBwcm9kdWNlIGFub3RoZXIgb2JqZWN0IGZyb20gdGhlIHNhbWUgZG9tYWluLCBpdFxuICogd2lsbCBjYXJyeSB0aGUgc2FtZSBsYWJlbC4gSWYgdGhlIG9wZXJhbmRzIGhhdmUgaW5jb21wYXRpYmxlIGxhYmVscyxcbiAqIGFuIGVycm9yIGlzIHRocm93bi5cbiAqXG4gKiBVbmxpa2UgYW1vdW50IGFyaXRobWV0aWMsIHRpbWUgYXJpdGhtZXRpYyBkZWFscyBpbiB0d28ga2luZHMgb2YgdGltZSBvYmplY3RzOlxuICogVGltZXN0YW1wcywgd2hpY2ggcmVwcmVzZW50IGFic29sdXRlIHRpbWUsIGFuZCBSZWxhdGl2ZVRpbWUsIHdoaWNoIHJlcHJlc2VudHNcbiAqIHRoZSBkdXJhdGlvbiBiZXR3ZWVuIHR3byBhYnNvbHV0ZSB0aW1lcy4gQm90aCBraW5kcyBvZiB0aW1lIG9iamVjdFxuICogYXJlIGxhYmVsZWQgYnkgYSBgVGltZXJCcmFuZGAuIEZvciBhIFRpbWVzdGFtcCBvYmplY3QsIHRoZSB2YWx1ZSBpc1xuICogYSBiaWdpbnQgaW4gYW4gYGFic1ZhbHVlYCBwcm9wZXJ0eS4gRm9yIGEgUmVsYXRpdmVUaW1lIG9iamVjdCwgdGhlIHZhbHVlXG4gKiBpcyBhIGJpZ2ludCBpbiBhIGByZWxWYWx1ZWAgcHJvcGVydHkuIFRodXMgd2UgaGF2ZSBhIHJ1bnRpbWUgc2FmZXR5IGNoZWNrXG4gKiB0byBlbnN1cmUgdGhhdCB3ZSBkb24ndCBjb25mdXNlZCB0aGUgdHdvLCBldmVuIGlmIHdlIGhhdmUgbWFuYWdlZCB0byBmb29sXG4gKiB0aGUgKHVuc291bmQpIHN0YXRpYyB0eXBlIHN5c3RlbS5cbiAqXG4gKiBBcyBhIHRyYW5zaXRpb25hbCBtZWFzdXJlLCBjdXJyZW50bHkgbWFueSBUaW1lc3RhbXBzIGFuZCBSZWxhdGl2ZVRpbWVzIGFyZVxuICogc3RpbGwgcmVwcmVzZW50ZWQgYnkgdW5sYWJlbGVkIGJpZ2ludHMuIER1cmluZyB0aGlzIHRyYW5zaXRpb25hbCBwZXJpb2QsXG4gKiB3ZSBhbGxvdyB0aGlzLCBib3RoIHN0YXRpY2FsbHkgYW5kIGR5bmFtaWNhbGx5LiBGb3IgYSBub3JtYWwgYmluYXJ5XG4gKiBvcGVyYXRpb24sIGlmIGJvdGggaW5wdXRzIGFyZSBsYWJlbGVkLCB0aGVuIHdlIGRvIHRoZSBmdWxsIGNoZWNraW5nIGFzXG4gKiBleHBsYWluZWQgYWJvdmUgYW5kIHJldHVybiBhIGxhYmVsZWQgcmVzdWx0LiBJZiBib3RoIGlucHV0cyBhcmUgdW5sYWJlbGVkXG4gKiBiaWdpbnRzLCB3ZSAqYXNzdW1lKiB0aGF0IHRoZXkgaW5kaWNhdGUgYSB0aW1lIG9mIHRoZSByaWdodCBraW5kXG4gKiAoVGltZXN0YW1wIHZzIFJlbGF0aXZlVGltZSkgYW5kIHRpbWVyIGJyYW5kLiBTaW5jZSB3ZSBkb24ndCBrbm93IHdoYXRcbiAqIGJyYW5kIHdhcyBpbnRlbmRlZCwgd2UgY2FuIG9ubHkgcmV0dXJuIHlldCBhbm90aGVyIHVubGFiZWxlZCBiaWdpbnQuXG4gKlxuICogSWYgb25lIG9wZXJhbmQgaXMgbGFiZWxlZCBhbmQgdGhlIG90aGVyIGlzIG5vdCwgd2UgY2hlY2sgdGhlIGxhYmVsZWQgb3BlcmFuZCxcbiAqICphc3N1bWUqIHRoZSB1bmxhYmVsZWQgYmlnaW50IHJlcHJlc2VudHMgdGhlIHZhbHVlIG5lZWRlZCBmb3IgdGhlIG90aGVyXG4gKiBvcGVyYW5kLCBhbmQgcmV0dXJuIGEgbGFiZWxlZCB0aW1lIG9iamVjdCB3aXRoIHRoZSBicmFuZCBvZiB0aGUgbGFiZWxlZFxuICogb3BlcmFuZC5cbiAqXG4gKiBAdHlwZSB7VGltZU1hdGhUeXBlfVxuICovXG4gICAgICAgY29uc3QgVGltZU1hdGggPSBoYXJkZW4oe1xuICBhYnNWYWx1ZSxcbiAgcmVsVmFsdWUsXG4gIGNvZXJjZVRpbWVzdGFtcFJlY29yZCxcbiAgY29lcmNlUmVsYXRpdmVUaW1lUmVjb3JkLFxuICAvKiBAdHMtZXhwZWN0LWVycm9yIHh4eCBkeW5hbWljIHR5cGluZyovXG4gIGFkZEFic1JlbCxcbiAgLyogQHRzLWV4cGVjdC1lcnJvciB4eHggZHluYW1pYyB0eXBpbmcqL1xuICBhZGRSZWxSZWwsXG4gIHN1YnRyYWN0QWJzQWJzLFxuICBjbGFtcGVkU3VidHJhY3RBYnNBYnMsXG4gIHN1YnRyYWN0QWJzUmVsLFxuICBzdWJ0cmFjdFJlbFJlbCxcbiAgaXNSZWxaZXJvLFxuICBtdWx0aXBseVJlbE5hdCxcbiAgZGl2aWRlUmVsTmF0LFxuICBkaXZpZGVSZWxSZWwsXG4gIG1vZEFic1JlbCxcbiAgbW9kUmVsUmVsLFxuICBjb21wYXJlQWJzOiAoYWJzMSwgYWJzMikgPT5cbiAgICBjb21wYXJlVmFsdWVzKGFiczEsIGFiczIsIGFic1ZhbHVlKGFiczEpLCBhYnNWYWx1ZShhYnMyKSksXG4gIGNvbXBhcmVSZWw6IChyZWwxLCByZWwyKSA9PlxuICAgIGNvbXBhcmVWYWx1ZXMocmVsMSwgcmVsMiwgcmVsVmFsdWUocmVsMSksIHJlbFZhbHVlKHJlbDIpKSxcbn0pOyRozY9fb25jZS5UaW1lTWF0aChUaW1lTWF0aCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJUaW1lTWF0aCI6WyJUaW1lTWF0aCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA09hXE8wkAAPMJAAAlAAAAQGFnb3JpYy90aW1lLXYwLjMuMi9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXR0ZXJucyJdLCJleHBvcnRzIjpbIlJlbGF0aXZlVGltZVJlY29yZFNoYXBlIiwiUmVsYXRpdmVUaW1lU2hhcGUiLCJSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlIiwiVGltZXJCcmFuZFNoYXBlIiwiVGltZXJTZXJ2aWNlU2hhcGUiLCJUaW1lc3RhbXBSZWNvcmRTaGFwZSIsIlRpbWVzdGFtcFNoYXBlIiwiVGltZXN0YW1wVmFsdWVTaGFwZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IE07JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXV0pO1xuXG4vKipcbiAqIEBpbXBvcnQge1R5cGVkUGF0dGVybn0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbCc7XG4gKiBAaW1wb3J0IHtUaW1lc3RhbXBSZWNvcmQsIFRpbWVzdGFtcFZhbHVlLCBSZWxhdGl2ZVRpbWVWYWx1ZSwgUmVsYXRpdmVUaW1lUmVjb3JkfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqL1xuXG4gICAgICAgY29uc3QgVGltZXJCcmFuZFNoYXBlID0gTS5yZW1vdGFibGUoJ1RpbWVyQnJhbmQnKTtcblxuLyoqIEB0eXBlIHtUeXBlZFBhdHRlcm48YmlnaW50Pn0gKi8kaM2PX29uY2UuVGltZXJCcmFuZFNoYXBlKFRpbWVyQnJhbmRTaGFwZSk7XG4gICAgICAgY29uc3QgVGltZXN0YW1wVmFsdWVTaGFwZSA9IE0ubmF0KCk7XG5cbi8qKiBAdHlwZSB7VHlwZWRQYXR0ZXJuPGJpZ2ludD59ICovJGjNj19vbmNlLlRpbWVzdGFtcFZhbHVlU2hhcGUoVGltZXN0YW1wVmFsdWVTaGFwZSk7XG4gICAgICAgY29uc3QgUmVsYXRpdmVUaW1lVmFsdWVTaGFwZSA9IE0ubmF0KCk7IC8qIFNob3VsZCB3ZSBhbGxvdyBuZWdhdGl2ZXM/Ki9cblxuLyoqIEB0eXBlIHtUeXBlZFBhdHRlcm48VGltZXN0YW1wUmVjb3JkPn0gKi8kaM2PX29uY2UuUmVsYXRpdmVUaW1lVmFsdWVTaGFwZShSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlKTtcbiAgICAgICBjb25zdCBUaW1lc3RhbXBSZWNvcmRTaGFwZSA9IHtcbiAgdGltZXJCcmFuZDogVGltZXJCcmFuZFNoYXBlLFxuICBhYnNWYWx1ZTogVGltZXN0YW1wVmFsdWVTaGFwZSxcbn07JGjNj19vbmNlLlRpbWVzdGFtcFJlY29yZFNoYXBlKFRpbWVzdGFtcFJlY29yZFNoYXBlKTtcbmhhcmRlbihUaW1lc3RhbXBSZWNvcmRTaGFwZSk7XG5cbi8qKiBAdHlwZSB7VHlwZWRQYXR0ZXJuPFJlbGF0aXZlVGltZVJlY29yZD59ICovXG4gICAgICAgY29uc3QgUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUgPSB7XG4gIHRpbWVyQnJhbmQ6IFRpbWVyQnJhbmRTaGFwZSxcbiAgcmVsVmFsdWU6IFJlbGF0aXZlVGltZVZhbHVlU2hhcGUsXG59OyRozY9fb25jZS5SZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZShSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSk7XG5oYXJkZW4oUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUpO1xuXG4vKiogQHR5cGUge1R5cGVkUGF0dGVybjxUaW1lc3RhbXBSZWNvcmQgfCBUaW1lc3RhbXBWYWx1ZT59ICovXG4gICAgICAgY29uc3QgVGltZXN0YW1wU2hhcGUgPSBNLm9yKFRpbWVzdGFtcFJlY29yZFNoYXBlLCBUaW1lc3RhbXBWYWx1ZVNoYXBlKTtcblxuLyoqIEB0eXBlIHtUeXBlZFBhdHRlcm48UmVsYXRpdmVUaW1lUmVjb3JkIHwgUmVsYXRpdmVUaW1lVmFsdWU+fSAqLyRozY9fb25jZS5UaW1lc3RhbXBTaGFwZShUaW1lc3RhbXBTaGFwZSk7XG4gICAgICAgY29uc3QgUmVsYXRpdmVUaW1lU2hhcGUgPSBNLm9yKFxuICBSZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSxcbiAgUmVsYXRpdmVUaW1lVmFsdWVTaGFwZSxcbik7JGjNj19vbmNlLlJlbGF0aXZlVGltZVNoYXBlKFJlbGF0aXZlVGltZVNoYXBlKTtcblxuICAgICAgIGNvbnN0IFRpbWVyU2VydmljZVNoYXBlID0gTS5yZW1vdGFibGUoJ1RpbWVyU2VydmljZScpOyRozY9fb25jZS5UaW1lclNlcnZpY2VTaGFwZShUaW1lclNlcnZpY2VTaGFwZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJUaW1lckJyYW5kU2hhcGUiOlsiVGltZXJCcmFuZFNoYXBlIl0sIlRpbWVzdGFtcFZhbHVlU2hhcGUiOlsiVGltZXN0YW1wVmFsdWVTaGFwZSJdLCJSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlIjpbIlJlbGF0aXZlVGltZVZhbHVlU2hhcGUiXSwiVGltZXN0YW1wUmVjb3JkU2hhcGUiOlsiVGltZXN0YW1wUmVjb3JkU2hhcGUiXSwiUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUiOlsiUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUiXSwiVGltZXN0YW1wU2hhcGUiOlsiVGltZXN0YW1wU2hhcGUiXSwiUmVsYXRpdmVUaW1lU2hhcGUiOlsiUmVsYXRpdmVUaW1lU2hhcGUiXSwiVGltZXJTZXJ2aWNlU2hhcGUiOlsiVGltZXJTZXJ2aWNlU2hhcGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARcz/8VgBAABYAQAAJgAAAEBhZ29yaWMvdGltZS12MC4zLjIvc3JjL3R5cGVzLWluZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADYPWJQtLAAALSwAACgAAABAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMi9zcmMvZXhvLXV0aWxzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiLCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIl0sImV4cG9ydHMiOlsiZGVmaW5lRHVyYWJsZUV4b0NsYXNzIiwiZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0IiwiZGVmaW5lVmlydHVhbEV4b0NsYXNzIiwiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0IiwiaWdub3JlQ29udGV4dCIsIm1ha2VFeG9VdGlscyIsInByZXBhcmVFeG8iLCJwcmVwYXJlRXhvQ2xhc3MiLCJwcmVwYXJlRXhvQ2xhc3NLaXQiLCJwcmVwYXJlS2luZCIsInByZXBhcmVLaW5kTXVsdGkiLCJwcmVwYXJlU2luZ2xldG9uIiwicHJvdmlkZUtpbmRIYW5kbGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBpbml0RW1wdHkscHJvdmlkZSxnbG9iYWxWYXREYXRhOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiaW5pdEVtcHR5XCIsWyRozY9fYSA9PiAoaW5pdEVtcHR5ID0gJGjNj19hKV1dXV0sW1wiLi92YXQtZGF0YS1iaW5kaW5ncy5qc1wiLCBbW1wicHJvdmlkZVwiLFskaM2PX2EgPT4gKHByb3ZpZGUgPSAkaM2PX2EpXV0sW1wiVmF0RGF0YVwiLFskaM2PX2EgPT4gKGdsb2JhbFZhdERhdGEgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7SW50ZXJmYWNlR3VhcmR9IGZyb20gJ0BlbmRvL3BhdHRlcm5zJztcbiAqIEBpbXBvcnQge1JlbW90YWJsZU9iamVjdH0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSc7XG4gKiBAaW1wb3J0IHtCYWdnYWdlLCBEZWZpbmVLaW5kT3B0aW9ucywgRHVyYWJsZUtpbmRIYW5kbGUsIEludGVyZmFjZUd1YXJkS2l0fSBmcm9tICdAYWdvcmljL3N3aW5nc2V0LWxpdmVzbG90cyc7XG4gKiBAaW1wb3J0IHtQbHVzQ29udGV4dH0gZnJvbSAnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnO1xuICogQGltcG9ydCB7VmF0RGF0YX0gZnJvbSAnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnO1xuICogQGltcG9ydCB7UHJlcGFyZUtpbmR9IGZyb20gJ0BhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzJztcbiAqIEBpbXBvcnQge1ByZXBhcmVLaW5kTXVsdGl9IGZyb20gJ0BhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzJztcbiAqIEBpbXBvcnQge0d1YXJkZWR9IGZyb20gJ0BlbmRvL2V4byc7XG4gKiBAaW1wb3J0IHtHdWFyZGVkS2l0fSBmcm9tICdAZW5kby9leG8nO1xuICovXG5cbi8qIFNvbWUgZmVlZGJhY2sgaWYgdGhlIGluaXQgZnVuY3Rpb24gaXMgYXN5bmMqL1xuLyoqXG4gKiBAdHlwZWRlZiB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IEluaXRTdGF0ZVxuICovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7SW5pdFN0YXRlfSBJXG4gKiBAdHlwZWRlZiB7UmV0dXJuVHlwZTxJPiBleHRlbmRzIFByb21pc2U8YW55PiA/IG5ldmVyIDogUmV0dXJuVHlwZTxJPn0gU3RhdGVSZXN1bHRcbiAqL1xuXG4vKipcbiAqIE1ha2UgYSB2ZXJzaW9uIG9mIHRoZSBhcmd1bWVudCBmdW5jdGlvbiB0aGF0IHRha2VzIGEga2luZCBjb250ZXh0IGJ1dCBpZ25vcmVzXG4gKiBpdC5cbiAqXG4gKiBAdHlwZSB7PFQgZXh0ZW5kcyAoLi4uYXJnczogYW55KSA9PiBhbnk+KFxuICogICBmbjogVCxcbiAqICkgPT4gUGx1c0NvbnRleHQ8bmV2ZXIsIFQ+fVxuICovXG4gICAgICAgY29uc3QgaWdub3JlQ29udGV4dCA9XG4gIGZuID0+XG4gIChfY29udGV4dCwgLi4uYXJncykgPT5cbiAgICBmbiguLi5hcmdzKTskaM2PX29uY2UuaWdub3JlQ29udGV4dChpZ25vcmVDb250ZXh0KTtcbmhhcmRlbihpZ25vcmVDb250ZXh0KTtcblxuLyogVE9ETzogRmluZCBhIGdvb2QgaG9tZSBmb3IgdGhpcyBmdW5jdGlvbiB1c2VkIGJ5IEBhZ29yaWMvdmF0LWRhdGEgYW5kIHRlc3RpbmcgY29kZSovXG4vKiogQHBhcmFtIHtWYXREYXRhfSBWYXREYXRhICovXG4gICAgICAgY29uc3QgbWFrZUV4b1V0aWxzID0gVmF0RGF0YSA9PiB7XG4gIGNvbnN0IHtcbiAgICBkZWZpbmVLaW5kLFxuICAgIGRlZmluZUtpbmRNdWx0aSxcbiAgICBkZWZpbmVEdXJhYmxlS2luZCxcbiAgICBkZWZpbmVEdXJhYmxlS2luZE11bHRpLFxuICAgIG1ha2VLaW5kSGFuZGxlLFxuICB9ID0gVmF0RGF0YTtcblxuICAvKipcbiAqIEBkZXByZWNhdGVkIFVzZSBFeG9zL0V4b0NsYXNzZXMgaW5zdGVhZCBvZiBLaW5kc1xuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2luZE5hbWVcbiAqIEByZXR1cm5zIHtEdXJhYmxlS2luZEhhbmRsZX1cbiAqL1xuICBjb25zdCBwcm92aWRlS2luZEhhbmRsZSA9IChiYWdnYWdlLCBraW5kTmFtZSkgPT5cbiAgICBwcm92aWRlKGJhZ2dhZ2UsIGAke2tpbmROYW1lfV9raW5kSGFuZGxlYCwgKCkgPT4gbWFrZUtpbmRIYW5kbGUoa2luZE5hbWUpKTtcbiAgaGFyZGVuKHByb3ZpZGVLaW5kSGFuZGxlKTtcblxuICAvKipcbiAqIEBkZXByZWNhdGVkIFVzZSBwcmVwYXJlRXhvQ2xhc3MgaW5zdGVhZFxuICogQHR5cGUge1ByZXBhcmVLaW5kfVxuICovXG4gIGNvbnN0IHByZXBhcmVLaW5kID0gKFxuICAgIGJhZ2dhZ2UsXG4gICAga2luZE5hbWUsXG4gICAgaW5pdCxcbiAgICBiZWhhdmlvcixcbiAgICBvcHRpb25zID0gdW5kZWZpbmVkLFxuICApID0+XG4gICAgZGVmaW5lRHVyYWJsZUtpbmQoXG4gICAgICBwcm92aWRlS2luZEhhbmRsZShiYWdnYWdlLCBraW5kTmFtZSksXG4gICAgICBpbml0LFxuICAgICAgYmVoYXZpb3IsXG4gICAgICBvcHRpb25zLFxuICAgICk7XG4gIGhhcmRlbihwcmVwYXJlS2luZCk7XG5cbiAgLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgcHJlcGFyZUV4b0NsYXNzS2l0IGluc3RlYWRcbiAqIEB0eXBlIHtQcmVwYXJlS2luZE11bHRpfVxuICovXG4gIGNvbnN0IHByZXBhcmVLaW5kTXVsdGkgPSAoXG4gICAgYmFnZ2FnZSxcbiAgICBraW5kTmFtZSxcbiAgICBpbml0LFxuICAgIGJlaGF2aW9yLFxuICAgIG9wdGlvbnMgPSB1bmRlZmluZWQsXG4gICkgPT5cbiAgICBkZWZpbmVEdXJhYmxlS2luZE11bHRpKFxuICAgICAgcHJvdmlkZUtpbmRIYW5kbGUoYmFnZ2FnZSwga2luZE5hbWUpLFxuICAgICAgaW5pdCxcbiAgICAgIGJlaGF2aW9yLFxuICAgICAgb3B0aW9ucyxcbiAgICApO1xuICBoYXJkZW4ocHJlcGFyZUtpbmRNdWx0aSk7XG5cbiAgLyoqXG4gKiBAdGVtcGxhdGUge0luaXRTdGF0ZX0gSSBpbml0IHN0YXRlIGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUgVCBiZWhhdmlvclxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZCB8IHVuZGVmaW5lZH0gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICZcbiAqICAgVGhpc1R5cGU8e1xuICogICAgIHNlbGY6IFQ7XG4gKiAgICAgc3RhdGU6IFN0YXRlUmVzdWx0PEk+O1xuICogICB9Pn0gbWV0aG9kc1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7XG4gKiAgIHNlbGY6IFQ7XG4gKiAgIHN0YXRlOiBTdGF0ZVJlc3VsdDxJPjtcbiAqIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gR3VhcmRlZDxUPn1cbiAqL1xuICBjb25zdCBkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MgPSAodGFnLCBpbnRlcmZhY2VHdWFyZCwgaW5pdCwgbWV0aG9kcywgb3B0aW9ucykgPT5cbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuICAgIGRlZmluZUtpbmQodGFnLCBpbml0LCBtZXRob2RzLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgdGhpc2Z1bE1ldGhvZHM6IHRydWUsXG4gICAgICBpbnRlcmZhY2VHdWFyZCxcbiAgICB9KTtcbiAgaGFyZGVuKGRlZmluZVZpcnR1YWxFeG9DbGFzcyk7XG5cbiAgLyoqXG4gKiBAdGVtcGxhdGUge0luaXRTdGF0ZX0gSSBpbml0IHN0YXRlIGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIFJlY29yZDxQcm9wZXJ0eUtleSwgQ2FsbGFibGVGdW5jdGlvbj4+fSBUIGZhY2V0c1xuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZEtpdCB8IHVuZGVmaW5lZH0gaW50ZXJmYWNlR3VhcmRLaXRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICZcbiAqICAgVGhpc1R5cGU8e1xuICogICAgIGZhY2V0czogR3VhcmRlZEtpdDxUPjtcbiAqICAgICBzdGF0ZTogU3RhdGVSZXN1bHQ8ST47XG4gKiAgIH0+fSBmYWNldHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8e1xuICogICBmYWNldHM6IFQ7XG4gKiAgIHN0YXRlOiBTdGF0ZVJlc3VsdDxJPjtcbiAqIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gR3VhcmRlZEtpdDxUPn1cbiAqL1xuICBjb25zdCBkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQgPSAoXG4gICAgdGFnLFxuICAgIGludGVyZmFjZUd1YXJkS2l0LFxuICAgIGluaXQsXG4gICAgZmFjZXRzLFxuICAgIG9wdGlvbnMsXG4gICkgPT5cbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuICAgIGRlZmluZUtpbmRNdWx0aSh0YWcsIGluaXQsIGZhY2V0cywge1xuICAgICAgLi4ub3B0aW9ucyxcbiAgICAgIHRoaXNmdWxNZXRob2RzOiB0cnVlLFxuICAgICAgaW50ZXJmYWNlR3VhcmRLaXQsXG4gICAgfSk7XG4gIGhhcmRlbihkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQpO1xuXG4gIC8qKlxuICogQHRlbXBsYXRlIHtJbml0U3RhdGV9IEkgaW5pdCBzdGF0ZSBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtSZWNvcmQ8UHJvcGVydHlLZXksIENhbGxhYmxlRnVuY3Rpb24+fSBUIG1ldGhvZHNcbiAqIEBwYXJhbSB7RHVyYWJsZUtpbmRIYW5kbGV9IGtpbmRIYW5kbGVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmQgfCB1bmRlZmluZWR9IGludGVyZmFjZUd1YXJkXG4gKiBAcGFyYW0ge0l9IGluaXRcbiAqIEBwYXJhbSB7VCAmXG4gKiAgIFRoaXNUeXBlPHtcbiAqICAgICBzZWxmOiBUO1xuICogICAgIHN0YXRlOiBTdGF0ZVJlc3VsdDxJPjtcbiAqICAgfT59IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8e1xuICogICBzZWxmOiBUO1xuICogICBzdGF0ZTogU3RhdGVSZXN1bHQ8ST47XG4gKiB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IEd1YXJkZWQ8VD59XG4gKi9cbiAgY29uc3QgZGVmaW5lRHVyYWJsZUV4b0NsYXNzID0gKFxuICAgIGtpbmRIYW5kbGUsXG4gICAgaW50ZXJmYWNlR3VhcmQsXG4gICAgaW5pdCxcbiAgICBtZXRob2RzLFxuICAgIG9wdGlvbnMsXG4gICkgPT5cbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuICAgIGRlZmluZUR1cmFibGVLaW5kKGtpbmRIYW5kbGUsIGluaXQsIG1ldGhvZHMsIHtcbiAgICAgIC4uLm9wdGlvbnMsXG4gICAgICB0aGlzZnVsTWV0aG9kczogdHJ1ZSxcbiAgICAgIGludGVyZmFjZUd1YXJkLFxuICAgIH0pO1xuICBoYXJkZW4oZGVmaW5lRHVyYWJsZUV4b0NsYXNzKTtcblxuICAvKipcbiAqIEB0ZW1wbGF0ZSB7SW5pdFN0YXRlfSBJIGluaXQgc3RhdGUgZnVuY3Rpb25cbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgUmVjb3JkPFByb3BlcnR5S2V5LCBDYWxsYWJsZUZ1bmN0aW9uPj59IFQgZmFjZXRzXG4gKiBAcGFyYW0ge0R1cmFibGVLaW5kSGFuZGxlfSBraW5kSGFuZGxlXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkS2l0IHwgdW5kZWZpbmVkfSBpbnRlcmZhY2VHdWFyZEtpdFxuICogQHBhcmFtIHtJfSBpbml0XG4gKiBAcGFyYW0ge1QgJlxuICogICBUaGlzVHlwZTx7XG4gKiAgICAgZmFjZXRzOiBHdWFyZGVkS2l0PFQ+O1xuICogICAgIHN0YXRlOiBTdGF0ZVJlc3VsdDxJPjtcbiAqICAgfT59IGZhY2V0c1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7XG4gKiAgIGZhY2V0czogVDtcbiAqICAgc3RhdGU6IFN0YXRlUmVzdWx0PEk+O1xuICogfT59IFtvcHRpb25zXVxuICogQHJldHVybnMgeyguLi5hcmdzOiBQYXJhbWV0ZXJzPEk+KSA9PiBHdWFyZGVkS2l0PFQ+fVxuICovXG4gIGNvbnN0IGRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCA9IChcbiAgICBraW5kSGFuZGxlLFxuICAgIGludGVyZmFjZUd1YXJkS2l0LFxuICAgIGluaXQsXG4gICAgZmFjZXRzLFxuICAgIG9wdGlvbnMsXG4gICkgPT5cbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuICAgIGRlZmluZUR1cmFibGVLaW5kTXVsdGkoa2luZEhhbmRsZSwgaW5pdCwgZmFjZXRzLCB7XG4gICAgICAuLi5vcHRpb25zLFxuICAgICAgdGhpc2Z1bE1ldGhvZHM6IHRydWUsXG4gICAgICBpbnRlcmZhY2VHdWFyZEtpdCxcbiAgICB9KTtcbiAgaGFyZGVuKGRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCk7XG5cbiAgLyoqXG4gKiBAdGVtcGxhdGUge0luaXRTdGF0ZX0gSSBpbml0IHN0YXRlIGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUge1JlY29yZDxQcm9wZXJ0eUtleSwgQ2FsbGFibGVGdW5jdGlvbj59IFQgbWV0aG9kc1xuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2luZE5hbWVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmQgfCB1bmRlZmluZWR9IGludGVyZmFjZUd1YXJkXG4gKiBAcGFyYW0ge0l9IGluaXRcbiAqIEBwYXJhbSB7VCAmXG4gKiAgIFRoaXNUeXBlPHtcbiAqICAgICBzZWxmOiBSZW1vdGFibGVPYmplY3QgJiBUO1xuICogICAgIHN0YXRlOiBTdGF0ZVJlc3VsdDxJPjtcbiAqICAgfT59IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8e1xuICogICBzZWxmOiBUO1xuICogICBzdGF0ZTogU3RhdGVSZXN1bHQ8ST47XG4gKiB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IEd1YXJkZWQ8VD59XG4gKi9cbiAgY29uc3QgcHJlcGFyZUV4b0NsYXNzID0gKFxuICAgIGJhZ2dhZ2UsXG4gICAga2luZE5hbWUsXG4gICAgaW50ZXJmYWNlR3VhcmQsXG4gICAgaW5pdCxcbiAgICBtZXRob2RzLFxuICAgIG9wdGlvbnMgPSB1bmRlZmluZWQsXG4gICkgPT5cbiAgICBkZWZpbmVEdXJhYmxlRXhvQ2xhc3MoXG4gICAgICBwcm92aWRlS2luZEhhbmRsZShiYWdnYWdlLCBraW5kTmFtZSksXG4gICAgICBpbnRlcmZhY2VHdWFyZCxcbiAgICAgIGluaXQsXG4gICAgICBtZXRob2RzLFxuICAgICAgb3B0aW9ucyxcbiAgICApO1xuICBoYXJkZW4ocHJlcGFyZUV4b0NsYXNzKTtcblxuICAvKipcbiAqIEB0ZW1wbGF0ZSB7SW5pdFN0YXRlfSBJIGluaXQgc3RhdGUgZnVuY3Rpb25cbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgUmVjb3JkPFByb3BlcnR5S2V5LCBDYWxsYWJsZUZ1bmN0aW9uPj59IFQgZmFjZXRzXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZEtpdCB8IHVuZGVmaW5lZH0gaW50ZXJmYWNlR3VhcmRLaXRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICZcbiAqICAgVGhpc1R5cGU8e1xuICogICAgIGZhY2V0czogR3VhcmRlZEtpdDxUPjtcbiAqICAgICBzdGF0ZTogU3RhdGVSZXN1bHQ8ST47XG4gKiAgIH0+fSBmYWNldHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8e1xuICogICBmYWNldHM6IFQ7XG4gKiAgIHN0YXRlOiBTdGF0ZVJlc3VsdDxJPjtcbiAqIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gR3VhcmRlZEtpdDxUPn1cbiAqL1xuICBjb25zdCBwcmVwYXJlRXhvQ2xhc3NLaXQgPSAoXG4gICAgYmFnZ2FnZSxcbiAgICBraW5kTmFtZSxcbiAgICBpbnRlcmZhY2VHdWFyZEtpdCxcbiAgICBpbml0LFxuICAgIGZhY2V0cyxcbiAgICBvcHRpb25zID0gdW5kZWZpbmVkLFxuICApID0+XG4gICAgZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0KFxuICAgICAgcHJvdmlkZUtpbmRIYW5kbGUoYmFnZ2FnZSwga2luZE5hbWUpLFxuICAgICAgaW50ZXJmYWNlR3VhcmRLaXQsXG4gICAgICBpbml0LFxuICAgICAgZmFjZXRzLFxuICAgICAgb3B0aW9ucyxcbiAgICApO1xuICBoYXJkZW4ocHJlcGFyZUV4b0NsYXNzS2l0KTtcblxuICAvKipcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPFByb3BlcnR5S2V5LCBDYWxsYWJsZUZ1bmN0aW9uPn0gTSBtZXRob2RzXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZCB8IHVuZGVmaW5lZH0gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7TSAmXG4gKiAgIFRoaXNUeXBlPHtcbiAqICAgICBzZWxmOiBSZW1vdGFibGVPYmplY3QgJiBNO1xuICogICB9Pn0gbWV0aG9kc1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7IHNlbGY6IE0gfT59IFtvcHRpb25zXVxuICogQHJldHVybnMge0d1YXJkZWQ8TT59XG4gKi9cbiAgY29uc3QgcHJlcGFyZUV4byA9IChcbiAgICBiYWdnYWdlLFxuICAgIGtpbmROYW1lLFxuICAgIGludGVyZmFjZUd1YXJkLFxuICAgIG1ldGhvZHMsXG4gICAgb3B0aW9ucyA9IHVuZGVmaW5lZCxcbiAgKSA9PiB7XG4gICAgY29uc3QgbWFrZVNpbmdsZXRvbiA9IHByZXBhcmVFeG9DbGFzcyhcbiAgICAgIGJhZ2dhZ2UsXG4gICAgICBraW5kTmFtZSxcbiAgICAgIGludGVyZmFjZUd1YXJkLFxuICAgICAgaW5pdEVtcHR5LFxuICAgICAgbWV0aG9kcyxcbiAgICAgIG9wdGlvbnMsXG4gICAgKTtcblxuICAgIHJldHVybiBwcm92aWRlKGJhZ2dhZ2UsIGAke2tpbmROYW1lfV9zaW5nbGV0b25gLCAoKSA9PiBtYWtlU2luZ2xldG9uKCkpO1xuICB9O1xuICBoYXJkZW4ocHJlcGFyZUV4byk7XG5cbiAgLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgcHJlcGFyZUV4byBpbnN0ZWFkLlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8UHJvcGVydHlLZXksIENhbGxhYmxlRnVuY3Rpb24+fSBNIG1ldGhvZHNcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IGtpbmROYW1lXG4gKiBAcGFyYW0ge019IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8eyBzZWxmOiBNIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtHdWFyZGVkPE0+fVxuICovXG4gIGNvbnN0IHByZXBhcmVTaW5nbGV0b24gPSAoYmFnZ2FnZSwga2luZE5hbWUsIG1ldGhvZHMsIG9wdGlvbnMgPSB1bmRlZmluZWQpID0+XG4gICAgcHJlcGFyZUV4byhiYWdnYWdlLCBraW5kTmFtZSwgdW5kZWZpbmVkLCBtZXRob2RzLCBvcHRpb25zKTtcbiAgaGFyZGVuKHByZXBhcmVTaW5nbGV0b24pO1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGRlZmluZVZpcnR1YWxFeG9DbGFzcyxcbiAgICBkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQsXG4gICAgZGVmaW5lRHVyYWJsZUV4b0NsYXNzLFxuICAgIGRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCxcbiAgICBwcmVwYXJlRXhvQ2xhc3MsXG4gICAgcHJlcGFyZUV4b0NsYXNzS2l0LFxuICAgIHByZXBhcmVFeG8sXG5cbiAgICBwcmVwYXJlU2luZ2xldG9uLFxuICAgIHByb3ZpZGVLaW5kSGFuZGxlLFxuICAgIHByZXBhcmVLaW5kLFxuICAgIHByZXBhcmVLaW5kTXVsdGksXG4gIH0pO1xufTskaM2PX29uY2UubWFrZUV4b1V0aWxzKG1ha2VFeG9VdGlscyk7XG5cbmNvbnN0IGdsb2JhbEV4b1V0aWxzID0gbWFrZUV4b1V0aWxzKGdsb2JhbFZhdERhdGEpO1xuXG4gICAgICAgY29uc3Qge1xuICBkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MsXG4gIGRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCxcbiAgZGVmaW5lRHVyYWJsZUV4b0NsYXNzLFxuICBkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQsXG4gIHByZXBhcmVFeG9DbGFzcyxcbiAgcHJlcGFyZUV4b0NsYXNzS2l0LFxuICBwcmVwYXJlRXhvLFxuICBwcmVwYXJlU2luZ2xldG9uLFxufSA9IGdsb2JhbEV4b1V0aWxzO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBFeG9zL0V4b0NsYXNzZXMgaW5zdGVhZCBvZiBLaW5kc1xuICovJGjNj19vbmNlLmRlZmluZVZpcnR1YWxFeG9DbGFzcyhkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MpOyRozY9fb25jZS5kZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQoZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0KTskaM2PX29uY2UuZGVmaW5lRHVyYWJsZUV4b0NsYXNzKGRlZmluZUR1cmFibGVFeG9DbGFzcyk7JGjNj19vbmNlLmRlZmluZUR1cmFibGVFeG9DbGFzc0tpdChkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQpOyRozY9fb25jZS5wcmVwYXJlRXhvQ2xhc3MocHJlcGFyZUV4b0NsYXNzKTskaM2PX29uY2UucHJlcGFyZUV4b0NsYXNzS2l0KHByZXBhcmVFeG9DbGFzc0tpdCk7JGjNj19vbmNlLnByZXBhcmVFeG8ocHJlcGFyZUV4byk7JGjNj19vbmNlLnByZXBhcmVTaW5nbGV0b24ocHJlcGFyZVNpbmdsZXRvbik7XG4gICAgICAgY29uc3QgeyBwcm92aWRlS2luZEhhbmRsZSwgcHJlcGFyZUtpbmQsIHByZXBhcmVLaW5kTXVsdGkgfSA9XG4gIGdsb2JhbEV4b1V0aWxzOyRozY9fb25jZS5wcm92aWRlS2luZEhhbmRsZShwcm92aWRlS2luZEhhbmRsZSk7JGjNj19vbmNlLnByZXBhcmVLaW5kKHByZXBhcmVLaW5kKTskaM2PX29uY2UucHJlcGFyZUtpbmRNdWx0aShwcmVwYXJlS2luZE11bHRpKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Imlnbm9yZUNvbnRleHQiOlsiaWdub3JlQ29udGV4dCJdLCJtYWtlRXhvVXRpbHMiOlsibWFrZUV4b1V0aWxzIl0sImRlZmluZVZpcnR1YWxFeG9DbGFzcyI6WyJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MiXSwiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0IjpbImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCJdLCJkZWZpbmVEdXJhYmxlRXhvQ2xhc3MiOlsiZGVmaW5lRHVyYWJsZUV4b0NsYXNzIl0sImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCI6WyJkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQiXSwicHJlcGFyZUV4b0NsYXNzIjpbInByZXBhcmVFeG9DbGFzcyJdLCJwcmVwYXJlRXhvQ2xhc3NLaXQiOlsicHJlcGFyZUV4b0NsYXNzS2l0Il0sInByZXBhcmVFeG8iOlsicHJlcGFyZUV4byJdLCJwcmVwYXJlU2luZ2xldG9uIjpbInByZXBhcmVTaW5nbGV0b24iXSwicHJvdmlkZUtpbmRIYW5kbGUiOlsicHJvdmlkZUtpbmRIYW5kbGUiXSwicHJlcGFyZUtpbmQiOlsicHJlcGFyZUtpbmQiXSwicHJlcGFyZUtpbmRNdWx0aSI6WyJwcmVwYXJlS2luZE11bHRpIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAM+c6+m2CAAAtggAACQAAABAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMi9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSIsIi4vdmF0LWRhdGEtYmluZGluZ3MuanMiLCIuL2V4by11dGlscy5qcyJdLCJleHBvcnRzIjpbImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCIsImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCIsIm1ha2VTY2FsYXJNYXBTdG9yZSIsIm1ha2VTY2FsYXJNYXBTdG9yZSIsInByb3ZpZGVQcm9taXNlV2F0Y2hlciIsInByb3ZpZGVQcm9taXNlV2F0Y2hlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtdXSxbXCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzXCIsIFtdXSxbXCIuL2V4by11dGlscy5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7IkBhZ29yaWMvc3RvcmUiOltbIk0iLCJNIl0sWyJtYWtlU2NhbGFyTWFwU3RvcmUiLCJtYWtlU2NhbGFyTWFwU3RvcmUiXSxbIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiLCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIl0sWyJtYWtlU2NhbGFyU2V0U3RvcmUiLCJtYWtlU2NhbGFyU2V0U3RvcmUiXSxbIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiLCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIl1dLCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzIjpbWyJtYWtlS2luZEhhbmRsZSIsIm1ha2VLaW5kSGFuZGxlIl0sWyJwcm92aWRlUHJvbWlzZVdhdGNoZXIiLCJwcm92aWRlUHJvbWlzZVdhdGNoZXIiXSxbIndhdGNoUHJvbWlzZSIsIndhdGNoUHJvbWlzZSJdLFsibWFrZVNjYWxhckJpZ01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ01hcFN0b3JlIl0sWyJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSJdLFsibWFrZVNjYWxhckJpZ1NldFN0b3JlIiwibWFrZVNjYWxhckJpZ1NldFN0b3JlIl0sWyJtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSJdLFsiY2FuQmVEdXJhYmxlIiwiY2FuQmVEdXJhYmxlIl0sWyJwaWNrRmFjZXQiLCJwaWNrRmFjZXQiXSxbInBhcnRpYWxBc3NpZ24iLCJwYXJ0aWFsQXNzaWduIl0sWyJwcm92aWRlIiwicHJvdmlkZSJdLFsicHJvdmlkZUR1cmFibGVNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiXSxbInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIiwicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUiXSxbInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiLCJwcm92aWRlRHVyYWJsZVNldFN0b3JlIl0sWyJwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSIsInByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlIl0sWyJkZWZpbmVLaW5kIiwiZGVmaW5lS2luZCJdLFsiZGVmaW5lS2luZE11bHRpIiwiZGVmaW5lS2luZE11bHRpIl0sWyJkZWZpbmVEdXJhYmxlS2luZCIsImRlZmluZUR1cmFibGVLaW5kIl0sWyJkZWZpbmVEdXJhYmxlS2luZE11bHRpIiwiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSJdXSwiLi9leG8tdXRpbHMuanMiOltbImRlZmluZVZpcnR1YWxFeG9DbGFzcyIsImRlZmluZVZpcnR1YWxFeG9DbGFzcyJdLFsiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0IiwiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0Il0sWyJkZWZpbmVEdXJhYmxlRXhvQ2xhc3MiLCJkZWZpbmVEdXJhYmxlRXhvQ2xhc3MiXSxbImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCIsImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCJdLFsicHJlcGFyZUV4b0NsYXNzIiwicHJlcGFyZUV4b0NsYXNzIl0sWyJwcmVwYXJlRXhvQ2xhc3NLaXQiLCJwcmVwYXJlRXhvQ2xhc3NLaXQiXSxbInByZXBhcmVFeG8iLCJwcmVwYXJlRXhvIl0sWyJwcmVwYXJlU2luZ2xldG9uIiwicHJlcGFyZVNpbmdsZXRvbiJdLFsiaWdub3JlQ29udGV4dCIsImlnbm9yZUNvbnRleHQiXSxbInByb3ZpZGVLaW5kSGFuZGxlIiwicHJvdmlkZUtpbmRIYW5kbGUiXSxbInByZXBhcmVLaW5kIiwicHJlcGFyZUtpbmQiXSxbInByZXBhcmVLaW5kTXVsdGkiLCJwcmVwYXJlS2luZE11bHRpIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADvd74wOSMAADkjAAAwAAAAQGFnb3JpYy92YXQtZGF0YS12MC41LjIvc3JjL3ZhdC1kYXRhLWJpbmRpbmdzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJWYXREYXRhIiwiY2FuQmVEdXJhYmxlIiwiZGVmaW5lRHVyYWJsZUtpbmQiLCJkZWZpbmVEdXJhYmxlS2luZE11bHRpIiwiZGVmaW5lS2luZCIsImRlZmluZUtpbmRNdWx0aSIsIm1ha2VLaW5kSGFuZGxlIiwibWFrZVNjYWxhckJpZ01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ1NldFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSIsIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiLCJtYWtlU3RvcmVVdGlscyIsInBhcnRpYWxBc3NpZ24iLCJwaWNrRmFjZXQiLCJwcm92aWRlIiwicHJvdmlkZUR1cmFibGVNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiLCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlIiwicHJvdmlkZVByb21pc2VXYXRjaGVyIiwid2F0Y2hQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxwcm92aWRlTGF6eTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJwcm92aWRlTGF6eVwiLFskaM2PX2EgPT4gKHByb3ZpZGVMYXp5ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLyoqIEBpbXBvcnQge0JhZ2dhZ2UsIFBpY2tGYWNldCwgVmF0RGF0YX0gZnJvbSAnQGFnb3JpYy9zd2luZ3NldC1saXZlc2xvdHMnICovXG5cbi8qKiBAdHlwZSB7VmF0RGF0YX0gKi9cbmxldCBWYXREYXRhR2xvYmFsO1xuaWYgKCdWYXREYXRhJyBpbiBnbG9iYWxUaGlzKSB7XG4gIGdsb2JhbFRoaXMuVmF0RGF0YSB8fCBGYWlsYFZhdERhdGEgZGVmaW5lZCBpbiBnbG9iYWwgYXMgbnVsbCBvciB1bmRlZmluZWRgO1xuICAvKiBYWFggdHlwZXMgaW5jb21wYXRpYmlsaXR5Ki9cbiAgVmF0RGF0YUdsb2JhbCA9IC8qKiBAdHlwZSB7YW55fSAqLyAoZ2xvYmFsVGhpcy5WYXREYXRhKTtcbn0gZWxzZSB7XG4gIC8qIFhYWCB0aGlzIG1vZHVsZSBoYXMgYmVlbiBrbm93biB0byBnZXQgaW1wb3J0ZWQgKHRyYW5zaXRpdmVseSkgaW4gY2FzZXMgdGhhdCovXG4gIC8qIG5ldmVyIHVzZSBpdCBzbyB3ZSBtYWtlIGEgdmVyc2lvbiB0aGF0IHdpbGwgc2F0aXNmeSBtb2R1bGUgcmVzb2x1dGlvbiBidXQqL1xuICAvKiBmYWlsIGF0IHJ1bnRpbWUuKi9cbiAgY29uc3QgdW5hdmFpbGFibGUgPSAoKSA9PiBGYWlsYFZhdERhdGEgdW5hdmFpbGFibGVgO1xuICBWYXREYXRhR2xvYmFsID0ge1xuICAgIGRlZmluZUtpbmQ6IHVuYXZhaWxhYmxlLFxuICAgIGRlZmluZUtpbmRNdWx0aTogdW5hdmFpbGFibGUsXG4gICAgZGVmaW5lRHVyYWJsZUtpbmQ6IHVuYXZhaWxhYmxlLFxuICAgIGRlZmluZUR1cmFibGVLaW5kTXVsdGk6IHVuYXZhaWxhYmxlLFxuICAgIG1ha2VLaW5kSGFuZGxlOiB1bmF2YWlsYWJsZSxcbiAgICBwcm92aWRlUHJvbWlzZVdhdGNoZXI6IHVuYXZhaWxhYmxlLFxuICAgIHdhdGNoUHJvbWlzZTogdW5hdmFpbGFibGUsXG4gICAgbWFrZVNjYWxhckJpZ01hcFN0b3JlOiB1bmF2YWlsYWJsZSxcbiAgICBtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlOiB1bmF2YWlsYWJsZSxcbiAgICBtYWtlU2NhbGFyQmlnU2V0U3RvcmU6IHVuYXZhaWxhYmxlLFxuICAgIG1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmU6IHVuYXZhaWxhYmxlLFxuICAgIGNhbkJlRHVyYWJsZTogdW5hdmFpbGFibGUsXG4gIH07XG59XG5cbmNvbnN0IFZhdERhdGFFeHBvcnQgPSBWYXREYXRhR2xvYmFsOyRozY9fb25jZS5WYXREYXRhRXhwb3J0KFZhdERhdGFFeHBvcnQpO1xuXG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIEV4b3MvRXhvQ2xhc3NlcyBpbnN0ZWFkIG9mIEtpbmRzXG4gKi9cbiAgICAgICBjb25zdCB7XG4gIGRlZmluZUtpbmQsXG4gIGRlZmluZUtpbmRNdWx0aSxcbiAgZGVmaW5lRHVyYWJsZUtpbmQsXG4gIGRlZmluZUR1cmFibGVLaW5kTXVsdGksXG59ID0gVmF0RGF0YUdsb2JhbDskaM2PX29uY2UuZGVmaW5lS2luZChkZWZpbmVLaW5kKTskaM2PX29uY2UuZGVmaW5lS2luZE11bHRpKGRlZmluZUtpbmRNdWx0aSk7JGjNj19vbmNlLmRlZmluZUR1cmFibGVLaW5kKGRlZmluZUR1cmFibGVLaW5kKTskaM2PX29uY2UuZGVmaW5lRHVyYWJsZUtpbmRNdWx0aShkZWZpbmVEdXJhYmxlS2luZE11bHRpKTtcblxuICAgICAgIGNvbnN0IHtcbiAgbWFrZUtpbmRIYW5kbGUsXG4gIHByb3ZpZGVQcm9taXNlV2F0Y2hlcixcbiAgd2F0Y2hQcm9taXNlLFxuICBtYWtlU2NhbGFyQmlnTWFwU3RvcmUsXG4gIG1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUsXG4gIG1ha2VTY2FsYXJCaWdTZXRTdG9yZSxcbiAgbWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSxcbiAgY2FuQmVEdXJhYmxlLFxufSA9IFZhdERhdGFHbG9iYWw7XG5cbi8qKlxuICogV2hlbiBtYWtpbmcgYSBtdWx0aS1mYWNldCBraW5kLCBpdCdzIGNvbW1vbiB0byBwaWNrIG9uZSBmYWNldCB0byBleHBvc2UuXG4gKiBFLmcuLFxuICpcbiAqICAgICBjb25zdCBtYWtlRm9vID0gKGEsIGIsIGMsIGQpID0+IG1ha2VGb29CYXNlKGEsIGIsIGMsIGQpLnNlbGY7XG4gKlxuICogVGhpcyBoZWxwZXIgcmVkdWNlcyB0aGUgZHVwbGljYXRpb246XG4gKlxuICogICAgIGNvbnN0IG1ha2VGb28gPSBwaWNrRmFjZXQobWFrZUZvb0Jhc2UsICdzZWxmJyk7XG4gKlxuICogQHR5cGUge1BpY2tGYWNldH1cbiAqLyRozY9fb25jZS5tYWtlS2luZEhhbmRsZShtYWtlS2luZEhhbmRsZSk7JGjNj19vbmNlLnByb3ZpZGVQcm9taXNlV2F0Y2hlcihwcm92aWRlUHJvbWlzZVdhdGNoZXIpOyRozY9fb25jZS53YXRjaFByb21pc2Uod2F0Y2hQcm9taXNlKTskaM2PX29uY2UubWFrZVNjYWxhckJpZ01hcFN0b3JlKG1ha2VTY2FsYXJCaWdNYXBTdG9yZSk7JGjNj19vbmNlLm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUobWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSk7JGjNj19vbmNlLm1ha2VTY2FsYXJCaWdTZXRTdG9yZShtYWtlU2NhbGFyQmlnU2V0U3RvcmUpOyRozY9fb25jZS5tYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlKG1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUpOyRozY9fb25jZS5jYW5CZUR1cmFibGUoY2FuQmVEdXJhYmxlKTtcbiAgICAgICBjb25zdCBwaWNrRmFjZXQgPVxuICAobWFrZXIsIGZhY2V0TmFtZSkgPT5cbiAgKC4uLmFyZ3MpID0+XG4gICAgbWFrZXIoLi4uYXJncylbZmFjZXROYW1lXTskaM2PX29uY2UucGlja0ZhY2V0KHBpY2tGYWNldCk7XG5oYXJkZW4ocGlja0ZhY2V0KTtcblxuLyoqXG4gKiBBc3NpZ24gdGhlIHZhbHVlcyBvZiBhbGwgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgZnJvbSB0aGUgc291cmNlXG4gKiBvYmplY3QgdG8gdGhlaXIga2V5cyBpbiB0aGUgdGFyZ2V0IG9iamVjdC5cbiAqXG4gKiBAdGVtcGxhdGUge3t9fSBUXG4gKiBAcGFyYW0ge1R9IHRhcmdldFxuICogQHBhcmFtIHtQYXJ0aWFsPFQ+fSBzb3VyY2VcbiAqL1xuICAgICAgIGNvbnN0IHBhcnRpYWxBc3NpZ24gPSAodGFyZ2V0LCBzb3VyY2UpID0+IHtcbiAgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHNvdXJjZSk7XG59OyRozY9fb25jZS5wYXJ0aWFsQXNzaWduKHBhcnRpYWxBc3NpZ24pO1xuaGFyZGVuKHBhcnRpYWxBc3NpZ24pO1xuXG4vKiogQGltcG9ydCB7U3RvcmVPcHRpb25zfSBmcm9tICdAYWdvcmljL3N0b3JlJyAqL1xuXG4vKipcbiAqIFVubGlrZSBgcHJvdmlkZUxhenlgLCBgcHJvdmlkZWAgc2hvdWxkIGJlIGNhbGxlZCBhdCBtb3N0IG9uY2Ugd2l0aGluIGFueSB2YXRcbiAqIGluY2FybmF0aW9uIHdpdGggYSBnaXZlbiBgYmFnZ2FnZWAsYGtleWAgcGFpci5cbiAqXG4gKiBgcHJvdmlkZWAgc2hvdWxkIG9ubHkgYmUgdXNlZCB0byBwb3B1bGF0ZSBiYWdnYWdlLCB3aGVyZSB0aGUgdG90YWwgbnVtYmVyIG9mXG4gKiBjYWxscyB0byBgcHJvdmlkZWAgbXVzdCBiZSBsb3cgY2FyZGluYWxpdHksIHNpbmNlIHdlIGtlZXAgdGhlIGJvb2trZWVwaW5nIHRvXG4gKiBkZXRlY3QgY29sbGlzaW9ucyBpbiBub3JtYWwgbGFuZ3VhZ2UtaGVhcCBtZW1vcnkuIEFsbCB0aGUgb3RoZXJcbiAqIGJhZ2dhZ2Utb3JpZW50ZWQgYHByb3ZpZGUqYCBhbmQgYHByZXBhcmUqYCBmdW5jdGlvbnMgY2FsbCBgcHJvdmlkZWAsIGFuZCBzb1xuICogaW1wb3NlIHRoZSBzYW1lIGNvbnN0cmFpbnRzLiBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aCBvdXIgZXhwZWN0ZWQgZHVyYWJpbGl0eVxuICogcGF0dGVybnM6IFdoYXQgd2Ugc3RvcmUgaW4gYmFnZ2FnZSBhcmVcbiAqXG4gKiAtIGtpbmRIYW5kbGVzLCB3aGljaCBhcmUgcGVyIGtpbmQsIHdoaWNoIG11c3QgYmUgbG93IGNhcmRpbmFsaXR5XG4gKiAtIGRhdGEgXCJ2YXJpYWJsZXNcIiBmb3IgcmVlc3RhYmxpc2hpbmcgdGhlIGxleGljYWwgc2NvcGUsIGVzcGVjaWFsbHkgb2ZcbiAqICAgc2luZ2xldG9uc1xuICogLSBuYW1lZCBub24tYmFnZ2FnZSBjb2xsZWN0aW9ucyBhdCB0aGUgbGVhdmVzIG9mIHRoZSBiYWdnYWdlIHRyZWUuXG4gKlxuICogV2hhdCBpcyBleHBlY3RlZCB0byBiZSBoaWdoIGNhcmRpbmFsaXR5IGFyZSB0aGUgaW5zdGFuY2VzIG9mIHRoZSBraW5kcywgYW5kXG4gKiB0aGUgbWVtYmVycyBvZiB0aGUgbm9uLWJhZ2dnYWdlIGNvbGxlY3Rpb25zLlxuICpcbiAqIFRPRE8gaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL3B1bGwvNTg3NSA6IEltcGxlbWVudFxuICogZGV2ZWxvcG1lbnQtdGltZSBpbnN0cnVtZW50YXRpb24gdG8gZGV0ZWN0IHdoZW4gYHByb3ZpZGVgIHZpb2xhdGVzIHRoZSBhYm92ZVxuICogcHJlc2NyaXB0aW9uLCBhbmQgaXMgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIGluIHRoZSBzYW1lIHZhdCBpbmNhcm5hdGlvbiB3aXRoXG4gKiB0aGUgc2FtZSBiYWdnYWdlLGtleSBwYWlyLlxuICovXG5cbiAgICAgICBjb25zdCBwcm92aWRlID1cbiAgLyogWFhYIGNhc3QgYmVjYXVzZSBwcm92aWRlTGF6eSBpcyBgYW55YCBkdWUgdG8gYnJva2VuIHR5cGUgaW1wb3J0Ki9cbiAgLyoqXG4gKiBAdHlwZSB7PEssIFY+KFxuICogICBiYWdnYWdlOiBCYWdnYWdlLFxuICogICBrZXk6IEssXG4gKiAgIG1ha2VWYWx1ZTogKGtleTogSykgPT4gVixcbiAqICkgPT4gVn1cbiAqLyAgIChwcm92aWRlTGF6eSk7XG5cbi8qIFRPRE86IEZpbmQgYSBnb29kIGhvbWUgZm9yIHRoaXMgZnVuY3Rpb24gdXNlZCBieSBAYWdvcmljL3ZhdC1kYXRhIGFuZCB0ZXN0aW5nIGNvZGUqL1xuLyoqIEBwYXJhbSB7VmF0RGF0YX0gVmF0RGF0YSAqLyRozY9fb25jZS5wcm92aWRlKHByb3ZpZGUpO1xuICAgICAgIGNvbnN0IG1ha2VTdG9yZVV0aWxzID0gVmF0RGF0YSA9PiB7XG4gIGNvbnN0IHtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93IC0tIHRoZXNlIGxpdGVyYWxseSBkbyBzaGFkb3cgdGhlIGdsb2JhbHMqL1xuICAgIG1ha2VTY2FsYXJCaWdNYXBTdG9yZSxcbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93IC0tIHRoZXNlIGxpdGVyYWxseSBkbyBzaGFkb3cgdGhlIGdsb2JhbHMqL1xuICAgIG1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUsXG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvdyAtLSB0aGVzZSBsaXRlcmFsbHkgZG8gc2hhZG93IHRoZSBnbG9iYWxzKi9cbiAgICBtYWtlU2NhbGFyQmlnU2V0U3RvcmUsXG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvdyAtLSB0aGVzZSBsaXRlcmFsbHkgZG8gc2hhZG93IHRoZSBnbG9iYWxzKi9cbiAgICBtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlLFxuICB9ID0gVmF0RGF0YTtcblxuICAvKipcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7T21pdDxTdG9yZU9wdGlvbnMsICdkdXJhYmxlJz59IG9wdGlvbnNcbiAqL1xuICBjb25zdCBwcm92aWRlRHVyYWJsZU1hcFN0b3JlID0gKGJhZ2dhZ2UsIG5hbWUsIG9wdGlvbnMgPSB7fSkgPT5cbiAgICBwcm92aWRlKGJhZ2dhZ2UsIG5hbWUsICgpID0+XG4gICAgICBtYWtlU2NhbGFyQmlnTWFwU3RvcmUobmFtZSwgeyBkdXJhYmxlOiB0cnVlLCAuLi5vcHRpb25zIH0pLFxuICAgICk7XG4gIGhhcmRlbihwcm92aWRlRHVyYWJsZU1hcFN0b3JlKTtcblxuICAvKipcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7T21pdDxTdG9yZU9wdGlvbnMsICdkdXJhYmxlJz59IG9wdGlvbnNcbiAqL1xuICBjb25zdCBwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSA9IChiYWdnYWdlLCBuYW1lLCBvcHRpb25zID0ge30pID0+XG4gICAgcHJvdmlkZShiYWdnYWdlLCBuYW1lLCAoKSA9PlxuICAgICAgbWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZShuYW1lLCB7IGR1cmFibGU6IHRydWUsIC4uLm9wdGlvbnMgfSksXG4gICAgKTtcbiAgaGFyZGVuKHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKTtcblxuICAvKipcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7T21pdDxTdG9yZU9wdGlvbnMsICdkdXJhYmxlJz59IG9wdGlvbnNcbiAqL1xuICBjb25zdCBwcm92aWRlRHVyYWJsZVNldFN0b3JlID0gKGJhZ2dhZ2UsIG5hbWUsIG9wdGlvbnMgPSB7fSkgPT5cbiAgICBwcm92aWRlKGJhZ2dhZ2UsIG5hbWUsICgpID0+XG4gICAgICBtYWtlU2NhbGFyQmlnU2V0U3RvcmUobmFtZSwgeyBkdXJhYmxlOiB0cnVlLCAuLi5vcHRpb25zIH0pLFxuICAgICk7XG4gIGhhcmRlbihwcm92aWRlRHVyYWJsZVNldFN0b3JlKTtcblxuICAvKipcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7T21pdDxTdG9yZU9wdGlvbnMsICdkdXJhYmxlJz59IG9wdGlvbnNcbiAqL1xuICBjb25zdCBwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSA9IChiYWdnYWdlLCBuYW1lLCBvcHRpb25zID0ge30pID0+XG4gICAgcHJvdmlkZShiYWdnYWdlLCBuYW1lLCAoKSA9PlxuICAgICAgbWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZShuYW1lLCB7IGR1cmFibGU6IHRydWUsIC4uLm9wdGlvbnMgfSksXG4gICAgKTtcbiAgaGFyZGVuKHByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlKTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBwcm92aWRlRHVyYWJsZU1hcFN0b3JlLFxuICAgIHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlLFxuICAgIHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUsXG4gICAgcHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUsXG4gIH0pO1xufTskaM2PX29uY2UubWFrZVN0b3JlVXRpbHMobWFrZVN0b3JlVXRpbHMpO1xuXG5jb25zdCBnbG9iYWxTdG9yZVV0aWxzID0gbWFrZVN0b3JlVXRpbHMoVmF0RGF0YUdsb2JhbCk7XG4gICAgICAgY29uc3Qge1xuICBwcm92aWRlRHVyYWJsZU1hcFN0b3JlLFxuICBwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSxcbiAgcHJvdmlkZUR1cmFibGVTZXRTdG9yZSxcbiAgcHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUsXG59ID0gZ2xvYmFsU3RvcmVVdGlsczskaM2PX29uY2UucHJvdmlkZUR1cmFibGVNYXBTdG9yZShwcm92aWRlRHVyYWJsZU1hcFN0b3JlKTskaM2PX29uY2UucHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUocHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUpOyRozY9fb25jZS5wcm92aWRlRHVyYWJsZVNldFN0b3JlKHByb3ZpZGVEdXJhYmxlU2V0U3RvcmUpOyRozY9fb25jZS5wcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZShwcm92aWRlRHVyYWJsZVdlYWtTZXRTdG9yZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJWYXREYXRhIjpbIlZhdERhdGFFeHBvcnQiXSwiZGVmaW5lS2luZCI6WyJkZWZpbmVLaW5kIl0sImRlZmluZUtpbmRNdWx0aSI6WyJkZWZpbmVLaW5kTXVsdGkiXSwiZGVmaW5lRHVyYWJsZUtpbmQiOlsiZGVmaW5lRHVyYWJsZUtpbmQiXSwiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSI6WyJkZWZpbmVEdXJhYmxlS2luZE11bHRpIl0sIm1ha2VLaW5kSGFuZGxlIjpbIm1ha2VLaW5kSGFuZGxlIl0sInByb3ZpZGVQcm9taXNlV2F0Y2hlciI6WyJwcm92aWRlUHJvbWlzZVdhdGNoZXIiXSwid2F0Y2hQcm9taXNlIjpbIndhdGNoUHJvbWlzZSJdLCJtYWtlU2NhbGFyQmlnTWFwU3RvcmUiOlsibWFrZVNjYWxhckJpZ01hcFN0b3JlIl0sIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUiOlsibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSJdLCJtYWtlU2NhbGFyQmlnU2V0U3RvcmUiOlsibWFrZVNjYWxhckJpZ1NldFN0b3JlIl0sIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiOlsibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSJdLCJjYW5CZUR1cmFibGUiOlsiY2FuQmVEdXJhYmxlIl0sInBpY2tGYWNldCI6WyJwaWNrRmFjZXQiXSwicGFydGlhbEFzc2lnbiI6WyJwYXJ0aWFsQXNzaWduIl0sInByb3ZpZGUiOlsicHJvdmlkZSJdLCJtYWtlU3RvcmVVdGlscyI6WyJtYWtlU3RvcmVVdGlscyJdLCJwcm92aWRlRHVyYWJsZU1hcFN0b3JlIjpbInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiXSwicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUiOlsicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUiXSwicHJvdmlkZUR1cmFibGVTZXRTdG9yZSI6WyJwcm92aWRlRHVyYWJsZVNldFN0b3JlIl0sInByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlIjpbInByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAh9SthSHgAAUh4AACgAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jbGVhblByb3Bvc2FsLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL3N0b3JlIiwiQGVuZG8vZXJyb3JzIiwiQGVuZG8vbWFyc2hhbCIsIi4vdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbIk1BWF9LRVlXT1JEX0xFTkdUSCIsImFzc2VydEtleXdvcmROYW1lIiwiY2xlYW5LZXl3b3JkcyIsImNsZWFuUHJvcG9zYWwiLCJjb2VyY2VBbW91bnRLZXl3b3JkUmVjb3JkIiwiY29lcmNlQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBBbW91bnRNYXRoLGdldEFzc2V0S2luZCxvYmplY3RNYXAsYXNzZXJ0S2V5LGFzc2VydFBhdHRlcm4saXNLZXksbXVzdE1hdGNoLGFzc2VydCxGYWlsLHEsYXNzZXJ0UmVjb3JkLEZ1bGxQcm9wb3NhbFNoYXBlOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRNYXRoXCIsWyRozY9fYSA9PiAoQW1vdW50TWF0aCA9ICRozY9fYSldXSxbXCJnZXRBc3NldEtpbmRcIixbJGjNj19hID0+IChnZXRBc3NldEtpbmQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJvYmplY3RNYXBcIixbJGjNj19hID0+IChvYmplY3RNYXAgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJhc3NlcnRLZXlcIixbJGjNj19hID0+IChhc3NlcnRLZXkgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UGF0dGVyblwiLFskaM2PX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaM2PX2EpXV0sW1wiaXNLZXlcIixbJGjNj19hID0+IChpc0tleSA9ICRozY9fYSldXSxbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcImFzc2VydFwiLFskaM2PX2EgPT4gKGFzc2VydCA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydFJlY29yZFwiLFskaM2PX2EgPT4gKGFzc2VydFJlY29yZCA9ICRozY9fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiRnVsbFByb3Bvc2FsU2hhcGVcIixbJGjNj19hID0+IChGdWxsUHJvcG9zYWxTaGFwZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5cbiAgICAgICBjb25zdCBNQVhfS0VZV09SRF9MRU5HVEggPSAxMDA7XG5cbi8qKlxuICogQGltcG9ydCB7QW1vdW50S2V5d29yZFJlY29yZCwgRXhpdFJ1bGUsIFByb3Bvc2FsLCBQcm9wb3NhbFJlY29yZH0gZnJvbSAnQGFnb3JpYy96b2UnO1xuICogQGltcG9ydCB7R2V0QXNzZXRLaW5kQnlCcmFuZH0gZnJvbSAnLi9pbnRlcm5hbC10eXBlcy5qcyc7XG4gKi8kaM2PX29uY2UuTUFYX0tFWVdPUkRfTEVOR1RIKE1BWF9LRVlXT1JEX0xFTkdUSCk7XG5cbmNvbnN0IGZpcnN0Q2FwQVNDSUkgPSAvXltBLVpdW2EtekEtWjAtOV8kXSokLztcblxuLyogV2UgYWRvcHQgc2ltcGxlIHJlcXVpcmVtZW50cyBvbiBrZXl3b3JkcyBzbyB0aGF0IHRoZXkgZG8gbm90IGFjY2lkZW50YWxseSovXG4vKiBjb25mbGljdCB3aXRoIGV4aXN0aW5nIHByb3BlcnR5IG5hbWVzLiovXG4vKiBXZSByZXF1aXJlIGtleXdvcmRzIHRvIGJlIHN0cmluZ3MsIGFzY2lpIGlkZW50aWZpZXJzIGJlZ2lubmluZyB3aXRoIGFuKi9cbi8qIHVwcGVyIGNhc2UgbGV0dGVyLCBhbmQgZGlzdGluY3QgZnJvbSB0aGUgc3RyaW5naWZpZWQgZm9ybSBvZiBhbnkgbnVtYmVyLiovXG4vKiovXG4vKiBPZiBudW1iZXJzLCBvbmx5IE5hTiBhbmQgSW5maW5pdHksIHdoZW4gc3RyaW5naWZpZWQgdG8gYSBwcm9wZXJ0eSBuYW1lLCovXG4vKiBwcm9kdWNlIGFuIGFzY2lpIGlkZW50aWZpZXIgYmVnaW5uaW5nIHdpdGggYW4gdXBwZXIgY2FzZSBsZXR0ZXIuKi9cbi8qIFdpdGggdGhpcyBydWxlLCBhIGNvbXB1dGVkIGluZGV4aW5nIGV4cHJlc3Npb24gbGlrZSBgYVsraV1gIGNhbm5vdCovXG4vKiBsb29rdXAgYSBrZXl3b3JkLW5hbWVkIHByb3BlcnR5IG5vIG1hdHRlciB3aGF0IGBpYCBpcy4qL1xuICAgICAgIGNvbnN0IGFzc2VydEtleXdvcmROYW1lID0ga2V5d29yZCA9PiB7XG4gIGFzc2VydC50eXBlb2Yoa2V5d29yZCwgJ3N0cmluZycpO1xuICBrZXl3b3JkLmxlbmd0aCA8PSBNQVhfS0VZV09SRF9MRU5HVEggfHxcbiAgICBGYWlsYGtleXdvcmQgJHtxKGtleXdvcmQpfSBleGNlZWRlZCBtYXhpbXVtIGxlbmd0aCAke3EoXG4gICAgICBNQVhfS0VZV09SRF9MRU5HVEgsXG4gICAgKX0gY2hhcmFjdGVyczsgZ290ICR7a2V5d29yZC5sZW5ndGh9YDtcbiAgZmlyc3RDYXBBU0NJSS50ZXN0KGtleXdvcmQpIHx8XG4gICAgRmFpbGBrZXl3b3JkICR7cShcbiAgICAgIGtleXdvcmQsXG4gICAgKX0gbXVzdCBiZSBhbiBhc2NpaSBpZGVudGlmaWVyIHN0YXJ0aW5nIHdpdGggdXBwZXIgY2FzZS5gO1xuICAoa2V5d29yZCAhPT0gJ05hTicgJiYga2V5d29yZCAhPT0gJ0luZmluaXR5JykgfHxcbiAgICBGYWlsYGtleXdvcmQgJHtxKGtleXdvcmQpfSBtdXN0IG5vdCBiZSBhIG51bWJlcidzIG5hbWVgO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge3tbbmFtZTogc3RyaW5nXTogYW55fX0gdW5jbGVhbktleXdvcmRSZWNvcmRcbiAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAqLyRozY9fb25jZS5hc3NlcnRLZXl3b3JkTmFtZShhc3NlcnRLZXl3b3JkTmFtZSk7XG4gICAgICAgY29uc3QgY2xlYW5LZXl3b3JkcyA9IHVuY2xlYW5LZXl3b3JkUmVjb3JkID0+IHtcbiAgaGFyZGVuKHVuY2xlYW5LZXl3b3JkUmVjb3JkKTtcbiAgYXNzZXJ0UmVjb3JkKHVuY2xlYW5LZXl3b3JkUmVjb3JkLCAna2V5d29yZFJlY29yZCcpO1xuICBjb25zdCBrZXl3b3JkcyA9IG93bktleXModW5jbGVhbktleXdvcmRSZWNvcmQpO1xuXG4gIC8qIEFzc2VydCBhbGwgbmFtZXMgYXJlIGFzY2lpIGlkZW50aWZpZXJzIHN0YXJ0aW5nIHdpdGgqL1xuICAvKiBhbiB1cHBlciBjYXNlIGxldHRlci4qL1xuICBmb3IgKGNvbnN0IGtleXdvcmQgb2Yga2V5d29yZHMpIHtcbiAgICBhc3NlcnRLZXl3b3JkTmFtZShrZXl3b3JkKTtcbiAgfVxuXG4gIHJldHVybiAvKiogQHR5cGUge3N0cmluZ1tdfSAqLyAoa2V5d29yZHMpO1xufTskaM2PX29uY2UuY2xlYW5LZXl3b3JkcyhjbGVhbktleXdvcmRzKTtcblxuICAgICAgIGNvbnN0IGNvZXJjZUFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkID0gKFxuICBhbGxlZ2VkQW1vdW50S2V5d29yZFJlY29yZCxcbiAgZ2V0QXNzZXRLaW5kQnlCcmFuZCxcbikgPT4ge1xuICBjbGVhbktleXdvcmRzKGFsbGVnZWRBbW91bnRLZXl3b3JkUmVjb3JkKTtcbiAgLyogRklYTUUgb2JqZWN0TWFwIHNob3VsZCBjb25zdHJhaW4gdGhlIG1hcHBpbmcgZnVuY3Rpb24gYnkgdGhlIHJlY29yZCdzIHR5cGUqL1xuICByZXR1cm4gb2JqZWN0TWFwKGFsbGVnZWRBbW91bnRLZXl3b3JkUmVjb3JkLCBhbW91bnQgPT4ge1xuICAgIC8qIENoZWNrIHRoYXQgZWFjaCB2YWx1ZSBjYW4gYmUgY29lcmNlZCB1c2luZyB0aGUgQW1vdW50TWF0aCovXG4gICAgLyogaW5kaWNhdGVkIGJ5IGJyYW5kLiBgQW1vdW50TWF0aC5jb2VyY2VgIHRocm93cyBpZiBjb2VyY2lvbiBmYWlscy4qL1xuICAgIGlmIChpc0tleShhbW91bnQpKSB7XG4gICAgICBjb25zdCBicmFuZEFzc2V0S2luZCA9IGdldEFzc2V0S2luZEJ5QnJhbmQoYW1vdW50LmJyYW5kKTtcbiAgICAgIGNvbnN0IGFzc2V0S2luZCA9IGdldEFzc2V0S2luZChhbW91bnQpO1xuICAgICAgLyogVE9ETzogcmVwbGFjZSB0aGlzIGFzc2VydGlvbiB3aXRoIGEgY2hlY2sgb2YgdGhlIGFzc2V0S2luZCovXG4gICAgICAvKiBwcm9wZXJ0eSBvbiB0aGUgYnJhbmQsIHdoZW4gdGhhdCBleGlzdHMuKi9cbiAgICAgIGFzc2V0S2luZCA9PT0gYnJhbmRBc3NldEtpbmQgfHxcbiAgICAgICAgRmFpbGBUaGUgYW1vdW50ICR7YW1vdW50fSBkaWQgbm90IGhhdmUgdGhlIGFzc2V0S2luZCBvZiB0aGUgYnJhbmQgJHticmFuZEFzc2V0S2luZH1gO1xuICAgICAgcmV0dXJuIEFtb3VudE1hdGguY29lcmNlKGFtb3VudC5icmFuZCwgYW1vdW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgYXNzZXJ0UGF0dGVybihhbW91bnQpO1xuICAgICAgcmV0dXJuIGFtb3VudDtcbiAgICB9XG4gIH0pO1xufTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkQW1vdW50S2V5d29yZFJlY29yZFxuICogQHBhcmFtIHsqfSBnZXRBc3NldEtpbmRCeUJyYW5kXG4gKiBAcmV0dXJucyB7QW1vdW50S2V5d29yZFJlY29yZH1cbiAqLyRozY9fb25jZS5jb2VyY2VBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZChjb2VyY2VBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZCk7XG4gICAgICAgY29uc3QgY29lcmNlQW1vdW50S2V5d29yZFJlY29yZCA9IChcbiAgYWxsZWdlZEFtb3VudEtleXdvcmRSZWNvcmQsXG4gIGdldEFzc2V0S2luZEJ5QnJhbmQsXG4pID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gY29lcmNlQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmQoXG4gICAgYWxsZWdlZEFtb3VudEtleXdvcmRSZWNvcmQsXG4gICAgZ2V0QXNzZXRLaW5kQnlCcmFuZCxcbiAgKTtcbiAgYXNzZXJ0S2V5KHJlc3VsdCk7XG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgY2hlY2tlZCBjYXN0Ki9cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogSnVzdCBjaGVja3MgcmVzaWR1YWwgaXNzdWVzIGFmdGVyIG1hdGNoaW5nIFByb3Bvc2FsU2hhcGUuXG4gKiBPbmx5IGtub3duIHJlc2lkdWFsIGlzc3VlIGlzIHZlcmlmeWluZyB0aGF0IGl0IG9ubHkgaGFzIG9uZSBvZiB0aGVcbiAqIG9wdGlvbmFsIHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIHtFeGl0UnVsZX0gZXhpdFxuICovJGjNj19vbmNlLmNvZXJjZUFtb3VudEtleXdvcmRSZWNvcmQoY29lcmNlQW1vdW50S2V5d29yZFJlY29yZCk7XG5jb25zdCBhc3NlcnRFeGl0ID0gZXhpdCA9PlxuICBvd25LZXlzKGV4aXQpLmxlbmd0aCA9PT0gMSB8fCBGYWlsYGV4aXQgJHtleGl0fSBzaG91bGQgb25seSBoYXZlIG9uZSBrZXlgO1xuXG4vKipcbiAqIGNoZWNrIHRoYXQga2V5d29yZCBpcyBub3QgaW4gYm90aCAnd2FudCcgYW5kICdnaXZlJy5cbiAqXG4gKiBAcGFyYW0ge1Byb3Bvc2FsUmVjb3JkW1wid2FudFwiXX0gd2FudFxuICogQHBhcmFtIHtQcm9wb3NhbFJlY29yZFtcImdpdmVcIl19IGdpdmVcbiAqL1xuY29uc3QgYXNzZXJ0S2V5d29yZE5vdEluQm90aCA9ICh3YW50LCBnaXZlKSA9PiB7XG4gIGNvbnN0IHdhbnRLZXl3b3JkU2V0ID0gbmV3IFNldChvd25LZXlzKHdhbnQpKTtcbiAgY29uc3QgZ2l2ZUtleXdvcmRzID0gb3duS2V5cyhnaXZlKTtcblxuICBmb3IgKGNvbnN0IGtleXdvcmQgb2YgZ2l2ZUtleXdvcmRzKSB7XG4gICAgIXdhbnRLZXl3b3JkU2V0LmhhcyhrZXl3b3JkKSB8fFxuICAgICAgRmFpbGBhIGtleXdvcmQgY2Fubm90IGJlIGluIGJvdGggJ3dhbnQnIGFuZCAnZ2l2ZSdgO1xuICB9XG59O1xuXG4vKipcbiAqIGNsZWFuUHJvcG9zYWwgY2hlY2tzIHRoZSBrZXlzIGFuZCB2YWx1ZXMgb2YgdGhlIHByb3Bvc2FsLCBpbmNsdWRpbmdcbiAqIHRoZSBrZXlzIGFuZCB2YWx1ZXMgb2YgdGhlIGludGVybmFsIG9iamVjdHMuIFRoZSBwcm9wb3NhbCBtYXkgaGF2ZVxuICogdGhlIGZvbGxvd2luZyBrZXlzOiBgZ2l2ZWAsIGB3YW50YCwgYW5kIGBleGl0YC4gVGhlc2Uga2V5cyBtYXkgYmVcbiAqIG9taXR0ZWQgaW4gdGhlIGBwcm9wb3NhbGAgYXJndW1lbnQgcGFzc2VkIHRvIGNsZWFuUHJvcG9zYWwsIGJ1dFxuICogYW55dGhpbmcgb3RoZXIgdGhhbiB0aGVzZSBrZXlzIGlzIG5vdCBhbGxvd2VkLiBUaGUgdmFsdWVzIG9mIGBnaXZlYFxuICogYW5kIGB3YW50YCBtdXN0IGJlIFwiYW1vdW50S2V5d29yZFJlY29yZHNcIiwgbWVhbmluZyB0aGF0IHRoZSBrZXlzXG4gKiBtdXN0IGJlIGtleXdvcmRzIGFuZCB0aGUgdmFsdWVzIG11c3QgYmUgYW1vdW50cy4gVGhlIHZhbHVlIG9mXG4gKiBgZXhpdGAsIGlmIHByZXNlbnQsIG11c3QgYmUgYSByZWNvcmQgb2Ygb25lIG9mIHRoZSBmb2xsb3dpbmcgZm9ybXM6XG4gKiBgeyB3YWl2ZWQ6IG51bGwgfWAgYHsgb25EZW1hbmQ6IG51bGwgfWAgYHsgYWZ0ZXJEZWFkbGluZTogeyB0aW1lclxuICogOlRpbWVyLCBkZWFkbGluZSA6YmlnaW50IH0gfVxuICpcbiAqIEBwYXJhbSB7UHJvcG9zYWx9IHByb3Bvc2FsXG4gKiBAcGFyYW0ge0dldEFzc2V0S2luZEJ5QnJhbmR9IGdldEFzc2V0S2luZEJ5QnJhbmRcbiAqIEByZXR1cm5zIHtQcm9wb3NhbFJlY29yZH1cbiAqL1xuICAgICAgIGNvbnN0IGNsZWFuUHJvcG9zYWwgPSAocHJvcG9zYWwsIGdldEFzc2V0S2luZEJ5QnJhbmQpID0+IHtcbiAgYXNzZXJ0UmVjb3JkKHByb3Bvc2FsLCAncHJvcG9zYWwnKTtcbiAgLyogV2UgZmlsbCBpbiB0aGUgZGVmYXVsdCB2YWx1ZXMgaWYgdGhlIGtleXMgYXJlIGFic2VudCBvciB1bmRlZmluZWQuKi9cbiAgY29uc3Qge1xuICAgIHdhbnQgPSBoYXJkZW4oe30pLFxuICAgIGdpdmUgPSBoYXJkZW4oe30pLFxuICAgIGV4aXQgPSBoYXJkZW4oeyBvbkRlbWFuZDogbnVsbCB9KSxcbiAgICAuLi5yZXN0XG4gIH0gPSBwcm9wb3NhbDtcbiAgb3duS2V5cyhyZXN0KS5sZW5ndGggPT09IDAgfHxcbiAgICBGYWlsYCR7cHJvcG9zYWx9IC0gTXVzdCBvbmx5IGhhdmUgd2FudDosIGdpdmU6LCBleGl0OiBwcm9wZXJ0aWVzOiAke3Jlc3R9YDtcblxuICBjb25zdCBjbGVhbmVkV2FudCA9IGNvZXJjZUFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkKFxuICAgIHdhbnQsXG4gICAgZ2V0QXNzZXRLaW5kQnlCcmFuZCxcbiAgKTtcbiAgY29uc3QgY2xlYW5lZEdpdmUgPSBjb2VyY2VBbW91bnRLZXl3b3JkUmVjb3JkKGdpdmUsIGdldEFzc2V0S2luZEJ5QnJhbmQpO1xuXG4gIGNvbnN0IGNsZWFuZWRQcm9wb3NhbCA9IGhhcmRlbih7XG4gICAgd2FudDogY2xlYW5lZFdhbnQsXG4gICAgZ2l2ZTogY2xlYW5lZEdpdmUsXG4gICAgZXhpdCxcbiAgfSk7XG4gIG11c3RNYXRjaChjbGVhbmVkUHJvcG9zYWwsIEZ1bGxQcm9wb3NhbFNoYXBlLCAncHJvcG9zYWwnKTtcbiAgYXNzZXJ0RXhpdChleGl0KTtcbiAgYXNzZXJ0S2V5d29yZE5vdEluQm90aChjbGVhbmVkV2FudCwgY2xlYW5lZEdpdmUpO1xuICByZXR1cm4gY2xlYW5lZFByb3Bvc2FsO1xufTskaM2PX29uY2UuY2xlYW5Qcm9wb3NhbChjbGVhblByb3Bvc2FsKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Ik1BWF9LRVlXT1JEX0xFTkdUSCI6WyJNQVhfS0VZV09SRF9MRU5HVEgiXSwiYXNzZXJ0S2V5d29yZE5hbWUiOlsiYXNzZXJ0S2V5d29yZE5hbWUiXSwiY2xlYW5LZXl3b3JkcyI6WyJjbGVhbktleXdvcmRzIl0sImNvZXJjZUFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkIjpbImNvZXJjZUFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkIl0sImNvZXJjZUFtb3VudEtleXdvcmRSZWNvcmQiOlsiY29lcmNlQW1vdW50S2V5d29yZFJlY29yZCJdLCJjbGVhblByb3Bvc2FsIjpbImNsZWFuUHJvcG9zYWwiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAoZZDmYkRAACJEQAANAAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0RmFjZXQvb2ZmZXJTYWZldHkuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9lcnRwIl0sImV4cG9ydHMiOlsiaXNPZmZlclNhZmUiLCJzYXRpc2ZpZXNXYW50Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgQW1vdW50TWF0aDskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvZXJ0cFwiLCBbW1wiQW1vdW50TWF0aFwiLFskaM2PX2EgPT4gKEFtb3VudE1hdGggPSAkaM2PX2EpXV1dXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShpc09mZmVyU2FmZSwnbmFtZScse3ZhbHVlOlwiaXNPZmZlclNhZmVcIn0pOyRozY9fb25jZS5pc09mZmVyU2FmZShpc09mZmVyU2FmZSk7XG5cbi8qKlxuICogQGltcG9ydCB7QW1vdW50S2V5d29yZFJlY29yZCwgUHJvcG9zYWxSZWNvcmR9IGZyb20gJ0BhZ29yaWMvem9lJztcbiAqL1xuXG4vKipcbiAqIEhlbHBlciB0byBwZXJmb3JtIHNhdGlzZmllc1dhbnQgYW5kIHNhdGlzZmllc0dpdmUuIElzXG4gKiBhbGxvY2F0aW9uQW1vdW50IGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byByZXF1aXJlZEFtb3VudCBmb3IgZXZlcnlcbiAqIGtleXdvcmQgb2YgZ2l2ZU9yV2FudD9cbiAqXG4gKiBUbyBwcmVwYXJlIGZvciBtdWx0aXBsZXMsIHNhdGlzZmllc1dhbnQgYW5kIHNhdGlzZmllc0dpdmUgcmV0dXJuIDAgb3IgMS5cbiAqIGlzT2ZmZXJTYWZlIHdpbGwgc3RpbGwgYmUgYm9vbGVhbi4gV2hlbiB3ZSBoYXZlIE11bHRpcGxlcywgc2F0aXNmaWVzV2FudCBhbmRcbiAqIHNhdGlzZmllc0dpdmUgd2lsbCB0ZWxsIGhvdyBtYW55IHRpbWVzIHRoZSBvZmZlciB3YXMgbWF0Y2hlZC5cbiAqXG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmR9IGdpdmVPcldhbnRcbiAqIEBwYXJhbSB7QW1vdW50S2V5d29yZFJlY29yZH0gYWxsb2NhdGlvblxuICogQHJldHVybnMgezB8MX1cbiAqL1xuY29uc3Qgc2F0aXNmaWVzSW50ZXJuYWwgPSAoZ2l2ZU9yV2FudCA9IHt9LCBhbGxvY2F0aW9uKSA9PiB7XG4gIGNvbnN0IGlzR1RFQnlLZXl3b3JkID0gKFtrZXl3b3JkLCByZXF1aXJlZEFtb3VudF0pID0+IHtcbiAgICAvKiBJZiB0aGVyZSBpcyBubyBhbGxvY2F0aW9uIGZvciBhIGtleXdvcmQsIHdlIGtub3cgdGhlIGdpdmVPcldhbnQqL1xuICAgIC8qIGlzIG5vdCBzYXRpc2ZpZWQgd2l0aG91dCBjaGVja2luZyBmdXJ0aGVyLiovXG4gICAgaWYgKGFsbG9jYXRpb25ba2V5d29yZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGNvbnN0IGFsbG9jYXRpb25BbW91bnQgPSBhbGxvY2F0aW9uW2tleXdvcmRdO1xuICAgIHJldHVybiBBbW91bnRNYXRoLmlzR1RFKGFsbG9jYXRpb25BbW91bnQsIHJlcXVpcmVkQW1vdW50KSA/IDEgOiAwO1xuICB9O1xuICByZXR1cm4gT2JqZWN0LmVudHJpZXMoZ2l2ZU9yV2FudCkuZXZlcnkoaXNHVEVCeUtleXdvcmQpID8gMSA6IDA7XG59O1xuXG4vKipcbiAqIEZvciB0aGlzIGFsbG9jYXRpb24gdG8gc2F0aXNmeSB3aGF0IHRoZSB1c2VyIHdhbnRlZCwgdGhlaXJcbiAqIGFsbG9jYXRlZCBhbW91bnRzIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHByb3Bvc2FsLndhbnQuXG4gKlxuICogQHBhcmFtIHtQcm9wb3NhbFJlY29yZH0gcHJvcG9zYWwgLSB0aGUgcnVsZXMgdGhhdCBhY2NvbXBhbmllZCB0aGVcbiAqIGVzY3JvdyBvZiBwYXltZW50cyB0aGF0IGRpY3RhdGUgd2hhdCB0aGUgdXNlciBleHBlY3RlZCB0byBnZXQgYmFja1xuICogZnJvbSBab2UuIEEgcHJvcG9zYWwgaXMgYSByZWNvcmQgd2l0aCBrZXlzIGBnaXZlYCwgYHdhbnRgLCBhbmRcbiAqIGBleGl0YC4gYGdpdmVgIGFuZCBgd2FudGAgYXJlIHJlY29yZHMgd2l0aCBrZXl3b3JkcyBhcyBrZXlzIGFuZFxuICogYW1vdW50cyBhcyB2YWx1ZXMuIFRoZSBwcm9wb3NhbCBpcyBhIHVzZXIncyB1bmRlcnN0YW5kaW5nIG9mIHRoZVxuICogY29udHJhY3QgdGhhdCB0aGV5IGFyZSBlbnRlcmluZyB3aGVuIHRoZXkgbWFrZSBhbiBvZmZlci5cbiAqIEBwYXJhbSB7QW1vdW50S2V5d29yZFJlY29yZH0gYWxsb2NhdGlvbiAtIGEgcmVjb3JkIHdpdGgga2V5d29yZHNcbiAqIGFzIGtleXMgYW5kIGFtb3VudHMgYXMgdmFsdWVzLiBUaGVzZSBhbW91bnRzIGFyZSB0aGUgcmVhbGxvY2F0aW9uXG4gKiB0byBiZSBnaXZlbiB0byBhIHVzZXIuXG4gKi9cbmNvbnN0IHNhdGlzZmllc1dhbnQgPSAocHJvcG9zYWwsIGFsbG9jYXRpb24pID0+XG4gIHNhdGlzZmllc0ludGVybmFsKHByb3Bvc2FsLndhbnQsIGFsbG9jYXRpb24pO1xuXG4vKipcbiAqIEZvciB0aGlzIGFsbG9jYXRpb24gdG8gY291bnQgYXMgYSBmdWxsIHJlZnVuZCwgdGhlIGFsbG9jYXRlZFxuICogYW1vdW50cyBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB3aGF0IHdhcyBvcmlnaW5hbGx5XG4gKiBvZmZlcmVkIChwcm9wb3NhbC5naXZlKS5cbiAqXG4gKiBAcGFyYW0gIHtQcm9wb3NhbFJlY29yZH0gcHJvcG9zYWwgLSB0aGUgcnVsZXMgdGhhdCBhY2NvbXBhbmllZCB0aGVcbiAqIGVzY3JvdyBvZiBwYXltZW50cyB0aGF0IGRpY3RhdGUgd2hhdCB0aGUgdXNlciBleHBlY3RlZCB0byBnZXQgYmFja1xuICogZnJvbSBab2UuIEEgcHJvcG9zYWwgaXMgYSByZWNvcmQgd2l0aCBrZXlzIGBnaXZlYCwgYHdhbnRgLCBhbmRcbiAqIGBleGl0YC4gYGdpdmVgIGFuZCBgd2FudGAgYXJlIHJlY29yZHMgd2l0aCBrZXl3b3JkcyBhcyBrZXlzIGFuZFxuICogYW1vdW50cyBhcyB2YWx1ZXMuIFRoZSBwcm9wb3NhbCBpcyBhIHVzZXIncyB1bmRlcnN0YW5kaW5nIG9mIHRoZVxuICogY29udHJhY3QgdGhhdCB0aGV5IGFyZSBlbnRlcmluZyB3aGVuIHRoZXkgbWFrZSBhbiBvZmZlci5cbiAqIEBwYXJhbSAge0Ftb3VudEtleXdvcmRSZWNvcmR9IGFsbG9jYXRpb24gLSBhIHJlY29yZCB3aXRoIGtleXdvcmRzXG4gKiBhcyBrZXlzIGFuZCBhbW91bnRzIGFzIHZhbHVlcy4gVGhlc2UgYW1vdW50cyBhcmUgdGhlIHJlYWxsb2NhdGlvblxuICogdG8gYmUgZ2l2ZW4gdG8gYSB1c2VyLlxuICovJGjNj19vbmNlLnNhdGlzZmllc1dhbnQoc2F0aXNmaWVzV2FudCk7XG5jb25zdCBzYXRpc2ZpZXNHaXZlID0gKHByb3Bvc2FsLCBhbGxvY2F0aW9uKSA9PlxuICBzYXRpc2ZpZXNJbnRlcm5hbChwcm9wb3NhbC5naXZlLCBhbGxvY2F0aW9uKTtcblxuLyoqXG4gKiBgaXNPZmZlclNhZmVgIGNoZWNrcyBvZmZlciBzYWZldHkgZm9yIGEgc2luZ2xlIG9mZmVyLlxuICpcbiAqIE5vdGU6IFRoaXMgaW1wbGVtZW50YXRpb24gY2hlY2tzIHdoZXRoZXIgd2UgZnVsbHkgc2F0aXNmeVxuICogYHByb3Bvc2FsLmdpdmVgIChnaXZpbmcgYSByZWZ1bmQpIG9yIHdoZXRoZXIgd2UgZnVsbHkgc2F0aXNmeVxuICogYHByb3Bvc2FsLndhbnRgLiBCb3RoIGNhbiBiZSBmdWxseSBzYXRpc2ZpZWQuXG4gKlxuICogQHBhcmFtICB7UHJvcG9zYWxSZWNvcmR9IHByb3Bvc2FsIC0gdGhlIHJ1bGVzIHRoYXQgYWNjb21wYW5pZWQgdGhlXG4gKiBlc2Nyb3cgb2YgcGF5bWVudHMgdGhhdCBkaWN0YXRlIHdoYXQgdGhlIHVzZXIgZXhwZWN0ZWQgdG8gZ2V0IGJhY2tcbiAqIGZyb20gWm9lLiBBIHByb3Bvc2FsIGlzIGEgcmVjb3JkIHdpdGgga2V5cyBgZ2l2ZWAsIGB3YW50YCwgYW5kXG4gKiBgZXhpdGAuIGBnaXZlYCBhbmQgYHdhbnRgIGFyZSByZWNvcmRzIHdpdGgga2V5d29yZHMgYXMga2V5cyBhbmRcbiAqIGFtb3VudHMgYXMgdmFsdWVzLiBUaGUgcHJvcG9zYWwgaXMgYSB1c2VyJ3MgdW5kZXJzdGFuZGluZyBvZiB0aGVcbiAqIGNvbnRyYWN0IHRoYXQgdGhleSBhcmUgZW50ZXJpbmcgd2hlbiB0aGV5IG1ha2UgYW4gb2ZmZXIuXG4gKiBAcGFyYW0gIHtBbW91bnRLZXl3b3JkUmVjb3JkfSBhbGxvY2F0aW9uIC0gYSByZWNvcmQgd2l0aCBrZXl3b3Jkc1xuICogYXMga2V5cyBhbmQgYW1vdW50cyBhcyB2YWx1ZXMuIFRoZXNlIGFtb3VudHMgYXJlIHRoZSByZWFsbG9jYXRpb25cbiAqIHRvIGJlIGdpdmVuIHRvIGEgdXNlci5cbiAqL1xuZnVuY3Rpb24gaXNPZmZlclNhZmUocHJvcG9zYWwsIGFsbG9jYXRpb24pIHtcbiAgcmV0dXJuIChcbiAgICBzYXRpc2ZpZXNHaXZlKHByb3Bvc2FsLCBhbGxvY2F0aW9uKSA+IDAgfHxcbiAgICBzYXRpc2ZpZXNXYW50KHByb3Bvc2FsLCBhbGxvY2F0aW9uKSA+IDBcbiAgKTtcbn1cblxuaGFyZGVuKGlzT2ZmZXJTYWZlKTtcbmhhcmRlbihzYXRpc2ZpZXNXYW50KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InNhdGlzZmllc1dhbnQiOlsic2F0aXNmaWVzV2FudCJdLCJpc09mZmVyU2FmZSI6WyJpc09mZmVyU2FmZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABrOE1yZxMAAGcTAAA5AAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L2F0b21pY1RyYW5zZmVyLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiLCIuLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsiVHJhbnNmZXJQYXJ0U2hhcGUiLCJhdG9taWNSZWFycmFuZ2UiLCJhdG9taWNUcmFuc2ZlciIsImZyb21Pbmx5IiwidG9Pbmx5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgTSxBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUsU2VhdFNoYXBlOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXSxbXCIuLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGVcIixbJGjNj19hID0+IChBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUgPSAkaM2PX2EpXV0sW1wiU2VhdFNoYXBlXCIsWyRozY9fYSA9PiAoU2VhdFNoYXBlID0gJGjNj19hKV1dXV1dKTtcblxuXG4vKipcbiAqIEBpbXBvcnQge0Ftb3VudEtleXdvcmRSZWNvcmQsIFRyYW5zZmVyUGFydCwgWkNGLCBaQ0ZTZWF0fSBmcm9tICdAYWdvcmljL3pvZSc7XG4gKi9cblxuICAgICAgIGNvbnN0IFRyYW5zZmVyUGFydFNoYXBlID0gTS5zcGxpdEFycmF5KFxuICBoYXJkZW4oW00ub3B0KFNlYXRTaGFwZSksIE0ub3B0KFNlYXRTaGFwZSksIE0ub3B0KEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSldKSxcbiAgaGFyZGVuKFtNLm9wdChBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUpXSksXG4pO1xuXG4vKipcbiAqIEFza3MgWm9lICh2aWEgemNmKSB0byByZWFycmFuZ2UgdGhlIGFsbG9jYXRpb25zIGFtb25nIHRoZSBzZWF0c1xuICogbWVudGlvbmVkLiBUaGlzIGlzIGEgc2V0IG9mIGNoYW5nZXMgdG8gYWxsb2NhdGlvbnMgdGhhdCBtdXN0IHNhdGlzZnlcbiAqIHNldmVyYWwgY29uc3RyYWludHMuIElmIHRoZXNlIGNvbnN0cmFpbnRzIGFyZSBhbGwgbWV0LCB0aGVuIHRoZVxuICogcmVhbGxvY2F0aW9uIGhhcHBlbnMgYXRvbWljYWxseS4gT3RoZXJ3aXNlIGl0IGRvZXMgbm90IGhhcHBlblxuICogYXQgYWxsLlxuICpcbiAqIFRoZSBjb25kaXRpb25zXG4gKiAgICAqIEFsbCB0aGUgbWVudGlvbmVkIHNlYXRzIGFyZSBzdGlsbCBsaXZlIC0tIGVuZm9yY2VkIGJ5IFpDRi5cbiAqICAgICogTm8gb3V0c3RhbmRpbmcgc3RhZ2luZ3MgZm9yIGFueSBvZiB0aGUgbWVudGlvbmVkIHNlYXRzLlxuICogICAgICBTdGFnaW5ncyBub3cgZGVwcmVjYXRlZCBpbiBmYXZvciBvciBhdG9taWNSZWFycmFuZ2UuIFRvXG4gKiAgICAgIHByZXZlbnQgY29uZnVzaW9uLCBmb3IgZWFjaCByZWFsbG9jYXRpb24sIGl0IGNhbiBvbmx5IGJlXG4gKiAgICAgIGV4cHJlc3NlZCBpbiB0aGUgb2xkIHdheSBvciB0aGUgbmV3IHdheSwgYnV0IG5vdCBhIG1peHR1cmUuXG4gKiAgICAqIE9mZmVyIHNhZmV0eSAtLSBlbmZvcmNlZCBieSBaQ0YuXG4gKiAgICAqIE92ZXJhbGwgY29uc2VydmF0aW9uIC0tIGVuZm9yY2VkIGJ5IFpDRi5cbiAqICAgICogVGhlIG92ZXJhbGwgdHJhbnNmZXIgaXMgZXhwcmVzc2VkIGFzIGFuIGFycmF5IG9mIGBUcmFuc2ZlclBhcnRgLlxuICogICAgICBFYWNoIGluZGl2aWR1YWwgYFRyYW5zZmVyUGFydGAgaXMgb25lIG9mXG4gKiAgICAgICAtIEEgdHJhbnNmZXIgZnJvbSBhIGBmcm9tU2VhdGAgdG8gYSBgdG9TZWF0YC5cbiAqICAgICAgICAgVGhpcyBpcyBub3QgbmVlZGVkIGZvciBab2UncyBzYWZldHksIGFzIFpvZSBkb2VzXG4gaXRzIG93biBvdmVyYWxsIGNvbnNlcnZhdGlvbiBjaGVjay4gUmF0aGVyLCBpdCBoZWxwcyBjYXRjaFxuIGFuZCBkaWFnbm9zZSBjb250cmFjdCBidWdzIGVhcmxpZXIuXG4gKiAgICAgICAtIEEgdGFraW5nIGZyb20gYSBgZnJvbVNlYXRgJ3MgYWxsb2NhdGlvbi4gU2VlIHRoZSBgZnJvbU9ubHlgXG4gaGVscGVyLlxuIC0gQSBnaXZpbmcgaW50byBhIGB0b1NlYXRgJ3MgYWxsb2NhdGlvbi4gU2VlIHRoZSBgdG9Pbmx5YFxuIGhlbHBlci5cbiAqXG4gKiBUT0RPKDY2NzkpIFJlZmFjdG9yIGBhdG9taWNSZWFycmFuZ2VgZnJvbSBiZWluZyBhIGhlbHBlciBpbnRvIGJlaW5nXG4gKiB6Y2YncyByZXBsYWNlbWVudCBmb3IgcmVhbGxvY2F0ZS4gSXQgd2FzIG1hZGUgYSBoZWxwZXIgZHVyaW5nXG4gKiB0aGUgdHJhbnNpdGlvbiwgdG8gYXZvaWQgaW50ZXJmZXJlbmNlIHdpdGggcHJvZ3Jlc3Mgb24gWm9lIGR1cmFiaWxpdHkuXG4gKlxuICogU2VlIHRoZSBoZWxwZXJzIGJlbG93LCBgZnJvbU9ubHlgLCBgdG9Pbmx5YCwgYW5kIGBhdG9taWNUcmFuc2ZlcmAsXG4gKiB3aGljaCB3aWxsIHJlbWFpbiBoZWxwZXJzLiBUaGVzZSBoZWxwZXIgYXJlIGZvciBjb252ZW5pZW5jZVxuICogaW4gZXhwcmVzc2luZyBhdG9taWMgcmVhcnJhbmdlbWVudHMgY2xlYXJseS5cbiAqXG4gKiBAZGVwcmVjYXRlZCB1c2UgdGhlIHpjZiBidWlsdGluIGluc3RlYWRcbiAqXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge1RyYW5zZmVyUGFydFtdfSB0cmFuc2ZlcnNcbiAqLyRozY9fb25jZS5UcmFuc2ZlclBhcnRTaGFwZShUcmFuc2ZlclBhcnRTaGFwZSk7XG4gICAgICAgY29uc3QgYXRvbWljUmVhcnJhbmdlID0gKHpjZiwgdHJhbnNmZXJzKSA9PiB7XG4gIHpjZi5hdG9taWNSZWFycmFuZ2UodHJhbnNmZXJzKTtcbn07XG5cbi8qKlxuICogU29tZXRpbWVzIGEgVHJhbnNmZXJQYXJ0IGluIGFuIGF0b21pY1JlYXJyYW5nZSBvbmx5IGV4cHJlc3NlcyB3aGF0IGFtb3VudHNcbiAqIHNob3VsZCBiZSB0YWtlbiBmcm9tIGEgc2VhdCwgbGVhdmluZyBpdCB0byBvdGhlciBUcmFuc2ZlclBhcnQgb2YgdGhlXG4gKiBzYW1lIGF0b21pY1JlYXJyYW5nZSB0byBiYWxhbmNlIGl0IG91dC4gRm9yIHRoaXMgY2FzZSwgdGhlXG4gKiBgW2Zyb21TZWF0LCB1bmRlZmluZWQsIGZyb21BbW91bnRzXWAgZm9ybSBpcyBtb3JlIGNsZWFybHkgZXhwcmVzc2VkIGFzXG4gKiBgZnJvbU9ubHkoZnJvbVNlYXQsIGZyb21BbW91bnRzKWAuIFVubGlrZSBUcmFuc2ZlclBhcnQsIGJvdGggYXJndW1lbnRzIHRvXG4gKiBgZnJvbU9ubHlgIGFyZSBub24tb3B0aW9uYWwsIGFzIG90aGVyd2lzZSBpdCBkb2Vzbid0IG1ha2UgbXVjaCBzZW5zZS5cbiAqXG4gKiBAcGFyYW0ge1pDRlNlYXR9IGZyb21TZWF0XG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmR9IGZyb21BbW91bnRzXG4gKiBAcmV0dXJucyB7VHJhbnNmZXJQYXJ0fVxuICovJGjNj19vbmNlLmF0b21pY1JlYXJyYW5nZShhdG9taWNSZWFycmFuZ2UpO1xuICAgICAgIGNvbnN0IGZyb21Pbmx5ID0gKGZyb21TZWF0LCBmcm9tQW1vdW50cykgPT5cbiAgaGFyZGVuKFtmcm9tU2VhdCwgdW5kZWZpbmVkLCBmcm9tQW1vdW50c10pO1xuXG4vKipcbiAqIFNvbWV0aW1lcyBhIFRyYW5zZmVyUGFydCBpbiBhbiBhdG9taWNSZWFycmFuZ2Ugb25seSBleHByZXNzZXMgd2hhdCBhbW91bnRzXG4gKiBzaG91bGQgYmUgZ2l2ZW4gdG8gYSBzZWF0LCBsZWF2aW5nIGl0IHRvIG90aGVyIFRyYW5zZmVyUGFydCBvZiB0aGVcbiAqIHNhbWUgYXRvbWljUmVhcnJhbmdlIHRvIGJhbGFuY2UgaXQgb3V0LiBGb3IgdGhpcyBjYXNlLCB0aGVcbiAqIGBbdW5kZWZpbmVkLCB0b1NlYXQsIHVuZGVmaW5lZCwgdG9BbW91bnRzXWAgZm9ybSBpcyBtb3JlIGNsZWFybHkgZXhwcmVzc2VkIGFzXG4gKiBgdG9Pbmx5KHRvU2VhdCwgdG9BbW91bnRzKWAuIFVubGlrZSBUcmFuc2ZlclBhcnQsIGJvdGggYXJndW1lbnRzIHRvXG4gKiBgdG9Pbmx5YCBhcmUgbm9uLW9wdGlvbmFsLCBhcyBvdGhlcndpc2UgaXQgZG9lc24ndCBtYWtlIG11Y2ggc2Vuc2UuXG4gKlxuICogQHBhcmFtIHtaQ0ZTZWF0fSB0b1NlYXRcbiAqIEBwYXJhbSB7QW1vdW50S2V5d29yZFJlY29yZH0gdG9BbW91bnRzXG4gKiBAcmV0dXJucyB7VHJhbnNmZXJQYXJ0fVxuICovJGjNj19vbmNlLmZyb21Pbmx5KGZyb21Pbmx5KTtcbiAgICAgICBjb25zdCB0b09ubHkgPSAodG9TZWF0LCB0b0Ftb3VudHMpID0+XG4gIGhhcmRlbihbdW5kZWZpbmVkLCB0b1NlYXQsIHVuZGVmaW5lZCwgdG9BbW91bnRzXSk7XG5cbi8qKlxuICogU3BlY2lhbCBjYXNlIG9mIGF0b21pY1JlYXJyYW5nZSBmb3IgYSBzaW5nbGUgb25lLXdheSB0cmFuc2ZlclxuICpcbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqIEBwYXJhbSB7WkNGU2VhdH0gW2Zyb21TZWF0XVxuICogQHBhcmFtIHtaQ0ZTZWF0fSBbdG9TZWF0XVxuICogQHBhcmFtIHtBbW91bnRLZXl3b3JkUmVjb3JkfSBbZnJvbUFtb3VudHNdXG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmR9IFt0b0Ftb3VudHNdXG4gKi8kaM2PX29uY2UudG9Pbmx5KHRvT25seSk7XG4gICAgICAgY29uc3QgYXRvbWljVHJhbnNmZXIgPSAoXG4gIHpjZixcbiAgZnJvbVNlYXQgPSB1bmRlZmluZWQsXG4gIHRvU2VhdCA9IHVuZGVmaW5lZCxcbiAgZnJvbUFtb3VudHMgPSB1bmRlZmluZWQsXG4gIHRvQW1vdW50cyA9IHVuZGVmaW5lZCxcbikgPT4gemNmLmF0b21pY1JlYXJyYW5nZShoYXJkZW4oW1tmcm9tU2VhdCwgdG9TZWF0LCBmcm9tQW1vdW50cywgdG9BbW91bnRzXV0pKTskaM2PX29uY2UuYXRvbWljVHJhbnNmZXIoYXRvbWljVHJhbnNmZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiVHJhbnNmZXJQYXJ0U2hhcGUiOlsiVHJhbnNmZXJQYXJ0U2hhcGUiXSwiYXRvbWljUmVhcnJhbmdlIjpbImF0b21pY1JlYXJyYW5nZSJdLCJmcm9tT25seSI6WyJmcm9tT25seSJdLCJ0b09ubHkiOlsidG9Pbmx5Il0sImF0b21pY1RyYW5zZmVyIjpbImF0b21pY1RyYW5zZmVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEI+scmOHQAAjh0AADgAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvYm9uZGluZ0N1cnZlcy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2VydHAvc3JjL3NhZmVNYXRoLmpzIiwiQGVuZG8vZXJyb3JzIiwiQGVuZG8vbmF0Il0sImV4cG9ydHMiOlsiY2FsY0xpcVZhbHVlVG9NaW50IiwiY2FsY1NlY29uZGFyeVJlcXVpcmVkIiwiY2FsY1ZhbHVlVG9SZW1vdmUiLCJnZXRJbnB1dFByaWNlIiwiZ2V0T3V0cHV0UHJpY2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBuYXRTYWZlTWF0aCxGYWlsLE5hdDskaM2PX2ltcG9ydHMoW1tcIkBhZ29yaWMvZXJ0cC9zcmMvc2FmZU1hdGguanNcIiwgW1tcIm5hdFNhZmVNYXRoXCIsWyRozY9fYSA9PiAobmF0U2FmZU1hdGggPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIixbJGjNj19hID0+IChOYXQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7TmF0VmFsdWV9IGZyb20gJ0BhZ29yaWMvZXJ0cCc7XG4gKi9cblxuY29uc3QgeyBzdWJ0cmFjdCwgYWRkLCBtdWx0aXBseSwgZmxvb3JEaXZpZGUgfSA9IG5hdFNhZmVNYXRoO1xuXG5jb25zdCBCQVNJU19QT0lOVFMgPSAxMDAwMG47IC8qIFRPRE8gY2hhbmdlIHRvIDEwXzAwMG4gb25jZSB0b29saW5nIGNvcGVzLiovXG5cbi8qKlxuICogQ2FsY3VsYXRpb25zIGZvciBjb25zdGFudCBwcm9kdWN0IG1hcmtldHMgbGlrZSBVbmlzd2FwLlxuICogaHR0cHM6Ly9naXRodWIuY29tL3J1bnRpbWV2ZXJpZmljYXRpb24vdmVyaWZpZWQtc21hcnQtY29udHJhY3RzL2Jsb2IvdW5pc3dhcC91bmlzd2FwL3gteS1rLnBkZlxuICovXG5cbi8qKlxuICogQ29udGFpbnMgdGhlIGxvZ2ljIGZvciBjYWxjdWxhdGluZyBob3cgbXVjaCBzaG91bGQgYmUgZ2l2ZW5cbiAqIGJhY2sgdG8gdGhlIHVzZXIgaW4gZXhjaGFuZ2UgZm9yIHdoYXQgdGhleSBzZW50IGluLiBSZXVzZWQgaW5cbiAqIHNldmVyYWwgZGlmZmVyZW50IHBsYWNlcywgaW5jbHVkaW5nIHRvIGNoZWNrIHdoZXRoZXIgYW4gb2ZmZXJcbiAqIGlzIHZhbGlkLCBnZXR0aW5nIHRoZSBjdXJyZW50IHByaWNlIGZvciBhbiBhc3NldCBvbiB1c2VyXG4gKiByZXF1ZXN0LCBhbmQgdG8gZG8gdGhlIGFjdHVhbCByZWFsbG9jYXRpb24gYWZ0ZXIgYW4gb2ZmZXIgaGFzXG4gKiBiZWVuIG1hZGUuXG4gKlxuICogQHBhcmFtIHthbnl9IGlucHV0VmFsdWUgLSB0aGUgdmFsdWUgb2YgdGhlIGFzc2V0IHNlbnRcbiAqIGluIHRvIGJlIHN3YXBwZWRcbiAqIEBwYXJhbSB7YW55fSBpbnB1dFJlc2VydmUgLSB0aGUgdmFsdWUgaW4gdGhlIGxpcXVpZGl0eVxuICogcG9vbCBvZiB0aGUga2luZCBvZiBhc3NldCBzZW50IGluXG4gKiBAcGFyYW0ge2FueX0gb3V0cHV0UmVzZXJ2ZSAtIHRoZSB2YWx1ZSBpbiB0aGUgbGlxdWlkaXR5XG4gKiBwb29sIG9mIHRoZSBraW5kIG9mIGFzc2V0IHRvIGJlIHNlbnQgb3V0XG4gKiBAcGFyYW0ge2JpZ2ludH0gW2ZlZUJhc2lzUG9pbnRzXSAtIHRoZSBmZWUgdGFrZW4gaW5cbiAqIGJhc2lzIHBvaW50cy4gVGhlIGRlZmF1bHQgaXMgMC4zJSBvciAzMCBiYXNpcyBwb2ludHMuIFRoZSBmZWVcbiAqIGlzIHRha2VuIGZyb20gaW5wdXRWYWx1ZVxuICogQHJldHVybnMge05hdFZhbHVlfSBvdXRwdXRWYWx1ZSAtIHRoZSBjdXJyZW50IHByaWNlLCBpbiB2YWx1ZSBmb3JtXG4gKi9cbiAgICAgICBjb25zdCBnZXRJbnB1dFByaWNlID0gKFxuICBpbnB1dFZhbHVlLFxuICBpbnB1dFJlc2VydmUsXG4gIG91dHB1dFJlc2VydmUsXG4gIGZlZUJhc2lzUG9pbnRzID0gMzBuLFxuKSA9PiB7XG4gIGlucHV0VmFsdWUgPSBOYXQoaW5wdXRWYWx1ZSk7XG4gIGlucHV0UmVzZXJ2ZSA9IE5hdChpbnB1dFJlc2VydmUpO1xuICBvdXRwdXRSZXNlcnZlID0gTmF0KG91dHB1dFJlc2VydmUpO1xuICBpbnB1dFZhbHVlID4gMG4gfHwgRmFpbGBpbnB1dFZhbHVlICR7aW5wdXRWYWx1ZX0gbXVzdCBiZSBwb3NpdGl2ZWA7XG4gIGlucHV0UmVzZXJ2ZSA+IDBuIHx8IEZhaWxgaW5wdXRSZXNlcnZlICR7aW5wdXRSZXNlcnZlfSBtdXN0IGJlIHBvc2l0aXZlYDtcbiAgb3V0cHV0UmVzZXJ2ZSA+IDBuIHx8IEZhaWxgb3V0cHV0UmVzZXJ2ZSAke291dHB1dFJlc2VydmV9IG11c3QgYmUgcG9zaXRpdmVgO1xuXG4gIGNvbnN0IG9uZU1pbnVzRmVlU2NhbGVkID0gc3VidHJhY3QoQkFTSVNfUE9JTlRTLCBmZWVCYXNpc1BvaW50cyk7XG4gIGNvbnN0IGlucHV0V2l0aEZlZSA9IG11bHRpcGx5KGlucHV0VmFsdWUsIG9uZU1pbnVzRmVlU2NhbGVkKTtcbiAgY29uc3QgbnVtZXJhdG9yID0gbXVsdGlwbHkoaW5wdXRXaXRoRmVlLCBvdXRwdXRSZXNlcnZlKTtcbiAgY29uc3QgZGVub21pbmF0b3IgPSBhZGQobXVsdGlwbHkoaW5wdXRSZXNlcnZlLCBCQVNJU19QT0lOVFMpLCBpbnB1dFdpdGhGZWUpO1xuICByZXR1cm4gZmxvb3JEaXZpZGUobnVtZXJhdG9yLCBkZW5vbWluYXRvcik7XG59O1xuXG4vKipcbiAqIENvbnRhaW5zIHRoZSBsb2dpYyBmb3IgY2FsY3VsYXRpbmcgaG93IG11Y2ggc2hvdWxkIGJlIHRha2VuXG4gKiBmcm9tIHRoZSB1c2VyIGluIGV4Y2hhbmdlIGZvciB3aGF0IHRoZXkgd2FudCB0byBvYnRhaW4uIFJldXNlZCBpblxuICogc2V2ZXJhbCBkaWZmZXJlbnQgcGxhY2VzLCBpbmNsdWRpbmcgdG8gY2hlY2sgd2hldGhlciBhbiBvZmZlclxuICogaXMgdmFsaWQsIGdldHRpbmcgdGhlIGN1cnJlbnQgcHJpY2UgZm9yIGFuIGFzc2V0IG9uIHVzZXJcbiAqIHJlcXVlc3QsIGFuZCB0byBkbyB0aGUgYWN0dWFsIHJlYWxsb2NhdGlvbiBhZnRlciBhbiBvZmZlciBoYXNcbiAqIGJlZW4gbWFkZS5cbiAqXG4gKiBAcGFyYW0ge2FueX0gb3V0cHV0VmFsdWUgLSB0aGUgdmFsdWUgb2YgdGhlIGFzc2V0IHRoZSB1c2VyIHdhbnRzXG4gKiB0byBnZXRcbiAqIEBwYXJhbSB7YW55fSBpbnB1dFJlc2VydmUgLSB0aGUgdmFsdWUgaW4gdGhlIGxpcXVpZGl0eVxuICogcG9vbCBvZiB0aGUgYXNzZXQgYmVpbmcgc3BlbnRcbiAqIEBwYXJhbSB7YW55fSBvdXRwdXRSZXNlcnZlIC0gdGhlIHZhbHVlIGluIHRoZSBsaXF1aWRpdHlcbiAqIHBvb2wgb2YgdGhlIGtpbmQgb2YgYXNzZXQgdG8gYmUgc2VudCBvdXRcbiAqIEBwYXJhbSB7YmlnaW50fSBbZmVlQmFzaXNQb2ludHNdIC0gdGhlIGZlZSB0YWtlbiBpblxuICogYmFzaXMgcG9pbnRzLiBUaGUgZGVmYXVsdCBpcyAwLjMlIG9yIDMwIGJhc2lzIHBvaW50cy4gVGhlIGZlZSBpcyB0YWtlbiBmcm9tXG4gKiBvdXRwdXRWYWx1ZVxuICogQHJldHVybnMge05hdFZhbHVlfSBpbnB1dFZhbHVlIC0gdGhlIHZhbHVlIG9mIGlucHV0IHJlcXVpcmVkIHRvIHB1cmNoYXNlIG91dHB1dFxuICovJGjNj19vbmNlLmdldElucHV0UHJpY2UoZ2V0SW5wdXRQcmljZSk7XG4gICAgICAgY29uc3QgZ2V0T3V0cHV0UHJpY2UgPSAoXG4gIG91dHB1dFZhbHVlLFxuICBpbnB1dFJlc2VydmUsXG4gIG91dHB1dFJlc2VydmUsXG4gIGZlZUJhc2lzUG9pbnRzID0gMzBuLFxuKSA9PiB7XG4gIG91dHB1dFZhbHVlID0gTmF0KG91dHB1dFZhbHVlKTtcbiAgaW5wdXRSZXNlcnZlID0gTmF0KGlucHV0UmVzZXJ2ZSk7XG4gIG91dHB1dFJlc2VydmUgPSBOYXQob3V0cHV0UmVzZXJ2ZSk7XG5cbiAgaW5wdXRSZXNlcnZlID4gMG4gfHwgRmFpbGBpbnB1dFJlc2VydmUgJHtpbnB1dFJlc2VydmV9IG11c3QgYmUgcG9zaXRpdmVgO1xuICBvdXRwdXRSZXNlcnZlID4gMG4gfHwgRmFpbGBvdXRwdXRSZXNlcnZlICR7b3V0cHV0UmVzZXJ2ZX0gbXVzdCBiZSBwb3NpdGl2ZWA7XG4gIG91dHB1dFJlc2VydmUgPiBvdXRwdXRWYWx1ZSB8fFxuICAgIEZhaWxgb3V0cHV0UmVzZXJ2ZSAke291dHB1dFJlc2VydmV9IG11c3QgYmUgZ3JlYXRlciB0aGFuIG91dHB1dFZhbHVlICR7b3V0cHV0VmFsdWV9YDtcblxuICBjb25zdCBvbmVNaW51c0ZlZVNjYWxlZCA9IHN1YnRyYWN0KEJBU0lTX1BPSU5UUywgZmVlQmFzaXNQb2ludHMpO1xuICBjb25zdCBudW1lcmF0b3IgPSBtdWx0aXBseShtdWx0aXBseShvdXRwdXRWYWx1ZSwgaW5wdXRSZXNlcnZlKSwgQkFTSVNfUE9JTlRTKTtcbiAgY29uc3QgZGVub21pbmF0b3IgPSBtdWx0aXBseShcbiAgICBzdWJ0cmFjdChvdXRwdXRSZXNlcnZlLCBvdXRwdXRWYWx1ZSksXG4gICAgb25lTWludXNGZWVTY2FsZWQsXG4gICk7XG4gIHJldHVybiBhZGQoZmxvb3JEaXZpZGUobnVtZXJhdG9yLCBkZW5vbWluYXRvciksIDFuKTtcbn07XG5cbi8qKlxuICogQ2FsY3VsYXRlIGhvdyBtYW55IGxpcXVpZGl0eSB0b2tlbnMgd2Ugc2hvdWxkIGJlIG1pbnRpbmcgdG8gc2VuZCBiYWNrIHRvIHRoZVxuICogdXNlciB3aGVuIGFkZGluZyBsaXF1aWRpdHkuIFdlIHByb3ZpZGUgbmV3IGxpcXVpZGl0eSBlcXVhbCB0byB0aGUgZXhpc3RpbmdcbiAqIGxpcXVpZGl0eSBtdWx0aXBsaWVkIGJ5IHRoZSByYXRpbyBvZiBuZXcgY2VudHJhbCB0b2tlbnMgdG8gY2VudHJhbCB0b2tlbnNcbiAqIGFscmVhZHkgaGVsZC4gSWYgdGhlIGN1cnJlbnQgc3VwcGx5IGlzIHplcm8sIHJldHVybiB0aGUgaW5wdXRWYWx1ZSBhcyB0aGVcbiAqIGluaXRpYWwgbGlxdWlkaXR5IHRvIG1pbnQgaXMgYXJiaXRyYXJ5LlxuICpcbiAqIEBwYXJhbSB7YmlnaW50fSBsaXFUb2tlblN1cHBseVxuICogQHBhcmFtIHtiaWdpbnR9IGlucHV0VmFsdWVcbiAqIEBwYXJhbSB7YmlnaW50fSBpbnB1dFJlc2VydmVcbiAqIEByZXR1cm5zIHtOYXRWYWx1ZX1cbiAqLyRozY9fb25jZS5nZXRPdXRwdXRQcmljZShnZXRPdXRwdXRQcmljZSk7XG4gICAgICAgY29uc3QgY2FsY0xpcVZhbHVlVG9NaW50ID0gKFxuICBsaXFUb2tlblN1cHBseSxcbiAgaW5wdXRWYWx1ZSxcbiAgaW5wdXRSZXNlcnZlLFxuKSA9PiB7XG4gIGxpcVRva2VuU3VwcGx5ID0gTmF0KGxpcVRva2VuU3VwcGx5KTtcbiAgaW5wdXRWYWx1ZSA9IE5hdChpbnB1dFZhbHVlKTtcbiAgaW5wdXRSZXNlcnZlID0gTmF0KGlucHV0UmVzZXJ2ZSk7XG5cbiAgaWYgKGxpcVRva2VuU3VwcGx5ID09PSAwbikge1xuICAgIHJldHVybiBpbnB1dFZhbHVlO1xuICB9XG4gIHJldHVybiBmbG9vckRpdmlkZShtdWx0aXBseShpbnB1dFZhbHVlLCBsaXFUb2tlblN1cHBseSksIGlucHV0UmVzZXJ2ZSk7XG59O1xuXG4vKipcbiAqIENhbGN1bGF0ZSBob3cgbXVjaCBvZiB0aGUgc2Vjb25kYXJ5IHRva2VuIGlzIHJlcXVpcmVkIGZyb20gdGhlIHVzZXIgd2hlblxuICogYWRkaW5nIGxpcXVpZGl0eS4gV2UgcmVxdWlyZSB0aGF0IHRoZSBkZXBvc2l0ZWQgcmF0aW8gb2YgY2VudHJhbCB0byBzZWNvbmRhcnlcbiAqIG1hdGNoIHRoZSBjdXJyZW50IHJhdGlvIG9mIGhvbGRpbmdzIGluIHRoZSBwb29sLlxuICpcbiAqIEBwYXJhbSB7YW55fSBjZW50cmFsSW4gLSBUaGUgdmFsdWUgb2YgY2VudHJhbCBhc3NldHMgYmVpbmcgZGVwb3NpdGVkXG4gKiBAcGFyYW0ge2FueX0gY2VudHJhbFBvb2wgLSBUaGUgdmFsdWUgb2YgY2VudHJhbCBhc3NldHMgaW4gdGhlIHBvb2xcbiAqIEBwYXJhbSB7YW55fSBzZWNvbmRhcnlQb29sIC0gVGhlIHZhbHVlIG9mIHNlY29uZGFyeSBhc3NldHMgaW4gdGhlIHBvb2xcbiAqIEBwYXJhbSB7YW55fSBzZWNvbmRhcnlJbiAtIFRoZSB2YWx1ZSBvZiBzZWNvbmRhcnkgYXNzZXRzIHByb3ZpZGVkLiBJZlxuICogdGhlIHBvb2wgaXMgZW1wdHksIHRoZSBlbnRpcmUgYW1vdW50IHdpbGwgYmUgYWNjZXB0ZWRcbiAqIEByZXR1cm5zIHtOYXRWYWx1ZX0gLSB0aGUgYW1vdW50IG9mIHNlY29uZGFyeSByZXF1aXJlZFxuICovJGjNj19vbmNlLmNhbGNMaXFWYWx1ZVRvTWludChjYWxjTGlxVmFsdWVUb01pbnQpO1xuICAgICAgIGNvbnN0IGNhbGNTZWNvbmRhcnlSZXF1aXJlZCA9IChcbiAgY2VudHJhbEluLFxuICBjZW50cmFsUG9vbCxcbiAgc2Vjb25kYXJ5UG9vbCxcbiAgc2Vjb25kYXJ5SW4sXG4pID0+IHtcbiAgY2VudHJhbEluID0gTmF0KGNlbnRyYWxJbik7XG4gIGNlbnRyYWxQb29sID0gTmF0KGNlbnRyYWxQb29sKTtcbiAgc2Vjb25kYXJ5UG9vbCA9IE5hdChzZWNvbmRhcnlQb29sKTtcbiAgc2Vjb25kYXJ5SW4gPSBOYXQoc2Vjb25kYXJ5SW4pO1xuXG4gIGlmIChjZW50cmFsUG9vbCA9PT0gMG4gfHwgc2Vjb25kYXJ5UG9vbCA9PT0gMG4pIHtcbiAgICByZXR1cm4gc2Vjb25kYXJ5SW47XG4gIH1cblxuICBjb25zdCBzY2FsZWRTZWNvbmRhcnkgPSBmbG9vckRpdmlkZShcbiAgICBtdWx0aXBseShjZW50cmFsSW4sIHNlY29uZGFyeVBvb2wpLFxuICAgIGNlbnRyYWxQb29sLFxuICApO1xuICBjb25zdCBleGFjdCA9XG4gICAgbXVsdGlwbHkoY2VudHJhbEluLCBzZWNvbmRhcnlQb29sKSA9PT1cbiAgICBtdWx0aXBseShzY2FsZWRTZWNvbmRhcnksIGNlbnRyYWxQb29sKTtcblxuICAvKiBkb2Vzbid0IG1hdGNoIHRoZSB4LXktay5wZGYgcGFwZXIsIGJ1dCBtb3JlIGNvcnJlY3QuIFdoZW4gdGhlIHJhdGlvcyBhcmUqL1xuICAvKiBleGFjdGx5IGVxdWFsLCBsUHJpbWUgaXMgZXhhY3RseSBsICogKDEgKyBhbHBoYSkgYW5kIGFkZGluZyBvbmUgaXMgd3JvbmcqL1xuICByZXR1cm4gZXhhY3QgPyBzY2FsZWRTZWNvbmRhcnkgOiAxbiArIHNjYWxlZFNlY29uZGFyeTtcbn07XG5cbi8qIENhbGN1bGF0ZSBob3cgbWFueSB1bmRlcmx5aW5nIHRva2VucyAoaW4gdGhlIGZvcm0gb2YgYSB2YWx1ZSkgc2hvdWxkIGJlKi9cbi8qIHJldHVybmVkIHdoZW4gcmVtb3ZpbmcgbGlxdWlkaXR5LiovJGjNj19vbmNlLmNhbGNTZWNvbmRhcnlSZXF1aXJlZChjYWxjU2Vjb25kYXJ5UmVxdWlyZWQpO1xuICAgICAgIGNvbnN0IGNhbGNWYWx1ZVRvUmVtb3ZlID0gKFxuICBsaXFUb2tlblN1cHBseSxcbiAgcG9vbFZhbHVlLFxuICBsaXF1aWRpdHlWYWx1ZUluLFxuKSA9PiB7XG4gIGxpcVRva2VuU3VwcGx5ID0gTmF0KGxpcVRva2VuU3VwcGx5KTtcbiAgbGlxdWlkaXR5VmFsdWVJbiA9IE5hdChsaXF1aWRpdHlWYWx1ZUluKTtcbiAgcG9vbFZhbHVlID0gTmF0KHBvb2xWYWx1ZSk7XG5cbiAgcmV0dXJuIGZsb29yRGl2aWRlKG11bHRpcGx5KGxpcXVpZGl0eVZhbHVlSW4sIHBvb2xWYWx1ZSksIGxpcVRva2VuU3VwcGx5KTtcbn07JGjNj19vbmNlLmNhbGNWYWx1ZVRvUmVtb3ZlKGNhbGNWYWx1ZVRvUmVtb3ZlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdldElucHV0UHJpY2UiOlsiZ2V0SW5wdXRQcmljZSJdLCJnZXRPdXRwdXRQcmljZSI6WyJnZXRPdXRwdXRQcmljZSJdLCJjYWxjTGlxVmFsdWVUb01pbnQiOlsiY2FsY0xpcVZhbHVlVG9NaW50Il0sImNhbGNTZWNvbmRhcnlSZXF1aXJlZCI6WyJjYWxjU2Vjb25kYXJ5UmVxdWlyZWQiXSwiY2FsY1ZhbHVlVG9SZW1vdmUiOlsiY2FsY1ZhbHVlVG9SZW1vdmUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAN87WvjEUAAAxFAAANQAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9kdXJhYmlsaXR5LmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCJdLCJleHBvcnRzIjpbIm1ha2VFcGhlbWVyYVByb3ZpZGVyIiwicHJvdmlkZUFsbCIsInByb3ZpZGVFbXB0eVNlYXQiLCJwcm92aWRlU2luZ2xldG9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYWxsVmFsdWVzLG9iamVjdE1hcCxwcm92aWRlLEU7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJhbGxWYWx1ZXNcIixbJGjNj19hID0+IChhbGxWYWx1ZXMgPSAkaM2PX2EpXV0sW1wib2JqZWN0TWFwXCIsWyRozY9fYSA9PiAob2JqZWN0TWFwID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wicHJvdmlkZVwiLFskaM2PX2EgPT4gKHByb3ZpZGUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG4vKipcbiAqIEBpbXBvcnQge01hcFN0b3JlfSBmcm9tICdAYWdvcmljL3N3aW5nc2V0LWxpdmVzbG90cyc7XG4gKiBAaW1wb3J0IHtCYWdnYWdlfSBmcm9tICdAYWdvcmljL3N3aW5nc2V0LWxpdmVzbG90cyc7XG4gKiBAaW1wb3J0IHtaQ0YsIFpDRlNlYXR9IGZyb20gJ0BhZ29yaWMvem9lJztcbiAqIEBpbXBvcnQge0VSZWZ9IGZyb20gJ0BhZ29yaWMvdm93JztcbiAqL1xuXG4vKipcbiAqIFNDQUxFOiBPbmx5IGZvciBsb3cgY2FyZGluYWxpdHkgcHJvdmlzaW9uaW5nLiBFdmVyeSB2YWx1ZSBmcm9tIGluaXQoKSB3aWxsXG4gKiByZW1haW4gaW4gdGhlIG1hcCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBoZWFwLiBJZiBhIGtleSBvYmplY3QgaXMgR0NlZCwgaXRzXG4gKiByZXByZXNlbnRhdGl2ZSBhbHNvIHJlbWFpbnMuXG4gKlxuICogQHRlbXBsYXRlIHt7fX0gRSBFcGhlbWVyYWwgc3RhdGVcbiAqIEB0ZW1wbGF0ZSB7V2Vha0tleX0gSyBrZXkgb24gd2hpY2ggdG8gcHJvdmlzaW9uXG4gKiBAcGFyYW0geyhrZXk6IEspID0+IEV9IGluaXRcbiAqL1xuICAgICAgIGNvbnN0IG1ha2VFcGhlbWVyYVByb3ZpZGVyID0gaW5pdCA9PiB7XG4gIC8qKiBAdHlwZSB7V2Vha01hcDxLLCBFPn0gKi9cbiAgY29uc3QgZXh0YW50ID0gbmV3IFdlYWtNYXAoKTtcblxuICAvKipcbiAqIFByb3ZpZGUgYW4gb2JqZWN0IHRvIGhvbGQgc3RhdGUgdGhhdCBuZWVkIG5vdCAob3IgY2Fubm90KSBiZSBkdXJhYmxlLlxuICpcbiAqIEB0eXBlIHsoa2V5OiBLKSA9PiBFfVxuICovXG4gIHJldHVybiBrZXkgPT4ge1xuICAgIGlmIChleHRhbnQuaGFzKGtleSkpIHtcbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG4gICAgICByZXR1cm4gZXh0YW50LmdldChrZXkpO1xuICAgIH1cbiAgICBjb25zdCBuZXdFcGggPSBpbml0KGtleSk7XG4gICAgZXh0YW50LnNldChrZXksIG5ld0VwaCk7XG4gICAgcmV0dXJuIG5ld0VwaDtcbiAgfTtcbn07JGjNj19vbmNlLm1ha2VFcGhlbWVyYVByb3ZpZGVyKG1ha2VFcGhlbWVyYVByb3ZpZGVyKTtcbmhhcmRlbihtYWtlRXBoZW1lcmFQcm92aWRlcik7XG5cbi8qKlxuICogUHJvdmlkZSBhbiBlbXB0eSBaQ0Ygc2VhdC5cbiAqXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7WkNGU2VhdH1cbiAqL1xuICAgICAgIGNvbnN0IHByb3ZpZGVFbXB0eVNlYXQgPSAoemNmLCBiYWdnYWdlLCBuYW1lKSA9PiB7XG4gIHJldHVybiBwcm92aWRlKGJhZ2dhZ2UsIG5hbWUsICgpID0+IHpjZi5tYWtlRW1wdHlTZWF0S2l0KCkuemNmU2VhdCk7XG59OyRozY9fb25jZS5wcm92aWRlRW1wdHlTZWF0KHByb3ZpZGVFbXB0eVNlYXQpO1xuaGFyZGVuKHByb3ZpZGVFbXB0eVNlYXQpO1xuXG4vKipcbiAqIEZvciB1c2UgaW4gY29udHJhY3QgdXBncmFkZXMgdG8gcHJvdmlkZSB2YWx1ZXMgdGhhdCBjb21lIGZyb20gb3RoZXIgdmF0cy5cbiAqIEFsbCB2YXRzIG11c3QgYmUgYWJsZSB0byBmaW5pc2ggdGhlaXIgdXBncmFkZSB3aXRob3V0IGNvbnRhY3Rpbmcgb3RoZXIgdmF0cyxcbiAqIHNvIHdoYXRldmVyIHZhbHVlcyBhbiBpbnN0YW5jZSBuZWVkcyBmcm9tIG90aGVyIHZhdHMgbXVzdCBiZSBzYXZlZCBpbiB0aGUgZmlyc3RcbiAqIGluY2FybmF0aW9uIGFuZCByZWFkIGZyb20gYmFnZ2FnZSBpbiBlYWNoIHN1YnNlcXVlbnQuXG4gKlxuICogVGhpcyBhYnN0cmFjdHMgdGhhdCBjb25kaXRpb24gc28gdGhhdCB0aGUgY29udHJhY3QgY2FuIGNvbnZlcnQgYSBkaWN0aW9uYXJ5XG4gKiBvZiB0aHVua3MgaW50byBhIGRpY3Rpb25hcnkgb2YgdmFsdWVzIGR1cmluZyBpdHMgZmlyc3QgYHByZXBhcmVgIChzdGFydCkuXG4gKiBFYWNoIHN1YnNlcXVlbnQgYHByZXBhcmVgIGNhbGwgd2lsbCBhdXRvbWF0aWNhbGx5IHJlYWQgZnJvbSB0aGUgYmFnZ2FnZSBhbmRcbiAqIGVzY2hldyByZW1vdGUgY2FsbHMuXG4gKlxuICogVGhlIHZhbHVlcyBhcmUgdGh1bmtzIGluc3RlYWQgb2YgcHJvbWlzZXMgc28gdGhhdCB0aGV5IGRvbid0IHN0YXJ0IGV4ZWN1dGluZ1xuICogdW5uZWNlc3NhcmlseSBvciBpbmR1Y2UgZmFpbHVyZXMuXG4gKlxuICogRm9yIGV4YW1wbGUsXG4gKlxuICogICAgIGNvbnN0IGludml0YXRpb25Jc3N1ZXJQID0gRSh6b2UpLmdldEludml0YXRpb25Jc3N1ZXIoKTtcbiAqICAgICBjb25zdCB7XG4gKiAgICAgICBpbnZpdGF0aW9uSXNzdWVyLFxuICogICAgICAgaW52aXRhdGlvbkJyYW5kLFxuICogICAgIH0gPSBhd2FpdCBwcm92aWRlQWxsKGJhZ2dhZ2UsIHtcbiAqICAgICAgIGludml0YXRpb25Jc3N1ZXI6ICgpID0+IGludml0YXRpb25Jc3N1ZXJQLFxuICogICAgICAgaW52aXRhdGlvbkJyYW5kOiAoKSA9PiBFKGludml0YXRpb25Jc3N1ZXJQKS5nZXRCcmFuZCgpLFxuICogICAgIH0pO1xuICpcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZywgKCkgPT4gRVJlZjxhbnk+Pn0gVCBkaWN0IG9mIHRodW5rcyAocHJvbWlzZSBtYWtlcnMpXG4gKiBAcGFyYW0ge01hcFN0b3JlPHN0cmluZywgYW55Pn0gYmFnZ2FnZVxuICogQHBhcmFtIHtUfSB0aHVua3NcbiAqIEByZXR1cm5zIHtQcm9taXNlPHsgW0sgaW4ga2V5b2YgVF06IEF3YWl0ZWQ8UmV0dXJuVHlwZTxUW0tdPj4gfT59XG4gKi9cbiAgICAgICBjb25zdCBwcm92aWRlQWxsID0gKGJhZ2dhZ2UsIHRodW5rcykgPT4ge1xuICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXModGh1bmtzKTtcbiAgLyogYXNzdW1lIGlmIGFueSBrZXlzIGFyZSBkZWZpbmVkIHRoZXkgYWxsIGFyZSovXG4gIGNvbnN0IGluQmFnZ2FnZSA9IGJhZ2dhZ2UuaGFzKGtleXNbMF0pO1xuICBpZiAoaW5CYWdnYWdlKSB7XG4gICAgY29uc3Qgb2JqID0gb2JqZWN0TWFwKFxuICAgICAgdGh1bmtzLFxuICAgICAgLyoqIEB0eXBlIHsodmFsdWU6IGFueSwga2V5OiBzdHJpbmcpID0+IGFueX0gKi9cbiAgICAgIChfLCBrKSA9PiBiYWdnYWdlLmdldChrKSxcbiAgICApO1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoaGFyZGVuKG9iaikpO1xuICB9XG5cbiAgY29uc3Qga2V5ZWRQcm9taXNlcyA9IG9iamVjdE1hcCh0aHVua3MsIGZuID0+IGZuKCkpO1xuXG4gIHJldHVybiBhbGxWYWx1ZXMoa2V5ZWRQcm9taXNlcykudGhlbihrZXllZFZhbHMgPT4ge1xuICAgIGZvciAoY29uc3QgW2ssIHZdIG9mIE9iamVjdC5lbnRyaWVzKGtleWVkVmFscykpIHtcbiAgICAgIGJhZ2dhZ2UuaW5pdChrLCB2KTtcbiAgICB9XG4gICAgcmV0dXJuIGtleWVkVmFscztcbiAgfSk7XG59OyRozY9fb25jZS5wcm92aWRlQWxsKHByb3ZpZGVBbGwpO1xuaGFyZGVuKHByb3ZpZGVBbGwpO1xuXG4vKipcbiAqIExpa2UgcHJvdmlkZUFzeW5jIGluIEF0b21pY1Byb3ZpZGVyIGJ1dCBhc3N1bWVzIG9ubHkgb25lIGNhbGwgc28gdGhlcmUgYXJlIG5vIHJhY2UgY29uZGl0aW9ucy5cbiAqIEFkZGl0aW9uYWxseSBvZmZlcnMgYSBgd2l0aFZhbHVlYCBoZWxwZXIgdXNlZnVsIGZvciB0cmlnZ2VyaW5nIHByb2Nlc2VzcyBvbiBhIHByb3ZpZGVkIG9iamVjdC5cbiAqXG4gKiBAc2VlIHttYWtlQXRvbWljUHJvdmlkZXJ9XG4gKiBAc2VlIHtBdG9taWNQcm92aWRlcn1cbiAqIEB0ZW1wbGF0ZSB7KCkgPT4gRVJlZjxhbnk+fSBUXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IG1hcFN0b3JlXG4gKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gKiBAcGFyYW0ge1R9IG1ha2VWYWx1ZVxuICogQHBhcmFtIHsodmFsdWU6IEF3YWl0ZWQ8UmV0dXJuVHlwZTxUPj4pID0+IHZvaWR9IFt3aXRoVmFsdWVdXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBd2FpdGVkPFJldHVyblR5cGU8VD4+Pn1cbiAqL1xuICAgICAgIGNvbnN0IHByb3ZpZGVTaW5nbGV0b24gPSAobWFwU3RvcmUsIGtleSwgbWFrZVZhbHVlLCB3aXRoVmFsdWUpID0+IHtcbiAgY29uc3Qgc3RvcmVkID0gbWFwU3RvcmUuaGFzKGtleSlcbiAgICA/IHVuZGVmaW5lZFxuICAgIDogRS53aGVuKG1ha2VWYWx1ZSgpLCB2ID0+IG1hcFN0b3JlLmluaXQoa2V5LCBoYXJkZW4odikpKTtcblxuICByZXR1cm4gRS53aGVuKHN0b3JlZCwgKCkgPT4ge1xuICAgIGNvbnN0IHZhbHVlID0gbWFwU3RvcmUuZ2V0KGtleSk7XG4gICAgaWYgKHdpdGhWYWx1ZSkge1xuICAgICAgd2l0aFZhbHVlKHZhbHVlKTtcbiAgICB9XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9KTtcbn07JGjNj19vbmNlLnByb3ZpZGVTaW5nbGV0b24ocHJvdmlkZVNpbmdsZXRvbik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRXBoZW1lcmFQcm92aWRlciI6WyJtYWtlRXBoZW1lcmFQcm92aWRlciJdLCJwcm92aWRlRW1wdHlTZWF0IjpbInByb3ZpZGVFbXB0eVNlYXQiXSwicHJvdmlkZUFsbCI6WyJwcm92aWRlQWxsIl0sInByb3ZpZGVTaW5nbGV0b24iOlsicHJvdmlkZVNpbmdsZXRvbiJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC1mK84pggAAKYIAAAwAAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vYm9uZGluZ0N1cnZlcy5qcyIsIkBhZ29yaWMvZXJ0cC9zcmMvc2FmZU1hdGguanMiLCIuL3N0YXRlTWFjaGluZS5qcyIsIi4vYXRvbWljVHJhbnNmZXIuanMiLCIuL3pvZUhlbHBlcnMuanMiLCJAYWdvcmljL2VydHAvc3JjL3JhdGlvLmpzIiwiLi9kdXJhYmlsaXR5LmpzIiwiLi9wcmVwYXJlLW93bmFibGUuanMiLCIuL3ByaWNlQXV0aG9yaXR5LmpzIiwiLi9wcmljZVF1b3RlLmpzIiwiLi9yZWNvcmRlci5qcyIsIi4vc3RhdGlzdGljcy5qcyIsIi4vdG9waWNzLmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0TmF0QXNzZXRLaW5kIiwiYXNzZXJ0TmF0QXNzZXRLaW5kIiwiYXRvbWljVHJhbnNmZXIiLCJhdG9taWNUcmFuc2ZlciIsImNhbGNTZWNvbmRhcnlSZXF1aXJlZCIsImNhbGNTZWNvbmRhcnlSZXF1aXJlZCIsbnVsbCxudWxsXSwicmVleHBvcnRzIjpbIi4vZHVyYWJpbGl0eS5qcyIsIi4vcHJlcGFyZS1vd25hYmxlLmpzIiwiLi9wcmljZUF1dGhvcml0eS5qcyIsIi4vcHJpY2VRdW90ZS5qcyIsIi4vcmVjb3JkZXIuanMiLCIuL3N0YXRpc3RpY3MuanMiLCIuL3RvcGljcy5qcyIsIkBhZ29yaWMvZXJ0cC9zcmMvcmF0aW8uanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9ib25kaW5nQ3VydmVzLmpzXCIsIFtdXSxbXCJAYWdvcmljL2VydHAvc3JjL3NhZmVNYXRoLmpzXCIsIFtdXSxbXCIuL3N0YXRlTWFjaGluZS5qc1wiLCBbXV0sW1wiLi9hdG9taWNUcmFuc2Zlci5qc1wiLCBbXV0sW1wiLi96b2VIZWxwZXJzLmpzXCIsIFtdXSxbXCJAYWdvcmljL2VydHAvc3JjL3JhdGlvLmpzXCIsIFtdXSxbXCIuL2R1cmFiaWxpdHkuanNcIiwgW11dLFtcIi4vcHJlcGFyZS1vd25hYmxlLmpzXCIsIFtdXSxbXCIuL3ByaWNlQXV0aG9yaXR5LmpzXCIsIFtdXSxbXCIuL3ByaWNlUXVvdGUuanNcIiwgW11dLFtcIi4vcmVjb3JkZXIuanNcIiwgW11dLFtcIi4vc3RhdGlzdGljcy5qc1wiLCBbXV0sW1wiLi90b3BpY3MuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL2JvbmRpbmdDdXJ2ZXMuanMiOltbImNhbGNMaXFWYWx1ZVRvTWludCIsImNhbGNMaXFWYWx1ZVRvTWludCJdLFsiY2FsY1NlY29uZGFyeVJlcXVpcmVkIiwiY2FsY1NlY29uZGFyeVJlcXVpcmVkIl0sWyJjYWxjVmFsdWVUb1JlbW92ZSIsImNhbGNWYWx1ZVRvUmVtb3ZlIl0sWyJnZXRJbnB1dFByaWNlIiwiZ2V0SW5wdXRQcmljZSJdLFsiZ2V0T3V0cHV0UHJpY2UiLCJnZXRPdXRwdXRQcmljZSJdXSwiQGFnb3JpYy9lcnRwL3NyYy9zYWZlTWF0aC5qcyI6W1sibmF0U2FmZU1hdGgiLCJuYXRTYWZlTWF0aCJdXSwiLi9zdGF0ZU1hY2hpbmUuanMiOltbIm1ha2VTdGF0ZU1hY2hpbmUiLCJtYWtlU3RhdGVNYWNoaW5lIl1dLCIuL2F0b21pY1RyYW5zZmVyLmpzIjpbWyJhdG9taWNSZWFycmFuZ2UiLCJhdG9taWNSZWFycmFuZ2UiXSxbImF0b21pY1RyYW5zZmVyIiwiYXRvbWljVHJhbnNmZXIiXSxbImZyb21Pbmx5IiwiZnJvbU9ubHkiXSxbInRvT25seSIsInRvT25seSJdXSwiLi96b2VIZWxwZXJzLmpzIjpbWyJhc3NlcnRJc3N1ZXJLZXl3b3JkcyIsImFzc2VydElzc3VlcktleXdvcmRzIl0sWyJhc3NlcnROYXRBc3NldEtpbmQiLCJhc3NlcnROYXRBc3NldEtpbmQiXSxbImFzc2VydFByb3Bvc2FsU2hhcGUiLCJhc3NlcnRQcm9wb3NhbFNoYXBlIl0sWyJkZWZhdWx0QWNjZXB0YW5jZU1zZyIsImRlZmF1bHRBY2NlcHRhbmNlTXNnIl0sWyJkZXBvc2l0VG9TZWF0IiwiZGVwb3NpdFRvU2VhdCJdLFsiZml0UHJvcG9zYWxTaGFwZSIsImZpdFByb3Bvc2FsU2hhcGUiXSxbIm9mZmVyVG8iLCJvZmZlclRvIl0sWyJzYXRpc2ZpZXMiLCJzYXRpc2ZpZXMiXSxbInNhdmVBbGxJc3N1ZXJzIiwic2F2ZUFsbElzc3VlcnMiXSxbInN3YXAiLCJzd2FwIl0sWyJzd2FwRXhhY3QiLCJzd2FwRXhhY3QiXSxbIndpdGhkcmF3RnJvbVNlYXQiLCJ3aXRoZHJhd0Zyb21TZWF0Il1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB8zuEBqw8AAKsPAAA6AAAAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3ByZXBhcmUtb3duYWJsZS5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2Jhc2Utem9uZS96b25lLWhlbHBlcnMuanMiLCJAZW5kby9wYXR0ZXJucyIsIi4uL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6WyJwcmVwYXJlT3duYWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHByZXBhcmVSZXZvY2FibGVNYWtlcktpdCxNLE9mZmVySGFuZGxlckk7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL2Jhc2Utem9uZS96b25lLWhlbHBlcnMuanNcIiwgW1tcInByZXBhcmVSZXZvY2FibGVNYWtlcktpdFwiLFskaM2PX2EgPT4gKHByZXBhcmVSZXZvY2FibGVNYWtlcktpdCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3BhdHRlcm5zXCIsIFtbXCJNXCIsWyRozY9fYSA9PiAoTSA9ICRozY9fYSldXV1dLFtcIi4uL3R5cGVHdWFyZHMuanNcIiwgW1tcIk9mZmVySGFuZGxlcklcIixbJGjNj19hID0+IChPZmZlckhhbmRsZXJJID0gJGjNj19hKV1dXV1dKTtcblxuXG5cbi8qKlxuICogQGltcG9ydCB7Wm9uZX0gZnJvbSAnQGFnb3JpYy9iYXNlLXpvbmUnO1xuICogQGltcG9ydCB7WkNGfSBmcm9tICdAYWdvcmljL3pvZSc7XG4gKiBAaW1wb3J0IHtJbnZpdGF0aW9ufSBmcm9tICcuLi90eXBlcy1pbmRleC5qcyc7XG4gKi9cblxuY29uc3QgVHJhbnNmZXJQcm9wb3NhbFNoYXBlID0gTS5zcGxpdFJlY29yZCh7XG4gIGdpdmU6IHt9LFxuICB3YW50OiB7fSxcbiAgZXhpdDoge1xuICAgIG9uRGVtYW5kOiBudWxsLFxuICB9LFxufSk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gT3duYWJsZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdUludGVyZmFjZU5hbWVdXG4gKiAgIFRoZSBgaW50ZXJmYWNlTmFtZWAgb2YgdGhlIHVuZGVybHlpbmcgaW50ZXJmYWNlIGd1YXJkLlxuICogICBEZWZhdWx0cyB0byB0aGUgYHVLaW5kTmFtZWAuXG4gKi9cblxuLyoqXG4gKiBQcmVwYXJlIGEga2luZCB0aGF0IHdyYXBzIGFuICdvd25hYmxlJyBvYmplY3Qgd2l0aCBhIGBtYWtlVHJhbnNmZXJJbnZpdGF0aW9uYFxuICogYWJpbGl0eSBhbmQgZGVsZWdhdGVzIHRvIHRoZSB1bmRlcmx5aW5nIG9iamVjdCBtZXRob2RzIHNwZWNpZmllZCBpbiBhblxuICogYWxsb3dsaXN0IG9mIG1ldGhvZCBuYW1lcy5cbiAqXG4gKiBAdGVtcGxhdGUgeyhzdHJpbmcgfCBzeW1ib2wpW119IE1OIE1ldGhvZCBuYW1lc1xuICogQHBhcmFtIHtab25lfSB6b25lXG4gKiBAcGFyYW0ge1pDRlsnbWFrZUludml0YXRpb24nXX0gbWFrZUludml0YXRpb25cbiAqICAgQSBmdW5jdGlvbiB3aXRoIHRoZSBzYW1lIGJlaGF2aW9yIGFzIGB6Y2YubWFrZUludml0YXRpb25gLlxuICogICBBIGNvbnRyYWN0IHdpbGwgbm9ybWFsbHkganVzdCBleHRyYWN0IGl0IGZyb20gaXRzIG93biB6Y2YgdXNpbmcgdGhlXG4gKiAgIGFyZ3VtZW50IGV4cHJlc3Npb25cbiAqICAgYGBganNcbiAqICAgKC4uLmFyZ3MpID0+IHpjZi5tYWtlSW52aXRhdGlvbiguLi5hcmdzKVxuICogICBgYGBcbiAqICAgU2VlIG93bmFibGUtY291bnRlci5qcyBmb3IgdGhlIGNhbm9uaWNhbCBleGFtcGxlLlxuICogQHBhcmFtIHtzdHJpbmd9IHVLaW5kTmFtZVxuICogICBUaGUgYGtpbmROYW1lYCBvZiB0aGUgdW5kZXJseWluZyBleG8gY2xhc3NcbiAqIEBwYXJhbSB7TU59IHVNZXRob2ROYW1lc1xuICogICBUaGUgbWV0aG9kIG5hbWVzIG9mIHRoZSB1bmRlcmx5aW5nIGV4byBjbGFzcyB0aGF0IHNob3VsZCBiZSByZXByZXNlbnRlZFxuICogICBieSB0cmFuc3BhcmVudGx5LWZvcndhcmRpbmcgbWV0aG9kcyBvZiB0aGUgd3JhcHBpbmcgb3duYWJsZSBvYmplY3QuXG4gKiBAcGFyYW0ge093bmFibGVPcHRpb25zfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHs8VT4odW5kZXJseWluZzogVSkgPT4gUGFydGlhbDxVPiAmIHttYWtlVHJhbnNmZXJJbnZpdGF0aW9uOiAoKSA9PiBJbnZpdGF0aW9uPFU+fX1cbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVPd25hYmxlID0gKFxuICB6b25lLFxuICBtYWtlSW52aXRhdGlvbixcbiAgdUtpbmROYW1lLFxuICB1TWV0aG9kTmFtZXMsXG4gIG9wdGlvbnMgPSB7fSxcbikgPT4ge1xuICBjb25zdCB7IHVJbnRlcmZhY2VOYW1lID0gdUtpbmROYW1lIH0gPSBvcHRpb25zO1xuICBjb25zdCB7IHJldm9rZSwgbWFrZVJldm9jYWJsZSB9ID0gcHJlcGFyZVJldm9jYWJsZU1ha2VyS2l0KFxuICAgIHpvbmUsXG4gICAgdUtpbmROYW1lLFxuICAgIHVNZXRob2ROYW1lcyxcbiAgICB7XG4gICAgICB1SW50ZXJmYWNlTmFtZSxcbiAgICAgIGV4dHJhTWV0aG9kR3VhcmRzOiB7XG4gICAgICAgIG1ha2VUcmFuc2Zlckludml0YXRpb246IE0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICAgICAgfSxcbiAgICAgIGV4dHJhTWV0aG9kczoge1xuICAgICAgICBtYWtlVHJhbnNmZXJJbnZpdGF0aW9uKCkge1xuICAgICAgICAgIGNvbnN0IHsgdW5kZXJseWluZyB9ID0gdGhpcy5zdGF0ZTtcbiAgICAgICAgICBjb25zdCB7IHJldm9jYWJsZSB9ID0gdGhpcy5mYWNldHM7XG4gICAgICAgICAgY29uc3QgY3VzdG9tRGV0YWlscyA9IHVuZGVybHlpbmcuZ2V0SW52aXRhdGlvbkN1c3RvbURldGFpbHMoKTtcbiAgICAgICAgICBjb25zdCB0cmFuc2ZlckhhbmRsZXIgPSBtYWtlVHJhbnNmZXJIYW5kbGVyKHVuZGVybHlpbmcpO1xuXG4gICAgICAgICAgY29uc3QgaW52aXRhdGlvbiA9IG1ha2VJbnZpdGF0aW9uKFxuICAgICAgICAgICAgdHJhbnNmZXJIYW5kbGVyLFxuICAgICAgICAgICAgJ3RyYW5zZmVyJyxcbiAgICAgICAgICAgIGN1c3RvbURldGFpbHMsXG4gICAgICAgICAgICBUcmFuc2ZlclByb3Bvc2FsU2hhcGUsXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXZva2UocmV2b2NhYmxlKTtcbiAgICAgICAgICByZXR1cm4gaW52aXRhdGlvbjtcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgfSxcbiAgKTtcblxuICBjb25zdCBtYWtlVHJhbnNmZXJIYW5kbGVyID0gem9uZS5leG9DbGFzcyhcbiAgICAnVHJhbnNmZXJIYW5kbGVyJyxcbiAgICBPZmZlckhhbmRsZXJJLFxuICAgIHVuZGVybHlpbmcgPT4gKHtcbiAgICAgIHVuZGVybHlpbmcsXG4gICAgfSksXG4gICAge1xuICAgICAgaGFuZGxlKHNlYXQpIHtcbiAgICAgICAgY29uc3QgeyB1bmRlcmx5aW5nIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICBjb25zdCByZXZvY2FibGUgPSBtYWtlUmV2b2NhYmxlKHVuZGVybHlpbmcpO1xuICAgICAgICBzZWF0LmV4aXQoKTtcbiAgICAgICAgcmV0dXJuIHJldm9jYWJsZTtcbiAgICAgIH0sXG4gICAgfSxcbiAgKTtcblxuICBjb25zdCBtYWtlT3duYWJsZSA9IHVuZGVybHlpbmcgPT4gbWFrZVJldm9jYWJsZSh1bmRlcmx5aW5nKTtcbiAgLyogVXNpbmcgYXQtdHMtaWdub3JlIHJhdGhlciB0aGFuIGF0LXRzLWV4cGVjdC1lcnJvciBiZWNhdXNlIHRoZSB2c2NvZGUqL1xuICAvKiB0cyBzZXJ2ZXIgc2F5cyBpdCBpcyBhbiBlcnJvciBidXQgYHlhcm4gbGludGAgc2F5cyBpdCBpcyBub3QuKi9cbiAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9iYW4tdHMtY29tbWVudCovXG4gIC8qIEB0cy1pZ25vcmUgUmV0dXJuIHR5cGUgaXMgbW9yZSBwcmVjaXNlIHRoYW4gcmV2b2NhYmxlIHN1cHBvcnRzKi9cbiAgcmV0dXJuIGhhcmRlbihtYWtlT3duYWJsZSk7XG59OyRozY9fb25jZS5wcmVwYXJlT3duYWJsZShwcmVwYXJlT3duYWJsZSk7XG5oYXJkZW4ocHJlcGFyZU93bmFibGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZU93bmFibGUiOlsicHJlcGFyZU93bmFibGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA2cqrUYk1AACJNQAAOQAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9wcmljZUF1dGhvcml0eS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL3Byb21pc2Uta2l0IiwiQGFnb3JpYy9lcnRwIiwiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvbm90aWZpZXIiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy90aW1lIl0sImV4cG9ydHMiOlsiUHJpY2VBdXRob3JpdHlJIiwibWFrZU9uZXdheVByaWNlQXV0aG9yaXR5S2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxxLEUsRmFyLG1ha2VQcm9taXNlS2l0LEFtb3VudE1hdGgsQW1vdW50U2hhcGUsQnJhbmRTaGFwZSxtYWtlVHJhY2VyLG1ha2VOb3RpZmllcixNLFRpbWVzdGFtcFNoYXBlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcIm1ha2VQcm9taXNlS2l0XCIsWyRozY9fYSA9PiAobWFrZVByb21pc2VLaXQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFtb3VudE1hdGhcIixbJGjNj19hID0+IChBbW91bnRNYXRoID0gJGjNj19hKV1dLFtcIkFtb3VudFNoYXBlXCIsWyRozY9fYSA9PiAoQW1vdW50U2hhcGUgPSAkaM2PX2EpXV0sW1wiQnJhbmRTaGFwZVwiLFskaM2PX2EgPT4gKEJyYW5kU2hhcGUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJtYWtlVHJhY2VyXCIsWyRozY9fYSA9PiAobWFrZVRyYWNlciA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcIm1ha2VOb3RpZmllclwiLFskaM2PX2EgPT4gKG1ha2VOb3RpZmllciA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy90aW1lXCIsIFtbXCJUaW1lc3RhbXBTaGFwZVwiLFskaM2PX2EgPT4gKFRpbWVzdGFtcFNoYXBlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtQcmljZUF1dGhvcml0eSwgUHJpY2VEZXNjcmlwdGlvbiwgUHJpY2VRdW90ZSwgUHJpY2VRdW90ZVZhbHVlLCBQcmljZVF1ZXJ5LCBQcmljZVF1b3RlQ3JlYXRlLCBQcmljZUF1dGhvcml0eUtpdCwgUHJpY2VRdW90ZVRyaWdnZXIsIE11dGFibGVRdW90ZSx9IGZyb20gJ0BhZ29yaWMvem9lL3Rvb2xzL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge05vdGlmaWVyfSBmcm9tICdAYWdvcmljL25vdGlmaWVyJztcbiAqIEBpbXBvcnQge1RpbWVyU2VydmljZX0gZnJvbSAnQGFnb3JpYy90aW1lJztcbiAqIEBpbXBvcnQge0Ftb3VudH0gZnJvbSAnQGFnb3JpYy9lcnRwJztcbiAqIEBpbXBvcnQge0lzc3Vlcn0gZnJvbSAnQGFnb3JpYy9lcnRwJztcbiAqIEBpbXBvcnQge0JyYW5kfSBmcm9tICdAYWdvcmljL2VydHAnO1xuICogQGltcG9ydCB7UHJvbWlzZVJlY29yZH0gZnJvbSAnQGVuZG8vcHJvbWlzZS1raXQnO1xuICogQGltcG9ydCB7RVJlZn0gZnJvbSAnQGFnb3JpYy92b3cnO1xuICovXG5cbmNvbnN0IHRyYWNlID0gbWFrZVRyYWNlcignUEEnLCBmYWxzZSk7XG5cbi8qKlxuICogQGNhbGxiYWNrIENvbXBhcmVBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRMaW1pdFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cblxuLyoqIEB0eXBlIHtDb21wYXJlQW1vdW50fSAqL1xuY29uc3QgaXNMVCA9IChhbW91bnQsIGFtb3VudExpbWl0KSA9PiAhQW1vdW50TWF0aC5pc0dURShhbW91bnQsIGFtb3VudExpbWl0KTtcblxuLyoqIEB0eXBlIHtDb21wYXJlQW1vdW50fSAqL1xuY29uc3QgaXNMVEUgPSAoYW1vdW50LCBhbW91bnRMaW1pdCkgPT4gQW1vdW50TWF0aC5pc0dURShhbW91bnRMaW1pdCwgYW1vdW50KTtcblxuLyoqIEB0eXBlIHtDb21wYXJlQW1vdW50fSAqL1xuY29uc3QgaXNHVEUgPSAoYW1vdW50LCBhbW91bnRMaW1pdCkgPT4gQW1vdW50TWF0aC5pc0dURShhbW91bnQsIGFtb3VudExpbWl0KTtcblxuLyoqIEB0eXBlIHtDb21wYXJlQW1vdW50fSAqL1xuY29uc3QgaXNHVCA9IChhbW91bnQsIGFtb3VudExpbWl0KSA9PiAhQW1vdW50TWF0aC5pc0dURShhbW91bnRMaW1pdCwgYW1vdW50KTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgVHJpZ2dlclxuICogQHBhcmFtIHtQcmljZVF1b3RlQ3JlYXRlfSBjcmVhdGVJbnN0YW50UXVvdGVcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5cbmNvbnN0IEd1YXJkQ2FsbEFtb3VudFR1cGxlID0gTS5jYWxsKEFtb3VudFNoYXBlLCBBbW91bnRTaGFwZSkucmV0dXJucyhcbiAgTS5wcm9taXNlKCksXG4pO1xuICAgICAgIGNvbnN0IFByaWNlQXV0aG9yaXR5SSA9IE0uaW50ZXJmYWNlKCdQcmljZUF1dGhvcml0eScsIHtcbiAgZ2V0UXVvdGVJc3N1ZXI6IE0uY2FsbChCcmFuZFNoYXBlLCBCcmFuZFNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgZ2V0VGltZXJTZXJ2aWNlOiBNLmNhbGwoQnJhbmRTaGFwZSwgQnJhbmRTaGFwZSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIHF1b3RlR2l2ZW46IE0uY2FsbChBbW91bnRTaGFwZSwgQnJhbmRTaGFwZSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIHF1b3RlV2FudGVkOiBNLmNhbGwoQnJhbmRTaGFwZSwgQW1vdW50U2hhcGUpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBtYWtlUXVvdGVOb3RpZmllcjogTS5jYWxsKEFtb3VudFNoYXBlLCBCcmFuZFNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgcXVvdGVBdFRpbWU6IE0uY2FsbChUaW1lc3RhbXBTaGFwZSwgQW1vdW50U2hhcGUsIEJyYW5kU2hhcGUpLnJldHVybnMoXG4gICAgTS5wcm9taXNlKCksXG4gICksXG4gIHF1b3RlV2hlbkxUOiBHdWFyZENhbGxBbW91bnRUdXBsZSxcbiAgcXVvdGVXaGVuTFRFOiBHdWFyZENhbGxBbW91bnRUdXBsZSxcbiAgcXVvdGVXaGVuR1RFOiBHdWFyZENhbGxBbW91bnRUdXBsZSxcbiAgcXVvdGVXaGVuR1Q6IEd1YXJkQ2FsbEFtb3VudFR1cGxlLFxuICBtdXRhYmxlUXVvdGVXaGVuTFQ6IEd1YXJkQ2FsbEFtb3VudFR1cGxlLFxuICBtdXRhYmxlUXVvdGVXaGVuTFRFOiBHdWFyZENhbGxBbW91bnRUdXBsZSxcbiAgbXV0YWJsZVF1b3RlV2hlbkdURTogR3VhcmRDYWxsQW1vdW50VHVwbGUsXG4gIG11dGFibGVRdW90ZVdoZW5HVDogR3VhcmRDYWxsQW1vdW50VHVwbGUsXG59KTtcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0c1xuICogQHBhcmFtIHtJc3N1ZXI8J3NldCcsIFByaWNlRGVzY3JpcHRpb24+fSBvcHRzLnF1b3RlSXNzdWVyXG4gKiBAcGFyYW0ge0VSZWY8Tm90aWZpZXI8dW5rbm93bj4+fSBvcHRzLm5vdGlmaWVyXG4gKiBAcGFyYW0ge0VSZWY8VGltZXJTZXJ2aWNlPn0gb3B0cy50aW1lclxuICogQHBhcmFtIHtQcmljZVF1b3RlQ3JlYXRlfSBvcHRzLmNyZWF0ZVF1b3RlXG4gKiBAcGFyYW0ge0JyYW5kPCduYXQnPn0gb3B0cy5hY3R1YWxCcmFuZEluXG4gKiBAcGFyYW0ge0JyYW5kPCduYXQnPn0gb3B0cy5hY3R1YWxCcmFuZE91dFxuICogQHJldHVybnMge1ByaWNlQXV0aG9yaXR5S2l0fVxuICovJGjNj19vbmNlLlByaWNlQXV0aG9yaXR5SShQcmljZUF1dGhvcml0eUkpO1xuICAgICAgIGNvbnN0IG1ha2VPbmV3YXlQcmljZUF1dGhvcml0eUtpdCA9IG9wdHMgPT4ge1xuICBjb25zdCB7XG4gICAgdGltZXIsXG4gICAgY3JlYXRlUXVvdGUsXG4gICAgYWN0dWFsQnJhbmRJbixcbiAgICBhY3R1YWxCcmFuZE91dCxcbiAgICBxdW90ZUlzc3VlcixcbiAgICBub3RpZmllcixcbiAgfSA9IG9wdHM7XG5cbiAgbGV0IGhhdmVGaXJzdFF1b3RlID0gZmFsc2U7XG5cbiAgdm9pZCBFKG5vdGlmaWVyKVxuICAgIC5nZXRVcGRhdGVTaW5jZSgpXG4gICAgLnRoZW4oXyA9PiAoaGF2ZUZpcnN0UXVvdGUgPSB0cnVlKSk7XG5cbiAgLyoqIEB0eXBlIHtTZXQ8VHJpZ2dlcj59ICovXG4gIGNvbnN0IHRyaWdnZXJzID0gbmV3IFNldCgpO1xuICBjb25zdCBtdXRhYmxlVHJpZ2dlcnMgPSBuZXcgTWFwKCk7XG5cbiAgLyoqXG4gKiBAcGFyYW0ge1ByaWNlUXVvdGVDcmVhdGV9IHRyaWdnZXJDcmVhdGVRdW90ZVxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cbiAgY29uc3QgZmlyZVRyaWdnZXJzID0gYXN5bmMgdHJpZ2dlckNyZWF0ZVF1b3RlID0+IHtcbiAgICBpZiAoIWhhdmVGaXJzdFF1b3RlKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGF3YWl0IFByb21pc2UuYWxsKFxuICAgICAgWy4uLnRyaWdnZXJzLCAuLi5BcnJheS5mcm9tKG11dGFibGVUcmlnZ2Vycy52YWx1ZXMoKSldLm1hcCh0cmlnZ2VyID0+XG4gICAgICAgIHRyaWdnZXIodHJpZ2dlckNyZWF0ZVF1b3RlKSxcbiAgICAgICksXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAqIENyZWF0ZSBhIHF1b3RlV2hlbiogZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtDb21wYXJlQW1vdW50fSBjb21wYXJlQW1vdW50c0ZuXG4gKi9cbiAgY29uc3QgbWFrZVF1b3RlV2hlbk91dCA9XG4gICAgY29tcGFyZUFtb3VudHNGbiA9PlxuICAgIC8qKlxuICogUmV0dXJuIGEgcXVvdGUgd2hlbiB0cmlnZ2VyV2hlbiBpcyB0cnVlIG9mIHRoZSBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBhbW91bnRJbiB0aGUgaW5wdXQgdmFsdWUgdG8gdGhlIGNhbGNBbW91bnRUcmlnZ2VyXG4gKiBAcGFyYW0ge0Ftb3VudH0gYW1vdW50T3V0TGltaXQgdGhlIHZhbHVlIHRvIGNvbXBhcmUgd2l0aCB0aGUgb3V0cHV0XG4gKiBvZiBjYWxjQW1vdW50VHJpZ2dlclxuICovXG4gICAgYXN5bmMgKGFtb3VudEluLCBhbW91bnRPdXRMaW1pdCkgPT4ge1xuICAgICAgYW1vdW50SW4gPSBBbW91bnRNYXRoLmNvZXJjZShhY3R1YWxCcmFuZEluLCBhbW91bnRJbik7XG4gICAgICBhbW91bnRPdXRMaW1pdCA9IEFtb3VudE1hdGguY29lcmNlKGFjdHVhbEJyYW5kT3V0LCBhbW91bnRPdXRMaW1pdCk7XG5cbiAgICAgIC8qKiBAdHlwZSB7UHJvbWlzZVJlY29yZDxQcmljZVF1b3RlPn0gKi9cbiAgICAgIGNvbnN0IHRyaWdnZXJQSyA9IG1ha2VQcm9taXNlS2l0KCk7XG5cbiAgICAgIC8qKiBAdHlwZSB7UHJpY2VRdW90ZVRyaWdnZXJ9ICovXG4gICAgICBjb25zdCB0cmlnZ2VyID0gYXN5bmMgY3JlYXRlSW5zdGFudFF1b3RlID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBxdW90ZVAgPSBjcmVhdGVJbnN0YW50UXVvdGUoY2FsY0Ftb3VudE91dCA9PiB7XG4gICAgICAgICAgICBpZiAoIXRyaWdnZXJzLmhhcyh0cmlnZ2VyKSkge1xuICAgICAgICAgICAgICAvKiBBbHJlYWR5IGZpcmVkLiovXG4gICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBhbW91bnRPdXQgPSBjYWxjQW1vdW50T3V0KGFtb3VudEluKTtcblxuICAgICAgICAgICAgaWYgKCFjb21wYXJlQW1vdW50c0ZuKGFtb3VudE91dCwgYW1vdW50T3V0TGltaXQpKSB7XG4gICAgICAgICAgICAgIC8qIERvbid0IGZpcmUgdGhlIHRyaWdnZXIgeWV0LiovXG4gICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8qIEdlbmVyYXRlIHRoZSBxdW90ZS4qL1xuICAgICAgICAgICAgcmV0dXJuIHsgYW1vdW50SW4sIGFtb3VudE91dCB9O1xuICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgaWYgKCFxdW90ZVApIHtcbiAgICAgICAgICAgIC8qIFdlIHNob3VsZG4ndCByZXNvbHZlIHlldC4qL1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHRyaWdnZXJzLmRlbGV0ZSh0cmlnZ2VyKTtcbiAgICAgICAgICB0cmlnZ2VyUEsucmVzb2x2ZShxdW90ZVApO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgLyogVHJpZ2dlciBmYWlsZWQsIHNvIHJlamVjdCBhbmQgZHJvcC4qL1xuICAgICAgICAgIHRyaWdnZXJQSy5yZWplY3QoZSk7XG4gICAgICAgICAgdHJpZ2dlcnMuZGVsZXRlKHRyaWdnZXIpO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB0cmlnZ2Vycy5hZGQodHJpZ2dlcik7XG5cbiAgICAgIC8qIEZpcmUgbm93LCBqdXN0IGluIGNhc2UuKi9cbiAgICAgIGF3YWl0IHRyaWdnZXIoY3JlYXRlUXVvdGUpO1xuXG4gICAgICByZXR1cm4gdHJpZ2dlclBLLnByb21pc2U7XG4gICAgfTtcblxuICAvKipcbiAqIENyZWF0ZSBhIG11dGFibGVRdW90ZVdoZW4qIGZ1bmN0aW9uLlxuICpcbiAqIEBwYXJhbSB7Q29tcGFyZUFtb3VudH0gY29tcGFyZUFtb3VudHNGblxuICovXG4gIGNvbnN0IG1ha2VNdXRhYmxlUXVvdGUgPVxuICAgIGNvbXBhcmVBbW91bnRzRm4gPT5cbiAgICAvKipcbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gYW1vdW50SW5cbiAqIEBwYXJhbSB7QW1vdW50PCduYXQnPn0gYW1vdW50T3V0TGltaXRcbiAqL1xuICAgIGFzeW5jIChhbW91bnRJbiwgYW1vdW50T3V0TGltaXQpID0+IHtcbiAgICAgIEFtb3VudE1hdGguY29lcmNlKGFjdHVhbEJyYW5kSW4sIGFtb3VudEluKTtcbiAgICAgIEFtb3VudE1hdGguY29lcmNlKGFjdHVhbEJyYW5kT3V0LCBhbW91bnRPdXRMaW1pdCk7XG5cbiAgICAgIC8qKiBAdHlwZSB7UHJvbWlzZVJlY29yZDxQcmljZVF1b3RlPn0gKi9cbiAgICAgIGNvbnN0IHRyaWdnZXJQSyA9IG1ha2VQcm9taXNlS2l0KCk7XG5cbiAgICAgIC8qKiBAdHlwZSB7TXV0YWJsZVF1b3RlfSAqL1xuICAgICAgY29uc3QgbXV0YWJsZVF1b3RlID0gRmFyKCdNdXRhYmxlUXVvdGUnLCB7XG4gICAgICAgIGNhbmNlbDogZSA9PiB0cmlnZ2VyUEsucmVqZWN0KGUpLFxuICAgICAgICB1cGRhdGVMZXZlbDogKG5ld0Ftb3VudEluLCBuZXdBbW91bnRPdXRMaW1pdCkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvZXJjZWRBbW91bnRJbiA9IEFtb3VudE1hdGguY29lcmNlKGFjdHVhbEJyYW5kSW4sIG5ld0Ftb3VudEluKTtcbiAgICAgICAgICBjb25zdCBjb2VyY2VkQW1vdW50T3V0TGltaXQgPSBBbW91bnRNYXRoLmNvZXJjZShcbiAgICAgICAgICAgIGFjdHVhbEJyYW5kT3V0LFxuICAgICAgICAgICAgbmV3QW1vdW50T3V0TGltaXQsXG4gICAgICAgICAgKTtcbiAgICAgICAgICBhbW91bnRJbiA9IGNvZXJjZWRBbW91bnRJbjtcbiAgICAgICAgICBhbW91bnRPdXRMaW1pdCA9IGNvZXJjZWRBbW91bnRPdXRMaW1pdDtcbiAgICAgICAgICB2b2lkIGZpcmVUcmlnZ2VycyhjcmVhdGVRdW90ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGdldFByb21pc2U6ICgpID0+IHRyaWdnZXJQSy5wcm9taXNlLFxuICAgICAgfSk7XG5cbiAgICAgIC8qKiBAdHlwZSB7UHJpY2VRdW90ZVRyaWdnZXJ9ICovXG4gICAgICBjb25zdCBtdXRhYmxlVHJpZ2dlciA9IGFzeW5jIGNyZWF0ZUluc3RhbnRRdW90ZSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgcXVvdGVQID0gY3JlYXRlSW5zdGFudFF1b3RlKGNhbGNBbW91bnRPdXQgPT4ge1xuICAgICAgICAgICAgaWYgKCFtdXRhYmxlVHJpZ2dlcnMuaGFzKG11dGFibGVRdW90ZSkpIHtcbiAgICAgICAgICAgICAgLyogQWxyZWFkeSBmaXJlZC4qL1xuICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYW1vdW50T3V0ID0gY2FsY0Ftb3VudE91dChhbW91bnRJbik7XG5cbiAgICAgICAgICAgIGlmICghY29tcGFyZUFtb3VudHNGbihhbW91bnRPdXQsIGFtb3VudE91dExpbWl0KSkge1xuICAgICAgICAgICAgICAvKiBEb24ndCBmaXJlIHRoZSBtdXRhYmxlVHJpZ2dlciB5ZXQuKi9cbiAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLyogR2VuZXJhdGUgdGhlIHF1b3RlLiovXG4gICAgICAgICAgICByZXR1cm4geyBhbW91bnRJbiwgYW1vdW50T3V0IH07XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICBpZiAoIXF1b3RlUCkge1xuICAgICAgICAgICAgLyogV2Ugc2hvdWxkbid0IHJlc29sdmUgeWV0LiovXG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbXV0YWJsZVRyaWdnZXJzLmRlbGV0ZShtdXRhYmxlUXVvdGUpO1xuICAgICAgICAgIHRyaWdnZXJQSy5yZXNvbHZlKHF1b3RlUCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAvKiBUcmlnZ2VyIGZhaWxlZCwgc28gcmVqZWN0IGFuZCBkcm9wLiovXG4gICAgICAgICAgdHJpZ2dlclBLLnJlamVjdChlKTtcbiAgICAgICAgICBtdXRhYmxlVHJpZ2dlcnMuZGVsZXRlKG11dGFibGVRdW90ZSk7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIG11dGFibGVUcmlnZ2Vycy5zZXQobXV0YWJsZVF1b3RlLCBtdXRhYmxlVHJpZ2dlcik7XG5cbiAgICAgIC8qIEZpcmUgbm93LCBqdXN0IGluIGNhc2UuKi9cbiAgICAgIGF3YWl0IG11dGFibGVUcmlnZ2VyKGNyZWF0ZVF1b3RlKTtcblxuICAgICAgcmV0dXJuIG11dGFibGVRdW90ZTtcbiAgICB9O1xuXG4gIC8qKlxuICogRW5zdXJlIHRoYXQgdGhlIGJyYW5kSW4vYnJhbmRPdXQgcGFpciBpcyBzdXBwb3J0ZWQuXG4gKlxuICogQHBhcmFtIHtCcmFuZH0gYnJhbmRJblxuICogQHBhcmFtIHtCcmFuZH0gYnJhbmRPdXRcbiAqL1xuICBjb25zdCBhc3NlcnRCcmFuZHMgPSAoYnJhbmRJbiwgYnJhbmRPdXQpID0+IHtcbiAgICBicmFuZEluID09PSBhY3R1YWxCcmFuZEluIHx8XG4gICAgICBGYWlsYERlc2lyZWQgYnJhbmRJbiAke3EoYnJhbmRJbil9IG11c3QgbWF0Y2ggJHtxKGFjdHVhbEJyYW5kSW4pfWA7XG4gICAgYnJhbmRPdXQgPT09IGFjdHVhbEJyYW5kT3V0IHx8XG4gICAgICBGYWlsYERlc2lyZWQgYnJhbmRPdXQgJHtxKGJyYW5kT3V0KX0gbXVzdCBtYXRjaCAke3EoYWN0dWFsQnJhbmRPdXQpfWA7XG4gIH07XG5cbiAgLyoqIEB0eXBlIHtQcmljZUF1dGhvcml0eX0gKi9cbiAgY29uc3QgcHJpY2VBdXRob3JpdHkgPSBGYXIoJ1ByaWNlQXV0aG9yaXR5Jywge1xuICAgIGdldFF1b3RlSXNzdWVyKGJyYW5kSW4sIGJyYW5kT3V0KSB7XG4gICAgICBhc3NlcnRCcmFuZHMoYnJhbmRJbiwgYnJhbmRPdXQpO1xuICAgICAgcmV0dXJuIHF1b3RlSXNzdWVyO1xuICAgIH0sXG4gICAgZ2V0VGltZXJTZXJ2aWNlKGJyYW5kSW4sIGJyYW5kT3V0KSB7XG4gICAgICBhc3NlcnRCcmFuZHMoYnJhbmRJbiwgYnJhbmRPdXQpO1xuICAgICAgcmV0dXJuIHRpbWVyO1xuICAgIH0sXG4gICAgbWFrZVF1b3RlTm90aWZpZXIoYW1vdW50SW4sIGJyYW5kT3V0KSB7XG4gICAgICBBbW91bnRNYXRoLmNvZXJjZShhY3R1YWxCcmFuZEluLCBhbW91bnRJbik7XG4gICAgICBhc3NlcnRCcmFuZHMoYW1vdW50SW4uYnJhbmQsIGJyYW5kT3V0KTtcblxuICAgICAgLyogV3JhcCBvdXIgdW5kZXJseWluZyBub3RpZmllciB3aXRoIHNwZWNpZmljIHF1b3Rlcy4qL1xuICAgICAgY29uc3Qgc3BlY2lmaWNCYXNlTm90aWZpZXIgPSBoYXJkZW4oe1xuICAgICAgICBhc3luYyBnZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCA9IHVuZGVmaW5lZCkge1xuICAgICAgICAgIC8qIFdlIHVzZSB0aGUgc2FtZSB1cGRhdGVDb3VudCBhcyBvdXIgdW5kZXJseWluZyBub3RpZmllci4qL1xuICAgICAgICAgIGNvbnN0IHJlY29yZCA9IGF3YWl0IEUobm90aWZpZXIpLmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50KTtcblxuICAgICAgICAgIC8qIFdlIGNyZWF0ZSBhIHF1b3RlIGlubGluZS4qL1xuICAgICAgICAgIGxldCBxdW90ZTtcbiAgICAgICAgICAvKiBjcmVhdGVRdW90ZSBjYW4gdGhyb3cgaWYgcHJpY2VBdXRob3JpdHkgaXMgcmVwbGFjZWQuKi9cblxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBxdW90ZSA9IGNyZWF0ZVF1b3RlKGNhbGNBbW91bnRPdXQgPT4gKHtcbiAgICAgICAgICAgICAgYW1vdW50SW4sXG4gICAgICAgICAgICAgIGFtb3VudE91dDogY2FsY0Ftb3VudE91dChhbW91bnRJbiksXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLyogZmFsbCB0aHJvdWdoKi9cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIXF1b3RlKSB7XG4gICAgICAgICAgICB0aHJvdyBGYWlsYGNyZWF0ZVF1b3RlIHJldHVybmVkIG5vdGhpbmdgO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXdhaXQgcXVvdGU7XG4gICAgICAgICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIHVwZGF0ZUNvdW50OiByZWNvcmQudXBkYXRlQ291bnQsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcblxuICAgICAgLyoqIEB0eXBlIHtOb3RpZmllcjxQcmljZVF1b3RlPn0gKi9cbiAgICAgIGNvbnN0IHNwZWNpZmljTm90aWZpZXIgPSBGYXIoJ1F1b3RlTm90aWZpZXInLCB7XG4gICAgICAgIC4uLm1ha2VOb3RpZmllcihzcGVjaWZpY0Jhc2VOb3RpZmllciksXG4gICAgICAgIC8qIFRPRE8gc3RvcCBleHBvc2luZyBiYXNlTm90aWZpZXIgbWV0aG9kcyBkaXJlY3RseS4qL1xuICAgICAgICAuLi5zcGVjaWZpY0Jhc2VOb3RpZmllcixcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIHNwZWNpZmljTm90aWZpZXI7XG4gICAgfSxcbiAgICBhc3luYyBxdW90ZUdpdmVuKGFtb3VudEluLCBicmFuZE91dCkge1xuICAgICAgdHJhY2UoJ3F1b3RlR2l2ZW4nLCBhbW91bnRJbiwgYnJhbmRPdXQpO1xuICAgICAgQW1vdW50TWF0aC5jb2VyY2UoYWN0dWFsQnJhbmRJbiwgYW1vdW50SW4pO1xuICAgICAgYXNzZXJ0QnJhbmRzKGFtb3VudEluLmJyYW5kLCBicmFuZE91dCk7XG5cbiAgICAgIGF3YWl0IEUobm90aWZpZXIpLmdldFVwZGF0ZVNpbmNlKCk7XG4gICAgICBjb25zdCBxdW90ZSA9IGNyZWF0ZVF1b3RlKGNhbGNBbW91bnRPdXQgPT4gKHtcbiAgICAgICAgYW1vdW50SW4sXG4gICAgICAgIGFtb3VudE91dDogY2FsY0Ftb3VudE91dChhbW91bnRJbiksXG4gICAgICB9KSk7XG4gICAgICBhc3NlcnQocXVvdGUpO1xuICAgICAgcmV0dXJuIHF1b3RlO1xuICAgIH0sXG4gICAgYXN5bmMgcXVvdGVXYW50ZWQoYnJhbmRJbiwgYW1vdW50T3V0KSB7XG4gICAgICBBbW91bnRNYXRoLmNvZXJjZShhY3R1YWxCcmFuZE91dCwgYW1vdW50T3V0KTtcbiAgICAgIGFzc2VydEJyYW5kcyhicmFuZEluLCBhbW91bnRPdXQuYnJhbmQpO1xuXG4gICAgICBhd2FpdCBFKG5vdGlmaWVyKS5nZXRVcGRhdGVTaW5jZSgpO1xuICAgICAgY29uc3QgcXVvdGUgPSBjcmVhdGVRdW90ZSgoY2FsY0Ftb3VudE91dCwgY2FsY0Ftb3VudEluKSA9PiB7XG4gICAgICAgIC8qIFdlIG5lZWQgdG8gZGV0ZXJtaW5lIGFuIGFtb3VudEluIHRoYXQgZ3VhcmFudGVlcyBhdCBsZWFzdCB0aGUgYW1vdW50T3V0LiovXG4gICAgICAgIGNvbnN0IGFtb3VudEluID0gY2FsY0Ftb3VudEluKGFtb3VudE91dCk7XG4gICAgICAgIGNvbnN0IGFjdHVhbEFtb3VudE91dCA9IGNhbGNBbW91bnRPdXQoYW1vdW50SW4pO1xuICAgICAgICBBbW91bnRNYXRoLmlzR1RFKGFjdHVhbEFtb3VudE91dCwgYW1vdW50T3V0KSB8fFxuICAgICAgICAgIEZhaWxgQ2FsY3VsYXRpb24gb2YgJHthY3R1YWxBbW91bnRPdXR9IGRpZG4ndCBjb3ZlciBleHBlY3RlZCAke2Ftb3VudE91dH1gO1xuICAgICAgICByZXR1cm4geyBhbW91bnRJbiwgYW1vdW50T3V0IH07XG4gICAgICB9KTtcbiAgICAgIGFzc2VydChxdW90ZSk7XG4gICAgICByZXR1cm4gcXVvdGU7XG4gICAgfSxcbiAgICBhc3luYyBxdW90ZUF0VGltZShkZWFkbGluZSwgYW1vdW50SW4sIGJyYW5kT3V0KSB7XG4gICAgICBBbW91bnRNYXRoLmNvZXJjZShhY3R1YWxCcmFuZEluLCBhbW91bnRJbik7XG4gICAgICBhc3NlcnRCcmFuZHMoYW1vdW50SW4uYnJhbmQsIGJyYW5kT3V0KTtcblxuICAgICAgYXdhaXQgRShub3RpZmllcikuZ2V0VXBkYXRlU2luY2UoKTtcbiAgICAgIGNvbnN0IHF1b3RlUEsgPSBtYWtlUHJvbWlzZUtpdCgpO1xuICAgICAgYXdhaXQgRSh0aW1lcikuc2V0V2FrZXVwKFxuICAgICAgICBkZWFkbGluZSxcbiAgICAgICAgRmFyKCd3YWtlT2JqJywge1xuICAgICAgICAgIGFzeW5jIHdha2UodGltZXN0YW1wKSB7XG4gICAgICAgICAgICBhd2FpdCBudWxsO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgY29uc3QgcXVvdGVQID0gY3JlYXRlUXVvdGUoY2FsY0Ftb3VudE91dCA9PiAoe1xuICAgICAgICAgICAgICAgIGFtb3VudEluLFxuICAgICAgICAgICAgICAgIGFtb3VudE91dDogY2FsY0Ftb3VudE91dChhbW91bnRJbiksXG4gICAgICAgICAgICAgICAgdGltZXN0YW1wLFxuICAgICAgICAgICAgICB9KSk7XG5cbiAgICAgICAgICAgICAgLyogV2UgZG9uJ3Qgd2FpdCBmb3IgdGhlIHF1b3RlIHRvIGJlIGF1dGhlbnRpY2F0ZWQ7IHJlc29sdmUqL1xuICAgICAgICAgICAgICAvKiBpbW1lZGlhdGVseS4qL1xuICAgICAgICAgICAgICBxdW90ZVBLLnJlc29sdmUocXVvdGVQKTtcbiAgICAgICAgICAgICAgYXdhaXQgcXVvdGVQSy5wcm9taXNlO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICBxdW90ZVBLLnJlamVjdChlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICB9KSxcbiAgICAgICk7XG5cbiAgICAgIC8qIFdhaXQgdW50aWwgdGhlIHdha2V1cCBwYXNzZXMuKi9cbiAgICAgIHJldHVybiBxdW90ZVBLLnByb21pc2U7XG4gICAgfSxcbiAgICBxdW90ZVdoZW5MVDogbWFrZVF1b3RlV2hlbk91dChpc0xUKSxcbiAgICBxdW90ZVdoZW5MVEU6IG1ha2VRdW90ZVdoZW5PdXQoaXNMVEUpLFxuICAgIHF1b3RlV2hlbkdURTogbWFrZVF1b3RlV2hlbk91dChpc0dURSksXG4gICAgcXVvdGVXaGVuR1Q6IG1ha2VRdW90ZVdoZW5PdXQoaXNHVCksXG4gICAgbXV0YWJsZVF1b3RlV2hlbkxUOiBtYWtlTXV0YWJsZVF1b3RlKGlzTFQpLFxuICAgIG11dGFibGVRdW90ZVdoZW5MVEU6IG1ha2VNdXRhYmxlUXVvdGUoaXNMVEUpLFxuICAgIG11dGFibGVRdW90ZVdoZW5HVDogbWFrZU11dGFibGVRdW90ZShpc0dUKSxcbiAgICBtdXRhYmxlUXVvdGVXaGVuR1RFOiBtYWtlTXV0YWJsZVF1b3RlKGlzR1RFKSxcbiAgfSk7XG5cbiAgcmV0dXJuIHsgcHJpY2VBdXRob3JpdHksIGFkbWluRmFjZXQ6IHsgZmlyZVRyaWdnZXJzIH0gfTtcbn07JGjNj19vbmNlLm1ha2VPbmV3YXlQcmljZUF1dGhvcml0eUtpdChtYWtlT25ld2F5UHJpY2VBdXRob3JpdHlLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUHJpY2VBdXRob3JpdHlJIjpbIlByaWNlQXV0aG9yaXR5SSJdLCJtYWtlT25ld2F5UHJpY2VBdXRob3JpdHlLaXQiOlsibWFrZU9uZXdheVByaWNlQXV0aG9yaXR5S2l0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGgfyq7mCwAA5gsAADUAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvcHJpY2VRdW90ZS5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2VydHAiLCJAZW5kby9lcnJvcnMiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vbmF0Il0sImV4cG9ydHMiOlsiZ2V0QW1vdW50SW4iLCJnZXRBbW91bnRPdXQiLCJnZXRQcmljZURlc2NyaXB0aW9uIiwiZ2V0VGltZXN0YW1wIiwibWFrZVByaWNlUXVvdGVJc3N1ZXIiLCJ1bml0QW1vdW50Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgQW1vdW50TWF0aCxBc3NldEtpbmQsbWFrZUlzc3VlcktpdCxGYWlsLEUsTmF0OyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRNYXRoXCIsWyRozY9fYSA9PiAoQW1vdW50TWF0aCA9ICRozY9fYSldXSxbXCJBc3NldEtpbmRcIixbJGjNj19hID0+IChBc3NldEtpbmQgPSAkaM2PX2EpXV0sW1wibWFrZUlzc3VlcktpdFwiLFskaM2PX2EgPT4gKG1ha2VJc3N1ZXJLaXQgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLFskaM2PX2EgPT4gKE5hdCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1ByaWNlQXV0aG9yaXR5LCBQcmljZURlc2NyaXB0aW9uLCBQcmljZVF1b3RlLCBQcmljZVF1b3RlVmFsdWUsIFByaWNlUXVlcnksfSBmcm9tICdAYWdvcmljL3pvZS90b29scy90eXBlcy5qcyc7XG4gKiBAaW1wb3J0IHtUaW1lc3RhbXB9IGZyb20gJ0BhZ29yaWMvdGltZSc7XG4gKiBAaW1wb3J0IHtCcmFuZH0gZnJvbSAnQGFnb3JpYy9lcnRwJztcbiAqIEBpbXBvcnQge0lzc3VlcktpdH0gZnJvbSAnQGFnb3JpYy9lcnRwJztcbiAqL1xuXG4vKiBQcmljZUF1dGhvcml0aWVzIHJldHVybiBxdW90ZXMgYXMgYSBwYWlyIG9mIGFuIGFtb3VudCBhbmQgYSBwYXltZW50LCBib3RoKi9cbi8qIHdpdGggdGhlIHNhbWUgdmFsdWUuIFRoZSB1bmRlcmx5aW5nIGFtb3VudCB3cmFwcyBhbW91bnRJbiwgYW1vdW50T3V0LCB0aW1lciovXG4vKiBhbmQgdGltZXN0YW1wLiBUaGUgcGF5bWVudCBpcyBpc3N1ZWQgYnkgdGhlIHF1b3RlSXNzdWVyIHRvIHN1cHBvcnQgdmVyYWNpdHkqL1xuLyogY2hlY2tpbmcuIFRoZXNlIGhlbHBlcnMgbWFrZSBpdCBlYXNpZXIgdG8gZXh0cmFjdCB0aGUgY29tcG9uZW50cyBvZiB0aGUgUXVvdGUqL1xuXG4vKipcbiAqIEBwYXJhbSB7UHJpY2VRdW90ZX0gcXVvdGVcbiAqIEByZXR1cm5zIHtQcmljZURlc2NyaXB0aW9ufVxuICovXG4gICAgICAgY29uc3QgZ2V0UHJpY2VEZXNjcmlwdGlvbiA9IHF1b3RlID0+IHtcbiAgcXVvdGUucXVvdGVBbW91bnQudmFsdWUubGVuZ3RoID09PSAxIHx8XG4gICAgRmFpbGBxdW90ZUFtb3VudCBzZXQgbXVzdCBoYXZlIG9uZSBtZW1iZXJgO1xuICByZXR1cm4gcXVvdGUucXVvdGVBbW91bnQudmFsdWVbMF07XG59O1xuXG4vKiogQHBhcmFtIHtQcmljZVF1b3RlfSBxdW90ZSAqLyRozY9fb25jZS5nZXRQcmljZURlc2NyaXB0aW9uKGdldFByaWNlRGVzY3JpcHRpb24pO1xuICAgICAgIGNvbnN0IGdldEFtb3VudEluID0gcXVvdGUgPT4gZ2V0UHJpY2VEZXNjcmlwdGlvbihxdW90ZSkuYW1vdW50SW47XG4vKiogQHBhcmFtIHtQcmljZVF1b3RlfSBxdW90ZSAqLyRozY9fb25jZS5nZXRBbW91bnRJbihnZXRBbW91bnRJbik7XG4gICAgICAgY29uc3QgZ2V0QW1vdW50T3V0ID0gcXVvdGUgPT4gZ2V0UHJpY2VEZXNjcmlwdGlvbihxdW90ZSkuYW1vdW50T3V0O1xuLyoqIEB0eXBlIHsocXVvdGU6IFByaWNlUXVvdGUpID0+IFRpbWVzdGFtcH0gKi8kaM2PX29uY2UuZ2V0QW1vdW50T3V0KGdldEFtb3VudE91dCk7XG4gICAgICAgY29uc3QgZ2V0VGltZXN0YW1wID0gcXVvdGUgPT4gZ2V0UHJpY2VEZXNjcmlwdGlvbihxdW90ZSkudGltZXN0YW1wO1xuXG4vKiogQHBhcmFtIHtCcmFuZDwnbmF0Jz59IGJyYW5kICovJGjNj19vbmNlLmdldFRpbWVzdGFtcChnZXRUaW1lc3RhbXApO1xuICAgICAgIGNvbnN0IHVuaXRBbW91bnQgPSBhc3luYyBicmFuZCA9PiB7XG4gIC8qIEJyYW5kIG1ldGhvZHMgYXJlIHJlbW90ZSovXG4gIGNvbnN0IGRpc3BsYXlJbmZvID0gYXdhaXQgRShicmFuZCkuZ2V0RGlzcGxheUluZm8oKTtcbiAgY29uc3QgZGVjaW1hbFBsYWNlcyA9IGRpc3BsYXlJbmZvLmRlY2ltYWxQbGFjZXMgPz8gMDtcbiAgcmV0dXJuIEFtb3VudE1hdGgubWFrZShicmFuZCwgMTBuICoqIE5hdChkZWNpbWFsUGxhY2VzKSk7XG59OyRozY9fb25jZS51bml0QW1vdW50KHVuaXRBbW91bnQpO1xuaGFyZGVuKHVuaXRBbW91bnQpO1xuXG4gICAgICAgY29uc3QgbWFrZVByaWNlUXVvdGVJc3N1ZXIgPSAoKSA9PlxuICAvKiogQHR5cGUge0lzc3VlcktpdDwnc2V0JywgUHJpY2VEZXNjcmlwdGlvbj59ICovIChcbiAgICBtYWtlSXNzdWVyS2l0KCdxdW90ZScsIEFzc2V0S2luZC5TRVQpXG4gICk7JGjNj19vbmNlLm1ha2VQcmljZVF1b3RlSXNzdWVyKG1ha2VQcmljZVF1b3RlSXNzdWVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdldFByaWNlRGVzY3JpcHRpb24iOlsiZ2V0UHJpY2VEZXNjcmlwdGlvbiJdLCJnZXRBbW91bnRJbiI6WyJnZXRBbW91bnRJbiJdLCJnZXRBbW91bnRPdXQiOlsiZ2V0QW1vdW50T3V0Il0sImdldFRpbWVzdGFtcCI6WyJnZXRUaW1lc3RhbXAiXSwidW5pdEFtb3VudCI6WyJ1bml0QW1vdW50Il0sIm1ha2VQcmljZVF1b3RlSXNzdWVyIjpbIm1ha2VQcmljZVF1b3RlSXNzdWVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFvRqkVjKQAAYykAADMAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvcmVjb3JkZXIuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvbm90aWZpZXIiLCJAYWdvcmljL25vdGlmaWVyL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qcyIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIiwiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCJdLCJleHBvcnRzIjpbIlJlY29yZGVyS2l0U2hhcGUiLCJkZWZpbmVFUmVjb3JkZXJLaXQiLCJkZWZpbmVSZWNvcmRlcktpdCIsInByZXBhcmVNb2NrUmVjb3JkZXJLaXRNYWtlcnMiLCJwcmVwYXJlUmVjb3JkZXIiLCJwcmVwYXJlUmVjb3JkZXJLaXQiLCJwcmVwYXJlUmVjb3JkZXJLaXRNYWtlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBTdG9yYWdlTm9kZVNoYXBlLHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCxtYWtlRmFrZU1hcnNoYWxsZXIsbWFrZUZha2VTdG9yYWdlLG11c3RNYXRjaCxNLG1ha2VTY2FsYXJCaWdNYXBTdG9yZSxwcmVwYXJlRXhvQ2xhc3MsRmFpbCxFOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wiU3RvcmFnZU5vZGVTaGFwZVwiLFskaM2PX2EgPT4gKFN0b3JhZ2VOb2RlU2hhcGUgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL25vdGlmaWVyXCIsIFtbXCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXRcIixbJGjNj19hID0+IChwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL25vdGlmaWVyL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qc1wiLCBbW1wibWFrZUZha2VNYXJzaGFsbGVyXCIsWyRozY9fYSA9PiAobWFrZUZha2VNYXJzaGFsbGVyID0gJGjNj19hKV1dLFtcIm1ha2VGYWtlU3RvcmFnZVwiLFskaM2PX2EgPT4gKG1ha2VGYWtlU3RvcmFnZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcIm1ha2VTY2FsYXJCaWdNYXBTdG9yZVwiLFskaM2PX2EgPT4gKG1ha2VTY2FsYXJCaWdNYXBTdG9yZSA9ICRozY9fYSldXSxbXCJwcmVwYXJlRXhvQ2xhc3NcIixbJGjNj19hID0+IChwcmVwYXJlRXhvQ2xhc3MgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1R5cGVkUGF0dGVybiwgRVJlbW90ZSwgUmVtb3RlfSBmcm9tICdAYWdvcmljL2ludGVybmFsJztcbiAqIEBpbXBvcnQge0VNYXJzaGFsbGVyfSBmcm9tICdAYWdvcmljL2ludGVybmFsL3NyYy9tYXJzaGFsL3dyYXAtbWFyc2hhbGxlci5qcyc7XG4gKiBAaW1wb3J0IHtQdWJsaXNoS2l0fSBmcm9tICdAYWdvcmljL25vdGlmaWVyJztcbiAqIEBpbXBvcnQge0JhZ2dhZ2V9IGZyb20gJ0BhZ29yaWMvdmF0LWRhdGEnO1xuICogQGltcG9ydCB7U3RvcmFnZU5vZGV9IGZyb20gJ0BhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMnO1xuICogQGltcG9ydCB7RVJlZn0gZnJvbSAnQGFnb3JpYy92b3cnO1xuICovXG5cbi8qKlxuICogUmVjb3JkZXJzIHN1cHBvcnQgcHVibGlzaGluZyBkYXRhIHRvIHZzdG9yYWdlLlxuICpcbiAqIGBSZWNvcmRlcmAgaXMgc2ltaWxhciB0byBgUHVibGlzaGVyYCAoaW4gdGhhdCB0aGV5IHNlbmQgb3V0IGRhdGEpIGJ1dCBoYXMgZGlmZmVyZW50IHNpZ25hdHVyZXM6XG4gKiAtIG1ldGhvZHMgYXJlIGFzeW5jIGJlY2F1c2UgdGhleSBhd2FpdCByZW1vdGUgY2FsbHMgdG8gTWFyc2hhbGxlciBhbmQgU3RvcmFnZU5vZGVcbiAqIC0gbWV0aG9kIG5hbWVzIGNvbnZleSB0aGUgZHVyYWJpbGl0eVxuICogLSBvbWl0cyBmYWlsKClcbiAqIC0gYWRkcyBnZXRTdG9yYWdlTm9kZSgpIGZyb20gaXRzIGR1cmFibGUgc3RhdGVcbiAqXG4gKiBPdGhlciBuYW1lcyBzdWNoIGFzIFN0b3JlZFB1Ymxpc2hlciBvciBDaGFpblN0b3JhZ2VQdWJsaXNoZXIgd2VyZSBjb25zaWRlcmVkLCBidXQgZm91bmQgdG8gYmUgc29tZXRpbWVzIGNvbmZ1c2VkIHdpdGggKmR1cmFiaWxpdHkqLCBhbm90aGVyIHRyYWl0IG9mIHRoaXMgY2xhc3MuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge3sgZ2V0U3RvcmFnZU5vZGUoKTogUmVtb3RlPFN0b3JhZ2VOb2RlPiwgZ2V0U3RvcmFnZVBhdGgoKTogUHJvbWlzZTxzdHJpbmc+LCB3cml0ZSh2YWx1ZTogVCk6IFByb21pc2U8dm9pZD4sIHdyaXRlRmluYWwodmFsdWU6IFQpOiBQcm9taXNlPHZvaWQ+IH19IFJlY29yZGVyXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1BpY2s8UHVibGlzaEtpdDxUPiwgJ3N1YnNjcmliZXInPiAmIHsgcmVjb3JkZXI6IFJlY29yZGVyPFQ+IH19IFJlY29yZGVyS2l0XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1BpY2s8UHVibGlzaEtpdDxUPiwgJ3N1YnNjcmliZXInPiAmIHsgcmVjb3JkZXJQOiBFUmVmPFJlY29yZGVyPFQ+PiB9fSBFdmVudHVhbFJlY29yZGVyS2l0XG4gKi9cblxuLyoqXG4gKiBXcmFwIGEgUHVibGlzaGVyIHRvIHJlY29yZCBhbGwgdGhlIHZhbHVlcyB0byBjaGFpbiBzdG9yYWdlLlxuICpcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtFUmVtb3RlPEVNYXJzaGFsbGVyPn0gbWFyc2hhbGxlclxuICovXG4gICAgICAgY29uc3QgcHJlcGFyZVJlY29yZGVyID0gKGJhZ2dhZ2UsIG1hcnNoYWxsZXIpID0+IHtcbiAgY29uc3QgbWFrZVJlY29yZGVyID0gcHJlcGFyZUV4b0NsYXNzKFxuICAgIGJhZ2dhZ2UsXG4gICAgJ1JlY29yZGVyJyxcbiAgICBNLmludGVyZmFjZSgnUmVjb3JkZXInLCB7XG4gICAgICBnZXRTdG9yYWdlTm9kZTogTS5jYWxsKCkucmV0dXJucyhTdG9yYWdlTm9kZVNoYXBlKSxcbiAgICAgIGdldFN0b3JhZ2VQYXRoOiBNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgvKiBzdHJpbmcgKi8pKSxcbiAgICAgIHdyaXRlOiBNLmNhbGwoTS5hbnkoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgICB3cml0ZUZpbmFsOiBNLmNhbGwoTS5hbnkoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgfSksXG4gICAgLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtQdWJsaXNoS2l0PFQ+WydwdWJsaXNoZXInXX0gcHVibGlzaGVyXG4gKiBAcGFyYW0ge1JlbW90ZTxTdG9yYWdlTm9kZT59IHN0b3JhZ2VOb2RlXG4gKiBAcGFyYW0ge1R5cGVkUGF0dGVybjxhbnk+fSBbdmFsdWVTaGFwZV1cbiAqL1xuICAgIChcbiAgICAgIHB1Ymxpc2hlcixcbiAgICAgIHN0b3JhZ2VOb2RlLFxuICAgICAgdmFsdWVTaGFwZSA9IC8qKiBAdHlwZSB7VHlwZWRQYXR0ZXJuPGFueT59ICovIChNLmFueSgpKSxcbiAgICApID0+IHtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGNsb3NlZDogZmFsc2UsXG4gICAgICAgIHB1Ymxpc2hlcixcbiAgICAgICAgc3RvcmFnZU5vZGUsXG4gICAgICAgIHN0b3JhZ2VQYXRoOiAvKiogQHR5cGUge3N0cmluZyB8IHVuZGVmaW5lZH0gKi8gKHVuZGVmaW5lZCksXG4gICAgICAgIHZhbHVlU2hhcGUsXG4gICAgICB9O1xuICAgIH0sXG4gICAge1xuICAgICAgZ2V0U3RvcmFnZU5vZGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN0YXRlLnN0b3JhZ2VOb2RlO1xuICAgICAgfSxcbiAgICAgIC8qKlxuICogTWVtb2l6ZXMgdGhlIHJlbW90ZSBjYWxsIHRvIHRoZSBzdG9yYWdlIG5vZGVcbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fVxuICovXG4gICAgICBhc3luYyBnZXRTdG9yYWdlUGF0aCgpIHtcbiAgICAgICAgY29uc3QgeyBzdG9yYWdlUGF0aDogaGVsZFBhdGggfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgIC8qIGVuZCBzeW5jaHJvbm91cyBwcmVsdWRlKi9cbiAgICAgICAgYXdhaXQgbnVsbDtcbiAgICAgICAgaWYgKGhlbGRQYXRoICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gaGVsZFBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcGF0aCA9IGF3YWl0IEUodGhpcy5zdGF0ZS5zdG9yYWdlTm9kZSkuZ2V0UGF0aCgpO1xuICAgICAgICB0aGlzLnN0YXRlLnN0b3JhZ2VQYXRoID0gcGF0aDtcbiAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgICB9LFxuICAgICAgLyoqXG4gKiBNYXJzaGFsbHMgYmVmb3JlIHdyaXRpbmcgdG8gc3RvcmFnZSBvciBwdWJsaXNoZXIgdG8gaGVscCBlbnN1cmUgdGhlIHR3byBzdHJlYW1zIG1hdGNoLlxuICpcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cbiAgICAgIGFzeW5jIHdyaXRlKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IHsgY2xvc2VkLCBwdWJsaXNoZXIsIHN0b3JhZ2VOb2RlLCB2YWx1ZVNoYXBlIH0gPSB0aGlzLnN0YXRlO1xuICAgICAgICAhY2xvc2VkIHx8IEZhaWxgY2Fubm90IHdyaXRlIHRvIGNsb3NlZCByZWNvcmRlcmA7XG4gICAgICAgIG11c3RNYXRjaCh2YWx1ZSwgdmFsdWVTaGFwZSk7XG4gICAgICAgIGNvbnN0IGVuY29kZWQgPSBhd2FpdCBFKG1hcnNoYWxsZXIpLnRvQ2FwRGF0YSh2YWx1ZSk7XG4gICAgICAgIGNvbnN0IHNlcmlhbGl6ZWQgPSBKU09OLnN0cmluZ2lmeShlbmNvZGVkKTtcbiAgICAgICAgYXdhaXQgRShzdG9yYWdlTm9kZSkuc2V0VmFsdWUoc2VyaWFsaXplZCk7XG5cbiAgICAgICAgLyogYmVsb3cgaGVyZSBkaWZmZXJzIGZyb20gd3JpdGVGaW5hbCgpKi9cbiAgICAgICAgcmV0dXJuIHB1Ymxpc2hlci5wdWJsaXNoKHZhbHVlKTtcbiAgICAgIH0sXG4gICAgICAvKipcbiAqIExpa2UgYHdyaXRlYCBidXQgcHJldmVudHMgZnV0dXJlIHdyaXRlcyBhbmQgdGVybWluYXRlcyB0aGUgcHVibGlzaGVyLlxuICpcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cbiAgICAgIGFzeW5jIHdyaXRlRmluYWwodmFsdWUpIHtcbiAgICAgICAgY29uc3QgeyBjbG9zZWQsIHB1Ymxpc2hlciwgc3RvcmFnZU5vZGUsIHZhbHVlU2hhcGUgfSA9IHRoaXMuc3RhdGU7XG4gICAgICAgICFjbG9zZWQgfHwgRmFpbGBjYW5ub3Qgd3JpdGUgdG8gY2xvc2VkIHJlY29yZGVyYDtcbiAgICAgICAgbXVzdE1hdGNoKHZhbHVlLCB2YWx1ZVNoYXBlKTtcbiAgICAgICAgY29uc3QgZW5jb2RlZCA9IGF3YWl0IEUobWFyc2hhbGxlcikudG9DYXBEYXRhKHZhbHVlKTtcbiAgICAgICAgY29uc3Qgc2VyaWFsaXplZCA9IEpTT04uc3RyaW5naWZ5KGVuY29kZWQpO1xuICAgICAgICBhd2FpdCBFKHN0b3JhZ2VOb2RlKS5zZXRWYWx1ZShzZXJpYWxpemVkKTtcblxuICAgICAgICAvKiBiZWxvdyBoZXJlIGRpZmZlcnMgZnJvbSB3cml0ZSgpKi9cbiAgICAgICAgdGhpcy5zdGF0ZS5jbG9zZWQgPSB0cnVlO1xuICAgICAgICByZXR1cm4gcHVibGlzaGVyLmZpbmlzaCh2YWx1ZSk7XG4gICAgICB9LFxuICAgIH0sXG4gICk7XG5cbiAgcmV0dXJuIG1ha2VSZWNvcmRlcjtcbn07JGjNj19vbmNlLnByZXBhcmVSZWNvcmRlcihwcmVwYXJlUmVjb3JkZXIpO1xuaGFyZGVuKHByZXBhcmVSZWNvcmRlcik7XG4vKiogQHR5cGVkZWYge1JldHVyblR5cGU8dHlwZW9mIHByZXBhcmVSZWNvcmRlcj59IE1ha2VSZWNvcmRlciAqL1xuXG4vKipcbiAqIGBtYWtlUmVjb3JkZXJLaXRgIGlzIHN1aXRhYmxlIGZvciBtYWtpbmcgYSBkdXJhYmxlIGBSZWNvcmRlcktpdGAgd2hpY2ggY2FuIGJlIGhlbGQgaW4gRXhvIHN0YXRlLlxuICpcbiAqIEBzZWUge2RlZmluZUVSZWNvcmRlcktpdH1cbiAqXG4gKiBAcGFyYW0ge3ttYWtlUmVjb3JkZXI6IE1ha2VSZWNvcmRlciwgbWFrZUR1cmFibGVQdWJsaXNoS2l0OiBSZXR1cm5UeXBlPHR5cGVvZiBwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQ+fX0gbWFrZXJzXG4gKi9cbiAgICAgICBjb25zdCBkZWZpbmVSZWNvcmRlcktpdCA9ICh7IG1ha2VSZWNvcmRlciwgbWFrZUR1cmFibGVQdWJsaXNoS2l0IH0pID0+IHtcbiAgLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtSZW1vdGU8U3RvcmFnZU5vZGU+fSBzdG9yYWdlTm9kZVxuICogQHBhcmFtIHtUeXBlZFBhdHRlcm48VD59IFt2YWx1ZVNoYXBlXVxuICogQHJldHVybnMge1JlY29yZGVyS2l0PFQ+fVxuICovXG4gIGNvbnN0IG1ha2VSZWNvcmRlcktpdCA9IChzdG9yYWdlTm9kZSwgdmFsdWVTaGFwZSkgPT4ge1xuICAgIGNvbnN0IHsgc3Vic2NyaWJlciwgcHVibGlzaGVyIH0gPSBtYWtlRHVyYWJsZVB1Ymxpc2hLaXQoKTtcbiAgICBjb25zdCByZWNvcmRlciA9IG1ha2VSZWNvcmRlcihwdWJsaXNoZXIsIHN0b3JhZ2VOb2RlLCB2YWx1ZVNoYXBlKTtcbiAgICByZXR1cm4gaGFyZGVuKHsgc3Vic2NyaWJlciwgcmVjb3JkZXIgfSk7XG4gIH07XG4gIHJldHVybiBtYWtlUmVjb3JkZXJLaXQ7XG59O1xuLyoqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBkZWZpbmVSZWNvcmRlcktpdD59IE1ha2VSZWNvcmRlcktpdCAqL1xuXG4vKipcbiAqIGBtYWtlRVJlY29yZGVyS2l0YCBpcyBmb3IgY2xvc3VyZXMgdGhhdCBtdXN0IHJldHVybiBhIGBzdWJzY3JpYmVyYCBzeW5jaHJvbm91c2x5IGJ1dCBjYW4gZGVmZXIgdGhlIGByZWNvcmRlcmAuXG4gKlxuICogQHNlZSB7ZGVmaW5lUmVjb3JkZXJLaXR9XG4gKlxuICogQHBhcmFtIHt7bWFrZVJlY29yZGVyOiBNYWtlUmVjb3JkZXIsIG1ha2VEdXJhYmxlUHVibGlzaEtpdDogUmV0dXJuVHlwZTx0eXBlb2YgcHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0Pn19IG1ha2Vyc1xuICovJGjNj19vbmNlLmRlZmluZVJlY29yZGVyS2l0KGRlZmluZVJlY29yZGVyS2l0KTtcbiAgICAgICBjb25zdCBkZWZpbmVFUmVjb3JkZXJLaXQgPSAoeyBtYWtlUmVjb3JkZXIsIG1ha2VEdXJhYmxlUHVibGlzaEtpdCB9KSA9PiB7XG4gIC8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlbW90ZTxTdG9yYWdlTm9kZT59IHN0b3JhZ2VOb2RlUFxuICogQHBhcmFtIHtUeXBlZFBhdHRlcm48VD59IFt2YWx1ZVNoYXBlXVxuICogQHJldHVybnMge0V2ZW50dWFsUmVjb3JkZXJLaXQ8VD59XG4gKi9cbiAgY29uc3QgbWFrZUVSZWNvcmRlcktpdCA9IChzdG9yYWdlTm9kZVAsIHZhbHVlU2hhcGUpID0+IHtcbiAgICBjb25zdCB7IHB1Ymxpc2hlciwgc3Vic2NyaWJlciB9ID0gbWFrZUR1cmFibGVQdWJsaXNoS2l0KCk7XG4gICAgY29uc3QgcmVjb3JkZXJQID0gRS53aGVuKHN0b3JhZ2VOb2RlUCwgc3RvcmFnZU5vZGUgPT5cbiAgICAgIG1ha2VSZWNvcmRlcihwdWJsaXNoZXIsIHN0b3JhZ2VOb2RlLCB2YWx1ZVNoYXBlKSxcbiAgICApO1xuICAgIHJldHVybiB7IHN1YnNjcmliZXIsIHJlY29yZGVyUCB9O1xuICB9O1xuICByZXR1cm4gbWFrZUVSZWNvcmRlcktpdDtcbn07JGjNj19vbmNlLmRlZmluZUVSZWNvcmRlcktpdChkZWZpbmVFUmVjb3JkZXJLaXQpO1xuaGFyZGVuKGRlZmluZUVSZWNvcmRlcktpdCk7XG4vKiogQHR5cGVkZWYge1JldHVyblR5cGU8dHlwZW9mIGRlZmluZUVSZWNvcmRlcktpdD59IE1ha2VFUmVjb3JkZXJLaXQgKi9cblxuLyoqXG4gKiBDb252ZW5pZW5jZSB3cmFwcGVyIHRvIHByZXBhcmUgdGhlIER1cmFibGVQdWJsaXNoS2l0IGFuZCBSZWNvcmRlciBraW5kcy5cbiAqIE5vdGUgdGhhdCBiZWNhdXNlIHByZXBhcmVSZWNvcmRlcigpIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlIHBlciBiYWdnYWdlLFxuICogdGhpcyBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gdGhlcmUgaXMgbm8gbmVlZCBmb3IgYW4gRXZlbnR1YWxSZWNvcmRlcktpdC5cbiAqIFdoZW4gdGhlcmUgaXMsIHByZXBhcmUgdGhlIGtpbmRzIHNlcGFyYXRlbHkgYW5kIHBhc3MgdG8gdGhlIGtpdCBkZWZpbmVycy5cbiAqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7RVJlbW90ZTxFTWFyc2hhbGxlcj59IG1hcnNoYWxsZXJcbiAqL1xuICAgICAgIGNvbnN0IHByZXBhcmVSZWNvcmRlcktpdCA9IChiYWdnYWdlLCBtYXJzaGFsbGVyKSA9PiB7XG4gIGNvbnN0IG1ha2VEdXJhYmxlUHVibGlzaEtpdCA9IHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdChcbiAgICBiYWdnYWdlLFxuICAgICdEdXJhYmxlIFB1Ymxpc2ggS2l0JyxcbiAgKTtcbiAgY29uc3QgbWFrZVJlY29yZGVyID0gcHJlcGFyZVJlY29yZGVyKGJhZ2dhZ2UsIG1hcnNoYWxsZXIpO1xuICByZXR1cm4gZGVmaW5lUmVjb3JkZXJLaXQoeyBtYWtlRHVyYWJsZVB1Ymxpc2hLaXQsIG1ha2VSZWNvcmRlciB9KTtcbn07XG5cbi8qKlxuICogQ29udmVuaWVuY2Ugd3JhcHBlciBmb3IgRHVyYWJsZVB1Ymxpc2hLaXQgYW5kIFJlY29yZGVyIGtpbmRzLlxuICpcbiAqIE5COiB0aGlzIGRlZmluZXMgdHdvIGR1cmFibGUga2luZHMuIE11c3QgYmUgY2FsbGVkIGF0IG1vc3Qgb25jZSBwZXIgYmFnZ2FnZS5cbiAqXG4gKiBgbWFrZVJlY29yZGVyS2l0YCBpcyBzdWl0YWJsZSBmb3IgbWFraW5nIGEgZHVyYWJsZSBgUmVjb3JkZXJLaXRgIHdoaWNoIGNhbiBiZSBoZWxkIGluIEV4byBzdGF0ZS5cbiAqIGBtYWtlRVJlY29yZGVyS2l0YCBpcyBmb3IgY2xvc3VyZXMgdGhhdCBtdXN0IHJldHVybiBhIGBzdWJzY3JpYmVyYCBzeW5jaHJvbm91c2x5IGJ1dCBjYW4gZGVmZXIgdGhlIGByZWNvcmRlcmAuXG4gKlxuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge0VSZW1vdGU8RU1hcnNoYWxsZXI+fSBtYXJzaGFsbGVyXG4gKi8kaM2PX29uY2UucHJlcGFyZVJlY29yZGVyS2l0KHByZXBhcmVSZWNvcmRlcktpdCk7XG4gICAgICAgY29uc3QgcHJlcGFyZVJlY29yZGVyS2l0TWFrZXJzID0gKGJhZ2dhZ2UsIG1hcnNoYWxsZXIpID0+IHtcbiAgY29uc3QgbWFrZUR1cmFibGVQdWJsaXNoS2l0ID0gcHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0KFxuICAgIGJhZ2dhZ2UsXG4gICAgJ0R1cmFibGUgUHVibGlzaCBLaXQnLFxuICApO1xuICBjb25zdCBtYWtlUmVjb3JkZXIgPSBwcmVwYXJlUmVjb3JkZXIoYmFnZ2FnZSwgbWFyc2hhbGxlcik7XG5cbiAgY29uc3QgbWFrZVJlY29yZGVyS2l0ID0gZGVmaW5lUmVjb3JkZXJLaXQoe1xuICAgIG1ha2VSZWNvcmRlcixcbiAgICBtYWtlRHVyYWJsZVB1Ymxpc2hLaXQsXG4gIH0pO1xuICBjb25zdCBtYWtlRVJlY29yZGVyS2l0ID0gZGVmaW5lRVJlY29yZGVyS2l0KHtcbiAgICBtYWtlUmVjb3JkZXIsXG4gICAgbWFrZUR1cmFibGVQdWJsaXNoS2l0LFxuICB9KTtcblxuICByZXR1cm4ge1xuICAgIG1ha2VEdXJhYmxlUHVibGlzaEtpdCxcbiAgICBtYWtlUmVjb3JkZXIsXG4gICAgbWFrZVJlY29yZGVyS2l0LFxuICAgIG1ha2VFUmVjb3JkZXJLaXQsXG4gIH07XG59O1xuXG4vKipcbiAqIEZvciB1c2UgaW4gdGVzdHNcbiAqLyRozY9fb25jZS5wcmVwYXJlUmVjb3JkZXJLaXRNYWtlcnMocHJlcGFyZVJlY29yZGVyS2l0TWFrZXJzKTtcbiAgICAgICBjb25zdCBwcmVwYXJlTW9ja1JlY29yZGVyS2l0TWFrZXJzID0gKCkgPT4ge1xuICBjb25zdCBiYWdnYWdlID0gbWFrZVNjYWxhckJpZ01hcFN0b3JlKCdtb2NrIHJlY29yZGVyIGJhZ2dhZ2UnKTtcbiAgY29uc3QgbWFyc2hhbGxlciA9IG1ha2VGYWtlTWFyc2hhbGxlcigpO1xuICByZXR1cm4ge1xuICAgIC4uLnByZXBhcmVSZWNvcmRlcktpdE1ha2VycyhiYWdnYWdlLCBtYXJzaGFsbGVyKSxcbiAgICBzdG9yYWdlTm9kZTogbWFrZUZha2VTdG9yYWdlKCdtb2NrIHJlY29yZGVyIHN0b3JhZ2UnKSxcbiAgfTtcbn07JGjNj19vbmNlLnByZXBhcmVNb2NrUmVjb3JkZXJLaXRNYWtlcnMocHJlcGFyZU1vY2tSZWNvcmRlcktpdE1ha2Vycyk7XG5cbiAgICAgICBjb25zdCBSZWNvcmRlcktpdFNoYXBlID0ge1xuICByZWNvcmRlcjogTS5yZW1vdGFibGUoKSxcbiAgc3Vic2NyaWJlcjogTS5yZW1vdGFibGUoKSxcbn07JGjNj19vbmNlLlJlY29yZGVyS2l0U2hhcGUoUmVjb3JkZXJLaXRTaGFwZSk7XG5oYXJkZW4oUmVjb3JkZXJLaXRTaGFwZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwcmVwYXJlUmVjb3JkZXIiOlsicHJlcGFyZVJlY29yZGVyIl0sImRlZmluZVJlY29yZGVyS2l0IjpbImRlZmluZVJlY29yZGVyS2l0Il0sImRlZmluZUVSZWNvcmRlcktpdCI6WyJkZWZpbmVFUmVjb3JkZXJLaXQiXSwicHJlcGFyZVJlY29yZGVyS2l0IjpbInByZXBhcmVSZWNvcmRlcktpdCJdLCJwcmVwYXJlUmVjb3JkZXJLaXRNYWtlcnMiOlsicHJlcGFyZVJlY29yZGVyS2l0TWFrZXJzIl0sInByZXBhcmVNb2NrUmVjb3JkZXJLaXRNYWtlcnMiOlsicHJlcGFyZU1vY2tSZWNvcmRlcktpdE1ha2VycyJdLCJSZWNvcmRlcktpdFNoYXBlIjpbIlJlY29yZGVyS2l0U2hhcGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAKK+k+uwEAADsBAAANwAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9zdGF0ZU1hY2hpbmUuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsibWFrZVN0YXRlTWFjaGluZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGFzc2VydDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiYXNzZXJ0XCIsWyRozY9fYSA9PiAoYXNzZXJ0ID0gJGjNj19hKV1dXV1dKTtcblxuLyogYWxsb3dlZFRyYW5zaXRpb25zIGlzIGFuIGFycmF5IG9mIGFycmF5cyB3aGljaCBnZXRzIHR1cm5lZCBpbnRvIGFcbiAqIG1hcC4gVGhlIG1hcCBtYXBzIHN0cmluZyBzdGF0ZXMgdG8gYW4gYXJyYXkgb2YgcG90ZW50aWFsIG5leHRcbiAqIHN0YXRlcy4gRm9yIGV4YW1wbGUsXG4gKiBjb25zdCBhbGxvd2VkVHJhbnNpdGlvbnMgPSBbXG4gWydvcGVuJywgWydjbG9zZWQnXV0sXG4gWydjbG9zZWQnLCBbXV0sXG4gKiBdO1xuKi9cbmNvbnN0IG1ha2VTdGF0ZU1hY2hpbmUgPSAoaW5pdGlhbFN0YXRlLCBhbGxvd2VkVHJhbnNpdGlvbnNBcnJheSkgPT4ge1xuICBsZXQgc3RhdGUgPSBpbml0aWFsU3RhdGU7XG4gIGNvbnN0IGFsbG93ZWRUcmFuc2l0aW9ucyA9IG5ldyBNYXAoYWxsb3dlZFRyYW5zaXRpb25zQXJyYXkpO1xuICByZXR1cm4gaGFyZGVuKHtcbiAgICBjYW5UcmFuc2l0aW9uVG86IG5leHRTdGF0ZSA9PlxuICAgICAgYWxsb3dlZFRyYW5zaXRpb25zLmdldChzdGF0ZSkuaW5jbHVkZXMobmV4dFN0YXRlKSxcbiAgICB0cmFuc2l0aW9uVG86IG5leHRTdGF0ZSA9PiB7XG4gICAgICBhc3NlcnQoYWxsb3dlZFRyYW5zaXRpb25zLmdldChzdGF0ZSkuaW5jbHVkZXMobmV4dFN0YXRlKSk7XG4gICAgICBzdGF0ZSA9IG5leHRTdGF0ZTtcbiAgICB9LFxuICAgIGdldFN0YXR1czogXyA9PiBzdGF0ZSxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlU3RhdGVNYWNoaW5lKG1ha2VTdGF0ZU1hY2hpbmUpO1xuaGFyZGVuKG1ha2VTdGF0ZU1hY2hpbmUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVN0YXRlTWFjaGluZSI6WyJtYWtlU3RhdGVNYWNoaW5lIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAI0ZVBcGBgAABgYAADUAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvc3RhdGlzdGljcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiY2FsY3VsYXRlTWVkaWFuIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFR5cGVkTWF0aFxuICogQHByb3BlcnR5IHsoYTogVCwgYjogVCkgPT4gVH0gYWRkXG4gKiBAcHJvcGVydHkgeyhhOiBULCBiOiBiaWdpbnQpID0+IFR9IGRpdmlkZVxuICogQHByb3BlcnR5IHsoYTogVCwgYjogVCkgPT4gYm9vbGVhbn0gaXNHVEVcbiAqL1xuXG4vKipcbiAqIENhbGN1bGF0ZSB0aGUgbWVkaWFuIG9mIGEgc2V0IG9mIHNhbXBsZXNcbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtBcnJheTxUPn0gc2FtcGxlcyB0aGUgaW5wdXQgbWVhc3VyZW1lbnRzXG4gKiBAcGFyYW0ge1R5cGVkTWF0aDxUPn0gbWF0aFxuICogQHJldHVybnMge1QgfCB1bmRlZmluZWR9IHRoZSBtZWRpYW4gKHVuZGVmaW5lZCBpZiBubyBzYW1wbGVzKVxuICovXG4gICAgICAgY29uc3QgY2FsY3VsYXRlTWVkaWFuID0gKHNhbXBsZXMsIG1hdGgpID0+IHtcbiAgY29uc3Qgc29ydGVkID0gc2FtcGxlcy5zb3J0KChhLCBiKSA9PiB7XG4gICAgaWYgKCFtYXRoLmlzR1RFKGEsIGIpKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfSBlbHNlIGlmICghbWF0aC5pc0dURShiLCBhKSkge1xuICAgICAgcmV0dXJuIDE7XG4gICAgfVxuICAgIHJldHVybiAwO1xuICB9KTtcblxuICBpZiAoc29ydGVkLmxlbmd0aCA9PT0gMCkge1xuICAgIC8qIE5vIHZhbGlkIHNhbXBsZXMsIGRvbid0IHJlcG9ydCBhbnl0aGluZy4qL1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cblxuICBpZiAoc29ydGVkLmxlbmd0aCAlIDIgIT09IDApIHtcbiAgICAvKiBPZGQgbGVuZ3RoLCBqdXN0IHBpY2sgdGhlIG1pZGRsZSBlbGVtZW50LiovXG4gICAgcmV0dXJuIHNvcnRlZFsoc29ydGVkLmxlbmd0aCAtIDEpIC8gMl07XG4gIH1cblxuICAvKiBFdmVuIGxlbmd0aCwgdGFrZSB0aGUgbWVhbiBvZiB0aGUgdHdvIG1pZGRsZSB2YWx1ZXMuKi9cbiAgY29uc3Qgc2Vjb25kSW5kZXggPSBzb3J0ZWQubGVuZ3RoIC8gMjtcbiAgY29uc3Qgc3VtID0gbWF0aC5hZGQoc29ydGVkW3NlY29uZEluZGV4IC0gMV0sIHNvcnRlZFtzZWNvbmRJbmRleF0pO1xuICByZXR1cm4gbWF0aC5kaXZpZGUoc3VtLCAybik7XG59OyRozY9fb25jZS5jYWxjdWxhdGVNZWRpYW4oY2FsY3VsYXRlTWVkaWFuKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNhbGN1bGF0ZU1lZGlhbiI6WyJjYWxjdWxhdGVNZWRpYW4iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAYwjL1L8JAAC/CQAAMQAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC90b3BpY3MuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9ub3RpZmllciIsIkBhZ29yaWMvc3RvcmUiLCJAZW5kby9mYXIiXSwiZXhwb3J0cyI6WyJQdWJsaWNUb3BpY1NoYXBlIiwiU3Vic2NyaWJlclNoYXBlIiwiVG9waWNzUmVjb3JkU2hhcGUiLCJtYWtlUmVjb3JkZXJUb3BpYyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IFN1YnNjcmliZXJTaGFwZSxNLEU7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL25vdGlmaWVyXCIsIFtbXCJTdWJzY3JpYmVyU2hhcGVcIixbJGjNj19hID0+IChTdWJzY3JpYmVyU2hhcGUgPSAkaM2PX2EpLCRozY9fbGl2ZVtcIlN1YnNjcmliZXJTaGFwZVwiXV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLFskaM2PX2EgPT4gKE0gPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgICAgIGNvbnN0IFB1YmxpY1RvcGljU2hhcGUgPSBNLnNwbGl0UmVjb3JkKFxuICB7XG4gICAgc3Vic2NyaWJlcjogU3Vic2NyaWJlclNoYXBlLFxuICAgIHN0b3JhZ2VQYXRoOiBNLm9yKE0ucHJvbWlzZSgvKiBzdHJpbmcgKi8pLCBNLnN0cmluZygpKSxcbiAgfSxcbiAgeyBkZXNjcmlwdGlvbjogTS5zdHJpbmcoKSB9LFxuKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge29iamVjdH0gVCB0b3BpYyB2YWx1ZVxuICogQHR5cGVkZWYge3tcbiAqICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gKiAgIHN1YnNjcmliZXI6IFN1YnNjcmliZXI8VD4sXG4gKiAgIHN0b3JhZ2VQYXRoOiBFUmVmPHN0cmluZz4sXG4gKiB9fSBQdWJsaWNUb3BpY1xuICovXG5cbi8qKlxuICogQSB7UHVibGljVG9waWN9IGluIHdoaWNoIHRoZSBgc3RvcmFnZVBhdGhgIGlzIGFsd2F5cyBhIHJlc29sdmVkIHN0cmluZyBhbmQgdGhlIGBzdWJzY3JpYmVyIGlzIHJlbW90ZS5cbiAqXG4gKiBVc2VmdWwgd2hlbiB3b3JraW5nIHdpdGggVm93cyBhbmQgYXN5bmMtZmxvdy5cbiAqXG4gKiBAdGVtcGxhdGUge29iamVjdH0gVCB0b3BpYyB2YWx1ZVxuICogQHR5cGVkZWYge3tcbiAqICAgZGVzY3JpcHRpb24/OiBzdHJpbmcsXG4gKiAgIHN1YnNjcmliZXI6IFJlbW90ZTxTdWJzY3JpYmVyPFQ+PixcbiAqICAgc3RvcmFnZVBhdGg6IHN0cmluZyxcbiAqIH19IFJlc29sdmVkUHVibGljVG9waWNcbiAqLyRozY9fb25jZS5QdWJsaWNUb3BpY1NoYXBlKFB1YmxpY1RvcGljU2hhcGUpO1xuXG4gICAgICAgY29uc3QgVG9waWNzUmVjb3JkU2hhcGUgPSBNLnJlY29yZE9mKE0uc3RyaW5nKCksIFB1YmxpY1RvcGljU2hhcGUpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIFt0b3BpY05hbWU6IHN0cmluZ106IFB1YmxpY1RvcGljPHVua25vd24+LFxuICogfX0gVG9waWNzUmVjb3JkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e1xuICogICBbdG9waWNOYW1lOiBzdHJpbmddOiBSZXNvbHZlZFB1YmxpY1RvcGljPHVua25vd24+LFxuICogfX0gUmVzb2x2ZWRUb3BpY3NSZWNvcmRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzY3JpcHRpb25cbiAqIEBwYXJhbSB7UmVjb3JkZXJLaXQ8VD4gfCBFdmVudHVhbFJlY29yZGVyS2l0PFQ+fSByZWNvcmRlcktpdFxuICogQHJldHVybnMge1B1YmxpY1RvcGljPFQ+fVxuICovJGjNj19vbmNlLlRvcGljc1JlY29yZFNoYXBlKFRvcGljc1JlY29yZFNoYXBlKTtcbiAgICAgICBjb25zdCBtYWtlUmVjb3JkZXJUb3BpYyA9IChkZXNjcmlwdGlvbiwgcmVjb3JkZXJLaXQpID0+IHtcbiAgY29uc3QgcmVjUCA9XG4gICAgJ3JlY29yZGVyJyBpbiByZWNvcmRlcktpdCA/IHJlY29yZGVyS2l0LnJlY29yZGVyIDogcmVjb3JkZXJLaXQucmVjb3JkZXJQO1xuICByZXR1cm4ge1xuICAgIGRlc2NyaXB0aW9uLFxuICAgIHN1YnNjcmliZXI6IHJlY29yZGVyS2l0LnN1YnNjcmliZXIsXG4gICAgc3RvcmFnZVBhdGg6IEUocmVjUCkuZ2V0U3RvcmFnZVBhdGgoKSxcbiAgfTtcbn07JGjNj19vbmNlLm1ha2VSZWNvcmRlclRvcGljKG1ha2VSZWNvcmRlclRvcGljKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7IlN1YnNjcmliZXJTaGFwZSI6WyJTdWJzY3JpYmVyU2hhcGUiLGZhbHNlXX0sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJQdWJsaWNUb3BpY1NoYXBlIjpbIlB1YmxpY1RvcGljU2hhcGUiXSwiVG9waWNzUmVjb3JkU2hhcGUiOlsiVG9waWNzUmVjb3JkU2hhcGUiXSwibWFrZVJlY29yZGVyVG9waWMiOlsibWFrZVJlY29yZGVyVG9waWMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAwa5TcJM9AACTPQAANQAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC96b2VIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAYWdvcmljL3N0b3JlIiwiQGVuZG8vZXJyb3JzIiwiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL3Byb21pc2Uta2l0IiwiLi4vY29udHJhY3RGYWNldC9vZmZlclNhZmV0eS5qcyIsIi4vYXRvbWljVHJhbnNmZXIuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRJc3N1ZXJLZXl3b3JkcyIsImFzc2VydE5hdEFzc2V0S2luZCIsImFzc2VydFByb3Bvc2FsU2hhcGUiLCJkZWZhdWx0QWNjZXB0YW5jZU1zZyIsImRlcG9zaXRUb1NlYXQiLCJkZXBvc2l0VG9TZWF0U3VjY2Vzc01zZyIsImZpdFByb3Bvc2FsU2hhcGUiLCJtYXBLZXl3b3JkcyIsIm9mZmVyVG8iLCJzYXRpc2ZpZXMiLCJzYXZlQWxsSXNzdWVycyIsInN3YXAiLCJzd2FwRXhhY3QiLCJ3aXRoZHJhd0Zyb21TZWF0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgQXNzZXRLaW5kLGZyb21VbmlxdWVFbnRyaWVzLGtleUVRLG11c3RNYXRjaCxGYWlsLEUsbWFrZVByb21pc2VLaXQsc2F0aXNmaWVzV2FudCxhdG9taWNUcmFuc2Zlcixmcm9tT25seSx0b09ubHk7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL2VydHBcIiwgW1tcIkFzc2V0S2luZFwiLFskaM2PX2EgPT4gKEFzc2V0S2luZCA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcImZyb21VbmlxdWVFbnRyaWVzXCIsWyRozY9fYSA9PiAoZnJvbVVuaXF1ZUVudHJpZXMgPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJrZXlFUVwiLFskaM2PX2EgPT4gKGtleUVRID0gJGjNj19hKV1dLFtcIm11c3RNYXRjaFwiLFskaM2PX2EgPT4gKG11c3RNYXRjaCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJtYWtlUHJvbWlzZUtpdFwiLFskaM2PX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjNj19hKV1dXV0sW1wiLi4vY29udHJhY3RGYWNldC9vZmZlclNhZmV0eS5qc1wiLCBbW1wic2F0aXNmaWVzV2FudFwiLFskaM2PX2EgPT4gKHNhdGlzZmllc1dhbnQgPSAkaM2PX2EpXV1dXSxbXCIuL2F0b21pY1RyYW5zZmVyLmpzXCIsIFtbXCJhdG9taWNUcmFuc2ZlclwiLFskaM2PX2EgPT4gKGF0b21pY1RyYW5zZmVyID0gJGjNj19hKV1dLFtcImZyb21Pbmx5XCIsWyRozY9fYSA9PiAoZnJvbU9ubHkgPSAkaM2PX2EpXV0sW1widG9Pbmx5XCIsWyRozY9fYSA9PiAodG9Pbmx5ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1BhdHRlcm59IGZyb20gJ0BlbmRvL3BhdHRlcm5zJztcbiAqIEBpbXBvcnQge0Ftb3VudEtleXdvcmRSZWNvcmQsIENvbnRyYWN0TWV0YSwgSW52aXRhdGlvbiwgSXNzdWVyS2V5d29yZFJlY29yZCwgS2V5d29yZCwgUGF5bWVudFBLZXl3b3JkUmVjb3JkLCBQcm9wb3NhbCwgUHJvcG9zYWxSZWNvcmQsIFVzZXJTZWF0LCBaQ0YsIFpDRlNlYXR9IGZyb20gJ0BhZ29yaWMvem9lJztcbiAqIEBpbXBvcnQge0tleXdvcmRLZXl3b3JkUmVjb3JkLCBNYXBLZXl3b3JkcywgUmV2ZXJzZSwgU3dhcCwgU3dhcEV4YWN0fSBmcm9tICcuL3R5cGVzLmpzJztcbiAqIEBpbXBvcnQge0FsbG9jYXRpb259IGZyb20gJy4uL2NvbnRyYWN0RmFjZXQvdHlwZXMudHMnO1xuICogQGltcG9ydCB7RVJlZn0gZnJvbSAnQGFnb3JpYy92b3cnO1xuICovXG5cbiAgICAgICBjb25zdCBkZWZhdWx0QWNjZXB0YW5jZU1zZyA9IGBUaGUgb2ZmZXIgaGFzIGJlZW4gYWNjZXB0ZWQuIE9uY2UgdGhlIGNvbnRyYWN0IGhhcyBiZWVuIGNvbXBsZXRlZCwgcGxlYXNlIGNoZWNrIHlvdXIgcGF5b3V0YDskaM2PX29uY2UuZGVmYXVsdEFjY2VwdGFuY2VNc2coZGVmYXVsdEFjY2VwdGFuY2VNc2cpO1xuXG5jb25zdCBnZXRLZXlzU29ydGVkID0gb2JqID0+IGhhcmRlbihSZWZsZWN0Lm93bktleXMob2JqIHx8IHt9KS5zb3J0KCkpO1xuXG4gICAgICAgY29uc3QgYXNzZXJ0SXNzdWVyS2V5d29yZHMgPSAoemNmLCBleHBlY3RlZCkgPT4ge1xuICBjb25zdCB7IGlzc3VlcnMgfSA9IHpjZi5nZXRUZXJtcygpO1xuICBjb25zdCBhY3R1YWwgPSBnZXRLZXlzU29ydGVkKGlzc3VlcnMpO1xuICBleHBlY3RlZCA9IFsuLi5leHBlY3RlZF07IC8qIGluIGNhc2UgaGFyZGVuZWQqL1xuICBleHBlY3RlZC5zb3J0KCk7XG4gIGtleUVRKGFjdHVhbCwgaGFyZGVuKGV4cGVjdGVkKSkgfHxcbiAgICBGYWlsYGtleXdvcmRzOiAke2FjdHVhbH0gd2VyZSBub3QgYXMgZXhwZWN0ZWQ6ICR7ZXhwZWN0ZWR9YDtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gWmNmU2VhdFBhcnRpYWxcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvcG9zYWxSZWNvcmR9IGdldFByb3Bvc2FsXG4gKiBAcHJvcGVydHkgeygpID0+IEFsbG9jYXRpb259IGdldEN1cnJlbnRBbGxvY2F0aW9uXG4gKi9cblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIGFuIHVwZGF0ZSB0byBjdXJyZW50QWxsb2NhdGlvbiBzYXRpc2ZpZXNcbiAqIHByb3Bvc2FsLndhbnQuIE5vdGUgdGhhdCB0aGlzIGlzIGhhbGYgb2YgdGhlIG9mZmVyIHNhZmV0eVxuICogY2hlY2s7IHdoZXRoZXIgdGhlIGFsbG9jYXRpb24gY29uc3RpdHV0ZXMgYSByZWZ1bmQgaXMgbm90XG4gKiBjaGVja2VkLiBUaGUgdXBkYXRlIGlzIG1lcmdlZCB3aXRoIGN1cnJlbnRBbGxvY2F0aW9uXG4gKiAodXBkYXRlJ3MgdmFsdWVzIHByZXZhaWxpbmcgaWYgdGhlIGtleXdvcmRzIGFyZSB0aGUgc2FtZSlcbiAqIHRvIHByb2R1Y2UgdGhlIG5ld0FsbG9jYXRpb24uIFRoZSByZXR1cm4gdmFsdWUgaXMgMCBmb3JcbiAqIGZhbHNlIGFuZCAxIGZvciB0cnVlLiBXaGVuIG11bHRpcGxlcyBhcmUgaW50cm9kdWNlZCwgYW55XG4gKiBwb3NpdGl2ZSByZXR1cm4gdmFsdWUgd2lsbCBtZWFuIHRydWUuXG4gKlxuICogQHBhcmFtIHthbnl9IF9pZ25vcmVkIG5vIGxvbmdlciB1c2VkLlxuICogQHBhcmFtIHtaY2ZTZWF0UGFydGlhbH0gc2VhdFxuICogQHBhcmFtIHtBbW91bnRLZXl3b3JkUmVjb3JkfSB1cGRhdGVcbiAqIEByZXR1cm5zIHswfDF9XG4gKi8kaM2PX29uY2UuYXNzZXJ0SXNzdWVyS2V5d29yZHMoYXNzZXJ0SXNzdWVyS2V5d29yZHMpO1xuICAgICAgIGNvbnN0IHNhdGlzZmllcyA9IChfaWdub3JlZCwgc2VhdCwgdXBkYXRlKSA9PiB7XG4gIGNvbnN0IGN1cnJlbnRBbGxvY2F0aW9uID0gc2VhdC5nZXRDdXJyZW50QWxsb2NhdGlvbigpO1xuICBjb25zdCBuZXdBbGxvY2F0aW9uID0geyAuLi5jdXJyZW50QWxsb2NhdGlvbiwgLi4udXBkYXRlIH07XG4gIGNvbnN0IHByb3Bvc2FsID0gc2VhdC5nZXRQcm9wb3NhbCgpO1xuICByZXR1cm4gc2F0aXNmaWVzV2FudChwcm9wb3NhbCwgbmV3QWxsb2NhdGlvbik7XG59O1xuXG4vKiogQHR5cGUge1N3YXB9ICovJGjNj19vbmNlLnNhdGlzZmllcyhzYXRpc2ZpZXMpO1xuICAgICAgIGNvbnN0IHN3YXAgPSAoemNmLCBsZWZ0U2VhdCwgcmlnaHRTZWF0KSA9PiB7XG4gIHRyeSB7XG4gICAgemNmLmF0b21pY1JlYXJyYW5nZShcbiAgICAgIGhhcmRlbihbXG4gICAgICAgIFtyaWdodFNlYXQsIGxlZnRTZWF0LCBsZWZ0U2VhdC5nZXRQcm9wb3NhbCgpLndhbnRdLFxuICAgICAgICBbbGVmdFNlYXQsIHJpZ2h0U2VhdCwgcmlnaHRTZWF0LmdldFByb3Bvc2FsKCkud2FudF0sXG4gICAgICBdKSxcbiAgICApO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICBsZWZ0U2VhdC5mYWlsKGVycik7XG4gICAgcmlnaHRTZWF0LmZhaWwoZXJyKTtcbiAgICB0aHJvdyBlcnI7XG4gIH1cblxuICBsZWZ0U2VhdC5leGl0KCk7XG4gIHJpZ2h0U2VhdC5leGl0KCk7XG4gIHJldHVybiBkZWZhdWx0QWNjZXB0YW5jZU1zZztcbn07XG5cbi8qKiBAdHlwZSB7U3dhcEV4YWN0fSAqLyRozY9fb25jZS5zd2FwKHN3YXApO1xuICAgICAgIGNvbnN0IHN3YXBFeGFjdCA9ICh6Y2YsIGxlZnRTZWF0LCByaWdodFNlYXQpID0+IHtcbiAgdHJ5IHtcbiAgICB6Y2YuYXRvbWljUmVhcnJhbmdlKFxuICAgICAgaGFyZGVuKFtcbiAgICAgICAgZnJvbU9ubHkocmlnaHRTZWF0LCByaWdodFNlYXQuZ2V0UHJvcG9zYWwoKS5naXZlKSxcbiAgICAgICAgZnJvbU9ubHkobGVmdFNlYXQsIGxlZnRTZWF0LmdldFByb3Bvc2FsKCkuZ2l2ZSksXG5cbiAgICAgICAgdG9Pbmx5KGxlZnRTZWF0LCBsZWZ0U2VhdC5nZXRQcm9wb3NhbCgpLndhbnQpLFxuICAgICAgICB0b09ubHkocmlnaHRTZWF0LCByaWdodFNlYXQuZ2V0UHJvcG9zYWwoKS53YW50KSxcbiAgICAgIF0pLFxuICAgICk7XG4gIH0gY2F0Y2ggKGVycikge1xuICAgIGxlZnRTZWF0LmZhaWwoZXJyKTtcbiAgICByaWdodFNlYXQuZmFpbChlcnIpO1xuICAgIHRocm93IGVycjtcbiAgfVxuXG4gIGxlZnRTZWF0LmV4aXQoKTtcbiAgcmlnaHRTZWF0LmV4aXQoKTtcbiAgcmV0dXJuIGRlZmF1bHRBY2NlcHRhbmNlTXNnO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiBFeHBlY3RlZFJlY29yZFxuICogQHByb3BlcnR5IHtSZWNvcmQ8S2V5d29yZCwgbnVsbD59IFt3YW50XVxuICogQHByb3BlcnR5IHtSZWNvcmQ8S2V5d29yZCwgbnVsbD59IFtnaXZlXVxuICogQHByb3BlcnR5IHtQYXJ0aWFsPFJlY29yZDxrZXlvZiBQcm9wb3NhbFJlY29yZFsnZXhpdCddLCBudWxsPj59IFtleGl0XVxuICovXG5cbi8qKlxuICogQ2hlY2sgdGhlIHNlYXQncyBwcm9wb3NhbCBhZ2FpbnN0IGBwcm9wb3NhbFNoYXBlYC5cbiAqIElmIHRoZSBjbGllbnQgc3VibWl0cyBhbiBvZmZlciB3aGljaCBkb2VzIG5vdCBtYXRjaFxuICogdGhlc2UgZXhwZWN0YXRpb25zLCB0aGUgc2VhdCB3aWxsIGJlIGV4aXRlZCAoYW5kIHBheW1lbnRzIHJlZnVuZGVkKS5cbiAqXG4gKiBAcGFyYW0ge1pDRlNlYXR9IHNlYXRcbiAqIEBwYXJhbSB7UGF0dGVybn0gcHJvcG9zYWxTaGFwZVxuICovJGjNj19vbmNlLnN3YXBFeGFjdChzd2FwRXhhY3QpO1xuICAgICAgIGNvbnN0IGZpdFByb3Bvc2FsU2hhcGUgPSAoc2VhdCwgcHJvcG9zYWxTaGFwZSkgPT5cbiAgLyogVE9ETyByZW1vdmUgdGhpcyBoYXJkZW4sIG9ibGlnYXRpbmcgb3VyIGNhbGxlciB0byBoYXJkZW4uKi9cbiAgbXVzdE1hdGNoKHNlYXQuZ2V0UHJvcG9zYWwoKSwgaGFyZGVuKHByb3Bvc2FsU2hhcGUpLCAncHJvcG9zYWwnKTtcblxuLyoqXG4gKiBDaGVjayB0aGUgc2VhdCdzIHByb3Bvc2FsIGFnYWluc3QgYW4gYGV4cGVjdGVkYCByZWNvcmQgdGhhdCBzYXlzXG4gKiB3aGF0IFwic2hhcGVcIiBvZiBwcm9wb3NhbCBpcyBhY2NlcHRhYmxlLlxuICpcbiAqIE5vdGUgdGhhdCBieSBvdXIgY3VycmVudCB0ZXJtaW5vbG9neSwgdGhpcyBmdW5jdGlvbiBpcyBtaXNuYW1lZCBiZWNhdXNlXG4gKiB3ZSB1c2VcbiAqIFtcIlNoYXBlXCIgdG8gcmVmZXIgdG8gcGF0dGVybnNdKGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9ibG9iL21hc3Rlci9wYWNrYWdlcy9zdG9yZS9zcmMvdHlwZXMuanMjTDU2LUw3NCksXG4gKiBhbmQgdGhlIGBleHBlY3RlZGAgYXJndW1lbnQgaXMgbm90IHN1Y2ggYSBwYXR0ZXJuLiBSYXRoZXIgaXQgaXMgYW4gYWQtaG9jXG4gKiBwYXR0ZXJuLWxpa2Ugc3BlY2lhbCBjYXNlIHJlY29yZCB0aGF0IGlzIGRpZmZlcmVudCBhbmQgbXVjaCBsZXNzIGV4cHJlc3NpdmUuXG4gKlxuICogVGhpcyBFeHBlY3RlZFJlY29yZCBpcyBsaWtlIGEgUHJvcG9zYWwsIGJ1dCB0aGUgYW1vdW50cyBpbiAnd2FudCdcbiAqIGFuZCAnZ2l2ZScgc2hvdWxkIGJlIG51bGw7IHRoZSBleGl0IGNsYXVzZSBzaG91bGQgc3BlY2lmeSBhIHJ1bGUgd2l0aFxuICogbnVsbCBjb250ZW50cy4gSWYgdGhlIGNsaWVudCBzdWJtaXRzIGFuIG9mZmVyIHdoaWNoIGRvZXMgbm90IG1hdGNoXG4gKiB0aGVzZSBleHBlY3RhdGlvbnMsIHRoZSBzZWF0IHdpbGwgYmUgZXhpdGVkIChhbmQgcGF5bWVudHMgcmVmdW5kZWQpLlxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSBvcHRpb25hbCBgcHJvcG9zYWxTaGFwZWAgYXJndW1lbnQgdG8gYG1ha2VJbnZpdGF0aW9uYCB3aXRoXG4gKiBhIGdlbnVpbmUgcGF0dGVybi5cbiAqIEBwYXJhbSB7WkNGU2VhdH0gc2VhdFxuICogQHBhcmFtIHtFeHBlY3RlZFJlY29yZH0gZXhwZWN0ZWRcbiAqLyRozY9fb25jZS5maXRQcm9wb3NhbFNoYXBlKGZpdFByb3Bvc2FsU2hhcGUpO1xuICAgICAgIGNvbnN0IGFzc2VydFByb3Bvc2FsU2hhcGUgPSAoc2VhdCwgZXhwZWN0ZWQpID0+IHtcbiAgYXNzZXJ0LnR5cGVvZihleHBlY3RlZCwgJ29iamVjdCcpO1xuICAhQXJyYXkuaXNBcnJheShleHBlY3RlZCkgfHwgRmFpbGBFeHBlY3RlZCBtdXN0IGJlIGFuIG5vbi1hcnJheSBvYmplY3RgO1xuICBjb25zdCBhc3NlcnRWYWx1ZXNOdWxsID0gZSA9PiB7XG4gICAgaWYgKGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBPYmplY3QudmFsdWVzKGUpKSB7XG4gICAgICAgIHZhbHVlID09PSBudWxsIHx8XG4gICAgICAgICAgRmFpbGBUaGUgdmFsdWUgb2YgdGhlIGV4cGVjdGVkIHJlY29yZCBtdXN0IGJlIG51bGwgYnV0IHdhcyAke3ZhbHVlfWA7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qIEFzc2VydCB2YWx1ZXMgb2YgdGhlIGV4cGVjdGVkIHJlY29yZCBhcmUgYWxsIG51bGwuIFdlIGRvIG5vdCovXG4gIC8qIGNoZWNrIHRoZSB2YWx1ZXMgb2YgdGhlIGFjdHVhbCBwcm9wb3NhbC4qL1xuICBhc3NlcnRWYWx1ZXNOdWxsKGV4cGVjdGVkLmdpdmUpO1xuICBhc3NlcnRWYWx1ZXNOdWxsKGV4cGVjdGVkLndhbnQpO1xuICBhc3NlcnRWYWx1ZXNOdWxsKGV4cGVjdGVkLmV4aXQpO1xuXG4gIGNvbnN0IGFjdHVhbCA9IHNlYXQuZ2V0UHJvcG9zYWwoKTtcbiAgY29uc3QgYXNzZXJ0S2V5cyA9IChhLCBlKSA9PiB7XG4gICAgaWYgKGUgIT09IHVuZGVmaW5lZCkge1xuICAgICAga2V5RVEoZ2V0S2V5c1NvcnRlZChhKSwgZ2V0S2V5c1NvcnRlZChlKSkgfHxcbiAgICAgICAgRmFpbGBhY3R1YWwgJHthfSBkaWQgbm90IG1hdGNoIGV4cGVjdGVkICR7ZX1gO1xuICAgIH1cbiAgfTtcbiAgYXNzZXJ0S2V5cyhhY3R1YWwuZ2l2ZSwgZXhwZWN0ZWQuZ2l2ZSk7XG4gIGFzc2VydEtleXMoYWN0dWFsLndhbnQsIGV4cGVjdGVkLndhbnQpO1xuICBhc3NlcnRLZXlzKGFjdHVhbC5leGl0LCBleHBlY3RlZC5leGl0KTtcbn07XG5cbi8qIEdpdmVuIGEgYnJhbmQsIGFzc2VydCB0aGF0IGJyYW5kIGlzIEFzc2V0S2luZC5OQVQuICovJGjNj19vbmNlLmFzc2VydFByb3Bvc2FsU2hhcGUoYXNzZXJ0UHJvcG9zYWxTaGFwZSk7XG4gICAgICAgY29uc3QgYXNzZXJ0TmF0QXNzZXRLaW5kID0gKHpjZiwgYnJhbmQpID0+IHtcbiAgemNmLmdldEFzc2V0S2luZChicmFuZCkgPT09IEFzc2V0S2luZC5OQVQgfHxcbiAgICBGYWlsYGJyYW5kIG11c3QgYmUgQXNzZXRLaW5kLk5BVGA7XG59OyRozY9fb25jZS5hc3NlcnROYXRBc3NldEtpbmQoYXNzZXJ0TmF0QXNzZXRLaW5kKTtcblxuICAgICAgIGNvbnN0IGRlcG9zaXRUb1NlYXRTdWNjZXNzTXNnID0gYERlcG9zaXQgYW5kIHJlYWxsb2NhdGlvbiBzdWNjZXNzZnVsLmA7XG5cbi8qKlxuICogRGVwb3NpdCBwYXltZW50cyBzdWNoIHRoYXQgdGhlaXIgYW1vdW50cyBhcmUgcmVhbGxvY2F0ZWQgdG8gYSBzZWF0LlxuICogVGhlIGBhbW91bnRzYCBhbmQgYHBheW1lbnRzYCByZWNvcmRzIG11c3QgaGF2ZSBjb3JyZXNwb25kaW5nXG4gKiBrZXl3b3Jkcy5cbiAqXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge1pDRlNlYXR9IHJlY2lwaWVudFNlYXRcbiAqIEBwYXJhbSB7QW1vdW50S2V5d29yZFJlY29yZH0gYW1vdW50c1xuICogQHBhcmFtIHtQYXltZW50UEtleXdvcmRSZWNvcmR9IHBheW1lbnRzXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBgRGVwb3NpdCBhbmQgcmVhbGxvY2F0aW9uIHN1Y2Nlc3NmdWwuYFxuICovJGjNj19vbmNlLmRlcG9zaXRUb1NlYXRTdWNjZXNzTXNnKGRlcG9zaXRUb1NlYXRTdWNjZXNzTXNnKTtcbiAgICAgICBjb25zdCBkZXBvc2l0VG9TZWF0ID0gYXN5bmMgKHpjZiwgcmVjaXBpZW50U2VhdCwgYW1vdW50cywgcGF5bWVudHMpID0+IHtcbiAgIXJlY2lwaWVudFNlYXQuaGFzRXhpdGVkKCkgfHwgRmFpbGBUaGUgcmVjaXBpZW50U2VhdCBjYW5ub3QgaGF2ZSBleGl0ZWQuYDtcblxuICAvKiBXZSB3aWxsIGNyZWF0ZSBhIHRlbXBvcmFyeSBvZmZlciB0byBiZSBhYmxlIHRvIGVzY3JvdyBvdXIgcGF5bWVudHMqL1xuICAvKiB3aXRoIFpvZS4qL1xuICBjb25zdCByZWFsbG9jYXRlQWZ0ZXJEZXBvc2l0ID0gdGVtcFNlYXQgPT4ge1xuICAgIC8qIEFmdGVyIHRoZSBhc3NldHMgYXJlIGRlcG9zaXRlZCwgcmVhbGxvY2F0ZSB0aGVtIG9udG8gdGhlIHJlY2lwaWVudCBzZWF0IGFuZCovXG4gICAgLyogZXhpdCB0aGUgdGVtcG9yYXJ5IHNlYXQuIE5vdGUgdGhhdCB0aGUgb2ZmZXJSZXN1bHQgaXMgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzKi9cbiAgICAvKiBmdW5jdGlvbiwgc28gdGhpcyBzeW5jaHJvbm91cyB0cmFkZSBtdXN0IGhhcHBlbiBiZWZvcmUgdGhlKi9cbiAgICAvKiBvZmZlclJlc3VsdCByZXNvbHZlcy4qL1xuICAgIGF0b21pY1RyYW5zZmVyKHpjZiwgdGVtcFNlYXQsIHJlY2lwaWVudFNlYXQsIGFtb3VudHMpO1xuICAgIHRlbXBTZWF0LmV4aXQoKTtcbiAgICByZXR1cm4gZGVwb3NpdFRvU2VhdFN1Y2Nlc3NNc2c7XG4gIH07XG4gIGNvbnN0IGludml0YXRpb24gPSB6Y2YubWFrZUludml0YXRpb24oXG4gICAgcmVhbGxvY2F0ZUFmdGVyRGVwb3NpdCxcbiAgICAndGVtcG9yYXJ5IHNlYXQgZm9yIGRlcG9zaXQnLFxuICApO1xuICBjb25zdCBwcm9wb3NhbCA9IGhhcmRlbih7IGdpdmU6IGFtb3VudHMgfSk7XG4gIGhhcmRlbihwYXltZW50cyk7XG4gIC8qIFRvIGVzY3JvdyB0aGUgcGF5bWVudCwgd2UgbXVzdCBnZXQgdGhlIFpvZSBTZXJ2aWNlIGZhY2V0IGFuZCovXG4gIC8qIG1ha2UgYW4gb2ZmZXIqL1xuICBjb25zdCB6b2UgPSB6Y2YuZ2V0Wm9lU2VydmljZSgpO1xuICBjb25zdCB0ZW1wVXNlclNlYXQgPSBFKHpvZSkub2ZmZXIoaW52aXRhdGlvbiwgcHJvcG9zYWwsIHBheW1lbnRzKTtcbiAgLyogVGhpcyB3aWxsIGJlIGEgcHJvbWlzZSBmb3IgdGhlIHN0cmluZzogYERlcG9zaXQgYW5kIHJlYWxsb2NhdGlvbiovXG4gIC8qIHN1Y2Nlc3NmdWwuYCBJdCB3aWxsIG9ubHkgZnVsZmlsbCBhZnRlciB0aGUgYXNzZXRzIGhhdmUgYmVlbiovXG4gIC8qIHN1Y2Nlc3NmdWxseSByZWFsbG9jYXRlZCB0byB0aGUgcmVjaXBpZW50IHNlYXQuKi9cbiAgcmV0dXJuIEUodGVtcFVzZXJTZWF0KS5nZXRPZmZlclJlc3VsdCgpO1xufTtcblxuLyoqXG4gKiBXaXRoZHJhdyBwYXltZW50cyBmcm9tIGEgc2VhdC4gTm90ZSB0aGF0IHdpdGhkcmF3aW5nIHRoZSBhbW91bnRzIG9mXG4gKiB0aGUgcGF5bWVudHMgbXVzdCBub3QgYW5kIGNhbm5vdCB2aW9sYXRlIG9mZmVyIHNhZmV0eSBmb3IgdGhlIHNlYXQuIFRoZVxuICogYGFtb3VudHNgIGFuZCBgcGF5bWVudHNgIHJlY29yZHMgbXVzdCBoYXZlIGNvcnJlc3BvbmRpbmcga2V5d29yZHMuXG4gKlxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtaQ0ZTZWF0fSBzZWF0XG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmR9IGFtb3VudHNcbiAqIEByZXR1cm5zIHtQcm9taXNlPFBheW1lbnRQS2V5d29yZFJlY29yZD59XG4gKi8kaM2PX29uY2UuZGVwb3NpdFRvU2VhdChkZXBvc2l0VG9TZWF0KTtcbiAgICAgICBjb25zdCB3aXRoZHJhd0Zyb21TZWF0ID0gYXN5bmMgKHpjZiwgc2VhdCwgYW1vdW50cykgPT4ge1xuICAhc2VhdC5oYXNFeGl0ZWQoKSB8fCBGYWlsYFRoZSBzZWF0IGNhbm5vdCBoYXZlIGV4aXRlZC5gO1xuICBjb25zdCB7IHpjZlNlYXQ6IHRlbXBTZWF0LCB1c2VyU2VhdDogdGVtcFVzZXJTZWF0UCB9ID0gemNmLm1ha2VFbXB0eVNlYXRLaXQoKTtcbiAgYXRvbWljVHJhbnNmZXIoemNmLCBzZWF0LCB0ZW1wU2VhdCwgYW1vdW50cyk7XG4gIHRlbXBTZWF0LmV4aXQoKTtcbiAgcmV0dXJuIEUodGVtcFVzZXJTZWF0UCkuZ2V0UGF5b3V0cygpO1xufTtcblxuLyoqXG4gKiBTYXZlIGFsbCBvZiB0aGUgaXNzdWVycyBpbiBhbiBpc3N1ZXJzS2V5d29yZFJlY29yZCB0byBaQ0YsIHVzaW5nXG4gKiB0aGUgbWV0aG9kIGB6Y2Yuc2F2ZUlzc3VlcmAuIFRoaXMgZG9lcyBub3QgZXJyb3IgaWYgYW55IG9mIHRoZSBrZXl3b3Jkc1xuICogYWxyZWFkeSBleGlzdC4gSWYgdGhlIGtleXdvcmQgaXMgYWxyZWFkeSBwcmVzZW50LCBpdCBpcyBpZ25vcmVkLlxuICpcbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqIEBwYXJhbSB7SXNzdWVyS2V5d29yZFJlY29yZH0gaXNzdWVyS2V5d29yZFJlY29yZCBJc3N1ZXJzIHRvIHNhdmUgdG9cbiAqIFpDRlxuICovJGjNj19vbmNlLndpdGhkcmF3RnJvbVNlYXQod2l0aGRyYXdGcm9tU2VhdCk7XG4gICAgICAgY29uc3Qgc2F2ZUFsbElzc3VlcnMgPSBhc3luYyAoemNmLCBpc3N1ZXJLZXl3b3JkUmVjb3JkID0gaGFyZGVuKHt9KSkgPT4ge1xuICBjb25zdCB7IGlzc3VlcnMgfSA9IHpjZi5nZXRUZXJtcygpO1xuICBjb25zdCBpc3N1ZXJzUFNhdmVkID0gT2JqZWN0LmVudHJpZXMoaXNzdWVyS2V5d29yZFJlY29yZCkubWFwKFxuICAgIChba2V5d29yZCwgaXNzdWVyXSkgPT4ge1xuICAgICAgLyogSWYgdGhlIGtleXdvcmQgZG9lcyBub3QgeWV0IGV4aXN0LCBhZGQgaXQgYW5kIHRoZSovXG4gICAgICAvKiBhc3NvY2lhdGVkIGlzc3Vlci4qL1xuICAgICAgaWYgKGlzc3VlcnNba2V5d29yZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gemNmLnNhdmVJc3N1ZXIoaXNzdWVyLCBrZXl3b3JkKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSxcbiAgKTtcbiAgcmV0dXJuIFByb21pc2UuYWxsKGlzc3VlcnNQU2F2ZWQpO1xufTtcblxuLyoqIEB0eXBlIHtNYXBLZXl3b3Jkc30gKi8kaM2PX29uY2Uuc2F2ZUFsbElzc3VlcnMoc2F2ZUFsbElzc3VlcnMpO1xuICAgICAgIGNvbnN0IG1hcEtleXdvcmRzID0gKGtleXdvcmRSZWNvcmQgPSB7fSwga2V5d29yZE1hcHBpbmcpID0+IHtcbiAgcmV0dXJuIGhhcmRlbihcbiAgICBmcm9tVW5pcXVlRW50cmllcyhcbiAgICAgIE9iamVjdC5lbnRyaWVzKGtleXdvcmRSZWNvcmQpLm1hcCgoW2tleXdvcmQsIHZhbHVlXSkgPT4ge1xuICAgICAgICBpZiAoa2V5d29yZE1hcHBpbmdba2V5d29yZF0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHJldHVybiBba2V5d29yZCwgdmFsdWVdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBba2V5d29yZE1hcHBpbmdba2V5d29yZF0sIHZhbHVlXTtcbiAgICAgIH0pLFxuICAgICksXG4gICk7XG59O1xuLyoqIEB0eXBlIHtSZXZlcnNlfSAqLyRozY9fb25jZS5tYXBLZXl3b3JkcyhtYXBLZXl3b3Jkcyk7XG5jb25zdCByZXZlcnNlID0gKGtleXdvcmRSZWNvcmQgPSB7fSkgPT4ge1xuICByZXR1cm4gaGFyZGVuKFxuICAgIGZyb21VbmlxdWVFbnRyaWVzKFxuICAgICAgT2JqZWN0LmVudHJpZXMoa2V5d29yZFJlY29yZCkubWFwKChba2V5LCB2YWx1ZV0pID0+IFt2YWx1ZSwga2V5XSksXG4gICAgKSxcbiAgKTtcbn07XG5cbi8qKlxuICogTWFrZSBhbiBvZmZlciB0byBhbm90aGVyIGNvbnRyYWN0IGluc3RhbmNlIChsYWJlbGVkIGNvbnRyYWN0QiBiZWxvdyksXG4gKiB3aXRoZHJhd2luZyB0aGUgcGF5bWVudHMgZm9yIHRoZSBvZmZlciBmcm9tIGEgc2VhdCBpbiB0aGUgY3VycmVudFxuICogY29udHJhY3QgaW5zdGFuY2UgKGNvbnRyYWN0QSkgYW5kIGRlcG9zaXRpbmcgdGhlIHBheW91dHMgaW4gYW5vdGhlclxuICogc2VhdCBpbiB0aGUgY3VycmVudCBjb250cmFjdCBpbnN0YW5jZSAoY29udHJhY3RBKS5cbiAqXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiAgIFpvZSBDb250cmFjdCBGYWNldCBmb3IgY29udHJhY3RBXG4gKlxuICogQHBhcmFtIHtFUmVmPEludml0YXRpb248UmVzdWx0LCBBcmdzPj59IGludml0YXRpb25cbiAqICAgSW52aXRhdGlvbiB0byBjb250cmFjdEJcbiAqXG4gKiBAcGFyYW0ge0tleXdvcmRLZXl3b3JkUmVjb3JkIHwgdW5kZWZpbmVkfSBrZXl3b3JkTWFwcGluZ1xuICogICBNYXBwaW5nIG9mIGtleXdvcmRzIHVzZWQgaW4gY29udHJhY3RBIHRvIGtleXdvcmRzIHRvIGJlIHVzZWQgaW5cbiAqICAgY29udHJhY3RCLiBOb3RlIHRoYXQgdGhlIHBhdGh3YXkgdG8gZGVwb3NpdCB0aGUgcGF5b3V0IGJhY2sgdG9cbiAqICAgY29udHJhY3RBIHJldmVyc2VzIHRoaXMgbWFwcGluZy5cbiAqXG4gKiBAcGFyYW0ge1Byb3Bvc2FsfSBwcm9wb3NhbFxuICogICBUaGUgcHJvcG9zYWwgZm9yIHRoZSBvZmZlciB0byBiZSBtYWRlIHRvIGNvbnRyYWN0QlxuICpcbiAqIEBwYXJhbSB7WkNGU2VhdH0gZnJvbVNlYXRcbiAqICAgVGhlIHNlYXQgaW4gY29udHJhY3RBIHRvIHRha2UgdGhlIG9mZmVyIHBheW1lbnRzIGZyb20uXG4gKlxuICogQHBhcmFtIHtaQ0ZTZWF0fSBbdG9TZWF0XVxuICogICBUaGUgc2VhdCBpbiBjb250cmFjdEEgdG8gZGVwb3NpdCB0aGUgcGF5b3V0IG9mIHRoZSBvZmZlciB0by5cbiAqICAgSWYgYHRvU2VhdGAgaXMgbm90IHByb3ZpZGVkLCB0aGlzIGRlZmF1bHRzIHRvIHRoZSBgZnJvbVNlYXRgLlxuICpcbiAqIEBwYXJhbSB7QXJnc30gW29mZmVyQXJnc11cbiAqICAgQWRkaXRpb25hbCBjb250cmFjdC1zcGVjaWZpYyBvcHRpb25hbCBhcmd1bWVudHMgaW4gYSByZWNvcmQuXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8e3VzZXJTZWF0UHJvbWlzZTogUHJvbWlzZTxVc2VyU2VhdDxSZXN1bHQ+PiwgZGVwb3NpdGVkOiBQcm9taXNlPEFtb3VudEtleXdvcmRSZWNvcmQ+fT59XG4gKiAgIEEgcHJvbWlzZSBmb3IgdGhlIHVzZXJTZWF0IGZvciB0aGUgb2ZmZXIgdG8gdGhlIG90aGVyIGNvbnRyYWN0LCBhbmQgYVxuICogICBwcm9taXNlIChgZGVwb3NpdGVkYCkgd2hpY2ggcmVzb2x2ZXMgd2hlbiB0aGUgcGF5b3V0IGZvciB0aGUgb2ZmZXIgaGFzIGJlZW5cbiAqICAgZGVwb3NpdGVkIHRvIHRoZSBgdG9TZWF0YC5cbiAqICAgQW55IGZhaWx1cmVzIG9mIHRoZSBpbnZpdGF0aW9uIHdpbGwgYmUgcmV0dXJuZWQgYnkgYHVzZXJTZWF0UHJvbWlzZS5nZXRPZmZlclJlc3VsdCgpYC5cbiAqXG4gKiBAdGVtcGxhdGUge29iamVjdH0gQXJncyBPZmZlciBhcmdzXG4gKiBAdGVtcGxhdGUge29iamVjdH0gUmVzdWx0IE9mZmVyIHJlc3VsdFxuICovXG4gICAgICAgY29uc3Qgb2ZmZXJUbyA9IGFzeW5jIChcbiAgemNmLFxuICBpbnZpdGF0aW9uLFxuICBrZXl3b3JkTWFwcGluZyxcbiAgcHJvcG9zYWwsXG4gIGZyb21TZWF0LFxuICB0b1NlYXQsXG4gIG9mZmVyQXJncyxcbikgPT4ge1xuICBpZiAoa2V5d29yZE1hcHBpbmcgPT09IHVuZGVmaW5lZCkge1xuICAgIGtleXdvcmRNYXBwaW5nID0gaGFyZGVuKHt9KTtcbiAgfVxuXG4gIGNvbnN0IGRlZmluZWRUb1NlYXQgPSB0b1NlYXQgIT09IHVuZGVmaW5lZCA/IHRvU2VhdCA6IGZyb21TZWF0O1xuXG4gIGNvbnN0IHpvZSA9IHpjZi5nZXRab2VTZXJ2aWNlKCk7XG4gIGNvbnN0IG1hcHBpbmdSZXZlcnNlZCA9IHJldmVyc2Uoa2V5d29yZE1hcHBpbmcpO1xuXG4gIGNvbnN0IG5ld0tleXdvcmRzID1cbiAgICBwcm9wb3NhbCAhPT0gdW5kZWZpbmVkXG4gICAgICA/IG1hcEtleXdvcmRzKHByb3Bvc2FsLmdpdmUsIG1hcHBpbmdSZXZlcnNlZClcbiAgICAgIDogaGFyZGVuKHt9KTtcblxuICAvKiB0aGUgcHJvcG9zYWwgaXMgaW4gdGhlIG90aGVyIGNvbnRyYWN0J3Mga2V5d29yZHMsIGJ1dCB3ZSB3YW50IHRvKi9cbiAgLyogdXNlIGBwcm9wb3NhbC5naXZlYCB0byB3aXRoZHJhdyovXG4gIGNvbnN0IHBheW1lbnRzID0gYXdhaXQgd2l0aGRyYXdGcm9tU2VhdCh6Y2YsIGZyb21TZWF0LCBuZXdLZXl3b3Jkcyk7XG5cbiAgLyogTWFwIHRvIHRoZSBvdGhlciBjb250cmFjdCdzIGtleXdvcmRzKi9cbiAgY29uc3QgcGF5bWVudHNGb3JPdGhlckNvbnRyYWN0ID0gbWFwS2V5d29yZHMocGF5bWVudHMsIGtleXdvcmRNYXBwaW5nKTtcblxuICBjb25zdCB1c2VyU2VhdFByb21pc2UgPSBFKHpvZSkub2ZmZXIoXG4gICAgaW52aXRhdGlvbixcbiAgICBwcm9wb3NhbCxcbiAgICBwYXltZW50c0Zvck90aGVyQ29udHJhY3QsXG4gICAgb2ZmZXJBcmdzLFxuICApO1xuXG4gIGNvbnN0IGRlcG9zaXRlZFByb21pc2VLaXQgPSBtYWtlUHJvbWlzZUtpdCgpO1xuXG4gIGNvbnN0IGRvRGVwb3NpdCA9IGFzeW5jIHBheW91dFBheW1lbnRzID0+IHtcbiAgICAvKiBhZnRlciBnZXRQYXlvdXRzKCksIGdldEZpbmFsQWxsb2NhdGlvbigpIHJlc29sdmVzIHByb21wdGx5LiovXG4gICAgY29uc3QgYW1vdW50cyA9IGF3YWl0IEUodXNlclNlYXRQcm9taXNlKS5nZXRGaW5hbEFsbG9jYXRpb24oKTtcblxuICAgIC8qIE1hcCBiYWNrIHRvIHRoZSBvcmlnaW5hbCBjb250cmFjdCdzIGtleXdvcmRzKi9cbiAgICBjb25zdCBtYXBwZWRBbW91bnRzID0gbWFwS2V5d29yZHMoYW1vdW50cywgbWFwcGluZ1JldmVyc2VkKTtcbiAgICBjb25zdCBtYXBwZWRQYXltZW50cyA9IG1hcEtleXdvcmRzKHBheW91dFBheW1lbnRzLCBtYXBwaW5nUmV2ZXJzZWQpO1xuICAgIGF3YWl0IGRlcG9zaXRUb1NlYXQoemNmLCBkZWZpbmVkVG9TZWF0LCBtYXBwZWRBbW91bnRzLCBtYXBwZWRQYXltZW50cyk7XG4gICAgZGVwb3NpdGVkUHJvbWlzZUtpdC5yZXNvbHZlKG1hcHBlZEFtb3VudHMpO1xuICB9O1xuXG4gIHZvaWQgRSh1c2VyU2VhdFByb21pc2UpLmdldFBheW91dHMoKS50aGVuKGRvRGVwb3NpdCk7XG5cbiAgLyogVE9ETyByZW5hbWUgcmV0dXJuIGtleTsgdXNlclNlYXRQcm9taXNlIGlzIGEgcmVtb3RlIFVzZXJTZWF0Ki9cbiAgcmV0dXJuIGhhcmRlbih7IHVzZXJTZWF0UHJvbWlzZSwgZGVwb3NpdGVkOiBkZXBvc2l0ZWRQcm9taXNlS2l0LnByb21pc2UgfSk7XG59OyRozY9fb25jZS5vZmZlclRvKG9mZmVyVG8pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdEFjY2VwdGFuY2VNc2ciOlsiZGVmYXVsdEFjY2VwdGFuY2VNc2ciXSwiYXNzZXJ0SXNzdWVyS2V5d29yZHMiOlsiYXNzZXJ0SXNzdWVyS2V5d29yZHMiXSwic2F0aXNmaWVzIjpbInNhdGlzZmllcyJdLCJzd2FwIjpbInN3YXAiXSwic3dhcEV4YWN0IjpbInN3YXBFeGFjdCJdLCJmaXRQcm9wb3NhbFNoYXBlIjpbImZpdFByb3Bvc2FsU2hhcGUiXSwiYXNzZXJ0UHJvcG9zYWxTaGFwZSI6WyJhc3NlcnRQcm9wb3NhbFNoYXBlIl0sImFzc2VydE5hdEFzc2V0S2luZCI6WyJhc3NlcnROYXRBc3NldEtpbmQiXSwiZGVwb3NpdFRvU2VhdFN1Y2Nlc3NNc2ciOlsiZGVwb3NpdFRvU2VhdFN1Y2Nlc3NNc2ciXSwiZGVwb3NpdFRvU2VhdCI6WyJkZXBvc2l0VG9TZWF0Il0sIndpdGhkcmF3RnJvbVNlYXQiOlsid2l0aGRyYXdGcm9tU2VhdCJdLCJzYXZlQWxsSXNzdWVycyI6WyJzYXZlQWxsSXNzdWVycyJdLCJtYXBLZXl3b3JkcyI6WyJtYXBLZXl3b3JkcyJdLCJvZmZlclRvIjpbIm9mZmVyVG8iXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARXv4GawIAACsCAAAJQAAAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL21ha2VIYW5kbGUuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiLCJAZW5kby9lcnJvcnMiLCIuL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6WyJkZWZpbmVEdXJhYmxlSGFuZGxlIiwibWFrZUhhbmRsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGluaXRFbXB0eSxtYWtlRXhvLHByZXBhcmVFeG9DbGFzcyxGYWlsLEhhbmRsZUk7JGjNj19pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJpbml0RW1wdHlcIixbJGjNj19hID0+IChpbml0RW1wdHkgPSAkaM2PX2EpXV0sW1wibWFrZUV4b1wiLFskaM2PX2EgPT4gKG1ha2VFeG8gPSAkaM2PX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJwcmVwYXJlRXhvQ2xhc3NcIixbJGjNj19hID0+IChwcmVwYXJlRXhvQ2xhc3MgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi90eXBlR3VhcmRzLmpzXCIsIFtbXCJIYW5kbGVJXCIsWyRozY9fYSA9PiAoSGFuZGxlSSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7QmFnZ2FnZX0gZnJvbSAnQGFnb3JpYy92YXQtZGF0YSc7XG4gKiBAaW1wb3J0IHtIYW5kbGUsIEluc3RhbmNlfSBmcm9tICdAYWdvcmljL3pvZSc7XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge3N0cmluZ30gSFxuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge0h9IGhhbmRsZVR5cGVcbiAqIEByZXR1cm5zIHtIIGV4dGVuZHMgJ0luc3RhbmNlJyA/ICgpID0+IEluc3RhbmNlIDogKCkgPT4gSGFuZGxlPEg+fVxuICovXG4gICAgICAgY29uc3QgZGVmaW5lRHVyYWJsZUhhbmRsZSA9IChiYWdnYWdlLCBoYW5kbGVUeXBlKSA9PiB7XG4gIHR5cGVvZiBoYW5kbGVUeXBlID09PSAnc3RyaW5nJyB8fCBGYWlsYGhhbmRsZVR5cGUgbXVzdCBiZSBhIHN0cmluZ2A7XG4gIGNvbnN0IG1ha2VIYW5kbGUgPSBwcmVwYXJlRXhvQ2xhc3MoXG4gICAgYmFnZ2FnZSxcbiAgICBgJHtoYW5kbGVUeXBlfUhhbmRsZWAsXG4gICAgSGFuZGxlSSxcbiAgICBpbml0RW1wdHksXG4gICAge30sXG4gICk7XG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgQml0IGJ5IG91ciBvd24gb3BhcXVlIHR5cGVzLiovXG4gIHJldHVybiAvKiogQHR5cGUgeygpID0+IEhhbmRsZTxIPn0gKi8gKG1ha2VIYW5kbGUpO1xufTskaM2PX29uY2UuZGVmaW5lRHVyYWJsZUhhbmRsZShkZWZpbmVEdXJhYmxlSGFuZGxlKTtcbmhhcmRlbihkZWZpbmVEdXJhYmxlSGFuZGxlKTtcblxuLyoqXG4gKiBDcmVhdGUgYW4gb3BhcXVlIGhhbmRsZSBvYmplY3QuXG4gKlxuICogQHRlbXBsYXRlIHtzdHJpbmd9IEhcbiAqIEBwYXJhbSB7SH0gaGFuZGxlVHlwZSB0aGUgc3RyaW5nIGxpdGVyYWwgdHlwZSBvZiB0aGUgaGFuZGxlXG4gKiBAcmV0dXJucyB7SCBleHRlbmRzICdJbnN0YW5jZScgPyBJbnN0YW5jZSA6IEhhbmRsZTxIPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VIYW5kbGUgPSBoYW5kbGVUeXBlID0+IHtcbiAgdHlwZW9mIGhhbmRsZVR5cGUgPT09ICdzdHJpbmcnIHx8IEZhaWxgaGFuZGxlVHlwZSBtdXN0IGJlIGEgc3RyaW5nYDtcbiAgLyogUmV0dXJuIHRoZSBpbnRlcnNlY3Rpb24gdHlwZSAocmVhbGx5IGp1c3QgYW4gZW1wdHkgb2JqZWN0KS4qL1xuICAvKiBAdHMtZXhwZWN0LWVycm9yIEJpdCBieSBvdXIgb3duIG9wYXF1ZSB0eXBlcy4qL1xuICByZXR1cm4gLyoqIEB0eXBlIHtIYW5kbGU8SD59ICovIChtYWtlRXhvKGAke2hhbmRsZVR5cGV9SGFuZGxlYCwgSGFuZGxlSSwge30pKTtcbn07JGjNj19vbmNlLm1ha2VIYW5kbGUobWFrZUhhbmRsZSk7XG5oYXJkZW4obWFrZUhhbmRsZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZpbmVEdXJhYmxlSGFuZGxlIjpbImRlZmluZUR1cmFibGVIYW5kbGUiXSwibWFrZUhhbmRsZSI6WyJtYWtlSGFuZGxlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAHT9EtISwAASEsAACUAAABAYWdvcmljL3pvZS12MC4yNi4yL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvbm90aWZpZXIiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy90aW1lIl0sImV4cG9ydHMiOlsiQWRtaW5GYWNldEkiLCJBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUiLCJBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlIiwiQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUiLCJCdW5kbGVDYXBTaGFwZSIsIkJ1bmRsZVNoYXBlIiwiRW1wdHlQcm9wb3NhbFNoYXBlIiwiRXhpdE9iamVjdEkiLCJFeGl0T2JqZWN0U2hhcGUiLCJGZWVNaW50QWNjZXNzU2hhcGUiLCJGdWxsUHJvcG9zYWxTaGFwZSIsIkhhbmRsZUkiLCJIYW5kbGVPZmZlckkiLCJJbnN0YWxsYXRpb25TaGFwZSIsIkluc3RhbmNlQWRtaW5JIiwiSW5zdGFuY2VBZG1pblNoYXBlIiwiSW5zdGFuY2VIYW5kbGVTaGFwZSIsIkluc3RhbmNlUmVjb3JkU2hhcGUiLCJJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCIsIkludml0YXRpb25FbGVtZW50U2hhcGUiLCJJbnZpdGF0aW9uSGFuZGxlU2hhcGUiLCJJbnZpdGF0aW9uU2hhcGUiLCJJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUiLCJJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlIiwiSXNzdWVyUmVjb3JkU2hhcGUiLCJLZXl3b3JkU2hhcGUiLCJPZmZlckhhbmRsZXJJIiwiUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUiLCJQcmljZVF1b3RlU2hhcGUiLCJQcm9wb3NhbFNoYXBlIiwiU2VhdERhdGFTaGFwZSIsIlNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlIiwiU2VhdFNoYXBlIiwiVGVybXNTaGFwZSIsIlRpbWVyU2hhcGUiLCJVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZSIsIlpvZU1pbnRJIiwiWm9lTWludFNoYXBlIiwiWm9lU2VydmljZUkiLCJab2VTdG9yYWdlTWFuYWdlcklLaXQiLCJpc0FmdGVyRGVhZGxpbmVFeGl0UnVsZSIsImlzT25EZW1hbmRFeGl0UnVsZSIsImlzV2FpdmVkRXhpdFJ1bGUiLCJtYWtlSGFuZGxlU2hhcGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBBbW91bnRTaGFwZSxBc3NldEtpbmRTaGFwZSxCcmFuZFNoYXBlLERpc3BsYXlJbmZvU2hhcGUsSXNzdWVyS2l0U2hhcGUsSXNzdWVyU2hhcGUsUGF5bWVudFNoYXBlLFN1YnNjcmliZXJTaGFwZSxNLFRpbWVzdGFtcFNoYXBlOyRozY9faW1wb3J0cyhbW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRTaGFwZVwiLFskaM2PX2EgPT4gKEFtb3VudFNoYXBlID0gJGjNj19hKV1dLFtcIkFzc2V0S2luZFNoYXBlXCIsWyRozY9fYSA9PiAoQXNzZXRLaW5kU2hhcGUgPSAkaM2PX2EpXV0sW1wiQnJhbmRTaGFwZVwiLFskaM2PX2EgPT4gKEJyYW5kU2hhcGUgPSAkaM2PX2EpXV0sW1wiRGlzcGxheUluZm9TaGFwZVwiLFskaM2PX2EgPT4gKERpc3BsYXlJbmZvU2hhcGUgPSAkaM2PX2EpXV0sW1wiSXNzdWVyS2l0U2hhcGVcIixbJGjNj19hID0+IChJc3N1ZXJLaXRTaGFwZSA9ICRozY9fYSldXSxbXCJJc3N1ZXJTaGFwZVwiLFskaM2PX2EgPT4gKElzc3VlclNoYXBlID0gJGjNj19hKV1dLFtcIlBheW1lbnRTaGFwZVwiLFskaM2PX2EgPT4gKFBheW1lbnRTaGFwZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcIlN1YnNjcmliZXJTaGFwZVwiLFskaM2PX2EgPT4gKFN1YnNjcmliZXJTaGFwZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy90aW1lXCIsIFtbXCJUaW1lc3RhbXBTaGFwZVwiLFskaM2PX2EgPT4gKFRpbWVzdGFtcFNoYXBlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1R5cGVkUGF0dGVybn0gZnJvbSAnQGFnb3JpYy9pbnRlcm5hbCc7XG4gKiBAaW1wb3J0IHtBZnRlckRlYWRsaW5lRXhpdFJ1bGUsIEluc3RhbGxhdGlvbiwgWm9lSXNzdWVyUmVjb3JkfSBmcm9tICdAYWdvcmljL3pvZSc7XG4gKiBAaW1wb3J0IHtFeGl0UnVsZSwgSW52aXRhdGlvbiwgSW52aXRhdGlvbkhhbmRsZSwgV2FpdmVkRXhpdFJ1bGV9IGZyb20gJy4vdHlwZXMtaW5kZXguanMnO1xuICogQGltcG9ydCB7SW52aXRhdGlvbkRldGFpbHN9IGZyb20gJy4vdHlwZXMtaW5kZXguanMnO1xuICovXG5cbi8qIGtleXdvcmRzIGhhdmUgYW4gaW5pdGlhbCBjYXAqL1xuICAgICAgIGNvbnN0IEtleXdvcmRTaGFwZSA9IE0uc3RyaW5nKCk7XG5cbi8qKiBAdHlwZSB7VHlwZWRQYXR0ZXJuPEludml0YXRpb25IYW5kbGU+fSAqLyRozY9fb25jZS5LZXl3b3JkU2hhcGUoS2V5d29yZFNoYXBlKTtcbiAgICAgICBjb25zdCBJbnZpdGF0aW9uSGFuZGxlU2hhcGUgPSBNLnJlbW90YWJsZSgnSW52aXRhdGlvbkhhbmRsZScpO1xuLyoqIEB0eXBlIHtUeXBlZFBhdHRlcm48SW52aXRhdGlvbj59ICovJGjNj19vbmNlLkludml0YXRpb25IYW5kbGVTaGFwZShJbnZpdGF0aW9uSGFuZGxlU2hhcGUpO1xuICAgICAgIGNvbnN0IEludml0YXRpb25TaGFwZSA9IE0ucmVtb3RhYmxlKCdJbnZpdGF0aW9uJyk7JGjNj19vbmNlLkludml0YXRpb25TaGFwZShJbnZpdGF0aW9uU2hhcGUpO1xuICAgICAgIGNvbnN0IEluc3RhbmNlSGFuZGxlU2hhcGUgPSBNLnJlbW90YWJsZSgnSW5zdGFuY2VIYW5kbGUnKTtcbi8qKiBAdHlwZSB7VHlwZWRQYXR0ZXJuPEluc3RhbGxhdGlvbj59ICovJGjNj19vbmNlLkluc3RhbmNlSGFuZGxlU2hhcGUoSW5zdGFuY2VIYW5kbGVTaGFwZSk7XG4gICAgICAgY29uc3QgSW5zdGFsbGF0aW9uU2hhcGUgPSBNLnJlbW90YWJsZSgnSW5zdGFsbGF0aW9uJyk7JGjNj19vbmNlLkluc3RhbGxhdGlvblNoYXBlKEluc3RhbGxhdGlvblNoYXBlKTtcbiAgICAgICBjb25zdCBTZWF0U2hhcGUgPSBNLnJlbW90YWJsZSgnU2VhdCcpOyRozY9fb25jZS5TZWF0U2hhcGUoU2VhdFNoYXBlKTtcblxuICAgICAgIGNvbnN0IEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSA9IE0ucmVjb3JkT2YoS2V5d29yZFNoYXBlLCBBbW91bnRTaGFwZSk7JGjNj19vbmNlLkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZShBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUpO1xuICAgICAgIGNvbnN0IEFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUgPSBNLnJlY29yZE9mKFxuICBLZXl3b3JkU2hhcGUsXG4gIE0ucGF0dGVybigpLFxuKTskaM2PX29uY2UuQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZShBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlKTtcbiAgICAgICBjb25zdCBQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSA9IE0ucmVjb3JkT2YoXG4gIEtleXdvcmRTaGFwZSxcbiAgTS5lcmVmKFBheW1lbnRTaGFwZSksXG4pOyRozY9fb25jZS5QYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZShQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSk7XG4gICAgICAgY29uc3QgSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlID0gTS5yZWNvcmRPZihLZXl3b3JkU2hhcGUsIElzc3VlclNoYXBlKTskaM2PX29uY2UuSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlKElzc3VlcktleXdvcmRSZWNvcmRTaGFwZSk7XG4gICAgICAgY29uc3QgSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSA9IE0ucmVjb3JkT2YoXG4gIEtleXdvcmRTaGFwZSxcbiAgTS5lcmVmKElzc3VlclNoYXBlKSxcbik7JGjNj19vbmNlLklzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUoSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSk7XG4gICAgICAgY29uc3QgQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUgPSBNLnJlY29yZE9mKEtleXdvcmRTaGFwZSwgQnJhbmRTaGFwZSk7XG5cbi8qKiBAdHlwZSB7VHlwZWRQYXR0ZXJuPFpvZUlzc3VlclJlY29yZD59ICovJGjNj19vbmNlLkJyYW5kS2V5d29yZFJlY29yZFNoYXBlKEJyYW5kS2V5d29yZFJlY29yZFNoYXBlKTtcbiAgICAgICBjb25zdCBJc3N1ZXJSZWNvcmRTaGFwZSA9IE0uc3BsaXRSZWNvcmQoXG4gIHtcbiAgICBicmFuZDogQnJhbmRTaGFwZSxcbiAgICBpc3N1ZXI6IElzc3VlclNoYXBlLFxuICAgIGFzc2V0S2luZDogQXNzZXRLaW5kU2hhcGUsXG4gIH0sXG4gIHsgZGlzcGxheUluZm86IERpc3BsYXlJbmZvU2hhcGUgfSxcbik7JGjNj19vbmNlLklzc3VlclJlY29yZFNoYXBlKElzc3VlclJlY29yZFNoYXBlKTtcblxuICAgICAgIGNvbnN0IFRlcm1zU2hhcGUgPSB7XG4gIGlzc3VlcnM6IElzc3VlcktleXdvcmRSZWNvcmRTaGFwZSxcbiAgYnJhbmRzOiBCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSxcbn07JGjNj19vbmNlLlRlcm1zU2hhcGUoVGVybXNTaGFwZSk7XG5oYXJkZW4oVGVybXNTaGFwZSk7XG5cbiAgICAgICBjb25zdCBJbnN0YW5jZVJlY29yZFNoYXBlID0ge1xuICBpbnN0YWxsYXRpb246IEluc3RhbGxhdGlvblNoYXBlLFxuICBpbnN0YW5jZTogSW5zdGFuY2VIYW5kbGVTaGFwZSxcbiAgdGVybXM6IE0uc3BsaXRSZWNvcmQoVGVybXNTaGFwZSksXG59OyRozY9fb25jZS5JbnN0YW5jZVJlY29yZFNoYXBlKEluc3RhbmNlUmVjb3JkU2hhcGUpO1xuaGFyZGVuKEluc3RhbmNlUmVjb3JkU2hhcGUpO1xuXG4gICAgICAgY29uc3QgSGFuZGxlSSA9IE0uaW50ZXJmYWNlKCdIYW5kbGUnLCB7fSk7JGjNj19vbmNlLkhhbmRsZUkoSGFuZGxlSSk7XG5cbiAgICAgICBjb25zdCBtYWtlSGFuZGxlU2hhcGUgPSBuYW1lID0+IE0ucmVtb3RhYmxlKGAke25hbWV9SGFuZGxlYCk7JGjNj19vbmNlLm1ha2VIYW5kbGVTaGFwZShtYWtlSGFuZGxlU2hhcGUpO1xuICAgICAgIGNvbnN0IFRpbWVyU2hhcGUgPSBtYWtlSGFuZGxlU2hhcGUoJ3RpbWVyJyk7XG5cbi8qKlxuICogQWZ0ZXIgZGVmYXVsdHMgYXJlIGZpbGxlZCBpblxuICpcbiAqIEBzZWUge1Byb3Bvc2FsUmVjb3JkfSB0eXBlXG4gKi8kaM2PX29uY2UuVGltZXJTaGFwZShUaW1lclNoYXBlKTtcbiAgICAgICBjb25zdCBGdWxsUHJvcG9zYWxTaGFwZSA9IHtcbiAgd2FudDogQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZSxcbiAgZ2l2ZTogQW1vdW50S2V5d29yZFJlY29yZFNoYXBlLFxuICAvKiBUbyBhY2NlcHQgb25seSBvbmUsIHdlIGNvdWxkIHVzZSBNLm9yIHJhdGhlciB0aGFuIE0uc3BsaXRSZWNvcmQsKi9cbiAgLyogYnV0IHRoZSBlcnJvciBtZXNzYWdlcyB3b3VsZCBoYXZlIGJlZW4gd29yc2UuIFJhdGhlciwqL1xuICAvKiBjbGVhblByb3Bvc2FsJ3MgYXNzZXJ0RXhpdCBjaGVja3MgdGhhdCB0aGVyZSdzIGV4YWN0bHkgb25lLiovXG4gIGV4aXQ6IE0uc3BsaXRSZWNvcmQoXG4gICAge30sXG4gICAge1xuICAgICAgb25EZW1hbmQ6IG51bGwsXG4gICAgICB3YWl2ZWQ6IG51bGwsXG4gICAgICBhZnRlckRlYWRsaW5lOiB7XG4gICAgICAgIHRpbWVyOiBNLmVyZWYoVGltZXJTaGFwZSksXG4gICAgICAgIGRlYWRsaW5lOiBUaW1lc3RhbXBTaGFwZSxcbiAgICAgIH0sXG4gICAgfSxcbiAgICB7fSxcbiAgKSxcbn07JGjNj19vbmNlLkZ1bGxQcm9wb3NhbFNoYXBlKEZ1bGxQcm9wb3NhbFNoYXBlKTtcbmhhcmRlbihGdWxsUHJvcG9zYWxTaGFwZSk7XG5cbi8qKiBAc2VlIHtQcm9wb3NhbH0gdHlwZSAqL1xuICAgICAgIGNvbnN0IFByb3Bvc2FsU2hhcGUgPSBNLnNwbGl0UmVjb3JkKHt9LCBGdWxsUHJvcG9zYWxTaGFwZSwge30pOyRozY9fb25jZS5Qcm9wb3NhbFNoYXBlKFByb3Bvc2FsU2hhcGUpO1xuXG4gICAgICAgY29uc3QgRW1wdHlQcm9wb3NhbFNoYXBlID0gTS5zcGxpdFJlY29yZCh7XG4gIGdpdmU6IHt9LFxuICB3YW50OiB7fSxcbiAgZXhpdDogeyBvbkRlbWFuZDogbnVsbCB9LFxufSk7JGjNj19vbmNlLkVtcHR5UHJvcG9zYWxTaGFwZShFbXB0eVByb3Bvc2FsU2hhcGUpO1xuXG4gICAgICAgY29uc3QgaXNPbkRlbWFuZEV4aXRSdWxlID0gZXhpdCA9PiB7XG4gIGNvbnN0IFtleGl0S2V5XSA9IE9iamVjdC5rZXlzKGV4aXQpO1xuICByZXR1cm4gZXhpdEtleSA9PT0gJ29uRGVtYW5kJztcbn07JGjNj19vbmNlLmlzT25EZW1hbmRFeGl0UnVsZShpc09uRGVtYW5kRXhpdFJ1bGUpO1xuaGFyZGVuKGlzT25EZW1hbmRFeGl0UnVsZSk7XG5cbi8qKlxuICogQHBhcmFtIHtFeGl0UnVsZX0gZXhpdFxuICogQHJldHVybnMge2V4aXQgaXMgV2FpdmVkRXhpdFJ1bGV9XG4gKi9cbiAgICAgICBjb25zdCBpc1dhaXZlZEV4aXRSdWxlID0gZXhpdCA9PiB7XG4gIGNvbnN0IFtleGl0S2V5XSA9IE9iamVjdC5rZXlzKGV4aXQpO1xuICByZXR1cm4gZXhpdEtleSA9PT0gJ3dhaXZlZCc7XG59OyRozY9fb25jZS5pc1dhaXZlZEV4aXRSdWxlKGlzV2FpdmVkRXhpdFJ1bGUpO1xuaGFyZGVuKGlzV2FpdmVkRXhpdFJ1bGUpO1xuXG4vKipcbiAqIEBwYXJhbSB7RXhpdFJ1bGV9IGV4aXRcbiAqIEByZXR1cm5zIHtleGl0IGlzIEFmdGVyRGVhZGxpbmVFeGl0UnVsZX1cbiAqL1xuICAgICAgIGNvbnN0IGlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlID0gZXhpdCA9PiB7XG4gIGNvbnN0IFtleGl0S2V5XSA9IE9iamVjdC5rZXlzKGV4aXQpO1xuICByZXR1cm4gZXhpdEtleSA9PT0gJ2FmdGVyRGVhZGxpbmUnO1xufTskaM2PX29uY2UuaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGUoaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGUpO1xuaGFyZGVuKGlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlKTtcblxuLyoqIEB0eXBlIHtUeXBlZFBhdHRlcm48SW52aXRhdGlvbkRldGFpbHM+fSAqL1xuICAgICAgIGNvbnN0IEludml0YXRpb25FbGVtZW50U2hhcGUgPSBNLnNwbGl0UmVjb3JkKHtcbiAgZGVzY3JpcHRpb246IE0uc3RyaW5nKCksXG4gIGhhbmRsZTogSW52aXRhdGlvbkhhbmRsZVNoYXBlLFxuICBpbnN0YW5jZTogSW5zdGFuY2VIYW5kbGVTaGFwZSxcbiAgaW5zdGFsbGF0aW9uOiBJbnN0YWxsYXRpb25TaGFwZSxcbn0pOyRozY9fb25jZS5JbnZpdGF0aW9uRWxlbWVudFNoYXBlKEludml0YXRpb25FbGVtZW50U2hhcGUpO1xuXG4gICAgICAgY29uc3QgT2ZmZXJIYW5kbGVySSA9IE0uaW50ZXJmYWNlKCdPZmZlckhhbmRsZXInLCB7XG4gIGhhbmRsZTogTS5jYWxsKFNlYXRTaGFwZSkub3B0aW9uYWwoTS5hbnkoKSkucmV0dXJucyhNLmFueSgpKSxcbn0pOyRozY9fb25jZS5PZmZlckhhbmRsZXJJKE9mZmVySGFuZGxlckkpO1xuXG4gICAgICAgY29uc3QgU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGUgPSBNLmFycmF5T2Yoe1xuICBzZWF0SGFuZGxlOiBTZWF0U2hhcGUsXG4gIGFsbG9jYXRpb246IEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSxcbn0pOyRozY9fb25jZS5TZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZShTZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZSk7XG5cbiAgICAgICBjb25zdCBab2VNaW50U2hhcGUgPSBNLnJlbW90YWJsZSgnWm9lTWludCcpOyRozY9fb25jZS5ab2VNaW50U2hhcGUoWm9lTWludFNoYXBlKTtcbiAgICAgICBjb25zdCBab2VNaW50SSA9IE0uaW50ZXJmYWNlKCdab2VNaW50Jywge1xuICBnZXRJc3N1ZXJSZWNvcmQ6IE0uY2FsbCgpLnJldHVybnMoSXNzdWVyUmVjb3JkU2hhcGUpLFxuICBtaW50QW5kRXNjcm93OiBNLmNhbGwoQW1vdW50U2hhcGUpLnJldHVybnMoKSxcbiAgd2l0aGRyYXdBbmRCdXJuOiBNLmNhbGwoQW1vdW50U2hhcGUpLnJldHVybnMoKSxcbn0pOyRozY9fb25jZS5ab2VNaW50SShab2VNaW50SSk7XG5cbiAgICAgICBjb25zdCBGZWVNaW50QWNjZXNzU2hhcGUgPSBNLnJlbW90YWJsZSgnRmVlTWludEFjY2VzcycpOyRozY9fb25jZS5GZWVNaW50QWNjZXNzU2hhcGUoRmVlTWludEFjY2Vzc1NoYXBlKTtcblxuICAgICAgIGNvbnN0IEV4aXRPYmplY3RJID0gTS5pbnRlcmZhY2UoJ0V4aXQgT2JqZWN0Jywge1xuICBleGl0OiBNLmNhbGwoKS5yZXR1cm5zKCksXG59KTskaM2PX29uY2UuRXhpdE9iamVjdEkoRXhpdE9iamVjdEkpO1xuXG4gICAgICAgY29uc3QgRXhpdE9iamVjdFNoYXBlID0gTS5yZW1vdGFibGUoJ0V4aXRPYmonKTskaM2PX29uY2UuRXhpdE9iamVjdFNoYXBlKEV4aXRPYmplY3RTaGFwZSk7XG4gICAgICAgY29uc3QgSW5zdGFuY2VBZG1pblNoYXBlID0gTS5yZW1vdGFibGUoJ0luc3RhbmNlQWRtaW4nKTskaM2PX29uY2UuSW5zdGFuY2VBZG1pblNoYXBlKEluc3RhbmNlQWRtaW5TaGFwZSk7XG4gICAgICAgY29uc3QgSW5zdGFuY2VBZG1pbkkgPSBNLmludGVyZmFjZSgnSW5zdGFuY2VBZG1pbicsIHtcbiAgbWFrZUludml0YXRpb246IE0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUsIE0uc3RyaW5nKCkpXG4gICAgLm9wdGlvbmFsKE0ucmVjb3JkKCksIE0ucGF0dGVybigpKVxuICAgIC5yZXR1cm5zKEludml0YXRpb25TaGFwZSksXG4gIHNhdmVJc3N1ZXI6IE0uY2FsbFdoZW4oTS5hd2FpdChJc3N1ZXJTaGFwZSksIEtleXdvcmRTaGFwZSkucmV0dXJucyhcbiAgICBJc3N1ZXJSZWNvcmRTaGFwZSxcbiAgKSxcbiAgbWFrZU5vRXNjcm93U2VhdDogTS5jYWxsKFxuICAgIEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSxcbiAgICBQcm9wb3NhbFNoYXBlLFxuICAgIEV4aXRPYmplY3RTaGFwZSxcbiAgICBTZWF0U2hhcGUsXG4gICkucmV0dXJucyhTZWF0U2hhcGUpLFxuICBleGl0QWxsU2VhdHM6IE0uY2FsbChNLmFueSgpKS5yZXR1cm5zKCksXG4gIGZhaWxBbGxTZWF0czogTS5jYWxsKE0uYW55KCkpLnJldHVybnMoKSxcbiAgZXhpdFNlYXQ6IE0uY2FsbChTZWF0U2hhcGUsIE0uYW55KCkpLnJldHVybnMoKSxcbiAgZmFpbFNlYXQ6IE0uY2FsbChTZWF0U2hhcGUsIE0uYW55KCkpLnJldHVybnMoKSxcbiAgbWFrZVpvZU1pbnQ6IE0uY2FsbChLZXl3b3JkU2hhcGUpXG4gICAgLm9wdGlvbmFsKFxuICAgICAgQXNzZXRLaW5kU2hhcGUsXG4gICAgICBEaXNwbGF5SW5mb1NoYXBlLFxuICAgICAgTS5zcGxpdFJlY29yZCh7fSwgeyBlbGVtZW50U2hhcGU6IE0ucGF0dGVybigpIH0pLFxuICAgIClcbiAgICAucmV0dXJucyhNLnJlbW90YWJsZSgnem9lTWludCcpKSxcbiAgcmVnaXN0ZXJGZWVNaW50OiBNLmNhbGwoS2V5d29yZFNoYXBlLCBGZWVNaW50QWNjZXNzU2hhcGUpLnJldHVybnMoXG4gICAgTS5yZW1vdGFibGUoJ2ZlZU1pbnQnKSxcbiAgKSxcbiAgcmVwbGFjZUFsbG9jYXRpb25zOiBNLmNhbGwoU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGUpLnJldHVybnMoKSxcbiAgc3RvcEFjY2VwdGluZ09mZmVyczogTS5jYWxsKCkucmV0dXJucygpLFxuICBzZXRPZmZlckZpbHRlcjogTS5jYWxsKE0uYXJyYXlPZihNLnN0cmluZygpKSkucmV0dXJucygpLFxuICBnZXRPZmZlckZpbHRlcjogTS5jYWxsKCkucmV0dXJucyhNLmFycmF5T2YoTS5zdHJpbmcoKSkpLFxuICBnZXRFeGl0U3Vic2NyaWJlcjogTS5jYWxsKFNlYXRTaGFwZSkucmV0dXJucyhTdWJzY3JpYmVyU2hhcGUpLFxuICBpc0Jsb2NrZWQ6IE0uY2FsbChNLnN0cmluZygpKS5yZXR1cm5zKE0uYm9vbGVhbigpKSxcbiAgcmVwYWlyQ29udHJhY3RDb21wbGV0aW9uV2F0Y2hlcjogTS5jYWxsKCkucmV0dXJucygpLFxufSk7JGjNj19vbmNlLkluc3RhbmNlQWRtaW5JKEluc3RhbmNlQWRtaW5JKTtcblxuICAgICAgIGNvbnN0IEluc3RhbmNlU3RvcmFnZU1hbmFnZXJJS2l0ID0ge1xuICBpbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyOiBNLmludGVyZmFjZSgnSW5zdGFuY2VTdG9yYWdlTWFuYWdlcicsIHtcbiAgICBnZXRUZXJtczogTS5jYWxsKCkucmV0dXJucyhNLnNwbGl0UmVjb3JkKFRlcm1zU2hhcGUpKSxcbiAgICBnZXRJc3N1ZXJzOiBNLmNhbGwoKS5yZXR1cm5zKElzc3VlcktleXdvcmRSZWNvcmRTaGFwZSksXG4gICAgZ2V0QnJhbmRzOiBNLmNhbGwoKS5yZXR1cm5zKEJyYW5kS2V5d29yZFJlY29yZFNoYXBlKSxcbiAgICBnZXRJbnN0YWxsYXRpb246IE0uY2FsbCgpLnJldHVybnMoSW5zdGFsbGF0aW9uU2hhcGUpLFxuICAgIGdldEludml0YXRpb25Jc3N1ZXI6IE0uY2FsbCgpLnJldHVybnMoSXNzdWVyU2hhcGUpLFxuXG4gICAgc2F2ZUlzc3VlcjogTS5jYWxsKElzc3VlclNoYXBlLCBLZXl3b3JkU2hhcGUpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICAgIG1ha2Vab2VNaW50OiBNLmNhbGwoS2V5d29yZFNoYXBlKVxuICAgICAgLm9wdGlvbmFsKFxuICAgICAgICBBc3NldEtpbmRTaGFwZSxcbiAgICAgICAgRGlzcGxheUluZm9TaGFwZSxcbiAgICAgICAgTS5zcGxpdFJlY29yZCh7fSwgeyBlbGVtZW50U2hhcGU6IE0ucGF0dGVybigpIH0pLFxuICAgICAgKVxuICAgICAgLnJldHVybnMoTS5lcmVmKFpvZU1pbnRTaGFwZSkpLFxuICAgIHJlZ2lzdGVyRmVlTWludDogTS5jYWxsKEtleXdvcmRTaGFwZSwgRmVlTWludEFjY2Vzc1NoYXBlKS5yZXR1cm5zKFxuICAgICAgTS5yZW1vdGFibGUoJ2ZlZU1pbnQnKSxcbiAgICApLFxuICAgIGdldEluc3RhbmNlUmVjb3JkOiBNLmNhbGwoKS5yZXR1cm5zKEluc3RhbmNlUmVjb3JkU2hhcGUpLFxuICAgIGdldElzc3VlclJlY29yZHM6IE0uY2FsbCgpLnJldHVybnMoTS5hcnJheU9mKElzc3VlclJlY29yZFNoYXBlKSksXG4gICAgZ2V0V2l0aGRyYXdGYWNldDogTS5jYWxsKCkucmV0dXJucyhNLnJlbW90YWJsZSgnV2l0aGRyYXdGYWNldCcpKSxcbiAgICBpbml0SW5zdGFuY2VBZG1pbjogTS5jYWxsKFxuICAgICAgSW5zdGFuY2VIYW5kbGVTaGFwZSxcbiAgICAgIE0ucmVtb3RhYmxlKCdpbnN0YW5jZUFkbWluJyksXG4gICAgKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgICBkZWxldGVJbnN0YW5jZUFkbWluOiBNLmNhbGwoSW5zdGFuY2VBZG1pblNoYXBlKS5yZXR1cm5zKCksXG4gICAgbWFrZUludml0YXRpb246IE0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUsIE0uc3RyaW5nKCkpXG4gICAgICAub3B0aW9uYWwoTS5yZWNvcmQoKSwgTS5wYXR0ZXJuKCkpXG4gICAgICAucmV0dXJucyhQYXltZW50U2hhcGUpLFxuICAgIGdldFJvb3Q6IE0uY2FsbCgpLnJldHVybnMoTS5hbnkoKSksXG4gICAgZ2V0QWRtaW5Ob2RlOiBNLmNhbGwoKS5yZXR1cm5zKE0ucmVtb3RhYmxlKCdhZG1pbk5vZGUnKSksXG4gIH0pLFxuICB3aXRoZHJhd0ZhY2V0OiBNLmludGVyZmFjZSgnV2l0aGRyYXdGYWNldCcsIHtcbiAgICB3aXRoZHJhd1BheW1lbnRzOiBNLmNhbGwoQW1vdW50S2V5d29yZFJlY29yZFNoYXBlKS5yZXR1cm5zKFxuICAgICAgUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUsXG4gICAgKSxcbiAgfSksXG4gIGhlbHBlcnM6IE0uaW50ZXJmYWNlKCdJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyIGhlbHBlcicsIHtcbiAgICB3cmFwSXNzdWVyS2l0V2l0aFpvZU1pbnQ6IE0uY2FsbChcbiAgICAgIEtleXdvcmRTaGFwZSxcbiAgICAgIElzc3VlcktpdFNoYXBlLFxuICAgICAgTS5yZW1vdGFibGUoJ2FkbWluTm9kZScpLFxuICAgICkucmV0dXJucyhab2VNaW50U2hhcGUpLFxuICB9KSxcbn07JGjNj19vbmNlLkluc3RhbmNlU3RvcmFnZU1hbmFnZXJJS2l0KEluc3RhbmNlU3RvcmFnZU1hbmFnZXJJS2l0KTtcbmhhcmRlbihJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCk7XG5cbiAgICAgICBjb25zdCBCdW5kbGVDYXBTaGFwZSA9IE0ucmVtb3RhYmxlKCdidW5kbGVDYXAnKTskaM2PX29uY2UuQnVuZGxlQ2FwU2hhcGUoQnVuZGxlQ2FwU2hhcGUpO1xuICAgICAgIGNvbnN0IEJ1bmRsZVNoYXBlID0gTS5hbmQoXG4gIE0uc3BsaXRSZWNvcmQoeyBtb2R1bGVGb3JtYXQ6IE0uYW55KCkgfSksXG4gIE0ucmVjb3JkT2YoTS5zdHJpbmcoKSwgTS5zdHJpbmcoeyBzdHJpbmdMZW5ndGhMaW1pdDogSW5maW5pdHkgfSkpLFxuKTskaM2PX29uY2UuQnVuZGxlU2hhcGUoQnVuZGxlU2hhcGUpO1xuXG4gICAgICAgY29uc3QgVW53cmFwcGVkSW5zdGFsbGF0aW9uU2hhcGUgPSBNLnNwbGl0UmVjb3JkKFxuICB7IGluc3RhbGxhdGlvbjogSW5zdGFsbGF0aW9uU2hhcGUgfSxcbiAge1xuICAgIGJ1bmRsZTogTS5yZWNvcmRPZihNLnN0cmluZygpLCBNLnN0cmluZyh7IHN0cmluZ0xlbmd0aExpbWl0OiBJbmZpbml0eSB9KSksXG4gICAgYnVuZGxlQ2FwOiBCdW5kbGVDYXBTaGFwZSxcbiAgICBidW5kbGVJRDogTS5zdHJpbmcoKSxcbiAgfSxcbiAge30sXG4pOyRozY9fb25jZS5VbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZShVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZSk7XG5cbiAgICAgICBjb25zdCBab2VTdG9yYWdlTWFuYWdlcklLaXQgPSB7XG4gIHpvZVNlcnZpY2VEYXRhQWNjZXNzOiBNLmludGVyZmFjZSgnWm9lU2VydmljZSBkYXRhQWNjZXNzJywge1xuICAgIGdldFRlcm1zOiBNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhNLnNwbGl0UmVjb3JkKFRlcm1zU2hhcGUpKSxcbiAgICBnZXRJc3N1ZXJzOiBNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUpLFxuICAgIGdldEJyYW5kczogTS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUpLFxuICAgIGdldEluc3RhbGxhdGlvbjogTS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoXG4gICAgICBNLmVyZWYoTS5yZW1vdGFibGUoJ0luc3RhbGxhdGlvbicpKSxcbiAgICApLFxuICAgIGdldEludml0YXRpb25Jc3N1ZXI6IE0uY2FsbCgpLnJldHVybnMoSXNzdWVyU2hhcGUpLFxuXG4gICAgZ2V0QnVuZGxlSURGcm9tSW5zdGFsbGF0aW9uOiBNLmNhbGwoSW5zdGFsbGF0aW9uU2hhcGUpLnJldHVybnMoXG4gICAgICBNLmVyZWYoTS5zdHJpbmcoKSksXG4gICAgKSxcbiAgICBpbnN0YWxsQnVuZGxlOiBNLmNhbGwoQnVuZGxlU2hhcGUpXG4gICAgICAub3B0aW9uYWwoTS5zdHJpbmcoKSlcbiAgICAgIC5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgICBpbnN0YWxsQnVuZGxlSUQ6IE0uY2FsbChNLnN0cmluZygpKVxuICAgICAgLm9wdGlvbmFsKE0uc3RyaW5nKCkpXG4gICAgICAucmV0dXJucyhNLnByb21pc2UoKSksXG5cbiAgICBnZXRQdWJsaWNGYWNldDogTS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoXG4gICAgICBNLmVyZWYoTS5yZW1vdGFibGUoJ1B1YmxpY0ZhY2V0JykpLFxuICAgICksXG4gICAgZ2V0T2ZmZXJGaWx0ZXI6IE0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKE0uYXJyYXlPZihNLnN0cmluZygpKSksXG4gICAgZ2V0UHJvcG9zYWxTaGFwZUZvckludml0YXRpb246IE0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUpLnJldHVybnMoXG4gICAgICBNLm9wdChNLnBhdHRlcm4oKSksXG4gICAgKSxcbiAgfSksXG4gIG1ha2VPZmZlckFjY2VzczogTS5pbnRlcmZhY2UoJ1pvZVN0b3JhZ2UgbWFrZU9mZmVyIGFjY2VzcycsIHtcbiAgICBnZXRBc3NldEtpbmRCeUJyYW5kOiBNLmNhbGwoQnJhbmRTaGFwZSkucmV0dXJucyhBc3NldEtpbmRTaGFwZSksXG4gICAgZ2V0SW5zdGFuY2VBZG1pbjogTS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoXG4gICAgICBNLnJlbW90YWJsZSgnaW5zdGFuY2VBZG1pbicpLFxuICAgICksXG4gICAgZ2V0UHJvcG9zYWxTaGFwZUZvckludml0YXRpb246IE0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUpLnJldHVybnMoXG4gICAgICBNLm9wdChNLnBhdHRlcm4oKSksXG4gICAgKSxcbiAgICBnZXRJbnZpdGF0aW9uSXNzdWVyOiBNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKSxcbiAgICBkZXBvc2l0UGF5bWVudHM6IE0uY2FsbChQcm9wb3NhbFNoYXBlLCBQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSkucmV0dXJucyhcbiAgICAgIE0ucHJvbWlzZSgpLFxuICAgICksXG4gIH0pLFxuICBzdGFydEluc3RhbmNlQWNjZXNzOiBNLmludGVyZmFjZSgnWm9lU3RvcmFnZSBzdGFydEluc3RhbmNlIGFjY2VzcycsIHtcbiAgICBtYWtlWm9lSW5zdGFuY2VTdG9yYWdlTWFuYWdlcjogTS5jYWxsKFxuICAgICAgSW5zdGFsbGF0aW9uU2hhcGUsXG4gICAgICBNLmFueSgpLFxuICAgICAgSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSxcbiAgICAgIEluc3RhbmNlSGFuZGxlU2hhcGUsXG4gICAgICBNLm9yKEJ1bmRsZUNhcFNoYXBlLCBCdW5kbGVTaGFwZSksXG4gICAgICBNLnN0cmluZygpLFxuICAgICkucmV0dXJucyhNLnByb21pc2UoKSksXG4gICAgdW53cmFwSW5zdGFsbGF0aW9uOiBNLmNhbGxXaGVuKE0uZXJlZihJbnN0YWxsYXRpb25TaGFwZSkpLnJldHVybnMoXG4gICAgICBVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZSxcbiAgICApLFxuICB9KSxcbiAgaW52aXRhdGlvbklzc3VlckFjY2VzczogTS5pbnRlcmZhY2UoJ1pvZVN0b3JhZ2UgaW52aXRhdGlvbklzc3VlcicsIHtcbiAgICBnZXRJbnZpdGF0aW9uSXNzdWVyOiBNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKSxcbiAgfSksXG59OyRozY9fb25jZS5ab2VTdG9yYWdlTWFuYWdlcklLaXQoWm9lU3RvcmFnZU1hbmFnZXJJS2l0KTtcbmhhcmRlbihab2VTdG9yYWdlTWFuYWdlcklLaXQpO1xuXG4gICAgICAgY29uc3QgWm9lU2VydmljZUkgPSBNLmludGVyZmFjZSgnWm9lU2VydmljZScsIHtcbiAgaW5zdGFsbDogTS5jYWxsKE0uYW55KCkpLm9wdGlvbmFsKE0uc3RyaW5nKCkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBpbnN0YWxsQnVuZGxlSUQ6IE0uY2FsbChNLnN0cmluZygpKS5vcHRpb25hbChNLnN0cmluZygpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgc3RhcnRJbnN0YW5jZTogTS5jYWxsKE0uZXJlZihJbnN0YWxsYXRpb25TaGFwZSkpXG4gICAgLm9wdGlvbmFsKElzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUsIE0ucmVjb3JkKCksIE0ucmVjb3JkKCksIE0uc3RyaW5nKCkpXG4gICAgLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBvZmZlcjogTS5jYWxsKE0uZXJlZihJbnZpdGF0aW9uU2hhcGUpKVxuICAgIC5vcHRpb25hbChQcm9wb3NhbFNoYXBlLCBQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSwgTS5hbnkoKSlcbiAgICAucmV0dXJucyhNLnByb21pc2UoKSksXG5cbiAgZ2V0T2ZmZXJGaWx0ZXI6IE0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkucmV0dXJucyhcbiAgICBNLmFycmF5T2YoTS5zdHJpbmcoKSksXG4gICksXG4gIGdldEludml0YXRpb25Jc3N1ZXI6IE0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBnZXRGZWVJc3N1ZXI6IE0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBnZXRCcmFuZHM6IE0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkucmV0dXJucyhcbiAgICBCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSxcbiAgKSxcbiAgZ2V0SXNzdWVyczogTS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbmNlSGFuZGxlU2hhcGUpKS5yZXR1cm5zKFxuICAgIElzc3VlcktleXdvcmRSZWNvcmRTaGFwZSxcbiAgKSxcbiAgZ2V0UHVibGljRmFjZXQ6IE0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkucmV0dXJucyhcbiAgICBNLnJlbW90YWJsZSgnUHVibGljRmFjZXQnKSxcbiAgKSxcbiAgZ2V0VGVybXM6IE0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkucmV0dXJucyhNLmFueSgpKSxcbiAgZ2V0SW5zdGFsbGF0aW9uRm9ySW5zdGFuY2U6IE0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkucmV0dXJucyhcbiAgICBNLmVyZWYoTS5yZW1vdGFibGUoJ0luc3RhbGxhdGlvbicpKSxcbiAgKSxcbiAgZ2V0QnVuZGxlSURGcm9tSW5zdGFsbGF0aW9uOiBNLmNhbGxXaGVuKE0uYXdhaXQoSW5zdGFsbGF0aW9uU2hhcGUpKS5yZXR1cm5zKFxuICAgIE0uZXJlZihNLnN0cmluZygpKSxcbiAgKSxcblxuICBnZXRJbnN0YWxsYXRpb246IE0uY2FsbChNLmVyZWYoSW52aXRhdGlvblNoYXBlKSkucmV0dXJucyhNLnByb21pc2UoKSksXG4gIGdldEluc3RhbmNlOiBNLmNhbGwoTS5lcmVmKEludml0YXRpb25TaGFwZSkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICBnZXRDb25maWd1cmF0aW9uOiBNLmNhbGwoKS5yZXR1cm5zKHtcbiAgICBmZWVJc3N1ZXJDb25maWc6IHtcbiAgICAgIG5hbWU6IE0uc3RyaW5nKCksXG4gICAgICBhc3NldEtpbmQ6ICduYXQnLFxuICAgICAgZGlzcGxheUluZm86IERpc3BsYXlJbmZvU2hhcGUsXG4gICAgfSxcbiAgfSksXG4gIGdldEludml0YXRpb25EZXRhaWxzOiBNLmNhbGwoTS5lcmVmKEludml0YXRpb25TaGFwZSkpLnJldHVybnMoTS5hbnkoKSksXG4gIGdldFByb3Bvc2FsU2hhcGVGb3JJbnZpdGF0aW9uOiBNLmNhbGwoSW52aXRhdGlvbkhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuICAgIE0ub3B0KE0ucGF0dGVybigpKSxcbiAgKSxcbn0pOyRozY9fb25jZS5ab2VTZXJ2aWNlSShab2VTZXJ2aWNlSSk7XG5cbiAgICAgICBjb25zdCBBZG1pbkZhY2V0SSA9IE0uaW50ZXJmYWNlKCdaY2ZBZG1pbkZhY2V0Jywge1xuICBnZXRWYXRTaHV0ZG93blByb21pc2U6IE0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICByZXN0YXJ0Q29udHJhY3Q6IE0uY2FsbCgpLm9wdGlvbmFsKE0uYW55KCkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuICB1cGdyYWRlQ29udHJhY3Q6IE0uY2FsbChNLnN0cmluZygpKS5vcHRpb25hbChNLmFueSgpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbiAgdGVybWluYXRlQ29udHJhY3Q6IE0uY2FsbChNLmVycm9yKCkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxufSk7JGjNj19vbmNlLkFkbWluRmFjZXRJKEFkbWluRmFjZXRJKTtcblxuICAgICAgIGNvbnN0IFNlYXREYXRhU2hhcGUgPSBNLnNwbGl0UmVjb3JkKFxuICB7XG4gICAgcHJvcG9zYWw6IFByb3Bvc2FsU2hhcGUsXG4gICAgaW5pdGlhbEFsbG9jYXRpb246IEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSxcbiAgICBzZWF0SGFuZGxlOiBTZWF0U2hhcGUsXG4gIH0sXG4gIHtcbiAgICBvZmZlckFyZ3M6IE0uYW55KCksXG4gIH0sXG4pOyRozY9fb25jZS5TZWF0RGF0YVNoYXBlKFNlYXREYXRhU2hhcGUpO1xuXG4gICAgICAgY29uc3QgSGFuZGxlT2ZmZXJJID0gTS5pbnRlcmZhY2UoJ0hhbmRsZU9mZmVyJywge1xuICBoYW5kbGVPZmZlcjogTS5jYWxsKEludml0YXRpb25IYW5kbGVTaGFwZSwgU2VhdERhdGFTaGFwZSkucmV0dXJucyh7XG4gICAgb2ZmZXJSZXN1bHRQcm9taXNlOiBNLnByb21pc2UoKSxcbiAgICBleGl0T2JqOiBFeGl0T2JqZWN0U2hhcGUsXG4gIH0pLFxufSk7JGjNj19vbmNlLkhhbmRsZU9mZmVySShIYW5kbGVPZmZlckkpO1xuXG4gICAgICAgY29uc3QgUHJpY2VRdW90ZVNoYXBlID0ge1xuICBxdW90ZUFtb3VudDogQW1vdW50U2hhcGUsXG4gIHF1b3RlUGF5bWVudDogTS5lcmVmKFBheW1lbnRTaGFwZSksXG59OyRozY9fb25jZS5QcmljZVF1b3RlU2hhcGUoUHJpY2VRdW90ZVNoYXBlKTtcbmhhcmRlbihQcmljZVF1b3RlU2hhcGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiS2V5d29yZFNoYXBlIjpbIktleXdvcmRTaGFwZSJdLCJJbnZpdGF0aW9uSGFuZGxlU2hhcGUiOlsiSW52aXRhdGlvbkhhbmRsZVNoYXBlIl0sIkludml0YXRpb25TaGFwZSI6WyJJbnZpdGF0aW9uU2hhcGUiXSwiSW5zdGFuY2VIYW5kbGVTaGFwZSI6WyJJbnN0YW5jZUhhbmRsZVNoYXBlIl0sIkluc3RhbGxhdGlvblNoYXBlIjpbIkluc3RhbGxhdGlvblNoYXBlIl0sIlNlYXRTaGFwZSI6WyJTZWF0U2hhcGUiXSwiQW1vdW50S2V5d29yZFJlY29yZFNoYXBlIjpbIkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSJdLCJBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlIjpbIkFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUiXSwiUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUiOlsiUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUiXSwiSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlIjpbIklzc3VlcktleXdvcmRSZWNvcmRTaGFwZSJdLCJJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlIjpbIklzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUiXSwiQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUiOlsiQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUiXSwiSXNzdWVyUmVjb3JkU2hhcGUiOlsiSXNzdWVyUmVjb3JkU2hhcGUiXSwiVGVybXNTaGFwZSI6WyJUZXJtc1NoYXBlIl0sIkluc3RhbmNlUmVjb3JkU2hhcGUiOlsiSW5zdGFuY2VSZWNvcmRTaGFwZSJdLCJIYW5kbGVJIjpbIkhhbmRsZUkiXSwibWFrZUhhbmRsZVNoYXBlIjpbIm1ha2VIYW5kbGVTaGFwZSJdLCJUaW1lclNoYXBlIjpbIlRpbWVyU2hhcGUiXSwiRnVsbFByb3Bvc2FsU2hhcGUiOlsiRnVsbFByb3Bvc2FsU2hhcGUiXSwiUHJvcG9zYWxTaGFwZSI6WyJQcm9wb3NhbFNoYXBlIl0sIkVtcHR5UHJvcG9zYWxTaGFwZSI6WyJFbXB0eVByb3Bvc2FsU2hhcGUiXSwiaXNPbkRlbWFuZEV4aXRSdWxlIjpbImlzT25EZW1hbmRFeGl0UnVsZSJdLCJpc1dhaXZlZEV4aXRSdWxlIjpbImlzV2FpdmVkRXhpdFJ1bGUiXSwiaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGUiOlsiaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGUiXSwiSW52aXRhdGlvbkVsZW1lbnRTaGFwZSI6WyJJbnZpdGF0aW9uRWxlbWVudFNoYXBlIl0sIk9mZmVySGFuZGxlckkiOlsiT2ZmZXJIYW5kbGVySSJdLCJTZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZSI6WyJTZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZSJdLCJab2VNaW50U2hhcGUiOlsiWm9lTWludFNoYXBlIl0sIlpvZU1pbnRJIjpbIlpvZU1pbnRJIl0sIkZlZU1pbnRBY2Nlc3NTaGFwZSI6WyJGZWVNaW50QWNjZXNzU2hhcGUiXSwiRXhpdE9iamVjdEkiOlsiRXhpdE9iamVjdEkiXSwiRXhpdE9iamVjdFNoYXBlIjpbIkV4aXRPYmplY3RTaGFwZSJdLCJJbnN0YW5jZUFkbWluU2hhcGUiOlsiSW5zdGFuY2VBZG1pblNoYXBlIl0sIkluc3RhbmNlQWRtaW5JIjpbIkluc3RhbmNlQWRtaW5JIl0sIkluc3RhbmNlU3RvcmFnZU1hbmFnZXJJS2l0IjpbIkluc3RhbmNlU3RvcmFnZU1hbmFnZXJJS2l0Il0sIkJ1bmRsZUNhcFNoYXBlIjpbIkJ1bmRsZUNhcFNoYXBlIl0sIkJ1bmRsZVNoYXBlIjpbIkJ1bmRsZVNoYXBlIl0sIlVud3JhcHBlZEluc3RhbGxhdGlvblNoYXBlIjpbIlVud3JhcHBlZEluc3RhbGxhdGlvblNoYXBlIl0sIlpvZVN0b3JhZ2VNYW5hZ2VySUtpdCI6WyJab2VTdG9yYWdlTWFuYWdlcklLaXQiXSwiWm9lU2VydmljZUkiOlsiWm9lU2VydmljZUkiXSwiQWRtaW5GYWNldEkiOlsiQWRtaW5GYWNldEkiXSwiU2VhdERhdGFTaGFwZSI6WyJTZWF0RGF0YVNoYXBlIl0sIkhhbmRsZU9mZmVySSI6WyJIYW5kbGVPZmZlckkiXSwiUHJpY2VRdW90ZVNoYXBlIjpbIlByaWNlUXVvdGVTaGFwZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADZ9JO0lgEAAJYBAAAeAAAAQGFnb3JpYy96b25lLXYwLjIuMi9kdXJhYmxlLmpzeyJpbXBvcnRzIjpbIi4vc3JjL2R1cmFibGUuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL3NyYy9kdXJhYmxlLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2R1cmFibGUuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAgDJSytoTAADaEwAAIgAAAEBhZ29yaWMvem9uZS12MC4yLjIvc3JjL2R1cmFibGUuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBhZ29yaWMvdmF0LWRhdGEiLCJAYWdvcmljL2Jhc2Utem9uZSJdLCJleHBvcnRzIjpbIm1ha2VEdXJhYmxlWm9uZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEZhaWwsRmFyLGlzUGFzc2FibGUsY2FuQmVEdXJhYmxlLG1ha2VTY2FsYXJNYXBTdG9yZSxwcmVwYXJlRXhvLHByZXBhcmVFeG9DbGFzcyxwcmVwYXJlRXhvQ2xhc3NLaXQscHJvdmlkZUR1cmFibGVNYXBTdG9yZSxwcm92aWRlRHVyYWJsZVNldFN0b3JlLHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlLHByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlLHdhdGNoUHJvbWlzZSxrZXlzLG1ha2VPbmNlS2l0OyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcIkZhclwiLFskaM2PX2EgPT4gKEZhciA9ICRozY9fYSldXSxbXCJpc1Bhc3NhYmxlXCIsWyRozY9fYSA9PiAoaXNQYXNzYWJsZSA9ICRozY9fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcImNhbkJlRHVyYWJsZVwiLFskaM2PX2EgPT4gKGNhbkJlRHVyYWJsZSA9ICRozY9fYSldXSxbXCJtYWtlU2NhbGFyTWFwU3RvcmVcIixbJGjNj19hID0+IChtYWtlU2NhbGFyTWFwU3RvcmUgPSAkaM2PX2EpXV0sW1wicHJlcGFyZUV4b1wiLFskaM2PX2EgPT4gKHByZXBhcmVFeG8gPSAkaM2PX2EpXV0sW1wicHJlcGFyZUV4b0NsYXNzXCIsWyRozY9fYSA9PiAocHJlcGFyZUV4b0NsYXNzID0gJGjNj19hKV1dLFtcInByZXBhcmVFeG9DbGFzc0tpdFwiLFskaM2PX2EgPT4gKHByZXBhcmVFeG9DbGFzc0tpdCA9ICRozY9fYSldXSxbXCJwcm92aWRlRHVyYWJsZU1hcFN0b3JlXCIsWyRozY9fYSA9PiAocHJvdmlkZUR1cmFibGVNYXBTdG9yZSA9ICRozY9fYSldXSxbXCJwcm92aWRlRHVyYWJsZVNldFN0b3JlXCIsWyRozY9fYSA9PiAocHJvdmlkZUR1cmFibGVTZXRTdG9yZSA9ICRozY9fYSldXSxbXCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZVwiLFskaM2PX2EgPT4gKHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlID0gJGjNj19hKV1dLFtcInByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlXCIsWyRozY9fYSA9PiAocHJvdmlkZUR1cmFibGVXZWFrU2V0U3RvcmUgPSAkaM2PX2EpXV0sW1wid2F0Y2hQcm9taXNlXCIsWyRozY9fYSA9PiAod2F0Y2hQcm9taXNlID0gJGjNj19hKV1dXV0sW1wiQGFnb3JpYy9iYXNlLXpvbmVcIiwgW1tcImFnb3JpY1ZhdERhdGFLZXlzXCIsWyRozY9fYSA9PiAoa2V5cyA9ICRozY9fYSldXSxbXCJtYWtlT25jZUtpdFwiLFskaM2PX2EgPT4gKG1ha2VPbmNlS2l0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1pvbmV9IGZyb20gJy4vaW5kZXguanMnO1xuICogQGltcG9ydCB7U3RvcmVzfSBmcm9tICcuL2luZGV4LmpzJztcbiAqIEBpbXBvcnQge0JhZ2dhZ2V9IGZyb20gJ0BhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzJztcbiAqL1xuXG4vKipcbiAqIEEgdmFyaWFudCBvZiBgY2FuQmVEdXJhYmxlYCB0aGF0IHJldHVybnMgYGZhbHNlYCBpbnN0ZWFkIG9mIGV2ZXIgdGhyb3dpbmcuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBzcGVjaW1lblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGlzU3RvcmFibGUgPSBzcGVjaW1lbiA9PiBpc1Bhc3NhYmxlKHNwZWNpbWVuKSAmJiBjYW5CZUR1cmFibGUoc3BlY2ltZW4pO1xuaGFyZGVuKGlzU3RvcmFibGUpO1xuXG4vKipcbiAqIEBwYXJhbSB7KCkgPT4gQmFnZ2FnZX0gZ2V0QmFnZ2FnZVxuICovXG5jb25zdCBhdHRhY2hEdXJhYmxlU3RvcmVzID0gZ2V0QmFnZ2FnZSA9PiB7XG4gIC8qKiBAdHlwZSB7Wm9uZVsnbWFwU3RvcmUnXX0gKi9cbiAgY29uc3QgbWFwU3RvcmUgPSAobGFiZWwsIG9wdGlvbnMpID0+IHtcbiAgICBjb25zdCBiYWdnYWdlID0gZ2V0QmFnZ2FnZSgpO1xuICAgIGNvbnN0IHJldCA9IHByb3ZpZGVEdXJhYmxlTWFwU3RvcmUoYmFnZ2FnZSwgbGFiZWwsIG9wdGlvbnMpO1xuICAgIHJldHVybiByZXQ7XG4gIH07XG4gIC8qKiBAdHlwZSB7Wm9uZVsnc2V0U3RvcmUnXX0gKi9cbiAgY29uc3Qgc2V0U3RvcmUgPSAobGFiZWwsIG9wdGlvbnMpID0+XG4gICAgcHJvdmlkZUR1cmFibGVTZXRTdG9yZShnZXRCYWdnYWdlKCksIGxhYmVsLCBvcHRpb25zKTtcbiAgLyoqIEB0eXBlIHtab25lWyd3ZWFrU2V0U3RvcmUnXX0gKi9cbiAgY29uc3Qgd2Vha1NldFN0b3JlID0gKGxhYmVsLCBvcHRpb25zKSA9PlxuICAgIHByb3ZpZGVEdXJhYmxlV2Vha1NldFN0b3JlKGdldEJhZ2dhZ2UoKSwgbGFiZWwsIG9wdGlvbnMpO1xuICAvKiogQHR5cGUge1pvbmVbJ3dlYWtNYXBTdG9yZSddfSAqL1xuICBjb25zdCB3ZWFrTWFwU3RvcmUgPSAobGFiZWwsIG9wdGlvbnMpID0+XG4gICAgcHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUoZ2V0QmFnZ2FnZSgpLCBsYWJlbCwgb3B0aW9ucyk7XG5cbiAgLyoqIEB0eXBlIHtTdG9yZXN9ICovXG4gIHJldHVybiBGYXIoJ2R1cmFibGVTdG9yZXMnLCB7XG4gICAgZGV0YWNoZWQ6ICgpID0+IGRldGFjaGVkRHVyYWJsZVN0b3JlcyxcbiAgICBpc1N0b3JhYmxlLFxuICAgIG1hcFN0b3JlLFxuICAgIHNldFN0b3JlLFxuICAgIHdlYWtNYXBTdG9yZSxcbiAgICB3ZWFrU2V0U3RvcmUsXG4gIH0pO1xufTtcblxuLyoqIEB0eXBlIHtTdG9yZXN9ICovXG5jb25zdCBkZXRhY2hlZER1cmFibGVTdG9yZXMgPSBhdHRhY2hEdXJhYmxlU3RvcmVzKCgpID0+XG4gIG1ha2VTY2FsYXJNYXBTdG9yZSgnZGV0YWNoZWQnKSxcbik7XG5cbi8qKlxuICogQ3JlYXRlIGEgem9uZSB3aG9zZSBvYmplY3RzIHBlcnNpc3QgYmV0d2VlbiBBZ29yaWMgdmF0IHVwZ3JhZGVzLlxuICpcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IFtiYXNlTGFiZWxdXG4gKiBAcmV0dXJucyB7Wm9uZX1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VEdXJhYmxlWm9uZSA9IChiYWdnYWdlLCBiYXNlTGFiZWwgPSAnZHVyYWJsZVpvbmUnKSA9PiB7XG4gIGJhZ2dhZ2UgfHwgRmFpbGBiYWdnYWdlIHJlcXVpcmVkYDtcblxuICBjb25zdCBhdHRhY2hlZFN0b3JlcyA9IGF0dGFjaER1cmFibGVTdG9yZXMoKCkgPT4gYmFnZ2FnZSk7XG5cbiAgY29uc3QgeyBtYWtlT25jZSwgd3JhcFByb3ZpZGVyIH0gPSBtYWtlT25jZUtpdChcbiAgICBiYXNlTGFiZWwsXG4gICAgYXR0YWNoZWRTdG9yZXMsXG4gICAgYmFnZ2FnZSxcbiAgKTtcblxuICAvKiogQHR5cGUge1pvbmVbJ2V4b0NsYXNzJ119ICovXG4gIGNvbnN0IGV4b0NsYXNzID0gKC4uLmFyZ3MpID0+IHByZXBhcmVFeG9DbGFzcyhiYWdnYWdlLCAuLi5hcmdzKTtcbiAgLyoqIEB0eXBlIHtab25lWydleG9DbGFzc0tpdCddfSAqL1xuICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50IC0tIGhhcHBlbnMgb25seSBpbnRlZ3JhdGluZyB3aXRoIEVuZG8gbWFzdGVyKi9cbiAgLyogQHRzLWlnbm9yZSBGSVhNRSBpbiBFbmRvKi9cbiAgY29uc3QgZXhvQ2xhc3NLaXQgPSAoLi4uYXJncykgPT4gcHJlcGFyZUV4b0NsYXNzS2l0KGJhZ2dhZ2UsIC4uLmFyZ3MpO1xuICAvKiogQHR5cGUge1pvbmVbJ2V4byddfSAqL1xuICBjb25zdCBleG8gPSAoLi4uYXJncykgPT4gcHJlcGFyZUV4byhiYWdnYWdlLCAuLi5hcmdzKTtcblxuICBjb25zdCBzdWJab25lU3RvcmUgPSB3cmFwUHJvdmlkZXIoYXR0YWNoZWRTdG9yZXMubWFwU3RvcmUsIGtleXMuem9uZSk7XG5cbiAgLyoqIEB0eXBlIHtab25lWydzdWJab25lJ119ICovXG4gIGNvbnN0IHN1YlpvbmUgPSAobGFiZWwsIG9wdGlvbnMgPSB7fSkgPT4ge1xuICAgIC8qKiBAdHlwZSB7QmFnZ2FnZX0gKi9cbiAgICBjb25zdCBzdWJCYWdnYWdlID0gc3ViWm9uZVN0b3JlKGxhYmVsLCBvcHRpb25zKTtcbiAgICByZXR1cm4gbWFrZUR1cmFibGVab25lKHN1YkJhZ2dhZ2UsIGAke2Jhc2VMYWJlbH0uJHtsYWJlbH1gKTtcbiAgfTtcblxuICByZXR1cm4gRmFyKCdkdXJhYmxlWm9uZScsIHtcbiAgICBleG86IHdyYXBQcm92aWRlcihleG8sIGtleXMuZXhvKSxcbiAgICBleG9DbGFzczogd3JhcFByb3ZpZGVyKGV4b0NsYXNzLCBrZXlzLmV4b0NsYXNzKSxcbiAgICBleG9DbGFzc0tpdDogd3JhcFByb3ZpZGVyKGV4b0NsYXNzS2l0LCBrZXlzLmV4b0NsYXNzS2l0KSxcbiAgICBzdWJab25lLFxuXG4gICAgbWFrZU9uY2UsXG4gICAgd2F0Y2hQcm9taXNlLFxuICAgIGRldGFjaGVkOiBhdHRhY2hlZFN0b3Jlcy5kZXRhY2hlZCxcbiAgICBpc1N0b3JhYmxlOiBhdHRhY2hlZFN0b3Jlcy5pc1N0b3JhYmxlLFxuXG4gICAgbWFwU3RvcmU6IHdyYXBQcm92aWRlcihhdHRhY2hlZFN0b3Jlcy5tYXBTdG9yZSwga2V5cy5zdG9yZSksXG4gICAgc2V0U3RvcmU6IHdyYXBQcm92aWRlcihhdHRhY2hlZFN0b3Jlcy5zZXRTdG9yZSwga2V5cy5zdG9yZSksXG4gICAgd2Vha01hcFN0b3JlOiB3cmFwUHJvdmlkZXIoYXR0YWNoZWRTdG9yZXMud2Vha01hcFN0b3JlLCBrZXlzLnN0b3JlKSxcbiAgICB3ZWFrU2V0U3RvcmU6IHdyYXBQcm92aWRlcihhdHRhY2hlZFN0b3Jlcy53ZWFrU2V0U3RvcmUsIGtleXMuc3RvcmUpLFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VEdXJhYmxlWm9uZShtYWtlRHVyYWJsZVpvbmUpO1xuaGFyZGVuKG1ha2VEdXJhYmxlWm9uZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRHVyYWJsZVpvbmUiOlsibWFrZUR1cmFibGVab25lIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANY4VALFAQAAxQEAAB8AAABAZW5kby9jYWNoZS1tYXAtdjEuMS4wL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2NhY2hlbWFwLmpzIl0sImV4cG9ydHMiOltudWxsXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvY2FjaGVtYXAuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9jYWNoZW1hcC5qcyI6W1sibWFrZUNhY2hlTWFwS2l0IiwibWFrZUNhY2hlTWFwS2l0Il1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACBle78JicAACYnAAAmAAAAQGVuZG8vY2FjaGUtbWFwLXYxLjEuMC9zcmMvY2FjaGVtYXAuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1ha2VDYWNoZU1hcEtpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKiBAdHMtY2hlY2sqL1xuLyogZ2xvYmFsIGdsb2JhbFRoaXMgKi9cbi8qIGVzbGludC1kaXNhYmxlIEBlbmRvL25vLXBvbHltb3JwaGljLWNhbGwgKi9cblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXJlc3RyaWN0ZWQtZ2xvYmFscyovXG5jb25zdCB7IEVycm9yLCBUeXBlRXJyb3IsIFdlYWtNYXAgfSA9IGdsb2JhbFRoaXM7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzKi9cbmNvbnN0IHsgcGFyc2UsIHN0cmluZ2lmeSB9ID0gSlNPTjtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHMqL1xuY29uc3QgeyBpc1NhZmVJbnRlZ2VyIH0gPSBOdW1iZXI7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzKi9cbmNvbnN0IHsgZnJlZXplIH0gPSBPYmplY3Q7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzKi9cbmNvbnN0IHsgdG9TdHJpbmdUYWc6IHRvU3RyaW5nVGFnU3ltYm9sIH0gPSBTeW1ib2w7XG5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1yZXN0cmljdGVkLWdsb2JhbHMqL1xuY29uc3QgVU5LTk9XTl9LRVkgPSBTeW1ib2woJ1VOS05PV05fS0VZJyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtUIGV4dGVuZHMgb2JqZWN0ID8geyAtcmVhZG9ubHkgW0sgaW4ga2V5b2YgVF06IFRbS10gfSA6IG5ldmVyfSBXcml0YWJsZURlZXBcbiAqICAgSW50ZW50aW9uYWxseSBsaW1pdGVkIHRvIGxvY2FsIG5lZWRzOyByZWZlciB0b1xuICogICBodHRwczovL2dpdGh1Yi5jb20vc2luZHJlc29yaHVzL3R5cGUtZmVzdCBpZiBpbnN1ZmZpY2llbnQuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSB2YWx1ZVxuICogQHBhcmFtIHs8VSw+KG5hbWU6IHN0cmluZywgdmFsdWU6IFUpID0+IFV9IFtyZXZpdmVyXVxuICogQHJldHVybnMge1dyaXRhYmxlRGVlcDxUPn1cbiAqL1xuY29uc3QgZGVlcENvcHlKc29uYWJsZSA9ICh2YWx1ZSwgcmV2aXZlcikgPT4ge1xuICBjb25zdCBlbmNvZGVkID0gc3RyaW5naWZ5KHZhbHVlKTtcbiAgY29uc3QgZGVjb2RlZCA9IHBhcnNlKGVuY29kZWQsIHJldml2ZXIpO1xuICByZXR1cm4gZGVjb2RlZDtcbn07XG5cbmNvbnN0IGZyZWV6aW5nUmV2aXZlciA9IChfbmFtZSwgdmFsdWUpID0+IGZyZWV6ZSh2YWx1ZSk7XG5cbi8qKiBAdHlwZSB7PFQsPih2YWx1ZTogVCkgPT4gVH0gKi9cbmNvbnN0IGRlZXBDb3B5QW5kRnJlZXplSnNvbmFibGUgPSB2YWx1ZSA9PlxuICBkZWVwQ29weUpzb25hYmxlKHZhbHVlLCBmcmVlemluZ1Jldml2ZXIpO1xuXG4vKipcbiAqIEEgY2FjaGUgb2YgYm91bmRlZCBzaXplLCBpbXBsZW1lbnRpbmcgdGhlIFdlYWtNYXAgaW50ZXJmYWNlIGJ1dCBob2xkaW5nIGtleXNcbiAqIHN0cm9uZ2x5IGlmIGNyZWF0ZWQgd2l0aCBhIG5vbi13ZWFrIGBtYWtlTWFwYCBvcHRpb24gb2ZcbiAqIHtAbGluayBtYWtlQ2FjaGVNYXBLaXR9LlxuICpcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAdGVtcGxhdGUgVlxuICogQHR5cGVkZWYge1BpY2s8TWFwPEssIFY+LCBFeGNsdWRlPGtleW9mIFdlYWtNYXA8V2Vha0tleSwgKj4sICdzZXQnPj4gJiB7c2V0OiAoa2V5OiBLLCB2YWx1ZTogVikgPT4gV2Vha01hcEFQSTxLLCBWPn19IFdlYWtNYXBBUElcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAdGVtcGxhdGUgVlxuICogQHR5cGVkZWYge1dlYWtNYXBBUEk8SywgVj4gJiAoe2NsZWFyPzogdW5kZWZpbmVkfSB8IFBpY2s8TWFwPEssIFY+LCAnY2xlYXInPil9IFNpbmdsZUVudHJ5TWFwXG4gKi9cblxuLyoqXG4gKiBBIGNlbGwgb2YgYSBkb3VibHktbGlua2VkIHJpbmcgKGNpcmN1bGFyIGxpc3QpIGZvciBhIGNhY2hlIG1hcC5cbiAqIEluc3RhbmNlcyBhcmUgbm90IGZyb3plbiwgYW5kIHNvIHNob3VsZCBiZSBjbG9zZWx5IGVuY2Fwc3VsYXRlZC5cbiAqXG4gKiBAdGVtcGxhdGUgS1xuICogQHRlbXBsYXRlIFZcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENhY2hlTWFwQ2VsbFxuICogQHByb3BlcnR5IHtudW1iZXJ9IGlkIGZvciBkZWJ1Z2dpbmdcbiAqIEBwcm9wZXJ0eSB7Q2FjaGVNYXBDZWxsPEssIFY+fSBuZXh0XG4gKiBAcHJvcGVydHkge0NhY2hlTWFwQ2VsbDxLLCBWPn0gcHJldlxuICogQHByb3BlcnR5IHtTaW5nbGVFbnRyeU1hcDxLLCBWPn0gZGF0YVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEB0ZW1wbGF0ZSBWXG4gKiBAcGFyYW0ge0NhY2hlTWFwQ2VsbDxLLCBWPn0gcHJldlxuICogQHBhcmFtIHtudW1iZXJ9IGlkXG4gKiBAcGFyYW0ge1NpbmdsZUVudHJ5TWFwPEssIFY+fSBkYXRhXG4gKiBAcmV0dXJucyB7Q2FjaGVNYXBDZWxsPEssIFY+fVxuICovXG5jb25zdCBhcHBlbmROZXdDZWxsID0gKHByZXYsIGlkLCBkYXRhKSA9PiB7XG4gIGNvbnN0IG5leHQgPSBwcmV2Py5uZXh0O1xuICBjb25zdCBjZWxsID0geyBpZCwgbmV4dCwgcHJldiwgZGF0YSB9O1xuICBwcmV2Lm5leHQgPSBjZWxsO1xuICBuZXh0LnByZXYgPSBjZWxsO1xuICByZXR1cm4gY2VsbDtcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEB0ZW1wbGF0ZSBWXG4gKiBAcGFyYW0ge0NhY2hlTWFwQ2VsbDxLLCBWPn0gY2VsbFxuICogQHBhcmFtIHtDYWNoZU1hcENlbGw8SywgVj59IHByZXZcbiAqIEBwYXJhbSB7Q2FjaGVNYXBDZWxsPEssIFY+fSBbbmV4dF1cbiAqL1xuY29uc3QgbW92ZUNlbGxBZnRlciA9IChjZWxsLCBwcmV2LCBuZXh0ID0gcHJldi5uZXh0KSA9PiB7XG4gIGlmIChjZWxsID09PSBwcmV2IHx8IGNlbGwgPT09IG5leHQpIHJldHVybjsgLyogYWxyZWFkeSBpbiBwb3NpdGlvbiovXG5cbiAgLyogU3BsaWNlIG91dCBjZWxsLiovXG4gIGNvbnN0IHsgcHJldjogb2xkUHJldiwgbmV4dDogb2xkTmV4dCB9ID0gY2VsbDtcbiAgb2xkUHJldi5uZXh0ID0gb2xkTmV4dDtcbiAgb2xkTmV4dC5wcmV2ID0gb2xkUHJldjtcblxuICAvKiBTcGxpY2UgaW4gY2VsbCBhZnRlciBwcmV2LiovXG4gIGNlbGwucHJldiA9IHByZXY7XG4gIGNlbGwubmV4dCA9IG5leHQ7XG4gIHByZXYubmV4dCA9IGNlbGw7XG4gIG5leHQucHJldiA9IGNlbGw7XG59O1xuXG4vKipcbiAqIENsZWFyIG91dCBhIGNlbGwgdG8gcHJlcGFyZSBpdCBmb3IgZnV0dXJlIHVzZS4gSXRzIG1hcCBpcyBwcmVzZXJ2ZWQgd2hlblxuICogcG9zc2libGUsIGJ1dCBtdXN0IGluc3RlYWQgYmUgcmVwbGFjZWQgaWYgdGhlIGFzc29jaWF0ZWQga2V5IGlzIG5vdCBrbm93bi5cbiAqXG4gKiBAdGVtcGxhdGUgS1xuICogQHRlbXBsYXRlIFZcbiAqIEBwYXJhbSB7Q2FjaGVNYXBDZWxsPEssIFY+fSBjZWxsXG4gKiBAcGFyYW0ge0sgfCBVTktOT1dOX0tFWX0gb2xkS2V5XG4gKiBAcGFyYW0geygpID0+IFNpbmdsZUVudHJ5TWFwPEssIFY+fSBbbWFrZU1hcF0gcmVxdWlyZWQgd2hlbiB0aGUga2V5IGlzIHVua25vd25cbiAqL1xuY29uc3QgcmVzZXRDZWxsID0gKGNlbGwsIG9sZEtleSwgbWFrZU1hcCkgPT4ge1xuICBpZiAob2xkS2V5ICE9PSBVTktOT1dOX0tFWSkge1xuICAgIGNlbGwuZGF0YS5kZWxldGUob2xkS2V5KTtcbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKGNlbGwuZGF0YS5jbGVhcikge1xuICAgIGNlbGwuZGF0YS5jbGVhcigpO1xuICAgIHJldHVybjtcbiAgfVxuICAvKiBXZWFrTWFwIGluc3RhbmNlcyBtdXN0IGJlIHJlcGxhY2VkIHdoZW4gdGhlIGtleSBpcyB1bmtub3duLiovXG4gIGlmICghbWFrZU1hcCkge1xuICAgIHRocm93IEVycm9yKCdpbnRlcm5hbDogbWFrZU1hcCBpcyByZXF1aXJlZCB3aXRoIFVOS05PV05fS0VZJyk7XG4gIH1cbiAgY2VsbC5kYXRhID0gbWFrZU1hcCgpO1xufTtcblxuY29uc3QgemVyb01ldHJpY3MgPSBmcmVlemUoe1xuICB0b3RhbFF1ZXJ5Q291bnQ6IDAsXG4gIHRvdGFsSGl0Q291bnQ6IDBcbiAgLyogVE9ETz8qL1xuICAvKiAqIG1ldGhvZC1zcGVjaWZpYyBjb3VudHMqL1xuICAvKiAqIGxpdmVUb3VjaFN0YXRzL2V2aWN0ZWRUb3VjaFN0YXRzIHsgY291bnQsIHN1bSwgbWVhbiwgbWluLCBtYXggfSovXG4gIC8qICogcDUwL3A5MC9wOTUvcDk5IHZpYSBCZW4tSGFpbS9Ub20tVG92IHN0cmVhbWluZyBoaXN0b2dyYW1zKi9cbn0pO1xuLyoqIEB0eXBlZGVmIHt0eXBlb2YgemVyb01ldHJpY3N9IENhY2hlTWFwTWV0cmljcyAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7TWFwQ29uc3RydWN0b3IgfCBXZWFrTWFwQ29uc3RydWN0b3J9IFtDPVdlYWtNYXBDb25zdHJ1Y3Rvcl1cbiAqIEB0ZW1wbGF0ZSB7UGFyYW1ldGVyczxJbnN0YW5jZVR5cGU8Qz5bJ3NldCddPlswXX0gW0s9UGFyYW1ldGVyczxJbnN0YW5jZVR5cGU8Qz5bJ3NldCddPlswXV1cbiAqIEB0ZW1wbGF0ZSB7dW5rbm93bn0gW1Y9dW5rbm93bl1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IENhY2hlTWFwS2l0XG4gKiBAcHJvcGVydHkge1dlYWtNYXBBUEk8SywgVj59IGNhY2hlXG4gKiBAcHJvcGVydHkgeygpID0+IENhY2hlTWFwTWV0cmljc30gZ2V0TWV0cmljc1xuICovXG5cbi8qKlxuICogQ3JlYXRlIGEgYm91bmRlZC1zaXplIGNhY2hlIGhhdmluZyBXZWFrTWFwLWNvbXBhdGlibGVcbiAqIGBoYXNgL2BnZXRgL2BzZXRgL2BkZWxldGVgIG1ldGhvZHMsIGNhcGFibGUgb2Ygc3VwcG9ydGluZyBTRVMgKHNwZWNpZmljYWxseVxuICogYGFzc2VydGAgZXJyb3Igbm90ZXMpLlxuICogS2V5IHZhbGlkaXR5LCBjb21wYXJpc29uLCBhbmQgcmVmZXJlbnRpYWwgc3RyZW5ndGggYXJlIGNvbnRyb2xsZWQgYnkgdGhlXG4gKiBgbWFrZU1hcGAgb3B0aW9uLCB3aGljaCBkZWZhdWx0cyB0byBgV2Vha01hcGAgYnV0IGNhbiBiZSBzZXQgdG8gYW55IHByb2R1Y2VyXG4gKiBvZiBvYmplY3RzIHdpdGggdGhvc2UgbWV0aG9kcyAoZS5nLiwgdXNpbmcgYE1hcGAgYWxsb3dzIGZvciBhcmJpdHJhcnkga2V5c1xuICogd2hpY2ggd2lsbCBiZSBzdHJvbmdseSBoZWxkKS5cbiAqIENhY2hlIGV2aWN0aW9uIHBvbGljeSBpcyBub3QgY3VycmVudGx5IGNvbmZpZ3VyYWJsZSwgYnV0IHN0cml2ZXMgZm9yIGEgaGl0XG4gKiByYXRpbyBhdCBsZWFzdCBhcyBnb29kIGFzXG4gKiBbTFJVXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9DYWNoZV9yZXBsYWNlbWVudF9wb2xpY2llcyNMUlUpIChlLmcuLCBpdFxuICogbWlnaHQgYmVcbiAqIFtDTE9DS10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUGFnZV9yZXBsYWNlbWVudF9hbGdvcml0aG0jQ2xvY2spXG4gKiBvciBbU0lFVkVdKGh0dHBzOi8vc2lldmVjYWNoZS5jb20vKSkuXG4gKlxuICogQHRlbXBsYXRlIHtNYXBDb25zdHJ1Y3RvciB8IFdlYWtNYXBDb25zdHJ1Y3Rvcn0gW0M9V2Vha01hcENvbnN0cnVjdG9yXVxuICogQHRlbXBsYXRlIHtQYXJhbWV0ZXJzPEluc3RhbmNlVHlwZTxDPlsnc2V0J10+WzBdfSBbSz1QYXJhbWV0ZXJzPEluc3RhbmNlVHlwZTxDPlsnc2V0J10+WzBdXVxuICogQHRlbXBsYXRlIHt1bmtub3dufSBbVj11bmtub3duXVxuICogQHBhcmFtIHtudW1iZXJ9IGNhcGFjaXR5XG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge0MgfCAoKCkgPT4gU2luZ2xlRW50cnlNYXA8SywgVj4pfSBbb3B0aW9ucy5tYWtlTWFwXVxuICogQHJldHVybnMge0NhY2hlTWFwS2l0PEMsIEssIFY+fVxuICovXG4gICAgICAgY29uc3QgbWFrZUNhY2hlTWFwS2l0ID0gKGNhcGFjaXR5LCBvcHRpb25zID0ge30pID0+IHtcbiAgaWYgKCFpc1NhZmVJbnRlZ2VyKGNhcGFjaXR5KSB8fCBjYXBhY2l0eSA8IDApIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IoXG4gICAgICAnY2FwYWNpdHkgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBzYWZlIGludGVnZXIgbnVtYmVyIDw9IDIqKjUzIC0gMScsXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICogQHRlbXBsYXRlIFZcbiAqIEB0eXBlIHs8Viw+KCkgPT4gU2luZ2xlRW50cnlNYXA8SywgVj59XG4gKi9cbiAgY29uc3QgbWFrZU1hcCA9IChNYXliZUN0b3IgPT4ge1xuICAgIHRyeSB7XG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yKi9cbiAgICAgIE1heWJlQ3RvcigpO1xuICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7YW55fSAqLyAoTWF5YmVDdG9yKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IqL1xuICAgICAgY29uc3QgY29uc3RydWN0TmV3TWFwID0gKCkgPT4gbmV3IE1heWJlQ3RvcigpO1xuICAgICAgcmV0dXJuIGNvbnN0cnVjdE5ld01hcDtcbiAgICB9XG4gIH0pKG9wdGlvbnMubWFrZU1hcCA/PyBXZWFrTWFwKTtcbiAgY29uc3QgdGFnID1cbiAgICAvKiogQHR5cGUge2FueX0gKi8gKG1ha2VNYXAoKSkuY2xlYXIgPT09IHVuZGVmaW5lZFxuICAgICAgPyAnV2Vha0NhY2hlTWFwJ1xuICAgICAgOiAnQ2FjaGVNYXAnO1xuXG4gIC8qKiBAdHlwZSB7V2Vha01hcEFQSTxLLCBDYWNoZU1hcENlbGw8SywgVj4+fSAqL1xuICBjb25zdCBrZXlUb0NlbGwgPSBtYWtlTWFwKCk7XG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgdGhpcyBzZW50aW5lbCBoZWFkIGlzIHNwZWNpYWwqL1xuICBjb25zdCBoZWFkID0gLyoqIEB0eXBlIHtDYWNoZU1hcENlbGw8SywgVj59ICovICh7XG4gICAgaWQ6IDAsXG4gICAgLyogbmV4dCBhbmQgcHJldiBhcmUgZXN0YWJsaXNoZWQgYmVsb3cgYXMgc2VsZi1yZWZlcmVudGlhbC4qL1xuICAgIG5leHQ6IHVuZGVmaW5lZCxcbiAgICBwcmV2OiB1bmRlZmluZWQsXG4gICAgZGF0YToge1xuICAgICAgaGFzOiAoKSA9PiB7XG4gICAgICAgIHRocm93IEVycm9yKCdpbnRlcm5hbDogc2VudGluZWwgaGVhZCBjZWxsIGhhcyBubyBkYXRhJyk7XG4gICAgICB9LFxuICAgIH0sXG4gIH0pO1xuICBoZWFkLm5leHQgPSBoZWFkO1xuICBoZWFkLnByZXYgPSBoZWFkO1xuICBsZXQgY2VsbENvdW50ID0gMDtcblxuICBjb25zdCBtZXRyaWNzID0gZGVlcENvcHlKc29uYWJsZSh6ZXJvTWV0cmljcyk7XG4gIGNvbnN0IGdldE1ldHJpY3MgPSAoKSA9PiBkZWVwQ29weUFuZEZyZWV6ZUpzb25hYmxlKG1ldHJpY3MpO1xuXG4gIC8qKlxuICogVG91Y2hpbmcgbW92ZXMgYSBjZWxsIHRvIGZpcnN0IHBvc2l0aW9uIHNvIExSVSBldmljdGlvbiBjYW4gdGFyZ2V0IHRoZSBsYXN0XG4gKiBjZWxsIChgaGVhZC5wcmV2YCkuXG4gKlxuICogQHR5cGUgeyhrZXk6IEspID0+IChDYWNoZU1hcENlbGw8SywgVj4gfCB1bmRlZmluZWQpfVxuICovXG4gIGNvbnN0IHRvdWNoS2V5ID0ga2V5ID0+IHtcbiAgICBtZXRyaWNzLnRvdGFsUXVlcnlDb3VudCArPSAxO1xuICAgIGNvbnN0IGNlbGwgPSBrZXlUb0NlbGwuZ2V0KGtleSk7XG4gICAgaWYgKCFjZWxsPy5kYXRhLmhhcyhrZXkpKSByZXR1cm4gdW5kZWZpbmVkO1xuXG4gICAgbWV0cmljcy50b3RhbEhpdENvdW50ICs9IDE7XG4gICAgbW92ZUNlbGxBZnRlcihjZWxsLCBoZWFkKTtcbiAgICByZXR1cm4gY2VsbDtcbiAgfTtcblxuICAvKiogQHR5cGUge1dlYWtNYXBBUEk8SywgVj5bJ2hhcyddfSAqL1xuICBjb25zdCBoYXMgPSBrZXkgPT4ge1xuICAgIGNvbnN0IGNlbGwgPSB0b3VjaEtleShrZXkpO1xuICAgIHJldHVybiBjZWxsICE9PSB1bmRlZmluZWQ7XG4gIH07XG4gIGZyZWV6ZShoYXMpO1xuXG4gIC8qKiBAdHlwZSB7V2Vha01hcEFQSTxLLCBWPlsnZ2V0J119ICovXG4gIGNvbnN0IGdldCA9IGtleSA9PiB7XG4gICAgY29uc3QgY2VsbCA9IHRvdWNoS2V5KGtleSk7XG4gICAgcmV0dXJuIGNlbGw/LmRhdGEuZ2V0KGtleSk7XG4gIH07XG4gIGZyZWV6ZShnZXQpO1xuXG4gIC8qKiBAdHlwZSB7V2Vha01hcEFQSTxLLCBWPlsnc2V0J119ICovXG4gIGNvbnN0IHNldCA9IChrZXksIHZhbHVlKSA9PiB7XG4gICAgbGV0IGNlbGwgPSB0b3VjaEtleShrZXkpO1xuICAgIGlmIChjZWxsKSB7XG4gICAgICBjZWxsLmRhdGEuc2V0KGtleSwgdmFsdWUpO1xuICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICAgIHJldHVybiBpbXBsZW1lbnRhdGlvbjtcbiAgICB9XG5cbiAgICBpZiAoY2VsbENvdW50IDwgY2FwYWNpdHkpIHtcbiAgICAgIC8qIEFkZCBhbmQgdXNlIGEgbmV3IGNlbGwgYXQgZmlyc3QgcG9zaXRpb24uKi9cbiAgICAgIGNlbGwgPSBhcHBlbmROZXdDZWxsKGhlYWQsIGNlbGxDb3VudCArIDEsIG1ha2VNYXAoKSk7XG4gICAgICBjZWxsQ291bnQgKz0gMTsgLyogaW50ZW50aW9uYWxseSBmb2xsb3dzIGNlbGwgY3JlYXRpb24qL1xuICAgICAgY2VsbC5kYXRhLnNldChrZXksIHZhbHVlKTtcbiAgICB9IGVsc2UgaWYgKGNhcGFjaXR5ID4gMCkge1xuICAgICAgLyogUmV1c2UgdGhlIGN1cnJlbnQgdGFpbCwgbW92aW5nIGl0IHRvIGZpcnN0IHBvc2l0aW9uLiovXG4gICAgICBjZWxsID0gaGVhZC5wcmV2O1xuICAgICAgcmVzZXRDZWxsKC8qKiBAdHlwZSB7YW55fSAqLyAoY2VsbCksIFVOS05PV05fS0VZLCBtYWtlTWFwKTtcbiAgICAgIGNlbGwuZGF0YS5zZXQoa2V5LCB2YWx1ZSk7XG4gICAgICBtb3ZlQ2VsbEFmdGVyKGNlbGwsIGhlYWQpO1xuICAgIH1cblxuICAgIC8qIERvbid0IGVzdGFibGlzaCB0aGlzIGVudHJ5IHVudGlsIHByaW9yIHN0ZXBzIHN1Y2NlZWQuKi9cbiAgICBpZiAoY2VsbCkga2V5VG9DZWxsLnNldChrZXksIGNlbGwpO1xuXG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICByZXR1cm4gaW1wbGVtZW50YXRpb247XG4gIH07XG4gIGZyZWV6ZShzZXQpO1xuXG4gIC8qIFwiZGVsZXRlXCIgaXMgYSBrZXl3b3JkLiovXG4gIGNvbnN0IHsgZGVsZXRlOiBkZWxldGVFbnRyeSB9ID0ge1xuICAgIC8qKiBAdHlwZSB7V2Vha01hcEFQSTxLLCBWPlsnZGVsZXRlJ119ICovXG4gICAgZGVsZXRlOiBrZXkgPT4ge1xuICAgICAgY29uc3QgY2VsbCA9IGtleVRvQ2VsbC5nZXQoa2V5KTtcbiAgICAgIGlmICghY2VsbD8uZGF0YS5oYXMoa2V5KSkge1xuICAgICAgICBrZXlUb0NlbGwuZGVsZXRlKGtleSk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIG1vdmVDZWxsQWZ0ZXIoY2VsbCwgaGVhZC5wcmV2KTtcbiAgICAgIHJlc2V0Q2VsbChjZWxsLCBrZXkpO1xuICAgICAga2V5VG9DZWxsLmRlbGV0ZShrZXkpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgfTtcbiAgZnJlZXplKGRlbGV0ZUVudHJ5KTtcblxuICBjb25zdCBpbXBsZW1lbnRhdGlvbiA9IC8qKiBAdHlwZSB7V2Vha01hcEFQSTxLLCBWPn0gKi8gKHtcbiAgICBoYXMsXG4gICAgZ2V0LFxuICAgIHNldCxcbiAgICBkZWxldGU6IGRlbGV0ZUVudHJ5LFxuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBqc2RvYy9jaGVjay10eXBlcyovXG4gICAgWy8qKiBAdHlwZSB7dHlwZW9mIFN5bWJvbC50b1N0cmluZ1RhZ30gKi8gKHRvU3RyaW5nVGFnU3ltYm9sKV06IHRhZyxcbiAgfSk7XG4gIGZyZWV6ZShpbXBsZW1lbnRhdGlvbik7XG5cbiAgY29uc3Qga2l0ID0geyBjYWNoZTogaW1wbGVtZW50YXRpb24sIGdldE1ldHJpY3MgfTtcbiAgcmV0dXJuIGZyZWV6ZShraXQpO1xufTskaM2PX29uY2UubWFrZUNhY2hlTWFwS2l0KG1ha2VDYWNoZU1hcEtpdCk7XG5mcmVlemUobWFrZUNhY2hlTWFwS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VDYWNoZU1hcEtpdCI6WyJtYWtlQ2FjaGVNYXBLaXQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAb1Ehj2ELAABhCwAALAAAAEBlbmRvL2NvbW1vbi12MS4yLjEzL2FwcGx5LWxhYmVsaW5nLWVycm9yLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9wcm9taXNlLWtpdCIsIi4vdGhyb3ctbGFiZWxlZC5qcyJdLCJleHBvcnRzIjpbImFwcGx5TGFiZWxpbmdFcnJvciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEUsaXNQcm9taXNlLHRocm93TGFiZWxlZDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIixbJGjNj19hID0+IChFID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLFskaM2PX2EgPT4gKGlzUHJvbWlzZSA9ICRozY9fYSldXV1dLFtcIi4vdGhyb3ctbGFiZWxlZC5qc1wiLCBbW1widGhyb3dMYWJlbGVkXCIsWyRozY9fYSA9PiAodGhyb3dMYWJlbGVkID0gJGjNj19hKV1dXV1dKTtcblxuXG5cbi8qKlxuICogQ2FsbHMgYGZ1bmMoLi4uYXJncylgLCBidXQgYW5ub3RhdGluZyBhbnkgZmFpbHVyZSBlcnJvciB3aXRoIGBsYWJlbGAuXG4gKlxuICogSWYgYGxhYmVsYCBpcyBvbWl0dGVkIG9yIGB1bmRlZmluZWRgLCB0aGVuIHRoaXMgaXMgZXF1aXZhbGVudCB0b1xuICogYGZ1bmMoLi4uYXJncykuXG4gKlxuICogT3RoZXJ3aXNlLCBpZiBpdCBzdWNjZXNzZnVsbHkgcmV0dXJucyBhIG5vbi1wcm9taXNlLCB0aGF0IG5vbi1wcm9taXNlIGlzXG4gKiByZXR1cm5lZC5cbiAqXG4gKiBJZiBpdCB0aHJvd3MsIHJldGhyb3cgYSBzaW1pbGFyIGVycm9yIHdob3NlIG1lc3NhZ2UgaXNcbiAqIGBgYGpzXG4gKiBgJHtsYWJlbH06ICR7b3JpZ2luYWxNZXNzYWdlfWBcbiAqIGBgYFxuICogVGhhdCB3YXksIGluIGFuIGVycm9yIGhhcHBlbnMgZGVlcCB3aXRoaW4gYSBzdGFjayBvZiBjYWxscyB0b1xuICogYGFwcGx5TGFiZWxpbmdFcnJvcmAsIHRoZSByZXN1bHRpbmcgZXJyb3Igd2lsbCBzaG93IHRoZSBzdGFjayBvZiBsYWJlbHMuXG4gKlxuICogSWYgaXQgcmV0dXJucyBhIHByb21pc2UsIHRoZW4gYGFwcGx5TGFiZWxpbmdFcnJvcmAgY2Fubm90IHRlbGwgdW50aWwgdGhhdFxuICogcHJvbWlzZSBzZXR0bGVzIHdoZXRoZXIgaXQgcmVwcmVzZW50cyBhIHN1Y2Nlc3Mgb3IgZmFpbHVyZS4gU28gaXQgaW1tZWRpYXRlbHlcbiAqIHJldHVybnMgYSBuZXcgcHJvbWlzZS4gSWYgdGhlIG9yaWdpbmFsIHByb21pc2UgZnVsZmlsbHMsIHRoZW4gdGhlXG4gKiBmdWxmaWxsbWVudCBpcyBwcm9wYWdhdGVkIHRvIHRoZSByZXR1cm5lZCBwcm9taXNlLlxuICpcbiAqIElmIHRoZSBwcm9taXNlIHJlamVjdHMgd2l0aCBhbiBlcnJvciwgdGhlbiB0aGUgcmV0dXJuZWQgcHJvbWlzZSBpc1xuICogcmVqZWN0ZWQgd2l0aCBhIHNpbWlsYXIgcHJvbWlzZSwgcHJlZml4ZWQgd2l0aCB0aGUgbGFiZWwgaW4gdGhhdCBzYW1lIHdheS5cbiAqXG4gKiBAdGVtcGxhdGUgQSxSXG4gKiBAcGFyYW0geyguLi5hcmdzOiBBW10pID0+IFJ9IGZ1bmNcbiAqIEBwYXJhbSB7QVtdfSBhcmdzXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtsYWJlbF1cbiAqIEByZXR1cm5zIHtSfVxuICovXG4gICAgICAgY29uc3QgYXBwbHlMYWJlbGluZ0Vycm9yID0gKGZ1bmMsIGFyZ3MsIGxhYmVsID0gdW5kZWZpbmVkKSA9PiB7XG4gIGlmIChsYWJlbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgcmV0dXJuIGZ1bmMoLi4uYXJncyk7XG4gIH1cbiAgbGV0IHJlc3VsdDtcbiAgdHJ5IHtcbiAgICByZXN1bHQgPSBmdW5jKC4uLmFyZ3MpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICB0aHJvd0xhYmVsZWQoZXJyLCBsYWJlbCk7XG4gIH1cbiAgaWYgKGlzUHJvbWlzZShyZXN1bHQpKSB7XG4gICAgLyogQ2Fubm90IGJlIGF0LXRzLWV4cGVjdC1lcnJvciBiZWNhdXNlIHRoZXJlIGlzIG5vIHR5cGUgZXJyb3IgbG9jYWxseS4qL1xuICAgIC8qIFJhdGhlciwgYSB0eXBlIGVycm9yIG9ubHkgYXMgaW1wb3J0ZWQgaW50byBleG8uKi9cbiAgICAvKiBAdHMtaWdub3JlIElmIHJlc3VsdCBpcyBhIHJlamVjdGVkIHByb21pc2UsIHRoaXMgd2lsbCovXG4gICAgLyogcmV0dXJuIGEgcHJvbWlzZSB3aXRoIGEgZGlmZmVyZW50IHJlamVjdGlvbiByZWFzb24uIEJ1dCB0aGlzKi9cbiAgICAvKiBjb25mdXNlcyBUeXBlU2NyaXB0IGJlY2F1c2UgaXQgdHlwZXMgdGhhdCBjYXNlIGFzIGBQcm9taXNlPG5ldmVyPmAqL1xuICAgIC8qIHdoaWNoIGlzIGNvb2wgZm9yIGEgcHJvbWlzZSB0aGF0IHdpbGwgbmV2ZXIgZnVsZmxsLiovXG4gICAgLyogQnV0IFR5cGVTY3JpcHQgZG9lc24ndCB1bmRlcnN0YW5kIHRoYXQgdGhpcyB3aWxsIG9ubHkgaGFwcGVuKi9cbiAgICAvKiB3aGVuIGByZXN1bHRgIHdhcyBhIHJlamVjdGVkIHByb21pc2UuIEluIG9ubHkgdGhpcyBjYXNlIGBSYCovXG4gICAgLyogc2hvdWxkIGFscmVhZHkgYWxsb3cgYFByb21pc2U8bmV2ZXI+YCBhcyBhIHN1YnR5cGUuKi9cbiAgICByZXR1cm4gRS53aGVuKHJlc3VsdCwgdW5kZWZpbmVkLCByZWFzb24gPT4gdGhyb3dMYWJlbGVkKHJlYXNvbiwgbGFiZWwpKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59OyRozY9fb25jZS5hcHBseUxhYmVsaW5nRXJyb3IoYXBwbHlMYWJlbGluZ0Vycm9yKTtcbmhhcmRlbihhcHBseUxhYmVsaW5nRXJyb3IpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXBwbHlMYWJlbGluZ0Vycm9yIjpbImFwcGx5TGFiZWxpbmdFcnJvciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABI+ELK3QUAAN0FAAArAAAAQGVuZG8vY29tbW9uLXYxLjIuMTMvZnJvbS11bmlxdWUtZW50cmllcy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJmcm9tVW5pcXVlRW50cmllcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHEsRmFpbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXV0pO1xuXG5jb25zdCB7IGZyb21FbnRyaWVzIH0gPSBPYmplY3Q7XG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5cbi8qKlxuICogVGhyb3dzIGlmIG11bHRpcGxlIGVudHJpZXMgdXNlIHRoZSBzYW1lIHByb3BlcnR5IG5hbWUuIE90aGVyd2lzZSBhY3RzXG4gKiBsaWtlIGBPYmplY3QuZnJvbUVudHJpZXNgIGJ1dCBoYXJkZW5zIHRoZSByZXN1bHQuXG4gKiBVc2UgaXQgdG8gcHJvdGVjdCBmcm9tIHByb3BlcnR5IG5hbWVzIGNvbXB1dGVkIGZyb20gdXNlci1wcm92aWRlZCBkYXRhLlxuICpcbiAqIEB0ZW1wbGF0ZSBbVD1hbnldXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPHJlYWRvbmx5IFtQcm9wZXJ0eUtleSwgVF0+fSBhbGxFbnRyaWVzXG4gKiBAcmV0dXJucyB7eyBbazogc3RyaW5nXTogVDsgfX1cbiAqL1xuICAgICAgIGNvbnN0IGZyb21VbmlxdWVFbnRyaWVzID0gYWxsRW50cmllcyA9PiB7XG4gIGNvbnN0IGVudHJpZXNBcnJheSA9IFsuLi5hbGxFbnRyaWVzXTtcbiAgY29uc3QgcmVzdWx0ID0gaGFyZGVuKGZyb21FbnRyaWVzKGVudHJpZXNBcnJheSkpO1xuICBpZiAob3duS2V5cyhyZXN1bHQpLmxlbmd0aCA9PT0gZW50cmllc0FycmF5Lmxlbmd0aCkge1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cbiAgY29uc3QgbmFtZXMgPSBuZXcgU2V0KCk7XG4gIGZvciAoY29uc3QgW25hbWUsIF9dIG9mIGVudHJpZXNBcnJheSkge1xuICAgIGlmIChuYW1lcy5oYXMobmFtZSkpIHtcbiAgICAgIEZhaWxgY29sbGlzaW9uIG9uIHByb3BlcnR5IG5hbWUgJHtxKG5hbWUpfTogJHtlbnRyaWVzQXJyYXl9YDtcbiAgICB9XG4gICAgbmFtZXMuYWRkKG5hbWUpO1xuICB9XG4gIHRocm93IEZhaWxgaW50ZXJuYWw6IGZhaWxlZCB0byBjcmVhdGUgb2JqZWN0IGZyb20gdW5pcXVlIGVudHJpZXNgO1xufTskaM2PX29uY2UuZnJvbVVuaXF1ZUVudHJpZXMoZnJvbVVuaXF1ZUVudHJpZXMpO1xuaGFyZGVuKGZyb21VbmlxdWVFbnRyaWVzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImZyb21VbmlxdWVFbnRyaWVzIjpbImZyb21VbmlxdWVFbnRyaWVzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALeVU+4lCAAAJQgAACUAAABAZW5kby9jb21tb24tdjEuMi4xMy9pZGVudC1jaGVja2VyLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJpZGVudENoZWNrZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogVE9ETyBDb21wbGV0ZSBtaWdyYXRpb24gb2YgQ2hlY2tlciB0eXBlIGZyb20gQGVuZG8vcGFzcy1zdHlsZSB0byBAZW5kby9jb21tb24qL1xuLyogYnkgaGF2aW5nIEBlbmRvL3Bhc3Mtc3R5bGUsIGFuZCBldmVyeW9uZSBlbHNlIHdobyBuZWVkcyBpdCwgaW1wb3J0IGl0IGZyb20qL1xuLyogYEBlbmRvL2NvbW1vbi9pZGVudC1jaGVja2VyLmpzYC4qL1xuLyoqXG4gKiBAY2FsbGJhY2sgQ2hlY2tlclxuICogSW50ZXJuYWwgdG8gYSB1c2VmdWwgcGF0dGVybiBmb3Igd3JpdGluZyBjaGVja2luZyBsb2dpY1xuICogKGEgXCJjaGVja0Zvb1wiIGZ1bmN0aW9uKSB0aGF0IGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBhIHByZWRpY2F0ZVxuICogKGFuIFwiaXNGb29cIiBmdW5jdGlvbikgb3IgYSB2YWxpZGF0b3IgKGFuIFwiYXNzZXJ0Rm9vXCIgZnVuY3Rpb24pLlxuICpcbiAqICAgICogQSBwcmVkaWNhdGUgaWRlYWxseSBvbmx5IHJldHVybnMgYHRydWVgIG9yIGBmYWxzZWAgYW5kIHJhcmVseSB0aHJvd3MuXG4gKiAgICAqIEEgdmFsaWRhdG9yIHRocm93cyBhbiBpbmZvcm1hdGl2ZSBkaWFnbm9zdGljIHdoZW4gdGhlIHByZWRpY2F0ZVxuICogICAgICB3b3VsZCBoYXZlIHJldHVybmVkIGBmYWxzZWAsIGFuZCBzaW1wbHkgcmV0dXJucyBgdW5kZWZpbmVkYCBub3JtYWxseVxuICogICAgICB3aGVuIHRoZSBwcmVkaWNhdGUgd291bGQgaGF2ZSByZXR1cm5lZCBgdHJ1ZWAuXG4gKiAgICAqIFRoZSBpbnRlcm5hbCBjaGVja2luZyBmdW5jdGlvbiB0aGF0IHRoZXkgc2hhcmUgaXMgcGFyYW1ldGVyaXplZCBieSBhXG4gKiAgICAgIGBDaGVja2VyYCB0aGF0IGRldGVybWluZXMgaG93IHRvIHByb2NlZWQgd2l0aCBhIGZhaWx1cmUgY29uZGl0aW9uLlxuICogICAgICBQcmVkaWNhdGVzIHBhc3MgaW4gYW4gaWRlbnRpdHkgZnVuY3Rpb24gYXMgY2hlY2tlci4gVmFsaWRhdG9yc1xuICogICAgICBwYXNzIGluIGBhc3NlcnRDaGVja2VyYCB3aGljaCBpcyBhIHRyaXZpYWwgd3JhcHBlciBhcm91bmQgYGFzc2VydGAuXG4gKlxuICogU2VlIHRoZSB2YXJpb3VzIHVzZXMgZm9yIGdvb2QgZXhhbXBsZXMuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGNvbmRcbiAqIEBwYXJhbSB7SU1QT1JUKCdzZXMnKS5EZXRhaWxzfSBbZGV0YWlsc11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5cbi8qKlxuICogSW4gdGhlIGBhc3NlcnRGb29gL2Bpc0Zvb2AvYGNoZWNrRm9vYCBwYXR0ZXJuLCBgY2hlY2tGb29gIGhhcyBhIGBjaGVja2BcbiAqIHBhcmFtZXRlciBvZiB0eXBlIGBDaGVja2VyYC4gYGFzc2VydEZvb2AgY2FsbHMgYGNoZWNrRm9vYCBwYXNzZXNcbiAqIGBhc3NlcnRDaGVja2VyYCBhcyB0aGUgYGNoZWNrYCBhcmd1bWVudC4gYGlzRm9vYCBwYXNzZXMgYGlkZW50Q2hlY2tlcmBcbiAqIGFzIHRoZSBgY2hlY2tgIGFyZ3VtZW50LiBgaWRlbnRDaGVja2VyYCBhY3RzIHByZWNpc2VseSBsaWtlIGFuXG4gKiBpZGVudGl0eSBmdW5jdGlvbiwgYnV0IGlzIHR5cGVkIGFzIGEgYENoZWNrZXJgIHRvIGluZGljYXRlIGl0c1xuICogaW50ZW5kZWQgdXNlLlxuICpcbiAqIEB0eXBlIHtDaGVja2VyfVxuICovXG4gICAgICAgY29uc3QgaWRlbnRDaGVja2VyID0gKGNvbmQsIF9kZXRhaWxzKSA9PiBjb25kOyRozY9fb25jZS5pZGVudENoZWNrZXIoaWRlbnRDaGVja2VyKTtcbmhhcmRlbihpZGVudENoZWNrZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaWRlbnRDaGVja2VyIjpbImlkZW50Q2hlY2tlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABhr/xquAQAALgEAAAnAAAAQGVuZG8vY29tbW9uLXYxLjIuMTMvbGlzdC1kaWZmZXJlbmNlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJsaXN0RGlmZmVyZW5jZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKipcbiAqIFJldHVybiBhIGxpc3Qgb2YgYWxsIHRoZSBlbGVtZW50cyBwcmVzZW50IGluIHRoZSBgbGVmdExpc3RgIGFuZCBub3RcbiAqIGluIHRoZSBgcmlnaHRMaXN0YC4gUmV0dXJuIGluIHRoZSBvcmRlciBvZiB0aGVpciBhcHBlYXJhbmNlIGluIGBsZWZ0TGlzdGAuXG4gKiBVc2VzIHRoZSBjb21wYXJpc29uIGJ1aWx0IGludG8gYFNldGAgbWVtYmVyc2hpcCAoU2FtZVZhbHVlWmVybylcbiAqIHdoaWNoIGlzIGxpa2UgSmF2YVNjcmlwdCdzIGA9PT1gIGV4Y2VwdCB0aGF0IGl0IGp1ZGdlcyBhbnkgYE5hTmAgdG9cbiAqIGJlIHRoZSBzYW1lIGFzIGFueSBgTmFOYCBhbmQgaXQganVkZ2VzIGAwYCB0byBiZSB0aGUgc2FtZSBhIGAtMGAuXG4gKlxuICogVGhpcyBpcyBvZnRlbiB1c2VkIG9uIGxpc3RzIG9mIG5hbWVzIHRoYXQgc2hvdWxkIG1hdGNoLCBpbiBvcmRlciB0byBnZW5lcmF0ZVxuICogdXNlZnVsIGRpYWdub3N0aWNzIGFib3V0IHRoZSB1bm1hdGNoZWQgbmFtZXMuXG4gKlxuICogQHRlbXBsYXRlIHthbnl9IFZcbiAqIEBwYXJhbSB7VltdfSBsZWZ0TGlzdFxuICogQHBhcmFtIHtWW119IHJpZ2h0TGlzdFxuICovXG4gICAgICAgY29uc3QgbGlzdERpZmZlcmVuY2UgPSAobGVmdExpc3QsIHJpZ2h0TGlzdCkgPT4ge1xuICBjb25zdCByaWdodFNldCA9IG5ldyBTZXQocmlnaHRMaXN0KTtcbiAgcmV0dXJuIGxlZnRMaXN0LmZpbHRlcihlbGVtZW50ID0+ICFyaWdodFNldC5oYXMoZWxlbWVudCkpO1xufTskaM2PX29uY2UubGlzdERpZmZlcmVuY2UobGlzdERpZmZlcmVuY2UpO1xuaGFyZGVuKGxpc3REaWZmZXJlbmNlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Imxpc3REaWZmZXJlbmNlIjpbImxpc3REaWZmZXJlbmNlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACXsXfd5BAAAeQQAACsAAABAZW5kby9jb21tb24tdjEuMi4xMy9tYWtlLWFycmF5LWl0ZXJhdG9yLmpzeyJpbXBvcnRzIjpbIi4vbWFrZS1pdGVyYXRvci5qcyJdLCJleHBvcnRzIjpbIm1ha2VBcnJheUl0ZXJhdG9yIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgbWFrZUl0ZXJhdG9yOyRozY9faW1wb3J0cyhbW1wiLi9tYWtlLWl0ZXJhdG9yLmpzXCIsIFtbXCJtYWtlSXRlcmF0b3JcIixbJGjNj19hID0+IChtYWtlSXRlcmF0b3IgPSAkaM2PX2EpXV1dXV0pO1xuXG4vKipcbiAqIEEgYGhhcmRlbmBpbmcgYW5hbG9nIG9mIEFycmF5LnByb3RvdHlwZVtTeW1ib2wuaXRlcmF0b3JdLlxuICpcbiAqIEB0ZW1wbGF0ZSBbVD11bmtub3duXVxuICogQHBhcmFtIHtBcnJheTxUPn0gYXJyXG4gKiBAcmV0dXJucyB7SXRlcmFibGVJdGVyYXRvcjxUPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VBcnJheUl0ZXJhdG9yID0gYXJyID0+IHtcbiAgY29uc3QgeyBsZW5ndGggfSA9IGFycjtcbiAgbGV0IGkgPSAwO1xuICByZXR1cm4gbWFrZUl0ZXJhdG9yKCgpID0+IHtcbiAgICAvKiogQHR5cGUge1R9ICovXG4gICAgbGV0IHZhbHVlO1xuICAgIGlmIChpIDwgbGVuZ3RoKSB7XG4gICAgICB2YWx1ZSA9IGFycltpXTtcbiAgICAgIGkgKz0gMTtcbiAgICAgIHJldHVybiBoYXJkZW4oeyBkb25lOiBmYWxzZSwgdmFsdWUgfSk7XG4gICAgfVxuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgVGhlIHRlcm1pbmFsIHZhbHVlIGRvZXNuJ3QgbWF0dGVyKi9cbiAgICByZXR1cm4gaGFyZGVuKHsgZG9uZTogdHJ1ZSwgdmFsdWUgfSk7XG4gIH0pO1xufTskaM2PX29uY2UubWFrZUFycmF5SXRlcmF0b3IobWFrZUFycmF5SXRlcmF0b3IpO1xuaGFyZGVuKG1ha2VBcnJheUl0ZXJhdG9yKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VBcnJheUl0ZXJhdG9yIjpbIm1ha2VBcnJheUl0ZXJhdG9yIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAF02r3oGAwAABgMAACUAAABAZW5kby9jb21tb24tdjEuMi4xMy9tYWtlLWl0ZXJhdG9yLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlSXRlcmF0b3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyoqXG4gKiBNYWtlcyBhIG9uZS1zaG90IGl0ZXJhYmxlIGl0ZXJhdG9yIGZyb20gYSBwcm92aWRlZCBgbmV4dGAgZnVuY3Rpb24uXG4gKlxuICogQHRlbXBsYXRlIFtUPXVua25vd25dXG4gKiBAcGFyYW0geygpID0+IEl0ZXJhdG9yUmVzdWx0PFQ+fSBuZXh0XG4gKiBAcmV0dXJucyB7SXRlcmFibGVJdGVyYXRvcjxUPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VJdGVyYXRvciA9IG5leHQgPT4ge1xuICBjb25zdCBpdGVyID0gaGFyZGVuKHtcbiAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4gaXRlcixcbiAgICBuZXh0LFxuICB9KTtcbiAgcmV0dXJuIGl0ZXI7XG59OyRozY9fb25jZS5tYWtlSXRlcmF0b3IobWFrZUl0ZXJhdG9yKTtcbmhhcmRlbihtYWtlSXRlcmF0b3IpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUl0ZXJhdG9yIjpbIm1ha2VJdGVyYXRvciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB256sZbwoAAG8KAAAiAAAAQGVuZG8vY29tbW9uLXYxLjIuMTMvb2JqZWN0LW1hcC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsib2JqZWN0TWFwIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO2NvbnN0IHsgZW50cmllcywgZnJvbUVudHJpZXMgfSA9IE9iamVjdDtcblxuLyoqXG4gKiBCeSBhbmFsb2d5IHdpdGggaG93IGBBcnJheS5wcm90b3R5cGUubWFwYCB3aWxsIG1hcCB0aGUgZWxlbWVudHMgb2ZcbiAqIGFuIGFycmF5IHRvIHRyYW5zZm9ybWVkIGVsZW1lbnRzIG9mIGFuIGFycmF5IG9mIHRoZSBzYW1lIHNoYXBlLFxuICogYG9iamVjdE1hcGAgd2lsbCBkbyBsaWtld2lzZSBmb3IgdGhlIHN0cmluZy1uYW1lZCBvd24gZW51bWVyYWJsZVxuICogcHJvcGVydGllcyBvZiBhbiBvYmplY3QuXG4gKlxuICogVHlwaWNhbCB1c2FnZSBhcHBsaWVzIGBvYmplY3RNYXBgIHRvIGEgQ29weVJlY29yZCwgaS5lLixcbiAqIGFuIG9iamVjdCBmb3Igd2hpY2ggYHBhc3NTdHlsZU9mKG9yaWdpbmFsKSA9PT0gJ2NvcHlSZWNvcmQnYC4gRm9yIHRoZXNlLFxuICogbm9uZSBvZiB0aGUgZm9sbG93aW5nIGVkZ2UgY2FzZXMgYXJpc2UuIFRoZSByZXN1bHQgd2lsbCBiZSBhIENvcHlSZWNvcmRcbiAqIHdpdGggZXhhY3RseSB0aGUgc2FtZSBwcm9wZXJ0eSBuYW1lcywgd2hvc2UgdmFsdWVzIGFyZSB0aGUgbWFwcGVkIGZvcm0gb2ZcbiAqIHRoZSBvcmlnaW5hbCdzIHZhbHVlcy5cbiAqXG4gKiBXaGVuIHRoZSBvcmlnaW5hbCBpcyBub3QgYSBDb3B5UmVjb3JkLCBzb21lIGVkZ2UgY2FzZXMgdG8gYmUgYXdhcmUgb2ZcbiAqICAgICogTm8gbWF0dGVyIGhvdyBtdXRhYmxlIHRoZSBvcmlnaW5hbCBvYmplY3QsIHRoZSByZXR1cm5lZCBvYmplY3QgaXNcbiAqICAgICAgaGFyZGVuZWQuXG4gKiAgICAqIE9ubHkgdGhlIHN0cmluZy1uYW1lZCBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBvcmlnaW5hbFxuICogICAgICBhcmUgbWFwcGVkLiBBbGwgb3RoZXIgcHJvcGVydGllcyBhcmUgaWdub3JlZC5cbiAqICAgICogSWYgYW55IG9mIHRoZSBvcmlnaW5hbCBwcm9wZXJ0aWVzIHdlcmUgYWNjZXNzb3JzLCBgT2JqZWN0LmVudHJpZXNgXG4gKiAgICAgIHdpbGwgY2F1c2UgaXRzIGBnZXR0ZXJgIHRvIGJlIGNhbGxlZCBhbmQgd2lsbCB1c2UgdGhlIHJlc3VsdGluZ1xuICogICAgICB2YWx1ZS5cbiAqICAgICogTm8gbWF0dGVyIHdoZXRoZXIgdGhlIG9yaWdpbmFsIHByb3BlcnR5IHdhcyBhbiBhY2Nlc3Nvciwgd3JpdGFibGUsXG4gKiAgICAgIG9yIGNvbmZpZ3VyYWJsZSwgYWxsIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBiZVxuICogICAgICBub24td3JpdGFibGUsIG5vbi1jb25maWd1cmFibGUsIGRhdGEgcHJvcGVydGllcy5cbiAqICAgICogTm8gbWF0dGVyIHdoYXQgdGhlIG9yaWdpbmFsIG9iamVjdCBtYXkgaGF2ZSBpbmhlcml0ZWQgZnJvbSwgYW5kXG4gKiAgICAgIG5vIG1hdHRlciB3aGV0aGVyIGl0IHdhcyBhIHNwZWNpYWwga2luZCBvZiBvYmplY3Qgc3VjaCBhcyBhbiBhcnJheSxcbiAqICAgICAgdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGFsd2F5cyBiZSBhIHBsYWluIG9iamVjdCBpbmhlcml0aW5nIGRpcmVjdGx5XG4gKiAgICAgIGZyb20gYE9iamVjdC5wcm90b3R5cGVgIGFuZCB3aG9zZSBzdGF0ZSBpcyBvbmx5IHRoZXNlIG5ldyBtYXBwZWRcbiAqICAgICAgb3duIHByb3BlcnRpZXMuXG4gKlxuICogV2l0aCB0aGVzZSBkaWZmZXJlbmNlcywgZXZlbiBpZiB0aGUgb3JpZ2luYWwgb2JqZWN0IHdhcyBub3QgYSBDb3B5UmVjb3JkLFxuICogaWYgYWxsIHRoZSBtYXBwZWQgdmFsdWVzIGFyZSBQYXNzYWJsZSwgdGhlbiB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYmVcbiAqIGEgQ29weVJlY29yZC5cbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIGFueT59IE9cbiAqIEB0ZW1wbGF0ZSBSIG1hcCByZXN1bHRcbiAqIEBwYXJhbSB7T30gb3JpZ2luYWxcbiAqIEBwYXJhbSB7KHZhbHVlOiBPW2tleW9mIE9dLCBrZXk6IGtleW9mIE8pID0+IFJ9IG1hcEZuXG4gKiBAcmV0dXJucyB7UmVjb3JkPGtleW9mIE8sIFI+fVxuICovXG4gICAgICAgY29uc3Qgb2JqZWN0TWFwID0gKG9yaWdpbmFsLCBtYXBGbikgPT4ge1xuICBjb25zdCBlbnRzID0gZW50cmllcyhvcmlnaW5hbCk7XG4gIGNvbnN0IG1hcEVudHMgPSBlbnRzLm1hcChcbiAgICAoW2ssIHZdKSA9PiAvKiogQHR5cGUge1trZXlvZiBPLCBSXX0gKi8gKFtrLCBtYXBGbih2LCBrKV0pLFxuICApO1xuICByZXR1cm4gLyoqIEB0eXBlIHtSZWNvcmQ8a2V5b2YgTywgUj59ICovIChoYXJkZW4oZnJvbUVudHJpZXMobWFwRW50cykpKTtcbn07JGjNj19vbmNlLm9iamVjdE1hcChvYmplY3RNYXApO1xuaGFyZGVuKG9iamVjdE1hcCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJvYmplY3RNYXAiOlsib2JqZWN0TWFwIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKiaINo7CQAAOwkAACcAAABAZW5kby9jb21tb24tdjEuMi4xMy9vYmplY3QtbWV0YS1tYXAuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm9iamVjdE1ldGFNYXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7Y29uc3QgeyBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLCBjcmVhdGUsIGZyb21FbnRyaWVzIH0gPSBPYmplY3Q7XG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5cbi8qKlxuICogTGlrZSBgb2JqZWN0TWFwYCwgYnV0IGF0IHRoZSByZWZsZWN0aXZlIGxldmVsIG9mIHByb3BlcnR5IGRlc2NyaXB0b3JzXG4gKiByYXRoZXIgdGhhbiBwcm9wZXJ0eSB2YWx1ZXMuXG4gKlxuICogRXhjZXB0IGZvciBoYXJkZW5pbmcsIHRoZSBlZGdlIGNhc2UgYmVoYXZpb3IgaXMgbW9zdGx5IHRoZSBvcHBvc2l0ZSBvZlxuICogdGhlIGBvYmplY3RNYXBgIGVkZ2UgY2FzZXMuXG4gKiAgICAqIE5vIG1hdHRlciBob3cgbXV0YWJsZSB0aGUgb3JpZ2luYWwgb2JqZWN0LCB0aGUgcmV0dXJuZWQgb2JqZWN0IGlzXG4gKiAgICAgIGhhcmRlbmVkLlxuICogICAgKiBBbGwgb3duIHByb3BlcnRpZXMgb2YgdGhlIG9yaWdpbmFsIGFyZSBtYXBwZWQsIGV2ZW4gaWYgc3ltYm9sLW5hbWVkXG4gKiAgICAgIG9yIG5vbi1lbnVtZXJhYmxlLlxuICogICAgKiBJZiBhbnkgb2YgdGhlIG9yaWdpbmFsIHByb3BlcnRpZXMgd2VyZSBhY2Nlc3NvcnMsIHRoZSBkZXNjcmlwdG9yXG4gKiAgICAgIGNvbnRhaW5pbmcgdGhlIGdldHRlciBhbmQgc2V0dGVyIGFyZSBnaXZlbiB0byBgbWV0YU1hcEZuYC5cbiAqICAgICogVGhlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSByZXR1cm5lZCBhcmUgYWNjb3JkaW5nIHRvIHRoZSBkZXNjcmlwdG9yc1xuICogICAgICByZXR1cm5lZCBieSBgbWV0YU1hcEZuYC5cbiAqICAgICogVGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGFsd2F5cyBiZSBhIHBsYWluIG9iamVjdCB3aG9zZSBzdGF0ZSBpc1xuICogICAgICBvbmx5IHRoZXNlIG1hcHBlZCBvd24gcHJvcGVydGllcy4gSXQgd2lsbCBpbmhlcml0IGZyb20gdGhlIHRoaXJkXG4gKiAgICAgIGFyZ3VtZW50IGlmIHByb3ZpZGVkLCBkZWZhdWx0aW5nIHRvIGBPYmplY3QucHJvdG90eXBlYCBpZiBvbWl0dGVkLlxuICpcbiAqIEJlY2F1c2UgYSBwcm9wZXJ0eSBkZXNjcmlwdG9yIGlzIGRpc3RpbmN0IGZyb20gYHVuZGVmaW5lZGAsIHdlIGJ1bmRsZVxuICogbWFwcGluZyBhbmQgZmlsdGVyaW5nIHRvZ2V0aGVyLiBXaGVuIHRoZSBgbWV0YU1hcEZuYCByZXR1cm5zIGB1bmRlZmluZWRgLFxuICogdGhhdCBwcm9wZXJ0eSBpcyBvbWl0dGVkIGZyb20gdGhlIHJlc3VsdC5cbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxQcm9wZXJ0eUtleSwgYW55Pn0gT1xuICogQHBhcmFtIHtPfSBvcmlnaW5hbFxuICogQHBhcmFtIHsoXG4gKiAgIGRlc2M6IFR5cGVkUHJvcGVydHlEZXNjcmlwdG9yPE9ba2V5b2YgT10+LFxuICogICBrZXk6IGtleW9mIE9cbiAqICkgPT4gKFByb3BlcnR5RGVzY3JpcHRvciB8IHVuZGVmaW5lZCl9IG1ldGFNYXBGblxuICogQHBhcmFtIHthbnl9IFtwcm90b11cbiAqIEByZXR1cm5zIHthbnl9XG4gKi9cbiAgICAgICBjb25zdCBvYmplY3RNZXRhTWFwID0gKFxuICBvcmlnaW5hbCxcbiAgbWV0YU1hcEZuLFxuICBwcm90byA9IE9iamVjdC5wcm90b3R5cGUsXG4pID0+IHtcbiAgY29uc3QgZGVzY3MgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG9yaWdpbmFsKTtcbiAgY29uc3Qga2V5cyA9IG93bktleXMob3JpZ2luYWwpO1xuXG4gIGNvbnN0IGRlc2NFbnRyaWVzID0gLyoqIEB0eXBlIHtbUHJvcGVydHlLZXksUHJvcGVydHlEZXNjcmlwdG9yXVtdfSAqLyAoXG4gICAga2V5c1xuICAgICAgLm1hcChrZXkgPT4gW2tleSwgbWV0YU1hcEZuKGRlc2NzW2tleV0sIGtleSldKVxuICAgICAgLmZpbHRlcigoW19rZXksIG9wdERlc2NdKSA9PiBvcHREZXNjICE9PSB1bmRlZmluZWQpXG4gICk7XG4gIHJldHVybiBoYXJkZW4oY3JlYXRlKHByb3RvLCBmcm9tRW50cmllcyhkZXNjRW50cmllcykpKTtcbn07JGjNj19vbmNlLm9iamVjdE1ldGFNYXAob2JqZWN0TWV0YU1hcCk7XG5oYXJkZW4ob2JqZWN0TWV0YU1hcCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJvYmplY3RNZXRhTWFwIjpbIm9iamVjdE1ldGFNYXAiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA2LNBgpkFAACZBQAAJQAAAEBlbmRvL2NvbW1vbi12MS4yLjEzL3Rocm93LWxhYmVsZWQuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsidGhyb3dMYWJlbGVkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgWCxtYWtlRXJyb3IsYW5ub3RhdGVFcnJvcjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wibWFrZUVycm9yXCIsWyRozY9fYSA9PiAobWFrZUVycm9yID0gJGjNj19hKV1dLFtcImFubm90YXRlRXJyb3JcIixbJGjNj19hID0+IChhbm5vdGF0ZUVycm9yID0gJGjNj19hKV1dXV1dKTtcblxuLyoqXG4gKiBHaXZlbiBhbiBlcnJvciBgaW5uZXJFcnJgIGFuZCBhIGBsYWJlbGAsIHRocm93cyBhIHNpbWlsYXJcbiAqIGVycm9yIHdob3NlIG1lc3NhZ2Ugc3RyaW5nIGlzIGAke2xhYmVsfTogJHtpbm5lckVyci5tZXNzYWdlfWAuXG4gKiBTZWUgYGFwcGx5TGFiZWxpbmdFcnJvcmAgZm9yIHRoZSBtb3RpdmF0aW5nIHVzZS5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBpbm5lckVyclxuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBsYWJlbFxuICogQHBhcmFtIHtJTVBPUlQoJ3NlcycpLkdlbmVyaWNFcnJvckNvbnN0cnVjdG9yfSBbZXJyQ29uc3RydWN0b3JdXG4gKiBAcGFyYW0ge0lNUE9SVCgnc2VzJykuQXNzZXJ0TWFrZUVycm9yT3B0aW9uc30gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7bmV2ZXJ9XG4gKi9cbiAgICAgICBjb25zdCB0aHJvd0xhYmVsZWQgPSAoXG4gIGlubmVyRXJyLFxuICBsYWJlbCxcbiAgZXJyQ29uc3RydWN0b3IgPSB1bmRlZmluZWQsXG4gIG9wdGlvbnMgPSB1bmRlZmluZWQsXG4pID0+IHtcbiAgaWYgKHR5cGVvZiBsYWJlbCA9PT0gJ251bWJlcicpIHtcbiAgICBsYWJlbCA9IGBbJHtsYWJlbH1dYDtcbiAgfVxuICBjb25zdCBvdXRlckVyciA9IG1ha2VFcnJvcihcbiAgICBgJHtsYWJlbH06ICR7aW5uZXJFcnIubWVzc2FnZX1gLFxuICAgIGVyckNvbnN0cnVjdG9yLFxuICAgIG9wdGlvbnMsXG4gICk7XG4gIGFubm90YXRlRXJyb3Iob3V0ZXJFcnIsIFhgQ2F1c2VkIGJ5ICR7aW5uZXJFcnJ9YCk7XG4gIHRocm93IG91dGVyRXJyO1xufTskaM2PX29uY2UudGhyb3dMYWJlbGVkKHRocm93TGFiZWxlZCk7XG5oYXJkZW4odGhyb3dMYWJlbGVkKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InRocm93TGFiZWxlZCI6WyJ0aHJvd0xhYmVsZWQiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAANKKhqaIBAACiAQAAIgAAAEBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMTEvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvZW52LW9wdGlvbnMuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL3NyYy9lbnYtb3B0aW9ucy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL3NyYy9lbnYtb3B0aW9ucy5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC8ATOCOBYAADgWAAAsAAAAQGVuZG8vZW52LW9wdGlvbnMtdjEuMS4xMS9zcmMvZW52LW9wdGlvbnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMiLCJnZXRFbnZpcm9ubWVudE9wdGlvbiIsImdldEVudmlyb25tZW50T3B0aW9uc0xpc3QiLCJtYWtlRW52aXJvbm1lbnRDYXB0b3IiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogZ2xvYmFsIGdsb2JhbFRoaXMgKi9cbi8qIEB0cy1jaGVjayovXG5cbi8qIGBAZW5kby9lbnYtb3B0aW9uc2AgbmVlZHMgdG8gYmUgaW1wb3J0ZWQgcXVpdGUgZWFybHksIGFuZCBzbyBzaG91bGQqL1xuLyogYXZvaWQgaW1wb3J0aW5nIGZyb20gc2VzIG9yIGFueXRoaW5nIHRoYXQgZGVwZW5kcyBvbiBzZXMuKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuLyogUHJlbHVkZSBvZiBjaGVhcCBnb29kIC0gZW5vdWdoIGltaXRhdGlvbnMgb2YgdGhpbmdzIHdlJ2QgdXNlIG9yKi9cbi8qIGRvIGRpZmZlcmVudGx5IGlmIHdlIGNvdWxkIGRlcGVuZCBvbiBzZXMqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcmVzdHJpY3RlZC1nbG9iYWxzKi9cbmNvbnN0IGxvY2FsVGhpcyA9IGdsb2JhbFRoaXM7XG5cbmNvbnN0IHsgT2JqZWN0LCBSZWZsZWN0LCBBcnJheSwgU3RyaW5nLCBKU09OLCBFcnJvciB9ID0gbG9jYWxUaGlzO1xuY29uc3QgeyBmcmVlemUgfSA9IE9iamVjdDtcbmNvbnN0IHsgYXBwbHkgfSA9IFJlZmxlY3Q7XG5cbi8qIFNob3VsZCBiZSBlcXVpdmFsZW50IHRvIHRoZSBvbmUgaW4gc2VzJyBjb21tb25zLmpzIGV2ZW4gdGhvdWdoIGl0Ki9cbi8qIHVzZXMgdGhlIG90aGVyIHRlY2huaXF1ZS4qL1xuY29uc3QgdW5jdXJyeVRoaXMgPVxuICBmbiA9PlxuICAocmVjZWl2ZXIsIC4uLmFyZ3MpID0+XG4gICAgYXBwbHkoZm4sIHJlY2VpdmVyLCBhcmdzKTtcbmNvbnN0IGFycmF5UHVzaCA9IHVuY3VycnlUaGlzKEFycmF5LnByb3RvdHlwZS5wdXNoKTtcbmNvbnN0IGFycmF5SW5jbHVkZXMgPSB1bmN1cnJ5VGhpcyhBcnJheS5wcm90b3R5cGUuaW5jbHVkZXMpO1xuY29uc3Qgc3RyaW5nU3BsaXQgPSB1bmN1cnJ5VGhpcyhTdHJpbmcucHJvdG90eXBlLnNwbGl0KTtcblxuY29uc3QgcSA9IEpTT04uc3RyaW5naWZ5O1xuXG5jb25zdCBGYWlsID0gKGxpdGVyYWxzLCAuLi5hcmdzKSA9PiB7XG4gIGxldCBtc2cgPSBsaXRlcmFsc1swXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgbXNnID0gYCR7bXNnfSR7YXJnc1tpXX0ke2xpdGVyYWxzW2kgKyAxXX1gO1xuICB9XG4gIHRocm93IEVycm9yKG1zZyk7XG59O1xuXG4vKiBlbmQgcHJlbHVkZSovXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogYG1ha2VFbnZpcm9ubWVudENhcHRvcmAgcHJvdmlkZXMgYSBtZWNoYW5pc20gZm9yIGdldHRpbmcgZW52aXJvbm1lbnRcbiAqIHZhcmlhYmxlcywgaWYgdGhleSBhcmUgbmVlZGVkLCBhbmQgYSB3YXkgdG8gY2F0YWxvZyB0aGUgbmFtZXMgb2YgYWxsXG4gKiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRoYXQgd2VyZSBjYXB0dXJlZC5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gYUdsb2JhbFxuICogQHBhcmFtIHtib29sZWFufSBbZHJvcE5hbWVzXSBEZWZhdWx0cyB0byBmYWxzZS4gSWYgdHJ1ZSwgZG9uJ3QgdHJhY2tcbiAqIG5hbWVzIHVzZWQuXG4gKi9cbiAgICAgICBjb25zdCBtYWtlRW52aXJvbm1lbnRDYXB0b3IgPSAoYUdsb2JhbCwgZHJvcE5hbWVzID0gZmFsc2UpID0+IHtcbiAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgY29uc3QgY2FwdHVyZWRFbnZpcm9ubWVudE9wdGlvbk5hbWVzID0gW107XG5cbiAgLyoqXG4gKiBHZXRzIGFuIGVudmlyb25tZW50IG9wdGlvbiBieSBuYW1lIGFuZCByZXR1cm5zIHRoZSBvcHRpb24gdmFsdWUgb3IgdGhlXG4gKiBnaXZlbiBkZWZhdWx0LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25OYW1lXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVmYXVsdFNldHRpbmdcbiAqIEBwYXJhbSB7c3RyaW5nW119IFtvcHRPdGhlclZhbHVlc11cbiAqIElmIHByb3ZpZGVkLCB0aGUgb3B0aW9uIHZhbHVlIG11c3QgYmUgaW5jbHVkZWQgb3IgbWF0Y2ggYGRlZmF1bHRTZXR0aW5nYC5cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbiAgY29uc3QgZ2V0RW52aXJvbm1lbnRPcHRpb24gPSAoXG4gICAgb3B0aW9uTmFtZSxcbiAgICBkZWZhdWx0U2V0dGluZyxcbiAgICBvcHRPdGhlclZhbHVlcyA9IHVuZGVmaW5lZCxcbiAgKSA9PiB7XG4gICAgdHlwZW9mIG9wdGlvbk5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICBGYWlsYEVudmlyb25tZW50IG9wdGlvbiBuYW1lICR7cShvcHRpb25OYW1lKX0gbXVzdCBiZSBhIHN0cmluZy5gO1xuICAgIHR5cGVvZiBkZWZhdWx0U2V0dGluZyA9PT0gJ3N0cmluZycgfHxcbiAgICAgIEZhaWxgRW52aXJvbm1lbnQgb3B0aW9uIGRlZmF1bHQgc2V0dGluZyAke3EoXG4gICAgICAgIGRlZmF1bHRTZXR0aW5nLFxuICAgICAgKX0gbXVzdCBiZSBhIHN0cmluZy5gO1xuXG4gICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovXG4gICAgbGV0IHNldHRpbmcgPSBkZWZhdWx0U2V0dGluZztcbiAgICBjb25zdCBnbG9iYWxQcm9jZXNzID0gYUdsb2JhbC5wcm9jZXNzIHx8IHVuZGVmaW5lZDtcbiAgICBjb25zdCBnbG9iYWxFbnYgPVxuICAgICAgKHR5cGVvZiBnbG9iYWxQcm9jZXNzID09PSAnb2JqZWN0JyAmJiBnbG9iYWxQcm9jZXNzLmVudikgfHwgdW5kZWZpbmVkO1xuICAgIGlmICh0eXBlb2YgZ2xvYmFsRW52ID09PSAnb2JqZWN0Jykge1xuICAgICAgaWYgKG9wdGlvbk5hbWUgaW4gZ2xvYmFsRW52KSB7XG4gICAgICAgIGlmICghZHJvcE5hbWVzKSB7XG4gICAgICAgICAgYXJyYXlQdXNoKGNhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcywgb3B0aW9uTmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgb3B0aW9uVmFsdWUgPSBnbG9iYWxFbnZbb3B0aW9uTmFtZV07XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAZW5kby9uby1wb2x5bW9ycGhpYy1jYWxsKi9cbiAgICAgICAgdHlwZW9mIG9wdGlvblZhbHVlID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgIEZhaWxgRW52aXJvbm1lbnQgb3B0aW9uIG5hbWVkICR7cShcbiAgICAgICAgICAgIG9wdGlvbk5hbWUsXG4gICAgICAgICAgKX0sIGlmIHByZXNlbnQsIG11c3QgaGF2ZSBhIGNvcnJlc3BvbmRpbmcgc3RyaW5nIHZhbHVlLCBnb3QgJHtxKFxuICAgICAgICAgICAgb3B0aW9uVmFsdWUsXG4gICAgICAgICAgKX1gO1xuICAgICAgICBzZXR0aW5nID0gb3B0aW9uVmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIG9wdE90aGVyVmFsdWVzID09PSB1bmRlZmluZWQgfHxcbiAgICAgIHNldHRpbmcgPT09IGRlZmF1bHRTZXR0aW5nIHx8XG4gICAgICBhcnJheUluY2x1ZGVzKG9wdE90aGVyVmFsdWVzLCBzZXR0aW5nKSB8fFxuICAgICAgRmFpbGBVbnJlY29nbml6ZWQgJHtxKG9wdGlvbk5hbWUpfSB2YWx1ZSAke3EoXG4gICAgICAgIHNldHRpbmcsXG4gICAgICApfS4gRXhwZWN0ZWQgb25lIG9mICR7cShbZGVmYXVsdFNldHRpbmcsIC4uLm9wdE90aGVyVmFsdWVzXSl9YDtcbiAgICByZXR1cm4gc2V0dGluZztcbiAgfTtcbiAgZnJlZXplKGdldEVudmlyb25tZW50T3B0aW9uKTtcblxuICAvKipcbiAqIEB0ZW1wbGF0ZSB7c3RyaW5nfSBbVD1zdHJpbmddXG4gKiBAcGFyYW0ge3N0cmluZ30gb3B0aW9uTmFtZVxuICogQHJldHVybnMge1RbXX1cbiAqL1xuICBjb25zdCBnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0ID0gb3B0aW9uTmFtZSA9PiB7XG4gICAgY29uc3Qgb3B0aW9uID0gZ2V0RW52aXJvbm1lbnRPcHRpb24ob3B0aW9uTmFtZSwgJycpO1xuICAgIHJldHVybiBmcmVlemUob3B0aW9uID09PSAnJyA/IFtdIDogc3RyaW5nU3BsaXQob3B0aW9uLCAnLCcpKTtcbiAgfTtcbiAgZnJlZXplKGdldEVudmlyb25tZW50T3B0aW9uc0xpc3QpO1xuXG4gIC8qKlxuICogQHRlbXBsYXRlIHtzdHJpbmd9IFtUPXN0cmluZ11cbiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25OYW1lXG4gKiBAcGFyYW0ge1R9IGVsZW1lbnRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gIGNvbnN0IGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMgPSAob3B0aW9uTmFtZSwgZWxlbWVudCkgPT5cbiAgICBhcnJheUluY2x1ZGVzKGdldEVudmlyb25tZW50T3B0aW9uc0xpc3Qob3B0aW9uTmFtZSksIGVsZW1lbnQpO1xuXG4gIGNvbnN0IGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyA9ICgpID0+IHtcbiAgICByZXR1cm4gZnJlZXplKFsuLi5jYXB0dXJlZEVudmlyb25tZW50T3B0aW9uTmFtZXNdKTtcbiAgfTtcbiAgZnJlZXplKGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyk7XG5cbiAgcmV0dXJuIGZyZWV6ZSh7XG4gICAgZ2V0RW52aXJvbm1lbnRPcHRpb24sXG4gICAgZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCxcbiAgICBlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzLFxuICAgIGdldENhcHR1cmVkRW52aXJvbm1lbnRPcHRpb25OYW1lcyxcbiAgfSk7XG59OyRozY9fb25jZS5tYWtlRW52aXJvbm1lbnRDYXB0b3IobWFrZUVudmlyb25tZW50Q2FwdG9yKTtcbmZyZWV6ZShtYWtlRW52aXJvbm1lbnRDYXB0b3IpO1xuXG4vKipcbiAqIEZvciB0aGUgc2ltcGxlIGNhc2UsIHdoZXJlIHRoZSBnbG9iYWwgaW4gcXVlc3Rpb24gaXMgYGdsb2JhbFRoaXNgIGFuZCBub1xuICogcmVwb3J0aW5nIG9mIG9wdGlvbiBuYW1lcyBpcyBkZXNpcmVkLlxuICovXG4gICAgICAgY29uc3Qge1xuICBnZXRFbnZpcm9ubWVudE9wdGlvbixcbiAgZ2V0RW52aXJvbm1lbnRPcHRpb25zTGlzdCxcbiAgZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyxcbn0gPSBtYWtlRW52aXJvbm1lbnRDYXB0b3IobG9jYWxUaGlzLCB0cnVlKTskaM2PX29uY2UuZ2V0RW52aXJvbm1lbnRPcHRpb24oZ2V0RW52aXJvbm1lbnRPcHRpb24pOyRozY9fb25jZS5nZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0KGdldEVudmlyb25tZW50T3B0aW9uc0xpc3QpOyRozY9fb25jZS5lbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzKGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZUVudmlyb25tZW50Q2FwdG9yIjpbIm1ha2VFbnZpcm9ubWVudENhcHRvciJdLCJnZXRFbnZpcm9ubWVudE9wdGlvbiI6WyJnZXRFbnZpcm9ubWVudE9wdGlvbiJdLCJnZXRFbnZpcm9ubWVudE9wdGlvbnNMaXN0IjpbImdldEVudmlyb25tZW50T3B0aW9uc0xpc3QiXSwiZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcyI6WyJlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGpmduJkDQAAZA0AAB0AAABAZW5kby9lcnJvcnMtdjEuMi4xMy9pbmRleC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiRmFpbCIsIlgiLCJhbm5vdGF0ZUVycm9yIiwiYXNzZXJ0IiwiYiIsImJhcmUiLCJtYWtlRXJyb3IiLCJub3RlIiwicSIsInF1b3RlIiwicmVkYWN0ZWQiLCJ0aHJvd1JlZGFjdGVkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qIGdsb2JhbCBnbG9iYWxUaGlzICovXG4vKiBUaGlzIG1vZHVsZSBhc3N1bWVzIHRoZSBleGlzdGVuY2Ugb2YgYSBub24tc3RhbmRhcmQgYGFzc2VydGAgaG9zdCBvYmplY3QuKi9cbi8qIFNFUyB2ZXJzaW9uIDAuMTEuMCBpbnRyb2R1Y2VzIHRoaXMgZ2xvYmFsIG9iamVjdCBhbmQgZW50YW5nbGVzIGl0Ki9cbi8qIHdpdGggdGhlIGBjb25zb2xlYCBob3N0IG9iamVjdCBpbiBzY29wZSB3aGVuIGl0IGluaXRpYWxpemVzLCovXG4vKiBhbGxvd2luZyBlcnJvcnMsIHBhcnRpY3VsYXJseSBhc3NlcnRpb24gZXJyb3JzLCB0byBoaWRlIHRoZWlyIFwiZGV0YWlsc1wiKi9cbi8qIGZyb20gY2FsbGVycyB0aGF0IG1pZ2h0IGNhdGNoIHRob3NlIGVycm9ycywgdGhlbiByZXZlYWwgdGhlbSB0byB0aGUqL1xuLyogdW5kZXJseWluZyBjb25zb2xlLiovXG4vKiBUbyB0aGUgZXh0ZW50IHRoYXQgdGhpcyBgY29uc29sZWAgaXMgY29uc2lkZXJlZCBhIHJlc291cmNlLCovXG4vKiB0aGlzIG1vZHVsZSBtdXN0IGJlIGNvbnNpZGVyZWQgYSByZXNvdXJjZSBtb2R1bGUuKi9cblxuLyogVGhlIGFzc2VydGlvbnMgcmUtZXhwb3J0ZWQgaGVyZSBhcmUgZGVmaW5lZCBpbiovXG4vKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vYmxvYi9IRUFEL3BhY2thZ2VzL3Nlcy9zcmMvZXJyb3IvYXNzZXJ0LmpzKi9cblxuY29uc3QgZ2xvYmFsQXNzZXJ0ID0gZ2xvYmFsVGhpcy5hc3NlcnQ7XG5cbmlmIChnbG9iYWxBc3NlcnQgPT09IHVuZGVmaW5lZCkge1xuICB0aHJvdyBFcnJvcihcbiAgICBgQ2Fubm90IGluaXRpYWxpemUgQGVuZG8vZXJyb3JzLCBtaXNzaW5nIGdsb2JhbFRoaXMuYXNzZXJ0LCBpbXBvcnQgJ3NlcycgYmVmb3JlICdAZW5kby9lcnJvcnMnYCxcbiAgKTtcbn1cblxuY29uc3QgbWlzc2luZyA9IC8qKiBAdHlwZSB7Y29uc3R9ICovIChbXG4gICd0eXBlb2YnLFxuICAnZXJyb3InLFxuICAnZmFpbCcsXG4gICdlcXVhbCcsXG4gICdzdHJpbmcnLFxuICAnbm90ZScsXG4gICdkZXRhaWxzJyxcbiAgJ0ZhaWwnLFxuICAncXVvdGUnLFxuICAvKiBBcyBvZiAyMDI0LTAyLCB0aGUgQWdvcmljIGNoYWluJ3MgYm9vdHN0cmFwIHZhdCBydW5zIHdpdGggYSB2ZXJzaW9uIG9mIFNFUyB0aGF0Ki9cbiAgLyogcHJlZGF0ZXMgYWRkaXRpb24gb2YgdGhlICdiYXJlJyBtZXRob2QsIHNvIHdlIG11c3QgdG9sZXJhdGUgaXRzIGFic2VuY2UgYW5kIGZhbGwqL1xuICAvKiBiYWNrIHRvIHF1b3RlIGJlaGF2aW9yIGluIHRoYXQgZW52aXJvbm1lbnQgKHNlZSBiZWxvdykuKi9cbiAgLyogJ2JhcmUnLCovXG4gICdtYWtlQXNzZXJ0Jyxcbl0pLmZpbHRlcihuYW1lID0+IGdsb2JhbEFzc2VydFtuYW1lXSA9PT0gdW5kZWZpbmVkKTtcbmlmIChtaXNzaW5nLmxlbmd0aCA+IDApIHtcbiAgdGhyb3cgRXJyb3IoXG4gICAgYENhbm5vdCBpbml0aWFsaXplIEBlbmRvL2Vycm9ycywgbWlzc2luZyBnbG9iYWxUaGlzLmFzc2VydCBtZXRob2RzICR7bWlzc2luZy5qb2luKFxuICAgICAgJywgJyxcbiAgICApfWAsXG4gICk7XG59XG5cbi8qIFRoZSBnbG9iYWwgYXNzZXJ0IG1peGVkIGFzc2VydGlvbnMgYW5kIHV0aWxpdHkgZnVuY3Rpb25zLiovXG4vKiBUaGlzIG1vZHVsZSBzcGxpdHMgdGhlbSBhcGFydCovXG4vKiBhbmQgYWxzbyB1cGRhdGVzIHRoZSBuYW1lcyBvZiB0aGUgdXRpbGl0eSBmdW5jdGlvbnMuKi9cbmNvbnN0IHtcbiAgYmFyZSxcbiAgZGV0YWlsczogcmVkYWN0ZWQsXG4gIGVycm9yOiBtYWtlRXJyb3IsXG4gIEZhaWw6IHRocm93UmVkYWN0ZWQsXG4gIG1ha2VBc3NlcnQ6IF9vbWl0dGVkTWFrZUFzc2VydCxcbiAgbm90ZSxcbiAgcXVvdGUsXG4gIC4uLmFzc2VydGlvbnNcbn0gPSBnbG9iYWxBc3NlcnQ7XG4vKiogQHR5cGUge0lNUE9SVChcInNlc1wiKS5Bc3NlcnRpb25GdW5jdGlvbnMgfSAqL1xuLyogQHRzLWV4cGVjdC1lcnJvciBtaXNzaW5nIHByb3BlcnRpZXMgYXNzaWduZWQgbmV4dCovJGjNj19vbmNlLnJlZGFjdGVkKHJlZGFjdGVkKTskaM2PX29uY2UubWFrZUVycm9yKG1ha2VFcnJvcik7JGjNj19vbmNlLnRocm93UmVkYWN0ZWQodGhyb3dSZWRhY3RlZCk7JGjNj19vbmNlLm5vdGUobm90ZSk7JGjNj19vbmNlLnF1b3RlKHF1b3RlKTtcbmNvbnN0IGFzc2VydCA9ICh2YWx1ZSwgb3B0RGV0YWlscywgZXJyQ29udHJ1Y3Rvciwgb3B0aW9ucykgPT5cbiAgZ2xvYmFsQXNzZXJ0KHZhbHVlLCBvcHREZXRhaWxzLCBlcnJDb250cnVjdG9yLCBvcHRpb25zKTskaM2PX29uY2UuYXNzZXJ0KGFzc2VydCk7XG5PYmplY3QuYXNzaWduKGFzc2VydCwgYXNzZXJ0aW9ucyk7XG5cbi8qIEFzIG9mIDIwMjQtMDIsIHRoZSBBZ29yaWMgY2hhaW4ncyBib290c3RyYXAgdmF0IHJ1bnMgd2l0aCBhIHZlcnNpb24gb2YgU0VTKi9cbi8qIHRoYXQgcHJlZGF0ZXMgdGhlIGFkZGl0aW9uIG9mIHRoZSAnYmFyZScgbWV0aG9kLCBzbyB3ZSBtdXN0IGZhbGwgYmFjayB0byovXG4vKiBxdW90ZSBiZWhhdmlvciBmb3IgdGhhdCBlbnZpcm9ubWVudC4qL1xuY29uc3QgYmFyZU9yUXVvdGUgPSBiYXJlIHx8IHF1b3RlO1xuXG4vKiBYWFggbW9kdWxlIGV4cG9ydHMgZmFpbCBpZiB0aGVzZSBhcmVuJ3QgaW4gc2NvcGUqL1xuLyoqIEBpbXBvcnQge0Fzc2VydE1ha2VFcnJvck9wdGlvbnMsIERldGFpbHMsIEdlbmVyaWNFcnJvckNvbnN0cnVjdG9yfSBmcm9tICdzZXMnICovJGjNj19vbmNlLmJhcmVPclF1b3RlKGJhcmVPclF1b3RlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InJlZGFjdGVkIjpbInJlZGFjdGVkIl0sIlgiOlsicmVkYWN0ZWQiXSwibWFrZUVycm9yIjpbIm1ha2VFcnJvciJdLCJ0aHJvd1JlZGFjdGVkIjpbInRocm93UmVkYWN0ZWQiXSwiRmFpbCI6WyJ0aHJvd1JlZGFjdGVkIl0sIm5vdGUiOlsibm90ZSJdLCJhbm5vdGF0ZUVycm9yIjpbIm5vdGUiXSwicXVvdGUiOlsicXVvdGUiXSwicSI6WyJxdW90ZSJdLCJhc3NlcnQiOlsiYXNzZXJ0Il0sImJhcmUiOlsiYmFyZU9yUXVvdGUiXSwiYiI6WyJiYXJlT3JRdW90ZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADT6UYIEEcAABBHAAAjAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQvc3JjL0UuanN7ImltcG9ydHMiOlsiLi90cmFjay10dXJucy5qcyIsIi4vbWVzc2FnZS1icmVha3BvaW50cy5qcyJdLCJleHBvcnRzIjpbImRlZmF1bHQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCB0cmFja1R1cm5zLG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlcjskaM2PX2ltcG9ydHMoW1tcIi4vdHJhY2stdHVybnMuanNcIiwgW1tcInRyYWNrVHVybnNcIixbJGjNj19hID0+ICh0cmFja1R1cm5zID0gJGjNj19hKV1dXV0sW1wiLi9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzXCIsIFtbXCJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXJcIixbJGjNj19hID0+IChtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIgPSAkaM2PX2EpXV1dXV0pO1xuXG5cbmNvbnN0IHsgZGV0YWlsczogWCwgcXVvdGU6IHEsIEZhaWwsIGVycm9yOiBtYWtlRXJyb3IgfSA9IGFzc2VydDtcbmNvbnN0IHsgYXNzaWduLCBmcmVlemUgfSA9IE9iamVjdDtcblxuLyoqXG4gKiBAaW1wb3J0IHsgSGFuZGxlZFByb21pc2VDb25zdHJ1Y3RvciwgUmVtb3RhYmxlQnJhbmQsIENhbGxhYmxlLCBTZXR0bGVyIH0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKi9cblxuY29uc3Qgb25TZW5kID0gbWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyKCdFTkRPX1NFTkRfQlJFQUtQT0lOVFMnKTtcblxuLyoqIEB0eXBlIHtQcm94eUhhbmRsZXI8YW55Pn0gKi9cbmNvbnN0IGJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIgPSB7XG4gIHNldChfdGFyZ2V0LCBfcHJvcCwgX3ZhbHVlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBpc0V4dGVuc2libGUoX3RhcmdldCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbiAgc2V0UHJvdG90eXBlT2YoX3RhcmdldCwgX3ZhbHVlKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9LFxuICBkZWxldGVQcm9wZXJ0eShfdGFyZ2V0LCBfcHJvcCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSxcbn07XG5cbi8qIEUgUHJveHkgaGFuZGxlcnMgcHJldGVuZCB0aGF0IGFueSBwcm9wZXJ0eSBleGlzdHMgb24gdGhlIHRhcmdldCBhbmQgcmV0dXJucyovXG4vKiBhIGZ1bmN0aW9uIGZvciB0aGVpciB2YWx1ZS4gV2hpbGUgdGhpcyBmdW5jdGlvbiBpcyBcImJvdW5kXCIgYnkgY29udGV4dCwgaXQgaXMqL1xuLyogbWVhbnQgdG8gYmUgY2FsbGVkIGFzIGEgbWV0aG9kLiBGb3IgdGhhdCByZWFzb24sIHRoZSByZXR1cm5lZCBmdW5jdGlvbiovXG4vKiBpbmNsdWRlcyBhIGNoZWNrIHRoYXQgdGhlIGB0aGlzYCBhcmd1bWVudCBjb3JyZXNwb25kcyB0byB0aGUgaW5pdGlhbCovXG4vKiByZWNlaXZlciB3aGVuIHRoZSBmdW5jdGlvbiB3YXMgcmV0cmlldmVkLiovXG4vKiBFIFByb3h5IGhhbmRsZXJzIGFsc28gZm9yd2FyZCBkaXJlY3QgY2FsbHMgdG8gdGhlIHRhcmdldCBpbiBjYXNlIHRoZSByZW1vdGUqL1xuLyogaXMgYSBmdW5jdGlvbiBpbnN0ZWFkIG9mIGFuIG9iamVjdC4gTm8gc3VjaCByZWNlaXZlciBjaGVja3MgYXJlIG5lY2Vzc2FyeSBpbiovXG4vKiB0aGF0IGNhc2UuKi9cblxuLyoqXG4gKiBBIFByb3h5IGhhbmRsZXIgZm9yIEUoeCkuXG4gKlxuICogQHBhcmFtIHthbnl9IHJlY2lwaWVudCBBbnkgdmFsdWUgcGFzc2VkIHRvIEUoeClcbiAqIEBwYXJhbSB7SGFuZGxlZFByb21pc2VDb25zdHJ1Y3Rvcn0gSGFuZGxlZFByb21pc2VcbiAqIEByZXR1cm5zIHtQcm94eUhhbmRsZXI8dW5rbm93bj59IHRoZSBQcm94eSBoYW5kbGVyXG4gKi9cbmNvbnN0IG1ha2VFUHJveHlIYW5kbGVyID0gKHJlY2lwaWVudCwgSGFuZGxlZFByb21pc2UpID0+XG4gIGhhcmRlbih7XG4gICAgLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbiAgICBnZXQ6IChfdGFyZ2V0LCBwcm9wZXJ0eUtleSwgcmVjZWl2ZXIpID0+IHtcbiAgICAgIHJldHVybiBoYXJkZW4oXG4gICAgICAgIHtcbiAgICAgICAgICAvKiBUaGlzIGZ1bmN0aW9uIHB1cnBvc2VseSBjaGVja3MgdGhlIGB0aGlzYCB2YWx1ZSAoc2VlIGFib3ZlKSovXG4gICAgICAgICAgLyogSW4gb3JkZXIgdG8gYmUgYHRoaXNgIHNlbnNpdGl2ZSBpdCBpcyBkZWZpbmVkIHVzaW5nIGNvbmNpc2UgbWV0aG9kKi9cbiAgICAgICAgICAvKiBzeW50YXggcmF0aGVyIHRoYW4gYXMgYW4gYXJyb3cgZnVuY3Rpb24uIFRvIGVuc3VyZSB0aGUgZnVuY3Rpb24qL1xuICAgICAgICAgIC8qIGlzIG5vdCBjb25zdHJ1Y3RhYmxlLCBpdCBhbHNvIGF2b2lkcyB0aGUgYGZ1bmN0aW9uYCBzeW50YXguKi9cbiAgICAgICAgICAvKiogQHR5cGUgeyguLi5hcmdzOiBhbnlbXSkgPT4gUHJvbWlzZTx1bmtub3duPn0gKi9cbiAgICAgICAgICBbcHJvcGVydHlLZXldKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGlmICh0aGlzICE9PSByZWNlaXZlcikge1xuICAgICAgICAgICAgICAvKiBSZWplY3QgdGhlIGFzeW5jIGZ1bmN0aW9uIGNhbGwqL1xuICAgICAgICAgICAgICByZXR1cm4gSGFuZGxlZFByb21pc2UucmVqZWN0KFxuICAgICAgICAgICAgICAgIG1ha2VFcnJvcihcbiAgICAgICAgICAgICAgICAgIFhgVW5leHBlY3RlZCByZWNlaXZlciBmb3IgXCIke3EocHJvcGVydHlLZXkpfVwiIG1ldGhvZCBvZiBFKCR7cShcbiAgICAgICAgICAgICAgICAgICAgcmVjaXBpZW50LFxuICAgICAgICAgICAgICAgICAgKX0pYCxcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAob25TZW5kICYmIG9uU2VuZC5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCwgcHJvcGVydHlLZXkpKSB7XG4gICAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kZWJ1Z2dlciovXG4gICAgICAgICAgICAgIGRlYnVnZ2VyOyAvKiBMT09LIFVQIFRIRSBTVEFDSyovXG4gICAgICAgICAgICAgIC8qIFN0b3BwZWQgYXQgYSBicmVha3BvaW50IG9uIGV2ZW50dWFsLXNlbmQgb2YgYSBtZXRob2QtY2FsbCovXG4gICAgICAgICAgICAgIC8qIG1lc3NhZ2UsKi9cbiAgICAgICAgICAgICAgLyogc28gdGhhdCB5b3UgY2FuIHdhbGsgYmFjayBvbiB0aGUgc3RhY2sgdG8gc2VlIGhvdyB3ZSBjYW1lIHRvKi9cbiAgICAgICAgICAgICAgLyogbWFrZSB0aGlzIGV2ZW50dWFsLXNlbmQqL1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIEhhbmRsZWRQcm9taXNlLmFwcGx5TWV0aG9kKHJlY2lwaWVudCwgcHJvcGVydHlLZXksIGFyZ3MpO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNTAzMTkqL1xuICAgICAgICB9W3Byb3BlcnR5S2V5XSxcbiAgICAgICk7XG4gICAgfSxcbiAgICBhcHBseTogKF90YXJnZXQsIF90aGlzQXJnLCBhcmdBcnJheSA9IFtdKSA9PiB7XG4gICAgICBpZiAob25TZW5kICYmIG9uU2VuZC5zaG91bGRCcmVha3BvaW50KHJlY2lwaWVudCwgdW5kZWZpbmVkKSkge1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZGVidWdnZXIqL1xuICAgICAgICBkZWJ1Z2dlcjsgLyogTE9PSyBVUCBUSEUgU1RBQ0sqL1xuICAgICAgICAvKiBTdG9wcGVkIGF0IGEgYnJlYWtwb2ludCBvbiBldmVudHVhbC1zZW5kIG9mIGEgZnVuY3Rpb24tY2FsbCBtZXNzYWdlLCovXG4gICAgICAgIC8qIHNvIHRoYXQgeW91IGNhbiB3YWxrIGJhY2sgb24gdGhlIHN0YWNrIHRvIHNlZSBob3cgd2UgY2FtZSB0byovXG4gICAgICAgIC8qIG1ha2UgdGhpcyBldmVudHVhbC1zZW5kKi9cbiAgICAgIH1cbiAgICAgIHJldHVybiBIYW5kbGVkUHJvbWlzZS5hcHBseUZ1bmN0aW9uKHJlY2lwaWVudCwgYXJnQXJyYXkpO1xuICAgIH0sXG4gICAgaGFzOiAoX3RhcmdldCwgX3ApID0+IHtcbiAgICAgIC8qIFdlIGp1c3QgcHJldGVuZCBldmVyeXRoaW5nIGV4aXN0cy4qL1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgfSk7XG5cbi8qKlxuICogQSBQcm94eSBoYW5kbGVyIGZvciBFLnNlbmRPbmx5KHgpXG4gKiBJdCBpcyBhIHZhcmlhbnQgb24gdGhlIEUoeCkgUHJveHkgaGFuZGxlci5cbiAqXG4gKiBAcGFyYW0ge2FueX0gcmVjaXBpZW50IEFueSB2YWx1ZSBwYXNzZWQgdG8gRS5zZW5kT25seSh4KVxuICogQHBhcmFtIHtIYW5kbGVkUHJvbWlzZUNvbnN0cnVjdG9yfSBIYW5kbGVkUHJvbWlzZVxuICogQHJldHVybnMge1Byb3h5SGFuZGxlcjx1bmtub3duPn0gdGhlIFByb3h5IGhhbmRsZXJcbiAqL1xuY29uc3QgbWFrZUVTZW5kT25seVByb3h5SGFuZGxlciA9IChyZWNpcGllbnQsIEhhbmRsZWRQcm9taXNlKSA9PlxuICBoYXJkZW4oe1xuICAgIC4uLmJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIsXG4gICAgZ2V0OiAoX3RhcmdldCwgcHJvcGVydHlLZXksIHJlY2VpdmVyKSA9PiB7XG4gICAgICByZXR1cm4gaGFyZGVuKFxuICAgICAgICB7XG4gICAgICAgICAgLyogVGhpcyBmdW5jdGlvbiBwdXJwb3NlbHkgY2hlY2tzIHRoZSBgdGhpc2AgdmFsdWUgKHNlZSBhYm92ZSkqL1xuICAgICAgICAgIC8qIEluIG9yZGVyIHRvIGJlIGB0aGlzYCBzZW5zaXRpdmUgaXQgaXMgZGVmaW5lZCB1c2luZyBjb25jaXNlIG1ldGhvZCovXG4gICAgICAgICAgLyogc3ludGF4IHJhdGhlciB0aGFuIGFzIGFuIGFycm93IGZ1bmN0aW9uLiBUbyBlbnN1cmUgdGhlIGZ1bmN0aW9uKi9cbiAgICAgICAgICAvKiBpcyBub3QgY29uc3RydWN0YWJsZSwgaXQgYWxzbyBhdm9pZHMgdGhlIGBmdW5jdGlvbmAgc3ludGF4LiovXG4gICAgICAgICAgLyoqIEB0eXBlIHsoLi4uYXJnczogYW55W10pID0+IHVuZGVmaW5lZH0gKi9cbiAgICAgICAgICBbcHJvcGVydHlLZXldKC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIC8qIFRocm93IHNpbmNlIHRoZSBmdW5jdGlvbiByZXR1cm5zIG5vdGhpbmcqL1xuICAgICAgICAgICAgdGhpcyA9PT0gcmVjZWl2ZXIgfHxcbiAgICAgICAgICAgICAgRmFpbGBVbmV4cGVjdGVkIHJlY2VpdmVyIGZvciBcIiR7cShcbiAgICAgICAgICAgICAgICBwcm9wZXJ0eUtleSxcbiAgICAgICAgICAgICAgKX1cIiBtZXRob2Qgb2YgRS5zZW5kT25seSgke3EocmVjaXBpZW50KX0pYDtcbiAgICAgICAgICAgIGlmIChvblNlbmQgJiYgb25TZW5kLnNob3VsZEJyZWFrcG9pbnQocmVjaXBpZW50LCBwcm9wZXJ0eUtleSkpIHtcbiAgICAgICAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWRlYnVnZ2VyKi9cbiAgICAgICAgICAgICAgZGVidWdnZXI7IC8qIExPT0sgVVAgVEhFIFNUQUNLKi9cbiAgICAgICAgICAgICAgLyogU3RvcHBlZCBhdCBhIGJyZWFrcG9pbnQgb24gZXZlbnR1YWwtc2VuZCBvZiBhIG1ldGhvZC1jYWxsKi9cbiAgICAgICAgICAgICAgLyogbWVzc2FnZSwqL1xuICAgICAgICAgICAgICAvKiBzbyB0aGF0IHlvdSBjYW4gd2FsayBiYWNrIG9uIHRoZSBzdGFjayB0byBzZWUgaG93IHdlIGNhbWUgdG8qL1xuICAgICAgICAgICAgICAvKiBtYWtlIHRoaXMgZXZlbnR1YWwtc2VuZCovXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBIYW5kbGVkUHJvbWlzZS5hcHBseU1ldGhvZFNlbmRPbmx5KHJlY2lwaWVudCwgcHJvcGVydHlLZXksIGFyZ3MpO1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzUwMzE5Ki9cbiAgICAgICAgfVtwcm9wZXJ0eUtleV0sXG4gICAgICApO1xuICAgIH0sXG4gICAgYXBwbHk6IChfdGFyZ2V0LCBfdGhpc0FyZywgYXJnc0FycmF5ID0gW10pID0+IHtcbiAgICAgIGlmIChvblNlbmQgJiYgb25TZW5kLnNob3VsZEJyZWFrcG9pbnQocmVjaXBpZW50LCB1bmRlZmluZWQpKSB7XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1kZWJ1Z2dlciovXG4gICAgICAgIGRlYnVnZ2VyOyAvKiBMT09LIFVQIFRIRSBTVEFDSyovXG4gICAgICAgIC8qIFN0b3BwZWQgYXQgYSBicmVha3BvaW50IG9uIGV2ZW50dWFsLXNlbmQgb2YgYSBmdW5jdGlvbi1jYWxsIG1lc3NhZ2UsKi9cbiAgICAgICAgLyogc28gdGhhdCB5b3UgY2FuIHdhbGsgYmFjayBvbiB0aGUgc3RhY2sgdG8gc2VlIGhvdyB3ZSBjYW1lIHRvKi9cbiAgICAgICAgLyogbWFrZSB0aGlzIGV2ZW50dWFsLXNlbmQqL1xuICAgICAgfVxuICAgICAgSGFuZGxlZFByb21pc2UuYXBwbHlGdW5jdGlvblNlbmRPbmx5KHJlY2lwaWVudCwgYXJnc0FycmF5KTtcbiAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfSxcbiAgICBoYXM6IChfdGFyZ2V0LCBfcCkgPT4ge1xuICAgICAgLyogV2UganVzdCBwcmV0ZW5kIHRoYXQgZXZlcnl0aGluZyBleGlzdHMuKi9cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gIH0pO1xuXG4vKipcbiAqIEEgUHJveHkgaGFuZGxlciBmb3IgRS5nZXQoeClcbiAqIEl0IGlzIGEgdmFyaWFudCBvbiB0aGUgRSh4KSBQcm94eSBoYW5kbGVyLlxuICpcbiAqIEBwYXJhbSB7YW55fSB4IEFueSB2YWx1ZSBwYXNzZWQgdG8gRS5nZXQoeClcbiAqIEBwYXJhbSB7SGFuZGxlZFByb21pc2VDb25zdHJ1Y3Rvcn0gSGFuZGxlZFByb21pc2VcbiAqIEByZXR1cm5zIHtQcm94eUhhbmRsZXI8dW5rbm93bj59IHRoZSBQcm94eSBoYW5kbGVyXG4gKi9cbmNvbnN0IG1ha2VFR2V0UHJveHlIYW5kbGVyID0gKHgsIEhhbmRsZWRQcm9taXNlKSA9PlxuICBoYXJkZW4oe1xuICAgIC4uLmJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIsXG4gICAgaGFzOiAoX3RhcmdldCwgX3Byb3ApID0+IHRydWUsXG4gICAgZ2V0OiAoX3RhcmdldCwgcHJvcCkgPT4gSGFuZGxlZFByb21pc2UuZ2V0KHgsIHByb3ApLFxuICB9KTtcblxuLyoqXG4gKiBgZnJlZXplYCBidXQgbm90IGBoYXJkZW5gIHRoZSBwcm94eSB0YXJnZXQgc28gaXQgcmVtYWlucyB0cmFwcGluZy5cbiAqIFRodXMsIGl0IHNob3VsZCBub3QgYmUgc2hhcmVkIG91dHNpZGUgdGhpcyBtb2R1bGUuXG4gKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vYmxvYi9tYXN0ZXIvcGFja2FnZXMvc2VzL2RvY3MvcHJlcGFyaW5nLWZvci1zdGFiaWxpemUubWRcbiAqL1xuY29uc3QgZnVuY1RhcmdldCA9IGZyZWV6ZSgoKSA9PiB7fSk7XG5cbi8qKlxuLyoqXG4gKiBgZnJlZXplYCBidXQgbm90IGBoYXJkZW5gIHRoZSBwcm94eSB0YXJnZXQgc28gaXQgcmVtYWlucyB0cmFwcGluZy5cbiAqIFRodXMsIGl0IHNob3VsZCBub3QgYmUgc2hhcmVkIG91dHNpZGUgdGhpcyBtb2R1bGUuXG4gKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vYmxvYi9tYXN0ZXIvcGFja2FnZXMvc2VzL2RvY3MvcHJlcGFyaW5nLWZvci1zdGFiaWxpemUubWRcbiAqL1xuY29uc3Qgb2JqVGFyZ2V0ID0gZnJlZXplKHsgX19wcm90b19fOiBudWxsIH0pO1xuXG4vKipcbiAqIEBwYXJhbSB7SGFuZGxlZFByb21pc2VDb25zdHJ1Y3Rvcn0gSGFuZGxlZFByb21pc2VcbiAqL1xuY29uc3QgbWFrZUUgPSBIYW5kbGVkUHJvbWlzZSA9PiB7XG4gIHJldHVybiBoYXJkZW4oXG4gICAgYXNzaWduKFxuICAgICAgLyoqXG4gKiBFKHgpIHJldHVybnMgYSBwcm94eSBvbiB3aGljaCB5b3UgY2FuIGNhbGwgYXJiaXRyYXJ5IG1ldGhvZHMuIEVhY2ggb2YgdGhlc2VcbiAqIG1ldGhvZCBjYWxscyByZXR1cm5zIGEgcHJvbWlzZS4gVGhlIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgb24gd2hhdGV2ZXJcbiAqICd4JyBkZXNpZ25hdGVzIChvciByZXNvbHZlcyB0bykgaW4gYSBmdXR1cmUgdHVybiwgbm90IHRoaXMgb25lLlxuICpcbiAqIEFuIGV4YW1wbGUgY2FsbCB3b3VsZCBiZVxuICpcbiAqIEUoem9lKS5pbnN0YWxsKGJ1bmRsZSlcbiAqICAgLnRoZW4oaW5zdGFsbGF0aW9uSGFuZGxlID0+IHsgLi4uIH0pXG4gKiAgIC5jYXRjaChlcnIgPT4geyAuLi4gfSk7XG4gKlxuICogIFNlZSBodHRwczovL2VuZG9qcy5naXRodWIuaW8vZW5kby9mdW5jdGlvbnMvX2VuZG9fZmFyLkUuaHRtbCBmb3IgZGV0YWlscy5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSB4IHRhcmdldCBmb3IgbWV0aG9kL2Z1bmN0aW9uIGNhbGxcbiAqIEByZXR1cm5zIHtFQ2FsbGFibGVPck1ldGhvZHM8UmVtb3RlRnVuY3Rpb25zPFQ+Pn0gbWV0aG9kL2Z1bmN0aW9uIGNhbGwgcHJveHlcbiAqL1xuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBYWFggdHlwZWRlZiovXG4gICAgICB4ID0+IG5ldyBQcm94eShmdW5jVGFyZ2V0LCBtYWtlRVByb3h5SGFuZGxlcih4LCBIYW5kbGVkUHJvbWlzZSkpLFxuICAgICAge1xuICAgICAgICAvKipcbiAqIEUuZ2V0KHgpIHJldHVybnMgYSBwcm94eSBvbiB3aGljaCB5b3UgY2FuIGdldCBhcmJpdHJhcnkgcHJvcGVydGllcy5cbiAqIEVhY2ggb2YgdGhlc2UgcHJvcGVydGllcyByZXR1cm5zIGEgcHJvbWlzZSBmb3IgdGhlIHByb3BlcnR5LiAgVGhlIHByb21pc2VcbiAqIHZhbHVlIHdpbGwgYmUgdGhlIHByb3BlcnR5IGZldGNoZWQgZnJvbSB3aGF0ZXZlciAneCcgZGVzaWduYXRlcyAob3JcbiAqIHJlc29sdmVzIHRvKSBpbiBhIGZ1dHVyZSB0dXJuLCBub3QgdGhpcyBvbmUuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VH0geCB0YXJnZXQgZm9yIHByb3BlcnR5IGdldFxuICogQHJldHVybnMge0VHZXR0ZXJzPExvY2FsUmVjb3JkPFQ+Pn0gcHJvcGVydHkgZ2V0IHByb3h5XG4gKiBAcmVhZG9ubHlcbiAqL1xuICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFhYWCB0eXBlZGVmKi9cbiAgICAgICAgZ2V0OiB4ID0+IG5ldyBQcm94eShvYmpUYXJnZXQsIG1ha2VFR2V0UHJveHlIYW5kbGVyKHgsIEhhbmRsZWRQcm9taXNlKSksXG5cbiAgICAgICAgLyoqXG4gKiBFLnJlc29sdmUoeCkgY29udmVydHMgeCB0byBhIGhhbmRsZWQgcHJvbWlzZS4gSXQgaXNcbiAqIHNob3J0aGFuZCBmb3IgSGFuZGxlZFByb21pc2UucmVzb2x2ZSh4KVxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHggdmFsdWUgdG8gY29udmVydCB0byBhIGhhbmRsZWQgcHJvbWlzZVxuICogQHJldHVybnMge1Byb21pc2U8QXdhaXRlZDxUPj59IGhhbmRsZWQgcHJvbWlzZSBmb3IgeFxuICogQHJlYWRvbmx5XG4gKi9cbiAgICAgICAgcmVzb2x2ZTogSGFuZGxlZFByb21pc2UucmVzb2x2ZSxcblxuICAgICAgICAvKipcbiAqIEUuc2VuZE9ubHkgcmV0dXJucyBhIHByb3h5IHNpbWlsYXIgdG8gRSwgYnV0IGZvciB3aGljaCB0aGUgcmVzdWx0c1xuICogYXJlIGlnbm9yZWQgKHVuZGVmaW5lZCBpcyByZXR1cm5lZCkuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VH0geCB0YXJnZXQgZm9yIG1ldGhvZC9mdW5jdGlvbiBjYWxsXG4gKiBAcmV0dXJucyB7RVNlbmRPbmx5Q2FsbGFibGVPck1ldGhvZHM8UmVtb3RlRnVuY3Rpb25zPFQ+Pn0gbWV0aG9kL2Z1bmN0aW9uIGNhbGwgcHJveHlcbiAqIEByZWFkb25seVxuICovXG4gICAgICAgIHNlbmRPbmx5OiB4ID0+XG4gICAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBYWFggdHlwZWRlZiovXG4gICAgICAgICAgbmV3IFByb3h5KGZ1bmNUYXJnZXQsIG1ha2VFU2VuZE9ubHlQcm94eUhhbmRsZXIoeCwgSGFuZGxlZFByb21pc2UpKSxcblxuICAgICAgICAvKipcbiAqIEUud2hlbih4LCByZXMsIHJlaikgaXMgZXF1aXZhbGVudCB0b1xuICogSGFuZGxlZFByb21pc2UucmVzb2x2ZSh4KS50aGVuKHJlcywgcmVqKVxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdGVtcGxhdGUgW1UgPSBUXVxuICogQHBhcmFtIHtUfFByb21pc2VMaWtlPFQ+fSB4IHZhbHVlIHRvIGNvbnZlcnQgdG8gYSBoYW5kbGVkIHByb21pc2VcbiAqIEBwYXJhbSB7KHZhbHVlOiBUKSA9PiBFUmVmPFU+fSBbb25mdWxmaWxsZWRdXG4gKiBAcGFyYW0geyhyZWFzb246IGFueSkgPT4gRVJlZjxVPn0gW29ucmVqZWN0ZWRdXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxVPn1cbiAqIEByZWFkb25seVxuICovXG4gICAgICAgIHdoZW46ICh4LCBvbmZ1bGZpbGxlZCwgb25yZWplY3RlZCkgPT5cbiAgICAgICAgICBIYW5kbGVkUHJvbWlzZS5yZXNvbHZlKHgpLnRoZW4oXG4gICAgICAgICAgICAuLi50cmFja1R1cm5zKFtvbmZ1bGZpbGxlZCwgb25yZWplY3RlZF0pLFxuICAgICAgICAgICksXG4gICAgICB9LFxuICAgICksXG4gICk7XG59O1xuXG5jb25zdHtkZWZhdWx0OiRjzY9fZGVmYXVsdH09e2RlZmF1bHQ6bWFrZUV9O1xuXG4vKiogQHR5cGVkZWYge1JldHVyblR5cGU8bWFrZUU+fSBFUHJveHkgKi9cblxuLyoqXG4gKiBEZWNsYXJlIGFuIG9iamVjdCB0aGF0IGlzIHBvdGVudGlhbGx5IGEgZmFyIHJlZmVyZW5jZSBvZiB0eXBlIFByaW1hcnkgd2hvc2VcbiAqIGF1eGlsbGlhcnkgZGF0YSBoYXMgdHlwZSBMb2NhbC4gIFRoaXMgc2hvdWxkIGJlIHVzZWQgb25seSBmb3IgY29uc3VtZXJzIG9mXG4gKiBGYXIgb2JqZWN0cyBpbiBhcmd1bWVudHMgYW5kIGRlY2xhcmF0aW9uczsgdGhlIG9ubHkgY3JlYXRvcnMgb2YgRmFyIG9iamVjdHNcbiAqIGFyZSBkaXN0cmlidXRlZCBvYmplY3QgY3JlYXRvciBjb21wb25lbnRzIGxpa2UgdGhlIGBGYXJgIG9yIGBSZW1vdGFibGVgXG4gKiBmdW5jdGlvbnMuXG4gKlxuICogQHRlbXBsYXRlIFByaW1hcnkgVGhlIHR5cGUgb2YgdGhlIHByaW1hcnkgcmVmZXJlbmNlLlxuICogQHRlbXBsYXRlIFtMb2NhbD1EYXRhT25seTxQcmltYXJ5Pl0gVGhlIGxvY2FsIHByb3BlcnRpZXMgb2YgdGhlIG9iamVjdC5cbiAqIEB0eXBlZGVmIHtFUmVmPExvY2FsICYgUmVtb3RhYmxlQnJhbmQ8TG9jYWwsIFByaW1hcnk+Pn0gRmFyUmVmXG4gKi9cblxuLyoqXG4gKiBgRGF0YU9ubHk8VD5gIG1lYW5zIHRvIHJldHVybiBhIHJlY29yZCB0eXBlIGBUMmAgY29uc2lzdGluZyBvbmx5IG9mXG4gKiBwcm9wZXJ0aWVzIHRoYXQgYXJlICpub3QqIGZ1bmN0aW9ucy5cbiAqXG4gKiBAdGVtcGxhdGUgVCBUaGUgdHlwZSB0byBiZSBmaWx0ZXJlZC5cbiAqIEB0eXBlZGVmIHtPbWl0PFQsIEZpbHRlcmVkS2V5czxULCBDYWxsYWJsZT4+fSBEYXRhT25seVxuICovXG5cbi8qKlxuICogQHNlZSB7QGxpbmsgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8zMTM5NH1cbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7UHJvbWlzZUxpa2U8VD4gfCBUfSBFUmVmXG4gKiBEZWNsYXJlIHRoYXQgYFRgIG1heSBvciBtYXkgbm90IGJlIGEgUHJvbWlzZS4gIFRoaXMgc2hvdWxkIGJlIHVzZWQgb25seSBmb3JcbiAqIGNvbnN1bWVycyBvZiBhcmd1bWVudHMgYW5kIGRlY2xhcmF0aW9uczsgcmV0dXJuIHZhbHVlcyBzaG91bGQgc3BlY2lmaWNhbGx5IGJlXG4gKiBgUHJvbWlzZTxUPmAgb3IgYFRgIGl0c2VsZi5cbiAqL1xuXG4vKipcbiAqIFRoZSBhd2FpdGVkIHJldHVybiB0eXBlIG9mIGEgZnVuY3Rpb24uXG4gKiBGb3IgdGhlIGV2ZW50dWFsIHJlc3VsdCBvZiBhbiBFIGNhbGwsIEBzZWUge0VSZXN1bHR9IG9yIEBzZWUge0VDYWxsYWJsZVJldHVybn1cbiAqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBUXG4gKiBAdHlwZWRlZiB7VCBleHRlbmRzICguLi5hcmdzOiBhbnlbXSkgPT4gaW5mZXIgUiA/IEF3YWl0ZWQ8Uj4gOiBuZXZlcn0gRVJldHVyblxuICovXG5cbi8qKlxuICogQW4gZXZlbnR1YWwgdmFsdWUgd2hlcmUgcmVtb3RhYmxlIG9iamVjdHMgYXJlIHJlY3Vyc2l2ZWx5IG1hcHBlZCB0byBSZW1vdGUgdHlwZXNcbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge0F3YWl0ZWQ8VD59IEVSZXN1bHRcbiAqL1xuXG4vKipcbiAqIEV4cGVyaW1lbnRhbCB0eXBlIG1hcHBpbmcgcmVtb3RhYmxlIG9iamVjdHMgdG8gUmVtb3RlIHR5cGVzXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIDAgZXh0ZW5kcyAoMSAmIFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIFQgaXMgYW55XG4gKiAgICAgPyBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByb3BhZ2F0ZSB0aGUgYW55IHR5cGUgdGhyb3VnaCB0aGUgcmVzdWx0XG4gKiAgICAgOiBUIGV4dGVuZHMgUmVtb3RhYmxlQnJhbmQ8aW5mZXIgTCwgaW5mZXIgUD4gICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSBSZW1vdGFibGVcbiAqICAgICAgID8gKFAgfCBSZW1vdGFibGVCcmFuZDxMLCBQPikgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFwIGl0IHRvIGl0cyBcIm1heWJlIHJlbW90ZVwiIGZvcm0gKHByaW1hcnkgYmVoYXZpb3Igb3IgcmVtb3RhYmxlIHByZXNlbmNlKVxuICogICAgICAgOiBUIGV4dGVuZHMgUHJvbWlzZUxpa2U8aW5mZXIgVT4gICAgICAgICAgICAgICAgICAgICAvLyBJZiBUIGlzIGEgcHJvbWlzZVxuICogICAgICAgICA/IFByb21pc2U8RUF3YWl0ZWRSZXN1bHQ8QXdhaXRlZDxUPj4+ICAgICAgICAgICAgICAvLyBtYXAgaXRzIHJlc29sdXRpb25cbiAqICAgICAgICAgOiBUIGV4dGVuZHMgKG51bGwgfCB1bmRlZmluZWQgfCBzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgc3ltYm9sIHwgYmlnaW50IHwgQ2FsbGFibGUpIC8vIEludGVyc2VjdGlvbnMgb2YgdGhlc2UgdHlwZXMgd2l0aCBvYmplY3RzIGFyZSBub3QgbWFwcGVkXG4gKiAgICAgICAgICAgPyBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByaW1pdGl2ZXMgYW5kIG5vbi1yZW1vdGFibGUgZnVuY3Rpb25zIGFyZSBwYXNzZWQtdGhyb3VnaFxuICogICAgICAgICAgIDogVCBleHRlbmRzIG9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL1xuICogICAgICAgICAgICAgPyB7IFtQIGluIGtleW9mIFRdOiBFQXdhaXRlZFJlc3VsdDxUW1BdPjsgfSAgICAvLyBvdGhlciBvYmplY3RzIGFyZSBjb25zaWRlcmVkIGNvcHkgZGF0YSBhbmQgcHJvcGVydGllcyBtYXBwZWRcbiAqICAgICAgICAgICAgIDogVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gY2FzZSBhbnl0aGluZyB3YXNuJ3QgY292ZXJlZCwgZmFsbGJhY2sgdG8gcGFzcy10aHJvdWdoXG4gKiApfSBFQXdhaXRlZFJlc3VsdFxuICovXG5cbi8qKlxuICogVGhlIEBzZWUge0VSZXN1bHR9IHJldHVybiB0eXBlIG9mIGEgcmVtb3RlIGZ1bmN0aW9uLlxuICpcbiAqIEB0ZW1wbGF0ZSB7KC4uLmFyZ3M6IGFueVtdKSA9PiBhbnl9IFRcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIDAgZXh0ZW5kcyAoMSAmIFQpICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBUIGlzIGFueVxuICogICAgID8gYW55ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUHJvcGFnYXRlIHRoZSBhbnkgdHlwZSB0aHJvdWdoIHRoZSByZXN1bHRcbiAqICAgICA6IFQgZXh0ZW5kcyAoLi4uYXJnczogYW55W10pID0+IGluZmVyIFIgIC8vIEVsc2UgaW5mZXIgdGhlIHJldHVybiB0eXBlXG4gKiAgICAgICA/IEVSZXN1bHQ8Uj4gICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiB0aGUgZnV0dXJlLCBtYXAgdGhlIGV2ZW50dWFsIHJlc3VsdFxuICogICAgICAgOiBuZXZlclxuICogKX0gRUNhbGxhYmxlUmV0dXJuXG4gKi9cblxuLyogVE9ETzogRmlndXJlIG91dCBhIHdheSB0byBtYXAgZ2VuZXJpYyBjYWxsYWJsZSByZXR1cm4gdHlwZXMsIG9yIGF0IGxlYXN0IGJldHRlciBkZXRlY3QgdGhlbS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNjE4MzguIFdpdGhvdXQgdGhhdCwgYEUoc3RhcnRHb3Zlcm5lZFVwZ3JhZGFibGUpYCovXG4vKiBpbiBhZ29yaWMtc2RrIGRvZXNuJ3QgcHJvcGFnYXRlIHRoZSBzdGFydCBmdW5jdGlvbiB0eXBlLiovXG4vKipcbiAqIE1hcHMgYSBjYWxsYWJsZSB0byBpdHMgcmVtb3RlbHkgY2FsbGVkIHR5cGVcbiAqXG4gKiBAdGVtcGxhdGUge0NhbGxhYmxlfSBUXG4gKiBAdHlwZWRlZiB7KFxuICogICAgUmV0dXJuVHlwZTxUPiBleHRlbmRzIFByb21pc2VMaWtlPGluZmVyIFU+ICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgY2FsbGFibGUgcmV0dXJucyBhIHByb21pc2VcbiAqICAgICAgPyBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJ5cGFzcyBtYXBwaW5nIHRvIG1haW50YWluIGFueSBnZW5lcmljXG4gKiAgICAgIDogKC4uLmFyZ3M6IFBhcmFtZXRlcnM8VD4pID0+IFByb21pc2U8RUNhbGxhYmxlUmV0dXJuPFQ+PiAvLyBNYXAgaXQgYW55d2F5IHRvIGVuc3VyZSBwcm9taXNlIHJldHVybiB0eXBlXG4gKiApfSBFQ2FsbGFibGVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7e1xuICogICByZWFkb25seSBbUCBpbiBrZXlvZiBUXTogVFtQXSBleHRlbmRzIENhbGxhYmxlXG4gKiAgICAgPyBFQ2FsbGFibGU8VFtQXT5cbiAqICAgICA6IG5ldmVyO1xuICogfX0gRU1ldGhvZHNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7e1xuICogICByZWFkb25seSBbUCBpbiBrZXlvZiBUXTogVFtQXSBleHRlbmRzIFByb21pc2VMaWtlPGluZmVyIFU+XG4gKiAgICAgPyBUW1BdXG4gKiAgICAgOiBQcm9taXNlPEF3YWl0ZWQ8VFtQXT4+O1xuICogfX0gRUdldHRlcnNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7Q2FsbGFibGV9IFRcbiAqIEB0eXBlZGVmIHsoLi4uYXJnczogUGFyYW1ldGVyczxUPikgPT4gUHJvbWlzZTx2b2lkPn0gRVNlbmRPbmx5Q2FsbGFibGVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7e1xuICogICByZWFkb25seSBbUCBpbiBrZXlvZiBUXTogVFtQXSBleHRlbmRzIENhbGxhYmxlXG4gKiAgICAgPyBFU2VuZE9ubHlDYWxsYWJsZTxUW1BdPlxuICogICAgIDogbmV2ZXI7XG4gKiB9fSBFU2VuZE9ubHlNZXRob2RzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYgeyhcbiAqICAgVCBleHRlbmRzIENhbGxhYmxlXG4gKiAgICAgPyBFU2VuZE9ubHlDYWxsYWJsZTxUPiAmIEVTZW5kT25seU1ldGhvZHM8UmVxdWlyZWQ8VD4+XG4gKiAgICAgOiAwIGV4dGVuZHMgKDEgJiBUKVxuICogICAgICAgPyBuZXZlclxuICogICAgICAgOiBFU2VuZE9ubHlNZXRob2RzPFJlcXVpcmVkPFQ+PlxuICogKX0gRVNlbmRPbmx5Q2FsbGFibGVPck1ldGhvZHNcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7KFxuICogICBUIGV4dGVuZHMgQ2FsbGFibGVcbiAqICAgICA/IEVDYWxsYWJsZTxUPiAmIEVNZXRob2RzPFJlcXVpcmVkPFQ+PlxuICogICAgIDogMCBleHRlbmRzICgxICYgVClcbiAqICAgICAgID8gbmV2ZXJcbiAqICAgICAgIDogRU1ldGhvZHM8UmVxdWlyZWQ8VD4+XG4gKiApfSBFQ2FsbGFibGVPck1ldGhvZHNcbiAqL1xuXG4vKipcbiAqIFJldHVybiBhIHVuaW9uIG9mIHByb3BlcnR5IG5hbWVzL3N5bWJvbHMvbnVtYmVycyBQIGZvciB3aGljaCB0aGUgcmVjb3JkIGVsZW1lbnQgVFtQXSdzIHR5cGUgZXh0ZW5kcyBVLlxuICpcbiAqIEdpdmVuIGNvbnN0IHggPSB7IGE6IDEyMywgYjogJ2hlbGxvJywgYzogNDIsIDQ5OiAoKSA9PiB7fSwgNTM6IDY3IH0sXG4gKlxuICogRmlsdGVyZWRLZXlzPHR5cGVvZiB4LCBudW1iZXI+IGlzIHRoZSB0eXBlICdhJyB8ICdjJyB8IDUzLlxuICogRmlsdGVyZWRLZXlzPHR5cGVvZiB4LCBzdHJpbmc+IGlzIHRoZSB0eXBlICdiJy5cbiAqIEZpbHRlcmVkS2V5czx0eXBlb2YgeCwgNDIgfCA2Nz4gaXMgdGhlIHR5cGUgJ2MnIHwgNTMuXG4gKiBGaWx0ZXJlZEtleXM8dHlwZW9mIHgsIGJvb2xlYW4+IGlzIHRoZSB0eXBlIG5ldmVyLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdGVtcGxhdGUgVVxuICogQHR5cGVkZWYge3sgW1AgaW4ga2V5b2YgVF06IFRbUF0gZXh0ZW5kcyBVID8gUCA6IG5ldmVyOyB9W2tleW9mIFRdfSBGaWx0ZXJlZEtleXNcbiAqL1xuXG4vKipcbiAqIGBQaWNrQ2FsbGFibGU8VD5gIG1lYW5zIHRvIHJldHVybiBhIHNpbmdsZSByb290IGNhbGxhYmxlIG9yIGEgcmVjb3JkIHR5cGVcbiAqIGNvbnNpc3Rpbmcgb25seSBvZiBwcm9wZXJ0aWVzIHRoYXQgYXJlIGZ1bmN0aW9ucy5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYgeyhcbiAqICAgVCBleHRlbmRzIENhbGxhYmxlXG4gKiAgICAgPyAoLi4uYXJnczogUGFyYW1ldGVyczxUPikgPT4gUmV0dXJuVHlwZTxUPiAgICAgICAgICAgICAgICAgICAgIC8vIGEgcm9vdCBjYWxsYWJsZSwgbm8gbWV0aG9kc1xuICogICAgIDogUGljazxULCBGaWx0ZXJlZEtleXM8VCwgQ2FsbGFibGU+PiAgICAgICAgICAvLyBhbnkgY2FsbGFibGUgbWV0aG9kc1xuICogKX0gUGlja0NhbGxhYmxlXG4gKi9cblxuLyoqXG4gKiBgUmVtb3RlRnVuY3Rpb25zPFQ+YCBtZWFucyB0byByZXR1cm4gdGhlIGZ1bmN0aW9ucyBhbmQgcHJvcGVydGllcyB0aGF0IGFyZSByZW1vdGVseSBjYWxsYWJsZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYgeyhcbiAqICAgVCBleHRlbmRzIFJlbW90YWJsZUJyYW5kPGluZmVyIEwsIGluZmVyIFI+ICAgLy8gaWYgYSBnaXZlbiBUIGlzIHNvbWUgcmVtb3RlIGludGVyZmFjZSBSXG4gKiAgICAgPyBQaWNrQ2FsbGFibGU8Uj4gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gcmV0dXJuIHRoZSBjYWxsYWJsZSBwcm9wZXJ0aWVzIG9mIFJcbiAqICAgICA6IFQgZXh0ZW5kcyBQcm9taXNlTGlrZTxpbmZlciBVPiAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCBpZiBUIGlzIGEgcHJvbWlzZVxuICogICAgICAgPyBSZW1vdGVGdW5jdGlvbnM8VT4gICAgICAgICAgICAgICAgICAgICAvLyByZWN1cnNlIG9uIHRoZSByZXNvbHZlZCB2YWx1ZSBvZiBUXG4gKiAgICAgICA6IFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgcmV0dXJuIFRcbiAqICl9IFJlbW90ZUZ1bmN0aW9uc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHsoXG4gKiAgIFQgZXh0ZW5kcyBSZW1vdGFibGVCcmFuZDxpbmZlciBMLCBpbmZlciBSPlxuICogICAgID8gTFxuICogICAgIDogVCBleHRlbmRzIFByb21pc2VMaWtlPGluZmVyIFU+XG4gKiAgICAgPyBMb2NhbFJlY29yZDxVPlxuICogICAgIDogVFxuICogKX0gTG9jYWxSZWNvcmRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbUiA9IHVua25vd25dXG4gKiBAdHlwZWRlZiB7e1xuICogICBwcm9taXNlOiBQcm9taXNlPFI+O1xuICogICBzZXR0bGVyOiBTZXR0bGVyPFI+O1xuICogfX0gRVByb21pc2VLaXRcbiAqL1xuXG4vKipcbiAqIERlY2xhcmUgYSBuZWFyIG9iamVjdCB0aGF0IG11c3Qgb25seSBiZSBpbnZva2VkIHdpdGggRSwgZXZlbiBsb2NhbGx5LiAgSXRcbiAqIHN1cHBvcnRzIHRoZSBgVGAgaW50ZXJmYWNlIGJ1dCBhZGRpdGlvbmFsbHkgcGVybWl0cyBgVGAncyBtZXRob2RzIHRvIHJldHVyblxuICogYFByb21pc2VMaWtlYHMgZXZlbiBpZiBgVGAgZGVjbGFyZXMgdGhlbSBhcyBvbmx5IHN5bmNocm9ub3VzLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7KFxuICogICBUIGV4dGVuZHMgQ2FsbGFibGVcbiAqICAgICA/ICguLi5hcmdzOiBQYXJhbWV0ZXJzPFQ+KSA9PiBFUmVmPEF3YWl0ZWQ8RU9ubHk8UmV0dXJuVHlwZTxUPj4+PlxuICogICAgIDogVCBleHRlbmRzIFJlY29yZDxQcm9wZXJ0eUtleSwgQ2FsbGFibGU+XG4gKiAgICAgPyB7XG4gKiAgICAgICAgIFtLIGluIGtleW9mIFRdOiBUW0tdIGV4dGVuZHMgQ2FsbGFibGVcbiAqICAgICAgICAgICA/ICguLi5hcmdzOiBQYXJhbWV0ZXJzPFRbS10+KSA9PiBFUmVmPEF3YWl0ZWQ8RU9ubHk8UmV0dXJuVHlwZTxUW0tdPj4+PlxuICogICAgICAgICAgIDogVFtLXTtcbiAqICAgICAgIH1cbiAqICAgICA6IFRcbiAqICl9IEVPbmx5XG4gKi8kaM2PX29uY2UuZGVmYXVsdCgkY82PX2RlZmF1bHQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmYXVsdCI6WyJkZWZhdWx0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACkAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC9zcmMvZXhwb3J0cy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABzlTFSchQAAHIUAAAnAAAAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQvc3JjL2xvY2FsLmpzeyJpbXBvcnRzIjpbIi4vbWVzc2FnZS1icmVha3BvaW50cy5qcyJdLCJleHBvcnRzIjpbImdldE1ldGhvZE5hbWVzIiwibG9jYWxBcHBseUZ1bmN0aW9uIiwibG9jYWxBcHBseU1ldGhvZCIsImxvY2FsR2V0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgbWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyOyRozY9faW1wb3J0cyhbW1wiLi9tZXNzYWdlLWJyZWFrcG9pbnRzLmpzXCIsIFtbXCJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXJcIixbJGjNj19hID0+IChtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIgPSAkaM2PX2EpXV1dXV0pO1xuXG5jb25zdCB7IGRldGFpbHM6IFgsIHF1b3RlOiBxLCBGYWlsIH0gPSBhc3NlcnQ7XG5cbmNvbnN0IHsgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycywgZ2V0UHJvdG90eXBlT2YsIGZyZWV6ZSB9ID0gT2JqZWN0O1xuY29uc3QgeyBhcHBseSwgb3duS2V5cyB9ID0gUmVmbGVjdDtcblxuY29uc3QgbnR5cGVvZiA9IHNwZWNpbWVuID0+IChzcGVjaW1lbiA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiBzcGVjaW1lbik7XG5cbmNvbnN0IG9uRGVsaXZlcnkgPSBtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIoJ0VORE9fREVMSVZFUllfQlJFQUtQT0lOVFMnKTtcblxuLyoqXG4gKiBUT0RPIENvbnNvbGlkYXRlIHdpdGggYGlzUHJpbWl0aXZlYCB0aGF0J3MgY3VycmVudGx5IGluIGBAZW5kby9wYXNzLXN0eWxlYC5cbiAqIExheWVyaW5nIGNvbnN0cmFpbnRzIG1ha2UgdGhpcyB0cmlja3ksIHdoaWNoIGlzIHdoeSB3ZSBoYXZlbid0IHlldCBmaWd1cmVkXG4gKiBvdXQgaG93IHRvIGRvIHRoaXMuXG4gKlxuICogQHR5cGUgeyh2YWw6IHVua25vd24pID0+IHZhbCBpcyAodW5kZWZpbmVkXG4gKiB8IG51bGxcbiAqIHwgYm9vbGVhblxuICogfCBudW1iZXJcbiAqIHwgYmlnaW50XG4gKiB8IHN0cmluZ1xuICogfCBzeW1ib2wpfVxuICovXG5jb25zdCBpc1ByaW1pdGl2ZSA9IHZhbCA9PlxuICAhdmFsIHx8ICh0eXBlb2YgdmFsICE9PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsICE9PSAnZnVuY3Rpb24nKTtcblxuLyoqXG4gKiBQcmlvcml0aXplIHN5bWJvbHMgYXMgZWFybGllciB0aGFuIHN0cmluZ3MuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8c3ltYm9sfSBhXG4gKiBAcGFyYW0ge3N0cmluZ3xzeW1ib2x9IGJcbiAqIEByZXR1cm5zIHstMSB8IDAgfCAxfVxuICovXG5jb25zdCBjb21wYXJlU3RyaW5naWZpZWQgPSAoYSwgYikgPT4ge1xuICBpZiAodHlwZW9mIGEgPT09IHR5cGVvZiBiKSB7XG4gICAgY29uc3QgbGVmdCA9IFN0cmluZyhhKTtcbiAgICBjb25zdCByaWdodCA9IFN0cmluZyhiKTtcbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnkqL1xuICAgIHJldHVybiBsZWZ0IDwgcmlnaHQgPyAtMSA6IGxlZnQgPiByaWdodCA/IDEgOiAwO1xuICB9XG4gIGlmICh0eXBlb2YgYSA9PT0gJ3N5bWJvbCcpIHtcbiAgICBhc3NlcnQodHlwZW9mIGIgPT09ICdzdHJpbmcnKTtcbiAgICByZXR1cm4gLTE7XG4gIH1cbiAgYXNzZXJ0KHR5cGVvZiBhID09PSAnc3RyaW5nJyk7XG4gIGFzc2VydCh0eXBlb2YgYiA9PT0gJ3N5bWJvbCcpO1xuICByZXR1cm4gMTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IHZhbFxuICogQHJldHVybnMgeyhzdHJpbmd8c3ltYm9sKVtdfVxuICovXG4gICAgICAgY29uc3QgZ2V0TWV0aG9kTmFtZXMgPSB2YWwgPT4ge1xuICBsZXQgbGF5ZXIgPSB2YWw7XG4gIGNvbnN0IG5hbWVzID0gbmV3IFNldCgpOyAvKiBTZXQgdG8gZGVkdXBsaWNhdGUqL1xuICB3aGlsZSAobGF5ZXIgIT09IG51bGwgJiYgbGF5ZXIgIT09IE9iamVjdC5wcm90b3R5cGUpIHtcbiAgICAvKiBiZSB0b2xlcmFudCBvZiBub24tb2JqZWN0cyovXG4gICAgY29uc3QgZGVzY3MgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGxheWVyKTtcbiAgICBmb3IgKGNvbnN0IG5hbWUgb2Ygb3duS2V5cyhkZXNjcykpIHtcbiAgICAgIC8qIEluIGNhc2UgYSBtZXRob2QgaXMgb3ZlcnJpZGRlbiBieSBhIG5vbi1tZXRob2QsKi9cbiAgICAgIC8qIHRlc3QgYHZhbFtuYW1lXWAgcmF0aGVyIHRoYW4gYGxheWVyW25hbWVdYCovXG4gICAgICBpZiAodHlwZW9mIHZhbFtuYW1lXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBuYW1lcy5hZGQobmFtZSk7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc1ByaW1pdGl2ZSh2YWwpKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgbGF5ZXIgPSBnZXRQcm90b3R5cGVPZihsYXllcik7XG4gIH1cbiAgcmV0dXJuIGhhcmRlbihbLi4ubmFtZXNdLnNvcnQoY29tcGFyZVN0cmluZ2lmaWVkKSk7XG59O1xuLyogVGhlIHRvcCBsZXZlbCBvZiB0aGUgZXZlbnR1YWwgc2VuZCBtb2R1bGVzIGNhbiBiZSBldmFsdWF0ZWQgYmVmb3JlKi9cbi8qIHNlcyBjcmVhdGVzIGBoYXJkZW5gLCBhbmQgc28gY2Fubm90IHJlbHkgb24gYGhhcmRlbmAgYXQgdG9wIGxldmVsLiovJGjNj19vbmNlLmdldE1ldGhvZE5hbWVzKGdldE1ldGhvZE5hbWVzKTtcbmZyZWV6ZShnZXRNZXRob2ROYW1lcyk7XG5cbiAgICAgICBjb25zdCBsb2NhbEFwcGx5RnVuY3Rpb24gPSAocmVjaXBpZW50LCBhcmdzKSA9PiB7XG4gIHR5cGVvZiByZWNpcGllbnQgPT09ICdmdW5jdGlvbicgfHxcbiAgICBhc3NlcnQuZmFpbChcbiAgICAgIFhgQ2Fubm90IGludm9rZSB0YXJnZXQgYXMgYSBmdW5jdGlvbjsgdHlwZW9mIHRhcmdldCBpcyAke3EoXG4gICAgICAgIG50eXBlb2YocmVjaXBpZW50KSxcbiAgICAgICl9YCxcbiAgICAgIFR5cGVFcnJvcixcbiAgICApO1xuICBpZiAob25EZWxpdmVyeSAmJiBvbkRlbGl2ZXJ5LnNob3VsZEJyZWFrcG9pbnQocmVjaXBpZW50LCB1bmRlZmluZWQpKSB7XG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWRlYnVnZ2VyKi9cbiAgICBkZWJ1Z2dlcjsgLyogU1RFUCBJTlRPIEFQUExZKi9cbiAgICAvKiBTdG9wcGVkIGF0IGEgYnJlYWtwb2ludCBvbiB0aGlzIGRlbGl2ZXJ5IG9mIGFuIGV2ZW50dWFsIGZ1bmN0aW9uIGNhbGwqL1xuICAgIC8qIHNvIHRoYXQgeW91IGNhbiBzdGVwICppbnRvKiB0aGUgZm9sbG93aW5nIGBhcHBseWAgaW4gb3JkZXIgdG8gc2VlIHRoZSovXG4gICAgLyogZnVuY3Rpb24gY2FsbCBhcyBpdCBoYXBwZW5zLiBPciBzdGVwICpvdmVyKiB0byBzZWUgd2hhdCBoYXBwZW5zKi9cbiAgICAvKiBhZnRlciB0aGUgZnVuY3Rpb24gY2FsbCByZXR1cm5zLiovXG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gYXBwbHkocmVjaXBpZW50LCB1bmRlZmluZWQsIGFyZ3MpO1xuICByZXR1cm4gcmVzdWx0O1xufTskaM2PX29uY2UubG9jYWxBcHBseUZ1bmN0aW9uKGxvY2FsQXBwbHlGdW5jdGlvbik7XG5cbiAgICAgICBjb25zdCBsb2NhbEFwcGx5TWV0aG9kID0gKHJlY2lwaWVudCwgbWV0aG9kTmFtZSwgYXJncykgPT4ge1xuICBpZiAobWV0aG9kTmFtZSA9PT0gdW5kZWZpbmVkIHx8IG1ldGhvZE5hbWUgPT09IG51bGwpIHtcbiAgICAvKiBCYXNlIGNhc2U7IGJvdHRvbSBvdXQgdG8gYXBwbHkgZnVuY3Rpb25zLiovXG4gICAgcmV0dXJuIGxvY2FsQXBwbHlGdW5jdGlvbihyZWNpcGllbnQsIGFyZ3MpO1xuICB9XG4gIGlmIChyZWNpcGllbnQgPT09IHVuZGVmaW5lZCB8fCByZWNpcGllbnQgPT09IG51bGwpIHtcbiAgICBhc3NlcnQuZmFpbChcbiAgICAgIFhgQ2Fubm90IGRlbGl2ZXIgJHtxKG1ldGhvZE5hbWUpfSB0byB0YXJnZXQ7IHR5cGVvZiB0YXJnZXQgaXMgJHtxKFxuICAgICAgICBudHlwZW9mKHJlY2lwaWVudCksXG4gICAgICApfWAsXG4gICAgICBUeXBlRXJyb3IsXG4gICAgKTtcbiAgfVxuICBjb25zdCBmbiA9IHJlY2lwaWVudFttZXRob2ROYW1lXTtcbiAgaWYgKGZuID09PSB1bmRlZmluZWQpIHtcbiAgICBhc3NlcnQuZmFpbChcbiAgICAgIFhgdGFyZ2V0IGhhcyBubyBtZXRob2QgJHtxKG1ldGhvZE5hbWUpfSwgaGFzICR7cShcbiAgICAgICAgZ2V0TWV0aG9kTmFtZXMocmVjaXBpZW50KSxcbiAgICAgICl9YCxcbiAgICAgIFR5cGVFcnJvcixcbiAgICApO1xuICB9XG4gIGNvbnN0IGZ0eXBlID0gbnR5cGVvZihmbik7XG4gIHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJyB8fFxuICAgIEZhaWxgaW52b2tlZCBtZXRob2QgJHtxKG1ldGhvZE5hbWUpfSBpcyBub3QgYSBmdW5jdGlvbjsgaXQgaXMgYSAke3EoXG4gICAgICBmdHlwZSxcbiAgICApfWA7XG4gIGlmIChvbkRlbGl2ZXJ5ICYmIG9uRGVsaXZlcnkuc2hvdWxkQnJlYWtwb2ludChyZWNpcGllbnQsIG1ldGhvZE5hbWUpKSB7XG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWRlYnVnZ2VyKi9cbiAgICBkZWJ1Z2dlcjsgLyogU1RFUCBJTlRPIEFQUExZKi9cbiAgICAvKiBTdG9wcGVkIGF0IGEgYnJlYWtwb2ludCBvbiB0aGlzIGRlbGl2ZXJ5IG9mIGFuIGV2ZW50dWFsIG1ldGhvZCBjYWxsKi9cbiAgICAvKiBzbyB0aGF0IHlvdSBjYW4gc3RlcCAqaW50byogdGhlIGZvbGxvd2luZyBgYXBwbHlgIGluIG9yZGVyIHRvIHNlZSB0aGUqL1xuICAgIC8qIG1ldGhvZCBjYWxsIGFzIGl0IGhhcHBlbnMuIE9yIHN0ZXAgKm92ZXIqIHRvIHNlZSB3aGF0IGhhcHBlbnMqL1xuICAgIC8qIGFmdGVyIHRoZSBtZXRob2QgY2FsbCByZXR1cm5zLiovXG4gIH1cbiAgY29uc3QgcmVzdWx0ID0gYXBwbHkoZm4sIHJlY2lwaWVudCwgYXJncyk7XG4gIHJldHVybiByZXN1bHQ7XG59OyRozY9fb25jZS5sb2NhbEFwcGx5TWV0aG9kKGxvY2FsQXBwbHlNZXRob2QpO1xuXG4gICAgICAgY29uc3QgbG9jYWxHZXQgPSAodCwga2V5KSA9PiB0W2tleV07JGjNj19vbmNlLmxvY2FsR2V0KGxvY2FsR2V0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImdldE1ldGhvZE5hbWVzIjpbImdldE1ldGhvZE5hbWVzIl0sImxvY2FsQXBwbHlGdW5jdGlvbiI6WyJsb2NhbEFwcGx5RnVuY3Rpb24iXSwibG9jYWxBcHBseU1ldGhvZCI6WyJsb2NhbEFwcGx5TWV0aG9kIl0sImxvY2FsR2V0IjpbImxvY2FsR2V0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAId4iLn0GAAA9BgAADUAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC9zcmMvbWVzc2FnZS1icmVha3BvaW50cy5qc3siaW1wb3J0cyI6WyJAZW5kby9lbnYtb3B0aW9ucyJdLCJleHBvcnRzIjpbIm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGdldEVudmlyb25tZW50T3B0aW9uOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZW52LW9wdGlvbnNcIiwgW1tcImdldEVudmlyb25tZW50T3B0aW9uXCIsWyRozY9fYSA9PiAoZ2V0RW52aXJvbm1lbnRPcHRpb24gPSAkaM2PX2EpXV1dXV0pO1xuXG5jb25zdCB7IHF1b3RlOiBxLCBGYWlsIH0gPSBhc3NlcnQ7XG5cbmNvbnN0IHsgaGFzT3duLCBmcmVlemUsIGVudHJpZXMgfSA9IE9iamVjdDtcblxuLyoqXG4gKiBAdHlwZWRlZiB7c3RyaW5nIHwgJyonfSBNYXRjaFN0cmluZ1RhZ1xuICogICBBIHN0YXIgYCcqJ2AgbWF0Y2hlcyBhbnkgcmVjaXBpZW50LiBPdGhlcndpc2UsIHRoZSBzdHJpbmcgaXNcbiAqICAgbWF0Y2hlZCBhZ2FpbnN0IHRoZSB2YWx1ZSBvZiBhIHJlY2lwaWVudCdzIGBAQHRvU3RyaW5nVGFnYFxuICogICBhZnRlciBzdHJpcHBpbmcgb3V0IGFueSBsZWFkaW5nIGAnQWxsZWdlZDogJ2Agb3IgYCdEZWJ1Z05hbWU6ICdgXG4gKiAgIHByZWZpeC4gRm9yIG9iamVjdHMgZGVmaW5lZCB3aXRoIGBGYXJgIHRoaXMgaXMgdGhlIGZpcnN0IGFyZ3VtZW50LFxuICogICBrbm93biBhcyB0aGUgYGZhck5hbWVgLiBGb3IgZXhvcywgdGhpcyBpcyB0aGUgdGFnLlxuICovXG4vKipcbiAqIEB0eXBlZGVmIHtzdHJpbmcgfCAnKid9IE1hdGNoTWV0aG9kTmFtZVxuICogICBBIHN0YXIgYCcqJ2AgbWF0Y2hlcyBhbnkgbWV0aG9kIG5hbWUuIE90aGVyd2lzZSwgdGhlIHN0cmluZyBpc1xuICogICBtYXRjaGVkIGFnYWluc3QgdGhlIG1ldGhvZCBuYW1lLiBDdXJyZW50bHksIHRoaXMgaXMgb25seSBhbiBleGFjdCBtYXRjaC5cbiAqICAgSG93ZXZlciwgYmV3YXJlIHRoYXQgd2UgbWF5IGludHJvZHVjZSBhIHN0cmluZyBzeW50YXggZm9yXG4gKiAgIHN5bWJvbCBtZXRob2QgbmFtZXMuXG4gKi9cbi8qKlxuICogQHR5cGVkZWYge251bWJlciB8ICcqJ30gTWF0Y2hDb3VudGRvd25cbiAqICAgQSBzdGFyIGAnKidgIHdpbGwgYWx3YXlzIGJyZWFrcG9pbnQuIE90aGVyd2lzZSwgdGhlIHN0cmluZ1xuICogICBtdXN0IGJlIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIuIE9uY2UgdGhhdCBpcyB6ZXJvLCBhbHdheXMgYnJlYWtwb2ludC5cbiAqICAgT3RoZXJ3aXNlIGRlY3JlbWVudCBieSBvbmUgZWFjaCB0aW1lIGl0IG1hdGNoZXMgdW50aWwgaXQgcmVhY2hlcyB6ZXJvLlxuICogICBJbiBvdGhlciB3b3JkcywgdGhlIGNvdW50ZG93biByZXByZXNlbnRzIHRoZSBudW1iZXIgb2ZcbiAqICAgYnJlYWtwb2ludCBvY2N1cnJlbmNlcyB0byBza2lwIGJlZm9yZSBhY3R1YWxseSBicmVha3BvaW50aW5nLlxuICovXG5cbi8qKlxuICogVGhpcyBpcyB0aGUgZXh0ZXJuYWwgSlNPTiByZXByZXNlbnRhdGlvbiwgaW4gd2hpY2hcbiAqIC0gdGhlIG91dGVyIHByb3BlcnR5IG5hbWUgaXMgdGhlIGNsYXNzLWxpa2UgdGFnIG9yICcqJyxcbiAqIC0gdGhlIGlubmVyIHByb3BlcnR5IG5hbWUgaXMgdGhlIG1ldGhvZCBuYW1lIG9yICcqJyxcbiAqIC0gdGhlIHZhbHVlIGlzIGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgY291bnRkb3duIG9yICcqJy5cbiAqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPE1hdGNoU3RyaW5nVGFnLCBSZWNvcmQ8TWF0Y2hNZXRob2ROYW1lLCBNYXRjaENvdW50ZG93bj4+fSBNZXNzYWdlQnJlYWtwb2ludHNcbiAqL1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIGludGVybmFsIEpTT04gcmVwcmVzZW50YXRpb24sIGluIHdoaWNoXG4gKiAtIHRoZSBvdXRlciBwcm9wZXJ0eSBuYW1lIGlzIHRoZSBtZXRob2QgbmFtZSBvciAnKicsXG4gKiAtIHRoZSBpbm5lciBwcm9wZXJ0eSBuYW1lIGlzIHRoZSBjbGFzcy1saWtlIHRhZyBvciAnKicsXG4gKiAtIHRoZSB2YWx1ZSBpcyBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIGNvdW50ZG93biBvciAnKicuXG4gKlxuICogQHR5cGVkZWYge1JlY29yZDxNYXRjaE1ldGhvZE5hbWUsIFJlY29yZDxNYXRjaFN0cmluZ1RhZywgTWF0Y2hDb3VudGRvd24+Pn0gQnJlYWtwb2ludFRhYmxlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNZXNzYWdlQnJlYWtwb2ludFRlc3RlclxuICogQHByb3BlcnR5IHsoKSA9PiBNZXNzYWdlQnJlYWtwb2ludHN9IGdldEJyZWFrcG9pbnRzXG4gKiBAcHJvcGVydHkgeyhuZXdCcmVha3BvaW50cz86IE1lc3NhZ2VCcmVha3BvaW50cykgPT4gdm9pZH0gc2V0QnJlYWtwb2ludHNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICByZWNpcGllbnQ6IG9iamVjdCxcbiAqICAgbWV0aG9kTmFtZTogc3RyaW5nIHwgc3ltYm9sIHwgdW5kZWZpbmVkXG4gKiApID0+IGJvb2xlYW59IHNob3VsZEJyZWFrcG9pbnRcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSB2YWxcbiAqIEByZXR1cm5zIHt2YWwgaXMgUmVjb3JkPHN0cmluZywgYW55Pn1cbiAqL1xuY29uc3QgaXNKU09OUmVjb3JkID0gdmFsID0+XG4gIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmIHZhbCAhPT0gbnVsbCAmJiAhQXJyYXkuaXNBcnJheSh2YWwpO1xuXG4vKipcbiAqIFJldHVybiBgdGFnYCBhZnRlciBzdHJpcHBpbmcgb2ZmIGFueSBgJ0FsbGVnZWQ6ICdgIG9yIGAnRGVidWdOYW1lOiAnYFxuICogcHJlZml4IGlmIHByZXNlbnQuXG4gKiBgYGBqc1xuICogc2ltcGxpZnlUYWcoJ0FsbGVnZWQ6IG1vb2xhIGlzc3VlcicpID09PSAnbW9vbGEgaXNzdWVyJ1xuICogYGBgXG4gKiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgc3VjaCBwcmVmaXhlcywgb25seSB0aGUgb3V0ZXIgb25lIGlzIHJlbW92ZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3Qgc2ltcGxpZnlUYWcgPSB0YWcgPT4ge1xuICBmb3IgKGNvbnN0IHByZWZpeCBvZiBbJ0FsbGVnZWQ6ICcsICdEZWJ1Z05hbWU6ICddKSB7XG4gICAgaWYgKHRhZy5zdGFydHNXaXRoKHByZWZpeCkpIHtcbiAgICAgIHJldHVybiB0YWcuc2xpY2UocHJlZml4Lmxlbmd0aCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0YWc7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBvcHRpb25OYW1lXG4gKiBAcmV0dXJucyB7TWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIgfCB1bmRlZmluZWR9XG4gKi9cbiAgICAgICBjb25zdCBtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIgPSBvcHRpb25OYW1lID0+IHtcbiAgbGV0IGJyZWFrcG9pbnRzID0gSlNPTi5wYXJzZShnZXRFbnZpcm9ubWVudE9wdGlvbihvcHRpb25OYW1lLCAnbnVsbCcpKTtcblxuICBpZiAoYnJlYWtwb2ludHMgPT09IG51bGwpIHtcbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgLyoqIEB0eXBlIHtCcmVha3BvaW50VGFibGV9ICovXG4gIGxldCBicmVha3BvaW50c1RhYmxlO1xuXG4gIGNvbnN0IGdldEJyZWFrcG9pbnRzID0gKCkgPT4gYnJlYWtwb2ludHM7XG4gIGZyZWV6ZShnZXRCcmVha3BvaW50cyk7XG5cbiAgY29uc3Qgc2V0QnJlYWtwb2ludHMgPSAobmV3QnJlYWtwb2ludHMgPSBicmVha3BvaW50cykgPT4ge1xuICAgIGlzSlNPTlJlY29yZChuZXdCcmVha3BvaW50cykgfHxcbiAgICAgIEZhaWxgRXhwZWN0ZWQgJHtxKG9wdGlvbk5hbWUpfSBvcHRpb24gdG8gYmUgYSBKU09OIGJyZWFrcG9pbnRzIHJlY29yZGA7XG5cbiAgICAvKiogQHR5cGUge0JyZWFrcG9pbnRUYWJsZX0gKi9cbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIGNvbmZ1c2VkIGJ5IF9fcHJvdG9fXyovXG4gICAgY29uc3QgbmV3QnJlYWtwb2ludHNUYWJsZSA9IHsgX19wcm90b19fOiBudWxsIH07XG5cbiAgICBmb3IgKGNvbnN0IFt0YWcsIG1ldGhvZEJQc10gb2YgZW50cmllcyhuZXdCcmVha3BvaW50cykpIHtcbiAgICAgIHRhZyA9PT0gc2ltcGxpZnlUYWcodGFnKSB8fFxuICAgICAgICBGYWlsYEp1c3QgdXNlIHNpbXBsZSB0YWcgJHtxKHNpbXBsaWZ5VGFnKHRhZykpfSByYXRoZXIgdGhhbiAke3EodGFnKX1gO1xuICAgICAgaXNKU09OUmVjb3JkKG1ldGhvZEJQcykgfHxcbiAgICAgICAgRmFpbGBFeHBlY3RlZCAke3Eob3B0aW9uTmFtZSl9IG9wdGlvbidzICR7cShcbiAgICAgICAgICB0YWcsXG4gICAgICAgICl9IHRvIGJlIGEgSlNPTiBtZXRob2RzIGJyZWFrcG9pbnRzIHJlY29yZGA7XG4gICAgICBmb3IgKGNvbnN0IFttZXRob2ROYW1lLCBjb3VudF0gb2YgZW50cmllcyhtZXRob2RCUHMpKSB7XG4gICAgICAgIGNvdW50ID09PSAnKicgfHxcbiAgICAgICAgICAodHlwZW9mIGNvdW50ID09PSAnbnVtYmVyJyAmJlxuICAgICAgICAgICAgTnVtYmVyLmlzU2FmZUludGVnZXIoY291bnQpICYmXG4gICAgICAgICAgICBjb3VudCA+PSAwKSB8fFxuICAgICAgICAgIEZhaWxgRXhwZWN0ZWQgJHtxKG9wdGlvbk5hbWUpfSBvcHRpb24ncyAke3EodGFnKX0uJHtxKFxuICAgICAgICAgICAgbWV0aG9kTmFtZSxcbiAgICAgICAgICApfSB0byBiZSBcIipcIiBvciBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyYDtcblxuICAgICAgICBjb25zdCBjbGFzc0JQcyA9IGhhc093bihuZXdCcmVha3BvaW50c1RhYmxlLCBtZXRob2ROYW1lKVxuICAgICAgICAgID8gbmV3QnJlYWtwb2ludHNUYWJsZVttZXRob2ROYW1lXVxuICAgICAgICAgIDogKG5ld0JyZWFrcG9pbnRzVGFibGVbbWV0aG9kTmFtZV0gPSB7XG4gICAgICAgICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgY29uZnVzZWQgYnkgX19wcm90b19fKi9cbiAgICAgICAgICAgICAgX19wcm90b19fOiBudWxsLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIGNsYXNzQlBzW3RhZ10gPSBjb3VudDtcbiAgICAgIH1cbiAgICB9XG4gICAgYnJlYWtwb2ludHMgPSBuZXdCcmVha3BvaW50cztcbiAgICBicmVha3BvaW50c1RhYmxlID0gbmV3QnJlYWtwb2ludHNUYWJsZTtcbiAgfTtcbiAgZnJlZXplKHNldEJyZWFrcG9pbnRzKTtcblxuICBjb25zdCBzaG91bGRCcmVha3BvaW50ID0gKHJlY2lwaWVudCwgbWV0aG9kTmFtZSkgPT4ge1xuICAgIGlmIChtZXRob2ROYW1lID09PSB1bmRlZmluZWQgfHwgbWV0aG9kTmFtZSA9PT0gbnVsbCkge1xuICAgICAgLyogVE9ETyBlbmFibGUgZnVuY3Rpb24gYnJlYWtwb2ludGluZyovXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGNsYXNzQlBzID0gYnJlYWtwb2ludHNUYWJsZVttZXRob2ROYW1lXSB8fCBicmVha3BvaW50c1RhYmxlWycqJ107XG4gICAgaWYgKGNsYXNzQlBzID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgbGV0IHRhZyA9IHNpbXBsaWZ5VGFnKHJlY2lwaWVudFtTeW1ib2wudG9TdHJpbmdUYWddKTtcbiAgICBsZXQgY291bnQgPSBjbGFzc0JQc1t0YWddO1xuICAgIGlmIChjb3VudCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0YWcgPSAnKic7XG4gICAgICBjb3VudCA9IGNsYXNzQlBzW3RhZ107XG4gICAgICBpZiAoY291bnQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChjb3VudCA9PT0gJyonKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKGNvdW50ID09PSAwKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgYXNzZXJ0KHR5cGVvZiBjb3VudCA9PT0gJ251bWJlcicgJiYgY291bnQgPj0gMSk7XG4gICAgY2xhc3NCUHNbdGFnXSA9IGNvdW50IC0gMTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG4gIGZyZWV6ZShzaG91bGRCcmVha3BvaW50KTtcblxuICBjb25zdCBicmVha3BvaW50VGVzdGVyID0gZnJlZXplKHtcbiAgICBnZXRCcmVha3BvaW50cyxcbiAgICBzZXRCcmVha3BvaW50cyxcbiAgICBzaG91bGRCcmVha3BvaW50LFxuICB9KTtcbiAgYnJlYWtwb2ludFRlc3Rlci5zZXRCcmVha3BvaW50cygpO1xuICByZXR1cm4gYnJlYWtwb2ludFRlc3Rlcjtcbn07JGjNj19vbmNlLm1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3RlcihtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIpO1xuZnJlZXplKG1ha2VNZXNzYWdlQnJlYWtwb2ludFRlc3Rlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTWVzc2FnZUJyZWFrcG9pbnRUZXN0ZXIiOlsibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAACkTVdnWBQAA1gUAACkAAABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC9zcmMvbm8tc2hpbS5qc3siaW1wb3J0cyI6WyIuL0UuanMiLCIuL2V4cG9ydHMuanMiXSwiZXhwb3J0cyI6WyJFIiwiSGFuZGxlZFByb21pc2UiXSwicmVleHBvcnRzIjpbIi4vZXhwb3J0cy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG1ha2VFOyRozY9faW1wb3J0cyhbW1wiLi9FLmpzXCIsIFtbXCJkZWZhdWx0XCIsWyRozY9fYSA9PiAobWFrZUUgPSAkaM2PX2EpXV1dXSxbXCIuL2V4cG9ydHMuanNcIiwgW11dXSk7XG5cbi8qIFhYWCBtb2R1bGUgZXhwb3J0cyBmb3IgSGFuZGxlZFByb21pc2UgZmFpbCBpZiB0aGVzZSBhcmVuJ3QgaW4gc2NvcGUqL1xuLyoqIEBpbXBvcnQge0hhbmRsZXIsIEhhbmRsZWRFeGVjdXRvcn0gZnJvbSAnLi9oYW5kbGVkLXByb21pc2UuanMnICovXG4vKiogQGltcG9ydCB7RUNhbGxhYmxlT3JNZXRob2RzLCBFR2V0dGVycywgRVJlZiwgRVJlbW90ZUZ1bmN0aW9ucywgRVNlbmRPbmx5Q2FsbGFibGVPck1ldGhvZHMsIExvY2FsUmVjb3JkLCBSZW1vdGVGdW5jdGlvbnN9IGZyb20gJy4vRS5qcycgKi9cblxuY29uc3QgaHAgPSBIYW5kbGVkUHJvbWlzZTtcblxuLyoqXG4gKiBFKHgpIHJldHVybnMgYSBwcm94eSBvbiB3aGljaCB5b3UgY2FuIGNhbGwgYXJiaXRyYXJ5IG1ldGhvZHMuIEVhY2ggb2YgdGhlc2UgbWV0aG9kIGNhbGxzIHJldHVybnMgYSBwcm9taXNlLlxuICogVGhlIG1ldGhvZCB3aWxsIGJlIGludm9rZWQgb24gd2hhdGV2ZXIgJ3gnIGRlc2lnbmF0ZXMgKG9yIHJlc29sdmVzIHRvKSBpbiBhIGZ1dHVyZSB0dXJuLCBub3QgdGhpcyBvbmUuXG4gKlxuICogRS5nZXQoeCkgcmV0dXJucyBhIHByb3h5IG9uIHdoaWNoIHlvdSBjYW4gZ2V0IGFyYml0cmFyeSBwcm9wZXJ0aWVzLiBFYWNoIG9mIHRoZXNlIHByb3BlcnRpZXMgcmV0dXJucyBhXG4gKiBwcm9taXNlIGZvciB0aGUgcHJvcGVydHkuICBUaGUgcHJvbWlzZSB2YWx1ZSB3aWxsIGJlIHRoZSBwcm9wZXJ0eSBmZXRjaGVkIGZyb20gd2hhdGV2ZXIgJ3gnIGRlc2lnbmF0ZXMgKG9yXG4gKiByZXNvbHZlcyB0bykgaW4gYSBmdXR1cmUgdHVybiwgbm90IHRoaXMgb25lLlxuICpcbiAqIEUud2hlbih4LCByZXMsIHJlaikgaXMgZXF1aXZhbGVudCB0byBIYW5kbGVkUHJvbWlzZS5yZXNvbHZlKHgpLnRoZW4ocmVzLCByZWopXG4gKi8kaM2PX29uY2UuaHAoaHApO1xuICAgICAgIGNvbnN0IEUgPSBtYWtlRShocCk7JGjNj19vbmNlLkUoRSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJIYW5kbGVkUHJvbWlzZSI6WyJocCJdLCJFIjpbIkUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAMyikjlcSAABXEgAALQAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy90cmFjay10dXJucy5qc3siaW1wb3J0cyI6WyJAZW5kby9lbnYtb3B0aW9ucyJdLCJleHBvcnRzIjpbInRyYWNrVHVybnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBnZXRFbnZpcm9ubWVudE9wdGlvbixlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZW52LW9wdGlvbnNcIiwgW1tcImdldEVudmlyb25tZW50T3B0aW9uXCIsWyRozY9fYSA9PiAoZ2V0RW52aXJvbm1lbnRPcHRpb24gPSAkaM2PX2EpXV0sW1wiZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhc1wiLFskaM2PX2EgPT4gKGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cbi8qIE5PVEU6IFdlIGNhbid0IGltcG9ydCB0aGVzZSBiZWNhdXNlIHRoZXkncmUgbm90IGluIHNjb3BlIGJlZm9yZSBsb2NrZG93bi4qL1xuLyogV2UgYWxzbyBjYW5ub3QgY3VycmVudGx5IGltcG9ydCB0aGVtIGJlY2F1c2UgaXQgd291bGQgY3JlYXRlIGEgY3ljbGljKi9cbi8qIGRlcGVuZGVuY3ksIHRob3VnaCB0aGlzIGlzIG1vcmUgZWFzaWx5IGZpeGVkLiovXG4vKiBpbXBvcnQgeyBhc3NlcnQsIFgsIEZhaWwgfSBmcm9tICdAZW5kby9lcnJvcnMnOyovXG4vKiBTZWUgYWxzbyBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzk1MTUqL1xuXG4vKiBXQVJOSU5HOiBHbG9iYWwgTXV0YWJsZSBTdGF0ZSEqL1xuLyogVGhpcyBzdGF0ZSBpcyBjb21tdW5pY2F0ZWQgdG8gYGFzc2VydGAgdGhhdCBtYWtlcyBpdCBhdmFpbGFibGUgdG8gdGhlKi9cbi8qIGNhdXNhbCBjb25zb2xlLCB3aGljaCBhZmZlY3RzIHRoZSBjb25zb2xlIGxvZyBvdXRwdXQuIE5vcm1hbGx5IHdlKi9cbi8qIHJlZ2FyZCB0aGUgYWJpbGl0eSB0byBzZWUgY29uc29sZSBsb2cgb3V0cHV0IGFzIGEgbWV0YS1sZXZlbCBwcml2aWxlZ2UqL1xuLyogYW5hbG9nb3VzIHRvIHRoZSBhYmlsaXR5IHRvIGRlYnVnLiBBc2lkZSBmcm9tIHRoYXQsIHRoaXMgbW9kdWxlIHNob3VsZCovXG4vKiBub3QgaGF2ZSBhbnkgb2JzZXJ2YWJseSBtdXRhYmxlIHN0YXRlLiovXG5cbmxldCBoaWRkZW5QcmlvckVycm9yO1xubGV0IGhpZGRlbkN1cnJlbnRUdXJuID0gMDtcbmxldCBoaWRkZW5DdXJyZW50RXZlbnQgPSAwO1xuXG4vKiBUdXJuIG9uIGlmIHlvdSBzZWVtIHRvIGJlIGxvc2luZyBlcnJvciBsb2dnaW5nIGF0IHRoZSB0b3Agb2YgdGhlIGV2ZW50IGxvb3AqL1xuY29uc3QgVkVSQk9TRSA9IGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMoJ0RFQlVHJywgJ3RyYWNrLXR1cm5zJyk7XG5cbi8qIFRyYWNrLXR1cm5zIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgYW5kIGNhbiBiZSBlbmFibGVkIGJ5IGFuIGVudmlyb25tZW50Ki9cbi8qIG9wdGlvbi4qL1xuY29uc3QgRU5BQkxFRCA9XG4gIC8qKiBAdHlwZSB7J2Rpc2FibGVkJyB8ICdlbmFibGVkJ30gKi9cbiAgKGdldEVudmlyb25tZW50T3B0aW9uKCdUUkFDS19UVVJOUycsICdkaXNhYmxlZCcsIFsnZW5hYmxlZCddKSkgPT09ICdlbmFibGVkJztcblxuLyogV2UgaG9pc3QgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgb3V0IG9mIHRyYWNrVHVybnMoKSB0byBkaXNjb3VyYWdlIHRoZSovXG4vKiBjbG9zdXJlcyBmcm9tIGhvbGRpbmcgb250byAnYXJncycgb3IgJ2Z1bmMnIGxvbmdlciB0aGFuIG5lY2Vzc2FyeSwqL1xuLyogd2hpY2ggd2UndmUgc2VlbiBjYXVzZSBIYW5kbGVkUHJvbWlzZSBhcmd1bWVudHMgdG8gYmUgcmV0YWluZWQgZm9yKi9cbi8qIGEgc3VycHJpc2luZ2x5IGxvbmcgdGltZS4qL1xuXG5jb25zdCBhZGRSZWplY3Rpb25Ob3RlID0gZGV0YWlsc05vdGUgPT4gcmVhc29uID0+IHtcbiAgaWYgKHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgZ2xvYmFsVGhpcy5hc3NlcnQubm90ZShyZWFzb24sIGRldGFpbHNOb3RlKTtcbiAgfVxuICBpZiAoVkVSQk9TRSkge1xuICAgIGNvbnNvbGUubG9nKCdSRUpFQ1RFRCBhdCB0b3Agb2YgZXZlbnQgbG9vcCcsIHJlYXNvbik7XG4gIH1cbn07XG5cbmNvbnN0IHdyYXBGdW5jdGlvbiA9XG4gIChmdW5jLCBzZW5kaW5nRXJyb3IsIFgpID0+XG4gICguLi5hcmdzKSA9PiB7XG4gICAgaGlkZGVuUHJpb3JFcnJvciA9IHNlbmRpbmdFcnJvcjtcbiAgICBoaWRkZW5DdXJyZW50VHVybiArPSAxO1xuICAgIGhpZGRlbkN1cnJlbnRFdmVudCA9IDA7XG4gICAgdHJ5IHtcbiAgICAgIGxldCByZXN1bHQ7XG4gICAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSBmdW5jKC4uLmFyZ3MpO1xuICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICAgIGdsb2JhbFRoaXMuYXNzZXJ0Lm5vdGUoXG4gICAgICAgICAgICBlcnIsXG4gICAgICAgICAgICBYYFRocm93biBmcm9tOiAke2hpZGRlblByaW9yRXJyb3J9OiR7aGlkZGVuQ3VycmVudFR1cm59LiR7aGlkZGVuQ3VycmVudEV2ZW50fWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoVkVSQk9TRSkge1xuICAgICAgICAgIGNvbnNvbGUubG9nKCdUSFJPV04gdG8gdG9wIG9mIGV2ZW50IGxvb3AnLCBlcnIpO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICAgIC8qIE11c3QgY2FwdHVyZSB0aGlzIG5vdywgbm90IHdoZW4gdGhlIGNhdGNoIHRyaWdnZXJzLiovXG4gICAgICBjb25zdCBkZXRhaWxzTm90ZSA9IFhgUmVqZWN0aW9uIGZyb206ICR7aGlkZGVuUHJpb3JFcnJvcn06JHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YDtcbiAgICAgIFByb21pc2UucmVzb2x2ZShyZXN1bHQpLmNhdGNoKGFkZFJlamVjdGlvbk5vdGUoZGV0YWlsc05vdGUpKTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGhpZGRlblByaW9yRXJyb3IgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9O1xuXG4vKipcbiAqIEdpdmVuIGEgbGlzdCBvZiBgVHVyblN0YXJ0ZXJGbmBzLCByZXR1cm5zIGEgbGlzdCBvZiBgVHVyblN0YXJ0ZXJGbmBzIHdob3NlXG4gKiBgdGhpc2AtZnJlZSBjYWxsIGJlaGF2aW9ycyBhcmUgbm90IG9ic2VydmFibHkgZGlmZmVyZW50IHRvIHRob3NlIHRoYXRcbiAqIGNhbm5vdCBzZWUgY29uc29sZSBvdXRwdXQuIFRoZSBvbmx5IHB1cnBvc2UgaXMgdG8gY2F1c2UgYWRkaXRpb25hbFxuICogaW5mb3JtYXRpb24gdG8gYXBwZWFyIG9uIHRoZSBjb25zb2xlLlxuICpcbiAqIFRoZSBjYWxsIHRvIGB0cmFja1R1cm5zYCBpcyBpdHNlbGYgYSBzZW5kaW5nIGV2ZW50LCB0aGF0IG9jY3VycyBpbiBzb21lIGNhbGxcbiAqIHN0YWNrIGluIHNvbWUgdHVybiBudW1iZXIgYXQgc29tZSBldmVudCBudW1iZXIgd2l0aGluIHRoYXQgdHVybi4gRWFjaCBjYWxsXG4gKiB0byBhbnkgb2YgdGhlIHJldHVybmVkIGBUdXJuU3RhcnRGbmBzIGlzIGEgcmVjZWl2aW5nIGV2ZW50IHRoYXQgYmVnaW5zIGEgbmV3XG4gKiB0dXJuLiBUaGlzIHNlbmRpbmcgZXZlbnQgY2F1c2VkIGVhY2ggb2YgdGhvc2UgcmVjZWl2aW5nIGV2ZW50cy5cbiAqXG4gKiBAdGVtcGxhdGUge1R1cm5TdGFydGVyRm5bXX0gVFxuICogQHBhcmFtIHtUfSBmdW5jc1xuICogQHJldHVybnMge1R9XG4gKi9cbiAgICAgICBjb25zdCB0cmFja1R1cm5zID0gZnVuY3MgPT4ge1xuICBpZiAoIUVOQUJMRUQgfHwgdHlwZW9mIGdsb2JhbFRoaXMgPT09ICd1bmRlZmluZWQnIHx8ICFnbG9iYWxUaGlzLmFzc2VydCkge1xuICAgIHJldHVybiBmdW5jcztcbiAgfVxuICBjb25zdCB7IGRldGFpbHM6IFgsIG5vdGU6IGFubm90YXRlRXJyb3IgfSA9IGdsb2JhbFRoaXMuYXNzZXJ0O1xuXG4gIGhpZGRlbkN1cnJlbnRFdmVudCArPSAxO1xuICBjb25zdCBzZW5kaW5nRXJyb3IgPSBFcnJvcihcbiAgICBgRXZlbnQ6ICR7aGlkZGVuQ3VycmVudFR1cm59LiR7aGlkZGVuQ3VycmVudEV2ZW50fWAsXG4gICk7XG4gIGlmIChoaWRkZW5QcmlvckVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICBhbm5vdGF0ZUVycm9yKHNlbmRpbmdFcnJvciwgWGBDYXVzZWQgYnk6ICR7aGlkZGVuUHJpb3JFcnJvcn1gKTtcbiAgfVxuXG4gIHJldHVybiAvKiogQHR5cGUge1R9ICovIChcbiAgICBmdW5jcy5tYXAoZnVuYyA9PiBmdW5jICYmIHdyYXBGdW5jdGlvbihmdW5jLCBzZW5kaW5nRXJyb3IsIFgpKVxuICApO1xufTtcblxuLyoqXG4gKiBBbiBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IGlzIG5vdCB0aGlzLXNlbnNpdGl2ZSwgZXhwZWN0ZWQgdG8gYmUgY2FsbGVkIGF0XG4gKiBib3R0b20gb2Ygc3RhY2sgdG8gc3RhcnQgYSBuZXcgdHVybi5cbiAqXG4gKiBAdHlwZWRlZiB7KCguLi5hcmdzOiBhbnlbXSkgPT4gYW55KSB8IHVuZGVmaW5lZH0gVHVyblN0YXJ0ZXJGblxuICovJGjNj19vbmNlLnRyYWNrVHVybnModHJhY2tUdXJucyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJ0cmFja1R1cm5zIjpbInRyYWNrVHVybnMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAe6GgR2QCAABkAgAAIwAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3V0aWxzLmpzeyJpbXBvcnRzIjpbIi4vc3JjL2xvY2FsLmpzIiwiLi9zcmMvbWVzc2FnZS1icmVha3BvaW50cy5qcyJdLCJleHBvcnRzIjpbbnVsbCxudWxsXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvbG9jYWwuanNcIiwgW11dLFtcIi4vc3JjL21lc3NhZ2UtYnJlYWtwb2ludHMuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9sb2NhbC5qcyI6W1siZ2V0TWV0aG9kTmFtZXMiLCJnZXRNZXRob2ROYW1lcyJdXSwiLi9zcmMvbWVzc2FnZS1icmVha3BvaW50cy5qcyI6W1sibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyIiwibWFrZU1lc3NhZ2VCcmVha3BvaW50VGVzdGVyIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADcRdmjYAIAAGACAAAaAAAAQGVuZG8vZXhvLXYxLjUuMTIvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvZXhvLW1ha2Vycy5qcyIsIi4vc3JjL3R5cGVzLmpzIiwiLi9zcmMvZ2V0LWludGVyZmFjZS5qcyJdLCJleHBvcnRzIjpbbnVsbF0sInJlZXhwb3J0cyI6WyIuL3NyYy9leG8tbWFrZXJzLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9zcmMvZXhvLW1ha2Vycy5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dLFtcIi4vc3JjL2dldC1pbnRlcmZhY2UuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9nZXQtaW50ZXJmYWNlLmpzIjpbWyJHRVRfSU5URVJGQUNFX0dVQVJEIiwiR0VUX0lOVEVSRkFDRV9HVUFSRCJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAsZMQ/xAgAAAQIAAAIwAAAEBlbmRvL2V4by12MS41LjEyL3NyYy9leG8tbWFrZXJzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIiwiQGVuZG8vZW52LW9wdGlvbnMiLCJAZW5kby9lcnJvcnMiLCIuL2V4by10b29scy5qcyJdLCJleHBvcnRzIjpbImRlZmluZUV4b0NsYXNzIiwiZGVmaW5lRXhvQ2xhc3NLaXQiLCJpbml0RW1wdHkiLCJtYWtlRXhvIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgb2JqZWN0TWFwLGVudmlyb25tZW50T3B0aW9uc0xpc3RIYXMsRmFpbCxxLGRlZmVuZFByb3RvdHlwZSxkZWZlbmRQcm90b3R5cGVLaXQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qc1wiLCBbW1wib2JqZWN0TWFwXCIsWyRozY9fYSA9PiAob2JqZWN0TWFwID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZW52LW9wdGlvbnNcIiwgW1tcImVudmlyb25tZW50T3B0aW9uc0xpc3RIYXNcIixbJGjNj19hID0+IChlbnZpcm9ubWVudE9wdGlvbnNMaXN0SGFzID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIi4vZXhvLXRvb2xzLmpzXCIsIFtbXCJkZWZlbmRQcm90b3R5cGVcIixbJGjNj19hID0+IChkZWZlbmRQcm90b3R5cGUgPSAkaM2PX2EpXV0sW1wiZGVmZW5kUHJvdG90eXBlS2l0XCIsWyRozY9fYSA9PiAoZGVmZW5kUHJvdG90eXBlS2l0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0FtcGxpZnksIEV4b0NsYXNzS2l0TWV0aG9kcywgRXhvQ2xhc3NNZXRob2RzLCBGYXJDbGFzc09wdGlvbnMsIEd1YXJkZWQsIEd1YXJkZWRLaXQsIEV4b0NsYXNzSW50ZXJmYWNlR3VhcmRLaXQsIElzSW5zdGFuY2UsIEtpdENvbnRleHQsIEV4b0NsYXNzSW50ZXJmYWNlR3VhcmQsIE1ldGhvZHMsIEZhY2V0TmFtZX0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKi9cblxuY29uc3QgeyBjcmVhdGUsIHNlYWwsIGZyZWV6ZSwgZGVmaW5lUHJvcGVydHksIHZhbHVlcyB9ID0gT2JqZWN0O1xuXG4vKiBUdXJuIG9uIHRvIGdpdmUgZWFjaCBleG8gaW5zdGFuY2UgaXRzIG93biB0b1N0cmluZ1RhZyB2YWx1ZS4qL1xuY29uc3QgTEFCRUxfSU5TVEFOQ0VTID0gZW52aXJvbm1lbnRPcHRpb25zTGlzdEhhcygnREVCVUcnLCAnbGFiZWwtaW5zdGFuY2VzJyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHt7fX0gVFxuICogQHBhcmFtIHtUfSBwcm90b1xuICogQHBhcmFtIHtudW1iZXJ9IGluc3RhbmNlQ291bnRcbiAqIEByZXR1cm5zIHtUfVxuICovXG5jb25zdCBtYWtlU2VsZiA9IChwcm90bywgaW5zdGFuY2VDb3VudCkgPT4ge1xuICBjb25zdCBzZWxmID0gY3JlYXRlKHByb3RvKTtcbiAgaWYgKExBQkVMX0lOU1RBTkNFUykge1xuICAgIGRlZmluZVByb3BlcnR5KHNlbGYsIFN5bWJvbC50b1N0cmluZ1RhZywge1xuICAgICAgdmFsdWU6IGAke3Byb3RvW1N5bWJvbC50b1N0cmluZ1RhZ119IyR7aW5zdGFuY2VDb3VudH1gLFxuICAgICAgd3JpdGFibGU6IGZhbHNlLFxuICAgICAgZW51bWVyYWJsZTogZmFsc2UsXG4gICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgIH0pO1xuICB9XG4gIHJldHVybiBoYXJkZW4oc2VsZik7XG59O1xuXG5jb25zdCBlbXB0eVJlY29yZCA9IGhhcmRlbih7fSk7XG5cbi8qKlxuICogV2hlbiBjYWxsaW5nIGBkZWZpbmVEdXJhYmxlS2luZGAgYW5kXG4gKiBpdHMgc2libGluZ3MsIHVzZWQgYXMgdGhlIGBpbml0YCBmdW5jdGlvbiBhcmd1bWVudCB0byBpbmRpY2F0ZSB0aGF0IHRoZVxuICogc3RhdGUgcmVjb3JkIG9mIHRoZSAodmlydHVhbC9kdXJhYmxlKSBpbnN0YW5jZXMgb2YgdGhlIGtpbmQvZXhvQ2xhc3NcbiAqIHNob3VsZCBiZSBlbXB0eSwgYW5kIHRoYXQgdGhlIHJldHVybmVkIG1ha2VyIGZ1bmN0aW9uIHNob3VsZCBoYXZlIHplcm9cbiAqIHBhcmFtZXRlcnMuXG4gKlxuICogQHJldHVybnMge3t9fVxuICovXG4gICAgICAgY29uc3QgaW5pdEVtcHR5ID0gKCkgPT4gZW1wdHlSZWNvcmQ7XG5cbi8qKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gSSBpbml0IGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUge01ldGhvZHN9IE0gbWV0aG9kc1xuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHtFeG9DbGFzc0ludGVyZmFjZUd1YXJkPE0+IHwgdW5kZWZpbmVkfSBpbnRlcmZhY2VHdWFyZFxuICogQHBhcmFtIHtJfSBpbml0XG4gKiBAcGFyYW0ge0V4b0NsYXNzTWV0aG9kczxNLCBJPn0gbWV0aG9kc1xuICogQHBhcmFtIHtGYXJDbGFzc09wdGlvbnM8SU1QT1JUKCcuL3R5cGVzLmpzJykuQ2xhc3NDb250ZXh0PFJldHVyblR5cGU8ST4sIE0+Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IEd1YXJkZWQ8TT59XG4gKi8kaM2PX29uY2UuaW5pdEVtcHR5KGluaXRFbXB0eSk7XG4gICAgICAgY29uc3QgZGVmaW5lRXhvQ2xhc3MgPSAoXG4gIHRhZyxcbiAgaW50ZXJmYWNlR3VhcmQsXG4gIGluaXQsXG4gIG1ldGhvZHMsXG4gIG9wdGlvbnMgPSB7fSxcbikgPT4ge1xuICBoYXJkZW4obWV0aG9kcyk7XG4gIGNvbnN0IHtcbiAgICBmaW5pc2ggPSB1bmRlZmluZWQsXG4gICAgcmVjZWl2ZUFtcGxpZmllciA9IHVuZGVmaW5lZCxcbiAgICByZWNlaXZlSW5zdGFuY2VUZXN0ZXIgPSB1bmRlZmluZWQsXG4gIH0gPSBvcHRpb25zO1xuICByZWNlaXZlQW1wbGlmaWVyID09PSB1bmRlZmluZWQgfHxcbiAgICBGYWlsYE9ubHkgZmFjZXRzIG9mIGFuIGV4byBjbGFzcyBraXQgY2FuIGJlIGFtcGxpZmllZCAke3EodGFnKX1gO1xuXG4gIC8qKiBAdHlwZSB7V2Vha01hcDxNLCBJTVBPUlQoJy4vdHlwZXMuanMnKS5DbGFzc0NvbnRleHQ8UmV0dXJuVHlwZTxJPiwgTT4+fSAqL1xuICBjb25zdCBjb250ZXh0TWFwID0gbmV3IFdlYWtNYXAoKTtcbiAgY29uc3QgcHJvdG8gPSBkZWZlbmRQcm90b3R5cGUoXG4gICAgdGFnLFxuICAgIHNlbGYgPT4gLyoqIEB0eXBlIHthbnl9ICovIChjb250ZXh0TWFwLmdldChzZWxmKSksXG4gICAgbWV0aG9kcyxcbiAgICB0cnVlLFxuICAgIGludGVyZmFjZUd1YXJkLFxuICApO1xuICBsZXQgaW5zdGFuY2VDb3VudCA9IDA7XG4gIC8qKlxuICogQHBhcmFtICB7UGFyYW1ldGVyczxJPn0gYXJnc1xuICovXG4gIGNvbnN0IG1ha2VJbnN0YW5jZSA9ICguLi5hcmdzKSA9PiB7XG4gICAgLyogQmUgY2FyZWZ1bCBub3QgdG8gZnJlZXplIHRoZSBzdGF0ZSByZWNvcmQqL1xuICAgIGNvbnN0IHN0YXRlID0gc2VhbChpbml0KC4uLmFyZ3MpKTtcbiAgICBpbnN0YW5jZUNvdW50ICs9IDE7XG4gICAgY29uc3Qgc2VsZiA9IG1ha2VTZWxmKHByb3RvLCBpbnN0YW5jZUNvdW50KTtcblxuICAgIC8qIEJlIGNhcmVmdWwgbm90IHRvIGZyZWV6ZSB0aGUgc3RhdGUgcmVjb3JkKi9cbiAgICAvKiogQHR5cGUge0lNUE9SVCgnLi90eXBlcy5qcycpLkNsYXNzQ29udGV4dDxSZXR1cm5UeXBlPEk+LE0+fSAqL1xuICAgIGNvbnN0IGNvbnRleHQgPSBmcmVlemUoeyBzdGF0ZSwgc2VsZiB9KTtcbiAgICBjb250ZXh0TWFwLnNldChzZWxmLCBjb250ZXh0KTtcbiAgICBpZiAoZmluaXNoKSB7XG4gICAgICBmaW5pc2goY29udGV4dCk7XG4gICAgfVxuICAgIHJldHVybiBzZWxmO1xuICB9O1xuXG4gIGlmIChyZWNlaXZlSW5zdGFuY2VUZXN0ZXIpIHtcbiAgICAvKiogQHR5cGUge0lzSW5zdGFuY2V9ICovXG4gICAgY29uc3QgaXNJbnN0YW5jZSA9IChleG8sIGZhY2V0TmFtZSA9IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgZmFjZXROYW1lID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgRmFpbGBmYWNldE5hbWUgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIGFuIGV4byBjbGFzcyBraXQ6ICR7cShcbiAgICAgICAgICB0YWcsXG4gICAgICAgICl9IGhhcyBubyBmYWNldCAke3EoZmFjZXROYW1lKX1gO1xuICAgICAgcmV0dXJuIGNvbnRleHRNYXAuaGFzKGV4byk7XG4gICAgfTtcbiAgICBoYXJkZW4oaXNJbnN0YW5jZSk7XG4gICAgcmVjZWl2ZUluc3RhbmNlVGVzdGVyKGlzSW5zdGFuY2UpO1xuICB9XG5cbiAgcmV0dXJuIGhhcmRlbihtYWtlSW5zdGFuY2UpO1xufTskaM2PX29uY2UuZGVmaW5lRXhvQ2xhc3MoZGVmaW5lRXhvQ2xhc3MpO1xuaGFyZGVuKGRlZmluZUV4b0NsYXNzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBJIGluaXQgZnVuY3Rpb25cbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPEZhY2V0TmFtZSwgTWV0aG9kcz59IEYgZmFjZXQgbWV0aG9kc1xuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHtFeG9DbGFzc0ludGVyZmFjZUd1YXJkS2l0PEY+IHwgdW5kZWZpbmVkIH0gaW50ZXJmYWNlR3VhcmRLaXRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtFeG9DbGFzc0tpdE1ldGhvZHM8RiwgST59IG1ldGhvZHNLaXRcbiAqIEBwYXJhbSB7RmFyQ2xhc3NPcHRpb25zPFxuICogICBLaXRDb250ZXh0PFJldHVyblR5cGU8ST4sIEd1YXJkZWRLaXQ8Rj4+LFxuICogICBHdWFyZGVkS2l0PEY+XG4gKiA+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gR3VhcmRlZEtpdDxGPn1cbiAqL1xuICAgICAgIGNvbnN0IGRlZmluZUV4b0NsYXNzS2l0ID0gKFxuICB0YWcsXG4gIGludGVyZmFjZUd1YXJkS2l0LFxuICBpbml0LFxuICBtZXRob2RzS2l0LFxuICBvcHRpb25zID0ge30sXG4pID0+IHtcbiAgaGFyZGVuKG1ldGhvZHNLaXQpO1xuICBjb25zdCB7XG4gICAgZmluaXNoID0gdW5kZWZpbmVkLFxuICAgIHJlY2VpdmVBbXBsaWZpZXIgPSB1bmRlZmluZWQsXG4gICAgcmVjZWl2ZUluc3RhbmNlVGVzdGVyID0gdW5kZWZpbmVkLFxuICB9ID0gb3B0aW9ucztcbiAgY29uc3QgY29udGV4dE1hcEtpdCA9IG9iamVjdE1hcChtZXRob2RzS2l0LCAoKSA9PiBuZXcgV2Vha01hcCgpKTtcbiAgY29uc3QgZ2V0Q29udGV4dEtpdCA9IG9iamVjdE1hcChcbiAgICBjb250ZXh0TWFwS2l0LFxuICAgIGNvbnRleHRNYXAgPT4gZmFjZXQgPT4gY29udGV4dE1hcC5nZXQoZmFjZXQpLFxuICApO1xuICBjb25zdCBwcm90b3R5cGVLaXQgPSBkZWZlbmRQcm90b3R5cGVLaXQoXG4gICAgdGFnLFxuICAgIGdldENvbnRleHRLaXQsXG4gICAgbWV0aG9kc0tpdCxcbiAgICB0cnVlLFxuICAgIGludGVyZmFjZUd1YXJkS2l0LFxuICApO1xuICBsZXQgaW5zdGFuY2VDb3VudCA9IDA7XG4gIC8qKlxuICogQHBhcmFtIHtQYXJhbWV0ZXJzPEk+fSBhcmdzXG4gKi9cbiAgY29uc3QgbWFrZUluc3RhbmNlS2l0ID0gKC4uLmFyZ3MpID0+IHtcbiAgICAvKiBCZSBjYXJlZnVsIG5vdCB0byBmcmVlemUgdGhlIHN0YXRlIHJlY29yZCovXG4gICAgY29uc3Qgc3RhdGUgPSBzZWFsKGluaXQoLi4uYXJncykpO1xuICAgIC8qIERvbid0IGZyZWV6ZSBjb250ZXh0IHVudGlsIHdlIGFkZCBmYWNldHMqL1xuICAgIC8qKiBAdHlwZSB7eyBzdGF0ZTogUmV0dXJuVHlwZTxJPiwgZmFjZXRzOiBhbnkgfX0gKi9cbiAgICBjb25zdCBjb250ZXh0ID0geyBzdGF0ZSwgZmFjZXRzOiBudWxsIH07XG4gICAgaW5zdGFuY2VDb3VudCArPSAxO1xuICAgIGNvbnN0IGZhY2V0cyA9IG9iamVjdE1hcChwcm90b3R5cGVLaXQsIChwcm90bywgZmFjZXROYW1lKSA9PiB7XG4gICAgICBjb25zdCBzZWxmID0gbWFrZVNlbGYocHJvdG8sIGluc3RhbmNlQ291bnQpO1xuICAgICAgY29udGV4dE1hcEtpdFtmYWNldE5hbWVdLnNldChzZWxmLCBjb250ZXh0KTtcbiAgICAgIHJldHVybiBzZWxmO1xuICAgIH0pO1xuICAgIGNvbnRleHQuZmFjZXRzID0gZmFjZXRzO1xuICAgIC8qIEJlIGNhcmVmdWwgbm90IHRvIGZyZWV6ZSB0aGUgc3RhdGUgcmVjb3JkKi9cbiAgICBmcmVlemUoY29udGV4dCk7XG4gICAgaWYgKGZpbmlzaCkge1xuICAgICAgZmluaXNoKGNvbnRleHQpO1xuICAgIH1cbiAgICByZXR1cm4gLyoqIEB0eXBlIHtHdWFyZGVkS2l0PEY+fSAqLyAoY29udGV4dC5mYWNldHMpO1xuICB9O1xuXG4gIGlmIChyZWNlaXZlQW1wbGlmaWVyKSB7XG4gICAgLyoqIEB0eXBlIHtBbXBsaWZ5fSAqL1xuICAgIGNvbnN0IGFtcGxpZnkgPSBleG9GYWNldCA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGNvbnRleHRNYXAgb2YgdmFsdWVzKGNvbnRleHRNYXBLaXQpKSB7XG4gICAgICAgIGlmIChjb250ZXh0TWFwLmhhcyhleG9GYWNldCkpIHtcbiAgICAgICAgICBjb25zdCB7IGZhY2V0cyB9ID0gY29udGV4dE1hcC5nZXQoZXhvRmFjZXQpO1xuICAgICAgICAgIHJldHVybiBmYWNldHM7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHRocm93IEZhaWxgTXVzdCBiZSBhIGZhY2V0IG9mICR7cSh0YWcpfTogJHtleG9GYWNldH1gO1xuICAgIH07XG4gICAgaGFyZGVuKGFtcGxpZnkpO1xuICAgIHJlY2VpdmVBbXBsaWZpZXIoYW1wbGlmeSk7XG4gIH1cblxuICBpZiAocmVjZWl2ZUluc3RhbmNlVGVzdGVyKSB7XG4gICAgLyoqIEB0eXBlIHtJc0luc3RhbmNlfSAqL1xuICAgIGNvbnN0IGlzSW5zdGFuY2UgPSAoZXhvRmFjZXQsIGZhY2V0TmFtZSA9IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgaWYgKGZhY2V0TmFtZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZXMoY29udGV4dE1hcEtpdCkuc29tZShjb250ZXh0TWFwID0+XG4gICAgICAgICAgY29udGV4dE1hcC5oYXMoZXhvRmFjZXQpLFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgYXNzZXJ0LnR5cGVvZihmYWNldE5hbWUsICdzdHJpbmcnKTtcbiAgICAgIGNvbnN0IGNvbnRleHRNYXAgPSBjb250ZXh0TWFwS2l0W2ZhY2V0TmFtZV07XG4gICAgICBjb250ZXh0TWFwICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgRmFpbGBleG8gY2xhc3Mga2l0ICR7cSh0YWcpfSBoYXMgbm8gZmFjZXQgbmFtZWQgJHtxKGZhY2V0TmFtZSl9YDtcbiAgICAgIHJldHVybiBjb250ZXh0TWFwLmhhcyhleG9GYWNldCk7XG4gICAgfTtcbiAgICBoYXJkZW4oaXNJbnN0YW5jZSk7XG4gICAgcmVjZWl2ZUluc3RhbmNlVGVzdGVyKGlzSW5zdGFuY2UpO1xuICB9XG5cbiAgcmV0dXJuIGhhcmRlbihtYWtlSW5zdGFuY2VLaXQpO1xufTskaM2PX29uY2UuZGVmaW5lRXhvQ2xhc3NLaXQoZGVmaW5lRXhvQ2xhc3NLaXQpO1xuaGFyZGVuKGRlZmluZUV4b0NsYXNzS2l0KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge01ldGhvZHN9IFRcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7SU1QT1JUKCdAZW5kby9wYXR0ZXJucycpLkludGVyZmFjZUd1YXJkPHtcbiAqICAgW00gaW4ga2V5b2YgVF06IElNUE9SVCgnQGVuZG8vcGF0dGVybnMnKS5NZXRob2RHdWFyZFxuICogfT4gfCB1bmRlZmluZWR9IGludGVyZmFjZUd1YXJkIENBVkVBVDogc3RhdGljIHR5cGluZyBkb2VzIG5vdCB5ZXQgc3VwcG9ydCBgY2FsbFdoZW5gIHRyYW5zZm9ybWF0aW9uXG4gKiBAcGFyYW0ge1R9IG1ldGhvZHNcbiAqIEBwYXJhbSB7RmFyQ2xhc3NPcHRpb25zPElNUE9SVCgnLi90eXBlcy5qcycpLkNsYXNzQ29udGV4dDx7fSxUPj59IFtvcHRpb25zXVxuICogQHJldHVybnMge0d1YXJkZWQ8VD59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlRXhvID0gKHRhZywgaW50ZXJmYWNlR3VhcmQsIG1ldGhvZHMsIG9wdGlvbnMgPSB1bmRlZmluZWQpID0+IHtcbiAgY29uc3QgbWFrZUluc3RhbmNlID0gZGVmaW5lRXhvQ2xhc3MoXG4gICAgdGFnLFxuICAgIGludGVyZmFjZUd1YXJkLFxuICAgIGluaXRFbXB0eSxcbiAgICBtZXRob2RzLFxuICAgIG9wdGlvbnMsXG4gICk7XG4gIHJldHVybiBtYWtlSW5zdGFuY2UoKTtcbn07JGjNj19vbmNlLm1ha2VFeG8obWFrZUV4byk7XG5oYXJkZW4obWFrZUV4byk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpbml0RW1wdHkiOlsiaW5pdEVtcHR5Il0sImRlZmluZUV4b0NsYXNzIjpbImRlZmluZUV4b0NsYXNzIl0sImRlZmluZUV4b0NsYXNzS2l0IjpbImRlZmluZUV4b0NsYXNzS2l0Il0sIm1ha2VFeG8iOlsibWFrZUV4byJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAVo/7rLkYAAC5GAAAiAAAAQGVuZG8vZXhvLXYxLjUuMTIvc3JjL2V4by10b29scy5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL3BhdHRlcm5zIiwiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qcyIsIkBlbmRvL2NvbW1vbi9vYmplY3QtbWFwLmpzIiwiQGVuZG8vZXJyb3JzIiwiLi9nZXQtaW50ZXJmYWNlLmpzIl0sImV4cG9ydHMiOlsiZGVmZW5kUHJvdG90eXBlIiwiZGVmZW5kUHJvdG90eXBlS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRSxnZXRSZW1vdGFibGVNZXRob2ROYW1lcyx0b1Rocm93YWJsZSxGYXIsbXVzdE1hdGNoLE0saXNBd2FpdEFyZ0d1YXJkLGlzUmF3R3VhcmQsZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQsZ2V0TWV0aG9kR3VhcmRQYXlsb2FkLGdldEludGVyZmFjZUd1YXJkUGF5bG9hZCxnZXRDb3B5TWFwRW50cmllcyxsaXN0RGlmZmVyZW5jZSxvYmplY3RNYXAscSxGYWlsLEdFVF9JTlRFUkZBQ0VfR1VBUkQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImdldFJlbW90YWJsZU1ldGhvZE5hbWVzXCIsWyRozY9fYSA9PiAoZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMgPSAkaM2PX2EpXV0sW1widG9UaHJvd2FibGVcIixbJGjNj19hID0+ICh0b1Rocm93YWJsZSA9ICRozY9fYSldXSxbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXR0ZXJuc1wiLCBbW1wibXVzdE1hdGNoXCIsWyRozY9fYSA9PiAobXVzdE1hdGNoID0gJGjNj19hKV1dLFtcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcImlzQXdhaXRBcmdHdWFyZFwiLFskaM2PX2EgPT4gKGlzQXdhaXRBcmdHdWFyZCA9ICRozY9fYSldXSxbXCJpc1Jhd0d1YXJkXCIsWyRozY9fYSA9PiAoaXNSYXdHdWFyZCA9ICRozY9fYSldXSxbXCJnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZFwiLFskaM2PX2EgPT4gKGdldEF3YWl0QXJnR3VhcmRQYXlsb2FkID0gJGjNj19hKV1dLFtcImdldE1ldGhvZEd1YXJkUGF5bG9hZFwiLFskaM2PX2EgPT4gKGdldE1ldGhvZEd1YXJkUGF5bG9hZCA9ICRozY9fYSldXSxbXCJnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWRcIixbJGjNj19hID0+IChnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQgPSAkaM2PX2EpXV0sW1wiZ2V0Q29weU1hcEVudHJpZXNcIixbJGjNj19hID0+IChnZXRDb3B5TWFwRW50cmllcyA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9saXN0LWRpZmZlcmVuY2UuanNcIiwgW1tcImxpc3REaWZmZXJlbmNlXCIsWyRozY9fYSA9PiAobGlzdERpZmZlcmVuY2UgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qc1wiLCBbW1wib2JqZWN0TWFwXCIsWyRozY9fYSA9PiAob2JqZWN0TWFwID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vZ2V0LWludGVyZmFjZS5qc1wiLCBbW1wiR0VUX0lOVEVSRkFDRV9HVUFSRFwiLFskaM2PX2EgPT4gKEdFVF9JTlRFUkZBQ0VfR1VBUkQgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1JlbW90YWJsZU1ldGhvZE5hbWV9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnO1xuICogQGltcG9ydCB7SW50ZXJmYWNlR3VhcmQsIE1ldGhvZCwgTWV0aG9kR3VhcmQsIE1ldGhvZEd1YXJkUGF5bG9hZCwgRGVmYXVsdEd1YXJkVHlwZX0gZnJvbSAnQGVuZG8vcGF0dGVybnMnXG4gKiBAaW1wb3J0IHtDbGFzc0NvbnRleHQsIENvbnRleHRQcm92aWRlciwgRmFjZXROYW1lLCBLaXRDb250ZXh0LCBLaXRDb250ZXh0UHJvdmlkZXIsIE1hdGNoQ29uZmlnLCBNZXRob2RzfSBmcm9tICcuL3R5cGVzLmpzJ1xuICogQGltcG9ydCB7R2V0SW50ZXJmYWNlR3VhcmR9IGZyb20gJy4vZ2V0LWludGVyZmFjZS5qcyc7XG4gKi9cblxuY29uc3QgeyBhcHBseSwgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgZGVmaW5lUHJvcGVydGllcywgZnJvbUVudHJpZXMsIGhhc093biB9ID0gT2JqZWN0O1xuXG4vKipcbiAqIEEgbWV0aG9kIGd1YXJkLCBmb3IgaW5jbHVzaW9uIGluIGFuIGludGVyZmFjZSBndWFyZCwgdGhhdCBkb2VzIG5vdFxuICogZW5mb3JjZSBhbnkgY29uc3RyYWludHMgb2YgaW5jb21pbmcgYXJndW1lbnRzIG9yIHJldHVybiByZXN1bHRzLlxuICovXG5jb25zdCBSYXdNZXRob2RHdWFyZCA9IE0uY2FsbCgpLnJlc3QoTS5yYXcoKSkucmV0dXJucyhNLnJhdygpKTtcblxuY29uc3QgUkVEQUNURURfUkFXX0FSRyA9ICc8cmVkYWN0ZWQgcmF3IGFyZz4nO1xuXG4vKipcbiAqIEEgbWV0aG9kIGd1YXJkLCBmb3IgaW5jbHVzaW9uIGluIGFuIGludGVyZmFjZSBndWFyZCwgdGhhdCBlbmZvcmNlcyBvbmx5IHRoYXRcbiAqIGFsbCBhcmd1bWVudHMgYXJlIHBhc3NhYmxlIGFuZCB0aGF0IHRoZSByZXN1bHQgaXMgcGFzc2FibGUuIChJbiBmYXIgY2xhc3NlcyxcbiAqIFwiYW55XCIgbWVhbnMgYW55ICpwYXNzYWJsZSouKSBUaGlzIGlzIHRoZSBsZWFzdCBwb3NzaWJsZSBub24tcmF3XG4gKiBlbmZvcmNlbWVudCBmb3IgYSBtZXRob2QgZ3VhcmQsIGFuZCBpcyBpbXBsaWVkIGJ5IGFsbCBvdGhlclxuICogbm9uLXJhdyBtZXRob2QgZ3VhcmRzLlxuICovXG5jb25zdCBQYXNzYWJsZU1ldGhvZEd1YXJkID0gTS5jYWxsKCkucmVzdChNLmFueSgpKS5yZXR1cm5zKE0uYW55KCkpO1xuXG4vKipcbiAqIEBwYXJhbSB7SU1QT1JUKCdAZW5kby9wYXNzLXN0eWxlJykuUGFzc2FibGVbXX0gc3luY0FyZ3NcbiAqIEBwYXJhbSB7TWF0Y2hDb25maWd9IG1hdGNoQ29uZmlnXG4gKiBAcGFyYW0ge3N0cmluZ30gW2xhYmVsXVxuICogQHJldHVybnMge0lNUE9SVCgnQGVuZG8vcGFzcy1zdHlsZScpLlBhc3NhYmxlW119IFJldHVybnMgdGhlIGFyZ3MgdGhhdCBzaG91bGQgYmUgcGFzc2VkIHRvIHRoZSByYXcgbWV0aG9kLlxuICovXG5jb25zdCBkZWZlbmRTeW5jQXJncyA9IChzeW5jQXJncywgbWF0Y2hDb25maWcsIGxhYmVsID0gdW5kZWZpbmVkKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBkZWNsYXJlZExlbixcbiAgICBoYXNSZXN0QXJnR3VhcmQsXG4gICAgcmVzdEFyZ0d1YXJkSXNSYXcsXG4gICAgcGFyYW1zUGF0dGVybixcbiAgICByZWRhY3RlZEluZGljZXMsXG4gIH0gPSBtYXRjaENvbmZpZztcblxuICAvKiBVc2Ugc3luY0FyZ3MgaWYgcG9zc2libGUsIGJ1dCBjb3B5IGl0IHdoZW4gbmVjZXNzYXJ5IHRvIGltcGxlbWVudCovXG4gIC8qIHJlZGFjdGlvbnMuKi9cbiAgbGV0IG1hdGNoYWJsZUFyZ3MgPSBzeW5jQXJncztcbiAgaWYgKHJlc3RBcmdHdWFyZElzUmF3ICYmIHN5bmNBcmdzLmxlbmd0aCA+IGRlY2xhcmVkTGVuKSB7XG4gICAgY29uc3QgcmVzdExlbiA9IHN5bmNBcmdzLmxlbmd0aCAtIGRlY2xhcmVkTGVuO1xuICAgIGNvbnN0IHJlZGFjdGVkUmVzdCA9IEFycmF5KHJlc3RMZW4pLmZpbGwoUkVEQUNURURfUkFXX0FSRyk7XG4gICAgbWF0Y2hhYmxlQXJncyA9IFsuLi5zeW5jQXJncy5zbGljZSgwLCBkZWNsYXJlZExlbiksIC4uLnJlZGFjdGVkUmVzdF07XG4gIH0gZWxzZSBpZiAoXG4gICAgcmVkYWN0ZWRJbmRpY2VzLmxlbmd0aCA+IDAgJiZcbiAgICByZWRhY3RlZEluZGljZXNbMF0gPCBzeW5jQXJncy5sZW5ndGhcbiAgKSB7XG4gICAgLyogQ29weSB0aGUgYXJndW1lbnRzIGFycmF5LCBhdm9pZGluZyBoYXJkZW5pbmcgdGhlIHJlZGFjdGVkIG9uZXMgKHdoaWNoIGFyZSovXG4gICAgLyogdHJpdmlhbGx5IG1hdGNoZWQgdXNpbmcgUkVEQUNURURfUkFXX0FSRyBhcyBhIHNlbnRpbmVsIHZhbHVlKS4qL1xuICAgIG1hdGNoYWJsZUFyZ3MgPSBbLi4uc3luY0FyZ3NdO1xuICB9XG5cbiAgZm9yIChjb25zdCBpIG9mIHJlZGFjdGVkSW5kaWNlcykge1xuICAgIGlmIChpID49IG1hdGNoYWJsZUFyZ3MubGVuZ3RoKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgbWF0Y2hhYmxlQXJnc1tpXSA9IFJFREFDVEVEX1JBV19BUkc7XG4gIH1cblxuICBtdXN0TWF0Y2goaGFyZGVuKG1hdGNoYWJsZUFyZ3MpLCBwYXJhbXNQYXR0ZXJuLCBsYWJlbCk7XG5cbiAgaWYgKGhhc1Jlc3RBcmdHdWFyZCkge1xuICAgIHJldHVybiBzeW5jQXJncztcbiAgfVxuICBzeW5jQXJncy5sZW5ndGggPD0gZGVjbGFyZWRMZW4gfHxcbiAgICBGYWlsYCR7cShsYWJlbCl9IGFjY2VwdHMgYXQgbW9zdCAke3EoZGVjbGFyZWRMZW4pfSBhcmd1bWVudHMsIG5vdCAke3EoXG4gICAgICBzeW5jQXJncy5sZW5ndGgsXG4gICAgKX06ICR7c3luY0FyZ3N9YDtcbiAgcmV0dXJuIHN5bmNBcmdzO1xufTtcblxuLyoqXG4gKiBDb252ZXJ0IGEgbWV0aG9kIGd1YXJkIHRvIGEgbWF0Y2ggY29uZmlnIGZvciBtb3JlIGVmZmljaWVudCBwZXItY2FsbFxuICogZXhlY3V0aW9uLiAgVGhpcyBpcyBhIG9uZS10aW1lIGNvbnZlcnNpb24sIHNvIGl0J3MgT0sgdG8gYmUgc2xvdy5cbiAqXG4gKiBNb3N0IG9mIHRoZSB3b3JrIGlzIGRvbmUgdG8gZGV0ZWN0IGBNLnJhdygpYCBzbyB0aGF0IHdlIGJ1aWxkIGEgbWF0Y2ggcGF0dGVyblxuICogYW5kIG1ldGFkYXRhIGluc3RlYWQgb2YgZG9pbmcgdGhpcyBpbiB0aGUgaG90IHBhdGguXG4gKiBAcGFyYW0ge01ldGhvZEd1YXJkUGF5bG9hZH0gbWV0aG9kR3VhcmRQYXlsb2FkXG4gKiBAcmV0dXJucyB7TWF0Y2hDb25maWd9XG4gKi9cbmNvbnN0IGJ1aWxkTWF0Y2hDb25maWcgPSBtZXRob2RHdWFyZFBheWxvYWQgPT4ge1xuICBjb25zdCB7XG4gICAgYXJnR3VhcmRzLFxuICAgIG9wdGlvbmFsQXJnR3VhcmRzID0gW10sXG4gICAgcmVzdEFyZ0d1YXJkLFxuICB9ID0gbWV0aG9kR3VhcmRQYXlsb2FkO1xuXG4gIGNvbnN0IG1hdGNoYWJsZUFyZ0d1YXJkcyA9IFsuLi5hcmdHdWFyZHMsIC4uLm9wdGlvbmFsQXJnR3VhcmRzXTtcblxuICBjb25zdCByZWRhY3RlZEluZGljZXMgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXRjaGFibGVBcmdHdWFyZHMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBpZiAoaXNSYXdHdWFyZChtYXRjaGFibGVBcmdHdWFyZHNbaV0pKSB7XG4gICAgICBtYXRjaGFibGVBcmdHdWFyZHNbaV0gPSBSRURBQ1RFRF9SQVdfQVJHO1xuICAgICAgcmVkYWN0ZWRJbmRpY2VzLnB1c2goaSk7XG4gICAgfVxuICB9XG5cbiAgLyogUGFzcyB0aHJvdWdoIHJhdyByZXN0IGFyZ3VtZW50cyB3aXRob3V0IG1hdGNoaW5nLiovXG4gIGxldCBtYXRjaGFibGVSZXN0QXJnR3VhcmQgPSByZXN0QXJnR3VhcmQ7XG4gIGlmIChpc1Jhd0d1YXJkKG1hdGNoYWJsZVJlc3RBcmdHdWFyZCkpIHtcbiAgICBtYXRjaGFibGVSZXN0QXJnR3VhcmQgPSBNLmFycmF5T2YoUkVEQUNURURfUkFXX0FSRyk7XG4gIH1cbiAgY29uc3QgbWF0Y2hhYmxlTWV0aG9kR3VhcmRQYXlsb2FkID0gaGFyZGVuKHtcbiAgICAuLi5tZXRob2RHdWFyZFBheWxvYWQsXG4gICAgYXJnR3VhcmRzOiBtYXRjaGFibGVBcmdHdWFyZHMuc2xpY2UoMCwgYXJnR3VhcmRzLmxlbmd0aCksXG4gICAgb3B0aW9uYWxBcmdHdWFyZHM6IG1hdGNoYWJsZUFyZ0d1YXJkcy5zbGljZShhcmdHdWFyZHMubGVuZ3RoKSxcbiAgICByZXN0QXJnR3VhcmQ6IG1hdGNoYWJsZVJlc3RBcmdHdWFyZCxcbiAgfSk7XG5cbiAgY29uc3QgcGFyYW1zUGF0dGVybiA9IE0uc3BsaXRBcnJheShcbiAgICBtYXRjaGFibGVNZXRob2RHdWFyZFBheWxvYWQuYXJnR3VhcmRzLFxuICAgIG1hdGNoYWJsZU1ldGhvZEd1YXJkUGF5bG9hZC5vcHRpb25hbEFyZ0d1YXJkcyxcbiAgICBtYXRjaGFibGVNZXRob2RHdWFyZFBheWxvYWQucmVzdEFyZ0d1YXJkLFxuICApO1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIGRlY2xhcmVkTGVuOiBtYXRjaGFibGVBcmdHdWFyZHMubGVuZ3RoLFxuICAgIGhhc1Jlc3RBcmdHdWFyZDogcmVzdEFyZ0d1YXJkICE9PSB1bmRlZmluZWQsXG4gICAgcmVzdEFyZ0d1YXJkSXNSYXc6IHJlc3RBcmdHdWFyZCAhPT0gbWF0Y2hhYmxlUmVzdEFyZ0d1YXJkLFxuICAgIHBhcmFtc1BhdHRlcm4sXG4gICAgcmVkYWN0ZWRJbmRpY2VzLFxuICAgIG1hdGNoYWJsZU1ldGhvZEd1YXJkUGF5bG9hZCxcbiAgfSk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7KHJlcHJlc2VudGF0aXZlOiBhbnkpID0+IENsYXNzQ29udGV4dCB8IEtpdENvbnRleHR9IGdldENvbnRleHRcbiAqIEBwYXJhbSB7Q2FsbGFibGVGdW5jdGlvbn0gYmVoYXZpb3JNZXRob2RcbiAqIEBwYXJhbSB7TWV0aG9kR3VhcmRQYXlsb2FkfSBtZXRob2RHdWFyZFBheWxvYWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBsYWJlbFxuICogQHJldHVybnMge01ldGhvZH1cbiAqL1xuY29uc3QgZGVmZW5kU3luY01ldGhvZCA9IChcbiAgZ2V0Q29udGV4dCxcbiAgYmVoYXZpb3JNZXRob2QsXG4gIG1ldGhvZEd1YXJkUGF5bG9hZCxcbiAgbGFiZWwsXG4pID0+IHtcbiAgY29uc3QgeyByZXR1cm5HdWFyZCB9ID0gbWV0aG9kR3VhcmRQYXlsb2FkO1xuICBjb25zdCBpc1Jhd1JldHVybiA9IGlzUmF3R3VhcmQocmV0dXJuR3VhcmQpO1xuICBjb25zdCBtYXRjaENvbmZpZyA9IGJ1aWxkTWF0Y2hDb25maWcobWV0aG9kR3VhcmRQYXlsb2FkKTtcbiAgY29uc3QgeyBzeW5jTWV0aG9kIH0gPSB7XG4gICAgLyogTm90ZSBwdXJwb3NlZnVsIHVzZSBvZiBgdGhpc2AgYW5kIGNvbmNpc2UgbWV0aG9kIHN5bnRheCovXG4gICAgc3luY01ldGhvZCguLi5zeW5jQXJncykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgY29udGV4dCA9IGdldENvbnRleHQodGhpcyk7XG4gICAgICAgIC8qIE9ubHkgaGFyZGVuIGFyZ3MgYW5kIHJldHVybiB2YWx1ZSBpZiBub3QgZGVhbGluZyB3aXRoIGEgcmF3IHZhbHVlIGd1YXJkLiovXG4gICAgICAgIGNvbnN0IHJlYWxBcmdzID0gZGVmZW5kU3luY0FyZ3Moc3luY0FyZ3MsIG1hdGNoQ29uZmlnLCBsYWJlbCk7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IGFwcGx5KGJlaGF2aW9yTWV0aG9kLCBjb250ZXh0LCByZWFsQXJncyk7XG4gICAgICAgIGlmICghaXNSYXdSZXR1cm4pIHtcbiAgICAgICAgICBtdXN0TWF0Y2goaGFyZGVuKHJlc3VsdCksIHJldHVybkd1YXJkLCBgJHtsYWJlbH06IHJlc3VsdGApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9IGNhdGNoICh0aHJvd25UaGluZykge1xuICAgICAgICB0aHJvdyB0b1Rocm93YWJsZSh0aHJvd25UaGluZyk7XG4gICAgICB9XG4gICAgfSxcbiAgfTtcbiAgcmV0dXJuIHN5bmNNZXRob2Q7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7TWV0aG9kR3VhcmRQYXlsb2FkfSBtZXRob2RHdWFyZFBheWxvYWRcbiAqL1xuY29uc3QgZGVzeW5jID0gbWV0aG9kR3VhcmRQYXlsb2FkID0+IHtcbiAgY29uc3Qge1xuICAgIGFyZ0d1YXJkcyxcbiAgICBvcHRpb25hbEFyZ0d1YXJkcyA9IFtdLFxuICAgIHJlc3RBcmdHdWFyZCxcbiAgfSA9IG1ldGhvZEd1YXJkUGF5bG9hZDtcbiAgIWlzQXdhaXRBcmdHdWFyZChyZXN0QXJnR3VhcmQpIHx8XG4gICAgRmFpbGBSZXN0IGFyZ3MgbWF5IG5vdCBiZSBhd2FpdGVkOiAke3Jlc3RBcmdHdWFyZH1gO1xuICBjb25zdCByYXdBcmdHdWFyZHMgPSBbLi4uYXJnR3VhcmRzLCAuLi5vcHRpb25hbEFyZ0d1YXJkc107XG5cbiAgY29uc3QgYXdhaXRJbmRleGVzID0gW107XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgcmF3QXJnR3VhcmRzLmxlbmd0aDsgaSArPSAxKSB7XG4gICAgY29uc3QgYXJnR3VhcmQgPSByYXdBcmdHdWFyZHNbaV07XG4gICAgaWYgKGlzQXdhaXRBcmdHdWFyZChhcmdHdWFyZCkpIHtcbiAgICAgIHJhd0FyZ0d1YXJkc1tpXSA9IGdldEF3YWl0QXJnR3VhcmRQYXlsb2FkKGFyZ0d1YXJkKS5hcmdHdWFyZDtcbiAgICAgIGF3YWl0SW5kZXhlcy5wdXNoKGkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4ge1xuICAgIGF3YWl0SW5kZXhlcyxcbiAgICByYXdNZXRob2RHdWFyZFBheWxvYWQ6IHtcbiAgICAgIC4uLm1ldGhvZEd1YXJkUGF5bG9hZCxcbiAgICAgIGFyZ0d1YXJkczogcmF3QXJnR3VhcmRzLnNsaWNlKDAsIGFyZ0d1YXJkcy5sZW5ndGgpLFxuICAgICAgb3B0aW9uYWxBcmdHdWFyZHM6IHJhd0FyZ0d1YXJkcy5zbGljZShhcmdHdWFyZHMubGVuZ3RoKSxcbiAgICB9LFxuICB9O1xufTtcblxuLyoqXG4gKiBAcGFyYW0geyhyZXByZXNlbnRhdGl2ZTogYW55KSA9PiBDbGFzc0NvbnRleHQgfCBLaXRDb250ZXh0fSBnZXRDb250ZXh0XG4gKiBAcGFyYW0ge0NhbGxhYmxlRnVuY3Rpb259IGJlaGF2aW9yTWV0aG9kXG4gKiBAcGFyYW0ge01ldGhvZEd1YXJkUGF5bG9hZH0gbWV0aG9kR3VhcmRQYXlsb2FkXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWxcbiAqL1xuY29uc3QgZGVmZW5kQXN5bmNNZXRob2QgPSAoXG4gIGdldENvbnRleHQsXG4gIGJlaGF2aW9yTWV0aG9kLFxuICBtZXRob2RHdWFyZFBheWxvYWQsXG4gIGxhYmVsLFxuKSA9PiB7XG4gIGNvbnN0IHsgcmV0dXJuR3VhcmQgfSA9IG1ldGhvZEd1YXJkUGF5bG9hZDtcbiAgY29uc3QgaXNSYXdSZXR1cm4gPSBpc1Jhd0d1YXJkKHJldHVybkd1YXJkKTtcblxuICBjb25zdCB7IGF3YWl0SW5kZXhlcywgcmF3TWV0aG9kR3VhcmRQYXlsb2FkIH0gPSBkZXN5bmMobWV0aG9kR3VhcmRQYXlsb2FkKTtcbiAgY29uc3QgbWF0Y2hDb25maWcgPSBidWlsZE1hdGNoQ29uZmlnKHJhd01ldGhvZEd1YXJkUGF5bG9hZCk7XG5cbiAgY29uc3QgeyBhc3luY01ldGhvZCB9ID0ge1xuICAgIC8qIE5vdGUgcHVycG9zZWZ1bCB1c2Ugb2YgYHRoaXNgIGFuZCBjb25jaXNlIG1ldGhvZCBzeW50YXgqL1xuICAgIGFzeW5jTWV0aG9kKC4uLmFyZ3MpIHtcbiAgICAgIGNvbnN0IGF3YWl0TGlzdCA9IFtdO1xuICAgICAgZm9yIChjb25zdCBpIG9mIGF3YWl0SW5kZXhlcykge1xuICAgICAgICBpZiAoaSA+PSBhcmdzLmxlbmd0aCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0TGlzdC5wdXNoKGFyZ3NbaV0pO1xuICAgICAgfVxuICAgICAgY29uc3QgcCA9IFByb21pc2UuYWxsKGF3YWl0TGlzdCk7XG4gICAgICBjb25zdCBzeW5jQXJncyA9IFsuLi5hcmdzXTtcbiAgICAgIGNvbnN0IHJlc3VsdFAgPSBFLndoZW4oXG4gICAgICAgIHAsXG4gICAgICAgIC8qKiBAcGFyYW0ge2FueVtdfSBhd2FpdGVkQXJncyAqLyBhd2FpdGVkQXJncyA9PiB7XG4gICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBhd2FpdGVkQXJncy5sZW5ndGg7IGogKz0gMSkge1xuICAgICAgICAgICAgc3luY0FyZ3NbYXdhaXRJbmRleGVzW2pdXSA9IGF3YWl0ZWRBcmdzW2pdO1xuICAgICAgICAgIH1cbiAgICAgICAgICAvKiBHZXQgdGhlIGNvbnRleHQgYWZ0ZXIgYWxsIHdhaXRpbmcgaW4gY2FzZSB3ZSBldmVyIGRvIHJldm9jYXRpb24qL1xuICAgICAgICAgIC8qIGJ5IHJlbW92aW5nIHRoZSBjb250ZXh0IGVudHJ5LiBBdm9pZCBUT0NUVE9VISovXG4gICAgICAgICAgY29uc3QgY29udGV4dCA9IGdldENvbnRleHQodGhpcyk7XG4gICAgICAgICAgY29uc3QgcmVhbEFyZ3MgPSBkZWZlbmRTeW5jQXJncyhzeW5jQXJncywgbWF0Y2hDb25maWcsIGxhYmVsKTtcbiAgICAgICAgICByZXR1cm4gYXBwbHkoYmVoYXZpb3JNZXRob2QsIGNvbnRleHQsIHJlYWxBcmdzKTtcbiAgICAgICAgfSxcbiAgICAgICk7XG4gICAgICByZXR1cm4gRS53aGVuKHJlc3VsdFAsIGZ1bGZpbGxtZW50ID0+IHtcbiAgICAgICAgaWYgKCFpc1Jhd1JldHVybikge1xuICAgICAgICAgIG11c3RNYXRjaChoYXJkZW4oZnVsZmlsbG1lbnQpLCByZXR1cm5HdWFyZCwgYCR7bGFiZWx9OiByZXN1bHRgKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnVsZmlsbG1lbnQ7XG4gICAgICB9KS5jYXRjaChyZWFzb24gPT5cbiAgICAgICAgLyogRG9uZSBpcyBhIGNoYWluZWQgYC5jYXRjaGAgcmF0aGVyIHRoYW4gYW4gb25SZWplY3RlZCBjbGF1c2Ugb2YgdGhlKi9cbiAgICAgICAgLyogYEUud2hlbmAgYWJvdmUgaW4gY2FzZSB0aGUgYG11c3RNYXRjaGAgdGhyb3dzLiovXG4gICAgICAgIFByb21pc2UucmVqZWN0KHRvVGhyb3dhYmxlKHJlYXNvbikpLFxuICAgICAgKTtcbiAgICB9LFxuICB9O1xuICByZXR1cm4gYXN5bmNNZXRob2Q7XG59O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0geyhyZXByZXNlbnRhdGl2ZTogYW55KSA9PiBDbGFzc0NvbnRleHQgfCBLaXRDb250ZXh0fSBnZXRDb250ZXh0XG4gKiBAcGFyYW0ge0NhbGxhYmxlRnVuY3Rpb259IGJlaGF2aW9yTWV0aG9kXG4gKiBAcGFyYW0ge01ldGhvZEd1YXJkfSBtZXRob2RHdWFyZFxuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsXG4gKi9cbmNvbnN0IGRlZmVuZE1ldGhvZCA9IChnZXRDb250ZXh0LCBiZWhhdmlvck1ldGhvZCwgbWV0aG9kR3VhcmQsIGxhYmVsKSA9PiB7XG4gIGNvbnN0IG1ldGhvZEd1YXJkUGF5bG9hZCA9IGdldE1ldGhvZEd1YXJkUGF5bG9hZChtZXRob2RHdWFyZCk7XG4gIGNvbnN0IHsgY2FsbEtpbmQgfSA9IG1ldGhvZEd1YXJkUGF5bG9hZDtcbiAgaWYgKGNhbGxLaW5kID09PSAnc3luYycpIHtcbiAgICByZXR1cm4gZGVmZW5kU3luY01ldGhvZChcbiAgICAgIGdldENvbnRleHQsXG4gICAgICBiZWhhdmlvck1ldGhvZCxcbiAgICAgIG1ldGhvZEd1YXJkUGF5bG9hZCxcbiAgICAgIGxhYmVsLFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgYXNzZXJ0KGNhbGxLaW5kID09PSAnYXN5bmMnKTtcbiAgICByZXR1cm4gZGVmZW5kQXN5bmNNZXRob2QoXG4gICAgICBnZXRDb250ZXh0LFxuICAgICAgYmVoYXZpb3JNZXRob2QsXG4gICAgICBtZXRob2RHdWFyZFBheWxvYWQsXG4gICAgICBsYWJlbCxcbiAgICApO1xuICB9XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2RUYWdcbiAqIEBwYXJhbSB7Q29udGV4dFByb3ZpZGVyfSBjb250ZXh0UHJvdmlkZXJcbiAqIEBwYXJhbSB7Q2FsbGFibGVGdW5jdGlvbn0gYmVoYXZpb3JNZXRob2RcbiAqIEBwYXJhbSB7TWV0aG9kR3VhcmR9IG1ldGhvZEd1YXJkXG4gKi9cbmNvbnN0IGJpbmRNZXRob2QgPSAoXG4gIG1ldGhvZFRhZyxcbiAgY29udGV4dFByb3ZpZGVyLFxuICBiZWhhdmlvck1ldGhvZCxcbiAgbWV0aG9kR3VhcmQsXG4pID0+IHtcbiAgYXNzZXJ0LnR5cGVvZihiZWhhdmlvck1ldGhvZCwgJ2Z1bmN0aW9uJyk7XG5cbiAgLyoqXG4gKiBAcGFyYW0ge2FueX0gcmVwcmVzZW50YXRpdmVcbiAqIEByZXR1cm5zIHtDbGFzc0NvbnRleHQgfCBLaXRDb250ZXh0fVxuICovXG4gIGNvbnN0IGdldENvbnRleHQgPSByZXByZXNlbnRhdGl2ZSA9PiB7XG4gICAgcmVwcmVzZW50YXRpdmUgfHxcbiAgICAgIC8qIHNlcGFyYXRlIGxpbmUgdG8gZWFzZSBicmVha3BvaW50aW5nKi9cbiAgICAgIEZhaWxgTWV0aG9kICR7bWV0aG9kVGFnfSBjYWxsZWQgd2l0aG91dCAndGhpcycgb2JqZWN0YDtcbiAgICBjb25zdCBjb250ZXh0ID0gY29udGV4dFByb3ZpZGVyKHJlcHJlc2VudGF0aXZlKTtcbiAgICBpZiAoY29udGV4dCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBGYWlsYCR7cShcbiAgICAgICAgbWV0aG9kVGFnLFxuICAgICAgKX0gbWF5IG9ubHkgYmUgYXBwbGllZCB0byBhIHZhbGlkIGluc3RhbmNlOiAke3JlcHJlc2VudGF0aXZlfWA7XG4gICAgfVxuICAgIHJldHVybiBjb250ZXh0O1xuICB9O1xuXG4gIGNvbnN0IG1ldGhvZCA9IGRlZmVuZE1ldGhvZChcbiAgICBnZXRDb250ZXh0LFxuICAgIGJlaGF2aW9yTWV0aG9kLFxuICAgIG1ldGhvZEd1YXJkLFxuICAgIG1ldGhvZFRhZyxcbiAgKTtcblxuICBkZWZpbmVQcm9wZXJ0aWVzKG1ldGhvZCwge1xuICAgIG5hbWU6IHsgdmFsdWU6IG1ldGhvZFRhZyB9LFxuICAgIGxlbmd0aDogeyB2YWx1ZTogYmVoYXZpb3JNZXRob2QubGVuZ3RoIH0sXG4gIH0pO1xuICByZXR1cm4gbWV0aG9kO1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxSZW1vdGFibGVNZXRob2ROYW1lLCBDYWxsYWJsZUZ1bmN0aW9uPn0gVFxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHtDb250ZXh0UHJvdmlkZXJ9IGNvbnRleHRQcm92aWRlclxuICogQHBhcmFtIHtUfSBiZWhhdmlvck1ldGhvZHNcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3RoaXNmdWxNZXRob2RzXVxuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZDx7IFtNIGluIGtleW9mIFRdOiBNZXRob2RHdWFyZCB9Pn0gW2ludGVyZmFjZUd1YXJkXVxuICovXG4gICAgICAgY29uc3QgZGVmZW5kUHJvdG90eXBlID0gKFxuICB0YWcsXG4gIGNvbnRleHRQcm92aWRlcixcbiAgYmVoYXZpb3JNZXRob2RzLFxuICB0aGlzZnVsTWV0aG9kcyA9IGZhbHNlLFxuICBpbnRlcmZhY2VHdWFyZCA9IHVuZGVmaW5lZCxcbikgPT4ge1xuICBjb25zdCBwcm90b3R5cGUgPSB7fTtcbiAgY29uc3QgbWV0aG9kTmFtZXMgPSBnZXRSZW1vdGFibGVNZXRob2ROYW1lcyhiZWhhdmlvck1ldGhvZHMpLmZpbHRlcihcbiAgICAvKiBCeSBpZ25vcmluZyBhbnkgbWV0aG9kIHRoYXQgc2VlbXMgdG8gYmUgYSBjb25zdHJ1Y3Rvciwgd2UgY2FuIHVzZSBhKi9cbiAgICAvKiBjbGFzcy5wcm90b3R5cGUgYXMgYSBiZWhhdmlvck1ldGhvZHMuKi9cbiAgICBrZXkgPT4ge1xuICAgICAgaWYgKGtleSAhPT0gJ2NvbnN0cnVjdG9yJykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IGNvbnN0cnVjdG9yID0gYmVoYXZpb3JNZXRob2RzLmNvbnN0cnVjdG9yO1xuICAgICAgcmV0dXJuICEoXG4gICAgICAgIGNvbnN0cnVjdG9yLnByb3RvdHlwZSAmJlxuICAgICAgICBjb25zdHJ1Y3Rvci5wcm90b3R5cGUuY29uc3RydWN0b3IgPT09IGNvbnN0cnVjdG9yXG4gICAgICApO1xuICAgIH0sXG4gICk7XG4gIC8qKiBAdHlwZSB7UmVjb3JkPFJlbW90YWJsZU1ldGhvZE5hbWUsIE1ldGhvZEd1YXJkPiB8IHVuZGVmaW5lZH0gKi9cbiAgbGV0IG1ldGhvZEd1YXJkcztcbiAgLyoqIEB0eXBlIHtEZWZhdWx0R3VhcmRUeXBlfSAqL1xuICBsZXQgZGVmYXVsdEd1YXJkcztcbiAgaWYgKGludGVyZmFjZUd1YXJkKSB7XG4gICAgY29uc3Qge1xuICAgICAgaW50ZXJmYWNlTmFtZSxcbiAgICAgIG1ldGhvZEd1YXJkczogbWcsXG4gICAgICBzeW1ib2xNZXRob2RHdWFyZHMsXG4gICAgICBzbG9wcHksXG4gICAgICBkZWZhdWx0R3VhcmRzOiBkZyA9IHNsb3BweSA/ICdwYXNzYWJsZScgOiBkZWZhdWx0R3VhcmRzLFxuICAgIH0gPSBnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQoaW50ZXJmYWNlR3VhcmQpO1xuICAgIG1ldGhvZEd1YXJkcyA9IGhhcmRlbih7XG4gICAgICAuLi5tZyxcbiAgICAgIC4uLihzeW1ib2xNZXRob2RHdWFyZHMgJiZcbiAgICAgICAgZnJvbUVudHJpZXMoZ2V0Q29weU1hcEVudHJpZXMoc3ltYm9sTWV0aG9kR3VhcmRzKSkpLFxuICAgIH0pO1xuICAgIGRlZmF1bHRHdWFyZHMgPSBkZztcbiAgICB7XG4gICAgICBjb25zdCBtZXRob2RHdWFyZE5hbWVzID0gb3duS2V5cyhtZXRob2RHdWFyZHMpO1xuICAgICAgY29uc3QgdW5pbXBsZW1lbnRlZCA9IGxpc3REaWZmZXJlbmNlKG1ldGhvZEd1YXJkTmFtZXMsIG1ldGhvZE5hbWVzKTtcbiAgICAgIHVuaW1wbGVtZW50ZWQubGVuZ3RoID09PSAwIHx8XG4gICAgICAgIEZhaWxgbWV0aG9kcyAke3EodW5pbXBsZW1lbnRlZCl9IG5vdCBpbXBsZW1lbnRlZCBieSAke3EodGFnKX1gO1xuICAgICAgaWYgKGRlZmF1bHRHdWFyZHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICBjb25zdCB1bmd1YXJkZWQgPSBsaXN0RGlmZmVyZW5jZShtZXRob2ROYW1lcywgbWV0aG9kR3VhcmROYW1lcyk7XG4gICAgICAgIHVuZ3VhcmRlZC5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgICBGYWlsYG1ldGhvZHMgJHtxKHVuZ3VhcmRlZCl9IG5vdCBndWFyZGVkIGJ5ICR7cShpbnRlcmZhY2VOYW1lKX1gO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgcHJvcCBvZiBtZXRob2ROYW1lcykge1xuICAgIGNvbnN0IG9yaWdpbmFsTWV0aG9kID0gYmVoYXZpb3JNZXRob2RzW3Byb3BdO1xuICAgIGNvbnN0IHsgc2hpZnRlZE1ldGhvZCB9ID0ge1xuICAgICAgc2hpZnRlZE1ldGhvZCguLi5hcmdzKSB7XG4gICAgICAgIHJldHVybiBvcmlnaW5hbE1ldGhvZCh0aGlzLCAuLi5hcmdzKTtcbiAgICAgIH0sXG4gICAgfTtcbiAgICBjb25zdCBiZWhhdmlvck1ldGhvZCA9IHRoaXNmdWxNZXRob2RzID8gb3JpZ2luYWxNZXRob2QgOiBzaGlmdGVkTWV0aG9kO1xuICAgIC8qIFRPRE8gc29tZSB0b29sIGRvZXMgbm90IHlldCB1bmRlcnN0YW5kIHRoZSBgPy5bYCBzeW50YXgqL1xuICAgIC8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8yMjQ3I2Rpc2N1c3Npb25fcjE1ODM3MjQ0MjQqL1xuICAgIGxldCBtZXRob2RHdWFyZCA9IG1ldGhvZEd1YXJkcyAmJiBtZXRob2RHdWFyZHNbcHJvcF07XG4gICAgaWYgKCFtZXRob2RHdWFyZCkge1xuICAgICAgc3dpdGNoIChkZWZhdWx0R3VhcmRzKSB7XG4gICAgICAgIGNhc2UgdW5kZWZpbmVkOiB7XG4gICAgICAgICAgaWYgKHRoaXNmdWxNZXRob2RzKSB7XG4gICAgICAgICAgICBtZXRob2RHdWFyZCA9IFBhc3NhYmxlTWV0aG9kR3VhcmQ7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG1ldGhvZEd1YXJkID0gUmF3TWV0aG9kR3VhcmQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3Bhc3NhYmxlJzoge1xuICAgICAgICAgIG1ldGhvZEd1YXJkID0gUGFzc2FibGVNZXRob2RHdWFyZDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdyYXcnOiB7XG4gICAgICAgICAgbWV0aG9kR3VhcmQgPSBSYXdNZXRob2RHdWFyZDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgRmFpbGBVbnJlY29nbml6ZWQgZGVmYXVsdEd1YXJkcyAke3EoZGVmYXVsdEd1YXJkcyl9YDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICBwcm90b3R5cGVbcHJvcF0gPSBiaW5kTWV0aG9kKFxuICAgICAgYEluICR7cShwcm9wKX0gbWV0aG9kIG9mICgke3RhZ30pYCxcbiAgICAgIGNvbnRleHRQcm92aWRlcixcbiAgICAgIGJlaGF2aW9yTWV0aG9kLFxuICAgICAgbWV0aG9kR3VhcmQsXG4gICAgKTtcbiAgfVxuXG4gIGlmICghaGFzT3duKHByb3RvdHlwZSwgR0VUX0lOVEVSRkFDRV9HVUFSRCkpIHtcbiAgICBjb25zdCBnZXRJbnRlcmZhY2VHdWFyZE1ldGhvZCA9IHtcbiAgICAgIFtHRVRfSU5URVJGQUNFX0dVQVJEXSgpIHtcbiAgICAgICAgLyogTm90ZTogTWF5IGJlIGB1bmRlZmluZWRgKi9cbiAgICAgICAgcmV0dXJuIGludGVyZmFjZUd1YXJkO1xuICAgICAgfSxcbiAgICB9W0dFVF9JTlRFUkZBQ0VfR1VBUkRdO1xuICAgIHByb3RvdHlwZVtHRVRfSU5URVJGQUNFX0dVQVJEXSA9IGJpbmRNZXRob2QoXG4gICAgICBgSW4gJHtxKEdFVF9JTlRFUkZBQ0VfR1VBUkQpfSBtZXRob2Qgb2YgKCR7dGFnfSlgLFxuICAgICAgY29udGV4dFByb3ZpZGVyLFxuICAgICAgZ2V0SW50ZXJmYWNlR3VhcmRNZXRob2QsXG4gICAgICBQYXNzYWJsZU1ldGhvZEd1YXJkLFxuICAgICk7XG4gIH1cblxuICByZXR1cm4gRmFyKHRhZywgLyoqIEB0eXBlIHtUICYgR2V0SW50ZXJmYWNlR3VhcmQ8VD59ICovIChwcm90b3R5cGUpKTtcbn07JGjNj19vbmNlLmRlZmVuZFByb3RvdHlwZShkZWZlbmRQcm90b3R5cGUpO1xuaGFyZGVuKGRlZmVuZFByb3RvdHlwZSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8RmFjZXROYW1lLCBNZXRob2RzPn0gRlxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHt7IFtLIGluIGtleW9mIEZdOiBLaXRDb250ZXh0UHJvdmlkZXIgfX0gY29udGV4dFByb3ZpZGVyS2l0XG4gKiBAcGFyYW0ge0Z9IGJlaGF2aW9yTWV0aG9kc0tpdFxuICogQHBhcmFtIHtib29sZWFufSBbdGhpc2Z1bE1ldGhvZHNdXG4gKiBAcGFyYW0ge3sgW0sgaW4ga2V5b2YgRl06IEludGVyZmFjZUd1YXJkPFJlY29yZDxrZXlvZiBGW0tdLCBNZXRob2RHdWFyZD4+IH19IFtpbnRlcmZhY2VHdWFyZEtpdF1cbiAqL1xuICAgICAgIGNvbnN0IGRlZmVuZFByb3RvdHlwZUtpdCA9IChcbiAgdGFnLFxuICBjb250ZXh0UHJvdmlkZXJLaXQsXG4gIGJlaGF2aW9yTWV0aG9kc0tpdCxcbiAgdGhpc2Z1bE1ldGhvZHMgPSBmYWxzZSxcbiAgaW50ZXJmYWNlR3VhcmRLaXQgPSB1bmRlZmluZWQsXG4pID0+IHtcbiAgY29uc3QgZmFjZXROYW1lcyA9IG93bktleXMoYmVoYXZpb3JNZXRob2RzS2l0KS5zb3J0KCk7XG4gIGZhY2V0TmFtZXMubGVuZ3RoID4gMSB8fCBGYWlsYEEgbXVsdGktZmFjZXQgb2JqZWN0IG11c3QgaGF2ZSBtdWx0aXBsZSBmYWNldHNgO1xuICBpZiAoaW50ZXJmYWNlR3VhcmRLaXQpIHtcbiAgICBjb25zdCBpbnRlcmZhY2VOYW1lcyA9IG93bktleXMoaW50ZXJmYWNlR3VhcmRLaXQpO1xuICAgIGNvbnN0IGV4dHJhSW50ZXJmYWNlTmFtZXMgPSBsaXN0RGlmZmVyZW5jZShmYWNldE5hbWVzLCBpbnRlcmZhY2VOYW1lcyk7XG4gICAgZXh0cmFJbnRlcmZhY2VOYW1lcy5sZW5ndGggPT09IDAgfHxcbiAgICAgIEZhaWxgSW50ZXJmYWNlcyAke3EoZXh0cmFJbnRlcmZhY2VOYW1lcyl9IG5vdCBpbXBsZW1lbnRlZCBieSAke3EodGFnKX1gO1xuICAgIGNvbnN0IGV4dHJhRmFjZXROYW1lcyA9IGxpc3REaWZmZXJlbmNlKGludGVyZmFjZU5hbWVzLCBmYWNldE5hbWVzKTtcbiAgICBleHRyYUZhY2V0TmFtZXMubGVuZ3RoID09PSAwIHx8XG4gICAgICBGYWlsYEZhY2V0cyAke3EoZXh0cmFGYWNldE5hbWVzKX0gb2YgJHtxKHRhZyl9IG5vdCBndWFyZGVkIGJ5IGludGVyZmFjZXNgO1xuICB9XG4gIGNvbnN0IGNvbnRleHRNYXBOYW1lcyA9IG93bktleXMoY29udGV4dFByb3ZpZGVyS2l0KTtcbiAgY29uc3QgZXh0cmFDb250ZXh0TmFtZXMgPSBsaXN0RGlmZmVyZW5jZShmYWNldE5hbWVzLCBjb250ZXh0TWFwTmFtZXMpO1xuICBleHRyYUNvbnRleHROYW1lcy5sZW5ndGggPT09IDAgfHxcbiAgICBGYWlsYENvbnRleHRzICR7cShleHRyYUNvbnRleHROYW1lcyl9IG5vdCBpbXBsZW1lbnRlZCBieSAke3EodGFnKX1gO1xuICBjb25zdCBleHRyYUZhY2V0TmFtZXMgPSBsaXN0RGlmZmVyZW5jZShjb250ZXh0TWFwTmFtZXMsIGZhY2V0TmFtZXMpO1xuICBleHRyYUZhY2V0TmFtZXMubGVuZ3RoID09PSAwIHx8XG4gICAgRmFpbGBGYWNldHMgJHtxKGV4dHJhRmFjZXROYW1lcyl9IG9mICR7cSh0YWcpfSBtaXNzaW5nIGNvbnRleHRzYDtcbiAgY29uc3QgcHJvdG9LaXQgPSBvYmplY3RNYXAoYmVoYXZpb3JNZXRob2RzS2l0LCAoYmVoYXZpb3JNZXRob2RzLCBmYWNldE5hbWUpID0+XG4gICAgZGVmZW5kUHJvdG90eXBlKFxuICAgICAgYCR7dGFnfSAke1N0cmluZyhmYWNldE5hbWUpfWAsXG4gICAgICBjb250ZXh0UHJvdmlkZXJLaXRbZmFjZXROYW1lXSxcbiAgICAgIGJlaGF2aW9yTWV0aG9kcyxcbiAgICAgIHRoaXNmdWxNZXRob2RzLFxuICAgICAgaW50ZXJmYWNlR3VhcmRLaXQgJiYgaW50ZXJmYWNlR3VhcmRLaXRbZmFjZXROYW1lXSxcbiAgICApLFxuICApO1xuICByZXR1cm4gcHJvdG9LaXQ7XG59OyRozY9fb25jZS5kZWZlbmRQcm90b3R5cGVLaXQoZGVmZW5kUHJvdG90eXBlS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmVuZFByb3RvdHlwZSI6WyJkZWZlbmRQcm90b3R5cGUiXSwiZGVmZW5kUHJvdG90eXBlS2l0IjpbImRlZmVuZFByb3RvdHlwZUtpdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADJJdo2CwUAAAsFAAAmAAAAQGVuZG8vZXhvLXYxLjUuMTIvc3JjL2dldC1pbnRlcmZhY2UuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkdFVF9JTlRFUkZBQ0VfR1VBUkQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7LyogQHRzLWNoZWNrKi9cblxuLyoqXG4gKiBAaW1wb3J0IHtSZW1vdGFibGVNZXRob2ROYW1lfSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJztcbiAqL1xuXG4vKipcbiAqIFRoZSBuYW1lIG9mIHRoZSBhdXRvbWF0aWNhbGx5IGFkZGVkIGRlZmF1bHQgbWV0YS1tZXRob2QgZm9yXG4gKiBvYnRhaW5pbmcgYW4gZXhvJ3MgaW50ZXJmYWNlLCBpZiBpdCBoYXMgb25lLlxuICpcbiAqIEludGVuZGVkIHRvIGJlIHNpbWlsYXIgdG8gYEdFVF9NRVRIT0RfTkFNRVNgIGZyb20gYEBlbmRvL3Bhc3Mtc3R5bGVgLlxuICpcbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xODA5I2Rpc2N1c3Npb25fcjEzODgwNTI0NTRcbiAqXG4gKiBCZXdhcmUgdGhhdCBhbiBleG8ncyBpbnRlcmZhY2UgY2FuIGNoYW5nZSBhY3Jvc3MgYW4gdXBncmFkZSxcbiAqIHNvIHJlbW90ZXMgdGhhdCBjYWNoZSBpdCBjYW4gYmVjb21lIHN0YWxlLlxuICovXG4gICAgICAgY29uc3QgR0VUX0lOVEVSRkFDRV9HVUFSRCA9ICdfX2dldEludGVyZmFjZUd1YXJkX18nO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPFJlbW90YWJsZU1ldGhvZE5hbWUsIENhbGxhYmxlRnVuY3Rpb24+fSBNXG4gKiBAdHlwZWRlZiB7e1xuICogICBbR0VUX0lOVEVSRkFDRV9HVUFSRF0/OiAoKSA9PlxuICogICAgIElNUE9SVCgnQGVuZG8vcGF0dGVybnMnKS5JbnRlcmZhY2VHdWFyZDx7XG4gKiAgICAgICBbSyBpbiBrZXlvZiBNXTogSU1QT1JUKCdAZW5kby9wYXR0ZXJucycpLk1ldGhvZEd1YXJkXG4gKiAgICAgfT4gfCB1bmRlZmluZWRcbiAqIH19IEdldEludGVyZmFjZUd1YXJkXG4gKi8kaM2PX29uY2UuR0VUX0lOVEVSRkFDRV9HVUFSRChHRVRfSU5URVJGQUNFX0dVQVJEKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkdFVF9JTlRFUkZBQ0VfR1VBUkQiOlsiR0VUX0lOVEVSRkFDRV9HVUFSRCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAAeAAAAQGVuZG8vZXhvLXYxLjUuMTIvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACAAAABAZW5kby9mYXItdjEuMS4xNC9zcmMvZXhwb3J0cy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACpJtZQmAIAAJgCAAAeAAAAQGVuZG8vZmFyLXYxLjEuMTQvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9wYXNzLXN0eWxlIiwiLi9leHBvcnRzLmpzIl0sImV4cG9ydHMiOlsiZ2V0SW50ZXJmYWNlT2YiLCJnZXRJbnRlcmZhY2VPZiIsbnVsbF0sInJlZXhwb3J0cyI6WyIuL2V4cG9ydHMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbXV0sW1wiLi9leHBvcnRzLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnsiQGVuZG8vZXZlbnR1YWwtc2VuZCI6W1siRSIsIkUiXV0sIkBlbmRvL3Bhc3Mtc3R5bGUiOltbIkZhciIsIkZhciJdLFsiZ2V0SW50ZXJmYWNlT2YiLCJnZXRJbnRlcmZhY2VPZiJdLFsicGFzc1N0eWxlT2YiLCJwYXNzU3R5bGVPZiJdXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAdUZ/2QcIAAAHCAAAHQAAAEBlbmRvL21hcnNoYWwtdjEuOC4wL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qcyIsIi4vc3JjL21hcnNoYWwuanMiLCIuL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyIsIi4vc3JjL21hcnNoYWwtanVzdGluLmpzIiwiLi9zcmMvZW5jb2RlUGFzc2FibGUuanMiLCIuL3NyYy9yYW5rT3JkZXIuanMiLCIuL3NyYy90eXBlcy5qcyIsIkBlbmRvL3Bhc3Mtc3R5bGUiXSwiZXhwb3J0cyI6WyJjb21wYXJlQnlDb2RlUG9pbnRzIiwiY29tcGFyZUJ5Q29kZVBvaW50cyIsIm1ha2VFbmNvZGVQYXNzYWJsZSIsIm1ha2VFbmNvZGVQYXNzYWJsZSIsInBhcnNlIiwicGFyc2UiLCJwYXNzYWJsZUFzSnVzdGluIiwicGFzc2FibGVBc0p1c3RpbiIsbnVsbCxudWxsLG51bGxdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdHlwZXMuanMiLCJAZW5kby9wYXNzLXN0eWxlIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qc1wiLCBbXV0sW1wiLi9zcmMvbWFyc2hhbC5qc1wiLCBbXV0sW1wiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanNcIiwgW11dLFtcIi4vc3JjL21hcnNoYWwtanVzdGluLmpzXCIsIFtdXSxbXCIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qc1wiLCBbXV0sW1wiLi9zcmMvcmFua09yZGVyLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2VuY29kZVRvQ2FwRGF0YS5qcyI6W1siUUNMQVNTIiwiUUNMQVNTIl1dLCIuL3NyYy9tYXJzaGFsLmpzIjpbWyJtYWtlTWFyc2hhbCIsIm1ha2VNYXJzaGFsIl1dLCIuL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qcyI6W1sic3RyaW5naWZ5Iiwic3RyaW5naWZ5Il0sWyJwYXJzZSIsInBhcnNlIl1dLCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qcyI6W1siZGVjb2RlVG9KdXN0aW4iLCJkZWNvZGVUb0p1c3RpbiJdLFsicGFzc2FibGVBc0p1c3RpbiIsInBhc3NhYmxlQXNKdXN0aW4iXSxbInFwIiwicXAiXV0sIi4vc3JjL2VuY29kZVBhc3NhYmxlLmpzIjpbWyJtYWtlUGFzc2FibGVLaXQiLCJtYWtlUGFzc2FibGVLaXQiXSxbIm1ha2VFbmNvZGVQYXNzYWJsZSIsIm1ha2VFbmNvZGVQYXNzYWJsZSJdLFsibWFrZURlY29kZVBhc3NhYmxlIiwibWFrZURlY29kZVBhc3NhYmxlIl0sWyJpc0VuY29kZWRSZW1vdGFibGUiLCJpc0VuY29kZWRSZW1vdGFibGUiXSxbInplcm9QYWQiLCJ6ZXJvUGFkIl0sWyJyZWNvcmROYW1lcyIsInJlY29yZE5hbWVzIl0sWyJyZWNvcmRWYWx1ZXMiLCJyZWNvcmRWYWx1ZXMiXV0sIi4vc3JjL3JhbmtPcmRlci5qcyI6W1siY29tcGFyZU51bWVyaWNzIiwiY29tcGFyZU51bWVyaWNzIl0sWyJjb21wYXJlQnlDb2RlUG9pbnRzIiwiY29tcGFyZUJ5Q29kZVBvaW50cyJdLFsiYXNzZXJ0UmFua1NvcnRlZCIsImFzc2VydFJhbmtTb3J0ZWQiXSxbImNvbXBhcmVSYW5rIiwiY29tcGFyZVJhbmsiXSxbImlzUmFua1NvcnRlZCIsImlzUmFua1NvcnRlZCJdLFsic29ydEJ5UmFuayIsInNvcnRCeVJhbmsiXSxbImNvbXBhcmVBbnRpUmFuayIsImNvbXBhcmVBbnRpUmFuayJdLFsibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiLCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCJdLFsiZ2V0UGFzc1N0eWxlQ292ZXIiLCJnZXRQYXNzU3R5bGVDb3ZlciJdLFsiaW50ZXJzZWN0UmFua0NvdmVycyIsImludGVyc2VjdFJhbmtDb3ZlcnMiXSxbInVuaW9uUmFua0NvdmVycyIsInVuaW9uUmFua0NvdmVycyJdXSwiQGVuZG8vcGFzcy1zdHlsZSI6W1siZGVlcGx5RnVsZmlsbGVkIiwiZGVlcGx5RnVsZmlsbGVkIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABgv2qoyX0AAMl9AAAqAAAAQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL2VuY29kZVBhc3NhYmxlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJpc0VuY29kZWRSZW1vdGFibGUiLCJtYWtlRGVjb2RlUGFzc2FibGUiLCJtYWtlRW5jb2RlUGFzc2FibGUiLCJtYWtlUGFzc2FibGVLaXQiLCJwYXNzU3R5bGVQcmVmaXhlcyIsInJlY29yZE5hbWVzIiwicmVjb3JkVmFsdWVzIiwiemVyb1BhZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGdldFRhZyxtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLGFzc2VydFJlY29yZCxpc0Vycm9yTGlrZSxuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc2FibGVTeW1ib2xGb3JOYW1lLGIscSxGYWlsOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiZ2V0VGFnXCIsWyRozY9fYSA9PiAoZ2V0VGFnID0gJGjNj19hKV1dLFtcIm1ha2VUYWdnZWRcIixbJGjNj19hID0+IChtYWtlVGFnZ2VkID0gJGjNj19hKV1dLFtcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wiYXNzZXJ0UmVjb3JkXCIsWyRozY9fYSA9PiAoYXNzZXJ0UmVjb3JkID0gJGjNj19hKV1dLFtcImlzRXJyb3JMaWtlXCIsWyRozY9fYSA9PiAoaXNFcnJvckxpa2UgPSAkaM2PX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsWyRozY9fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjNj19hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLFskaM2PX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiYlwiLFskaM2PX2EgPT4gKGIgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3QgeyBmcm9tRW50cmllcywgaXMgfSA9IE9iamVjdDtcbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcblxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRyb2wtcmVnZXgqL1xuY29uc3QgckMwID0gL1tcXHgwMC1cXHgxRl0vO1xuXG4vKipcbiAqIFJldHVybiB0aGUgc3VmZml4IG9mIGEgc3RyaW5nIHN0YXJ0aW5nIGF0IGEgcGFydGljdWxhciBpbmRleC5cbiAqIFRoaXMgYm90aCBleHByZXNzZXMgaW50ZW50IGFuZCBwb3RlbnRpYWxseSBhdm9pZHMgc2xvdyBgc3Vic3RyaW5nYCBpbiBYUy5cbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMTk4NFxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZ2V0U3VmZml4ID0gKHN0ciwgaW5kZXgpID0+IChpbmRleCA9PT0gMCA/IHN0ciA6IHN0ci5zdWJzdHJpbmcoaW5kZXgpKTtcblxuLyoqXG4gKiBBc3N1bWluZyB0aGF0IGByZWNvcmRgIGlzIGEgQ29weVJlY29yZCwgd2UgaGF2ZSBvbmx5XG4gKiBzdHJpbmctbmFtZWQgb3duIHByb3BlcnRpZXMuIGByZWNvcmROYW1lc2AgcmV0dXJucyB0aG9zZSBuYW1lICpyZXZlcnNlKlxuICogc29ydGVkLCBiZWNhdXNlIHRoYXQncyBob3cgcmVjb3JkcyBhcmUgY29tcGFyZWQsIGVuY29kZWQsIGFuZCBzb3J0ZWQuXG4gKlxuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVFxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFQ+fSByZWNvcmRcbiAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAqL1xuICAgICAgIGNvbnN0IHJlY29yZE5hbWVzID0gcmVjb3JkID0+XG4gIC8qIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNjAjZGlzY3Vzc2lvbl9yMTAwMzY1NzI0NCovXG4gIC8qIGNvbXBhcmVzIHR3byB3YXlzIG9mIHJldmVyc2Ugc29ydGluZywgYW5kIHNob3dzIHRoYXQgYC5zb3J0KCkucmV2ZXJzZSgpYCovXG4gIC8qIGlzIGN1cnJlbnRseSBmYXN0ZXIgb24gTW9kZGFibGUgWFMsIHdoaWxlIHRoZSBvdGhlciB3YXksKi9cbiAgLyogYC5zb3J0KHJldmVyc2VDb21wYXJhdG9yKWAsIGlzIGZhc3RlciBvbiB2OC4gV2UgY3VycmVudGx5IGNhcmUgbW9yZSBhYm91dCovXG4gIC8qIFhTIHBlcmZvcm1hbmNlLCBzbyB3ZSByZXZlcnNlIHNvcnQgdXNpbmcgYC5zb3J0KCkucmV2ZXJzZSgpYC4qL1xuICBoYXJkZW4oLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi8gKG93bktleXMocmVjb3JkKSkuc29ydCgpLnJldmVyc2UoKSk7JGjNj19vbmNlLnJlY29yZE5hbWVzKHJlY29yZE5hbWVzKTtcbmhhcmRlbihyZWNvcmROYW1lcyk7XG5cbi8qKlxuICogQXNzdW1pbmcgdGhhdCBgcmVjb3JkYCBpcyBhIENvcHlSZWNvcmQgYW5kIGBuYW1lc2AgaXMgYHJlY29yZE5hbWVzKHJlY29yZClgLFxuICogcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy5cbiAqXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBUXG4gKiBAcGFyYW0ge0NvcHlSZWNvcmQ8VD59IHJlY29yZFxuICogQHBhcmFtIHtzdHJpbmdbXX0gbmFtZXNcbiAqIEByZXR1cm5zIHtUW119XG4gKi9cbiAgICAgICBjb25zdCByZWNvcmRWYWx1ZXMgPSAocmVjb3JkLCBuYW1lcykgPT5cbiAgaGFyZGVuKG5hbWVzLm1hcChuYW1lID0+IHJlY29yZFtuYW1lXSkpOyRozY9fb25jZS5yZWNvcmRWYWx1ZXMocmVjb3JkVmFsdWVzKTtcbmhhcmRlbihyZWNvcmRWYWx1ZXMpO1xuXG5jb25zdCB6ZXJvZXMgPSBBcnJheSgxNilcbiAgLmZpbGwodW5kZWZpbmVkKVxuICAubWFwKChfLCBpKSA9PiAnMCcucmVwZWF0KGkpKTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IG5cbiAqIEBwYXJhbSB7bnVtYmVyfSBzaXplXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG4gICAgICAgY29uc3QgemVyb1BhZCA9IChuLCBzaXplKSA9PiB7XG4gIGNvbnN0IG5TdHIgPSBgJHtufWA7XG4gIGNvbnN0IGZpbGxMZW4gPSBzaXplIC0gblN0ci5sZW5ndGg7XG4gIGlmIChmaWxsTGVuID09PSAwKSByZXR1cm4gblN0cjtcbiAgYXNzZXJ0KGZpbGxMZW4gPiAwICYmIGZpbGxMZW4gPCB6ZXJvZXMubGVuZ3RoKTtcbiAgcmV0dXJuIGAke3plcm9lc1tmaWxsTGVuXX0ke25TdHJ9YDtcbn07JGjNj19vbmNlLnplcm9QYWQoemVyb1BhZCk7XG5oYXJkZW4oemVyb1BhZCk7XG5cbi8qIFRoaXMgaXMgdGhlIEphdmFTY3JpcHQgYW5hbG9nIHRvIGEgQyB1bmlvbjogYSB3YXkgdG8gbWFwIGJldHdlZW4gYSBmbG9hdCBhcyBhKi9cbi8qIG51bWJlciBhbmQgdGhlIGJpdHMgdGhhdCByZXByZXNlbnQgdGhlIGZsb2F0IGFzIGEgYnVmZmVyIGZ1bGwgb2YgYnl0ZXMuICBOb3RlKi9cbi8qIHRoYXQgdGhlIG11dGF0aW9uIG9mIHN0YXRpYyBzdGF0ZSBoZXJlIG1ha2VzIHRoaXMgaW52YWxpZCBKZXNzaWUgY29kZSwgYnV0Ki9cbi8qIGRvaW5nIGl0IHRoaXMgd2F5IHNhdmVzIHRoZSBudWdhdG9yeSBhbmQgZ3JhdHVpdG91cyBhbGxvY2F0aW9ucyB0aGF0IHdvdWxkKi9cbi8qIGhhcHBlbiBldmVyeSB0aW1lIHlvdSBkbyBhIGNvbnZlcnNpb24gLS0gYW5kIGluIHByYWN0aWNhbCB0ZXJtcyBpdCdzIHNhZmUqL1xuLyogYmVjYXVzZSB3ZSBwdXQgdGhlIHZhbHVlIGluIG9uZSBzaWRlIGFuZCB0aGVuIGltbWVkaWF0ZWx5IHRha2UgaXQgb3V0IHRoZSovXG4vKiBvdGhlcjsgdGhlcmUgaXMgbm8gYWN0dWFsIHN0YXRlIHJldGFpbmVkIGluIHRoZSBjbGFzc2ljIHNlbnNlIGFuZCB0aHVzIG5vKi9cbi8qIHJlLWVudHJhbmN5IGlzc3VlLiovXG5jb25zdCBhc051bWJlciA9IG5ldyBGbG9hdDY0QXJyYXkoMSk7XG5jb25zdCBhc0JpdHMgPSBuZXcgQmlnVWludDY0QXJyYXkoYXNOdW1iZXIuYnVmZmVyKTtcblxuLyogSmF2YVNjcmlwdCBudW1iZXJzIGFyZSBlbmNvZGVkIGJ5IG91dHB1dHRpbmcgdGhlIGJhc2UtMTYqL1xuLyogcmVwcmVzZW50YXRpb24gb2YgdGhlIGJpbmFyeSB2YWx1ZSBvZiB0aGUgdW5kZXJseWluZyBJRUVFIGZsb2F0aW5nIHBvaW50Ki9cbi8qIHJlcHJlc2VudGF0aW9uLiAgRm9yIG5lZ2F0aXZlIHZhbHVlcywgYWxsIGJpdHMgb2YgdGhpcyByZXByZXNlbnRhdGlvbiBhcmUqL1xuLyogY29tcGxlbWVudGVkIHByaW9yIHRvIHRoZSBiYXNlLTE2IGNvbnZlcnNpb24sIHdoaWxlIGZvciBwb3NpdGl2ZSB2YWx1ZXMsIHRoZSovXG4vKiBzaWduIGJpdCBpcyBjb21wbGVtZW50ZWQuICBUaGlzIGVuc3VyZXMgYm90aCB0aGF0IG5lZ2F0aXZlIHZhbHVlcyBzb3J0IGJlZm9yZSovXG4vKiBwb3NpdGl2ZSB2YWx1ZXMgYW5kIHRoYXQgbmVnYXRpdmUgdmFsdWVzIHNvcnQgYWNjb3JkaW5nIHRvIHRoZWlyIG5lZ2F0aXZlKi9cbi8qIG1hZ25pdHVkZSByYXRoZXIgdGhhbiB0aGVpciBwb3NpdGl2ZSBtYWduaXR1ZGUuICBUaGlzIHJlc3VsdHMgaW4gYW4gQVNDSUkqL1xuLyogZW5jb2Rpbmcgd2hvc2UgbGV4aWNvZ3JhcGhpYyBzb3J0IG9yZGVyIGlzIHRoZSBzYW1lIGFzIHRoZSBudW1lcmljIHNvcnQgb3JkZXIqL1xuLyogb2YgdGhlIGNvcnJlc3BvbmRpbmcgbnVtYmVycy4qL1xuXG4vKiBUT0RPIENob29zZSB0aGUgc2FtZSBjYW5vbmljYWwgTmFOIGVuY29kaW5nIHRoYXQgY29zbVdhc20gYW5kIGV3YXNtIGNob3NlLiovXG5jb25zdCBDYW5vbmljYWxOYU5CaXRzID0gJ2ZmZjgwMDAwMDAwMDAwMDAnO1xuXG4vKipcbiAqIEBwYXJhbSB7bnVtYmVyfSBuXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBlbmNvZGVCaW5hcnk2NCA9IG4gPT4ge1xuICAvKiBOb3JtYWxpemUgLTAgdG8gMCBhbmQgTmFOIHRvIGEgY2Fub25pY2FsIGVuY29kaW5nKi9cbiAgaWYgKGlzKG4sIC0wKSkge1xuICAgIG4gPSAwO1xuICB9IGVsc2UgaWYgKGlzKG4sIE5hTikpIHtcbiAgICByZXR1cm4gYGYke0Nhbm9uaWNhbE5hTkJpdHN9YDtcbiAgfVxuICBhc051bWJlclswXSA9IG47XG4gIGxldCBiaXRzID0gYXNCaXRzWzBdO1xuICBpZiAobiA8IDApIHtcbiAgICBiaXRzIF49IDB4ZmZmZmZmZmZmZmZmZmZmZm47XG4gIH0gZWxzZSB7XG4gICAgYml0cyBePSAweDgwMDAwMDAwMDAwMDAwMDBuO1xuICB9XG4gIHJldHVybiBgZiR7emVyb1BhZChiaXRzLnRvU3RyaW5nKDE2KSwgMTYpfWA7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGVkXG4gKiBAcGFyYW0ge251bWJlcn0gW3NraXBdXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5jb25zdCBkZWNvZGVCaW5hcnk2NCA9IChlbmNvZGVkLCBza2lwID0gMCkgPT4ge1xuICBlbmNvZGVkLmNoYXJBdChza2lwKSA9PT0gJ2YnIHx8IEZhaWxgRW5jb2RlZCBudW1iZXIgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuICBsZXQgYml0cyA9IEJpZ0ludChgMHgke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwICsgMSl9YCk7XG4gIGlmIChlbmNvZGVkLmNoYXJBdChza2lwICsgMSkgPCAnOCcpIHtcbiAgICBiaXRzIF49IDB4ZmZmZmZmZmZmZmZmZmZmZm47XG4gIH0gZWxzZSB7XG4gICAgYml0cyBePSAweDgwMDAwMDAwMDAwMDAwMDBuO1xuICB9XG4gIGFzQml0c1swXSA9IGJpdHM7XG4gIGNvbnN0IHJlc3VsdCA9IGFzTnVtYmVyWzBdO1xuICAhaXMocmVzdWx0LCAtMCkgfHxcbiAgICBGYWlsYFVuZXhwZWN0ZWQgbmVnYXRpdmUgemVybzogJHtnZXRTdWZmaXgoZW5jb2RlZCwgc2tpcCl9YDtcbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbi8qKlxuICogRW5jb2RlIGEgSmF2YVNjcmlwdCBiaWdpbnQgdXNpbmcgYSB2YXJpYW50IG9mIEVsaWFzIGRlbHRhIGNvZGluZywgd2l0aCBhblxuICogaW5pdGlhbCBjb21wb25lbnQgZm9yIHRoZSBsZW5ndGggb2YgdGhlIGRpZ2l0IGNvdW50IGFzIGEgdW5hcnkgc3RyaW5nLCBhXG4gKiBzZWNvbmQgY29tcG9uZW50IGZvciB0aGUgZGVjaW1hbCBkaWdpdCBjb3VudCwgYW5kIGEgdGhpcmQgY29tcG9uZW50IGZvciB0aGVcbiAqIGRlY2ltYWwgZGlnaXRzIHByZWNlZGVkIGJ5IGEgZ3JhdHVpdG91cyBzZXBhcmF0aW5nIGNvbG9uLlxuICogVG8gZW5zdXJlIHRoYXQgdGhlIGxleGljb2dyYXBoaWMgc29ydCBvcmRlciBvZiBlbmNvZGVkIHZhbHVlcyBtYXRjaGVzIHRoZVxuICogbnVtZXJpYyBzb3J0IG9yZGVyIG9mIHRoZSBjb3JyZXNwb25kaW5nIG51bWJlcnMsIHRoZSBjaGFyYWN0ZXJzIG9mIHRoZSB1bmFyeVxuICogcHJlZml4IGFyZSBkaWZmZXJlbnQgZm9yIG5lZ2F0aXZlIHZhbHVlcyAodHlwZSBcIm5cIiBmb2xsb3dlZCBieSBhbnkgbnVtYmVyIG9mXG4gKiBcIiNcInMgW3doaWNoIHNvcnQgYmVmb3JlIGRlY2ltYWwgZGlnaXRzXSkgdnMuIHBvc2l0aXZlIGFuZCB6ZXJvIHZhbHVlcyAodHlwZVxuICogXCJwXCIgZm9sbG93ZWQgYnkgYW55IG51bWJlciBvZiBcIn5cInMgW3doaWNoIHNvcnQgYWZ0ZXIgZGVjaW1hbCBkaWdpdHNdKSBhbmRcbiAqIGVhY2ggZGVjaW1hbCBkaWdpdCBvZiB0aGUgZW5jb2RpbmcgZm9yIGEgbmVnYXRpdmUgdmFsdWUgaXMgcmVwbGFjZWQgd2l0aCBpdHNcbiAqIHRlbidzIGNvbXBsZW1lbnQgKHNvIHRoYXQgbmVnYXRpdmUgdmFsdWVzIG9mIHRoZSBzYW1lIHNjYWxlIHNvcnQgYnlcbiAqICpkZXNjZW5kaW5nKiBhYnNvbHV0ZSB2YWx1ZSkuXG4gKlxuICogQHBhcmFtIHtiaWdpbnR9IG5cbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGVuY29kZUJpZ0ludCA9IG4gPT4ge1xuICBjb25zdCBhYnMgPSBuIDwgMG4gPyAtbiA6IG47XG4gIGNvbnN0IG5EaWdpdHMgPSBhYnMudG9TdHJpbmcoKS5sZW5ndGg7XG4gIGNvbnN0IGxEaWdpdHMgPSBuRGlnaXRzLnRvU3RyaW5nKCkubGVuZ3RoO1xuICBpZiAobiA8IDBuKSB7XG4gICAgcmV0dXJuIGBuJHtcbiAgICAgIC8qIEEgXCIjXCIgZm9yIGVhY2ggZGlnaXQgYmV5b25kIHRoZSBmaXJzdCovXG4gICAgICAvKiBpbiB0aGUgZGVjaW1hbCAqY291bnQqIG9mIGRlY2ltYWwgZGlnaXRzLiovXG4gICAgICAnIycucmVwZWF0KGxEaWdpdHMgLSAxKVxuICAgIH0ke1xuICAgICAgLyogVGhlIHRlbidzIGNvbXBsZW1lbnQgb2YgdGhlIGNvdW50IG9mIGRpZ2l0cy4qL1xuICAgICAgKDEwICoqIGxEaWdpdHMgLSBuRGlnaXRzKS50b1N0cmluZygpLnBhZFN0YXJ0KGxEaWdpdHMsICcwJylcbiAgICB9OiR7XG4gICAgICAvKiBUaGUgdGVuJ3MgY29tcGxlbWVudCBvZiB0aGUgZGlnaXRzLiovXG4gICAgICAoMTBuICoqIEJpZ0ludChuRGlnaXRzKSArIG4pLnRvU3RyaW5nKCkucGFkU3RhcnQobkRpZ2l0cywgJzAnKVxuICAgIH1gO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBgcCR7XG4gICAgICAvKiBBIFwiflwiIGZvciBlYWNoIGRpZ2l0IGJleW9uZCB0aGUgZmlyc3QqL1xuICAgICAgLyogaW4gdGhlIGRlY2ltYWwgKmNvdW50KiBvZiBkZWNpbWFsIGRpZ2l0cy4qL1xuICAgICAgJ34nLnJlcGVhdChsRGlnaXRzIC0gMSlcbiAgICB9JHtcbiAgICAgIC8qIFRoZSBjb3VudCBvZiBkaWdpdHMuKi9cbiAgICAgIG5EaWdpdHNcbiAgICB9OiR7XG4gICAgICAvKiBUaGUgZGlnaXRzLiovXG4gICAgICBuXG4gICAgfWA7XG4gIH1cbn07XG5cbmNvbnN0IHJCaWdJbnRQYXlsb2FkID0gLyhbMC05XSspKDooWzAtOV0rJHwpfCkvcztcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZFxuICogQHJldHVybnMge2JpZ2ludH1cbiAqL1xuY29uc3QgZGVjb2RlQmlnSW50ID0gZW5jb2RlZCA9PiB7XG4gIGNvbnN0IHR5cGVQcmVmaXggPSBlbmNvZGVkLmNoYXJBdCgwKTsgLyogZmFzdGVyIHRoYW4gZW5jb2RlZFswXSovXG4gIHR5cGVQcmVmaXggPT09ICdwJyB8fFxuICAgIHR5cGVQcmVmaXggPT09ICduJyB8fFxuICAgIEZhaWxgRW5jb2RlZCBiaWdpbnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuXG4gIGNvbnN0IHtcbiAgICBpbmRleDogbERpZ2l0cyxcbiAgICAxOiBzbkRpZ2l0cyxcbiAgICAyOiB0YWlsLFxuICAgIDM6IGRpZ2l0cyxcbiAgfSA9IGVuY29kZWQubWF0Y2gockJpZ0ludFBheWxvYWQpIHx8IEZhaWxgRGlnaXQgY291bnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gO1xuXG4gIHNuRGlnaXRzLmxlbmd0aCA9PT0gbERpZ2l0cyB8fFxuICAgIEZhaWxgVW5hcnktcHJlZml4ZWQgZGVjaW1hbCBkaWdpdCBjb3VudCBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG4gIGxldCBuRGlnaXRzID0gcGFyc2VJbnQoc25EaWdpdHMsIDEwKTtcbiAgaWYgKHR5cGVQcmVmaXggPT09ICduJykge1xuICAgIC8qIFRPRE8gQXNzZXJ0IHRvIHJlamVjdCBmb3JiaWRkZW4gZW5jb2RpbmdzKi9cbiAgICAvKiBsaWtlIFwibjA6XCIgYW5kIFwibjAwOuKAplwiIGFuZCBcIm45MTrigKZcIiB0aHJvdWdoIFwibjk5OuKAplwiPyovXG4gICAgbkRpZ2l0cyA9IDEwICoqIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyAobERpZ2l0cykgLSBuRGlnaXRzO1xuICB9XG5cbiAgdGFpbC5jaGFyQXQoMCkgPT09ICc6JyB8fCBGYWlsYFNlcGFyYXRvciBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG4gIGRpZ2l0cy5sZW5ndGggPT09IG5EaWdpdHMgfHxcbiAgICBGYWlsYEZpeGVkLWxlbmd0aCBkaWdpdCBzZXF1ZW5jZSBleHBlY3RlZDogJHtlbmNvZGVkfWA7XG4gIGxldCBuID0gQmlnSW50KGRpZ2l0cyk7XG4gIGlmICh0eXBlUHJlZml4ID09PSAnbicpIHtcbiAgICAvKiBUT0RPIEFzc2VydCB0byByZWplY3QgZm9yYmlkZGVuIGVuY29kaW5ncyovXG4gICAgLyogbGlrZSBcIm45OjBcIiBhbmQgXCJuODowMFwiIGFuZCBcIm44OjkxXCIgdGhyb3VnaCBcIm44Ojk5XCI/Ki9cbiAgICBuID0gLSgxMG4gKiogQmlnSW50KG5EaWdpdHMpIC0gbik7XG4gIH1cblxuICByZXR1cm4gbjtcbn07XG5cbi8qKlxuICogQSBzcGFyc2UgYXJyYXkgZm9yIHdoaWNoIGV2ZXJ5IHByZXNlbnQgaW5kZXggbWFwcyBhIGNvZGUgcG9pbnQgaW4gdGhlIEFTQ0lJXG4gKiByYW5nZSB0byBhIGNvcnJlc3BvbmRpbmcgZXNjYXBlIHNlcXVlbmNlLlxuICpcbiAqIEVzY2FwZXMgYWxsIGNoYXJhY3RlcnMgZnJvbSBVKzAwMDAgTlVMTCB0byBVKzAwMUYgSU5GT1JNQVRJT04gU0VQQVJBVE9SIE9ORVxuICogbGlrZSBgITxjaGFyYWN0ZXIgb2Zmc2V0IGJ5IDB4MjE+YCB0byBhdm9pZCBKU09OLnN0cmluZ2lmeSBleHBhbnNpb24gYXNcbiAqIGBcXHVISEhIYCwgYW5kIHNwZWNpYWxseSBlc2NhcGVzIFUrMDAyMCBTUEFDRSAodGhlIGFycmF5IGVsZW1lbnQgdGVybWluYXRvcilcbiAqIGFzIGAhX2AgYW5kIFUrMDAyMSBFWENMQU1BVElPTiBNQVJLICh0aGUgZXNjYXBlIHByZWZpeCkgYXMgYCF8YCAoYm90aCBjaG9zZW5cbiAqIGZvciB2aXN1YWwgYXBwcm94aW1hdGlvbikuXG4gKiBSZWxhdGl2ZSBsZXhpY29ncmFwaGljIG9yZGVyaW5nIGlzIHByZXNlcnZlZCBieSB0aGlzIG1hcHBpbmcgb2YgYW55IGNoYXJhY3RlclxuICogYXQgb3IgYmVmb3JlIGAhYCBpbiB0aGUgY29udGlndW91cyByYW5nZSBbMHgwMC4uMHgyMV0gdG8gYSByZXNwZWN0aXZlXG4gKiBjaGFyYWN0ZXIgaW4gWzB4MjEuLjB4NDAsIDB4NUYsIDB4N0NdIHByZWNlZGVkIGJ5IGAhYCAod2hpY2ggaXMgaXRzZWxmIGluIHRoZVxuICogcmVwbGFjZWQgcmFuZ2UpLlxuICogU2ltaWxhcmx5LCBlc2NhcGVzIGBeYCBhcyBgX0BgIGFuZCBgX2AgYXMgYF9fYCBiZWNhdXNlIGBeYCBpbmRpY2F0ZXMgdGhlXG4gKiBzdGFydCBvZiBhbiBlbmNvZGVkIGFycmF5LlxuICpcbiAqIEB0eXBlIHtBcnJheTxzdHJpbmc+fVxuICovXG5jb25zdCBzdHJpbmdFc2NhcGVzID0gQXJyYXkoMHgyMilcbiAgLmZpbGwodW5kZWZpbmVkKVxuICAubWFwKChfLCBjcCkgPT4ge1xuICAgIHN3aXRjaCAoU3RyaW5nLmZyb21DaGFyQ29kZShjcCkpIHtcbiAgICAgIGNhc2UgJyAnOlxuICAgICAgICByZXR1cm4gJyFfJztcbiAgICAgIGNhc2UgJyEnOlxuICAgICAgICByZXR1cm4gJyF8JztcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBgISR7U3RyaW5nLmZyb21DaGFyQ29kZShjcCArIDB4MjEpfWA7XG4gICAgfVxuICB9KTtcbnN0cmluZ0VzY2FwZXNbJ14nLmNoYXJDb2RlQXQoMCldID0gJ19AJztcbnN0cmluZ0VzY2FwZXNbJ18nLmNoYXJDb2RlQXQoMCldID0gJ19fJztcblxuLyoqXG4gKiBFbmNvZGVzIGEgc3RyaW5nIHdpdGggZXNjYXBlIHNlcXVlbmNlcyBmb3IgdXNlIGluIHRoZSBcImNvbXBhY3RPcmRlcmVkXCIgZm9ybWF0LlxuICpcbiAqIEB0eXBlIHsoc3RyOiBzdHJpbmcpID0+IHN0cmluZ31cbiAqL1xuY29uc3QgZW5jb2RlQ29tcGFjdFN0cmluZ1N1ZmZpeCA9IHN0ciA9PlxuICBzdHIucmVwbGFjZSgvW1xcMC0hXl9dL2csIGNoID0+IHN0cmluZ0VzY2FwZXNbY2guY2hhckNvZGVBdCgwKV0pO1xuXG4vKipcbiAqIERlY29kZXMgYSBzdHJpbmcgZnJvbSB0aGUgXCJjb21wYWN0T3JkZXJlZFwiIGZvcm1hdC5cbiAqXG4gKiBAdHlwZSB7KGVuY29kZWQ6IHN0cmluZykgPT4gc3RyaW5nfVxuICovXG5jb25zdCBkZWNvZGVDb21wYWN0U3RyaW5nU3VmZml4ID0gZW5jb2RlZCA9PiB7XG4gIHJldHVybiBlbmNvZGVkLnJlcGxhY2UoLyhbXFwwLSFfXSkoLnxcXG4pPy9nLCAoZXNjLCBwcmVmaXgsIHN1ZmZpeCkgPT4ge1xuICAgIHN3aXRjaCAoZXNjKSB7XG4gICAgICBjYXNlICchXyc6XG4gICAgICAgIHJldHVybiAnICc7XG4gICAgICBjYXNlICchfCc6XG4gICAgICAgIHJldHVybiAnISc7XG4gICAgICBjYXNlICdfQCc6XG4gICAgICAgIHJldHVybiAnXic7XG4gICAgICBjYXNlICdfXyc6XG4gICAgICAgIHJldHVybiAnXyc7XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGNvbnN0IGNoID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChzdWZmaXgpO1xuICAgICAgICAvKiBUaGUgcmFuZ2Ugb2YgdmFsaWQgYCFgLWVzY2FwZSBzdWZmaXhlcyBpcyBbKDB4MDArMHgyMSkuLigweDFGKzB4MjEpXSwgaS5lLiovXG4gICAgICAgIC8qIFsweDIxLi4weDQwXSAoVSswMDIxIEVYQ0xBTUFUSU9OIE1BUksgdG8gVSswMDQwIENPTU1FUkNJQUwgQVQpLiovXG4gICAgICAgIChwcmVmaXggPT09ICchJyAmJiBzdWZmaXggIT09IHVuZGVmaW5lZCAmJiBjaCA+PSAnIScgJiYgY2ggPD0gJ0AnKSB8fFxuICAgICAgICAgIEZhaWxgaW52YWxpZCBzdHJpbmcgZXNjYXBlOiAke3EoZXNjKX1gO1xuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjaC5jaGFyQ29kZUF0KDApIC0gMHgyMSk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn07XG5cbi8qKlxuICogVHJpdmlhbGx5IGlkZW50aXR5LWVuY29kZXMgYSBzdHJpbmcgZm9yIHVzZSBpbiB0aGUgXCJsZWdhY3lPcmRlcmVkXCIgZm9ybWF0LlxuICpcbiAqIEB0eXBlIHsoc3RyOiBzdHJpbmcpID0+IHN0cmluZ31cbiAqL1xuY29uc3QgZW5jb2RlTGVnYWN5U3RyaW5nU3VmZml4ID0gc3RyID0+IHN0cjtcblxuLyoqXG4gKiBUcml2aWFsbHkgaWRlbnRpdHktZGVjb2RlcyBhIHN0cmluZyBmcm9tIHRoZSBcImxlZ2FjeU9yZGVyZWRcIiBmb3JtYXQuXG4gKlxuICogQHR5cGUgeyhlbmNvZGVkOiBzdHJpbmcpID0+IHN0cmluZ31cbiAqL1xuY29uc3QgZGVjb2RlTGVnYWN5U3RyaW5nU3VmZml4ID0gZW5jb2RlZCA9PiBlbmNvZGVkO1xuXG4vKipcbiAqIEVuY29kZXMgYW4gYXJyYXkgaW50byBhIHNlcXVlbmNlIG9mIGVuY29kZWQgZWxlbWVudHMgZm9yIHVzZSBpbiB0aGUgXCJjb21wYWN0T3JkZXJlZFwiXG4gKiBmb3JtYXQsIGVhY2ggdGVybWluYXRlZCBieSBhIHNwYWNlICh3aGljaCBpcyBwYXJ0IG9mIHRoZSBlc2NhcGVkIHJhbmdlIGluXG4gKiBcImNvbXBhY3RPcmRlcmVkXCIgZW5jb2RlZCBzdHJpbmdzKS5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IGFycmF5XG4gKiBAcGFyYW0geyhwOiBQYXNzYWJsZSkgPT4gc3RyaW5nfSBlbmNvZGVQYXNzYWJsZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZW5jb2RlQ29tcGFjdEFycmF5ID0gKGFycmF5LCBlbmNvZGVQYXNzYWJsZSkgPT4ge1xuICBjb25zdCBjaGFycyA9IFsnXiddO1xuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgYXJyYXkpIHtcbiAgICBjb25zdCBlbmMgPSBlbmNvZGVQYXNzYWJsZShlbGVtZW50KTtcbiAgICBjaGFycy5wdXNoKGVuYywgJyAnKTtcbiAgfVxuICByZXR1cm4gY2hhcnMuam9pbignJyk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGVkXG4gKiBAcGFyYW0geyhlbmNvZGVkOiBzdHJpbmcpID0+IFBhc3NhYmxlfSBkZWNvZGVQYXNzYWJsZVxuICogQHBhcmFtIHtudW1iZXJ9IFtza2lwXVxuICogQHJldHVybnMge0FycmF5fVxuICovXG5jb25zdCBkZWNvZGVDb21wYWN0QXJyYXkgPSAoZW5jb2RlZCwgZGVjb2RlUGFzc2FibGUsIHNraXAgPSAwKSA9PiB7XG4gIGNvbnN0IGVsZW1lbnRzID0gW107XG4gIGxldCBkZXB0aCA9IDA7XG4gIC8qIFNjYW4gZW5jb2RlZCByYXRoZXIgdGhhbiBpdHMgdGFpbCB0byBhdm9pZCBzbG93IGBzdWJzdHJpbmdgIGluIFhTLiovXG4gIC8qIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMTk4NCovXG4gIGxldCBuZXh0SW5kZXggPSBza2lwICsgMTtcbiAgbGV0IGN1cnJlbnRFbGVtZW50U3RhcnQgPSBza2lwICsgMTtcbiAgZm9yIChjb25zdCB7IDA6IGNoLCBpbmRleDogaSB9IG9mIGVuY29kZWQubWF0Y2hBbGwoL1tcXF4gXS9nKSkge1xuICAgIGNvbnN0IGluZGV4ID0gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChpKTtcbiAgICBpZiAoaW5kZXggPD0gc2tpcCkge1xuICAgICAgaWYgKGluZGV4ID09PSBza2lwKSB7XG4gICAgICAgIGNoID09PSAnXicgfHwgRmFpbGBFbmNvZGVkIGFycmF5IGV4cGVjdGVkOiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoY2ggPT09ICdeJykge1xuICAgICAgLyogVGhpcyBpcyB0aGUgc3RhcnQgb2YgYSBuZXN0ZWQgYXJyYXkuKi9cbiAgICAgIC8qIFRPRE86IFNpbmNlIHRoZSBzeW50YXggb2YgbmVzdGVkIGFycmF5cyBtdXN0IGJlIHZhbGlkYXRlZCBhcyBwYXJ0IG9mKi9cbiAgICAgIC8qIGRlY29kaW5nIHRoZSBvdXRlciBvbmUsIGNvbnNpZGVyIGRlY29kaW5nIHRoZW0gaGVyZSBpbnRvIGEgc2hhcmVkIGNhY2hlKi9cbiAgICAgIC8qIHJhdGhlciB0aGFuIGRpc2NhcmRpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlaXIgY29udGVudHMgdW50aWwgdGhlIGxhdGVyKi9cbiAgICAgIC8qIGRlY29kZVBhc3NhYmxlLiovXG4gICAgICBkZXB0aCArPSAxO1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBUaGlzIGlzIGEgdGVybWluYXRlZCBlbGVtZW50LiovXG4gICAgICBpZiAoaW5kZXggPT09IG5leHRJbmRleCkge1xuICAgICAgICAvKiBBIHRlcm1pbmF0b3IgYWZ0ZXIgYFtgIG9yIGFuIGFub3RoZXIgdGVybWluYXRvciBpbmRpY2F0ZXMgdGhhdCBhbiBhcnJheSBpcyBkb25lLiovXG4gICAgICAgIGRlcHRoIC09IDE7XG4gICAgICAgIGRlcHRoID49IDAgfHxcbiAgICAgICAgICAvKiBwcmV0dGllci1pZ25vcmUqL1xuICAgICAgICAgIEZhaWxgdW5leHBlY3RlZCBhcnJheSBlbGVtZW50IHRlcm1pbmF0b3I6ICR7ZW5jb2RlZC5zbGljZShza2lwLCBpbmRleCArIDIpfWA7XG4gICAgICB9XG4gICAgICBpZiAoZGVwdGggPT09IDApIHtcbiAgICAgICAgLyogV2UgaGF2ZSBhIGNvbXBsZXRlIGVsZW1lbnQgb2YgdGhlIHRvcG1vc3QgYXJyYXkuKi9cbiAgICAgICAgZWxlbWVudHMucHVzaChcbiAgICAgICAgICBkZWNvZGVQYXNzYWJsZShlbmNvZGVkLnNsaWNlKGN1cnJlbnRFbGVtZW50U3RhcnQsIGluZGV4KSksXG4gICAgICAgICk7XG4gICAgICAgIGN1cnJlbnRFbGVtZW50U3RhcnQgPSBpbmRleCArIDE7XG4gICAgICB9XG4gICAgfVxuICAgIC8qIEFkdmFuY2UgdGhlIGluZGV4LiovXG4gICAgbmV4dEluZGV4ID0gaW5kZXggKyAxO1xuICB9XG4gIGRlcHRoID09PSAwIHx8IEZhaWxgdW50ZXJtaW5hdGVkIGFycmF5OiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICBuZXh0SW5kZXggPT09IGVuY29kZWQubGVuZ3RoIHx8XG4gICAgRmFpbGB1bnRlcm1pbmF0ZWQgYXJyYXkgZWxlbWVudDogJHtnZXRTdWZmaXgoXG4gICAgICBlbmNvZGVkLFxuICAgICAgY3VycmVudEVsZW1lbnRTdGFydCxcbiAgICApfWA7XG4gIHJldHVybiBoYXJkZW4oZWxlbWVudHMpO1xufTtcblxuLyoqXG4gKiBQZXJmb3JtcyB0aGUgb3JpZ2luYWwgYXJyYXkgZW5jb2RpbmcsIHdoaWNoIGVzY2FwZXMgYWxsIGVuY29kZWQgYXJyYXlcbiAqIGVsZW1lbnRzIHJhdGhlciB0aGFuIGp1c3Qgc3RyaW5ncyAoYFxcdTAwMDBgIGFzIHRoZSBlbGVtZW50IHRlcm1pbmF0b3IgYW5kXG4gKiBgXFx1MDAwMWAgYXMgdGhlIGVzY2FwZSBwcmVmaXggZm9yIGBcXHUwMDAwYCBvciBgXFx1MDAwMWApLlxuICogVGhpcyBuZWNlc3NpdGF0ZWQgYW4gdW5kZXNpcmFibGUgYW1vdW50IG9mIGl0ZXJhdGlvbiBhbmQgZXhwYW5zaW9uOyBzZWVcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNjAjZGlzY3Vzc2lvbl9yOTYwMzY5ODI2XG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBhcnJheVxuICogQHBhcmFtIHsocDogUGFzc2FibGUpID0+IHN0cmluZ30gZW5jb2RlUGFzc2FibGVcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbmNvbnN0IGVuY29kZUxlZ2FjeUFycmF5ID0gKGFycmF5LCBlbmNvZGVQYXNzYWJsZSkgPT4ge1xuICBjb25zdCBjaGFycyA9IFsnWyddO1xuICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgYXJyYXkpIHtcbiAgICBjb25zdCBlbmMgPSBlbmNvZGVQYXNzYWJsZShlbGVtZW50KTtcbiAgICBmb3IgKGNvbnN0IGMgb2YgZW5jKSB7XG4gICAgICBpZiAoYyA9PT0gJ1xcdTAwMDAnIHx8IGMgPT09ICdcXHUwMDAxJykge1xuICAgICAgICBjaGFycy5wdXNoKCdcXHUwMDAxJyk7XG4gICAgICB9XG4gICAgICBjaGFycy5wdXNoKGMpO1xuICAgIH1cbiAgICBjaGFycy5wdXNoKCdcXHUwMDAwJyk7XG4gIH1cbiAgcmV0dXJuIGNoYXJzLmpvaW4oJycpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZFxuICogQHBhcmFtIHsoZW5jb2RlZDogc3RyaW5nKSA9PiBQYXNzYWJsZX0gZGVjb2RlUGFzc2FibGVcbiAqIEBwYXJhbSB7bnVtYmVyfSBbc2tpcF1cbiAqIEByZXR1cm5zIHtBcnJheX1cbiAqL1xuY29uc3QgZGVjb2RlTGVnYWN5QXJyYXkgPSAoZW5jb2RlZCwgZGVjb2RlUGFzc2FibGUsIHNraXAgPSAwKSA9PiB7XG4gIGNvbnN0IGVsZW1lbnRzID0gW107XG4gIGNvbnN0IGVsZW1DaGFycyA9IFtdO1xuICAvKiBVc2UgYSBzdHJpbmcgaXRlcmF0b3IgdG8gYXZvaWQgc2xvdyBpbmRleGVkIGFjY2VzcyBpbiBYUy4qL1xuICAvKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzE5ODQqL1xuICBsZXQgc3RpbGxUb1NraXAgPSBza2lwICsgMTtcbiAgbGV0IGluRXNjYXBlID0gZmFsc2U7XG4gIGZvciAoY29uc3QgYyBvZiBlbmNvZGVkKSB7XG4gICAgaWYgKHN0aWxsVG9Ta2lwID4gMCkge1xuICAgICAgc3RpbGxUb1NraXAgLT0gMTtcbiAgICAgIGlmIChzdGlsbFRvU2tpcCA9PT0gMCkge1xuICAgICAgICBjID09PSAnWycgfHwgRmFpbGBFbmNvZGVkIGFycmF5IGV4cGVjdGVkOiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaW5Fc2NhcGUpIHtcbiAgICAgIGMgPT09ICdcXHUwMDAwJyB8fFxuICAgICAgICBjID09PSAnXFx1MDAwMScgfHxcbiAgICAgICAgRmFpbGBVbmV4cGVjdGVkIGNoYXJhY3RlciBhZnRlciB1MDAwMSBlc2NhcGU6ICR7Y31gO1xuICAgICAgZWxlbUNoYXJzLnB1c2goYyk7XG4gICAgfSBlbHNlIGlmIChjID09PSAnXFx1MDAwMCcpIHtcbiAgICAgIGNvbnN0IGVuY29kZWRFbGVtZW50ID0gZWxlbUNoYXJzLmpvaW4oJycpO1xuICAgICAgZWxlbUNoYXJzLmxlbmd0aCA9IDA7XG4gICAgICBjb25zdCBlbGVtZW50ID0gZGVjb2RlUGFzc2FibGUoZW5jb2RlZEVsZW1lbnQpO1xuICAgICAgZWxlbWVudHMucHVzaChlbGVtZW50KTtcbiAgICB9IGVsc2UgaWYgKGMgPT09ICdcXHUwMDAxJykge1xuICAgICAgaW5Fc2NhcGUgPSB0cnVlO1xuICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnRpbnVlKi9cbiAgICAgIGNvbnRpbnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICBlbGVtQ2hhcnMucHVzaChjKTtcbiAgICB9XG4gICAgaW5Fc2NhcGUgPSBmYWxzZTtcbiAgfVxuICAhaW5Fc2NhcGUgfHwgRmFpbGB1bmV4cGVjdGVkIGVuZCBvZiBlbmNvZGluZyAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICBlbGVtQ2hhcnMubGVuZ3RoID09PSAwIHx8XG4gICAgRmFpbGBlbmNvZGluZyB0ZXJtaW5hdGVkIGVhcmx5OiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICByZXR1cm4gaGFyZGVuKGVsZW1lbnRzKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtCeXRlQXJyYXl9IGJ5dGVBcnJheVxuICogQHBhcmFtIHsoYnl0ZUFycmF5OiBCeXRlQXJyYXkpID0+IHN0cmluZ30gX2VuY29kZVBhc3NhYmxlXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBlbmNvZGVCeXRlQXJyYXkgPSAoYnl0ZUFycmF5LCBfZW5jb2RlUGFzc2FibGUpID0+IHtcbiAgLyogVE9ETyBpbXBsZW1lbnQqL1xuICBGYWlsYGVuY29kZVBhc3NhYmxlKGJ5dGVBcnJheSkgbm90IHlldCBpbXBsZW1lbnRlZDogJHtieXRlQXJyYXl9YDtcbiAgcmV0dXJuICcnOyAvKiBKdXN0IGZvciB0aGUgdHlwZSovXG59O1xuXG5jb25zdCBlbmNvZGVSZWNvcmQgPSAocmVjb3JkLCBlbmNvZGVBcnJheSwgZW5jb2RlUGFzc2FibGUpID0+IHtcbiAgY29uc3QgbmFtZXMgPSByZWNvcmROYW1lcyhyZWNvcmQpO1xuICBjb25zdCB2YWx1ZXMgPSByZWNvcmRWYWx1ZXMocmVjb3JkLCBuYW1lcyk7XG4gIHJldHVybiBgKCR7ZW5jb2RlQXJyYXkoaGFyZGVuKFtuYW1lcywgdmFsdWVzXSksIGVuY29kZVBhc3NhYmxlKX1gO1xufTtcblxuY29uc3QgZGVjb2RlUmVjb3JkID0gKGVuY29kZWQsIGRlY29kZUFycmF5LCBkZWNvZGVQYXNzYWJsZSwgc2tpcCA9IDApID0+IHtcbiAgYXNzZXJ0KGVuY29kZWQuY2hhckF0KHNraXApID09PSAnKCcpO1xuICAvKiBTa2lwIHRoZSBcIihcIiBpbnNpZGUgYGRlY29kZUFycmF5YCB0byBhdm9pZCBzbG93IGBzdWJzdHJpbmdgIGluIFhTLiovXG4gIC8qIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMTk4NCovXG4gIGNvbnN0IHVuemlwcGVkRW50cmllcyA9IGRlY29kZUFycmF5KGVuY29kZWQsIGRlY29kZVBhc3NhYmxlLCBza2lwICsgMSk7XG4gIHVuemlwcGVkRW50cmllcy5sZW5ndGggPT09IDIgfHxcbiAgICBGYWlsYGV4cGVjdGVkIGtleXMsdmFsdWVzIHBhaXI6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gIGNvbnN0IFtrZXlzLCB2YWxzXSA9IHVuemlwcGVkRW50cmllcztcblxuICAocGFzc1N0eWxlT2Yoa2V5cykgPT09ICdjb3B5QXJyYXknICYmXG4gICAgcGFzc1N0eWxlT2YodmFscykgPT09ICdjb3B5QXJyYXknICYmXG4gICAga2V5cy5sZW5ndGggPT09IHZhbHMubGVuZ3RoICYmXG4gICAga2V5cy5ldmVyeShrZXkgPT4gdHlwZW9mIGtleSA9PT0gJ3N0cmluZycpKSB8fFxuICAgIEZhaWxgbm90IGEgdmFsaWQgcmVjb3JkIGVuY29kaW5nOiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICBjb25zdCBtYXBFbnRyaWVzID0ga2V5cy5tYXAoKGtleSwgaSkgPT4gW2tleSwgdmFsc1tpXV0pO1xuICBjb25zdCByZWNvcmQgPSBoYXJkZW4oZnJvbUVudHJpZXMobWFwRW50cmllcykpO1xuICBhc3NlcnRSZWNvcmQocmVjb3JkLCAnZGVjb2RlZCByZWNvcmQnKTtcbiAgcmV0dXJuIHJlY29yZDtcbn07XG5cbmNvbnN0IGVuY29kZVRhZ2dlZCA9ICh0YWdnZWQsIGVuY29kZUFycmF5LCBlbmNvZGVQYXNzYWJsZSkgPT5cbiAgYDoke2VuY29kZUFycmF5KGhhcmRlbihbZ2V0VGFnKHRhZ2dlZCksIHRhZ2dlZC5wYXlsb2FkXSksIGVuY29kZVBhc3NhYmxlKX1gO1xuXG5jb25zdCBkZWNvZGVUYWdnZWQgPSAoZW5jb2RlZCwgZGVjb2RlQXJyYXksIGRlY29kZVBhc3NhYmxlLCBza2lwID0gMCkgPT4ge1xuICBhc3NlcnQoZW5jb2RlZC5jaGFyQXQoc2tpcCkgPT09ICc6Jyk7XG4gIC8qIFNraXAgdGhlIFwiOlwiIGluc2lkZSBgZGVjb2RlQXJyYXlgIHRvIGF2b2lkIHNsb3cgYHN1YnN0cmluZ2AgaW4gWFMuKi9cbiAgLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL2lzc3Vlcy8xOTg0Ki9cbiAgY29uc3QgdGFnZ2VkUGF5bG9hZCA9IGRlY29kZUFycmF5KGVuY29kZWQsIGRlY29kZVBhc3NhYmxlLCBza2lwICsgMSk7XG4gIHRhZ2dlZFBheWxvYWQubGVuZ3RoID09PSAyIHx8XG4gICAgRmFpbGBleHBlY3RlZCB0YWcscGF5bG9hZCBwYWlyOiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICBjb25zdCBbdGFnLCBwYXlsb2FkXSA9IHRhZ2dlZFBheWxvYWQ7XG4gIHBhc3NTdHlsZU9mKHRhZykgPT09ICdzdHJpbmcnIHx8XG4gICAgRmFpbGBub3QgYSB2YWxpZCB0YWdnZWQgZW5jb2Rpbmc6ICR7Z2V0U3VmZml4KGVuY29kZWQsIHNraXApfWA7XG4gIHJldHVybiBtYWtlVGFnZ2VkKHRhZywgcGF5bG9hZCk7XG59O1xuXG5jb25zdCBtYWtlRW5jb2RlUmVtb3RhYmxlID0gKHVuc2FmZUVuY29kZVJlbW90YWJsZSwgdmVyaWZ5RW5jb2RpbmcpID0+IHtcbiAgY29uc3QgZW5jb2RlUmVtb3RhYmxlID0gKHIsIGlubmVyRW5jb2RlKSA9PiB7XG4gICAgY29uc3QgZW5jb2RpbmcgPSB1bnNhZmVFbmNvZGVSZW1vdGFibGUociwgaW5uZXJFbmNvZGUpO1xuICAgICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmIGVuY29kaW5nLmNoYXJBdCgwKSA9PT0gJ3InKSB8fFxuICAgICAgRmFpbGBSZW1vdGFibGUgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiclwiOiAke2VuY29kaW5nfWA7XG4gICAgdmVyaWZ5RW5jb2RpbmcoZW5jb2RpbmcsICdSZW1vdGFibGUnKTtcbiAgICByZXR1cm4gZW5jb2Rpbmc7XG4gIH07XG4gIHJldHVybiBlbmNvZGVSZW1vdGFibGU7XG59O1xuXG5jb25zdCBtYWtlRW5jb2RlUHJvbWlzZSA9ICh1bnNhZmVFbmNvZGVQcm9taXNlLCB2ZXJpZnlFbmNvZGluZykgPT4ge1xuICBjb25zdCBlbmNvZGVQcm9taXNlID0gKHAsIGlubmVyRW5jb2RlKSA9PiB7XG4gICAgY29uc3QgZW5jb2RpbmcgPSB1bnNhZmVFbmNvZGVQcm9taXNlKHAsIGlubmVyRW5jb2RlKTtcbiAgICAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJyAmJiBlbmNvZGluZy5jaGFyQXQoMCkgPT09ICc/JykgfHxcbiAgICAgIEZhaWxgUHJvbWlzZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCI/XCI6ICR7ZW5jb2Rpbmd9YDtcbiAgICB2ZXJpZnlFbmNvZGluZyhlbmNvZGluZywgJ1Byb21pc2UnKTtcbiAgICByZXR1cm4gZW5jb2Rpbmc7XG4gIH07XG4gIHJldHVybiBlbmNvZGVQcm9taXNlO1xufTtcblxuY29uc3QgbWFrZUVuY29kZUVycm9yID0gKHVuc2FmZUVuY29kZUVycm9yLCB2ZXJpZnlFbmNvZGluZykgPT4ge1xuICBjb25zdCBlbmNvZGVFcnJvciA9IChlcnIsIGlubmVyRW5jb2RlKSA9PiB7XG4gICAgY29uc3QgZW5jb2RpbmcgPSB1bnNhZmVFbmNvZGVFcnJvcihlcnIsIGlubmVyRW5jb2RlKTtcbiAgICAodHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJyAmJiBlbmNvZGluZy5jaGFyQXQoMCkgPT09ICchJykgfHxcbiAgICAgIEZhaWxgRXJyb3IgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiIVwiOiAke2VuY29kaW5nfWA7XG4gICAgdmVyaWZ5RW5jb2RpbmcoZW5jb2RpbmcsICdFcnJvcicpO1xuICAgIHJldHVybiBlbmNvZGluZztcbiAgfTtcbiAgcmV0dXJuIGVuY29kZUVycm9yO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFbmNvZGVPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcmVtb3RhYmxlOiBSZW1vdGFibGVPYmplY3QsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IHN0cmluZyxcbiAqICkgPT4gc3RyaW5nfSBbZW5jb2RlUmVtb3RhYmxlXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIHByb21pc2U6IFByb21pc2UsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IHN0cmluZyxcbiAqICkgPT4gc3RyaW5nfSBbZW5jb2RlUHJvbWlzZV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlcnJvcjogRXJyb3IsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IHN0cmluZyxcbiAqICkgPT4gc3RyaW5nfSBbZW5jb2RlRXJyb3JdXG4gKiBAcHJvcGVydHkgeydsZWdhY3lPcmRlcmVkJyB8ICdjb21wYWN0T3JkZXJlZCd9IFtmb3JtYXRdXG4gKi9cblxuLyoqXG4gKiBAcGFyYW0geyhzdHI6IHN0cmluZykgPT4gc3RyaW5nfSBlbmNvZGVTdHJpbmdTdWZmaXhcbiAqIEBwYXJhbSB7KGFycjogdW5rbm93bltdLCBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBzdHJpbmcpID0+IHN0cmluZ30gZW5jb2RlQXJyYXlcbiAqIEBwYXJhbSB7UmVxdWlyZWQ8RW5jb2RlT3B0aW9ucz4gJiB7dmVyaWZ5RW5jb2Rpbmc/OiAoZW5jb2RlZDogc3RyaW5nLCBsYWJlbDogc3RyaW5nKSA9PiB2b2lkfX0gb3B0aW9uc1xuICogQHJldHVybnMgeyhwOiBQYXNzYWJsZSkgPT4gc3RyaW5nfVxuICovXG5jb25zdCBtYWtlSW5uZXJFbmNvZGUgPSAoZW5jb2RlU3RyaW5nU3VmZml4LCBlbmNvZGVBcnJheSwgb3B0aW9ucykgPT4ge1xuICBjb25zdCB7XG4gICAgZW5jb2RlUmVtb3RhYmxlOiB1bnNhZmVFbmNvZGVSZW1vdGFibGUsXG4gICAgZW5jb2RlUHJvbWlzZTogdW5zYWZlRW5jb2RlUHJvbWlzZSxcbiAgICBlbmNvZGVFcnJvcjogdW5zYWZlRW5jb2RlRXJyb3IsXG4gICAgdmVyaWZ5RW5jb2RpbmcgPSAoKSA9PiB7fSxcbiAgfSA9IG9wdGlvbnM7XG4gIGNvbnN0IGVuY29kZVJlbW90YWJsZSA9IG1ha2VFbmNvZGVSZW1vdGFibGUoXG4gICAgdW5zYWZlRW5jb2RlUmVtb3RhYmxlLFxuICAgIHZlcmlmeUVuY29kaW5nLFxuICApO1xuICBjb25zdCBlbmNvZGVQcm9taXNlID0gbWFrZUVuY29kZVByb21pc2UodW5zYWZlRW5jb2RlUHJvbWlzZSwgdmVyaWZ5RW5jb2RpbmcpO1xuICBjb25zdCBlbmNvZGVFcnJvciA9IG1ha2VFbmNvZGVFcnJvcih1bnNhZmVFbmNvZGVFcnJvciwgdmVyaWZ5RW5jb2RpbmcpO1xuXG4gIGNvbnN0IGlubmVyRW5jb2RlID0gcGFzc2FibGUgPT4ge1xuICAgIGlmIChpc0Vycm9yTGlrZShwYXNzYWJsZSkpIHtcbiAgICAgIC8qIFdlIHB1bGwgb3V0IHRoaXMgc3BlY2lhbCBjYXNlIHRvIGFjY29tbW9kYXRlIGVycm9ycyB0aGF0IGFyZSBub3QqL1xuICAgICAgLyogdmFsaWQgUGFzc2FibGVzLiBGb3IgZXhhbXBsZSwgYmVjYXVzZSB0aGV5J3JlIG5vdCBmcm96ZW4uKi9cbiAgICAgIC8qIFRoZSBzcGVjaWFsIGNhc2UgY2FuIG9ubHkgZXZlciBhcHBseSBhdCB0aGUgcm9vdCwgYW5kIHRoZXJlZm9yZSovXG4gICAgICAvKiBvdXRzaWRlIHRoZSByZWN1cnNpb24sIHNpbmNlIGFuIGVycm9yIGNvdWxkIG9ubHkgYmUgZGVlcGVyIGluKi9cbiAgICAgIC8qIGEgcGFzc2FibGUgc3RydWN0dXJlIGlmIGl0IHdlcmUgcGFzc2FibGUuKi9cbiAgICAgIC8qKi9cbiAgICAgIC8qIFdlIHB1bGwgb3V0IHRoaXMgc3BlY2lhbCBjYXNlIGJlY2F1c2UsIGZvciB0aGVzZSBlcnJvcnMsIHdlJ3JlIG11Y2gqL1xuICAgICAgLyogbW9yZSBpbnRlcmVzdGVkIGluIHJlcG9ydGluZyB3aGF0ZXZlciBkaWFnbm9zdGljIGluZm9ybWF0aW9uIHRoZXkqL1xuICAgICAgLyogY2FycnkgdGhhbiB3ZSBhcmUgYWJvdXQgcmVwb3J0aW5nIHByb2JsZW1zIGVuY291bnRlcmVkIGluIHJlcG9ydGluZyovXG4gICAgICAvKiB0aGlzIGluZm9ybWF0aW9uLiovXG4gICAgICByZXR1cm4gZW5jb2RlRXJyb3IocGFzc2FibGUsIGlubmVyRW5jb2RlKTtcbiAgICB9XG4gICAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YocGFzc2FibGUpO1xuICAgIHN3aXRjaCAocGFzc1N0eWxlKSB7XG4gICAgICBjYXNlICdudWxsJzoge1xuICAgICAgICByZXR1cm4gJ3YnO1xuICAgICAgfVxuICAgICAgY2FzZSAndW5kZWZpbmVkJzoge1xuICAgICAgICByZXR1cm4gJ3onO1xuICAgICAgfVxuICAgICAgY2FzZSAnbnVtYmVyJzoge1xuICAgICAgICByZXR1cm4gZW5jb2RlQmluYXJ5NjQocGFzc2FibGUpO1xuICAgICAgfVxuICAgICAgY2FzZSAnc3RyaW5nJzoge1xuICAgICAgICByZXR1cm4gYHMke2VuY29kZVN0cmluZ1N1ZmZpeChwYXNzYWJsZSl9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOiB7XG4gICAgICAgIHJldHVybiBgYiR7cGFzc2FibGV9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2JpZ2ludCc6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kZUJpZ0ludChwYXNzYWJsZSk7XG4gICAgICB9XG4gICAgICBjYXNlICdyZW1vdGFibGUnOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVSZW1vdGFibGUocGFzc2FibGUsIGlubmVyRW5jb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICByZXR1cm4gZW5jb2RlRXJyb3IocGFzc2FibGUsIGlubmVyRW5jb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3Byb21pc2UnOiB7XG4gICAgICAgIHJldHVybiBlbmNvZGVQcm9taXNlKHBhc3NhYmxlLCBpbm5lckVuY29kZSk7XG4gICAgICB9XG4gICAgICBjYXNlICdzeW1ib2wnOiB7XG4gICAgICAgIC8qIFN0cmluZ3MgYW5kIHN5bWJvbHMgc2hhcmUgZW5jb2RpbmcgbG9naWMuKi9cbiAgICAgICAgY29uc3QgbmFtZSA9IG5hbWVGb3JQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSk7XG4gICAgICAgIGFzc2VydC50eXBlb2YobmFtZSwgJ3N0cmluZycpO1xuICAgICAgICByZXR1cm4gYHkke2VuY29kZVN0cmluZ1N1ZmZpeChuYW1lKX1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weUFycmF5Jzoge1xuICAgICAgICByZXR1cm4gZW5jb2RlQXJyYXkocGFzc2FibGUsIGlubmVyRW5jb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2J5dGVBcnJheSc6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kZUJ5dGVBcnJheShwYXNzYWJsZSwgaW5uZXJFbmNvZGUpO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kZVJlY29yZChwYXNzYWJsZSwgZW5jb2RlQXJyYXksIGlubmVyRW5jb2RlKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgcmV0dXJuIGVuY29kZVRhZ2dlZChwYXNzYWJsZSwgZW5jb2RlQXJyYXksIGlubmVyRW5jb2RlKTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgdGhyb3cgRmFpbGBhICR7cShwYXNzU3R5bGUpfSBjYW5ub3QgYmUgdXNlZCBhcyBhIGNvbGxlY3Rpb24gcGFzc2FibGVgO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGlubmVyRW5jb2RlO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWNvZGVPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFJlbW90YWJsZTogc3RyaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IHN0cmluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gUmVtb3RhYmxlT2JqZWN0fSBbZGVjb2RlUmVtb3RhYmxlXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRQcm9taXNlOiBzdHJpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogc3RyaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBQcm9taXNlfSBbZGVjb2RlUHJvbWlzZV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkRXJyb3I6IHN0cmluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBzdHJpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IEVycm9yfSBbZGVjb2RlRXJyb3JdXG4gKi9cblxuY29uc3QgbGliZXJhbERlY29kZXJzID0gLyoqIEB0eXBlIHtSZXF1aXJlZDxEZWNvZGVPcHRpb25zPn0gKi8gKFxuICAvKiogQHR5cGUge3Vua25vd259ICovICh7XG4gICAgZGVjb2RlUmVtb3RhYmxlOiAoX2VuY29kaW5nLCBfaW5uZXJEZWNvZGUpID0+IHVuZGVmaW5lZCxcbiAgICBkZWNvZGVQcm9taXNlOiAoX2VuY29kaW5nLCBfaW5uZXJEZWNvZGUpID0+IHVuZGVmaW5lZCxcbiAgICBkZWNvZGVFcnJvcjogKF9lbmNvZGluZywgX2lubmVyRGVjb2RlKSA9PiB1bmRlZmluZWQsXG4gIH0pXG4pO1xuXG4vKipcbiAqIEBwYXJhbSB7KGVuY29kZWQ6IHN0cmluZykgPT4gc3RyaW5nfSBkZWNvZGVTdHJpbmdTdWZmaXhcbiAqIEBwYXJhbSB7KGVuY29kZWQ6IHN0cmluZywgZGVjb2RlUmVjdXI6IChlOiBzdHJpbmcpID0+IFBhc3NhYmxlLCBza2lwPzogbnVtYmVyKSA9PiB1bmtub3duW119IGRlY29kZUFycmF5XG4gKiBAcGFyYW0ge1JlcXVpcmVkPERlY29kZU9wdGlvbnM+fSBvcHRpb25zXG4gKiBAcmV0dXJucyB7KGVuY29kZWQ6IHN0cmluZywgc2tpcD86IG51bWJlcikgPT4gUGFzc2FibGV9XG4gKi9cbmNvbnN0IG1ha2VJbm5lckRlY29kZSA9IChkZWNvZGVTdHJpbmdTdWZmaXgsIGRlY29kZUFycmF5LCBvcHRpb25zKSA9PiB7XG4gIGNvbnN0IHsgZGVjb2RlUmVtb3RhYmxlLCBkZWNvZGVQcm9taXNlLCBkZWNvZGVFcnJvciB9ID0gb3B0aW9ucztcbiAgLyoqIEB0eXBlIHsoZW5jb2RlZDogc3RyaW5nLCBza2lwPzogbnVtYmVyKSA9PiBQYXNzYWJsZX0gKi9cbiAgY29uc3QgaW5uZXJEZWNvZGUgPSAoZW5jb2RlZCwgc2tpcCA9IDApID0+IHtcbiAgICBzd2l0Y2ggKGVuY29kZWQuY2hhckF0KHNraXApKSB7XG4gICAgICBjYXNlICd2Jzoge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3onOiB7XG4gICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBjYXNlICdmJzoge1xuICAgICAgICByZXR1cm4gZGVjb2RlQmluYXJ5NjQoZW5jb2RlZCwgc2tpcCk7XG4gICAgICB9XG4gICAgICBjYXNlICdzJzoge1xuICAgICAgICByZXR1cm4gZGVjb2RlU3RyaW5nU3VmZml4KGdldFN1ZmZpeChlbmNvZGVkLCBza2lwICsgMSkpO1xuICAgICAgfVxuICAgICAgY2FzZSAnYic6IHtcbiAgICAgICAgY29uc3Qgc3Vic3RyaW5nID0gZ2V0U3VmZml4KGVuY29kZWQsIHNraXAgKyAxKTtcbiAgICAgICAgaWYgKHN1YnN0cmluZyA9PT0gJ3RydWUnKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAoc3Vic3RyaW5nID09PSAnZmFsc2UnKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IEZhaWxgZXhwZWN0ZWQgZW5jb2RlZCBib29sZWFuIHRvIGJlIFwiYnRydWVcIiBvciBcImJmYWxzZVwiOiAke3N1YnN0cmluZ31gO1xuICAgICAgfVxuICAgICAgY2FzZSAnbic6XG4gICAgICBjYXNlICdwJzoge1xuICAgICAgICByZXR1cm4gZGVjb2RlQmlnSW50KGdldFN1ZmZpeChlbmNvZGVkLCBza2lwKSk7XG4gICAgICB9XG4gICAgICBjYXNlICdyJzoge1xuICAgICAgICByZXR1cm4gZGVjb2RlUmVtb3RhYmxlKGdldFN1ZmZpeChlbmNvZGVkLCBza2lwKSwgaW5uZXJEZWNvZGUpO1xuICAgICAgfVxuICAgICAgY2FzZSAnPyc6IHtcbiAgICAgICAgcmV0dXJuIGRlY29kZVByb21pc2UoZ2V0U3VmZml4KGVuY29kZWQsIHNraXApLCBpbm5lckRlY29kZSk7XG4gICAgICB9XG4gICAgICBjYXNlICchJzoge1xuICAgICAgICByZXR1cm4gZGVjb2RlRXJyb3IoZ2V0U3VmZml4KGVuY29kZWQsIHNraXApLCBpbm5lckRlY29kZSk7XG4gICAgICB9XG4gICAgICBjYXNlICd5Jzoge1xuICAgICAgICAvKiBTdHJpbmdzIGFuZCBzeW1ib2xzIHNoYXJlIGRlY29kaW5nIGxvZ2ljLiovXG4gICAgICAgIGNvbnN0IG5hbWUgPSBkZWNvZGVTdHJpbmdTdWZmaXgoZ2V0U3VmZml4KGVuY29kZWQsIHNraXAgKyAxKSk7XG4gICAgICAgIHJldHVybiBwYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG4gICAgICB9XG4gICAgICBjYXNlICdbJzpcbiAgICAgIGNhc2UgJ14nOiB7XG4gICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgVHlwZSAndW5rbm93bltdJyBpcyBub3QgUGFzc2FibGUqL1xuICAgICAgICByZXR1cm4gZGVjb2RlQXJyYXkoZW5jb2RlZCwgaW5uZXJEZWNvZGUsIHNraXApO1xuICAgICAgfVxuICAgICAgY2FzZSAnKCc6IHtcbiAgICAgICAgcmV0dXJuIGRlY29kZVJlY29yZChlbmNvZGVkLCBkZWNvZGVBcnJheSwgaW5uZXJEZWNvZGUsIHNraXApO1xuICAgICAgfVxuICAgICAgY2FzZSAnOic6IHtcbiAgICAgICAgcmV0dXJuIGRlY29kZVRhZ2dlZChlbmNvZGVkLCBkZWNvZGVBcnJheSwgaW5uZXJEZWNvZGUsIHNraXApO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBGYWlsYGludmFsaWQgZGF0YWJhc2Uga2V5OiAke2dldFN1ZmZpeChlbmNvZGVkLCBza2lwKX1gO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGlubmVyRGVjb2RlO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQYXNzYWJsZUtpdFxuICogQHByb3BlcnR5IHtSZXR1cm5UeXBlPG1ha2VJbm5lckVuY29kZT59IGVuY29kZVBhc3NhYmxlXG4gKiBAcHJvcGVydHkge1JldHVyblR5cGU8bWFrZUlubmVyRGVjb2RlPn0gZGVjb2RlUGFzc2FibGVcbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2RlT3B0aW9ucyAmIERlY29kZU9wdGlvbnN9IFtvcHRpb25zXVxuICogQHJldHVybnMge1Bhc3NhYmxlS2l0fVxuICovXG4gICAgICAgY29uc3QgbWFrZVBhc3NhYmxlS2l0ID0gKG9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZW5jb2RlUmVtb3RhYmxlID0gKHIsIF8pID0+IEZhaWxgcmVtb3RhYmxlIHVuZXhwZWN0ZWQ6ICR7cn1gLFxuICAgIGVuY29kZVByb21pc2UgPSAocCwgXykgPT4gRmFpbGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cH1gLFxuICAgIGVuY29kZUVycm9yID0gKGVyciwgXykgPT4gRmFpbGBlcnJvciB1bmV4cGVjdGVkOiAke2Vycn1gLFxuICAgIGZvcm1hdCA9ICdsZWdhY3lPcmRlcmVkJyxcblxuICAgIGRlY29kZVJlbW90YWJsZSA9IChlbmNvZGluZywgXykgPT4gRmFpbGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gLFxuICAgIGRlY29kZVByb21pc2UgPSAoZW5jb2RpbmcsIF8pID0+IEZhaWxgcHJvbWlzZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWAsXG4gICAgZGVjb2RlRXJyb3IgPSAoZW5jb2RpbmcsIF8pID0+IEZhaWxgZXJyb3IgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gLFxuICB9ID0gb3B0aW9ucztcblxuICAvKiogQHR5cGUge1Bhc3NhYmxlS2l0WydlbmNvZGVQYXNzYWJsZSddfSAqL1xuICBsZXQgZW5jb2RlUGFzc2FibGU7XG4gIGNvbnN0IGVuY29kZU9wdGlvbnMgPSB7IGVuY29kZVJlbW90YWJsZSwgZW5jb2RlUHJvbWlzZSwgZW5jb2RlRXJyb3IsIGZvcm1hdCB9O1xuICBpZiAoZm9ybWF0ID09PSAnY29tcGFjdE9yZGVyZWQnKSB7XG4gICAgY29uc3QgbGliZXJhbERlY29kZSA9IG1ha2VJbm5lckRlY29kZShcbiAgICAgIGRlY29kZUNvbXBhY3RTdHJpbmdTdWZmaXgsXG4gICAgICBkZWNvZGVDb21wYWN0QXJyYXksXG4gICAgICBsaWJlcmFsRGVjb2RlcnMsXG4gICAgKTtcbiAgICAvKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBlbmNvZGluZ1xuICogQHBhcmFtIHtzdHJpbmd9IGxhYmVsXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuICAgIGNvbnN0IHZlcmlmeUVuY29kaW5nID0gKGVuY29kaW5nLCBsYWJlbCkgPT4ge1xuICAgICAgIWVuY29kaW5nLm1hdGNoKHJDMCkgfHxcbiAgICAgICAgRmFpbGAke2IoXG4gICAgICAgICAgbGFiZWwsXG4gICAgICAgICl9IGVuY29kaW5nIG11c3Qgbm90IGNvbnRhaW4gYSBDMCBjb250cm9sIGNoYXJhY3RlcjogJHtlbmNvZGluZ31gO1xuICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZUNvbXBhY3RBcnJheShgXnYgJHtlbmNvZGluZ30gdiBgLCBsaWJlcmFsRGVjb2RlKTtcbiAgICAgIChpc0FycmF5KGRlY29kZWQpICYmXG4gICAgICAgIGRlY29kZWQubGVuZ3RoID09PSAzICYmXG4gICAgICAgIGRlY29kZWRbMF0gPT09IG51bGwgJiZcbiAgICAgICAgZGVjb2RlZFsyXSA9PT0gbnVsbCkgfHxcbiAgICAgICAgRmFpbGAke2IobGFiZWwpfSBlbmNvZGluZyBtdXN0IGJlIGVtYmVkZGFibGU6ICR7ZW5jb2Rpbmd9YDtcbiAgICB9O1xuICAgIGNvbnN0IGVuY29kZUNvbXBhY3QgPSBtYWtlSW5uZXJFbmNvZGUoXG4gICAgICBlbmNvZGVDb21wYWN0U3RyaW5nU3VmZml4LFxuICAgICAgZW5jb2RlQ29tcGFjdEFycmF5LFxuICAgICAgeyAuLi5lbmNvZGVPcHRpb25zLCB2ZXJpZnlFbmNvZGluZyB9LFxuICAgICk7XG4gICAgZW5jb2RlUGFzc2FibGUgPSBwYXNzYWJsZSA9PiBgfiR7ZW5jb2RlQ29tcGFjdChwYXNzYWJsZSl9YDtcbiAgfSBlbHNlIGlmIChmb3JtYXQgPT09ICdsZWdhY3lPcmRlcmVkJykge1xuICAgIGVuY29kZVBhc3NhYmxlID0gbWFrZUlubmVyRW5jb2RlKFxuICAgICAgZW5jb2RlTGVnYWN5U3RyaW5nU3VmZml4LFxuICAgICAgZW5jb2RlTGVnYWN5QXJyYXksXG4gICAgICBlbmNvZGVPcHRpb25zLFxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgRmFpbGBVbnJlY29nbml6ZWQgZm9ybWF0OiAke3EoZm9ybWF0KX1gO1xuICB9XG5cbiAgY29uc3QgZGVjb2RlT3B0aW9ucyA9IHsgZGVjb2RlUmVtb3RhYmxlLCBkZWNvZGVQcm9taXNlLCBkZWNvZGVFcnJvciB9O1xuICBjb25zdCBkZWNvZGVDb21wYWN0ID0gbWFrZUlubmVyRGVjb2RlKFxuICAgIGRlY29kZUNvbXBhY3RTdHJpbmdTdWZmaXgsXG4gICAgZGVjb2RlQ29tcGFjdEFycmF5LFxuICAgIGRlY29kZU9wdGlvbnMsXG4gICk7XG4gIGNvbnN0IGRlY29kZUxlZ2FjeSA9IG1ha2VJbm5lckRlY29kZShcbiAgICBkZWNvZGVMZWdhY3lTdHJpbmdTdWZmaXgsXG4gICAgZGVjb2RlTGVnYWN5QXJyYXksXG4gICAgZGVjb2RlT3B0aW9ucyxcbiAgKTtcbiAgY29uc3QgZGVjb2RlUGFzc2FibGUgPSBlbmNvZGVkID0+IHtcbiAgICAvKiBBIGxlYWRpbmcgXCJ+XCIgaW5kaWNhdGVzIHRoZSB2MiBlbmNvZGluZyAod2l0aCBlc2NhcGluZyBpbiBzdHJpbmdzIHJhdGhlciB0aGFuIGFycmF5cykuKi9cbiAgICAvKiBTa2lwIGl0IGluc2lkZSBgZGVjb2RlQ29tcGFjdGAgdG8gYXZvaWQgc2xvdyBgc3Vic3RyaW5nYCBpbiBYUy4qL1xuICAgIC8qIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMTk4NCovXG4gICAgaWYgKGVuY29kZWQuY2hhckF0KDApID09PSAnficpIHtcbiAgICAgIHJldHVybiBkZWNvZGVDb21wYWN0KGVuY29kZWQsIDEpO1xuICAgIH1cbiAgICByZXR1cm4gZGVjb2RlTGVnYWN5KGVuY29kZWQpO1xuICB9O1xuXG4gIHJldHVybiBoYXJkZW4oeyBlbmNvZGVQYXNzYWJsZSwgZGVjb2RlUGFzc2FibGUgfSk7XG59OyRozY9fb25jZS5tYWtlUGFzc2FibGVLaXQobWFrZVBhc3NhYmxlS2l0KTtcbmhhcmRlbihtYWtlUGFzc2FibGVLaXQpO1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2RlT3B0aW9uc30gW2VuY29kZU9wdGlvbnNdXG4gKiBAcmV0dXJucyB7UGFzc2FibGVLaXRbJ2VuY29kZVBhc3NhYmxlJ119XG4gKi9cbiAgICAgICBjb25zdCBtYWtlRW5jb2RlUGFzc2FibGUgPSBlbmNvZGVPcHRpb25zID0+IHtcbiAgY29uc3QgeyBlbmNvZGVQYXNzYWJsZSB9ID0gbWFrZVBhc3NhYmxlS2l0KGVuY29kZU9wdGlvbnMpO1xuICByZXR1cm4gZW5jb2RlUGFzc2FibGU7XG59OyRozY9fb25jZS5tYWtlRW5jb2RlUGFzc2FibGUobWFrZUVuY29kZVBhc3NhYmxlKTtcbmhhcmRlbihtYWtlRW5jb2RlUGFzc2FibGUpO1xuXG4vKipcbiAqIEBwYXJhbSB7RGVjb2RlT3B0aW9uc30gW2RlY29kZU9wdGlvbnNdXG4gKiBAcmV0dXJucyB7UGFzc2FibGVLaXRbJ2RlY29kZVBhc3NhYmxlJ119XG4gKi9cbiAgICAgICBjb25zdCBtYWtlRGVjb2RlUGFzc2FibGUgPSBkZWNvZGVPcHRpb25zID0+IHtcbiAgY29uc3QgeyBkZWNvZGVQYXNzYWJsZSB9ID0gbWFrZVBhc3NhYmxlS2l0KGRlY29kZU9wdGlvbnMpO1xuICByZXR1cm4gZGVjb2RlUGFzc2FibGU7XG59OyRozY9fb25jZS5tYWtlRGVjb2RlUGFzc2FibGUobWFrZURlY29kZVBhc3NhYmxlKTtcbmhhcmRlbihtYWtlRGVjb2RlUGFzc2FibGUpO1xuXG4gICAgICAgY29uc3QgaXNFbmNvZGVkUmVtb3RhYmxlID0gZW5jb2RlZCA9PiBlbmNvZGVkLmNoYXJBdCgwKSA9PT0gJ3InOyRozY9fb25jZS5pc0VuY29kZWRSZW1vdGFibGUoaXNFbmNvZGVkUmVtb3RhYmxlKTtcbmhhcmRlbihpc0VuY29kZWRSZW1vdGFibGUpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHR5cGUge1JlY29yZDxQYXNzU3R5bGUsIHN0cmluZz59XG4gKiBUaGUgc2luZ2xlIHByZWZpeCBjaGFyYWN0ZXJzIHRvIGJlIHVzZWQgZm9yIGVhY2ggUGFzc1N0eWxlIGNhdGVnb3J5LlxuICogYGJpZ2ludGAgaXMgYSB0d28tY2hhcmFjdGVyIHN0cmluZyBiZWNhdXNlIGVhY2ggb2YgdGhvc2UgY2hhcmFjdGVyc1xuICogaW5kaXZpZHVhbGx5IGlzIGEgdmFsaWQgYmlnaW50IHByZWZpeCAoYG5gIGZvciBcIm5lZ2F0aXZlXCIgYW5kIGBwYCBmb3JcbiAqIFwicG9zaXRpdmVcIiksIGFuZCBjb3B5QXJyYXkgaXMgYSB0d28tY2hhcmFjdGVyIHN0cmluZyBiZWNhdXNlIG9uZSBlbmNvZGluZ1xuICogcHJlZml4ZXMgYXJyYXlzIHdpdGggYFtgIHdoaWxlIHRoZSBvdGhlciB1c2VzIGBeYCAod2hpY2ggaXMgcHJvaGliaXRlZCBmcm9tXG4gKiBhcHBlYXJpbmcgaW4gYW4gZW5jb2RlZCBzdHJpbmcpLlxuICogVGhlIG9yZGVyaW5nIG9mIHRoZXNlIHByZWZpeGVzIGlzIHRoZSBzYW1lIGFzIHRoZSByYW5rT3JkZXJpbmcgb2YgdGhlaXJcbiAqIHJlc3BlY3RpdmUgUGFzc1N0eWxlcywgYW5kIHJhbmtPcmRlci5qcyBpbXBvcnRzIHRoZSB0YWJsZSBmb3IgdGhpcyBwdXJwb3NlLlxuICpcbiAqIEluIGFkZGl0aW9uLCBgfGAgaXMgdGhlIHJlbW90YWJsZS0+b3JkaW5hbCBtYXBwaW5nIHByZWZpeDpcbiAqIFRoaXMgaXMgbm90IHVzZWQgaW4gY292ZXJzIGJ1dCBpdCBpc1xuICogcmVzZXJ2ZWQgZnJvbSB0aGUgc2FtZSBzZXQgb2Ygc3RyaW5ncy4gTm90ZSB0aGF0IHRoZSBwcmVmaXggaXMgPiBhbnlcbiAqIHByZWZpeCB1c2VkIGJ5IGFueSBjb3ZlciBzbyB0aGF0IG9yZGluYWwgbWFwcGluZyBrZXlzIGFyZSBhbHdheXMgb3V0c2lkZVxuICogdGhlIHJhbmdlIG9mIHZhbGlkIGNvbGxlY3Rpb24gZW50cnkga2V5cy5cbiAqL1xuICAgICAgIGNvbnN0IHBhc3NTdHlsZVByZWZpeGVzID0ge1xuICBlcnJvcjogJyEnLFxuICBjb3B5UmVjb3JkOiAnKCcsXG4gIHRhZ2dlZDogJzonLFxuICBwcm9taXNlOiAnPycsXG4gIGNvcHlBcnJheTogJ1teJyxcbiAgYnl0ZUFycmF5OiAnYScsXG4gIGJvb2xlYW46ICdiJyxcbiAgbnVtYmVyOiAnZicsXG4gIGJpZ2ludDogJ25wJyxcbiAgcmVtb3RhYmxlOiAncicsXG4gIHN0cmluZzogJ3MnLFxuICBudWxsOiAndicsXG4gIHN5bWJvbDogJ3knLFxuICAvKiBCZWNhdXNlIEFycmF5LnByb3RvdHlwZS5zb3J0IHB1dHMgdW5kZWZpbmVkIHZhbHVlcyBhdCB0aGUgZW5kIHdpdGhvdXQqL1xuICAvKiBwYXNzaW5nIHRoZW0gdG8gYSBjb21wYXJpc29uIGZ1bmN0aW9uLCB1bmRlZmluZWQgTVVTVCBiZSB0aGUgbGFzdCovXG4gIC8qIGNhdGVnb3J5LiovXG4gIHVuZGVmaW5lZDogJ3onLFxufTskaM2PX29uY2UucGFzc1N0eWxlUHJlZml4ZXMocGFzc1N0eWxlUHJlZml4ZXMpO1xuT2JqZWN0LnNldFByb3RvdHlwZU9mKHBhc3NTdHlsZVByZWZpeGVzLCBudWxsKTtcbmhhcmRlbihwYXNzU3R5bGVQcmVmaXhlcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJyZWNvcmROYW1lcyI6WyJyZWNvcmROYW1lcyJdLCJyZWNvcmRWYWx1ZXMiOlsicmVjb3JkVmFsdWVzIl0sInplcm9QYWQiOlsiemVyb1BhZCJdLCJtYWtlUGFzc2FibGVLaXQiOlsibWFrZVBhc3NhYmxlS2l0Il0sIm1ha2VFbmNvZGVQYXNzYWJsZSI6WyJtYWtlRW5jb2RlUGFzc2FibGUiXSwibWFrZURlY29kZVBhc3NhYmxlIjpbIm1ha2VEZWNvZGVQYXNzYWJsZSJdLCJpc0VuY29kZWRSZW1vdGFibGUiOlsiaXNFbmNvZGVkUmVtb3RhYmxlIl0sInBhc3NTdHlsZVByZWZpeGVzIjpbInBhc3NTdHlsZVByZWZpeGVzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANXCc7oXRAAAF0QAACsAAABAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJRQ0xBU1MiLCJtYWtlRGVjb2RlRnJvbUNhcERhdGEiLCJtYWtlRW5jb2RlVG9DYXBEYXRhIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgcGFzc1N0eWxlT2YsaXNFcnJvckxpa2UsbWFrZVRhZ2dlZCxpc1ByaW1pdGl2ZSxnZXRUYWcsYXNzZXJ0UGFzc2FibGVTeW1ib2wsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NhYmxlU3ltYm9sRm9yTmFtZSxYLEZhaWwscTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wiaXNFcnJvckxpa2VcIixbJGjNj19hID0+IChpc0Vycm9yTGlrZSA9ICRozY9fYSldXSxbXCJtYWtlVGFnZ2VkXCIsWyRozY9fYSA9PiAobWFrZVRhZ2dlZCA9ICRozY9fYSldXSxbXCJpc1ByaW1pdGl2ZVwiLFskaM2PX2EgPT4gKGlzUHJpbWl0aXZlID0gJGjNj19hKV1dLFtcImdldFRhZ1wiLFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVN5bWJvbFwiLFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlU3ltYm9sID0gJGjNj19hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLFskaM2PX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIixbJGjNj19hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEBpbXBvcnQge1Bhc3NhYmxlLCBSZW1vdGFibGVPYmplY3R9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnICovXG4vKiogQGltcG9ydCB7RW5jb2RpbmcsIEVuY29kaW5nVW5pb259IGZyb20gJy4vdHlwZXMuanMnICovXG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgaXNBcnJheSB9ID0gQXJyYXk7XG5jb25zdCB7XG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsXG4gIGRlZmluZVByb3BlcnRpZXMsXG4gIGlzLFxuICBlbnRyaWVzLFxuICBmcm9tRW50cmllcyxcbiAgZnJlZXplLFxuICBoYXNPd24sXG59ID0gT2JqZWN0O1xuXG4vKipcbiAqIFNwZWNpYWwgcHJvcGVydHkgbmFtZSB0aGF0IGluZGljYXRlcyBhbiBlbmNvZGluZyB0aGF0IG5lZWRzIHNwZWNpYWxcbiAqIGRlY29kaW5nLlxuICovXG5jb25zdCBRQ0xBU1MgPSAnQHFjbGFzcyc7JGjNj19vbmNlLlFDTEFTUyhRQ0xBU1MpO1xuXG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGluZyAmIG9iamVjdH0gZW5jb2RlZFxuICogQHJldHVybnMge2VuY29kZWQgaXMgRW5jb2RpbmdVbmlvbn1cbiAqL1xuY29uc3QgaGFzUUNsYXNzID0gZW5jb2RlZCA9PiBoYXNPd24oZW5jb2RlZCwgUUNMQVNTKTtcblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSBlbmNvZGVkXG4gKiBAcGFyYW0ge3N0cmluZ30gcWNsYXNzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgcWNsYXNzTWF0Y2hlcyA9IChlbmNvZGVkLCBxY2xhc3MpID0+XG4gICFpc1ByaW1pdGl2ZShlbmNvZGVkKSAmJlxuICAhaXNBcnJheShlbmNvZGVkKSAmJlxuICBoYXNRQ2xhc3MoZW5jb2RlZCkgJiZcbiAgZW5jb2RlZFtRQ0xBU1NdID09PSBxY2xhc3M7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRW5jb2RlVG9DYXBEYXRhT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIHJlbW90YWJsZTogUmVtb3RhYmxlT2JqZWN0LFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ1xuICogKSA9PiBFbmNvZGluZ30gW2VuY29kZVJlbW90YWJsZVRvQ2FwRGF0YV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBwcm9taXNlOiBQcm9taXNlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ1xuICogKSA9PiBFbmNvZGluZ30gW2VuY29kZVByb21pc2VUb0NhcERhdGFdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZXJyb3I6IEVycm9yLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ1xuICogKSA9PiBFbmNvZGluZ30gW2VuY29kZUVycm9yVG9DYXBEYXRhXVxuICovXG5cbmNvbnN0IGRvbnRFbmNvZGVSZW1vdGFibGVUb0NhcERhdGEgPSByZW0gPT4gRmFpbGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YDtcblxuY29uc3QgZG9udEVuY29kZVByb21pc2VUb0NhcERhdGEgPSBwcm9tID0+IEZhaWxgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Byb219YDtcblxuY29uc3QgZG9udEVuY29kZUVycm9yVG9DYXBEYXRhID0gZXJyID0+IEZhaWxgZXJyb3Igb2JqZWN0IHVuZXhwZWN0ZWQ6ICR7ZXJyfWA7XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGVUb0NhcERhdGFPcHRpb25zfSBbZW5jb2RlT3B0aW9uc11cbiAqIEByZXR1cm5zIHsocGFzc2FibGU6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ31cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VFbmNvZGVUb0NhcERhdGEgPSAoZW5jb2RlT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBlbmNvZGVSZW1vdGFibGVUb0NhcERhdGEgPSBkb250RW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhLFxuICAgIGVuY29kZVByb21pc2VUb0NhcERhdGEgPSBkb250RW5jb2RlUHJvbWlzZVRvQ2FwRGF0YSxcbiAgICBlbmNvZGVFcnJvclRvQ2FwRGF0YSA9IGRvbnRFbmNvZGVFcnJvclRvQ2FwRGF0YSxcbiAgfSA9IGVuY29kZU9wdGlvbnM7XG5cbiAgLyoqXG4gKiBNdXN0IGVuY29kZSBgdmFsYCBpbnRvIHBsYWluIEpTT04gZGF0YSAqY2Fub25pY2FsbHkqLCBzdWNoIHRoYXRcbiAqIGBKU09OLnN0cmluZ2lmeShlbmNvZGUodjEpKSA9PT0gSlNPTi5zdHJpbmdpZnkoZW5jb2RlKHYxKSlgLiBGb3IgbW9zdFxuICogZW5jb2RpbmdzLCB0aGUgb3JkZXIgb2YgcHJvcGVydGllcyBvZiBlYWNoIG5vZGUgb2YgdGhlIG91dHB1dFxuICogc3RydWN0dXJlIGlzIGRldGVybWluZWQgYnkgdGhlIGFsZ29yaXRobSBiZWxvdyB3aXRob3V0IHNwZWNpYWxcbiAqIGFycmFuZ2VtZW50LCB1c3VhbGx5IGJ5IGJlaW5nIGV4cHJlc3NlZCBkaXJlY3RseSBhcyBhbiBvYmplY3QgbGl0ZXJhbC5cbiAqIFRoZSBleGNlcHRpb24gaXMgY29weVJlY29yZHMsIHdob3NlIG5hdHVyYWwgZW51bWVyYXRpb24gb3JkZXJcbiAqIGNhbiBkaWZmZXIgYmV0d2VlbiBjb3B5UmVjb3JkcyB0aGF0IG91ciBkaXN0cmlidXRlZCBvYmplY3Qgc2VtYW50aWNzXG4gKiBjb25zaWRlcnMgdG8gYmUgZXF1aXZhbGVudC5cbiAqIFNpbmNlLCBmb3IgZWFjaCBjb3B5UmVjb3JkLCB3ZSBvbmx5IGFjY2VwdCBzdHJpbmcgcHJvcGVydHkgbmFtZXMsXG4gKiBub3Qgc3ltYm9scywgd2UgY2FuIGNhbm9uaWNhbGx5IHNvcnQgdGhlIG5hbWVzIGZpcnN0LlxuICogSlNPTi5zdHJpbmdpZnkgd2lsbCB0aGVuIHZpc2l0IHRoZXNlIGluIHRoYXQgc29ydGVkIG9yZGVyLlxuICpcbiAqIEVuY29kaW5nIHdpdGggYSBjYW5vbmljYWwtSlNPTiBlbmNvZGVyIHdvdWxkIGFsc28gc29sdmUgdGhpcyBjYW5vbmljYWxuZXNzXG4gKiBwcm9ibGVtIGluIGEgbW9yZSBtb2R1bGFyIGFuZCBlbmNhcHN1bGF0ZWQgbWFubmVyLiBOb3RlIHRoYXQgdGhlXG4gKiBhY3R1YWwgb3JkZXIgcHJvZHVjZWQgaGVyZSwgdGhvdWdoIGl0IGFncmVlcyB3aXRoIGNhbm9uaWNhbC1KU09OIG9uXG4gKiBjb3B5UmVjb3JkIHByb3BlcnR5IG9yZGVyaW5nLCBkaWZmZXJzIGZyb20gY2Fub25pY2FsLUpTT04gYXMgYSB3aG9sZVxuICogaW4gdGhhdCB0aGUgb3RoZXIgcmVjb3JkIHByb3BlcnRpZXMgYXJlIHZpc2l0ZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoXG4gKiB0aGV5IGFyZSBsaXRlcmFsbHkgd3JpdHRlbiBiZWxvdy4gVE9ETyBwZXJoYXBzIHdlIHNob3VsZCBpbmRlZWQgc3dpdGNoXG4gKiB0byBhIGNhbm9uaWNhbCBKU09OIGVuY29kZXIsIGFuZCBub3QgZGVsaWNhdGVseSBkZXBlbmQgb24gdGhlIG9yZGVyXG4gKiBpbiB3aGljaCB0aGVzZSBvYmplY3QgbGl0ZXJhbHMgYXJlIHdyaXR0ZW4uXG4gKlxuICogUmVhZGVycyBtdXN0IG5vdCBjYXJlIGFib3V0IHRoaXMgb3JkZXIgYW55d2F5LiBXZSBpbXBvc2UgdGhpcyByZXF1aXJlbWVudFxuICogbWFpbmx5IHRvIHJlZHVjZSBub24tZGV0ZXJtaW5pc20gZXhwb3NlZCBvdXRzaWRlIGEgdmF0LlxuICpcbiAqIEBwYXJhbSB7YW55fSBwYXNzYWJsZVxuICogQHJldHVybnMge0VuY29kaW5nfSBleGNlcHQgdGhhdCBgZW5jb2RlVG9DYXBEYXRhYCBkb2VzIG5vdCBnZW5lcmFsbHlcbiAqIGBoYXJkZW5gIHRoaXMgcmVzdWx0IGJlZm9yZSByZXR1cm5pbmcuIFJhdGhlciwgYGVuY29kZVRvQ2FwRGF0YWAgaXMgbm90XG4gKiBkaXJlY3RseSBleHBvc2VkLlxuICogV2hhdCdzIGV4cG9zZWQgaW5zdGVhZCBpcyBhIHdyYXBwZXIgdGhhdCBmcmVlemVzIHRoZSBvdXRwdXQgYmVmb3JlXG4gKiByZXR1cm5pbmcuIElmIHRoaXMgdHVybnMgb3V0IHRvIGltcGVkZSBzdGF0aWMgYW5hbHlzaXMgZm9yIGBoYXJkZW5gIHNhZmV0eSxcbiAqIHdlIGNhbiBhbHdheXMgcHV0IHRoZSAobm93IHJlZHVuZGFudCkgaGFyZGVucyBiYWNrIGluLiBUaGV5IGRvbid0IGh1cnQuXG4gKi9cbiAgY29uc3QgZW5jb2RlVG9DYXBEYXRhUmVjdXIgPSBwYXNzYWJsZSA9PiB7XG4gICAgLyogRmlyc3Qgd2UgaGFuZGxlIGFsbCBwcmltaXRpdmVzLiBTb21lIGNhbiBiZSByZXByZXNlbnRlZCBkaXJlY3RseSBhcyovXG4gICAgLyogSlNPTiwgYW5kIHNvbWUgbXVzdCBiZSBlbmNvZGVkIGFzIFtRQ0xBU1NdIGNvbXBvc2l0ZXMuKi9cbiAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihwYXNzYWJsZSk7XG4gICAgc3dpdGNoIChwYXNzU3R5bGUpIHtcbiAgICAgIGNhc2UgJ251bGwnOlxuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICBjYXNlICdzdHJpbmcnOiB7XG4gICAgICAgIC8qIHBhc3MgdGhyb3VnaCB0byBKU09OKi9cbiAgICAgICAgcmV0dXJuIHBhc3NhYmxlO1xuICAgICAgfVxuICAgICAgY2FzZSAndW5kZWZpbmVkJzoge1xuICAgICAgICByZXR1cm4geyBbUUNMQVNTXTogJ3VuZGVmaW5lZCcgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ251bWJlcic6IHtcbiAgICAgICAgLyogU3BlY2lhbC1jYXNlIG51bWJlcnMgd2l0aCBubyBkaWdpdC1iYXNlZCByZXByZXNlbnRhdGlvbi4qL1xuICAgICAgICBpZiAoTnVtYmVyLmlzTmFOKHBhc3NhYmxlKSkge1xuICAgICAgICAgIHJldHVybiB7IFtRQ0xBU1NdOiAnTmFOJyB9O1xuICAgICAgICB9IGVsc2UgaWYgKHBhc3NhYmxlID09PSBJbmZpbml0eSkge1xuICAgICAgICAgIHJldHVybiB7IFtRQ0xBU1NdOiAnSW5maW5pdHknIH07XG4gICAgICAgIH0gZWxzZSBpZiAocGFzc2FibGUgPT09IC1JbmZpbml0eSkge1xuICAgICAgICAgIHJldHVybiB7IFtRQ0xBU1NdOiAnLUluZmluaXR5JyB9O1xuICAgICAgICB9XG4gICAgICAgIC8qIFBhc3MgdGhyb3VnaCBldmVyeXRoaW5nIGVsc2UsIHJlcGxhY2luZyAtMCB3aXRoIDAuKi9cbiAgICAgICAgcmV0dXJuIGlzKHBhc3NhYmxlLCAtMCkgPyAwIDogcGFzc2FibGU7XG4gICAgICB9XG4gICAgICBjYXNlICdiaWdpbnQnOiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgW1FDTEFTU106ICdiaWdpbnQnLFxuICAgICAgICAgIGRpZ2l0czogU3RyaW5nKHBhc3NhYmxlKSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgYXNzZXJ0UGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xuICAgICAgICBjb25zdCBuYW1lID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChuYW1lRm9yUGFzc2FibGVTeW1ib2wocGFzc2FibGUpKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBbUUNMQVNTXTogJ3N5bWJvbCcsXG4gICAgICAgICAgbmFtZSxcbiAgICAgICAgfTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICAgIGlmIChoYXNPd24ocGFzc2FibGUsIFFDTEFTUykpIHtcbiAgICAgICAgICAvKiBIaWxiZXJ0IGhvdGVsKi9cbiAgICAgICAgICBjb25zdCB7IFtRQ0xBU1NdOiBxY2xhc3NWYWx1ZSwgLi4ucmVzdCB9ID0gcGFzc2FibGU7XG4gICAgICAgICAgLyoqIEB0eXBlIHtFbmNvZGluZ30gKi9cbiAgICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICBbUUNMQVNTXTogJ2hpbGJlcnQnLFxuICAgICAgICAgICAgb3JpZ2luYWw6IGVuY29kZVRvQ2FwRGF0YVJlY3VyKHFjbGFzc1ZhbHVlKSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChvd25LZXlzKHJlc3QpLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgICAgICAvKiBXZSBoYXJkZW4gdGhlIGVudGlyZSBjYXBEYXRhIGVuY29kaW5nIGJlZm9yZSB3ZSByZXR1cm4gaXQuKi9cbiAgICAgICAgICAgIC8qIGBlbmNvZGVUb0NhcERhdGFgIHJlcXVpcmVzIHRoYXQgaXRzIGlucHV0IGJlIFBhc3NhYmxlLCBhbmQqL1xuICAgICAgICAgICAgLyogdGhlcmVmb3JlIGhhcmRlbmVkLiovXG4gICAgICAgICAgICAvKiBUaGUgYGZyZWV6ZWAgaGVyZSBpcyBuZWVkZWQgYW55d2F5LCBiZWNhdXNlIHRoZSBgcmVzdGAgaXMqL1xuICAgICAgICAgICAgLyogZnJlc2hseSBjb25zdHJ1Y3RlZCBieSB0aGUgYC4uLmAgYWJvdmUsIGFuZCB3ZSdyZSB1c2luZyBpdCovXG4gICAgICAgICAgICAvKiBhcyBpbXB1dCBpbiBhbm90aGVyIGNhbGwgdG8gYGVuY29kZVRvQ2FwRGF0YWAuKi9cbiAgICAgICAgICAgIHJlc3VsdC5yZXN0ID0gZW5jb2RlVG9DYXBEYXRhUmVjdXIoZnJlZXplKHJlc3QpKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICAvKiBDdXJyZW50bHkgY29weVJlY29yZCBhbGxvd3Mgb25seSBzdHJpbmcga2V5cyBzbyB0aGlzIHdpbGwqL1xuICAgICAgICAvKiB3b3JrLiBJZiB3ZSBhbGxvdyBzb3J0YWJsZSBzeW1ib2wga2V5cywgdGhpcyB3aWxsIG5lZWQgdG8qL1xuICAgICAgICAvKiBiZWNvbWUgbW9yZSBpbnRlcmVzdGluZy4qL1xuICAgICAgICBjb25zdCBuYW1lcyA9IG93bktleXMocGFzc2FibGUpLnNvcnQoKTtcbiAgICAgICAgcmV0dXJuIGZyb21FbnRyaWVzKFxuICAgICAgICAgIG5hbWVzLm1hcChuYW1lID0+IFtuYW1lLCBlbmNvZGVUb0NhcERhdGFSZWN1cihwYXNzYWJsZVtuYW1lXSldKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgcmV0dXJuIHBhc3NhYmxlLm1hcChlbmNvZGVUb0NhcERhdGFSZWN1cik7XG4gICAgICB9XG4gICAgICBjYXNlICdieXRlQXJyYXknOiB7XG4gICAgICAgIC8qIFRPRE8gaW1wbGVtZW50Ki9cbiAgICAgICAgdGhyb3cgRmFpbGBtYXJzYWwgb2YgYnl0ZUFycmF5IG5vdCB5ZXQgaW1wbGVtZW50ZWQ6ICR7cGFzc2FibGV9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3RhZ2dlZCc6IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBbUUNMQVNTXTogJ3RhZ2dlZCcsXG4gICAgICAgICAgdGFnOiBnZXRUYWcocGFzc2FibGUpLFxuICAgICAgICAgIHBheWxvYWQ6IGVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlLnBheWxvYWQpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY2FzZSAncmVtb3RhYmxlJzoge1xuICAgICAgICBjb25zdCBlbmNvZGVkID0gZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhKFxuICAgICAgICAgIHBhc3NhYmxlLFxuICAgICAgICAgIGVuY29kZVRvQ2FwRGF0YVJlY3VyLFxuICAgICAgICApO1xuICAgICAgICBpZiAocWNsYXNzTWF0Y2hlcyhlbmNvZGVkLCAnc2xvdCcpKSB7XG4gICAgICAgICAgcmV0dXJuIGVuY29kZWQ7XG4gICAgICAgIH1cbiAgICAgICAgLyogYHRocm93YCBpcyBub29wIHNpbmNlIGBGYWlsYCB0aHJvd3MuIEJ1dCBsaW50ZXIgY29uZnVzZWQqL1xuICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBSZW1vdGFibGUgZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCAke3EoXG4gICAgICAgICAgUUNMQVNTLFxuICAgICAgICApfSAke3EoJ3Nsb3QnKX06ICR7ZW5jb2RlZH1gO1xuICAgICAgfVxuICAgICAgY2FzZSAncHJvbWlzZSc6IHtcbiAgICAgICAgY29uc3QgZW5jb2RlZCA9IGVuY29kZVByb21pc2VUb0NhcERhdGEocGFzc2FibGUsIGVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcbiAgICAgICAgaWYgKHFjbGFzc01hdGNoZXMoZW5jb2RlZCwgJ3Nsb3QnKSkge1xuICAgICAgICAgIHJldHVybiBlbmNvZGVkO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IEZhaWxgaW50ZXJuYWw6IFByb21pc2UgZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCAke3EoXG4gICAgICAgICAgUUNMQVNTLFxuICAgICAgICAgICdzbG90JyxcbiAgICAgICAgKX06ICR7ZW5jb2RlZH1gO1xuICAgICAgfVxuICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgIGNvbnN0IGVuY29kZWQgPSBlbmNvZGVFcnJvclRvQ2FwRGF0YShwYXNzYWJsZSwgZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuICAgICAgICBpZiAocWNsYXNzTWF0Y2hlcyhlbmNvZGVkLCAnZXJyb3InKSkge1xuICAgICAgICAgIHJldHVybiBlbmNvZGVkO1xuICAgICAgICB9XG4gICAgICAgIHRocm93IEZhaWxgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggJHtxKFxuICAgICAgICAgIFFDTEFTUyxcbiAgICAgICAgICAnZXJyb3InLFxuICAgICAgICApfTogJHtlbmNvZGVkfWA7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIHRocm93IGFzc2VydC5mYWlsKFxuICAgICAgICAgIFhgaW50ZXJuYWw6IFVucmVjb2duaXplZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9YCxcbiAgICAgICAgICBUeXBlRXJyb3IsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuICBjb25zdCBlbmNvZGVUb0NhcERhdGEgPSBwYXNzYWJsZSA9PiB7XG4gICAgaWYgKGlzRXJyb3JMaWtlKHBhc3NhYmxlKSkge1xuICAgICAgLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgdG8gYWNjb21tb2RhdGUgZXJyb3JzIHRoYXQgYXJlIG5vdCovXG4gICAgICAvKiB2YWxpZCBQYXNzYWJsZXMuIEZvciBleGFtcGxlLCBiZWNhdXNlIHRoZXkncmUgbm90IGZyb3plbi4qL1xuICAgICAgLyogVGhlIHNwZWNpYWwgY2FzZSBjYW4gb25seSBldmVyIGFwcGx5IGF0IHRoZSByb290LCBhbmQgdGhlcmVmb3JlKi9cbiAgICAgIC8qIG91dHNpZGUgdGhlIHJlY3Vyc2lvbiwgc2luY2UgYW4gZXJyb3IgY291bGQgb25seSBiZSBkZWVwZXIgaW4qL1xuICAgICAgLyogYSBwYXNzYWJsZSBzdHJ1Y3R1cmUgaWYgaXQgd2VyZSBwYXNzYWJsZS4qL1xuICAgICAgLyoqL1xuICAgICAgLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgYmVjYXVzZSwgZm9yIHRoZXNlIGVycm9ycywgd2UncmUgbXVjaCovXG4gICAgICAvKiBtb3JlIGludGVyZXN0ZWQgaW4gcmVwb3J0aW5nIHdoYXRldmVyIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gdGhleSovXG4gICAgICAvKiBjYXJyeSB0aGFuIHdlIGFyZSBhYm91dCByZXBvcnRpbmcgcHJvYmxlbXMgZW5jb3VudGVyZWQgaW4gcmVwb3J0aW5nKi9cbiAgICAgIC8qIHRoaXMgaW5mb3JtYXRpb24uKi9cbiAgICAgIHJldHVybiBoYXJkZW4oZW5jb2RlRXJyb3JUb0NhcERhdGEocGFzc2FibGUsIGVuY29kZVRvQ2FwRGF0YVJlY3VyKSk7XG4gICAgfVxuICAgIHJldHVybiBoYXJkZW4oZW5jb2RlVG9DYXBEYXRhUmVjdXIocGFzc2FibGUpKTtcbiAgfTtcbiAgcmV0dXJuIGhhcmRlbihlbmNvZGVUb0NhcERhdGEpO1xufTskaM2PX29uY2UubWFrZUVuY29kZVRvQ2FwRGF0YShtYWtlRW5jb2RlVG9DYXBEYXRhKTtcbmhhcmRlbihtYWtlRW5jb2RlVG9DYXBEYXRhKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWNvZGVPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFJlbW90YWJsZTogRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IChQcm9taXNlfFJlbW90YWJsZU9iamVjdCl9IFtkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUHJvbWlzZTogRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IChQcm9taXNlfFJlbW90YWJsZU9iamVjdCl9IFtkZWNvZGVQcm9taXNlRnJvbUNhcERhdGFdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZEVycm9yOiBFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gRXJyb3J9IFtkZWNvZGVFcnJvckZyb21DYXBEYXRhXVxuICovXG5cbmNvbnN0IGRvbnREZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSA9IHNsb3RFbmNvZGluZyA9PlxuICBGYWlsYHJlbW90YWJsZSBvciBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7c2xvdEVuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlRXJyb3JGcm9tQ2FwRGF0YSA9IGVycm9yRW5jb2RpbmcgPT5cbiAgRmFpbGBlcnJvciB1bmV4cGVjdGVkOiAke2Vycm9yRW5jb2Rpbmd9YDtcblxuLyoqXG4gKiBUaGUgY3VycmVudCBlbmNvZGluZyBkb2VzIG5vdCBnaXZlIHRoZSBkZWNvZGVyIGVub3VnaCBpbnRvIHRvIGRpc3Rpbmd1aXNoXG4gKiB3aGV0aGVyIGEgc2xvdCByZXByZXNlbnRzIGEgcHJvbWlzZSBvciBhIHJlbW90YWJsZS4gQXMgYW4gaW1wbGVtZW50YXRpb25cbiAqIHJlc3RyaWN0aW9uIHVudGlsIHRoaXMgaXMgZml4ZWQsIGlmIGVpdGhlciBpcyBwcm92aWRlZCwgYm90aCBtdXN0IGJlXG4gKiBwcm92aWRlZCBhbmQgdGhleSBtdXN0IGJlIHRoZSBzYW1lLlxuICpcbiAqIFRoaXMgc2VlbXMgbGlrZSB0aGUgYmVzdCBzdGFydGluZyBwb2ludCB0byBpbmNyZW1lbnRhbGx5IGV2b2x2ZSB0byBhblxuICogQVBJIHdoZXJlIHRoZXNlIGNhbiByZWxpYWJseSBkaWZmZXIuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80MzM0XG4gKlxuICogQHBhcmFtIHtEZWNvZGVPcHRpb25zfSBbZGVjb2RlT3B0aW9uc11cbiAqIEByZXR1cm5zIHsoZW5jb2RlZDogRW5jb2RpbmcpID0+IFBhc3NhYmxlfVxuICovXG4gICAgICAgY29uc3QgbWFrZURlY29kZUZyb21DYXBEYXRhID0gKGRlY29kZU9wdGlvbnMgPSB7fSkgPT4ge1xuICBjb25zdCB7XG4gICAgZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEgPSBkb250RGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG4gICAgZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhID0gZG9udERlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuICAgIGRlY29kZUVycm9yRnJvbUNhcERhdGEgPSBkb250RGVjb2RlRXJyb3JGcm9tQ2FwRGF0YSxcbiAgfSA9IGRlY29kZU9wdGlvbnM7XG5cbiAgZGVjb2RlUmVtb3RhYmxlRnJvbUNhcERhdGEgPT09IGRlY29kZVByb21pc2VGcm9tQ2FwRGF0YSB8fFxuICAgIEZhaWxgQW4gaW1wbGVtZW50YXRpb24gcmVzdHJpY3Rpb24gZm9yIG5vdzogSWYgZWl0aGVyIGRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhIG9yIGRlY29kZVByb21pc2VGcm9tQ2FwRGF0YSBpcyBwcm92aWRlZCwgYm90aCBtdXN0IGJlIHByb3ZpZGVkIGFuZCB0aGV5IG11c3QgYmUgdGhlIHNhbWU6ICR7cShcbiAgICAgIGRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhLFxuICAgICl9IHZzICR7cShkZWNvZGVQcm9taXNlRnJvbUNhcERhdGEpfWA7XG5cbiAgLyoqXG4gKiBgZGVjb2RlRnJvbUNhcERhdGFgIG1heSByZWx5IG9uIGBqc29uRW5jb2RlZGAgYmVpbmcgdGhlIHJlc3VsdCBvZiBhXG4gKiBwbGFpbiBjYWxsIHRvIEpTT04ucGFyc2UuIEhvd2V2ZXIsIGl0ICpjYW5ub3QqIHJlbHkgb24gYGpzb25FbmNvZGVkYFxuICogaGF2aW5nIGJlZW4gcHJvZHVjZWQgYnkgSlNPTi5zdHJpbmdpZnkgb24gdGhlIG91dHB1dCBvZiBgZW5jb2RlVG9DYXBEYXRhYFxuICogYWJvdmUsIGkuZS4sIGBkZWNvZGVGcm9tQ2FwRGF0YWAgY2Fubm90IHJlbHkgb24gYGpzb25FbmNvZGVkYCBiZWluZyBhXG4gKiB2YWxpZCBtYXJzaGFsbGVkIHJlcHJlc2VudGF0aW9uLiBSYXRoZXIsIGBkZWNvZGVGcm9tQ2FwRGF0YWAgbXVzdFxuICogdmFsaWRhdGUgdGhhdC5cbiAqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSBqc29uRW5jb2RlZCBtdXN0IGJlIGhhcmRlbmVkXG4gKi9cbiAgY29uc3QgZGVjb2RlRnJvbUNhcERhdGEgPSBqc29uRW5jb2RlZCA9PiB7XG4gICAgaWYgKGlzUHJpbWl0aXZlKGpzb25FbmNvZGVkKSkge1xuICAgICAgLyogcHJpbWl0aXZlcyBwYXNzIHRocm91Z2gqL1xuICAgICAgcmV0dXJuIGpzb25FbmNvZGVkO1xuICAgIH1cbiAgICBpZiAoaXNBcnJheShqc29uRW5jb2RlZCkpIHtcbiAgICAgIHJldHVybiBqc29uRW5jb2RlZC5tYXAoZW5jb2RlZFZhbCA9PiBkZWNvZGVGcm9tQ2FwRGF0YShlbmNvZGVkVmFsKSk7XG4gICAgfSBlbHNlIGlmIChoYXNRQ2xhc3MoanNvbkVuY29kZWQpKSB7XG4gICAgICBjb25zdCBxY2xhc3MgPSBqc29uRW5jb2RlZFtRQ0xBU1NdO1xuICAgICAgdHlwZW9mIHFjbGFzcyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgRmFpbGBpbnZhbGlkICR7cShRQ0xBU1MpfSB0eXBlb2YgJHtxKHR5cGVvZiBxY2xhc3MpfWA7XG4gICAgICBzd2l0Y2ggKHFjbGFzcykge1xuICAgICAgICAvKiBFbmNvZGluZyBvZiBwcmltaXRpdmVzIG5vdCBoYW5kbGVkIGJ5IEpTT04qL1xuICAgICAgICBjYXNlICd1bmRlZmluZWQnOiB7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdOYU4nOiB7XG4gICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdJbmZpbml0eSc6IHtcbiAgICAgICAgICByZXR1cm4gSW5maW5pdHk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnLUluZmluaXR5Jzoge1xuICAgICAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICAgIGNvbnN0IHsgZGlnaXRzIH0gPSBqc29uRW5jb2RlZDtcbiAgICAgICAgICB0eXBlb2YgZGlnaXRzID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgRmFpbGBpbnZhbGlkIGRpZ2l0cyB0eXBlb2YgJHtxKHR5cGVvZiBkaWdpdHMpfWA7XG4gICAgICAgICAgcmV0dXJuIEJpZ0ludChkaWdpdHMpO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ0BAYXN5bmNJdGVyYXRvcic6IHtcbiAgICAgICAgICAvKiBEZXByZWNhdGVkIHFjbGFzcy4gVE9ETyBtYWtlIGNvbmRpdGlvbmFsKi9cbiAgICAgICAgICAvKiBvbiBlbnZpcm9ubWVudCB2YXJpYWJsZS4gRXZlbnR1YWxseSByZW1vdmUsIGJ1dCBhZnRlciBjb25maWRlbnQqL1xuICAgICAgICAgIC8qIHRoYXQgdGhlcmUgYXJlIG5vIG1vcmUgc3VwcG9ydGVkIHNlbmRlcnMuKi9cbiAgICAgICAgICAvKiovXG4gICAgICAgICAgcmV0dXJuIFN5bWJvbC5hc3luY0l0ZXJhdG9yO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgICBjb25zdCB7IG5hbWUgfSA9IGpzb25FbmNvZGVkO1xuICAgICAgICAgIHJldHVybiBwYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndGFnZ2VkJzoge1xuICAgICAgICAgIGNvbnN0IHsgdGFnLCBwYXlsb2FkIH0gPSBqc29uRW5jb2RlZDtcbiAgICAgICAgICByZXR1cm4gbWFrZVRhZ2dlZCh0YWcsIGRlY29kZUZyb21DYXBEYXRhKHBheWxvYWQpKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzbG90Jzoge1xuICAgICAgICAgIC8qIFNlZSBub3RlIGFib3ZlIGFib3V0IGhvdyB0aGUgY3VycmVudCBlbmNvZGluZyBjYW5ub3QgcmVsaWFibHkqL1xuICAgICAgICAgIC8qIGRpc3Rpbmd1aXNoIHdoaWNoIHdlIHNob3VsZCBjYWxsLCBzbyBpbiB0aGUgbm9uLWRlZmF1bHQgY2FzZSovXG4gICAgICAgICAgLyogYm90aCBtdXN0IGJlIHRoZSBzYW1lIGFuZCBpdCBkb2Vzbid0IG1hdHRlciB3aGljaCB3ZSBjYWxsLiovXG4gICAgICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhKFxuICAgICAgICAgICAganNvbkVuY29kZWQsXG4gICAgICAgICAgICBkZWNvZGVGcm9tQ2FwRGF0YSxcbiAgICAgICAgICApO1xuICAgICAgICAgIC8qIEJFV0FSRTogY2FwZGF0YSBkb2VzIG5vdCBjaGVjayB0aGF0IGBkZWNvZGVkYCBpcyovXG4gICAgICAgICAgLyogYSBwcm9taXNlIG9yIGEgcmVtb3RhYmxlLCBzaW5jZSB0aGF0IHdvdWxkIGJyZWFrIHNvbWUqL1xuICAgICAgICAgIC8qIGNhcGRhdGEgY2xpZW50cy4gV2UgYXJlIGRlcHJlY2F0aW5nIGNhcGRhdGEsIGFuZCB0aGVzZSBjbGllbnRzKi9cbiAgICAgICAgICAvKiB3aWxsIG5lZWQgdG8gdXBkYXRlIGJlZm9yZSBzd2l0Y2hpbmcgdG8gc21hbGxjYXBzLiovXG4gICAgICAgICAgcmV0dXJuIGRlY29kZWQ7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnZXJyb3InOiB7XG4gICAgICAgICAgY29uc3QgZGVjb2RlZCA9IGRlY29kZUVycm9yRnJvbUNhcERhdGEoXG4gICAgICAgICAgICBqc29uRW5jb2RlZCxcbiAgICAgICAgICAgIGRlY29kZUZyb21DYXBEYXRhLFxuICAgICAgICAgICk7XG4gICAgICAgICAgaWYgKHBhc3NTdHlsZU9mKGRlY29kZWQpID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVjb2RlZDtcbiAgICAgICAgICB9XG4gICAgICAgICAgdGhyb3cgRmFpbGBpbnRlcm5hbDogZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YSBvcHRpb24gbXVzdCByZXR1cm4gYW4gZXJyb3I6ICR7ZGVjb2RlZH1gO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2hpbGJlcnQnOiB7XG4gICAgICAgICAgY29uc3QgeyBvcmlnaW5hbCwgcmVzdCB9ID0ganNvbkVuY29kZWQ7XG4gICAgICAgICAgaGFzT3duKGpzb25FbmNvZGVkLCAnb3JpZ2luYWwnKSB8fFxuICAgICAgICAgICAgRmFpbGBJbnZhbGlkIEhpbGJlcnQgSG90ZWwgZW5jb2RpbmcgJHtqc29uRW5jb2RlZH1gO1xuICAgICAgICAgIC8qIERvbid0IGhhcmRlbiBzaW5jZSB3ZSdyZSBub3QgZG9uZSBtdXRhdGluZyBpdCovXG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0geyBbUUNMQVNTXTogZGVjb2RlRnJvbUNhcERhdGEob3JpZ2luYWwpIH07XG4gICAgICAgICAgaWYgKGhhc093bihqc29uRW5jb2RlZCwgJ3Jlc3QnKSkge1xuICAgICAgICAgICAgY29uc3QgaXNOb25FbXB0eU9iamVjdCA9XG4gICAgICAgICAgICAgIHR5cGVvZiByZXN0ID09PSAnb2JqZWN0JyAmJlxuICAgICAgICAgICAgICByZXN0ICE9PSBudWxsICYmXG4gICAgICAgICAgICAgIG93bktleXMocmVzdCkubGVuZ3RoID49IDE7XG4gICAgICAgICAgICBpZiAoIWlzTm9uRW1wdHlPYmplY3QpIHtcbiAgICAgICAgICAgICAgdGhyb3cgRmFpbGBSZXN0IGVuY29kaW5nIG11c3QgYmUgYSBub24tZW1wdHkgb2JqZWN0OiAke3Jlc3R9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHJlc3RPYmogPSBkZWNvZGVGcm9tQ2FwRGF0YShyZXN0KTtcbiAgICAgICAgICAgIC8qIFRPRE8gcmVhbGx5IHNob3VsZCBhc3NlcnQgdGhhdCBgcGFzc1N0eWxlT2YocmVzdClgIGlzKi9cbiAgICAgICAgICAgIC8qIGAnY29weVJlY29yZCdgIGJ1dCB3ZSdkIGhhdmUgdG8gaGFyZGVuIGl0IGFuZCBpdCBpcyB0b28qL1xuICAgICAgICAgICAgLyogZWFybHkgdG8gZG8gdGhhdC4qL1xuICAgICAgICAgICAgIWhhc093bihyZXN0T2JqLCBRQ0xBU1MpIHx8XG4gICAgICAgICAgICAgIEZhaWxgUmVzdCBtdXN0IG5vdCBjb250YWluIGl0cyBvd24gZGVmaW5pdGlvbiBvZiAke3EoUUNMQVNTKX1gO1xuICAgICAgICAgICAgZGVmaW5lUHJvcGVydGllcyhyZXN1bHQsIGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMocmVzdE9iaikpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgVGhpcyBpcyB0aGUgZXJyb3IgY2FzZSB3ZSdyZSB0ZXN0aW5nIGZvciovXG4gICAgICAgIGNhc2UgJ2liaWQnOiB7XG4gICAgICAgICAgdGhyb3cgRmFpbGBUaGUgY2FwRGF0YSBwcm90b2NvbCBubyBsb25nZXIgc3VwcG9ydHMgJHtxKFFDTEFTUyl9ICR7cShcbiAgICAgICAgICAgIHFjbGFzcyxcbiAgICAgICAgICApfWA7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IGFzc2VydC5mYWlsKFxuICAgICAgICAgICAgWGB1bnJlY29nbml6ZWQgJHtxKFFDTEFTUyl9ICR7cShxY2xhc3MpfWAsXG4gICAgICAgICAgICBUeXBlRXJyb3IsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQodHlwZW9mIGpzb25FbmNvZGVkID09PSAnb2JqZWN0JyAmJiBqc29uRW5jb2RlZCAhPT0gbnVsbCk7XG4gICAgICBjb25zdCBkZWNvZGVFbnRyeSA9IChbbmFtZSwgZW5jb2RlZFZhbF0pID0+IHtcbiAgICAgICAgdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgRmFpbGBQcm9wZXJ0eSAke3EobmFtZSl9IG9mICR7anNvbkVuY29kZWR9IG11c3QgYmUgYSBzdHJpbmdgO1xuICAgICAgICByZXR1cm4gW25hbWUsIGRlY29kZUZyb21DYXBEYXRhKGVuY29kZWRWYWwpXTtcbiAgICAgIH07XG4gICAgICBjb25zdCBkZWNvZGVkRW50cmllcyA9IGVudHJpZXMoanNvbkVuY29kZWQpLm1hcChkZWNvZGVFbnRyeSk7XG4gICAgICByZXR1cm4gZnJvbUVudHJpZXMoZGVjb2RlZEVudHJpZXMpO1xuICAgIH1cbiAgfTtcbiAgcmV0dXJuIGhhcmRlbihkZWNvZGVGcm9tQ2FwRGF0YSk7XG59OyRozY9fb25jZS5tYWtlRGVjb2RlRnJvbUNhcERhdGEobWFrZURlY29kZUZyb21DYXBEYXRhKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlFDTEFTUyI6WyJRQ0xBU1MiXSwibWFrZUVuY29kZVRvQ2FwRGF0YSI6WyJtYWtlRW5jb2RlVG9DYXBEYXRhIl0sIm1ha2VEZWNvZGVGcm9tQ2FwRGF0YSI6WyJtYWtlRGVjb2RlRnJvbUNhcERhdGEiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAADVNfjvRFAAD0RQAALQAAAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qc3siaW1wb3J0cyI6WyJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vZXJyb3JzIl0sImV4cG9ydHMiOlsibWFrZURlY29kZUZyb21TbWFsbGNhcHMiLCJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBwYXNzU3R5bGVPZixpc0Vycm9yTGlrZSxtYWtlVGFnZ2VkLGdldFRhZyxhc3NlcnRQYXNzYWJsZVN5bWJvbCxuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc2FibGVTeW1ib2xGb3JOYW1lLFgsRmFpbCxxOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJpc0Vycm9yTGlrZVwiLFskaM2PX2EgPT4gKGlzRXJyb3JMaWtlID0gJGjNj19hKV1dLFtcIm1ha2VUYWdnZWRcIixbJGjNj19hID0+IChtYWtlVGFnZ2VkID0gJGjNj19hKV1dLFtcImdldFRhZ1wiLFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVN5bWJvbFwiLFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlU3ltYm9sID0gJGjNj19hKV1dLFtcIm5hbWVGb3JQYXNzYWJsZVN5bWJvbFwiLFskaM2PX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRozY9fYSldXSxbXCJwYXNzYWJsZVN5bWJvbEZvck5hbWVcIixbJGjNj19hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEBpbXBvcnQge1Bhc3NhYmxlLCBSZW1vdGFibGVPYmplY3R9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnICovXG4vKiBGSVhNRSBkZWZpbmUgYWN0dWFsIHR5cGVzKi9cbi8qKiBAdHlwZWRlZiB7YW55fSBTbWFsbGNhcHNFbmNvZGluZyAqL1xuLyoqIEB0eXBlZGVmIHthbnl9IFNtYWxsY2Fwc0VuY29kaW5nVW5pb24gKi9cblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBpc0FycmF5IH0gPSBBcnJheTtcbmNvbnN0IHsgaXMsIGVudHJpZXMsIGZyb21FbnRyaWVzLCBoYXNPd24gfSA9IE9iamVjdDtcblxuY29uc3QgQkFORyA9ICchJy5jaGFyQ29kZUF0KDApO1xuY29uc3QgREFTSCA9ICctJy5jaGFyQ29kZUF0KDApO1xuXG4vKipcbiAqIEFuIGBlbmNvZGVUb1NtYWxsY2Fwc2AgZnVuY3Rpb24gdGFrZXMgYSBwYXNzYWJsZSBhbmQgcmV0dXJucyBhXG4gKiBKU09OLXJlcHJlc2VudGFibGUgb2JqZWN0IChpLmUuLCByb3VuZC10cmlwcGluZyBpdCB0aHJvdWdoXG4gKiBgSlNPTi5zdHJpbmdpZnlgIGFuZCBgSlNPTi5wYXJzZWAgd2l0aCBubyByZXBsYWNlcnMgb3IgcmV2aXZlcnNcbiAqIHJldHVybnMgYW4gZXF1aXZhbGVudCBzdHJ1Y3R1cmUgZXhjZXB0IGZvciBvYmplY3QgaWRlbnRpdHkpLlxuICogV2UgY2FsbCB0aGlzIHJlcHJlc2VudGF0aW9uIGEgU21hbGxjYXBzIEVuY29kaW5nLlxuICpcbiAqIEEgYGRlY29kZUZyb21TbWFsbGNhcHNgIGZ1bmN0aW9uIHRha2VzIGFzIGFyZ3VtZW50IHdoYXQgaXRcbiAqICphc3N1bWVzKiBpcyB0aGUgcmVzdWx0IG9mIGEgcGxhaW4gYEpTT04ucGFyc2VgIHdpdGggbm8gcmVzb2x2ZXIuIEl0IHRoZW5cbiAqIG11c3QgdmFsaWRhdGUgdGhhdCBpdCBpcyBhIHZhbGlkIFNtYWxsY2FwcyBFbmNvZGluZywgYW5kIGlmIGl0IGlzLFxuICogcmV0dXJuIGEgY29ycmVzcG9uZGluZyBwYXNzYWJsZS5cbiAqXG4gKiBTbWFsbGNhcHMgY29uc2lkZXJzIHRoZSBjaGFyYWN0ZXJzIGJldHdlZW4gYCFgIChhc2NpaSBjb2RlIDMzLCBCQU5HKVxuICogYW5kIGAtYCAoYXNjaWkgY29kZSA0NSwgREFTSCkgdG8gYmUgc3BlY2lhbCBwcmVmaXhlcyBhbGxvd2luZ1xuICogcmVwcmVzZW50YXRpb24gb2YgSlNPTi1pbmNvbXBhdGlibGUgZGF0YSB1c2luZyBzdHJpbmdzLlxuICogVGhlc2UgY2hhcmFjdGVycywgaW4gb3JkZXIsIGFyZSBgIVwiIyQlJicoKSorLC1gXG4gKiBPZiB0aGVzZSwgc21hbGxjYXBzIGN1cnJlbnRseSB1c2VzIHRoZSBmb2xsb3dpbmc6XG4gKlxuICogICogYCFgIC0gZXNjYXBlZCBzdHJpbmdcbiAqICAqIGArYCAtIG5vbi1uZWdhdGl2ZSBiaWdpbnRcbiAqICAqIGAtYCAtIG5lZ2F0aXZlIGJpZ2ludFxuICogICogYCNgIC0gbWFuaWZlc3QgY29uc3RhbnRcbiAqICAqIGAlYCAtIHN5bWJvbFxuICogICogYCRgIC0gcmVtb3RhYmxlXG4gKiAgKiBgJmAgLSBwcm9taXNlXG4gKlxuICogQWxsIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVycyAoYFwiJygpKixgKSBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuXG4gKlxuICogVGhlIG1hbmlmZXN0IGNvbnN0YW50cyB0aGF0IHNtYWxsY2FwcyBjdXJyZW50bHkgdXNlcyBmb3IgdmFsdWVzOlxuICogICogYCN1bmRlZmluZWRgXG4gKiAgKiBgI05hTmBcbiAqICAqIGAjSW5maW5pdHlgXG4gKiAgKiBgIy1JbmZpbml0eWBcbiAqXG4gKiBhbmQgZm9yIHByb3BlcnR5IG5hbWVzIGFuYWxvZ291cyB0byBjYXBkYXRhIEBxY2xhc3M6XG4gKiAgKiBgI3RhZ2BcbiAqICAqIGAjZXJyb3JgXG4gKlxuICogQWxsIG90aGVyIGVuY29kZWQgc3RyaW5ncyBiZWdpbm5pbmcgd2l0aCBgI2AgYXJlIHJlc2VydmVkIGZvclxuICogZnV0dXJlIHVzZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZFN0clxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IHN0YXJ0c1NwZWNpYWwgPSBlbmNvZGVkU3RyID0+IHtcbiAgaWYgKGVuY29kZWRTdHIgPT09ICcnKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8qIGNoYXJDb2RlQXQoMCkgYW5kIG51bWJlciBjb21wYXJlIGlzIGEgYml0IGZhc3Rlci4qL1xuICBjb25zdCBjb2RlID0gZW5jb2RlZFN0ci5jaGFyQ29kZUF0KDApO1xuICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgeW9kYSovXG4gIHJldHVybiBCQU5HIDw9IGNvZGUgJiYgY29kZSA8PSBEQVNIO1xufTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFbmNvZGVUb1NtYWxsY2Fwc09wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICByZW1vdGFibGU6IFJlbW90YWJsZU9iamVjdCxcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gU21hbGxjYXBzRW5jb2RpbmdcbiAqICkgPT4gU21hbGxjYXBzRW5jb2Rpbmd9IFtlbmNvZGVSZW1vdGFibGVUb1NtYWxsY2Fwc11cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBwcm9taXNlOiBQcm9taXNlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBTbWFsbGNhcHNFbmNvZGluZ1xuICogKSA9PiBTbWFsbGNhcHNFbmNvZGluZ30gW2VuY29kZVByb21pc2VUb1NtYWxsY2Fwc11cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlcnJvcjogRXJyb3IsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IFNtYWxsY2Fwc0VuY29kaW5nXG4gKiApID0+IFNtYWxsY2Fwc0VuY29kaW5nfSBbZW5jb2RlRXJyb3JUb1NtYWxsY2Fwc11cbiAqL1xuXG5jb25zdCBkb250RW5jb2RlUmVtb3RhYmxlVG9TbWFsbGNhcHMgPSByZW0gPT5cbiAgRmFpbGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YDtcblxuY29uc3QgZG9udEVuY29kZVByb21pc2VUb1NtYWxsY2FwcyA9IHByb20gPT4gRmFpbGBwcm9taXNlIHVuZXhwZWN0ZWQ6ICR7cHJvbX1gO1xuXG5jb25zdCBkb250RW5jb2RlRXJyb3JUb1NtYWxsY2FwcyA9IGVyciA9PlxuICBGYWlsYGVycm9yIG9iamVjdCB1bmV4cGVjdGVkOiAke3EoZXJyKX1gO1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2RlVG9TbWFsbGNhcHNPcHRpb25zfSBbZW5jb2RlT3B0aW9uc11cbiAqIGVuY29kZU9wdGlvbnMgaXMgYWN0dWFsbHkgb3B0aW9uYWwsIGJ1dCBub3QgbWFya2VkIGFzIHN1Y2ggdG8gd29yayBhcm91bmRcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvNTAyODZcbiAqXG4gKiBAcmV0dXJucyB7KHBhc3NhYmxlOiBQYXNzYWJsZSkgPT4gU21hbGxjYXBzRW5jb2Rpbmd9XG4gKi9cbiAgICAgICBjb25zdCBtYWtlRW5jb2RlVG9TbWFsbGNhcHMgPSAoZW5jb2RlT3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHtcbiAgICBlbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyA9IGRvbnRFbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyxcbiAgICBlbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMgPSBkb250RW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzLFxuICAgIGVuY29kZUVycm9yVG9TbWFsbGNhcHMgPSBkb250RW5jb2RlRXJyb3JUb1NtYWxsY2FwcyxcbiAgfSA9IGVuY29kZU9wdGlvbnM7XG5cbiAgY29uc3QgYXNzZXJ0RW5jb2RlZEVycm9yID0gZW5jb2RpbmcgPT4ge1xuICAgICh0eXBlb2YgZW5jb2RpbmcgPT09ICdvYmplY3QnICYmIGhhc093bihlbmNvZGluZywgJyNlcnJvcicpKSB8fFxuICAgICAgRmFpbGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBoYXZlIFwiI2Vycm9yXCIgcHJvcGVydHk6ICR7cShcbiAgICAgICAgZW5jb2RpbmcsXG4gICAgICApfWA7XG4gICAgLyogQXNzZXJ0IHRoYXQgdGhlICNlcnJvciBwcm9wZXJ0eSBkZWNvZGVzIHRvIGEgc3RyaW5nLiovXG4gICAgY29uc3QgbWVzc2FnZSA9IGVuY29kaW5nWycjZXJyb3InXTtcbiAgICAodHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnICYmXG4gICAgICAoIXN0YXJ0c1NwZWNpYWwobWVzc2FnZSkgfHwgbWVzc2FnZS5jaGFyQXQoMCkgPT09ICchJykpIHx8XG4gICAgICBGYWlsYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IGhhdmUgc3RyaW5nIG1lc3NhZ2U6ICR7cShtZXNzYWdlKX1gO1xuICB9O1xuXG4gIC8qKlxuICogTXVzdCBlbmNvZGUgYHZhbGAgaW50byBwbGFpbiBKU09OIGRhdGEgKmNhbm9uaWNhbGx5Kiwgc3VjaCB0aGF0XG4gKiBgSlNPTi5zdHJpbmdpZnkoZW5jb2RlKHYxKSkgPT09IEpTT04uc3RyaW5naWZ5KGVuY29kZSh2MSkpYC4gRm9yIG1vc3RcbiAqIGVuY29kaW5ncywgdGhlIG9yZGVyIG9mIHByb3BlcnRpZXMgb2YgZWFjaCBub2RlIG9mIHRoZSBvdXRwdXRcbiAqIHN0cnVjdHVyZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBhbGdvcml0aG0gYmVsb3cgd2l0aG91dCBzcGVjaWFsXG4gKiBhcnJhbmdlbWVudCwgdXN1YWxseSBieSBiZWluZyBleHByZXNzZWQgZGlyZWN0bHkgYXMgYW4gb2JqZWN0IGxpdGVyYWwuXG4gKiBUaGUgZXhjZXB0aW9uIGlzIGNvcHlSZWNvcmRzLCB3aG9zZSBuYXR1cmFsIGVudW1lcmF0aW9uIG9yZGVyXG4gKiBjYW4gZGlmZmVyIGJldHdlZW4gY29weVJlY29yZHMgdGhhdCBvdXIgZGlzdHJpYnV0ZWQgb2JqZWN0IHNlbWFudGljc1xuICogY29uc2lkZXJzIHRvIGJlIGVxdWl2YWxlbnQuXG4gKiBTaW5jZSwgZm9yIGVhY2ggY29weVJlY29yZCwgd2Ugb25seSBhY2NlcHQgc3RyaW5nIHByb3BlcnR5IG5hbWVzLFxuICogbm90IHN5bWJvbHMsIHdlIGNhbiBjYW5vbmljYWxseSBzb3J0IHRoZSBuYW1lcyBmaXJzdC5cbiAqIEpTT04uc3RyaW5naWZ5IHdpbGwgdGhlbiB2aXNpdCB0aGVzZSBpbiB0aGF0IHNvcnRlZCBvcmRlci5cbiAqXG4gKiBFbmNvZGluZyB3aXRoIGEgY2Fub25pY2FsLUpTT04gZW5jb2RlciB3b3VsZCBhbHNvIHNvbHZlIHRoaXMgY2Fub25pY2FsbmVzc1xuICogcHJvYmxlbSBpbiBhIG1vcmUgbW9kdWxhciBhbmQgZW5jYXBzdWxhdGVkIG1hbm5lci4gTm90ZSB0aGF0IHRoZVxuICogYWN0dWFsIG9yZGVyIHByb2R1Y2VkIGhlcmUsIHRob3VnaCBpdCBhZ3JlZXMgd2l0aCBjYW5vbmljYWwtSlNPTiBvblxuICogY29weVJlY29yZCBwcm9wZXJ0eSBvcmRlcmluZywgZGlmZmVycyBmcm9tIGNhbm9uaWNhbC1KU09OIGFzIGEgd2hvbGVcbiAqIGluIHRoYXQgdGhlIG90aGVyIHJlY29yZCBwcm9wZXJ0aWVzIGFyZSB2aXNpdGVkIGluIHRoZSBvcmRlciBpbiB3aGljaFxuICogdGhleSBhcmUgbGl0ZXJhbGx5IHdyaXR0ZW4gYmVsb3cuIFRPRE8gcGVyaGFwcyB3ZSBzaG91bGQgaW5kZWVkIHN3aXRjaFxuICogdG8gYSBjYW5vbmljYWwgSlNPTiBlbmNvZGVyLCBhbmQgbm90IGRlbGljYXRlbHkgZGVwZW5kIG9uIHRoZSBvcmRlclxuICogaW4gd2hpY2ggdGhlc2Ugb2JqZWN0IGxpdGVyYWxzIGFyZSB3cml0dGVuLlxuICpcbiAqIFJlYWRlcnMgbXVzdCBub3QgY2FyZSBhYm91dCB0aGlzIG9yZGVyIGFueXdheS4gV2UgaW1wb3NlIHRoaXMgcmVxdWlyZW1lbnRcbiAqIG1haW5seSB0byByZWR1Y2Ugbm9uLWRldGVybWluaXNtIGV4cG9zZWQgb3V0c2lkZSBhIHZhdC5cbiAqXG4gKiBAcGFyYW0ge2FueX0gcGFzc2FibGVcbiAqIEByZXR1cm5zIHtTbWFsbGNhcHNFbmNvZGluZ30gZXhjZXB0IHRoYXQgYGVuY29kZVRvU21hbGxjYXBzYCBkb2VzIG5vdCBnZW5lcmFsbHlcbiAqIGBoYXJkZW5gIHRoaXMgcmVzdWx0IGJlZm9yZSByZXR1cm5pbmcuIFJhdGhlciwgYGVuY29kZVRvU21hbGxjYXBzYCBpcyBub3RcbiAqIGRpcmVjdGx5IGV4cG9zZWQuXG4gKiBXaGF0J3MgZXhwb3NlZCBpbnN0ZWFkIGlzIGEgd3JhcHBlciB0aGF0IGZyZWV6ZXMgdGhlIG91dHB1dCBiZWZvcmVcbiAqIHJldHVybmluZy4gSWYgdGhpcyB0dXJucyBvdXQgdG8gaW1wZWRlIHN0YXRpYyBhbmFseXNpcyBmb3IgYGhhcmRlbmAgc2FmZXR5LFxuICogd2UgY2FuIGFsd2F5cyBwdXQgdGhlIChub3cgcmVkdW5kYW50KSBoYXJkZW5zIGJhY2sgaW4uIFRoZXkgZG9uJ3QgaHVydC5cbiAqL1xuICBjb25zdCBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyID0gcGFzc2FibGUgPT4ge1xuICAgIC8qIEZpcnN0IHdlIGhhbmRsZSBhbGwgcHJpbWl0aXZlcy4gU29tZSBjYW4gYmUgcmVwcmVzZW50ZWQgZGlyZWN0bHkgYXMqL1xuICAgIC8qIEpTT04sIGFuZCBzb21lIG11c3QgYmUgZW5jb2RlZCBpbnRvIHNtYWxsY2FwcyBzdHJpbmdzLiovXG4gICAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YocGFzc2FibGUpO1xuICAgIHN3aXRjaCAocGFzc1N0eWxlKSB7XG4gICAgICBjYXNlICdudWxsJzpcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOiB7XG4gICAgICAgIC8qIHBhc3MgdGhyb3VnaCB0byBKU09OKi9cbiAgICAgICAgcmV0dXJuIHBhc3NhYmxlO1xuICAgICAgfVxuICAgICAgY2FzZSAnc3RyaW5nJzoge1xuICAgICAgICBpZiAoc3RhcnRzU3BlY2lhbChwYXNzYWJsZSkpIHtcbiAgICAgICAgICAvKiBTdHJpbmdzIHRoYXQgc3RhcnQgd2l0aCBhIHNwZWNpYWwgY2hhciBhcmUgcXVvdGVkIHdpdGggYCFgLiovXG4gICAgICAgICAgLyogU2luY2UgYCFgIGlzIGl0c2VsZiBhIHNwZWNpYWwgY2hhcmFjdGVyLCB0aGlzIHRyaXZpYWxseSBkb2VzKi9cbiAgICAgICAgICAvKiB0aGUgSGlsYmVydCBob3RlbC4gQWxzbywgc2luY2UgdGhlIHNwZWNpYWwgY2hhcmFjdGVycyBhcmUqL1xuICAgICAgICAgIC8qIGEgY29udGludW91cyBzdWJyYW5nZSBvZiBhc2NpaSwgdGhpcyBxdW90aW5nIGlzIHNvcnQtb3JkZXIqL1xuICAgICAgICAgIC8qIHByZXNlcnZpbmcuKi9cbiAgICAgICAgICByZXR1cm4gYCEke3Bhc3NhYmxlfWA7XG4gICAgICAgIH1cbiAgICAgICAgLyogQWxsIG90aGVyIHN0cmluZ3MgcGFzcyB0aHJvdWdoIHRvIEpTT04qL1xuICAgICAgICByZXR1cm4gcGFzc2FibGU7XG4gICAgICB9XG4gICAgICBjYXNlICd1bmRlZmluZWQnOiB7XG4gICAgICAgIHJldHVybiAnI3VuZGVmaW5lZCc7XG4gICAgICB9XG4gICAgICBjYXNlICdudW1iZXInOiB7XG4gICAgICAgIC8qIFNwZWNpYWwtY2FzZSBudW1iZXJzIHdpdGggbm8gZGlnaXQtYmFzZWQgcmVwcmVzZW50YXRpb24uKi9cbiAgICAgICAgaWYgKE51bWJlci5pc05hTihwYXNzYWJsZSkpIHtcbiAgICAgICAgICByZXR1cm4gJyNOYU4nO1xuICAgICAgICB9IGVsc2UgaWYgKHBhc3NhYmxlID09PSBJbmZpbml0eSkge1xuICAgICAgICAgIHJldHVybiAnI0luZmluaXR5JztcbiAgICAgICAgfSBlbHNlIGlmIChwYXNzYWJsZSA9PT0gLUluZmluaXR5KSB7XG4gICAgICAgICAgcmV0dXJuICcjLUluZmluaXR5JztcbiAgICAgICAgfVxuICAgICAgICAvKiBQYXNzIHRocm91Z2ggZXZlcnl0aGluZyBlbHNlLCByZXBsYWNpbmcgLTAgd2l0aCAwLiovXG4gICAgICAgIHJldHVybiBpcyhwYXNzYWJsZSwgLTApID8gMCA6IHBhc3NhYmxlO1xuICAgICAgfVxuICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICBjb25zdCBzdHIgPSBTdHJpbmcocGFzc2FibGUpO1xuICAgICAgICByZXR1cm4gLyoqIEB0eXBlIHtiaWdpbnR9ICovIChwYXNzYWJsZSkgPCAwbiA/IHN0ciA6IGArJHtzdHJ9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgICAgYXNzZXJ0UGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xuICAgICAgICBjb25zdCBuYW1lID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChuYW1lRm9yUGFzc2FibGVTeW1ib2wocGFzc2FibGUpKTtcbiAgICAgICAgcmV0dXJuIGAlJHtuYW1lfWA7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5UmVjb3JkJzoge1xuICAgICAgICAvKiBDdXJyZW50bHkgY29weVJlY29yZCBhbGxvd3Mgb25seSBzdHJpbmcga2V5cyBzbyB0aGlzIHdpbGwqL1xuICAgICAgICAvKiB3b3JrLiBJZiB3ZSBhbGxvdyBzb3J0YWJsZSBzeW1ib2wga2V5cywgdGhpcyB3aWxsIG5lZWQgdG8qL1xuICAgICAgICAvKiBiZWNvbWUgbW9yZSBpbnRlcmVzdGluZy4qL1xuICAgICAgICBjb25zdCBuYW1lcyA9IG93bktleXMocGFzc2FibGUpLnNvcnQoKTtcbiAgICAgICAgcmV0dXJuIGZyb21FbnRyaWVzKFxuICAgICAgICAgIG5hbWVzLm1hcChuYW1lID0+IFtcbiAgICAgICAgICAgIGVuY29kZVRvU21hbGxjYXBzUmVjdXIobmFtZSksXG4gICAgICAgICAgICBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKHBhc3NhYmxlW25hbWVdKSxcbiAgICAgICAgICBdKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgcmV0dXJuIHBhc3NhYmxlLm1hcChlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2J5dGVBcnJheSc6IHtcbiAgICAgICAgLyogVE9ETyBpbXBsZW1lbnQqL1xuICAgICAgICB0aHJvdyBGYWlsYG1hcnNhbCBvZiBieXRlQXJyYXkgbm90IHlldCBpbXBsZW1lbnRlZDogJHtwYXNzYWJsZX1gO1xuICAgICAgfVxuICAgICAgY2FzZSAndGFnZ2VkJzoge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICcjdGFnJzogZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihnZXRUYWcocGFzc2FibGUpKSxcbiAgICAgICAgICBwYXlsb2FkOiBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKHBhc3NhYmxlLnBheWxvYWQpLFxuICAgICAgICB9O1xuICAgICAgfVxuICAgICAgY2FzZSAncmVtb3RhYmxlJzoge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBlbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyhcbiAgICAgICAgICBwYXNzYWJsZSxcbiAgICAgICAgICBlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyLFxuICAgICAgICApO1xuICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PT0gJ3N0cmluZycgJiYgcmVzdWx0LmNoYXJBdCgwKSA9PT0gJyQnKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICAvKiBgdGhyb3dgIGlzIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cy4gQnV0IGxpbnRlciBjb25mdXNlZCovXG4gICAgICAgIHRocm93IEZhaWxgaW50ZXJuYWw6IFJlbW90YWJsZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCIkXCI6ICR7cmVzdWx0fWA7XG4gICAgICB9XG4gICAgICBjYXNlICdwcm9taXNlJzoge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBlbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMoXG4gICAgICAgICAgcGFzc2FibGUsXG4gICAgICAgICAgZW5jb2RlVG9TbWFsbGNhcHNSZWN1cixcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHQgPT09ICdzdHJpbmcnICYmIHJlc3VsdC5jaGFyQXQoMCkgPT09ICcmJykge1xuICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgdGhyb3cgRmFpbGBpbnRlcm5hbDogUHJvbWlzZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCImXCI6ICR7cmVzdWx0fWA7XG4gICAgICB9XG4gICAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gZW5jb2RlRXJyb3JUb1NtYWxsY2FwcyhwYXNzYWJsZSwgZW5jb2RlVG9TbWFsbGNhcHNSZWN1cik7XG4gICAgICAgIGFzc2VydEVuY29kZWRFcnJvcihyZXN1bHQpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBhc3NlcnQuZmFpbChcbiAgICAgICAgICBYYGludGVybmFsOiBVbnJlY29nbml6ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfWAsXG4gICAgICAgICAgVHlwZUVycm9yLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcbiAgY29uc3QgZW5jb2RlVG9TbWFsbGNhcHMgPSBwYXNzYWJsZSA9PiB7XG4gICAgaWYgKGlzRXJyb3JMaWtlKHBhc3NhYmxlKSkge1xuICAgICAgLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgdG8gYWNjb21tb2RhdGUgZXJyb3JzIHRoYXQgYXJlIG5vdCovXG4gICAgICAvKiB2YWxpZCBQYXNzYWJsZXMuIEZvciBleGFtcGxlLCBiZWNhdXNlIHRoZXkncmUgbm90IGZyb3plbi4qL1xuICAgICAgLyogVGhlIHNwZWNpYWwgY2FzZSBjYW4gb25seSBldmVyIGFwcGx5IGF0IHRoZSByb290LCBhbmQgdGhlcmVmb3JlKi9cbiAgICAgIC8qIG91dHNpZGUgdGhlIHJlY3Vyc2lvbiwgc2luY2UgYW4gZXJyb3IgY291bGQgb25seSBiZSBkZWVwZXIgaW4qL1xuICAgICAgLyogYSBwYXNzYWJsZSBzdHJ1Y3R1cmUgaWYgaXQgd2VyZSBwYXNzYWJsZS4qL1xuICAgICAgLyoqL1xuICAgICAgLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgYmVjYXVzZSwgZm9yIHRoZXNlIGVycm9ycywgd2UncmUgbXVjaCovXG4gICAgICAvKiBtb3JlIGludGVyZXN0ZWQgaW4gcmVwb3J0aW5nIHdoYXRldmVyIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gdGhleSovXG4gICAgICAvKiBjYXJyeSB0aGFuIHdlIGFyZSBhYm91dCByZXBvcnRpbmcgcHJvYmxlbXMgZW5jb3VudGVyZWQgaW4gcmVwb3J0aW5nKi9cbiAgICAgIC8qIHRoaXMgaW5mb3JtYXRpb24uKi9cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGhhcmRlbihcbiAgICAgICAgZW5jb2RlRXJyb3JUb1NtYWxsY2FwcyhwYXNzYWJsZSwgZW5jb2RlVG9TbWFsbGNhcHNSZWN1ciksXG4gICAgICApO1xuICAgICAgYXNzZXJ0RW5jb2RlZEVycm9yKHJlc3VsdCk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICByZXR1cm4gaGFyZGVuKGVuY29kZVRvU21hbGxjYXBzUmVjdXIocGFzc2FibGUpKTtcbiAgfTtcbiAgcmV0dXJuIGhhcmRlbihlbmNvZGVUb1NtYWxsY2Fwcyk7XG59OyRozY9fb25jZS5tYWtlRW5jb2RlVG9TbWFsbGNhcHMobWFrZUVuY29kZVRvU21hbGxjYXBzKTtcbmhhcmRlbihtYWtlRW5jb2RlVG9TbWFsbGNhcHMpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlY29kZUZyb21TbWFsbGNhcHNPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFJlbW90YWJsZTogU21hbGxjYXBzRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZSA6U21hbGxjYXBzRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IFJlbW90YWJsZU9iamVjdH0gW2RlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHNdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFByb21pc2U6IFNtYWxsY2Fwc0VuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGUgOlNtYWxsY2Fwc0VuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBQcm9taXNlfSBbZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHNdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZEVycm9yOiBTbWFsbGNhcHNFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlIDpTbWFsbGNhcHNFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gRXJyb3J9IFtkZWNvZGVFcnJvckZyb21TbWFsbGNhcHNdXG4gKi9cblxuY29uc3QgZG9udERlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMgPSBlbmNvZGluZyA9PlxuICBGYWlsYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMgPSBlbmNvZGluZyA9PlxuICBGYWlsYHByb21pc2UgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gO1xuY29uc3QgZG9udERlY29kZUVycm9yRnJvbVNtYWxsY2FwcyA9IGVuY29kaW5nID0+XG4gIEZhaWxgZXJyb3IgdW5leHBlY3RlZDogJHtxKGVuY29kaW5nKX1gO1xuXG4vKipcbiAqIEBwYXJhbSB7RGVjb2RlRnJvbVNtYWxsY2Fwc09wdGlvbnN9IFtkZWNvZGVPcHRpb25zXVxuICogQHJldHVybnMgeyhlbmNvZGVkOiBTbWFsbGNhcHNFbmNvZGluZykgPT4gUGFzc2FibGV9XG4gKi9cbiAgICAgICBjb25zdCBtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyA9IChkZWNvZGVPcHRpb25zID0ge30pID0+IHtcbiAgY29uc3Qge1xuICAgIGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMgPSBkb250RGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyxcbiAgICBkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyA9IGRvbnREZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyxcbiAgICBkZWNvZGVFcnJvckZyb21TbWFsbGNhcHMgPSBkb250RGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzLFxuICB9ID0gZGVjb2RlT3B0aW9ucztcblxuICAvKipcbiAqIGBkZWNvZGVGcm9tU21hbGxjYXBzYCBtYXkgcmVseSBvbiBgZW5jb2RpbmdgIGJlaW5nIHRoZSByZXN1bHQgb2YgYVxuICogcGxhaW4gY2FsbCB0byBKU09OLnBhcnNlLiBIb3dldmVyLCBpdCAqY2Fubm90KiByZWx5IG9uIGBlbmNvZGluZ2BcbiAqIGhhdmluZyBiZWVuIHByb2R1Y2VkIGJ5IEpTT04uc3RyaW5naWZ5IG9uIHRoZSBvdXRwdXQgb2YgYGVuY29kZVRvU21hbGxjYXBzYFxuICogYWJvdmUsIGkuZS4sIGBkZWNvZGVGcm9tU21hbGxjYXBzYCBjYW5ub3QgcmVseSBvbiBgZW5jb2RpbmdgIGJlaW5nIGFcbiAqIHZhbGlkIG1hcnNoYWxsZWQgcmVwcmVzZW50YXRpb24uIFJhdGhlciwgYGRlY29kZUZyb21TbWFsbGNhcHNgIG11c3RcbiAqIHZhbGlkYXRlIHRoYXQuXG4gKlxuICogQHBhcmFtIHtTbWFsbGNhcHNFbmNvZGluZ30gZW5jb2RpbmcgbXVzdCBiZSBoYXJkZW5lZFxuICovXG4gIGNvbnN0IGRlY29kZUZyb21TbWFsbGNhcHMgPSBlbmNvZGluZyA9PiB7XG4gICAgc3dpdGNoICh0eXBlb2YgZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgY2FzZSAnbnVtYmVyJzoge1xuICAgICAgICByZXR1cm4gZW5jb2Rpbmc7XG4gICAgICB9XG4gICAgICBjYXNlICdzdHJpbmcnOiB7XG4gICAgICAgIGlmICghc3RhcnRzU3BlY2lhbChlbmNvZGluZykpIHtcbiAgICAgICAgICByZXR1cm4gZW5jb2Rpbmc7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgYyA9IGVuY29kaW5nLmNoYXJBdCgwKTtcbiAgICAgICAgc3dpdGNoIChjKSB7XG4gICAgICAgICAgY2FzZSAnISc6IHtcbiAgICAgICAgICAgIC8qIHVuLWhpbGJlcnQtaWZ5IHRoZSBzdHJpbmcqL1xuICAgICAgICAgICAgcmV0dXJuIGVuY29kaW5nLnNsaWNlKDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICclJzoge1xuICAgICAgICAgICAgcmV0dXJuIHBhc3NhYmxlU3ltYm9sRm9yTmFtZShlbmNvZGluZy5zbGljZSgxKSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJyMnOiB7XG4gICAgICAgICAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICAgICAgICAgIGNhc2UgJyN1bmRlZmluZWQnOiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlICcjTmFOJzoge1xuICAgICAgICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY2FzZSAnI0luZmluaXR5Jzoge1xuICAgICAgICAgICAgICAgIHJldHVybiBJbmZpbml0eTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBjYXNlICcjLUluZmluaXR5Jzoge1xuICAgICAgICAgICAgICAgIHJldHVybiAtSW5maW5pdHk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgIHRocm93IGFzc2VydC5mYWlsKFxuICAgICAgICAgICAgICAgICAgWGB1bmtub3duIGNvbnN0YW50IFwiJHtxKGVuY29kaW5nKX1cImAsXG4gICAgICAgICAgICAgICAgICBUeXBlRXJyb3IsXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICcrJzpcbiAgICAgICAgICBjYXNlICctJzoge1xuICAgICAgICAgICAgcmV0dXJuIEJpZ0ludChlbmNvZGluZyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJyQnOiB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBkZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzKFxuICAgICAgICAgICAgICBlbmNvZGluZyxcbiAgICAgICAgICAgICAgZGVjb2RlRnJvbVNtYWxsY2FwcyxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAvKiBAdHMtaWdub3JlIFhYWCBTbWFsbENhcHNFbmNvZGluZyovXG4gICAgICAgICAgICBpZiAocGFzc1N0eWxlT2YocmVzdWx0KSAhPT0gJ3JlbW90YWJsZScpIHtcbiAgICAgICAgICAgICAgRmFpbGBpbnRlcm5hbDogZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyBvcHRpb24gbXVzdCByZXR1cm4gYSByZW1vdGFibGU6ICR7cmVzdWx0fWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICcmJzoge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMoXG4gICAgICAgICAgICAgIGVuY29kaW5nLFxuICAgICAgICAgICAgICBkZWNvZGVGcm9tU21hbGxjYXBzLFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGlmIChwYXNzU3R5bGVPZihyZXN1bHQpICE9PSAncHJvbWlzZScpIHtcbiAgICAgICAgICAgICAgRmFpbGBpbnRlcm5hbDogZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMgb3B0aW9uIG11c3QgcmV0dXJuIGEgcHJvbWlzZTogJHtyZXN1bHR9YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIHRocm93IEZhaWxgU3BlY2lhbCBjaGFyICR7cShcbiAgICAgICAgICAgICAgYyxcbiAgICAgICAgICAgICl9IHJlc2VydmVkIGZvciBmdXR1cmUgdXNlOiAke2VuY29kaW5nfWA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjYXNlICdvYmplY3QnOiB7XG4gICAgICAgIGlmIChlbmNvZGluZyA9PT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBlbmNvZGluZztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0FycmF5KGVuY29kaW5nKSkge1xuICAgICAgICAgIHJldHVybiBlbmNvZGluZy5tYXAodmFsID0+IGRlY29kZUZyb21TbWFsbGNhcHModmFsKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzT3duKGVuY29kaW5nLCAnI3RhZycpKSB7XG4gICAgICAgICAgY29uc3QgeyAnI3RhZyc6IHRhZywgcGF5bG9hZCwgLi4ucmVzdCB9ID0gZW5jb2Rpbmc7XG4gICAgICAgICAgdHlwZW9mIHRhZyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIEZhaWxgVmFsdWUgb2YgXCIjdGFnXCIsIHRoZSB0YWcsIG11c3QgYmUgYSBzdHJpbmc6ICR7ZW5jb2Rpbmd9YDtcbiAgICAgICAgICBvd25LZXlzKHJlc3QpLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgICAgICAgRmFpbGAjdGFnIHJlY29yZCB1bmV4cGVjdGVkIHByb3BlcnRpZXM6ICR7cShvd25LZXlzKHJlc3QpKX1gO1xuICAgICAgICAgIHJldHVybiBtYWtlVGFnZ2VkKFxuICAgICAgICAgICAgZGVjb2RlRnJvbVNtYWxsY2Fwcyh0YWcpLFxuICAgICAgICAgICAgZGVjb2RlRnJvbVNtYWxsY2FwcyhwYXlsb2FkKSxcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGhhc093bihlbmNvZGluZywgJyNlcnJvcicpKSB7XG4gICAgICAgICAgY29uc3QgcmVzdWx0ID0gZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzKFxuICAgICAgICAgICAgZW5jb2RpbmcsXG4gICAgICAgICAgICBkZWNvZGVGcm9tU21hbGxjYXBzLFxuICAgICAgICAgICk7XG4gICAgICAgICAgcGFzc1N0eWxlT2YocmVzdWx0KSA9PT0gJ2Vycm9yJyB8fFxuICAgICAgICAgICAgRmFpbGBpbnRlcm5hbDogZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzIG9wdGlvbiBtdXN0IHJldHVybiBhbiBlcnJvcjogJHtyZXN1bHR9YDtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgZGVjb2RlRW50cnkgPSAoW2VuY29kZWROYW1lLCBlbmNvZGVkVmFsXSkgPT4ge1xuICAgICAgICAgIHR5cGVvZiBlbmNvZGVkTmFtZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgIEZhaWxgUHJvcGVydHkgbmFtZSAke3EoXG4gICAgICAgICAgICAgIGVuY29kZWROYW1lLFxuICAgICAgICAgICAgKX0gb2YgJHtlbmNvZGluZ30gbXVzdCBiZSBhIHN0cmluZ2A7XG4gICAgICAgICAgZW5jb2RlZE5hbWUuY2hhckF0KDApICE9PSAnIycgfHxcbiAgICAgICAgICAgIEZhaWxgVW5yZWNvZ25pemVkIHJlY29yZCB0eXBlICR7cShlbmNvZGVkTmFtZSl9OiAke2VuY29kaW5nfWA7XG4gICAgICAgICAgY29uc3QgbmFtZSA9IGRlY29kZUZyb21TbWFsbGNhcHMoZW5jb2RlZE5hbWUpO1xuICAgICAgICAgIHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgRmFpbGBEZWNvZGVkIHByb3BlcnR5IG5hbWUgJHtuYW1lfSBmcm9tICR7ZW5jb2Rpbmd9IG11c3QgYmUgYSBzdHJpbmdgO1xuICAgICAgICAgIHJldHVybiBbbmFtZSwgZGVjb2RlRnJvbVNtYWxsY2FwcyhlbmNvZGVkVmFsKV07XG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGRlY29kZWRFbnRyaWVzID0gZW50cmllcyhlbmNvZGluZykubWFwKGRlY29kZUVudHJ5KTtcbiAgICAgICAgcmV0dXJuIGZyb21FbnRyaWVzKGRlY29kZWRFbnRyaWVzKTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoXG4gICAgICAgICAgWGBpbnRlcm5hbDogdW5yZWNvZ25pemVkIEpTT04gdHlwZW9mICR7cShcbiAgICAgICAgICAgIHR5cGVvZiBlbmNvZGluZyxcbiAgICAgICAgICApfTogJHtlbmNvZGluZ31gLFxuICAgICAgICAgIFR5cGVFcnJvcixcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHJldHVybiBoYXJkZW4oZGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG59OyRozY9fb25jZS5tYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyhtYWtlRGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiOlsibWFrZUVuY29kZVRvU21hbGxjYXBzIl0sIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzIjpbIm1ha2VEZWNvZGVGcm9tU21hbGxjYXBzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEJ0Fem+QgAAvkIAACoAAABAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvbWFyc2hhbC1qdXN0aW4uanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiQGVuZG8vbmF0IiwiQGVuZG8vcGFzcy1zdHlsZSIsIi4vZW5jb2RlVG9DYXBEYXRhLmpzIiwiLi9tYXJzaGFsLmpzIl0sImV4cG9ydHMiOlsiZGVjb2RlVG9KdXN0aW4iLCJwYXNzYWJsZUFzSnVzdGluIiwicXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBxLFgsRmFpbCxOYXQsZ2V0RXJyb3JDb25zdHJ1Y3Rvcixpc1ByaW1pdGl2ZSxuYW1lRm9yUGFzc2FibGVTeW1ib2wscGFzc2FibGVTeW1ib2xGb3JOYW1lLFFDTEFTUyxtYWtlTWFyc2hhbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLFskaM2PX2EgPT4gKE5hdCA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Bhc3Mtc3R5bGVcIiwgW1tcImdldEVycm9yQ29uc3RydWN0b3JcIixbJGjNj19hID0+IChnZXRFcnJvckNvbnN0cnVjdG9yID0gJGjNj19hKV1dLFtcImlzUHJpbWl0aXZlXCIsWyRozY9fYSA9PiAoaXNQcmltaXRpdmUgPSAkaM2PX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsWyRozY9fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjNj19hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLFskaM2PX2EgPT4gKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9ICRozY9fYSldXV1dLFtcIi4vZW5jb2RlVG9DYXBEYXRhLmpzXCIsIFtbXCJRQ0xBU1NcIixbJGjNj19hID0+IChRQ0xBU1MgPSAkaM2PX2EpXV1dXSxbXCIuL21hcnNoYWwuanNcIiwgW1tcIm1ha2VNYXJzaGFsXCIsWyRozY9fYSA9PiAobWFrZU1hcnNoYWwgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtTdHJpbmdhYmxlUGF5bG9hZH0gZnJvbSAnc2VzJztcbiAqIEBpbXBvcnQge1Bhc3NhYmxlfSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJztcbiAqIEBpbXBvcnQge0VuY29kaW5nfSBmcm9tICcuL3R5cGVzLmpzJztcbiAqL1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3QgeyBzdHJpbmdpZnk6IHF1b3RlIH0gPSBKU09OO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEluZGVudGVyXG4gKiBAcHJvcGVydHkgeyhvcGVuQnJhY2tldDogc3RyaW5nKSA9PiBudW1iZXJ9IG9wZW5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gbnVtYmVyfSBsaW5lXG4gKiBAcHJvcGVydHkgeyh0b2tlbjogc3RyaW5nKSA9PiBudW1iZXJ9IG5leHRcbiAqIEBwcm9wZXJ0eSB7KGNsb3NlQnJhY2tldDogc3RyaW5nKSA9PiBudW1iZXJ9IGNsb3NlXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gZG9uZVxuICovXG5cbi8qKlxuICogR2VuZXJvdXMgd2hpdGVzcGFjZSBmb3IgcmVhZGFiaWxpdHlcbiAqXG4gKiBAcmV0dXJucyB7SW5kZW50ZXJ9XG4gKi9cbmNvbnN0IG1ha2VZZXNJbmRlbnRlciA9ICgpID0+IHtcbiAgY29uc3Qgc3RyaW5ncyA9IFtdO1xuICBsZXQgbGV2ZWwgPSAwO1xuICBsZXQgbmVlZFNwYWNlID0gZmFsc2U7XG4gIGNvbnN0IGxpbmUgPSAoKSA9PiB7XG4gICAgbmVlZFNwYWNlID0gZmFsc2U7XG4gICAgcmV0dXJuIHN0cmluZ3MucHVzaCgnXFxuJywgJyAgJy5yZXBlYXQobGV2ZWwpKTtcbiAgfTtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgb3Blbjogb3BlbkJyYWNrZXQgPT4ge1xuICAgICAgbGV2ZWwgKz0gMTtcbiAgICAgIGlmIChuZWVkU3BhY2UpIHtcbiAgICAgICAgc3RyaW5ncy5wdXNoKCcgJyk7XG4gICAgICB9XG4gICAgICBuZWVkU3BhY2UgPSBmYWxzZTtcbiAgICAgIHJldHVybiBzdHJpbmdzLnB1c2gob3BlbkJyYWNrZXQpO1xuICAgIH0sXG4gICAgbGluZSxcbiAgICBuZXh0OiB0b2tlbiA9PiB7XG4gICAgICBpZiAobmVlZFNwYWNlICYmIHRva2VuICE9PSAnLCcgJiYgdG9rZW4gIT09ICcpJykge1xuICAgICAgICBzdHJpbmdzLnB1c2goJyAnKTtcbiAgICAgIH1cbiAgICAgIG5lZWRTcGFjZSA9IHRydWU7XG4gICAgICByZXR1cm4gc3RyaW5ncy5wdXNoKHRva2VuKTtcbiAgICB9LFxuICAgIGNsb3NlOiBjbG9zZUJyYWNrZXQgPT4ge1xuICAgICAgYXNzZXJ0KGxldmVsID49IDEpO1xuICAgICAgbGV2ZWwgLT0gMTtcbiAgICAgIGxpbmUoKTtcbiAgICAgIHJldHVybiBzdHJpbmdzLnB1c2goY2xvc2VCcmFja2V0KTtcbiAgICB9LFxuICAgIGRvbmU6ICgpID0+IHtcbiAgICAgIGFzc2VydC5lcXVhbChsZXZlbCwgMCk7XG4gICAgICByZXR1cm4gc3RyaW5ncy5qb2luKCcnKTtcbiAgICB9LFxuICB9KTtcbn07XG5cbi8qKlxuICogSWYgdGhlIGxhc3QgY2hhcmFjdGVyIG9mIG9uZSB0b2tlbiB0b2dldGhlciB3aXRoIHRoZSBmaXJzdCBjaGFyYWN0ZXJcbiAqIG9mIHRoZSBuZXh0IHRva2VuIG1hdGNoZXMgdGhpcyBwYXR0ZXJuLCB0aGVuIHRoZSB0d28gdG9rZW5zIG11c3QgYmVcbiAqIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlIHRvIHByZXNlcnZlIHRoZWlyIG1lYW5pbmcuIE90aGVyd2lzZSB0aGVcbiAqIHdoaXRlc3BhY2UgaW4gdW5uZWNlc3NhcnkuXG4gKlxuICogVGhlIGA8IWAgYW5kIGAtPmAgY2FzZXMgcHJldmVudCB0aGUgYWNjaWRlbnRhbCBmb3JtYXRpb24gb2YgYW5cbiAqIGh0bWwtbGlrZSBjb21tZW50LiBJIGRvbid0IHRoaW5rIHRoZSBkb3VibGUgYW5nbGUgYnJhY2tldHMgYXJlIGFjdHVhbGx5XG4gKiBuZWVkZWQgYnV0IEkgaGF2ZW4ndCB0aG91Z2h0IGFib3V0IGl0IGVub3VnaCB0byByZW1vdmUgdGhlbS5cbiAqL1xuY29uc3QgYmFkUGFpclBhdHRlcm4gPSAvXig/Olxcd1xcd3w8PHw+PnxcXCtcXCt8LS18PCF8LT4pJC87XG5cbi8qKlxuICogTWluaW11bSB3aGl0ZXNwYWNlIG5lZWRlZCB0byBwcmVzZXZlIG1lYW5pbmcuXG4gKlxuICogQHJldHVybnMge0luZGVudGVyfVxuICovXG5jb25zdCBtYWtlTm9JbmRlbnRlciA9ICgpID0+IHtcbiAgLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9cbiAgY29uc3Qgc3RyaW5ncyA9IFtdO1xuICByZXR1cm4gaGFyZGVuKHtcbiAgICBvcGVuOiBvcGVuQnJhY2tldCA9PiBzdHJpbmdzLnB1c2gob3BlbkJyYWNrZXQpLFxuICAgIGxpbmU6ICgpID0+IHN0cmluZ3MubGVuZ3RoLFxuICAgIG5leHQ6IHRva2VuID0+IHtcbiAgICAgIGlmIChzdHJpbmdzLmxlbmd0aCA+PSAxKSB7XG4gICAgICAgIGNvbnN0IGxhc3QgPSBzdHJpbmdzW3N0cmluZ3MubGVuZ3RoIC0gMV07XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAZW5kby9yZXN0cmljdC1jb21wYXJpc29uLW9wZXJhbmRzIC0tIGVycm9yKi9cbiAgICAgICAgaWYgKGxhc3QubGVuZ3RoID49IDEgJiYgdG9rZW4ubGVuZ3RoID49IDEpIHtcbiAgICAgICAgICBjb25zdCBwYWlyID0gYCR7bGFzdFtsYXN0Lmxlbmd0aCAtIDFdfSR7dG9rZW5bMF19YDtcbiAgICAgICAgICBpZiAoYmFkUGFpclBhdHRlcm4udGVzdChwYWlyKSkge1xuICAgICAgICAgICAgc3RyaW5ncy5wdXNoKCcgJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gc3RyaW5ncy5wdXNoKHRva2VuKTtcbiAgICB9LFxuICAgIGNsb3NlOiBjbG9zZUJyYWNrZXQgPT4ge1xuICAgICAgaWYgKHN0cmluZ3MubGVuZ3RoID49IDEgJiYgc3RyaW5nc1tzdHJpbmdzLmxlbmd0aCAtIDFdID09PSAnLCcpIHtcbiAgICAgICAgc3RyaW5ncy5wb3AoKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdHJpbmdzLnB1c2goY2xvc2VCcmFja2V0KTtcbiAgICB9LFxuICAgIGRvbmU6ICgpID0+IHN0cmluZ3Muam9pbignJyksXG4gIH0pO1xufTtcblxuY29uc3QgaWRlbnRQYXR0ZXJuID0gL15bYS16QS1aXVxcdyokLztcbmhhcmRlbihpZGVudFBhdHRlcm4pO1xuY29uc3QgQXRBdFByZWZpeFBhdHRlcm4gPSAvXkBAKC4qKSQvO1xuaGFyZGVuKEF0QXRQcmVmaXhQYXR0ZXJuKTtcblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSBlbmNvZGluZ1xuICogQHBhcmFtIHtib29sZWFuPX0gc2hvdWxkSW5kZW50XG4gKiBAcGFyYW0ge2FueVtdfSBbc2xvdHNdXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBkZWNvZGVUb0p1c3RpbiA9IChlbmNvZGluZywgc2hvdWxkSW5kZW50ID0gZmFsc2UsIHNsb3RzID0gW10pID0+IHtcbiAgLyoqXG4gKiBUaGUgZmlyc3QgcGFzcyBkb2VzIHNvbWUgaW5wdXQgdmFsaWRhdGlvbi5cbiAqIEl0cyBjb250cm9sIGZsb3cgc2hvdWxkIG1pcnJvciBgcmVjdXJgIGFzIGNsb3NlbHkgYXMgcG9zc2libGVcbiAqIGFuZCB0aGUgdHdvIHNob3VsZCBiZSBtYWludGFpbmVkIHRvZ2V0aGVyLiBUaGV5IG11c3QgdmlzaXQgZXZlcnl0aGluZ1xuICogaW4gdGhlIHNhbWUgb3JkZXIuXG4gKlxuICogVE9ETyBub3cgdGhhdCBpYmlkcyBhcmUgZ29uZSwgd2Ugc2hvdWxkIGZvbGQgdGhpcyBiYWNrIHRvZ2V0aGVyIGludG9cbiAqIG9uZSB2YWxpZGF0aW5nIHBhc3MuXG4gKlxuICogQHBhcmFtIHtFbmNvZGluZ30gcmF3VHJlZVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbiAgY29uc3QgcHJlcGFyZSA9IHJhd1RyZWUgPT4ge1xuICAgIGlmIChpc1ByaW1pdGl2ZShyYXdUcmVlKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvKiBBc3NlcnRpb25zIG9mIHRoZSBhYm92ZSB0byBuYXJyb3cgdGhlIHR5cGUuKi9cbiAgICBhc3NlcnQudHlwZW9mKHJhd1RyZWUsICdvYmplY3QnKTtcbiAgICBhc3NlcnQocmF3VHJlZSAhPT0gbnVsbCk7XG4gICAgaWYgKFFDTEFTUyBpbiByYXdUcmVlKSB7XG4gICAgICBjb25zdCBxY2xhc3MgPSByYXdUcmVlW1FDTEFTU107XG4gICAgICB0eXBlb2YgcWNsYXNzID09PSAnc3RyaW5nJyB8fFxuICAgICAgICBGYWlsYGludmFsaWQgcWNsYXNzIHR5cGVvZiAke3EodHlwZW9mIHFjbGFzcyl9YDtcbiAgICAgIGFzc2VydCghaXNBcnJheShyYXdUcmVlKSk7XG4gICAgICBzd2l0Y2ggKHJhd1RyZWVbJ0BxY2xhc3MnXSkge1xuICAgICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgICBjYXNlICdOYU4nOlxuICAgICAgICBjYXNlICdJbmZpbml0eSc6XG4gICAgICAgIGNhc2UgJy1JbmZpbml0eSc6IHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICAgIGNvbnN0IHsgZGlnaXRzIH0gPSByYXdUcmVlO1xuICAgICAgICAgIHR5cGVvZiBkaWdpdHMgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICBGYWlsYGludmFsaWQgZGlnaXRzIHR5cGVvZiAke3EodHlwZW9mIGRpZ2l0cyl9YDtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnQEBhc3luY0l0ZXJhdG9yJzoge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzeW1ib2wnOiB7XG4gICAgICAgICAgY29uc3QgeyBuYW1lIH0gPSByYXdUcmVlO1xuICAgICAgICAgIGFzc2VydC50eXBlb2YobmFtZSwgJ3N0cmluZycpO1xuICAgICAgICAgIGNvbnN0IHN5bSA9IHBhc3NhYmxlU3ltYm9sRm9yTmFtZShuYW1lKTtcbiAgICAgICAgICBhc3NlcnQudHlwZW9mKHN5bSwgJ3N5bWJvbCcpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAgICAgY29uc3QgeyB0YWcsIHBheWxvYWQgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgYXNzZXJ0LnR5cGVvZih0YWcsICdzdHJpbmcnKTtcbiAgICAgICAgICBwcmVwYXJlKHBheWxvYWQpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzbG90Jzoge1xuICAgICAgICAgIGNvbnN0IHsgaW5kZXgsIGlmYWNlIH0gPSByYXdUcmVlO1xuICAgICAgICAgIGFzc2VydC50eXBlb2YoaW5kZXgsICdudW1iZXInKTtcbiAgICAgICAgICBOYXQoaW5kZXgpO1xuICAgICAgICAgIGlmIChpZmFjZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBhc3NlcnQudHlwZW9mKGlmYWNlLCAnc3RyaW5nJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdoaWxiZXJ0Jzoge1xuICAgICAgICAgIGNvbnN0IHsgb3JpZ2luYWwsIHJlc3QgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgJ29yaWdpbmFsJyBpbiByYXdUcmVlIHx8XG4gICAgICAgICAgICBGYWlsYEludmFsaWQgSGlsYmVydCBIb3RlbCBlbmNvZGluZyAke3Jhd1RyZWV9YDtcbiAgICAgICAgICBwcmVwYXJlKG9yaWdpbmFsKTtcbiAgICAgICAgICBpZiAoJ3Jlc3QnIGluIHJhd1RyZWUpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVzdCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgdGhyb3cgRmFpbGBSZXN0ICR7cmVzdH0gZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3RgO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJlc3QgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgdGhyb3cgRmFpbGBSZXN0ICR7cmVzdH0gZW5jb2RpbmcgbXVzdCBub3QgYmUgbnVsbGA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNBcnJheShyZXN0KSkge1xuICAgICAgICAgICAgICB0aHJvdyBGYWlsYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IG5vdCBiZSBhbiBhcnJheWA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoUUNMQVNTIGluIHJlc3QpIHtcbiAgICAgICAgICAgICAgdGhyb3cgRmFpbGBSZXN0IGVuY29kaW5nICR7cmVzdH0gbXVzdCBub3QgY29udGFpbiAke3EoUUNMQVNTKX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbmFtZXMgPSBvd25LZXlzKHJlc3QpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICAgICAgICAgIHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgICAgICAgIEZhaWxgUHJvcGVydHkgbmFtZSAke25hbWV9IG9mICR7cmF3VHJlZX0gbXVzdCBiZSBhIHN0cmluZ2A7XG4gICAgICAgICAgICAgIHByZXBhcmUocmVzdFtuYW1lXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgICAgICBjb25zdCB7IG5hbWUsIG1lc3NhZ2UgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhyb3cgRmFpbGBpbnZhbGlkIGVycm9yIG5hbWUgdHlwZW9mICR7cSh0eXBlb2YgbmFtZSl9YDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZ2V0RXJyb3JDb25zdHJ1Y3RvcihuYW1lKSAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICBGYWlsYE11c3QgYmUgdGhlIG5hbWUgb2YgYW4gRXJyb3IgY29uc3RydWN0b3IgJHtuYW1lfWA7XG4gICAgICAgICAgdHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICAgICBGYWlsYGludmFsaWQgZXJyb3IgbWVzc2FnZSB0eXBlb2YgJHtxKHR5cGVvZiBtZXNzYWdlKX1gO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBhc3NlcnQuZmFpbChYYHVucmVjb2duaXplZCAke3EoUUNMQVNTKX0gJHtxKHFjbGFzcyl9YCwgVHlwZUVycm9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNBcnJheShyYXdUcmVlKSkge1xuICAgICAgY29uc3QgeyBsZW5ndGggfSA9IHJhd1RyZWU7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgICAgIHByZXBhcmUocmF3VHJlZVtpXSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IG5hbWVzID0gb3duS2V5cyhyYXdUcmVlKTtcbiAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgdGhyb3cgRmFpbGBQcm9wZXJ0eSBuYW1lICR7bmFtZX0gb2YgJHtyYXdUcmVlfSBtdXN0IGJlIGEgc3RyaW5nYDtcbiAgICAgICAgfVxuICAgICAgICBwcmVwYXJlKHJhd1RyZWVbbmFtZV0pO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBjb25zdCBtYWtlSW5kZW50ZXIgPSBzaG91bGRJbmRlbnQgPyBtYWtlWWVzSW5kZW50ZXIgOiBtYWtlTm9JbmRlbnRlcjtcbiAgbGV0IG91dCA9IG1ha2VJbmRlbnRlcigpO1xuXG4gIC8qKlxuICogVGhpcyBpcyB0aGUgc2Vjb25kIHBhc3MgcmVjdXJzaW9uIGFmdGVyIHRoZSBmaXJzdCBwYXNzIGBwcmVwYXJlYC5cbiAqIFRoZSBmaXJzdCBwYXNzIGRpZCBzb21lIGlucHV0IHZhbGlkYXRpb24gc29cbiAqIGhlcmUgd2UgY2FuIHNhZmVseSBhc3N1bWUgZXZlcnl0aGluZyB0aG9zZSB0aGluZ3MgYXJlIHZhbGlkYXRlZC5cbiAqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSByYXdUcmVlXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG4gIGNvbnN0IGRlY29kZSA9IHJhd1RyZWUgPT4ge1xuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgcmV0dXJuIHJlY3VyKHJhd1RyZWUpO1xuICB9O1xuXG4gIGNvbnN0IGRlY29kZVByb3BlcnR5ID0gKG5hbWUsIHZhbHVlKSA9PiB7XG4gICAgb3V0LmxpbmUoKTtcbiAgICBpZiAobmFtZSA9PT0gJ19fcHJvdG9fXycpIHtcbiAgICAgIC8qIEphdmFTY3JpcHQgaW50ZXJwcmV0cyBge19fcHJvdG9fXzogeCwgLi4ufWAqL1xuICAgICAgLyogYXMgbWFraW5nIGFuIG9iamVjdCBpbmhlcml0aW5nIGZyb20gYHhgLCB3aGVyZWFzKi9cbiAgICAgIC8qIGluIEpTT04gaXQgaXMgc2ltcGx5IGEgcHJvcGVydHkgbmFtZS4gUHJlc2VydmUgdGhlKi9cbiAgICAgIC8qIEpTT04gbWVhbmluZy4qL1xuICAgICAgb3V0Lm5leHQoYFtcIl9fcHJvdG9fX1wiXTpgKTtcbiAgICB9IGVsc2UgaWYgKGlkZW50UGF0dGVybi50ZXN0KG5hbWUpKSB7XG4gICAgICBvdXQubmV4dChgJHtuYW1lfTpgKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0Lm5leHQoYCR7cXVvdGUobmFtZSl9OmApO1xuICAgIH1cbiAgICBkZWNvZGUodmFsdWUpO1xuICAgIG91dC5uZXh0KCcsJyk7XG4gIH07XG5cbiAgLyoqXG4gKiBNb2RlbGVkIGFmdGVyIGBmdWxsUmV2aXZlYCBpbiBtYXJzaGFsLmpzXG4gKlxuICogQHBhcmFtIHtFbmNvZGluZ30gcmF3VHJlZVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuICBjb25zdCByZWN1ciA9IHJhd1RyZWUgPT4ge1xuICAgIGlmIChpc1ByaW1pdGl2ZShyYXdUcmVlKSkge1xuICAgICAgLyogcHJpbWl0aXZlcyBnZXQgcXVvdGVkKi9cbiAgICAgIHJldHVybiBvdXQubmV4dChxdW90ZShyYXdUcmVlKSk7XG4gICAgfVxuICAgIC8qIEFzc2VydGlvbnMgb2YgdGhlIGFib3ZlIHRvIG5hcnJvdyB0aGUgdHlwZS4qL1xuICAgIGFzc2VydC50eXBlb2YocmF3VHJlZSwgJ29iamVjdCcpO1xuICAgIGFzc2VydChyYXdUcmVlICE9PSBudWxsKTtcbiAgICBpZiAoUUNMQVNTIGluIHJhd1RyZWUpIHtcbiAgICAgIGNvbnN0IHFjbGFzcyA9IHJhd1RyZWVbUUNMQVNTXTtcbiAgICAgIGFzc2VydC50eXBlb2YocWNsYXNzLCAnc3RyaW5nJyk7XG4gICAgICBhc3NlcnQoIWlzQXJyYXkocmF3VHJlZSkpO1xuICAgICAgLyogU3dpdGNoaW5nIG9uIGBlbmNvZGVkW1FDTEFTU11gIChvciBhbnl0aGluZyBsZXNzIGRpcmVjdCwgbGlrZSovXG4gICAgICAvKiBgcWNsYXNzYCkgZG9lcyBub3QgZGlzY3JpbWluYXRlIHJhd1RyZWUgaW4gdHlwZXNjcmlwdEA0LjIuMyBhbmQqL1xuICAgICAgLyogZWFybGllci4qL1xuICAgICAgc3dpdGNoIChyYXdUcmVlWydAcWNsYXNzJ10pIHtcbiAgICAgICAgLyogRW5jb2Rpbmcgb2YgcHJpbWl0aXZlcyBub3QgaGFuZGxlZCBieSBKU09OKi9cbiAgICAgICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgICAgY2FzZSAnTmFOJzpcbiAgICAgICAgY2FzZSAnSW5maW5pdHknOlxuICAgICAgICBjYXNlICctSW5maW5pdHknOiB7XG4gICAgICAgICAgLyogVGhlaXIgcWNsYXNzIGlzIHRoZWlyIGV4cHJlc3Npb24gc291cmNlLiovXG4gICAgICAgICAgcmV0dXJuIG91dC5uZXh0KHFjbGFzcyk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnYmlnaW50Jzoge1xuICAgICAgICAgIGNvbnN0IHsgZGlnaXRzIH0gPSByYXdUcmVlO1xuICAgICAgICAgIGFzc2VydC50eXBlb2YoZGlnaXRzLCAnc3RyaW5nJyk7XG4gICAgICAgICAgcmV0dXJuIG91dC5uZXh0KGAke0JpZ0ludChkaWdpdHMpfW5gKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdAQGFzeW5jSXRlcmF0b3InOiB7XG4gICAgICAgICAgLyogVE9ETyBkZXByZWNhdGVkLiBFdmVudHVhbGx5IHJlbW92ZS4qL1xuICAgICAgICAgIHJldHVybiBvdXQubmV4dCgnU3ltYm9sLmFzeW5jSXRlcmF0b3InKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzeW1ib2wnOiB7XG4gICAgICAgICAgY29uc3QgeyBuYW1lIH0gPSByYXdUcmVlO1xuICAgICAgICAgIGFzc2VydC50eXBlb2YobmFtZSwgJ3N0cmluZycpO1xuICAgICAgICAgIGNvbnN0IHN5bSA9IHBhc3NhYmxlU3ltYm9sRm9yTmFtZShuYW1lKTtcbiAgICAgICAgICBhc3NlcnQudHlwZW9mKHN5bSwgJ3N5bWJvbCcpO1xuICAgICAgICAgIGNvbnN0IHJlZ2lzdGVyZWROYW1lID0gbmFtZUZvclBhc3NhYmxlU3ltYm9sKHN5bSk7XG4gICAgICAgICAgaWYgKHJlZ2lzdGVyZWROYW1lID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gQXRBdFByZWZpeFBhdHRlcm4uZXhlYyhuYW1lKTtcbiAgICAgICAgICAgIGFzc2VydChtYXRjaCAhPT0gbnVsbCk7XG4gICAgICAgICAgICBjb25zdCBzdWZmaXggPSBtYXRjaFsxXTtcbiAgICAgICAgICAgIGFzc2VydChTeW1ib2xbc3VmZml4XSA9PT0gc3ltKTtcbiAgICAgICAgICAgIGFzc2VydChpZGVudFBhdHRlcm4udGVzdChzdWZmaXgpKTtcbiAgICAgICAgICAgIHJldHVybiBvdXQubmV4dChgU3ltYm9sLiR7c3VmZml4fWApO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gb3V0Lm5leHQoYHBhc3NhYmxlU3ltYm9sRm9yTmFtZSgke3F1b3RlKHJlZ2lzdGVyZWROYW1lKX0pYCk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAndGFnZ2VkJzoge1xuICAgICAgICAgIGNvbnN0IHsgdGFnLCBwYXlsb2FkIH0gPSByYXdUcmVlO1xuICAgICAgICAgIG91dC5uZXh0KGBtYWtlVGFnZ2VkKCR7cXVvdGUodGFnKX1gKTtcbiAgICAgICAgICBvdXQubmV4dCgnLCcpO1xuICAgICAgICAgIGRlY29kZShwYXlsb2FkKTtcbiAgICAgICAgICByZXR1cm4gb3V0Lm5leHQoJyknKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNhc2UgJ3Nsb3QnOiB7XG4gICAgICAgICAgY29uc3QgeyBpZmFjZSB9ID0gcmF3VHJlZTtcbiAgICAgICAgICBjb25zdCBpbmRleCA9IE51bWJlcihOYXQocmF3VHJlZS5pbmRleCkpO1xuICAgICAgICAgIGNvbnN0IG5lc3RlZFJlbmRlciA9IGFyZyA9PiB7XG4gICAgICAgICAgICBjb25zdCBvbGRPdXQgPSBvdXQ7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBvdXQgPSBtYWtlTm9JbmRlbnRlcigpO1xuICAgICAgICAgICAgICBkZWNvZGUoYXJnKTtcbiAgICAgICAgICAgICAgcmV0dXJuIG91dC5kb25lKCk7XG4gICAgICAgICAgICB9IGZpbmFsbHkge1xuICAgICAgICAgICAgICBvdXQgPSBvbGRPdXQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAoaW5kZXggPCBzbG90cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlbmRlcmVkU2xvdCA9IG5lc3RlZFJlbmRlcihzbG90c1tpbmRleF0pO1xuICAgICAgICAgICAgcmV0dXJuIGlmYWNlID09PSB1bmRlZmluZWRcbiAgICAgICAgICAgICAgPyBvdXQubmV4dChgc2xvdFRvVmFsKCR7cmVuZGVyZWRTbG90fSlgKVxuICAgICAgICAgICAgICA6IG91dC5uZXh0KGBzbG90VG9WYWwoJHtyZW5kZXJlZFNsb3R9LCR7bmVzdGVkUmVuZGVyKGlmYWNlKX0pYCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBpZmFjZSA9PT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IG91dC5uZXh0KGBzbG90KCR7aW5kZXh9KWApXG4gICAgICAgICAgICA6IG91dC5uZXh0KGBzbG90KCR7aW5kZXh9LCR7bmVzdGVkUmVuZGVyKGlmYWNlKX0pYCk7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlICdoaWxiZXJ0Jzoge1xuICAgICAgICAgIGNvbnN0IHsgb3JpZ2luYWwsIHJlc3QgfSA9IHJhd1RyZWU7XG4gICAgICAgICAgb3V0Lm9wZW4oJ3snKTtcbiAgICAgICAgICBkZWNvZGVQcm9wZXJ0eShRQ0xBU1MsIG9yaWdpbmFsKTtcbiAgICAgICAgICBpZiAoJ3Jlc3QnIGluIHJhd1RyZWUpIHtcbiAgICAgICAgICAgIGFzc2VydC50eXBlb2YocmVzdCwgJ29iamVjdCcpO1xuICAgICAgICAgICAgYXNzZXJ0KHJlc3QgIT09IG51bGwpO1xuICAgICAgICAgICAgY29uc3QgbmFtZXMgPSBvd25LZXlzKHJlc3QpO1xuICAgICAgICAgICAgZm9yIChjb25zdCBuYW1lIG9mIG5hbWVzKSB7XG4gICAgICAgICAgICAgIGlmICh0eXBlb2YgbmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBGYWlsYFByb3BlcnR5IG5hbWUgJHtxKFxuICAgICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICApfSBvZiAke3Jlc3R9IG11c3QgYmUgYSBzdHJpbmdgO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGRlY29kZVByb3BlcnR5KG5hbWUsIHJlc3RbbmFtZV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gb3V0LmNsb3NlKCd9Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgICAgIGNhdXNlID0gdW5kZWZpbmVkLFxuICAgICAgICAgICAgZXJyb3JzID0gdW5kZWZpbmVkLFxuICAgICAgICAgIH0gPSByYXdUcmVlO1xuICAgICAgICAgIGNhdXNlID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgIEZhaWxgZXJyb3IgY2F1c2Ugbm90IHlldCBpbXBsZW1lbnRlZCBpbiBtYXJzaGFsLWp1c3RpbmA7XG4gICAgICAgICAgbmFtZSAhPT0gYEFnZ3JlZ2F0ZUVycm9yYCB8fFxuICAgICAgICAgICAgRmFpbGBBZ2dyZWdhdGVFcnJvciBub3QgeWV0IGltcGxlbWVudGVkIGluIG1hcnNoYWwtanVzdGluYDtcbiAgICAgICAgICBlcnJvcnMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgRmFpbGBlcnJvciBlcnJvcnMgbm90IHlldCBpbXBsZW1lbnRlZCBpbiBtYXJzaGFsLWp1c3RpbmA7XG4gICAgICAgICAgcmV0dXJuIG91dC5uZXh0KGAke25hbWV9KCR7cXVvdGUobWVzc2FnZSl9KWApO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IGFzc2VydC5mYWlsKFxuICAgICAgICAgICAgWGB1bnJlY29nbml6ZWQgJHtxKFFDTEFTUyl9ICR7cShxY2xhc3MpfWAsXG4gICAgICAgICAgICBUeXBlRXJyb3IsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoaXNBcnJheShyYXdUcmVlKSkge1xuICAgICAgY29uc3QgeyBsZW5ndGggfSA9IHJhd1RyZWU7XG4gICAgICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBvdXQubmV4dCgnW10nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dC5vcGVuKCdbJyk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICBvdXQubGluZSgpO1xuICAgICAgICAgIGRlY29kZShyYXdUcmVlW2ldKTtcbiAgICAgICAgICBvdXQubmV4dCgnLCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXQuY2xvc2UoJ10nKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgLyogcmF3VHJlZSBpcyBhbiBgRW5jb2RpbmdSZWNvcmRgIHdoaWNoIG9ubHkgaGFzIHN0cmluZyBrZXlzLCovXG4gICAgICAvKiBidXQgc2luY2Ugb3duS2V5cyBpcyBub3QgZ2VuZXJpYywgaXQgY2FuJ3QgcHJvcGFnYXRlIHRoYXQqL1xuICAgICAgY29uc3QgbmFtZXMgPSAvKiogQHR5cGUge3N0cmluZ1tdfSAqLyAob3duS2V5cyhyYXdUcmVlKSk7XG4gICAgICBpZiAobmFtZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiBvdXQubmV4dCgne30nKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG91dC5vcGVuKCd7Jyk7XG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBvZiBuYW1lcykge1xuICAgICAgICAgIGRlY29kZVByb3BlcnR5KG5hbWUsIHJhd1RyZWVbbmFtZV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvdXQuY2xvc2UoJ30nKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG4gIHByZXBhcmUoZW5jb2RpbmcpO1xuICBkZWNvZGUoZW5jb2RpbmcpO1xuICByZXR1cm4gb3V0LmRvbmUoKTtcbn07JGjNj19vbmNlLmRlY29kZVRvSnVzdGluKGRlY29kZVRvSnVzdGluKTtcbmhhcmRlbihkZWNvZGVUb0p1c3Rpbik7XG5cblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXNzYWJsZVxuICogQHBhcmFtIHtib29sZWFufSBbc2hvdWxkSW5kZW50XVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuICAgICAgIGNvbnN0IHBhc3NhYmxlQXNKdXN0aW4gPSAocGFzc2FibGUsIHNob3VsZEluZGVudCA9IHRydWUpID0+IHtcbiAgbGV0IHNsb3RDb3VudCA9IDA7XG4gIC8qIFVzaW5nIHBvc3QtaW5jcmVtZW50IGJlbG93IG9ubHkgc28gdGhhdCB0aGUgaW5kZXhlcyBzdGFydCBhdCB6ZXJvKi9cbiAgLyogYW5kIHRoZSBgc2xvdENvdW50YCB2YXJpYWJsZSBjYW4gYmUgaW5pdGlhbGl6ZWQgdG8gYDBgIHJhdGhlciB0aGFuKi9cbiAgLyogYC0xYC4qL1xuICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGx1c3BsdXMqL1xuICBjb25zdCBjb252ZXJ0VmFsVG9TbG90ID0gdmFsID0+IGBzJHtzbG90Q291bnQrK31gO1xuICBjb25zdCB7IHRvQ2FwRGF0YSB9ID0gbWFrZU1hcnNoYWwoY29udmVydFZhbFRvU2xvdCk7XG4gIGNvbnN0IHsgYm9keSwgc2xvdHMgfSA9IHRvQ2FwRGF0YShwYXNzYWJsZSk7XG4gIGNvbnN0IGVuY29kZWQgPSBKU09OLnBhcnNlKGJvZHkpO1xuICByZXR1cm4gZGVjb2RlVG9KdXN0aW4oZW5jb2RlZCwgc2hvdWxkSW5kZW50LCBzbG90cyk7XG59OyRozY9fb25jZS5wYXNzYWJsZUFzSnVzdGluKHBhc3NhYmxlQXNKdXN0aW4pO1xuaGFyZGVuKHBhc3NhYmxlQXNKdXN0aW4pO1xuXG4vKiBUaGUgZXhhbXBsZSBiZWxvdyBpcyB0aGUgYHBhdHQxYCB0ZXN0IGNhc2UgZnJvbSBgcXAtb24tcGF0dGVybi50ZXN0LmpzYC4qL1xuLyogUGxlYXNlIGNvLW1haW50YWluIHRoZSBmb2xsb3dpbmcgZG9jLWNvbW1lbnQgYW5kIHRoYXQgdGVzdCBtb2R1bGUuKi9cbi8qKlxuICogYHFwYCBmb3IgcXVvdGUgcGFzc2FibGUgYXMgYSBxdWFzaS1xdW90ZWQgSnVzdGluIGV4cHJlc3Npb24uXG4gKlxuICogQm90aCBgcWAgZnJvbSBgQGVuZG8vZXJyb3JzYCBhbmQgdGhpcyBgcXBgIGZyb20gYEBlbmRvL21hcnNoYWxgIGNhblxuICogYmUgdXNlZCB0b2dldGhlciB3aXRoIGBGYWlsYCwgYFhgLCBldGMgZnJvbSBgQGVuZG8vZXJyb3JzYCB0byBtYXJrXG4gKiBhIHN1YnN0aXR1dGlvbiB2YWx1ZSB0byBiZSBib3RoXG4gKiAtIHZpc3VhbGx5IHF1b3RlZCBpbiBzb21lIHVzZWZ1bCBtYW5uZXJcbiAqIC0gdW5yZWRhY3RlZFxuICpcbiAqIERpZmZlcmVuY2VzOlxuICogLSBnaXZlbiBhIHBhdHRlcm4gYE0uYW5kKE0uZ3RlKC0xMDApLCBNLmx0ZSgxMDApKWAsXG4gKiAgIGBgYGpzXG4gKiAgIGAke3EocGF0dCl9YFxuICogICBgYGBcbiAqICAgcHJvZHVjZXMgYFwiW21hdGNoOmFuZF1cImAsIHdoZXJlYXNcbiAqICAgYGBganNcbiAqICAgYCR7cXAocGF0dCl9YFxuICogICBgYGBcbiAqICAgcHJvZHVjZXMgcXVhc2ktcXVvdGVzIEp1c3RpbiBvZiB3aGF0IHdvdWxkIGJlIHBhc3NlZDpcbiAqICAgYGBganNcbiAqICAgYG1ha2VUYWdnZWQoXCJtYXRjaDphbmRcIiwgW1xuICogICAgIG1ha2VUYWdnZWQoXCJtYXRjaDpndGVcIiwgLTEwMCksXG4gKiAgICAgbWFrZVRhZ2dlZChcIm1hdGNoOmx0ZVwiLCAxMDApLFxuICogICBdKWBcbiAqICAgYGBgXG4gKiAtIGBxYCBpcyBsYXp5LCBtaW5pbWl6aW5nIHRoZSBjb3N0IGZvciB1c2luZyBpdCBpbiBhbiBlcnJvciB0aGF0J3MgbmV2ZXJcbiAqICAgbG9nZ2VkLiBVbmZvcnR1bmF0ZWx5LCBkdWUgdG8gbGF5ZXJpbmcgY29uc3RyYWludHMsIGBxcGAgaXMgbm90XG4gKiAgIGxhenksIGFsd2F5cyByZW5kZXJpbmcgdG8gcXVhc2ktcXVvdGVkIEp1c3RpbiBpbW1lZGlhdGVseS5cbiAqXG4gKiBTaW5jZSBKdXN0aW4gaXMgYSBzdWJzZXQgb2YgSGFyZGVuZWRKUywgbmVpdGhlciB0aGUgbmFtZSBgcXBgIG5vciB0aGVcbiAqIHJlbmRlcmVkIGZvcm0gbmVlZCB0byBtYWtlIGNsZWFyIHRoYXQgdGhlIHJlbmRlcmVkIGZvcm0gaXMgaW4gSnVzdGluIHJhdGhlclxuICogdGhhbiBIYXJkZW5lZEpTLlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBheWxvYWRcbiAqIEByZXR1cm5zIHtTdHJpbmdhYmxlUGF5bG9hZH1cbiAqL1xuICAgICAgIGNvbnN0IHFwID0gcGF5bG9hZCA9PiBgXFxgJHtwYXNzYWJsZUFzSnVzdGluKGhhcmRlbihwYXlsb2FkKSwgdHJ1ZSl9XFxgYDskaM2PX29uY2UucXAocXApO1xuaGFyZGVuKHFwKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlY29kZVRvSnVzdGluIjpbImRlY29kZVRvSnVzdGluIl0sInBhc3NhYmxlQXNKdXN0aW4iOlsicGFzc2FibGVBc0p1c3RpbiJdLCJxcCI6WyJxcCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACrcYH4oQkAAKEJAAAtAAAAQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIi4vbWFyc2hhbC5qcyJdLCJleHBvcnRzIjpbInBhcnNlIiwic3RyaW5naWZ5Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxtYWtlTWFyc2hhbDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL21hcnNoYWwuanNcIiwgW1tcIm1ha2VNYXJzaGFsXCIsWyRozY9fYSA9PiAobWFrZU1hcnNoYWwgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG4vKiogQGltcG9ydCB7UGFzc2FibGV9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnICovXG5cbmNvbnN0IHsgZnJlZXplIH0gPSBPYmplY3Q7XG5cbi8qKiBAdHlwZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuQ29udmVydFZhbFRvU2xvdDxhbnk+fSAqL1xuY29uc3QgZG9Ob3RDb252ZXJ0VmFsVG9TbG90ID0gdmFsID0+XG4gIEZhaWxgTWFyc2hhbCdzIHN0cmluZ2lmeSByZWplY3RzIHByZXNlbmNlcyBhbmQgcHJvbWlzZXMgJHt2YWx9YDtcblxuLyoqIEB0eXBlIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Db252ZXJ0U2xvdFRvVmFsPGFueT59ICovXG5jb25zdCBkb05vdENvbnZlcnRTbG90VG9WYWwgPSAoc2xvdCwgX2lmYWNlKSA9PlxuICBGYWlsYE1hcnNoYWwncyBwYXJzZSBtdXN0IG5vdCBlbmNvZGUgYW55IHNsb3RzICR7c2xvdH1gO1xuXG5jb25zdCBiYWRBcnJheUhhbmRsZXIgPSBoYXJkZW4oe1xuICBnZXQ6IChfdGFyZ2V0LCBuYW1lLCBfcmVjZWl2ZXIpID0+IHtcbiAgICBpZiAobmFtZSA9PT0gJ2xlbmd0aCcpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cbiAgICAvKiBgdGhyb3dgIGlzIG5vb3Agc2luY2UgYEZhaWxgIHRocm93cy4gQnV0IGxpbnRlciBjb25mdXNlZCovXG4gICAgdGhyb3cgRmFpbGBNYXJzaGFsJ3MgcGFyc2UgbXVzdCBub3QgZW5jb2RlIGFueSBzbG90IHBvc2l0aW9ucyAke25hbWV9YDtcbiAgfSxcbn0pO1xuXG4vKipcbiAqIGBmcmVlemVgIGJ1dCBub3QgYGhhcmRlbmAgdGhlIHByb3h5IHRhcmdldCBzbyBpdCByZW1haW5zIHRyYXBwaW5nLlxuICogVGh1cywgaXQgc2hvdWxkIG5vdCBiZSBzaGFyZWQgb3V0c2lkZSB0aGlzIG1vZHVsZS5cbiAqXG4gKiBAc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9ibG9iL21hc3Rlci9wYWNrYWdlcy9zZXMvZG9jcy9wcmVwYXJpbmctZm9yLXN0YWJpbGl6ZS5tZFxuICovXG5jb25zdCBhcnJheVRhcmdldCA9IGZyZWV6ZSgvKiogQHR5cGUge2FueVtdfSAqLyAoW10pKTtcbmNvbnN0IGJhZEFycmF5ID0gbmV3IFByb3h5KGFycmF5VGFyZ2V0LCBiYWRBcnJheUhhbmRsZXIpO1xuXG5jb25zdCB7IHNlcmlhbGl6ZSwgdW5zZXJpYWxpemUgfSA9IG1ha2VNYXJzaGFsKFxuICBkb05vdENvbnZlcnRWYWxUb1Nsb3QsXG4gIGRvTm90Q29udmVydFNsb3RUb1ZhbCxcbiAge1xuICAgIGVycm9yVGFnZ2luZzogJ29mZicsXG4gICAgLyogVE9ETyBmaXggdGVzdHMgdG8gd29ya3Mgd2l0aCBzbWFsbGNhcHMuKi9cbiAgICBzZXJpYWxpemVCb2R5Rm9ybWF0OiAnY2FwZGF0YScsXG4gIH0sXG4pO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3Qgc3RyaW5naWZ5ID0gdmFsID0+IHNlcmlhbGl6ZSh2YWwpLmJvZHk7JGjNj19vbmNlLnN0cmluZ2lmeShzdHJpbmdpZnkpO1xuaGFyZGVuKHN0cmluZ2lmeSk7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICogQHJldHVybnMge1Bhc3NhYmxlfVxuICovXG5jb25zdCBwYXJzZSA9IHN0ciA9PlxuICB1bnNlcmlhbGl6ZShcbiAgICAvKiBgZnJlZXplYCBidXQgbm90IGBoYXJkZW5gIHNpbmNlIHRoZSBgYmFkQXJyYXlgIHByb3h5IGFuZCBpdHMgdGFyZ2V0Ki9cbiAgICAvKiBtdXN0IHJlbWFpbiB0cmFwcGluZy4qL1xuICAgIC8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vYmxvYi9tYXN0ZXIvcGFja2FnZXMvc2VzL2RvY3MvcHJlcGFyaW5nLWZvci1zdGFiaWxpemUubWQqL1xuICAgIGZyZWV6ZSh7XG4gICAgICBib2R5OiBzdHIsXG4gICAgICBzbG90czogYmFkQXJyYXksXG4gICAgfSksXG4gICk7JGjNj19vbmNlLnBhcnNlKHBhcnNlKTtcbmhhcmRlbihwYXJzZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzdHJpbmdpZnkiOlsic3RyaW5naWZ5Il0sInBhcnNlIjpbInBhcnNlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGVYhbV8PwAAfD8AACMAAABAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvbWFyc2hhbC5qc3siaW1wb3J0cyI6WyJAZW5kby9uYXQiLCJAZW5kby9wYXNzLXN0eWxlIiwiQGVuZG8vZXJyb3JzIiwiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiLCIuL2VuY29kZVRvQ2FwRGF0YS5qcyIsIi4vZW5jb2RlVG9TbWFsbGNhcHMuanMiXSwiZXhwb3J0cyI6WyJtYWtlTWFyc2hhbCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IE5hdCxhc3NlcnRQYXNzYWJsZSxnZXRJbnRlcmZhY2VPZixnZXRFcnJvckNvbnN0cnVjdG9yLHRvUGFzc2FibGVFcnJvcixYLEZhaWwscSxtYWtlRXJyb3IsYW5ub3RhdGVFcnJvcixvYmplY3RNYXAsUUNMQVNTLG1ha2VFbmNvZGVUb0NhcERhdGEsbWFrZURlY29kZUZyb21DYXBEYXRhLG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzLG1ha2VFbmNvZGVUb1NtYWxsY2FwczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsWyRozY9fYSA9PiAoTmF0ID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiYXNzZXJ0UGFzc2FibGVcIixbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRozY9fYSldXSxbXCJnZXRJbnRlcmZhY2VPZlwiLFskaM2PX2EgPT4gKGdldEludGVyZmFjZU9mID0gJGjNj19hKV1dLFtcImdldEVycm9yQ29uc3RydWN0b3JcIixbJGjNj19hID0+IChnZXRFcnJvckNvbnN0cnVjdG9yID0gJGjNj19hKV1dLFtcInRvUGFzc2FibGVFcnJvclwiLFskaM2PX2EgPT4gKHRvUGFzc2FibGVFcnJvciA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wibWFrZUVycm9yXCIsWyRozY9fYSA9PiAobWFrZUVycm9yID0gJGjNj19hKV1dLFtcImFubm90YXRlRXJyb3JcIixbJGjNj19hID0+IChhbm5vdGF0ZUVycm9yID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanNcIiwgW1tcIm9iamVjdE1hcFwiLFskaM2PX2EgPT4gKG9iamVjdE1hcCA9ICRozY9fYSldXV1dLFtcIi4vZW5jb2RlVG9DYXBEYXRhLmpzXCIsIFtbXCJRQ0xBU1NcIixbJGjNj19hID0+IChRQ0xBU1MgPSAkaM2PX2EpXV0sW1wibWFrZUVuY29kZVRvQ2FwRGF0YVwiLFskaM2PX2EgPT4gKG1ha2VFbmNvZGVUb0NhcERhdGEgPSAkaM2PX2EpXV0sW1wibWFrZURlY29kZUZyb21DYXBEYXRhXCIsWyRozY9fYSA9PiAobWFrZURlY29kZUZyb21DYXBEYXRhID0gJGjNj19hKV1dXV0sW1wiLi9lbmNvZGVUb1NtYWxsY2Fwcy5qc1wiLCBbW1wibWFrZURlY29kZUZyb21TbWFsbGNhcHNcIixbJGjNj19hID0+IChtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyA9ICRozY9fYSldXSxbXCJtYWtlRW5jb2RlVG9TbWFsbGNhcHNcIixbJGjNj19hID0+IChtYWtlRW5jb2RlVG9TbWFsbGNhcHMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtDb252ZXJ0U2xvdFRvVmFsLCBDb252ZXJ0VmFsVG9TbG90LCBGcm9tQ2FwRGF0YSwgTWFrZU1hcnNoYWxPcHRpb25zLCBUb0NhcERhdGF9IGZyb20gJy4vdHlwZXMuanMnO1xuICogQGltcG9ydCB7UGFzc2FibGUsIFBhc3NhYmxlQ2FwLCBSZW1vdGFibGVPYmplY3R9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnO1xuICogQGltcG9ydCB7SW50ZXJmYWNlU3BlY30gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSc7XG4gKiBAaW1wb3J0IHtFbmNvZGluZ30gZnJvbSAnLi90eXBlcy5qcyc7XG4gKi9cblxuY29uc3QgeyBkZWZpbmVQcm9wZXJ0aWVzLCBoYXNPd24gfSA9IE9iamVjdDtcbmNvbnN0IHsgaXNBcnJheSB9ID0gQXJyYXk7XG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5cbi8qKiBAdHlwZSB7Q29udmVydFZhbFRvU2xvdDxhbnk+fSAqL1xuY29uc3QgZGVmYXVsdFZhbFRvU2xvdEZuID0geCA9PiB4O1xuLyoqIEB0eXBlIHtDb252ZXJ0U2xvdFRvVmFsPGFueT59ICovXG5jb25zdCBkZWZhdWx0U2xvdFRvVmFsRm4gPSAoeCwgXykgPT4geDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgU2xvdFxuICogQHBhcmFtIHtDb252ZXJ0VmFsVG9TbG90PFNsb3Q+fSBbY29udmVydFZhbFRvU2xvdF1cbiAqIEBwYXJhbSB7Q29udmVydFNsb3RUb1ZhbDxTbG90Pn0gW2NvbnZlcnRTbG90VG9WYWxdXG4gKiBAcGFyYW0ge01ha2VNYXJzaGFsT3B0aW9uc30gb3B0aW9uc1xuICovXG4gICAgICAgY29uc3QgbWFrZU1hcnNoYWwgPSAoXG4gIGNvbnZlcnRWYWxUb1Nsb3QgPSBkZWZhdWx0VmFsVG9TbG90Rm4sXG4gIGNvbnZlcnRTbG90VG9WYWwgPSBkZWZhdWx0U2xvdFRvVmFsRm4sXG4gIHtcbiAgICBlcnJvclRhZ2dpbmcgPSAnb24nLFxuICAgIG1hcnNoYWxOYW1lID0gJ2Fub24tbWFyc2hhbCcsXG4gICAgLyogVE9ETyBUZW1wb3JhcnkgaGFjay4qL1xuICAgIC8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzI3ODAqL1xuICAgIGVycm9ySWROdW0gPSAxMDAwMCxcbiAgICAvKiBXZSBwcmVmZXIgdGhhdCB0aGUgY2FsbGVyIGluc3RlYWQgbG9nIHRvIHNvbWV3aGVyZSBoaWRkZW4qL1xuICAgIC8qIHRvIGJlIHJldmVhbGVkIHdoZW4gY29ycmVsYXRpbmcgd2l0aCB0aGUgcmVjZWl2ZWQgZXJyb3IuKi9cbiAgICBtYXJzaGFsU2F2ZUVycm9yID0gZXJyID0+XG4gICAgICBjb25zb2xlLmxvZygnVGVtcG9yYXJ5IGxvZ2dpbmcgb2Ygc2VudCBlcnJvcicsIGVyciksXG4gICAgLyogRGVmYXVsdCB0byAnY2FwZGF0YScgYmVjYXVzZSBpdCB3YXMgaW1wbGVtZW50ZWQgZmlyc3QuKi9cbiAgICAvKiBTb21ldGltZXMsIG9udG9nZW55IGRvZXMgcmVjYXBpdHVsYXRlIHBoeWxvZ2VueSA7KSovXG4gICAgc2VyaWFsaXplQm9keUZvcm1hdCA9ICdjYXBkYXRhJyxcbiAgfSA9IHt9LFxuKSA9PiB7XG4gIGFzc2VydC50eXBlb2YobWFyc2hhbE5hbWUsICdzdHJpbmcnKTtcbiAgZXJyb3JUYWdnaW5nID09PSAnb24nIHx8XG4gICAgZXJyb3JUYWdnaW5nID09PSAnb2ZmJyB8fFxuICAgIEZhaWxgVGhlIGVycm9yVGFnZ2luZyBvcHRpb24gY2FuIG9ubHkgYmUgXCJvblwiIG9yIFwib2ZmXCIgJHtlcnJvclRhZ2dpbmd9YDtcbiAgY29uc3QgbmV4dEVycm9ySWQgPSAoKSA9PiB7XG4gICAgZXJyb3JJZE51bSArPSAxO1xuICAgIHJldHVybiBgZXJyb3I6JHttYXJzaGFsTmFtZX0jJHtlcnJvcklkTnVtfWA7XG4gIH07XG5cbiAgLyoqXG4gKiBAdHlwZSB7VG9DYXBEYXRhPFNsb3Q+fVxuICovXG4gIGNvbnN0IHRvQ2FwRGF0YSA9IHJvb3QgPT4ge1xuICAgIGNvbnN0IHNsb3RzID0gW107XG4gICAgLyogbWFwcyB2YWwgKHByb21pc2Ugb3IgcmVtb3RhYmxlKSB0byBpbmRleCBvZiBzbG90c1tdKi9cbiAgICBjb25zdCBzbG90TWFwID0gbmV3IE1hcCgpO1xuXG4gICAgLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlQ2FwfSBwYXNzYWJsZVxuICogQHJldHVybnMge3tpbmRleDogbnVtYmVyLCByZXBlYXQ6IGJvb2xlYW59fVxuICovXG4gICAgY29uc3QgZW5jb2RlU2xvdENvbW1vbiA9IHBhc3NhYmxlID0+IHtcbiAgICAgIGxldCBpbmRleCA9IHNsb3RNYXAuZ2V0KHBhc3NhYmxlKTtcbiAgICAgIGlmIChpbmRleCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8qIFRPRE8gYXNzZXJ0IHRoYXQgaXQncyB0aGUgc2FtZSBpZmFjZSBhcyBiZWZvcmUqL1xuICAgICAgICBhc3NlcnQudHlwZW9mKGluZGV4LCAnbnVtYmVyJyk7XG4gICAgICAgIHJldHVybiBoYXJkZW4oeyBpbmRleCwgcmVwZWF0OiB0cnVlIH0pO1xuICAgICAgfVxuXG4gICAgICBpbmRleCA9IHNsb3RzLmxlbmd0aDtcbiAgICAgIGNvbnN0IHNsb3QgPSBjb252ZXJ0VmFsVG9TbG90KHBhc3NhYmxlKTtcbiAgICAgIHNsb3RzLnB1c2goc2xvdCk7XG4gICAgICBzbG90TWFwLnNldChwYXNzYWJsZSwgaW5kZXgpO1xuICAgICAgcmV0dXJuIGhhcmRlbih7IGluZGV4LCByZXBlYXQ6IGZhbHNlIH0pO1xuICAgIH07XG5cbiAgICAvKipcbiAqIEV2ZW4gaWYgYW4gRXJyb3IgaXMgbm90IGFjdHVhbGx5IHBhc3NhYmxlLCB3ZSdkIHJhdGhlciBzZW5kXG4gKiBpdCBhbnl3YXkgYmVjYXVzZSB0aGUgZGlhZ25vc3RpYyBpbmZvIGNhcnJpZWQgYnkgdGhlIGVycm9yXG4gKiBpcyBtb3JlIHZhbHVhYmxlIHRoYW4gZGlhZ25vc2luZyB3aHkgdGhlIGVycm9yIGlzbid0XG4gKiBwYXNzYWJsZS4gU2VlIGNvbW1lbnRzIGluIGlzRXJyb3JMaWtlLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVyclxuICogQHBhcmFtIHsocDogUGFzc2FibGUpID0+IHVua25vd259IGVuY29kZVJlY3VyXG4gKiBAcmV0dXJucyB7e2Vycm9ySWQ/OiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZywgbmFtZTogc3RyaW5nfX1cbiAqL1xuICAgIGNvbnN0IGVuY29kZUVycm9yQ29tbW9uID0gKGVyciwgZW5jb2RlUmVjdXIpID0+IHtcbiAgICAgIGNvbnN0IG1lc3NhZ2UgPSBlbmNvZGVSZWN1cihgJHtlcnIubWVzc2FnZX1gKTtcbiAgICAgIGFzc2VydC50eXBlb2YobWVzc2FnZSwgJ3N0cmluZycpO1xuICAgICAgY29uc3QgbmFtZSA9IGVuY29kZVJlY3VyKGAke2Vyci5uYW1lfWApO1xuICAgICAgYXNzZXJ0LnR5cGVvZihuYW1lLCAnc3RyaW5nJyk7XG4gICAgICAvKiBUT0RPIE11c3QgZW5jb2RlIGBjYXVzZWAsIGBlcnJvcnNgLCBidXQqL1xuICAgICAgLyogb25seSBvbmNlIGFsbCBwb3NzaWJsZSBjb3VudGVycGFydHkgZGVjb2RlcnMgYXJlIHRvbGVyYW50IG9mKi9cbiAgICAgIC8qIHJlY2VpdmluZyB0aGVtLiovXG4gICAgICBpZiAoZXJyb3JUYWdnaW5nID09PSAnb24nKSB7XG4gICAgICAgIC8qIFdlIGRlbGliZXJhdGVseSBkbyBub3Qgc2hhcmUgdGhlIHN0YWNrLCBidXQgaXQgd291bGQqL1xuICAgICAgICAvKiBiZSB1c2VmdWwgdG8gbG9nIHRoZSBzdGFjayBsb2NhbGx5IHNvIHNvbWVvbmUgd2hvIGhhcyovXG4gICAgICAgIC8qIHByaXZpbGVnZWQgYWNjZXNzIHRvIHRoZSB0aHJvd2luZyBWYXQgY2FuIGNvcnJlbGF0ZSovXG4gICAgICAgIC8qIHRoZSBwcm9ibGVtIHdpdGggdGhlIHJlbW90ZSBWYXQgdGhhdCBnZXRzIHRoaXMqL1xuICAgICAgICAvKiBzdW1tYXJ5LiBJZiB3ZSBkbyB0aGF0LCB3ZSBjb3VsZCBhbGxvY2F0ZSBzb21lIHJhbmRvbSovXG4gICAgICAgIC8qIGlkZW50aWZpZXIgYW5kIGluY2x1ZGUgaXQgaW4gdGhlIG1lc3NhZ2UsIHRvIGhlbHAqL1xuICAgICAgICAvKiB3aXRoIHRoZSBjb3JyZWxhdGlvbi4qL1xuICAgICAgICBjb25zdCBlcnJvcklkID0gZW5jb2RlUmVjdXIobmV4dEVycm9ySWQoKSk7XG4gICAgICAgIGFzc2VydC50eXBlb2YoZXJyb3JJZCwgJ3N0cmluZycpO1xuICAgICAgICBhbm5vdGF0ZUVycm9yKGVyciwgWGBTZW50IGFzICR7ZXJyb3JJZH1gKTtcbiAgICAgICAgbWFyc2hhbFNhdmVFcnJvcihlcnIpO1xuICAgICAgICByZXR1cm4gaGFyZGVuKHsgZXJyb3JJZCwgbWVzc2FnZSwgbmFtZSB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBoYXJkZW4oeyBtZXNzYWdlLCBuYW1lIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBpZiAoc2VyaWFsaXplQm9keUZvcm1hdCA9PT0gJ2NhcGRhdGEnKSB7XG4gICAgICAvKipcbiAqIEBwYXJhbSB7UGFzc2FibGVDYXB9IHBhc3NhYmxlXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IFtpZmFjZV1cbiAqIEByZXR1cm5zIHtFbmNvZGluZ31cbiAqL1xuICAgICAgY29uc3QgZW5jb2RlU2xvdFRvQ2FwRGF0YSA9IChwYXNzYWJsZSwgaWZhY2UgPSB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgY29uc3QgeyBpbmRleCwgcmVwZWF0IH0gPSBlbmNvZGVTbG90Q29tbW9uKHBhc3NhYmxlKTtcblxuICAgICAgICBpZiAocmVwZWF0ID09PSB0cnVlIHx8IGlmYWNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgW1FDTEFTU106ICdzbG90JywgaW5kZXggfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIGhhcmRlbih7IFtRQ0xBU1NdOiAnc2xvdCcsIGlmYWNlLCBpbmRleCB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgLyoqIEB0eXBlIHsocHJvbWlzZTogUmVtb3RhYmxlT2JqZWN0LCBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZykgPT4gRW5jb2Rpbmd9ICovXG4gICAgICBjb25zdCBlbmNvZGVSZW1vdGFibGVUb0NhcERhdGEgPSAodmFsLCBfZW5jb2RlUmVjdXIpID0+XG4gICAgICAgIGVuY29kZVNsb3RUb0NhcERhdGEodmFsLCBnZXRJbnRlcmZhY2VPZih2YWwpKTtcblxuICAgICAgLyoqIEB0eXBlIHsocHJvbWlzZTogUHJvbWlzZSwgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gRW5jb2RpbmcpID0+IEVuY29kaW5nfSAqL1xuICAgICAgY29uc3QgZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YSA9IChwcm9taXNlLCBfZW5jb2RlUmVjdXIpID0+XG4gICAgICAgIGVuY29kZVNsb3RUb0NhcERhdGEocHJvbWlzZSk7XG5cbiAgICAgIC8qKlxuICogRXZlbiBpZiBhbiBFcnJvciBpcyBub3QgYWN0dWFsbHkgcGFzc2FibGUsIHdlJ2QgcmF0aGVyIHNlbmRcbiAqIGl0IGFueXdheSBiZWNhdXNlIHRoZSBkaWFnbm9zdGljIGluZm8gY2FycmllZCBieSB0aGUgZXJyb3JcbiAqIGlzIG1vcmUgdmFsdWFibGUgdGhhbiBkaWFnbm9zaW5nIHdoeSB0aGUgZXJyb3IgaXNuJ3RcbiAqIHBhc3NhYmxlLiBTZWUgY29tbWVudHMgaW4gaXNFcnJvckxpa2UuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcGFyYW0geyhwOiBQYXNzYWJsZSkgPT4gRW5jb2Rpbmd9IGVuY29kZVJlY3VyXG4gKiBAcmV0dXJucyB7RW5jb2Rpbmd9XG4gKi9cbiAgICAgIGNvbnN0IGVuY29kZUVycm9yVG9DYXBEYXRhID0gKGVyciwgZW5jb2RlUmVjdXIpID0+IHtcbiAgICAgICAgY29uc3QgZXJyRGF0YSA9IGVuY29kZUVycm9yQ29tbW9uKGVyciwgZW5jb2RlUmVjdXIpO1xuICAgICAgICByZXR1cm4gaGFyZGVuKHsgW1FDTEFTU106ICdlcnJvcicsIC4uLmVyckRhdGEgfSk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBlbmNvZGVUb0NhcERhdGEgPSBtYWtlRW5jb2RlVG9DYXBEYXRhKHtcbiAgICAgICAgZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhLFxuICAgICAgICBlbmNvZGVQcm9taXNlVG9DYXBEYXRhLFxuICAgICAgICBlbmNvZGVFcnJvclRvQ2FwRGF0YSxcbiAgICAgIH0pO1xuXG4gICAgICBjb25zdCBlbmNvZGVkID0gZW5jb2RlVG9DYXBEYXRhKHJvb3QpO1xuICAgICAgY29uc3QgYm9keSA9IEpTT04uc3RyaW5naWZ5KGVuY29kZWQpO1xuICAgICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICAgIGJvZHksXG4gICAgICAgIHNsb3RzLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmIChzZXJpYWxpemVCb2R5Rm9ybWF0ID09PSAnc21hbGxjYXBzJykge1xuICAgICAgLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4XG4gKiBAcGFyYW0ge1Bhc3NhYmxlQ2FwfSBwYXNzYWJsZVxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBbaWZhY2VdXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG4gICAgICBjb25zdCBlbmNvZGVTbG90VG9TbWFsbGNhcHMgPSAocHJlZml4LCBwYXNzYWJsZSwgaWZhY2UgPSB1bmRlZmluZWQpID0+IHtcbiAgICAgICAgY29uc3QgeyBpbmRleCwgcmVwZWF0IH0gPSBlbmNvZGVTbG90Q29tbW9uKHBhc3NhYmxlKTtcblxuICAgICAgICAvKiBUT0RPIGV4cGxvcmUgcmVtb3ZpbmcgdGhpcyBzcGVjaWFsIGNhc2UqL1xuICAgICAgICBpZiAocmVwZWF0ID09PSB0cnVlIHx8IGlmYWNlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gYCR7cHJlZml4fSR7aW5kZXh9YDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYCR7cHJlZml4fSR7aW5kZXh9LiR7aWZhY2V9YDtcbiAgICAgIH07XG5cbiAgICAgIGNvbnN0IGVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzID0gKHJlbW90YWJsZSwgX2VuY29kZVJlY3VyKSA9PlxuICAgICAgICBlbmNvZGVTbG90VG9TbWFsbGNhcHMoJyQnLCByZW1vdGFibGUsIGdldEludGVyZmFjZU9mKHJlbW90YWJsZSkpO1xuXG4gICAgICBjb25zdCBlbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMgPSAocHJvbWlzZSwgX2VuY29kZVJlY3VyKSA9PlxuICAgICAgICBlbmNvZGVTbG90VG9TbWFsbGNhcHMoJyYnLCBwcm9taXNlKTtcblxuICAgICAgY29uc3QgZW5jb2RlRXJyb3JUb1NtYWxsY2FwcyA9IChlcnIsIGVuY29kZVJlY3VyKSA9PiB7XG4gICAgICAgIGNvbnN0IGVyckRhdGEgPSBlbmNvZGVFcnJvckNvbW1vbihlcnIsIGVuY29kZVJlY3VyKTtcbiAgICAgICAgY29uc3QgeyBtZXNzYWdlLCAuLi5yZXN0IH0gPSBlcnJEYXRhO1xuICAgICAgICByZXR1cm4gaGFyZGVuKHsgJyNlcnJvcic6IG1lc3NhZ2UsIC4uLnJlc3QgfSk7XG4gICAgICB9O1xuXG4gICAgICBjb25zdCBlbmNvZGVUb1NtYWxsY2FwcyA9IG1ha2VFbmNvZGVUb1NtYWxsY2Fwcyh7XG4gICAgICAgIGVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzLFxuICAgICAgICBlbmNvZGVQcm9taXNlVG9TbWFsbGNhcHMsXG4gICAgICAgIGVuY29kZUVycm9yVG9TbWFsbGNhcHMsXG4gICAgICB9KTtcblxuICAgICAgY29uc3QgZW5jb2RlZCA9IGVuY29kZVRvU21hbGxjYXBzKHJvb3QpO1xuICAgICAgY29uc3Qgc21hbGxjYXBzQm9keSA9IEpTT04uc3RyaW5naWZ5KGVuY29kZWQpO1xuICAgICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICAgIC8qIFZhbGlkIEpTT04gY2Fubm90IGJlZ2luIHdpdGggYSAnIycsIHNvIHRoaXMgaXMgYSB2YWxpZCBzaWduYWwqL1xuICAgICAgICAvKiBpbmRpY2F0aW5nIHNtYWxsY2FwcyBmb3JtYXQuKi9cbiAgICAgICAgYm9keTogYCMke3NtYWxsY2Fwc0JvZHl9YCxcbiAgICAgICAgc2xvdHMsXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLyogVGhlIGB0aHJvd2AgaXMgYSBub29wIHNpbmNlIGBGYWlsYCB0aHJvd3MuIEFkZGVkIGZvciBjb25mdXNlZCBsaW50ZXJzLiovXG4gICAgICB0aHJvdyBGYWlsYFVucmVjb2duaXplZCBzZXJpYWxpemVCb2R5Rm9ybWF0OiAke3Eoc2VyaWFsaXplQm9keUZvcm1hdCl9YDtcbiAgICB9XG4gIH07XG5cbiAgY29uc3QgbWFrZUZ1bGxSZXZpdmUgPSBzbG90cyA9PiB7XG4gICAgLyoqIEB0eXBlIHtNYXA8bnVtYmVyLCBSZW1vdGFibGVPYmplY3QgfCBQcm9taXNlPn0gKi9cbiAgICBjb25zdCB2YWxNYXAgPSBuZXcgTWFwKCk7XG5cbiAgICAvKipcbiAqIEBwYXJhbSB7e2lmYWNlPzogc3RyaW5nLCBpbmRleDogbnVtYmVyfX0gc2xvdERhdGFcbiAqIEByZXR1cm5zIHtSZW1vdGFibGVPYmplY3QgfCBQcm9taXNlfVxuICovXG4gICAgY29uc3QgZGVjb2RlU2xvdENvbW1vbiA9IHNsb3REYXRhID0+IHtcbiAgICAgIGNvbnN0IHsgaWZhY2UgPSB1bmRlZmluZWQsIGluZGV4LCAuLi5yZXN0IH0gPSBzbG90RGF0YTtcbiAgICAgIG93bktleXMocmVzdCkubGVuZ3RoID09PSAwIHx8XG4gICAgICAgIEZhaWxgdW5leHBlY3RlZCBlbmNvZGVkIHNsb3QgcHJvcGVydGllcyAke3Eob3duS2V5cyhyZXN0KSl9YDtcbiAgICAgIGNvbnN0IGV4dGFudCA9IHZhbE1hcC5nZXQoaW5kZXgpO1xuICAgICAgaWYgKGV4dGFudCkge1xuICAgICAgICByZXR1cm4gZXh0YW50O1xuICAgICAgfVxuICAgICAgLyogVE9ETyBTRUNVUklUWSBIQVpBUkQ6IG11c3QgZW5mb2NlIHRoYXQgcmVtb3RhYmxlIHZzIHByb21pc2UqL1xuICAgICAgLyogaXMgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGVkIHN0cmluZy4qL1xuICAgICAgY29uc3Qgc2xvdCA9IHNsb3RzW051bWJlcihOYXQoaW5kZXgpKV07XG4gICAgICBjb25zdCB2YWwgPSBjb252ZXJ0U2xvdFRvVmFsKHNsb3QsIGlmYWNlKTtcbiAgICAgIHZhbE1hcC5zZXQoaW5kZXgsIHZhbCk7XG4gICAgICByZXR1cm4gdmFsO1xuICAgIH07XG5cbiAgICAvKipcbiAqIEBwYXJhbSB7e1xuICogICBlcnJvcklkPzogc3RyaW5nLFxuICogICBtZXNzYWdlOiBzdHJpbmcsXG4gKiAgIG5hbWU6IHN0cmluZyxcbiAqICAgY2F1c2U6IHVua25vd24sXG4gKiAgIGVycm9yczogdW5rbm93bixcbiAqIH19IGVyckRhdGFcbiAqIEBwYXJhbSB7KGU6IHVua25vd24pID0+IFBhc3NhYmxlfSBkZWNvZGVSZWN1clxuICogQHJldHVybnMge0Vycm9yfVxuICovXG4gICAgY29uc3QgZGVjb2RlRXJyb3JDb21tb24gPSAoZXJyRGF0YSwgZGVjb2RlUmVjdXIpID0+IHtcbiAgICAgIGNvbnN0IHtcbiAgICAgICAgZXJyb3JJZCA9IHVuZGVmaW5lZCxcbiAgICAgICAgbWVzc2FnZSxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgY2F1c2UgPSB1bmRlZmluZWQsXG4gICAgICAgIGVycm9ycyA9IHVuZGVmaW5lZCxcbiAgICAgICAgLi4ucmVzdFxuICAgICAgfSA9IGVyckRhdGE7XG4gICAgICAvKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMjA1MiovXG4gICAgICAvKiBjYXBEYXRhIGRvZXMgbm90IHRyYW5zZm9ybSBzdHJpbmdzLiBUaGUgaW1tZWRpYXRlbHkgZm9sbG93aW5nIGNhbGxzKi9cbiAgICAgIC8qIHRvIGBkZWNvZGVSZWN1cmAgYXJlIGZvciByZXVzZSBieSBvdGhlciBlbmNvZGluZ3MgdGhhdCBkbywqL1xuICAgICAgLyogc3VjaCBhcyBzbWFsbGNhcHMuKi9cbiAgICAgIGNvbnN0IGROYW1lID0gZGVjb2RlUmVjdXIobmFtZSk7XG4gICAgICBjb25zdCBkTWVzc2FnZSA9IGRlY29kZVJlY3VyKG1lc3NhZ2UpO1xuICAgICAgLyogZXJyb3JJZCBpcyBhIGxhdGUgYWRkaXRpb24gc28gYmUgdG9sZXJhbnQgb2YgaXRzIGFic2VuY2UuKi9cbiAgICAgIGNvbnN0IGRFcnJvcklkID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChlcnJvcklkICYmIGRlY29kZVJlY3VyKGVycm9ySWQpKTtcbiAgICAgIGlmICh0eXBlb2YgZE5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRocm93IEZhaWxgaW52YWxpZCBlcnJvciBuYW1lIHR5cGVvZiAke3EodHlwZW9mIGROYW1lKX1gO1xuICAgICAgfVxuICAgICAgaWYgKHR5cGVvZiBkTWVzc2FnZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgRmFpbGBpbnZhbGlkIGVycm9yIG1lc3NhZ2UgdHlwZW9mICR7cSh0eXBlb2YgZE1lc3NhZ2UpfWA7XG4gICAgICB9XG4gICAgICBjb25zdCBlcnJDb25zdHJ1Y3RvciA9IGdldEVycm9yQ29uc3RydWN0b3IoZE5hbWUpIHx8IEVycm9yO1xuICAgICAgY29uc3QgZXJyb3JOYW1lID1cbiAgICAgICAgZEVycm9ySWQgPT09IHVuZGVmaW5lZFxuICAgICAgICAgID8gYFJlbW90ZSR7ZXJyQ29uc3RydWN0b3IubmFtZX1gXG4gICAgICAgICAgOiBgUmVtb3RlJHtlcnJDb25zdHJ1Y3Rvci5uYW1lfSgke2RFcnJvcklkfSlgO1xuICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgZXJyb3JOYW1lLFxuICAgICAgICBzYW5pdGl6ZTogZmFsc2UsXG4gICAgICB9O1xuICAgICAgaWYgKGNhdXNlKSB7XG4gICAgICAgIG9wdGlvbnMuY2F1c2UgPSBkZWNvZGVSZWN1cihjYXVzZSk7XG4gICAgICB9XG4gICAgICBpZiAoZXJyb3JzKSB7XG4gICAgICAgIG9wdGlvbnMuZXJyb3JzID0gZGVjb2RlUmVjdXIoZXJyb3JzKTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHJhd0Vycm9yID0gbWFrZUVycm9yKGRNZXNzYWdlLCBlcnJDb25zdHJ1Y3Rvciwgb3B0aW9ucyk7XG4gICAgICAvKiBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBkZWNvZGVSZWN1ciByZXN0J3MgcHJvcGVydHkgbmFtZXMuKi9cbiAgICAgIC8qIFRoaXMgd291bGQgYmUgaW5jb25zaXN0ZW50IHdpdGggc21hbGxjYXBzJyBleHBlY3RlZCBoYW5kbGluZywqL1xuICAgICAgLyogYnV0IGlzIGZpbmUgaGVyZSBzaW5jZSBpdCBpcyBvbmx5IHVzZWQgZm9yIGBhbm5vdGF0ZUVycm9yYCwqL1xuICAgICAgLyogd2hpY2ggaXMgZm9yIGRpYWdub3N0aWMgaW5mbyB0aGF0IGlzIG90aGVyd2lzZSB1bm9ic2VydmFibGUuKi9cbiAgICAgIGNvbnN0IGRlc2NzID0gb2JqZWN0TWFwKHJlc3QsIGRhdGEgPT4gKHtcbiAgICAgICAgdmFsdWU6IGRlY29kZVJlY3VyKGRhdGEpLFxuICAgICAgICB3cml0YWJsZTogZmFsc2UsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICBjb25maWd1cmFibGU6IGZhbHNlLFxuICAgICAgfSkpO1xuICAgICAgZGVmaW5lUHJvcGVydGllcyhyYXdFcnJvciwgZGVzY3MpO1xuICAgICAgaGFyZGVuKHJhd0Vycm9yKTtcbiAgICAgIHJldHVybiB0b1Bhc3NhYmxlRXJyb3IocmF3RXJyb3IpO1xuICAgIH07XG5cbiAgICAvKiBUaGUgY3VycmVudCBlbmNvZGluZyBkb2VzIG5vdCBnaXZlIHRoZSBkZWNvZGVyIGVub3VnaCBpbnRvIHRvIGRpc3Rpbmd1aXNoKi9cbiAgICAvKiB3aGV0aGVyIGEgc2xvdCByZXByZXNlbnRzIGEgcHJvbWlzZSBvciBhIHJlbW90YWJsZS4gQXMgYW4gaW1wbGVtZW50YXRpb24qL1xuICAgIC8qIHJlc3RyaWN0aW9uIHVudGlsIHRoaXMgaXMgZml4ZWQsIGlmIGVpdGhlciBpcyBwcm92aWRlZCwgYm90aCBtdXN0IGJlKi9cbiAgICAvKiBwcm92aWRlZCBhbmQgdGhleSBtdXN0IGJlIHRoZSBzYW1lLiovXG4gICAgLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDMzNCovXG4gICAgY29uc3QgZGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEgPSAocmF3VHJlZSwgX2RlY29kZVJlY3VyKSA9PiB7XG4gICAgICBjb25zdCB7IFtRQ0xBU1NdOiBfLCAuLi5zbG90RGF0YSB9ID0gcmF3VHJlZTtcbiAgICAgIHJldHVybiBkZWNvZGVTbG90Q29tbW9uKHNsb3REYXRhKTtcbiAgICB9O1xuXG4gICAgY29uc3QgZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YSA9IChyYXdUcmVlLCBkZWNvZGVSZWN1cikgPT4ge1xuICAgICAgY29uc3QgeyBbUUNMQVNTXTogXywgLi4uZXJyRGF0YSB9ID0gcmF3VHJlZTtcbiAgICAgIHJldHVybiBkZWNvZGVFcnJvckNvbW1vbihlcnJEYXRhLCBkZWNvZGVSZWN1cik7XG4gICAgfTtcblxuICAgIGNvbnN0IHJldml2ZUZyb21DYXBEYXRhID0gbWFrZURlY29kZUZyb21DYXBEYXRhKHtcbiAgICAgIGRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhOiBkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbiAgICAgIGRlY29kZVByb21pc2VGcm9tQ2FwRGF0YTogZGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG4gICAgICBkZWNvZGVFcnJvckZyb21DYXBEYXRhLFxuICAgIH0pO1xuXG4gICAgY29uc3QgbWFrZURlY29kZVNsb3RGcm9tU21hbGxjYXBzID0gcHJlZml4ID0+IHtcbiAgICAgIC8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZ0VuY29kaW5nXG4gKiBAcGFyYW0geyhlOiB1bmtub3duKSA9PiBQYXNzYWJsZX0gX2RlY29kZVJlY3VyXG4gKiBAcmV0dXJucyB7UmVtb3RhYmxlT2JqZWN0IHwgUHJvbWlzZX1cbiAqL1xuICAgICAgcmV0dXJuIChzdHJpbmdFbmNvZGluZywgX2RlY29kZVJlY3VyKSA9PiB7XG4gICAgICAgIGFzc2VydChzdHJpbmdFbmNvZGluZy5jaGFyQXQoMCkgPT09IHByZWZpeCk7XG4gICAgICAgIC8qIHNsb3RzOiAkc2xvdEluZGV4LmlmYWNlIG9yICRzbG90SW5kZXgqL1xuICAgICAgICBjb25zdCBpID0gc3RyaW5nRW5jb2RpbmcuaW5kZXhPZignLicpO1xuICAgICAgICBjb25zdCBpbmRleCA9IE51bWJlcihzdHJpbmdFbmNvZGluZy5zbGljZSgxLCBpIDwgMCA/IHVuZGVmaW5lZCA6IGkpKTtcbiAgICAgICAgLyogaSA8IDAgbWVhbnMgdGhlcmUgd2FzIG5vIGlmYWNlIGluY2x1ZGVkLiovXG4gICAgICAgIGNvbnN0IGlmYWNlID0gaSA8IDAgPyB1bmRlZmluZWQgOiBzdHJpbmdFbmNvZGluZy5zbGljZShpICsgMSk7XG4gICAgICAgIHJldHVybiBkZWNvZGVTbG90Q29tbW9uKHsgaWZhY2UsIGluZGV4IH0pO1xuICAgICAgfTtcbiAgICB9O1xuICAgIGNvbnN0IGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMgPSBtYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHMoJyQnKTtcbiAgICBjb25zdCBkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyA9IG1ha2VEZWNvZGVTbG90RnJvbVNtYWxsY2FwcygnJicpO1xuXG4gICAgY29uc3QgZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzID0gKGVuY29kaW5nLCBkZWNvZGVSZWN1cikgPT4ge1xuICAgICAgY29uc3QgeyAnI2Vycm9yJzogbWVzc2FnZSwgLi4ucmVzdEVyckRhdGEgfSA9IGVuY29kaW5nO1xuICAgICAgIWhhc093bihyZXN0RXJyRGF0YSwgJ21lc3NhZ2UnKSB8fFxuICAgICAgICBGYWlsYHVuZXhwZWN0ZWQgZW5jb2RlZCBlcnJvciBwcm9wZXJ0eSAke3EoJ21lc3NhZ2UnKX1gO1xuICAgICAgcmV0dXJuIGRlY29kZUVycm9yQ29tbW9uKHsgbWVzc2FnZSwgLi4ucmVzdEVyckRhdGEgfSwgZGVjb2RlUmVjdXIpO1xuICAgIH07XG5cbiAgICBjb25zdCByZXZpdmVGcm9tU21hbGxjYXBzID0gbWFrZURlY29kZUZyb21TbWFsbGNhcHMoe1xuICAgICAgLyogQHRzLWlnbm9yZSBYWFggU21hbGxDYXBzRW5jb2RpbmcqL1xuICAgICAgZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2FwcyxcbiAgICAgIC8qIEB0cy1pZ25vcmUgWFhYIFNtYWxsQ2Fwc0VuY29kaW5nKi9cbiAgICAgIGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzLFxuICAgICAgZGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIGhhcmRlbih7IHJldml2ZUZyb21DYXBEYXRhLCByZXZpdmVGcm9tU21hbGxjYXBzIH0pO1xuICB9O1xuXG4gIC8qKlxuICogQHR5cGUge0Zyb21DYXBEYXRhPFNsb3Q+fVxuICovXG4gIGNvbnN0IGZyb21DYXBEYXRhID0gZGF0YSA9PiB7XG4gICAgY29uc3QgeyBib2R5LCBzbG90cyB9ID0gZGF0YTtcbiAgICB0eXBlb2YgYm9keSA9PT0gJ3N0cmluZycgfHxcbiAgICAgIEZhaWxgdW5zZXJpYWxpemUoKSBnaXZlbiBub24tY2FwZGF0YSAoLmJvZHkgaXMgJHtib2R5fSwgbm90IHN0cmluZylgO1xuICAgIGlzQXJyYXkoZGF0YS5zbG90cykgfHxcbiAgICAgIEZhaWxgdW5zZXJpYWxpemUoKSBnaXZlbiBub24tY2FwZGF0YSAoLnNsb3RzIGFyZSBub3QgQXJyYXkpYDtcbiAgICBjb25zdCB7IHJldml2ZUZyb21DYXBEYXRhLCByZXZpdmVGcm9tU21hbGxjYXBzIH0gPSBtYWtlRnVsbFJldml2ZShzbG90cyk7XG4gICAgbGV0IHJlc3VsdDtcbiAgICAvKiBKU09OIGNhbm5vdCBiZWdpbiB3aXRoIGEgJyMnLCBzbyB0aGlzIGlzIGFuIHVuYW1iaWd1b3VzIHNpZ25hbC4qL1xuICAgIGlmIChib2R5LmNoYXJBdCgwKSA9PT0gJyMnKSB7XG4gICAgICBjb25zdCBzbWFsbGNhcHNCb2R5ID0gYm9keS5zbGljZSgxKTtcbiAgICAgIGNvbnN0IGVuY29kaW5nID0gaGFyZGVuKEpTT04ucGFyc2Uoc21hbGxjYXBzQm9keSkpO1xuICAgICAgcmVzdWx0ID0gaGFyZGVuKHJldml2ZUZyb21TbWFsbGNhcHMoZW5jb2RpbmcpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29uc3QgcmF3VHJlZSA9IGhhcmRlbihKU09OLnBhcnNlKGJvZHkpKTtcbiAgICAgIHJlc3VsdCA9IGhhcmRlbihyZXZpdmVGcm9tQ2FwRGF0YShyYXdUcmVlKSk7XG4gICAgfVxuICAgIC8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQzMzcqL1xuICAgIC8qIHdoaWNoIHNob3VsZCBiZSBjb25zaWRlcmVkIGZpeGVkIG9uY2Ugd2UndmUgY29tcGxldGVkIHRoZSBzd2l0Y2gqL1xuICAgIC8qIHRvIHNtYWxsY2Fwcy4qL1xuICAgIGFzc2VydFBhc3NhYmxlKHJlc3VsdCk7XG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7UGFzc2FibGVDYXB9ICovIChyZXN1bHQpO1xuICB9O1xuXG4gIHJldHVybiBoYXJkZW4oe1xuICAgIHRvQ2FwRGF0YSxcbiAgICBmcm9tQ2FwRGF0YSxcblxuICAgIC8qIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSovXG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSB0b0NhcERhdGEgKi9cbiAgICBzZXJpYWxpemU6IHRvQ2FwRGF0YSxcbiAgICAvKiogQGRlcHJlY2F0ZWQgdXNlIGZyb21DYXBEYXRhICovXG4gICAgdW5zZXJpYWxpemU6IGZyb21DYXBEYXRhLFxuICB9KTtcbn07JGjNj19vbmNlLm1ha2VNYXJzaGFsKG1ha2VNYXJzaGFsKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VNYXJzaGFsIjpbIm1ha2VNYXJzaGFsIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIGivjHoWQAA6FkAACUAAABAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvcmFua09yZGVyLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vudi1vcHRpb25zIiwiQGVuZG8vZXJyb3JzIiwiQGVuZG8vcGFzcy1zdHlsZSIsIi4vZW5jb2RlUGFzc2FibGUuanMiXSwiZXhwb3J0cyI6WyJGdWxsUmFua0NvdmVyIiwiYXNzZXJ0UmFua1NvcnRlZCIsImNvbXBhcmF0b3JNaXJyb3JJbWFnZSIsImNvbXBhcmVBbnRpUmFuayIsImNvbXBhcmVCeUNvZGVQb2ludHMiLCJjb21wYXJlTnVtZXJpY3MiLCJjb21wYXJlUmFuayIsImNvdmVyZWRFbnRyaWVzIiwiZ2V0SW5kZXhDb3ZlciIsImdldFBhc3NTdHlsZUNvdmVyIiwiaW50ZXJzZWN0UmFua0NvdmVycyIsImlzUmFua1NvcnRlZCIsIm1ha2VDb21wYXJhdG9yS2l0IiwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiLCJzb3J0QnlSYW5rIiwidW5pb25SYW5rQ292ZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgZ2V0ZW52LEZhaWwscSxnZXRUYWcscGFzc1N0eWxlT2YsbmFtZUZvclBhc3NhYmxlU3ltYm9sLHBhc3NTdHlsZVByZWZpeGVzLHJlY29yZE5hbWVzLHJlY29yZFZhbHVlczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vudi1vcHRpb25zXCIsIFtbXCJnZXRFbnZpcm9ubWVudE9wdGlvblwiLFskaM2PX2EgPT4gKGdldGVudiA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIixbJGjNj19hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaM2PX2EpXV1dXSxbXCIuL2VuY29kZVBhc3NhYmxlLmpzXCIsIFtbXCJwYXNzU3R5bGVQcmVmaXhlc1wiLFskaM2PX2EgPT4gKHBhc3NTdHlsZVByZWZpeGVzID0gJGjNj19hKV1dLFtcInJlY29yZE5hbWVzXCIsWyRozY9fYSA9PiAocmVjb3JkTmFtZXMgPSAkaM2PX2EpXV0sW1wicmVjb3JkVmFsdWVzXCIsWyRozY9fYSA9PiAocmVjb3JkVmFsdWVzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1Bhc3NhYmxlLCBQYXNzU3R5bGV9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnXG4gKiBAaW1wb3J0IHtGdWxsQ29tcGFyZSwgUGFydGlhbENvbXBhcmUsIFBhcnRpYWxDb21wYXJpc29uLCBSYW5rQ29tcGFyZSwgUmFua0NvbXBhcmlzb24sIFJhbmtDb3Zlcn0gZnJvbSAnLi90eXBlcy5qcydcbiAqL1xuXG5jb25zdCB7IGlzTmFOOiBOdW1iZXJJc05hTiB9ID0gTnVtYmVyO1xuY29uc3QgeyBlbnRyaWVzLCBmcm9tRW50cmllcywgc2V0UHJvdG90eXBlT2YsIGlzIH0gPSBPYmplY3Q7XG5cbmNvbnN0IEVORE9fUkFOS19TVFJJTkdTID0gZ2V0ZW52KCdFTkRPX1JBTktfU1RSSU5HUycsICd1dGYxNi1jb2RlLXVuaXQtb3JkZXInLCBbXG4gICd1bmljb2RlLWNvZGUtcG9pbnQtb3JkZXInLFxuICAnZXJyb3ItaWYtb3JkZXItY2hvaWNlLW1hdHRlcnMnLFxuXSk7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUmFua0NvbXBhcmF0b3JLaXRcbiAqIEBwcm9wZXJ0eSB7UmFua0NvbXBhcmV9IGNvbXBhcmF0b3JcbiAqIEBwcm9wZXJ0eSB7UmFua0NvbXBhcmV9IGFudGlDb21wYXJhdG9yXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGdWxsQ29tcGFyYXRvcktpdFxuICogQHByb3BlcnR5IHtGdWxsQ29tcGFyZX0gY29tcGFyYXRvclxuICogQHByb3BlcnR5IHtGdWxsQ29tcGFyZX0gYW50aUNvbXBhcmF0b3JcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtbbnVtYmVyLCBudW1iZXJdfSBJbmRleENvdmVyXG4gKi9cblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBlcXVhbGl0eSBjb21wYXJpc29uIHVzZWQgYnkgSmF2YVNjcmlwdCdzIE1hcCBhbmQgU2V0XG4gKiBhYnN0cmFjdGlvbnMsIHdoZXJlIE5hTiBpcyB0aGUgc2FtZSBhcyBOYU4gYW5kIC0wIGlzIHRoZSBzYW1lIGFzXG4gKiAwLiBNYXJzaGFsIHNlcmlhbGl6ZXMgLTAgYXMgemVybywgc28gdGhlIHNlbWFudGljcyBvZiBvdXIgZGlzdHJpYnV0ZWRcbiAqIG9iamVjdCBzeXN0ZW0gZG9lcyBub3QgZGlzdGluZ3Vpc2ggMCBmcm9tIC0wLlxuICpcbiAqIGBzYW1lVmFsdWVaZXJvYCBpcyB0aGUgRWNtYVNjcmlwdCBzcGVjIG5hbWUgZm9yIHRoaXMgZXF1YWxpdHkgY29tcGFyaXNvbixcbiAqIGJ1dCBUT0RPIHdlIG5lZWQgYSBiZXR0ZXIgbmFtZSBmb3IgdGhlIEFQSS5cbiAqXG4gKiBAcGFyYW0ge2FueX0geFxuICogQHBhcmFtIHthbnl9IHlcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBzYW1lVmFsdWVaZXJvID0gKHgsIHkpID0+IHggPT09IHkgfHwgaXMoeCwgeSk7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IGxlZnRcbiAqIEBwYXJhbSB7YW55fSByaWdodFxuICogQHJldHVybnMge1JhbmtDb21wYXJpc29ufVxuICovXG5jb25zdCB0cml2aWFsQ29tcGFyYXRvciA9IChsZWZ0LCByaWdodCkgPT5cbiAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5lc3RlZC10ZXJuYXJ5LCBAZW5kby9yZXN0cmljdC1jb21wYXJpc29uLW9wZXJhbmRzKi9cbiAgbGVmdCA8IHJpZ2h0ID8gLTEgOiBsZWZ0ID09PSByaWdodCA/IDAgOiAxO1xuaGFyZGVuKHRyaXZpYWxDb21wYXJhdG9yKTtcblxuLyogQXBwYXJlbnRseSBlc2xpbnQgY29uZnVzZWQgYWJvdXQgd2hldGhlciB0aGUgZnVuY3Rpb24gY2FuIGV2ZXIgZXhpdCovXG4vKiB3aXRob3V0IGFuIGV4cGxpY2l0IHJldHVybi4qL1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGpzZG9jL3JlcXVpcmUtcmV0dXJucy1jaGVjayovXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBsZWZ0XG4gKiBAcGFyYW0ge3N0cmluZ30gcmlnaHRcbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyaXNvbn1cbiAqL1xuICAgICAgIGNvbnN0IGNvbXBhcmVCeUNvZGVQb2ludHMgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgY29uc3QgbGVmdEl0ZXIgPSBsZWZ0W1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgY29uc3QgcmlnaHRJdGVyID0gcmlnaHRbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICBmb3IgKDs7KSB7XG4gICAgY29uc3QgeyB2YWx1ZTogbGVmdENoYXIgfSA9IGxlZnRJdGVyLm5leHQoKTtcbiAgICBjb25zdCB7IHZhbHVlOiByaWdodENoYXIgfSA9IHJpZ2h0SXRlci5uZXh0KCk7XG4gICAgaWYgKGxlZnRDaGFyID09PSB1bmRlZmluZWQgJiYgcmlnaHRDaGFyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH0gZWxzZSBpZiAobGVmdENoYXIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLyogbGVmdCBpcyBhIHByZWZpeCBvZiByaWdodC4qL1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH0gZWxzZSBpZiAocmlnaHRDaGFyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIC8qIHJpZ2h0IGlzIGEgcHJlZml4IG9mIGxlZnQuKi9cbiAgICAgIHJldHVybiAxO1xuICAgIH1cbiAgICBjb25zdCBsZWZ0Q29kZXBvaW50ID0gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChsZWZ0Q2hhci5jb2RlUG9pbnRBdCgwKSk7XG4gICAgY29uc3QgcmlnaHRDb2RlcG9pbnQgPSAvKiogQHR5cGUge251bWJlcn0gKi8gKHJpZ2h0Q2hhci5jb2RlUG9pbnRBdCgwKSk7XG4gICAgaWYgKGxlZnRDb2RlcG9pbnQgPCByaWdodENvZGVwb2ludCkgcmV0dXJuIC0xO1xuICAgIGlmIChsZWZ0Q29kZXBvaW50ID4gcmlnaHRDb2RlcG9pbnQpIHJldHVybiAxO1xuICB9XG59OyRozY9fb25jZS5jb21wYXJlQnlDb2RlUG9pbnRzKGNvbXBhcmVCeUNvZGVQb2ludHMpO1xuaGFyZGVuKGNvbXBhcmVCeUNvZGVQb2ludHMpO1xuXG4vKipcbiAqIENvbXBhcmUgdHdvIHNhbWUtdHlwZSBudW1lcmljIHZhbHVlcywgcmV0dXJuaW5nIHJlc3VsdHMgY29uc2lzdGVudCB3aXRoXG4gKiBgY29tcGFyZVJhbmtgJ3MgXCJyYW5rIG9yZGVyXCIgKGkuZS4sIHRyZWF0aW5nIGJvdGggcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHplcm9cbiAqIGFzIGVxdWFsIGFuZCBwbGFjaW5nIE5hTiBhcyBzZWxmLWVxdWFsIGFmdGVyIGFsbCBvdGhlciBudW1iZXJzKS5cbiAqXG4gKiBAdGVtcGxhdGUge251bWJlciB8IGJpZ2ludH0gVFxuICogQHBhcmFtIHtUfSBsZWZ0XG4gKiBAcGFyYW0ge1R9IHJpZ2h0XG4gKiBAcmV0dXJucyB7UmFua0NvbXBhcmlzb259XG4gKi9cbiAgICAgICBjb25zdCBjb21wYXJlTnVtZXJpY3MgPSAobGVmdCwgcmlnaHQpID0+IHtcbiAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBlbmRvL3Jlc3RyaWN0LWNvbXBhcmlzb24tb3BlcmFuZHMqL1xuICBpZiAobGVmdCA8IHJpZ2h0KSByZXR1cm4gLTE7XG4gIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAZW5kby9yZXN0cmljdC1jb21wYXJpc29uLW9wZXJhbmRzKi9cbiAgaWYgKGxlZnQgPiByaWdodCkgcmV0dXJuIDE7XG4gIGlmIChOdW1iZXJJc05hTihsZWZ0KSA9PT0gTnVtYmVySXNOYU4ocmlnaHQpKSByZXR1cm4gMDtcbiAgaWYgKE51bWJlcklzTmFOKHJpZ2h0KSkgcmV0dXJuIC0xO1xuICBhc3NlcnQoTnVtYmVySXNOYU4obGVmdCkpO1xuICByZXR1cm4gMTtcbn07XG5cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxQYXNzU3R5bGUsIHsgaW5kZXg6IG51bWJlciwgY292ZXI6IFJhbmtDb3ZlciB9Pn0gUGFzc1N0eWxlUmFua3NSZWNvcmRcbiAqLyRozY9fb25jZS5jb21wYXJlTnVtZXJpY3MoY29tcGFyZU51bWVyaWNzKTtcblxuY29uc3QgcGFzc1N0eWxlUmFua3MgPSAvKiogQHR5cGUge1Bhc3NTdHlsZVJhbmtzUmVjb3JkfSAqLyAoXG4gIGZyb21FbnRyaWVzKFxuICAgIGVudHJpZXMocGFzc1N0eWxlUHJlZml4ZXMpXG4gICAgICAvKiBTb3J0IGVudHJpZXMgYnkgYXNjZW5kaW5nIHByZWZpeCwgYXNzdW1pbmcgdGhhdCBhbGwgcHJlZml4ZXMgYXJlKi9cbiAgICAgIC8qIGxpbWl0ZWQgdG8gdGhlIEJhc2ljIE11bHRpbGluZ3VhbCBQbGFuZSAoVSswMDAwIHRocm91Z2ggVStGRkZGKSBhbmQqL1xuICAgICAgLyogdGh1cyBjb250YWluIG9ubHkgY29kZSB1bml0cyB0aGF0IGFyZSBlcXVpdmFsZW50IHRvIGNvZGUgcG9pbnRzLiovXG4gICAgICAvKiBJbiBwcmFjdGljZSwgdGhleSBhcmUgZW50aXJlbHkgcHJpbnRhYmxlIEFTQ0lJKi9cbiAgICAgIC8qICgweDIwIFNQQUNFIHRocm91Z2ggMHg3RSBUSUxERSkuKi9cbiAgICAgIC5zb3J0KChbX2xlZnRTdHlsZSwgbGVmdFByZWZpeGVzXSwgW19yaWdodFN0eWxlLCByaWdodFByZWZpeGVzXSkgPT4ge1xuICAgICAgICByZXR1cm4gdHJpdmlhbENvbXBhcmF0b3IobGVmdFByZWZpeGVzLCByaWdodFByZWZpeGVzKTtcbiAgICAgIH0pXG4gICAgICAubWFwKChbcGFzc1N0eWxlLCBwcmVmaXhlc10sIGluZGV4KSA9PiB7XG4gICAgICAgIC8qIFZlcmlmeSB0aGF0IGBwcmVmaXhlc2AgaXMgc29ydGVkLCBhbmQgY292ZXIgYWxsIHN0cmluZ3MgdGhhdCBzdGFydCovXG4gICAgICAgIC8qIHdpdGggYW55IG9mIGl0cyBjaGFyYWN0ZXJzLCBpLmUuKi9cbiAgICAgICAgLyogYWxsIHMgc3VjaCB0aGF0IHByZWZpeGVzLmF0KDApIOKJpCBzIDwgc3VjY2Vzc29yKHByZWZpeGVzLmF0KC0xKSkuKi9cbiAgICAgICAgcHJlZml4ZXMgPT09IHByZWZpeGVzLnNwbGl0KCcnKS5zb3J0KCkuam9pbignJykgfHxcbiAgICAgICAgICBGYWlsYHVuc29ydGVkIHByZWZpeGVzIGZvciBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9OiAke3EocHJlZml4ZXMpfWA7XG4gICAgICAgIGNvbnN0IGNvdmVyID0gW1xuICAgICAgICAgIHByZWZpeGVzLmNoYXJBdCgwKSxcbiAgICAgICAgICBTdHJpbmcuZnJvbUNoYXJDb2RlKHByZWZpeGVzLmNoYXJDb2RlQXQocHJlZml4ZXMubGVuZ3RoIC0gMSkgKyAxKSxcbiAgICAgICAgXTtcbiAgICAgICAgcmV0dXJuIFtwYXNzU3R5bGUsIHsgaW5kZXgsIGNvdmVyIH1dO1xuICAgICAgfSksXG4gIClcbik7XG5zZXRQcm90b3R5cGVPZihwYXNzU3R5bGVSYW5rcywgbnVsbCk7XG5oYXJkZW4ocGFzc1N0eWxlUmFua3MpO1xuXG4vKipcbiAqIEFzc29jaWF0ZSB3aXRoIGVhY2ggcGFzc1N0eWxlIGEgUmFua0NvdmVyIHRoYXQgbWF5IGJlIGFuIG92ZXJlc3RpbWF0ZSxcbiAqIGFuZCB3aG9zZSByZXN1bHRzIHRoZXJlZm9yZSBuZWVkIHRvIGJlIGZpbHRlcmVkIGRvd24uIEZvciBleGFtcGxlLCBiZWNhdXNlXG4gKiB0aGVyZSBpcyBub3QgYSBzbWFsbGVzdCBvciBiaWdnZXN0IGJpZ2ludCwgYm91bmQgaXQgYnkgYE5hTmAgKHRoZSBsYXN0IHBsYWNlXG4gKiBudW1iZXIpIGFuZCBgJydgICh0aGUgZW1wdHkgc3RyaW5nLCB3aGljaCBpcyB0aGUgZmlyc3QgcGxhY2Ugc3RyaW5nKS4gVGh1cyxcbiAqIGEgcmFuZ2UgcXVlcnkgdXNpbmcgdGhpcyByYW5nZSBtYXkgaW5jbHVkZSB0aGVzZSB2YWx1ZXMsIHdoaWNoIHdvdWxkIHRoZW5cbiAqIG5lZWQgdG8gYmUgZmlsdGVyZWQgb3V0LlxuICpcbiAqIEBwYXJhbSB7UGFzc1N0eWxlfSBwYXNzU3R5bGVcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbiAgICAgICBjb25zdCBnZXRQYXNzU3R5bGVDb3ZlciA9IHBhc3NTdHlsZSA9PiBwYXNzU3R5bGVSYW5rc1twYXNzU3R5bGVdLmNvdmVyOyRozY9fb25jZS5nZXRQYXNzU3R5bGVDb3ZlcihnZXRQYXNzU3R5bGVDb3Zlcik7XG5oYXJkZW4oZ2V0UGFzc1N0eWxlQ292ZXIpO1xuXG4vKipcbiAqIEB0eXBlIHtXZWFrTWFwPFJhbmtDb21wYXJlLFdlYWtTZXQ8UGFzc2FibGVbXT4+fVxuICovXG5jb25zdCBtZW1vT2ZTb3J0ZWQgPSBuZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEB0eXBlIHtXZWFrTWFwPFJhbmtDb21wYXJlLFJhbmtDb21wYXJlPn1cbiAqL1xuY29uc3QgY29tcGFyYXRvck1pcnJvckltYWdlcyA9IG5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXJ0aWFsQ29tcGFyZX0gW2NvbXBhcmVSZW1vdGFibGVzXVxuICogQSBjb21wYXJhdG9yIGZvciBhc3NpZ25pbmcgYW4gaW50ZXJuYWwgb3JkZXIgdG8gcmVtb3RhYmxlcy5cbiAqIEl0IGRlZmF1bHRzIHRvIGEgZnVuY3Rpb24gdGhhdCBhbHdheXMgcmV0dXJucyBgTmFOYCwgbWVhbmluZyB0aGF0IGFsbFxuICogcmVtb3RhYmxlcyBhcmUgaW5jb21wYXJhYmxlIGFuZCBzaG91bGQgdGllIGZvciB0aGUgc2FtZSByYW5rIGJ5XG4gKiBzaG9ydC1jaXJjdWl0aW5nIHdpdGhvdXQgZnVydGhlciByZWZpbmVtZW50IChlLmcuLCBub3Qgb25seSBhcmUgYHIxYCBhbmQgYHIyYFxuICogdGllZCwgYnV0IHNvIGFyZSBgW3IxLCAwXWAgYW5kIGBbcjIsIFwieFwiXWApLlxuICogQHJldHVybnMge1JhbmtDb21wYXJhdG9yS2l0fVxuICovXG4gICAgICAgY29uc3QgbWFrZUNvbXBhcmF0b3JLaXQgPSAoY29tcGFyZVJlbW90YWJsZXMgPSAoX3gsIF95KSA9PiBOYU4pID0+IHtcbiAgLyoqIEB0eXBlIHtQYXJ0aWFsQ29tcGFyZX0gKi9cbiAgY29uc3QgY29tcGFyYXRvciA9IChsZWZ0LCByaWdodCkgPT4ge1xuICAgIGlmIChzYW1lVmFsdWVaZXJvKGxlZnQsIHJpZ2h0KSkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuICAgIGNvbnN0IGxlZnRTdHlsZSA9IHBhc3NTdHlsZU9mKGxlZnQpO1xuICAgIGNvbnN0IHJpZ2h0U3R5bGUgPSBwYXNzU3R5bGVPZihyaWdodCk7XG4gICAgaWYgKGxlZnRTdHlsZSAhPT0gcmlnaHRTdHlsZSkge1xuICAgICAgcmV0dXJuIGNvbXBhcmVOdW1lcmljcyhcbiAgICAgICAgcGFzc1N0eWxlUmFua3NbbGVmdFN0eWxlXS5pbmRleCxcbiAgICAgICAgcGFzc1N0eWxlUmFua3NbcmlnaHRTdHlsZV0uaW5kZXgsXG4gICAgICApO1xuICAgIH1cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBAZW5kby9yZXN0cmljdC1jb21wYXJpc29uLW9wZXJhbmRzIC0tXG4gKiBXZSBrbm93IGBsZWZ0YCBhbmQgYHJpZ2h0YCBhcmUgY29tcGFyYWJsZS5cbiAqL1xuICAgIHN3aXRjaCAobGVmdFN0eWxlKSB7XG4gICAgICBjYXNlICdyZW1vdGFibGUnOiB7XG4gICAgICAgIHJldHVybiBjb21wYXJlUmVtb3RhYmxlcyhsZWZ0LCByaWdodCk7XG4gICAgICB9XG4gICAgICBjYXNlICd1bmRlZmluZWQnOlxuICAgICAgY2FzZSAnbnVsbCc6XG4gICAgICBjYXNlICdlcnJvcic6XG4gICAgICBjYXNlICdwcm9taXNlJzoge1xuICAgICAgICAvKiBGb3IgZWFjaCBvZiB0aGVzZSBwYXNzU3R5bGVzLCBhbGwgbWVtYmVycyBvZiB0aGF0IHBhc3NTdHlsZSBhcmUgdGllZCovXG4gICAgICAgIC8qIGZvciB0aGUgc2FtZSByYW5rLiovXG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICBjYXNlICdiaWdpbnQnOiB7XG4gICAgICAgIC8qIFdpdGhpbiBlYWNoIG9mIHRoZXNlIHBhc3NTdHlsZXMsIHRoZSByYW5rIG9yZGVyaW5nIGFncmVlcyB3aXRoKi9cbiAgICAgICAgLyogSmF2YVNjcmlwdCdzIHJlbGF0aW9uYWwgb3BlcmF0b3JzIGA8YCBhbmQgYD5gLiovXG4gICAgICAgIHJldHVybiB0cml2aWFsQ29tcGFyYXRvcihsZWZ0LCByaWdodCk7XG4gICAgICB9XG4gICAgICBjYXNlICdzdHJpbmcnOiB7XG4gICAgICAgIHN3aXRjaCAoRU5ET19SQU5LX1NUUklOR1MpIHtcbiAgICAgICAgICBjYXNlICd1dGYxNi1jb2RlLXVuaXQtb3JkZXInOiB7XG4gICAgICAgICAgICByZXR1cm4gdHJpdmlhbENvbXBhcmF0b3IobGVmdCwgcmlnaHQpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICd1bmljb2RlLWNvZGUtcG9pbnQtb3JkZXInOiB7XG4gICAgICAgICAgICByZXR1cm4gY29tcGFyZUJ5Q29kZVBvaW50cyhsZWZ0LCByaWdodCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGNhc2UgJ2Vycm9yLWlmLW9yZGVyLWNob2ljZS1tYXR0ZXJzJzoge1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0MSA9IHRyaXZpYWxDb21wYXJhdG9yKGxlZnQsIHJpZ2h0KTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDIgPSBjb21wYXJlQnlDb2RlUG9pbnRzKGxlZnQsIHJpZ2h0KTtcbiAgICAgICAgICAgIHJlc3VsdDEgPT09IHJlc3VsdDIgfHxcbiAgICAgICAgICAgICAgRmFpbGBDb21wYXJpc29ucyBkaWZmZXJlZDogJHtsZWZ0fSB2cyAke3JpZ2h0fSwgJHtxKHJlc3VsdDEpfSB2cyAke3EocmVzdWx0Mil9YDtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgICB0aHJvdyBGYWlsYFVuZXhwZWN0ZWQgRU5ET19SQU5LX1NUUklOR1MgJHtxKEVORE9fUkFOS19TVFJJTkdTKX1gO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgY2FzZSAnc3ltYm9sJzoge1xuICAgICAgICByZXR1cm4gY29tcGFyYXRvcihcbiAgICAgICAgICBuYW1lRm9yUGFzc2FibGVTeW1ib2wobGVmdCksXG4gICAgICAgICAgbmFtZUZvclBhc3NhYmxlU3ltYm9sKHJpZ2h0KSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ251bWJlcic6IHtcbiAgICAgICAgcmV0dXJuIGNvbXBhcmVOdW1lcmljcyhsZWZ0LCByaWdodCk7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5UmVjb3JkJzoge1xuICAgICAgICAvKiBMZXhpY29ncmFwaGljIGJ5IGludmVyc2Ugc29ydGVkIG9yZGVyIG9mIHByb3BlcnR5IG5hbWVzLCB0aGVuKi9cbiAgICAgICAgLyogbGV4aWNvZ3JhcGhpYyBieSBjb3JyZXNwb25kaW5nIHZhbHVlcyBpbiB0aGF0IHNhbWUgaW52ZXJzZSovXG4gICAgICAgIC8qIG9yZGVyIG9mIHRoZWlyIHByb3BlcnR5IG5hbWVzLiBDb21wYXJpbmcgbmFtZXMgYnkgdGhlbXNlbHZlcyBmaXJzdCwqL1xuICAgICAgICAvKiBhbGwgcmVjb3JkcyB3aXRoIHRoZSBleGFjdCBzYW1lIHNldCBvZiBwcm9wZXJ0eSBuYW1lcyBzb3J0IG5leHQgdG8qL1xuICAgICAgICAvKiBlYWNoIG90aGVyIGluIGEgcmFuay1zb3J0IG9mIGNvcHlSZWNvcmRzLiovXG5cbiAgICAgICAgLyogVGhlIGNvcHlSZWNvcmQgaW52YXJpYW50cyBlbmZvcmNlZCBieSBwYXNzU3R5bGVPZiBlbnN1cmUgdGhhdCovXG4gICAgICAgIC8qIGFsbCB0aGUgcHJvcGVydHkgbmFtZXMgYXJlIHN0cmluZ3MuIFdlIG5lZWQgdGhlIHJldmVyc2Ugc29ydGVkIG9yZGVyKi9cbiAgICAgICAgLyogb2YgdGhlc2UgbmFtZXMsIHdoaWNoIHdlIHRoZW4gY29tcGFyZSBsZXhpY29ncmFwaGljYWxseS4gVGhpcyBlbnN1cmVzKi9cbiAgICAgICAgLyogdGhhdCBpZiB0aGUgbmFtZXMgb2YgcmVjb3JkIFggYXJlIGEgc3Vic2V0IG9mIHRoZSBuYW1lcyBvZiByZWNvcmQgWSwqL1xuICAgICAgICAvKiB0aGVuIHJlY29yZCBYIHdpbGwgaGF2ZSBhbiBlYXJsaWVyIHJhbmsgYW5kIHNvcnQgdG8gdGhlIGxlZnQgb2YgWS4qL1xuICAgICAgICBjb25zdCBsZWZ0TmFtZXMgPSByZWNvcmROYW1lcyhsZWZ0KTtcbiAgICAgICAgY29uc3QgcmlnaHROYW1lcyA9IHJlY29yZE5hbWVzKHJpZ2h0KTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSBjb21wYXJhdG9yKGxlZnROYW1lcywgcmlnaHROYW1lcyk7XG4gICAgICAgIGlmIChyZXN1bHQgIT09IDApIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGxlZnRWYWx1ZXMgPSByZWNvcmRWYWx1ZXMobGVmdCwgbGVmdE5hbWVzKTtcbiAgICAgICAgY29uc3QgcmlnaHRWYWx1ZXMgPSByZWNvcmRWYWx1ZXMocmlnaHQsIHJpZ2h0TmFtZXMpO1xuICAgICAgICByZXR1cm4gY29tcGFyYXRvcihsZWZ0VmFsdWVzLCByaWdodFZhbHVlcyk7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICAgIC8qIExleGljb2dyYXBoaWMqL1xuICAgICAgICBjb25zdCBsZW4gPSBNYXRoLm1pbihsZWZ0Lmxlbmd0aCwgcmlnaHQubGVuZ3RoKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGNvbXBhcmF0b3IobGVmdFtpXSwgcmlnaHRbaV0pO1xuICAgICAgICAgIGlmIChyZXN1bHQgIT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8qIElmIGFsbCBtYXRjaGluZyBlbGVtZW50cyB3ZXJlIHRpZWQsIHRoZW4gYWNjb3JkaW5nIHRvIHRoZWlyIGxlbmd0aHMuKi9cbiAgICAgICAgLyogSWYgYXJyYXkgWCBpcyBhIHByZWZpeCBvZiBhcnJheSBZLCB0aGVuIFggaGFzIGFuIGVhcmxpZXIgcmFuayB0aGFuIFkuKi9cbiAgICAgICAgcmV0dXJuIGNvbXBhcmF0b3IobGVmdC5sZW5ndGgsIHJpZ2h0Lmxlbmd0aCk7XG4gICAgICB9XG4gICAgICBjYXNlICdieXRlQXJyYXknOiB7XG4gICAgICAgIC8qIEJ5dGVBcnJheXMgY29tcGFyZSBieSBzaG9ydGxleC4qL1xuICAgICAgICAvKiAtIGZpcnN0LCBpZiB0aGV5IGFyZSBvZiB1bmVxdWFsIGxlbmd0aCwgdGhlbiB0aGUgc2hvcnRlciBpcyBsZXNzLiovXG4gICAgICAgIC8qIC0gdGhlbiwgYW1vbmcgYnl0ZUFycmF5cyBvZiBlcXVhbCBsZW5ndGgsIGJ5IGxleGljb2dyYXBoaWMgY29tcGFyaXNvbiovXG4gICAgICAgIC8qIG9mIHRoZWlyIGJ5dGVzIGluIGFzY2VuZGluZyBvcmRlci4qL1xuICAgICAgICBjb25zdCB7IGJ5dGVMZW5ndGg6IGxlZnRMZW4gfSA9IGxlZnQ7XG4gICAgICAgIGNvbnN0IHsgYnl0ZUxlbmd0aDogcmlnaHRMZW4gfSA9IHJpZ2h0O1xuICAgICAgICBpZiAobGVmdExlbiA8IHJpZ2h0TGVuKSB7XG4gICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgICAgIGlmIChsZWZ0TGVuID4gcmlnaHRMZW4pIHtcbiAgICAgICAgICByZXR1cm4gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8qIEFjY291bnQgZm9yIGdhcHMgaW4gdGhlIEBlbmRvL2ltbXV0YWJsZS1hcnJheWJ1ZmZlciBzaGltLiovXG4gICAgICAgIGNvbnN0IGxlZnRBcnJheSA9XG4gICAgICAgICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKGxlZnQpID09PSBBcnJheUJ1ZmZlci5wcm90b3R5cGVcbiAgICAgICAgICAgID8gbmV3IFVpbnQ4QXJyYXkobGVmdClcbiAgICAgICAgICAgIDogbmV3IFVpbnQ4QXJyYXkobGVmdC5zbGljZSgwKSk7XG4gICAgICAgIGNvbnN0IHJpZ2h0QXJyYXkgPVxuICAgICAgICAgIE9iamVjdC5nZXRQcm90b3R5cGVPZihyaWdodCkgPT09IEFycmF5QnVmZmVyLnByb3RvdHlwZVxuICAgICAgICAgICAgPyBuZXcgVWludDhBcnJheShyaWdodClcbiAgICAgICAgICAgIDogbmV3IFVpbnQ4QXJyYXkocmlnaHQuc2xpY2UoMCkpO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlZnRMZW47IGkgKz0gMSkge1xuICAgICAgICAgIGNvbnN0IGxlZnRCeXRlID0gbGVmdEFycmF5W2ldO1xuICAgICAgICAgIGNvbnN0IHJpZ2h0Qnl0ZSA9IHJpZ2h0QXJyYXlbaV07XG4gICAgICAgICAgaWYgKGxlZnRCeXRlIDwgcmlnaHRCeXRlKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChsZWZ0Qnl0ZSA+IHJpZ2h0Qnl0ZSkge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgICAgY2FzZSAndGFnZ2VkJzoge1xuICAgICAgICAvKiBMZXhpY29ncmFwaGljIGJ5IGBbU3ltYm9sLnRvU3RyaW5nVGFnXWAgdGhlbiBgLnBheWxvYWRgLiovXG4gICAgICAgIGNvbnN0IGxhYmVsQ29tcCA9IGNvbXBhcmF0b3IoZ2V0VGFnKGxlZnQpLCBnZXRUYWcocmlnaHQpKTtcbiAgICAgICAgaWYgKGxhYmVsQ29tcCAhPT0gMCkge1xuICAgICAgICAgIHJldHVybiBsYWJlbENvbXA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvbXBhcmF0b3IobGVmdC5wYXlsb2FkLCByaWdodC5wYXlsb2FkKTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgdGhyb3cgRmFpbGBVbnJlY29nbml6ZWQgcGFzc1N0eWxlOiAke3EobGVmdFN0eWxlKX1gO1xuICAgICAgfVxuICAgIH1cbiAgICAvKiBlc2xpbnQtZW5hYmxlICovXG4gIH07XG5cbiAgLyoqIEB0eXBlIHtSYW5rQ29tcGFyZX0gKi9cbiAgY29uc3Qgb3V0ZXJDb21wYXJhdG9yID0gKHgsIHkpID0+XG4gICAgLyogV2hlbiB0aGUgaW5uZXIgY29tcGFyYXRvciByZXR1cm5zIE5hTiB0byBpbmRpY2F0ZSBpbmNvbXBhcmFiaWxpdHksKi9cbiAgICAvKiByZXBsYWNlIHRoYXQgd2l0aCAwIHRvIGluZGljYXRlIGEgdGllLiovXG4gICAgLyoqIEB0eXBlIHtFeGNsdWRlPFBhcnRpYWxDb21wYXJpc29uLCBOYU4+fSAqLyAoY29tcGFyYXRvcih4LCB5KSB8fCAwKTtcblxuICAvKiogQHR5cGUge1JhbmtDb21wYXJlfSAqL1xuICBjb25zdCBhbnRpQ29tcGFyYXRvciA9ICh4LCB5KSA9PiBvdXRlckNvbXBhcmF0b3IoeSwgeCk7XG5cbiAgbWVtb09mU29ydGVkLnNldChvdXRlckNvbXBhcmF0b3IsIG5ldyBXZWFrU2V0KCkpO1xuICBtZW1vT2ZTb3J0ZWQuc2V0KGFudGlDb21wYXJhdG9yLCBuZXcgV2Vha1NldCgpKTtcbiAgY29tcGFyYXRvck1pcnJvckltYWdlcy5zZXQob3V0ZXJDb21wYXJhdG9yLCBhbnRpQ29tcGFyYXRvcik7XG4gIGNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuc2V0KGFudGlDb21wYXJhdG9yLCBvdXRlckNvbXBhcmF0b3IpO1xuXG4gIHJldHVybiBoYXJkZW4oeyBjb21wYXJhdG9yOiBvdXRlckNvbXBhcmF0b3IsIGFudGlDb21wYXJhdG9yIH0pO1xufTtcbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyYXRvclxuICogQHJldHVybnMge1JhbmtDb21wYXJlPX1cbiAqLyRozY9fb25jZS5tYWtlQ29tcGFyYXRvcktpdChtYWtlQ29tcGFyYXRvcktpdCk7XG4gICAgICAgY29uc3QgY29tcGFyYXRvck1pcnJvckltYWdlID0gY29tcGFyYXRvciA9PlxuICBjb21wYXJhdG9yTWlycm9ySW1hZ2VzLmdldChjb21wYXJhdG9yKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHBhc3NhYmxlc1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaM2PX29uY2UuY29tcGFyYXRvck1pcnJvckltYWdlKGNvbXBhcmF0b3JNaXJyb3JJbWFnZSk7XG4gICAgICAgY29uc3QgaXNSYW5rU29ydGVkID0gKHBhc3NhYmxlcywgY29tcGFyZSkgPT4ge1xuICBjb25zdCBzdWJNZW1vT2ZTb3J0ZWQgPSBtZW1vT2ZTb3J0ZWQuZ2V0KGNvbXBhcmUpO1xuICBhc3NlcnQoc3ViTWVtb09mU29ydGVkICE9PSB1bmRlZmluZWQpO1xuICBpZiAoc3ViTWVtb09mU29ydGVkLmhhcyhwYXNzYWJsZXMpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgYXNzZXJ0KHBhc3NTdHlsZU9mKHBhc3NhYmxlcykgPT09ICdjb3B5QXJyYXknKTtcbiAgZm9yIChsZXQgaSA9IDE7IGkgPCBwYXNzYWJsZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICBpZiAoY29tcGFyZShwYXNzYWJsZXNbaSAtIDFdLCBwYXNzYWJsZXNbaV0pID49IDEpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgc3ViTWVtb09mU29ydGVkLmFkZChwYXNzYWJsZXMpO1xuICByZXR1cm4gdHJ1ZTtcbn07JGjNj19vbmNlLmlzUmFua1NvcnRlZChpc1JhbmtTb3J0ZWQpO1xuaGFyZGVuKGlzUmFua1NvcnRlZCk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydFJhbmtTb3J0ZWQgPSAoc29ydGVkLCBjb21wYXJlKSA9PlxuICBpc1JhbmtTb3J0ZWQoc29ydGVkLCBjb21wYXJlKSB8fFxuICAvKiBUT0RPIGFzc2VydCBvbiBidWcgY291bGQgbGVhZCB0byBpbmZpbml0ZSByZWN1cnNpb24uIEZpeC4qL1xuICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICBGYWlsYE11c3QgYmUgcmFuayBzb3J0ZWQ6ICR7c29ydGVkfSB2cyAke3NvcnRCeVJhbmsoc29ydGVkLCBjb21wYXJlKX1gOyRozY9fb25jZS5hc3NlcnRSYW5rU29ydGVkKGFzc2VydFJhbmtTb3J0ZWQpO1xuaGFyZGVuKGFzc2VydFJhbmtTb3J0ZWQpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8VD59IHBhc3NhYmxlc1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHJldHVybnMge1RbXX1cbiAqL1xuICAgICAgIGNvbnN0IHNvcnRCeVJhbmsgPSAocGFzc2FibGVzLCBjb21wYXJlKSA9PiB7XG4gIC8qKiBAdHlwZSB7VFtdfSBtdXRhYmxlIGZvciBpbi1wbGFjZSBzb3J0aW5nLCBidXQgd2l0aCBoYXJkZW5lZCBlbGVtZW50cyAqL1xuICBsZXQgdW5zb3J0ZWQ7XG4gIGlmIChBcnJheS5pc0FycmF5KHBhc3NhYmxlcykpIHtcbiAgICBoYXJkZW4ocGFzc2FibGVzKTtcbiAgICAvKiBDYWxsaW5nIGlzUmFua1NvcnRlZCBnaXZlcyBpdCBhIGNoYW5jZSB0byBnZXQgbWVtb2l6ZWQgZm9yKi9cbiAgICAvKiB0aGlzIGBjb21wYXJlYCBmdW5jdGlvbiBldmVuIGlmIGl0IHdhcyBhbHJlYWR5IG1lbW9pemVkIGZvciBhIGRpZmZlcmVudCovXG4gICAgLyogYGNvbXBhcmVgIGZ1bmN0aW9uLiovXG4gICAgaWYgKGlzUmFua1NvcnRlZChwYXNzYWJsZXMsIGNvbXBhcmUpKSB7XG4gICAgICByZXR1cm4gcGFzc2FibGVzO1xuICAgIH1cbiAgICB1bnNvcnRlZCA9IFsuLi5wYXNzYWJsZXNdO1xuICB9IGVsc2Uge1xuICAgIHVuc29ydGVkID0gQXJyYXkuZnJvbShwYXNzYWJsZXMsIGhhcmRlbik7XG4gIH1cbiAgY29uc3Qgc29ydGVkID0gdW5zb3J0ZWQuc29ydChjb21wYXJlKTtcbiAgLyogRm9yIHJldmVyc2UgY29tcGFyaXNvbiwgbW92ZSBgdW5kZWZpbmVkYCB2YWx1ZXMgZnJvbSB0aGUgZW5kIHRvIHRoZSBzdGFydC4qL1xuICAvKiBOb3RlIHRoYXQgcGFzc1N0eWxlUHJlZml4ZXMgKEBzZWUge0BsaW5rIC4vZW5jb2RlUGFzc2FibGUuanN9KSBNVVNUIE5PVCovXG4gIC8qIHNvcnQgYW55IGNhdGVnb3J5IGFmdGVyIGB1bmRlZmluZWRgLiovXG4gIGlmIChjb21wYXJlKHRydWUsIHVuZGVmaW5lZCkgPiAwKSB7XG4gICAgbGV0IGkgPSBzb3J0ZWQubGVuZ3RoIC0gMTtcbiAgICB3aGlsZSAoaSA+PSAwICYmIHNvcnRlZFtpXSA9PT0gdW5kZWZpbmVkKSBpIC09IDE7XG4gICAgY29uc3QgbiA9IHNvcnRlZC5sZW5ndGggLSBpIC0gMTtcbiAgICBpZiAobiA+IDAgJiYgbiA8IHNvcnRlZC5sZW5ndGgpIHtcbiAgICAgIHNvcnRlZC5jb3B5V2l0aGluKG4sIDApO1xuICAgICAgc29ydGVkLmZpbGwoLyoqIEB0eXBlIHtUfSAqLyAodW5kZWZpbmVkKSwgMCwgbik7XG4gICAgfVxuICB9XG4gIGhhcmRlbihzb3J0ZWQpO1xuICBjb25zdCBzdWJNZW1vT2ZTb3J0ZWQgPSBtZW1vT2ZTb3J0ZWQuZ2V0KGNvbXBhcmUpO1xuICBhc3NlcnQoc3ViTWVtb09mU29ydGVkICE9PSB1bmRlZmluZWQpO1xuICBzdWJNZW1vT2ZTb3J0ZWQuYWRkKHNvcnRlZCk7XG4gIHJldHVybiBzb3J0ZWQ7XG59OyRozY9fb25jZS5zb3J0QnlSYW5rKHNvcnRCeVJhbmspO1xuaGFyZGVuKHNvcnRCeVJhbmspO1xuXG4vKipcbiAqIFNlZVxuICogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmluYXJ5X3NlYXJjaF9hbGdvcml0aG0jUHJvY2VkdXJlX2Zvcl9maW5kaW5nX3RoZV9sZWZ0bW9zdF9lbGVtZW50XG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGtleVxuICogQHBhcmFtIHsoXCJsZWZ0TW9zdFwiIHwgXCJyaWdodE1vc3RcIik9fSBiaWFzXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5jb25zdCByYW5rU2VhcmNoID0gKHNvcnRlZCwgY29tcGFyZSwga2V5LCBiaWFzID0gJ2xlZnRNb3N0JykgPT4ge1xuICBhc3NlcnRSYW5rU29ydGVkKHNvcnRlZCwgY29tcGFyZSk7XG4gIGxldCBsZWZ0ID0gMDtcbiAgbGV0IHJpZ2h0ID0gc29ydGVkLmxlbmd0aDtcbiAgd2hpbGUgKGxlZnQgPCByaWdodCkge1xuICAgIGNvbnN0IG0gPSBNYXRoLmZsb29yKChsZWZ0ICsgcmlnaHQpIC8gMik7XG4gICAgY29uc3QgY29tcCA9IGNvbXBhcmUoc29ydGVkW21dLCBrZXkpO1xuICAgIGlmIChjb21wIDw9IC0xIHx8IChjb21wID09PSAwICYmIGJpYXMgPT09ICdyaWdodE1vc3QnKSkge1xuICAgICAgbGVmdCA9IG0gKyAxO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQoY29tcCA+PSAxIHx8IChjb21wID09PSAwICYmIGJpYXMgPT09ICdsZWZ0TW9zdCcpKTtcbiAgICAgIHJpZ2h0ID0gbTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGJpYXMgPT09ICdsZWZ0TW9zdCcgPyBsZWZ0IDogcmlnaHQgLSAxO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNvcnRlZFxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IHJhbmtDb3ZlclxuICogQHJldHVybnMge0luZGV4Q292ZXJ9XG4gKi9cbiAgICAgICBjb25zdCBnZXRJbmRleENvdmVyID0gKHNvcnRlZCwgY29tcGFyZSwgW2xlZnRLZXksIHJpZ2h0S2V5XSkgPT4ge1xuICBhc3NlcnRSYW5rU29ydGVkKHNvcnRlZCwgY29tcGFyZSk7XG4gIGNvbnN0IGxlZnRJbmRleCA9IHJhbmtTZWFyY2goc29ydGVkLCBjb21wYXJlLCBsZWZ0S2V5LCAnbGVmdE1vc3QnKTtcbiAgY29uc3QgcmlnaHRJbmRleCA9IHJhbmtTZWFyY2goc29ydGVkLCBjb21wYXJlLCByaWdodEtleSwgJ3JpZ2h0TW9zdCcpO1xuICByZXR1cm4gW2xlZnRJbmRleCwgcmlnaHRJbmRleF07XG59OyRozY9fb25jZS5nZXRJbmRleENvdmVyKGdldEluZGV4Q292ZXIpO1xuaGFyZGVuKGdldEluZGV4Q292ZXIpO1xuXG4vKiogQHR5cGUge1JhbmtDb3Zlcn0gKi9cbiAgICAgICBjb25zdCBGdWxsUmFua0NvdmVyID0gaGFyZGVuKFsnJywgJ3snXSk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7SW5kZXhDb3Zlcn0gaW5kZXhDb3ZlclxuICogQHJldHVybnMge0l0ZXJhYmxlPFtudW1iZXIsIFBhc3NhYmxlXT59XG4gKi8kaM2PX29uY2UuRnVsbFJhbmtDb3ZlcihGdWxsUmFua0NvdmVyKTtcbiAgICAgICBjb25zdCBjb3ZlcmVkRW50cmllcyA9IChzb3J0ZWQsIFtsZWZ0SW5kZXgsIHJpZ2h0SW5kZXhdKSA9PiB7XG4gIC8qKiBAdHlwZSB7SXRlcmFibGU8W251bWJlciwgUGFzc2FibGVdPn0gKi9cbiAgY29uc3QgaXRlcmFibGUgPSBoYXJkZW4oe1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICBsZXQgaSA9IGxlZnRJbmRleDtcbiAgICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgaWYgKGkgPD0gcmlnaHRJbmRleCkge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHNvcnRlZFtpXTtcbiAgICAgICAgICAgIGkgKz0gMTtcbiAgICAgICAgICAgIHJldHVybiBoYXJkZW4oeyB2YWx1ZTogW2ksIGVsZW1lbnRdLCBkb25lOiBmYWxzZSB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGhhcmRlbih7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiBpdGVyYWJsZTtcbn07JGjNj19vbmNlLmNvdmVyZWRFbnRyaWVzKGNvdmVyZWRFbnRyaWVzKTtcbmhhcmRlbihjb3ZlcmVkRW50cmllcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVFxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtUfSBhXG4gKiBAcGFyYW0ge1R9IGJcbiAqIEByZXR1cm5zIHtUfVxuICovXG5jb25zdCBtYXhSYW5rID0gKGNvbXBhcmUsIGEsIGIpID0+IChjb21wYXJlKGEsIGIpID49IDAgPyBhIDogYik7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVFxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtUfSBhXG4gKiBAcGFyYW0ge1R9IGJcbiAqIEByZXR1cm5zIHtUfVxuICovXG5jb25zdCBtaW5SYW5rID0gKGNvbXBhcmUsIGEsIGIpID0+IChjb21wYXJlKGEsIGIpIDw9IDAgPyBhIDogYik7XG5cbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtSYW5rQ292ZXJbXX0gY292ZXJzXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG4gICAgICAgY29uc3QgdW5pb25SYW5rQ292ZXJzID0gKGNvbXBhcmUsIGNvdmVycykgPT4ge1xuICAvKipcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSBhXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gYlxuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuICBjb25zdCB1bmlvblJhbmtDb3ZlclBhaXIgPSAoW2xlZnRBLCByaWdodEFdLCBbbGVmdEIsIHJpZ2h0Ql0pID0+IFtcbiAgICBtaW5SYW5rKGNvbXBhcmUsIGxlZnRBLCBsZWZ0QiksXG4gICAgbWF4UmFuayhjb21wYXJlLCByaWdodEEsIHJpZ2h0QiksXG4gIF07XG4gIHJldHVybiBjb3ZlcnMucmVkdWNlKHVuaW9uUmFua0NvdmVyUGFpciwgWyd7JywgJyddKTtcbn07JGjNj19vbmNlLnVuaW9uUmFua0NvdmVycyh1bmlvblJhbmtDb3ZlcnMpO1xuaGFyZGVuKHVuaW9uUmFua0NvdmVycyk7XG5cbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHBhcmFtIHtSYW5rQ292ZXJbXX0gY292ZXJzXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG4gICAgICAgY29uc3QgaW50ZXJzZWN0UmFua0NvdmVycyA9IChjb21wYXJlLCBjb3ZlcnMpID0+IHtcbiAgLyoqXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gYVxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IGJcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbiAgY29uc3QgaW50ZXJzZWN0UmFua0NvdmVyUGFpciA9IChbbGVmdEEsIHJpZ2h0QV0sIFtsZWZ0QiwgcmlnaHRCXSkgPT4gW1xuICAgIG1heFJhbmsoY29tcGFyZSwgbGVmdEEsIGxlZnRCKSxcbiAgICBtaW5SYW5rKGNvbXBhcmUsIHJpZ2h0QSwgcmlnaHRCKSxcbiAgXTtcbiAgcmV0dXJuIGNvdmVycy5yZWR1Y2UoaW50ZXJzZWN0UmFua0NvdmVyUGFpciwgWycnLCAneyddKTtcbn07JGjNj19vbmNlLmludGVyc2VjdFJhbmtDb3ZlcnMoaW50ZXJzZWN0UmFua0NvdmVycyk7XG5cbiAgICAgICBjb25zdCB7IGNvbXBhcmF0b3I6IGNvbXBhcmVSYW5rLCBhbnRpQ29tcGFyYXRvcjogY29tcGFyZUFudGlSYW5rIH0gPVxuICBtYWtlQ29tcGFyYXRvcktpdCgpO1xuXG4vKipcbiAqIENyZWF0ZSBhIGNvbXBhcmF0b3Iga2l0IGluIHdoaWNoIHJlbW90YWJsZXMgYXJlIGZ1bGx5IG9yZGVyZWRcbiAqIGJ5IHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFyZSBmaXJzdCBzZWVuIGJ5ICp0aGlzKiBjb21wYXJhdG9yIGtpdC5cbiAqIEJFV0FSRTogVGhpcyBpcyBvYnNlcnZhYmxlIG11dGFibGUgc3RhdGUsIHNvIHN1Y2ggYSBjb21wYXJhdG9yIGtpdFxuICogc2hvdWxkIG5ldmVyIGJlIHNoYXJlZCBhbW9uZyBzdWJzeXN0ZW1zIHRoYXQgc2hvdWxkIG5vdCBiZSBhYmxlXG4gKiB0byBjb21tdW5pY2F0ZS5cbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBvcmRlciBkb2VzIG5vdCBtZWV0IHRoZSByZXF1aXJlbWVudHMgZm9yIHN0b3JlXG4gKiBvcmRlcmluZywgc2luY2UgaXQgaGFzIG5vIG1lbW9yeSBvZiBkZWxldGVkIGtleXMuXG4gKlxuICogVGhlc2UgZnVsbCBvcmRlciBjb21wYXJhdG9yIGtpdCBpcyBzdHJpY3RseSBtb3JlIHByZWNpc2UgdGhhdCB0aGVcbiAqIHJhbmsgb3JkZXIgY29tcGFyYXRvciBraXRzIGFib3ZlLiBBcyBhIHJlc3VsdCwgYW55IGFycmF5IHdoaWNoIGlzXG4gKiBzb3J0ZWQgYnkgc3VjaCBhIGZ1bGwgb3JkZXIgd2lsbCBwYXNzIHRoZSBpc1JhbmtTb3J0ZWQgdGVzdCB3aXRoXG4gKiBhIGNvcnJlc3BvbmRpbmcgcmFuayBvcmRlci5cbiAqXG4gKiBBbiBhcnJheSB3aGljaCBpcyBzb3J0ZWQgYnkgYSAqZnJlc2gqIGZ1bGwgb3JkZXIgY29tcGFyYXRvciwgaS5lLixcbiAqIG9uZSB0aGF0IGhhcyBub3QgeWV0IHNlZW4gYW55IHJlbW90YWJsZXMsIHdpbGwgb2YgY291cnNlIHJlbWFpblxuICogc29ydGVkIGJ5IGFjY29yZGluZyB0byAqdGhhdCogZnVsbCBvcmRlciBjb21wYXJhdG9yLiBBbiBhcnJheSAqb2ZcbiAqIHNjYWxhcnMqIHNvcnRlZCBieSBhIGZyZXNoIGZ1bGwgb3JkZXIgd2lsbCByZW1haW4gc29ydGVkIGV2ZW5cbiAqIGFjY29yZGluZyB0byBhIG5ldyBmcmVzaCBmdWxsIG9yZGVyIGNvbXBhcmF0b3IsIHNpbmNlIGl0IHdpbGwgc2VlXG4gKiB0aGUgcmVtb3RhYmxlcyBpbiB0aGUgc2FtZSBvcmRlciBhZ2Fpbi4gVW5mb3J0dW5hdGVseSwgdGhpcyBpc1xuICogbm90IHRydWUgb2YgYXJyYXlzIG9mIHBhc3NhYmxlcyBpbiBnZW5lcmFsLlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IGxvbmdMaXZlZFxuICogQHJldHVybnMge0Z1bGxDb21wYXJhdG9yS2l0fVxuICovJGjNj19vbmNlLmNvbXBhcmVSYW5rKGNvbXBhcmVSYW5rKTskaM2PX29uY2UuY29tcGFyZUFudGlSYW5rKGNvbXBhcmVBbnRpUmFuayk7XG4gICAgICAgY29uc3QgbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAobG9uZ0xpdmVkID0gZmFsc2UpID0+IHtcbiAgbGV0IG51bVNlZW4gPSAwO1xuICAvKiBXaGVuIGR5bmFtaWNhbGx5IGNyZWF0ZWQgd2l0aCBzaG9ydCBsaWZldGltZXMgKHRoZSBkZWZhdWx0KSBhIFdlYWtNYXAqL1xuICAvKiB3b3VsZCBwZXJmb3JtIHBvb3JseSwgYW5kIHRoZSBsZWFrIGNyZWF0ZWQgYnkgYSBNYXAgb25seSBsYXN0cyBhcyBsb25nKi9cbiAgLyogYXMgdGhlIE1hcC4qL1xuICBjb25zdCBNYXBDb25zdHJ1Y3RvciA9IGxvbmdMaXZlZCA/IFdlYWtNYXAgOiBNYXA7XG4gIGNvbnN0IHNlZW4gPSBuZXcgTWFwQ29uc3RydWN0b3IoKTtcbiAgY29uc3QgdGFnID0gciA9PiB7XG4gICAgaWYgKHNlZW4uaGFzKHIpKSB7XG4gICAgICByZXR1cm4gc2Vlbi5nZXQocik7XG4gICAgfVxuICAgIG51bVNlZW4gKz0gMTtcbiAgICBzZWVuLnNldChyLCBudW1TZWVuKTtcbiAgICByZXR1cm4gbnVtU2VlbjtcbiAgfTtcbiAgY29uc3QgY29tcGFyZVJlbW90YWJsZXMgPSAoeCwgeSkgPT4gY29tcGFyZVJhbmsodGFnKHgpLCB0YWcoeSkpO1xuICByZXR1cm4gbWFrZUNvbXBhcmF0b3JLaXQoY29tcGFyZVJlbW90YWJsZXMpO1xufTskaM2PX29uY2UubWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQpO1xuaGFyZGVuKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNvbXBhcmVCeUNvZGVQb2ludHMiOlsiY29tcGFyZUJ5Q29kZVBvaW50cyJdLCJjb21wYXJlTnVtZXJpY3MiOlsiY29tcGFyZU51bWVyaWNzIl0sImdldFBhc3NTdHlsZUNvdmVyIjpbImdldFBhc3NTdHlsZUNvdmVyIl0sIm1ha2VDb21wYXJhdG9yS2l0IjpbIm1ha2VDb21wYXJhdG9yS2l0Il0sImNvbXBhcmF0b3JNaXJyb3JJbWFnZSI6WyJjb21wYXJhdG9yTWlycm9ySW1hZ2UiXSwiaXNSYW5rU29ydGVkIjpbImlzUmFua1NvcnRlZCJdLCJhc3NlcnRSYW5rU29ydGVkIjpbImFzc2VydFJhbmtTb3J0ZWQiXSwic29ydEJ5UmFuayI6WyJzb3J0QnlSYW5rIl0sImdldEluZGV4Q292ZXIiOlsiZ2V0SW5kZXhDb3ZlciJdLCJGdWxsUmFua0NvdmVyIjpbIkZ1bGxSYW5rQ292ZXIiXSwiY292ZXJlZEVudHJpZXMiOlsiY292ZXJlZEVudHJpZXMiXSwidW5pb25SYW5rQ292ZXJzIjpbInVuaW9uUmFua0NvdmVycyJdLCJpbnRlcnNlY3RSYW5rQ292ZXJzIjpbImludGVyc2VjdFJhbmtDb3ZlcnMiXSwiY29tcGFyZVJhbmsiOlsiY29tcGFyZVJhbmsiXSwiY29tcGFyZUFudGlSYW5rIjpbImNvbXBhcmVBbnRpUmFuayJdLCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCI6WyJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAAhAAAAQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOMQ3SNJDAAASQwAAB0AAABAZW5kby9uYXQtdjUuMS4zL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsiTmF0IiwiaXNOYXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGlzTmF0LCduYW1lJyx7dmFsdWU6XCJpc05hdFwifSk7JGjNj19vbmNlLmlzTmF0KGlzTmF0KTtPYmplY3QuZGVmaW5lUHJvcGVydHkoTmF0LCduYW1lJyx7dmFsdWU6XCJOYXRcIn0pOyRozY9fb25jZS5OYXQoTmF0KTsvKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4qL1xuLyogQ29weXJpZ2h0IChDKSAyMDE4IEFnb3JpYyovXG4vKiovXG4vKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyovXG4vKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuKi9cbi8qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCovXG4vKiovXG4vKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAqL1xuLyoqL1xuLyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSovXG4vKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsKi9cbi8qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiovXG4vKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kKi9cbi8qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiovXG5cbi8qIEB0cy1jaGVjayovXG5cbi8qKlxuICogSXMgYGFsbGVnZWROdW1gIGEgbnVtYmVyIGluIHRoZSBbY29udGlndW91cyByYW5nZSBvZiBleGFjdGx5IGFuZFxuICogdW5hbWJpZ3VvdXNseVxuICogcmVwcmVzZW50YWJsZV0oaHR0cHM6Ly9lc2Rpc2N1c3Mub3JnL3RvcGljL21vcmUtbnVtZXJpYy1jb25zdGFudHMtcGxlYXNlLWVzcGVjaWFsbHktZXBzaWxvbiNjb250ZW50LTE0KVxuICogIG5hdHVyYWwgbnVtYmVycyAobm9uLW5lZ2F0aXZlIGludGVnZXJzKT9cbiAqXG4gKiBUbyBxdWFsaWZ5IGBhbGxlZ2VkTnVtYCBtdXN0IGVpdGhlciBiZSBhXG4gKiBub24tbmVnYXRpdmUgYGJpZ2ludGAsIG9yIGEgbm9uLW5lZ2F0aXZlIGBudW1iZXJgIHJlcHJlc2VudGluZyBhbiBpbnRlZ2VyXG4gKiB3aXRoaW4gcmFuZ2Ugb2YgW2ludGVnZXJzIHNhZmVseSByZXByZXNlbnRhYmxlIGluXG4gKiBmbG9hdGluZyBwb2ludF0oaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1udW1iZXIuaXNzYWZlaW50ZWdlcikuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkTnVtXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNOYXQoYWxsZWdlZE51bSkge1xuICBpZiAodHlwZW9mIGFsbGVnZWROdW0gPT09ICdiaWdpbnQnKSB7XG4gICAgcmV0dXJuIGFsbGVnZWROdW0gPj0gMDtcbiAgfVxuICBpZiAodHlwZW9mIGFsbGVnZWROdW0gIT09ICdudW1iZXInKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIE51bWJlci5pc1NhZmVJbnRlZ2VyKGFsbGVnZWROdW0pICYmIGFsbGVnZWROdW0gPj0gMDtcbn1cblxuLyoqXG4gKiBJZiBgYWxsZWdlZE51bWJlcmAgcGFzc2VzIHRoZSBgaXNOYXRgIHRlc3QsIHRoZW4gcmV0dXJuIGl0IGFzIGEgYmlnaW50LlxuICogT3RoZXJ3aXNlIHRocm93IGFuIGFwcHJvcHJpYXRlIGVycm9yLlxuICpcbiAqIElmIGBhbGxlZ2VkTnVtYCBpcyBuZWl0aGVyIGEgYmlnaW50IG5vciBhIG51bWJlciwgYE5hdGAgdGhyb3dzIGEgYFR5cGVFcnJvcmAuXG4gKiBPdGhlcndpc2UsIGlmIGl0IGlzIG5vdCBhIFtzYWZlbHlcbiAqIHJlcHJlc2VudGFibGVdKGh0dHBzOi8vZXNkaXNjdXNzLm9yZy90b3BpYy9tb3JlLW51bWVyaWMtY29uc3RhbnRzLXBsZWFzZS1lc3BlY2lhbGx5LWVwc2lsb24jY29udGVudC0xNClcbiAqIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLCBgTmF0YCB0aHJvd3MgYSBgUmFuZ2VFcnJvcmAuXG4gKiBPdGhlcndpc2UsIGl0IGlzIGNvbnZlcnRlZCB0byBhIGJpZ2ludCBpZiBuZWNlc3NhcnkgYW5kIHJldHVybmVkLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZE51bVxuICogQHJldHVybnMge2JpZ2ludH1cbiAqL1xuZnVuY3Rpb24gTmF0KGFsbGVnZWROdW0pIHtcbiAgaWYgKHR5cGVvZiBhbGxlZ2VkTnVtID09PSAnYmlnaW50Jykge1xuICAgIGlmIChhbGxlZ2VkTnVtIDwgMG4pIHtcbiAgICAgIHRocm93IFJhbmdlRXJyb3IoYCR7YWxsZWdlZE51bX0gaXMgbmVnYXRpdmVgKTtcbiAgICB9XG4gICAgcmV0dXJuIGFsbGVnZWROdW07XG4gIH1cblxuICBpZiAodHlwZW9mIGFsbGVnZWROdW0gPT09ICdudW1iZXInKSB7XG4gICAgaWYgKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihhbGxlZ2VkTnVtKSkge1xuICAgICAgdGhyb3cgUmFuZ2VFcnJvcihgJHthbGxlZ2VkTnVtfSBpcyBub3QgYSBzYWZlIGludGVnZXJgKTtcbiAgICB9XG4gICAgaWYgKGFsbGVnZWROdW0gPCAwKSB7XG4gICAgICB0aHJvdyBSYW5nZUVycm9yKGAke2FsbGVnZWROdW19IGlzIG5lZ2F0aXZlYCk7XG4gICAgfVxuICAgIHJldHVybiBCaWdJbnQoYWxsZWdlZE51bSk7XG4gIH1cblxuICB0aHJvdyBUeXBlRXJyb3IoXG4gICAgYCR7YWxsZWdlZE51bX0gaXMgYSAke3R5cGVvZiBhbGxlZ2VkTnVtfSBidXQgbXVzdCBiZSBhIGJpZ2ludCBvciBhIG51bWJlcmAsXG4gICk7XG59XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc05hdCI6WyJpc05hdCJdLCJOYXQiOlsiTmF0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAG5u3nM2CwAANgsAACAAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL3NyYy9pdGVyLWhlbHBlcnMuanMiLCIuL3NyYy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vc3JjL2Vycm9yLmpzIiwiLi9zcmMvcmVtb3RhYmxlLmpzIiwiLi9zcmMvc3ltYm9sLmpzIiwiLi9zcmMvc3RyaW5nLmpzIiwiLi9zcmMvcGFzc1N0eWxlT2YuanMiLCIuL3NyYy9tYWtlVGFnZ2VkLmpzIiwiLi9zcmMvbWFrZS1mYXIuanMiLCIuL3NyYy90eXBlR3VhcmRzLmpzIiwiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzIiwiLi9zcmMvdHlwZXMuanMiXSwiZXhwb3J0cyI6WyJGYXIiLCJGYXIiLCJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIiwiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyIsImZpbHRlckl0ZXJhYmxlIiwiZmlsdGVySXRlcmFibGUiLCJnZXRSZW1vdGFibGVNZXRob2ROYW1lcyIsImdldFJlbW90YWJsZU1ldGhvZE5hbWVzIiwiaXNFcnJvckxpa2UiLCJpc0Vycm9yTGlrZSIsImlzT2JqZWN0IiwiaXNPYmplY3QiLCJpc1Bhc3NhYmxlIiwiaXNQYXNzYWJsZSIsImlzUGFzc2FibGVTeW1ib2wiLCJpc1Bhc3NhYmxlU3ltYm9sIixudWxsXSwicmVleHBvcnRzIjpbIi4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL2l0ZXItaGVscGVycy5qc1wiLCBbXV0sW1wiLi9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW11dLFtcIi4vc3JjL2Vycm9yLmpzXCIsIFtdXSxbXCIuL3NyYy9yZW1vdGFibGUuanNcIiwgW11dLFtcIi4vc3JjL3N5bWJvbC5qc1wiLCBbXV0sW1wiLi9zcmMvc3RyaW5nLmpzXCIsIFtdXSxbXCIuL3NyYy9wYXNzU3R5bGVPZi5qc1wiLCBbXV0sW1wiLi9zcmMvbWFrZVRhZ2dlZC5qc1wiLCBbXV0sW1wiLi9zcmMvbWFrZS1mYXIuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVHdWFyZHMuanNcIiwgW11dLFtcIi4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6eyIuL3NyYy9pdGVyLWhlbHBlcnMuanMiOltbIm1hcEl0ZXJhYmxlIiwibWFwSXRlcmFibGUiXSxbImZpbHRlckl0ZXJhYmxlIiwiZmlsdGVySXRlcmFibGUiXV0sIi4vc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIjpbWyJQQVNTX1NUWUxFIiwiUEFTU19TVFlMRSJdLFsiaXNPYmplY3QiLCJpc09iamVjdCJdLFsiaXNQcmltaXRpdmUiLCJpc1ByaW1pdGl2ZSJdLFsiYXNzZXJ0Q2hlY2tlciIsImFzc2VydENoZWNrZXIiXSxbImdldFRhZyIsImdldFRhZyJdLFsiaGFzT3duUHJvcGVydHlPZiIsImhhc093blByb3BlcnR5T2YiXV0sIi4vc3JjL2Vycm9yLmpzIjpbWyJnZXRFcnJvckNvbnN0cnVjdG9yIiwiZ2V0RXJyb3JDb25zdHJ1Y3RvciJdLFsiaXNFcnJvckxpa2UiLCJpc0Vycm9yTGlrZSJdXSwiLi9zcmMvcmVtb3RhYmxlLmpzIjpbWyJnZXRJbnRlcmZhY2VPZiIsImdldEludGVyZmFjZU9mIl0sWyJnZXRSZW1vdGFibGVNZXRob2ROYW1lcyIsImdldFJlbW90YWJsZU1ldGhvZE5hbWVzIl1dLCIuL3NyYy9zeW1ib2wuanMiOltbImFzc2VydFBhc3NhYmxlU3ltYm9sIiwiYXNzZXJ0UGFzc2FibGVTeW1ib2wiXSxbImlzUGFzc2FibGVTeW1ib2wiLCJpc1Bhc3NhYmxlU3ltYm9sIl0sWyJuYW1lRm9yUGFzc2FibGVTeW1ib2wiLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiXSxbInBhc3NhYmxlU3ltYm9sRm9yTmFtZSIsInBhc3NhYmxlU3ltYm9sRm9yTmFtZSJdLFsidW5wYXNzYWJsZVN5bWJvbEZvck5hbWUiLCJ1bnBhc3NhYmxlU3ltYm9sRm9yTmFtZSJdXSwiLi9zcmMvc3RyaW5nLmpzIjpbWyJpc1dlbGxGb3JtZWRTdHJpbmciLCJpc1dlbGxGb3JtZWRTdHJpbmciXSxbImFzc2VydFdlbGxGb3JtZWRTdHJpbmciLCJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIl0sWyJhc3NlcnRQYXNzYWJsZVN0cmluZyIsImFzc2VydFBhc3NhYmxlU3RyaW5nIl1dLCIuL3NyYy9wYXNzU3R5bGVPZi5qcyI6W1sicGFzc1N0eWxlT2YiLCJwYXNzU3R5bGVPZiJdLFsiaXNQYXNzYWJsZSIsImlzUGFzc2FibGUiXSxbImFzc2VydFBhc3NhYmxlIiwiYXNzZXJ0UGFzc2FibGUiXSxbInRvUGFzc2FibGVFcnJvciIsInRvUGFzc2FibGVFcnJvciJdLFsidG9UaHJvd2FibGUiLCJ0b1Rocm93YWJsZSJdXSwiLi9zcmMvbWFrZVRhZ2dlZC5qcyI6W1sibWFrZVRhZ2dlZCIsIm1ha2VUYWdnZWQiXV0sIi4vc3JjL21ha2UtZmFyLmpzIjpbWyJSZW1vdGFibGUiLCJSZW1vdGFibGUiXSxbIkZhciIsIkZhciJdLFsiVG9GYXJGdW5jdGlvbiIsIlRvRmFyRnVuY3Rpb24iXSxbIkdFVF9NRVRIT0RfTkFNRVMiLCJHRVRfTUVUSE9EX05BTUVTIl1dLCIuL3NyYy90eXBlR3VhcmRzLmpzIjpbWyJhc3NlcnRSZWNvcmQiLCJhc3NlcnRSZWNvcmQiXSxbImFzc2VydENvcHlBcnJheSIsImFzc2VydENvcHlBcnJheSJdLFsiYXNzZXJ0UmVtb3RhYmxlIiwiYXNzZXJ0UmVtb3RhYmxlIl0sWyJpc1JlbW90YWJsZSIsImlzUmVtb3RhYmxlIl0sWyJpc1JlY29yZCIsImlzUmVjb3JkIl0sWyJpc0NvcHlBcnJheSIsImlzQ29weUFycmF5Il0sWyJpc0F0b20iLCJpc0F0b20iXSxbImFzc2VydEF0b20iLCJhc3NlcnRBdG9tIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABOhW4jFQ0AABUNAAAoAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL2J5dGVBcnJheS5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJCeXRlQXJyYXlIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBYLEZhaWw7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV1dKTtcblxuLyoqXG4gKiBAaW1wb3J0IHtQYXNzU3R5bGVIZWxwZXJ9IGZyb20gJy4vaW50ZXJuYWwtdHlwZXMuanMnO1xuICovXG5cbmNvbnN0IHsgZ2V0UHJvdG90eXBlT2YsIGdldE93blByb3BlcnR5RGVzY3JpcHRvciB9ID0gT2JqZWN0O1xuY29uc3QgeyBvd25LZXlzLCBhcHBseSB9ID0gUmVmbGVjdDtcblxuLyogRGV0ZWN0cyB0aGUgcHJlc2VuY2Ugb2YgYSBpbW11dGFibGUgQXJyYXlCdWZmZXIgc3VwcG9ydCBpbiB0aGUgdW5kZXJseWluZyovXG4vKiBwbGF0Zm9ybSBhbmQgcHJvdmlkZXMgZWl0aGVyIHN1aXRhYmxlIHZhbHVlcyBmcm9tIHRoYXQgaW1wbGVtZW50YXRpb24gb3IqL1xuLyogdmFsdWVzIHRoYXQgd2lsbCBjb25zaXN0ZW50bHkgZGVueSB0aGF0IGltbXV0YWJsZSBBcnJheUJ1ZmZlcnMgZXhpc3QuKi9cbmNvbnN0IGFkYXB0SW1tdXRhYmxlQXJyYXlCdWZmZXIgPSAoKSA9PiB7XG4gIGNvbnN0IGFuQXJyYXlCdWZmZXIgPSBuZXcgQXJyYXlCdWZmZXIoMCk7XG5cbiAgLyogT24gcGxhdGZvcm1zIHRoYXQgZG8gbm90IHN1cHBvcnQgc2xpY2VUb0ltbXV0YWJsZSwgcGFzcy1zdHlsZSBieXRlQXJyYXkqL1xuICAvKiBjYW5ub3QgYmUgY29uc3RydWN0ZWQuKi9cbiAgLyogQHRzLWV4cGVjdC1lcnJvciBUT0RPIFRoaXMgZXJyb3Igd2lsbCBiZSBhZGRyZXNzZWQgd2hlbiB1cGRhdGluZyovXG4gIC8qIFR5cGVTY3JpcHQncyBuYXRpdmUgdHlwZXMgdG8gYSB2ZXJzaW9uIHJlY29nbml6aW5nIHRoZSB1cGNvbWluZyBzdGFuZGFyZC4qL1xuICBpZiAoYW5BcnJheUJ1ZmZlci5zbGljZVRvSW1tdXRhYmxlID09PSB1bmRlZmluZWQpIHtcbiAgICByZXR1cm4ge1xuICAgICAgaW1tdXRhYmxlQXJyYXlCdWZmZXJQcm90b3R5cGU6IG51bGwsXG4gICAgICBpbW11dGFibGVHZXR0ZXI6ICgpID0+IGZhbHNlLFxuICAgIH07XG4gIH1cblxuICAvKiBAdHMtZXhwZWN0LWVycm9yIFRPRE8gVGhpcyBlcnJvciB3aWxsIGJlIGFkZHJlc3NlZCB3aGVuIHVwZGF0aW5nKi9cbiAgLyogVHlwZVNjcmlwdCdzIG5hdGl2ZSB0eXBlcyB0byBhIHZlcnNpb24gcmVjb2duaXppbmcgdGhlIHVwY29taW5nIHN0YW5kYXJkLiovXG4gIGNvbnN0IGFuSW1tdXRhYmxlQXJyYXlCdWZmZXIgPSBhbkFycmF5QnVmZmVyLnNsaWNlVG9JbW11dGFibGUoKTtcblxuICAvKipcbiAqIEFzIHByb3Bvc2VkLCB0aGlzIHdpbGwgYmUgdGhlIHNhbWUgYXMgYEFycmF5QnVmZmVyLnByb3RvdHlwZWAuIEFzIHNoaW1tZWQsXG4gKiB0aGlzIHdpbGwgYmUgYSBoaWRkZW4gaW50cmluc2ljIHRoYXQgaW5oZXJpdHMgZnJvbSBgQXJyYXlCdWZmZXIucHJvdG90eXBlYC5cbiAqIEVpdGhlciB3YXksIGdldCB0aGlzIGluIGEgd2F5IHRoYXQgd2UgY2FuIHRydXN0IGl0IGFmdGVyIGxvY2tkb3duLCBhbmRcbiAqIHJlcXVpcmUgdGhhdCBhbGwgaW1tdXRhYmxlIEFycmF5QnVmZmVycyBkaXJlY3RseSBpbmhlcml0IGZyb20gaXQuXG4gKi9cbiAgY29uc3QgaW1tdXRhYmxlQXJyYXlCdWZmZXJQcm90b3R5cGUgPSBnZXRQcm90b3R5cGVPZihhbkltbXV0YWJsZUFycmF5QnVmZmVyKTtcblxuICBjb25zdCBpbW11dGFibGVHZXR0ZXIgPSAvKiogQHR5cGUgeyh0aGlzOiBBcnJheUJ1ZmZlcikgPT4gYm9vbGVhbn0gKi8gKFxuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgV2Uga25vdyB0aGUgZGVzY2lwdG9yIGlzIHRoZXJlLiovXG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGltbXV0YWJsZUFycmF5QnVmZmVyUHJvdG90eXBlLCAnaW1tdXRhYmxlJykuZ2V0XG4gICk7XG5cbiAgcmV0dXJuIHsgaW1tdXRhYmxlQXJyYXlCdWZmZXJQcm90b3R5cGUsIGltbXV0YWJsZUdldHRlciB9O1xufTtcblxuY29uc3QgeyBpbW11dGFibGVBcnJheUJ1ZmZlclByb3RvdHlwZSwgaW1tdXRhYmxlR2V0dGVyIH0gPVxuICBhZGFwdEltbXV0YWJsZUFycmF5QnVmZmVyKCk7XG5cbi8qKlxuICogQHR5cGUge1Bhc3NTdHlsZUhlbHBlcn1cbiAqL1xuICAgICAgIGNvbnN0IEJ5dGVBcnJheUhlbHBlciA9IGhhcmRlbih7XG4gIHN0eWxlTmFtZTogJ2J5dGVBcnJheScsXG5cbiAgY2FuQmVWYWxpZDogKGNhbmRpZGF0ZSwgY2hlY2sgPSB1bmRlZmluZWQpID0+XG4gICAgKGNhbmRpZGF0ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyICYmXG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIFRPRE8gSG93IGRvIEkgYWRkIGl0IHRvIHRoZSBBcnJheUJ1ZmZlciB0eXBlPyovXG4gICAgICBjYW5kaWRhdGUuaW1tdXRhYmxlKSB8fFxuICAgICghIWNoZWNrICYmIGNoZWNrKGZhbHNlLCBYYEltbXV0YWJsZSBBcnJheUJ1ZmZlciBleHBlY3RlZDogJHtjYW5kaWRhdGV9YCkpLFxuXG4gIGFzc2VydFJlc3RWYWxpZDogKGNhbmRpZGF0ZSwgX3Bhc3NTdHlsZU9mUmVjdXIpID0+IHtcbiAgICBnZXRQcm90b3R5cGVPZihjYW5kaWRhdGUpID09PSBpbW11dGFibGVBcnJheUJ1ZmZlclByb3RvdHlwZSB8fFxuICAgICAgYXNzZXJ0LmZhaWwoWGBNYWxmb3JtZWQgQnl0ZUFycmF5ICR7Y2FuZGlkYXRlfWAsIFR5cGVFcnJvcik7XG4gICAgYXBwbHkoaW1tdXRhYmxlR2V0dGVyLCBjYW5kaWRhdGUsIFtdKSB8fFxuICAgICAgRmFpbGBNdXN0IGJlIGFuIGltbXV0YWJsZSBBcnJheUJ1ZmZlcjogJHtjYW5kaWRhdGV9YDtcbiAgICBvd25LZXlzKGNhbmRpZGF0ZSkubGVuZ3RoID09PSAwIHx8XG4gICAgICBhc3NlcnQuZmFpbChcbiAgICAgICAgWGBCeXRlQXJyYXlzIG11c3Qgbm90IGhhdmUgb3duIHByb3BlcnRpZXM6ICR7Y2FuZGlkYXRlfWAsXG4gICAgICAgIFR5cGVFcnJvcixcbiAgICAgICk7XG4gIH0sXG59KTskaM2PX29uY2UuQnl0ZUFycmF5SGVscGVyKEJ5dGVBcnJheUhlbHBlcik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJCeXRlQXJyYXlIZWxwZXIiOlsiQnl0ZUFycmF5SGVscGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJmnvdIICAAACAgAACgAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvY29weUFycmF5LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJDb3B5QXJyYXlIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBYLGFzc2VydENoZWNrZXIsZ2V0T3duRGF0YURlc2NyaXB0b3I7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiZ2V0T3duRGF0YURlc2NyaXB0b3JcIixbJGjNj19hID0+IChnZXRPd25EYXRhRGVzY3JpcHRvciA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cbmNvbnN0IHsgZ2V0UHJvdG90eXBlT2YgfSA9IE9iamVjdDtcbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgaXNBcnJheSwgcHJvdG90eXBlOiBhcnJheVByb3RvdHlwZSB9ID0gQXJyYXk7XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtJTVBPUlQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbiAgICAgICBjb25zdCBDb3B5QXJyYXlIZWxwZXIgPSBoYXJkZW4oe1xuICBzdHlsZU5hbWU6ICdjb3B5QXJyYXknLFxuXG4gIGNhbkJlVmFsaWQ6IChjYW5kaWRhdGUsIGNoZWNrID0gdW5kZWZpbmVkKSA9PlxuICAgIGlzQXJyYXkoY2FuZGlkYXRlKSB8fFxuICAgICghIWNoZWNrICYmIGNoZWNrKGZhbHNlLCBYYEFycmF5IGV4cGVjdGVkOiAke2NhbmRpZGF0ZX1gKSksXG5cbiAgYXNzZXJ0UmVzdFZhbGlkOiAoY2FuZGlkYXRlLCBwYXNzU3R5bGVPZlJlY3VyKSA9PiB7XG4gICAgZ2V0UHJvdG90eXBlT2YoY2FuZGlkYXRlKSA9PT0gYXJyYXlQcm90b3R5cGUgfHxcbiAgICAgIGFzc2VydC5mYWlsKFhgTWFsZm9ybWVkIGFycmF5OiAke2NhbmRpZGF0ZX1gLCBUeXBlRXJyb3IpO1xuICAgIC8qIFNpbmNlIHdlJ3JlIGFscmVhZHkgZW5zdXJlZCBjYW5kaWRhdGUgaXMgYW4gYXJyYXksIGl0IHNob3VsZCBub3QgYmUqL1xuICAgIC8qIHBvc3NpYmxlIGZvciB0aGUgZm9sbG93aW5nIGdldCB0byBmYWlsLiovXG4gICAgY29uc3QgbGVuID0gLyoqIEB0eXBlIHtudW1iZXJ9ICovIChcbiAgICAgIGdldE93bkRhdGFEZXNjcmlwdG9yKGNhbmRpZGF0ZSwgJ2xlbmd0aCcsIGZhbHNlLCBhc3NlcnRDaGVja2VyKS52YWx1ZVxuICAgICk7XG4gICAgLyogVmFsaWRhdGUgdGhhdCBlYWNoIGluZGV4IHByb3BlcnR5IGlzIG93bi9kYXRhL2VudW1lcmFibGUqL1xuICAgIC8qIGFuZCBpdHMgYXNzb2NpYXRlZCB2YWx1ZSBpcyByZWN1cnNpdmVseSBwYXNzYWJsZS4qL1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpICs9IDEpIHtcbiAgICAgIHBhc3NTdHlsZU9mUmVjdXIoXG4gICAgICAgIGdldE93bkRhdGFEZXNjcmlwdG9yKGNhbmRpZGF0ZSwgaSwgdHJ1ZSwgYXNzZXJ0Q2hlY2tlcikudmFsdWUsXG4gICAgICApO1xuICAgIH1cbiAgICAvKiBFeHBlY3Qgb25lIGtleSBwZXIgaW5kZXggcGx1cyBvbmUgZm9yICdsZW5ndGgnLiovXG4gICAgb3duS2V5cyhjYW5kaWRhdGUpLmxlbmd0aCA9PT0gbGVuICsgMSB8fFxuICAgICAgYXNzZXJ0LmZhaWwoWGBBcnJheXMgbXVzdCBub3QgaGF2ZSBub24taW5kZXhlczogJHtjYW5kaWRhdGV9YCwgVHlwZUVycm9yKTtcbiAgfSxcbn0pOyRozY9fb25jZS5Db3B5QXJyYXlIZWxwZXIoQ29weUFycmF5SGVscGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkNvcHlBcnJheUhlbHBlciI6WyJDb3B5QXJyYXlIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARy+6HWcLAABnCwAAKQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9jb3B5UmVjb3JkLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL3JlbW90YWJsZS5qcyJdLCJleHBvcnRzIjpbIkNvcHlSZWNvcmRIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnRDaGVja2VyLGdldE93bkRhdGFEZXNjcmlwdG9yLENYLGNhbkJlTWV0aG9kOyRozY9faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiZ2V0T3duRGF0YURlc2NyaXB0b3JcIixbJGjNj19hID0+IChnZXRPd25EYXRhRGVzY3JpcHRvciA9ICRozY9fYSldXSxbXCJDWFwiLFskaM2PX2EgPT4gKENYID0gJGjNj19hKV1dXV0sW1wiLi9yZW1vdGFibGUuanNcIiwgW1tcImNhbkJlTWV0aG9kXCIsWyRozY9fYSA9PiAoY2FuQmVNZXRob2QgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGdldFByb3RvdHlwZU9mLCBwcm90b3R5cGU6IG9iamVjdFByb3RvdHlwZSB9ID0gT2JqZWN0O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gY2FuZGlkYXRlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqL1xuY29uc3QgY2hlY2tPYmplY3RQcm90b3R5cGUgPSAoY2FuZGlkYXRlLCBjaGVjayA9IHVuZGVmaW5lZCkgPT4ge1xuICByZXR1cm4gKFxuICAgIGdldFByb3RvdHlwZU9mKGNhbmRpZGF0ZSkgPT09IG9iamVjdFByb3RvdHlwZSB8fFxuICAgICghIWNoZWNrICYmXG4gICAgICBDWChjaGVjaylgUmVjb3JkcyBtdXN0IGluaGVyaXQgZnJvbSBPYmplY3QucHJvdG90eXBlOiAke2NhbmRpZGF0ZX1gKVxuICApO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGNhbmRpZGF0ZVxuICogQHBhcmFtIHtQcm9wZXJ0eUtleX0ga2V5XG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqL1xuY29uc3QgY2hlY2tQcm9wZXJ0eUNhbkJlVmFsaWQgPSAoY2FuZGlkYXRlLCBrZXksIHZhbHVlLCBjaGVjayA9IHVuZGVmaW5lZCkgPT4ge1xuICByZXR1cm4gKFxuICAgICh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyB8fFxuICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgQ1goXG4gICAgICAgICAgY2hlY2ssXG4gICAgICAgIClgUmVjb3JkcyBjYW4gb25seSBoYXZlIHN0cmluZy1uYW1lZCBwcm9wZXJ0aWVzOiAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgICAoIWNhbkJlTWV0aG9kKHZhbHVlKSB8fFxuICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgLyogVE9ETzogVXBkYXRlIG1lc3NhZ2Ugbm93IHRoYXQgdGhlcmUgaXMgbm8gc3VjaCB0aGluZyBhcyBcImltcGxpY2l0IFJlbW90YWJsZVwiLiovXG4gICAgICAgIENYKFxuICAgICAgICAgIGNoZWNrLFxuICAgICAgICApYFJlY29yZHMgY2Fubm90IGNvbnRhaW4gbm9uLWZhciBmdW5jdGlvbnMgYmVjYXVzZSB0aGV5IG1heSBiZSBtZXRob2RzIG9mIGFuIGltcGxpY2l0IFJlbW90YWJsZTogJHtjYW5kaWRhdGV9YCkpXG4gICk7XG59O1xuXG4vKipcbiAqXG4gKiBAdHlwZSB7SU1QT1JUKCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfVxuICovXG4gICAgICAgY29uc3QgQ29weVJlY29yZEhlbHBlciA9IGhhcmRlbih7XG4gIHN0eWxlTmFtZTogJ2NvcHlSZWNvcmQnLFxuXG4gIGNhbkJlVmFsaWQ6IChjYW5kaWRhdGUsIGNoZWNrID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgcmV0dXJuIChcbiAgICAgIGNoZWNrT2JqZWN0UHJvdG90eXBlKGNhbmRpZGF0ZSwgY2hlY2spICYmXG4gICAgICAvKiBSZWplY3QgYW55IGNhbmRpZGF0ZSB3aXRoIGEgc3ltYm9sLWtleWVkIHByb3BlcnR5IG9yIG1ldGhvZC1saWtlIHByb3BlcnR5Ki9cbiAgICAgIC8qIChzdWNoIGlucHV0IGlzIHBvdGVudGlhbGx5IGEgUmVtb3RhYmxlKS4qL1xuICAgICAgb3duS2V5cyhjYW5kaWRhdGUpLmV2ZXJ5KGtleSA9PlxuICAgICAgICBjaGVja1Byb3BlcnR5Q2FuQmVWYWxpZChjYW5kaWRhdGUsIGtleSwgY2FuZGlkYXRlW2tleV0sIGNoZWNrKSxcbiAgICAgIClcbiAgICApO1xuICB9LFxuXG4gIGFzc2VydFJlc3RWYWxpZDogKGNhbmRpZGF0ZSwgcGFzc1N0eWxlT2ZSZWN1cikgPT4ge1xuICAgIC8qIFZhbGlkYXRlIHRoYXQgZWFjaCBvd24gcHJvcGVydHkgaGFzIGEgcmVjdXJzaXZlbHkgcGFzc2FibGUgYXNzb2NpYXRlZCovXG4gICAgLyogdmFsdWUgKHdlIGFscmVhZHkga25vdyBmcm9tIGNhbkJlVmFsaWQgdGhhdCB0aGUgb3RoZXIgY29uc3RyYWludHMgYXJlKi9cbiAgICAvKiBzYXRpc2ZpZWQpLiovXG4gICAgZm9yIChjb25zdCBuYW1lIG9mIG93bktleXMoY2FuZGlkYXRlKSkge1xuICAgICAgY29uc3QgeyB2YWx1ZSB9ID0gZ2V0T3duRGF0YURlc2NyaXB0b3IoXG4gICAgICAgIGNhbmRpZGF0ZSxcbiAgICAgICAgbmFtZSxcbiAgICAgICAgdHJ1ZSxcbiAgICAgICAgYXNzZXJ0Q2hlY2tlcixcbiAgICAgICk7XG4gICAgICBwYXNzU3R5bGVPZlJlY3VyKHZhbHVlKTtcbiAgICB9XG4gIH0sXG59KTskaM2PX29uY2UuQ29weVJlY29yZEhlbHBlcihDb3B5UmVjb3JkSGVscGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IkNvcHlSZWNvcmRIZWxwZXIiOlsiQ29weVJlY29yZEhlbHBlciJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACeOsLT2BkAANgZAAAuAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL2RlZXBseUZ1bGZpbGxlZC5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vcHJvbWlzZS1raXQiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9wYXNzU3R5bGVPZi5qcyIsIi4vbWFrZVRhZ2dlZC5qcyIsIi4vdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbImRlZXBseUZ1bGZpbGxlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IFgscSxFLGlzUHJvbWlzZSxnZXRUYWcscGFzc1N0eWxlT2YsbWFrZVRhZ2dlZCxpc0F0b207JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLFskaM2PX2EgPT4gKEUgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsWyRozY9fYSA9PiAoaXNQcm9taXNlID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiZ2V0VGFnXCIsWyRozY9fYSA9PiAoZ2V0VGFnID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXV1dLFtcIi4vbWFrZVRhZ2dlZC5qc1wiLCBbW1wibWFrZVRhZ2dlZFwiLFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcImlzQXRvbVwiLFskaM2PX2EgPT4gKGlzQXRvbSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7UmVtb3RhYmxlQnJhbmR9IGZyb20gJ0BlbmRvL2V2ZW50dWFsLXNlbmQnO1xuICogQGltcG9ydCB7UGFzc2FibGUsIEJ5dGVBcnJheSwgQ29weVJlY29yZCwgQ29weUFycmF5LCBDb3B5VGFnZ2VkLCBSZW1vdGFibGVPYmplY3R9IGZyb20gJ0BlbmRvL3Bhc3Mtc3R5bGUnXG4gKi9cblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBmcm9tRW50cmllcyB9ID0gT2JqZWN0O1xuXG4vKipcbiAqIEN1cnJlbnRseSBjb3BpZWQgZnJvbSBAYWdvcmljL2ludGVybmFsIHV0aWxzLmpzLlxuICogVE9ETyBTaG91bGQgbWlncmF0ZSBoZXJlIGFuZCB0aGVuLCBpZiBuZWVkZWQsIHJlZXhwb3J0ZWQgdGhlcmUuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHt7IFtLZXlUeXBlIGluIGtleW9mIFRdOiBUW0tleVR5cGVdIH0gJiB7fX0gU2ltcGxpZnkgZmxhdHRlbiB0aGVcbiAqICAgdHlwZSBvdXRwdXQgdG8gaW1wcm92ZSB0eXBlIGhpbnRzIHNob3duIGluIGVkaXRvcnNcbiAqICAgaHR0cHM6Ly9naXRodWIuY29tL3NpbmRyZXNvcmh1cy90eXBlLWZlc3QvYmxvYi9tYWluL3NvdXJjZS9zaW1wbGlmeS5kLnRzXG4gKi9cblxuLyoqXG4gKiBDdXJyZW50bHkgY29waWVkIGZyb20gQGFnb3JpYy9pbnRlcm5hbCB1dGlscy5qcy5cbiAqIFRPRE8gU2hvdWxkIG1pZ3JhdGUgaGVyZSBhbmQgdGhlbiwgaWYgbmVlZGVkLCByZWV4cG9ydGVkIHRoZXJlLlxuICpcbiAqIEB0eXBlZGVmIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gQ2FsbGFibGVcbiAqL1xuXG4vKipcbiAqIEN1cnJlbnRseSBjb3BpZWQgZnJvbSBAYWdvcmljL2ludGVybmFsIHV0aWxzLmpzLlxuICogVE9ETyBTaG91bGQgbWlncmF0ZSBoZXJlIGFuZCB0aGVuLCBpZiBuZWVkZWQsIHJlZXhwb3J0ZWQgdGhlcmUuXG4gKlxuICogQHRlbXBsYXRlIHt7fX0gVFxuICogQHR5cGVkZWYge3tcbiAqICAgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBDYWxsYWJsZSA/IFRbS10gOiBEZWVwbHlBd2FpdGVkPFRbS10+O1xuICogfX0gRGVlcGx5QXdhaXRlZE9iamVjdFxuICovXG5cbi8qKlxuICogQ3VycmVudGx5IGNvcGllZCBmcm9tIEBhZ29yaWMvaW50ZXJuYWwgdXRpbHMuanMuXG4gKiBUT0RPIFNob3VsZCBtaWdyYXRlIGhlcmUgYW5kIHRoZW4sIGlmIG5lZWRlZCwgcmVleHBvcnRlZCB0aGVyZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1QgZXh0ZW5kcyBQcm9taXNlTGlrZTxhbnk+XG4gKiAgICAgPyBBd2FpdGVkPFQ+XG4gKiAgICAgOiBUIGV4dGVuZHMgKFJlbW90YWJsZUJyYW5kPGFueSwgYW55PiB8IFJlbW90YWJsZU9iamVjdClcbiAqICAgICAgID8gVFxuICogICAgICAgOiBUIGV4dGVuZHMge31cbiAqICAgICAgICAgPyBTaW1wbGlmeTxEZWVwbHlBd2FpdGVkT2JqZWN0PFQ+PlxuICogICAgICAgICA6IEF3YWl0ZWQ8VD59IERlZXBseUF3YWl0ZWRcbiAqL1xuXG4vKipcbiAqIEdpdmVuIGEgUGFzc2FibGUgYHZhbGAgd2hvc2UgcGFzcy1ieS1jb3B5IHN0cnVjdHVyZSBtYXkgY29udGFpbiBsZWFmXG4gKiBwcm9taXNlcywgcmV0dXJuIGEgcHJvbWlzZSBmb3IgYSByZXBsYWNlbWVudCBQYXNzYWJsZSxcbiAqIHdoZXJlIHRoYXQgcmVwbGFjZW1lbnQgaXMgKmRlZXBseSBmdWxmaWxsZWQqLCBpLmUuLCBpdHNcbiAqIHBhc3MtYnktY29weSBzdHJ1Y3R1cmUgZG9lcyBub3QgY29udGFpbiBhbnkgcHJvbWlzZXMuXG4gKlxuICogVGhpcyBpcyBhIGRlZXAgZm9ybSBvZiBgUHJvbWlzZS5hbGxgIHNwZWNpYWxpemVkIGZvciBQYXNzYWJsZXMuIEZvciBlYWNoXG4gKiBlbmNvdW50ZXJlZCBwcm9taXNlLCByZXBsYWNlIGl0IHdpdGggdGhlIGRlZXBseSBmdWxmaWxsZWQgZm9ybSBvZlxuICogaXRzIGZ1bGZpbGxtZW50LlxuICogSWYgYW55IG9mIHRoZSBwcm9taXNlcyByZWplY3QsIHRoZW4gdGhlIHByb21pc2UgZm9yIHRoZSByZXBsYWNlbWVudFxuICogcmVqZWN0cy4gSWYgYW55IG9mIHRoZSBwcm9taXNlcyBuZXZlciBzZXR0bGUsIHRoZW4gdGhlIHByb21pc2UgZm9yXG4gKiB0aGUgcmVwbGFjZW1lbnQgbmV2ZXIgc2V0dGxlcy5cbiAqXG4gKiBJZiB0aGUgcmVwbGFjZW1lbnQgd291bGQgbm90IGJlIFBhc3NhYmxlLCBpLmUuLCBpZiBgdmFsYCBpcyBub3RcbiAqIFBhc3NhYmxlLCBvciBpZiBhbnkgb2YgdGhlIHRyYW5zaXRpdmUgcHJvbWlzZXMgZnVsZmlsbCB0byBzb21ldGhpbmdcbiAqIHRoYXQgaXMgbm90IFBhc3NhYmxlLCB0aGVuIHRoZSByZXR1cm5lZCBwcm9taXNlIHJlamVjdHMuXG4gKlxuICogSWYgYHZhbGAgb3IgaXRzIHBhcnRzIGFyZSBub24ta2V5IFBhc3NhYmxlcyBvbmx5ICpiZWNhdXNlKiB0aGV5IGNvbnRhaW5cbiAqIHByb21pc2VzLCB0aGUgZGVlcGx5IGZ1bGZpbGxlZCBmb3JtcyBvZiB2YWwgb3IgaXRzIHBhcnRzIG1heSBiZSBrZXlzLiBUaGlzXG4gKiBpcyBmb3IgdGhlIGhpZ2hlciBcIkBlbmRvL3BhdHRlcm5zXCIgbGV2ZWwgb2YgYWJzdHJhY3Rpb24gdG8gZGV0ZXJtaW5lLFxuICogYmVjYXVzZSBpdCBkZWZpbmVzIHRoZSBgS2V5YCBub3Rpb24gaW4gcXVlc3Rpb24uXG4gKlxuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gW1Q9UGFzc2FibGVdXG4gKiBAcGFyYW0ge1R9IHZhbFxuICogQHJldHVybnMge1Byb21pc2U8RGVlcGx5QXdhaXRlZDxUPj59XG4gKi9cbiAgICAgICBjb25zdCBkZWVwbHlGdWxmaWxsZWQgPSBhc3luYyB2YWwgPT4ge1xuICAvKiBUT0RPIEZpZ3VyZSBvdXQgd2h5IHdlIG5lZWQgdGhlc2UgYXQtZXhwZWN0LWVycm9yIGRpcmVjdGl2ZXMgYmVsb3cqL1xuICAvKiBhbmQgZml4IGlmIHBvc3NpYmxlLiovXG4gIC8qIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMTI1NyBtYXkgYmUgcmVsZXZhbnQuKi9cblxuICAvKiBJZiBgdmFsYCBpcyBub3QgUGFzc2FibGUsIGBpc0F0b21gIHdpbGwgcmV0dXJuIGZhbHNlIHJhdGhlciB0aGFuKi9cbiAgLyogdGhyb3dpbmcuKi9cbiAgaWYgKGlzQXRvbSh2YWwpKSB7XG4gICAgcmV0dXJuIC8qKiBAdHlwZSB7RGVlcGx5QXdhaXRlZDxUPn0gKi8gKHZhbCk7XG4gIH1cbiAgLyogaWYgYHZhbGAgaXMgYSBwcm9taXNlIGJ1dCBub3QgYSBwYXNzYWJsZSBwcm9taXNlLCBmb3IgZXhhbXBsZSwqL1xuICAvKiBiZWNhdXNlIGl0IGlzIG5vdCBoYXJkZW5lZCwgYGlzUHJvbWlzZWAgd2lsbCByZXR1cm4gdHJ1ZSwgd2hpY2ggaXMqL1xuICAvKiBvayBoZXJlIGJhY2F1c2Ugd2UgdW53cmFwIGl0IHRvIGl0cyBzZXR0bGVtZW50IGFuZCBkaXNwZW5zZSB3aXRoIHRoZSovXG4gIC8qIHByb21pc2UqL1xuICBpZiAoaXNQcm9taXNlKHZhbCkpIHtcbiAgICByZXR1cm4gRS53aGVuKHZhbCwgbm9ucCA9PiBkZWVwbHlGdWxmaWxsZWQobm9ucCkpO1xuICB9XG4gIC8qIElmIGB2YWxgIGlzIGFueSBvdGhlciBub24tUGFzc2FibGUsIHRoZSBgcGFzc1N0eWxlT2YodmFsKWAgd2lsbCB0aHJvdy4qL1xuICAvKiBTbyB0aGlzIGV4ZW1wdGlvbiBmb3Igbm9uLVBhc3NhYmxlIHByb21pc2VzIGlzIG9ubHkgZm9yIHRoZSB0b3AtbGV2ZWwuKi9cbiAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YodmFsKTtcbiAgc3dpdGNoIChwYXNzU3R5bGUpIHtcbiAgICBjYXNlICdjb3B5UmVjb3JkJzoge1xuICAgICAgY29uc3QgcmVjID0gLyoqIEB0eXBlIHtDb3B5UmVjb3JkfSAqLyAodmFsKTtcbiAgICAgIGNvbnN0IG5hbWVzID0gLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi8gKG93bktleXMocmVjKSk7XG4gICAgICBjb25zdCB2YWxQcyA9IG5hbWVzLm1hcChuYW1lID0+IGRlZXBseUZ1bGZpbGxlZChyZWNbbmFtZV0pKTtcbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3Igbm90IGFzc2lnbmFibGUgdG8gdHlwZSAnRGVlcGx5QXdhaXRlZDxUPicqL1xuICAgICAgcmV0dXJuIEUud2hlbihQcm9taXNlLmFsbCh2YWxQcyksIHZhbHMgPT5cbiAgICAgICAgaGFyZGVuKGZyb21FbnRyaWVzKHZhbHMubWFwKChjLCBpKSA9PiBbbmFtZXNbaV0sIGNdKSkpLFxuICAgICAgKTtcbiAgICB9XG4gICAgY2FzZSAnY29weUFycmF5Jzoge1xuICAgICAgY29uc3QgYXJyID0gLyoqIEB0eXBlIHtDb3B5QXJyYXl9ICovICh2YWwpO1xuICAgICAgY29uc3QgdmFsUHMgPSBhcnIubWFwKHAgPT4gZGVlcGx5RnVsZmlsbGVkKHApKTtcbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3Igbm90IGFzc2lnbmFibGUgdG8gdHlwZSAnRGVlcGx5QXdhaXRlZDxUPicqL1xuICAgICAgcmV0dXJuIEUud2hlbihQcm9taXNlLmFsbCh2YWxQcyksIHZhbHMgPT4gaGFyZGVuKHZhbHMpKTtcbiAgICB9XG4gICAgY2FzZSAnYnl0ZUFycmF5Jzoge1xuICAgICAgY29uc3QgYnl0ZUFycmF5ID0gLyoqIEB0eXBlIHtCeXRlQXJyYXl9ICovICgvKiogQHR5cGUge3Vua25vd259ICovICh2YWwpKTtcbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3Igbm90IGFzc2lnbmFibGUgdG8gdHlwZSAnRGVlcGx5QXdhaXRlZDxUPicqL1xuICAgICAgcmV0dXJuIGJ5dGVBcnJheTtcbiAgICB9XG4gICAgY2FzZSAndGFnZ2VkJzoge1xuICAgICAgY29uc3QgdGdkID0gLyoqIEB0eXBlIHtDb3B5VGFnZ2VkfSAqLyAodmFsKTtcbiAgICAgIGNvbnN0IHRhZyA9IGdldFRhZyh0Z2QpO1xuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBub3QgYXNzaWduYWJsZSB0byB0eXBlICdEZWVwbHlBd2FpdGVkPFQ+JyovXG4gICAgICByZXR1cm4gRS53aGVuKGRlZXBseUZ1bGZpbGxlZCh0Z2QucGF5bG9hZCksIHBheWxvYWQgPT5cbiAgICAgICAgbWFrZVRhZ2dlZCh0YWcsIHBheWxvYWQpLFxuICAgICAgKTtcbiAgICB9XG4gICAgY2FzZSAncmVtb3RhYmxlJzoge1xuICAgICAgY29uc3QgcmVtID0gLyoqIEB0eXBlIHtSZW1vdGFibGVPYmplY3R9ICovICh2YWwpO1xuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBub3QgYXNzaWduYWJsZSB0byB0eXBlICdEZWVwbHlBd2FpdGVkPFQ+JyovXG4gICAgICByZXR1cm4gcmVtO1xuICAgIH1cbiAgICBjYXNlICdlcnJvcic6IHtcbiAgICAgIGNvbnN0IGVyciA9IC8qKiBAdHlwZSB7RXJyb3J9ICovICh2YWwpO1xuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBub3QgYXNzaWduYWJsZSB0byB0eXBlICdEZWVwbHlBd2FpdGVkPFQ+JyovXG4gICAgICByZXR1cm4gZXJyO1xuICAgIH1cbiAgICBjYXNlICdwcm9taXNlJzoge1xuICAgICAgY29uc3QgcHJvbSA9IC8qKiBAdHlwZSB7UHJvbWlzZX0gKi8gKC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKHZhbCkpO1xuICAgICAgcmV0dXJuIEUud2hlbihwcm9tLCBub25wID0+IGRlZXBseUZ1bGZpbGxlZChub25wKSk7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIHRocm93IGFzc2VydC5mYWlsKFhgVW5leHBlY3RlZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9YCwgVHlwZUVycm9yKTtcbiAgICB9XG4gIH1cbn07JGjNj19vbmNlLmRlZXBseUZ1bGZpbGxlZChkZWVwbHlGdWxmaWxsZWQpO1xuaGFyZGVuKGRlZXBseUZ1bGZpbGxlZCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWVwbHlGdWxmaWxsZWQiOlsiZGVlcGx5RnVsZmlsbGVkIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGrLJkbNHQAAzR0AACQAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvZXJyb3IuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyJdLCJleHBvcnRzIjpbIkVycm9ySGVscGVyIiwiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IiLCJjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyIsImdldEVycm9yQ29uc3RydWN0b3IiLCJpc0Vycm9yTGlrZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHEsYXNzZXJ0Q2hlY2tlcixDWDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJDWFwiLFskaM2PX2EgPT4gKENYID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLyoqIEBpbXBvcnQge1Bhc3NTdHlsZUhlbHBlcn0gZnJvbSAnLi9pbnRlcm5hbC10eXBlcy5qcycgKi9cbi8qKiBAaW1wb3J0IHtDaGVja2VyLCBQYXNzU3R5bGUsIFBhc3NTdHlsZU9mfSBmcm9tICcuL3R5cGVzLmpzJyAqL1xuXG5jb25zdCB7IGdldFByb3RvdHlwZU9mLCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLCBoYXNPd24sIGVudHJpZXMgfSA9IE9iamVjdDtcblxuLyogVE9ETzogTWFpbnRlbmFuY2UgaGF6YXJkOiBDb29yZGluYXRlIHdpdGggdGhlIGxpc3Qgb2YgZXJyb3JzIGluIHRoZSBTRVMqL1xuLyogd2hpbGVsaXN0LiovXG5jb25zdCBlcnJvckNvbnN0cnVjdG9ycyA9IG5ldyBNYXAoXG4gIC8qIENhc3QgYmVjYXVzZSBvdGhlcndpc2UgVFMgaXMgY29uZnVzZWQgYnkgQWdncmVnYXRlRXJyb3IqL1xuICAvKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMjA0MiNkaXNjdXNzaW9uX3IxNDg0OTMzMDI4Ki9cbiAgLyoqIEB0eXBlIHtBcnJheTxbc3RyaW5nLCBJTVBPUlQoJ3NlcycpLkdlbmVyaWNFcnJvckNvbnN0cnVjdG9yXT59ICovXG4gIChbXG4gICAgWydFcnJvcicsIEVycm9yXSxcbiAgICBbJ0V2YWxFcnJvcicsIEV2YWxFcnJvcl0sXG4gICAgWydSYW5nZUVycm9yJywgUmFuZ2VFcnJvcl0sXG4gICAgWydSZWZlcmVuY2VFcnJvcicsIFJlZmVyZW5jZUVycm9yXSxcbiAgICBbJ1N5bnRheEVycm9yJywgU3ludGF4RXJyb3JdLFxuICAgIFsnVHlwZUVycm9yJywgVHlwZUVycm9yXSxcbiAgICBbJ1VSSUVycm9yJywgVVJJRXJyb3JdXG5cbiAgICAvKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzU1MCovXG4gICAgLyogVG8gYWNjb21tb2RhdGUgcGxhdGZvcm1zIHByaW9yIHRvIEFnZ3JlZ2F0ZUVycm9yLCB3ZSBjb21tZW50IG91dCB0aGUqL1xuICAgIC8qIGZvbGxvd2luZyBsaW5lIGFuZCBpbnN0ZWFkIGNvbmRpdGlvbmFsbHkgYWRkIGl0IHRvIHRoZSBtYXAgYmVsb3cuKi9cbiAgICAvKiBbJ0FnZ3JlZ2F0ZUVycm9yJywgQWdncmVnYXRlRXJyb3JdLCovXG4gIF0pLFxuKTtcblxuaWYgKHR5cGVvZiBBZ2dyZWdhdGVFcnJvciAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgLyogQ29uZGl0aW9uYWwsIHRvIGFjY29tbW9kYXRlIHBsYXRmb3JtcyBwcmlvciB0byBBZ2dyZWdhdGVFcnJvciovXG4gIGVycm9yQ29uc3RydWN0b3JzLnNldCgnQWdncmVnYXRlRXJyb3InLCBBZ2dyZWdhdGVFcnJvcik7XG59XG5cbi8qKlxuICogQmVjYXVzZSB0aGUgZXJyb3IgY29uc3RydWN0b3IgcmV0dXJuZWQgYnkgdGhpcyBmdW5jdGlvbiBtaWdodCBiZVxuICogYEFnZ3JlZ2F0ZUVycm9yYCwgd2hpY2ggaGFzIGRpZmZlcmVudCBjb25zdHJ1Y3Rpb24gcGFyYW1ldGVyc1xuICogZnJvbSB0aGUgb3RoZXIgZXJyb3IgY29uc3RydWN0b3JzLCBkbyBub3QgdXNlIGl0IGRpcmVjdGx5IHRvIHRyeVxuICogdG8gbWFrZSBhbiBlcnJvciBpbnN0YW5jZS4gUmF0aGVyLCB1c2UgYG1ha2VFcnJvcmAgd2hpY2ggZW5jYXBzdWxhdGVzXG4gKiB0aGlzIG5vbi11bmlmb3JtaXR5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcmV0dXJucyB7SU1QT1JUKCdzZXMnKS5HZW5lcmljRXJyb3JDb25zdHJ1Y3RvciB8IHVuZGVmaW5lZH1cbiAqL1xuICAgICAgIGNvbnN0IGdldEVycm9yQ29uc3RydWN0b3IgPSBuYW1lID0+IGVycm9yQ29uc3RydWN0b3JzLmdldChuYW1lKTskaM2PX29uY2UuZ2V0RXJyb3JDb25zdHJ1Y3RvcihnZXRFcnJvckNvbnN0cnVjdG9yKTtcbmhhcmRlbihnZXRFcnJvckNvbnN0cnVjdG9yKTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGNhbmRpZGF0ZVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tFcnJvckxpa2UgPSAoY2FuZGlkYXRlLCBjaGVjayA9IHVuZGVmaW5lZCkgPT4ge1xuICAvKiBUT0RPOiBOZWVkIGEgYmV0dGVyIHRlc3QgdGhhbiBpbnN0YW5jZW9mKi9cbiAgcmV0dXJuIChcbiAgICBjYW5kaWRhdGUgaW5zdGFuY2VvZiBFcnJvciB8fFxuICAgICghIWNoZWNrICYmIENYKGNoZWNrKWBFcnJvciBleHBlY3RlZDogJHtjYW5kaWRhdGV9YClcbiAgKTtcbn07XG5oYXJkZW4oY2hlY2tFcnJvckxpa2UpO1xuLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqXG4gKiBWYWxpZGF0aW5nIGVycm9yIG9iamVjdHMgYXJlIHBhc3NhYmxlIHJhaXNlcyBhIHRlbnNpb24gYmV0d2VlbiBzZWN1cml0eVxuICogdnMgcHJlc2VydmluZyBkaWFnbm9zdGljIGluZm9ybWF0aW9uLiBGb3IgZXJyb3JzLCB3ZSBuZWVkIHRvIHJlbWVtYmVyXG4gKiB0aGUgZXJyb3IgaXRzZWxmIGV4aXN0cyB0byBoZWxwIHVzIGRpYWdub3NlIGEgYnVnIHRoYXQncyBsaWtlbHkgbW9yZVxuICogcHJlc3NpbmcgdGhhbiBhIHZhbGlkaXR5IGJ1ZyBpbiB0aGUgZXJyb3IgaXRzZWxmLiBUaHVzLCB3aGVuZXZlciBpdCBpcyBzYWZlXG4gKiB0byBkbyBzbywgd2UgcHJlZmVyIHRvIGxldCB0aGUgZXJyb3ItbGlrZSB0ZXN0IHN1Y2NlZWQgYW5kIHRvIGNvdWNoIHRoZXNlXG4gKiBjb21wbGFpbnRzIGFzIG5vdGVzIG9uIHRoZSBlcnJvci5cbiAqXG4gKiBUbyByZXNvbHZlIHRoaXMsIHN1Y2ggYSBtYWxmb3JtZWQgZXJyb3Igb2JqZWN0IHdpbGwgc3RpbGwgcGFzc1xuICogYGlzRXJyb3JMaWtlYCBzbyBtYXJzaGFsIGNhbiB1c2UgdGhpcyBmb3IgdG9wIGxldmVsIGVycm9yIHRvIHJlcG9ydCBmcm9tLFxuICogZXZlbiBpZiBpdCB3b3VsZCBub3QgYWN0dWFsbHkgdmFsaWRhdGUuXG4gKiBJbnN0ZWFkLCB0aGUgZGlhZ25vc3RpY3MgdGhhdCBgYXNzZXJ0RXJyb3JgIHdvdWxkIGhhdmUgcmVwb3J0ZWQgYXJlXG4gKiBhdHRhY2hlZCBhcyBub3RlcyB0byB0aGUgbWFsZm9ybWVkIGVycm9yLiBUaHVzLCBhIG1hbGZvcm1lZFxuICogZXJyb3IgaXMgcGFzc2FibGUgYnkgaXRzZWxmLCBidXQgbm90IGFzIHBhcnQgb2YgYSBwYXNzYWJsZSBzdHJ1Y3R1cmUuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBjYW5kaWRhdGVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gICAgICAgY29uc3QgaXNFcnJvckxpa2UgPSBjYW5kaWRhdGUgPT4gY2hlY2tFcnJvckxpa2UoY2FuZGlkYXRlKTskaM2PX29uY2UuaXNFcnJvckxpa2UoaXNFcnJvckxpa2UpO1xuaGFyZGVuKGlzRXJyb3JMaWtlKTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvcE5hbWVcbiAqIEBwYXJhbSB7UHJvcGVydHlEZXNjcmlwdG9yfSBkZXNjXG4gKiBAcGFyYW0geyh2YWw6IGFueSkgPT4gUGFzc1N0eWxlfSBwYXNzU3R5bGVPZlJlY3VyXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gICAgICAgY29uc3QgY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MgPSAoXG4gIHByb3BOYW1lLFxuICBkZXNjLFxuICBwYXNzU3R5bGVPZlJlY3VyLFxuICBjaGVjayA9IHVuZGVmaW5lZCxcbikgPT4ge1xuICBpZiAoZGVzYy5lbnVtZXJhYmxlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhY2hlY2sgJiZcbiAgICAgIENYKGNoZWNrKWBQYXNzYWJsZSBFcnJvciAke3EoXG4gICAgICAgIHByb3BOYW1lLFxuICAgICAgKX0gb3duIHByb3BlcnR5IG11c3Qgbm90IGJlIGVudW1lcmFibGU6ICR7ZGVzY31gXG4gICAgKTtcbiAgfVxuICBpZiAoIWhhc093bihkZXNjLCAndmFsdWUnKSkge1xuICAgIHJldHVybiAoXG4gICAgICAhIWNoZWNrICYmXG4gICAgICBDWChjaGVjaylgUGFzc2FibGUgRXJyb3IgJHtxKFxuICAgICAgICBwcm9wTmFtZSxcbiAgICAgICl9IG93biBwcm9wZXJ0eSBtdXN0IGJlIGEgZGF0YSBwcm9wZXJ0eTogJHtkZXNjfWBcbiAgICApO1xuICB9XG4gIGNvbnN0IHsgdmFsdWUgfSA9IGRlc2M7XG4gIHN3aXRjaCAocHJvcE5hbWUpIHtcbiAgICBjYXNlICdtZXNzYWdlJzpcbiAgICBjYXNlICdzdGFjayc6IHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICBDWChjaGVjaylgUGFzc2FibGUgRXJyb3IgJHtxKFxuICAgICAgICAgICAgcHJvcE5hbWUsXG4gICAgICAgICAgKX0gb3duIHByb3BlcnR5IG11c3QgYmUgYSBzdHJpbmc6ICR7dmFsdWV9YClcbiAgICAgICk7XG4gICAgfVxuICAgIGNhc2UgJ2NhdXNlJzoge1xuICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICAgIHJldHVybiBjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcih2YWx1ZSwgcGFzc1N0eWxlT2ZSZWN1ciwgY2hlY2spO1xuICAgIH1cbiAgICBjYXNlICdlcnJvcnMnOiB7XG4gICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpIHx8IHBhc3NTdHlsZU9mUmVjdXIodmFsdWUpICE9PSAnY29weUFycmF5Jykge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICEhY2hlY2sgJiZcbiAgICAgICAgICBDWChjaGVjaylgUGFzc2FibGUgRXJyb3IgJHtxKFxuICAgICAgICAgICAgcHJvcE5hbWUsXG4gICAgICAgICAgKX0gb3duIHByb3BlcnR5IG11c3QgYmUgYSBjb3B5QXJyYXk6ICR7dmFsdWV9YFxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHZhbHVlLmV2ZXJ5KGVyciA9PlxuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgICAgICBjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvcihlcnIsIHBhc3NTdHlsZU9mUmVjdXIsIGNoZWNrKSxcbiAgICAgICk7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gKFxuICAgICEhY2hlY2sgJiZcbiAgICBDWChjaGVjaylgUGFzc2FibGUgRXJyb3IgaGFzIGV4dHJhIHVucGFzc2VkIHByb3BlcnR5ICR7cShwcm9wTmFtZSl9YFxuICApO1xufTskaM2PX29uY2UuY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MoY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MpO1xuaGFyZGVuKGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKTtcblxuLyoqXG4gKiBAcGFyYW0ge3Vua25vd259IGNhbmRpZGF0ZVxuICogQHBhcmFtIHsodmFsOiBhbnkpID0+IFBhc3NTdHlsZX0gcGFzc1N0eWxlT2ZSZWN1clxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICAgICAgIGNvbnN0IGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yID0gKFxuICBjYW5kaWRhdGUsXG4gIHBhc3NTdHlsZU9mUmVjdXIsXG4gIGNoZWNrID0gdW5kZWZpbmVkLFxuKSA9PiB7XG4gIGlmICghY2hlY2tFcnJvckxpa2UoY2FuZGlkYXRlLCBjaGVjaykpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgcHJvdG8gPSBnZXRQcm90b3R5cGVPZihjYW5kaWRhdGUpO1xuICBjb25zdCB7IG5hbWUgfSA9IHByb3RvO1xuICBjb25zdCBlcnJDb25zdHJ1Y3RvciA9IGdldEVycm9yQ29uc3RydWN0b3IobmFtZSk7XG4gIGlmIChlcnJDb25zdHJ1Y3RvciA9PT0gdW5kZWZpbmVkIHx8IGVyckNvbnN0cnVjdG9yLnByb3RvdHlwZSAhPT0gcHJvdG8pIHtcbiAgICByZXR1cm4gKFxuICAgICAgISFjaGVjayAmJlxuICAgICAgQ1goXG4gICAgICAgIGNoZWNrLFxuICAgICAgKWBQYXNzYWJsZSBFcnJvciBtdXN0IGluaGVyaXQgZnJvbSBhbiBlcnJvciBjbGFzcyAucHJvdG90eXBlOiAke2NhbmRpZGF0ZX1gXG4gICAgKTtcbiAgfVxuICBjb25zdCBkZXNjcyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY2FuZGlkYXRlKTtcbiAgaWYgKCEoJ21lc3NhZ2UnIGluIGRlc2NzKSkge1xuICAgIHJldHVybiAoXG4gICAgICAhIWNoZWNrICYmXG4gICAgICBDWChcbiAgICAgICAgY2hlY2ssXG4gICAgICApYFBhc3NhYmxlIEVycm9yIG11c3QgaGF2ZSBhbiBvd24gXCJtZXNzYWdlXCIgc3RyaW5nIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBlbnRyaWVzKGRlc2NzKS5ldmVyeSgoW3Byb3BOYW1lLCBkZXNjXSkgPT5cbiAgICBjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvclByb3BlcnR5RGVzYyhcbiAgICAgIHByb3BOYW1lLFxuICAgICAgZGVzYyxcbiAgICAgIHBhc3NTdHlsZU9mUmVjdXIsXG4gICAgICBjaGVjayxcbiAgICApLFxuICApO1xufTskaM2PX29uY2UuY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IoY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IpO1xuaGFyZGVuKGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yKTtcblxuLyoqXG4gKiBAdHlwZSB7UGFzc1N0eWxlSGVscGVyfVxuICovXG4gICAgICAgY29uc3QgRXJyb3JIZWxwZXIgPSBoYXJkZW4oe1xuICBzdHlsZU5hbWU6ICdlcnJvcicsXG5cbiAgY2FuQmVWYWxpZDogY2hlY2tFcnJvckxpa2UsXG5cbiAgYXNzZXJ0UmVzdFZhbGlkOiAoY2FuZGlkYXRlLCBwYXNzU3R5bGVPZlJlY3VyKSA9PlxuICAgIGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yKGNhbmRpZGF0ZSwgcGFzc1N0eWxlT2ZSZWN1ciwgYXNzZXJ0Q2hlY2tlciksXG59KTskaM2PX29uY2UuRXJyb3JIZWxwZXIoRXJyb3JIZWxwZXIpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0RXJyb3JDb25zdHJ1Y3RvciI6WyJnZXRFcnJvckNvbnN0cnVjdG9yIl0sImlzRXJyb3JMaWtlIjpbImlzRXJyb3JMaWtlIl0sImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjIjpbImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjIl0sImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yIjpbImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yIl0sIkVycm9ySGVscGVyIjpbIkVycm9ySGVscGVyIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHsGinp8CQAAfAkAACsAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvaXRlci1oZWxwZXJzLmpzeyJpbXBvcnRzIjpbIi4vbWFrZS1mYXIuanMiXSwiZXhwb3J0cyI6WyJmaWx0ZXJJdGVyYWJsZSIsIm1hcEl0ZXJhYmxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFyOyRozY9faW1wb3J0cyhbW1wiLi9tYWtlLWZhci5qc1wiLCBbW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dXV1dKTtcblxuLyoqXG4gKiBUaGUgcmVzdWx0IGl0ZXJhdG9yIGhhcyBhcyBtYW55IGVsZW1lbnRzIGFzIHRoZSBgYmFzZUl0ZXJhdG9yYCBhbmRcbiAqIGhhdmUgdGhlIHNhbWUgdGVybWluYXRpb24gLS0gdGhlIHNhbWUgY29tcGxldGlvbiB2YWx1ZSBvciBmYWlsdXJlXG4gKiByZWFzb24uIEJ1dCB0aGUgbm9uLWZpbmFsIHZhbHVlcyBhcmUgdGhlIGNvcnJlc3BvbmRpbmcgbm9uLWZpbmFsXG4gKiB2YWx1ZXMgZnJvbSBgYmFzZUl0ZXJhdG9yYCBhcyB0cmFuc2Zvcm1lZCBieSBgZnVuY2AuXG4gKlxuICogQHRlbXBsYXRlIFQsVVxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gYmFzZUl0ZXJhYmxlXG4gKiBAcGFyYW0geyh2YWx1ZTogVCkgPT4gVX0gZnVuY1xuICogQHJldHVybnMge0l0ZXJhYmxlPFU+fVxuICovXG4gICAgICAgY29uc3QgbWFwSXRlcmFibGUgPSAoYmFzZUl0ZXJhYmxlLCBmdW5jKSA9PlxuICAvKiogQHR5cGUge0l0ZXJhYmxlPFU+fSAqL1xuICBGYXIoJ21hcHBlZCBpdGVyYWJsZScsIHtcbiAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgY29uc3QgYmFzZUl0ZXJhdG9yID0gYmFzZUl0ZXJhYmxlW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICAgIHJldHVybiBGYXIoJ21hcHBlZCBpdGVyYXRvcicsIHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgdmFsdWU6IGJhc2VWYWx1ZSwgZG9uZSB9ID0gYmFzZUl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICBjb25zdCB2YWx1ZSA9IGRvbmUgPyBiYXNlVmFsdWUgOiBmdW5jKGJhc2VWYWx1ZSk7XG4gICAgICAgICAgcmV0dXJuIGhhcmRlbih7IHZhbHVlLCBkb25lIH0pO1xuICAgICAgICB9LFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7JGjNj19vbmNlLm1hcEl0ZXJhYmxlKG1hcEl0ZXJhYmxlKTtcbmhhcmRlbihtYXBJdGVyYWJsZSk7XG5cbi8qKlxuICogVGhlIHJlc3VsdCBpdGVyYXRvciBoYXMgYSBzdWJzZXQgb2YgdGhlIG5vbi1maW5hbCB2YWx1ZXMgZnJvbSB0aGVcbiAqIGBiYXNlSXRlcmF0b3JgIC0tLSB0aG9zZSBmb3Igd2hpY2ggYHByZWQodmFsdWUpYCB3YXMgdHJ1dGh5LiBUaGUgcmVzdWx0XG4gKiBoYXMgdGhlIHNhbWUgdGVybWluYXRpb24gYXMgdGhlIGBiYXNlSXRlcmF0b3JgIC0tIHRoZSBzYW1lIGNvbXBsZXRpb24gdmFsdWVcbiAqIG9yIGZhaWx1cmUgcmVhc29uLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFQ+fSBiYXNlSXRlcmFibGVcbiAqIEBwYXJhbSB7KHZhbHVlOiBUKSA9PiBib29sZWFufSBwcmVkXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8VD59XG4gKi9cbiAgICAgICBjb25zdCBmaWx0ZXJJdGVyYWJsZSA9IChiYXNlSXRlcmFibGUsIHByZWQpID0+XG4gIC8qKiBAdHlwZSB7SXRlcmFibGU8VT59ICovXG4gIEZhcignZmlsdGVyZWQgaXRlcmFibGUnLCB7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIGNvbnN0IGJhc2VJdGVyYXRvciA9IGJhc2VJdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgICByZXR1cm4gRmFyKCdmaWx0ZXJlZCBpdGVyYXRvcicsIHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGJhc2VJdGVyYXRvci5uZXh0KCk7XG4gICAgICAgICAgICBjb25zdCB7IHZhbHVlLCBkb25lIH0gPSByZXN1bHQ7XG4gICAgICAgICAgICBpZiAoZG9uZSB8fCBwcmVkKHZhbHVlKSkge1xuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pOyRozY9fb25jZS5maWx0ZXJJdGVyYWJsZShmaWx0ZXJJdGVyYWJsZSk7XG5oYXJkZW4oZmlsdGVySXRlcmFibGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFwSXRlcmFibGUiOlsibWFwSXRlcmFibGUiXSwiZmlsdGVySXRlcmFibGUiOlsiZmlsdGVySXRlcmFibGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAoSeMyfQlAAD0JQAAJwAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9tYWtlLWZhci5qc3siaW1wb3J0cyI6WyJAZW5kby9ldmVudHVhbC1zZW5kL3V0aWxzLmpzIiwiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vcmVtb3RhYmxlLmpzIl0sImV4cG9ydHMiOlsiRmFyIiwiR0VUX01FVEhPRF9OQU1FUyIsIlJlbW90YWJsZSIsIlRvRmFyRnVuY3Rpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBnZXRNZXRob2ROYW1lcyxxLEZhaWwsYXNzZXJ0Q2hlY2tlcixQQVNTX1NUWUxFLGFzc2VydElmYWNlLGdldEludGVyZmFjZU9mLFJlbW90YWJsZUhlbHBlcjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanNcIiwgW1tcImdldE1ldGhvZE5hbWVzXCIsWyRozY9fYSA9PiAoZ2V0TWV0aG9kTmFtZXMgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiUEFTU19TVFlMRVwiLFskaM2PX2EgPT4gKFBBU1NfU1RZTEUgPSAkaM2PX2EpXV1dXSxbXCIuL3JlbW90YWJsZS5qc1wiLCBbW1wiYXNzZXJ0SWZhY2VcIixbJGjNj19hID0+IChhc3NlcnRJZmFjZSA9ICRozY9fYSldXSxbXCJnZXRJbnRlcmZhY2VPZlwiLFskaM2PX2EgPT4gKGdldEludGVyZmFjZU9mID0gJGjNj19hKV1dLFtcIlJlbW90YWJsZUhlbHBlclwiLFskaM2PX2EgPT4gKFJlbW90YWJsZUhlbHBlciA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG4vKiogQGltcG9ydCB7UmVtb3RhYmxlQnJhbmR9IGZyb20gJ0BlbmRvL2V2ZW50dWFsLXNlbmQnICovXG4vKiogQGltcG9ydCB7SW50ZXJmYWNlU3BlYywgUmVtb3RhYmxlT2JqZWN0fSBmcm9tICcuL3R5cGVzLmpzJyAqL1xuXG5jb25zdCB7IHByb3RvdHlwZTogZnVuY3Rpb25Qcm90b3R5cGUgfSA9IEZ1bmN0aW9uO1xuY29uc3Qge1xuICBnZXRQcm90b3R5cGVPZixcbiAgc2V0UHJvdG90eXBlT2YsXG4gIGNyZWF0ZSxcbiAgaXNGcm96ZW4sXG4gIHByb3RvdHlwZTogb2JqZWN0UHJvdG90eXBlLFxufSA9IE9iamVjdDtcblxuLyoqXG4gKiBOb3cgdGhhdCB0aGUgcmVtb3RhYmxlUHJvdG8gZG9lcyBub3QgcHJvdmlkZSBpdHMgb3duIGB0b1N0cmluZ2AgbWV0aG9kLFxuICogZW5zdXJlIGl0IGFsd2F5cyBpbmhlcml0cyBmcm9tIHNvbWV0aGluZy4gVGhlIG9yaWdpbmFsIHByb3RvdHlwZSBvZlxuICogYHJlbW90YWJsZWAgaWYgdGhlcmUgd2FzIG9uZSwgb3IgYE9iamVjdC5wcm90b3R5cGVgIG90aGVyd2lzZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gcmVtb3RhYmxlXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IGlmYWNlXG4gKiBAcmV0dXJucyB7b2JqZWN0fVxuICovXG5jb25zdCBtYWtlUmVtb3RhYmxlUHJvdG8gPSAocmVtb3RhYmxlLCBpZmFjZSkgPT4ge1xuICBsZXQgb2xkUHJvdG8gPSBnZXRQcm90b3R5cGVPZihyZW1vdGFibGUpO1xuICBpZiAodHlwZW9mIHJlbW90YWJsZSA9PT0gJ29iamVjdCcpIHtcbiAgICBpZiAob2xkUHJvdG8gPT09IG51bGwpIHtcbiAgICAgIG9sZFByb3RvID0gb2JqZWN0UHJvdG90eXBlO1xuICAgIH1cbiAgICBvbGRQcm90byA9PT0gb2JqZWN0UHJvdG90eXBlIHx8XG4gICAgICBGYWlsYEZvciBub3csIHJlbW90YWJsZXMgY2Fubm90IGluaGVyaXQgZnJvbSBhbnl0aGluZyB1bnVzdWFsLCBpbiAke3JlbW90YWJsZX1gO1xuICB9IGVsc2UgaWYgKHR5cGVvZiByZW1vdGFibGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICBvbGRQcm90byAhPT0gbnVsbCB8fFxuICAgICAgRmFpbGBPcmlnaW5hbCBmdW5jdGlvbiBtdXN0IG5vdCBpbmhlcml0IGZyb20gbnVsbDogJHtyZW1vdGFibGV9YDtcbiAgICBvbGRQcm90byA9PT0gZnVuY3Rpb25Qcm90b3R5cGUgfHxcbiAgICAgIGdldFByb3RvdHlwZU9mKG9sZFByb3RvKSA9PT0gZnVuY3Rpb25Qcm90b3R5cGUgfHxcbiAgICAgIEZhaWxgRmFyIGZ1bmN0aW9ucyBtdXN0IG9yaWdpbmFsbHkgaW5oZXJpdCBmcm9tIEZ1bmN0aW9uLnByb3RvdHlwZSwgaW4gJHtyZW1vdGFibGV9YDtcbiAgfSBlbHNlIHtcbiAgICBGYWlsYHVucmVjb2duaXplZCB0eXBlb2YgJHtyZW1vdGFibGV9YDtcbiAgfVxuICByZXR1cm4gaGFyZGVuKFxuICAgIGNyZWF0ZShvbGRQcm90bywge1xuICAgICAgW1BBU1NfU1RZTEVdOiB7IHZhbHVlOiAncmVtb3RhYmxlJyB9LFxuICAgICAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHsgdmFsdWU6IGlmYWNlIH0sXG4gICAgfSksXG4gICk7XG59O1xuXG5jb25zdCBhc3NlcnRDYW5CZVJlbW90YWJsZSA9IGNhbmRpZGF0ZSA9PlxuICBSZW1vdGFibGVIZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsIGFzc2VydENoZWNrZXIpO1xuXG4vKipcbiAqIENyZWF0ZSBhbmQgcmVnaXN0ZXIgYSBSZW1vdGFibGUuICBBZnRlciB0aGlzLCBnZXRJbnRlcmZhY2VPZihyZW1vdGFibGUpXG4gKiByZXR1cm5zIGlmYWNlLlxuICpcbiAqIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvODA0XG4gKlxuICogQHRlbXBsYXRlIHt7fX0gVFxuICogQHRlbXBsYXRlIHtJbnRlcmZhY2VTcGVjfSBJXG4gKiBAcGFyYW0ge0l9IFtpZmFjZV0gVGhlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9uIGZvclxuICogdGhlIHJlbW90YWJsZS4gRm9yIG5vdywgYSBzdHJpbmcgaWZhY2UgbXVzdCBiZSBcIlJlbW90YWJsZVwiIG9yIGJlZ2luIHdpdGhcbiAqIFwiQWxsZWdlZDogXCIgb3IgXCJEZWJ1Z05hbWU6IFwiLCB0byBzZXJ2ZSBhcyB0aGUgYWxsZWdlZCBuYW1lLiBNb3JlXG4gKiBnZW5lcmFsIGlmYWNlcyBhcmUgbm90IHlldCBpbXBsZW1lbnRlZC4gVGhpcyBpcyB0ZW1wb3JhcnkuIFdlIGluY2x1ZGUgdGhlXG4gKiBcIkFsbGVnZWRcIiBvciBcIkRlYnVnTmFtZVwiIGFzIGEgcmVtaW5kZXIgdGhhdCB3ZSBkbyBub3QgeWV0IGhhdmUgU3dpbmdTZXRcbiAqIG9yIENvbW1zIFZhdFxuICogc3VwcG9ydCBmb3IgZW5zdXJpbmcgdGhpcyBpcyBhY2NvcmRpbmcgdG8gdGhlIHZhdCBob3N0aW5nIHRoZSBvYmplY3QuXG4gKiBDdXJyZW50bHksIEFsaWNlIGNhbiB0ZWxsIEJvYiBhYm91dCBDYXJvbCwgd2hlcmUgVmF0QSAob24gQWxpY2UncyBiZWhhbGYpXG4gKiBtaXNyZXByZXNlbnRzIENhcm9sJ3MgYGlmYWNlYC4gVmF0QiBhbmQgdGhlcmVmb3JlIEJvYiB3aWxsIHRoZW4gc2VlXG4gKiBDYXJvbCdzIGBpZmFjZWAgYXMgbWlzcmVwcmVzZW50ZWQgYnkgVmF0QS5cbiAqIEBwYXJhbSB7dW5kZWZpbmVkfSBbcHJvcHNdIEN1cnJlbnRseSBtYXkgb25seSBiZSB1bmRlZmluZWQuXG4gKiBUaGF0IHBsYW4gaXMgdGhhdCBvd24tcHJvcGVydGllcyBhcmUgY29waWVkIHRvIHRoZSByZW1vdGFibGVcbiAqIEBwYXJhbSB7VH0gW3JlbW90YWJsZV0gVGhlIG9iamVjdCB1c2VkIGFzIHRoZSByZW1vdGFibGVcbiAqIEByZXR1cm5zIHtUICYgUmVtb3RhYmxlT2JqZWN0PEk+ICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+fX0gcmVtb3RhYmxlLCBtb2RpZmllZCBmb3IgZGVidWdnYWJpbGl0eVxuICovXG4gICAgICAgY29uc3QgUmVtb3RhYmxlID0gKFxuICAvKiBAdHMtZXhwZWN0LWVycm9yIEkgY291bGQgaGF2ZSBkaWZmZXJlbnQgc3VidHlwZSB0aGFuIHN0cmluZyovXG4gIGlmYWNlID0gJ1JlbW90YWJsZScsXG4gIHByb3BzID0gdW5kZWZpbmVkLFxuICByZW1vdGFibGUgPSAvKiogQHR5cGUge1R9ICovICh7fSksXG4pID0+IHtcbiAgYXNzZXJ0SWZhY2UoaWZhY2UpO1xuICBhc3NlcnQoaWZhY2UpO1xuICAvKiBUT0RPOiBXaGVuIGlmYWNlIGlzIHJpY2hlciB0aGFuIGp1c3Qgc3RyaW5nLCB3ZSBuZWVkIHRvIGdldCB0aGUgYWxsZWdlZE5hbWUqL1xuICAvKiBpbiBhIGRpZmZlcmVudCB3YXkuKi9cbiAgcHJvcHMgPT09IHVuZGVmaW5lZCB8fCBGYWlsYFJlbW90YWJsZSBwcm9wcyBub3QgeWV0IGltcGxlbWVudGVkICR7cHJvcHN9YDtcblxuICAvKiBGYWlsIGZhc3Q6IGNoZWNrIHRoYXQgdGhlIHVubW9kaWZpZWQgb2JqZWN0IGlzIGFibGUgdG8gYmVjb21lIGEgUmVtb3RhYmxlLiovXG4gIGFzc2VydENhbkJlUmVtb3RhYmxlKHJlbW90YWJsZSk7XG5cbiAgLyogRW5zdXJlIHRoYXQgdGhlIHJlbW90YWJsZSBpc24ndCBhbHJlYWR5IG1hcmtlZC4qL1xuICAhKFBBU1NfU1RZTEUgaW4gcmVtb3RhYmxlKSB8fFxuICAgIEZhaWxgUmVtb3RhYmxlICR7cmVtb3RhYmxlfSBpcyBhbHJlYWR5IG1hcmtlZCBhcyBhICR7cShcbiAgICAgIHJlbW90YWJsZVtQQVNTX1NUWUxFXSxcbiAgICApfWA7XG4gIC8qIGBpc0Zyb3plbmAgYWx3YXlzIHJldHVybnMgdHJ1ZSB3aXRoIGEgZmFrZSBgaGFyZGVuYCwgYnV0IHdlIHdhbnQgdGhhdCBjYXNlKi9cbiAgLyogdG8gc3VjY2VlZCBhbnl3YXkuIEZha2luZyBgaGFyZGVuYCBpcyBvbmx5IGNvcnJlY3RuZXNzIHByZXNlcnZpbmcqL1xuICAvKiBpZiB0aGUgY29kZSBpbiBxdWVzdGlvbiBjb250YWlucyBubyBidWdzIHRoYXQgdGhlIHJlYWwgYGhhcmRlbmAgd291bGQqL1xuICAvKiBoYXZlIGNhdWdodC4qL1xuICAvKiBAdHMtaWdub3JlIGBpc0Zha2VgIHB1cnBvc2VseSBub3QgaW4gdGhlIHR5cGUqL1xuICBoYXJkZW4uaXNGYWtlIHx8XG4gICAgLyogRW5zdXJlIHRoYXQgdGhlIHJlbW90YWJsZSBpc24ndCBhbHJlYWR5IGZyb3plbi4qL1xuICAgICFpc0Zyb3plbihyZW1vdGFibGUpIHx8XG4gICAgRmFpbGBSZW1vdGFibGUgJHtyZW1vdGFibGV9IGlzIGFscmVhZHkgZnJvemVuYDtcbiAgY29uc3QgcmVtb3RhYmxlUHJvdG8gPSBtYWtlUmVtb3RhYmxlUHJvdG8ocmVtb3RhYmxlLCBpZmFjZSk7XG5cbiAgLyogVGFrZSBhIHN0YXRpYyBjb3B5IG9mIHRoZSBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIGFzIGRhdGEgcHJvcGVydGllcy4qL1xuICAvKiBjb25zdCBwcm9wRGVzY3MgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHsgLi4ucHJvcHMgfSk7Ki9cbiAgY29uc3QgbXV0YXRlSGFyZGVuQW5kQ2hlY2sgPSB0YXJnZXQgPT4ge1xuICAgIC8qIGRlZmluZVByb3BlcnRpZXModGFyZ2V0LCBwcm9wRGVzY3MpOyovXG4gICAgc2V0UHJvdG90eXBlT2YodGFyZ2V0LCByZW1vdGFibGVQcm90byk7XG4gICAgaGFyZGVuKHRhcmdldCk7XG4gICAgYXNzZXJ0Q2FuQmVSZW1vdGFibGUodGFyZ2V0KTtcbiAgfTtcblxuICAvKiBGYWlsIGZhc3Q6IGNoZWNrIGEgZnJlc2ggcmVtb3RhYmxlIHRvIHNlZSBpZiBvdXIgcnVsZXMgZml0LiovXG4gIG11dGF0ZUhhcmRlbkFuZENoZWNrKHt9KTtcblxuICAvKiBBY3R1YWxseSBmaW5pc2ggdGhlIG5ldyByZW1vdGFibGUuKi9cbiAgbXV0YXRlSGFyZGVuQW5kQ2hlY2socmVtb3RhYmxlKTtcblxuICAvKiBDT01NSVRURUQhKi9cbiAgLyogV2UncmUgY29tbWl0dGVkLCBzbyBrZWVwIHRoZSBpbnRlcmZhY2UgZm9yIGZ1dHVyZSByZWZlcmVuY2UuKi9cbiAgYXNzZXJ0KGlmYWNlICE9PSB1bmRlZmluZWQpOyAvKiBUbyBtYWtlIFR5cGVTY3JpcHQgaGFwcHkqL1xuICByZXR1cm4gLyoqIEB0eXBlIHthbnl9ICovIChyZW1vdGFibGUpO1xufTskaM2PX29uY2UuUmVtb3RhYmxlKFJlbW90YWJsZSk7XG5oYXJkZW4oUmVtb3RhYmxlKTtcblxuLyoqXG4gKiBUaGUgbmFtZSBvZiB0aGUgYXV0b21hdGljYWxseSBhZGRlZCBkZWZhdWx0IG1ldGEtbWV0aG9kIGZvciBvYnRhaW5pbmcgYVxuICogbGlzdCBvZiBhbGwgbWV0aG9kcyBvZiBhbiBvYmplY3QgZGVjbGFyZWQgd2l0aCBgRmFyYCwgb3IgYW4gb2JqZWN0IHRoYXRcbiAqIGluaGVyaXRzIGZyb20gYW4gb2JqZWN0IGRlY2xhcmVkIHdpdGggYEZhcmAuXG4gKlxuICogTW9kZWxlZCBvbiBgR0VUX0lOVEVSRkFDRV9HVUFSRGAgZnJvbSBgQGVuZG8vZXhvYC5cbiAqXG4gKiBUT0RPIE5hbWUgdG8gYmUgYmlrZXNoZWQuIFBlcmhhcHMgZXZlbiB3aGV0aGVyIGl0IGlzIGFcbiAqIHN0cmluZyBvciBzeW1ib2wgdG8gYmUgYmlrZXNoZWQuIFNlZVxuICogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTgwOSNkaXNjdXNzaW9uX3IxMzg4MDUyNDU0XG4gKlxuICogSEFaQVJEOiBCZXdhcmUgdGhhdCBhbiBleG8ncyBpbnRlcmZhY2UgY2FuIGNoYW5nZSBhY3Jvc3MgYW4gdXBncmFkZSxcbiAqIHNvIHJlbW90ZXMgdGhhdCBjYWNoZSBpdCBjYW4gYmVjb21lIHN0YWxlLlxuICovXG4gICAgICAgY29uc3QgR0VUX01FVEhPRF9OQU1FUyA9ICdfX2dldE1ldGhvZE5hbWVzX18nO1xuXG4vKipcbiAqIE5vdGUgdGhhdCBgZ2V0TWV0aG9kTmFtZXNNZXRob2RgIGlzIGEgdGhpc2Z1bCBtZXRob2QhIEl0IG11c3QgYmUgc28gdGhhdFxuICogaXQgd29ya3MgYXMgZXhwZWN0ZWQgd2l0aCBmYXItb2JqZWN0IGluaGVyaXRhbmNlLlxuICpcbiAqIEByZXR1cm5zIHsoc3RyaW5nfHN5bWJvbClbXX1cbiAqLyRozY9fb25jZS5HRVRfTUVUSE9EX05BTUVTKEdFVF9NRVRIT0RfTkFNRVMpO1xuY29uc3QgZ2V0TWV0aG9kTmFtZXNNZXRob2QgPSBoYXJkZW4oe1xuICBbR0VUX01FVEhPRF9OQU1FU10oKSB7XG4gICAgcmV0dXJuIGdldE1ldGhvZE5hbWVzKHRoaXMpO1xuICB9LFxufSlbR0VUX01FVEhPRF9OQU1FU107XG5cbmNvbnN0IGdldE1ldGhvZE5hbWVzRGVzY3JpcHRvciA9IGhhcmRlbih7XG4gIHZhbHVlOiBnZXRNZXRob2ROYW1lc01ldGhvZCxcbiAgZW51bWVyYWJsZTogZmFsc2UsXG4gIGNvbmZpZ3VyYWJsZTogZmFsc2UsXG4gIHdyaXRhYmxlOiBmYWxzZSxcbn0pO1xuXG4vKipcbiAqIE1hcmsgYW4gb2JqZWN0IHRvIGJlIGV4cG9zZWQgZm9yIHJlbW90ZSBpbnRlcmFjdGlvblxuICogYW5kIGdpdmUgaXQgYSBzdWdnZXN0aXZlIGludGVyZmFjZSBuYW1lIGZvciBkZWJ1Z2dpbmcuXG4gKlxuICogQWxsIHByb3BlcnRpZXMgb2YgdGhlIG9iamVjdCBoYXZlIHRvIGJlIG1ldGhvZHMsIG5vdCBkYXRhLlxuICpcbiAqIFRoZSBvYmplY3QgbXVzdCBub3QgYmUgaGFyZGVuZWQgYmVmb3JlIGl0IGlzIG1hcmtlZC5cbiAqIEl0IHdpbGwgYmUgaGFyZGVuZWQgYWZ0ZXIgbWFya2luZy5cbiAqXG4gKiBGb3IgZmFyIG9iamVjdHMgKGFzIG9wcG9zZWQgdG8gZmFyIGZ1bmN0aW9ucyksIGFsc28gYWRkc1xuICogYF9fZ2V0TWV0aG9kTmFtZXNfX2AgbWV0aG9kIHRoYXQgcmV0dXJucyBhbiBhcnJheSBvZiBhbGwgdGhlIG1ldGhvZCBuYW1lcyxcbiAqIGlmIHRoZXJlIGlzIG5vdCB5ZXQgYW55IG1ldGhvZCBuYW1lZCBgX19nZXRNZXRob2ROYW1lc19fYC5cbiAqXG4gKiBAZXhhbXBsZVxuICogRmFyKCdFbXBsb3llZScsIHsgZ2V0TWFuYWdlciB9KVxuICogQHRlbXBsYXRlIHt7fX0gVFxuICogQHBhcmFtIHtzdHJpbmd9IGZhck5hbWUgVGhpcyBuYW1lIHdpbGwgYmUgcHJlcGVuZGVkIHdpdGggYEFsbGVnZWQ6IGBcbiAqIGZvciBub3cgdG8gZm9ybSB0aGUgYFJlbW90YWJsZWAgYGlmYWNlYCBhcmd1bWVudC5cbiAqIEBwYXJhbSB7VH0gW3JlbW90YWJsZV0gVGhlIG9iamVjdCB0byBiZSBtYXJrZWQgYXMgcmVtb3RhYmxlXG4gKi9cbiAgICAgICBjb25zdCBGYXIgPSAoZmFyTmFtZSwgcmVtb3RhYmxlID0gdW5kZWZpbmVkKSA9PiB7XG4gIGNvbnN0IHIgPSByZW1vdGFibGUgPT09IHVuZGVmaW5lZCA/IC8qKiBAdHlwZSB7VH0gKi8gKHt9KSA6IHJlbW90YWJsZTtcbiAgaWYgKHR5cGVvZiByID09PSAnb2JqZWN0JyAmJiAhKEdFVF9NRVRIT0RfTkFNRVMgaW4gcikpIHtcbiAgICAvKiBUaGlzIHRlc3QgZXhjbHVkZXMgZmFyIGZ1bmN0aW9ucywgc2luY2Ugd2UgY3VycmVudGx5IGNvbnNpZGVyIHRoZW0qL1xuICAgIC8qIHRvIG9ubHkgaGF2ZSBhIGNhbGwtYmVoYXZpb3IsIHdpdGggbm8gY2FsbGFibGUgbWV0aG9kcy4qL1xuICAgIC8qIEJld2FyZTogTXV0YXRlcyB0aGUgaW5wdXQgYXJndW1lbnQhIEJ1dCBgUmVtb3RhYmxlYCovXG4gICAgLyogKiByZXF1aXJlcyB0aGUgb2JqZWN0IHRvIGJlIG11dGFibGUqL1xuICAgIC8qICogZG9lcyBmdXJ0aGVyIG11dGF0aW9ucywqL1xuICAgIC8qICogaGFyZGVucyB0aGUgbXV0YXRlZCBvYmplY3QgYmVmb3JlIHJldHVybmluZyBpdC4qL1xuICAgIC8qIHNvIHRoaXMgbXV0YXRpb24gaXMgbm90IHVucHJlY2VkZW50ZWQuIEJ1dCBpdCBpcyBzdXJwcmlzaW5nISovXG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHIsIEdFVF9NRVRIT0RfTkFNRVMsIGdldE1ldGhvZE5hbWVzRGVzY3JpcHRvcik7XG4gIH1cbiAgcmV0dXJuIFJlbW90YWJsZShgQWxsZWdlZDogJHtmYXJOYW1lfWAsIHVuZGVmaW5lZCwgcik7XG59OyRozY9fb25jZS5GYXIoRmFyKTtcbmhhcmRlbihGYXIpO1xuXG4vKipcbiAqIENvZXJjZSBgZnVuY2AgdG8gYSBmYXIgZnVuY3Rpb24gdGhhdCBwcmVzZXJ2ZXMgaXRzIGNhbGwgYmVoYXZpb3IuXG4gKiBJZiBpdCBpcyBhbHJlYWR5IGEgZmFyIGZ1bmN0aW9uLCByZXR1cm4gaXQuIE90aGVyd2lzZSBtYWtlIGFuZCByZXR1cm4gYVxuICogbmV3IGZhciBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCBhbmQgZm9yd2FyZHMgY2FsbHMgdG8gaXQuIFRoaXNcbiAqIHdvcmtzIGV2ZW4gaWYgYGZ1bmNgIGlzIGFscmVhZHkgZnJvemVuLiBgVG9GYXJGdW5jdGlvbmAgaXMgdG8gYmUgdXNlZFxuICogd2hlbiB0aGUgZnVuY3Rpb24gY29tZXMgZnJvbSBlbHNld2hlcmUgdW5kZXIgbGVzcyBjb250cm9sLiBGb3IgZnVuY3Rpb25zXG4gKiB5b3UgYXV0aG9yIGluIHBsYWNlLCBiZXR0ZXIgdG8gdXNlIGBGYXJgIG9uIHRoZWlyIGZ1bmN0aW9uIGxpdGVyYWwgZGlyZWN0bHkuXG4gKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gRlxuICogQHBhcmFtIHtzdHJpbmd9IGZhck5hbWUgdG8gYmUgdXNlZCBvbmx5IGlmIGBmdW5jYCBpcyBub3QgYWxyZWFkeSBhXG4gKiBmYXIgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge0Z9IGZ1bmNcbiAqIEByZXR1cm5zIHtGICYgUmVtb3RhYmxlT2JqZWN0ICYgUmVtb3RhYmxlQnJhbmQ8e30sIEY+fVxuICovXG4gICAgICAgY29uc3QgVG9GYXJGdW5jdGlvbiA9IChmYXJOYW1lLCBmdW5jKSA9PiB7XG4gIGlmIChnZXRJbnRlcmZhY2VPZihmdW5jKSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBjaGVja2VkIGNhc3QqL1xuICAgIHJldHVybiBmdW5jO1xuICB9XG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgY291bGQgYmUgZGlmZmVyZW50IHN1YnR5cGUqL1xuICByZXR1cm4gRmFyKGZhck5hbWUsICguLi5hcmdzKSA9PiBmdW5jKC4uLmFyZ3MpKTtcbn07JGjNj19vbmNlLlRvRmFyRnVuY3Rpb24oVG9GYXJGdW5jdGlvbik7XG5oYXJkZW4oVG9GYXJGdW5jdGlvbik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJSZW1vdGFibGUiOlsiUmVtb3RhYmxlIl0sIkdFVF9NRVRIT0RfTkFNRVMiOlsiR0VUX01FVEhPRF9OQU1FUyJdLCJGYXIiOlsiRmFyIl0sIlRvRmFyRnVuY3Rpb24iOlsiVG9GYXJGdW5jdGlvbiJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACcUmBpgwUAAIMFAAApAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL21ha2VUYWdnZWQuanN7ImltcG9ydHMiOlsiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vcGFzc1N0eWxlT2YuanMiXSwiZXhwb3J0cyI6WyJtYWtlVGFnZ2VkIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxQQVNTX1NUWUxFLGFzc2VydFBhc3NhYmxlOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcIlBBU1NfU1RZTEVcIixbJGjNj19hID0+IChQQVNTX1NUWUxFID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wiYXNzZXJ0UGFzc2FibGVcIixbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtQYXNzYWJsZSxDb3B5VGFnZ2VkfSBmcm9tICcuL3R5cGVzLmpzJ1xuICovXG5cbmNvbnN0IHsgY3JlYXRlLCBwcm90b3R5cGU6IG9iamVjdFByb3RvdHlwZSB9ID0gT2JqZWN0O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7c3RyaW5nfSBUXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBQXG4gKiBAcGFyYW0ge1R9IHRhZ1xuICogQHBhcmFtIHtQfSBwYXlsb2FkXG4gKiBAcmV0dXJucyB7Q29weVRhZ2dlZDxULFA+fVxuICovXG4gICAgICAgY29uc3QgbWFrZVRhZ2dlZCA9ICh0YWcsIHBheWxvYWQpID0+IHtcbiAgdHlwZW9mIHRhZyA9PT0gJ3N0cmluZycgfHxcbiAgICBGYWlsYFRoZSB0YWcgb2YgYSB0YWdnZWQgcmVjb3JkIG11c3QgYmUgYSBzdHJpbmc6ICR7dGFnfWA7XG4gIGFzc2VydFBhc3NhYmxlKGhhcmRlbihwYXlsb2FkKSk7XG4gIHJldHVybiBoYXJkZW4oXG4gICAgY3JlYXRlKG9iamVjdFByb3RvdHlwZSwge1xuICAgICAgW1BBU1NfU1RZTEVdOiB7IHZhbHVlOiAndGFnZ2VkJyB9LFxuICAgICAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHsgdmFsdWU6IHRhZyB9LFxuICAgICAgcGF5bG9hZDogeyB2YWx1ZTogcGF5bG9hZCwgZW51bWVyYWJsZTogdHJ1ZSB9LFxuICAgIH0pLFxuICApO1xufTskaM2PX29uY2UubWFrZVRhZ2dlZChtYWtlVGFnZ2VkKTtcbmhhcmRlbihtYWtlVGFnZ2VkKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VUYWdnZWQiOlsibWFrZVRhZ2dlZCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB8Jer96iEAAOohAAAwAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3Bhc3NTdHlsZS1oZWxwZXJzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbIkNYIiwiUEFTU19TVFlMRSIsImFzc2VydENoZWNrZXIiLCJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIiwiY2hlY2tQYXNzU3R5bGUiLCJjaGVja1RhZ1JlY29yZCIsImdldE93bkRhdGFEZXNjcmlwdG9yIiwiZ2V0VGFnIiwiaGFzT3duUHJvcGVydHlPZiIsImlzT2JqZWN0IiwiaXNQcmltaXRpdmUiLCJpc1R5cGVkQXJyYXkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBYLHE7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dLFtcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV1dKTtcblxuXG5cbi8qKlxuICogQGltcG9ydCB7Q2hlY2tlciwgUGFzc1N0eWxlLCBKU1ByaW1pdGl2ZX0gZnJvbSAnLi90eXBlcy5qcyc7XG4gKi9cblxuY29uc3QgeyBpc0FycmF5IH0gPSBBcnJheTtcbmNvbnN0IHsgcHJvdG90eXBlOiBmdW5jdGlvblByb3RvdHlwZSB9ID0gRnVuY3Rpb247XG5jb25zdCB7XG4gIGdldE93blByb3BlcnR5RGVzY3JpcHRvcixcbiAgZ2V0UHJvdG90eXBlT2YsXG4gIGhhc093bixcbiAgaXNGcm96ZW4sXG4gIHByb3RvdHlwZTogb2JqZWN0UHJvdG90eXBlLFxufSA9IE9iamVjdDtcbmNvbnN0IHsgYXBwbHkgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IHRvU3RyaW5nVGFnOiB0b1N0cmluZ1RhZ1N5bWJvbCB9ID0gU3ltYm9sO1xuXG5jb25zdCB0eXBlZEFycmF5UHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoVWludDhBcnJheS5wcm90b3R5cGUpO1xuY29uc3QgdHlwZWRBcnJheVRvU3RyaW5nVGFnRGVzYyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcihcbiAgdHlwZWRBcnJheVByb3RvdHlwZSxcbiAgdG9TdHJpbmdUYWdTeW1ib2wsXG4pO1xuYXNzZXJ0KHR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2MpO1xuY29uc3QgZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnID0gdHlwZWRBcnJheVRvU3RyaW5nVGFnRGVzYy5nZXQ7XG5hc3NlcnQodHlwZW9mIGdldFR5cGVkQXJyYXlUb1N0cmluZ1RhZyA9PT0gJ2Z1bmN0aW9uJyk7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIGBPYmplY3QuaGFzT3duYCBpbnN0ZWFkXG4gKi9cbiAgICAgICBjb25zdCBoYXNPd25Qcm9wZXJ0eU9mID0gaGFzT3duO1xuXG4vKipcbiAqIEB0eXBlIHsodmFsOiB1bmtub3duKSA9PiB2YWwgaXMgSlNQcmltaXRpdmV9XG4gKi8kaM2PX29uY2UuaGFzT3duUHJvcGVydHlPZihoYXNPd25Qcm9wZXJ0eU9mKTtcbiAgICAgICBjb25zdCBpc1ByaW1pdGl2ZSA9IHZhbCA9PlxuICAvKiBTYWZlciB3b3VsZCBiZSBgT2JqZWN0KHZhbCkgIT09IHZhbGAgYnV0IGlzIHRvbyBleHBlbnNpdmUgb24gWFMuKi9cbiAgLyogU28gaW5zdGVhZCB3ZSB1c2UgdGhpcyBhZGhvYyBzZXQgb2YgdHlwZSB0ZXN0cy4gQnV0IHRoaXMgaXMgbm90IHNhZmUgaW4qL1xuICAvKiB0aGUgZmFjZSBvZiBwb3NzaWJsZSBldm9sdXRpb24gb2YgdGhlIGxhbmd1YWdlLiBCZXdhcmUhKi9cbiAgIXZhbCB8fCAodHlwZW9mIHZhbCAhPT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbCAhPT0gJ2Z1bmN0aW9uJyk7JGjNj19vbmNlLmlzUHJpbWl0aXZlKGlzUHJpbWl0aXZlKTtcbmhhcmRlbihpc1ByaW1pdGl2ZSk7XG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIGAhaXNQcmltaXRpdmVgIGluc3RlYWRcbiAqIEB0eXBlIHsodmFsOiB1bmtub3duKSA9PiB2YWwgaXMgKEZ1bmN0aW9uIHwgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgdW5rbm93bj4pfVxuICovXG4gICAgICAgY29uc3QgaXNPYmplY3QgPSB2YWwgPT5cbiAgLyogU2FmZXIgd291bGQgYmUgYE9iamVjdCh2YWwpIC09PSB2YWxgIGJ1dCBpcyB0b28gZXhwZW5zaXZlIG9uIFhTLiovXG4gIC8qIFNvIGluc3RlYWQgd2UgdXNlIHRoaXMgYWRob2Mgc2V0IG9mIHR5cGUgdGVzdHMuIEJ1dCB0aGlzIGlzIG5vdCBzYWZlIGluKi9cbiAgLyogdGhlIGZhY2Ugb2YgcG9zc2libGUgZXZvbHV0aW9uIG9mIHRoZSBsYW5ndWFnZS4gQmV3YXJlISovXG4gICEhdmFsICYmICh0eXBlb2YgdmFsID09PSAnb2JqZWN0JyB8fCB0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nKTskaM2PX29uY2UuaXNPYmplY3QoaXNPYmplY3QpO1xuaGFyZGVuKGlzT2JqZWN0KTtcblxuLyoqXG4gKiBEdXBsaWNhdGVzIHBhY2thZ2VzL3Nlcy9zcmMvbWFrZS1oYXJkZW5lci5qcyB0byBhdm9pZCBhIGRlcGVuZGVuY3kuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBvYmplY3RcbiAqL1xuICAgICAgIGNvbnN0IGlzVHlwZWRBcnJheSA9IG9iamVjdCA9PiB7XG4gIC8qIFRoZSBvYmplY3QgbXVzdCBwYXNzIGEgYnJhbmQgY2hlY2sgb3IgdG9TdHJpbmdUYWcgd2lsbCByZXR1cm4gdW5kZWZpbmVkLiovXG4gIGNvbnN0IHRhZyA9IGFwcGx5KGdldFR5cGVkQXJyYXlUb1N0cmluZ1RhZywgb2JqZWN0LCBbXSk7XG4gIHJldHVybiB0YWcgIT09IHVuZGVmaW5lZDtcbn07JGjNj19vbmNlLmlzVHlwZWRBcnJheShpc1R5cGVkQXJyYXkpO1xuaGFyZGVuKGlzVHlwZWRBcnJheSk7XG5cbi8qKlxuICogV2UgY2FzdCBvdXIgYFN5bWJvbC5mb3IoKWAgdG8gYSBzdHJpbmcgY29uc3RhbnQgaGVyZSB0byBhdm9pZCBleHBvc2luZyB0aGVcbiAqIGB1bmlxdWUgc3ltYm9sYCB0eXBlIHB1YmxpY2x5LiAgVGhlIGNhc3QgZG9lc24ndCBjaGFuZ2UgYW55IHJ1bnRpbWVcbiAqIGJlaGF2aW9yLi4uIGl0J3Mgc3RpbGwgYWN0dWFsbHkgYSBzeW1ib2wuXG4gKlxuICogV2l0aG91dCB0aGlzIHdvcmthcm91bmQsIHdlJ3ZlIG9ic2VydmVkIGVycm9ycyB3aGVuIHVzaW5nXG4gKiBgdHlwZXNjcmlwdEA1LjkuM2AncyBgdHNjYCB0byBnZW5lcmF0ZSBkZWNsYXJhdGlvbiBmaWxlcyAoLmQudHMpIGZvclxuICogY29uc3VtZXJzIG9mIG1vZHVsZXMgdGhhdCBpbXBvcnQgYFBBU1NfU1RZTEVgOlxuICogQGV4YW1wbGVcbiAqICAgZXJyb3IgVFM5MDA2OiBEZWNsYXJhdGlvbiBlbWl0IGZvciB0aGlzIGZpbGUgcmVxdWlyZXMgdXNpbmcgcHJpdmF0ZSBuYW1lXG4gKiAgICdQQVNTX1NUWUxFJyBmcm9tIG1vZHVsZSAnLi4uL0BlbmRvL3Bhc3Mtc3R5bGUvc3JjL3R5cGVzXCInLiBBbiBleHBsaWNpdFxuICogICB0eXBlIGFubm90YXRpb24gbWF5IHVuYmxvY2sgZGVjbGFyYXRpb24gZW1pdC5cbiAqL1xuICAgICAgIGNvbnN0IFBBU1NfU1RZTEUgPSAvKiogQHR5cGUgeydTeW1ib2wocGFzc1N0eWxlKSd9ICovIChcbiAgLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoU3ltYm9sLmZvcigncGFzc1N0eWxlJykpXG4pO1xuXG4vKipcbiAqIEJlbG93IHdlIGhhdmUgYSBzZXJpZXMgb2YgcHJlZGljYXRlIGZ1bmN0aW9ucyBhbmQgdGhlaXIgKGN1cnJpZWQpIGFzc2VydGlvblxuICogZnVuY3Rpb25zLiBUaGUgc2VtYW50aWNzIG9mIHRoZSBhc3NlcnRpb24gZnVuY3Rpb24gaXMganVzdCB0byBhc3NlcnQgdGhhdFxuICogdGhlIGNvcnJlc3BvbmRpbmcgcHJlZGljYXRlIGZ1bmN0aW9uIHdvdWxkIGhhdmUgcmV0dXJuZWQgdHJ1ZS4gQnV0IGl0XG4gKiByZXByb2R1Y2VzIHRoZSBpbnRlcm5hbCB0ZXN0cyBzbyBmYWlsdXJlcyBjYW4gZ2l2ZSBhIGJldHRlciBlcnJvciBtZXNzYWdlLlxuICpcbiAqIEB0eXBlIHtDaGVja2VyfVxuICovJGjNj19vbmNlLlBBU1NfU1RZTEUoUEFTU19TVFlMRSk7XG4gICAgICAgY29uc3QgYXNzZXJ0Q2hlY2tlciA9IChjb25kLCBkZXRhaWxzKSA9PiB7XG4gIGFzc2VydChjb25kLCBkZXRhaWxzKTtcbiAgcmV0dXJuIHRydWU7XG59OyRozY9fb25jZS5hc3NlcnRDaGVja2VyKGFzc2VydENoZWNrZXIpO1xuaGFyZGVuKGFzc2VydENoZWNrZXIpO1xuXG4vKipcbiAqIFJldHVybnMgYSB0ZW1wbGF0ZSBsaXRlcmFsIHRhZyBmdW5jdGlvbiB0byBmYWlsIHRoZSBwcm92aWRlZCBDaGVja2VyIHdpdGggZGV0YWlscy5cbiAqIFRoZSBuYW1lIG11c3QgYmUgc2hvcnQgZm9yIGVyZ29ub21pYyBpbmxpbmUgdXNlIGFzIGluOlxuICogYGBgXG4gKiByZXR1cm4gY2hlY2tDb25kaXRpb24oLi4uKSB8fCAoISFjaGVjayAmJiBDWChjaGVjaylgLi4uYCk7XG4gKiBgYGBcbiAqXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKi9cbiAgICAgICBjb25zdCBDWCA9IGNoZWNrID0+IHtcbiAgY29uc3QgcmVqZWN0ID0gKFQsIC4uLnN1YnMpID0+IGNoZWNrKGZhbHNlLCBYKFQsIC4uLnN1YnMpKTtcbiAgcmV0dXJuIHJlamVjdDtcbn07JGjNj19vbmNlLkNYKENYKTtcbmhhcmRlbihDWCk7XG5cbi8qKlxuICogVmVyaWZpZXMgdGhlIHByZXNlbmNlIGFuZCBlbnVtZXJhYmlsaXR5IG9mIGFuIG93biBkYXRhIHByb3BlcnR5XG4gKiBhbmQgcmV0dXJucyBpdHMgZGVzY3JpcHRvci5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gY2FuZGlkYXRlXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8c3ltYm9sfSBwcm9wTmFtZVxuICogQHBhcmFtIHtib29sZWFufSBzaG91bGRCZUVudW1lcmFibGVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge1Byb3BlcnR5RGVzY3JpcHRvcn1cbiAqL1xuICAgICAgIGNvbnN0IGdldE93bkRhdGFEZXNjcmlwdG9yID0gKFxuICBjYW5kaWRhdGUsXG4gIHByb3BOYW1lLFxuICBzaG91bGRCZUVudW1lcmFibGUsXG4gIGNoZWNrLFxuKSA9PiB7XG4gIGNvbnN0IGRlc2MgPSAvKiogQHR5cGUge1Byb3BlcnR5RGVzY3JpcHRvcn0gKi8gKFxuICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihjYW5kaWRhdGUsIHByb3BOYW1lKVxuICApO1xuICByZXR1cm4gKGRlc2MgIT09IHVuZGVmaW5lZCB8fFxuICAgICghIWNoZWNrICYmIENYKGNoZWNrKWAke3EocHJvcE5hbWUpfSBwcm9wZXJ0eSBleHBlY3RlZDogJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgKGhhc093bihkZXNjLCAndmFsdWUnKSB8fFxuICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgQ1goXG4gICAgICAgICAgY2hlY2ssXG4gICAgICAgIClgJHtxKHByb3BOYW1lKX0gbXVzdCBub3QgYmUgYW4gYWNjZXNzb3IgcHJvcGVydHk6ICR7Y2FuZGlkYXRlfWApKSAmJlxuICAgIChzaG91bGRCZUVudW1lcmFibGVcbiAgICAgID8gZGVzYy5lbnVtZXJhYmxlIHx8XG4gICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgQ1goXG4gICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICApYCR7cShwcm9wTmFtZSl9IG11c3QgYmUgYW4gZW51bWVyYWJsZSBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YClcbiAgICAgIDogIWRlc2MuZW51bWVyYWJsZSB8fFxuICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgIENYKFxuICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgKWAke3EocHJvcE5hbWUpfSBtdXN0IG5vdCBiZSBhbiBlbnVtZXJhYmxlIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gKSlcbiAgICA/IGRlc2NcbiAgICA6IC8qKiBAdHlwZSB7UHJvcGVydHlEZXNjcmlwdG9yfSAqLyAoLyoqIEB0eXBlIHt1bmtub3dufSAqLyAodW5kZWZpbmVkKSk7XG59OyRozY9fb25jZS5nZXRPd25EYXRhRGVzY3JpcHRvcihnZXRPd25EYXRhRGVzY3JpcHRvcik7XG5oYXJkZW4oZ2V0T3duRGF0YURlc2NyaXB0b3IpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuSW50ZXJmYWNlU3BlY30gVFxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5QYXNzU3R5bGVkPGFueSwgVD59IHRhZ1JlY29yZFxuICogQHJldHVybnMge1R9XG4gKi9cbiAgICAgICBjb25zdCBnZXRUYWcgPSB0YWdSZWNvcmQgPT4gdGFnUmVjb3JkW1N5bWJvbC50b1N0cmluZ1RhZ107JGjNj19vbmNlLmdldFRhZyhnZXRUYWcpO1xuaGFyZGVuKGdldFRhZyk7XG5cbiAgICAgICBjb25zdCBjaGVja1Bhc3NTdHlsZSA9IChvYmosIHBhc3NTdHlsZSwgZXhwZWN0ZWRQYXNzU3R5bGUsIGNoZWNrKSA9PiB7XG4gIHJldHVybiAoXG4gICAgcGFzc1N0eWxlID09PSBleHBlY3RlZFBhc3NTdHlsZSB8fFxuICAgICghIWNoZWNrICYmXG4gICAgICBDWChjaGVjaylgRXhwZWN0ZWQgJHtxKGV4cGVjdGVkUGFzc1N0eWxlKX0sIG5vdCAke3EocGFzc1N0eWxlKX06ICR7b2JqfWApXG4gICk7XG59OyRozY9fb25jZS5jaGVja1Bhc3NTdHlsZShjaGVja1Bhc3NTdHlsZSk7XG5oYXJkZW4oY2hlY2tQYXNzU3R5bGUpO1xuXG5jb25zdCBtYWtlQ2hlY2tUYWdSZWNvcmQgPSBjaGVja1Byb3RvID0+IHtcbiAgLyoqXG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLlBhc3NTdHlsZWQ8YW55LCBhbnk+fSB0YWdSZWNvcmRcbiAqIEBwYXJhbSB7UGFzc1N0eWxlfSBleHBlY3RlZFBhc3NTdHlsZVxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICBjb25zdCBjaGVja1RhZ1JlY29yZCA9ICh0YWdSZWNvcmQsIGV4cGVjdGVkUGFzc1N0eWxlLCBjaGVjaykgPT4ge1xuICAgIHJldHVybiAoXG4gICAgICAoIWlzUHJpbWl0aXZlKHRhZ1JlY29yZCkgfHxcbiAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICBDWChjaGVjaylgQSBub24tb2JqZWN0IGNhbm5vdCBiZSBhIHRhZ1JlY29yZDogJHt0YWdSZWNvcmR9YCkpICYmXG4gICAgICAoaXNGcm96ZW4odGFnUmVjb3JkKSB8fFxuICAgICAgICAoISFjaGVjayAmJiBDWChjaGVjaylgQSB0YWdSZWNvcmQgbXVzdCBiZSBmcm96ZW46ICR7dGFnUmVjb3JkfWApKSAmJlxuICAgICAgKCFpc0FycmF5KHRhZ1JlY29yZCkgfHxcbiAgICAgICAgKCEhY2hlY2sgJiYgQ1goY2hlY2spYEFuIGFycmF5IGNhbm5vdCBiZSBhIHRhZ1JlY29yZDogJHt0YWdSZWNvcmR9YCkpICYmXG4gICAgICBjaGVja1Bhc3NTdHlsZShcbiAgICAgICAgdGFnUmVjb3JkLFxuICAgICAgICBnZXRPd25EYXRhRGVzY3JpcHRvcih0YWdSZWNvcmQsIFBBU1NfU1RZTEUsIGZhbHNlLCBjaGVjaykudmFsdWUsXG4gICAgICAgIGV4cGVjdGVkUGFzc1N0eWxlLFxuICAgICAgICBjaGVjayxcbiAgICAgICkgJiZcbiAgICAgICh0eXBlb2YgZ2V0T3duRGF0YURlc2NyaXB0b3IodGFnUmVjb3JkLCBTeW1ib2wudG9TdHJpbmdUYWcsIGZhbHNlLCBjaGVjaylcbiAgICAgICAgLnZhbHVlID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgIENYKFxuICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgKWBBIFtTeW1ib2wudG9TdHJpbmdUYWddLW5hbWVkIHByb3BlcnR5IG11c3QgYmUgYSBzdHJpbmc6ICR7dGFnUmVjb3JkfWApKSAmJlxuICAgICAgY2hlY2tQcm90byh0YWdSZWNvcmQsIGdldFByb3RvdHlwZU9mKHRhZ1JlY29yZCksIGNoZWNrKVxuICAgICk7XG4gIH07XG4gIHJldHVybiBoYXJkZW4oY2hlY2tUYWdSZWNvcmQpO1xufTtcblxuICAgICAgIGNvbnN0IGNoZWNrVGFnUmVjb3JkID0gbWFrZUNoZWNrVGFnUmVjb3JkKFxuICAodmFsLCBwcm90bywgY2hlY2spID0+XG4gICAgcHJvdG8gPT09IG9iamVjdFByb3RvdHlwZSB8fFxuICAgICghIWNoZWNrICYmXG4gICAgICBjaGVjayhmYWxzZSwgWGBBIHRhZ1JlY29yZCBtdXN0IGluaGVyaXQgZnJvbSBPYmplY3QucHJvdG90eXBlOiAke3ZhbH1gKSksXG4pOyRozY9fb25jZS5jaGVja1RhZ1JlY29yZChjaGVja1RhZ1JlY29yZCk7XG5oYXJkZW4oY2hlY2tUYWdSZWNvcmQpO1xuXG4gICAgICAgY29uc3QgY2hlY2tGdW5jdGlvblRhZ1JlY29yZCA9IG1ha2VDaGVja1RhZ1JlY29yZChcbiAgKHZhbCwgcHJvdG8sIGNoZWNrKSA9PlxuICAgIHByb3RvID09PSBmdW5jdGlvblByb3RvdHlwZSB8fFxuICAgIChwcm90byAhPT0gbnVsbCAmJiBnZXRQcm90b3R5cGVPZihwcm90bykgPT09IGZ1bmN0aW9uUHJvdG90eXBlKSB8fFxuICAgICghIWNoZWNrICYmXG4gICAgICBjaGVjayhcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIFhgRm9yIGZ1bmN0aW9ucywgYSB0YWdSZWNvcmQgbXVzdCBpbmhlcml0IGZyb20gRnVuY3Rpb24ucHJvdG90eXBlOiAke3ZhbH1gLFxuICAgICAgKSksXG4pOyRozY9fb25jZS5jaGVja0Z1bmN0aW9uVGFnUmVjb3JkKGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQpO1xuaGFyZGVuKGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaGFzT3duUHJvcGVydHlPZiI6WyJoYXNPd25Qcm9wZXJ0eU9mIl0sImlzUHJpbWl0aXZlIjpbImlzUHJpbWl0aXZlIl0sImlzT2JqZWN0IjpbImlzT2JqZWN0Il0sImlzVHlwZWRBcnJheSI6WyJpc1R5cGVkQXJyYXkiXSwiUEFTU19TVFlMRSI6WyJQQVNTX1NUWUxFIl0sImFzc2VydENoZWNrZXIiOlsiYXNzZXJ0Q2hlY2tlciJdLCJDWCI6WyJDWCJdLCJnZXRPd25EYXRhRGVzY3JpcHRvciI6WyJnZXRPd25EYXRhRGVzY3JpcHRvciJdLCJnZXRUYWciOlsiZ2V0VGFnIl0sImNoZWNrUGFzc1N0eWxlIjpbImNoZWNrUGFzc1N0eWxlIl0sImNoZWNrVGFnUmVjb3JkIjpbImNoZWNrVGFnUmVjb3JkIl0sImNoZWNrRnVuY3Rpb25UYWdSZWNvcmQiOlsiY2hlY2tGdW5jdGlvblRhZ1JlY29yZCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAmAo63Yj8AAGI/AAAqAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3Bhc3NTdHlsZU9mLmpzeyJpbXBvcnRzIjpbIkBlbmRvL3Byb21pc2Uta2l0IiwiQGVuZG8vZXJyb3JzIiwiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vY29weUFycmF5LmpzIiwiLi9ieXRlQXJyYXkuanMiLCIuL2NvcHlSZWNvcmQuanMiLCIuL3RhZ2dlZC5qcyIsIi4vZXJyb3IuanMiLCIuL3JlbW90YWJsZS5qcyIsIi4vc3ltYm9sLmpzIiwiLi9zYWZlLXByb21pc2UuanMiLCIuL3N0cmluZy5qcyJdLCJleHBvcnRzIjpbIlBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sIiwiYXNzZXJ0UGFzc2FibGUiLCJpc1Bhc3NhYmxlIiwicGFzc1N0eWxlT2YiLCJ0b1Bhc3NhYmxlRXJyb3IiLCJ0b1Rocm93YWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IGlzUHJvbWlzZSxYLEZhaWwscSxhbm5vdGF0ZUVycm9yLG1ha2VFcnJvcixpc1ByaW1pdGl2ZSxpc1R5cGVkQXJyYXksUEFTU19TVFlMRSxhc3NlcnRDaGVja2VyLENvcHlBcnJheUhlbHBlcixCeXRlQXJyYXlIZWxwZXIsQ29weVJlY29yZEhlbHBlcixUYWdnZWRIZWxwZXIsRXJyb3JIZWxwZXIsY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MsY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3IsZ2V0RXJyb3JDb25zdHJ1Y3Rvcixpc0Vycm9yTGlrZSxSZW1vdGFibGVIZWxwZXIsYXNzZXJ0UGFzc2FibGVTeW1ib2wsYXNzZXJ0U2FmZVByb21pc2UsYXNzZXJ0UGFzc2FibGVTdHJpbmc7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsWyRozY9fYSA9PiAoaXNQcm9taXNlID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJhbm5vdGF0ZUVycm9yXCIsWyRozY9fYSA9PiAoYW5ub3RhdGVFcnJvciA9ICRozY9fYSldXSxbXCJtYWtlRXJyb3JcIixbJGjNj19hID0+IChtYWtlRXJyb3IgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJpc1ByaW1pdGl2ZVwiLFskaM2PX2EgPT4gKGlzUHJpbWl0aXZlID0gJGjNj19hKV1dLFtcImlzVHlwZWRBcnJheVwiLFskaM2PX2EgPT4gKGlzVHlwZWRBcnJheSA9ICRozY9fYSldXSxbXCJQQVNTX1NUWUxFXCIsWyRozY9fYSA9PiAoUEFTU19TVFlMRSA9ICRozY9fYSldXSxbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXV1dLFtcIi4vY29weUFycmF5LmpzXCIsIFtbXCJDb3B5QXJyYXlIZWxwZXJcIixbJGjNj19hID0+IChDb3B5QXJyYXlIZWxwZXIgPSAkaM2PX2EpXV1dXSxbXCIuL2J5dGVBcnJheS5qc1wiLCBbW1wiQnl0ZUFycmF5SGVscGVyXCIsWyRozY9fYSA9PiAoQnl0ZUFycmF5SGVscGVyID0gJGjNj19hKV1dXV0sW1wiLi9jb3B5UmVjb3JkLmpzXCIsIFtbXCJDb3B5UmVjb3JkSGVscGVyXCIsWyRozY9fYSA9PiAoQ29weVJlY29yZEhlbHBlciA9ICRozY9fYSldXV1dLFtcIi4vdGFnZ2VkLmpzXCIsIFtbXCJUYWdnZWRIZWxwZXJcIixbJGjNj19hID0+IChUYWdnZWRIZWxwZXIgPSAkaM2PX2EpXV1dXSxbXCIuL2Vycm9yLmpzXCIsIFtbXCJFcnJvckhlbHBlclwiLFskaM2PX2EgPT4gKEVycm9ySGVscGVyID0gJGjNj19hKV1dLFtcImNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjXCIsWyRozY9fYSA9PiAoY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MgPSAkaM2PX2EpXV0sW1wiY2hlY2tSZWN1cnNpdmVseVBhc3NhYmxlRXJyb3JcIixbJGjNj19hID0+IChjaGVja1JlY3Vyc2l2ZWx5UGFzc2FibGVFcnJvciA9ICRozY9fYSldXSxbXCJnZXRFcnJvckNvbnN0cnVjdG9yXCIsWyRozY9fYSA9PiAoZ2V0RXJyb3JDb25zdHJ1Y3RvciA9ICRozY9fYSldXSxbXCJpc0Vycm9yTGlrZVwiLFskaM2PX2EgPT4gKGlzRXJyb3JMaWtlID0gJGjNj19hKV1dXV0sW1wiLi9yZW1vdGFibGUuanNcIiwgW1tcIlJlbW90YWJsZUhlbHBlclwiLFskaM2PX2EgPT4gKFJlbW90YWJsZUhlbHBlciA9ICRozY9fYSldXV1dLFtcIi4vc3ltYm9sLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVN5bWJvbFwiLFskaM2PX2EgPT4gKGFzc2VydFBhc3NhYmxlU3ltYm9sID0gJGjNj19hKV1dXV0sW1wiLi9zYWZlLXByb21pc2UuanNcIiwgW1tcImFzc2VydFNhZmVQcm9taXNlXCIsWyRozY9fYSA9PiAoYXNzZXJ0U2FmZVByb21pc2UgPSAkaM2PX2EpXV1dXSxbXCIuL3N0cmluZy5qc1wiLCBbW1wiYXNzZXJ0UGFzc2FibGVTdHJpbmdcIixbJGjNj19hID0+IChhc3NlcnRQYXNzYWJsZVN0cmluZyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEBpbXBvcnQge1Bhc3NTdHlsZUhlbHBlcn0gZnJvbSAnLi9pbnRlcm5hbC10eXBlcy5qcycgKi9cbi8qKiBAaW1wb3J0IHtDb3B5QXJyYXksIENvcHlSZWNvcmQsIENvcHlUYWdnZWQsIFBhc3NhYmxlfSBmcm9tICcuL3R5cGVzLmpzJyAqL1xuLyoqIEBpbXBvcnQge1Bhc3NTdHlsZX0gZnJvbSAnLi90eXBlcy5qcycgKi9cbi8qKiBAaW1wb3J0IHtQYXNzU3R5bGVPZn0gZnJvbSAnLi90eXBlcy5qcycgKi9cblxuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyBpc0Zyb3plbiwgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycywgdmFsdWVzIH0gPSBPYmplY3Q7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8UGFzc1N0eWxlLCBQYXNzU3R5bGVIZWxwZXI+fSBIZWxwZXJzUmVjb3JkXG4gKiBAcGFyYW0ge1Bhc3NTdHlsZUhlbHBlcltdfSBwYXNzU3R5bGVIZWxwZXJzXG4gKiBAcmV0dXJucyB7SGVscGVyc1JlY29yZH1cbiAqL1xuY29uc3QgbWFrZUhlbHBlclRhYmxlID0gcGFzc1N0eWxlSGVscGVycyA9PiB7XG4gIGNvbnN0IEhlbHBlclRhYmxlID0ge1xuICAgIF9fcHJvdG9fXzogbnVsbCxcbiAgICBjb3B5QXJyYXk6IHVuZGVmaW5lZCxcbiAgICBieXRlQXJyYXk6IHVuZGVmaW5lZCxcbiAgICBjb3B5UmVjb3JkOiB1bmRlZmluZWQsXG4gICAgdGFnZ2VkOiB1bmRlZmluZWQsXG4gICAgZXJyb3I6IHVuZGVmaW5lZCxcbiAgICByZW1vdGFibGU6IHVuZGVmaW5lZCxcbiAgfTtcbiAgZm9yIChjb25zdCBoZWxwZXIgb2YgcGFzc1N0eWxlSGVscGVycykge1xuICAgIGNvbnN0IHsgc3R5bGVOYW1lIH0gPSBoZWxwZXI7XG4gICAgc3R5bGVOYW1lIGluIEhlbHBlclRhYmxlIHx8IEZhaWxgVW5yZWNvZ25pemVkIGhlbHBlcjogJHtxKHN0eWxlTmFtZSl9YDtcbiAgICBIZWxwZXJUYWJsZVtzdHlsZU5hbWVdID09PSB1bmRlZmluZWQgfHxcbiAgICAgIEZhaWxgY29uZmxpY3RpbmcgaGVscGVycyBmb3IgJHtxKHN0eWxlTmFtZSl9YDtcbiAgICBIZWxwZXJUYWJsZVtzdHlsZU5hbWVdID0gaGVscGVyO1xuICB9XG4gIGZvciAoY29uc3Qgc3R5bGVOYW1lIG9mIG93bktleXMoSGVscGVyVGFibGUpKSB7XG4gICAgSGVscGVyVGFibGVbc3R5bGVOYW1lXSAhPT0gdW5kZWZpbmVkIHx8XG4gICAgICBGYWlsYG1pc3NpbmcgaGVscGVyIGZvciAke3Eoc3R5bGVOYW1lKX1gO1xuICB9XG5cbiAgcmV0dXJuIC8qKiBAdHlwZSB7SGVscGVyc1JlY29yZH0gKi8gKFxuICAgIC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKGhhcmRlbihIZWxwZXJUYWJsZSkpXG4gICk7XG59O1xuXG4vKipcbiAqIFRoZSBgYXNzZXJ0UmVzdFZhbGlkYCBhc3N1bWVzIHRoYXQgdGhlIGBjYW5CZVZhbGlkYCBjaGVjayBoYXMgYWxyZWFkeSBwYXNzZWQuXG4gKiBDb250ZXh0cyB3aGVyZSB3ZSBjYW5ub3QgYXNzdW1lIHRoYXQgc2hvdWxkIGNhbGwgYGFzc2VydFZhbGlkYCBpbnN0ZWFkLFxuICogd2hpY2ggY2hlY2tzIGJvdGggY29uZGl0aW9ucyBpbiB0aGUgcmlnaHQgb3JkZXIuXG4gKlxuICogQHBhcmFtIHtQYXNzU3R5bGVIZWxwZXJ9IGhlbHBlclxuICogQHBhcmFtIHthbnl9IGNhbmRpZGF0ZVxuICogQHBhcmFtIHsodmFsOiBhbnkpID0+IFBhc3NTdHlsZX0gcGFzc1N0eWxlT2ZSZWN1clxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0IGFzc2VydFZhbGlkID0gKGhlbHBlciwgY2FuZGlkYXRlLCBwYXNzU3R5bGVPZlJlY3VyKSA9PiB7XG4gIGhlbHBlci5jYW5CZVZhbGlkKGNhbmRpZGF0ZSwgYXNzZXJ0Q2hlY2tlcik7XG4gIGhlbHBlci5hc3NlcnRSZXN0VmFsaWQoY2FuZGlkYXRlLCBwYXNzU3R5bGVPZlJlY3VyKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzU3R5bGVIZWxwZXJbXX0gcGFzc1N0eWxlSGVscGVycyBUaGUgcGFzc1N0eWxlSGVscGVycyB0byByZWdpc3RlcixcbiAqIGluIHByaW9yaXR5IG9yZGVyLlxuICogTk9URSBUaGVzZSBtdXN0IGFsbCBiZSBcInRydXN0ZWRcIixcbiAqIGNvbXBsZXRlLCBhbmQgbm9uLWNvbGxpZGluZy4gYG1ha2VQYXNzU3R5bGVPZmAgbWF5ICphc3N1bWUqIHRoYXQgZWFjaCBoZWxwZXJcbiAqIGRvZXMgd2hhdCBpdCBpcyBzdXBwb3NlZCB0byBkby4gYG1ha2VQYXNzU3R5bGVPZmAgaXMgbm90IHRyeWluZyB0byBkZWZlbmRcbiAqIGl0c2VsZiBhZ2FpbnN0IG1hbGljaW91cyBoZWxwZXJzLCB0aG91Z2ggaXQgZG9lcyBkZWZlbmQgYWdhaW5zdCBzb21lXG4gKiBhY2NpZGVudHMuXG4gKiBAcmV0dXJucyB7UGFzc1N0eWxlT2Z9XG4gKi9cbmNvbnN0IG1ha2VQYXNzU3R5bGVPZiA9IHBhc3NTdHlsZUhlbHBlcnMgPT4ge1xuICBjb25zdCBIZWxwZXJUYWJsZSA9IG1ha2VIZWxwZXJUYWJsZShwYXNzU3R5bGVIZWxwZXJzKTtcbiAgY29uc3QgcmVtb3RhYmxlSGVscGVyID0gSGVscGVyVGFibGUucmVtb3RhYmxlO1xuXG4gIC8qKlxuICogUHVyZWx5IGZvciBwZXJmb3JtYW5jZS4gSG93ZXZlciBpdCBpcyBtdXRhYmxlIHN0YXRpYyBzdGF0ZSwgYW5kXG4gKiBpdCBkb2VzIGhhdmUgc29tZSBvYnNlcnZhYmlsaXR5IG9uIHByb3hpZXMuIFRPRE8gbmVlZCB0byBhc3Nlc3NcbiAqIHdoZXRoZXIgdGhpcyBjcmVhdGVzIGEgc3RhdGljIGNvbW11bmljYXRpb25zIGNoYW5uZWwuXG4gKlxuICogcGFzc1N0eWxlT2YgZG9lcyBhIGZ1bGwgcmVjdXJzaXZlIHdhbGsgb2YgcGFzcy1ieS1jb3B5XG4gKiBzdHJ1Y3R1cmVzLCBpbiBvcmRlciB0byB2YWxpZGF0ZSB0aGF0IHRoZXkgYXJlIGFjeWNsaWMuIEluIGFkZGl0aW9uXG4gKiBpdCBpcyB1c2VkIGJ5IG90aGVyIGFsZ29yaXRobXMgdG8gcmVjdXJzaXZlbHkgd2FsayB0aGVzZSBwYXNzLWJ5LWNvcHlcbiAqIHN0cnVjdHVyZXMsIHNvIHdpdGhvdXQgdGhpcyBjYWNoZSwgdGhlc2UgYWxnb3JpdGhtcyBjb3VsZCBiZVxuICogTyhOKioyKSBvciB3b3JzZS5cbiAqXG4gKiBAdHlwZSB7V2Vha01hcDxXZWFrS2V5LCBQYXNzU3R5bGU+fVxuICovXG4gIGNvbnN0IHBhc3NTdHlsZU1lbW8gPSBuZXcgV2Vha01hcCgpO1xuXG4gIC8qKlxuICogQHR5cGUge1Bhc3NTdHlsZU9mfVxuICovXG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG4gIGNvbnN0IHBhc3NTdHlsZU9mID0gcGFzc2FibGUgPT4ge1xuICAgIC8qIEV2ZW4gd2hlbiBhIFdlYWtTZXQgaXMgY29ycmVjdCwgd2hlbiB0aGUgc2V0IGhhcyBhIHNob3J0ZXIgbGlmZXRpbWUqL1xuICAgIC8qIHRoYW4gaXRzIGtleXMsIHdlIHByZWZlciBhIFNldCBkdWUgdG8gZXhwZWN0ZWQgaW1wbGVtZW50YXRpb24qL1xuICAgIC8qIHRyYWRlb2Zmcy4qL1xuICAgIGNvbnN0IGluUHJvZ3Jlc3MgPSBuZXcgU2V0KCk7XG5cbiAgICBjb25zdCBwYXNzU3R5bGVPZlJlY3VyID0gaW5uZXIgPT4ge1xuICAgICAgY29uc3QgaW5uZXJJc09iamVjdCA9ICFpc1ByaW1pdGl2ZShpbm5lcik7XG4gICAgICBpZiAoaW5uZXJJc09iamVjdCkge1xuICAgICAgICBjb25zdCBpbm5lclN0eWxlID0gcGFzc1N0eWxlTWVtby5nZXQoaW5uZXIpO1xuICAgICAgICBpZiAoaW5uZXJTdHlsZSkge1xuICAgICAgICAgIHJldHVybiBpbm5lclN0eWxlO1xuICAgICAgICB9XG4gICAgICAgICFpblByb2dyZXNzLmhhcyhpbm5lcikgfHxcbiAgICAgICAgICBGYWlsYFBhc3MtYnktY29weSBkYXRhIGNhbm5vdCBiZSBjeWNsaWMgJHtpbm5lcn1gO1xuICAgICAgICBpblByb2dyZXNzLmFkZChpbm5lcik7XG4gICAgICB9XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgICAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2ZJbnRlcm5hbChpbm5lcik7XG4gICAgICBpZiAoaW5uZXJJc09iamVjdCkge1xuICAgICAgICBwYXNzU3R5bGVNZW1vLnNldChpbm5lciwgcGFzc1N0eWxlKTtcbiAgICAgICAgaW5Qcm9ncmVzcy5kZWxldGUoaW5uZXIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHBhc3NTdHlsZTtcbiAgICB9O1xuXG4gICAgY29uc3QgcGFzc1N0eWxlT2ZJbnRlcm5hbCA9IGlubmVyID0+IHtcbiAgICAgIGNvbnN0IHR5cGVzdHIgPSB0eXBlb2YgaW5uZXI7XG4gICAgICBzd2l0Y2ggKHR5cGVzdHIpIHtcbiAgICAgICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICAgICAgY2FzZSAnYm9vbGVhbic6XG4gICAgICAgIGNhc2UgJ251bWJlcic6XG4gICAgICAgIGNhc2UgJ2JpZ2ludCc6IHtcbiAgICAgICAgICByZXR1cm4gdHlwZXN0cjtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzdHJpbmcnOiB7XG4gICAgICAgICAgYXNzZXJ0UGFzc2FibGVTdHJpbmcoaW5uZXIpO1xuICAgICAgICAgIHJldHVybiAnc3RyaW5nJztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdzeW1ib2wnOiB7XG4gICAgICAgICAgYXNzZXJ0UGFzc2FibGVTeW1ib2woaW5uZXIpO1xuICAgICAgICAgIHJldHVybiAnc3ltYm9sJztcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdvYmplY3QnOiB7XG4gICAgICAgICAgaWYgKGlubmVyID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gJ251bGwnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoIWlzRnJvemVuKGlubmVyKSkge1xuICAgICAgICAgICAgYXNzZXJ0LmZhaWwoXG4gICAgICAgICAgICAgIC8qIFR5cGVkQXJyYXlzIGdldCBzcGVjaWFsIHRyZWF0bWVudCBpbiBoYXJkZW4oKSovXG4gICAgICAgICAgICAgIC8qIGFuZCBhIGNvcnJlc3BvbmRpbmcgc3BlY2lhbCBlcnJvciBtZXNzYWdlIGhlcmUuKi9cbiAgICAgICAgICAgICAgaXNUeXBlZEFycmF5KGlubmVyKVxuICAgICAgICAgICAgICAgID8gWGBDYW5ub3QgcGFzcyBtdXRhYmxlIHR5cGVkIGFycmF5cyBsaWtlICR7aW5uZXJ9LmBcbiAgICAgICAgICAgICAgICA6IFhgQ2Fubm90IHBhc3Mgbm9uLWZyb3plbiBvYmplY3RzIGxpa2UgJHtpbm5lcn0uIFVzZSBoYXJkZW4oKWAsXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaXNQcm9taXNlKGlubmVyKSkge1xuICAgICAgICAgICAgYXNzZXJ0U2FmZVByb21pc2UoaW5uZXIpO1xuICAgICAgICAgICAgcmV0dXJuICdwcm9taXNlJztcbiAgICAgICAgICB9XG4gICAgICAgICAgdHlwZW9mIGlubmVyLnRoZW4gIT09ICdmdW5jdGlvbicgfHxcbiAgICAgICAgICAgIEZhaWxgQ2Fubm90IHBhc3Mgbm9uLXByb21pc2UgdGhlbmFibGVzYDtcbiAgICAgICAgICBjb25zdCBwYXNzU3R5bGVUYWcgPSBpbm5lcltQQVNTX1NUWUxFXTtcbiAgICAgICAgICBpZiAocGFzc1N0eWxlVGFnICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGFzc2VydC50eXBlb2YocGFzc1N0eWxlVGFnLCAnc3RyaW5nJyk7XG4gICAgICAgICAgICBjb25zdCBoZWxwZXIgPSBIZWxwZXJUYWJsZVtwYXNzU3R5bGVUYWddO1xuICAgICAgICAgICAgaGVscGVyICE9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICAgRmFpbGBVbnJlY29nbml6ZWQgUGFzc1N0eWxlOiAke3EocGFzc1N0eWxlVGFnKX1gO1xuICAgICAgICAgICAgYXNzZXJ0VmFsaWQoaGVscGVyLCBpbm5lciwgcGFzc1N0eWxlT2ZSZWN1cik7XG4gICAgICAgICAgICByZXR1cm4gLyoqIEB0eXBlIHtQYXNzU3R5bGV9ICovIChwYXNzU3R5bGVUYWcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmb3IgKGNvbnN0IGhlbHBlciBvZiBwYXNzU3R5bGVIZWxwZXJzKSB7XG4gICAgICAgICAgICBpZiAoaGVscGVyLmNhbkJlVmFsaWQoaW5uZXIpKSB7XG4gICAgICAgICAgICAgIGhlbHBlci5hc3NlcnRSZXN0VmFsaWQoaW5uZXIsIHBhc3NTdHlsZU9mUmVjdXIpO1xuICAgICAgICAgICAgICByZXR1cm4gaGVscGVyLnN0eWxlTmFtZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYXNzZXJ0VmFsaWQocmVtb3RhYmxlSGVscGVyLCBpbm5lciwgcGFzc1N0eWxlT2ZSZWN1cik7XG4gICAgICAgICAgcmV0dXJuICdyZW1vdGFibGUnO1xuICAgICAgICB9XG4gICAgICAgIGNhc2UgJ2Z1bmN0aW9uJzoge1xuICAgICAgICAgIGlzRnJvemVuKGlubmVyKSB8fFxuICAgICAgICAgICAgRmFpbGBDYW5ub3QgcGFzcyBub24tZnJvemVuIG9iamVjdHMgbGlrZSAke2lubmVyfS4gVXNlIGhhcmRlbigpYDtcbiAgICAgICAgICB0eXBlb2YgaW5uZXIudGhlbiAhPT0gJ2Z1bmN0aW9uJyB8fFxuICAgICAgICAgICAgRmFpbGBDYW5ub3QgcGFzcyBub24tcHJvbWlzZSB0aGVuYWJsZXNgO1xuICAgICAgICAgIGFzc2VydFZhbGlkKHJlbW90YWJsZUhlbHBlciwgaW5uZXIsIHBhc3NTdHlsZU9mUmVjdXIpO1xuICAgICAgICAgIHJldHVybiAncmVtb3RhYmxlJztcbiAgICAgICAgfVxuICAgICAgICBkZWZhdWx0OiB7XG4gICAgICAgICAgdGhyb3cgYXNzZXJ0LmZhaWwoWGBVbnJlY29nbml6ZWQgdHlwZW9mICR7cSh0eXBlc3RyKX1gLCBUeXBlRXJyb3IpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHJldHVybiBwYXNzU3R5bGVPZlJlY3VyKHBhc3NhYmxlKTtcbiAgfTtcbiAgcmV0dXJuIGhhcmRlbihwYXNzU3R5bGVPZik7XG59O1xuXG4gICAgICAgY29uc3QgUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2wgPSBTeW1ib2wuZm9yKCdAZW5kbyBwYXNzU3R5bGVPZicpO1xuXG4vKipcbiAqIElmIHRoZXJlIGlzIGFscmVhZHkgYSBQYXNzU3R5bGVPZkVuZG93bWVudFN5bWJvbCBwcm9wZXJ0eSBvbiB0aGUgZ2xvYmFsLFxuICogdGhlbiBwcmVzdW1hYmx5IGl0IHdhcyBlbmRvd2VkIGZvciB1cyBieSBsaXZlc2xvdHMgd2l0aCBhIGBwYXNzU3R5bGVPZmBcbiAqIGZ1bmN0aW9uLCBzbyB3ZSBzaG91bGQgdXNlIGFuZCBleHBvcnQgdGhhdCBvbmUgaW5zdGVhZC5cbiAqIE90aGVyIHNvZnR3YXJlIG1heSBoYXZlIGxlZnQgaXQgZm9yIHVzIGhlcmUsXG4gKiBidXQgaXQgd291bGQgcmVxdWlyZSB3cml0ZSBhY2Nlc3MgdG8gb3VyIGdsb2JhbCwgb3IgdGhlIGFiaWxpdHkgdG9cbiAqIHByb3ZpZGUgZW5kb3dtZW50cyB0byBvdXIgZ2xvYmFsLCBib3RoIG9mIHdoaWNoIHNlZW1zIGFkZXF1YXRlIGFzIGEgdGVzdCBvZlxuICogd2hldGhlciBpdCBpcyBhdXRob3JpemVkIHRvIHNlcnZlIHRoZSBzYW1lIHJvbGUgYXMgbGl2ZXNsb3RzLlxuICpcbiAqIE5PVEUgSEFaQVJEOiBUaGlzIHVzZSBieSBsaXZlc2xvdHMgZG9lcyByZWx5IG9uIGBwYXNzU3R5bGVPZmAgYmVpbmdcbiAqIGRldGVybWluaXN0aWMuIElmIGl0IGlzIG5vdCwgdGhlbiBpbiBhIGxpdmVzbG90LWxpa2UgdmlydHVhbGl6ZWRcbiAqIGVudmlyb25tZW50LCBpdCBjYW4gYmUgdXNlZCB0byBkZXRlY3QgR0MuXG4gKlxuICogQHR5cGUge1Bhc3NTdHlsZU9mfVxuICovJGjNj19vbmNlLlBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sKFBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sKTtcbiAgICAgICBjb25zdCBwYXNzU3R5bGVPZiA9XG4gIChnbG9iYWxUaGlzICYmIGdsb2JhbFRoaXNbUGFzc1N0eWxlT2ZFbmRvd21lbnRTeW1ib2xdKSB8fFxuICBtYWtlUGFzc1N0eWxlT2YoW1xuICAgIENvcHlBcnJheUhlbHBlcixcbiAgICBCeXRlQXJyYXlIZWxwZXIsXG4gICAgQ29weVJlY29yZEhlbHBlcixcbiAgICBUYWdnZWRIZWxwZXIsXG4gICAgRXJyb3JIZWxwZXIsXG4gICAgUmVtb3RhYmxlSGVscGVyLFxuICBdKTskaM2PX29uY2UucGFzc1N0eWxlT2YocGFzc1N0eWxlT2YpO1xuXG4gICAgICAgY29uc3QgYXNzZXJ0UGFzc2FibGUgPSB2YWwgPT4ge1xuICBwYXNzU3R5bGVPZih2YWwpOyAvKiB0aHJvd3MgaWYgdmFsIGlzIG5vdCBhIHBhc3NhYmxlKi9cbn07JGjNj19vbmNlLmFzc2VydFBhc3NhYmxlKGFzc2VydFBhc3NhYmxlKTtcbmhhcmRlbihhc3NlcnRQYXNzYWJsZSk7XG5cbi8qKlxuICogSXMgYHNwZWNpbWVuYCBQYXNzYWJsZT8gVGhpcyByZXR1cm5zIHRydWUgaWZmIGBwYXNzU3R5bGVPZihzcGVjaW1lbilgXG4gKiByZXR1cm5zIGEgc3RyaW5nLiBUaGlzIHJldHVybnMgYGZhbHNlYCBpZmYgYHBhc3NTdHlsZU9mKHNwZWNpbWVuKWAgdGhyb3dzLlxuICogVW5kZXIgbm8gbm9ybWFsIGNpcmN1bXN0YW5jZSBzaG91bGQgYGlzUGFzc2FibGUoc3BlY2ltZW4pYCB0aHJvdy5cbiAqXG4gKiBUT0RPIERlcHJlY2F0ZSBhbmQgdWx0aW1hdGVseSBkZWxldGUgQGFnb3JpYy9iYXNlLXpvbmUncyBgaXNQYXNzYWJsZScgaW5cbiAqIGZhdm9yIG9mIHRoaXMgb25lLlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMjA5NlxuICpcbiAqIFRPRE8gaW1wbGVtZW50IGFuIGlzUGFzc2FibGUgdGhhdCBkb2VzIG5vdCByZWx5IG9uIHRyeS9jYXRjaC5cbiAqIFRoaXMgaW1wbGVtZW50YXRpb24gaXMganVzdCBhIHN0YW5kaW4gdW50aWwgdGhlbi5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vaXNzdWVzLzIwOTZcbiAqXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEByZXR1cm5zIHtzcGVjaW1lbiBpcyBQYXNzYWJsZX1cbiAqL1xuICAgICAgIGNvbnN0IGlzUGFzc2FibGUgPSBzcGVjaW1lbiA9PiB7XG4gIHRyeSB7XG4gICAgLyogSW4gZmFjdCwgaXQgbmV2ZXIgcmV0dXJucyB1bmRlZmluZWQuIEl0IGVpdGhlciByZXR1cm5zIGEqL1xuICAgIC8qIHN0cmluZyBvciB0aHJvd3MuKi9cbiAgICByZXR1cm4gcGFzc1N0eWxlT2Yoc3BlY2ltZW4pICE9PSB1bmRlZmluZWQ7XG4gIH0gY2F0Y2ggKF8pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn07JGjNj19vbmNlLmlzUGFzc2FibGUoaXNQYXNzYWJsZSk7XG5oYXJkZW4oaXNQYXNzYWJsZSk7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7UHJvcGVydHlEZXNjcmlwdG9yfSBkZXNjXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXNQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjID0gKG5hbWUsIGRlc2MpID0+XG4gIGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKG5hbWUsIGRlc2MsIHBhc3NTdHlsZU9mKTtcblxuLyoqXG4gKiBBZnRlciBoYXJkZW5pbmcsIGlmIGBlcnJgIGlzIGEgcGFzc2FibGUgZXJyb3IsIHJldHVybiBpdC5cbiAqXG4gKiBPdGhlcndpc2UsIHJldHVybiBhIG5ldyBwYXNzYWJsZSBlcnJvciB0aGF0IHByb3BhZ2F0ZXMgdGhlIGRpYWdub3N0aWNcbiAqIGluZm8gb2YgdGhlIG9yaWdpbmFsLCBhbmQgaXMgbGlua2VkIHRvIHRoZSBvcmlnaW5hbCBhcyBhIG5vdGUuXG4gKlxuICogVE9ETyBBZG9wdCBhIG1vcmUgZmxleGlibGUgbm90aW9uIG9mIHBhc3NhYmxlIGVycm9yLCBpbiB3aGljaFxuICogYSBwYXNzYWJsZSBlcnJvciBjYW4gY29udGFpbiBvdGhlciBvd24gZGF0YSBwcm9wZXJ0aWVzIHdpdGhcbiAqIHRocm93YWJsZSB2YWx1ZXMuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcmV0dXJucyB7RXJyb3J9XG4gKi9cbiAgICAgICBjb25zdCB0b1Bhc3NhYmxlRXJyb3IgPSBlcnIgPT4ge1xuICBoYXJkZW4oZXJyKTtcbiAgaWYgKGNoZWNrUmVjdXJzaXZlbHlQYXNzYWJsZUVycm9yKGVyciwgcGFzc1N0eWxlT2YpKSB7XG4gICAgcmV0dXJuIGVycjtcbiAgfVxuICBjb25zdCB7IG5hbWUsIG1lc3NhZ2UgfSA9IGVycjtcbiAgY29uc3QgeyBjYXVzZTogY2F1c2VEZXNjLCBlcnJvcnM6IGVycm9yc0Rlc2MgfSA9XG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhlcnIpO1xuICBsZXQgY2F1c2U7XG4gIGxldCBlcnJvcnM7XG4gIGlmIChjYXVzZURlc2MgJiYgaXNQYXNzYWJsZUVycm9yUHJvcGVydHlEZXNjKCdjYXVzZScsIGNhdXNlRGVzYykpIHtcbiAgICBjYXVzZSA9IGNhdXNlRGVzYy52YWx1ZTtcbiAgfVxuICBpZiAoZXJyb3JzRGVzYyAmJiBpc1Bhc3NhYmxlRXJyb3JQcm9wZXJ0eURlc2MoJ2Vycm9ycycsIGVycm9yc0Rlc2MpKSB7XG4gICAgZXJyb3JzID0gZXJyb3JzRGVzYy52YWx1ZTtcbiAgfVxuXG4gIGNvbnN0IGVyckNvbnN0cnVjdG9yID0gZ2V0RXJyb3JDb25zdHJ1Y3RvcihgJHtuYW1lfWApIHx8IEVycm9yO1xuICBjb25zdCBuZXdFcnJvciA9IG1ha2VFcnJvcihgJHttZXNzYWdlfWAsIGVyckNvbnN0cnVjdG9yLCB7XG4gICAgLyogQHRzLWlnbm9yZSBBc3N1bWluZyBjYXVzZSBpcyBFcnJvciB8IHVuZGVmaW5lZCovXG4gICAgY2F1c2UsXG4gICAgZXJyb3JzLFxuICB9KTtcbiAgLyogU3RpbGwgbmVlZGVkLCBiZWNhdXNlIGBtYWtlRXJyb3JgIG9ubHkgZG9lcyBhIHNoYWxsb3cgZnJlZXplLiovXG4gIGhhcmRlbihuZXdFcnJvcik7XG4gIC8qIEV2ZW4gdGhlIGNsZWFuZWQgdXAgZXJyb3IgY29weSwgaWYgc2VudCB0byB0aGUgY29uc29sZSwgc2hvdWxkKi9cbiAgLyogY2F1c2UgaGlkZGVuIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gb2YgdGhlIG9yaWdpbmFsIGVycm9yKi9cbiAgLyogdG8gYmUgbG9nZ2VkLiovXG4gIGFubm90YXRlRXJyb3IobmV3RXJyb3IsIFhgY29waWVkIGZyb20gZXJyb3IgJHtlcnJ9YCk7XG4gIHBhc3NTdHlsZU9mKG5ld0Vycm9yKSA9PT0gJ2Vycm9yJyB8fFxuICAgIEZhaWxgRXhwZWN0ZWQgJHtuZXdFcnJvcn0gdG8gYmUgYSBwYXNzYWJsZSBlcnJvcmA7XG4gIHJldHVybiBuZXdFcnJvcjtcbn07JGjNj19vbmNlLnRvUGFzc2FibGVFcnJvcih0b1Bhc3NhYmxlRXJyb3IpO1xuaGFyZGVuKHRvUGFzc2FibGVFcnJvcik7XG5cbi8qKlxuICogQWZ0ZXIgaGFyZGVuaW5nLCBpZiBgc3BlY2ltZW5gIGlzIHRocm93YWJsZSwgcmV0dXJuIGl0LlxuICogQSBzcGVjaW1lbiBpcyB0aHJvd2FibGUgaWZmIGl0IGlzIFBhc3NhYmxlIGFuZCBjb250YWlucyBubyBQYXNzYWJsZUNhcHMsXG4gKiBpLmUuLCBubyBSZW1vdGFibGVzIG9yIFByb21pc2VzLlxuICogSU9XLCBpZiBpdCBjb250YWlucyBvbmx5IGNvcHktZGF0YSBhbmQgcGFzc2FibGUgZXJyb3JzLlxuICpcbiAqIE90aGVyd2lzZSwgaWYgYHNwZWNpbWVuYCBpcyAqYWxtb3N0KiB0aHJvd2FibGUsIGZvciBleGFtcGxlLCBpdCBpc1xuICogYW4gZXJyb3IgdGhhdCBjYW4gYmUgbWFkZSB0aHJvd2FibGUgYnkgYHRvUGFzc2FibGVFcnJvcmAsIHRoZW5cbiAqIHJldHVybiBgc3BlY2ltZW5gIGNvbnZlcnRlZCB0byBhIHRocm93YWJsZS5cbiAqXG4gKiBPdGhlcndpc2UsIHRocm93IGEgZGlhZ25vc3RpYyBpbmRpY2F0aW5nIGEgZmFpbHVyZSB0byBjb2VyY2UuXG4gKlxuICogVGhpcyBpcyBpbiBzdXBwb3J0IG9mIHRoZSBleG8gYm91bmRhcnkgdGhyb3dpbmcgb25seSB0aHJvd2FibGVzLCB0byBlYXNlXG4gKiBzZWN1cml0eSByZXZpZXcuXG4gKlxuICogVE9ETyBBZG9wdCBhIG1vcmUgZmxleGl0YmxlIG5vdGlvbiBvZiB0aHJvd2FibGUsIGluIHdoaWNoXG4gKiBkYXRhIGNvbnRhaW5lcnMgY29udGFpbmluZyBub24tcGFzc2FibGUgZXJyb3JzIGNhbiB0aGVtc2VsdmVzIGJlIGNvZXJjZWRcbiAqIHRvIHRocm93YWJsZSBieSBjb2VyY2luZyB0byBhIHNpbWlsYXIgY29udGFpbmVycyBjb250YWluaW5nXG4gKiB0aGUgcmVzdWx0cyBvZiBjb2VyY2luZyB0aG9zZSBlcnJvcnMgdG8gcGFzc2FibGUgZXJyb3JzLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gc3BlY2ltZW5cbiAqIEByZXR1cm5zIHtQYXNzYWJsZTxuZXZlciwgRXJyb3I+fVxuICovXG4gICAgICAgY29uc3QgdG9UaHJvd2FibGUgPSBzcGVjaW1lbiA9PiB7XG4gIGhhcmRlbihzcGVjaW1lbik7XG4gIGlmIChpc0Vycm9yTGlrZShzcGVjaW1lbikpIHtcbiAgICByZXR1cm4gdG9QYXNzYWJsZUVycm9yKC8qKiBAdHlwZSB7RXJyb3J9ICovIChzcGVjaW1lbikpO1xuICB9XG4gIGlmICghaXNQcmltaXRpdmUoc3BlY2ltZW4pKSB7XG4gICAgLyogTm90ZSB0aGF0IHRoaXMgc3RlcCB3aWxsIGZhaWwgaWYgYHNwZWNpbWVuYCB3b3VsZCBiZSBhIHBhc3NhYmxlIGNvbnRhaW5lciovXG4gICAgLyogZXhjZXB0IHRoYXQgaXQgY29udGFpbnMgbm9uLXBhc3NhYmxlIGVycm9ycyB0aGF0IGNvdWxkIGJlIGNvbnZlcnRlZC4qL1xuICAgIC8qIFRoaXMgd2lsbCBuZWVkIHRvIGJlIGZpeGVkIHRvIGRvIHRoZSBUT0RPIGFib3ZlLiovXG4gICAgY29uc3QgcGFzc1N0eWxlID0gLyoqIEB0eXBlIHtQYXNzU3R5bGV9ICovIChwYXNzU3R5bGVPZihzcGVjaW1lbikpO1xuICAgIHN3aXRjaCAocGFzc1N0eWxlKSB7XG4gICAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnRzID0gLyoqIEB0eXBlIHtDb3B5QXJyYXl9ICovIChzcGVjaW1lbik7XG4gICAgICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBlbGVtZW50cykge1xuICAgICAgICAgIGVsZW1lbnQgPT09IHRvVGhyb3dhYmxlKGVsZW1lbnQpIHx8XG4gICAgICAgICAgICBGYWlsYG5lc3RlZCB0b1Rocm93YWJsZSBjb2VyY2lvbiBub3QgeWV0IHN1cHBvcnRlZCAke2VsZW1lbnR9YDtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICAgIGNvbnN0IHJlYyA9IC8qKiBAdHlwZSB7Q29weVJlY29yZH0gKi8gKHNwZWNpbWVuKTtcbiAgICAgICAgZm9yIChjb25zdCB2YWwgb2YgdmFsdWVzKHJlYykpIHtcbiAgICAgICAgICB2YWwgPT09IHRvVGhyb3dhYmxlKHZhbCkgfHxcbiAgICAgICAgICAgIEZhaWxgbmVzdGVkIHRvVGhyb3dhYmxlIGNvZXJjaW9uIG5vdCB5ZXQgc3VwcG9ydGVkICR7dmFsfWA7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAgIGNvbnN0IHRnID0gLyoqIEB0eXBlIHtDb3B5VGFnZ2VkfSAqLyAoc3BlY2ltZW4pO1xuICAgICAgICBjb25zdCB7IHBheWxvYWQgfSA9IHRnO1xuICAgICAgICBwYXlsb2FkID09PSB0b1Rocm93YWJsZShwYXlsb2FkKSB8fFxuICAgICAgICAgIEZhaWxgbmVzdGVkIHRvVGhyb3dhYmxlIGNvZXJjaW9uIG5vdCB5ZXQgc3VwcG9ydGVkICR7cGF5bG9hZH1gO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICBjb25zdCBlciA9IC8qKiBAdHlwZSB7RXJyb3J9ICovIChzcGVjaW1lbik7XG4gICAgICAgIGVyID09PSB0b1Rocm93YWJsZShlcikgfHxcbiAgICAgICAgICBGYWlsYG5lc3RlZCB0b1Rocm93YWJsZSBjb2VyY2lvbiBub3QgeWV0IHN1cHBvcnRlZCAke2VyfWA7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICB0aHJvdyBGYWlsYEEgJHtxKHBhc3NTdHlsZSl9IGlzIG5vdCB0aHJvd2FibGU6ICR7c3BlY2ltZW59YDtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIC8qKiBAdHlwZSB7UGFzc2FibGU8bmV2ZXIsbmV2ZXI+fSAqLyAoc3BlY2ltZW4pO1xufTskaM2PX29uY2UudG9UaHJvd2FibGUodG9UaHJvd2FibGUpO1xuaGFyZGVuKHRvVGhyb3dhYmxlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sIjpbIlBhc3NTdHlsZU9mRW5kb3dtZW50U3ltYm9sIl0sInBhc3NTdHlsZU9mIjpbInBhc3NTdHlsZU9mIl0sImFzc2VydFBhc3NhYmxlIjpbImFzc2VydFBhc3NhYmxlIl0sImlzUGFzc2FibGUiOlsiaXNQYXNzYWJsZSJdLCJ0b1Bhc3NhYmxlRXJyb3IiOlsidG9QYXNzYWJsZUVycm9yIl0sInRvVGhyb3dhYmxlIjpbInRvVGhyb3dhYmxlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPucn7IwLgAAMC4AACgAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvcmVtb3RhYmxlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiUmVtb3RhYmxlSGVscGVyIiwiYXNzZXJ0SWZhY2UiLCJjYW5CZU1ldGhvZCIsImdldEludGVyZmFjZU9mIiwiZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHEsZ2V0TWV0aG9kTmFtZXMsYXNzZXJ0Q2hlY2tlcixQQVNTX1NUWUxFLGNoZWNrVGFnUmVjb3JkLGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQsaXNQcmltaXRpdmUsZ2V0VGFnLENYOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2V2ZW50dWFsLXNlbmQvdXRpbHMuanNcIiwgW1tcImdldE1ldGhvZE5hbWVzXCIsWyRozY9fYSA9PiAoZ2V0TWV0aG9kTmFtZXMgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJQQVNTX1NUWUxFXCIsWyRozY9fYSA9PiAoUEFTU19TVFlMRSA9ICRozY9fYSldXSxbXCJjaGVja1RhZ1JlY29yZFwiLFskaM2PX2EgPT4gKGNoZWNrVGFnUmVjb3JkID0gJGjNj19hKV1dLFtcImNoZWNrRnVuY3Rpb25UYWdSZWNvcmRcIixbJGjNj19hID0+IChjaGVja0Z1bmN0aW9uVGFnUmVjb3JkID0gJGjNj19hKV1dLFtcImlzUHJpbWl0aXZlXCIsWyRozY9fYSA9PiAoaXNQcmltaXRpdmUgPSAkaM2PX2EpXV0sW1wiZ2V0VGFnXCIsWyRozY9fYSA9PiAoZ2V0VGFnID0gJGjNj19hKV1dLFtcIkNYXCIsWyRozY9fYSA9PiAoQ1ggPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0NoZWNrZXIsIFJlbW90YWJsZU1ldGhvZE5hbWV9IGZyb20gJy4vdHlwZXMuanMnXG4gKiBAaW1wb3J0IHtJbnRlcmZhY2VTcGVjLCBQYXNzU3R5bGVkfSBmcm9tICcuL3R5cGVzLmpzJ1xuICogQGltcG9ydCB7UGFzc1N0eWxlSGVscGVyfSBmcm9tICcuL2ludGVybmFsLXR5cGVzLmpzJ1xuICogQGltcG9ydCB7UmVtb3RhYmxlT2JqZWN0fSBmcm9tICcuL3R5cGVzLmpzJ1xuICovXG5cbi8qKlxuICogRm9yIGEgZnVuY3Rpb24gdG8gYmUgYSB2YWxpZCBtZXRob2QsIGl0IG11c3Qgbm90IGJlIHBhc3NhYmxlLlxuICogT3RoZXJ3aXNlLCB3ZSByaXNrIGNvbmZ1c2luZyBwYXNzLWJ5LWNvcHkgZGF0YSBjYXJyeWluZ1xuICogZmFyIGZ1bmN0aW9ucyB3aXRoIGF0dGVtcHRzIGF0IGZhciBvYmplY3RzIHdpdGggbWV0aG9kcy5cbiAqXG4gKiBUT0RPIEhBWkFSRCBCZWNhdXNlIHdlIGNoZWNrIHRoaXMgb24gdGhlIHdheSB0byBoYXJkZW5pbmcgYSByZW1vdGFibGUsXG4gKiB3ZSBjYW5ub3QgeWV0IGNoZWNrIHRoYXQgYGZ1bmNgIGlzIGhhcmRlbmVkLiBIb3dldmVyLCB3aXRob3V0XG4gKiBkb2luZyBzbywgaXQncyBpbmhlcml0YW5jZSBtaWdodCBjaGFuZ2UgYWZ0ZXIgdGhlIGBQQVNTX1NUWUxFYFxuICogY2hlY2sgYmVsb3cuXG4gKlxuICogQHBhcmFtIHthbnl9IGZ1bmNcbiAqIEByZXR1cm5zIHtmdW5jIGlzIENhbGxhYmxlRnVuY3Rpb259XG4gKi9cbiAgICAgICBjb25zdCBjYW5CZU1ldGhvZCA9IGZ1bmMgPT5cbiAgdHlwZW9mIGZ1bmMgPT09ICdmdW5jdGlvbicgJiYgIShQQVNTX1NUWUxFIGluIGZ1bmMpOyRozY9fb25jZS5jYW5CZU1ldGhvZChjYW5CZU1ldGhvZCk7XG5oYXJkZW4oY2FuQmVNZXRob2QpO1xuXG4vKiBUT0RPIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMjg4NCovXG4vKiBBYnN0cmFjdCBvdXQgY2FuQmVNZXRob2ROYW1lIHNvIGxhdGVyIFBScyBhZ3JlZSBvbiBtZXRob2QgbmFtZSByZXN0cmljdGlvbnMuKi9cblxuLyoqXG4gKiBAcGFyYW0ge2FueX0ga2V5XG4gKiBAcmV0dXJucyB7a2V5IGlzIFJlbW90YWJsZU1ldGhvZE5hbWV9XG4gKi9cbmNvbnN0IGNhbkJlTWV0aG9kTmFtZSA9IGtleSA9PlxuICAvKiB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyB8fCB0eXBlb2Yga2V5ID09PSAnc3ltYm9sJzsqL1xuICB0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyB8fCB0eXBlb2Yga2V5ID09PSAnc3ltYm9sJyB8fCB0eXBlb2Yga2V5ID09PSAnbnVtYmVyJztcbmhhcmRlbihjYW5CZU1ldGhvZE5hbWUpO1xuXG4vKipcbiAqIFVzZXMgdGhlIGBnZXRNZXRob2ROYW1lc2AgZnJvbSB0aGUgZXZlbnR1YWwtc2VuZCBsZXZlbCBvZiBhYnN0cmFjdGlvbiB0aGF0XG4gKiBkb2VzIG5vdCBrbm93IGFueXRoaW5nIGFib3V0IHJlbW90YWJsZXMuXG4gKlxuICogQ3VycmVudGx5LCBqdXN0IGFsaWFzIGBnZXRNZXRob2ROYW1lc2AgYnV0IHRoaXMgYWJzdHJhY3Rpb24gZXhpc3RzIHNvXG4gKiBhIGZ1dHVyZSBQUiBjYW4gZW5mb3JjZSByZXN0cmljdGlvbnMgb24gbWV0aG9kIG5hbWVzIG9mIHJlbW90YWJsZXMuXG4gKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCBDYWxsYWJsZUZ1bmN0aW9uPn0gVFxuICogQHBhcmFtIHtUfSBiZWhhdmlvck1ldGhvZHNcbiAqIEByZXR1cm5zIHtSZW1vdGFibGVNZXRob2ROYW1lW119XG4gKi9cbiAgICAgICBjb25zdCBnZXRSZW1vdGFibGVNZXRob2ROYW1lcyA9IGJlaGF2aW9yTWV0aG9kcyA9PlxuICBnZXRNZXRob2ROYW1lcyhiZWhhdmlvck1ldGhvZHMpOyRozY9fb25jZS5nZXRSZW1vdGFibGVNZXRob2ROYW1lcyhnZXRSZW1vdGFibGVNZXRob2ROYW1lcyk7XG5oYXJkZW4oZ2V0UmVtb3RhYmxlTWV0aG9kTmFtZXMpO1xuXG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5jb25zdCB7IGlzQXJyYXkgfSA9IEFycmF5O1xuY29uc3Qge1xuICBnZXRQcm90b3R5cGVPZixcbiAgaXNGcm96ZW4sXG4gIHByb3RvdHlwZTogb2JqZWN0UHJvdG90eXBlLFxuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzLFxuICBoYXNPd24sXG59ID0gT2JqZWN0O1xuXG4vKipcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gaWZhY2VcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICovXG5jb25zdCBjaGVja0lmYWNlID0gKGlmYWNlLCBjaGVjaykgPT4ge1xuICByZXR1cm4gKFxuICAgIC8qIFRPRE8gb3RoZXIgcG9zc2libGUgaWZhY2VzLCBvbmNlIHdlIGhhdmUgdGhpcmQgcGFydHkgdmVyYWNpdHkqL1xuICAgICh0eXBlb2YgaWZhY2UgPT09ICdzdHJpbmcnIHx8XG4gICAgICAoISFjaGVjayAmJlxuICAgICAgICBDWChcbiAgICAgICAgICBjaGVjayxcbiAgICAgICAgKWBGb3Igbm93LCBpbnRlcmZhY2UgJHtpZmFjZX0gbXVzdCBiZSBhIHN0cmluZzsgdW5pbXBsZW1lbnRlZGApKSAmJlxuICAgIChpZmFjZSA9PT0gJ1JlbW90YWJsZScgfHxcbiAgICAgIGlmYWNlLnN0YXJ0c1dpdGgoJ0FsbGVnZWQ6ICcpIHx8XG4gICAgICBpZmFjZS5zdGFydHNXaXRoKCdEZWJ1Z05hbWU6ICcpIHx8XG4gICAgICAoISFjaGVjayAmJlxuICAgICAgICBDWChjaGVjaylgRm9yIG5vdywgaWZhY2UgJHtxKFxuICAgICAgICAgIGlmYWNlLFxuICAgICAgICApfSBtdXN0IGJlIFwiUmVtb3RhYmxlXCIgb3IgYmVnaW4gd2l0aCBcIkFsbGVnZWQ6IFwiIG9yIFwiRGVidWdOYW1lOiBcIjsgdW5pbXBsZW1lbnRlZGApKVxuICApO1xufTtcblxuLyoqXG4gKiBBbiBgaWZhY2VgIG11c3QgYmUgcHVyZS4gUmlnaHQgbm93IGl0IG11c3QgYmUgYSBzdHJpbmcsIHdoaWNoIGlzIHB1cmUuXG4gKiBMYXRlciB3ZSBleHBlY3QgdG8gaW5jbHVkZSBzb21lIG90aGVyIHZhbHVlcyB0aGF0IHF1YWxpZnkgYXMgYFB1cmVEYXRhYCxcbiAqIHdoaWNoIGlzIGEgcGFzcy1ieS1jb3B5IHN1cGVyc3RydWN0dXJlIGVuZGluZyBvbmx5IGluIHByaW1pdGl2ZXMgb3JcbiAqIGVtcHR5IHBhc3MtYnktY29weSBjb21wb3NpdGVzLiBObyByZW1vdGFibGVzLCBwcm9taXNlcywgb3IgZXJyb3JzLlxuICogV2UgKmFzc3VtZSogZm9yIG5vdyB0aGF0IHRoZSBwYXNzLWJ5LWNvcHkgc3VwZXJzdHJ1Y3R1cmUgY29udGFpbnMgbm9cbiAqIHByb3hpZXMuXG4gKlxuICogQHBhcmFtIHtJbnRlcmZhY2VTcGVjfSBpZmFjZVxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0SWZhY2UgPSBpZmFjZSA9PiBjaGVja0lmYWNlKGlmYWNlLCBhc3NlcnRDaGVja2VyKTskaM2PX29uY2UuYXNzZXJ0SWZhY2UoYXNzZXJ0SWZhY2UpO1xuaGFyZGVuKGFzc2VydElmYWNlKTtcblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdCB8IEZ1bmN0aW9ufSBvcmlnaW5hbFxuICogQHBhcmFtIHtDaGVja2VyfSBbY2hlY2tdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tSZW1vdGFibGVQcm90b09mID0gKG9yaWdpbmFsLCBjaGVjaykgPT4ge1xuICAhaXNQcmltaXRpdmUob3JpZ2luYWwpIHx8XG4gICAgRmFpbGBSZW1vdGFibGVzIG11c3QgYmUgb2JqZWN0cyBvciBmdW5jdGlvbnM6ICR7b3JpZ2luYWx9YDtcblxuICAvKiBBIHZhbGlkIHJlbW90YWJsZSBvYmplY3QgbXVzdCBpbmhlcml0IGZyb20gYSBcInRhZyByZWNvcmRcIiAtLSBhKi9cbiAgLyogcGxhaW4tb2JqZWN0IHByb3RvdHlwZSBjb25zaXN0aW5nIG9mIG9ubHkqL1xuICAvKiBhIGBQQVNTX1NUWUxFYCBwcm9wZXJ0eSB3aXRoIHZhbHVlIFwicmVtb3RhYmxlXCIgYW5kIGEgc3VpdGFibGUgYFN5bWJvbC50b1N0cmluZ1RhZ2AqL1xuICAvKiBwcm9wZXJ0eS4gVGhlIHJlbW90YWJsZSBjb3VsZCBpbmhlcml0IGRpcmVjdGx5IGZyb20gc3VjaCBhIHRhZyByZWNvcmQsIG9yKi9cbiAgLyogaXQgY291bGQgaW5oZXJpdCBmcm9tIGFub3RoZXIgdmFsaWQgcmVtb3RhYmxlLCB0aGF0IHRoZXJlZm9yZSBpdHNlbGYqL1xuICAvKiBpbmhlcml0cyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGZyb20gc3VjaCBhIHRhZyByZWNvcmQuKi9cbiAgLyoqL1xuICAvKiBUT0RPOiBJdCB3b3VsZCBiZSBuaWNlIHRvIHR5cGVkZWYgdGhpcyBzaGFwZSwgYnV0IHdlIGNhbid0IGRlY2xhcmUgYSB0eXBlKi9cbiAgLyogd2l0aCBQQVNTX1NUWUxFIGZyb20gSlNEb2MuKi9cbiAgLyoqL1xuICAvKiBAdHlwZSB7eyBbUEFTU19TVFlMRV06IHN0cmluZywqL1xuICAvKiBbU3ltYm9sLnRvU3RyaW5nVGFnXTogc3RyaW5nLCovXG4gIC8qIH19Ki9cbiAgLyoqL1xuICBjb25zdCBwcm90byA9IGdldFByb3RvdHlwZU9mKG9yaWdpbmFsKTtcbiAgaWYgKFxuICAgIHByb3RvID09PSBvYmplY3RQcm90b3R5cGUgfHxcbiAgICBwcm90byA9PT0gbnVsbCB8fFxuICAgIHByb3RvID09PSBGdW5jdGlvbi5wcm90b3R5cGVcbiAgKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhY2hlY2sgJiZcbiAgICAgIENYKGNoZWNrKWBSZW1vdGFibGVzIG11c3QgYmUgZXhwbGljaXRseSBkZWNsYXJlZDogJHtxKG9yaWdpbmFsKX1gXG4gICAgKTtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb3JpZ2luYWwgPT09ICdvYmplY3QnKSB7XG4gICAgY29uc3QgcHJvdG9Qcm90byA9IGdldFByb3RvdHlwZU9mKHByb3RvKTtcbiAgICBpZiAocHJvdG9Qcm90byAhPT0gb2JqZWN0UHJvdG90eXBlICYmIHByb3RvUHJvdG8gIT09IG51bGwpIHtcbiAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgICByZXR1cm4gY2hlY2tSZW1vdGFibGUocHJvdG8sIGNoZWNrKTtcbiAgICB9XG4gICAgaWYgKCFjaGVja1RhZ1JlY29yZChwcm90bywgJ3JlbW90YWJsZScsIGNoZWNrKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2Ygb3JpZ2luYWwgPT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAoIWNoZWNrRnVuY3Rpb25UYWdSZWNvcmQocHJvdG8sICdyZW1vdGFibGUnLCBjaGVjaykpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKiBUeXBlY2FzdHMgbmVlZGVkIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzE4NjMqL1xuICBjb25zdCBwYXNzU3R5bGVLZXkgPSAvKiogQHR5cGUge3Vua25vd259ICovIChQQVNTX1NUWUxFKTtcbiAgY29uc3QgdGFnS2V5ID0gLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoU3ltYm9sLnRvU3RyaW5nVGFnKTtcbiAgY29uc3Qge1xuICAgIC8qIGNoZWNrVGFnUmVjb3JkIGFscmVhZHkgdmVyaWZpZWQgUEFTU19TVFlMRSBhbmQgU3ltYm9sLnRvU3RyaW5nVGFnIG93biBkYXRhIHByb3BlcnRpZXMuKi9cbiAgICBbLyoqIEB0eXBlIHtzdHJpbmd9ICovIChwYXNzU3R5bGVLZXkpXTogX3Bhc3NTdHlsZURlc2MsXG4gICAgWy8qKiBAdHlwZSB7c3RyaW5nfSAqLyAodGFnS2V5KV06IHsgdmFsdWU6IGlmYWNlIH0sXG4gICAgLi4ucmVzdERlc2NzXG4gIH0gPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHByb3RvKTtcblxuICByZXR1cm4gKFxuICAgIChvd25LZXlzKHJlc3REZXNjcykubGVuZ3RoID09PSAwIHx8XG4gICAgICAoISFjaGVjayAmJlxuICAgICAgICBDWChcbiAgICAgICAgICBjaGVjayxcbiAgICAgICAgKWBVbmV4cGVjdGVkIHByb3BlcnRpZXMgb24gUmVtb3RhYmxlIFByb3RvICR7b3duS2V5cyhyZXN0RGVzY3MpfWApKSAmJlxuICAgIGNoZWNrSWZhY2UoaWZhY2UsIGNoZWNrKVxuICApO1xufTtcblxuLyoqXG4gKiBLZWVwIGEgd2VhayBzZXQgb2YgY29uZmlybWVkIHJlbW90YWJsZXMgZm9yIG1hcnNoYWwgcGVyZm9ybWFuY2VcbiAqICh3aXRob3V0IHdoaWNoIHdlIHdvdWxkIGluY3VyIGEgcmVkdW5kYW50IHZlcmlmaWNhdGlvbiBpblxuICogZ2V0SW50ZXJmYWNlT2YpLlxuICogV2UgZG9uJ3QgcmVtZW1iZXIgcmVqZWN0aW9ucyBiZWNhdXNlIHRoZXkgYXJlIHBvc3NpYmxlIHRvIGNvcnJlY3RcbiAqIHdpdGggZS5nLiBgaGFyZGVuYC5cbiAqXG4gKiBAdHlwZSB7V2Vha1NldDxSZW1vdGFibGVPYmplY3Q+fVxuICovXG5jb25zdCBjb25maXJtZWRSZW1vdGFibGVzID0gbmV3IFdlYWtTZXQoKTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gdmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHt2YWwgaXMgUmVtb3RhYmxlT2JqZWN0fVxuICovXG5jb25zdCBjaGVja1JlbW90YWJsZSA9ICh2YWwsIGNoZWNrKSA9PiB7XG4gIGlmIChjb25maXJtZWRSZW1vdGFibGVzLmhhcyh2YWwpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgaWYgKCFpc0Zyb3plbih2YWwpKSB7XG4gICAgcmV0dXJuIChcbiAgICAgICEhY2hlY2sgJiYgQ1goY2hlY2spYGNhbm5vdCBzZXJpYWxpemUgbm9uLWZyb3plbiBvYmplY3RzIGxpa2UgJHt2YWx9YFxuICAgICk7XG4gIH1cbiAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgaWYgKCFSZW1vdGFibGVIZWxwZXIuY2FuQmVWYWxpZCh2YWwsIGNoZWNrKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBjb25zdCByZXN1bHQgPSBjaGVja1JlbW90YWJsZVByb3RvT2YodmFsLCBjaGVjayk7XG4gIGlmIChyZXN1bHQpIHtcbiAgICBjb25maXJtZWRSZW1vdGFibGVzLmFkZCh2YWwpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFNpbXBsZSBzZW1hbnRpY3MsIGp1c3QgdGVsbCB3aGF0IGludGVyZmFjZSBzcGVjIGEgUmVtb3RhYmxlIGhhcyxcbiAqIG9yIHVuZGVmaW5lZCBpZiBub3QgZGVlbWVkIHRvIGJlIGEgUmVtb3RhYmxlLlxuICpcbiAqIEB0eXBlIHt7XG4gKiA8VCBleHRlbmRzIHN0cmluZz4odmFsOiBQYXNzU3R5bGVkPGFueSwgVD4pOiBUO1xuICogKHZhbDogYW55KTogSW50ZXJmYWNlU3BlYyB8IHVuZGVmaW5lZDtcbiAqIH19XG4gKi9cbiAgICAgICBjb25zdCBnZXRJbnRlcmZhY2VPZiA9IHZhbCA9PiB7XG4gIGlmIChcbiAgICBpc1ByaW1pdGl2ZSh2YWwpIHx8XG4gICAgdmFsW1BBU1NfU1RZTEVdICE9PSAncmVtb3RhYmxlJyB8fFxuICAgICFjaGVja1JlbW90YWJsZSh2YWwpXG4gICkge1xuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgbmFycm93ZWQqL1xuICAgIHJldHVybiB1bmRlZmluZWQ7XG4gIH1cbiAgLyogQHRzLWV4cGVjdC1lcnJvciBuYXJyb3dlZCovXG4gIHJldHVybiBnZXRUYWcodmFsKTtcbn07JGjNj19vbmNlLmdldEludGVyZmFjZU9mKGdldEludGVyZmFjZU9mKTtcbmhhcmRlbihnZXRJbnRlcmZhY2VPZik7XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtQYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbiAgICAgICBjb25zdCBSZW1vdGFibGVIZWxwZXIgPSBoYXJkZW4oe1xuICBzdHlsZU5hbWU6ICdyZW1vdGFibGUnLFxuXG4gIGNhbkJlVmFsaWQ6IChjYW5kaWRhdGUsIGNoZWNrID0gdW5kZWZpbmVkKSA9PiB7XG4gICAgY29uc3QgdmFsaWRUeXBlID1cbiAgICAgICghaXNQcmltaXRpdmUoY2FuZGlkYXRlKSB8fFxuICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgIENYKGNoZWNrKWBjYW5ub3Qgc2VyaWFsaXplIG5vbi1vYmplY3RzIGFzIFJlbW90YWJsZSAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgICAgICghaXNBcnJheShjYW5kaWRhdGUpIHx8XG4gICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgQ1goY2hlY2spYGNhbm5vdCBzZXJpYWxpemUgYXJyYXlzIGFzIFJlbW90YWJsZSAke2NhbmRpZGF0ZX1gKSk7XG4gICAgaWYgKCF2YWxpZFR5cGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICBjb25zdCBkZXNjcyA9IGdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY2FuZGlkYXRlKTtcbiAgICBpZiAodHlwZW9mIGNhbmRpZGF0ZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgIC8qIEV2ZXJ5IG93biBwcm9wZXJ0eSAocmVnYXJkbGVzcyBvZiBlbnVtZXJhYmlsaXR5KSovXG4gICAgICAvKiBtdXN0IGhhdmUgYSBmdW5jdGlvbiB2YWx1ZS4qL1xuICAgICAgcmV0dXJuIG93bktleXMoZGVzY3MpLmV2ZXJ5KGtleSA9PiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgLyogVHlwZWNhc3QgbmVlZGVkIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzE4NjMqL1xuICAgICAgICAgIChoYXNPd24oZGVzY3NbLyoqIEB0eXBlIHtzdHJpbmd9ICovIChrZXkpXSwgJ3ZhbHVlJykgfHxcbiAgICAgICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgICAgIENYKGNoZWNrKWBjYW5ub3Qgc2VyaWFsaXplIFJlbW90YWJsZXMgd2l0aCBhY2Nlc3NvcnMgbGlrZSAke3EoXG4gICAgICAgICAgICAgICAgU3RyaW5nKGtleSksXG4gICAgICAgICAgICAgICl9IGluICR7Y2FuZGlkYXRlfWApKSAmJlxuICAgICAgICAgICgoa2V5ID09PSBTeW1ib2wudG9TdHJpbmdUYWcgJiYgY2hlY2tJZmFjZShjYW5kaWRhdGVba2V5XSwgY2hlY2spKSB8fFxuICAgICAgICAgICAgKChjYW5CZU1ldGhvZChjYW5kaWRhdGVba2V5XSkgfHxcbiAgICAgICAgICAgICAgKCEhY2hlY2sgJiZcbiAgICAgICAgICAgICAgICBDWChjaGVjaylgY2Fubm90IHNlcmlhbGl6ZSBSZW1vdGFibGVzIHdpdGggbm9uLW1ldGhvZHMgbGlrZSAke3EoXG4gICAgICAgICAgICAgICAgICBTdHJpbmcoa2V5KSxcbiAgICAgICAgICAgICAgICApfSBpbiAke2NhbmRpZGF0ZX1gKSkgJiZcbiAgICAgICAgICAgICAgKGtleSAhPT0gUEFTU19TVFlMRSB8fFxuICAgICAgICAgICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgICAgICAgICBDWChjaGVjaylgQSBwYXNzLWJ5LXJlbW90ZSBjYW5ub3Qgc2hhZG93ICR7cShQQVNTX1NUWUxFKX1gKSkpKVxuICAgICAgICApO1xuICAgICAgfSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgY2FuZGlkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAvKiBGYXIgZnVuY3Rpb25zIGNhbm5vdCBiZSBtZXRob2RzLCBhbmQgY2Fubm90IGhhdmUgbWV0aG9kcy4qL1xuICAgICAgLyogVGhleSBtdXN0IGhhdmUgZXhhY3RseSBleHBlY3RlZCBgLm5hbWVgIGFuZCBgLmxlbmd0aGAgcHJvcGVydGllcyovXG4gICAgICBjb25zdCB7XG4gICAgICAgIG5hbWU6IG5hbWVEZXNjLFxuICAgICAgICBsZW5ndGg6IGxlbmd0aERlc2MsXG4gICAgICAgIC8qIEB0cy1pZ25vcmUgVFMgZG9lc24ndCBsaWtlIHN5bWJvbHMgYXMgY29tcHV0ZWQgaW5kZXhlcz8/Ki9cbiAgICAgICAgW1N5bWJvbC50b1N0cmluZ1RhZ106IHRvU3RyaW5nVGFnRGVzYyxcbiAgICAgICAgLi4ucmVzdERlc2NzXG4gICAgICB9ID0gZGVzY3M7XG4gICAgICBjb25zdCByZXN0S2V5cyA9IG93bktleXMocmVzdERlc2NzKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgICgobmFtZURlc2MgJiYgdHlwZW9mIG5hbWVEZXNjLnZhbHVlID09PSAnc3RyaW5nJykgfHxcbiAgICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgICAgQ1goY2hlY2spYEZhciBmdW5jdGlvbiBuYW1lIG11c3QgYmUgYSBzdHJpbmcsIGluICR7Y2FuZGlkYXRlfWApKSAmJlxuICAgICAgICAoKGxlbmd0aERlc2MgJiYgdHlwZW9mIGxlbmd0aERlc2MudmFsdWUgPT09ICdudW1iZXInKSB8fFxuICAgICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgICBDWChcbiAgICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgICApYEZhciBmdW5jdGlvbiBsZW5ndGggbXVzdCBiZSBhIG51bWJlciwgaW4gJHtjYW5kaWRhdGV9YCkpICYmXG4gICAgICAgICh0b1N0cmluZ1RhZ0Rlc2MgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICgodHlwZW9mIHRvU3RyaW5nVGFnRGVzYy52YWx1ZSA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgICAgICghIWNoZWNrICYmXG4gICAgICAgICAgICAgIENYKFxuICAgICAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgICAgICApYEZhciBmdW5jdGlvbiBAQHRvU3RyaW5nVGFnIG11c3QgYmUgYSBzdHJpbmcsIGluICR7Y2FuZGlkYXRlfWApKSAmJlxuICAgICAgICAgICAgY2hlY2tJZmFjZSh0b1N0cmluZ1RhZ0Rlc2MudmFsdWUsIGNoZWNrKSkpICYmXG4gICAgICAgIChyZXN0S2V5cy5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgICAoISFjaGVjayAmJlxuICAgICAgICAgICAgQ1goXG4gICAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgICAgKWBGYXIgZnVuY3Rpb25zIHVuZXhwZWN0ZWQgcHJvcGVydGllcyBiZXNpZGVzIC5uYW1lIGFuZCAubGVuZ3RoICR7cmVzdEtleXN9YCkpXG4gICAgICApO1xuICAgIH1cbiAgICByZXR1cm4gISFjaGVjayAmJiBDWChjaGVjaylgdW5yZWNvZ25pemVkIHR5cGVvZiAke2NhbmRpZGF0ZX1gO1xuICB9LFxuXG4gIGFzc2VydFJlc3RWYWxpZDogY2FuZGlkYXRlID0+IGNoZWNrUmVtb3RhYmxlKGNhbmRpZGF0ZSwgYXNzZXJ0Q2hlY2tlciksXG5cbiAgZXZlcnk6IChfcGFzc2FibGUsIF9mbikgPT4gdHJ1ZSxcbn0pOyRozY9fb25jZS5SZW1vdGFibGVIZWxwZXIoUmVtb3RhYmxlSGVscGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNhbkJlTWV0aG9kIjpbImNhbkJlTWV0aG9kIl0sImdldFJlbW90YWJsZU1ldGhvZE5hbWVzIjpbImdldFJlbW90YWJsZU1ldGhvZE5hbWVzIl0sImFzc2VydElmYWNlIjpbImFzc2VydElmYWNlIl0sImdldEludGVyZmFjZU9mIjpbImdldEludGVyZmFjZU9mIl0sIlJlbW90YWJsZUhlbHBlciI6WyJSZW1vdGFibGVIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAh4APKFIWAABSFgAAKwAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9zYWZlLXByb21pc2UuanN7ImltcG9ydHMiOlsiQGVuZG8vcHJvbWlzZS1raXQiLCJAZW5kby9lcnJvcnMiLCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiYXNzZXJ0U2FmZVByb21pc2UiLCJpc1NhZmVQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgaXNQcm9taXNlLHEsYXNzZXJ0Q2hlY2tlcixDWDskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJpc1Byb21pc2VcIixbJGjNj19hID0+IChpc1Byb21pc2UgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiQ1hcIixbJGjNj19hID0+IChDWCA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuLyoqIEBpbXBvcnQge0NoZWNrZXJ9IGZyb20gJy4vdHlwZXMuanMnICovXG5cbmNvbnN0IHsgaXNGcm96ZW4sIGdldFByb3RvdHlwZU9mLCBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IsIGhhc093biB9ID0gT2JqZWN0O1xuY29uc3QgeyBvd25LZXlzIH0gPSBSZWZsZWN0O1xuY29uc3QgeyB0b1N0cmluZ1RhZyB9ID0gU3ltYm9sO1xuXG4vKipcbiAqIEBwYXJhbSB7UHJvbWlzZX0gcHIgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtwciBpcyBQcm9taXNlfSBXaGV0aGVyIGl0IGlzIGEgc2FmZSBwcm9taXNlXG4gKi9cbmNvbnN0IGNoZWNrUHJvbWlzZU93bktleXMgPSAocHIsIGNoZWNrKSA9PiB7XG4gIGNvbnN0IGtleXMgPSBvd25LZXlzKHByKTtcblxuICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8qKlxuICogVGhpcyBleGNsdWRlcyB0aG9zZSBzeW1ib2wtbmFtZWQgb3duIHByb3BlcnRpZXMgdGhhdCBhcmUgYWxzbyBmb3VuZCBvblxuICogYFByb21pc2UucHJvdG90eXBlYCwgc28gdGhhdCBvdmVycmlkZXMgb2YgdGhlc2UgcHJvcGVydGllcyBjYW4gYmVcbiAqIGV4cGxpY2l0bHkgdG9sZXJhdGVkIGlmIHRoZXkgcGFzcyB0aGUgYGNoZWNrU2FmZU93bktleWAgY2hlY2sgYmVsb3cuXG4gKiBJbiBwYXJ0aWN1bGFyLCB3ZSB3aXNoIHRvIHRvbGVyYXRlXG4gKiAgICogQW4gb3ZlcnJpZGluZyBgdG9TdHJpbmdUYWdgIG5vbi1lbnVtZXJhYmxlIGRhdGEgcHJvcGVydHlcbiAqICAgICB3aXRoIGEgc3RyaW5nIHZhbHVlLlxuICogICAqIFRob3NlIG93biBwcm9wZXJ0aWVzIHRoYXQgbWlnaHQgYmUgYWRkZWQgYnkgTm9kZSdzIGFzeW5jX2hvb2tzLlxuICovXG4gIGNvbnN0IHVua25vd25LZXlzID0ga2V5cy5maWx0ZXIoXG4gICAga2V5ID0+IHR5cGVvZiBrZXkgIT09ICdzeW1ib2wnIHx8ICFoYXNPd24oUHJvbWlzZS5wcm90b3R5cGUsIGtleSksXG4gICk7XG5cbiAgaWYgKHVua25vd25LZXlzLmxlbmd0aCAhPT0gMCkge1xuICAgIHJldHVybiBDWChcbiAgICAgIGNoZWNrLFxuICAgIClgJHtwcn0gLSBNdXN0IG5vdCBoYXZlIGFueSBvd24gcHJvcGVydGllczogJHtxKHVua25vd25LZXlzKX1gO1xuICB9XG5cbiAgLyoqXG4gKiBFeHBsaWNpdGx5IHRvbGVyYXRlIGEgYHRvU3RyaW5nVGFnYCBzeW1ib2wtbmFtZWQgbm9uLWVudW1lcmFibGVcbiAqIGRhdGEgcHJvcGVydHkgd2hvc2UgdmFsdWUgaXMgYSBzdHJpbmcuIE90aGVyd2lzZSwgdG9sZXJhdGUgdGhvc2VcbiAqIHN5bWJvbC1uYW1lZCBwcm9wZXJ0aWVzIHRoYXQgbWlnaHQgYmUgYWRkZWQgYnkgTm9kZUpTJ3MgYXN5bmNfaG9va3MsXG4gKiBpZiB0aGV5IG9iZXkgdGhlIGV4cGVjdGVkIHNhZmV0eSBwcm9wZXJ0aWVzLlxuICpcbiAqIEF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZywgTm9kZSdzIGFzeW5jX2hvb2tzIGNvbnRhaW5zIHRoZVxuICogZm9sbG93aW5nIGNvZGUsIHdoaWNoIHdlIGNhbiBzYWZlbHkgdG9sZXJhdGVcbiAqXG4gKiBgYGBqc1xuICogZnVuY3Rpb24gZGVzdHJveVRyYWNraW5nKHByb21pc2UsIHBhcmVudCkge1xuICogICB0cmFja1Byb21pc2UocHJvbWlzZSwgcGFyZW50KTtcbiAqICAgY29uc3QgYXN5bmNJZCA9IHByb21pc2VbYXN5bmNfaWRfc3ltYm9sXTtcbiAqICAgY29uc3QgZGVzdHJveWVkID0geyBkZXN0cm95ZWQ6IGZhbHNlIH07XG4gKiAgIHByb21pc2VbZGVzdHJveWVkU3ltYm9sXSA9IGRlc3Ryb3llZDtcbiAqICAgcmVnaXN0ZXJEZXN0cm95SG9vayhwcm9taXNlLCBhc3luY0lkLCBkZXN0cm95ZWQpO1xuICogfVxuICogYGBgXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8c3ltYm9sfSBrZXlcbiAqL1xuICBjb25zdCBjaGVja1NhZmVPd25LZXkgPSBrZXkgPT4ge1xuICAgIGlmIChrZXkgPT09IHRvU3RyaW5nVGFnKSB7XG4gICAgICAvKiBUT0RPIHNob3VsZCB3ZSBhbHNvIGVuZm9yY2UgYW55dGhpbmcgb24gdGhlIGNvbnRlbnRzIG9mIHRoZSBzdHJpbmcsKi9cbiAgICAgIC8qIHN1Y2ggYXMgdGhhdCBpdCBtdXN0IHN0YXJ0IHdpdGggYCdQcm9taXNlJ2A/Ki9cbiAgICAgIGNvbnN0IHRhZ0Rlc2MgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHIsIHRvU3RyaW5nVGFnKTtcbiAgICAgIGFzc2VydCh0YWdEZXNjICE9PSB1bmRlZmluZWQpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgKGhhc093bih0YWdEZXNjLCAndmFsdWUnKSB8fFxuICAgICAgICAgIENYKFxuICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgKWBPd24gQEB0b1N0cmluZ1RhZyBtdXN0IGJlIGEgZGF0YSBwcm9wZXJ0eSwgbm90IGFuIGFjY2Vzc29yOiAke3EodGFnRGVzYyl9YCkgJiZcbiAgICAgICAgKHR5cGVvZiB0YWdEZXNjLnZhbHVlID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgIENYKFxuICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgKWBPd24gQEB0b1N0cmluZ1RhZyB2YWx1ZSBtdXN0IGJlIGEgc3RyaW5nOiAke3EodGFnRGVzYy52YWx1ZSl9YCkgJiZcbiAgICAgICAgKCF0YWdEZXNjLmVudW1lcmFibGUgfHxcbiAgICAgICAgICBDWChjaGVjaylgT3duIEBAdG9TdHJpbmdUYWcgbXVzdCBub3QgYmUgZW51bWVyYWJsZTogJHtxKHRhZ0Rlc2MpfWApXG4gICAgICApO1xuICAgIH1cbiAgICBjb25zdCB2YWwgPSBwcltrZXldO1xuICAgIGlmICh2YWwgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIHR5cGVvZiB2YWwgPT09ICdvYmplY3QnICYmXG4gICAgICB2YWwgIT09IG51bGwgJiZcbiAgICAgIGlzRnJvemVuKHZhbCkgJiZcbiAgICAgIGdldFByb3RvdHlwZU9mKHZhbCkgPT09IE9iamVjdC5wcm90b3R5cGVcbiAgICApIHtcbiAgICAgIGNvbnN0IHN1YktleXMgPSBvd25LZXlzKHZhbCk7XG4gICAgICBpZiAoc3ViS2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChcbiAgICAgICAgc3ViS2V5cy5sZW5ndGggPT09IDEgJiZcbiAgICAgICAgc3ViS2V5c1swXSA9PT0gJ2Rlc3Ryb3llZCcgJiZcbiAgICAgICAgdmFsLmRlc3Ryb3llZCA9PT0gZmFsc2VcbiAgICAgICkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIENYKFxuICAgICAgY2hlY2ssXG4gICAgKWBVbmV4cGVjdGVkIE5vZGUgYXN5bmNfaG9va3MgYWRkaXRpb25zIHRvIHByb21pc2U6ICR7cHJ9LiR7cShcbiAgICAgIFN0cmluZyhrZXkpLFxuICAgICl9IGlzICR7dmFsfWA7XG4gIH07XG5cbiAgcmV0dXJuIGtleXMuZXZlcnkoY2hlY2tTYWZlT3duS2V5KTtcbn07XG5cbi8qKlxuICogVW5kZXIgSGFyZGVuZWQgSlMgYSBwcm9taXNlIGlzIFwic2FmZVwiIGlmIGl0cyBgdGhlbmAgbWV0aG9kIGNhbiBiZSBjYWxsZWRcbiAqIHN5bmNocm9ub3VzbHkgd2l0aG91dCBnaXZpbmcgdGhlIHByb21pc2UgYW4gb3Bwb3J0dW5pdHkgZm9yIGFcbiAqIHJlZW50cmFuY3kgYXR0YWNrIGR1cmluZyB0aGF0IGNhbGwuXG4gKlxuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy85XG4gKiByYWlzZXMgdGhlIGlzc3VlIG9mIHRlc3RpbmcgdGhhdCBhIHNwZWNpbWVuIGlzIGEgc2FmZSBwcm9taXNlXG4gKiBzdWNoIHRoYXQgdGhlIHRlc3QgYWxzbyBkb2VzIG5vdCBnaXZlIHRoZSBzcGVjaW1lbiBhXG4gKiByZWVudHJhbmN5IG9wcG9ydHVuaXR5LiBUaGF0IGlzIHdlbGwgYmV5b25kIHRoZSBhbWJpdGlvbiBoZXJlLlxuICogVE9ETyBUaG91Z2ggaWYgd2UgZmlndXJlIG91dCBhIG5pY2Ugc29sdXRpb24sIGl0IG1pZ2h0IGJlIGdvb2QgdG9cbiAqIHVzZSBpdCBoZXJlIGFzIHdlbGwuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBwciBUaGUgdmFsdWUgdG8gZXhhbWluZVxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge3ByIGlzIFByb21pc2V9IFdoZXRoZXIgaXQgaXMgYSBzYWZlIHByb21pc2VcbiAqL1xuY29uc3QgY2hlY2tTYWZlUHJvbWlzZSA9IChwciwgY2hlY2spID0+IHtcbiAgcmV0dXJuIChcbiAgICAoaXNGcm96ZW4ocHIpIHx8IENYKGNoZWNrKWAke3ByfSAtIE11c3QgYmUgZnJvemVuYCkgJiZcbiAgICAoaXNQcm9taXNlKHByKSB8fCBDWChjaGVjaylgJHtwcn0gLSBNdXN0IGJlIGEgcHJvbWlzZWApICYmXG4gICAgKGdldFByb3RvdHlwZU9mKHByKSA9PT0gUHJvbWlzZS5wcm90b3R5cGUgfHxcbiAgICAgIENYKGNoZWNrKWAke3ByfSAtIE11c3QgaW5oZXJpdCBmcm9tIFByb21pc2UucHJvdG90eXBlOiAke3EoXG4gICAgICAgIGdldFByb3RvdHlwZU9mKHByKSxcbiAgICAgICl9YCkgJiZcbiAgICBjaGVja1Byb21pc2VPd25LZXlzKC8qKiBAdHlwZSB7UHJvbWlzZX0gKi8gKHByKSwgY2hlY2spXG4gICk7XG59O1xuaGFyZGVuKGNoZWNrU2FmZVByb21pc2UpO1xuXG4vKipcbiAqIERldGVybWluZSBpZiB0aGUgYXJndW1lbnQgaXMgYSBQcm9taXNlLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gcHIgVGhlIHZhbHVlIHRvIGV4YW1pbmVcbiAqIEByZXR1cm5zIHtwciBpcyBQcm9taXNlfSBXaGV0aGVyIGl0IGlzIGEgcHJvbWlzZVxuICovXG4gICAgICAgY29uc3QgaXNTYWZlUHJvbWlzZSA9IHByID0+IGNoZWNrU2FmZVByb21pc2UocHIsIHggPT4geCk7JGjNj19vbmNlLmlzU2FmZVByb21pc2UoaXNTYWZlUHJvbWlzZSk7XG5oYXJkZW4oaXNTYWZlUHJvbWlzZSk7XG5cbiAgICAgICBjb25zdCBhc3NlcnRTYWZlUHJvbWlzZSA9IHByID0+IGNoZWNrU2FmZVByb21pc2UocHIsIGFzc2VydENoZWNrZXIpOyRozY9fb25jZS5hc3NlcnRTYWZlUHJvbWlzZShhc3NlcnRTYWZlUHJvbWlzZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1NhZmVQcm9taXNlIjpbImlzU2FmZVByb21pc2UiXSwiYXNzZXJ0U2FmZVByb21pc2UiOlsiYXNzZXJ0U2FmZVByb21pc2UiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA/KjZB9sPAADbDwAAJQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9zdHJpbmcuanN7ImltcG9ydHMiOlsiQGVuZG8vZW52LW9wdGlvbnMiLCJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJhc3NlcnRQYXNzYWJsZVN0cmluZyIsImFzc2VydFdlbGxGb3JtZWRTdHJpbmciLCJpc1dlbGxGb3JtZWRTdHJpbmciXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBnZXRFbnZpcm9ubWVudE9wdGlvbixGYWlsOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZW52LW9wdGlvbnNcIiwgW1tcImdldEVudmlyb25tZW50T3B0aW9uXCIsWyRozY9fYSA9PiAoZ2V0RW52aXJvbm1lbnRPcHRpb24gPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV1dKTtcblxuXG4vKiBrbm93IGFib3V0YGlzV2VsbEZvcm1lZGAqL1xuY29uc3QgaGFzV2VsbEZvcm1lZFN0cmluZ01ldGhvZCA9ICEhU3RyaW5nLnByb3RvdHlwZS5pc1dlbGxGb3JtZWQ7XG5cbi8qKlxuICogSXMgdGhlIGFyZ3VtZW50IGEgd2VsbC1mb3JtZWQgc3RyaW5nP1xuICpcbiAqIFVuZm9ydHVuYXRlbHksIHRoZVxuICogW3N0YW5kYXJkIGJ1aWx0LWluIGBTdHJpbmcucHJvdG90eXBlLmlzV2VsbEZvcm1lZGBdKGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWlzLXVzdi1zdHJpbmcpXG4gKiBkb2VzIGEgVG9TdHJpbmcgb24gaXRzIGlucHV0LCBjYXVzaW5nIGl0IHRvIGp1ZGdlIG5vbi1zdHJpbmdzIHRvIGJlXG4gKiB3ZWxsLWZvcm1lZCBzdHJpbmdzIGlmIHRoZXkgY29lcmNlIHRvIGEgd2VsbC1mb3JtZWQgc3RyaW5ncy4gVGhpc1xuICogcmVjYXBpdHVsYXRlcyB0aGUgbWlzdGFrZSBpbiBoYXZpbmcgdGhlIGdsb2JhbCBgaXNOYU5gIGNvZXJjZSBpdHMgaW5wdXRzLFxuICogY2F1c2luZyBpdCB0byBqdWRnZSBub24tc3RyaW5nIHRvIGJlIE5hTiBpZiB0aGV5IGNvZXJjZSB0byBOYU4uXG4gKlxuICogVGhpcyBgaXNXZWxsRm9ybWVkU3RyaW5nYCBmdW5jdGlvbiBvbmx5IGp1ZGdlcyB3ZWxsLWZvcm1lZCBzdHJpbmdzIHRvIGJlXG4gKiB3ZWxsLWZvcm1lZCBzdHJpbmdzLiBGb3IgYWxsIG5vbi1zdHJpbmdzIGl0IHJldHVybnMgZmFsc2UuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBzdHJcbiAqIEByZXR1cm5zIHtzdHIgaXMgc3RyaW5nfVxuICovXG4gICAgICAgY29uc3QgaXNXZWxsRm9ybWVkU3RyaW5nID0gaGFzV2VsbEZvcm1lZFN0cmluZ01ldGhvZFxuICA/IHN0ciA9PiB0eXBlb2Ygc3RyID09PSAnc3RyaW5nJyAmJiBzdHIuaXNXZWxsRm9ybWVkKClcbiAgOiBzdHIgPT4ge1xuICAgICAgaWYgKHR5cGVvZiBzdHIgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIGZvciAoY29uc3QgY2ggb2Ygc3RyKSB7XG4gICAgICAgIC8qIFRoZSBzdHJpbmcgaXRlcmF0b3IgaXRlcmF0ZXMgYnkgVW5pY29kZSBjb2RlIHBvaW50LCBub3QqL1xuICAgICAgICAvKiBVVEYxNiBjb2RlIHVuaXQuIEJ1dCBpZiBpdCBlbmNvdW50ZXJzIGFuIHVucGFpcmVkIHN1cnJvZ2F0ZSwqL1xuICAgICAgICAvKiBpdCB3aWxsIHByb2R1Y2UgaXQuKi9cbiAgICAgICAgY29uc3QgY3AgPSAvKiogQHR5cGUge251bWJlcn0gKi8gKGNoLmNvZGVQb2ludEF0KDApKTtcbiAgICAgICAgaWYgKGNwID49IDB4ZDgwMCAmJiBjcCA8PSAweGRmZmYpIHtcbiAgICAgICAgICAvKiBBbGwgc3Vycm9nYXRlcyBhcmUgaW4gdGhpcyByYW5nZS4gVGhlIHN0cmluZyBpdGVyYXRvciBvbmx5Ki9cbiAgICAgICAgICAvKiBwcm9kdWNlcyBhIGNoYXJhY3RlciBpbiB0aGlzIHJhbmdlIGZvciB1bnBhaXJlZCBzdXJyb2dhdGVzLCovXG4gICAgICAgICAgLyogd2hpY2ggb25seSBoYXBwZW5zIGlmIHRoZSBzdHJpbmcgaXMgbm90IHdlbGwtZm9ybWVkLiovXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9OyRozY9fb25jZS5pc1dlbGxGb3JtZWRTdHJpbmcoaXNXZWxsRm9ybWVkU3RyaW5nKTtcbmhhcmRlbihpc1dlbGxGb3JtZWRTdHJpbmcpO1xuXG4vKipcbiAqIFJldHVybnMgbm9ybWFsbHkgd2hlbiBgaXNXZWxsRm9ybWVkU3RyaW5nKHN0cilgIHdvdWxkIHJldHVybiB0cnVlLlxuICogVGhyb3dzIGEgZGlhZ25vc3RpYyBlcnJvciB3aGVuIGBpc1dlbGxGb3JtZWRTdHJpbmcoc3RyKWAgd291bGQgcmV0dXJuIGZhbHNlLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gc3RyXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzdHIgaXMgc3RyaW5nfVxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyA9IHN0ciA9PiB7XG4gIGlzV2VsbEZvcm1lZFN0cmluZyhzdHIpIHx8IEZhaWxgRXhwZWN0ZWQgd2VsbC1mb3JtZWQgdW5pY29kZSBzdHJpbmc6ICR7c3RyfWA7XG59OyRozY9fb25jZS5hc3NlcnRXZWxsRm9ybWVkU3RyaW5nKGFzc2VydFdlbGxGb3JtZWRTdHJpbmcpO1xuaGFyZGVuKGFzc2VydFdlbGxGb3JtZWRTdHJpbmcpO1xuXG5jb25zdCBPTkxZX1dFTExfRk9STUVEX1NUUklOR1NfUEFTU0FCTEUgPVxuICBnZXRFbnZpcm9ubWVudE9wdGlvbignT05MWV9XRUxMX0ZPUk1FRF9TVFJJTkdTX1BBU1NBQkxFJywgJ2Rpc2FibGVkJywgW1xuICAgICdlbmFibGVkJyxcbiAgXSkgPT09ICdlbmFibGVkJztcblxuLyoqXG4gKiBGb3Igbm93LFxuICogaWYgYE9OTFlfV0VMTF9GT1JNRURfU1RSSU5HU19QQVNTQUJMRWAgZW52aXJvbm1lbnQgb3B0aW9uIGlzIGAnZW5hYmxlZCdgLFxuICogdGhlbiBgYXNzZXJ0UGFzc2FibGVTdHJpbmdgIGlzIHRoZSBzYW1lIGFzIGBhc3NlcnRXZWxsRm9ybWVkU3RyaW5nYC5cbiAqIE90aGVyd2lzZSBgYXNzZXJ0UGFzc2FibGVTdHJpbmdgIGp1c3QgYXNzZXJ0cyB0aGF0IGBzdHJgIGlzIGEgc3RyaW5nLlxuICpcbiAqIEN1cnJlbnRseSwgYE9OTFlfV0VMTF9GT1JNRURfU1RSSU5HU19QQVNTQUJMRWAgZGVmYXVsdHMgdG8gYCdkaXNhYmxlZCdgXG4gKiBiZWNhdXNlIHdlIGRvIG5vdCB5ZXQga25vdyB0aGUgcGVyZm9ybWFuY2UgaW1wYWN0LiBMYXRlciwgaWYgd2UgZGVjaWRlIHdlXG4gKiBjYW4gYWZmb3JkIGl0LCB3ZSdsbCBmaXJzdCBjaGFuZ2UgdGhlIGRlZmF1bHQgdG8gYCdlbmFibGVkJ2AgYW5kIHVsdGltYXRlbHlcbiAqIHJlbW92ZSB0aGUgc3dpdGNoIGFsdG9nZXRoZXIuIEJlIHByZXBhcmVkIGZvciB0aGVzZSBjaGFuZ2VzLlxuICpcbiAqIFRPRE8gb25jZSB0aGUgc3dpdGNoIGlzIHJlbW92ZWQsIHNpbXBsaWZ5IGBhc3NlcnRQYXNzYWJsZVN0cmluZ2AgdG9cbiAqIHNpbXBseSBiZSBgYXNzZXJ0V2VsbEZvcm1lZFN0cmluZ2AuXG4gKlxuICogQHBhcmFtIHsgdW5rbm93biB9IHN0clxuICogQHJldHVybnMge2Fzc2VydHMgc3RyIGlzIHN0cmluZyB9XG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRQYXNzYWJsZVN0cmluZyA9IHN0ciA9PiB7XG4gIHR5cGVvZiBzdHIgPT09ICdzdHJpbmcnIHx8IEZhaWxgRXhwZWN0ZWQgc3RyaW5nICR7c3RyfWA7XG4gICFPTkxZX1dFTExfRk9STUVEX1NUUklOR1NfUEFTU0FCTEUgfHwgYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyhzdHIpO1xufTskaM2PX29uY2UuYXNzZXJ0UGFzc2FibGVTdHJpbmcoYXNzZXJ0UGFzc2FibGVTdHJpbmcpO1xuaGFyZGVuKGFzc2VydFBhc3NhYmxlU3RyaW5nKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzV2VsbEZvcm1lZFN0cmluZyI6WyJpc1dlbGxGb3JtZWRTdHJpbmciXSwiYXNzZXJ0V2VsbEZvcm1lZFN0cmluZyI6WyJhc3NlcnRXZWxsRm9ybWVkU3RyaW5nIl0sImFzc2VydFBhc3NhYmxlU3RyaW5nIjpbImFzc2VydFBhc3NhYmxlU3RyaW5nIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAL3NCLDFAAAwxQAACUAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvc3ltYm9sLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbImFzc2VydFBhc3NhYmxlU3ltYm9sIiwiaXNQYXNzYWJsZVN5bWJvbCIsIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCIsInBhc3NhYmxlU3ltYm9sRm9yTmFtZSIsInVucGFzc2FibGVTeW1ib2xGb3JOYW1lIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgRmFpbCxxOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXV1dXSk7XG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcblxuLyoqXG4gKiBUaGUgd2VsbCBrbm93biBzeW1ib2xzIGFyZSBzdGF0aWMgc3ltYm9sIHZhbHVlcyBvbiB0aGUgYFN5bWJvbGAgY29uc3RydWN0b3IuXG4gKi9cbmNvbnN0IHdlbGxLbm93blN5bWJvbE5hbWVzID0gbmV3IE1hcChcbiAgb3duS2V5cyhTeW1ib2wpXG4gICAgLmZpbHRlcihcbiAgICAgIG5hbWUgPT4gdHlwZW9mIG5hbWUgPT09ICdzdHJpbmcnICYmIHR5cGVvZiBTeW1ib2xbbmFtZV0gPT09ICdzeW1ib2wnLFxuICAgIClcbiAgICAuZmlsdGVyKG5hbWUgPT4ge1xuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBJdCBkb2Vzbid0IGtub3cgbmFtZSBjYW5ub3QgYmUgYSBzeW1ib2wqL1xuICAgICAgIW5hbWUuc3RhcnRzV2l0aCgnQEAnKSB8fFxuICAgICAgICBGYWlsYERpZCBub3QgZXhwZWN0IFN5bWJvbCB0byBoYXZlIGEgc3ltYm9sLXZhbHVlZCBwcm9wZXJ0eSBuYW1lIHN0YXJ0aW5nIHdpdGggXCJAQFwiICR7cShcbiAgICAgICAgICBuYW1lLFxuICAgICAgICApfWA7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9KVxuICAgIC8qIEB0cy1pZ25vcmUgSXQgZG9lc24ndCBrbm93IG5hbWUgY2Fubm90IGJlIGEgc3ltYm9sKi9cbiAgICAubWFwKG5hbWUgPT4gW1N5bWJvbFtuYW1lXSwgYEBAJHtuYW1lfWBdKSxcbik7XG5cbi8qKlxuICogVGhlIHBhc3NhYmxlIHN5bWJvbHMgYXJlIHRoZSB3ZWxsIGtub3duIHN5bWJvbHMgKHRoZSBzeW1ib2wgdmFsdWVzXG4gKiBvZiBzdGF0aWMgcHJvcGVydGllcyBvZiB0aGUgYFN5bWJvbGAgY29uc3RydWN0b3IpIGFuZCB0aGUgcmVnaXN0ZXJlZFxuICogc3ltYm9scy5cbiAqXG4gKiBAcGFyYW0ge2FueX0gc3ltXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICAgICAgIGNvbnN0IGlzUGFzc2FibGVTeW1ib2wgPSBzeW0gPT5cbiAgdHlwZW9mIHN5bSA9PT0gJ3N5bWJvbCcgJiZcbiAgKHR5cGVvZiBTeW1ib2wua2V5Rm9yKHN5bSkgPT09ICdzdHJpbmcnIHx8IHdlbGxLbm93blN5bWJvbE5hbWVzLmhhcyhzeW0pKTskaM2PX29uY2UuaXNQYXNzYWJsZVN5bWJvbChpc1Bhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihpc1Bhc3NhYmxlU3ltYm9sKTtcblxuICAgICAgIGNvbnN0IGFzc2VydFBhc3NhYmxlU3ltYm9sID0gc3ltID0+XG4gIGlzUGFzc2FibGVTeW1ib2woc3ltKSB8fFxuICBGYWlsYE9ubHkgcmVnaXN0ZXJlZCBzeW1ib2xzIG9yIHdlbGwta25vd24gc3ltYm9scyBhcmUgcGFzc2FibGU6ICR7cShzeW0pfWA7JGjNj19vbmNlLmFzc2VydFBhc3NhYmxlU3ltYm9sKGFzc2VydFBhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihhc3NlcnRQYXNzYWJsZVN5bWJvbCk7XG5cbi8qKlxuICogSWYgYHN5bWAgaXMgYSBwYXNzYWJsZSBzeW1ib2wsIHJldHVybiBhIHN0cmluZyB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpc1xuICogc3ltYm9sLiBJZiBgc3ltYCBpcyBhIG5vbi1wYXNzYWJsZSBzeW1ib2wsIHJldHVybiBgdW5kZWZpbmVkYC5cbiAqXG4gKiBUaGUgcGFzc2FibGUgc3ltYm9scyBhcmUgdGhlIHdlbGwga25vd24gc3ltYm9scyAodGhlIHN5bWJvbCB2YWx1ZXNcbiAqIG9mIHN0YXRpYyBwcm9wZXJ0aWVzIG9mIHRoZSBgU3ltYm9sYCBjb25zdHJ1Y3RvcikgYW5kIHRoZSByZWdpc3RlcmVkXG4gKiBzeW1ib2xzLiBTaW5jZSB0aGUgcmVnaXN0cmF0aW9uIHN0cmluZyBvZiBhIHJlZ2lzdGVyZWQgc3ltYm9sIGNhbiBiZSBhbnlcbiAqIHN0cmluZywgaWYgd2Ugc2ltcGx5IHVzZWQgdGhhdCB0byBpZGVudGlmeSB0aG9zZSBzeW1ib2xzLCB0aGVyZSB3b3VsZCBub3RcbiAqIGJlIGFueSByZW1haW5pbmcgc3RyaW5ncyBsZWZ0IG92ZXIgdG8gaWRlbnRpZnkgdGhlIHdlbGwta25vd24gc3ltYm9scy5cbiAqIEluc3RlYWQsIHdlIHJlc2VydmUgc3RyaW5ncyBiZWdpbm5pbmcgd2l0aCBgXCJAQFwiYCBmb3IgcHVycG9zZXMgb2YgdGhpc1xuICogZW5jb2RpbmcuIFdlIGlkZW50aWZ5IGEgd2VsbCBrbm93biBzeW1ib2wgc3VjaCBhcyBgU3ltYm9sLml0ZXJhdG9yYFxuICogYnkgcHJlZml4aW5nIHRoZSBwcm9wZXJ0eSBuYW1lIHdpdGggYFwiQEBcImAsIHN1Y2ggYXMgYFwiQEBpdGVyYXRvclwiYC5cbiAqIEZvciByZWdpc3RlcmVkIHN5bWJvbHMgd2hvc2UgbmFtZSBoYXBwZW5zIHRvIGJlZ2luIHdpdGggYFwiQEBcImAsIHN1Y2hcbiAqIGFzIGBTeW1ib2wuZm9yKCdAQGl0ZXJhdG9yJylgIG9yIGBTeW1ib2wuZm9yKCdAQGZvbycpYCwgd2UgaWRlbnRpZnlcbiAqIHRoZW0gYnkgcHJlZml4aW5nIHRoZW0gd2l0aCBhbiBleHRyYSBgXCJAQFwiYCwgc3VjaCBhc1xuICogYFwiQEBAQGl0ZXJhdG9yXCJgIG9yIGBcIkBAQEBmb29cImAuIChUaGlzIGlzIHRoZSBIaWxiZXJ0IEhvdGVsIGVuY29kaW5nXG4gKiB0ZWNobmlxdWUuKVxuICpcbiAqIEBwYXJhbSB7c3ltYm9sfSBzeW1cbiAqIEByZXR1cm5zIHtzdHJpbmc9fVxuICovXG4gICAgICAgY29uc3QgbmFtZUZvclBhc3NhYmxlU3ltYm9sID0gc3ltID0+IHtcbiAgY29uc3QgbmFtZSA9IFN5bWJvbC5rZXlGb3Ioc3ltKTtcbiAgaWYgKG5hbWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB3ZWxsS25vd25TeW1ib2xOYW1lcy5nZXQoc3ltKTtcbiAgfVxuICBpZiAobmFtZS5zdGFydHNXaXRoKCdAQCcpKSB7XG4gICAgcmV0dXJuIGBAQCR7bmFtZX1gO1xuICB9XG4gIHJldHVybiBuYW1lO1xufTskaM2PX29uY2UubmFtZUZvclBhc3NhYmxlU3ltYm9sKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCk7XG5oYXJkZW4obmFtZUZvclBhc3NhYmxlU3ltYm9sKTtcblxuY29uc3QgQXRBdFByZWZpeFBhdHRlcm4gPSAvXkBAKC4qKSQvO1xuaGFyZGVuKEF0QXRQcmVmaXhQYXR0ZXJuKTtcblxuLyoqXG4gKiBJZiBgbmFtZWAgaXMgYSBzdHJpbmcgdGhhdCBjb3VsZCBoYXZlIGJlZW4gcHJvZHVjZWQgYnlcbiAqIGBuYW1lRm9yUGFzc2FibGVTeW1ib2xgLCByZXR1cm4gdGhlIHN5bWJvbCBhcmd1bWVudCBpdCB3YXMgcHJvZHVjZWQgdG9cbiAqIHJlcHJlc2VudC5cbiAqXG4gKiAgICBJZiBgbmFtZWAgZG9lcyBub3QgYmVnaW4gd2l0aCBgXCJAQFwiYCwgdGhlbiBqdXN0IHRoZSBjb3JyZXNwb25kaW5nXG4gKiAgICAgIHJlZ2lzdGVyZWQgc3ltYm9sLCBgU3ltYm9sLmZvcihuYW1lKWAuXG4gKiAgICBJZiBgbmFtZWAgaXMgYFwiQEBcImAgZm9sbG93ZWQgYnkgYSB3ZWxsIGtub3duIHN5bWJvbCdzIHByb3BlcnR5IG5hbWUgb25cbiAqICAgICAgYFN5bWJvbGAgc3VjaCBgXCJAQGl0ZXJhdG9yXCIsIHJldHVybiB0aGF0IHdlbGwga25vd24gc3ltYm9sIHN1Y2ggYXNcbiAqICAgICAgYFN5bWJvbC5pdGVyYXRvcmBcbiAqICAgIElmIGBuYW1lYCBiZWdpbnMgd2l0aCBgXCJAQEBAXCJgIGl0IGVuY29kZXMgdGhlIHJlZ2lzdGVyZWQgc3ltYm9sIHdob3NlXG4gKiAgICAgIG5hbWUgYmVnaW5zIHdpdGggYFwiQEBcImAgaW5zdGVhZC5cbiAqICAgIE90aGVyd2lzZSwgaWYgbmFtZSBiZWdpbnMgd2l0aCBgXCJAQFwiYCBpdCBtYXkgZW5jb2RlIGEgcmVnaXN0ZXJlZCBzeW1ib2xcbiAqICAgICAgZnJvbSBhIGZ1dHVyZSB2ZXJzaW9uIG9mIEphdmFTY3JpcHQsIGJ1dCBpdCBpcyBub3Qgb25lIHdlIGNhbiBkZWNvZGVcbiAqICAgICAgeWV0LCBzbyB0aHJvdy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHJldHVybnMge3N5bWJvbH1cbiAqL1xuICAgICAgIGNvbnN0IHBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9IG5hbWUgPT4ge1xuICB0eXBlb2YgbmFtZSA9PT0gJ3N0cmluZycgfHxcbiAgICBGYWlsYCR7cShuYW1lKX0gbXVzdCBiZSBhIHN0cmluZywgbm90ICR7cSh0eXBlb2YgbmFtZSl9YDtcbiAgY29uc3QgbWF0Y2ggPSBBdEF0UHJlZml4UGF0dGVybi5leGVjKG5hbWUpO1xuICBpZiAobWF0Y2gpIHtcbiAgICBjb25zdCBzdWZmaXggPSBtYXRjaFsxXTtcbiAgICBpZiAoc3VmZml4LnN0YXJ0c1dpdGgoJ0BAJykpIHtcbiAgICAgIHJldHVybiBTeW1ib2wuZm9yKHN1ZmZpeCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHN5bSA9IFN5bWJvbFtzdWZmaXhdO1xuICAgICAgaWYgKHR5cGVvZiBzeW0gPT09ICdzeW1ib2wnKSB7XG4gICAgICAgIHJldHVybiBzeW07XG4gICAgICB9XG4gICAgICBGYWlsYFJlc2VydmVkIGZvciB3ZWxsIGtub3duIHN5bWJvbCAke3Eoc3VmZml4KX06ICR7cShuYW1lKX1gO1xuICAgIH1cbiAgfVxuICByZXR1cm4gU3ltYm9sLmZvcihuYW1lKTtcbn07JGjNj19vbmNlLnBhc3NhYmxlU3ltYm9sRm9yTmFtZShwYXNzYWJsZVN5bWJvbEZvck5hbWUpO1xuaGFyZGVuKHBhc3NhYmxlU3ltYm9sRm9yTmFtZSk7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHtzeW1ib2x9XG4gKi9cbiAgICAgICBjb25zdCB1bnBhc3NhYmxlU3ltYm9sRm9yTmFtZSA9IG5hbWUgPT4gU3ltYm9sKG5hbWUpOyRozY9fb25jZS51bnBhc3NhYmxlU3ltYm9sRm9yTmFtZSh1bnBhc3NhYmxlU3ltYm9sRm9yTmFtZSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1Bhc3NhYmxlU3ltYm9sIjpbImlzUGFzc2FibGVTeW1ib2wiXSwiYXNzZXJ0UGFzc2FibGVTeW1ib2wiOlsiYXNzZXJ0UGFzc2FibGVTeW1ib2wiXSwibmFtZUZvclBhc3NhYmxlU3ltYm9sIjpbIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCJdLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiOlsicGFzc2FibGVTeW1ib2xGb3JOYW1lIl0sInVucGFzc2FibGVTeW1ib2xGb3JOYW1lIjpbInVucGFzc2FibGVTeW1ib2xGb3JOYW1lIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFy4UNlkCQAAZAkAACUAAABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvdGFnZ2VkLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJUYWdnZWRIZWxwZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLGFzc2VydENoZWNrZXIsY2hlY2tUYWdSZWNvcmQsUEFTU19TVFlMRSxnZXRPd25EYXRhRGVzY3JpcHRvcixjaGVja1Bhc3NTdHlsZTskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJjaGVja1RhZ1JlY29yZFwiLFskaM2PX2EgPT4gKGNoZWNrVGFnUmVjb3JkID0gJGjNj19hKV1dLFtcIlBBU1NfU1RZTEVcIixbJGjNj19hID0+IChQQVNTX1NUWUxFID0gJGjNj19hKV1dLFtcImdldE93bkRhdGFEZXNjcmlwdG9yXCIsWyRozY9fYSA9PiAoZ2V0T3duRGF0YURlc2NyaXB0b3IgPSAkaM2PX2EpXV0sW1wiY2hlY2tQYXNzU3R5bGVcIixbJGjNj19hID0+IChjaGVja1Bhc3NTdHlsZSA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7UGFzc1N0eWxlSGVscGVyfSBmcm9tICcuL2ludGVybmFsLXR5cGVzLmpzJ1xuICovXG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcbmNvbnN0IHsgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyB9ID0gT2JqZWN0O1xuXG4vKipcbiAqXG4gKiBAdHlwZSB7UGFzc1N0eWxlSGVscGVyfVxuICovXG4gICAgICAgY29uc3QgVGFnZ2VkSGVscGVyID0gaGFyZGVuKHtcbiAgc3R5bGVOYW1lOiAndGFnZ2VkJyxcblxuICBjYW5CZVZhbGlkOiAoY2FuZGlkYXRlLCBjaGVjayA9IHVuZGVmaW5lZCkgPT5cbiAgICBjaGVja1Bhc3NTdHlsZShjYW5kaWRhdGUsIGNhbmRpZGF0ZVtQQVNTX1NUWUxFXSwgJ3RhZ2dlZCcsIGNoZWNrKSxcblxuICBhc3NlcnRSZXN0VmFsaWQ6IChjYW5kaWRhdGUsIHBhc3NTdHlsZU9mUmVjdXIpID0+IHtcbiAgICBjaGVja1RhZ1JlY29yZChjYW5kaWRhdGUsICd0YWdnZWQnLCBhc3NlcnRDaGVja2VyKTtcblxuICAgIC8qIFR5cGVjYXN0cyBuZWVkZWQgZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9taWNyb3NvZnQvVHlwZVNjcmlwdC9pc3N1ZXMvMTg2MyovXG4gICAgY29uc3QgcGFzc1N0eWxlS2V5ID0gLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoUEFTU19TVFlMRSk7XG4gICAgY29uc3QgdGFnS2V5ID0gLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoU3ltYm9sLnRvU3RyaW5nVGFnKTtcbiAgICBjb25zdCB7XG4gICAgICAvKiBjaGVja1RhZ1JlY29yZCBhbHJlYWR5IHZlcmlmaWVkIFBBU1NfU1RZTEUgYW5kIFN5bWJvbC50b1N0cmluZ1RhZyBvd24gZGF0YSBwcm9wZXJ0aWVzLiovXG4gICAgICBbLyoqIEB0eXBlIHtzdHJpbmd9ICovIChwYXNzU3R5bGVLZXkpXTogX3Bhc3NTdHlsZURlc2MsXG4gICAgICBbLyoqIEB0eXBlIHtzdHJpbmd9ICovICh0YWdLZXkpXTogX2xhYmVsRGVzYyxcbiAgICAgIHBheWxvYWQ6IF9wYXlsb2FkRGVzYywgLyogdmFsdWUgY2hlY2tlZCBieSByZWN1cnNpdmUgd2FsayBhdCB0aGUgZW5kKi9cbiAgICAgIC4uLnJlc3REZXNjc1xuICAgIH0gPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKGNhbmRpZGF0ZSk7XG4gICAgb3duS2V5cyhyZXN0RGVzY3MpLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgRmFpbGBVbmV4cGVjdGVkIHByb3BlcnRpZXMgb24gdGFnZ2VkIHJlY29yZCAke293bktleXMocmVzdERlc2NzKX1gO1xuXG4gICAgLyogVmFsaWRhdGUgdGhhdCB0aGUgJ3BheWxvYWQnIHByb3BlcnR5IGlzIG93bi9kYXRhL2VudW1lcmFibGUqL1xuICAgIC8qIGFuZCBpdHMgYXNzb2NpYXRlZCB2YWx1ZSBpcyByZWN1cnNpdmVseSBwYXNzYWJsZS4qL1xuICAgIHBhc3NTdHlsZU9mUmVjdXIoXG4gICAgICBnZXRPd25EYXRhRGVzY3JpcHRvcihjYW5kaWRhdGUsICdwYXlsb2FkJywgdHJ1ZSwgYXNzZXJ0Q2hlY2tlcikudmFsdWUsXG4gICAgKTtcbiAgfSxcbn0pOyRozY9fb25jZS5UYWdnZWRIZWxwZXIoVGFnZ2VkSGVscGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlRhZ2dlZEhlbHBlciI6WyJUYWdnZWRIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAt109XCYWAAAmFgAAKQAAAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2NvbW1vbi9pZGVudC1jaGVja2VyLmpzIiwiLi9wYXNzU3R5bGVPZi5qcyIsIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRBdG9tIiwiYXNzZXJ0Qnl0ZUFycmF5IiwiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0UmVjb3JkIiwiYXNzZXJ0UmVtb3RhYmxlIiwiaXNBdG9tIiwiaXNCeXRlQXJyYXkiLCJpc0NvcHlBcnJheSIsImlzUmVjb3JkIiwiaXNSZW1vdGFibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBGYWlsLHEsWCxpZGVudENoZWNrZXIscGFzc1N0eWxlT2YsYXNzZXJ0Q2hlY2tlcjskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vaWRlbnQtY2hlY2tlci5qc1wiLCBbW1wiaWRlbnRDaGVja2VyXCIsWyRozY9fYSA9PiAoaWRlbnRDaGVja2VyID0gJGjNj19hKV1dXV0sW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIixbJGjNj19hID0+IChhc3NlcnRDaGVja2VyID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtDb3B5QXJyYXksIENvcHlSZWNvcmQsIFBhc3NhYmxlLCBSZW1vdGFibGVPYmplY3QsIEJ5dGVBcnJheSwgQ2hlY2tlciwgQXRvbX0gZnJvbSAnLi90eXBlcy5qcydcbiAqL1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgcGFzcy1ieS1jb3B5IGFycmF5LCBBS0EgYSBcImNvcHlBcnJheVwiXG4gKiBpbiBAZW5kby9tYXJzaGFsIHRlcm1zXG4gKlxuICogQHBhcmFtIHthbnl9IGFyclxuICogQHJldHVybnMge2FyciBpcyBDb3B5QXJyYXk8YW55Pn1cbiAqL1xuICAgICAgIGNvbnN0IGlzQ29weUFycmF5ID0gYXJyID0+IHBhc3NTdHlsZU9mKGFycikgPT09ICdjb3B5QXJyYXknOyRozY9fb25jZS5pc0NvcHlBcnJheShpc0NvcHlBcnJheSk7XG5oYXJkZW4oaXNDb3B5QXJyYXkpO1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgcGFzcy1ieS1jb3B5IGJpbmFyeSBkYXRhLCBBS0EgYSBcImJ5dGVBcnJheVwiXG4gKiBpbiBAZW5kby9tYXJzaGFsIHRlcm1zXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gYXJyXG4gKiBAcmV0dXJucyB7YXJyIGlzIEJ5dGVBcnJheX1cbiAqL1xuICAgICAgIGNvbnN0IGlzQnl0ZUFycmF5ID0gYXJyID0+IHBhc3NTdHlsZU9mKGFycikgPT09ICdieXRlQXJyYXknOyRozY9fb25jZS5pc0J5dGVBcnJheShpc0J5dGVBcnJheSk7XG5oYXJkZW4oaXNCeXRlQXJyYXkpO1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgcGFzcy1ieS1jb3B5IHJlY29yZCwgQUtBIGFcbiAqIFwiY29weVJlY29yZFwiIGluIEBlbmRvL21hcnNoYWwgdGVybXNcbiAqXG4gKiBAcGFyYW0ge2FueX0gcmVjb3JkXG4gKiBAcmV0dXJucyB7cmVjb3JkIGlzIENvcHlSZWNvcmQ8YW55Pn1cbiAqL1xuICAgICAgIGNvbnN0IGlzUmVjb3JkID0gcmVjb3JkID0+IHBhc3NTdHlsZU9mKHJlY29yZCkgPT09ICdjb3B5UmVjb3JkJzskaM2PX29uY2UuaXNSZWNvcmQoaXNSZWNvcmQpO1xuaGFyZGVuKGlzUmVjb3JkKTtcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIHJlbW90YWJsZS5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSByZW1vdGFibGVcbiAqIEByZXR1cm5zIHtyZW1vdGFibGUgaXMgUmVtb3RhYmxlT2JqZWN0fVxuICovXG4gICAgICAgY29uc3QgaXNSZW1vdGFibGUgPSByZW1vdGFibGUgPT4gcGFzc1N0eWxlT2YocmVtb3RhYmxlKSA9PT0gJ3JlbW90YWJsZSc7JGjNj19vbmNlLmlzUmVtb3RhYmxlKGlzUmVtb3RhYmxlKTtcbmhhcmRlbihpc1JlbW90YWJsZSk7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IGFyclxuICogQHBhcmFtIHtzdHJpbmc9fSBvcHROYW1lT2ZBcnJheVxuICogQHJldHVybnMge2Fzc2VydHMgYXJyIGlzIENvcHlBcnJheTxhbnk+fVxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0Q29weUFycmF5ID0gKGFyciwgb3B0TmFtZU9mQXJyYXkgPSAnQWxsZWdlZCBhcnJheScpID0+IHtcbiAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YoYXJyKTtcbiAgcGFzc1N0eWxlID09PSAnY29weUFycmF5JyB8fFxuICAgIEZhaWxgJHtxKG9wdE5hbWVPZkFycmF5KX0gJHthcnJ9IG11c3QgYmUgYSBwYXNzLWJ5LWNvcHkgYXJyYXksIG5vdCAke3EoXG4gICAgICBwYXNzU3R5bGUsXG4gICAgKX1gO1xufTskaM2PX29uY2UuYXNzZXJ0Q29weUFycmF5KGFzc2VydENvcHlBcnJheSk7XG5oYXJkZW4oYXNzZXJ0Q29weUFycmF5KTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBhcnJcbiAqIEBwYXJhbSB7c3RyaW5nPX0gb3B0TmFtZU9mQXJyYXlcbiAqIEByZXR1cm5zIHthc3NlcnRzIGFyciBpcyBCeXRlQXJyYXl9XG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRCeXRlQXJyYXkgPSAoYXJyLCBvcHROYW1lT2ZBcnJheSA9ICdBbGxlZ2VkIGJ5dGVBcnJheScpID0+IHtcbiAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YoYXJyKTtcbiAgcGFzc1N0eWxlID09PSAnYnl0ZUFycmF5JyB8fFxuICAgIEZhaWxgJHtxKFxuICAgICAgb3B0TmFtZU9mQXJyYXksXG4gICAgKX0gJHthcnJ9IG11c3QgYmUgYSBwYXNzLWJ5LWNvcHkgYmluYXJ5IGRhdGEsIG5vdCAke3EocGFzc1N0eWxlKX1gO1xufTskaM2PX29uY2UuYXNzZXJ0Qnl0ZUFycmF5KGFzc2VydEJ5dGVBcnJheSk7XG5oYXJkZW4oYXNzZXJ0Qnl0ZUFycmF5KTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0UmVjb3JkXG4gKiBAcGFyYW0ge2FueX0gcmVjb3JkXG4gKiBAcGFyYW0ge3N0cmluZz19IG9wdE5hbWVPZlJlY29yZFxuICogQHJldHVybnMge2Fzc2VydHMgcmVjb3JkIGlzIENvcHlSZWNvcmQ8YW55Pn1cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydFJlY29yZCA9IChyZWNvcmQsIG9wdE5hbWVPZlJlY29yZCA9ICdBbGxlZ2VkIHJlY29yZCcpID0+IHtcbiAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YocmVjb3JkKTtcbiAgcGFzc1N0eWxlID09PSAnY29weVJlY29yZCcgfHxcbiAgICBGYWlsYCR7cShvcHROYW1lT2ZSZWNvcmQpfSAke3JlY29yZH0gbXVzdCBiZSBhIHBhc3MtYnktY29weSByZWNvcmQsIG5vdCAke3EoXG4gICAgICBwYXNzU3R5bGUsXG4gICAgKX1gO1xufTskaM2PX29uY2UuYXNzZXJ0UmVjb3JkKGFzc2VydFJlY29yZCk7XG5oYXJkZW4oYXNzZXJ0UmVjb3JkKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSByZW1vdGFibGVcbiAqIEBwYXJhbSB7c3RyaW5nPX0gb3B0TmFtZU9mUmVtb3RhYmxlXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyByZW1vdGFibGUgaXMgUmVtb3RhYmxlT2JqZWN0fVxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0UmVtb3RhYmxlID0gKFxuICByZW1vdGFibGUsXG4gIG9wdE5hbWVPZlJlbW90YWJsZSA9ICdBbGxlZ2VkIHJlbW90YWJsZScsXG4pID0+IHtcbiAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2YocmVtb3RhYmxlKTtcbiAgcGFzc1N0eWxlID09PSAncmVtb3RhYmxlJyB8fFxuICAgIEZhaWxgJHtxKG9wdE5hbWVPZlJlbW90YWJsZSl9ICR7cmVtb3RhYmxlfSBtdXN0IGJlIGEgcmVtb3RhYmxlLCBub3QgJHtxKFxuICAgICAgcGFzc1N0eWxlLFxuICAgICl9YDtcbn07JGjNj19vbmNlLmFzc2VydFJlbW90YWJsZShhc3NlcnRSZW1vdGFibGUpO1xuaGFyZGVuKGFzc2VydFJlbW90YWJsZSk7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IHZhbCBOb3QgbmVjZXNzYXJpbHkgcGFzc2FibGVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHt2YWwgaXMgQXRvbX1cbiAqL1xuY29uc3QgY2hlY2tBdG9tID0gKHZhbCwgY2hlY2spID0+IHtcbiAgbGV0IHBhc3NTdHlsZTtcbiAgdHJ5IHtcbiAgICBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZih2YWwpO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gKFxuICAgICAgY2hlY2sgIT09IGlkZW50Q2hlY2tlciAmJlxuICAgICAgY2hlY2soZmFsc2UsIFhgTm90IGV2ZW4gUGFzc2FibGU6ICR7cShlcnIpfTogJHt2YWx9YClcbiAgICApO1xuICB9XG4gIHN3aXRjaCAocGFzc1N0eWxlKSB7XG4gICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICBjYXNlICdudWxsJzpcbiAgICBjYXNlICdib29sZWFuJzpcbiAgICBjYXNlICdudW1iZXInOlxuICAgIGNhc2UgJ2JpZ2ludCc6XG4gICAgY2FzZSAnc3RyaW5nJzpcbiAgICBjYXNlICdieXRlQXJyYXknOlxuICAgIGNhc2UgJ3N5bWJvbCc6IHtcbiAgICAgIC8qIFRoZSBBdG9tU3R5bGUgY2FzZXMqL1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIC8qIFRoZSBvdGhlciBQYXNzU3R5bGUgY2FzZXMqL1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2sgIT09IGlkZW50Q2hlY2tlciAmJlxuICAgICAgICBjaGVjayhmYWxzZSwgWGBBICR7cShwYXNzU3R5bGUpfSBjYW5ub3QgYmUgYW4gYXRvbTogJHt2YWx9YClcbiAgICAgICk7XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSB2YWxcbiAqIEByZXR1cm5zIHt2YWwgaXMgQXRvbX1cbiAqL1xuICAgICAgIGNvbnN0IGlzQXRvbSA9IHZhbCA9PiBjaGVja0F0b20odmFsLCBpZGVudENoZWNrZXIpOyRozY9fb25jZS5pc0F0b20oaXNBdG9tKTtcbmhhcmRlbihpc0F0b20pO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge2Fzc2VydHMgdmFsIGlzIEF0b219XG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRBdG9tID0gdmFsID0+IHtcbiAgY2hlY2tBdG9tKHZhbCwgYXNzZXJ0Q2hlY2tlcik7XG59OyRozY9fb25jZS5hc3NlcnRBdG9tKGFzc2VydEF0b20pO1xuaGFyZGVuKGFzc2VydEF0b20pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNDb3B5QXJyYXkiOlsiaXNDb3B5QXJyYXkiXSwiaXNCeXRlQXJyYXkiOlsiaXNCeXRlQXJyYXkiXSwiaXNSZWNvcmQiOlsiaXNSZWNvcmQiXSwiaXNSZW1vdGFibGUiOlsiaXNSZW1vdGFibGUiXSwiYXNzZXJ0Q29weUFycmF5IjpbImFzc2VydENvcHlBcnJheSJdLCJhc3NlcnRCeXRlQXJyYXkiOlsiYXNzZXJ0Qnl0ZUFycmF5Il0sImFzc2VydFJlY29yZCI6WyJhc3NlcnRSZWNvcmQiXSwiYXNzZXJ0UmVtb3RhYmxlIjpbImFzc2VydFJlbW90YWJsZSJdLCJpc0F0b20iOlsiaXNBdG9tIl0sImFzc2VydEF0b20iOlsiYXNzZXJ0QXRvbSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAAkAAAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHVNktzvDgAA7w4AAB4AAABAZW5kby9wYXR0ZXJucy12MS43LjAvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMva2V5cy9jaGVja0tleS5qcyIsIi4vc3JjL2tleXMvY29weVNldC5qcyIsIi4vc3JjL2tleXMvY29weUJhZy5qcyIsIi4vc3JjL2tleXMvY29tcGFyZUtleXMuanMiLCIuL3NyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanMiLCIuL3NyYy9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanMiLCIuL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiLCIuL3NyYy9wYXR0ZXJucy9nZXRHdWFyZFBheWxvYWRzLmpzIiwiLi9zcmMvdHlwZXMuanMiLCJAZW5kby9jb21tb24vbGlzdC1kaWZmZXJlbmNlLmpzIiwiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRLZXkiLCJhc3NlcnRLZXkiLCJiYWdVbmlvbiIsImJhZ1VuaW9uIiwiZWxlbWVudHNJc0Rpc2pvaW50IiwiZWxlbWVudHNJc0Rpc2pvaW50IiwiZ2V0TWV0aG9kR3VhcmRQYXlsb2FkIiwiZ2V0TWV0aG9kR3VhcmRQYXlsb2FkIiwiZ2V0UmFua0NvdmVyIiwiZ2V0UmFua0NvdmVyIiwic2V0Q29tcGFyZSIsInNldENvbXBhcmUiLG51bGwsbnVsbCxudWxsLG51bGxdLCJyZWV4cG9ydHMiOlsiLi9zcmMvdHlwZXMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9zcmMva2V5cy9jaGVja0tleS5qc1wiLCBbXV0sW1wiLi9zcmMva2V5cy9jb3B5U2V0LmpzXCIsIFtdXSxbXCIuL3NyYy9rZXlzL2NvcHlCYWcuanNcIiwgW11dLFtcIi4vc3JjL2tleXMvY29tcGFyZUtleXMuanNcIiwgW11dLFtcIi4vc3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qc1wiLCBbXV0sW1wiLi9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzXCIsIFtdXSxbXCIuL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanNcIiwgW11dLFtcIi4vc3JjL3BhdHRlcm5zL2dldEd1YXJkUGF5bG9hZHMuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXSxbXCJAZW5kby9jb21tb24vbGlzdC1kaWZmZXJlbmNlLmpzXCIsIFtdXSxbXCJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7Ii4vc3JjL2tleXMvY2hlY2tLZXkuanMiOltbImlzS2V5IiwiaXNLZXkiXSxbImFzc2VydEtleSIsImFzc2VydEtleSJdLFsiYXNzZXJ0U2NhbGFyS2V5IiwiYXNzZXJ0U2NhbGFyS2V5Il0sWyJpc0NvcHlTZXQiLCJpc0NvcHlTZXQiXSxbImFzc2VydENvcHlTZXQiLCJhc3NlcnRDb3B5U2V0Il0sWyJtYWtlQ29weVNldCIsIm1ha2VDb3B5U2V0Il0sWyJnZXRDb3B5U2V0S2V5cyIsImdldENvcHlTZXRLZXlzIl0sWyJpc0NvcHlCYWciLCJpc0NvcHlCYWciXSxbImFzc2VydENvcHlCYWciLCJhc3NlcnRDb3B5QmFnIl0sWyJtYWtlQ29weUJhZyIsIm1ha2VDb3B5QmFnIl0sWyJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyIsIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIl0sWyJnZXRDb3B5QmFnRW50cmllcyIsImdldENvcHlCYWdFbnRyaWVzIl0sWyJpc0NvcHlNYXAiLCJpc0NvcHlNYXAiXSxbImFzc2VydENvcHlNYXAiLCJhc3NlcnRDb3B5TWFwIl0sWyJtYWtlQ29weU1hcCIsIm1ha2VDb3B5TWFwIl0sWyJnZXRDb3B5TWFwRW50cmllcyIsImdldENvcHlNYXBFbnRyaWVzIl1dLCIuL3NyYy9rZXlzL2NvcHlTZXQuanMiOltbImNvZXJjZVRvRWxlbWVudHMiLCJjb2VyY2VUb0VsZW1lbnRzIl1dLCIuL3NyYy9rZXlzL2NvcHlCYWcuanMiOltbImNvZXJjZVRvQmFnRW50cmllcyIsImNvZXJjZVRvQmFnRW50cmllcyJdXSwiLi9zcmMva2V5cy9jb21wYXJlS2V5cy5qcyI6W1siYmFnQ29tcGFyZSIsImJhZ0NvbXBhcmUiXSxbInNldENvbXBhcmUiLCJzZXRDb21wYXJlIl0sWyJjb21wYXJlS2V5cyIsImNvbXBhcmVLZXlzIl0sWyJrZXlMVCIsImtleUxUIl0sWyJrZXlMVEUiLCJrZXlMVEUiXSxbImtleUVRIiwia2V5RVEiXSxbImtleUdURSIsImtleUdURSJdLFsia2V5R1QiLCJrZXlHVCJdXSwiLi9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzIjpbWyJlbGVtZW50c0lzU3VwZXJzZXQiLCJlbGVtZW50c0lzU3VwZXJzZXQiXSxbImVsZW1lbnRzSXNEaXNqb2ludCIsImVsZW1lbnRzSXNEaXNqb2ludCJdLFsiZWxlbWVudHNDb21wYXJlIiwiZWxlbWVudHNDb21wYXJlIl0sWyJlbGVtZW50c1VuaW9uIiwiZWxlbWVudHNVbmlvbiJdLFsiZWxlbWVudHNEaXNqb2ludFVuaW9uIiwiZWxlbWVudHNEaXNqb2ludFVuaW9uIl0sWyJlbGVtZW50c0ludGVyc2VjdGlvbiIsImVsZW1lbnRzSW50ZXJzZWN0aW9uIl0sWyJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiLCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiXSxbInNldElzU3VwZXJzZXQiLCJzZXRJc1N1cGVyc2V0Il0sWyJzZXRJc0Rpc2pvaW50Iiwic2V0SXNEaXNqb2ludCJdLFsic2V0VW5pb24iLCJzZXRVbmlvbiJdLFsic2V0RGlzam9pbnRVbmlvbiIsInNldERpc2pvaW50VW5pb24iXSxbInNldEludGVyc2VjdGlvbiIsInNldEludGVyc2VjdGlvbiJdLFsic2V0RGlzam9pbnRTdWJ0cmFjdCIsInNldERpc2pvaW50U3VidHJhY3QiXV0sIi4vc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qcyI6W1siYmFnSXNTdXBlcmJhZyIsImJhZ0lzU3VwZXJiYWciXSxbImJhZ1VuaW9uIiwiYmFnVW5pb24iXSxbImJhZ0ludGVyc2VjdGlvbiIsImJhZ0ludGVyc2VjdGlvbiJdLFsiYmFnRGlzam9pbnRTdWJ0cmFjdCIsImJhZ0Rpc2pvaW50U3VidHJhY3QiXV0sIi4vc3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qcyI6W1siTSIsIk0iXSxbImdldFJhbmtDb3ZlciIsImdldFJhbmtDb3ZlciJdLFsiaXNQYXR0ZXJuIiwiaXNQYXR0ZXJuIl0sWyJhc3NlcnRQYXR0ZXJuIiwiYXNzZXJ0UGF0dGVybiJdLFsibWF0Y2hlcyIsIm1hdGNoZXMiXSxbIm11c3RNYXRjaCIsIm11c3RNYXRjaCJdLFsiaXNBd2FpdEFyZ0d1YXJkIiwiaXNBd2FpdEFyZ0d1YXJkIl0sWyJhc3NlcnRBd2FpdEFyZ0d1YXJkIiwiYXNzZXJ0QXdhaXRBcmdHdWFyZCJdLFsiaXNSYXdHdWFyZCIsImlzUmF3R3VhcmQiXSxbImFzc2VydFJhd0d1YXJkIiwiYXNzZXJ0UmF3R3VhcmQiXSxbImFzc2VydE1ldGhvZEd1YXJkIiwiYXNzZXJ0TWV0aG9kR3VhcmQiXSxbImFzc2VydEludGVyZmFjZUd1YXJkIiwiYXNzZXJ0SW50ZXJmYWNlR3VhcmQiXSxbImtpbmRPZiIsImtpbmRPZiJdLFsiY29udGFpbmVySGFzU3BsaXQiLCJjb250YWluZXJIYXNTcGxpdCJdXSwiLi9zcmMvcGF0dGVybnMvZ2V0R3VhcmRQYXlsb2Fkcy5qcyI6W1siZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQiLCJnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZCJdLFsiZ2V0TWV0aG9kR3VhcmRQYXlsb2FkIiwiZ2V0TWV0aG9kR3VhcmRQYXlsb2FkIl0sWyJnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQiLCJnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQiXSxbImdldEludGVyZmFjZU1ldGhvZEtleXMiLCJnZXRJbnRlcmZhY2VNZXRob2RLZXlzIl1dLCJAZW5kby9jb21tb24vbGlzdC1kaWZmZXJlbmNlLmpzIjpbWyJsaXN0RGlmZmVyZW5jZSIsImxpc3REaWZmZXJlbmNlIl1dLCJAZW5kby9jb21tb24vb2JqZWN0LW1hcC5qcyI6W1sib2JqZWN0TWFwIiwib2JqZWN0TWFwIl1dfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACqIQPpC0gAAAtIAAAqAAAAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9rZXlzL2NoZWNrS2V5LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2Vycm9ycyIsIkBlbmRvL2NvbW1vbi9pZGVudC1jaGVja2VyLmpzIiwiQGVuZG8vcGFzcy1zdHlsZSIsIkBlbmRvL21hcnNoYWwiLCIuL2NvcHlTZXQuanMiLCIuL2NvcHlCYWcuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRDb3B5QmFnIiwiYXNzZXJ0Q29weU1hcCIsImFzc2VydENvcHlTZXQiLCJhc3NlcnRLZXkiLCJhc3NlcnRTY2FsYXJLZXkiLCJjaGVja0NvcHlCYWciLCJjaGVja0NvcHlNYXAiLCJjaGVja0NvcHlTZXQiLCJjaGVja0tleSIsImNoZWNrU2NhbGFyS2V5IiwiY29weU1hcEtleVNldCIsImV2ZXJ5Q29weUJhZ0VudHJ5IiwiZXZlcnlDb3B5TWFwS2V5IiwiZXZlcnlDb3B5TWFwVmFsdWUiLCJldmVyeUNvcHlTZXRLZXkiLCJnZXRDb3B5QmFnRW50cmllcyIsImdldENvcHlNYXBFbnRyaWVzIiwiZ2V0Q29weU1hcEVudHJ5QXJyYXkiLCJnZXRDb3B5TWFwS2V5cyIsImdldENvcHlNYXBWYWx1ZXMiLCJnZXRDb3B5U2V0S2V5cyIsImlzQ29weUJhZyIsImlzQ29weU1hcCIsImlzQ29weVNldCIsImlzS2V5IiwiaXNTY2FsYXJLZXkiLCJtYWtlQ29weUJhZyIsIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIiwibWFrZUNvcHlNYXAiLCJtYWtlQ29weVNldCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IFgscSxGYWlsLGlkZW50Q2hlY2tlcixhc3NlcnRDaGVja2VyLEZhcixnZXRUYWcsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZixpc0F0b20sY29tcGFyZUFudGlSYW5rLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbmssY2hlY2tFbGVtZW50cyxtYWtlU2V0T2ZFbGVtZW50cyxjaGVja0JhZ0VudHJpZXMsbWFrZUJhZ09mRW50cmllczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV0sW1wicVwiLFskaM2PX2EgPT4gKHEgPSAkaM2PX2EpXV0sW1wiRmFpbFwiLFskaM2PX2EgPT4gKEZhaWwgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vaWRlbnQtY2hlY2tlci5qc1wiLCBbW1wiaWRlbnRDaGVja2VyXCIsWyRozY9fYSA9PiAoaWRlbnRDaGVja2VyID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vcGFzcy1zdHlsZVwiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wiRmFyXCIsWyRozY9fYSA9PiAoRmFyID0gJGjNj19hKV1dLFtcImdldFRhZ1wiLFskaM2PX2EgPT4gKGdldFRhZyA9ICRozY9fYSldXSxbXCJtYWtlVGFnZ2VkXCIsWyRozY9fYSA9PiAobWFrZVRhZ2dlZCA9ICRozY9fYSldXSxbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImlzQXRvbVwiLFskaM2PX2EgPT4gKGlzQXRvbSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImNvbXBhcmVBbnRpUmFua1wiLFskaM2PX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRozY9fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLFskaM2PX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjNj19hKV1dLFtcInNvcnRCeVJhbmtcIixbJGjNj19hID0+IChzb3J0QnlSYW5rID0gJGjNj19hKV1dXV0sW1wiLi9jb3B5U2V0LmpzXCIsIFtbXCJjaGVja0VsZW1lbnRzXCIsWyRozY9fYSA9PiAoY2hlY2tFbGVtZW50cyA9ICRozY9fYSldXSxbXCJtYWtlU2V0T2ZFbGVtZW50c1wiLFskaM2PX2EgPT4gKG1ha2VTZXRPZkVsZW1lbnRzID0gJGjNj19hKV1dXV0sW1wiLi9jb3B5QmFnLmpzXCIsIFtbXCJjaGVja0JhZ0VudHJpZXNcIixbJGjNj19hID0+IChjaGVja0JhZ0VudHJpZXMgPSAkaM2PX2EpXV0sW1wibWFrZUJhZ09mRW50cmllc1wiLFskaM2PX2EgPT4gKG1ha2VCYWdPZkVudHJpZXMgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0IHsgb3duS2V5cyB9ID0gUmVmbGVjdDtcblxuLyoqXG4gKiBAaW1wb3J0IHtQYXNzYWJsZSwgQXRvbSwgQ2hlY2tlcn0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSdcbiAqIEBpbXBvcnQge0NvcHlCYWcsIENvcHlNYXAsIENvcHlTZXQsIEtleSwgU2NhbGFyS2V5fSBmcm9tICcuLi90eXBlcy5qcydcbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8gQXRvbSBhbmQgU2NhbGFyIGtleXMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSB2YWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gICAgICAgY29uc3QgY2hlY2tTY2FsYXJLZXkgPSAodmFsLCBjaGVjaykgPT4ge1xuICBpZiAoaXNBdG9tKHZhbCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZih2YWwpO1xuICBpZiAocGFzc1N0eWxlID09PSAncmVtb3RhYmxlJykge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBjaGVjayhmYWxzZSwgWGBBICR7cShwYXNzU3R5bGUpfSBjYW5ub3QgYmUgYSBzY2FsYXIga2V5OiAke3ZhbH1gKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IHZhbFxuICogQHJldHVybnMge3ZhbCBpcyBTY2FsYXJLZXl9XG4gKi8kaM2PX29uY2UuY2hlY2tTY2FsYXJLZXkoY2hlY2tTY2FsYXJLZXkpO1xuICAgICAgIGNvbnN0IGlzU2NhbGFyS2V5ID0gdmFsID0+IGNoZWNrU2NhbGFyS2V5KHZhbCwgaWRlbnRDaGVja2VyKTskaM2PX29uY2UuaXNTY2FsYXJLZXkoaXNTY2FsYXJLZXkpO1xuaGFyZGVuKGlzU2NhbGFyS2V5KTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHthc3NlcnRzIHZhbCBpcyBTY2FsYXJLZXl9XG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRTY2FsYXJLZXkgPSB2YWwgPT4ge1xuICBjaGVja1NjYWxhcktleSh2YWwsIGFzc2VydENoZWNrZXIpO1xufTskaM2PX29uY2UuYXNzZXJ0U2NhbGFyS2V5KGFzc2VydFNjYWxhcktleSk7XG5oYXJkZW4oYXNzZXJ0U2NhbGFyS2V5KTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEtleXMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiBAdHMtZXhwZWN0LWVycm9yIEtleSBkb2VzIG5vdCBzYXRpc2Z5IFdlYWtLZXkqL1xuLyoqIEB0eXBlIHtXZWFrU2V0PEtleT59ICovXG4vKiBAdHMtZXhwZWN0LWVycm9yIEtleSBkb2VzIG5vdCBzYXRpc2Z5IFdlYWtLZXkqL1xuY29uc3Qga2V5TWVtbyA9IG5ldyBXZWFrU2V0KCk7XG5cbi8qKlxuICogQHBhcmFtIHt1bmtub3dufSB2YWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gICAgICAgY29uc3QgY2hlY2tLZXkgPSAodmFsLCBjaGVjaykgPT4ge1xuICBpZiAoaXNBdG9tKHZhbCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKiBAdHMtZXhwZWN0LWVycm9yIG5hcnJvd2VkKi9cbiAgaWYgKGtleU1lbW8uaGFzKHZhbCkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICBjb25zdCByZXN1bHQgPSBjaGVja0tleUludGVybmFsKHZhbCwgY2hlY2spO1xuICBpZiAocmVzdWx0KSB7XG4gICAgLyogRG9uJ3QgY2FjaGUgdGhlIHVuZGVmaW5lZCBjYXNlcywgc28gdGhhdCBpZiBpdCBpcyB0cmllZCBhZ2FpbiovXG4gICAgLyogd2l0aCBgYXNzZXJ0Q2hlY2tlcmAgaXQnbGwgdGhyb3cgYSBkaWFnbm9zdGljIGFnYWluKi9cbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5hcnJvd2VkKi9cbiAgICBrZXlNZW1vLmFkZCh2YWwpO1xuICB9XG4gIC8qIE5vdGUgdGhhdCB3ZSBkbyBub3QgbWVtb2l6ZSBhIG5lZ2F0aXZlIGp1ZGdlbWVudCwgc28gdGhhdCBpZiBpdCBpcyB0cmllZCovXG4gIC8qIGFnYWluIHdpdGggYSBjaGVja2VyLCBpdCB3aWxsIHN0aWxsIHByb2R1Y2UgYSB1c2VmdWwgZGlhZ25vc3RpYy4qL1xuICByZXR1cm4gcmVzdWx0O1xufTskaM2PX29uY2UuY2hlY2tLZXkoY2hlY2tLZXkpO1xuaGFyZGVuKGNoZWNrS2V5KTtcblxuLyoqXG4gKiBAdHlwZSB7e1xuICogICAodmFsOiBQYXNzYWJsZSk6IHZhbCBpcyBLZXk7XG4gKiAgICh2YWw6IGFueSk6IGJvb2xlYW47XG4gKiB9fVxuICovXG4gICAgICAgY29uc3QgaXNLZXkgPSB2YWwgPT4gY2hlY2tLZXkodmFsLCBpZGVudENoZWNrZXIpOyRozY9fb25jZS5pc0tleShpc0tleSk7XG5oYXJkZW4oaXNLZXkpO1xuXG4vKipcbiAqIEBwYXJhbSB7S2V5fSB2YWxcbiAqIEByZXR1cm5zIHthc3NlcnRzIHZhbCBpcyBLZXl9XG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRLZXkgPSB2YWwgPT4ge1xuICBjaGVja0tleSh2YWwsIGFzc2VydENoZWNrZXIpO1xufTskaM2PX29uY2UuYXNzZXJ0S2V5KGFzc2VydEtleSk7XG5oYXJkZW4oYXNzZXJ0S2V5KTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBDb3B5U2V0IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiBNb3ZlZCB0byBoZXJlIHNvIHRoZXkgY2FuIGNoZWNrIHRoYXQgdGhlIGNvcHlTZXQgY29udGFpbnMgb25seSBrZXlzKi9cbi8qIHdpdGhvdXQgY3JlYXRpbmcgYW4gaW1wb3J0IGN5Y2xlLiovXG5cbi8qKiBAdHlwZSB7V2Vha1NldDxDb3B5U2V0Pn0gKi9cbmNvbnN0IGNvcHlTZXRNZW1vID0gbmV3IFdlYWtTZXQoKTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gc1xuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgICAgICBjb25zdCBjaGVja0NvcHlTZXQgPSAocywgY2hlY2spID0+IHtcbiAgaWYgKGNvcHlTZXRNZW1vLmhhcyhzKSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIGNvbnN0IHJlc3VsdCA9XG4gICAgKChwYXNzU3R5bGVPZihzKSA9PT0gJ3RhZ2dlZCcgJiYgZ2V0VGFnKHMpID09PSAnY29weVNldCcpIHx8XG4gICAgICBjaGVjayhmYWxzZSwgWGBOb3QgYSBjb3B5U2V0OiAke3N9YCkpICYmXG4gICAgY2hlY2tFbGVtZW50cyhzLnBheWxvYWQsIGNoZWNrKSAmJlxuICAgIGNoZWNrS2V5KHMucGF5bG9hZCwgY2hlY2spO1xuICBpZiAocmVzdWx0KSB7XG4gICAgY29weVNldE1lbW8uYWRkKHMpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59OyRozY9fb25jZS5jaGVja0NvcHlTZXQoY2hlY2tDb3B5U2V0KTtcbmhhcmRlbihjaGVja0NvcHlTZXQpO1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSBzXG4gKiBAcmV0dXJucyB7cyBpcyBDb3B5U2V0fVxuICovXG4gICAgICAgY29uc3QgaXNDb3B5U2V0ID0gcyA9PiBjaGVja0NvcHlTZXQocywgaWRlbnRDaGVja2VyKTskaM2PX29uY2UuaXNDb3B5U2V0KGlzQ29weVNldCk7XG5oYXJkZW4oaXNDb3B5U2V0KTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0Q29weVNldFxuICogQHBhcmFtIHtQYXNzYWJsZX0gc1xuICogQHJldHVybnMge2Fzc2VydHMgcyBpcyBDb3B5U2V0fVxuICovXG5cbi8qKiBAdHlwZSB7QXNzZXJ0Q29weVNldH0gKi9cbiAgICAgICBjb25zdCBhc3NlcnRDb3B5U2V0ID0gcyA9PiB7XG4gIGNoZWNrQ29weVNldChzLCBhc3NlcnRDaGVja2VyKTtcbn07JGjNj19vbmNlLmFzc2VydENvcHlTZXQoYXNzZXJ0Q29weVNldCk7XG5oYXJkZW4oYXNzZXJ0Q29weVNldCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEBwYXJhbSB7Q29weVNldDxLPn0gc1xuICogQHJldHVybnMge0tbXX1cbiAqL1xuICAgICAgIGNvbnN0IGdldENvcHlTZXRLZXlzID0gcyA9PiB7XG4gIGFzc2VydENvcHlTZXQocyk7XG4gIHJldHVybiBzLnBheWxvYWQ7XG59OyRozY9fb25jZS5nZXRDb3B5U2V0S2V5cyhnZXRDb3B5U2V0S2V5cyk7XG5oYXJkZW4oZ2V0Q29weVNldEtleXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAcGFyYW0ge0NvcHlTZXQ8Sz59IHNcbiAqIEBwYXJhbSB7KGtleTogSywgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbn0gZm5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gICAgICAgY29uc3QgZXZlcnlDb3B5U2V0S2V5ID0gKHMsIGZuKSA9PlxuICBnZXRDb3B5U2V0S2V5cyhzKS5ldmVyeSgoa2V5LCBpbmRleCkgPT4gZm4oa2V5LCBpbmRleCkpOyRozY9fb25jZS5ldmVyeUNvcHlTZXRLZXkoZXZlcnlDb3B5U2V0S2V5KTtcbmhhcmRlbihldmVyeUNvcHlTZXRLZXkpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPEs+fSBlbGVtZW50SXRlclxuICogQHJldHVybnMge0NvcHlTZXQ8Sz59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlQ29weVNldCA9IGVsZW1lbnRJdGVyID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gbWFrZVNldE9mRWxlbWVudHMoZWxlbWVudEl0ZXIpO1xuICBhc3NlcnRDb3B5U2V0KHJlc3VsdCk7XG4gIHJldHVybiByZXN1bHQ7XG59OyRozY9fb25jZS5tYWtlQ29weVNldChtYWtlQ29weVNldCk7XG5oYXJkZW4obWFrZUNvcHlTZXQpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIENvcHlCYWcgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qIE1vdmVkIHRvIGhlcmUgc28gdGhleSBjYW4gY2hlY2sgdGhhdCB0aGUgY29weUJhZyBjb250YWlucyBvbmx5IGtleXMqL1xuLyogd2l0aG91dCBjcmVhdGluZyBhbiBpbXBvcnQgY3ljbGUuKi9cblxuLyoqIEB0eXBlIHtXZWFrU2V0PENvcHlCYWc+fSAqL1xuY29uc3QgY29weUJhZ01lbW8gPSBuZXcgV2Vha1NldCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSBiXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICAgICAgIGNvbnN0IGNoZWNrQ29weUJhZyA9IChiLCBjaGVjaykgPT4ge1xuICBpZiAoY29weUJhZ01lbW8uaGFzKGIpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cbiAgY29uc3QgcmVzdWx0ID1cbiAgICAoKHBhc3NTdHlsZU9mKGIpID09PSAndGFnZ2VkJyAmJiBnZXRUYWcoYikgPT09ICdjb3B5QmFnJykgfHxcbiAgICAgIGNoZWNrKGZhbHNlLCBYYE5vdCBhIGNvcHlCYWc6ICR7Yn1gKSkgJiZcbiAgICBjaGVja0JhZ0VudHJpZXMoYi5wYXlsb2FkLCBjaGVjaykgJiZcbiAgICBjaGVja0tleShiLnBheWxvYWQsIGNoZWNrKTtcbiAgaWYgKHJlc3VsdCkge1xuICAgIGNvcHlCYWdNZW1vLmFkZChiKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTskaM2PX29uY2UuY2hlY2tDb3B5QmFnKGNoZWNrQ29weUJhZyk7XG5oYXJkZW4oY2hlY2tDb3B5QmFnKTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gYlxuICogQHJldHVybnMge2IgaXMgQ29weUJhZ31cbiAqL1xuICAgICAgIGNvbnN0IGlzQ29weUJhZyA9IGIgPT4gY2hlY2tDb3B5QmFnKGIsIGlkZW50Q2hlY2tlcik7JGjNj19vbmNlLmlzQ29weUJhZyhpc0NvcHlCYWcpO1xuaGFyZGVuKGlzQ29weUJhZyk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydENvcHlCYWdcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGJcbiAqIEByZXR1cm5zIHthc3NlcnRzIGIgaXMgQ29weUJhZ31cbiAqL1xuXG4vKiogQHR5cGUge0Fzc2VydENvcHlCYWd9ICovXG4gICAgICAgY29uc3QgYXNzZXJ0Q29weUJhZyA9IGIgPT4ge1xuICBjaGVja0NvcHlCYWcoYiwgYXNzZXJ0Q2hlY2tlcik7XG59OyRozY9fb25jZS5hc3NlcnRDb3B5QmFnKGFzc2VydENvcHlCYWcpO1xuaGFyZGVuKGFzc2VydENvcHlCYWcpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAcGFyYW0ge0NvcHlCYWc8Sz59IGJcbiAqIEByZXR1cm5zIHtDb3B5QmFnPEs+WydwYXlsb2FkJ119XG4gKi9cbiAgICAgICBjb25zdCBnZXRDb3B5QmFnRW50cmllcyA9IGIgPT4ge1xuICBhc3NlcnRDb3B5QmFnKGIpO1xuICByZXR1cm4gYi5wYXlsb2FkO1xufTskaM2PX29uY2UuZ2V0Q29weUJhZ0VudHJpZXMoZ2V0Q29weUJhZ0VudHJpZXMpO1xuaGFyZGVuKGdldENvcHlCYWdFbnRyaWVzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHBhcmFtIHtDb3B5QmFnPEs+fSBiXG4gKiBAcGFyYW0geyhlbnRyeTogW0ssIGJpZ2ludF0sIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW59IGZuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICAgICAgIGNvbnN0IGV2ZXJ5Q29weUJhZ0VudHJ5ID0gKGIsIGZuKSA9PlxuICBnZXRDb3B5QmFnRW50cmllcyhiKS5ldmVyeSgoZW50cnksIGluZGV4KSA9PiBmbihlbnRyeSwgaW5kZXgpKTskaM2PX29uY2UuZXZlcnlDb3B5QmFnRW50cnkoZXZlcnlDb3B5QmFnRW50cnkpO1xuaGFyZGVuKGV2ZXJ5Q29weUJhZ0VudHJ5KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHBhcmFtIHtJdGVyYWJsZTxbSyxiaWdpbnRdPn0gYmFnRW50cnlJdGVyXG4gKiBAcmV0dXJucyB7Q29weUJhZzxLPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VDb3B5QmFnID0gYmFnRW50cnlJdGVyID0+IHtcbiAgY29uc3QgcmVzdWx0ID0gbWFrZUJhZ09mRW50cmllcyhiYWdFbnRyeUl0ZXIpO1xuICBhc3NlcnRDb3B5QmFnKHJlc3VsdCk7XG4gIHJldHVybiByZXN1bHQ7XG59OyRozY9fb25jZS5tYWtlQ29weUJhZyhtYWtlQ29weUJhZyk7XG5oYXJkZW4obWFrZUNvcHlCYWcpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPEs+fSBlbGVtZW50SXRlclxuICogQHJldHVybnMge0NvcHlCYWc8Sz59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyA9IGVsZW1lbnRJdGVyID0+IHtcbiAgLyogVGhpcyBmdWxsT3JkZXIgY29udGFpbnMgaGlzdG9yeSBkZXBlbmRlbnQgc3RhdGUuIEl0IGlzIHNwZWNpZmljKi9cbiAgLyogdG8gdGhpcyBvbmUgY2FsbCBhbmQgZG9lcyBub3Qgc3Vydml2ZSBpdC4qL1xuICBjb25zdCBmdWxsQ29tcGFyZSA9IG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG4gIGNvbnN0IHNvcnRlZCA9IHNvcnRCeVJhbmsoZWxlbWVudEl0ZXIsIGZ1bGxDb21wYXJlKTtcbiAgLyoqIEB0eXBlIHtbSyxiaWdpbnRdW119ICovXG4gIGNvbnN0IGVudHJpZXMgPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzb3J0ZWQubGVuZ3RoOyApIHtcbiAgICBjb25zdCBrID0gc29ydGVkW2ldO1xuICAgIGxldCBqID0gaSArIDE7XG4gICAgd2hpbGUgKGogPCBzb3J0ZWQubGVuZ3RoICYmIGZ1bGxDb21wYXJlKGssIHNvcnRlZFtqXSkgPT09IDApIHtcbiAgICAgIGogKz0gMTtcbiAgICB9XG4gICAgZW50cmllcy5wdXNoKFtrLCBCaWdJbnQoaiAtIGkpXSk7XG4gICAgaSA9IGo7XG4gIH1cbiAgcmV0dXJuIG1ha2VDb3B5QmFnKGVudHJpZXMpO1xufTskaM2PX29uY2UubWFrZUNvcHlCYWdGcm9tRWxlbWVudHMobWFrZUNvcHlCYWdGcm9tRWxlbWVudHMpO1xuaGFyZGVuKG1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzKTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBDb3B5TWFwIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiBNb3ZlZCB0byBoZXJlIHNvIHRoZXkgY2FuIGNoZWNrIHRoYXQgdGhlIGNvcHlNYXAncyBrZXlzIGNvbnRhaW5zIG9ubHkga2V5cyovXG4vKiB3aXRob3V0IGNyZWF0aW5nIGFuIGltcG9ydCBjeWNsZS4qL1xuXG4vKiogQHR5cGUge1dlYWtTZXQ8Q29weU1hcD59ICovXG5jb25zdCBjb3B5TWFwTWVtbyA9IG5ldyBXZWFrU2V0KCk7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IG1cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gICAgICAgY29uc3QgY2hlY2tDb3B5TWFwID0gKG0sIGNoZWNrKSA9PiB7XG4gIGlmIChjb3B5TWFwTWVtby5oYXMobSkpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoIShwYXNzU3R5bGVPZihtKSA9PT0gJ3RhZ2dlZCcgJiYgZ2V0VGFnKG0pID09PSAnY29weU1hcCcpKSB7XG4gICAgcmV0dXJuIGNoZWNrKGZhbHNlLCBYYE5vdCBhIGNvcHlNYXA6ICR7bX1gKTtcbiAgfVxuICBjb25zdCB7IHBheWxvYWQgfSA9IG07XG4gIGlmIChwYXNzU3R5bGVPZihwYXlsb2FkKSAhPT0gJ2NvcHlSZWNvcmQnKSB7XG4gICAgcmV0dXJuIGNoZWNrKGZhbHNlLCBYYEEgY29weU1hcCdzIHBheWxvYWQgbXVzdCBiZSBhIHJlY29yZDogJHttfWApO1xuICB9XG4gIGNvbnN0IHsga2V5cywgdmFsdWVzLCAuLi5yZXN0IH0gPSBwYXlsb2FkO1xuICBjb25zdCByZXN1bHQgPVxuICAgIChvd25LZXlzKHJlc3QpLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgY2hlY2soXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBYYEEgY29weU1hcCdzIHBheWxvYWQgbXVzdCBvbmx5IGhhdmUgLmtleXMgYW5kIC52YWx1ZXM6ICR7bX1gLFxuICAgICAgKSkgJiZcbiAgICBjaGVja0VsZW1lbnRzKGtleXMsIGNoZWNrKSAmJlxuICAgIGNoZWNrS2V5KGtleXMsIGNoZWNrKSAmJlxuICAgIChwYXNzU3R5bGVPZih2YWx1ZXMpID09PSAnY29weUFycmF5JyB8fFxuICAgICAgY2hlY2soZmFsc2UsIFhgQSBjb3B5TWFwJ3MgLnZhbHVlcyBtdXN0IGJlIGEgY29weUFycmF5OiAke219YCkpICYmXG4gICAgKGtleXMubGVuZ3RoID09PSB2YWx1ZXMubGVuZ3RoIHx8XG4gICAgICBjaGVjayhcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIFhgQSBjb3B5TWFwIG11c3QgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2Yga2V5cyBhbmQgdmFsdWVzOiAke219YCxcbiAgICAgICkpO1xuICBpZiAocmVzdWx0KSB7XG4gICAgY29weU1hcE1lbW8uYWRkKG0pO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59OyRozY9fb25jZS5jaGVja0NvcHlNYXAoY2hlY2tDb3B5TWFwKTtcbmhhcmRlbihjaGVja0NvcHlNYXApO1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSBtXG4gKiBAcmV0dXJucyB7bSBpcyBDb3B5TWFwPEtleSwgUGFzc2FibGU+fVxuICovXG4gICAgICAgY29uc3QgaXNDb3B5TWFwID0gbSA9PiBjaGVja0NvcHlNYXAobSwgaWRlbnRDaGVja2VyKTskaM2PX29uY2UuaXNDb3B5TWFwKGlzQ29weU1hcCk7XG5oYXJkZW4oaXNDb3B5TWFwKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBtXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBtIGlzIENvcHlNYXA8S2V5LCBQYXNzYWJsZT59XG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRDb3B5TWFwID0gbSA9PiB7XG4gIGNoZWNrQ29weU1hcChtLCBhc3NlcnRDaGVja2VyKTtcbn07JGjNj19vbmNlLmFzc2VydENvcHlNYXAoYXNzZXJ0Q29weU1hcCk7XG5oYXJkZW4oYXNzZXJ0Q29weU1hcCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcmV0dXJucyB7S1tdfVxuICovXG4gICAgICAgY29uc3QgZ2V0Q29weU1hcEtleXMgPSBtID0+IHtcbiAgYXNzZXJ0Q29weU1hcChtKTtcbiAgcmV0dXJuIG0ucGF5bG9hZC5rZXlzO1xufTskaM2PX29uY2UuZ2V0Q29weU1hcEtleXMoZ2V0Q29weU1hcEtleXMpO1xuaGFyZGVuKGdldENvcHlNYXBLZXlzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEByZXR1cm5zIHtWW119XG4gKi9cbiAgICAgICBjb25zdCBnZXRDb3B5TWFwVmFsdWVzID0gbSA9PiB7XG4gIGFzc2VydENvcHlNYXAobSk7XG4gIHJldHVybiBtLnBheWxvYWQudmFsdWVzO1xufTskaM2PX29uY2UuZ2V0Q29weU1hcFZhbHVlcyhnZXRDb3B5TWFwVmFsdWVzKTtcbmhhcmRlbihnZXRDb3B5TWFwVmFsdWVzKTtcblxuLyoqXG4gKiBSZXR1cm5zIGFuIGFycmF5IG9mIGEgQ29weU1hcCdzIGVudHJpZXMgaW4gc3RvcmFnZSBvcmRlci5cbiAqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEByZXR1cm5zIHtBcnJheTxbSyxWXT59XG4gKi9cbiAgICAgICBjb25zdCBnZXRDb3B5TWFwRW50cnlBcnJheSA9IG0gPT4ge1xuICBhc3NlcnRDb3B5TWFwKG0pO1xuICBjb25zdCB7XG4gICAgcGF5bG9hZDogeyBrZXlzLCB2YWx1ZXMgfSxcbiAgfSA9IG07XG4gIHJldHVybiBoYXJkZW4oa2V5cy5tYXAoKGtleSwgaSkgPT4gW2tleSwgdmFsdWVzW2ldXSkpO1xufTskaM2PX29uY2UuZ2V0Q29weU1hcEVudHJ5QXJyYXkoZ2V0Q29weU1hcEVudHJ5QXJyYXkpO1xuaGFyZGVuKGdldENvcHlNYXBFbnRyeUFycmF5KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbSyxWXT59XG4gKi9cbiAgICAgICBjb25zdCBnZXRDb3B5TWFwRW50cmllcyA9IG0gPT4ge1xuICBhc3NlcnRDb3B5TWFwKG0pO1xuICBjb25zdCB7XG4gICAgcGF5bG9hZDogeyBrZXlzLCB2YWx1ZXMgfSxcbiAgfSA9IG07XG4gIGNvbnN0IHsgbGVuZ3RoIH0gPSAvKiogQHR5cGUge0FycmF5fSAqLyAoa2V5cyk7XG4gIHJldHVybiBGYXIoJ0NvcHlNYXAgZW50cmllcyBpdGVyYWJsZScsIHtcbiAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgbGV0IGkgPSAwO1xuICAgICAgcmV0dXJuIEZhcignQ29weU1hcCBlbnRyaWVzIGl0ZXJhdG9yJywge1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgLyoqIEB0eXBlIHtJdGVyYXRvclJlc3VsdDxbSyxWXSx2b2lkPn0gKi9cbiAgICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICAgIGlmIChpIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICByZXN1bHQgPSBoYXJkZW4oeyBkb25lOiBmYWxzZSwgdmFsdWU6IFtrZXlzW2ldLCB2YWx1ZXNbaV1dIH0pO1xuICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0ID0gaGFyZGVuKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pO1xufTskaM2PX29uY2UuZ2V0Q29weU1hcEVudHJpZXMoZ2V0Q29weU1hcEVudHJpZXMpO1xuaGFyZGVuKGdldENvcHlNYXBFbnRyaWVzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEBwYXJhbSB7KGtleTogSywgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbn0gZm5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gICAgICAgY29uc3QgZXZlcnlDb3B5TWFwS2V5ID0gKG0sIGZuKSA9PlxuICBnZXRDb3B5TWFwS2V5cyhtKS5ldmVyeSgoa2V5LCBpbmRleCkgPT4gZm4oa2V5LCBpbmRleCkpOyRozY9fb25jZS5ldmVyeUNvcHlNYXBLZXkoZXZlcnlDb3B5TWFwS2V5KTtcbmhhcmRlbihldmVyeUNvcHlNYXBLZXkpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHBhcmFtIHsodmFsdWU6IFYsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW59IGZuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICAgICAgIGNvbnN0IGV2ZXJ5Q29weU1hcFZhbHVlID0gKG0sIGZuKSA9PlxuICBnZXRDb3B5TWFwVmFsdWVzKG0pLmV2ZXJ5KCh2YWx1ZSwgaW5kZXgpID0+IGZuKHZhbHVlLCBpbmRleCkpOyRozY9fb25jZS5ldmVyeUNvcHlNYXBWYWx1ZShldmVyeUNvcHlNYXBWYWx1ZSk7XG5oYXJkZW4oZXZlcnlDb3B5TWFwVmFsdWUpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHJldHVybnMge0NvcHlTZXQ8Sz59XG4gKi9cbiAgICAgICBjb25zdCBjb3B5TWFwS2V5U2V0ID0gbSA9PlxuICAvKiBBIGNvcHlNYXAncyBrZXlzIGFyZSBhbHJlYWR5IGluIHRoZSBpbnRlcm5hbCBmb3JtIHVzZWQgYnkgY29weVNldHMuKi9cbiAgbWFrZVRhZ2dlZCgnY29weVNldCcsIG0ucGF5bG9hZC5rZXlzKTskaM2PX29uY2UuY29weU1hcEtleVNldChjb3B5TWFwS2V5U2V0KTtcbmhhcmRlbihjb3B5TWFwS2V5U2V0KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtJdGVyYWJsZTxbSywgVl0+fSBlbnRyaWVzXG4gKiBAcmV0dXJucyB7Q29weU1hcDxLLFY+fVxuICovXG4gICAgICAgY29uc3QgbWFrZUNvcHlNYXAgPSBlbnRyaWVzID0+IHtcbiAgLyogVGhpcyBpcyB3ZWlyZCwgYnV0IHJldmVyc2UgcmFuayBzb3J0aW5nIHRoZSBlbnRyaWVzIGlzIGEgZ29vZCBmaXJzdCBzdGVwKi9cbiAgLyogZm9yIGdldHRpbmcgdGhlIHJhbmsgc29ydGVkIGtleXMgdG9nZXRoZXIgd2l0aCB0aGUgdmFsdWVzKi9cbiAgLyogb3JnYW5pemVkIGJ5IHRob3NlIGtleXMuIEFsc28sIGFtb25nIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGgqL1xuICAvKiBrZXlzIGluIHRoZSBzYW1lIGVxdWl2YWxlbmNlIGNsYXNzLCB0aG9zZSBhcmUgcmFuayBzb3J0ZWQuKi9cbiAgLyogVE9ETyBUaGlzKi9cbiAgLyogY291bGQgc29sdmUgdGhlIGNvcHlNYXAgY292ZXIgaXNzdWUgZXhwbGFpbmVkIGluIHBhdHRlcm5NYXRjaGVycy5qcy4qL1xuICAvKiBCdXQgb25seSBpZiB3ZSBpbmNsdWRlIHRoaXMgY3JpdGVyaWEgaW4gb3VyIHZhbGlkYXRpb24gb2YgY29weU1hcHMsKi9cbiAgLyogd2hpY2ggd2UgY3VycmVudGx5IGRvIG5vdC4qL1xuICBjb25zdCBzb3J0ZWRFbnRyaWVzID0gc29ydEJ5UmFuayhlbnRyaWVzLCBjb21wYXJlQW50aVJhbmspO1xuICBjb25zdCBrZXlzID0gc29ydGVkRW50cmllcy5tYXAoKFtrLCBfdl0pID0+IGspO1xuICBjb25zdCB2YWx1ZXMgPSBzb3J0ZWRFbnRyaWVzLm1hcCgoW19rLCB2XSkgPT4gdik7XG4gIGNvbnN0IHJlc3VsdCA9IG1ha2VUYWdnZWQoJ2NvcHlNYXAnLCB7IGtleXMsIHZhbHVlcyB9KTtcbiAgYXNzZXJ0Q29weU1hcChyZXN1bHQpO1xuICByZXR1cm4gcmVzdWx0O1xufTskaM2PX29uY2UubWFrZUNvcHlNYXAobWFrZUNvcHlNYXApO1xuaGFyZGVuKG1ha2VDb3B5TWFwKTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEtleXMgUmVjdXIgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIGBjaGVja0tleUludGVybmFsYCBpcyBvbmx5IGNhbGxlZCBpZiBgdmFsYCBpcyBQYXNzYWJsZSBidXQgaXMgbm90IGFuIEF0b20uXG4gKlxuICogQHBhcmFtIHthbnl9IHZhbFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrS2V5SW50ZXJuYWwgPSAodmFsLCBjaGVjaykgPT4ge1xuICBjb25zdCBjaGVja0l0ID0gY2hpbGQgPT4gY2hlY2tLZXkoY2hpbGQsIGNoZWNrKTtcblxuICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZih2YWwpO1xuICBzd2l0Y2ggKHBhc3NTdHlsZSkge1xuICAgIGNhc2UgJ3JlbW90YWJsZSc6IHtcbiAgICAgIC8qIEEgcmVtb3RhYmxlIGlzIGEgU2NhbGFyS2V5IGJ1dCBub3QgYW4gQXRvbSwgc28gd2UgcGljayBpdCB1cCBoZXJlLiovXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgIC8qIEEgY29weVJlY29yZCBpcyBhIGtleSBpZmYgYWxsIGl0cyBjaGlsZHJlbiBhcmUga2V5cyovXG4gICAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyh2YWwpLmV2ZXJ5KGNoZWNrSXQpO1xuICAgIH1cbiAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICAvKiBBIGNvcHlBcnJheSBpcyBhIGtleSBpZmYgYWxsIGl0cyBjaGlsZHJlbiBhcmUga2V5cyovXG4gICAgICByZXR1cm4gdmFsLmV2ZXJ5KGNoZWNrSXQpO1xuICAgIH1cbiAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICBjb25zdCB0YWcgPSBnZXRUYWcodmFsKTtcbiAgICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICAgIGNhc2UgJ2NvcHlTZXQnOiB7XG4gICAgICAgICAgcmV0dXJuIGNoZWNrQ29weVNldCh2YWwsIGNoZWNrKTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdjb3B5QmFnJzoge1xuICAgICAgICAgIHJldHVybiBjaGVja0NvcHlCYWcodmFsLCBjaGVjayk7XG4gICAgICAgIH1cbiAgICAgICAgY2FzZSAnY29weU1hcCc6IHtcbiAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgY2hlY2tDb3B5TWFwKHZhbCwgY2hlY2spICYmXG4gICAgICAgICAgICAvKiBGb3IgYSBjb3B5TWFwIHRvIGJlIGEga2V5LCBhbGwgaXRzIGtleXMgYW5kIHZhbHVlcyBtdXN0Ki9cbiAgICAgICAgICAgIC8qIGJlIGtleXMuIEtleXMgYWxyZWFkeSBjaGVja2VkIGJ5IGBjaGVja0NvcHlNYXBgIHNpbmNlKi9cbiAgICAgICAgICAgIC8qIHRoYXQncyBhIGNvcHlNYXAgcmVxdWlyZW1lbnQgaW4gZ2VuZXJhbC4qL1xuICAgICAgICAgICAgZXZlcnlDb3B5TWFwVmFsdWUodmFsLCBjaGVja0l0KVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBjaGVjayAhPT0gaWRlbnRDaGVja2VyICYmXG4gICAgICAgICAgICBjaGVjayhmYWxzZSwgWGBBIHBhc3NhYmxlIHRhZ2dlZCAke3EodGFnKX0gaXMgbm90IGEga2V5OiAke3ZhbH1gKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgY2FzZSAnZXJyb3InOlxuICAgIGNhc2UgJ3Byb21pc2UnOiB7XG4gICAgICByZXR1cm4gY2hlY2soZmFsc2UsIFhgQSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIGEga2V5YCk7XG4gICAgfVxuICAgIGRlZmF1bHQ6IHtcbiAgICAgIC8qIFVuZXhwZWN0ZWQgdGFncyBhcmUganVzdCBub24ta2V5cywgYnV0IGFuIHVuZXhwZWN0ZWQgcGFzc1N0eWxlKi9cbiAgICAgIC8qIGlzIGFsd2F5cyBhbiBlcnJvci4qL1xuICAgICAgdGhyb3cgRmFpbGB1bmV4cGVjdGVkIHBhc3NTdHlsZSAke3EocGFzc1N0eWxlKX06ICR7dmFsfWA7XG4gICAgfVxuICB9XG59O1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY2hlY2tTY2FsYXJLZXkiOlsiY2hlY2tTY2FsYXJLZXkiXSwiaXNTY2FsYXJLZXkiOlsiaXNTY2FsYXJLZXkiXSwiYXNzZXJ0U2NhbGFyS2V5IjpbImFzc2VydFNjYWxhcktleSJdLCJjaGVja0tleSI6WyJjaGVja0tleSJdLCJpc0tleSI6WyJpc0tleSJdLCJhc3NlcnRLZXkiOlsiYXNzZXJ0S2V5Il0sImNoZWNrQ29weVNldCI6WyJjaGVja0NvcHlTZXQiXSwiaXNDb3B5U2V0IjpbImlzQ29weVNldCJdLCJhc3NlcnRDb3B5U2V0IjpbImFzc2VydENvcHlTZXQiXSwiZ2V0Q29weVNldEtleXMiOlsiZ2V0Q29weVNldEtleXMiXSwiZXZlcnlDb3B5U2V0S2V5IjpbImV2ZXJ5Q29weVNldEtleSJdLCJtYWtlQ29weVNldCI6WyJtYWtlQ29weVNldCJdLCJjaGVja0NvcHlCYWciOlsiY2hlY2tDb3B5QmFnIl0sImlzQ29weUJhZyI6WyJpc0NvcHlCYWciXSwiYXNzZXJ0Q29weUJhZyI6WyJhc3NlcnRDb3B5QmFnIl0sImdldENvcHlCYWdFbnRyaWVzIjpbImdldENvcHlCYWdFbnRyaWVzIl0sImV2ZXJ5Q29weUJhZ0VudHJ5IjpbImV2ZXJ5Q29weUJhZ0VudHJ5Il0sIm1ha2VDb3B5QmFnIjpbIm1ha2VDb3B5QmFnIl0sIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIjpbIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIl0sImNoZWNrQ29weU1hcCI6WyJjaGVja0NvcHlNYXAiXSwiaXNDb3B5TWFwIjpbImlzQ29weU1hcCJdLCJhc3NlcnRDb3B5TWFwIjpbImFzc2VydENvcHlNYXAiXSwiZ2V0Q29weU1hcEtleXMiOlsiZ2V0Q29weU1hcEtleXMiXSwiZ2V0Q29weU1hcFZhbHVlcyI6WyJnZXRDb3B5TWFwVmFsdWVzIl0sImdldENvcHlNYXBFbnRyeUFycmF5IjpbImdldENvcHlNYXBFbnRyeUFycmF5Il0sImdldENvcHlNYXBFbnRyaWVzIjpbImdldENvcHlNYXBFbnRyaWVzIl0sImV2ZXJ5Q29weU1hcEtleSI6WyJldmVyeUNvcHlNYXBLZXkiXSwiZXZlcnlDb3B5TWFwVmFsdWUiOlsiZXZlcnlDb3B5TWFwVmFsdWUiXSwiY29weU1hcEtleVNldCI6WyJjb3B5TWFwS2V5U2V0Il0sIm1ha2VDb3B5TWFwIjpbIm1ha2VDb3B5TWFwIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAP/bK5A/KAAAPygAAC0AAABAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL2tleXMvY29tcGFyZUtleXMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL2Vycm9ycyIsIi4vY2hlY2tLZXkuanMiLCIuL2tleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzIl0sImV4cG9ydHMiOlsiYmFnQ29tcGFyZSIsImNvbXBhcmVLZXlzIiwia2V5RVEiLCJrZXlHVCIsImtleUdURSIsImtleUxUIiwia2V5TFRFIiwic2V0Q29tcGFyZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IHBhc3NTdHlsZU9mLGdldFRhZyxjb21wYXJlTnVtZXJpY3MsY29tcGFyZVJhbmsscmVjb3JkTmFtZXMscmVjb3JkVmFsdWVzLHEsRmFpbCxhc3NlcnRLZXksZ2V0Q29weUJhZ0VudHJpZXMsZ2V0Q29weU1hcEVudHJ5QXJyYXksZ2V0Q29weVNldEtleXMsbWFrZUNvbXBhcmVDb2xsZWN0aW9uOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJnZXRUYWdcIixbJGjNj19hID0+IChnZXRUYWcgPSAkaM2PX2EpXV0sW1wiY29tcGFyZU51bWVyaWNzXCIsWyRozY9fYSA9PiAoY29tcGFyZU51bWVyaWNzID0gJGjNj19hKV1dLFtcImNvbXBhcmVSYW5rXCIsWyRozY9fYSA9PiAoY29tcGFyZVJhbmsgPSAkaM2PX2EpXV0sW1wicmVjb3JkTmFtZXNcIixbJGjNj19hID0+IChyZWNvcmROYW1lcyA9ICRozY9fYSldXSxbXCJyZWNvcmRWYWx1ZXNcIixbJGjNj19hID0+IChyZWNvcmRWYWx1ZXMgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9jaGVja0tleS5qc1wiLCBbW1wiYXNzZXJ0S2V5XCIsWyRozY9fYSA9PiAoYXNzZXJ0S2V5ID0gJGjNj19hKV1dLFtcImdldENvcHlCYWdFbnRyaWVzXCIsWyRozY9fYSA9PiAoZ2V0Q29weUJhZ0VudHJpZXMgPSAkaM2PX2EpXV0sW1wiZ2V0Q29weU1hcEVudHJ5QXJyYXlcIixbJGjNj19hID0+IChnZXRDb3B5TWFwRW50cnlBcnJheSA9ICRozY9fYSldXSxbXCJnZXRDb3B5U2V0S2V5c1wiLFskaM2PX2EgPT4gKGdldENvcHlTZXRLZXlzID0gJGjNj19hKV1dXV0sW1wiLi9rZXljb2xsZWN0aW9uLW9wZXJhdG9ycy5qc1wiLCBbW1wibWFrZUNvbXBhcmVDb2xsZWN0aW9uXCIsWyRozY9fYSA9PiAobWFrZUNvbXBhcmVDb2xsZWN0aW9uID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAaW1wb3J0IHtDb3B5U2V0LCBLZXksIEtleUNvbXBhcmV9IGZyb20gJy4uL3R5cGVzLmpzJyAqL1xuXG4vKipcbiAqIENvcHlTZXQgWCBpcyBzbWFsbGVyIHRoYW4gQ29weVNldCBZIGlmZiBhbGwgb2YgdGhlc2UgY29uZGl0aW9ucyBob2xkOlxuICogMS4gRm9yIGV2ZXJ5IHggaW4gWCwgeCBpcyBhbHNvIGluIFkuXG4gKiAyLiBUaGVyZSBpcyBhIHkgaW4gWSB0aGF0IGlzIG5vdCBpbiBYLlxuICpcbiAqIFggaXMgZXF1aXZhbGVudCB0byBZIGlmZiB0aGUgY29uZGl0aW9uIDEgaG9sZHMgYnV0IGNvbmRpdGlvbiAyIGRvZXMgbm90LlxuICovXG4gICAgICAgY29uc3Qgc2V0Q29tcGFyZSA9IG1ha2VDb21wYXJlQ29sbGVjdGlvbihcbiAgLyoqIEB0eXBlIHs8SyBleHRlbmRzIEtleT4oczogQ29weVNldDxLPikgPT4gQXJyYXk8W0ssIDFdPn0gKi8gKFxuICAgIHMgPT4gaGFyZGVuKGdldENvcHlTZXRLZXlzKHMpLm1hcChrZXkgPT4gW2tleSwgMV0pKVxuICApLFxuICAwLFxuICBjb21wYXJlTnVtZXJpY3MsXG4pOyRozY9fb25jZS5zZXRDb21wYXJlKHNldENvbXBhcmUpO1xuaGFyZGVuKHNldENvbXBhcmUpO1xuXG4vKipcbiAqIENvcHlCYWcgWCBpcyBzbWFsbGVyIHRoYW4gQ29weUJhZyBZIGlmZiBhbGwgb2YgdGhlc2UgY29uZGl0aW9ucyBob2xkXG4gKiAod2hlcmUgYGNvdW50KEEsIGEpYCBpcyBzaG9ydGhhbmQgZm9yIHRoZSBjb3VudCBhc3NvY2lhdGVkIHdpdGggYGFgIGluIGBBYCk6XG4gKiAxLiBGb3IgZXZlcnkgeCBpbiBYLCB4IGlzIGFsc28gaW4gWSBhbmQgY291bnQoWCwgeCkgPD0gY291bnQoWSwgeCkuXG4gKiAyLiBUaGVyZSBpcyBhIHkgaW4gWSBzdWNoIHRoYXQgeSBpcyBub3QgaW4gWCBvciBjb3VudChYLCB5KSA8IGNvdW50KFksIHkpLlxuICpcbiAqIFggaXMgZXF1aXZhbGVudCB0byBZIGlmZiB0aGUgY29uZGl0aW9uIDEgaG9sZHMgYnV0IGNvbmRpdGlvbiAyIGRvZXMgbm90LlxuICovXG4gICAgICAgY29uc3QgYmFnQ29tcGFyZSA9IG1ha2VDb21wYXJlQ29sbGVjdGlvbihcbiAgZ2V0Q29weUJhZ0VudHJpZXMsXG4gIDBuLFxuICBjb21wYXJlTnVtZXJpY3MsXG4pOyRozY9fb25jZS5iYWdDb21wYXJlKGJhZ0NvbXBhcmUpO1xuaGFyZGVuKGJhZ0NvbXBhcmUpO1xuXG4vKiBUT0RPIFRoZSBkZXNpcmVkIHNlbWFudGljcyBmb3IgQ29weU1hcCBjb21wYXJpc29uIGhhdmUgbm90IHlldCBiZWVuIGRlY2lkZWQuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xNzM3I3B1bGxyZXF1ZXN0cmV2aWV3LTE1OTY1OTU0MTEqL1xuLyogVGhlIGJlbG93IGlzIGEgY3VycmVudGx5LXVudXNlZCBleHRlbnNpb24gb2YgQ29weUJhZyBzZW1hbnRpY3MgKGkuZS4sIGFic2VudCovXG4vKiBlbnRyaWVzIHRyZWF0ZWQgYXMgcHJlc2VudCB3aXRoIGEgdmFsdWUgdGhhdCBpcyBzbWFsbGVyIHRoYW4gZXZlcnl0aGluZykuKi9cbi8qKlxuICogQSB1bmlxdWUgbG9jYWwgdmFsdWUgdGhhdCBpcyBndWFyYW50ZWVkIHRvIG5vdCBleGlzdCBpbiBhbnkgaW5ib3VuZCBkYXRhXG4gKiBzdHJ1Y3R1cmUgKHdoaWNoIHdvdWxkIG5vdCBiZSB0aGUgY2FzZSBpZiB3ZSB1c2VkIGBTeW1ib2wuZm9yYCkuXG4gKiBOb3RlIHRoYXQgYEFCU0VOVGAgaXMgbm90IHBhc3NhYmxlLCBhbmQgc28gb25seSBleGlzdHMgYXQgdGhlIEpTIGxldmVsIG9mXG4gKiBhYnN0cmFjdGlvbiwgbm90IHBhc3Mtc3R5bGUuXG4gKi9cbmNvbnN0IEFCU0VOVCA9IFN5bWJvbCgnYWJzZW50Jyk7XG5cbi8qKlxuICogQ29weU1hcCBYIGlzIHNtYWxsZXIgdGhhbiBDb3B5TWFwIFkgaWZmIGFsbCBvZiB0aGVzZSBjb25kaXRpb25zIGhvbGQ6XG4gKiAxLiBYIGFuZCBZIGFyZSBib3RoIEtleXMgKGkuZS4sIG5laXRoZXIgY29udGFpbnMgbm9uLWNvbXBhcmFibGUgZGF0YSkuXG4gKiAyLiBGb3IgZXZlcnkgeCBpbiBYLCB4IGlzIGFsc28gaW4gWSBhbmQgWFt4XSBpcyBzbWFsbGVyIHRoYW4gb3IgZXF1aXZhbGVudCB0byBZW3hdLlxuICogMy4gVGhlcmUgaXMgYSB5IGluIFkgc3VjaCB0aGF0IHkgaXMgbm90IGluIFggb3IgWFt5XSBpcyBzbWFsbGVyIHRoYW4gWVt5XS5cbiAqXG4gKiBYIGlzIGVxdWl2YWxlbnQgdG8gWSBpZmYgY29uZGl0aW9ucyAxIGFuZCAyIGhvbGQgYnV0IGNvbmRpdGlvbiAzIGRvZXMgbm90LlxuICovXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZXJzY29yZS1kYW5nbGUqL1xuY29uc3QgX21hcENvbXBhcmUgPSBtYWtlQ29tcGFyZUNvbGxlY3Rpb24oXG4gIGdldENvcHlNYXBFbnRyeUFycmF5LFxuICBBQlNFTlQsXG4gIChsZWZ0VmFsdWUsIHJpZ2h0VmFsdWUpID0+IHtcbiAgICBpZiAobGVmdFZhbHVlID09PSBBQlNFTlQgJiYgcmlnaHRWYWx1ZSA9PT0gQUJTRU5UKSB7XG4gICAgICB0aHJvdyBGYWlsYEludGVybmFsOiBVbmV4cGVjdGVkIGFic2VudCBlbnRyeSBwYWlyYDtcbiAgICB9IGVsc2UgaWYgKGxlZnRWYWx1ZSA9PT0gQUJTRU5UKSB7XG4gICAgICByZXR1cm4gLTE7XG4gICAgfSBlbHNlIGlmIChyaWdodFZhbHVlID09PSBBQlNFTlQpIHtcbiAgICAgIHJldHVybiAxO1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgICAgcmV0dXJuIGNvbXBhcmVLZXlzKGxlZnRWYWx1ZSwgcmlnaHRWYWx1ZSk7XG4gICAgfVxuICB9LFxuKTtcbmhhcmRlbihfbWFwQ29tcGFyZSk7XG5cbi8qKiBAdHlwZSB7S2V5Q29tcGFyZX0gKi9cbiAgICAgICBjb25zdCBjb21wYXJlS2V5cyA9IChsZWZ0LCByaWdodCkgPT4ge1xuICBhc3NlcnRLZXkobGVmdCk7XG4gIGFzc2VydEtleShyaWdodCk7XG4gIGNvbnN0IGxlZnRTdHlsZSA9IHBhc3NTdHlsZU9mKGxlZnQpO1xuICBjb25zdCByaWdodFN0eWxlID0gcGFzc1N0eWxlT2YocmlnaHQpO1xuICBpZiAobGVmdFN0eWxlICE9PSByaWdodFN0eWxlKSB7XG4gICAgLyogRGlmZmVyZW50IHBhc3NTdHlsZXMgYXJlIGluY29tbWVuc3VyYXRlKi9cbiAgICByZXR1cm4gTmFOO1xuICB9XG4gIHN3aXRjaCAobGVmdFN0eWxlKSB7XG4gICAgY2FzZSAndW5kZWZpbmVkJzpcbiAgICBjYXNlICdudWxsJzpcbiAgICBjYXNlICdib29sZWFuJzpcbiAgICBjYXNlICdiaWdpbnQnOlxuICAgIGNhc2UgJ3N0cmluZyc6XG4gICAgY2FzZSAnYnl0ZUFycmF5JzpcbiAgICBjYXNlICdzeW1ib2wnOiB7XG4gICAgICAvKiBmb3IgdGhlc2UsIGtleXMgY29tcGFyZSB0aGUgc2FtZSBhcyByYW5rKi9cbiAgICAgIHJldHVybiBjb21wYXJlUmFuayhsZWZ0LCByaWdodCk7XG4gICAgfVxuICAgIGNhc2UgJ251bWJlcic6IHtcbiAgICAgIGNvbnN0IHJhbmtDb21wID0gY29tcGFyZVJhbmsobGVmdCwgcmlnaHQpO1xuICAgICAgaWYgKHJhbmtDb21wID09PSAwKSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgICAgaWYgKE51bWJlci5pc05hTihsZWZ0KSB8fCBOdW1iZXIuaXNOYU4ocmlnaHQpKSB7XG4gICAgICAgIC8qIE5hTiBpcyBlcXVhbCB0byBpdHNlbGYsIGJ1dCBpbmNvbW1lbnN1cmF0ZSB3aXRoIGV2ZXJ5dGhpbmcgZWxzZSovXG4gICAgICAgIGFzc2VydCghTnVtYmVyLmlzTmFOKGxlZnQpIHx8ICFOdW1iZXIuaXNOYU4ocmlnaHQpKTtcbiAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgIH1cbiAgICAgIC8qIEFtb25nIG5vbi1OYU4gbnVtYmVycywga2V5IG9yZGVyIGlzIHRoZSBzYW1lIGFzIHJhbmsgb3JkZXIuIE5vdGUgdGhhdCovXG4gICAgICAvKiBpbiBib3RoIG9yZGVycywgYC0wYCBpcyBpbiB0aGUgc2FtZSBlcXVpdmFsZW5jZSBjbGFzcyBhcyBgMGAuKi9cbiAgICAgIHJldHVybiByYW5rQ29tcDtcbiAgICB9XG4gICAgY2FzZSAncmVtb3RhYmxlJzoge1xuICAgICAgaWYgKGxlZnQgPT09IHJpZ2h0KSB7XG4gICAgICAgIHJldHVybiAwO1xuICAgICAgfVxuICAgICAgLyogSWYgdHdvIHJlbW90YWJsZXMgYXJlIG5vdCBpZGVudGljYWwsIHRoZW4gYXMga2V5cyB0aGV5IGFyZSovXG4gICAgICAvKiBpbmNvbW1lbnN1cmF0ZS4qL1xuICAgICAgcmV0dXJuIE5hTjtcbiAgICB9XG4gICAgY2FzZSAnY29weUFycmF5Jzoge1xuICAgICAgLyogTGV4aWNvZ3JhcGhpYyBieSBrZXkgb3JkZXIuIFJhbmsgb3JkZXIgb2YgYXJyYXlzIGlzIGxleGljb2dyYXBoaWMgYnkqL1xuICAgICAgLyogcmFuayBvcmRlci4qL1xuICAgICAgLyogQmVjYXVzZSB0aGUgaW52YXJpYW50cyBhYm92ZSBhcHBseSB0byB0aGUgZWxlbWVudHMgb2YgdGhlIGFycmF5LCovXG4gICAgICAvKiB0aGV5IGFwcGx5IHRvIHRoZSBhcnJheSBhcyBhIHdob2xlLiovXG4gICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5hcnJvd2VkKi9cbiAgICAgIGNvbnN0IGxlbiA9IE1hdGgubWluKGxlZnQubGVuZ3RoLCByaWdodC5sZW5ndGgpO1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkgKz0gMSkge1xuICAgICAgICAvKiBAdHMtZXhwZWN0LWVycm9yIG5hcnJvd2VkKi9cbiAgICAgICAgY29uc3QgcmVzdWx0ID0gY29tcGFyZUtleXMobGVmdFtpXSwgcmlnaHRbaV0pO1xuICAgICAgICBpZiAocmVzdWx0ICE9PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLyogSWYgYWxsIG1hdGNoaW5nIGVsZW1lbnRzIGFyZSBrZXlFUSwgdGhlbiBhY2NvcmRpbmcgdG8gdGhlaXIgbGVuZ3Rocy4qL1xuICAgICAgLyogVGh1cywgaWYgYXJyYXkgWCBpcyBhIHByZWZpeCBvZiBhcnJheSBZLCB0aGVuIFggaXMgc21hbGxlciB0aGFuIFkuKi9cbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgbmFycm93ZWQqL1xuICAgICAgcmV0dXJuIGNvbXBhcmVSYW5rKGxlZnQubGVuZ3RoLCByaWdodC5sZW5ndGgpO1xuICAgIH1cbiAgICBjYXNlICdjb3B5UmVjb3JkJzoge1xuICAgICAgLyogUGFyZXRvIHBhcnRpYWwgb3JkZXIgY29tcGFyaXNvbi4qL1xuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBuYXJyb3dlZCovXG4gICAgICBjb25zdCBsZWZ0TmFtZXMgPSByZWNvcmROYW1lcyhsZWZ0KTtcbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgbmFycm93ZWQqL1xuICAgICAgY29uc3QgcmlnaHROYW1lcyA9IHJlY29yZE5hbWVzKHJpZ2h0KTtcblxuICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICAgIGlmICgha2V5RVEobGVmdE5hbWVzLCByaWdodE5hbWVzKSkge1xuICAgICAgICAvKiBJZiB0aGV5IGRvIG5vdCBoYXZlIGV4YWN0bHkgdGhlIHNhbWUgcHJvcGVydGllcywqL1xuICAgICAgICAvKiB0aGV5IGFyZSBpbmNvbW1lbnN1cmF0ZS4qL1xuICAgICAgICAvKiBOb3RlIHRoYXQgcmFuayBzb3J0aW5nIG9mIGNvcHlSZWNvcmRzIGdyb3VwcyBhbGwgY29weVJlY29yZHMgd2l0aCovXG4gICAgICAgIC8qIHRoZSBzYW1lIGtleXMgdG9nZXRoZXIsIGVuYWJsaW5nIHJhbmdlIHNlYXJjaGluZyBvdmVyIGNvcHlSZWNvcmRzKi9cbiAgICAgICAgLyogdG8gYXZvaWQgbW9yZSBpcnJlbGV2YW50IG9uZXMuKi9cbiAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgIH1cbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgbmFycm93ZWQqL1xuICAgICAgY29uc3QgbGVmdFZhbHVlcyA9IHJlY29yZFZhbHVlcyhsZWZ0LCBsZWZ0TmFtZXMpO1xuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBuYXJyb3dlZCovXG4gICAgICBjb25zdCByaWdodFZhbHVlcyA9IHJlY29yZFZhbHVlcyhyaWdodCwgcmlnaHROYW1lcyk7XG4gICAgICAvKiBQcmVzdW1lIHRoYXQgYm90aCBjb3B5UmVjb3JkcyBoYXZlIHRoZSBzYW1lIGtleSBvcmRlciovXG4gICAgICAvKiB1bnRpbCBlbmNvdW50ZXJpbmcgYSBwcm9wZXJ0eSBkaXNwcm92aW5nIHRoYXQgaHlwb3RoZXNpcy4qL1xuICAgICAgbGV0IHJlc3VsdCA9IDA7XG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlZnRWYWx1ZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgY29uc3QgY29tcCA9IGNvbXBhcmVLZXlzKGxlZnRWYWx1ZXNbaV0sIHJpZ2h0VmFsdWVzW2ldKTtcbiAgICAgICAgaWYgKE51bWJlci5pc05hTihjb21wKSkge1xuICAgICAgICAgIHJldHVybiBOYU47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc3VsdCAhPT0gY29tcCAmJiBjb21wICE9PSAwKSB7XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gMCkge1xuICAgICAgICAgICAgcmVzdWx0ID0gY29tcDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYXNzZXJ0KFxuICAgICAgICAgICAgICAocmVzdWx0ID09PSAtMSAmJiBjb21wID09PSAxKSB8fCAocmVzdWx0ID09PSAxICYmIGNvbXAgPT09IC0xKSxcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLyogSWYgY29weVJlY29yZCBYIGlzIHNtYWxsZXIgdGhhbiBjb3B5UmVjb3JkIFksIHRoZW4gdGhleSBtdXN0IGhhdmUgdGhlKi9cbiAgICAgIC8qIHNhbWUgcHJvcGVydHkgbmFtZXMgYW5kIGV2ZXJ5IHZhbHVlIGluIFggbXVzdCBiZSBzbWFsbGVyIG9yIGVxdWFsIHRvKi9cbiAgICAgIC8qIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGluIFkgKHdpdGggYXQgbGVhc3Qgb25lIHZhbHVlIHNtYWxsZXIpLiovXG4gICAgICAvKiBUaGUgcmFuayBvcmRlciBvZiBYIGFuZCBZIGlzIGJhc2VkIG9uIGxleGljb2dyYXBoaWMgcmFuayBvcmRlciBvZiovXG4gICAgICAvKiB0aGVpciB2YWx1ZXMsIGFzIG9yZ2FuaXplZCBieSByZXZlcnNlIGxleGljb2dyYXBoaWMgb3JkZXIgb2YgdGhlaXIqL1xuICAgICAgLyogcHJvcGVydHkgbmFtZXMuKi9cbiAgICAgIC8qIFRodXMgaWYgY29tcGFyZUtleXMoWCxZKSA8IDAgdGhlbiBjb21wYXJlUmFuayhYLFkpIDwgMC4qL1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgY2FzZSAndGFnZ2VkJzoge1xuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBuYXJyb3dlZCovXG4gICAgICBjb25zdCBsZWZ0VGFnID0gZ2V0VGFnKGxlZnQpO1xuICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBuYXJyb3dlZCovXG4gICAgICBjb25zdCByaWdodFRhZyA9IGdldFRhZyhyaWdodCk7XG4gICAgICBpZiAobGVmdFRhZyAhPT0gcmlnaHRUYWcpIHtcbiAgICAgICAgLyogZGlmZmVyZW50IHRhZ3MgYXJlIGluY29tbWVuc3VyYXRlKi9cbiAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAobGVmdFRhZykge1xuICAgICAgICBjYXNlICdjb3B5U2V0Jzoge1xuICAgICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgbmFycm93ZWQqL1xuICAgICAgICAgIHJldHVybiBzZXRDb21wYXJlKGxlZnQsIHJpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdjb3B5QmFnJzoge1xuICAgICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgbmFycm93ZWQqL1xuICAgICAgICAgIHJldHVybiBiYWdDb21wYXJlKGxlZnQsIHJpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBjYXNlICdjb3B5TWFwJzoge1xuICAgICAgICAgIC8qIFRPRE8gVGhlIGRlc2lyZWQgc2VtYW50aWNzIGZvciBDb3B5TWFwIGNvbXBhcmlzb24gaGF2ZSBub3QgeWV0IGJlZW4gZGVjaWRlZC4qL1xuICAgICAgICAgIC8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xNzM3I3B1bGxyZXF1ZXN0cmV2aWV3LTE1OTY1OTU0MTEqL1xuICAgICAgICAgIHRocm93IEZhaWxgTWFwIGNvbXBhcmlzb24gbm90IHlldCBpbXBsZW1lbnRlZDogJHtsZWZ0fSB2cyAke3JpZ2h0fWA7XG4gICAgICAgIH1cbiAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgIHRocm93IEZhaWxgdW5leHBlY3RlZCB0YWcgJHtxKGxlZnRUYWcpfTogJHtsZWZ0fWA7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZGVmYXVsdDoge1xuICAgICAgdGhyb3cgRmFpbGB1bmV4cGVjdGVkIHBhc3NTdHlsZSAke3EobGVmdFN0eWxlKX06ICR7bGVmdH1gO1xuICAgIH1cbiAgfVxufTskaM2PX29uY2UuY29tcGFyZUtleXMoY29tcGFyZUtleXMpO1xuaGFyZGVuKGNvbXBhcmVLZXlzKTtcblxuICAgICAgIGNvbnN0IGtleUxUID0gKGxlZnQsIHJpZ2h0KSA9PiBjb21wYXJlS2V5cyhsZWZ0LCByaWdodCkgPCAwOyRozY9fb25jZS5rZXlMVChrZXlMVCk7XG5oYXJkZW4oa2V5TFQpO1xuXG4gICAgICAgY29uc3Qga2V5TFRFID0gKGxlZnQsIHJpZ2h0KSA9PiBjb21wYXJlS2V5cyhsZWZ0LCByaWdodCkgPD0gMDskaM2PX29uY2Uua2V5TFRFKGtleUxURSk7XG5oYXJkZW4oa2V5TFRFKTtcblxuICAgICAgIGNvbnN0IGtleUVRID0gKGxlZnQsIHJpZ2h0KSA9PiBjb21wYXJlS2V5cyhsZWZ0LCByaWdodCkgPT09IDA7JGjNj19vbmNlLmtleUVRKGtleUVRKTtcbmhhcmRlbihrZXlFUSk7XG5cbiAgICAgICBjb25zdCBrZXlHVEUgPSAobGVmdCwgcmlnaHQpID0+IGNvbXBhcmVLZXlzKGxlZnQsIHJpZ2h0KSA+PSAwOyRozY9fb25jZS5rZXlHVEUoa2V5R1RFKTtcbmhhcmRlbihrZXlHVEUpO1xuXG4gICAgICAgY29uc3Qga2V5R1QgPSAobGVmdCwgcmlnaHQpID0+IGNvbXBhcmVLZXlzKGxlZnQsIHJpZ2h0KSA+IDA7JGjNj19vbmNlLmtleUdUKGtleUdUKTtcbmhhcmRlbihrZXlHVCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJzZXRDb21wYXJlIjpbInNldENvbXBhcmUiXSwiYmFnQ29tcGFyZSI6WyJiYWdDb21wYXJlIl0sImNvbXBhcmVLZXlzIjpbImNvbXBhcmVLZXlzIl0sImtleUxUIjpbImtleUxUIl0sImtleUxURSI6WyJrZXlMVEUiXSwia2V5RVEiOlsia2V5RVEiXSwia2V5R1RFIjpbImtleUdURSJdLCJrZXlHVCI6WyJrZXlHVCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAA0W1NjTRUAAE0VAAApAAAAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9rZXlzL2NvcHlCYWcuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbImFzc2VydEJhZ0VudHJpZXMiLCJhc3NlcnROb0R1cGxpY2F0ZUtleXMiLCJjaGVja0JhZ0VudHJpZXMiLCJjb2VyY2VUb0JhZ0VudHJpZXMiLCJtYWtlQmFnT2ZFbnRyaWVzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYXNzZXJ0Q2hlY2tlcixtYWtlVGFnZ2VkLHBhc3NTdHlsZU9mLGNvbXBhcmVBbnRpUmFuayxpc1JhbmtTb3J0ZWQsbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQsc29ydEJ5UmFuayxYOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLFskaM2PX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaM2PX2EpXV0sW1wibWFrZVRhZ2dlZFwiLFskaM2PX2EgPT4gKG1ha2VUYWdnZWQgPSAkaM2PX2EpXV0sW1wicGFzc1N0eWxlT2ZcIixbJGjNj19hID0+IChwYXNzU3R5bGVPZiA9ICRozY9fYSldXSxbXCJjb21wYXJlQW50aVJhbmtcIixbJGjNj19hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaM2PX2EpXV0sW1wiaXNSYW5rU29ydGVkXCIsWyRozY9fYSA9PiAoaXNSYW5rU29ydGVkID0gJGjNj19hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsWyRozY9fYSA9PiAobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAkaM2PX2EpXV0sW1wic29ydEJ5UmFua1wiLFskaM2PX2EgPT4gKHNvcnRCeVJhbmsgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcIlhcIixbJGjNj19hID0+IChYID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtQYXNzYWJsZX0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSdcbiAqIEBpbXBvcnQge0NoZWNrZXIsIEZ1bGxDb21wYXJlfSBmcm9tICdAZW5kby9tYXJzaGFsJ1xuICogQGltcG9ydCB7Q29weUJhZywgS2V5fSBmcm9tICcuLi90eXBlcy5qcydcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBUXG4gKiBAcGFyYW0ge1tULGJpZ2ludF1bXX0gYmFnRW50cmllc1xuICogQHBhcmFtIHtGdWxsQ29tcGFyZSB8IHVuZGVmaW5lZH0gZnVsbENvbXBhcmUgSWYgcHJvdmlkZWQgYW5kIGBiYWdFbnRyaWVzYCBpcyBhbHJlYWR5XG4gKiBrbm93biB0byBiZSBzb3J0ZWQgYnkgdGhpcyBgZnVsbENvbXBhcmVgLCB0aGVuIHdlIHNob3VsZCBnZXQgYSBtZW1vIGhpdFxuICogcmF0aGVyIHRoYW4gYSByZXNvcnRpbmcuIEhvd2V2ZXIsIGN1cnJlbnRseSwgd2Ugc3RpbGwgZW51bWVyYXRlIHRoZSBlbnRpcmVcbiAqIGFycmF5IGVhY2ggdGltZS5cbiAqXG4gKiBUT0RPOiBJZiBkb2luZyB0aGlzIHJlZHVudGFudGx5IHR1cm5zIG91dCB0byBiZSBleHBlbnNpdmUsIHdlXG4gKiBjb3VsZCBtZW1vaXplIHRoaXMgbm8tZHVwbGljYXRlLWtleXMgZmluZGluZyBhcyB3ZWxsLCBpbmRlcGVuZGVudFxuICogb2YgdGhlIGBmdWxsT3JkZXJgIHVzZSB0byByZWFjaCB0aGlzIGZpbmRpbmcuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tOb0R1cGxpY2F0ZUtleXMgPSAoYmFnRW50cmllcywgZnVsbENvbXBhcmUsIGNoZWNrKSA9PiB7XG4gIC8qIFRoaXMgZnVsbE9yZGVyIGNvbnRhaW5zIGhpc3RvcnkgZGVwZW5kZW50IHN0YXRlLiBJdCBpcyBzcGVjaWZpYyovXG4gIC8qIHRvIHRoaXMgb25lIGNhbGwgYW5kIGRvZXMgbm90IHN1cnZpdmUgaXQuKi9cbiAgLyogVE9ETyBPbmNlIGFsbCBvdXIgdG9vbGluZyBpcyByZWFkeSBmb3IgYCYmPWAsIHRoZSBmb2xsb3dpbmcqL1xuICAvKiBsaW5lIHNob3VsZCBiZSByZXdyaXR0ZW4gdXNpbmcgaXQuKi9cbiAgZnVsbENvbXBhcmUgPSBmdWxsQ29tcGFyZSB8fCBtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuXG4gIC8qIFNpbmNlIHRoZSBrZXkgaXMgbW9yZSBzaWduaWZpY2FudCB0aGFuIHRoZSB2YWx1ZSAodGhlIGNvdW50KSwqL1xuICAvKiBzb3J0aW5nIGJ5IGZ1bGxPcmRlciBpcyBndWFyYW50ZWVkIHRvIG1ha2UgZHVwbGljYXRlIGtleXMqL1xuICAvKiBhZGphY2VudCBpbmRlcGVuZGVudCBvZiB0aGVpciBjb3VudHMuKi9cbiAgYmFnRW50cmllcyA9IHNvcnRCeVJhbmsoYmFnRW50cmllcywgZnVsbENvbXBhcmUpO1xuICBjb25zdCB7IGxlbmd0aCB9ID0gYmFnRW50cmllcztcbiAgZm9yIChsZXQgaSA9IDE7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IGswID0gYmFnRW50cmllc1tpIC0gMV1bMF07XG4gICAgY29uc3QgazEgPSBiYWdFbnRyaWVzW2ldWzBdO1xuICAgIGlmIChmdWxsQ29tcGFyZShrMCwgazEpID09PSAwKSB7XG4gICAgICByZXR1cm4gY2hlY2soZmFsc2UsIFhgdmFsdWUgaGFzIGR1cGxpY2F0ZSBrZXlzOiAke2swfWApO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IFRcbiAqIEBwYXJhbSB7W1QsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlfSBbZnVsbENvbXBhcmVdXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydE5vRHVwbGljYXRlS2V5cyA9IChiYWdFbnRyaWVzLCBmdWxsQ29tcGFyZSA9IHVuZGVmaW5lZCkgPT4ge1xuICBjaGVja05vRHVwbGljYXRlS2V5cyhiYWdFbnRyaWVzLCBmdWxsQ29tcGFyZSwgYXNzZXJ0Q2hlY2tlcik7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7W1Bhc3NhYmxlLGJpZ2ludF1bXX0gYmFnRW50cmllc1xuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaM2PX29uY2UuYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzKGFzc2VydE5vRHVwbGljYXRlS2V5cyk7XG4gICAgICAgY29uc3QgY2hlY2tCYWdFbnRyaWVzID0gKGJhZ0VudHJpZXMsIGNoZWNrKSA9PiB7XG4gIGlmIChwYXNzU3R5bGVPZihiYWdFbnRyaWVzKSAhPT0gJ2NvcHlBcnJheScpIHtcbiAgICByZXR1cm4gY2hlY2soXG4gICAgICBmYWxzZSxcbiAgICAgIFhgVGhlIGVudHJpZXMgb2YgYSBjb3B5QmFnIG11c3QgYmUgYSBjb3B5QXJyYXk6ICR7YmFnRW50cmllc31gLFxuICAgICk7XG4gIH1cbiAgaWYgKCFpc1JhbmtTb3J0ZWQoYmFnRW50cmllcywgY29tcGFyZUFudGlSYW5rKSkge1xuICAgIHJldHVybiBjaGVjayhcbiAgICAgIGZhbHNlLFxuICAgICAgWGBUaGUgZW50cmllcyBvZiBhIGNvcHlCYWcgbXVzdCBiZSBzb3J0ZWQgaW4gcmV2ZXJzZSByYW5rIG9yZGVyOiAke2JhZ0VudHJpZXN9YCxcbiAgICApO1xuICB9XG4gIGZvciAoY29uc3QgZW50cnkgb2YgYmFnRW50cmllcykge1xuICAgIGlmIChcbiAgICAgIHBhc3NTdHlsZU9mKGVudHJ5KSAhPT0gJ2NvcHlBcnJheScgfHxcbiAgICAgIGVudHJ5Lmxlbmd0aCAhPT0gMiB8fFxuICAgICAgdHlwZW9mIGVudHJ5WzFdICE9PSAnYmlnaW50J1xuICAgICkge1xuICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgWGBFYWNoIGVudHJ5IG9mIGEgY29weUJhZyBtdXN0IGJlIHBhaXIgb2YgYSBrZXkgYW5kIGEgYmlnaW50IHJlcHJlc2VudGluZyBhIGNvdW50OiAke2VudHJ5fWAsXG4gICAgICApO1xuICAgIH1cbiAgICBpZiAoZW50cnlbMV0gPCAxKSB7XG4gICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBYYEVhY2ggZW50cnkgb2YgYSBjb3B5QmFnIG11c3QgaGF2ZSBhIHBvc2l0aXZlIGNvdW50OiAke2VudHJ5fWAsXG4gICAgICApO1xuICAgIH1cbiAgfVxuICAvKiBAdHMtZXhwZWN0LWVycm9yIFhYWCBLZXkgdHlwZXMqL1xuICByZXR1cm4gY2hlY2tOb0R1cGxpY2F0ZUtleXMoYmFnRW50cmllcywgdW5kZWZpbmVkLCBjaGVjayk7XG59OyRozY9fb25jZS5jaGVja0JhZ0VudHJpZXMoY2hlY2tCYWdFbnRyaWVzKTtcbmhhcmRlbihjaGVja0JhZ0VudHJpZXMpO1xuXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1yZXR1cm5zLWNoZWNrIC0tIGRvZXNuJ3QgdW5kZXJzdGFuZCBhc3NlcnRzKi9cbi8qKlxuICogQHBhcmFtIHtbUGFzc2FibGUsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBiYWdFbnRyaWVzIGlzIFtQYXNzYWJsZSxiaWdpbnRdW119XG4gKi9cbiAgICAgICBjb25zdCBhc3NlcnRCYWdFbnRyaWVzID0gYmFnRW50cmllcyA9PiB7XG4gIGNoZWNrQmFnRW50cmllcyhiYWdFbnRyaWVzLCBhc3NlcnRDaGVja2VyKTtcbn07JGjNj19vbmNlLmFzc2VydEJhZ0VudHJpZXMoYXNzZXJ0QmFnRW50cmllcyk7XG5oYXJkZW4oYXNzZXJ0QmFnRW50cmllcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8W0ssIGJpZ2ludF0+fSBiYWdFbnRyaWVzTGlzdFxuICovXG4gICAgICAgY29uc3QgY29lcmNlVG9CYWdFbnRyaWVzID0gYmFnRW50cmllc0xpc3QgPT4ge1xuICBjb25zdCBiYWdFbnRyaWVzID0gc29ydEJ5UmFuayhiYWdFbnRyaWVzTGlzdCwgY29tcGFyZUFudGlSYW5rKTtcbiAgYXNzZXJ0QmFnRW50cmllcyhiYWdFbnRyaWVzKTtcbiAgcmV0dXJuIGJhZ0VudHJpZXM7XG59OyRozY9fb25jZS5jb2VyY2VUb0JhZ0VudHJpZXMoY29lcmNlVG9CYWdFbnRyaWVzKTtcbmhhcmRlbihjb2VyY2VUb0JhZ0VudHJpZXMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtLLCBiaWdpbnRdPn0gYmFnRW50cnlJdGVyXG4gKiBAcmV0dXJucyB7Q29weUJhZzxLPn1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VCYWdPZkVudHJpZXMgPSBiYWdFbnRyeUl0ZXIgPT5cbiAgbWFrZVRhZ2dlZCgnY29weUJhZycsIGNvZXJjZVRvQmFnRW50cmllcyhiYWdFbnRyeUl0ZXIpKTskaM2PX29uY2UubWFrZUJhZ09mRW50cmllcyhtYWtlQmFnT2ZFbnRyaWVzKTtcbmhhcmRlbihtYWtlQmFnT2ZFbnRyaWVzKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydE5vRHVwbGljYXRlS2V5cyI6WyJhc3NlcnROb0R1cGxpY2F0ZUtleXMiXSwiY2hlY2tCYWdFbnRyaWVzIjpbImNoZWNrQmFnRW50cmllcyJdLCJhc3NlcnRCYWdFbnRyaWVzIjpbImFzc2VydEJhZ0VudHJpZXMiXSwiY29lcmNlVG9CYWdFbnRyaWVzIjpbImNvZXJjZVRvQmFnRW50cmllcyJdLCJtYWtlQmFnT2ZFbnRyaWVzIjpbIm1ha2VCYWdPZkVudHJpZXMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAALCODJiwRAAAsEQAAKQAAAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMva2V5cy9jb3B5U2V0LmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAZW5kby9lcnJvcnMiXSwiZXhwb3J0cyI6WyJhc3NlcnRFbGVtZW50cyIsImFzc2VydE5vRHVwbGljYXRlcyIsImNoZWNrRWxlbWVudHMiLCJjb2VyY2VUb0VsZW1lbnRzIiwibWFrZVNldE9mRWxlbWVudHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnRDaGVja2VyLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsY29tcGFyZUFudGlSYW5rLGlzUmFua1NvcnRlZCxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLFg7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJtYWtlVGFnZ2VkXCIsWyRozY9fYSA9PiAobWFrZVRhZ2dlZCA9ICRozY9fYSldXSxbXCJwYXNzU3R5bGVPZlwiLFskaM2PX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjNj19hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLFskaM2PX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRozY9fYSldXSxbXCJpc1JhbmtTb3J0ZWRcIixbJGjNj19hID0+IChpc1JhbmtTb3J0ZWQgPSAkaM2PX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIixbJGjNj19hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRozY9fYSldXSxbXCJzb3J0QnlSYW5rXCIsWyRozY9fYSA9PiAoc29ydEJ5UmFuayA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2Vycm9yc1wiLCBbW1wiWFwiLFskaM2PX2EgPT4gKFggPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge1Bhc3NhYmxlfSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJ1xuICogQGltcG9ydCB7Q2hlY2tlciwgRnVsbENvbXBhcmV9IGZyb20gJ0BlbmRvL21hcnNoYWwnXG4gKiBAaW1wb3J0IHtDb3B5U2V0LCBLZXl9IGZyb20gJy4uL3R5cGVzLmpzJ1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVFxuICogQHBhcmFtIHtUW119IGVsZW1lbnRzXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlIHwgdW5kZWZpbmVkfSBmdWxsQ29tcGFyZSBJZiBwcm92aWRlZCBhbmQgYGVsZW1lbnRzYCBpcyBhbHJlYWR5IGtub3duXG4gKiB0byBiZSBzb3J0ZWQgYnkgdGhpcyBgZnVsbENvbXBhcmVgLCB0aGVuIHdlIHNob3VsZCBnZXQgYSBtZW1vIGhpdCByYXRoZXJcbiAqIHRoYW4gYSByZXNvcnRpbmcuIEhvd2V2ZXIsIGN1cnJlbnRseSwgd2Ugc3RpbGwgZW51bWVyYXRlIHRoZSBlbnRpcmUgYXJyYXlcbiAqIGVhY2ggdGltZS5cbiAqXG4gKiBUT0RPOiBJZiBkb2luZyB0aGlzIHJlZHVudGFudGx5IHR1cm5zIG91dCB0byBiZSBleHBlbnNpdmUsIHdlXG4gKiBjb3VsZCBtZW1vaXplIHRoaXMgbm8tZHVwbGljYXRlIGZpbmRpbmcgYXMgd2VsbCwgaW5kZXBlbmRlbnRcbiAqIG9mIHRoZSBgZnVsbE9yZGVyYCB1c2UgdG8gcmVhY2ggdGhpcyBmaW5kaW5nLlxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrTm9EdXBsaWNhdGVzID0gKGVsZW1lbnRzLCBmdWxsQ29tcGFyZSwgY2hlY2spID0+IHtcbiAgLyogVGhpcyBmdWxsT3JkZXIgY29udGFpbnMgaGlzdG9yeSBkZXBlbmRlbnQgc3RhdGUuIEl0IGlzIHNwZWNpZmljKi9cbiAgLyogdG8gdGhpcyBvbmUgY2FsbCBhbmQgZG9lcyBub3Qgc3Vydml2ZSBpdC4qL1xuICAvKiBUT0RPIE9uY2UgYWxsIG91ciB0b29saW5nIGlzIHJlYWR5IGZvciBgJiY9YCwgdGhlIGZvbGxvd2luZyovXG4gIC8qIGxpbmUgc2hvdWxkIGJlIHJld3JpdHRlbiB1c2luZyBpdC4qL1xuICBmdWxsQ29tcGFyZSA9IGZ1bGxDb21wYXJlIHx8IG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbiAgZWxlbWVudHMgPSBzb3J0QnlSYW5rKGVsZW1lbnRzLCBmdWxsQ29tcGFyZSk7XG4gIGNvbnN0IHsgbGVuZ3RoIH0gPSBlbGVtZW50cztcbiAgZm9yIChsZXQgaSA9IDE7IGkgPCBsZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IGswID0gZWxlbWVudHNbaSAtIDFdO1xuICAgIGNvbnN0IGsxID0gZWxlbWVudHNbaV07XG4gICAgaWYgKGZ1bGxDb21wYXJlKGswLCBrMSkgPT09IDApIHtcbiAgICAgIHJldHVybiBjaGVjayhmYWxzZSwgWGB2YWx1ZSBoYXMgZHVwbGljYXRlIGtleXM6ICR7azB9YCk7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBUXG4gKiBAcGFyYW0ge1RbXX0gZWxlbWVudHNcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmV9IFtmdWxsQ29tcGFyZV1cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG4gICAgICAgY29uc3QgYXNzZXJ0Tm9EdXBsaWNhdGVzID0gKGVsZW1lbnRzLCBmdWxsQ29tcGFyZSA9IHVuZGVmaW5lZCkgPT4ge1xuICBjaGVja05vRHVwbGljYXRlcyhlbGVtZW50cywgZnVsbENvbXBhcmUsIGFzc2VydENoZWNrZXIpO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IGVsZW1lbnRzXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRozY9fb25jZS5hc3NlcnROb0R1cGxpY2F0ZXMoYXNzZXJ0Tm9EdXBsaWNhdGVzKTtcbiAgICAgICBjb25zdCBjaGVja0VsZW1lbnRzID0gKGVsZW1lbnRzLCBjaGVjaykgPT4ge1xuICBpZiAocGFzc1N0eWxlT2YoZWxlbWVudHMpICE9PSAnY29weUFycmF5Jykge1xuICAgIHJldHVybiBjaGVjayhcbiAgICAgIGZhbHNlLFxuICAgICAgWGBUaGUga2V5cyBvZiBhIGNvcHlTZXQgb3IgY29weU1hcCBtdXN0IGJlIGEgY29weUFycmF5OiAke2VsZW1lbnRzfWAsXG4gICAgKTtcbiAgfVxuICBpZiAoIWlzUmFua1NvcnRlZChlbGVtZW50cywgY29tcGFyZUFudGlSYW5rKSkge1xuICAgIHJldHVybiBjaGVjayhcbiAgICAgIGZhbHNlLFxuICAgICAgWGBUaGUga2V5cyBvZiBhIGNvcHlTZXQgb3IgY29weU1hcCBtdXN0IGJlIHNvcnRlZCBpbiByZXZlcnNlIHJhbmsgb3JkZXI6ICR7ZWxlbWVudHN9YCxcbiAgICApO1xuICB9XG4gIHJldHVybiBjaGVja05vRHVwbGljYXRlcyhlbGVtZW50cywgdW5kZWZpbmVkLCBjaGVjayk7XG59OyRozY9fb25jZS5jaGVja0VsZW1lbnRzKGNoZWNrRWxlbWVudHMpO1xuaGFyZGVuKGNoZWNrRWxlbWVudHMpO1xuXG4gICAgICAgY29uc3QgYXNzZXJ0RWxlbWVudHMgPSBlbGVtZW50cyA9PiB7XG4gIGNoZWNrRWxlbWVudHMoZWxlbWVudHMsIGFzc2VydENoZWNrZXIpO1xufTskaM2PX29uY2UuYXNzZXJ0RWxlbWVudHMoYXNzZXJ0RWxlbWVudHMpO1xuaGFyZGVuKGFzc2VydEVsZW1lbnRzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHBhcmFtIHtJdGVyYWJsZTxLPn0gZWxlbWVudHNMaXN0XG4gKi9cbiAgICAgICBjb25zdCBjb2VyY2VUb0VsZW1lbnRzID0gZWxlbWVudHNMaXN0ID0+IHtcbiAgY29uc3QgZWxlbWVudHMgPSBzb3J0QnlSYW5rKGVsZW1lbnRzTGlzdCwgY29tcGFyZUFudGlSYW5rKTtcbiAgYXNzZXJ0RWxlbWVudHMoZWxlbWVudHMpO1xuICByZXR1cm4gZWxlbWVudHM7XG59OyRozY9fb25jZS5jb2VyY2VUb0VsZW1lbnRzKGNvZXJjZVRvRWxlbWVudHMpO1xuaGFyZGVuKGNvZXJjZVRvRWxlbWVudHMpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPEs+fSBlbGVtZW50SXRlclxuICogQHJldHVybnMge0NvcHlTZXQ8Sz59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlU2V0T2ZFbGVtZW50cyA9IGVsZW1lbnRJdGVyID0+XG4gIG1ha2VUYWdnZWQoJ2NvcHlTZXQnLCBjb2VyY2VUb0VsZW1lbnRzKGVsZW1lbnRJdGVyKSk7JGjNj19vbmNlLm1ha2VTZXRPZkVsZW1lbnRzKG1ha2VTZXRPZkVsZW1lbnRzKTtcbmhhcmRlbihtYWtlU2V0T2ZFbGVtZW50cyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3NlcnROb0R1cGxpY2F0ZXMiOlsiYXNzZXJ0Tm9EdXBsaWNhdGVzIl0sImNoZWNrRWxlbWVudHMiOlsiY2hlY2tFbGVtZW50cyJdLCJhc3NlcnRFbGVtZW50cyI6WyJhc3NlcnRFbGVtZW50cyJdLCJjb2VyY2VUb0VsZW1lbnRzIjpbImNvZXJjZVRvRWxlbWVudHMiXSwibWFrZVNldE9mRWxlbWVudHMiOlsibWFrZVNldE9mRWxlbWVudHMiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA2zWaQMMiAADDIgAAOQAAAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMva2V5cy9rZXljb2xsZWN0aW9uLW9wZXJhdG9ycy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGVuZG8vY29tbW9uL21ha2UtaXRlcmF0b3IuanMiLCJAZW5kby9jb21tb24vbWFrZS1hcnJheS1pdGVyYXRvci5qcyIsIkBlbmRvL2Vycm9ycyJdLCJleHBvcnRzIjpbImdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzIiwibWFrZUNvbXBhcmVDb2xsZWN0aW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYXNzZXJ0UmFua1NvcnRlZCxjb21wYXJlQW50aVJhbmssbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQsc29ydEJ5UmFuayxtYWtlSXRlcmF0b3IsbWFrZUFycmF5SXRlcmF0b3IscSxGYWlsOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0UmFua1NvcnRlZFwiLFskaM2PX2EgPT4gKGFzc2VydFJhbmtTb3J0ZWQgPSAkaM2PX2EpXV0sW1wiY29tcGFyZUFudGlSYW5rXCIsWyRozY9fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjNj19hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsWyRozY9fYSA9PiAobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAkaM2PX2EpXV0sW1wic29ydEJ5UmFua1wiLFskaM2PX2EgPT4gKHNvcnRCeVJhbmsgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vbWFrZS1pdGVyYXRvci5qc1wiLCBbW1wibWFrZUl0ZXJhdG9yXCIsWyRozY9fYSA9PiAobWFrZUl0ZXJhdG9yID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL21ha2UtYXJyYXktaXRlcmF0b3IuanNcIiwgW1tcIm1ha2VBcnJheUl0ZXJhdG9yXCIsWyRozY9fYSA9PiAobWFrZUFycmF5SXRlcmF0b3IgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBSZWZpbmVzIGEgc2VxdWVuY2Ugb2YgZW50cmllcyB0aGF0IGlzIGFscmVhZHkgc29ydGVkIG92ZXIgaXRzIGtleXMgYnkgdGhlXG4gKiBgcmFua0NvbXBhcmVgIHByZW9yZGVyLCB3aGVyZSB0aGVyZSBtYXkgYmUgaW50ZXJuYWwgcnVucyB0aWVkIGZvciB0aGUgc2FtZVxuICogcmFuaywgaW50byBhbiBpdGVyYWJsZSB0aGF0IHJlc29sdmVzIHRob3NlIHRpZXMgdXNpbmcgYGZ1bGxDb21wYXJlYC5cbiAqXG4gKiBAdGVtcGxhdGUgW1Y9dW5rbm93bl1cbiAqIEBwYXJhbSB7QXJyYXk8W0tleSwgVl0+fSBlbnRyaWVzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSByYW5rQ29tcGFyZVxuICogQHBhcmFtIHtGdWxsQ29tcGFyZX0gZnVsbENvbXBhcmVcbiAqIEByZXR1cm5zIHtJdGVyYWJsZUl0ZXJhdG9yPFtLZXksIFZdPn1cbiAqL1xuY29uc3QgZ2VuZXJhdGVGdWxsU29ydGVkRW50cmllcyA9IChlbnRyaWVzLCByYW5rQ29tcGFyZSwgZnVsbENvbXBhcmUpID0+IHtcbiAgLyogQHRzLWV4cGVjdC1lcnJvciBYWFggS2V5IHR5cGVzKi9cbiAgYXNzZXJ0UmFua1NvcnRlZChlbnRyaWVzLCByYW5rQ29tcGFyZSk7XG4gIGNvbnN0IHsgbGVuZ3RoIH0gPSBlbnRyaWVzO1xuICBsZXQgaSA9IDA7XG4gIGxldCBzYW1lUmFua0l0ZXJhdG9yO1xuICByZXR1cm4gbWFrZUl0ZXJhdG9yKCgpID0+IHtcbiAgICBpZiAoc2FtZVJhbmtJdGVyYXRvcikge1xuICAgICAgY29uc3QgcmVzdWx0ID0gc2FtZVJhbmtJdGVyYXRvci5uZXh0KCk7XG4gICAgICBpZiAoIXJlc3VsdC5kb25lKSB7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICB9XG4gICAgICBzYW1lUmFua0l0ZXJhdG9yID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAoaSA8IGxlbmd0aCkge1xuICAgICAgY29uc3QgZW50cnkgPSBlbnRyaWVzW2ldO1xuICAgICAgLyogTG9vayBhaGVhZCBmb3Igc2FtZS1yYW5rIHRpZXMuKi9cbiAgICAgIGxldCBqID0gaSArIDE7XG4gICAgICB3aGlsZSAoaiA8IGxlbmd0aCAmJiByYW5rQ29tcGFyZShlbnRyeVswXSwgZW50cmllc1tqXVswXSkgPT09IDApIHtcbiAgICAgICAgaiArPSAxO1xuICAgICAgfVxuICAgICAgaWYgKGogPT09IGkgKyAxKSB7XG4gICAgICAgIC8qIE5vIHRpZXMgZm91bmQuKi9cbiAgICAgICAgaSA9IGo7XG4gICAgICAgIHJldHVybiBoYXJkZW4oeyBkb25lOiBmYWxzZSwgdmFsdWU6IGVudHJ5IH0pO1xuICAgICAgfVxuICAgICAgY29uc3QgdGllcyA9IGVudHJpZXMuc2xpY2UoaSwgaik7XG4gICAgICBpID0gajtcblxuICAgICAgLyogU29ydCB0aGUgdGllcyBieSBgZnVsbENvbXBhcmVgLCBlbmZvcmNlIGtleSB1bmlxdWVuZXNzLCBhbmQgZGVsZWdhdGUgdG8qL1xuICAgICAgLyogYSBzdWItaXRlcmF0b3IuKi9cbiAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgWFhYIEtleSB0eXBlcyovXG4gICAgICBjb25zdCBzb3J0ZWRUaWVzID0gc29ydEJ5UmFuayh0aWVzLCBmdWxsQ29tcGFyZSk7XG4gICAgICBmb3IgKGxldCBrID0gMTsgayA8IHNvcnRlZFRpZXMubGVuZ3RoOyBrICs9IDEpIHtcbiAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBYWFggS2V5IHR5cGVzKi9cbiAgICAgICAgY29uc3QgW2tleTBdID0gc29ydGVkVGllc1trIC0gMV07XG4gICAgICAgIGNvbnN0IFtrZXkxXSA9IHNvcnRlZFRpZXNba107XG4gICAgICAgIE1hdGguc2lnbihmdWxsQ29tcGFyZShrZXkwLCBrZXkxKSkgfHxcbiAgICAgICAgICBGYWlsYER1cGxpY2F0ZSBlbnRyeSBrZXk6ICR7a2V5MH1gO1xuICAgICAgfVxuICAgICAgc2FtZVJhbmtJdGVyYXRvciA9IG1ha2VBcnJheUl0ZXJhdG9yKHNvcnRlZFRpZXMpO1xuICAgICAgcmV0dXJuIHNhbWVSYW5rSXRlcmF0b3IubmV4dCgpO1xuICAgIH1cbiAgICByZXR1cm4gaGFyZGVuKHsgZG9uZTogdHJ1ZSwgdmFsdWU6IHVuZGVmaW5lZCB9KTtcbiAgfSk7XG59O1xuaGFyZGVuKGdlbmVyYXRlRnVsbFNvcnRlZEVudHJpZXMpO1xuXG4vKipcbiAqIFJldHVybnMgYW4gaXRlcmF0b3IgdGhhdCBtZXJnZXMgcmV2ZXJzZS1yYW5rLXNvcnRlZCBba2V5LCB2YWx1ZV0gZW50cmllcyBvZlxuICogdHdvIEtleUNvbGxlY3Rpb25zIGludG8gYSByZXZlcnNlLWZ1bGwtc29ydGVkIFtrZXksIHZhbHVlMSwgdmFsdWUyXSBlbnRyaWVzXG4gKiBieSB0aGUga2V5IHRoZXkgaGF2ZSBpbiBjb21tb24sIHJlcHJlc2VudGluZyB0aGUgdmFsdWUgZm9yIGFuIGFic2VudCBlbnRyeSBpblxuICogZWl0aGVyIGNvbGxlY3Rpb24gYXMgYGFic2VudFZhbHVlYC5cbiAqXG4gKiBAdGVtcGxhdGUgW0M9S2V5Q29sbGVjdGlvbl1cbiAqIEB0ZW1wbGF0ZSBbVj11bmtub3duXVxuICogQHBhcmFtIHtDfSBjMVxuICogQHBhcmFtIHtDfSBjMlxuICogQHBhcmFtIHsoY29sbGVjdGlvbjogQykgPT4gQXJyYXk8W0tleSwgVl0+fSBnZXRFbnRyaWVzXG4gKiBAcGFyYW0ge2FueX0gYWJzZW50VmFsdWVcbiAqIEByZXR1cm5zIHtJdGVyYWJsZUl0ZXJhdG9yPFtLZXksIFYgfCBhYnNlbnRWYWx1ZSwgViB8IGFic2VudFZhbHVlXT59XG4gKi9cbiAgICAgICBjb25zdCBnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyA9IChcbiAgYzEsXG4gIGMyLFxuICBnZXRFbnRyaWVzLFxuICBhYnNlbnRWYWx1ZSxcbikgPT4ge1xuICBjb25zdCBlMSA9IGdldEVudHJpZXMoYzEpO1xuICBjb25zdCBlMiA9IGdldEVudHJpZXMoYzIpO1xuXG4gIC8qIEVzdGFibGlzaCBhIGhpc3RvcnktZGVwZW5kZW50IGNvbXBhcmlzb24gc2NvcGVkIHRvIHRoZSBhY3RpdmUgaW52b2NhdGlvbiovXG4gIC8qIGFuZCB1c2UgaXQgdG8gbWFwIHJldmVyc2UtcHJlb3JkZXJlZCBlbnRyaWVzIGludG8gYW4gaXRlcmF0b3Igd2l0aCBhKi9cbiAgLyogbmFycm93ZXIgdG90YWwgb3JkZXIuKi9cbiAgY29uc3QgZnVsbENvbXBhcmUgPSBtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuICBjb25zdCB4ID0gZ2VuZXJhdGVGdWxsU29ydGVkRW50cmllcyhlMSwgY29tcGFyZUFudGlSYW5rLCBmdWxsQ29tcGFyZSk7XG4gIGNvbnN0IHkgPSBnZW5lcmF0ZUZ1bGxTb3J0ZWRFbnRyaWVzKGUyLCBjb21wYXJlQW50aVJhbmssIGZ1bGxDb21wYXJlKTtcblxuICAvKiBNYWludGFpbiBhIHNpbmdsZS1yZXN1bHQgeyBkb25lLCBrZXksIHZhbHVlIH0gYnVmZmVyIGZvciBlYWNoIGl0ZXJhdG9yKi9cbiAgLyogc28gdGhleSBjYW4gYmUgbWVyZ2VkLiovXG4gIGxldCB4RG9uZTtcbiAgbGV0IHhLZXk7XG4gIGxldCB4VmFsdWU7XG4gIGxldCB5RG9uZTtcbiAgbGV0IHlLZXk7XG4gIGxldCB5VmFsdWU7XG4gIGNvbnN0IG5vbkVudHJ5ID0gW3VuZGVmaW5lZCwgdW5kZWZpbmVkXTtcbiAgY29uc3QgbmV4dFggPSAoKSA9PiB7XG4gICAgIXhEb25lIHx8IEZhaWxgSW50ZXJuYWw6IG5leHRYIG11c3Qgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuICAgIGNvbnN0IHJlc3VsdCA9IHhWYWx1ZTtcbiAgICAoeyBkb25lOiB4RG9uZSwgdmFsdWU6IFt4S2V5LCB4VmFsdWVdID0gbm9uRW50cnkgfSA9IHgubmV4dCgpKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuICBuZXh0WCgpO1xuICBjb25zdCBuZXh0WSA9ICgpID0+IHtcbiAgICAheURvbmUgfHwgRmFpbGBJbnRlcm5hbDogbmV4dFkgbXVzdCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4gICAgY29uc3QgcmVzdWx0ID0geVZhbHVlO1xuICAgICh7IGRvbmU6IHlEb25lLCB2YWx1ZTogW3lLZXksIHlWYWx1ZV0gPSBub25FbnRyeSB9ID0geS5uZXh0KCkpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIG5leHRZKCk7XG4gIHJldHVybiBtYWtlSXRlcmF0b3IoKCkgPT4ge1xuICAgIGxldCBkb25lID0gZmFsc2U7XG4gICAgLyoqIEB0eXBlIHtbS2V5LCBWIHwgYWJzZW50VmFsdWUsIFYgfCBhYnNlbnRWYWx1ZV19ICovXG4gICAgbGV0IHZhbHVlO1xuICAgIGlmICh4RG9uZSAmJiB5RG9uZSkge1xuICAgICAgZG9uZSA9IHRydWU7XG4gICAgICB2YWx1ZSA9IFt1bmRlZmluZWQsIGFic2VudFZhbHVlLCBhYnNlbnRWYWx1ZV07XG4gICAgfSBlbHNlIGlmICh4RG9uZSkge1xuICAgICAgdmFsdWUgPSBbeUtleSwgYWJzZW50VmFsdWUsIG5leHRZKCldO1xuICAgIH0gZWxzZSBpZiAoeURvbmUpIHtcbiAgICAgIHZhbHVlID0gW3hLZXksIG5leHRYKCksIGFic2VudFZhbHVlXTtcbiAgICB9IGVsc2Uge1xuICAgICAgLyogQ29tcGFyZSB0aGUga2V5cyB0byBkZXRlcm1pbmUgaWYgd2Ugc2hvdWxkIHJldHVybiBhIG1lcmdlZCByZXN1bHQqL1xuICAgICAgLyogb3IgYSBvbmUtc2lkZWQgcmVzdWx0LiovXG4gICAgICBjb25zdCBjb21wID0gZnVsbENvbXBhcmUoeEtleSwgeUtleSk7XG4gICAgICBpZiAoY29tcCA9PT0gMCkge1xuICAgICAgICB2YWx1ZSA9IFt4S2V5LCBuZXh0WCgpLCBuZXh0WSgpXTtcbiAgICAgIH0gZWxzZSBpZiAoY29tcCA8IDApIHtcbiAgICAgICAgdmFsdWUgPSBbeEtleSwgbmV4dFgoKSwgYWJzZW50VmFsdWVdO1xuICAgICAgfSBlbHNlIGlmIChjb21wID4gMCkge1xuICAgICAgICB2YWx1ZSA9IFt5S2V5LCBhYnNlbnRWYWx1ZSwgbmV4dFkoKV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBGYWlsYFVuZXhwZWN0ZWQga2V5IGNvbXBhcmlzb24gJHtxKGNvbXApfSBmb3IgJHt4S2V5fSB2cyAke3lLZXl9YDtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGhhcmRlbih7IGRvbmUsIHZhbHVlIH0pO1xuICB9KTtcbn07JGjNj19vbmNlLmdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzKGdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzKTtcbmhhcmRlbihnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyk7XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIGZvciBjb21wYXJpbmcgdHdvIEtleUNvbGxlY3Rpb25zIG9mIHRoZSBzYW1lIHR5cGUgdXNpbmdcbiAqIHRoZSBwcm92aWRlZCBlbnRyaWVzIGZhY3RvcnkgYW5kIHNhbWUta2V5IGVudHJ5IHZhbHVlIGNvbXBhcmF0b3IgKHdoZXJlIHRoZVxuICogdmFsdWUgZm9yIGFuIGFic2VudCBlbnRyeSBpbiBvbmUgY29sbGVjdGlvbiBpcyBgYWJzZW50VmFsdWVgKS5cbiAqXG4gKiBJZiB0aGUgY29ycmVzcG9uZGluZyBlbnRyaWVzIGZvciBhbnkgc2luZ2xlIGtleSBhcmUgaW5jb21wYXJhYmxlIG9yIHRoZVxuICogY29tcGFyaXNvbiByZXN1bHQgaGFzIHRoZSBvcHBvc2l0ZSBzaWduIG9mIHRoZSByZXN1bHQgZm9yIGEgZGlmZmVyZW50IGtleSxcbiAqIHRoZW4gdGhlIEtleUNvbGxlY3Rpb25zIGFyZSBpbmNvbXBhcmFibGUuIE90aGVyd2lzZSwgdGhlIGNvbGxlY3Rpb25zIGNvbXBhcmVcbiAqIGJ5IHRoZSByZXN1bHQgb2YgYW55IG5vbi1lcXVhbCBlbnRyeSBjb21wYXJpc29uLCBvciBjb21wYXJlIGVxdWFsIGlmIHRoZXJlIGlzXG4gKiBubyBub24tZXF1YWwgZW50cnkgY29tcGFyaXNvbiByZXN1bHQuXG4gKiBGb3IgZXhhbXBsZSwgZ2l2ZW4gQ29weUJhZ3MgWCBhbmQgWSBhbmQgYSB2YWx1ZSBjb21wYXJhdG9yIHRoYXQgZ29lcyBieSBjb3VudFxuICogKGRlZmF1bHRpbmcgYWJzZW50IGtleXMgdG8gYSBjb3VudCBvZiAwKSwgWCBpcyBzbWFsbGVyIHRoYW4gWSAoYHJlc3VsdCA8IDBgKVxuICogaWZmIHRoZXJlIGFyZSBubyBrZXlzIGluIFggdGhhdCBhcmUgZWl0aGVyIGFic2VudCBmcm9tIFlcbiAqIChgY29tcGFyZVZhbHVlcyh4Q291bnQsIGFic2VudFZhbHVlKSA+IDBgKSBvciBwcmVzZW50IGluIFkgd2l0aCBhIGxvd2VyIGNvdW50XG4gKiAoYGNvbXBhcmVWYWx1ZXMoeENvdW50LCB5Q291bnQpID4gMGApIEFORCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUga2V5IGluIFkgdGhhdFxuICogaXMgZWl0aGVyIGFic2VudCBmcm9tIFggKGBjb21wYXJlVmFsdWVzKGFic2VudFZhbHVlLCB5Q291bnQpIDwgMGApIG9yIHByZXNlbnRcbiAqIHdpdGggYSBsb3dlciBjb3VudCAoYGNvbXBhcmVWYWx1ZXMoeENvdW50LCB5Q291bnQpIDwgMGApLlxuICpcbiAqIFRoaXMgY2FuIGJlIGdlbmVyYWxpemVkIHRvIHZpcnR1YWwgY29sbGVjdGlvbnMgaW4gdGhlIGZ1dHVyZSBieSByZXBsYWNpbmdcbiAqIGBnZXRFbnRyaWVzID0+IEFycmF5YCB3aXRoIGBnZW5lcmF0ZUVudHJpZXMgPT4gSXRlcmFibGVJdGVyYXRvcmAuXG4gKlxuICogQHRlbXBsYXRlIFtDPUtleUNvbGxlY3Rpb25dXG4gKiBAdGVtcGxhdGUgW1Y9dW5rbm93bl1cbiAqIEBwYXJhbSB7KGNvbGxlY3Rpb246IEMpID0+IEFycmF5PFtLZXksIFZdPn0gZ2V0RW50cmllc1xuICogQHBhcmFtIHtWfSBhYnNlbnRWYWx1ZVxuICogQHBhcmFtIHtLZXlDb21wYXJlfSBjb21wYXJlVmFsdWVzXG4gKiBAcmV0dXJucyB7KGxlZnQ6IEMsIHJpZ2h0OiBDKSA9PiBLZXlDb21wYXJpc29ufVxuICovXG4gICAgICAgY29uc3QgbWFrZUNvbXBhcmVDb2xsZWN0aW9uID0gKGdldEVudHJpZXMsIGFic2VudFZhbHVlLCBjb21wYXJlVmFsdWVzKSA9PlxuICBoYXJkZW4oKGxlZnQsIHJpZ2h0KSA9PiB7XG4gICAgY29uc3QgbWVyZ2VkID0gZ2VuZXJhdGVDb2xsZWN0aW9uUGFpckVudHJpZXMoXG4gICAgICBsZWZ0LFxuICAgICAgcmlnaHQsXG4gICAgICBnZXRFbnRyaWVzLFxuICAgICAgYWJzZW50VmFsdWUsXG4gICAgKTtcbiAgICBsZXQgbGVmdElzQmlnZ2VyID0gZmFsc2U7XG4gICAgbGV0IHJpZ2h0SXNCaWdnZXIgPSBmYWxzZTtcbiAgICBmb3IgKGNvbnN0IFtfa2V5LCBsZWZ0VmFsdWUsIHJpZ2h0VmFsdWVdIG9mIG1lcmdlZCkge1xuICAgICAgY29uc3QgY29tcCA9IGNvbXBhcmVWYWx1ZXMobGVmdFZhbHVlLCByaWdodFZhbHVlKTtcbiAgICAgIGlmIChjb21wID09PSAwKSB7XG4gICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb250aW51ZSovXG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfSBlbHNlIGlmIChjb21wIDwgMCkge1xuICAgICAgICAvKiBCYXNlZCBvbiB0aGlzIGtleSwgbGVmdCA8IHJpZ2h0LiovXG4gICAgICAgIHJpZ2h0SXNCaWdnZXIgPSB0cnVlO1xuICAgICAgfSBlbHNlIGlmIChjb21wID4gMCkge1xuICAgICAgICAvKiBCYXNlZCBvbiB0aGlzIGtleSwgbGVmdCA+IHJpZ2h0LiovXG4gICAgICAgIGxlZnRJc0JpZ2dlciA9IHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBOdW1iZXIuaXNOYU4oY29tcCkgfHxcbiAgICAgICAgICAvKiBwcmV0dGllci1pZ25vcmUqL1xuICAgICAgICAgIEZhaWxgVW5leHBlY3RlZCB2YWx1ZSBjb21wYXJpc29uICR7cShjb21wKX0gZm9yICR7bGVmdFZhbHVlfSB2cyAke3JpZ2h0VmFsdWV9YDtcbiAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgIH1cbiAgICAgIGlmIChsZWZ0SXNCaWdnZXIgJiYgcmlnaHRJc0JpZ2dlcikge1xuICAgICAgICByZXR1cm4gTmFOO1xuICAgICAgfVxuICAgIH1cbiAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnkqL1xuICAgIHJldHVybiBsZWZ0SXNCaWdnZXIgPyAxIDogcmlnaHRJc0JpZ2dlciA/IC0xIDogMDtcbiAgfSk7JGjNj19vbmNlLm1ha2VDb21wYXJlQ29sbGVjdGlvbihtYWtlQ29tcGFyZUNvbGxlY3Rpb24pO1xuaGFyZGVuKG1ha2VDb21wYXJlQ29sbGVjdGlvbik7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyI6WyJnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyJdLCJtYWtlQ29tcGFyZUNvbGxlY3Rpb24iOlsibWFrZUNvbXBhcmVDb2xsZWN0aW9uIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJnEOAFXKAAAVygAADUAAABAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGVuZG8vZXJyb3JzIiwiLi9jb3B5QmFnLmpzIl0sImV4cG9ydHMiOlsiYmFnRGlzam9pbnRTdWJ0cmFjdCIsImJhZ0ludGVyc2VjdGlvbiIsImJhZ0lzRGlzam9pbnQiLCJiYWdJc1N1cGVyYmFnIiwiYmFnVW5pb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBhc3NlcnRSYW5rU29ydGVkLGNvbXBhcmVBbnRpUmFuayxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rLHEsRmFpbCxhc3NlcnROb0R1cGxpY2F0ZUtleXMsbWFrZUJhZ09mRW50cmllczskaM2PX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydFJhbmtTb3J0ZWRcIixbJGjNj19hID0+IChhc3NlcnRSYW5rU29ydGVkID0gJGjNj19hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLFskaM2PX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRozY9fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLFskaM2PX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjNj19hKV1dLFtcInNvcnRCeVJhbmtcIixbJGjNj19hID0+IChzb3J0QnlSYW5rID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXV1dLFtcIi4vY29weUJhZy5qc1wiLCBbW1wiYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzXCIsWyRozY9fYSA9PiAoYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzID0gJGjNj19hKV1dLFtcIm1ha2VCYWdPZkVudHJpZXNcIixbJGjNj19hID0+IChtYWtlQmFnT2ZFbnRyaWVzID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBpbXBvcnQge0Z1bGxDb21wYXJlLCBSYW5rQ29tcGFyZX0gZnJvbSAnQGVuZG8vbWFyc2hhbCdcbiAqIEBpbXBvcnQge0tleX0gZnJvbSAnLi4vdHlwZXMuanMnXG4gKi9cblxuLyogQmFzZWQgb24gbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcywgYnV0IGFsdGVyZWQgZm9yIHRoZSBiYWcgcmVwcmVzZW50YXRpb24uKi9cbi8qIFRPRE8gc2hhcmUgbW9yZSBjb2RlIHdpdGggdGhhdCBmaWxlIGFuZCBrZXljb2xsZWN0aW9uLW9wZXJhdG9ycy5qcy4qL1xuXG4vKipcbiAqIEFzc2VydHMgdGhhdCBgYmFnRW50cmllc2AgaXMgYWxyZWFkeSByYW5rIHNvcnRlZCBieSBgcmFua0NvbXBhcmVgLCB3aGVyZVxuICogdGhlcmVcbiAqIG1heSBiZSBjb250aWd1b3VzIHJlZ2lvbnMgb2YgYmFnRW50cmllcyB3aG9zZSBrZXlzIGFyZSB0aWVkIGZvciB0aGUgc2FtZVxuICogcmFuay5cbiAqIFJldHVybnMgYW4gaXRlcmFibGUgdGhhdCB3aWxsIGVudW1lcmF0ZSBhbGwgdGhlIGJhZ0VudHJpZXMgaW4gb3JkZXJcbiAqIGFjY29yZGluZyB0byBgZnVsbE9yZGVyYCwgd2hpY2ggc2hvdWxkIGRpZmZlciBmcm9tIGByYW5rT3JkZXJgIG9ubHlcbiAqIGJ5IGJlaW5nIG1vcmUgcHJlY2lzZS5cbiAqXG4gKiBUaGlzIHNob3VsZCBiZSBlcXVpdmFsZW50IHRvIHJlc29ydGluZyB0aGUgZW50aXJlIGBiYWdFbnRyaWVzYCBhcnJheVxuICogYWNjb3JkaW5nXG4gKiB0byBgZnVsbE9yZGVyYC4gSG93ZXZlciwgaXQgb3B0aW1pemVzIGZvciB0aGUgY2FzZSB3aGVyZSB0aGVzZSBjb250aWd1b3VzXG4gKiBydW5zIHRoYXQgbmVlZCB0byBiZSByZXNvcnRlZCBhcmUgZWl0aGVyIGFic2VudCBvciBzbWFsbC5cbiAqXG4gKiBAdGVtcGxhdGUge0tleX0gVFxuICogQHBhcmFtIHtbVCxiaWdpbnRdW119IGJhZ0VudHJpZXNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IHJhbmtDb21wYXJlXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlfSBmdWxsQ29tcGFyZVxuICogQHJldHVybnMge0l0ZXJhYmxlPFtULGJpZ2ludF0+fVxuICovXG5jb25zdCBiYWdXaW5kb3dSZXNvcnQgPSAoYmFnRW50cmllcywgcmFua0NvbXBhcmUsIGZ1bGxDb21wYXJlKSA9PiB7XG4gIGFzc2VydFJhbmtTb3J0ZWQoYmFnRW50cmllcywgcmFua0NvbXBhcmUpO1xuICBjb25zdCB7IGxlbmd0aCB9ID0gYmFnRW50cmllcztcbiAgbGV0IGkgPSAwO1xuICBsZXQgb3B0SW5uZXJJdGVyYXRvcjtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+XG4gICAgICBoYXJkZW4oe1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgaWYgKG9wdElubmVySXRlcmF0b3IpIHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG9wdElubmVySXRlcmF0b3IubmV4dCgpO1xuICAgICAgICAgICAgaWYgKHJlc3VsdC5kb25lKSB7XG4gICAgICAgICAgICAgIG9wdElubmVySXRlcmF0b3IgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgIC8qIGZhbGwgdGhyb3VnaCovXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaSA8IGxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgZW50cnkgPSBiYWdFbnRyaWVzW2ldO1xuICAgICAgICAgICAgbGV0IGogPSBpICsgMTtcbiAgICAgICAgICAgIHdoaWxlIChcbiAgICAgICAgICAgICAgaiA8IGxlbmd0aCAmJlxuICAgICAgICAgICAgICByYW5rQ29tcGFyZShlbnRyeVswXSwgYmFnRW50cmllc1tqXVswXSkgPT09IDBcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICBqICs9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaiA9PT0gaSArIDEpIHtcbiAgICAgICAgICAgICAgaSA9IGo7XG4gICAgICAgICAgICAgIHJldHVybiBoYXJkZW4oeyBkb25lOiBmYWxzZSwgdmFsdWU6IGVudHJ5IH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3Qgc2ltaWxhclJ1biA9IGJhZ0VudHJpZXMuc2xpY2UoaSwgaik7XG4gICAgICAgICAgICBpID0gajtcbiAgICAgICAgICAgIGNvbnN0IHJlc29ydGVkID0gc29ydEJ5UmFuayhzaW1pbGFyUnVuLCBmdWxsQ29tcGFyZSk7XG4gICAgICAgICAgICAvKiBQcm92aWRpbmcgdGhlIHNhbWUgYGZ1bGxDb21wYXJlYCBzaG91bGQgY2F1c2UgYSBtZW1vIGhpdCovXG4gICAgICAgICAgICAvKiB3aXRoaW4gYGFzc2VydE5vRHVwbGljYXRlc2AgZW5hYmxpbmcgaXQgdG8gYXZvaWQgYSovXG4gICAgICAgICAgICAvKiByZWR1bmRhbnQgcmVzb3J0aW5nLiovXG4gICAgICAgICAgICBhc3NlcnROb0R1cGxpY2F0ZUtleXMocmVzb3J0ZWQsIGZ1bGxDb21wYXJlKTtcbiAgICAgICAgICAgIC8qIFRoaXMgaXMgdGhlIHJhdyBKUyBhcnJheSBpdGVyYXRvciB3aG9zZSBgLm5leHQoKWAgbWV0aG9kKi9cbiAgICAgICAgICAgIC8qIGRvZXMgbm90IGhhcmRlbiB0aGUgSXRlcmF0b3JSZXN1bHQsIGluIHZpb2xhdGlvbiBvZiBvdXIqL1xuICAgICAgICAgICAgLyogY29udmVudGlvbnMuIEZpeGluZyB0aGlzIGlzIGV4cGVuc2l2ZSBhbmQgSSdtIGNvbmZpZGVudCB0aGUqL1xuICAgICAgICAgICAgLyogdW5mcm96ZW4gdmFsdWUgZG9lcyBub3QgZXNjYXBlIHRoaXMgZmlsZSwgc28gSSdtIGxlYXZpbmcgdGhpcyovXG4gICAgICAgICAgICAvKiBhcyBpcy4qL1xuICAgICAgICAgICAgb3B0SW5uZXJJdGVyYXRvciA9IHJlc29ydGVkW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICAgICAgICAgIHJldHVybiBvcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGhhcmRlbih7IGRvbmU6IHRydWUsIHZhbHVlOiBbbnVsbCwgMG5dIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICB9KTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhbiBpdGVyYWJsZSB3aG9zZSBpdGVyYXRpb24gcmVzdWx0cyBhcmUgW2tleSwgeENvdW50LCB5Q291bnRdIHR1cGxlc1xuICogcmVwcmVzZW50aW5nIHRoZSBuZXh0IGtleSBpbiB0aGUgbG9jYWwgZnVsbCBvcmRlciwgYXMgd2VsbCBhcyBob3cgbWFueVxuICogdGltZXMgaXQgb2NjdXJyZWQgaW4gdGhlIHggaW5wdXQgaXRlcmF0b3IgYW5kIHRoZSB5IGlucHV0IGl0ZXJhdG9yLlxuICpcbiAqIEZvciBzZXRzLCB0aGVzZSBjb3VudHMgYXJlIGFsd2F5cyAwIG9yIDEsIGJ1dCB0aGlzIHJlcHJlc2VudGF0aW9uXG4gKiBnZW5lcmFsaXplcyBuaWNlbHkgZm9yIGJhZ3MuXG4gKlxuICogQHRlbXBsYXRlIHtLZXl9IFRcbiAqIEBwYXJhbSB7W1QsYmlnaW50XVtdfSB4YmFnRW50cmllc1xuICogQHBhcmFtIHtbVCxiaWdpbnRdW119IHliYWdFbnRyaWVzXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fVxuICovXG5jb25zdCBtZXJnZSA9ICh4YmFnRW50cmllcywgeWJhZ0VudHJpZXMpID0+IHtcbiAgLyogVGhpcyBmdWxsT3JkZXIgY29udGFpbnMgaGlzdG9yeSBkZXBlbmRlbnQgc3RhdGUuIEl0IGlzIHNwZWNpZmljKi9cbiAgLyogdG8gdGhpcyBvbmUgYG1lcmdlYCBjYWxsIGFuZCBkb2VzIG5vdCBzdXJ2aXZlIGl0LiovXG4gIGNvbnN0IGZ1bGxDb21wYXJlID0gbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcblxuICBjb25zdCB4cyA9IGJhZ1dpbmRvd1Jlc29ydCh4YmFnRW50cmllcywgY29tcGFyZUFudGlSYW5rLCBmdWxsQ29tcGFyZSk7XG4gIGNvbnN0IHlzID0gYmFnV2luZG93UmVzb3J0KHliYWdFbnRyaWVzLCBjb21wYXJlQW50aVJhbmssIGZ1bGxDb21wYXJlKTtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgIC8qIFRoZXNlIHNpeCBgbGV0YCB2YXJpYWJsZXMgYXJlIGJ1ZmZlcmluZyBvbmUgYWhlYWQgZnJvbSB0aGUgdW5kZXJseWluZyovXG4gICAgICAvKiBpdGVyYXRvcnMuIEVhY2ggaXRlcmF0aW9uIHJlcG9ydHMgb25lIG9yIHRoZSBvdGhlciBvciBib3RoLCBhbmQqL1xuICAgICAgLyogdGhlbiByZWZpbGxzIHRoZSBidWZmZXJzIG9mIHRob3NlIGl0IGFkdmFuY2VkLiovXG4gICAgICAvKiogQHR5cGUge1R9ICovXG4gICAgICBsZXQgeDtcbiAgICAgIGxldCB4YztcbiAgICAgIGxldCB4RG9uZTtcbiAgICAgIC8qKiBAdHlwZSB7VH0gKi9cbiAgICAgIGxldCB5O1xuICAgICAgbGV0IHljO1xuICAgICAgbGV0IHlEb25lO1xuXG4gICAgICBjb25zdCB4aSA9IHhzW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICAgIGNvbnN0IG5leHRYID0gKCkgPT4ge1xuICAgICAgICAheERvbmUgfHwgRmFpbGBJbnRlcm5hbDogbmV4dFggc2hvdWxkIG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbiAgICAgICAgKHtcbiAgICAgICAgICBkb25lOiB4RG9uZSxcbiAgICAgICAgICB2YWx1ZTogW3gsIHhjXSxcbiAgICAgICAgfSA9IHhpLm5leHQoKSk7XG4gICAgICB9O1xuICAgICAgbmV4dFgoKTtcblxuICAgICAgY29uc3QgeWkgPSB5c1tTeW1ib2wuaXRlcmF0b3JdKCk7XG4gICAgICBjb25zdCBuZXh0WSA9ICgpID0+IHtcbiAgICAgICAgIXlEb25lIHx8IEZhaWxgSW50ZXJuYWw6IG5leHRZIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4gICAgICAgICh7XG4gICAgICAgICAgZG9uZTogeURvbmUsXG4gICAgICAgICAgdmFsdWU6IFt5LCB5Y10sXG4gICAgICAgIH0gPSB5aS5uZXh0KCkpO1xuICAgICAgfTtcbiAgICAgIG5leHRZKCk7XG5cbiAgICAgIHJldHVybiBoYXJkZW4oe1xuICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgLyoqIEB0eXBlIHtib29sZWFufSAqL1xuICAgICAgICAgIGxldCBkb25lID0gZmFsc2U7XG4gICAgICAgICAgLyoqIEB0eXBlIHtbVCxiaWdpbnQsYmlnaW50XX0gKi9cbiAgICAgICAgICBsZXQgdmFsdWU7XG4gICAgICAgICAgaWYgKHhEb25lICYmIHlEb25lKSB7XG4gICAgICAgICAgICBkb25lID0gdHJ1ZTtcbiAgICAgICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgQmVjYXVzZSB0aGUgdGVybWluYXRpbmcgdmFsdWUgZG9lcyBub3QgbWF0dGVyKi9cbiAgICAgICAgICAgIHZhbHVlID0gW251bGwsIDBuLCAwbl07XG4gICAgICAgICAgfSBlbHNlIGlmICh4RG9uZSkge1xuICAgICAgICAgICAgLyogb25seSB5cyBhcmUgbGVmdCovXG4gICAgICAgICAgICB2YWx1ZSA9IFt5LCAwbiwgeWNdO1xuICAgICAgICAgICAgbmV4dFkoKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHlEb25lKSB7XG4gICAgICAgICAgICAvKiBvbmx5IHhzIGFyZSBsZWZ0Ki9cbiAgICAgICAgICAgIHZhbHVlID0gW3gsIHhjLCAwbl07XG4gICAgICAgICAgICBuZXh0WCgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBjb21wID0gZnVsbENvbXBhcmUoeCwgeSk7XG4gICAgICAgICAgICBpZiAoY29tcCA9PT0gMCkge1xuICAgICAgICAgICAgICAvKiB4IGFuZCB5IGFyZSBlcXVpdmFsZW50LCBzbyByZXBvcnQgYm90aCovXG4gICAgICAgICAgICAgIHZhbHVlID0gW3gsIHhjLCB5Y107XG4gICAgICAgICAgICAgIG5leHRYKCk7XG4gICAgICAgICAgICAgIG5leHRZKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGNvbXAgPCAwKSB7XG4gICAgICAgICAgICAgIC8qIHggaXMgZWFybGllciwgc28gcmVwb3J0IGl0Ki9cbiAgICAgICAgICAgICAgdmFsdWUgPSBbeCwgeGMsIDBuXTtcbiAgICAgICAgICAgICAgbmV4dFgoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8qIHkgaXMgZWFybGllciwgc28gcmVwb3J0IGl0Ki9cbiAgICAgICAgICAgICAgY29tcCA+IDAgfHwgRmFpbGBJbnRlcm5hbDogVW5leHBlY3RlZCBjb21wICR7cShjb21wKX1gO1xuICAgICAgICAgICAgICB2YWx1ZSA9IFt5LCAwbiwgeWNdO1xuICAgICAgICAgICAgICBuZXh0WSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gaGFyZGVuKHsgZG9uZSwgdmFsdWUgfSk7XG4gICAgICAgIH0sXG4gICAgICB9KTtcbiAgICB9LFxuICB9KTtcbn07XG5oYXJkZW4obWVyZ2UpO1xuXG4vKiBXZSBzaG91bGQgYmUgYWJsZSB0byB1c2UgdGhpcyBmb3IgaXRlcklzU3VwZXJzZXQgYXMgd2VsbC4qL1xuLyogVGhlIGdlbmVyYWxpemF0aW9uIGlzIGZyZWUuKi9cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBiYWdJdGVySXNTdXBlcmJhZyA9IHh5aSA9PiB7XG4gIGZvciAoY29uc3QgW19tLCB4YywgeWNdIG9mIHh5aSkge1xuICAgIGlmICh4YyA8IHljKSB7XG4gICAgICAvKiBzb21ldGhpbmcgaW4geSBpcyBub3QgaW4geCwgc28geCBpcyBub3QgYSBzdXBlcmJhZyBvZiB5Ki9cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHRydWU7XG59O1xuXG4vKiBXZSBzaG91bGQgYmUgYWJsZSB0byB1c2UgdGhpcyBmb3IgaXRlcklzRGlzam9pbnQgYXMgd2VsbC4qL1xuLyogVGhlIGNvZGUgaXMgaWRlbnRpY2FsLiovXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgYmFnSXRlcklzRGlzam9pbnQgPSB4eWkgPT4ge1xuICBmb3IgKGNvbnN0IFtfbSwgeGMsIHljXSBvZiB4eWkpIHtcbiAgICBpZiAoeGMgPj0gMW4gJiYgeWMgPj0gMW4pIHtcbiAgICAgIC8qIFNvbWV0aGluZyBpbiBib3RoLCBzbyBub3QgZGlzam9pbnQqL1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7W1QsYmlnaW50LGJpZ2ludF1bXX0geHlpXG4gKiBAcmV0dXJucyB7W1QsYmlnaW50XVtdfVxuICovXG5jb25zdCBiYWdJdGVyVW5pb24gPSB4eWkgPT4ge1xuICAvKiogQHR5cGUge1tULGJpZ2ludF1bXX0gKi9cbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGZvciAoY29uc3QgW20sIHhjLCB5Y10gb2YgeHlpKSB7XG4gICAgcmVzdWx0LnB1c2goW20sIHhjICsgeWNdKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge1tULGJpZ2ludF1bXX1cbiAqL1xuY29uc3QgYmFnSXRlckludGVyc2VjdGlvbiA9IHh5aSA9PiB7XG4gIC8qKiBAdHlwZSB7W1QsYmlnaW50XVtdfSAqL1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCBbbSwgeGMsIHljXSBvZiB4eWkpIHtcbiAgICBjb25zdCBtYyA9IHhjIDw9IHljID8geGMgOiB5YztcbiAgICByZXN1bHQucHVzaChbbSwgbWNdKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge1tULGJpZ2ludF1bXX1cbiAqL1xuY29uc3QgYmFnSXRlckRpc2pvaW50U3VidHJhY3QgPSB4eWkgPT4ge1xuICAvKiogQHR5cGUge1tULGJpZ2ludF1bXX0gKi9cbiAgY29uc3QgcmVzdWx0ID0gW107XG4gIGZvciAoY29uc3QgW20sIHhjLCB5Y10gb2YgeHlpKSB7XG4gICAgY29uc3QgbWMgPSB4YyAtIHljO1xuICAgIG1jID49IDBuIHx8IEZhaWxgcmlnaHQgZWxlbWVudCAke219IHdhcyBub3QgaW4gbGVmdGA7XG4gICAgaWYgKG1jID49IDFuKSB7XG4gICAgICAvKiB0aGUgeCB3YXMgbm90IGluIHkqL1xuICAgICAgcmVzdWx0LnB1c2goW20sIG1jXSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5jb25zdCBtZXJnZWlmeSA9IGJhZ0l0ZXJPcCA9PiAoeGJhZ0VudHJpZXMsIHliYWdFbnRyaWVzKSA9PlxuICBiYWdJdGVyT3AobWVyZ2UoeGJhZ0VudHJpZXMsIHliYWdFbnRyaWVzKSk7XG5cbmNvbnN0IGJhZ0VudHJpZXNJc1N1cGVyYmFnID0gbWVyZ2VpZnkoYmFnSXRlcklzU3VwZXJiYWcpO1xuY29uc3QgYmFnRW50cmllc0lzRGlzam9pbnQgPSBtZXJnZWlmeShiYWdJdGVySXNEaXNqb2ludCk7XG5jb25zdCBiYWdFbnRyaWVzVW5pb24gPSBtZXJnZWlmeShiYWdJdGVyVW5pb24pO1xuY29uc3QgYmFnRW50cmllc0ludGVyc2VjdGlvbiA9IG1lcmdlaWZ5KGJhZ0l0ZXJJbnRlcnNlY3Rpb24pO1xuY29uc3QgYmFnRW50cmllc0Rpc2pvaW50U3VidHJhY3QgPSBtZXJnZWlmeShiYWdJdGVyRGlzam9pbnRTdWJ0cmFjdCk7XG5cbmNvbnN0IHJhd0JhZ2lmeSA9IGJhZ0VudHJpZXNPcCA9PiAoeGJhZywgeWJhZykgPT5cbiAgYmFnRW50cmllc09wKHhiYWcucGF5bG9hZCwgeWJhZy5wYXlsb2FkKTtcblxuY29uc3QgYmFnaWZ5ID0gYmFnRW50cmllc09wID0+ICh4YmFnLCB5YmFnKSA9PlxuICBtYWtlQmFnT2ZFbnRyaWVzKGJhZ0VudHJpZXNPcCh4YmFnLnBheWxvYWQsIHliYWcucGF5bG9hZCkpO1xuXG4gICAgICAgY29uc3QgYmFnSXNTdXBlcmJhZyA9IHJhd0JhZ2lmeShiYWdFbnRyaWVzSXNTdXBlcmJhZyk7JGjNj19vbmNlLmJhZ0lzU3VwZXJiYWcoYmFnSXNTdXBlcmJhZyk7XG4gICAgICAgY29uc3QgYmFnSXNEaXNqb2ludCA9IHJhd0JhZ2lmeShiYWdFbnRyaWVzSXNEaXNqb2ludCk7JGjNj19vbmNlLmJhZ0lzRGlzam9pbnQoYmFnSXNEaXNqb2ludCk7XG4gICAgICAgY29uc3QgYmFnVW5pb24gPSBiYWdpZnkoYmFnRW50cmllc1VuaW9uKTskaM2PX29uY2UuYmFnVW5pb24oYmFnVW5pb24pO1xuICAgICAgIGNvbnN0IGJhZ0ludGVyc2VjdGlvbiA9IGJhZ2lmeShiYWdFbnRyaWVzSW50ZXJzZWN0aW9uKTskaM2PX29uY2UuYmFnSW50ZXJzZWN0aW9uKGJhZ0ludGVyc2VjdGlvbik7XG4gICAgICAgY29uc3QgYmFnRGlzam9pbnRTdWJ0cmFjdCA9IGJhZ2lmeShiYWdFbnRyaWVzRGlzam9pbnRTdWJ0cmFjdCk7JGjNj19vbmNlLmJhZ0Rpc2pvaW50U3VidHJhY3QoYmFnRGlzam9pbnRTdWJ0cmFjdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJiYWdJc1N1cGVyYmFnIjpbImJhZ0lzU3VwZXJiYWciXSwiYmFnSXNEaXNqb2ludCI6WyJiYWdJc0Rpc2pvaW50Il0sImJhZ1VuaW9uIjpbImJhZ1VuaW9uIl0sImJhZ0ludGVyc2VjdGlvbiI6WyJiYWdJbnRlcnNlY3Rpb24iXSwiYmFnRGlzam9pbnRTdWJ0cmFjdCI6WyJiYWdEaXNqb2ludFN1YnRyYWN0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAHQfjxllLwAAZS8AADUAAABAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qc3siaW1wb3J0cyI6WyJAZW5kby9tYXJzaGFsIiwiQGVuZG8vZXJyb3JzIiwiLi9jb3B5U2V0LmpzIl0sImV4cG9ydHMiOlsiZWxlbWVudHNDb21wYXJlIiwiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0IiwiZWxlbWVudHNEaXNqb2ludFVuaW9uIiwiZWxlbWVudHNJbnRlcnNlY3Rpb24iLCJlbGVtZW50c0lzRGlzam9pbnQiLCJlbGVtZW50c0lzU3VwZXJzZXQiLCJlbGVtZW50c1VuaW9uIiwic2V0RGlzam9pbnRTdWJ0cmFjdCIsInNldERpc2pvaW50VW5pb24iLCJzZXRJbnRlcnNlY3Rpb24iLCJzZXRJc0Rpc2pvaW50Iiwic2V0SXNTdXBlcnNldCIsInNldFVuaW9uIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgYXNzZXJ0UmFua1NvcnRlZCxjb21wYXJlQW50aVJhbmssbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQsc29ydEJ5UmFuayxxLEZhaWwsYXNzZXJ0Tm9EdXBsaWNhdGVzLG1ha2VTZXRPZkVsZW1lbnRzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiYXNzZXJ0UmFua1NvcnRlZFwiLFskaM2PX2EgPT4gKGFzc2VydFJhbmtTb3J0ZWQgPSAkaM2PX2EpXV0sW1wiY29tcGFyZUFudGlSYW5rXCIsWyRozY9fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjNj19hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsWyRozY9fYSA9PiAobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAkaM2PX2EpXV0sW1wic29ydEJ5UmFua1wiLFskaM2PX2EgPT4gKHNvcnRCeVJhbmsgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9lcnJvcnNcIiwgW1tcInFcIixbJGjNj19hID0+IChxID0gJGjNj19hKV1dLFtcIkZhaWxcIixbJGjNj19hID0+IChGYWlsID0gJGjNj19hKV1dXV0sW1wiLi9jb3B5U2V0LmpzXCIsIFtbXCJhc3NlcnROb0R1cGxpY2F0ZXNcIixbJGjNj19hID0+IChhc3NlcnROb0R1cGxpY2F0ZXMgPSAkaM2PX2EpXV0sW1wibWFrZVNldE9mRWxlbWVudHNcIixbJGjNj19hID0+IChtYWtlU2V0T2ZFbGVtZW50cyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtQYXNzYWJsZX0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSc7XG4gKiBAaW1wb3J0IHtGdWxsQ29tcGFyZSwgUmFua0NvbXBhcmV9IGZyb20gJ0BlbmRvL21hcnNoYWwnXG4gKiBAaW1wb3J0IHtLZXlDb21wYXJpc29ufSBmcm9tICcuLi90eXBlcy5qcydcbiAqL1xuXG4vKiBUT0RPIHNoYXJlIG1vcmUgY29kZSB3aXRoIGtleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzLiovXG5cbi8qKlxuICogQXNzZXJ0cyB0aGF0IGBlbGVtZW50c2AgaXMgYWxyZWFkeSByYW5rIHNvcnRlZCBieSBgcmFua0NvbXBhcmVgLCB3aGVyZSB0aGVyZVxuICogbWF5IGJlIGNvbnRpZ3VvdXMgcmVnaW9ucyBvZiBlbGVtZW50cyB0aWVkIGZvciB0aGUgc2FtZSByYW5rLlxuICogUmV0dXJucyBhbiBpdGVyYWJsZSB0aGF0IHdpbGwgZW51bWVyYXRlIGFsbCB0aGUgZWxlbWVudHMgaW4gb3JkZXJcbiAqIGFjY29yZGluZyB0byBgZnVsbE9yZGVyYCwgd2hpY2ggc2hvdWxkIGRpZmZlciBmcm9tIGByYW5rT3JkZXJgIG9ubHlcbiAqIGJ5IGJlaW5nIG1vcmUgcHJlY2lzZS5cbiAqXG4gKiBUaGlzIHNob3VsZCBiZSBlcXVpdmFsZW50IHRvIHJlc29ydGluZyB0aGUgZW50aXJlIGBlbGVtZW50c2AgYXJyYXkgYWNjb3JkaW5nXG4gKiAgdG8gYGZ1bGxPcmRlcmAuIEhvd2V2ZXIsIGl0IG9wdGltaXplcyBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlc2UgY29udGlndW91c1xuICogcnVucyB0aGF0IG5lZWQgdG8gYmUgcmVzb3J0ZWQgYXJlIGVpdGhlciBhYnNlbnQgb3Igc21hbGwuXG4gKlxuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVFxuICogQHBhcmFtIHtUW119IGVsZW1lbnRzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSByYW5rQ29tcGFyZVxuICogQHBhcmFtIHtGdWxsQ29tcGFyZX0gZnVsbENvbXBhcmVcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxUPn1cbiAqL1xuY29uc3Qgd2luZG93UmVzb3J0ID0gKGVsZW1lbnRzLCByYW5rQ29tcGFyZSwgZnVsbENvbXBhcmUpID0+IHtcbiAgYXNzZXJ0UmFua1NvcnRlZChlbGVtZW50cywgcmFua0NvbXBhcmUpO1xuICBjb25zdCB7IGxlbmd0aCB9ID0gZWxlbWVudHM7XG4gIGxldCBpID0gMDtcbiAgbGV0IG9wdElubmVySXRlcmF0b3I7XG4gIHJldHVybiBoYXJkZW4oe1xuICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PlxuICAgICAgaGFyZGVuKHtcbiAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgIGlmIChvcHRJbm5lckl0ZXJhdG9yKSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBvcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICAgIGlmIChyZXN1bHQuZG9uZSkge1xuICAgICAgICAgICAgICBvcHRJbm5lckl0ZXJhdG9yID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAvKiBmYWxsIHRocm91Z2gqL1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGkgPCBsZW5ndGgpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZWxlbWVudHNbaV07XG4gICAgICAgICAgICBsZXQgaiA9IGkgKyAxO1xuICAgICAgICAgICAgd2hpbGUgKGogPCBsZW5ndGggJiYgcmFua0NvbXBhcmUodmFsdWUsIGVsZW1lbnRzW2pdKSA9PT0gMCkge1xuICAgICAgICAgICAgICBqICs9IDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaiA9PT0gaSArIDEpIHtcbiAgICAgICAgICAgICAgaSA9IGo7XG4gICAgICAgICAgICAgIHJldHVybiBoYXJkZW4oeyBkb25lOiBmYWxzZSwgdmFsdWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBzaW1pbGFyUnVuID0gZWxlbWVudHMuc2xpY2UoaSwgaik7XG4gICAgICAgICAgICBpID0gajtcbiAgICAgICAgICAgIGNvbnN0IHJlc29ydGVkID0gc29ydEJ5UmFuayhzaW1pbGFyUnVuLCBmdWxsQ29tcGFyZSk7XG4gICAgICAgICAgICAvKiBQcm92aWRpbmcgdGhlIHNhbWUgYGZ1bGxDb21wYXJlYCBzaG91bGQgY2F1c2UgYSBtZW1vIGhpdCovXG4gICAgICAgICAgICAvKiB3aXRoaW4gYGFzc2VydE5vRHVwbGljYXRlc2AgZW5hYmxpbmcgaXQgdG8gYXZvaWQgYSovXG4gICAgICAgICAgICAvKiByZWR1bmRhbnQgcmVzb3J0aW5nLiovXG4gICAgICAgICAgICBhc3NlcnROb0R1cGxpY2F0ZXMocmVzb3J0ZWQsIGZ1bGxDb21wYXJlKTtcbiAgICAgICAgICAgIC8qIFRoaXMgaXMgdGhlIHJhdyBKUyBhcnJheSBpdGVyYXRvciB3aG9zZSBgLm5leHQoKWAgbWV0aG9kKi9cbiAgICAgICAgICAgIC8qIGRvZXMgbm90IGhhcmRlbiB0aGUgSXRlcmF0b3JSZXN1bHQsIGluIHZpb2xhdGlvbiBvZiBvdXIqL1xuICAgICAgICAgICAgLyogY29udmVudGlvbnMuIEZpeGluZyB0aGlzIGlzIGV4cGVuc2l2ZSBhbmQgSSdtIGNvbmZpZGVudCB0aGUqL1xuICAgICAgICAgICAgLyogdW5mcm96ZW4gdmFsdWUgZG9lcyBub3QgZXNjYXBlIHRoaXMgZmlsZSwgc28gSSdtIGxlYXZpbmcgdGhpcyovXG4gICAgICAgICAgICAvKiBhcyBpcy4qL1xuICAgICAgICAgICAgb3B0SW5uZXJJdGVyYXRvciA9IHJlc29ydGVkW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICAgICAgICAgIHJldHVybiBvcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGhhcmRlbih7IGRvbmU6IHRydWUsIHZhbHVlOiBudWxsIH0pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgIH0pLFxuICB9KTtcbn07XG5cbi8qKlxuICogUmV0dXJucyBhbiBpdGVyYWJsZSB3aG9zZSBpdGVyYXRpb24gcmVzdWx0cyBhcmUgW2tleSwgeENvdW50LCB5Q291bnRdIHR1cGxlc1xuICogcmVwcmVzZW50aW5nIHRoZSBuZXh0IGtleSBpbiB0aGUgbG9jYWwgZnVsbCBvcmRlciwgYXMgd2VsbCBhcyBob3cgbWFueVxuICogdGltZXMgaXQgb2NjdXJyZWQgaW4gdGhlIHggaW5wdXQgaXRlcmF0b3IgYW5kIHRoZSB5IGlucHV0IGl0ZXJhdG9yLlxuICpcbiAqIEZvciBzZXRzLCB0aGVzZSBjb3VudHMgYXJlIGFsd2F5cyAwIG9yIDEsIGJ1dCB0aGlzIHJlcHJlc2VudGF0aW9uXG4gKiBnZW5lcmFsaXplcyBuaWNlbHkgZm9yIGJhZ3MuXG4gKlxuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVFxuICogQHBhcmFtIHtUW119IHhlbGVtZW50c1xuICogQHBhcmFtIHtUW119IHllbGVtZW50c1xuICogQHJldHVybnMge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn1cbiAqL1xuY29uc3QgbWVyZ2UgPSAoeGVsZW1lbnRzLCB5ZWxlbWVudHMpID0+IHtcbiAgLyogVGhpcyBmdWxsT3JkZXIgY29udGFpbnMgaGlzdG9yeSBkZXBlbmRlbnQgc3RhdGUuIEl0IGlzIHNwZWNpZmljKi9cbiAgLyogdG8gdGhpcyBvbmUgYG1lcmdlYCBjYWxsIGFuZCBkb2VzIG5vdCBzdXJ2aXZlIGl0LiovXG4gIGNvbnN0IGZ1bGxDb21wYXJlID0gbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcblxuICBjb25zdCB4cyA9IHdpbmRvd1Jlc29ydCh4ZWxlbWVudHMsIGNvbXBhcmVBbnRpUmFuaywgZnVsbENvbXBhcmUpO1xuICBjb25zdCB5cyA9IHdpbmRvd1Jlc29ydCh5ZWxlbWVudHMsIGNvbXBhcmVBbnRpUmFuaywgZnVsbENvbXBhcmUpO1xuICByZXR1cm4gaGFyZGVuKHtcbiAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgLyogVGhlc2UgZm91ciBgbGV0YCB2YXJpYWJsZXMgYXJlIGJ1ZmZlcmluZyBvbmUgYWhlYWQgZnJvbSB0aGUgdW5kZXJseWluZyovXG4gICAgICAvKiBpdGVyYXRvcnMuIEVhY2ggaXRlcmF0aW9uIHJlcG9ydHMgb25lIG9yIHRoZSBvdGhlciBvciBib3RoLCBhbmQqL1xuICAgICAgLyogdGhlbiByZWZpbGxzIHRoZSBidWZmZXJzIG9mIHRob3NlIGl0IGFkdmFuY2VkLiovXG4gICAgICAvKiogQHR5cGUge1R9ICovXG4gICAgICBsZXQgeDtcbiAgICAgIGxldCB4RG9uZTtcbiAgICAgIC8qKiBAdHlwZSB7VH0gKi9cbiAgICAgIGxldCB5O1xuICAgICAgbGV0IHlEb25lO1xuXG4gICAgICBjb25zdCB4aSA9IHhzW1N5bWJvbC5pdGVyYXRvcl0oKTtcbiAgICAgIGNvbnN0IG5leHRYID0gKCkgPT4ge1xuICAgICAgICAheERvbmUgfHwgRmFpbGBJbnRlcm5hbDogbmV4dFggc2hvdWxkIG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbiAgICAgICAgKHsgZG9uZTogeERvbmUsIHZhbHVlOiB4IH0gPSB4aS5uZXh0KCkpO1xuICAgICAgfTtcbiAgICAgIG5leHRYKCk7XG5cbiAgICAgIGNvbnN0IHlpID0geXNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuICAgICAgY29uc3QgbmV4dFkgPSAoKSA9PiB7XG4gICAgICAgICF5RG9uZSB8fCBGYWlsYEludGVybmFsOiBuZXh0WSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuICAgICAgICAoeyBkb25lOiB5RG9uZSwgdmFsdWU6IHkgfSA9IHlpLm5leHQoKSk7XG4gICAgICB9O1xuICAgICAgbmV4dFkoKTtcblxuICAgICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAvKiogQHR5cGUge2Jvb2xlYW59ICovXG4gICAgICAgICAgbGV0IGRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAvKiogQHR5cGUge1tULGJpZ2ludCxiaWdpbnRdfSAqL1xuICAgICAgICAgIGxldCB2YWx1ZTtcbiAgICAgICAgICBpZiAoeERvbmUgJiYgeURvbmUpIHtcbiAgICAgICAgICAgIGRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgLyogQHRzLWV4cGVjdC1lcnJvciBCZWNhdXNlIHRoZSB0ZXJtaW5hdGluZyB2YWx1ZSBkb2VzIG5vdCBtYXR0ZXIqL1xuICAgICAgICAgICAgdmFsdWUgPSBbbnVsbCwgMG4sIDBuXTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHhEb25lKSB7XG4gICAgICAgICAgICAvKiBvbmx5IHlzIGFyZSBsZWZ0Ki9cbiAgICAgICAgICAgIHZhbHVlID0gW3ksIDBuLCAxbl07XG4gICAgICAgICAgICBuZXh0WSgpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoeURvbmUpIHtcbiAgICAgICAgICAgIC8qIG9ubHkgeHMgYXJlIGxlZnQqL1xuICAgICAgICAgICAgdmFsdWUgPSBbeCwgMW4sIDBuXTtcbiAgICAgICAgICAgIG5leHRYKCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXAgPSBmdWxsQ29tcGFyZSh4LCB5KTtcbiAgICAgICAgICAgIGlmIChjb21wID09PSAwKSB7XG4gICAgICAgICAgICAgIC8qIHggYW5kIHkgYXJlIGVxdWl2YWxlbnQsIHNvIHJlcG9ydCBib3RoKi9cbiAgICAgICAgICAgICAgdmFsdWUgPSBbeCwgMW4sIDFuXTtcbiAgICAgICAgICAgICAgbmV4dFgoKTtcbiAgICAgICAgICAgICAgbmV4dFkoKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoY29tcCA8IDApIHtcbiAgICAgICAgICAgICAgLyogeCBpcyBlYXJsaWVyLCBzbyByZXBvcnQgaXQqL1xuICAgICAgICAgICAgICB2YWx1ZSA9IFt4LCAxbiwgMG5dO1xuICAgICAgICAgICAgICBuZXh0WCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLyogeSBpcyBlYXJsaWVyLCBzbyByZXBvcnQgaXQqL1xuICAgICAgICAgICAgICBjb21wID4gMCB8fCBGYWlsYEludGVybmFsOiBVbmV4cGVjdGVkIGNvbXAgJHtxKGNvbXApfWA7XG4gICAgICAgICAgICAgIHZhbHVlID0gW3ksIDBuLCAxbl07XG4gICAgICAgICAgICAgIG5leHRZKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBoYXJkZW4oeyBkb25lLCB2YWx1ZSB9KTtcbiAgICAgICAgfSxcbiAgICAgIH0pO1xuICAgIH0sXG4gIH0pO1xufTtcbmhhcmRlbihtZXJnZSk7XG5cbmNvbnN0IGl0ZXJJc1N1cGVyc2V0ID0geHlpID0+IHtcbiAgZm9yIChjb25zdCBbX20sIHhjLCBfeWNdIG9mIHh5aSkge1xuICAgIGlmICh4YyA9PT0gMG4pIHtcbiAgICAgIC8qIHNvbWV0aGluZyBpbiB5IGlzIG5vdCBpbiB4LCBzbyB4IGlzIG5vdCBhIHN1cGVyc2V0IG9mIHkqL1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBpdGVySXNEaXNqb2ludCA9IHh5aSA9PiB7XG4gIGZvciAoY29uc3QgW19tLCB4YywgeWNdIG9mIHh5aSkge1xuICAgIGlmICh4YyA+PSAxbiAmJiB5YyA+PSAxbikge1xuICAgICAgLyogU29tZXRoaW5nIGluIGJvdGgsIHNvIG5vdCBkaXNqb2ludCovXG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge0tleUNvbXBhcmlzb259XG4gKi9cbmNvbnN0IGl0ZXJDb21wYXJlID0geHlpID0+IHtcbiAgbGV0IGxvbmVZID0gZmFsc2U7XG4gIGxldCBsb25lWCA9IGZhbHNlO1xuICBmb3IgKGNvbnN0IFtfbSwgeGMsIHljXSBvZiB4eWkpIHtcbiAgICBpZiAoeGMgPT09IDBuKSB7XG4gICAgICAvKiBzb21ldGhpbmcgaW4geSBpcyBub3QgaW4geCwgc28geCBpcyBub3QgYSBzdXBlcnNldCBvZiB5Ki9cbiAgICAgIGxvbmVZID0gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHljID09PSAwbikge1xuICAgICAgLyogc29tZXRoaW5nIGluIHggaXMgbm90IGluIHksIHNvIHkgaXMgbm90IGEgc3VwZXJzZXQgb2YgeCovXG4gICAgICBsb25lWCA9IHRydWU7XG4gICAgfVxuICAgIGlmIChsb25lWCAmJiBsb25lWSkge1xuICAgICAgcmV0dXJuIE5hTjtcbiAgICB9XG4gIH1cbiAgaWYgKGxvbmVYKSB7XG4gICAgcmV0dXJuIDE7XG4gIH0gZWxzZSBpZiAobG9uZVkpIHtcbiAgICByZXR1cm4gLTE7XG4gIH0gZWxzZSB7XG4gICAgKCFsb25lWCAmJiAhbG9uZVkpIHx8XG4gICAgICBGYWlsYEludGVybmFsOiBVbmV4cGVjdGVkIGxvbmUgcGFpciAke3EoW2xvbmVYLCBsb25lWV0pfWA7XG4gICAgcmV0dXJuIDA7XG4gIH1cbn07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtUW119XG4gKi9cbmNvbnN0IGl0ZXJVbmlvbiA9IHh5aSA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGNvbnN0IFttLCB4YywgeWNdIG9mIHh5aSkge1xuICAgIGlmICh4YyA+PSAwbikge1xuICAgICAgcmVzdWx0LnB1c2gobSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHljID49IDBuIHx8IEZhaWxgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgY291bnQgJHtxKHljKX1gO1xuICAgICAgLyogaWYgeCBhbmQgeSB3ZXJlIGJvdGggcmVhZHksIHRoZW4gdGhleSB3ZXJlIGVxdWl2YWxlbnQgYW5kKi9cbiAgICAgIC8qIGFib3ZlIGNsYXVzZSBhbHJlYWR5IHRvb2sgY2FyZSBvZiBpdC4gT3RoZXJ3aXNlIHB1c2ggaGVyZS4qL1xuICAgICAgcmVzdWx0LnB1c2gobSk7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG5jb25zdCBpdGVyRGlzam9pbnRVbmlvbiA9IHh5aSA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGNvbnN0IFttLCB4YywgeWNdIG9mIHh5aSkge1xuICAgIHhjID09PSAwbiB8fCB5YyA9PT0gMG4gfHwgRmFpbGBTZXRzIG11c3Qgbm90IGhhdmUgY29tbW9uIGVsZW1lbnRzOiAke219YDtcbiAgICBpZiAoeGMgPj0gMW4pIHtcbiAgICAgIHJlc3VsdC5wdXNoKG0pO1xuICAgIH0gZWxzZSB7XG4gICAgICB5YyA+PSAxbiB8fCBGYWlsYEludGVybmFsOiBVbmV4cGVjdGVkIGNvdW50ICR7cSh5Yyl9YDtcbiAgICAgIHJlc3VsdC5wdXNoKG0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge1RbXX1cbiAqL1xuY29uc3QgaXRlckludGVyc2VjdGlvbiA9IHh5aSA9PiB7XG4gIGNvbnN0IHJlc3VsdCA9IFtdO1xuICBmb3IgKGNvbnN0IFttLCB4YywgeWNdIG9mIHh5aSkge1xuICAgIGlmICh4YyA+PSAxbiAmJiB5YyA+PSAxbikge1xuICAgICAgLyogSWYgdGhleSBhcmUgYm90aCBwcmVzZW50LCB0aGVuIHRoZXkgd2VyZSBlcXVpdmFsZW50Ki9cbiAgICAgIHJlc3VsdC5wdXNoKG0pO1xuICAgIH1cbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge1RbXX1cbiAqL1xuY29uc3QgaXRlckRpc2pvaW50U3VidHJhY3QgPSB4eWkgPT4ge1xuICBjb25zdCByZXN1bHQgPSBbXTtcbiAgZm9yIChjb25zdCBbbSwgeGMsIHljXSBvZiB4eWkpIHtcbiAgICB4YyA+PSAxbiB8fCBGYWlsYHJpZ2h0IGVsZW1lbnQgJHttfSB3YXMgbm90IGluIGxlZnRgO1xuICAgIGlmICh5YyA9PT0gMG4pIHtcbiAgICAgIC8qIHRoZSB4IHdhcyBub3QgaW4geSovXG4gICAgICByZXN1bHQucHVzaChtKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG5cbmNvbnN0IG1lcmdlaWZ5ID0gaXRlck9wID0+ICh4ZWxlbWVudHMsIHllbGVtZW50cykgPT5cbiAgaXRlck9wKG1lcmdlKHhlbGVtZW50cywgeWVsZW1lbnRzKSk7XG5cbiAgICAgICBjb25zdCBlbGVtZW50c0lzU3VwZXJzZXQgPSBtZXJnZWlmeShpdGVySXNTdXBlcnNldCk7JGjNj19vbmNlLmVsZW1lbnRzSXNTdXBlcnNldChlbGVtZW50c0lzU3VwZXJzZXQpO1xuICAgICAgIGNvbnN0IGVsZW1lbnRzSXNEaXNqb2ludCA9IG1lcmdlaWZ5KGl0ZXJJc0Rpc2pvaW50KTskaM2PX29uY2UuZWxlbWVudHNJc0Rpc2pvaW50KGVsZW1lbnRzSXNEaXNqb2ludCk7XG4gICAgICAgY29uc3QgZWxlbWVudHNDb21wYXJlID0gbWVyZ2VpZnkoaXRlckNvbXBhcmUpOyRozY9fb25jZS5lbGVtZW50c0NvbXBhcmUoZWxlbWVudHNDb21wYXJlKTtcbiAgICAgICBjb25zdCBlbGVtZW50c1VuaW9uID0gbWVyZ2VpZnkoaXRlclVuaW9uKTskaM2PX29uY2UuZWxlbWVudHNVbmlvbihlbGVtZW50c1VuaW9uKTtcbiAgICAgICBjb25zdCBlbGVtZW50c0Rpc2pvaW50VW5pb24gPSBtZXJnZWlmeShpdGVyRGlzam9pbnRVbmlvbik7JGjNj19vbmNlLmVsZW1lbnRzRGlzam9pbnRVbmlvbihlbGVtZW50c0Rpc2pvaW50VW5pb24pO1xuICAgICAgIGNvbnN0IGVsZW1lbnRzSW50ZXJzZWN0aW9uID0gbWVyZ2VpZnkoaXRlckludGVyc2VjdGlvbik7JGjNj19vbmNlLmVsZW1lbnRzSW50ZXJzZWN0aW9uKGVsZW1lbnRzSW50ZXJzZWN0aW9uKTtcbiAgICAgICBjb25zdCBlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QgPSBtZXJnZWlmeShpdGVyRGlzam9pbnRTdWJ0cmFjdCk7JGjNj19vbmNlLmVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdChlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QpO1xuXG5jb25zdCByYXdTZXRpZnkgPSBlbGVtZW50c09wID0+ICh4c2V0LCB5c2V0KSA9PlxuICBlbGVtZW50c09wKHhzZXQucGF5bG9hZCwgeXNldC5wYXlsb2FkKTtcblxuY29uc3Qgc2V0aWZ5ID0gZWxlbWVudHNPcCA9PiAoeHNldCwgeXNldCkgPT5cbiAgbWFrZVNldE9mRWxlbWVudHMoZWxlbWVudHNPcCh4c2V0LnBheWxvYWQsIHlzZXQucGF5bG9hZCkpO1xuXG4gICAgICAgY29uc3Qgc2V0SXNTdXBlcnNldCA9IHJhd1NldGlmeShlbGVtZW50c0lzU3VwZXJzZXQpOyRozY9fb25jZS5zZXRJc1N1cGVyc2V0KHNldElzU3VwZXJzZXQpO1xuICAgICAgIGNvbnN0IHNldElzRGlzam9pbnQgPSByYXdTZXRpZnkoZWxlbWVudHNJc0Rpc2pvaW50KTskaM2PX29uY2Uuc2V0SXNEaXNqb2ludChzZXRJc0Rpc2pvaW50KTtcbiAgICAgICBjb25zdCBzZXRVbmlvbiA9IHNldGlmeShlbGVtZW50c1VuaW9uKTskaM2PX29uY2Uuc2V0VW5pb24oc2V0VW5pb24pO1xuICAgICAgIGNvbnN0IHNldERpc2pvaW50VW5pb24gPSBzZXRpZnkoZWxlbWVudHNEaXNqb2ludFVuaW9uKTskaM2PX29uY2Uuc2V0RGlzam9pbnRVbmlvbihzZXREaXNqb2ludFVuaW9uKTtcbiAgICAgICBjb25zdCBzZXRJbnRlcnNlY3Rpb24gPSBzZXRpZnkoZWxlbWVudHNJbnRlcnNlY3Rpb24pOyRozY9fb25jZS5zZXRJbnRlcnNlY3Rpb24oc2V0SW50ZXJzZWN0aW9uKTtcbiAgICAgICBjb25zdCBzZXREaXNqb2ludFN1YnRyYWN0ID0gc2V0aWZ5KGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCk7JGjNj19vbmNlLnNldERpc2pvaW50U3VidHJhY3Qoc2V0RGlzam9pbnRTdWJ0cmFjdCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJlbGVtZW50c0lzU3VwZXJzZXQiOlsiZWxlbWVudHNJc1N1cGVyc2V0Il0sImVsZW1lbnRzSXNEaXNqb2ludCI6WyJlbGVtZW50c0lzRGlzam9pbnQiXSwiZWxlbWVudHNDb21wYXJlIjpbImVsZW1lbnRzQ29tcGFyZSJdLCJlbGVtZW50c1VuaW9uIjpbImVsZW1lbnRzVW5pb24iXSwiZWxlbWVudHNEaXNqb2ludFVuaW9uIjpbImVsZW1lbnRzRGlzam9pbnRVbmlvbiJdLCJlbGVtZW50c0ludGVyc2VjdGlvbiI6WyJlbGVtZW50c0ludGVyc2VjdGlvbiJdLCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiOlsiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0Il0sInNldElzU3VwZXJzZXQiOlsic2V0SXNTdXBlcnNldCJdLCJzZXRJc0Rpc2pvaW50IjpbInNldElzRGlzam9pbnQiXSwic2V0VW5pb24iOlsic2V0VW5pb24iXSwic2V0RGlzam9pbnRVbmlvbiI6WyJzZXREaXNqb2ludFVuaW9uIl0sInNldEludGVyc2VjdGlvbiI6WyJzZXRJbnRlcnNlY3Rpb24iXSwic2V0RGlzam9pbnRTdWJ0cmFjdCI6WyJzZXREaXNqb2ludFN1YnRyYWN0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAF0aWkIrLwAAKy8AADYAAABAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL3BhdHRlcm5zL2dldEd1YXJkUGF5bG9hZHMuanN7ImltcG9ydHMiOlsiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanMiLCIuL3BhdHRlcm5NYXRjaGVycy5qcyIsIi4uL2tleXMvY2hlY2tLZXkuanMiXSwiZXhwb3J0cyI6WyJnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZCIsImdldEludGVyZmFjZUd1YXJkUGF5bG9hZCIsImdldEludGVyZmFjZU1ldGhvZEtleXMiLCJnZXRNZXRob2RHdWFyZFBheWxvYWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBvYmplY3RNYXAsQXJnR3VhcmRMaXN0U2hhcGUsQXdhaXRBcmdHdWFyZFNoYXBlLEludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlLEludGVyZmFjZUd1YXJkU2hhcGUsTSxNZXRob2RHdWFyZFBheWxvYWRTaGFwZSxNZXRob2RHdWFyZFNoYXBlLFJhd0d1YXJkU2hhcGUsU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUsU3luY1ZhbHVlR3VhcmRTaGFwZSxhc3NlcnRBd2FpdEFyZ0d1YXJkLG1hdGNoZXMsbXVzdE1hdGNoLGdldENvcHlNYXBLZXlzLG1ha2VDb3B5TWFwOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vY29tbW9uL29iamVjdC1tYXAuanNcIiwgW1tcIm9iamVjdE1hcFwiLFskaM2PX2EgPT4gKG9iamVjdE1hcCA9ICRozY9fYSldXV1dLFtcIi4vcGF0dGVybk1hdGNoZXJzLmpzXCIsIFtbXCJBcmdHdWFyZExpc3RTaGFwZVwiLFskaM2PX2EgPT4gKEFyZ0d1YXJkTGlzdFNoYXBlID0gJGjNj19hKV1dLFtcIkF3YWl0QXJnR3VhcmRTaGFwZVwiLFskaM2PX2EgPT4gKEF3YWl0QXJnR3VhcmRTaGFwZSA9ICRozY9fYSldXSxbXCJJbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZVwiLFskaM2PX2EgPT4gKEludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlID0gJGjNj19hKV1dLFtcIkludGVyZmFjZUd1YXJkU2hhcGVcIixbJGjNj19hID0+IChJbnRlcmZhY2VHdWFyZFNoYXBlID0gJGjNj19hKV1dLFtcIk1cIixbJGjNj19hID0+IChNID0gJGjNj19hKV1dLFtcIk1ldGhvZEd1YXJkUGF5bG9hZFNoYXBlXCIsWyRozY9fYSA9PiAoTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUgPSAkaM2PX2EpXV0sW1wiTWV0aG9kR3VhcmRTaGFwZVwiLFskaM2PX2EgPT4gKE1ldGhvZEd1YXJkU2hhcGUgPSAkaM2PX2EpXV0sW1wiUmF3R3VhcmRTaGFwZVwiLFskaM2PX2EgPT4gKFJhd0d1YXJkU2hhcGUgPSAkaM2PX2EpXV0sW1wiU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGVcIixbJGjNj19hID0+IChTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSA9ICRozY9fYSldXSxbXCJTeW5jVmFsdWVHdWFyZFNoYXBlXCIsWyRozY9fYSA9PiAoU3luY1ZhbHVlR3VhcmRTaGFwZSA9ICRozY9fYSldXSxbXCJhc3NlcnRBd2FpdEFyZ0d1YXJkXCIsWyRozY9fYSA9PiAoYXNzZXJ0QXdhaXRBcmdHdWFyZCA9ICRozY9fYSldXSxbXCJtYXRjaGVzXCIsWyRozY9fYSA9PiAobWF0Y2hlcyA9ICRozY9fYSldXSxbXCJtdXN0TWF0Y2hcIixbJGjNj19hID0+IChtdXN0TWF0Y2ggPSAkaM2PX2EpXV1dXSxbXCIuLi9rZXlzL2NoZWNrS2V5LmpzXCIsIFtbXCJnZXRDb3B5TWFwS2V5c1wiLFskaM2PX2EgPT4gKGdldENvcHlNYXBLZXlzID0gJGjNj19hKV1dLFtcIm1ha2VDb3B5TWFwXCIsWyRozY9fYSA9PiAobWFrZUNvcHlNYXAgPSAkaM2PX2EpXV1dXV0pO1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKlxuICogQGltcG9ydCB7UmVtb3RhYmxlTWV0aG9kTmFtZX0gZnJvbSAnQGVuZG8vcGFzcy1zdHlsZSc7XG4gKiBAaW1wb3J0IHtBd2FpdEFyZ0d1YXJkLCBBd2FpdEFyZ0d1YXJkUGF5bG9hZCwgSW50ZXJmYWNlR3VhcmQsIEludGVyZmFjZUd1YXJkUGF5bG9hZCwgTWV0aG9kR3VhcmQsIE1ldGhvZEd1YXJkUGF5bG9hZH0gZnJvbSAnLi4vdHlwZXMuanMnXG4gKi9cblxuLyogVGhlIGdldCpHdWFyZFBheWxvYWQgZnVuY3Rpb25zIGV4aXN0IHRvIGFkYXB0IHRvIHRoZSB3b3JsZHMgYm90aCovXG4vKiBiZWZvcmUgYW5kIGFmdGVyIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzE3MTIgLiBXaGVuKi9cbi8qIGdpdmVuIHNvbWV0aGluZyB0aGF0IHdvdWxkIGJlIHRoZSBleHBlY3RlZCBndWFyZCBpbiBlaXRoZXIgd29ybGQsKi9cbi8qIGl0IHJldHVybnMgYSAqR3VhcmRQYXlsb2FkIHRoYXQgaXMgdmFsaWQgaW4gdGhlIGN1cnJlbnQgd29ybGQuIFRodXMqL1xuLyogaXQgaGVscHMgbmV3IGNvbnN1bWVycyBvZiB0aGVzZSBndWFyZHMgY29wZSB3aXRoIG9sZCBjb2RlIHRoYXQqL1xuLyogd291bGQgY29uc3RydWN0IGFuZCBzZW5kIHRoZXNlIGd1YXJkcy4qL1xuXG4vKiBCZWNhdXNlIHRoZSBtYWluIHVzZSBjYXNlIGZvciB0aGlzIGxlZ2FjeSBhZGFwdGF0aW9uIGlzIGluIEBlbmRvL2V4byovXG4vKiBvciBwYWNrYWdlcyB0aGF0IGRlcGVuZCBvbiBpdCwgdGhlIHRlc3RzIGZvciB0aGlzIGxlZ2FjeSBhZGFwdGF0aW9uKi9cbi8qIGFyZSBmb3VuZCBpbiB0aGUgQGVuZG8vZXhvIGB0ZXN0LWxlZ2FjeS1ndWFyZC10b2xlcmFuY2UuanNgLiovXG5cbi8qIFVubGlrZSBMZWdhY3lBd2FpdEFyZ0d1YXJkU2hhcGUsIExlZ2FjeU1ldGhvZEd1YXJkU2hhcGUsKi9cbi8qIGFuZCBMZWdhY3lJbnRlcmZhY2VHdWFyZFNoYXBlLCB0aGVyZSBpcyBubyBuZWVkIGZvciBhKi9cbi8qIExlZ2FjeVJhd0d1YXJkU2hhcGUsIGJlY2F1c2UgcmF3IGd1YXJkcyB3ZXJlIGludHJvZHVjZWQgYXQqL1xuLyogaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTgzMSAsIHdoaWNoIHdhcyBtZXJnZWQgd2VsbCBhZnRlciovXG4vKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xNzEyIC4gVGh1cywgdGhlcmUgd2FzIG5ldmVyIGEqL1xuLyogYGtsYXNzOmAgZm9ybSBvZiB0aGUgcmF3IGd1YXJkLiovXG5cbi8qIFRPRE8gQXQgc3VjaCBhIHRpbWUgdGhhdCB3ZSBkZWNpZGUgd2Ugbm8gbG9uZ2VyIG5lZWQgdG8gc3VwcG9ydCBjb2RlKi9cbi8qIHByZWNlZGluZyBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xNzEyIG9yIGd1YXJkIGRhdGEqL1xuLyogZ2VuZXJhdGVkIGJ5IHRoYXQgY29kZSwgYWxsIHRoZSBhZGFwdGF0aW9uIGNvbXBsZXhpdHkgaW4gdGhpcyBmaWxlKi9cbi8qIHNob3VsZCBiZSBkZWxldGVkLiovXG5cbi8qIFRPRE8gbWFudWFsbHkgbWFpbnRhaW4gY29ycmVzcG9uZGVuY2Ugd2l0aCBBd2FpdEFyZ0d1YXJkUGF5bG9hZFNoYXBlKi9cbi8qIGJlY2F1c2UgdGhpcyBvbmUgbmVlZHMgdG8gYmUgc3RhYmxlIGFuZCBhY2NvbW1vZGF0ZSBuZXN0ZWQgbGVnYWN5LCovXG4vKiB3aGVuIHRoYXQncyBhbiBpc3N1ZS4qL1xuY29uc3QgTGVnYWN5QXdhaXRBcmdHdWFyZFNoYXBlID0gaGFyZGVuKHtcbiAga2xhc3M6ICdhd2FpdEFyZycsXG4gIGFyZ0d1YXJkOiBNLnBhdHRlcm4oKSxcbn0pO1xuXG4vKipcbiAqIEJ5IHVzaW5nIHRoaXMgYWJzdHJhY3Rpb24gcmF0aGVyIHRoYW4gYWNjZXNzaW5nIHRoZSBwcm9wZXJ0aWVzIGRpcmVjdGx5LFxuICogd2Ugc21vb3RoIHRoZSB0cmFuc2l0aW9uIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzE3MTIsXG4gKiB0b2xlcmF0aW5nIGJvdGggdGhlIGxlZ2FjeSBhbmQgY3VycmVudCBndWFyZCBzaGFwZXMuXG4gKlxuICogTm90ZSB0aGF0IHRlY2huaWNhbGx5LCB0b2xlcmF0aW5nIHRoZSBvbGQgTGVnYWN5QXdhaXRBcmdHdWFyZFNoYXBlXG4gKiBpcyBhbiBleHBsb2l0YWJsZSBidWcsIGluIHRoYXQgYSByZWNvcmQgdGhhdCBtYXRjaGVzIHRoaXNcbiAqIHNoYXBlIGlzIGFsc28gYSB2YWxpZCBwYXJhbWV0ZXIgcGF0dGVybiB0aGF0IHNob3VsZCBhbGxvd1xuICogYW4gYXJndW1lbnQgdGhhdCBtYXRjaGVzIHRoYXQgcGF0dGVybiwgaS5lLiwgYSBjb3B5UmVjb3JkIGFyZ3VtZW50IHRoYXRcbiAqIGF0IGxlYXN0IGNvbnRhaW5zIGEgYGtsYXNzOiAnYXdhaXRBcmdHdWFyZCdgIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7QXdhaXRBcmdHdWFyZH0gYXdhaXRBcmdHdWFyZFxuICogQHJldHVybnMge0F3YWl0QXJnR3VhcmRQYXlsb2FkfVxuICovXG4gICAgICAgY29uc3QgZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQgPSBhd2FpdEFyZ0d1YXJkID0+IHtcbiAgaWYgKG1hdGNoZXMoYXdhaXRBcmdHdWFyZCwgTGVnYWN5QXdhaXRBcmdHdWFyZFNoYXBlKSkge1xuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgTGVnYWN5IGFkYXB0b3IgY2FuIGJlIGlsbCB0eXBlZCovXG4gICAgY29uc3QgeyBrbGFzczogXywgLi4ucGF5bG9hZCB9ID0gYXdhaXRBcmdHdWFyZDtcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIExlZ2FjeSBhZGFwdG9yIGNhbiBiZSBpbGwgdHlwZWQqL1xuICAgIHJldHVybiBwYXlsb2FkO1xuICB9XG4gIGFzc2VydEF3YWl0QXJnR3VhcmQoYXdhaXRBcmdHdWFyZCk7XG4gIHJldHVybiBhd2FpdEFyZ0d1YXJkLnBheWxvYWQ7XG59OyRozY9fb25jZS5nZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZChnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZCk7XG5oYXJkZW4oZ2V0QXdhaXRBcmdHdWFyZFBheWxvYWQpO1xuXG4vKiBUT0RPIG1hbnVhbGx5IG1haW50YWluIGNvcnJlc3BvbmRlbmNlIHdpdGggU3luY01ldGhvZEd1YXJkUGF5bG9hZFNoYXBlKi9cbi8qIGJlY2F1c2UgdGhpcyBvbmUgbmVlZHMgdG8gYmUgc3RhYmxlIGFuZCBhY2NvbW1vZGF0ZSBuZXN0ZWQgbGVnYWN5LCovXG4vKiB3aGVuIHRoYXQncyBhbiBpc3N1ZS4qL1xuY29uc3QgTGVnYWN5U3luY01ldGhvZEd1YXJkU2hhcGUgPSBNLnNwbGl0UmVjb3JkKFxuICB7XG4gICAga2xhc3M6ICdtZXRob2RHdWFyZCcsXG4gICAgY2FsbEtpbmQ6ICdzeW5jJyxcbiAgICBhcmdHdWFyZHM6IFN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlLFxuICAgIHJldHVybkd1YXJkOiBTeW5jVmFsdWVHdWFyZFNoYXBlLFxuICB9LFxuICB7XG4gICAgb3B0aW9uYWxBcmdHdWFyZHM6IFN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlLFxuICAgIHJlc3RBcmdHdWFyZDogU3luY1ZhbHVlR3VhcmRTaGFwZSxcbiAgfSxcbik7XG5cbi8qIFRPRE8gbWFudWFsbHkgbWFpbnRhaW4gY29ycmVzcG9uZGVuY2Ugd2l0aCBBcmdHdWFyZFNoYXBlKi9cbi8qIGJlY2F1c2UgdGhpcyBvbmUgbmVlZHMgdG8gYmUgc3RhYmxlIGFuZCBhY2NvbW1vZGF0ZSBuZXN0ZWQgbGVnYWN5LCovXG4vKiB3aGVuIHRoYXQncyBhbiBpc3N1ZS4qL1xuY29uc3QgTGVnYWN5QXJnR3VhcmRTaGFwZSA9IE0ub3IoXG4gIFJhd0d1YXJkU2hhcGUsXG4gIEF3YWl0QXJnR3VhcmRTaGFwZSxcbiAgTGVnYWN5QXdhaXRBcmdHdWFyZFNoYXBlLFxuICBNLnBhdHRlcm4oKSxcbik7XG4vKiBUT0RPIG1hbnVhbGx5IG1haW50YWluIGNvcnJlc3BvbmRlbmNlIHdpdGggQXJnR3VhcmRMaXN0U2hhcGUqL1xuLyogYmVjYXVzZSB0aGlzIG9uZSBuZWVkcyB0byBiZSBzdGFibGUgYW5kIGFjY29tbW9kYXRlIG5lc3RlZCBsZWdhY3ksKi9cbi8qIHdoZW4gdGhhdCdzIGFuIGlzc3VlLiovXG5jb25zdCBMZWdhY3lBcmdHdWFyZExpc3RTaGFwZSA9IE0uYXJyYXlPZihMZWdhY3lBcmdHdWFyZFNoYXBlKTtcblxuLyogVE9ETyBtYW51YWxseSBtYWludGFpbiBjb3JyZXNwb25kZW5jZSB3aXRoIEFzeW5jTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUqL1xuLyogYmVjYXVzZSB0aGlzIG9uZSBuZWVkcyB0byBiZSBzdGFibGUgYW5kIGFjY29tbW9kYXRlIG5lc3RlZCBsZWdhY3ksKi9cbi8qIHdoZW4gdGhhdCdzIGFuIGlzc3VlLiovXG5jb25zdCBMZWdhY3lBc3luY01ldGhvZEd1YXJkU2hhcGUgPSBNLnNwbGl0UmVjb3JkKFxuICB7XG4gICAga2xhc3M6ICdtZXRob2RHdWFyZCcsXG4gICAgY2FsbEtpbmQ6ICdhc3luYycsXG4gICAgYXJnR3VhcmRzOiBMZWdhY3lBcmdHdWFyZExpc3RTaGFwZSxcbiAgICByZXR1cm5HdWFyZDogU3luY1ZhbHVlR3VhcmRTaGFwZSxcbiAgfSxcbiAge1xuICAgIG9wdGlvbmFsQXJnR3VhcmRzOiBBcmdHdWFyZExpc3RTaGFwZSxcbiAgICByZXN0QXJnR3VhcmQ6IFN5bmNWYWx1ZUd1YXJkU2hhcGUsXG4gIH0sXG4pO1xuXG4vKiBUT0RPIG1hbnVhbGx5IG1haW50YWluIGNvcnJlc3BvbmRlbmNlIHdpdGggTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUqL1xuLyogYmVjYXVzZSB0aGlzIG9uZSBuZWVkcyB0byBiZSBzdGFibGUgYW5kIGFjY29tbW9kYXRlIG5lc3RlZCBsZWdhY3ksKi9cbi8qIHdoZW4gdGhhdCdzIGFuIGlzc3VlLiovXG5jb25zdCBMZWdhY3lNZXRob2RHdWFyZFNoYXBlID0gTS5vcihcbiAgTGVnYWN5U3luY01ldGhvZEd1YXJkU2hhcGUsXG4gIExlZ2FjeUFzeW5jTWV0aG9kR3VhcmRTaGFwZSxcbik7XG5cbmNvbnN0IGFkYXB0TGVnYWN5QXJnR3VhcmQgPSBhcmdHdWFyZCA9PlxuICBtYXRjaGVzKGFyZ0d1YXJkLCBMZWdhY3lBd2FpdEFyZ0d1YXJkU2hhcGUpXG4gICAgPyBNLmF3YWl0KGdldEF3YWl0QXJnR3VhcmRQYXlsb2FkKGFyZ0d1YXJkKS5hcmdHdWFyZClcbiAgICA6IGFyZ0d1YXJkO1xuXG4vKipcbiAqIEJ5IHVzaW5nIHRoaXMgYWJzdHJhY3Rpb24gcmF0aGVyIHRoYW4gYWNjZXNzaW5nIHRoZSBwcm9wZXJ0aWVzIGRpcmVjdGx5LFxuICogd2Ugc21vb3RoIHRoZSB0cmFuc2l0aW9uIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzE3MTIsXG4gKiB0b2xlcmF0aW5nIGJvdGggdGhlIGxlZ2FjeSBhbmQgY3VycmVudCBndWFyZCBzaGFwZXMuXG4gKlxuICogVW5saWtlIExlZ2FjeUF3YWl0QXJnR3VhcmRTaGFwZSwgdG9sZXJhdGluZyBMZWdhY3lNZXRob2RHdWFyZFNoYXBlXG4gKiBkb2VzIG5vdCBzZWVtIGxpa2UgYSBjdXJyZW50bHkgZXhwbG9pdGFibGUgYnVnLCBiZWNhdXNlIHRoZXJlIGlzIG5vdFxuICogY3VycmVudGx5IGFueSBjb250ZXh0IHdoZXJlIGVpdGhlciBhIG1ldGhvZEd1YXJkIG9yIGEgY29weVJlY29yZCB3b3VsZFxuICogYm90aCBiZSBtZWFuaW5nZnVsLlxuICpcbiAqIEBwYXJhbSB7TWV0aG9kR3VhcmR9IG1ldGhvZEd1YXJkXG4gKiBAcmV0dXJucyB7TWV0aG9kR3VhcmRQYXlsb2FkfVxuICovXG4gICAgICAgY29uc3QgZ2V0TWV0aG9kR3VhcmRQYXlsb2FkID0gbWV0aG9kR3VhcmQgPT4ge1xuICBpZiAobWF0Y2hlcyhtZXRob2RHdWFyZCwgTWV0aG9kR3VhcmRTaGFwZSkpIHtcbiAgICByZXR1cm4gbWV0aG9kR3VhcmQucGF5bG9hZDtcbiAgfVxuICBtdXN0TWF0Y2gobWV0aG9kR3VhcmQsIExlZ2FjeU1ldGhvZEd1YXJkU2hhcGUsICdsZWdhY3lNZXRob2RHdWFyZCcpO1xuICBjb25zdCB7XG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBMZWdhY3kgYWRhcHRvciBjYW4gYmUgaWxsIHR5cGVkKi9cbiAgICBrbGFzczogXyxcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIExlZ2FjeSBhZGFwdG9yIGNhbiBiZSBpbGwgdHlwZWQqL1xuICAgIGNhbGxLaW5kLFxuICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgTGVnYWN5IGFkYXB0b3IgY2FuIGJlIGlsbCB0eXBlZCovXG4gICAgcmV0dXJuR3VhcmQsXG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBMZWdhY3kgYWRhcHRvciBjYW4gYmUgaWxsIHR5cGVkKi9cbiAgICByZXN0QXJnR3VhcmQsXG4gIH0gPSBtZXRob2RHdWFyZDtcbiAgbGV0IHtcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIExlZ2FjeSBhZGFwdG9yIGNhbiBiZSBpbGwgdHlwZWQqL1xuICAgIGFyZ0d1YXJkcyxcbiAgICAvKiBAdHMtZXhwZWN0LWVycm9yIExlZ2FjeSBhZGFwdG9yIGNhbiBiZSBpbGwgdHlwZWQqL1xuICAgIG9wdGlvbmFsQXJnR3VhcmRzLFxuICB9ID0gbWV0aG9kR3VhcmQ7XG4gIGlmIChjYWxsS2luZCA9PT0gJ2FzeW5jJykge1xuICAgIGFyZ0d1YXJkcyA9IGFyZ0d1YXJkcy5tYXAoYWRhcHRMZWdhY3lBcmdHdWFyZCk7XG4gICAgb3B0aW9uYWxBcmdHdWFyZHMgPVxuICAgICAgb3B0aW9uYWxBcmdHdWFyZHMgJiYgb3B0aW9uYWxBcmdHdWFyZHMubWFwKGFkYXB0TGVnYWN5QXJnR3VhcmQpO1xuICB9XG4gIGNvbnN0IHBheWxvYWQgPSBoYXJkZW4oe1xuICAgIGNhbGxLaW5kLFxuICAgIGFyZ0d1YXJkcyxcbiAgICBvcHRpb25hbEFyZ0d1YXJkcyxcbiAgICByZXN0QXJnR3VhcmQsXG4gICAgcmV0dXJuR3VhcmQsXG4gIH0pO1xuICAvKiBlbnN1cmUgdGhlIGFkYXB0YXRpb24gc3VjY2VlZGVkLiovXG4gIG11c3RNYXRjaChwYXlsb2FkLCBNZXRob2RHdWFyZFBheWxvYWRTaGFwZSwgJ2ludGVybmFsTWV0aG9kR3VhcmRBZGFwdG9yJyk7XG4gIHJldHVybiBwYXlsb2FkO1xufTskaM2PX29uY2UuZ2V0TWV0aG9kR3VhcmRQYXlsb2FkKGdldE1ldGhvZEd1YXJkUGF5bG9hZCk7XG5oYXJkZW4oZ2V0TWV0aG9kR3VhcmRQYXlsb2FkKTtcblxuLyogVE9ETyBtYW51YWxseSBtYWludGFpbiBjb3JyZXNwb25kZW5jZSB3aXRoIEludGVyZmFjZUd1YXJkUGF5bG9hZFNoYXBlKi9cbi8qIGJlY2F1c2UgdGhpcyBvbmUgbmVlZHMgdG8gYmUgc3RhYmxlIGFuZCBhY2NvbW1vZGF0ZSBuZXN0ZWQgbGVnYWN5LCovXG4vKiB3aGVuIHRoYXQncyBhbiBpc3N1ZS4qL1xuY29uc3QgTGVnYWN5SW50ZXJmYWNlR3VhcmRTaGFwZSA9IE0uc3BsaXRSZWNvcmQoXG4gIHtcbiAgICBrbGFzczogJ0ludGVyZmFjZScsXG4gICAgaW50ZXJmYWNlTmFtZTogTS5zdHJpbmcoKSxcbiAgICBtZXRob2RHdWFyZHM6IE0ucmVjb3JkT2YoXG4gICAgICBNLnN0cmluZygpLFxuICAgICAgTS5vcihNZXRob2RHdWFyZFNoYXBlLCBMZWdhY3lNZXRob2RHdWFyZFNoYXBlKSxcbiAgICApLFxuICB9LFxuICB7XG4gICAgZGVmYXVsdEd1YXJkczogTS5vcihNLnVuZGVmaW5lZCgpLCAncGFzc2FibGUnLCAncmF3JyksXG4gICAgc2xvcHB5OiBNLmJvb2xlYW4oKSxcbiAgICAvKiBUaGVyZSBpcyBubyBuZWVkIHRvIGFjY29tbW9kYXRlIExlZ2FjeU1ldGhvZEd1YXJkU2hhcGUgaW4qL1xuICAgIC8qIHRoaXMgcG9zaXRpb24sIHNpbmNlIGBzeW1ib2xNZXRob2RHdWFyZHMgaGFwcGVuZWQqL1xuICAgIC8qIGFmdGVyIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzE3MTIqL1xuICAgIHN5bWJvbE1ldGhvZEd1YXJkczogTS5tYXBPZihNLnN5bWJvbCgpLCBNZXRob2RHdWFyZFNoYXBlKSxcbiAgfSxcbik7XG5cbmNvbnN0IGFkYXB0TWV0aG9kR3VhcmQgPSBtZXRob2RHdWFyZCA9PiB7XG4gIGlmIChtYXRjaGVzKG1ldGhvZEd1YXJkLCBMZWdhY3lNZXRob2RHdWFyZFNoYXBlKSkge1xuICAgIGNvbnN0IHtcbiAgICAgIGNhbGxLaW5kLFxuICAgICAgYXJnR3VhcmRzLFxuICAgICAgb3B0aW9uYWxBcmdHdWFyZHMgPSBbXSxcbiAgICAgIHJlc3RBcmdHdWFyZCA9IE0uYW55KCksXG4gICAgICByZXR1cm5HdWFyZCxcbiAgICB9ID0gZ2V0TWV0aG9kR3VhcmRQYXlsb2FkKG1ldGhvZEd1YXJkKTtcbiAgICBjb25zdCBtQ2FsbCA9IGNhbGxLaW5kID09PSAnc3luYycgPyBNLmNhbGwgOiBNLmNhbGxXaGVuO1xuICAgIHJldHVybiBtQ2FsbCguLi5hcmdHdWFyZHMpXG4gICAgICAub3B0aW9uYWwoLi4ub3B0aW9uYWxBcmdHdWFyZHMpXG4gICAgICAucmVzdChyZXN0QXJnR3VhcmQpXG4gICAgICAucmV0dXJucyhyZXR1cm5HdWFyZCk7XG4gIH1cbiAgcmV0dXJuIG1ldGhvZEd1YXJkO1xufTtcblxuLyoqXG4gKiBCeSB1c2luZyB0aGlzIGFic3RyYWN0aW9uIHJhdGhlciB0aGFuIGFjY2Vzc2luZyB0aGUgcHJvcGVydGllcyBkaXJlY3RseSxcbiAqIHdlIHNtb290aCB0aGUgdHJhbnNpdGlvbiB0byBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xNzEyLFxuICogdG9sZXJhdGluZyBib3RoIHRoZSBsZWdhY3kgYW5kIGN1cnJlbnQgZ3VhcmQgc2hhcGVzLlxuICpcbiAqIFVubGlrZSBMZWdhY3lBd2FpdEFyZ0d1YXJkU2hhcGUsIHRvbGVyYXRpbmcgTGVnYWN5SW50ZXJmYWNlR3VhcmRTaGFwZVxuICogZG9lcyBub3Qgc2VlbSBsaWtlIGEgY3VycmVudGx5IGV4cGxvaXRhYmxlIGJ1ZywgYmVjYXVzZSB0aGVyZSBpcyBub3RcbiAqIGN1cnJlbnRseSBhbnkgY29udGV4dCB3aGVyZSBlaXRoZXIgYW4gaW50ZXJmYWNlR3VhcmQgb3IgYSBjb3B5UmVjb3JkIHdvdWxkXG4gKiBib3RoIGJlIG1lYW5pbmdmdWwuXG4gKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8UmVtb3RhYmxlTWV0aG9kTmFtZSwgTWV0aG9kR3VhcmQ+fSBbVD1SZWNvcmQ8UmVtb3RhYmxlTWV0aG9kTmFtZSwgTWV0aG9kR3VhcmQ+XVxuICogQHBhcmFtIHtJbnRlcmZhY2VHdWFyZDxUPn0gaW50ZXJmYWNlR3VhcmRcbiAqIEByZXR1cm5zIHtJbnRlcmZhY2VHdWFyZFBheWxvYWQ8VD59XG4gKi9cbiAgICAgICBjb25zdCBnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQgPSBpbnRlcmZhY2VHdWFyZCA9PiB7XG4gIGlmIChtYXRjaGVzKGludGVyZmFjZUd1YXJkLCBJbnRlcmZhY2VHdWFyZFNoYXBlKSkge1xuICAgIHJldHVybiBpbnRlcmZhY2VHdWFyZC5wYXlsb2FkO1xuICB9XG4gIG11c3RNYXRjaChpbnRlcmZhY2VHdWFyZCwgTGVnYWN5SW50ZXJmYWNlR3VhcmRTaGFwZSwgJ2xlZ2FjeUludGVyZmFjZUd1YXJkJyk7XG4gIC8qIEB0cy1leHBlY3QtZXJyb3IgTGVnYWN5IGFkYXB0b3IgY2FuIGJlIGlsbCB0eXBlZCovXG4gIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3QqL1xuICBsZXQgeyBrbGFzczogXywgaW50ZXJmYWNlTmFtZSwgbWV0aG9kR3VhcmRzLCAuLi5yZXN0IH0gPSBpbnRlcmZhY2VHdWFyZDtcbiAgbWV0aG9kR3VhcmRzID0gb2JqZWN0TWFwKG1ldGhvZEd1YXJkcywgYWRhcHRNZXRob2RHdWFyZCk7XG4gIGNvbnN0IHBheWxvYWQgPSBoYXJkZW4oe1xuICAgIGludGVyZmFjZU5hbWUsXG4gICAgbWV0aG9kR3VhcmRzLFxuICAgIC4uLnJlc3QsXG4gIH0pO1xuICBtdXN0TWF0Y2goXG4gICAgcGF5bG9hZCxcbiAgICBJbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZSxcbiAgICAnaW50ZXJuYWxJbnRlcmZhY2VHdWFyZEFkYXB0b3InLFxuICApO1xuICByZXR1cm4gcGF5bG9hZDtcbn07JGjNj19vbmNlLmdldEludGVyZmFjZUd1YXJkUGF5bG9hZChnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQpO1xuaGFyZGVuKGdldEludGVyZmFjZUd1YXJkUGF5bG9hZCk7XG5cbmNvbnN0IGVtcHR5Q29weU1hcCA9IG1ha2VDb3B5TWFwKFtdKTtcblxuLyoqXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkfSBpbnRlcmZhY2VHdWFyZFxuICogQHJldHVybnMgeyhzdHJpbmcgfCBzeW1ib2wpW119XG4gKi9cbiAgICAgICBjb25zdCBnZXRJbnRlcmZhY2VNZXRob2RLZXlzID0gaW50ZXJmYWNlR3VhcmQgPT4ge1xuICBjb25zdCB7IG1ldGhvZEd1YXJkcywgc3ltYm9sTWV0aG9kR3VhcmRzID0gZW1wdHlDb3B5TWFwIH0gPVxuICAgIGdldEludGVyZmFjZUd1YXJkUGF5bG9hZChpbnRlcmZhY2VHdWFyZCk7XG4gIC8qKiBAdHlwZSB7KHN0cmluZyB8IHN5bWJvbClbXX0gKi9cbiAgLyogVE9ETyBhdC10cy1leHBlY3QtZXJyb3Igd29ya3MgbG9jYWxseSBidXQgbm90IGZyb20gQGVuZG8vZXhvKi9cbiAgLyogQHRzLWlnbm9yZSBpbmZlcmVuY2UgaXMgdG9vIHdlYWsgdG8gc2VlIHRoaXMgaXMgb2sqL1xuICByZXR1cm4gaGFyZGVuKFtcbiAgICAuLi5SZWZsZWN0Lm93bktleXMobWV0aG9kR3VhcmRzKSxcbiAgICAuLi5nZXRDb3B5TWFwS2V5cyhzeW1ib2xNZXRob2RHdWFyZHMpLFxuICBdKTtcbn07JGjNj19vbmNlLmdldEludGVyZmFjZU1ldGhvZEtleXMoZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyk7XG5oYXJkZW4oZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZCI6WyJnZXRBd2FpdEFyZ0d1YXJkUGF5bG9hZCJdLCJnZXRNZXRob2RHdWFyZFBheWxvYWQiOlsiZ2V0TWV0aG9kR3VhcmRQYXlsb2FkIl0sImdldEludGVyZmFjZUd1YXJkUGF5bG9hZCI6WyJnZXRJbnRlcmZhY2VHdWFyZFBheWxvYWQiXSwiZ2V0SW50ZXJmYWNlTWV0aG9kS2V5cyI6WyJnZXRJbnRlcmZhY2VNZXRob2RLZXlzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGak7nu+MgEAvjIBADUAAABAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qc3siaW1wb3J0cyI6WyJAZW5kby9lcnJvcnMiLCJAZW5kby9jb21tb24vaWRlbnQtY2hlY2tlci5qcyIsIkBlbmRvL2NvbW1vbi9hcHBseS1sYWJlbGluZy1lcnJvci5qcyIsIkBlbmRvL2NvbW1vbi9mcm9tLXVuaXF1ZS1lbnRyaWVzLmpzIiwiQGVuZG8vY29tbW9uL2xpc3QtZGlmZmVyZW5jZS5qcyIsIkBlbmRvL3Bhc3Mtc3R5bGUiLCJAZW5kby9tYXJzaGFsIiwiLi4va2V5cy9jb21wYXJlS2V5cy5qcyIsIi4uL2tleXMvY2hlY2tLZXkuanMiLCIuLi9rZXlzL2tleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzIl0sImV4cG9ydHMiOlsiQXJnR3VhcmRMaXN0U2hhcGUiLCJBd2FpdEFyZ0d1YXJkU2hhcGUiLCJJbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZSIsIkludGVyZmFjZUd1YXJkU2hhcGUiLCJNIiwiTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUiLCJNZXRob2RHdWFyZFNoYXBlIiwiUmF3R3VhcmRTaGFwZSIsIlN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlIiwiU3luY1ZhbHVlR3VhcmRTaGFwZSIsImFzc2VydEF3YWl0QXJnR3VhcmQiLCJhc3NlcnRJbnRlcmZhY2VHdWFyZCIsImFzc2VydE1ldGhvZEd1YXJkIiwiYXNzZXJ0UGF0dGVybiIsImFzc2VydFJhd0d1YXJkIiwiY2hlY2tNYXRjaGVzIiwiY29udGFpbmVySGFzU3BsaXQiLCJkZWZhdWx0TGltaXRzIiwiZ2V0UmFua0NvdmVyIiwiaXNBd2FpdEFyZ0d1YXJkIiwiaXNQYXR0ZXJuIiwiaXNSYXdHdWFyZCIsImtpbmRPZiIsIm1hdGNoZXMiLCJtdXN0TWF0Y2giXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnO2xldCBxLGIsWCxGYWlsLG1ha2VFcnJvcixhbm5vdGF0ZUVycm9yLGlkZW50Q2hlY2tlcixhcHBseUxhYmVsaW5nRXJyb3IsZnJvbVVuaXF1ZUVudHJpZXMsbGlzdERpZmZlcmVuY2UsYXNzZXJ0Q2hlY2tlcixGYXIsZ2V0VGFnLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsbmFtZUZvclBhc3NhYmxlU3ltYm9sLGNvbXBhcmVSYW5rLGdldFBhc3NTdHlsZUNvdmVyLGludGVyc2VjdFJhbmtDb3ZlcnMsdW5pb25SYW5rQ292ZXJzLHJlY29yZE5hbWVzLHJlY29yZFZhbHVlcyxxcCxrZXlFUSxrZXlHVCxrZXlHVEUsa2V5TFQsa2V5TFRFLGFzc2VydEtleSxjaGVja0tleSxpc0tleSxjaGVja1NjYWxhcktleSxjaGVja0NvcHlTZXQsY2hlY2tDb3B5TWFwLGNvcHlNYXBLZXlTZXQsY2hlY2tDb3B5QmFnLGdldENvcHlNYXBFbnRyeUFycmF5LG1ha2VDb3B5TWFwLG1ha2VDb3B5U2V0LG1ha2VDb3B5QmFnLGdlbmVyYXRlQ29sbGVjdGlvblBhaXJFbnRyaWVzOyRozY9faW1wb3J0cyhbW1wiQGVuZG8vZXJyb3JzXCIsIFtbXCJxXCIsWyRozY9fYSA9PiAocSA9ICRozY9fYSldXSxbXCJiXCIsWyRozY9fYSA9PiAoYiA9ICRozY9fYSldXSxbXCJYXCIsWyRozY9fYSA9PiAoWCA9ICRozY9fYSldXSxbXCJGYWlsXCIsWyRozY9fYSA9PiAoRmFpbCA9ICRozY9fYSldXSxbXCJtYWtlRXJyb3JcIixbJGjNj19hID0+IChtYWtlRXJyb3IgPSAkaM2PX2EpXV0sW1wiYW5ub3RhdGVFcnJvclwiLFskaM2PX2EgPT4gKGFubm90YXRlRXJyb3IgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vaWRlbnQtY2hlY2tlci5qc1wiLCBbW1wiaWRlbnRDaGVja2VyXCIsWyRozY9fYSA9PiAoaWRlbnRDaGVja2VyID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vY29tbW9uL2FwcGx5LWxhYmVsaW5nLWVycm9yLmpzXCIsIFtbXCJhcHBseUxhYmVsaW5nRXJyb3JcIixbJGjNj19hID0+IChhcHBseUxhYmVsaW5nRXJyb3IgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9jb21tb24vZnJvbS11bmlxdWUtZW50cmllcy5qc1wiLCBbW1wiZnJvbVVuaXF1ZUVudHJpZXNcIixbJGjNj19hID0+IChmcm9tVW5pcXVlRW50cmllcyA9ICRozY9fYSldXV1dLFtcIkBlbmRvL2NvbW1vbi9saXN0LWRpZmZlcmVuY2UuanNcIiwgW1tcImxpc3REaWZmZXJlbmNlXCIsWyRozY9fYSA9PiAobGlzdERpZmZlcmVuY2UgPSAkaM2PX2EpXV1dXSxbXCJAZW5kby9wYXNzLXN0eWxlXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsWyRozY9fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRozY9fYSldXSxbXCJGYXJcIixbJGjNj19hID0+IChGYXIgPSAkaM2PX2EpXV0sW1wiZ2V0VGFnXCIsWyRozY9fYSA9PiAoZ2V0VGFnID0gJGjNj19hKV1dLFtcIm1ha2VUYWdnZWRcIixbJGjNj19hID0+IChtYWtlVGFnZ2VkID0gJGjNj19hKV1dLFtcInBhc3NTdHlsZU9mXCIsWyRozY9fYSA9PiAocGFzc1N0eWxlT2YgPSAkaM2PX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsWyRozY9fYSA9PiAobmFtZUZvclBhc3NhYmxlU3ltYm9sID0gJGjNj19hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiY29tcGFyZVJhbmtcIixbJGjNj19hID0+IChjb21wYXJlUmFuayA9ICRozY9fYSldXSxbXCJnZXRQYXNzU3R5bGVDb3ZlclwiLFskaM2PX2EgPT4gKGdldFBhc3NTdHlsZUNvdmVyID0gJGjNj19hKV1dLFtcImludGVyc2VjdFJhbmtDb3ZlcnNcIixbJGjNj19hID0+IChpbnRlcnNlY3RSYW5rQ292ZXJzID0gJGjNj19hKV1dLFtcInVuaW9uUmFua0NvdmVyc1wiLFskaM2PX2EgPT4gKHVuaW9uUmFua0NvdmVycyA9ICRozY9fYSldXSxbXCJyZWNvcmROYW1lc1wiLFskaM2PX2EgPT4gKHJlY29yZE5hbWVzID0gJGjNj19hKV1dLFtcInJlY29yZFZhbHVlc1wiLFskaM2PX2EgPT4gKHJlY29yZFZhbHVlcyA9ICRozY9fYSldXSxbXCJxcFwiLFskaM2PX2EgPT4gKHFwID0gJGjNj19hKV1dXV0sW1wiLi4va2V5cy9jb21wYXJlS2V5cy5qc1wiLCBbW1wia2V5RVFcIixbJGjNj19hID0+IChrZXlFUSA9ICRozY9fYSldXSxbXCJrZXlHVFwiLFskaM2PX2EgPT4gKGtleUdUID0gJGjNj19hKV1dLFtcImtleUdURVwiLFskaM2PX2EgPT4gKGtleUdURSA9ICRozY9fYSldXSxbXCJrZXlMVFwiLFskaM2PX2EgPT4gKGtleUxUID0gJGjNj19hKV1dLFtcImtleUxURVwiLFskaM2PX2EgPT4gKGtleUxURSA9ICRozY9fYSldXV1dLFtcIi4uL2tleXMvY2hlY2tLZXkuanNcIiwgW1tcImFzc2VydEtleVwiLFskaM2PX2EgPT4gKGFzc2VydEtleSA9ICRozY9fYSldXSxbXCJjaGVja0tleVwiLFskaM2PX2EgPT4gKGNoZWNrS2V5ID0gJGjNj19hKV1dLFtcImlzS2V5XCIsWyRozY9fYSA9PiAoaXNLZXkgPSAkaM2PX2EpXV0sW1wiY2hlY2tTY2FsYXJLZXlcIixbJGjNj19hID0+IChjaGVja1NjYWxhcktleSA9ICRozY9fYSldXSxbXCJjaGVja0NvcHlTZXRcIixbJGjNj19hID0+IChjaGVja0NvcHlTZXQgPSAkaM2PX2EpXV0sW1wiY2hlY2tDb3B5TWFwXCIsWyRozY9fYSA9PiAoY2hlY2tDb3B5TWFwID0gJGjNj19hKV1dLFtcImNvcHlNYXBLZXlTZXRcIixbJGjNj19hID0+IChjb3B5TWFwS2V5U2V0ID0gJGjNj19hKV1dLFtcImNoZWNrQ29weUJhZ1wiLFskaM2PX2EgPT4gKGNoZWNrQ29weUJhZyA9ICRozY9fYSldXSxbXCJnZXRDb3B5TWFwRW50cnlBcnJheVwiLFskaM2PX2EgPT4gKGdldENvcHlNYXBFbnRyeUFycmF5ID0gJGjNj19hKV1dLFtcIm1ha2VDb3B5TWFwXCIsWyRozY9fYSA9PiAobWFrZUNvcHlNYXAgPSAkaM2PX2EpXV0sW1wibWFrZUNvcHlTZXRcIixbJGjNj19hID0+IChtYWtlQ29weVNldCA9ICRozY9fYSldXSxbXCJtYWtlQ29weUJhZ1wiLFskaM2PX2EgPT4gKG1ha2VDb3B5QmFnID0gJGjNj19hKV1dXV0sW1wiLi4va2V5cy9rZXljb2xsZWN0aW9uLW9wZXJhdG9ycy5qc1wiLCBbW1wiZ2VuZXJhdGVDb2xsZWN0aW9uUGFpckVudHJpZXNcIixbJGjNj19hID0+IChnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyA9ICRozY9fYSldXV1dXSk7XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqXG4gKiBAaW1wb3J0IHtDaGVja2VyLCBDb3B5QXJyYXksIENvcHlSZWNvcmQsIENvcHlUYWdnZWQsIFBhc3NhYmxlfSBmcm9tICdAZW5kby9wYXNzLXN0eWxlJ1xuICogQGltcG9ydCB7Q29weVNldCwgQ29weUJhZywgQXJnR3VhcmQsIEF3YWl0QXJnR3VhcmQsIENoZWNrUGF0dGVybiwgR2V0UmFua0NvdmVyLCBJbnRlcmZhY2VHdWFyZCwgTWF0Y2hlck5hbWVzcGFjZSwgTWV0aG9kR3VhcmQsIE1ldGhvZEd1YXJkTWFrZXIsIFBhdHRlcm4sIFJhd0d1YXJkLCBTeW5jVmFsdWVHdWFyZCwgS2luZCwgTGltaXRzLCBBbGxMaW1pdHMsIEtleSwgRGVmYXVsdEd1YXJkVHlwZX0gZnJvbSAnLi4vdHlwZXMuanMnXG4gKiBAaW1wb3J0IHtNYXRjaEhlbHBlciwgUGF0dGVybktpdH0gZnJvbSAnLi90eXBlcy5qcydcbiAqL1xuXG5jb25zdCB7IGVudHJpZXMsIHZhbHVlcywgaGFzT3duIH0gPSBPYmplY3Q7XG5jb25zdCB7IG93bktleXMgfSA9IFJlZmxlY3Q7XG5cbi8qKiBAdHlwZSB7V2Vha1NldDxQYXR0ZXJuPn0gKi9cbmNvbnN0IHBhdHRlcm5NZW1vID0gbmV3IFdlYWtTZXQoKTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gTWF0Y2ggSGVscGVycyBIZWxwZXJzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEZvciBmb3J3YXJkIHJlZmVyZW5jZXMgdG8gYE1gICovXG5sZXQgTU07XG5cbi8qKlxuICogVGhlIGFjdHVhbCBkZWZhdWx0IHZhbHVlcyBoZXJlIGFyZSwgYXQgdGhlIHByZXNlbnQgdGltZSwgZmFpcmx5XG4gKiBhcmJpdHJhcnkgY2hvaWNlcyBhbmQgbWF5IGNoYW5nZSBiZWZvcmUgdGhleSBzZXR0bGUgZG93bi4gT2YgY291cnNlXG4gKiBhdCBzb21lIHBvaW50IHdlJ2xsIG5lZWQgdG8gc3RvcCBjaGFuZ2luZyB0aGVtLiBCdXQgd2Ugc2hvdWxkIGZpcnN0XG4gKiBzZWUgaG93IG91ciBzeXN0ZW0gaG9sZHMgdXAgd2l0aCB0aGVzZSBjaG9pY2VzLiBUaGUgbWFpbiBjcml0ZXJpYVxuICogaXMgdGhhdCB0aGV5IGJlIGJpZyBlbm91Z2ggdGhhdCBcIm5vcm1hbFwiIGlubm9jZW50IHByb2dyYW1zIHJhcmVseVxuICogZW5jb3VudGVyIHRoZXNlIGxpbWl0cy5cbiAqXG4gKiBFeHBvcnRlZCBwcmltYXJpbHkgZm9yIHRlc3RpbmcuXG4gKi9cbiAgICAgICBjb25zdCBkZWZhdWx0TGltaXRzID0gaGFyZGVuKHtcbiAgZGVjaW1hbERpZ2l0c0xpbWl0OiAxMDAsXG4gIHN0cmluZ0xlbmd0aExpbWl0OiAxMDBfMDAwLFxuICBzeW1ib2xOYW1lTGVuZ3RoTGltaXQ6IDEwMCxcbiAgbnVtUHJvcGVydGllc0xpbWl0OiA4MCxcbiAgcHJvcGVydHlOYW1lTGVuZ3RoTGltaXQ6IDEwMCxcbiAgYXJyYXlMZW5ndGhMaW1pdDogMTBfMDAwLFxuICBieXRlTGVuZ3RoTGltaXQ6IDEwMF8wMDAsXG4gIG51bVNldEVsZW1lbnRzTGltaXQ6IDEwXzAwMCxcbiAgbnVtVW5pcXVlQmFnRWxlbWVudHNMaW1pdDogMTBfMDAwLFxuICBudW1NYXBFbnRyaWVzTGltaXQ6IDUwMDAsXG59KTtcblxuLyoqXG4gKiBVc2UgdGhlIHJlc3VsdCBvbmx5IHRvIGdldCB0aGUgbGltaXRzIHlvdSBuZWVkIGJ5IGRlc3RydWN0dXJpbmcuXG4gKiBUaHVzLCB0aGUgcmVzdWx0IG9ubHkgbmVlZHMgdG8gc3VwcG9ydCBkZXN0cnVjdHVyaW5nLiBUaGUgY3VycmVudFxuICogaW1wbGVtZW50YXRpb24gdXNlcyBpbmhlcml0YW5jZSBhcyBhIGNoZWFwIGhhY2suXG4gKlxuICogQHBhcmFtIHtMaW1pdHN9IFtsaW1pdHNdXG4gKiBAcmV0dXJucyB7QWxsTGltaXRzfVxuICovJGjNj19vbmNlLmRlZmF1bHRMaW1pdHMoZGVmYXVsdExpbWl0cyk7XG5jb25zdCBsaW1pdCA9IChsaW1pdHMgPSB7fSkgPT5cbiAgLyoqIEB0eXBlIHtBbGxMaW1pdHN9ICovIChoYXJkZW4oeyBfX3Byb3RvX186IGRlZmF1bHRMaW1pdHMsIC4uLmxpbWl0cyB9KSk7XG5cbmNvbnN0IGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0ID0gKFxuICBwYXlsb2FkLFxuICBtYWluUGF5bG9hZFNoYXBlLFxuICBjaGVjayxcbiAgbGFiZWwsXG4pID0+IHtcbiAgYXNzZXJ0KEFycmF5LmlzQXJyYXkobWFpblBheWxvYWRTaGFwZSkpO1xuICBpZiAoIUFycmF5LmlzQXJyYXkocGF5bG9hZCkpIHtcbiAgICByZXR1cm4gY2hlY2soZmFsc2UsIFhgJHtxKGxhYmVsKX0gcGF5bG9hZCBtdXN0IGJlIGFuIGFycmF5OiAke3BheWxvYWR9YCk7XG4gIH1cblxuICAvKiBXYXMgdGhlIGZvbGxvd2luZywgYnV0IGl0cyBvdmVydXNlIG9mIHBhdHRlcm5zIGNhdXNlZCBhbiBpbmZpbml0ZSByZWdyZXNzKi9cbiAgLyogY29uc3QgcGF5bG9hZExpbWl0U2hhcGUgPSBoYXJkZW4oKi9cbiAgLyogTS5zcGxpdCgqL1xuICAvKiBtYWluUGF5bG9hZFNoYXBlLCovXG4gIC8qIE0ucGFydGlhbChoYXJkZW4oW00ucmVjb3JkT2YoTS5zdHJpbmcoKSwgTS5udW1iZXIoKSldKSwgaGFyZGVuKFtdKSksKi9cbiAgLyogKSwqL1xuICAvKiApOyovXG4gIC8qIHJldHVybiBjaGVja01hdGNoZXMocGF5bG9hZCwgcGF5bG9hZExpbWl0U2hhcGUsIGNoZWNrLCBsYWJlbCk7Ki9cblxuICBjb25zdCBtYWluTGVuZ3RoID0gbWFpblBheWxvYWRTaGFwZS5sZW5ndGg7XG4gIGlmICghKHBheWxvYWQubGVuZ3RoID09PSBtYWluTGVuZ3RoIHx8IHBheWxvYWQubGVuZ3RoID09PSBtYWluTGVuZ3RoICsgMSkpIHtcbiAgICByZXR1cm4gY2hlY2soZmFsc2UsIFhgJHtxKGxhYmVsKX0gcGF5bG9hZCB1bmV4cGVjdGVkIHNpemU6ICR7cGF5bG9hZH1gKTtcbiAgfVxuICBjb25zdCBsaW1pdHMgPSBwYXlsb2FkW21haW5MZW5ndGhdO1xuICBwYXlsb2FkID0gaGFyZGVuKHBheWxvYWQuc2xpY2UoMCwgbWFpbkxlbmd0aCkpO1xuICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICBpZiAoIWNoZWNrTWF0Y2hlcyhwYXlsb2FkLCBtYWluUGF5bG9hZFNoYXBlLCBjaGVjaywgbGFiZWwpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIGlmIChsaW1pdHMgPT09IHVuZGVmaW5lZCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiAoXG4gICAgKHBhc3NTdHlsZU9mKGxpbWl0cykgPT09ICdjb3B5UmVjb3JkJyB8fFxuICAgICAgY2hlY2soZmFsc2UsIFhgTGltaXRzIG11c3QgYmUgYSByZWNvcmQ6ICR7cShsaW1pdHMpfWApKSAmJlxuICAgIGVudHJpZXMobGltaXRzKS5ldmVyeShcbiAgICAgIChba2V5LCB2YWx1ZV0pID0+XG4gICAgICAgIHBhc3NTdHlsZU9mKHZhbHVlKSA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgY2hlY2soZmFsc2UsIFhgVmFsdWUgb2YgbGltaXQgJHtxKGtleSl9IGJ1dCBiZSBhIG51bWJlcjogJHtxKHZhbHVlKX1gKSxcbiAgICApXG4gICk7XG59O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7bnVtYmVyfSBkZWNpbWFsRGlnaXRzTGltaXRcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqL1xuY29uc3QgY2hlY2tEZWNpbWFsRGlnaXRzTGltaXQgPSAoc3BlY2ltZW4sIGRlY2ltYWxEaWdpdHNMaW1pdCwgY2hlY2spID0+IHtcbiAgaWYgKFxuICAgIE1hdGguZmxvb3IoTWF0aC5sb2cxMChNYXRoLmFicyhOdW1iZXIoc3BlY2ltZW4pKSkpICsgMSA8PVxuICAgIGRlY2ltYWxEaWdpdHNMaW1pdFxuICApIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gY2hlY2soXG4gICAgZmFsc2UsXG4gICAgWGBiaWdpbnQgJHtzcGVjaW1lbn0gbXVzdCBub3QgaGF2ZSBtb3JlIHRoYW4gJHtkZWNpbWFsRGlnaXRzTGltaXR9IGRpZ2l0c2AsXG4gICk7XG59O1xuXG4vKipcbiAqIEByZXR1cm5zIHtQYXR0ZXJuS2l0fVxuICovXG5jb25zdCBtYWtlUGF0dGVybktpdCA9ICgpID0+IHtcbiAgLyoqXG4gKiBJZiB0aGlzIGlzIGEgcmVjb2duaXplZCBtYXRjaCB0YWcsIHJldHVybiB0aGUgTWF0Y2hIZWxwZXIuXG4gKiBPdGhlcndpc2UgcmVzdWx0IHVuZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcmV0dXJucyB7TWF0Y2hIZWxwZXIgfCB1bmRlZmluZWR9XG4gKi9cbiAgY29uc3QgbWF5YmVNYXRjaEhlbHBlciA9IHRhZyA9PlxuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgSGVscGVyc0J5TWF0Y2hUYWdbdGFnXTtcblxuICAvKipcbiAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGluZGljYXRlcyBhYnNlbmNlIGJ5IHJldHVybmluZyBgdW5kZWZpbmVkYCxcbiAqIGV2ZW4gdGhvdWdoIGB1bmRlZmluZWRgIGlzIGEgdmFsaWQgcGF0dGVybi4gVG8gZXZhZGUgdGhpcyBjb25mdXNpb24sXG4gKiB0byByZWdpc3RlciBhIHBheWxvYWQgc2hhcGUgd2l0aCB0aGF0IG1lYW5pbmcsIHVzZSBgTU0udW5kZWZpbmVkKClgLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEByZXR1cm5zIHtQYXR0ZXJuIHwgdW5kZWZpbmVkfVxuICovXG4gIGNvbnN0IG1heWJlUGF5bG9hZFNoYXBlID0gdGFnID0+XG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICBHdWFyZFBheWxvYWRTaGFwZXNbdGFnXTtcblxuICAvKiogQHR5cGUge01hcDxLaW5kLCB1bmtub3duPn0gKi9cbiAgY29uc3Qgc2luZ2xldG9uS2luZHMgPSBuZXcgTWFwKFtcbiAgICBbJ251bGwnLCBudWxsXSxcbiAgICBbJ3VuZGVmaW5lZCcsIHVuZGVmaW5lZF0sXG4gIF0pO1xuXG4gIC8qKlxuICogQHR5cGUge1dlYWtNYXA8Q29weVRhZ2dlZCwgS2luZD59XG4gKiBPbmx5IGZvciB0YWdnZWQgcmVjb3JkcyBvZiByZWNvZ25pemVkIGtpbmRzIHdob3NlIHN0b3JlLWxldmVsIGludmFyaWFudHNcbiAqIGhhdmUgYWxyZWFkeSBiZWVuIGNoZWNrZWQuXG4gKi9cbiAgY29uc3QgdGFnTWVtbyA9IG5ldyBXZWFrTWFwKCk7XG5cbiAgLyoqXG4gKiBDaGVja3Mgb25seSByZWNvZ25pemVkIHRhZ3MsIGFuZCBvbmx5IGlmIHRoZSB0YWdnZWRcbiAqIHBhc3NlcyB0aGUgaW52YXJpYW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCByZWNvZ25pdGlvbi5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB0YWdnZWRcbiAqIEBwYXJhbSB7S2luZH0gdGFnXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICBjb25zdCBjaGVja1RhZ2dlZCA9ICh0YWdnZWQsIHRhZywgY2hlY2spID0+IHtcbiAgICBjb25zdCBtYXRjaEhlbHBlciA9IG1heWJlTWF0Y2hIZWxwZXIodGFnKTtcbiAgICBpZiAobWF0Y2hIZWxwZXIpIHtcbiAgICAgIC8qIEJ1cmllZCBoZXJlIGlzIHRoZSBpbXBvcnRhbnQgY2FzZSwgd2hlcmUgd2UgcHJvY2VzcyovXG4gICAgICAvKiB0aGUgdmFyaW91cyBwYXR0ZXJuTm9kZXMqL1xuICAgICAgcmV0dXJuIG1hdGNoSGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkKHRhZ2dlZC5wYXlsb2FkLCBjaGVjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IHBheWxvYWRTaGFwZSA9IG1heWJlUGF5bG9hZFNoYXBlKHRhZyk7XG4gICAgICBpZiAocGF5bG9hZFNoYXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICAgICAgcmV0dXJuIGNoZWNrTWF0Y2hlcyh0YWdnZWQucGF5bG9hZCwgcGF5bG9hZFNoYXBlLCBjaGVjaywgdGFnKTtcbiAgICAgIH1cbiAgICB9XG4gICAgc3dpdGNoICh0YWcpIHtcbiAgICAgIGNhc2UgJ2NvcHlTZXQnOiB7XG4gICAgICAgIHJldHVybiBjaGVja0NvcHlTZXQodGFnZ2VkLCBjaGVjayk7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5QmFnJzoge1xuICAgICAgICByZXR1cm4gY2hlY2tDb3B5QmFnKHRhZ2dlZCwgY2hlY2spO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weU1hcCc6IHtcbiAgICAgICAgcmV0dXJuIGNoZWNrQ29weU1hcCh0YWdnZWQsIGNoZWNrKTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIFhgY2Fubm90IGNoZWNrIHVucmVjb2duaXplZCB0YWcgJHtxKHRhZyl9OiAke3RhZ2dlZH1gLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKipcbiAqIFJldHVybnMgb25seSBhIHJlY29nbml6ZWQga2luZCwgYW5kIG9ubHkgaWYgdGhlIHNwZWNpbWVuIHBhc3NlcyB0aGVcbiAqIGludmFyaWFudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgcmVjb2duaXRpb24uXG4gKiBPdGhlcndpc2UsIGBjaGVjayhmYWxzZSwgLi4uKWAgYW5kIHJldHVybnMgdW5kZWZpbmVkXG4gKlxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtLaW5kIHwgdW5kZWZpbmVkfVxuICovXG4gIGNvbnN0IGtpbmRPZiA9IChzcGVjaW1lbiwgY2hlY2sgPSBpZGVudENoZWNrZXIpID0+IHtcbiAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihzcGVjaW1lbik7XG4gICAgaWYgKHBhc3NTdHlsZSAhPT0gJ3RhZ2dlZCcpIHtcbiAgICAgIHJldHVybiBwYXNzU3R5bGU7XG4gICAgfVxuICAgIC8qIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGF0IHNwZWNpbWVuIGlzIHdlbGwgZm9ybWVkKi9cbiAgICAvKiBhcyBhIHRhZ2dlZCByZWNvcmQsIHdoaWNoIGlzIGRlZmluZWQgYXQgdGhlIG1hcnNoYWwgbGV2ZWwgb2YgYWJzdHJhY3Rpb24sKi9cbiAgICAvKiBzaW5jZSBgcGFzc1N0eWxlT2ZgIGNoZWNrcyB0aG9zZSBpbnZhcmlhbnRzLiovXG4gICAgaWYgKHRhZ01lbW8uaGFzKHNwZWNpbWVuKSkge1xuICAgICAgcmV0dXJuIHRhZ01lbW8uZ2V0KHNwZWNpbWVuKTtcbiAgICB9XG4gICAgY29uc3QgdGFnID0gZ2V0VGFnKHNwZWNpbWVuKTtcbiAgICBpZiAoY2hlY2tUYWdnZWQoc3BlY2ltZW4sIHRhZywgY2hlY2spKSB7XG4gICAgICB0YWdNZW1vLnNldChzcGVjaW1lbiwgdGFnKTtcbiAgICAgIHJldHVybiB0YWc7XG4gICAgfVxuICAgIGlmIChjaGVjayAhPT0gaWRlbnRDaGVja2VyKSB7XG4gICAgICBjaGVjayhmYWxzZSwgWGBjYW5ub3QgY2hlY2sgdW5yZWNvZ25pemVkIHRhZyAke3EodGFnKX1gKTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfTtcbiAgaGFyZGVuKGtpbmRPZik7XG5cbiAgLyoqXG4gKiBDaGVja3Mgb25seSByZWNvZ25pemVkIGtpbmRzLCBhbmQgb25seSBpZiB0aGUgc3BlY2ltZW5cbiAqIHBhc3NlcyB0aGUgaW52YXJpYW50cyBhc3NvY2lhdGVkIHdpdGggdGhhdCByZWNvZ25pdGlvbi5cbiAqXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7S2luZH0ga2luZFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgY29uc3QgY2hlY2tLaW5kID0gKHNwZWNpbWVuLCBraW5kLCBjaGVjaykgPT4ge1xuICAgIC8qIGNoZWNrIG51bGwgYW5kIHVuZGVmaW5lZCBhcyBLZXlzKi9cbiAgICBpZiAoc2luZ2xldG9uS2luZHMuaGFzKGtpbmQpKSB7XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgICAgcmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLCBzaW5nbGV0b25LaW5kcy5nZXQoa2luZCksIGNoZWNrKTtcbiAgICB9XG5cbiAgICBjb25zdCByZWFsS2luZCA9IGtpbmRPZihzcGVjaW1lbiwgY2hlY2spO1xuICAgIGlmIChraW5kID09PSByZWFsS2luZCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChjaGVjayAhPT0gaWRlbnRDaGVja2VyKSB7XG4gICAgICAvKiBga2luZGAgYW5kIGByZWFsS2luZGAgY2FuIGJlIGVtYmVkZGVkIHdpdGhvdXQgcXVvdGVzKi9cbiAgICAgIC8qIGJlY2F1c2UgdGhleSBhcmUgZHJhd24gZnJvbSB0aGUgZW51bWVyYXRlZCBjb2xsZWN0aW9uIG9mIGtub3duIEtpbmRzLiovXG4gICAgICBjaGVjayhmYWxzZSwgWGAke2IocmVhbEtpbmQpfSAke3NwZWNpbWVufSAtIE11c3QgYmUgYSAke2Ioa2luZCl9YCk7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICAvKipcbiAqIENoZWNrcyBvbmx5IHJlY29nbml6ZWQga2luZHMsIGFuZCBvbmx5IGlmIHRoZSBzcGVjaW1lblxuICogcGFzc2VzIHRoZSBpbnZhcmlhbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHJlY29nbml0aW9uLlxuICpcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHtLaW5kfSBraW5kXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICBjb25zdCBpc0tpbmQgPSAoc3BlY2ltZW4sIGtpbmQpID0+IGNoZWNrS2luZChzcGVjaW1lbiwga2luZCwgaWRlbnRDaGVja2VyKTtcblxuICAvKipcbiAqIENoZWNrcyBpZiBhIHBhdHRlcm4gbWF0Y2hlcyBvbmx5IGB1bmRlZmluZWRgLlxuICpcbiAqIEBwYXJhbSB7YW55fSBwYXR0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICBjb25zdCBpc1VuZGVmaW5lZFBhdHQgPSBwYXR0ID0+XG4gICAgcGF0dCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgKGlzS2luZChwYXR0LCAnbWF0Y2g6a2luZCcpICYmIHBhdHQucGF5bG9hZCA9PT0gJ3VuZGVmaW5lZCcpO1xuXG4gIC8qKlxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge0tleX0ga2V5QXNQYXR0ZXJuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICBjb25zdCBjaGVja0FzS2V5UGF0dCA9IChzcGVjaW1lbiwga2V5QXNQYXR0ZXJuLCBjaGVjaykgPT4ge1xuICAgIGlmIChpc0tleShzcGVjaW1lbikgJiYga2V5RVEoc3BlY2ltZW4sIGtleUFzUGF0dGVybikpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gKFxuICAgICAgY2hlY2sgIT09IGlkZW50Q2hlY2tlciAmJlxuICAgICAgLyogV2hlbiB0aGUgbWlzbWF0Y2ggb2NjdXJzIGFnYWluc3QgYSBrZXkgdXNlZCBhcyBhIHBhdHRlcm4sKi9cbiAgICAgIC8qIHRoZSBwYXR0ZXJuIHNob3VsZCBzdGlsbCBiZSByZWRhY3RlZC4qL1xuICAgICAgY2hlY2soZmFsc2UsIFhgJHtzcGVjaW1lbn0gLSBNdXN0IGJlOiAke2tleUFzUGF0dGVybn1gKVxuICAgICk7XG4gIH07XG5cbiAgLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gaXNQYXR0ZXJuIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuICAvKiogQHR5cGUge0NoZWNrUGF0dGVybn0gKi9cbiAgY29uc3QgY2hlY2tQYXR0ZXJuID0gKHBhdHQsIGNoZWNrKSA9PiB7XG4gICAgaWYgKGlzS2V5KHBhdHQpKSB7XG4gICAgICAvKiBBbGwga2V5cyBhcmUgcGF0dGVybnMuIEZvciB0aGVzZSwgdGhlIGtleU1lbW8gd2lsbCBkby4qL1xuICAgICAgLyogQWxsIHByaW1pdGl2ZXMgdGhhdCBhcmUgcGF0dGVybnMgYXJlIGFsc28ga2V5cywgd2hpY2ggdGhpcyovXG4gICAgICAvKiBhbHNvIHRha2VzIGNhcmUgb2Ygd2l0aG91dCBtZW1vLiBUaGUgcmVzdCBvZiBvdXIgY2hlY2tpbmcgbG9naWMqL1xuICAgICAgLyogaXMgb25seSBjb25jZXJuZWQgd2l0aCBub24ta2V5IHBhdHRlcm5zLiovXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgaWYgKHBhdHRlcm5NZW1vLmhhcyhwYXR0KSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgY29uc3QgcmVzdWx0ID0gY2hlY2tQYXR0ZXJuSW50ZXJuYWwocGF0dCwgY2hlY2spO1xuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgIHBhdHRlcm5NZW1vLmFkZChwYXR0KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhdHQgLSBrbm93biBub3QgdG8gYmUgYSBrZXksIGFuZCB0aGVyZWZvcmUga25vd25cbiAqIG5vdCB0byBiZSBwcmltaXRpdmUuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICBjb25zdCBjaGVja1BhdHRlcm5JbnRlcm5hbCA9IChwYXR0LCBjaGVjaykgPT4ge1xuICAgIC8qIFB1cnBvc2VseSBwYXJhbGxlbHMgY2hlY2tLZXkuIFRPRE8gcmV1c2UgbW9yZSBsb2dpYyBiZXR3ZWVuIHRoZW0uKi9cbiAgICAvKiBNb3N0IG9mIHRoZSB0ZXh0IG9mIHRoZSBzd2l0Y2ggYmVsb3cgbm90IGRlYWxpbmcgd2l0aCBtYXRjaGVycyBpcyovXG4gICAgLyogZXNzZW50aWFsbHkgaWRlbnRpY2FsLiovXG4gICAgY29uc3QgY2hlY2tJdCA9IGNoaWxkID0+IGNoZWNrUGF0dGVybihjaGlsZCwgY2hlY2spO1xuXG4gICAgY29uc3Qga2luZCA9IGtpbmRPZihwYXR0LCBjaGVjayk7XG4gICAgc3dpdGNoIChraW5kKSB7XG4gICAgICBjYXNlIHVuZGVmaW5lZDoge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5UmVjb3JkJzoge1xuICAgICAgICAvKiBBIGNvcHlSZWNvcmQgaXMgYSBwYXR0ZXJuIGlmZiBhbGwgaXRzIGNoaWxkcmVuIGFyZSovXG4gICAgICAgIC8qIHBhdHRlcm5zKi9cbiAgICAgICAgcmV0dXJuIHZhbHVlcyhwYXR0KS5ldmVyeShjaGVja0l0KTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgLyogQSBjb3B5QXJyYXkgaXMgYSBwYXR0ZXJuIGlmZiBhbGwgaXRzIGNoaWxkcmVuIGFyZSovXG4gICAgICAgIC8qIHBhdHRlcm5zKi9cbiAgICAgICAgcmV0dXJuIHBhdHQuZXZlcnkoY2hlY2tJdCk7XG4gICAgICB9XG4gICAgICBjYXNlICdjb3B5TWFwJzoge1xuICAgICAgICAvKiBBIGNvcHlNYXAncyBrZXlzIGFyZSBrZXlzIGFuZCB0aGVyZWZvcmUgYWxyZWFkeSBrbm93biB0byBiZSovXG4gICAgICAgIC8qIHBhdHRlcm5zLiovXG4gICAgICAgIC8qIEEgY29weU1hcCBpcyBhIHBhdHRlcm4gaWYgaXRzIHZhbHVlcyBhcmUgcGF0dGVybnMuKi9cbiAgICAgICAgcmV0dXJuIGNoZWNrUGF0dGVybihwYXR0LnZhbHVlcywgY2hlY2spO1xuICAgICAgfVxuICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgY2FzZSAncHJvbWlzZSc6IHtcbiAgICAgICAgcmV0dXJuIGNoZWNrKGZhbHNlLCBYYEEgJHtxKGtpbmQpfSBjYW5ub3QgYmUgYSBwYXR0ZXJuYCk7XG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGlmIChtYXliZU1hdGNoSGVscGVyKGtpbmQpICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgWGBBIHBhc3NhYmxlIG9mIGtpbmQgJHtxKGtpbmQpfSBpcyBub3QgYSBwYXR0ZXJuOiAke3BhdHR9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXR0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuICBjb25zdCBpc1BhdHRlcm4gPSBwYXR0ID0+IGNoZWNrUGF0dGVybihwYXR0LCBpZGVudENoZWNrZXIpO1xuXG4gIC8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBwYXR0XG4gKi9cbiAgY29uc3QgYXNzZXJ0UGF0dGVybiA9IHBhdHQgPT4ge1xuICAgIGNoZWNrUGF0dGVybihwYXR0LCBhc3NlcnRDaGVja2VyKTtcbiAgfTtcblxuICAvKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBtYXRjaGVzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4gIC8qKlxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRlcm5cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW2xhYmVsXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgY29uc3QgY2hlY2tNYXRjaGVzID0gKHNwZWNpbWVuLCBwYXR0ZXJuLCBjaGVjaywgbGFiZWwgPSB1bmRlZmluZWQpID0+XG4gICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICBhcHBseUxhYmVsaW5nRXJyb3IoY2hlY2tNYXRjaGVzSW50ZXJuYWwsIFtzcGVjaW1lbiwgcGF0dGVybiwgY2hlY2tdLCBsYWJlbCk7XG5cbiAgLyoqXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgY29uc3QgY2hlY2tNYXRjaGVzSW50ZXJuYWwgPSAoc3BlY2ltZW4sIHBhdHQsIGNoZWNrKSA9PiB7XG4gICAgLyogV29ydGggYmVpbmcgYSBiaXQgdmVyYm9zZSBhbmQgcmVwZXRpdGl2ZSBpbiBvcmRlciB0byBvcHRpbWl6ZSovXG4gICAgY29uc3QgcGF0dGVybktpbmQgPSBraW5kT2YocGF0dCwgY2hlY2spO1xuICAgIGNvbnN0IHNwZWNpbWVuS2luZCA9IGtpbmRPZihzcGVjaW1lbik7IC8qIG1heSBiZSB1bmRlZmluZWQqL1xuICAgIHN3aXRjaCAocGF0dGVybktpbmQpIHtcbiAgICAgIGNhc2UgdW5kZWZpbmVkOiB7XG4gICAgICAgIHJldHVybiBGYWlsYHBhdHRlcm4gZXhwZWN0ZWQ6ICR7cGF0dH1gO1xuICAgICAgfVxuICAgICAgY2FzZSAncHJvbWlzZSc6IHtcbiAgICAgICAgcmV0dXJuIEZhaWxgcHJvbWlzZXMgY2Fubm90IGJlIHBhdHRlcm5zOiAke3BhdHR9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2Vycm9yJzoge1xuICAgICAgICByZXR1cm4gRmFpbGBlcnJvcnMgY2Fubm90IGJlIHBhdHRlcm5zOiAke3BhdHR9YDtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ3VuZGVmaW5lZCc6XG4gICAgICBjYXNlICdudWxsJzpcbiAgICAgIGNhc2UgJ2Jvb2xlYW4nOlxuICAgICAgY2FzZSAnbnVtYmVyJzpcbiAgICAgIGNhc2UgJ2JpZ2ludCc6XG4gICAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgY2FzZSAnc3ltYm9sJzpcbiAgICAgIGNhc2UgJ2J5dGVBcnJheSc6XG4gICAgICBjYXNlICdjb3B5U2V0JzpcbiAgICAgIGNhc2UgJ2NvcHlCYWcnOlxuICAgICAgY2FzZSAncmVtb3RhYmxlJzoge1xuICAgICAgICAvKiBUaGVzZSBraW5kcyBhcmUgbmVjZXNzYXJpbHkga2V5cyovXG4gICAgICAgIHJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbiwgcGF0dCwgY2hlY2spO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weUFycmF5Jzoge1xuICAgICAgICBpZiAoaXNLZXkocGF0dCkpIHtcbiAgICAgICAgICAvKiBUYWtlcyBjYXJlIG9mIHBhdHRlcm5zIHdoaWNoIGFyZSBrZXlzLCBzbyB0aGUgcmVzdCBvZiB0aGlzKi9cbiAgICAgICAgICAvKiBsb2dpYyBjYW4gYXNzdW1lIHBhdHRlcm5zIHRoYXQgYXJlIG5vdCBrZXlzLiovXG4gICAgICAgICAgcmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLCBwYXR0LCBjaGVjayk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHNwZWNpbWVuS2luZCAhPT0gJ2NvcHlBcnJheScpIHtcbiAgICAgICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIFhgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIGEgY29weUFycmF5IHRvIG1hdGNoIGEgY29weUFycmF5IHBhdHRlcm46ICR7cXAoXG4gICAgICAgICAgICAgIHBhdHQsXG4gICAgICAgICAgICApfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB7IGxlbmd0aCB9ID0gcGF0dDtcbiAgICAgICAgaWYgKHNwZWNpbWVuLmxlbmd0aCAhPT0gbGVuZ3RoKSB7XG4gICAgICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICBYYEFycmF5ICR7c3BlY2ltZW59IC0gTXVzdCBiZSBhcyBsb25nIGFzIGNvcHlBcnJheSBwYXR0ZXJuOiAke3FwKFxuICAgICAgICAgICAgICBwYXR0LFxuICAgICAgICAgICAgKX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHBhdHQuZXZlcnkoKHAsIGkpID0+IGNoZWNrTWF0Y2hlcyhzcGVjaW1lbltpXSwgcCwgY2hlY2ssIGkpKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlSZWNvcmQnOiB7XG4gICAgICAgIGlmIChpc0tleShwYXR0KSkge1xuICAgICAgICAgIC8qIFRha2VzIGNhcmUgb2YgcGF0dGVybnMgd2hpY2ggYXJlIGtleXMsIHNvIHRoZSByZXN0IG9mIHRoaXMqL1xuICAgICAgICAgIC8qIGxvZ2ljIGNhbiBhc3N1bWUgcGF0dGVybnMgdGhhdCBhcmUgbm90IGtleXMuKi9cbiAgICAgICAgICByZXR1cm4gY2hlY2tBc0tleVBhdHQoc3BlY2ltZW4sIHBhdHQsIGNoZWNrKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3BlY2ltZW5LaW5kICE9PSAnY29weVJlY29yZCcpIHtcbiAgICAgICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIFhgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIGEgY29weVJlY29yZCB0byBtYXRjaCBhIGNvcHlSZWNvcmQgcGF0dGVybjogJHtxcChcbiAgICAgICAgICAgICAgcGF0dCxcbiAgICAgICAgICAgICl9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8qIFRPRE8gRGV0ZWN0IGFuZCBhY2N1bXVsYXRlIGRpZmZlcmVuY2UgaW4gb25lIHBhc3MuKi9cbiAgICAgICAgLyogUmF0aGVyIHRoYW4gdXNpbmcgdHdvIGNhbGxzIHRvIGBsaXN0RGlmZmVyZW5jZWAgdG8gZGV0ZWN0IGFuZCovXG4gICAgICAgIC8qIHJlcG9ydCBpZiBhbmQgaG93IHRoZXNlIGxpc3RzIGRpZmZlciwgc2luY2UgdGhleSBhcmUgYWxyZWFkeSovXG4gICAgICAgIC8qIGluIHNvcnRlZCBvcmRlciwgd2Ugc2hvdWxkIGluc3RlYWQgdXNlIGFuIGFsZ29yaXRobSBsaWtlKi9cbiAgICAgICAgLyogYGl0ZXJEaXNqb2ludFVuaW9uYCBmcm9tIG1lcmdlLXNvcnQtb3BlcmF0b3JzLmpzKi9cbiAgICAgICAgY29uc3Qgc3BlY2ltZW5OYW1lcyA9IHJlY29yZE5hbWVzKHNwZWNpbWVuKTtcbiAgICAgICAgY29uc3QgcGF0dE5hbWVzID0gcmVjb3JkTmFtZXMocGF0dCk7XG4gICAgICAgIGNvbnN0IG1pc3NpbmcgPSBsaXN0RGlmZmVyZW5jZShwYXR0TmFtZXMsIHNwZWNpbWVuTmFtZXMpO1xuICAgICAgICBpZiAobWlzc2luZy5sZW5ndGggPj0gMSkge1xuICAgICAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgWGAke3NwZWNpbWVufSAtIE11c3QgaGF2ZSBtaXNzaW5nIHByb3BlcnRpZXMgJHtxKG1pc3NpbmcpfWAsXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB1bmV4cGVjdGVkID0gbGlzdERpZmZlcmVuY2Uoc3BlY2ltZW5OYW1lcywgcGF0dE5hbWVzKTtcbiAgICAgICAgaWYgKHVuZXhwZWN0ZWQubGVuZ3RoID49IDEpIHtcbiAgICAgICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIFhgJHtzcGVjaW1lbn0gLSBNdXN0IG5vdCBoYXZlIHVuZXhwZWN0ZWQgcHJvcGVydGllczogJHtxKFxuICAgICAgICAgICAgICB1bmV4cGVjdGVkLFxuICAgICAgICAgICAgKX1gLFxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3Qgc3BlY2ltZW5WYWx1ZXMgPSByZWNvcmRWYWx1ZXMoc3BlY2ltZW4sIHNwZWNpbWVuTmFtZXMpO1xuICAgICAgICBjb25zdCBwYXR0VmFsdWVzID0gcmVjb3JkVmFsdWVzKHBhdHQsIHBhdHROYW1lcyk7XG4gICAgICAgIHJldHVybiBwYXR0TmFtZXMuZXZlcnkoKGxhYmVsLCBpKSA9PlxuICAgICAgICAgIGNoZWNrTWF0Y2hlcyhzcGVjaW1lblZhbHVlc1tpXSwgcGF0dFZhbHVlc1tpXSwgY2hlY2ssIGxhYmVsKSxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlNYXAnOiB7XG4gICAgICAgIGlmIChpc0tleShwYXR0KSkge1xuICAgICAgICAgIC8qIFRha2VzIGNhcmUgb2YgcGF0dGVybnMgd2hpY2ggYXJlIGtleXMsIHNvIHRoZSByZXN0IG9mIHRoaXMqL1xuICAgICAgICAgIC8qIGxvZ2ljIGNhbiBhc3N1bWUgcGF0dGVybnMgdGhhdCBhcmUgbm90IGtleXMuKi9cbiAgICAgICAgICByZXR1cm4gY2hlY2tBc0tleVBhdHQoc3BlY2ltZW4sIHBhdHQsIGNoZWNrKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3BlY2ltZW5LaW5kICE9PSAnY29weU1hcCcpIHtcbiAgICAgICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIFhgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIGEgY29weU1hcCB0byBtYXRjaCBhIGNvcHlNYXAgcGF0dGVybjogJHtxcChcbiAgICAgICAgICAgICAgcGF0dCxcbiAgICAgICAgICAgICl9YCxcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIC8qIENvbXBhcmUga2V5cyBhcyBjb3B5U2V0cyovXG4gICAgICAgIGNvbnN0IHBhdHRLZXlTZXQgPSBjb3B5TWFwS2V5U2V0KHBhdHQpO1xuICAgICAgICBjb25zdCBzcGVjaW1lbktleVNldCA9IGNvcHlNYXBLZXlTZXQoc3BlY2ltZW4pO1xuICAgICAgICBpZiAoIWNoZWNrTWF0Y2hlcyhzcGVjaW1lbktleVNldCwgcGF0dEtleVNldCwgY2hlY2spKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIC8qIENvbXBhcmUgdmFsdWVzIGFzIGNvcHlBcnJheXMgYWZ0ZXIgYXBwbHlpbmcgYSBzaGFyZWQgdG90YWwgb3JkZXIuKi9cbiAgICAgICAgLyogVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSB0aGUgYW50aVJhbmtPcmRlciBzb3J0aW5nIG9mIGVhY2ggbWFwJ3MqL1xuICAgICAgICAvKiBlbnRyaWVzIGlzIGEgcHJlb3JkZXIgdGhhdCBhZG1pdHMgdGllcy4qL1xuICAgICAgICBjb25zdCBwYXR0VmFsdWVzID0gW107XG4gICAgICAgIGNvbnN0IHNwZWNpbWVuVmFsdWVzID0gW107XG4gICAgICAgIGNvbnN0IGVudHJ5UGFpcnMgPSBnZW5lcmF0ZUNvbGxlY3Rpb25QYWlyRW50cmllcyhcbiAgICAgICAgICBwYXR0LFxuICAgICAgICAgIHNwZWNpbWVuLFxuICAgICAgICAgIGdldENvcHlNYXBFbnRyeUFycmF5LFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgKTtcbiAgICAgICAgZm9yIChjb25zdCBbX2tleSwgcGF0dFZhbHVlLCBzcGVjaW1lblZhbHVlXSBvZiBlbnRyeVBhaXJzKSB7XG4gICAgICAgICAgcGF0dFZhbHVlcy5wdXNoKHBhdHRWYWx1ZSk7XG4gICAgICAgICAgc3BlY2ltZW5WYWx1ZXMucHVzaChzcGVjaW1lblZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2hlY2tNYXRjaGVzKGhhcmRlbihzcGVjaW1lblZhbHVlcyksIGhhcmRlbihwYXR0VmFsdWVzKSwgY2hlY2spO1xuICAgICAgfVxuICAgICAgZGVmYXVsdDoge1xuICAgICAgICBjb25zdCBtYXRjaEhlbHBlciA9IG1heWJlTWF0Y2hIZWxwZXIocGF0dGVybktpbmQpO1xuICAgICAgICBpZiAobWF0Y2hIZWxwZXIpIHtcbiAgICAgICAgICByZXR1cm4gbWF0Y2hIZWxwZXIuY2hlY2tNYXRjaGVzKHNwZWNpbWVuLCBwYXR0LnBheWxvYWQsIGNoZWNrKTtcbiAgICAgICAgfVxuICAgICAgICB0aHJvdyBGYWlsYGludGVybmFsOiBzaG91bGQgaGF2ZSByZWNvZ25pemVkICR7cShwYXR0ZXJuS2luZCl9IGA7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG4gIGNvbnN0IG1hdGNoZXMgPSAoc3BlY2ltZW4sIHBhdHQpID0+XG4gICAgY2hlY2tNYXRjaGVzKHNwZWNpbWVuLCBwYXR0LCBpZGVudENoZWNrZXIpO1xuXG4gIC8qKlxuICogUmV0dXJuaW5nIG5vcm1hbGx5IGluZGljYXRlcyBzdWNjZXNzLiBNYXRjaCBmYWlsdXJlIGlzIGluZGljYXRlZCBieVxuICogdGhyb3dpbmcuXG4gKlxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gW2xhYmVsXVxuICovXG4gIGNvbnN0IG11c3RNYXRjaCA9IChzcGVjaW1lbiwgcGF0dCwgbGFiZWwgPSB1bmRlZmluZWQpID0+IHtcbiAgICBsZXQgaW5uZXJFcnJvcjtcbiAgICB0cnkge1xuICAgICAgaWYgKGNoZWNrTWF0Y2hlcyhzcGVjaW1lbiwgcGF0dCwgaWRlbnRDaGVja2VyLCB1bmRlZmluZWQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcikge1xuICAgICAgaW5uZXJFcnJvciA9IGVyO1xuICAgIH1cbiAgICAvKiBzaG91bGQgb25seSB0aHJvdyovXG4gICAgY2hlY2tNYXRjaGVzKHNwZWNpbWVuLCBwYXR0LCBhc3NlcnRDaGVja2VyLCBsYWJlbCk7XG4gICAgY29uc3Qgb3V0ZXJFcnJvciA9IG1ha2VFcnJvcihcbiAgICAgIFhgaW50ZXJuYWw6ICR7bGFiZWx9OiBpbmNvbnNpc3RlbnQgcGF0dGVybiBtYXRjaDogJHtxcChwYXR0KX1gLFxuICAgICk7XG4gICAgaWYgKGlubmVyRXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYW5ub3RhdGVFcnJvcihvdXRlckVycm9yLCBYYGNhdXNlZCBieSAke2lubmVyRXJyb3J9YCk7XG4gICAgfVxuICAgIHRocm93IG91dGVyRXJyb3I7XG4gIH07XG5cbiAgLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gZ2V0UmFua0NvdmVyIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuICAvKiogQHR5cGUge0dldFJhbmtDb3Zlcn0gKi9cbiAgY29uc3QgZ2V0UmFua0NvdmVyID0gKHBhdHQsIGVuY29kZVBhc3NhYmxlKSA9PiB7XG4gICAgaWYgKGlzS2V5KHBhdHQpKSB7XG4gICAgICBjb25zdCBlbmNvZGVkID0gZW5jb2RlUGFzc2FibGUocGF0dCk7XG4gICAgICBpZiAoZW5jb2RlZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHJldHVybiBbZW5jb2RlZCwgYCR7ZW5jb2RlZH1+YF07XG4gICAgICB9XG4gICAgfVxuICAgIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHBhdHQpO1xuICAgIHN3aXRjaCAocGFzc1N0eWxlKSB7XG4gICAgICBjYXNlICdjb3B5QXJyYXknOiB7XG4gICAgICAgIC8qIFhYWCB0aGlzIGRvZXNuJ3QgZ2V0IGFsb25nIHdpdGggdGhlIHdvcmxkIG9mIGNvdmVyID09PSBwYWlyIG9mKi9cbiAgICAgICAgLyogc3RyaW5ncy4gSW4gdGhlIG1lYW50aW1lLCBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgd2hpY2gqL1xuICAgICAgICAvKiByZXR1cm5zIGEgY292ZXIgdGhhdCBjb3ZlcnMgYWxsIGNvcHlBcnJheXMuKi9cbiAgICAgICAgLyoqL1xuICAgICAgICAvKiBjb25zdCByYW5rQ292ZXJzID0gcGF0dC5tYXAocCA9PiBnZXRSYW5rQ292ZXIocCwgZW5jb2RlUGFzc2FibGUpKTsqL1xuICAgICAgICAvKiByZXR1cm4gaGFyZGVuKFsqL1xuICAgICAgICAvKiByYW5rQ292ZXJzLm1hcCgoW2xlZnQsIF9yaWdodF0pID0+IGxlZnQpLCovXG4gICAgICAgIC8qIHJhbmtDb3ZlcnMubWFwKChbX2xlZnQsIHJpZ2h0XSkgPT4gcmlnaHQpLCovXG4gICAgICAgIC8qIF0pOyovXG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgY2FzZSAnY29weVJlY29yZCc6IHtcbiAgICAgICAgLyogWFhYIHRoaXMgZG9lc24ndCBnZXQgYWxvbmcgd2l0aCB0aGUgd29ybGQgb2YgY292ZXIgPT09IHBhaXIgb2YqL1xuICAgICAgICAvKiBzdHJpbmdzLiBJbiB0aGUgbWVhbnRpbWUsIGZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCB3aGljaCovXG4gICAgICAgIC8qIHJldHVybnMgYSBjb3ZlciB0aGF0IGNvdmVycyBhbGwgY29weVJlY29yZHMuKi9cbiAgICAgICAgLyoqL1xuICAgICAgICAvKiBjb25zdCBwYXR0S2V5cyA9IG93bktleXMocGF0dCk7Ki9cbiAgICAgICAgLyogY29uc3QgcGF0dEVudHJpZXMgPSBoYXJkZW4ocGF0dEtleXMubWFwKGtleSA9PiBba2V5LCBwYXR0W2tleV1dKSk7Ki9cbiAgICAgICAgLyogY29uc3QgW2xlZnRFbnRyaWVzTGltaXQsIHJpZ2h0RW50cmllc0xpbWl0XSA9Ki9cbiAgICAgICAgLyogZ2V0UmFua0NvdmVyKHBhdHRFbnRyaWVzKTsqL1xuICAgICAgICAvKiByZXR1cm4gaGFyZGVuKFsqL1xuICAgICAgICAvKiBmcm9tVW5pcXVlRW50cmllcyhsZWZ0RW50cmllc0xpbWl0KSwqL1xuICAgICAgICAvKiBmcm9tVW5pcXVlRW50cmllcyhyaWdodEVudHJpZXNMaW1pdCksKi9cbiAgICAgICAgLyogXSk7Ki9cbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBjYXNlICd0YWdnZWQnOiB7XG4gICAgICAgIGNvbnN0IHRhZyA9IGdldFRhZyhwYXR0KTtcbiAgICAgICAgY29uc3QgbWF0Y2hIZWxwZXIgPSBtYXliZU1hdGNoSGVscGVyKHRhZyk7XG4gICAgICAgIGlmIChtYXRjaEhlbHBlcikge1xuICAgICAgICAgIC8qIEJ1cmllZCBoZXJlIGlzIHRoZSBpbXBvcnRhbnQgY2FzZSwgd2hlcmUgd2UgcHJvY2VzcyovXG4gICAgICAgICAgLyogdGhlIHZhcmlvdXMgcGF0dGVybk5vZGVzKi9cbiAgICAgICAgICByZXR1cm4gbWF0Y2hIZWxwZXIuZ2V0UmFua0NvdmVyKHBhdHQucGF5bG9hZCwgZW5jb2RlUGFzc2FibGUpO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodGFnKSB7XG4gICAgICAgICAgY2FzZSAnY29weVNldCc6IHtcbiAgICAgICAgICAgIC8qIFhYWCB0aGlzIGRvZXNuJ3QgZ2V0IGFsb25nIHdpdGggdGhlIHdvcmxkIG9mIGNvdmVyID09PSBwYWlyIG9mKi9cbiAgICAgICAgICAgIC8qIHN0cmluZ3MuIEluIHRoZSBtZWFudGltZSwgZmFsbCB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IHdoaWNoKi9cbiAgICAgICAgICAgIC8qIHJldHVybnMgYSBjb3ZlciB0aGF0IGNvdmVycyBhbGwgY29weVNldHMuKi9cbiAgICAgICAgICAgIC8qKi9cbiAgICAgICAgICAgIC8qIC8vIFNob3VsZCBhbHJlYWR5IGJlIHZhbGlkYXRlZCBieSBjaGVja1BhdHRlcm4uIEJ1dCBiZWNhdXNlIHRoaXMqL1xuICAgICAgICAgICAgLyogLy8gaXMgYSBjaGVjayB0aGF0IG1heSBsb29zZW4gb3ZlciB0aW1lLCB3ZSBhbHNvIGFzc2VydCovXG4gICAgICAgICAgICAvKiAvLyBldmVyeXdoZXJlIHdlIHN0aWxsIHJlbHkgb24gdGhlIHJlc3RyaWN0aW9uLiovXG4gICAgICAgICAgICAvKiBgYGBqcyovXG4gICAgICAgICAgICAvKiBwYXR0LnBheWxvYWQubGVuZ3RoID09PSAxIHx8Ki9cbiAgICAgICAgICAgIC8qIEZhaWxgTm9uLXNpbmdsZXRvbiBjb3B5U2V0cyB3aXRoIG1hdGNoZXIgbm90IHlldCBpbXBsZW1lbnRlZDogJHtwYXR0fWA7Ki9cbiAgICAgICAgICAgIC8qIGBgYCovXG4gICAgICAgICAgICAvKiovXG4gICAgICAgICAgICAvKiBjb25zdCBbbGVmdEVsZW1lbnRMaW1pdCwgcmlnaHRFbGVtZW50TGltaXRdID0gZ2V0UmFua0NvdmVyKCovXG4gICAgICAgICAgICAvKiBwYXR0LnBheWxvYWRbMF0sKi9cbiAgICAgICAgICAgIC8qICk7Ki9cbiAgICAgICAgICAgIC8qIHJldHVybiBoYXJkZW4oWyovXG4gICAgICAgICAgICAvKiBtYWtlQ29weVNldChbbGVmdEVsZW1lbnRMaW1pdF0pLCovXG4gICAgICAgICAgICAvKiBtYWtlQ29weVNldChbcmlnaHRFbGVtZW50TGltaXRdKSwqL1xuICAgICAgICAgICAgLyogXSk7Ki9cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXNlICdjb3B5TWFwJzoge1xuICAgICAgICAgICAgLyogWFhYIHRoaXMgZG9lc24ndCBnZXQgYWxvbmcgd2l0aCB0aGUgd29ybGQgb2YgY292ZXIgPT09IHBhaXIgb2YqL1xuICAgICAgICAgICAgLyogc3RyaW5ncy4gSW4gdGhlIG1lYW50aW1lLCBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgd2hpY2gqL1xuICAgICAgICAgICAgLyogcmV0dXJucyBhIGNvdmVyIHRoYXQgY292ZXJzIGFsbCBjb3B5TWFwcy4qL1xuICAgICAgICAgICAgLyoqL1xuICAgICAgICAgICAgLyogLy8gQSBtYXRjaGluZyBjb3B5TWFwIG11c3QgaGF2ZSB0aGUgc2FtZSBrZXlzLCBvciBhdCBtb3N0IG9uZSovXG4gICAgICAgICAgICAvKiAvLyBub24ta2V5IGtleSBwYXR0ZXJuLiBUaHVzIHdlIGNhbiBhc3N1bWUgdGhhdCB2YWx1ZSBwb3NpdGlvbnMqL1xuICAgICAgICAgICAgLyogLy8gbWF0Y2ggMS10by0xLiovXG4gICAgICAgICAgICAvKiAvLyovXG4gICAgICAgICAgICAvKiAvLyBUT0RPIEkgbWF5IGJlIG92ZXJsb29raW5nIHRoYXQgdGhlIGxlc3MgcHJlY2lzZSByYW5rT3JkZXIqL1xuICAgICAgICAgICAgLyogLy8gZXF1aXZhbGVuY2UgY2xhc3MgbWF5IGNhdXNlIHZhbHVlcyB0byBiZSBvdXQgb2Ygb3JkZXIsKi9cbiAgICAgICAgICAgIC8qIC8vIG1ha2luZyB0aGlzIHJhbmtDb3ZlciBub3QgYWN0dWFsbHkgY292ZXIuIEluIHRoYXQgY2FzZSwgZm9yKi9cbiAgICAgICAgICAgIC8qIC8vIGFsbCB0aGUgdmFsdWVzIGZvciBrZXlzIGF0IHRoZSBzYW1lIHJhbmssIHdlIHNob3VsZCB1bmlvbiB0aGVpciovXG4gICAgICAgICAgICAvKiAvLyByYW5rIGNvdmVycy4gVE9ETyBQT1NTSUJMRSBTSUxFTlQgQ09SUkVDVE5FU1MgQlVHKi9cbiAgICAgICAgICAgIC8qIC8vKi9cbiAgICAgICAgICAgIC8qIC8vIElmIHRoaXMgaXMgYSBidWcsIGl0IHByb2JhYmx5IGFmZmVjdHMgdGhlIGdldFJhbmtDb3ZlciovXG4gICAgICAgICAgICAvKiAvLyBjYXNlcyBvZiBtYXRjaExURUhlbHBlciBhbmQgbWF0Y2hHVEVIZWxwZXIgb24gY29weU1hcCBhcyovXG4gICAgICAgICAgICAvKiAvLyB3ZWxsLiBTZWUgbWFrZUNvcHlNYXAgZm9yIGFuIGlkZWEgb24gZml4aW5nKi9cbiAgICAgICAgICAgIC8qIC8vIHRoaXMgYnVnLiovXG4gICAgICAgICAgICAvKiBjb25zdCBbbGVmdFBheWxvYWRMaW1pdCwgcmlnaHRQYXlsb2FkTGltaXRdID0gZ2V0UmFua0NvdmVyKCovXG4gICAgICAgICAgICAvKiBwYXR0LnBheWxvYWQsKi9cbiAgICAgICAgICAgIC8qIGVuY29kZVBhc3NhYmxlLCovXG4gICAgICAgICAgICAvKiApOyovXG4gICAgICAgICAgICAvKiByZXR1cm4gaGFyZGVuKFsqL1xuICAgICAgICAgICAgLyogbWFrZVRhZ2dlZCgnY29weU1hcCcsIGxlZnRQYXlsb2FkTGltaXQpLCovXG4gICAgICAgICAgICAvKiBtYWtlVGFnZ2VkKCdjb3B5TWFwJywgcmlnaHRQYXlsb2FkTGltaXQpLCovXG4gICAgICAgICAgICAvKiBdKTsqL1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICAgIGJyZWFrOyAvKiBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdCovXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrOyAvKiBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdCovXG4gICAgICB9XG4gICAgICBkZWZhdWx0OiB7XG4gICAgICAgIGJyZWFrOyAvKiBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdCovXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBnZXRQYXNzU3R5bGVDb3ZlcihwYXNzU3R5bGUpO1xuICB9O1xuXG4gIC8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBhcnJheVxuICogQHBhcmFtIHtQYXR0ZXJufSBwYXR0XG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcGFyYW0ge3N0cmluZ30gW2xhYmVsUHJlZml4XVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgY29uc3QgYXJyYXlFdmVyeU1hdGNoUGF0dGVybiA9IChhcnJheSwgcGF0dCwgY2hlY2ssIGxhYmVsUHJlZml4ID0gJycpID0+IHtcbiAgICBpZiAoaXNLaW5kKHBhdHQsICdtYXRjaDphbnknKSkge1xuICAgICAgLyogaWYgdGhlIHBhdHRlcm4gaXMgTS5hbnkoKSwgd2Uga25vdyBpdHMgdHJ1ZSovXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5LmV2ZXJ5KChlbCwgaSkgPT5cbiAgICAgIGNoZWNrTWF0Y2hlcyhlbCwgcGF0dCwgY2hlY2ssIGAke2xhYmVsUHJlZml4fVske2l9XWApLFxuICAgICk7XG4gIH07XG5cbiAgLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gTWF0Y2ggSGVscGVycyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaEFueUhlbHBlciA9IEZhcignbWF0Y2g6YW55IGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChfc3BlY2ltZW4sIF9tYXRjaGVyUGF5bG9hZCwgX2NoZWNrKSA9PiB0cnVlLFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChtYXRjaGVyUGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBtYXRjaGVyUGF5bG9hZCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICBjaGVjayhmYWxzZSwgWGBtYXRjaDphbnkgcGF5bG9hZDogJHttYXRjaGVyUGF5bG9hZH0gLSBNdXN0IGJlIHVuZGVmaW5lZGApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoX21hdGNoUGF5bG9hZCwgX2VuY29kZVBhc3NhYmxlKSA9PiBbJycsICd7J10sXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoQW5kSGVscGVyID0gRmFyKCdtYXRjaDphbmQgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBwYXR0cywgY2hlY2spID0+IHtcbiAgICAgIHJldHVybiBwYXR0cy5ldmVyeShwYXR0ID0+IGNoZWNrTWF0Y2hlcyhzcGVjaW1lbiwgcGF0dCwgY2hlY2spKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChhbGxlZ2VkUGF0dHMsIGNoZWNrKSA9PiB7XG4gICAgICBjb25zdCBjaGVja0l0ID0gcGF0dCA9PiBjaGVja1BhdHRlcm4ocGF0dCwgY2hlY2spO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgKHBhc3NTdHlsZU9mKGFsbGVnZWRQYXR0cykgPT09ICdjb3B5QXJyYXknIHx8XG4gICAgICAgICAgY2hlY2soZmFsc2UsIFhgTmVlZHMgYXJyYXkgb2Ygc3ViLXBhdHRlcm5zOiAke3FwKGFsbGVnZWRQYXR0cyl9YCkpICYmXG4gICAgICAgIGFsbGVnZWRQYXR0cy5ldmVyeShjaGVja0l0KVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgZ2V0UmFua0NvdmVyOiAocGF0dHMsIGVuY29kZVBhc3NhYmxlKSA9PlxuICAgICAgaW50ZXJzZWN0UmFua0NvdmVycyhcbiAgICAgICAgY29tcGFyZVJhbmssXG4gICAgICAgIHBhdHRzLm1hcChwID0+IGdldFJhbmtDb3ZlcihwLCBlbmNvZGVQYXNzYWJsZSkpLFxuICAgICAgKSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hPckhlbHBlciA9IEZhcignbWF0Y2g6b3IgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBwYXR0cywgY2hlY2spID0+IHtcbiAgICAgIGNvbnN0IHsgbGVuZ3RoIH0gPSBwYXR0cztcbiAgICAgIGlmIChsZW5ndGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgIFhgJHtzcGVjaW1lbn0gLSBubyBwYXR0ZXJuIGRpc2p1bmN0cyB0byBtYXRjaDogJHtxcChwYXR0cyl9YCxcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIC8qIFNwZWNpYWwgY2FzZSBkaXNqdW5jdGlvbnMgcmVwcmVzZW50aW5nIGEgc2luZ2xlIG9wdGlvbmFsIHBhdHRlcm4gZm9yKi9cbiAgICAgIC8qIGJldHRlciBlcnJvciBtZXNzYWdlcy4qL1xuICAgICAgY29uc3QgYmluYXJ5VW5kZWZQYXR0SWR4ID1cbiAgICAgICAgcGF0dHMubGVuZ3RoID09PSAyXG4gICAgICAgICAgPyBwYXR0cy5maW5kSW5kZXgocGF0dCA9PiBpc1VuZGVmaW5lZFBhdHQocGF0dCkpXG4gICAgICAgICAgOiAtMTtcbiAgICAgIGlmIChiaW5hcnlVbmRlZlBhdHRJZHggIT09IC0xKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgc3BlY2ltZW4gPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgIGNoZWNrTWF0Y2hlcyhzcGVjaW1lbiwgcGF0dHNbMSAtIGJpbmFyeVVuZGVmUGF0dElkeF0sIGNoZWNrKVxuICAgICAgICApO1xuICAgICAgfVxuICAgICAgaWYgKHBhdHRzLnNvbWUocGF0dCA9PiBtYXRjaGVzKHNwZWNpbWVuLCBwYXR0KSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gY2hlY2soZmFsc2UsIFhgJHtzcGVjaW1lbn0gLSBNdXN0IG1hdGNoIG9uZSBvZiAke3FwKHBhdHRzKX1gKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IG1hdGNoQW5kSGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAocGF0dHMsIGVuY29kZVBhc3NhYmxlKSA9PlxuICAgICAgdW5pb25SYW5rQ292ZXJzKFxuICAgICAgICBjb21wYXJlUmFuayxcbiAgICAgICAgcGF0dHMubWFwKHAgPT4gZ2V0UmFua0NvdmVyKHAsIGVuY29kZVBhc3NhYmxlKSksXG4gICAgICApLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaE5vdEhlbHBlciA9IEZhcignbWF0Y2g6bm90IGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgcGF0dCwgY2hlY2spID0+IHtcbiAgICAgIGlmIChtYXRjaGVzKHNwZWNpbWVuLCBwYXR0KSkge1xuICAgICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgWGAke3NwZWNpbWVufSAtIE11c3QgZmFpbCBuZWdhdGVkIHBhdHRlcm46ICR7cXAocGF0dCl9YCxcbiAgICAgICAgKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogY2hlY2tQYXR0ZXJuLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoX3BhdHQsIF9lbmNvZGVQYXNzYWJsZSkgPT4gWycnLCAneyddLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaFNjYWxhckhlbHBlciA9IEZhcignbWF0Y2g6c2NhbGFyIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgX21hdGNoZXJQYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrU2NhbGFyS2V5KHNwZWNpbWVuLCBjaGVjayksXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogbWF0Y2hBbnlIZWxwZXIuY2hlY2tJc1dlbGxGb3JtZWQsXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfbWF0Y2hQYXlsb2FkLCBfZW5jb2RlUGFzc2FibGUpID0+IFsnYScsICd6fiddLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaEtleUhlbHBlciA9IEZhcignbWF0Y2g6a2V5IGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgX21hdGNoZXJQYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrS2V5KHNwZWNpbWVuLCBjaGVjayksXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogbWF0Y2hBbnlIZWxwZXIuY2hlY2tJc1dlbGxGb3JtZWQsXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfbWF0Y2hQYXlsb2FkLCBfZW5jb2RlUGFzc2FibGUpID0+IFsnYScsICd6fiddLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaFBhdHRlcm5IZWxwZXIgPSBGYXIoJ21hdGNoOnBhdHRlcm4gaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBfbWF0Y2hlclBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tQYXR0ZXJuKHNwZWNpbWVuLCBjaGVjayksXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogbWF0Y2hBbnlIZWxwZXIuY2hlY2tJc1dlbGxGb3JtZWQsXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfbWF0Y2hQYXlsb2FkLCBfZW5jb2RlUGFzc2FibGUpID0+IFsnYScsICd6fiddLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaEtpbmRIZWxwZXIgPSBGYXIoJ21hdGNoOmtpbmQgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogY2hlY2tLaW5kLFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChhbGxlZ2VkS2V5S2luZCwgY2hlY2spID0+XG4gICAgICB0eXBlb2YgYWxsZWdlZEtleUtpbmQgPT09ICdzdHJpbmcnIHx8XG4gICAgICBjaGVjayhcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIFhgbWF0Y2g6a2luZDogcGF5bG9hZDogJHthbGxlZ2VkS2V5S2luZH0gLSBBIGtpbmQgbmFtZSBtdXN0IGJlIGEgc3RyaW5nYCxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6IChraW5kLCBfZW5jb2RlUGFzc2FibGUpID0+IHtcbiAgICAgIGxldCBzdHlsZTtcbiAgICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgICBjYXNlICdjb3B5U2V0JzpcbiAgICAgICAgY2FzZSAnY29weU1hcCc6IHtcbiAgICAgICAgICBzdHlsZSA9ICd0YWdnZWQnO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgICBzdHlsZSA9IGtpbmQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBnZXRQYXNzU3R5bGVDb3ZlcihzdHlsZSk7XG4gICAgfSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hUYWdnZWRIZWxwZXIgPSBGYXIoJ21hdGNoOnRhZ2dlZCBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIFt0YWdQYXR0LCBwYXlsb2FkUGF0dF0sIGNoZWNrKSA9PiB7XG4gICAgICBpZiAocGFzc1N0eWxlT2Yoc3BlY2ltZW4pICE9PSAndGFnZ2VkJykge1xuICAgICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgWGBFeHBlY3RlZCB0YWdnZWQgb2JqZWN0LCBub3QgJHtxKFxuICAgICAgICAgICAgcGFzc1N0eWxlT2Yoc3BlY2ltZW4pLFxuICAgICAgICAgICl9OiAke3NwZWNpbWVufWAsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjaGVja01hdGNoZXMoZ2V0VGFnKHNwZWNpbWVuKSwgdGFnUGF0dCwgY2hlY2ssICd0YWcnKSAmJlxuICAgICAgICBjaGVja01hdGNoZXMoc3BlY2ltZW4ucGF5bG9hZCwgcGF5bG9hZFBhdHQsIGNoZWNrLCAncGF5bG9hZCcpXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tNYXRjaGVzKFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBoYXJkZW4oW01NLnBhdHRlcm4oKSwgTU0ucGF0dGVybigpXSksXG4gICAgICAgIGNoZWNrLFxuICAgICAgICAnbWF0Y2g6dGFnZ2VkIHBheWxvYWQnLFxuICAgICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKF9raW5kLCBfZW5jb2RlUGFzc2FibGUpID0+IGdldFBhc3NTdHlsZUNvdmVyKCd0YWdnZWQnKSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hCaWdpbnRIZWxwZXIgPSBGYXIoJ21hdGNoOmJpZ2ludCBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIFtsaW1pdHMgPSB1bmRlZmluZWRdLCBjaGVjaykgPT4ge1xuICAgICAgY29uc3QgeyBkZWNpbWFsRGlnaXRzTGltaXQgfSA9IGxpbWl0KGxpbWl0cyk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjaGVja0tpbmQoc3BlY2ltZW4sICdiaWdpbnQnLCBjaGVjaykgJiZcbiAgICAgICAgY2hlY2tEZWNpbWFsRGlnaXRzTGltaXQoc3BlY2ltZW4sIGRlY2ltYWxEaWdpdHNMaW1pdCwgY2hlY2spXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGhhcmRlbihbXSksXG4gICAgICAgIGNoZWNrLFxuICAgICAgICAnbWF0Y2g6YmlnaW50IHBheWxvYWQnLFxuICAgICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKF9tYXRjaFBheWxvYWQsIF9lbmNvZGVQYXNzYWJsZSkgPT5cbiAgICAgIGdldFBhc3NTdHlsZUNvdmVyKCdiaWdpbnQnKSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hOYXRIZWxwZXIgPSBGYXIoJ21hdGNoOm5hdCBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIFtsaW1pdHMgPSB1bmRlZmluZWRdLCBjaGVjaykgPT4ge1xuICAgICAgY29uc3QgeyBkZWNpbWFsRGlnaXRzTGltaXQgfSA9IGxpbWl0KGxpbWl0cyk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjaGVja0tpbmQoc3BlY2ltZW4sICdiaWdpbnQnLCBjaGVjaykgJiZcbiAgICAgICAgY2hlY2soXG4gICAgICAgICAgLyoqIEB0eXBlIHtiaWdpbnR9ICovIChzcGVjaW1lbikgPj0gMG4sXG4gICAgICAgICAgWGAke3NwZWNpbWVufSAtIE11c3QgYmUgbm9uLW5lZ2F0aXZlYCxcbiAgICAgICAgKSAmJlxuICAgICAgICBjaGVja0RlY2ltYWxEaWdpdHNMaW1pdChzcGVjaW1lbiwgZGVjaW1hbERpZ2l0c0xpbWl0LCBjaGVjaylcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAocGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgaGFyZGVuKFtdKSxcbiAgICAgICAgY2hlY2ssXG4gICAgICAgICdtYXRjaDpuYXQgcGF5bG9hZCcsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoX21hdGNoUGF5bG9hZCwgX2VuY29kZVBhc3NhYmxlKSA9PlxuICAgICAgLyogVE9ETyBDb3VsZCBiZSBtb3JlIHByZWNpc2UqL1xuICAgICAgZ2V0UGFzc1N0eWxlQ292ZXIoJ2JpZ2ludCcpLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaFN0cmluZ0hlbHBlciA9IEZhcignbWF0Y2g6c3RyaW5nIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChzcGVjaW1lbiwgW2xpbWl0cyA9IHVuZGVmaW5lZF0sIGNoZWNrKSA9PiB7XG4gICAgICBjb25zdCB7IHN0cmluZ0xlbmd0aExpbWl0IH0gPSBsaW1pdChsaW1pdHMpO1xuICAgICAgLyogcHJldHRpZXItaWdub3JlKi9cbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNoZWNrS2luZChzcGVjaW1lbiwgJ3N0cmluZycsIGNoZWNrKSAmJlxuICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAZW5kby9yZXN0cmljdC1jb21wYXJpc29uLW9wZXJhbmRzKi9cbiAgICAgICAgICAoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChzcGVjaW1lbikubGVuZ3RoIDw9IHN0cmluZ0xlbmd0aExpbWl0IHx8XG4gICAgICAgICAgY2hlY2soXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIFhgc3RyaW5nICR7c3BlY2ltZW59IG11c3Qgbm90IGJlIGJpZ2dlciB0aGFuICR7c3RyaW5nTGVuZ3RoTGltaXR9YCxcbiAgICAgICAgICApKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBoYXJkZW4oW10pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOnN0cmluZyBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6IChfbWF0Y2hQYXlsb2FkLCBfZW5jb2RlUGFzc2FibGUpID0+XG4gICAgICBnZXRQYXNzU3R5bGVDb3Zlcignc3RyaW5nJyksXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoU3ltYm9sSGVscGVyID0gRmFyKCdtYXRjaDpzeW1ib2wgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBbbGltaXRzID0gdW5kZWZpbmVkXSwgY2hlY2spID0+IHtcbiAgICAgIGNvbnN0IHsgc3ltYm9sTmFtZUxlbmd0aExpbWl0IH0gPSBsaW1pdChsaW1pdHMpO1xuICAgICAgaWYgKCFjaGVja0tpbmQoc3BlY2ltZW4sICdzeW1ib2wnLCBjaGVjaykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3ltYm9sTmFtZSA9IG5hbWVGb3JQYXNzYWJsZVN5bWJvbChzcGVjaW1lbik7XG5cbiAgICAgIGlmICh0eXBlb2Ygc3ltYm9sTmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhyb3cgRmFpbGBpbnRlcm5hbDogUGFzc2FibGUgc3ltYm9sICR7c3BlY2ltZW59IG11c3QgaGF2ZSBhIHBhc3NhYmxlIG5hbWVgO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICBzeW1ib2xOYW1lLmxlbmd0aCA8PSBzeW1ib2xOYW1lTGVuZ3RoTGltaXQsXG4gICAgICAgIFhgU3ltYm9sIG5hbWUgJHtxKFxuICAgICAgICAgIHN5bWJvbE5hbWUsXG4gICAgICAgICl9IG11c3Qgbm90IGJlIGJpZ2dlciB0aGFuICR7c3ltYm9sTmFtZUxlbmd0aExpbWl0fWAsXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGhhcmRlbihbXSksXG4gICAgICAgIGNoZWNrLFxuICAgICAgICAnbWF0Y2g6c3ltYm9sIHBheWxvYWQnLFxuICAgICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKF9tYXRjaFBheWxvYWQsIF9lbmNvZGVQYXNzYWJsZSkgPT5cbiAgICAgIGdldFBhc3NTdHlsZUNvdmVyKCdzeW1ib2wnKSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hSZW1vdGFibGVIZWxwZXIgPSBGYXIoJ21hdGNoOnJlbW90YWJsZSBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIHJlbW90YWJsZURlc2MsIGNoZWNrKSA9PiB7XG4gICAgICBpZiAoaXNLaW5kKHNwZWNpbWVuLCAncmVtb3RhYmxlJykpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICBpZiAoY2hlY2sgPT09IGlkZW50Q2hlY2tlcikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCB7IGxhYmVsIH0gPSByZW1vdGFibGVEZXNjO1xuICAgICAgY29uc3QgcGFzc1N0eWxlID0gcGFzc1N0eWxlT2Yoc3BlY2ltZW4pO1xuICAgICAgY29uc3Qga2luZERldGFpbHMgPVxuICAgICAgICBwYXNzU3R5bGUgIT09ICd0YWdnZWQnXG4gICAgICAgICAgPyAvKiBQYXNzIHN0eWxlIGNhbiBiZSBlbWJlZGRlZCBpbiBkZXRhaWxzIHdpdGhvdXQgcXVvdGVzLiovXG4gICAgICAgICAgICBiKHBhc3NTdHlsZSlcbiAgICAgICAgICA6IC8qIFRhZyBtdXN0IGJlIHF1b3RlZCBiZWNhdXNlIGl0IGlzIHBvdGVudGlhbGx5IGF0dGFja2VyLWNvbnRyb2xsZWQqL1xuICAgICAgICAgICAgLyogKHVubGlrZSBga2luZE9mYCwgdGhpcyBkb2VzIG5vdCByZWplY3QgdW5yZWNvZ25pemVkIHRhZ3MpLiovXG4gICAgICAgICAgICBxKGdldFRhZyhzcGVjaW1lbikpO1xuICAgICAgcmV0dXJuIGNoZWNrKFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgLyogYGxhYmVsYCBjYW4gYmUgZW1iZWRkZWQgd2l0aG91dCBxdW90ZXMgYmVjYXVzZSBpdCBpcyBwcm92aWRlZCBieSovXG4gICAgICAgIC8qIGxvY2FsIGNvZGUgbGlrZSBgTS5yZW1vdGFibGUoXCIuLi5cIilgLiovXG4gICAgICAgIFhgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIGEgcmVtb3RhYmxlICR7YihsYWJlbCl9LCBub3QgJHtraW5kRGV0YWlsc31gLFxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChhbGxlZ2VkUmVtb3RhYmxlRGVzYywgY2hlY2spID0+XG4gICAgICBjaGVja01hdGNoZXMoXG4gICAgICAgIGFsbGVnZWRSZW1vdGFibGVEZXNjLFxuICAgICAgICBoYXJkZW4oeyBsYWJlbDogTU0uc3RyaW5nKCkgfSksXG4gICAgICAgIGNoZWNrLFxuICAgICAgICAnbWF0Y2g6cmVtb3RhYmxlIHBheWxvYWQnLFxuICAgICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogKF9yZW1vdGFibGVEZXNjLCBfZW5jb2RlUGFzc2FibGUpID0+XG4gICAgICBnZXRQYXNzU3R5bGVDb3ZlcigncmVtb3RhYmxlJyksXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoTFRFSGVscGVyID0gRmFyKCdtYXRjaDpsdGUgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCByaWdodE9wZXJhbmQsIGNoZWNrKSA9PlxuICAgICAga2V5TFRFKHNwZWNpbWVuLCByaWdodE9wZXJhbmQpIHx8XG4gICAgICBjaGVjayhmYWxzZSwgWGAke3NwZWNpbWVufSAtIE11c3QgYmUgPD0gJHtyaWdodE9wZXJhbmR9YCksXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogY2hlY2tLZXksXG5cbiAgICBnZXRSYW5rQ292ZXI6IChyaWdodE9wZXJhbmQsIGVuY29kZVBhc3NhYmxlKSA9PiB7XG4gICAgICBjb25zdCBwYXNzU3R5bGUgPSBwYXNzU3R5bGVPZihyaWdodE9wZXJhbmQpO1xuICAgICAgLyogVGhlIHByZWZlci1jb25zdCBtYWtlcyBubyBzZW5zZSB3aGVuIHNvbWUgb2YgdGhlIHZhcmlhYmxlcyBuZWVkKi9cbiAgICAgIC8qIHRvIGJlIGBsZXRgKi9cbiAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItY29uc3QqL1xuICAgICAgbGV0IFtsZWZ0Qm91bmQsIHJpZ2h0Qm91bmRdID0gZ2V0UGFzc1N0eWxlQ292ZXIocGFzc1N0eWxlKTtcbiAgICAgIGNvbnN0IG5ld1JpZ2h0Qm91bmQgPSBgJHtlbmNvZGVQYXNzYWJsZShyaWdodE9wZXJhbmQpfX5gO1xuICAgICAgaWYgKG5ld1JpZ2h0Qm91bmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICByaWdodEJvdW5kID0gbmV3UmlnaHRCb3VuZDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbbGVmdEJvdW5kLCByaWdodEJvdW5kXTtcbiAgICB9LFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaExUSGVscGVyID0gRmFyKCdtYXRjaDpsdCBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIHJpZ2h0T3BlcmFuZCwgY2hlY2spID0+XG4gICAgICBrZXlMVChzcGVjaW1lbiwgcmlnaHRPcGVyYW5kKSB8fFxuICAgICAgY2hlY2soZmFsc2UsIFhgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIDwgJHtyaWdodE9wZXJhbmR9YCksXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogY2hlY2tLZXksXG5cbiAgICBnZXRSYW5rQ292ZXI6IG1hdGNoTFRFSGVscGVyLmdldFJhbmtDb3ZlcixcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hHVEVIZWxwZXIgPSBGYXIoJ21hdGNoOmd0ZSBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIHJpZ2h0T3BlcmFuZCwgY2hlY2spID0+XG4gICAgICBrZXlHVEUoc3BlY2ltZW4sIHJpZ2h0T3BlcmFuZCkgfHxcbiAgICAgIGNoZWNrKGZhbHNlLCBYYCR7c3BlY2ltZW59IC0gTXVzdCBiZSA+PSAke3JpZ2h0T3BlcmFuZH1gKSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiBjaGVja0tleSxcblxuICAgIGdldFJhbmtDb3ZlcjogKHJpZ2h0T3BlcmFuZCwgZW5jb2RlUGFzc2FibGUpID0+IHtcbiAgICAgIGNvbnN0IHBhc3NTdHlsZSA9IHBhc3NTdHlsZU9mKHJpZ2h0T3BlcmFuZCk7XG4gICAgICAvKiBUaGUgcHJlZmVyLWNvbnN0IG1ha2VzIG5vIHNlbnNlIHdoZW4gc29tZSBvZiB0aGUgdmFyaWFibGVzIG5lZWQqL1xuICAgICAgLyogdG8gYmUgYGxldGAqL1xuICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdCovXG4gICAgICBsZXQgW2xlZnRCb3VuZCwgcmlnaHRCb3VuZF0gPSBnZXRQYXNzU3R5bGVDb3ZlcihwYXNzU3R5bGUpO1xuICAgICAgY29uc3QgbmV3TGVmdEJvdW5kID0gZW5jb2RlUGFzc2FibGUocmlnaHRPcGVyYW5kKTtcbiAgICAgIGlmIChuZXdMZWZ0Qm91bmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICBsZWZ0Qm91bmQgPSBuZXdMZWZ0Qm91bmQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gW2xlZnRCb3VuZCwgcmlnaHRCb3VuZF07XG4gICAgfSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hHVEhlbHBlciA9IEZhcignbWF0Y2g6Z3QgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCByaWdodE9wZXJhbmQsIGNoZWNrKSA9PlxuICAgICAga2V5R1Qoc3BlY2ltZW4sIHJpZ2h0T3BlcmFuZCkgfHxcbiAgICAgIGNoZWNrKGZhbHNlLCBYYCR7c3BlY2ltZW59IC0gTXVzdCBiZSA+ICR7cmlnaHRPcGVyYW5kfWApLFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IGNoZWNrS2V5LFxuXG4gICAgZ2V0UmFua0NvdmVyOiBtYXRjaEdURUhlbHBlci5nZXRSYW5rQ292ZXIsXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoUmVjb3JkT2ZIZWxwZXIgPSBGYXIoJ21hdGNoOnJlY29yZE9mIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChcbiAgICAgIHNwZWNpbWVuLFxuICAgICAgW2tleVBhdHQsIHZhbHVlUGF0dCwgbGltaXRzID0gdW5kZWZpbmVkXSxcbiAgICAgIGNoZWNrLFxuICAgICkgPT4ge1xuICAgICAgY29uc3QgeyBudW1Qcm9wZXJ0aWVzTGltaXQsIHByb3BlcnR5TmFtZUxlbmd0aExpbWl0IH0gPSBsaW1pdChsaW1pdHMpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2tLaW5kKHNwZWNpbWVuLCAnY29weVJlY29yZCcsIGNoZWNrKSAmJlxuICAgICAgICBjaGVjayhcbiAgICAgICAgICBvd25LZXlzKHNwZWNpbWVuKS5sZW5ndGggPD0gbnVtUHJvcGVydGllc0xpbWl0LFxuICAgICAgICAgIFhgTXVzdCBub3QgaGF2ZSBtb3JlIHRoYW4gJHtxKFxuICAgICAgICAgICAgbnVtUHJvcGVydGllc0xpbWl0LFxuICAgICAgICAgICl9IHByb3BlcnRpZXM6ICR7c3BlY2ltZW59YCxcbiAgICAgICAgKSAmJlxuICAgICAgICBlbnRyaWVzKHNwZWNpbWVuKS5ldmVyeShcbiAgICAgICAgICAoW2tleSwgdmFsdWVdKSA9PlxuICAgICAgICAgICAgYXBwbHlMYWJlbGluZ0Vycm9yKFxuICAgICAgICAgICAgICBjaGVjayxcbiAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIGtleS5sZW5ndGggPD0gcHJvcGVydHlOYW1lTGVuZ3RoTGltaXQsXG4gICAgICAgICAgICAgICAgWGBQcm9wZXJ0eSBuYW1lIG11c3Qgbm90IGJlIGxvbmdlciB0aGFuICR7cShcbiAgICAgICAgICAgICAgICAgIHByb3BlcnR5TmFtZUxlbmd0aExpbWl0LFxuICAgICAgICAgICAgICAgICl9YCxcbiAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgKSAmJlxuICAgICAgICAgICAgY2hlY2tNYXRjaGVzKFxuICAgICAgICAgICAgICBoYXJkZW4oW2tleSwgdmFsdWVdKSxcbiAgICAgICAgICAgICAgaGFyZGVuKFtrZXlQYXR0LCB2YWx1ZVBhdHRdKSxcbiAgICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICksXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAocGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgaGFyZGVuKFtNTS5wYXR0ZXJuKCksIE1NLnBhdHRlcm4oKV0pLFxuICAgICAgICBjaGVjayxcbiAgICAgICAgJ21hdGNoOnJlY29yZE9mIHBheWxvYWQnLFxuICAgICAgKSxcblxuICAgIGdldFJhbmtDb3ZlcjogX2VudHJ5UGF0dCA9PiBnZXRQYXNzU3R5bGVDb3ZlcignY29weVJlY29yZCcpLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaEFycmF5T2ZIZWxwZXIgPSBGYXIoJ21hdGNoOmFycmF5T2YgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKHNwZWNpbWVuLCBbc3ViUGF0dCwgbGltaXRzID0gdW5kZWZpbmVkXSwgY2hlY2spID0+IHtcbiAgICAgIGNvbnN0IHsgYXJyYXlMZW5ndGhMaW1pdCB9ID0gbGltaXQobGltaXRzKTtcbiAgICAgIC8qIHByZXR0aWVyLWlnbm9yZSovXG4gICAgICByZXR1cm4gKFxuICAgICAgICBjaGVja0tpbmQoc3BlY2ltZW4sICdjb3B5QXJyYXknLCBjaGVjaykgJiZcbiAgICAgICAgKC8qKiBAdHlwZSB7QXJyYXl9ICovIChzcGVjaW1lbikubGVuZ3RoIDw9IGFycmF5TGVuZ3RoTGltaXQgfHxcbiAgICAgICAgICBjaGVjayhcbiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgWGBBcnJheSBsZW5ndGggJHtzcGVjaW1lbi5sZW5ndGh9IG11c3QgYmUgPD0gbGltaXQgJHthcnJheUxlbmd0aExpbWl0fWAsXG4gICAgICAgICAgKSkgJiZcbiAgICAgICAgYXJyYXlFdmVyeU1hdGNoUGF0dGVybihzcGVjaW1lbiwgc3ViUGF0dCwgY2hlY2spXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGhhcmRlbihbTU0ucGF0dGVybigpXSksXG4gICAgICAgIGNoZWNrLFxuICAgICAgICAnbWF0Y2g6YXJyYXlPZiBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6ICgpID0+IGdldFBhc3NTdHlsZUNvdmVyKCdjb3B5QXJyYXknKSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hCeXRlQXJyYXlIZWxwZXIgPSBGYXIoJ21hdGNoOmJ5dGVBcnJheSBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIFtsaW1pdHMgPSB1bmRlZmluZWRdLCBjaGVjaykgPT4ge1xuICAgICAgY29uc3QgeyBieXRlTGVuZ3RoTGltaXQgfSA9IGxpbWl0KGxpbWl0cyk7XG4gICAgICAvKiBwcmV0dGllci1pZ25vcmUqL1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2tLaW5kKHNwZWNpbWVuLCAnYnl0ZUFycmF5JywgY2hlY2spICYmXG4gICAgICAgICgvKiogQHR5cGUge0FycmF5QnVmZmVyfSAqLyAoc3BlY2ltZW4pLmJ5dGVMZW5ndGggPD0gYnl0ZUxlbmd0aExpbWl0IHx8XG4gICAgICAgICAgY2hlY2soXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIFhgYnl0ZUFycmF5ICR7c3BlY2ltZW59IG11c3Qgbm90IGJlIGJpZ2dlciB0aGFuICR7Ynl0ZUxlbmd0aExpbWl0fWAsXG4gICAgICAgICAgKSlcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAocGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgaGFyZGVuKFtdKSxcbiAgICAgICAgY2hlY2ssXG4gICAgICAgICdtYXRjaDpieXRlQXJyYXkgcGF5bG9hZCcsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoX21hdGNoUGF5bG9hZCwgX2VuY29kZVBhc3NhYmxlKSA9PlxuICAgICAgZ2V0UGFzc1N0eWxlQ292ZXIoJ2J5dGVBcnJheScpLFxuICB9KTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaFNldE9mSGVscGVyID0gRmFyKCdtYXRjaDpzZXRPZiBoZWxwZXInLCB7XG4gICAgY2hlY2tNYXRjaGVzOiAoc3BlY2ltZW4sIFtrZXlQYXR0LCBsaW1pdHMgPSB1bmRlZmluZWRdLCBjaGVjaykgPT4ge1xuICAgICAgY29uc3QgeyBudW1TZXRFbGVtZW50c0xpbWl0IH0gPSBsaW1pdChsaW1pdHMpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2tLaW5kKHNwZWNpbWVuLCAnY29weVNldCcsIGNoZWNrKSAmJlxuICAgICAgICBjaGVjayhcbiAgICAgICAgICAvKiogQHR5cGUge0FycmF5fSAqLyAoc3BlY2ltZW4ucGF5bG9hZCkubGVuZ3RoIDwgbnVtU2V0RWxlbWVudHNMaW1pdCxcbiAgICAgICAgICBYYFNldCBtdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiAke3EobnVtU2V0RWxlbWVudHNMaW1pdCl9IGVsZW1lbnRzOiAke1xuICAgICAgICAgICAgc3BlY2ltZW4ucGF5bG9hZC5sZW5ndGhcbiAgICAgICAgICB9YCxcbiAgICAgICAgKSAmJlxuICAgICAgICBhcnJheUV2ZXJ5TWF0Y2hQYXR0ZXJuKHNwZWNpbWVuLnBheWxvYWQsIGtleVBhdHQsIGNoZWNrLCAnc2V0IGVsZW1lbnRzJylcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAocGF5bG9hZCwgY2hlY2spID0+XG4gICAgICBjaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbiAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgaGFyZGVuKFtNTS5wYXR0ZXJuKCldKSxcbiAgICAgICAgY2hlY2ssXG4gICAgICAgICdtYXRjaDpzZXRPZiBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6ICgpID0+IGdldFBhc3NTdHlsZUNvdmVyKCd0YWdnZWQnKSxcbiAgfSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hCYWdPZkhlbHBlciA9IEZhcignbWF0Y2g6YmFnT2YgaGVscGVyJywge1xuICAgIGNoZWNrTWF0Y2hlczogKFxuICAgICAgc3BlY2ltZW4sXG4gICAgICBba2V5UGF0dCwgY291bnRQYXR0LCBsaW1pdHMgPSB1bmRlZmluZWRdLFxuICAgICAgY2hlY2ssXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCB7IG51bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXQsIGRlY2ltYWxEaWdpdHNMaW1pdCB9ID0gbGltaXQobGltaXRzKTtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIGNoZWNrS2luZChzcGVjaW1lbiwgJ2NvcHlCYWcnLCBjaGVjaykgJiZcbiAgICAgICAgY2hlY2soXG4gICAgICAgICAgLyoqIEB0eXBlIHtBcnJheX0gKi8gKHNwZWNpbWVuLnBheWxvYWQpLmxlbmd0aCA8PVxuICAgICAgICAgICAgbnVtVW5pcXVlQmFnRWxlbWVudHNMaW1pdCxcbiAgICAgICAgICBYYEJhZyBtdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiAke3EoXG4gICAgICAgICAgICBudW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0LFxuICAgICAgICAgICl9IHVuaXF1ZSBlbGVtZW50czogJHtzcGVjaW1lbn1gLFxuICAgICAgICApICYmXG4gICAgICAgIHNwZWNpbWVuLnBheWxvYWQuZXZlcnkoXG4gICAgICAgICAgKFtrZXksIGNvdW50XSwgaSkgPT5cbiAgICAgICAgICAgIGNoZWNrTWF0Y2hlcyhrZXksIGtleVBhdHQsIGNoZWNrLCBgYmFnIGtleXNbJHtpfV1gKSAmJlxuICAgICAgICAgICAgYXBwbHlMYWJlbGluZ0Vycm9yKFxuICAgICAgICAgICAgICBjaGVja0RlY2ltYWxEaWdpdHNMaW1pdCxcbiAgICAgICAgICAgICAgW2NvdW50LCBkZWNpbWFsRGlnaXRzTGltaXQsIGNoZWNrXSxcbiAgICAgICAgICAgICAgYGJhZyBjb3VudHNbJHtpfV1gLFxuICAgICAgICAgICAgKSAmJlxuICAgICAgICAgICAgY2hlY2tNYXRjaGVzKGNvdW50LCBjb3VudFBhdHQsIGNoZWNrLCBgYmFnIGNvdW50c1ske2l9XWApLFxuICAgICAgICApXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGhhcmRlbihbTU0ucGF0dGVybigpLCBNTS5wYXR0ZXJuKCldKSxcbiAgICAgICAgY2hlY2ssXG4gICAgICAgICdtYXRjaDpiYWdPZiBwYXlsb2FkJyxcbiAgICAgICksXG5cbiAgICBnZXRSYW5rQ292ZXI6ICgpID0+IGdldFBhc3NTdHlsZUNvdmVyKCd0YWdnZWQnKSxcbiAgfSk7XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0NvcHlBcnJheX0gZWxlbWVudHNcbiAqIEBwYXJhbSB7UGF0dGVybn0gZWxlbWVudFBhdHRcbiAqIEBwYXJhbSB7YmlnaW50fSBib3VuZCBNdXN0IGJlID49IDFuXG4gKiBAcGFyYW0ge0NvcHlBcnJheX0gW2luUmVzdWx0c11cbiAqIEBwYXJhbSB7Q29weUFycmF5fSBbb3V0UmVzdWx0c11cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgY29uc3QgZWxlbWVudHNIYXNTcGxpdCA9IChcbiAgICBlbGVtZW50cyxcbiAgICBlbGVtZW50UGF0dCxcbiAgICBib3VuZCxcbiAgICBpblJlc3VsdHMgPSB1bmRlZmluZWQsXG4gICAgb3V0UmVzdWx0cyA9IHVuZGVmaW5lZCxcbiAgICBjaGVjayA9IGlkZW50Q2hlY2tlcixcbiAgKSA9PiB7XG4gICAgbGV0IGNvdW50ID0gMG47XG4gICAgLyogU2luY2UgdGhpcyBmZWF0dXJlIGlzIG1vdGl2YXRlZCBieSBFUlRQJ3MgdXNlIG9uKi9cbiAgICAvKiBub24tZnVuZ2libGUgKGBzZXRgLCBgY29weVNldGApIGFtb3VudHMsKi9cbiAgICAvKiB0aGVpciBhcnJheXMgc3RvcmUgdGhlaXIgZWxlbWVudHMgaW4gZGVjZW5kaW5nIGxleGljb2dyYXBoaWMgb3JkZXIuKi9cbiAgICAvKiBCdXQgdGhpcyBmdW5jdGlvbiBoYXMgdG8gbWFrZSBzb21lIGNob2ljZSBhbW91bmcgZXF1YWxseSBnb29kIG1pbmltYWwqL1xuICAgIC8qIHJlc3VsdHMuIEl0IGlzIG1vcmUgaW50dWl0aXZlIGZvciB0aGUgY2hvaWNlIHRvIGJlIHRoZSBmaXJzdCBgYm91bmRgKi9cbiAgICAvKiBtYXRjaGluZyBlbGVtZW50cyBpbiBhc2NlbmRpbmcgbGV4aWNpZ3JhcGhpYyBvcmRlciwgcmF0aGVyIHRoYW4qL1xuICAgIC8qIGRlY2VuZGluZy4gVGh1cyB3ZSBpdGVyYXRlIGBlbGVtZW50c2AgaW4gcmV2ZXJzZSBvcmRlci4qL1xuICAgIGZvciAobGV0IGkgPSBlbGVtZW50cy5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgICAgY29uc3QgZWxlbWVudCA9IGVsZW1lbnRzW2ldO1xuICAgICAgaWYgKGNvdW50IDwgYm91bmQpIHtcbiAgICAgICAgaWYgKG1hdGNoZXMoZWxlbWVudCwgZWxlbWVudFBhdHQpKSB7XG4gICAgICAgICAgY291bnQgKz0gMW47XG4gICAgICAgICAgaWYgKGluUmVzdWx0cykgaW5SZXN1bHRzLnB1c2goZWxlbWVudCk7XG4gICAgICAgIH0gZWxzZSBpZiAob3V0UmVzdWx0cykge1xuICAgICAgICAgIG91dFJlc3VsdHMucHVzaChlbGVtZW50KTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChvdXRSZXN1bHRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBvdXRSZXN1bHRzLnB1c2goZWxlbWVudCk7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBjaGVjayhcbiAgICAgIGNvdW50ID49IGJvdW5kLFxuICAgICAgWGBIYXMgb25seSAke3EoY291bnQpfSBtYXRjaGVzLCBidXQgbmVlZHMgJHtxKGJvdW5kKX1gLFxuICAgICk7XG4gIH07XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0NvcHlBcnJheTxbS2V5LCBiaWdpbnRdPn0gcGFpcnNcbiAqIEBwYXJhbSB7UGF0dGVybn0gZWxlbWVudFBhdHRcbiAqIEBwYXJhbSB7YmlnaW50fSBib3VuZCBNdXN0IGJlID49IDFuXG4gKiBAcGFyYW0ge0NvcHlBcnJheTxbS2V5LCBiaWdpbnRdPn0gW2luUmVzdWx0c11cbiAqIEBwYXJhbSB7Q29weUFycmF5PFtLZXksIGJpZ2ludF0+fSBbb3V0UmVzdWx0c11cbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbiAgY29uc3QgcGFpcnNIYXNTcGxpdCA9IChcbiAgICBwYWlycyxcbiAgICBlbGVtZW50UGF0dCxcbiAgICBib3VuZCxcbiAgICBpblJlc3VsdHMgPSB1bmRlZmluZWQsXG4gICAgb3V0UmVzdWx0cyA9IHVuZGVmaW5lZCxcbiAgICBjaGVjayA9IGlkZW50Q2hlY2tlcixcbiAgKSA9PiB7XG4gICAgbGV0IGNvdW50ID0gMG47XG4gICAgLyogU2luY2UgdGhpcyBmZWF0dXJlIGlzIG1vdGl2YXRlZCBieSBFUlRQJ3MgdXNlIG9uKi9cbiAgICAvKiBzZW1pLWZ1bmdpYmxlIChgY29weUJhZ2ApIGFtb3VudHMsKi9cbiAgICAvKiB0aGVpciBhcnJheXMgc3RvcmUgdGhlaXIgZWxlbWVudHMgaW4gZGVjZW5kaW5nIGxleGljb2dyYXBoaWMgb3JkZXIuKi9cbiAgICAvKiBCdXQgdGhpcyBmdW5jdGlvbiBoYXMgdG8gbWFrZSBzb21lIGNob2ljZSBhbW91bmcgZXF1YWxseSBnb29kIG1pbmltYWwqL1xuICAgIC8qIHJlc3VsdHMuIEl0IGlzIG1vcmUgaW50dWl0aXZlIGZvciB0aGUgY2hvaWNlIHRvIGJlIHRoZSBmaXJzdCBgYm91bmRgKi9cbiAgICAvKiBtYXRjaGluZyBlbGVtZW50cyBpbiBhc2NlbmRpbmcgbGV4aWNpZ3JhcGhpYyBvcmRlciwgcmF0aGVyIHRoYW4qL1xuICAgIC8qIGRlY2VuZGluZy4gVGh1cyB3ZSBpdGVyYXRlIGBwYWlyc2AgaW4gcmV2ZXJzZSBvcmRlci4qL1xuICAgIGZvciAobGV0IGkgPSBwYWlycy5sZW5ndGggLSAxOyBpID49IDA7IGkgLT0gMSkge1xuICAgICAgY29uc3QgW2VsZW1lbnQsIG51bV0gPSBwYWlyc1tpXTtcbiAgICAgIGNvbnN0IG51bVJlc3QgPSBib3VuZCAtIGNvdW50O1xuICAgICAgaWYgKG51bVJlc3QgPj0gMW4pIHtcbiAgICAgICAgaWYgKG1hdGNoZXMoZWxlbWVudCwgZWxlbWVudFBhdHQpKSB7XG4gICAgICAgICAgaWYgKG51bSA8PSBudW1SZXN0KSB7XG4gICAgICAgICAgICBjb3VudCArPSBudW07XG4gICAgICAgICAgICBpZiAoaW5SZXN1bHRzKSBpblJlc3VsdHMucHVzaChbZWxlbWVudCwgbnVtXSk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IG51bUluID0gbnVtUmVzdDtcbiAgICAgICAgICAgIGNvdW50ICs9IG51bUluO1xuICAgICAgICAgICAgaWYgKGluUmVzdWx0cykgaW5SZXN1bHRzLnB1c2goW2VsZW1lbnQsIG51bVJlc3RdKTtcbiAgICAgICAgICAgIGlmIChvdXRSZXN1bHRzKSBvdXRSZXN1bHRzLnB1c2goW2VsZW1lbnQsIG51bSAtIG51bVJlc3RdKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAob3V0UmVzdWx0cykge1xuICAgICAgICAgIG91dFJlc3VsdHMucHVzaChbZWxlbWVudCwgbnVtXSk7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAob3V0UmVzdWx0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgb3V0UmVzdWx0cy5wdXNoKFtlbGVtZW50LCBudW1dKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGNoZWNrKFxuICAgICAgY291bnQgPj0gYm91bmQsXG4gICAgICBYYEhhcyBvbmx5ICR7cShjb3VudCl9IG1hdGNoZXMsIGJ1dCBuZWVkcyAke3EoYm91bmQpfWAsXG4gICAgKTtcbiAgfTtcblxuICAvKipcbiAqIEB0eXBlZGVmIHtDb3B5QXJyYXkgfCBDb3B5U2V0IHwgQ29weUJhZ30gQ29udGFpbmVyXG4gKiBAcGFyYW0ge0NvbnRhaW5lcn0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UGF0dGVybn0gZWxlbWVudFBhdHRcbiAqIEBwYXJhbSB7YmlnaW50fSBib3VuZCBNdXN0IGJlID49IDFuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFtuZWVkSW5SZXN1bHRzXVxuICogQHBhcmFtIHtib29sZWFufSBbbmVlZE91dFJlc3VsdHNdXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtbQ29udGFpbmVyIHwgdW5kZWZpbmVkLCBDb250YWluZXIgfCB1bmRlZmluZWRdIHwgZmFsc2V9XG4gKi9cbiAgY29uc3QgY29udGFpbmVySGFzU3BsaXQgPSAoXG4gICAgc3BlY2ltZW4sXG4gICAgZWxlbWVudFBhdHQsXG4gICAgYm91bmQsXG4gICAgbmVlZEluUmVzdWx0cyA9IGZhbHNlLFxuICAgIG5lZWRPdXRSZXN1bHRzID0gZmFsc2UsXG4gICAgY2hlY2sgPSBpZGVudENoZWNrZXIsXG4gICkgPT4ge1xuICAgIGNvbnN0IGluUmVzdWx0cyA9IG5lZWRJblJlc3VsdHMgPyBbXSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBvdXRSZXN1bHRzID0gbmVlZE91dFJlc3VsdHMgPyBbXSA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBraW5kID0ga2luZE9mKHNwZWNpbWVuKTtcbiAgICBzd2l0Y2ggKGtpbmQpIHtcbiAgICAgIGNhc2UgJ2NvcHlBcnJheSc6IHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICFlbGVtZW50c0hhc1NwbGl0KFxuICAgICAgICAgICAgc3BlY2ltZW4sXG4gICAgICAgICAgICBlbGVtZW50UGF0dCxcbiAgICAgICAgICAgIGJvdW5kLFxuICAgICAgICAgICAgaW5SZXN1bHRzLFxuICAgICAgICAgICAgb3V0UmVzdWx0cyxcbiAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgLyogY2hlY2sgbG9naWMgYWxyZWFkeSBwZXJmb3JtZWQgYnkgZWxlbWVudHNIYXNTcGxpdCovXG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbaW5SZXN1bHRzLCBvdXRSZXN1bHRzXTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlTZXQnOiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhZWxlbWVudHNIYXNTcGxpdChcbiAgICAgICAgICAgIHNwZWNpbWVuLnBheWxvYWQsXG4gICAgICAgICAgICBlbGVtZW50UGF0dCxcbiAgICAgICAgICAgIGJvdW5kLFxuICAgICAgICAgICAgaW5SZXN1bHRzLFxuICAgICAgICAgICAgb3V0UmVzdWx0cyxcbiAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgaW5SZXN1bHRzICYmIG1ha2VDb3B5U2V0KGluUmVzdWx0cyksXG4gICAgICAgICAgb3V0UmVzdWx0cyAmJiBtYWtlQ29weVNldChvdXRSZXN1bHRzKSxcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICAgIGNhc2UgJ2NvcHlCYWcnOiB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAhcGFpcnNIYXNTcGxpdChcbiAgICAgICAgICAgIHNwZWNpbWVuLnBheWxvYWQsXG4gICAgICAgICAgICBlbGVtZW50UGF0dCxcbiAgICAgICAgICAgIGJvdW5kLFxuICAgICAgICAgICAgaW5SZXN1bHRzLFxuICAgICAgICAgICAgb3V0UmVzdWx0cyxcbiAgICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgIClcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbXG4gICAgICAgICAgaW5SZXN1bHRzICYmIG1ha2VDb3B5QmFnKGluUmVzdWx0cyksXG4gICAgICAgICAgb3V0UmVzdWx0cyAmJiBtYWtlQ29weUJhZyhvdXRSZXN1bHRzKSxcbiAgICAgICAgXTtcbiAgICAgIH1cbiAgICAgIGRlZmF1bHQ6IHtcbiAgICAgICAgcmV0dXJuIGNoZWNrKGZhbHNlLCBYYHVuZXhwZWN0ZWQgJHtxKGtpbmQpfWApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICAvKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuICBjb25zdCBtYXRjaENvbnRhaW5lckhhc0hlbHBlciA9IEZhcignTS5jb250YWluZXJIYXMgaGVscGVyJywge1xuICAgIC8qKlxuICogQHBhcmFtIHtDb3B5QXJyYXkgfCBDb3B5U2V0IHwgQ29weUJhZ30gc3BlY2ltZW5cbiAqIEBwYXJhbSB7W1BhdHRlcm4sIGJpZ2ludCwgTGltaXRzP119IHBheWxvYWRcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqL1xuICAgIGNoZWNrTWF0Y2hlczogKFxuICAgICAgc3BlY2ltZW4sXG4gICAgICBbZWxlbWVudFBhdHQsIGJvdW5kLCBsaW1pdHMgPSB1bmRlZmluZWRdLFxuICAgICAgY2hlY2ssXG4gICAgKSA9PiB7XG4gICAgICBjb25zdCBraW5kID0ga2luZE9mKHNwZWNpbWVuLCBjaGVjayk7XG4gICAgICBjb25zdCB7IGRlY2ltYWxEaWdpdHNMaW1pdCB9ID0gbGltaXQobGltaXRzKTtcbiAgICAgIGlmIChcbiAgICAgICAgIWFwcGx5TGFiZWxpbmdFcnJvcihcbiAgICAgICAgICBjaGVja0RlY2ltYWxEaWdpdHNMaW1pdCxcbiAgICAgICAgICBbYm91bmQsIGRlY2ltYWxEaWdpdHNMaW1pdCwgY2hlY2tdLFxuICAgICAgICAgIGAke2tpbmR9IG1hdGNoZXNgLFxuICAgICAgICApXG4gICAgICApIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgcmV0dXJuICEhY29udGFpbmVySGFzU3BsaXQoXG4gICAgICAgIHNwZWNpbWVuLFxuICAgICAgICBlbGVtZW50UGF0dCxcbiAgICAgICAgYm91bmQsXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBmYWxzZSxcbiAgICAgICAgY2hlY2ssXG4gICAgICApO1xuICAgIH0sXG5cbiAgICBjaGVja0lzV2VsbEZvcm1lZDogKHBheWxvYWQsIGNoZWNrKSA9PlxuICAgICAgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG4gICAgICAgIHBheWxvYWQsXG4gICAgICAgIGhhcmRlbihbTU0ucGF0dGVybigpLCBNTS5ndGUoMW4pXSksXG4gICAgICAgIGNoZWNrLFxuICAgICAgICAnTS5jb250YWluZXJIYXMgcGF5bG9hZCcsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoKSA9PiBnZXRQYXNzU3R5bGVDb3ZlcigndGFnZ2VkJyksXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoTWFwT2ZIZWxwZXIgPSBGYXIoJ21hdGNoOm1hcE9mIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChcbiAgICAgIHNwZWNpbWVuLFxuICAgICAgW2tleVBhdHQsIHZhbHVlUGF0dCwgbGltaXRzID0gdW5kZWZpbmVkXSxcbiAgICAgIGNoZWNrLFxuICAgICkgPT4ge1xuICAgICAgY29uc3QgeyBudW1NYXBFbnRyaWVzTGltaXQgfSA9IGxpbWl0KGxpbWl0cyk7XG4gICAgICByZXR1cm4gKFxuICAgICAgICBjaGVja0tpbmQoc3BlY2ltZW4sICdjb3B5TWFwJywgY2hlY2spICYmXG4gICAgICAgIGNoZWNrKFxuICAgICAgICAgIC8qKiBAdHlwZSB7QXJyYXl9ICovIChzcGVjaW1lbi5wYXlsb2FkLmtleXMpLmxlbmd0aCA8PVxuICAgICAgICAgICAgbnVtTWFwRW50cmllc0xpbWl0LFxuICAgICAgICAgIFhgQ29weU1hcCBtdXN0IGhhdmUgbm8gbW9yZSB0aGFuICR7cShcbiAgICAgICAgICAgIG51bU1hcEVudHJpZXNMaW1pdCxcbiAgICAgICAgICApfSBlbnRyaWVzOiAke3NwZWNpbWVufWAsXG4gICAgICAgICkgJiZcbiAgICAgICAgYXJyYXlFdmVyeU1hdGNoUGF0dGVybihcbiAgICAgICAgICBzcGVjaW1lbi5wYXlsb2FkLmtleXMsXG4gICAgICAgICAga2V5UGF0dCxcbiAgICAgICAgICBjaGVjayxcbiAgICAgICAgICAnbWFwIGtleXMnLFxuICAgICAgICApICYmXG4gICAgICAgIGFycmF5RXZlcnlNYXRjaFBhdHRlcm4oXG4gICAgICAgICAgc3BlY2ltZW4ucGF5bG9hZC52YWx1ZXMsXG4gICAgICAgICAgdmFsdWVQYXR0LFxuICAgICAgICAgIGNoZWNrLFxuICAgICAgICAgICdtYXAgdmFsdWVzJyxcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgY2hlY2tJc1dlbGxGb3JtZWQ6IChwYXlsb2FkLCBjaGVjaykgPT5cbiAgICAgIGNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxuICAgICAgICBwYXlsb2FkLFxuICAgICAgICBoYXJkZW4oW01NLnBhdHRlcm4oKSwgTU0ucGF0dGVybigpXSksXG4gICAgICAgIGNoZWNrLFxuICAgICAgICAnbWF0Y2g6bWFwT2YgcGF5bG9hZCcsXG4gICAgICApLFxuXG4gICAgZ2V0UmFua0NvdmVyOiBfZW50cnlQYXR0ID0+IGdldFBhc3NTdHlsZUNvdmVyKCd0YWdnZWQnKSxcbiAgfSk7XG5cbiAgLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlW119IHNwZWNpbWVuXG4gKiBAcGFyYW0ge1BhdHRlcm5bXX0gcmVxdWlyZWRQYXR0XG4gKiBAcGFyYW0ge1BhdHRlcm5bXX0gb3B0aW9uYWxQYXR0XG4gKiBAcmV0dXJucyB7e1xuICogICByZXF1aXJlZFNwZWNpbWVuOiBQYXNzYWJsZVtdLFxuICogICBvcHRpb25hbFNwZWNpbWVuOiBQYXNzYWJsZVtdLFxuICogICByZXN0U3BlY2ltZW46IFBhc3NhYmxlW11cbiAqIH19XG4gKi9cbiAgY29uc3Qgc3BsaXRBcnJheVBhcnRzID0gKHNwZWNpbWVuLCByZXF1aXJlZFBhdHQsIG9wdGlvbmFsUGF0dCkgPT4ge1xuICAgIGNvbnN0IG51bVJlcXVpcmVkID0gcmVxdWlyZWRQYXR0Lmxlbmd0aDtcbiAgICBjb25zdCBudW1PcHRpb25hbCA9IG9wdGlvbmFsUGF0dC5sZW5ndGg7XG4gICAgY29uc3QgcmVxdWlyZWRTcGVjaW1lbiA9IHNwZWNpbWVuLnNsaWNlKDAsIG51bVJlcXVpcmVkKTtcbiAgICBjb25zdCBvcHRpb25hbFNwZWNpbWVuID0gc3BlY2ltZW4uc2xpY2UoXG4gICAgICBudW1SZXF1aXJlZCxcbiAgICAgIG51bVJlcXVpcmVkICsgbnVtT3B0aW9uYWwsXG4gICAgKTtcbiAgICBjb25zdCByZXN0U3BlY2ltZW4gPSBzcGVjaW1lbi5zbGljZShudW1SZXF1aXJlZCArIG51bU9wdGlvbmFsKTtcbiAgICByZXR1cm4gaGFyZGVuKHsgcmVxdWlyZWRTcGVjaW1lbiwgb3B0aW9uYWxTcGVjaW1lbiwgcmVzdFNwZWNpbWVuIH0pO1xuICB9O1xuXG4gIC8qKlxuICogT3B0aW9uYWwgc3BlY2ltZW4gZWxlbWVudHMgd2hpY2ggYXJlIGB1bmRlZmluZWRgIHBhc3MgdW5jb25kaXRpb25hbGx5LlxuICogV2UgZW5jb2RlIHRoaXMgd2l0aCB0aGUgYE0ub3JgIHBhdHRlcm4gc28gaXQgYWxzbyBwcm9kdWNlcyBhIGdvb2RcbiAqIGNvbXByZXNzaW9uIGRpc3Rpbmd1aXNoaW5nIGB1bmRlZmluZWRgIGZyb20gYWJzZW5jZS5cbiAqXG4gKiBAcGFyYW0ge1BhdHRlcm5bXX0gb3B0aW9uYWxQYXR0XG4gKiBAcGFyYW0ge251bWJlcn0gbGVuZ3RoXG4gKiBAcmV0dXJucyB7UGF0dGVybltdfSBUaGUgcGFydGlhbFBhdHRcbiAqL1xuICBjb25zdCBhZGFwdEFycmF5UGF0dGVybiA9IChvcHRpb25hbFBhdHQsIGxlbmd0aCkgPT5cbiAgICBoYXJkZW4ob3B0aW9uYWxQYXR0LnNsaWNlKDAsIGxlbmd0aCkubWFwKHBhdHQgPT4gTU0ub3B0KHBhdHQpKSk7XG5cbiAgLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbiAgY29uc3QgbWF0Y2hTcGxpdEFycmF5SGVscGVyID0gRmFyKCdtYXRjaDpzcGxpdEFycmF5IGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChcbiAgICAgIHNwZWNpbWVuLFxuICAgICAgW3JlcXVpcmVkUGF0dCwgb3B0aW9uYWxQYXR0ID0gW10sIHJlc3RQYXR0ID0gTU0uYW55KCldLFxuICAgICAgY2hlY2ssXG4gICAgKSA9PiB7XG4gICAgICBpZiAoIWNoZWNrS2luZChzcGVjaW1lbiwgJ2NvcHlBcnJheScsIGNoZWNrKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgICBjb25zdCB7IHJlcXVpcmVkU3BlY2ltZW4sIG9wdGlvbmFsU3BlY2ltZW4sIHJlc3RTcGVjaW1lbiB9ID1cbiAgICAgICAgc3BsaXRBcnJheVBhcnRzKHNwZWNpbWVuLCByZXF1aXJlZFBhdHQsIG9wdGlvbmFsUGF0dCk7XG4gICAgICBjb25zdCBwYXJ0aWFsUGF0dCA9IGFkYXB0QXJyYXlQYXR0ZXJuKFxuICAgICAgICBvcHRpb25hbFBhdHQsXG4gICAgICAgIG9wdGlvbmFsU3BlY2ltZW4ubGVuZ3RoLFxuICAgICAgKTtcbiAgICAgIGxldCBhcmdOdW0gPSAwO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgKHJlcXVpcmVkU3BlY2ltZW4ubGVuZ3RoID09PSByZXF1aXJlZFBhdHQubGVuZ3RoIHx8XG4gICAgICAgICAgY2hlY2soXG4gICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgIFhgRXhwZWN0ZWQgYXQgbGVhc3QgJHtxKFxuICAgICAgICAgICAgICByZXF1aXJlZFBhdHQubGVuZ3RoLFxuICAgICAgICAgICAgKX0gYXJndW1lbnRzOiAke3NwZWNpbWVufWAsXG4gICAgICAgICAgKSkgJiZcbiAgICAgICAgcmVxdWlyZWRQYXR0LmV2ZXJ5KChwLCBpKSA9PlxuICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wbHVzcGx1cyovXG4gICAgICAgICAgY2hlY2tNYXRjaGVzKHJlcXVpcmVkU3BlY2ltZW5baV0sIHAsIGNoZWNrLCBgYXJnICR7YXJnTnVtKyt9YCksXG4gICAgICAgICkgJiZcbiAgICAgICAgcGFydGlhbFBhdHQuZXZlcnkoKHAsIGkpID0+XG4gICAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBsdXNwbHVzKi9cbiAgICAgICAgICBjaGVja01hdGNoZXMob3B0aW9uYWxTcGVjaW1lbltpXSwgcCwgY2hlY2ssIGBhcmcgJHthcmdOdW0rK30/YCksXG4gICAgICAgICkgJiZcbiAgICAgICAgY2hlY2tNYXRjaGVzKHJlc3RTcGVjaW1lbiwgcmVzdFBhdHQsIGNoZWNrLCAnLi4ucmVzdCcpXG4gICAgICApO1xuICAgIH0sXG5cbiAgICAvKipcbiAqIEBwYXJhbSB7QXJyYXl9IHNwbGl0QXJyYXlcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqL1xuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAoc3BsaXRBcnJheSwgY2hlY2spID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgcGFzc1N0eWxlT2Yoc3BsaXRBcnJheSkgPT09ICdjb3B5QXJyYXknICYmXG4gICAgICAgIChzcGxpdEFycmF5Lmxlbmd0aCA+PSAxIHx8IHNwbGl0QXJyYXkubGVuZ3RoIDw9IDMpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgW3JlcXVpcmVkUGF0dCwgb3B0aW9uYWxQYXR0ID0gdW5kZWZpbmVkLCByZXN0UGF0dCA9IHVuZGVmaW5lZF0gPVxuICAgICAgICAgIHNwbGl0QXJyYXk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBpc1BhdHRlcm4ocmVxdWlyZWRQYXR0KSAmJlxuICAgICAgICAgIHBhc3NTdHlsZU9mKHJlcXVpcmVkUGF0dCkgPT09ICdjb3B5QXJyYXknICYmXG4gICAgICAgICAgKG9wdGlvbmFsUGF0dCA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAoaXNQYXR0ZXJuKG9wdGlvbmFsUGF0dCkgJiZcbiAgICAgICAgICAgICAgcGFzc1N0eWxlT2Yob3B0aW9uYWxQYXR0KSA9PT0gJ2NvcHlBcnJheScpKSAmJlxuICAgICAgICAgIChyZXN0UGF0dCA9PT0gdW5kZWZpbmVkIHx8IGlzUGF0dGVybihyZXN0UGF0dCkpXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gY2hlY2soXG4gICAgICAgIGZhbHNlLFxuICAgICAgICBYYE11c3QgYmUgYW4gYXJyYXkgb2YgYSByZXF1aXJlZFBhdHQgYXJyYXksIGFuIG9wdGlvbmFsIG9wdGlvbmFsUGF0dCBhcnJheSwgYW5kIGFuIG9wdGlvbmFsIHJlc3RQYXR0OiAke3EoXG4gICAgICAgICAgc3BsaXRBcnJheSxcbiAgICAgICAgKX1gLFxuICAgICAgKTtcbiAgICB9LFxuXG4gICAgZ2V0UmFua0NvdmVyOiAoW1xuICAgICAgX3JlcXVpcmVkUGF0dCxcbiAgICAgIF9vcHRpb25hbFBhdHQgPSB1bmRlZmluZWQsXG4gICAgICBfcmVzdFBhdHQgPSB1bmRlZmluZWQsXG4gICAgXSkgPT4gZ2V0UGFzc1N0eWxlQ292ZXIoJ2NvcHlBcnJheScpLFxuICB9KTtcblxuICAvKipcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxQYXNzYWJsZT59IHNwZWNpbWVuXG4gKiBAcGFyYW0ge0NvcHlSZWNvcmQ8UGF0dGVybj59IHJlcXVpcmVkUGF0dFxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFBhdHRlcm4+fSBvcHRpb25hbFBhdHRcbiAqIEByZXR1cm5zIHt7XG4gKiAgIHJlcXVpcmVkU3BlY2ltZW46IENvcHlSZWNvcmQ8UGFzc2FibGU+LFxuICogICBvcHRpb25hbFNwZWNpbWVuOiBDb3B5UmVjb3JkPFBhc3NhYmxlPixcbiAqICAgcmVzdFNwZWNpbWVuOiBDb3B5UmVjb3JkPFBhc3NhYmxlPlxuICogfX1cbiAqL1xuICBjb25zdCBzcGxpdFJlY29yZFBhcnRzID0gKHNwZWNpbWVuLCByZXF1aXJlZFBhdHQsIG9wdGlvbmFsUGF0dCkgPT4ge1xuICAgIC8qIE5vdCBmcm96ZW4hIE11dGF0ZWQgaW4gcGxhY2UqL1xuICAgIC8qKiBAdHlwZSB7W3N0cmluZywgUGFzc2FibGVdW119ICovXG4gICAgY29uc3QgcmVxdWlyZWRFbnRyaWVzID0gW107XG4gICAgLyoqIEB0eXBlIHtbc3RyaW5nLCBQYXNzYWJsZV1bXX0gKi9cbiAgICBjb25zdCBvcHRpb25hbEVudHJpZXMgPSBbXTtcbiAgICAvKiogQHR5cGUge1tzdHJpbmcsIFBhc3NhYmxlXVtdfSAqL1xuICAgIGNvbnN0IHJlc3RFbnRyaWVzID0gW107XG4gICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVdIG9mIGVudHJpZXMoc3BlY2ltZW4pKSB7XG4gICAgICBpZiAoaGFzT3duKHJlcXVpcmVkUGF0dCwgbmFtZSkpIHtcbiAgICAgICAgcmVxdWlyZWRFbnRyaWVzLnB1c2goW25hbWUsIHZhbHVlXSk7XG4gICAgICB9IGVsc2UgaWYgKGhhc093bihvcHRpb25hbFBhdHQsIG5hbWUpKSB7XG4gICAgICAgIG9wdGlvbmFsRW50cmllcy5wdXNoKFtuYW1lLCB2YWx1ZV0pO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdEVudHJpZXMucHVzaChbbmFtZSwgdmFsdWVdKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICByZXF1aXJlZFNwZWNpbWVuOiBmcm9tVW5pcXVlRW50cmllcyhyZXF1aXJlZEVudHJpZXMpLFxuICAgICAgb3B0aW9uYWxTcGVjaW1lbjogZnJvbVVuaXF1ZUVudHJpZXMob3B0aW9uYWxFbnRyaWVzKSxcbiAgICAgIHJlc3RTcGVjaW1lbjogZnJvbVVuaXF1ZUVudHJpZXMocmVzdEVudHJpZXMpLFxuICAgIH0pO1xuICB9O1xuXG4gIC8qKlxuICogT3B0aW9uYWwgc3BlY2ltZW4gdmFsdWVzIHdoaWNoIGFyZSBgdW5kZWZpbmVkYCBwYXNzIHVuY29uZGl0aW9uYWxseS5cbiAqIFdlIGVuY29kZSB0aGlzIHdpdGggdGhlIGBNLm9yYCBwYXR0ZXJuIHNvIGl0IGFsc28gcHJvZHVjZXMgYSBnb29kXG4gKiBjb21wcmVzc2lvbiBkaXN0aW5ndWlzaGluZyBgdW5kZWZpbmVkYCBmcm9tIGFic2VuY2UuXG4gKlxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFBhdHRlcm4+fSBvcHRpb25hbFBhdHRcbiAqIEBwYXJhbSB7c3RyaW5nW119IG5hbWVzXG4gKiBAcmV0dXJucyB7Q29weVJlY29yZDxQYXR0ZXJuPn0gVGhlIHBhcnRpYWxQYXR0XG4gKi9cbiAgY29uc3QgYWRhcHRSZWNvcmRQYXR0ZXJuID0gKG9wdGlvbmFsUGF0dCwgbmFtZXMpID0+XG4gICAgZnJvbVVuaXF1ZUVudHJpZXMobmFtZXMubWFwKG5hbWUgPT4gW25hbWUsIE1NLm9wdChvcHRpb25hbFBhdHRbbmFtZV0pXSkpO1xuXG4gIC8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG4gIGNvbnN0IG1hdGNoU3BsaXRSZWNvcmRIZWxwZXIgPSBGYXIoJ21hdGNoOnNwbGl0UmVjb3JkIGhlbHBlcicsIHtcbiAgICBjaGVja01hdGNoZXM6IChcbiAgICAgIHNwZWNpbWVuLFxuICAgICAgW3JlcXVpcmVkUGF0dCwgb3B0aW9uYWxQYXR0ID0ge30sIHJlc3RQYXR0ID0gTU0uYW55KCldLFxuICAgICAgY2hlY2ssXG4gICAgKSA9PiB7XG4gICAgICBpZiAoIWNoZWNrS2luZChzcGVjaW1lbiwgJ2NvcHlSZWNvcmQnLCBjaGVjaykpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgY29uc3QgeyByZXF1aXJlZFNwZWNpbWVuLCBvcHRpb25hbFNwZWNpbWVuLCByZXN0U3BlY2ltZW4gfSA9XG4gICAgICAgIHNwbGl0UmVjb3JkUGFydHMoc3BlY2ltZW4sIHJlcXVpcmVkUGF0dCwgb3B0aW9uYWxQYXR0KTtcblxuICAgICAgY29uc3QgcGFydGlhbE5hbWVzID0gLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi8gKG93bktleXMob3B0aW9uYWxTcGVjaW1lbikpO1xuICAgICAgY29uc3QgcGFydGlhbFBhdHQgPSBhZGFwdFJlY29yZFBhdHRlcm4ob3B0aW9uYWxQYXR0LCBwYXJ0aWFsTmFtZXMpO1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgY2hlY2tNYXRjaGVzKHJlcXVpcmVkU3BlY2ltZW4sIHJlcXVpcmVkUGF0dCwgY2hlY2spICYmXG4gICAgICAgIHBhcnRpYWxOYW1lcy5ldmVyeShuYW1lID0+XG4gICAgICAgICAgY2hlY2tNYXRjaGVzKFxuICAgICAgICAgICAgb3B0aW9uYWxTcGVjaW1lbltuYW1lXSxcbiAgICAgICAgICAgIHBhcnRpYWxQYXR0W25hbWVdLFxuICAgICAgICAgICAgY2hlY2ssXG4gICAgICAgICAgICBgJHtuYW1lfT9gLFxuICAgICAgICAgICksXG4gICAgICAgICkgJiZcbiAgICAgICAgY2hlY2tNYXRjaGVzKHJlc3RTcGVjaW1lbiwgcmVzdFBhdHQsIGNoZWNrLCAnLi4ucmVzdCcpXG4gICAgICApO1xuICAgIH0sXG5cbiAgICAvKipcbiAqIEBwYXJhbSB7QXJyYXl9IHNwbGl0QXJyYXlcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqL1xuICAgIGNoZWNrSXNXZWxsRm9ybWVkOiAoc3BsaXRBcnJheSwgY2hlY2spID0+IHtcbiAgICAgIGlmIChcbiAgICAgICAgcGFzc1N0eWxlT2Yoc3BsaXRBcnJheSkgPT09ICdjb3B5QXJyYXknICYmXG4gICAgICAgIChzcGxpdEFycmF5Lmxlbmd0aCA+PSAxIHx8IHNwbGl0QXJyYXkubGVuZ3RoIDw9IDMpXG4gICAgICApIHtcbiAgICAgICAgY29uc3QgW3JlcXVpcmVkUGF0dCwgb3B0aW9uYWxQYXR0ID0gdW5kZWZpbmVkLCByZXN0UGF0dCA9IHVuZGVmaW5lZF0gPVxuICAgICAgICAgIHNwbGl0QXJyYXk7XG4gICAgICAgIGlmIChcbiAgICAgICAgICBpc1BhdHRlcm4ocmVxdWlyZWRQYXR0KSAmJlxuICAgICAgICAgIHBhc3NTdHlsZU9mKHJlcXVpcmVkUGF0dCkgPT09ICdjb3B5UmVjb3JkJyAmJlxuICAgICAgICAgIChvcHRpb25hbFBhdHQgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgKGlzUGF0dGVybihvcHRpb25hbFBhdHQpICYmXG4gICAgICAgICAgICAgIHBhc3NTdHlsZU9mKG9wdGlvbmFsUGF0dCkgPT09ICdjb3B5UmVjb3JkJykpICYmXG4gICAgICAgICAgKHJlc3RQYXR0ID09PSB1bmRlZmluZWQgfHwgaXNQYXR0ZXJuKHJlc3RQYXR0KSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBjaGVjayhcbiAgICAgICAgZmFsc2UsXG4gICAgICAgIFhgTXVzdCBiZSBhbiBhcnJheSBvZiBhIHJlcXVpcmVkUGF0dCByZWNvcmQsIGFuIG9wdGlvbmFsIG9wdGlvbmFsUGF0dCByZWNvcmQsIGFuZCBhbiBvcHRpb25hbCByZXN0UGF0dDogJHtxKFxuICAgICAgICAgIHNwbGl0QXJyYXksXG4gICAgICAgICl9YCxcbiAgICAgICk7XG4gICAgfSxcblxuICAgIGdldFJhbmtDb3ZlcjogKFtcbiAgICAgIHJlcXVpcmVkUGF0dCxcbiAgICAgIF9vcHRpb25hbFBhdHQgPSB1bmRlZmluZWQsXG4gICAgICBfcmVzdFBhdHQgPSB1bmRlZmluZWQsXG4gICAgXSkgPT4gZ2V0UGFzc1N0eWxlQ292ZXIocGFzc1N0eWxlT2YocmVxdWlyZWRQYXR0KSksXG4gIH0pO1xuXG4gIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgTWF0Y2hIZWxwZXI+fSAqL1xuICBjb25zdCBIZWxwZXJzQnlNYXRjaFRhZyA9IGhhcmRlbih7XG4gICAgJ21hdGNoOmFueSc6IG1hdGNoQW55SGVscGVyLFxuICAgICdtYXRjaDphbmQnOiBtYXRjaEFuZEhlbHBlcixcbiAgICAnbWF0Y2g6b3InOiBtYXRjaE9ySGVscGVyLFxuICAgICdtYXRjaDpub3QnOiBtYXRjaE5vdEhlbHBlcixcblxuICAgICdtYXRjaDpzY2FsYXInOiBtYXRjaFNjYWxhckhlbHBlcixcbiAgICAnbWF0Y2g6a2V5JzogbWF0Y2hLZXlIZWxwZXIsXG4gICAgJ21hdGNoOnBhdHRlcm4nOiBtYXRjaFBhdHRlcm5IZWxwZXIsXG4gICAgJ21hdGNoOmtpbmQnOiBtYXRjaEtpbmRIZWxwZXIsXG4gICAgJ21hdGNoOnRhZ2dlZCc6IG1hdGNoVGFnZ2VkSGVscGVyLFxuICAgICdtYXRjaDpiaWdpbnQnOiBtYXRjaEJpZ2ludEhlbHBlcixcbiAgICAnbWF0Y2g6bmF0JzogbWF0Y2hOYXRIZWxwZXIsXG4gICAgJ21hdGNoOnN0cmluZyc6IG1hdGNoU3RyaW5nSGVscGVyLFxuICAgICdtYXRjaDpzeW1ib2wnOiBtYXRjaFN5bWJvbEhlbHBlcixcbiAgICAnbWF0Y2g6cmVtb3RhYmxlJzogbWF0Y2hSZW1vdGFibGVIZWxwZXIsXG5cbiAgICAnbWF0Y2g6bHQnOiBtYXRjaExUSGVscGVyLFxuICAgICdtYXRjaDpsdGUnOiBtYXRjaExURUhlbHBlcixcbiAgICAnbWF0Y2g6Z3RlJzogbWF0Y2hHVEVIZWxwZXIsXG4gICAgJ21hdGNoOmd0JzogbWF0Y2hHVEhlbHBlcixcblxuICAgICdtYXRjaDphcnJheU9mJzogbWF0Y2hBcnJheU9mSGVscGVyLFxuICAgICdtYXRjaDpieXRlQXJyYXknOiBtYXRjaEJ5dGVBcnJheUhlbHBlcixcbiAgICAnbWF0Y2g6cmVjb3JkT2YnOiBtYXRjaFJlY29yZE9mSGVscGVyLFxuICAgICdtYXRjaDpzZXRPZic6IG1hdGNoU2V0T2ZIZWxwZXIsXG4gICAgJ21hdGNoOmJhZ09mJzogbWF0Y2hCYWdPZkhlbHBlcixcbiAgICAnbWF0Y2g6Y29udGFpbmVySGFzJzogbWF0Y2hDb250YWluZXJIYXNIZWxwZXIsXG4gICAgJ21hdGNoOm1hcE9mJzogbWF0Y2hNYXBPZkhlbHBlcixcbiAgICAnbWF0Y2g6c3BsaXRBcnJheSc6IG1hdGNoU3BsaXRBcnJheUhlbHBlcixcbiAgICAnbWF0Y2g6c3BsaXRSZWNvcmQnOiBtYXRjaFNwbGl0UmVjb3JkSGVscGVyLFxuICB9KTtcblxuICBjb25zdCBtYWtlTWF0Y2hlciA9ICh0YWcsIHBheWxvYWQpID0+IHtcbiAgICBjb25zdCBtYXRjaGVyID0gbWFrZVRhZ2dlZCh0YWcsIHBheWxvYWQpO1xuICAgIGFzc2VydFBhdHRlcm4obWF0Y2hlcik7XG4gICAgcmV0dXJuIG1hdGNoZXI7XG4gIH07XG5cbiAgY29uc3QgbWFrZUtpbmRNYXRjaGVyID0ga2luZCA9PiBtYWtlTWF0Y2hlcignbWF0Y2g6a2luZCcsIGtpbmQpO1xuXG4gIGNvbnN0IEFueVNoYXBlID0gbWFrZU1hdGNoZXIoJ21hdGNoOmFueScsIHVuZGVmaW5lZCk7XG4gIGNvbnN0IFNjYWxhclNoYXBlID0gbWFrZU1hdGNoZXIoJ21hdGNoOnNjYWxhcicsIHVuZGVmaW5lZCk7XG4gIGNvbnN0IEtleVNoYXBlID0gbWFrZU1hdGNoZXIoJ21hdGNoOmtleScsIHVuZGVmaW5lZCk7XG4gIGNvbnN0IFBhdHRlcm5TaGFwZSA9IG1ha2VNYXRjaGVyKCdtYXRjaDpwYXR0ZXJuJywgdW5kZWZpbmVkKTtcbiAgY29uc3QgQm9vbGVhblNoYXBlID0gbWFrZUtpbmRNYXRjaGVyKCdib29sZWFuJyk7XG4gIGNvbnN0IE51bWJlclNoYXBlID0gbWFrZUtpbmRNYXRjaGVyKCdudW1iZXInKTtcbiAgY29uc3QgQmlnSW50U2hhcGUgPSBtYWtlVGFnZ2VkKCdtYXRjaDpiaWdpbnQnLCBbXSk7XG4gIGNvbnN0IE5hdFNoYXBlID0gbWFrZVRhZ2dlZCgnbWF0Y2g6bmF0JywgW10pO1xuICBjb25zdCBTdHJpbmdTaGFwZSA9IG1ha2VUYWdnZWQoJ21hdGNoOnN0cmluZycsIFtdKTtcbiAgY29uc3QgU3ltYm9sU2hhcGUgPSBtYWtlVGFnZ2VkKCdtYXRjaDpzeW1ib2wnLCBbXSk7XG4gIGNvbnN0IFJlY29yZFNoYXBlID0gbWFrZVRhZ2dlZCgnbWF0Y2g6cmVjb3JkT2YnLCBbQW55U2hhcGUsIEFueVNoYXBlXSk7XG4gIGNvbnN0IEFycmF5U2hhcGUgPSBtYWtlVGFnZ2VkKCdtYXRjaDphcnJheU9mJywgW0FueVNoYXBlXSk7XG4gIGNvbnN0IEJ5dGVBcnJheVNoYXBlID0gbWFrZVRhZ2dlZCgnbWF0Y2g6Ynl0ZUFycmF5JywgW10pO1xuICBjb25zdCBTZXRTaGFwZSA9IG1ha2VUYWdnZWQoJ21hdGNoOnNldE9mJywgW0FueVNoYXBlXSk7XG4gIGNvbnN0IEJhZ1NoYXBlID0gbWFrZVRhZ2dlZCgnbWF0Y2g6YmFnT2YnLCBbQW55U2hhcGUsIEFueVNoYXBlXSk7XG4gIGNvbnN0IE1hcFNoYXBlID0gbWFrZVRhZ2dlZCgnbWF0Y2g6bWFwT2YnLCBbQW55U2hhcGUsIEFueVNoYXBlXSk7XG4gIGNvbnN0IFJlbW90YWJsZVNoYXBlID0gbWFrZUtpbmRNYXRjaGVyKCdyZW1vdGFibGUnKTtcbiAgY29uc3QgRXJyb3JTaGFwZSA9IG1ha2VLaW5kTWF0Y2hlcignZXJyb3InKTtcbiAgY29uc3QgUHJvbWlzZVNoYXBlID0gbWFrZUtpbmRNYXRjaGVyKCdwcm9taXNlJyk7XG4gIGNvbnN0IFVuZGVmaW5lZFNoYXBlID0gbWFrZUtpbmRNYXRjaGVyKCd1bmRlZmluZWQnKTtcblxuICAvKipcbiAqIEZvciB3aGVuIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIHBheWxvYWQgaXMgdGhlIG9wdGlvbmFsIGxpbWl0cyxcbiAqIHNvIHRoYXQgd2hlbiBpdCBpcyBgdW5kZWZpbmVkYCBpdCBpcyBkcm9wcGVkIGZyb20gdGhlIGVuZCBvZiB0aGVcbiAqIHBheWxvYWRzIGFycmF5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gcGF5bG9hZFxuICovXG4gIGNvbnN0IG1ha2VMaW1pdHNNYXRjaGVyID0gKHRhZywgcGF5bG9hZCkgPT4ge1xuICAgIGlmIChwYXlsb2FkW3BheWxvYWQubGVuZ3RoIC0gMV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgcGF5bG9hZCA9IGhhcmRlbihwYXlsb2FkLnNsaWNlKDAsIHBheWxvYWQubGVuZ3RoIC0gMSkpO1xuICAgIH1cbiAgICByZXR1cm4gbWFrZU1hdGNoZXIodGFnLCBwYXlsb2FkKTtcbiAgfTtcblxuICBjb25zdCBtYWtlUmVtb3RhYmxlTWF0Y2hlciA9IChsYWJlbCA9IHVuZGVmaW5lZCkgPT5cbiAgICBsYWJlbCA9PT0gdW5kZWZpbmVkXG4gICAgICA/IFJlbW90YWJsZVNoYXBlXG4gICAgICA6IG1ha2VNYXRjaGVyKCdtYXRjaDpyZW1vdGFibGUnLCBoYXJkZW4oeyBsYWJlbCB9KSk7XG5cbiAgLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSBlbXB0eVxuICogQHBhcmFtIHtUfSBiYXNlXG4gKiBAcGFyYW0ge1R9IFtvcHRpb25hbF1cbiAqIEBwYXJhbSB7VH0gW3Jlc3RdXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG4gIGNvbnN0IG1ha2VTcGxpdFBheWxvYWQgPSAoXG4gICAgZW1wdHksXG4gICAgYmFzZSxcbiAgICBvcHRpb25hbCA9IHVuZGVmaW5lZCxcbiAgICByZXN0ID0gdW5kZWZpbmVkLFxuICApID0+IHtcbiAgICBpZiAocmVzdCkge1xuICAgICAgcmV0dXJuIFtiYXNlLCBvcHRpb25hbCB8fCBlbXB0eSwgcmVzdF07XG4gICAgfVxuICAgIGlmIChvcHRpb25hbCkge1xuICAgICAgcmV0dXJuIFtiYXNlLCBvcHRpb25hbF07XG4gICAgfVxuICAgIHJldHVybiBbYmFzZV07XG4gIH07XG5cbiAgLyogLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuICAvKiogQHR5cGUge01hdGNoZXJOYW1lc3BhY2V9ICovXG4gIGNvbnN0IE0gPSBoYXJkZW4oe1xuICAgIGFueTogKCkgPT4gQW55U2hhcGUsXG4gICAgYW5kOiAoLi4ucGF0dHMpID0+IG1ha2VNYXRjaGVyKCdtYXRjaDphbmQnLCBwYXR0cyksXG4gICAgb3I6ICguLi5wYXR0cykgPT4gbWFrZU1hdGNoZXIoJ21hdGNoOm9yJywgcGF0dHMpLFxuICAgIG5vdDogc3ViUGF0dCA9PiBtYWtlTWF0Y2hlcignbWF0Y2g6bm90Jywgc3ViUGF0dCksXG5cbiAgICBzY2FsYXI6ICgpID0+IFNjYWxhclNoYXBlLFxuICAgIGtleTogKCkgPT4gS2V5U2hhcGUsXG4gICAgcGF0dGVybjogKCkgPT4gUGF0dGVyblNoYXBlLFxuICAgIGtpbmQ6IG1ha2VLaW5kTWF0Y2hlcixcbiAgICB0YWdnZWQ6ICh0YWdQYXR0ID0gTS5zdHJpbmcoKSwgcGF5bG9hZFBhdHQgPSBNLmFueSgpKSA9PlxuICAgICAgbWFrZU1hdGNoZXIoJ21hdGNoOnRhZ2dlZCcsIGhhcmRlbihbdGFnUGF0dCwgcGF5bG9hZFBhdHRdKSksXG4gICAgYm9vbGVhbjogKCkgPT4gQm9vbGVhblNoYXBlLFxuICAgIG51bWJlcjogKCkgPT4gTnVtYmVyU2hhcGUsXG4gICAgYmlnaW50OiAobGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbGltaXRzID8gbWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOmJpZ2ludCcsIFtsaW1pdHNdKSA6IEJpZ0ludFNoYXBlLFxuICAgIG5hdDogKGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIGxpbWl0cyA/IG1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpuYXQnLCBbbGltaXRzXSkgOiBOYXRTaGFwZSxcbiAgICBzdHJpbmc6IChsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBsaW1pdHMgPyBtYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6c3RyaW5nJywgW2xpbWl0c10pIDogU3RyaW5nU2hhcGUsXG4gICAgc3ltYm9sOiAobGltaXRzID0gdW5kZWZpbmVkKSA9PlxuICAgICAgbGltaXRzID8gbWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOnN5bWJvbCcsIFtsaW1pdHNdKSA6IFN5bWJvbFNoYXBlLFxuICAgIHJlY29yZDogKGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIGxpbWl0cyA/IE0ucmVjb3JkT2YoTS5hbnkoKSwgTS5hbnkoKSwgbGltaXRzKSA6IFJlY29yZFNoYXBlLFxuICAgIC8qIHN0cnVjdDogQSBwYXR0ZXJuIHRoYXQgbWF0Y2hlcyBDb3B5UmVjb3JkcyB3aXRoIGEgZml4ZWQgcXVhbnRpdHkgb2YqL1xuICAgIC8qIGVudHJpZXMgd2hlcmUgdGhlIHZhbHVlcyBtYXRjaCBwYXR0ZXJucyBmb3IgY29ycmVzcG9uZGluZyBrZXlzIGlzIG1lcmVseSovXG4gICAgLyogYSBoYXJkZW5lZCBvYmplY3Qgd2l0aCBwYXR0ZXJucyBpbiB0aGUgcGxhY2VzIG9mIHZhbHVlcyBmb3IqL1xuICAgIC8qIGNvcnJlc3BvbmRpbmcga2V5cy4qL1xuICAgIC8qIEZvciBleGFtcGxlLCBhIHBhdHRlcm4gdGhhdCBtYXRjaGVzIENvcHlSZWNvcmRzIHRoYXQgaGF2ZSBhIHN0cmluZyB2YWx1ZSovXG4gICAgLyogZm9yIHRoZSBrZXkgJ3gnIGFuZCBhIG51bWJlciBmb3IgdGhlIGtleSAneScgaXM6Ki9cbiAgICAvKiBoYXJkZW4oeyB4OiBNLnN0cmluZygpLCB5OiBNLm51bWJlcigpIH0pLiovXG4gICAgYXJyYXk6IChsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBsaW1pdHMgPyBNLmFycmF5T2YoTS5hbnkoKSwgbGltaXRzKSA6IEFycmF5U2hhcGUsXG4gICAgLyogdHVwbGU6IEEgcGF0dGVybiB0aGF0IG1hdGNoZXMgQ29weUFycmF5cyB3aXRoIGEgZml4ZWQgcXVhbnRpdHkgb2YgdmFsdWVzKi9cbiAgICAvKiB0aGF0IG1hdGNoIGEgaGV0ZXJvZ2VuZW91cyBhcnJheSBvZiBwYXR0ZXJucyBpcyBtZXJlbHkgYSBoYXJkZW5lZCBhcnJheSovXG4gICAgLyogb2YgdGhlIHJlc3BlY3RpdmUgcGF0dGVybnMuKi9cbiAgICAvKiBGb3IgZXhhbXBsZSwgYSBwYXR0ZXJuIHRoYXQgbWF0Y2hlcyBDb3B5QXJyYXlzIG9mIGxlbmd0aCAyIHRoYXQgaGF2ZSBhKi9cbiAgICAvKiBzdHJpbmcgYXQgaW5kZXggMCBhbmQgYSBudW1iZXIgYXQgaW5kZXggMSBpczoqL1xuICAgIC8qIGhhcmRlbihbIE0uc3RyaW5nKCksIE0ubnVtYmVyKCkgXSkuKi9cbiAgICBieXRlQXJyYXk6IChsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBsaW1pdHMgPyBtYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6Ynl0ZUFycmF5JywgW2xpbWl0c10pIDogQnl0ZUFycmF5U2hhcGUsXG4gICAgc2V0OiAobGltaXRzID0gdW5kZWZpbmVkKSA9PiAobGltaXRzID8gTS5zZXRPZihNLmFueSgpLCBsaW1pdHMpIDogU2V0U2hhcGUpLFxuICAgIGJhZzogKGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIGxpbWl0cyA/IE0uYmFnT2YoTS5hbnkoKSwgTS5hbnkoKSwgbGltaXRzKSA6IEJhZ1NoYXBlLFxuICAgIG1hcDogKGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIGxpbWl0cyA/IE0ubWFwT2YoTS5hbnkoKSwgTS5hbnkoKSwgbGltaXRzKSA6IE1hcFNoYXBlLFxuICAgIC8qIGhldGVyb2dlbmVvdXMgbWFwOiBBIHBhdHRlcm4gdGhhdCBtYXRjaGVzIENvcHlNYXBzIHdpdGggYSBmaXhlZCBxdWFudGl0eSovXG4gICAgLyogb2YgZW50cmllcyB3aGVyZSB0aGUgdmFsdWUgZm9yIGVhY2gga2V5IG1hdGNoZXMgYSBjb3JyZXNwb25kaW5nIHBhdHRlcm4qL1xuICAgIC8qIGlzIG1lcmVseSBhIChoYXJkZW5lZCkgQ29weU1hcCB3aXRoIHBhdHRlcm5zIGluc3RlYWQgb2YgdmFsdWVzIGZvciB0aGUqL1xuICAgIC8qIGNvcnJlc3BvbmRpbmcga2V5cy4qL1xuICAgIC8qIEZvciBleGFtcGxlLCBhIHBhdHRlcm4gdGhhdCBtYXRjaGVzIENvcHlNYXBzIHdoZXJlIHRoZSB2YWx1ZSBmb3IgdGhlIGtleSovXG4gICAgLyogJ3gnIGlzIGEgbnVtYmVyIGFuZCB0aGUgdmFsdWUgZm9yIHRoZSBrZXkgJ3knIGlzIGEgc3RyaW5nIGlzOiovXG4gICAgLyogbWFrZUNvcHlNYXAoW1sneCcsIE0ubnVtYmVyKCldLCBbJ3knLCBNLnN0cmluZygpXV0pLiovXG4gICAgcmVtb3RhYmxlOiBtYWtlUmVtb3RhYmxlTWF0Y2hlcixcbiAgICBlcnJvcjogKCkgPT4gRXJyb3JTaGFwZSxcbiAgICBwcm9taXNlOiAoKSA9PiBQcm9taXNlU2hhcGUsXG4gICAgdW5kZWZpbmVkOiAoKSA9PiBVbmRlZmluZWRTaGFwZSxcbiAgICBudWxsOiAoKSA9PiBudWxsLFxuXG4gICAgbHQ6IHJpZ2h0T3BlcmFuZCA9PiBtYWtlTWF0Y2hlcignbWF0Y2g6bHQnLCByaWdodE9wZXJhbmQpLFxuICAgIGx0ZTogcmlnaHRPcGVyYW5kID0+IG1ha2VNYXRjaGVyKCdtYXRjaDpsdGUnLCByaWdodE9wZXJhbmQpLFxuICAgIGVxOiBrZXkgPT4ge1xuICAgICAgYXNzZXJ0S2V5KGtleSk7XG4gICAgICByZXR1cm4ga2V5ID09PSB1bmRlZmluZWQgPyBNLnVuZGVmaW5lZCgpIDoga2V5O1xuICAgIH0sXG4gICAgbmVxOiBrZXkgPT4gTS5ub3QoTS5lcShrZXkpKSxcbiAgICBndGU6IHJpZ2h0T3BlcmFuZCA9PiBtYWtlTWF0Y2hlcignbWF0Y2g6Z3RlJywgcmlnaHRPcGVyYW5kKSxcbiAgICBndDogcmlnaHRPcGVyYW5kID0+IG1ha2VNYXRjaGVyKCdtYXRjaDpndCcsIHJpZ2h0T3BlcmFuZCksXG5cbiAgICByZWNvcmRPZjogKGtleVBhdHQgPSBNLmFueSgpLCB2YWx1ZVBhdHQgPSBNLmFueSgpLCBsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBtYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6cmVjb3JkT2YnLCBba2V5UGF0dCwgdmFsdWVQYXR0LCBsaW1pdHNdKSxcbiAgICBhcnJheU9mOiAoc3ViUGF0dCA9IE0uYW55KCksIGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIG1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDphcnJheU9mJywgW3N1YlBhdHQsIGxpbWl0c10pLFxuICAgIHNldE9mOiAoa2V5UGF0dCA9IE0uYW55KCksIGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIG1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpzZXRPZicsIFtrZXlQYXR0LCBsaW1pdHNdKSxcbiAgICBiYWdPZjogKGtleVBhdHQgPSBNLmFueSgpLCBjb3VudFBhdHQgPSBNLmFueSgpLCBsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBtYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6YmFnT2YnLCBba2V5UGF0dCwgY291bnRQYXR0LCBsaW1pdHNdKSxcbiAgICBjb250YWluZXJIYXM6IChlbGVtZW50UGF0dCA9IE0uYW55KCksIGNvdW50UGF0dCA9IDFuLCBsaW1pdHMgPSB1bmRlZmluZWQpID0+XG4gICAgICBtYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6Y29udGFpbmVySGFzJywgW2VsZW1lbnRQYXR0LCBjb3VudFBhdHQsIGxpbWl0c10pLFxuICAgIG1hcE9mOiAoa2V5UGF0dCA9IE0uYW55KCksIHZhbHVlUGF0dCA9IE0uYW55KCksIGxpbWl0cyA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIG1ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDptYXBPZicsIFtrZXlQYXR0LCB2YWx1ZVBhdHQsIGxpbWl0c10pLFxuICAgIHNwbGl0QXJyYXk6IChiYXNlLCBvcHRpb25hbCA9IHVuZGVmaW5lZCwgcmVzdCA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIG1ha2VNYXRjaGVyKFxuICAgICAgICAnbWF0Y2g6c3BsaXRBcnJheScsXG4gICAgICAgIG1ha2VTcGxpdFBheWxvYWQoW10sIGJhc2UsIG9wdGlvbmFsLCByZXN0KSxcbiAgICAgICksXG4gICAgc3BsaXRSZWNvcmQ6IChiYXNlLCBvcHRpb25hbCA9IHVuZGVmaW5lZCwgcmVzdCA9IHVuZGVmaW5lZCkgPT5cbiAgICAgIG1ha2VNYXRjaGVyKFxuICAgICAgICAnbWF0Y2g6c3BsaXRSZWNvcmQnLFxuICAgICAgICBtYWtlU3BsaXRQYXlsb2FkKHt9LCBiYXNlLCBvcHRpb25hbCwgcmVzdCksXG4gICAgICApLFxuICAgIHNwbGl0OiAoYmFzZSwgcmVzdCA9IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgaWYgKHBhc3NTdHlsZU9mKGhhcmRlbihiYXNlKSkgPT09ICdjb3B5QXJyYXknKSB7XG4gICAgICAgIC8qIFRPRE8gYXQtdHMtZXhwZWN0LWVycm9yIHdvcmtzIGxvY2FsbHkgYnV0IG5vdCBmcm9tIEBlbmRvL2V4byovXG4gICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgV2Uga25vdyBpdCBzaG91bGQgYmUgYW4gYXJyYXkqL1xuICAgICAgICByZXR1cm4gTS5zcGxpdEFycmF5KGJhc2UsIHJlc3QgJiYgW10sIHJlc3QpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIE0uc3BsaXRSZWNvcmQoYmFzZSwgcmVzdCAmJiB7fSwgcmVzdCk7XG4gICAgICB9XG4gICAgfSxcbiAgICBwYXJ0aWFsOiAoYmFzZSwgcmVzdCA9IHVuZGVmaW5lZCkgPT4ge1xuICAgICAgaWYgKHBhc3NTdHlsZU9mKGhhcmRlbihiYXNlKSkgPT09ICdjb3B5QXJyYXknKSB7XG4gICAgICAgIC8qIFRPRE8gYXQtdHMtZXhwZWN0LWVycm9yIHdvcmtzIGxvY2FsbHkgYnV0IG5vdCBmcm9tIEBlbmRvL2V4byovXG4gICAgICAgIC8qIEB0cy1leHBlY3QtZXJyb3IgV2Uga25vdyBpdCBzaG91bGQgYmUgYW4gYXJyYXkqL1xuICAgICAgICByZXR1cm4gTS5zcGxpdEFycmF5KFtdLCBiYXNlLCByZXN0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBNLnNwbGl0UmVjb3JkKHt9LCBiYXNlLCByZXN0KTtcbiAgICAgIH1cbiAgICB9LFxuXG4gICAgZXJlZjogdCA9PiBNLm9yKHQsIE0ucHJvbWlzZSgpKSxcbiAgICBvcHQ6IHQgPT4gTS5vcihNLnVuZGVmaW5lZCgpLCB0KSxcblxuICAgIGludGVyZmFjZTogKGludGVyZmFjZU5hbWUsIG1ldGhvZEd1YXJkcywgb3B0aW9ucykgPT5cbiAgICAgIC8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG4gICAgICBtYWtlSW50ZXJmYWNlR3VhcmQoaW50ZXJmYWNlTmFtZSwgbWV0aG9kR3VhcmRzLCBvcHRpb25zKSxcbiAgICBjYWxsOiAoLi4uYXJnUGF0dGVybnMpID0+XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgICAgbWFrZU1ldGhvZEd1YXJkTWFrZXIoJ3N5bmMnLCBhcmdQYXR0ZXJucyksXG4gICAgY2FsbFdoZW46ICguLi5hcmdHdWFyZHMpID0+XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgICAgbWFrZU1ldGhvZEd1YXJkTWFrZXIoJ2FzeW5jJywgYXJnR3VhcmRzKSxcblxuICAgIGF3YWl0OiBhcmdQYXR0ZXJuID0+XG4gICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgICAgbWFrZUF3YWl0QXJnR3VhcmQoYXJnUGF0dGVybiksXG4gICAgcmF3OiAoKSA9PlxuICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbiAgICAgIG1ha2VSYXdHdWFyZCgpLFxuICB9KTtcblxuICByZXR1cm4gaGFyZGVuKHtcbiAgICBjaGVja01hdGNoZXMsXG4gICAgbWF0Y2hlcyxcbiAgICBtdXN0TWF0Y2gsXG4gICAgYXNzZXJ0UGF0dGVybixcbiAgICBpc1BhdHRlcm4sXG4gICAgZ2V0UmFua0NvdmVyLFxuICAgIE0sXG4gICAga2luZE9mLFxuICAgIGNvbnRhaW5lckhhc1NwbGl0LFxuICB9KTtcbn07XG5cbi8qIE9ubHkgaW5jbHVkZSB0aG9zZSB3aG9zZSBtZWFuaW5nIGlzIGluZGVwZW5kZW50IG9mIGFuIGltcHV0ZWQgc29ydCBvcmRlciovXG4vKiBvZiByZW1vdGFibGVzLCBvciBvZiBlbmNvZGluZyBvZiBwYXNzYWJsZSBhcyBzb3J0YWJsZSBzdHJpbmdzLiBUaHVzLCovXG4vKiBnZXRSYW5rQ292ZXIgaXMgb21pdHRlZC4gVG8gZ2V0IG9uZSwgeW91J2QgbmVlZCB0byBpbnN0YW50aWF0ZSovXG4vKiBgbWFrZVBhdHRlcm5LaXQoKWAgeW91cnNlbGYuIFNpbmNlIHRoZXJlIGFyZSBjdXJyZW50bHkgbm8gZXh0ZXJuYWwqL1xuLyogdXNlcyBvZiBgZ2V0UmFua0NvdmVyYCwgZm9yIGNsYXJpdHkgZHVyaW5nIGRldmVsb3BtZW50LCBgbWFrZVBhdHRlcm5LaXRgKi9cbi8qIGlzIG5vdCBjdXJyZW50bHkgZXhwb3J0ZWQuKi9cbiAgICAgICBjb25zdCB7XG4gIGNoZWNrTWF0Y2hlcyxcbiAgbWF0Y2hlcyxcbiAgbXVzdE1hdGNoLFxuICBhc3NlcnRQYXR0ZXJuLFxuICBpc1BhdHRlcm4sXG4gIGdldFJhbmtDb3ZlcixcbiAgTSxcbiAga2luZE9mLFxuICBjb250YWluZXJIYXNTcGxpdCxcbn0gPSBtYWtlUGF0dGVybktpdCgpOyRozY9fb25jZS5jaGVja01hdGNoZXMoY2hlY2tNYXRjaGVzKTskaM2PX29uY2UubWF0Y2hlcyhtYXRjaGVzKTskaM2PX29uY2UubXVzdE1hdGNoKG11c3RNYXRjaCk7JGjNj19vbmNlLmFzc2VydFBhdHRlcm4oYXNzZXJ0UGF0dGVybik7JGjNj19vbmNlLmlzUGF0dGVybihpc1BhdHRlcm4pOyRozY9fb25jZS5nZXRSYW5rQ292ZXIoZ2V0UmFua0NvdmVyKTskaM2PX29uY2UuTShNKTskaM2PX29uY2Uua2luZE9mKGtpbmRPZik7JGjNj19vbmNlLmNvbnRhaW5lckhhc1NwbGl0KGNvbnRhaW5lckhhc1NwbGl0KTtcblxuTU0gPSBNO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIEd1YXJkcyAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiBNLmF3YWl0KC4uLikqL1xuY29uc3QgQXdhaXRBcmdHdWFyZFBheWxvYWRTaGFwZSA9IGhhcmRlbih7XG4gIGFyZ0d1YXJkOiBNLnBhdHRlcm4oKSxcbn0pO1xuXG4gICAgICAgY29uc3QgQXdhaXRBcmdHdWFyZFNoYXBlID0gTS5raW5kKCdndWFyZDphd2FpdEFyZ0d1YXJkJyk7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcmV0dXJucyB7c3BlY2ltZW4gaXMgQXdhaXRBcmdHdWFyZH1cbiAqLyRozY9fb25jZS5Bd2FpdEFyZ0d1YXJkU2hhcGUoQXdhaXRBcmdHdWFyZFNoYXBlKTtcbiAgICAgICBjb25zdCBpc0F3YWl0QXJnR3VhcmQgPSBzcGVjaW1lbiA9PlxuICBtYXRjaGVzKHNwZWNpbWVuLCBBd2FpdEFyZ0d1YXJkU2hhcGUpOyRozY9fb25jZS5pc0F3YWl0QXJnR3VhcmQoaXNBd2FpdEFyZ0d1YXJkKTtcbmhhcmRlbihpc0F3YWl0QXJnR3VhcmQpO1xuXG4vKipcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgQXdhaXRBcmdHdWFyZH1cbiAqL1xuICAgICAgIGNvbnN0IGFzc2VydEF3YWl0QXJnR3VhcmQgPSBzcGVjaW1lbiA9PiB7XG4gIG11c3RNYXRjaChzcGVjaW1lbiwgQXdhaXRBcmdHdWFyZFNoYXBlLCAnYXdhaXRBcmdHdWFyZCcpO1xufTskaM2PX29uY2UuYXNzZXJ0QXdhaXRBcmdHdWFyZChhc3NlcnRBd2FpdEFyZ0d1YXJkKTtcbmhhcmRlbihhc3NlcnRBd2FpdEFyZ0d1YXJkKTtcblxuLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm59IGFyZ1BhdHRlcm5cbiAqIEByZXR1cm5zIHtBd2FpdEFyZ0d1YXJkfVxuICovXG5jb25zdCBtYWtlQXdhaXRBcmdHdWFyZCA9IGFyZ1BhdHRlcm4gPT4ge1xuICAvKiogQHR5cGUge0F3YWl0QXJnR3VhcmR9ICovXG4gIGNvbnN0IHJlc3VsdCA9IG1ha2VUYWdnZWQoJ2d1YXJkOmF3YWl0QXJnR3VhcmQnLCB7XG4gICAgYXJnR3VhcmQ6IGFyZ1BhdHRlcm4sXG4gIH0pO1xuICBhc3NlcnRBd2FpdEFyZ0d1YXJkKHJlc3VsdCk7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKiBNLnJhdygpKi9cblxuY29uc3QgUmF3R3VhcmRQYXlsb2FkU2hhcGUgPSBNLnJlY29yZCgpO1xuXG4gICAgICAgY29uc3QgUmF3R3VhcmRTaGFwZSA9IE0ua2luZCgnZ3VhcmQ6cmF3R3VhcmQnKTskaM2PX29uY2UuUmF3R3VhcmRTaGFwZShSYXdHdWFyZFNoYXBlKTtcblxuICAgICAgIGNvbnN0IGlzUmF3R3VhcmQgPSBzcGVjaW1lbiA9PiBtYXRjaGVzKHNwZWNpbWVuLCBSYXdHdWFyZFNoYXBlKTskaM2PX29uY2UuaXNSYXdHdWFyZChpc1Jhd0d1YXJkKTtcblxuICAgICAgIGNvbnN0IGFzc2VydFJhd0d1YXJkID0gc3BlY2ltZW4gPT5cbiAgbXVzdE1hdGNoKHNwZWNpbWVuLCBSYXdHdWFyZFNoYXBlLCAncmF3R3VhcmQnKTtcblxuLyoqXG4gKiBAcmV0dXJucyB7UmF3R3VhcmR9XG4gKi8kaM2PX29uY2UuYXNzZXJ0UmF3R3VhcmQoYXNzZXJ0UmF3R3VhcmQpO1xuY29uc3QgbWFrZVJhd0d1YXJkID0gKCkgPT4gbWFrZVRhZ2dlZCgnZ3VhcmQ6cmF3R3VhcmQnLCB7fSk7XG5cbi8qIE0uY2FsbCguLi4pKi9cbi8qIE0uY2FsbFdoZW4oLi4uKSovXG5cbiAgICAgICBjb25zdCBTeW5jVmFsdWVHdWFyZFNoYXBlID0gTS5vcihSYXdHdWFyZFNoYXBlLCBNLnBhdHRlcm4oKSk7JGjNj19vbmNlLlN5bmNWYWx1ZUd1YXJkU2hhcGUoU3luY1ZhbHVlR3VhcmRTaGFwZSk7XG5cbiAgICAgICBjb25zdCBTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSA9IE0uYXJyYXlPZihTeW5jVmFsdWVHdWFyZFNoYXBlKTskaM2PX29uY2UuU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUoU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUpO1xuXG5jb25zdCBBcmdHdWFyZFNoYXBlID0gTS5vcihSYXdHdWFyZFNoYXBlLCBBd2FpdEFyZ0d1YXJkU2hhcGUsIE0ucGF0dGVybigpKTtcbiAgICAgICBjb25zdCBBcmdHdWFyZExpc3RTaGFwZSA9IE0uYXJyYXlPZihBcmdHdWFyZFNoYXBlKTskaM2PX29uY2UuQXJnR3VhcmRMaXN0U2hhcGUoQXJnR3VhcmRMaXN0U2hhcGUpO1xuXG5jb25zdCBTeW5jTWV0aG9kR3VhcmRQYXlsb2FkU2hhcGUgPSBoYXJkZW4oe1xuICBjYWxsS2luZDogJ3N5bmMnLFxuICBhcmdHdWFyZHM6IFN5bmNWYWx1ZUd1YXJkTGlzdFNoYXBlLFxuICBvcHRpb25hbEFyZ0d1YXJkczogTS5vcHQoU3luY1ZhbHVlR3VhcmRMaXN0U2hhcGUpLFxuICByZXN0QXJnR3VhcmQ6IE0ub3B0KFN5bmNWYWx1ZUd1YXJkU2hhcGUpLFxuICByZXR1cm5HdWFyZDogU3luY1ZhbHVlR3VhcmRTaGFwZSxcbn0pO1xuXG5jb25zdCBBc3luY01ldGhvZEd1YXJkUGF5bG9hZFNoYXBlID0gaGFyZGVuKHtcbiAgY2FsbEtpbmQ6ICdhc3luYycsXG4gIGFyZ0d1YXJkczogQXJnR3VhcmRMaXN0U2hhcGUsXG4gIG9wdGlvbmFsQXJnR3VhcmRzOiBNLm9wdChBcmdHdWFyZExpc3RTaGFwZSksXG4gIHJlc3RBcmdHdWFyZDogTS5vcHQoU3luY1ZhbHVlR3VhcmRTaGFwZSksXG4gIHJldHVybkd1YXJkOiBTeW5jVmFsdWVHdWFyZFNoYXBlLFxufSk7XG5cbiAgICAgICBjb25zdCBNZXRob2RHdWFyZFBheWxvYWRTaGFwZSA9IE0ub3IoXG4gIFN5bmNNZXRob2RHdWFyZFBheWxvYWRTaGFwZSxcbiAgQXN5bmNNZXRob2RHdWFyZFBheWxvYWRTaGFwZSxcbik7JGjNj19vbmNlLk1ldGhvZEd1YXJkUGF5bG9hZFNoYXBlKE1ldGhvZEd1YXJkUGF5bG9hZFNoYXBlKTtcblxuICAgICAgIGNvbnN0IE1ldGhvZEd1YXJkU2hhcGUgPSBNLmtpbmQoJ2d1YXJkOm1ldGhvZEd1YXJkJyk7XG5cbi8qKlxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBNZXRob2RHdWFyZH1cbiAqLyRozY9fb25jZS5NZXRob2RHdWFyZFNoYXBlKE1ldGhvZEd1YXJkU2hhcGUpO1xuICAgICAgIGNvbnN0IGFzc2VydE1ldGhvZEd1YXJkID0gc3BlY2ltZW4gPT4ge1xuICBtdXN0TWF0Y2goc3BlY2ltZW4sIE1ldGhvZEd1YXJkU2hhcGUsICdtZXRob2RHdWFyZCcpO1xufTskaM2PX29uY2UuYXNzZXJ0TWV0aG9kR3VhcmQoYXNzZXJ0TWV0aG9kR3VhcmQpO1xuaGFyZGVuKGFzc2VydE1ldGhvZEd1YXJkKTtcblxuLyoqXG4gKiBAcGFyYW0geydzeW5jJ3wnYXN5bmMnfSBjYWxsS2luZFxuICogQHBhcmFtIHtBcmdHdWFyZFtdfSBhcmdHdWFyZHNcbiAqIEBwYXJhbSB7QXJnR3VhcmRbXX0gW29wdGlvbmFsQXJnR3VhcmRzXVxuICogQHBhcmFtIHtTeW5jVmFsdWVHdWFyZH0gW3Jlc3RBcmdHdWFyZF1cbiAqIEByZXR1cm5zIHtNZXRob2RHdWFyZE1ha2VyfVxuICovXG5jb25zdCBtYWtlTWV0aG9kR3VhcmRNYWtlciA9IChcbiAgY2FsbEtpbmQsXG4gIGFyZ0d1YXJkcyxcbiAgb3B0aW9uYWxBcmdHdWFyZHMgPSB1bmRlZmluZWQsXG4gIHJlc3RBcmdHdWFyZCA9IHVuZGVmaW5lZCxcbikgPT5cbiAgaGFyZGVuKHtcbiAgICBvcHRpb25hbDogKC4uLm9wdEFyZ0d1YXJkcykgPT4ge1xuICAgICAgb3B0aW9uYWxBcmdHdWFyZHMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICBGYWlsYENhbiBvbmx5IGhhdmUgb25lIHNldCBvZiBvcHRpb25hbCBndWFyZHNgO1xuICAgICAgcmVzdEFyZ0d1YXJkID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgRmFpbGBvcHRpb25hbCBhcmcgZ3VhcmRzIG11c3QgY29tZSBiZWZvcmUgcmVzdCBhcmdgO1xuICAgICAgcmV0dXJuIG1ha2VNZXRob2RHdWFyZE1ha2VyKGNhbGxLaW5kLCBhcmdHdWFyZHMsIG9wdEFyZ0d1YXJkcyk7XG4gICAgfSxcbiAgICByZXN0OiByQXJnR3VhcmQgPT4ge1xuICAgICAgcmVzdEFyZ0d1YXJkID09PSB1bmRlZmluZWQgfHwgRmFpbGBDYW4gb25seSBoYXZlIG9uZSByZXN0IGFyZ2A7XG4gICAgICByZXR1cm4gbWFrZU1ldGhvZEd1YXJkTWFrZXIoXG4gICAgICAgIGNhbGxLaW5kLFxuICAgICAgICBhcmdHdWFyZHMsXG4gICAgICAgIG9wdGlvbmFsQXJnR3VhcmRzLFxuICAgICAgICByQXJnR3VhcmQsXG4gICAgICApO1xuICAgIH0sXG4gICAgcmV0dXJuczogKHJldHVybkd1YXJkID0gTS51bmRlZmluZWQoKSkgPT4ge1xuICAgICAgLyoqIEB0eXBlIHtNZXRob2RHdWFyZH0gKi9cbiAgICAgIGNvbnN0IHJlc3VsdCA9IG1ha2VUYWdnZWQoJ2d1YXJkOm1ldGhvZEd1YXJkJywge1xuICAgICAgICBjYWxsS2luZCxcbiAgICAgICAgYXJnR3VhcmRzLFxuICAgICAgICBvcHRpb25hbEFyZ0d1YXJkcyxcbiAgICAgICAgcmVzdEFyZ0d1YXJkLFxuICAgICAgICByZXR1cm5HdWFyZCxcbiAgICAgIH0pO1xuICAgICAgYXNzZXJ0TWV0aG9kR3VhcmQocmVzdWx0KTtcbiAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcbiAgfSk7XG5cbiAgICAgICBjb25zdCBJbnRlcmZhY2VHdWFyZFBheWxvYWRTaGFwZSA9IE0uc3BsaXRSZWNvcmQoXG4gIHtcbiAgICBpbnRlcmZhY2VOYW1lOiBNLnN0cmluZygpLFxuICAgIG1ldGhvZEd1YXJkczogTS5yZWNvcmRPZihNLnN0cmluZygpLCBNZXRob2RHdWFyZFNoYXBlKSxcbiAgfSxcbiAge1xuICAgIGRlZmF1bHRHdWFyZHM6IE0ub3IoTS51bmRlZmluZWQoKSwgJ3Bhc3NhYmxlJywgJ3JhdycpLFxuICAgIHNsb3BweTogTS5ib29sZWFuKCksXG4gICAgc3ltYm9sTWV0aG9kR3VhcmRzOiBNLm1hcE9mKE0uc3ltYm9sKCksIE1ldGhvZEd1YXJkU2hhcGUpLFxuICB9LFxuKTskaM2PX29uY2UuSW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGUoSW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGUpO1xuXG4gICAgICAgY29uc3QgSW50ZXJmYWNlR3VhcmRTaGFwZSA9IE0ua2luZCgnZ3VhcmQ6aW50ZXJmYWNlR3VhcmQnKTtcblxuLyoqXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIEludGVyZmFjZUd1YXJkfVxuICovJGjNj19vbmNlLkludGVyZmFjZUd1YXJkU2hhcGUoSW50ZXJmYWNlR3VhcmRTaGFwZSk7XG4gICAgICAgY29uc3QgYXNzZXJ0SW50ZXJmYWNlR3VhcmQgPSBzcGVjaW1lbiA9PiB7XG4gIG11c3RNYXRjaChzcGVjaW1lbiwgSW50ZXJmYWNlR3VhcmRTaGFwZSwgJ2ludGVyZmFjZUd1YXJkJyk7XG59OyRozY9fb25jZS5hc3NlcnRJbnRlcmZhY2VHdWFyZChhc3NlcnRJbnRlcmZhY2VHdWFyZCk7XG5oYXJkZW4oYXNzZXJ0SW50ZXJmYWNlR3VhcmQpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPFByb3BlcnR5S2V5LCBNZXRob2RHdWFyZD59IFtNID0gUmVjb3JkPFByb3BlcnR5S2V5LCBNZXRob2RHdWFyZD5dXG4gKiBAcGFyYW0ge3N0cmluZ30gaW50ZXJmYWNlTmFtZVxuICogQHBhcmFtIHtNfSBtZXRob2RHdWFyZHNcbiAqIEBwYXJhbSB7eyBzbG9wcHk/OiBib29sZWFuLCBkZWZhdWx0R3VhcmRzPzogRGVmYXVsdEd1YXJkVHlwZSB9fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtJbnRlcmZhY2VHdWFyZDxNPn1cbiAqL1xuY29uc3QgbWFrZUludGVyZmFjZUd1YXJkID0gKGludGVyZmFjZU5hbWUsIG1ldGhvZEd1YXJkcywgb3B0aW9ucyA9IHt9KSA9PiB7XG4gIGNvbnN0IHsgc2xvcHB5ID0gZmFsc2UsIGRlZmF1bHRHdWFyZHMgPSBzbG9wcHkgPyAncGFzc2FibGUnIDogdW5kZWZpbmVkIH0gPVxuICAgIG9wdGlvbnM7XG4gIC8qIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgc3RyaW5nLWtleWVkIG1ldGhvZCBndWFyZHMgYXJlIHJlcHJlc2VudGVkIGluKi9cbiAgLyogYSBDb3B5UmVjb3JkLiBCdXQgc3ltYm9sLWtleWVkIG1ldGhvZHMgY2Fubm90IGJlLCBzbyB3ZSBwdXQgdGhvc2UgaW4gYSovXG4gIC8qIENvcHlNYXAgd2hlbiBwcmVzZW50LiovXG4gIC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgTWV0aG9kR3VhcmQ+fSAqL1xuICBjb25zdCBzdHJpbmdNZXRob2RHdWFyZHMgPSB7fTtcbiAgLyoqIEB0eXBlIHtBcnJheTxbc3ltYm9sLCBNZXRob2RHdWFyZF0+fSAqL1xuICBjb25zdCBzeW1ib2xNZXRob2RHdWFyZHNFbnRyaWVzID0gW107XG4gIGZvciAoY29uc3Qga2V5IG9mIG93bktleXMobWV0aG9kR3VhcmRzKSkge1xuICAgIGNvbnN0IHZhbHVlID0gbWV0aG9kR3VhcmRzWy8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoa2V5KV07XG4gICAgaWYgKHR5cGVvZiBrZXkgPT09ICdzeW1ib2wnKSB7XG4gICAgICBzeW1ib2xNZXRob2RHdWFyZHNFbnRyaWVzLnB1c2goW2tleSwgdmFsdWVdKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyaW5nTWV0aG9kR3VhcmRzW2tleV0gPSB2YWx1ZTtcbiAgICB9XG4gIH1cbiAgLyoqIEB0eXBlIHtJbnRlcmZhY2VHdWFyZH0gKi9cbiAgY29uc3QgcmVzdWx0ID0gbWFrZVRhZ2dlZCgnZ3VhcmQ6aW50ZXJmYWNlR3VhcmQnLCB7XG4gICAgaW50ZXJmYWNlTmFtZSxcbiAgICBtZXRob2RHdWFyZHM6IHN0cmluZ01ldGhvZEd1YXJkcyxcbiAgICAuLi4oc3ltYm9sTWV0aG9kR3VhcmRzRW50cmllcy5sZW5ndGhcbiAgICAgID8geyBzeW1ib2xNZXRob2RHdWFyZHM6IG1ha2VDb3B5TWFwKHN5bWJvbE1ldGhvZEd1YXJkc0VudHJpZXMpIH1cbiAgICAgIDoge30pLFxuICAgIGRlZmF1bHRHdWFyZHMsXG4gIH0pO1xuICBhc3NlcnRJbnRlcmZhY2VHdWFyZChyZXN1bHQpO1xuICByZXR1cm4gLyoqIEB0eXBlIHtJbnRlcmZhY2VHdWFyZDxNPn0gKi8gKHJlc3VsdCk7XG59O1xuXG5jb25zdCBHdWFyZFBheWxvYWRTaGFwZXMgPSBoYXJkZW4oe1xuICAnZ3VhcmQ6YXdhaXRBcmdHdWFyZCc6IEF3YWl0QXJnR3VhcmRQYXlsb2FkU2hhcGUsXG4gICdndWFyZDpyYXdHdWFyZCc6IFJhd0d1YXJkUGF5bG9hZFNoYXBlLFxuICAnZ3VhcmQ6bWV0aG9kR3VhcmQnOiBNZXRob2RHdWFyZFBheWxvYWRTaGFwZSxcbiAgJ2d1YXJkOmludGVyZmFjZUd1YXJkJzogSW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGUsXG59KTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmF1bHRMaW1pdHMiOlsiZGVmYXVsdExpbWl0cyJdLCJjaGVja01hdGNoZXMiOlsiY2hlY2tNYXRjaGVzIl0sIm1hdGNoZXMiOlsibWF0Y2hlcyJdLCJtdXN0TWF0Y2giOlsibXVzdE1hdGNoIl0sImFzc2VydFBhdHRlcm4iOlsiYXNzZXJ0UGF0dGVybiJdLCJpc1BhdHRlcm4iOlsiaXNQYXR0ZXJuIl0sImdldFJhbmtDb3ZlciI6WyJnZXRSYW5rQ292ZXIiXSwiTSI6WyJNIl0sImtpbmRPZiI6WyJraW5kT2YiXSwiY29udGFpbmVySGFzU3BsaXQiOlsiY29udGFpbmVySGFzU3BsaXQiXSwiQXdhaXRBcmdHdWFyZFNoYXBlIjpbIkF3YWl0QXJnR3VhcmRTaGFwZSJdLCJpc0F3YWl0QXJnR3VhcmQiOlsiaXNBd2FpdEFyZ0d1YXJkIl0sImFzc2VydEF3YWl0QXJnR3VhcmQiOlsiYXNzZXJ0QXdhaXRBcmdHdWFyZCJdLCJSYXdHdWFyZFNoYXBlIjpbIlJhd0d1YXJkU2hhcGUiXSwiaXNSYXdHdWFyZCI6WyJpc1Jhd0d1YXJkIl0sImFzc2VydFJhd0d1YXJkIjpbImFzc2VydFJhd0d1YXJkIl0sIlN5bmNWYWx1ZUd1YXJkU2hhcGUiOlsiU3luY1ZhbHVlR3VhcmRTaGFwZSJdLCJTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSI6WyJTeW5jVmFsdWVHdWFyZExpc3RTaGFwZSJdLCJBcmdHdWFyZExpc3RTaGFwZSI6WyJBcmdHdWFyZExpc3RTaGFwZSJdLCJNZXRob2RHdWFyZFBheWxvYWRTaGFwZSI6WyJNZXRob2RHdWFyZFBheWxvYWRTaGFwZSJdLCJNZXRob2RHdWFyZFNoYXBlIjpbIk1ldGhvZEd1YXJkU2hhcGUiXSwiYXNzZXJ0TWV0aG9kR3VhcmQiOlsiYXNzZXJ0TWV0aG9kR3VhcmQiXSwiSW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGUiOlsiSW50ZXJmYWNlR3VhcmRQYXlsb2FkU2hhcGUiXSwiSW50ZXJmYWNlR3VhcmRTaGFwZSI6WyJJbnRlcmZhY2VHdWFyZFNoYXBlIl0sImFzc2VydEludGVyZmFjZUd1YXJkIjpbImFzc2VydEludGVyZmFjZUd1YXJkIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEXM//FYAQAAWAEAACIAAABAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAsCsWGzCQAAswkAACIAAABAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzIiwiLi9zcmMvbWVtby1yYWNlLmpzIiwiLi9zcmMvaXMtcHJvbWlzZS5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sImV4cG9ydHMiOlsibWFrZVByb21pc2VLaXQiLCJyYWNlUHJvbWlzZXMiXSwicmVleHBvcnRzIjpbIi4vc3JjL2lzLXByb21pc2UuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCxtZW1vUmFjZTskaM2PX2ltcG9ydHMoW1tcIi4vc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzXCIsIFtbXCJtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXRcIixbJGjNj19hID0+IChtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQgPSAkaM2PX2EpXV1dXSxbXCIuL3NyYy9tZW1vLXJhY2UuanNcIiwgW1tcIm1lbW9SYWNlXCIsWyRozY9fYSA9PiAobWVtb1JhY2UgPSAkaM2PX2EpXV1dXSxbXCIuL3NyYy9pcy1wcm9taXNlLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlcy5qc1wiLCBbXV1dKTtPYmplY3QuZGVmaW5lUHJvcGVydHkobWFrZVByb21pc2VLaXQsJ25hbWUnLHt2YWx1ZTpcIm1ha2VQcm9taXNlS2l0XCJ9KTskaM2PX29uY2UubWFrZVByb21pc2VLaXQobWFrZVByb21pc2VLaXQpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyYWNlUHJvbWlzZXMsJ25hbWUnLHt2YWx1ZTpcInJhY2VQcm9taXNlc1wifSk7JGjNj19vbmNlLnJhY2VQcm9taXNlcyhyYWNlUHJvbWlzZXMpO1xuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZSB7UHJvbWlzZUNvbnN0cnVjdG9yfSAqL1xuY29uc3QgQmVzdFBpcGVsaW5hYmxlUHJvbWlzZSA9IGdsb2JhbFRoaXMuSGFuZGxlZFByb21pc2UgfHwgUHJvbWlzZTtcblxuLyoqXG4gKiBtYWtlUHJvbWlzZUtpdCgpIGJ1aWxkcyBhIFByb21pc2Ugb2JqZWN0LCBhbmQgcmV0dXJucyBhIHJlY29yZFxuICogY29udGFpbmluZyB0aGUgcHJvbWlzZSBpdHNlbGYsIGFzIHdlbGwgYXMgc2VwYXJhdGUgZmFjZXRzIGZvciByZXNvbHZpbmdcbiAqIGFuZCByZWplY3RpbmcgaXQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEByZXR1cm5zIHtJTVBPUlQoJy4vc3JjL3R5cGVzLmpzJykuUHJvbWlzZUtpdDxUPn1cbiAqL1xuICAgICAgIGZ1bmN0aW9uIG1ha2VQcm9taXNlS2l0KCkge1xuICBjb25zdCB7IHJlc29sdmUsIHJlamVjdCwgZXhlY3V0b3IgfSA9IG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCgpO1xuXG4gIGNvbnN0IHByb21pc2UgPSBuZXcgQmVzdFBpcGVsaW5hYmxlUHJvbWlzZShleGVjdXRvcik7XG5cbiAgcmV0dXJuIGhhcmRlbih7IHByb21pc2UsIHJlc29sdmUsIHJlamVjdCB9KTtcbn1cbmhhcmRlbihtYWtlUHJvbWlzZUtpdCk7XG5cbi8qIE5COiBBbm90aGVyIGltcGxlbWVudGF0aW9uIGZvciBQcm9taXNlLnJhY2Ugd291bGQgYmUgdG8gdXNlIHRoZSByZWxlYXNpbmcgZXhlY3V0b3IsKi9cbi8qIEhvd2V2ZXIgd2hpbGUgaXQgd291bGQgbm8gbG9uZ2VyIGxlYWsgdGhlIHJhY2VkIHByb21pc2Ugb2JqZWN0cyB0aGVtc2VsdmVzLCBpdCB3b3VsZCovXG4vKiBzdGlsbCBsZWFrIHJlYWN0aW9ucyBvbiB0aGUgbm9uLXJlc29sdmVkIHByb21pc2VzIGNvbnRlbmRpbmcgZm9yIHRoZSByYWNlLiovXG5cbi8qKlxuICogQ3JlYXRlcyBhIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCBvciByZWplY3RlZCB3aGVuIGFueSBvZiB0aGUgcHJvdmlkZWQgUHJvbWlzZXMgYXJlIHJlc29sdmVkXG4gKiBvciByZWplY3RlZC5cbiAqXG4gKiBVbmxpa2UgYFByb21pc2UucmFjZWAgaXQgY2xlYW5zIHVwIGFmdGVyIGl0c2VsZiBzbyBhIG5vbi1yZXNvbHZlZCB2YWx1ZSBkb2Vzbid0IGhvbGQgb250b1xuICogdGhlIHJlc3VsdCBwcm9taXNlLlxuICpcbiAqIEB0ZW1wbGF0ZSB7cmVhZG9ubHkgdW5rbm93bltdIHwgW119IFRcbiAqIEBwYXJhbSB7VH0gdmFsdWVzIEFuIGl0ZXJhYmxlIG9mIFByb21pc2VzLlxuICogQHJldHVybnMge1Byb21pc2U8QXdhaXRlZDxUW251bWJlcl0+Pn0gQSBuZXcgUHJvbWlzZS5cbiAqL1xuICAgICAgIGZ1bmN0aW9uIHJhY2VQcm9taXNlcyh2YWx1ZXMpIHtcbiAgcmV0dXJuIGhhcmRlbihtZW1vUmFjZS5jYWxsKEJlc3RQaXBlbGluYWJsZVByb21pc2UsIHZhbHVlcykpO1xufVxuaGFyZGVuKHJhY2VQcm9taXNlcyk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUHJvbWlzZUtpdCI6WyJtYWtlUHJvbWlzZUtpdCJdLCJyYWNlUHJvbWlzZXMiOlsicmFjZVByb21pc2VzIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAOeuEJkDAwAAAwMAACsAAABAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzL3NyYy9pcy1wcm9taXNlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJpc1Byb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGlzUHJvbWlzZSwnbmFtZScse3ZhbHVlOlwiaXNQcm9taXNlXCJ9KTskaM2PX29uY2UuaXNQcm9taXNlKGlzUHJvbWlzZSk7LyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlIGFyZ3VtZW50IGlzIGEgUHJvbWlzZS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IG1heWJlUHJvbWlzZSBUaGUgdmFsdWUgdG8gZXhhbWluZVxuICogQHJldHVybnMge21heWJlUHJvbWlzZSBpcyBQcm9taXNlfSBXaGV0aGVyIGl0IGlzIGEgcHJvbWlzZVxuICovXG4gICAgICAgZnVuY3Rpb24gaXNQcm9taXNlKG1heWJlUHJvbWlzZSkge1xuICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1heWJlUHJvbWlzZSkgPT09IG1heWJlUHJvbWlzZTtcbn1cbmhhcmRlbihpc1Byb21pc2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNQcm9taXNlIjpbImlzUHJvbWlzZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADHaE2fRBYAAEQWAAAqAAAAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMy9zcmMvbWVtby1yYWNlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtZW1vUmFjZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKiBJbml0aWFsIHZlcnNpb24gYXV0aG9yZWQgYnkgQnJpYW4gS2ltOlxuaHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlL2lzc3Vlcy8xNzQ2OSNpc3N1ZWNvbW1lbnQtNjg1MjE2Nzc3XG4gVGhpcyBpcyBmcmVlIGFuZCB1bmVuY3VtYmVyZWQgc29mdHdhcmUgcmVsZWFzZWQgaW50byB0aGUgcHVibGljIGRvbWFpbi5cbiBBbnlvbmUgaXMgZnJlZSB0byBjb3B5LCBtb2RpZnksIHB1Ymxpc2gsIHVzZSwgY29tcGlsZSwgc2VsbCwgb3JcbmRpc3RyaWJ1dGUgdGhpcyBzb2Z0d2FyZSwgZWl0aGVyIGluIHNvdXJjZSBjb2RlIGZvcm0gb3IgYXMgYSBjb21waWxlZFxuYmluYXJ5LCBmb3IgYW55IHB1cnBvc2UsIGNvbW1lcmNpYWwgb3Igbm9uLWNvbW1lcmNpYWwsIGFuZCBieSBhbnlcbm1lYW5zLlxuIEluIGp1cmlzZGljdGlvbnMgdGhhdCByZWNvZ25pemUgY29weXJpZ2h0IGxhd3MsIHRoZSBhdXRob3Igb3IgYXV0aG9yc1xub2YgdGhpcyBzb2Z0d2FyZSBkZWRpY2F0ZSBhbnkgYW5kIGFsbCBjb3B5cmlnaHQgaW50ZXJlc3QgaW4gdGhlXG5zb2Z0d2FyZSB0byB0aGUgcHVibGljIGRvbWFpbi4gV2UgbWFrZSB0aGlzIGRlZGljYXRpb24gZm9yIHRoZSBiZW5lZml0XG5vZiB0aGUgcHVibGljIGF0IGxhcmdlIGFuZCB0byB0aGUgZGV0cmltZW50IG9mIG91ciBoZWlycyBhbmRcbnN1Y2Nlc3NvcnMuIFdlIGludGVuZCB0aGlzIGRlZGljYXRpb24gdG8gYmUgYW4gb3ZlcnQgYWN0IG9mXG5yZWxpbnF1aXNobWVudCBpbiBwZXJwZXR1aXR5IG9mIGFsbCBwcmVzZW50IGFuZCBmdXR1cmUgcmlnaHRzIHRvIHRoaXNcbnNvZnR3YXJlIHVuZGVyIGNvcHlyaWdodCBsYXcuXG4gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCxcbkVYUFJFU1MgT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULlxuSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1Jcbk9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLFxuQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SXG5PVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSByZWZlciB0byA8aHR0cDovL3VubGljZW5zZS5vcmcvPlxuKi9cblxuXG5cblxuXG5cblxuLyoqXG4gKiBUT0RPIENvbnNvbGlkYXRlIHdpdGggYGlzUHJpbWl0aXZlYCB0aGF0J3MgY3VycmVudGx5IGluIGBAZW5kby9wYXNzLXN0eWxlYC5cbiAqIExheWVyaW5nIGNvbnN0cmFpbnRzIG1ha2UgdGhpcyB0cmlja3ksIHdoaWNoIGlzIHdoeSB3ZSBoYXZlbid0IHlldCBmaWd1cmVkXG4gKiBvdXQgaG93IHRvIGRvIHRoaXMuXG4gKlxuICogQHR5cGUgeyh2YWw6IHVua25vd24pID0+IHZhbCBpcyAodW5kZWZpbmVkXG4gKiB8IG51bGxcbiAqIHwgYm9vbGVhblxuICogfCBudW1iZXJcbiAqIHwgYmlnaW50XG4gKiB8IHN0cmluZ1xuICogfCBzeW1ib2wpfVxuICovXG5jb25zdCBpc1ByaW1pdGl2ZSA9IHZhbCA9PlxuICAhdmFsIHx8ICh0eXBlb2YgdmFsICE9PSAnb2JqZWN0JyAmJiB0eXBlb2YgdmFsICE9PSAnZnVuY3Rpb24nKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgW1Q9YW55XVxuICogQHR5cGVkZWYge29iamVjdH0gRGVmZXJyZWRcbiAqIEBwcm9wZXJ0eSB7KHZhbHVlPzogSU1QT1JUKFwiLi90eXBlcy5qc1wiKS5FUmVmPFQ+ICkgPT4gdm9pZH0gcmVzb2x2ZVxuICogQHByb3BlcnR5IHsoZXJyPzogYW55ICkgPT4gdm9pZH0gcmVqZWN0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7IG5ldmVyXG4gKiAgfCB7c2V0dGxlZDogZmFsc2UsIGRlZmVycmVkczogU2V0PERlZmVycmVkPn1cbiAqICB8IHtzZXR0bGVkOiB0cnVlLCBkZWZlcnJlZHM/OiB1bmRlZmluZWR9XG4gKiB9IFByb21pc2VNZW1vUmVjb3JkXG4gKi9cblxuLyogS2V5cyBhcmUgdGhlIHZhbHVlcyBwYXNzZWQgdG8gcmFjZSwgdmFsdWVzIGFyZSBhIHJlY29yZCBvZiBkYXRhIGNvbnRhaW5pbmcgYSovXG4vKiBzZXQgb2YgZGVmZXJyZWRzIGFuZCB3aGV0aGVyIHRoZSB2YWx1ZSBoYXMgc2V0dGxlZC4qL1xuLyoqIEB0eXBlIHtXZWFrTWFwPG9iamVjdCwgUHJvbWlzZU1lbW9SZWNvcmQ+fSAqL1xuY29uc3Qga25vd25Qcm9taXNlcyA9IG5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHtQcm9taXNlTWVtb1JlY29yZCB8IHVuZGVmaW5lZH0gcmVjb3JkXG4gKiBAcmV0dXJucyB7U2V0PERlZmVycmVkPn1cbiAqL1xuY29uc3QgbWFya1NldHRsZWQgPSByZWNvcmQgPT4ge1xuICBpZiAoIXJlY29yZCB8fCByZWNvcmQuc2V0dGxlZCkge1xuICAgIHJldHVybiBuZXcgU2V0KCk7XG4gIH1cblxuICBjb25zdCB7IGRlZmVycmVkcyB9ID0gcmVjb3JkO1xuICBPYmplY3QuYXNzaWduKHJlY29yZCwge1xuICAgIGRlZmVycmVkczogdW5kZWZpbmVkLFxuICAgIHNldHRsZWQ6IHRydWUsXG4gIH0pO1xuICBPYmplY3QuZnJlZXplKHJlY29yZCk7XG4gIHJldHVybiBkZWZlcnJlZHM7XG59O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge2FueX0gdmFsdWVcbiAqIEByZXR1cm5zIHtQcm9taXNlTWVtb1JlY29yZH1cbiAqL1xuY29uc3QgZ2V0TWVtb1JlY29yZCA9IHZhbHVlID0+IHtcbiAgaWYgKGlzUHJpbWl0aXZlKHZhbHVlKSkge1xuICAgIC8qIElmIHRoZSBjb250ZW5kZXIgaXMgYSBwcmltaXRpdmUsIGF0dGVtcHRpbmcgdG8gdXNlIGl0IGFzIGEga2V5IGluIHRoZSovXG4gICAgLyogd2Vha21hcCB3b3VsZCB0aHJvdyBhbiBlcnJvci4gTHVja2lseSwgaXQgaXMgc2FmZSB0byBjYWxsKi9cbiAgICAvKiBgUHJvbWlzZS5yZXNvbHZlKGNvbnRlbmRlcikudGhlbmAgb24gYSBwcmltaXRpdmUgdmFsdWUgbXVsdGlwbGUgdGltZXMqL1xuICAgIC8qIGJlY2F1c2UgdGhlIHByb21pc2UgZnVsZmlsbHMgaW1tZWRpYXRlbHkuIFNvIHdlIGZha2UgYSBzZXR0bGVkIHJlY29yZC4qL1xuICAgIHJldHVybiBoYXJkZW4oeyBzZXR0bGVkOiB0cnVlIH0pO1xuICB9XG5cbiAgbGV0IHJlY29yZCA9IGtub3duUHJvbWlzZXMuZ2V0KHZhbHVlKTtcblxuICBpZiAoIXJlY29yZCkge1xuICAgIHJlY29yZCA9IHsgZGVmZXJyZWRzOiBuZXcgU2V0KCksIHNldHRsZWQ6IGZhbHNlIH07XG4gICAga25vd25Qcm9taXNlcy5zZXQodmFsdWUsIHJlY29yZCk7XG4gICAgLyogVGhpcyBjYWxsIHRvIGB0aGVuYCBoYXBwZW5zIG9uY2UgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgdmFsdWUuKi9cbiAgICBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW4oXG4gICAgICB2YWwgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IHsgcmVzb2x2ZSB9IG9mIG1hcmtTZXR0bGVkKHJlY29yZCkpIHtcbiAgICAgICAgICByZXNvbHZlKHZhbCk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBlcnIgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IHsgcmVqZWN0IH0gb2YgbWFya1NldHRsZWQocmVjb3JkKSkge1xuICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICk7XG4gIH1cbiAgcmV0dXJuIHJlY29yZDtcbn07XG5cbmNvbnN0IHsgcmFjZSB9ID0ge1xuICAvKipcbiAqIENyZWF0ZXMgYSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgd2hlbiBhbnkgb2YgdGhlIHByb3ZpZGVkIFByb21pc2VzIGFyZSByZXNvbHZlZFxuICogb3IgcmVqZWN0ZWQuXG4gKlxuICogVW5saWtlIGBQcm9taXNlLnJhY2VgIGl0IGNsZWFucyB1cCBhZnRlciBpdHNlbGYgc28gYSBub24tcmVzb2x2ZWQgdmFsdWUgZG9lc24ndCBob2xkIG9udG9cbiAqIHRoZSByZXN1bHQgcHJvbWlzZS5cbiAqXG4gKiBAdGVtcGxhdGUge3JlYWRvbmx5IHVua25vd25bXSB8IFtdfSBUXG4gKiBAdGVtcGxhdGUge1Byb21pc2VDb25zdHJ1Y3Rvcn0gW1A9UHJvbWlzZUNvbnN0cnVjdG9yXVxuICogQHRoaXMge1B9XG4gKiBAcGFyYW0ge1R9IHZhbHVlcyBBbiBpdGVyYWJsZSBvZiBQcm9taXNlcy5cbiAqIEByZXR1cm5zIHtQcm9taXNlPEF3YWl0ZWQ8VFtudW1iZXJdPj59IEEgbmV3IFByb21pc2UuXG4gKi9cbiAgcmFjZSh2YWx1ZXMpIHtcbiAgICBsZXQgZGVmZXJyZWQ7XG4gICAgLyoqIEB0eXBlIHtbLi4uVF19ICovXG4gICAgLyogQHRzLWV4cGVjdC1lcnJvciBmaWxsZWQgYnkgdGhlIGxvb3AqL1xuICAgIGNvbnN0IGNhY2hlZFZhbHVlcyA9IFtdO1xuICAgIGNvbnN0IEMgPSB0aGlzO1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBDKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGRlZmVycmVkID0geyByZXNvbHZlLCByZWplY3QgfTtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgdmFsdWVzKSB7XG4gICAgICAgIGNhY2hlZFZhbHVlcy5wdXNoKHZhbHVlKTtcbiAgICAgICAgY29uc3QgeyBzZXR0bGVkLCBkZWZlcnJlZHMgfSA9IGdldE1lbW9SZWNvcmQodmFsdWUpO1xuICAgICAgICBpZiAoc2V0dGxlZCkge1xuICAgICAgICAgIC8qIElmIHRoZSBjb250ZW5kZXIgaXMgc2V0dGxlZCAoaW5jbHVkaW5nIHByaW1pdGl2ZXMpLCBpdCBpcyBzYWZlKi9cbiAgICAgICAgICAvKiB0byBjYWxsIGBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW5gIG9uIGl0LiovXG4gICAgICAgICAgQy5yZXNvbHZlKHZhbHVlKS50aGVuKHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZGVmZXJyZWRzLmFkZChkZWZlcnJlZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIC8qIFRoZSBmaW5hbGx5IGNhbGxiYWNrIGV4ZWN1dGVzIHdoZW4gYW55IHZhbHVlIHNldHRsZXMsIHByZXZlbnRpbmcgYW55IG9mKi9cbiAgICAvKiB0aGUgdW5yZXNvbHZlZCB2YWx1ZXMgZnJvbSByZXRhaW5pbmcgYSByZWZlcmVuY2UgdG8gdGhlIHJlc29sdmVkIHZhbHVlLiovXG4gICAgcmV0dXJuIHJlc3VsdC5maW5hbGx5KCgpID0+IHtcbiAgICAgIGZvciAoY29uc3QgdmFsdWUgb2YgY2FjaGVkVmFsdWVzKSB7XG4gICAgICAgIGNvbnN0IHsgZGVmZXJyZWRzIH0gPSBnZXRNZW1vUmVjb3JkKHZhbHVlKTtcbiAgICAgICAgaWYgKGRlZmVycmVkcykge1xuICAgICAgICAgIGRlZmVycmVkcy5kZWxldGUoZGVmZXJyZWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH0sXG59OyRozY9fb25jZS5yYWNlKHJhY2UpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWVtb1JhY2UiOlsicmFjZSJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAIn6hoHQgAAB0IAAA1AAAAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMy9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtdKTsvKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAY2FsbGJhY2sgUHJvbWlzZUV4ZWN1dG9yIFRoZSBwcm9taXNlIGV4ZWN1dG9yXG4gKiBAcGFyYW0geyh2YWx1ZTogSU1QT1JUKCcuL3R5cGVzLmpzJykuRVJlZjxUPikgPT4gdm9pZH0gcmVzb2x2ZVxuICogQHBhcmFtIHsocmVhc29uOiBhbnkpID0+IHZvaWR9IHJlamVjdFxuICovXG5cbi8qKlxuICogbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KCkgYnVpbGRzIHJlc29sdmUvcmVqZWN0IGZ1bmN0aW9ucyB3aGljaCBkcm9wIHJlZmVyZW5jZXNcbiAqIHRvIHRoZSByZXNvbHZlL3JlamVjdCBmdW5jdGlvbnMgZ2F0aGVyZWQgZnJvbSBhbiBleGVjdXRvciB0byBiZSB1c2VkIHdpdGggYVxuICogcHJvbWlzZSBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHJldHVybnMge1BpY2s8SU1QT1JUKCcuL3R5cGVzLmpzJykuUHJvbWlzZUtpdDxUPiwgJ3Jlc29sdmUnIHwgJ3JlamVjdCc+ICYgeyBleGVjdXRvcjogUHJvbWlzZUV4ZWN1dG9yPFQ+fX1cbiAqL1xuICAgICAgIGNvbnN0IG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCA9ICgpID0+IHtcbiAgLyoqIEB0eXBlIHtudWxsIHwgdW5kZWZpbmVkIHwgKCh2YWx1ZTogSU1QT1JUKCcuL3R5cGVzLmpzJykuRVJlZjxUPikgPT4gdm9pZCl9ICovXG4gIGxldCBpbnRlcm5hbFJlc29sdmU7XG4gIC8qKiBAdHlwZSB7bnVsbCB8IHVuZGVmaW5lZCB8ICgocmVhc29uOiB1bmtub3duKSA9PiB2b2lkKX0gKi9cbiAgbGV0IGludGVybmFsUmVqZWN0O1xuXG4gIC8qKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLkVSZWY8VD59IHZhbHVlICovXG4gIGNvbnN0IHJlc29sdmUgPSB2YWx1ZSA9PiB7XG4gICAgaWYgKGludGVybmFsUmVzb2x2ZSkge1xuICAgICAgaW50ZXJuYWxSZXNvbHZlKHZhbHVlKTtcbiAgICAgIGludGVybmFsUmVzb2x2ZSA9IG51bGw7XG4gICAgICBpbnRlcm5hbFJlamVjdCA9IG51bGw7XG4gICAgfSBlbHNlIHtcbiAgICAgIGFzc2VydChpbnRlcm5hbFJlc29sdmUgPT09IG51bGwpO1xuICAgIH1cbiAgfTtcblxuICAvKiogQHBhcmFtIHt1bmtub3dufSByZWFzb24gKi9cbiAgY29uc3QgcmVqZWN0ID0gcmVhc29uID0+IHtcbiAgICBpZiAoaW50ZXJuYWxSZWplY3QpIHtcbiAgICAgIGludGVybmFsUmVqZWN0KHJlYXNvbik7XG4gICAgICBpbnRlcm5hbFJlc29sdmUgPSBudWxsO1xuICAgICAgaW50ZXJuYWxSZWplY3QgPSBudWxsO1xuICAgIH0gZWxzZSB7XG4gICAgICBhc3NlcnQoaW50ZXJuYWxSZWplY3QgPT09IG51bGwpO1xuICAgIH1cbiAgfTtcblxuICBjb25zdCBleGVjdXRvciA9IChyZXMsIHJlaikgPT4ge1xuICAgIGFzc2VydChpbnRlcm5hbFJlc29sdmUgPT09IHVuZGVmaW5lZCAmJiBpbnRlcm5hbFJlamVjdCA9PT0gdW5kZWZpbmVkKTtcbiAgICBpbnRlcm5hbFJlc29sdmUgPSByZXM7XG4gICAgaW50ZXJuYWxSZWplY3QgPSByZWo7XG4gIH07XG5cbiAgcmV0dXJuIGhhcmRlbih7IHJlc29sdmUsIHJlamVjdCwgZXhlY3V0b3IgfSk7XG59OyRozY9fb25jZS5tYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQobWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KTtcbmhhcmRlbihtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0IjpbIm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCJdfSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABFzP/xWAEAAFgBAAAmAAAAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMy9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAALOZ7ulEcAABRHAAAHQAAAEBlbmRvL3N0cmVhbS12MS4yLjEzL2luZGV4LmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbIm1ha2VQaXBlIiwibWFrZVF1ZXVlIiwibWFrZVN0cmVhbSIsIm1hcFJlYWRlciIsIm1hcFdyaXRlciIsInByaW1lIiwicHVtcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7bGV0IEUsbWFrZVByb21pc2VLaXQ7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsWyRozY9fYSA9PiAoRSA9ICRozY9fYSldXV1dLFtcIkBlbmRvL3Byb21pc2Uta2l0XCIsIFtbXCJtYWtlUHJvbWlzZUtpdFwiLFskaM2PX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjNj19hKV1dXV1dKTtcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qIFR5cGVTY3JpcHQgUmVhZE9ubHkgc2VtYW50aWNzIGFyZSBub3Qgc3VmZmljaWVudGx5IGV4cHJlc3NpdmUgdG8gZGlzdGluZ3Vpc2gqL1xuLyogYSB2YWx1ZSBvbmUgcHJvbWlzZXMgbm90IHRvIGFsdGVyIGZyb20gYSB2YWx1ZSBvbmUgbXVzdCBub3QgYWx0ZXIsKi9cbi8qIG1ha2luZyBpdCB1c2VsZXNzLiovXG5jb25zdCBmcmVlemUgPSAvKiogQHR5cGUgezxUPih2OiBUIHwgUmVhZG9ubHk8VD4pID0+IFR9ICovIChPYmplY3QuZnJlZXplKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHJldHVybnMge0lNUE9SVCgnLi90eXBlcy5qcycpLkFzeW5jUXVldWU8VD59XG4gKi9cbiAgICAgICBjb25zdCBtYWtlUXVldWUgPSAoKSA9PiB7XG4gIGxldCB7IHByb21pc2U6IHRhaWxQcm9taXNlLCByZXNvbHZlOiB0YWlsUmVzb2x2ZSB9ID0gbWFrZVByb21pc2VLaXQoKTtcbiAgcmV0dXJuIHtcbiAgICBwdXQodmFsdWUpIHtcbiAgICAgIGNvbnN0IHsgcmVzb2x2ZSwgcHJvbWlzZSB9ID0gbWFrZVByb21pc2VLaXQoKTtcbiAgICAgIHRhaWxSZXNvbHZlKGZyZWV6ZSh7IHZhbHVlLCBwcm9taXNlIH0pKTtcbiAgICAgIHRhaWxSZXNvbHZlID0gcmVzb2x2ZTtcbiAgICB9LFxuICAgIGdldCgpIHtcbiAgICAgIGNvbnN0IHByb21pc2UgPSB0YWlsUHJvbWlzZS50aGVuKG5leHQgPT4gbmV4dC52YWx1ZSk7XG4gICAgICB0YWlsUHJvbWlzZSA9IHRhaWxQcm9taXNlLnRoZW4obmV4dCA9PiBuZXh0LnByb21pc2UpO1xuICAgICAgcmV0dXJuIGhhcmRlbihwcm9taXNlKTtcbiAgICB9LFxuICB9O1xufTskaM2PX29uY2UubWFrZVF1ZXVlKG1ha2VRdWV1ZSk7XG5oYXJkZW4obWFrZVF1ZXVlKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFJlYWRcbiAqIEB0ZW1wbGF0ZSBUV3JpdGVcbiAqIEB0ZW1wbGF0ZSBUUmVhZFJldHVyblxuICogQHRlbXBsYXRlIFRXcml0ZVJldHVyblxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Bc3luY1NwcmluZzxJdGVyYXRvclJlc3VsdDxUUmVhZCwgVFJlYWRSZXR1cm4+Pn0gYWNrc1xuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5Bc3luY1Npbms8SXRlcmF0b3JSZXN1bHQ8VFdyaXRlLCBUV3JpdGVSZXR1cm4+Pn0gZGF0YVxuICovXG4gICAgICAgY29uc3QgbWFrZVN0cmVhbSA9IChhY2tzLCBkYXRhKSA9PiB7XG4gIGNvbnN0IHN0cmVhbSA9IGhhcmRlbih7XG4gICAgLyoqXG4gKiBAcGFyYW0ge1RXcml0ZX0gdmFsdWVcbiAqL1xuICAgIG5leHQodmFsdWUpIHtcbiAgICAgIC8qIE5vdGUgdGhlIHNoYWxsb3cgZnJlZXplIHNpbmNlIHZhbHVlIGlzIG5vdCBndWFyYW50ZWVkIHRvIGJlIGZyZWV6YWJsZSovXG4gICAgICAvKiAodHlwZWQgYXJyYXlzIGFyZSBub3QpLiovXG4gICAgICBkYXRhLnB1dChmcmVlemUoeyB2YWx1ZSwgZG9uZTogZmFsc2UgfSkpO1xuICAgICAgcmV0dXJuIGFja3MuZ2V0KCk7XG4gICAgfSxcbiAgICAvKipcbiAqIEBwYXJhbSB7VFdyaXRlUmV0dXJufSB2YWx1ZVxuICovXG4gICAgcmV0dXJuKHZhbHVlKSB7XG4gICAgICBkYXRhLnB1dChmcmVlemUoeyB2YWx1ZSwgZG9uZTogdHJ1ZSB9KSk7XG4gICAgICByZXR1cm4gYWNrcy5nZXQoKTtcbiAgICB9LFxuICAgIC8qKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyb3JcbiAqL1xuICAgIHRocm93KGVycm9yKSB7XG4gICAgICBkYXRhLnB1dChoYXJkZW4oUHJvbWlzZS5yZWplY3QoZXJyb3IpKSk7XG4gICAgICByZXR1cm4gYWNrcy5nZXQoKTtcbiAgICB9LFxuICAgIFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKSB7XG4gICAgICByZXR1cm4gc3RyZWFtO1xuICAgIH0sXG4gIH0pO1xuICByZXR1cm4gc3RyZWFtO1xufTskaM2PX29uY2UubWFrZVN0cmVhbShtYWtlU3RyZWFtKTtcbmhhcmRlbihtYWtlU3RyZWFtKTtcblxuLyogSlNEb2MgVHlwZVNjcmlwdCBzZWVtcyB1bmFibGUgdG8gZXhwcmVzcyB0aGlzIHBhcnRpY3VsYXIgZnVuY3Rpb24ncyovXG4vKiBlbnRhbmdsZW1lbnQgb2YgcXVldWVzLCBidXQgdGhlIGRlZmluaXRpb24gaW4gdHlwZXMuZC50cyB3b3JrcyBmb3IgdGhlIGVuZCovXG4vKiB1c2VyLiovXG4gICAgICAgY29uc3QgbWFrZVBpcGUgPSAoKSA9PiB7XG4gIGNvbnN0IGRhdGEgPSBtYWtlUXVldWUoKTtcbiAgY29uc3QgYWNrcyA9IG1ha2VRdWV1ZSgpO1xuICBjb25zdCByZWFkZXIgPSBtYWtlU3RyZWFtKGFja3MsIGRhdGEpO1xuICBjb25zdCB3cml0ZXIgPSBtYWtlU3RyZWFtKGRhdGEsIGFja3MpO1xuICByZXR1cm4gaGFyZGVuKFt3cml0ZXIsIHJlYWRlcl0pO1xufTskaM2PX29uY2UubWFrZVBpcGUobWFrZVBpcGUpO1xuaGFyZGVuKG1ha2VQaXBlKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFJlYWRcbiAqIEB0ZW1wbGF0ZSBUV3JpdGVcbiAqIEB0ZW1wbGF0ZSBUUmVhZFJldHVyblxuICogQHRlbXBsYXRlIFRXcml0ZVJldHVyblxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5TdHJlYW08VFdyaXRlLCBUUmVhZCwgVFdyaXRlUmV0dXJuLCBUUmVhZFJldHVybj59IHdyaXRlclxuICogQHBhcmFtIHtJTVBPUlQoJy4vdHlwZXMuanMnKS5TdHJlYW08VFJlYWQsIFRXcml0ZSwgVFJlYWRSZXR1cm4sIFRXcml0ZVJldHVybj59IHJlYWRlclxuICogQHBhcmFtIHtUV3JpdGV9IHByaW1lclxuICovXG4gICAgICAgY29uc3QgcHVtcCA9IGFzeW5jICh3cml0ZXIsIHJlYWRlciwgcHJpbWVyKSA9PiB7XG4gIC8qKiBAcGFyYW0ge1Byb21pc2U8SXRlcmF0b3JSZXN1bHQ8VFJlYWQsIFRSZWFkUmV0dXJuPj59IHByb21pc2UgKi9cbiAgY29uc3QgdGljayA9IHByb21pc2UgPT5cbiAgICBFLndoZW4oXG4gICAgICBwcm9taXNlLFxuICAgICAgcmVzdWx0ID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdC5kb25lKSB7XG4gICAgICAgICAgcmV0dXJuIHdyaXRlci5yZXR1cm4ocmVzdWx0LnZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvKiBCZWhvbGQ6IG11dHVhbCByZWN1cnNpb24uKi9cbiAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuICAgICAgICAgIHJldHVybiB0b2NrKHdyaXRlci5uZXh0KHJlc3VsdC52YWx1ZSkpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgKC8qKiBAdHlwZSB7RXJyb3J9ICovIGVycm9yKSA9PiB7XG4gICAgICAgIHJldHVybiB3cml0ZXIudGhyb3coZXJyb3IpO1xuICAgICAgfSxcbiAgICApO1xuICAvKiogQHBhcmFtIHtQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFRXcml0ZSwgVFdyaXRlUmV0dXJuPj59IHByb21pc2UgKi9cbiAgY29uc3QgdG9jayA9IHByb21pc2UgPT5cbiAgICBFLndoZW4oXG4gICAgICBwcm9taXNlLFxuICAgICAgcmVzdWx0ID0+IHtcbiAgICAgICAgaWYgKHJlc3VsdC5kb25lKSB7XG4gICAgICAgICAgcmV0dXJuIHJlYWRlci5yZXR1cm4ocmVzdWx0LnZhbHVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gdGljayhyZWFkZXIubmV4dChyZXN1bHQudmFsdWUpKTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgICgvKiogQHR5cGUge0Vycm9yfSAqLyBlcnJvcikgPT4ge1xuICAgICAgICByZXR1cm4gcmVhZGVyLnRocm93KGVycm9yKTtcbiAgICAgIH0sXG4gICAgKTtcbiAgYXdhaXQgdGljayhyZWFkZXIubmV4dChwcmltZXIpKTtcbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn07JGjNj19vbmNlLnB1bXAocHVtcCk7XG5oYXJkZW4ocHVtcCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRSZWFkXG4gKiBAdGVtcGxhdGUgVFdyaXRlXG4gKiBAdGVtcGxhdGUgVFJldHVyblxuICogQHBhcmFtIHtBc3luY0dlbmVyYXRvcjxUUmVhZCwgVFJldHVybiwgVFdyaXRlPn0gZ2VuZXJhdG9yXG4gKiBAcGFyYW0ge1RXcml0ZX0gcHJpbWVyXG4gKi9cbiAgICAgICBjb25zdCBwcmltZSA9IChnZW5lcmF0b3IsIHByaW1lcikgPT4ge1xuICAvKiBXZSBjYXB0dXJlIHRoZSBmaXJzdCByZXR1cm5lZCBwcm9taXNlLiovXG4gIGNvbnN0IGZpcnN0ID0gZ2VuZXJhdG9yLm5leHQocHJpbWVyKTtcbiAgLyoqIEB0eXBlIHtJdGVyYXRvclJlc3VsdDxUUmVhZCwgVFJldHVybj49fSAqL1xuICBsZXQgcmVzdWx0O1xuICBjb25zdCBwcmltZWQgPSBoYXJkZW4oe1xuICAgIC8qKiBAcGFyYW0ge1RXcml0ZX0gdmFsdWUgKi9cbiAgICBhc3luYyBuZXh0KHZhbHVlKSB7XG4gICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBqZXNzaWUuanMvc2FmZS1hd2FpdC1zZXBhcmF0b3IqL1xuICAgICAgICByZXN1bHQgPSBhd2FpdCBmaXJzdDtcbiAgICAgICAgaWYgKHJlc3VsdC5kb25lKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGdlbmVyYXRvci5uZXh0KHZhbHVlKTtcbiAgICB9LFxuICAgIC8qKiBAcGFyYW0ge1RSZXR1cm59IHZhbHVlICovXG4gICAgYXN5bmMgcmV0dXJuKHZhbHVlKSB7XG4gICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEBqZXNzaWUuanMvc2FmZS1hd2FpdC1zZXBhcmF0b3IqL1xuICAgICAgICByZXN1bHQgPSBhd2FpdCBmaXJzdDtcbiAgICAgICAgaWYgKHJlc3VsdC5kb25lKSB7XG4gICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGdlbmVyYXRvci5yZXR1cm4odmFsdWUpO1xuICAgIH0sXG4gICAgLyoqIEBwYXJhbSB7RXJyb3J9IGVycm9yICovXG4gICAgYXN5bmMgdGhyb3coZXJyb3IpIHtcbiAgICAgIGlmIChyZXN1bHQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGplc3NpZS5qcy9zYWZlLWF3YWl0LXNlcGFyYXRvciovXG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IGZpcnN0O1xuICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGdlbmVyYXRvci50aHJvdyhlcnJvcik7XG4gICAgfSxcbiAgfSk7XG4gIHJldHVybiBwcmltZWQ7XG59OyRozY9fb25jZS5wcmltZShwcmltZSk7XG5oYXJkZW4ocHJpbWUpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUSW5cbiAqIEB0ZW1wbGF0ZSBUT3V0XG4gKiBAcGFyYW0ge0lNUE9SVCgnLi90eXBlcy5qcycpLlJlYWRlcjxUSW4+fSByZWFkZXJcbiAqIEBwYXJhbSB7KHZhbHVlOiBUSW4pID0+IFRPdXR9IHRyYW5zZm9ybVxuICogQHJldHVybnMge0lNUE9SVCgnLi90eXBlcy5qcycpLlJlYWRlcjxUT3V0Pn1cbiAqL1xuICAgICAgIGNvbnN0IG1hcFJlYWRlciA9IChyZWFkZXIsIHRyYW5zZm9ybSkgPT4ge1xuICBhc3luYyBmdW5jdGlvbiogdHJhbnNmb3JtR2VuZXJhdG9yKCkge1xuICAgIGZvciBhd2FpdCAoY29uc3QgdmFsdWUgb2YgcmVhZGVyKSB7XG4gICAgICB5aWVsZCB0cmFuc2Zvcm0odmFsdWUpO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG4gIGhhcmRlbih0cmFuc2Zvcm1HZW5lcmF0b3IpO1xuICByZXR1cm4gaGFyZGVuKHRyYW5zZm9ybUdlbmVyYXRvcigpKTtcbn07JGjNj19vbmNlLm1hcFJlYWRlcihtYXBSZWFkZXIpO1xuaGFyZGVuKG1hcFJlYWRlcik7XG5cbi8qKlxuICogQHRlbXBsYXRlIFRJblxuICogQHRlbXBsYXRlIFRPdXRcbiAqIEBwYXJhbSB7SU1QT1JUKCcuL3R5cGVzLmpzJykuV3JpdGVyPFRPdXQ+fSB3cml0ZXJcbiAqIEBwYXJhbSB7KHZhbHVlOiBUSW4pID0+IFRPdXR9IHRyYW5zZm9ybVxuICogQHJldHVybnMge0lNUE9SVCgnLi90eXBlcy5qcycpLldyaXRlcjxUSW4+fVxuICovXG4gICAgICAgY29uc3QgbWFwV3JpdGVyID0gKHdyaXRlciwgdHJhbnNmb3JtKSA9PiB7XG4gIGNvbnN0IHRyYW5zZm9ybWVkV3JpdGVyID0gaGFyZGVuKHtcbiAgICAvKipcbiAqIEBwYXJhbSB7VElufSB2YWx1ZVxuICovXG4gICAgYXN5bmMgbmV4dCh2YWx1ZSkge1xuICAgICAgcmV0dXJuIHdyaXRlci5uZXh0KHRyYW5zZm9ybSh2YWx1ZSkpO1xuICAgIH0sXG4gICAgLyoqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJvclxuICovXG4gICAgYXN5bmMgdGhyb3coZXJyb3IpIHtcbiAgICAgIHJldHVybiB3cml0ZXIudGhyb3coZXJyb3IpO1xuICAgIH0sXG4gICAgLyoqXG4gKiBAcGFyYW0ge3VuZGVmaW5lZH0gdmFsdWVcbiAqL1xuICAgIGFzeW5jIHJldHVybih2YWx1ZSkge1xuICAgICAgcmV0dXJuIHdyaXRlci5yZXR1cm4odmFsdWUpO1xuICAgIH0sXG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpIHtcbiAgICAgIHJldHVybiB0cmFuc2Zvcm1lZFdyaXRlcjtcbiAgICB9LFxuICB9KTtcbiAgcmV0dXJuIHRyYW5zZm9ybWVkV3JpdGVyO1xufTskaM2PX29uY2UubWFwV3JpdGVyKG1hcFdyaXRlcik7XG5oYXJkZW4obWFwV3JpdGVyKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VRdWV1ZSI6WyJtYWtlUXVldWUiXSwibWFrZVN0cmVhbSI6WyJtYWtlU3RyZWFtIl0sIm1ha2VQaXBlIjpbIm1ha2VQaXBlIl0sInB1bXAiOlsicHVtcCJdLCJwcmltZSI6WyJwcmltZSJdLCJtYXBSZWFkZXIiOlsibWFwUmVhZGVyIl0sIm1hcFdyaXRlciI6WyJtYXBXcml0ZXIiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA7lv2v9EBAADRAQAAHAAAAGplc3NpZS5qcy12MC4zLjQvc3JjL21haW4uanN7ImltcG9ydHMiOlsiLi9yaW5nMC9tYWluLmpzIiwiLi9yaW5nMS9tYWluLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9yaW5nMC9tYWluLmpzIiwiLi9yaW5nMS9tYWluLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW1tcIi4vcmluZzAvbWFpbi5qc1wiLCBbXV0sW1wiLi9yaW5nMS9tYWluLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPZgJeSBAQAAgQEAAB8AAABqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMC9FLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIkBlbmRvL2ZhciJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW11dXSk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA3oc4g/UDAAD1AwAALAAAAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcwL2FzeW5jLWdlbmVyYXRlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJhc3luY0dlbmVyYXRlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qIEB0cy1jaGVjayovXG5cbi8qKlxuICogUmV0dXJuIGFuIGFzeW5jIGl0ZXJhYmxlIHRoYXQgcHJvZHVjZXMgaXRlcmF0b3IgcmVzdWx0cyB2aWEgYG5leHRgLlxuICpcbiAqIFRoaXMgd29ya3MgYXJvdW5kIEplc3NpZSdzIGZvcmJpZGRhbmNlIG9mIFN5bWJvbC5cbiAqXG4gKiBAdGVtcGxhdGUgVCxUUmV0dXJuXG4gKiBAcGFyYW0geygpID0+IEl0ZXJhdG9yUmVzdWx0PFQsIFRSZXR1cm4+IHxcbiAqICAgICAgICAgICAgICAgUHJvbWlzZTxJdGVyYXRvclJlc3VsdDxULCBUUmV0dXJuPj5cbiAqIH0gbmV4dCBwcm9kdWNlIGEgc2luZ2xlLXN0ZXAgaXRlcmF0b3IgcmVzdWx0XG4gKiBAcmV0dXJucyB7QXN5bmNJdGVyYWJsZTxUPn1cbiAqL1xuICAgICAgIGNvbnN0IGFzeW5jR2VuZXJhdGUgPSBuZXh0ID0+IHtcbiAgcmV0dXJuIGhhcmRlbih7XG4gICAgW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgcmV0dXJuIGhhcmRlbih7XG4gICAgICAgIG5leHQ6IGFzeW5jICgpID0+IGhhcmRlbihuZXh0KCkpLFxuICAgICAgfSk7XG4gICAgfSxcbiAgfSk7XG59OyRozY9fb25jZS5hc3luY0dlbmVyYXRlKGFzeW5jR2VuZXJhdGUpO1xuaGFyZGVuKGFzeW5jR2VuZXJhdGUpO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXN5bmNHZW5lcmF0ZSI6WyJhc3luY0dlbmVyYXRlIl19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAP56+f30AQAA9AEAACIAAABqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMC9tYWluLmpzeyJpbXBvcnRzIjpbIi4vRS5qcyIsIi4vbWFrZXJzLmpzIiwiLi9hc3luYy1nZW5lcmF0ZS5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vRS5qcyIsIi4vYXN5bmMtZ2VuZXJhdGUuanMiLCIuL21ha2Vycy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoe2ltcG9ydHM6JGjNj19pbXBvcnRzLGxpdmVWYXI6JGjNj19saXZlLG9uY2VWYXI6JGjNj19vbmNlLGltcG9ydDokaM2PX2ltcG9ydCxpbXBvcnRNZXRhOiRozY9fX19fbWV0YX0pPT4oZnVuY3Rpb24oKXsndXNlIHN0cmljdCc7JGjNj19pbXBvcnRzKFtbXCIuL0UuanNcIiwgW11dLFtcIi4vbWFrZXJzLmpzXCIsIFtdXSxbXCIuL2FzeW5jLWdlbmVyYXRlLmpzXCIsIFtdXV0pO1xufSkoKVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX3JlZXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMMZsXgzCQAAMwkAACQAAABqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMC9tYWtlcnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1ha2VNYXAiLCJtYWtlUHJvbWlzZSIsIm1ha2VTZXQiLCJtYWtlV2Vha01hcCIsIm1ha2VXZWFrU2V0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JzskaM2PX2ltcG9ydHMoW10pOy8qIEB0cy1jaGVjayovXG4vKiBUaGVzZSB3b3JrIGFyb3VuZCBKZXNzaWUncyBmb3JiaWRkYW5jZSBvZiBgbmV3YC4qL1xuLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIiAvPiovXG5cbi8qKlxuICogQHR5cGUgezxUPihleGVjdXRvcjogKFxuICogICByZXNvbHZlOiAodmFsdWU6IFQpID0+IHZvaWQsXG4gKiAgIHJlamVjdDogKHJlYXNvbj86IGFueSkgPT4gdm9pZFxuICogKSA9PiB2b2lkKSA9PiBQcm9taXNlPFQ+fVxuICovXG4gICAgICAgY29uc3QgbWFrZVByb21pc2UgPSBleGVjdXRvciA9PiBoYXJkZW4obmV3IFByb21pc2UoZXhlY3V0b3IpKTskaM2PX29uY2UubWFrZVByb21pc2UobWFrZVByb21pc2UpO1xuaGFyZGVuKG1ha2VQcm9taXNlKTtcblxuLyoqIEB0eXBlZGVmIHs8SywgVj4oZW50cmllcz86IHJlYWRvbmx5IChyZWFkb25seSBbSywgVl0pW10pID0+IE1hcDxLLCBWPn0gTWFwRnJvbUVudHJpZXMgKi9cbi8qKiBAdHlwZWRlZiB7PEssIFY+KGl0ZXJhYmxlOiBJdGVyYWJsZTxyZWFkb25seSBbSywgVl0+KSA9PiBNYXA8SywgVj59IE1hcEZyb21JdGVyYWJsZSAqL1xuXG4vKiogQHR5cGUge01hcEZyb21FbnRyaWVzICYgTWFwRnJvbUl0ZXJhYmxlfSAqL1xuICAgICAgIGNvbnN0IG1ha2VNYXAgPSBlbnRyaWVzT3JJdGVyYWJsZSA9PiBoYXJkZW4obmV3IE1hcChlbnRyaWVzT3JJdGVyYWJsZSkpOyRozY9fb25jZS5tYWtlTWFwKG1ha2VNYXApO1xuaGFyZGVuKG1ha2VNYXApO1xuXG4vKiogQHR5cGVkZWYgezxUPih2YWx1ZXM/OiByZWFkb25seSBUW10pID0+IFNldDxUPn0gU2V0RnJvbVZhbHVlcyAqL1xuLyoqIEB0eXBlZGVmIHs8VD4oaXRlcmFibGU6IEl0ZXJhYmxlPFQ+KSA9PiBTZXQ8VD59IFNldEZyb21JdGVyYWJsZSAqL1xuLyoqIEB0eXBlIHtTZXRGcm9tVmFsdWVzICYgU2V0RnJvbUl0ZXJhYmxlfSAqL1xuICAgICAgIGNvbnN0IG1ha2VTZXQgPSB2YWx1ZXMgPT4gaGFyZGVuKG5ldyBTZXQodmFsdWVzKSk7JGjNj19vbmNlLm1ha2VTZXQobWFrZVNldCk7XG5oYXJkZW4obWFrZVNldCk7XG5cbi8qKlxuICogQHR5cGVkZWYgezxLIGV4dGVuZHMge30sIFYgPSBhbnk+KFxuICogICAgZW50cmllcz86IHJlYWRvbmx5IFtLLCBWXVtdIHwgbnVsbFxuICogKSA9PiBXZWFrTWFwPEssIFY+fSBXZWFrTWFwRnJvbUVudHJpZXNcbiAqL1xuLyoqIEB0eXBlZGVmIHs8SyBleHRlbmRzIHt9LCBWPihpdGVyYWJsZTogSXRlcmFibGU8W0ssIFZdPikgPT4gV2Vha01hcDxLLCBWPn0gV2Vha01hcEZyb21JdGVyYWJsZSAqL1xuLyoqIEB0eXBlIHtXZWFrTWFwRnJvbUVudHJpZXMgJiBXZWFrTWFwRnJvbUl0ZXJhYmxlfSAqL1xuICAgICAgIGNvbnN0IG1ha2VXZWFrTWFwID0gZW50cmllcyA9PiBoYXJkZW4obmV3IFdlYWtNYXAoZW50cmllcykpOyRozY9fb25jZS5tYWtlV2Vha01hcChtYWtlV2Vha01hcCk7XG5oYXJkZW4obWFrZVdlYWtNYXApO1xuXG4vKiogQHR5cGVkZWYgezxUIGV4dGVuZHMge30+KHZhbHVlcz86IHJlYWRvbmx5IFRbXSkgPT4gV2Vha1NldDxUPn0gV2Vha1NldEZyb21WYWx1ZXMgKi9cbi8qKiBAdHlwZWRlZiB7PFQgZXh0ZW5kcyB7fT4oaXRlcmFibGU6IEl0ZXJhYmxlPFQ+KSA9PiBXZWFrU2V0PFQ+fSBXZWFrU2V0RnJvbUl0ZXJhYmxlICovXG4vKiogQHR5cGUge1dlYWtTZXRGcm9tVmFsdWVzICYgV2Vha1NldEZyb21JdGVyYWJsZX0gKi9cbiAgICAgICBjb25zdCBtYWtlV2Vha1NldCA9IHZhbHVlcyA9PiBoYXJkZW4obmV3IFdlYWtTZXQodmFsdWVzKSk7JGjNj19vbmNlLm1ha2VXZWFrU2V0KG1ha2VXZWFrU2V0KTtcbmhhcmRlbihtYWtlV2Vha1NldCk7XG59KSgpXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fcmVleHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUHJvbWlzZSI6WyJtYWtlUHJvbWlzZSJdLCJtYWtlTWFwIjpbIm1ha2VNYXAiXSwibWFrZVNldCI6WyJtYWtlU2V0Il0sIm1ha2VXZWFrTWFwIjpbIm1ha2VXZWFrTWFwIl0sIm1ha2VXZWFrU2V0IjpbIm1ha2VXZWFrU2V0Il19LCJfX25lZWRzSW1wb3J0X18iOmZhbHNlLCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGlUeF5SBQAAUgUAACkAAABqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMS9hc3luYy10b29scy5qc3siaW1wb3J0cyI6WyIuLi9yaW5nMC9tYWluLmpzIl0sImV4cG9ydHMiOlsiYXN5bmNEb1doaWxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6Iih7aW1wb3J0czokaM2PX2ltcG9ydHMsbGl2ZVZhcjokaM2PX2xpdmUsb25jZVZhcjokaM2PX29uY2UsaW1wb3J0OiRozY9faW1wb3J0LGltcG9ydE1ldGE6JGjNj19fX19tZXRhfSk9PihmdW5jdGlvbigpeyd1c2Ugc3RyaWN0JztsZXQgbWFrZVByb21pc2U7JGjNj19pbXBvcnRzKFtbXCIuLi9yaW5nMC9tYWluLmpzXCIsIFtbXCJtYWtlUHJvbWlzZVwiLFskaM2PX2EgPT4gKG1ha2VQcm9taXNlID0gJGjNj19hKV1dXV1dKTtcblxuXG5cbi8qKlxuICogUmVzb2x2ZSByZXR1cm5lZCBwcm9taXNlIHdpdGggdW5kZWZpbmVkIHdoZW4gYGJvZHlgIHJldHVybnMgZmFsc3kuXG4gKlxuICogVGhpcyB3b3JrcyBhcm91bmQgSmVzc2llJ3MgZm9yYmlkZGFuY2Ugb2YgYGF3YWl0YCBub3QgYXQgdGhlIGZ1bmN0aW9uLWxldmVsLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0geygpID0+IFQgfCBQcm9taXNlPFQ+fSBib2R5IHBlcmZvcm0gc2lkZS1lZmZlY3RzLCBhbmQgcmV0dXJuIHRydXRoeSBpZlxuICogd2Ugc2hvdWxkIHJ1biBhZ2FpblxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59XG4gKi9cbiAgICAgICBjb25zdCBhc3luY0RvV2hpbGUgPSBib2R5ID0+IHtcbiAgcmV0dXJuIG1ha2VQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBsb29wID0gYXN5bmMgKCkgPT4ge1xuICAgICAgY29uc3QgZG9Db250aW51ZSA9IGF3YWl0IGJvZHkoKTtcbiAgICAgIGlmICghZG9Db250aW51ZSkge1xuICAgICAgICAvKiBSZXNvbHZlIHRoZSBvdXRlcm1vc3QgcHJvbWlzZS4qL1xuICAgICAgICByZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLyogRG8gdGhlIGxvb3AgYWdhaW4uICBXZSBhcmUgY2FyZWZ1bCBub3QgdG8gYXdhaXQgc28gdGhhdCB3ZSBkb24ndCBjcmVhdGUgYSovXG4gICAgICAvKiBwcm9taXNlIGNoYWluLiovXG4gICAgICBsb29wKCkuY2F0Y2gocmVqZWN0KTtcbiAgICB9O1xuXG4gICAgbG9vcCgpLmNhdGNoKHJlamVjdCk7XG4gIH0pO1xufTskaM2PX29uY2UuYXN5bmNEb1doaWxlKGFzeW5jRG9XaGlsZSk7XG5oYXJkZW4oYXN5bmNEb1doaWxlKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzeW5jRG9XaGlsZSI6WyJhc3luY0RvV2hpbGUiXX0sIl9fbmVlZHNJbXBvcnRfXyI6ZmFsc2UsIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAG2g3A5YBAACWAQAAIgAAAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcxL21haW4uanN7ImltcG9ydHMiOlsiLi9hc3luYy10b29scy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vYXN5bmMtdG9vbHMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKHtpbXBvcnRzOiRozY9faW1wb3J0cyxsaXZlVmFyOiRozY9fbGl2ZSxvbmNlVmFyOiRozY9fb25jZSxpbXBvcnQ6JGjNj19pbXBvcnQsaW1wb3J0TWV0YTokaM2PX19fX21ldGF9KT0+KGZ1bmN0aW9uKCl7J3VzZSBzdHJpY3QnOyRozY9faW1wb3J0cyhbW1wiLi9hc3luYy10b29scy5qc1wiLCBbXV1dKTtcbn0pKClcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19yZWV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydF9fIjpmYWxzZSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsBAh4DCgAAAAAAAAAAAF22gI9TMQEAUzEBABQAAAAAAAAAAAAAAKSBAAAAAGNvbXBhcnRtZW50LW1hcC5qc29uUEsBAh4DCgAAAAAAAAAAADGASPiNAQAAjQEAACAAAAAAAAAAAAAAAKSBhTEBAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9oZWFwLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACcAAAAAAAAAAAAAAKSBUDMBAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvZXhwb3J0cy5qc1BLAQIeAwoAAAAAAAAAAAATMwWR8wsAAPMLAAAkAAAAAAAAAAAAAACkge00AQBAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL2hlYXAuanNQSwECHgMKAAAAAAAAAAAAFW6x+nkCAAB5AgAAJQAAAAAAAAAAAAAApIEiQQEAQGFnb3JpYy9iYXNlLXpvbmUtdjAuMS4wL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAAtTNWRIQMAACEDAAArAAAAAAAAAAAAAACkgd5DAQBAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL2lzLXBhc3NhYmxlLmpzUEsBAh4DCgAAAAAAAAAAAGwVpz8iBAAAIgQAACQAAAAAAAAAAAAAAKSBSEcBAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMva2V5cy5qc1BLAQIeAwoAAAAAAAAAAACpG42q+g4AAPoOAAApAAAAAAAAAAAAAACkgaxLAQBAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL21ha2Utb25jZS5qc1BLAQIeAwoAAAAAAAAAAAACATuUgBoAAIAaAAAyAAAAAAAAAAAAAACkge1aAQBAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL3ByZXBhcmUtYXR0ZW51YXRvci5qc1BLAQIeAwoAAAAAAAAAAAAd2z2IchQAAHIUAAAxAAAAAAAAAAAAAACkgb11AQBAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvc3JjL3ByZXBhcmUtcmV2b2NhYmxlLmpzUEsBAh4DCgAAAAAAAAAAAGC/2hirDQAAqw0AAC0AAAAAAAAAAAAAAKSBfooBAEBhZ29yaWMvYmFzZS16b25lLXYwLjEuMC9zcmMvd2F0Y2gtcHJvbWlzZS5qc1BLAQIeAwoAAAAAAAAAAABsJLBqFgIAABYCAAAoAAAAAAAAAAAAAACkgXSYAQBAYWdvcmljL2Jhc2Utem9uZS12MC4xLjAvem9uZS1oZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAOGDnYDnPAAA5zwAACYAAAAAAAAAAAAAAKSB0JoBAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9hbW91bnRNYXRoLmpzUEsBAh4DCgAAAAAAAAAAAF/pvV56BQAAegUAACcAAAAAAAAAAAAAAKSB+9cBAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9hbW91bnRTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAABDvXvZdAYAAHQGAAAnAAAAAAAAAAAAAACkgbrdAQBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvZGlzcGxheUluZm8uanNQSwECHgMKAAAAAAAAAAAA819NA00CAABNAgAAIQAAAAAAAAAAAAAApIFz5AEAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAGg+kHPHPAAAxzwAACUAAAAAAAAAAAAAAKSB/+YBAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9pc3N1ZXJLaXQuanNQSwECHgMKAAAAAAAAAAAAVOfcJRMGAAATBgAAOgAAAAAAAAAAAAAApIEJJAIAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAABaHe9JJgYAACYGAAA6AAAAAAAAAAAAAACkgXQqAgBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAABnzLX7PBgAAzwYAADYAAAAAAAAAAAAAAKSB8jACAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAA93DX//QcAAP0HAAA2AAAAAAAAAAAAAACkgRU4AgBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAMnLESlgFAABYBQAAIwAAAAAAAAAAAAAApIFmQAIAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3BheW1lbnQuanNQSwECHgMKAAAAAAAAAAAA2CdIdr42AAC+NgAAKQAAAAAAAAAAAAAApIH/RQIAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3BheW1lbnRMZWRnZXIuanNQSwECHgMKAAAAAAAAAAAAPiCeiZccAACXHAAAIQAAAAAAAAAAAAAApIEEfQIAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3B1cnNlLmpzUEsBAh4DCgAAAAAAAAAAAL6roXInPQAAJz0AACEAAAAAAAAAAAAAAKSB2pkCAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy9yYXRpby5qc1BLAQIeAwoAAAAAAAAAAABwLxbligcAAIoHAAAkAAAAAAAAAAAAAACkgUDXAgBAYWdvcmljL2VydHAtdjAuMTYuMi9zcmMvc2FmZU1hdGguanNQSwECHgMKAAAAAAAAAAAAYOSsWxkHAAAZBwAALQAAAAAAAAAAAAAApIEM3wIAQGFnb3JpYy9lcnRwLXYwLjE2LjIvc3JjL3RyYW5zaWVudE5vdGlmaWVyLmpzUEsBAh4DCgAAAAAAAAAAAOX636tALQAAQC0AACYAAAAAAAAAAAAAAKSBcOYCAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACcAAAAAAAAAAAAAAKSB9BMDAEBhZ29yaWMvZXJ0cC12MC4xNi4yL3NyYy90eXBlcy1pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACl7EmvGwUAABsFAAArAAAAAAAAAAAAAACkgZEVAwBAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29uc3RhbnRzLmpzUEsBAh4DCgAAAAAAAAAAACLoBfPFDAAAxQwAAD8AAAAAAAAAAAAAAKSB9RoDAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9jb250cmFjdEdvdmVybmFuY2UvYXNzZXJ0aW9ucy5qc1BLAQIeAwoAAAAAAAAAAABi0T1+1BUAANQVAAA+AAAAAAAAAAAAAACkgRcoAwBAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVybkFwaS5qc1BLAQIeAwoAAAAAAAAAAABtReazuxIAALsSAABBAAAAAAAAAAAAAACkgUc+AwBAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVybkZpbHRlci5qc1BLAQIeAwoAAAAAAAAAAADJNUggcRoAAHEaAABAAAAAAAAAAAAAAACkgWFRAwBAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvY29udHJhY3RHb3Zlcm5hbmNlL2dvdmVyblBhcmFtLmpzUEsBAh4DCgAAAAAAAAAAAEvWdhq2SQAAtkkAAEEAAAAAAAAAAAAAAKSBMGwDAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9jb250cmFjdEdvdmVybmFuY2UvcGFyYW1NYW5hZ2VyLmpzUEsBAh4DCgAAAAAAAAAAAKaX7U68GwAAvBsAAEYAAAAAAAAAAAAAAKSBRbYDAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXIuanNQSwECHgMKAAAAAAAAAAAAwRXEfxwmAAAcJgAAMgAAAAAAAAAAAAAApIFl0gMAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL2NvbnRyYWN0R292ZXJub3IuanNQSwECHgMKAAAAAAAAAAAAnW3DHeUuAADlLgAANQAAAAAAAAAAAAAApIHR+AMAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL2NvbnRyYWN0R292ZXJub3JLaXQuanNQSwECHgMKAAAAAAAAAAAA47HTKeExAADhMQAAMAAAAAAAAAAAAAAApIEJKAQAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL2NvbnRyYWN0SGVscGVyLmpzUEsBAh4DCgAAAAAAAAAAALlkfWprCQAAawkAACcAAAAAAAAAAAAAAKSBOFoEAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAC3mGJdAxEAAAMRAAAqAAAAAAAAAAAAAACkgehjBABAYWdvcmljL2dvdmVybmFuY2UtdjAuMTAuMy9zcmMvcXVlc3Rpb24uanNQSwECHgMKAAAAAAAAAAAAm0DIbSxAAAAsQAAALAAAAAAAAAAAAAAApIEzdQQAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAJwAAAAAAAAAAAAAApIGptQQAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjEwLjMvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAABpMRidJDAAASQwAACwAAAAAAAAAAAAAAKSBRrcEAEBhZ29yaWMvZ292ZXJuYW5jZS12MC4xMC4zL3NyYy92YWxpZGF0b3JzLmpzUEsBAh4DCgAAAAAAAAAAAC7hJHKSHwAAkh8AAEIAAAAAAAAAAAAAAKSB2cMEAEBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTYuMS9zcmMvcHJpY2UvZmx1eEFnZ3JlZ2F0b3JDb250cmFjdC5qc1BLAQIeAwoAAAAAAAAAAACs1nQVRjgAAEY4AAA9AAAAAAAAAAAAAACkgcvjBABAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjE2LjEvc3JjL3ByaWNlL2ZsdXhBZ2dyZWdhdG9yS2l0LmpzUEsBAh4DCgAAAAAAAAAAAOX0tL8IEQAACBEAADoAAAAAAAAAAAAAAKSBbBwFAEBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTYuMS9zcmMvcHJpY2UvcHJpY2VPcmFjbGVLaXQuanNQSwECHgMKAAAAAAAAAAAAav09QdNqAADTagAAOQAAAAAAAAAAAAAApIHMLQUAQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xNi4xL3NyYy9wcmljZS9yb3VuZHNNYW5hZ2VyLmpzUEsBAh4DCgAAAAAAAAAAAMxc4bUMHgAADB4AADUAAAAAAAAAAAAAAKSB9pgFAEBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTYuMS9zcmMvcHJvcG9zYWxzL3V0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAAUYC9zZLAAA2SwAACcAAAAAAAAAAAAAAKSBVbcFAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9jYWxsYmFjay5qc1BLAQIeAwoAAAAAAAAAAACjNk+m9QQAAPUEAAAoAAAAAAAAAAAAAACkgXPkBQBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvY2xpLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAG0NeBXKDAAAygwAACUAAAAAAAAAAAAAAKSBrukFAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9jb25maWcuanNQSwECHgMKAAAAAAAAAAAAjb2mAa4IAACuCAAAJAAAAAAAAAAAAAAApIG79gUAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2RlYnVnLmpzUEsBAh4DCgAAAAAAAAAAALGT1Y5eAwAAXgMAACUAAAAAAAAAAAAAAKSBq/8FAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9lcnJvcnMuanNQSwECHgMKAAAAAAAAAAAAaBzsGv4EAAD+BAAAJAAAAAAAAAAAAAAApIFMAwYAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAKrVr42mJQAApiUAACcAAAAAAAAAAAAAAKSBjAgGAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9qcy11dGlscy5qc1BLAQIeAwoAAAAAAAAAAAAi9VLVrAcAAKwHAAAoAAAAAAAAAAAAAACkgXcuBgBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMva2V5TWlycm9yLmpzUEsBAh4DCgAAAAAAAAAAAKVsHvRVLQAAVS0AAC8AAAAAAAAAAAAAAKSBaTYGAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzUEsBAh4DCgAAAAAAAAAAACNFcvqnAwAApwMAADcAAAAAAAAAAAAAAKSBC2QGAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9tYXJzaGFsL2luYWNjZXNzaWJsZS12YWwuanNQSwECHgMKAAAAAAAAAAAApIPPnrEDAACxAwAAMAAAAAAAAAAAAAAApIEHaAYAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL21hcnNoYWwvcHVyZS1kYXRhLmpzUEsBAh4DCgAAAAAAAAAAANZdM97lPAAA5TwAADYAAAAAAAAAAAAAAKSBBmwGAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9tYXJzaGFsL3dyYXAtbWFyc2hhbGxlci5qc1BLAQIeAwoAAAAAAAAAAAAr7RBF8Q0AAPENAAArAAAAAAAAAAAAAACkgT+pBgBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvbWV0aG9kLXRvb2xzLmpzUEsBAh4DCgAAAAAAAAAAAJD9IHigQgAAoEIAACYAAAAAAAAAAAAAAKSBebcGAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9tZXRyaWNzLmpzUEsBAh4DCgAAAAAAAAAAAIq5WvK2DgAAtg4AACsAAAAAAAAAAAAAAKSBXfoGAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy9uYXR1cmFsLXNvcnQuanNQSwECHgMKAAAAAAAAAAAAT8Qll2pIAABqSAAAKAAAAAAAAAAAAAAApIFcCQcAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3Nlcy11dGlscy5qc1BLAQIeAwoAAAAAAAAAAADR3g3QkRIAAJESAAAsAAAAAAAAAAAAAACkgQxSBwBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdGVzdGluZy11dGlscy5qc1BLAQIeAwoAAAAAAAAAAADaiNsr1gMAANYDAAAlAAAAAAAAAAAAAACkgedkBwBAYWdvcmljL2ludGVybmFsLXYwLjMuMi9zcmMvdG1wRGlyLmpzUEsBAh4DCgAAAAAAAAAAAE5ip5ahBAAAoQQAACgAAAAAAAAAAAAAAKSBAGkHAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy90eXBlQ2hlY2suanNQSwECHgMKAAAAAAAAAAAAq3x1xKMFAACjBQAAKQAAAAAAAAAAAAAApIHnbQcAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAKgAAAAAAAAAAAAAApIHRcwcAQGFnb3JpYy9pbnRlcm5hbC12MC4zLjIvc3JjL3R5cGVzLWluZGV4LmpzUEsBAh4DCgAAAAAAAAAAANeHGT1wDAAAcAwAACoAAAAAAAAAAAAAAKSBcXUHAEBhZ29yaWMvaW50ZXJuYWwtdjAuMy4yL3NyYy91cGdyYWRlLWFwaS5qc1BLAQIeAwoAAAAAAAAAAAA/4UE8GRQAABkUAAAzAAAAAAAAAAAAAACkgSmCBwBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvYXN5bmNJdGVyYWJsZUFkYXB0b3IuanNQSwECHgMKAAAAAAAAAAAAwj7tuOsHAADrBwAAJAAAAAAAAAAAAAAApIGTlgcAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAALNJ/07FGwAAxRsAACcAAAAAAAAAAAAAAKSBwJ4HAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3NyYy9ub3RpZmllci5qc1BLAQIeAwoAAAAAAAAAAAAbIRejM0IAADNCAAAqAAAAAAAAAAAAAACkgcq6BwBAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvcHVibGlzaC1raXQuanNQSwECHgMKAAAAAAAAAAAALEhEN6oMAACqDAAALgAAAAAAAAAAAAAApIFF/QcAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3N0b3JlZC1ub3RpZmllci5qc1BLAQIeAwoAAAAAAAAAAAB65k5eJCYAACQmAAAnAAAAAAAAAAAAAACkgTsKCABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3RvcmVzdWIuanNQSwECHgMKAAAAAAAAAAAAZA69fPIpAADyKQAAKAAAAAAAAAAAAAAApIGkMAgAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3N1YnNjcmliZS5qc1BLAQIeAwoAAAAAAAAAAABXqgSRKQ0AACkNAAApAAAAAAAAAAAAAACkgdxaCABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvc3Vic2NyaWJlci5qc1BLAQIeAwoAAAAAAAAAAAB35kpGlQYAAJUGAAAkAAAAAAAAAAAAAACkgUxoCABAYWdvcmljL25vdGlmaWVyLXYwLjYuMi9zcmMvdG9waWMuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAKgAAAAAAAAAAAAAApIEjbwgAQGFnb3JpYy9ub3RpZmllci12MC42LjIvc3JjL3R5cGVzLWluZGV4LmpzUEsBAh4DCgAAAAAAAAAAANxz0z1gBwAAYAcAAC0AAAAAAAAAAAAAAKSBw3AIAEBhZ29yaWMvbm90aWZpZXItdjAuNi4yL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qc1BLAQIeAwoAAAAAAAAAAABHGnKTRg4AAEYOAAAhAAAAAAAAAAAAAACkgW54CABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAD9JGLuILAADiCwAALAAAAAAAAAAAAAAApIHzhggAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL2xlZ2FjeS9sZWdhY3lNYXAuanNQSwECHgMKAAAAAAAAAAAA28RCNW0HAABtBwAAMAAAAAAAAAAAAAAApIEfkwgAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzUEsBAh4DCgAAAAAAAAAAANehQUbqGAAA6hgAADEAAAAAAAAAAAAAAKSB2poIAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanNQSwECHgMKAAAAAAAAAAAApkJKtRERAAAREQAAMQAAAAAAAAAAAAAApIETtAgAQGFnb3JpYy9zdG9yZS12MC45LjIvc3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAAD5NfOn7RYAAO0WAAA1AAAAAAAAAAAAAACkgXPFCABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAACUWqUbThEAAE4RAAA1AAAAAAAAAAAAAACkgbPcCABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAACqV+8u2xoAANsaAAAuAAAAAAAAAAAAAACkgVTuCABAYWdvcmljL3N0b3JlLXYwLjkuMi9zcmMvc3RvcmVzL3N0b3JlLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACcAAAAAAAAAAAAAAKSBewkJAEBhZ29yaWMvc3RvcmUtdjAuOS4yL3NyYy90eXBlcy1pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADt9ZibMAIAADACAAAcAAAAAAAAAAAAAACkgRgLCQBAYWdvcmljL3RpbWUtdjAuMy4yL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAALQzbZQKJQAACiUAACMAAAAAAAAAAAAAAKSBgg0JAEBhZ29yaWMvdGltZS12MC4zLjIvc3JjL3RpbWVNYXRoLmpzUEsBAh4DCgAAAAAAAAAAADT2FcTzCQAA8wkAACUAAAAAAAAAAAAAAKSBzTIJAEBhZ29yaWMvdGltZS12MC4zLjIvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAJgAAAAAAAAAAAAAApIEDPQkAQGFnb3JpYy90aW1lLXYwLjMuMi9zcmMvdHlwZXMtaW5kZXguanNQSwECHgMKAAAAAAAAAAAANg9YlC0sAAAtLAAAKAAAAAAAAAAAAAAApIGfPgkAQGFnb3JpYy92YXQtZGF0YS12MC41LjIvc3JjL2V4by11dGlscy5qc1BLAQIeAwoAAAAAAAAAAADPnOvptggAALYIAAAkAAAAAAAAAAAAAACkgRJrCQBAYWdvcmljL3ZhdC1kYXRhLXYwLjUuMi9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA73e+MDkjAAA5IwAAMAAAAAAAAAAAAAAApIEKdAkAQGFnb3JpYy92YXQtZGF0YS12MC41LjIvc3JjL3ZhdC1kYXRhLWJpbmRpbmdzLmpzUEsBAh4DCgAAAAAAAAAAAAh9SthSHgAAUh4AACgAAAAAAAAAAAAAAKSBkZcJAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NsZWFuUHJvcG9zYWwuanNQSwECHgMKAAAAAAAAAAAAoZZDmYkRAACJEQAANAAAAAAAAAAAAAAApIEptgkAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RGYWNldC9vZmZlclNhZmV0eS5qc1BLAQIeAwoAAAAAAAAAAABrOE1yZxMAAGcTAAA5AAAAAAAAAAAAAACkgQTICQBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvYXRvbWljVHJhbnNmZXIuanNQSwECHgMKAAAAAAAAAAAAQj6xyY4dAACOHQAAOAAAAAAAAAAAAAAApIHC2wkAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L2JvbmRpbmdDdXJ2ZXMuanNQSwECHgMKAAAAAAAAAAAAN87WvjEUAAAxFAAANQAAAAAAAAAAAAAApIGm+QkAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L2R1cmFiaWxpdHkuanNQSwECHgMKAAAAAAAAAAAAtZivOKYIAACmCAAAMAAAAAAAAAAAAAAApIEqDgoAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAHzO4QGrDwAAqw8AADoAAAAAAAAAAAAAAKSBHhcKAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9wcmVwYXJlLW93bmFibGUuanNQSwECHgMKAAAAAAAAAAAA2cqrUYk1AACJNQAAOQAAAAAAAAAAAAAApIEhJwoAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3ByaWNlQXV0aG9yaXR5LmpzUEsBAh4DCgAAAAAAAAAAAGgfyq7mCwAA5gsAADUAAAAAAAAAAAAAAKSBAV0KAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9wcmljZVF1b3RlLmpzUEsBAh4DCgAAAAAAAAAAAFvRqkVjKQAAYykAADMAAAAAAAAAAAAAAKSBOmkKAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9yZWNvcmRlci5qc1BLAQIeAwoAAAAAAAAAAAAor6T67AQAAOwEAAA3AAAAAAAAAAAAAACkge6SCgBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy9jb250cmFjdFN1cHBvcnQvc3RhdGVNYWNoaW5lLmpzUEsBAh4DCgAAAAAAAAAAAI0ZVBcGBgAABgYAADUAAAAAAAAAAAAAAKSBL5gKAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC9zdGF0aXN0aWNzLmpzUEsBAh4DCgAAAAAAAAAAAGMIy9S/CQAAvwkAADEAAAAAAAAAAAAAAKSBiJ4KAEBhZ29yaWMvem9lLXYwLjI2LjIvc3JjL2NvbnRyYWN0U3VwcG9ydC90b3BpY3MuanNQSwECHgMKAAAAAAAAAAAAwa5TcJM9AACTPQAANQAAAAAAAAAAAAAApIGWqAoAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvY29udHJhY3RTdXBwb3J0L3pvZUhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAARXv4GawIAACsCAAAJQAAAAAAAAAAAAAApIF85goAQGFnb3JpYy96b2UtdjAuMjYuMi9zcmMvbWFrZUhhbmRsZS5qc1BLAQIeAwoAAAAAAAAAAAAB0/RLSEsAAEhLAAAlAAAAAAAAAAAAAACkgWvvCgBAYWdvcmljL3pvZS12MC4yNi4yL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAANn0k7SWAQAAlgEAAB4AAAAAAAAAAAAAAKSB9joLAEBhZ29yaWMvem9uZS12MC4yLjIvZHVyYWJsZS5qc1BLAQIeAwoAAAAAAAAAAACAMlLK2hMAANoTAAAiAAAAAAAAAAAAAACkgcg8CwBAYWdvcmljL3pvbmUtdjAuMi4yL3NyYy9kdXJhYmxlLmpzUEsBAh4DCgAAAAAAAAAAANY4VALFAQAAxQEAAB8AAAAAAAAAAAAAAKSB4lALAEBlbmRvL2NhY2hlLW1hcC12MS4xLjAvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAgZXu/CYnAAAmJwAAJgAAAAAAAAAAAAAApIHkUgsAQGVuZG8vY2FjaGUtbWFwLXYxLjEuMC9zcmMvY2FjaGVtYXAuanNQSwECHgMKAAAAAAAAAAAAb1Ehj2ELAABhCwAALAAAAAAAAAAAAAAApIFOegsAQGVuZG8vY29tbW9uLXYxLjIuMTMvYXBwbHktbGFiZWxpbmctZXJyb3IuanNQSwECHgMKAAAAAAAAAAAASPhCyt0FAADdBQAAKwAAAAAAAAAAAAAApIH5hQsAQGVuZG8vY29tbW9uLXYxLjIuMTMvZnJvbS11bmlxdWUtZW50cmllcy5qc1BLAQIeAwoAAAAAAAAAAAC3lVPuJQgAACUIAAAlAAAAAAAAAAAAAACkgR+MCwBAZW5kby9jb21tb24tdjEuMi4xMy9pZGVudC1jaGVja2VyLmpzUEsBAh4DCgAAAAAAAAAAAGGv/Gq4BAAAuAQAACcAAAAAAAAAAAAAAKSBh5QLAEBlbmRvL2NvbW1vbi12MS4yLjEzL2xpc3QtZGlmZmVyZW5jZS5qc1BLAQIeAwoAAAAAAAAAAAAl7F33eQQAAHkEAAArAAAAAAAAAAAAAACkgYSZCwBAZW5kby9jb21tb24tdjEuMi4xMy9tYWtlLWFycmF5LWl0ZXJhdG9yLmpzUEsBAh4DCgAAAAAAAAAAAF02r3oGAwAABgMAACUAAAAAAAAAAAAAAKSBRp4LAEBlbmRvL2NvbW1vbi12MS4yLjEzL21ha2UtaXRlcmF0b3IuanNQSwECHgMKAAAAAAAAAAAAduerGW8KAABvCgAAIgAAAAAAAAAAAAAApIGPoQsAQGVuZG8vY29tbW9uLXYxLjIuMTMvb2JqZWN0LW1hcC5qc1BLAQIeAwoAAAAAAAAAAAComiDaOwkAADsJAAAnAAAAAAAAAAAAAACkgT6sCwBAZW5kby9jb21tb24tdjEuMi4xMy9vYmplY3QtbWV0YS1tYXAuanNQSwECHgMKAAAAAAAAAAAA2LNBgpkFAACZBQAAJQAAAAAAAAAAAAAApIG+tQsAQGVuZG8vY29tbW9uLXYxLjIuMTMvdGhyb3ctbGFiZWxlZC5qc1BLAQIeAwoAAAAAAAAAAAA0oqGpogEAAKIBAAAiAAAAAAAAAAAAAACkgZq7CwBAZW5kby9lbnYtb3B0aW9ucy12MS4xLjExL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAALwBM4I4FgAAOBYAACwAAAAAAAAAAAAAAKSBfL0LAEBlbmRvL2Vudi1vcHRpb25zLXYxLjEuMTEvc3JjL2Vudi1vcHRpb25zLmpzUEsBAh4DCgAAAAAAAAAAAGpmduJkDQAAZA0AAB0AAAAAAAAAAAAAAKSB/tMLAEBlbmRvL2Vycm9ycy12MS4yLjEzL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAANPpRggQRwAAEEcAACMAAAAAAAAAAAAAAKSBneELAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9FLmpzUEsBAh4DCgAAAAAAAAAAAEXM//FYAQAAWAEAACkAAAAAAAAAAAAAAKSB7igMAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9leHBvcnRzLmpzUEsBAh4DCgAAAAAAAAAAAHOVMVJyFAAAchQAACcAAAAAAAAAAAAAAKSBjSoMAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjEuMy40L3NyYy9sb2NhbC5qc1BLAQIeAwoAAAAAAAAAAACHeIi59BgAAPQYAAA1AAAAAAAAAAAAAACkgUQ/DABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC9zcmMvbWVzc2FnZS1icmVha3BvaW50cy5qc1BLAQIeAwoAAAAAAAAAAAApE1XZ1gUAANYFAAApAAAAAAAAAAAAAACkgYtYDABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC9zcmMvbm8tc2hpbS5qc1BLAQIeAwoAAAAAAAAAAAAzKKSOVxIAAFcSAAAtAAAAAAAAAAAAAACkgaheDABAZW5kby9ldmVudHVhbC1zZW5kLXYxLjMuNC9zcmMvdHJhY2stdHVybnMuanNQSwECHgMKAAAAAAAAAAAAe6GgR2QCAABkAgAAIwAAAAAAAAAAAAAApIFKcQwAQGVuZG8vZXZlbnR1YWwtc2VuZC12MS4zLjQvdXRpbHMuanNQSwECHgMKAAAAAAAAAAAA3EXZo2ACAABgAgAAGgAAAAAAAAAAAAAApIHvcwwAQGVuZG8vZXhvLXYxLjUuMTIvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAsZMQ/xAgAAAQIAAAIwAAAAAAAAAAAAAApIGHdgwAQGVuZG8vZXhvLXYxLjUuMTIvc3JjL2V4by1tYWtlcnMuanNQSwECHgMKAAAAAAAAAAAAFaP+6y5GAAAuRgAAIgAAAAAAAAAAAAAApIHYlgwAQGVuZG8vZXhvLXYxLjUuMTIvc3JjL2V4by10b29scy5qc1BLAQIeAwoAAAAAAAAAAADJJdo2CwUAAAsFAAAmAAAAAAAAAAAAAACkgUbdDABAZW5kby9leG8tdjEuNS4xMi9zcmMvZ2V0LWludGVyZmFjZS5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAeAAAAAAAAAAAAAACkgZXiDABAZW5kby9leG8tdjEuNS4xMi9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAIAAAAAAAAAAAAAAApIEp5AwAQGVuZG8vZmFyLXYxLjEuMTQvc3JjL2V4cG9ydHMuanNQSwECHgMKAAAAAAAAAAAAqSbWUJgCAACYAgAAHgAAAAAAAAAAAAAApIG/5QwAQGVuZG8vZmFyLXYxLjEuMTQvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAHVGf9kHCAAABwgAAB0AAAAAAAAAAAAAAKSBk+gMAEBlbmRvL21hcnNoYWwtdjEuOC4wL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAGC/aqjJfQAAyX0AACoAAAAAAAAAAAAAAKSB1fAMAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9lbmNvZGVQYXNzYWJsZS5qc1BLAQIeAwoAAAAAAAAAAADVwnO6F0QAABdEAAArAAAAAAAAAAAAAACkgeZuDQBAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzUEsBAh4DCgAAAAAAAAAAAA1TX470RQAA9EUAAC0AAAAAAAAAAAAAAKSBRrMNAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qc1BLAQIeAwoAAAAAAAAAAABCdBXpvkIAAL5CAAAqAAAAAAAAAAAAAACkgYX5DQBAZW5kby9tYXJzaGFsLXYxLjguMC9zcmMvbWFyc2hhbC1qdXN0aW4uanNQSwECHgMKAAAAAAAAAAAAq3GB+KEJAAChCQAALQAAAAAAAAAAAAAApIGLPA4AQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzUEsBAh4DCgAAAAAAAAAAAGVYhbV8PwAAfD8AACMAAAAAAAAAAAAAAKSBd0YOAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9tYXJzaGFsLmpzUEsBAh4DCgAAAAAAAAAAAIGivjHoWQAA6FkAACUAAAAAAAAAAAAAAKSBNIYOAEBlbmRvL21hcnNoYWwtdjEuOC4wL3NyYy9yYW5rT3JkZXIuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAIQAAAAAAAAAAAAAApIFf4A4AQGVuZG8vbWFyc2hhbC12MS44LjAvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAOMQ3SNJDAAASQwAAB0AAAAAAAAAAAAAAKSB9uEOAEBlbmRvL25hdC12NS4xLjMvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAG5u3nM2CwAANgsAACAAAAAAAAAAAAAAAKSBeu4OAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAE6FbiMVDQAAFQ0AACgAAAAAAAAAAAAAAKSB7vkOAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9ieXRlQXJyYXkuanNQSwECHgMKAAAAAAAAAAAAmae90ggIAAAICAAAKAAAAAAAAAAAAAAApIFJBw8AQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL2NvcHlBcnJheS5qc1BLAQIeAwoAAAAAAAAAAABHL7odZwsAAGcLAAApAAAAAAAAAAAAAACkgZcPDwBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvY29weVJlY29yZC5qc1BLAQIeAwoAAAAAAAAAAACeOsLT2BkAANgZAAAuAAAAAAAAAAAAAACkgUUbDwBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzUEsBAh4DCgAAAAAAAAAAAGrLJkbNHQAAzR0AACQAAAAAAAAAAAAAAKSBaTUPAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9lcnJvci5qc1BLAQIeAwoAAAAAAAAAAAB7Bop6fAkAAHwJAAArAAAAAAAAAAAAAACkgXhTDwBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvaXRlci1oZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAKEnjMn0JQAA9CUAACcAAAAAAAAAAAAAAKSBPV0PAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9tYWtlLWZhci5qc1BLAQIeAwoAAAAAAAAAAACcUmBpgwUAAIMFAAApAAAAAAAAAAAAAACkgXaDDwBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvbWFrZVRhZ2dlZC5qc1BLAQIeAwoAAAAAAAAAAAB8Jer96iEAAOohAAAwAAAAAAAAAAAAAACkgUCJDwBAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvcGFzc1N0eWxlLWhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAJgKOt2I/AABiPwAAKgAAAAAAAAAAAAAApIF4qw8AQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3Bhc3NTdHlsZU9mLmpzUEsBAh4DCgAAAAAAAAAAAPucn7IwLgAAMC4AACgAAAAAAAAAAAAAAKSBIusPAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9yZW1vdGFibGUuanNQSwECHgMKAAAAAAAAAAAAh4APKFIWAABSFgAAKwAAAAAAAAAAAAAApIGYGRAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3NhZmUtcHJvbWlzZS5qc1BLAQIeAwoAAAAAAAAAAAD8qNkH2w8AANsPAAAlAAAAAAAAAAAAAACkgTMwEABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvc3RyaW5nLmpzUEsBAh4DCgAAAAAAAAAAAAL3NCLDFAAAwxQAACUAAAAAAAAAAAAAAKSBUUAQAEBlbmRvL3Bhc3Mtc3R5bGUtdjEuNi4zL3NyYy9zeW1ib2wuanNQSwECHgMKAAAAAAAAAAAAXLhQ2WQJAABkCQAAJQAAAAAAAAAAAAAApIFXVRAAQGVuZG8vcGFzcy1zdHlsZS12MS42LjMvc3JjL3RhZ2dlZC5qc1BLAQIeAwoAAAAAAAAAAAC3XT1cJhYAACYWAAApAAAAAAAAAAAAAACkgf5eEABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAkAAAAAAAAAAAAAACkgWt1EABAZW5kby9wYXNzLXN0eWxlLXYxLjYuMy9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAdU2S3O8OAADvDgAAHgAAAAAAAAAAAAAApIEFdxAAQGVuZG8vcGF0dGVybnMtdjEuNy4wL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAKohA+kLSAAAC0gAACoAAAAAAAAAAAAAAKSBMIYQAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMva2V5cy9jaGVja0tleS5qc1BLAQIeAwoAAAAAAAAAAAD/2yuQPygAAD8oAAAtAAAAAAAAAAAAAACkgYPOEABAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL2tleXMvY29tcGFyZUtleXMuanNQSwECHgMKAAAAAAAAAAAANFtTY00VAABNFQAAKQAAAAAAAAAAAAAApIEN9xAAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9rZXlzL2NvcHlCYWcuanNQSwECHgMKAAAAAAAAAAAALCODJiwRAAAsEQAAKQAAAAAAAAAAAAAApIGhDBEAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9rZXlzL2NvcHlTZXQuanNQSwECHgMKAAAAAAAAAAAA2zWaQMMiAADDIgAAOQAAAAAAAAAAAAAApIEUHhEAQGVuZG8vcGF0dGVybnMtdjEuNy4wL3NyYy9rZXlzL2tleWNvbGxlY3Rpb24tb3BlcmF0b3JzLmpzUEsBAh4DCgAAAAAAAAAAAJnEOAFXKAAAVygAADUAAAAAAAAAAAAAAKSBLkERAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzUEsBAh4DCgAAAAAAAAAAAHQfjxllLwAAZS8AADUAAAAAAAAAAAAAAKSB2GkRAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzUEsBAh4DCgAAAAAAAAAAAF0aWkIrLwAAKy8AADYAAAAAAAAAAAAAAKSBkJkRAEBlbmRvL3BhdHRlcm5zLXYxLjcuMC9zcmMvcGF0dGVybnMvZ2V0R3VhcmRQYXlsb2Fkcy5qc1BLAQIeAwoAAAAAAAAAAABmpO57vjIBAL4yAQA1AAAAAAAAAAAAAACkgQ/JEQBAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qc1BLAQIeAwoAAAAAAAAAAABFzP/xWAEAAFgBAAAiAAAAAAAAAAAAAACkgSD8EgBAZW5kby9wYXR0ZXJucy12MS43LjAvc3JjL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAAsCsWGzCQAAswkAACIAAAAAAAAAAAAAAKSBuP0SAEBlbmRvL3Byb21pc2Uta2l0LXYxLjEuMTMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA564QmQMDAAADAwAAKwAAAAAAAAAAAAAApIGrBxMAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMy9zcmMvaXMtcHJvbWlzZS5qc1BLAQIeAwoAAAAAAAAAAADHaE2fRBYAAEQWAAAqAAAAAAAAAAAAAACkgfcKEwBAZW5kby9wcm9taXNlLWtpdC12MS4xLjEzL3NyYy9tZW1vLXJhY2UuanNQSwECHgMKAAAAAAAAAAAACJ+oaB0IAAAdCAAANQAAAAAAAAAAAAAApIGDIRMAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMy9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanNQSwECHgMKAAAAAAAAAAAARcz/8VgBAABYAQAAJgAAAAAAAAAAAAAApIHzKRMAQGVuZG8vcHJvbWlzZS1raXQtdjEuMS4xMy9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAALOZ7ulEcAABRHAAAHQAAAAAAAAAAAAAApIGPKxMAQGVuZG8vc3RyZWFtLXYxLjIuMTMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAA7lv2v9EBAADRAQAAHAAAAAAAAAAAAAAApIEbSBMAamVzc2llLmpzLXYwLjMuNC9zcmMvbWFpbi5qc1BLAQIeAwoAAAAAAAAAAAD2YCXkgQEAAIEBAAAfAAAAAAAAAAAAAACkgSZKEwBqZXNzaWUuanMtdjAuMy40L3NyYy9yaW5nMC9FLmpzUEsBAh4DCgAAAAAAAAAAAN6HOIP1AwAA9QMAACwAAAAAAAAAAAAAAKSB5EsTAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcwL2FzeW5jLWdlbmVyYXRlLmpzUEsBAh4DCgAAAAAAAAAAAP56+f30AQAA9AEAACIAAAAAAAAAAAAAAKSBI1ATAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcwL21haW4uanNQSwECHgMKAAAAAAAAAAAAwxmxeDMJAAAzCQAAJAAAAAAAAAAAAAAApIFXUhMAamVzc2llLmpzLXYwLjMuNC9zcmMvcmluZzAvbWFrZXJzLmpzUEsBAh4DCgAAAAAAAAAAAGlUeF5SBQAAUgUAACkAAAAAAAAAAAAAAKSBzFsTAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcxL2FzeW5jLXRvb2xzLmpzUEsBAh4DCgAAAAAAAAAAABtoNwOWAQAAlgEAACIAAAAAAAAAAAAAAKSBZWETAGplc3NpZS5qcy12MC4zLjQvc3JjL3JpbmcxL21haW4uanNQSwUGAAAAAMQAxAC4QwAAO2MTAAAA","endoZipBase64Sha512":"b6607bd8d521730514ea77b384a4b0ab8ca274df23b3bf5fe21ab27876e22f4d0fad0fa89c61680f495c4749342143f8b2ed03d8cf4ff3e757cb5c6d24cc241d"};
|