@agoric/inter-protocol 0.13.2-dev-a2fa2fb.0 → 0.13.2-dev-68094ec.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bundles/bundle-auctioneer-meta.js +117 -117
- package/bundles/bundle-auctioneer.js +1 -1
- package/bundles/bundle-econCommitteeCharter-meta.js +79 -79
- package/bundles/bundle-econCommitteeCharter.js +1 -1
- package/bundles/bundle-feeDistributor-meta.js +67 -67
- package/bundles/bundle-feeDistributor.js +1 -1
- package/bundles/bundle-fluxAggregator-meta.js +114 -114
- package/bundles/bundle-fluxAggregator.js +1 -1
- package/bundles/bundle-psm-meta.js +112 -112
- package/bundles/bundle-psm.js +1 -1
- package/bundles/bundle-reserve-meta.js +110 -110
- package/bundles/bundle-reserve.js +1 -1
- package/bundles/bundle-scaledPriceAuthority-meta.js +91 -91
- package/bundles/bundle-scaledPriceAuthority.js +1 -1
- package/bundles/bundle-stakeFactory-meta.js +118 -118
- package/bundles/bundle-stakeFactory.js +1 -1
- package/bundles/bundle-vaultFactory-meta.js +134 -134
- package/bundles/bundle-vaultFactory.js +1 -1
- package/package.json +16 -16
|
@@ -1 +1 @@
|
|
|
1
|
-
export default {"moduleFormat":"endoZipBase64","endoZipBase64":"UEsDBAoAAAAAAAAAAACvRRYvQ/8AAEP/AAAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgImVudHJ5IjogewogICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAibW9kdWxlIjogIi4vc3JjL2Vjb25Db21taXR0ZWVDaGFydGVyLmpzIgogIH0sCiAgImNvbXBhcnRtZW50cyI6IHsKICAgICJAYWdvcmljL2Fzc2VydC12MC41LjEiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvYXNzZXJ0IiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvYXNzZXJ0LXYwLjUuMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL2Fzc2VydC12MC41LjEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9hc3NlcnQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Fzc2VydC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjgxMzZlMThiYzA3MDIyZjM0MzBkZTdiN2ZlZTA5ODVmMjEwYTE1M2FhYWJiNDc2ZWUzOGZlNDAxYjY3YzM0MmY0NGRiYmJjZTcwZDkzMTBlMGNjMTJlYmRhMDgwYjJmMmYyNTJkNjQ2YWZmYTQ4YzU5ODVkMGFlNTA3NDQzMzlkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjI3OThjMWFiM2QxNTVmOTNhYTkyZjdkNjFlZjhkNDlhNGQ5NDE5MzFlNGI0YzFkYTdmNmM5NWNhZmQxY2Q2MWFhYjJmZmRkYjA5NmUzNzNkY2Y0ZWUwNmM2NzJmOTFiMTI5YWY3ZGNjODBkNTlhOTMwNGM5Y2Q1YmQwYTc4OTk4IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL2VydHAtdjAuMTUuMyI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9lcnRwIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvZXJ0cC12MC4xNS4zIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvZXJ0cC12MC4xNS4zIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL3N1YnNjcmliZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3Vic2NyaWJlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIvdG9vbHMvdGVzdFN1cHBvcnRzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy90ZXN0U3VwcG9ydHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjguMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC44LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2V4cG9ydGVkLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3dpbmdzZXQtdmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMwLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2LjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjAuMi4xNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC44LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICIuL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImV4cG9ydGVkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODlhNTIwY2JmMWYxZGQwNWRmMjVjN2FmMWJhYWIxNzlkOTg5YWEyZGNiM2ZkN2JmNzRiZmRlMjU5MmIzMzM4NjQyY2NlYzU3ZmMzYjNjNGYxODY1YTdiZTMxZWMyNGJlNmQ1ODU5N2ZhZDBlNjc2ZmUyNzcxYmM5NTU4MzQwOGEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYW1vdW50TWF0aC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYW1vdW50TWF0aC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjkyZjE0Mjc2NjhlNWE3ZmNmZmU3NWZmOTdjOTcxOTcxMDlhMTdmMjVlYjY5OTU4NTQzNmVhNTJiMGE1YTM4YWM0MjYwNGJhZGUwZjU0MmI0MzdlNTA3YjM1NTgwYzU2MzRhMzU1ZmE5ZThkYjFiODAzN2VkNThiMjZhZTQyMjkyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Rpc3BsYXlJbmZvLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kaXNwbGF5SW5mby5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdmOWU1Zjc4NWRjYjcyMDQ2MjM1MTU0NmRhOWY4OTZiODU5NDY1ZjliOGJiYzg1ODUyOGNjNWIxNWEzY2Y2MjZlZjJiYjNjZjM1NTA5MjNmZTBjMTNmOTczNTQ3MDljOGU5MTU1Y2YxNDNhMTM2ZGY4OThlMTAyODE5MjJkMzg4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImViZWE3NGFlZjAwODNlNWUyM2RmMTJkOTIzZDgxZmRmYmYxYmRmOGRkNjFmOGUzMmFjODU4YWJjZTM4MWYyMzNkMWM1NGQ5ZTZiMTcxNGEyOWJjYmE5NjE5ZDQ4YmI5YTYwNzE4ZWNmNjBlMDg1MWFhMjEzMjUzNmEwMjNiY2FjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2lzc3VlcktpdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaXNzdWVyS2l0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDcwZDdlZmI4ZTZkOTZhN2FjOTkzZTVhNzZhNGEwYzdlOTRmM2RhODcwZjZjMzc2OTRjNGI4YzQ4MmEwODJiY2VjNDZlYjBmNTgyOWVkMzM3ZTQ5NDZhNThiNjRiMWY1MzQ4MzFiZTFmYWEzNWM0Njk4OWQ3MDU0MDUyOTlhZjMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGVnYWN5LXBheW1lbnQtaGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGVnYWN5LXBheW1lbnQtaGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjg1OTlkNThjMjYyZGRiNzY4M2RjNjliNGE4NGJhYjhkYzdkYTg0NmZlNjA1MTZhNWRiN2JiZDQ2ZGY4N2M5NGQzNzRhODEwN2RhODc2N2QwZDQwNmRmYTAxNWVlMTFjZTY0ODA3ZDliMzhiNDljYzMwMmYzOWI1NDk2MWYyNjNkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2I4MTY1MWI1YjZkODI3OWUxMjgzMTc0MWRkYjU1YjBjNzZhMmUzNDczODdlZjMxM2RmNGUzYzMwYjg4NjgyZWU4MTk1MTVjMjhkNmQ1N2YzMzRkZTQ5NGQ2ZDZmYzUyZGQ2NzcxZjljYjQwODFhNjIwMTUzNmQ1MzJmODMwZDEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlZTAwODY3N2Y1ZjFkZWEyMzVkMzk3OWI1OGFiYzM0YjFlNjFjYzVhZThiMjIyZDM0MDFhNDMwZmQ5NDZiZjQxZjkxNmYxNTQ1ZjZkNWQwNjczNGFmMzMzYTE1NjFiZDNlMGQ5MzcwZTFhMGM2ODcxNjI3YTI5NGQ5MDIwYjVjMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2NjQ4NDA4YTJkYjg1ZjJmZWYzZjYzYjY2ZWEwNDkzZjBkMzExMWY5ZDlmZWQzMzUxMTAxNWE5MzliYjhjYTE3MjM3YjAxYzVlMDA1MjhkN2E0ZmQyM2FkYmRkM2Q3YTEzNzU2NzhjMDcyZGIwZTg1Y2VjY2VkYjRkZGMyOTg5YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhNjE5NmQ3N2ViZDQwMzUyNmM0ZGE4NTM2ZWVlYzM2YTExMGEzMDQzOGEwMTk4MjE5MWQ3ZWYxNjQ3NjdhZWQ3OWM2YzhjNWRiZDYzZjdkNzM4NDk5NWY5ZmZjMDZhZTgzYmJkMTg3N2FjNGI1YzFmNzAzYzIxNTcxMzIxMGJkMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXltZW50LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXltZW50LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZmFjOWUwOTZkZjNkZWY5ZjQ1NGRmYmJhYTFiZTc5ZDM2NTFiMWVhYWQ4YmY1YmM3MGMzMzlkYzljMmFkZmU4NmEzNDhiZDNkODU0YWM0ODAzOGMwYzk0NTEzY2IyOTRmMmJiNmI2YjMzZWFjMDU0YWM5ODcyMTg2ZmUwMDcxMGQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF5bWVudExlZGdlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF5bWVudExlZGdlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjZkM2RjNDdhYTdiZjRjMDkzMWFjMzMwMDYyZGU4ZGNhZmE4MGYxY2UzZmZlMTZlNzM0ZmU4YWJhMjgyYjJiNmIzZTA4YzE5MzkwYWVjYzA0MWYyMDA4YjEyYTYzNDgxZjIwZGU2Mjc4MjFjZjBjOGNiNzUzYWViYWY2OGEwYzFmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3B1cnNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wdXJzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI2ZjVlN2VjZGViYWMzMGE5NTljMmE2ZWRmMzI0NDg4NTg1MzFlNDAwOGZhNzIzY2I0ZjQyZmY4ZDY4OWI5OGYzZjE2YTI5MGUwZWM2OGU5YzAwYjVjMjE5YjVkMWIzMTA2NjMyOGMyNDQzYzNkNThmYWY2OWZlYzY2OGVmNWRjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RyYW5zaWVudE5vdGlmaWVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90cmFuc2llbnROb3RpZmllci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc4ZTljZjZkMTkwMTNkYzQ0YTk3Mzg3Zjk2NDczYjBlZWY0YzM3MzNmZDg1OTJjM2UwNzZjYjVmZGY2YzBhZWQ4MTFlZDNmZmM4YzczMTQwZjcxMjNkNWNjYmUyNDVkY2EyYzE3NTU3YTNhYjlmZGE1NTAwNGJiMGVhNGEyOGI2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1OWQ5MGQ2YzNjZWRiOTM2NzJjZjVkNzljMDhlZjYyZWNiMDU2MTc2YTgxMWU5MTVjOGFjZjFiZjdhOTc4YmZhYWEyMzkwMDRiYTM0ZGJjYmUzZmMwNzc0NDkyZTU0YjE1YjRiZjZmMWFjNjQzNDAyNDQzYzdhMGQxZmQ0NWJjMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1hbWJpZW50LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy1hbWJpZW50LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYWM0MmI4ZDQ0YjI0MmFjMTQ2ZWYwNWYxNDYyN2EzMjc5OGVjNGRlZjAxNjM1NWIwNjA0YWEyZmViYWNiM2EzZTQ4NGFiZGY4N2I3MzI0NmY3ZjVlZjkwOTU4ZTIzYzEyMmRhMjBkNGU2Mjk5OWJlYzM1MDdmNzE5ZGQ1MjQzNmIiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvZ292ZXJuYW5jZS12MC45LjEiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvZ292ZXJuYW5jZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL2dvdmVybmFuY2UtdjAuOS4xIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvZ292ZXJuYW5jZS12MC45LjEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZXJ0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTUuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjIuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL3N1YnNjcmliZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3Vic2NyaWJlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIvdG9vbHMvdGVzdFN1cHBvcnRzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy90ZXN0U3VwcG9ydHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjguMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3dpbmdzZXQtdmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMwLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3RpbWUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy90aW1lLXYwLjIuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjQuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0cyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdHMtdjAuMTMuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b2UiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjUuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3pvZVNlcnZpY2Uvem9lLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NhcHRwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NhcHRwLXYyLjAuMTgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MC4yLjE0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjI0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZXhwb3J0ZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4OWE1MjBjYmYxZjFkZDA1ZGYyNWM3YWYxYmFhYjE3OWQ5ODlhYTJkY2IzZmQ3YmY3NGJmZGUyNTkyYjMzMzg2NDJjY2VjNTdmYzNiM2M0ZjE4NjVhN2JlMzFlYzI0YmU2ZDU4NTk3ZmFkMGU2NzZmZTI3NzFiYzk1NTgzNDA4YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1hbWJpZW50LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy1hbWJpZW50LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTRjM2FiMjU0ZjZiZTQxYTM4YTQ3YTlmYTIwMWM5NmNlOTBhNjQ2ZjU3ZTI1MjQzZTIxOTI1ZTBiNzVlNTEwMGVkYzA1YjRiZTU3YTM1ZDkzMzU1MjM1YTIwMTAzYTJlZGRiZDBiZTEwMTllYjliN2IxMmI5MTI2YzUzMjkyNDAiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2VydHAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9lcnRwLXYwLjE1LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2dvdmVybmFuY2UiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjkuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZ292ZXJuYW5jZS9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2dvdmVybmFuY2UtdjAuOS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllci9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllci9zdWJzY3JpYmUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3N1YnNjcmliZS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMvdGVzdFN1cHBvcnRzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC44LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3RpbWUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy90aW1lLXYwLjIuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjQuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0cyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdHMtdjAuMTMuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b2UiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjUuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3pvZVNlcnZpY2Uvem9lLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9lLXYwLjI1LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2V4cG9ydGVkLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdHMvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjUuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2NvbnRyYWN0cy9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvZS9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvZS12MC4yNS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvdHlwZUd1YXJkcy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jYXB0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jYXB0cC12Mi4wLjE4IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2LjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjAuMi4xNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC44LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lY29uQ29tbWl0dGVlQ2hhcnRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZWNvbkNvbW1pdHRlZUNoYXJ0ZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5NDQxMWE3ZDAyODM3MzdhM2YwOGY0NWMyYjc4MmExOGRjYWE4YjZhZjA4YmM3ZmFmMTZkYmU3NTBlMGJhNjcyMWZjYmU4YzRiNTQwMjcxZjQ4YWM5MTg2NGMxYWQyYjlmMDg2MzQzZDk1OTBjYTNiMTVjNTA2ZGU0MGE5ZGQwOCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvaW50ZXJuYWwiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiamVzc2llLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogImplc3NpZS5qcy12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9tYWluLmpzIgogICAgICAgIH0sCiAgICAgICAgImplc3NpZS5qcy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiamVzc2llLmpzLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbmZpZy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29uZmlnLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDY1ZGQ0MmU4MjVlNjg4NTc2OGFlZGU4NjEzZDNhMGJhODgyMmMxMzkxYjVlZGRiZDhiYzk4ZmNlYzcxZDhiYjk3Yzk0YTRhM2Y0ZmRmZTlhN2M0Yjc0OTU2ZjEzZTA2OWQyMmRjMzY0MmRmMjYzYWUxZDAxZjEwYTAzNTk5ZGEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGVidWcuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2RlYnVnLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDk4YzZmNDMyYmI4ZWY3MzdlZTc5NTk3YzljNjQ0MTg3NzcxNTQ0MjE1ZWUwOGRiMzM4ZGE2MmU2N2E2YjYxZjA4Mjg1OTUxNmY1NGNmNDk3YWI3YTE1MGU1MmFjNTdiNGU3OTUzNWY1MzhiNWFjMjI1ODFkZDYxOWI1MzFhNWIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWY5ZmY1MjJlNzhiMzkxMGZlYTc0MTlhZTI5N2QwYmI5YTFkMGQwZmQ5ZDg4OTk5ODIwZDcxN2FiZjE3NzBiZWRjMzQ2MWVhNTQxNDkzNmY1NWZkNmFjZGFlYjQwMjEzY2UzZGZkMjYzNTFhMWJjZmRiMGIxMzkyZWE5NjNjNDAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGliLWNoYWluU3RvcmFnZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE5MjY3NzQ4YzU3ZDVhODE2NTU4NWM2YzVlNmQ3NzdjZWIxOWVhZDU4MGVkMGQ0MTlmZTg4ZGVlY2Q0NTNiZTZjOTUzOWRjZjI5ZDAxYzc2NTViNzQ5OTE0MWNlYTQ4ZjBlZWI3OGI3Y2UzYzk0YTA2MWNkYWMyN2IxYzZlZTIxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ldGhvZC10b29scy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWV0aG9kLXRvb2xzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTMyNzg4ZmRiNmQ1ZjNkY2IzOGQ4NmMyODhkOGM5YjIxNjE4MTk2NDNmMmJiN2FiYmQ3M2QzNzM4OGYwNzYxODM1YWZkYzBkNTM5ZjAxOTgyYjVmNDIwNzEwNzY2ZmU3ZTE4NzhhZjA2YzM0ZjA2M2RhMzJjYTZjZjhiZjljODEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY2YjQwZDY2ZjMyNTVjODc3YjUwNmUyNTE1NDc3YWRmMjc5MzIwN2YyYjg2NjM2NzYzZjk5MDEzZTgxOWMzOGE1MmNhNjQxMGQzOWI3NThkNGM3MjQ0YmU1NGU5ODI0YTI2YThhNTkwMzU1OTc5ZWVlMGNlNWI3NjMxMGExOWUwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3V0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy91dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNmYTUzN2YyZGRjYjg0MGZlYTExMDU4YzNkMmNlNGJhOGE5MTc5NGQzMTI4MWUxMTM5NzVlOWNiMzlmZmE5Y2UzZDVmNGZhYjdjM2E1MTM4MDFiZGQ4ODRiNmJmZTY1YWU4ZGRjYThiNjhhNTNjNTUzNjM4YWE5ZGQ3MDA3Yjk5IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL25vdGlmaWVyLXYwLjUuMSI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9ub3RpZmllciIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjUuMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjUuMSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Fzc2VydCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Fzc2VydC12MC41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9hc3NlcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjIuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjguMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3dpbmctc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zd2luZy1zdG9yZS12MC44LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9zd2luZ1N0b3JlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3dpbmdzZXQtdmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMwLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MC4yLjE0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJleHBvcnRlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjg5YTUyMGNiZjFmMWRkMDVkZjI1YzdhZjFiYWFiMTc5ZDk4OWFhMmRjYjNmZDdiZjc0YmZkZTI1OTJiMzMzODY0MmNjZWM1N2ZjM2IzYzRmMTg2NWE3YmUzMWVjMjRiZTZkNTg1OTdmYWQwZTY3NmZlMjc3MWJjOTU1ODM0MDhhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImYzMDdlODQ1ODYxMDBhNzM5ZmRlYzU1NDk4ODkwZGI0NDQ4MjkxYTA2NzU3MWE1MTczOWU4YTQ4NTk4N2M4MTkwYzg5NTBjYjJiM2I4MTdiZDAxNzgyODIyOTI1YmEwYTVlZDk3ZmI5NGEyYzRhZWZmYjIzNjM0ZmJlOTA0ZGIwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNkYzI2MGViMGU0MjkwMzgwNDEyNWIzZjUxYzA3OWM4MzMzMDE2ZWIxNmQ3YTQ1Njk0MmJmYjViODg0Mjg5YzJhNjI0N2M3ZDkxNGZmMmNiZjgwNzhkMmYxYjVkOTE4ZjhkZTJkOWNjMWVmN2JkOWQ1Y2VlYjdmNTRmMTQwZWY4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL25vdGlmaWVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9ub3RpZmllci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFlMmVmZDJiZjAzOGRkYmY4ZjZkMWY3NDA0NTcwMzk1NTE1ZWExY2U0ZGRhZDkzYTk3M2UyMGFjY2M0MjJiOGE1MzY0NjI1YzdlN2I0MzQ0NjI4YjQwNDQ2YWJiZDkzMWQxMTY5NzkzMzRiN2ZhZDkwMWM3N2JlOGE5NTM3NDNhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3B1Ymxpc2gta2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wdWJsaXNoLWtpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU1ZmZkM2I3ZmNjMGNhOWMwODZjMGI1Yjg0ZjM2OTM2YmM4NWExMmE5NTgxZTM3ZjJjZDU1MjkxYzJlNDUxNDdmYWNkNmU5OTYyNWIyOTkwNzBlYzdiNzUxMWViMDdmOGIzMGZhYzcyNDM3Y2U5NTg3NGZiOGM2NTA5NzM2YTY1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3JlZC1ub3RpZmllci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVkLW5vdGlmaWVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzBhNzM2MjAxZjQxMjg5ZTliZDkwZjIwMTQ4ZjA0OTc4ZWUxN2Q0MTQyZGU1ZWFkNDRhMWY0OWRmZTMxNDU5ZjQ2OTM2MTE0ODJkYTRhMGMyMTVmNDRlYjZhMWI0MGE2NjA1Mjg5MjAwMTA3ODczMTc3MzViZmQ5YzBkMDg2NDgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVkLXRvcGljLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZWQtdG9waWMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5ODg4NTg2NDc4YWZlN2JjM2UyZjUxOTJjMGQxODExYmYyYTE3ODg2NDM0MTRkOGZlZTY5NjlkZmVkZGJiNGU3ZWRjYTI1NzE0MWU3Yzk4YmZhNzY1NmViMjFiMzY0YmU5YTIyYjM3OWE5NjVlZWY5YTdhNzU2ZWU0OTJkNWZlMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXN1Yi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzdWIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkZGZlNTg1ZmY5MjAwZTFlNzFmYmM2YjU0NDllMWFhNmExMmZjMTZiYjI1NmMwZTM3YTY1MTBjMjhiZTkxOTE0OTM5Yjg5ZGJjODVjYTljNTYzMzhkY2IxYzU3MzJlY2JhOTlmMWVjNmU3N2NjZWY3OWRkNmFmODU3MjZkZTY1MiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdWJzY3JpYmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N1YnNjcmliZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImIyNzc5MWNkYmZjMGRiZTFmYWJhYjExODBhMWY5ZjRhNDk0YjM5ZDA3OTA3YTU5NTRiYThlY2MwM2IyYjhlNDFjY2RiMWE3OWEwNmQxYmFhMjViNGM4Njk3YWM0ZWY1NmVkYjNmZmI0MzFjYTBiZGM2M2NkM2JkZTcwYWE5MjMwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N1YnNjcmliZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N1YnNjcmliZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1MTJjYmMwNzAxMTkwN2Y5MGMxZmE1ZWY0NzFjNGFhODhlMWUyODY2YzAyNjg1NjVmOTBiMjkwMDU5YWFhMTc1OTkzY2U4OWZjY2EwYjVlZGU1Y2UxZmIyZTczOWFmN2Y4ZTk3ODkxMDU4MDI1MGNiNjFhNDNiNGUxMWQ4ZDQ5YyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90b3BpYy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdG9waWMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmZWQ1NjE3OTY4MjJmYWY3OWZjZDk1OTI1YWQ4NDJjMzU5YjlkMDliYmExNTQ5MGMyNDg2MjhlYjYyMTg2NzFkNWE4NDE1MzVmMDRmMjA4ZThmNWM4ZTBiNzZmZjBlMWQ4YjkwM2JiNDRlNTBiMzkxYmQwMGE2N2NhNjMzNjQzYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1hbWJpZW50LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy1hbWJpZW50LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjZjZjgxMGNlMzQzZDFkOWFjMDJjNjQ3N2JkYzA4Y2E4YTgxMTkxN2NhZGI5Yjg1NGQ1Y2FmZTUxYzFkNDI0YmMzZWUzNDdmNzBmZWNhODZmYzkwNGZkOGNiYjc1ZjE2Zjk3MWM5NmYxNDAyMTE2MGYzZTNjNmRlMTQwZmRhYzEiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvc3RvcmUtdjAuOC4zIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3N0b3JlIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvc3RvcmUtdjAuOC4zIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvc3RvcmUtdjAuOC4zIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MC4yLjE0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbC9zcmMvZW5jb2RlUGFzc2FibGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC44LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsL3NyYy9yYW5rT3JkZXIuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC44LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9yYW5rT3JkZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGZhc3QtY2hlY2svYXZhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBmYXN0LWNoZWNrL2F2YS12MS4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2xpYi9lc20vYXZhLWZhc3QtY2hlY2suanMiCiAgICAgICAgfSwKICAgICAgICAiQGZhc3QtY2hlY2svYXZhL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZmFzdC1jaGVjay9hdmEtdjEuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiLi9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJleHBvcnRlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImYyOWZlMzUzMDVmODA3ZGEyMzVmMDY4OGQzYjY1ZTM1MTAzOGRmYjU3NDBjZjcyODFjMjBjNDUzODI1ZjgzYTA2Njc3Njk2ZDNiZTJjMDE4NGJmMmQyNTA4MWEwOGI5MjkwZGVlYzY5YTM5Zjg4NjI5MDAxN2NjODJiYjA0YzZlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNiNTJkMDdkN2E1ZWRjOWY5YTcxY2ExZWExNjViNGJiNTNmMDU4MzUwZjZlNTJmNjVmNmJmNjZiYzIzYjFiODg5MWZiZDM2MzNiNWJmMTczZGJmOTk0YjAyMDhiNmVjYjZjYWI0OTNkMmJjODQzOTQ3NzYzNjlmMTU4ZmM0NDRkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvY2hlY2tLZXkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY2hlY2tLZXkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4YWM3YjA4NmJlY2IxODYxNmNkODY3NTc3ZjdkNjQ5OTU1OTU1NjZmZDVhNDRkOTkwY2U0NzUwMDJlNjYxOTBlOWZiNjc0MDQwMWY0NzhjMmNhYTljNjZiZjQwMDlmMjAxNDNiZjZhODBlYjg4MTM1Njk0ODFjYzRjNWM0YTE5ZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTkxZTVmMjA3MjY1NmFlZWU3Nzg1OTIxNWNlOTJlY2M4NjhiMTljN2UyZjY4MGNmMTVhYjUwYjgzZTZmNTlmNjVlZDcwODFmMjE5OWJkMTQ3MTJiNzUzYWI2YTNiNDU0NTVlODZhNjhkOTA5ZDJhZmQ3YjZiYWEwMDFiNDBkMjkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9jb3B5QmFnLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2NvcHlCYWcuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3ZDI0OGExZGI1MWZmMjQ0YThjOTkwOWFhMTk0Y2U0OWMxZDEwYTBmNTljM2Y2NGFiYjg2NTBkNTYxMzA1MDgzNGViNTIwNDkzOGMxMzk2OGFjZTUwZTQwYzIzN2Q5YmU0NGNkYmRlYWFmYTc0OGY5NTEwOTgyOGMzNjFiZjY2YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NvcHlTZXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY29weVNldC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjYyODQzOTc0ZjlhNjkxYWQ0MjNhY2ZmYzg5YjU2Y2M2MzE2NzdmMTk4MWNiNjcxN2YxZTE3ZTliMzFhZjBhY2ExNzQxMzExNTRiYTcwMGUwMjcxYjgwYmVjNDM1NzA1Nzk3MDExNTU5MzEwNTJkZTZjMzJmNjMyZTFlZGU0OGRmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTljYjUyYzEzOTY0Mjc0NjFiNDAwZjY4YzllOTUyYjY2YzFlYWYwYTUxYjEyYmM3YmE5YWMxOTlhYjZkYWY2ZTRlYjMzZTNiMTM4ZmE5MzY0MmU0OGYwZDgwYTMzNTM3NWNjZGNjNTUyZTZmN2IxNmU2NzQxNDBlYjBlNDg2NmQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4MzRkYTlkOGI0NTFmNDVmNjUxOTYwNjhmNDgyODMzNmRkMzVjM2FlNjliYzU1MDRkNDI4MjdiNWJjYzZjMTkyZmUxOWE2YThjYWViMmNkZTE2YTdmYzE5ODE1ZDRkN2FmMTE0MWIxNDRiOTg0NzM2NzdmNTA3Y2JmOTA4NzE1NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9sZWdhY3kvbGVnYWN5TWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9sZWdhY3kvbGVnYWN5TWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZThkYmFiYTFhOGE2M2FjMGYwMDE0YzFiNDhmNTZjZDM0MjE2YWYzMzRjM2ZlODI4M2Y2MzM4YzlhNjdmZWY0ODQyODA5ZDkwMTMyNmE5ZWFmMDVhZDY4NGY0YTRiMDM3YjUzZTNhOTBmOGJiMGE4YmRkNTg3MjJiMGYwMTAzYjYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjRmYTEwNTY5Mjc3Y2Y2NzMzOTA3ZmRiMjQ1ZTliZWYyMmE4ZmU3ZTc5Y2EwNWJlZGY3ZDU4YjllYzU1MjZjMzhjMWE5MGUzZDgyYWRiZWJkY2M5NTExZGY5ODM0YzEzMGRlZmNkM2RkOWQyMGYxNDJhMDY2YjBmMjNlOGVjYmMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF0dGVybnMvZXhvLW1ha2Vycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF0dGVybnMvZXhvLW1ha2Vycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjE4NTkwNDFjMTJjYTRhYzFhYTc5NmQ0NDcxMWQwMjI3NzMwNDQ1YmY4ZDYxOWFhZWEzYTcyYjAyYmJkNGE3MWQ5MmY1ZTVjYThkMzc3NTdkYzI5MjQzMDM0NWI0ZDMzZjI4Yjg1MDI4YjZhNmEwZTU3NjdiZjQ4YWQ4Y2UyN2I4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhdHRlcm5zL2V4by10b29scy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF0dGVybnMvZXhvLXRvb2xzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYjQ4NGE2NDhjMjM2MzAwMWIxZmM5ZWIxZDU3YjhlMzU4ZjIxOTJhYTM3NTBiNzhjMDBhNmE3YjM3ZDljYzE3Y2NmOGI4MWNmMjVhOTIzMTc0NDA4N2I2MDM5ZWVkOTRmZDY3ZjRiYmMyM2YzYWM0OGYxYWQ3MWVlMWU1ODg3NGMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF0dGVybnMvaW50ZXJuYWwtdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhdHRlcm5zL2ludGVybmFsLXR5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDM1ZDI2ODVhMWNmNjA5YmVlNTkwM2IyMjE2YWVlMzdjODA3ZmU0ZTFhY2M1MjlmZmVlYzVmMjUyOTYyODRmMmRlZjU2NjE2ZGU3MzZiYjJkNTRiMWY2NTMxNmZiN2M1OWQyYmM5ODY2YWMyYjU2MzNiZTAyYWEzN2UyOTMzZDIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlNTQ5YjcxZWFhYjU2MWVhODE1NzU2NGRhYjc5MGI3YTVmMWYzYzYyMzVkZTI2MjBjMWYzODdhM2M2ODBkZTJlNThmNThhZTBiZTA0MWIxZDgzMGQzNTFmOTEwMGQ1ZjJmZjdlYjFhZjBhNjk0YjA2NjA4MWY2NDE5MmM0NjE0NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI5YmFmZDg4ZGE0YTJhZjZkODcwOWVlZTdmZjJjMDgyN2M1MjFiYjVlODk3NjhmZTEwNDEzMjI4ZDBiNGI1MDk3ZWE5M2IwMDgzMWZiMTNjMjVmOTcyNjM0YTUyMWE4Y2NjZDg4YzVkOWRhY2U0YThkYThiNTViYTM2MmFjNTNmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTQwNDM4YjJlMTIyMDc0MzJkYWYzMDM0NDI0ZTgyNWU0MGQyMjhhZmEyOWI0ODJmNjc4N2Y5ZDAyMGEwM2Y0NTMxMTgwNTc1NWRhZjJkNzk4MDQzYTJkNWEzYjU4MDQ3ZjQxZDUwYWVjNDQ1N2RmYmRlY2JkZmNlYzUxNWZjMjYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhkOTE4MjliN2Y4YmJkYjQwNDQ2MjMzYjc4Njk2NGM2YTA3ODhmYzc1Y2NkMzRiNDNkNGQ1ZTAwNWYzOWZlMWQ3N2ZjZDViYTJiMTkwZjYyYTk3MjQwMjVkNWNhMDRmMjY3MzViY2E3MDY3M2RjOWJmNGEzM2E5NGNhOTZiODAzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5NjE1MTUxZmUzZjhhMTJkNTdlZGExZWZkOGE4MzdlZDFiNWZiOTkzMTFmYjdhMDJhMTcxOWQ1NzA0ZjIxNmExNGY4MmUwODczMTU3ZTcyZGViMGIyZWMxOTM1NjZhNTZkMjNjNjg2YTg2ZWYyMDYyZWI1ZWFiYTdhOTZlOGNmMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZhMTA5M2ViZTdkMTgxM2U2ZTg4ZmEwOTFmNmZjOTlkMWFkZWMyYjI3YWQwMzNjODA1NDFiOThiMGIwNjg5MGU3NTE4MGM5ZGE5NmVhMjIyNzQ5MDJkODlhZjhlYTlkMTc3MTU1ODMxYTNlNjIwMmZjZGRiZjkyM2E5NzQwMGM5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ2NGY3OGJhOGVjYWMxM2MxMjEyYTUzMmE2OGI2OGJlZWVhZGQ4ODBmZjBkZTI1ZGY0YWUwNjZiMWM0YmY0ODdiN2E5ZGEyZGY3MmZiZjY2NDZiNjBlYTlkYWZjODc1ZjA4ODRmYWVlZjE4YTVkZjg2ZWI1NDc5YmQ5YThkYjdhIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3N3aW5nc2V0LXZhdC12MC4zMC4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3N3aW5nc2V0LXZhdCIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3N3aW5nc2V0LXZhdC12MC4zMC4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMwLjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjIuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL3N1YnNjcmliZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3Vic2NyaWJlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIvdG9vbHMvdGVzdFN1cHBvcnRzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy90ZXN0U3VwcG9ydHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjguMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3dpbmctc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zd2luZy1zdG9yZS12MC44LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9zd2luZ1N0b3JlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzLXYwLjkuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdGltZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3RpbWUtdjAuMi4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy94c25hcCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3hzbmFwLXYwLjEzLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3hzbmFwLWxvY2tkb3duIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMveHNuYXAtbG9ja2Rvd24tdjAuMTMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjAuMi4yOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L2F0b2IuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYwLjIuMjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2F0b2IuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L2J0b2EuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYwLjIuMjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2J0b2EuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L2RlY29kZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjAuMi4yOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZGVjb2RlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9lbmNvZGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYwLjIuMjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2VuY29kZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MC4yLjI4IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYwLjIuMjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYnVuZGxlLXNvdXJjZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9idW5kbGUtc291cmNlLXYyLjQuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2J1bmRsZS1zb3VyY2UvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYnVuZGxlLXNvdXJjZS12Mi40LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2V4cG9ydGVkLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2J1bmRsZS1zb3VyY2UvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2J1bmRsZS1zb3VyY2UtdjIuNC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY2FwdHAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY2FwdHAtdjIuMC4xOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NoZWNrLWJ1bmRsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jaGVjay1idW5kbGUtdjAuMi4xNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY2hlY2stYnVuZGxlL2xpdGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY2hlY2stYnVuZGxlLXYwLjIuMTQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2xpdGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY2hlY2stYnVuZGxlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jaGVjay1idW5kbGUtdjAuMi4xNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9hcmNoaXZlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9idW5kbGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYnVuZGxlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9pbXBvcnQtYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbXBvcnQtYXJjaGl2ZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvaW1wb3J0LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2ltcG9ydC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvbm9kZS1wb3dlcnMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbm9kZS1wb3dlcnMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2LjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ltcG9ydC1idW5kbGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MC4zLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbml0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2luaXQtdjAuNS41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW5pdC9kZWJ1Zy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbml0LXYwLjUuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2RlYnVnLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2luaXQvbGVnYWN5LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2luaXQtdjAuNS41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbGVnYWN5LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2luaXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2luaXQtdjAuNS41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2luaXQvcHJlLWJ1bmRsZS1zb3VyY2UuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW5pdC12MC41LjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wcmUtYnVuZGxlLXNvdXJjZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbml0L3ByZS1yZW1vdGluZy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbml0LXYwLjUuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3ByZS1yZW1vdGluZy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbml0L3ByZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbml0LXYwLjUuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3ByZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjAuOC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjI0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vc2VzLWF2YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9zZXMtYXZhLXYwLjIuMzYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Nlcy1hdmEvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vc2VzLWF2YS12MC4yLjM2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9zZXMtYXZhL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9zZXMtYXZhLXYwLjIuMzYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby96aXAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYwLjIuMjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3ppcC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYwLjIuMjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby96aXAvcmVhZGVyLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3ppcC12MC4yLjI4IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9yZWFkZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vemlwL3dyaXRlci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby96aXAtdjAuMi4yOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vd3JpdGVyLmpzIgogICAgICAgIH0sCiAgICAgICAgImFuc2ktc3R5bGVzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogImFuc2ktc3R5bGVzLXY2LjIuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiYW55bG9nZ2VyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogImFueWxvZ2dlci12MC4yMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9hbnlsb2dnZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiYXZhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogImF2YS12NS4xLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2VudHJ5cG9pbnRzL21haW4ubWpzIgogICAgICAgIH0sCiAgICAgICAgImF2YS9lc2xpbnQtcGx1Z2luLWhlbHBlciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJhdmEtdjUuMS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9lbnRyeXBvaW50cy9lc2xpbnQtcGx1Z2luLWhlbHBlci5janMiCiAgICAgICAgfSwKICAgICAgICAiYXZhL3BsdWdpbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJhdmEtdjUuMS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9lbnRyeXBvaW50cy9wbHVnaW4ubWpzIgogICAgICAgIH0sCiAgICAgICAgImltcG9ydC1tZXRhLXJlc29sdmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiaW1wb3J0LW1ldGEtcmVzb2x2ZS12Mi4yLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIm1pY3JvdGltZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJtaWNyb3RpbWUtdjMuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleCIKICAgICAgICB9LAogICAgICAgICJzZW12ZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VtdmVyLXY2LjMuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2VtdmVyLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZXhwb3J0ZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1NjdlZjFiMWIxNjJkMDI4YWQ0OTM4MjhjZTNlZDQ1MDkzOGQwYmZmZDRmOGNlZTFkNzYxOGQ1OTk3MDlhY2ZjNGI5MjVlMDM3OTVlODYxZDdkYmI5Yjg5ZjAxNDdlZWMyYjIxZjE5NDRmN2E5Mjk3MDM1NTUwMjVmODYyODdlNiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy90aW1lLXYwLjIuMSI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy90aW1lIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvdGltZS12MC4yLjEiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy90aW1lLXYwLjIuMSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Fzc2VydCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Fzc2VydC12MC41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9hc3NlcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOC4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjI0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4MTdjZTI0ZjU0ZTA5Nzk3MzIyODdjMzFjNGE1Yjg2YzkyNmFhODA0Mzg0YzlmMWI3ZmRkOGRiYjQ0ZTcwYmRlMzdhYTk2MGRiM2NiZWMwOTVmZTU0ZTEzOGY2MTgzYTRmOTlmMjkyMWZiYjZkN2M5NzEwZTg1NWZhZjdlMDI3YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90aW1lTWF0aC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdGltZU1hdGguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhZjA0MDQzODE3NjM0ZGM1NzY2MTM2Yjk2ZGJmY2RjYTlkNWRiYjZhNWVmOWQ2OWY3NTI0ODFmOWQzZTE5ZTNmMWVkM2U3OGNhZWE5NWU5MTZjMmE1MmVjMjdlZjQ0YjI3OTBiY2I5MzYzOTFhMThhYzRkYTg2ODAwZjE1ZGE1NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2Y3MGFjMmY4NmNmYmU4NTgwZmE5MGE2MzFhOTJlMDA4OGI1ZGQ4MTU5ZTUwNjYxMDdiOWQ5ZDc4OWY4YTFjYWJlMjk5MmM0YWQ4NGRmYzUxOGViOWZhMjZhY2FlYzA5NGI1ZTQ5ODFhNjRmNDRjZTQ3NTNmNTc4YTJhOWZlYTAiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3ZhdC1kYXRhIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOC4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXhvLXV0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9leG8tdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4ZmFiZmMwZmI1MWYxY2Y5NTQ0YzMyY2M3MzA2ZDcyNWE2ZTljNDA2ZmNlZGQxNGM3N2U0MTdiZTkwZmQ2YTU2OTQ4YmMzZDkzYWI1ODdmZTYyNjU1YzRkMzRhYzIxMmRmNTRkODMwZmIxYmJlNGZlNjdjOTM5YzNjYmNlMWRlZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3N2UzYjUzNjg5ODdjMjk5MTM4MDY2YmZkMGY4ZDNiMTI0MTFmZTg3NDI4ZGI4YzBjYjQwYjVhYjk1ZjA0Y2JjNWMzNDI0MzMxMmU0NTY2NWQ0MzZjOTJhMzEwMmNlYmUyY2Q2YzQzMDAwOTJiZmFkNGQzNmFhN2EwN2EyMTFmNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy92YXQtZGF0YS1iaW5kaW5ncy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdmF0LWRhdGEtYmluZGluZ3MuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5ZWY2M2ZiMmE1ODI1ODhjMWZmM2ZmNzA0M2I2MDYzZDE0Y2NmNzI0NzkwYmUzY2ZkNzQ3ZTBhNzA4MWQ3MDQ3YWViZjZmZWY2NDA1NzA3ZmNlZDYzOGJkMDc0YWZhOWUyM2M2ZDAxYmY4YzFiZTM0MTRhNGFmMzM3MDE0YmY3MyIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy96b2UtdjAuMjUuMyI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy96b2UiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy96b2UtdjAuMjUuMyIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3pvZS12MC4yNS4zIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2VydHAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9lcnRwLXYwLjE1LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2VydHAvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9lcnRwLXYwLjE1LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2V4cG9ydGVkLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjIuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL3N1YnNjcmliZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3Vic2NyaWJlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIvdG9vbHMvdGVzdFN1cHBvcnRzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy90ZXN0U3VwcG9ydHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjguMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC44LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2V4cG9ydGVkLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3dpbmdzZXQtdmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMwLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N3aW5nc2V0LXZhdC9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N3aW5nc2V0LXZhdC12MC4zMC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3RpbWUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy90aW1lLXYwLjIuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjQuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2J1bmRsZS1zb3VyY2UiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYnVuZGxlLXNvdXJjZS12Mi40LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9idW5kbGUtc291cmNlL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2J1bmRsZS1zb3VyY2UtdjIuNC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9idW5kbGUtc291cmNlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9idW5kbGUtc291cmNlLXYyLjQuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYwLjIuMTQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbXBvcnQtYnVuZGxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2ltcG9ydC1idW5kbGUtdjAuMy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjI0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZXhwb3J0ZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhYmE0N2UxZDVlOWUyYjdmMDQwMDgzOTk2Yjg3Yzg1YmVkNjIyNGMyMjEyYjE2MTVhNzkyNzYzMWJkOTQ1ZDQxNGFiOGIxMWJlMDVkMWEwYTVjMGVjMTRkZjYwMTAwNjZjYThjNmY3NTg3OGIzNWJiY2NhNmZiZTIzMjg3OGY5OCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdEZhY2V0L3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdEZhY2V0L3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZWYyNWM5YjhlOTIyM2E5Y2VkNTUzYjRiMjc3MDRiOWI3YTBiZGNmM2U5ZDc2OWM4ZjdmZDQwM2E3NmEzNDU3ZDg1YmZjZjA1ZWNjOTBiYmUzY2FiNGY5NDZhZGFkMTY4YjFhNTcyYzFjYTU2OGNlZjM4NjMwMjZjODE3ZWI2MTQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlNDg1N2NkMTk0ZTMxYjRlZjAxNWUzYWE5ZmRjYmU3MzA2MmVhYjk4YTQ2ZTc5Mjg0MjhlZjEzMjFhMjU3OGNhMGRiZWZmMTM0ZTg1OTY0NTM5OTBhZWU5MDZmZTJlZjEyNjBiYTkxYmQ1ZjdiMDMwZDM0OTliOThjNDBjNDQzZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdHMvY2FsbFNwcmVhZC90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RzL2NhbGxTcHJlYWQvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiNTc1MDAwMjk1Yzk1MzkzN2YxMGZiNWUzODNjODQzYmM3MTY0YTQ5MDc1YzUzZTE5Y2JhNDQ1YzFmZDVlNDFmZWEzMmQxYzI3NWFmNTRjNGNhZDFjNDlmNGE3NzE2YTljODU0MDYxMjY3YmY3MGQ1NzRlYmNhZWQ4ZDFjOTJiYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdHMvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0cy9leHBvcnRlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImM0NjUxOGZkZjFjODVhMzljZjBmNTdkZTFlMWJhNmE3N2FjMTY3ZTMyYTg0YTVlMjg3OGQxY2I5NWMyMTA4NzkyYjBmMThkYWJhZTZmZDA0ZTI0NWZiY2IwZDRkYTg3YTUwMmE5YmY3YzA3ZTkyZjBkMDgyZTI4MzhhYTlhOGM4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0cy9sb2FuL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdHMvbG9hbi90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY0YTAyOGRhOWY1MGY2YjM1MGJjMmJmMDg1Y2JiMmVkYmE2NjZjMzE2MGI5ZmRmYzQxODMyNWU2MjM5ZDI2OWE4MDQzMTdmY2Q5ZDg2YjczYjIxZTkzNDVhZTNiMmNlZGMyNWFmMzZjM2I3NjJmODAwZjI2OWNkYzZhMmNjOGUxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0cy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RzL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODFkNDI5YTA4OWNhNWFjMzM1ZjZhOTBkMjFiNTMxOGZkZTg4NGE5ZDIzNDU1MzM0Y2U1YjAxZWNmOTljZTA5Nzk4OThhYTQ3ZTBjMmQzN2I2YzhmMjQxMmQ4M2Q0ZDkzMDk5MWIwMmUwNTBhMzJiYzg5NzM2NDgwYTE0NDg3MTAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjYyZTEyZTVjMjM5MzUwMmQzMDU4Njk3OWE5ZmVkZmE0MDA2NjBlYjllYWE4Yzg0NDUwMDJlNWJjOTA0NGM2NjI1YmFiYzBmMGE3NTQ1ZjYxYWY5NTdmNmY4MzcxOWY0YjVkYjI2YjcyNWRhZWVmMTUzZjRlNTRiNDY3NTdhOTE1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjg3ODdmNDc3NGFlYmMxOGQ2Njk1ZTQxMmU4ZDg2ZmQ4YjUxMDE3ZGEwODE4MGQxYThjNWVhMTY4NDY0MTE2ZjM4YjI4NDBkZjYzNjU4ZjFhNTIwODI5YzE1Y2FiN2ZjYjRjZGY5OTc4ZTdlYjg5MWVjNjQzYzBlYzFiN2E0ZTYyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3pvZVNlcnZpY2UvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3pvZVNlcnZpY2UvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmOTc5MzQ0NzQ3MTJlNjI5OWQ1Mjg3ODBlODI5Y2E0NGVmZDRmNWM4ZGUxYzJhMDczNzZmMDA0MzAzMDhkZGU2NGUyZTUzMGY3Y2FkNDY4NTg3ODgzNjc1YmI5MGEzYjk0NWNlN2ZmM2JlOTBiMWRiMjMyOTdmODU5YzcxNTliOCIKICAgICAgICB9LAogICAgICAgICIuL3Rvb2xzL3R5cGVzLWFtYmllbnQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAidG9vbHMvdHlwZXMtYW1iaWVudC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImViNjk1ZDgyM2Q5ZGQwMjZjN2Y2MjE0MDVjOWE4ZDJkYzA3Y2VmNWMyZTAyYWU0OTM4MjM1Yjc0ZDM2ZGYwOWI3MTY5MGZlOWRiM2E1MjIzM2Q4ZGYzMTEyZTNjZDE4MTNkY2JiMjkzYzAzMzJkZWZhZTc3MTNjNGY2YzBmMWZlIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2LjgiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi44IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL0UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL0UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmNTVmYzg5OTM0MzYxYmRmMjUyYTEwNGNkNmZiNGZhN2JhOTRlZDI3ZTkxMmRhYmU0YmZlMjdhZmM0MDYyMTU0NTcxMTY5NzdkNjg2OTg3ZDA2MjFiNTc4ZWQxMWY4MDExYmE2MjNlODdlMDAxMGJlMTFmYmFhYmQxNWFlNGQzOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9uby1zaGltLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9uby1zaGltLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOGM2ODUzYmExZTU0NmVmZWM4NWIyZjY4YzkzNThkMTc0NzlhY2FjOTNmZGE5ZWUwNDRlMmZlODAwNjA3ZTFhNmI2MzMzMDZjNTk3ZjkyOWZkYWM4ZjU0YWNkZmU2NGFiZGI1MWI1MzA0NGQyZDA4YmFkOTBhMmRkNmVhMTc4MDAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHJhY2stdHVybnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RyYWNrLXR1cm5zLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTIyYWIwNzRmNTE2MDNhYmQwNmUzYjE5NmZlYWIxY2MxODI2YjFhMjYzNzhkMDI1YmJiM2RkMjVhZTY2NDQzMDkxNTUzOGYwYTU4YWY2YmQyOTdmNTFiYjFmM2UwYTYyYzM3MDdhZGUzMzdiOWZiNmJmZDhhOGZhMzA4NGExZDQiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2Zhci12MC4yLjE0IjogewogICAgICAibmFtZSI6ICJAZW5kby9mYXIiLAogICAgICAibGFiZWwiOiAiQGVuZG8vZmFyLXYwLjIuMTQiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZmFyLXYwLjIuMTQiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjg2OGQ4M2E1NWE2M2QxNmJiNTQwN2IyMzg3NzU4YTEyNjZiNTZjYzU4ZTRhY2ZhYzhhNmUxMmEwMzVmNTg5ZWI3M2YxYmEyMzFkYWQxM2Q1YzY1Y2U0OGVlYjJkNjI2MjgxNDIxMTg0MmRmMzkxY2JjNDRiZWJjNmUwMDBjMjIiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL21hcnNoYWwtdjAuOC4xIjogewogICAgICAibmFtZSI6ICJAZW5kby9tYXJzaGFsIiwKICAgICAgImxhYmVsIjogIkBlbmRvL21hcnNoYWwtdjAuOC4xIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL21hcnNoYWwtdjAuOC4xIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2LjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDljZWYzNmEyMTcxNTAwOGFiYTVlOTI5NjUzZjI3MjA4YzY2YmI3OThmNDBjYjZkMzMyZGZlNDM5ZGRhY2FkYzU2MjJkNWMwMDhmNzY1NzI0MjE3MTIwOTY3Y2JlOTI0ODBmZjM1NjZmMWQ5MmMyMWRiOGNhNmY4ZTBmOWRmMjEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kZWVwbHlGdWxmaWxsZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0MzhhMDJiZGRmNmVkYTVmODlkYzE3OTI0OTNiZWYzMDVkMGM4Njk5ZmE1Y2QxYTVkNGVmZDk4MzZmYzRlOWY1ZWIyZGRkODZmMTNjYzFiNDY3MTQ0MjNlOGY4YTU5ZGEyZTAwM2QzODJlNWU4NWEwYjczNzlmN2FjMWIzYzBiOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlUGFzc2FibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlYTAwNGJhYzBlN2UwYTIyYTc2ZDllMzlhYTAwZDc3OTNhNzlmZGVhYjYzYzBlZmM1ZmNkYjY4ZDgxZGQ5NDdjZGY4ZGUwYjBlMWMxM2VjNWVmMjRiMzk1ODhhMmJiM2E3ZjRmZjQ4OTEyMmY5YWQ5Y2NkODc0MmQzYjRlMTI2YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZVRvQ2FwRGF0YS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjgyM2NlOWY2MDExZDI1MTE0YWZmZGRjN2ZjY2MyOTc3ZWJjMTUzNDcwNzBmNjIzZWRjZTU2NDczNjQ3Y2IwOTRmY2IxN2RiODMwZTY5NDgzYTYxN2YxZjNiYTdkYzFhM2Q5NThjOTk4YTE3MmI2ODAxMWM2MzRkYjIxZWNhNWE0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjViODVkYmU0Y2Q1OTdkYjI4NWFhZDUyNGUyMTRjYzlhOTM2NTFkZjNkODc4OTAwZWNjYTY5ODdjOTAxZjY4NTE4N2VjNWE5ZTI2MWY4N2M2MTFlZWI3ZmFiYzg1NTM2MzI5NTMwNmU5YjUzZjFkOTdmNGY2YjAyZTRiYmQzM2U4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2hlbHBlcnMvY29weUFycmF5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9oZWxwZXJzL2NvcHlBcnJheS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImYyZWQzOTM4ZjFlYzE4MDk2MWY5NjExZDgzMzQyNjdiMjg5ZjlmN2FjMjE3ZGE1NTYxOTBlNzU3ZDg1ZWM4YzVmYjk4MWM4NWM1NWVkNjdhNjg2YmY1ZmE1MjA1MzA2YWNlNTc2OWE5MmU4ZjdhZWYxOGY1MWE1MDAzYzE0ZDRlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2hlbHBlcnMvY29weVJlY29yZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaGVscGVycy9jb3B5UmVjb3JkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTI3YmJkZTY5YTY4NTg2Njc2YTUxMTJmNTQyZTc5N2Y1ODAzZGZhZDU4MmE2NmUwY2Q2MTQ1OTg4NDk1NDM5MzhmMWE4OTFiNjhlNDU5ODFkMTIyMjI4NTU4YTZkMDliNjdlYWFhNGVmMmJjMzBiYjI4Yjc4MGU4MWFmNjEyNWYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaGVscGVycy9lcnJvci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaGVscGVycy9lcnJvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjgxZmZhODhhNjYxYmNkOTE3NDljMWI0ZGY1ZWE4ZjJhN2Y4YzUzNDhiN2Q4NGVhYjMzYzQwNmQ1NjY5MjZlYjhjZDY1ZDQ2MGYyMTA4OWZmZWZhOTM0Y2Q3NDUwYTc4MzYwMjc3NGFjNzBlNjUzYTQxNTE5MWQxYjMxNmE5NWJiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2hlbHBlcnMvaXRlci1oZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9oZWxwZXJzL2l0ZXItaGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjJkMTExZjFiNmMxODllNTIwYWNlMzVlZDhlMGJiYTZhYTZkMjA3ZWU4NzgxZjZhNzY5ODgxM2Q1NjFjN2VjOWFkZmEyY2NiZjRmOGZhNTIxNzc1ZWQyYTIxMGM0NDdlMDE3NGI3YTM2ZThmZmJkMGYwZWM3NzcyN2NkZDFjODIwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3NGUyMDYyNjMwMjc2ZmViMzUxZDFjZDQzNzMyNDMyMGVkZDA5YjllM2IyNzdiNTI3ODc3OWU1MTdjOTVmMDY4ZjZmYzMxMzhhYTgyNzkwODIwYThmZDM4OTkwNzUzYzZlMmQyZTQ0NjU5ZGQ4ZTIyZTNlMzgxMmE1OGM3MzRkMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9oZWxwZXJzL3JlbW90YWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaGVscGVycy9yZW1vdGFibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwY2I1MzJjYmUzMjZmODZlYjRjY2QzNTI5OTEyYmFlNTU0OTIyNDhhNDU1ODlhODA3MDcyYzVjMzg0YmY0NzRjNGQ2ZTE5MGRhNDMzZjU2YmJiMjBjYTYzNmQ2MjZiNmMwYWNhNDU3NjZkY2IyZTFkNjc5OWVhOTQ1OTU1ODYwOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9oZWxwZXJzL3NhZmUtcHJvbWlzZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaGVscGVycy9zYWZlLXByb21pc2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkYTkyM2M3ODgxZGU2MDExMGNhYTkzZTZkZjlkMGQ0Zjc1YmQ1MGY5MGIzNWM4MjNiZjNmYThlNTE3NzA5MmUzYzcxMjc5ZjkzZGRmMjUxMTY2MmU0OTYzYmVjNzJjNGU5NThhNTIyNGIyZjc2N2Q0MWU0Y2RjMWMwYmI1ZDE4NiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9oZWxwZXJzL3N5bWJvbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaGVscGVycy9zeW1ib2wuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiY2YxNzc2MTJmZDcyZWNhMGUzZTVjY2UxODk0Y2Q0Yjg0MGFkYzM0NDU4MDg5N2Y5NzA2MmQyNzhmMDU0YzdiNzMwNDVmNTQ0YjgzN2Q0NGEzOGE3ODVhOTgyM2Y1NjE3ZWFhMzA4NzgyYjljMmFmYjE4MGUzMGUwMDU5OTMzZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9oZWxwZXJzL3RhZ2dlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaGVscGVycy90YWdnZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwNTkwZjMyZGEzZWYzYzM1NjYyNDAxMjBmNTYyZjU2ZjAyYTdhNDVhN2QyYzhmYTAxZDZmMjZhNDFhNTcxZDVkM2M1NDgxMzFmMDkxMWRhYjZjNTVmMzU2NzNiNjJkYTk0ODJkNDkxZDNjY2MyMDQwMGFmNjZjYTJhMjNiZjZiOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlLWZhci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZS1mYXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwZDI5YTY4ZmQyZDQ5NzE3NTZkY2FkMzQ3YWE1YmYxMjRkMmQ3ZjRjZmJmN2ViNTVjMjNjOTY0OTgwNGFkYzIxOGFlMzA4MGNkMTI0MGNjM2FmMWY3ZmMwNGY1YzMwNjIyNDA2YTVjMWMxZjFmNzA4NGQyN2RkMmU1OTk2YmY1MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlVGFnZ2VkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWtlVGFnZ2VkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzBiZTZhYTI3YTBhNmIxMmQ4NjY3ODU5MTAxOGQxMmU5Yzg4MWE3NGZlZDNkZGNlMWU3NzMzZTI5OTgzNTY2MDA1MmRkNDJkOTZmNjVhNGJkNTY2YjJhMWZlOGUyYWVmNWVkNTNmYjQ5MDUwYjc5OTQ1OWI3NDZkNDY3NTI2MGUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwtanVzdGluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzczYmMxMTAxYTVkMWUxODYzOGM2OTRmZWE2ZTA3ZTEyZjAwMWM2YjQ0N2FkMzEwYTVmMTFkNjNmZTU4YjE1OTQ4MzdiOWQ0OWE3OGYzZDJhYzNjOTk4ZTA4NGQ5N2U3MDNhMzJlMDliMjY2ZGM1YzI5MmM2MmRkM2NjZTVlNDgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODVkNjM2YWNmODllM2MwZDA4N2NmMTU0YmQ0MzQ3NmQ5ODYwZmZjNTJkNzlmMWMyOWZkM2M4NmVjYmU4NjBkZjZiYzYyMjhhNDNjYTM4YTNkNzZkOTdkMTU1MDk0YTg5NzY5OWNkNGY3YWE0ZDJjNWViMmUyMmE2N2U1ZDJkYTciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFyc2hhbC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjM0Y2EwZTFkYTVmNGY4M2ZiZmNkNTliM2I3YTg4YmVkZDU5NThjZWE2ZjZjM2M4MjdlNzc0OWUxZTMxYTkxNjMwNmM4OGZjNzE4ZTJjZDQ2MDI0YjRjZTE1ZjNjN2E0MWNhY2ZlZmRhYTA5ZTM0M2VmMjkyYmJhNjQ5MjJkNTg3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Bhc3NTdHlsZU9mLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXNzU3R5bGVPZi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImExZjBkZmQ1ZTk5Mzc2NjJjMjdlMTk0YWM1OWE5OGNlZTIyZDRkOTg4ZGFjNTE4ZjhiNmM2OWI2MjJhYTFmODU2MTU2ZWI3NmUxNGJjM2M0M2ZlYTNkMGQxOGI4YmU5YTdiZGNjZTc5NDYwZDU4ZTkzNjBkMTU2MThiZDFkMWVhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JhbmtPcmRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmFua09yZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMGE1NTQxZDkzMWU2NDI3YWJkZjBkMTNhODdkNjc3MzQzMmQ1NGMzMWQ5NTIwMzljNjQ3ZjBiYTlmZjJmOWY1NjQ3MzM0OTA4Yzk2ZWIwNDE2MGE1YjQzOGJjYzg0NTU2ZTUyMzI5ZWZjMThhYmMxNzM3MjczZTY5MjJlMWI3ZjAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI1ODM5N2U4NmI0NjBjMGQ2MmQ3ODk4ZjljMzhhOTAzNDljMTJmYmI0NmQzY2ExMmQwZTgzZjg2YzM4ZTg2MDg5Njc4M2EyN2IzMzRhMzE0ODhlYzRkZmRjYjVjYjBkYWI0YzVhNTg5M2U0NDFjNzEwODhjMTliYTQ0MTczMzI4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU2N2VmMWIxYjE2MmQwMjhhZDQ5MzgyOGNlM2VkNDUwOTM4ZDBiZmZkNGY4Y2VlMWQ3NjE4ZDU5OTcwOWFjZmM0YjkyNWUwMzc5NWU4NjFkN2RiYjliODlmMDE0N2VlYzJiMjFmMTk0NGY3YTkyOTcwMzU1NTAyNWY4NjI4N2U2IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9uYXQtdjQuMS4yNCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vbmF0IiwKICAgICAgImxhYmVsIjogIkBlbmRvL25hdC12NC4xLjI0IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL25hdC12NC4xLjI0IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWNkNjc5Mjg3NTAwMWRlZGRhNTUxY2U5MjRlZjFhM2UyZDA2M2Q1Zjc3NmZjM2FkZjQ3NDJkMzM2MjJkNDUxYzU0NTUzNDY2ZWM4ZGY0MjhlMWU3M2JiMGQyNzQyMzIxNmU0MzlhYjE2ODUzNDk4M2E4OGU5MzhlOTRkOTFmMzQiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3Byb21pc2Uta2l0IiwKICAgICAgImxhYmVsIjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjAuMTguMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL2xvY2tkb3duIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjkyZmY5OGQ1MmVkZGYzOThjZjk2YWNiMTA1OWJlZDAyN2Y0ODZlNWJkZDcxYzA1NzZiMjhhZmEyMTE5ZGE2Yjg0MWMzODlkMDJiMzMxMDdkOGFiYTBhZWU0OTI1ZTYzZmI3YzM1OGE2YTQ1ZmE0YWMxYWU3NzY1ODAyMDU2YWIzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2lzLXByb21pc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2lzLXByb21pc2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlYWZhYjE5Y2I5ZDczMjM3YmI2YzVmNTY4ZTU3ODY3NTFhN2FlZWY5NjYzZjJhMzBjNGI4ZjQ2NWUyMDEzOWYzZGEzNDZlYjJlNDEwMzg2ZjJkOTkyOWRmMzNjNTBmYThmMjQzNzMzZDc0ZjhiMGNmYzljOGI5ZjMxOGM0YWMwZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tZW1vLXJhY2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21lbW8tcmFjZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjZlZGI2ZThhZjFjYzkxYzY2MzJhYjI2ZTU4NjkwOGM5N2NhNmYyNmM5N2VhZTEzNjZjMGYwNTc3OTc5MTEzYjE1YzViYTRiMzQzZDUxOWE5ZWQwNWRjZmMyMTA3OTAxNDhkN2E3YzY5ZDllNjYyNDQ2N2I2NTlkMGM2ZTI5MTMzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNjODNhM2EzZTk2ZTZjNTlmMTllZWY1OWY3ZTQxN2RiNzViZjFlNmQxZGM3NmFhZGRkMmJlNDYzZTVmNGU0NzkyOWNjMWNiYjMzZjkxY2FiODZjMTc5NGY1Zjg0MDNiYzQ3ZTMzZTI2ZDExODYwM2M3ZDA1MjgxZjQ1MTdhNGFjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU2N2VmMWIxYjE2MmQwMjhhZDQ5MzgyOGNlM2VkNDUwOTM4ZDBiZmZkNGY4Y2VlMWQ3NjE4ZDU5OTcwOWFjZmM0YjkyNWUwMzc5NWU4NjFkN2RiYjliODlmMDE0N2VlYzJiMjFmMTk0NGY3YTkyOTcwMzU1NTAyNWY4NjI4N2U2IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJqZXNzaWUuanMtdjAuMy4yIjogewogICAgICAibmFtZSI6ICJqZXNzaWUuanMiLAogICAgICAibGFiZWwiOiAiamVzc2llLmpzLXYwLjMuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJqZXNzaWUuanMtdjAuMy4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MC4yLjE0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFpbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjg4MzkwZTg4OTQ1ZGY3NmZjYzY5YTE5ODM1YzY3NjlkOTcyZjVhY2IzNjM0ODdmMGIwYjk1NDBkYzhlNDZjMGI2Njc3NjEzZjZlNDkyNGZhYjM4Zjc5YmZiMGY2NDIzMTlmYjQ0ODEzNjNkN2M3NmRlNjU2NTJiYjNjYzIyYTcxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JpbmcwL0UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JpbmcwL0UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyNDlkNzBlZDAxZDRjNDI0ODJkZmY1ZmMxNmRlNjY4YzgwNjFkMDU4OTQ4NjIyNjE3OTY3MDhlZGIwNGEzM2I0MmY3YWJkMzQ2ZmVhMGQwNjc0ZDY5ODg1MWEzNzk0YzE2NGUzNTM0ZDc2ZGFmN2MwZWEzODk2YTNiYjA5OWIzNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMC9hc3luYy1nZW5lcmF0ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzAvYXN5bmMtZ2VuZXJhdGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5NDlkNWFiNTdlNjk4YjM2ZGJkOGE5NzMzNmZjZTBjNTRhMGJlN2JmNjI3ZGJiMmM2OTI5NzgzM2QxOGIxZTU1ZmIxNmU2ZTNhNTExNDMxODE0MTI5YWU3NmIzOWQ4MWI5NmRjNWUxMTg2ZmJjN2U1NTg2YjkwNDk3MGU1Mzc5YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMC9tYWluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMC9tYWluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDEwOTk1NzFmMDM2MTc2NDg2ODM2ZDBkMjkzMzc5NjgwMDIwNTA5MTM2N2IxYjczMDBiN2UwZDUyZmRmNTA2MjkwMjYyZGQ5NzlmNjg2OGFjMWE0NmM3MTljOWYyNDk2OWU0ODVkNTFiY2Q2MTI2M2JmMGE0YjcyY2JkYmMxMmQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmluZzAvbWFrZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMC9tYWtlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5ODRjZTk2NmM4MjJhMDIxZjhjZWMwY2U5MTFlYTc1NGJiY2RmZGQ3ZDlkMmFhZjgyNmVjZWMzZTUxNTU5MWI3MWY2NWJiMDZhNmIzODBiM2U3MzZlMjY0MDI2OGYwNWE1NDNjYTE3N2E1ZWZmZmM3ZGE0YWU4OWNiNGRlNGZkYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMS9hc3luYy10b29scy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzEvYXN5bmMtdG9vbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyZDE2NDE1ODg3NWMyNjQ0ZjZkOTRlNGU2YWNmOTY2MjljMTRkYTA2MTIyMDliMjAwMmYxYjVlYjQyODM3NzIyMmM3MTQzNTg5ODk2ZWM5MGYzOGIxNzhkMzU0MDA3MGQ3Y2MwN2NjNTE4ZjFlYWQ2OWMxMzk1ODA2NjViYTQ0ZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMS9tYWluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMS9tYWluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiY2YxN2Q1ZjRhNDE5NjhlZmE3ZTcxOTA0MmEyZmQ1Mzk0OGFmYmZmZDg2MDhhMzQ5M2Y5ZWExYjg4YjJiMGU5YTNiMTc2MWU3M2Y0MmMzMDQxM2VkMzE1NThiN2Q5MTEyMjU3YzViNzhkNzZiNDQ2OGJiYTI3OTcxNmQ5NjliMTMiCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9UEsDBAoAAAAAAAAAAACIQxfCLgsAAC4LAAAjAAAAQGFnb3JpYy9hc3NlcnQtdjAuNS4xL3NyYy9hc3NlcnQuanN7ImltcG9ydHMiOlsiLi90eXBlcy5qcyJdLCJleHBvcnRzIjpbIkZhaWwiLCJOb25OdWxsaXNoIiwiYW4iLCJhc3NlcnQiLCJkZXRhaWxzIiwiaWRlbnRDaGVja2VyIiwibWFrZUFzc2VydCIsInEiLCJxdW90ZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vdHlwZXMuanNcIiwgW11dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGFuLCAnbmFtZScsIHt2YWx1ZTogXCJhblwifSk7JGjigI1fb25jZS5hbihhbik7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5DaGVja2VyfSBDaGVja2VyICovXG5cbmNvbnN0e2ZyZWV6ZX09T2JqZWN0O1xuXG4vKiogQHR5cGUge0Fzc2VydH0gKi9cbmNvbnN0IGdsb2JhbEFzc2VydD1nbG9iYWxUaGlzLmFzc2VydDskaOKAjV9vbmNlLmdsb2JhbEFzc2VydChnbG9iYWxBc3NlcnQpO1xuXG5pZihnbG9iYWxBc3NlcnQ9PT11bmRlZmluZWQpe1xudGhyb3cgbmV3IEVycm9yKFxuIGBDYW5ub3QgaW5pdGlhbGl6ZSBAYWdvcmljL2Fzc2VydCwgbWlzc2luZyBnbG9iYWxUaGlzLmFzc2VydCwgaW1wb3J0ICdzZXMnIGJlZm9yZSAnQGFnb3JpYy9hc3NlcnQnYCk7XG5cbiB9XG5cbmNvbnN0IG1pc3Npbmc9LyoqIEB0eXBlIHtjb25zdH0gKi9bXG4nZmFpbCcsXG4nZXF1YWwnLFxuJ3R5cGVvZicsXG4nc3RyaW5nJyxcbidub3RlJyxcbidkZXRhaWxzJyxcbidGYWlsJyxcbidxdW90ZScsXG4nbWFrZUFzc2VydCddLlxuZmlsdGVyKChuYW1lKT0+Z2xvYmFsQXNzZXJ0W25hbWVdPT09dW5kZWZpbmVkKTtcbmlmKG1pc3NpbmcubGVuZ3RoPjApe1xudGhyb3cgbmV3IEVycm9yKFxuIGBDYW5ub3QgaW5pdGlhbGl6ZSBAYWdvcmljL2Fzc2VydCwgbWlzc2luZyBnbG9iYWxUaGlzLmFzc2VydCBtZXRob2RzICR7bWlzc2luZy5qb2luKFxuJywgJylcbiB9YCk7XG5cbiB9XG5cbmNvbnN0e2RldGFpbHMsRmFpbCxxdW90ZSxtYWtlQXNzZXJ0fT1nbG9iYWxBc3NlcnQ7JGjigI1fb25jZS5kZXRhaWxzKGRldGFpbHMpOyRo4oCNX29uY2UuRmFpbChGYWlsKTskaOKAjV9vbmNlLnF1b3RlKHF1b3RlKTskaOKAjV9vbmNlLm1ha2VBc3NlcnQobWFrZUFzc2VydCk7XG5cblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1QgfCBudWxsIHwgdW5kZWZpbmVkfSB2YWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0RGV0YWlsc11cbiAqIEByZXR1cm5zIHtUfVxuICovXG5jb25zdCAgICAgICAgTm9uTnVsbGlzaD0odmFsLG9wdERldGFpbHM9IGB1bmV4cGVjdGVkICR7cXVvdGUodmFsKX1gKT0+e1xuaWYodmFsIT1udWxsKXtcbi8qIFRoaXMgYCE9IG51bGxgIGlkaW9tIGNoZWNrcyB0aGF0IGB2YWxgIGlzIG5laXRoZXIgYG51bGxgIG5vciBgdW5kZWZpbmVkYC4qL1xucmV0dXJuIHZhbDtcbiB9XG5hc3NlcnQuZmFpbChvcHREZXRhaWxzKTtcbiB9OyRo4oCNX29uY2UuTm9uTnVsbGlzaChOb25OdWxsaXNoKTtcbmhhcmRlbihOb25OdWxsaXNoKTtcblxuLyoqXG4gKiBQcmVwZW5kIHRoZSBjb3JyZWN0IGluZGVmaW5pdGUgYXJ0aWNsZSBvbnRvIGEgbm91biwgdHlwaWNhbGx5IGEgdHlwZW9mIHJlc3VsdFxuICogZS5nLiwgXCJhbiBPYmplY3RcIiB2cy4gXCJhIE51bWJlclwiXG4gKlxuICogQGRlcHJlY2F0ZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgVGhlIG5vdW4gdG8gcHJlcGVuZFxuICogQHJldHVybnMge3N0cmluZ30gVGhlIG5vdW4gcHJlcGVuZGVkIHdpdGggYS9hblxuICovXG5mdW5jdGlvbiBhbihzdHIpe1xuc3RyPSBgJHtzdHJ9YDtcbmlmKHN0ci5sZW5ndGg+PTEmJidhZWlvdUFFSU9VJy5pbmNsdWRlcyhzdHJbMF0pKXtcbnJldHVybiBgYW4gJHtzdHJ9YDtcbiB9XG5yZXR1cm4gYGEgJHtzdHJ9YDtcbiB9XG5mcmVlemUoYW4pO1xuXG5cbi8qKlxuICogSW4gdGhlIGBhc3NlcnRGb29gL2Bpc0Zvb2AvYGNoZWNrRm9vYCBwYXR0ZXJuLCBgY2hlY2tGb29gIGhhcyBhIGBjaGVja2BcbiAqIHBhcmFtZXRlciBvZiB0eXBlIGBDaGVja2VyYC4gYGFzc2VydEZvb2AgY2FsbHMgYGNoZWNrRm9vYCBwYXNzZXNcbiAqIGBhc3NlcnRDaGVja2VyYCBhcyB0aGUgYGNoZWNrYCBhcmd1bWVudC4gYGlzRm9vYCBwYXNzZXMgYGlkZW50Q2hlY2tlcmBcbiAqIGFzIHRoZSBgY2hlY2tgIGFyZ3VtZW50LiBgaWRlbnRDaGVja2VyYCBhY3RzIHByZWNpc2VseSBsaWtlIGFuXG4gKiBpZGVudGl0eSBmdW5jdGlvbiwgYnV0IGlzIHR5cGVkIGFzIGEgYENoZWNrZXJgIHRvIGluZGljYXRlIGl0c1xuICogaW50ZW5kZWQgdXNlLlxuICpcbiAqIEB0eXBlIHtDaGVja2VyfVxuICovXG5jb25zdCAgICAgICAgaWRlbnRDaGVja2VyPShjb25kLF9kZXRhaWxzKT0+Y29uZDskaOKAjV9vbmNlLmlkZW50Q2hlY2tlcihpZGVudENoZWNrZXIpO1xuaGFyZGVuKGlkZW50Q2hlY2tlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0IjpbImdsb2JhbEFzc2VydCJdLCJkZXRhaWxzIjpbImRldGFpbHMiXSwiRmFpbCI6WyJGYWlsIl0sInF1b3RlIjpbInF1b3RlIl0sInEiOlsicXVvdGUiXSwibWFrZUFzc2VydCI6WyJtYWtlQXNzZXJ0Il0sImFuIjpbImFuIl0sIk5vbk51bGxpc2giOlsiTm9uTnVsbGlzaCJdLCJpZGVudENoZWNrZXIiOlsiaWRlbnRDaGVja2VyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAPpI5TFLgAAxS4AACIAAABAYWdvcmljL2Fzc2VydC12MC41LjEvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cbi8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbi8qIEJhc2VkIG9uKi9cbi8qIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9ibG9iL0hFQUQvcGFja2FnZXMvc2VzL3NyYy9lcnJvci90eXBlcy5qcyovXG4vKiBDb29yZGluYXRlIGVkaXRzIHVudGlsIHdlIHJlZmFjdG9yIHRvIGF2b2lkIHRoaXMgZHVwbGljYXRpb24qL1xuLyogQXQgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8yNzc0Ki9cbi8qIGlzIGEgcmVjb3JkIG9mIGEgZmFpbGVkIGF0dGVtcHQgdG8gcmVtb3ZlIHRoaXMgZHVwbGljYXRpb24uKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQmFzZUFzc2VydFxuICogVGhlIGBhc3NlcnRgIGZ1bmN0aW9uIGl0c2VsZi5cbiAqXG4gKiBAcGFyYW0geyp9IGZsYWcgVGhlIHRydXRoeS9mYWxzeSB2YWx1ZVxuICogQHBhcmFtIHtEZXRhaWxzfSBbb3B0RGV0YWlsc10gVGhlIGRldGFpbHMgdG8gdGhyb3dcbiAqIEBwYXJhbSB7RXJyb3JDb25zdHJ1Y3Rvcn0gW0Vycm9yQ29uc3RydWN0b3JdIEFuIG9wdGlvbmFsIGFsdGVybmF0ZSBlcnJvclxuICogY29uc3RydWN0b3IgdG8gdXNlLlxuICogQHJldHVybnMge2Fzc2VydHMgZmxhZ31cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFzc2VydE1ha2VFcnJvck9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZXJyb3JOYW1lXVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydE1ha2VFcnJvclxuICpcbiAqIFRoZSBgYXNzZXJ0LmVycm9yYCBtZXRob2QsIHJlY29yZGluZyBkZXRhaWxzIGZvciB0aGUgY29uc29sZS5cbiAqXG4gKiBUaGUgb3B0aW9uYWwgYG9wdERldGFpbHNgIGNhbiBiZSBhIHN0cmluZy5cbiAqIEBwYXJhbSB7RGV0YWlsc30gW29wdERldGFpbHNdIFRoZSBkZXRhaWxzIG9mIHdoYXQgd2FzIGFzc2VydGVkXG4gKiBAcGFyYW0ge0Vycm9yQ29uc3RydWN0b3J9IFtFcnJvckNvbnN0cnVjdG9yXSBBbiBvcHRpb25hbCBhbHRlcm5hdGUgZXJyb3JcbiAqIGNvbnN0cnVjdG9yIHRvIHVzZS5cbiAqIEBwYXJhbSB7QXNzZXJ0TWFrZUVycm9yT3B0aW9uc30gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7RXJyb3J9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0RmFpbFxuICpcbiAqIFRoZSBgYXNzZXJ0LmZhaWxgIG1ldGhvZC5cbiAqXG4gKiBGYWlsIGFuIGFzc2VydGlvbiwgcmVjb3JkaW5nIGZ1bGwgZGV0YWlscyB0byB0aGUgY29uc29sZSBhbmRcbiAqIHJhaXNpbmcgYW4gZXhjZXB0aW9uIHdpdGggYSBtZXNzYWdlIGluIHdoaWNoIGBkZXRhaWxzYCBzdWJzdGl0dXRpb24gdmFsdWVzXG4gKiBoYXZlIGJlZW4gbWFza2VkLlxuICpcbiAqIFRoZSBvcHRpb25hbCBgb3B0RGV0YWlsc2AgY2FuIGJlIGEgc3RyaW5nIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICogd2l0aCB0aGUgbm9kZWpzIGFzc2VydGlvbiBsaWJyYXJ5LlxuICogQHBhcmFtIHtEZXRhaWxzfSBbb3B0RGV0YWlsc10gVGhlIGRldGFpbHMgb2Ygd2hhdCB3YXMgYXNzZXJ0ZWRcbiAqIEBwYXJhbSB7RXJyb3JDb25zdHJ1Y3Rvcn0gW0Vycm9yQ29uc3RydWN0b3JdIEFuIG9wdGlvbmFsIGFsdGVybmF0ZSBlcnJvclxuICogY29uc3RydWN0b3IgdG8gdXNlLlxuICogQHJldHVybnMge25ldmVyfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydEVxdWFsXG4gKiBUaGUgYGFzc2VydC5lcXVhbGAgbWV0aG9kXG4gKlxuICogQXNzZXJ0IHRoYXQgdHdvIHZhbHVlcyBtdXN0IGJlIGBPYmplY3QuaXNgLlxuICogQHBhcmFtIHsqfSBhY3R1YWwgVGhlIHZhbHVlIHdlIHJlY2VpdmVkXG4gKiBAcGFyYW0geyp9IGV4cGVjdGVkIFdoYXQgd2Ugd2FudGVkXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXSBUaGUgZGV0YWlscyB0byB0aHJvd1xuICogQHBhcmFtIHtFcnJvckNvbnN0cnVjdG9yfSBbRXJyb3JDb25zdHJ1Y3Rvcl0gQW4gb3B0aW9uYWwgYWx0ZXJuYXRlIGVycm9yXG4gKiBjb25zdHJ1Y3RvciB0byB1c2UuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuXG4vKiBUeXBlIGFsbCB0aGUgb3ZlcmxvYWRzIG9mIHRoZSBhc3NlcnRUeXBlb2YgZnVuY3Rpb24uKi9cbi8qIFRoZXJlIG1heSBldmVudHVhbGx5IGJlIGEgYmV0dGVyIHdheSB0byBkbyB0aGlzLCBidXQqL1xuLyogdGhlbXMgdGhlIGJyZWFrcyB3aXRoIFR5cGVzY3JpcHQgNC4wLiovXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRUeXBlb2ZCaWdpbnRcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHsnYmlnaW50J30gdHlwZW5hbWVcbiAqIEBwYXJhbSB7RGV0YWlsc30gW29wdERldGFpbHNdXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBiaWdpbnR9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mQm9vbGVhblxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydib29sZWFuJ30gdHlwZW5hbWVcbiAqIEBwYXJhbSB7RGV0YWlsc30gW29wdERldGFpbHNdXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBib29sZWFufVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZkZ1bmN0aW9uXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J2Z1bmN0aW9uJ30gdHlwZW5hbWVcbiAqIEBwYXJhbSB7RGV0YWlsc30gW29wdERldGFpbHNdXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBGdW5jdGlvbn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRUeXBlb2ZOdW1iZXJcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHsnbnVtYmVyJ30gdHlwZW5hbWVcbiAqIEBwYXJhbSB7RGV0YWlsc30gW29wdERldGFpbHNdXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBudW1iZXJ9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mT2JqZWN0XG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J29iamVjdCd9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXVxuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgUmVjb3JkPGFueSwgYW55PiB8IG51bGx9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mU3RyaW5nXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J3N0cmluZyd9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXVxuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgc3RyaW5nfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZlN5bWJvbFxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydzeW1ib2wnfSB0eXBlbmFtZVxuICogQHBhcmFtIHtEZXRhaWxzfSBbb3B0RGV0YWlsc11cbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIHN5bWJvbH1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRUeXBlb2ZVbmRlZmluZWRcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHsndW5kZWZpbmVkJ30gdHlwZW5hbWVcbiAqIEBwYXJhbSB7RGV0YWlsc30gW29wdERldGFpbHNdXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyB1bmRlZmluZWR9XG4gKi9cblxuLyoqXG4gKiBUaGUgYGFzc2VydC50eXBlb2ZgIG1ldGhvZFxuICpcbiAqIEB0eXBlZGVmIHtBc3NlcnRUeXBlb2ZCaWdpbnQgJiBBc3NlcnRUeXBlb2ZCb29sZWFuICYgQXNzZXJ0VHlwZW9mRnVuY3Rpb24gJiBBc3NlcnRUeXBlb2ZOdW1iZXIgJiBBc3NlcnRUeXBlb2ZPYmplY3QgJiBBc3NlcnRUeXBlb2ZTdHJpbmcgJiBBc3NlcnRUeXBlb2ZTeW1ib2wgJiBBc3NlcnRUeXBlb2ZVbmRlZmluZWR9IEFzc2VydFR5cGVvZlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFN0cmluZ1xuICogVGhlIGBhc3NlcnQuc3RyaW5nYCBtZXRob2QuXG4gKlxuICogYGFzc2VydC5zdHJpbmcodilgIGlzIGVxdWl2YWxlbnQgdG8gYGFzc2VydC50eXBlb2YodiwgJ3N0cmluZycpYC4gV2VcbiAqIHNwZWNpYWwgY2FzZSB0aGlzIG9uZSBiZWNhdXNlIGl0IGlzIHRoZSBtb3N0IGZyZXF1ZW50bHkgdXNlZC5cbiAqXG4gKiBBc3NlcnQgYW4gZXhwZWN0ZWQgdHlwZW9mIHJlc3VsdC5cbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lbiBUaGUgdmFsdWUgdG8gZ2V0IHRoZSB0eXBlb2ZcbiAqIEBwYXJhbSB7RGV0YWlsc30gW29wdERldGFpbHNdIFRoZSBkZXRhaWxzIHRvIHRocm93XG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBzdHJpbmd9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0Tm90ZVxuICogVGhlIGBhc3NlcnQubm90ZWAgbWV0aG9kLlxuICpcbiAqIEFubm90YXRlIGFuIGVycm9yIHdpdGggZGV0YWlscywgcG90ZW50aWFsbHkgdG8gYmUgdXNlZCBieSBhblxuICogYXVnbWVudGVkIGNvbnNvbGUgc3VjaCBhcyB0aGUgY2F1c2FsIGNvbnNvbGUgb2YgYGNvbnNvbGUuanNgLCB0b1xuICogcHJvdmlkZSBleHRyYSBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggbG9nZ2VkIGVycm9ycy5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJvclxuICogQHBhcmFtIHtEZXRhaWxzfSBkZXRhaWxzTm90ZVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7fX0gRGV0YWlsc1Rva2VuXG4gKiBBIGNhbGwgdG8gdGhlIGBkZXRhaWxzYCB0ZW1wbGF0ZSBsaXRlcmFsIG1ha2VzIGFuZCByZXR1cm5zIGEgZnJlc2ggZGV0YWlsc1xuICogdG9rZW4sIHdoaWNoIGlzIGEgZnJvemVuIGVtcHR5IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGFyZ3VtZW50cyBvZiB0aGF0XG4gKiBgZGV0YWlsc2AgdGVtcGxhdGUgbGl0ZXJhbCBleHByZXNzaW9uLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3N0cmluZyB8IERldGFpbHNUb2tlbn0gRGV0YWlsc1xuICogRWl0aGVyIGEgcGxhaW4gc3RyaW5nLCBvciBtYWRlIGJ5IHRoZSBgZGV0YWlsc2AgdGVtcGxhdGUgbGl0ZXJhbCB0YWcuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdHJpbmdhYmxlUGF5bG9hZFxuICogSG9sZHMgdGhlIHBheWxvYWQgcGFzc2VkIHRvIHF1b3RlIHNvIHRoYXQgaXRzIHByaW50ZWQgZm9ybSBpcyB2aXNpYmxlLlxuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmd9IHRvU3RyaW5nIEhvdyB0byBwcmludCB0aGUgcGF5bG9hZFxuICovXG5cbi8qKlxuICogVG8gXCJkZWNsYXNzaWZ5XCIgYW5kIHF1b3RlIGEgc3Vic3RpdHV0aW9uIHZhbHVlIHVzZWQgaW4gYVxuICogYGBgIGRldGFpbHNgLi4uYCBgYGAgdGVtcGxhdGUgbGl0ZXJhbCwgZW5jbG9zZSB0aGF0IHN1YnN0aXR1dGlvbiBleHByZXNzaW9uXG4gKiBpbiBhIGNhbGwgdG8gYHF1b3RlYC4gVGhpcyBtYWtlcyB0aGUgdmFsdWUgYXBwZWFyIHF1b3RlZFxuICogKGFzIGlmIHdpdGggYEpTT04uc3RyaW5naWZ5YCkgaW4gdGhlIG1lc3NhZ2Ugb2YgdGhlIHRocm93biBlcnJvci4gVGhlXG4gKiBwYXlsb2FkIGl0c2VsZiBpcyBzdGlsbCBwYXNzZWQgdW5xdW90ZWQgdG8gdGhlIGNvbnNvbGUgYXMgaXQgd291bGQgYmVcbiAqIHdpdGhvdXQgYHF1b3RlYC5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyB3aWxsIHJldmVhbCB0aGUgZXhwZWN0ZWQgc2t5IGNvbG9yLCBidXQgbm90IHRoZVxuICogYWN0dWFsIGluY29ycmVjdCBza3kgY29sb3IsIGluIHRoZSB0aHJvd24gZXJyb3IncyBtZXNzYWdlOlxuICogYGBganNcbiAqIHNreS5jb2xvciA9PT0gZXhwZWN0ZWRDb2xvciB8fCBGYWlsYCR7c2t5LmNvbG9yfSBzaG91bGQgYmUgJHtxdW90ZShleHBlY3RlZENvbG9yKX1gO1xuICogYGBgXG4gKlxuICogVGhlIG5vcm1hbCBjb252ZW50aW9uIGlzIHRvIGxvY2FsbHkgcmVuYW1lIGBkZXRhaWxzYCB0byBgWGAgYW5kIGBxdW90ZWAgdG8gYHFgXG4gKiBsaWtlIGBjb25zdCB7IGRldGFpbHM6IFgsIHF1b3RlOiBxIH0gPSBhc3NlcnQ7YCwgc28gdGhlIGFib3ZlIGV4YW1wbGUgd291bGQgdGhlbiBiZVxuICogYGBganNcbiAqIHNreS5jb2xvciA9PT0gZXhwZWN0ZWRDb2xvciB8fCBGYWlsYCR7c2t5LmNvbG9yfSBzaG91bGQgYmUgJHtxKGV4cGVjdGVkQ29sb3IpfWA7XG4gKiBgYGBcbiAqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0UXVvdGVcbiAqIEBwYXJhbSB7Kn0gcGF5bG9hZCBXaGF0IHRvIGRlY2xhc3NpZnlcbiAqIEBwYXJhbSB7KHN0cmluZ3xudW1iZXIpfSBbc3BhY2VzXVxuICogQHJldHVybnMge1N0cmluZ2FibGVQYXlsb2FkfSBUaGUgZGVjbGFzc2lmaWVkIHBheWxvYWRcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBSYWlzZVxuICpcbiAqIFRvIG1ha2UgYW4gYGFzc2VydGAgd2hpY2ggdGVybWluYXRlcyBzb21lIGxhcmdlciB1bml0IG9mIGNvbXB1dGF0aW9uXG4gKiBsaWtlIGEgdHJhbnNhY3Rpb24sIHZhdCwgb3IgcHJvY2VzcywgY2FsbCBgbWFrZUFzc2VydGAgd2l0aCBhIGBSYWlzZWBcbiAqIGNhbGxiYWNrLCB3aGVyZSB0aGF0IGNhbGxiYWNrIGFjdHVhbGx5IHBlcmZvcm1zIHRoYXQgbGFyZ2VyIHRlcm1pbmF0aW9uLlxuICogSWYgcG9zc2libGUsIHRoZSBjYWxsYmFjayBzaG91bGQgYWxzbyByZXBvcnQgaXRzIGByZWFzb25gIHBhcmFtZXRlciBhc1xuICogdGhlIGFsbGVnZWQgcmVhc29uIGZvciB0aGUgdGVybWluYXRpb24uXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gcmVhc29uXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTWFrZUFzc2VydFxuICpcbiAqIE1ha2VzIGFuZCByZXR1cm5zIGFuIGBhc3NlcnRgIGZ1bmN0aW9uIG9iamVjdCB0aGF0IHNoYXJlcyB0aGUgYm9va2tlZXBpbmdcbiAqIHN0YXRlIGRlZmluZWQgYnkgdGhpcyBtb2R1bGUgd2l0aCBvdGhlciBgYXNzZXJ0YCBmdW5jdGlvbiBvYmplY3RzIG1hZGUgYnlcbiAqIGBtYWtlQXNzZXJ0YC4gVGhpcyBzdGF0ZSBpcyBwZXItbW9kdWxlLWluc3RhbmNlIGFuZCBpcyBleHBvc2VkIGJ5IHRoZVxuICogYGxvZ2dlZEVycm9ySGFuZGxlcmAgYWJvdmUuIFdlIHJlZmVyIHRvIGBhc3NlcnRgIGFzIGEgXCJmdW5jdGlvbiBvYmplY3RcIlxuICogYmVjYXVzZSBpdCBjYW4gYmUgY2FsbGVkIGRpcmVjdGx5IGFzIGEgZnVuY3Rpb24sIGJ1dCBhbHNvIGhhcyBtZXRob2RzIHRoYXRcbiAqIGNhbiBiZSBjYWxsZWQuXG4gKlxuICogSWYgYG9wdFJhaXNlYCBpcyBwcm92aWRlZCwgdGhlIHJldHVybmVkIGBhc3NlcnRgIGZ1bmN0aW9uIG9iamVjdCB3aWxsIGNhbGxcbiAqIGBvcHRSYWlzZShyZWFzb24pYCBiZWZvcmUgdGhyb3dpbmcgdGhlIGVycm9yLiBUaGlzIGVuYWJsZXMgYG9wdFJhaXNlYCB0b1xuICogZW5nYWdlIGluIGV2ZW4gbW9yZSB2aW9sZW50IHRlcm1pbmF0aW9uIGJlaGF2aW9yLCBsaWtlIHRlcm1pbmF0aW5nIHRoZSB2YXQsXG4gKiB0aGF0IHByZXZlbnRzIGV4ZWN1dGlvbiBmcm9tIHJlYWNoaW5nIHRoZSBmb2xsb3dpbmcgdGhyb3cuIEhvd2V2ZXIsIGlmXG4gKiBgb3B0UmFpc2VgIHJldHVybnMgbm9ybWFsbHksIHdoaWNoIHdvdWxkIGJlIHVudXN1YWwsIHRoZSB0aHJvdyBmb2xsb3dpbmdcbiAqIGBvcHRSYWlzZShyZWFzb24pYCB3b3VsZCBzdGlsbCBoYXBwZW4uXG4gKlxuICogQHBhcmFtIHtSYWlzZX0gW29wdFJhaXNlXVxuICogQHBhcmFtIHtib29sZWFufSBbdW5yZWRhY3RlZF1cbiAqIEByZXR1cm5zIHtBc3NlcnR9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KHRlbXBsYXRlOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSB8IHN0cmluZ1tdLCAuLi5hcmdzOiBhbnkpID0+IERldGFpbHNUb2tlbn0gRGV0YWlsc1RhZ1xuICpcbiAqIFVzZSB0aGUgYGRldGFpbHNgIGZ1bmN0aW9uIGFzIGEgdGVtcGxhdGUgbGl0ZXJhbCB0YWcgdG8gY3JlYXRlXG4gKiBpbmZvcm1hdGl2ZSBlcnJvciBtZXNzYWdlcy4gVGhlIGFzc2VydGlvbiBmdW5jdGlvbnMgdGFrZSBzdWNoIG1lc3NhZ2VzXG4gKiBhcyBvcHRpb25hbCBhcmd1bWVudHM6XG4gKiBgYGBqc1xuICogYXNzZXJ0KHNreS5pc0JsdWUoKSwgZGV0YWlsc2Ake3NreS5jb2xvcn0gc2hvdWxkIGJlIFwiYmx1ZVwiYCk7XG4gKiBgYGBcbiAqIG9yIGZvbGxvd2luZyB0aGUgbm9ybWFsIGNvbnZlbnRpb24gdG8gbG9jYWxseSByZW5hbWUgYGRldGFpbHNgIHRvIGBYYFxuICogYW5kIGBxdW90ZWAgdG8gYHFgIGxpa2UgYGNvbnN0IHsgZGV0YWlsczogWCwgcXVvdGU6IHEgfSA9IGFzc2VydDtgOlxuICogYGBganNcbiAqIGFzc2VydChza3kuaXNCbHVlKCksIFhgJHtza3kuY29sb3J9IHNob3VsZCBiZSBcImJsdWVcImApO1xuICogYGBgXG4gKiBIb3dldmVyLCBub3RlIHRoYXQgaW4gbW9zdCBjYXNlcyBpdCBpcyBwcmVmZXJhYmxlIHRvIGluc3RlYWQgdXNlIHRoZSBgRmFpbGBcbiAqIHRlbXBsYXRlIGxpdGVyYWwgdGFnICh3aGljaCBoYXMgdGhlIHNhbWUgaW5wdXQgc2lnbmF0dXJlIGFzIGBkZXRhaWxzYFxuICogYnV0IGF1dG9tYXRpY2FsbHkgY3JlYXRlcyBhbmQgdGhyb3dzIGFuIGVycm9yKTpcbiAqIGBgYGpzXG4gKiBza3kuaXNCbHVlKCkgfHwgRmFpbGAke3NreS5jb2xvcn0gc2hvdWxkIGJlIFwiYmx1ZVwiYDtcbiAqIGBgYFxuICpcbiAqIFRoZSBkZXRhaWxzIHRlbXBsYXRlIHRhZyByZXR1cm5zIGEgYERldGFpbHNUb2tlbmAgb2JqZWN0IHRoYXQgY2FuIHByaW50XG4gKiBpdHNlbGYgd2l0aCB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UgaW4gdHdvIHdheXMuXG4gKiBJdCB3aWxsIHJlcG9ydCBmdWxsIGRldGFpbHMgdG8gdGhlIGNvbnNvbGUsIGJ1dFxuICogbWFzayBlbWJlZGRlZCBzdWJzdGl0dXRpb24gdmFsdWVzIHdpdGggdGhlaXIgdHlwZW9mIGluZm9ybWF0aW9uIGluIHRoZSB0aHJvd24gZXJyb3JcbiAqIHRvIHByZXZlbnQgcmV2ZWFsaW5nIHNlY3JldHMgdXAgdGhlIGV4Y2VwdGlvbmFsIHBhdGguIEluIHRoZSBleGFtcGxlXG4gKiBhYm92ZSwgdGhlIHRocm93biBlcnJvciBtYXkgcmV2ZWFsIG9ubHkgdGhhdCBgc2t5LmNvbG9yYCBpcyBhIHN0cmluZyxcbiAqIHdoZXJlYXMgdGhlIHNhbWUgZGlhZ25vc3RpYyBwcmludGVkIHRvIHRoZSBjb25zb2xlIHJldmVhbHMgdGhhdCB0aGVcbiAqIHNreSB3YXMgZ3JlZW4uIFRoaXMgbWFza2luZyBjYW4gYmUgZGlzYWJsZWQgZm9yIGFuIGluZGl2aWR1YWwgc3Vic3RpdHV0aW9uIHZhbHVlXG4gKiB1c2luZyBgcXVvdGVgLlxuICpcbiAqIFRoZSBgcmF3YCBwcm9wZXJ0eSBvZiBhbiBpbnB1dCB0ZW1wbGF0ZSBhcnJheSBpcyBpZ25vcmVkLCBzbyBhIHNpbXBsZVxuICogYXJyYXkgb2Ygc3RyaW5ncyBtYXkgYmUgcHJvdmlkZWQgZGlyZWN0bHkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KHRlbXBsYXRlOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSB8IHN0cmluZ1tdLCAuLi5hcmdzOiBhbnkpID0+IG5ldmVyfSBGYWlsVGFnXG4gKlxuICogVXNlIHRoZSBgRmFpbGAgZnVuY3Rpb24gYXMgYSB0ZW1wbGF0ZSBsaXRlcmFsIHRhZyB0byBlZmZpY2llbnRseVxuICogY3JlYXRlIGFuZCB0aHJvdyBhIGBkZXRhaWxzYC1zdHlsZSBlcnJvciBvbmx5IHdoZW4gYSBjb25kaXRpb24gaXMgbm90IHNhdGlzZmllZC5cbiAqIGBgYGpzXG4gKiBjb25kaXRpb24gfHwgRmFpbGAuLi5jb21wbGFpbnQuLi5gO1xuICogYGBgXG4gKiBUaGlzIGF2b2lkcyB0aGUgb3ZlcmhlYWQgb2YgY3JlYXRpbmcgdXN1YWxseS11bm5lY2Vzc2FyeSBlcnJvcnMgbGlrZVxuICogYGBganNcbiAqIGFzc2VydChjb25kaXRpb24sIGRldGFpbHNgLi4uY29tcGxhaW50Li4uYCk7XG4gKiBgYGBcbiAqIHdoaWxlIGltcHJvdmluZyByZWFkYWJpbGl0eSBvdmVyIGFsdGVybmF0aXZlcyBsaWtlXG4gKiBgYGBqc1xuICogY29uZGl0aW9uIHx8IGFzc2VydC5mYWlsKGRldGFpbHNgLi4uY29tcGxhaW50Li4uYCk7XG4gKiBgYGBcbiAqXG4gKiBIb3dldmVyLCBkdWUgdG8gY3VycmVudCB3ZWFrbmVzcyBpbiBUeXBlU2NyaXB0LCBzdGF0aWMgcmVhc29uaW5nXG4gKiBpcyBsZXNzIHBvd2VyZnVsIHdpdGggdGhlIGB8fGAgcGF0dGVybnMgdGhhbiB3aXRoIGFuIGBhc3NlcnRgIGNhbGwuXG4gKiBVbnRpbC91bmxlc3MgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy81MTQyNiBpcyBmaXhlZCxcbiAqIGZvciBgfHxgLXN0eWxlIGFzc2VydGlvbnMgd2hlcmUgdGhpcyBsb3NzIG9mIHN0YXRpYyByZWFzb25pbmcgaXMgYSBwcm9ibGVtLFxuICogaW5zdGVhZCBleHByZXNzIHRoZSBhc3NlcnRpb24gYXNcbiAqIGBgYGpzXG4gKiAgIGlmICghY29uZGl0aW9uKSB7XG4gKiAgICAgRmFpbGAuLi5jb21wbGFpbnQuLi5gO1xuICogICB9XG4gKiBgYGBcbiAqIG9yLCBpZiBuZWVkZWQsXG4gKiBgYGBqc1xuICogICBpZiAoIWNvbmRpdGlvbikge1xuICogICAgIC8vIGB0aHJvd2AgaXMgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLCBidXQgaXQgaW1wcm92ZXMgc3RhdGljIGFuYWx5c2lzXG4gKiAgICAgdGhyb3cgRmFpbGAuLi5jb21wbGFpbnQuLi5gO1xuICogICB9XG4gKiBgYGBcbiAqL1xuXG4vKipcbiAqIGFzc2VydCB0aGF0IGV4cHIgaXMgdHJ1dGh5LCB3aXRoIGFuIG9wdGlvbmFsIGRldGFpbHMgdG8gZGVzY3JpYmVcbiAqIHRoZSBhc3NlcnRpb24uIEl0IGlzIGEgdGFnZ2VkIHRlbXBsYXRlIGxpdGVyYWwgbGlrZVxuICogYGBganNcbiAqIGFzc2VydChleHByLCBkZXRhaWxzYC4uLi5gKTtgXG4gKiBgYGBcbiAqXG4gKiBUaGUgbGl0ZXJhbCBwb3J0aW9ucyBvZiB0aGUgdGVtcGxhdGUgYXJlIGFzc3VtZWQgbm9uLXNlbnNpdGl2ZSwgYXNcbiAqIGFyZSB0aGUgYHR5cGVvZmAgdHlwZXMgb2YgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMuIFRoZXNlIGFyZVxuICogYXNzZW1ibGVkIGludG8gdGhlIHRocm93biBlcnJvciBtZXNzYWdlLiBUaGUgYWN0dWFsIGNvbnRlbnRzIG9mIHRoZVxuICogc3Vic3RpdHV0aW9uIHZhbHVlcyBhcmUgYXNzdW1lZCBzZW5zaXRpdmUsIHRvIGJlIHJldmVhbGVkIHRvXG4gKiB0aGUgY29uc29sZSBvbmx5LiBXZSBhc3N1bWUgb25seSB0aGUgdmlydHVhbCBwbGF0Zm9ybSdzIG93bmVyIGNhbiByZWFkXG4gKiB3aGF0IGlzIHdyaXR0ZW4gdG8gdGhlIGNvbnNvbGUsIHdoZXJlIHRoZSBvd25lciBpcyBpbiBhIHByaXZpbGVnZWRcbiAqIHBvc2l0aW9uIG92ZXIgY29tcHV0YXRpb24gcnVubmluZyBvbiB0aGF0IHBsYXRmb3JtLlxuICpcbiAqIFRoZSBvcHRpb25hbCBgb3B0RGV0YWlsc2AgY2FuIGJlIGEgc3RyaW5nIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICogd2l0aCB0aGUgbm9kZWpzIGFzc2VydGlvbiBsaWJyYXJ5LlxuICpcbiAqIEB0eXBlZGVmIHsgQmFzZUFzc2VydCAmIHtcbiAqICAgdHlwZW9mOiBBc3NlcnRUeXBlb2YsXG4gKiAgIGVycm9yOiBBc3NlcnRNYWtlRXJyb3IsXG4gKiAgIGZhaWw6IEFzc2VydEZhaWwsXG4gKiAgIGVxdWFsOiBBc3NlcnRFcXVhbCxcbiAqICAgc3RyaW5nOiBBc3NlcnRTdHJpbmcsXG4gKiAgIG5vdGU6IEFzc2VydE5vdGUsXG4gKiAgIGRldGFpbHM6IERldGFpbHNUYWcsXG4gKiAgIEZhaWw6IEZhaWxUYWcsXG4gKiAgIHF1b3RlOiBBc3NlcnRRdW90ZSxcbiAqICAgbWFrZUFzc2VydDogTWFrZUFzc2VydCxcbiAqIH0gfSBBc3NlcnRcbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABdze4OVwEAAFcBAAAgAAAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvZXhwb3J0ZWQuanN7ImltcG9ydHMiOlsiLi9zcmMvdHlwZXMtYW1iaWVudC5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABnEXSdtTcAALU3AAAmAAAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL2Ftb3VudE1hdGguanN7ImltcG9ydHMiOlsiLi9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanMiLCIuL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qcyIsIi4vbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanMiLCIuL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzIiwiQGFnb3JpYy9zdG9yZSIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJBbW91bnRNYXRoIiwiQXNzZXRLaW5kIiwiYXNzZXJ0QXNzZXRLaW5kIiwiYXNzZXJ0VmFsdWVHZXRIZWxwZXJzIiwiZ2V0QXNzZXRLaW5kIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHBhc3NTdHlsZU9mLGFzc2VydFJlbW90YWJsZSxhc3NlcnRSZWNvcmQsTSxtYXRjaGVzLG5hdE1hdGhIZWxwZXJzLHNldE1hdGhIZWxwZXJzLGNvcHlTZXRNYXRoSGVscGVycyxjb3B5QmFnTWF0aEhlbHBlcnM7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJhc3NlcnRSZW1vdGFibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFJlbW90YWJsZSA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UmVjb3JkXCIsIFskaOKAjV9hID0+IChhc3NlcnRSZWNvcmQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV0sW1wibWF0Y2hlc1wiLCBbJGjigI1fYSA9PiAobWF0Y2hlcyA9ICRo4oCNX2EpXV1dXSxbXCIuL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzXCIsIFtbXCJuYXRNYXRoSGVscGVyc1wiLCBbJGjigI1fYSA9PiAobmF0TWF0aEhlbHBlcnMgPSAkaOKAjV9hKV1dXV0sW1wiLi9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qc1wiLCBbW1wic2V0TWF0aEhlbHBlcnNcIiwgWyRo4oCNX2EgPT4gKHNldE1hdGhIZWxwZXJzID0gJGjigI1fYSldXV1dLFtcIi4vbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzXCIsIFtbXCJjb3B5U2V0TWF0aEhlbHBlcnNcIiwgWyRo4oCNX2EgPT4gKGNvcHlTZXRNYXRoSGVscGVycyA9ICRo4oCNX2EpXV1dXSxbXCIuL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qc1wiLCBbW1wiY29weUJhZ01hdGhIZWxwZXJzXCIsIFskaOKAjV9hID0+IChjb3B5QmFnTWF0aEhlbHBlcnMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbi8qKlxuICogQ29uc3RhbnRzIGZvciB0aGUga2luZHMgb2YgYXNzZXRzIHdlIHN1cHBvcnQuXG4gKlxuICogQHR5cGUge3sgTkFUOiAnbmF0JywgU0VUOiAnc2V0JywgQ09QWV9TRVQ6ICdjb3B5U2V0JywgQ09QWV9CQUc6ICdjb3B5QmFnJyB9fVxuICovXG5jb25zdCBBc3NldEtpbmQ9aGFyZGVuKHtcbk5BVDonbmF0JyxcblNFVDonc2V0JyxcbkNPUFlfU0VUOidjb3B5U2V0JyxcbkNPUFlfQkFHOidjb3B5QmFnJ30pOyRo4oCNX29uY2UuQXNzZXRLaW5kKEFzc2V0S2luZCk7XG5cbmNvbnN0IGFzc2V0S2luZE5hbWVzPWhhcmRlbihPYmplY3QudmFsdWVzKEFzc2V0S2luZCkuc29ydCgpKTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHtBc3NldEtpbmR9IGFsbGVnZWRBS1xuICovXG5jb25zdCBhc3NlcnRBc3NldEtpbmQ9KGFsbGVnZWRBSyk9PntcbmFzc2V0S2luZE5hbWVzLmluY2x1ZGVzKGFsbGVnZWRBSyl8fFxuRmFpbCBgVGhlIGFzc2V0S2luZCAke2FsbGVnZWRBS30gbXVzdCBiZSBvbmUgb2YgJHtxKGFzc2V0S2luZE5hbWVzKX1gO1xuIH07JGjigI1fb25jZS5hc3NlcnRBc3NldEtpbmQoYXNzZXJ0QXNzZXRLaW5kKTtcbmhhcmRlbihhc3NlcnRBc3NldEtpbmQpO1xuXG4vKipcbiAqIEFtb3VudHMgZGVzY3JpYmUgZGlnaXRhbCBhc3NldHMuIEZyb20gYW4gYW1vdW50LCB5b3UgY2FuIGxlYXJuIHRoZVxuICogYnJhbmQgb2YgZGlnaXRhbCBhc3NldCBhcyB3ZWxsIGFzIFwiaG93IG11Y2hcIiBvciBcImhvdyBtYW55XCIuIEFtb3VudHNcbiAqIGhhdmUgdHdvIHBhcnRzOiBhIGJyYW5kIChsb29zZWx5IHNwZWFraW5nLCB0aGUgdHlwZSBvZiBkaWdpdGFsXG4gKiBhc3NldCkgYW5kIHRoZSB2YWx1ZSAodGhlIGFuc3dlciB0byBcImhvdyBtdWNoXCIpLiBGb3IgZXhhbXBsZSwgaW5cbiAqIHRoZSBwaHJhc2UgXCI1IGJ1Y2tzXCIsIFwiYnVja3NcIiB0YWtlcyB0aGUgcm9sZSBvZiB0aGUgYnJhbmQgYW5kIHRoZVxuICogdmFsdWUgaXMgNS4gQW1vdW50cyBjYW4gZGVzY3JpYmUgZnVuZ2libGUgYW5kIG5vbi1mdW5naWJsZSBkaWdpdGFsXG4gKiBhc3NldHMuIEFtb3VudHMgYXJlIHBhc3MtYnktY29weSBhbmQgY2FuIGJlIG1hZGUgYnkgYW5kIHNlbnQgdG9cbiAqIGFueW9uZS5cbiAqXG4gKiBUaGUgaXNzdWVyIGlzIHRoZSBhdXRob3JpdGF0aXZlIHNvdXJjZSBvZiB0aGUgYW1vdW50IGluIHBheW1lbnRzXG4gKiBhbmQgcHVyc2VzLiBUaGUgaXNzdWVyIG11c3QgYmUgYWJsZSB0byBkbyB0aGluZ3Mgc3VjaCBhcyBhZGRcbiAqIGRpZ2l0YWwgYXNzZXRzIHRvIGEgcHVyc2UgYW5kIHdpdGhkcmF3IGRpZ2l0YWwgYXNzZXRzIGZyb20gYSBwdXJzZS5cbiAqIFRvIGRvIHNvLCBpdCBtdXN0IGtub3cgaG93IHRvIGFkZCBhbmQgc3VidHJhY3QgZGlnaXRhbCBhc3NldHMuXG4gKiBSYXRoZXIgdGhhbiBoYXJkLWNvZGluZyBhIHBhcnRpY3VsYXIgc29sdXRpb24sIHdlIGNob3NlIHRvXG4gKiBwYXJhbWV0ZXJpemUgdGhlIGlzc3VlciB3aXRoIGEgY29sbGVjdGlvbiBvZiBwb2x5bW9ycGhpYyBmdW5jdGlvbnMsXG4gKiB3aGljaCB3ZSBjYWxsIGBBbW91bnRNYXRoYC4gVGhlc2UgbWF0aCBmdW5jdGlvbnMgaW5jbHVkZSBjb25jZXB0c1xuICogbGlrZSBhZGRpdGlvbiwgc3VidHJhY3Rpb24sIGFuZCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8uXG4gKlxuICogV2UgYWxzbyB3YW50IHRvIG1ha2Ugc3VyZSB0aGVyZSBpcyBubyBjb25mdXNpb24gYXMgdG8gd2hhdCBraW5kIG9mXG4gKiBhc3NldCB3ZSBhcmUgdXNpbmcuIFRodXMsIEFtb3VudE1hdGggaW5jbHVkZXMgY2hlY2tzIG9mIHRoZVxuICogYGJyYW5kYCwgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgdHlwZSBvZiBkaWdpdGFsIGFzc2V0LiBJZlxuICogdGhlIHdyb25nIGJyYW5kIGlzIHVzZWQgaW4gQW1vdW50TWF0aCwgYW4gZXJyb3IgaXMgdGhyb3duIGFuZCB0aGVcbiAqIG9wZXJhdGlvbiBkb2VzIG5vdCBzdWNjZWVkLlxuICpcbiAqIEFtb3VudE1hdGggdXNlcyBtYXRoSGVscGVycyB0byBkbyBtb3N0IG9mIHRoZSB3b3JrLCBidXQgdGhlbiBhZGRzXG4gKiB0aGUgYnJhbmQgdG8gdGhlIHJlc3VsdC4gVGhlIGZ1bmN0aW9uIGB2YWx1ZWAgZ2V0cyB0aGUgdmFsdWUgZnJvbVxuICogdGhlIGFtb3VudCBieSByZW1vdmluZyB0aGUgYnJhbmQgKGFtb3VudCAtPiB2YWx1ZSksIGFuZCB0aGVcbiAqIGZ1bmN0aW9uIGBtYWtlYCBhZGRzIHRoZSBicmFuZCB0byBwcm9kdWNlIGFuIGFtb3VudCAodmFsdWUgLT5cbiAqIGFtb3VudCkuIFRoZSBmdW5jdGlvbiBgY29lcmNlYCB0YWtlcyBhbiBhbW91bnQgYW5kIGNoZWNrcyBpdCxcbiAqIHJldHVybmluZyBhbiBhbW91bnQgKGFtb3VudCAtPiBhbW91bnQpLlxuICpcbiAqIEVhY2ggaXNzdWVyIG9mIGRpZ2l0YWwgYXNzZXRzIGhhcyBhbiBhc3NvY2lhdGVkIGJyYW5kIGluIGFcbiAqIG9uZS10by1vbmUgbWFwcGluZy4gSW4gdW50cnVzdGVkIGNvbnRleHRzLCBzdWNoIGFzIGluIGFuYWx5emluZ1xuICogcGF5bWVudHMgYW5kIGFtb3VudHMsIHdlIGNhbiBnZXQgdGhlIGJyYW5kIGFuZCBmaW5kIHRoZSBpc3N1ZXJcbiAqIHdoaWNoIG1hdGNoZXMgdGhlIGJyYW5kLiBUaGUgaXNzdWVyIGFuZCB0aGUgYnJhbmQgbXV0dWFsbHkgdmFsaWRhdGVcbiAqIGVhY2ggb3RoZXIuXG4gKi9cblxuY29uc3QgaGVscGVycz17XG5uYXQ6bmF0TWF0aEhlbHBlcnMsXG5zZXQ6c2V0TWF0aEhlbHBlcnMsXG5jb3B5U2V0OmNvcHlTZXRNYXRoSGVscGVycyxcbmNvcHlCYWc6Y29weUJhZ01hdGhIZWxwZXJzfTtcblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50VmFsdWV9IFZcbiAqIEB0eXBlIHsodmFsdWU6IFYpID0+IEFzc2V0S2luZEZvclZhbHVlPFY+fVxuICovXG5jb25zdCBhc3NlcnRWYWx1ZUdldEFzc2V0S2luZD0odmFsdWUpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YodmFsdWUpO1xuaWYocGFzc1N0eWxlPT09J2JpZ2ludCcpe1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbnJldHVybiduYXQnO1xuIH1cbmlmKHBhc3NTdHlsZT09PSdjb3B5QXJyYXknKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5yZXR1cm4nc2V0JztcbiB9XG5pZihtYXRjaGVzKHZhbHVlLE0uc2V0KCkpKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5yZXR1cm4nY29weVNldCc7XG4gfVxuaWYobWF0Y2hlcyh2YWx1ZSxNLmJhZygpKSl7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xucmV0dXJuJ2NvcHlCYWcnO1xuIH1cbi8qIFRPRE8gVGhpcyBpc24ndCBxdWl0ZSB0aGUgcmlnaHQgZXJyb3IgbWVzc2FnZSwgaW4gY2FzZSB2YWx1ZVBhc3NTdHlsZSovXG4vKiBpcyAndGFnZ2VkJy4gV2Ugd291bGQgbmVlZCB0byBkaXN0aW5ndWlzaCB3aGF0IGtpbmQgb2YgdGFnZ2VkKi9cbi8qIG9iamVjdCBpdCBpcy4qL1xuLyogQWxzbywgdGhpcyBraW5kIG9mIG1hbnVhbCBsaXN0aW5nIGlzIGEgbWFpbnRlbmFuY2UgaGF6YXJkIHdlKi9cbi8qIChUT0RPKSB3aWxsIGVuY291bnRlciB3aGVuIHdlIGV4dGVuZCB0aGUgbWF0aCBoZWxwZXJzIGZ1cnRoZXIuKi9cbnRocm93IEZhaWwgYHZhbHVlICR7dmFsdWV9IG11c3QgYmUgYSBiaWdpbnQsIGNvcHlTZXQsIGNvcHlCYWcsIG9yIGFuIGFycmF5LCBub3QgJHtxKFxucGFzc1N0eWxlKVxuIH1gO1xuIH07XG5cbi8qKlxuICpcbiAqIEFzc2VydHMgdGhhdCB2YWx1ZSBpcyBhIHZhbGlkIEFtb3VudE1hdGggYW5kIHJldHVybnMgdGhlIGFwcHJvcHJpYXRlIGhlbHBlcnMuXG4gKlxuICogTWFkZSBhdmFpbGFibGUgb25seSBmb3IgdGVzdGluZywgYnV0IGl0IGlzIGhhcm1sZXNzIGZvciBvdGhlciB1c2VzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50VmFsdWV9IFZcbiAqIEBwYXJhbSB7Vn0gdmFsdWVcbiAqIEByZXR1cm5zIHtNYXRoSGVscGVyczxWPn1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydFZhbHVlR2V0SGVscGVycz0odmFsdWUpPT5cbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5oZWxwZXJzW2Fzc2VydFZhbHVlR2V0QXNzZXRLaW5kKHZhbHVlKV07XG5cbi8qKiBAdHlwZSB7KGFsbGVnZWRCcmFuZDogQnJhbmQsIGJyYW5kPzogQnJhbmQpID0+IHZvaWR9ICovJGjigI1fb25jZS5hc3NlcnRWYWx1ZUdldEhlbHBlcnMoYXNzZXJ0VmFsdWVHZXRIZWxwZXJzKTtcbmNvbnN0IG9wdGlvbmFsQnJhbmRDaGVjaz0oYWxsZWdlZEJyYW5kLGJyYW5kKT0+e1xuaWYoYnJhbmQhPT11bmRlZmluZWQpe1xuYXNzZXJ0UmVtb3RhYmxlKGJyYW5kLCdicmFuZCcpO1xuYWxsZWdlZEJyYW5kPT09YnJhbmR8fFxuRmFpbCBgYW1vdW50J3MgYnJhbmQgJHtxKGFsbGVnZWRCcmFuZCl9IGRpZCBub3QgbWF0Y2ggZXhwZWN0ZWQgYnJhbmQgJHtxKFxuYnJhbmQpXG4gfWA7XG4gfVxuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcmlnaHRBbW91bnRcbiAqIEBwYXJhbSB7QnJhbmQ8Sz4gfCB1bmRlZmluZWR9IGJyYW5kXG4gKiBAcmV0dXJucyB7TWF0aEhlbHBlcnM8Kj59XG4gKi9cbmNvbnN0IGNoZWNrTFJBbmRHZXRIZWxwZXJzPShsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kPXVuZGVmaW5lZCk9PntcbmFzc2VydFJlY29yZChsZWZ0QW1vdW50LCdsZWZ0QW1vdW50Jyk7XG5hc3NlcnRSZWNvcmQocmlnaHRBbW91bnQsJ3JpZ2h0QW1vdW50Jyk7XG5jb25zdHt2YWx1ZTpsZWZ0VmFsdWUsYnJhbmQ6bGVmdEJyYW5kfT1sZWZ0QW1vdW50O1xuY29uc3R7dmFsdWU6cmlnaHRWYWx1ZSxicmFuZDpyaWdodEJyYW5kfT1yaWdodEFtb3VudDtcbmFzc2VydFJlbW90YWJsZShsZWZ0QnJhbmQsJ2xlZnRCcmFuZCcpO1xuYXNzZXJ0UmVtb3RhYmxlKHJpZ2h0QnJhbmQsJ3JpZ2h0QnJhbmQnKTtcbm9wdGlvbmFsQnJhbmRDaGVjayhsZWZ0QnJhbmQsYnJhbmQpO1xub3B0aW9uYWxCcmFuZENoZWNrKHJpZ2h0QnJhbmQsYnJhbmQpO1xubGVmdEJyYW5kPT09cmlnaHRCcmFuZHx8XG5GYWlsIGBCcmFuZHMgaW4gbGVmdCAke3EobGVmdEJyYW5kKX0gYW5kIHJpZ2h0ICR7cShcbnJpZ2h0QnJhbmQpXG4gfSBzaG91bGQgbWF0Y2ggYnV0IGRvIG5vdGA7XG5jb25zdCBsZWZ0SGVscGVycz1hc3NlcnRWYWx1ZUdldEhlbHBlcnMobGVmdFZhbHVlKTtcbmNvbnN0IHJpZ2h0SGVscGVycz1hc3NlcnRWYWx1ZUdldEhlbHBlcnMocmlnaHRWYWx1ZSk7XG5sZWZ0SGVscGVycz09PXJpZ2h0SGVscGVyc3x8XG5GYWlsIGBUaGUgbGVmdCAke2xlZnRBbW91bnR9IGFuZCByaWdodCBhbW91bnQgJHtyaWdodEFtb3VudH0gaGFkIGRpZmZlcmVudCBhc3NldEtpbmRzYDtcbnJldHVybiBsZWZ0SGVscGVycztcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge01hdGhIZWxwZXJzPEFzc2V0VmFsdWVGb3JLaW5kPEs+Pn0gaFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IGxlZnRBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSByaWdodEFtb3VudFxuICogQHJldHVybnMge1tLLCBLXX1cbiAqL1xuY29uc3QgY29lcmNlTFI9KGgsbGVmdEFtb3VudCxyaWdodEFtb3VudCk9Pntcbi8qIEB0cy1leHBlY3QtZXJyb3IgY291bGQgYmUgYXJiaXRyYXJ5IHN1YnR5cGUqL1xucmV0dXJuW2guZG9Db2VyY2UobGVmdEFtb3VudC52YWx1ZSksaC5kb0NvZXJjZShyaWdodEFtb3VudC52YWx1ZSldO1xuIH07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBsZWZ0QW1vdW50IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGVcbiAqIHJpZ2h0QW1vdW50LiBUaGUgbm90aW9uIG9mIFwiZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvXCIgZGVwZW5kc1xuICogb24gdGhlIGtpbmQgb2YgYW1vdW50LCBhcyBkZWZpbmVkIGJ5IHRoZSBNYXRoSGVscGVycy4gRm9yIGV4YW1wbGUsXG4gKiB3aGV0aGVyIHJlY3RhbmdsZSBBIGlzIGdyZWF0ZXIgdGhhbiByZWN0YW5nbGUgQiBkZXBlbmRzIG9uIHdoZXRoZXIgcmVjdGFuZ2xlXG4gKiBBIGluY2x1ZGVzIHJlY3RhbmdsZSBCIGFzIGRlZmluZWQgYnkgdGhlIGxvZ2ljIGluIE1hdGhIZWxwZXJzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHJpZ2h0QW1vdW50XG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBbYnJhbmRdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXNHVEU9KGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQ9dW5kZWZpbmVkKT0+e1xuY29uc3QgaD1jaGVja0xSQW5kR2V0SGVscGVycyhsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kKTtcbnJldHVybiBoLmRvSXNHVEUoLi4uY29lcmNlTFIoaCxsZWZ0QW1vdW50LHJpZ2h0QW1vdW50KSk7XG4gfTtcblxuLyoqXG4gKiBMb2dpYyBmb3IgbWFuaXB1bGF0aW5nIGFtb3VudHMuXG4gKlxuICogQW1vdW50cyBhcmUgdGhlIGNhbm9uaWNhbCBkZXNjcmlwdGlvbiBvZiB0cmFkYWJsZSBnb29kcy4gVGhleSBhcmUgbWFuaXB1bGF0ZWRcbiAqIGJ5IGlzc3VlcnMgYW5kIG1pbnRzLCBhbmQgcmVwcmVzZW50IHRoZSBnb29kcyBhbmQgY3VycmVuY3kgY2FycmllZCBieSBwdXJzZXNcbiAqIGFuZFxuICogcGF5bWVudHMuIFRoZXkgY2FuIGJlIHVzZWQgdG8gcmVwcmVzZW50IHRoaW5ncyBsaWtlIGN1cnJlbmN5LCBzdG9jaywgYW5kIHRoZVxuICogYWJzdHJhY3QgcmlnaHQgdG8gcGFydGljaXBhdGUgaW4gYSBwYXJ0aWN1bGFyIGV4Y2hhbmdlLlxuICovXG5jb25zdCBBbW91bnRNYXRoPXtcbi8qKlxuICogTWFrZSBhbiBhbW91bnQgZnJvbSBhIHZhbHVlIGJ5IGFkZGluZyB0aGUgYnJhbmQuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IGJyYW5kXG4gKiBAcGFyYW0ge0Fzc2V0VmFsdWVGb3JLaW5kPEs+fSBhbGxlZ2VkVmFsdWVcbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cbi8qIGFsbGVnZWRWYWx1ZSBoYXMgYSBjb25kaXRpb25hbCBleHByZXNzaW9uIGZvciB0eXBlIHdpZGVuaW5nLCB0byBwcmV2ZW50IFYgYmVpbmcgYm91bmQgdG8gYSBhIGxpdGVyYWwgbGlrZSAxbiovXG5tYWtlOihicmFuZCxhbGxlZ2VkVmFsdWUpPT57XG5hc3NlcnRSZW1vdGFibGUoYnJhbmQsJ2JyYW5kJyk7XG5jb25zdCBoPWFzc2VydFZhbHVlR2V0SGVscGVycyhhbGxlZ2VkVmFsdWUpO1xuY29uc3QgdmFsdWU9aC5kb0NvZXJjZShhbGxlZ2VkVmFsdWUpO1xucmV0dXJuIGhhcmRlbih7YnJhbmQsdmFsdWV9KTtcbiB9LFxuLyoqXG4gKiBNYWtlIHN1cmUgdGhpcyBhbW91bnQgaXMgdmFsaWQgZW5vdWdoLCBhbmQgcmV0dXJuIGEgY29ycmVzcG9uZGluZ1xuICogdmFsaWQgYW1vdW50IGlmIHNvLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBicmFuZFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IGFsbGVnZWRBbW91bnRcbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cbmNvZXJjZTooYnJhbmQsYWxsZWdlZEFtb3VudCk9PntcbmFzc2VydFJlbW90YWJsZShicmFuZCwnYnJhbmQnKTtcbmFzc2VydFJlY29yZChhbGxlZ2VkQW1vdW50LCdhbW91bnQnKTtcbmNvbnN0e2JyYW5kOmFsbGVnZWRCcmFuZCx2YWx1ZTphbGxlZ2VkVmFsdWV9PWFsbGVnZWRBbW91bnQ7XG5icmFuZD09PWFsbGVnZWRCcmFuZHx8XG5GYWlsIGBUaGUgYnJhbmQgaW4gdGhlIGFsbGVnZWRBbW91bnQgJHthbGxlZ2VkQW1vdW50fSBpbiAnY29lcmNlJyBkaWRuJ3QgbWF0Y2ggdGhlIHNwZWNpZmllZCBicmFuZCAke2JyYW5kfS5gO1xuLyogV2lsbCB0aHJvdyBvbiBpbmFwcHJvcHJpYXRlIHZhbHVlKi9cbnJldHVybiBBbW91bnRNYXRoLm1ha2UoYnJhbmQsYWxsZWdlZFZhbHVlKTtcbiB9LFxuLyoqXG4gKiBFeHRyYWN0IGFuZCByZXR1cm4gdGhlIHZhbHVlLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBicmFuZFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IGFtb3VudFxuICogQHJldHVybnMge0Fzc2V0VmFsdWVGb3JLaW5kPEs+fVxuICovXG5nZXRWYWx1ZTooYnJhbmQsYW1vdW50KT0+QW1vdW50TWF0aC5jb2VyY2UoYnJhbmQsYW1vdW50KS52YWx1ZSxcbi8qKlxuICogUmV0dXJuIHRoZSBhbW91bnQgcmVwcmVzZW50aW5nIGFuIGVtcHR5IGFtb3VudC4gVGhpcyBpcyB0aGVcbiAqIGlkZW50aXR5IGVsZW1lbnQgZm9yIE1hdGhIZWxwZXJzLmFkZCBhbmQgTWF0SGVscGVycy5zdWJ0cmFjdC5cbiAqXG4gKiBAdHlwZSB7e1xuICogICAoYnJhbmQ6IEJyYW5kKTogQW1vdW50PCduYXQnPjtcbiAqICAgPEsgZXh0ZW5kcyBBc3NldEtpbmQ+KGJyYW5kOiBCcmFuZCwgYXNzZXRLaW5kOiBLKTogQW1vdW50PEs+O1xuICogfX1cbiAqL1xubWFrZUVtcHR5OihicmFuZCxhc3NldEtpbmQ9LyoqIEB0eXBlIHtjb25zdH0gKi8nbmF0Jyk9PntcbmFzc2VydFJlbW90YWJsZShicmFuZCwnYnJhbmQnKTtcbmFzc2VydEFzc2V0S2luZChhc3NldEtpbmQpO1xuY29uc3QgdmFsdWU9aGVscGVyc1thc3NldEtpbmRdLmRvTWFrZUVtcHR5KCk7XG5yZXR1cm4gaGFyZGVuKHticmFuZCx2YWx1ZX0pO1xuIH0sXG4vKipcbiAqIFJldHVybiB0aGUgYW1vdW50IHJlcHJlc2VudGluZyBhbiBlbXB0eSBhbW91bnQsIHVzaW5nIGFub3RoZXJcbiAqIGFtb3VudCBhcyB0aGUgdGVtcGxhdGUgZm9yIHRoZSBicmFuZCBhbmQgYXNzZXRLaW5kLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gYW1vdW50XG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5tYWtlRW1wdHlGcm9tQW1vdW50OihhbW91bnQpPT57XG5hc3NlcnRSZWNvcmQoYW1vdW50LCdhbW91bnQnKTtcbmNvbnN0e2JyYW5kLHZhbHVlfT1hbW91bnQ7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuY29uc3QgYXNzZXRLaW5kPWFzc2VydFZhbHVlR2V0QXNzZXRLaW5kKHZhbHVlKTtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCAoaWdub3JlIGIvYyBlcnJvcmluZyBpbiBDSSBidXQgbm90IG15IElERSkqL1xucmV0dXJuIEFtb3VudE1hdGgubWFrZUVtcHR5KGJyYW5kLGFzc2V0S2luZCk7XG4gfSxcbi8qKlxuICogUmV0dXJuIHRydWUgaWYgdGhlIEFtb3VudCBpcyBlbXB0eS4gT3RoZXJ3aXNlIGZhbHNlLlxuICpcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRcbiAqIEBwYXJhbSB7QnJhbmR9IFticmFuZF1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5pc0VtcHR5OihhbW91bnQsYnJhbmQ9dW5kZWZpbmVkKT0+e1xuYXNzZXJ0UmVjb3JkKGFtb3VudCwnYW1vdW50Jyk7XG5jb25zdHticmFuZDphbGxlZ2VkQnJhbmQsdmFsdWV9PWFtb3VudDtcbmFzc2VydFJlbW90YWJsZShhbGxlZ2VkQnJhbmQsJ2JyYW5kJyk7XG5vcHRpb25hbEJyYW5kQ2hlY2soYWxsZWdlZEJyYW5kLGJyYW5kKTtcbmNvbnN0IGg9YXNzZXJ0VmFsdWVHZXRIZWxwZXJzKHZhbHVlKTtcbnJldHVybiBoLmRvSXNFbXB0eShoLmRvQ29lcmNlKHZhbHVlKSk7XG4gfSxcbmlzR1RFLFxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGxlZnRBbW91bnQgZXF1YWxzIHRoZSByaWdodEFtb3VudC4gV2UgYXNzdW1lXG4gKiB0aGF0IGlmIGlzR1RFIGlzIHRydWUgaW4gYm90aCBkaXJlY3Rpb25zLCBpc0VxdWFsIGlzIGFsc28gdHJ1ZVxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHJpZ2h0QW1vdW50XG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBbYnJhbmRdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuaXNFcXVhbDoobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZD11bmRlZmluZWQpPT57XG5jb25zdCBoPWNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQpO1xucmV0dXJuIGguZG9Jc0VxdWFsKC4uLmNvZXJjZUxSKGgsbGVmdEFtb3VudCxyaWdodEFtb3VudCkpO1xuIH0sXG4vKipcbiAqIFJldHVybnMgYSBuZXcgYW1vdW50IHRoYXQgaXMgdGhlIHVuaW9uIG9mIGJvdGggbGVmdEFtb3VudCBhbmQgcmlnaHRBbW91bnQuXG4gKlxuICogRm9yIGZ1bmdpYmxlIGFtb3VudCB0aGlzIG1lYW5zIGFkZGluZyB0aGUgdmFsdWVzLiBGb3Igb3RoZXIga2luZHMgb2ZcbiAqIGFtb3VudCwgaXQgdXN1YWxseSBtZWFucyBpbmNsdWRpbmcgYWxsIG9mIHRoZSBlbGVtZW50cyBmcm9tIGJvdGhcbiAqIGxlZnQgYW5kIHJpZ2h0LlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHJpZ2h0QW1vdW50XG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBbYnJhbmRdXG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5hZGQ6KGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQ9dW5kZWZpbmVkKT0+e1xuY29uc3QgaD1jaGVja0xSQW5kR2V0SGVscGVycyhsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kKTtcbmNvbnN0IHZhbHVlPWguZG9BZGQoLi4uY29lcmNlTFIoaCxsZWZ0QW1vdW50LHJpZ2h0QW1vdW50KSk7XG5yZXR1cm4gaGFyZGVuKHticmFuZDpsZWZ0QW1vdW50LmJyYW5kLHZhbHVlfSk7XG4gfSxcbi8qKlxuICogUmV0dXJucyBhIG5ldyBhbW91bnQgdGhhdCBpcyB0aGUgbGVmdEFtb3VudCBtaW51cyB0aGUgcmlnaHRBbW91bnRcbiAqIChpLmUuIGV2ZXJ5dGhpbmcgaW4gdGhlIGxlZnRBbW91bnQgdGhhdCBpcyBub3QgaW4gdGhlXG4gKiByaWdodEFtb3VudCkuIElmIGxlZnRBbW91bnQgZG9lc24ndCBpbmNsdWRlIHJpZ2h0QW1vdW50XG4gKiAoc3VidHJhY3Rpb24gcmVzdWx0cyBpbiBhIG5lZ2F0aXZlKSwgdGhyb3cgIGFuIGVycm9yLiBCZWNhdXNlIHRoZVxuICogbGVmdCBhbW91bnQgbXVzdCBpbmNsdWRlIHRoZSByaWdodCBhbW91bnQsIHRoaXMgaXMgTk9UIGVxdWl2YWxlbnRcbiAqIHRvIHNldCBzdWJ0cmFjdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHBhcmFtIHtBbW91bnQ8Sz59IGxlZnRBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSByaWdodEFtb3VudFxuICogQHBhcmFtIHtCcmFuZDxLPn0gW2JyYW5kXVxuICogQHJldHVybnMge0Ftb3VudDxLPn1cbiAqL1xuc3VidHJhY3Q6KGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQ9dW5kZWZpbmVkKT0+e1xuY29uc3QgaD1jaGVja0xSQW5kR2V0SGVscGVycyhsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kKTtcbmNvbnN0IHZhbHVlPWguZG9TdWJ0cmFjdCguLi5jb2VyY2VMUihoLGxlZnRBbW91bnQscmlnaHRBbW91bnQpKTtcbnJldHVybiBoYXJkZW4oe2JyYW5kOmxlZnRBbW91bnQuYnJhbmQsdmFsdWV9KTtcbiB9LFxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtaW4gdmFsdWUgYmV0d2VlbiB4IGFuZCB5IHVzaW5nIGlzR1RFXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEBwYXJhbSB7QW1vdW50PEs+fSB4XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0geVxuICogQHBhcmFtIHtCcmFuZDxLPn0gW2JyYW5kXVxuICogQHJldHVybnMge0Ftb3VudDxLPn1cbiAqL1xubWluOih4LHksYnJhbmQ9dW5kZWZpbmVkKT0+XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnkqL1xuaXNHVEUoeCx5LGJyYW5kKT9cbnk6XG5pc0dURSh5LHgsYnJhbmQpP1xueDpcbkZhaWwgYCR7eH0gYW5kICR7eX0gYXJlIGluY29tcGFyYWJsZWAsXG4vKipcbiAqIFJldHVybnMgdGhlIG1heCB2YWx1ZSBiZXR3ZWVuIHggYW5kIHkgdXNpbmcgaXNHVEVcbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHhcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSB5XG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBbYnJhbmRdXG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5tYXg6KHgseSxicmFuZD11bmRlZmluZWQpPT5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeSovXG5pc0dURSh4LHksYnJhbmQpP1xueDpcbmlzR1RFKHkseCk/XG55OlxuRmFpbCBgJHt4fSBhbmQgJHt5fSBhcmUgaW5jb21wYXJhYmxlYH07JGjigI1fb25jZS5BbW91bnRNYXRoKEFtb3VudE1hdGgpO1xuXG5oYXJkZW4oQW1vdW50TWF0aCk7XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRcbiAqL1xuY29uc3QgZ2V0QXNzZXRLaW5kPShhbW91bnQpPT57XG5hc3NlcnRSZWNvcmQoYW1vdW50LCdhbW91bnQnKTtcbmNvbnN0e3ZhbHVlfT1hbW91bnQ7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QgKGlnbm9yZSBiL2MgZXJyb3JpbmcgaW4gQ0kgYnV0IG5vdCBteSBJREUpKi9cbnJldHVybiBhc3NlcnRWYWx1ZUdldEFzc2V0S2luZCh2YWx1ZSk7XG4gfTskaOKAjV9vbmNlLmdldEFzc2V0S2luZChnZXRBc3NldEtpbmQpO1xuaGFyZGVuKGdldEFzc2V0S2luZCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQXNzZXRLaW5kIjpbIkFzc2V0S2luZCJdLCJhc3NlcnRBc3NldEtpbmQiOlsiYXNzZXJ0QXNzZXRLaW5kIl0sIkFtb3VudE1hdGgiOlsiQW1vdW50TWF0aCJdLCJnZXRBc3NldEtpbmQiOlsiZ2V0QXNzZXRLaW5kIl0sImFzc2VydFZhbHVlR2V0SGVscGVycyI6WyJhc3NlcnRWYWx1ZUdldEhlbHBlcnMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA7h+P6LwFAAC8BQAAJwAAAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9kaXNwbGF5SW5mby5qc3siaW1wb3J0cyI6WyIuL3R5cGVHdWFyZHMuanMiLCJAYWdvcmljL2Fzc2VydCIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJjb2VyY2VEaXNwbGF5SW5mbyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYWlsLG11c3RNYXRjaCxEaXNwbGF5SW5mb1NoYXBlOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJGYWlsXCIsIFskaOKAjV9hID0+IChGYWlsID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm11c3RNYXRjaFwiLCBbJGjigI1fYSA9PiAobXVzdE1hdGNoID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiRGlzcGxheUluZm9TaGFwZVwiLCBbJGjigI1fYSA9PiAoRGlzcGxheUluZm9TaGFwZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG4vKipcbiAqIEBwYXJhbSB7QWRkaXRpb25hbERpc3BsYXlJbmZvfSBhbGxlZ2VkRGlzcGxheUluZm9cbiAqIEBwYXJhbSB7QXNzZXRLaW5kfSBhc3NldEtpbmRcbiAqIEByZXR1cm5zIHtEaXNwbGF5SW5mb31cbiAqL1xuY29uc3QgICAgICAgIGNvZXJjZURpc3BsYXlJbmZvPShhbGxlZ2VkRGlzcGxheUluZm8sYXNzZXRLaW5kKT0+e1xubXVzdE1hdGNoKGFsbGVnZWREaXNwbGF5SW5mbyxEaXNwbGF5SW5mb1NoYXBlLCdkaXNwbGF5SW5mbycpO1xuXG5pZihhbGxlZ2VkRGlzcGxheUluZm8uYXNzZXRLaW5kIT09dW5kZWZpbmVkKXtcbmFsbGVnZWREaXNwbGF5SW5mby5hc3NldEtpbmQ9PT1hc3NldEtpbmR8fFxuRmFpbCBgZGlzcGxheUluZm8uYXNzZXRLaW5kIHdhcyBwcmVzZW50ICgke2FsbGVnZWREaXNwbGF5SW5mby5hc3NldEtpbmR9KSBhbmQgZGlkIG5vdCBtYXRjaCB0aGUgYXNzZXRLaW5kIGFyZ3VtZW50ICgke2Fzc2V0S2luZH0pYDtcbiB9XG5jb25zdCBkaXNwbGF5SW5mbz1oYXJkZW4oey4uLmFsbGVnZWREaXNwbGF5SW5mbyxhc3NldEtpbmR9KTtcblxuaWYoZGlzcGxheUluZm8uZGVjaW1hbFBsYWNlcyE9PXVuZGVmaW5lZCl7XG5OdW1iZXIuaXNTYWZlSW50ZWdlcihkaXNwbGF5SW5mby5kZWNpbWFsUGxhY2VzKXx8XG5GYWlsIGBkZWNpbWFsUGxhY2VzICR7ZGlzcGxheUluZm8uZGVjaW1hbFBsYWNlc30gaXMgbm90IGEgc2FmZSBpbnRlZ2VyYDtcbiB9XG5cbnJldHVybiBkaXNwbGF5SW5mbztcbiB9OyRo4oCNX29uY2UuY29lcmNlRGlzcGxheUluZm8oY29lcmNlRGlzcGxheUluZm8pO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNvZXJjZURpc3BsYXlJbmZvIjpbImNvZXJjZURpc3BsYXlJbmZvIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMm9LDjTAQAA0wEAACEAAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9hbW91bnRNYXRoLmpzIiwiLi9pc3N1ZXJLaXQuanMiLCIuL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL2lzc3VlcktpdC5qcyIsIi4vdHlwZUd1YXJkcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vYW1vdW50TWF0aC5qc1wiLCBbXV0sW1wiLi9pc3N1ZXJLaXQuanNcIiwgW11dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA9z0GKIMgAACDIAAAJQAAAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9pc3N1ZXJLaXQuanN7ImltcG9ydHMiOlsiLi9hbW91bnRNYXRoLmpzIiwiLi9kaXNwbGF5SW5mby5qcyIsIi4vcGF5bWVudExlZGdlci5qcyIsIi4vdHlwZXMtYW1iaWVudC5qcyIsIkBhZ29yaWMvYXNzZXJ0IiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiXSwiZXhwb3J0cyI6WyJoYXNJc3N1ZXIiLCJtYWtlRHVyYWJsZUlzc3VlcktpdCIsIm1ha2VJc3N1ZXJLaXQiLCJwcmVwYXJlSXNzdWVyS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydCxhc3NlcnRQYXR0ZXJuLG1ha2VTY2FsYXJCaWdNYXBTdG9yZSxBc3NldEtpbmQsYXNzZXJ0QXNzZXRLaW5kLGNvZXJjZURpc3BsYXlJbmZvLHByZXBhcmVQYXltZW50TGVkZ2VyOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJhc3NlcnRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJhc3NlcnRQYXR0ZXJuXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIm1ha2VTY2FsYXJCaWdNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhckJpZ01hcFN0b3JlID0gJGjigI1fYSldXV1dLFtcIi4vYW1vdW50TWF0aC5qc1wiLCBbW1wiQXNzZXRLaW5kXCIsIFskaOKAjV9hID0+IChBc3NldEtpbmQgPSAkaOKAjV9hKV1dLFtcImFzc2VydEFzc2V0S2luZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0QXNzZXRLaW5kID0gJGjigI1fYSldXV1dLFtcIi4vZGlzcGxheUluZm8uanNcIiwgW1tcImNvZXJjZURpc3BsYXlJbmZvXCIsIFskaOKAjV9hID0+IChjb2VyY2VEaXNwbGF5SW5mbyA9ICRo4oCNX2EpXV1dXSxbXCIuL3BheW1lbnRMZWRnZXIuanNcIiwgW1tcInByZXBhcmVQYXltZW50TGVkZ2VyXCIsIFskaOKAjV9hID0+IChwcmVwYXJlUGF5bWVudExlZGdlciA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAYWdvcmljL3ZhdC1kYXRhJykuQmFnZ2FnZX0gQmFnZ2FnZSAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJc3N1ZXJSZWNvcmRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lXG4gKiBAcHJvcGVydHkge0t9IGFzc2V0S2luZFxuICogQHByb3BlcnR5IHtBZGRpdGlvbmFsRGlzcGxheUluZm99IGRpc3BsYXlJbmZvXG4gKiBAcHJvcGVydHkge1BhdHRlcm59IGVsZW1lbnRTaGFwZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7SXNzdWVyUmVjb3JkPEs+fSBpc3N1ZXJSZWNvcmRcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gaXNzdWVyQmFnZ2FnZVxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlfSBbb3B0U2h1dGRvd25XaXRoRmFpbHVyZV0gSWYgdGhpcyBpc3N1ZXIgZmFpbHNcbiAqIGluIHRoZSBtaWRkbGUgb2YgYW4gYXRvbWljIGFjdGlvbiAod2hpY2ggYnR3IHNob3VsZCBuZXZlciBoYXBwZW4pLCBpdFxuICogcG90ZW50aWFsbHkgbGVhdmVzIGl0cyBsZWRnZXIgaW4gYSBjb3JydXB0ZWQgc3RhdGUuIElmIHRoaXMgZnVuY3Rpb24gd2FzXG4gKiBwcm92aWRlZCwgdGhlbiB0aGUgZmFpbGVkIGF0b21pYyBhY3Rpb24gd2lsbCBjYWxsIGl0LCBzbyB0aGF0IHNvbWVcbiAqIGxhcmdlciB1bml0IG9mIGNvbXB1dGF0aW9uLCBsaWtlIHRoZSBlbmNsb3NpbmcgdmF0LCBjYW4gYmUgc2h1dGRvd25cbiAqIGJlZm9yZSBhbnl0aGluZyBlbHNlIGlzIGNvcnJ1cHRlZCBieSB0aGF0IGNvcnJ1cHRlZCBzdGF0ZS5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM0MzRcbiAqIEByZXR1cm5zIHtJc3N1ZXJLaXQ8Sz59XG4gKi9cbmNvbnN0IHNldHVwSXNzdWVyS2l0PShcbntuYW1lLGFzc2V0S2luZCxkaXNwbGF5SW5mbyxlbGVtZW50U2hhcGV9LFxuaXNzdWVyQmFnZ2FnZSxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmU9dW5kZWZpbmVkKT0+XG57XG5hc3NlcnQudHlwZW9mKG5hbWUsJ3N0cmluZycpO1xuYXNzZXJ0QXNzZXRLaW5kKGFzc2V0S2luZCk7XG5cbi8qIEFkZCBhc3NldEtpbmQgdG8gZGlzcGxheUluZm8sIG9yIG92ZXJyaWRlIGlmIHByZXNlbnQqL1xuY29uc3QgY2xlYW5EaXNwbGF5SW5mbz1jb2VyY2VEaXNwbGF5SW5mbyhkaXNwbGF5SW5mbyxhc3NldEtpbmQpO1xuaWYob3B0U2h1dGRvd25XaXRoRmFpbHVyZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnQudHlwZW9mKG9wdFNodXRkb3duV2l0aEZhaWx1cmUsJ2Z1bmN0aW9uJyk7XG4gfVxuXG5pZihlbGVtZW50U2hhcGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0UGF0dGVybihlbGVtZW50U2hhcGUpO1xuIH1cblxuLyogQXR0ZW51YXRlIHRoZSBwb3dlcmZ1bCBhdXRob3JpdHkgdG8gbWludCBhbmQgY2hhbmdlIGJhbGFuY2VzKi9cbi8qKiBAdHlwZSB7UGF5bWVudExlZGdlcjxLPn0gKi9cbi8qIEB0cy1leHBlY3QtZXJyb3IgY291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggZGlmZmVyZW50IHN1YnR5cGUgb2YgQXNzZXRLaW5kKi9cbmNvbnN0e2lzc3VlcixtaW50LGJyYW5kLG1pbnRSZWNvdmVyeVB1cnNlfT1wcmVwYXJlUGF5bWVudExlZGdlcihcbmlzc3VlckJhZ2dhZ2UsXG5uYW1lLFxuYXNzZXRLaW5kLFxuY2xlYW5EaXNwbGF5SW5mbyxcbmVsZW1lbnRTaGFwZSxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmUpO1xuXG5cbnJldHVybiBoYXJkZW4oe1xuYnJhbmQsXG5pc3N1ZXIsXG5taW50LFxubWludFJlY292ZXJ5UHVyc2UsXG5kaXNwbGF5SW5mbzpjbGVhbkRpc3BsYXlJbmZvfSk7XG5cbiB9O1xuaGFyZGVuKHNldHVwSXNzdWVyS2l0KTtcblxuLyoqIFRoZSBrZXkgYXQgd2hpY2ggdGhlIGlzc3VlciByZWNvcmQgaXMgc3RvcmVkLiAqL1xuY29uc3QgSU5TVEFOQ0VfS0VZPSdpc3N1ZXInO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGlzc3VlckJhZ2dhZ2VcbiAqIEBwYXJhbSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gW29wdFNodXRkb3duV2l0aEZhaWx1cmVdIElmIHRoaXMgaXNzdWVyIGZhaWxzXG4gKiBpbiB0aGUgbWlkZGxlIG9mIGFuIGF0b21pYyBhY3Rpb24gKHdoaWNoIGJ0dyBzaG91bGQgbmV2ZXIgaGFwcGVuKSwgaXRcbiAqIHBvdGVudGlhbGx5IGxlYXZlcyBpdHMgbGVkZ2VyIGluIGEgY29ycnVwdGVkIHN0YXRlLiBJZiB0aGlzIGZ1bmN0aW9uIHdhc1xuICogcHJvdmlkZWQsIHRoZW4gdGhlIGZhaWxlZCBhdG9taWMgYWN0aW9uIHdpbGwgY2FsbCBpdCwgc28gdGhhdCBzb21lXG4gKiBsYXJnZXIgdW5pdCBvZiBjb21wdXRhdGlvbiwgbGlrZSB0aGUgZW5jbG9zaW5nIHZhdCwgY2FuIGJlIHNodXRkb3duXG4gKiBiZWZvcmUgYW55dGhpbmcgZWxzZSBpcyBjb3JydXB0ZWQgYnkgdGhhdCBjb3JydXB0ZWQgc3RhdGUuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNDM0XG4gKiBAcmV0dXJucyB7SXNzdWVyS2l0PEs+fVxuICovXG5jb25zdCAgICAgICAgcHJlcGFyZUlzc3VlcktpdD0oXG5pc3N1ZXJCYWdnYWdlLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZT11bmRlZmluZWQpPT5cbntcbmNvbnN0IGlzc3VlclJlY29yZD1pc3N1ZXJCYWdnYWdlLmdldChJTlNUQU5DRV9LRVkpO1xucmV0dXJuIHNldHVwSXNzdWVyS2l0KGlzc3VlclJlY29yZCxpc3N1ZXJCYWdnYWdlLG9wdFNodXRkb3duV2l0aEZhaWx1cmUpO1xuIH07JGjigI1fb25jZS5wcmVwYXJlSXNzdWVyS2l0KHByZXBhcmVJc3N1ZXJLaXQpO1xuaGFyZGVuKHByZXBhcmVJc3N1ZXJLaXQpO1xuXG4vKipcbiAqIERvZXMgYmFnZ2FnZSBhbHJlYWR5IGhhdmUgYW4gaXNzdWVyIGZyb20gcHJlcGFyZUlzc3VlcktpdCgpP1xuICogVGhhdCBpczogZG9lcyBpdCBoYXZlIHRoZSByZWxldmFudCBrZXlzIGRlZmluZWQ/XG4gKlxuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKi9cbmNvbnN0ICAgICAgICBoYXNJc3N1ZXI9KGJhZ2dhZ2UpPT5iYWdnYWdlLmhhcyhJTlNUQU5DRV9LRVkpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtQYXJ0aWFsPHtlbGVtZW50U2hhcGU6IFBhdHRlcm59Pn0gSXNzdWVyT3B0aW9uc1JlY29yZFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIFRoZSBuYW1lIGJlY29tZXMgcGFydCBvZiB0aGUgYnJhbmQgaW4gYXNzZXQgZGVzY3JpcHRpb25zLlxuICogVGhlIG5hbWUgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgYW5kIGRvdWJsZS1jaGVja2luZ1xuICogYXNzdW1wdGlvbnMsIGJ1dCBzaG91bGQgbm90IGJlIHRydXN0ZWQgd3J0IGFueSBleHRlcm5hbCBuYW1lc3BhY2UuXG4gKiBGb3IgZXhhbXBsZSwgYW55b25lIGNvdWxkIGNyZWF0ZSBhIG5ldyBpc3N1ZXIga2l0IHdpdGggbmFtZSAnQlRDJywgYnV0XG4gKiBpdCBpcyBub3QgYml0Y29pbiBvciBldmVuIHJlbGF0ZWQuIEl0IGlzIG9ubHkgdGhlIG5hbWUgYWNjb3JkaW5nXG4gKiB0byB0aGF0IGlzc3VlciBhbmQgYnJhbmQuXG4gKlxuICogVGhlIGFzc2V0S2luZCB3aWxsIGJlIHVzZWQgdG8gaW1wb3J0IGEgc3BlY2lmaWMgbWF0aEhlbHBlcnNcbiAqIGZyb20gdGhlIG1hdGhIZWxwZXJzIGxpYnJhcnkuIEZvciBleGFtcGxlLCBuYXRNYXRoSGVscGVycywgdGhlXG4gKiBkZWZhdWx0LCBpcyB1c2VkIGZvciBiYXNpYyBmdW5naWJsZSB0b2tlbnMuXG4gKlxuICogIGBkaXNwbGF5SW5mb2AgZ2l2ZXMgaW5mb3JtYXRpb24gdG8gdGhlIFVJIG9uIGhvdyB0byBkaXNwbGF5IHRoZSBhbW91bnQuXG4gKlxuICogQHBhcmFtIHtCYWdnYWdlfSBpc3N1ZXJCYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtLfSBbYXNzZXRLaW5kPUFzc2V0S2luZC5OQVRdXG4gKiBAcGFyYW0ge0FkZGl0aW9uYWxEaXNwbGF5SW5mb30gW2Rpc3BsYXlJbmZvPXt9XVxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlfSBbb3B0U2h1dGRvd25XaXRoRmFpbHVyZV0gSWYgdGhpcyBpc3N1ZXIgZmFpbHNcbiAqIGluIHRoZSBtaWRkbGUgb2YgYW4gYXRvbWljIGFjdGlvbiAod2hpY2ggYnR3IHNob3VsZCBuZXZlciBoYXBwZW4pLCBpdFxuICogcG90ZW50aWFsbHkgbGVhdmVzIGl0cyBsZWRnZXIgaW4gYSBjb3JydXB0ZWQgc3RhdGUuIElmIHRoaXMgZnVuY3Rpb24gd2FzXG4gKiBwcm92aWRlZCwgdGhlbiB0aGUgZmFpbGVkIGF0b21pYyBhY3Rpb24gd2lsbCBjYWxsIGl0LCBzbyB0aGF0IHNvbWVcbiAqIGxhcmdlciB1bml0IG9mIGNvbXB1dGF0aW9uLCBsaWtlIHRoZSBlbmNsb3NpbmcgdmF0LCBjYW4gYmUgc2h1dGRvd25cbiAqIGJlZm9yZSBhbnl0aGluZyBlbHNlIGlzIGNvcnJ1cHRlZCBieSB0aGF0IGNvcnJ1cHRlZCBzdGF0ZS5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM0MzRcbiAqIEBwYXJhbSB7SXNzdWVyT3B0aW9uc1JlY29yZH0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7SXNzdWVyS2l0PEs+fVxuICovJGjigI1fb25jZS5oYXNJc3N1ZXIoaGFzSXNzdWVyKTtcbmNvbnN0ICAgICAgICBtYWtlRHVyYWJsZUlzc3VlcktpdD0oXG5pc3N1ZXJCYWdnYWdlLFxubmFtZSxcbi8qIEB0cy1leHBlY3QtZXJyb3IgSyBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIGRpZmZlcmVudCBzdWJ0eXBlIG9mIEFzc2V0S2luZCovXG5hc3NldEtpbmQ9QXNzZXRLaW5kLk5BVCxcbmRpc3BsYXlJbmZvPWhhcmRlbih7fSksXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlPXVuZGVmaW5lZCxcbntlbGVtZW50U2hhcGU9dW5kZWZpbmVkfT17fSk9Plxue1xuY29uc3QgaXNzdWVyRGF0YT1oYXJkZW4oe25hbWUsYXNzZXRLaW5kLGRpc3BsYXlJbmZvLGVsZW1lbnRTaGFwZX0pO1xuaXNzdWVyQmFnZ2FnZS5pbml0KElOU1RBTkNFX0tFWSxpc3N1ZXJEYXRhKTtcbnJldHVybiBzZXR1cElzc3VlcktpdChpc3N1ZXJEYXRhLGlzc3VlckJhZ2dhZ2Usb3B0U2h1dGRvd25XaXRoRmFpbHVyZSk7XG4gfTskaOKAjV9vbmNlLm1ha2VEdXJhYmxlSXNzdWVyS2l0KG1ha2VEdXJhYmxlSXNzdWVyS2l0KTtcbmhhcmRlbihtYWtlRHVyYWJsZUlzc3VlcktpdCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPSduYXQnXVxuICogVGhlIG5hbWUgYmVjb21lcyBwYXJ0IG9mIHRoZSBicmFuZCBpbiBhc3NldCBkZXNjcmlwdGlvbnMuXG4gKiBUaGUgbmFtZSBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZyBhbmQgZG91YmxlLWNoZWNraW5nXG4gKiBhc3N1bXB0aW9ucywgYnV0IHNob3VsZCBub3QgYmUgdHJ1c3RlZCB3cnQgYW55IGV4dGVybmFsIG5hbWVzcGFjZS5cbiAqIEZvciBleGFtcGxlLCBhbnlvbmUgY291bGQgY3JlYXRlIGEgbmV3IGlzc3VlciBraXQgd2l0aCBuYW1lICdCVEMnLCBidXRcbiAqIGl0IGlzIG5vdCBiaXRjb2luIG9yIGV2ZW4gcmVsYXRlZC4gSXQgaXMgb25seSB0aGUgbmFtZSBhY2NvcmRpbmdcbiAqIHRvIHRoYXQgaXNzdWVyIGFuZCBicmFuZC5cbiAqXG4gKiBUaGUgYXNzZXRLaW5kIHdpbGwgYmUgdXNlZCB0byBpbXBvcnQgYSBzcGVjaWZpYyBtYXRoSGVscGVyc1xuICogZnJvbSB0aGUgbWF0aEhlbHBlcnMgbGlicmFyeS4gRm9yIGV4YW1wbGUsIG5hdE1hdGhIZWxwZXJzLCB0aGVcbiAqIGRlZmF1bHQsIGlzIHVzZWQgZm9yIGJhc2ljIGZ1bmdpYmxlIHRva2Vucy5cbiAqXG4gKiAgYGRpc3BsYXlJbmZvYCBnaXZlcyBpbmZvcm1hdGlvbiB0byB0aGUgVUkgb24gaG93IHRvIGRpc3BsYXkgdGhlIGFtb3VudC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtLfSBbYXNzZXRLaW5kPSduYXQnXVxuICogQHBhcmFtIHtBZGRpdGlvbmFsRGlzcGxheUluZm99IFtkaXNwbGF5SW5mbz17fV1cbiAqIEBwYXJhbSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gW29wdFNodXRkb3duV2l0aEZhaWx1cmVdIElmIHRoaXMgaXNzdWVyIGZhaWxzXG4gKiBpbiB0aGUgbWlkZGxlIG9mIGFuIGF0b21pYyBhY3Rpb24gKHdoaWNoIGJ0dyBzaG91bGQgbmV2ZXIgaGFwcGVuKSwgaXRcbiAqIHBvdGVudGlhbGx5IGxlYXZlcyBpdHMgbGVkZ2VyIGluIGEgY29ycnVwdGVkIHN0YXRlLiBJZiB0aGlzIGZ1bmN0aW9uIHdhc1xuICogcHJvdmlkZWQsIHRoZW4gdGhlIGZhaWxlZCBhdG9taWMgYWN0aW9uIHdpbGwgY2FsbCBpdCwgc28gdGhhdCBzb21lXG4gKiBsYXJnZXIgdW5pdCBvZiBjb21wdXRhdGlvbiwgbGlrZSB0aGUgZW5jbG9zaW5nIHZhdCwgY2FuIGJlIHNodXRkb3duXG4gKiBiZWZvcmUgYW55dGhpbmcgZWxzZSBpcyBjb3JydXB0ZWQgYnkgdGhhdCBjb3JydXB0ZWQgc3RhdGUuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNDM0XG4gKiBAcGFyYW0ge0lzc3Vlck9wdGlvbnNSZWNvcmR9IFtvcHRpb25zXVxuICogQHJldHVybnMge0lzc3VlcktpdDxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VJc3N1ZXJLaXQ9KFxubmFtZSxcbi8qIEB0cy1leHBlY3QtZXJyb3IgSyBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIGRpZmZlcmVudCBzdWJ0eXBlIG9mIEFzc2V0S2luZCovXG5hc3NldEtpbmQ9QXNzZXRLaW5kLk5BVCxcbmRpc3BsYXlJbmZvPWhhcmRlbih7fSksXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlPXVuZGVmaW5lZCxcbntlbGVtZW50U2hhcGU9dW5kZWZpbmVkfT17fSk9PlxuXG5tYWtlRHVyYWJsZUlzc3VlcktpdChcbm1ha2VTY2FsYXJCaWdNYXBTdG9yZSgnZHJvcHBlZCBpc3N1ZXIga2l0Jyx7ZHVyYWJsZTp0cnVlfSksXG5uYW1lLFxuYXNzZXRLaW5kLFxuZGlzcGxheUluZm8sXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlLFxue2VsZW1lbnRTaGFwZX0pOyRo4oCNX29uY2UubWFrZUlzc3VlcktpdChtYWtlSXNzdWVyS2l0KTtcblxuaGFyZGVuKG1ha2VJc3N1ZXJLaXQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InByZXBhcmVJc3N1ZXJLaXQiOlsicHJlcGFyZUlzc3VlcktpdCJdLCJoYXNJc3N1ZXIiOlsiaGFzSXNzdWVyIl0sIm1ha2VEdXJhYmxlSXNzdWVyS2l0IjpbIm1ha2VEdXJhYmxlSXNzdWVyS2l0Il0sIm1ha2VJc3N1ZXJLaXQiOlsibWFrZUlzc3VlcktpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADXKJqd/Q8AAP0PAAAyAAAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL2xlZ2FjeS1wYXltZW50LWhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi9hbW91bnRNYXRoLmpzIiwiQGFnb3JpYy9zdG9yZSIsIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbImNsYWltIiwiY29tYmluZSIsInNwbGl0Iiwic3BsaXRNYW55Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG11c3RNYXRjaCxFLEFtb3VudE1hdGg7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIi4vYW1vdW50TWF0aC5qc1wiLCBbW1wiQW1vdW50TWF0aFwiLCBbJGjigI1fYSA9PiAoQW1vdW50TWF0aCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuXG4vKiBUaGlzIGZpbGUgY29udGFpbnMgc2FmZXIgaGVscGVyIGZ1bmN0aW9uIGFsdGVybmF0aXZlcyB0byB0aGUqL1xuLyogc2ltaWxhcmx5IG5hbWVkIG1ldGhvZHMgb24gaXNzdWVyLiovXG4vKiBUaGVzZSBhcmUgcGFyYW1ldGVyaXplZCBieSBhIHB1cnNlLiBBbnkgcGF5bWVudHMgY3JlYXRlZCBieSB0aGVzZSovXG4vKiBoZWxwZXIgZnVuY3Rpb25zIGFyZSBpbiB0aGUgcmVjb3Zlcnkgc2V0IG9mIHRoYXQgcHVyc2UgdW50aWwgb3RoZXJ3aXNlKi9cbi8qIHVzZWQgdXAuKi9cbi8qKi9cbi8qIE9uZSBvZiB0aGVzZSBoZWxwZXIgZnVuY3Rpb25zIGlzIGxlc3Mgc2FmZSBpbiBvbmUgd2F5OiovXG4vKiBgY29tYmluZWAgaXMgbm90IGZhaWx1cmUgYXRvbWljLiBJZiB0aGUgYGNvbWJpbmVgIGhlbHBlciBmdW5jdGlvbiovXG4vKiBmYWlscywgc29tZSBvZiB0aGUgaW5wdXQgcGF5bWVudHMgbWF5IGhhdmUgYmVlbiB1c2VkIHVwLiBIb3dldmVyLCBldmVuKi9cbi8qIGluIHRoYXQgY2FzZSwgbm8gYXNzZXRzIHdvdWxkIGJlIGxvc3QuIFRoZSBhc3NldHMgZnJvbSB0aGUgdXNlZCB1cCBwYXltZW50cyovXG4vKiB3aWxsIGJlIGluIHRoZSBhcmd1bWVudCBwdXJzZS4qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0VSZWY8UHVyc2U8Sz4+fSBwdXJzZVxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ8Sz4+fSBzcmNQYXltZW50UFxuICogQHBhcmFtIHtQYXR0ZXJufSBbb3B0QW1vdW50U2hhcGVdXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxQYXltZW50PEs+Pn1cbiAqL1xuY29uc3QgICAgICAgIGNsYWltPWFzeW5jKHB1cnNlLHNyY1BheW1lbnRQLG9wdEFtb3VudFNoYXBlPXVuZGVmaW5lZCk9PntcbmNvbnN0IHNyY1BheW1lbnQ9YXdhaXQgc3JjUGF5bWVudFA7XG5yZXR1cm4gRS53aGVuKEUocHVyc2UpLmRlcG9zaXQoc3JjUGF5bWVudCxvcHRBbW91bnRTaGFwZSksKGFtb3VudCk9PlxuRShwdXJzZSkud2l0aGRyYXcoYW1vdW50KSk7XG5cbiB9OyRo4oCNX29uY2UuY2xhaW0oY2xhaW0pO1xuaGFyZGVuKGNsYWltKTtcblxuLyoqXG4gKiBOb3RlOiBOb3QgZmFpbHVyZSBhdG9taWMuIElmIGFueSBvZiB0aGUgZGVwb3NpdHMgZmFpbCwgb3IgdGhlIHRvdGFsIGRvZXMgbm90XG4gKiBtYXRjaCBvcHRUb3RhbEFtb3VudCwgc29tZSBwYXltZW50cyBtYXkgc3RpbGwgaGF2ZSBiZWVuIGRlcG9zaXRlZC5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtFUmVmPFB1cnNlPEs+Pn0gcHVyc2VcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50PEs+PltdfSBzcmNQYXltZW50c1BzXG4gKiBAcGFyYW0ge1BhdHRlcm59IFtvcHRUb3RhbEFtb3VudF1cbiAqIEByZXR1cm5zIHtQcm9taXNlPFBheW1lbnQ8Sz4+fVxuICovXG5jb25zdCAgICAgICAgY29tYmluZT1hc3luYyhcbnB1cnNlLFxuc3JjUGF5bWVudHNQcyxcbm9wdFRvdGFsQW1vdW50PXVuZGVmaW5lZCk9Plxue1xuY29uc3RbYnJhbmQsZGlzcGxheUluZm8sLi4uc3JjUGF5bWVudHNdPWF3YWl0IFByb21pc2UuYWxsKFtcbkUocHVyc2UpLmdldEFsbGVnZWRCcmFuZCgpLFxuRShFKHB1cnNlKS5nZXRBbGxlZ2VkQnJhbmQoKSkuZ2V0RGlzcGxheUluZm8oKSxcbi4uLnNyY1BheW1lbnRzUHNdKTtcblxuY29uc3QgZW1wdHlBbW91bnQ9QW1vdW50TWF0aC5tYWtlRW1wdHkoYnJhbmQsZGlzcGxheUluZm8uYXNzZXRLaW5kKTtcbmNvbnN0IGFtb3VudFBzPXNyY1BheW1lbnRzLm1hcCgoc3JjUGF5bWVudCk9PkUocHVyc2UpLmRlcG9zaXQoc3JjUGF5bWVudCkpO1xuY29uc3QgYW1vdW50cz1hd2FpdCBQcm9taXNlLmFsbChhbW91bnRQcyk7XG5jb25zdCB0b3RhbD1hbW91bnRzLnJlZHVjZShcbih4LHkpPT5BbW91bnRNYXRoLmFkZCh4LHksYnJhbmQpLFxuZW1wdHlBbW91bnQpO1xuXG5pZihvcHRUb3RhbEFtb3VudCE9PXVuZGVmaW5lZCl7XG5tdXN0TWF0Y2godG90YWwsb3B0VG90YWxBbW91bnQsJ2Ftb3VudCcpO1xuIH1cbnJldHVybiBFKHB1cnNlKS53aXRoZHJhdyh0b3RhbCk7XG4gfTskaOKAjV9vbmNlLmNvbWJpbmUoY29tYmluZSk7XG5oYXJkZW4oY29tYmluZSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7RVJlZjxQdXJzZTxLPj59IHB1cnNlXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudDxLPj59IHNyY1BheW1lbnRQXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcGF5bWVudEFtb3VudEFcbiAqIEByZXR1cm5zIHtQcm9taXNlPFBheW1lbnQ8Sz5bXT59XG4gKi9cbmNvbnN0ICAgICAgICBzcGxpdD1hc3luYyhwdXJzZSxzcmNQYXltZW50UCxwYXltZW50QW1vdW50QSk9PntcbmNvbnN0IHNyY1BheW1lbnQ9YXdhaXQgc3JjUGF5bWVudFA7XG5jb25zdCBzcmNBbW91bnQ9YXdhaXQgRShwdXJzZSkuZGVwb3NpdChzcmNQYXltZW50KTtcbmNvbnN0IHBheW1lbnRBbW91bnRCPUFtb3VudE1hdGguc3VidHJhY3Qoc3JjQW1vdW50LHBheW1lbnRBbW91bnRBKTtcbnJldHVybiBQcm9taXNlLmFsbChbXG5FKHB1cnNlKS53aXRoZHJhdyhwYXltZW50QW1vdW50QSksXG5FKHB1cnNlKS53aXRoZHJhdyhwYXltZW50QW1vdW50QildKTtcblxuIH07JGjigI1fb25jZS5zcGxpdChzcGxpdCk7XG5oYXJkZW4oc3BsaXQpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0VSZWY8UHVyc2U8Sz4+fSBwdXJzZVxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ8Sz4+fSBzcmNQYXltZW50UFxuICogQHBhcmFtIHtBbW91bnQ8Sz5bXX0gYW1vdW50c1xuICogQHJldHVybnMge1Byb21pc2U8UGF5bWVudFtdPn1cbiAqL1xuY29uc3QgICAgICAgIHNwbGl0TWFueT1hc3luYyhwdXJzZSxzcmNQYXltZW50UCxhbW91bnRzKT0+e1xuY29uc3Qgc3JjUGF5bWVudD1hd2FpdCBzcmNQYXltZW50UDtcbmNvbnN0IHNyY0Ftb3VudD1hd2FpdCBFKHB1cnNlKS5kZXBvc2l0KHNyY1BheW1lbnQpO1xuY29uc3QgYnJhbmQ9c3JjQW1vdW50LmJyYW5kO1xuY29uc3QgZW1wdHlBbW91bnQ9QW1vdW50TWF0aC5tYWtlRW1wdHlGcm9tQW1vdW50KHNyY0Ftb3VudCk7XG5jb25zdCB0b3RhbD1hbW91bnRzLnJlZHVjZShcbih4LHkpPT5BbW91bnRNYXRoLmFkZCh4LHksYnJhbmQpLFxuZW1wdHlBbW91bnQpO1xuXG5BbW91bnRNYXRoLmlzRXF1YWwoc3JjQW1vdW50LHRvdGFsKXx8XG5GYWlsIGByaWdodHMgd2VyZSBub3QgY29uc2VydmVkOiAke3RvdGFsfSB2cyAke3NyY0Ftb3VudH1gO1xuXG5yZXR1cm4gUHJvbWlzZS5hbGwoYW1vdW50cy5tYXAoKGFtb3VudCk9PkUocHVyc2UpLndpdGhkcmF3KGFtb3VudCkpKTtcbiB9OyRo4oCNX29uY2Uuc3BsaXRNYW55KHNwbGl0TWFueSk7XG5oYXJkZW4oc3BsaXRNYW55KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjbGFpbSI6WyJjbGFpbSJdLCJjb21iaW5lIjpbImNvbWJpbmUiXSwic3BsaXQiOlsic3BsaXQiXSwic3BsaXRNYW55IjpbInNwbGl0TWFueSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAxCcSIpAUAAKQFAAA6AAAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qc3siaW1wb3J0cyI6WyIuLi90eXBlcy1hbWJpZW50LmpzIiwiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbImNvcHlCYWdNYXRoSGVscGVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBrZXlFUSxtYWtlQ29weUJhZyxtdXN0TWF0Y2gsTSxnZXRDb3B5QmFnRW50cmllcyxiYWdJc1N1cGVyYmFnLGJhZ1VuaW9uLGJhZ0Rpc2pvaW50U3VidHJhY3Q7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wia2V5RVFcIiwgWyRo4oCNX2EgPT4gKGtleUVRID0gJGjigI1fYSldXSxbXCJtYWtlQ29weUJhZ1wiLCBbJGjigI1fYSA9PiAobWFrZUNvcHlCYWcgPSAkaOKAjV9hKV1dLFtcIm11c3RNYXRjaFwiLCBbJGjigI1fYSA9PiAobXVzdE1hdGNoID0gJGjigI1fYSldXSxbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXSxbXCJnZXRDb3B5QmFnRW50cmllc1wiLCBbJGjigI1fYSA9PiAoZ2V0Q29weUJhZ0VudHJpZXMgPSAkaOKAjV9hKV1dLFtcImJhZ0lzU3VwZXJiYWdcIiwgWyRo4oCNX2EgPT4gKGJhZ0lzU3VwZXJiYWcgPSAkaOKAjV9hKV1dLFtcImJhZ1VuaW9uXCIsIFskaOKAjV9hID0+IChiYWdVbmlvbiA9ICRo4oCNX2EpXV0sW1wiYmFnRGlzam9pbnRTdWJ0cmFjdFwiLCBbJGjigI1fYSA9PiAoYmFnRGlzam9pbnRTdWJ0cmFjdCA9ICRo4oCNX2EpXV1dXSxbXCIuLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZSB7Q29weUJhZ1ZhbHVlfSAqL1xuY29uc3QgZW1wdHk9bWFrZUNvcHlCYWcoW10pO1xuXG4vKipcbiAqIEB0eXBlIHtNYXRoSGVscGVyczxDb3B5QmFnVmFsdWU+fVxuICovXG5jb25zdCAgICAgICAgY29weUJhZ01hdGhIZWxwZXJzPWhhcmRlbih7XG5kb0NvZXJjZTooYmFnKT0+e1xubXVzdE1hdGNoKGJhZyxNLmJhZygpLCdiYWcgb2YgYW1vdW50Jyk7XG5yZXR1cm4gYmFnO1xuIH0sXG5kb01ha2VFbXB0eTooKT0+ZW1wdHksXG5kb0lzRW1wdHk6KGJhZyk9PmdldENvcHlCYWdFbnRyaWVzKGJhZykubGVuZ3RoPT09MCxcbmRvSXNHVEU6YmFnSXNTdXBlcmJhZyxcbmRvSXNFcXVhbDprZXlFUSxcbmRvQWRkOmJhZ1VuaW9uLFxuZG9TdWJ0cmFjdDpiYWdEaXNqb2ludFN1YnRyYWN0fSk7JGjigI1fb25jZS5jb3B5QmFnTWF0aEhlbHBlcnMoY29weUJhZ01hdGhIZWxwZXJzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjb3B5QmFnTWF0aEhlbHBlcnMiOlsiY29weUJhZ01hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJ2fiM6xBQAAsQUAADoAAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIi4uL3R5cGVzLWFtYmllbnQuanMiLCJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiY29weVNldE1hdGhIZWxwZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGtleUVRLG1ha2VDb3B5U2V0LG11c3RNYXRjaCxNLGdldENvcHlTZXRLZXlzLHNldElzU3VwZXJzZXQsc2V0RGlzam9pbnRVbmlvbixzZXREaXNqb2ludFN1YnRyYWN0OyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImtleUVRXCIsIFskaOKAjV9hID0+IChrZXlFUSA9ICRo4oCNX2EpXV0sW1wibWFrZUNvcHlTZXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VDb3B5U2V0ID0gJGjigI1fYSldXSxbXCJtdXN0TWF0Y2hcIiwgWyRo4oCNX2EgPT4gKG11c3RNYXRjaCA9ICRo4oCNX2EpXV0sW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV0sW1wiZ2V0Q29weVNldEtleXNcIiwgWyRo4oCNX2EgPT4gKGdldENvcHlTZXRLZXlzID0gJGjigI1fYSldXSxbXCJzZXRJc1N1cGVyc2V0XCIsIFskaOKAjV9hID0+IChzZXRJc1N1cGVyc2V0ID0gJGjigI1fYSldXSxbXCJzZXREaXNqb2ludFVuaW9uXCIsIFskaOKAjV9hID0+IChzZXREaXNqb2ludFVuaW9uID0gJGjigI1fYSldXSxbXCJzZXREaXNqb2ludFN1YnRyYWN0XCIsIFskaOKAjV9hID0+IChzZXREaXNqb2ludFN1YnRyYWN0ID0gJGjigI1fYSldXV1dLFtcIi4uL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlIHtDb3B5U2V0VmFsdWV9ICovXG5jb25zdCBlbXB0eT1tYWtlQ29weVNldChbXSk7XG5cbi8qKlxuICogQHR5cGUge0NvcHlTZXRNYXRoSGVscGVyc31cbiAqL1xuY29uc3QgICAgICAgIGNvcHlTZXRNYXRoSGVscGVycz1oYXJkZW4oe1xuZG9Db2VyY2U6KHNldCk9Pntcbm11c3RNYXRjaChzZXQsTS5zZXQoKSwnc2V0IG9mIGFtb3VudCcpO1xucmV0dXJuIHNldDtcbiB9LFxuZG9NYWtlRW1wdHk6KCk9PmVtcHR5LFxuZG9Jc0VtcHR5OihzZXQpPT5nZXRDb3B5U2V0S2V5cyhzZXQpLmxlbmd0aD09PTAsXG5kb0lzR1RFOnNldElzU3VwZXJzZXQsXG5kb0lzRXF1YWw6a2V5RVEsXG5kb0FkZDpzZXREaXNqb2ludFVuaW9uLFxuZG9TdWJ0cmFjdDpzZXREaXNqb2ludFN1YnRyYWN0fSk7JGjigI1fb25jZS5jb3B5U2V0TWF0aEhlbHBlcnMoY29weVNldE1hdGhIZWxwZXJzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjb3B5U2V0TWF0aEhlbHBlcnMiOlsiY29weVNldE1hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALYs5KAPBgAADwYAADYAAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi4vdHlwZXMtYW1iaWVudC5qcyIsIkBlbmRvL25hdCJdLCJleHBvcnRzIjpbIm5hdE1hdGhIZWxwZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE5hdCxpc05hdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLCBbJGjigI1fYSA9PiAoTmF0ID0gJGjigI1fYSldXSxbXCJpc05hdFwiLCBbJGjigI1fYSA9PiAoaXNOYXQgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cbmNvbnN0e0ZhaWx9PWFzc2VydDtcbmNvbnN0IGVtcHR5PTBuO1xuXG4vKipcbiAqIEZ1bmdpYmxlIGRpZ2l0YWwgYXNzZXRzIHVzZSB0aGUgbmF0TWF0aEhlbHBlcnMgdG8gbWFuYWdlIGJhbGFuY2VzIC1cbiAqIHRoZSBvcGVyYXRpb25zIGFyZSBtZXJlbHkgYXJpdGhtZXRpYyBvbiBuYXR1cmFsLCBub24tbmVnYXRpdmVcbiAqIG51bWJlcnMuXG4gKlxuICogTmF0dXJhbCBudW1iZXJzIGFyZSB1c2VkIGZvciBmdW5naWJsZSBlcmlnaHRzIHN1Y2ggYXMgbW9uZXkgYmVjYXVzZVxuICogcm91bmRpbmcgaXNzdWVzIG1ha2UgZmxvYXRzIHByb2JsZW1hdGljLiBBbGwgb3BlcmF0aW9ucyBzaG91bGQgYmVcbiAqIGRvbmUgd2l0aCB0aGUgc21hbGxlc3Qgd2hvbGUgdW5pdCBzdWNoIHRoYXQgdGhlIE5hdE1hdGhIZWxwZXJzIG5ldmVyXG4gKiBkZWFscyB3aXRoIGZyYWN0aW9uYWwgcGFydHMuXG4gKlxuICogQHR5cGUge01hdGhIZWxwZXJzPE5hdFZhbHVlPn1cbiAqL1xuY29uc3QgICAgICAgIG5hdE1hdGhIZWxwZXJzPWhhcmRlbih7XG5kb0NvZXJjZToobmF0KT0+e1xuLyogVE9ETzogdGlnaHRlbiB0aGUgZGVmaW5pdGlvbiBvZiBOYXQgaW4gQGFnb3JpYy9uYXQgdG8gdGhyb3cgb24gYG51bWJlcmAqL1xuYXNzZXJ0LnR5cGVvZihuYXQsJ2JpZ2ludCcpO1xuaXNOYXQobmF0KXx8RmFpbCBgdmFsdWUgJHtuYXR9IG11c3QgYmUgYSBuYXR1cmFsIG51bWJlcmA7XG5yZXR1cm4gTmF0KG5hdCk7XG4gfSxcbmRvTWFrZUVtcHR5OigpPT5lbXB0eSxcbmRvSXNFbXB0eToobmF0KT0+bmF0PT09ZW1wdHksXG5kb0lzR1RFOihsZWZ0LHJpZ2h0KT0+bGVmdD49cmlnaHQsXG5kb0lzRXF1YWw6KGxlZnQscmlnaHQpPT5sZWZ0PT09cmlnaHQsXG4vKiBCaWdJbnRzIGRvbid0IG9ic2VydmFibHkgb3ZlcmZsb3cqL1xuZG9BZGQ6KGxlZnQscmlnaHQpPT5sZWZ0K3JpZ2h0LFxuZG9TdWJ0cmFjdDoobGVmdCxyaWdodCk9Pk5hdChsZWZ0LXJpZ2h0KX0pOyRo4oCNX29uY2UubmF0TWF0aEhlbHBlcnMobmF0TWF0aEhlbHBlcnMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im5hdE1hdGhIZWxwZXJzIjpbIm5hdE1hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJGAua5/BwAAfwcAADYAAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi4vdHlwZXMtYW1iaWVudC5qcyIsIkBhZ29yaWMvc3RvcmUiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsic2V0TWF0aEhlbHBlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFzc1N0eWxlT2YsYXNzZXJ0S2V5LGVsZW1lbnRzSXNTdXBlcnNldCxlbGVtZW50c0Rpc2pvaW50VW5pb24sZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0LGNvZXJjZVRvRWxlbWVudHMsZWxlbWVudHNDb21wYXJlOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJhc3NlcnRLZXlcIiwgWyRo4oCNX2EgPT4gKGFzc2VydEtleSA9ICRo4oCNX2EpXV0sW1wiZWxlbWVudHNJc1N1cGVyc2V0XCIsIFskaOKAjV9hID0+IChlbGVtZW50c0lzU3VwZXJzZXQgPSAkaOKAjV9hKV1dLFtcImVsZW1lbnRzRGlzam9pbnRVbmlvblwiLCBbJGjigI1fYSA9PiAoZWxlbWVudHNEaXNqb2ludFVuaW9uID0gJGjigI1fYSldXSxbXCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3RcIiwgWyRo4oCNX2EgPT4gKGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCA9ICRo4oCNX2EpXV0sW1wiY29lcmNlVG9FbGVtZW50c1wiLCBbJGjigI1fYSA9PiAoY29lcmNlVG9FbGVtZW50cyA9ICRo4oCNX2EpXV0sW1wiZWxlbWVudHNDb21wYXJlXCIsIFskaOKAjV9hID0+IChlbGVtZW50c0NvbXBhcmUgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuLyogT3BlcmF0aW9ucyBmb3IgYXJyYXlzIHdpdGggdW5pcXVlIG9iamVjdHMgaWRlbnRpZnlpbmcgYW5kIHByb3ZpZGluZyovXG4vKiBpbmZvcm1hdGlvbiBhYm91dCBkaWdpdGFsIGFzc2V0cy4gVXNlZCBmb3IgWm9lIGludml0ZXMuKi9cbi8qKiBAdHlwZSB7U2V0VmFsdWV9ICovXG5jb25zdCBlbXB0eT1oYXJkZW4oW10pO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFJlcGxhY2UgYXJyYXktYmFzZWQgU2V0TWF0aCB3aXRoIENvcHlTZXQtYmFzZWQgQ29weVNldE1hdGhcbiAqIEB0eXBlIHtTZXRNYXRoSGVscGVyc31cbiAqL1xuY29uc3QgICAgICAgIHNldE1hdGhIZWxwZXJzPWhhcmRlbih7XG5kb0NvZXJjZToobGlzdCk9Pntcbmxpc3Q9Y29lcmNlVG9FbGVtZW50cyhsaXN0KTtcbi8qIEFzc2VydCB0aGF0IGxpc3QgY29udGFpbnMgb25seSovXG4vKiAqIHBhc3MtYnktY29weSBwcmltaXRpdmVzLCovXG4vKiAqIHBhc3MtYnktY29weSBjb250YWluZXJzIGNvbnRhaW5pbmcga2V5cywqL1xuLyogKiByZW1vdGFibGVzLiovXG5hc3NlcnRLZXkobGlzdCk7XG5yZXR1cm4gbGlzdDtcbiB9LFxuZG9NYWtlRW1wdHk6KCk9PmVtcHR5LFxuZG9Jc0VtcHR5OihsaXN0KT0+cGFzc1N0eWxlT2YobGlzdCk9PT0nY29weUFycmF5JyYmbGlzdC5sZW5ndGg9PT0wLFxuZG9Jc0dURTplbGVtZW50c0lzU3VwZXJzZXQsXG5kb0lzRXF1YWw6KHgseSk9PmVsZW1lbnRzQ29tcGFyZSh4LHkpPT09MCxcbmRvQWRkOmVsZW1lbnRzRGlzam9pbnRVbmlvbixcbmRvU3VidHJhY3Q6ZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0fSk7JGjigI1fb25jZS5zZXRNYXRoSGVscGVycyhzZXRNYXRoSGVscGVycyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic2V0TWF0aEhlbHBlcnMiOlsic2V0TWF0aEhlbHBlcnMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAACwjSFIwEAACMBAAAIwAAAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9wYXltZW50LmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIl0sImV4cG9ydHMiOlsicHJlcGFyZVBheW1lbnRLaW5kIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGluaXRFbXB0eSxwcmVwYXJlRXhvQ2xhc3M7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiaW5pdEVtcHR5XCIsIFskaOKAjV9hID0+IChpbml0RW1wdHkgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wicHJlcGFyZUV4b0NsYXNzXCIsIFskaOKAjV9hID0+IChwcmVwYXJlRXhvQ2xhc3MgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEnKS5CYWdnYWdlfSBCYWdnYWdlICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gaXNzdWVyQmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IGJyYW5kXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkfSBQYXltZW50SVxuICogQHJldHVybnMgeygpID0+IFBheW1lbnQ8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBwcmVwYXJlUGF5bWVudEtpbmQ9KGlzc3VlckJhZ2dhZ2UsbmFtZSxicmFuZCxQYXltZW50SSk9PntcbmNvbnN0IG1ha2VQYXltZW50PXByZXBhcmVFeG9DbGFzcyhcbmlzc3VlckJhZ2dhZ2UsXG4gYCR7bmFtZX0gcGF5bWVudGAsXG5QYXltZW50SSxcbmluaXRFbXB0eSxcbntcbmdldEFsbGVnZWRCcmFuZCgpe1xucmV0dXJuIGJyYW5kO1xuIH19KTtcblxuXG5yZXR1cm4gbWFrZVBheW1lbnQ7XG4gfTskaOKAjV9vbmNlLnByZXBhcmVQYXltZW50S2luZChwcmVwYXJlUGF5bWVudEtpbmQpO1xuaGFyZGVuKHByZXBhcmVQYXltZW50S2luZCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZVBheW1lbnRLaW5kIjpbInByZXBhcmVQYXltZW50S2luZCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABBSduYCT4AAAk+AAApAAAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL3BheW1lbnRMZWRnZXIuanN7ImltcG9ydHMiOlsiLi9hbW91bnRNYXRoLmpzIiwiLi9sZWdhY3ktcGF5bWVudC1oZWxwZXJzLmpzIiwiLi9wYXltZW50LmpzIiwiLi9wdXJzZS5qcyIsIi4vdHlwZUd1YXJkcy5qcyIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3N0b3JlL2V4cG9ydGVkLmpzIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsicHJlcGFyZVBheW1lbnRMZWRnZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaXNQcm9taXNlLG11c3RNYXRjaCxNLGtleUVRLHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlLHByZXBhcmVFeG8scHJvdmlkZSxBbW91bnRNYXRoLHByZXBhcmVQYXltZW50S2luZCxwcmVwYXJlUHVyc2VLaW5kLEJyYW5kSSxtYWtlSXNzdWVySW50ZXJmYWNlcyxjbGFpbSxjb21iaW5lLHNwbGl0LHNwbGl0TWFueTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsIFskaOKAjV9hID0+IChpc1Byb21pc2UgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dLFtcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dLFtcImtleUVRXCIsIFskaOKAjV9hID0+IChrZXlFUSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUgPSAkaOKAjV9hKV1dLFtcInByZXBhcmVFeG9cIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVFeG8gPSAkaOKAjV9hKV1dLFtcInByb3ZpZGVcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGUgPSAkaOKAjV9hKV1dXV0sW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBbW91bnRNYXRoXCIsIFskaOKAjV9hID0+IChBbW91bnRNYXRoID0gJGjigI1fYSldXV1dLFtcIi4vcGF5bWVudC5qc1wiLCBbW1wicHJlcGFyZVBheW1lbnRLaW5kXCIsIFskaOKAjV9hID0+IChwcmVwYXJlUGF5bWVudEtpbmQgPSAkaOKAjV9hKV1dXV0sW1wiLi9wdXJzZS5qc1wiLCBbW1wicHJlcGFyZVB1cnNlS2luZFwiLCBbJGjigI1fYSA9PiAocHJlcGFyZVB1cnNlS2luZCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlL2V4cG9ydGVkLmpzXCIsIFtdXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIkJyYW5kSVwiLCBbJGjigI1fYSA9PiAoQnJhbmRJID0gJGjigI1fYSldXSxbXCJtYWtlSXNzdWVySW50ZXJmYWNlc1wiLCBbJGjigI1fYSA9PiAobWFrZUlzc3VlckludGVyZmFjZXMgPSAkaOKAjV9hKV1dXV0sW1wiLi9sZWdhY3ktcGF5bWVudC1oZWxwZXJzLmpzXCIsIFtbXCJjbGFpbVwiLCBbJGjigI1fYSA9PiAoY2xhaW0gPSAkaOKAjV9hKV1dLFtcImNvbWJpbmVcIiwgWyRo4oCNX2EgPT4gKGNvbWJpbmUgPSAkaOKAjV9hKV1dLFtcInNwbGl0XCIsIFskaOKAjV9hID0+IChzcGxpdCA9ICRo4oCNX2EpXV0sW1wic3BsaXRNYW55XCIsIFskaOKAjV9hID0+IChzcGxpdE1hbnkgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGFnb3JpYy92YXQtZGF0YScpLkJhZ2dhZ2V9IEJhZ2dhZ2UgKi9cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG4vKipcbiAqIEBwYXJhbSB7QnJhbmR9IGJyYW5kXG4gKiBAcGFyYW0ge0Fzc2V0S2luZH0gYXNzZXRLaW5kXG4gKiBAcGFyYW0ge01hdGNoZXJ9IGVsZW1lbnRTaGFwZVxuICovXG5jb25zdCBhbW91bnRTaGFwZUZyb21FbGVtZW50U2hhcGU9KGJyYW5kLGFzc2V0S2luZCxlbGVtZW50U2hhcGUpPT57XG5sZXQgdmFsdWVTaGFwZTtcbnN3aXRjaChhc3NldEtpbmQpe1xuY2FzZSduYXQnOntcbnZhbHVlU2hhcGU9TS5uYXQoKTtcbmVsZW1lbnRTaGFwZT09PXVuZGVmaW5lZHx8XG5GYWlsIGBGdW5naWJsZSBhc3NldHMgY2Fubm90IGhhdmUgYW4gZWxlbWVudFNoYXBlOiAke3EoZWxlbWVudFNoYXBlKX1gO1xuYnJlYWs7XG4gfVxuY2FzZSdzZXQnOntcbmlmKGVsZW1lbnRTaGFwZT09PXVuZGVmaW5lZCl7XG52YWx1ZVNoYXBlPU0uYXJyYXlPZihNLmtleSgpKTtcbiB9ZWxzZXtcbnZhbHVlU2hhcGU9TS5hcnJheU9mKE0uYW5kKE0ua2V5KCksZWxlbWVudFNoYXBlKSk7XG4gfVxuYnJlYWs7XG4gfVxuY2FzZSdjb3B5U2V0Jzp7XG5pZihlbGVtZW50U2hhcGU9PT11bmRlZmluZWQpe1xudmFsdWVTaGFwZT1NLnNldCgpO1xuIH1lbHNle1xudmFsdWVTaGFwZT1NLnNldE9mKGVsZW1lbnRTaGFwZSk7XG4gfVxuYnJlYWs7XG4gfVxuY2FzZSdjb3B5QmFnJzp7XG5pZihlbGVtZW50U2hhcGU9PT11bmRlZmluZWQpe1xudmFsdWVTaGFwZT1NLmJhZygpO1xuIH1lbHNle1xudmFsdWVTaGFwZT1NLmJhZ09mKGVsZW1lbnRTaGFwZSk7XG4gfVxuYnJlYWs7XG4gfVxuZGVmYXVsdDp7XG5GYWlsIGB1bmV4cGVjdGVkIGFzc2V0IGtpbmQgJHtxKGFzc2V0S2luZCl9YDtcbiB9fVxuXG5cbmNvbnN0IGFtb3VudFNoYXBlPWhhcmRlbih7XG5icmFuZCwvKiBtYXRjaGVzIG9ubHkgdGhpcyBleGFjdCBicmFuZCovXG52YWx1ZTp2YWx1ZVNoYXBlfSk7XG5cbnJldHVybiBhbW91bnRTaGFwZTtcbiB9O1xuXG4vKipcbiAqIE1ha2UgdGhlIHBheW1lbnRMZWRnZXIsIHRoZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHRoZSBiYWxhbmNlcyBvZlxuICogcGF5bWVudHMuIEFsbCBtaW50aW5nIGFuZCB0cmFuc2ZlciBhdXRob3JpdHkgb3JpZ2luYXRlcyBoZXJlLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGlzc3VlckJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0t9IGFzc2V0S2luZFxuICogQHBhcmFtIHtEaXNwbGF5SW5mbzxLPn0gZGlzcGxheUluZm9cbiAqIEBwYXJhbSB7UGF0dGVybn0gZWxlbWVudFNoYXBlXG4gKiBAcGFyYW0ge1NodXRkb3duV2l0aEZhaWx1cmV9IFtvcHRTaHV0ZG93bldpdGhGYWlsdXJlXVxuICogQHJldHVybnMge1BheW1lbnRMZWRnZXI8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBwcmVwYXJlUGF5bWVudExlZGdlcj0oXG5pc3N1ZXJCYWdnYWdlLFxubmFtZSxcbmFzc2V0S2luZCxcbmRpc3BsYXlJbmZvLFxuZWxlbWVudFNoYXBlLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZT11bmRlZmluZWQpPT5cbntcbi8qKiBAdHlwZSB7QnJhbmQ8Sz59ICovXG4vKiBAdHMtZXhwZWN0LWVycm9yIFhYWCBjYWxsV2hlbiovXG5jb25zdCBicmFuZD1wcmVwYXJlRXhvKGlzc3VlckJhZ2dhZ2UsIGAke25hbWV9IGJyYW5kYCxCcmFuZEkse1xuaXNNeUlzc3VlcihhbGxlZ2VkSXNzdWVyKXtcbi8qIEJyYW5kSSBkZWxheXMgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBgYWxsZWdlZElzc3VlcmAgaXMgYSBSZW1vdGFibGUqL1xucmV0dXJuIGFsbGVnZWRJc3N1ZXI9PT1pc3N1ZXI7XG4gfSxcbmdldEFsbGVnZWROYW1lKCl7XG5yZXR1cm4gbmFtZTtcbiB9LFxuLyogR2l2ZSBpbmZvcm1hdGlvbiB0byBVSSBvbiBob3cgdG8gZGlzcGxheSB0aGUgYW1vdW50LiovXG5nZXREaXNwbGF5SW5mbygpe1xucmV0dXJuIGRpc3BsYXlJbmZvO1xuIH0sXG5nZXRBbW91bnRTaGFwZSgpe1xucmV0dXJuIGFtb3VudFNoYXBlO1xuIH19KTtcblxuXG5jb25zdCBhbW91bnRTaGFwZT1hbW91bnRTaGFwZUZyb21FbGVtZW50U2hhcGUoXG5icmFuZCxcbmFzc2V0S2luZCxcbmVsZW1lbnRTaGFwZSk7XG5cblxuY29uc3R7SXNzdWVySSxNaW50SSxQYXltZW50SSxQdXJzZUlLaXR9PW1ha2VJc3N1ZXJJbnRlcmZhY2VzKFxuYnJhbmQsXG5hc3NldEtpbmQsXG5hbW91bnRTaGFwZSk7XG5cblxuY29uc3QgbWFrZVBheW1lbnQ9cHJlcGFyZVBheW1lbnRLaW5kKGlzc3VlckJhZ2dhZ2UsbmFtZSxicmFuZCxQYXltZW50SSk7XG5cbi8qKiBAdHlwZSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gKi9cbmNvbnN0IHNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmU9KHJlYXNvbik9Pntcbi8qIFRPRE8gVGhpcyBzaG91bGQgYWxzbyBkZXN0cm95IGxlZGdlciBzdGF0ZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzQzNCovXG5pZihvcHRTaHV0ZG93bldpdGhGYWlsdXJlIT09dW5kZWZpbmVkKXtcbnRyeXtcbm9wdFNodXRkb3duV2l0aEZhaWx1cmUocmVhc29uKTtcbiB9Y2F0Y2goZXJySW5TaHV0ZG93bil7XG5hc3NlcnQubm90ZShlcnJJblNodXRkb3duLFggYENhdXNlZCBieTogJHtyZWFzb259YCk7XG50aHJvdyBlcnJJblNodXRkb3duO1xuIH1cbiB9XG50aHJvdyByZWFzb247XG4gfTtcblxuLyoqIEB0eXBlIHtXZWFrTWFwU3RvcmU8UGF5bWVudCwgQW1vdW50Pn0gKi9cbmNvbnN0IHBheW1lbnRMZWRnZXI9cHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUoXG5pc3N1ZXJCYWdnYWdlLFxuJ3BheW1lbnRMZWRnZXInLFxue3ZhbHVlU2hhcGU6YW1vdW50U2hhcGV9KTtcblxuXG4vKipcbiAqIEEgd2l0aGRyYXduIGxpdmUgcGF5bWVudCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlY292ZXJ5IHNldCBvZlxuICogdGhlIHB1cnNlIGl0IHdhcyB3aXRoZHJhd24gZnJvbS4gTGV0J3MgY2FsbCB0aGVzZSBcInJlY292ZXJhYmxlXCJcbiAqIHBheW1lbnRzLiBBbGwgcmVjb3ZlcmFibGUgcGF5bWVudHMgYXJlIGxpdmUsIGJ1dCBub3QgYWxsIGxpdmVcbiAqIHBheW1lbnRzIGFyZSByZWNvdmVyYWJsZS4gV2UgZG8gdGhlIGJvb2trZWVwaW5nIGZvciBwYXltZW50IHJlY292ZXJ5XG4gKiB3aXRoIHRoaXMgd2Vha21hcCBmcm9tIHJlY292ZXJhYmxlIHBheW1lbnRzIHRvIHRoZSByZWNvdmVyeSBzZXQgdGhleSBhcmVcbiAqIGluLlxuICogQSBidW5jaCBvZiBpbnRlcmVzdGluZyBpbnZhcmlhbnRzIGhlcmU6XG4gKiAgICAqIEV2ZXJ5IHBheW1lbnQgdGhhdCBpcyBhIGtleSBpbiB0aGUgb3V0ZXIgYHBheW1lbnRSZWNvdmVyeVNldHNgXG4gKiAgICAgIHdlYWtNYXAgaXMgYWxzbyBpbiB0aGUgcmVjb3Zlcnkgc2V0IGluZGV4ZWQgYnkgdGhhdCBwYXltZW50LlxuICogICAgKiBJbXBsaWVkIGJ5IHRoZSBhYm92ZSBidXQgd29ydGggc3RhdGluZzogdGhlIHBheW1lbnQgaXMgb25seVxuICogICAgICBpbiBhdCBtb3N0IG9uZSByZWNvdmVyeSBzZXQuXG4gKiAgICAqIEEgcmVjb3Zlcnkgc2V0IG9ubHkgY29udGFpbnMgc3VjaCBwYXltZW50cy5cbiAqICAgICogRXZlcnkgcHVyc2UgaXMgYXNzb2NpYXRlZCB3aXRoIGV4YWN0bHkgb25lIHJlY292ZXJ5IHNldCB1bmlxdWUgdG9cbiAqICAgICAgaXQuXG4gKiAgICAqIEEgcHVyc2UncyByZWNvdmVyeSBzZXQgb25seSBjb250YWlucyBwYXltZW50cyB3aXRoZHJhd24gZnJvbVxuICogICAgICB0aGF0IHB1cnNlIGFuZCBub3QgeWV0IGNvbnN1bWVkLlxuICpcbiAqIEB0eXBlIHtXZWFrTWFwU3RvcmU8UGF5bWVudCwgU2V0U3RvcmU8UGF5bWVudD4+fVxuICovXG5jb25zdCBwYXltZW50UmVjb3ZlcnlTZXRzPXByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKFxuaXNzdWVyQmFnZ2FnZSxcbidwYXltZW50UmVjb3ZlcnlTZXRzJyk7XG5cblxuLyoqXG4gKiBUbyBtYWludGFpbiB0aGUgaW52YXJpYW50cyBsaXN0ZWQgaW4gdGhlIGBwYXltZW50UmVjb3ZlcnlTZXRzYCBjb21tZW50LFxuICogYGluaXRQYXltZW50YCBzaG91bGQgY29udGFpbiB0aGUgb25seVxuICogY2FsbCB0byBgcGF5bWVudExlZGdlci5pbml0YC5cbiAqXG4gKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnRcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRcbiAqIEBwYXJhbSB7U2V0U3RvcmU8UGF5bWVudD59IFtvcHRSZWNvdmVyeVNldF1cbiAqL1xuY29uc3QgaW5pdFBheW1lbnQ9KHBheW1lbnQsYW1vdW50LG9wdFJlY292ZXJ5U2V0PXVuZGVmaW5lZCk9PntcbmlmKG9wdFJlY292ZXJ5U2V0IT09dW5kZWZpbmVkKXtcbm9wdFJlY292ZXJ5U2V0LmFkZChwYXltZW50KTtcbnBheW1lbnRSZWNvdmVyeVNldHMuaW5pdChwYXltZW50LG9wdFJlY292ZXJ5U2V0KTtcbiB9XG5wYXltZW50TGVkZ2VyLmluaXQocGF5bWVudCxhbW91bnQpO1xuIH07XG5cbi8qKlxuICogVG8gbWFpbnRhaW4gdGhlIGludmFyaWFudHMgbGlzdGVkIGluIHRoZSBgcGF5bWVudFJlY292ZXJ5U2V0c2AgY29tbWVudCxcbiAqIGBkZWxldGVQYXltZW50YCBzaG91bGQgY29udGFpbiB0aGUgb25seVxuICogY2FsbCB0byBgcGF5bWVudExlZGdlci5kZWxldGVgLlxuICpcbiAqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudFxuICovXG5jb25zdCBkZWxldGVQYXltZW50PShwYXltZW50KT0+e1xucGF5bWVudExlZGdlci5kZWxldGUocGF5bWVudCk7XG5pZihwYXltZW50UmVjb3ZlcnlTZXRzLmhhcyhwYXltZW50KSl7XG5jb25zdCByZWNvdmVyeVNldD1wYXltZW50UmVjb3ZlcnlTZXRzLmdldChwYXltZW50KTtcbnBheW1lbnRSZWNvdmVyeVNldHMuZGVsZXRlKHBheW1lbnQpO1xucmVjb3ZlcnlTZXQuZGVsZXRlKHBheW1lbnQpO1xuIH1cbiB9O1xuXG4vKiogQHR5cGUgeyhsZWZ0OiBBbW91bnQsIHJpZ2h0OiBBbW91bnQpID0+IEFtb3VudCB9ICovXG5jb25zdCBhZGQ9KGxlZnQscmlnaHQpPT5BbW91bnRNYXRoLmFkZChsZWZ0LHJpZ2h0LGJyYW5kKTtcbi8qKiBAdHlwZSB7KGxlZnQ6IEFtb3VudCwgcmlnaHQ6IEFtb3VudCkgPT4gQW1vdW50IH0gKi9cbmNvbnN0IHN1YnRyYWN0PShsZWZ0LHJpZ2h0KT0+QW1vdW50TWF0aC5zdWJ0cmFjdChsZWZ0LHJpZ2h0LGJyYW5kKTtcbi8qKiBAdHlwZSB7KGFsbGVnZWRBbW91bnQ6IEFtb3VudCkgPT4gQW1vdW50fSAqL1xuY29uc3QgY29lcmNlPShhbGxlZ2VkQW1vdW50KT0+QW1vdW50TWF0aC5jb2VyY2UoYnJhbmQsYWxsZWdlZEFtb3VudCk7XG4vKiogQHR5cGUgeyhsZWZ0OiBBbW91bnQsIHJpZ2h0OiBBbW91bnQpID0+IGJvb2xlYW4gfSAqL1xuXG4vKipcbiAqIE1ldGhvZHMgbGlrZSBkZXBvc2l0KCkgaGF2ZSBhbiBvcHRpb25hbCBzZWNvbmQgcGFyYW1ldGVyXG4gKiBgb3B0QW1vdW50U2hhcGVgXG4gKiB3aGljaCwgaWYgcHJlc2VudCwgaXMgc3VwcG9zZWQgdG8gbWF0Y2ggdGhlIGJhbGFuY2Ugb2YgdGhlXG4gKiBwYXltZW50LiBUaGlzIGhlbHBlciBmdW5jdGlvbiBkb2VzIHRoYXQgY2hlY2suXG4gKlxuICogTm90ZTogYG9wdEFtb3VudFNoYXBlYCBpcyB1c2VyLXN1cHBsaWVkIHdpdGggbm8gcHJldmlvdXMgdmFsaWRhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0Ftb3VudH0gcGF5bWVudEJhbGFuY2VcbiAqIEBwYXJhbSB7UGF0dGVybn0gW29wdEFtb3VudFNoYXBlXVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0IGFzc2VydEFtb3VudENvbnNpc3RlbnQ9KHBheW1lbnRCYWxhbmNlLG9wdEFtb3VudFNoYXBlKT0+e1xuaWYob3B0QW1vdW50U2hhcGUhPT11bmRlZmluZWQpe1xubXVzdE1hdGNoKHBheW1lbnRCYWxhbmNlLG9wdEFtb3VudFNoYXBlLCdhbW91bnQnKTtcbiB9XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnRcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCBhc3NlcnRMaXZlUGF5bWVudD0ocGF5bWVudCk9PntcbnBheW1lbnRMZWRnZXIuaGFzKHBheW1lbnQpfHxcbkZhaWwgYCR7cGF5bWVudH0gd2FzIG5vdCBhIGxpdmUgcGF5bWVudCBmb3IgYnJhbmQgJHtxKFxuYnJhbmQpXG4gfS4gSXQgY291bGQgYmUgYSB1c2VkLXVwIHBheW1lbnQsIGEgcGF5bWVudCBmb3IgYW5vdGhlciBicmFuZCwgb3IgaXQgbWlnaHQgbm90IGJlIGEgcGF5bWVudCBhdCBhbGwuYDtcbiB9O1xuXG4vKipcbiAqIFVzZWQgYnkgdGhlIHB1cnNlIGNvZGUgdG8gaW1wbGVtZW50IHB1cnNlLmRlcG9zaXRcbiAqXG4gKiBAcGFyYW0ge0Ftb3VudH0gY3VycmVudEJhbGFuY2UgLSB0aGUgY3VycmVudCBiYWxhbmNlIG9mIHRoZSBwdXJzZVxuICogYmVmb3JlIGEgZGVwb3NpdFxuICogQHBhcmFtIHsobmV3UHVyc2VCYWxhbmNlOiBBbW91bnQpID0+IHZvaWR9IHVwZGF0ZVB1cnNlQmFsYW5jZSAtXG4gKiBjb21taXQgdGhlIHB1cnNlIGJhbGFuY2VcbiAqIEBwYXJhbSB7UGF5bWVudH0gc3JjUGF5bWVudFxuICogQHBhcmFtIHtQYXR0ZXJufSBbb3B0QW1vdW50U2hhcGVdXG4gKiBAcmV0dXJucyB7QW1vdW50fVxuICovXG5jb25zdCBkZXBvc2l0SW50ZXJuYWw9KFxuY3VycmVudEJhbGFuY2UsXG51cGRhdGVQdXJzZUJhbGFuY2UsXG5zcmNQYXltZW50LFxub3B0QW1vdW50U2hhcGU9dW5kZWZpbmVkKT0+XG57XG4haXNQcm9taXNlKHNyY1BheW1lbnQpfHxcbmFzc2VydC5mYWlsKFxuIGBkZXBvc2l0IGRvZXMgbm90IGFjY2VwdCBwcm9taXNlcyBhcyBmaXJzdCBhcmd1bWVudC4gSW5zdGVhZCBvZiBwYXNzaW5nIHRoZSBwcm9taXNlIChkZXBvc2l0KHBheW1lbnRQcm9taXNlKSksIGNvbnNpZGVyIHVud3JhcHBpbmcgdGhlIHByb21pc2UgZmlyc3Q6IEUud2hlbihwYXltZW50UHJvbWlzZSwgKGFjdHVhbFBheW1lbnQgPT4gZGVwb3NpdChhY3R1YWxQYXltZW50KSlgLFxuVHlwZUVycm9yKTtcblxuYXNzZXJ0TGl2ZVBheW1lbnQoc3JjUGF5bWVudCk7XG5jb25zdCBzcmNQYXltZW50QmFsYW5jZT1wYXltZW50TGVkZ2VyLmdldChzcmNQYXltZW50KTtcbmFzc2VydEFtb3VudENvbnNpc3RlbnQoc3JjUGF5bWVudEJhbGFuY2Usb3B0QW1vdW50U2hhcGUpO1xuY29uc3QgbmV3UHVyc2VCYWxhbmNlPWFkZChzcmNQYXltZW50QmFsYW5jZSxjdXJyZW50QmFsYW5jZSk7XG50cnl7XG4vKiBDT01NSVQgUE9JTlQqL1xuLyogTW92ZSB0aGUgYXNzZXRzIGluIGBzcmNQYXltZW50YCBpbnRvIHRoaXMgcHVyc2UsIHVzaW5nIHVwIHRoZSovXG4vKiBzb3VyY2UgcGF5bWVudCwgc3VjaCB0aGF0IHRvdGFsIGFzc2V0cyBhcmUgY29uc2VydmVkLiovXG5kZWxldGVQYXltZW50KHNyY1BheW1lbnQpO1xudXBkYXRlUHVyc2VCYWxhbmNlKG5ld1B1cnNlQmFsYW5jZSk7XG4gfWNhdGNoKGVycil7XG5zaHV0ZG93bkxlZGdlcldpdGhGYWlsdXJlKGVycik7XG50aHJvdyBlcnI7XG4gfVxucmV0dXJuIHNyY1BheW1lbnRCYWxhbmNlO1xuIH07XG5cbi8qKlxuICogVXNlZCBieSB0aGUgcHVyc2UgY29kZSB0byBpbXBsZW1lbnQgcHVyc2Uud2l0aGRyYXdcbiAqXG4gKiBAcGFyYW0ge0Ftb3VudH0gY3VycmVudEJhbGFuY2UgLSB0aGUgY3VycmVudCBiYWxhbmNlIG9mIHRoZSBwdXJzZVxuICogYmVmb3JlIGEgd2l0aGRyYXdhbFxuICogQHBhcmFtIHsobmV3UHVyc2VCYWxhbmNlOiBBbW91bnQpID0+IHZvaWR9IHVwZGF0ZVB1cnNlQmFsYW5jZSAtXG4gKiBjb21taXQgdGhlIHB1cnNlIGJhbGFuY2VcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnQgLSB0aGUgYW1vdW50IHRvIGJlIHdpdGhkcmF3blxuICogQHBhcmFtIHtTZXRTdG9yZTxQYXltZW50Pn0gcmVjb3ZlcnlTZXRcbiAqIEByZXR1cm5zIHtQYXltZW50fVxuICovXG5jb25zdCB3aXRoZHJhd0ludGVybmFsPShcbmN1cnJlbnRCYWxhbmNlLFxudXBkYXRlUHVyc2VCYWxhbmNlLFxuYW1vdW50LFxucmVjb3ZlcnlTZXQpPT5cbntcbmFtb3VudD1jb2VyY2UoYW1vdW50KTtcbkFtb3VudE1hdGguaXNHVEUoY3VycmVudEJhbGFuY2UsYW1vdW50KXx8XG5GYWlsIGBXaXRoZHJhd2FsIG9mICR7YW1vdW50fSBmYWlsZWQgYmVjYXVzZSB0aGUgcHVyc2Ugb25seSBjb250YWluZWQgJHtjdXJyZW50QmFsYW5jZX1gO1xuY29uc3QgbmV3UHVyc2VCYWxhbmNlPXN1YnRyYWN0KGN1cnJlbnRCYWxhbmNlLGFtb3VudCk7XG5cbmNvbnN0IHBheW1lbnQ9bWFrZVBheW1lbnQoKTtcbnRyeXtcbi8qIENPTU1JVCBQT0lOVCBNb3ZlIHRoZSB3aXRoZHJhd24gYXNzZXRzIGZyb20gdGhpcyBwdXJzZSBpbnRvKi9cbi8qIHBheW1lbnQuIFRvdGFsIGFzc2V0cyBtdXN0IHJlbWFpbiBjb25zZXJ2ZWQuKi9cbnVwZGF0ZVB1cnNlQmFsYW5jZShuZXdQdXJzZUJhbGFuY2UpO1xuaW5pdFBheW1lbnQocGF5bWVudCxhbW91bnQscmVjb3ZlcnlTZXQpO1xuIH1jYXRjaChlcnIpe1xuc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZShlcnIpO1xudGhyb3cgZXJyO1xuIH1cbnJldHVybiBwYXltZW50O1xuIH07XG5cbmNvbnN0IG1ha2VFbXB0eVB1cnNlPXByZXBhcmVQdXJzZUtpbmQoXG5pc3N1ZXJCYWdnYWdlLFxubmFtZSxcbmFzc2V0S2luZCxcbmJyYW5kLFxuUHVyc2VJS2l0LFxuaGFyZGVuKHtcbmRlcG9zaXRJbnRlcm5hbCxcbndpdGhkcmF3SW50ZXJuYWx9KSk7XG5cblxuXG4vKiogQHR5cGUge0lzc3VlcjxLPn0gKi9cbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCBkdWUgdG8gY2FsbFdoZW4gZGlzY3JlcGFuY3kqL1xuY29uc3QgaXNzdWVyPXByZXBhcmVFeG8oaXNzdWVyQmFnZ2FnZSwgYCR7bmFtZX0gaXNzdWVyYCxJc3N1ZXJJLHtcbmdldEJyYW5kKCl7XG5yZXR1cm4gYnJhbmQ7XG4gfSxcbmdldEFsbGVnZWROYW1lKCl7XG5yZXR1cm4gbmFtZTtcbiB9LFxuZ2V0QXNzZXRLaW5kKCl7XG5yZXR1cm4gYXNzZXRLaW5kO1xuIH0sXG5nZXREaXNwbGF5SW5mbygpe1xucmV0dXJuIGRpc3BsYXlJbmZvO1xuIH0sXG5tYWtlRW1wdHlQdXJzZSgpe1xucmV0dXJuIG1ha2VFbXB0eVB1cnNlKCk7XG4gfSxcbi8qKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnQgYXdhaXRlZCBieSBjYWxsV2hlbiAqL1xuaXNMaXZlKHBheW1lbnQpe1xuLyogSXNzdWVySSBkZWxheXMgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBgcGF5bWVudGAgaXMgYSBSZW1vdGFibGUqL1xucmV0dXJuIHBheW1lbnRMZWRnZXIuaGFzKHBheW1lbnQpO1xuIH0sXG4vKiogQHBhcmFtIHtQYXltZW50fSBwYXltZW50IGF3YWl0ZWQgYnkgY2FsbFdoZW4gKi9cbmdldEFtb3VudE9mKHBheW1lbnQpe1xuLyogSXNzdWVySSBkZWxheXMgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBgcGF5bWVudGAgaXMgYSBSZW1vdGFibGUqL1xuYXNzZXJ0TGl2ZVBheW1lbnQocGF5bWVudCk7XG5yZXR1cm4gcGF5bWVudExlZGdlci5nZXQocGF5bWVudCk7XG4gfSxcbi8qKlxuICogQHBhcmFtIHtQYXltZW50fSBwYXltZW50IGF3YWl0ZWQgYnkgY2FsbFdoZW5cbiAqIEBwYXJhbSB7UGF0dGVybn0gb3B0QW1vdW50U2hhcGVcbiAqL1xuYnVybihwYXltZW50LG9wdEFtb3VudFNoYXBlPXVuZGVmaW5lZCl7XG4vKiBJc3N1ZXJJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBwYXltZW50YCBpcyBhIFJlbW90YWJsZSovXG5hc3NlcnRMaXZlUGF5bWVudChwYXltZW50KTtcbmNvbnN0IHBheW1lbnRCYWxhbmNlPXBheW1lbnRMZWRnZXIuZ2V0KHBheW1lbnQpO1xuYXNzZXJ0QW1vdW50Q29uc2lzdGVudChwYXltZW50QmFsYW5jZSxvcHRBbW91bnRTaGFwZSk7XG50cnl7XG4vKiBDT01NSVQgUE9JTlQuKi9cbmRlbGV0ZVBheW1lbnQocGF5bWVudCk7XG4gfWNhdGNoKGVycil7XG5zaHV0ZG93bkxlZGdlcldpdGhGYWlsdXJlKGVycik7XG50aHJvdyBlcnI7XG4gfVxucmV0dXJuIHBheW1lbnRCYWxhbmNlO1xuIH0sXG4vKipcbiAqIEluaGVyZW50IHRvIHRoZSBuYXR1cmUgb2YgdGhlIElzc3VlciBBUEksIHRoaXMgbWV0aG9kIGlzIGxlc3Mgc2FmZVxuICogdGhhbiB0aGUgc2ltaWxhcmx5IG5hbWVkIGhlbHBlciBmdW5jdGlvbiBpbiBsZWdhY3ktcGF5bWVudC1oZWxwZXJzLmpzXG4gKiBzaW5jZSB0aG9zZSBoZWxwZXIgZnVuY3Rpb25zIHdpbGwgYXNzb2NpYXRlIGFueSBuZXdseSBjcmVhdGVkIHBheW1lbnRcbiAqIHdpdGggdGhlIHJlY292ZXJ5IHNldCBvZiB0aGUgYXJndW1lbnQgcHVyc2UuIFRoZSBtZXRob2RzIGhlcmUgYXJlXG4gKiBub3cgdHJpdmlhbCB3cmFwcGVycyBhcm91bmQgdGhvc2UgaGVscGVycywgdXNpbmcgYSBgbWFrZUVtcHR5UHVyc2UoKWBcbiAqIHRvIG1ha2UgdGhlIG5lZWRlZCBwdXJzZSwgd2hpY2ggdGhleSB1bnNhZmVseSB0aGVuIGRyb3Agb24gdGhlIGZsb29yLlxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSBoZWxwZXIgZnVuY3Rpb24gZnJvbSBsZWdhY3ktcGF5bWVudC1oZWxwZXJzLmpzXG4gKiBAcGFyYW0ge1BheW1lbnR9IHNyY1BheW1lbnQgYXdhaXRlZCBieSBjYWxsV2hlblxuICogQHBhcmFtIHtQYXR0ZXJufSBbb3B0QW1vdW50U2hhcGVdXG4gKi9cbmNsYWltKHNyY1BheW1lbnQsb3B0QW1vdW50U2hhcGU9dW5kZWZpbmVkKXtcbnJldHVybiBjbGFpbShtYWtlRW1wdHlQdXJzZSgpLHNyY1BheW1lbnQsb3B0QW1vdW50U2hhcGUpO1xuIH0sXG4vKipcbiAqIEluaGVyZW50IHRvIHRoZSBuYXR1cmUgb2YgdGhlIElzc3VlciBBUEksIHRoaXMgbWV0aG9kIGlzIGxlc3Mgc2FmZVxuICogdGhhbiB0aGUgc2ltaWxhcmx5IG5hbWVkIGhlbHBlciBmdW5jdGlvbiBpbiBsZWdhY3ktcGF5bWVudC1oZWxwZXJzLmpzXG4gKiBzaW5jZSB0aG9zZSBoZWxwZXIgZnVuY3Rpb25zIHdpbGwgYXNzb2NpYXRlIGFueSBuZXdseSBjcmVhdGVkIHBheW1lbnRcbiAqIHdpdGggdGhlIHJlY292ZXJ5IHNldCBvZiB0aGUgYXJndW1lbnQgcHVyc2UuIFRoZSBtZXRob2RzIGhlcmUgYXJlXG4gKiBub3cgdHJpdmlhbCB3cmFwcGVycyBhcm91bmQgdGhvc2UgaGVscGVycywgdXNpbmcgYSBgbWFrZUVtcHR5UHVyc2UoKWBcbiAqIHRvIG1ha2UgdGhlIG5lZWRlZCBwdXJzZSwgd2hpY2ggdGhleSB1bnNhZmVseSB0aGVuIGRyb3Agb24gdGhlIGZsb29yLlxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSBoZWxwZXIgZnVuY3Rpb24gZnJvbSBsZWdhY3ktcGF5bWVudC1oZWxwZXJzLmpzXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudD5bXX0gZnJvbVBheW1lbnRzUEFycmF5XG4gKiBAcGFyYW0ge1BhdHRlcm59IFtvcHRUb3RhbEFtb3VudF1cbiAqL1xuY29tYmluZShmcm9tUGF5bWVudHNQQXJyYXksb3B0VG90YWxBbW91bnQ9dW5kZWZpbmVkKXtcbnJldHVybiBjb21iaW5lKG1ha2VFbXB0eVB1cnNlKCksZnJvbVBheW1lbnRzUEFycmF5LG9wdFRvdGFsQW1vdW50KTtcbiB9LFxuLyoqXG4gKiBJbmhlcmVudCB0byB0aGUgbmF0dXJlIG9mIHRoZSBJc3N1ZXIgQVBJLCB0aGlzIG1ldGhvZCBpcyBsZXNzIHNhZmVcbiAqIHRoYW4gdGhlIHNpbWlsYXJseSBuYW1lZCBoZWxwZXIgZnVuY3Rpb24gaW4gbGVnYWN5LXBheW1lbnQtaGVscGVycy5qc1xuICogc2luY2UgdGhvc2UgaGVscGVyIGZ1bmN0aW9ucyB3aWxsIGFzc29jaWF0ZSBhbnkgbmV3bHkgY3JlYXRlZCBwYXltZW50XG4gKiB3aXRoIHRoZSByZWNvdmVyeSBzZXQgb2YgdGhlIGFyZ3VtZW50IHB1cnNlLiBUaGUgbWV0aG9kcyBoZXJlIGFyZVxuICogbm93IHRyaXZpYWwgd3JhcHBlcnMgYXJvdW5kIHRob3NlIGhlbHBlcnMsIHVzaW5nIGEgYG1ha2VFbXB0eVB1cnNlKClgXG4gKiB0byBtYWtlIHRoZSBuZWVkZWQgcHVyc2UsIHdoaWNoIHRoZXkgdW5zYWZlbHkgdGhlbiBkcm9wIG9uIHRoZSBmbG9vci5cbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2UgaGVscGVyIGZ1bmN0aW9uIGZyb20gbGVnYWN5LXBheW1lbnQtaGVscGVycy5qc1xuICogQHBhcmFtIHtQYXltZW50fSBzcmNQYXltZW50IGF3YWl0ZWQgYnkgY2FsbFdoZW5cbiAqIEBwYXJhbSB7QW1vdW50fSBwYXltZW50QW1vdW50QVxuICovXG5zcGxpdChzcmNQYXltZW50LHBheW1lbnRBbW91bnRBKXtcbnJldHVybiBzcGxpdChtYWtlRW1wdHlQdXJzZSgpLHNyY1BheW1lbnQscGF5bWVudEFtb3VudEEpO1xuIH0sXG4vKipcbiAqIEluaGVyZW50IHRvIHRoZSBuYXR1cmUgb2YgdGhlIElzc3VlciBBUEksIHRoaXMgbWV0aG9kIGlzIGxlc3Mgc2FmZVxuICogdGhhbiB0aGUgc2ltaWxhcmx5IG5hbWVkIGhlbHBlciBmdW5jdGlvbiBpbiBsZWdhY3ktcGF5bWVudC1oZWxwZXJzLmpzXG4gKiBzaW5jZSB0aG9zZSBoZWxwZXIgZnVuY3Rpb25zIHdpbGwgYXNzb2NpYXRlIGFueSBuZXdseSBjcmVhdGVkIHBheW1lbnRcbiAqIHdpdGggdGhlIHJlY292ZXJ5IHNldCBvZiB0aGUgYXJndW1lbnQgcHVyc2UuIFRoZSBtZXRob2RzIGhlcmUgYXJlXG4gKiBub3cgdHJpdmlhbCB3cmFwcGVycyBhcm91bmQgdGhvc2UgaGVscGVycywgdXNpbmcgYSBgbWFrZUVtcHR5UHVyc2UoKWBcbiAqIHRvIG1ha2UgdGhlIG5lZWRlZCBwdXJzZSwgd2hpY2ggdGhleSB1bnNhZmVseSB0aGVuIGRyb3Agb24gdGhlIGZsb29yLlxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSBoZWxwZXIgZnVuY3Rpb24gZnJvbSBsZWdhY3ktcGF5bWVudC1oZWxwZXJzLmpzXG4gKiBAcGFyYW0ge1BheW1lbnR9IHNyY1BheW1lbnQgYXdhaXRlZCBieSBjYWxsV2hlblxuICogQHBhcmFtIHsqfSBhbW91bnRzXG4gKi9cbnNwbGl0TWFueShzcmNQYXltZW50LGFtb3VudHMpe1xucmV0dXJuIHNwbGl0TWFueShtYWtlRW1wdHlQdXJzZSgpLHNyY1BheW1lbnQsYW1vdW50cyk7XG4gfX0pO1xuXG5cbi8qKlxuICogUHJvdmlkZXMgZm9yIHRoZSByZWNvdmVyeSBvZiBuZXdseSBtaW50ZWQgYnV0IG5vdC15ZXQtZGVwb3NpdGVkIHBheW1lbnRzLlxuICpcbiAqIEJlY2F1c2UgdGhlIGBtaW50UmVjb3ZlcnlQdXJzZWAgaXMgcGxhY2VkIGluIGJhZ2dhZ2UsIGV2ZW4gaWYgdGhlXG4gKiBjYWxsZXIgb2YgYG1ha2VJc3N1ZXJLaXRgIGRyb3BzIGl0IG9uIHRoZSBmbG9vciwgaXQgY2FuIHN0aWxsIGJlXG4gKiByZWNvdmVyZWQgaW4gYW4gZW1lcmdlbmN5IHVwZ3JhZGUuXG4gKlxuICogQHR5cGUge1B1cnNlPEs+fVxuICovXG5jb25zdCBtaW50UmVjb3ZlcnlQdXJzZT1wcm92aWRlKGlzc3VlckJhZ2dhZ2UsJ21pbnRSZWNvdmVyeVB1cnNlJywoKT0+XG5tYWtlRW1wdHlQdXJzZSgpKTtcblxuXG4vKiogQHR5cGUge01pbnQ8Sz59ICovXG5jb25zdCBtaW50PXByZXBhcmVFeG8oaXNzdWVyQmFnZ2FnZSwgYCR7bmFtZX0gbWludGAsTWludEkse1xuZ2V0SXNzdWVyKCl7XG5yZXR1cm4gaXNzdWVyO1xuIH0sXG5taW50UGF5bWVudChuZXdBbW91bnQpe1xuLyogQHRzLWV4cGVjdC1lcnJvciBjaGVja2VkIGNhc3QqL1xubmV3QW1vdW50PWNvZXJjZShuZXdBbW91bnQpO1xubXVzdE1hdGNoKG5ld0Ftb3VudCxhbW91bnRTaGFwZSwnbWludGVkIGFtb3VudCcpO1xuLyogYHJhd1BheW1lbnRgIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYW55IHJlY292ZXJ5IHNldCwgYW5kKi9cbi8qIHNvIG11c3Qgbm90IGVzY2FwZS4qL1xuY29uc3QgcmF3UGF5bWVudD1tYWtlUGF5bWVudCgpO1xuaW5pdFBheW1lbnQocmF3UGF5bWVudCxuZXdBbW91bnQsdW5kZWZpbmVkKTtcblxuY29uc3QgbWludFJlY292ZXJ5UHVyc2VCZWZvcmU9bWludFJlY292ZXJ5UHVyc2UuZ2V0Q3VycmVudEFtb3VudCgpO1xubWludFJlY292ZXJ5UHVyc2UuZGVwb3NpdChyYXdQYXltZW50LG5ld0Ftb3VudCk7XG5jb25zdCBwYXltZW50PW1pbnRSZWNvdmVyeVB1cnNlLndpdGhkcmF3KG5ld0Ftb3VudCk7XG5jb25zdCBtaW50UmVjb3ZlcnlQdXJzZUFmdGVyPW1pbnRSZWNvdmVyeVB1cnNlLmdldEN1cnJlbnRBbW91bnQoKTtcbmFzc2VydChrZXlFUShtaW50UmVjb3ZlcnlQdXJzZUJlZm9yZSxtaW50UmVjb3ZlcnlQdXJzZUFmdGVyKSk7XG5yZXR1cm4gcGF5bWVudDtcbiB9fSk7XG5cblxuY29uc3QgaXNzdWVyS2l0PWhhcmRlbih7aXNzdWVyLG1pbnQsYnJhbmQsbWludFJlY292ZXJ5UHVyc2V9KTtcbnJldHVybiBpc3N1ZXJLaXQ7XG4gfTskaOKAjV9vbmNlLnByZXBhcmVQYXltZW50TGVkZ2VyKHByZXBhcmVQYXltZW50TGVkZ2VyKTtcbmhhcmRlbihwcmVwYXJlUGF5bWVudExlZGdlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZVBheW1lbnRMZWRnZXIiOlsicHJlcGFyZVBheW1lbnRMZWRnZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA+r7LW6sPAACrDwAAIQAAAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9wdXJzZS5qc3siaW1wb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL3RyYW5zaWVudE5vdGlmaWVyLmpzIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiXSwiZXhwb3J0cyI6WyJwcmVwYXJlUHVyc2VLaW5kIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE0scHJlcGFyZUV4b0NsYXNzS2l0LG1ha2VTY2FsYXJCaWdTZXRTdG9yZSxBbW91bnRNYXRoLG1ha2VUcmFuc2llbnROb3RpZmllcktpdDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcInByZXBhcmVFeG9DbGFzc0tpdFwiLCBbJGjigI1fYSA9PiAocHJlcGFyZUV4b0NsYXNzS2l0ID0gJGjigI1fYSldXSxbXCJtYWtlU2NhbGFyQmlnU2V0U3RvcmVcIiwgWyRo4oCNX2EgPT4gKG1ha2VTY2FsYXJCaWdTZXRTdG9yZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2Ftb3VudE1hdGguanNcIiwgW1tcIkFtb3VudE1hdGhcIiwgWyRo4oCNX2EgPT4gKEFtb3VudE1hdGggPSAkaOKAjV9hKV1dXV0sW1wiLi90cmFuc2llbnROb3RpZmllci5qc1wiLCBbW1wibWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0XCIsIFskaOKAjV9hID0+IChtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuXG5jb25zdCAgICAgICAgcHJlcGFyZVB1cnNlS2luZD0oXG5pc3N1ZXJCYWdnYWdlLFxubmFtZSxcbmFzc2V0S2luZCxcbmJyYW5kLFxuUHVyc2VJS2l0LFxucHVyc2VNZXRob2RzKT0+XG57XG5jb25zdCBhbW91bnRTaGFwZT1icmFuZC5nZXRBbW91bnRTaGFwZSgpO1xuXG4vKiBOb3RlOiBWaXJ0dWFsIGZvciBoaWdoIGNhcmRpbmFsaXR5LCBidXQgKm5vdCogZHVyYWJsZSwgYW5kIHNvKi9cbi8qIGJyb2tlbiBhY3Jvc3MgYW4gdXBncmFkZS4qL1xuY29uc3R7cHJvdmlkZU5vdGlmaWVyLHVwZGF0ZTp1cGRhdGVCYWxhbmNlfT1tYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQoKTtcblxuY29uc3QgdXBkYXRlUHVyc2VCYWxhbmNlPShzdGF0ZSxuZXdQdXJzZUJhbGFuY2UscHVyc2UpPT57XG5zdGF0ZS5jdXJyZW50QmFsYW5jZT1uZXdQdXJzZUJhbGFuY2U7XG51cGRhdGVCYWxhbmNlKHB1cnNlLHB1cnNlLmdldEN1cnJlbnRBbW91bnQoKSk7XG4gfTtcblxuLyogLSBUaGlzIGtpbmQgaXMgYSBwYWlyIG9mIHB1cnNlIGFuZCBkZXBvc2l0RmFjZXQgdGhhdCBoYXZlIGEgMToxKi9cbi8qIGNvcnJlc3BvbmRlbmNlLiovXG4vKiAtIFRoZXkgYXJlIHZpcnR1YWxpemVkIHRvZ2V0aGVyIHRvIHNoYXJlIGEgc2luZ2xlIHN0YXRlIHJlY29yZC4qL1xuLyogLSBBbiBhbHRlcm5hdGl2ZSBkZXNpZ24gY29uc2lkZXJlZCB3YXMgdG8gaGF2ZSB0aGlzIHJldHVybiBhIFB1cnNlIGFsb25lKi9cbi8qIHRoYXQgY3JlYXRlZCBkZXBvc2l0RmFjZXQgYXMgbmVlZGVkLiBCdXQgdGhpcyBhcHByb2FjaCBlbnN1cmVzIGEgY29uc3RhbnQqL1xuLyogaWRlbnRpdHkgZm9yIHRoZSBmYWNldCBhbmQgZXhlcmNpc2VzIHRoZSBtdWx0aS1mYWNldGVkIG9iamVjdCBzdHlsZS4qL1xuY29uc3R7ZGVwb3NpdEludGVybmFsLHdpdGhkcmF3SW50ZXJuYWx9PXB1cnNlTWV0aG9kcztcbmNvbnN0IG1ha2VQdXJzZUtpdD1wcmVwYXJlRXhvQ2xhc3NLaXQoXG5pc3N1ZXJCYWdnYWdlLFxuIGAke25hbWV9IFB1cnNlYCxcblB1cnNlSUtpdCxcbigpPT57XG5jb25zdCBjdXJyZW50QmFsYW5jZT1BbW91bnRNYXRoLm1ha2VFbXB0eShicmFuZCxhc3NldEtpbmQpO1xuXG4vKiogQHR5cGUge1NldFN0b3JlPFBheW1lbnQ+fSAqL1xuY29uc3QgcmVjb3ZlcnlTZXQ9bWFrZVNjYWxhckJpZ1NldFN0b3JlKCdyZWNvdmVyeSBzZXQnLHtcbmR1cmFibGU6dHJ1ZX0pO1xuXG5cbnJldHVybntcbmN1cnJlbnRCYWxhbmNlLFxucmVjb3ZlcnlTZXR9O1xuXG4gfSxcbntcbnB1cnNlOntcbmRlcG9zaXQoc3JjUGF5bWVudCxvcHRBbW91bnRTaGFwZT11bmRlZmluZWQpe1xuLyogUHVyc2VJIGRvZXMgKm5vdCogZGVsYXkgYGRlcG9zaXRgIHVudGlsIGBzcmNQYXltZW50YCBpcyBmdWxmdWxsZWQuKi9cbi8qIFNlZSB0aGUgY29tbWVudHMgb24gUHVyc2VJLmRlcG9zaXQgaW4gdHlwZUd1YXJkcy5qcyovXG5jb25zdHtzdGF0ZX09dGhpcztcbi8qIE5vdGUgQ09NTUlUIFBPSU5UIHdpdGhpbiBkZXBvc2l0LiovXG5yZXR1cm4gZGVwb3NpdEludGVybmFsKFxuc3RhdGUuY3VycmVudEJhbGFuY2UsXG4obmV3UHVyc2VCYWxhbmNlKT0+XG51cGRhdGVQdXJzZUJhbGFuY2Uoc3RhdGUsbmV3UHVyc2VCYWxhbmNlLHRoaXMuZmFjZXRzLnB1cnNlKSxcbnNyY1BheW1lbnQsXG5vcHRBbW91bnRTaGFwZSk7XG5cbiB9LFxud2l0aGRyYXcoYW1vdW50KXtcbmNvbnN0e3N0YXRlfT10aGlzO1xuLyogTm90ZSBDT01NSVQgUE9JTlQgd2l0aGluIHdpdGhkcmF3LiovXG5yZXR1cm4gd2l0aGRyYXdJbnRlcm5hbChcbnN0YXRlLmN1cnJlbnRCYWxhbmNlLFxuKG5ld1B1cnNlQmFsYW5jZSk9PlxudXBkYXRlUHVyc2VCYWxhbmNlKHN0YXRlLG5ld1B1cnNlQmFsYW5jZSx0aGlzLmZhY2V0cy5wdXJzZSksXG5hbW91bnQsXG5zdGF0ZS5yZWNvdmVyeVNldCk7XG5cbiB9LFxuZ2V0Q3VycmVudEFtb3VudCgpe1xucmV0dXJuIHRoaXMuc3RhdGUuY3VycmVudEJhbGFuY2U7XG4gfSxcbmdldEN1cnJlbnRBbW91bnROb3RpZmllcigpe1xucmV0dXJuIHByb3ZpZGVOb3RpZmllcih0aGlzLmZhY2V0cy5wdXJzZSk7XG4gfSxcbmdldEFsbGVnZWRCcmFuZCgpe1xucmV0dXJuIGJyYW5kO1xuIH0sXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuZ2V0RGVwb3NpdEZhY2V0KCl7XG5yZXR1cm4gdGhpcy5mYWNldHMuZGVwb3NpdEZhY2V0O1xuIH0sXG5cbmdldFJlY292ZXJ5U2V0KCl7XG5yZXR1cm4gdGhpcy5zdGF0ZS5yZWNvdmVyeVNldC5zbmFwc2hvdCgpO1xuIH0sXG5yZWNvdmVyQWxsKCl7XG5jb25zdHtzdGF0ZSxmYWNldHN9PXRoaXM7XG5sZXQgYW1vdW50PUFtb3VudE1hdGgubWFrZUVtcHR5KGJyYW5kLGFzc2V0S2luZCk7XG5mb3IoY29uc3QgcGF5bWVudCBvZiBzdGF0ZS5yZWNvdmVyeVNldC5rZXlzKCkpe1xuLyogVGhpcyBkb2VzIGNhdXNlIGRlbGV0aW9ucyBmcm9tIHRoZSBzZXQgd2hpbGUgaXRlcmF0aW5nLCovXG4vKiBidXQgdGhpcyBzcGVjaWFsIGNhc2UgaXMgYWxsb3dlZC4qL1xuY29uc3QgZGVsdGE9ZmFjZXRzLnB1cnNlLmRlcG9zaXQocGF5bWVudCk7XG5hbW91bnQ9QW1vdW50TWF0aC5hZGQoYW1vdW50LGRlbHRhLGJyYW5kKTtcbiB9XG5zdGF0ZS5yZWNvdmVyeVNldC5nZXRTaXplKCk9PT0wfHxcbkZhaWwgYGludGVybmFsOiBSZW1haW5pbmcgdW5yZWNvdmVyZWQgcGF5bWVudHM6ICR7ZmFjZXRzLnB1cnNlLmdldFJlY292ZXJ5U2V0KCl9YDtcbnJldHVybiBhbW91bnQ7XG4gfX0sXG5cbmRlcG9zaXRGYWNldDp7XG5yZWNlaXZlKC4uLmFyZ3Mpe1xucmV0dXJuIHRoaXMuZmFjZXRzLnB1cnNlLmRlcG9zaXQoLi4uYXJncyk7XG4gfX19LFxuXG5cbntcbnN0YXRlU2hhcGU6e1xuY3VycmVudEJhbGFuY2U6YW1vdW50U2hhcGUsXG5yZWNvdmVyeVNldDpNLnJlbW90YWJsZSgncmVjb3ZlcnlTZXQnKX19KTtcblxuXG5cbnJldHVybigpPT5tYWtlUHVyc2VLaXQoKS5wdXJzZTtcbiB9OyRo4oCNX29uY2UucHJlcGFyZVB1cnNlS2luZChwcmVwYXJlUHVyc2VLaW5kKTtcbmhhcmRlbihwcmVwYXJlUHVyc2VLaW5kKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwcmVwYXJlUHVyc2VLaW5kIjpbInByZXBhcmVQdXJzZUtpbmQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA3ts1pfsFAAD7BQAALQAAAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy90cmFuc2llbnROb3RpZmllci5qc3siaW1wb3J0cyI6WyJAYWdvcmljL25vdGlmaWVyIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiXSwiZXhwb3J0cyI6WyJtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSxwcm92aWRlTGF6eSxtYWtlTm90aWZpZXJLaXQ7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJwcm92aWRlTGF6eVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZUxhenkgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wibWFrZU5vdGlmaWVyS2l0XCIsIFskaOKAjV9hID0+IChtYWtlTm90aWZpZXJLaXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbi8qIE5vdGU6IFZpcnR1YWwgZm9yIGhpZ2ggY2FyZGluYWxpdHksIGJ1dCAqbm90KiBkdXJhYmxlLCBhbmQgc28qL1xuLyogYnJva2VuIGFjcm9zcyBhbiB1cGdyYWRlLiovXG5jb25zdCAgICAgICAgbWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0PSgpPT57XG4vKiogQHR5cGUge1dlYWtNYXBTdG9yZTxQdXJzZSwgTm90aWZpZXJSZWNvcmQ8YW55Pj59ICovXG5jb25zdCB0cmFuc2llbnROb3RpZmVyS2l0cz1tYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlKFxuJ3RyYW5zaWVudE5vdGlmZXJLaXRzJyk7XG5cblxuY29uc3QgcHJvdmlkZU5vdGlmaWVyS2l0PShrZXkpPT5cbnByb3ZpZGVMYXp5KHRyYW5zaWVudE5vdGlmZXJLaXRzLGtleSwoKT0+XG5tYWtlTm90aWZpZXJLaXQoa2V5LmdldEN1cnJlbnRBbW91bnQoKSkpO1xuXG5cbmNvbnN0IHByb3ZpZGVOb3RpZmllcj0oa2V5KT0+cHJvdmlkZU5vdGlmaWVyS2l0KGtleSkubm90aWZpZXI7XG5jb25zdCB1cGRhdGU9KGtleSxuZXdWYWx1ZSk9PntcbmlmKHRyYW5zaWVudE5vdGlmZXJLaXRzLmhhcyhrZXkpKXtcbmNvbnN0e3VwZGF0ZXJ9PXRyYW5zaWVudE5vdGlmZXJLaXRzLmdldChrZXkpO1xudXBkYXRlci51cGRhdGVTdGF0ZShuZXdWYWx1ZSk7XG4gfVxuIH07XG5cbnJldHVybntwcm92aWRlTm90aWZpZXIsdXBkYXRlfTtcbiB9OyRo4oCNX29uY2UubWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0KG1ha2VUcmFuc2llbnROb3RpZmllcktpdCk7XG5oYXJkZW4obWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQiOlsibWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMUYV9SOKAAAjigAACYAAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiQW1vdW50U2hhcGUiLCJBc3NldEtpbmRTaGFwZSIsIkJyYW5kSSIsIkJyYW5kU2hhcGUiLCJEZXBvc2l0RmFjZXRTaGFwZSIsIkRpc3BsYXlJbmZvU2hhcGUiLCJJc3N1ZXJLaXRTaGFwZSIsIklzc3VlclNoYXBlIiwiTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTIiwiTWludFNoYXBlIiwiTm90aWZpZXJTaGFwZSIsIlBheW1lbnRTaGFwZSIsIlB1cnNlU2hhcGUiLCJSYXRpb1NoYXBlIiwiaXNDb3B5QmFnVmFsdWUiLCJpc0NvcHlTZXRWYWx1ZSIsImlzTmF0VmFsdWUiLCJpc1NldFZhbHVlIiwibWFrZUlzc3VlckludGVyZmFjZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgTSxtYXRjaGVzOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dLFtcIm1hdGNoZXNcIiwgWyRo4oCNX2EgPT4gKG1hdGNoZXMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuY29uc3QgICAgICAgIEJyYW5kU2hhcGU9TS5yZW1vdGFibGUoJ0JyYW5kJyk7JGjigI1fb25jZS5CcmFuZFNoYXBlKEJyYW5kU2hhcGUpO1xuY29uc3QgICAgICAgIElzc3VlclNoYXBlPU0ucmVtb3RhYmxlKCdJc3N1ZXInKTskaOKAjV9vbmNlLklzc3VlclNoYXBlKElzc3VlclNoYXBlKTtcbmNvbnN0ICAgICAgICBQYXltZW50U2hhcGU9TS5yZW1vdGFibGUoJ1BheW1lbnQnKTskaOKAjV9vbmNlLlBheW1lbnRTaGFwZShQYXltZW50U2hhcGUpO1xuY29uc3QgICAgICAgIFB1cnNlU2hhcGU9TS5yZW1vdGFibGUoJ1B1cnNlJyk7JGjigI1fb25jZS5QdXJzZVNoYXBlKFB1cnNlU2hhcGUpO1xuY29uc3QgICAgICAgIERlcG9zaXRGYWNldFNoYXBlPU0ucmVtb3RhYmxlKCdEZXBvc2l0RmFjZXQnKTskaOKAjV9vbmNlLkRlcG9zaXRGYWNldFNoYXBlKERlcG9zaXRGYWNldFNoYXBlKTtcbmNvbnN0ICAgICAgICBOb3RpZmllclNoYXBlPU0ucmVtb3RhYmxlKCdOb3RpZmllcicpOyRo4oCNX29uY2UuTm90aWZpZXJTaGFwZShOb3RpZmllclNoYXBlKTtcbmNvbnN0ICAgICAgICBNaW50U2hhcGU9TS5yZW1vdGFibGUoJ01pbnQnKTtcblxuLyoqXG4gKiBXaGVuIHRoZSBBbW91bnRWYWx1ZSBvZiBhbiBBbW91bnQgZml0cyB0aGUgTmF0VmFsdWVTaGFwZSwgaS5lLiwgd2hlbiBpdCBpc1xuICogYSBub24tbmVnYXRpdmUgYmlnaW50LCB0aGVuIGl0IHJlcHJlc2VudHMgdGhhdCBtYW55IHVuaXRzIG9mIHRoZVxuICogZnVuZ2libGUgYXNzZXQgcmVwcmVzZW50ZWQgYnkgdGhhdCBhbW91bnQuIFRoZSBicmFuZCBvZiB0aGF0IGFtb3VudFxuICogc2hvdWxkIGluZGVlZCByZXByZXNlbnQgYSBraW5kIG9mIGFzc2V0IGNvbnNpc3Rpbmcgb2YgYSBjb3VudGFibGVcbiAqIHNldCBvZiBmdW5naWJsZSB1bml0cy5cbiAqLyRo4oCNX29uY2UuTWludFNoYXBlKE1pbnRTaGFwZSk7XG5jb25zdCBOYXRWYWx1ZVNoYXBlPU0ubmF0KCk7XG5cbi8qKlxuICogV2hlbiB0aGUgQW1vdW50VmFsdWUgb2YgYW4gQW1vdW50IGZpdHMgdGhlIENvcHlTZXRWYWx1ZVNoYXBlLCBpLmUuLCB3aGVuIGl0XG4gKiBpcyBhIENvcHlTZXQsIHRoZW4gaXQgcmVwcmVzZW50cyB0aGUgc2V0IG9mIHRob3NlXG4gKiBrZXlzLCB3aGVyZSBlYWNoIGtleSByZXByZXNlbnRzIHNvbWUgaW5kaXZpZHVhbCBub24tZnVuZ2libGVcbiAqIGl0ZW0sIGxpa2UgYSBjb25jZXJ0IHRpY2tldCwgZnJvbSB0aGUgbm9uLWZ1bmdpYmxlIGFzc2V0IGNsYXNzXG4gKiByZXByZXNlbnRlZCBieSB0aGF0IGFtb3VudCdzIGJyYW5kLiBUaGUgYW1vdW50IGl0c2VsZiByZXByZXNlbnRzXG4gKiB0aGUgc2V0IG9mIHRoZXNlIGl0ZW1zLCBhcyBvcHBvc2VkIHRvIGFueSBvZiB0aGUgb3RoZXIgaXRlbXNcbiAqIGZyb20gdGhlIHNhbWUgYXNzZXQgY2xhc3MuXG4gKlxuICogSWYgYSBnaXZlbiB2YWx1ZSBjbGFzcyByZXByZXNlbnRzIGNvbmNlcnQgdGlja2V0cywgaXQgc2VlbXMgYml6YXJyZVxuICogdGhhdCB3ZSBjYW4gZm9ybSBhbW91bnRzIG9mIGFueSBrZXkuIFRoZSBoYXJkIGNvbnN0cmFpbnQgaXMgdGhhdFxuICogdGhlIGNvZGUgdGhhdCBob2xkcyB0aGUgbWludCBmb3IgdGhhdCBhc3NldCBjbGFzcy0tLXRoZSBvbmUgYXNzb2NpYXRlZFxuICogd2l0aCB0aGF0IGJyYW5kLCBvbmx5IG1pbnRzIHRoZSBpdGVtcyByZXByZXNlbnRpbmcgdGhlIHJlYWwgdW5pdHNcbiAqIG9mIHRoYXQgYXNzZXQgY2xhc3MgYXMgZGVmaW5lZCBieSBpdC4gQW55b25lIGVsc2UgY2FuIHB1dCB0b2dldGhlclxuICogYW4gYW1vdW50IGV4cHJlc3NpbmcsIGZvciBleGFtcGxlLCB0aGF0IHRoZXkgXCJ3YW50XCIgc29tZSBpdGVtcyB0aGF0XG4gKiB3aWxsIG5ldmVyIGJlIG1pbnRlZC4gVGhhdCB3YW50IHdpbGwgbmV2ZXIgYmUgc2F0aXNmaWVkLlxuICogXCJZb3UgY2FuJ3QgYWx3YXlzIGdldC4uLlwiXG4gKi9cbmNvbnN0IENvcHlTZXRWYWx1ZVNoYXBlPU0uc2V0KCk7XG5cbi8qKlxuICogV2hlbiB0aGUgQW1vdW50VmFsdWUgb2YgYW4gQW1vdW50IGZpdHMgdGhlIFNldFZhbHVlU2hhcGUsIGkuZS4sIHdoZW4gaXRcbiAqIGlzIGEgQ29weUFycmF5IG9mIHBhc3NhYmxlIEtleXMuIFRoaXMgcmVwcmVzZW50YXRpb24gaXMgZGVwcmVjYXRlZC5cbiAqXG4gKiBAZGVwcmVjYXRlZCBQbGVhc2UgY2hhbmdlIGZyb20gdXNpbmcgYXJyYXktYmFzZWQgU2V0VmFsdWVzIHRvIENvcHlTZXQtYmFzZWRcbiAqIENvcHlTZXRWYWx1ZXMuXG4gKi9cbmNvbnN0IFNldFZhbHVlU2hhcGU9TS5hcnJheU9mKE0ua2V5KCkpO1xuXG4vKipcbiAqIFdoZW4gdGhlIEFtb3VudFZhbHVlIG9mIGFuIEFtb3VudCBmaXRzIHRoZSBDb3B5QmFnVmFsdWVTaGFwZSwgaS5lLiwgd2hlbiBpdFxuICogaXMgYSBDb3B5QmFnLCB0aGVuIGl0IHJlcHJlc2VudHMgdGhlIGJhZyAobXVsdGlzZXQpIG9mIHRob3NlXG4gKiBrZXlzLCB3aGVyZSBlYWNoIGtleSByZXByZXNlbnRzIHNvbWUgaW5kaXZpZHVhbCBzZW1pLWZ1bmdpYmxlXG4gKiBpdGVtLCBsaWtlIGEgY29uY2VydCB0aWNrZXQsIGZyb20gdGhlIHNlbWktZnVuZ2libGUgYXNzZXQgY2xhc3NcbiAqIHJlcHJlc2VudGVkIGJ5IHRoYXQgYW1vdW50J3MgYnJhbmQuIFRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCBrZXlcbiAqIGFwcGVhcnMgaW4gdGhlIGJhZyBpcyB0aGUgbnVtYmVyIG9mIGZ1bmdpYmxlIHVuaXRzIG9mIHRoYXQga2V5LlxuICogVGhlIGFtb3VudCBpdHNlbGYgcmVwcmVzZW50c1xuICogdGhlIGJhZyBvZiB0aGVzZSBpdGVtcywgYXMgb3Bwb3NlZCB0byBhbnkgb2YgdGhlIG90aGVyIGl0ZW1zXG4gKiBmcm9tIHRoZSBzYW1lIGFzc2V0IGNsYXNzLlxuICpcbiAqIElmIGEgZ2l2ZW4gdmFsdWUgY2xhc3MgcmVwcmVzZW50cyBjb25jZXJ0IHRpY2tldHMsIGl0IHNlZW1zIGJpemFycmVcbiAqIHRoYXQgd2UgY2FuIGZvcm0gYW1vdW50cyBvZiBhbnkga2V5LiBUaGUgaGFyZCBjb25zdHJhaW50IGlzIHRoYXRcbiAqIHRoZSBjb2RlIHRoYXQgaG9sZHMgdGhlIG1pbnQgZm9yIHRoYXQgYXNzZXQgY2xhc3MtLS10aGUgb25lIGFzc29jaWF0ZWRcbiAqIHdpdGggdGhhdCBicmFuZCwgb25seSBtaW50cyB0aGUgaXRlbXMgcmVwcmVzZW50aW5nIHRoZSByZWFsIHVuaXRzXG4gKiBvZiB0aGF0IGFzc2V0IGNsYXNzIGFzIGRlZmluZWQgYnkgaXQuIEFueW9uZSBlbHNlIGNhbiBwdXQgdG9nZXRoZXJcbiAqIGFuIGFtb3VudCBleHByZXNzaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCB0aGV5IFwid2FudFwiIHNvbWUgaXRlbXMgdGhhdFxuICogd2lsbCBuZXZlciBiZSBtaW50ZWQuIFRoYXQgd2FudCB3aWxsIG5ldmVyIGJlIHNhdGlzZmllZC5cbiAqIFwiWW91IGNhbid0IGFsd2F5cyBnZXQuLi5cIlxuICovXG5jb25zdCBDb3B5QmFnVmFsdWVTaGFwZT1NLmJhZygpO1xuXG5jb25zdCBBbW91bnRWYWx1ZVNoYXBlPU0ub3IoXG5OYXRWYWx1ZVNoYXBlLFxuQ29weVNldFZhbHVlU2hhcGUsXG5TZXRWYWx1ZVNoYXBlLFxuQ29weUJhZ1ZhbHVlU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBBbW91bnRTaGFwZT1oYXJkZW4oe1xuYnJhbmQ6QnJhbmRTaGFwZSxcbnZhbHVlOkFtb3VudFZhbHVlU2hhcGV9KTskaOKAjV9vbmNlLkFtb3VudFNoYXBlKEFtb3VudFNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgUmF0aW9TaGFwZT1oYXJkZW4oe1xubnVtZXJhdG9yOkFtb3VudFNoYXBlLFxuZGVub21pbmF0b3I6QW1vdW50U2hhcGV9KTtcblxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBhIE5hdCBiaWdpbnQuXG4gKlxuICogQHBhcmFtIHtBbW91bnRWYWx1ZX0gdmFsdWVcbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBYaW1wb3J0KCcuL3R5cGVzLmpzJykuTmF0VmFsdWV9XG4gKi8kaOKAjV9vbmNlLlJhdGlvU2hhcGUoUmF0aW9TaGFwZSk7XG5jb25zdCAgICAgICAgaXNOYXRWYWx1ZT0odmFsdWUpPT5tYXRjaGVzKHZhbHVlLE5hdFZhbHVlU2hhcGUpOyRo4oCNX29uY2UuaXNOYXRWYWx1ZShpc05hdFZhbHVlKTtcbmhhcmRlbihpc05hdFZhbHVlKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgYSBDb3B5U2V0XG4gKlxuICogQHBhcmFtIHtBbW91bnRWYWx1ZX0gdmFsdWVcbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBDb3B5U2V0VmFsdWV9XG4gKi9cbmNvbnN0ICAgICAgICBpc0NvcHlTZXRWYWx1ZT0odmFsdWUpPT5tYXRjaGVzKHZhbHVlLENvcHlTZXRWYWx1ZVNoYXBlKTskaOKAjV9vbmNlLmlzQ29weVNldFZhbHVlKGlzQ29weVNldFZhbHVlKTtcbmhhcmRlbihpc0NvcHlTZXRWYWx1ZSk7XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGEgcGFzcyBieSBjb3B5IGFycmF5IHN0cnVjdHVyZS4gRG9lcyBub3RcbiAqIGNoZWNrIGZvciBkdXBsaWNhdGVzLiBUbyBjaGVjayBmb3IgZHVwbGljYXRlcywgdXNlIHNldE1hdGhIZWxwZXJzLmNvZXJjZS5cbiAqXG4gKiBAZGVwcmVjYXRlZCBQbGVhc2UgY2hhbmdlIGZyb20gdXNpbmcgYXJyYXktYmFzZWQgU2V0VmFsdWVzIHRvIENvcHlTZXQtYmFzZWRcbiAqIENvcHlTZXRWYWx1ZXMuXG4gKiBAcGFyYW0ge0Ftb3VudFZhbHVlfSB2YWx1ZVxuICogQHJldHVybnMge3ZhbHVlIGlzIFNldFZhbHVlfVxuICovXG5jb25zdCAgICAgICAgaXNTZXRWYWx1ZT0odmFsdWUpPT5tYXRjaGVzKHZhbHVlLFNldFZhbHVlU2hhcGUpOyRo4oCNX29uY2UuaXNTZXRWYWx1ZShpc1NldFZhbHVlKTtcbmhhcmRlbihpc1NldFZhbHVlKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgYSBDb3B5QmFnXG4gKlxuICogQHBhcmFtIHtBbW91bnRWYWx1ZX0gdmFsdWVcbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBDb3B5QmFnVmFsdWV9XG4gKi9cbmNvbnN0ICAgICAgICBpc0NvcHlCYWdWYWx1ZT0odmFsdWUpPT5tYXRjaGVzKHZhbHVlLENvcHlCYWdWYWx1ZVNoYXBlKTskaOKAjV9vbmNlLmlzQ29weUJhZ1ZhbHVlKGlzQ29weUJhZ1ZhbHVlKTtcbmhhcmRlbihpc0NvcHlCYWdWYWx1ZSk7XG5cbi8qIE9uZSBHT09HT0x0aCBzaG91bGQgYmUgZW5vdWdoIGRlY2ltYWwgcGxhY2VzIGZvciBhbnlib2R5LiovXG5jb25zdCAgICAgICAgTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTPTEwMDskaOKAjV9vbmNlLk1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyhNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMpO1xuXG5jb25zdCAgICAgICAgQXNzZXRLaW5kU2hhcGU9TS5vcignbmF0Jywnc2V0JywnY29weVNldCcsJ2NvcHlCYWcnKTskaOKAjV9vbmNlLkFzc2V0S2luZFNoYXBlKEFzc2V0S2luZFNoYXBlKTtcblxuY29uc3QgICAgICAgIERpc3BsYXlJbmZvU2hhcGU9TS5zcGxpdFJlY29yZChcbnt9LFxue1xuZGVjaW1hbFBsYWNlczpNLmFuZChcbk0uZ3RlKC1NQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMpLFxuTS5sdGUoTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTKSksXG5cbmFzc2V0S2luZDpBc3NldEtpbmRTaGFwZX0sXG5cbntcbi8qIEluY2x1ZGluZyB0aGlzIGVtcHR5IGByZXN0YCBlbnN1cmVzIHRoYXQgdGhlcmUgYXJlIG5vIG90aGVyKi9cbi8qIHByb3BlcnRpZXMgYmV5b25kIHRob3NlIGluIHRoZSBgYmFzZWAgcmVjb3JkLiovfSk7JGjigI1fb25jZS5EaXNwbGF5SW5mb1NoYXBlKERpc3BsYXlJbmZvU2hhcGUpO1xuXG5cblxuY29uc3QgICAgICAgIElzc3VlcktpdFNoYXBlPWhhcmRlbih7XG5icmFuZDpCcmFuZFNoYXBlLFxubWludDpNaW50U2hhcGUsXG5taW50UmVjb3ZlcnlQdXJzZTpQdXJzZVNoYXBlLFxuaXNzdWVyOklzc3VlclNoYXBlLFxuZGlzcGxheUluZm86RGlzcGxheUluZm9TaGFwZX0pO1xuXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBJbnRlcmZhY2VzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi8kaOKAjV9vbmNlLklzc3VlcktpdFNoYXBlKElzc3VlcktpdFNoYXBlKTtcblxuY29uc3QgICAgICAgIEJyYW5kST1NLmludGVyZmFjZSgnQnJhbmQnLHtcbmlzTXlJc3N1ZXI6TS5jYWxsV2hlbihNLmF3YWl0KElzc3VlclNoYXBlKSkucmV0dXJucyhNLmJvb2xlYW4oKSksXG5nZXRBbGxlZ2VkTmFtZTpNLmNhbGwoKS5yZXR1cm5zKE0uc3RyaW5nKCkpLFxuZ2V0RGlzcGxheUluZm86TS5jYWxsKCkucmV0dXJucyhEaXNwbGF5SW5mb1NoYXBlKSxcbmdldEFtb3VudFNoYXBlOk0uY2FsbCgpLnJldHVybnMoTS5wYXR0ZXJuKCkpfSk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm59IFticmFuZFNoYXBlXVxuICogQHBhcmFtIHtQYXR0ZXJufSBbYXNzZXRLaW5kU2hhcGVdXG4gKiBAcGFyYW0ge1BhdHRlcm59IFthbW91bnRTaGFwZV1cbiAqLyRo4oCNX29uY2UuQnJhbmRJKEJyYW5kSSk7XG5jb25zdCAgICAgICAgbWFrZUlzc3VlckludGVyZmFjZXM9KFxuYnJhbmRTaGFwZT1CcmFuZFNoYXBlLFxuYXNzZXRLaW5kU2hhcGU9QXNzZXRLaW5kU2hhcGUsXG5hbW91bnRTaGFwZT1BbW91bnRTaGFwZSk9Plxue1xuY29uc3QgSXNzdWVyST1NLmludGVyZmFjZSgnSXNzdWVyJyx7XG5nZXRCcmFuZDpNLmNhbGwoKS5yZXR1cm5zKGJyYW5kU2hhcGUpLFxuZ2V0QWxsZWdlZE5hbWU6TS5jYWxsKCkucmV0dXJucyhNLnN0cmluZygpKSxcbmdldEFzc2V0S2luZDpNLmNhbGwoKS5yZXR1cm5zKGFzc2V0S2luZFNoYXBlKSxcbmdldERpc3BsYXlJbmZvOk0uY2FsbCgpLnJldHVybnMoRGlzcGxheUluZm9TaGFwZSksXG5tYWtlRW1wdHlQdXJzZTpNLmNhbGwoKS5yZXR1cm5zKFB1cnNlU2hhcGUpLFxuXG5pc0xpdmU6TS5jYWxsV2hlbihNLmF3YWl0KFBheW1lbnRTaGFwZSkpLnJldHVybnMoTS5ib29sZWFuKCkpLFxuZ2V0QW1vdW50T2Y6TS5jYWxsV2hlbihNLmF3YWl0KFBheW1lbnRTaGFwZSkpLnJldHVybnMoYW1vdW50U2hhcGUpLFxuYnVybjpNLmNhbGxXaGVuKE0uYXdhaXQoUGF5bWVudFNoYXBlKSkuXG5vcHRpb25hbChNLnBhdHRlcm4oKSkuXG5yZXR1cm5zKGFtb3VudFNoYXBlKSxcbmNsYWltOk0uY2FsbFdoZW4oTS5hd2FpdChQYXltZW50U2hhcGUpKS5cbm9wdGlvbmFsKE0ucGF0dGVybigpKS5cbnJldHVybnMoUGF5bWVudFNoYXBlKSxcbmNvbWJpbmU6TS5jYWxsKE0uYXJyYXlPZihNLmVyZWYoUGF5bWVudFNoYXBlKSkpLlxub3B0aW9uYWwoYW1vdW50U2hhcGUpLlxucmV0dXJucyhNLmVyZWYoUGF5bWVudFNoYXBlKSksXG5zcGxpdDpNLmNhbGxXaGVuKE0uYXdhaXQoUGF5bWVudFNoYXBlKSxhbW91bnRTaGFwZSkucmV0dXJucyhcbk0uYXJyYXlPZihQYXltZW50U2hhcGUpKSxcblxuc3BsaXRNYW55Ok0uY2FsbFdoZW4oXG5NLmF3YWl0KFBheW1lbnRTaGFwZSksXG5NLmFycmF5T2YoYW1vdW50U2hhcGUpKS5cbnJldHVybnMoTS5hcnJheU9mKFBheW1lbnRTaGFwZSkpfSk7XG5cblxuY29uc3QgTWludEk9TS5pbnRlcmZhY2UoJ01pbnQnLHtcbmdldElzc3VlcjpNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKSxcbm1pbnRQYXltZW50Ok0uY2FsbChhbW91bnRTaGFwZSkucmV0dXJucyhQYXltZW50U2hhcGUpfSk7XG5cblxuY29uc3QgUGF5bWVudEk9TS5pbnRlcmZhY2UoJ1BheW1lbnQnLHtcbmdldEFsbGVnZWRCcmFuZDpNLmNhbGwoKS5yZXR1cm5zKGJyYW5kU2hhcGUpfSk7XG5cblxuY29uc3QgUHVyc2VJPU0uaW50ZXJmYWNlKCdQdXJzZScse1xuZ2V0QWxsZWdlZEJyYW5kOk0uY2FsbCgpLnJldHVybnMoYnJhbmRTaGFwZSksXG5nZXRDdXJyZW50QW1vdW50Ok0uY2FsbCgpLnJldHVybnMoYW1vdW50U2hhcGUpLFxuZ2V0Q3VycmVudEFtb3VudE5vdGlmaWVyOk0uY2FsbCgpLnJldHVybnMoTm90aWZpZXJTaGFwZSksXG4vKiBQdXJzZUkgZG9lcyAqbm90KiBkZWxheSBgZGVwb3NpdGAgdW50aWwgYHNyY1BheW1lbnRgIGlzIGZ1bGZ1bGxlZC4qL1xuLyogUmF0aGVyLCB0aGUgc2VtYW50aWNzIG9mIGBkZXBvc2l0YCByZXF1aXJlIGl0IHRvIHByb3ZpZGUgaXRzKi9cbi8qIGNhbGxlcnMgd2l0aCBhIHN0cm9uZyBndWFyYW50ZWUgdGhhdCBgZGVwb3NpdGAgbWVzc2FnZXMgYXJlKi9cbi8qIHByb2Nlc3NlZCB3aXRob3V0IGZ1cnRoZXIgZGVsYXkgaW4gdGhlIG9yZGVyIHRoZXkgYXJyaXZlLiovXG4vKiBQdXJzZUkgdGhlcmVmb3JlIHJlcXVpcmVzIHRoYXQgdGhlIGBzcmNQYXltZW50YCBhcmd1bWVudCBhbHJlYWR5Ki9cbi8qIGJlIGEgcmVtb3RhYmxlLCBub3QgYSBwcm9taXNlLiovXG4vKiBQdXJzZUkgb25seSBjYWxscyB0aGlzIHJhdyBtZXRob2QgYWZ0ZXIgdmFsaWRhdGluZyB0aGF0Ki9cbi8qIGBzcmNQYXltZW50YCBpcyBhIHJlbW90YWJsZSwgbGVhdmluZyBpdCovXG4vKiB0byB0aGlzIHJhdyBtZXRob2QgdG8gdmFsaWRhdGUgdGhhdCB0aGlzIHJlbW90YWJsZSBpcyBhY3R1YWxseSovXG4vKiBhIGxpdmUgcGF5bWVudCBvZiB0aGUgY29ycmVjdCBicmFuZCB3aXRoIHN1ZmZpY2llbnQgZnVuZHMuKi9cbmRlcG9zaXQ6TS5jYWxsKFBheW1lbnRTaGFwZSkub3B0aW9uYWwoTS5wYXR0ZXJuKCkpLnJldHVybnMoYW1vdW50U2hhcGUpLFxuZ2V0RGVwb3NpdEZhY2V0Ok0uY2FsbCgpLnJldHVybnMoRGVwb3NpdEZhY2V0U2hhcGUpLFxud2l0aGRyYXc6TS5jYWxsKGFtb3VudFNoYXBlKS5yZXR1cm5zKFBheW1lbnRTaGFwZSksXG5nZXRSZWNvdmVyeVNldDpNLmNhbGwoKS5yZXR1cm5zKE0uc2V0T2YoUGF5bWVudFNoYXBlKSksXG5yZWNvdmVyQWxsOk0uY2FsbCgpLnJldHVybnMoYW1vdW50U2hhcGUpfSk7XG5cblxuY29uc3QgRGVwb3NpdEZhY2V0ST1NLmludGVyZmFjZSgnRGVwb3NpdEZhY2V0Jyx7XG5yZWNlaXZlOlB1cnNlSS5tZXRob2RHdWFyZHMuZGVwb3NpdH0pO1xuXG5cbmNvbnN0IFB1cnNlSUtpdD1oYXJkZW4oe1xucHVyc2U6UHVyc2VJLFxuZGVwb3NpdEZhY2V0OkRlcG9zaXRGYWNldEl9KTtcblxuXG5yZXR1cm4gaGFyZGVuKHtcbklzc3VlckksXG5NaW50SSxcblBheW1lbnRJLFxuUHVyc2VJS2l0fSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZUlzc3VlckludGVyZmFjZXMobWFrZUlzc3VlckludGVyZmFjZXMpO1xuaGFyZGVuKG1ha2VJc3N1ZXJJbnRlcmZhY2VzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJCcmFuZFNoYXBlIjpbIkJyYW5kU2hhcGUiXSwiSXNzdWVyU2hhcGUiOlsiSXNzdWVyU2hhcGUiXSwiUGF5bWVudFNoYXBlIjpbIlBheW1lbnRTaGFwZSJdLCJQdXJzZVNoYXBlIjpbIlB1cnNlU2hhcGUiXSwiRGVwb3NpdEZhY2V0U2hhcGUiOlsiRGVwb3NpdEZhY2V0U2hhcGUiXSwiTm90aWZpZXJTaGFwZSI6WyJOb3RpZmllclNoYXBlIl0sIk1pbnRTaGFwZSI6WyJNaW50U2hhcGUiXSwiQW1vdW50U2hhcGUiOlsiQW1vdW50U2hhcGUiXSwiUmF0aW9TaGFwZSI6WyJSYXRpb1NoYXBlIl0sImlzTmF0VmFsdWUiOlsiaXNOYXRWYWx1ZSJdLCJpc0NvcHlTZXRWYWx1ZSI6WyJpc0NvcHlTZXRWYWx1ZSJdLCJpc1NldFZhbHVlIjpbImlzU2V0VmFsdWUiXSwiaXNDb3B5QmFnVmFsdWUiOlsiaXNDb3B5QmFnVmFsdWUiXSwiTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTIjpbIk1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyJdLCJBc3NldEtpbmRTaGFwZSI6WyJBc3NldEtpbmRTaGFwZSJdLCJEaXNwbGF5SW5mb1NoYXBlIjpbIkRpc3BsYXlJbmZvU2hhcGUiXSwiSXNzdWVyS2l0U2hhcGUiOlsiSXNzdWVyS2l0U2hhcGUiXSwiQnJhbmRJIjpbIkJyYW5kSSJdLCJtYWtlSXNzdWVySW50ZXJmYWNlcyI6WyJtYWtlSXNzdWVySW50ZXJmYWNlcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABX6JD1fkEAAH5BAAApAAAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL3R5cGVzLWFtYmllbnQuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBbW91bnRcbiAqIEFtb3VudHMgYXJlIGRlc2NyaXB0aW9ucyBvZiBkaWdpdGFsIGFzc2V0cywgYW5zd2VyaW5nIHRoZSBxdWVzdGlvbnNcbiAqIFwiaG93IG11Y2hcIiBhbmQgXCJvZiB3aGF0IGtpbmRcIi4gQW1vdW50cyBhcmUgdmFsdWVzIGxhYmVsZWQgd2l0aCBhIGJyYW5kLlxuICogQW1vdW50TWF0aCBleGVjdXRlcyB0aGUgbG9naWMgb2YgaG93IGFtb3VudHMgYXJlIGNoYW5nZWQgd2hlbiBkaWdpdGFsXG4gKiBhc3NldHMgYXJlIG1lcmdlZCwgc2VwYXJhdGVkLCBvciBvdGhlcndpc2UgbWFuaXB1bGF0ZWQuIEZvclxuICogZXhhbXBsZSwgYSBkZXBvc2l0IG9mIDIgYnVja3MgaW50byBhIHB1cnNlIHRoYXQgYWxyZWFkeSBoYXMgMyBidWNrc1xuICogZ2l2ZXMgYSBuZXcgcHVyc2UgYmFsYW5jZSBvZiA1IGJ1Y2tzLiBBbiBlbXB0eSBwdXJzZSBoYXMgMCBidWNrcy4gQW1vdW50TWF0aFxuICogcmVsaWVzIGhlYXZpbHkgb24gcG9seW1vcnBoaWMgTWF0aEhlbHBlcnMsIHdoaWNoIG1hbmlwdWxhdGUgdGhlIHVuYnJhbmRlZFxuICogcG9ydGlvbi5cbiAqXG4gKiBAcHJvcGVydHkge0JyYW5kPEs+fSBicmFuZFxuICogQHByb3BlcnR5IHtBc3NldFZhbHVlRm9yS2luZDxLPn0gdmFsdWVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtOYXRWYWx1ZSB8IFNldFZhbHVlIHwgQ29weVNldFZhbHVlIHwgQ29weUJhZ1ZhbHVlfSBBbW91bnRWYWx1ZVxuICogQW4gYEFtb3VudFZhbHVlYCBkZXNjcmliZXMgYSBzZXQgb3IgcXVhbnRpdHkgb2YgYXNzZXRzIHRoYXQgY2FuIGJlIG93bmVkIG9yXG4gKiBzaGFyZWQuXG4gKlxuICogQSBmdW5naWJsZSBgQW1vdW50VmFsdWVgIHVzZXMgYSBub24tbmVnYXRpdmUgYmlnaW50IHRvIHJlcHJlc2VudCBhIHF1YW50aXR5XG4gKiBvZiB0aGF0IG1hbnkgYXNzZXRzLlxuICpcbiAqIEEgbm9uLWZ1bmdpYmxlIGBBbW91bnRWYWx1ZWAgdXNlcyBhbiBhcnJheSBvciBDb3B5U2V0IG9mIGBLZXlgcyB0byByZXByZXNlbnRcbiAqIGEgc2V0IG9mIHdoYXRldmVyIGFzc2V0IGVhY2gga2V5IHJlcHJlc2VudHMuIEEgYEtleWAgaXMgYSBwYXNzYWJsZSB2YWx1ZVxuICogdGhhdCBjYW4gYmUgdXNlZCBhcyBhbiBlbGVtZW50IGluIGEgc2V0IChTZXRTdG9yZSBvciBDb3B5U2V0KSBvciBhcyB0aGVcbiAqIGtleSBpbiBhIG1hcCAoTWFwU3RvcmUgb3IgQ29weU1hcCkuXG4gKlxuICogYFNldFZhbHVlYCBpcyBmb3IgdGhlIGRlcHJlY2F0ZWQgc2V0IHJlcHJlc2VudGF0aW9uLCB1c2luZyBhbiBhcnJheSBkaXJlY3RseVxuICogdG8gcmVwcmVzZW50IHRoZSBhcnJheSBvZiBpdHMgZWxlbWVudHMuIGBDb3B5U2V0VmFsdWVgIGlzIHRoZSBwcm9wZXJcbiAqIHJlcHJlc2VudGF0aW9uIHVzaW5nIGEgQ29weVNldC5cbiAqXG4gKiBBIHNlbWktZnVuZ2libGUgYENvcHlCYWdWYWx1ZWAgaXMgcmVwcmVzZW50ZWQgYXMgYVxuICogYENvcHlCYWdgIG9mIGBLZXlgIG9iamVjdHMuIFwiQmFnXCIgaXMgc3lub255bW91cyB3aXRoIE11bHRpU2V0LCB3aGVyZSBhblxuICogZWxlbWVudCBvZiBhIGJhZyBjYW4gYmUgcHJlc2VudCBvbmNlIG9yIG1vcmUgdGltZXMsIGkuZS4sIHNvbWUgcG9zaXRpdmVcbiAqIGJpZ2ludCBudW1iZXIgb2YgdGltZXMsIHJlcHJlc2VudGluZyB0aGF0IHF1YW50aXR5IG9mIHRoZSBhc3NldCByZXByZXNlbnRlZFxuICogYnkgdGhhdCBrZXkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7J25hdCcgfCAnc2V0JyB8ICdjb3B5U2V0JyB8ICdjb3B5QmFnJyB9IEFzc2V0S2luZFxuICpcbiAqIFNlZSBkb2MtY29tbWVudCBmb3IgYEFtb3VudFZhbHVlYC5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAdHlwZWRlZiB7SyBleHRlbmRzICduYXQnID8gTmF0VmFsdWUgOlxuICogSyBleHRlbmRzICdzZXQnID8gU2V0VmFsdWUgOlxuICogSyBleHRlbmRzICdjb3B5U2V0JyA/IENvcHlTZXRWYWx1ZTpcbiAqIEsgZXh0ZW5kcyAnY29weUJhZycgPyBDb3B5QmFnVmFsdWUgOlxuICogbmV2ZXJcbiAqIH0gQXNzZXRWYWx1ZUZvcktpbmRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50VmFsdWV9IFZcbiAqIEB0eXBlZGVmIHtWIGV4dGVuZHMgTmF0VmFsdWUgPyAnbmF0JyA6XG4gKiAgViBleHRlbmRzIFNldFZhbHVlID8gJ3NldCcgOlxuICogIFYgZXh0ZW5kcyBDb3B5U2V0VmFsdWUgPyAnY29weVNldCcgOlxuICogIFYgZXh0ZW5kcyBDb3B5QmFnVmFsdWUgPyAnY29weUJhZycgOlxuICogIG5ldmVyfSBBc3NldEtpbmRGb3JWYWx1ZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IERpc3BsYXlJbmZvXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2RlY2ltYWxQbGFjZXNdIFRlbGxzIHRoZSBkaXNwbGF5IHNvZnR3YXJlIGhvd1xuICogICBtYW55IGRlY2ltYWwgcGxhY2VzIHRvIG1vdmUgdGhlIGRlY2ltYWwgb3ZlciB0byB0aGUgbGVmdCwgb3IgaW5cbiAqICAgb3RoZXIgd29yZHMsIHdoaWNoIHBvc2l0aW9uIGNvcnJlc3BvbmRzIHRvIHdob2xlIG51bWJlcnMuIFdlXG4gKiAgIHJlcXVpcmUgZnVuZ2libGUgZGlnaXRhbCBhc3NldHMgdG8gYmUgcmVwcmVzZW50ZWQgaW4gaW50ZWdlcnMsIGluXG4gKiAgIHRoZSBzbWFsbGVzdCB1bml0IChpLmUuIFVTRCBtaWdodCBiZSByZXByZXNlbnRlZCBpbiBtaWxsLCBhXG4gKiAgIHRob3VzYW5kdGggb2YgYSBkb2xsYXIuIEluIHRoYXQgY2FzZSwgYGRlY2ltYWxQbGFjZXNgIHdvdWxkIGJlXG4gKiAgIDMuKSBUaGlzIHByb3BlcnR5IGlzIG9wdGlvbmFsLCBhbmQgZm9yIG5vbi1mdW5naWJsZSBkaWdpdGFsXG4gKiAgIGFzc2V0cywgc2hvdWxkIG5vdCBiZSBzcGVjaWZpZWQuIFRoZSBkZWNpbWFsUGxhY2VzIHByb3BlcnR5XG4gKiAgIHNob3VsZCBiZSB1c2VkIGZvciAqZGlzcGxheSBwdXJwb3NlcyBvbmx5Ki4gQW55IG90aGVyIHVzZSBpcyBhblxuICogICBhbnRpLXBhdHRlcm4uXG4gKiBAcHJvcGVydHkge0t9IGFzc2V0S2luZCAtIHRoZSBraW5kIG9mIGFzc2V0LCBlaXRoZXJcbiAqICAgQXNzZXRLaW5kLk5BVCAoZnVuZ2libGUpIG9yXG4gKiAgIEFzc2V0S2luZC5TRVQgb3IgQXNzZXRLaW5kLkNPUFlfU0VUIChub24tZnVuZ2libGUpXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gQnJhbmRcbiAqIFRoZSBicmFuZCBpZGVudGlmaWVzIHRoZSBraW5kIG9mIGlzc3VlciwgYW5kIGhhcyBhIGZ1bmN0aW9uIHRvIGdldCB0aGVcbiAqIGFsbGVnZWQgbmFtZSBmb3IgdGhlIGtpbmQgb2YgYXNzZXQgZGVzY3JpYmVkLiBUaGUgYWxsZWdlZCBuYW1lIChzdWNoXG4gKiBhcyAnQlRDJyBvciAnbW9vbGEnKSBpcyBwcm92aWRlZCBieSB0aGUgbWFrZXIgb2YgdGhlIGlzc3VlciBhbmQgc2hvdWxkXG4gKiBub3QgYmUgdHJ1c3RlZCBhcyBhY2N1cmF0ZS5cbiAqXG4gKiBFdmVyeSBhbW91bnQgY3JlYXRlZCBieSBhIHBhcnRpY3VsYXIgQW1vdW50TWF0aCB3aWxsIHNoYXJlIHRoZSBzYW1lIGJyYW5kLFxuICogYnV0IHJlY2lwaWVudHMgY2Fubm90IHJlbHkgb24gdGhlIGJyYW5kIHRvIHZlcmlmeSB0aGF0IGEgcHVycG9ydGVkIGFtb3VudFxuICogcmVwcmVzZW50cyB0aGUgaXNzdWVyIHRoZXkgaW50ZW5kZWQsIHNpbmNlIHRoZSBzYW1lIGJyYW5kIGNhbiBiZSByZXVzZWQgYnlcbiAqIGEgbWlzYmVoYXZpbmcgaXNzdWVyLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGFsbGVnZWRJc3N1ZXI6IEVSZWY8SXNzdWVyPikgPT4gUHJvbWlzZTxib29sZWFuPn0gaXNNeUlzc3VlclxuICogU2hvdWxkIGJlIHVzZWQgd2l0aCBgaXNzdWVyLmdldEJyYW5kYCB0byBlbnN1cmUgYW4gaXNzdWVyIGFuZCBicmFuZCBtYXRjaC5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nfSBnZXRBbGxlZ2VkTmFtZVxuICogQHByb3BlcnR5IHsoKSA9PiBEaXNwbGF5SW5mbzxLPn0gZ2V0RGlzcGxheUluZm9cbiAqIEdpdmUgaW5mb3JtYXRpb24gdG8gVUkgb24gaG93IHRvIGRpc3BsYXkgdGhlIGFtb3VudC5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUGF0dGVybn0gZ2V0QW1vdW50U2hhcGVcbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gSXNzdWVyIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQGNhbGxiYWNrIElzc3VlcklzTGl2ZVxuICpcbiAqIFJldHVybiB0cnVlIGlmIHRoZSBwYXltZW50IGNvbnRpbnVlcyB0byBleGlzdC5cbiAqXG4gKiBJZiB0aGUgcGF5bWVudCBpcyBhIHByb21pc2UsIHRoZSBvcGVyYXRpb24gd2lsbCBwcm9jZWVkIHVwb25cbiAqIHJlc29sdXRpb24uXG4gKlxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ+fSBwYXltZW50XG4gKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAqL1xuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQGNhbGxiYWNrIElzc3VlckdldEFtb3VudE9mXG4gKlxuICogR2V0IHRoZSBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgaW4gdGhlIHBheW1lbnQuIEJlY2F1c2UgdGhlXG4gKiBwYXltZW50IGlzIG5vdCB0cnVzdGVkLCB3ZSBjYW5ub3QgY2FsbCBhIG1ldGhvZCBvbiBpdCBkaXJlY3RseSwgYW5kXG4gKiBtdXN0IHVzZSB0aGUgaXNzdWVyIGluc3RlYWQuXG4gKlxuICogSWYgdGhlIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aGUgb3BlcmF0aW9uIHdpbGwgcHJvY2VlZCB1cG9uXG4gKiByZXNvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50Pn0gcGF5bWVudFxuICogQHJldHVybnMge1Byb21pc2U8QW1vdW50PEs+Pn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBJc3N1ZXJCdXJuXG4gKlxuICogQnVybiBhbGwgb2YgdGhlIGRpZ2l0YWwgYXNzZXRzIGluIHRoZVxuICogcGF5bWVudC4gYG9wdEFtb3VudGAgaXMgb3B0aW9uYWwuIElmIGBvcHRBbW91bnRgIGlzIHByZXNlbnQsIHRoZVxuICogY29kZSB3aWxsIGluc2lzdCB0aGF0IHRoZSBhbW91bnQgb2YgdGhlIGRpZ2l0YWwgYXNzZXRzIGluIHRoZVxuICogcGF5bWVudCBpcyBlcXVhbCB0byBgb3B0QW1vdW50YCwgdG8gcHJldmVudCBzZW5kaW5nIHRoZSB3cm9uZ1xuICogcGF5bWVudCBhbmQgb3RoZXIgY29uZnVzaW9uLlxuICpcbiAqIElmIHRoZSBwYXltZW50IGlzIGEgcHJvbWlzZSwgdGhlIG9wZXJhdGlvbiB3aWxsIHByb2NlZWQgdXBvblxuICogcmVzb2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudD59IHBheW1lbnRcbiAqIEBwYXJhbSB7UGF0dGVybn0gW29wdEFtb3VudFNoYXBlXVxuICogQHJldHVybnMge1Byb21pc2U8QW1vdW50Pn1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAY2FsbGJhY2sgSXNzdWVyQ2xhaW1cbiAqXG4gKiBUcmFuc2ZlciBhbGwgZGlnaXRhbCBhc3NldHMgZnJvbSB0aGUgcGF5bWVudCB0byBhIG5ldyBwYXltZW50IGFuZFxuICogZGVsZXRlIHRoZSBvcmlnaW5hbC4gYG9wdEFtb3VudGAgaXMgb3B0aW9uYWwuIElmIGBvcHRBbW91bnRgIGlzXG4gKiBwcmVzZW50LCB0aGUgY29kZSB3aWxsIGluc2lzdCB0aGF0IHRoZSBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgaW5cbiAqIHRoZSBwYXltZW50IGlzIGVxdWFsIHRvIGBvcHRBbW91bnRgLCB0byBwcmV2ZW50IHNlbmRpbmcgdGhlIHdyb25nXG4gKiBwYXltZW50IGFuZCBvdGhlciBjb25mdXNpb24uXG4gKlxuICogSWYgdGhlIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aGUgb3BlcmF0aW9uIHdpbGwgcHJvY2VlZCB1cG9uXG4gKiByZXNvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50PEs+Pn0gcGF5bWVudFxuICogQHBhcmFtIHtQYXR0ZXJufSBbb3B0QW1vdW50U2hhcGVdXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxQYXltZW50PEs+Pn1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAY2FsbGJhY2sgSXNzdWVyQ29tYmluZVxuICpcbiAqIENvbWJpbmUgbXVsdGlwbGUgcGF5bWVudHMgaW50byBvbmUgcGF5bWVudC5cbiAqXG4gKiBJZiBhbnkgb2YgdGhlIHBheW1lbnRzIGlzIGEgcHJvbWlzZSwgdGhlIG9wZXJhdGlvbiB3aWxsIHByb2NlZWRcbiAqIHVwb24gcmVzb2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudDxLPj5bXX0gcGF5bWVudHNBcnJheVxuICogQHBhcmFtIHtBbW91bnQ8Sz59IFtvcHRUb3RhbEFtb3VudF1cbiAqIEByZXR1cm5zIHtQcm9taXNlPFBheW1lbnQ8Sz4+fVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBjYWxsYmFjayBJc3N1ZXJTcGxpdFxuICpcbiAqIFNwbGl0IGEgc2luZ2xlIHBheW1lbnQgaW50byB0d28gcGF5bWVudHMsXG4gKiBBIGFuZCBCLCBhY2NvcmRpbmcgdG8gdGhlIHBheW1lbnRBbW91bnRBIHBhc3NlZCBpbi5cbiAqXG4gKiBJZiB0aGUgcGF5bWVudCBpcyBhIHByb21pc2UsIHRoZSBvcGVyYXRpb24gd2lsbCBwcm9jZWVkIHVwb25cbiAqIHJlc29sdXRpb24uXG4gKlxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ8Sz4+fSBwYXltZW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcGF5bWVudEFtb3VudEFcbiAqIEByZXR1cm5zIHtQcm9taXNlPFBheW1lbnQ8Sz5bXT59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSXNzdWVyU3BsaXRNYW55XG4gKlxuICogU3BsaXQgYSBzaW5nbGUgcGF5bWVudCBpbnRvIG1hbnkgcGF5bWVudHMsIGFjY29yZGluZyB0byB0aGUgYW1vdW50c1xuICogcGFzc2VkIGluLlxuICpcbiAqIElmIHRoZSBwYXltZW50IGlzIGEgcHJvbWlzZSwgdGhlIG9wZXJhdGlvbiB3aWxsIHByb2NlZWQgdXBvblxuICogcmVzb2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudD59IHBheW1lbnRcbiAqIEBwYXJhbSB7QW1vdW50W119IGFtb3VudHNcbiAqIEByZXR1cm5zIHtQcm9taXNlPFBheW1lbnRbXT59XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gSXNzdWVyXG4gKlxuICogVGhlIGlzc3VlciBjYW5ub3QgbWludCBhIG5ldyBhbW91bnQsIGJ1dCBpdCBjYW4gY3JlYXRlIGVtcHR5IHB1cnNlc1xuICogYW5kIHBheW1lbnRzLiBUaGUgaXNzdWVyIGNhbiBhbHNvIHRyYW5zZm9ybSBwYXltZW50cyAoc3BsaXR0aW5nXG4gKiBwYXltZW50cywgY29tYmluaW5nIHBheW1lbnRzLCBidXJuaW5nIHBheW1lbnRzLCBhbmQgY2xhaW1pbmdcbiAqIHBheW1lbnRzIGV4Y2x1c2l2ZWx5KS4gVGhlIGlzc3VlciBzaG91bGQgYmUgZ290dGVuIGZyb20gYSB0cnVzdGVkXG4gKiBzb3VyY2UgYW5kIHRoZW4gcmVsaWVkIHVwb24gYXMgdGhlIGRlY2lkZXIgb2Ygd2hldGhlciBhbiB1bnRydXN0ZWRcbiAqIHBheW1lbnQgaXMgdmFsaWQuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBCcmFuZDxLPn0gZ2V0QnJhbmQgR2V0IHRoZSBCcmFuZCBmb3IgdGhpcyBJc3N1ZXIuIFRoZVxuICogQnJhbmQgaW5kaWNhdGVzIHRoZSB0eXBlIG9mIGRpZ2l0YWwgYXNzZXQgYW5kIGlzIHNoYXJlZCBieSB0aGVcbiAqIG1pbnQsIHRoZSBpc3N1ZXIsIGFuZCBhbnkgcHVyc2VzIGFuZCBwYXltZW50cyBvZiB0aGlzIHBhcnRpY3VsYXJcbiAqIGtpbmQuIFRoZSBicmFuZCBpcyBub3QgY2xvc2VseSBoZWxkLCBzbyB0aGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmVcbiAqIHRydXN0ZWQgdG8gaWRlbnRpZnkgYW4gaXNzdWVyIGFsb25lLiBGYWtlIGRpZ2l0YWwgYXNzZXRzIGFuZCBhbW91bnRcbiAqIGNhbiB1c2UgYW5vdGhlciBpc3N1ZXIncyBicmFuZC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gZ2V0QWxsZWdlZE5hbWUgR2V0IHRoZSBhbGxlZ2VkTmFtZSBmb3JcbiAqIHRoaXMgbWludC9pc3N1ZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQXNzZXRLaW5kfSBnZXRBc3NldEtpbmQgR2V0IHRoZSBraW5kIG9mXG4gKiBNYXRoSGVscGVycyB1c2VkIGJ5IHRoaXMgSXNzdWVyLlxuICogQHByb3BlcnR5IHsoKSA9PiBEaXNwbGF5SW5mb30gZ2V0RGlzcGxheUluZm8gR2l2ZSBpbmZvcm1hdGlvbiB0byBVSVxuICogIG9uIGhvdyB0byBkaXNwbGF5IGFtb3VudHMgZm9yIHRoaXMgaXNzdWVyLlxuICogQHByb3BlcnR5IHsoKSA9PiBQdXJzZTxLPn0gbWFrZUVtcHR5UHVyc2UgTWFrZSBhbiBlbXB0eSBwdXJzZSBvZiB0aGlzXG4gKiBicmFuZC5cbiAqIEBwcm9wZXJ0eSB7SXNzdWVySXNMaXZlfSBpc0xpdmVcbiAqIEBwcm9wZXJ0eSB7SXNzdWVyR2V0QW1vdW50T2Y8Sz59IGdldEFtb3VudE9mXG4gKiBAcHJvcGVydHkge0lzc3VlckJ1cm59IGJ1cm5cbiAqIEBwcm9wZXJ0eSB7SXNzdWVyQ2xhaW08Sz59IGNsYWltXG4gKiBAcHJvcGVydHkge0lzc3VlckNvbWJpbmU8Sz59IGNvbWJpbmVcbiAqIEBwcm9wZXJ0eSB7SXNzdWVyU3BsaXQ8Sz59IHNwbGl0XG4gKiBAcHJvcGVydHkge0lzc3VlclNwbGl0TWFueX0gc3BsaXRNYW55XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gUGF5bWVudExlZGdlclxuICogQHByb3BlcnR5IHtNaW50PEs+fSBtaW50XG4gKiBAcHJvcGVydHkge1B1cnNlPEs+fSBtaW50UmVjb3ZlcnlQdXJzZVxuICogQHByb3BlcnR5IHtJc3N1ZXI8Sz59IGlzc3VlclxuICogQHByb3BlcnR5IHtCcmFuZDxLPn0gYnJhbmRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJc3N1ZXJLaXRcbiAqIEBwcm9wZXJ0eSB7TWludDxLPn0gbWludFxuICogQHByb3BlcnR5IHtQdXJzZTxLPn0gbWludFJlY292ZXJ5UHVyc2VcbiAqIEBwcm9wZXJ0eSB7SXNzdWVyPEs+fSBpc3N1ZXJcbiAqIEBwcm9wZXJ0eSB7QnJhbmQ8Sz59IGJyYW5kXG4gKiBAcHJvcGVydHkge0Rpc3BsYXlJbmZvfSBkaXNwbGF5SW5mb1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQWRkaXRpb25hbERpc3BsYXlJbmZvXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZWNpbWFsUGxhY2VzXSBUZWxscyB0aGUgZGlzcGxheSBzb2Z0d2FyZSBob3dcbiAqICAgbWFueSBkZWNpbWFsIHBsYWNlcyB0byBtb3ZlIHRoZSBkZWNpbWFsIG92ZXIgdG8gdGhlIGxlZnQsIG9yIGluXG4gKiAgIG90aGVyIHdvcmRzLCB3aGljaCBwb3NpdGlvbiBjb3JyZXNwb25kcyB0byB3aG9sZSBudW1iZXJzLiBXZVxuICogICByZXF1aXJlIGZ1bmdpYmxlIGRpZ2l0YWwgYXNzZXRzIHRvIGJlIHJlcHJlc2VudGVkIGluIGludGVnZXJzLCBpblxuICogICB0aGUgc21hbGxlc3QgdW5pdCAoaS5lLiBVU0QgbWlnaHQgYmUgcmVwcmVzZW50ZWQgaW4gbWlsbCwgYVxuICogICB0aG91c2FuZHRoIG9mIGEgZG9sbGFyLiBJbiB0aGF0IGNhc2UsIGBkZWNpbWFsUGxhY2VzYCB3b3VsZCBiZVxuICogICAzLikgVGhpcyBwcm9wZXJ0eSBpcyBvcHRpb25hbCwgYW5kIGZvciBub24tZnVuZ2libGUgZGlnaXRhbFxuICogICBhc3NldHMsIHNob3VsZCBub3QgYmUgc3BlY2lmaWVkLiBUaGUgZGVjaW1hbFBsYWNlcyBwcm9wZXJ0eVxuICogICBzaG91bGQgYmUgdXNlZCBmb3IgKmRpc3BsYXkgcHVycG9zZXMgb25seSouIEFueSBvdGhlciB1c2UgaXMgYW5cbiAqICAgYW50aS1wYXR0ZXJuLlxuICogQHByb3BlcnR5IHtBc3NldEtpbmR9IFthc3NldEtpbmRdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnQGFnb3JpYy9zd2luZ3NldC12YXQnKS5TaHV0ZG93bldpdGhGYWlsdXJlfSBTaHV0ZG93bldpdGhGYWlsdXJlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gTWludFxuICogSG9sZGluZyBhIE1pbnQgY2FycmllcyB0aGUgcmlnaHQgdG8gaXNzdWUgbmV3IGRpZ2l0YWwgYXNzZXRzLiBUaGVzZVxuICogYXNzZXRzIGFsbCBoYXZlIHRoZSBzYW1lIGtpbmQsIHdoaWNoIGlzIGNhbGxlZCBhIEJyYW5kLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSXNzdWVyPEs+fSBnZXRJc3N1ZXIgR2V0cyB0aGUgSXNzdWVyIGZvciB0aGlzIG1pbnQuXG4gKiBAcHJvcGVydHkgeyhuZXdBbW91bnQ6IEFtb3VudDxLPikgPT4gUGF5bWVudDxLPn0gbWludFBheW1lbnRcbiAqIENyZWF0ZXMgYSBuZXcgUGF5bWVudCBjb250YWluaW5nIG5ld2x5IG1pbnRlZCBhbW91bnQuXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgRGVwb3NpdEZhY2V0UmVjZWl2ZVxuICogQHBhcmFtIHtQYXltZW50fSBwYXltZW50XG4gKiBAcGFyYW0ge1BhdHRlcm59IFtvcHRBbW91bnRTaGFwZV1cbiAqIEByZXR1cm5zIHtBbW91bnR9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZXBvc2l0RmFjZXRcbiAqIEBwcm9wZXJ0eSB7RGVwb3NpdEZhY2V0UmVjZWl2ZX0gcmVjZWl2ZVxuICogRGVwb3NpdCBhbGwgdGhlIGNvbnRlbnRzIG9mIHBheW1lbnQgaW50byB0aGUgcHVyc2UgdGhhdCBtYWRlIHRoaXMgZmFjZXQsXG4gKiByZXR1cm5pbmcgdGhlIGFtb3VudC4gSWYgdGhlIG9wdGlvbmFsIGFyZ3VtZW50IGBvcHRBbW91bnRgIGRvZXMgbm90IGVxdWFsIHRoZVxuICogYW1vdW50IG9mIGRpZ2l0YWwgYXNzZXRzIGluIHRoZSBwYXltZW50LCB0aHJvdyBhbiBlcnJvci5cbiAqXG4gKiBJZiBwYXltZW50IGlzIGEgcHJvbWlzZSwgdGhyb3cgYW4gZXJyb3IuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQGNhbGxiYWNrIFB1cnNlRGVwb3NpdFxuICogQHBhcmFtIHtQYXltZW50PEs+fSBwYXltZW50XG4gKiBAcGFyYW0ge1BhdHRlcm59IFtvcHRBbW91bnRTaGFwZV1cbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gUHVyc2VcbiAqIFB1cnNlcyBob2xkIGFtb3VudCBvZiBkaWdpdGFsIGFzc2V0cyBvZiB0aGUgc2FtZSBicmFuZCwgYnV0IHVubGlrZSBQYXltZW50cyxcbiAqIHRoZXkgYXJlIG5vdCBtZWFudCB0byBiZSBzZW50IHRvIG90aGVycy4gVG8gdHJhbnNmZXIgZGlnaXRhbCBhc3NldHMsIGFcbiAqIFBheW1lbnQgc2hvdWxkIGJlIHdpdGhkcmF3biBmcm9tIGEgUHVyc2UuIFRoZSBhbW91bnQgb2YgZGlnaXRhbFxuICogYXNzZXRzIGluIGEgcHVyc2UgY2FuIGNoYW5nZSB0aHJvdWdoIHRoZSBhY3Rpb24gb2YgZGVwb3NpdCgpIGFuZCB3aXRoZHJhdygpLlxuICpcbiAqIFRoZSBwcmltYXJ5IHVzZSBmb3IgUHVyc2VzIGFuZCBQYXltZW50cyBpcyBmb3IgY3VycmVuY3ktbGlrZSBhbmQgZ29vZHMtbGlrZVxuICogZGlnaXRhbCBhc3NldHMsIGJ1dCB0aGV5IGNhbiBhbHNvIGJlIHVzZWQgdG8gcmVwcmVzZW50IG90aGVyIGtpbmRzIG9mIHJpZ2h0cyxcbiAqIHN1Y2ggYXMgdGhlIHJpZ2h0IHRvIHBhcnRpY2lwYXRlIGluIGEgcGFydGljdWxhciBjb250cmFjdC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IEJyYW5kPEs+fSBnZXRBbGxlZ2VkQnJhbmQgR2V0IHRoZSBhbGxlZ2VkIEJyYW5kIGZvciB0aGlzIFB1cnNlXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBBbW91bnQ8Sz59IGdldEN1cnJlbnRBbW91bnRcbiAqIEdldCB0aGUgYW1vdW50IGNvbnRhaW5lZCBpbiB0aGlzIHB1cnNlLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTm90aWZpZXI8QW1vdW50PEs+Pn0gZ2V0Q3VycmVudEFtb3VudE5vdGlmaWVyXG4gKiBHZXQgYSBsb3NzeSBub3RpZmllciBmb3IgY2hhbmdlcyB0byB0aGlzIHB1cnNlJ3MgYmFsYW5jZS5cbiAqXG4gKiBAcHJvcGVydHkge1B1cnNlRGVwb3NpdDxLPn0gZGVwb3NpdFxuICogRGVwb3NpdCBhbGwgdGhlIGNvbnRlbnRzIG9mIHBheW1lbnQgaW50byB0aGlzIHB1cnNlLCByZXR1cm5pbmcgdGhlXG4gKiBhbW91bnQuIElmIHRoZSBvcHRpb25hbCBhcmd1bWVudCBgb3B0QW1vdW50YCBkb2VzIG5vdCBlcXVhbCB0aGVcbiAqIGFtb3VudCBvZiBkaWdpdGFsIGFzc2V0cyBpbiB0aGUgcGF5bWVudCwgdGhyb3cgYW4gZXJyb3IuXG4gKlxuICogSWYgcGF5bWVudCBpcyBhIHByb21pc2UsIHRocm93IGFuIGVycm9yLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gRGVwb3NpdEZhY2V0fSBnZXREZXBvc2l0RmFjZXRcbiAqIFJldHVybiBhbiBvYmplY3Qgd2hvc2UgYHJlY2VpdmVgIG1ldGhvZCBkZXBvc2l0cyB0byB0aGUgY3VycmVudCBQdXJzZS5cbiAqXG4gKiBAcHJvcGVydHkgeyhhbW91bnQ6IEFtb3VudDxLPikgPT4gUGF5bWVudDxLPn0gd2l0aGRyYXdcbiAqIFdpdGhkcmF3IGFtb3VudCBmcm9tIHRoaXMgcHVyc2UgaW50byBhIG5ldyBQYXltZW50LlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQ29weVNldDxQYXltZW50PEs+Pn0gZ2V0UmVjb3ZlcnlTZXRcbiAqIFRoZSBzZXQgb2YgcGF5bWVudHMgd2l0aGRyYXduIGZyb20gdGhpcyBwdXJzZSB0aGF0IGFyZSBzdGlsbCBsaXZlLiBUaGVzZVxuICogYXJlIHRoZSBwYXltZW50cyB0aGF0IGNhbiBzdGlsbCBiZSByZWNvdmVyZWQgaW4gZW1lcmdlbmNpZXMgYnksIGZvciBleGFtcGxlLFxuICogZGVwb3NpdGluZyBpbnRvIHRoaXMgcHVyc2UuIFN1Y2ggYSBkZXBvc2l0IGFjdGlvbiBpcyBsaWtlIGNhbmNlbGluZyBhblxuICogb3V0c3RhbmRpbmcgY2hlY2sgYmVjYXVzZSB5b3UncmUgdGlyZWQgb2Ygd2FpdGluZyBmb3IgaXQuIE9uY2UgeW91clxuICogY2FuY2VsbGF0aW9uIGlzIGFja25vd2xlZGdlZCwgeW91IGNhbiBzcGVuZCB0aGUgYXNzZXRzIGF0IHN0YWtlIG9uIG90aGVyXG4gKiB0aGluZ3MuIEFmdGVyd2FyZHMsIGlmIHRoZSByZWNpcGllbnQgb2YgdGhlIG9yaWdpbmFsIGNoZWNrIGZpbmFsbHkgZ2V0c1xuICogYXJvdW5kIHRvIGRlcG9zaXRpbmcgaXQsIHRoZWlyIGRlcG9zaXQgZmFpbHMuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBBbW91bnQ8Sz59IHJlY292ZXJBbGxcbiAqIEZvciB1c2UgaW4gZW1lcmdlbmNpZXMsIHN1Y2ggYXMgY29taW5nIGJhY2sgZnJvbSBhIHRyYXVtYXRpYyBjcmFzaCBhbmRcbiAqIHVwZ3JhZGUuIFRoaXMgZGVwb3NpdHMgYWxsIHRoZSBwYXltZW50cyBpbiB0aGlzIHB1cnNlJ3MgcmVjb3Zlcnkgc2V0XG4gKiBpbnRvIHRoZSBwdXJzZSBpdHNlbGYsIHJldHVybmluZyB0aGUgdG90YWwgYW1vdW50IG9mIGFzc2V0cyByZWNvdmVyZWQuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gUGF5bWVudFxuICogUGF5bWVudHMgaG9sZCBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgb2YgdGhlIHNhbWUgYnJhbmQgaW4gdHJhbnNpdC4gUGF5bWVudHNcbiAqIGNhbiBiZSBkZXBvc2l0ZWQgaW4gcHVyc2VzLCBzcGxpdCBpbnRvIG11bHRpcGxlIHBheW1lbnRzLCBjb21iaW5lZCwgYW5kXG4gKiBjbGFpbWVkIChnZXR0aW5nIGFuIGV4Y2x1c2l2ZSBwYXltZW50KS4gUGF5bWVudHMgYXJlIGxpbmVhciwgbWVhbmluZ1xuICogdGhhdCBlaXRoZXIgYSBwYXltZW50IGhhcyB0aGUgc2FtZSBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgaXRcbiAqIHN0YXJ0ZWQgd2l0aCwgb3IgaXQgaXMgdXNlZCB1cCBlbnRpcmVseS4gSXQgaXMgaW1wb3NzaWJsZSB0byBwYXJ0aWFsbHkgdXNlIGFcbiAqIHBheW1lbnQuXG4gKlxuICogUGF5bWVudHMgYXJlIG9mdGVuIHJlY2VpdmVkIGZyb20gb3RoZXIgYWN0b3JzIGFuZCB0aGVyZWZvcmUgc2hvdWxkXG4gKiBub3QgYmUgdHJ1c3RlZCB0aGVtc2VsdmVzLiBUbyBnZXQgdGhlIGFtb3VudCBvZiBkaWdpdGFsIGFzc2V0cyBpbiBhIHBheW1lbnQsXG4gKiB1c2UgdGhlIHRydXN0ZWQgaXNzdWVyOiBpc3N1ZXIuZ2V0QW1vdW50T2YocGF5bWVudCksXG4gKlxuICogUGF5bWVudHMgY2FuIGJlIGNvbnZlcnRlZCB0byBQdXJzZXMgYnkgZ2V0dGluZyBhIHRydXN0ZWQgaXNzdWVyIGFuZFxuICogY2FsbGluZyBgaXNzdWVyLm1ha2VFbXB0eVB1cnNlKClgIHRvIGNyZWF0ZSBhIHB1cnNlLCB0aGVuXG4gKiBgcHVyc2UuZGVwb3NpdChwYXltZW50KWAuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBCcmFuZDxLPn0gZ2V0QWxsZWdlZEJyYW5kXG4gKiBHZXQgdGhlIGFsbGVnZWRCcmFuZCwgaW5kaWNhdGluZyB0aGUgdHlwZSBvZiBkaWdpdGFsIGFzc2V0IHRoaXNcbiAqIHBheW1lbnQgcHVycG9ydHMgdG8gYmUsIGFuZCB3aGljaCBpc3N1ZXIgdG8gdXNlLiBCZWNhdXNlIHBheW1lbnRzXG4gKiBhcmUgbm90IHRydXN0ZWQsIGFueSBtZXRob2QgY2FsbHMgb24gcGF5bWVudHMgc2hvdWxkIGJlIHRyZWF0ZWRcbiAqIHdpdGggc3VzcGljaW9uIGFuZCB2ZXJpZmllZCBlbHNld2hlcmUuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Ftb3VudFZhbHVlfSBWXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNYXRoSGVscGVyc1xuICogQWxsIG9mIHRoZSBkaWZmZXJlbmNlIGluIGhvdyBkaWdpdGFsIGFzc2V0IGFtb3VudCBhcmUgbWFuaXB1bGF0ZWQgY2FuIGJlXG4gKiByZWR1Y2VkIHRvIHRoZSBiZWhhdmlvciBvZiB0aGUgbWF0aCBvbiB2YWx1ZXMuIFdlIGV4dHJhY3QgdGhpc1xuICogY3VzdG9tIGxvZ2ljIGludG8gbWF0aEhlbHBlcnMuIE1hdGhIZWxwZXJzIGFyZSBhYm91dCB2YWx1ZVxuICogYXJpdGhtZXRpYywgd2hlcmVhcyBBbW91bnRNYXRoIGlzIGFib3V0IGFtb3VudHMsIHdoaWNoIGFyZSB0aGVcbiAqIHZhbHVlcyBsYWJlbGVkIHdpdGggYSBicmFuZC4gQW1vdW50TWF0aCB1c2UgbWF0aEhlbHBlcnMgdG8gZG8gdGhlaXIgdmFsdWVcbiAqIGFyaXRobWV0aWMsIGFuZCB0aGVuIGJyYW5kIHRoZSByZXN1bHRzLCBtYWtpbmcgYSBuZXcgYW1vdW50LlxuICpcbiAqIFRoZSBNYXRoSGVscGVycyBhcmUgZGVzaWduZWQgdG8gYmUgY2FsbGVkIG9ubHkgZnJvbSBBbW91bnRNYXRoLCBhbmQgc29cbiAqIGFsbCBtZXRob2RzIGJ1dCBjb2VyY2UgY2FuIGFzc3VtZSB0aGVpciBpbnB1dHMgYXJlIHZhbGlkLiBUaGV5IG9ubHlcbiAqIG5lZWQgdG8gZG8gb3V0cHV0IHZhbGlkYXRpb24sIGFuZCBvbmx5IHdoZW4gdGhlcmUgaXMgYSBwb3NzaWJpbGl0eSBvZlxuICogaW52YWxpZCBvdXRwdXQuXG4gKlxuICogQHByb3BlcnR5IHsoYWxsZWdlZFZhbHVlOiBWKSA9PiBWfSBkb0NvZXJjZVxuICogQ2hlY2sgdGhlIGtpbmQgb2YgdGhpcyB2YWx1ZSBhbmQgdGhyb3cgaWYgaXQgaXMgbm90IHRoZVxuICogZXhwZWN0ZWQga2luZC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IFZ9IGRvTWFrZUVtcHR5XG4gKiBHZXQgdGhlIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgaWRlbnRpdHkgZWxlbWVudCAob2Z0ZW4gMCBvciBhblxuICogZW1wdHkgYXJyYXkpXG4gKlxuICogQHByb3BlcnR5IHsodmFsdWU6IFYpID0+IGJvb2xlYW59IGRvSXNFbXB0eVxuICogSXMgdGhlIHZhbHVlIHRoZSBpZGVudGl0eSBlbGVtZW50P1xuICpcbiAqIEBwcm9wZXJ0eSB7KGxlZnQ6IFYsIHJpZ2h0OiBWKSA9PiBib29sZWFufSBkb0lzR1RFXG4gKiBJcyB0aGUgbGVmdCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHJpZ2h0P1xuICpcbiAqIEBwcm9wZXJ0eSB7KGxlZnQ6IFYsIHJpZ2h0OiBWKSA9PiBib29sZWFufSBkb0lzRXF1YWxcbiAqIERvZXMgbGVmdCBlcXVhbCByaWdodD9cbiAqXG4gKiBAcHJvcGVydHkgeyhsZWZ0OiBWLCByaWdodDogVikgPT4gVn0gZG9BZGRcbiAqIFJldHVybiB0aGUgbGVmdCBjb21iaW5lZCB3aXRoIHRoZSByaWdodC5cbiAqXG4gKiBAcHJvcGVydHkgeyhsZWZ0OiBWLCByaWdodDogVikgPT4gVn0gZG9TdWJ0cmFjdFxuICogUmV0dXJuIHdoYXQgcmVtYWlucyBhZnRlciByZW1vdmluZyB0aGUgcmlnaHQgZnJvbSB0aGUgbGVmdC4gSWZcbiAqIHNvbWV0aGluZyBpbiB0aGUgcmlnaHQgd2FzIG5vdCBpbiB0aGUgbGVmdCwgd2UgdGhyb3cgYW4gZXJyb3IuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7YmlnaW50fSBOYXRWYWx1ZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge01hdGhIZWxwZXJzPE5hdFZhbHVlPn0gTmF0TWF0aEhlbHBlcnNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtBcnJheTxLZXk+fSBTZXRWYWx1ZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge01hdGhIZWxwZXJzPFNldFZhbHVlPn0gU2V0TWF0aEhlbHBlcnNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtDb3B5U2V0PEtleT59IENvcHlTZXRWYWx1ZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge01hdGhIZWxwZXJzPENvcHlTZXRWYWx1ZT59IENvcHlTZXRNYXRoSGVscGVyc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0NvcHlCYWc8S2V5Pn0gQ29weUJhZ1ZhbHVlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7TWF0aEhlbHBlcnM8Q29weUJhZ1ZhbHVlPn0gQ29weUJhZ01hdGhIZWxwZXJzXG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAXc3uDlcBAABXAQAAJQAAAEBhZ29yaWMvZ292ZXJuYW5jZS12MC45LjEvZXhwb3J0ZWQuanN7ImltcG9ydHMiOlsiLi9zcmMvdHlwZXMtYW1iaWVudC5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACSif7VDF4AAAxeAAAuAAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjkuMS9zcmMvdHlwZXMtYW1iaWVudC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qKlxuICogQHR5cGVkZWYgeyAndW5yYW5rZWQnIHwgJ29yZGVyJyB8ICdwbHVyYWxpdHknIH0gQ2hvaWNlTWV0aG9kXG4gKiAqIFVOUkFOS0VEOiBcInVucmFua2VkIHZvdGluZ1wiIG1lYW5zIHRoYXQgdGhlIHZvdGVyIHNwZWNpZmllcyBzb21lIG51bWJlciBvZlxuICogICAgcG9zaXRpb25zLCBhbmQgaXMgZW5kb3JzaW5nIHRoZW0gZXF1YWxseS5cbiAqICogT1JERVI6IFRoZSB2b3RlciBhc3NpZ25zIG9yZGluYWwgbnVtYmVycyB0byBzb21lIG9mIHRoZSBwb3NpdGlvbnMuIFRoZVxuICogICAgcG9zaXRpb25zIHdpbGwgYmUgdHJlYXRlZCBhcyBhbiBvcmRlcmVkIGxpc3Qgd2l0aCBubyBnYXBzLlxuICpcbiAqIFdoZW4gdm90ZXJzIGFyZSBsaW1pdGVkIHRvIGNob29zaW5nIGEgc2luZ2xlIGNhbmRpZGF0ZSwgZWl0aGVyIFVOUkFOS0VEIG9yXG4gKiBPUkRFUiB3b3VsZCB3b3JrLiBVTlJBTktFRCBoYXMgYSBzaW1wbGVyIHJlcHJlc2VudGF0aW9uIHNvIHdlIHVzZSB0aGF0LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyAncGFyYW1fY2hhbmdlJyB8ICdlbGVjdGlvbicgfCAnc3VydmV5JyB8ICdhcGlfaW52b2NhdGlvbicgfFxuICogICAnb2ZmZXJfZmlsdGVyJyB9IEVsZWN0aW9uVHlwZVxuICogcGFyYW1fY2hhbmdlIGlzIHZlcnkgc3BlY2lmaWMuIFN1cnZleSBtZWFucyBtdWx0aXBsZSBhbnN3ZXJzIGFyZSBwb3NzaWJsZSxcbiAqIEVsZWN0aW9uIG1lYW5zIHNvbWUgY2FuZGlkYXRlcyBhcmUgZ29pbmcgdG8gXCJ3aW5cIi4gSXQncyBub3QgY2xlYXIgdGhlc2UgYXJlXG4gKiBvcnRob2dvbmFsLiBUaGUgaW1wb3J0YW50IGRpc3RpbmN0aW9uIGlzIHRoYXQgcGFyYW1fY2hhbmdlIGhhcyBhIHN0cnVjdHVyZWRcbiAqIGlzc3VlLCB3aGlsZSB0aGUgb3RoZXJzIGhhdmUgYSBpc3N1ZSBwcmVzZW50ZWQgYXMgYSBzdHJpbmcuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL2NvbnN0YW50cy5qcycpLlBhcmFtVHlwZX0gUGFyYW1UeXBlICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyAnbWFqb3JpdHknIHwgJ2FsbCcgfCAnbm9fcXVvcnVtJyB9IFF1b3J1bVJ1bGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNpbXBsZUlzc3VlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGV4dFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyBBbW91bnQgfCBCcmFuZCB8IEluc3RhbGxhdGlvbiB8IEluc3RhbmNlIHwgYmlnaW50IHxcbiAqICAgUmF0aW8gfCBzdHJpbmcgfCBYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXN0YW1wUmVjb3JkIHxcbiAqICAgWGltcG9ydCgnQGFnb3JpYy90aW1lL3NyYy90eXBlcycpLlJlbGF0aXZlVGltZVJlY29yZCB8IHVua25vd24gfSBQYXJhbVZhbHVlXG4gKi9cblxuLyogWFhYIGJldHRlciB0byB1c2UgdGhlIG1hbmlmZXN0IGNvbnN0YW50IFBhcmFtVHlwZXMqL1xuLyogYnV0IGltcG9ydGluZyB0aGF0IGhlcmUgdHVybnMgdGhpcyBmaWxlIGludG8gYSBtb2R1bGUsKi9cbi8qIGJyZWFraW5nIHRoZSBhbWJpZW50IHR5cGluZyovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UGFyYW1UeXBlfSBUXG4gKiBAdHlwZWRlZiB7VCBleHRlbmRzICdhbW91bnQnID8gQW1vdW50IDpcbiAqIFQgZXh0ZW5kcyAnYnJhbmQnID8gQnJhbmQgOlxuICogVCBleHRlbmRzICdpbnN0YWxsYXRpb24nID8gSW5zdGFsbGF0aW9uOlxuICogVCBleHRlbmRzICdpbnN0YW5jZScgPyBJbnN0YW5jZSA6XG4gKiBUIGV4dGVuZHMgJ2ludml0YXRpb24nID8gQW1vdW50IDogLy8gWFhYIHRoaXMgaXMgdGhlIGdldHRlciB2YWx1ZSBidXQgbm90IHRoZSBzZXR0ZXJcbiAqIFQgZXh0ZW5kcyAnbmF0JyA/IGJpZ2ludCA6XG4gKiBUIGV4dGVuZHMgJ3JhdGlvJyA/IFJhdGlvIDpcbiAqIFQgZXh0ZW5kcyAnc3RyaW5nJyA/IHN0cmluZyA6XG4gKiBUIGV4dGVuZHMgJ3RpbWVzdGFtcCcgPyBYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXN0YW1wUmVjb3JkIDpcbiAqIFQgZXh0ZW5kcyAncmVsYXRpdmVUaW1lJyA/IFhpbXBvcnQoJ0BhZ29yaWMvdGltZS9zcmMvdHlwZXMnKS5SZWxhdGl2ZVRpbWVSZWNvcmQgOlxuICogVCBleHRlbmRzICd1bmtub3duJyA/IHVua25vd24gOlxuICogbmV2ZXJcbiAqIH0gUGFyYW1WYWx1ZUZvclR5cGVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UGFyYW1UeXBlfSBbVD1QYXJhbVR5cGVdXG4gKiBAdHlwZWRlZiB7eyB0eXBlOiBULCB2YWx1ZTogUGFyYW1WYWx1ZUZvclR5cGU8VD4gfX0gUGFyYW1WYWx1ZVR5cGVkPFQ+XG4gKi9cblxuLyoqXG4gKiBUZXJtcyBhIGNvbnRyYWN0IG11c3QgcHJvdmlkZSBpbiBvcmRlciB0byBiZSBnb3Zlcm5lZC5cbiAqXG4gKiBAdGVtcGxhdGUge1hpbXBvcnQoJy4vY29udHJhY3RHb3Zlcm5hbmNlL3R5cGVkUGFyYW1NYW5hZ2VyLmpzJykuUGFyYW1UeXBlc01hcH0gVCBHb3Zlcm5lZCBwYXJhbWV0ZXJzIG9mIGNvbnRyYWN0XG4gKiBAdHlwZWRlZiB7e1xuICogICBlbGVjdGlvbk1hbmFnZXI6IFhpbXBvcnQoJ0BhZ29yaWMvem9lL3NyYy96b2VTZXJ2aWNlL3V0aWxzLmpzJykuSW5zdGFuY2U8WGltcG9ydCgnLi9jb250cmFjdEdvdmVybm9yJykuc3RhcnQ+LFxuICogICBnb3Zlcm5lZFBhcmFtczogWGltcG9ydCgnLi9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXIuanMnKS5QYXJhbVJlY29yZHNGcm9tVHlwZXM8VCAmIHtcbiAqICAgICBFbGVjdG9yYXRlOiAnaW52aXRhdGlvbidcbiAqICAgfT5cbiAqIH19IEdvdmVybmFuY2VUZXJtczxUPlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyBTaW1wbGVJc3N1ZSB8IFBhcmFtQ2hhbmdlSXNzdWU8dW5rbm93bj4gfCBBcGlJbnZvY2F0aW9uSXNzdWUgfFxuICogICBPZmZlckZpbHRlcklzc3VlIH0gSXNzdWVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFF1ZXN0aW9uVGVybXMgLSBRdWVzdGlvblNwZWMgcGx1cyB0aGUgRWxlY3RvcmF0ZSBJbnN0YW5jZSBhbmRcbiAqICAgYSBudW1lcmljYWwgdGhyZXNob2xkIGZvciB0aGUgcXVvcnVtLiAoVGhlIHZvdGVDb3VudGVyIGRvZXNuJ3Qga25vdyB0aGVcbiAqICAgc2l6ZSBvZiB0aGUgZWxlY3RvcmF0ZSwgc28gdGhlIEVsZWN0b3JhdGUgaGFzIHRvIHNheSB3aGF0IGxpbWl0IHRvIGVuZm9yY2UuKVxuICogQHByb3BlcnR5IHtRdWVzdGlvblNwZWN9IHF1ZXN0aW9uU3BlY1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHF1b3J1bVRocmVzaG9sZFxuICogQHByb3BlcnR5IHtJbnN0YW5jZX0gZWxlY3RvcmF0ZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gVGV4dFBvc2l0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGV4dFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyBUZXh0UG9zaXRpb24gfCBDaGFuZ2VQYXJhbXNQb3NpdGlvbiB8IE5vQ2hhbmdlUGFyYW1zUG9zaXRpb24gfCBJbnZva2VBcGlQb3NpdGlvbiB8IERvbnRJbnZva2VBcGlQb3NpdGlvbiB8XG4gKiAgICBPZmZlckZpbHRlclBvc2l0aW9uIHwgTm9DaGFuZ2VPZmZlckZpbHRlclBvc2l0aW9uIHwgSW52b2tlQXBpUG9zaXRpb24gfSBQb3NpdGlvblxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3sgcXVlc3Rpb246IEhhbmRsZTwnUXVlc3Rpb24nPiB9ICYgKFxuICogICB7IG91dGNvbWU6ICd3aW4nLCBwb3NpdGlvbjogUG9zaXRpb24gfSB8XG4gKiAgIHsgb3V0Y29tZTogJ2ZhaWwnLCByZWFzb246ICdObyBxdW9ydW0nIH1cbiAqICl9IE91dGNvbWVSZWNvcmRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7IHF1ZXN0aW9uOiBIYW5kbGU8J1F1ZXN0aW9uJz4gfSAmIChcbiAqICB7IG91dGNvbWU6ICd3aW4nLCBwb3NpdGlvbnM6IFBvc2l0aW9uW10gfSB8XG4gKiAgeyBvdXRjb21lOiAnZmFpbCcsIHJlYXNvbjogJ05vIHF1b3J1bScgfVxuICogKX0gTXVsdGlPdXRjb21lUmVjb3JkXG4gKi9cblxuLyoqXG4gKiBTcGVjaWZpY2F0aW9uIHdoZW4gcmVxdWVzdGluZyBjcmVhdGlvbiBvZiBhIFF1ZXN0aW9uXG4gKlxuICogQHRlbXBsYXRlIHtJc3N1ZX0gW0k9SXNzdWVdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBRdWVzdGlvblNwZWNcbiAqIEBwcm9wZXJ0eSB7Q2hvaWNlTWV0aG9kfSBtZXRob2RcbiAqIEBwcm9wZXJ0eSB7SX0gaXNzdWVcbiAqIEBwcm9wZXJ0eSB7UG9zaXRpb25bXX0gcG9zaXRpb25zXG4gKiBAcHJvcGVydHkge0VsZWN0aW9uVHlwZX0gZWxlY3Rpb25UeXBlXG4gKiBAcHJvcGVydHkge251bWJlcn0gbWF4Q2hvaWNlc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IG1heFdpbm5lcnNcbiAqIEBwcm9wZXJ0eSB7Q2xvc2luZ1J1bGV9IGNsb3NpbmdSdWxlXG4gKiBAcHJvcGVydHkge1F1b3J1bVJ1bGV9IHF1b3J1bVJ1bGVcbiAqIEBwcm9wZXJ0eSB7UG9zaXRpb259IHRpZU91dGNvbWVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFF1ZXN0aW9uRGV0YWlsc0V4dHJhUHJvcGVydGllc1xuICogQHByb3BlcnR5IHtJbnN0YW5jZX0gY291bnRlckluc3RhbmNlIC0gaW5zdGFuY2Ugb2YgdGhlIFZvdGVDb3VudGVyXG4gKiBAcHJvcGVydHkge0hhbmRsZTwnUXVlc3Rpb24nPn0gcXVlc3Rpb25IYW5kbGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtRdWVzdGlvblNwZWMgJiBRdWVzdGlvbkRldGFpbHNFeHRyYVByb3BlcnRpZXN9IFF1ZXN0aW9uRGV0YWlsc1xuICogICAgY29tcGxldGUgcXVlc3Rpb24gZGV0YWlsczogcXVlc3Rpb25TcGVjIHBsdXMgY291bnRlciBhbmQgcXVlc3Rpb25IYW5kbGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEdvdmVybmFuY2VQYWlyXG4gKiBAcHJvcGVydHkge0luc3RhbmNlfSBnb3Zlcm5vclxuICogQHByb3BlcnR5IHtJbnN0YW5jZX0gZ292ZXJuZWRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFF1ZXN0aW9uXG4gKiBAcHJvcGVydHkgeygpID0+IEluc3RhbmNlfSBnZXRWb3RlQ291bnRlclxuICogQHByb3BlcnR5IHsoKSA9PiBRdWVzdGlvbkRldGFpbHN9IGdldERldGFpbHNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENvbXBsZXRlVW5yYW5rZWRRdWVzdGlvblxuICogQHByb3BlcnR5IHtIYW5kbGU8J1F1ZXN0aW9uJz59IHF1ZXN0aW9uSGFuZGxlXG4gKiBAcHJvcGVydHkge1Bvc2l0aW9uW119IGNob3NlbiAtIGEgbGlzdCBvZiBlcXVhbC13ZWlnaHQgcHJlZmVycmVkIHBvc2l0aW9uc1xuICovXG5cbi8qIG5vdCB5ZXQgaW4gdXNlKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQ29tcGxldGVXZWlnaHRlZEJhbGxvdFxuICogQHByb3BlcnR5IHtIYW5kbGU8J1F1ZXN0aW9uJz59IHF1ZXN0aW9uSGFuZGxlXG4gKiBAcHJvcGVydHkge1tQb3NpdGlvbixiaWdpbnRdW119IHdlaWdodGVkIC0gbGlzdCBvZiBwb3NpdGlvbnMgd2l0aFxuICogICB3ZWlnaHRzLiBWb3RlQ291bnRlciBtYXkgbGltaXQgd2VpZ2h0cyB0byBhIHJhbmdlIG9yIHJlcXVpcmUgdW5pcXVlbmVzcy5cbiAqL1xuXG4vKiBub3QgeWV0IGluIHVzZSovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENvbXBsZXRlT3JkZXJlZEJhbGxvdFxuICogQHByb3BlcnR5IHtIYW5kbGU8J1F1ZXN0aW9uJz59IHF1ZXN0aW9uSGFuZGxlXG4gKiBAcHJvcGVydHkge1Bvc2l0aW9uW119IG9yZGVyZWQgLSBvcmRlcmVkIGxpc3Qgb2YgcG9zaXRpb24gZnJvbSBtb3N0IHByZWZlcnJlZFxuICogICB0byBsZWFzdCBwcmVmZXJyZWRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBvc2l0aW9uQ291bnRcbiAqIEBwcm9wZXJ0eSB7UG9zaXRpb259IHBvc2l0aW9uXG4gKiBAcHJvcGVydHkge2JpZ2ludH0gdG90YWxcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFZvdGVTdGF0aXN0aWNzXG4gKiBAcHJvcGVydHkge2JpZ2ludH0gc3BvaWxlZFxuICogQHByb3BlcnR5IHtudW1iZXJ9IHZvdGVzXG4gKiBAcHJvcGVydHkge1Bvc2l0aW9uQ291bnRbXX0gcmVzdWx0c1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUXVvcnVtQ291bnRlclxuICogQHByb3BlcnR5IHsoc3RhdHM6IFZvdGVTdGF0aXN0aWNzKSA9PiBib29sZWFufSBjaGVja1xuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEJ1aWxkUXVlc3Rpb25cbiAqIEBwYXJhbSB7UXVlc3Rpb25TcGVjfSBxdWVzdGlvblNwZWNcbiAqIEBwYXJhbSB7SW5zdGFuY2V9IGluc3RhbmNlIC0gdm90ZUNvdW50ZXIgaW5zdGFuY2VcbiAqIEByZXR1cm5zIHtRdWVzdGlvbn1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFZvdGVDb3VudGVyQ3JlYXRvckZhY2V0IC0gYSBmYWNldCB0aGF0IHRoZSBFbGVjdG9yYXRlIHNob3VsZFxuICogICBob2xkIHRpZ2h0bHkuIHN1Ym1pdFZvdGUoKSBpcyB0aGUgY29yZSBjYXBhYmlsaXR5IHRoYXQgYWxsb3dzIHRoZSBob2xkZXIgdG9cbiAqICAgc3BlY2lmeSB0aGUgaWRlbnRpdHkgYW5kIGNob2ljZSBvZiBhIHZvdGVyLiBUaGUgdm90ZUNvdW50ZXIgaXMgbWFraW5nIHRoYXRcbiAqICAgYXZhaWxhYmxlIHRvIHRoZSBFbGVjdG9yYXRlLCB3aGljaCBzaG91bGQgd3JhcCBhbmQgYXR0ZW51YXRlIGl0IHNvIGVhY2hcbiAqICAgdm90ZXIgZ2V0cyBvbmx5IHRoZSBhYmlsaXR5IHRvIGNhc3QgdGhlaXIgb3duIHZvdGUgYXQgYSB3ZWlnaHQgc3BlY2lmaWVkIGJ5XG4gKiAgIHRoZSBlbGVjdG9yYXRlLlxuICogQHByb3BlcnR5IHtTdWJtaXRWb3RlfSBzdWJtaXRWb3RlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBWb3RlQ291bnRlclB1YmxpY0ZhY2V0XG4gKiBAcHJvcGVydHkgeygpID0+IGJvb2xlYW59IGlzT3BlblxuICogQHByb3BlcnR5IHsoKSA9PiBRdWVzdGlvbn0gZ2V0UXVlc3Rpb25cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxQb3NpdGlvbj59IGdldE91dGNvbWVcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUXVlc3Rpb25EZXRhaWxzfSBnZXREZXRhaWxzXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8Vm90ZVN0YXRpc3RpY3M+fSBnZXRTdGF0c1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTXVsdGlWb3RlQ291bnRlclB1YmxpY0ZhY2V0XG4gKiBAcHJvcGVydHkgeygpID0+IGJvb2xlYW59IGlzT3BlblxuICogQHByb3BlcnR5IHsoKSA9PiBRdWVzdGlvbn0gZ2V0UXVlc3Rpb25cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxQb3NpdGlvbltdPn0gZ2V0T3V0Y29tZVxuICogQHByb3BlcnR5IHsoKSA9PiBRdWVzdGlvbkRldGFpbHN9IGdldERldGFpbHNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxWb3RlU3RhdGlzdGljcz59IGdldFN0YXRzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBWb3RlQ291bnRlckNsb3NlRmFjZXRcbiAqICAgVEVTVCBPTkxZOiBTaG91bGQgbm90IGJlIGFsbG93ZWQgdG8gZXNjYXBlIGZyb20gY29udHJhY3RzXG4gKiBAcHJvcGVydHkgeygpID0+IHZvaWR9IGNsb3NlVm90aW5nXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBWb3RlQ291bnRlckZhY2V0c1xuICogQHByb3BlcnR5IHtWb3RlQ291bnRlclB1YmxpY0ZhY2V0fSBwdWJsaWNGYWNldFxuICogQHByb3BlcnR5IHtWb3RlQ291bnRlckNyZWF0b3JGYWNldH0gY3JlYXRvckZhY2V0XG4gKiBAcHJvcGVydHkge1ZvdGVDb3VudGVyQ2xvc2VGYWNldH0gY2xvc2VGYWNldFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTXVsdGlWb3RlQ291bnRlckZhY2V0c1xuICogQHByb3BlcnR5IHtNdWx0aVZvdGVDb3VudGVyUHVibGljRmFjZXR9IHB1YmxpY0ZhY2V0XG4gKiBAcHJvcGVydHkge1ZvdGVDb3VudGVyQ3JlYXRvckZhY2V0fSBjcmVhdG9yRmFjZXRcbiAqIEBwcm9wZXJ0eSB7Vm90ZUNvdW50ZXJDbG9zZUZhY2V0fSBjbG9zZUZhY2V0XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQnVpbGRWb3RlQ291bnRlclxuICogQHBhcmFtIHtRdWVzdGlvblNwZWN9IHF1ZXN0aW9uU3BlY1xuICogQHBhcmFtIHtiaWdpbnR9IHRocmVzaG9sZCAtIHF1ZXN0aW9uU3BlYyBpbmNsdWRlcyBxdW9ydW1SdWxlOyB0aGUgZWxlY3RvcmF0ZVxuICogICAgY29udmVydHMgdGhhdCB0byBhIG51bWJlciB0aGF0IHRoZSBjb3VudGVyIGNhbiBlbmZvcmNlLlxuICogQHBhcmFtIHtJbnN0YW5jZX0gaW5zdGFuY2VcbiAqIEBwYXJhbSB7RVJlZjxQdWJsaXNoZXI8T3V0Y29tZVJlY29yZD4+fSBwdWJsaXNoZXJcbiAqIEByZXR1cm5zIHtWb3RlQ291bnRlckZhY2V0c31cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBCdWlsZE11bHRpVm90ZUNvdW50ZXJcbiAqIEBwYXJhbSB7UXVlc3Rpb25TcGVjfSBxdWVzdGlvblNwZWNcbiAqIEBwYXJhbSB7YmlnaW50fSB0aHJlc2hvbGQgLSBxdWVzdGlvblNwZWMgaW5jbHVkZXMgcXVvcnVtUnVsZTsgdGhlIGVsZWN0b3JhdGVcbiAqICAgIGNvbnZlcnRzIHRoYXQgdG8gYSBudW1iZXIgdGhhdCB0aGUgY291bnRlciBjYW4gZW5mb3JjZS5cbiAqIEBwYXJhbSB7SW5zdGFuY2V9IGluc3RhbmNlXG4gKiBAcGFyYW0ge0VSZWY8UHVibGlzaGVyPE11bHRpT3V0Y29tZVJlY29yZD4+fSBwdWJsaXNoZXJcbiAqIEByZXR1cm5zIHtNdWx0aVZvdGVDb3VudGVyRmFjZXRzfVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQ29tcGxldGVkQmFsbGV0XG4gKiBAcHJvcGVydHkge1Bvc2l0aW9ufSBjaG9zZW5cbiAqIEBwcm9wZXJ0eSB7YmlnaW50fSBzaGFyZXNcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBTdWJtaXRWb3RlXG4gKiBAcGFyYW0ge0hhbmRsZTwnVm90ZXInPn0gdm90ZXJIYW5kbGVcbiAqIEBwYXJhbSB7UG9zaXRpb25bXX0gY2hvc2VuUG9zaXRpb25zXG4gKiBAcGFyYW0ge2JpZ2ludH0gW3dlaWdodF1cbiAqIEByZXR1cm5zIHtDb21wbGV0ZWRCYWxsZXR9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0T3BlblF1ZXN0aW9uc1xuICogQHJldHVybnMge1Byb21pc2U8SGFuZGxlPCdRdWVzdGlvbic+W10+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldFF1ZXN0aW9uXG4gKiBAcGFyYW0ge0hhbmRsZTwnUXVlc3Rpb24nPn0gaFxuICogQHJldHVybnMge1Byb21pc2U8UXVlc3Rpb24+fVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRWxlY3RvcmF0ZVB1YmxpY1xuICogQHByb3BlcnR5IHsoKSA9PiBTdWJzY3JpYmVyPFF1ZXN0aW9uRGV0YWlscz59IGdldFF1ZXN0aW9uU3Vic2NyaWJlclxuICogQHByb3BlcnR5IHtHZXRPcGVuUXVlc3Rpb25zfSBnZXRPcGVuUXVlc3Rpb25zLFxuICogQHByb3BlcnR5IHsoKSA9PiBJbnN0YW5jZX0gZ2V0SW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7R2V0UXVlc3Rpb259IGdldFF1ZXN0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7IEVsZWN0b3JhdGVQdWJsaWMgJiB7bWFrZVZvdGVySW52aXRhdGlvbjogKCkgPT4gRVJlZjxJbnZpdGF0aW9uPn0gfSBDbGFpbXNFbGVjdG9yYXRlUHVibGljXG4gKiBAdHlwZWRlZiB7IEVsZWN0b3JhdGVQdWJsaWMgJiB7Z2V0TmFtZTogKCkgPT4gc3RyaW5nfSB9IENvbW1pdHRlZUVsZWN0b3JhdGVQdWJsaWNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBvc2VyRmFjZXRcbiAqIEBwcm9wZXJ0eSB7QWRkUXVlc3Rpb259IGFkZFF1ZXN0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFbGVjdG9yYXRlQ3JlYXRvckZhY2V0XG4gKiBAcHJvcGVydHkge0FkZFF1ZXN0aW9ufSBhZGRRdWVzdGlvbiBjYW4gYmUgdXNlZCBkaXJlY3RseSB3aGVuIHRoZSBjcmVhdG9yIGRvZXNuJ3QgbmVlZCBhbnlcbiAqICByZWFzc3VyYW5jZS4gV2hlbiBzb21lb25lIG5lZWRzIHRvIGNvbm5lY3QgYWRkUXVlc3Rpb24gdG8gdGhlIEVsZWN0b3JhdGVcbiAqICBpbnN0YW5jZSwgZ2V0UG9zZXJJbnZpdGF0aW9uKCkgbGV0cyB0aGVtIGdldCBhZGRRdWVzdGlvbiB3aXRoIGFzc3VyYW5jZS5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxJbnZpdGF0aW9uPn0gZ2V0UG9zZXJJbnZpdGF0aW9uXG4gKiBAcHJvcGVydHkgeygpID0+IFN1YnNjcmliZXI8UXVlc3Rpb25EZXRhaWxzPn0gZ2V0UXVlc3Rpb25TdWJzY3JpYmVyXG4gKiBAcHJvcGVydHkgeygpID0+IEVsZWN0b3JhdGVQdWJsaWN9IGdldFB1YmxpY0ZhY2V0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBHZXRWb3Rlckludml0YXRpb25zXG4gKiBAcHJvcGVydHkgeygpID0+IEludml0YXRpb25bXX0gZ2V0Vm90ZXJJbnZpdGF0aW9uc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gVm90ZXJGYWNldCAtIGEgZmFjZXQgdGhhdCB0aGUgRWxlY3RvcmF0ZSBzaG91bGQgaG9sZFxuICogICB0aWdodGx5LiBJdCBhbGxvd3Mgc3BlY2lmaWNhdGlvbiBvZiB0aGUgdm90ZSdzIHdlaWdodCwgc28gdGhlIEVsZWN0b3JhdGVcbiAqICAgc2hvdWxkIGRpc3RyaWJ1dGUgYW4gYXR0ZW51YXRlZCB3cmFwcGVyIHRoYXQgZG9lc24ndCBtYWtlIHRoYXQgYXZhaWxhYmxlIVxuICogQHByb3BlcnR5IHtTdWJtaXRWb3RlfSBzdWJtaXRWb3RlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDbG9zaW5nUnVsZVxuICogQHByb3BlcnR5IHtFUmVmPFRpbWVyPn0gdGltZXJcbiAqIEBwcm9wZXJ0eSB7WGltcG9ydCgnQGFnb3JpYy90aW1lL3NyYy90eXBlcycpLlRpbWVzdGFtcH0gZGVhZGxpbmVcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBDbG9zZVZvdGluZ1xuICogQHBhcmFtIHtDbG9zaW5nUnVsZX0gY2xvc2luZ1J1bGVcbiAqIEBwYXJhbSB7KCkgPT4gdm9pZH0gY2xvc2VWb3RpbmdcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFkZFF1ZXN0aW9uUmV0dXJuXG4gKiBAcHJvcGVydHkge1ZvdGVDb3VudGVyUHVibGljRmFjZXR9IHB1YmxpY0ZhY2V0XG4gKiBAcHJvcGVydHkge1ZvdGVDb3VudGVyQ3JlYXRvckZhY2V0fSBjcmVhdG9yRmFjZXRcbiAqIEBwcm9wZXJ0eSB7WGltcG9ydCgnQGFnb3JpYy96b2Uvc3JjL3pvZVNlcnZpY2UvdXRpbHMuanMnKS5JbnN0YW5jZTx0eXBlb2YgWGltcG9ydCgnLi9iaW5hcnlWb3RlQ291bnRlci5qcycpLnN0YXJ0Pn0gaW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7WGltcG9ydCgnQGFnb3JpYy90aW1lL3NyYy90eXBlcycpLlRpbWVzdGFtcH0gZGVhZGxpbmVcbiAqIEBwcm9wZXJ0eSB7SGFuZGxlPCdRdWVzdGlvbic+fSBxdWVzdGlvbkhhbmRsZVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFkZFF1ZXN0aW9uXG4gKiBAcGFyYW0ge0VSZWY8SW5zdGFsbGF0aW9uPn0gdm90ZUNvdW50ZXJcbiAqIEBwYXJhbSB7UXVlc3Rpb25TcGVjfSBxdWVzdGlvblNwZWNcbiAqIEByZXR1cm5zIHtQcm9taXNlPEFkZFF1ZXN0aW9uUmV0dXJuPn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBDcmVhdGVRdWVzdGlvblxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciB0byBjaGFuZ2VcbiAqIEBwYXJhbSB7UGFyYW1WYWx1ZX0gcHJvcG9zZWRWYWx1ZSAtIHRoZSBwcm9wb3NlZCB2YWx1ZSBmb3IgdGhlIG5hbWVkXG4gKiAgIHBhcmFtZXRlclxuICogQHBhcmFtIHtJbnN0YWxsYXRpb259IHZvdGVDb3VudGVySW5zdGFsbGF0aW9uIC0gdGhlIHZvdGVDb3VudGVyIHRvXG4gKiAgIGluc3RhbnRpYXRlIHRvIGNvdW50IHZvdGVzLiBFeHBlY3RlZCB0byBiZSBhIGJpbmFyeVZvdGVDb3VudGVyLiBPdGhlclxuICogICB2b3RlQ291bnRlcnMgbWlnaHQgYmUgYWRkZWQgaGVyZSwgb3IgbWlnaHQgcmVxdWlyZSBzZXBhcmF0ZSBnb3Zlcm5vcnMuXG4gKiAgIHVuZGVyIG1hbmFnZW1lbnQgc28gdXNlcnMgY2FuIHRyYWNlIGl0IGJhY2sgYW5kIHNlZSB0aGF0IGl0IHdvdWxkIHVzZVxuICogICB0aGlzIGVsZWN0aW9uTWFuYWdlciB0byBtYW5hZ2UgcGFyYW1ldGVyc1xuICogQHBhcmFtIHtJbnN0YW5jZX0gY29udHJhY3RJbnN0YW5jZSAtIGluY2x1ZGUgdGhlIGluc3RhbmNlIG9mIHRoZSBjb250cmFjdFxuICogQHBhcmFtIHtDbG9zaW5nUnVsZX0gY2xvc2luZ1J1bGUgLSBkZWFkbGluZSBhbmQgdGltZXIgZm9yIGNsb3Npbmcgdm90aW5nXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxRdWVzdGlvbkRldGFpbHM+fVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFtQPVN0YW5kYXJkUGFyYW1QYXRoXSBwYXRoIGZvciBhIHBhcmFtTWFuYWdlclJldHJpZXZlclxuICogQHR5cGVkZWYge29iamVjdH0gUGFyYW1DaGFuZ2VJc3N1ZVxuICogQHByb3BlcnR5IHtQYXJhbUNoYW5nZXNTcGVjPFA+fSBzcGVjXG4gKiBAcHJvcGVydHkge1hpbXBvcnQoJ0BhZ29yaWMvem9lL3NyYy96b2VTZXJ2aWNlL3V0aWxzLmpzJykuSW5zdGFuY2U8KHpjZjogWkNGPEdvdmVybmFuY2VUZXJtczx7fT4+KSA9PiB7fT59IGNvbnRyYWN0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBcGlJbnZvY2F0aW9uSXNzdWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcGlNZXRob2ROYW1lXG4gKiBAcHJvcGVydHkge3Vua25vd25bXX0gbWV0aG9kQXJnc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gT2ZmZXJGaWx0ZXJJc3N1ZVxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gc3RyaW5nc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUGFyYW1DaGFuZ2VQb3NpdGlvbnNcbiAqIEBwcm9wZXJ0eSB7Q2hhbmdlUGFyYW1zUG9zaXRpb259IHBvc2l0aXZlXG4gKiBAcHJvcGVydHkge05vQ2hhbmdlUGFyYW1zUG9zaXRpb259IG5lZ2F0aXZlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQYXJhbUNoYW5nZUlzc3VlRGV0YWlsc1xuICogICAgZGV0YWlscyBmb3IgYSBxdWVzdGlvbiB0aGF0IGNhbiBjaGFuZ2UgYSBjb250cmFjdCBwYXJhbWV0ZXJcbiAqIEBwcm9wZXJ0eSB7Q2hvaWNlTWV0aG9kfSBtZXRob2RcbiAqIEBwcm9wZXJ0eSB7UGFyYW1DaGFuZ2VJc3N1ZTx1bmtub3duPn0gaXNzdWVcbiAqIEBwcm9wZXJ0eSB7UGFyYW1DaGFuZ2VQb3NpdGlvbnN9IHBvc2l0aW9uc1xuICogQHByb3BlcnR5IHtFbGVjdGlvblR5cGV9IGVsZWN0aW9uVHlwZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IG1heENob2ljZXNcbiAqIEBwcm9wZXJ0eSB7Q2xvc2luZ1J1bGV9IGNsb3NpbmdSdWxlXG4gKiBAcHJvcGVydHkge1F1b3J1bVJ1bGV9IHF1b3J1bVJ1bGVcbiAqIEBwcm9wZXJ0eSB7Tm9DaGFuZ2VQYXJhbXNQb3NpdGlvbn0gdGllT3V0Y29tZVxuICogQHByb3BlcnR5IHtJbnN0YW5jZX0gY291bnRlckluc3RhbmNlIC0gaW5zdGFuY2Ugb2YgdGhlIFZvdGVDb3VudGVyXG4gKiBAcHJvcGVydHkge0hhbmRsZTwnUXVlc3Rpb24nPn0gcXVlc3Rpb25IYW5kbGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8S2V5d29yZCwgUGFyYW1WYWx1ZVR5cGVkPn0gUGFyYW1TdGF0ZVJlY29yZCBhIFJlY29yZCBjb250YWluaW5nXG4gKiAgIGtleXdvcmQgcGFpcnMgd2l0aCBkZXNjcmlwdGlvbnMgb2YgcGFyYW1ldGVycyB1bmRlciBnb3Zlcm5hbmNlLlxuICovXG5cbi8qKiBAdHlwZWRlZiB7e2N1cnJlbnQ6IFBhcmFtU3RhdGVSZWNvcmR9fSBHb3Zlcm5hbmNlU3Vic2NyaXB0aW9uU3RhdGUgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQYXJhbU1hbmFnZXJCYXNlIFRoZSBiYXNlIHBhcmFtTWFuYWdlciB3aXRoIHR5cGVkIGdldHRlcnNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUGFyYW1TdGF0ZVJlY29yZH0gZ2V0UGFyYW1zXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IEFtb3VudH0gZ2V0QW1vdW50XG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IEJyYW5kfSBnZXRCcmFuZFxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBJbnN0YW5jZX0gZ2V0SW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gSW5zdGFsbGF0aW9ufSBnZXRJbnN0YWxsYXRpb25cbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gQW1vdW50PCdzZXQnPn0gZ2V0SW52aXRhdGlvbkFtb3VudFxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBiaWdpbnR9IGdldE5hdFxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBSYXRpb30gZ2V0UmF0aW9cbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gc3RyaW5nfSBnZXRTdHJpbmdcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gWGltcG9ydCgnQGFnb3JpYy90aW1lL3NyYy90eXBlcycpLlRpbWVzdGFtcFJlY29yZH0gZ2V0VGltZXN0YW1wXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IFhpbXBvcnQoJ0BhZ29yaWMvdGltZS9zcmMvdHlwZXMnKS5SZWxhdGl2ZVRpbWVSZWNvcmR9IGdldFJlbGF0aXZlVGltZVxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBhbnl9IGdldFVua25vd25cbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgcHJvcG9zZWRWYWx1ZTogUGFyYW1WYWx1ZSkgPT4gUGFyYW1WYWx1ZX0gZ2V0VmlzaWJsZVZhbHVlIC0gZm9yXG4gKiAgIG1vc3QgdHlwZXMsIHRoZSB2aXNpYmxlIHZhbHVlIGlzIHRoZSBzYW1lIGFzIHByb3Bvc2VkVmFsdWUuIEZvciBJbnZpdGF0aW9uc1xuICogICB0aGUgdmlzaWJsZSB2YWx1ZSBpcyB0aGUgYW1vdW50IG9mIHRoZSBpbnZpdGF0aW9uLlxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBQcm9taXNlPEludml0YXRpb24+fSBnZXRJbnRlcm5hbFBhcmFtVmFsdWVcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gU3RvcmVkU3Vic2NyaXB0aW9uPEdvdmVybmFuY2VTdWJzY3JpcHRpb25TdGF0ZT59IGdldFN1YnNjcmlwdGlvblxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFVwZGF0ZVBhcmFtc1xuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLFBhcmFtVmFsdWU+fSBwYXJhbUNoYW5nZXNcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5cbi8qKlxuICogVGhlc2UgYXJlIHR5cGVkIGBhbnlgIGJlY2F1c2UgdGhlIGJ1aWxkZXIgcGF0dGVybiBvZiBwYXJhbU1hbmFnZXIgbWFrZXMgaXQgdmVyeVxuICogY29tcGxpY2F0ZWQgZm9yIHRoZSB0eXBlIHN5c3RlbSB0byBrbm93IHRoZSBzZXQgb2YgcGFyYW0tc3BlY2lmaWMgZnVuY3Rpb25zXG4gKiByZXR1cm5lZCBieSBgLmJ1aWxkKClgLiBJbnN0ZWFkIHdlIGxldCBwYXJhbU1hbmFnZXIgY3JlYXRlIHRoZSBkZXNpcmVkIG1ldGhvZHNcbiAqIGFuZCB1c2UgdHlwZWRQYXJhbU1hbmFnZXIgdG8gY3JlYXRlIGEgdmVyc2lvbiB0aGF0IGluY2x1ZGVzIHRoZSBzdGF0aWMgdHlwZXMuXG4gKlxuICogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsIGFueT59IFBhcmFtTWFuYWdlckdldHRlcnNBbmRVcGRhdGVyc1xuICogQHR5cGVkZWYge1BhcmFtTWFuYWdlckJhc2UgJiBQYXJhbU1hbmFnZXJHZXR0ZXJzQW5kVXBkYXRlcnMgJiB7dXBkYXRlUGFyYW1zOiBVcGRhdGVQYXJhbXN9fSBBbnlQYXJhbU1hbmFnZXJcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT59IFBhcmFtZXRlck5hbWVMaXN0XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0UGFyYW1NYW5hZ2VyVHlwZVxuICogQHBhcmFtIHtQYXJhbVR5cGV9IHR5cGVcbiAqIEBwYXJhbSB7UGFyYW1WYWx1ZX0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQnVpbGRQYXJhbU1hbmFnZXIgLSBQYXJhbU1hbmFnZXIgaXMgYSBmYWNpbGl0eSB0aGF0IGdvdmVybmVkXG4gKiAgIGNvbnRyYWN0cyBjYW4gdXNlIHRvIG1hbmFnZSB0aGVpciB2aXNpYmxlIHN0YXRlIGluIGEgd2F5IHRoYXQgYWxsb3dzIHRoZVxuICogICBDb250cmFjdEdvdmVybm9yIHRvIHVwZGF0ZSB2YWx1ZXMgdXNpbmcgZ292ZXJuYW5jZS4gV2hlbiBwYXJhbU1hbmFnZXIgaXNcbiAqICAgaW5zdGFudGlhdGVkIGluc2lkZSB0aGUgY29udHJhY3QsIHRoZSBjb250cmFjdCBoYXMgc3luY2hyb25vdXMgYWNjZXNzIHRvXG4gKiAgIHRoZSB2YWx1ZXMsIGFuZCBjbGllbnRzIG9mIHRoZSBjb250cmFjdCBjYW4gdmVyaWZ5IHRoYXQgYSBDb250cmFjdEdvdmVybm9yXG4gKiAgIGNhbiBjaGFuZ2UgdGhlIHZhbHVlcyBpbiBhIGxlZ2libGUgd2F5LlxuICogQHBhcmFtIHtJdGVyYWJsZTxQYXJhbVZhbHVlVHlwZWQ+fSBwYXJhbURlc2NyaXB0aW9uc1xuICogQHJldHVybnMge0FueVBhcmFtTWFuYWdlcn1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENoYW5nZVBhcmFtc1Bvc2l0aW9uXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsUGFyYW1WYWx1ZT59IGNoYW5nZXMgb25lIG9yIG1vcmUgY2hhbmdlcyB0byBwYXJhbWV0ZXJzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBPZmZlckZpbHRlclBvc2l0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBzdHJpbmdzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBOb0NoYW5nZU9mZmVyRmlsdGVyUG9zaXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGRvbnRVcGRhdGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEludm9rZUFwaVBvc2l0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXBpTWV0aG9kTmFtZVxuICogQHByb3BlcnR5IHt1bmtub3duW119IG1ldGhvZEFyZ3NcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERvbnRJbnZva2VBcGlQb3NpdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRvbnRJbnZva2VcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE5vQ2hhbmdlUGFyYW1zUG9zaXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IG5vQ2hhbmdlIFBhcmFtZXRlcnMgaW4gdGhlIHByb3Bvc2FsIHRoYXQgdGhpcyBwb3NpdGlvblxuICogICBpcyBvcHBvc2VkIHRvXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBHb3Zlcm5vclxuICogQHByb3BlcnR5IHtDcmVhdGVRdWVzdGlvbn0gY3JlYXRlUXVlc3Rpb25cbiAqL1xuXG4vKiogQHR5cGVkZWYge3sgW21ldGhvZE5hbWU6IHN0cmluZ106ICguLi5hcmdzOiBhbnkpID0+IHVua25vd24gfX0gR292ZXJuZWRBcGlzICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHt7fX0gQ0ZcbiAqIEB0eXBlZGVmIHtHb3Zlcm5lZENyZWF0b3JGYWNldDxDRj4gJiB7XG4gKiBnZXRHb3Zlcm5lZEFwaXM6ICgpID0+IEVSZWY8R292ZXJuZWRBcGlzPjtcbiAqIGdldEdvdmVybmVkQXBpTmFtZXM6ICgpID0+IChzdHJpbmcgfCBzeW1ib2wpW107XG4gKiBzZXRPZmZlckZpbHRlcjogKHN0cmluZ3M6IHN0cmluZ1tdKSA9PiB2b2lkO1xuICogfX0gR292ZXJub3JGYWNldFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gR292ZXJub3JQdWJsaWNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxJbnN0YW5jZT59IGdldEVsZWN0b3JhdGVcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSW5zdGFuY2V9IGdldEdvdmVybmVkQ29udHJhY3RcbiAqIEBwcm9wZXJ0eSB7KHZvdGVDb3VudGVyOiBJbnN0YW5jZSkgPT4gUHJvbWlzZTxib29sZWFuPn0gdmFsaWRhdGVWb3RlQ291bnRlclxuICogQHByb3BlcnR5IHsocmVnUDogRVJlZjxJbnN0YW5jZT4pID0+IFByb21pc2U8Ym9vbGVhbj59IHZhbGlkYXRlRWxlY3RvcmF0ZVxuICogQHByb3BlcnR5IHsoY2xvc2luZ1J1bGU6IENsb3NpbmdSdWxlKSA9PiBib29sZWFufSB2YWxpZGF0ZVRpbWVyXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQYXJhbUtleSBpZGVudGlmaWVyIGZvciBhIHBhcmFtTWFuYWdlciB3aXRoaW4gYSBjb250cmFjdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGtleVxuICovXG5cbi8qKlxuICogRGVzY3JpcHRpb24gb2YgYSBzZXQgb2YgY29vcmRpbmF0ZWQgY2hhbmdlcyBmb3IgYSBQYXJhbU1hbmFnZXJcbiAqXG4gKiBAdGVtcGxhdGUgUCBwYXRoIGZvciBhIHBhcmFtTWFuYWdlclJldHJpZXZlclxuICogQHR5cGVkZWYge29iamVjdH0gUGFyYW1DaGFuZ2VzU3BlYzxQPlxuICogQHByb3BlcnR5IHtQfSBwYXJhbVBhdGhcbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgUGFyYW1WYWx1ZT59IGNoYW5nZXMgb25lIG9yIG1vcmUgY2hhbmdlcyB0byBwYXJhbWV0ZXJzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDb250cmFjdEdvdmVybmFuY2VWb3RlUmVzdWx0XG4gKiBAcHJvcGVydHkge0luc3RhbmNlfSBpbnN0YW5jZSAtIGluc3RhbmNlIG9mIHRoZSBWb3RlQ291bnRlclxuICogQHByb3BlcnR5IHtFUmVmPFF1ZXN0aW9uRGV0YWlscz59IGRldGFpbHNcbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZTxQYXJhbVZhbHVlPn0gb3V0Y29tZU9mVXBkYXRlIC0gQSBwcm9taXNlIGZvciB0aGUgcmVzdWx0XG4gKiAgICBvZiB1cGRhdGluZyB0aGUgcGFyYW1ldGVyIHZhbHVlLiBQcmltYXJpbHkgdXNlZnVsIGZvciBpdHMgYmVoYXZpb3Igb25cbiAqICAgIHJlamVjdGlvbi5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7e319IENGXG4gKiBAdHlwZWRlZiB7Q0Z9IExpbWl0ZWRDcmVhdG9yRmFjZXRcbiAqXG4gKiBUaGUgY3JlYXRvckZhY2V0IGZvciB0aGUgZ292ZXJuZWQgY29udHJhY3QgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGVcbiAqIHJlc3BvbnNpYmxlIHBhcnR5LiBJdCBkb2VzIG5vdCBoYXZlIGFjY2VzcyB0byB0aGUgcGFyYW1NYW5hZ2VyLlxuICogQHByb3BlcnR5IHsoKSA9PiBJbnN0YW5jZX0gZ2V0Q29udHJhY3RHb3Zlcm5vclxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHt7fX0gUEYgUHVibGljIGZhY2V0IG9mIGdvdmVybmVkIGNvbnRyYWN0XG4gKiBAdGVtcGxhdGUge3t9fSBDRiBDcmVhdG9yIGZhY2V0IG9mIGdvdmVybmVkIGNvbnRyYWN0XG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBHb3Zlcm5lZENvbnRyYWN0RmFjZXRBY2Nlc3NcbiAqIEBwcm9wZXJ0eSB7Vm90ZU9uUGFyYW1DaGFuZ2VzfSB2b3RlT25QYXJhbUNoYW5nZXNcbiAqIEBwcm9wZXJ0eSB7Vm90ZU9uQXBpSW52b2NhdGlvbn0gdm90ZU9uQXBpSW52b2NhdGlvblxuICogQHByb3BlcnR5IHtWb3RlT25PZmZlckZpbHRlcn0gdm90ZU9uT2ZmZXJGaWx0ZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxMaW1pdGVkQ3JlYXRvckZhY2V0PENGPj59IGdldENyZWF0b3JGYWNldCAtIGNyZWF0b3JcbiAqICAgZmFjZXQgb2YgdGhlIGdvdmVybmVkIGNvbnRyYWN0LCB3aXRob3V0IHRoZSB0aWdodGx5IGhlbGQgYWJpbGl0eSB0byBjaGFuZ2VcbiAqICAgcGFyYW0gdmFsdWVzLlxuICogQHByb3BlcnR5IHsocG9zZXJJbnZpdGF0aW9uOiBJbnZpdGF0aW9uKSA9PiBQcm9taXNlPHZvaWQ+fSByZXBsYWNlRWxlY3RvcmF0ZVxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEFkbWluRmFjZXQ+fSBnZXRBZG1pbkZhY2V0XG4gKiBAcHJvcGVydHkgeygpID0+IEdvdmVybmVkUHVibGljRmFjZXQ8UEY+fSBnZXRQdWJsaWNGYWNldCAtIHB1YmxpYyBmYWNldCBvZiB0aGUgZ292ZXJuZWQgY29udHJhY3RcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSW5zdGFuY2V9IGdldEluc3RhbmNlIC0gaW5zdGFuY2Ugb2YgdGhlIGdvdmVybmVkXG4gKiAgIGNvbnRyYWN0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBHb3Zlcm5lZFB1YmxpY0ZhY2V0TWV0aG9kc1xuICogQHByb3BlcnR5IHsoKSA9PiBTdG9yZWRTdWJzY3JpcHRpb248R292ZXJuYW5jZVN1YnNjcmlwdGlvblN0YXRlPn0gZ2V0U3Vic2NyaXB0aW9uXG4gKiBAcHJvcGVydHkgeygpID0+IEluc3RhbmNlfSBnZXRDb250cmFjdEdvdmVybm9yXG4gKiBAcHJvcGVydHkgeygpID0+IFBhcmFtU3RhdGVSZWNvcmR9IGdldEdvdmVybmVkUGFyYW1zIC0gZ2V0IGRlc2NyaXB0aW9ucyBvZlxuICogICBhbGwgdGhlIGdvdmVybmVkIHBhcmFtZXRlcnNcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gQW1vdW50fSBnZXRBbW91bnRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gQnJhbmR9IGdldEJyYW5kXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IEluc3RhbmNlfSBnZXRJbnN0YW5jZVxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBJbnN0YWxsYXRpb259IGdldEluc3RhbGxhdGlvblxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBBbW91bnR9IGdldEludml0YXRpb25BbW91bnRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gYmlnaW50fSBnZXROYXRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gUmF0aW99IGdldFJhdGlvXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IHN0cmluZ30gZ2V0U3RyaW5nXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IGFueX0gZ2V0VW5rbm93blxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHt7fX0gUEYgUHVibGljIGZhY2V0XG4gKiBAdHlwZWRlZiB7UEYgJiBHb3Zlcm5lZFB1YmxpY0ZhY2V0TWV0aG9kc30gR292ZXJuZWRQdWJsaWNGYWNldFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHt7fX0gQ0YgY3JlYXRvciBmYWNldFxuICogQHR5cGVkZWYgR292ZXJuZWRDcmVhdG9yRmFjZXRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUGFyYW1NYW5hZ2VyUmV0cmlldmVyfSBnZXRQYXJhbU1nclJldHJpZXZlciAtIGFsbG93cyBhY2Nlc3NpbmdcbiAqICAgYW5kIHVwZGF0aW5nIGdvdmVybmVkIHBhcmFtZXRlcnMuIFNob3VsZCBvbmx5IGJlIGRpcmVjdGx5IGFjY2Vzc2libGUgdG8gdGhlXG4gKiAgIGNvbnRyYWN0R292ZXJub3JcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTGltaXRlZENyZWF0b3JGYWNldDxDRj59IGdldExpbWl0ZWRDcmVhdG9yRmFjZXQgLSB0aGUgY3JlYXRvclxuICogICBmYWNldCBvZiB0aGUgZ292ZXJuZWQgY29udHJhY3QuIERvZXNuJ3QgcHJvdmlkZSBhY2Nlc3MgdG8gYW55IGdvdmVybmFuY2VcbiAqICAgZnVuY3Rpb25hbGl0eVxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBQcm9taXNlPEludml0YXRpb24+fSBnZXRJbnZpdGF0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e2tleTogc3RyaW5nfX0gU3RhbmRhcmRQYXJhbVBhdGhcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBhcmFtTWFuYWdlclJldHJpZXZlclxuICogQHByb3BlcnR5IHsocGFyYW1LZXk/OiBQYXJhbUtleSkgPT4gQW55UGFyYW1NYW5hZ2VyfSBnZXRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbUD1TdGFuZGFyZFBhcmFtUGF0aF1cbiAqXG4gKiBAY2FsbGJhY2sgVm90ZU9uUGFyYW1DaGFuZ2VzXG4gKiBAcGFyYW0ge0luc3RhbGxhdGlvbn0gdm90ZUNvdW50ZXJJbnN0YWxsYXRpb25cbiAqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy90aW1lL3NyYy90eXBlcycpLlRpbWVzdGFtcH0gZGVhZGxpbmVcbiAqIEBwYXJhbSB7UGFyYW1DaGFuZ2VzU3BlYzxQPn0gcGFyYW1TcGVjXG4gKiBAcmV0dXJucyB7Q29udHJhY3RHb3Zlcm5hbmNlVm90ZVJlc3VsdH1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBWb3RlT25BcGlJbnZvY2F0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBpTWV0aG9kTmFtZVxuICogQHBhcmFtIHt1bmtub3duW119IG1ldGhvZEFyZ3NcbiAqIEBwYXJhbSB7SW5zdGFsbGF0aW9ufSB2b3RlQ291bnRlckluc3RhbGxhdGlvblxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXN0YW1wfSBkZWFkbGluZVxuICogQHJldHVybnMge0NvbnRyYWN0R292ZXJuYW5jZVZvdGVSZXN1bHR9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgVm90ZU9uT2ZmZXJGaWx0ZXJcbiAqIEBwYXJhbSB7SW5zdGFsbGF0aW9ufSB2b3RlQ291bnRlckluc3RhbGxhdGlvblxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXN0YW1wfSBkZWFkbGluZVxuICogQHBhcmFtIHtzdHJpbmdbXX0gc3RyaW5nc1xuICogQHJldHVybnMge0NvbnRyYWN0R292ZXJuYW5jZVZvdGVSZXN1bHR9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQYXJhbUdvdmVybm9yXG4gKiBAcHJvcGVydHkge1ZvdGVPblBhcmFtQ2hhbmdlc30gdm90ZU9uUGFyYW1DaGFuZ2VzXG4gKiBAcHJvcGVydHkge0NyZWF0ZWRRdWVzdGlvbn0gY3JlYXRlZFF1ZXN0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBcGlHb3Zlcm5vclxuICogQHByb3BlcnR5IHtWb3RlT25BcGlJbnZvY2F0aW9ufSB2b3RlT25BcGlJbnZvY2F0aW9uXG4gKiBAcHJvcGVydHkge0NyZWF0ZWRRdWVzdGlvbn0gY3JlYXRlZFF1ZXN0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGaWx0ZXJHb3Zlcm5vclxuICogQHByb3BlcnR5IHtWb3RlT25PZmZlckZpbHRlcn0gdm90ZU9uRmlsdGVyXG4gKiBAcHJvcGVydHkge0NyZWF0ZWRRdWVzdGlvbn0gY3JlYXRlZEZpbHRlclF1ZXN0aW9uXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgU2V0dXBHb3Zlcm5hbmNlXG4gKiBAcGFyYW0ge0VSZWY8Wm9lU2VydmljZT59IHpvZVxuICogQHBhcmFtIHtFUmVmPFBhcmFtTWFuYWdlclJldHJpZXZlcj59IHBhcmFtTWFuYWdlclJldHJpZXZlclxuICogQHBhcmFtIHtJbnN0YW5jZX0gY29udHJhY3RJbnN0YW5jZVxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXJTZXJ2aWNlfSB0aW1lclxuICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPFBvc2VyRmFjZXQ+fSBnZXRVcGRhdGVkUG9zZXJGYWNldFxuICogQHJldHVybnMge1BhcmFtR292ZXJub3J9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQ3JlYXRlZFF1ZXN0aW9uXG4gKiAgIFdhcyB0aGlzIHF1ZXN0aW9uIGNyZWF0ZWQgYnkgdGhpcyBDb250cmFjdEdvdmVybm9yP1xuICogQHBhcmFtIHtJbnN0YW5jZX0gcXVlc3Rpb25JbnN0YW5jZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgUG9zaXRpb25JbmNsdWRlZFxuICogQHBhcmFtIHtQb3NpdGlvbltdfSBwb3NpdGlvbnNcbiAqIEBwYXJhbSB7UG9zaXRpb259IHBvc2l0aW9uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEdvdmVybmVkQ29udHJhY3RUZXJtc1xuICogQHByb3BlcnR5IHtYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXJTZXJ2aWNlfSB0aW1lclxuICogQHByb3BlcnR5IHtJc3N1ZXJLZXl3b3JkUmVjb3JkfSBpc3N1ZXJLZXl3b3JkUmVjb3JkXG4gKiBAcHJvcGVydHkge29iamVjdH0gcHJpdmF0ZUFyZ3NcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRDb250cmFjdEdvdmVybmFuY2VcbiAqXG4gKiBAcGFyYW0ge0VSZWY8Wm9lU2VydmljZT59IHpvZVxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3pvZS9zcmMvem9lU2VydmljZS91dGlscy5qcycpLkluc3RhbmNlPCh6Y2Y6IFpDRjxHb3Zlcm5hbmNlVGVybXM8e30+PikgPT4ge30+fSBhbGxlZ2VkR292ZXJuZWRcbiAqIEBwYXJhbSB7SW5zdGFuY2V9IGFsbGVnZWRHb3Zlcm5vclxuICogQHBhcmFtIHtJbnN0YWxsYXRpb248WGltcG9ydCgnQGFnb3JpYy9nb3Zlcm5hbmNlL3NyYy9jb250cmFjdEdvdmVybm9yJykuc3RhcnQ+fSBjb250cmFjdEdvdmVybm9ySW5zdGFsbGF0aW9uXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxHb3Zlcm5hbmNlUGFpcj59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0Q29udHJhY3RFbGVjdG9yYXRlIC0gYXNzZXJ0IHRoYXQgdGhlIGNvbnRyYWN0IHVzZXMgdGhlXG4gKiAgIGVsZWN0b3JhdGVcbiAqXG4gKiBAcGFyYW0ge0VSZWY8Wm9lU2VydmljZT59IHpvZVxuICogQHBhcmFtIHtJbnN0YW5jZX0gYWxsZWdlZEdvdmVybm9yXG4gKiBAcGFyYW0ge0luc3RhbmNlfSBhbGxlZ2VkRWxlY3RvcmF0ZVxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAMPLDVHFAAARxQAADoAAABAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEvc3JjL2Vjb25Db21taXR0ZWVDaGFydGVyLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvZ292ZXJuYW5jZS9leHBvcnRlZC5qcyIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3RpbWUiLCJAYWdvcmljL3pvZS9leHBvcnRlZC5qcyIsIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdHMvZXhwb3J0ZWQuanMiLCJAYWdvcmljL3pvZS9zcmMvdHlwZUd1YXJkcy5qcyIsIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbIklOVklUQVRJT05fTUFLRVJTX0RFU0MiLCJzdGFydCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBtYWtlU2NhbGFyTWFwU3RvcmUsTSxtYWtlRXhvLG11c3RNYXRjaCxJbnN0YW5jZUhhbmRsZVNoYXBlLFRpbWVzdGFtcFNoYXBlLEU7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9nb3Zlcm5hbmNlL2V4cG9ydGVkLmpzXCIsIFtdXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtYWtlU2NhbGFyTWFwU3RvcmVcIiwgWyRo4oCNX2EgPT4gKG1ha2VTY2FsYXJNYXBTdG9yZSA9ICRo4oCNX2EpXV0sW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV0sW1wibWFrZUV4b1wiLCBbJGjigI1fYSA9PiAobWFrZUV4byA9ICRo4oCNX2EpXV0sW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy96b2UvZXhwb3J0ZWQuanNcIiwgW11dLFtcIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdHMvZXhwb3J0ZWQuanNcIiwgW11dLFtcIkBhZ29yaWMvem9lL3NyYy90eXBlR3VhcmRzLmpzXCIsIFtbXCJJbnN0YW5jZUhhbmRsZVNoYXBlXCIsIFskaOKAjV9hID0+IChJbnN0YW5jZUhhbmRsZVNoYXBlID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvdGltZVwiLCBbW1wiVGltZXN0YW1wU2hhcGVcIiwgWyRo4oCNX2EgPT4gKFRpbWVzdGFtcFNoYXBlID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBjb250cmFjdCBtYWtlcyBpdCBwb3NzaWJsZSBmb3IgdGhvc2Ugd2hvIGdvdmVybiBjb250cmFjdHMgdG8gY2FsbCBmb3JcbiAqIHZvdGVzIG9uIGNoYW5nZXMuIEEgbW9yZSBjb21wbGV0ZSBpbXBsZW1lbnRhdGlvbiB3b3VsZCB2YWxpZGF0ZSBwYXJhbWV0ZXJzLFxuICogY29uc3RyYWluIGRlYWRsaW5lcyBhbmQgcG9zc2libHkgc3BsaXQgdGhlIGFiaWxpdHkgdG8gY2FsbCBmb3Igdm90ZXMgaW50b1xuICogc2VwYXJhdGUgY2FwYWJpbGl0aWVzIGZvciBmaW5lciBncmFpbiBlbmNhcHN1bGF0aW9uLlxuICovXG5cbmNvbnN0ICAgICAgICBJTlZJVEFUSU9OX01BS0VSU19ERVNDPSdjaGFydGVyIG1lbWJlciBpbnZpdGF0aW9uJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQYXJhbUNoYW5nZXNPZmZlckFyZ3NcbiAqIEBwcm9wZXJ0eSB7YmlnaW50fSBkZWFkbGluZVxuICogQHByb3BlcnR5IHtJbnN0YW5jZX0gaW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IHBhcmFtc1xuICogQHByb3BlcnR5IHt7cGFyYW1QYXRoOiB7IGtleTogc3RyaW5nIH19fSBbcGF0aF1cbiAqLyRo4oCNX29uY2UuSU5WSVRBVElPTl9NQUtFUlNfREVTQyhJTlZJVEFUSU9OX01BS0VSU19ERVNDKTtcbmNvbnN0IFBhcmFtQ2hhbmdlc09mZmVyQXJnc1NoYXBlPU0uc3BsaXRSZWNvcmQoXG57XG5kZWFkbGluZTpUaW1lc3RhbXBTaGFwZSxcbmluc3RhbmNlOkluc3RhbmNlSGFuZGxlU2hhcGUsXG5wYXJhbXM6TS5yZWNvcmRPZihNLnN0cmluZygpLE0uYW55KCkpfSxcblxue1xucGF0aDp7cGFyYW1QYXRoOntrZXk6TS5hbnkoKX19fSk7XG5cblxuXG4vKipcbiAqIEBwYXJhbSB7WkNGPHtiaW5hcnlWb3RlQ291bnRlckluc3RhbGxhdGlvbjpJbnN0YWxsYXRpb259Pn0gemNmXG4gKi9cbmNvbnN0ICAgICAgICBzdGFydD1hc3luYyh6Y2YpPT57XG5jb25zdHtiaW5hcnlWb3RlQ291bnRlckluc3RhbGxhdGlvbjpjb3VudGVyfT16Y2YuZ2V0VGVybXMoKTtcbi8qKiBAdHlwZSB7TWFwU3RvcmU8SW5zdGFuY2UsR292ZXJuZWRDb250cmFjdEZhY2V0QWNjZXNzPHt9LHt9Pj59ICovXG5jb25zdCBpbnN0YW5jZVRvR292ZXJub3I9bWFrZVNjYWxhck1hcFN0b3JlKCk7XG5cbmNvbnN0IG1ha2VQYXJhbUludml0YXRpb249KCk9Pntcbi8qKlxuICogQHBhcmFtIHtaQ0ZTZWF0fSBzZWF0XG4gKiBAcGFyYW0ge1BhcmFtQ2hhbmdlc09mZmVyQXJnc30gYXJnc1xuICovXG5jb25zdCB2b3RlT25QYXJhbUNoYW5nZXM9KHNlYXQsYXJncyk9Pntcbm11c3RNYXRjaChhcmdzLFBhcmFtQ2hhbmdlc09mZmVyQXJnc1NoYXBlKTtcbnNlYXQuZXhpdCgpO1xuXG5jb25zdHtcbnBhcmFtcyxcbmluc3RhbmNlLFxuZGVhZGxpbmUsXG5wYXRoPXtwYXJhbVBhdGg6e2tleTonZ292ZXJuZWRBcGknfX19PVxuYXJncztcbmNvbnN0IGdvdmVybm9yPWluc3RhbmNlVG9Hb3Zlcm5vci5nZXQoaW5zdGFuY2UpO1xucmV0dXJuIEUoZ292ZXJub3IpLnZvdGVPblBhcmFtQ2hhbmdlcyhjb3VudGVyLGRlYWRsaW5lLHtcbi4uLnBhdGgsXG5jaGFuZ2VzOnBhcmFtc30pO1xuXG4gfTtcblxucmV0dXJuIHpjZi5tYWtlSW52aXRhdGlvbih2b3RlT25QYXJhbUNoYW5nZXMsJ3ZvdGUgb24gcGFyYW0gY2hhbmdlcycpO1xuIH07XG5cbmNvbnN0IG1ha2VPZmZlckZpbHRlckludml0YXRpb249KGluc3RhbmNlLHN0cmluZ3MsZGVhZGxpbmUpPT57XG5jb25zdCB2b3RlT25PZmZlckZpbHRlckhhbmRsZXI9KHNlYXQpPT57XG5zZWF0LmV4aXQoKTtcblxuY29uc3QgZ292ZXJub3I9aW5zdGFuY2VUb0dvdmVybm9yLmdldChpbnN0YW5jZSk7XG5yZXR1cm4gRShnb3Zlcm5vcikudm90ZU9uT2ZmZXJGaWx0ZXIoY291bnRlcixkZWFkbGluZSxzdHJpbmdzKTtcbiB9O1xuXG5yZXR1cm4gemNmLm1ha2VJbnZpdGF0aW9uKHZvdGVPbk9mZmVyRmlsdGVySGFuZGxlciwndm90ZSBvbiBvZmZlciBmaWx0ZXInKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7SW5zdGFuY2V9IGluc3RhbmNlXG4gKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZVxuICogQHBhcmFtIHtzdHJpbmdbXX0gbWV0aG9kQXJnc1xuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3RpbWUnKS5UaW1lc3RhbXBWYWx1ZX0gZGVhZGxpbmVcbiAqL1xuY29uc3QgbWFrZUFwaUludm9jYXRpb25JbnZpdGF0aW9uPShcbmluc3RhbmNlLFxubWV0aG9kTmFtZSxcbm1ldGhvZEFyZ3MsXG5kZWFkbGluZSk9Plxue1xuY29uc3QgaGFuZGxlcj0oc2VhdCk9PntcbnNlYXQuZXhpdCgpO1xuXG5jb25zdCBnb3Zlcm5vcj1pbnN0YW5jZVRvR292ZXJub3IuZ2V0KGluc3RhbmNlKTtcbnJldHVybiBFKGdvdmVybm9yKS52b3RlT25BcGlJbnZvY2F0aW9uKFxubWV0aG9kTmFtZSxcbm1ldGhvZEFyZ3MsXG5jb3VudGVyLFxuZGVhZGxpbmUpO1xuXG4gfTtcbnJldHVybiB6Y2YubWFrZUludml0YXRpb24oaGFuZGxlciwndm90ZSBvbiBBUEkgaW52b2NhdGlvbicpO1xuIH07XG5cbmNvbnN0IE1ha2VyST1NLmludGVyZmFjZSgnQ2hhcnRlciBJbnZpdGF0aW9uTWFrZXJzJyx7XG5Wb3RlT25QYXJhbUNoYW5nZTpNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcblZvdGVPblBhdXNlT2ZmZXJzOk0uY2FsbChcbkluc3RhbmNlSGFuZGxlU2hhcGUsXG5NLmFycmF5T2YoTS5zdHJpbmcoKSksXG5UaW1lc3RhbXBTaGFwZSkuXG5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcblZvdGVPbkFwaUNhbGw6TS5jYWxsKFxuSW5zdGFuY2VIYW5kbGVTaGFwZSxcbk0uc3RyaW5nKCksXG5NLmFycmF5T2YoTS5hbnkoKSksXG5UaW1lc3RhbXBTaGFwZSkuXG5yZXR1cm5zKE0ucHJvbWlzZSgpKX0pO1xuXG5jb25zdCBpbnZpdGF0aW9uTWFrZXJzPW1ha2VFeG8oJ0NoYXJ0ZXIgSW52aXRhdGlvbiBNYWtlcnMnLE1ha2VySSx7XG5Wb3RlT25QYXJhbUNoYW5nZTptYWtlUGFyYW1JbnZpdGF0aW9uLFxuVm90ZU9uUGF1c2VPZmZlcnM6bWFrZU9mZmVyRmlsdGVySW52aXRhdGlvbixcblZvdGVPbkFwaUNhbGw6bWFrZUFwaUludm9jYXRpb25JbnZpdGF0aW9ufSk7XG5cblxuY29uc3QgY2hhcnRlck1lbWJlckhhbmRsZXI9KHNlYXQpPT57XG5zZWF0LmV4aXQoKTtcbnJldHVybiBoYXJkZW4oe2ludml0YXRpb25NYWtlcnN9KTtcbiB9O1xuXG5jb25zdCBjaGFydGVyQ3JlYXRvckk9TS5pbnRlcmZhY2UoJ0NoYXJ0ZXIgY3JlYXRvckZhY2V0Jyx7XG5hZGRJbnN0YW5jZTpNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSxNLmFueSgpKS5cbm9wdGlvbmFsKE0uc3RyaW5nKCkpLlxucmV0dXJucygpLFxubWFrZUNoYXJ0ZXJNZW1iZXJJbnZpdGF0aW9uOk0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpfSk7XG5cblxuY29uc3QgY3JlYXRvckZhY2V0PW1ha2VFeG8oJ0NoYXJ0ZXIgY3JlYXRvckZhY2V0JyxjaGFydGVyQ3JlYXRvckkse1xuLyoqXG4gKiBAcGFyYW0ge0luc3RhbmNlfSBnb3Zlcm5lZEluc3RhbmNlXG4gKiBAcGFyYW0ge0dvdmVybmVkQ29udHJhY3RGYWNldEFjY2Vzczx7fSx7fT59IGdvdmVybm9yRmFjZXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbGFiZWxdIGZvciBkaWFnbm9zdGljIHVzZSBvbmx5XG4gKi9cbmFkZEluc3RhbmNlOihnb3Zlcm5lZEluc3RhbmNlLGdvdmVybm9yRmFjZXQsbGFiZWwpPT57XG5jb25zb2xlLmxvZygnY2hhcnRlcjogYWRkaW5nIGluc3RhbmNlJyxsYWJlbCk7XG5pbnN0YW5jZVRvR292ZXJub3IuaW5pdChnb3Zlcm5lZEluc3RhbmNlLGdvdmVybm9yRmFjZXQpO1xuIH0sXG5tYWtlQ2hhcnRlck1lbWJlckludml0YXRpb246KCk9PlxuemNmLm1ha2VJbnZpdGF0aW9uKGNoYXJ0ZXJNZW1iZXJIYW5kbGVyLElOVklUQVRJT05fTUFLRVJTX0RFU0MpfSk7XG5cblxucmV0dXJuIGhhcmRlbih7Y3JlYXRvckZhY2V0fSk7XG4gfTskaOKAjV9vbmNlLnN0YXJ0KHN0YXJ0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJJTlZJVEFUSU9OX01BS0VSU19ERVNDIjpbIklOVklUQVRJT05fTUFLRVJTX0RFU0MiXSwic3RhcnQiOlsic3RhcnQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAgO+ZRPMFAADzBQAAJQAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xL3NyYy9jb25maWcuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkJyaWRnZUlkIiwiVkJhbmtBY2NvdW50IiwiV2FsbGV0TmFtZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG4vKiogQGZpbGVcbiAqXG4gKiBTb21lIG9mIHRoaXMgY29uZmlnIGluZm8gbWF5IG1ha2UgbW9yZSBzZW5zZSBpbiBhIHBhcnRpY3VsYXIgcGFja2FnZS4gSG93ZXZlclxuICogZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDYyMCBhbmQgb3VyIGxheCBwYWNrYWdlXG4gKiBkZXBlbmRlbmN5IGdyYXBoLCBzb21ldGltZXMgcmF0aW9uYWwgcGxhY2VtZW50cyBjYXVzZSB0eXBlIHJlc29sdXRpb24gZXJyb3JzLlxuICpcbiAqIFNvIGFzIGEgd29yay1hcm91bmQgc29tZSBjb25zdGFudHMgdGhhdCBuZWVkIGFjY2VzcyBmcm9tIG1vcmUgdGhhbiBvbmUgcGFja2FnZSBhcmUgcGxhY2VkIGhlcmUuXG4gKi9cblxuLyoqXG4gKiBFdmVudCBzb3VyY2UgaWRzIHVzZWQgYnkgdGhlIGJyaWRnZSBkZXZpY2UuXG4gKi9cbmNvbnN0ICAgICAgICBCcmlkZ2VJZD17XG5CQU5LOidiYW5rJyxcbkNPUkU6J2NvcmUnLFxuRElCQzonZGliYycsXG5TVE9SQUdFOidzdG9yYWdlJyxcblBST1ZJU0lPTjoncHJvdmlzaW9uJyxcblBST1ZJU0lPTl9TTUFSVF9XQUxMRVQ6J3Byb3Zpc2lvbldhbGxldCcsXG5XQUxMRVQ6J3dhbGxldCd9OyRo4oCNX29uY2UuQnJpZGdlSWQoQnJpZGdlSWQpO1xuXG5oYXJkZW4oQnJpZGdlSWQpO1xuXG5jb25zdCAgICAgICAgV2FsbGV0TmFtZT17XG5kZXBvc2l0RmFjZXQ6J2RlcG9zaXRGYWNldCd9OyRo4oCNX29uY2UuV2FsbGV0TmFtZShXYWxsZXROYW1lKTtcblxuaGFyZGVuKFdhbGxldE5hbWUpO1xuXG4vKiBkZWZpbmVkIGluIGdvbGFuZy9jb3Ntb3MveC92YmFuayovXG5jb25zdCAgICAgICAgVkJhbmtBY2NvdW50PXtcbnJlc2VydmU6e1xubW9kdWxlOid2YmFuay9yZXNlcnZlJyxcbmFkZHJlc3M6J2Fnb3JpYzFhZTBsbXR6bGdyY25sYTl4amtwYWFycTVkNWRmZXo2M2gzbnVjbCd9LFxuXG5wcm92aXNpb246e1xubW9kdWxlOid2YmFuay9wcm92aXNpb24nLFxuYWRkcmVzczonYWdvcmljMW1lZ3p5dGc2NWN5cmd6czZmdnp4Z3JjcXZ3d2w3dWdwdDYyMzQ2J319OyRo4oCNX29uY2UuVkJhbmtBY2NvdW50KFZCYW5rQWNjb3VudCk7XG5cblxuaGFyZGVuKFZCYW5rQWNjb3VudCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQnJpZGdlSWQiOlsiQnJpZGdlSWQiXSwiV2FsbGV0TmFtZSI6WyJXYWxsZXROYW1lIl0sIlZCYW5rQWNjb3VudCI6WyJWQmFua0FjY291bnQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARDVCIaEEAAChBAAAJAAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xL3NyYy9kZWJ1Zy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWFrZVRyYWNlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIGxldCBkZWJ1Z0luc3RhbmNlPTE7XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge2Jvb2xlYW4gfCAndmVyYm9zZSd9IGVuYWJsZVxuICovXG5jb25zdCAgICAgICAgbWFrZVRyYWNlcj0obmFtZSxlbmFibGU9dHJ1ZSk9PntcbmRlYnVnSW5zdGFuY2UrPTE7XG5sZXQgZGVidWdDb3VudD0xO1xuY29uc3Qga2V5PSBgLS0tLS0gJHtuYW1lfS4ke2RlYnVnSW5zdGFuY2V9IGA7XG4vKiB0aGUgY2FzZXMgYmVsb3cgZGVmaW5lIGEgbmFtZWQgdmFyaWFibGUgdG8gcHJvdmlkZSBiZXR0ZXIgZGVidWcgaW5mbyovXG5zd2l0Y2goZW5hYmxlKXtcbmNhc2UgZmFsc2U6e1xuY29uc3QgbG9nRGlzYWJsZWQ9KC4uLl9hcmdzKT0+eyB9O1xucmV0dXJuIGxvZ0Rpc2FibGVkO1xuIH1cbmNhc2UndmVyYm9zZSc6e1xuY29uc3QgaW5mb1RpY2s9KG9wdExvZywuLi5hcmdzKT0+e1xuaWYob3B0TG9nLmxvZyl7XG5jb25zb2xlLmluZm8oa2V5LGRlYnVnQ291bnQrPTEsLi4uYXJncyk7XG4gfWVsc2V7XG5jb25zb2xlLmluZm8oa2V5LGRlYnVnQ291bnQrPTEsb3B0TG9nLC4uLmFyZ3MpO1xuIH1cbiB9O1xucmV0dXJuIGluZm9UaWNrO1xuIH1cbmRlZmF1bHQ6e1xuY29uc3QgZGVidWdUaWNrPShvcHRMb2csLi4uYXJncyk9PntcbmlmKG9wdExvZy5sb2cpe1xub3B0TG9nLmxvZyhrZXksZGVidWdDb3VudCs9MSwuLi5hcmdzKTtcbiB9ZWxzZXtcbmNvbnNvbGUuaW5mbyhrZXksZGVidWdDb3VudCs9MSxvcHRMb2csLi4uYXJncyk7XG4gfVxuIH07XG5yZXR1cm4gZGVidWdUaWNrO1xuIH19XG5cbiB9OyRo4oCNX29uY2UubWFrZVRyYWNlcihtYWtlVHJhY2VyKTtcbmhhcmRlbihtYWtlVHJhY2VyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlVHJhY2VyIjpbIm1ha2VUcmFjZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAxjCg3y4CAAAuAgAAJAAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL2NvbmZpZy5qcyIsIi4vZGVidWcuanMiLCIuL21ldGhvZC10b29scy5qcyIsIi4vdHlwZUd1YXJkcy5qcyIsIi4vdXRpbHMuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL2NvbmZpZy5qcyIsIi4vZGVidWcuanMiLCIuL21ldGhvZC10b29scy5qcyIsIi4vdHlwZUd1YXJkcy5qcyIsIi4vdXRpbHMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL2NvbmZpZy5qc1wiLCBbXV0sW1wiLi9kZWJ1Zy5qc1wiLCBbXV0sW1wiLi91dGlscy5qc1wiLCBbXV0sW1wiLi9tZXRob2QtdG9vbHMuanNcIiwgW11dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAATaWrs9gcAADYHAAALwAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiYXNzZXJ0UGF0aFNlZ21lbnQiLCJtYWtlQ2hhaW5TdG9yYWdlUm9vdCIsIm1ha2VTZXJpYWxpemVUb1N0b3JhZ2UiLCJtYWtlU3RvcmFnZU5vZGVDaGlsZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLEZhcjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1ha2VDaGFpblN0b3JhZ2VSb290LCAnbmFtZScsIHt2YWx1ZTogXCJtYWtlQ2hhaW5TdG9yYWdlUm9vdFwifSk7JGjigI1fb25jZS5tYWtlQ2hhaW5TdG9yYWdlUm9vdChtYWtlQ2hhaW5TdG9yYWdlUm9vdCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1ha2VTdG9yYWdlTm9kZUNoaWxkLCAnbmFtZScsIHt2YWx1ZTogXCJtYWtlU3RvcmFnZU5vZGVDaGlsZFwifSk7JGjigI1fb25jZS5tYWtlU3RvcmFnZU5vZGVDaGlsZChtYWtlU3RvcmFnZU5vZGVDaGlsZCk7ICAgXG5cblxuXG5cbmNvbnN0e0ZhaWx9PWFzc2VydDtcblxuLyoqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykubWFrZU1hcnNoYWw+fSBNYXJzaGFsbGVyICovXG4vKiogQHR5cGVkZWYge1BpY2s8TWFyc2hhbGxlciwgJ3Vuc2VyaWFsaXplJz59IFVuc2VyaWFsaXplciAqL1xuXG4vKipcbiAqIERlZmluZWQgYnkgdnN0b3JhZ2VTdG9yZUtleSBpbiB2c3RvcmFnZS5nb1xuICpcbiAqIEB0eXBlZGVmIFZTdG9yYWdlS2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RvcmVOYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RvcmVTdWJrZXlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkYXRhUHJlZml4Qnl0ZXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbm9EYXRhVmFsdWVdXG4gKi9cblxuLyoqXG4gKiBUaGlzIHJlcHJlc2VudHMgYSBub2RlIGluIGFuIElBVkwgdHJlZS5cbiAqXG4gKiBUaGUgYWN0aXZlIGltcGxlbWVudGF0aW9uIGlzIHgvdnN0b3JhZ2UsIGFuIEFnb3JpYyBleHRlbnNpb24gb2YgdGhlIENvc21vcyBTREsuXG4gKlxuICogVnN0b3JhZ2UgaXMgYSBoaWVyYXJjaGljYWwgZXh0ZXJuYWxseS1yZWFjaGFibGUgc3RvcmFnZSBzdHJ1Y3R1cmUgdGhhdFxuICogaWRlbnRpZmllcyBjaGlsZHJlbiBieSByZXN0cmljdGVkIEFTQ0lJIG5hbWUgYW5kIGlzIGFzc29jaWF0ZWQgd2l0aCBhcmJpdHJhcnlcbiAqIHN0cmluZy12YWx1ZWQgZGF0YSBmb3IgZWFjaCBub2RlLCBkZWZhdWx0aW5nIHRvIHRoZSBlbXB0eSBzdHJpbmcuXG4gKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmFnZU5vZGVcbiAqIEBwcm9wZXJ0eSB7KGRhdGE6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPn0gc2V0VmFsdWUgcHVibGlzaGVzIHNvbWUgZGF0YVxuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmd9IGdldFBhdGggdGhlIGNoYWluIHN0b3JhZ2UgcGF0aCBhdCB3aGljaCB0aGUgbm9kZSB3YXMgY29uc3RydWN0ZWRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxWU3RvcmFnZUtleT59IGdldFN0b3JlS2V5IERFUFJFQ0FURUQgdXNlIGdldFBhdGhcbiAqIEBwcm9wZXJ0eSB7KHN1YlBhdGg6IHN0cmluZywgb3B0aW9ucz86IHtzZXF1ZW5jZT86IGJvb2xlYW59KSA9PiBTdG9yYWdlTm9kZX0gbWFrZUNoaWxkTm9kZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVkRmFjZXRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxzdHJpbmc+fSBnZXRQYXRoIHRoZSBjaGFpbiBzdG9yYWdlIHBhdGggYXQgd2hpY2ggdGhlIG5vZGUgd2FzIGNvbnN0cnVjdGVkXG4gKiBAcHJvcGVydHkge1N0b3JhZ2VOb2RlWydnZXRTdG9yZUtleSddfSBnZXRTdG9yZUtleSBERVBSRUNBVEVEIHVzZSBnZXRQYXRoXG4gKiBAcHJvcGVydHkgeygpID0+IFVuc2VyaWFsaXplcn0gZ2V0VW5zZXJpYWxpemVyIGdldCB0aGUgdW5zZXJpYWxpemVyIGZvciB0aGUgc3RvcmVkIGRhdGFcbiAqL1xuXG4vKiBUT0RPOiBGb3JtYWxpemUgc2VnbWVudCBjb25zdHJhaW50cy4qL1xuLyogTXVzdCBiZSBub25lbXB0eSBhbmQgZGlzYWxsb3cgKHVuZXNjYXBlZCkgYC5gLCBhbmQgZm9yIHNpbXBsaWNpdHkqL1xuLyogKGFuZCBmdXR1cmUgcG9zc2liaWxpdHkgb2YgZS5nLiBlc2NhcGluZykgd2UgY3VycmVudGx5IGxpbWl0IHRvKi9cbi8qIEFTQ0lJIGFscGhhbnVtZXJpYyBwbHVzIHVuZGVyc2NvcmUgYW5kIGRhc2guKi9cbmNvbnN0IHBhdGhTZWdtZW50UGF0dGVybj0vXlthLXpBLVowLTlfLV17MSwxMDB9JC87XG5cbi8qKiBAdHlwZSB7KG5hbWU6IHN0cmluZykgPT4gdm9pZH0gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRQYXRoU2VnbWVudD0obmFtZSk9PntcbnBhdGhTZWdtZW50UGF0dGVybi50ZXN0KG5hbWUpfHxcbkZhaWwgYFBhdGggc2VnbWVudCBuYW1lcyBtdXN0IGNvbnNpc3Qgb2YgMSB0byAxMDAgY2hhcmFjdGVycyBsaW1pdGVkIHRvIEFTQ0lJIGFscGhhbnVtZXJpY3MsIHVuZGVyc2NvcmVzLCBhbmQvb3IgZGFzaGVzOiAke25hbWV9YDtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0UGF0aFNlZ21lbnQoYXNzZXJ0UGF0aFNlZ21lbnQpO1xuaGFyZGVuKGFzc2VydFBhdGhTZWdtZW50KTtcblxuLyoqXG4gKiBNdXN0IG1hdGNoIHRoZSBzd2l0Y2ggaW4gdnN0b3JhZ2UuZ28gdXNpbmcgYHZzdG9yYWdlTWVzc2FnZWAgdHlwZVxuICpcbiAqIEB0eXBlZGVmIHsgJ2dldCcgfCAnZ2V0U3RvcmVLZXknIHwgJ2hhcycgfCAnZW50cmllcycgfCAndmFsdWVzJyB8J3NpemUnIH0gU3RvcmFnZUdldEJ5UGF0aE1lc3NhZ2VNZXRob2RcbiAqIEB0eXBlZGVmIHsgJ3NldCcgfCAnYXBwZW5kJyB9IFN0b3JhZ2VVcGRhdGVFbnRyaWVzTWVzc2FnZU1ldGhvZFxuICogQHR5cGVkZWYge1N0b3JhZ2VHZXRCeVBhdGhNZXNzYWdlTWV0aG9kIHwgU3RvcmFnZVVwZGF0ZUVudHJpZXNNZXNzYWdlTWV0aG9kIH0gU3RvcmFnZU1lc3NhZ2VNZXRob2RcbiAqIEB0eXBlZGVmIHsgW3BhdGg6IHN0cmluZ10gfSBTdG9yYWdlR2V0QnlQYXRoTWVzc2FnZUFyZ3NcbiAqIEB0eXBlZGVmIHsgW3BhdGg6IHN0cmluZywgdmFsdWU/OiBzdHJpbmcgfCBudWxsXSB9IFN0b3JhZ2VFbnRyeVxuICogQHR5cGVkZWYgeyBTdG9yYWdlRW50cnlbXSB9IFN0b3JhZ2VVcGRhdGVFbnRyaWVzTWVzc2FnZUFyZ3NcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIG1ldGhvZDogU3RvcmFnZUdldEJ5UGF0aE1lc3NhZ2VNZXRob2Q7XG4gKiAgIGFyZ3M6IFN0b3JhZ2VHZXRCeVBhdGhNZXNzYWdlQXJncztcbiAqICB9IHwge1xuICogICBtZXRob2Q6IFN0b3JhZ2VVcGRhdGVFbnRyaWVzTWVzc2FnZU1ldGhvZDtcbiAqICAgYXJnczogU3RvcmFnZVVwZGF0ZUVudHJpZXNNZXNzYWdlQXJncztcbiAqIH19IFN0b3JhZ2VNZXNzYWdlXG4gKi9cblxuLyoqXG4gKiBDcmVhdGUgYSByb290IHN0b3JhZ2Ugbm9kZSBmb3IgYSBnaXZlbiBiYWNraW5nIGZ1bmN0aW9uIGFuZCByb290IHBhdGguXG4gKlxuICogQHBhcmFtIHsobWVzc2FnZTogU3RvcmFnZU1lc3NhZ2UpID0+IGFueX0gaGFuZGxlU3RvcmFnZU1lc3NhZ2UgYSBmdW5jdGlvbiBmb3Igc2VuZGluZyBhIHN0b3JhZ2VNZXNzYWdlIG9iamVjdCB0byB0aGUgc3RvcmFnZSBpbXBsZW1lbnRhdGlvbiAoY2YuIGdvbGFuZy9jb3Ntb3MveC92c3RvcmFnZS92c3RvcmFnZS5nbylcbiAqIEBwYXJhbSB7c3RyaW5nfSByb290UGF0aFxuICogQHBhcmFtIHtvYmplY3R9IFtyb290T3B0aW9uc11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Jvb3RPcHRpb25zLnNlcXVlbmNlXSBlbXBsb3kgYSB3cmFwcGluZyBzdHJ1Y3R1cmUgdGhhdCBwcmVzZXJ2ZXMgZWFjaCB2YWx1ZSBzZXQgd2l0aGluIGEgc2luZ2xlIGJsb2NrLCBhbmQgZGVmYXVsdCBjaGlsZCBub2RlcyB0byBkbyB0aGUgc2FtZVxuICovXG5mdW5jdGlvbiAgICAgICAgbWFrZUNoYWluU3RvcmFnZVJvb3QoXG5oYW5kbGVTdG9yYWdlTWVzc2FnZSxcbnJvb3RQYXRoLFxucm9vdE9wdGlvbnM9e30pXG57XG5hc3NlcnQudHlwZW9mKHJvb3RQYXRoLCdzdHJpbmcnKTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5zZXF1ZW5jZV1cbiAqIEByZXR1cm5zIHtTdG9yYWdlTm9kZX1cbiAqL1xuZnVuY3Rpb24gbWFrZUNoYWluU3RvcmFnZU5vZGUocGF0aCxvcHRpb25zPXt9KXtcbmNvbnN0e3NlcXVlbmNlPWZhbHNlfT1vcHRpb25zO1xuY29uc3Qgbm9kZT17XG5nZXRQYXRoKCl7XG5yZXR1cm4gcGF0aDtcbiB9LFxuLyoqXG4gKiBAZGVwcmVjYXRlZCB1c2UgZ2V0UGF0aFxuICogQHR5cGUgeygpID0+IFByb21pc2U8VlN0b3JhZ2VLZXk+fVxuICovXG4gICAgICBhc3luYyBnZXRTdG9yZUtleSgpe1xucmV0dXJuIGhhbmRsZVN0b3JhZ2VNZXNzYWdlKHtcbm1ldGhvZDonZ2V0U3RvcmVLZXknLFxuYXJnczpbcGF0aF19KTtcblxuIH0sXG4vKiogQHR5cGUgeyhuYW1lOiBzdHJpbmcsIGNoaWxkTm9kZU9wdGlvbnM/OiB7c2VxdWVuY2U/OiBib29sZWFufSkgPT4gU3RvcmFnZU5vZGV9ICovXG5tYWtlQ2hpbGROb2RlKG5hbWUsY2hpbGROb2RlT3B0aW9ucz17fSl7XG5hc3NlcnQudHlwZW9mKG5hbWUsJ3N0cmluZycpO1xuYXNzZXJ0UGF0aFNlZ21lbnQobmFtZSk7XG5jb25zdCBtZXJnZWRPcHRpb25zPXtzZXF1ZW5jZSwuLi5jaGlsZE5vZGVPcHRpb25zfTtcbnJldHVybiBtYWtlQ2hhaW5TdG9yYWdlTm9kZSggYCR7cGF0aH0uJHtuYW1lfWAsbWVyZ2VkT3B0aW9ucyk7XG4gfSxcbi8qKiBAdHlwZSB7KHZhbHVlOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD59ICovXG4gICAgICBhc3luYyBzZXRWYWx1ZSh2YWx1ZSl7XG5hc3NlcnQudHlwZW9mKHZhbHVlLCdzdHJpbmcnKTtcbi8qKiBAdHlwZSB7U3RvcmFnZUVudHJ5fSAqL1xubGV0IGVudHJ5O1xuaWYoIXNlcXVlbmNlJiYhdmFsdWUpe1xuZW50cnk9W3BhdGhdO1xuIH1lbHNle1xuZW50cnk9W3BhdGgsdmFsdWVdO1xuIH1cbmF3YWl0IGhhbmRsZVN0b3JhZ2VNZXNzYWdlKHtcbm1ldGhvZDpzZXF1ZW5jZT8nYXBwZW5kJzonc2V0JyxcbmFyZ3M6W2VudHJ5XX0pO1xuXG4gfVxuLyogUG9zc2libGUgZXh0ZW5zaW9uczoqL1xuLyogKiBnZXRWYWx1ZSgpKi9cbi8qICogZ2V0Q2hpbGROYW1lcygpIGFuZC9vciBtYWtlQ2hpbGROb2RlcygpKi9cbi8qICogZ2V0TmFtZSgpKi9cbi8qICogcmVjdXJzaXZlIGRlbGV0ZSovXG4vKiAqIGJhdGNoIG9wZXJhdGlvbnMqL1xuLyogKiBsb2NhbCBidWZmZXJpbmcgKHdpdGggZW5kLW9mLWJsb2NrIGNvbW1pdCkqL307XG5cbnJldHVybiBGYXIoJ2NoYWluU3RvcmFnZU5vZGUnLG5vZGUpO1xuIH1cblxuY29uc3Qgcm9vdE5vZGU9bWFrZUNoYWluU3RvcmFnZU5vZGUocm9vdFBhdGgscm9vdE9wdGlvbnMpO1xucmV0dXJuIHJvb3ROb2RlO1xuIH1cblxuLyoqXG4gKiBAcmV0dXJucyB7U3RvcmFnZU5vZGV9IGFuIG9iamVjdCB0aGF0IGNvbmZpcm1zIHRvIFN0b3JhZ2VOb2RlIEFQSSBidXQgZG9lcyBub3Qgc3RvcmUgYW55d2hlcmUuXG4gKi9cbmNvbnN0IG1ha2VOdWxsU3RvcmFnZU5vZGU9KCk9Pntcbi8qIFhYWCByZS11c2UgXCJDaGFpblN0b3JhZ2VcIiBtZXRob2RzIGFib3ZlIHdoaWNoIGRvbid0IGFjdHVhbGx5IGRlcGVuZCBvbiBjaGFpbnMqL1xucmV0dXJuIG1ha2VDaGFpblN0b3JhZ2VSb290KCgpPT5udWxsLCdudWxsJyk7XG4gfTtcblxuLyoqXG4gKiBDb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgcmV0dXJuaW5nIGEgc3RvcmFnZSBub2RlIGF0IG9yIHVuZGVyIGl0cyBpbnB1dCxcbiAqIGZhbGxpbmcgYmFjayB0byBhbiBpbmVydCBvYmplY3Qgd2l0aCB0aGUgY29ycmVjdCBpbnRlcmZhY2UgKGJ1dCBpbmNvbXBsZXRlXG4gKiBiZWhhdmlvcikgd2hlbiB0aGF0IGlzIHVuYXZhaWxhYmxlLlxuICpcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGVuZG8vZmFyJykuRVJlZjxTdG9yYWdlTm9kZT8+fSBzdG9yYWdlTm9kZVJlZlxuICogQHBhcmFtIHtzdHJpbmd9IGNoaWxkTmFtZVxuICogQHJldHVybnMge1Byb21pc2U8U3RvcmFnZU5vZGU+fVxuICovXG5hc3luYyBmdW5jdGlvbiAgICAgICAgbWFrZVN0b3JhZ2VOb2RlQ2hpbGQoc3RvcmFnZU5vZGVSZWYsY2hpbGROYW1lKXtcbmNvbnN0IGV4aXN0aW5nU3RvcmFnZU5vZGU9YXdhaXQgc3RvcmFnZU5vZGVSZWY7XG5jb25zdCBzdG9yYWdlTm9kZT1leGlzdGluZ1N0b3JhZ2VOb2RlfHxtYWtlTnVsbFN0b3JhZ2VOb2RlKCk7XG5yZXR1cm4gRShzdG9yYWdlTm9kZSkubWFrZUNoaWxkTm9kZShjaGlsZE5hbWUpO1xuIH1cbmhhcmRlbihtYWtlU3RvcmFnZU5vZGVDaGlsZCk7XG5cbi8qIFRPRE8gZmluZCBhIGJldHRlciBtb2R1bGUgZm9yIHRoaXMqL1xuLyoqXG4gKlxuICogQHBhcmFtIHtYaW1wb3J0KCdAZW5kby9mYXInKS5FUmVmPFN0b3JhZ2VOb2RlPn0gc3RvcmFnZU5vZGVcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGVuZG8vZmFyJykuRVJlZjxNYXJzaGFsbGVyPn0gbWFyc2hhbGxlclxuICogQHJldHVybnMgeyh2YWx1ZTogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VTZXJpYWxpemVUb1N0b3JhZ2U9KHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIpPT57XG5yZXR1cm4gYXN5bmModmFsdWUpPT57XG5jb25zdCBtYXJzaGFsbGVkPWF3YWl0IEUobWFyc2hhbGxlcikuc2VyaWFsaXplKHZhbHVlKTtcbmNvbnN0IHNlcmlhbGl6ZWQ9SlNPTi5zdHJpbmdpZnkobWFyc2hhbGxlZCk7XG5yZXR1cm4gRShzdG9yYWdlTm9kZSkuc2V0VmFsdWUoc2VyaWFsaXplZCk7XG4gfTtcbiB9OyRo4oCNX29uY2UubWFrZVNlcmlhbGl6ZVRvU3RvcmFnZShtYWtlU2VyaWFsaXplVG9TdG9yYWdlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3NlcnRQYXRoU2VnbWVudCI6WyJhc3NlcnRQYXRoU2VnbWVudCJdLCJtYWtlQ2hhaW5TdG9yYWdlUm9vdCI6WyJtYWtlQ2hhaW5TdG9yYWdlUm9vdCJdLCJtYWtlU3RvcmFnZU5vZGVDaGlsZCI6WyJtYWtlU3RvcmFnZU5vZGVDaGlsZCJdLCJtYWtlU2VyaWFsaXplVG9TdG9yYWdlIjpbIm1ha2VTZXJpYWxpemVUb1N0b3JhZ2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA6OuUUvwOAAD8DgAAKwAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xL3NyYy9tZXRob2QtdG9vbHMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImJpbmRBbGxNZXRob2RzIiwiZ2V0TWV0aG9kTmFtZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaXNPYmplY3Q7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuLyoqXG4gKiBAZmlsZSBtZXRob2QtdG9vbHMgdXNlIGR5bmFtaWMgcHJvcGVydHkgbG9va3VwLCB3aGljaCBpcyBub3QgSmVzc2llLWNvbXBhdGlibGVcbiAqL1xuXG5jb25zdHtnZXRQcm90b3R5cGVPZixjcmVhdGUsZnJvbUVudHJpZXMsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yc309XG5PYmplY3Q7XG5jb25zdHtvd25LZXlzLGFwcGx5fT1SZWZsZWN0O1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwvc3JjL3R5cGVzJykuUmVtb3RhYmxlfSBSZW1vdGFibGUgKi9cblxuLyoqXG4gKiBQcmlvcml0aXplIHN5bWJvbHMgYXMgZWFybGllciB0aGFuIHN0cmluZ3MuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8c3ltYm9sfSBhXG4gKiBAcGFyYW0ge3N0cmluZ3xzeW1ib2x9IGJcbiAqIEByZXR1cm5zIHstMSB8IDAgfCAxfVxuICovXG5jb25zdCBjb21wYXJlU3RyaW5naWZpZWQ9KGEsYik9PntcbmlmKHR5cGVvZiBhPT09dHlwZW9mIGIpe1xuY29uc3QgbGVmdD1TdHJpbmcoYSk7XG5jb25zdCByaWdodD1TdHJpbmcoYik7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnkqL1xucmV0dXJuIGxlZnQ8cmlnaHQ/LTE6bGVmdD5yaWdodD8xOjA7XG4gfVxuaWYodHlwZW9mIGE9PT0nc3ltYm9sJyl7XG5hc3NlcnQodHlwZW9mIGI9PT0nc3RyaW5nJyk7XG5yZXR1cm4tMTtcbiB9XG5hc3NlcnQodHlwZW9mIGE9PT0nc3RyaW5nJyk7XG5hc3NlcnQodHlwZW9mIGI9PT0nc3ltYm9sJyk7XG5yZXR1cm4gMTtcbiB9O1xuXG4vKipcbiAqIFRPRE8gQ29uc29saWRhdGUgd2l0aCB0aGUgYGdldE1ldGhvZE5hbWVzYCBpbiBgQGVuZG8vZXZlbnR1YWwtc2VuZGBcbiAqXG4gKiBAcGFyYW0ge2FueX0gdmFsXG4gKiBAcmV0dXJucyB7KHN0cmluZ3xzeW1ib2wpW119XG4gKi9cbmNvbnN0ICAgICAgICBnZXRNZXRob2ROYW1lcz0odmFsKT0+e1xubGV0IGxheWVyPXZhbDtcbmNvbnN0IG5hbWVzPW5ldyBTZXQoKTsvKiBTZXQgdG8gZGVkdXBsaWNhdGUqL1xud2hpbGUobGF5ZXIhPT1udWxsJiZsYXllciE9PU9iamVjdC5wcm90b3R5cGUpe1xuLyogYmUgdG9sZXJhbnQgb2Ygbm9uLW9iamVjdHMqL1xuY29uc3QgZGVzY3M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhsYXllcik7XG5mb3IoY29uc3QgbmFtZSBvZiBvd25LZXlzKGRlc2NzKSl7XG4vKiBJbiBjYXNlIGEgbWV0aG9kIGlzIG92ZXJyaWRkZW4gYnkgYSBub24tbWV0aG9kLCovXG4vKiB0ZXN0IGB2YWxbbmFtZV1gIHJhdGhlciB0aGFuIGBsYXllcltuYW1lXWAqL1xuaWYodHlwZW9mIHZhbFtuYW1lXT09PSdmdW5jdGlvbicpe1xubmFtZXMuYWRkKG5hbWUpO1xuIH1cbiB9XG5pZighaXNPYmplY3QodmFsKSl7XG5icmVhaztcbiB9XG5sYXllcj1nZXRQcm90b3R5cGVPZihsYXllcik7XG4gfVxucmV0dXJuIGhhcmRlbihbLi4ubmFtZXNdLnNvcnQoY29tcGFyZVN0cmluZ2lmaWVkKSk7XG4gfTskaOKAjV9vbmNlLmdldE1ldGhvZE5hbWVzKGdldE1ldGhvZE5hbWVzKTtcbmhhcmRlbihnZXRNZXRob2ROYW1lcyk7XG5cbi8qKlxuICogVE9ETyBUaGlzIGZ1bmN0aW9uIGV4aXN0cyBvbmx5IHRvIGVhc2UgdGhlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC81OTcwIHRyYW5zaXRpb24sIGZyb20gYWxsIG1ldGhvZHNcbiAqIGJlaW5nIG93biBwcm9wZXJ0aWVzIHRvIG1ldGhvZHMgYmVpbmcgaW5oZXJpdGVkIGZyb20gYSBjb21tb24gcHJvdG90eXBlLlxuICogVGhpcyB0cmFuc2l0aW9uIGJyZWFrcyB0d28gcGF0dGVybnMgdXNlZCBpbiBwcmlvciBjb2RlOiBhdXRvYmluZGluZyxcbiAqIGFuZCBlbnVtZXJhdGluZyBtZXRob2RzIGJ5IGVudW1lcmF0aW5nIG93biBwcm9wZXJ0aWVzLiBGb3IgYm90aCwgdGhlXG4gKiBwcmVmZXJyZWQgcmVwYWlycyBhcmVcbiAqICAgICogYXV0b2JpbmRpbmc6IFJlcGxhY2UsIGZvciBleGFtcGxlLFxuICogICAgICBgZm9vKG9iai5tZXRob2QpYCB3aXRoIGBmb28oYXJnID0+IGBvYmoubWV0aG9kKGFyZykpYC4gSU9XLCBzdG9wIHJlbHlpbmdcbiAqICAgICAgb24gZXhwcmVzc2lvbnMgbGlrZSBgb2JqLm1ldGhvZGAgdG8gZXh0cmFjdCBhIG1ldGhvZCBzdGlsbCBib3VuZCB0byB0aGVcbiAqICAgICAgc3RhdGUgb2YgYG9iamAgYmVjYXVzZSwgZm9yIHZpcnR1YWwgYW5kIGR1cmFibGUgb2JqZWN0cyxcbiAqICAgICAgdGhleSBubyBsb25nZXIgd2lsbCBhZnRlciAjNTk3MC5cbiAqICAgICogbWV0aG9kIGVudW1lcmF0aW9uOiBSZXBsYWNlLCBmb3IgZXhhbXBsZVxuICogICAgICBgUmVmbGVjdC5vd25LZXlzKG9iailgIHdpdGggYGdldE1ldGhvZE5hbWVzKG9iailgLlxuICpcbiAqIE9uY2UgYWxsIHByb2JsZW1hdGljIGNhc2VzIGhhdmUgYmVlbiBjb252ZXJ0ZWQgaW4gdGhpcyBtYW5uZXIsIHRoaXNcbiAqIGBiaW5kQWxsTWV0aG9kc2AgaGFjayBjYW4gYW5kIFRPRE8gc2hvdWxkIGJlIGRlbGV0ZWQuIEhvd2V2ZXIsIHdlIGN1cnJlbnRseVxuICogaGF2ZSBubyByZWxpYWJsZSBzdGF0aWMgd2F5IHRvIHRyYWNrIGRvd24gYW5kIGZpeCBhbGwgYXV0b2JpbmRpbmcgc2l0ZXMuXG4gKiBGb3IgdGhvc2Ugb2JqZWN0cyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGZ1bGx5IHJlcGFpcmVkIGJ5IHRoZSBhYm92ZSB0d29cbiAqIHRlY2huaXF1ZXMsIGBiaW5kQWxsTWV0aG9kc2AgY3JlYXRlcyBhbiBvYmplY3QgdGhhdCBhY3RzIG11Y2ggbGlrZSB0aGVcbiAqIHByZS0jNTk3MCBvYmplY3RzLCB3aXRoIGFsbCB0aGVpciBtZXRob2RzIGFzIGluc3RhbmNlLWJvdW5kIG93biBwcm9wZXJ0aWVzLlxuICogSXQgZG9lcyB0aGlzIGJ5IG1ha2luZyBhIG5ldyBvYmplY3QgaW5oZXJpdGluZyBmcm9tIGBvYmpgIHdoZXJlIHRoZSBuZXdcbiAqIG9iamVjdCBoYXMgYm91bmQgb3duIG1ldGhvZHMgb3ZlcnJpZGRpbmcgYWxsIHRoZSBtZXRob2RzIGl0IHdvdWxkIGhhdmVcbiAqIGluaGVyaXRlZCBmcm9tIGBvYmpgLlxuICpcbiAqIEBwYXJhbSB7UmVtb3RhYmxlfSBvYmpcbiAqIEByZXR1cm5zIHtSZW1vdGFibGV9XG4gKi9cbmNvbnN0ICAgICAgICBiaW5kQWxsTWV0aG9kcz0ob2JqKT0+XG5oYXJkZW4oXG5jcmVhdGUoXG5vYmosXG5mcm9tRW50cmllcyhcbmdldE1ldGhvZE5hbWVzKG9iaikubWFwKChuYW1lKT0+W1xubmFtZSxcbntcbnZhbHVlOigvKiogQHR5cGUge3Vua25vd25bXX0gKi8uLi5hcmdzKT0+XG5hcHBseShvYmpbbmFtZV0sb2JqLGFyZ3MpLFxuZW51bWVyYWJsZTp0cnVlfV0pKSkpOyRo4oCNX29uY2UuYmluZEFsbE1ldGhvZHMoYmluZEFsbE1ldGhvZHMpO1xuXG5cblxuXG5cbmhhcmRlbihiaW5kQWxsTWV0aG9kcyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0TWV0aG9kTmFtZXMiOlsiZ2V0TWV0aG9kTmFtZXMiXSwiYmluZEFsbE1ldGhvZHMiOlsiYmluZEFsbE1ldGhvZHMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAsnjEEC0CAAAtAgAAKQAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlVHlwZUd1YXJkcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qKlxuICogQHBhcmFtIHt0eXBlb2YgWGltcG9ydCgnQGFnb3JpYy9zdG9yZScpLk19IE1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VUeXBlR3VhcmRzPShNKT0+XG5oYXJkZW4oe1xuU3RvcmFnZU5vZGVTaGFwZTpNLnJlbW90YWJsZSgnU3RvcmFnZU5vZGUnKX0pOyRo4oCNX29uY2UubWFrZVR5cGVHdWFyZHMobWFrZVR5cGVHdWFyZHMpO1xuXG5oYXJkZW4obWFrZVR5cGVHdWFyZHMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VUeXBlR3VhcmRzIjpbIm1ha2VUeXBlR3VhcmRzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAM8BYrW/MAAAvzAAACQAAABAYWdvcmljL2ludGVybmFsLXYwLjIuMS9zcmMvdXRpbHMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9wcm9taXNlLWtpdCIsImplc3NpZS5qcyJdLCJleHBvcnRzIjpbIkJBU0lTX1BPSU5UUyIsIlByb21pc2VBbGxPckVycm9ycyIsImFnZ3JlZ2F0ZVRyeUZpbmFsbHkiLCJhbGxWYWx1ZXMiLCJhcHBseUxhYmVsaW5nRXJyb3IiLCJhc3NlcnRBbGxEZWZpbmVkIiwiZGVlcGx5RnVsZmlsbGVkT2JqZWN0IiwiZm9yZXZlciIsImZyb21VbmlxdWVFbnRyaWVzIiwibGlzdERpZmZlcmVuY2UiLCJtYWtlQWdncmVnYXRlRXJyb3IiLCJtYWtlTWVhc3VyZVNlY29uZHMiLCJvYmplY3RNYXAiLCJ0aHJvd0xhYmVsZWQiLCJ1bnRpbFRydWUiLCJ3aGlsZVRydWUiLCJ6aXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxkZWVwbHlGdWxmaWxsZWQsaXNPYmplY3QsaXNQcm9taXNlLGFzeW5jR2VuZXJhdGUsbWFrZVNldDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImRlZXBseUZ1bGZpbGxlZFwiLCBbJGjigI1fYSA9PiAoZGVlcGx5RnVsZmlsbGVkID0gJGjigI1fYSldXSxbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoaXNQcm9taXNlID0gJGjigI1fYSldXV1dLFtcImplc3NpZS5qc1wiLCBbW1wiYXN5bmNHZW5lcmF0ZVwiLCBbJGjigI1fYSA9PiAoYXN5bmNHZW5lcmF0ZSA9ICRo4oCNX2EpXV0sW1wibWFrZVNldFwiLCBbJGjigI1fYSA9PiAobWFrZVNldCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuY29uc3R7ZW50cmllcyxmcm9tRW50cmllcyxrZXlzLHZhbHVlc309T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG5jb25zdCAgICAgICAgQkFTSVNfUE9JTlRTPTEwXzAwMG47XG5cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLkVSZWY8VD59IEVSZWY8VD4gKi9cblxuLyoqXG4gKiBUaHJvd3MgaWYgbXVsdGlwbGUgZW50cmllcyB1c2UgdGhlIHNhbWUgcHJvcGVydHkgbmFtZS4gT3RoZXJ3aXNlIGFjdHNcbiAqIGxpa2UgYE9iamVjdC5mcm9tRW50cmllc2AgYnV0IGhhcmRlbnMgdGhlIHJlc3VsdC5cbiAqIFVzZSBpdCB0byBwcm90ZWN0IGZyb20gcHJvcGVydHkgbmFtZXMgY29tcHV0ZWQgZnJvbSB1c2VyLXByb3ZpZGVkIGRhdGEuXG4gKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtJdGVyYWJsZTxbSyxWXT59IGFsbEVudHJpZXNcbiAqIEByZXR1cm5zIHt7W2s6IEtdOiBWfX1cbiAqLyRo4oCNX29uY2UuQkFTSVNfUE9JTlRTKEJBU0lTX1BPSU5UUyk7XG5jb25zdCAgICAgICAgZnJvbVVuaXF1ZUVudHJpZXM9KGFsbEVudHJpZXMpPT57XG5jb25zdCBlbnRyaWVzQXJyYXk9Wy4uLmFsbEVudHJpZXNdO1xuY29uc3QgcmVzdWx0PWhhcmRlbihmcm9tRW50cmllcyhlbnRyaWVzQXJyYXkpKTtcbmlmKG93bktleXMocmVzdWx0KS5sZW5ndGg9PT1lbnRyaWVzQXJyYXkubGVuZ3RoKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuY29uc3QgbmFtZXM9bWFrZVNldCgpO1xuZm9yKGNvbnN0W25hbWUsX11vZiBlbnRyaWVzQXJyYXkpe1xuaWYobmFtZXMuaGFzKG5hbWUpKXtcbkZhaWwgYGNvbGxpc2lvbiBvbiBwcm9wZXJ0eSBuYW1lICR7cShuYW1lKX06ICR7ZW50cmllc0FycmF5fWA7XG4gfVxubmFtZXMuYWRkKG5hbWUpO1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBmYWlsZWQgdG8gY3JlYXRlIG9iamVjdCBmcm9tIHVuaXF1ZSBlbnRyaWVzYDtcbiB9OyRo4oCNX29uY2UuZnJvbVVuaXF1ZUVudHJpZXMoZnJvbVVuaXF1ZUVudHJpZXMpO1xuaGFyZGVuKGZyb21VbmlxdWVFbnRyaWVzKTtcblxuLyoqXG4gKiBCeSBhbmFsb2d5IHdpdGggaG93IGBBcnJheS5wcm90b3R5cGUubWFwYCB3aWxsIG1hcCB0aGUgZWxlbWVudHMgb2ZcbiAqIGFuIGFycmF5IHRvIHRyYW5zZm9ybWVkIGVsZW1lbnRzIG9mIGFuIGFycmF5IG9mIHRoZSBzYW1lIHNoYXBlLFxuICogYG9iamVjdE1hcGAgd2lsbCBkbyBsaWtld2lzZSBmb3IgdGhlIHN0cmluZy1uYW1lZCBvd24gZW51bWVyYWJsZVxuICogcHJvcGVydGllcyBvZiBhbiBvYmplY3QuXG4gKlxuICogVHlwaWNhbCB1c2FnZSBhcHBsaWVzIGBvYmplY3RNYXBgIHRvIGEgQ29weVJlY29yZCwgaS5lLixcbiAqIGFuIG9iamVjdCBmb3Igd2hpY2ggYHBhc3NTdHlsZU9mKG9yaWdpbmFsKSA9PT0gJ2NvcHlSZWNvcmQnYC4gRm9yIHRoZXNlLFxuICogbm9uZSBvZiB0aGUgZm9sbG93aW5nIGVkZ2UgY2FzZXMgYXJpc2UuIFRoZSByZXN1bHQgd2lsbCBiZSBhIENvcHlSZWNvcmRcbiAqIHdpdGggZXhhY3RseSB0aGUgc2FtZSBwcm9wZXJ0eSBuYW1lcywgd2hvc2UgdmFsdWVzIGFyZSB0aGUgbWFwcGVkIGZvcm0gb2ZcbiAqIHRoZSBvcmlnaW5hbCdzIHZhbHVlcy5cbiAqXG4gKiBXaGVuIHRoZSBvcmlnaW5hbCBpcyBub3QgYSBDb3B5UmVjb3JkLCBzb21lIGVkZ2UgY2FzZXMgdG8gYmUgYXdhcmUgb2ZcbiAqICAgICogTm8gbWF0dGVyIGhvdyBtdXRhYmxlIHRoZSBvcmlnaW5hbCBvYmplY3QsIHRoZSByZXR1cm5lZCBvYmplY3QgaXNcbiAqICAgICAgaGFyZGVuZWQuXG4gKiAgICAqIE9ubHkgdGhlIHN0cmluZy1uYW1lZCBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBvcmlnaW5hbFxuICogICAgICBhcmUgbWFwcGVkLiBBbGwgb3RoZXIgcHJvcGVydGllcyBhcmUgaWdub3JlZC5cbiAqICAgICogSWYgYW55IG9mIHRoZSBvcmlnaW5hbCBwcm9wZXJ0aWVzIHdlcmUgYWNjZXNzb3JzLCBgT2JqZWN0LmVudHJpZXNgXG4gKiAgICAgIHdpbGwgY2F1c2UgaXRzIGBnZXR0ZXJgIHRvIGJlIGNhbGxlZCBhbmQgd2lsbCB1c2UgdGhlIHJlc3VsdGluZ1xuICogICAgICB2YWx1ZS5cbiAqICAgICogTm8gbWF0dGVyIHdoZXRoZXIgdGhlIG9yaWdpbmFsIHByb3BlcnR5IHdhcyBhbiBhY2Nlc3Nvciwgd3JpdGFibGUsXG4gKiAgICAgIG9yIGNvbmZpZ3VyYWJsZSwgYWxsIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBiZVxuICogICAgICBub24td3JpdGFibGUsIG5vbi1jb25maWd1cmFibGUsIGRhdGEgcHJvcGVydGllcy5cbiAqICAgICogTm8gbWF0dGVyIHdoYXQgdGhlIG9yaWdpbmFsIG9iamVjdCBtYXkgaGF2ZSBpbmhlcml0ZWQgZnJvbSwgYW5kXG4gKiAgICAgIG5vIG1hdHRlciB3aGV0aGVyIGl0IHdhcyBhIHNwZWNpYWwga2luZCBvZiBvYmplY3Qgc3VjaCBhcyBhbiBhcnJheSxcbiAqICAgICAgdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGFsd2F5cyBiZSBhIHBsYWluIG9iamVjdCBpbmhlcml0aW5nIGRpcmVjdGx5XG4gKiAgICAgIGZyb20gYE9iamVjdC5wcm90b3R5cGVgIGFuZCB3aG9zZSBzdGF0ZSBpcyBvbmx5IHRoZXNlIG5ldyBtYXBwZWRcbiAqICAgICAgb3duIHByb3BlcnRpZXMuXG4gKlxuICogV2l0aCB0aGVzZSBkaWZmZXJlbmNlcywgZXZlbiBpZiB0aGUgb3JpZ2luYWwgb2JqZWN0IHdhcyBub3QgYSBDb3B5UmVjb3JkLFxuICogaWYgYWxsIHRoZSBtYXBwZWQgdmFsdWVzIGFyZSBQYXNzYWJsZSwgdGhlbiB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYmVcbiAqIGEgQ29weVJlY29yZC5cbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIGFueT59IE9cbiAqIEBwYXJhbSB7T30gb3JpZ2luYWxcbiAqIEB0ZW1wbGF0ZSBSIG1hcCByZXN1bHRcbiAqIEBwYXJhbSB7KHZhbHVlOiBPW2tleW9mIE9dLCBrZXk6IGtleW9mIE8pID0+IFJ9IG1hcEZuXG4gKiBAcmV0dXJucyB7eyBbUCBpbiBrZXlvZiBPXTogUn19XG4gKi9cbmNvbnN0ICAgICAgICBvYmplY3RNYXA9KG9yaWdpbmFsLG1hcEZuKT0+e1xuY29uc3QgZW50cz1lbnRyaWVzKG9yaWdpbmFsKTtcbmNvbnN0IG1hcEVudHM9ZW50cy5tYXAoKFtrLHZdKT0+W2ssbWFwRm4odixrKV0pO1xucmV0dXJuIGhhcmRlbihmcm9tRW50cmllcyhtYXBFbnRzKSk7XG4gfTskaOKAjV9vbmNlLm9iamVjdE1hcChvYmplY3RNYXApO1xuaGFyZGVuKG9iamVjdE1hcCk7XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nIHwgc3ltYm9sPn0gbGVmdE5hbWVzXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZyB8IHN5bWJvbD59IHJpZ2h0TmFtZXNcbiAqL1xuY29uc3QgICAgICAgIGxpc3REaWZmZXJlbmNlPShsZWZ0TmFtZXMscmlnaHROYW1lcyk9PntcbmNvbnN0IHJpZ2h0U2V0PW1ha2VTZXQocmlnaHROYW1lcyk7XG5yZXR1cm4gbGVmdE5hbWVzLmZpbHRlcigobmFtZSk9PiFyaWdodFNldC5oYXMobmFtZSkpO1xuIH07JGjigI1fb25jZS5saXN0RGlmZmVyZW5jZShsaXN0RGlmZmVyZW5jZSk7XG5oYXJkZW4obGlzdERpZmZlcmVuY2UpO1xuXG4vKipcbiAqIEBwYXJhbSB7RXJyb3J9IGlubmVyRXJyXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGxhYmVsXG4gKiBAcGFyYW0ge0Vycm9yQ29uc3RydWN0b3J9IFtFcnJvckNvbnN0cnVjdG9yXVxuICogQHJldHVybnMge25ldmVyfVxuICovXG5jb25zdCAgICAgICAgdGhyb3dMYWJlbGVkPShpbm5lckVycixsYWJlbCxFcnJvckNvbnN0cnVjdG9yPXVuZGVmaW5lZCk9PntcbmlmKHR5cGVvZiBsYWJlbD09PSdudW1iZXInKXtcbmxhYmVsPSBgWyR7bGFiZWx9XWA7XG4gfVxuY29uc3Qgb3V0ZXJFcnI9YXNzZXJ0LmVycm9yKFxuIGAke2xhYmVsfTogJHtpbm5lckVyci5tZXNzYWdlfWAsXG5FcnJvckNvbnN0cnVjdG9yKTtcblxuYXNzZXJ0Lm5vdGUob3V0ZXJFcnIsWCBgQ2F1c2VkIGJ5ICR7aW5uZXJFcnJ9YCk7XG50aHJvdyBvdXRlckVycjtcbiB9OyRo4oCNX29uY2UudGhyb3dMYWJlbGVkKHRocm93TGFiZWxlZCk7XG5oYXJkZW4odGhyb3dMYWJlbGVkKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgQSxSXG4gKiBAcGFyYW0geyguLi5hcmdzOiBBW10pID0+IFJ9IGZ1bmNcbiAqIEBwYXJhbSB7QVtdfSBhcmdzXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtsYWJlbF1cbiAqIEByZXR1cm5zIHtSfVxuICovXG5jb25zdCAgICAgICAgYXBwbHlMYWJlbGluZ0Vycm9yPShmdW5jLGFyZ3MsbGFiZWw9dW5kZWZpbmVkKT0+e1xuaWYobGFiZWw9PT11bmRlZmluZWQpe1xucmV0dXJuIGZ1bmMoLi4uYXJncyk7XG4gfVxubGV0IHJlc3VsdDtcbnRyeXtcbnJlc3VsdD1mdW5jKC4uLmFyZ3MpO1xuIH1jYXRjaChlcnIpe1xudGhyb3dMYWJlbGVkKGVycixsYWJlbCk7XG4gfVxuaWYoaXNQcm9taXNlKHJlc3VsdCkpe1xuLyogQHRzLWV4cGVjdC1lcnJvciBJZiByZXN1bHQgaXMgYSByZWplY3RlZCBwcm9taXNlLCB0aGlzIHdpbGwqL1xuLyogcmV0dXJuIGEgcHJvbWlzZSB3aXRoIGEgZGlmZmVyZW50IHJlamVjdGlvbiByZWFzb24uIEJ1dCB0aGlzKi9cbi8qIGNvbmZ1c2VzIFR5cGVTY3JpcHQgYmVjYXVzZSBpdCB0eXBlcyB0aGF0IGNhc2UgYXMgYFByb21pc2U8bmV2ZXI+YCovXG4vKiB3aGljaCBpcyBjb29sIGZvciBhIHByb21pc2UgdGhhdCB3aWxsIG5ldmVyIGZ1bGZsbC4qL1xuLyogQnV0IFR5cGVTY3JpcHQgZG9lc24ndCB1bmRlcnN0YW5kIHRoYXQgdGhpcyB3aWxsIG9ubHkgaGFwcGVuKi9cbi8qIHdoZW4gYHJlc3VsdGAgd2FzIGEgcmVqZWN0ZWQgcHJvbWlzZS4gSW4gb25seSB0aGlzIGNhc2UgYFJgKi9cbi8qIHNob3VsZCBhbHJlYWR5IGFsbG93IGBQcm9taXNlPG5ldmVyPmAgYXMgYSBzdWJ0eXBlLiovXG5yZXR1cm4gRS53aGVuKHJlc3VsdCx1bmRlZmluZWQsKHJlYXNvbik9PnRocm93TGFiZWxlZChyZWFzb24sbGFiZWwpKTtcbiB9ZWxzZXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH07JGjigI1fb25jZS5hcHBseUxhYmVsaW5nRXJyb3IoYXBwbHlMYWJlbGluZ0Vycm9yKTtcbmhhcmRlbihhcHBseUxhYmVsaW5nRXJyb3IpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7e1tLZXlUeXBlIGluIGtleW9mIFRdOiBUW0tleVR5cGVdfSAmIHt9fSBTaW1wbGlmeVxuICogZmxhdHRlbiB0aGUgdHlwZSBvdXRwdXQgdG8gaW1wcm92ZSB0eXBlIGhpbnRzIHNob3duIGluIGVkaXRvcnNcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvdHlwZS1mZXN0L2Jsb2IvbWFpbi9zb3VyY2Uvc2ltcGxpZnkuZC50c1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBDYWxsYWJsZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHt7fX0gVFxuICogQHR5cGVkZWYge3sgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBDYWxsYWJsZSA/IFRbS10gOiBEZWVwbHlBd2FpdGVkPFRbS10+IH19IERlZXBseUF3YWl0ZWRPYmplY3RcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7VCBleHRlbmRzIFByb21pc2VMaWtlPGFueT4gPyBBd2FpdGVkPFQ+IDogVCBleHRlbmRzIHt9ID8gU2ltcGxpZnk8RGVlcGx5QXdhaXRlZE9iamVjdDxUPj4gOiBBd2FpdGVkPFQ+fSBEZWVwbHlBd2FpdGVkXG4gKi9cblxuLyoqXG4gKiBBIG1vcmUgY29uc3RyYWluZWQgdmVyc2lvbiBvZiB7ZGVlcGx5RnVsZmlsbGVkfSBmb3IgdHlwZSBzYWZldHkgdW50aWxcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMTI1N1xuICogVXNlZnVsIGluIHN0YXJ0aW5nIGNvbnRyYWN0cyB0aGF0IG5lZWQgYWxsIHRlcm1zIHRvIGJlIGZ1bGZpbGxlZFxuICogaW4gb3JkZXIgdG8gYmUgZHVyYWJsZS5cbiAqXG4gKiBAdHlwZSB7PFQgZXh0ZW5kcyB7fT4odW5mdWxmaWxsZWRUZXJtczogVCkgPT4gUHJvbWlzZTxEZWVwbHlBd2FpdGVkPFQ+Pn1cbiAqL1xuY29uc3QgICAgICAgIGRlZXBseUZ1bGZpbGxlZE9iamVjdD1hc3luYyhvYmopPT57XG5pc09iamVjdChvYmopfHxGYWlsIGBwYXJhbSBtdXN0IGJlIGFuIG9iamVjdGA7XG5yZXR1cm4gZGVlcGx5RnVsZmlsbGVkKG9iaik7XG4gfTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB1c2VzIGEgbWlsbGlzZWNvbmQtYmFzZWQgdGltZS1zaW5jZS1lcG9jaCBjYXBhYmlsaXR5XG4gKiAoc3VjaCBhcyBgcGVyZm9ybWFuY2Uubm93YCkgdG8gbWVhc3VyZSBleGVjdXRpb24gdGltZSBvZiBhbiBhc3luYyBmdW5jdGlvblxuICogYW5kIHJlcG9ydCB0aGUgcmVzdWx0IGluIHNlY29uZHMgdG8gbWF0Y2ggb3VyIHRlbGVtZXRyeSBzdGFuZGFyZC5cbiAqXG4gKiBAcGFyYW0ge3R5cGVvZiBYaW1wb3J0KCdwZXJmX2hvb2tzJykucGVyZm9ybWFuY2Uubm93fSBjdXJyZW50VGltZU1pbGxpc2VjXG4gKiBAcmV0dXJucyB7PFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KSA9PiBQcm9taXNlPHsgcmVzdWx0OiBULCBkdXJhdGlvbjogbnVtYmVyIH0+fVxuICovJGjigI1fb25jZS5kZWVwbHlGdWxmaWxsZWRPYmplY3QoZGVlcGx5RnVsZmlsbGVkT2JqZWN0KTtcbmNvbnN0ICAgICAgICBtYWtlTWVhc3VyZVNlY29uZHM9KGN1cnJlbnRUaW1lTWlsbGlzZWMpPT57XG4vKiogQHBhcmFtIHsoKSA9PiBhbnl9IGZuICovXG5jb25zdCBtZWFzdXJlU2Vjb25kcz1hc3luYyhmbik9PntcbmNvbnN0IHQwPWN1cnJlbnRUaW1lTWlsbGlzZWMoKTtcbmNvbnN0IHJlc3VsdD1hd2FpdCBmbigpO1xuY29uc3QgZHVyYXRpb25NaWxsaXNlYz1jdXJyZW50VGltZU1pbGxpc2VjKCktdDA7XG5yZXR1cm57cmVzdWx0LGR1cmF0aW9uOmR1cmF0aW9uTWlsbGlzZWMvMTAwMH07XG4gfTtcbnJldHVybiBtZWFzdXJlU2Vjb25kcztcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7RXJyb3JbXX0gZXJyb3JzXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdXG4gKi8kaOKAjV9vbmNlLm1ha2VNZWFzdXJlU2Vjb25kcyhtYWtlTWVhc3VyZVNlY29uZHMpO1xuY29uc3QgICAgICAgIG1ha2VBZ2dyZWdhdGVFcnJvcj0oZXJyb3JzLG1lc3NhZ2UpPT57XG5jb25zdCBlcnI9RXJyb3IobWVzc2FnZSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhlcnIse1xubmFtZTp7XG52YWx1ZTonQWdncmVnYXRlRXJyb3InfSxcblxuZXJyb3JzOntcbnZhbHVlOmVycm9yc319KTtcblxuXG5yZXR1cm4gZXJyO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7cmVhZG9ubHkgKFQgfCBQcm9taXNlTGlrZTxUPilbXX0gaXRlbXNcbiAqIEByZXR1cm5zIHtQcm9taXNlPFRbXT59XG4gKi8kaOKAjV9vbmNlLm1ha2VBZ2dyZWdhdGVFcnJvcihtYWtlQWdncmVnYXRlRXJyb3IpO1xuY29uc3QgICAgICAgIFByb21pc2VBbGxPckVycm9ycz1hc3luYyhpdGVtcyk9PntcbnJldHVybiBQcm9taXNlLmFsbFNldHRsZWQoaXRlbXMpLnRoZW4oKHJlc3VsdHMpPT57XG5jb25zdCBlcnJvcnM9LyoqIEB0eXBlIHtQcm9taXNlUmVqZWN0ZWRSZXN1bHRbXX0gKi9cbnJlc3VsdHMuZmlsdGVyKCh7c3RhdHVzfSk9PnN0YXR1cz09PSdyZWplY3RlZCcpLlxubWFwKChyZXN1bHQpPT5yZXN1bHQucmVhc29uKTtcbmlmKCFlcnJvcnMubGVuZ3RoKXtcbnJldHVybiAoLyoqIEB0eXBlIHtQcm9taXNlRnVsZmlsbGVkUmVzdWx0PFQ+W119ICovcmVzdWx0cy5tYXAoXG4ocmVzdWx0KT0+cmVzdWx0LnZhbHVlKSk7XG5cbiB9ZWxzZSBpZihlcnJvcnMubGVuZ3RoPT09MSl7XG50aHJvdyBlcnJvcnNbMF07XG4gfWVsc2V7XG50aHJvdyBtYWtlQWdncmVnYXRlRXJyb3IoZXJyb3JzKTtcbiB9XG4gfSk7XG4gfTtcblxuLyoqXG4gKiBAdHlwZSB7PFQ+KFxuICogICB0cmllcjogKCkgPT4gUHJvbWlzZTxUPixcbiAqICBmaW5hbGl6ZXI6IChlcnJvcj86IHVua25vd24pID0+IFByb21pc2U8dm9pZD4sXG4gKiApID0+IFByb21pc2U8VD59XG4gKi8kaOKAjV9vbmNlLlByb21pc2VBbGxPckVycm9ycyhQcm9taXNlQWxsT3JFcnJvcnMpO2NvbnN0IGFnZ3JlZ2F0ZVRyeUZpbmFsbHk9YXN5bmModHJpZXIsZmluYWxpemVyKT0+XG50cmllcigpLnRoZW4oXG5hc3luYyhyZXN1bHQpPT5maW5hbGl6ZXIoKS50aGVuKCgpPT5yZXN1bHQpLFxuYXN5bmModHJ5RXJyb3IpPT5cbmZpbmFsaXplcih0cnlFcnJvcikuXG50aGVuKFxuKCk9PnRyeUVycm9yLFxuKGZpbmFsaXplRXJyb3IpPT5tYWtlQWdncmVnYXRlRXJyb3IoW3RyeUVycm9yLGZpbmFsaXplRXJyb3JdKSkuXG5cbnRoZW4oKGVycm9yKT0+UHJvbWlzZS5yZWplY3QoZXJyb3IpKSk7XG5cblxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBUXG4gKiBAdHlwZWRlZiB7e1tQIGluIGtleW9mIFRdOiBFeGNsdWRlPFRbUF0sIHVuZGVmaW5lZD47fX0gQWxsRGVmaW5lZFxuICovXG5cbi8qKlxuICogQ29uY2lzZSB3YXkgdG8gY2hlY2sgdmFsdWVzIGFyZSBhdmFpbGFibGUgZnJvbSBvYmplY3QgbGl0ZXJhbCBzaG9ydGhhbmQuXG4gKiBUaHJvd3MgZXJyb3IgbWVzc2FnZSB0byBzcGVjaWZ5IHRoZSBtaXNzaW5nIHZhbHVlcy5cbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBUXG4gKiBAcGFyYW0ge1R9IG9ialxuICogQHRocm93cyBpZiBhbnkgdmFsdWUgaW4gdGhlIG9iamVjdCBlbnRyaWVzIGlzIG5vdCBkZWZpbmVkXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBvYmogaXMgQWxsRGVmaW5lZDxUPn1cbiAqLyRo4oCNX29uY2UuYWdncmVnYXRlVHJ5RmluYWxseShhZ2dyZWdhdGVUcnlGaW5hbGx5KTtcblxuY29uc3QgICAgICAgIGFzc2VydEFsbERlZmluZWQ9KG9iaik9PntcbmNvbnN0IG1pc3Npbmc9W107XG5mb3IoY29uc3Rba2V5LHZhbF1vZiBPYmplY3QuZW50cmllcyhvYmopKXtcbmlmKHZhbD09PXVuZGVmaW5lZCl7XG5taXNzaW5nLnB1c2goa2V5KTtcbiB9XG4gfVxuaWYobWlzc2luZy5sZW5ndGg+MCl7XG5GYWlsIGBtaXNzaW5nICR7cShtaXNzaW5nKX1gO1xuIH1cbiB9O1xuXG4vKiogQHR5cGUge0l0ZXJhdG9yUmVzdWx0PHVuZGVmaW5lZCwgbmV2ZXI+fSAqLyRo4oCNX29uY2UuYXNzZXJ0QWxsRGVmaW5lZChhc3NlcnRBbGxEZWZpbmVkKTtcbmNvbnN0IG5vdERvbmU9aGFyZGVuKHtkb25lOmZhbHNlLHZhbHVlOnVuZGVmaW5lZH0pO1xuXG4vKiogQHR5cGUge0l0ZXJhdG9yUmVzdWx0PG5ldmVyLCB2b2lkPn0gKi9cbmNvbnN0IGFsd2F5c0RvbmU9aGFyZGVuKHtkb25lOnRydWUsdmFsdWU6dW5kZWZpbmVkfSk7XG5cbmNvbnN0ICAgICAgICBmb3JldmVyPWFzeW5jR2VuZXJhdGUoKCk9Pm5vdERvbmUpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0geygpID0+IFR9IHByb2R1Y2VcbiAqIFRoZSB2YWx1ZSBvZiBgYXdhaXQgcHJvZHVjZSgpYCBpcyB1c2VkIGZvciBpdHMgdHJ1dGhpbmVzcyB2cyBmYWxzaW5lc3MuXG4gKiBJT1csIGl0IGlzIGNvZXJjZWQgdG8gYSBib29sZWFuIHNvIHRoZSBjYWxsZXIgbmVlZCBub3QgYm90aGVyIGRvaW5nIHRoaXNcbiAqIHRoZW1zZWx2ZXMuXG4gKiBAcmV0dXJucyB7QXN5bmNJdGVyYWJsZTxBd2FpdGVkPFQ+Pn1cbiAqLyRo4oCNX29uY2UuZm9yZXZlcihmb3JldmVyKTtcbmNvbnN0ICAgICAgICB3aGlsZVRydWU9KHByb2R1Y2UpPT5cbmFzeW5jR2VuZXJhdGUoYXN5bmMoKT0+e1xuY29uc3QgdmFsdWU9YXdhaXQgcHJvZHVjZSgpO1xuaWYoIXZhbHVlKXtcbnJldHVybiBhbHdheXNEb25lO1xuIH1cbnJldHVybiBoYXJkZW4oe1xuZG9uZTpmYWxzZSxcbnZhbHVlfSk7XG5cbiB9KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHsoKSA9PiBUfSBwcm9kdWNlXG4gKiBUaGUgdmFsdWUgb2YgYGF3YWl0IHByb2R1Y2UoKWAgaXMgdXNlZCBmb3IgaXRzIHRydXRoaW5lc3MgdnMgZmFsc2luZXNzLlxuICogSU9XLCBpdCBpcyBjb2VyY2VkIHRvIGEgYm9vbGVhbiBzbyB0aGUgY2FsbGVyIG5lZWQgbm90IGJvdGhlciBkb2luZyB0aGlzXG4gKiB0aGVtc2VsdmVzLlxuICogQHJldHVybnMge0FzeW5jSXRlcmFibGU8QXdhaXRlZDxUPj59XG4gKi8kaOKAjV9vbmNlLndoaWxlVHJ1ZSh3aGlsZVRydWUpO1xuY29uc3QgICAgICAgIHVudGlsVHJ1ZT0ocHJvZHVjZSk9PlxuYXN5bmNHZW5lcmF0ZShhc3luYygpPT57XG5jb25zdCB2YWx1ZT1hd2FpdCBwcm9kdWNlKCk7XG5pZih2YWx1ZSl7XG5yZXR1cm4gaGFyZGVuKHtcbmRvbmU6dHJ1ZSxcbnZhbHVlfSk7XG5cbiB9XG5yZXR1cm4gaGFyZGVuKHtcbmRvbmU6ZmFsc2UsXG52YWx1ZX0pO1xuXG4gfSk7XG5cbi8qKiBAdHlwZSB7IDxYLCBZPih4czogWFtdLCB5czogWVtdKSA9PiBbWCwgWV1bXX0gKi8kaOKAjV9vbmNlLnVudGlsVHJ1ZSh1bnRpbFRydWUpO1xuY29uc3QgICAgICAgIHppcD0oeHMseXMpPT5oYXJkZW4oeHMubWFwKCh4LGkpPT5beCx5c1sraV1dKSk7XG5cbi8qKiBAdHlwZSB7IDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgRVJlZjxhbnk+Pj4ob2JqOiBUKSA9PiBQcm9taXNlPHsgW0sgaW4ga2V5b2YgVF06IEF3YWl0ZWQ8VFtLXT59PiB9ICovJGjigI1fb25jZS56aXAoemlwKTtcbmNvbnN0ICAgICAgICBhbGxWYWx1ZXM9YXN5bmMob2JqKT0+e1xuY29uc3QgcmVzb2x2ZWQ9YXdhaXQgUHJvbWlzZS5hbGwodmFsdWVzKG9iaikpO1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbnJldHVybiBoYXJkZW4oZnJvbUVudHJpZXMoemlwKGtleXMob2JqKSxyZXNvbHZlZCkpKTtcbiB9OyRo4oCNX29uY2UuYWxsVmFsdWVzKGFsbFZhbHVlcyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQkFTSVNfUE9JTlRTIjpbIkJBU0lTX1BPSU5UUyJdLCJmcm9tVW5pcXVlRW50cmllcyI6WyJmcm9tVW5pcXVlRW50cmllcyJdLCJvYmplY3RNYXAiOlsib2JqZWN0TWFwIl0sImxpc3REaWZmZXJlbmNlIjpbImxpc3REaWZmZXJlbmNlIl0sInRocm93TGFiZWxlZCI6WyJ0aHJvd0xhYmVsZWQiXSwiYXBwbHlMYWJlbGluZ0Vycm9yIjpbImFwcGx5TGFiZWxpbmdFcnJvciJdLCJkZWVwbHlGdWxmaWxsZWRPYmplY3QiOlsiZGVlcGx5RnVsZmlsbGVkT2JqZWN0Il0sIm1ha2VNZWFzdXJlU2Vjb25kcyI6WyJtYWtlTWVhc3VyZVNlY29uZHMiXSwibWFrZUFnZ3JlZ2F0ZUVycm9yIjpbIm1ha2VBZ2dyZWdhdGVFcnJvciJdLCJQcm9taXNlQWxsT3JFcnJvcnMiOlsiUHJvbWlzZUFsbE9yRXJyb3JzIl0sImFnZ3JlZ2F0ZVRyeUZpbmFsbHkiOlsiYWdncmVnYXRlVHJ5RmluYWxseSJdLCJhc3NlcnRBbGxEZWZpbmVkIjpbImFzc2VydEFsbERlZmluZWQiXSwiZm9yZXZlciI6WyJmb3JldmVyIl0sIndoaWxlVHJ1ZSI6WyJ3aGlsZVRydWUiXSwidW50aWxUcnVlIjpbInVudGlsVHJ1ZSJdLCJ6aXAiOlsiemlwIl0sImFsbFZhbHVlcyI6WyJhbGxWYWx1ZXMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAXc3uDlcBAABXAQAAIwAAAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL2V4cG9ydGVkLmpzeyJpbXBvcnRzIjpbIi4vc3JjL3R5cGVzLWFtYmllbnQuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAiMhonL0SAAC9EgAAMwAAAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc3siaW1wb3J0cyI6WyIuL3N1YnNjcmliZS5qcyIsIi4vdHlwZXMtYW1iaWVudC5qcyIsIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIiwib2JzZXJ2ZUl0ZXJhdGlvbiIsIm9ic2VydmVJdGVyYXRvciIsIm9ic2VydmVOb3RpZmllciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLHN1YnNjcmliZUxhdGVzdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiLi9zdWJzY3JpYmUuanNcIiwgW1tcInN1YnNjcmliZUxhdGVzdFwiLCBbJGjigI1fYSA9PiAoc3Vic2NyaWJlTGF0ZXN0ID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIGBzdWJzY3JpYmVMYXRlc3RgIGZyb20gYEBhZ29yaWMvbm90aWZpZXIvc3Vic2NyaWJlLmpzYCBpbnN0ZWFkLlxuICpcbiAqIEFkYXB0b3IgZnJvbSBhIG5vdGlmaWVyUCB0byBhbiBhc3luYyBpdGVyYWJsZS5cbiAqIFRoZSBub3RpZmllclAgY2FuIGJlIGFueSBvYmplY3QgdGhhdCBoYXMgYW4gZXZlbnR1YWxseSBpbnZvY2FibGVcbiAqIGBnZXRVcGRhdGVTaW5jZWAgbWV0aG9kIHRoYXQgYmVoYXZlcyBhY2NvcmRpbmcgdG8gdGhlIG5vdGlmaWVyXG4gKiBzcGVjLiBUaGlzIGNhbiBiZSBhIG5vdGlmaWVyLCBhIHByb21pc2UgZm9yIGEgbG9jYWwgb3IgcmVtb3RlXG4gKiBub3RpZmllciwgb3IgYSBwcmVzZW5jZSBvZiBhIHJlbW90ZSBub3RpZmllci5cbiAqXG4gKiBJdCBpcyBhbHNvIHVzZWQgaW50ZXJuYWxseSBieSBub3RpZmllci5qcyBzbyB0aGF0IGEgbm90aWZpZXIgaXRzZWxmIGlzIGFuXG4gKiBhc3luYyBpdGVyYWJsZS5cbiAqXG4gKiBBbiBhc3luYyBpdGVyYWJsZSBpcyBhbiBvYmplY3Qgd2l0aCBhIGBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKClgIG1ldGhvZFxuICogdGhhdCByZXR1cm5zIGFuIGFzeW5jIGl0ZXJhdG9yLiBUaGUgYXN5bmMgaXRlcmF0b3Igd2UgcmV0dXJuIGhlcmUgaGFzIG9ubHlcbiAqIGEgYG5leHQoKWAgbWV0aG9kLCB3aXRob3V0IHRoZSBvcHRpb25hbCBgcmV0dXJuYCBhbmQgYHRocm93YCBtZXRob2RzLiBUaGVcbiAqIG9taXR0ZWQgbWV0aG9kcywgaWYgcHJlc2VudCwgd291bGQgYmUgdXNlZCBieSB0aGUgZm9yL2F3YWl0L29mIGxvb3AgdG9cbiAqIGluZm9ybSB0aGUgaXRlcmF0b3Igb2YgZWFybHkgdGVybWluYXRpb24uIEJ1dCB0aGlzIGFkYXB0b3Igd291bGQgbm90IGRvXG4gKiBhbnl0aGluZyB1c2VmdWwgaW4gcmVhY3Rpb24gdG8gdGhpcyBub3RpZmljYXRpb24uXG4gKlxuICogQW4gYXN5bmMgaXRlcmF0b3IncyBgbmV4dCgpYCBtZXRob2QgcmV0dXJucyBhIHByb21pc2UgZm9yIGFuIGl0ZXJhdGlvblxuICogcmVzdWx0LiBBbiBpdGVyYXRpb24gcmVzdWx0IGlzIGEgcmVjb3JkIHdpdGggYHZhbHVlYCBhbmQgYGRvbmVgIHByb3BlcnRpZXMuXG4gKlxuICogVGhlIHB1cnBvc2Ugb2YgYnVpbGRpbmcgb24gdGhlIG5vdGlmaWVyIHByb3RvY29sIGlzIHRvIGhhdmUgYSBsb3NzeVxuICogYWRhcHRvciwgd2hlcmUgaW50ZXJtZWRpYXRlIHJlc3VsdHMgY2FuIGJlIG1pc3NlZCBpbiBmYXZvciBvZiBtb3JlIHJlY2VudFxuICogcmVzdWx0cyB3aGljaCBhcmUgdGhlcmVmb3JlIGxlc3Mgc3RhbGUuIFNlZVxuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9kb2N1bWVudGF0aW9uL2Jsb2IvSEVBRC9tYWluL2d1aWRlcy9qcy1wcm9ncmFtbWluZy9ub3RpZmllcnMubWRcbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEJhc2VOb3RpZmllcjxUPj59IG5vdGlmaWVyUFxuICogQHJldHVybnMge0ZvcmthYmxlQXN5bmNJdGVyYWJsZTxUPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyPXN1YnNjcmliZUxhdGVzdDtcblxuLyoqXG4gKiBUaGlzIGFkdmFuY2VzIGBhc3luY0l0ZXJhdG9yUGAgdXBkYXRpbmcgYGl0ZXJhdGlvbk9ic2VydmVyYCB3aXRoIGVhY2hcbiAqIHN1Y2Nlc3NpdmUgdmFsdWUuIFRoZSBgaXRlcmF0aW9uT2JzZXJ2ZXJgIG1heSBvbmx5IGJlIGludGVyZXN0ZWQgaW4gY2VydGFpblxuICogb2NjdXJyZW5jZXMgKGB1cGRhdGVTdGF0ZWAsIGBmaW5pc2hgLCBgZmFpbGApLCBzbyBmb3IgY29udmVuaWVuY2UsXG4gKiBgb2JzZXJ2ZUl0ZXJhdG9yYCBmZWF0dXJlIHRlc3RzIGZvciB0aG9zZSBtZXRob2RzIGJlZm9yZSBjYWxsaW5nIHRoZW0uXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxBc3luY0l0ZXJhdG9yPFQ+Pn0gYXN5bmNJdGVyYXRvclBcbiAqIEBwYXJhbSB7UGFydGlhbDxJdGVyYXRpb25PYnNlcnZlcjxUPj59IGl0ZXJhdGlvbk9ic2VydmVyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx1bmRlZmluZWQ+fVxuICovJGjigI1fb25jZS5tYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllcihtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllcik7XG5jb25zdCAgICAgICAgb2JzZXJ2ZUl0ZXJhdG9yPShhc3luY0l0ZXJhdG9yUCxpdGVyYXRpb25PYnNlcnZlcik9PntcbnJldHVybiBuZXcgUHJvbWlzZSgoYWNrLG9ic2VydmVyRXJyb3IpPT57XG5jb25zdCByZWN1cj0oKT0+e1xuRS53aGVuKFxuRShhc3luY0l0ZXJhdG9yUCkubmV4dCgpLFxuKHt2YWx1ZSxkb25lfSk9PntcbmlmKGRvbmUpe1xuaXRlcmF0aW9uT2JzZXJ2ZXIuZmluaXNoJiZpdGVyYXRpb25PYnNlcnZlci5maW5pc2godmFsdWUpO1xuYWNrKHVuZGVmaW5lZCk7XG4gfWVsc2V7XG5pdGVyYXRpb25PYnNlcnZlci51cGRhdGVTdGF0ZSYmXG5pdGVyYXRpb25PYnNlcnZlci51cGRhdGVTdGF0ZSh2YWx1ZSk7XG5yZWN1cigpO1xuIH1cbiB9LFxuKHJlYXNvbik9Pntcbml0ZXJhdGlvbk9ic2VydmVyLmZhaWwmJml0ZXJhdGlvbk9ic2VydmVyLmZhaWwocmVhc29uKTtcbmFjayh1bmRlZmluZWQpO1xuIH0pLlxuY2F0Y2gob2JzZXJ2ZXJFcnJvcik7XG4gfTtcbnJlY3VyKCk7XG4gfSk7XG4gfTtcblxuLyoqXG4gKiBUaGlzIHJlYWRzIGZyb20gYGFzeW5jSXRlcmFibGVQYCB1cGRhdGluZyBgaXRlcmF0aW9uT2JzZXJ2ZXJgIHdpdGggZWFjaFxuICogc3VjY2Vzc2l2ZSB2YWx1ZS4gVGhlIGBpdGVyYXRpb25PYnNlcnZlcmAgbWF5IG9ubHkgYmUgaW50ZXJlc3RlZCBpbiBjZXJ0YWluXG4gKiBvY2N1cnJlbmNlcyAoYHVwZGF0ZVN0YXRlYCwgYGZpbmlzaGAsIGBmYWlsYCksIHNvIGZvciBjb252ZW5pZW5jZSxcbiAqIGBvYnNlcnZlSXRlcmF0aW9uYCBmZWF0dXJlIHRlc3RzIGZvciB0aG9zZSBtZXRob2RzIGJlZm9yZSBjYWxsaW5nIHRoZW0uXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxBc3luY0l0ZXJhYmxlPFQ+Pn0gYXN5bmNJdGVyYWJsZVBcbiAqIEBwYXJhbSB7UGFydGlhbDxJdGVyYXRpb25PYnNlcnZlcjxUPj59IGl0ZXJhdGlvbk9ic2VydmVyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx1bmRlZmluZWQ+fVxuICovJGjigI1fb25jZS5vYnNlcnZlSXRlcmF0b3Iob2JzZXJ2ZUl0ZXJhdG9yKTtcbmNvbnN0ICAgICAgICBvYnNlcnZlSXRlcmF0aW9uPShhc3luY0l0ZXJhYmxlUCxpdGVyYXRpb25PYnNlcnZlcik9PntcbmNvbnN0IGl0ZXJhdG9yUD1FKGFzeW5jSXRlcmFibGVQKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcbnJldHVybiBvYnNlcnZlSXRlcmF0b3IoaXRlcmF0b3JQLGl0ZXJhdGlvbk9ic2VydmVyKTtcbiB9O1xuXG4vKipcbiAqIEFzIHVwZGF0ZXMgY29tZSBpbiBmcm9tIHRoZSBwb3NzaWJseSByZW1vdGUgYG5vdGlmaWVyUGAsIHVwZGF0ZVxuICogdGhlIGxvY2FsIGB1cGRhdGVyYC4gU2luY2UgdGhlIHVwZGF0ZXMgY29tZSBmcm9tIGEgbm90aWZpZXIsIHRoZXlcbiAqIGFyZSBsb3NzeSwgaS5lLiwgb25jZSBhIG1vcmUgcmVjZW50IHN0YXRlIGNhbiBiZSByZXBvcnRlZCwgbGVzcyByZWNlbnRcbiAqIHN0YXRlcyBhcmUgYXNzdW1lZCBpcnJlbGV2YW50IGFuZCBkcm9wcGVkLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8Tm90aWZpZXI8VD4+fSBub3RpZmllclBcbiAqIEBwYXJhbSB7UGFydGlhbDxJdGVyYXRpb25PYnNlcnZlcjxUPj59IGl0ZXJhdGlvbk9ic2VydmVyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx1bmRlZmluZWQ+fVxuICovJGjigI1fb25jZS5vYnNlcnZlSXRlcmF0aW9uKG9ic2VydmVJdGVyYXRpb24pO1xuY29uc3QgICAgICAgIG9ic2VydmVOb3RpZmllcj0obm90aWZpZXJQLGl0ZXJhdGlvbk9ic2VydmVyKT0+XG5vYnNlcnZlSXRlcmF0aW9uKHN1YnNjcmliZUxhdGVzdChub3RpZmllclApLGl0ZXJhdGlvbk9ic2VydmVyKTskaOKAjV9vbmNlLm9ic2VydmVOb3RpZmllcihvYnNlcnZlTm90aWZpZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIjpbIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIl0sIm9ic2VydmVJdGVyYXRvciI6WyJvYnNlcnZlSXRlcmF0b3IiXSwib2JzZXJ2ZUl0ZXJhdGlvbiI6WyJvYnNlcnZlSXRlcmF0aW9uIl0sIm9ic2VydmVOb3RpZmllciI6WyJvYnNlcnZlTm90aWZpZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA0DcnZLMKAACzCgAAJAAAAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIiwiLi9ub3RpZmllci5qcyIsIi4vcHVibGlzaC1raXQuanMiLCIuL3N0b3JlZC1ub3RpZmllci5qcyIsIi4vc3RvcmVkLXRvcGljLmpzIiwiLi9zdG9yZXN1Yi5qcyIsIi4vc3Vic2NyaWJlLmpzIiwiLi9zdWJzY3JpYmVyLmpzIl0sImV4cG9ydHMiOlsiU3Vic2NyaWJlclNoYXBlIiwibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiLCJtYWtlTm90aWZpZXIiLCJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSIsIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIiwibWFrZU5vdGlmaWVyS2l0IiwibWFrZVB1Ymxpc2hLaXQiLCJtYWtlU3Vic2NyaXB0aW9uIiwibWFrZVN1YnNjcmlwdGlvbktpdCIsIm9ic2VydmVJdGVyYXRpb24iLCJvYnNlcnZlSXRlcmF0b3IiLCJvYnNlcnZlTm90aWZpZXIiLCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiLCJzdWJzY3JpYmVFYWNoIiwic3Vic2NyaWJlTGF0ZXN0Il0sInJlZXhwb3J0cyI6WyIuL3N0b3JlZC1ub3RpZmllci5qcyIsIi4vc3RvcmVkLXRvcGljLmpzIiwiLi9zdG9yZXN1Yi5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vcHVibGlzaC1raXQuanNcIiwgW1tcIm1ha2VQdWJsaXNoS2l0XCIsIFskaOKAjV9saXZlW1wibWFrZVB1Ymxpc2hLaXRcIl1dXSxbXCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXRcIiwgWyRo4oCNX2xpdmVbXCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXRcIl1dXSxbXCJTdWJzY3JpYmVyU2hhcGVcIiwgWyRo4oCNX2xpdmVbXCJTdWJzY3JpYmVyU2hhcGVcIl1dXV1dLFtcIi4vc3Vic2NyaWJlLmpzXCIsIFtbXCJzdWJzY3JpYmVFYWNoXCIsIFskaOKAjV9saXZlW1wic3Vic2NyaWJlRWFjaFwiXV1dLFtcInN1YnNjcmliZUxhdGVzdFwiLCBbJGjigI1fbGl2ZVtcInN1YnNjcmliZUxhdGVzdFwiXV1dXV0sW1wiLi9ub3RpZmllci5qc1wiLCBbW1wibWFrZU5vdGlmaWVyXCIsIFskaOKAjV9saXZlW1wibWFrZU5vdGlmaWVyXCJdXV0sW1wibWFrZU5vdGlmaWVyS2l0XCIsIFskaOKAjV9saXZlW1wibWFrZU5vdGlmaWVyS2l0XCJdXV0sW1wibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGVcIiwgWyRo4oCNX2xpdmVbXCJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZVwiXV1dLFtcIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyXCIsIFskaOKAjV9saXZlW1wibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXJcIl1dXV1dLFtcIi4vc3Vic2NyaWJlci5qc1wiLCBbW1wibWFrZVN1YnNjcmlwdGlvblwiLCBbJGjigI1fbGl2ZVtcIm1ha2VTdWJzY3JpcHRpb25cIl1dXSxbXCJtYWtlU3Vic2NyaXB0aW9uS2l0XCIsIFskaOKAjV9saXZlW1wibWFrZVN1YnNjcmlwdGlvbktpdFwiXV1dXV0sW1wiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc1wiLCBbW1wib2JzZXJ2ZU5vdGlmaWVyXCIsIFskaOKAjV9saXZlW1wib2JzZXJ2ZU5vdGlmaWVyXCJdXV0sW1wib2JzZXJ2ZUl0ZXJhdG9yXCIsIFskaOKAjV9saXZlW1wib2JzZXJ2ZUl0ZXJhdG9yXCJdXV0sW1wib2JzZXJ2ZUl0ZXJhdGlvblwiLCBbJGjigI1fbGl2ZVtcIm9ic2VydmVJdGVyYXRpb25cIl1dXSxbXCJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllclwiLCBbJGjigI1fbGl2ZVtcIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyXCJdXV1dXSxbXCIuL3N0b3Jlc3ViLmpzXCIsIFtdXSxbXCIuL3N0b3JlZC1ub3RpZmllci5qc1wiLCBbXV0sW1wiLi9zdG9yZWQtdG9waWMuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnsibWFrZVB1Ymxpc2hLaXQiOlsibWFrZVB1Ymxpc2hLaXQiLGZhbHNlXSwicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0IjpbInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCIsZmFsc2VdLCJTdWJzY3JpYmVyU2hhcGUiOlsiU3Vic2NyaWJlclNoYXBlIixmYWxzZV0sInN1YnNjcmliZUVhY2giOlsic3Vic2NyaWJlRWFjaCIsZmFsc2VdLCJzdWJzY3JpYmVMYXRlc3QiOlsic3Vic2NyaWJlTGF0ZXN0IixmYWxzZV0sIm1ha2VOb3RpZmllciI6WyJtYWtlTm90aWZpZXIiLGZhbHNlXSwibWFrZU5vdGlmaWVyS2l0IjpbIm1ha2VOb3RpZmllcktpdCIsZmFsc2VdLCJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSI6WyJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSIsZmFsc2VdLCJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciI6WyJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciIsZmFsc2VdLCJtYWtlU3Vic2NyaXB0aW9uIjpbIm1ha2VTdWJzY3JpcHRpb24iLGZhbHNlXSwibWFrZVN1YnNjcmlwdGlvbktpdCI6WyJtYWtlU3Vic2NyaXB0aW9uS2l0IixmYWxzZV0sIm9ic2VydmVOb3RpZmllciI6WyJvYnNlcnZlTm90aWZpZXIiLGZhbHNlXSwib2JzZXJ2ZUl0ZXJhdG9yIjpbIm9ic2VydmVJdGVyYXRvciIsZmFsc2VdLCJvYnNlcnZlSXRlcmF0aW9uIjpbIm9ic2VydmVJdGVyYXRpb24iLGZhbHNlXSwibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiOlsibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiLGZhbHNlXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAOpoockkYAABJGAAAJwAAAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9ub3RpZmllci5qc3siaW1wb3J0cyI6WyIuL3B1Ymxpc2gta2l0LmpzIiwiLi9zdWJzY3JpYmUuanMiLCIuL3R5cGVzLWFtYmllbnQuanMiLCJAYWdvcmljL2Fzc2VydCIsIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbIm1ha2VOb3RpZmllciIsIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIiwibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiLCJtYWtlTm90aWZpZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0LEUsRmFyLG1ha2VQdWJsaXNoS2l0LHN1YnNjcmliZUxhdGVzdDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiYXNzZXJ0XCIsIFskaOKAjV9hID0+IChhc3NlcnQgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXSxbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVzLWFtYmllbnQuanNcIiwgW11dLFtcIi4vcHVibGlzaC1raXQuanNcIiwgW1tcIm1ha2VQdWJsaXNoS2l0XCIsIFskaOKAjV9hID0+IChtYWtlUHVibGlzaEtpdCA9ICRo4oCNX2EpXV1dXSxbXCIuL3N1YnNjcmliZS5qc1wiLCBbW1wic3Vic2NyaWJlTGF0ZXN0XCIsIFskaOKAjV9hID0+IChzdWJzY3JpYmVMYXRlc3QgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8TGF0ZXN0VG9waWM8VD4+fSBzaGFyYWJsZUludGVybmFsc1BcbiAqIEByZXR1cm5zIHtOb3RpZmllcjxUPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VOb3RpZmllcj0oc2hhcmFibGVJbnRlcm5hbHNQKT0+e1xuLyoqIEB0eXBlIHtOb3RpZmllcjxUPn0gKi9cbmNvbnN0IG5vdGlmaWVyPUZhcignbm90aWZpZXInLHtcbi4uLnN1YnNjcmliZUxhdGVzdChzaGFyYWJsZUludGVybmFsc1ApLFxuZ2V0VXBkYXRlU2luY2U6YXN5bmModXBkYXRlQ291bnQpPT5cbkUoc2hhcmFibGVJbnRlcm5hbHNQKS5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCksXG5cbi8qKlxuICogVXNlIHRoaXMgdG8gZGlzdHJpYnV0ZSBhIE5vdGlmaWVyIGVmZmljaWVudGx5IG92ZXIgdGhlIG5ldHdvcmssXG4gKiBieSBvYnRhaW5pbmcgdGhpcyBmcm9tIHRoZSBOb3RpZmllciB0byBiZSByZXBsaWNhdGVkLCBhbmQgYXBwbHlpbmdcbiAqIGBtYWtlTm90aWZpZXJgIHRvIGl0IGF0IHRoZSBuZXcgc2l0ZSB0byBnZXQgYW4gZXF1aXZhbGVudCBsb2NhbFxuICogTm90aWZpZXIgYXQgdGhhdCBzaXRlLlxuICovXG5nZXRTaGFyYWJsZU5vdGlmaWVySW50ZXJuYWxzOmFzeW5jKCk9PnNoYXJhYmxlSW50ZXJuYWxzUCxcbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqIFVzZWQgb25seSBieSBgbWFrZUNhc3RpbmdTcGVjRnJvbVJlZmAuICBJbnN0ZWFkIHRoYXQgZnVuY3Rpb24gc2hvdWxkIHVzZVxuICogdGhlIGBTdG9yZWRGYWNldGAgQVBJLlxuICovXG5nZXRTdG9yZUtleTooKT0+aGFyZGVuKHtub3RpZmllcn0pfSk7XG5cbnJldHVybiBub3RpZmllcjtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8U3Vic2NyaWJlcjxUPj59IHN1YnNjcmliZXJcbiAqIEByZXR1cm5zIHtOb3RpZmllcjxUPn1cbiAqLyRo4oCNX29uY2UubWFrZU5vdGlmaWVyKG1ha2VOb3RpZmllcik7XG5jb25zdCAgICAgICAgbWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXI9KHN1YnNjcmliZXIpPT57XG4vKipcbiAqIEB0eXBlIHtMYXRlc3RUb3BpYzxUPn1cbiAqL1xuY29uc3QgYmFzZU5vdGlmaWVyPWhhcmRlbih7XG5nZXRVcGRhdGVTaW5jZToodXBkYXRlQ291bnQ9dW5kZWZpbmVkKT0+XG5FKHN1YnNjcmliZXIpLmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50KX0pO1xuXG5cbi8qKiBAdHlwZSB7Tm90aWZpZXI8VD59ICovXG5jb25zdCBub3RpZmllcj1GYXIoJ25vdGlmaWVyJyx7XG4uLi5tYWtlTm90aWZpZXIoYmFzZU5vdGlmaWVyKSxcbi4uLmJhc2VOb3RpZmllcn0pO1xuXG5yZXR1cm4gbm90aWZpZXI7XG4gfTskaOKAjV9vbmNlLm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyKG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyKTtcbmhhcmRlbihtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcik7XG5cbi8qKlxuICogUHJvZHVjZXMgYSBwYWlyIG9mIG9iamVjdHMsIHdoaWNoIGFsbG93IGEgc2VydmljZSB0byBwcm9kdWNlIGEgc3RyZWFtIG9mXG4gKiB1cGRhdGUgcHJvbWlzZXMuXG4gKlxuICogVGhlIGluaXRpYWwgc3RhdGUgYXJndW1lbnQgaGFzIHRvIGJlIHRydWx5IG9wdGlvbmFsIGV2ZW4gdGhvdWdoIGl0IGNhblxuICogYmUgYW55IGZpcnN0IGNsYXNzIHZhbHVlIGluY2x1ZGluZyBgdW5kZWZpbmVkYC4gV2UgbmVlZCB0byBkaXN0aW5ndWlzaCB0aGVcbiAqIHByZXNlbmNlIHZzIHRoZSBhYnNlbmNlIG9mIGl0LCB3aGljaCB3ZSBjYW5ub3QgZG8gd2l0aCB0aGUgb3B0aW9uYWwgYXJndW1lbnRcbiAqIHN5bnRheC4gUmF0aGVyIHdlIHVzZSB0aGUgYXJpdHkgb2YgdGhlIGBpbml0aWFsU3RhdGVBcnJgIGFycmF5LlxuICpcbiAqIElmIG5vIGluaXRpYWwgc3RhdGUgaXMgcHJvdmlkZWQgdG8gYG1ha2VOb3RpZmllcktpdGAsIHRoZW4gaXQgc3RhcnRzIHdpdGhvdXRcbiAqIGFuIGluaXRpYWwgc3RhdGUuIEl0cyBpbml0aWFsIHN0YXRlIHdpbGwgaW5zdGVhZCBiZSB0aGUgc3RhdGUgb2YgdGhlIGZpcnN0XG4gKiB1cGRhdGUuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7W10gfCBbVF19IGluaXRpYWxTdGF0ZUFyciB0aGUgZmlyc3Qgc3RhdGUgdG8gYmUgcmV0dXJuZWQgKHR5cGVkIGFzIHJlc3QgYXJyYXkgdG8gcGVybWl0IGB1bmRlZmluZWRgKVxuICogQHJldHVybnMge05vdGlmaWVyUmVjb3JkPFQ+fSB0aGUgbm90aWZpZXIgYW5kIHVwZGF0ZXJcbiAqL1xuY29uc3QgICAgICAgIG1ha2VOb3RpZmllcktpdD0oLi4uaW5pdGlhbFN0YXRlQXJyKT0+e1xuLyoqIEB0eXBlIHtQdWJsaXNoS2l0PFQ+fSAqL1xuY29uc3R7cHVibGlzaGVyLHN1YnNjcmliZXJ9PW1ha2VQdWJsaXNoS2l0KCk7XG5cbmNvbnN0IG5vdGlmaWVyPW1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyKHN1YnNjcmliZXIpO1xuXG5jb25zdCB1cGRhdGVyPUZhcigndXBkYXRlcicse1xudXBkYXRlU3RhdGU6KHN0YXRlKT0+cHVibGlzaGVyLnB1Ymxpc2goc3RhdGUpLFxuZmluaXNoOihjb21wbGV0aW9uKT0+cHVibGlzaGVyLmZpbmlzaChjb21wbGV0aW9uKSxcbmZhaWw6KHJlYXNvbik9PnB1Ymxpc2hlci5mYWlsKHJlYXNvbil9KTtcblxuXG5hc3NlcnQoaW5pdGlhbFN0YXRlQXJyLmxlbmd0aDw9MSwndG9vIG1hbnkgYXJndW1lbnRzJyk7XG5pZihpbml0aWFsU3RhdGVBcnIubGVuZ3RoPT09MSl7XG51cGRhdGVyLnVwZGF0ZVN0YXRlKGluaXRpYWxTdGF0ZUFyclswXSk7XG4gfVxuXG4vKiBub3RpZmllciBmYWNldCBpcyBzZXBhcmF0ZSBzbyBpdCBjYW4gYmUgaGFuZGVkIG91dCB3aGlsZSB1cGRhdGVyKi9cbi8qIGlzIHRpZ2h0bHkgaGVsZCovXG5yZXR1cm4gaGFyZGVuKHtub3RpZmllcix1cGRhdGVyfSk7XG4gfTtcblxuLyoqXG4gKiBBZGFwdG9yIGZyb20gYXN5bmMgaXRlcmFibGUgdG8gbm90aWZpZXIuXG4gKlxuICogQGRlcHJlY2F0ZWQgVGhlIHJlc3VsdGluZyBub3RpZmllciBpcyBsb3NzbGVzcywgd2hpY2ggaXMgbm90IGRlc2lyYWJsZS5cbiAqIFByZWZlciBtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciwgYW5kIHJlZmVyIHRvXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzU0MTMgYW5kXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC81Njk1IGZvciBjb250ZXh0LlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QXN5bmNJdGVyYWJsZTxUPj59IGFzeW5jSXRlcmFibGVQXG4gKiBAcmV0dXJucyB7Tm90aWZpZXI8VD59XG4gKi8kaOKAjV9vbmNlLm1ha2VOb3RpZmllcktpdChtYWtlTm90aWZpZXJLaXQpO1xuY29uc3QgICAgICAgIG1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlPShhc3luY0l0ZXJhYmxlUCk9PntcbmNvbnN0IGl0ZXJhdG9yUD1FKGFzeW5jSXRlcmFibGVQKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcblxuLyoqIEB0eXBlIHtQcm9taXNlPFVwZGF0ZVJlY29yZDxUPj58dW5kZWZpbmVkfSAqL1xubGV0IG9wdE5leHRQcm9taXNlO1xubGV0IGN1cnJlbnRVcGRhdGVDb3VudD0wbjtcbi8qKiBAdHlwZSB7RVJlZjxVcGRhdGVSZWNvcmQ8VD4+fHVuZGVmaW5lZH0gKi9cbmxldCBjdXJyZW50UmVzcG9uc2U7XG5sZXQgZmluYWw9ZmFsc2U7XG5cbi8qKlxuICogQHR5cGUge0xhdGVzdFRvcGljPFQ+fVxuICovXG5jb25zdCBiYXNlTm90aWZpZXI9RmFyKCdiYXNlTm90aWZpZXInLHtcbmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50PS0xbil7XG5pZih1cGRhdGVDb3VudDxjdXJyZW50VXBkYXRlQ291bnQpe1xuaWYoY3VycmVudFJlc3BvbnNlKXtcbnJldHVybiBQcm9taXNlLnJlc29sdmUoY3VycmVudFJlc3BvbnNlKTtcbiB9XG4gfWVsc2UgaWYodXBkYXRlQ291bnQhPT1jdXJyZW50VXBkYXRlQ291bnQpe1xudGhyb3cgbmV3IEVycm9yKFxuJ2dldFVwZGF0ZVNpbmNlIGFyZ3VtZW50IG11c3QgYmUgYSBwcmV2aW91c2x5LWlzc3VlZCB1cGRhdGVDb3VudC4nKTtcblxuIH1cblxuLyogUmV0dXJuIGEgZmluYWwgcmVzcG9uc2UgaWYgd2UgaGF2ZSBvbmUsIG90aGVyd2lzZSBhIHByb21pc2UgZm9yIHRoZSBuZXh0IHN0YXRlLiovXG5pZihmaW5hbCl7XG5hc3NlcnQoY3VycmVudFJlc3BvbnNlIT09dW5kZWZpbmVkKTtcbnJldHVybiBQcm9taXNlLnJlc29sdmUoY3VycmVudFJlc3BvbnNlKTtcbiB9XG5pZighb3B0TmV4dFByb21pc2Upe1xuY29uc3QgbmV4dEl0ZXJSZXN1bHRQPUUoaXRlcmF0b3JQKS5uZXh0KCk7XG5vcHROZXh0UHJvbWlzZT1FLndoZW4oXG5uZXh0SXRlclJlc3VsdFAsXG4oe2RvbmUsdmFsdWV9KT0+e1xuYXNzZXJ0KCFmaW5hbCk7XG5pZihkb25lKXtcbmZpbmFsPXRydWU7XG4gfVxuY3VycmVudFVwZGF0ZUNvdW50Kz0xbjtcbmN1cnJlbnRSZXNwb25zZT1oYXJkZW4oe1xudmFsdWUsXG51cGRhdGVDb3VudDpkb25lP3VuZGVmaW5lZDpjdXJyZW50VXBkYXRlQ291bnR9KTtcblxub3B0TmV4dFByb21pc2U9dW5kZWZpbmVkO1xucmV0dXJuIGN1cnJlbnRSZXNwb25zZTtcbiB9LFxuKF9yZWFzb24pPT57XG5maW5hbD10cnVlO1xuY3VycmVudFJlc3BvbnNlPVxuLyoqIEB0eXBlIHtQcm9taXNlPFVwZGF0ZVJlY29yZDxUPj59ICovXG5uZXh0SXRlclJlc3VsdFA7XG5vcHROZXh0UHJvbWlzZT11bmRlZmluZWQ7XG5yZXR1cm4gY3VycmVudFJlc3BvbnNlO1xuIH0pO1xuXG4gfVxucmV0dXJuIG9wdE5leHRQcm9taXNlO1xuIH19KTtcblxuXG4vKiogQHR5cGUge05vdGlmaWVyPFQ+fSAqL1xuY29uc3Qgbm90aWZpZXI9RmFyKCdub3RpZmllcicse1xuLyogRG9uJ3QgbGVhayB0aGUgb3JpZ2luYWwgYXN5bmNJdGVyYWJsZVAgc2luY2UgaXQgbWF5IGJlIHJlbW90ZSBhbmQgd2UgYWxzbyovXG4vKiB3YW50IHRoZSBzYW1lIHNlbWFudGljcyBmb3IgdGhpcyBleHBvc2VkIGl0ZXJhYmxlIGFuZCB0aGUgYmFzZU5vdGlmaWVyLiovXG4uLi5tYWtlTm90aWZpZXIoYmFzZU5vdGlmaWVyKSxcbi4uLmJhc2VOb3RpZmllcn0pO1xuXG5yZXR1cm4gbm90aWZpZXI7XG4gfTskaOKAjV9vbmNlLm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlKG1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlKTtcbmhhcmRlbihtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU5vdGlmaWVyIjpbIm1ha2VOb3RpZmllciJdLCJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciI6WyJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciJdLCJtYWtlTm90aWZpZXJLaXQiOlsibWFrZU5vdGlmaWVyS2l0Il0sIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIjpbIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADLasXEHLwAABy8AACoAAABAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvcHVibGlzaC1raXQuanN7ImltcG9ydHMiOlsiLi90eXBlcy1hbWJpZW50LmpzIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiLCJAZW5kby9mYXIiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbIlB1Ymxpc2hlckkiLCJTdWJzY3JpYmVySSIsIlN1YnNjcmliZXJTaGFwZSIsIlVwZGF0ZUNvdW50U2hhcGUiLCJtYWtlUHVibGlzaEtpdCIsInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCIsInB1Ymxpc2hLaXRJS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG1ha2VQcm9taXNlS2l0LEUsRmFyLE0sY2FuQmVEdXJhYmxlLHByZXBhcmVFeG9DbGFzc0tpdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wibWFrZVByb21pc2VLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV0sW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJjYW5CZUR1cmFibGVcIiwgWyRo4oCNX2EgPT4gKGNhbkJlRHVyYWJsZSA9ICRo4oCNX2EpXV0sW1wicHJlcGFyZUV4b0NsYXNzS2l0XCIsIFskaOKAjV9hID0+IChwcmVwYXJlRXhvQ2xhc3NLaXQgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG5jb25zdCBzaW5rPSgpPT57IH07XG5jb25zdCBtYWtlUXVpZXRSZWplY3Rpb249KHJlYXNvbik9PntcbmNvbnN0IHJlamVjdGlvbj1oYXJkZW4oUHJvbWlzZS5yZWplY3QocmVhc29uKSk7XG52b2lkIEUud2hlbihyZWplY3Rpb24sc2luayxzaW5rKTtcbnJldHVybiByZWplY3Rpb247XG4gfTtcblxuY29uc3QgICAgICAgIFB1Ymxpc2hlckk9TS5pbnRlcmZhY2UoJ1B1Ymxpc2hlcicse1xucHVibGlzaDpNLmNhbGwoTS5hbnkoKSkucmV0dXJucygpLFxuZmluaXNoOk0uY2FsbChNLmFueSgpKS5yZXR1cm5zKCksXG5mYWlsOk0uY2FsbChNLmFueSgpKS5yZXR1cm5zKCl9KTtcblxuXG4vKiBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBOb3RpZmllciBgZ2V0VXBkYXRlU2luY2VgLiovJGjigI1fb25jZS5QdWJsaXNoZXJJKFB1Ymxpc2hlckkpO1xuY29uc3QgICAgICAgIFVwZGF0ZUNvdW50U2hhcGU9TS5vcihNLmJpZ2ludCgpLE0ubnVtYmVyKCkpOyRo4oCNX29uY2UuVXBkYXRlQ291bnRTaGFwZShVcGRhdGVDb3VudFNoYXBlKTtcbmNvbnN0ICAgICAgICBTdWJzY3JpYmVyST1NLmludGVyZmFjZSgnU3Vic2NyaWJlcicse1xuc3Vic2NyaWJlQWZ0ZXI6TS5jYWxsKCkub3B0aW9uYWwoTS5iaWdpbnQoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG5nZXRVcGRhdGVTaW5jZTpNLmNhbGwoKS5vcHRpb25hbChVcGRhdGVDb3VudFNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKX0pOyRo4oCNX29uY2UuU3Vic2NyaWJlckkoU3Vic2NyaWJlckkpO1xuXG5jb25zdCAgICAgICAgcHVibGlzaEtpdElLaXQ9aGFyZGVuKHtcbnB1Ymxpc2hlcjpQdWJsaXNoZXJJLFxuc3Vic2NyaWJlcjpTdWJzY3JpYmVySX0pO1xuXG5cbi8qKlxuICogQHRlbXBsYXRlIHtvYmplY3R9IEFyZ1xuICogQHRlbXBsYXRlIFJldFxuICogQHBhcmFtIHsoYXJnOiBBcmcpID0+IFJldH0gZm5cbiAqIEByZXR1cm5zIHsoYXJnOiBBcmcpID0+IFJldH1cbiAqLyRo4oCNX29uY2UucHVibGlzaEtpdElLaXQocHVibGlzaEtpdElLaXQpO1xuY29uc3Qgd2Vha01lbW9pemVVbmFyeT0oZm4pPT57XG5jb25zdCBjYWNoZT1uZXcgV2Vha01hcCgpO1xucmV0dXJuKGFyZyk9Pntcbi8qKiBAdHlwZSB7b2JqZWN0fSAqL1xuY29uc3Qgb2FyZz1hcmc7XG5pZihjYWNoZS5oYXMob2FyZykpe1xucmV0dXJuIGNhY2hlLmdldChvYXJnKTtcbiB9XG5jb25zdCByZXN1bHQ9Zm4oYXJnKTtcbmNhY2hlLnNldChvYXJnLHJlc3VsdCk7XG5yZXR1cm4gcmVzdWx0O1xuIH07XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtQdWJsaWNhdGlvblJlY29yZDxUPn0gcmVjb3JkXG4gKiBAcmV0dXJucyB7VXBkYXRlUmVjb3JkPFQ+fVxuICovXG5jb25zdCBtYWtlVXBkYXRlUmVjb3JkRnJvbVB1YmxpY2F0aW9uUmVjb3JkPShyZWNvcmQpPT57XG5jb25zdHtcbmhlYWQ6e3ZhbHVlLGRvbmV9LFxucHVibGlzaENvdW50fT1cbnJlY29yZDtcbmlmKGRvbmUpe1xuLyogRmluYWwgcmVzdWx0cyBoYXZlIHVuZGVmaW5lZCB1cGRhdGVDb3VudC4qL1xucmV0dXJuIGhhcmRlbih7dmFsdWUsdXBkYXRlQ291bnQ6dW5kZWZpbmVkfSk7XG4gfVxucmV0dXJuIGhhcmRlbih7dmFsdWUsdXBkYXRlQ291bnQ6cHVibGlzaENvdW50fSk7XG4gfTtcblxuLyoqXG4gKiBNYWtlcyBhIGB7IHB1Ymxpc2hlciwgc3Vic2NyaWJlciB9YCBwYWlyIGZvciBkb2luZyBlZmZpY2llbnRcbiAqIGRpc3RyaWJ1dGVkIHB1Yi9zdWIgc3VwcG9ydGluZyBib3RoIFwiZWFjaFwiIGFuZCBcImxhdGVzdFwiIGl0ZXJhdGlvblxuICogb2YgcHVibGlzaGVkIHZhbHVlcy5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHJldHVybnMge1B1Ymxpc2hLaXQ8VD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlUHVibGlzaEtpdD0oKT0+e1xuLyoqIEB0eXBlIHtQcm9taXNlPFB1YmxpY2F0aW9uUmVjb3JkPFQ+Pn0gKi9cbmxldCB0YWlsUDtcbi8qKiBAdHlwZSB7dW5kZWZpbmVkIHwgKCh2YWx1ZTogRVJlZjxQdWJsaWNhdGlvblJlY29yZDxUPj4pID0+IHZvaWQpfSAqL1xubGV0IHRhaWxSO1xuKHtwcm9taXNlOnRhaWxQLHJlc29sdmU6dGFpbFJ9PW1ha2VQcm9taXNlS2l0KCkpO1xuXG5sZXQgY3VycmVudFB1Ymxpc2hDb3VudD0wbjtcbmxldCBjdXJyZW50UD10YWlsUDtcbmNvbnN0IGFkdmFuY2VDdXJyZW50PShkb25lLHZhbHVlLHJlamVjdGlvbik9PntcbmlmKHRhaWxSPT09dW5kZWZpbmVkKXtcbnRocm93IG5ldyBFcnJvcignQ2Fubm90IHVwZGF0ZSBzdGF0ZSBhZnRlciB0ZXJtaW5hdGlvbi4nKTtcbiB9XG5cbmN1cnJlbnRQdWJsaXNoQ291bnQrPTFuO1xuY3VycmVudFA9dGFpbFA7XG5jb25zdCByZXNvbHZlQ3VycmVudD10YWlsUjtcblxuaWYoZG9uZSl7XG50YWlsUD1tYWtlUXVpZXRSZWplY3Rpb24oXG5uZXcgRXJyb3IoJ0Nhbm5vdCByZWFkIHBhc3QgZW5kIG9mIGl0ZXJhdGlvbi4nKSk7XG5cbnRhaWxSPXVuZGVmaW5lZDtcbiB9ZWxzZXtcbih7cHJvbWlzZTp0YWlsUCxyZXNvbHZlOnRhaWxSfT1tYWtlUHJvbWlzZUtpdCgpKTtcbiB9XG5cbmlmKHJlamVjdGlvbil7XG5yZXNvbHZlQ3VycmVudChyZWplY3Rpb24pO1xuIH1lbHNle1xucmVzb2x2ZUN1cnJlbnQoXG5oYXJkZW4oe1xuaGVhZDp7dmFsdWUsZG9uZX0sXG5wdWJsaXNoQ291bnQ6Y3VycmVudFB1Ymxpc2hDb3VudCxcbnRhaWw6dGFpbFB9KSk7XG5cblxuIH1cbiB9O1xuXG5jb25zdCBtYWtlTWVtb2l6ZWRVcGRhdGVSZWNvcmQ9d2Vha01lbW9pemVVbmFyeShcbm1ha2VVcGRhdGVSZWNvcmRGcm9tUHVibGljYXRpb25SZWNvcmQpO1xuXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlIHtTdWJzY3JpYmVyPFQ+fVxuICovXG5jb25zdCBzdWJzY3JpYmVyPUZhcignU3Vic2NyaWJlcicse1xuc3Vic2NyaWJlQWZ0ZXI6KHB1Ymxpc2hDb3VudD0tMW4pPT57XG5hc3NlcnQudHlwZW9mKHB1Ymxpc2hDb3VudCwnYmlnaW50Jyk7XG5pZihwdWJsaXNoQ291bnQ9PT1jdXJyZW50UHVibGlzaENvdW50KXtcbnJldHVybiB0YWlsUDtcbiB9ZWxzZSBpZihwdWJsaXNoQ291bnQ8Y3VycmVudFB1Ymxpc2hDb3VudCl7XG5yZXR1cm4gY3VycmVudFA7XG4gfWVsc2V7XG50aHJvdyBuZXcgRXJyb3IoXG4nc3Vic2NyaWJlQWZ0ZXIgYXJndW1lbnQgbXVzdCBiZSBhIHByZXZpb3VzbHktaXNzdWVkIHB1Ymxpc2hDb3VudC4nKTtcblxuIH1cbiB9LFxuZ2V0VXBkYXRlU2luY2U6KHVwZGF0ZUNvdW50KT0+e1xuaWYodXBkYXRlQ291bnQ9PT11bmRlZmluZWQpe1xucmV0dXJuIHN1YnNjcmliZXIuc3Vic2NyaWJlQWZ0ZXIoKS50aGVuKG1ha2VNZW1vaXplZFVwZGF0ZVJlY29yZCk7XG4gfVxudXBkYXRlQ291bnQ9QmlnSW50KHVwZGF0ZUNvdW50KTtcbnJldHVybihcbnN1YnNjcmliZXJcbi8qIGBzdWJzY3JpYmVBZnRlcmAgbWF5IHJlc29sdmUgd2l0aCB0aGUgdXBkYXRlIHJlY29yZCBudW1iZXJlZCovXG4vKiBgdXBkYXRlQ291bnQgKyAxYCwgZXZlbiBpZiBzZXZlcmFsIHVwZGF0ZXMgYXJlIHB1Ymxpc2hlZCBpbiB0aGUqL1xuLyogc2FtZSBjcmFuay4uLiovLlxuc3Vic2NyaWJlQWZ0ZXIodXBkYXRlQ291bnQpXG4vKiAuLi4gc28gd2UgcG9sbCB0aGUgbGF0ZXN0IHB1Ymxpc2hlZCB1cGRhdGUsIHdpdGhvdXQgd2FpdGluZyBmb3IgYW55Ki9cbi8qIGZ1cnRoZXIgb25lcy4qLy5cbnRoZW4oKCk9PnN1YnNjcmliZXIuZ2V0VXBkYXRlU2luY2UoKSkpO1xuXG4gfX0pO1xuXG5cbi8qKiBAdHlwZSB7UHVibGlzaGVyPFQ+fSAqL1xuY29uc3QgcHVibGlzaGVyPUZhcignUHVibGlzaGVyJyx7XG5wdWJsaXNoOih2YWx1ZSk9PntcbmFkdmFuY2VDdXJyZW50KGZhbHNlLHZhbHVlKTtcbiB9LFxuZmluaXNoOihmaW5hbFZhbHVlKT0+e1xuYWR2YW5jZUN1cnJlbnQodHJ1ZSxmaW5hbFZhbHVlKTtcbiB9LFxuZmFpbDoocmVhc29uKT0+e1xuYWR2YW5jZUN1cnJlbnQodHJ1ZSx1bmRlZmluZWQsbWFrZVF1aWV0UmVqZWN0aW9uKHJlYXNvbikpO1xuIH19KTtcblxucmV0dXJuIGhhcmRlbih7cHVibGlzaGVyLHN1YnNjcmliZXJ9KTtcbiB9OyRo4oCNX29uY2UubWFrZVB1Ymxpc2hLaXQobWFrZVB1Ymxpc2hLaXQpO1xuaGFyZGVuKG1ha2VQdWJsaXNoS2l0KTtcblxuLyogVE9ETzogTW92ZSBkdXJhYmxlIHB1Ymxpc2gga2l0IHRvIGEgbmV3IGZpbGU/Ki9cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge0R1cmFibGVQdWJsaXNoS2l0VmFsdWVEdXJhYmlsaXR5ICYgJ21hbmRhdG9yeSd9IFtvcHRpb25zLnZhbHVlRHVyYWJpbGl0eT0nbWFuZGF0b3J5J11cbiAqIEByZXR1cm5zIHtEdXJhYmxlUHVibGlzaEtpdFN0YXRlfVxuICovXG5jb25zdCBpbml0RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZT0ob3B0aW9ucz17fSk9PntcbmNvbnN0e3ZhbHVlRHVyYWJpbGl0eT0nbWFuZGF0b3J5J309b3B0aW9ucztcbmFzc2VydC5lcXVhbCh2YWx1ZUR1cmFiaWxpdHksJ21hbmRhdG9yeScpO1xucmV0dXJue1xuLyogY29uZmlndXJhdGlvbiovXG52YWx1ZUR1cmFiaWxpdHksXG5cbi8qIGxpZmVjeWNsZSBwcm9ncmVzcyovXG5wdWJsaXNoQ291bnQ6MG4sXG5zdGF0dXM6J2xpdmUnLC8qIHwgJ2ZpbmlzaGVkJyB8ICdmYWlsZWQnKi9cblxuLyogcGVyc2lzdGVkIHJlc3VsdCBkYXRhKi9cbi8qIE5vdGUgdGhhdCBpbiBhZGRpdGlvbiB0byBub24tdGVybWluYWwgdmFsdWVzIGZyb20gYHB1Ymxpc2hgLCovXG4vKiB2YWx1ZSBhbHNvIGhvbGRzIHRoZSB0ZXJtaW5hbCB2YWx1ZSBmcm9tIGBmaW5pc2hgIG9yIGBmYWlsYC4qL1xuaGFzVmFsdWU6ZmFsc2UsXG52YWx1ZTp1bmRlZmluZWR9O1xuXG4gfTtcblxuLyogV2UgbmVlZCB0aGUgV2Vha01hcCBrZXkgZm9yIGEga2l0IHRvIGJlIGEgdnJlZi1iZWFyaW5nIG9iamVjdCovXG4vKiBpbiBpdHMgY29ob3J0LCBhbmQgaGF2ZSBhcmJpdHJhcmlseSBjaG9zZW4gdGhlIHB1Ymxpc2hlciBmYWNldC4qL1xuLyoqIEB0eXBlZGVmIHtQdWJsaXNoZXI8Kj59IER1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsS2V5ICovXG4vKipcbiAqIEBwYXJhbSB7UHVibGlzaEtpdDwqPn0gZmFjZXRzXG4gKiBAcmV0dXJucyB7RHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxLZXl9XG4gKi9cbmNvbnN0IGdldEVwaGVtZXJhbEtleT0oZmFjZXRzKT0+ZmFjZXRzLnB1Ymxpc2hlcjtcblxuLyoqIEB0eXBlIHtXZWFrTWFwPER1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsS2V5LCB7Y3VycmVudFAsIHRhaWxQLCB0YWlsUn0+fSAqL1xuY29uc3QgZHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY3VycmVudC9uZXh0LXJlc3VsdCBwcm9taXNlcyBhbmQgbmV4dC1yZXN1bHQgcmVzb2x2ZXJcbiAqIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGR1cmFibGUgcHVibGlzaCBraXQuXG4gKiBUaGV5IGFyZSBsb3N0IG9uIHVwZ3JhZGUsIGJ1dCByZWNyZWF0ZWQgb24tZGVtYW5kLlxuICogU3VjaCByZWNyZWF0aW9uIHByZXNlcnZlcyB0aGUgdmFsdWUgaW4gKGJ1dCBub3QgdGhlIGlkZW50aXR5IG9mKSB0aGVcbiAqIGN1cnJlbnQgeyB2YWx1ZSwgZG9uZSB9IHJlc3VsdCB3aGVuIHBvc3NpYmxlLCB3aGljaCBpcyBhbHdheXMgdGhlXG4gKiBjYXNlIHdoZW4gdGhhdCB2YWx1ZSBpcyB0ZXJtaW5hbCAoaS5lLiwgZnJvbSBgZmluaXNoYCBvciBgZmFpbGApIG9yXG4gKiB3aGVuIHRoZSBkdXJhYmxlIHB1Ymxpc2gga2l0IGlzIGNvbmZpZ3VyZWQgd2l0aFxuICogYHZhbHVlRHVyYWJpbGl0eTogJ21hbmRhdG9yeSdgLlxuICpcbiAqIEBwYXJhbSB7RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZX0gc3RhdGVcbiAqIEBwYXJhbSB7UHVibGlzaEtpdDwqPn0gZmFjZXRzXG4gKi9cbmNvbnN0IHByb3ZpZGVEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGE9KHN0YXRlLGZhY2V0cyk9PntcbmNvbnN0IGVwaGVtZXJhbEtleT1nZXRFcGhlbWVyYWxLZXkoZmFjZXRzKTtcbmNvbnN0IGZvdW5kRGF0YT1kdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEuZ2V0KGVwaGVtZXJhbEtleSk7XG5pZihmb3VuZERhdGEpe1xucmV0dXJuIGZvdW5kRGF0YTtcbiB9XG5jb25zdHtzdGF0dXMscHVibGlzaENvdW50fT1zdGF0ZTtcbi8qKiBAdHlwZSB7b2JqZWN0fSAqL1xubGV0IG5ld0RhdGE7XG5pZihzdGF0dXM9PT0nZmFpbGVkJyl7XG5uZXdEYXRhPXtcbmN1cnJlbnRQOm1ha2VRdWlldFJlamVjdGlvbihzdGF0ZS52YWx1ZSksXG50YWlsUDptYWtlUXVpZXRSZWplY3Rpb24oXG5uZXcgRXJyb3IoJ0Nhbm5vdCByZWFkIHBhc3QgZW5kIG9mIGl0ZXJhdGlvbi4nKSksXG5cbnRhaWxSOnVuZGVmaW5lZH07XG5cbiB9ZWxzZSBpZihzdGF0dXM9PT0nZmluaXNoZWQnKXtcbmNvbnN0IHRhaWxQPW1ha2VRdWlldFJlamVjdGlvbihcbm5ldyBFcnJvcignQ2Fubm90IHJlYWQgcGFzdCBlbmQgb2YgaXRlcmF0aW9uLicpKTtcblxubmV3RGF0YT17XG5jdXJyZW50UDpFLnJlc29sdmUoXG5oYXJkZW4oe1xuaGVhZDp7dmFsdWU6c3RhdGUudmFsdWUsZG9uZTp0cnVlfSxcbnB1Ymxpc2hDb3VudCxcbnRhaWw6dGFpbFB9KSksXG5cblxudGFpbFAsXG50YWlsUjp1bmRlZmluZWR9O1xuXG4gfWVsc2UgaWYoc3RhdHVzPT09J2xpdmUnKXtcbmNvbnN0e3Byb21pc2U6dGFpbFAscmVzb2x2ZTp0YWlsUn09bWFrZVByb21pc2VLaXQoKTtcbnZvaWQgRS53aGVuKHRhaWxQLHNpbmssc2luayk7XG5uZXdEYXRhPXtcbmN1cnJlbnRQOnN0YXRlLmhhc1ZhbHVlP1xuRS5yZXNvbHZlKFxuaGFyZGVuKHtcbmhlYWQ6e3ZhbHVlOnN0YXRlLnZhbHVlLGRvbmU6ZmFsc2V9LFxucHVibGlzaENvdW50LFxudGFpbDp0YWlsUH0pKTpcblxuXG50YWlsUCxcbnRhaWxQLFxudGFpbFJ9O1xuXG4gfWVsc2V7XG5GYWlsIGBJbnZhbGlkIGR1cmFibGUgcHJvbWlzZSBraXQgc3RhdHVzOiAke3Eoc3RhdHVzKX1gO1xuIH1cbmR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YS5zZXQoZXBoZW1lcmFsS2V5LGhhcmRlbihuZXdEYXRhKSk7XG5yZXR1cm4gbmV3RGF0YTtcbiB9O1xuXG4vKipcbiAqIEV4dGVuZHMgdGhlIHNlcXVlbmNlIG9mIHJlc3VsdHMuXG4gKlxuICogQHBhcmFtIHt7c3RhdGU6IER1cmFibGVQdWJsaXNoS2l0U3RhdGUsIGZhY2V0czogUHVibGlzaEtpdDwqPn19IGNvbnRleHRcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICogQHBhcmFtIHtEdXJhYmxlUHVibGlzaEtpdFN0YXRlWydzdGF0dXMnXX0gW3RhcmdldFN0YXR1c11cbiAqL1xuY29uc3QgYWR2YW5jZUR1cmFibGVQdWJsaXNoS2l0PShjb250ZXh0LHZhbHVlLHRhcmdldFN0YXR1cz0nbGl2ZScpPT57XG5jb25zdHtzdGF0ZSxmYWNldHN9PWNvbnRleHQ7XG5jb25zdHt2YWx1ZUR1cmFiaWxpdHksc3RhdHVzfT1zdGF0ZTtcbmlmKHN0YXR1cyE9PSdsaXZlJyl7XG50aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCB1cGRhdGUgc3RhdGUgYWZ0ZXIgdGVybWluYXRpb24uJyk7XG4gfVxuY29uc3QgZG9uZT10YXJnZXRTdGF0dXMhPT0nbGl2ZSc7XG5pZihkb25lfHx2YWx1ZUR1cmFiaWxpdHk9PT0nbWFuZGF0b3J5Jyl7XG5jYW5CZUR1cmFibGUodmFsdWUpfHxGYWlsIGBDYW5ub3QgYWNjZXB0IG5vbi1kdXJhYmxlIHZhbHVlOiAke3ZhbHVlfWA7XG4gfVxuY29uc3R7dGFpbFA6Y3VycmVudFAsdGFpbFI6cmVzb2x2ZUN1cnJlbnR9PVxucHJvdmlkZUR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YShzdGF0ZSxmYWNldHMpO1xuXG5jb25zdCBwdWJsaXNoQ291bnQ9c3RhdGUucHVibGlzaENvdW50KzFuO1xuc3RhdGUucHVibGlzaENvdW50PXB1Ymxpc2hDb3VudDtcbmxldCB0YWlsUDtcbmxldCB0YWlsUjtcblxuaWYoZG9uZSl7XG5zdGF0ZS5zdGF0dXM9dGFyZ2V0U3RhdHVzO1xudGFpbFA9bWFrZVF1aWV0UmVqZWN0aW9uKG5ldyBFcnJvcignQ2Fubm90IHJlYWQgcGFzdCBlbmQgb2YgaXRlcmF0aW9uLicpKTtcbnRhaWxSPXVuZGVmaW5lZDtcbiB9ZWxzZXtcbih7cHJvbWlzZTp0YWlsUCxyZXNvbHZlOnRhaWxSfT1tYWtlUHJvbWlzZUtpdCgpKTtcbnZvaWQgRS53aGVuKHRhaWxQLHNpbmssc2luayk7XG4gfVxuZHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhLnNldChcbmdldEVwaGVtZXJhbEtleShmYWNldHMpLFxuaGFyZGVuKHtjdXJyZW50UCx0YWlsUCx0YWlsUn0pKTtcblxuXG5pZih0YXJnZXRTdGF0dXM9PT0nZmFpbGVkJyl7XG5zdGF0ZS5oYXNWYWx1ZT10cnVlO1xuc3RhdGUudmFsdWU9dmFsdWU7XG5jb25zdCByZWplY3Rpb249bWFrZVF1aWV0UmVqZWN0aW9uKHZhbHVlKTtcbnJlc29sdmVDdXJyZW50KHJlamVjdGlvbik7XG4gfWVsc2V7XG4vKiBQZXJzaXN0IGEgdGVybWluYWwgdmFsdWUsIG9yIGEgbm9uLXRlcm1pbmFsIHZhbHVlKi9cbi8qIGlmIGNvbmZpZ3VyZWQgYXMgJ21hbmRhdG9yeScgb3IgJ29wcG9ydHVuaXN0aWMnLiovXG5pZihkb25lfHx2YWx1ZUR1cmFiaWxpdHkhPT0naWdub3JlZCcmJmNhbkJlRHVyYWJsZSh2YWx1ZSkpe1xuc3RhdGUuaGFzVmFsdWU9dHJ1ZTtcbnN0YXRlLnZhbHVlPXZhbHVlO1xuIH1lbHNle1xuc3RhdGUuaGFzVmFsdWU9ZmFsc2U7XG5zdGF0ZS52YWx1ZT11bmRlZmluZWQ7XG4gfVxuXG5yZXNvbHZlQ3VycmVudChcbmhhcmRlbih7XG5oZWFkOnt2YWx1ZSxkb25lfSxcbnB1Ymxpc2hDb3VudCxcbnRhaWw6dGFpbFB9KSk7XG5cblxuIH1cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi4vLi4vdmF0LWRhdGEvc3JjL3R5cGVzLmpzJykuQmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IGtpbmROYW1lXG4gKi9cbmNvbnN0ICAgICAgICBwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQ9KGJhZ2dhZ2Usa2luZE5hbWUpPT57XG4vKiBUT0RPOiBPbmNlIHdlIHVuaWZ5IHdpdGggbWFrZVB1Ymxpc2hLaXQsIHdlIHdpbGwgdXNlIGEgWm9uZS1jb21wYXRpYmxlIHdlYWsqL1xuLyogbWFwIGZvciBtZW1vaXphdGlvbi4qL1xuY29uc3QgbWFrZU1lbW9pemVkVXBkYXRlUmVjb3JkPW1ha2VVcGRhdGVSZWNvcmRGcm9tUHVibGljYXRpb25SZWNvcmQ7XG5cbi8qKlxuICogQHJldHVybnMgeygpID0+IFB1Ymxpc2hLaXQ8Kj59XG4gKi9cbnJldHVybiBwcmVwYXJlRXhvQ2xhc3NLaXQoXG5iYWdnYWdlLFxua2luZE5hbWUsXG5wdWJsaXNoS2l0SUtpdCxcbmluaXREdXJhYmxlUHVibGlzaEtpdFN0YXRlLFxue1xuLyogVGhlIHB1Ymxpc2hlciBmYWNldCBvZiBhIGR1cmFibGUgcHVibGlzaCBraXQqL1xuLyogYWNjZXB0cyBuZXcgdmFsdWVzLiovXG5wdWJsaXNoZXI6e1xucHVibGlzaCh2YWx1ZSl7XG5hZHZhbmNlRHVyYWJsZVB1Ymxpc2hLaXQodGhpcyx2YWx1ZSk7XG4gfSxcbmZpbmlzaChmaW5hbFZhbHVlKXtcbmFkdmFuY2VEdXJhYmxlUHVibGlzaEtpdCh0aGlzLGZpbmFsVmFsdWUsJ2ZpbmlzaGVkJyk7XG4gfSxcbmZhaWwocmVhc29uKXtcbmFkdmFuY2VEdXJhYmxlUHVibGlzaEtpdCh0aGlzLHJlYXNvbiwnZmFpbGVkJyk7XG4gfX0sXG5cblxuLyogVGhlIHN1YnNjcmliZXIgZmFjZXQgb2YgYSBkdXJhYmxlIHB1Ymxpc2gga2l0Ki9cbi8qIHByb3BhZ2F0ZXMgdmFsdWVzLiovXG5zdWJzY3JpYmVyOntcbnN1YnNjcmliZUFmdGVyKHB1Ymxpc2hDb3VudD0tMW4pe1xuY29uc3R7c3RhdGUsZmFjZXRzfT10aGlzO1xuY29uc3R7cHVibGlzaENvdW50OmN1cnJlbnRQdWJsaXNoQ291bnR9PXN0YXRlO1xuY29uc3R7Y3VycmVudFAsdGFpbFB9PXByb3ZpZGVEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEoXG5zdGF0ZSxcbmZhY2V0cyk7XG5cbmlmKHB1Ymxpc2hDb3VudD09PWN1cnJlbnRQdWJsaXNoQ291bnQpe1xucmV0dXJuIHRhaWxQO1xuIH1lbHNlIGlmKHB1Ymxpc2hDb3VudDxjdXJyZW50UHVibGlzaENvdW50KXtcbnJldHVybiBjdXJyZW50UDtcbiB9ZWxzZXtcbnRocm93IG5ldyBFcnJvcihcbidzdWJzY3JpYmVBZnRlciBhcmd1bWVudCBtdXN0IGJlIGEgcHJldmlvdXNseS1pc3N1ZWQgcHVibGlzaENvdW50LicpO1xuXG4gfVxuIH0sXG5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCl7XG5jb25zdHtcbmZhY2V0czp7c3Vic2NyaWJlcn19PVxudGhpcztcbmlmKHVwZGF0ZUNvdW50PT09dW5kZWZpbmVkKXtcbnJldHVybiBzdWJzY3JpYmVyLnN1YnNjcmliZUFmdGVyKCkudGhlbihtYWtlTWVtb2l6ZWRVcGRhdGVSZWNvcmQpO1xuIH1cbnVwZGF0ZUNvdW50PUJpZ0ludCh1cGRhdGVDb3VudCk7XG5yZXR1cm4oXG5zdWJzY3JpYmVyXG4vKiBgc3Vic2NyaWJlQWZ0ZXJgIG1heSByZXNvbHZlIHdpdGggdGhlIHVwZGF0ZSByZWNvcmQgbnVtYmVyZWQqL1xuLyogYHVwZGF0ZUNvdW50ICsgMWAsIGV2ZW4gaWYgc2V2ZXJhbCB1cGRhdGVzIGFyZSBwdWJsaXNoZWQgaW4gdGhlKi9cbi8qIHNhbWUgY3JhbmsuLi4qLy5cbnN1YnNjcmliZUFmdGVyKHVwZGF0ZUNvdW50KVxuLyogLi4uIHNvIHdlIHBvbGwgdGhlIGxhdGVzdCBwdWJsaXNoZWQgdXBkYXRlLCB3aXRob3V0IHdhaXRpbmcgZm9yIGFueSovXG4vKiBmdXJ0aGVyIG9uZXMuKi8uXG50aGVuKCgpPT5zdWJzY3JpYmVyLmdldFVwZGF0ZVNpbmNlKCkpKTtcblxuIH19fSk7XG5cblxuXG4gfTskaOKAjV9vbmNlLnByZXBhcmVEdXJhYmxlUHVibGlzaEtpdChwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQpO1xuaGFyZGVuKHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCk7XG5cbmNvbnN0ICAgICAgICBTdWJzY3JpYmVyU2hhcGU9TS5yZW1vdGFibGUoJ1N1YnNjcmliZXInKTskaOKAjV9vbmNlLlN1YnNjcmliZXJTaGFwZShTdWJzY3JpYmVyU2hhcGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlB1Ymxpc2hlckkiOlsiUHVibGlzaGVySSJdLCJVcGRhdGVDb3VudFNoYXBlIjpbIlVwZGF0ZUNvdW50U2hhcGUiXSwiU3Vic2NyaWJlckkiOlsiU3Vic2NyaWJlckkiXSwicHVibGlzaEtpdElLaXQiOlsicHVibGlzaEtpdElLaXQiXSwibWFrZVB1Ymxpc2hLaXQiOlsibWFrZVB1Ymxpc2hLaXQiXSwicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0IjpbInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCJdLCJTdWJzY3JpYmVyU2hhcGUiOlsiU3Vic2NyaWJlclNoYXBlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMejxSPjCQAA4wkAAC4AAABAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvc3RvcmVkLW5vdGlmaWVyLmpzeyJpbXBvcnRzIjpbIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiLCJAYWdvcmljL2ludGVybmFsIiwiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyIsIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbIm1ha2VTdG9yZWROb3RpZmllciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRBbGxEZWZpbmVkLG1ha2VTZXJpYWxpemVUb1N0b3JhZ2UsRSxGYXIsb2JzZXJ2ZU5vdGlmaWVyOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcImFzc2VydEFsbERlZmluZWRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydEFsbERlZmluZWQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qc1wiLCBbW1wibWFrZVNlcmlhbGl6ZVRvU3RvcmFnZVwiLCBbJGjigI1fYSA9PiAobWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dLFtcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanNcIiwgW1tcIm9ic2VydmVOb3RpZmllclwiLCBbJGjigI1fYSA9PiAob2JzZXJ2ZU5vdGlmaWVyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtCYXNlTm90aWZpZXI8VD4gJiBPbWl0PFN0b3JlZEZhY2V0LCAnZ2V0U3RvcmVLZXknPn0gU3RvcmVkTm90aWZpZXJcbiAqL1xuXG4vKipcbiAqIEJlZ2luIGl0ZXJhdGluZyB0aGUgc291cmNlLCBzdG9yaW5nIHNlcmlhbGl6ZWQgaXRlcmF0aW9uIHZhbHVlcy4gIElmIHRoZVxuICogc3RvcmFnZU5vZGUncyBgc2V0VmFsdWVgIG9wZXJhdGlvbiByZWplY3RzLCBubyBmdXJ0aGVyIHdyaXRlcyB0byBpdCB3aWxsXG4gKiBiZSBhdHRlbXB0ZWQgKGJ1dCByZXN1bHRzIHdpbGwgcmVtYWluIGF2YWlsYWJsZSBmcm9tIHRoZSBzdWJzY3JpYmVyKS5cbiAqXG4gKiBSZXR1cm5zIGEgU3RvcmVkTm90aWZpZXIgdGhhdCBjYW4gYmUgdXNlZCBieSBhIGNsaWVudCB0byBkaXJlY3RseSBmb2xsb3dcbiAqIHRoZSBpdGVyYXRpb24gdGhlbXNlbHZlcywgb3Igb2J0YWluIGluZm9ybWF0aW9uIHRvIHN1YnNjcmliZSB0byB0aGUgc3RvcmVkXG4gKiBkYXRhIG91dC1vZi1iYW5kLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8Tm90aWZpZXI8VD4+fSBub3RpZmllclxuICogQHBhcmFtIHtFUmVmPFN0b3JhZ2VOb2RlPn0gc3RvcmFnZU5vZGVcbiAqIEBwYXJhbSB7RVJlZjxNYXJzaGFsbGVyPn0gbWFyc2hhbGxlclxuICogQHJldHVybnMge1N0b3JlZE5vdGlmaWVyPFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVN0b3JlZE5vdGlmaWVyPShub3RpZmllcixzdG9yYWdlTm9kZSxtYXJzaGFsbGVyKT0+e1xuYXNzZXJ0QWxsRGVmaW5lZCh7bm90aWZpZXIsc3RvcmFnZU5vZGUsbWFyc2hhbGxlcn0pO1xuXG5jb25zdCBtYXJzaGFsbFRvU3RvcmFnZT1tYWtlU2VyaWFsaXplVG9TdG9yYWdlKHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIpO1xuXG5vYnNlcnZlTm90aWZpZXIobm90aWZpZXIse1xudXBkYXRlU3RhdGUodmFsdWUpe1xubWFyc2hhbGxUb1N0b3JhZ2UodmFsdWUpLmNhdGNoKChyZWFzb24pPT5cbmNvbnNvbGUuZXJyb3IoJ1N0b3JlZE5vdGlmaWVyIGZhaWxlZCB0byB1cGRhdGVTdGF0ZScscmVhc29uKSk7XG5cbiB9LFxuZmFpbChyZWFzb24pe1xuY29uc29sZS5lcnJvcignU3RvcmVkTm90aWZpZXIgZmFpbGVkIHRvIGl0ZXJhdGUnLHJlYXNvbik7XG4gfX0pO1xuXG5cbi8qKiBAdHlwZSB7VW5zZXJpYWxpemVyfSAqL1xuY29uc3QgdW5zZXJpYWxpemVyPUZhcigndW5zZXJpYWxpemVyJyx7XG51bnNlcmlhbGl6ZTooZGF0YSk9PkUobWFyc2hhbGxlcikudW5zZXJpYWxpemUoZGF0YSl9KTtcblxuXG4vKiogQHR5cGUge1N0b3JlZE5vdGlmaWVyPFQ+fSAqL1xuY29uc3Qgc3RvcmVkTm90aWZpZXI9RmFyKCdTdG9yZWROb3RpZmllcicse1xuZ2V0VXBkYXRlU2luY2U6KHVwZGF0ZUNvdW50KT0+RShub3RpZmllcikuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpLFxuZ2V0UGF0aDooKT0+RShzdG9yYWdlTm9kZSkuZ2V0UGF0aCgpLFxuZ2V0VW5zZXJpYWxpemVyOigpPT51bnNlcmlhbGl6ZXJ9KTtcblxucmV0dXJuIHN0b3JlZE5vdGlmaWVyO1xuIH07JGjigI1fb25jZS5tYWtlU3RvcmVkTm90aWZpZXIobWFrZVN0b3JlZE5vdGlmaWVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlU3RvcmVkTm90aWZpZXIiOlsibWFrZVN0b3JlZE5vdGlmaWVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPTDcWR4DAAAeAwAACsAAABAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvc3RvcmVkLXRvcGljLmpzeyJpbXBvcnRzIjpbIi4vcHVibGlzaC1raXQuanMiLCIuL3N0b3Jlc3ViLmpzIiwiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiLCJAYWdvcmljL3N0b3JlIiwiQGVuZG8vZmFyIl0sImV4cG9ydHMiOlsiUHVibGljVG9waWNTaGFwZSIsIlRvcGljc1JlY29yZFNoYXBlIiwibWFrZVB1YmxpY1RvcGljIiwicGlwZVRvcGljVG9TdG9yYWdlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydEFsbERlZmluZWQsbWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSxNLEUsU3Vic2NyaWJlclNoYXBlLGZvckVhY2hQdWJsaWNhdGlvblJlY29yZDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJhc3NlcnRBbGxEZWZpbmVkXCIsIFskaOKAjV9hID0+IChhc3NlcnRBbGxEZWZpbmVkID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanNcIiwgW1tcIm1ha2VTZXJpYWxpemVUb1N0b3JhZ2VcIiwgWyRo4oCNX2EgPT4gKG1ha2VTZXJpYWxpemVUb1N0b3JhZ2UgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiLi9wdWJsaXNoLWtpdC5qc1wiLCBbW1wiU3Vic2NyaWJlclNoYXBlXCIsIFskaOKAjV9hID0+IChTdWJzY3JpYmVyU2hhcGUgPSAkaOKAjV9hKV1dXV0sW1wiLi9zdG9yZXN1Yi5qc1wiLCBbW1wiZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkXCIsIFskaOKAjV9hID0+IChmb3JFYWNoUHVibGljYXRpb25SZWNvcmQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cbmNvbnN0ICAgICAgICBQdWJsaWNUb3BpY1NoYXBlPU0uc3BsaXRSZWNvcmQoXG57XG5zdWJzY3JpYmVyOlN1YnNjcmliZXJTaGFwZSxcbnN0b3JhZ2VQYXRoOk0ucHJvbWlzZSgpfSxcblxue2Rlc2NyaXB0aW9uOk0uc3RyaW5nKCl9KTtcblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7b2JqZWN0fSBUIHRvcGljIHZhbHVlXG4gKiBAdHlwZWRlZiB7e1xuICogICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAqICAgc3Vic2NyaWJlcjogU3Vic2NyaWJlcjxUPixcbiAqICAgc3RvcmFnZVBhdGg6IEVSZWY8c3RyaW5nPixcbiAqIH19IFB1YmxpY1RvcGljXG4gKi8kaOKAjV9vbmNlLlB1YmxpY1RvcGljU2hhcGUoUHVibGljVG9waWNTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBUb3BpY3NSZWNvcmRTaGFwZT1NLnJlY29yZE9mKE0uc3RyaW5nKCksUHVibGljVG9waWNTaGFwZSk7XG5cbi8qKlxuICogQHR5cGVkZWYge3tcbiAqICAgW3RvcGljTmFtZTogc3RyaW5nXTogUHVibGljVG9waWM8dW5rbm93bj4sXG4gKiB9fSBUb3BpY3NSZWNvcmRcbiAqL1xuLyoqXG4gKiBOQjogY2FsbGVyIG11c3QgZW5zdXJlIHRoYXQgYHB1Ymxpc2hlci5maW5pc2goKWAgb3IgYHB1Ymxpc2hlci5mYWlsKClgIGlzXG4gKiBjYWxsZWQgd2hlbiB0aGUgcHVibGlzaGVyIHN0b3JlcyBpdHMgZmluYWwgdmFsdWUuXG4gKiBPdGhlcndpc2UgdGhpcyB3YXRjaCBpcyByZXRhaW5lZCBhbmQgY2FuJ3QgYmUgR0NlZC5cbiAqXG4gKiBAcGFyYW0ge1N1YnNjcmliZXI8YW55Pn0gdG9waWNcbiAqIEBwYXJhbSB7RVJlZjxTdG9yYWdlTm9kZT59IHN0b3JhZ2VOb2RlXG4gKiBAcGFyYW0ge0VSZWY8UmV0dXJuVHlwZTxYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykubWFrZU1hcnNoYWw+Pn0gbWFyc2hhbGxlclxuICogQHJldHVybnMge3ZvaWR9XG4gKi8kaOKAjV9vbmNlLlRvcGljc1JlY29yZFNoYXBlKFRvcGljc1JlY29yZFNoYXBlKTtcbmNvbnN0ICAgICAgICBwaXBlVG9waWNUb1N0b3JhZ2U9KHRvcGljLHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIpPT57XG5hc3NlcnRBbGxEZWZpbmVkKHt0b3BpYyxzdG9yYWdlTm9kZSxtYXJzaGFsbGVyfSk7XG5cbmNvbnN0IG1hcnNoYWxsVG9TdG9yYWdlPW1ha2VTZXJpYWxpemVUb1N0b3JhZ2Uoc3RvcmFnZU5vZGUsbWFyc2hhbGxlcik7XG5cbi8qIFN0YXJ0IHB1Ymxpc2hpbmcgdGhlIHNvdXJjZS4qL1xuZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkKHRvcGljLG1hcnNoYWxsVG9TdG9yYWdlKS5jYXRjaCgoZXJyKT0+e1xuLyogVE9ETzogSG93IHNob3VsZCB3ZSBoYW5kbGUgYW5kL29yIHN1cmZhY2UgdGhpcyBmYWlsdXJlPyovXG4vKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC81NzY2I2Rpc2N1c3Npb25fcjkyMjQ5ODA4OCovXG5jb25zb2xlLmVycm9yKCdmb2xsb3dBbmRTdG9yZVRvcGljIGZhaWxlZCB0byBpdGVyYXRlJyxlcnIpO1xuIH0pO1xuIH07JGjigI1fb25jZS5waXBlVG9waWNUb1N0b3JhZ2UocGlwZVRvcGljVG9TdG9yYWdlKTtcbmhhcmRlbihwaXBlVG9waWNUb1N0b3JhZ2UpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzY3JpcHRpb25cbiAqIEBwYXJhbSB7U3Vic2NyaWJlcjxUPn0gc3Vic2NyaWJlclxuICogQHBhcmFtIHtFUmVmPFN0b3JhZ2VOb2RlPn0gc3RvcmFnZU5vZGVcbiAqIEByZXR1cm5zIHtQdWJsaWNUb3BpYzxUPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VQdWJsaWNUb3BpYz0oZGVzY3JpcHRpb24sc3Vic2NyaWJlcixzdG9yYWdlTm9kZSk9PntcbnJldHVybntcbmRlc2NyaXB0aW9uLFxuc3Vic2NyaWJlcixcbnN0b3JhZ2VQYXRoOkUoc3RvcmFnZU5vZGUpLmdldFBhdGgoKX07XG5cbiB9OyRo4oCNX29uY2UubWFrZVB1YmxpY1RvcGljKG1ha2VQdWJsaWNUb3BpYyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUHVibGljVG9waWNTaGFwZSI6WyJQdWJsaWNUb3BpY1NoYXBlIl0sIlRvcGljc1JlY29yZFNoYXBlIjpbIlRvcGljc1JlY29yZFNoYXBlIl0sInBpcGVUb3BpY1RvU3RvcmFnZSI6WyJwaXBlVG9waWNUb1N0b3JhZ2UiXSwibWFrZVB1YmxpY1RvcGljIjpbIm1ha2VQdWJsaWNUb3BpYyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAfBQdrJSIAACUiAAAnAAAAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL3N0b3Jlc3ViLmpzeyJpbXBvcnRzIjpbIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiLCIuL3B1Ymxpc2gta2l0LmpzIiwiLi9zdWJzY3JpYmUuanMiLCIuL3N1YnNjcmliZXIuanMiLCJAYWdvcmljL2ludGVybmFsIiwiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyIsIkBlbmRvL2ZhciIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJmb3JFYWNoUHVibGljYXRpb25SZWNvcmQiLCJtYWtlU3RvcmVkUHVibGlzaEtpdCIsIm1ha2VTdG9yZWRQdWJsaXNoZXJLaXQiLCJtYWtlU3RvcmVkU3Vic2NyaWJlciIsIm1ha2VTdG9yZWRTdWJzY3JpcHRpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxGYXIsbWFrZU1hcnNoYWwsYXNzZXJ0QWxsRGVmaW5lZCxtYWtlU2VyaWFsaXplVG9TdG9yYWdlLG9ic2VydmVJdGVyYXRpb24sbWFrZVB1Ymxpc2hLaXQsbWFrZVN1YnNjcmlwdGlvbktpdCxzdWJzY3JpYmVFYWNoOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV0sW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wibWFrZU1hcnNoYWxcIiwgWyRo4oCNX2EgPT4gKG1ha2VNYXJzaGFsID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcImFzc2VydEFsbERlZmluZWRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydEFsbERlZmluZWQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qc1wiLCBbW1wibWFrZVNlcmlhbGl6ZVRvU3RvcmFnZVwiLCBbJGjigI1fYSA9PiAobWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzXCIsIFtbXCJvYnNlcnZlSXRlcmF0aW9uXCIsIFskaOKAjV9hID0+IChvYnNlcnZlSXRlcmF0aW9uID0gJGjigI1fYSldXV1dLFtcIi4vcHVibGlzaC1raXQuanNcIiwgW1tcIm1ha2VQdWJsaXNoS2l0XCIsIFskaOKAjV9hID0+IChtYWtlUHVibGlzaEtpdCA9ICRo4oCNX2EpXV1dXSxbXCIuL3N1YnNjcmliZXIuanNcIiwgW1tcIm1ha2VTdWJzY3JpcHRpb25LaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VTdWJzY3JpcHRpb25LaXQgPSAkaOKAjV9hKV1dXV0sW1wiLi9zdWJzY3JpYmUuanNcIiwgW1tcInN1YnNjcmliZUVhY2hcIiwgWyRo4oCNX2EgPT4gKHN1YnNjcmliZUVhY2ggPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG4vKipcbiAqIE5COiBkb2VzIG5vdCB5ZXQgc3Vydml2ZSB1cGdyYWRlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNjg5M1xuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1N1YnNjcmliZXI8VD59IHN1YnNjcmliZXJcbiAqIEBwYXJhbSB7KHY6IFQpID0+IHZvaWR9IGNvbnN1bWVWYWx1ZVxuICovXG5jb25zdCAgICAgICAgZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkPWFzeW5jKHN1YnNjcmliZXIsY29uc3VtZVZhbHVlKT0+e1xuLyogV2Ugb3Blbi1jb2RlIHRoZSBmb3ItYXdhaXQtb2YgaW1wbGVtZW50YXRpb24gcmF0aGVyIHRoYW4gdXNpbmcgdGhhdCBzeW50YXgqL1xuLyogZGlyZWN0bHkgYmVjYXVzZSB3ZSB3YW50IHRvIHJ1biB0aGUgY29uc3VtZXIgb24gdGhlIGRvbmUgdmFsdWUgYXMgd2VsbC4qL1xuY29uc3QgaXRlcmF0b3I9c3Vic2NyaWJlRWFjaChzdWJzY3JpYmVyKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcblxubGV0IGZpbmlzaGVkPWZhbHNlO1xud2hpbGUoIWZpbmlzaGVkKXtcbi8qIEFsbG93IG5lc3RlZCBhd2FpdHMgKGluIGxvb3ApIGJlY2F1c2UgaXQncyBzYWZlIGZvciBlYWNoIHRvIHJ1biBpbiBhIHR1cm4qL1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3AsIEBqZXNzaWUuanMvbm8tbmVzdGVkLWF3YWl0Ki9cbmNvbnN0e3ZhbHVlLGRvbmV9PWF3YWl0IGl0ZXJhdG9yLm5leHQoKTtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wLCBAamVzc2llLmpzL25vLW5lc3RlZC1hd2FpdCovXG5hd2FpdCBjb25zdW1lVmFsdWUodmFsdWUpO1xuZmluaXNoZWQ9ISFkb25lO1xuIH1cbiB9O1xuXG4vKipcbiAqIEJlZ2luIGl0ZXJhdGluZyB0aGUgc291cmNlLCBzdG9yaW5nIHNlcmlhbGl6ZWQgaXRlcmF0aW9uIHZhbHVlcy4gIElmIHRoZVxuICogc3RvcmFnZU5vZGUncyBgc2V0VmFsdWVgIG9wZXJhdGlvbiByZWplY3RzLCBubyBmdXJ0aGVyIHdyaXRlcyB0byBpdCB3aWxsXG4gKiBiZSBhdHRlbXB0ZWQgKGJ1dCByZXN1bHRzIHdpbGwgcmVtYWluIGF2YWlsYWJsZSBmcm9tIHRoZSBzdWJzY3JpYmVyKS5cbiAqXG4gKiBSZXR1cm5zIGEgU3RvcmVkU3Vic2NyaWJlciB0aGF0IGNhbiBiZSB1c2VkIGJ5IGEgY2xpZW50IHRvIGRpcmVjdGx5IGZvbGxvd1xuICogdGhlIGl0ZXJhdGlvbiB0aGVtc2VsdmVzLCBvciBvYnRhaW4gaW5mb3JtYXRpb24gdG8gc3Vic2NyaWJlIHRvIHRoZSBzdG9yZWRcbiAqIGRhdGEgb3V0LW9mLWJhbmQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7U3Vic2NyaWJlcjxUPn0gc3Vic2NyaWJlclxuICogQHBhcmFtIHtFUmVmPFN0b3JhZ2VOb2RlPn0gc3RvcmFnZU5vZGVcbiAqIEBwYXJhbSB7RVJlZjxSZXR1cm5UeXBlPHR5cGVvZiBtYWtlTWFyc2hhbD4+fSBtYXJzaGFsbGVyXG4gKiBAcmV0dXJucyB7U3RvcmVkU3Vic2NyaWJlcjxUPn1cbiAqLyRo4oCNX29uY2UuZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkKGZvckVhY2hQdWJsaWNhdGlvblJlY29yZCk7XG5jb25zdCAgICAgICAgbWFrZVN0b3JlZFN1YnNjcmliZXI9KHN1YnNjcmliZXIsc3RvcmFnZU5vZGUsbWFyc2hhbGxlcik9PntcbmFzc2VydEFsbERlZmluZWQoe3N1YnNjcmliZXIsc3RvcmFnZU5vZGUsbWFyc2hhbGxlcn0pO1xuXG5jb25zdCBtYXJzaGFsbFRvU3RvcmFnZT1tYWtlU2VyaWFsaXplVG9TdG9yYWdlKHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIpO1xuXG4vKiBTdGFydCBwdWJsaXNoaW5nIHRoZSBzb3VyY2UuKi9cbmZvckVhY2hQdWJsaWNhdGlvblJlY29yZChzdWJzY3JpYmVyLG1hcnNoYWxsVG9TdG9yYWdlKS5jYXRjaCgoZXJyKT0+e1xuLyogVE9ETzogSG93IHNob3VsZCB3ZSBoYW5kbGUgYW5kL29yIHN1cmZhY2UgdGhpcyBmYWlsdXJlPyovXG4vKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC81NzY2I2Rpc2N1c3Npb25fcjkyMjQ5ODA4OCovXG5jb25zb2xlLmVycm9yKCdTdG9yZWRTdWJzY3JpYmVyIGZhaWxlZCB0byBpdGVyYXRlJyxlcnIpO1xuIH0pO1xuXG4vKiogQHR5cGUge1Vuc2VyaWFsaXplcn0gKi9cbmNvbnN0IHVuc2VyaWFsaXplcj1GYXIoJ3Vuc2VyaWFsaXplcicse1xudW5zZXJpYWxpemU6KGRhdGEpPT5FKG1hcnNoYWxsZXIpLnVuc2VyaWFsaXplKGRhdGEpfSk7XG5cblxuLyoqIEB0eXBlIHtTdG9yZWRTdWJzY3JpYmVyPFQ+fSAqL1xuY29uc3Qgc3RvcmVzdWI9RmFyKCdTdG9yZWRTdWJzY3JpYmVyJyx7XG5zdWJzY3JpYmVBZnRlcjoocHVibGlzaENvdW50KT0+c3Vic2NyaWJlci5zdWJzY3JpYmVBZnRlcihwdWJsaXNoQ291bnQpLFxuZ2V0VXBkYXRlU2luY2U6KHVwZGF0ZUNvdW50KT0+c3Vic2NyaWJlci5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCksXG5nZXRQYXRoOigpPT5FKHN0b3JhZ2VOb2RlKS5nZXRQYXRoKCksXG5nZXRTdG9yZUtleTooKT0+RShzdG9yYWdlTm9kZSkuZ2V0U3RvcmVLZXkoKSxcbmdldFVuc2VyaWFsaXplcjooKT0+dW5zZXJpYWxpemVyfSk7XG5cbnJldHVybiBzdG9yZXN1YjtcbiB9O1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSBtYWtlU3RvcmVkU3Vic2NyaWJlclxuICpcbiAqIEJlZ2luIGl0ZXJhdGluZyB0aGUgc291cmNlLCBzdG9yaW5nIHNlcmlhbGl6ZWQgaXRlcmF0aW9uIHZhbHVlcy4gIElmIHRoZVxuICogc3RvcmFnZU5vZGUncyBgc2V0VmFsdWVgIG9wZXJhdGlvbiByZWplY3RzLCB0aGUgaXRlcmF0aW9uIHdpbGwgYmUgdGVybWluYXRlZC5cbiAqXG4gKiBSZXR1cm5zIGEgU3RvcmVkU3Vic2NyaXB0aW9uIHRoYXQgY2FuIGJlIHVzZWQgYnkgYSBjbGllbnQgdG8gZGlyZWN0bHkgZm9sbG93XG4gKiB0aGUgaXRlcmF0aW9uIHRoZW1zZWx2ZXMsIG9yIG9idGFpbiBpbmZvcm1hdGlvbiB0byBzdWJzY3JpYmUgdG8gdGhlIHN0b3JlZFxuICogZGF0YSBvdXQtb2YtYmFuZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtTdWJzY3JpcHRpb248VD59IHN1YnNjcmlwdGlvblxuICogQHBhcmFtIHtFUmVmPFN0b3JhZ2VOb2RlPn0gW3N0b3JhZ2VOb2RlXVxuICogQHBhcmFtIHtFUmVmPFJldHVyblR5cGU8dHlwZW9mIG1ha2VNYXJzaGFsPj59IFttYXJzaGFsbGVyXVxuICogQHJldHVybnMge1N0b3JlZFN1YnNjcmlwdGlvbjxUPn1cbiAqLyRo4oCNX29uY2UubWFrZVN0b3JlZFN1YnNjcmliZXIobWFrZVN0b3JlZFN1YnNjcmliZXIpO1xuY29uc3QgICAgICAgIG1ha2VTdG9yZWRTdWJzY3JpcHRpb249KFxuc3Vic2NyaXB0aW9uLFxuc3RvcmFnZU5vZGUsXG5tYXJzaGFsbGVyPW1ha2VNYXJzaGFsKHVuZGVmaW5lZCx1bmRlZmluZWQse1xubWFyc2hhbFNhdmVFcnJvcjooKT0+eyB9fSkpPT5cblxue1xuLyoqIEB0eXBlIHtVbnNlcmlhbGl6ZXJ9ICovXG5jb25zdCB1bnNlcmlhbGl6ZXI9RmFyKCd1bnNlcmlhbGl6ZXInLHtcbnVuc2VyaWFsaXplOihkYXRhKT0+RShtYXJzaGFsbGVyKS51bnNlcmlhbGl6ZShkYXRhKX0pO1xuXG5cbi8qIEFib3J0IHRoZSBpdGVyYXRpb24gb24gdGhlIG5leHQgb2JzZXJ2YXRpb24gaWYgdGhlIHB1Ymxpc2hlciBldmVyIGZhaWxzLiovXG5sZXQgcHVibGlzaEZhaWxlZD1mYWxzZTtcbmxldCBwdWJsaXNoRXhjZXB0aW9uO1xuXG5jb25zdCBmYWlsPShlcnIpPT57XG5wdWJsaXNoRmFpbGVkPXRydWU7XG5wdWJsaXNoRXhjZXB0aW9uPWVycjtcbiB9O1xuXG4vKiBNdXN0ICpub3QqIGJlIGFuIGFzeW5jIGZ1bmN0aW9uLCBiZWNhdXNlIGl0IHNvbWV0aW1lcyBtdXN0IHRocm93IHRvIGFib3J0Ki9cbi8qIHRoZSBpdGVyYXRpb24uKi9cbmNvbnN0IHB1Ymxpc2hWYWx1ZT0ob2JqKT0+e1xuYXNzZXJ0KHN0b3JhZ2VOb2RlKTtcbmlmKHB1Ymxpc2hGYWlsZWQpe1xuLyogVG8gcHJvcGVybHkgYWJvcnQgdGhlIGl0ZXJhdGlvbiwgdGhpcyBtdXN0IGJlIGEgc3luY2hyb25vdXMgZXhjZXB0aW9uLiovXG50aHJvdyBwdWJsaXNoRXhjZXB0aW9uO1xuIH1cblxuLyogUHVibGlzaCB0aGUgdmFsdWUsIGNhcHR1cmluZyBhbnkgZXJyb3IuKi9cbkUobWFyc2hhbGxlcikuXG5zZXJpYWxpemUob2JqKS5cbnRoZW4oKHNlcmlhbGl6ZWQpPT57XG5jb25zdCBlbmNvZGVkPUpTT04uc3RyaW5naWZ5KHNlcmlhbGl6ZWQpO1xucmV0dXJuIEUoc3RvcmFnZU5vZGUpLnNldFZhbHVlKGVuY29kZWQpO1xuIH0pLlxuY2F0Y2goZmFpbCk7XG4gfTtcblxuaWYoc3RvcmFnZU5vZGUpe1xuLyogU3RhcnQgcHVibGlzaGluZyB0aGUgc291cmNlLiovXG5vYnNlcnZlSXRlcmF0aW9uKHN1YnNjcmlwdGlvbix7XG51cGRhdGVTdGF0ZTpwdWJsaXNoVmFsdWUsXG5maW5pc2g6cHVibGlzaFZhbHVlfSkuXG5jYXRjaChmYWlsKTtcbiB9XG5cbi8qKiBAdHlwZSB7U3RvcmVkU3Vic2NyaXB0aW9uPFQ+fSAqL1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIC0tIGRpZmZlcmVudCBwZXIgcGFja2FnZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQ2MjAqL1xuLyogQHRzLWlnbm9yZSBnZXRTdG9yZUtleSB0eXBlIGRvZXMgbm90IGhhdmUgYHN1YnNjcmlwdGlvbmAqL1xuY29uc3Qgc3RvcmVzdWI9RmFyKCdTdG9yZWRTdWJzY3JpcHRpb24nLHtcbmdldFN0b3JlS2V5OmFzeW5jKCk9PntcbmlmKCFzdG9yYWdlTm9kZSl7XG5yZXR1cm4gaGFyZGVuKHtzdWJzY3JpcHRpb259KTtcbiB9XG5jb25zdCBzdG9yZUtleT1hd2FpdCBFKHN0b3JhZ2VOb2RlKS5nZXRTdG9yZUtleSgpO1xucmV0dXJuIGhhcmRlbih7Li4uc3RvcmVLZXksc3Vic2NyaXB0aW9ufSk7XG4gfSxcbmdldFVuc2VyaWFsaXplcjooKT0+dW5zZXJpYWxpemVyLFxuZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHM6KCk9Plxuc3Vic2NyaXB0aW9uLmdldFNoYXJhYmxlU3Vic2NyaXB0aW9uSW50ZXJuYWxzKCksXG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT5zdWJzY3JpcHRpb25bU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCl9KTtcblxucmV0dXJuIHN0b3Jlc3ViO1xuIH07JGjigI1fb25jZS5tYWtlU3RvcmVkU3Vic2NyaXB0aW9uKG1ha2VTdG9yZWRTdWJzY3JpcHRpb24pO1xuaGFyZGVuKG1ha2VTdG9yZWRTdWJzY3JpcHRpb24pO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSBTdG9yZWRQdWJsaXNoS2l0XG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVkUHVibGlzaGVyS2l0XG4gKiBAcHJvcGVydHkge1N0b3JlZFN1YnNjcmlwdGlvbjxUPn0gc3Vic2NyaWJlclxuICogQHByb3BlcnR5IHtJdGVyYXRpb25PYnNlcnZlcjxUPn0gcHVibGlzaGVyXG4gKi9cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBpbmNvbXBhdGlibGUgd2l0aCBkdXJhYmlsaXR5OyBpbnN0ZWFkIGhhbmRsZSB2c3RvcmFnZSBlcGhlbWVyYWxseSBvbiBhIGR1cmFibGUgUHVibGlzaEtpdFxuICpcbiAqIEB0ZW1wbGF0ZSBbVD11bmtub3duXVxuICogQHBhcmFtIHtFUmVmPFN0b3JhZ2VOb2RlPn0gW3N0b3JhZ2VOb2RlXVxuICogQHBhcmFtIHtFUmVmPE1hcnNoYWxsZXI+fSBbbWFyc2hhbGxlcl1cbiAqIEBwYXJhbSB7c3RyaW5nfSBbY2hpbGRQYXRoXVxuICogQHJldHVybnMge1N0b3JlZFB1Ymxpc2hlcktpdDxUPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VTdG9yZWRQdWJsaXNoZXJLaXQ9KHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIsY2hpbGRQYXRoKT0+e1xuY29uc3R7cHVibGljYXRpb24sc3Vic2NyaXB0aW9ufT1tYWtlU3Vic2NyaXB0aW9uS2l0KCk7XG5cbmlmKHN0b3JhZ2VOb2RlJiZjaGlsZFBhdGgpe1xuc3RvcmFnZU5vZGU9RShzdG9yYWdlTm9kZSkubWFrZUNoaWxkTm9kZShjaGlsZFBhdGgpO1xuIH1cblxuLyogd3JhcCB0aGUgc3Vic2NyaXB0aW9uIHRvIHRlZSBldmVudHMgdG8gc3RvcmFnZSwgcmVwZWF0aW5nIHRvIHRoaXMgYHN1YnNjcmliZXJgKi9cbmNvbnN0IHN1YnNjcmliZXI9bWFrZVN0b3JlZFN1YnNjcmlwdGlvbihcbnN1YnNjcmlwdGlvbixcbnN0b3JhZ2VOb2RlLFxubWFyc2hhbGxlcik7XG5cblxucmV0dXJue1xucHVibGlzaGVyOnB1YmxpY2F0aW9uLFxuc3Vic2NyaWJlcn07XG5cbiB9O1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIGluY29tcGF0aWJsZSB3aXRoIGR1cmFiaWxpdHk7IGluc3RlYWQgaGFuZGxlIHZzdG9yYWdlIGVwaGVtZXJhbGx5IG9uIGEgZHVyYWJsZSBQdWJsaXNoS2l0XG4gKlxuICogTGlrZSBtYWtlUHVibGlzaEtpdCB0aGlzIG1ha2VzIGEgYHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH1gIHBhaXIgZm9yIGRvaW5nIGVmZmljaWVudFxuICogZGlzdHJpYnV0ZWQgcHViL3N1YiBzdXBwb3J0aW5nIGJvdGggXCJlYWNoXCIgYW5kIFwibGF0ZXN0XCIgaXRlcmF0aW9uXG4gKiBvZiBwdWJsaXNoZWQgdmFsdWVzLlxuICpcbiAqIFdoYXQncyBkaWZmZXJlbnQgaXMgYHN1YnNjcmliZXJgIHRlZXMgcmVjb3Jkcywgd3JpdGluZyBvdXQgdG8gc3RvcmFnZU5vZGUuXG4gKlxuICogQHRlbXBsYXRlIFtUPXVua25vd25dXG4gKiBAcGFyYW0ge0VSZWY8U3RvcmFnZU5vZGU+fSBzdG9yYWdlTm9kZVxuICogQHBhcmFtIHtFUmVmPE1hcnNoYWxsZXI+fSBtYXJzaGFsbGVyXG4gKiBAcmV0dXJucyB7U3RvcmVkUHVibGlzaEtpdDxUPn1cbiAqLyRo4oCNX29uY2UubWFrZVN0b3JlZFB1Ymxpc2hlcktpdChtYWtlU3RvcmVkUHVibGlzaGVyS2l0KTtcbmNvbnN0ICAgICAgICBtYWtlU3RvcmVkUHVibGlzaEtpdD0oc3RvcmFnZU5vZGUsbWFyc2hhbGxlcik9PntcbmNvbnN0e3B1Ymxpc2hlcixzdWJzY3JpYmVyfT1tYWtlUHVibGlzaEtpdCgpO1xuXG5yZXR1cm57XG5wdWJsaXNoZXIsXG4vKiB3cmFwIHRoZSBzdWJzY3JpYmVyIHRvIHRlZSBldmVudHMgdG8gc3RvcmFnZSovXG5zdWJzY3JpYmVyOm1ha2VTdG9yZWRTdWJzY3JpYmVyKHN1YnNjcmliZXIsc3RvcmFnZU5vZGUsbWFyc2hhbGxlcil9O1xuXG4gfTskaOKAjV9vbmNlLm1ha2VTdG9yZWRQdWJsaXNoS2l0KG1ha2VTdG9yZWRQdWJsaXNoS2l0KTtcbmhhcmRlbihtYWtlU3RvcmVkUHVibGlzaEtpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkIjpbImZvckVhY2hQdWJsaWNhdGlvblJlY29yZCJdLCJtYWtlU3RvcmVkU3Vic2NyaWJlciI6WyJtYWtlU3RvcmVkU3Vic2NyaWJlciJdLCJtYWtlU3RvcmVkU3Vic2NyaXB0aW9uIjpbIm1ha2VTdG9yZWRTdWJzY3JpcHRpb24iXSwibWFrZVN0b3JlZFB1Ymxpc2hlcktpdCI6WyJtYWtlU3RvcmVkUHVibGlzaGVyS2l0Il0sIm1ha2VTdG9yZWRQdWJsaXNoS2l0IjpbIm1ha2VTdG9yZWRQdWJsaXNoS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADDTPAY0GAAANBgAACgAAABAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvc3Vic2NyaWJlLmpzeyJpbXBvcnRzIjpbIi4vdHlwZXMtYW1iaWVudC5qcyIsIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbInN1YnNjcmliZSIsInN1YnNjcmliZUVhY2giLCJzdWJzY3JpYmVMYXRlc3QiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxGYXI7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXSxbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5jb25zdCBzaW5rPSgpPT57IH07XG5cbi8qKlxuICogQ3JlYXRlIGEgbmVhciBpdGVyYWJsZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgcG90ZW50aWFsbHkgZmFyIG9uZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEFzeW5jSXRlcmFibGU8VD4+fSBpdFBcbiAqL1xuY29uc3QgICAgICAgIHN1YnNjcmliZT0oaXRQKT0+XG5GYXIoJ0FzeW5jSXRlcmFibGUnLHtcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9PntcbmNvbnN0IGl0PUUoaXRQKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcbnJldHVybiBGYXIoJ0FzeW5jSXRlcmF0b3InLHtcbm5leHQ6YXN5bmMoKT0+RShpdCkubmV4dCgpfSk7XG5cbiB9fSk7XG5cblxuLyoqXG4gKiBBc3luY3Jvbm91c2x5IGl0ZXJhdGVzIG92ZXIgdGhlIGNvbnRlbnRzIG9mIGEgUHVibGljYXRpb25SZWNvcmQgY2hhaW4gYXMgdGhleVxuICogYXBwZWFyLiAgVGhpcyBpdGVyYXRpb24gbXVzdCBkcm9wIHBhcnRzIG9mIHB1YmxpY2F0aW9uIHJlY29yZHMgdGhhdCBhcmUgbm9cbiAqIGxvbmdlciBuZWVkZWQgc28gdGhleSBjYW4gYmUgZ2FyYmFnZSBjb2xsZWN0ZWQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxQdWJsaWNhdGlvblJlY29yZDxUPj59IHB1Ykxpc3RcbiAqIEByZXR1cm5zIHtGb3JrYWJsZUFzeW5jSXRlcmF0b3I8VCwgVD59XG4gKi8kaOKAjV9vbmNlLnN1YnNjcmliZShzdWJzY3JpYmUpO1xuY29uc3QgbWFrZUVhY2hJdGVyYXRvcj0ocHViTGlzdCk9Pntcbi8qIFRvIHVuZGVyc3RhbmQgdGhlIGltcGxlbWVudGF0aW9uLCBzdGFydCB3aXRoKi9cbi8qIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDE2MDQwNDEyMjI1MC9odHRwOi8vd2lraS5lY21hc2NyaXB0Lm9yZy9kb2t1LnBocD9pZD1zdHJhd21hbjpjb25jdXJyZW5jeSNpbmZpbml0ZV9xdWV1ZSovXG5yZXR1cm4gRmFyKCdFYWNoSXRlcmF0b3InLHtcbm5leHQ6KCk9PntcbmNvbnN0IHJlc3VsdFA9RS5nZXQocHViTGlzdCkuaGVhZDtcbnB1Ykxpc3Q9RS5nZXQocHViTGlzdCkudGFpbDtcbi8qIFdlIGV4cGVjdCB0aGUgdGFpbCB0byBiZSB0aGUgXCJjYW5ub3QgcmVhZCBwYXN0IGVuZFwiIGVycm9yIGF0IHRoZSBlbmQqL1xuLyogb2YgdGhlIGhhcHB5IHBhdGguKi9cbi8qIFNpbmNlIHdlIGFyZSB3cmFwcGluZyB0aGF0IGVycm9yIHdpdGggZXZlbnR1YWwgc2VuZCwgd2Ugc2luayB0aGUqL1xuLyogcmVqZWN0aW9uIGhlcmUgdG9vIHNvIGl0IGRvZXNuJ3QgYmVjb21lIGFuIGludmFsaWQgdW5oYW5kbGVkIHJlamVjdGlvbiovXG4vKiBsYXRlci4qL1xudm9pZCBFLndoZW4ocHViTGlzdCxzaW5rLHNpbmspO1xucmV0dXJuIHJlc3VsdFA7XG4gfSxcbmZvcms6KCk9Pm1ha2VFYWNoSXRlcmF0b3IocHViTGlzdCl9KTtcblxuIH07XG5cbi8qKlxuICogR2l2ZW4gYSBsb2NhbCBvciByZW1vdGUgc3Vic2NyaWJlciwgcmV0dXJucyBhIGxvY2FsIEFzeW5jSXRlcmFibGUgd2hpY2hcbiAqIHByb3ZpZGVzIFwicHJlZml4IGxvc3N5XCIgaXRlcmF0aW9ucyBvZiB0aGUgdW5kZXJseWluZyBQdWJsaWNhdGlvbkxpc3QuXG4gKiBCeSBcInByZWZpeCBsb3NzeVwiLCB3ZSBtZWFuIHRoYXQgeW91IG1heSBtaXNzIGV2ZXJ5dGhpbmcgcHVibGlzaGVkIGJlZm9yZVxuICogeW91IGFzayB0aGUgcmV0dXJuZWQgaXRlcmFibGUgZm9yIGFuIGl0ZXJhdG9yLiBCdXQgdGhlIHJldHVybmVkIGl0ZXJhdG9yXG4gKiB3aWxsIGVudW1lcmF0ZSBlYWNoIHRoaW5nIHB1Ymxpc2hlZCBmcm9tIHRoYXQgaXRlcmF0b3IncyBzdGFydGluZyBwb2ludC5cbiAqXG4gKiBJZiB0aGUgdW5kZXJseWluZyBQdWJsaWNhdGlvbkxpc3QgaXMgdGVybWluYXRlZCwgdGhhdCB0ZXJtaW5hbCB2YWx1ZSB3aWxsIGJlXG4gKiByZXBvcnRlZCBsb3NzbGVzc2x5LlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8RWFjaFRvcGljPFQ+Pn0gdG9waWNcbiAqL1xuY29uc3QgICAgICAgIHN1YnNjcmliZUVhY2g9KHRvcGljKT0+e1xuY29uc3QgaXRlcmFibGU9RmFyKCdFYWNoSXRlcmFibGUnLHtcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9PntcbmNvbnN0IHB1Ykxpc3Q9RSh0b3BpYykuc3Vic2NyaWJlQWZ0ZXIoKTtcbnJldHVybiBtYWtlRWFjaEl0ZXJhdG9yKHB1Ykxpc3QpO1xuIH19KTtcblxucmV0dXJuIGl0ZXJhYmxlO1xuIH07JGjigI1fb25jZS5zdWJzY3JpYmVFYWNoKHN1YnNjcmliZUVhY2gpO1xuaGFyZGVuKHN1YnNjcmliZUVhY2gpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8TGF0ZXN0VG9waWM8VD4+fSB0b3BpY1xuICogQHBhcmFtIHtiaWdpbnR9IFtsb2NhbFVwZGF0ZUNvdW50XVxuICogQHBhcmFtIHtJdGVyYXRvclJldHVyblJlc3VsdDxUPn0gW3Rlcm1pbmFsUmVzdWx0XVxuICogQHJldHVybnMge0ZvcmthYmxlQXN5bmNJdGVyYXRvcjxULCBUPn1cbiAqL1xuY29uc3QgY2xvbmVMYXRlc3RJdGVyYXRvcj0odG9waWMsbG9jYWxVcGRhdGVDb3VudCx0ZXJtaW5hbFJlc3VsdCk9PntcbmxldCBtdXRleD1Qcm9taXNlLnJlc29sdmUoKTtcblxuLyoqXG4gKiBSZXF1ZXN0IHRoZSBuZXh0IHVwZGF0ZSByZWNvcmQgZnJvbSB0aGUgdG9waWMsIHVwZGF0aW5nIG91ciBsb2NhbCBzdGF0ZSxcbiAqIGFuZCBjb252ZXJ0IGl0IHRvIGFuIGl0ZXJhdG9yIHJlc3VsdC5cbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJdGVyYXRvclJlc3VsdDxULCBUPj59XG4gKi9cbmNvbnN0IG1heWJlUmVxdWVzdE5leHRSZXN1bHQ9YXN5bmMoKT0+e1xuaWYodGVybWluYWxSZXN1bHQpe1xuLyogV2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSB0b3BpYywganVzdCBrZWVwIHJldHVybmluZyB0aGUgbGFzdCByZXN1bHQqL1xuLyogd2l0aG91dCBmdXJ0aGVyIHJlcXVlc3RzLiovXG5yZXR1cm4gdGVybWluYWxSZXN1bHQ7XG4gfVxuXG4vKiBTZW5kIHRoZSBuZXh0IHJlcXVlc3Qgbm93LCBza2lwcGluZyBwYXN0IGludGVybWVkaWF0ZSB1cGRhdGVzLiovXG5jb25zdHt2YWx1ZSx1cGRhdGVDb3VudH09YXdhaXQgRSh0b3BpYykuZ2V0VXBkYXRlU2luY2UoXG5sb2NhbFVwZGF0ZUNvdW50KTtcblxuLyogTWFrZSBzdXJlIHRoZSBuZXh0IHJlcXVlc3QgaXMgZm9yIGEgZnJlc2hlciB2YWx1ZS4qL1xubG9jYWxVcGRhdGVDb3VudD11cGRhdGVDb3VudDtcblxuLyogTWFrZSBhbiBJdGVyYXRvclJlc3VsdC4qL1xuaWYodXBkYXRlQ291bnQ9PT11bmRlZmluZWQpe1xudGVybWluYWxSZXN1bHQ9aGFyZGVuKHtkb25lOnRydWUsdmFsdWV9KTtcbnJldHVybiB0ZXJtaW5hbFJlc3VsdDtcbiB9XG5yZXR1cm4gaGFyZGVuKHtkb25lOmZhbHNlLHZhbHVlfSk7XG4gfTtcblxucmV0dXJuIEZhcignTGF0ZXN0SXRlcmF0b3InLHtcbmZvcms6KCk9PmNsb25lTGF0ZXN0SXRlcmF0b3IodG9waWMsbG9jYWxVcGRhdGVDb3VudCx0ZXJtaW5hbFJlc3VsdCksXG5uZXh0OmFzeW5jKCk9Pntcbi8qIEluIHRoaXMgYWRhcHRvciwgb25jZSBgbmV4dCgpYCBpcyBjYWxsZWQgYW5kIHJldHVybnMgYW4gdW5yZXNvbHZlZCovXG4vKiBwcm9taXNlLCBmdXJ0aGVyIGBuZXh0KClgIGNhbGxzIHdpbGwgYWxzbyByZXR1cm4gdW5yZXNvbHZlZCBwcm9taXNlcyovXG4vKiBidXQgZWFjaCBjYWxsIHdpbGwgbm90IHRyaWdnZXIgYW5vdGhlciBgdG9waWNgIHJlcXVlc3QgdW50aWwgdGhlIHByaW9yKi9cbi8qIG9uZSBoYXMgc2V0dGxlZC4qL1xuLyoqL1xuLyogVGhpcyBsaW5lYXIgcXVldWVpbmcgYmVoYXZpb3IgaXMgb25seSBuZWVkZWQgZm9yIGNvZGUgdGhhdCB1c2VzIHRoZSovXG4vKiBhc3luYyBpdGVyYXRvciBwcm90b2NvbCBleHBsaWNpdGx5LiBXaGVuIHRoaXMgYXN5bmMgaXRlcmF0b3IgaXMqL1xuLyogY29uc3VtZWQgYnkgYSBmb3IvYXdhaXQvb2YgbG9vcCwgYG5leHQoKWAgd2lsbCBvbmx5IGJlIGNhbGxlZCBhZnRlciB0aGUqL1xuLyogcHJvbWlzZSBmb3IgdGhlIHByZXZpb3VzIGl0ZXJhdGlvbiByZXN1bHQgaGFzIGZ1bGZpbGxlZC4gSWYgaXQgZnVsZmlsbHMqL1xuLyogd2l0aCBgZG9uZTogdHJ1ZWAsIHRoZSBmb3IvYXdhaXQvb2YgbG9vcCB3aWxsIG5ldmVyIGNhbGwgYG5leHQoKWAqL1xuLyogYWdhaW4uKi9cbi8qKi9cbi8qIFNlZSovXG4vKiBodHRwczovLzJhbGl0eS5jb20vMjAxNi8xMC9hc3luY2hyb25vdXMtaXRlcmF0aW9uLmh0bWwjcXVldWluZy1uZXh0KCktaW52b2NhdGlvbnMqL1xuLyogZm9yIGFuIGV4cGxpY2l0IHVzZSB0aGF0IHNlbmRzIGBuZXh0KClgIHdpdGhvdXQgd2FpdGluZy4qL1xuXG5pZih0ZXJtaW5hbFJlc3VsdCl7XG4vKiBXZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHRvcGljLCBqdXN0IGtlZXAgcmV0dXJuaW5nIHRoZSBsYXN0Ki9cbi8qIHJlc3VsdC4qL1xucmV0dXJuIHRlcm1pbmFsUmVzdWx0O1xuIH1cblxuLyogQkVHSU4gQ1JJVElDQUwgU0VDVElPTiAtIHN5bmNocm9ub3VzbHkgZW5xdWV1ZSBhbmQgcmVhc3NpZ24gYG11dGV4YCovXG4vKiovXG4vKiBVc2UgYG11dGV4YCB0byBlbnN1cmUgdGhhdCB3ZSBoYXZlIG5vIG1vcmUgdGhhbiBhIHNpbmdsZSByZXF1ZXN0IGluKi9cbi8qIGZsaWdodC4qL1xuY29uc3QgbmV4dFJlc3VsdD1tdXRleC50aGVuKG1heWJlUmVxdWVzdE5leHRSZXN1bHQpO1xubXV0ZXg9bmV4dFJlc3VsdC50aGVuKHNpbmssc2luayk7XG4vKiBFTkQgQ1JJVElDQUwgU0VDVElPTiovXG5cbnJldHVybiBuZXh0UmVzdWx0O1xuIH19KTtcblxuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxMYXRlc3RUb3BpYzxUPj59IHRvcGljXG4gKiBAcmV0dXJucyB7Rm9ya2FibGVBc3luY0l0ZXJhdG9yPFQsIFQ+fVxuICovXG5jb25zdCBtYWtlTGF0ZXN0SXRlcmF0b3I9KHRvcGljKT0+Y2xvbmVMYXRlc3RJdGVyYXRvcih0b3BpYyk7XG5cbi8qKlxuICogR2l2ZW4gYSBsb2NhbCBvciByZW1vdGUgc3Vic2NyaWJlciwgcmV0dXJucyBhIGxvY2FsIEFzeW5jSXRlcmFibGUgd2hpY2hcbiAqIHByb3ZpZGVzIFwibG9zc3lcIiBpdGVyYXRpb25zIG9mIHRoZSB1bmRlcmx5aW5nIFB1YmxpY2F0aW9uTGlzdC5cbiAqIEJ5IFwibG9zc3lcIiwgd2UgbWVhbiB0aGF0IHlvdSBtYXkgbWlzcyBhbnkgcHVibGlzaGVkIHN0YXRlIGlmIGEgbW9yZVxuICogcmVjZW50IHB1Ymxpc2hlZCBzdGF0ZSBjYW4gYmUgcmVwb3J0ZWQgaW5zdGVhZC5cbiAqXG4gKiBJZiB0aGUgdW5kZXJseWluZyBQdWJsaWNhdGlvbkxpc3QgaXMgdGVybWluYXRlZCwgdGhhdCB0ZXJtaW5hbCB2YWx1ZSB3aWxsIGJlXG4gKiByZXBvcnRlZCBsb3NzbGVzc2x5LlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8TGF0ZXN0VG9waWM8VD4+fSB0b3BpY1xuICovXG5jb25zdCAgICAgICAgc3Vic2NyaWJlTGF0ZXN0PSh0b3BpYyk9PntcbmNvbnN0IGl0ZXJhYmxlPUZhcignTGF0ZXN0SXRlcmFibGUnLHtcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9Pm1ha2VMYXRlc3RJdGVyYXRvcih0b3BpYyl9KTtcblxucmV0dXJuIGl0ZXJhYmxlO1xuIH07JGjigI1fb25jZS5zdWJzY3JpYmVMYXRlc3Qoc3Vic2NyaWJlTGF0ZXN0KTtcbmhhcmRlbihzdWJzY3JpYmVMYXRlc3QpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InN1YnNjcmliZSI6WyJzdWJzY3JpYmUiXSwic3Vic2NyaWJlRWFjaCI6WyJzdWJzY3JpYmVFYWNoIl0sInN1YnNjcmliZUxhdGVzdCI6WyJzdWJzY3JpYmVMYXRlc3QiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAApIa3j6wLAACsCwAAKQAAAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9zdWJzY3JpYmVyLmpzeyJpbXBvcnRzIjpbIi4vcHVibGlzaC1raXQuanMiLCIuL3N1YnNjcmliZS5qcyIsIi4vdG9waWMuanMiLCIuL3R5cGVzLWFtYmllbnQuanMiLCJAZW5kby9mYXIiXSwiZXhwb3J0cyI6WyJtYWtlU3Vic2NyaXB0aW9uIiwibWFrZVN1YnNjcmlwdGlvbktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLEZhcixzdWJzY3JpYmVFYWNoLG1ha2VQdWJsaXNoS2l0LG1ha2VQaW5uZWRIaXN0b3J5VG9waWM7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXSxbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCIuL3N1YnNjcmliZS5qc1wiLCBbW1wic3Vic2NyaWJlRWFjaFwiLCBbJGjigI1fYSA9PiAoc3Vic2NyaWJlRWFjaCA9ICRo4oCNX2EpXV1dXSxbXCIuL3B1Ymxpc2gta2l0LmpzXCIsIFtbXCJtYWtlUHVibGlzaEtpdFwiLCBbJGjigI1fYSA9PiAobWFrZVB1Ymxpc2hLaXQgPSAkaOKAjV9hKV1dXV0sW1wiLi90b3BpYy5qc1wiLCBbW1wibWFrZVBpbm5lZEhpc3RvcnlUb3BpY1wiLCBbJGjigI1fYSA9PiAobWFrZVBpbm5lZEhpc3RvcnlUb3BpYyA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8RWFjaFRvcGljPFQ+Pn0gdG9waWNcbiAqIEByZXR1cm5zIHtTdWJzY3JpcHRpb248VD59XG4gKi9cbmNvbnN0IG1ha2VTdWJzY3JpcHRpb249KHRvcGljKT0+e1xuY29uc3Qgc3Vic2NyaXB0aW9uPUZhcignU3Vic2NyaXB0aW9uJyx7XG4uLi5zdWJzY3JpYmVFYWNoKHRvcGljKSxcbnN1YnNjcmliZUFmdGVyOmFzeW5jKHB1Ymxpc2hDb3VudCk9PkUodG9waWMpLnN1YnNjcmliZUFmdGVyKHB1Ymxpc2hDb3VudCksXG5cbi8qKlxuICogVXNlIHRoaXMgdG8gZGlzdHJpYnV0ZSBhIFN1YnNjcmlwdGlvbiBlZmZpY2llbnRseSBvdmVyIHRoZSBuZXR3b3JrLFxuICogYnkgb2J0YWluaW5nIHRoaXMgZnJvbSB0aGUgU3Vic2NyaXB0aW9uIHRvIGJlIHJlcGxpY2F0ZWQsIGFuZCBhcHBseWluZ1xuICogYG1ha2VTdWJzY3JpcHRpb25gIHRvIGl0IGF0IHRoZSBuZXcgc2l0ZSB0byBnZXQgYW4gZXF1aXZhbGVudCBsb2NhbFxuICogU3Vic2NyaXB0aW9uIGF0IHRoYXQgc2l0ZS5cbiAqL1xuZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHM6YXN5bmMoKT0+dG9waWMsXG5cbmdldFN0b3JlS2V5OigpPT5oYXJkZW4oe3N1YnNjcmlwdGlvbn0pfSk7XG5cbnJldHVybiBzdWJzY3JpcHRpb247XG4gfTskaOKAjV9vbmNlLm1ha2VTdWJzY3JpcHRpb24obWFrZVN1YnNjcmlwdGlvbik7XG5oYXJkZW4obWFrZVN1YnNjcmlwdGlvbik7XG5cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBQcm9kdWNlcnMgc2hvdWxkIHVzZVxuICogYGBganNcbiAqIGNvbnN0IHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH0gPSBtYWtlUHVibGlzaEtpdCgpO1xuICogY29uc3QgdG9waWMgPSBtYWtlUGlubmVkSGlzdG9yeVRvcGljKHN1YnNjcmliZXIpO1xuICogYGBgXG4gKiBpbnN0ZWFkLCB3aGljaCBtYWtlcyBpdCBjbGVhcmVyIHRoYXQgYWxsIHRoZSBzdWJzY3JpYmVyJ3MgaGlzdG9yeSBpc1xuICogcmV0YWluZWQsIHByZXZlbnRpbmcgR0MuICBQb3RlbnRpYWxseSByZW1vdGUgY29uc3VtZXJzIHVzZVxuICogYGBganNcbiAqIGZvciBhd2FpdCAoY29uc3QgdmFsdWUgb2Ygc3Vic2NyaWJlRWFjaCh0b3BpYykpIHsgLi4uIH1cbiAqIGBgYFxuICpcbiAqIE1ha2VzIGEgYHsgcHVibGljYXRpb24sIHN1YnNjcmlwdGlvbiB9YCBmb3IgZG9pbmcgbG9zc2xlc3MgZWZmaWNpZW50XG4gKiBkaXN0cmlidXRlZCBwdWIvc3ViLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcmV0dXJucyB7U3Vic2NyaXB0aW9uUmVjb3JkPFQ+fVxuICovXG5jb25zdCBtYWtlU3Vic2NyaXB0aW9uS2l0PSgpPT57XG5jb25zdHtwdWJsaXNoZXIsc3Vic2NyaWJlcn09bWFrZVB1Ymxpc2hLaXQoKTtcblxuLyogVGhlIHB1Ymxpc2gga2l0IHN1YnNjcmliZXIgaXMgcHJlZml4LWxvc3N5LCBzbyBtYWtpbmcgKnRoaXMqIHN1YnNjcmliZXIgY29tcGxldGVseSovXG4vKiBsb3NzbGVzcyBmcm9tIGluaXRpYWxpc2F0aW9uIHJlcXVpcmVzIHBpbm5pbmcgdGhlIGZvcm1lcidzIGhpc3RvcnkuKi9cblxuY29uc3QgcGlubmVkSGlzdG9yeVRvcGljPW1ha2VQaW5uZWRIaXN0b3J5VG9waWMoc3Vic2NyaWJlcik7XG5jb25zdCBzdWJzY3JpcHRpb249bWFrZVN1YnNjcmlwdGlvbihwaW5uZWRIaXN0b3J5VG9waWMpO1xuXG4vKiogQHR5cGUge0l0ZXJhdGlvbk9ic2VydmVyPFQ+fSAqL1xuY29uc3QgcHVibGljYXRpb249RmFyKCdwdWJsaWNhdGlvbicse1xudXBkYXRlU3RhdGU6KG5vbkZpbmFsVmFsdWUpPT5wdWJsaXNoZXIucHVibGlzaChub25GaW5hbFZhbHVlKSxcbmZpbmlzaDooY29tcGxldGlvbik9PnB1Ymxpc2hlci5maW5pc2goY29tcGxldGlvbiksXG5mYWlsOihyZWFzb24pPT5wdWJsaXNoZXIuZmFpbChyZWFzb24pfSk7XG5cblxucmV0dXJuIGhhcmRlbih7cHVibGljYXRpb24sc3Vic2NyaXB0aW9ufSk7XG4gfTskaOKAjV9vbmNlLm1ha2VTdWJzY3JpcHRpb25LaXQobWFrZVN1YnNjcmlwdGlvbktpdCk7XG5oYXJkZW4obWFrZVN1YnNjcmlwdGlvbktpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVN1YnNjcmlwdGlvbiI6WyJtYWtlU3Vic2NyaXB0aW9uIl0sIm1ha2VTdWJzY3JpcHRpb25LaXQiOlsibWFrZVN1YnNjcmlwdGlvbktpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAz/HkY8wUAAPMFAAAkAAAAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL3RvcGljLmpzeyJpbXBvcnRzIjpbIi4vdHlwZXMtYW1iaWVudC5qcyIsIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbIm1ha2VQaW5uZWRIaXN0b3J5VG9waWMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgQSBwaW5uZWQtaGlzdG9yeSB0b3BpYyBwcmVzZXJ2ZXMgYWxsIG9mIGl0cyBwdWJsaXNoZWQgdmFsdWVzIGluXG4gKiBtZW1vcnkuICBVc2UgYSBwcmVmaXgtbG9zc3kgbWFrZVB1Ymxpc2hLaXQgaW5zdGVhZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFYWNoVG9waWM8VD4gJiBMYXRlc3RUb3BpYzxUPn0gdG9waWMgbmVlZHMgdG8gYmUgbmVhciBpbiBvcmRlciB0b1xuICogcHJlc2VydmUgc3Vic2NyaXB0aW9uIHRpbWluZ3MuICBUT0RPOiBkcm9wIExhdGVzdFRvcGljPFQ+IHJlcXVpcmVtZW50XG4gKiBAcmV0dXJucyB7RWFjaFRvcGljPFQ+ICYgTGF0ZXN0VG9waWM8VD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlUGlubmVkSGlzdG9yeVRvcGljPSh0b3BpYyk9Pntcbi8qIFN1Y2ggbG9zc2xlc3NuZXNzIGluaGliaXRzIEdDLCB3aGljaCBpcyB3aHkgd2UncmUgbW92aW5nIGF3YXkgZnJvbSBpdC4qL1xuXG4vKiBXZSBuZWVkIHRvIHRha2UgYW4gaW1tZWRpYXRlIHNuYXBzaG90IG9mIHRoZSB0b3BpYydzIGN1cnJlbnQgc3RhdGUuKi9cbmNvbnN0IHBpbm5lZFB1Ykxpc3Q9dG9waWMuc3Vic2NyaWJlQWZ0ZXIoKTtcblxucmV0dXJuIEZhcignUGlubmVkSGlzdG9yeVRvcGljJyx7XG5zdWJzY3JpYmVBZnRlcjphc3luYyhwdWJsaXNoQ291bnQ9LTFuKT0+e1xuaWYocHVibGlzaENvdW50PT09LTFuKXtcbnJldHVybiBwaW5uZWRQdWJMaXN0O1xuIH1cbnJldHVybiB0b3BpYy5zdWJzY3JpYmVBZnRlcihwdWJsaXNoQ291bnQpO1xuIH0sXG5nZXRVcGRhdGVTaW5jZTphc3luYyh1cGRhdGVDb3VudD11bmRlZmluZWQpPT57XG4vKiBUT0RPOiBCdWlsZCB0aGlzIG91dCBvZiBFYWNoVG9waWM8VD4uKi9cbnJldHVybiB0b3BpYy5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCk7XG4gfX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VQaW5uZWRIaXN0b3J5VG9waWMobWFrZVBpbm5lZEhpc3RvcnlUb3BpYyk7XG5oYXJkZW4obWFrZVBpbm5lZEhpc3RvcnlUb3BpYyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVBpbm5lZEhpc3RvcnlUb3BpYyI6WyJtYWtlUGlubmVkSGlzdG9yeVRvcGljIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGNGw7teKgAAXioAACwAAABAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvdHlwZXMtYW1iaWVudC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9mYXInKS5FUmVmPFQ+fSBFUmVmXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Byb21pc2Uta2l0JykuUHJvbWlzZUtpdDxUPn0gUHJvbWlzZUtpdFxuICovXG5cbi8qKlxuICogRGVwcmVjYXRlZC4gVXNlIFByb21pc2VLaXQgaW5zdGVhZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Byb21pc2Uta2l0JykuUHJvbWlzZVJlY29yZDxUPn0gUHJvbWlzZVJlY29yZFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSBbVFJldHVybj1hbnldXG4gKiBAdGVtcGxhdGUgW1ROZXh0PXVuZGVmaW5lZF1cbiAqIEB0eXBlZGVmIHtBc3luY0l0ZXJhdG9yPFQsIFRSZXR1cm4sIFROZXh0PiAmIHtcbiAqICAgZm9yaygpOiBGb3JrYWJsZUFzeW5jSXRlcmF0b3I8VCwgVFJldHVybiwgVE5leHQ+XG4gKiB9fSBGb3JrYWJsZUFzeW5jSXRlcmF0b3IgQW4gQXN5bmNJdGVyYXRvciB0aGF0IGNhbiBiZSBmb3JrZWQgYXQgYSBnaXZlbiBwb3NpdGlvblxuICogaW50byBtdWx0aXBsZSBpbmRlcGVuZGVudCBGb3JrYWJsZUFzeW5jSXRlcmF0b3JzIHN0YXJ0aW5nIGZyb20gdGhhdCBwb3NpdGlvbi5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdGVtcGxhdGUgW1RSZXR1cm49YW55XVxuICogQHRlbXBsYXRlIFtUTmV4dD11bmRlZmluZWRdXG4gKiBAdHlwZWRlZiB7e1xuICogICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiBGb3JrYWJsZUFzeW5jSXRlcmF0b3I8VCwgVFJldHVybiwgVE5leHQ+XG4gKiB9fSBGb3JrYWJsZUFzeW5jSXRlcmFibGVcbiAqIEFuIEFzeW5jSXRlcmFibGUgdGhhdCBwcm9kdWNlcyBGb3JrYWJsZUFzeW5jSXRlcmF0b3JzLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEl0ZXJhdGlvbk9ic2VydmVyPFQ+XG4gKiBBIHZhbGlkIHNlcXVlbmNlIG9mIGNhbGxzIHRvIHRoZSBtZXRob2RzIG9mIGFuIGBJdGVyYXRpb25PYnNlcnZlcmBcbiAqIHJlcHJlc2VudHMgYW4gaXRlcmF0aW9uLiBBIHZhbGlkIHNlcXVlbmNlIGNvbnNpc3RzIG9mIGFueSBudW1iZXIgb2YgY2FsbHNcbiAqIHRvIGB1cGRhdGVTdGF0ZWAgd2l0aCB0aGUgc3VjY2Vzc2l2ZSBub24tZmluYWwgdmFsdWVzLCBmb2xsb3dlZCBieSBhXG4gKiBmaW5hbCBjYWxsIHRvIGVpdGhlciBgZmluaXNoYCB3aXRoIGEgc3VjY2Vzc2Z1bCBgY29tcGxldGlvbmAgdmFsdWVcbiAqIG9yIGBmYWlsYCB3aXRoIHRoZSBhbGxlZ2VkIGByZWFzb25gIGZvciBmYWlsdXJlLiBBZnRlciBhdCBtb3N0IG9uZVxuICogdGVybWluYXRpbmcgY2FsbHMsIG5vIGZ1cnRoZXIgY2FsbHMgdG8gdGhlc2UgbWV0aG9kcyBhcmUgdmFsaWQgYW5kIG11c3QgYmVcbiAqIHJlamVjdGVkLlxuICogQHByb3BlcnR5IHsobm9uRmluYWxWYWx1ZTogVCkgPT4gdm9pZH0gdXBkYXRlU3RhdGVcbiAqIEBwcm9wZXJ0eSB7KGNvbXBsZXRpb246IFQpID0+IHZvaWR9IGZpbmlzaFxuICogQHByb3BlcnR5IHsocmVhc29uOiB1bmtub3duKSA9PiB2b2lkfSBmYWlsXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQdWJsaWNhdGlvblJlY29yZFxuICogV2lsbCBiZSBzaGFyZWQgYmV0d2VlbiBtYWNoaW5lcywgc28gaXQgbXVzdCBiZSBzYWZlIHRvIGV4cG9zZS4gQnV0IHNvZnR3YXJlXG4gKiBvdXRzaWRlIHRoZSBjdXJyZW50IHBhY2thZ2Ugc2hvdWxkIGNvbnNpZGVyIGl0IG9wYXF1ZSwgbm90IGRlcGVuZGluZyBvbiBpdHNcbiAqIGludGVybmFsIHN0cnVjdHVyZS5cbiAqIEBwcm9wZXJ0eSB7SXRlcmF0b3JSZXN1bHQ8VD59IGhlYWRcbiAqIEBwcm9wZXJ0eSB7YmlnaW50fSBwdWJsaXNoQ291bnRcbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZTxQdWJsaWNhdGlvblJlY29yZDxUPj59IHRhaWxcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFYWNoVG9waWNcbiAqIEBwcm9wZXJ0eSB7KHB1Ymxpc2hDb3VudD86IGJpZ2ludCkgPT4gUHJvbWlzZTxQdWJsaWNhdGlvblJlY29yZDxUPj59IHN1YnNjcmliZUFmdGVyXG4gKiBSZXR1cm5zIGEgcHJvbWlzZSBmb3IgYSBcImN1cnJlbnRcIiBQdWJsaWNhdGlvblJlY29yZCAocmVmZXJlbmNpbmcgaXRzXG4gKiBpbW1lZGlhdGUgc3VjY2Vzc29yIHZpYSBhIGB0YWlsYCBwcm9taXNlKSB0aGF0IGlzIGxhdGVyIHRoYW4gdGhlXG4gKiBwcm92aWRlZCBwdWJsaXNoQ291bnQuXG4gKiBVc2VkIHRvIG1ha2UgZm9yd2FyZC1sb3NzbGVzcyAoXCJlYWNoXCIpIGl0ZXJhdG9ycy5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMYXRlc3RUb3BpY1xuICogQHByb3BlcnR5IHsodXBkYXRlQ291bnQ/OiBiaWdpbnQgfCBudW1iZXIpID0+IFByb21pc2U8VXBkYXRlUmVjb3JkPFQ+Pn0gZ2V0VXBkYXRlU2luY2VcbiAqIFJldHVybnMgYSBwcm9taXNlIGZvciBhbiB1cGRhdGUgcmVjb3JkIGFzIG9mIGFuIHVwZGF0ZSBjb3VudC5cbiAqIElmIHRoZSBgdXBkYXRlQ291bnRgIGFyZ3VtZW50IGlzIG9taXR0ZWQgb3IgZGlmZmVycyBmcm9tIHRoZSBjdXJyZW50IHVwZGF0ZSBjb3VudCxcbiAqIHRoZSBwcm9taXNlIHByb21wdGx5IHJlc29sdmVzIHRvIHRoZSBjdXJyZW50IHJlY29yZC5cbiAqIE90aGVyd2lzZSwgYWZ0ZXIgdGhlIG5leHQgc3RhdGUgY2hhbmdlLCB0aGUgcHJvbWlzZSByZXNvbHZlcyB0byB0aGUgcmVzdWx0aW5nIHJlY29yZC5cbiAqIFRoaXMgaXMgYW4gYXR0ZW51YXRlZCBmb3JtIG9mIGBzdWJzY3JpYmVBZnRlcmAgd2hvc2UgcmV0dXJuIHZhbHVlIHN0YW5kcyBhbG9uZSBhbmRcbiAqIGRvZXMgbm90IGFsbG93IGNvbnN1bWVycyB0byBwaW4gYSBjaGFpbiBvZiBoaXN0b3JpY2FsIFB1YmxpY2F0aW9uUmVjb3Jkcy5cbiAqIFVzZWQgdG8gbWFrZSBsb3NzeSAoXCJsYXRlc3RcIikgaXRlcmF0b3JzLlxuICogTk9URTogVXNlIG9mIGBudW1iZXJgIGFzIGFuIGB1cGRhdGVDb3VudGAgaXMgZGVwcmVjYXRlZC5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7TGF0ZXN0VG9waWM8VD59IEJhc2VOb3RpZmllciBUaGlzIHR5cGUgaXMgZGVwcmVjYXRlZCBidXQgaXMgc3RpbGxcbiAqIHVzZWQgZXh0ZXJuYWxseS5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7TGF0ZXN0VG9waWM8VD4gJiBFYWNoVG9waWM8VD59IFN1YnNjcmliZXJcbiAqIEEgc3RyZWFtIG9mIHJlc3VsdHMgdGhhdCBhbGxvd3MgY29uc3VtZXJzIHRvIGNvbmZpZ3VyZVxuICogZm9yd2FyZC1sb3NzbGVzcyBcImVhY2hcIiBpdGVyYXRpb24gd2l0aCBgc3Vic2NyaWJlRWFjaGAgYW5kXG4gKiBsb3NzeSBcImxhdGVzdFwiIGl0ZXJhdGlvbiB3aXRoIGBzdWJzY3JpYmVMYXRlc3RgLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFB1Ymxpc2hlclxuICogQSB2YWxpZCBzZXF1ZW5jZSBvZiBjYWxscyB0byB0aGUgbWV0aG9kcyBvZiBhbiBgSXRlcmF0aW9uT2JzZXJ2ZXJgXG4gKiByZXByZXNlbnRzIGFuIGl0ZXJhdGlvbi4gQSB2YWxpZCBzZXF1ZW5jZSBjb25zaXN0cyBvZiBhbnkgbnVtYmVyIG9mIGNhbGxzXG4gKiB0byBgcHVibGlzaGAgd2l0aCB0aGUgc3VjY2Vzc2l2ZSBub24tZmluYWwgdmFsdWVzLCBmb2xsb3dlZCBieSBhXG4gKiBmaW5hbCBjYWxsIHRvIGVpdGhlciBgZmluaXNoYCB3aXRoIGEgc3VjY2Vzc2Z1bCBgY29tcGxldGlvbmAgdmFsdWVcbiAqIG9yIGBmYWlsYCB3aXRoIHRoZSBhbGxlZ2VkIGByZWFzb25gIGZvciBmYWlsdXJlLiBBZnRlciBhdCBtb3N0IG9uZVxuICogdGVybWluYXRpbmcgY2FsbHMsIG5vIGZ1cnRoZXIgY2FsbHMgdG8gdGhlc2UgbWV0aG9kcyBhcmUgdmFsaWQgYW5kIG11c3QgYmVcbiAqIHJlamVjdGVkLlxuICogQHByb3BlcnR5IHsobm9uRmluYWxWYWx1ZTogVCkgPT4gdm9pZH0gcHVibGlzaFxuICogQHByb3BlcnR5IHsoY29tcGxldGlvbjogVCkgPT4gdm9pZH0gZmluaXNoXG4gKiBAcHJvcGVydHkgeyhyZWFzb246IGFueSkgPT4gdm9pZH0gZmFpbFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtQYXJ0aWFsPFB1Ymxpc2hlcjxUPj59IFB1Ymxpc2hPYnNlcnZlclxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFB1Ymxpc2hLaXQ8VD5cbiAqIEBwcm9wZXJ0eSB7UHVibGlzaGVyPFQ+fSBwdWJsaXNoZXJcbiAqIEBwcm9wZXJ0eSB7U3Vic2NyaWJlcjxUPn0gc3Vic2NyaWJlclxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0b3JlZFB1Ymxpc2hLaXQ8VD5cbiAqIEBwcm9wZXJ0eSB7UHVibGlzaGVyPFQ+fSBwdWJsaXNoZXJcbiAqIEBwcm9wZXJ0eSB7U3RvcmVkU3Vic2NyaWJlcjxUPn0gc3Vic2NyaWJlclxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7J21hbmRhdG9yeScgfCAnb3Bwb3J0dW5pc3RpYycgfCAnaWdub3JlZCd9IER1cmFibGVQdWJsaXNoS2l0VmFsdWVEdXJhYmlsaXR5XG4gKlxuICogRHVyYWJpbGl0eSBjb25maWd1cmVzIGNvbnN0cmFpbnRzIG9uIG5vbi10ZXJtaW5hbCB2YWx1ZXMgdGhhdCBjYW4gYmVcbiAqIHB1Ymxpc2hlZCB0byBhIGR1cmFibGUgcHVibGlzaCBraXQgKHRlcm1pbmFsIHZhbHVlcyBzZW50IHRvIGZpbmlzaCBvciBmYWlsXG4gKiBtdXN0IGFsd2F5cyBiZSBkdXJhYmxlKS5cbiAqIC0gJ21hbmRhdG9yeScgbWVhbnMgdGhhdCBlYWNoIHZhbHVlIG11c3QgYmUgZHVyYWJsZSwgc28gaXQgY2FuIGJlIHJlc3RvcmVkXG4gKiAgIG9uIHVwZ3JhZGUuXG4gKiAtICdvcHBvcnR1bmlzdGljJyBtZWFucyB0aGF0IGEgZHVyYWJsZSB2YWx1ZSBpcyBwZXJzaXN0ZWQgZm9yIHBvc3QtdXBncmFkZVxuICogICByZXN0b3JhdGlvbiwgYnV0IGEgbm9uLWR1cmFibGUgdmFsdWUgaXMgc3RpbGwgYWNjZXB0ZWQgKGFuZCB3aWxsIHJlc3VsdCBpblxuICogICB2YWx1ZWxlc3MgcmVzdG9yYXRpb24pLlxuICogLSAnaWdub3JlZCcgbWVhbnMgdGhhdCBhIHZhbHVlIGlzIG5vdCBwZXJzaXN0ZWQgZm9yIHJlc3RvcmF0aW9uIGV2ZW4gaWYgaXRcbiAqICAgaXMgZHVyYWJsZS5cbiAqXG4gKiAnbWFuZGF0b3J5JyBpcyB0aGUgb25seSBjdXJyZW50bHktc3VwcG9ydGVkIHZhbHVlLCBhbmQgb3RoZXJzIG11c3Qgbm90IGJlXG4gKiBlbmFibGVkIHdpdGhvdXQgdGVzdCBjb3ZlcmFnZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IER1cmFibGVQdWJsaXNoS2l0U3RhdGVcbiAqXG4gKiBAcHJvcGVydHkge0R1cmFibGVQdWJsaXNoS2l0VmFsdWVEdXJhYmlsaXR5fSB2YWx1ZUR1cmFiaWxpdHlcbiAqXG4gKiBAcHJvcGVydHkge2JpZ2ludH0gcHVibGlzaENvdW50XG4gKlxuICogQHByb3BlcnR5IHsnbGl2ZScgfCAnZmluaXNoZWQnIHwgJ2ZhaWxlZCd9IHN0YXR1c1xuICpcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaGFzVmFsdWVcbiAqIGhhc1ZhbHVlIGluZGljYXRlcyB0aGUgcHJlc2VuY2Ugb2YgdmFsdWUuIEl0IHN0YXJ0cyBvZmYgZmFsc2UsXG4gKiBhbmQgY2FuIGJlIHJlc2V0IHRvIGZhbHNlIHdoZW4gYSBkdXJhYmxlIHB1Ymxpc2gga2l0IGlzIHJlc3RvcmVkIGFuZFxuICogdGhlIHByZXZpb3VzIHZhbHVlIHdhcyBub3QgZHVyYWJsZSwgb3Igbm9uLXRlcm1pbmFsIGFuZCB2YWx1ZUR1cmFibGl0eSBpcyAnaWdub3JlZCcuXG4gKlxuICogQHByb3BlcnR5IHthbnl9IHZhbHVlXG4gKiB2YWx1ZSBob2xkcyBlaXRoZXIgYSBub24tdGVybWluYWwgdmFsdWUgZnJvbSBgcHVibGlzaGAgb3IgYSB0ZXJtaW5hbCB2YWx1ZVxuICogZnJvbSBgZmluaXNoYCBvciBgZmFpbGAsIGRlcGVuZGluZyB1cG9uIHRoZSB2YWx1ZSBpbiBzdGF0dXMuXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBVcGRhdGVSZWNvcmQ8VD5cbiAqIEBwcm9wZXJ0eSB7VH0gdmFsdWUgaXMgd2hhdGV2ZXIgc3RhdGUgdGhlIHNlcnZpY2Ugd2FudHMgdG8gcHVibGlzaFxuICogQHByb3BlcnR5IHtiaWdpbnR9IFt1cGRhdGVDb3VudF0gaXMgYSB2YWx1ZSB0aGF0IGlkZW50aWZpZXMgdGhlIHVwZGF0ZS4gIEZvclxuICogdGhlIGxhc3QgdXBkYXRlLCBpdCBpcyBgdW5kZWZpbmVkYC5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7QmFzZU5vdGlmaWVyPFQ+fSBOb3RpZmllckludGVybmFscyBXaWxsIGJlIHNoYXJlZCBiZXR3ZWVuIG1hY2hpbmVzLFxuICogc28gaXQgbXVzdCBiZSBzYWZlIHRvIGV4cG9zZS4gQnV0IG90aGVyIHNvZnR3YXJlIHNob3VsZCBhdm9pZCBkZXBlbmRpbmcgb25cbiAqIGl0cyBpbnRlcm5hbCBzdHJ1Y3R1cmUuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge05vdGlmaWVySW50ZXJuYWxzPFQ+ICZcbiAqICAgRm9ya2FibGVBc3luY0l0ZXJhYmxlPFQsIFQ+ICZcbiAqICAgU2hhcmFibGVOb3RpZmllcjxUPlxuICogfSBOb3RpZmllcjxUPiBhbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBnZXQgdGhlIGN1cnJlbnQgc3RhdGUgb3IgdXBkYXRlc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNoYXJhYmxlTm90aWZpZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxOb3RpZmllckludGVybmFsczxUPj59IGdldFNoYXJhYmxlTm90aWZpZXJJbnRlcm5hbHNcbiAqIFVzZWQgdG8gcmVwbGljYXRlIHRoZSBtdWx0aWNhc3QgdmFsdWVzIGF0IG90aGVyIHNpdGVzLiBUbyBtYW51YWxseSBjcmVhdGUgYVxuICogbG9jYWwgcmVwcmVzZW50YXRpdmUgb2YgYSBOb3RpZmljYXRpb24sIGRvXG4gKiBgYGBqc1xuICogbG9jYWxJdGVyYWJsZSA9XG4gKiAgIG1ha2VOb3RpZmllcihFKHJlbW90ZUl0ZXJhYmxlKS5nZXRTaGFyYWJsZU5vdGlmaWVySW50ZXJuYWxzKCkpO1xuICogYGBgXG4gKiBUaGUgcmVzdWx0aW5nIGBsb2NhbEl0ZXJhYmxlYCBhbHNvIHN1cHBvcnRzIHN1Y2ggcmVtb3RlIHVzZSwgYW5kXG4gKiB3aWxsIHJldHVybiBhY2Nlc3MgdG8gdGhlIHNhbWUgcmVwcmVzZW50YXRpb24uXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gTm90aWZpZXJSZWNvcmQ8VD4gdGhlIHByb2R1Y2VkIG5vdGlmaWVyL3VwZGF0ZXIgcGFpclxuICogQHByb3BlcnR5IHtJdGVyYXRpb25PYnNlcnZlcjxUPn0gdXBkYXRlciB0aGUgKGNsb3NlbHktaGVsZCkgbm90aWZpZXIgcHJvZHVjZXJcbiAqIEBwcm9wZXJ0eSB7Tm90aWZpZXI8VD59IG5vdGlmaWVyIHRoZSAod2lkZWx5LWhlbGQpIG5vdGlmaWVyIGNvbnN1bWVyXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7Rm9ya2FibGVBc3luY0l0ZXJhYmxlPFQsIFQ+ICYgRWFjaFRvcGljPFQ+ICZcbiAqICAgU2hhcmFibGVTdWJzY3JpcHRpb248VD59IFN1YnNjcmlwdGlvbjxUPlxuICogQSBmb3JtIG9mIEFzeW5jSXRlcmFibGUgc3VwcG9ydGluZyBkaXN0cmlidXRlZCBhbmQgbXVsdGljYXN0IHVzYWdlLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNoYXJhYmxlU3Vic2NyaXB0aW9uXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8RWFjaFRvcGljPFQ+Pn0gZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHNcbiAqIFVzZWQgdG8gcmVwbGljYXRlIHRoZSBtdWx0aWNhc3QgdmFsdWVzIGF0IG90aGVyIHNpdGVzLiBUbyBtYW51YWxseSBjcmVhdGUgYVxuICogbG9jYWwgcmVwcmVzZW50YXRpdmUgb2YgYSBTdWJzY3JpcHRpb24sIGRvXG4gKiBgYGBqc1xuICogbG9jYWxJdGVyYWJsZSA9XG4gKiAgIG1ha2VTdWJzY3JpcHRpb24oRShyZW1vdGVJdGVyYWJsZSkuZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHMoKSk7XG4gKiBgYGBcbiAqIFRoZSByZXN1bHRpbmcgYGxvY2FsSXRlcmFibGVgIGFsc28gc3VwcG9ydHMgc3VjaCByZW1vdGUgdXNlLCBhbmRcbiAqIHdpbGwgcmV0dXJuIGFjY2VzcyB0byB0aGUgc2FtZSByZXByZXNlbnRhdGlvbi5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdWJzY3JpcHRpb25SZWNvcmQ8VD5cbiAqIEBwcm9wZXJ0eSB7SXRlcmF0aW9uT2JzZXJ2ZXI8VD59IHB1YmxpY2F0aW9uXG4gKiBAcHJvcGVydHkge1N1YnNjcmlwdGlvbjxUPn0gc3Vic2NyaXB0aW9uXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogQHR5cGVkZWYge1JldHVyblR5cGU8dHlwZW9mIFhpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5tYWtlTWFyc2hhbD59IE1hcnNoYWxsZXIgKi9cbi8qKiBAdHlwZWRlZiB7UGljazxNYXJzaGFsbGVyLCAndW5zZXJpYWxpemUnPn0gVW5zZXJpYWxpemVyICovXG5cbi8qKlxuICogRGVmaW5lZCBieSB2c3RvcmFnZVN0b3JlS2V5IGluIHZzdG9yYWdlLmdvXG4gKlxuICogQHR5cGVkZWYgVlN0b3JhZ2VLZXlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdG9yZU5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdG9yZVN1YmtleVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRhdGFQcmVmaXhCeXRlc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtub0RhdGFWYWx1ZV1cbiAqL1xuXG4vKipcbiAqIFRoaXMgcmVwcmVzZW50cyBhIG5vZGUgaW4gYW4gSUFWTCB0cmVlLlxuICpcbiAqIFRoZSBhY3RpdmUgaW1wbGVtZW50YXRpb24gaXMgeC92c3RvcmFnZSwgYW4gQWdvcmljIGV4dGVuc2lvbiBvZiB0aGUgQ29zbW9zIFNESy5cbiAqXG4gKiBWc3RvcmFnZSBpcyBhIGhpZXJhcmNoaWNhbCBleHRlcm5hbGx5LXJlYWNoYWJsZSBzdG9yYWdlIHN0cnVjdHVyZSB0aGF0XG4gKiBpZGVudGlmaWVzIGNoaWxkcmVuIGJ5IHJlc3RyaWN0ZWQgQVNDSUkgbmFtZSBhbmQgaXMgYXNzb2NpYXRlZCB3aXRoIGFyYml0cmFyeVxuICogc3RyaW5nLXZhbHVlZCBkYXRhIGZvciBlYWNoIG5vZGUsIGRlZmF1bHRpbmcgdG8gdGhlIGVtcHR5IHN0cmluZy5cbiAqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yYWdlTm9kZVxuICogQHByb3BlcnR5IHsoZGF0YTogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+fSBzZXRWYWx1ZSBwdWJsaXNoZXMgc29tZSBkYXRhIChhcHBlbmQgdG8gdGhlIG5vZGUpXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gZ2V0UGF0aCB0aGUgY2hhaW4gc3RvcmFnZSBwYXRoIGF0IHdoaWNoIHRoZSBub2RlIHdhcyBjb25zdHJ1Y3RlZFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPFZTdG9yYWdlS2V5Pn0gZ2V0U3RvcmVLZXkgREVQUkVDQVRFRCB1c2UgZ2V0UGF0aFxuICogQHByb3BlcnR5IHsoc3ViUGF0aDogc3RyaW5nLCBvcHRpb25zPzoge3NlcXVlbmNlPzogYm9vbGVhbn0pID0+IFN0b3JhZ2VOb2RlfSBtYWtlQ2hpbGROb2RlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yZWRGYWNldFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPHN0cmluZz59IGdldFBhdGggdGhlIGNoYWluIHN0b3JhZ2UgcGF0aCBhdCB3aGljaCB0aGUgbm9kZSB3YXMgY29uc3RydWN0ZWRcbiAqIEBwcm9wZXJ0eSB7U3RvcmFnZU5vZGVbJ2dldFN0b3JlS2V5J119IGdldFN0b3JlS2V5IERFUFJFQ0FURUQgdXNlIGdldFBhdGhcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gVW5zZXJpYWxpemVyfSBnZXRVbnNlcmlhbGl6ZXIgZ2V0IHRoZSB1bnNlcmlhbGl6ZXIgZm9yIHRoZSBzdG9yZWQgZGF0YVxuICovXG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIFN0b3JlZFN1YnNjcmliZXJcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7U3Vic2NyaXB0aW9uPFQ+ICYge1xuICogICBnZXRTdG9yZUtleTogKCkgPT4gUHJvbWlzZTxWU3RvcmFnZUtleSAmIHsgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb248VD4gfT4sXG4gKiAgIGdldFVuc2VyaWFsaXplcjogKCkgPT4gVW5zZXJpYWxpemVyLFxuICogfX0gU3RvcmVkU3Vic2NyaXB0aW9uXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1N1YnNjcmliZXI8VD4gJiBTdG9yZWRGYWNldH0gU3RvcmVkU3Vic2NyaWJlclxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANbWKjOVAQAAlQEAACAAAABAYWdvcmljL3N0b3JlLXYwLjguMy9leHBvcnRlZC5qc3siaW1wb3J0cyI6WyIuL3NyYy9wYXR0ZXJucy9pbnRlcm5hbC10eXBlcy5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXSxbXCIuL3NyYy9wYXR0ZXJucy9pbnRlcm5hbC10eXBlcy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAefS6mOgbAADoGwAAIQAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL2tleXMvY2hlY2tLZXkuanMiLCIuL2tleXMvY29tcGFyZUtleXMuanMiLCIuL2tleXMvY29weUJhZy5qcyIsIi4va2V5cy9jb3B5U2V0LmpzIiwiLi9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanMiLCIuL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcyIsIi4vbGVnYWN5L2xlZ2FjeU1hcC5qcyIsIi4vbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanMiLCIuL3BhdHRlcm5zL2V4by1tYWtlcnMuanMiLCIuL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qcyIsIi4vc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzIiwiLi9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanMiLCIuL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanMiLCIuL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanMiLCIuL3N0b3Jlcy9zdG9yZS11dGlscy5qcyJdLCJleHBvcnRzIjpbIk0iLCJhc3NlcnRLZXkiLCJhc3NlcnRQYXR0ZXJuIiwiYXNzZXJ0U2NhbGFyS2V5IiwiYmFnQ29tcGFyZSIsImJhZ0Rpc2pvaW50U3VidHJhY3QiLCJiYWdJbnRlcnNlY3Rpb24iLCJiYWdJc1N1cGVyYmFnIiwiYmFnVW5pb24iLCJjb2VyY2VUb0JhZ0VudHJpZXMiLCJjb2VyY2VUb0VsZW1lbnRzIiwiY29tcGFyZUtleXMiLCJkZWZpbmVFeG9DbGFzcyIsImRlZmluZUV4b0NsYXNzS2l0IiwiZWxlbWVudHNDb21wYXJlIiwiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0IiwiZWxlbWVudHNEaXNqb2ludFVuaW9uIiwiZWxlbWVudHNJbnRlcnNlY3Rpb24iLCJlbGVtZW50c0lzRGlzam9pbnQiLCJlbGVtZW50c0lzU3VwZXJzZXQiLCJlbGVtZW50c1VuaW9uIiwiZ2V0Q29weUJhZ0VudHJpZXMiLCJnZXRDb3B5TWFwRW50cmllcyIsImdldENvcHlTZXRLZXlzIiwiZ2V0UmFua0NvdmVyIiwiaW5pdEVtcHR5IiwiaXNLZXkiLCJpc1BhdHRlcm4iLCJrZXlFUSIsImtleUdUIiwia2V5R1RFIiwia2V5TFQiLCJrZXlMVEUiLCJtYWtlQ29weUJhZyIsIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIiwibWFrZUNvcHlNYXAiLCJtYWtlQ29weVNldCIsIm1ha2VFeG8iLCJtYWtlTGVnYWN5TWFwIiwibWFrZUxlZ2FjeVdlYWtNYXAiLCJtYWtlU2NhbGFyTWFwU3RvcmUiLCJtYWtlU2NhbGFyU2V0U3RvcmUiLCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhcldlYWtTZXRTdG9yZSIsIm1hdGNoZXMiLCJtdXN0TWF0Y2giLCJwcm92aWRlTGF6eSIsInNldENvbXBhcmUiLCJzZXREaXNqb2ludFN1YnRyYWN0Iiwic2V0RGlzam9pbnRVbmlvbiIsInNldEludGVyc2VjdGlvbiIsInNldElzRGlzam9pbnQiLCJzZXRJc1N1cGVyc2V0Iiwic2V0VW5pb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL2tleXMvY2hlY2tLZXkuanNcIiwgW1tcImlzS2V5XCIsIFskaOKAjV9saXZlW1wiaXNLZXlcIl1dXSxbXCJhc3NlcnRLZXlcIiwgWyRo4oCNX2xpdmVbXCJhc3NlcnRLZXlcIl1dXSxbXCJhc3NlcnRTY2FsYXJLZXlcIiwgWyRo4oCNX2xpdmVbXCJhc3NlcnRTY2FsYXJLZXlcIl1dXSxbXCJtYWtlQ29weVNldFwiLCBbJGjigI1fbGl2ZVtcIm1ha2VDb3B5U2V0XCJdXV0sW1wiZ2V0Q29weVNldEtleXNcIiwgWyRo4oCNX2xpdmVbXCJnZXRDb3B5U2V0S2V5c1wiXV1dLFtcIm1ha2VDb3B5QmFnXCIsIFskaOKAjV9saXZlW1wibWFrZUNvcHlCYWdcIl1dXSxbXCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50c1wiLCBbJGjigI1fbGl2ZVtcIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzXCJdXV0sW1wiZ2V0Q29weUJhZ0VudHJpZXNcIiwgWyRo4oCNX2xpdmVbXCJnZXRDb3B5QmFnRW50cmllc1wiXV1dLFtcIm1ha2VDb3B5TWFwXCIsIFskaOKAjV9saXZlW1wibWFrZUNvcHlNYXBcIl1dXSxbXCJnZXRDb3B5TWFwRW50cmllc1wiLCBbJGjigI1fbGl2ZVtcImdldENvcHlNYXBFbnRyaWVzXCJdXV1dXSxbXCIuL2tleXMvY29weVNldC5qc1wiLCBbW1wiY29lcmNlVG9FbGVtZW50c1wiLCBbJGjigI1fbGl2ZVtcImNvZXJjZVRvRWxlbWVudHNcIl1dXV1dLFtcIi4va2V5cy9jb3B5QmFnLmpzXCIsIFtbXCJjb2VyY2VUb0JhZ0VudHJpZXNcIiwgWyRo4oCNX2xpdmVbXCJjb2VyY2VUb0JhZ0VudHJpZXNcIl1dXV1dLFtcIi4va2V5cy9jb21wYXJlS2V5cy5qc1wiLCBbW1wiY29tcGFyZUtleXNcIiwgWyRo4oCNX2xpdmVbXCJjb21wYXJlS2V5c1wiXV1dLFtcImtleUxUXCIsIFskaOKAjV9saXZlW1wia2V5TFRcIl1dXSxbXCJrZXlMVEVcIiwgWyRo4oCNX2xpdmVbXCJrZXlMVEVcIl1dXSxbXCJrZXlFUVwiLCBbJGjigI1fbGl2ZVtcImtleUVRXCJdXV0sW1wia2V5R1RFXCIsIFskaOKAjV9saXZlW1wia2V5R1RFXCJdXV0sW1wia2V5R1RcIiwgWyRo4oCNX2xpdmVbXCJrZXlHVFwiXV1dXV0sW1wiLi9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanNcIiwgW1tcImVsZW1lbnRzSXNTdXBlcnNldFwiLCBbJGjigI1fbGl2ZVtcImVsZW1lbnRzSXNTdXBlcnNldFwiXV1dLFtcImVsZW1lbnRzSXNEaXNqb2ludFwiLCBbJGjigI1fbGl2ZVtcImVsZW1lbnRzSXNEaXNqb2ludFwiXV1dLFtcImVsZW1lbnRzQ29tcGFyZVwiLCBbJGjigI1fbGl2ZVtcImVsZW1lbnRzQ29tcGFyZVwiXV1dLFtcImVsZW1lbnRzVW5pb25cIiwgWyRo4oCNX2xpdmVbXCJlbGVtZW50c1VuaW9uXCJdXV0sW1wiZWxlbWVudHNEaXNqb2ludFVuaW9uXCIsIFskaOKAjV9saXZlW1wiZWxlbWVudHNEaXNqb2ludFVuaW9uXCJdXV0sW1wiZWxlbWVudHNJbnRlcnNlY3Rpb25cIiwgWyRo4oCNX2xpdmVbXCJlbGVtZW50c0ludGVyc2VjdGlvblwiXV1dLFtcImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdFwiLCBbJGjigI1fbGl2ZVtcImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdFwiXV1dLFtcInNldElzU3VwZXJzZXRcIiwgWyRo4oCNX2xpdmVbXCJzZXRJc1N1cGVyc2V0XCJdXV0sW1wic2V0SXNEaXNqb2ludFwiLCBbJGjigI1fbGl2ZVtcInNldElzRGlzam9pbnRcIl1dXSxbXCJzZXRDb21wYXJlXCIsIFskaOKAjV9saXZlW1wic2V0Q29tcGFyZVwiXV1dLFtcInNldFVuaW9uXCIsIFskaOKAjV9saXZlW1wic2V0VW5pb25cIl1dXSxbXCJzZXREaXNqb2ludFVuaW9uXCIsIFskaOKAjV9saXZlW1wic2V0RGlzam9pbnRVbmlvblwiXV1dLFtcInNldEludGVyc2VjdGlvblwiLCBbJGjigI1fbGl2ZVtcInNldEludGVyc2VjdGlvblwiXV1dLFtcInNldERpc2pvaW50U3VidHJhY3RcIiwgWyRo4oCNX2xpdmVbXCJzZXREaXNqb2ludFN1YnRyYWN0XCJdXV1dXSxbXCIuL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc1wiLCBbW1wiYmFnSXNTdXBlcmJhZ1wiLCBbJGjigI1fbGl2ZVtcImJhZ0lzU3VwZXJiYWdcIl1dXSxbXCJiYWdDb21wYXJlXCIsIFskaOKAjV9saXZlW1wiYmFnQ29tcGFyZVwiXV1dLFtcImJhZ1VuaW9uXCIsIFskaOKAjV9saXZlW1wiYmFnVW5pb25cIl1dXSxbXCJiYWdJbnRlcnNlY3Rpb25cIiwgWyRo4oCNX2xpdmVbXCJiYWdJbnRlcnNlY3Rpb25cIl1dXSxbXCJiYWdEaXNqb2ludFN1YnRyYWN0XCIsIFskaOKAjV9saXZlW1wiYmFnRGlzam9pbnRTdWJ0cmFjdFwiXV1dXV0sW1wiLi9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanNcIiwgW1tcIk1cIiwgWyRo4oCNX2xpdmVbXCJNXCJdXV0sW1wiZ2V0UmFua0NvdmVyXCIsIFskaOKAjV9saXZlW1wiZ2V0UmFua0NvdmVyXCJdXV0sW1wiaXNQYXR0ZXJuXCIsIFskaOKAjV9saXZlW1wiaXNQYXR0ZXJuXCJdXV0sW1wiYXNzZXJ0UGF0dGVyblwiLCBbJGjigI1fbGl2ZVtcImFzc2VydFBhdHRlcm5cIl1dXSxbXCJtYXRjaGVzXCIsIFskaOKAjV9saXZlW1wibWF0Y2hlc1wiXV1dLFtcIm11c3RNYXRjaFwiLCBbJGjigI1fbGl2ZVtcIm11c3RNYXRjaFwiXV1dXV0sW1wiLi9wYXR0ZXJucy9leG8tbWFrZXJzLmpzXCIsIFtbXCJpbml0RW1wdHlcIiwgWyRo4oCNX2xpdmVbXCJpbml0RW1wdHlcIl1dXSxbXCJkZWZpbmVFeG9DbGFzc1wiLCBbJGjigI1fbGl2ZVtcImRlZmluZUV4b0NsYXNzXCJdXV0sW1wiZGVmaW5lRXhvQ2xhc3NLaXRcIiwgWyRo4oCNX2xpdmVbXCJkZWZpbmVFeG9DbGFzc0tpdFwiXV1dLFtcIm1ha2VFeG9cIiwgWyRo4oCNX2xpdmVbXCJtYWtlRXhvXCJdXV1dXSxbXCIuL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanNcIiwgW1tcIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmVcIiwgWyRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlXCJdXV1dXSxbXCIuL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qc1wiLCBbW1wibWFrZVNjYWxhclNldFN0b3JlXCIsIFskaOKAjV9saXZlW1wibWFrZVNjYWxhclNldFN0b3JlXCJdXV1dXSxbXCIuL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanNcIiwgW1tcIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmVcIiwgWyRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlXCJdXV1dXSxbXCIuL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qc1wiLCBbW1wibWFrZVNjYWxhck1hcFN0b3JlXCIsIFskaOKAjV9saXZlW1wibWFrZVNjYWxhck1hcFN0b3JlXCJdXV1dXSxbXCIuL3N0b3Jlcy9zdG9yZS11dGlscy5qc1wiLCBbW1wicHJvdmlkZUxhenlcIiwgWyRo4oCNX2xpdmVbXCJwcm92aWRlTGF6eVwiXV1dXV0sW1wiLi9sZWdhY3kvbGVnYWN5TWFwLmpzXCIsIFtbXCJtYWtlTGVnYWN5TWFwXCIsIFskaOKAjV9saXZlW1wibWFrZUxlZ2FjeU1hcFwiXV1dXV0sW1wiLi9sZWdhY3kvbGVnYWN5V2Vha01hcC5qc1wiLCBbW1wibWFrZUxlZ2FjeVdlYWtNYXBcIiwgWyRo4oCNX2xpdmVbXCJtYWtlTGVnYWN5V2Vha01hcFwiXV1dXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6eyJpc0tleSI6WyJpc0tleSIsZmFsc2VdLCJhc3NlcnRLZXkiOlsiYXNzZXJ0S2V5IixmYWxzZV0sImFzc2VydFNjYWxhcktleSI6WyJhc3NlcnRTY2FsYXJLZXkiLGZhbHNlXSwibWFrZUNvcHlTZXQiOlsibWFrZUNvcHlTZXQiLGZhbHNlXSwiZ2V0Q29weVNldEtleXMiOlsiZ2V0Q29weVNldEtleXMiLGZhbHNlXSwibWFrZUNvcHlCYWciOlsibWFrZUNvcHlCYWciLGZhbHNlXSwibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiOlsibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiLGZhbHNlXSwiZ2V0Q29weUJhZ0VudHJpZXMiOlsiZ2V0Q29weUJhZ0VudHJpZXMiLGZhbHNlXSwibWFrZUNvcHlNYXAiOlsibWFrZUNvcHlNYXAiLGZhbHNlXSwiZ2V0Q29weU1hcEVudHJpZXMiOlsiZ2V0Q29weU1hcEVudHJpZXMiLGZhbHNlXSwiY29lcmNlVG9FbGVtZW50cyI6WyJjb2VyY2VUb0VsZW1lbnRzIixmYWxzZV0sImNvZXJjZVRvQmFnRW50cmllcyI6WyJjb2VyY2VUb0JhZ0VudHJpZXMiLGZhbHNlXSwiY29tcGFyZUtleXMiOlsiY29tcGFyZUtleXMiLGZhbHNlXSwia2V5TFQiOlsia2V5TFQiLGZhbHNlXSwia2V5TFRFIjpbImtleUxURSIsZmFsc2VdLCJrZXlFUSI6WyJrZXlFUSIsZmFsc2VdLCJrZXlHVEUiOlsia2V5R1RFIixmYWxzZV0sImtleUdUIjpbImtleUdUIixmYWxzZV0sImVsZW1lbnRzSXNTdXBlcnNldCI6WyJlbGVtZW50c0lzU3VwZXJzZXQiLGZhbHNlXSwiZWxlbWVudHNJc0Rpc2pvaW50IjpbImVsZW1lbnRzSXNEaXNqb2ludCIsZmFsc2VdLCJlbGVtZW50c0NvbXBhcmUiOlsiZWxlbWVudHNDb21wYXJlIixmYWxzZV0sImVsZW1lbnRzVW5pb24iOlsiZWxlbWVudHNVbmlvbiIsZmFsc2VdLCJlbGVtZW50c0Rpc2pvaW50VW5pb24iOlsiZWxlbWVudHNEaXNqb2ludFVuaW9uIixmYWxzZV0sImVsZW1lbnRzSW50ZXJzZWN0aW9uIjpbImVsZW1lbnRzSW50ZXJzZWN0aW9uIixmYWxzZV0sImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCI6WyJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiLGZhbHNlXSwic2V0SXNTdXBlcnNldCI6WyJzZXRJc1N1cGVyc2V0IixmYWxzZV0sInNldElzRGlzam9pbnQiOlsic2V0SXNEaXNqb2ludCIsZmFsc2VdLCJzZXRDb21wYXJlIjpbInNldENvbXBhcmUiLGZhbHNlXSwic2V0VW5pb24iOlsic2V0VW5pb24iLGZhbHNlXSwic2V0RGlzam9pbnRVbmlvbiI6WyJzZXREaXNqb2ludFVuaW9uIixmYWxzZV0sInNldEludGVyc2VjdGlvbiI6WyJzZXRJbnRlcnNlY3Rpb24iLGZhbHNlXSwic2V0RGlzam9pbnRTdWJ0cmFjdCI6WyJzZXREaXNqb2ludFN1YnRyYWN0IixmYWxzZV0sImJhZ0lzU3VwZXJiYWciOlsiYmFnSXNTdXBlcmJhZyIsZmFsc2VdLCJiYWdDb21wYXJlIjpbImJhZ0NvbXBhcmUiLGZhbHNlXSwiYmFnVW5pb24iOlsiYmFnVW5pb24iLGZhbHNlXSwiYmFnSW50ZXJzZWN0aW9uIjpbImJhZ0ludGVyc2VjdGlvbiIsZmFsc2VdLCJiYWdEaXNqb2ludFN1YnRyYWN0IjpbImJhZ0Rpc2pvaW50U3VidHJhY3QiLGZhbHNlXSwiTSI6WyJNIixmYWxzZV0sImdldFJhbmtDb3ZlciI6WyJnZXRSYW5rQ292ZXIiLGZhbHNlXSwiaXNQYXR0ZXJuIjpbImlzUGF0dGVybiIsZmFsc2VdLCJhc3NlcnRQYXR0ZXJuIjpbImFzc2VydFBhdHRlcm4iLGZhbHNlXSwibWF0Y2hlcyI6WyJtYXRjaGVzIixmYWxzZV0sIm11c3RNYXRjaCI6WyJtdXN0TWF0Y2giLGZhbHNlXSwiaW5pdEVtcHR5IjpbImluaXRFbXB0eSIsZmFsc2VdLCJkZWZpbmVFeG9DbGFzcyI6WyJkZWZpbmVFeG9DbGFzcyIsZmFsc2VdLCJkZWZpbmVFeG9DbGFzc0tpdCI6WyJkZWZpbmVFeG9DbGFzc0tpdCIsZmFsc2VdLCJtYWtlRXhvIjpbIm1ha2VFeG8iLGZhbHNlXSwibWFrZVNjYWxhcldlYWtTZXRTdG9yZSI6WyJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIixmYWxzZV0sIm1ha2VTY2FsYXJTZXRTdG9yZSI6WyJtYWtlU2NhbGFyU2V0U3RvcmUiLGZhbHNlXSwibWFrZVNjYWxhcldlYWtNYXBTdG9yZSI6WyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIixmYWxzZV0sIm1ha2VTY2FsYXJNYXBTdG9yZSI6WyJtYWtlU2NhbGFyTWFwU3RvcmUiLGZhbHNlXSwicHJvdmlkZUxhenkiOlsicHJvdmlkZUxhenkiLGZhbHNlXSwibWFrZUxlZ2FjeU1hcCI6WyJtYWtlTGVnYWN5TWFwIixmYWxzZV0sIm1ha2VMZWdhY3lXZWFrTWFwIjpbIm1ha2VMZWdhY3lXZWFrTWFwIixmYWxzZV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEfz4Op7RAAAe0QAACkAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMva2V5cy9jaGVja0tleS5qc3siaW1wb3J0cyI6WyIuL2NvcHlCYWcuanMiLCIuL2NvcHlTZXQuanMiLCJAYWdvcmljL2Fzc2VydCIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9tYXJzaGFsL3NyYy9yYW5rT3JkZXIuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRDb3B5QmFnIiwiYXNzZXJ0Q29weU1hcCIsImFzc2VydENvcHlTZXQiLCJhc3NlcnRLZXkiLCJhc3NlcnRQcmltaXRpdmVLZXkiLCJhc3NlcnRTY2FsYXJLZXkiLCJjaGVja0NvcHlCYWciLCJjaGVja0NvcHlNYXAiLCJjaGVja0NvcHlTZXQiLCJjaGVja0tleSIsImNoZWNrU2NhbGFyS2V5IiwiY29weU1hcEtleVNldCIsImV2ZXJ5Q29weUJhZ0VudHJ5IiwiZXZlcnlDb3B5TWFwS2V5IiwiZXZlcnlDb3B5TWFwVmFsdWUiLCJldmVyeUNvcHlTZXRLZXkiLCJnZXRDb3B5QmFnRW50cmllcyIsImdldENvcHlNYXBFbnRyaWVzIiwiZ2V0Q29weU1hcEtleXMiLCJnZXRDb3B5TWFwVmFsdWVzIiwiZ2V0Q29weVNldEtleXMiLCJpc0NvcHlCYWciLCJpc0NvcHlNYXAiLCJpc0NvcHlTZXQiLCJpc0tleSIsImlzUHJpbWl0aXZlS2V5IiwiaXNTY2FsYXJLZXkiLCJtYWtlQ29weUJhZyIsIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIiwibWFrZUNvcHlNYXAiLCJtYWtlQ29weVNldCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLGFzc2VydFBhc3NhYmxlLEZhcixnZXRUYWcsaXNPYmplY3QsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZixpZGVudENoZWNrZXIsY29tcGFyZUFudGlSYW5rLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbmssY2hlY2tFbGVtZW50cyxtYWtlU2V0T2ZFbGVtZW50cyxjaGVja0JhZ0VudHJpZXMsbWFrZUJhZ09mRW50cmllczskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaOKAjV9hKV1dLFtcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXSxbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcImlkZW50Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoaWRlbnRDaGVja2VyID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWwvc3JjL3JhbmtPcmRlci5qc1wiLCBbW1wiY29tcGFyZUFudGlSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaOKAjV9hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsIFskaOKAjV9hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRo4oCNX2EpXV0sW1wic29ydEJ5UmFua1wiLCBbJGjigI1fYSA9PiAoc29ydEJ5UmFuayA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvcHlTZXQuanNcIiwgW1tcImNoZWNrRWxlbWVudHNcIiwgWyRo4oCNX2EgPT4gKGNoZWNrRWxlbWVudHMgPSAkaOKAjV9hKV1dLFtcIm1ha2VTZXRPZkVsZW1lbnRzXCIsIFskaOKAjV9hID0+IChtYWtlU2V0T2ZFbGVtZW50cyA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvcHlCYWcuanNcIiwgW1tcImNoZWNrQmFnRW50cmllc1wiLCBbJGjigI1fYSA9PiAoY2hlY2tCYWdFbnRyaWVzID0gJGjigI1fYSldXSxbXCJtYWtlQmFnT2ZFbnRyaWVzXCIsIFskaOKAjV9hID0+IChtYWtlQmFnT2ZFbnRyaWVzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnEsRmFpbH09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vIFByaW1pdGl2ZSBhbmQgU2NhbGFyIGtleXMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrUHJpbWl0aXZlS2V5PSh2YWwsY2hlY2spPT57XG5pZihpc09iamVjdCh2YWwpKXtcbnJldHVybihcbmNoZWNrIT09aWRlbnRDaGVja2VyJiZcbmNoZWNrKGZhbHNlLFggYEEgJHtxKHR5cGVvZiB2YWwpfSBjYW5ub3QgYmUgYSBwcmltaXRpdmU6ICR7dmFsfWApKTtcblxuIH1cbi8qIFRPRE8gVGhlcmUgaXMgbm90IHlldCBhIGNoZWNrUGFzc2FibGUsIGJ1dCBwZXJoYXBzIHRoZXJlIHNob3VsZCBiZS4qL1xuLyogSWYgdGhhdCBoYXBwZW5zLCB3ZSBzaG91bGQgY2FsbCBpdCBoZXJlIGluc3RlYWQuKi9cbmFzc2VydFBhc3NhYmxlKHZhbCk7XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBpc1ByaW1pdGl2ZUtleT0odmFsKT0+Y2hlY2tQcmltaXRpdmVLZXkodmFsLGlkZW50Q2hlY2tlcik7JGjigI1fb25jZS5pc1ByaW1pdGl2ZUtleShpc1ByaW1pdGl2ZUtleSk7XG5oYXJkZW4oaXNQcmltaXRpdmVLZXkpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRQcmltaXRpdmVLZXk9KHZhbCk9PntcbmNoZWNrUHJpbWl0aXZlS2V5KHZhbCxhc3NlcnRDaGVja2VyKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0UHJpbWl0aXZlS2V5KGFzc2VydFByaW1pdGl2ZUtleSk7XG5oYXJkZW4oYXNzZXJ0UHJpbWl0aXZlS2V5KTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgY2hlY2tTY2FsYXJLZXk9KHZhbCxjaGVjayk9PntcbmlmKGlzUHJpbWl0aXZlS2V5KHZhbCkpe1xucmV0dXJuIHRydWU7XG4gfVxuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHZhbCk7XG5pZihwYXNzU3R5bGU9PT0ncmVtb3RhYmxlJyl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgQSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIGEgc2NhbGFyIGtleTogJHt2YWx9YCk7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjigI1fb25jZS5jaGVja1NjYWxhcktleShjaGVja1NjYWxhcktleSk7XG5jb25zdCAgICAgICAgaXNTY2FsYXJLZXk9KHZhbCk9PmNoZWNrU2NhbGFyS2V5KHZhbCxpZGVudENoZWNrZXIpOyRo4oCNX29uY2UuaXNTY2FsYXJLZXkoaXNTY2FsYXJLZXkpO1xuaGFyZGVuKGlzU2NhbGFyS2V5KTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0U2NhbGFyS2V5PSh2YWwpPT57XG5jaGVja1NjYWxhcktleSh2YWwsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydFNjYWxhcktleShhc3NlcnRTY2FsYXJLZXkpO1xuaGFyZGVuKGFzc2VydFNjYWxhcktleSk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBLZXlzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEB0eXBlIHtXZWFrU2V0PEtleT59ICovXG5jb25zdCBrZXlNZW1vPW5ldyBXZWFrU2V0KCk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGNoZWNrS2V5PSh2YWwsY2hlY2spPT57XG5pZighaXNPYmplY3QodmFsKSl7XG4vKiBUT0RPIFRoZXJlIGlzIG5vdCB5ZXQgYSBjaGVja1Bhc3NhYmxlLCBidXQgcGVyaGFwcyB0aGVyZSBzaG91bGQgYmUuKi9cbi8qIElmIHRoYXQgaGFwcGVucywgd2Ugc2hvdWxkIGNhbGwgaXQgaGVyZSBpbnN0ZWFkLiovXG5hc3NlcnRQYXNzYWJsZSh2YWwpO1xucmV0dXJuIHRydWU7XG4gfVxuaWYoa2V5TWVtby5oYXModmFsKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuY29uc3QgcmVzdWx0PWNoZWNrS2V5SW50ZXJuYWwodmFsLGNoZWNrKTtcbmlmKHJlc3VsdCl7XG4vKiBEb24ndCBjYWNoZSB0aGUgdW5kZWZpbmVkIGNhc2VzLCBzbyB0aGF0IGlmIGl0IGlzIHRyaWVkIGFnYWluKi9cbi8qIHdpdGggYGFzc2VydENoZWNrZXJgIGl0J2xsIHRocm93IGEgZGlhZ25vc3RpYyBhZ2FpbiovXG5rZXlNZW1vLmFkZCh2YWwpO1xuIH1cbi8qIE5vdGUgdGhhdCB3ZSBkbyBub3QgbWVtb2l6ZSBhIG5lZ2F0aXZlIGp1ZGdlbWVudCwgc28gdGhhdCBpZiBpdCBpcyB0cmllZCovXG4vKiBhZ2FpbiB3aXRoIGEgY2hlY2tlciwgaXQgd2lsbCBzdGlsbCBwcm9kdWNlIGEgdXNlZnVsIGRpYWdub3N0aWMuKi9cbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLmNoZWNrS2V5KGNoZWNrS2V5KTtcbmhhcmRlbihjaGVja0tleSk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGlzS2V5PSh2YWwpPT5jaGVja0tleSh2YWwsaWRlbnRDaGVja2VyKTskaOKAjV9vbmNlLmlzS2V5KGlzS2V5KTtcbmhhcmRlbihpc0tleSk7XG5cbi8qKlxuICogQHBhcmFtIHtLZXl9IHZhbFxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0S2V5PSh2YWwpPT57XG5jaGVja0tleSh2YWwsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydEtleShhc3NlcnRLZXkpO1xuaGFyZGVuKGFzc2VydEtleSk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gQ29weVNldCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyogTW92ZWQgdG8gaGVyZSBzbyB0aGV5IGNhbiBjaGVjayB0aGF0IHRoZSBjb3B5U2V0IGNvbnRhaW5zIG9ubHkga2V5cyovXG4vKiB3aXRob3V0IGNyZWF0aW5nIGFuIGltcG9ydCBjeWNsZS4qL1xuXG4vKiogQHR5cGUgV2Vha1NldDxDb3B5U2V0PEtleT4+ICovXG5jb25zdCBjb3B5U2V0TWVtbz1uZXcgV2Vha1NldCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgY2hlY2tDb3B5U2V0PShzLGNoZWNrKT0+e1xuaWYoY29weVNldE1lbW8uaGFzKHMpKXtcbnJldHVybiB0cnVlO1xuIH1cbmNvbnN0IHJlc3VsdD1cbihwYXNzU3R5bGVPZihzKT09PSd0YWdnZWQnJiZnZXRUYWcocyk9PT0nY29weVNldCd8fFxuY2hlY2soZmFsc2UsWCBgTm90IGEgY29weVNldDogJHtzfWApKSYmXG5jaGVja0VsZW1lbnRzKHMucGF5bG9hZCxjaGVjaykmJlxuY2hlY2tLZXkocy5wYXlsb2FkLGNoZWNrKTtcbmlmKHJlc3VsdCl7XG5jb3B5U2V0TWVtby5hZGQocyk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UuY2hlY2tDb3B5U2V0KGNoZWNrQ29weVNldCk7XG5oYXJkZW4oY2hlY2tDb3B5U2V0KTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgSXNDb3B5U2V0XG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzXG4gKiBAcmV0dXJucyB7cyBpcyBDb3B5U2V0PEtleT59XG4gKi9cblxuLyoqIEB0eXBlIHtJc0NvcHlTZXR9ICovXG5jb25zdCAgICAgICAgaXNDb3B5U2V0PShzKT0+Y2hlY2tDb3B5U2V0KHMsaWRlbnRDaGVja2VyKTskaOKAjV9vbmNlLmlzQ29weVNldChpc0NvcHlTZXQpO1xuaGFyZGVuKGlzQ29weVNldCk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydENvcHlTZXRcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNcbiAqIEByZXR1cm5zIHthc3NlcnRzIHMgaXMgQ29weVNldDxLZXk+fVxuICovXG5cbi8qKiBAdHlwZSB7QXNzZXJ0Q29weVNldH0gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRDb3B5U2V0PShzKT0+e1xuY2hlY2tDb3B5U2V0KHMsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydENvcHlTZXQoYXNzZXJ0Q29weVNldCk7XG5oYXJkZW4oYXNzZXJ0Q29weVNldCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7Q29weVNldDxLPn0gc1xuICogQHJldHVybnMge0tbXX1cbiAqL1xuY29uc3QgICAgICAgIGdldENvcHlTZXRLZXlzPShzKT0+e1xuYXNzZXJ0Q29weVNldChzKTtcbnJldHVybiBzLnBheWxvYWQ7XG4gfTskaOKAjV9vbmNlLmdldENvcHlTZXRLZXlzKGdldENvcHlTZXRLZXlzKTtcbmhhcmRlbihnZXRDb3B5U2V0S2V5cyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7Q29weVNldDxLPn0gc1xuICogQHBhcmFtIHsoa2V5OiBLLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFufSBmblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBldmVyeUNvcHlTZXRLZXk9KHMsZm4pPT5cbmdldENvcHlTZXRLZXlzKHMpLmV2ZXJ5KChrZXksaW5kZXgpPT5mbihrZXksaW5kZXgpKTskaOKAjV9vbmNlLmV2ZXJ5Q29weVNldEtleShldmVyeUNvcHlTZXRLZXkpO1xuaGFyZGVuKGV2ZXJ5Q29weVNldEtleSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8Sz59IGVsZW1lbnRJdGVyXG4gKiBAcmV0dXJucyB7Q29weVNldDxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VDb3B5U2V0PShlbGVtZW50SXRlcik9PntcbmNvbnN0IHJlc3VsdD1tYWtlU2V0T2ZFbGVtZW50cyhlbGVtZW50SXRlcik7XG5hc3NlcnRDb3B5U2V0KHJlc3VsdCk7XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS5tYWtlQ29weVNldChtYWtlQ29weVNldCk7XG5oYXJkZW4obWFrZUNvcHlTZXQpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIENvcHlCYWcgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qIE1vdmVkIHRvIGhlcmUgc28gdGhleSBjYW4gY2hlY2sgdGhhdCB0aGUgY29weUJhZyBjb250YWlucyBvbmx5IGtleXMqL1xuLyogd2l0aG91dCBjcmVhdGluZyBhbiBpbXBvcnQgY3ljbGUuKi9cblxuLyoqIEB0eXBlIFdlYWtTZXQ8Q29weUJhZzxLZXk+PiAqL1xuY29uc3QgY29weUJhZ01lbW89bmV3IFdlYWtTZXQoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBiXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGNoZWNrQ29weUJhZz0oYixjaGVjayk9PntcbmlmKGNvcHlCYWdNZW1vLmhhcyhiKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5jb25zdCByZXN1bHQ9XG4ocGFzc1N0eWxlT2YoYik9PT0ndGFnZ2VkJyYmZ2V0VGFnKGIpPT09J2NvcHlCYWcnfHxcbmNoZWNrKGZhbHNlLFggYE5vdCBhIGNvcHlCYWc6ICR7Yn1gKSkmJlxuY2hlY2tCYWdFbnRyaWVzKGIucGF5bG9hZCxjaGVjaykmJlxuY2hlY2tLZXkoYi5wYXlsb2FkLGNoZWNrKTtcbmlmKHJlc3VsdCl7XG5jb3B5QmFnTWVtby5hZGQoYik7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UuY2hlY2tDb3B5QmFnKGNoZWNrQ29weUJhZyk7XG5oYXJkZW4oY2hlY2tDb3B5QmFnKTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgSXNDb3B5QmFnXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBiXG4gKiBAcmV0dXJucyB7YiBpcyBDb3B5QmFnPEtleT59XG4gKi9cblxuLyoqIEB0eXBlIHtJc0NvcHlCYWd9ICovXG5jb25zdCAgICAgICAgaXNDb3B5QmFnPShiKT0+Y2hlY2tDb3B5QmFnKGIsaWRlbnRDaGVja2VyKTskaOKAjV9vbmNlLmlzQ29weUJhZyhpc0NvcHlCYWcpO1xuaGFyZGVuKGlzQ29weUJhZyk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydENvcHlCYWdcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGJcbiAqIEByZXR1cm5zIHthc3NlcnRzIGIgaXMgQ29weUJhZzxLZXk+fVxuICovXG5cbi8qKiBAdHlwZSB7QXNzZXJ0Q29weUJhZ30gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRDb3B5QmFnPShiKT0+e1xuY2hlY2tDb3B5QmFnKGIsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydENvcHlCYWcoYXNzZXJ0Q29weUJhZyk7XG5oYXJkZW4oYXNzZXJ0Q29weUJhZyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7Q29weUJhZzxLPn0gYlxuICogQHJldHVybnMge0NvcHlCYWc8Sz5bJ3BheWxvYWQnXX1cbiAqL1xuY29uc3QgICAgICAgIGdldENvcHlCYWdFbnRyaWVzPShiKT0+e1xuYXNzZXJ0Q29weUJhZyhiKTtcbnJldHVybiBiLnBheWxvYWQ7XG4gfTskaOKAjV9vbmNlLmdldENvcHlCYWdFbnRyaWVzKGdldENvcHlCYWdFbnRyaWVzKTtcbmhhcmRlbihnZXRDb3B5QmFnRW50cmllcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7Q29weUJhZzxLPn0gYlxuICogQHBhcmFtIHsoZW50cnk6IFtLLCBiaWdpbnRdLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFufSBmblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBldmVyeUNvcHlCYWdFbnRyeT0oYixmbik9PlxuZ2V0Q29weUJhZ0VudHJpZXMoYikuZXZlcnkoKGVudHJ5LGluZGV4KT0+Zm4oZW50cnksaW5kZXgpKTskaOKAjV9vbmNlLmV2ZXJ5Q29weUJhZ0VudHJ5KGV2ZXJ5Q29weUJhZ0VudHJ5KTtcbmhhcmRlbihldmVyeUNvcHlCYWdFbnRyeSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8W0ssYmlnaW50XT59IGJhZ0VudHJ5SXRlclxuICogQHJldHVybnMge0NvcHlCYWc8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQ29weUJhZz0oYmFnRW50cnlJdGVyKT0+e1xuY29uc3QgcmVzdWx0PW1ha2VCYWdPZkVudHJpZXMoYmFnRW50cnlJdGVyKTtcbmFzc2VydENvcHlCYWcocmVzdWx0KTtcbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLm1ha2VDb3B5QmFnKG1ha2VDb3B5QmFnKTtcbmhhcmRlbihtYWtlQ29weUJhZyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8Sz59IGVsZW1lbnRJdGVyXG4gKiBAcmV0dXJucyB7Q29weUJhZzxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzPShlbGVtZW50SXRlcik9Pntcbi8qIFRoaXMgZnVsbE9yZGVyIGNvbnRhaW5zIGhpc3RvcnkgZGVwZW5kZW50IHN0YXRlLiBJdCBpcyBzcGVjaWZpYyovXG4vKiB0byB0aGlzIG9uZSBjYWxsIGFuZCBkb2VzIG5vdCBzdXJ2aXZlIGl0LiovXG5jb25zdCBmdWxsQ29tcGFyZT1tYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuY29uc3Qgc29ydGVkPXNvcnRCeVJhbmsoZWxlbWVudEl0ZXIsZnVsbENvbXBhcmUpO1xuLyoqIEB0eXBlIHtbSyxiaWdpbnRdW119ICovXG5jb25zdCBlbnRyaWVzPVtdO1xuZm9yKGxldCBpPTA7aTxzb3J0ZWQubGVuZ3RoOyl7XG5jb25zdCBrPXNvcnRlZFtpXTtcbmxldCBqPWkrMTtcbndoaWxlKGo8c29ydGVkLmxlbmd0aCYmZnVsbENvbXBhcmUoayxzb3J0ZWRbal0pPT09MCl7XG5qKz0xO1xuIH1cbmVudHJpZXMucHVzaChbayxCaWdJbnQoai1pKV0pO1xuaT1qO1xuIH1cbnJldHVybiBtYWtlQ29weUJhZyhlbnRyaWVzKTtcbiB9OyRo4oCNX29uY2UubWFrZUNvcHlCYWdGcm9tRWxlbWVudHMobWFrZUNvcHlCYWdGcm9tRWxlbWVudHMpO1xuaGFyZGVuKG1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzKTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBDb3B5TWFwIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiBNb3ZlZCB0byBoZXJlIHNvIHRoZXkgY2FuIGNoZWNrIHRoYXQgdGhlIGNvcHlNYXAncyBrZXlzIGNvbnRhaW5zIG9ubHkga2V5cyovXG4vKiB3aXRob3V0IGNyZWF0aW5nIGFuIGltcG9ydCBjeWNsZS4qL1xuXG4vKiogQHR5cGUgV2Vha1NldDxDb3B5TWFwPGFueSxhbnk+PiAqL1xuY29uc3QgY29weU1hcE1lbW89bmV3IFdlYWtTZXQoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBtXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGNoZWNrQ29weU1hcD0obSxjaGVjayk9PntcbmlmKGNvcHlNYXBNZW1vLmhhcyhtKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZighKHBhc3NTdHlsZU9mKG0pPT09J3RhZ2dlZCcmJmdldFRhZyhtKT09PSdjb3B5TWFwJykpe1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYE5vdCBhIGNvcHlNYXA6ICR7bX1gKTtcbiB9XG5jb25zdHtwYXlsb2FkfT1tO1xuaWYocGFzc1N0eWxlT2YocGF5bG9hZCkhPT0nY29weVJlY29yZCcpe1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYEEgY29weU1hcCdzIHBheWxvYWQgbXVzdCBiZSBhIHJlY29yZDogJHttfWApO1xuIH1cbmNvbnN0e2tleXMsdmFsdWVzLC4uLnJlc3R9PXBheWxvYWQ7XG5jb25zdCByZXN1bHQ9XG4ob3duS2V5cyhyZXN0KS5sZW5ndGg9PT0wfHxcbmNoZWNrKFxuZmFsc2UsXG5YIGBBIGNvcHlNYXAncyBwYXlsb2FkIG11c3Qgb25seSBoYXZlIC5rZXlzIGFuZCAudmFsdWVzOiAke219YCkpJiZcblxuY2hlY2tFbGVtZW50cyhrZXlzLGNoZWNrKSYmXG5jaGVja0tleShrZXlzLGNoZWNrKSYmKFxucGFzc1N0eWxlT2YodmFsdWVzKT09PSdjb3B5QXJyYXknfHxcbmNoZWNrKGZhbHNlLFggYEEgY29weU1hcCdzIC52YWx1ZXMgbXVzdCBiZSBhIGNvcHlBcnJheTogJHttfWApKSYmKFxua2V5cy5sZW5ndGg9PT12YWx1ZXMubGVuZ3RofHxcbmNoZWNrKFxuZmFsc2UsXG5YIGBBIGNvcHlNYXAgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBrZXlzIGFuZCB2YWx1ZXM6ICR7bX1gKSk7XG5cbmlmKHJlc3VsdCl7XG5jb3B5TWFwTWVtby5hZGQobSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UuY2hlY2tDb3B5TWFwKGNoZWNrQ29weU1hcCk7XG5oYXJkZW4oY2hlY2tDb3B5TWFwKTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgSXNDb3B5TWFwXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBtXG4gKiBAcmV0dXJucyB7bSBpcyBDb3B5TWFwPEtleSwgUGFzc2FibGU+fVxuICovXG5cbi8qKiBAdHlwZSB7SXNDb3B5TWFwfSAqL1xuY29uc3QgICAgICAgIGlzQ29weU1hcD0obSk9PmNoZWNrQ29weU1hcChtLGlkZW50Q2hlY2tlcik7JGjigI1fb25jZS5pc0NvcHlNYXAoaXNDb3B5TWFwKTtcbmhhcmRlbihpc0NvcHlNYXApO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRDb3B5TWFwXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBtXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBtIGlzIENvcHlNYXA8S2V5LCBQYXNzYWJsZT59XG4gKi9cblxuLyoqIEB0eXBlIHtBc3NlcnRDb3B5TWFwfSAqL1xuY29uc3QgICAgICAgIGFzc2VydENvcHlNYXA9KG0pPT57XG5jaGVja0NvcHlNYXAobSxhc3NlcnRDaGVja2VyKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0Q29weU1hcChhc3NlcnRDb3B5TWFwKTtcbmhhcmRlbihhc3NlcnRDb3B5TWFwKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEByZXR1cm5zIHtLW119XG4gKi9cbmNvbnN0ICAgICAgICBnZXRDb3B5TWFwS2V5cz0obSk9PntcbmFzc2VydENvcHlNYXAobSk7XG5yZXR1cm4gbS5wYXlsb2FkLmtleXM7XG4gfTskaOKAjV9vbmNlLmdldENvcHlNYXBLZXlzKGdldENvcHlNYXBLZXlzKTtcbmhhcmRlbihnZXRDb3B5TWFwS2V5cyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcmV0dXJucyB7VltdfVxuICovXG5jb25zdCAgICAgICAgZ2V0Q29weU1hcFZhbHVlcz0obSk9PntcbmFzc2VydENvcHlNYXAobSk7XG5yZXR1cm4gbS5wYXlsb2FkLnZhbHVlcztcbiB9OyRo4oCNX29uY2UuZ2V0Q29weU1hcFZhbHVlcyhnZXRDb3B5TWFwVmFsdWVzKTtcbmhhcmRlbihnZXRDb3B5TWFwVmFsdWVzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbSyxWXT59XG4gKi9cbmNvbnN0ICAgICAgICBnZXRDb3B5TWFwRW50cmllcz0obSk9PntcbmFzc2VydENvcHlNYXAobSk7XG5jb25zdHtcbnBheWxvYWQ6e2tleXMsdmFsdWVzfX09XG5tO1xuY29uc3R7bGVuZ3RofT0vKiogQHR5cGUge0FycmF5fSAqL2tleXM7XG5yZXR1cm4gRmFyKCdDb3B5TWFwIGVudHJpZXMgaXRlcmFibGUnLHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5sZXQgaT0wO1xucmV0dXJuIEZhcignQ29weU1hcCBlbnRyaWVzIGl0ZXJhdG9yJyx7XG5uZXh0OigpPT57XG4vKiogQHR5cGUge0l0ZXJhdG9yUmVzdWx0PFtLLFZdLHZvaWQ+fSAqL1xubGV0IHJlc3VsdDtcbmlmKGk8bGVuZ3RoKXtcbnJlc3VsdD1oYXJkZW4oe2RvbmU6ZmFsc2UsdmFsdWU6W2tleXNbaV0sdmFsdWVzW2ldXX0pO1xuaSs9MTtcbnJldHVybiByZXN1bHQ7XG4gfWVsc2V7XG5yZXN1bHQ9aGFyZGVuKHtkb25lOnRydWUsdmFsdWU6dW5kZWZpbmVkfSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9fSk7XG5cbiB9fSk7XG5cbiB9OyRo4oCNX29uY2UuZ2V0Q29weU1hcEVudHJpZXMoZ2V0Q29weU1hcEVudHJpZXMpO1xuaGFyZGVuKGdldENvcHlNYXBFbnRyaWVzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEBwYXJhbSB7KGtleTogSywgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbn0gZm5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgZXZlcnlDb3B5TWFwS2V5PShtLGZuKT0+XG5nZXRDb3B5TWFwS2V5cyhtKS5ldmVyeSgoa2V5LGluZGV4KT0+Zm4oa2V5LGluZGV4KSk7JGjigI1fb25jZS5ldmVyeUNvcHlNYXBLZXkoZXZlcnlDb3B5TWFwS2V5KTtcbmhhcmRlbihldmVyeUNvcHlNYXBLZXkpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHBhcmFtIHsodmFsdWU6IFYsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW59IGZuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGV2ZXJ5Q29weU1hcFZhbHVlPShtLGZuKT0+XG5nZXRDb3B5TWFwVmFsdWVzKG0pLmV2ZXJ5KCh2YWx1ZSxpbmRleCk9PmZuKHZhbHVlLGluZGV4KSk7JGjigI1fb25jZS5ldmVyeUNvcHlNYXBWYWx1ZShldmVyeUNvcHlNYXBWYWx1ZSk7XG5oYXJkZW4oZXZlcnlDb3B5TWFwVmFsdWUpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHJldHVybnMge0NvcHlTZXQ8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBjb3B5TWFwS2V5U2V0PShtKT0+XG4vKiBBIGNvcHlNYXAncyBrZXlzIGFyZSBhbHJlYWR5IGluIHRoZSBpbnRlcm5hbCBmb3JtIHVzZWQgYnkgY29weVNldHMuKi9cbm1ha2VUYWdnZWQoJ2NvcHlTZXQnLG0ucGF5bG9hZC5rZXlzKTskaOKAjV9vbmNlLmNvcHlNYXBLZXlTZXQoY29weU1hcEtleVNldCk7XG5oYXJkZW4oY29weU1hcEtleVNldCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7SXRlcmFibGU8W0ssIFZdPn0gZW50cmllc1xuICogQHJldHVybnMge0NvcHlNYXA8SyxWPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VDb3B5TWFwPShlbnRyaWVzKT0+e1xuLyogVGhpcyBpcyB3ZWlyZCwgYnV0IHJldmVyc2UgcmFuayBzb3J0aW5nIHRoZSBlbnRyaWVzIGlzIGEgZ29vZCBmaXJzdCBzdGVwKi9cbi8qIGZvciBnZXR0aW5nIHRoZSByYW5rIHNvcnRlZCBrZXlzIHRvZ2V0aGVyIHdpdGggdGhlIHZhbHVlcyovXG4vKiBvcmdhbml6ZWQgYnkgdGhvc2Uga2V5cy4gQWxzbywgYW1vbmcgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCovXG4vKiBrZXlzIGluIHRoZSBzYW1lIGVxdWl2YWxlbmNlIGNsYXNzLCB0aG9zZSBhcmUgcmFuayBzb3J0ZWQuKi9cbi8qIFRPRE8gVGhpcyovXG4vKiBjb3VsZCBzb2x2ZSB0aGUgY29weU1hcCBjb3ZlciBpc3N1ZSBleHBsYWluZWQgaW4gcGF0dGVybk1hdGNoZXJzLmpzLiovXG4vKiBCdXQgb25seSBpZiB3ZSBpbmNsdWRlIHRoaXMgY3JpdGVyaWEgaW4gb3VyIHZhbGlkYXRpb24gb2YgY29weU1hcHMsKi9cbi8qIHdoaWNoIHdlIGN1cnJlbnRseSBkbyBub3QuKi9cbmNvbnN0IHNvcnRlZEVudHJpZXM9c29ydEJ5UmFuayhlbnRyaWVzLGNvbXBhcmVBbnRpUmFuayk7XG5jb25zdCBrZXlzPXNvcnRlZEVudHJpZXMubWFwKChbayxfdl0pPT5rKTtcbmNvbnN0IHZhbHVlcz1zb3J0ZWRFbnRyaWVzLm1hcCgoW19rLHZdKT0+dik7XG5jb25zdCByZXN1bHQ9bWFrZVRhZ2dlZCgnY29weU1hcCcse2tleXMsdmFsdWVzfSk7XG5hc3NlcnRDb3B5TWFwKHJlc3VsdCk7XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS5tYWtlQ29weU1hcChtYWtlQ29weU1hcCk7XG5oYXJkZW4obWFrZUNvcHlNYXApO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gS2V5cyBSZWN1ciAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tLZXlJbnRlcm5hbD0odmFsLGNoZWNrKT0+e1xuY29uc3QgY2hlY2tJdD0oY2hpbGQpPT5jaGVja0tleShjaGlsZCxjaGVjayk7XG5cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZih2YWwpO1xuc3dpdGNoKHBhc3NTdHlsZSl7XG5jYXNlJ2NvcHlSZWNvcmQnOntcbi8qIEEgY29weVJlY29yZCBpcyBhIGtleSBpZmYgYWxsIGl0cyBjaGlsZHJlbiBhcmUga2V5cyovXG5yZXR1cm4gT2JqZWN0LnZhbHVlcyh2YWwpLmV2ZXJ5KGNoZWNrSXQpO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG4vKiBBIGNvcHlBcnJheSBpcyBhIGtleSBpZmYgYWxsIGl0cyBjaGlsZHJlbiBhcmUga2V5cyovXG5yZXR1cm4gdmFsLmV2ZXJ5KGNoZWNrSXQpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdCB0YWc9Z2V0VGFnKHZhbCk7XG5zd2l0Y2godGFnKXtcbmNhc2UnY29weVNldCc6e1xucmV0dXJuIGNoZWNrQ29weVNldCh2YWwsY2hlY2spO1xuIH1cbmNhc2UnY29weUJhZyc6e1xucmV0dXJuIGNoZWNrQ29weUJhZyh2YWwsY2hlY2spO1xuIH1cbmNhc2UnY29weU1hcCc6e1xucmV0dXJuKFxuY2hlY2tDb3B5TWFwKHZhbCxjaGVjaykmJlxuLyogRm9yIGEgY29weU1hcCB0byBiZSBhIGtleSwgYWxsIGl0cyBrZXlzIGFuZCB2YWx1ZXMgbXVzdCovXG4vKiBiZSBrZXlzLiBLZXlzIGFscmVhZHkgY2hlY2tlZCBieSBgY2hlY2tDb3B5TWFwYCBzaW5jZSovXG4vKiB0aGF0J3MgYSBjb3B5TWFwIHJlcXVpcmVtZW50IGluIGdlbmVyYWwuKi9cbmV2ZXJ5Q29weU1hcFZhbHVlKHZhbCxjaGVja0l0KSk7XG5cbiB9XG5kZWZhdWx0OntcbnJldHVybihcbmNoZWNrIT09aWRlbnRDaGVja2VyJiZcbmNoZWNrKGZhbHNlLFggYEEgcGFzc2FibGUgdGFnZ2VkICR7cSh0YWcpfSBpcyBub3QgYSBrZXk6ICR7dmFsfWApKTtcblxuIH19XG5cbiB9XG5jYXNlJ3JlbW90YWJsZSc6e1xuLyogQWxsIHJlbW90YWJsZXMgYXJlIGtleXMuKi9cbnJldHVybiB0cnVlO1xuIH1cbmNhc2UnZXJyb3InOlxuY2FzZSdwcm9taXNlJzp7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgQSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIGEga2V5YCk7XG4gfVxuZGVmYXVsdDp7XG4vKiBVbmV4cGVjdGVkIHRhZ3MgYXJlIGp1c3Qgbm9uLWtleXMsIGJ1dCBhbiB1bmV4cGVjdGVkIHBhc3NTdHlsZSovXG4vKiBpcyBhbHdheXMgYW4gZXJyb3IuKi9cbnRocm93IEZhaWwgYHVuZXhwZWN0ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfTogJHt2YWx9YDtcbiB9fVxuXG4gfTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1ByaW1pdGl2ZUtleSI6WyJpc1ByaW1pdGl2ZUtleSJdLCJhc3NlcnRQcmltaXRpdmVLZXkiOlsiYXNzZXJ0UHJpbWl0aXZlS2V5Il0sImNoZWNrU2NhbGFyS2V5IjpbImNoZWNrU2NhbGFyS2V5Il0sImlzU2NhbGFyS2V5IjpbImlzU2NhbGFyS2V5Il0sImFzc2VydFNjYWxhcktleSI6WyJhc3NlcnRTY2FsYXJLZXkiXSwiY2hlY2tLZXkiOlsiY2hlY2tLZXkiXSwiaXNLZXkiOlsiaXNLZXkiXSwiYXNzZXJ0S2V5IjpbImFzc2VydEtleSJdLCJjaGVja0NvcHlTZXQiOlsiY2hlY2tDb3B5U2V0Il0sImlzQ29weVNldCI6WyJpc0NvcHlTZXQiXSwiYXNzZXJ0Q29weVNldCI6WyJhc3NlcnRDb3B5U2V0Il0sImdldENvcHlTZXRLZXlzIjpbImdldENvcHlTZXRLZXlzIl0sImV2ZXJ5Q29weVNldEtleSI6WyJldmVyeUNvcHlTZXRLZXkiXSwibWFrZUNvcHlTZXQiOlsibWFrZUNvcHlTZXQiXSwiY2hlY2tDb3B5QmFnIjpbImNoZWNrQ29weUJhZyJdLCJpc0NvcHlCYWciOlsiaXNDb3B5QmFnIl0sImFzc2VydENvcHlCYWciOlsiYXNzZXJ0Q29weUJhZyJdLCJnZXRDb3B5QmFnRW50cmllcyI6WyJnZXRDb3B5QmFnRW50cmllcyJdLCJldmVyeUNvcHlCYWdFbnRyeSI6WyJldmVyeUNvcHlCYWdFbnRyeSJdLCJtYWtlQ29weUJhZyI6WyJtYWtlQ29weUJhZyJdLCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyI6WyJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyJdLCJjaGVja0NvcHlNYXAiOlsiY2hlY2tDb3B5TWFwIl0sImlzQ29weU1hcCI6WyJpc0NvcHlNYXAiXSwiYXNzZXJ0Q29weU1hcCI6WyJhc3NlcnRDb3B5TWFwIl0sImdldENvcHlNYXBLZXlzIjpbImdldENvcHlNYXBLZXlzIl0sImdldENvcHlNYXBWYWx1ZXMiOlsiZ2V0Q29weU1hcFZhbHVlcyJdLCJnZXRDb3B5TWFwRW50cmllcyI6WyJnZXRDb3B5TWFwRW50cmllcyJdLCJldmVyeUNvcHlNYXBLZXkiOlsiZXZlcnlDb3B5TWFwS2V5Il0sImV2ZXJ5Q29weU1hcFZhbHVlIjpbImV2ZXJ5Q29weU1hcFZhbHVlIl0sImNvcHlNYXBLZXlTZXQiOlsiY29weU1hcEtleVNldCJdLCJtYWtlQ29weU1hcCI6WyJtYWtlQ29weU1hcCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAArf4Jz4hoAAOIaAAAsAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2tleXMvY29tcGFyZUtleXMuanN7ImltcG9ydHMiOlsiLi9jaGVja0tleS5qcyIsIi4vbWVyZ2UtYmFnLW9wZXJhdG9ycy5qcyIsIi4vbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcyIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9tYXJzaGFsL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyIsIkBlbmRvL21hcnNoYWwvc3JjL3JhbmtPcmRlci5qcyJdLCJleHBvcnRzIjpbImNvbXBhcmVLZXlzIiwia2V5RVEiLCJrZXlHVCIsImtleUdURSIsImtleUxUIiwia2V5TFRFIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHBhc3NTdHlsZU9mLGdldFRhZyxjb21wYXJlUmFuayxyZWNvcmROYW1lcyxyZWNvcmRWYWx1ZXMsYXNzZXJ0S2V5LGJhZ0NvbXBhcmUsc2V0Q29tcGFyZTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dLFtcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWwvc3JjL3JhbmtPcmRlci5qc1wiLCBbW1wiY29tcGFyZVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVSYW5rID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWwvc3JjL2VuY29kZVBhc3NhYmxlLmpzXCIsIFtbXCJyZWNvcmROYW1lc1wiLCBbJGjigI1fYSA9PiAocmVjb3JkTmFtZXMgPSAkaOKAjV9hKV1dLFtcInJlY29yZFZhbHVlc1wiLCBbJGjigI1fYSA9PiAocmVjb3JkVmFsdWVzID0gJGjigI1fYSldXV1dLFtcIi4vY2hlY2tLZXkuanNcIiwgW1tcImFzc2VydEtleVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0S2V5ID0gJGjigI1fYSldXV1dLFtcIi4vbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc1wiLCBbW1wiYmFnQ29tcGFyZVwiLCBbJGjigI1fYSA9PiAoYmFnQ29tcGFyZSA9ICRo4oCNX2EpXV1dXSxbXCIuL21lcmdlLXNldC1vcGVyYXRvcnMuanNcIiwgW1tcInNldENvbXBhcmVcIiwgWyRo4oCNX2EgPT4gKHNldENvbXBhcmUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuLyoqIEB0eXBlIHtLZXlDb21wYXJlfSAqL1xuY29uc3QgICAgICAgIGNvbXBhcmVLZXlzPShsZWZ0LHJpZ2h0KT0+e1xuYXNzZXJ0S2V5KGxlZnQpO1xuYXNzZXJ0S2V5KHJpZ2h0KTtcbmNvbnN0IGxlZnRTdHlsZT1wYXNzU3R5bGVPZihsZWZ0KTtcbmNvbnN0IHJpZ2h0U3R5bGU9cGFzc1N0eWxlT2YocmlnaHQpO1xuaWYobGVmdFN0eWxlIT09cmlnaHRTdHlsZSl7XG4vKiBEaWZmZXJlbnQgcGFzc1N0eWxlcyBhcmUgaW5jb21tZW5zdXJhdGUqL1xucmV0dXJuIE5hTjtcbiB9XG5zd2l0Y2gobGVmdFN0eWxlKXtcbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnbnVsbCc6XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdiaWdpbnQnOlxuY2FzZSdzdHJpbmcnOlxuY2FzZSdzeW1ib2wnOntcbi8qIGZvciB0aGVzZSwga2V5cyBjb21wYXJlIHRoZSBzYW1lIGFzIHJhbmsqL1xucmV0dXJuIGNvbXBhcmVSYW5rKGxlZnQscmlnaHQpO1xuIH1cbmNhc2UnbnVtYmVyJzp7XG5jb25zdCByYW5rQ29tcD1jb21wYXJlUmFuayhsZWZ0LHJpZ2h0KTtcbmlmKHJhbmtDb21wPT09MCl7XG5yZXR1cm4gMDtcbiB9XG5pZihOdW1iZXIuaXNOYU4obGVmdCl8fE51bWJlci5pc05hTihyaWdodCkpe1xuLyogTmFOIGlzIGVxdWFsIHRvIGl0c2VsZiwgYnV0IGluY29tbWVuc3VyYXRlIHdpdGggZXZlcnl0aGluZyBlbHNlKi9cbmFzc2VydCghTnVtYmVyLmlzTmFOKGxlZnQpfHwhTnVtYmVyLmlzTmFOKHJpZ2h0KSk7XG5yZXR1cm4gTmFOO1xuIH1cbi8qIEFtb25nIG5vbi1OYU4gbnVtYmVycywga2V5IG9yZGVyIGlzIHRoZSBzYW1lIGFzIHJhbmsgb3JkZXIuIE5vdGUgdGhhdCovXG4vKiBpbiBib3RoIG9yZGVycywgYC0wYCBpcyBpbiB0aGUgc2FtZSBlcXVpdmFsZW5jZSBjbGFzcyBhcyBgMGAuKi9cbnJldHVybiByYW5rQ29tcDtcbiB9XG5jYXNlJ3JlbW90YWJsZSc6e1xuaWYobGVmdD09PXJpZ2h0KXtcbnJldHVybiAwO1xuIH1cbi8qIElmIHR3byByZW1vdGFibGVzIGFyZSBub3QgaWRlbnRpY2FsLCB0aGVuIGFzIGtleXMgdGhleSBhcmUqL1xuLyogaW5jb21tZW5zdXJhdGUuKi9cbnJldHVybiBOYU47XG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbi8qIExleGljb2dyYXBoaWMgYnkga2V5IG9yZGVyLiBSYW5rIG9yZGVyIG9mIGFycmF5cyBpcyBsZXhpY29ncmFwaGljIGJ5Ki9cbi8qIHJhbmsgb3JkZXIuKi9cbi8qIEJlY2F1c2UgdGhlIGludmFyaWFudHMgYWJvdmUgYXBwbHkgdG8gdGhlIGVsZW1lbnRzIG9mIHRoZSBhcnJheSwqL1xuLyogdGhleSBhcHBseSB0byB0aGUgYXJyYXkgYXMgYSB3aG9sZS4qL1xuY29uc3QgbGVuPU1hdGgubWluKGxlZnQubGVuZ3RoLHJpZ2h0Lmxlbmd0aCk7XG5mb3IobGV0IGk9MDtpPGxlbjtpKz0xKXtcbmNvbnN0IHJlc3VsdD1jb21wYXJlS2V5cyhsZWZ0W2ldLHJpZ2h0W2ldKTtcbmlmKHJlc3VsdCE9PTApe1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfVxuLyogSWYgYWxsIG1hdGNoaW5nIGVsZW1lbnRzIGFyZSBrZXlFUSwgdGhlbiBhY2NvcmRpbmcgdG8gdGhlaXIgbGVuZ3Rocy4qL1xuLyogVGh1cywgaWYgYXJyYXkgWCBpcyBhIHByZWZpeCBvZiBhcnJheSBZLCB0aGVuIFggaXMgc21hbGxlciB0aGFuIFkuKi9cbnJldHVybiBjb21wYXJlUmFuayhsZWZ0Lmxlbmd0aCxyaWdodC5sZW5ndGgpO1xuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuLyogUGFyZXRvIHBhcnRpYWwgb3JkZXIgY29tcGFyaXNvbi4qL1xuY29uc3QgbGVmdE5hbWVzPXJlY29yZE5hbWVzKGxlZnQpO1xuY29uc3QgcmlnaHROYW1lcz1yZWNvcmROYW1lcyhyaWdodCk7XG5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5pZigha2V5RVEobGVmdE5hbWVzLHJpZ2h0TmFtZXMpKXtcbi8qIElmIHRoZXkgZG8gbm90IGhhdmUgZXhhY3RseSB0aGUgc2FtZSBwcm9wZXJ0aWVzLCovXG4vKiB0aGV5IGFyZSBpbmNvbW1lbnN1cmF0ZS4qL1xuLyogTm90ZSB0aGF0IHJhbmsgc29ydGluZyBvZiBjb3B5UmVjb3JkcyBncm91cHMgYWxsIGNvcHlSZWNvcmRzIHdpdGgqL1xuLyogdGhlIHNhbWUga2V5cyB0b2dldGhlciwgZW5hYmxpbmcgcmFuZ2Ugc2VhcmNoaW5nIG92ZXIgY29weVJlY29yZHMqL1xuLyogdG8gYXZvaWQgbW9yZSBpcnJlbGV2YW50IG9uZXMuKi9cbnJldHVybiBOYU47XG4gfVxuY29uc3QgbGVmdFZhbHVlcz1yZWNvcmRWYWx1ZXMobGVmdCxsZWZ0TmFtZXMpO1xuY29uc3QgcmlnaHRWYWx1ZXM9cmVjb3JkVmFsdWVzKHJpZ2h0LHJpZ2h0TmFtZXMpO1xuLyogUHJlc3VtZSB0aGF0IGJvdGggY29weVJlY29yZHMgaGF2ZSB0aGUgc2FtZSBrZXkgb3JkZXIqL1xuLyogdW50aWwgZW5jb3VudGVyaW5nIGEgcHJvcGVydHkgZGlzcHJvdmluZyB0aGF0IGh5cG90aGVzaXMuKi9cbmxldCByZXN1bHQ9MDtcbmZvcihsZXQgaT0wO2k8bGVmdFZhbHVlcy5sZW5ndGg7aSs9MSl7XG5jb25zdCBjb21wPWNvbXBhcmVLZXlzKGxlZnRWYWx1ZXNbaV0scmlnaHRWYWx1ZXNbaV0pO1xuaWYoTnVtYmVyLmlzTmFOKGNvbXApKXtcbnJldHVybiBOYU47XG4gfVxuaWYocmVzdWx0IT09Y29tcCYmY29tcCE9PTApe1xuaWYocmVzdWx0PT09MCl7XG5yZXN1bHQ9Y29tcDtcbiB9ZWxzZXtcbmFzc2VydChcbnJlc3VsdD09PS0xJiZjb21wPT09MXx8cmVzdWx0PT09MSYmY29tcD09PS0xKTtcblxucmV0dXJuIE5hTjtcbiB9XG4gfVxuIH1cbi8qIElmIGNvcHlSZWNvcmQgWCBpcyBzbWFsbGVyIHRoYW4gY29weVJlY29yZCBZLCB0aGVuIHRoZXkgbXVzdCBoYXZlIHRoZSovXG4vKiBzYW1lIHByb3BlcnR5IG5hbWVzIGFuZCBldmVyeSB2YWx1ZSBpbiBYIG11c3QgYmUgc21hbGxlciBvciBlcXVhbCB0byovXG4vKiB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBpbiBZICh3aXRoIGF0IGxlYXN0IG9uZSB2YWx1ZSBzbWFsbGVyKS4qL1xuLyogVGhlIHJhbmsgb3JkZXIgb2YgWCBhbmQgWSBpcyBiYXNlZCBvbiBsZXhpY29ncmFwaGljIHJhbmsgb3JkZXIgb2YqL1xuLyogdGhlaXIgdmFsdWVzLCBhcyBvcmdhbml6ZWQgYnkgcmV2ZXJzZSBsZXhpY29ncmFwaGljIG9yZGVyIG9mIHRoZWlyKi9cbi8qIHByb3BlcnR5IG5hbWVzLiovXG4vKiBUaHVzIGlmIGNvbXBhcmVLZXlzKFgsWSkgPCAwIHRoZW4gY29tcGFyZVJhbmsoWCxZKSA8IDAuKi9cbnJldHVybiByZXN1bHQ7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0IGxlZnRUYWc9Z2V0VGFnKGxlZnQpO1xuY29uc3QgcmlnaHRUYWc9Z2V0VGFnKHJpZ2h0KTtcbmlmKGxlZnRUYWchPT1yaWdodFRhZyl7XG4vKiBkaWZmZXJlbnQgdGFncyBhcmUgaW5jb21tZW5zdXJhdGUqL1xucmV0dXJuIE5hTjtcbiB9XG5zd2l0Y2gobGVmdFRhZyl7XG5jYXNlJ2NvcHlTZXQnOntcbi8qIGNvcHlTZXQgWCBpcyBzbWFsbGVyIHRoYW4gY29weVNldCBZIHdoZW4gZXZlcnkgZWxlbWVudCBvZiBYKi9cbi8qIGlzIGtleUVRIHRvIHNvbWUgZWxlbWVudCBvZiBZIGFuZCBzb21lIGVsZW1lbnQgb2YgWSBpcyovXG4vKiBub3Qga2V5RVEgdG8gYW55IGVsZW1lbnQgb2YgWC4qL1xucmV0dXJuIHNldENvbXBhcmUobGVmdCxyaWdodCk7XG4gfVxuY2FzZSdjb3B5QmFnJzp7XG4vKiBjb3B5QmFnIFggaXMgc21hbGxlciB0aGFuIGNvcHlCYWcgWSB3aGVuIGV2ZXJ5IGVsZW1lbnQgb2YgWCovXG4vKiBvY2N1cnMgbm8gbW9yZSB0aGFuIHRoZSBrZXlFUSBlbGVtZW50IG9mIFksIGFuZCBzb21lIGVsZW1lbnQqL1xuLyogb2YgWSBvY2N1cnMgbW9yZSB0aGFuIHNvbWUgZWxlbWVudCBvZiBYLCB3aGVyZSBiZWluZyBhYnNlbnQqL1xuLyogZnJvbSBYIGNvdW50cyBhcyBvY2N1cnJpbmcgemVybyB0aW1lcy4qL1xucmV0dXJuIGJhZ0NvbXBhcmUobGVmdCxyaWdodCk7XG4gfVxuY2FzZSdjb3B5TWFwJzp7XG4vKiBUd28gY29weU1hcHMgdGhhdCBoYXZlIGRpZmZlcmVudCBrZXlzIChhY2NvcmRpbmcgdG8ga2V5RVEpIGFyZSovXG4vKiBpbmNvbW1lbnN1cmF0ZS4gVGhlIHJlcHJlc2VudGF0aW9uIG9mIGNvcHlNYXBzIGluY2x1ZGVzIHRoZSBrZXlzKi9cbi8qIGZpcnN0LCBpbiB0aGUgc2FtZSByZXZlcnNlIHJhbmsgb3JkZXIgdXNlZCBieSBzZXRzLiBUaHVzLCBhbGwqL1xuLyogY29weU1hcHMgd2l0aCBrZXlzIG9mIHRoZSBzYW1lIHJhbmsgKHdoaWNoIGlzKi9cbi8qIGxlc3MgcHJlY2lzZSEpIHdpbGwgYmUgZ3JvdXBlZCB0b2dldGhlciB3aGVuIGNvcHlNYXBzIGFyZSBzb3J0ZWQqL1xuLyogYnkgcmFuaywgbWluaW1pemluZyB0aGUgbnVtYmVyIG9mIG1pc3NlcyB3aGVuIHJhbmdlIHNlYXJjaGluZy4qL1xuLyoqL1xuLyogQW1vbmcgY29weU1hcHMgd2l0aCB0aGUgc2FtZSBrZXlzIChhY2NvcmRpbmcgdG8ga2V5RVEpLCB0aGV5Ki9cbi8qIGNvbXBhcmUgYnkgYSBjb3JyZXNwb25kaW5nIGNvbXBhcmlzb24gb2YgdGhlaXIgdmFsdWVzLiBUaHVzLCBhcyovXG4vKiB3aXRoIHJlY29yZHMsIGZvciB0d28gY29weU1hcHMgWCBhbmQgWSwgaWYgYGNvbXBhcmVLZXlzKFgsWSkgPCovXG4vKiAwYCB0aGVuLCBiZWNhdXNlIHRoZXNlIHZhbHVlcyBvYmV5IHRoZSBhYm92ZSBpbnZhcmlhbnRzLCBub25lIG9mKi9cbi8qIHRoZSB2YWx1ZXMgaW4gWCBoYXZlIGEgbGF0ZXIgcmFuayB0aGFuIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlKi9cbi8qIG9mIFkuIFRodXMsIGBjb21wYXJlUmFuayhYLFkpIDw9IDBgLiBUT0RPIGltcGxlbWVudCovXG50aHJvdyBGYWlsIGBNYXAgY29tcGFyaXNvbiBub3QgeWV0IGltcGxlbWVudGVkOiAke2xlZnR9IHZzICR7cmlnaHR9YDtcbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYHVuZXhwZWN0ZWQgdGFnICR7cShsZWZ0VGFnKX06ICR7bGVmdH1gO1xuIH19XG5cbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYHVuZXhwZWN0ZWQgcGFzc1N0eWxlICR7cShsZWZ0U3R5bGUpfTogJHtsZWZ0fWA7XG4gfX1cblxuIH07JGjigI1fb25jZS5jb21wYXJlS2V5cyhjb21wYXJlS2V5cyk7XG5oYXJkZW4oY29tcGFyZUtleXMpO1xuXG5jb25zdCAgICAgICAga2V5TFQ9KGxlZnQscmlnaHQpPT5jb21wYXJlS2V5cyhsZWZ0LHJpZ2h0KTwwOyRo4oCNX29uY2Uua2V5TFQoa2V5TFQpO1xuaGFyZGVuKGtleUxUKTtcblxuY29uc3QgICAgICAgIGtleUxURT0obGVmdCxyaWdodCk9PmNvbXBhcmVLZXlzKGxlZnQscmlnaHQpPD0wOyRo4oCNX29uY2Uua2V5TFRFKGtleUxURSk7XG5oYXJkZW4oa2V5TFRFKTtcblxuY29uc3QgICAgICAgIGtleUVRPShsZWZ0LHJpZ2h0KT0+Y29tcGFyZUtleXMobGVmdCxyaWdodCk9PT0wOyRo4oCNX29uY2Uua2V5RVEoa2V5RVEpO1xuaGFyZGVuKGtleUVRKTtcblxuY29uc3QgICAgICAgIGtleUdURT0obGVmdCxyaWdodCk9PmNvbXBhcmVLZXlzKGxlZnQscmlnaHQpPj0wOyRo4oCNX29uY2Uua2V5R1RFKGtleUdURSk7XG5oYXJkZW4oa2V5R1RFKTtcblxuY29uc3QgICAgICAgIGtleUdUPShsZWZ0LHJpZ2h0KT0+Y29tcGFyZUtleXMobGVmdCxyaWdodCk+MDskaOKAjV9vbmNlLmtleUdUKGtleUdUKTtcbmhhcmRlbihrZXlHVCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY29tcGFyZUtleXMiOlsiY29tcGFyZUtleXMiXSwia2V5TFQiOlsia2V5TFQiXSwia2V5TFRFIjpbImtleUxURSJdLCJrZXlFUSI6WyJrZXlFUSJdLCJrZXlHVEUiOlsia2V5R1RFIl0sImtleUdUIjpbImtleUdUIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAC28ThEbEwAAGxMAACgAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMva2V5cy9jb3B5QmFnLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAZW5kby9tYXJzaGFsL3NyYy9yYW5rT3JkZXIuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRCYWdFbnRyaWVzIiwiYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzIiwiY2hlY2tCYWdFbnRyaWVzIiwiY29lcmNlVG9CYWdFbnRyaWVzIiwibWFrZUJhZ09mRW50cmllcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsY29tcGFyZUFudGlSYW5rLGlzUmFua1NvcnRlZCxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsL3NyYy9yYW5rT3JkZXIuanNcIiwgW1tcImNvbXBhcmVBbnRpUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjigI1fYSldXSxbXCJpc1JhbmtTb3J0ZWRcIiwgWyRo4oCNX2EgPT4gKGlzUmFua1NvcnRlZCA9ICRo4oCNX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjigI1fYSldXSxbXCJzb3J0QnlSYW5rXCIsIFskaOKAjV9hID0+IChzb3J0QnlSYW5rID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cbi8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1tULGJpZ2ludF1bXX0gYmFnRW50cmllc1xuICogQHBhcmFtIHtGdWxsQ29tcGFyZSB8IHVuZGVmaW5lZH0gZnVsbENvbXBhcmUgSWYgcHJvdmlkZWQgYW5kIGBiYWdFbnRyaWVzYCBpcyBhbHJlYWR5XG4gKiBrbm93biB0byBiZSBzb3J0ZWQgYnkgdGhpcyBgZnVsbENvbXBhcmVgLCB0aGVuIHdlIHNob3VsZCBnZXQgYSBtZW1vIGhpdFxuICogcmF0aGVyIHRoYW4gYSByZXNvcnRpbmcuIEhvd2V2ZXIsIGN1cnJlbnRseSwgd2Ugc3RpbGwgZW51bWVyYXRlIHRoZSBlbnRpcmVcbiAqIGFycmF5IGVhY2ggdGltZS5cbiAqXG4gKiBUT0RPOiBJZiBkb2luZyB0aGlzIHJlZHVudGFudGx5IHR1cm5zIG91dCB0byBiZSBleHBlbnNpdmUsIHdlXG4gKiBjb3VsZCBtZW1vaXplIHRoaXMgbm8tZHVwbGljYXRlLWtleXMgZmluZGluZyBhcyB3ZWxsLCBpbmRlcGVuZGVudFxuICogb2YgdGhlIGBmdWxsT3JkZXJgIHVzZSB0byByZWFjaCB0aGlzIGZpbmRpbmcuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tOb0R1cGxpY2F0ZUtleXM9KGJhZ0VudHJpZXMsZnVsbENvbXBhcmUsY2hlY2spPT57XG4vKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuLyogdG8gdGhpcyBvbmUgY2FsbCBhbmQgZG9lcyBub3Qgc3Vydml2ZSBpdC4qL1xuLyogVE9ETyBPbmNlIGFsbCBvdXIgdG9vbGluZyBpcyByZWFkeSBmb3IgYCYmPWAsIHRoZSBmb2xsb3dpbmcqL1xuLyogbGluZSBzaG91bGQgYmUgcmV3cml0dGVuIHVzaW5nIGl0LiovXG5mdWxsQ29tcGFyZT1mdWxsQ29tcGFyZXx8bWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcblxuLyogU2luY2UgdGhlIGtleSBpcyBtb3JlIHNpZ25pZmljYW50IHRoYW4gdGhlIHZhbHVlICh0aGUgY291bnQpLCovXG4vKiBzb3J0aW5nIGJ5IGZ1bGxPcmRlciBpcyBndWFyYW50ZWVkIHRvIG1ha2UgZHVwbGljYXRlIGtleXMqL1xuLyogYWRqYWNlbnQgaW5kZXBlbmRlbnQgb2YgdGhlaXIgY291bnRzLiovXG5iYWdFbnRyaWVzPXNvcnRCeVJhbmsoYmFnRW50cmllcyxmdWxsQ29tcGFyZSk7XG5jb25zdHtsZW5ndGh9PWJhZ0VudHJpZXM7XG5mb3IobGV0IGk9MTtpPGxlbmd0aDtpKz0xKXtcbmNvbnN0IGswPWJhZ0VudHJpZXNbaS0xXVswXTtcbmNvbnN0IGsxPWJhZ0VudHJpZXNbaV1bMF07XG5pZihmdWxsQ29tcGFyZShrMCxrMSk9PT0wKXtcbnJldHVybiBjaGVjayhmYWxzZSxYIGB2YWx1ZSBoYXMgZHVwbGljYXRlIGtleXM6ICR7azB9YCk7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7W1QsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlfSBbZnVsbENvbXBhcmVdXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydE5vRHVwbGljYXRlS2V5cz0oYmFnRW50cmllcyxmdWxsQ29tcGFyZT11bmRlZmluZWQpPT57XG5jaGVja05vRHVwbGljYXRlS2V5cyhiYWdFbnRyaWVzLGZ1bGxDb21wYXJlLGFzc2VydENoZWNrZXIpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtbUGFzc2FibGUsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRo4oCNX29uY2UuYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzKGFzc2VydE5vRHVwbGljYXRlS2V5cyk7XG5jb25zdCAgICAgICAgY2hlY2tCYWdFbnRyaWVzPShiYWdFbnRyaWVzLGNoZWNrKT0+e1xuaWYocGFzc1N0eWxlT2YoYmFnRW50cmllcykhPT0nY29weUFycmF5Jyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYFRoZSBlbnRyaWVzIG9mIGEgY29weUJhZyBtdXN0IGJlIGEgY29weUFycmF5OiAke2JhZ0VudHJpZXN9YCk7XG5cbiB9XG5pZighaXNSYW5rU29ydGVkKGJhZ0VudHJpZXMsY29tcGFyZUFudGlSYW5rKSl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYFRoZSBlbnRyaWVzIG9mIGEgY29weUJhZyBtdXN0IGJlIHNvcnRlZCBpbiByZXZlcnNlIHJhbmsgb3JkZXI6ICR7YmFnRW50cmllc31gKTtcblxuIH1cbmZvcihjb25zdCBlbnRyeSBvZiBiYWdFbnRyaWVzKXtcbmlmKFxucGFzc1N0eWxlT2YoZW50cnkpIT09J2NvcHlBcnJheSd8fFxuZW50cnkubGVuZ3RoIT09Mnx8XG50eXBlb2YgZW50cnlbMV0hPT0nYmlnaW50JylcbntcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgRWFjaCBlbnRyeSBvZiBhIGNvcHlCYWcgbXVzdCBiZSBwYWlyIG9mIGEga2V5IGFuZCBhIGJpZ2ludCByZXByZXNlbnRpbmcgYSBjb3VudDogJHtlbnRyeX1gKTtcblxuIH1cbmlmKGVudHJ5WzFdPDEpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBFYWNoIGVudHJ5IG9mIGEgY29weUJhZyBtdXN0IGhhdmUgYSBwb3NpdGl2ZSBjb3VudDogJHtlbnRyeX1gKTtcblxuIH1cbiB9XG5yZXR1cm4gY2hlY2tOb0R1cGxpY2F0ZUtleXMoYmFnRW50cmllcyx1bmRlZmluZWQsY2hlY2spO1xuIH07JGjigI1fb25jZS5jaGVja0JhZ0VudHJpZXMoY2hlY2tCYWdFbnRyaWVzKTtcbmhhcmRlbihjaGVja0JhZ0VudHJpZXMpO1xuXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1yZXR1cm5zLWNoZWNrIC0tIGRvZXNuJ3QgdW5kZXJzdGFuZCBhc3NlcnRzKi9cbi8qKlxuICogQHBhcmFtIHtbUGFzc2FibGUsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBiYWdFbnRyaWVzIGlzIFtQYXNzYWJsZSxiaWdpbnRdW119XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRCYWdFbnRyaWVzPShiYWdFbnRyaWVzKT0+e1xuY2hlY2tCYWdFbnRyaWVzKGJhZ0VudHJpZXMsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydEJhZ0VudHJpZXMoYXNzZXJ0QmFnRW50cmllcyk7XG5oYXJkZW4oYXNzZXJ0QmFnRW50cmllcyk7XG5cbmNvbnN0ICAgICAgICBjb2VyY2VUb0JhZ0VudHJpZXM9KGJhZ0VudHJpZXNMaXN0KT0+e1xuY29uc3QgYmFnRW50cmllcz1zb3J0QnlSYW5rKGJhZ0VudHJpZXNMaXN0LGNvbXBhcmVBbnRpUmFuayk7XG5hc3NlcnRCYWdFbnRyaWVzKGJhZ0VudHJpZXMpO1xucmV0dXJuIGJhZ0VudHJpZXM7XG4gfTskaOKAjV9vbmNlLmNvZXJjZVRvQmFnRW50cmllcyhjb2VyY2VUb0JhZ0VudHJpZXMpO1xuaGFyZGVuKGNvZXJjZVRvQmFnRW50cmllcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8W0ssIGJpZ2ludF0+fSBiYWdFbnRyeUl0ZXJcbiAqIEByZXR1cm5zIHtDb3B5QmFnPEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUJhZ09mRW50cmllcz0oYmFnRW50cnlJdGVyKT0+XG5tYWtlVGFnZ2VkKCdjb3B5QmFnJyxjb2VyY2VUb0JhZ0VudHJpZXMoYmFnRW50cnlJdGVyKSk7JGjigI1fb25jZS5tYWtlQmFnT2ZFbnRyaWVzKG1ha2VCYWdPZkVudHJpZXMpO1xuaGFyZGVuKG1ha2VCYWdPZkVudHJpZXMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydE5vRHVwbGljYXRlS2V5cyI6WyJhc3NlcnROb0R1cGxpY2F0ZUtleXMiXSwiY2hlY2tCYWdFbnRyaWVzIjpbImNoZWNrQmFnRW50cmllcyJdLCJhc3NlcnRCYWdFbnRyaWVzIjpbImFzc2VydEJhZ0VudHJpZXMiXSwiY29lcmNlVG9CYWdFbnRyaWVzIjpbImNvZXJjZVRvQmFnRW50cmllcyJdLCJtYWtlQmFnT2ZFbnRyaWVzIjpbIm1ha2VCYWdPZkVudHJpZXMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAonxhGJQPAACUDwAAKAAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9rZXlzL2NvcHlTZXQuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL21hcnNoYWwvc3JjL3JhbmtPcmRlci5qcyJdLCJleHBvcnRzIjpbImFzc2VydEVsZW1lbnRzIiwiYXNzZXJ0Tm9EdXBsaWNhdGVzIiwiY2hlY2tFbGVtZW50cyIsImNvZXJjZVRvRWxlbWVudHMiLCJtYWtlU2V0T2ZFbGVtZW50cyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsY29tcGFyZUFudGlSYW5rLGlzUmFua1NvcnRlZCxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsL3NyYy9yYW5rT3JkZXIuanNcIiwgW1tcImNvbXBhcmVBbnRpUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjigI1fYSldXSxbXCJpc1JhbmtTb3J0ZWRcIiwgWyRo4oCNX2EgPT4gKGlzUmFua1NvcnRlZCA9ICRo4oCNX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjigI1fYSldXSxbXCJzb3J0QnlSYW5rXCIsIFskaOKAjV9hID0+IChzb3J0QnlSYW5rID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cbi8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1RbXX0gZWxlbWVudHNcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmUgfCB1bmRlZmluZWR9IGZ1bGxDb21wYXJlIElmIHByb3ZpZGVkIGFuZCBgZWxlbWVudHNgIGlzIGFscmVhZHkga25vd25cbiAqIHRvIGJlIHNvcnRlZCBieSB0aGlzIGBmdWxsQ29tcGFyZWAsIHRoZW4gd2Ugc2hvdWxkIGdldCBhIG1lbW8gaGl0IHJhdGhlclxuICogdGhhbiBhIHJlc29ydGluZy4gSG93ZXZlciwgY3VycmVudGx5LCB3ZSBzdGlsbCBlbnVtZXJhdGUgdGhlIGVudGlyZSBhcnJheVxuICogZWFjaCB0aW1lLlxuICpcbiAqIFRPRE86IElmIGRvaW5nIHRoaXMgcmVkdW50YW50bHkgdHVybnMgb3V0IHRvIGJlIGV4cGVuc2l2ZSwgd2VcbiAqIGNvdWxkIG1lbW9pemUgdGhpcyBuby1kdXBsaWNhdGUgZmluZGluZyBhcyB3ZWxsLCBpbmRlcGVuZGVudFxuICogb2YgdGhlIGBmdWxsT3JkZXJgIHVzZSB0byByZWFjaCB0aGlzIGZpbmRpbmcuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tOb0R1cGxpY2F0ZXM9KGVsZW1lbnRzLGZ1bGxDb21wYXJlLGNoZWNrKT0+e1xuLyogVGhpcyBmdWxsT3JkZXIgY29udGFpbnMgaGlzdG9yeSBkZXBlbmRlbnQgc3RhdGUuIEl0IGlzIHNwZWNpZmljKi9cbi8qIHRvIHRoaXMgb25lIGNhbGwgYW5kIGRvZXMgbm90IHN1cnZpdmUgaXQuKi9cbi8qIFRPRE8gT25jZSBhbGwgb3VyIHRvb2xpbmcgaXMgcmVhZHkgZm9yIGAmJj1gLCB0aGUgZm9sbG93aW5nKi9cbi8qIGxpbmUgc2hvdWxkIGJlIHJld3JpdHRlbiB1c2luZyBpdC4qL1xuZnVsbENvbXBhcmU9ZnVsbENvbXBhcmV8fG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbmVsZW1lbnRzPXNvcnRCeVJhbmsoZWxlbWVudHMsZnVsbENvbXBhcmUpO1xuY29uc3R7bGVuZ3RofT1lbGVtZW50cztcbmZvcihsZXQgaT0xO2k8bGVuZ3RoO2krPTEpe1xuY29uc3QgazA9ZWxlbWVudHNbaS0xXTtcbmNvbnN0IGsxPWVsZW1lbnRzW2ldO1xuaWYoZnVsbENvbXBhcmUoazAsazEpPT09MCl7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgdmFsdWUgaGFzIGR1cGxpY2F0ZXM6ICR7azB9YCk7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VFtdfSBlbGVtZW50c1xuICogQHBhcmFtIHtGdWxsQ29tcGFyZX0gW2Z1bGxDb21wYXJlXVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnROb0R1cGxpY2F0ZXM9KGVsZW1lbnRzLGZ1bGxDb21wYXJlPXVuZGVmaW5lZCk9PntcbmNoZWNrTm9EdXBsaWNhdGVzKGVsZW1lbnRzLGZ1bGxDb21wYXJlLGFzc2VydENoZWNrZXIpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBlbGVtZW50c1xuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaOKAjV9vbmNlLmFzc2VydE5vRHVwbGljYXRlcyhhc3NlcnROb0R1cGxpY2F0ZXMpO1xuY29uc3QgICAgICAgIGNoZWNrRWxlbWVudHM9KGVsZW1lbnRzLGNoZWNrKT0+e1xuaWYocGFzc1N0eWxlT2YoZWxlbWVudHMpIT09J2NvcHlBcnJheScpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBUaGUga2V5cyBvZiBhIGNvcHlTZXQgb3IgY29weU1hcCBtdXN0IGJlIGEgY29weUFycmF5OiAke2VsZW1lbnRzfWApO1xuXG4gfVxuaWYoIWlzUmFua1NvcnRlZChlbGVtZW50cyxjb21wYXJlQW50aVJhbmspKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgVGhlIGtleXMgb2YgYSBjb3B5U2V0IG9yIGNvcHlNYXAgbXVzdCBiZSBzb3J0ZWQgaW4gcmV2ZXJzZSByYW5rIG9yZGVyOiAke2VsZW1lbnRzfWApO1xuXG4gfVxucmV0dXJuIGNoZWNrTm9EdXBsaWNhdGVzKGVsZW1lbnRzLHVuZGVmaW5lZCxjaGVjayk7XG4gfTskaOKAjV9vbmNlLmNoZWNrRWxlbWVudHMoY2hlY2tFbGVtZW50cyk7XG5oYXJkZW4oY2hlY2tFbGVtZW50cyk7XG5cbmNvbnN0ICAgICAgICBhc3NlcnRFbGVtZW50cz0oZWxlbWVudHMpPT57XG5jaGVja0VsZW1lbnRzKGVsZW1lbnRzLGFzc2VydENoZWNrZXIpO1xuIH07JGjigI1fb25jZS5hc3NlcnRFbGVtZW50cyhhc3NlcnRFbGVtZW50cyk7XG5oYXJkZW4oYXNzZXJ0RWxlbWVudHMpO1xuXG5jb25zdCAgICAgICAgY29lcmNlVG9FbGVtZW50cz0oZWxlbWVudHNMaXN0KT0+e1xuY29uc3QgZWxlbWVudHM9c29ydEJ5UmFuayhlbGVtZW50c0xpc3QsY29tcGFyZUFudGlSYW5rKTtcbmFzc2VydEVsZW1lbnRzKGVsZW1lbnRzKTtcbnJldHVybiBlbGVtZW50cztcbiB9OyRo4oCNX29uY2UuY29lcmNlVG9FbGVtZW50cyhjb2VyY2VUb0VsZW1lbnRzKTtcbmhhcmRlbihjb2VyY2VUb0VsZW1lbnRzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtJdGVyYWJsZTxLPn0gZWxlbWVudEl0ZXJcbiAqIEByZXR1cm5zIHtDb3B5U2V0PEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVNldE9mRWxlbWVudHM9KGVsZW1lbnRJdGVyKT0+XG5tYWtlVGFnZ2VkKCdjb3B5U2V0Jyxjb2VyY2VUb0VsZW1lbnRzKGVsZW1lbnRJdGVyKSk7JGjigI1fb25jZS5tYWtlU2V0T2ZFbGVtZW50cyhtYWtlU2V0T2ZFbGVtZW50cyk7XG5oYXJkZW4obWFrZVNldE9mRWxlbWVudHMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydE5vRHVwbGljYXRlcyI6WyJhc3NlcnROb0R1cGxpY2F0ZXMiXSwiY2hlY2tFbGVtZW50cyI6WyJjaGVja0VsZW1lbnRzIl0sImFzc2VydEVsZW1lbnRzIjpbImFzc2VydEVsZW1lbnRzIl0sImNvZXJjZVRvRWxlbWVudHMiOlsiY29lcmNlVG9FbGVtZW50cyJdLCJtYWtlU2V0T2ZFbGVtZW50cyI6WyJtYWtlU2V0T2ZFbGVtZW50cyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACkj2Y/viQAAL4kAAA0AAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc3siaW1wb3J0cyI6WyIuL2NvcHlCYWcuanMiLCJAZW5kby9tYXJzaGFsL3NyYy9yYW5rT3JkZXIuanMiXSwiZXhwb3J0cyI6WyJiYWdDb21wYXJlIiwiYmFnRGlzam9pbnRTdWJ0cmFjdCIsImJhZ0ludGVyc2VjdGlvbiIsImJhZ0lzRGlzam9pbnQiLCJiYWdJc1N1cGVyYmFnIiwiYmFnVW5pb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0UmFua1NvcnRlZCxjb21wYXJlQW50aVJhbmssbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQsc29ydEJ5UmFuayxhc3NlcnROb0R1cGxpY2F0ZUtleXMsbWFrZUJhZ09mRW50cmllczskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsL3NyYy9yYW5rT3JkZXIuanNcIiwgW1tcImFzc2VydFJhbmtTb3J0ZWRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFJhbmtTb3J0ZWQgPSAkaOKAjV9hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjigI1fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLCBbJGjigI1fYSA9PiAobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAkaOKAjV9hKV1dLFtcInNvcnRCeVJhbmtcIiwgWyRo4oCNX2EgPT4gKHNvcnRCeVJhbmsgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb3B5QmFnLmpzXCIsIFtbXCJhc3NlcnROb0R1cGxpY2F0ZUtleXNcIiwgWyRo4oCNX2EgPT4gKGFzc2VydE5vRHVwbGljYXRlS2V5cyA9ICRo4oCNX2EpXV0sW1wibWFrZUJhZ09mRW50cmllc1wiLCBbJGjigI1fYSA9PiAobWFrZUJhZ09mRW50cmllcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuLyogQmFzZWQgb24gbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcywgYnV0IGFsdGVyZWQgZm9yIHRoZSBiYWcgcmVwcmVzZW50YXRpb24uKi9cbi8qIFRPRE8gc2hhcmUgbW9yZSBjb2RlIHdpdGggbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcywgcmF0aGVyIHRoYW4qL1xuLyogZHVwbGljYXRpbmcgd2l0aCBjaGFuZ2VzLiovXG5cbi8qKlxuICogQXNzZXJ0cyB0aGF0IGBiYWdFbnRyaWVzYCBpcyBhbHJlYWR5IHJhbmsgc29ydGVkIGJ5IGByYW5rQ29tcGFyZWAsIHdoZXJlXG4gKiB0aGVyZVxuICogbWF5IGJlIGNvbnRpZ3VvdXMgcmVnaW9ucyBvZiBiYWdFbnRyaWVzIHdob3NlIGtleXMgYXJlIHRpZWQgZm9yIHRoZSBzYW1lXG4gKiByYW5rLlxuICogUmV0dXJucyBhbiBpdGVyYWJsZSB0aGF0IHdpbGwgZW51bWVyYXRlIGFsbCB0aGUgYmFnRW50cmllcyBpbiBvcmRlclxuICogYWNjb3JkaW5nIHRvIGBmdWxsT3JkZXJgLCB3aGljaCBzaG91bGQgZGlmZmVyIGZyb20gYHJhbmtPcmRlcmAgb25seVxuICogYnkgYmVpbmcgbW9yZSBwcmVjaXNlLlxuICpcbiAqIFRoaXMgc2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gcmVzb3J0aW5nIHRoZSBlbnRpcmUgYGJhZ0VudHJpZXNgIGFycmF5XG4gKiBhY2NvcmRpbmdcbiAqIHRvIGBmdWxsT3JkZXJgLiBIb3dldmVyLCBpdCBvcHRpbWl6ZXMgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZXNlIGNvbnRpZ3VvdXNcbiAqIHJ1bnMgdGhhdCBuZWVkIHRvIGJlIHJlc29ydGVkIGFyZSBlaXRoZXIgYWJzZW50IG9yIHNtYWxsLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1tULGJpZ2ludF1bXX0gYmFnRW50cmllc1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gcmFua0NvbXBhcmVcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmV9IGZ1bGxDb21wYXJlXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W1QsYmlnaW50XT59XG4gKi9cbmNvbnN0IGJhZ1dpbmRvd1Jlc29ydD0oYmFnRW50cmllcyxyYW5rQ29tcGFyZSxmdWxsQ29tcGFyZSk9PntcbmFzc2VydFJhbmtTb3J0ZWQoYmFnRW50cmllcyxyYW5rQ29tcGFyZSk7XG5jb25zdHtsZW5ndGh9PWJhZ0VudHJpZXM7XG5sZXQgaT0wO1xubGV0IG9wdElubmVySXRlcmF0b3I7XG5yZXR1cm4gaGFyZGVuKHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT5cbmhhcmRlbih7XG5uZXh0OigpPT57XG5pZihvcHRJbm5lckl0ZXJhdG9yKXtcbmNvbnN0IHJlc3VsdD1vcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbmlmKHJlc3VsdC5kb25lKXtcbm9wdElubmVySXRlcmF0b3I9dW5kZWZpbmVkO1xuLyogZmFsbCB0aHJvdWdoKi9cbiB9ZWxzZXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbmlmKGk8bGVuZ3RoKXtcbmNvbnN0IGVudHJ5PWJhZ0VudHJpZXNbaV07XG5sZXQgaj1pKzE7XG53aGlsZShcbmo8bGVuZ3RoJiZcbnJhbmtDb21wYXJlKGVudHJ5WzBdLGJhZ0VudHJpZXNbal1bMF0pPT09MClcbntcbmorPTE7XG4gfVxuaWYoaj09PWkrMSl7XG5pPWo7XG5yZXR1cm4gaGFyZGVuKHtkb25lOmZhbHNlLHZhbHVlOmVudHJ5fSk7XG4gfVxuY29uc3Qgc2ltaWxhclJ1bj1iYWdFbnRyaWVzLnNsaWNlKGksaik7XG5pPWo7XG5jb25zdCByZXNvcnRlZD1zb3J0QnlSYW5rKHNpbWlsYXJSdW4sZnVsbENvbXBhcmUpO1xuLyogUHJvdmlkaW5nIHRoZSBzYW1lIGBmdWxsQ29tcGFyZWAgc2hvdWxkIGNhdXNlIGEgbWVtbyBoaXQqL1xuLyogd2l0aGluIGBhc3NlcnROb0R1cGxpY2F0ZXNgIGVuYWJsaW5nIGl0IHRvIGF2b2lkIGEqL1xuLyogcmVkdW5kYW50IHJlc29ydGluZy4qL1xuYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzKHJlc29ydGVkLGZ1bGxDb21wYXJlKTtcbi8qIFRoaXMgaXMgdGhlIHJhdyBKUyBhcnJheSBpdGVyYXRvciB3aG9zZSBgLm5leHQoKWAgbWV0aG9kKi9cbi8qIGRvZXMgbm90IGhhcmRlbiB0aGUgSXRlcmF0b3JSZXN1bHQsIGluIHZpb2xhdGlvbiBvZiBvdXIqL1xuLyogY29udmVudGlvbnMuIEZpeGluZyB0aGlzIGlzIGV4cGVuc2l2ZSBhbmQgSSdtIGNvbmZpZGVudCB0aGUqL1xuLyogdW5mcm96ZW4gdmFsdWUgZG9lcyBub3QgZXNjYXBlIHRoaXMgZmlsZSwgc28gSSdtIGxlYXZpbmcgdGhpcyovXG4vKiBhcyBpcy4qL1xub3B0SW5uZXJJdGVyYXRvcj1yZXNvcnRlZFtTeW1ib2wuaXRlcmF0b3JdKCk7XG5yZXR1cm4gb3B0SW5uZXJJdGVyYXRvci5uZXh0KCk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHtkb25lOnRydWUsdmFsdWU6W251bGwsMG5dfSk7XG4gfVxuIH19KX0pO1xuXG5cbiB9O1xuXG4vKipcbiAqIFJldHVybnMgYW4gaXRlcmFibGUgd2hvc2UgaXRlcmF0aW9uIHJlc3VsdHMgYXJlIFtrZXksIHhDb3VudCwgeUNvdW50XSB0dXBsZXNcbiAqIHJlcHJlc2VudGluZyB0aGUgbmV4dCBrZXkgaW4gdGhlIGxvY2FsIGZ1bGwgb3JkZXIsIGFzIHdlbGwgYXMgaG93IG1hbnlcbiAqIHRpbWVzIGl0IG9jY3VycmVkIGluIHRoZSB4IGlucHV0IGl0ZXJhdG9yIGFuZCB0aGUgeSBpbnB1dCBpdGVyYXRvci5cbiAqXG4gKiBGb3Igc2V0cywgdGhlc2UgY291bnRzIGFyZSBhbHdheXMgMCBvciAxLCBidXQgdGhpcyByZXByZXNlbnRhdGlvblxuICogZ2VuZXJhbGl6ZXMgbmljZWx5IGZvciBiYWdzLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1tULGJpZ2ludF1bXX0geGJhZ0VudHJpZXNcbiAqIEBwYXJhbSB7W1QsYmlnaW50XVtdfSB5YmFnRW50cmllc1xuICogQHJldHVybnMge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn1cbiAqL1xuY29uc3QgbWVyZ2U9KHhiYWdFbnRyaWVzLHliYWdFbnRyaWVzKT0+e1xuLyogVGhpcyBmdWxsT3JkZXIgY29udGFpbnMgaGlzdG9yeSBkZXBlbmRlbnQgc3RhdGUuIEl0IGlzIHNwZWNpZmljKi9cbi8qIHRvIHRoaXMgb25lIGBtZXJnZWAgY2FsbCBhbmQgZG9lcyBub3Qgc3Vydml2ZSBpdC4qL1xuY29uc3QgZnVsbENvbXBhcmU9bWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcblxuY29uc3QgeHM9YmFnV2luZG93UmVzb3J0KHhiYWdFbnRyaWVzLGNvbXBhcmVBbnRpUmFuayxmdWxsQ29tcGFyZSk7XG5jb25zdCB5cz1iYWdXaW5kb3dSZXNvcnQoeWJhZ0VudHJpZXMsY29tcGFyZUFudGlSYW5rLGZ1bGxDb21wYXJlKTtcbnJldHVybiBoYXJkZW4oe1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9Pntcbi8qIFRoZXNlIHNpeCBgbGV0YCB2YXJpYWJsZXMgYXJlIGJ1ZmZlcmluZyBvbmUgYWhlYWQgZnJvbSB0aGUgdW5kZXJseWluZyovXG4vKiBpdGVyYXRvcnMuIEVhY2ggaXRlcmF0aW9uIHJlcG9ydHMgb25lIG9yIHRoZSBvdGhlciBvciBib3RoLCBhbmQqL1xuLyogdGhlbiByZWZpbGxzIHRoZSBidWZmZXJzIG9mIHRob3NlIGl0IGFkdmFuY2VkLiovXG4vKiogQHR5cGUge1R9ICovXG5sZXQgeDtcbmxldCB4YztcbmxldCB4RG9uZTtcbi8qKiBAdHlwZSB7VH0gKi9cbmxldCB5O1xubGV0IHljO1xubGV0IHlEb25lO1xuXG5jb25zdCB4aT14c1tTeW1ib2wuaXRlcmF0b3JdKCk7XG5jb25zdCBuZXh0WD0oKT0+e1xuIXhEb25lfHxGYWlsIGBJbnRlcm5hbDogbmV4dFggc2hvdWxkIG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbih7XG5kb25lOnhEb25lLFxudmFsdWU6W3gseGNdfT1cbnhpLm5leHQoKSk7XG4gfTtcbm5leHRYKCk7XG5cbmNvbnN0IHlpPXlzW1N5bWJvbC5pdGVyYXRvcl0oKTtcbmNvbnN0IG5leHRZPSgpPT57XG4heURvbmV8fEZhaWwgYEludGVybmFsOiBuZXh0WSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuKHtcbmRvbmU6eURvbmUsXG52YWx1ZTpbeSx5Y119PVxueWkubmV4dCgpKTtcbiB9O1xubmV4dFkoKTtcblxucmV0dXJuIGhhcmRlbih7XG5uZXh0OigpPT57XG4vKiogQHR5cGUge2Jvb2xlYW59ICovXG5sZXQgZG9uZT1mYWxzZTtcbi8qKiBAdHlwZSB7W1QsYmlnaW50LGJpZ2ludF19ICovXG5sZXQgdmFsdWU7XG5pZih4RG9uZSYmeURvbmUpe1xuZG9uZT10cnVlO1xuLyogQHRzLWV4cGVjdC1lcnJvciBCZWNhdXNlIHRoZSB0ZXJtaW5hdGluZyB2YWx1ZSBkb2VzIG5vdCBtYXR0ZXIqL1xudmFsdWU9W251bGwsMG4sMG5dO1xuIH1lbHNlIGlmKHhEb25lKXtcbi8qIG9ubHkgeXMgYXJlIGxlZnQqL1xudmFsdWU9W3ksMG4seWNdO1xubmV4dFkoKTtcbiB9ZWxzZSBpZih5RG9uZSl7XG4vKiBvbmx5IHhzIGFyZSBsZWZ0Ki9cbnZhbHVlPVt4LHhjLDBuXTtcbm5leHRYKCk7XG4gfWVsc2V7XG5jb25zdCBjb21wPWZ1bGxDb21wYXJlKHgseSk7XG5pZihjb21wPT09MCl7XG4vKiB4IGFuZCB5IGFyZSBlcXVpdmFsZW50LCBzbyByZXBvcnQgYm90aCovXG52YWx1ZT1beCx4Yyx5Y107XG5uZXh0WCgpO1xubmV4dFkoKTtcbiB9ZWxzZSBpZihjb21wPDApe1xuLyogeCBpcyBlYXJsaWVyLCBzbyByZXBvcnQgaXQqL1xudmFsdWU9W3gseGMsMG5dO1xubmV4dFgoKTtcbiB9ZWxzZXtcbi8qIHkgaXMgZWFybGllciwgc28gcmVwb3J0IGl0Ki9cbmNvbXA+MHx8RmFpbCBgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgY29tcCAke3EoY29tcCl9YDtcbnZhbHVlPVt5LDBuLHljXTtcbm5leHRZKCk7XG4gfVxuIH1cbnJldHVybiBoYXJkZW4oe2RvbmUsdmFsdWV9KTtcbiB9fSk7XG5cbiB9fSk7XG5cbiB9O1xuaGFyZGVuKG1lcmdlKTtcblxuLyogV2Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlIHRoaXMgZm9yIGl0ZXJJc1N1cGVyc2V0IGFzIHdlbGwuKi9cbi8qIFRoZSBnZW5lcmFsaXphdGlvbiBpcyBmcmVlLiovXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgYmFnSXRlcklzU3VwZXJiYWc9KHh5aSk9PntcbmZvcihjb25zdFtfbSx4Yyx5Y11vZiB4eWkpe1xuaWYoeGM8eWMpe1xuLyogc29tZXRoaW5nIGluIHkgaXMgbm90IGluIHgsIHNvIHggaXMgbm90IGEgc3VwZXJiYWcgb2YgeSovXG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07XG5cbi8qIFdlIHNob3VsZCBiZSBhYmxlIHRvIHVzZSB0aGlzIGZvciBpdGVySXNEaXNqb2ludCBhcyB3ZWxsLiovXG4vKiBUaGUgY29kZSBpcyBpZGVudGljYWwuKi9cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBiYWdJdGVySXNEaXNqb2ludD0oeHlpKT0+e1xuZm9yKGNvbnN0W19tLHhjLHljXW9mIHh5aSl7XG5pZih4Yz49MW4mJnljPj0xbil7XG4vKiBTb21ldGhpbmcgaW4gYm90aCwgc28gbm90IGRpc2pvaW50Ki9cbnJldHVybiBmYWxzZTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcblxuLyogV2Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlIHRoaXMgZm9yIGl0ZXJDb21wYXJlIGFzIHdlbGwuKi9cbi8qIFRoZSBnZW5lcmFsaXphdGlvbiBpcyBmcmVlLiovXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7S2V5Q29tcGFyaXNvbn1cbiAqL1xuY29uc3QgYmFnSXRlckNvbXBhcmU9KHh5aSk9PntcbmxldCBsb25lWT1mYWxzZTtcbmxldCBsb25lWD1mYWxzZTtcbmZvcihjb25zdFtfbSx4Yyx5Y11vZiB4eWkpe1xuaWYoeGM8eWMpe1xuLyogc29tZXRoaW5nIGluIHkgaXMgbm90IGluIHgsIHNvIHggaXMgbm90IGEgc3VwZXJiYWcgb2YgeSovXG5sb25lWT10cnVlO1xuIH1cbmlmKHhjPnljKXtcbi8qIHNvbWV0aGluZyBpbiB4IGlzIG5vdCBpbiB5LCBzbyB5IGlzIG5vdCBhIHN1cGVyYmFnIG9mIHgqL1xubG9uZVg9dHJ1ZTtcbiB9XG5pZihsb25lWCYmbG9uZVkpe1xucmV0dXJuIE5hTjtcbiB9XG4gfVxuaWYobG9uZVgpe1xucmV0dXJuIDE7XG4gfWVsc2UgaWYobG9uZVkpe1xucmV0dXJuLTE7XG4gfWVsc2V7XG4hbG9uZVgmJiFsb25lWXx8XG5GYWlsIGBJbnRlcm5hbDogVW5leHBlY3RlZCBsb25lIHBhaXIgJHtxKFtsb25lWCxsb25lWV0pfWA7XG5yZXR1cm4gMDtcbiB9XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtbVCxiaWdpbnQsYmlnaW50XVtdfSB4eWlcbiAqIEByZXR1cm5zIHtbVCxiaWdpbnRdW119XG4gKi9cbmNvbnN0IGJhZ0l0ZXJVbmlvbj0oeHlpKT0+e1xuLyoqIEB0eXBlIHtbVCxiaWdpbnRdW119ICovXG5jb25zdCByZXN1bHQ9W107XG5mb3IoY29uc3RbbSx4Yyx5Y11vZiB4eWkpe1xucmVzdWx0LnB1c2goW20seGMreWNdKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtbVCxiaWdpbnRdW119XG4gKi9cbmNvbnN0IGJhZ0l0ZXJJbnRlcnNlY3Rpb249KHh5aSk9Pntcbi8qKiBAdHlwZSB7W1QsYmlnaW50XVtdfSAqL1xuY29uc3QgcmVzdWx0PVtdO1xuZm9yKGNvbnN0W20seGMseWNdb2YgeHlpKXtcbmNvbnN0IG1jPXhjPD15Yz94Yzp5YztcbnJlc3VsdC5wdXNoKFttLG1jXSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7W1QsYmlnaW50XVtdfVxuICovXG5jb25zdCBiYWdJdGVyRGlzam9pbnRTdWJ0cmFjdD0oeHlpKT0+e1xuLyoqIEB0eXBlIHtbVCxiaWdpbnRdW119ICovXG5jb25zdCByZXN1bHQ9W107XG5mb3IoY29uc3RbbSx4Yyx5Y11vZiB4eWkpe1xuY29uc3QgbWM9eGMteWM7XG5tYz49MG58fEZhaWwgYHJpZ2h0IGVsZW1lbnQgJHttfSB3YXMgbm90IGluIGxlZnRgO1xuaWYobWM+PTFuKXtcbi8qIHRoZSB4IHdhcyBub3QgaW4geSovXG5yZXN1bHQucHVzaChbbSxtY10pO1xuIH1cbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbmNvbnN0IG1lcmdlaWZ5PShiYWdJdGVyT3ApPT4oeGJhZ0VudHJpZXMseWJhZ0VudHJpZXMpPT5cbmJhZ0l0ZXJPcChtZXJnZSh4YmFnRW50cmllcyx5YmFnRW50cmllcykpO1xuXG5jb25zdCBiYWdFbnRyaWVzSXNTdXBlcmJhZz1tZXJnZWlmeShiYWdJdGVySXNTdXBlcmJhZyk7XG5jb25zdCBiYWdFbnRyaWVzSXNEaXNqb2ludD1tZXJnZWlmeShiYWdJdGVySXNEaXNqb2ludCk7XG5jb25zdCBiYWdFbnRyaWVzQ29tcGFyZT1tZXJnZWlmeShiYWdJdGVyQ29tcGFyZSk7XG5jb25zdCBiYWdFbnRyaWVzVW5pb249bWVyZ2VpZnkoYmFnSXRlclVuaW9uKTtcbmNvbnN0IGJhZ0VudHJpZXNJbnRlcnNlY3Rpb249bWVyZ2VpZnkoYmFnSXRlckludGVyc2VjdGlvbik7XG5jb25zdCBiYWdFbnRyaWVzRGlzam9pbnRTdWJ0cmFjdD1tZXJnZWlmeShiYWdJdGVyRGlzam9pbnRTdWJ0cmFjdCk7XG5cbmNvbnN0IHJhd0JhZ2lmeT0oYmFnRW50cmllc09wKT0+KHhiYWcseWJhZyk9PlxuYmFnRW50cmllc09wKHhiYWcucGF5bG9hZCx5YmFnLnBheWxvYWQpO1xuXG5jb25zdCBiYWdpZnk9KGJhZ0VudHJpZXNPcCk9Pih4YmFnLHliYWcpPT5cbm1ha2VCYWdPZkVudHJpZXMoYmFnRW50cmllc09wKHhiYWcucGF5bG9hZCx5YmFnLnBheWxvYWQpKTtcblxuY29uc3QgICAgICAgIGJhZ0lzU3VwZXJiYWc9cmF3QmFnaWZ5KGJhZ0VudHJpZXNJc1N1cGVyYmFnKTskaOKAjV9vbmNlLmJhZ0lzU3VwZXJiYWcoYmFnSXNTdXBlcmJhZyk7XG5jb25zdCAgICAgICAgYmFnSXNEaXNqb2ludD1yYXdCYWdpZnkoYmFnRW50cmllc0lzRGlzam9pbnQpOyRo4oCNX29uY2UuYmFnSXNEaXNqb2ludChiYWdJc0Rpc2pvaW50KTtcbmNvbnN0ICAgICAgICBiYWdDb21wYXJlPXJhd0JhZ2lmeShiYWdFbnRyaWVzQ29tcGFyZSk7JGjigI1fb25jZS5iYWdDb21wYXJlKGJhZ0NvbXBhcmUpO1xuY29uc3QgICAgICAgIGJhZ1VuaW9uPWJhZ2lmeShiYWdFbnRyaWVzVW5pb24pOyRo4oCNX29uY2UuYmFnVW5pb24oYmFnVW5pb24pO1xuY29uc3QgICAgICAgIGJhZ0ludGVyc2VjdGlvbj1iYWdpZnkoYmFnRW50cmllc0ludGVyc2VjdGlvbik7JGjigI1fb25jZS5iYWdJbnRlcnNlY3Rpb24oYmFnSW50ZXJzZWN0aW9uKTtcbmNvbnN0ICAgICAgICBiYWdEaXNqb2ludFN1YnRyYWN0PWJhZ2lmeShiYWdFbnRyaWVzRGlzam9pbnRTdWJ0cmFjdCk7JGjigI1fb25jZS5iYWdEaXNqb2ludFN1YnRyYWN0KGJhZ0Rpc2pvaW50U3VidHJhY3QpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImJhZ0lzU3VwZXJiYWciOlsiYmFnSXNTdXBlcmJhZyJdLCJiYWdJc0Rpc2pvaW50IjpbImJhZ0lzRGlzam9pbnQiXSwiYmFnQ29tcGFyZSI6WyJiYWdDb21wYXJlIl0sImJhZ1VuaW9uIjpbImJhZ1VuaW9uIl0sImJhZ0ludGVyc2VjdGlvbiI6WyJiYWdJbnRlcnNlY3Rpb24iXSwiYmFnRGlzam9pbnRTdWJ0cmFjdCI6WyJiYWdEaXNqb2ludFN1YnRyYWN0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANCZcIfjJwAA4ycAADQAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzeyJpbXBvcnRzIjpbIi4vY29weVNldC5qcyIsIkBlbmRvL21hcnNoYWwvc3JjL3JhbmtPcmRlci5qcyJdLCJleHBvcnRzIjpbImVsZW1lbnRzQ29tcGFyZSIsImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCIsImVsZW1lbnRzRGlzam9pbnRVbmlvbiIsImVsZW1lbnRzSW50ZXJzZWN0aW9uIiwiZWxlbWVudHNJc0Rpc2pvaW50IiwiZWxlbWVudHNJc1N1cGVyc2V0IiwiZWxlbWVudHNVbmlvbiIsInNldENvbXBhcmUiLCJzZXREaXNqb2ludFN1YnRyYWN0Iiwic2V0RGlzam9pbnRVbmlvbiIsInNldEludGVyc2VjdGlvbiIsInNldElzRGlzam9pbnQiLCJzZXRJc1N1cGVyc2V0Iiwic2V0VW5pb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0UmFua1NvcnRlZCxjb21wYXJlQW50aVJhbmssbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQsc29ydEJ5UmFuayxhc3NlcnROb0R1cGxpY2F0ZXMsbWFrZVNldE9mRWxlbWVudHM7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbC9zcmMvcmFua09yZGVyLmpzXCIsIFtbXCJhc3NlcnRSYW5rU29ydGVkXCIsIFskaOKAjV9hID0+IChhc3NlcnRSYW5rU29ydGVkID0gJGjigI1fYSldXSxbXCJjb21wYXJlQW50aVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRo4oCNX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjigI1fYSldXSxbXCJzb3J0QnlSYW5rXCIsIFskaOKAjV9hID0+IChzb3J0QnlSYW5rID0gJGjigI1fYSldXV1dLFtcIi4vY29weVNldC5qc1wiLCBbW1wiYXNzZXJ0Tm9EdXBsaWNhdGVzXCIsIFskaOKAjV9hID0+IChhc3NlcnROb0R1cGxpY2F0ZXMgPSAkaOKAjV9hKV1dLFtcIm1ha2VTZXRPZkVsZW1lbnRzXCIsIFskaOKAjV9hID0+IChtYWtlU2V0T2ZFbGVtZW50cyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgYGVsZW1lbnRzYCBpcyBhbHJlYWR5IHJhbmsgc29ydGVkIGJ5IGByYW5rQ29tcGFyZWAsIHdoZXJlIHRoZXJlXG4gKiBtYXkgYmUgY29udGlndW91cyByZWdpb25zIG9mIGVsZW1lbnRzIHRpZWQgZm9yIHRoZSBzYW1lIHJhbmsuXG4gKiBSZXR1cm5zIGFuIGl0ZXJhYmxlIHRoYXQgd2lsbCBlbnVtZXJhdGUgYWxsIHRoZSBlbGVtZW50cyBpbiBvcmRlclxuICogYWNjb3JkaW5nIHRvIGBmdWxsT3JkZXJgLCB3aGljaCBzaG91bGQgZGlmZmVyIGZyb20gYHJhbmtPcmRlcmAgb25seVxuICogYnkgYmVpbmcgbW9yZSBwcmVjaXNlLlxuICpcbiAqIFRoaXMgc2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gcmVzb3J0aW5nIHRoZSBlbnRpcmUgYGVsZW1lbnRzYCBhcnJheSBhY2NvcmRpbmdcbiAqICB0byBgZnVsbE9yZGVyYC4gSG93ZXZlciwgaXQgb3B0aW1pemVzIGZvciB0aGUgY2FzZSB3aGVyZSB0aGVzZSBjb250aWd1b3VzXG4gKiBydW5zIHRoYXQgbmVlZCB0byBiZSByZXNvcnRlZCBhcmUgZWl0aGVyIGFic2VudCBvciBzbWFsbC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUW119IGVsZW1lbnRzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSByYW5rQ29tcGFyZVxuICogQHBhcmFtIHtGdWxsQ29tcGFyZX0gZnVsbENvbXBhcmVcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxUPn1cbiAqL1xuY29uc3Qgd2luZG93UmVzb3J0PShlbGVtZW50cyxyYW5rQ29tcGFyZSxmdWxsQ29tcGFyZSk9PntcbmFzc2VydFJhbmtTb3J0ZWQoZWxlbWVudHMscmFua0NvbXBhcmUpO1xuY29uc3R7bGVuZ3RofT1lbGVtZW50cztcbmxldCBpPTA7XG5sZXQgb3B0SW5uZXJJdGVyYXRvcjtcbnJldHVybiBoYXJkZW4oe1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PlxuaGFyZGVuKHtcbm5leHQ6KCk9PntcbmlmKG9wdElubmVySXRlcmF0b3Ipe1xuY29uc3QgcmVzdWx0PW9wdElubmVySXRlcmF0b3IubmV4dCgpO1xuaWYocmVzdWx0LmRvbmUpe1xub3B0SW5uZXJJdGVyYXRvcj11bmRlZmluZWQ7XG4vKiBmYWxsIHRocm91Z2gqL1xuIH1lbHNle1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfVxuaWYoaTxsZW5ndGgpe1xuY29uc3QgdmFsdWU9ZWxlbWVudHNbaV07XG5sZXQgaj1pKzE7XG53aGlsZShqPGxlbmd0aCYmcmFua0NvbXBhcmUodmFsdWUsZWxlbWVudHNbal0pPT09MCl7XG5qKz0xO1xuIH1cbmlmKGo9PT1pKzEpe1xuaT1qO1xucmV0dXJuIGhhcmRlbih7ZG9uZTpmYWxzZSx2YWx1ZX0pO1xuIH1cbmNvbnN0IHNpbWlsYXJSdW49ZWxlbWVudHMuc2xpY2UoaSxqKTtcbmk9ajtcbmNvbnN0IHJlc29ydGVkPXNvcnRCeVJhbmsoc2ltaWxhclJ1bixmdWxsQ29tcGFyZSk7XG4vKiBQcm92aWRpbmcgdGhlIHNhbWUgYGZ1bGxDb21wYXJlYCBzaG91bGQgY2F1c2UgYSBtZW1vIGhpdCovXG4vKiB3aXRoaW4gYGFzc2VydE5vRHVwbGljYXRlc2AgZW5hYmxpbmcgaXQgdG8gYXZvaWQgYSovXG4vKiByZWR1bmRhbnQgcmVzb3J0aW5nLiovXG5hc3NlcnROb0R1cGxpY2F0ZXMocmVzb3J0ZWQsZnVsbENvbXBhcmUpO1xuLyogVGhpcyBpcyB0aGUgcmF3IEpTIGFycmF5IGl0ZXJhdG9yIHdob3NlIGAubmV4dCgpYCBtZXRob2QqL1xuLyogZG9lcyBub3QgaGFyZGVuIHRoZSBJdGVyYXRvclJlc3VsdCwgaW4gdmlvbGF0aW9uIG9mIG91ciovXG4vKiBjb252ZW50aW9ucy4gRml4aW5nIHRoaXMgaXMgZXhwZW5zaXZlIGFuZCBJJ20gY29uZmlkZW50IHRoZSovXG4vKiB1bmZyb3plbiB2YWx1ZSBkb2VzIG5vdCBlc2NhcGUgdGhpcyBmaWxlLCBzbyBJJ20gbGVhdmluZyB0aGlzKi9cbi8qIGFzIGlzLiovXG5vcHRJbm5lckl0ZXJhdG9yPXJlc29ydGVkW1N5bWJvbC5pdGVyYXRvcl0oKTtcbnJldHVybiBvcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbiB9ZWxzZXtcbnJldHVybiBoYXJkZW4oe2RvbmU6dHJ1ZSx2YWx1ZTpudWxsfSk7XG4gfVxuIH19KX0pO1xuXG5cbiB9O1xuXG4vKipcbiAqIFJldHVybnMgYW4gaXRlcmFibGUgd2hvc2UgaXRlcmF0aW9uIHJlc3VsdHMgYXJlIFtrZXksIHhDb3VudCwgeUNvdW50XSB0dXBsZXNcbiAqIHJlcHJlc2VudGluZyB0aGUgbmV4dCBrZXkgaW4gdGhlIGxvY2FsIGZ1bGwgb3JkZXIsIGFzIHdlbGwgYXMgaG93IG1hbnlcbiAqIHRpbWVzIGl0IG9jY3VycmVkIGluIHRoZSB4IGlucHV0IGl0ZXJhdG9yIGFuZCB0aGUgeSBpbnB1dCBpdGVyYXRvci5cbiAqXG4gKiBGb3Igc2V0cywgdGhlc2UgY291bnRzIGFyZSBhbHdheXMgMCBvciAxLCBidXQgdGhpcyByZXByZXNlbnRhdGlvblxuICogZ2VuZXJhbGl6ZXMgbmljZWx5IGZvciBiYWdzLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1RbXX0geGVsZW1lbnRzXG4gKiBAcGFyYW0ge1RbXX0geWVsZW1lbnRzXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fVxuICovXG5jb25zdCBtZXJnZT0oeGVsZW1lbnRzLHllbGVtZW50cyk9Pntcbi8qIFRoaXMgZnVsbE9yZGVyIGNvbnRhaW5zIGhpc3RvcnkgZGVwZW5kZW50IHN0YXRlLiBJdCBpcyBzcGVjaWZpYyovXG4vKiB0byB0aGlzIG9uZSBgbWVyZ2VgIGNhbGwgYW5kIGRvZXMgbm90IHN1cnZpdmUgaXQuKi9cbmNvbnN0IGZ1bGxDb21wYXJlPW1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbmNvbnN0IHhzPXdpbmRvd1Jlc29ydCh4ZWxlbWVudHMsY29tcGFyZUFudGlSYW5rLGZ1bGxDb21wYXJlKTtcbmNvbnN0IHlzPXdpbmRvd1Jlc29ydCh5ZWxlbWVudHMsY29tcGFyZUFudGlSYW5rLGZ1bGxDb21wYXJlKTtcbnJldHVybiBoYXJkZW4oe1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9Pntcbi8qIFRoZXNlIGZvdXIgYGxldGAgdmFyaWFibGVzIGFyZSBidWZmZXJpbmcgb25lIGFoZWFkIGZyb20gdGhlIHVuZGVybHlpbmcqL1xuLyogaXRlcmF0b3JzLiBFYWNoIGl0ZXJhdGlvbiByZXBvcnRzIG9uZSBvciB0aGUgb3RoZXIgb3IgYm90aCwgYW5kKi9cbi8qIHRoZW4gcmVmaWxscyB0aGUgYnVmZmVycyBvZiB0aG9zZSBpdCBhZHZhbmNlZC4qL1xuLyoqIEB0eXBlIHtUfSAqL1xubGV0IHg7XG5sZXQgeERvbmU7XG4vKiogQHR5cGUge1R9ICovXG5sZXQgeTtcbmxldCB5RG9uZTtcblxuY29uc3QgeGk9eHNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuY29uc3QgbmV4dFg9KCk9PntcbiF4RG9uZXx8RmFpbCBgSW50ZXJuYWw6IG5leHRYIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4oe2RvbmU6eERvbmUsdmFsdWU6eH09eGkubmV4dCgpKTtcbiB9O1xubmV4dFgoKTtcblxuY29uc3QgeWk9eXNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuY29uc3QgbmV4dFk9KCk9PntcbiF5RG9uZXx8RmFpbCBgSW50ZXJuYWw6IG5leHRZIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4oe2RvbmU6eURvbmUsdmFsdWU6eX09eWkubmV4dCgpKTtcbiB9O1xubmV4dFkoKTtcblxucmV0dXJuIGhhcmRlbih7XG5uZXh0OigpPT57XG4vKiogQHR5cGUge2Jvb2xlYW59ICovXG5sZXQgZG9uZT1mYWxzZTtcbi8qKiBAdHlwZSB7W1QsYmlnaW50LGJpZ2ludF19ICovXG5sZXQgdmFsdWU7XG5pZih4RG9uZSYmeURvbmUpe1xuZG9uZT10cnVlO1xuLyogQHRzLWV4cGVjdC1lcnJvciBCZWNhdXNlIHRoZSB0ZXJtaW5hdGluZyB2YWx1ZSBkb2VzIG5vdCBtYXR0ZXIqL1xudmFsdWU9W251bGwsMG4sMG5dO1xuIH1lbHNlIGlmKHhEb25lKXtcbi8qIG9ubHkgeXMgYXJlIGxlZnQqL1xudmFsdWU9W3ksMG4sMW5dO1xubmV4dFkoKTtcbiB9ZWxzZSBpZih5RG9uZSl7XG4vKiBvbmx5IHhzIGFyZSBsZWZ0Ki9cbnZhbHVlPVt4LDFuLDBuXTtcbm5leHRYKCk7XG4gfWVsc2V7XG5jb25zdCBjb21wPWZ1bGxDb21wYXJlKHgseSk7XG5pZihjb21wPT09MCl7XG4vKiB4IGFuZCB5IGFyZSBlcXVpdmFsZW50LCBzbyByZXBvcnQgYm90aCovXG52YWx1ZT1beCwxbiwxbl07XG5uZXh0WCgpO1xubmV4dFkoKTtcbiB9ZWxzZSBpZihjb21wPDApe1xuLyogeCBpcyBlYXJsaWVyLCBzbyByZXBvcnQgaXQqL1xudmFsdWU9W3gsMW4sMG5dO1xubmV4dFgoKTtcbiB9ZWxzZXtcbi8qIHkgaXMgZWFybGllciwgc28gcmVwb3J0IGl0Ki9cbmNvbXA+MHx8RmFpbCBgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgY29tcCAke3EoY29tcCl9YDtcbnZhbHVlPVt5LDBuLDFuXTtcbm5leHRZKCk7XG4gfVxuIH1cbnJldHVybiBoYXJkZW4oe2RvbmUsdmFsdWV9KTtcbiB9fSk7XG5cbiB9fSk7XG5cbiB9O1xuaGFyZGVuKG1lcmdlKTtcblxuY29uc3QgaXRlcklzU3VwZXJzZXQ9KHh5aSk9PntcbmZvcihjb25zdFtfbSx4YyxfeWNdb2YgeHlpKXtcbmlmKHhjPT09MG4pe1xuLyogc29tZXRoaW5nIGluIHkgaXMgbm90IGluIHgsIHNvIHggaXMgbm90IGEgc3VwZXJzZXQgb2YgeSovXG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBpdGVySXNEaXNqb2ludD0oeHlpKT0+e1xuZm9yKGNvbnN0W19tLHhjLHljXW9mIHh5aSl7XG5pZih4Yz49MW4mJnljPj0xbil7XG4vKiBTb21ldGhpbmcgaW4gYm90aCwgc28gbm90IGRpc2pvaW50Ki9cbnJldHVybiBmYWxzZTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge0tleUNvbXBhcmlzb259XG4gKi9cbmNvbnN0IGl0ZXJDb21wYXJlPSh4eWkpPT57XG5sZXQgbG9uZVk9ZmFsc2U7XG5sZXQgbG9uZVg9ZmFsc2U7XG5mb3IoY29uc3RbX20seGMseWNdb2YgeHlpKXtcbmlmKHhjPT09MG4pe1xuLyogc29tZXRoaW5nIGluIHkgaXMgbm90IGluIHgsIHNvIHggaXMgbm90IGEgc3VwZXJzZXQgb2YgeSovXG5sb25lWT10cnVlO1xuIH1cbmlmKHljPT09MG4pe1xuLyogc29tZXRoaW5nIGluIHggaXMgbm90IGluIHksIHNvIHkgaXMgbm90IGEgc3VwZXJzZXQgb2YgeCovXG5sb25lWD10cnVlO1xuIH1cbmlmKGxvbmVYJiZsb25lWSl7XG5yZXR1cm4gTmFOO1xuIH1cbiB9XG5pZihsb25lWCl7XG5yZXR1cm4gMTtcbiB9ZWxzZSBpZihsb25lWSl7XG5yZXR1cm4tMTtcbiB9ZWxzZXtcbiFsb25lWCYmIWxvbmVZfHxcbkZhaWwgYEludGVybmFsOiBVbmV4cGVjdGVkIGxvbmUgcGFpciAke3EoW2xvbmVYLGxvbmVZXSl9YDtcbnJldHVybiAwO1xuIH1cbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG5jb25zdCBpdGVyVW5pb249KHh5aSk9PntcbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG5pZih4Yz49MG4pe1xucmVzdWx0LnB1c2gobSk7XG4gfWVsc2V7XG55Yz49MG58fEZhaWwgYEludGVybmFsOiBVbmV4cGVjdGVkIGNvdW50ICR7cSh5Yyl9YDtcbi8qIGlmIHggYW5kIHkgd2VyZSBib3RoIHJlYWR5LCB0aGVuIHRoZXkgd2VyZSBlcXVpdmFsZW50IGFuZCovXG4vKiBhYm92ZSBjbGF1c2UgYWxyZWFkeSB0b29rIGNhcmUgb2YgaXQuIE90aGVyd2lzZSBwdXNoIGhlcmUuKi9cbnJlc3VsdC5wdXNoKG0pO1xuIH1cbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtUW119XG4gKi9cbmNvbnN0IGl0ZXJEaXNqb2ludFVuaW9uPSh4eWkpPT57XG5jb25zdCByZXN1bHQ9W107XG5mb3IoY29uc3RbbSx4Yyx5Y11vZiB4eWkpe1xueGM9PT0wbnx8eWM9PT0wbnx8RmFpbCBgU2V0cyBtdXN0IG5vdCBoYXZlIGNvbW1vbiBlbGVtZW50czogJHttfWA7XG5pZih4Yz49MW4pe1xucmVzdWx0LnB1c2gobSk7XG4gfWVsc2V7XG55Yz49MW58fEZhaWwgYEludGVybmFsOiBVbmV4cGVjdGVkIGNvdW50ICR7cSh5Yyl9YDtcbnJlc3VsdC5wdXNoKG0pO1xuIH1cbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtUW119XG4gKi9cbmNvbnN0IGl0ZXJJbnRlcnNlY3Rpb249KHh5aSk9PntcbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG5pZih4Yz49MW4mJnljPj0xbil7XG4vKiBJZiB0aGV5IGFyZSBib3RoIHByZXNlbnQsIHRoZW4gdGhleSB3ZXJlIGVxdWl2YWxlbnQqL1xucmVzdWx0LnB1c2gobSk7XG4gfVxuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge1RbXX1cbiAqL1xuY29uc3QgaXRlckRpc2pvaW50U3VidHJhY3Q9KHh5aSk9PntcbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG54Yz49MW58fEZhaWwgYHJpZ2h0IGVsZW1lbnQgJHttfSB3YXMgbm90IGluIGxlZnRgO1xuaWYoeWM9PT0wbil7XG4vKiB0aGUgeCB3YXMgbm90IGluIHkqL1xucmVzdWx0LnB1c2gobSk7XG4gfVxuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuY29uc3QgbWVyZ2VpZnk9KGl0ZXJPcCk9Pih4ZWxlbWVudHMseWVsZW1lbnRzKT0+XG5pdGVyT3AobWVyZ2UoeGVsZW1lbnRzLHllbGVtZW50cykpO1xuXG5jb25zdCAgICAgICAgZWxlbWVudHNJc1N1cGVyc2V0PW1lcmdlaWZ5KGl0ZXJJc1N1cGVyc2V0KTskaOKAjV9vbmNlLmVsZW1lbnRzSXNTdXBlcnNldChlbGVtZW50c0lzU3VwZXJzZXQpO1xuY29uc3QgICAgICAgIGVsZW1lbnRzSXNEaXNqb2ludD1tZXJnZWlmeShpdGVySXNEaXNqb2ludCk7JGjigI1fb25jZS5lbGVtZW50c0lzRGlzam9pbnQoZWxlbWVudHNJc0Rpc2pvaW50KTtcbmNvbnN0ICAgICAgICBlbGVtZW50c0NvbXBhcmU9bWVyZ2VpZnkoaXRlckNvbXBhcmUpOyRo4oCNX29uY2UuZWxlbWVudHNDb21wYXJlKGVsZW1lbnRzQ29tcGFyZSk7XG5jb25zdCAgICAgICAgZWxlbWVudHNVbmlvbj1tZXJnZWlmeShpdGVyVW5pb24pOyRo4oCNX29uY2UuZWxlbWVudHNVbmlvbihlbGVtZW50c1VuaW9uKTtcbmNvbnN0ICAgICAgICBlbGVtZW50c0Rpc2pvaW50VW5pb249bWVyZ2VpZnkoaXRlckRpc2pvaW50VW5pb24pOyRo4oCNX29uY2UuZWxlbWVudHNEaXNqb2ludFVuaW9uKGVsZW1lbnRzRGlzam9pbnRVbmlvbik7XG5jb25zdCAgICAgICAgZWxlbWVudHNJbnRlcnNlY3Rpb249bWVyZ2VpZnkoaXRlckludGVyc2VjdGlvbik7JGjigI1fb25jZS5lbGVtZW50c0ludGVyc2VjdGlvbihlbGVtZW50c0ludGVyc2VjdGlvbik7XG5jb25zdCAgICAgICAgZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0PW1lcmdlaWZ5KGl0ZXJEaXNqb2ludFN1YnRyYWN0KTskaOKAjV9vbmNlLmVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdChlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QpO1xuXG5jb25zdCByYXdTZXRpZnk9KGVsZW1lbnRzT3ApPT4oeHNldCx5c2V0KT0+XG5lbGVtZW50c09wKHhzZXQucGF5bG9hZCx5c2V0LnBheWxvYWQpO1xuXG5jb25zdCBzZXRpZnk9KGVsZW1lbnRzT3ApPT4oeHNldCx5c2V0KT0+XG5tYWtlU2V0T2ZFbGVtZW50cyhlbGVtZW50c09wKHhzZXQucGF5bG9hZCx5c2V0LnBheWxvYWQpKTtcblxuY29uc3QgICAgICAgIHNldElzU3VwZXJzZXQ9cmF3U2V0aWZ5KGVsZW1lbnRzSXNTdXBlcnNldCk7JGjigI1fb25jZS5zZXRJc1N1cGVyc2V0KHNldElzU3VwZXJzZXQpO1xuY29uc3QgICAgICAgIHNldElzRGlzam9pbnQ9cmF3U2V0aWZ5KGVsZW1lbnRzSXNEaXNqb2ludCk7JGjigI1fb25jZS5zZXRJc0Rpc2pvaW50KHNldElzRGlzam9pbnQpO1xuY29uc3QgICAgICAgIHNldENvbXBhcmU9cmF3U2V0aWZ5KGVsZW1lbnRzQ29tcGFyZSk7JGjigI1fb25jZS5zZXRDb21wYXJlKHNldENvbXBhcmUpO1xuY29uc3QgICAgICAgIHNldFVuaW9uPXNldGlmeShlbGVtZW50c1VuaW9uKTskaOKAjV9vbmNlLnNldFVuaW9uKHNldFVuaW9uKTtcbmNvbnN0ICAgICAgICBzZXREaXNqb2ludFVuaW9uPXNldGlmeShlbGVtZW50c0Rpc2pvaW50VW5pb24pOyRo4oCNX29uY2Uuc2V0RGlzam9pbnRVbmlvbihzZXREaXNqb2ludFVuaW9uKTtcbmNvbnN0ICAgICAgICBzZXRJbnRlcnNlY3Rpb249c2V0aWZ5KGVsZW1lbnRzSW50ZXJzZWN0aW9uKTskaOKAjV9vbmNlLnNldEludGVyc2VjdGlvbihzZXRJbnRlcnNlY3Rpb24pO1xuY29uc3QgICAgICAgIHNldERpc2pvaW50U3VidHJhY3Q9c2V0aWZ5KGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCk7JGjigI1fb25jZS5zZXREaXNqb2ludFN1YnRyYWN0KHNldERpc2pvaW50U3VidHJhY3QpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImVsZW1lbnRzSXNTdXBlcnNldCI6WyJlbGVtZW50c0lzU3VwZXJzZXQiXSwiZWxlbWVudHNJc0Rpc2pvaW50IjpbImVsZW1lbnRzSXNEaXNqb2ludCJdLCJlbGVtZW50c0NvbXBhcmUiOlsiZWxlbWVudHNDb21wYXJlIl0sImVsZW1lbnRzVW5pb24iOlsiZWxlbWVudHNVbmlvbiJdLCJlbGVtZW50c0Rpc2pvaW50VW5pb24iOlsiZWxlbWVudHNEaXNqb2ludFVuaW9uIl0sImVsZW1lbnRzSW50ZXJzZWN0aW9uIjpbImVsZW1lbnRzSW50ZXJzZWN0aW9uIl0sImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCI6WyJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiXSwic2V0SXNTdXBlcnNldCI6WyJzZXRJc1N1cGVyc2V0Il0sInNldElzRGlzam9pbnQiOlsic2V0SXNEaXNqb2ludCJdLCJzZXRDb21wYXJlIjpbInNldENvbXBhcmUiXSwic2V0VW5pb24iOlsic2V0VW5pb24iXSwic2V0RGlzam9pbnRVbmlvbiI6WyJzZXREaXNqb2ludFVuaW9uIl0sInNldEludGVyc2VjdGlvbiI6WyJzZXRJbnRlcnNlY3Rpb24iXSwic2V0RGlzam9pbnRTdWJ0cmFjdCI6WyJzZXREaXNqb2ludFN1YnRyYWN0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMIJ83kJCwAACQsAACwAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvbGVnYWN5L2xlZ2FjeU1hcC5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2Fzc2VydCJdLCJleHBvcnRzIjpbIm1ha2VMZWdhY3lNYXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcSxGYWlsOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJxXCIsIFskaOKAjV9hID0+IChxID0gJGjigI1fYSldXSxbXCJGYWlsXCIsIFskaOKAjV9hID0+IChGYWlsID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbi8qKlxuICogVGhpcyBtb2R1bGUgYW5kIGl0cyBmcmF0ZXJuYWwgc2libGluZyBsZWdhY3lXZWFrTWFwIGV4aXN0IG9ubHkgdG9cbiAqIGVhc2UgYSB0cmFuc2l0aW9uIHRvIHRoZSBtb2Rlcm4gYHN0b3JlYCBzeXN0ZW0sIGFyZSBkZXByZWNhdGVkLFxuICogYW5kIHdpbGwgZXZlbnR1YWxseSBkaXNhcHBlYXIuIFRoZXkgYXJlIG5lZWRlZCBmb3Igbm93IHRvIHN1cHBvcnRcbiAqIHNvbWUgb2YgdGhlIHVzZXMgb2YgdGhlIG9sZCBiZWhhdmlvciB0aGF0IGFyZSBub3QgY29tcGF0aWJsZSB3aXRoXG4gKiB0aGUgbmV3LiBUaGUgY29uc3RyYWludCBpbXBvc2VkIGJ5IHRoZSBuZXcgaXMgdGhhdCBvbmx5IHBhc3NhYmxlcyBjYW5cbiAqIGJlIHVzZWQgYXMgdmFsdWVzLCBhbmQgb25seSBrZXlzIChyb3VnaGx5LCBzdHJ1Y3R1cmVzLCBha2EgY29tcGFyYWJsZXMpXG4gKiBjYW4gYmUgdXNlZCBhcyB2YWx1ZXMuXG4gKlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9wdWxsLzM1NjdcbiAqIFRPRE8gT25jZSB0aGF0IFBSIGlzIG1lcmdlZCwgbGluayB0byB0aGUgZG9jdW1lbnRzIHJhdGhlciB0aGFuIHRoZSBQUnMuXG4gKlxuICogRWFjaCBvZiB0aGVzZSBub24tY29uZm9ybWluZyB1c2VzIHNob3VsZCBiZSBtYXJrZWQgd2l0aCBhXG4gKiBgYGBqc1xuICogLy8gTGVnYWN5IGJlY2F1c2UuLi5cbiAqIGBgYFxuICogY29tbWVudCBleHBsYWluaW5nIHRoZSBwcm9ibGVtIGluaGliaXRpbmcgY29udmVyc2lvbiB0byB0aGUgbmV3XG4gKiBzeXN0ZW0uIFNvbWUgb2YgdGhlc2UgcHJvYmxlbXMgYXMgb2YgdGhpcyB3cml0aW5nOlxuICogICAgKiBBIHByb21pc2VLaXQgdXNlZCBhcyBhIHZhbHVlLCBldmVuIHRob3VnaCBhIHByb21pc2VLaXQgaXMgbm90XG4gKiAgICAgIGEgcGFzc2FibGUuIFNvbHV0aW9ucyBhcmUgdG8gbWFrZSBpdCBhIHBhc3NhYmxlLCBvciB0byBjb252ZXJ0XG4gKiAgICAgIHRoZSBjb250YWluZXIgYmFjayB0byBhIGNvbnZlbnRpb25hbCBKYXZhU2NyaXB0IE1hcC5cbiAqICAgICogQSBtdXRhYmxlIGFycmF5IHVzZWQgYXMgYSB2YWx1ZSwgdGhhdCBpcyBzdWJzZXF1ZW50bHkgbXV0YXRlZC5cbiAqICAgICAgRnJlZXppbmcgdGhlIGFycmF5IHdvdWxkbid0IHdvcmsgb2YgY291cnNlIGJlY2F1c2UgaXQgd291bGQgYnJlYWtcbiAqICAgICAgdGhlIHN1YnNlcXVlbnQgbXV0YXRpb24uIFVzaW5nIGEgZmFyIG9iamVjdCB3cmFwcGluZyBhbiBhcnJheSB3b3VsZFxuICogICAgICBsaWtlbHkgd29yayBmaW5lLlxuICpcbiAqIEBkZXByZWNhdGVkIHN3aXRjaCB0byBTY2FsYXJNYXAgaWYgcG9zc2libGUsIE1hcCBvdGhlcndpc2VcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnPSdrZXknXSAtIHRhZyBmb3IgZGVidWdnaW5nXG4gKiBAcmV0dXJucyB7TGVnYWN5TWFwPEssVj59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTGVnYWN5TWFwPSh0YWc9J2tleScpPT57XG5jb25zdCBtPW5ldyBNYXAoKTtcbmNvbnN0IGFzc2VydEtleURvZXNOb3RFeGlzdD0oa2V5KT0+XG4hbS5oYXMoa2V5KXx8RmFpbCBgJHtxKHRhZyl9IGFscmVhZHkgcmVnaXN0ZXJlZDogJHtrZXl9YDtcbmNvbnN0IGFzc2VydEtleUV4aXN0cz0oa2V5KT0+XG5tLmhhcyhrZXkpfHxGYWlsIGAke3EodGFnKX0gbm90IGZvdW5kOiAke2tleX1gO1xucmV0dXJuIGhhcmRlbih7XG5oYXM6KGtleSk9Pntcbi8qIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsKi9cbi8qIHRob3VnaCB0aGUgYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kKi9cbi8qIGluIHRoaXMgbWFwLiovXG5yZXR1cm4gbS5oYXMoa2V5KTtcbiB9LFxuaW5pdDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RG9lc05vdEV4aXN0KGtleSk7XG5tLnNldChrZXksdmFsdWUpO1xuIH0sXG5nZXQ6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xucmV0dXJuIG0uZ2V0KGtleSk7XG4gfSxcbnNldDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG5tLnNldChrZXksdmFsdWUpO1xuIH0sXG5kZWxldGU6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xubS5kZWxldGUoa2V5KTtcbiB9LFxua2V5czooKT0+bS5rZXlzKCksXG52YWx1ZXM6KCk9Pm0udmFsdWVzKCksXG5lbnRyaWVzOigpPT5tLmVudHJpZXMoKSxcbmdldFNpemU6KCk9Pm0uc2l6ZSxcbmNsZWFyOigpPT5tLmNsZWFyKCl9KTtcblxuIH07JGjigI1fb25jZS5tYWtlTGVnYWN5TWFwKG1ha2VMZWdhY3lNYXApO1xuaGFyZGVuKG1ha2VMZWdhY3lNYXApO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VMZWdhY3lNYXAiOlsibWFrZUxlZ2FjeU1hcCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABay5YGrQYAAK0GAAAwAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzeyJpbXBvcnRzIjpbIi4uL3R5cGVzLmpzIiwiQGFnb3JpYy9hc3NlcnQiXSwiZXhwb3J0cyI6WyJtYWtlTGVnYWN5V2Vha01hcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBxLEZhaWw7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcInFcIiwgWyRo4oCNX2EgPT4gKHEgPSAkaOKAjV9hKV1dLFtcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdHlwZXMuanNcIiwgW11dXSk7ICAgXG5cblxuLyoqXG4gKiBTZWUgZG9jY29tbWVudCBpbiB0aGUgY2xvc2VseSByZWxhdGVkIGBsZWdhY3lNYXAuanNgIG1vZHVsZS5cbiAqXG4gKiBAZGVwcmVjYXRlZCBzd2l0Y2ggdG8gU2NhbGFyV2Vha01hcCBpZiBwb3NzaWJsZSwgV2Vha01hcCBvdGhlcndpc2VcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnPSdrZXknXSAtIHRhZyBmb3IgZGVidWdnaW5nXG4gKiBAcmV0dXJucyB7TGVnYWN5V2Vha01hcDxLLFY+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUxlZ2FjeVdlYWtNYXA9KHRhZz0na2V5Jyk9Pntcbi8qKiBAdHlwZSB7V2Vha01hcDxLICYgb2JqZWN0LCBWPn0gKi9cbmNvbnN0IHdtPW5ldyBXZWFrTWFwKCk7XG5jb25zdCBhc3NlcnRLZXlEb2VzTm90RXhpc3Q9KGtleSk9PlxuIXdtLmhhcyhrZXkpfHxGYWlsIGAke3EodGFnKX0gYWxyZWFkeSByZWdpc3RlcmVkOiAke2tleX1gO1xuY29uc3QgYXNzZXJ0S2V5RXhpc3RzPShrZXkpPT5cbndtLmhhcyhrZXkpfHxGYWlsIGAke3EodGFnKX0gbm90IGZvdW5kOiAke2tleX1gO1xucmV0dXJuIGhhcmRlbih7XG5oYXM6KGtleSk9Pntcbi8qIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsKi9cbi8qIHRob3VnaCB0aGUgYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kKi9cbi8qIGluIHRoaXMgbWFwLiovXG5yZXR1cm4gd20uaGFzKGtleSk7XG4gfSxcbmluaXQ6KGtleSx2YWx1ZSk9PntcbmFzc2VydEtleURvZXNOb3RFeGlzdChrZXkpO1xud20uc2V0KGtleSx2YWx1ZSk7XG4gfSxcbmdldDooa2V5KT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4vKiBIb3cgdG8gdGVsbCB0eXBlc2NyaXB0IEkgYmVsaWV2ZSB0aGUgYGdldGAgd2lsbCBzdWNjZWVkLiovXG5yZXR1cm4gKC8qKiBAdHlwZSB7Vn0gKi93bS5nZXQoa2V5KSk7XG4gfSxcbnNldDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG53bS5zZXQoa2V5LHZhbHVlKTtcbiB9LFxuZGVsZXRlOihrZXkpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbndtLmRlbGV0ZShrZXkpO1xuIH19KTtcblxuIH07JGjigI1fb25jZS5tYWtlTGVnYWN5V2Vha01hcChtYWtlTGVnYWN5V2Vha01hcCk7XG5oYXJkZW4obWFrZUxlZ2FjeVdlYWtNYXApO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VMZWdhY3lXZWFrTWFwIjpbIm1ha2VMZWdhY3lXZWFrTWFwIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPb2JC60FAAAtBQAAC8AAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvcGF0dGVybnMvZXhvLW1ha2Vycy5qc3siaW1wb3J0cyI6WyIuL2V4by10b29scy5qcyIsIkBhZ29yaWMvaW50ZXJuYWwiXSwiZXhwb3J0cyI6WyJkZWZpbmVFeG9DbGFzcyIsImRlZmluZUV4b0NsYXNzS2l0IiwiaW5pdEVtcHR5IiwibWFrZUV4byJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBvYmplY3RNYXAsZGVmZW5kUHJvdG90eXBlLGRlZmVuZFByb3RvdHlwZUtpdDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJvYmplY3RNYXBcIiwgWyRo4oCNX2EgPT4gKG9iamVjdE1hcCA9ICRo4oCNX2EpXV1dXSxbXCIuL2V4by10b29scy5qc1wiLCBbW1wiZGVmZW5kUHJvdG90eXBlXCIsIFskaOKAjV9hID0+IChkZWZlbmRQcm90b3R5cGUgPSAkaOKAjV9hKV1dLFtcImRlZmVuZFByb3RvdHlwZUtpdFwiLCBbJGjigI1fYSA9PiAoZGVmZW5kUHJvdG90eXBlS2l0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5jb25zdHtzZWFsLGZyZWV6ZX09T2JqZWN0O1xuXG5jb25zdCBlbXB0eVJlY29yZD1oYXJkZW4oe30pO1xuXG4vKipcbiAqIFdoZW4gY2FsbGluZyBgZGVmaW5lRHVyYWJsZUtpbmRgIGFuZFxuICogaXRzIHNpYmxpbmdzLCB1c2VkIGFzIHRoZSBgaW5pdGAgZnVuY3Rpb24gYXJndW1lbnQgdG8gaW5kaWNhdGUgdGhhdCB0aGVcbiAqIHN0YXRlIHJlY29yZCBvZiB0aGUgKHZpcnR1YWwvZHVyYWJsZSkgaW5zdGFuY2VzIG9mIHRoZSBraW5kL2V4b0NsYXNzXG4gKiBzaG91bGQgYmUgZW1wdHksIGFuZCB0aGF0IHRoZSByZXR1cm5lZCBtYWtlciBmdW5jdGlvbiBzaG91bGQgaGF2ZSB6ZXJvXG4gKiBwYXJhbWV0ZXJzLlxuICpcbiAqIEByZXR1cm5zIHt7fX1cbiAqL1xuY29uc3QgICAgICAgIGluaXRFbXB0eT0oKT0+ZW1wdHlSZWNvcmQ7XG5cbi8qKlxuICogQHRlbXBsYXRlIFtTID0gYW55XVxuICogQHRlbXBsYXRlIFtUID0gYW55XVxuICogQHR5cGVkZWYge29iamVjdH0gQ29udGV4dFxuICogQHByb3BlcnR5IHtTfSBzdGF0ZVxuICogQHByb3BlcnR5IHtUfSBzZWxmXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgW1MgPSBhbnldXG4gKiBAdGVtcGxhdGUgW0YgPSBhbnldXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBLaXRDb250ZXh0XG4gKiBAcHJvcGVydHkge1N9IHN0YXRlXG4gKiBAcHJvcGVydHkge0Z9IGZhY2V0c1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3tbbmFtZTogc3RyaW5nXTogUGF0dGVybn19IFN0YXRlU2hhcGVcbiAqIEl0IGxvb2tzIGxpa2UgYSBjb3B5UmVjb3JkIHBhdHRlcm4sIGJ1dCB0aGUgaW50ZXJwcmV0YXRpb24gaXMgZGlmZmVyZW50LlxuICogRWFjaCBwcm9wZXJ0eSBpcyBkaXN0aW5jdCwgaXMgY2hlY2tlZCBhbmQgY2hhbmdlZCBzZXBhcmF0ZWx5LlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIENcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZhckNsYXNzT3B0aW9uc1xuICogQHByb3BlcnR5IHsoY29udGV4dDogQykgPT4gdm9pZH0gW2ZpbmlzaF1cbiAqIEBwcm9wZXJ0eSB7U3RhdGVTaGFwZX0gW3N0YXRlU2hhcGVdXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgQSBhcmdzIHRvIGluaXRcbiAqIEB0ZW1wbGF0ZSBTIHN0YXRlIGZyb20gaW5pdFxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPn0gVCBtZXRob2RzXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7KC4uLmFyZ3M6IEFbXSkgPT4gU30gaW5pdFxuICogQHBhcmFtIHtUICYgVGhpc1R5cGU8eyBzZWxmOiBULCBzdGF0ZTogUyB9Pn0gbWV0aG9kc1xuICogQHBhcmFtIHtGYXJDbGFzc09wdGlvbnM8Q29udGV4dDxTLFQ+Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IEFbXSkgPT4gKFQgJiBYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuUmVtb3RhYmxlQnJhbmQ8e30sIFQ+KX1cbiAqLyRo4oCNX29uY2UuaW5pdEVtcHR5KGluaXRFbXB0eSk7XG5jb25zdCAgICAgICAgZGVmaW5lRXhvQ2xhc3M9KFxudGFnLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0LFxubWV0aG9kcyxcbntmaW5pc2g9dW5kZWZpbmVkfT17fSk9Plxue1xuLyoqIEB0eXBlIHtXZWFrTWFwPFQsQ29udGV4dDxTLCBUPj59ICovXG5jb25zdCBjb250ZXh0TWFwPW5ldyBXZWFrTWFwKCk7XG5jb25zdCBwcm90b3R5cGU9ZGVmZW5kUHJvdG90eXBlKFxudGFnLFxuY29udGV4dE1hcCxcbm1ldGhvZHMsXG50cnVlLFxuaW50ZXJmYWNlR3VhcmQpO1xuXG5jb25zdCBtYWtlSW5zdGFuY2U9KC4uLmFyZ3MpPT57XG4vKiBCZSBjYXJlZnVsIG5vdCB0byBmcmVlemUgdGhlIHN0YXRlIHJlY29yZCovXG5jb25zdCBzdGF0ZT1zZWFsKGluaXQoLi4uYXJncykpO1xuLyoqIEB0eXBlIHtUfSAqL1xuLyogQHRzLWV4cGVjdC1lcnJvciBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBkaWZmZXJlbnQgc3VidHlwZSovXG5jb25zdCBzZWxmPWhhcmRlbih7X19wcm90b19fOnByb3RvdHlwZX0pO1xuLyogQmUgY2FyZWZ1bCBub3QgdG8gZnJlZXplIHRoZSBzdGF0ZSByZWNvcmQqL1xuLyoqIEB0eXBlIHtDb250ZXh0PFMsVD59ICovXG5jb25zdCBjb250ZXh0PWZyZWV6ZSh7c3RhdGUsc2VsZn0pO1xuY29udGV4dE1hcC5zZXQoc2VsZixjb250ZXh0KTtcbmlmKGZpbmlzaCl7XG5maW5pc2goY29udGV4dCk7XG4gfVxucmV0dXJuIHNlbGY7XG4gfTtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggZGlmZmVyZW50IHN1YnR5cGUqL1xucmV0dXJuIGhhcmRlbihtYWtlSW5zdGFuY2UpO1xuIH07JGjigI1fb25jZS5kZWZpbmVFeG9DbGFzcyhkZWZpbmVFeG9DbGFzcyk7XG5oYXJkZW4oZGVmaW5lRXhvQ2xhc3MpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBBIGFyZ3MgdG8gaW5pdFxuICogQHRlbXBsYXRlIFMgc3RhdGUgZnJvbSBpbml0XG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+Pn0gRiBtZXRob2RzXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRLaXRcbiAqIEBwYXJhbSB7KC4uLmFyZ3M6IEFbXSkgPT4gU30gaW5pdFxuICogQHBhcmFtIHtGICYgVGhpc1R5cGU8eyBmYWNldHM6IEYsIHN0YXRlOiBTIH0+IH0gbWV0aG9kc0tpdFxuICogQHBhcmFtIHtGYXJDbGFzc09wdGlvbnM8S2l0Q29udGV4dDxTLEY+Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IEFbXSkgPT4gRn1cbiAqL1xuY29uc3QgICAgICAgIGRlZmluZUV4b0NsYXNzS2l0PShcbnRhZyxcbmludGVyZmFjZUd1YXJkS2l0LFxuaW5pdCxcbm1ldGhvZHNLaXQsXG57ZmluaXNoPXVuZGVmaW5lZH09e30pPT5cbntcbmNvbnN0IGNvbnRleHRNYXBLaXQ9b2JqZWN0TWFwKG1ldGhvZHNLaXQsKCk9Pm5ldyBXZWFrTWFwKCkpO1xuY29uc3QgcHJvdG90eXBlS2l0PWRlZmVuZFByb3RvdHlwZUtpdChcbnRhZyxcbmNvbnRleHRNYXBLaXQsXG5tZXRob2RzS2l0LFxudHJ1ZSxcbmludGVyZmFjZUd1YXJkS2l0KTtcblxuY29uc3QgbWFrZUluc3RhbmNlS2l0PSguLi5hcmdzKT0+e1xuLyogQmUgY2FyZWZ1bCBub3QgdG8gZnJlZXplIHRoZSBzdGF0ZSByZWNvcmQqL1xuY29uc3Qgc3RhdGU9c2VhbChpbml0KC4uLmFyZ3MpKTtcbi8qIERvbid0IGZyZWV6ZSBjb250ZXh0IHVudGlsIHdlIGFkZCBmYWNldHMqL1xuY29uc3QgY29udGV4dD17c3RhdGV9O1xuY29uc3QgZmFjZXRzPW9iamVjdE1hcChwcm90b3R5cGVLaXQsKHByb3RvdHlwZSxmYWNldE5hbWUpPT57XG5jb25zdCBzZWxmPWhhcmRlbih7X19wcm90b19fOnByb3RvdHlwZX0pO1xuY29udGV4dE1hcEtpdFtmYWNldE5hbWVdLnNldChzZWxmLGNvbnRleHQpO1xucmV0dXJuIHNlbGY7XG4gfSk7XG5jb250ZXh0LmZhY2V0cz1mYWNldHM7XG4vKiBCZSBjYXJlZnVsIG5vdCB0byBmcmVlemUgdGhlIHN0YXRlIHJlY29yZCovXG5mcmVlemUoY29udGV4dCk7XG5pZihmaW5pc2gpe1xuLyogQHRzLWV4cGVjdC1lcnJvciBgZmFjZXRzYCB3YXMgYWRkZWQqL1xuZmluaXNoKGNvbnRleHQpO1xuIH1cbnJldHVybiBmYWNldHM7XG4gfTtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLXRzLWV4cGVjdC1lcnJvciAtLSBkaWZmZXJlbnQgcGVyIHBhY2thZ2UgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80NjIwKi9cbi8qIEB0cy1pZ25vcmUgeHh4Ki9cbnJldHVybiBoYXJkZW4obWFrZUluc3RhbmNlS2l0KTtcbiB9OyRo4oCNX29uY2UuZGVmaW5lRXhvQ2xhc3NLaXQoZGVmaW5lRXhvQ2xhc3NLaXQpO1xuaGFyZGVuKGRlZmluZUV4b0NsYXNzS2l0KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIE1ldGhvZD59IFRcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmQgfCB1bmRlZmluZWR9IGludGVyZmFjZUd1YXJkIENBVkVBVDogc3RhdGljIHR5cGluZyBkb2VzIG5vdCB5ZXQgc3VwcG9ydCBgY2FsbFdoZW5gIHRyYW5zZm9ybWF0aW9uXG4gKiBAcGFyYW0ge1R9IG1ldGhvZHNcbiAqIEBwYXJhbSB7RmFyQ2xhc3NPcHRpb25zPENvbnRleHQ8e30sVD4+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtUICYgWGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLlJlbW90YWJsZUJyYW5kPHt9LCBUPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VFeG89KHRhZyxpbnRlcmZhY2VHdWFyZCxtZXRob2RzLG9wdGlvbnM9dW5kZWZpbmVkKT0+e1xuY29uc3QgbWFrZUluc3RhbmNlPWRlZmluZUV4b0NsYXNzKFxudGFnLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0RW1wdHksXG5tZXRob2RzLFxub3B0aW9ucyk7XG5cbnJldHVybiBtYWtlSW5zdGFuY2UoKTtcbiB9OyRo4oCNX29uY2UubWFrZUV4byhtYWtlRXhvKTtcbmhhcmRlbihtYWtlRXhvKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpbml0RW1wdHkiOlsiaW5pdEVtcHR5Il0sImRlZmluZUV4b0NsYXNzIjpbImRlZmluZUV4b0NsYXNzIl0sImRlZmluZUV4b0NsYXNzS2l0IjpbImRlZmluZUV4b0NsYXNzS2l0Il0sIm1ha2VFeG8iOlsibWFrZUV4byJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACrxdmQKCQAACgkAAAuAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3BhdHRlcm5zL2V4by10b29scy5qc3siaW1wb3J0cyI6WyIuL3BhdHRlcm5NYXRjaGVycy5qcyIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAZW5kby9mYXIiXSwiZXhwb3J0cyI6WyJkZWZlbmRQcm90b3R5cGUiLCJkZWZlbmRQcm90b3R5cGVLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxGYXIsbGlzdERpZmZlcmVuY2Usb2JqZWN0TWFwLE1pbk1ldGhvZEd1YXJkLG11c3RNYXRjaCxNOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV0sW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wibGlzdERpZmZlcmVuY2VcIiwgWyRo4oCNX2EgPT4gKGxpc3REaWZmZXJlbmNlID0gJGjigI1fYSldXSxbXCJvYmplY3RNYXBcIiwgWyRo4oCNX2EgPT4gKG9iamVjdE1hcCA9ICRo4oCNX2EpXV1dXSxbXCIuL3BhdHRlcm5NYXRjaGVycy5qc1wiLCBbW1wiTWluTWV0aG9kR3VhcmRcIiwgWyRo4oCNX2EgPT4gKE1pbk1ldGhvZEd1YXJkID0gJGjigI1fYSldXSxbXCJtdXN0TWF0Y2hcIiwgWyRo4oCNX2EgPT4gKG11c3RNYXRjaCA9ICRo4oCNX2EpXV0sW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcbmNvbnN0e2FwcGx5LG93bktleXN9PVJlZmxlY3Q7XG5jb25zdHtkZWZpbmVQcm9wZXJ0aWVzfT1PYmplY3Q7XG5cbmNvbnN0IGRlZmVuZFN5bmNBcmdzPShhcmdzLG1ldGhvZEd1YXJkLGxhYmVsKT0+e1xuY29uc3R7YXJnR3VhcmRzLG9wdGlvbmFsQXJnR3VhcmRzLHJlc3RBcmdHdWFyZH09bWV0aG9kR3VhcmQ7XG5jb25zdCBwYXJhbXNQYXR0ZXJuPU0uc3BsaXRBcnJheShcbmFyZ0d1YXJkcyxcbm9wdGlvbmFsQXJnR3VhcmRzLFxucmVzdEFyZ0d1YXJkKTtcblxubXVzdE1hdGNoKGhhcmRlbihhcmdzKSxwYXJhbXNQYXR0ZXJuLGxhYmVsKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7TWV0aG9kfSBtZXRob2RcbiAqIEBwYXJhbSB7TWV0aG9kR3VhcmR9IG1ldGhvZEd1YXJkXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWxcbiAqIEByZXR1cm5zIHtNZXRob2R9XG4gKi9cbmNvbnN0IGRlZmVuZFN5bmNNZXRob2Q9KG1ldGhvZCxtZXRob2RHdWFyZCxsYWJlbCk9PntcbmNvbnN0e3JldHVybkd1YXJkfT1tZXRob2RHdWFyZDtcbmNvbnN0e3N5bmNNZXRob2R9PXtcbi8qIE5vdGUgcHVycG9zZWZ1bCB1c2Ugb2YgYHRoaXNgIGFuZCBjb25jaXNlIG1ldGhvZCBzeW50YXgqL1xuc3luY01ldGhvZCguLi5hcmdzKXtcbmRlZmVuZFN5bmNBcmdzKGhhcmRlbihhcmdzKSxtZXRob2RHdWFyZCxsYWJlbCk7XG5jb25zdCByZXN1bHQ9YXBwbHkobWV0aG9kLHRoaXMsYXJncyk7XG5tdXN0TWF0Y2goaGFyZGVuKHJlc3VsdCkscmV0dXJuR3VhcmQsIGAke2xhYmVsfTogcmVzdWx0YCk7XG5yZXR1cm4gcmVzdWx0O1xuIH19O1xuXG5yZXR1cm4gc3luY01ldGhvZDtcbiB9O1xuXG5jb25zdCBpc0F3YWl0QXJnR3VhcmQ9KGFyZ0d1YXJkKT0+XG5hcmdHdWFyZCYmdHlwZW9mIGFyZ0d1YXJkPT09J29iamVjdCcmJmFyZ0d1YXJkLmtsYXNzPT09J2F3YWl0QXJnJztcblxuY29uc3QgZGVzeW5jPShtZXRob2RHdWFyZCk9PntcbmNvbnN0e2FyZ0d1YXJkcyxvcHRpb25hbEFyZ0d1YXJkcz1bXSxyZXN0QXJnR3VhcmR9PW1ldGhvZEd1YXJkO1xuIWlzQXdhaXRBcmdHdWFyZChyZXN0QXJnR3VhcmQpfHxcbkZhaWwgYFJlc3QgYXJncyBtYXkgbm90IGJlIGF3YWl0ZWQ6ICR7cmVzdEFyZ0d1YXJkfWA7XG5jb25zdCByYXdBcmdHdWFyZHM9Wy4uLmFyZ0d1YXJkcywuLi5vcHRpb25hbEFyZ0d1YXJkc107XG5cbmNvbnN0IGF3YWl0SW5kZXhlcz1bXTtcbmZvcihsZXQgaT0wO2k8cmF3QXJnR3VhcmRzLmxlbmd0aDtpKz0xKXtcbmNvbnN0IGFyZ0d1YXJkPXJhd0FyZ0d1YXJkc1tpXTtcbmlmKGlzQXdhaXRBcmdHdWFyZChhcmdHdWFyZCkpe1xucmF3QXJnR3VhcmRzW2ldPWFyZ0d1YXJkLmFyZ0d1YXJkO1xuYXdhaXRJbmRleGVzLnB1c2goaSk7XG4gfVxuIH1cbnJldHVybntcbmF3YWl0SW5kZXhlcyxcbnJhd01ldGhvZEd1YXJkOntcbmFyZ0d1YXJkczpyYXdBcmdHdWFyZHMuc2xpY2UoMCxhcmdHdWFyZHMubGVuZ3RoKSxcbm9wdGlvbmFsQXJnR3VhcmRzOnJhd0FyZ0d1YXJkcy5zbGljZShhcmdHdWFyZHMubGVuZ3RoKSxcbnJlc3RBcmdHdWFyZH19O1xuXG5cbiB9O1xuXG5jb25zdCBkZWZlbmRBc3luY01ldGhvZD0obWV0aG9kLG1ldGhvZEd1YXJkLGxhYmVsKT0+e1xuY29uc3R7cmV0dXJuR3VhcmR9PW1ldGhvZEd1YXJkO1xuY29uc3R7YXdhaXRJbmRleGVzLHJhd01ldGhvZEd1YXJkfT1kZXN5bmMobWV0aG9kR3VhcmQpO1xuY29uc3R7YXN5bmNNZXRob2R9PXtcbi8qIE5vdGUgcHVycG9zZWZ1bCB1c2Ugb2YgYHRoaXNgIGFuZCBjb25jaXNlIG1ldGhvZCBzeW50YXgqL1xuYXN5bmNNZXRob2QoLi4uYXJncyl7XG5jb25zdCBhd2FpdExpc3Q9YXdhaXRJbmRleGVzLm1hcCgoaSk9PmFyZ3NbaV0pO1xuY29uc3QgcD1Qcm9taXNlLmFsbChhd2FpdExpc3QpO1xuY29uc3QgcmF3QXJncz1bLi4uYXJnc107XG5jb25zdCByZXN1bHRQPUUud2hlbihwLChhd2FpdGVkQXJncyk9PntcbmZvcihsZXQgaj0wO2o8YXdhaXRJbmRleGVzLmxlbmd0aDtqKz0xKXtcbnJhd0FyZ3NbYXdhaXRJbmRleGVzW2pdXT1hd2FpdGVkQXJnc1tqXTtcbiB9XG5kZWZlbmRTeW5jQXJncyhyYXdBcmdzLHJhd01ldGhvZEd1YXJkLGxhYmVsKTtcbnJldHVybiBhcHBseShtZXRob2QsdGhpcyxyYXdBcmdzKTtcbiB9KTtcbnJldHVybiBFLndoZW4ocmVzdWx0UCwocmVzdWx0KT0+e1xubXVzdE1hdGNoKGhhcmRlbihyZXN1bHQpLHJldHVybkd1YXJkLCBgJHtsYWJlbH06IHJlc3VsdGApO1xucmV0dXJuIHJlc3VsdDtcbiB9KTtcbiB9fTtcblxucmV0dXJuIGFzeW5jTWV0aG9kO1xuIH07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7TWV0aG9kfSBtZXRob2RcbiAqIEBwYXJhbSB7TWV0aG9kR3VhcmR9IG1ldGhvZEd1YXJkXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWxcbiAqL1xuY29uc3QgZGVmZW5kTWV0aG9kPShtZXRob2QsbWV0aG9kR3VhcmQsbGFiZWwpPT57XG5jb25zdHtrbGFzcyxjYWxsS2luZH09bWV0aG9kR3VhcmQ7XG5hc3NlcnQoa2xhc3M9PT0nbWV0aG9kR3VhcmQnKTtcbmlmKGNhbGxLaW5kPT09J3N5bmMnKXtcbnJldHVybiBkZWZlbmRTeW5jTWV0aG9kKG1ldGhvZCxtZXRob2RHdWFyZCxsYWJlbCk7XG4gfWVsc2V7XG5hc3NlcnQoY2FsbEtpbmQ9PT0nYXN5bmMnKTtcbnJldHVybiBkZWZlbmRBc3luY01ldGhvZChtZXRob2QsbWV0aG9kR3VhcmQsbGFiZWwpO1xuIH1cbiB9O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kVGFnXG4gKiBAcGFyYW0ge1dlYWtNYXB9IGNvbnRleHRNYXBcbiAqIEBwYXJhbSB7Q2FsbGFibGVGdW5jdGlvbn0gYmVoYXZpb3JNZXRob2RcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3RoaXNmdWxNZXRob2RzXVxuICogQHBhcmFtIHtNZXRob2RHdWFyZH0gW21ldGhvZEd1YXJkXVxuICovXG5jb25zdCBiaW5kTWV0aG9kPShcbm1ldGhvZFRhZyxcbmNvbnRleHRNYXAsXG5iZWhhdmlvck1ldGhvZCxcbnRoaXNmdWxNZXRob2RzPWZhbHNlLFxubWV0aG9kR3VhcmQ9dW5kZWZpbmVkKT0+XG57XG5hc3NlcnQudHlwZW9mKGJlaGF2aW9yTWV0aG9kLCdmdW5jdGlvbicpO1xuXG5jb25zdCBnZXRDb250ZXh0PShzZWxmKT0+e1xuY29uc3QgY29udGV4dD1jb250ZXh0TWFwLmdldChzZWxmKTtcbmNvbnRleHR8fFxuRmFpbCBgJHtxKG1ldGhvZFRhZyl9IG1heSBvbmx5IGJlIGFwcGxpZWQgdG8gYSB2YWxpZCBpbnN0YW5jZTogJHtzZWxmfWA7XG5yZXR1cm4gY29udGV4dDtcbiB9O1xuXG4vKiBWaW9sYXRpbmcgYWxsIEplc3NpZSBydWxlcyB0byBjcmVhdGUgcmVwcmVzZW50YXRpdmVzIHRoYXQgaW5oZXJpdCovXG4vKiBtZXRob2RzIGZyb20gYSBzaGFyZWQgcHJvdG90eXBlLiBUaGUgYm91bmQgbWV0aG9kIHRoZXJlZm9yZSBuZWVkcyovXG4vKiB0byBtZW50aW9uIGB0aGlzYC4gV2UgZGVmaW5lIGl0IHVzaW5nIGNvbmNpc2UgbWV0aG9kIHN5bnRheCovXG4vKiBzbyB0aGF0IGl0IHdpbGwgYmUgYHRoaXNgIHNlbnNpdGl2ZSBidXQgbm90IGNvbnN0cnVjdGFibGUuKi9cbi8qKi9cbi8qIFdlIG5vcm1hbGx5IGNvbnNpZGVyIGB0aGlzYCB1bnNhZmUgYmVjYXVzZSBvZiB0aGUgaGF6YXJkIG9mIGEqL1xuLyogbWV0aG9kIG9mIG9uZSBhYnN0cmFjdGlvbiBiZWluZyBhcHBsaWVkIHRvIGFuIGluc3RhbmNlIG9mKi9cbi8qIGFub3RoZXIgYWJzdHJhY3Rpb24uIFRvIHByZXZlbnQgdGhhdCBhdHRhY2ssIHRoZSBib3VuZCBtZXRob2QqL1xuLyogY2hlY2tzIHRoYXQgaXRzIGB0aGlzYCBpcyBpbiB0aGUgbWFwIGluIHdoaWNoIGl0cyByZXByZXNlbnRhdGl2ZXMqL1xuLyogYXJlIHJlZ2lzdGVyZWQuKi9cbmxldHttZXRob2R9PXRoaXNmdWxNZXRob2RzP1xue1xubWV0aG9kKC4uLmFyZ3Mpe1xudGhpc3x8XG5GYWlsIGB0aGlzZnVsIG1ldGhvZCAke21ldGhvZFRhZ30gY2FsbGVkIHdpdGhvdXQgJ3RoaXMnIG9iamVjdGA7XG5jb25zdCBjb250ZXh0PWdldENvbnRleHQodGhpcyk7XG5yZXR1cm4gYXBwbHkoYmVoYXZpb3JNZXRob2QsY29udGV4dCxhcmdzKTtcbiB9fTpcblxue1xubWV0aG9kKC4uLmFyZ3Mpe1xuY29uc3QgY29udGV4dD1nZXRDb250ZXh0KHRoaXMpO1xucmV0dXJuIGFwcGx5KGJlaGF2aW9yTWV0aG9kLG51bGwsW2NvbnRleHQsLi4uYXJnc10pO1xuIH19O1xuXG5pZihtZXRob2RHdWFyZCl7XG5tZXRob2Q9ZGVmZW5kTWV0aG9kKG1ldGhvZCxtZXRob2RHdWFyZCxtZXRob2RUYWcpO1xuIH1lbHNlIGlmKHRoaXNmdWxNZXRob2RzKXtcbi8qIEZvciBmYXIgY2xhc3NlcyBlbnN1cmUgdGhhdCBpbnB1dHMgYW5kIG91dHB1dHMgYXJlIHBhc3NhYmxlLiovXG5tZXRob2Q9ZGVmZW5kTWV0aG9kKG1ldGhvZCxNaW5NZXRob2RHdWFyZCxtZXRob2RUYWcpO1xuIH1cbmRlZmluZVByb3BlcnRpZXMobWV0aG9kLHtcbm5hbWU6e3ZhbHVlOm1ldGhvZFRhZ30sXG5sZW5ndGg6e1xudmFsdWU6dGhpc2Z1bE1ldGhvZHM/YmVoYXZpb3JNZXRob2QubGVuZ3RoOmJlaGF2aW9yTWV0aG9kLmxlbmd0aC0xfX0pO1xuXG5cbnJldHVybiBtZXRob2Q7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+fSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge1dlYWtNYXB9IGNvbnRleHRNYXBcbiAqIEBwYXJhbSB7VH0gYmVoYXZpb3JNZXRob2RzXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFt0aGlzZnVsTWV0aG9kc11cbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmR9IFtpbnRlcmZhY2VHdWFyZF1cbiAqIEByZXR1cm5zIHtUICYgWGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLlJlbW90YWJsZUJyYW5kPHt9LCBUPn1cbiAqL1xuY29uc3QgICAgICAgIGRlZmVuZFByb3RvdHlwZT0oXG50YWcsXG5jb250ZXh0TWFwLFxuYmVoYXZpb3JNZXRob2RzLFxudGhpc2Z1bE1ldGhvZHM9ZmFsc2UsXG5pbnRlcmZhY2VHdWFyZD11bmRlZmluZWQpPT5cbntcbmNvbnN0IHByb3RvdHlwZT17fTtcbmNvbnN0IG1ldGhvZE5hbWVzPW93bktleXMoYmVoYXZpb3JNZXRob2RzKS5maWx0ZXIoXG4vKiBCeSBpZ25vcmluZyBhbnkgbWV0aG9kIG5hbWVkIFwiY29uc3RydWN0b3JcIiwgd2UgY2FuIHVzZSBhKi9cbi8qIGNsYXNzLnByb3RvdHlwZSBhcyBhIGJlaGF2aW9yTWV0aG9kcy4qL1xuKG5hbWUpPT5uYW1lIT09J2NvbnN0cnVjdG9yJyk7XG5cbmxldCBtZXRob2RHdWFyZHM7XG5pZihpbnRlcmZhY2VHdWFyZCl7XG5jb25zdHtcbmtsYXNzLFxuaW50ZXJmYWNlTmFtZSxcbm1ldGhvZEd1YXJkczptZyxcbnNsb3BweT1mYWxzZX09XG5pbnRlcmZhY2VHdWFyZDtcbm1ldGhvZEd1YXJkcz1tZztcbmFzc2VydC5lcXVhbChrbGFzcywnSW50ZXJmYWNlJyk7XG5hc3NlcnQudHlwZW9mKGludGVyZmFjZU5hbWUsJ3N0cmluZycpO1xue1xuY29uc3QgbWV0aG9kR3VhcmROYW1lcz1vd25LZXlzKG1ldGhvZEd1YXJkcyk7XG5jb25zdCB1bmltcGxlbWVudGVkPWxpc3REaWZmZXJlbmNlKG1ldGhvZEd1YXJkTmFtZXMsbWV0aG9kTmFtZXMpO1xudW5pbXBsZW1lbnRlZC5sZW5ndGg9PT0wfHxcbkZhaWwgYG1ldGhvZHMgJHtxKHVuaW1wbGVtZW50ZWQpfSBub3QgaW1wbGVtZW50ZWQgYnkgJHtxKHRhZyl9YDtcbmlmKCFzbG9wcHkpe1xuY29uc3QgdW5ndWFyZGVkPWxpc3REaWZmZXJlbmNlKG1ldGhvZE5hbWVzLG1ldGhvZEd1YXJkTmFtZXMpO1xudW5ndWFyZGVkLmxlbmd0aD09PTB8fFxuRmFpbCBgbWV0aG9kcyAke3EodW5ndWFyZGVkKX0gbm90IGd1YXJkZWQgYnkgJHtxKGludGVyZmFjZU5hbWUpfWA7XG4gfVxuIH1cbiB9XG5mb3IoY29uc3QgcHJvcCBvZiBtZXRob2ROYW1lcyl7XG5wcm90b3R5cGVbcHJvcF09YmluZE1ldGhvZChcbiBgSW4gJHtxKHByb3ApfSBtZXRob2Qgb2YgKCR7dGFnfSlgLFxuY29udGV4dE1hcCxcbmJlaGF2aW9yTWV0aG9kc1twcm9wXSxcbnRoaXNmdWxNZXRob2RzLFxuLyogVE9ETyBzb21lIHRvb2wgZG9lcyBub3QgeWV0IHVuZGVyc3RhbmQgdGhlIGA/LltgIHN5bnRheCovXG5tZXRob2RHdWFyZHMmJm1ldGhvZEd1YXJkc1twcm9wXSk7XG5cbiB9XG5cbi8qIFRPRE8gSWYgSSBsZWF2ZSB0aGUgZm9sbG93aW5nIGxpbmUgb2YgY29kZSB1bm1hcmtlZCwgdGhlbiBpdCBmYWlscyovXG4vKiBsb2NhbGx5IHdpdGggYSB0eXBlIGVycm9yLiBJZiBJIGFubm90YXRpb24gaXQgd2l0aCB0aGUgZm9sbG93aW5nIGxpbmUsKi9cbi8qIHRoZW4gaXQgZmFpbHMgaW4gQ0kgXCJVbnVzZWQgJ2F0LXRzLWV4cGVjdC1lcnJvcicgZGlyZWN0aXZlLlwiLiovXG4vKiBhdC10cy1leHBlY3QtZXJyb3IgY291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggZGlmZmVyZW50IHN1YnR5cGUqL1xuLyogU28gd2UgdXNlIGF0LXRzLWlnbm9yZSBpbnN0ZWFkLCBhbmQgdGhlbiBoYXZlIHRvIHN1cHByZXNzIHRoZSovXG4vKiBjb21wbGFpbnQgdGhhdCB3ZSBzaG91bGQgdXNlIGF0LXRzLWV4cGVjdC1lcnJvciBpbnN0ZWFkLiovXG4vKiovXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L3ByZWZlci10cy1leHBlY3QtZXJyb3IqL1xuLyogQHRzLWlnbm9yZSovXG5yZXR1cm4gRmFyKHRhZyxwcm90b3R5cGUpO1xuIH07JGjigI1fb25jZS5kZWZlbmRQcm90b3R5cGUoZGVmZW5kUHJvdG90eXBlKTtcbmhhcmRlbihkZWZlbmRQcm90b3R5cGUpO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgV2Vha01hcD59IGNvbnRleHRNYXBLaXRcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj4+fSBiZWhhdmlvck1ldGhvZHNLaXRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3RoaXNmdWxNZXRob2RzXVxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBJbnRlcmZhY2VHdWFyZD59IFtpbnRlcmZhY2VHdWFyZEtpdF1cbiAqL1xuY29uc3QgICAgICAgIGRlZmVuZFByb3RvdHlwZUtpdD0oXG50YWcsXG5jb250ZXh0TWFwS2l0LFxuYmVoYXZpb3JNZXRob2RzS2l0LFxudGhpc2Z1bE1ldGhvZHM9ZmFsc2UsXG5pbnRlcmZhY2VHdWFyZEtpdD11bmRlZmluZWQpPT5cbntcbmNvbnN0IGZhY2V0TmFtZXM9b3duS2V5cyhiZWhhdmlvck1ldGhvZHNLaXQpLnNvcnQoKTtcbmZhY2V0TmFtZXMubGVuZ3RoPjF8fEZhaWwgYEEgbXVsdGktZmFjZXQgb2JqZWN0IG11c3QgaGF2ZSBtdWx0aXBsZSBmYWNldHNgO1xuaWYoaW50ZXJmYWNlR3VhcmRLaXQpe1xuY29uc3QgaW50ZXJmYWNlTmFtZXM9b3duS2V5cyhpbnRlcmZhY2VHdWFyZEtpdCk7XG5jb25zdCBleHRyYUludGVyZmFjZU5hbWVzPWxpc3REaWZmZXJlbmNlKGZhY2V0TmFtZXMsaW50ZXJmYWNlTmFtZXMpO1xuZXh0cmFJbnRlcmZhY2VOYW1lcy5sZW5ndGg9PT0wfHxcbkZhaWwgYEludGVyZmFjZXMgJHtxKGV4dHJhSW50ZXJmYWNlTmFtZXMpfSBub3QgaW1wbGVtZW50ZWQgYnkgJHtxKHRhZyl9YDtcbmNvbnN0IGV4dHJhRmFjZXROYW1lcz1saXN0RGlmZmVyZW5jZShpbnRlcmZhY2VOYW1lcyxmYWNldE5hbWVzKTtcbmV4dHJhRmFjZXROYW1lcy5sZW5ndGg9PT0wfHxcbkZhaWwgYEZhY2V0cyAke3EoZXh0cmFGYWNldE5hbWVzKX0gb2YgJHtxKHRhZyl9IG5vdCBndWFyZGVkIGJ5IGludGVyZmFjZXNgO1xuIH1cbmNvbnN0IGNvbnRleHRNYXBOYW1lcz1vd25LZXlzKGNvbnRleHRNYXBLaXQpO1xuY29uc3QgZXh0cmFDb250ZXh0TmFtZXM9bGlzdERpZmZlcmVuY2UoZmFjZXROYW1lcyxjb250ZXh0TWFwTmFtZXMpO1xuZXh0cmFDb250ZXh0TmFtZXMubGVuZ3RoPT09MHx8XG5GYWlsIGBDb250ZXh0cyAke3EoZXh0cmFDb250ZXh0TmFtZXMpfSBub3QgaW1wbGVtZW50ZWQgYnkgJHtxKHRhZyl9YDtcbmNvbnN0IGV4dHJhRmFjZXROYW1lcz1saXN0RGlmZmVyZW5jZShjb250ZXh0TWFwTmFtZXMsZmFjZXROYW1lcyk7XG5leHRyYUZhY2V0TmFtZXMubGVuZ3RoPT09MHx8XG5GYWlsIGBGYWNldHMgJHtxKGV4dHJhRmFjZXROYW1lcyl9IG9mICR7cSh0YWcpfSBtaXNzaW5nIGNvbnRleHRzYDtcbnJldHVybiBvYmplY3RNYXAoYmVoYXZpb3JNZXRob2RzS2l0LChiZWhhdmlvck1ldGhvZHMsZmFjZXROYW1lKT0+XG5kZWZlbmRQcm90b3R5cGUoXG4gYCR7dGFnfSAke2ZhY2V0TmFtZX1gLFxuY29udGV4dE1hcEtpdFtmYWNldE5hbWVdLFxuYmVoYXZpb3JNZXRob2RzLFxudGhpc2Z1bE1ldGhvZHMsXG5pbnRlcmZhY2VHdWFyZEtpdCYmaW50ZXJmYWNlR3VhcmRLaXRbZmFjZXROYW1lXSkpO1xuXG5cbiB9OyRo4oCNX29uY2UuZGVmZW5kUHJvdG90eXBlS2l0KGRlZmVuZFByb3RvdHlwZUtpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmZW5kUHJvdG90eXBlIjpbImRlZmVuZFByb3RvdHlwZSJdLCJkZWZlbmRQcm90b3R5cGVLaXQiOlsiZGVmZW5kUHJvdG90eXBlS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKJ1R3y1BwAAtQcAADMAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvcGF0dGVybnMvaW50ZXJuYWwtdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKiBUT0RPKi9cbi8qIFRoZSBmb2xsb3dpbmcgY29tbWVudGVkIG91dCB0eXBlIHNob3VsZCBiZSBpbiB0aGlzIGZpbGUsIHNpbmNlIHRoZSovXG4vKiBgTWF0Y2hIZWxwZXJgIHR5cGUgaXMgcHVyZWx5IGludGVybmFsIHRvIHRoaXMgcGFja2FnZS4gSG93ZXZlciwqL1xuLyogaW4gb3JkZXIgdG8gZ2V0IHRoZSBnb3Zlcm5hbmNlIGFuZCBzb2xvIHBhY2thZ2VzIGJvdGggdG8gcGFzcyBsaW50LCovXG4vKiBJIG1vdmVkIHRoZSB0eXBlIGRlY2xhcmF0aW9uIGl0c2VsZiB0byB0eXBlcy5qcy4gU2VlIHRoZSBjb21tZW50cyB0aGVyZSovXG4vKiBhbmQgaW4gZXhwb3J0cy5qcyovXG5cbi8qIC8qKiovXG4vKiAqIEB0eXBlZGVmIHtvYmplY3R9IE1hdGNoSGVscGVyKi9cbi8qICogVGhpcyBmYWN0b3JzIG91dCBvbmx5IHRoZSBwYXJ0cyBzcGVjaWZpYyB0byBlYWNoIGtpbmQgb2YgTWF0Y2hlci4gSXQgaXMqL1xuLyogKiBlbmNhcHN1bGF0ZWQsIGFuZCBpdHMgbWV0aG9kcyBjYW4gbWFrZSB0aGUgc3RhdGVkIHVuY2hlY2tlciBhc3N1bXB0aW9ucyovXG4vKiAqIGVuZm9yY2VkIGJ5IHRoZSBjb21tb24gY2FsbGluZyBsb2dpYy4qL1xuLyogKiovXG4vKiAqIEBwcm9wZXJ0eSB7KGFsbGVnZWRQYXlsb2FkOiBQYXNzYWJsZSwqL1xuLyogKiAgICAgICAgICAgICBjaGVjazogQ2hlY2tlciovXG4vKiAqICkgPT4gYm9vbGVhbn0gY2hlY2tJc1dlbGxGb3JtZWQqL1xuLyogKiBBc3N1bWVzIHRoaXMgaXMgdGhlIHBheWxvYWQgb2YgYSBDb3B5VGFnZ2VkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcqL1xuLyogKiBtYXRjaFRhZy4gSXMgdGhpcyBhIHZhbGlkIHBheWxvYWQgZm9yIGEgTWF0Y2hlciB3aXRoIHRoYXQgdGFnPyovXG4vKiAqKi9cbi8qICogQHByb3BlcnR5IHsoc3BlY2ltZW46IFBhc3NhYmxlLCovXG4vKiAqICAgICAgICAgICAgIG1hdGNoZXJQYXlsb2FkOiBQYXNzYWJsZSwqL1xuLyogKiAgICAgICAgICAgICBjaGVjazogQ2hlY2tlciovXG4vKiAqICkgPT4gYm9vbGVhbn0gY2hlY2tNYXRjaGVzKi9cbi8qICogQXNzdW1pbmcgYSB2YWxpZCBNYXRjaGVyIG9mIHRoaXMgdHlwZSB3aXRoIGBtYXRjaGVyUGF5bG9hZGAgYXMgaXRzKi9cbi8qICogcGF5bG9hZCwgZG9lcyB0aGlzIHNwZWNpbWVuIG1hdGNoIHRoYXQgTWF0Y2hlcj8qL1xuLyogKiovXG4vKiAqIEBwcm9wZXJ0eSB7KHBheWxvYWQ6IFBhc3NhYmxlKSA9PiBSYW5rQ292ZXJ9IGdldFJhbmtDb3ZlciovXG4vKiAqIEFzc3VtZXMgdGhpcyBpcyB0aGUgcGF5bG9hZCBvZiBhIENvcHlUYWdnZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyovXG4vKiAqIG1hdGNoVGFnLiBSZXR1cm4gYSBSYW5rQ292ZXIgdG8gYm91bmQgZnJvbSBiZWxvdyBhbmQgYWJvdmUsKi9cbi8qICogaW4gcmFuayBvcmRlciwgYWxsIHBvc3NpYmxlIFBhc3NhYmxlcyB0aGF0IHdvdWxkIG1hdGNoIHRoaXMgTWF0Y2hlci4qL1xuLyogKiBUaGUgbGVmdCBlbGVtZW50IG11c3QgYmUgYmVmb3JlIG9yIHRoZSBzYW1lIHJhbmsgYXMgYW55IHBvc3NpYmxlKi9cbi8qICogbWF0Y2hpbmcgc3BlY2ltZW4uIFRoZSByaWdodCBlbGVtZW50IG11c3QgYmUgYWZ0ZXIgb3IgdGhlIHNhbWUqL1xuLyogKiByYW5rIGFzIGFueSBwb3NzaWJsZSBtYXRjaGluZyBzcGVjaW1lbi4qL1xuLyogKlgvKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA+00/Dsu7AADLuwAANAAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanN7ImltcG9ydHMiOlsiLi4va2V5cy9jaGVja0tleS5qcyIsIi4uL2tleXMvY29tcGFyZUtleXMuanMiLCJAYWdvcmljL2Fzc2VydCIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vbWFyc2hhbC9zcmMvZW5jb2RlUGFzc2FibGUuanMiLCJAZW5kby9tYXJzaGFsL3NyYy9yYW5rT3JkZXIuanMiXSwiZXhwb3J0cyI6WyJNIiwiTWluTWV0aG9kR3VhcmQiLCJhc3NlcnRQYXR0ZXJuIiwiY2hlY2tNYXRjaGVzIiwiZGVmYXVsdExpbWl0cyIsImdldFJhbmtDb3ZlciIsImlzUGF0dGVybiIsIm1hdGNoZXMiLCJtdXN0TWF0Y2giXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixGYXIsZ2V0VGFnLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsaGFzT3duUHJvcGVydHlPZixuYW1lRm9yUGFzc2FibGVTeW1ib2wsaWRlbnRDaGVja2VyLGFwcGx5TGFiZWxpbmdFcnJvcixmcm9tVW5pcXVlRW50cmllcyxsaXN0RGlmZmVyZW5jZSxjb21wYXJlUmFuayxnZXRQYXNzU3R5bGVDb3ZlcixpbnRlcnNlY3RSYW5rQ292ZXJzLHVuaW9uUmFua0NvdmVycyxyZWNvcmROYW1lcyxyZWNvcmRWYWx1ZXMsa2V5RVEsa2V5R1Qsa2V5R1RFLGtleUxULGtleUxURSxhc3NlcnRLZXksY2hlY2tLZXksaXNLZXksY2hlY2tTY2FsYXJLZXksY2hlY2tDb3B5U2V0LGNoZWNrQ29weU1hcCxjb3B5TWFwS2V5U2V0LGNoZWNrQ29weUJhZzskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcImlkZW50Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoaWRlbnRDaGVja2VyID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcImFwcGx5TGFiZWxpbmdFcnJvclwiLCBbJGjigI1fYSA9PiAoYXBwbHlMYWJlbGluZ0Vycm9yID0gJGjigI1fYSldXSxbXCJmcm9tVW5pcXVlRW50cmllc1wiLCBbJGjigI1fYSA9PiAoZnJvbVVuaXF1ZUVudHJpZXMgPSAkaOKAjV9hKV1dLFtcImxpc3REaWZmZXJlbmNlXCIsIFskaOKAjV9hID0+IChsaXN0RGlmZmVyZW5jZSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsL3NyYy9yYW5rT3JkZXIuanNcIiwgW1tcImNvbXBhcmVSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlUmFuayA9ICRo4oCNX2EpXV0sW1wiZ2V0UGFzc1N0eWxlQ292ZXJcIiwgWyRo4oCNX2EgPT4gKGdldFBhc3NTdHlsZUNvdmVyID0gJGjigI1fYSldXSxbXCJpbnRlcnNlY3RSYW5rQ292ZXJzXCIsIFskaOKAjV9hID0+IChpbnRlcnNlY3RSYW5rQ292ZXJzID0gJGjigI1fYSldXSxbXCJ1bmlvblJhbmtDb3ZlcnNcIiwgWyRo4oCNX2EgPT4gKHVuaW9uUmFua0NvdmVycyA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsL3NyYy9lbmNvZGVQYXNzYWJsZS5qc1wiLCBbW1wicmVjb3JkTmFtZXNcIiwgWyRo4oCNX2EgPT4gKHJlY29yZE5hbWVzID0gJGjigI1fYSldXSxbXCJyZWNvcmRWYWx1ZXNcIiwgWyRo4oCNX2EgPT4gKHJlY29yZFZhbHVlcyA9ICRo4oCNX2EpXV1dXSxbXCIuLi9rZXlzL2NvbXBhcmVLZXlzLmpzXCIsIFtbXCJrZXlFUVwiLCBbJGjigI1fYSA9PiAoa2V5RVEgPSAkaOKAjV9hKV1dLFtcImtleUdUXCIsIFskaOKAjV9hID0+IChrZXlHVCA9ICRo4oCNX2EpXV0sW1wia2V5R1RFXCIsIFskaOKAjV9hID0+IChrZXlHVEUgPSAkaOKAjV9hKV1dLFtcImtleUxUXCIsIFskaOKAjV9hID0+IChrZXlMVCA9ICRo4oCNX2EpXV0sW1wia2V5TFRFXCIsIFskaOKAjV9hID0+IChrZXlMVEUgPSAkaOKAjV9hKV1dXV0sW1wiLi4va2V5cy9jaGVja0tleS5qc1wiLCBbW1wiYXNzZXJ0S2V5XCIsIFskaOKAjV9hID0+IChhc3NlcnRLZXkgPSAkaOKAjV9hKV1dLFtcImNoZWNrS2V5XCIsIFskaOKAjV9hID0+IChjaGVja0tleSA9ICRo4oCNX2EpXV0sW1wiaXNLZXlcIiwgWyRo4oCNX2EgPT4gKGlzS2V5ID0gJGjigI1fYSldXSxbXCJjaGVja1NjYWxhcktleVwiLCBbJGjigI1fYSA9PiAoY2hlY2tTY2FsYXJLZXkgPSAkaOKAjV9hKV1dLFtcImNoZWNrQ29weVNldFwiLCBbJGjigI1fYSA9PiAoY2hlY2tDb3B5U2V0ID0gJGjigI1fYSldXSxbXCJjaGVja0NvcHlNYXBcIiwgWyRo4oCNX2EgPT4gKGNoZWNrQ29weU1hcCA9ICRo4oCNX2EpXV0sW1wiY29weU1hcEtleVNldFwiLCBbJGjigI1fYSA9PiAoY29weU1hcEtleVNldCA9ICRo4oCNX2EpXV0sW1wiY2hlY2tDb3B5QmFnXCIsIFskaOKAjV9hID0+IChjaGVja0NvcHlCYWcgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuY29uc3R7cXVvdGU6cSxkZXRhaWxzOlgsRmFpbH09YXNzZXJ0O1xuY29uc3R7ZW50cmllcyx2YWx1ZXN9PU9iamVjdDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbi8qKiBAdHlwZSBXZWFrU2V0PFBhdHRlcm4+ICovXG5jb25zdCBwYXR0ZXJuTWVtbz1uZXcgV2Vha1NldCgpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBNYXRjaCBIZWxwZXJzIEhlbHBlcnMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogRm9yIGZvcndhcmQgcmVmZXJlbmNlcyB0byBgTWAgKi9cbmxldCBNTTtcblxuLyoqXG4gKiBUaGUgYWN0dWFsIGRlZmF1bHQgdmFsdWVzIGhlcmUgYXJlLCBhdCB0aGUgcHJlc2VudCB0aW1lLCBmYWlybHlcbiAqIGFyYml0cmFyeSBjaG9pY2VzIGFuZCBtYXkgY2hhbmdlIGJlZm9yZSB0aGV5IHNldHRsZSBkb3duLiBPZiBjb3Vyc2VcbiAqIGF0IHNvbWUgcG9pbnQgd2UnbGwgbmVlZCB0byBzdG9wIGNoYW5naW5nIHRoZW0uIEJ1dCB3ZSBzaG91bGQgZmlyc3RcbiAqIHNlZSBob3cgb3VyIHN5c3RlbSBob2xkcyB1cCB3aXRoIHRoZXNlIGNob2ljZXMuIFRoZSBtYWluIGNyaXRlcmlhXG4gKiBpcyB0aGF0IHRoZXkgYmUgYmlnIGVub3VnaCB0aGF0IFwibm9ybWFsXCIgaW5ub2NlbnQgcHJvZ3JhbXMgcmFyZWx5XG4gKiBlbmNvdW50ZXIgdGhlc2UgbGltaXRzLlxuICpcbiAqIEV4cG9ydGVkIHByaW1hcmlseSBmb3IgdGVzdGluZy5cbiAqL1xuY29uc3QgICAgICAgIGRlZmF1bHRMaW1pdHM9aGFyZGVuKHtcbmRlY2ltYWxEaWdpdHNMaW1pdDoxMDAsXG5zdHJpbmdMZW5ndGhMaW1pdDoxMDBfMDAwLFxuc3ltYm9sTmFtZUxlbmd0aExpbWl0OjEwMCxcbm51bVByb3BlcnRpZXNMaW1pdDo4MCxcbnByb3BlcnR5TmFtZUxlbmd0aExpbWl0OjEwMCxcbmFycmF5TGVuZ3RoTGltaXQ6MTBfMDAwLFxubnVtU2V0RWxlbWVudHNMaW1pdDoxMF8wMDAsXG5udW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0OjEwXzAwMCxcbm51bU1hcEVudHJpZXNMaW1pdDo1MDAwfSk7XG5cblxuLyoqXG4gKiBVc2UgdGhlIHJlc3VsdCBvbmx5IHRvIGdldCB0aGUgbGltaXRzIHlvdSBuZWVkIGJ5IGRlc3RydWN0dXJpbmcuXG4gKiBUaHVzLCB0aGUgcmVzdWx0IG9ubHkgbmVlZHMgdG8gc3VwcG9ydCBkZXN0cnVjdHVyaW5nLiBUaGUgY3VycmVudFxuICogaW1wbGVtZW50YXRpb24gdXNlcyBpbmhlcml0YW5jZSBhcyBhIGNoZWFwIGhhY2suXG4gKlxuICogQHBhcmFtIHtMaW1pdHN9IFtsaW1pdHNdXG4gKiBAcmV0dXJucyB7QWxsTGltaXRzfVxuICovJGjigI1fb25jZS5kZWZhdWx0TGltaXRzKGRlZmF1bHRMaW1pdHMpO1xuY29uc3QgbGltaXQ9KGxpbWl0cz17fSk9PlxuLyoqIEB0eXBlIHtBbGxMaW1pdHN9ICovaGFyZGVuKHtfX3Byb3RvX186ZGVmYXVsdExpbWl0cywuLi5saW1pdHN9KTtcblxuY29uc3QgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQ9KFxucGF5bG9hZCxcbm1haW5QYXlsb2FkU2hhcGUsXG5jaGVjayxcbmxhYmVsKT0+XG57XG5hc3NlcnQoQXJyYXkuaXNBcnJheShtYWluUGF5bG9hZFNoYXBlKSk7XG5pZighQXJyYXkuaXNBcnJheShwYXlsb2FkKSl7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgJHtxKGxhYmVsKX0gcGF5bG9hZCBtdXN0IGJlIGFuIGFycmF5OiAke3BheWxvYWR9YCk7XG4gfVxuXG4vKiBXYXMgdGhlIGZvbGxvd2luZywgYnV0IGl0cyBvdmVydXNlIG9mIHBhdHRlcm5zIGNhdXNlZCBhbiBpbmZpbml0ZSByZWdyZXNzKi9cbi8qIGNvbnN0IHBheWxvYWRMaW1pdFNoYXBlID0gaGFyZGVuKCovXG4vKiBNLnNwbGl0KCovXG4vKiBtYWluUGF5bG9hZFNoYXBlLCovXG4vKiBNLnBhcnRpYWwoaGFyZGVuKFtNLnJlY29yZE9mKE0uc3RyaW5nKCksIE0ubnVtYmVyKCkpXSksIGhhcmRlbihbXSkpLCovXG4vKiApLCovXG4vKiApOyovXG4vKiByZXR1cm4gY2hlY2tNYXRjaGVzKHBheWxvYWQsIHBheWxvYWRMaW1pdFNoYXBlLCBjaGVjaywgbGFiZWwpOyovXG5cbmNvbnN0IG1haW5MZW5ndGg9bWFpblBheWxvYWRTaGFwZS5sZW5ndGg7XG5pZighKHBheWxvYWQubGVuZ3RoPT09bWFpbkxlbmd0aHx8cGF5bG9hZC5sZW5ndGg9PT1tYWluTGVuZ3RoKzEpKXtcbnJldHVybiBjaGVjayhmYWxzZSxYIGAke3EobGFiZWwpfSBwYXlsb2FkIHVuZXhwZWN0ZWQgc2l6ZTogJHtwYXlsb2FkfWApO1xuIH1cbmNvbnN0IGxpbWl0cz1wYXlsb2FkW21haW5MZW5ndGhdO1xucGF5bG9hZD1oYXJkZW4ocGF5bG9hZC5zbGljZSgwLG1haW5MZW5ndGgpKTtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5pZighY2hlY2tNYXRjaGVzKHBheWxvYWQsbWFpblBheWxvYWRTaGFwZSxjaGVjayxsYWJlbCkpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmlmKGxpbWl0cz09PXVuZGVmaW5lZCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4oXG4ocGFzc1N0eWxlT2YobGltaXRzKT09PSdjb3B5UmVjb3JkJ3x8XG5jaGVjayhmYWxzZSxYIGBMaW1pdHMgbXVzdCBiZSBhIHJlY29yZDogJHtxKGxpbWl0cyl9YCkpJiZcbmVudHJpZXMobGltaXRzKS5ldmVyeShcbihba2V5LHZhbHVlXSk9PlxucGFzc1N0eWxlT2YodmFsdWUpPT09J251bWJlcid8fFxuY2hlY2soZmFsc2UsWCBgVmFsdWUgb2YgbGltaXQgJHtxKGtleSl9IGJ1dCBiZSBhIG51bWJlcjogJHtxKHZhbHVlKX1gKSkpO1xuXG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7bnVtYmVyfSBkZWNpbWFsRGlnaXRzTGltaXRcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqL1xuY29uc3QgY2hlY2tEZWNpbWFsRGlnaXRzTGltaXQ9KHNwZWNpbWVuLGRlY2ltYWxEaWdpdHNMaW1pdCxjaGVjayk9PntcbmlmKFxuTWF0aC5mbG9vcihNYXRoLmxvZzEwKE1hdGguYWJzKE51bWJlcihzcGVjaW1lbikpKSkrMTw9XG5kZWNpbWFsRGlnaXRzTGltaXQpXG57XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYGJpZ2ludCAke3NwZWNpbWVufSBtdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiAke2RlY2ltYWxEaWdpdHNMaW1pdH0gZGlnaXRzYCk7XG5cbiB9O1xuXG4vKipcbiAqIEByZXR1cm5zIHtQYXR0ZXJuS2l0fVxuICovXG5jb25zdCBtYWtlUGF0dGVybktpdD0oKT0+e1xuLyoqXG4gKiBJZiB0aGlzIGlzIGEgcmVjb2duaXplZCBtYXRjaCB0YWcsIHJldHVybiB0aGUgTWF0Y2hIZWxwZXIuXG4gKiBPdGhlcndpc2UgcmVzdWx0IHVuZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcmV0dXJucyB7TWF0Y2hIZWxwZXIgfCB1bmRlZmluZWR9XG4gKi9cbmNvbnN0IG1heWJlTWF0Y2hIZWxwZXI9KHRhZyk9PlxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbkhlbHBlcnNCeU1hdGNoVGFnW3RhZ107XG5cbi8qKlxuICogQHR5cGVkZWYge3N0cmluZ30gS2luZFxuICogSXQgaXMgZWl0aGVyIGEgUGFzc1N0eWxlIG90aGVyIHRoYW4gJ3RhZ2dlZCcsIG9yLCBpZiB0aGUgdW5kZXJseWluZ1xuICogUGFzc1N0eWxlIGlzICd0YWdnZWQnLCB0aGVuIHRoZSBgZ2V0VGFnYCB2YWx1ZSBmb3IgdGFncyB0aGF0IGFyZVxuICogcmVjb2duaXplZCBhdCB0aGUgc3RvcmUgbGV2ZWwgb2YgYWJzdHJhY3Rpb24uIEZvciBlYWNoIG9mIHRob3NlXG4gKiB0YWdzLCBhIHRhZ2dlZCByZWNvcmQgb25seSBoYXMgdGhhdCBraW5kIGlmIGl0IHNhdGlzZmllcyB0aGUgaW52YXJpYW50c1xuICogdGhhdCB0aGUgc3RvcmUgbGV2ZWwgYXNzb2NpYXRlcyB3aXRoIHRoYXQga2luZC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlIHtXZWFrTWFwPENvcHlUYWdnZWQsIEtpbmQ+fVxuICogT25seSBmb3IgdGFnZ2VkIHJlY29yZHMgb2YgcmVjb2duaXplZCBraW5kcyB3aG9zZSBzdG9yZS1sZXZlbCBpbnZhcmlhbnRzXG4gKiBoYXZlIGFscmVhZHkgYmVlbiBjaGVja2VkLlxuICovXG5jb25zdCB0YWdNZW1vPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQ2hlY2tzIG9ubHkgcmVjb2duaXplZCB0YWdzLCBhbmQgb25seSBpZiB0aGUgdGFnZ2VkXG4gKiBwYXNzZXMgdGhlIGludmFyaWFudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgcmVjb2duaXRpb24uXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdGFnZ2VkXG4gKiBAcGFyYW0ge0tpbmR9IHRhZ1xuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrVGFnZ2VkPSh0YWdnZWQsdGFnLGNoZWNrKT0+e1xuY29uc3QgbWF0Y2hIZWxwZXI9bWF5YmVNYXRjaEhlbHBlcih0YWcpO1xuaWYobWF0Y2hIZWxwZXIpe1xuLyogQnVyaWVkIGhlcmUgaXMgdGhlIGltcG9ydGFudCBjYXNlLCB3aGVyZSB3ZSBwcm9jZXNzKi9cbi8qIHRoZSB2YXJpb3VzIHBhdHRlcm5Ob2RlcyovXG5yZXR1cm4gbWF0Y2hIZWxwZXIuY2hlY2tJc1dlbGxGb3JtZWQodGFnZ2VkLnBheWxvYWQsY2hlY2spO1xuIH1cbnN3aXRjaCh0YWcpe1xuY2FzZSdjb3B5U2V0Jzp7XG5yZXR1cm4gY2hlY2tDb3B5U2V0KHRhZ2dlZCxjaGVjayk7XG4gfVxuY2FzZSdjb3B5QmFnJzp7XG5yZXR1cm4gY2hlY2tDb3B5QmFnKHRhZ2dlZCxjaGVjayk7XG4gfVxuY2FzZSdjb3B5TWFwJzp7XG5yZXR1cm4gY2hlY2tDb3B5TWFwKHRhZ2dlZCxjaGVjayk7XG4gfVxuZGVmYXVsdDp7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYGNhbm5vdCBjaGVjayB1bnJlY29nbml6ZWQgdGFnICR7cSh0YWcpfTogJHt0YWdnZWR9YCk7XG5cbiB9fVxuXG4gfTtcblxuLyoqXG4gKiBSZXR1cm5zIG9ubHkgYSByZWNvZ25pemVkIGtpbmQsIGFuZCBvbmx5IGlmIHRoZSBzcGVjaW1lbiBwYXNzZXMgdGhlXG4gKiBpbnZhcmlhbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHJlY29nbml0aW9uLlxuICogT3RoZXJ3aXNlLCBgY2hlY2soZmFsc2UsIC4uLilgIGFuZCByZXR1cm5zIHVuZGVmaW5lZFxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtLaW5kIHwgdW5kZWZpbmVkfVxuICovXG5jb25zdCBraW5kT2Y9KHNwZWNpbWVuLGNoZWNrPWlkZW50Q2hlY2tlcik9PntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihzcGVjaW1lbik7XG5pZihwYXNzU3R5bGUhPT0ndGFnZ2VkJyl7XG5yZXR1cm4gcGFzc1N0eWxlO1xuIH1cbi8qIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGF0IHNwZWNpbWVuIGlzIGEgd2VsbCBmb3JtZWQqL1xuLyogYXMgYSB0YWdnZWQgcmVjb3JkLCB3aGljaCBpcyBkZWZpbmVkIGF0IHRoZSBtYXJzaGFsIGxldmVsIG9mIGFic3RyYWN0aW9uLCovXG4vKiBzaW5jZSBgcGFzc1N0eWxlT2ZgIGNoZWNrcyB0aG9zZSBpbnZhcmlhbnRzLiovXG5pZih0YWdNZW1vLmhhcyhzcGVjaW1lbikpe1xucmV0dXJuIHRhZ01lbW8uZ2V0KHNwZWNpbWVuKTtcbiB9XG5jb25zdCB0YWc9Z2V0VGFnKHNwZWNpbWVuKTtcbmlmKGNoZWNrVGFnZ2VkKHNwZWNpbWVuLHRhZyxjaGVjaykpe1xudGFnTWVtby5zZXQoc3BlY2ltZW4sdGFnKTtcbnJldHVybiB0YWc7XG4gfVxuaWYoY2hlY2shPT1pZGVudENoZWNrZXIpe1xuY2hlY2soZmFsc2UsWCBgY2Fubm90IGNoZWNrIHVucmVjb2duaXplZCB0YWcgJHtxKHRhZyl9YCk7XG4gfVxucmV0dXJuIHVuZGVmaW5lZDtcbiB9O1xuaGFyZGVuKGtpbmRPZik7XG5cbi8qKlxuICogQ2hlY2tzIG9ubHkgcmVjb2duaXplZCBraW5kcywgYW5kIG9ubHkgaWYgdGhlIHNwZWNpbWVuXG4gKiBwYXNzZXMgdGhlIGludmFyaWFudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgcmVjb2duaXRpb24uXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7S2luZH0ga2luZFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrS2luZD0oc3BlY2ltZW4sa2luZCxjaGVjayk9PntcbmNvbnN0IHJlYWxLaW5kPWtpbmRPZihzcGVjaW1lbixjaGVjayk7XG5pZihraW5kPT09cmVhbEtpbmQpe1xucmV0dXJuIHRydWU7XG4gfVxuaWYoY2hlY2shPT1pZGVudENoZWNrZXIpe1xuLyogcXVvdGluZyB3aXRob3V0IHF1b3RlcyovXG5jb25zdCBkZXRhaWxzPVgoWyBgJHtyZWFsS2luZH0gYCxgIC0gTXVzdCBiZSBhICR7a2luZH1gXSxzcGVjaW1lbik7XG5jaGVjayhmYWxzZSxkZXRhaWxzKTtcbiB9XG5yZXR1cm4gZmFsc2U7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzcGVjaW1lblxuICogQHBhcmFtIHtLZXl9IGtleUFzUGF0dGVyblxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrQXNLZXlQYXR0PShzcGVjaW1lbixrZXlBc1BhdHRlcm4sY2hlY2spPT57XG5pZihrZXlFUShzcGVjaW1lbixrZXlBc1BhdHRlcm4pKXtcbnJldHVybiB0cnVlO1xuIH1cbnJldHVybihcbmNoZWNrIT09aWRlbnRDaGVja2VyJiZcbmNoZWNrKGZhbHNlLFggYCR7c3BlY2ltZW59IC0gTXVzdCBiZTogJHtrZXlBc1BhdHRlcm59YCkpO1xuXG4gfTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gaXNQYXR0ZXJuIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEB0eXBlIHtDaGVja1BhdHRlcm59ICovXG5jb25zdCBjaGVja1BhdHRlcm49KHBhdHQsY2hlY2spPT57XG5pZihpc0tleShwYXR0KSl7XG4vKiBBbGwga2V5cyBhcmUgcGF0dGVybnMuIEZvciB0aGVzZSwgdGhlIGtleU1lbW8gd2lsbCBkby4qL1xuLyogQWxsIHByaW1pdGl2ZXMgdGhhdCBhcmUgcGF0dGVybnMgYXJlIGFsc28ga2V5cywgd2hpY2ggdGhpcyovXG4vKiBhbHNvIHRha2VzIGNhcmUgb2Ygd2l0aG91dCBtZW1vLiBUaGUgcmVzdCBvZiBvdXIgY2hlY2tpbmcgbG9naWMqL1xuLyogaXMgb25seSBjb25jZXJuZWQgd2l0aCBub24ta2V5IHBhdHRlcm5zLiovXG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihwYXR0ZXJuTWVtby5oYXMocGF0dCkpe1xucmV0dXJuIHRydWU7XG4gfVxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmNvbnN0IHJlc3VsdD1jaGVja1BhdHRlcm5JbnRlcm5hbChwYXR0LGNoZWNrKTtcbmlmKHJlc3VsdCl7XG5wYXR0ZXJuTWVtby5hZGQocGF0dCk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhdHQgLSBrbm93biBub3QgdG8gYmUgYSBrZXksIGFuZCB0aGVyZWZvcmUga25vd25cbiAqIG5vdCB0byBiZSBwcmltaXRpdmUuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tQYXR0ZXJuSW50ZXJuYWw9KHBhdHQsY2hlY2spPT57XG4vKiBQdXJwb3NlbHkgcGFyYWxsZWxzIGNoZWNrS2V5LiBUT0RPIHJldXNlIG1vcmUgbG9naWMgYmV0d2VlbiB0aGVtLiovXG4vKiBNb3N0IG9mIHRoZSB0ZXh0IG9mIHRoZSBzd2l0Y2ggYmVsb3cgbm90IGRlYWxpbmcgd2l0aCBtYXRjaGVycyBpcyovXG4vKiBlc3NlbnRpYWxseSBpZGVudGljYWwuKi9cbmNvbnN0IGNoZWNrSXQ9KGNoaWxkKT0+Y2hlY2tQYXR0ZXJuKGNoaWxkLGNoZWNrKTtcblxuY29uc3Qga2luZD1raW5kT2YocGF0dCxjaGVjayk7XG5zd2l0Y2goa2luZCl7XG5jYXNlIHVuZGVmaW5lZDp7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG4vKiBBIGNvcHlSZWNvcmQgaXMgYSBwYXR0ZXJuIGlmZiBhbGwgaXRzIGNoaWxkcmVuIGFyZSovXG4vKiBwYXR0ZXJucyovXG5yZXR1cm4gdmFsdWVzKHBhdHQpLmV2ZXJ5KGNoZWNrSXQpO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG4vKiBBIGNvcHlBcnJheSBpcyBhIHBhdHRlcm4gaWZmIGFsbCBpdHMgY2hpbGRyZW4gYXJlKi9cbi8qIHBhdHRlcm5zKi9cbnJldHVybiBwYXR0LmV2ZXJ5KGNoZWNrSXQpO1xuIH1cbmNhc2UnY29weU1hcCc6e1xuLyogQSBjb3B5TWFwJ3Mga2V5cyBhcmUga2V5cyBhbmQgdGhlcmVmb3JlIGFscmVhZHkga25vd24gdG8gYmUqL1xuLyogcGF0dGVybnMuKi9cbi8qIEEgY29weU1hcCBpcyBhIHBhdHRlcm4gaWYgaXRzIHZhbHVlcyBhcmUgcGF0dGVybnMuKi9cbnJldHVybiBjaGVja1BhdHRlcm4ocGF0dC52YWx1ZXMsY2hlY2spO1xuIH1cbmNhc2UnZXJyb3InOlxuY2FzZSdwcm9taXNlJzp7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgQSAke3Eoa2luZCl9IGNhbm5vdCBiZSBhIHBhdHRlcm5gKTtcbiB9XG5kZWZhdWx0OntcbmlmKG1heWJlTWF0Y2hIZWxwZXIoa2luZCkhPT11bmRlZmluZWQpe1xucmV0dXJuIHRydWU7XG4gfVxucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBBIHBhc3NhYmxlIG9mIGtpbmQgJHtxKGtpbmQpfSBpcyBub3QgYSBwYXR0ZXJuOiAke3BhdHR9YCk7XG5cbiB9fVxuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXR0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXNQYXR0ZXJuPShwYXR0KT0+Y2hlY2tQYXR0ZXJuKHBhdHQsaWRlbnRDaGVja2VyKTtcblxuLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRcbiAqL1xuY29uc3QgYXNzZXJ0UGF0dGVybj0ocGF0dCk9PntcbmNoZWNrUGF0dGVybihwYXR0LGFzc2VydENoZWNrZXIpO1xuIH07XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIG1hdGNoZXMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dGVyblxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbbGFiZWxdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tNYXRjaGVzPShzcGVjaW1lbixwYXR0ZXJuLGNoZWNrLGxhYmVsPXVuZGVmaW5lZCk9PlxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmFwcGx5TGFiZWxpbmdFcnJvcihjaGVja01hdGNoZXNJbnRlcm5hbCxbc3BlY2ltZW4scGF0dGVybixjaGVja10sbGFiZWwpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja01hdGNoZXNJbnRlcm5hbD0oc3BlY2ltZW4scGF0dCxjaGVjayk9Pntcbi8qIFdvcnRoIGJlaW5nIGEgYml0IHZlcmJvc2UgYW5kIHJlcGV0aXRpdmUgaW4gb3JkZXIgdG8gb3B0aW1pemUqL1xuY29uc3QgcGF0dGVybktpbmQ9a2luZE9mKHBhdHQsY2hlY2spO1xuY29uc3Qgc3BlY2ltZW5LaW5kPWtpbmRPZihzcGVjaW1lbik7LyogbWF5IGJlIHVuZGVmaW5lZCovXG5zd2l0Y2gocGF0dGVybktpbmQpe1xuY2FzZSB1bmRlZmluZWQ6e1xucmV0dXJuIEZhaWwgYHBhdHRlcm4gZXhwZWN0ZWQ6ICR7cGF0dH1gO1xuIH1cbmNhc2UncHJvbWlzZSc6e1xucmV0dXJuIEZhaWwgYHByb21pc2VzIGNhbm5vdCBiZSBwYXR0ZXJuczogJHtwYXR0fWA7XG4gfVxuY2FzZSdlcnJvcic6e1xucmV0dXJuIEZhaWwgYGVycm9ycyBjYW5ub3QgYmUgcGF0dGVybnM6ICR7cGF0dH1gO1xuIH1cbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnbnVsbCc6XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdudW1iZXInOlxuY2FzZSdiaWdpbnQnOlxuY2FzZSdzdHJpbmcnOlxuY2FzZSdzeW1ib2wnOlxuY2FzZSdjb3B5U2V0JzpcbmNhc2UnY29weUJhZyc6XG5jYXNlJ3JlbW90YWJsZSc6e1xuLyogVGhlc2Uga2luZHMgYXJlIG5lY2Vzc2FyaWx5IGtleXMqL1xucmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLHBhdHQsY2hlY2spO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG5pZihpc0tleShwYXR0KSl7XG4vKiBUYWtlcyBjYXJlIG9mIHBhdHRlcm5zIHdoaWNoIGFyZSBrZXlzLCBzbyB0aGUgcmVzdCBvZiB0aGlzKi9cbi8qIGxvZ2ljIGNhbiBhc3N1bWUgcGF0dGVybnMgdGhhdCBhcmUgbm90IGtleXMuKi9cbnJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbixwYXR0LGNoZWNrKTtcbiB9XG5pZihzcGVjaW1lbktpbmQhPT0nY29weUFycmF5Jyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBhIGNvcHlBcnJheSB0byBtYXRjaCBhIGNvcHlBcnJheSBwYXR0ZXJuOiAke3BhdHR9YCk7XG5cbiB9XG5jb25zdHtsZW5ndGh9PXBhdHQ7XG5pZihzcGVjaW1lbi5sZW5ndGghPT1sZW5ndGgpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBBcnJheSAke3NwZWNpbWVufSAtIE11c3QgYmUgYXMgbG9uZyBhcyBjb3B5QXJyYXkgcGF0dGVybjogJHtwYXR0fWApO1xuXG4gfVxucmV0dXJuIHBhdHQuZXZlcnkoKHAsaSk9PmNoZWNrTWF0Y2hlcyhzcGVjaW1lbltpXSxwLGNoZWNrLGkpKTtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbmlmKGlzS2V5KHBhdHQpKXtcbi8qIFRha2VzIGNhcmUgb2YgcGF0dGVybnMgd2hpY2ggYXJlIGtleXMsIHNvIHRoZSByZXN0IG9mIHRoaXMqL1xuLyogbG9naWMgY2FuIGFzc3VtZSBwYXR0ZXJucyB0aGF0IGFyZSBub3Qga2V5cy4qL1xucmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLHBhdHQsY2hlY2spO1xuIH1cbmlmKHNwZWNpbWVuS2luZCE9PSdjb3B5UmVjb3JkJyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBhIGNvcHlSZWNvcmQgdG8gbWF0Y2ggYSBjb3B5UmVjb3JkIHBhdHRlcm46ICR7cGF0dH1gKTtcblxuIH1cbi8qIFRPRE8gRGV0ZWN0IGFuZCBhY2N1bXVsYXRlIGRpZmZlcmVuY2UgaW4gb25lIHBhc3MuKi9cbi8qIFJhdGhlciB0aGFuIHVzaW5nIHR3byBjYWxscyB0byBgbGlzdERpZmZlcmVuY2VgIHRvIGRldGVjdCBhbmQqL1xuLyogcmVwb3J0IGlmIGFuZCBob3cgdGhlc2UgbGlzdHMgZGlmZmVyLCBzaW5jZSB0aGV5IGFyZSBhbHJlYWR5Ki9cbi8qIGluIHNvcnRlZCBvcmRlciwgd2Ugc2hvdWxkIGluc3RlYWQgdXNlIGFuIGFsZ29yaXRobSBsaWtlKi9cbi8qIGBpdGVyRGlzam9pbnRVbmlvbmAgZnJvbSBtZXJnZS1zb3J0LW9wZXJhdG9ycy5qcyovXG5jb25zdCBzcGVjaW1lbk5hbWVzPXJlY29yZE5hbWVzKHNwZWNpbWVuKTtcbmNvbnN0IHBhdHROYW1lcz1yZWNvcmROYW1lcyhwYXR0KTtcbmNvbnN0IG1pc3Npbmc9bGlzdERpZmZlcmVuY2UocGF0dE5hbWVzLHNwZWNpbWVuTmFtZXMpO1xuaWYobWlzc2luZy5sZW5ndGg+PTEpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGAke3NwZWNpbWVufSAtIE11c3QgaGF2ZSBtaXNzaW5nIHByb3BlcnRpZXMgJHtxKG1pc3NpbmcpfWApO1xuXG4gfVxuY29uc3QgdW5leHBlY3RlZD1saXN0RGlmZmVyZW5jZShzcGVjaW1lbk5hbWVzLHBhdHROYW1lcyk7XG5pZih1bmV4cGVjdGVkLmxlbmd0aD49MSl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBub3QgaGF2ZSB1bmV4cGVjdGVkIHByb3BlcnRpZXM6ICR7cShcbnVuZXhwZWN0ZWQpXG4gfWApO1xuXG4gfVxuY29uc3Qgc3BlY2ltZW5WYWx1ZXM9cmVjb3JkVmFsdWVzKHNwZWNpbWVuLHNwZWNpbWVuTmFtZXMpO1xuY29uc3QgcGF0dFZhbHVlcz1yZWNvcmRWYWx1ZXMocGF0dCxwYXR0TmFtZXMpO1xucmV0dXJuIHBhdHROYW1lcy5ldmVyeSgobGFiZWwsaSk9PlxuY2hlY2tNYXRjaGVzKHNwZWNpbWVuVmFsdWVzW2ldLHBhdHRWYWx1ZXNbaV0sY2hlY2ssbGFiZWwpKTtcblxuIH1cbmNhc2UnY29weU1hcCc6e1xuaWYoaXNLZXkocGF0dCkpe1xuLyogVGFrZXMgY2FyZSBvZiBwYXR0ZXJucyB3aGljaCBhcmUga2V5cywgc28gdGhlIHJlc3Qgb2YgdGhpcyovXG4vKiBsb2dpYyBjYW4gYXNzdW1lIHBhdHRlcm5zIHRoYXQgYXJlIG5vdCBrZXlzLiovXG5yZXR1cm4gY2hlY2tBc0tleVBhdHQoc3BlY2ltZW4scGF0dCxjaGVjayk7XG4gfVxuaWYoc3BlY2ltZW5LaW5kIT09J2NvcHlNYXAnKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIGEgY29weU1hcCB0byBtYXRjaCBhIGNvcHlNYXAgcGF0dGVybjogJHtwYXR0fWApO1xuXG4gfVxuY29uc3R7cGF5bG9hZDpwYXR0UGF5bG9hZH09cGF0dDtcbmNvbnN0e3BheWxvYWQ6c3BlY2ltZW5QYXlsb2FkfT1zcGVjaW1lbjtcbmNvbnN0IHBhdHRLZXlTZXQ9Y29weU1hcEtleVNldChwYXR0UGF5bG9hZCk7XG5jb25zdCBzcGVjaW1lbktleVNldD1jb3B5TWFwS2V5U2V0KHNwZWNpbWVuUGF5bG9hZCk7XG4vKiBDb21wYXJlIGtleXMgYXMgY29weVNldHMqL1xuaWYoIWNoZWNrTWF0Y2hlcyhzcGVjaW1lbktleVNldCxwYXR0S2V5U2V0LGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3QgcGF0dFZhbHVlcz1wYXR0UGF5bG9hZC52YWx1ZXM7XG5jb25zdCBzcGVjaW1lblZhbHVlcz1zcGVjaW1lblBheWxvYWQudmFsdWVzO1xuLyogY29tcGFyZSB2YWx1ZXMgYXMgY29weUFycmF5cyovXG5yZXR1cm4gY2hlY2tNYXRjaGVzKHNwZWNpbWVuVmFsdWVzLHBhdHRWYWx1ZXMsY2hlY2spO1xuIH1cbmRlZmF1bHQ6e1xuY29uc3QgbWF0Y2hIZWxwZXI9bWF5YmVNYXRjaEhlbHBlcihwYXR0ZXJuS2luZCk7XG5pZihtYXRjaEhlbHBlcil7XG5yZXR1cm4gbWF0Y2hIZWxwZXIuY2hlY2tNYXRjaGVzKHNwZWNpbWVuLHBhdHQucGF5bG9hZCxjaGVjayk7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IHNob3VsZCBoYXZlIHJlY29nbml6ZWQgJHtxKHBhdHRlcm5LaW5kKX0gYDtcbiB9fVxuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJufSBwYXR0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgbWF0Y2hlcz0oc3BlY2ltZW4scGF0dCk9PlxuY2hlY2tNYXRjaGVzKHNwZWNpbWVuLHBhdHQsaWRlbnRDaGVja2VyKTtcblxuLyoqXG4gKiBSZXR1cm5pbmcgbm9ybWFsbHkgaW5kaWNhdGVzIHN1Y2Nlc3MuIE1hdGNoIGZhaWx1cmUgaXMgaW5kaWNhdGVkIGJ5XG4gKiB0aHJvd2luZy5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJufSBwYXR0XG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtsYWJlbF1cbiAqL1xuY29uc3QgbXVzdE1hdGNoPShzcGVjaW1lbixwYXR0LGxhYmVsPXVuZGVmaW5lZCk9PntcbmlmKGNoZWNrTWF0Y2hlcyhzcGVjaW1lbixwYXR0LGlkZW50Q2hlY2tlcixsYWJlbCkpe1xucmV0dXJuO1xuIH1cbi8qIHNob3VsZCBvbmx5IHRocm93Ki9cbmNoZWNrTWF0Y2hlcyhzcGVjaW1lbixwYXR0LGFzc2VydENoZWNrZXIsbGFiZWwpO1xuRmFpbCBgaW50ZXJuYWw6ICR7bGFiZWx9OiBpbmNvbnNpc3RlbnQgcGF0dGVybiBtYXRjaDogJHtxKHBhdHQpfWA7XG4gfTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gZ2V0UmFua0NvdmVyIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEB0eXBlIHtHZXRSYW5rQ292ZXJ9ICovXG5jb25zdCBnZXRSYW5rQ292ZXI9KHBhdHQsZW5jb2RlUGFzc2FibGUpPT57XG5pZihpc0tleShwYXR0KSl7XG5jb25zdCBlbmNvZGVkPWVuY29kZVBhc3NhYmxlKHBhdHQpO1xuaWYoZW5jb2RlZCE9PXVuZGVmaW5lZCl7XG5yZXR1cm5bZW5jb2RlZCwgYCR7ZW5jb2RlZH1+YF07XG4gfVxuIH1cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwYXR0KTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdjb3B5QXJyYXknOntcbi8qIFhYWCB0aGlzIGRvZXNuJ3QgZ2V0IGFsb25nIHdpdGggdGhlIHdvcmxkIG9mIGNvdmVyID09PSBwYWlyIG9mKi9cbi8qIHN0cmluZ3MuIEluIHRoZSBtZWFudGltZSwgZmFsbCB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IHdoaWNoKi9cbi8qIHJldHVybnMgYSBjb3ZlciB0aGF0IGNvdmVycyBhbGwgY29weUFycmF5cy4qL1xuLyoqL1xuLyogY29uc3QgcmFua0NvdmVycyA9IHBhdHQubWFwKHAgPT4gZ2V0UmFua0NvdmVyKHAsIGVuY29kZVBhc3NhYmxlKSk7Ki9cbi8qIHJldHVybiBoYXJkZW4oWyovXG4vKiByYW5rQ292ZXJzLm1hcCgoW2xlZnQsIF9yaWdodF0pID0+IGxlZnQpLCovXG4vKiByYW5rQ292ZXJzLm1hcCgoW19sZWZ0LCByaWdodF0pID0+IHJpZ2h0KSwqL1xuLyogXSk7Ki9cbmJyZWFrO1xuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuLyogWFhYIHRoaXMgZG9lc24ndCBnZXQgYWxvbmcgd2l0aCB0aGUgd29ybGQgb2YgY292ZXIgPT09IHBhaXIgb2YqL1xuLyogc3RyaW5ncy4gSW4gdGhlIG1lYW50aW1lLCBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgd2hpY2gqL1xuLyogcmV0dXJucyBhIGNvdmVyIHRoYXQgY292ZXJzIGFsbCBjb3B5UmVjb3Jkcy4qL1xuLyoqL1xuLyogY29uc3QgcGF0dEtleXMgPSBvd25LZXlzKHBhdHQpOyovXG4vKiBjb25zdCBwYXR0RW50cmllcyA9IGhhcmRlbihwYXR0S2V5cy5tYXAoa2V5ID0+IFtrZXksIHBhdHRba2V5XV0pKTsqL1xuLyogY29uc3QgW2xlZnRFbnRyaWVzTGltaXQsIHJpZ2h0RW50cmllc0xpbWl0XSA9Ki9cbi8qIGdldFJhbmtDb3ZlcihwYXR0RW50cmllcyk7Ki9cbi8qIHJldHVybiBoYXJkZW4oWyovXG4vKiBmcm9tVW5pcXVlRW50cmllcyhsZWZ0RW50cmllc0xpbWl0KSwqL1xuLyogZnJvbVVuaXF1ZUVudHJpZXMocmlnaHRFbnRyaWVzTGltaXQpLCovXG4vKiBdKTsqL1xuYnJlYWs7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0IHRhZz1nZXRUYWcocGF0dCk7XG5jb25zdCBtYXRjaEhlbHBlcj1tYXliZU1hdGNoSGVscGVyKHRhZyk7XG5pZihtYXRjaEhlbHBlcil7XG4vKiBCdXJpZWQgaGVyZSBpcyB0aGUgaW1wb3J0YW50IGNhc2UsIHdoZXJlIHdlIHByb2Nlc3MqL1xuLyogdGhlIHZhcmlvdXMgcGF0dGVybk5vZGVzKi9cbnJldHVybiBtYXRjaEhlbHBlci5nZXRSYW5rQ292ZXIocGF0dC5wYXlsb2FkLGVuY29kZVBhc3NhYmxlKTtcbiB9XG5zd2l0Y2godGFnKXtcbmNhc2UnY29weVNldCc6e1xuLyogWFhYIHRoaXMgZG9lc24ndCBnZXQgYWxvbmcgd2l0aCB0aGUgd29ybGQgb2YgY292ZXIgPT09IHBhaXIgb2YqL1xuLyogc3RyaW5ncy4gSW4gdGhlIG1lYW50aW1lLCBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgd2hpY2gqL1xuLyogcmV0dXJucyBhIGNvdmVyIHRoYXQgY292ZXJzIGFsbCBjb3B5U2V0cy4qL1xuLyoqL1xuLyogLy8gU2hvdWxkIGFscmVhZHkgYmUgdmFsaWRhdGVkIGJ5IGNoZWNrUGF0dGVybi4gQnV0IGJlY2F1c2UgdGhpcyovXG4vKiAvLyBpcyBhIGNoZWNrIHRoYXQgbWF5IGxvb3NlbiBvdmVyIHRpbWUsIHdlIGFsc28gYXNzZXJ0Ki9cbi8qIC8vIGV2ZXJ5d2hlcmUgd2Ugc3RpbGwgcmVseSBvbiB0aGUgcmVzdHJpY3Rpb24uKi9cbi8qIGBgYGpzKi9cbi8qIHBhdHQucGF5bG9hZC5sZW5ndGggPT09IDEgfHwqL1xuLyogRmFpbGBOb24tc2luZ2xldG9uIGNvcHlTZXRzIHdpdGggbWF0Y2hlciBub3QgeWV0IGltcGxlbWVudGVkOiAke3BhdHR9YDsqL1xuLyogYGBgKi9cbi8qKi9cbi8qIGNvbnN0IFtsZWZ0RWxlbWVudExpbWl0LCByaWdodEVsZW1lbnRMaW1pdF0gPSBnZXRSYW5rQ292ZXIoKi9cbi8qIHBhdHQucGF5bG9hZFswXSwqL1xuLyogKTsqL1xuLyogcmV0dXJuIGhhcmRlbihbKi9cbi8qIG1ha2VDb3B5U2V0KFtsZWZ0RWxlbWVudExpbWl0XSksKi9cbi8qIG1ha2VDb3B5U2V0KFtyaWdodEVsZW1lbnRMaW1pdF0pLCovXG4vKiBdKTsqL1xuYnJlYWs7XG4gfVxuY2FzZSdjb3B5TWFwJzp7XG4vKiBYWFggdGhpcyBkb2Vzbid0IGdldCBhbG9uZyB3aXRoIHRoZSB3b3JsZCBvZiBjb3ZlciA9PT0gcGFpciBvZiovXG4vKiBzdHJpbmdzLiBJbiB0aGUgbWVhbnRpbWUsIGZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCB3aGljaCovXG4vKiByZXR1cm5zIGEgY292ZXIgdGhhdCBjb3ZlcnMgYWxsIGNvcHlNYXBzLiovXG4vKiovXG4vKiAvLyBBIG1hdGNoaW5nIGNvcHlNYXAgbXVzdCBoYXZlIHRoZSBzYW1lIGtleXMsIG9yIGF0IG1vc3Qgb25lKi9cbi8qIC8vIG5vbi1rZXkga2V5IHBhdHRlcm4uIFRodXMgd2UgY2FuIGFzc3VtZSB0aGF0IHZhbHVlIHBvc2l0aW9ucyovXG4vKiAvLyBtYXRjaCAxLXRvLTEuKi9cbi8qIC8vKi9cbi8qIC8vIFRPRE8gSSBtYXkgYmUgb3Zlcmxvb2tpbmcgdGhhdCB0aGUgbGVzcyBwcmVjaXNlIHJhbmtPcmRlciovXG4vKiAvLyBlcXVpdmFsZW5jZSBjbGFzcyBtYXkgY2F1c2UgdmFsdWVzIHRvIGJlIG91dCBvZiBvcmRlciwqL1xuLyogLy8gbWFraW5nIHRoaXMgcmFua0NvdmVyIG5vdCBhY3R1YWxseSBjb3Zlci4gSW4gdGhhdCBjYXNlLCBmb3IqL1xuLyogLy8gYWxsIHRoZSB2YWx1ZXMgZm9yIGtleXMgYXQgdGhlIHNhbWUgcmFuaywgd2Ugc2hvdWxkIHVuaW9uIHRoZWlyKi9cbi8qIC8vIHJhbmsgY292ZXJzLiBUT0RPIFBPU1NJQkxFIFNJTEVOVCBDT1JSRUNUTkVTUyBCVUcqL1xuLyogLy8qL1xuLyogLy8gSWYgdGhpcyBpcyBhIGJ1ZywgaXQgcHJvYmFibHkgYWZmZWN0cyB0aGUgZ2V0UmFua0NvdmVyKi9cbi8qIC8vIGNhc2VzIG9mIG1hdGNoTFRFSGVscGVyIGFuZCBtYXRjaEdURUhlbHBlciBvbiBjb3B5TWFwIGFzKi9cbi8qIC8vIHdlbGwuIFNlZSBtYWtlQ29weU1hcCBmb3IgYW4gaWRlYSBvbiBmaXhpbmcqL1xuLyogLy8gdGhpcyBidWcuKi9cbi8qIGNvbnN0IFtsZWZ0UGF5bG9hZExpbWl0LCByaWdodFBheWxvYWRMaW1pdF0gPSBnZXRSYW5rQ292ZXIoKi9cbi8qIHBhdHQucGF5bG9hZCwqL1xuLyogZW5jb2RlUGFzc2FibGUsKi9cbi8qICk7Ki9cbi8qIHJldHVybiBoYXJkZW4oWyovXG4vKiBtYWtlVGFnZ2VkKCdjb3B5TWFwJywgbGVmdFBheWxvYWRMaW1pdCksKi9cbi8qIG1ha2VUYWdnZWQoJ2NvcHlNYXAnLCByaWdodFBheWxvYWRMaW1pdCksKi9cbi8qIF0pOyovXG5icmVhaztcbiB9XG5kZWZhdWx0OntcbmJyZWFrOy8qIGZhbGwgdGhyb3VnaCB0byBkZWZhdWx0Ki9cbiB9fVxuXG5icmVhazsvKiBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdCovXG4gfVxuZGVmYXVsdDp7XG5icmVhazsvKiBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdCovXG4gfX1cblxucmV0dXJuIGdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZSk7XG4gfTtcblxuY29uc3QgYXJyYXlFdmVyeU1hdGNoUGF0dGVybj0oYXJyYXkscGF0dCxjaGVjayxsYWJlbFByZWZpeD0nJyk9PntcbmlmKGNoZWNrS2luZChwYXR0LCdtYXRjaDphbnknLGlkZW50Q2hlY2tlcikpe1xuLyogaWYgdGhlIHBhdHRlcm4gaXMgTS5hbnkoKSwgd2Uga25vdyBpdHMgdHJ1ZSovXG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4gYXJyYXkuZXZlcnkoKGVsLGkpPT5cbmNoZWNrTWF0Y2hlcyhlbCxwYXR0LGNoZWNrLCBgJHtsYWJlbFByZWZpeH1bJHtpfV1gKSk7XG5cbiB9O1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBNYXRjaCBIZWxwZXJzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hBbnlIZWxwZXI9RmFyKCdtYXRjaDphbnkgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KF9zcGVjaW1lbixfbWF0Y2hlclBheWxvYWQsX2NoZWNrKT0+dHJ1ZSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KG1hdGNoZXJQYXlsb2FkLGNoZWNrKT0+XG5tYXRjaGVyUGF5bG9hZD09PXVuZGVmaW5lZHx8XG5jaGVjayhmYWxzZSxYIGBtYXRjaDphbnkgcGF5bG9hZDogJHttYXRjaGVyUGF5bG9hZH0gLSBNdXN0IGJlIHVuZGVmaW5lZGApLFxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+WycnLCd7J119KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hBbmRIZWxwZXI9RmFyKCdtYXRjaDphbmQgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHBhdHRzLGNoZWNrKT0+e1xucmV0dXJuIHBhdHRzLmV2ZXJ5KChwYXR0KT0+Y2hlY2tNYXRjaGVzKHNwZWNpbWVuLHBhdHQsY2hlY2spKTtcbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDooYWxsZWdlZFBhdHRzLGNoZWNrKT0+e1xuY29uc3QgY2hlY2tJdD0ocGF0dCk9PmNoZWNrUGF0dGVybihwYXR0LGNoZWNrKTtcbnJldHVybihcbihwYXNzU3R5bGVPZihhbGxlZ2VkUGF0dHMpPT09J2NvcHlBcnJheSd8fFxuY2hlY2soZmFsc2UsWCBgTmVlZHMgYXJyYXkgb2Ygc3ViLXBhdHRlcm5zOiAke2FsbGVnZWRQYXR0c31gKSkmJlxuYWxsZWdlZFBhdHRzLmV2ZXJ5KGNoZWNrSXQpKTtcblxuIH0sXG5cbmdldFJhbmtDb3ZlcjoocGF0dHMsZW5jb2RlUGFzc2FibGUpPT5cbmludGVyc2VjdFJhbmtDb3ZlcnMoXG5jb21wYXJlUmFuayxcbnBhdHRzLm1hcCgocCk9PmdldFJhbmtDb3ZlcihwLGVuY29kZVBhc3NhYmxlKSkpfSk7XG5cblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hPckhlbHBlcj1GYXIoJ21hdGNoOm9yIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixwYXR0cyxjaGVjayk9PntcbmNvbnN0e2xlbmd0aH09cGF0dHM7XG5pZihsZW5ndGg9PT0wKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBubyBwYXR0ZXJuIGRpc2p1bmN0cyB0byBtYXRjaDogJHtwYXR0c31gKTtcblxuIH1cbmlmKFxucGF0dHMubGVuZ3RoPT09MiYmXG4hbWF0Y2hlcyhzcGVjaW1lbixwYXR0c1swXSkmJlxuY2hlY2tLaW5kKHBhdHRzWzBdLCdtYXRjaDpraW5kJyxpZGVudENoZWNrZXIpJiZcbnBhdHRzWzBdLnBheWxvYWQ9PT0ndW5kZWZpbmVkJylcbntcbi8qIFdvcnRoIHNwZWNpYWwgY2FzaW5nIHRoZSBvcHRpb25hbCBwYXR0ZXJuIGZvciovXG4vKiBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMuKi9cbnJldHVybiBjaGVja01hdGNoZXMoc3BlY2ltZW4scGF0dHNbMV0sY2hlY2spO1xuIH1cbmlmKHBhdHRzLnNvbWUoKHBhdHQpPT5tYXRjaGVzKHNwZWNpbWVuLHBhdHQpKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IG1hdGNoIG9uZSBvZiAke3BhdHRzfWApO1xuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOm1hdGNoQW5kSGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG5nZXRSYW5rQ292ZXI6KHBhdHRzLGVuY29kZVBhc3NhYmxlKT0+XG51bmlvblJhbmtDb3ZlcnMoXG5jb21wYXJlUmFuayxcbnBhdHRzLm1hcCgocCk9PmdldFJhbmtDb3ZlcihwLGVuY29kZVBhc3NhYmxlKSkpfSk7XG5cblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hOb3RIZWxwZXI9RmFyKCdtYXRjaDpub3QgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHBhdHQsY2hlY2spPT57XG5pZihtYXRjaGVzKHNwZWNpbWVuLHBhdHQpKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGZhaWwgbmVnYXRlZCBwYXR0ZXJuOiAke3BhdHR9YCk7XG5cbiB9ZWxzZXtcbnJldHVybiB0cnVlO1xuIH1cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDpjaGVja1BhdHRlcm4sXG5cbmdldFJhbmtDb3ZlcjooX3BhdHQsX2VuY29kZVBhc3NhYmxlKT0+WycnLCd7J119KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hTY2FsYXJIZWxwZXI9RmFyKCdtYXRjaDpzY2FsYXIgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLF9tYXRjaGVyUGF5bG9hZCxjaGVjayk9PlxuY2hlY2tTY2FsYXJLZXkoc3BlY2ltZW4sY2hlY2spLFxuXG5jaGVja0lzV2VsbEZvcm1lZDptYXRjaEFueUhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlsnYScsJ3p+J119KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hLZXlIZWxwZXI9RmFyKCdtYXRjaDprZXkgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLF9tYXRjaGVyUGF5bG9hZCxjaGVjayk9PlxuY2hlY2tLZXkoc3BlY2ltZW4sY2hlY2spLFxuXG5jaGVja0lzV2VsbEZvcm1lZDptYXRjaEFueUhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlsnYScsJ3p+J119KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hQYXR0ZXJuSGVscGVyPUZhcignbWF0Y2g6cGF0dGVybiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sX21hdGNoZXJQYXlsb2FkLGNoZWNrKT0+XG5jaGVja1BhdHRlcm4oc3BlY2ltZW4sY2hlY2spLFxuXG5jaGVja0lzV2VsbEZvcm1lZDptYXRjaEFueUhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlsnYScsJ3p+J119KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hLaW5kSGVscGVyPUZhcignbWF0Y2g6a2luZCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczpjaGVja0tpbmQsXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihhbGxlZ2VkS2V5S2luZCxjaGVjayk9PlxudHlwZW9mIGFsbGVnZWRLZXlLaW5kPT09J3N0cmluZyd8fFxuY2hlY2soXG5mYWxzZSxcblggYG1hdGNoOmtpbmQ6IHBheWxvYWQ6ICR7YWxsZWdlZEtleUtpbmR9IC0gQSBraW5kIG5hbWUgbXVzdCBiZSBhIHN0cmluZ2ApLFxuXG5cbmdldFJhbmtDb3Zlcjooa2luZCxfZW5jb2RlUGFzc2FibGUpPT57XG5sZXQgc3R5bGU7XG5zd2l0Y2goa2luZCl7XG5jYXNlJ2NvcHlTZXQnOlxuY2FzZSdjb3B5TWFwJzp7XG5zdHlsZT0ndGFnZ2VkJztcbmJyZWFrO1xuIH1cbmRlZmF1bHQ6e1xuc3R5bGU9a2luZDtcbmJyZWFrO1xuIH19XG5cbnJldHVybiBnZXRQYXNzU3R5bGVDb3ZlcihzdHlsZSk7XG4gfX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEJpZ2ludEhlbHBlcj1GYXIoJ21hdGNoOmJpZ2ludCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sW2xpbWl0cz11bmRlZmluZWRdLGNoZWNrKT0+e1xuY29uc3R7ZGVjaW1hbERpZ2l0c0xpbWl0fT1saW1pdChsaW1pdHMpO1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdiaWdpbnQnLGNoZWNrKSYmXG5jaGVja0RlY2ltYWxEaWdpdHNMaW1pdChzcGVjaW1lbixkZWNpbWFsRGlnaXRzTGltaXQsY2hlY2spKTtcblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW10pLFxuY2hlY2ssXG4nbWF0Y2g6YmlnaW50IHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+XG5nZXRQYXNzU3R5bGVDb3ZlcignYmlnaW50Jyl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hOYXRIZWxwZXI9RmFyKCdtYXRjaDpuYXQgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLFtsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e2RlY2ltYWxEaWdpdHNMaW1pdH09bGltaXQobGltaXRzKTtcbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnYmlnaW50JyxjaGVjaykmJlxuY2hlY2soXG4vKiogQHR5cGUge2JpZ2ludH0gKi9zcGVjaW1lbj49MG4sXG5YIGAke3NwZWNpbWVufSAtIE11c3QgYmUgbm9uLW5lZ2F0aXZlYCkmJlxuXG5jaGVja0RlY2ltYWxEaWdpdHNMaW1pdChzcGVjaW1lbixkZWNpbWFsRGlnaXRzTGltaXQsY2hlY2spKTtcblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW10pLFxuY2hlY2ssXG4nbWF0Y2g6bmF0IHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+XG4vKiBUT0RPIENvdWxkIGJlIG1vcmUgcHJlY2lzZSovXG5nZXRQYXNzU3R5bGVDb3ZlcignYmlnaW50Jyl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hTdHJpbmdIZWxwZXI9RmFyKCdtYXRjaDpzdHJpbmcgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLFtsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e3N0cmluZ0xlbmd0aExpbWl0fT1saW1pdChsaW1pdHMpO1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdzdHJpbmcnLGNoZWNrKSYmKFxuc3BlY2ltZW4ubGVuZ3RoPD1zdHJpbmdMZW5ndGhMaW1pdHx8XG5jaGVjayhcbmZhbHNlLFxuWCBgc3RyaW5nICR7c3BlY2ltZW59IG11c3Qgbm90IGJlIGJpZ2dlciB0aGFuICR7c3RyaW5nTGVuZ3RoTGltaXR9YCkpKTtcblxuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbXSksXG5jaGVjayxcbidtYXRjaDpzdHJpbmcgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX21hdGNoUGF5bG9hZCxfZW5jb2RlUGFzc2FibGUpPT5cbmdldFBhc3NTdHlsZUNvdmVyKCdzdHJpbmcnKX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFN5bWJvbEhlbHBlcj1GYXIoJ21hdGNoOnN5bWJvbCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sW2xpbWl0cz11bmRlZmluZWRdLGNoZWNrKT0+e1xuY29uc3R7c3ltYm9sTmFtZUxlbmd0aExpbWl0fT1saW1pdChsaW1pdHMpO1xuaWYoIWNoZWNrS2luZChzcGVjaW1lbiwnc3ltYm9sJyxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmNvbnN0IHN5bWJvbE5hbWU9bmFtZUZvclBhc3NhYmxlU3ltYm9sKHNwZWNpbWVuKTtcblxuaWYodHlwZW9mIHN5bWJvbE5hbWUhPT0nc3RyaW5nJyl7XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogUGFzc2FibGUgc3ltYm9sICR7c3BlY2ltZW59IG11c3QgaGF2ZSBhIHBhc3NhYmxlIG5hbWVgO1xuIH1cbnJldHVybiBjaGVjayhcbnN5bWJvbE5hbWUubGVuZ3RoPD1zeW1ib2xOYW1lTGVuZ3RoTGltaXQsXG5YIGBTeW1ib2wgbmFtZSAke3EoXG5zeW1ib2xOYW1lKVxuIH0gbXVzdCBub3QgYmUgYmlnZ2VyIHRoYW4gJHtzeW1ib2xOYW1lTGVuZ3RoTGltaXR9YCk7XG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtdKSxcbmNoZWNrLFxuJ21hdGNoOnN5bWJvbCBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlxuZ2V0UGFzc1N0eWxlQ292ZXIoJ3N5bWJvbCcpfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoUmVtb3RhYmxlSGVscGVyPUZhcignbWF0Y2g6cmVtb3RhYmxlIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixyZW1vdGFibGVEZXNjLGNoZWNrKT0+e1xuLyogVW5mb3J0dW5hdGUgZHVwbGljYXRpb24gb2YgY2hlY2tLaW5kIGxvZ2ljLCBidXQgbm8gYmV0dGVyIGNob2ljZXMuKi9cbmlmKGNoZWNrS2luZChzcGVjaW1lbiwncmVtb3RhYmxlJyxpZGVudENoZWNrZXIpKXtcbnJldHVybiB0cnVlO1xuIH1cbmlmKGNoZWNrPT09aWRlbnRDaGVja2VyKXtcbnJldHVybiBmYWxzZTtcbiB9XG5sZXQgc3BlY2ltZW5LaW5kPXBhc3NTdHlsZU9mKHNwZWNpbWVuKTtcbmlmKHNwZWNpbWVuS2luZD09PSd0YWdnZWQnKXtcbnNwZWNpbWVuS2luZD1nZXRUYWcoc3BlY2ltZW4pO1xuIH1cbmNvbnN0e2xhYmVsfT1yZW1vdGFibGVEZXNjO1xuXG4vKiBxdW90aW5nIHdpdGhvdXQgcXVvdGVzKi9cbmNvbnN0IGRldGFpbHM9WChcblsgYCR7c3BlY2ltZW5LaW5kfSBgLGAgLSBNdXN0IGJlIGEgcmVtb3RhYmxlICgke2xhYmVsfSlgXSxcbnNwZWNpbWVuKTtcblxucmV0dXJuIGNoZWNrKGZhbHNlLGRldGFpbHMpO1xuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihhbGxlZ2VkUmVtb3RhYmxlRGVzYyxjaGVjayk9PlxuY2hlY2tNYXRjaGVzKFxuYWxsZWdlZFJlbW90YWJsZURlc2MsXG5oYXJkZW4oe2xhYmVsOk1NLnN0cmluZygpfSksXG5jaGVjayxcbidtYXRjaDpyZW1vdGFibGUgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX3JlbW90YWJsZURlc2MsX2VuY29kZVBhc3NhYmxlKT0+XG5nZXRQYXNzU3R5bGVDb3ZlcigncmVtb3RhYmxlJyl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hMVEVIZWxwZXI9RmFyKCdtYXRjaDpsdGUgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCxjaGVjayk9Plxua2V5TFRFKHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCl8fFxuY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIDw9ICR7cmlnaHRPcGVyYW5kfWApLFxuXG5jaGVja0lzV2VsbEZvcm1lZDpjaGVja0tleSxcblxuZ2V0UmFua0NvdmVyOihyaWdodE9wZXJhbmQsZW5jb2RlUGFzc2FibGUpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocmlnaHRPcGVyYW5kKTtcbi8qIFRoZSBwcmVmZXItY29uc3QgbWFrZXMgbm8gc2Vuc2Ugd2hlbiBzb21lIG9mIHRoZSB2YXJpYWJsZXMgbmVlZCovXG4vKiB0byBiZSBgbGV0YCovXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0Ki9cbmxldFtsZWZ0Qm91bmQscmlnaHRCb3VuZF09Z2V0UGFzc1N0eWxlQ292ZXIocGFzc1N0eWxlKTtcbmNvbnN0IG5ld1JpZ2h0Qm91bmQ9IGAke2VuY29kZVBhc3NhYmxlKHJpZ2h0T3BlcmFuZCl9fmA7XG5pZihuZXdSaWdodEJvdW5kIT09dW5kZWZpbmVkKXtcbnJpZ2h0Qm91bmQ9bmV3UmlnaHRCb3VuZDtcbiB9XG5yZXR1cm5bbGVmdEJvdW5kLHJpZ2h0Qm91bmRdO1xuIH19KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hMVEhlbHBlcj1GYXIoJ21hdGNoOmx0IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixyaWdodE9wZXJhbmQsY2hlY2spPT5cbmtleUxUKHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCl8fFxuY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIDwgJHtyaWdodE9wZXJhbmR9YCksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOmNoZWNrS2V5LFxuXG5nZXRSYW5rQ292ZXI6bWF0Y2hMVEVIZWxwZXIuZ2V0UmFua0NvdmVyfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoR1RFSGVscGVyPUZhcignbWF0Y2g6Z3RlIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixyaWdodE9wZXJhbmQsY2hlY2spPT5cbmtleUdURShzcGVjaW1lbixyaWdodE9wZXJhbmQpfHxcbmNoZWNrKGZhbHNlLFggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSA+PSAke3JpZ2h0T3BlcmFuZH1gKSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6Y2hlY2tLZXksXG5cbmdldFJhbmtDb3ZlcjoocmlnaHRPcGVyYW5kLGVuY29kZVBhc3NhYmxlKT0+e1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHJpZ2h0T3BlcmFuZCk7XG4vKiBUaGUgcHJlZmVyLWNvbnN0IG1ha2VzIG5vIHNlbnNlIHdoZW4gc29tZSBvZiB0aGUgdmFyaWFibGVzIG5lZWQqL1xuLyogdG8gYmUgYGxldGAqL1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdCovXG5sZXRbbGVmdEJvdW5kLHJpZ2h0Qm91bmRdPWdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZSk7XG5jb25zdCBuZXdMZWZ0Qm91bmQ9ZW5jb2RlUGFzc2FibGUocmlnaHRPcGVyYW5kKTtcbmlmKG5ld0xlZnRCb3VuZCE9PXVuZGVmaW5lZCl7XG5sZWZ0Qm91bmQ9bmV3TGVmdEJvdW5kO1xuIH1cbnJldHVybltsZWZ0Qm91bmQscmlnaHRCb3VuZF07XG4gfX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEdUSGVscGVyPUZhcignbWF0Y2g6Z3QgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCxjaGVjayk9Plxua2V5R1Qoc3BlY2ltZW4scmlnaHRPcGVyYW5kKXx8XG5jaGVjayhmYWxzZSxYIGAke3NwZWNpbWVufSAtIE11c3QgYmUgPiAke3JpZ2h0T3BlcmFuZH1gKSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6Y2hlY2tLZXksXG5cbmdldFJhbmtDb3ZlcjptYXRjaEdURUhlbHBlci5nZXRSYW5rQ292ZXJ9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hSZWNvcmRPZkhlbHBlcj1GYXIoJ21hdGNoOnJlY29yZE9mIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihcbnNwZWNpbWVuLFxuW2tleVBhdHQsdmFsdWVQYXR0LGxpbWl0cz11bmRlZmluZWRdLFxuY2hlY2spPT5cbntcbmNvbnN0e251bVByb3BlcnRpZXNMaW1pdCxwcm9wZXJ0eU5hbWVMZW5ndGhMaW1pdH09bGltaXQobGltaXRzKTtcbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnY29weVJlY29yZCcsY2hlY2spJiZcbmNoZWNrKFxub3duS2V5cyhzcGVjaW1lbikubGVuZ3RoPD1udW1Qcm9wZXJ0aWVzTGltaXQsXG5YIGBNdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiAke3EoXG5udW1Qcm9wZXJ0aWVzTGltaXQpXG4gfSBwcm9wZXJ0aWVzOiAke3NwZWNpbWVufWApJiZcblxuZW50cmllcyhzcGVjaW1lbikuZXZlcnkoXG4oW2tleSx2YWx1ZV0pPT5cbmFwcGx5TGFiZWxpbmdFcnJvcihcbmNoZWNrLFxuW1xua2V5Lmxlbmd0aDw9cHJvcGVydHlOYW1lTGVuZ3RoTGltaXQsXG5YIGBQcm9wZXJ0eSBuYW1lIG11c3Qgbm90IGJlIGxvbmdlciB0aGFuICR7cShcbnByb3BlcnR5TmFtZUxlbmd0aExpbWl0KVxuIH1gXSxcblxua2V5KSYmXG5cbmNoZWNrTWF0Y2hlcyhcbmhhcmRlbihba2V5LHZhbHVlXSksXG5oYXJkZW4oW2tleVBhdHQsdmFsdWVQYXR0XSksXG5jaGVjayxcbmtleSkpKTtcblxuXG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtNTS5wYXR0ZXJuKCksTU0ucGF0dGVybigpXSksXG5jaGVjayxcbidtYXRjaDpyZWNvcmRPZiBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOihfZW50cnlQYXR0KT0+Z2V0UGFzc1N0eWxlQ292ZXIoJ2NvcHlSZWNvcmQnKX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEFycmF5T2ZIZWxwZXI9RmFyKCdtYXRjaDphcnJheU9mIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixbc3ViUGF0dCxsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e2FycmF5TGVuZ3RoTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlBcnJheScsY2hlY2spJiYoXG5zcGVjaW1lbi5sZW5ndGg8PWFycmF5TGVuZ3RoTGltaXR8fFxuY2hlY2soXG5mYWxzZSxcblggYEFycmF5IGxlbmd0aCAke3NwZWNpbWVuLmxlbmd0aH0gbXVzdCBiZSA8PSBsaW1pdCAke2FycmF5TGVuZ3RoTGltaXR9YCkpJiZcblxuYXJyYXlFdmVyeU1hdGNoUGF0dGVybihzcGVjaW1lbixzdWJQYXR0LGNoZWNrKSk7XG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtNTS5wYXR0ZXJuKCldKSxcbmNoZWNrLFxuJ21hdGNoOmFycmF5T2YgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooKT0+Z2V0UGFzc1N0eWxlQ292ZXIoJ2NvcHlBcnJheScpfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoU2V0T2ZIZWxwZXI9RmFyKCdtYXRjaDpzZXRPZiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sW2tleVBhdHQsbGltaXRzPXVuZGVmaW5lZF0sY2hlY2spPT57XG5jb25zdHtudW1TZXRFbGVtZW50c0xpbWl0fT1saW1pdChsaW1pdHMpO1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdjb3B5U2V0JyxjaGVjaykmJlxuY2hlY2soXG4vKiogQHR5cGUge0FycmF5fSAqL3NwZWNpbWVuLnBheWxvYWQubGVuZ3RoPG51bVNldEVsZW1lbnRzTGltaXQsXG5YIGBTZXQgbXVzdCBub3QgaGF2ZSBtb3JlIHRoYW4gJHtxKG51bVNldEVsZW1lbnRzTGltaXQpfSBlbGVtZW50czogJHtcbnNwZWNpbWVuLnBheWxvYWQubGVuZ3RoXG4gfWApJiZcblxuYXJyYXlFdmVyeU1hdGNoUGF0dGVybihzcGVjaW1lbi5wYXlsb2FkLGtleVBhdHQsY2hlY2ssJ3NldCBlbGVtZW50cycpKTtcblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW01NLnBhdHRlcm4oKV0pLFxuY2hlY2ssXG4nbWF0Y2g6c2V0T2YgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooKT0+Z2V0UGFzc1N0eWxlQ292ZXIoJ3RhZ2dlZCcpfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoQmFnT2ZIZWxwZXI9RmFyKCdtYXRjaDpiYWdPZiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooXG5zcGVjaW1lbixcbltrZXlQYXR0LGNvdW50UGF0dCxsaW1pdHM9dW5kZWZpbmVkXSxcbmNoZWNrKT0+XG57XG5jb25zdHtudW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0LGRlY2ltYWxEaWdpdHNMaW1pdH09bGltaXQobGltaXRzKTtcbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnY29weUJhZycsY2hlY2spJiZcbmNoZWNrKFxuLyoqIEB0eXBlIHtBcnJheX0gKi9zcGVjaW1lbi5wYXlsb2FkLmxlbmd0aDw9XG5udW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0LFxuWCBgQmFnIG11c3Qgbm90IGhhdmUgbW9yZSB0aGFuICR7cShcbm51bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXQpXG4gfSB1bmlxdWUgZWxlbWVudHM6ICR7c3BlY2ltZW59YCkmJlxuXG5zcGVjaW1lbi5wYXlsb2FkLmV2ZXJ5KFxuKFtrZXksY291bnRdLGkpPT5cbmNoZWNrTWF0Y2hlcyhrZXksa2V5UGF0dCxjaGVjaywgYGJhZyBrZXlzWyR7aX1dYCkmJlxuYXBwbHlMYWJlbGluZ0Vycm9yKFxuY2hlY2tEZWNpbWFsRGlnaXRzTGltaXQsXG5bY291bnQsZGVjaW1hbERpZ2l0c0xpbWl0LGNoZWNrXSxcbiBgYmFnIGNvdW50c1ske2l9XWApJiZcblxuY2hlY2tNYXRjaGVzKGNvdW50LGNvdW50UGF0dCxjaGVjaywgYGJhZyBjb3VudHNbJHtpfV1gKSkpO1xuXG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtNTS5wYXR0ZXJuKCksTU0ucGF0dGVybigpXSksXG5jaGVjayxcbidtYXRjaDpiYWdPZiBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOigpPT5nZXRQYXNzU3R5bGVDb3ZlcigndGFnZ2VkJyl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hNYXBPZkhlbHBlcj1GYXIoJ21hdGNoOm1hcE9mIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihcbnNwZWNpbWVuLFxuW2tleVBhdHQsdmFsdWVQYXR0LGxpbWl0cz11bmRlZmluZWRdLFxuY2hlY2spPT5cbntcbmNvbnN0e251bU1hcEVudHJpZXNMaW1pdH09bGltaXQobGltaXRzKTtcbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnY29weU1hcCcsY2hlY2spJiZcbmNoZWNrKFxuLyoqIEB0eXBlIHtBcnJheX0gKi9zcGVjaW1lbi5wYXlsb2FkLmtleXMubGVuZ3RoPD1cbm51bU1hcEVudHJpZXNMaW1pdCxcblggYENvcHlNYXAgbXVzdCBoYXZlIG5vIG1vcmUgdGhhbiAke3EoXG5udW1NYXBFbnRyaWVzTGltaXQpXG4gfSBlbnRyaWVzOiAke3NwZWNpbWVufWApJiZcblxuYXJyYXlFdmVyeU1hdGNoUGF0dGVybihcbnNwZWNpbWVuLnBheWxvYWQua2V5cyxcbmtleVBhdHQsXG5jaGVjayxcbidtYXAga2V5cycpJiZcblxuYXJyYXlFdmVyeU1hdGNoUGF0dGVybihcbnNwZWNpbWVuLnBheWxvYWQudmFsdWVzLFxudmFsdWVQYXR0LFxuY2hlY2ssXG4nbWFwIHZhbHVlcycpKTtcblxuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbTU0ucGF0dGVybigpLE1NLnBhdHRlcm4oKV0pLFxuY2hlY2ssXG4nbWF0Y2g6bWFwT2YgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX2VudHJ5UGF0dCk9PmdldFBhc3NTdHlsZUNvdmVyKCd0YWdnZWQnKX0pO1xuXG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJuW119IHJlcXVpcmVkUGF0dFxuICogQHBhcmFtIHtQYXR0ZXJuW119IG9wdGlvbmFsUGF0dFxuICogQHJldHVybnMge3tcbiAqICAgcmVxdWlyZWRTcGVjaW1lbjogUGFzc2FibGVbXSxcbiAqICAgb3B0aW9uYWxTcGVjaW1lbjogUGFzc2FibGVbXSxcbiAqICAgcmVzdFNwZWNpbWVuOiBQYXNzYWJsZVtdXG4gKiB9fVxuICovXG5jb25zdCBzcGxpdEFycmF5UGFydHM9KHNwZWNpbWVuLHJlcXVpcmVkUGF0dCxvcHRpb25hbFBhdHQpPT57XG5jb25zdCBudW1SZXF1aXJlZD1yZXF1aXJlZFBhdHQubGVuZ3RoO1xuY29uc3QgbnVtT3B0aW9uYWw9b3B0aW9uYWxQYXR0Lmxlbmd0aDtcbmNvbnN0IHJlcXVpcmVkU3BlY2ltZW49c3BlY2ltZW4uc2xpY2UoMCxudW1SZXF1aXJlZCk7XG5jb25zdCBvcHRpb25hbFNwZWNpbWVuPXNwZWNpbWVuLnNsaWNlKFxubnVtUmVxdWlyZWQsXG5udW1SZXF1aXJlZCtudW1PcHRpb25hbCk7XG5cbmNvbnN0IHJlc3RTcGVjaW1lbj1zcGVjaW1lbi5zbGljZShudW1SZXF1aXJlZCtudW1PcHRpb25hbCk7XG5yZXR1cm4gaGFyZGVuKHtyZXF1aXJlZFNwZWNpbWVuLG9wdGlvbmFsU3BlY2ltZW4scmVzdFNwZWNpbWVufSk7XG4gfTtcblxuLyoqXG4gKiBPcHRpb25hbCBzcGVjaW1lbiBlbGVtZW50cyB3aGljaCBhcmUgYHVuZGVmaW5lZGAgcGFzcyB1bmNvbmRpdGlvbmFsbHkuXG4gKiBXZSBlbmNvZGUgdGhpcyB3aXRoIHRoZSBgTS5vcmAgcGF0dGVybiBzbyBpdCBhbHNvIHByb2R1Y2VzIGEgZ29vZFxuICogY29tcHJlc3Npb24gZGlzdGluZ3Vpc2hpbmcgYHVuZGVmaW5lZGAgZnJvbSBhYnNlbmNlLlxuICpcbiAqIEBwYXJhbSB7UGF0dGVybltdfSBvcHRpb25hbFBhdHRcbiAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGhcbiAqIEByZXR1cm5zIHtQYXR0ZXJuW119IFRoZSBwYXJ0aWFsUGF0dFxuICovXG5jb25zdCBhZGFwdEFycmF5UGF0dGVybj0ob3B0aW9uYWxQYXR0LGxlbmd0aCk9PlxuaGFyZGVuKG9wdGlvbmFsUGF0dC5zbGljZSgwLGxlbmd0aCkubWFwKChwYXR0KT0+TU0ub3B0KHBhdHQpKSk7XG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFNwbGl0QXJyYXlIZWxwZXI9RmFyKCdtYXRjaDpzcGxpdEFycmF5IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihcbnNwZWNpbWVuLFxuW3JlcXVpcmVkUGF0dCxvcHRpb25hbFBhdHQ9W10scmVzdFBhdHQ9TU0uYW55KCldLFxuY2hlY2spPT5cbntcbmlmKCFjaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlBcnJheScsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdHtyZXF1aXJlZFNwZWNpbWVuLG9wdGlvbmFsU3BlY2ltZW4scmVzdFNwZWNpbWVufT1cbnNwbGl0QXJyYXlQYXJ0cyhzcGVjaW1lbixyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0KTtcbmNvbnN0IHBhcnRpYWxQYXR0PWFkYXB0QXJyYXlQYXR0ZXJuKFxub3B0aW9uYWxQYXR0LFxub3B0aW9uYWxTcGVjaW1lbi5sZW5ndGgpO1xuXG5sZXQgYXJnTnVtPTA7XG5yZXR1cm4oXG4ocmVxdWlyZWRTcGVjaW1lbi5sZW5ndGg9PT1yZXF1aXJlZFBhdHQubGVuZ3RofHxcbmNoZWNrKFxuZmFsc2UsXG5YIGBFeHBlY3RlZCBhdCBsZWFzdCAke3EoXG5yZXF1aXJlZFBhdHQubGVuZ3RoKVxuIH0gYXJndW1lbnRzOiAke3NwZWNpbWVufWApKSYmXG5cbnJlcXVpcmVkUGF0dC5ldmVyeSgocCxpKT0+XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGx1c3BsdXMqL1xuY2hlY2tNYXRjaGVzKHJlcXVpcmVkU3BlY2ltZW5baV0scCxjaGVjaywgYGFyZyAke2FyZ051bSsrfWApKSYmXG5cbnBhcnRpYWxQYXR0LmV2ZXJ5KChwLGkpPT5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wbHVzcGx1cyovXG5jaGVja01hdGNoZXMob3B0aW9uYWxTcGVjaW1lbltpXSxwLGNoZWNrLCBgYXJnICR7YXJnTnVtKyt9P2ApKSYmXG5cbmNoZWNrTWF0Y2hlcyhyZXN0U3BlY2ltZW4scmVzdFBhdHQsY2hlY2ssJy4uLnJlc3QnKSk7XG5cbiB9LFxuXG4vKipcbiAqIEBwYXJhbSB7QXJyYXl9IHNwbGl0QXJyYXlcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqL1xuY2hlY2tJc1dlbGxGb3JtZWQ6KHNwbGl0QXJyYXksY2hlY2spPT57XG5pZihcbnBhc3NTdHlsZU9mKHNwbGl0QXJyYXkpPT09J2NvcHlBcnJheScmJihcbnNwbGl0QXJyYXkubGVuZ3RoPj0xfHxzcGxpdEFycmF5Lmxlbmd0aDw9MykpXG57XG5jb25zdFtyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0PXVuZGVmaW5lZCxyZXN0UGF0dD11bmRlZmluZWRdPVxuc3BsaXRBcnJheTtcbmlmKFxuaXNQYXR0ZXJuKHJlcXVpcmVkUGF0dCkmJlxucGFzc1N0eWxlT2YocmVxdWlyZWRQYXR0KT09PSdjb3B5QXJyYXknJiYoXG5vcHRpb25hbFBhdHQ9PT11bmRlZmluZWR8fFxuaXNQYXR0ZXJuKG9wdGlvbmFsUGF0dCkmJlxucGFzc1N0eWxlT2Yob3B0aW9uYWxQYXR0KT09PSdjb3B5QXJyYXknKSYmKFxucmVzdFBhdHQ9PT11bmRlZmluZWR8fGlzUGF0dGVybihyZXN0UGF0dCkpKVxue1xucmV0dXJuIHRydWU7XG4gfVxuIH1cbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgTXVzdCBiZSBhbiBhcnJheSBvZiBhIHJlcXVpcmVkUGF0dCBhcnJheSwgYW4gb3B0aW9uYWwgb3B0aW9uYWxQYXR0IGFycmF5LCBhbmQgYW4gb3B0aW9uYWwgcmVzdFBhdHQ6ICR7cShcbnNwbGl0QXJyYXkpXG4gfWApO1xuXG4gfSxcblxuZ2V0UmFua0NvdmVyOihbXG5fcmVxdWlyZWRQYXR0LFxuX29wdGlvbmFsUGF0dD11bmRlZmluZWQsXG5fcmVzdFBhdHQ9dW5kZWZpbmVkXSk9PlxuZ2V0UGFzc1N0eWxlQ292ZXIoJ2NvcHlBcnJheScpfSk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge0NvcHlSZWNvcmQ8UGFzc2FibGU+fSBzcGVjaW1lblxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFBhdHRlcm4+fSByZXF1aXJlZFBhdHRcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxQYXR0ZXJuPn0gb3B0aW9uYWxQYXR0XG4gKiBAcmV0dXJucyB7e1xuICogICByZXF1aXJlZFNwZWNpbWVuOiBDb3B5UmVjb3JkPFBhc3NhYmxlPixcbiAqICAgb3B0aW9uYWxTcGVjaW1lbjogQ29weVJlY29yZDxQYXNzYWJsZT4sXG4gKiAgIHJlc3RTcGVjaW1lbjogQ29weVJlY29yZDxQYXNzYWJsZT5cbiAqIH19XG4gKi9cbmNvbnN0IHNwbGl0UmVjb3JkUGFydHM9KHNwZWNpbWVuLHJlcXVpcmVkUGF0dCxvcHRpb25hbFBhdHQpPT57XG4vKiBOb3QgZnJvemVuISBNdXRhdGVkIGluIHBsYWNlKi9cbi8qKiBAdHlwZSB7W3N0cmluZywgUGFzc2FibGVdW119ICovXG5jb25zdCByZXF1aXJlZEVudHJpZXM9W107XG4vKiogQHR5cGUge1tzdHJpbmcsIFBhc3NhYmxlXVtdfSAqL1xuY29uc3Qgb3B0aW9uYWxFbnRyaWVzPVtdO1xuLyoqIEB0eXBlIHtbc3RyaW5nLCBQYXNzYWJsZV1bXX0gKi9cbmNvbnN0IHJlc3RFbnRyaWVzPVtdO1xuZm9yKGNvbnN0W25hbWUsdmFsdWVdb2YgZW50cmllcyhzcGVjaW1lbikpe1xuaWYoaGFzT3duUHJvcGVydHlPZihyZXF1aXJlZFBhdHQsbmFtZSkpe1xucmVxdWlyZWRFbnRyaWVzLnB1c2goW25hbWUsdmFsdWVdKTtcbiB9ZWxzZSBpZihoYXNPd25Qcm9wZXJ0eU9mKG9wdGlvbmFsUGF0dCxuYW1lKSl7XG5vcHRpb25hbEVudHJpZXMucHVzaChbbmFtZSx2YWx1ZV0pO1xuIH1lbHNle1xucmVzdEVudHJpZXMucHVzaChbbmFtZSx2YWx1ZV0pO1xuIH1cbiB9XG5yZXR1cm4gaGFyZGVuKHtcbnJlcXVpcmVkU3BlY2ltZW46ZnJvbVVuaXF1ZUVudHJpZXMocmVxdWlyZWRFbnRyaWVzKSxcbm9wdGlvbmFsU3BlY2ltZW46ZnJvbVVuaXF1ZUVudHJpZXMob3B0aW9uYWxFbnRyaWVzKSxcbnJlc3RTcGVjaW1lbjpmcm9tVW5pcXVlRW50cmllcyhyZXN0RW50cmllcyl9KTtcblxuIH07XG5cbi8qKlxuICogT3B0aW9uYWwgc3BlY2ltZW4gdmFsdWVzIHdoaWNoIGFyZSBgdW5kZWZpbmVkYCBwYXNzIHVuY29uZGl0aW9uYWxseS5cbiAqIFdlIGVuY29kZSB0aGlzIHdpdGggdGhlIGBNLm9yYCBwYXR0ZXJuIHNvIGl0IGFsc28gcHJvZHVjZXMgYSBnb29kXG4gKiBjb21wcmVzc2lvbiBkaXN0aW5ndWlzaGluZyBgdW5kZWZpbmVkYCBmcm9tIGFic2VuY2UuXG4gKlxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFBhdHRlcm4+fSBvcHRpb25hbFBhdHRcbiAqIEBwYXJhbSB7c3RyaW5nW119IG5hbWVzXG4gKiBAcmV0dXJucyB7Q29weVJlY29yZDxQYXR0ZXJuPn0gVGhlIHBhcnRpYWxQYXR0XG4gKi9cbmNvbnN0IGFkYXB0UmVjb3JkUGF0dGVybj0ob3B0aW9uYWxQYXR0LG5hbWVzKT0+XG5mcm9tVW5pcXVlRW50cmllcyhuYW1lcy5tYXAoKG5hbWUpPT5bbmFtZSxNTS5vcHQob3B0aW9uYWxQYXR0W25hbWVdKV0pKTtcblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoU3BsaXRSZWNvcmRIZWxwZXI9RmFyKCdtYXRjaDpzcGxpdFJlY29yZCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooXG5zcGVjaW1lbixcbltyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0PXt9LHJlc3RQYXR0PU1NLmFueSgpXSxcbmNoZWNrKT0+XG57XG5pZighY2hlY2tLaW5kKHNwZWNpbWVuLCdjb3B5UmVjb3JkJyxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmNvbnN0e3JlcXVpcmVkU3BlY2ltZW4sb3B0aW9uYWxTcGVjaW1lbixyZXN0U3BlY2ltZW59PVxuc3BsaXRSZWNvcmRQYXJ0cyhzcGVjaW1lbixyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0KTtcblxuY29uc3QgcGFydGlhbE5hbWVzPS8qKiBAdHlwZSB7c3RyaW5nW119ICovb3duS2V5cyhvcHRpb25hbFNwZWNpbWVuKTtcbmNvbnN0IHBhcnRpYWxQYXR0PWFkYXB0UmVjb3JkUGF0dGVybihvcHRpb25hbFBhdHQscGFydGlhbE5hbWVzKTtcbnJldHVybihcbmNoZWNrTWF0Y2hlcyhyZXF1aXJlZFNwZWNpbWVuLHJlcXVpcmVkUGF0dCxjaGVjaykmJlxucGFydGlhbE5hbWVzLmV2ZXJ5KChuYW1lKT0+XG5jaGVja01hdGNoZXMoXG5vcHRpb25hbFNwZWNpbWVuW25hbWVdLFxucGFydGlhbFBhdHRbbmFtZV0sXG5jaGVjayxcbiBgJHtuYW1lfT9gKSkmJlxuXG5cbmNoZWNrTWF0Y2hlcyhyZXN0U3BlY2ltZW4scmVzdFBhdHQsY2hlY2ssJy4uLnJlc3QnKSk7XG5cbiB9LFxuXG4vKipcbiAqIEBwYXJhbSB7QXJyYXl9IHNwbGl0QXJyYXlcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqL1xuY2hlY2tJc1dlbGxGb3JtZWQ6KHNwbGl0QXJyYXksY2hlY2spPT57XG5pZihcbnBhc3NTdHlsZU9mKHNwbGl0QXJyYXkpPT09J2NvcHlBcnJheScmJihcbnNwbGl0QXJyYXkubGVuZ3RoPj0xfHxzcGxpdEFycmF5Lmxlbmd0aDw9MykpXG57XG5jb25zdFtyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0PXVuZGVmaW5lZCxyZXN0UGF0dD11bmRlZmluZWRdPVxuc3BsaXRBcnJheTtcbmlmKFxuaXNQYXR0ZXJuKHJlcXVpcmVkUGF0dCkmJlxucGFzc1N0eWxlT2YocmVxdWlyZWRQYXR0KT09PSdjb3B5UmVjb3JkJyYmKFxub3B0aW9uYWxQYXR0PT09dW5kZWZpbmVkfHxcbmlzUGF0dGVybihvcHRpb25hbFBhdHQpJiZcbnBhc3NTdHlsZU9mKG9wdGlvbmFsUGF0dCk9PT0nY29weVJlY29yZCcpJiYoXG5yZXN0UGF0dD09PXVuZGVmaW5lZHx8aXNQYXR0ZXJuKHJlc3RQYXR0KSkpXG57XG5yZXR1cm4gdHJ1ZTtcbiB9XG4gfVxucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBNdXN0IGJlIGFuIGFycmF5IG9mIGEgcmVxdWlyZWRQYXR0IHJlY29yZCwgYW4gb3B0aW9uYWwgb3B0aW9uYWxQYXR0IHJlY29yZCwgYW5kIGFuIG9wdGlvbmFsIHJlc3RQYXR0OiAke3EoXG5zcGxpdEFycmF5KVxuIH1gKTtcblxuIH0sXG5cbmdldFJhbmtDb3ZlcjooW1xucmVxdWlyZWRQYXR0LFxuX29wdGlvbmFsUGF0dD11bmRlZmluZWQsXG5fcmVzdFBhdHQ9dW5kZWZpbmVkXSk9PlxuZ2V0UGFzc1N0eWxlQ292ZXIocGFzc1N0eWxlT2YocmVxdWlyZWRQYXR0KSl9KTtcblxuXG4vKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIE1hdGNoSGVscGVyPn0gKi9cbmNvbnN0IEhlbHBlcnNCeU1hdGNoVGFnPWhhcmRlbih7XG4nbWF0Y2g6YW55JzptYXRjaEFueUhlbHBlcixcbidtYXRjaDphbmQnOm1hdGNoQW5kSGVscGVyLFxuJ21hdGNoOm9yJzptYXRjaE9ySGVscGVyLFxuJ21hdGNoOm5vdCc6bWF0Y2hOb3RIZWxwZXIsXG5cbidtYXRjaDpzY2FsYXInOm1hdGNoU2NhbGFySGVscGVyLFxuJ21hdGNoOmtleSc6bWF0Y2hLZXlIZWxwZXIsXG4nbWF0Y2g6cGF0dGVybic6bWF0Y2hQYXR0ZXJuSGVscGVyLFxuJ21hdGNoOmtpbmQnOm1hdGNoS2luZEhlbHBlcixcbidtYXRjaDpiaWdpbnQnOm1hdGNoQmlnaW50SGVscGVyLFxuJ21hdGNoOm5hdCc6bWF0Y2hOYXRIZWxwZXIsXG4nbWF0Y2g6c3RyaW5nJzptYXRjaFN0cmluZ0hlbHBlcixcbidtYXRjaDpzeW1ib2wnOm1hdGNoU3ltYm9sSGVscGVyLFxuJ21hdGNoOnJlbW90YWJsZSc6bWF0Y2hSZW1vdGFibGVIZWxwZXIsXG5cbidtYXRjaDpsdCc6bWF0Y2hMVEhlbHBlcixcbidtYXRjaDpsdGUnOm1hdGNoTFRFSGVscGVyLFxuJ21hdGNoOmd0ZSc6bWF0Y2hHVEVIZWxwZXIsXG4nbWF0Y2g6Z3QnOm1hdGNoR1RIZWxwZXIsXG5cbidtYXRjaDphcnJheU9mJzptYXRjaEFycmF5T2ZIZWxwZXIsXG4nbWF0Y2g6cmVjb3JkT2YnOm1hdGNoUmVjb3JkT2ZIZWxwZXIsXG4nbWF0Y2g6c2V0T2YnOm1hdGNoU2V0T2ZIZWxwZXIsXG4nbWF0Y2g6YmFnT2YnOm1hdGNoQmFnT2ZIZWxwZXIsXG4nbWF0Y2g6bWFwT2YnOm1hdGNoTWFwT2ZIZWxwZXIsXG4nbWF0Y2g6c3BsaXRBcnJheSc6bWF0Y2hTcGxpdEFycmF5SGVscGVyLFxuJ21hdGNoOnNwbGl0UmVjb3JkJzptYXRjaFNwbGl0UmVjb3JkSGVscGVyfSk7XG5cblxuY29uc3QgbWFrZU1hdGNoZXI9KHRhZyxwYXlsb2FkKT0+e1xuY29uc3QgbWF0Y2hlcj1tYWtlVGFnZ2VkKHRhZyxwYXlsb2FkKTtcbmFzc2VydFBhdHRlcm4obWF0Y2hlcik7XG5yZXR1cm4gbWF0Y2hlcjtcbiB9O1xuXG5jb25zdCBtYWtlS2luZE1hdGNoZXI9KGtpbmQpPT5tYWtlTWF0Y2hlcignbWF0Y2g6a2luZCcsa2luZCk7XG5cbmNvbnN0IEFueVNoYXBlPW1ha2VNYXRjaGVyKCdtYXRjaDphbnknLHVuZGVmaW5lZCk7XG5jb25zdCBTY2FsYXJTaGFwZT1tYWtlTWF0Y2hlcignbWF0Y2g6c2NhbGFyJyx1bmRlZmluZWQpO1xuY29uc3QgS2V5U2hhcGU9bWFrZU1hdGNoZXIoJ21hdGNoOmtleScsdW5kZWZpbmVkKTtcbmNvbnN0IFBhdHRlcm5TaGFwZT1tYWtlTWF0Y2hlcignbWF0Y2g6cGF0dGVybicsdW5kZWZpbmVkKTtcbmNvbnN0IEJvb2xlYW5TaGFwZT1tYWtlS2luZE1hdGNoZXIoJ2Jvb2xlYW4nKTtcbmNvbnN0IE51bWJlclNoYXBlPW1ha2VLaW5kTWF0Y2hlcignbnVtYmVyJyk7XG5jb25zdCBCaWdJbnRTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpiaWdpbnQnLFtdKTtcbmNvbnN0IE5hdFNoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOm5hdCcsW10pO1xuY29uc3QgU3RyaW5nU2hhcGU9bWFrZVRhZ2dlZCgnbWF0Y2g6c3RyaW5nJyxbXSk7XG5jb25zdCBTeW1ib2xTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpzeW1ib2wnLFtdKTtcbmNvbnN0IFJlY29yZFNoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOnJlY29yZE9mJyxbQW55U2hhcGUsQW55U2hhcGVdKTtcbmNvbnN0IEFycmF5U2hhcGU9bWFrZVRhZ2dlZCgnbWF0Y2g6YXJyYXlPZicsW0FueVNoYXBlXSk7XG5jb25zdCBTZXRTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpzZXRPZicsW0FueVNoYXBlXSk7XG5jb25zdCBCYWdTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpiYWdPZicsW0FueVNoYXBlLEFueVNoYXBlXSk7XG5jb25zdCBNYXBTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDptYXBPZicsW0FueVNoYXBlLEFueVNoYXBlXSk7XG5jb25zdCBSZW1vdGFibGVTaGFwZT1tYWtlS2luZE1hdGNoZXIoJ3JlbW90YWJsZScpO1xuY29uc3QgRXJyb3JTaGFwZT1tYWtlS2luZE1hdGNoZXIoJ2Vycm9yJyk7XG5jb25zdCBQcm9taXNlU2hhcGU9bWFrZUtpbmRNYXRjaGVyKCdwcm9taXNlJyk7XG5jb25zdCBVbmRlZmluZWRTaGFwZT1tYWtlS2luZE1hdGNoZXIoJ3VuZGVmaW5lZCcpO1xuXG4vKipcbiAqIEZvciB3aGVuIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIHBheWxvYWQgaXMgdGhlIG9wdGlvbmFsIGxpbWl0cyxcbiAqIHNvIHRoYXQgd2hlbiBpdCBpcyBgdW5kZWZpbmVkYCBpdCBpcyBkcm9wcGVkIGZyb20gdGhlIGVuZCBvZiB0aGVcbiAqIHBheWxvYWRzIGFycmF5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gcGF5bG9hZFxuICovXG5jb25zdCBtYWtlTGltaXRzTWF0Y2hlcj0odGFnLHBheWxvYWQpPT57XG5pZihwYXlsb2FkW3BheWxvYWQubGVuZ3RoLTFdPT09dW5kZWZpbmVkKXtcbnBheWxvYWQ9aGFyZGVuKHBheWxvYWQuc2xpY2UoMCxwYXlsb2FkLmxlbmd0aC0xKSk7XG4gfVxucmV0dXJuIG1ha2VNYXRjaGVyKHRhZyxwYXlsb2FkKTtcbiB9O1xuXG5jb25zdCBtYWtlUmVtb3RhYmxlTWF0Y2hlcj0obGFiZWw9dW5kZWZpbmVkKT0+XG5sYWJlbD09PXVuZGVmaW5lZD9cblJlbW90YWJsZVNoYXBlOlxubWFrZU1hdGNoZXIoJ21hdGNoOnJlbW90YWJsZScsaGFyZGVuKHtsYWJlbH0pKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSBlbXB0eVxuICogQHBhcmFtIHtUfSBiYXNlXG4gKiBAcGFyYW0ge1R9IFtvcHRpb25hbF1cbiAqIEBwYXJhbSB7VH0gW3Jlc3RdXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG5jb25zdCBtYWtlU3BsaXRQYXlsb2FkPShcbmVtcHR5LFxuYmFzZSxcbm9wdGlvbmFsPXVuZGVmaW5lZCxcbnJlc3Q9dW5kZWZpbmVkKT0+XG57XG5pZihyZXN0KXtcbnJldHVybltiYXNlLG9wdGlvbmFsfHxlbXB0eSxyZXN0XTtcbiB9XG5pZihvcHRpb25hbCl7XG5yZXR1cm5bYmFzZSxvcHRpb25hbF07XG4gfVxucmV0dXJuW2Jhc2VdO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHsnc3luYyd8J2FzeW5jJ30gY2FsbEtpbmRcbiAqIEBwYXJhbSB7QXJnR3VhcmRbXX0gYXJnR3VhcmRzXG4gKiBAcGFyYW0ge0FyZ0d1YXJkW119IFtvcHRpb25hbEFyZ0d1YXJkc11cbiAqIEBwYXJhbSB7QXJnR3VhcmR9IFtyZXN0QXJnR3VhcmRdXG4gKiBAcmV0dXJucyB7TWV0aG9kR3VhcmRNYWtlcn1cbiAqL1xuY29uc3QgbWFrZU1ldGhvZEd1YXJkTWFrZXI9KFxuY2FsbEtpbmQsXG5hcmdHdWFyZHMsXG5vcHRpb25hbEFyZ0d1YXJkcz11bmRlZmluZWQsXG5yZXN0QXJnR3VhcmQ9dW5kZWZpbmVkKT0+XG5cbmhhcmRlbih7XG5vcHRpb25hbDooLi4ub3B0QXJnR3VhcmRzKT0+e1xub3B0aW9uYWxBcmdHdWFyZHM9PT11bmRlZmluZWR8fFxuRmFpbCBgQ2FuIG9ubHkgaGF2ZSBvbmUgc2V0IG9mIG9wdGlvbmFsIGd1YXJkc2A7XG5yZXN0QXJnR3VhcmQ9PT11bmRlZmluZWR8fFxuRmFpbCBgb3B0aW9uYWwgYXJnIGd1YXJkcyBtdXN0IGNvbWUgYmVmb3JlIHJlc3QgYXJnYDtcbnJldHVybiBtYWtlTWV0aG9kR3VhcmRNYWtlcihjYWxsS2luZCxhcmdHdWFyZHMsb3B0QXJnR3VhcmRzKTtcbiB9LFxucmVzdDoockFyZ0d1YXJkKT0+e1xucmVzdEFyZ0d1YXJkPT09dW5kZWZpbmVkfHxGYWlsIGBDYW4gb25seSBoYXZlIG9uZSByZXN0IGFyZ2A7XG5yZXR1cm4gbWFrZU1ldGhvZEd1YXJkTWFrZXIoXG5jYWxsS2luZCxcbmFyZ0d1YXJkcyxcbm9wdGlvbmFsQXJnR3VhcmRzLFxuckFyZ0d1YXJkKTtcblxuIH0sXG5yZXR1cm5zOihyZXR1cm5HdWFyZD1VbmRlZmluZWRTaGFwZSk9PlxuaGFyZGVuKHtcbmtsYXNzOidtZXRob2RHdWFyZCcsXG5jYWxsS2luZCxcbmFyZ0d1YXJkcyxcbm9wdGlvbmFsQXJnR3VhcmRzLFxucmVzdEFyZ0d1YXJkLFxucmV0dXJuR3VhcmR9KX0pO1xuXG5cblxuY29uc3QgbWFrZUF3YWl0QXJnR3VhcmQ9KGFyZ0d1YXJkKT0+XG5oYXJkZW4oe1xua2xhc3M6J2F3YWl0QXJnJyxcbmFyZ0d1YXJkfSk7XG5cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEB0eXBlIHtNYXRjaGVyTmFtZXNwYWNlfSAqL1xuY29uc3QgTT1oYXJkZW4oe1xuYW55OigpPT5BbnlTaGFwZSxcbmFuZDooLi4ucGF0dHMpPT5tYWtlTWF0Y2hlcignbWF0Y2g6YW5kJyxwYXR0cyksXG5vcjooLi4ucGF0dHMpPT5tYWtlTWF0Y2hlcignbWF0Y2g6b3InLHBhdHRzKSxcbm5vdDooc3ViUGF0dCk9Pm1ha2VNYXRjaGVyKCdtYXRjaDpub3QnLHN1YlBhdHQpLFxuXG5zY2FsYXI6KCk9PlNjYWxhclNoYXBlLFxua2V5OigpPT5LZXlTaGFwZSxcbnBhdHRlcm46KCk9PlBhdHRlcm5TaGFwZSxcbmtpbmQ6bWFrZUtpbmRNYXRjaGVyLFxuYm9vbGVhbjooKT0+Qm9vbGVhblNoYXBlLFxubnVtYmVyOigpPT5OdW1iZXJTaGFwZSxcbmJpZ2ludDoobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP21ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpiaWdpbnQnLFtsaW1pdHNdKTpCaWdJbnRTaGFwZSxcbm5hdDoobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP21ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpuYXQnLFtsaW1pdHNdKTpOYXRTaGFwZSxcbnN0cmluZzoobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP21ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpzdHJpbmcnLFtsaW1pdHNdKTpTdHJpbmdTaGFwZSxcbnN5bWJvbDoobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP21ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpzeW1ib2wnLFtsaW1pdHNdKTpTeW1ib2xTaGFwZSxcbnJlY29yZDoobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP00ucmVjb3JkT2YoTS5hbnkoKSxNLmFueSgpLGxpbWl0cyk6UmVjb3JkU2hhcGUsXG5hcnJheToobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP00uYXJyYXlPZihNLmFueSgpLGxpbWl0cyk6QXJyYXlTaGFwZSxcbnNldDoobGltaXRzPXVuZGVmaW5lZCk9PmxpbWl0cz9NLnNldE9mKE0uYW55KCksbGltaXRzKTpTZXRTaGFwZSxcbmJhZzoobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP00uYmFnT2YoTS5hbnkoKSxNLmFueSgpLGxpbWl0cyk6QmFnU2hhcGUsXG5tYXA6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9NLm1hcE9mKE0uYW55KCksTS5hbnkoKSxsaW1pdHMpOk1hcFNoYXBlLFxucmVtb3RhYmxlOm1ha2VSZW1vdGFibGVNYXRjaGVyLFxuZXJyb3I6KCk9PkVycm9yU2hhcGUsXG5wcm9taXNlOigpPT5Qcm9taXNlU2hhcGUsXG51bmRlZmluZWQ6KCk9PlVuZGVmaW5lZFNoYXBlLFxubnVsbDooKT0+bnVsbCxcblxubHQ6KHJpZ2h0T3BlcmFuZCk9Pm1ha2VNYXRjaGVyKCdtYXRjaDpsdCcscmlnaHRPcGVyYW5kKSxcbmx0ZToocmlnaHRPcGVyYW5kKT0+bWFrZU1hdGNoZXIoJ21hdGNoOmx0ZScscmlnaHRPcGVyYW5kKSxcbmVxOihrZXkpPT57XG5hc3NlcnRLZXkoa2V5KTtcbnJldHVybiBrZXk9PT11bmRlZmluZWQ/TS51bmRlZmluZWQoKTprZXk7XG4gfSxcbm5lcTooa2V5KT0+TS5ub3QoTS5lcShrZXkpKSxcbmd0ZToocmlnaHRPcGVyYW5kKT0+bWFrZU1hdGNoZXIoJ21hdGNoOmd0ZScscmlnaHRPcGVyYW5kKSxcbmd0OihyaWdodE9wZXJhbmQpPT5tYWtlTWF0Y2hlcignbWF0Y2g6Z3QnLHJpZ2h0T3BlcmFuZCksXG5cbnJlY29yZE9mOihrZXlQYXR0PU0uYW55KCksdmFsdWVQYXR0PU0uYW55KCksbGltaXRzPXVuZGVmaW5lZCk9PlxubWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOnJlY29yZE9mJyxba2V5UGF0dCx2YWx1ZVBhdHQsbGltaXRzXSksXG5hcnJheU9mOihzdWJQYXR0PU0uYW55KCksbGltaXRzPXVuZGVmaW5lZCk9PlxubWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOmFycmF5T2YnLFtzdWJQYXR0LGxpbWl0c10pLFxuc2V0T2Y6KGtleVBhdHQ9TS5hbnkoKSxsaW1pdHM9dW5kZWZpbmVkKT0+XG5tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6c2V0T2YnLFtrZXlQYXR0LGxpbWl0c10pLFxuYmFnT2Y6KGtleVBhdHQ9TS5hbnkoKSxjb3VudFBhdHQ9TS5hbnkoKSxsaW1pdHM9dW5kZWZpbmVkKT0+XG5tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6YmFnT2YnLFtrZXlQYXR0LGNvdW50UGF0dCxsaW1pdHNdKSxcbm1hcE9mOihrZXlQYXR0PU0uYW55KCksdmFsdWVQYXR0PU0uYW55KCksbGltaXRzPXVuZGVmaW5lZCk9PlxubWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOm1hcE9mJyxba2V5UGF0dCx2YWx1ZVBhdHQsbGltaXRzXSksXG5zcGxpdEFycmF5OihiYXNlLG9wdGlvbmFsPXVuZGVmaW5lZCxyZXN0PXVuZGVmaW5lZCk9PlxubWFrZU1hdGNoZXIoXG4nbWF0Y2g6c3BsaXRBcnJheScsXG5tYWtlU3BsaXRQYXlsb2FkKFtdLGJhc2Usb3B0aW9uYWwscmVzdCkpLFxuXG5zcGxpdFJlY29yZDooYmFzZSxvcHRpb25hbD11bmRlZmluZWQscmVzdD11bmRlZmluZWQpPT5cbm1ha2VNYXRjaGVyKFxuJ21hdGNoOnNwbGl0UmVjb3JkJyxcbm1ha2VTcGxpdFBheWxvYWQoe30sYmFzZSxvcHRpb25hbCxyZXN0KSksXG5cbnNwbGl0OihiYXNlLHJlc3Q9dW5kZWZpbmVkKT0+e1xuaWYocGFzc1N0eWxlT2YoaGFyZGVuKGJhc2UpKT09PSdjb3B5QXJyYXknKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgV2Uga25vdyBpdCBzaG91bGQgYmUgYW4gYXJyYXkqL1xucmV0dXJuIE0uc3BsaXRBcnJheShiYXNlLHJlc3QmJltdLHJlc3QpO1xuIH1lbHNle1xucmV0dXJuIE0uc3BsaXRSZWNvcmQoYmFzZSxyZXN0JiZ7fSxyZXN0KTtcbiB9XG4gfSxcbnBhcnRpYWw6KGJhc2UscmVzdD11bmRlZmluZWQpPT57XG5pZihwYXNzU3R5bGVPZihoYXJkZW4oYmFzZSkpPT09J2NvcHlBcnJheScpe1xuLyogQHRzLWV4cGVjdC1lcnJvciBXZSBrbm93IGl0IHNob3VsZCBiZSBhbiBhcnJheSovXG5yZXR1cm4gTS5zcGxpdEFycmF5KFtdLGJhc2UscmVzdCk7XG4gfWVsc2V7XG5yZXR1cm4gTS5zcGxpdFJlY29yZCh7fSxiYXNlLHJlc3QpO1xuIH1cbiB9LFxuXG5lcmVmOih0KT0+TS5vcih0LE0ucHJvbWlzZSgpKSxcbm9wdDoodCk9Pk0ub3IoTS51bmRlZmluZWQoKSx0KSxcblxuaW50ZXJmYWNlOihpbnRlcmZhY2VOYW1lLG1ldGhvZEd1YXJkcyx7c2xvcHB5PWZhbHNlfT17fSk9PntcbmZvcihjb25zdFtfLG1ldGhvZEd1YXJkXW9mIGVudHJpZXMobWV0aG9kR3VhcmRzKSl7XG5tZXRob2RHdWFyZC5rbGFzcz09PSdtZXRob2RHdWFyZCd8fFxuRmFpbCBgdW5yZWNvZ25pemUgbWV0aG9kIGd1YXJkICR7bWV0aG9kR3VhcmR9YDtcbiB9XG5yZXR1cm4gaGFyZGVuKHtcbmtsYXNzOidJbnRlcmZhY2UnLFxuaW50ZXJmYWNlTmFtZSxcbm1ldGhvZEd1YXJkcyxcbnNsb3BweX0pO1xuXG4gfSxcbmNhbGw6KC4uLmFyZ0d1YXJkcyk9Pm1ha2VNZXRob2RHdWFyZE1ha2VyKCdzeW5jJyxhcmdHdWFyZHMpLFxuY2FsbFdoZW46KC4uLmFyZ0d1YXJkcyk9Pm1ha2VNZXRob2RHdWFyZE1ha2VyKCdhc3luYycsYXJnR3VhcmRzKSxcblxuYXdhaXQ6KGFyZ0d1YXJkKT0+bWFrZUF3YWl0QXJnR3VhcmQoYXJnR3VhcmQpfSk7XG5cblxucmV0dXJuIGhhcmRlbih7XG5jaGVja01hdGNoZXMsXG5tYXRjaGVzLFxubXVzdE1hdGNoLFxuYXNzZXJ0UGF0dGVybixcbmlzUGF0dGVybixcbmdldFJhbmtDb3Zlcixcbk19KTtcblxuIH07XG5cbi8qIE9ubHkgaW5jbHVkZSB0aG9zZSB3aG9zZSBtZWFuaW5nIGlzIGluZGVwZW5kZW50IG9mIGFuIGltcHV0ZWQgc29ydCBvcmRlciovXG4vKiBvZiByZW1vdGFibGVzLCBvciBvZiBlbmNvZGluZyBvZiBwYXNzYWJsZSBhcyBzb3J0YWJsZSBzdHJpbmdzLiBUaHVzLCovXG4vKiBnZXRSYW5rQ292ZXIgaXMgb21pdHRlZC4gVG8gZ2V0IG9uZSwgeW91J2QgbmVlZCB0byBpbnN0YW50aWF0ZSovXG4vKiBgbWFrZVBhdHRlcm5LaXQoKWAgeW91cnNlbGYuIFNpbmNlIHRoZXJlIGFyZSBjdXJyZW50bHkgbm8gZXh0ZXJuYWwqL1xuLyogdXNlcyBvZiBgZ2V0UmFua0NvdmVyYCwgZm9yIGNsYXJpdHkgZHVyaW5nIGRldmVsb3BtZW50LCBgbWFrZVBhdHRlcm5LaXRgKi9cbi8qIGlzIG5vdCBjdXJyZW50bHkgZXhwb3J0ZWQuKi9cbmNvbnN0ICAgICAgIHtcbmNoZWNrTWF0Y2hlcyxcbm1hdGNoZXMsXG5tdXN0TWF0Y2gsXG5hc3NlcnRQYXR0ZXJuLFxuaXNQYXR0ZXJuLFxuZ2V0UmFua0NvdmVyLFxuTX09XG5tYWtlUGF0dGVybktpdCgpO1xuXG4vKipcbiAqIEEgbWV0aG9kIGd1YXJkLCBmb3IgaW5jbHVzaW9uIGluIGFuIGludGVyZmFjZSBndWFyZCwgdGhhdCBlbmZvcmNlcyBvbmx5IHRoYXRcbiAqIGFsbCBhcmd1bWVudHMgYXJlIHBhc3NhYmxlIGFuZCB0aGF0IHRoZSByZXN1bHQgaXMgcGFzc2FibGUuIChJbiBmYXIgY2xhc3NlcyxcbiAqIFwiYW55XCIgbWVhbnMgYW55ICpwYXNzYWJsZSouKSBUaGlzIGlzIHRoZSBsZWFzdCBwb3NzaWJsZSBlbmZvcmNlbWVudCBmb3IgYVxuICogbWV0aG9kIGd1YXJkLCBhbmQgaXMgaW1wbGllZCBieSBhbGwgb3RoZXIgbWV0aG9kIGd1YXJkcy5cbiAqLyRo4oCNX29uY2UuY2hlY2tNYXRjaGVzKGNoZWNrTWF0Y2hlcyk7JGjigI1fb25jZS5tYXRjaGVzKG1hdGNoZXMpOyRo4oCNX29uY2UubXVzdE1hdGNoKG11c3RNYXRjaCk7JGjigI1fb25jZS5hc3NlcnRQYXR0ZXJuKGFzc2VydFBhdHRlcm4pOyRo4oCNX29uY2UuaXNQYXR0ZXJuKGlzUGF0dGVybik7JGjigI1fb25jZS5nZXRSYW5rQ292ZXIoZ2V0UmFua0NvdmVyKTskaOKAjV9vbmNlLk0oTSk7XG5jb25zdCAgICAgICAgTWluTWV0aG9kR3VhcmQ9TS5jYWxsKCkucmVzdChNLmFueSgpKS5yZXR1cm5zKE0uYW55KCkpOyRo4oCNX29uY2UuTWluTWV0aG9kR3VhcmQoTWluTWV0aG9kR3VhcmQpO1xuXG5NTT1NO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmF1bHRMaW1pdHMiOlsiZGVmYXVsdExpbWl0cyJdLCJjaGVja01hdGNoZXMiOlsiY2hlY2tNYXRjaGVzIl0sIm1hdGNoZXMiOlsibWF0Y2hlcyJdLCJtdXN0TWF0Y2giOlsibXVzdE1hdGNoIl0sImFzc2VydFBhdHRlcm4iOlsiYXNzZXJ0UGF0dGVybiJdLCJpc1BhdHRlcm4iOlsiaXNQYXR0ZXJuIl0sImdldFJhbmtDb3ZlciI6WyJnZXRSYW5rQ292ZXIiXSwiTSI6WyJNIl0sIk1pbk1ldGhvZEd1YXJkIjpbIk1pbk1ldGhvZEd1YXJkIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAF8GszVuFgAAbhYAADEAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzeyJpbXBvcnRzIjpbIi4uL2tleXMvY2hlY2tLZXkuanMiLCIuLi9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiLCIuL3NjYWxhcldlYWtNYXBTdG9yZS5qcyIsIi4vc3RvcmUtdXRpbHMuanMiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vbWFyc2hhbC9zcmMvcmFua09yZGVyLmpzIl0sImV4cG9ydHMiOlsibWFrZU1hcFN0b3JlTWV0aG9kcyIsIm1ha2VTY2FsYXJNYXBTdG9yZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXIsYXNzZXJ0UGFzc2FibGUsZmlsdGVySXRlcmFibGUsbWFwSXRlcmFibGUsY29tcGFyZVJhbmssYXNzZXJ0U2NhbGFyS2V5LG1ha2VDb3B5TWFwLG1hdGNoZXMsbXVzdE1hdGNoLGFzc2VydFBhdHRlcm4sbWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMsbWFrZUN1cnJlbnRLZXlzS2l0OyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaOKAjV9hKV1dLFtcImZpbHRlckl0ZXJhYmxlXCIsIFskaOKAjV9hID0+IChmaWx0ZXJJdGVyYWJsZSA9ICRo4oCNX2EpXV0sW1wibWFwSXRlcmFibGVcIiwgWyRo4oCNX2EgPT4gKG1hcEl0ZXJhYmxlID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWwvc3JjL3JhbmtPcmRlci5qc1wiLCBbW1wiY29tcGFyZVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVSYW5rID0gJGjigI1fYSldXV1dLFtcIi4uL2tleXMvY2hlY2tLZXkuanNcIiwgW1tcImFzc2VydFNjYWxhcktleVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0U2NhbGFyS2V5ID0gJGjigI1fYSldXSxbXCJtYWtlQ29weU1hcFwiLCBbJGjigI1fYSA9PiAobWFrZUNvcHlNYXAgPSAkaOKAjV9hKV1dXV0sW1wiLi4vcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzXCIsIFtbXCJtYXRjaGVzXCIsIFskaOKAjV9hID0+IChtYXRjaGVzID0gJGjigI1fYSldXSxbXCJtdXN0TWF0Y2hcIiwgWyRo4oCNX2EgPT4gKG11c3RNYXRjaCA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGF0dGVyblwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRo4oCNX2EpXV1dXSxbXCIuL3NjYWxhcldlYWtNYXBTdG9yZS5qc1wiLCBbW1wibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHNcIiwgWyRo4oCNX2EgPT4gKG1ha2VXZWFrTWFwU3RvcmVNZXRob2RzID0gJGjigI1fYSldXV1dLFtcIi4vc3RvcmUtdXRpbHMuanNcIiwgW1tcIm1ha2VDdXJyZW50S2V5c0tpdFwiLCBbJGjigI1fYSA9PiAobWFrZUN1cnJlbnRLZXlzS2l0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7TWFwPEssVj59IGpzbWFwXG4gKiBAcGFyYW0geyhrOiBLLCB2OiBWKSA9PiB2b2lkfSBhc3NlcnRLVk9rVG9BZGRcbiAqIEBwYXJhbSB7KGs6IEssIHY6IFYpID0+IHZvaWR9IGFzc2VydEtWT2tUb1NldFxuICogQHBhcmFtIHsoKGs6IEspID0+IHZvaWQpfSBbYXNzZXJ0S2V5T2tUb0RlbGV0ZV1cbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnXVxuICogQHJldHVybnMge01hcFN0b3JlPEssVj59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTWFwU3RvcmVNZXRob2RzPShcbmpzbWFwLFxuYXNzZXJ0S1ZPa1RvQWRkLFxuYXNzZXJ0S1ZPa1RvU2V0LFxuYXNzZXJ0S2V5T2tUb0RlbGV0ZT11bmRlZmluZWQsXG50YWc9J2tleScpPT5cbntcbmNvbnN0e2Fzc2VydFVwZGF0ZU9uQWRkLGFzc2VydFVwZGF0ZU9uRGVsZXRlLGl0ZXJhYmxlS2V5c309XG5tYWtlQ3VycmVudEtleXNLaXQoXG4oKT0+anNtYXAua2V5cygpLFxuKGspPT5qc21hcC5oYXMoayksXG5jb21wYXJlUmFuayxcbmFzc2VydEtWT2tUb0FkZCxcbmFzc2VydEtleU9rVG9EZWxldGUsXG50YWcpO1xuXG5cbi8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBba2V5UGF0dF1cbiAqIEBwYXJhbSB7UGF0dGVybn0gW3ZhbHVlUGF0dF1cbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxLPn1cbiAqL1xuY29uc3Qga2V5cz0oa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9PntcbmlmKGtleVBhdHQ9PT11bmRlZmluZWQmJnZhbHVlUGF0dD09PXVuZGVmaW5lZCl7XG5yZXR1cm4gaXRlcmFibGVLZXlzO1xuIH1cbmNvbnN0IGZpbHRlcj0oayk9PntcbmlmKGtleVBhdHQhPT11bmRlZmluZWQmJiFtYXRjaGVzKGssa2V5UGF0dCkpe1xucmV0dXJuIGZhbHNlO1xuIH1cbi8qIFVzZXMgdGhlIGN1cnJlbnQganNtYXAgdmFsdWUsIHNpbmNlIHRoZSBpdGVyYXRhdG9yIHN1cnZpdmVzIGAuc2V0YCovXG5pZih2YWx1ZVBhdHQhPT11bmRlZmluZWQmJiFtYXRjaGVzKGpzbWFwLmdldChrKSx2YWx1ZVBhdHQpKXtcbnJldHVybiBmYWxzZTtcbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xucmV0dXJuIGZpbHRlckl0ZXJhYmxlKGl0ZXJhYmxlS2V5cyxmaWx0ZXIpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBba2V5UGF0dF1cbiAqIEBwYXJhbSB7UGF0dGVybn0gW3ZhbHVlUGF0dF1cbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxWPn1cbiAqL1xuY29uc3QgdmFsdWVzPShrZXlQYXR0PXVuZGVmaW5lZCx2YWx1ZVBhdHQ9dW5kZWZpbmVkKT0+XG5tYXBJdGVyYWJsZShrZXlzKGtleVBhdHQsdmFsdWVQYXR0KSwoayk9Pi8qKiBAdHlwZSB7Vn0gKi9qc21hcC5nZXQoaykpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGF0dGVybn0gW2tleVBhdHRdXG4gKiBAcGFyYW0ge1BhdHRlcm59IFt2YWx1ZVBhdHRdXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W0ssVl0+fVxuICovXG5jb25zdCBlbnRyaWVzPShrZXlQYXR0PXVuZGVmaW5lZCx2YWx1ZVBhdHQ9dW5kZWZpbmVkKT0+XG5tYXBJdGVyYWJsZShrZXlzKGtleVBhdHQsdmFsdWVQYXR0KSwoayk9PltcbmssXG4vKiogQHR5cGUge1Z9ICovanNtYXAuZ2V0KGspXSk7XG5cblxucmV0dXJuIGhhcmRlbih7XG4uLi5tYWtlV2Vha01hcFN0b3JlTWV0aG9kcyhcbmpzbWFwLFxuLyoqIEB0eXBlIHsoazogSywgdjogVikgPT4gdm9pZH0gKi9hc3NlcnRVcGRhdGVPbkFkZCxcbmFzc2VydEtWT2tUb1NldCxcbmFzc2VydFVwZGF0ZU9uRGVsZXRlLFxudGFnKSxcblxua2V5cyxcbnZhbHVlcyxcbmVudHJpZXMsXG5cbnNuYXBzaG90OihrZXlQYXR0PXVuZGVmaW5lZCx2YWx1ZVBhdHQ9dW5kZWZpbmVkKT0+XG5tYWtlQ29weU1hcChlbnRyaWVzKGtleVBhdHQsdmFsdWVQYXR0KSksXG5cbmdldFNpemU6KGtleVBhdHQ9dW5kZWZpbmVkLHZhbHVlUGF0dD11bmRlZmluZWQpPT5cbmtleVBhdHQ9PT11bmRlZmluZWQmJnZhbHVlUGF0dD09PXVuZGVmaW5lZD9cbmpzbWFwLnNpemU6XG5bLi4ua2V5cyhrZXlQYXR0LHZhbHVlUGF0dCldLmxlbmd0aCxcblxuY2xlYXI6KGtleVBhdHQ9dW5kZWZpbmVkLHZhbHVlUGF0dD11bmRlZmluZWQpPT57XG5pZihrZXlQYXR0PT09dW5kZWZpbmVkJiZ2YWx1ZVBhdHQ9PT11bmRlZmluZWQpe1xuanNtYXAuY2xlYXIoKTtcbiB9XG5mb3IoY29uc3Qga2V5IG9mIGtleXMoa2V5UGF0dCx2YWx1ZVBhdHQpKXtcbmpzbWFwLmRlbGV0ZShrZXkpO1xuIH1cbiB9fSk7XG5cbiB9O1xuXG4vKipcbiAqIERpc3Rpbmd1aXNoZXMgYmV0d2VlbiBhZGRpbmcgYSBuZXcga2V5IChpbml0KSBhbmQgdXBkYXRpbmcgb3JcbiAqIHJlZmVyZW5jaW5nIGEga2V5IChnZXQsIHNldCwgZGVsZXRlKS5cbiAqXG4gKiBgaW5pdGAgaXMgb25seSBhbGxvd2VkIGlmIHRoZSBrZXkgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4gYEdldGAsXG4gKiBgc2V0YCBhbmQgYGRlbGV0ZWAgYXJlIG9ubHkgYWxsb3dlZCBpZiB0aGUga2V5IGRvZXMgYWxyZWFkeSBleGlzdC5cbiAqXG4gKiBUaGlzIGlzIGEgKnNjYWxhciogbWFwIGluIHRoYXQgdGhlIGtleXMgY2FuIG9ubHkgYmUgYXRvbWljIHZhbHVlcywgcHJpbWl0aXZlc1xuICogb3IgcmVtb3RhYmxlcy4gT3RoZXIgc3RvcmVNYXBzIHdpbGwgYWNjZXB0LCBmb3IgZXhhbXBsZSwgY29weUFycmF5cyBhbmRcbiAqIGNvcHlSZWNvcmRzLCBhcyBrZXlzIGFuZCBsb29rIHRoZW0gdXAgYmFzZWQgb24gZXF1YWxpdHkgb2YgdGhlaXIgY29udGVudHMuXG4gKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnPSdrZXknXSAtIHRoZSBjb2x1bW4gbmFtZSBmb3IgdGhlIGtleVxuICogQHBhcmFtIHtTdG9yZU9wdGlvbnN9IFtvcHRpb25zXVxuICogQHJldHVybnMge01hcFN0b3JlPEssVj59XG4gKi8kaOKAjV9vbmNlLm1ha2VNYXBTdG9yZU1ldGhvZHMobWFrZU1hcFN0b3JlTWV0aG9kcyk7XG5jb25zdCAgICAgICAgbWFrZVNjYWxhck1hcFN0b3JlPShcbnRhZz0na2V5JyxcbntrZXlTaGFwZT11bmRlZmluZWQsdmFsdWVTaGFwZT11bmRlZmluZWR9PXt9KT0+XG57XG5jb25zdCBqc21hcD1uZXcgTWFwKCk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKGtleVNoYXBlKTtcbiB9XG5pZih2YWx1ZVNoYXBlIT09dW5kZWZpbmVkKXtcbmFzc2VydFBhdHRlcm4odmFsdWVTaGFwZSk7XG4gfVxuXG5jb25zdCBhc3NlcnRLVk9rVG9TZXQ9KF9rZXksdmFsdWUpPT57XG4vKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNjA2Ki9cbmhhcmRlbih2YWx1ZSk7XG5cbmFzc2VydFBhc3NhYmxlKHZhbHVlKTtcbmlmKHZhbHVlU2hhcGUhPT11bmRlZmluZWQpe1xubXVzdE1hdGNoKHZhbHVlLHZhbHVlU2hhcGUsJ21hcFN0b3JlIHZhbHVlJyk7XG4gfVxuIH07XG5cbmNvbnN0IGFzc2VydEtWT2tUb0FkZD0oa2V5LHZhbHVlKT0+e1xuLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG5oYXJkZW4oa2V5KTtcblxuYXNzZXJ0U2NhbGFyS2V5KGtleSk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5tdXN0TWF0Y2goa2V5LGtleVNoYXBlLCdtYXBTdG9yZSBrZXknKTtcbiB9XG5hc3NlcnRLVk9rVG9TZXQoa2V5LHZhbHVlKTtcbiB9O1xuXG5yZXR1cm4gRmFyKCBgc2NhbGFyIE1hcFN0b3JlIG9mICR7cSh0YWcpfWAse1xuLi4ubWFrZU1hcFN0b3JlTWV0aG9kcyhcbmpzbWFwLFxuYXNzZXJ0S1ZPa1RvQWRkLFxuYXNzZXJ0S1ZPa1RvU2V0LFxudW5kZWZpbmVkLFxudGFnKX0pO1xuXG5cbiB9OyRo4oCNX29uY2UubWFrZVNjYWxhck1hcFN0b3JlKG1ha2VTY2FsYXJNYXBTdG9yZSk7XG5oYXJkZW4obWFrZVNjYWxhck1hcFN0b3JlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTWFwU3RvcmVNZXRob2RzIjpbIm1ha2VNYXBTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhck1hcFN0b3JlIjpbIm1ha2VTY2FsYXJNYXBTdG9yZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD9G92DmQ8AAJkPAAAxAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qc3siaW1wb3J0cyI6WyIuLi9rZXlzL2NoZWNrS2V5LmpzIiwiLi4vcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIiwiLi9zY2FsYXJXZWFrU2V0U3RvcmUuanMiLCIuL3N0b3JlLXV0aWxzLmpzIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL21hcnNoYWwvc3JjL3JhbmtPcmRlci5qcyJdLCJleHBvcnRzIjpbIm1ha2VTY2FsYXJTZXRTdG9yZSIsIm1ha2VTZXRTdG9yZU1ldGhvZHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyLGZpbHRlckl0ZXJhYmxlLGNvbXBhcmVSYW5rLGFzc2VydFNjYWxhcktleSxtYWtlQ29weVNldCxtYXRjaGVzLG11c3RNYXRjaCxhc3NlcnRQYXR0ZXJuLG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzLG1ha2VDdXJyZW50S2V5c0tpdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wiZmlsdGVySXRlcmFibGVcIiwgWyRo4oCNX2EgPT4gKGZpbHRlckl0ZXJhYmxlID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWwvc3JjL3JhbmtPcmRlci5qc1wiLCBbW1wiY29tcGFyZVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVSYW5rID0gJGjigI1fYSldXV1dLFtcIi4uL2tleXMvY2hlY2tLZXkuanNcIiwgW1tcImFzc2VydFNjYWxhcktleVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0U2NhbGFyS2V5ID0gJGjigI1fYSldXSxbXCJtYWtlQ29weVNldFwiLCBbJGjigI1fYSA9PiAobWFrZUNvcHlTZXQgPSAkaOKAjV9hKV1dXV0sW1wiLi4vcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzXCIsIFtbXCJtYXRjaGVzXCIsIFskaOKAjV9hID0+IChtYXRjaGVzID0gJGjigI1fYSldXSxbXCJtdXN0TWF0Y2hcIiwgWyRo4oCNX2EgPT4gKG11c3RNYXRjaCA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGF0dGVyblwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRo4oCNX2EpXV1dXSxbXCIuL3NjYWxhcldlYWtTZXRTdG9yZS5qc1wiLCBbW1wibWFrZVdlYWtTZXRTdG9yZU1ldGhvZHNcIiwgWyRo4oCNX2EgPT4gKG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzID0gJGjigI1fYSldXV1dLFtcIi4vc3RvcmUtdXRpbHMuanNcIiwgW1tcIm1ha2VDdXJyZW50S2V5c0tpdFwiLCBbJGjigI1fYSA9PiAobWFrZUN1cnJlbnRLZXlzS2l0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e3F1b3RlOnF9PWFzc2VydDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtTZXQ8Sz59IGpzc2V0XG4gKiBAcGFyYW0geyhrOiBLKSA9PiB2b2lkfSBhc3NlcnRLZXlPa1RvQWRkXG4gKiBAcGFyYW0geyhrOiBLKSA9PiB2b2lkfSBbYXNzZXJ0S2V5T2tUb0RlbGV0ZV1cbiAqIEBwYXJhbSB7c3RyaW5nfSBba2V5TmFtZV1cbiAqIEByZXR1cm5zIHtTZXRTdG9yZTxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VTZXRTdG9yZU1ldGhvZHM9KFxuanNzZXQsXG5hc3NlcnRLZXlPa1RvQWRkLFxuYXNzZXJ0S2V5T2tUb0RlbGV0ZT11bmRlZmluZWQsXG5rZXlOYW1lPSdrZXknKT0+XG57XG5jb25zdHthc3NlcnRVcGRhdGVPbkFkZCxhc3NlcnRVcGRhdGVPbkRlbGV0ZSxpdGVyYWJsZUtleXN9PVxubWFrZUN1cnJlbnRLZXlzS2l0KFxuKCk9Pmpzc2V0LmtleXMoKSxcbihrKT0+anNzZXQuaGFzKGspLFxuY29tcGFyZVJhbmssXG5hc3NlcnRLZXlPa1RvQWRkLFxuYXNzZXJ0S2V5T2tUb0RlbGV0ZSxcbmtleU5hbWUpO1xuXG5cbi8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBba2V5UGF0dF1cbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxLPn1cbiAqL1xuY29uc3Qga2V5cz0oa2V5UGF0dD11bmRlZmluZWQpPT5cbmtleVBhdHQ9PT11bmRlZmluZWQ/XG5pdGVyYWJsZUtleXM6XG5maWx0ZXJJdGVyYWJsZShpdGVyYWJsZUtleXMsKGspPT5tYXRjaGVzKGssa2V5UGF0dCkpO1xuXG5yZXR1cm4gaGFyZGVuKHtcbi4uLm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzKFxuanNzZXQsXG5hc3NlcnRVcGRhdGVPbkFkZCxcbmFzc2VydFVwZGF0ZU9uRGVsZXRlLFxua2V5TmFtZSksXG5cblxua2V5cyxcblxudmFsdWVzOmtleXMsXG5cbnNuYXBzaG90OihrZXlQYXR0PXVuZGVmaW5lZCk9Pm1ha2VDb3B5U2V0KGtleXMoa2V5UGF0dCkpLFxuXG5nZXRTaXplOihrZXlQYXR0PXVuZGVmaW5lZCk9Plxua2V5UGF0dD09PXVuZGVmaW5lZD9qc3NldC5zaXplOlsuLi5rZXlzKGtleVBhdHQpXS5sZW5ndGgsXG5cbmNsZWFyOihrZXlQYXR0PXVuZGVmaW5lZCk9PntcbmlmKGtleVBhdHQ9PT11bmRlZmluZWQpe1xuanNzZXQuY2xlYXIoKTtcbiB9XG5mb3IoY29uc3Qga2V5IG9mIGtleXMoa2V5UGF0dCkpe1xuanNzZXQuZGVsZXRlKGtleSk7XG4gfVxuIH19KTtcblxuIH07XG5cbi8qKlxuICogRGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGFkZGluZyBhIG5ldyBrZXkgKGluaXQpIGFuZCB1cGRhdGluZyBvclxuICogcmVmZXJlbmNpbmcgYSBrZXkgKGdldCwgc2V0LCBkZWxldGUpLlxuICpcbiAqIGBpbml0YCBpcyBvbmx5IGFsbG93ZWQgaWYgdGhlIGtleSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LiBgR2V0YCxcbiAqIGBzZXRgIGFuZCBgZGVsZXRlYCBhcmUgb25seSBhbGxvd2VkIGlmIHRoZSBrZXkgZG9lcyBhbHJlYWR5IGV4aXN0LlxuICpcbiAqIFRoaXMgaXMgYSAqc2NhbGFyKiBzZXQgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzLCBwcmltaXRpdmVzXG4gKiBvciByZW1vdGFibGVzLiBPdGhlciBzdG9yZVNldHMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLCBjb3B5QXJyYXlzIGFuZFxuICogY29weVJlY29yZHMsIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtzdHJpbmd9IFt0YWc9J2tleSddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7U3RvcmVPcHRpb25zfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtTZXRTdG9yZTxLPn1cbiAqLyRo4oCNX29uY2UubWFrZVNldFN0b3JlTWV0aG9kcyhtYWtlU2V0U3RvcmVNZXRob2RzKTtcbmNvbnN0ICAgICAgICBtYWtlU2NhbGFyU2V0U3RvcmU9KFxudGFnPSdrZXknLFxue2tleVNoYXBlPXVuZGVmaW5lZH09e30pPT5cbntcbmNvbnN0IGpzc2V0PW5ldyBTZXQoKTtcbmlmKGtleVNoYXBlIT09dW5kZWZpbmVkKXtcbmFzc2VydFBhdHRlcm4oa2V5U2hhcGUpO1xuIH1cblxuY29uc3QgYXNzZXJ0S2V5T2tUb0FkZD0oa2V5KT0+e1xuLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG5oYXJkZW4oa2V5KTtcblxuYXNzZXJ0U2NhbGFyS2V5KGtleSk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5tdXN0TWF0Y2goa2V5LGtleVNoYXBlLCdzZXRTdG9yZSBrZXknKTtcbiB9XG4gfTtcblxucmV0dXJuIEZhciggYHNjYWxhciBTZXRTdG9yZSBvZiAke3EodGFnKX1gLHtcbi4uLm1ha2VTZXRTdG9yZU1ldGhvZHMoanNzZXQsYXNzZXJ0S2V5T2tUb0FkZCx1bmRlZmluZWQsdGFnKX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VTY2FsYXJTZXRTdG9yZShtYWtlU2NhbGFyU2V0U3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJTZXRTdG9yZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVNldFN0b3JlTWV0aG9kcyI6WyJtYWtlU2V0U3RvcmVNZXRob2RzIl0sIm1ha2VTY2FsYXJTZXRTdG9yZSI6WyJtYWtlU2NhbGFyU2V0U3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAWJG5be4SAADuEgAANQAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzeyJpbXBvcnRzIjpbIi4uL2tleXMvY2hlY2tLZXkuanMiLCIuLi9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsibWFrZVNjYWxhcldlYWtNYXBTdG9yZSIsIm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhcixhc3NlcnRQYXNzYWJsZSxwYXNzU3R5bGVPZixnZXRDb3B5TWFwRW50cmllcyxpc0NvcHlNYXAsbXVzdE1hdGNoLGFzc2VydFBhdHRlcm47JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhc3NhYmxlXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dLFtcIi4uL2tleXMvY2hlY2tLZXkuanNcIiwgW1tcImdldENvcHlNYXBFbnRyaWVzXCIsIFskaOKAjV9hID0+IChnZXRDb3B5TWFwRW50cmllcyA9ICRo4oCNX2EpXV0sW1wiaXNDb3B5TWFwXCIsIFskaOKAjV9hID0+IChpc0NvcHlNYXAgPSAkaOKAjV9hKV1dXV0sW1wiLi4vcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzXCIsIFtbXCJtdXN0TWF0Y2hcIiwgWyRo4oCNX2EgPT4gKG11c3RNYXRjaCA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGF0dGVyblwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtXZWFrTWFwPEsgJiBvYmplY3QsIFY+fSBqc21hcFxuICogQHBhcmFtIHsoazogSywgdjogVikgPT4gdm9pZH0gYXNzZXJ0S1ZPa1RvQWRkXG4gKiBAcGFyYW0geyhrOiBLLCB2OiBWKSA9PiB2b2lkfSBhc3NlcnRLVk9rVG9TZXRcbiAqIEBwYXJhbSB7KGs6IEspID0+IHZvaWR9IFthc3NlcnRLZXlPa1RvRGVsZXRlXVxuICogQHBhcmFtIHtzdHJpbmd9IFtrZXlOYW1lXVxuICogQHJldHVybnMge1dlYWtNYXBTdG9yZTxLLFY+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVdlYWtNYXBTdG9yZU1ldGhvZHM9KFxuanNtYXAsXG5hc3NlcnRLVk9rVG9BZGQsXG5hc3NlcnRLVk9rVG9TZXQsXG5hc3NlcnRLZXlPa1RvRGVsZXRlPXVuZGVmaW5lZCxcbmtleU5hbWU9J2tleScpPT5cbntcbmNvbnN0IGFzc2VydEtleURvZXNOb3RFeGlzdD0oa2V5KT0+XG4hanNtYXAuaGFzKGtleSl8fEZhaWwgYCR7cShrZXlOYW1lKX0gYWxyZWFkeSByZWdpc3RlcmVkOiAke2tleX1gO1xuXG5jb25zdCBhc3NlcnRLZXlFeGlzdHM9KGtleSk9PlxuanNtYXAuaGFzKGtleSl8fEZhaWwgYCR7cShrZXlOYW1lKX0gbm90IGZvdW5kOiAke2tleX1gO1xuXG5yZXR1cm4gaGFyZGVuKHtcbmhhczooa2V5KT0+e1xuLyogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwqL1xuLyogdGhvdWdoIHRoZSBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQqL1xuLyogaW4gdGhpcyBtYXAuKi9cbnJldHVybiBqc21hcC5oYXMoa2V5KTtcbiB9LFxuZ2V0OihrZXkpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbi8qIEhvdyB0byB0ZWxsIHR5cGVzY3JpcHQgSSBiZWxpZXZlIHRoZSBgZ2V0YCB3aWxsIHN1Y2NlZWQuKi9cbnJldHVybiAoLyoqIEB0eXBlIHtWfSAqL2pzbWFwLmdldChrZXkpKTtcbiB9LFxuXG5pbml0OihrZXksdmFsdWUpPT57XG5hc3NlcnRLZXlEb2VzTm90RXhpc3Qoa2V5KTtcbmFzc2VydEtWT2tUb0FkZChrZXksdmFsdWUpO1xuanNtYXAuc2V0KGtleSx2YWx1ZSk7XG4gfSxcbnNldDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG5hc3NlcnRLVk9rVG9TZXQoa2V5LHZhbHVlKTtcbmpzbWFwLnNldChrZXksdmFsdWUpO1xuIH0sXG5kZWxldGU6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xuaWYoYXNzZXJ0S2V5T2tUb0RlbGV0ZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRLZXlPa1RvRGVsZXRlKGtleSk7XG4gfVxuanNtYXAuZGVsZXRlKGtleSk7XG4gfSxcblxuYWRkQWxsOihlbnRyaWVzKT0+e1xuaWYoaXNDb3B5TWFwKGVudHJpZXMpKXtcbmVudHJpZXM9Z2V0Q29weU1hcEVudHJpZXMoZW50cmllcyk7XG4gfVxuZm9yKGNvbnN0W2tleSx2YWx1ZV1vZi8qKiBAdHlwZSB7SXRlcmFibGU8W0ssIFZdPn0gKi9lbnRyaWVzKXtcbi8qIERvbid0IGFzc2VydCB0aGF0IHRoZSBrZXkgZWl0aGVyIGRvZXMgb3IgZG9lcyBub3QgZXhpc3QuKi9cbmFzc2VydEtWT2tUb0FkZChrZXksdmFsdWUpO1xuanNtYXAuc2V0KGtleSx2YWx1ZSk7XG4gfVxuIH19KTtcblxuIH07XG5cbi8qKlxuICogVGhpcyBpcyBhICpzY2FsYXIqIG1hcFN0b3JlIGluIHRoYXQgdGhlIGtleXMgY2FuIG9ubHkgYmUgYXRvbWljIHZhbHVlczpcbiAqIHByaW1pdGl2ZXMgb3IgcmVtb3RhYmxlcy5cbiAqIE90aGVyIG1hcFN0b3JlcyB3aWxsIGFjY2VwdCwgZm9yIGV4YW1wbGUsIGNvcHlBcnJheXMgYW5kXG4gKiBjb3B5UmVjb3JkcyBhcyBrZXlzIGFuZCBsb29rIHRoZW0gdXAgYmFzZWQgb24gZXF1YWxpdHkgb2YgdGhlaXIgY29udGVudHMuXG4gKlxuICogVE9ETyBGb3Igbm93LCB0aGlzIHNjYWxhcldlYWtNYXAgYWNjZXB0cyBvbmx5IHJlbW90YWJsZXMsIHJlZmxlY3RpbmcgdGhlXG4gKiBjb25zdHJhaW50cyBvZiB0aGUgdW5kZXJseWluZyBKYXZhU2NyaXB0IFdlYWtNYXAgaXQgdXNlcyBpbnRlcm5hbGx5LiBCdXRcbiAqIGl0IHNob3VsZCBhY2NlcHQgdGhlIHByaW1pdGl2ZXMgYXMgd2VsbCwgc3RvcmluZyB0aGVtIGluIGEgc2VwYXJhdGUgaW50ZXJuYWxcbiAqIG1hcC4gV2hhdCBtYWtlcyBpdCBcIndlYWtcIiBpcyB0aGF0IGl0IHByb3ZpZGVzIG5vIEFQSSBmb3IgZW51bWVyYXRpbmcgd2hhdCdzXG4gKiB0aGVyZS4gVGhvdWdoIG5vdGUgdGhhdCB0aGlzIHdvdWxkIG9ubHkgZW5hYmxlcyBjb2xsZWN0aW9uIG9mIHRoZVxuICogcmVtb3RhYmxlcywgc2luY2UgdGhlIG90aGVyIHByaW1pdGl2ZXMgbWF5IGFsd2F5cyByZWFwcGVhci5cbiAqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZz0na2V5J10gLSB0YWcgZm9yIGRlYnVnZ2luZ1xuICogQHBhcmFtIHtTdG9yZU9wdGlvbnN9IFtvcHRpb25zXVxuICogQHJldHVybnMge1dlYWtNYXBTdG9yZTxLLFY+fVxuICovJGjigI1fb25jZS5tYWtlV2Vha01hcFN0b3JlTWV0aG9kcyhtYWtlV2Vha01hcFN0b3JlTWV0aG9kcyk7XG5jb25zdCAgICAgICAgbWFrZVNjYWxhcldlYWtNYXBTdG9yZT0oXG50YWc9J2tleScsXG57bG9uZ0xpdmVkPXRydWUsa2V5U2hhcGU9dW5kZWZpbmVkLHZhbHVlU2hhcGU9dW5kZWZpbmVkfT17fSk9Plxue1xuY29uc3QganNtYXA9bmV3KGxvbmdMaXZlZD9XZWFrTWFwOk1hcCkoKTtcbmlmKGtleVNoYXBlIT09dW5kZWZpbmVkKXtcbmFzc2VydFBhdHRlcm4oa2V5U2hhcGUpO1xuIH1cbmlmKHZhbHVlU2hhcGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0UGF0dGVybih2YWx1ZVNoYXBlKTtcbiB9XG5cbmNvbnN0IGFzc2VydEtWT2tUb1NldD0oX2tleSx2YWx1ZSk9Pntcbi8qIFRPRE86IEp1c3QgYSB0cmFuc2l0aW9uIGtsdWRnZS4gUmVtb3ZlIHdoZW4gcG9zc2libGUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuaGFyZGVuKHZhbHVlKTtcblxuYXNzZXJ0UGFzc2FibGUodmFsdWUpO1xuaWYodmFsdWVTaGFwZSE9PXVuZGVmaW5lZCl7XG5tdXN0TWF0Y2godmFsdWUsdmFsdWVTaGFwZSwnd2Vha01hcFN0b3JlIHZhbHVlJyk7XG4gfVxuIH07XG5cbmNvbnN0IGFzc2VydEtWT2tUb0FkZD0oa2V5LHZhbHVlKT0+e1xuLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG5oYXJkZW4oa2V5KTtcbnBhc3NTdHlsZU9mKGtleSk9PT0ncmVtb3RhYmxlJ3x8XG5GYWlsIGBPbmx5IHJlbW90YWJsZXMgY2FuIGJlIGtleXMgb2Ygc2NhbGFyIFdlYWtNYXBTdG9yZXM6ICR7a2V5fWA7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5tdXN0TWF0Y2goa2V5LGtleVNoYXBlLCd3ZWFrTWFwU3RvcmUga2V5Jyk7XG4gfVxuYXNzZXJ0S1ZPa1RvU2V0KGtleSx2YWx1ZSk7XG4gfTtcblxucmV0dXJuIEZhciggYHNjYWxhciBXZWFrTWFwU3RvcmUgb2YgJHtxKHRhZyl9YCx7XG4uLi5tYWtlV2Vha01hcFN0b3JlTWV0aG9kcyhcbmpzbWFwLFxuYXNzZXJ0S1ZPa1RvQWRkLFxuYXNzZXJ0S1ZPa1RvU2V0LFxudW5kZWZpbmVkLFxudGFnKX0pO1xuXG5cbiB9OyRo4oCNX29uY2UubWFrZVNjYWxhcldlYWtNYXBTdG9yZShtYWtlU2NhbGFyV2Vha01hcFN0b3JlKTtcbmhhcmRlbihtYWtlU2NhbGFyV2Vha01hcFN0b3JlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlV2Vha01hcFN0b3JlTWV0aG9kcyI6WyJtYWtlV2Vha01hcFN0b3JlTWV0aG9kcyJdLCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIjpbIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAASkab/Y8OAACPDgAANQAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzeyJpbXBvcnRzIjpbIi4uL2tleXMvY2hlY2tLZXkuanMiLCIuLi9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsibWFrZVNjYWxhcldlYWtTZXRTdG9yZSIsIm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhcixwYXNzU3R5bGVPZixnZXRDb3B5U2V0S2V5cyxpc0NvcHlTZXQsbXVzdE1hdGNoLGFzc2VydFBhdHRlcm47JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCIuLi9rZXlzL2NoZWNrS2V5LmpzXCIsIFtbXCJnZXRDb3B5U2V0S2V5c1wiLCBbJGjigI1fYSA9PiAoZ2V0Q29weVNldEtleXMgPSAkaOKAjV9hKV1dLFtcImlzQ29weVNldFwiLCBbJGjigI1fYSA9PiAoaXNDb3B5U2V0ID0gJGjigI1fYSldXV1dLFtcIi4uL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qc1wiLCBbW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhdHRlcm5cIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge1dlYWtTZXQ8SyAmIG9iamVjdD59IGpzc2V0XG4gKiBAcGFyYW0geyhrOiBLKSA9PiB2b2lkfSBhc3NlcnRLZXlPa1RvQWRkXG4gKiBAcGFyYW0geyhrOiBLKSA9PiB2b2lkfSBbYXNzZXJ0S2V5T2tUb0RlbGV0ZV1cbiAqIEBwYXJhbSB7c3RyaW5nfSBba2V5TmFtZV1cbiAqIEByZXR1cm5zIHtXZWFrU2V0U3RvcmU8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlV2Vha1NldFN0b3JlTWV0aG9kcz0oXG5qc3NldCxcbmFzc2VydEtleU9rVG9BZGQsXG5hc3NlcnRLZXlPa1RvRGVsZXRlPXVuZGVmaW5lZCxcbmtleU5hbWU9J2tleScpPT5cbntcbmNvbnN0IGFzc2VydEtleUV4aXN0cz0oa2V5KT0+XG5qc3NldC5oYXMoa2V5KXx8RmFpbCBgJHtxKGtleU5hbWUpfSBub3QgZm91bmQ6ICR7a2V5fWA7XG5cbnJldHVybiBoYXJkZW4oe1xuaGFzOihrZXkpPT57XG4vKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCovXG4vKiB0aG91Z2ggdGhlIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCovXG4vKiBpbiB0aGlzIHNldC4qL1xucmV0dXJuIGpzc2V0LmhhcyhrZXkpO1xuIH0sXG5cbmFkZDooa2V5KT0+e1xuYXNzZXJ0S2V5T2tUb0FkZChrZXkpO1xuanNzZXQuYWRkKGtleSk7XG4gfSxcbmRlbGV0ZTooa2V5KT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG5pZihhc3NlcnRLZXlPa1RvRGVsZXRlIT09dW5kZWZpbmVkKXtcbmFzc2VydEtleU9rVG9EZWxldGUoa2V5KTtcbiB9XG5qc3NldC5kZWxldGUoa2V5KTtcbiB9LFxuXG5hZGRBbGw6KGtleXMpPT57XG5pZihpc0NvcHlTZXQoa2V5cykpe1xua2V5cz1nZXRDb3B5U2V0S2V5cyhrZXlzKTtcbiB9XG5mb3IoY29uc3Qga2V5IG9mLyoqIEB0eXBlIHtJdGVyYWJsZTxLPn0gKi9rZXlzKXtcbmFzc2VydEtleU9rVG9BZGQoa2V5KTtcbmpzc2V0LmFkZChrZXkpO1xuIH1cbiB9fSk7XG5cbiB9O1xuXG4vKipcbiAqIFRoaXMgaXMgYSAqc2NhbGFyKiBzZXQgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzLCBwcmltaXRpdmVzXG4gKiBvciByZW1vdGFibGVzLiBPdGhlciBzdG9yZVNldHMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLCBjb3B5QXJyYXlzIGFuZFxuICogY29weVJlY29yZHMsIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBUT0RPIEZvciBub3csIHRoaXMgc2NhbGFyV2Vha1NldCBhY2NlcHRzIG9ubHkgcmVtb3RhYmxlcywgcmVmbGVjdGluZyB0aGVcbiAqIGNvbnN0cmFpbnRzIG9mIHRoZSB1bmRlcmx5aW5nIEphdmFTY3JpcHQgV2Vha1NldCBpdCB1c2VzIGludGVybmFsbHkuIEJ1dFxuICogaXQgc2hvdWxkIGFjY2VwdCB0aGUgcHJpbWl0aXZlcyBhcyB3ZWxsLCBzdG9yaW5nIHRoZW0gaW4gYSBzZXBhcmF0ZSBpbnRlcm5hbFxuICogc2V0LiBXaGF0IG1ha2VzIGl0IFwid2Vha1wiIGlzIHRoYXQgaXQgcHJvdmlkZXMgbm8gQVBJIGZvciBlbnVtZXJhdGluZyB3aGF0J3NcbiAqIHRoZXJlLiBUaG91Z2ggbm90ZSB0aGF0IHRoaXMgd291bGQgb25seSBlbmFibGVzIGNvbGxlY3Rpb24gb2YgdGhlXG4gKiByZW1vdGFibGVzLCBzaW5jZSB0aGUgb3RoZXIgcHJpbWl0aXZlcyBtYXkgYWx3YXlzIGFwcGVhci5cbiAqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtzdHJpbmd9IFt0YWc9J2tleSddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7U3RvcmVPcHRpb25zfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtXZWFrU2V0U3RvcmU8Sz59XG4gKi8kaOKAjV9vbmNlLm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzKG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzKTtcbmNvbnN0ICAgICAgICBtYWtlU2NhbGFyV2Vha1NldFN0b3JlPShcbnRhZz0na2V5Jyxcbntsb25nTGl2ZWQ9dHJ1ZSxrZXlTaGFwZT11bmRlZmluZWR9PXt9KT0+XG57XG5jb25zdCBqc3NldD1uZXcobG9uZ0xpdmVkP1dlYWtTZXQ6U2V0KSgpO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0UGF0dGVybihrZXlTaGFwZSk7XG4gfVxuXG5jb25zdCBhc3NlcnRLZXlPa1RvQWRkPShrZXkpPT57XG4vKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNjA2Ki9cbmhhcmRlbihrZXkpO1xucGFzc1N0eWxlT2Yoa2V5KT09PSdyZW1vdGFibGUnfHxcbkZhaWwgYE9ubHkgcmVtb3RhYmxlcyBjYW4gYmUga2V5cyBvZiBzY2FsYXIgV2Vha1N0b3JlczogJHtrZXl9YDtcbmlmKGtleVNoYXBlIT09dW5kZWZpbmVkKXtcbm11c3RNYXRjaChrZXksa2V5U2hhcGUsJ3dlYWtTZXRTdG9yZSBrZXknKTtcbiB9XG4gfTtcblxucmV0dXJuIEZhciggYHNjYWxhciBXZWFrU2V0U3RvcmUgb2YgJHtxKHRhZyl9YCx7XG4uLi5tYWtlV2Vha1NldFN0b3JlTWV0aG9kcyhqc3NldCxhc3NlcnRLZXlPa1RvQWRkLHVuZGVmaW5lZCx0YWcpfSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZVNjYWxhcldlYWtTZXRTdG9yZShtYWtlU2NhbGFyV2Vha1NldFN0b3JlKTtcbmhhcmRlbihtYWtlU2NhbGFyV2Vha1NldFN0b3JlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyI6WyJtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyJdLCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIjpbIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA8RKddP8UAAD/FAAALgAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImFwcGVuZFRvU3RvcmVkQXJyYXkiLCJtYWtlQXRvbWljUHJvdmlkZXIiLCJtYWtlQ3VycmVudEtleXNLaXQiLCJwcm92aWRlTGF6eSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXI7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuY29uc3R7RmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHR5cGVkZWYge29iamVjdH0gQ3VycmVudEtleXNLaXRcbiAqIEBwcm9wZXJ0eSB7KGs6IEssIHY/OiBWKSA9PiB2b2lkfSBhc3NlcnRVcGRhdGVPbkFkZFxuICogQHByb3BlcnR5IHsoazogSykgPT4gdm9pZH0gYXNzZXJ0VXBkYXRlT25EZWxldGVcbiAqIEBwcm9wZXJ0eSB7SXRlcmFibGU8Sz59IGl0ZXJhYmxlS2V5c1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHsoKSA9PiBJdGVyYWJsZTxLPn0gZ2V0UmF3S2V5c1xuICogQHBhcmFtIHsoazogSykgPT4gYm9vbGVhbn0gY2hlY2tIYXNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7KGs6IEssIHY/OiBWKSA9PiB2b2lkfSBhc3NlcnRPa1RvQWRkXG4gKiBAcGFyYW0geyhrOiBLKSA9PiB2b2lkfSBbYXNzZXJ0T2tUb0RlbGV0ZV1cbiAqIEBwYXJhbSB7c3RyaW5nfSBba2V5TmFtZV1cbiAqIEByZXR1cm5zIHtDdXJyZW50S2V5c0tpdDxLLFY+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUN1cnJlbnRLZXlzS2l0PShcbmdldFJhd0tleXMsXG5jaGVja0hhcyxcbmNvbXBhcmUsXG5hc3NlcnRPa1RvQWRkLFxuYXNzZXJ0T2tUb0RlbGV0ZT11bmRlZmluZWQsXG5rZXlOYW1lPSdrZXknKT0+XG57XG5sZXQgdXBkYXRlQ291bnQ9MDtcbmxldCBzb3J0ZWRLZXlzTWVtbztcblxuY29uc3QgYXNzZXJ0VXBkYXRlT25BZGQ9KGssdj11bmRlZmluZWQpPT57XG5hc3NlcnRPa1RvQWRkKGssdik7XG51cGRhdGVDb3VudCs9MTtcbnNvcnRlZEtleXNNZW1vPXVuZGVmaW5lZDtcbiB9O1xuXG5jb25zdCBhc3NlcnRVcGRhdGVPbkRlbGV0ZT0oayk9PmFzc2VydE9rVG9EZWxldGUmJmFzc2VydE9rVG9EZWxldGUoayk7XG5cbmNvbnN0IGdldFNvcnRlZEtleXM9KCk9PntcbmlmKHNvcnRlZEtleXNNZW1vPT09dW5kZWZpbmVkKXtcbnNvcnRlZEtleXNNZW1vPWhhcmRlbihbLi4uZ2V0UmF3S2V5cygpXS5zb3J0KGNvbXBhcmUpKTtcbiB9XG5yZXR1cm4gc29ydGVkS2V5c01lbW87XG4gfTtcblxuY29uc3QgaXRlcmFibGVLZXlzPUZhcignSXRlcmFibGUgb2Yga2V5cycse1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PntcbmNvbnN0IGdlbmVyYXRpb249dXBkYXRlQ291bnQ7XG5nZXRTb3J0ZWRLZXlzKCk7XG5jb25zdCBsZW49c29ydGVkS2V5c01lbW8ubGVuZ3RoO1xubGV0IGk9MDtcbnJldHVybiBGYXIoJ0l0ZXJhdG9yIG9mIGtleXMnLHtcbm5leHQ6KCk9PntcbmdlbmVyYXRpb249PT11cGRhdGVDb3VudHx8RmFpbCBgU3RvcmUgJHtxKGtleU5hbWUpfSBjdXJzb3Igc3RhbGVgO1xuLyogSWYgdGhleSdyZSBlcXVhbCwgdGhlbiB0aGUgc29ydGVkS2V5TWVtbyBpcyB0aGUgc2FtZSBvbmUqL1xuLyogd2Ugc3RhcnRlZCB3aXRoLiovXG5mb3IoOzspe1xuaWYoaTxsZW4pe1xuY29uc3QgdmFsdWU9c29ydGVkS2V5c01lbW9baV07XG5pKz0xO1xuaWYoY2hlY2tIYXModmFsdWUpKXtcbnJldHVybiBoYXJkZW4oe2RvbmU6ZmFsc2UsdmFsdWV9KTtcbiB9XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHtkb25lOnRydWUsdmFsdWU6dW5kZWZpbmVkfSk7XG4gfVxuIH1cbiB9fSk7XG5cbiB9fSk7XG5cblxucmV0dXJuIGhhcmRlbih7XG5hc3NlcnRVcGRhdGVPbkFkZCxcbmFzc2VydFVwZGF0ZU9uRGVsZXRlLFxuaXRlcmFibGVLZXlzfSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZUN1cnJlbnRLZXlzS2l0KG1ha2VDdXJyZW50S2V5c0tpdCk7XG5oYXJkZW4obWFrZUN1cnJlbnRLZXlzS2l0KTtcblxuLyoqXG4gKiBDYWxsIGBwcm92aWRlTGF6eWAgdG8gZ2V0IG9yIG1ha2UgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LlxuICogSWYgdGhlcmUgYWxyZWFkeSBpcyBvbmUsIHJldHVybiB0aGF0LiBPdGhlcndpc2UsXG4gKiBjYWxsIGBtYWtlVmFsdWUoa2V5KWAsIHJlbWVtYmVyIGl0IGFzIHRoZSB2YWx1ZSBmb3JcbiAqIHRoYXQga2V5LCBhbmQgcmV0dXJuIGl0LlxuICpcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7V2Vha01hcFN0b3JlPEssVj59IG1hcFN0b3JlXG4gKiBAcGFyYW0ge0t9IGtleVxuICogQHBhcmFtIHsoa2V5OiBLKSA9PiBWfSBtYWtlVmFsdWVcbiAqIEByZXR1cm5zIHtWfVxuICovXG5jb25zdCAgICAgICAgcHJvdmlkZUxhenk9KG1hcFN0b3JlLGtleSxtYWtlVmFsdWUpPT57XG5pZighbWFwU3RvcmUuaGFzKGtleSkpe1xubWFwU3RvcmUuaW5pdChrZXksbWFrZVZhbHVlKGtleSkpO1xuIH1cbnJldHVybiBtYXBTdG9yZS5nZXQoa2V5KTtcbiB9OyRo4oCNX29uY2UucHJvdmlkZUxhenkocHJvdmlkZUxhenkpO1xuaGFyZGVuKHByb3ZpZGVMYXp5KTtcblxuLyoqXG4gKiBIZWxwZXIgZm9yIHVzZSBjYXNlcyBpbiB3aGljaCB0aGUgbWFrZXIgZnVuY3Rpb24gaXMgYXN5bmMuXG4gKiBGb3IgdHdvIHByb3ZpZGVMYXp5IGNhbGxzIHdpdGggdGhlIHNhbWUga2V5LCBvbmUgbWF5IGJlIG1ha2luZyB3aGVuIHRoZVxuICogb3RoZXIgY2FsbCBzdGFydHMgYW5kIGl0IHdvdWxkIG1ha2UgYWdhaW4uXG4gKiAoVGhlbiB0aGVyZSdkIGJlIGEgY29sbGlzaW9uIHdoZW4gdGhlIHNlY29uZCB0cmllcyB0byBzdG9yZVxuICogdGhlIGtleS4pIFRoaXMgcHJldmVudHMgdGhhdCByYWNlIGNvbmRpdGlvbiBieSBpbW1lZGlhdGVseSBzdG9yaW5nIGEgUHJvbWlzZVxuICogZm9yIHRoZSBtYWtlciBpbiBhbiBlcGhlbWVyYWwgc3RvcmUuXG4gKlxuICogV2hlbiB0aGUgYHN0b3JlYCBhcmd1bWVudCBpcyBkdXJhYmxlIHN0b3JhZ2UsIG5vdGUgdGhhdCBpdCdzIHBvc3NpYmxlIGZvclxuICogdGVybWluYXRpb24gdG8gaGFwcGVuIGFmdGVyIHRoZSBtYWtlIGNvbXBsZXRlcyBhbmQgYmVmb3JlIGl0IHJlYWNoZXMgZHVyYWJsZVxuICogc3RvcmFnZS5cbiAqXG4gKiBAdGVtcGxhdGUgS1xuICogQHRlbXBsYXRlIFZcbiAqIEBwYXJhbSB7V2Vha01hcFN0b3JlPEssIFY+fSBzdG9yZVxuICovXG5jb25zdCAgICAgICAgbWFrZUF0b21pY1Byb3ZpZGVyPShzdG9yZSk9Pntcbi8qKiBAdHlwZSB7TWFwPEssIFByb21pc2U8Vj4+fSAqL1xuY29uc3QgcGVuZGluZz1uZXcgTWFwKCk7XG5cbi8qKlxuICogQ2FsbCBgcHJvdmlkZUFzeW5jYCB0byBnZXQgb3IgbWFrZSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXksXG4gKiB3aGVuIHRoZSBtYWtlciBpcyBhc3luY2hyb25vdXMuXG4gKiBJZiB0aGVyZSBhbHJlYWR5IGlzIG9uZSwgcmV0dXJuIHRoYXQuIE90aGVyd2lzZSxcbiAqIGNhbGwgYG1ha2VWYWx1ZShrZXkpYCwgcmVtZW1iZXIgaXQgYXMgdGhlIHZhbHVlIGZvclxuICogdGhhdCBrZXksIGFuZCByZXR1cm4gaXQuXG4gKlxuICogQHBhcmFtIHtLfSBrZXlcbiAqIEBwYXJhbSB7KGtleTogSykgPT4gUHJvbWlzZTxWPn0gbWFrZVZhbHVlIG1ha2UgdGhlIHZhbHVlIGZvciB0aGUgc3RvcmVcbiAqIGlmIGl0IGhhc24ndCBiZWVuIG1hZGUgeWV0IG9yIHRoZSBsYXN0IG1ha2UgZmFpbGVkXG4gKiBAcGFyYW0geyhrZXk6IEssIHZhbHVlOiBWKSA9PiBQcm9taXNlPHZvaWQ+fSBbZmluaXNoVmFsdWVdIHJ1bnMgZXhhY3RseVxuICogb25jZSBhZnRlciBhIG5ldyB2YWx1ZSBpcyBhZGRlZCB0byB0aGUgc3RvcmVcbiAqIEByZXR1cm5zIHtQcm9taXNlPFY+fVxuICovXG5jb25zdCBwcm92aWRlQXN5bmM9KGtleSxtYWtlVmFsdWUsZmluaXNoVmFsdWUpPT57XG5pZihzdG9yZS5oYXMoa2V5KSl7XG5yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHN0b3JlLmdldChrZXkpKTtcbiB9XG5pZighcGVuZGluZy5oYXMoa2V5KSl7XG5jb25zdCB2YWxQPW1ha2VWYWx1ZShrZXkpLlxudGhlbigodik9PntcbnN0b3JlLmluaXQoa2V5LHYpO1xucmV0dXJuIHY7XG4gfSkuXG50aGVuKCh2KT0+e1xuaWYoZmluaXNoVmFsdWUpe1xucmV0dXJuIGZpbmlzaFZhbHVlKGtleSx2KS50aGVuKCgpPT52KTtcbiB9XG5yZXR1cm4gdjtcbiB9KS5cbmZpbmFsbHkoKCk9PntcbnBlbmRpbmcuZGVsZXRlKGtleSk7XG4gfSk7XG5wZW5kaW5nLnNldChrZXksdmFsUCk7XG4gfVxuY29uc3QgdmFsUD1wZW5kaW5nLmdldChrZXkpO1xuYXNzZXJ0KHZhbFApO1xucmV0dXJuIHZhbFA7XG4gfTtcblxucmV0dXJuIGhhcmRlbih7cHJvdmlkZUFzeW5jfSk7XG4gfTskaOKAjV9vbmNlLm1ha2VBdG9taWNQcm92aWRlcihtYWtlQXRvbWljUHJvdmlkZXIpO1xuaGFyZGVuKG1ha2VBdG9taWNQcm92aWRlcik7XG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAdGVtcGxhdGUgVlxuICogQHR5cGVkZWYge1JldHVyblR5cGU8dHlwZW9mIG1ha2VBdG9taWNQcm92aWRlcjxLLCBWPj59IEF0b21pY1Byb3ZpZGVyPEssIFY+XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgSywgVlxuICogQHBhcmFtIHtNYXBTdG9yZTxLLCBWW10+fSBtYXBTdG9yZVxuICogQHBhcmFtIHtLfSBrZXlcbiAqIEBwYXJhbSB7Vn0gaXRlbVxuICovXG5jb25zdCAgICAgICAgYXBwZW5kVG9TdG9yZWRBcnJheT0obWFwU3RvcmUsa2V5LGl0ZW0pPT57XG5pZihtYXBTdG9yZS5oYXMoa2V5KSl7XG5jb25zdCBleHRhbnQ9bWFwU3RvcmUuZ2V0KGtleSk7XG5tYXBTdG9yZS5zZXQoa2V5LGhhcmRlbihbLi4uZXh0YW50LGl0ZW1dKSk7XG4gfWVsc2V7XG5tYXBTdG9yZS5pbml0KGtleSxoYXJkZW4oW2l0ZW1dKSk7XG4gfVxuIH07JGjigI1fb25jZS5hcHBlbmRUb1N0b3JlZEFycmF5KGFwcGVuZFRvU3RvcmVkQXJyYXkpO1xuaGFyZGVuKGFwcGVuZFRvU3RvcmVkQXJyYXkpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VDdXJyZW50S2V5c0tpdCI6WyJtYWtlQ3VycmVudEtleXNLaXQiXSwicHJvdmlkZUxhenkiOlsicHJvdmlkZUxhenkiXSwibWFrZUF0b21pY1Byb3ZpZGVyIjpbIm1ha2VBdG9taWNQcm92aWRlciJdLCJhcHBlbmRUb1N0b3JlZEFycmF5IjpbImFwcGVuZFRvU3RvcmVkQXJyYXkiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAPLwroQCFAAAAhQAAIQAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuUGFzc1N0eWxlfSBQYXNzU3R5bGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNvcHlUYWdnZWR9IENvcHlUYWdnZWQgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNvcHlSZWNvcmQ8VD59IENvcHlSZWNvcmQgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNvcHlBcnJheTxUPn0gQ29weUFycmF5ICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5DaGVja2VyfSBDaGVja2VyICovXG5cbi8qKlxuICogQHR5cGVkZWYge1Bhc3NhYmxlfSBLZXlcbiAqXG4gKiBLZXlzIGFyZSBQYXNzYWJsZSBhcmJpdHJhcmlseS1uZXN0ZWQgcGFzcy1ieS1jb3B5IGNvbnRhaW5lcnNcbiAqIChDb3B5QXJyYXksIENvcHlSZWNvcmQsIENvcHlTZXQsIENvcHlCYWcsIENvcHlNYXApIGluIHdoaWNoIGV2ZXJ5XG4gKiBub24tY29udGFpbmVyIGxlYWYgaXMgZWl0aGVyIGEgUGFzc2FibGUgcHJpbWl0aXZlIHZhbHVlIG9yIGEgUmVtb3RhYmxlIChhXG4gKiByZW1vdGVseS1hY2Nlc3NpYmxlIG9iamVjdCBvciBwcmVzZW5jZSBmb3IgYSByZW1vdGUgb2JqZWN0KSwgb3Igc3VjaCBsZWF2ZXNcbiAqIGluIGlzb2xhdGlvbiB3aXRoIG5vIGNvbnRhaW5lci5cbiAqXG4gKiBLZXlzIGFyZSBzbyBuYW1lZCBiZWNhdXNlIHRoZXkgY2FuIGJlIHVzZWQgYXMga2V5cyBpbiBDb3B5TWFwcyBhbmRcbiAqIFthZ29yaWMtc2RrIFN0b3Jlc10oaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2Jsb2IvbWFzdGVyL3BhY2thZ2VzL3N0b3JlL2RvY3Mvc3RvcmUtdGF4b25vbXkubWQpLFxuICogYW5kIGFzIGVsZW1lbnRzIGluIENvcHlTZXRzIGFuZCBDb3B5QmFncy5cbiAqXG4gKiBLZXlzIGNhbm5vdCBjb250YWluIHByb21pc2VzIG9yIGVycm9ycywgYXMgdGhlc2UgZG8gbm90IGhhdmUgdXNlZnVsXG4gKiBkaXN0cmlidXRlZCBlcXVhbGl0eSBzZW1hbnRpY3MuIEtleXMgYWxzbyBjYW5ub3QgY29udGFpbiBhbnkgQ29weVRhZ2dlZFxuICogZXhjZXB0IGZvciB0aG9zZSByZWNvZ25pemVkIGFzIENvcHlTZXRzLCBDb3B5QmFncywgYW5kIENvcHlNYXBzLlxuICpcbiAqIEJlIGF3YXJlIHRoYXQgd2UgbWF5IHJlY29nbml6ZSBtb3JlIENvcHlUYWdnZWRzIG92ZXIgdGltZSwgaW5jbHVkaW5nXG4gKiBDb3B5VGFnZ2VkcyByZWNvZ25pemVkIGFzIEtleXMuXG4gKlxuICogRGlzdHJpYnV0ZWQgZXF1YWxpdHkgaXMgbG9jYXRpb24gaW5kZXBlbmRlbnQuXG4gKiBUaGUgc2FtZSB0d28gS2V5cywgcGFzc2VkIHRvIGFub3RoZXIgbG9jYXRpb24sIHdpbGwgYmUgYGtleUVRYCB0aGVyZSBpZmZcbiAqIHRoZXkgYXJlIGBrZXlFUWAgaGVyZS4gKGBrZXlFUWAgdGVzdHMgZXF1YWxpdHkgYWNjb3JkaW5nIHRvIHRoZVxuICoga2V5IGRpc3RyaWJ1dGVkIGVxdWFsaXR5IHNlbWFudGljcy4pXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UGFzc2FibGV9IFBhdHRlcm5cbiAqXG4gKiBQYXR0ZXJucyBhcmUgUGFzc2FibGUgYXJiaXRyYXJpbHktbmVzdGVkIHBhc3MtYnktY29weSBjb250YWluZXJzXG4gKiAoQ29weUFycmF5LCBDb3B5UmVjb3JkLCBDb3B5U2V0LCBDb3B5QmFnLCBDb3B5TWFwKSBpbiB3aGljaCBldmVyeVxuICogbm9uLWNvbnRhaW5lciBsZWFmIGlzIGVpdGhlciBhIEtleSBvciBhIE1hdGNoZXIsIG9yIHN1Y2ggbGVhdmVzIGluIGlzb2xhdGlvblxuICogd2l0aCBubyBjb250YWluZXIuXG4gKlxuICogQSBQYXR0ZXJuIGFjdHMgYXMgYSBkZWNsYXJhdGl2ZSB0b3RhbCBwcmVkaWNhdGUgb3ZlciBQYXNzYWJsZXMsIHdoZXJlIGVhY2hcbiAqIFBhc3NhYmxlIGlzIGVpdGhlciBtYXRjaGVkIG9yIG5vdCBtYXRjaGVkIGJ5IGl0LiBFdmVyeSBLZXkgaXMgYWxzbyBhIFBhdHRlcm5cbiAqIHRoYXQgbWF0Y2hlcyBvbmx5IFwiaXRzZWxmXCIsIGkuZS4sIEtleXMgdGhhdCBhcmUgYGtleUVRYCB0byBpdCBhY2NvcmRpbmcgdG9cbiAqIHRoZSBrZXkgZGlzdHJpYnV0ZWQgZXF1YWxpdHkgc2VtYW50aWNzLlxuICpcbiAqIFBhdHRlcm5zIGNhbm5vdCBjb250YWluIHByb21pc2VzIG9yIGVycm9ycywgYXMgdGhlc2UgZG9cbiAqIG5vdCBoYXZlIHVzZWZ1bCBkaXN0cmlidXRlZCBlcXVhbGl0eSBvciBtYXRjaGluZyBzZW1hbnRpY3MuIExpa2V3aXNlLFxuICogbm8gUGF0dGVybiBjYW4gZGlzdGluZ3Vpc2ggYW1vbmcgcHJvbWlzZXMsIG9yIGRpc3Rpbmd1aXNoIGFtb25nIGVycm9ycy5cbiAqIFBhdHRlcm5zIGFsc28gY2Fubm90IGNvbnRhaW4gYW55IENvcHlUYWdnZWRzIGV4Y2VwdCBmb3IgdGhvc2UgcmVjb2duaXplZCBhc1xuICogQ29weVNldHMsIENvcHlCYWdzLCBDb3B5TWFwcywgb3IgTWF0Y2hlcnMuXG4gKlxuICogQmUgYXdhcmUgdGhhdCB3ZSBtYXkgcmVjb2duaXplIG1vcmUgQ29weVRhZ2dlZHMgb3ZlciB0aW1lLCBpbmNsdWRpbmdcbiAqIENvcHlUYWdnZWRzIHJlY29nbml6ZWQgYXMgUGF0dGVybnMuXG4gKlxuICogV2hldGhlciBhIFBhc3NhYmxlIGlzIG1hdGNoZWQgYnkgYSBnaXZlbiBQYXR0ZXJuIGlzIGxvY2F0aW9uIGluZGVwZW5kZW50LlxuICogSWYgYSBnaXZlbiBQYXNzYWJsZSBhbmQgUGF0dGVybiBhcmUgcGFzc2VkIHRvIGFub3RoZXIgbG9jYXRpb24sXG4gKiB0aGUgUGFzc2FibGUgd2lsbCBiZSBtYXRjaGVkIGJ5IHRoZSBQYXR0ZXJuIHRoZXJlIGlmZiB0aGUgUGFzc2FibGUgaXMgbWF0Y2hlZFxuICogYnkgdGhlIFBhdHRlcm4gaGVyZS5cbiAqXG4gKiBQYXR0ZXJucyBhcmUgb2Z0ZW4gdXNlZCBpbiBhIHR5cGUtbGlrZSBtYW5uZXIsIHRvIHJlcHJlc2VudCB0aGUgY2F0ZWdvcnlcbiAqIG9mIFBhc3NhYmxlcyB0aGF0IHRoZSBQYXR0ZXJuIGlzIGludGVuZGVkKiB0byBtYXRjaC4gVG8ga2VlcCB0aGlzXG4gKiBkaXN0aW5jdGlvbiBjbGVhciwgd2Ugb2Z0ZW4gdXNlIHRoZSBzdWZmaXggXCJTaGFwZVwiIHJhdGhlciB0aGFuIFwiUGF0dGVyblwiXG4gKiB0byBhdm9pZCBjb25mdXNpb24gd2hlbiB0aGUgUGF0dGVybiBpdHNlbGYgcmVwcmVzZW50c1xuICogc29tZSBjYXRlZ29yeSBvZiBQYXR0ZXJuLiBGb3IgZXhhbXBsZSwgYW4gXCJBbW91bnRTaGFwZVwiIHJlcHJlc2VudHMgdGhlXG4gKiBjYXRlZ29yeSBvZiBBbW91bnRzLiBBbmQgXCJBbW91bnRQYXR0ZXJuU2hhcGVcIiByZXByZXNlbnRzIHRoZVxuICogY2F0ZWdvcnkgb2YgUGF0dGVybnMgb3ZlciBBbW91bnRzLlxuICpcbiAqICogV2Ugc2F5IFwiaW50ZW5kZWRcIiBhYm92ZSBiZWNhdXNlIFBhdHRlcm5zLCBpbiBvcmRlciB0byBiZSBkZWNsYXJhdGl2ZVxuICogYW5kIFBhc3NhYmxlLCBjYW5ub3QgaGF2ZSB0aGUgZ2VuZXJhbGl0eSBvZiBwcmVkaWNhdGVzIHdyaXR0ZW4gaW4gYVxuICogVHVyaW5nLXVuaXZlcnNhbCBwcm9ncmFtbWluZyBsYW5ndWFnZS4gUmF0aGVyLCB0byByZXByZXNlbnQgdGhlIGNhdGVnb3J5IG9mXG4gKiB0aGluZ3MgaW50ZW5kZWQgdG8gYmUgYSBGb28sIGEgRm9vU2hhcGUgc2hvdWxkIHJlbGlhYmx5XG4gKiBhY2NlcHQgYWxsIEZvb3MgYW5kIHJlamVjdCBvbmx5IG5vbi1Gb29zLiBIb3dldmVyLCBhIEZvb1NoYXBlIG1heSBhbHNvIGFjY2VwdFxuICogbm9uLUZvb3MgdGhhdCBcImxvb2sgbGlrZVwiIG9yIFwiaGF2ZSB0aGUgc2FtZSBzaGFwZSBhc1wiIGdlbnVpbmUgRm9vcy5cbiAqIEFuIGFjY3VyYXRlIHByZWRpY2F0ZSBmb3IgZS5nLiBpbnB1dCB2YWxpZGF0aW9uIHdvdWxkIG5lZWQgdG8gc3VwcGxlbWVudCB0aGVcbiAqIFBhdHRlcm4gY2hlY2sgd2l0aCBjb2RlIHRvIGRldGVjdCB0aGUgcmVzaWR1YWwgY2FzZXMuXG4gKiBXZSBob3BlIHRoZSBcIlNoYXBlXCIgbWV0YXBob3IgaGVscHMgcmVtaW5kIHVzIG9mIHRoaXMgdHlwZS1saWtlIGltcHJlY2lzaW9uXG4gKiBvZiBQYXR0ZXJucy5cbiAqL1xuXG4vKiBUT0RPIHBhcmFtZXRlcml6ZSBDb3B5VGFnZ2VkIHRvIHN1cHBvcnQgdGhlc2UgcmVmaW5lbWVudHMqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdHlwZWRlZiB7Q29weVRhZ2dlZCAmIHtcbiAqICAgW1N5bWJvbC50b1N0cmluZ1RhZ106ICdjb3B5U2V0JyxcbiAqICAgcGF5bG9hZDogQXJyYXk8Sz4sXG4gKiB9fSBDb3B5U2V0XG4gKlxuICogQSBQYXNzYWJsZSBjb2xsZWN0aW9uIG9mIEtleXMgdGhhdCBhcmUgYWxsIG11dHVhbGx5IGRpc3Rpbmd1aXNoYWJsZVxuICogYWNjb3JkaW5nIHRvIHRoZSBrZXkgZGlzdHJpYnV0ZWQgZXF1YWxpdHkgc2VtYW50aWNzIGV4cG9zZWQgYnkgYGtleUVRYC5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdHlwZWRlZiB7Q29weVRhZ2dlZCAmIHtcbiAqICAgW1N5bWJvbC50b1N0cmluZ1RhZ106ICdjb3B5QmFnJyxcbiAqICAgcGF5bG9hZDogQXJyYXk8W0ssIGJpZ2ludF0+LFxuICogfX0gQ29weUJhZ1xuICpcbiAqIEEgUGFzc2FibGUgY29sbGVjdGlvbiBvZiBlbnRyaWVzIHdpdGggS2V5cyB0aGF0IGFyZSBhbGwgbXV0dWFsbHkgZGlzdGluZ3Vpc2hhYmxlXG4gKiBhY2NvcmRpbmcgdG8gdGhlIGtleSBkaXN0cmlidXRlZCBlcXVhbGl0eSBzZW1hbnRpY3MgZXhwb3NlZCBieSBga2V5RVFgLFxuICogZWFjaCB3aXRoIGEgY29ycmVzcG9uZGluZyBwb3NpdGl2ZSBjYXJkaW5hbGl0eS5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAdHlwZWRlZiB7Q29weVRhZ2dlZCAmIHtcbiAqICAgW1N5bWJvbC50b1N0cmluZ1RhZ106ICdjb3B5TWFwJyxcbiAqICAgcGF5bG9hZDogeyBrZXlzOiBBcnJheTxLPiwgdmFsdWVzOiBBcnJheTxWPiB9LFxuICogfX0gQ29weU1hcFxuICpcbiAqIEEgUGFzc2FibGUgY29sbGVjdGlvbiBvZiBlbnRyaWVzIHdpdGggS2V5cyB0aGF0IGFyZSBhbGwgbXV0dWFsbHkgZGlzdGluZ3Vpc2hhYmxlXG4gKiBhY2NvcmRpbmcgdG8gdGhlIGtleSBkaXN0cmlidXRlZCBlcXVhbGl0eSBzZW1hbnRpY3MgZXhwb3NlZCBieSBga2V5RVFgLFxuICogZWFjaCB3aXRoIGEgY29ycmVzcG9uZGluZyBQYXNzYWJsZSB2YWx1ZS5cbiAqL1xuXG4vKiBUT0RPOiBlbnVtZXJhdGUgTWF0Y2hlciB0YWcgdmFsdWVzPyovXG4vKipcbiAqIEB0eXBlZGVmIHtDb3B5VGFnZ2VkICYge1xuICogICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogYG1hdGNoOiR7c3RyaW5nfWAsXG4gKiB9fSBNYXRjaGVyXG4gKlxuICogQSBQYXR0ZXJuIHJlcHJlc2VudGluZyB0aGUgcHJlZGljYXRlIGNoYXJhY3Rlcml6aW5nIGEgY2F0ZWdvcnkgb2YgUGFzc2FibGVzLFxuICogc3VjaCBhcyBzdHJpbmdzIG9yIDgtYml0IHVuc2lnbmVkIGludGVnZXIgbnVtYmVycyBvciBDb3B5QXJyYXlzIG9mIFJlbW90YWJsZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yZU9wdGlvbnNcbiAqIE9mIHRoZSBkaW1lbnNpb25zIG9uIHdoaWNoIEtleWVkU3RvcmVzIGNhbiBkaWZmZXIsIHdlIG9ubHkgcmVwcmVzZW50IGEgZmV3XG4gKiBvZiB0aGVtIGFzIHN0YW5kYXJkIG9wdGlvbnMuIEEgZ2l2ZW4gc3RvcmUgbWFrZXIgc2hvdWxkIGRvY3VtZW50IHdoaWNoXG4gKiBvcHRpb25zIGl0IHN1cHBvcnRzLCBhcyB3ZWxsIGFzIGl0cyBwb3NpdGlvbnMgb24gZGltZW5zaW9ucyBmb3Igd2hpY2ggaXRcbiAqIGRvZXMgbm90IHN1cHBvcnQgb3B0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2xvbmdMaXZlZD10cnVlXSBXaGljaCB3YXkgdG8gb3B0aW1pemUgYSB3ZWFrIHN0b3JlLiBUcnVlIG1lYW5zXG4gKiB0aGF0IHdlIGV4cGVjdCB0aGlzIHdlYWsgc3RvcmUgdG8gb3V0bGl2ZSBtb3N0IG9mIGl0cyBrZXlzLCBpbiB3aGljaFxuICogY2FzZSB3ZSBpbnRlcm5hbGx5IG1heSB1c2UgYSBKYXZhU2NyaXB0IGBXZWFrTWFwYC4gT3RoZXJ3aXNlIHdlIGludGVybmFsbHlcbiAqIG1heSB1c2UgYSBKYXZhU2NyaXB0IGBNYXBgLlxuICogRGVmYXVsdHMgdG8gdHJ1ZSwgc28gcGxlYXNlIG1hcmsgc2hvcnQgbGl2ZWQgc3RvcmVzIGV4cGxpY2l0bHkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtkdXJhYmxlPWZhbHNlXSAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgc3RvcmUgc3Vydml2ZSB0ZXJtaW5hdGlvblxuICogICBvZiBpdHMgY29udGFpbmluZyBwcm9jZXNzLCBhbGxvd2luZyBmb3IgcmVzdGFydCBvciB1cGdyYWRlIGJ1dCBhdCB0aGUgY29zdFxuICogICBvZiBmb3JiaWRkaW5nIHN0b3JhZ2Ugb2YgcmVmZXJlbmNlcyB0byBlcGhlbWVyYWwgZGF0YS4gIERlZmF1bHRzIHRvIGZhbHNlLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZmFrZUR1cmFibGU9ZmFsc2VdICBUaGlzIHN0b3JlIHByZXRlbmRzIHRvIGJlIGEgZHVyYWJsZSBzdG9yZVxuICogICBidXQgZG9lcyBub3QgZW5mb3JjZSB0aGF0IHRoZSB0aGluZ3Mgc3RvcmVkIGluIGl0IGFjdHVhbGx5IGJlIHRoZW1zZWx2ZXNcbiAqICAgZHVyYWJsZSAod2hlcmVhcyBhbiBhY3R1YWwgZHVyYWJsZSBzdG9yZSB3b3VsZCBmb3JiaWQgc3RvcmFnZSBvZiBzdWNoXG4gKiAgIGl0ZW1zKS4gIFRoaXMgaXMgaW4gc2VydmljZSBvZiBhbGxvd2luZyBpbmNyZW1lbnRhbCB0cmFuc2l0aW9uIHRvIHVzZSBvZlxuICogICBkdXJhYmxlIHN0b3JlcywgdG8gZW5hYmxlIG5vcm1hbCBvcGVyYXRpb24gYW5kIHRlc3Rpbmcgd2hlbiBzb21lIHN0dWZmXG4gKiAgIGludGVuZGVkIHRvIGV2ZW50dWFsbHkgYmUgZHVyYWJsZSBoYXMgbm90IHlldCBiZWVuIG1hZGUgZHVyYWJsZS4gIEEgc3RvcmVcbiAqICAgbWFya2VkIGFzIGZha2VEdXJhYmxlIHdpbGwgYXBwZWFyIHRvIG9wZXJhdGUgbm9ybWFsbHkgYnV0IGFueSBhdHRlbXB0IHRvXG4gKiAgIHVwZ3JhZGUgaXRzIGNvbnRhaW5pbmcgdmF0IHdpbGwgZmFpbCB3aXRoIGFuIGVycm9yLlxuICogQHByb3BlcnR5IHtQYXR0ZXJufSBba2V5U2hhcGVdXG4gKiBAcHJvcGVydHkge1BhdHRlcm59IFt2YWx1ZVNoYXBlXVxuICovXG5cbi8qKlxuICogTW9zdCBzdG9yZSBtZXRob2RzIGFyZSBpbiBvbmUgb2YgdGhyZWUgY2F0ZWdvcmllc1xuICogICAqIGxvb2t1cCBtZXRob2RzIChgaGFzYCxgZ2V0YClcbiAqICAgKiB1cGRhdGUgbWV0aG9kcyAoYGFkZGAsYGluaXRgLGBzZXRgLGBkZWxldGVgLGBhZGRBbGxgKVxuICogICAqIHF1ZXJ5IG1ldGhvZHMgKGBzbmFwc2hvdGAsYGtleXNgLGB2YWx1ZXNgLGBlbnRyaWVzYCxgZ2V0U2l6ZWApXG4gKiAgICogcXVlcnktdXBkYXRlIG1ldGhvZHMgKGBjbGVhcmApXG4gKlxuICogV2Vha1N0b3JlcyBoYXZlIHRoZSBsb29rdXAgYW5kIHVwZGF0ZSBtZXRob2RzIGJ1dCBub3QgdGhlIHF1ZXJ5XG4gKiBvciBxdWVyeS11cGRhdGUgbWV0aG9kcy5cbiAqIE5vbi13ZWFrIFN0b3JlcyBhcmUgbGlrZSB0aGVpciBjb3JyZXNwb25kaW5nIFdlYWtTdG9yZXMsIGJ1dCB3aXRoIHRoZVxuICogYWRkaXRpb25hbCBxdWVyeSBhbmQgcXVlcnktdXBkYXRlIG1ldGhvZHMuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleSAmIG9iamVjdH0gS1xuICogQHR5cGVkZWYge29iamVjdH0gV2Vha1NldFN0b3JlXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IGJvb2xlYW59IGhhc1xuICogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwgdGhvdWdoIHRoZVxuICogYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoaXMgc3RvcmUuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IHZvaWR9IGFkZFxuICogQWRkIHRoZSBrZXkgdG8gdGhlIHNldCBpZiBpdCBpcyBub3QgYWxyZWFkeSB0aGVyZS4gRG8gbm90aGluZyBzaWxlbnRseSBpZlxuICogYWxyZWFkeSB0aGVyZS5cbiAqIFRoZSBrZXkgbXVzdCBiZSBvbmUgYWxsb3dlZCBieSB0aGlzIHN0b3JlLiBGb3IgZXhhbXBsZSBhIHNjYWxhciBzdG9yZSBvbmx5XG4gKiBhbGxvd3MgcHJpbWl0aXZlcyBhbmQgcmVtb3RhYmxlcy5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gZGVsZXRlXG4gKiBSZW1vdmUgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleXM6IENvcHlTZXQ8Sz4gfCBJdGVyYWJsZTxLPikgPT4gdm9pZH0gYWRkQWxsXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHR5cGVkZWYge29iamVjdH0gU2V0U3RvcmVcbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gYm9vbGVhbn0gaGFzXG4gKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCB0aG91Z2ggdGhlXG4gKiBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhpcyBzdG9yZS5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gYWRkXG4gKiBBZGQgdGhlIGtleSB0byB0aGUgc2V0IGlmIGl0IGlzIG5vdCBhbHJlYWR5IHRoZXJlLiBEbyBub3RoaW5nIHNpbGVudGx5IGlmXG4gKiBhbHJlYWR5IHRoZXJlLlxuICogVGhlIGtleSBtdXN0IGJlIG9uZSBhbGxvd2VkIGJ5IHRoaXMgc3RvcmUuIEZvciBleGFtcGxlIGEgc2NhbGFyIHN0b3JlIG9ubHlcbiAqIGFsbG93cyBwcmltaXRpdmVzIGFuZCByZW1vdGFibGVzLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiB2b2lkfSBkZWxldGVcbiAqIFJlbW92ZSB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5czogQ29weVNldDxLPiB8IEl0ZXJhYmxlPEs+KSA9PiB2b2lkfSBhZGRBbGxcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuKSA9PiBJdGVyYWJsZTxLPn0ga2V5c1xuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4pID0+IEl0ZXJhYmxlPEs+fSB2YWx1ZXNcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuKSA9PiBDb3B5U2V0PEs+fSBzbmFwc2hvdFxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4pID0+IG51bWJlcn0gZ2V0U2l6ZVxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4pID0+IHZvaWR9IGNsZWFyXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleSAmIG9iamVjdH0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHR5cGVkZWYge29iamVjdH0gV2Vha01hcFN0b3JlXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IGJvb2xlYW59IGhhc1xuICogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwgdGhvdWdoIHRoZVxuICogYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoaXMgc3RvcmUuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IFZ9IGdldFxuICogUmV0dXJuIGEgdmFsdWUgZm9yIHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEssIHZhbHVlOiBWKSA9PiB2b2lkfSBpbml0XG4gKiBJbml0aWFsaXplIHRoZSBrZXkgb25seSBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QuXG4gKiBUaGUga2V5IG11c3QgYmUgb25lIGFsbG93ZWQgYnkgdGhpcyBzdG9yZS4gRm9yIGV4YW1wbGUgYSBzY2FsYXIgc3RvcmUgb25seVxuICogYWxsb3dzIHByaW1pdGl2ZXMgYW5kIHJlbW90YWJsZXMuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEssIHZhbHVlOiBWKSA9PiB2b2lkfSBzZXRcbiAqIFNldCB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiB2b2lkfSBkZWxldGVcbiAqIFJlbW92ZSB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoZW50cmllczogQ29weU1hcDxLLFY+IHwgSXRlcmFibGU8W0ssVl0+KSA9PiB2b2lkfSBhZGRBbGxcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNYXBTdG9yZVxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBib29sZWFufSBoYXNcbiAqIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsIHRob3VnaCB0aGVcbiAqIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGlzIG1hcFxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBWfSBnZXRcbiAqIFJldHVybiBhIHZhbHVlIGZvciB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gaW5pdFxuICogSW5pdGlhbGl6ZSB0aGUga2V5IG9ubHkgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LlxuICogVGhlIGtleSBtdXN0IGJlIG9uZSBhbGxvd2VkIGJ5IHRoaXMgc3RvcmUuIEZvciBleGFtcGxlIGEgc2NhbGFyIHN0b3JlIG9ubHlcbiAqIGFsbG93cyBwcmltaXRpdmVzIGFuZCByZW1vdGFibGVzLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gc2V0XG4gKiBTZXQgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gZGVsZXRlXG4gKiBSZW1vdmUgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGVudHJpZXM6IENvcHlNYXA8SyxWPiB8IEl0ZXJhYmxlPFtLLFZdPikgPT4gdm9pZH0gYWRkQWxsXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybiwgdmFsdWVQYXR0PzogUGF0dGVybikgPT4gSXRlcmFibGU8Sz59IGtleXNcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLCB2YWx1ZVBhdHQ/OiBQYXR0ZXJuKSA9PiBJdGVyYWJsZTxWPn0gdmFsdWVzXG4gKiBAcHJvcGVydHkgeyhcbiAqICAga2V5UGF0dD86IFBhdHRlcm4sXG4gKiAgIHZhbHVlUGF0dD86IFBhdHRlcm5cbiAqICkgPT4gSXRlcmFibGU8W0ssVl0+fSBlbnRyaWVzXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybiwgdmFsdWVQYXR0PzogUGF0dGVybikgPT4gQ29weU1hcDxLLFY+fSBzbmFwc2hvdFxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4sIHZhbHVlUGF0dD86IFBhdHRlcm4pID0+IG51bWJlcn0gZ2V0U2l6ZVxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4sIHZhbHVlUGF0dD86IFBhdHRlcm4pID0+IHZvaWR9IGNsZWFyXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBEZXByZWNhdGVkIExlZ2FjeSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEB0eXBlZGVmIHtvYmplY3R9IExlZ2FjeVdlYWtNYXBcbiAqIExlZ2FjeVdlYWtNYXAgaXMgZGVwcmVjYXRlZC4gVXNlIFdlYWtNYXBTdG9yZSBpbnN0ZWFkIGlmIHBvc3NpYmxlLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBib29sZWFufSBoYXNcbiAqIENoZWNrIGlmIGEga2V5IGV4aXN0c1xuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBWfSBnZXRcbiAqIFJldHVybiBhIHZhbHVlIGZvciB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gaW5pdFxuICogSW5pdGlhbGl6ZSB0aGUga2V5IG9ubHkgaWYgaXRcbiAqIGRvZXNuJ3QgYWxyZWFkeSBleGlzdFxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gc2V0XG4gKiBTZXQgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gZGVsZXRlXG4gKiBSZW1vdmUgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEB0eXBlZGVmIHtvYmplY3R9IExlZ2FjeU1hcFxuICogTGVnYWN5TWFwIGlzIGRlcHJlY2F0ZWQuIFVzZSBNYXBTdG9yZSBpbnN0ZWFkIGlmIHBvc3NpYmxlLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBib29sZWFufSBoYXNcbiAqIENoZWNrIGlmIGEga2V5IGV4aXN0c1xuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBWfSBnZXRcbiAqIFJldHVybiBhIHZhbHVlIGZvciB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gaW5pdFxuICogSW5pdGlhbGl6ZSB0aGUga2V5IG9ubHkgaWYgaXRcbiAqIGRvZXNuJ3QgYWxyZWFkeSBleGlzdFxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gc2V0XG4gKiBTZXQgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gZGVsZXRlXG4gKiBSZW1vdmUgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSXRlcmFibGU8Sz59IGtleXNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSXRlcmFibGU8Vj59IHZhbHVlc1xuICogQHByb3BlcnR5IHsoKSA9PiBJdGVyYWJsZTxbSyxWXT59IGVudHJpZXNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gbnVtYmVyfSBnZXRTaXplXG4gKiBAcHJvcGVydHkgeygpID0+IHZvaWR9IGNsZWFyXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0eXBlZGVmIHstMSB8IDAgfCAxfSBSYW5rQ29tcGFyaXNvblxuICogVGhlIHJlc3VsdCBvZiBhIGBSYW5rQ29tcGFyZWAgZnVuY3Rpb24gdGhhdCBkZWZpbmVzIGEgcmFuay1vcmRlciwgaS5lLixcbiAqIGEgdG90YWwgcHJlb3JkZXIgaW4gd2hpY2ggZGlmZmVyZW50IGVsZW1lbnRzIGFyZSBhbHdheXMgY29tcGFyYWJsZSBidXRcbiAqIGNhbiBiZSB0aWVkIGZvciB0aGUgc2FtZSByYW5rLiBTZWUgYFJhbmtDb21wYXJlYC5cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBSYW5rQ29tcGFyZVxuICogUmV0dXJucyBgLTFgLCBgMGAsIG9yIGAxYCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgcmFuayBvZiBgbGVmdGBcbiAqIGlzIGJlZm9yZSwgdGllZC13aXRoLCBvciBhZnRlciB0aGUgcmFuayBvZiBgcmlnaHRgLlxuICpcbiAqIFRoaXMgY29tcGFyaXNvbiBmdW5jdGlvbiBpcyB2YWxpZCBhcyBhcmd1bWVudCB0b1xuICogYEFycmF5LnByb3RvdHlwZS5zb3J0YC4gVGhpcyBpcyBzb21ldGltZXMgZGVzY3JpYmVkIGFzIGEgXCJ0b3RhbCBvcmRlclwiXG4gKiBidXQsIGRlcGVuZGluZyBvbiB5b3VyIGRlZmluaXRpb25zLCB0aGlzIGlzIHRlY2huaWNhbGx5IGluY29ycmVjdCBiZWNhdXNlXG4gKiBpdCBtYXkgcmV0dXJuIGAwYCB0byBpbmRpY2F0ZSB0aGF0IHR3byBkaXN0aW5ndWlzaGFibGUgZWxlbWVudHMgc3VjaCBhc1xuICogYC0wYCBhbmQgYDBgIGFyZSB0aWVkIChpLmUuLCBhcmUgaW4gdGhlIHNhbWUgZXF1aXZhbGVuY2UgY2xhc3NcbiAqIGZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBvcmRlcmluZykuIElmIGVhY2ggc3VjaCBlcXVpdmFsZW5jZSBjbGFzcyBpc1xuICogYSAqcmFuayogYW5kIHJhbmtzIGFyZSBkaXNqb2ludCwgdGhlbiB0aGlzIFwicmFuayBvcmRlclwiIGlzIGFcbiAqIHRydWUgdG90YWwgb3JkZXIgb3ZlciB0aGVzZSByYW5rcy4gSW4gbWF0aGVtYXRpY3MgdGhpcyBnb2VzIGJ5IHNldmVyYWxcbiAqIG90aGVyIG5hbWVzIHN1Y2ggYXMgXCJ0b3RhbCBwcmVvcmRlclwiLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gZXN0YWJsaXNoZXMgYSB0b3RhbCByYW5rIG9yZGVyIG92ZXIgYWxsIHBhc3NhYmxlcy5cbiAqIFRvIGRvIHNvIGl0IG1ha2VzIGFyYml0cmFyeSBjaG9pY2VzLCBzdWNoIGFzIHRoYXQgYWxsIHN0cmluZ3NcbiAqIGFyZSBhZnRlciBhbGwgbnVtYmVycy4gVGh1cywgdGhpcyBvcmRlciBpcyBub3QgaW50ZW5kZWQgdG8gYmVcbiAqIHVzZWQgZGlyZWN0bHkgYXMgYSBjb21wYXJpc29uIHdpdGggdXNlZnVsIHNlbWFudGljcy4gSG93ZXZlciwgaXQgbXVzdCBiZVxuICogY2xvc2VseSBlbm91Z2ggcmVsYXRlZCB0byBzdWNoIGNvbXBhcmlzb25zIHRvIGFpZCBpbiBpbXBsZW1lbnRpbmdcbiAqIGxvb2t1cHMgYmFzZWQgb24gdGhvc2UgY29tcGFyaXNvbnMuIEZvciBleGFtcGxlLCBpbiBvcmRlciB0byBnZXQgYSB0b3RhbFxuICogb3JkZXIgYW1vbmcgcmFua3MsIHdlIHB1dCBgTmFOYCBhZnRlciBhbGwgb3RoZXIgSmF2YVNjcmlwdCBcIm51bWJlclwiIHZhbHVlc1xuICogKGkuZS4sIElFRUUgNzU0IGZsb2F0aW5nLXBvaW50IHZhbHVlcykuIEJ1dCBvdGhlcndpc2UsIHdlIHJhbmsgSmF2YVNjcmlwdFxuICogbnVtYmVycyBieSBzaWduZWQgbWFnbml0dWRlLCB3aXRoIGAwYCBhbmQgYC0wYCB0aWVkLiBBIHNlbWFudGljYWxseSB1c2VmdWxcbiAqIG9yZGVyaW5nIHdvdWxkIGFsc28gY29tcGFyZSBtYWduaXR1ZGVzLCBhbmQgc28gYWdyZWUgd2l0aCB0aGUgcmFuayBvcmRlcmluZ1xuICogb2YgYWxsIHZhbHVlcyBvdGhlciB0aGFuIGBOYU5gLiBBbiBhcnJheSBzb3J0ZWQgYnkgcmFuayB3b3VsZCBlbmFibGUgcmFuZ2VcbiAqIHF1ZXJpZXMgYnkgbWFnbml0dWRlLlxuICogQHBhcmFtIHtQYXNzYWJsZX0gbGVmdFxuICogQHBhcmFtIHtQYXNzYWJsZX0gcmlnaHRcbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyaXNvbn1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSYW5rQ29tcGFyZX0gRnVsbENvbXBhcmVcbiAqIEEgYEZ1bGxDb21wYXJlYCBmdW5jdGlvbiBzYXRpc2ZpZXMgYWxsIHRoZSBpbnZhcmlhbnRzIHN0YXRlZCBiZWxvdyBmb3JcbiAqIGBSYW5rQ29tcGFyZWAncyByZWxhdGlvbiB3aXRoIEtleUNvbXBhcmUuXG4gKiBJbiBhZGRpdGlvbiwgaXRzIGVxdWFsaXR5IGlzIGFzIHByZWNpc2UgYXMgdGhlIGBLZXlDb21wYXJlYFxuICogY29tcGFyaXNvbiBkZWZpbmVkIGJlbG93LCBpbiB0aGF0LCBmb3IgYWxsIEtleXMgYHhgIGFuZCBgeWAsXG4gKiBgRnVsbENvbXBhcmUoeCwgeSkgPT09IDBgIGlmZiBgS2V5Q29tcGFyZSh4LCB5KSA9PT0gMGAuXG4gKlxuICogRm9yIG5vbi1LZXkgaW5wdXRzLCBhIGBGdWxsQ29tcGFyZWAgc2hvdWxkIGJlIGV4YWN0bHkgYXMgaW1wcmVjaXNlIGFzXG4gKiBgUmFua0NvbXBhcmVgLiBGb3IgZXhhbXBsZSwgYm90aCB3aWxsIHRyZWF0IGFsbCBlcnJvcnMgYXMgaW4gdGhlIHNhbWVcbiAqIGVxdWl2YWxlbmNlIGNsYXNzLiBCb3RoIHdpbGwgdHJlYXQgYWxsIHByb21pc2VzIGFzIGluIHRoZSBzYW1lXG4gKiBlcXVpdmFsZW5jZSBjbGFzcy4gQm90aCB3aWxsIG9yZGVyIHRhZ2dlZCByZWNvcmRzIHRoZSBzYW1lIHdheSwgd2hpY2ggaXNcbiAqIGFkbWl0dGVkbHkgd2VpcmQgYmVjYXVzZSBzb21lIChzdWNoIGFzIENvcHlTZXRzLCBDb3B5QmFncywgYW5kIENvcHlNYXBzKVxuICogd2lsbCBiZSBjb25zaWRlcmVkIEtleXMgd2hpbGUgb3RoZXJzIHdpbGwgYmUgY29uc2lkZXJlZCBub24tS2V5cy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJhbmtDb21wYXJhdG9yS2l0XG4gKiBAcHJvcGVydHkge1JhbmtDb21wYXJlfSBjb21wYXJhdG9yXG4gKiBAcHJvcGVydHkge1JhbmtDb21wYXJlfSBhbnRpQ29tcGFyYXRvclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRnVsbENvbXBhcmF0b3JLaXRcbiAqIEBwcm9wZXJ0eSB7RnVsbENvbXBhcmV9IGNvbXBhcmF0b3JcbiAqIEBwcm9wZXJ0eSB7RnVsbENvbXBhcmV9IGFudGlDb21wYXJhdG9yXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7LTEgfCAwIHwgMSB8IE5hTn0gS2V5Q29tcGFyaXNvblxuICogVGhlIHJlc3VsdCBvZiBhIGBLZXlDb21wYXJlYCBmdW5jdGlvbiB0aGF0IGRlZmluZXMgYSBtZWFuaW5nZnVsXG4gKiBhbmQgbWVhbmluZ2Z1bGx5IHByZWNpc2UgcGFydGlhbCBvcmRlciBvZiBLZXkgdmFsdWVzLiBTZWUgYEtleUNvbXBhcmVgLlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEtleUNvbXBhcmVcbiAqIGBjb21wYXJlS2V5c2AgaW1wbGVtZW50cyBhIHBhcnRpYWwgb3JkZXIgb3ZlciBrZXlzLiBBcyB3aXRoIHRoZVxuICogcmFuayBvcmRlcmluZyBwcm9kdWNlZCBieSBgY29tcGFyZVJhbmtgLCAtMSwgMCwgYW5kIDEgbWVhblxuICogXCJsZXNzIHRoYW5cIiwgXCJlcXVpdmFsZW50IHRvXCIsIGFuZCBcImdyZWF0ZXIgdGhhblwiIHJlc3BlY3RpdmVseS5cbiAqIE5hTiBtZWFucyBcImluY29tcGFyYWJsZVwiIC0tLSB0aGUgZmlyc3Qga2V5IGlzIG5vdCBsZXNzLCBlcXVpdmFsZW50LFxuICogb3IgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQuIEZvciBleGFtcGxlLCBzdWJzZXRzIG92ZXIgc2V0cyBpc1xuICogYSBwYXJ0aWFsIG9yZGVyLlxuICpcbiAqIEJ5IHVzaW5nIE5hTiBmb3IgXCJpbmNvbXBhcmFibGVcIiwgdGhlIG5vcm1hbCBlcXVpdmFsZW5jZSBmb3IgdXNpbmdcbiAqIHRoZSByZXR1cm4gdmFsdWUgaW4gYSBjb21wYXJpc29uIGlzIHByZXNlcnZlZC5cbiAqIGBjb21wYXJlS2V5cyhsZWZ0LCByaWdodCkgPj0gMGAgaWZmIGBsZWZ0YCBpcyBncmVhdGVyIHRoYW4gb3JcbiAqIGVxdWl2YWxlbnQgdG8gYHJpZ2h0YCBpbiB0aGUgcGFydGlhbCBvcmRlcmluZy5cbiAqXG4gKiBLZXkgb3JkZXIgKGEgcGFydGlhbCBvcmRlcikgYW5kIHJhbmsgb3JkZXIgKGEgdG90YWwgcHJlb3JkZXIpIGFyZVxuICogY28tZGVzaWduZWQgc28gdGhhdCB3ZSBzdG9yZSBQYXNzYWJsZXMgaW4gcmFuayBvcmRlciBhbmQgaW5kZXggaW50byB0aGVtXG4gKiB3aXRoIGtleXMgZm9yIGtleS1iYXNlZCBxdWVyaWVzLiBUbyBrZWVwIHRoZXNlIGRpc3RpbmN0LCB3aGVuIHNwZWFraW5nXG4gKiBpbmZvcm1hbGx5IGFib3V0IHJhbmssIHdlIHRhbGsgYWJvdXQgXCJlYXJsaWVyXCIgYW5kIFwibGF0ZXJcIi4gV2hlbiBzcGVha2luZ1xuICogaW5mb3JtYWxseSBhYm91dCBrZXlzLCB3ZSB0YWxrIGFib3V0IFwic21hbGxlclwiIGFuZCBcImJpZ2dlclwiLlxuICpcbiAqIEluIGJvdGggb3JkZXJzLCB0aGUgcmV0dXJuLTAgY2FzZSBkZWZpbmVzXG4gKiBhbiBlcXVpdmFsZW5jZSBjbGFzcywgaS5lLiwgdGhvc2UgdGhhdCBhcmUgdGllZCBmb3IgdGhlIHNhbWUgcGxhY2UgaW4gdGhlXG4gKiBvcmRlci4gVGhlIGdsb2JhbCBpbnZhcmlhbnQgdGhhdCB3ZSBuZWVkIGJldHdlZW4gdGhlIHR3byBvcmRlcnMgaXMgdGhhdCB0aGVcbiAqIGtleSBvcmRlciBlcXVpdmFsZW5jZSBjbGFzcyBpcyBhbHdheXMgYXQgbGVhc3QgYXMgcHJlY2lzZSBhcyB0aGVcbiAqIHJhbmsgb3JkZXIgZXF1aXZhbGVuY2UgY2xhc3MuIElPVywgaWYgYGNvbXBhcmVLZXlzKFgsWSkgPT09IDBgIHRoZW5cbiAqIGBjb21wYXJlUmFuayhYLFkpID09PSAwYC4gQnV0IG5vdCB2aWNlIHZlcnNhLiBGb3IgZXhhbXBsZSwgdHdvIGRpZmZlcmVudFxuICogcmVtb3RhYmxlcyBhcmUgdGhlIHNhbWUgcmFuayBidXQgaW5jb21wYXJhYmxlIGFzIGtleXMuXG4gKlxuICogQSBmdXJ0aGVyIGludmFyaWFudCBpcyBpZiBgY29tcGFyZUtleXMoWCxZKSA8IDBgIHRoZW5cbiAqIGBjb21wYXJlUmFuayhYLFkpIDwgMGAsIGkuZS4sIGlmIFggaXMgc21hbGxlciB0aGFuIFkgaW4ga2V5IG9yZGVyLCB0aGVuIFhcbiAqIG11c3QgYmUgZWFybGllciB0aGFuIFkgaW4gcmFuayBvcmRlci4gQnV0IG5vdCB2aWNlIHZlcnNhLlxuICogWCBjYW4gYmUgZXF1aXZhbGVudCB0byBvciBlYXJsaWVyIHRoYW4gWSBpbiByYW5rIG9yZGVyIGFuZCBzdGlsbCBiZVxuICogaW5jb21wYXJhYmxlIHdpdGggWSBpbiBrZXkgb3JkZXIuIEZvciBleGFtcGxlLCB0aGUgcmVjb3JkIGB7YjogMywgYTogNX1gIGlzXG4gKiBlYXJsaWVyIHRoYW4gdGhlIHJlY29yZCBge2I6IDUsIGE6IDN9YCBpbiByYW5rIG9yZGVyIGJ1dCB0aGV5IGFyZVxuICogaW5jb21wYXJhYmxlIGFzIGtleXMuIEFuZCB0d28gZGlzdGluY3QgcmVtb3RhYmxlcyBzdWNoIGFzIGBGYXIoJ1gnLCB7fSlgIGFuZFxuICogYEZhcignWScsIHt9KWAgYXJlIGVxdWl2YWxlbnQgaW4gcmFuayBvcmRlciBidXQgaW5jb21wYXJhYmxlIGFzIEtleXMuXG4gKlxuICogVGhpcyBsZXRzIHVzIHRyYW5zbGF0ZSBhIHJhbmdlIHNlYXJjaCBvdmVyIHRoZVxuICogcGFydGlhbCBrZXkgb3JkZXIgaW50byBhIHJhbmdlIHNlYXJjaCBvdmVyIHJhbmsgb3JkZXIgZm9sbG93ZWQgYnkgZmlsdGVyaW5nXG4gKiBvdXQgdGhvc2UgdGhhdCBkb24ndCBtYXRjaC4gVG8gZ2V0IHRoaXMgZWZmZWN0LCB3ZSBzdG9yZSB0aGUgZWxlbWVudHMgb2ZcbiAqIGEgc2V0IGluIGFuIGFycmF5IHNvcnRlZCBpbiByZXZlcnNlIHJhbmsgb3JkZXIsIGZyb20gbGF0ZXIgdG8gZWFybGllci5cbiAqIENvbWJpbmVkIHdpdGggb3VyIGxleGljb2dyYXBoaWMgY29tcGFyaXNvbiBvZiBhcnJheXMsIGlmIHNldCBYIGlzIGEgc3Vic2V0XG4gKiBvZiBzZXQgWSB0aGVuIHRoZSBhcnJheSByZXByZXNlbnRpbmcgc2V0IFggd2lsbCBiZSBhbiBlYXJsaWVyIHJhbmsgdGhhdCB0aGVcbiAqIGFycmF5IHJlcHJlc2VudGluZyBzZXQgWS5cbiAqXG4gKiBAcGFyYW0ge0tleX0gbGVmdFxuICogQHBhcmFtIHtLZXl9IHJpZ2h0XG4gKiBAcmV0dXJucyB7S2V5Q29tcGFyaXNvbn1cbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8gU2hvdWxkIGJlIGludGVybmFsIG9ubHkgdHlwZXMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHR5cGVkZWYge1tzdHJpbmcsIHN0cmluZ119IFJhbmtDb3ZlclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1tudW1iZXIsIG51bWJlcl19IEluZGV4Q292ZXJcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRQYXNzU3R5bGVDb3ZlclxuICogQXNzb2NpYXRlIHdpdGggZWFjaCBwYXNzU3R5bGUgYSBSYW5rQ292ZXIgdGhhdCBtYXkgYmUgYW4gb3ZlcmVzdGltYXRlLFxuICogYW5kIHdob3NlIHJlc3VsdHMgdGhlcmVmb3JlIG5lZWQgdG8gYmUgZmlsdGVyZWQgZG93bi4gRm9yIGV4YW1wbGUsIGJlY2F1c2VcbiAqIHRoZXJlIGlzIG5vdCBhIHNtYWxsZXN0IG9yIGJpZ2dlc3QgYmlnaW50LCBib3VuZCBpdCBieSBgTmFOYCAodGhlIGxhc3QgcGxhY2VcbiAqIG51bWJlcikgYW5kIGAnJ2AgKHRoZSBlbXB0eSBzdHJpbmcsIHdoaWNoIGlzIHRoZSBmaXJzdCBwbGFjZSBzdHJpbmcpLiBUaHVzLFxuICogYSByYW5nZSBxdWVyeSB1c2luZyB0aGlzIHJhbmdlIG1heSBpbmNsdWRlIHRoZXNlIHZhbHVlcywgd2hpY2ggd291bGQgdGhlblxuICogbmVlZCB0byBiZSBmaWx0ZXJlZCBvdXQuXG4gKiBAcGFyYW0ge1Bhc3NTdHlsZX0gcGFzc1N0eWxlXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldEluZGV4Q292ZXJcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc29ydGVkXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gcmFua0NvdmVyXG4gKiBAcmV0dXJucyB7SW5kZXhDb3Zlcn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBDb3ZlcmVkRW50cmllc1xuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7SW5kZXhDb3Zlcn0gaW5kZXhDb3ZlclxuICogQHJldHVybnMge0l0ZXJhYmxlPFtudW1iZXIsIFBhc3NhYmxlXT59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQ2hlY2tQYXR0ZXJuXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBhbGxlZ2VkUGF0dGVyblxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgS2V5VG9EQktleVxuICogSWYgdGhpcyBrZXkgY2FuIGJlIGVuY29kZWQgYXMgYSBEQktleSBzdHJpbmcgd2hpY2ggc29ydHMgY29ycmVjdGx5LFxuICogcmV0dXJuIHRoYXQgc3RyaW5nLiBFbHNlIHJldHVybiBgdW5kZWZpbmVkYC4gRm9yIGV4YW1wbGUsIGEgc2NhbGFyLW9ubHlcbiAqIGVuY29kZVBhc3NhYmxlIHdvdWxkIHJldHVybiBgdW5kZWZpbmVkYCBmb3IgYWxsIG5vbi1zY2FsYXIga2V5cy5cbiAqIEBwYXJhbSB7UGFzc2FibGV9IGtleVxuICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRSYW5rQ292ZXJcbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dGVyblxuICogQHBhcmFtIHtLZXlUb0RCS2V5fSBlbmNvZGVQYXNzYWJsZVxuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFsbExpbWl0c1xuICogQHByb3BlcnR5IHtudW1iZXJ9IGRlY2ltYWxEaWdpdHNMaW1pdFxuICogQHByb3BlcnR5IHtudW1iZXJ9IHN0cmluZ0xlbmd0aExpbWl0XG4gKiBAcHJvcGVydHkge251bWJlcn0gc3ltYm9sTmFtZUxlbmd0aExpbWl0XG4gKiBAcHJvcGVydHkge251bWJlcn0gbnVtUHJvcGVydGllc0xpbWl0XG4gKiBAcHJvcGVydHkge251bWJlcn0gcHJvcGVydHlOYW1lTGVuZ3RoTGltaXRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBhcnJheUxlbmd0aExpbWl0XG4gKiBAcHJvcGVydHkge251bWJlcn0gbnVtU2V0RWxlbWVudHNMaW1pdFxuICogQHByb3BlcnR5IHtudW1iZXJ9IG51bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBudW1NYXBFbnRyaWVzTGltaXRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtQYXJ0aWFsPEFsbExpbWl0cz59IExpbWl0c1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUGF0dGVybk1hdGNoZXJzXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBNYXRjaGVyfSBhbnlcbiAqIE1hdGNoZXMgYW55IFBhc3NhYmxlLlxuICpcbiAqIEBwcm9wZXJ0eSB7KC4uLnN1YlBhdHRzOiBQYXR0ZXJuW10pID0+IE1hdGNoZXJ9IGFuZFxuICogTWF0Y2hlcyBhZ2FpbnN0IHRoZSBpbnRlcnNlY3Rpb24gb2YgYWxsIHN1Yi1QYXR0ZXJucy5cbiAqXG4gKiBAcHJvcGVydHkgeyguLi5zdWJQYXR0czogUGF0dGVybltdKSA9PiBNYXRjaGVyfSBvclxuICogTWF0Y2hlcyBhZ2FpbnN0IHRoZSB1bmlvbiBvZiBhbGwgc3ViLVBhdHRlcm5zXG4gKiAocmVxdWlyaW5nIGEgc3VjY2Vzc2Z1bCBtYXRjaCBhZ2FpbnN0IGF0IGxlYXN0IG9uZSkuXG4gKlxuICogQHByb3BlcnR5IHsoc3ViUGF0dDogUGF0dGVybikgPT4gTWF0Y2hlcn0gbm90XG4gKiBNYXRjaGVzIGFnYWluc3QgdGhlIG5lZ2F0aW9uIG9mIHRoZSBzdWItUGF0dGVybi5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IE1hdGNoZXJ9IHNjYWxhclxuICogTWF0Y2hlcyBhbnkgUGFzc2FibGUgcHJpbWl0aXZlIHZhbHVlIG9yIFJlbW90YWJsZS5cbiAqIEFsbCBtYXRjaGVkIHZhbHVlcyBhcmUgS2V5cy5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IE1hdGNoZXJ9IGtleVxuICogTWF0Y2hlcyBhbnkgdmFsdWUgdGhhdCBjYW4gYmUgYSBrZXkgaW4gYSBDb3B5TWFwXG4gKiBvciBhbiBlbGVtZW50IGluIGEgQ29weVNldCBvciBDb3B5QmFnLlxuICogQWxsIG1hdGNoZWQgdmFsdWVzIGFyZSBhbHNvIHZhbGlkIFBhdHRlcm5zIHRoYXQgbWF0Y2ggb25seSB0aGVtc2VsdmVzLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTWF0Y2hlcn0gcGF0dGVyblxuICogTWF0Y2hlcyBhbnkgUGF0dGVybiB0aGF0IGNhbiBiZSB1c2VkIHRvIGNoYXJhY3Rlcml6ZSBQYXNzYWJsZXMuXG4gKiBBIFBhdHRlcm4gY2Fubm90IGNvbnRhaW4gcHJvbWlzZXMgb3IgZXJyb3JzLFxuICogYXMgdGhlc2UgYXJlIG5vdCBzdGFibGUgZW5vdWdoIHRvIHVzZWZ1bGx5IG1hdGNoLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGtpbmQ6IFBhc3NTdHlsZSB8IHN0cmluZykgPT4gTWF0Y2hlcn0ga2luZFxuICogV2hlbiBga2luZGAgc3BlY2lmaWVzIGEgUGFzc1N0eWxlIG90aGVyIHRoYW4gXCJ0YWdnZWRcIixcbiAqIG1hdGNoZXMgYW55IHZhbHVlIGhhdmluZyB0aGF0IFBhc3NTdHlsZS5cbiAqIE90aGVyd2lzZSwgd2hlbiBga2luZGAgc3BlY2lmaWVzIGEga25vd24gdGFnZ2VkIHJlY29yZCB0YWdcbiAqIChzdWNoIGFzICdjb3B5U2V0JywgJ2NvcHlCYWcnLCAnY29weU1hcCcsIG9yICdtYXRjaDpzY2FsYXInKSxcbiAqIG1hdGNoZXMgYW55IENvcHlUYWdnZWQgd2l0aCB0aGF0IHRhZyBhbmQgYSB2YWxpZCB0YWctc3BlY2lmaWMgcGF5bG9hZC5cbiAqIE90aGVyd2lzZSwgZG9lcyBub3QgbWF0Y2ggYW55IHZhbHVlLlxuICogVE9ETzogUmVqZWN0IGF0dGVtcHRzIHRvIGNyZWF0ZSBhIGtpbmQgbWF0Y2hlciB3aXRoIHVua25vd24gYGtpbmRgP1xuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTWF0Y2hlcn0gYm9vbGVhblxuICogTWF0Y2hlcyBgdHJ1ZWAgb3IgYGZhbHNlYC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IE1hdGNoZXJ9IG51bWJlclxuICogTWF0Y2hlcyBhbnkgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLFxuICogaW5jbHVkaW5nIGBOYU5gIGFuZCBlaXRoZXIgc2lnbmVkIEluZmluaXR5LlxuICpcbiAqIEBwcm9wZXJ0eSB7KGxpbWl0cz86IExpbWl0cykgPT4gTWF0Y2hlcn0gYmlnaW50XG4gKiBNYXRjaGVzIGFueSBiaWdpbnQsIHN1YmplY3QgdG8gbGltaXRzLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGxpbWl0cz86IExpbWl0cykgPT4gTWF0Y2hlcn0gbmF0XG4gKiBNYXRjaGVzIGFueSBub24tbmVnYXRpdmUgYmlnaW50IG9yXG4gKiBcInNhZmVcIiAobm8gZ3JlYXRlciB0aGFuIDIqKjUzIC0gMSkgbm9uLW5lZ2F0aXZlIGludGVncmFsIG51bWJlcixcbiAqIHN1YmplY3QgdG8gbGltaXRzLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGxpbWl0cz86IExpbWl0cykgPT4gTWF0Y2hlcn0gc3RyaW5nXG4gKiBNYXRjaGVzIGFueSBzdHJpbmcsIHN1YmplY3QgdG8gbGltaXRzLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGxpbWl0cz86IExpbWl0cykgPT4gTWF0Y2hlcn0gc3ltYm9sXG4gKiBNYXRjaGVzIGFueSByZWdpc3RlcmVkIG9yIHdlbGwta25vd24gc3ltYm9sLFxuICogc3ViamVjdCB0byBsaW1pdHMuXG4gKlxuICogQHByb3BlcnR5IHsobGltaXRzPzogTGltaXRzKSA9PiBNYXRjaGVyfSByZWNvcmRcbiAqIE1hdGNoZXMgYW55IENvcHlSZWNvcmQsIHN1YmplY3QgdG8gbGltaXRzLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGxpbWl0cz86IExpbWl0cykgPT4gTWF0Y2hlcn0gYXJyYXlcbiAqIE1hdGNoZXMgYW55IENvcHlBcnJheSwgc3ViamVjdCB0byBsaW1pdHMuXG4gKlxuICogQHByb3BlcnR5IHsobGltaXRzPzogTGltaXRzKSA9PiBNYXRjaGVyfSBzZXRcbiAqIE1hdGNoZXMgYW55IENvcHlTZXQsIHN1YmplY3QgdG8gbGltaXRzLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGxpbWl0cz86IExpbWl0cykgPT4gTWF0Y2hlcn0gYmFnXG4gKiBNYXRjaGVzIGFueSBDb3B5QmFnLCBzdWJqZWN0IHRvIGxpbWl0cy5cbiAqXG4gKiBAcHJvcGVydHkgeyhsaW1pdHM/OiBMaW1pdHMpID0+IE1hdGNoZXJ9IG1hcFxuICogTWF0Y2hlcyBhbnkgQ29weU1hcCwgc3ViamVjdCB0byBsaW1pdHMuXG4gKlxuICogQHByb3BlcnR5IHsobGFiZWw/OiBzdHJpbmcpID0+IE1hdGNoZXJ9IHJlbW90YWJsZVxuICogTWF0Y2hlcyBhIGZhciBvYmplY3Qgb3IgaXRzIHJlbW90ZSBwcmVzZW5jZS5cbiAqIFRoZSBvcHRpb25hbCBgbGFiZWxgIGlzIHB1cmVseSBmb3IgZGlhZ25vc3RpYyBwdXJwb3NlcyBhbmQgZG9lcyBub3RcbiAqIGFkZCBhbnkgY29uc3RyYWludHMuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBNYXRjaGVyfSBlcnJvclxuICogTWF0Y2hlcyBhbnkgZXJyb3Igb2JqZWN0LlxuICogRXJyb3Igb2JqZWN0cyBhcmUgUGFzc2FibGUsIGJ1dCBhcmUgbmVpdGhlciBLZXlzIG5vciBQYXR0ZXJucy5cbiAqIFRoZXkgZG8gbm90IGhhdmUgYSB1c2VmdWwgaWRlbnRpdHkuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBNYXRjaGVyfSBwcm9taXNlXG4gKiBNYXRjaGVzIGFueSBwcm9taXNlIG9iamVjdC5cbiAqIFByb21pc2VzIGFyZSBQYXNzYWJsZSwgYnV0IGFyZSBuZWl0aGVyIEtleXMgbm9yIFBhdHRlcm5zLlxuICogVGhleSBkbyBub3QgaGF2ZSBhIHVzZWZ1bCBpZGVudGl0eS5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IE1hdGNoZXJ9IHVuZGVmaW5lZFxuICogTWF0Y2hlcyB0aGUgZXhhY3QgdmFsdWUgYHVuZGVmaW5lZGAuXG4gKiBBbGwga2V5cyBpbmNsdWRpbmcgYHVuZGVmaW5lZGAgYXJlIGFscmVhZHkgdmFsaWQgUGF0dGVybnMgYW5kXG4gKiBzbyBjYW4gdmFsaWRseSByZXByZXNlbnQgdGhlbXNlbHZlcy5cbiAqIEJ1dCBvcHRpb25hbCBQYXR0ZXJuIGFyZ3VtZW50cyBgKHBhdHQgPSB1bmRlZmluZWQpID0+IC4uLmBcbiAqIHRyZWF0IGV4cGxpY2l0IGB1bmRlZmluZWRgIGFzIG9taXNzaW9uIG9mIHRoZSBhcmd1bWVudC5cbiAqIFRodXMsIHdoZW4gYSBwYXNzZWQgUGF0dGVybiBkb2VzIG5vdCBhbHNvIG5lZWQgdG8gYmUgYSBLZXksXG4gKiB3ZSByZWNvbW1lbmQgcGFzc2luZyBgTS51bmRlZmluZWQoKWAgcmF0aGVyIHRoYW4gYHVuZGVmaW5lZGAuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBudWxsfSBudWxsXG4gKiBSZXR1cm5zIGBudWxsYCwgd2hpY2ggbWF0Y2hlcyBvbmx5IGl0c2VsZi5cbiAqXG4gKiBAcHJvcGVydHkgeyhyaWdodE9wZXJhbmQgOktleSkgPT4gTWF0Y2hlcn0gbHRcbiAqIE1hdGNoZXMgYW55IHZhbHVlIHRoYXQgY29tcGFyZUtleXMgcmVwb3J0cyBhcyBsZXNzIHRoYW4gcmlnaHRPcGVyYW5kLlxuICpcbiAqIEBwcm9wZXJ0eSB7KHJpZ2h0T3BlcmFuZCA6S2V5KSA9PiBNYXRjaGVyfSBsdGVcbiAqIE1hdGNoZXMgYW55IHZhbHVlIHRoYXQgY29tcGFyZUtleXMgcmVwb3J0cyBhcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG9cbiAqIHJpZ2h0T3BlcmFuZC5cbiAqXG4gKiBAcHJvcGVydHkgeyhrZXkgOktleSkgPT4gTWF0Y2hlcn0gZXFcbiAqIE1hdGNoZXMgYW55IHZhbHVlIHRoYXQgaXMgZXF1YWwgdG8ga2V5LlxuICpcbiAqIEBwcm9wZXJ0eSB7KGtleSA6S2V5KSA9PiBNYXRjaGVyfSBuZXFcbiAqIE1hdGNoZXMgYW55IHZhbHVlIHRoYXQgaXMgbm90IGVxdWFsIHRvIGtleS5cbiAqXG4gKiBAcHJvcGVydHkgeyhyaWdodE9wZXJhbmQgOktleSkgPT4gTWF0Y2hlcn0gZ3RlXG4gKiBNYXRjaGVzIGFueSB2YWx1ZSB0aGF0IGNvbXBhcmVLZXlzIHJlcG9ydHMgYXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsXG4gKiB0byByaWdodE9wZXJhbmQuXG4gKlxuICogQHByb3BlcnR5IHsocmlnaHRPcGVyYW5kIDpLZXkpID0+IE1hdGNoZXJ9IGd0XG4gKiBNYXRjaGVzIGFueSB2YWx1ZSB0aGF0IGNvbXBhcmVLZXlzIHJlcG9ydHMgYXMgZ3JlYXRlciB0aGFuXG4gKiByaWdodE9wZXJhbmQuXG4gKlxuICogQHByb3BlcnR5IHsoc3ViUGF0dD86IFBhdHRlcm4sIGxpbWl0cz86IExpbWl0cykgPT4gTWF0Y2hlcn0gYXJyYXlPZlxuICogTWF0Y2hlcyBhbnkgQ29weUFycmF5IHdob3NlIGVsZW1lbnRzIGFyZSBhbGwgbWF0Y2hlZCBieSBgc3ViUGF0dGBcbiAqIGlmIGRlZmluZWQsIHN1YmplY3QgdG8gbGltaXRzLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLFxuICogICAgICAgICAgICAgdmFsdWVQYXR0PzogUGF0dGVybixcbiAqICAgICAgICAgICAgIGxpbWl0cz86IExpbWl0c1xuICogKSA9PiBNYXRjaGVyfSByZWNvcmRPZlxuICogTWF0Y2hlcyBhbnkgQ29weVJlY29yZCB3aG9zZSBrZXlzIGFyZSBhbGwgbWF0Y2hlZCBieSBga2V5UGF0dGBcbiAqIGlmIGRlZmluZWQgYW5kIHZhbHVlcyBhcmUgYWxsIG1hdGNoZWQgYnkgYHZhbHVlUGF0dGAgaWYgZGVmaW5lZCxcbiAqIHN1YmplY3QgdG8gbGltaXRzLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLCBsaW1pdHM/OiBMaW1pdHMpID0+IE1hdGNoZXJ9IHNldE9mXG4gKiBNYXRjaGVzIGFueSBDb3B5U2V0IHdob3NlIGVsZW1lbnRzIGFyZSBhbGwgbWF0Y2hlZCBieSBga2V5UGF0dGBcbiAqIGlmIGRlZmluZWQsIHN1YmplY3QgdG8gbGltaXRzLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLFxuICogICAgICAgICAgICAgY291bnRQYXR0PzogUGF0dGVybixcbiAqICAgICAgICAgICAgIGxpbWl0cz86IExpbWl0c1xuICogKSA9PiBNYXRjaGVyfSBiYWdPZlxuICogTWF0Y2hlcyBhbnkgQ29weUJhZyB3aG9zZSBlbGVtZW50cyBhcmUgYWxsIG1hdGNoZWQgYnkgYGtleVBhdHRgXG4gKiBpZiBkZWZpbmVkIGFuZCB0aGUgY2FyZGluYWxpdHkgb2YgZWFjaCBpcyBtYXRjaGVkIGJ5IGBjb3VudFBhdHRgXG4gKiBpZiBkZWZpbmVkLCBzdWJqZWN0IHRvIGxpbWl0cy5cbiAqIGBjb3VudFBhdHRgIGlzIGV4cGVjdGVkIHRvIHJhcmVseSBiZSB1c2VmdWwsXG4gKiBidXQgaXMgcHJvdmlkZWQgdG8gbWluaW1pemUgc3VycHJpc2UuXG4gKlxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4sXG4gKiAgICAgICAgICAgICB2YWx1ZVBhdHQ/OiBQYXR0ZXJuLFxuICogICAgICAgICAgICAgbGltaXRzPzogTGltaXRzXG4gKiApID0+IE1hdGNoZXJ9IG1hcE9mXG4gKiBNYXRjaGVzIGFueSBDb3B5TWFwIHdob3NlIGtleXMgYXJlIGFsbCBtYXRjaGVkIGJ5IGBrZXlQYXR0YCBpZiBkZWZpbmVkXG4gKiBhbmQgdmFsdWVzIGFyZSBhbGwgbWF0Y2hlZCBieSBgdmFsdWVQYXR0YCBpZiBkZWZpbmVkLFxuICogc3ViamVjdCB0byBsaW1pdHMuXG4gKlxuICogQHByb3BlcnR5IHsocmVxdWlyZWQ6IFBhdHRlcm5bXSxcbiAqICAgICAgICAgICAgIG9wdGlvbmFsPzogUGF0dGVybltdLFxuICogICAgICAgICAgICAgcmVzdD86IFBhdHRlcm4sXG4gKiApID0+IE1hdGNoZXJ9IHNwbGl0QXJyYXlcbiAqIE1hdGNoZXMgYW55IGFycmF5IC0tLSB0eXBpY2FsbHkgYW4gYXJndW1lbnRzIGxpc3QgLS0tIGNvbnNpc3Rpbmcgb2ZcbiAqICAgLSBhbiBpbml0aWFsIHBvcnRpb24gbWF0Y2hlZCBieSBgcmVxdWlyZWRgLCBhbmRcbiAqICAgLSBhIG1pZGRsZSBwb3J0aW9uIG9mIGxlbmd0aCB1cCB0byB0aGUgbGVuZ3RoIG9mIGBvcHRpb25hbGAgdGhhdCBpc1xuICogICAgIG1hdGNoZWQgYnkgdGhlIGVxdWFsLWxlbmd0aCBwcmVmaXggb2YgYG9wdGlvbmFsYCBpZiBgb3B0aW9uYWxgIGlzXG4gKiAgICAgZGVmaW5lZCwgYW5kXG4gKiAgIC0gYSByZW1haW5kZXIgdGhhdCBpcyBtYXRjaGVkIGJ5IGByZXN0YCBpZiBgcmVzdGAgaXMgZGVmaW5lZC5cbiAqIFRoZSBhcnJheSBtdXN0IGJlIGF0IGxlYXN0IGFzIGxvbmcgYXMgYHJlcXVpcmVkYFxuICogYnV0IGl0cyByZW1haW5kZXIgY2FuIGJlIGFyYml0cmFyaWx5IHNob3J0LlxuICogQW55IGFycmF5IGVsZW1lbnRzIGJleW9uZCB0aGUgc3VtbWVkIGxlbmd0aCBvZiBgcmVxdWlyZWRgIGFuZCBgb3B0aW9uYWxgXG4gKiBhcmUgY29sbGVjdGVkIGFuZCBtYXRjaGVkIGFnYWluc3QgYHJlc3RgLlxuICpcbiAqIEBwcm9wZXJ0eSB7KHJlcXVpcmVkOiBDb3B5UmVjb3JkPFBhdHRlcm4+LFxuICogICAgICAgICAgICAgb3B0aW9uYWw/OiBDb3B5UmVjb3JkPFBhdHRlcm4+LFxuICogICAgICAgICAgICAgcmVzdD86IFBhdHRlcm4sXG4gKiApID0+IE1hdGNoZXJ9IHNwbGl0UmVjb3JkXG4gKiBNYXRjaGVzIGFueSBDb3B5UmVjb3JkIHRoYXQgY2FuIGJlIHNwbGl0IGludG8gY29tcG9uZW50IENvcHlSZWNvcmRzXG4gKiBhcyBmb2xsb3dzOlxuICogICAtIGFsbCBwcm9wZXJ0aWVzIGNvcnJlc3BvbmRpbmcgd2l0aCBhIHByb3BlcnR5IG9mIGByZXF1aXJlZGBcbiAqICAgLSBhbGwgcHJvcGVydGllcyBjb3JyZXNwb25kaW5nIHdpdGggYSBwcm9wZXJ0eSBvZiBgb3B0aW9uYWxgXG4gKiAgICAgYnV0IG5vdCBjb3JyZXNwb25kaW5nIHdpdGggYSBwcm9wZXJ0eSBvZiBgcmVxdWlyZWRgXG4gKiAgIC0gYWxsIG90aGVyIHByb3BlcnRpZXNcbiAqIHdoZXJlIHRoZSBmaXJzdCBjb21wb25lbnQgaXMgbWF0Y2hlZCBieSBgcmVxdWlyZWRgLFxuICogdGhlIHNlY29uZCBjb21wb25lbnQgaXMgbWF0Y2hlZCBieSB0aGUgc3Vic2V0IG9mIGBvcHRpb25hbGBcbiAqIGNvcnJlc3BvbmRpbmcgd2l0aCBpdHMgcHJvcGVydGllcyBpZiBgb3B0aW9uYWxgIGlzIGRlZmluZWQsIGFuZFxuICogdGhlIHRoaXJkIGNvbXBvbmVudCBpcyBtYXRjaGVkIGJ5IGByZXN0YCBpZiBkZWZpbmVkLlxuICogVGhlIENvcHlSZWNvcmQgbXVzdCBoYXZlIGFsbCBwcm9wZXJ0aWVzIHRoYXQgYXBwZWFyIG9uIGByZXF1aXJlZGAsXG4gKiBidXQgbWF5IG9taXQgcHJvcGVydGllcyB0aGF0IGFwcGVhciBvbiBgb3B0aW9uYWxgLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGJhc2VQYXR0OiBDb3B5UmVjb3JkPCo+IHwgQ29weUFycmF5PCo+LFxuICogICAgICAgICAgICAgcmVzdD86IFBhdHRlcm4sXG4gKiApID0+IE1hdGNoZXJ9IHNwbGl0XG4gKiBEZXByZWNhdGVkLiBVc2UgYE0uc3BsaXRBcnJheWAgb3IgYE0uc3BsaXRSZWNvcmRgIGluc3RlYWQuXG4gKiBBbiBhcnJheSBvciByZWNvcmQgaXMgc3BsaXQgaW50byB0aGUgZmlyc3QgcGFydCB0aGF0IGlzIG1hdGNoZWQgYnlcbiAqIGBiYXNlUGF0dGAsIGFuZCB0aGUgcmVtYWluZGVyLCB3aGljaCBpcyBtYXRjaGVkIGFnYWluc3QgYHJlc3RgIGlmIHByZXNlbnQuXG4gKlxuICogQHByb3BlcnR5IHsoYmFzZVBhdHQ6IENvcHlSZWNvcmQ8Kj4gfCBDb3B5QXJyYXk8Kj4sXG4gKiAgICAgICAgICAgICByZXN0PzogUGF0dGVybixcbiAqICkgPT4gTWF0Y2hlcn0gcGFydGlhbFxuICogRGVwcmVjYXRlZC4gVXNlIGBNLnNwbGl0QXJyYXlgIG9yIGBNLnNwbGl0UmVjb3JkYCBpbnN0ZWFkLlxuICogQW4gYXJyYXkgb3IgcmVjb3JkIGlzIHNwbGl0IGludG8gdGhlIGZpcnN0IHBhcnQgdGhhdCBpcyBtYXRjaGVkIGJ5XG4gKiBgYmFzZVBhdHRgLCBhbmQgdGhlIHJlbWFpbmRlciwgd2hpY2ggaXMgbWF0Y2hlZCBhZ2FpbnN0IGByZXN0YCBpZiBwcmVzZW50LlxuICogYE0ucGFydGlhbGAgZGlmZmVycyBmcm9tIGBNLnNwbGl0YCBpbiB0aGUgaGFuZGxpbmcgb2YgZGF0YSB0aGF0IGlzXG4gKiBkZXNjcmliZWQgaW4gYGJhc2VQYXR0YCBidXQgYWJzZW50IGluIGEgcHJvdmlkZWQgc3BlY2ltZW46XG4gKiAgIC0gRm9yIGEgQ29weVJlY29yZCwgYE0ucGFydGlhbGAgaWdub3JlcyBwcm9wZXJ0aWVzIG9mIGBiYXNlUGF0dGBcbiAqICAgICB0aGF0IGFyZSBub3QgcHJlc2VudCBvbiB0aGUgc3BlY2ltZW4uXG4gKiAgIC0gRm9yIGEgQ29weUFycmF5LCBgTS5wYXJ0aWFsYCBpZ25vcmVzIGVsZW1lbnRzIG9mIGBiYXNlUGF0dGBcbiAqICAgICBhdCBpbmRpY2VzIGJleW9uZCB0aGUgbWF4aW11bSBpbmRleCBvZiB0aGUgc3BlY2ltZW4uXG4gKlxuICogQHByb3BlcnR5IHsoc3ViUGF0dDogUGF0dGVybikgPT4gUGF0dGVybn0gZXJlZlxuICogTWF0Y2hlcyBhbnkgUGFzc2FibGUgdGhhdCBpcyBlaXRoZXIgbWF0Y2hlZCBieSBgc3ViUGF0dGAgb3IgaXMgYSBwcm9taXNlIG9iamVjdC5cbiAqIE5vdGUgdGhhdCB2YWxpZGF0aW9uIGlzIGltbWVkaWF0ZSwgc28gKHVubGlrZSB0aGUgVHlwZVNjcmlwdCBFUmVmPFQ+XG4gKiB0eXBlKSBgTS5lcmVmYCBtYXRjaGVzIGEgcHJvbWlzZSBvYmplY3Qgd2hvc2UgZnVsZmlsbG1lbnQgdmFsdWUgaXNcbiAqIF9ub3RfIG1hdGNoZWQgYnkgYHN1YlBhdHRgLlxuICogRm9yIGRlc2NyaWJpbmcgYSB0b3AtbGV2ZWwgcGFyYW1ldGVyLFxuICogYE0uY2FsbFdoZW4oLi4uLCBNLmF3YWl0KHApLCAuLi4pYCBpcyBwcmVmZXJyZWQgb3ZlciBgTS5jYWxsKC4uLiwgTS5lcmVmKHApLCAuLi4pYFxuICogYmVjYXVzZSB0aGUgZm9ybWVyIGFsd2F5cyBjaGVja3MgYWdhaW5zdCB0aGUgc3ViLVBhdHRlcm4gKGF3YWl0aW5nIGZ1bGZpbGxtZW50XG4gKiBpZiBuZWNlc3NhcnkpIHdoaWxlIHRoZSBsYXR0ZXIgYnlwYXNzZXMgc3VjaCBjaGVja3Mgd2hlbiB0aGUgcmVsZXZhbnQgYXJndW1lbnRcbiAqIGlzIGEgcHJvbWlzZS5cbiAqXG4gKiBAcHJvcGVydHkgeyhzdWJQYXR0OiBQYXR0ZXJuKSA9PiBQYXR0ZXJufSBvcHRcbiAqIE1hdGNoZXMgYW55IFBhc3NhYmxlIHRoYXQgaXMgbWF0Y2hlZCBieSBgc3ViUGF0dGAgb3IgaXMgdGhlIGV4YWN0IHZhbHVlIGB1bmRlZmluZWRgLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gR3VhcmRNYWtlcnNcbiAqIEBwcm9wZXJ0eSB7PE0gZXh0ZW5kcyBSZWNvcmQ8YW55LCBhbnk+PihpbnRlcmZhY2VOYW1lOiBzdHJpbmcsXG4gKiAgICAgICAgICAgICBtZXRob2RHdWFyZHM6IE0sXG4gKiAgICAgICAgICAgICBvcHRpb25zPzoge3Nsb3BweT86IGJvb2xlYW59XG4gKiApID0+IEludGVyZmFjZUd1YXJkfSBpbnRlcmZhY2UgR3VhcmQgYW4gaW50ZXJmYWNlIHRvIGEgZmFyIG9iamVjdCBvciBmYWNldFxuICpcbiAqIEBwcm9wZXJ0eSB7KC4uLmFyZ0d1YXJkczogQXJnR3VhcmRbXSkgPT4gTWV0aG9kR3VhcmRNYWtlcn0gY2FsbCBHdWFyZCBhIHN5bmNocm9ub3VzIGNhbGxcbiAqXG4gKiBAcHJvcGVydHkgeyguLi5hcmdHdWFyZHM6IEFyZ0d1YXJkW10pID0+IE1ldGhvZEd1YXJkTWFrZXJ9IGNhbGxXaGVuIEd1YXJkIGFuIGFzeW5jIGNhbGxcbiAqXG4gKiBAcHJvcGVydHkgeyhhcmdHdWFyZDogQXJnR3VhcmQpID0+IEFyZ0d1YXJkfSBhd2FpdCBHdWFyZCBhbiBhd2FpdFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1BhdHRlcm5NYXRjaGVycyAmIEd1YXJkTWFrZXJzfSBNYXRjaGVyTmFtZXNwYWNlXG4gKi9cblxuLyoqIEB0eXBlZGVmIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gTWV0aG9kICovXG5cbi8qIFRPRE8gcGFyYW1ldGVyaXplIHRoaXMgdG8gbWF0Y2ggdGhlIGJlaGF2aW9yIG9iamVjdCBpdCBndWFyZHMqL1xuLyoqXG4gKiBAdHlwZWRlZiB7e1xuICoga2xhc3M6ICdJbnRlcmZhY2UnLFxuICogaW50ZXJmYWNlTmFtZTogc3RyaW5nLFxuICogbWV0aG9kR3VhcmRzOiBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBNZXRob2RHdWFyZD5cbiAqIHNsb3BweT86IGJvb2xlYW5cbiAqIH19IEludGVyZmFjZUd1YXJkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7YW55fSBNZXRob2RHdWFyZE1ha2VyXG4gKiBhIHBhcmFtZXRlciBsaXN0IGxpa2UgZm9vKGEsIGIsIGMgPSBkLCDigKZlKSA9PiBmIHNob3VsZCBiZSBndWFyZGVkIGJ5XG4gKiBzb21ldGhpbmcgbGlrZVxuICogZm9vOiBNLmNhbGwoQVNoYXBlLCBCU2hhcGUpLm9wdGlvbmFsKENTaGFwZSkucmVzdChFU2hhcGUpLnJldHVybnMoRlNoYXBlKVxuICogb3B0aW9uYWwgaXMgZm9yIG9wdGlvbmFsICg9KSBwYXJhbXMuIHJlc3QgaXMgZm9yIOKApiAodmFyYXJncykgcGFyYW1zXG4gKi9cblxuLyoqIEB0eXBlZGVmIHt7IGtsYXNzOiAnbWV0aG9kR3VhcmQnLCBjYWxsS2luZDogJ3N5bmMnIHwgJ2FzeW5jJywgcmV0dXJuR3VhcmQ6IHVua25vd24gfX0gTWV0aG9kR3VhcmQgKi9cbi8qKiBAdHlwZWRlZiB7YW55fSBBcmdHdWFyZCAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBhdHRlcm5LaXRcbiAqIEBwcm9wZXJ0eSB7KHNwZWNpbWVuOiBQYXNzYWJsZSxcbiAqICAgICAgICAgICAgIHBhdHQ6IFBhc3NhYmxlLFxuICogICAgICAgICAgICAgY2hlY2s6IENoZWNrZXIsXG4gKiAgICAgICAgICAgICBsYWJlbD86IHN0cmluZ3xudW1iZXJcbiAqICkgPT4gYm9vbGVhbn0gY2hlY2tNYXRjaGVzXG4gKiBAcHJvcGVydHkgeyhzcGVjaW1lbjogUGFzc2FibGUsIHBhdHQ6IFBhdHRlcm4pID0+IGJvb2xlYW59IG1hdGNoZXNcbiAqIEBwcm9wZXJ0eSB7KHNwZWNpbWVuOiBQYXNzYWJsZSwgcGF0dDogUGF0dGVybiwgbGFiZWw/OiBzdHJpbmd8bnVtYmVyKSA9PiB2b2lkfSBtdXN0TWF0Y2hcbiAqIEBwcm9wZXJ0eSB7KHBhdHQ6IFBhdHRlcm4pID0+IHZvaWR9IGFzc2VydFBhdHRlcm5cbiAqIEBwcm9wZXJ0eSB7KHBhdHQ6IFBhc3NhYmxlKSA9PiBib29sZWFufSBpc1BhdHRlcm5cbiAqIEBwcm9wZXJ0eSB7R2V0UmFua0NvdmVyfSBnZXRSYW5rQ292ZXJcbiAqIEBwcm9wZXJ0eSB7TWF0Y2hlck5hbWVzcGFjZX0gTVxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyogVE9ETyovXG4vKiBUaGUgZm9sbG93aW5nIHR5cGUgc2hvdWxkIGJlIGluIGludGVybmFsLXR5cGVzLmpzLCBzaW5jZSB0aGUqL1xuLyogYE1hdGNoSGVscGVyYCB0eXBlIGlzIHB1cmVseSBpbnRlcm5hbCB0byB0aGlzIHBhY2thZ2UuIEhvd2V2ZXIsKi9cbi8qIGluIG9yZGVyIHRvIGdldCB0aGUgZ292ZXJuYW5jZSBhbmQgc29sbyBwYWNrYWdlcyBib3RoIHRvIHBhc3MgbGludCwqL1xuLyogSSBtb3ZlZCB0aGUgdHlwZSBkZWNsYXJhdGlvbiBpdHNlbGYgdG8gdHlwZXMuanMuIFNlZSB0aGUgY29tbWVudHMgaW4qL1xuLyogaW4gaW50ZXJuYWwtdHlwZXMuanMgYW5kIGV4cG9ydHMuanMqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1hdGNoSGVscGVyXG4gKiBUaGlzIGZhY3RvcnMgb3V0IG9ubHkgdGhlIHBhcnRzIHNwZWNpZmljIHRvIGVhY2gga2luZCBvZiBNYXRjaGVyLiBJdCBpc1xuICogZW5jYXBzdWxhdGVkLCBhbmQgaXRzIG1ldGhvZHMgY2FuIG1ha2UgdGhlIHN0YXRlZCB1bmNoZWNrZXIgYXNzdW1wdGlvbnNcbiAqIGVuZm9yY2VkIGJ5IHRoZSBjb21tb24gY2FsbGluZyBsb2dpYy5cbiAqXG4gKiBAcHJvcGVydHkgeyhhbGxlZ2VkUGF5bG9hZDogUGFzc2FibGUsXG4gKiAgICAgICAgICAgICBjaGVjazogQ2hlY2tlclxuICogKSA9PiBib29sZWFufSBjaGVja0lzV2VsbEZvcm1lZFxuICogUmVwb3J0cyB3aGV0aGVyIGBhbGxlZ2VkUGF5bG9hZGAgaXMgdmFsaWQgYXMgdGhlIHBheWxvYWQgb2YgYSBDb3B5VGFnZ2VkXG4gKiB3aG9zZSB0YWcgY29ycmVzcG9uZHMgd2l0aCB0aGlzIE1hdGNoSGVscGVyJ3MgTWF0Y2hlcnMuXG4gKlxuICogQHByb3BlcnR5IHsoc3BlY2ltZW46IFBhc3NhYmxlLFxuICogICAgICAgICAgICAgbWF0Y2hlclBheWxvYWQ6IFBhc3NhYmxlLFxuICogICAgICAgICAgICAgY2hlY2s6IENoZWNrZXIsXG4gKiApID0+IGJvb2xlYW59IGNoZWNrTWF0Y2hlc1xuICogQXNzdW1pbmcgdmFsaWRpdHkgb2YgYG1hdGNoZXJQYXlsb2FkYCBhcyB0aGUgcGF5bG9hZCBvZiBhIE1hdGNoZXIgY29ycmVzcG9uZGluZ1xuICogd2l0aCB0aGlzIE1hdGNoSGVscGVyLCByZXBvcnRzIHdoZXRoZXIgYHNwZWNpbWVuYCBpcyBtYXRjaGVkIGJ5IHRoYXQgTWF0Y2hlci5cbiAqXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcGF5bG9hZDogUGFzc2FibGUsXG4gKiAgIGVuY29kZVBhc3NhYmxlOiBLZXlUb0RCS2V5XG4gKiApID0+IFJhbmtDb3Zlcn0gZ2V0UmFua0NvdmVyXG4gKiBBc3N1bWVzIHRoaXMgaXMgdGhlIHBheWxvYWQgb2YgYSBDb3B5VGFnZ2VkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmdcbiAqIG1hdGNoVGFnLiBSZXR1cm4gYSBSYW5rQ292ZXIgdG8gYm91bmQgZnJvbSBiZWxvdyBhbmQgYWJvdmUsXG4gKiBpbiByYW5rIG9yZGVyLCBhbGwgcG9zc2libGUgUGFzc2FibGVzIHRoYXQgd291bGQgbWF0Y2ggdGhpcyBNYXRjaGVyLlxuICogVGhlIGxlZnQgZWxlbWVudCBtdXN0IGJlIGJlZm9yZSBvciB0aGUgc2FtZSByYW5rIGFzIGFueSBwb3NzaWJsZVxuICogbWF0Y2hpbmcgc3BlY2ltZW4uIFRoZSByaWdodCBlbGVtZW50IG11c3QgYmUgYWZ0ZXIgb3IgdGhlIHNhbWVcbiAqIHJhbmsgYXMgYW55IHBvc3NpYmxlIG1hdGNoaW5nIHNwZWNpbWVuLlxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALtXDvcfAQAAHwEAACgAAABAYWdvcmljL3N3aW5nc2V0LXZhdC12MC4zMC4yL2V4cG9ydGVkLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAH/8s2KqAQAAqgEAABwAAABAYWdvcmljL3RpbWUtdjAuMi4xL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL3RpbWVNYXRoLmpzIiwiLi9zcmMvdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vc3JjL3RpbWVNYXRoLmpzIiwiLi9zcmMvdHlwZUd1YXJkcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL3RpbWVNYXRoLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlR3VhcmRzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAP7loWhCAAAIQgAAAjAAAAQGFnb3JpYy90aW1lLXYwLjIuMS9zcmMvdGltZU1hdGguanN7ImltcG9ydHMiOlsiLi90eXBlR3VhcmRzLmpzIiwiQGFnb3JpYy9zdG9yZSIsIkBlbmRvL25hdCJdLCJleHBvcnRzIjpbIlRpbWVNYXRoIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE5hdCxtdXN0TWF0Y2gsUmVsYXRpdmVUaW1lU2hhcGUsVGltZXN0YW1wU2hhcGU7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIiwgWyRo4oCNX2EgPT4gKE5hdCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtdXN0TWF0Y2hcIiwgWyRo4oCNX2EgPT4gKG11c3RNYXRjaCA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIlJlbGF0aXZlVGltZVNoYXBlXCIsIFskaOKAjV9hID0+IChSZWxhdGl2ZVRpbWVTaGFwZSA9ICRo4oCNX2EpXV0sW1wiVGltZXN0YW1wU2hhcGVcIiwgWyRo4oCNX2EgPT4gKFRpbWVzdGFtcFNoYXBlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuLyoqXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcycpLlRpbWVyQnJhbmR9IFRpbWVyQnJhbmRcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzJykuVGltZXN0YW1wfSBUaW1lc3RhbXBcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzJykuUmVsYXRpdmVUaW1lfSBSZWxhdGl2ZVRpbWVcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzJykuUmVsYXRpdmVUaW1lVmFsdWV9IFJlbGF0aXZlVGltZVZhbHVlXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcycpLlRpbWVzdGFtcFZhbHVlfSBUaW1lc3RhbXBWYWx1ZVxuICogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMnKS5UaW1lTWF0aFR5cGV9IFRpbWVNYXRoVHlwZVxuICpcbiAqL1xuXG4vKipcbiAqIGBhZ3JlZWRUaW1lckJyYW5kYCBpcyBpbnRlcm5hbCB0byB0aGlzIG1vZHVsZS5cbiAqXG4gKiBAcGFyYW0ge1RpbWVyQnJhbmQgfCB1bmRlZmluZWR9IGxlZnRCcmFuZFxuICogQHBhcmFtIHtUaW1lckJyYW5kIHwgdW5kZWZpbmVkfSByaWdodEJyYW5kXG4gKiBAcmV0dXJucyB7VGltZXJCcmFuZCB8IHVuZGVmaW5lZH1cbiAqL1xuY29uc3QgYWdyZWVkVGltZXJCcmFuZD0obGVmdEJyYW5kLHJpZ2h0QnJhbmQpPT57XG5pZihsZWZ0QnJhbmQ9PT11bmRlZmluZWQpe1xuaWYocmlnaHRCcmFuZD09PXVuZGVmaW5lZCl7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1lbHNle1xucmV0dXJuIHJpZ2h0QnJhbmQ7XG4gfVxuIH1lbHNlIGlmKHJpZ2h0QnJhbmQ9PT11bmRlZmluZWQpe1xucmV0dXJuIGxlZnRCcmFuZDtcbiB9ZWxzZXtcbmxlZnRCcmFuZD09PXJpZ2h0QnJhbmR8fFxuRmFpbCBgVGltZXJCcmFuZHMgbXVzdCBtYXRjaDogJHtxKGxlZnRCcmFuZCl9IHZzICR7cShyaWdodEJyYW5kKX1gO1xucmV0dXJuIGxlZnRCcmFuZDtcbiB9XG4gfTtcblxuLyoqXG4gKiBgc2hhcmVkVGltZXJCcmFuZGAgaXMgaW50ZXJuYWwgdG8gdGhpcyBtb2R1bGUsIGFuZCBpbXBsZW1lbnRzIHRoZVxuICogdHJhbnNpdGlvbmFsIGJyYW5kIGNoZWNraW5nIGFuZCBjb250YWlnaW9uIGxvZ2ljIGV4cGxhaW5lZCBpbiB0aGUgYFRpbWVNYXRoYFxuICogY29tbWVudC4gSXQgaXMgdXNlZCB0byBkZWZpbmUgdGhlIGJpbmFyeSBvcGVyYXRvcnMgdGhhdCBzaG91bGQgZm9sbG93XG4gKiB0aGlzIGxvZ2ljLiBJdCBkb2VzIHRoZSBlcnJvciBjaGVja2luZyBiZXR3ZWVuIHRoZSBvcGVyYW5kcywgYW5kIHJldHVybnNcbiAqIHRoZSBicmFuZCwgaWYgYW55LCB0aGF0IHNob3VsZCBsYWJlbCB0aGUgcmVzdWx0aW5nIHRpbWUgdmFsdWUuXG4gKlxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IGxlZnRcbiAqIEBwYXJhbSB7VGltZXN0YW1wIHwgUmVsYXRpdmVUaW1lfSByaWdodFxuICogQHJldHVybnMge1RpbWVyQnJhbmQgfCB1bmRlZmluZWR9XG4gKi9cbmNvbnN0IHNoYXJlZFRpbWVyQnJhbmQ9KGxlZnQscmlnaHQpPT57XG5jb25zdCBsZWZ0QnJhbmQ9dHlwZW9mIGxlZnQ9PT0nYmlnaW50Jz91bmRlZmluZWQ6bGVmdC50aW1lckJyYW5kO1xuY29uc3QgcmlnaHRCcmFuZD10eXBlb2YgcmlnaHQ9PT0nYmlnaW50Jz91bmRlZmluZWQ6cmlnaHQudGltZXJCcmFuZDtcbnJldHVybiBhZ3JlZWRUaW1lckJyYW5kKGxlZnRCcmFuZCxyaWdodEJyYW5kKTtcbiB9O1xuXG4vKipcbiAqIGBhYnNMaWtlYCBpcyBpbnRlcm5hbCB0byB0aGlzIG1vZHVsZSwgYW5kIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBiaW5hcnlcbiAqIG9wZXJhdG9ycyBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgcmV0dXJuZWQgdGltZSBzaG91bGQgYmUgYSBgVGltZXN0YW1wYFxuICogcmF0aGVyIHRoYW4gYSBgUmVsYXRpdmVUaW1lYC5cbiAqXG4gKiBAcGFyYW0ge1RpbWVzdGFtcCB8IFJlbGF0aXZlVGltZX0gbGVmdFxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IHJpZ2h0XG4gKiBAcGFyYW0ge1RpbWVzdGFtcFZhbHVlfSBhYnNWYWx1ZVxuICogQHJldHVybnMge1RpbWVzdGFtcH1cbiAqL1xuY29uc3QgYWJzTGlrZT0obGVmdCxyaWdodCxhYnNWYWx1ZSk9Pntcbk5hdChhYnNWYWx1ZSk7XG5jb25zdCB0aW1lckJyYW5kPXNoYXJlZFRpbWVyQnJhbmQobGVmdCxyaWdodCk7XG5pZih0aW1lckJyYW5kKXtcbnJldHVybiBoYXJkZW4oe1xudGltZXJCcmFuZCxcbmFic1ZhbHVlfSk7XG5cbiB9ZWxzZXtcbnJldHVybiBhYnNWYWx1ZTtcbiB9XG4gfTtcblxuLyoqXG4gKiBgcmVsTGlrZWAgaXMgaW50ZXJuYWwgdG8gdGhpcyBtb2R1bGUsIGFuZCB1c2VkIHRvIGltcGxlbWVudCB0aGUgYmluYXJ5XG4gKiBvcGVyYXRvcnMgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHJldHVybmVkIHRpbWUgc2hvdWxkIGJlIGEgYFJlbGF0aXZlVGltZWBcbiAqIHJhdGhlciB0aGFuIGEgYFRpbWVzdGFtcGAuXG4gKlxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IGxlZnRcbiAqIEBwYXJhbSB7VGltZXN0YW1wIHwgUmVsYXRpdmVUaW1lfSByaWdodFxuICogQHBhcmFtIHtSZWxhdGl2ZVRpbWVWYWx1ZX0gcmVsVmFsdWVcbiAqIEByZXR1cm5zIHtSZWxhdGl2ZVRpbWV9XG4gKi9cbmNvbnN0IHJlbExpa2U9KGxlZnQscmlnaHQscmVsVmFsdWUpPT57XG5OYXQocmVsVmFsdWUpO1xuY29uc3QgdGltZXJCcmFuZD1zaGFyZWRUaW1lckJyYW5kKGxlZnQscmlnaHQpO1xuaWYodGltZXJCcmFuZCl7XG5yZXR1cm4gaGFyZGVuKHtcbnRpbWVyQnJhbmQsXG5yZWxWYWx1ZX0pO1xuXG4gfWVsc2V7XG5yZXR1cm4gcmVsVmFsdWU7XG4gfVxuIH07XG5cbi8qIEZvciBhbGwgdGhlIGZvbGxvd2luZyB0aW1lIG9wZXJhdG9ycywgdGhlaXIgZG9jdW1lbnRhdGlvbiBpcyBpbiovXG4vKiB0aGUgYFRpbWVNYXRoVHlwZWAsIHNpbmNlIHRoYXQgaXMgdGhlIGRvY3VtZW50YXRpb24gdGhhdCBzaG93cyB1cCovXG4vKiBpbiB0aGUgSURFLiBXZWxsLCBhdCBsZWFzdCB0aGUgdnNjb2RlIElERS4qL1xuXG5jb25zdCBhYnNWYWx1ZT0oYWJzKT0+XG50eXBlb2YgYWJzPT09J2JpZ2ludCc/TmF0KGFicyk6TmF0KGFicy5hYnNWYWx1ZSk7XG5cbmNvbnN0IHJlbFZhbHVlPShyZWwpPT5cbnR5cGVvZiByZWw9PT0nYmlnaW50Jz9OYXQocmVsKTpOYXQocmVsLnJlbFZhbHVlKTtcblxuY29uc3QgdG9BYnM9KHRzLGJyYW5kPXVuZGVmaW5lZCk9PntcbmlmKHR5cGVvZiB0cz09PSdudW1iZXInKXtcbnRzPU5hdCh0cyk7XG4gfVxuaWYodHlwZW9mIHRzPT09J2JpZ2ludCcpe1xuaWYoYnJhbmQ9PT11bmRlZmluZWQpe1xucmV0dXJuIHRzO1xuIH1lbHNle1xucmV0dXJuIGhhcmRlbih7XG50aW1lckJyYW5kOmJyYW5kLFxuYWJzVmFsdWU6dHN9KTtcblxuIH1cbiB9ZWxzZXtcbmNvbnN0e3RpbWVyQnJhbmR9PXRzO1xuYWdyZWVkVGltZXJCcmFuZCh0aW1lckJyYW5kLGJyYW5kKTtcbm11c3RNYXRjaCh0cyxUaW1lc3RhbXBTaGFwZSwndGltZXN0YW1wJyk7XG5yZXR1cm4gdHM7XG4gfVxuIH07XG5cbmNvbnN0IHRvUmVsPShydCxicmFuZD11bmRlZmluZWQpPT57XG5pZih0eXBlb2YgcnQ9PT0nbnVtYmVyJyl7XG5ydD1OYXQocnQpO1xuIH1cbmlmKHR5cGVvZiBydD09PSdiaWdpbnQnKXtcbmlmKGJyYW5kPT09dW5kZWZpbmVkKXtcbnJldHVybiBydDtcbiB9ZWxzZXtcbnJldHVybiBoYXJkZW4oe1xudGltZXJCcmFuZDpicmFuZCxcbnJlbFZhbHVlOnJ0fSk7XG5cbiB9XG4gfWVsc2V7XG5jb25zdHt0aW1lckJyYW5kfT1ydDtcbmFncmVlZFRpbWVyQnJhbmQodGltZXJCcmFuZCxicmFuZCk7XG5tdXN0TWF0Y2gocnQsUmVsYXRpdmVUaW1lU2hhcGUsJ3JlbGF0aXZlVGltZScpO1xucmV0dXJuIHJ0O1xuIH1cbiB9O1xuXG5jb25zdCBhZGRBYnNSZWw9KGFicyxyZWwpPT5cbmFic0xpa2UoYWJzLHJlbCxhYnNWYWx1ZShhYnMpK3JlbFZhbHVlKHJlbCkpO1xuXG5jb25zdCBhZGRSZWxSZWw9KHJlbDEscmVsMik9PlxucmVsTGlrZShyZWwxLHJlbDIscmVsVmFsdWUocmVsMSkrcmVsVmFsdWUocmVsMikpO1xuXG5jb25zdCBzdWJ0cmFjdEFic0Ficz0oYWJzMSxhYnMyKT0+XG5yZWxMaWtlKGFiczEsYWJzMixhYnNWYWx1ZShhYnMxKS1hYnNWYWx1ZShhYnMyKSk7XG5cbmNvbnN0IGNsYW1wZWRTdWJ0cmFjdEFic0Ficz0oYWJzMSxhYnMyKT0+e1xuY29uc3QgdmFsMT1hYnNWYWx1ZShhYnMxKTtcbmNvbnN0IHZhbDI9YWJzVmFsdWUoYWJzMik7XG5yZXR1cm4gcmVsTGlrZShhYnMxLGFiczIsdmFsMT52YWwyP3ZhbDEtdmFsMjowbik7XG4gfTtcblxuY29uc3Qgc3VidHJhY3RBYnNSZWw9KGFicyxyZWwpPT5cbmFic0xpa2UoYWJzLHJlbCxhYnNWYWx1ZShhYnMpLXJlbFZhbHVlKHJlbCkpO1xuXG5jb25zdCBzdWJ0cmFjdFJlbFJlbD0ocmVsMSxyZWwyKT0+XG5yZWxMaWtlKHJlbDEscmVsMixyZWxWYWx1ZShyZWwxKS1yZWxWYWx1ZShyZWwyKSk7XG5cbmNvbnN0IGlzUmVsWmVybz0ocmVsKT0+cmVsVmFsdWUocmVsKT09PTBuO1xuXG5jb25zdCBtdWx0aXBseVJlbE5hdD0ocmVsLG5hdCk9PnJlbExpa2UocmVsLG5hdCxyZWxWYWx1ZShyZWwpKm5hdCk7XG5cbmNvbnN0IGRpdmlkZVJlbE5hdD0ocmVsLG5hdCk9PnJlbExpa2UocmVsLG5hdCxyZWxWYWx1ZShyZWwpL25hdCk7XG5cbmNvbnN0IGRpdmlkZVJlbFJlbD0ocmVsMSxyZWwyKT0+e1xuc2hhcmVkVGltZXJCcmFuZChyZWwxLHJlbDIpOy8qIGp1c3QgZXJyb3IgY2hlY2sqL1xucmV0dXJuIHJlbFZhbHVlKHJlbDEpL3JlbFZhbHVlKHJlbDIpO1xuIH07XG5cbmNvbnN0IG1vZEFic1JlbD0oYWJzLHN0ZXApPT5cbnJlbExpa2UoYWJzLHN0ZXAsYWJzVmFsdWUoYWJzKSVyZWxWYWx1ZShzdGVwKSk7XG5cbmNvbnN0IG1vZFJlbFJlbD0ocmVsLHN0ZXApPT5cbnJlbExpa2UocmVsLHN0ZXAscmVsVmFsdWUocmVsKSVyZWxWYWx1ZShzdGVwKSk7XG5cbi8qKlxuICogYGNvbXBhcmVWYWx1ZXNgIGlzIGludGVybmFsIHRvIHRoaXMgbW9kdWxlLCBhbmQgdXNlZCB0byBpbXBsZW1lbnRcbiAqIHRoZSB0aW1lIGNvbXBhcmlzb24gb3BlcmF0b3JzLlxuICpcbiAqIEBwYXJhbSB7YmlnaW50fSB2MVxuICogQHBhcmFtIHtiaWdpbnR9IHYyXG4gKiBAcmV0dXJucyB7UmFua0NvbXBhcmlzb259XG4gKi9cbmNvbnN0IGNvbXBhcmVWYWx1ZXM9KHYxLHYyKT0+e1xuaWYodjE8djIpe1xucmV0dXJuLTE7XG4gfWVsc2UgaWYodjE9PT12Mil7XG5yZXR1cm4gMDtcbiB9ZWxzZXtcbmFzc2VydCh2MT52Mik7XG5yZXR1cm4gMTtcbiB9XG4gfTtcblxuLyoqXG4gKiBUaGUgYFRpbWVNYXRoYCBvYmplY3QgcHJvdmlkZXMgaGVscGVyIG1ldGhvZHMgdG8gZG8gYXJpdGhtZXRpYyBvbiBsYWJlbGVkXG4gKiB0aW1lIHZhbHVlcywgbXVjaCBsaWtlIGBBbW91bnRNYXRoYCBwcm92aWRlcyBoZWxwZXIgbWV0aG9kcyB0byBkbyBhcml0aG1ldGljXG4gKiBvbiBsYWJlbGVkIGFzc2V0L21vbmV5IHZhbHVlcy4gQm90aCBjaGVjayBmb3IgY29uc2lzdGVuY3kgb2YgbGFiZWxzOiBhXG4gKiBiaW5hcnkgb3BlcmF0aW9uIG9uIHR3byBsYWJlbGVkIG9iamVjdHMgZW5zdXJlcyB0aGF0IHRoZSBib3RoIGNhcnJ5XG4gKiB0aGUgc2FtZSBsYWJlbC4gSWYgdGhleSBwcm9kdWNlIGFub3RoZXIgb2JqZWN0IGZyb20gdGhlIHNhbWUgZG9tYWluLCBpdFxuICogd2lsbCBjYXJyeSB0aGUgc2FtZSBsYWJlbC4gSWYgdGhlIG9wZXJhbmRzIGhhdmUgaW5jb21wYXRpYmxlIGxhYmVscyxcbiAqIGFuIGVycm9yIGlzIHRocm93bi5cbiAqXG4gKiBVbmxpa2UgYW1vdW50IGFyaXRobWV0aWMsIHRpbWUgYXJpdGhtZXRpYyBkZWFscyBpbiB0d28ga2luZHMgb2YgdGltZSBvYmplY3RzOlxuICogVGltZXN0YW1wcywgd2hpY2ggcmVwcmVzZW50IGFic29sdXRlIHRpbWUsIGFuZCBSZWxhdGl2ZVRpbWUsIHdoaWNoIHJlcHJlc2VudHNcbiAqIHRoZSBkdXJhdGlvbiBiZXR3ZWVuIHR3byBhYnNvbHV0ZSB0aW1lcy4gQm90aCBraW5kcyBvZiB0aW1lIG9iamVjdFxuICogYXJlIGxhYmVsZWQgYnkgYSBgVGltZXJCcmFuZGAuIEZvciBhIFRpbWVzdGFtcCBvYmplY3QsIHRoZSB2YWx1ZSBpc1xuICogYSBiaWdpbnQgaW4gYW4gYGFic1ZhbHVlYCBwcm9wZXJ0eS4gRm9yIGEgUmVsYXRpdmVUaW1lIG9iamVjdCwgdGhlIHZhbHVlXG4gKiBpcyBhIGJpZ2ludCBpbiBhIGByZWxWYWx1ZWAgcHJvcGVydHkuIFRodXMgd2UgaGF2ZSBhIHJ1bnRpbWUgc2FmZXR5IGNoZWNrXG4gKiB0byBlbnN1cmUgdGhhdCB3ZSBkb24ndCBjb25mdXNlZCB0aGUgdHdvLCBldmVuIGlmIHdlIGhhdmUgbWFuYWdlZCB0byBmb29sXG4gKiB0aGUgKHVuc291bmQpIHN0YXRpYyB0eXBlIHN5c3RlbS5cbiAqXG4gKiBBcyBhIHRyYW5zaXRpb25hbCBtZWFzdXJlLCBjdXJyZW50bHkgbWFueSBUaW1lc3RhbXBzIGFuZCBSZWxhdGl2ZVRpbWVzIGFyZVxuICogc3RpbGwgcmVwcmVzZW50ZWQgYnkgdW5sYWJlbGVkIGJpZ2ludHMuIER1cmluZyB0aGlzIHRyYW5zaXRpb25hbCBwZXJpb2QsXG4gKiB3ZSBhbGxvdyB0aGlzLCBib3RoIHN0YXRpY2FsbHkgYW5kIGR5bmFtaWNhbGx5LiBGb3IgYSBub3JtYWwgYmluYXJ5XG4gKiBvcGVyYXRpb24sIGlmIGJvdGggaW5wdXRzIGFyZSBsYWJlbGVkLCB0aGVuIHdlIGRvIHRoZSBmdWxsIGNoZWNraW5nIGFzXG4gKiBleHBsYWluZWQgYWJvdmUgYW5kIHJldHVybiBhIGxhYmVsZWQgcmVzdWx0LiBJZiBib3RoIGlucHV0cyBhcmUgdW5sYWJlbGVkXG4gKiBiaWdpbnRzLCB3ZSAqYXNzdW1lKiB0aGF0IHRoZXkgaW5kaWNhdGUgYSB0aW1lIG9mIHRoZSByaWdodCBraW5kXG4gKiAoVGltZXN0YW1wIHZzIFJlbGF0aXZlVGltZSkgYW5kIHRpbWVyIGJyYW5kLiBTaW5jZSB3ZSBkb24ndCBrbm93IHdoYXRcbiAqIGJyYW5kIHdhcyBpbnRlbmRlZCwgd2UgY2FuIG9ubHkgcmV0dXJuIHlldCBhbm90aGVyIHVubGFiZWxlZCBiaWdpbnQuXG4gKlxuICogSWYgb25lIG9wZXJhbmQgaXMgbGFiZWxlZCBhbmQgdGhlIG90aGVyIGlzIG5vdCwgd2UgY2hlY2sgdGhlIGxhYmVsZWQgb3BlcmFuZCxcbiAqICphc3N1bWUqIHRoZSB1bmxhYmVsZWQgYmlnaW50IHJlcHJlc2VudHMgdGhlIHZhbHVlIG5lZWRlZCBmb3IgdGhlIG90aGVyXG4gKiBvcGVyYW5kLCBhbmQgcmV0dXJuIGEgbGFiZWxlZCB0aW1lIG9iamVjdCB3aXRoIHRoZSBicmFuZCBvZiB0aGUgbGFiZWxlZFxuICogb3BlcmFuZC5cbiAqXG4gKiBAdHlwZSB7VGltZU1hdGhUeXBlfVxuICovXG5jb25zdCAgICAgICAgVGltZU1hdGg9aGFyZGVuKHtcbmFic1ZhbHVlLFxucmVsVmFsdWUsXG50b0FicyxcbnRvUmVsLFxuYWRkQWJzUmVsLFxuYWRkUmVsUmVsLFxuc3VidHJhY3RBYnNBYnMsXG5jbGFtcGVkU3VidHJhY3RBYnNBYnMsXG5zdWJ0cmFjdEFic1JlbCxcbnN1YnRyYWN0UmVsUmVsLFxuaXNSZWxaZXJvLFxubXVsdGlwbHlSZWxOYXQsXG5kaXZpZGVSZWxOYXQsXG5kaXZpZGVSZWxSZWwsXG5tb2RBYnNSZWwsXG5tb2RSZWxSZWwsXG5jb21wYXJlQWJzOihhYnMxLGFiczIpPT5jb21wYXJlVmFsdWVzKGFic1ZhbHVlKGFiczEpLGFic1ZhbHVlKGFiczIpKSxcbmNvbXBhcmVSZWw6KHJlbDEscmVsMik9PmNvbXBhcmVWYWx1ZXMocmVsVmFsdWUocmVsMSkscmVsVmFsdWUocmVsMikpfSk7JGjigI1fb25jZS5UaW1lTWF0aChUaW1lTWF0aCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiVGltZU1hdGgiOlsiVGltZU1hdGgiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA0kaFHZIHAACSBwAAJQAAAEBhZ29yaWMvdGltZS12MC4yLjEvc3JjL3R5cGVHdWFyZHMuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbIlJlbGF0aXZlVGltZVJlY29yZFNoYXBlIiwiUmVsYXRpdmVUaW1lU2hhcGUiLCJSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlIiwiVGltZXJCcmFuZFNoYXBlIiwiVGltZXJTZXJ2aWNlU2hhcGUiLCJUaW1lc3RhbXBSZWNvcmRTaGFwZSIsIlRpbWVzdGFtcFNoYXBlIiwiVGltZXN0YW1wVmFsdWVTaGFwZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBNOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuY29uc3QgICAgICAgIFRpbWVyQnJhbmRTaGFwZT1NLnJlbW90YWJsZSgnVGltZXJCcmFuZCcpOyRo4oCNX29uY2UuVGltZXJCcmFuZFNoYXBlKFRpbWVyQnJhbmRTaGFwZSk7XG5jb25zdCAgICAgICAgVGltZXN0YW1wVmFsdWVTaGFwZT1NLm5hdCgpOyRo4oCNX29uY2UuVGltZXN0YW1wVmFsdWVTaGFwZShUaW1lc3RhbXBWYWx1ZVNoYXBlKTtcbmNvbnN0ICAgICAgICBSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlPU0ubmF0KCk7LyogU2hvdWxkIHdlIGFsbG93IG5lZ2F0aXZlcz8qLyRo4oCNX29uY2UuUmVsYXRpdmVUaW1lVmFsdWVTaGFwZShSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlKTtcblxuY29uc3QgICAgICAgIFRpbWVzdGFtcFJlY29yZFNoYXBlPWhhcmRlbih7XG50aW1lckJyYW5kOlRpbWVyQnJhbmRTaGFwZSxcbmFic1ZhbHVlOlRpbWVzdGFtcFZhbHVlU2hhcGV9KTskaOKAjV9vbmNlLlRpbWVzdGFtcFJlY29yZFNoYXBlKFRpbWVzdGFtcFJlY29yZFNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGU9aGFyZGVuKHtcbnRpbWVyQnJhbmQ6VGltZXJCcmFuZFNoYXBlLFxucmVsVmFsdWU6UmVsYXRpdmVUaW1lVmFsdWVTaGFwZX0pOyRo4oCNX29uY2UuUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUoUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBUaW1lc3RhbXBTaGFwZT1NLm9yKFRpbWVzdGFtcFJlY29yZFNoYXBlLFRpbWVzdGFtcFZhbHVlU2hhcGUpOyRo4oCNX29uY2UuVGltZXN0YW1wU2hhcGUoVGltZXN0YW1wU2hhcGUpO1xuY29uc3QgICAgICAgIFJlbGF0aXZlVGltZVNoYXBlPU0ub3IoXG5SZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSxcblJlbGF0aXZlVGltZVZhbHVlU2hhcGUpOyRo4oCNX29uY2UuUmVsYXRpdmVUaW1lU2hhcGUoUmVsYXRpdmVUaW1lU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBUaW1lclNlcnZpY2VTaGFwZT1NLnJlbW90YWJsZSgnVGltZXJTZXJ2aWNlJyk7JGjigI1fb25jZS5UaW1lclNlcnZpY2VTaGFwZShUaW1lclNlcnZpY2VTaGFwZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiVGltZXJCcmFuZFNoYXBlIjpbIlRpbWVyQnJhbmRTaGFwZSJdLCJUaW1lc3RhbXBWYWx1ZVNoYXBlIjpbIlRpbWVzdGFtcFZhbHVlU2hhcGUiXSwiUmVsYXRpdmVUaW1lVmFsdWVTaGFwZSI6WyJSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlIl0sIlRpbWVzdGFtcFJlY29yZFNoYXBlIjpbIlRpbWVzdGFtcFJlY29yZFNoYXBlIl0sIlJlbGF0aXZlVGltZVJlY29yZFNoYXBlIjpbIlJlbGF0aXZlVGltZVJlY29yZFNoYXBlIl0sIlRpbWVzdGFtcFNoYXBlIjpbIlRpbWVzdGFtcFNoYXBlIl0sIlJlbGF0aXZlVGltZVNoYXBlIjpbIlJlbGF0aXZlVGltZVNoYXBlIl0sIlRpbWVyU2VydmljZVNoYXBlIjpbIlRpbWVyU2VydmljZVNoYXBlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMWKZsP/KAAA/ygAACgAAABAYWdvcmljL3ZhdC1kYXRhLXYwLjQuMy9zcmMvZXhvLXV0aWxzLmpzeyJpbXBvcnRzIjpbIi4vdmF0LWRhdGEtYmluZGluZ3MuanMiLCJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiZGVmaW5lRHVyYWJsZUV4b0NsYXNzIiwiZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0IiwiZGVmaW5lVmlydHVhbEV4b0NsYXNzIiwiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0IiwiaWdub3JlQ29udGV4dCIsIm1ha2VFeG9VdGlscyIsInByZXBhcmVFeG8iLCJwcmVwYXJlRXhvQ2xhc3MiLCJwcmVwYXJlRXhvQ2xhc3NLaXQiLCJwcmVwYXJlS2luZCIsInByZXBhcmVLaW5kTXVsdGkiLCJwcmVwYXJlU2luZ2xldG9uIiwicHJvdmlkZUtpbmRIYW5kbGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaW5pdEVtcHR5LHByb3ZpZGUsZ2xvYmFsVmF0RGF0YTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJpbml0RW1wdHlcIiwgWyRo4oCNX2EgPT4gKGluaXRFbXB0eSA9ICRo4oCNX2EpXV1dXSxbXCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzXCIsIFtbXCJwcm92aWRlXCIsIFskaOKAjV9hID0+IChwcm92aWRlID0gJGjigI1fYSldXSxbXCJWYXREYXRhXCIsIFskaOKAjV9hID0+IChnbG9iYWxWYXREYXRhID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG4vKiogQHRlbXBsYXRlIEwsUiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLlJlbW90YWJsZUJyYW5kPEwsIFI+fSBSZW1vdGFibGVCcmFuZCAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9mYXInKS5FUmVmPFQ+fSBFUmVmICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5CYWdnYWdlfSBCYWdnYWdlICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5EZWZpbmVLaW5kT3B0aW9uczxUPn0gRGVmaW5lS2luZE9wdGlvbnMgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLktpbmRGYWNldDxUPn0gS2luZEZhY2V0ICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5LaW5kRmFjZXRzPFQ+fSBLaW5kRmFjZXRzICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5EdXJhYmxlS2luZEhhbmRsZX0gRHVyYWJsZUtpbmRIYW5kbGUgKi9cblxuLyoqXG4gKiBNYWtlIGEgdmVyc2lvbiBvZiB0aGUgYXJndW1lbnQgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIGtpbmQgY29udGV4dCBidXRcbiAqIGlnbm9yZXMgaXQuXG4gKlxuICogQHR5cGUgezxUIGV4dGVuZHMgRnVuY3Rpb24+KGZuOiBUKSA9PiBYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGx1c0NvbnRleHQ8bmV2ZXIsIFQ+fVxuICovXG5jb25zdCAgICAgICAgaWdub3JlQ29udGV4dD1cbihmbik9PlxuKF9jb250ZXh0LC4uLmFyZ3MpPT5cbmZuKC4uLmFyZ3MpOyRo4oCNX29uY2UuaWdub3JlQ29udGV4dChpZ25vcmVDb250ZXh0KTtcbmhhcmRlbihpZ25vcmVDb250ZXh0KTtcblxuLyogVE9ETzogRmluZCBhIGdvb2QgaG9tZSBmb3IgdGhpcyBmdW5jdGlvbiB1c2VkIGJ5IEBhZ29yaWMvdmF0LWRhdGEgYW5kIHRlc3RpbmcgY29kZSovXG5jb25zdCAgICAgICAgbWFrZUV4b1V0aWxzPShWYXREYXRhKT0+e1xuY29uc3R7XG5kZWZpbmVLaW5kLFxuZGVmaW5lS2luZE11bHRpLFxuZGVmaW5lRHVyYWJsZUtpbmQsXG5kZWZpbmVEdXJhYmxlS2luZE11bHRpLFxubWFrZUtpbmRIYW5kbGV9PVxuVmF0RGF0YTtcblxuLyoqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHJldHVybnMge0R1cmFibGVLaW5kSGFuZGxlfVxuICovXG5jb25zdCBwcm92aWRlS2luZEhhbmRsZT0oYmFnZ2FnZSxraW5kTmFtZSk9PlxucHJvdmlkZShiYWdnYWdlLCBgJHtraW5kTmFtZX1fa2luZEhhbmRsZWAsKCk9Pm1ha2VLaW5kSGFuZGxlKGtpbmROYW1lKSk7XG5oYXJkZW4ocHJvdmlkZUtpbmRIYW5kbGUpO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBwcmVwYXJlRXhvQ2xhc3MgaW5zdGVhZFxuICogQHR5cGUge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QcmVwYXJlS2luZH1cbiAqL1xuY29uc3QgcHJlcGFyZUtpbmQ9KFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxuaW5pdCxcbmJlaGF2aW9yLFxub3B0aW9ucz11bmRlZmluZWQpPT5cblxuZGVmaW5lRHVyYWJsZUtpbmQoXG5wcm92aWRlS2luZEhhbmRsZShiYWdnYWdlLGtpbmROYW1lKSxcbmluaXQsXG5iZWhhdmlvcixcbm9wdGlvbnMpO1xuXG5oYXJkZW4ocHJlcGFyZUtpbmQpO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBwcmVwYXJlRXhvQ2xhc3NLaXQgaW5zdGVhZFxuICogQHR5cGUge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QcmVwYXJlS2luZE11bHRpfVxuICovXG5jb25zdCBwcmVwYXJlS2luZE11bHRpPShcbmJhZ2dhZ2UsXG5raW5kTmFtZSxcbmluaXQsXG5iZWhhdmlvcixcbm9wdGlvbnM9dW5kZWZpbmVkKT0+XG5cbmRlZmluZUR1cmFibGVLaW5kTXVsdGkoXG5wcm92aWRlS2luZEhhbmRsZShiYWdnYWdlLGtpbmROYW1lKSxcbmluaXQsXG5iZWhhdmlvcixcbm9wdGlvbnMpO1xuXG5oYXJkZW4ocHJlcGFyZUtpbmRNdWx0aSk7XG5cbi8qIFRPRE8gaW50ZXJmYWNlR3VhcmQgdHlwZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzYyMDYqL1xuLyoqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnkpID0+IGFueX0gSSBpbml0IHN0YXRlIGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUgVCBiZWhhdmlvclxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHthbnl9IGludGVyZmFjZUd1YXJkXG4gKiBAcGFyYW0ge0l9IGluaXRcbiAqIEBwYXJhbSB7VCAmIFRoaXNUeXBlPHsgc2VsZjogVCwgc3RhdGU6IFJldHVyblR5cGU8ST4gfT59IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8eyBzZWxmOiBULCBzdGF0ZTogUmV0dXJuVHlwZTxJPiB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IChUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+KX1cbiAqL1xuY29uc3QgZGVmaW5lVmlydHVhbEV4b0NsYXNzPSh0YWcsaW50ZXJmYWNlR3VhcmQsaW5pdCxtZXRob2RzLG9wdGlvbnMpPT5cbmRlZmluZUtpbmQodGFnLGluaXQsbWV0aG9kcyx7XG4uLi5vcHRpb25zLFxudGhpc2Z1bE1ldGhvZHM6dHJ1ZSxcbmludGVyZmFjZUd1YXJkfSk7XG5cbmhhcmRlbihkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MpO1xuXG4vKiBUT0RPIGludGVyZmFjZUd1YXJkIHR5cGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MjA2Ki9cbi8qKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55KSA9PiBhbnl9IEkgaW5pdCBzdGF0ZSBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPj59IFQgZmFjZXRzXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRLaXRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICYgVGhpc1R5cGU8eyBmYWNldHM6IFQsIHN0YXRlOiBSZXR1cm5UeXBlPEk+IH0+IH0gZmFjZXRzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHsgZmFjZXRzOiBULCBzdGF0ZTogUmV0dXJuVHlwZTxJPiB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IChUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+KX1cbiAqL1xuY29uc3QgZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0PShcbnRhZyxcbmludGVyZmFjZUd1YXJkS2l0LFxuaW5pdCxcbmZhY2V0cyxcbm9wdGlvbnMpPT5cblxuZGVmaW5lS2luZE11bHRpKHRhZyxpbml0LGZhY2V0cyx7XG4uLi5vcHRpb25zLFxudGhpc2Z1bE1ldGhvZHM6dHJ1ZSxcbmludGVyZmFjZUd1YXJkOmludGVyZmFjZUd1YXJkS2l0fSk7XG5cbmhhcmRlbihkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQpO1xuXG4vKiBUT0RPIGludGVyZmFjZUd1YXJkIHR5cGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MjA2Ki9cbi8qKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55KSA9PiBhbnl9IEkgaW5pdCBzdGF0ZSBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPn0gVCBtZXRob2RzXG4gKiBAcGFyYW0ge0R1cmFibGVLaW5kSGFuZGxlfSBraW5kSGFuZGxlXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICYgVGhpc1R5cGU8eyBzZWxmOiBULCBzdGF0ZTogUmV0dXJuVHlwZTxJPiB9Pn0gbWV0aG9kc1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7IHNlbGY6IFQsIHN0YXRlOiBSZXR1cm5UeXBlPEk+IH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gKFQgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD4pfVxuICovXG5jb25zdCBkZWZpbmVEdXJhYmxlRXhvQ2xhc3M9KFxua2luZEhhbmRsZSxcbmludGVyZmFjZUd1YXJkLFxuaW5pdCxcbm1ldGhvZHMsXG5vcHRpb25zKT0+XG5cbmRlZmluZUR1cmFibGVLaW5kKGtpbmRIYW5kbGUsaW5pdCxtZXRob2RzLHtcbi4uLm9wdGlvbnMsXG50aGlzZnVsTWV0aG9kczp0cnVlLFxuaW50ZXJmYWNlR3VhcmR9KTtcblxuaGFyZGVuKGRlZmluZUR1cmFibGVFeG9DbGFzcyk7XG5cbi8qIFRPRE8gaW50ZXJmYWNlR3VhcmQgdHlwZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzYyMDYqL1xuLyoqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnkpID0+IGFueX0gSSBpbml0IHN0YXRlIGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+Pn0gVCBmYWNldHNcbiAqIEBwYXJhbSB7RHVyYWJsZUtpbmRIYW5kbGV9IGtpbmRIYW5kbGVcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZEtpdFxuICogQHBhcmFtIHtJfSBpbml0XG4gKiBAcGFyYW0ge1QgJiBUaGlzVHlwZTx7IGZhY2V0czogVCwgc3RhdGU6IFJldHVyblR5cGU8ST59PiB9IGZhY2V0c1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7IGZhY2V0czogVCwgc3RhdGU6IFJldHVyblR5cGU8ST59Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IChUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+KX1cbiAqL1xuY29uc3QgZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0PShcbmtpbmRIYW5kbGUsXG5pbnRlcmZhY2VHdWFyZEtpdCxcbmluaXQsXG5mYWNldHMsXG5vcHRpb25zKT0+XG5cbmRlZmluZUR1cmFibGVLaW5kTXVsdGkoa2luZEhhbmRsZSxpbml0LGZhY2V0cyx7XG4uLi5vcHRpb25zLFxudGhpc2Z1bE1ldGhvZHM6dHJ1ZSxcbmludGVyZmFjZUd1YXJkOmludGVyZmFjZUd1YXJkS2l0fSk7XG5cbmhhcmRlbihkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQpO1xuXG4vKiBUT0RPIGludGVyZmFjZUd1YXJkIHR5cGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MjA2Ki9cbi8qKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55KSA9PiBhbnl9IEkgaW5pdCBzdGF0ZSBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPn0gVCBtZXRob2RzXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHBhcmFtIHthbnl9IGludGVyZmFjZUd1YXJkXG4gKiBAcGFyYW0ge0l9IGluaXRcbiAqIEBwYXJhbSB7VCAmIFRoaXNUeXBlPHsgc2VsZjogVCwgc3RhdGU6IFJldHVyblR5cGU8ST4gfT59IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8eyBzZWxmOiBULCBzdGF0ZTogUmV0dXJuVHlwZTxJPiB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IChUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+KX1cbiAqL1xuY29uc3QgcHJlcGFyZUV4b0NsYXNzPShcbmJhZ2dhZ2UsXG5raW5kTmFtZSxcbmludGVyZmFjZUd1YXJkLFxuaW5pdCxcbm1ldGhvZHMsXG5vcHRpb25zPXVuZGVmaW5lZCk9PlxuXG5kZWZpbmVEdXJhYmxlRXhvQ2xhc3MoXG5wcm92aWRlS2luZEhhbmRsZShiYWdnYWdlLGtpbmROYW1lKSxcbmludGVyZmFjZUd1YXJkLFxuaW5pdCxcbm1ldGhvZHMsXG5vcHRpb25zKTtcblxuaGFyZGVuKHByZXBhcmVFeG9DbGFzcyk7XG5cbi8qIFRPRE8gaW50ZXJmYWNlR3VhcmQgdHlwZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzYyMDYqL1xuLyoqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnkpID0+IGFueX0gSSBpbml0IHN0YXRlIGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+Pn0gVCBmYWNldHNcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IGtpbmROYW1lXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRLaXRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICYgVGhpc1R5cGU8eyBmYWNldHM6IFQsIHN0YXRlOiBSZXR1cm5UeXBlPEk+IH0+IH0gZmFjZXRzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHsgZmFjZXRzOiBULCBzdGF0ZTogUmV0dXJuVHlwZTxJPiB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IChUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+KX1cbiAqL1xuY29uc3QgcHJlcGFyZUV4b0NsYXNzS2l0PShcbmJhZ2dhZ2UsXG5raW5kTmFtZSxcbmludGVyZmFjZUd1YXJkS2l0LFxuaW5pdCxcbmZhY2V0cyxcbm9wdGlvbnM9dW5kZWZpbmVkKT0+XG5cbmRlZmluZUR1cmFibGVFeG9DbGFzc0tpdChcbnByb3ZpZGVLaW5kSGFuZGxlKGJhZ2dhZ2Usa2luZE5hbWUpLFxuaW50ZXJmYWNlR3VhcmRLaXQsXG5pbml0LFxuZmFjZXRzLFxub3B0aW9ucyk7XG5cbmhhcmRlbihwcmVwYXJlRXhvQ2xhc3NLaXQpO1xuXG4vKiBUT0RPIGludGVyZmFjZUd1YXJkIHR5cGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MjA2Ki9cbi8qKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPn0gTSBtZXRob2RzXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHBhcmFtIHthbnl9IGludGVyZmFjZUd1YXJkXG4gKiBAcGFyYW0ge019IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8eyBzZWxmOiBNIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtNICYgUmVtb3RhYmxlQnJhbmQ8e30sIE0+fVxuICovXG5jb25zdCBwcmVwYXJlRXhvPShcbmJhZ2dhZ2UsXG5raW5kTmFtZSxcbmludGVyZmFjZUd1YXJkLFxubWV0aG9kcyxcbm9wdGlvbnM9dW5kZWZpbmVkKT0+XG57XG5jb25zdCBtYWtlU2luZ2xldG9uPXByZXBhcmVFeG9DbGFzcyhcbmJhZ2dhZ2UsXG5raW5kTmFtZSxcbmludGVyZmFjZUd1YXJkLFxuaW5pdEVtcHR5LFxubWV0aG9kcyxcbm9wdGlvbnMpO1xuXG5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLXRzLWV4cGVjdC1lcnJvciAtLSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQ2MjAqL1xuLyogQHRzLWlnbm9yZSBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhbiBhcmJpdHJhcnkgdHlwZSovXG5yZXR1cm4gcHJvdmlkZShiYWdnYWdlLCBgdGhlXyR7a2luZE5hbWV9YCwoKT0+bWFrZVNpbmdsZXRvbigpKTtcbiB9O1xuaGFyZGVuKHByZXBhcmVFeG8pO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj59IE0gbWV0aG9kc1xuICogQGRlcHJlY2F0ZWQgVXNlIHByZXBhcmVFeG8gaW5zdGVhZC5cbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IGtpbmROYW1lXG4gKiBAcGFyYW0ge019IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8eyBzZWxmOiBNIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtNICYgUmVtb3RhYmxlQnJhbmQ8e30sIE0+fVxuICovXG5jb25zdCBwcmVwYXJlU2luZ2xldG9uPShiYWdnYWdlLGtpbmROYW1lLG1ldGhvZHMsb3B0aW9ucz11bmRlZmluZWQpPT5cbnByZXBhcmVFeG8oYmFnZ2FnZSxraW5kTmFtZSx1bmRlZmluZWQsbWV0aG9kcyxvcHRpb25zKTtcbmhhcmRlbihwcmVwYXJlU2luZ2xldG9uKTtcblxucmV0dXJuIGhhcmRlbih7XG5kZWZpbmVWaXJ0dWFsRXhvQ2xhc3MsXG5kZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQsXG5kZWZpbmVEdXJhYmxlRXhvQ2xhc3MsXG5kZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQsXG5wcmVwYXJlRXhvQ2xhc3MsXG5wcmVwYXJlRXhvQ2xhc3NLaXQsXG5wcmVwYXJlRXhvLFxucHJlcGFyZVNpbmdsZXRvbixcblxucHJvdmlkZUtpbmRIYW5kbGUsXG5wcmVwYXJlS2luZCxcbnByZXBhcmVLaW5kTXVsdGl9KTtcblxuIH07JGjigI1fb25jZS5tYWtlRXhvVXRpbHMobWFrZUV4b1V0aWxzKTtcblxuY29uc3QgZ2xvYmFsRXhvVXRpbHM9bWFrZUV4b1V0aWxzKGdsb2JhbFZhdERhdGEpO1xuXG5jb25zdCAgICAgICB7XG5kZWZpbmVWaXJ0dWFsRXhvQ2xhc3MsXG5kZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQsXG5kZWZpbmVEdXJhYmxlRXhvQ2xhc3MsXG5kZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQsXG5wcmVwYXJlRXhvQ2xhc3MsXG5wcmVwYXJlRXhvQ2xhc3NLaXQsXG5wcmVwYXJlRXhvLFxucHJlcGFyZVNpbmdsZXRvbn09XG5nbG9iYWxFeG9VdGlscztcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgRXhvcy9FeG9DbGFzc2VzIGluc3RlYWQgb2YgS2luZHNcbiAqLyRo4oCNX29uY2UuZGVmaW5lVmlydHVhbEV4b0NsYXNzKGRlZmluZVZpcnR1YWxFeG9DbGFzcyk7JGjigI1fb25jZS5kZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQoZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0KTskaOKAjV9vbmNlLmRlZmluZUR1cmFibGVFeG9DbGFzcyhkZWZpbmVEdXJhYmxlRXhvQ2xhc3MpOyRo4oCNX29uY2UuZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0KGRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCk7JGjigI1fb25jZS5wcmVwYXJlRXhvQ2xhc3MocHJlcGFyZUV4b0NsYXNzKTskaOKAjV9vbmNlLnByZXBhcmVFeG9DbGFzc0tpdChwcmVwYXJlRXhvQ2xhc3NLaXQpOyRo4oCNX29uY2UucHJlcGFyZUV4byhwcmVwYXJlRXhvKTskaOKAjV9vbmNlLnByZXBhcmVTaW5nbGV0b24ocHJlcGFyZVNpbmdsZXRvbik7XG5jb25zdCAgICAgICB7cHJvdmlkZUtpbmRIYW5kbGUscHJlcGFyZUtpbmQscHJlcGFyZUtpbmRNdWx0aX09XG5nbG9iYWxFeG9VdGlsczskaOKAjV9vbmNlLnByb3ZpZGVLaW5kSGFuZGxlKHByb3ZpZGVLaW5kSGFuZGxlKTskaOKAjV9vbmNlLnByZXBhcmVLaW5kKHByZXBhcmVLaW5kKTskaOKAjV9vbmNlLnByZXBhcmVLaW5kTXVsdGkocHJlcGFyZUtpbmRNdWx0aSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaWdub3JlQ29udGV4dCI6WyJpZ25vcmVDb250ZXh0Il0sIm1ha2VFeG9VdGlscyI6WyJtYWtlRXhvVXRpbHMiXSwiZGVmaW5lVmlydHVhbEV4b0NsYXNzIjpbImRlZmluZVZpcnR1YWxFeG9DbGFzcyJdLCJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQiOlsiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0Il0sImRlZmluZUR1cmFibGVFeG9DbGFzcyI6WyJkZWZpbmVEdXJhYmxlRXhvQ2xhc3MiXSwiZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0IjpbImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCJdLCJwcmVwYXJlRXhvQ2xhc3MiOlsicHJlcGFyZUV4b0NsYXNzIl0sInByZXBhcmVFeG9DbGFzc0tpdCI6WyJwcmVwYXJlRXhvQ2xhc3NLaXQiXSwicHJlcGFyZUV4byI6WyJwcmVwYXJlRXhvIl0sInByZXBhcmVTaW5nbGV0b24iOlsicHJlcGFyZVNpbmdsZXRvbiJdLCJwcm92aWRlS2luZEhhbmRsZSI6WyJwcm92aWRlS2luZEhhbmRsZSJdLCJwcmVwYXJlS2luZCI6WyJwcmVwYXJlS2luZCJdLCJwcmVwYXJlS2luZE11bHRpIjpbInByZXBhcmVLaW5kTXVsdGkiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAN+OMsmUTAABlEwAAJAAAAEBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL2V4by11dGlscy5qcyIsIi4vdmF0LWRhdGEtYmluZGluZ3MuanMiLCJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiTSIsImNhbkJlRHVyYWJsZSIsImRlZmluZUR1cmFibGVFeG9DbGFzcyIsImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCIsImRlZmluZUR1cmFibGVLaW5kIiwiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSIsImRlZmluZUtpbmQiLCJkZWZpbmVLaW5kTXVsdGkiLCJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MiLCJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQiLCJpZ25vcmVDb250ZXh0IiwibWFrZUtpbmRIYW5kbGUiLCJtYWtlU2NhbGFyQmlnTWFwU3RvcmUiLCJtYWtlU2NhbGFyQmlnU2V0U3RvcmUiLCJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSIsIm1ha2VTY2FsYXJNYXBTdG9yZSIsIm1ha2VTY2FsYXJTZXRTdG9yZSIsIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiLCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIiwicGFydGlhbEFzc2lnbiIsInBpY2tGYWNldCIsInByZXBhcmVFeG8iLCJwcmVwYXJlRXhvQ2xhc3MiLCJwcmVwYXJlRXhvQ2xhc3NLaXQiLCJwcmVwYXJlS2luZCIsInByZXBhcmVLaW5kTXVsdGkiLCJwcmVwYXJlU2luZ2xldG9uIiwicHJvdmlkZSIsInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiLCJwcm92aWRlRHVyYWJsZVNldFN0b3JlIiwicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUiLCJwcm92aWRlS2luZEhhbmRsZSIsInByb3ZpZGVQcm9taXNlV2F0Y2hlciIsIndhdGNoUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIiwgWyRo4oCNX2xpdmVbXCJNXCJdXV0sW1wibWFrZVNjYWxhck1hcFN0b3JlXCIsIFskaOKAjV9saXZlW1wibWFrZVNjYWxhck1hcFN0b3JlXCJdXV0sW1wibWFrZVNjYWxhcldlYWtNYXBTdG9yZVwiLCBbJGjigI1fbGl2ZVtcIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmVcIl1dXSxbXCJtYWtlU2NhbGFyU2V0U3RvcmVcIiwgWyRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyU2V0U3RvcmVcIl1dXSxbXCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlXCIsIFskaOKAjV9saXZlW1wibWFrZVNjYWxhcldlYWtTZXRTdG9yZVwiXV1dXV0sW1wiLi92YXQtZGF0YS1iaW5kaW5ncy5qc1wiLCBbW1wibWFrZUtpbmRIYW5kbGVcIiwgWyRo4oCNX2xpdmVbXCJtYWtlS2luZEhhbmRsZVwiXV1dLFtcInByb3ZpZGVQcm9taXNlV2F0Y2hlclwiLCBbJGjigI1fbGl2ZVtcInByb3ZpZGVQcm9taXNlV2F0Y2hlclwiXV1dLFtcIndhdGNoUHJvbWlzZVwiLCBbJGjigI1fbGl2ZVtcIndhdGNoUHJvbWlzZVwiXV1dLFtcIm1ha2VTY2FsYXJCaWdNYXBTdG9yZVwiLCBbJGjigI1fbGl2ZVtcIm1ha2VTY2FsYXJCaWdNYXBTdG9yZVwiXV1dLFtcIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmVcIiwgWyRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlXCJdXV0sW1wibWFrZVNjYWxhckJpZ1NldFN0b3JlXCIsIFskaOKAjV9saXZlW1wibWFrZVNjYWxhckJpZ1NldFN0b3JlXCJdXV0sW1wibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZVwiLCBbJGjigI1fbGl2ZVtcIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmVcIl1dXSxbXCJjYW5CZUR1cmFibGVcIiwgWyRo4oCNX2xpdmVbXCJjYW5CZUR1cmFibGVcIl1dXSxbXCJwaWNrRmFjZXRcIiwgWyRo4oCNX2xpdmVbXCJwaWNrRmFjZXRcIl1dXSxbXCJwYXJ0aWFsQXNzaWduXCIsIFskaOKAjV9saXZlW1wicGFydGlhbEFzc2lnblwiXV1dLFtcInByb3ZpZGVcIiwgWyRo4oCNX2xpdmVbXCJwcm92aWRlXCJdXV0sW1wicHJvdmlkZUR1cmFibGVNYXBTdG9yZVwiLCBbJGjigI1fbGl2ZVtcInByb3ZpZGVEdXJhYmxlTWFwU3RvcmVcIl1dXSxbXCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZVwiLCBbJGjigI1fbGl2ZVtcInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlXCJdXV0sW1wicHJvdmlkZUR1cmFibGVTZXRTdG9yZVwiLCBbJGjigI1fbGl2ZVtcInByb3ZpZGVEdXJhYmxlU2V0U3RvcmVcIl1dXSxbXCJkZWZpbmVLaW5kXCIsIFskaOKAjV9saXZlW1wiZGVmaW5lS2luZFwiXV1dLFtcImRlZmluZUtpbmRNdWx0aVwiLCBbJGjigI1fbGl2ZVtcImRlZmluZUtpbmRNdWx0aVwiXV1dLFtcImRlZmluZUR1cmFibGVLaW5kXCIsIFskaOKAjV9saXZlW1wiZGVmaW5lRHVyYWJsZUtpbmRcIl1dXSxbXCJkZWZpbmVEdXJhYmxlS2luZE11bHRpXCIsIFskaOKAjV9saXZlW1wiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aVwiXV1dXV0sW1wiLi9leG8tdXRpbHMuanNcIiwgW1tcImRlZmluZVZpcnR1YWxFeG9DbGFzc1wiLCBbJGjigI1fbGl2ZVtcImRlZmluZVZpcnR1YWxFeG9DbGFzc1wiXV1dLFtcImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdFwiLCBbJGjigI1fbGl2ZVtcImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdFwiXV1dLFtcImRlZmluZUR1cmFibGVFeG9DbGFzc1wiLCBbJGjigI1fbGl2ZVtcImRlZmluZUR1cmFibGVFeG9DbGFzc1wiXV1dLFtcImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdFwiLCBbJGjigI1fbGl2ZVtcImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdFwiXV1dLFtcInByZXBhcmVFeG9DbGFzc1wiLCBbJGjigI1fbGl2ZVtcInByZXBhcmVFeG9DbGFzc1wiXV1dLFtcInByZXBhcmVFeG9DbGFzc0tpdFwiLCBbJGjigI1fbGl2ZVtcInByZXBhcmVFeG9DbGFzc0tpdFwiXV1dLFtcInByZXBhcmVFeG9cIiwgWyRo4oCNX2xpdmVbXCJwcmVwYXJlRXhvXCJdXV0sW1wicHJlcGFyZVNpbmdsZXRvblwiLCBbJGjigI1fbGl2ZVtcInByZXBhcmVTaW5nbGV0b25cIl1dXSxbXCJpZ25vcmVDb250ZXh0XCIsIFskaOKAjV9saXZlW1wiaWdub3JlQ29udGV4dFwiXV1dLFtcInByb3ZpZGVLaW5kSGFuZGxlXCIsIFskaOKAjV9saXZlW1wicHJvdmlkZUtpbmRIYW5kbGVcIl1dXSxbXCJwcmVwYXJlS2luZFwiLCBbJGjigI1fbGl2ZVtcInByZXBhcmVLaW5kXCJdXV0sW1wicHJlcGFyZUtpbmRNdWx0aVwiLCBbJGjigI1fbGl2ZVtcInByZXBhcmVLaW5kTXVsdGlcIl1dXV1dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnsiTSI6WyJNIixmYWxzZV0sIm1ha2VTY2FsYXJNYXBTdG9yZSI6WyJtYWtlU2NhbGFyTWFwU3RvcmUiLGZhbHNlXSwibWFrZVNjYWxhcldlYWtNYXBTdG9yZSI6WyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIixmYWxzZV0sIm1ha2VTY2FsYXJTZXRTdG9yZSI6WyJtYWtlU2NhbGFyU2V0U3RvcmUiLGZhbHNlXSwibWFrZVNjYWxhcldlYWtTZXRTdG9yZSI6WyJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIixmYWxzZV0sIm1ha2VLaW5kSGFuZGxlIjpbIm1ha2VLaW5kSGFuZGxlIixmYWxzZV0sInByb3ZpZGVQcm9taXNlV2F0Y2hlciI6WyJwcm92aWRlUHJvbWlzZVdhdGNoZXIiLGZhbHNlXSwid2F0Y2hQcm9taXNlIjpbIndhdGNoUHJvbWlzZSIsZmFsc2VdLCJtYWtlU2NhbGFyQmlnTWFwU3RvcmUiOlsibWFrZVNjYWxhckJpZ01hcFN0b3JlIixmYWxzZV0sIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUiOlsibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSIsZmFsc2VdLCJtYWtlU2NhbGFyQmlnU2V0U3RvcmUiOlsibWFrZVNjYWxhckJpZ1NldFN0b3JlIixmYWxzZV0sIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiOlsibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSIsZmFsc2VdLCJjYW5CZUR1cmFibGUiOlsiY2FuQmVEdXJhYmxlIixmYWxzZV0sInBpY2tGYWNldCI6WyJwaWNrRmFjZXQiLGZhbHNlXSwicGFydGlhbEFzc2lnbiI6WyJwYXJ0aWFsQXNzaWduIixmYWxzZV0sInByb3ZpZGUiOlsicHJvdmlkZSIsZmFsc2VdLCJwcm92aWRlRHVyYWJsZU1hcFN0b3JlIjpbInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiLGZhbHNlXSwicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUiOlsicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUiLGZhbHNlXSwicHJvdmlkZUR1cmFibGVTZXRTdG9yZSI6WyJwcm92aWRlRHVyYWJsZVNldFN0b3JlIixmYWxzZV0sImRlZmluZUtpbmQiOlsiZGVmaW5lS2luZCIsZmFsc2VdLCJkZWZpbmVLaW5kTXVsdGkiOlsiZGVmaW5lS2luZE11bHRpIixmYWxzZV0sImRlZmluZUR1cmFibGVLaW5kIjpbImRlZmluZUR1cmFibGVLaW5kIixmYWxzZV0sImRlZmluZUR1cmFibGVLaW5kTXVsdGkiOlsiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSIsZmFsc2VdLCJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MiOlsiZGVmaW5lVmlydHVhbEV4b0NsYXNzIixmYWxzZV0sImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCI6WyJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQiLGZhbHNlXSwiZGVmaW5lRHVyYWJsZUV4b0NsYXNzIjpbImRlZmluZUR1cmFibGVFeG9DbGFzcyIsZmFsc2VdLCJkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQiOlsiZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0IixmYWxzZV0sInByZXBhcmVFeG9DbGFzcyI6WyJwcmVwYXJlRXhvQ2xhc3MiLGZhbHNlXSwicHJlcGFyZUV4b0NsYXNzS2l0IjpbInByZXBhcmVFeG9DbGFzc0tpdCIsZmFsc2VdLCJwcmVwYXJlRXhvIjpbInByZXBhcmVFeG8iLGZhbHNlXSwicHJlcGFyZVNpbmdsZXRvbiI6WyJwcmVwYXJlU2luZ2xldG9uIixmYWxzZV0sImlnbm9yZUNvbnRleHQiOlsiaWdub3JlQ29udGV4dCIsZmFsc2VdLCJwcm92aWRlS2luZEhhbmRsZSI6WyJwcm92aWRlS2luZEhhbmRsZSIsZmFsc2VdLCJwcmVwYXJlS2luZCI6WyJwcmVwYXJlS2luZCIsZmFsc2VdLCJwcmVwYXJlS2luZE11bHRpIjpbInByZXBhcmVLaW5kTXVsdGkiLGZhbHNlXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA00l1Dk8lAABPJQAAMAAAAEBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zL3NyYy92YXQtZGF0YS1iaW5kaW5ncy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2Fzc2VydCIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJWYXREYXRhIiwiY2FuQmVEdXJhYmxlIiwiZGVmaW5lRHVyYWJsZUtpbmQiLCJkZWZpbmVEdXJhYmxlS2luZE11bHRpIiwiZGVmaW5lS2luZCIsImRlZmluZUtpbmRNdWx0aSIsIm1ha2VLaW5kSGFuZGxlIiwibWFrZVNjYWxhckJpZ01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ1NldFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSIsIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiLCJtYWtlU3RvcmVVdGlscyIsInBhcnRpYWxBc3NpZ24iLCJwaWNrRmFjZXQiLCJwcm92aWRlIiwicHJvdmlkZUR1cmFibGVNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiLCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSIsInByb3ZpZGVQcm9taXNlV2F0Y2hlciIsIndhdGNoUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYWlsLHByb3ZpZGVMYXp5OyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJGYWlsXCIsIFskaOKAjV9hID0+IChGYWlsID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcInByb3ZpZGVMYXp5XCIsIFskaOKAjV9hID0+IChwcm92aWRlTGF6eSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG4vKiogQHR5cGUge1hpbXBvcnQoJy4vdHlwZXMnKS5WYXREYXRhfSAqL1xubGV0IFZhdERhdGFHbG9iYWw7XG5pZignVmF0RGF0YSdpbiBnbG9iYWxUaGlzKXtcbmdsb2JhbFRoaXMuVmF0RGF0YXx8RmFpbCBgVmF0RGF0YSBkZWZpbmVkIGluIGdsb2JhbCBhcyBudWxsIG9yIHVuZGVmaW5lZGA7XG5WYXREYXRhR2xvYmFsPWdsb2JhbFRoaXMuVmF0RGF0YTtcbiB9ZWxzZXtcbi8qIFhYWCB0aGlzIG1vZHVsZSBoYXMgYmVlbiBrbm93biB0byBnZXQgaW1wb3J0ZWQgKHRyYW5zaXRpdmVseSkgaW4gY2FzZXMgdGhhdCovXG4vKiBuZXZlciB1c2UgaXQgc28gd2UgbWFrZSBhIHZlcnNpb24gdGhhdCB3aWxsIHNhdGlzZnkgbW9kdWxlIHJlc29sdXRpb24gYnV0Ki9cbi8qIGZhaWwgYXQgcnVudGltZS4qL1xuY29uc3QgdW52YWlsYWJsZT0oKT0+RmFpbCBgVmF0RGF0YSB1bmF2YWlsYWJsZWA7XG5WYXREYXRhR2xvYmFsPXtcbmRlZmluZUtpbmQ6dW52YWlsYWJsZSxcbmRlZmluZUtpbmRNdWx0aTp1bnZhaWxhYmxlLFxuZGVmaW5lRHVyYWJsZUtpbmQ6dW52YWlsYWJsZSxcbmRlZmluZUR1cmFibGVLaW5kTXVsdGk6dW52YWlsYWJsZSxcbm1ha2VLaW5kSGFuZGxlOnVudmFpbGFibGUsXG5wcm92aWRlUHJvbWlzZVdhdGNoZXI6dW52YWlsYWJsZSxcbndhdGNoUHJvbWlzZTp1bnZhaWxhYmxlLFxubWFrZVNjYWxhckJpZ01hcFN0b3JlOnVudmFpbGFibGUsXG5tYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlOnVudmFpbGFibGUsXG5tYWtlU2NhbGFyQmlnU2V0U3RvcmU6dW52YWlsYWJsZSxcbm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmU6dW52YWlsYWJsZSxcbmNhbkJlRHVyYWJsZTp1bnZhaWxhYmxlfTtcblxuIH1cblxuY29uc3QgVmF0RGF0YUV4cG9ydD1WYXREYXRhR2xvYmFsOyRo4oCNX29uY2UuVmF0RGF0YUV4cG9ydChWYXREYXRhRXhwb3J0KTtcblxuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBFeG9zL0V4b0NsYXNzZXMgaW5zdGVhZCBvZiBLaW5kc1xuICovXG5jb25zdCAgICAgICB7XG5kZWZpbmVLaW5kLFxuZGVmaW5lS2luZE11bHRpLFxuZGVmaW5lRHVyYWJsZUtpbmQsXG5kZWZpbmVEdXJhYmxlS2luZE11bHRpfT1cblZhdERhdGFHbG9iYWw7JGjigI1fb25jZS5kZWZpbmVLaW5kKGRlZmluZUtpbmQpOyRo4oCNX29uY2UuZGVmaW5lS2luZE11bHRpKGRlZmluZUtpbmRNdWx0aSk7JGjigI1fb25jZS5kZWZpbmVEdXJhYmxlS2luZChkZWZpbmVEdXJhYmxlS2luZCk7JGjigI1fb25jZS5kZWZpbmVEdXJhYmxlS2luZE11bHRpKGRlZmluZUR1cmFibGVLaW5kTXVsdGkpO1xuXG5jb25zdCAgICAgICB7XG5tYWtlS2luZEhhbmRsZSxcbnByb3ZpZGVQcm9taXNlV2F0Y2hlcixcbndhdGNoUHJvbWlzZSxcbm1ha2VTY2FsYXJCaWdNYXBTdG9yZSxcbm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUsXG5tYWtlU2NhbGFyQmlnU2V0U3RvcmUsXG5tYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlLFxuY2FuQmVEdXJhYmxlfT1cblZhdERhdGFHbG9iYWw7XG5cbi8qKlxuICogV2hlbiBtYWtpbmcgYSBtdWx0aS1mYWNldCBraW5kLCBpdCdzIGNvbW1vbiB0byBwaWNrIG9uZSBmYWNldCB0byBleHBvc2UuIEUuZy4sXG4gKlxuICogICAgIGNvbnN0IG1ha2VGb28gPSAoYSwgYiwgYywgZCkgPT4gbWFrZUZvb0Jhc2UoYSwgYiwgYywgZCkuc2VsZjtcbiAqXG4gKiBUaGlzIGhlbHBlciByZWR1Y2VzIHRoZSBkdXBsaWNhdGlvbjpcbiAqXG4gKiAgICAgY29uc3QgbWFrZUZvbyA9IHBpY2tGYWNldChtYWtlRm9vQmFzZSwgJ3NlbGYnKTtcbiAqXG4gKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcycpLlBpY2tGYWNldH1cbiAqLyRo4oCNX29uY2UubWFrZUtpbmRIYW5kbGUobWFrZUtpbmRIYW5kbGUpOyRo4oCNX29uY2UucHJvdmlkZVByb21pc2VXYXRjaGVyKHByb3ZpZGVQcm9taXNlV2F0Y2hlcik7JGjigI1fb25jZS53YXRjaFByb21pc2Uod2F0Y2hQcm9taXNlKTskaOKAjV9vbmNlLm1ha2VTY2FsYXJCaWdNYXBTdG9yZShtYWtlU2NhbGFyQmlnTWFwU3RvcmUpOyRo4oCNX29uY2UubWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZShtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlKTskaOKAjV9vbmNlLm1ha2VTY2FsYXJCaWdTZXRTdG9yZShtYWtlU2NhbGFyQmlnU2V0U3RvcmUpOyRo4oCNX29uY2UubWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZShtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlKTskaOKAjV9vbmNlLmNhbkJlRHVyYWJsZShjYW5CZUR1cmFibGUpO1xuY29uc3QgICAgICAgIHBpY2tGYWNldD1cbihtYWtlcixmYWNldE5hbWUpPT5cbiguLi5hcmdzKT0+XG5tYWtlciguLi5hcmdzKVtmYWNldE5hbWVdOyRo4oCNX29uY2UucGlja0ZhY2V0KHBpY2tGYWNldCk7XG5oYXJkZW4ocGlja0ZhY2V0KTtcblxuLyoqXG4gKiBBc3NpZ24gdGhlIHZhbHVlcyBvZiBhbGwgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgZnJvbSB0aGUgc291cmNlXG4gKiBvYmplY3QgdG8gdGhlaXIga2V5cyBpbiB0aGUgdGFyZ2V0IG9iamVjdC5cbiAqXG4gKiBAdGVtcGxhdGUge3t9fSBUXG4gKiBAcGFyYW0ge1R9IHRhcmdldFxuICogQHBhcmFtIHtQYXJ0aWFsPFQ+fSBzb3VyY2VcbiAqL1xuY29uc3QgICAgICAgIHBhcnRpYWxBc3NpZ249KHRhcmdldCxzb3VyY2UpPT57XG5PYmplY3QuYXNzaWduKHRhcmdldCxzb3VyY2UpO1xuIH07JGjigI1fb25jZS5wYXJ0aWFsQXNzaWduKHBhcnRpYWxBc3NpZ24pO1xuaGFyZGVuKHBhcnRpYWxBc3NpZ24pO1xuXG4vKiBYWFggY29waWVkIGZyb20gQGFnb3JpYy9zdG9yZSB0eXBlcyovXG4vKiBVTlRJTCBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQ1NjAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yZU9wdGlvbnNcbiAqIE9mIHRoZSBkaW1lbnNpb25zIG9uIHdoaWNoIEtleWVkU3RvcmVzIGNhbiBkaWZmZXIsIHdlIG9ubHkgcmVwcmVzZW50IGEgZmV3XG4gKiBvZiB0aGVtIGFzIHN0YW5kYXJkIG9wdGlvbnMuIEEgZ2l2ZW4gc3RvcmUgbWFrZXIgc2hvdWxkIGRvY3VtZW50IHdoaWNoXG4gKiBvcHRpb25zIGl0IHN1cHBvcnRzLCBhcyB3ZWxsIGFzIGl0cyBwb3NpdGlvbnMgb24gZGltZW5zaW9ucyBmb3Igd2hpY2ggaXRcbiAqIGRvZXMgbm90IHN1cHBvcnQgb3B0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2xvbmdMaXZlZD10cnVlXSBXaGljaCB3YXkgdG8gb3B0aW1pemUgYSB3ZWFrIHN0b3JlLiBUcnVlIG1lYW5zXG4gKiB0aGF0IHdlIGV4cGVjdCB0aGlzIHdlYWsgc3RvcmUgdG8gb3V0bGl2ZSBtb3N0IG9mIGl0cyBrZXlzLCBpbiB3aGljaFxuICogY2FzZSB3ZSBpbnRlcm5hbGx5IG1heSB1c2UgYSBKYXZhU2NyaXB0IGBXZWFrTWFwYC4gT3RoZXJ3aXNlIHdlIGludGVybmFsbHlcbiAqIG1heSB1c2UgYSBKYXZhU2NyaXB0IGBNYXBgLlxuICogRGVmYXVsdHMgdG8gdHJ1ZSwgc28gcGxlYXNlIG1hcmsgc2hvcnQgbGl2ZWQgc3RvcmVzIGV4cGxpY2l0bHkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtkdXJhYmxlPWZhbHNlXSAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgc3RvcmUgc3Vydml2ZSB0ZXJtaW5hdGlvblxuICogICBvZiBpdHMgY29udGFpbmluZyBwcm9jZXNzLCBhbGxvd2luZyBmb3IgcmVzdGFydCBvciB1cGdyYWRlIGJ1dCBhdCB0aGUgY29zdFxuICogICBvZiBmb3JiaWRkaW5nIHN0b3JhZ2Ugb2YgcmVmZXJlbmNlcyB0byBlcGhlbWVyYWwgZGF0YS4gIERlZmF1bHRzIHRvIGZhbHNlLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZmFrZUR1cmFibGU9ZmFsc2VdICBUaGlzIHN0b3JlIHByZXRlbmRzIHRvIGJlIGEgZHVyYWJsZSBzdG9yZVxuICogICBidXQgZG9lcyBub3QgZW5mb3JjZSB0aGF0IHRoZSB0aGluZ3Mgc3RvcmVkIGluIGl0IGFjdHVhbGx5IGJlIHRoZW1zZWx2ZXNcbiAqICAgZHVyYWJsZSAod2hlcmVhcyBhbiBhY3R1YWwgZHVyYWJsZSBzdG9yZSB3b3VsZCBmb3JiaWQgc3RvcmFnZSBvZiBzdWNoXG4gKiAgIGl0ZW1zKS4gIFRoaXMgaXMgaW4gc2VydmljZSBvZiBhbGxvd2luZyBpbmNyZW1lbnRhbCB0cmFuc2l0aW9uIHRvIHVzZSBvZlxuICogICBkdXJhYmxlIHN0b3JlcywgdG8gZW5hYmxlIG5vcm1hbCBvcGVyYXRpb24gYW5kIHRlc3Rpbmcgd2hlbiBzb21lIHN0dWZmXG4gKiAgIGludGVuZGVkIHRvIGV2ZW50dWFsbHkgYmUgZHVyYWJsZSBoYXMgbm90IHlldCBiZWVuIG1hZGUgZHVyYWJsZS4gIEEgc3RvcmVcbiAqICAgbWFya2VkIGFzIGZha2VEdXJhYmxlIHdpbGwgYXBwZWFyIHRvIG9wZXJhdGUgbm9ybWFsbHkgYnV0IGFueSBhdHRlbXB0IHRvXG4gKiAgIHVwZ3JhZGUgaXRzIGNvbnRhaW5pbmcgdmF0IHdpbGwgZmFpbCB3aXRoIGFuIGVycm9yLlxuICogQHByb3BlcnR5IHtYaW1wb3J0KCcuL3R5cGVzJykuUGF0dGVybn0gW2tleVNoYXBlXVxuICogQHByb3BlcnR5IHtYaW1wb3J0KCcuL3R5cGVzJykuUGF0dGVybn0gW3ZhbHVlU2hhcGVdXG4gKi9cbi8qKlxuICogVW5saWtlIGBwcm92aWRlTGF6eWAsIGBwcm92aWRlYCBzaG91bGQgYmUgY2FsbGVkIGF0IG1vc3Qgb25jZVxuICogd2l0aGluIGFueSB2YXQgaW5jYXJuYXRpb24gd2l0aCBhIGdpdmVuIGBiYWdnYWdlYCxga2V5YCBwYWlyLlxuICpcbiAqIGBwcm92aWRlYCBzaG91bGQgb25seSB0byBiZSB1c2VkIHRvIHBvcHVsYXRlIGJhZ2dhZ2UsXG4gKiB3aGVyZSB0aGUgdG90YWwgbnVtYmVyIG9mIGNhbGxzIHRvIGBwcm92aWRlYCBtdXN0IGJlXG4gKiBsb3cgY2FyZGluYWxpdHksIHNpbmNlIHdlIGtlZXAgdGhlIGJvb2trZWVwaW5nIHRvIGRldGVjdCBjb2xsaXNpb25zXG4gKiBpbiBub3JtYWwgbGFuZ3VhZ2UtaGVhcCBtZW1vcnkuIEFsbCB0aGUgb3RoZXIgYmFnZ2FnZS1vcmllbnRlZFxuICogYHByb3ZpZGUqYCBhbmQgYHByZXBhcmUqYCBmdW5jdGlvbnMgY2FsbCBgcHJvdmlkZWAsXG4gKiBhbmQgc28gaW1wb3NlIHRoZSBzYW1lIGNvbnN0cmFpbnRzLiBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aFxuICogb3VyIGV4cGVjdGVkIGR1cmFiaWxpdHkgcGF0dGVybnM6IFdoYXQgd2Ugc3RvcmUgaW4gYmFnZ2FnZSBhcmVcbiAqICAgICoga2luZEhhbmRsZXMsIHdoaWNoIGFyZSBwZXIga2luZCwgd2hpY2ggbXVzdCBiZSBsb3cgY2FyZGluYWxpdHlcbiAqICAgICogZGF0YSBcInZhcmlhYmxlc1wiIGZvciByZWVzdGFibGlzaGluZyB0aGUgbGV4aWNhbCBzY29wZSwgZXNwZWNpYWxseVxuICogICAgICBvZiBzaW5nbGV0b25zXG4gKiAgICAqIG5hbWVkIG5vbi1iYWdnYWdlIGNvbGxlY3Rpb25zIGF0IHRoZSBsZWF2ZXMgb2YgdGhlIGJhZ2dhZ2UgdHJlZS5cbiAqXG4gKiBXaGF0IGlzIGV4cGVjdGVkIHRvIGJlIGhpZ2ggY2FyZGluYWxpdHkgYXJlIHRoZSBpbnN0YW5jZXMgb2YgdGhlIGtpbmRzLFxuICogYW5kIHRoZSBtZW1iZXJzIG9mIHRoZSBub24tYmFnZ2dhZ2UgY29sbGVjdGlvbnMuXG4gKlxuICogVE9ETyBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC81ODc1IDpcbiAqIEltcGxlbWVudCBkZXZlbG9wbWVudC10aW1lIGluc3RydW1lbnRhdGlvbiB0byBkZXRlY3Qgd2hlblxuICogYHByb3ZpZGVgIHZpb2xhdGVzIHRoZSBhYm92ZSBwcmVzY3JpcHRpb24sIGFuZCBpcyBjYWxsZWQgbW9yZVxuICogdGhhbiBvbmNlIGluIHRoZSBzYW1lIHZhdCBpbmNhcm5hdGlvbiB3aXRoIHRoZSBzYW1lXG4gKiBiYWdnYWdlLGtleSBwYWlyLlxuICpcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcy5qcycpLkJhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7S30ga2V5XG4gKiBAcGFyYW0geyhrZXk6IEspID0+IFZ9IG1ha2VWYWx1ZVxuICogQHJldHVybnMge1Z9XG4gKi9cbmNvbnN0ICAgICAgICBwcm92aWRlPXByb3ZpZGVMYXp5O1xuXG4vKiBUT0RPOiBGaW5kIGEgZ29vZCBob21lIGZvciB0aGlzIGZ1bmN0aW9uIHVzZWQgYnkgQGFnb3JpYy92YXQtZGF0YSBhbmQgdGVzdGluZyBjb2RlKi8kaOKAjV9vbmNlLnByb3ZpZGUocHJvdmlkZSk7XG5jb25zdCAgICAgICAgbWFrZVN0b3JlVXRpbHM9KFZhdERhdGEpPT57XG5jb25zdHtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3cgLS0gdGhlc2UgbGl0ZXJhbGx5IGRvIHNoYWRvdyB0aGUgZ2xvYmFscyovXG5tYWtlU2NhbGFyQmlnTWFwU3RvcmUsXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93IC0tIHRoZXNlIGxpdGVyYWxseSBkbyBzaGFkb3cgdGhlIGdsb2JhbHMqL1xubWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSxcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3cgLS0gdGhlc2UgbGl0ZXJhbGx5IGRvIHNoYWRvdyB0aGUgZ2xvYmFscyovXG5tYWtlU2NhbGFyQmlnU2V0U3RvcmV9PVxuVmF0RGF0YTtcblxuLyoqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMnKS5CYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtPbWl0PFN0b3JlT3B0aW9ucywgJ2R1cmFibGUnPn0gb3B0aW9uc1xuICovXG5jb25zdCBwcm92aWRlRHVyYWJsZU1hcFN0b3JlPShiYWdnYWdlLG5hbWUsb3B0aW9ucz17fSk9PlxucHJvdmlkZShiYWdnYWdlLG5hbWUsKCk9PlxubWFrZVNjYWxhckJpZ01hcFN0b3JlKG5hbWUse2R1cmFibGU6dHJ1ZSwuLi5vcHRpb25zfSkpO1xuXG5oYXJkZW4ocHJvdmlkZUR1cmFibGVNYXBTdG9yZSk7XG5cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzJykuQmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7T21pdDxTdG9yZU9wdGlvbnMsICdkdXJhYmxlJz59IG9wdGlvbnNcbiAqL1xuY29uc3QgcHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmU9KGJhZ2dhZ2UsbmFtZSxvcHRpb25zPXt9KT0+XG5wcm92aWRlKGJhZ2dhZ2UsbmFtZSwoKT0+XG5tYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlKG5hbWUse2R1cmFibGU6dHJ1ZSwuLi5vcHRpb25zfSkpO1xuXG5oYXJkZW4ocHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUpO1xuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcycpLkJhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge09taXQ8U3RvcmVPcHRpb25zLCAnZHVyYWJsZSc+fSBvcHRpb25zXG4gKi9cbmNvbnN0IHByb3ZpZGVEdXJhYmxlU2V0U3RvcmU9KGJhZ2dhZ2UsbmFtZSxvcHRpb25zPXt9KT0+XG5wcm92aWRlKGJhZ2dhZ2UsbmFtZSwoKT0+XG5tYWtlU2NhbGFyQmlnU2V0U3RvcmUobmFtZSx7ZHVyYWJsZTp0cnVlLC4uLm9wdGlvbnN9KSk7XG5cbmhhcmRlbihwcm92aWRlRHVyYWJsZVNldFN0b3JlKTtcblxucmV0dXJuIGhhcmRlbih7XG5wcm92aWRlRHVyYWJsZU1hcFN0b3JlLFxucHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUsXG5wcm92aWRlRHVyYWJsZVNldFN0b3JlfSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZVN0b3JlVXRpbHMobWFrZVN0b3JlVXRpbHMpO1xuXG5jb25zdCBnbG9iYWxTdG9yZVV0aWxzPW1ha2VTdG9yZVV0aWxzKFZhdERhdGFHbG9iYWwpO1xuY29uc3QgICAgICAge1xucHJvdmlkZUR1cmFibGVNYXBTdG9yZSxcbnByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlLFxucHJvdmlkZUR1cmFibGVTZXRTdG9yZX09XG5nbG9iYWxTdG9yZVV0aWxzOyRo4oCNX29uY2UucHJvdmlkZUR1cmFibGVNYXBTdG9yZShwcm92aWRlRHVyYWJsZU1hcFN0b3JlKTskaOKAjV9vbmNlLnByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKTskaOKAjV9vbmNlLnByb3ZpZGVEdXJhYmxlU2V0U3RvcmUocHJvdmlkZUR1cmFibGVTZXRTdG9yZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiVmF0RGF0YSI6WyJWYXREYXRhRXhwb3J0Il0sImRlZmluZUtpbmQiOlsiZGVmaW5lS2luZCJdLCJkZWZpbmVLaW5kTXVsdGkiOlsiZGVmaW5lS2luZE11bHRpIl0sImRlZmluZUR1cmFibGVLaW5kIjpbImRlZmluZUR1cmFibGVLaW5kIl0sImRlZmluZUR1cmFibGVLaW5kTXVsdGkiOlsiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSJdLCJtYWtlS2luZEhhbmRsZSI6WyJtYWtlS2luZEhhbmRsZSJdLCJwcm92aWRlUHJvbWlzZVdhdGNoZXIiOlsicHJvdmlkZVByb21pc2VXYXRjaGVyIl0sIndhdGNoUHJvbWlzZSI6WyJ3YXRjaFByb21pc2UiXSwibWFrZVNjYWxhckJpZ01hcFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdNYXBTdG9yZSJdLCJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUiXSwibWFrZVNjYWxhckJpZ1NldFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdTZXRTdG9yZSJdLCJtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiXSwiY2FuQmVEdXJhYmxlIjpbImNhbkJlRHVyYWJsZSJdLCJwaWNrRmFjZXQiOlsicGlja0ZhY2V0Il0sInBhcnRpYWxBc3NpZ24iOlsicGFydGlhbEFzc2lnbiJdLCJwcm92aWRlIjpbInByb3ZpZGUiXSwibWFrZVN0b3JlVXRpbHMiOlsibWFrZVN0b3JlVXRpbHMiXSwicHJvdmlkZUR1cmFibGVNYXBTdG9yZSI6WyJwcm92aWRlRHVyYWJsZU1hcFN0b3JlIl0sInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIjpbInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIl0sInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiOlsicHJvdmlkZUR1cmFibGVTZXRTdG9yZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB4xleWqwMAAKsDAAAfAAAAQGFnb3JpYy96b2UtdjAuMjUuMy9leHBvcnRlZC5qc3siaW1wb3J0cyI6WyIuL3NyYy9jb250cmFjdEZhY2V0L3R5cGVzLmpzIiwiLi9zcmMvY29udHJhY3RTdXBwb3J0L3R5cGVzLmpzIiwiLi9zcmMvY29udHJhY3RzL2V4cG9ydGVkLmpzIiwiLi9zcmMvdHlwZXMuanMiLCIuL3NyYy96b2VTZXJ2aWNlL3R5cGVzLmpzIiwiLi90b29scy90eXBlcy1hbWJpZW50LmpzIiwiQGFnb3JpYy9lcnRwL2V4cG9ydGVkLmpzIiwiQGFnb3JpYy9ub3RpZmllci9leHBvcnRlZC5qcyIsIkBhZ29yaWMvc3RvcmUvZXhwb3J0ZWQuanMiLCJAYWdvcmljL3N3aW5nc2V0LXZhdC9leHBvcnRlZC5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9jb250cmFjdEZhY2V0L3R5cGVzLmpzXCIsIFtdXSxbXCIuL3NyYy96b2VTZXJ2aWNlL3R5cGVzLmpzXCIsIFtdXSxbXCIuL3NyYy9jb250cmFjdFN1cHBvcnQvdHlwZXMuanNcIiwgW11dLFtcIi4vc3JjL2NvbnRyYWN0cy9leHBvcnRlZC5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dLFtcIi4vdG9vbHMvdHlwZXMtYW1iaWVudC5qc1wiLCBbXV0sW1wiQGFnb3JpYy9ub3RpZmllci9leHBvcnRlZC5qc1wiLCBbXV0sW1wiQGFnb3JpYy9lcnRwL2V4cG9ydGVkLmpzXCIsIFtdXSxbXCJAYWdvcmljL3N0b3JlL2V4cG9ydGVkLmpzXCIsIFtdXSxbXCJAYWdvcmljL3N3aW5nc2V0LXZhdC9leHBvcnRlZC5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAATnhTABAmAAAQJgAALgAAAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL2NvbnRyYWN0RmFjZXQvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvZXJ0cCcpLklzc3Vlck9wdGlvbnNSZWNvcmR9IElzc3Vlck9wdGlvbnNSZWNvcmQgKi9cblxuLyogWFhYIGNhbiBiZSB0aWdodGVyIHRoYW4gJ2FueScqL1xuLyoqXG4gKiBAdHlwZWRlZiB7YW55fSBDb21wbGV0aW9uXG4gKiBBbnkgcGFzc2FibGUgbm9uLXRoZW5hYmxlLiBPZnRlbiBhbiBleHBsYW5hdG9yeSBzdHJpbmcuXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgWkNGTWFrZUVtcHR5U2VhdEtpdFxuICogQHBhcmFtIHtFeGl0UnVsZX0gW2V4aXRdXG4gKiBAcmV0dXJucyB7WmNmU2VhdEtpdH1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7b2JqZWN0fSBbQ1Q9UmVjb3JkPHN0cmluZywgdW5rbm93bj5dIENvbnRyYWN0J3MgY3VzdG9tIHRlcm1zXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBaQ0YgWm9lIENvbnRyYWN0IEZhY2V0XG4gKlxuICogVGhlIFpvZSBpbnRlcmZhY2Ugc3BlY2lmaWMgdG8gYSBjb250cmFjdCBpbnN0YW5jZS4gVGhlIFpvZSBDb250cmFjdFxuICogRmFjZXQgaXMgYW4gQVBJIG9iamVjdCB1c2VkIGJ5IHJ1bm5pbmcgY29udHJhY3QgaW5zdGFuY2VzIHRvIGFjY2Vzc1xuICogdGhlIFpvZSBzdGF0ZSBmb3IgdGhhdCBpbnN0YW5jZS4gVGhlIFpvZSBDb250cmFjdCBGYWNldCBpcyBhY2Nlc3NlZFxuICogc3luY2hyb25vdXNseSBmcm9tIHdpdGhpbiB0aGUgY29udHJhY3QsIGFuZCB1c3VhbGx5IGlzIHJlZmVycmVkIHRvXG4gKiBpbiBjb2RlIGFzIHpjZi5cbiAqXG4gKiBAcHJvcGVydHkge1JlYWxsb2NhdGV9IHJlYWxsb2NhdGUgLSByZWFsbG9jYXRlIGFtb3VudHMgYW1vbmcgc2VhdHMuXG4gKiBEZXByZWNhdGVkOiBVc2UgYXRvbWljUmVhcnJhbmdlIGluc3RlYWQuXG4gKiBAcHJvcGVydHkgeyhrZXl3b3JkOiBLZXl3b3JkKSA9PiB2b2lkfSBhc3NlcnRVbmlxdWVLZXl3b3JkIC0gY2hlY2tcbiAqIHdoZXRoZXIgYSBrZXl3b3JkIGlzIHZhbGlkIGFuZCB1bmlxdWUgYW5kIGNvdWxkIGJlIGFkZGVkIGluXG4gKiBgc2F2ZUlzc3VlcmBcbiAqIEBwcm9wZXJ0eSB7U2F2ZUlzc3Vlcn0gc2F2ZUlzc3VlciAtIHNhdmUgYW4gaXNzdWVyIHRvIFpDRiBhbmQgWm9lXG4gKiBhbmQgZ2V0IHRoZSBBbW91bnRNYXRoIGFuZCBicmFuZCBzeW5jaHJvbm91c2x5IGFjY2Vzc2libGUgYWZ0ZXJcbiAqIHNhdmluZ1xuICogQHByb3BlcnR5IHtNYWtlSW52aXRhdGlvbn0gbWFrZUludml0YXRpb25cbiAqIEBwcm9wZXJ0eSB7KGNvbXBsZXRpb246IENvbXBsZXRpb24pID0+IHZvaWR9IHNodXRkb3duXG4gKiBAcHJvcGVydHkge1NodXRkb3duV2l0aEZhaWx1cmV9IHNodXRkb3duV2l0aEZhaWx1cmVcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gRVJlZjxab2VTZXJ2aWNlPn0gZ2V0Wm9lU2VydmljZVxuICogQHByb3BlcnR5IHsoKSA9PiBJc3N1ZXI8J3NldCc+fSBnZXRJbnZpdGF0aW9uSXNzdWVyXG4gKiBAcHJvcGVydHkgeygpID0+IFN0YW5kYXJkVGVybXMgJiBDVH0gZ2V0VGVybXNcbiAqIEBwcm9wZXJ0eSB7PEsgZXh0ZW5kcyBBc3NldEtpbmQ+KGlzc3VlcjogSXNzdWVyPEs+KSA9PiBCcmFuZDxLPn0gZ2V0QnJhbmRGb3JJc3N1ZXJcbiAqIEBwcm9wZXJ0eSB7PEsgZXh0ZW5kcyBBc3NldEtpbmQ+KGJyYW5kOiBCcmFuZDxLPikgPT4gSXNzdWVyPEs+fSBnZXRJc3N1ZXJGb3JCcmFuZFxuICogQHByb3BlcnR5IHtHZXRBc3NldEtpbmRCeUJyYW5kfSBnZXRBc3NldEtpbmRcbiAqIEBwcm9wZXJ0eSB7PEsgZXh0ZW5kcyBBc3NldEtpbmQgPSAnbmF0Jz4oXG4gKiAgIGtleXdvcmQ6IEtleXdvcmQsXG4gKiAgIGFzc2V0S2luZD86IEssXG4gKiAgIGRpc3BsYXlJbmZvPzogQWRkaXRpb25hbERpc3BsYXlJbmZvLFxuICogICBvcHRpb25zPzogSXNzdWVyT3B0aW9uc1JlY29yZFxuICogKSA9PiBQcm9taXNlPFpDRk1pbnQ8Sz4+fSBtYWtlWkNGTWludFxuICogQHByb3BlcnR5IHtaQ0ZSZWdpc3RlckZlZU1pbnR9IHJlZ2lzdGVyRmVlTWludFxuICogQHByb3BlcnR5IHtaQ0ZNYWtlRW1wdHlTZWF0S2l0fSBtYWtlRW1wdHlTZWF0S2l0XG4gKiBAcHJvcGVydHkge1NldFRlc3RKaWd9IHNldFRlc3RKaWdcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTx2b2lkPn0gc3RvcEFjY2VwdGluZ09mZmVyc1xuICogQHByb3BlcnR5IHsoc3RyaW5nczogQXJyYXk8c3RyaW5nPikgPT4gUHJvbWlzZTx2b2lkPn0gc2V0T2ZmZXJGaWx0ZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxBcnJheTxzdHJpbmc+Pn0gZ2V0T2ZmZXJGaWx0ZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSW5zdGFuY2V9IGdldEluc3RhbmNlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KHNlYXQxOiBaQ0ZTZWF0LCBzZWF0MjogWkNGU2VhdCwgLi4uc2VhdFJlc3Q6XG4gKiBBcnJheTxaQ0ZTZWF0PikgPT4gdm9pZH0gUmVhbGxvY2F0ZVxuICpcbiAqIFRoZSBjb250cmFjdCBjYW4gcmVhbGxvY2F0ZSBvdmVyIHNlYXRzLCB3aGljaCBjb21taXRzIHRoZSBzdGFnZWRcbiAqIGFsbG9jYXRpb24gZm9yIGVhY2ggc2VhdC4gT24gY29tbWl0LCB0aGUgc3RhZ2VkIGFsbG9jYXRpb24gYmVjb21lc1xuICogdGhlIGN1cnJlbnQgYWxsb2NhdGlvbiBhbmQgdGhlIHN0YWdlZCBhbGxvY2F0aW9uIGlzIGRlbGV0ZWQuXG4gKlxuICogVGhlIHJlYWxsb2NhdGlvbiB3aWxsIG9ubHkgc3VjY2VlZCBpZiB0aGUgcmVhbGxvY2F0aW9uIDEpIGNvbnNlcnZlc1xuICogcmlnaHRzICh0aGUgYW1vdW50cyBzcGVjaWZpZWQgaGF2ZSB0aGUgc2FtZSB0b3RhbCB2YWx1ZSBhcyB0aGVcbiAqIGN1cnJlbnQgdG90YWwgYW1vdW50KSwgYW5kIDIpIGlzICdvZmZlci1zYWZlJyBmb3IgYWxsIHBhcnRpZXNcbiAqIGludm9sdmVkLiBBbGwgc2VhdHMgdGhhdCBoYXZlIHN0YWdlZCBhbGxvY2F0aW9ucyBtdXN0IGJlIGluY2x1ZGVkXG4gKiBhcyBhcmd1bWVudHMgdG8gYHJlYWxsb2NhdGVgLCBvciBhbiBlcnJvciBpcyB0aHJvd24uIEFkZGl0aW9uYWxseSxcbiAqIGFuIGVycm9yIGlzIHRocm93biBpZiBhbnkgc2VhdHMgaW5jbHVkZWQgaW4gYHJlYWxsb2NhdGVgIGRvIG5vdFxuICogaGF2ZSBhIHN0YWdlZCBhbGxvY2F0aW9uLlxuICpcbiAqIFRoZSByZWFsbG9jYXRpb24gaXMgcGFydGlhbCwgbWVhbmluZyB0aGF0IGl0IGFwcGxpZXMgb25seSB0byB0aGVcbiAqIHNlYXRzIHBhc3NlZCBpbiBhcyBhcmd1bWVudHMuIEJ5IGluZHVjdGlvbiwgaWYgcmlnaHRzIGNvbnNlcnZhdGlvblxuICogYW5kIG9mZmVyIHNhZmV0eSBob2xkIGJlZm9yZSwgdGhleSB3aWxsIGhvbGQgYWZ0ZXIgYSBzYWZlXG4gKiByZWFsbG9jYXRpb24sIGV2ZW4gdGhvdWdoIHdlIG9ubHkgcmUtdmFsaWRhdGUgZm9yIHRoZSBzZWF0cyB3aG9zZVxuICogYWxsb2NhdGlvbnMgd2lsbCBjaGFuZ2UuIFNpbmNlIHJpZ2h0cyBhcmUgY29uc2VydmVkIGZvciB0aGUgY2hhbmdlLFxuICogb3ZlcmFsbCByaWdodHMgd2lsbCBiZSB1bmNoYW5nZWQsIGFuZCBhIHJlYWxsb2NhdGlvbiBjYW4gb25seVxuICogZWZmZWN0IG9mZmVyIHNhZmV0eSBmb3Igc2VhdHMgd2hvc2UgYWxsb2NhdGlvbnMgY2hhbmdlLlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFNhdmVJc3N1ZXJcbiAqXG4gKiBJbmZvcm1zIFpvZSBhYm91dCBhbiBpc3N1ZXIgYW5kIHJldHVybnMgYSBwcm9taXNlIGZvciBhY2tub3dsZWRnaW5nXG4gKiB3aGVuIHRoZSBpc3N1ZXIgaXMgYWRkZWQgYW5kIHJlYWR5LlxuICpcbiAqIEBwYXJhbSB7RVJlZjxJc3N1ZXI+fSBpc3N1ZXJQIFByb21pc2UgZm9yIGlzc3VlclxuICogQHBhcmFtIHtLZXl3b3JkfSBrZXl3b3JkIEtleXdvcmQgZm9yIGFkZGVkIGlzc3VlclxuICogQHJldHVybnMge1Byb21pc2U8SXNzdWVyUmVjb3JkPCo+Pn0gSXNzdWVyIGlzIGFkZGVkIGFuZCByZWFkeVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgezxSZXN1bHQ+KFxuICogICBvZmZlckhhbmRsZXI6IE9mZmVySGFuZGxlcjxSZXN1bHQ+LFxuICogICBkZXNjcmlwdGlvbjogc3RyaW5nLFxuICogICBjdXN0b21EZXRhaWxzPzogb2JqZWN0LFxuICogICBwcm9wb3NhbFNoYXBlPzogUGF0dGVybixcbiAqICkgPT4gUHJvbWlzZTxJbnZpdGF0aW9uPEF3YWl0ZWQ8UmVzdWx0Pj4+XG4gKiB9IE1ha2VJbnZpdGF0aW9uXG4gKlxuICogTWFrZSBhIGNyZWRpYmxlIFpvZSBpbnZpdGF0aW9uIGZvciBhIHBhcnRpY3VsYXIgc21hcnQgY29udHJhY3RcbiAqIGluZGljYXRlZCBieSB0aGUgYGluc3RhbmNlYCBpbiB0aGUgZGV0YWlscyBvZiB0aGUgaW52aXRhdGlvbi4gWm9lXG4gKiBhbHNvIHB1dHMgdGhlIGBpbnN0YWxsYXRpb25gIGFuZCBhIHVuaXF1ZSBgaGFuZGxlYCBpbiB0aGUgZGV0YWlsc1xuICogb2YgdGhlIGludml0YXRpb24uIFRoZSBjb250cmFjdCBtdXN0IHByb3ZpZGUgYSBgZGVzY3JpcHRpb25gIGZvclxuICogdGhlIGludml0YXRpb24gYW5kIHNob3VsZCBpbmNsdWRlIHdoYXRldmVyIGluZm9ybWF0aW9uIGlzIG5lY2Vzc2FyeVxuICogZm9yIGEgcG90ZW50aWFsIGJ1eWVyIG9mIHRoZSBpbnZpdGF0aW9uIHRvIGtub3cgd2hhdCB0aGV5IGFyZVxuICogZ2V0dGluZyBpbiB0aGUgYGN1c3RvbURldGFpbHNgLiBgY3VzdG9tRGV0YWlsc2Agd2lsbCBiZVxuICogcGxhY2VkIGluIHRoZSBkZXRhaWxzIG9mIHRoZSBpbnZpdGF0aW9uLlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFpDRlJlZ2lzdGVyRmVlTWludFxuICogQHBhcmFtIHtLZXl3b3JkfSBrZXl3b3JkXG4gKiBAcGFyYW0ge0ZlZU1pbnRBY2Nlc3N9IGFsbGVnZWRGZWVNaW50QWNjZXNzIC0gYW4gb2JqZWN0IHRoYXRcbiAqIHB1cnBvcnRzIHRvIGJlIHRoZSBvYmplY3QgdGhhdCBncmFudHMgYWNjZXNzIHRvIHRoZSBmZWUgbWludFxuICogQHJldHVybnMge1Byb21pc2U8WkNGTWludDwnbmF0Jz4+fVxuICovXG5cbi8qKlxuICogUHJvdmlkZSBhIGppZyBvYmplY3QgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS5cbiAqXG4gKiBUaGUgY29udHJhY3QgY29kZSBwcm92aWRlcyBhIGNhbGxiYWNrIHdob3NlIHJldHVybiByZXN1bHQgd2lsbFxuICogYmUgbWFkZSBhdmFpbGFibGUgdG8gdGhlIHRlc3QgdGhhdCBzdGFydGVkIHRoaXMgY29udHJhY3QuIFRoZVxuICogc3VwcGxpZWQgY2FsbGJhY2sgd2lsbCBvbmx5IGJlIGNhbGxlZCBpbiBhIHRlc3RpbmcgY29udGV4dCxcbiAqIG5ldmVyIGluIHByb2R1Y3Rpb247IGkuZS4sIGl0IGlzIG9ubHkgY2FsbGVkIGlmIGB0ZXN0SmlnU2V0dGVyYFxuICogd2FzIHN1cHBsaWVkLlxuICpcbiAqIElmIG5vLCBgdGVzdEZuYCBpcyBzdXBwbGllZCwgdGhlbiBhbiBlbXB0eSBqaWcgd2lsbCBiZSB1c2VkLlxuICogQW4gYWRkaXRpb25hbCBgemNmYCBwcm9wZXJ0eSBzZXQgdG8gdGhlIGN1cnJlbnQgQ29udHJhY3RGYWNldFxuICogd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgcmV0dXJuZWQgamlnIG9iamVjdCAob3ZlcnJpZGluZyBhbnlcbiAqIHByb3ZpZGVkIGJ5IHRoZSBgdGVzdEZuYCkuXG4gKlxuICogQGNhbGxiYWNrIFNldFRlc3RKaWdcbiAqIEBwYXJhbSB7KCkgPT4gUmVjb3JkPHN0cmluZywgdW5rbm93bj59IHRlc3RGblxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgWkNGTWludE1pbnRHYWluc1xuICogQHBhcmFtIHtBbW91bnRLZXl3b3JkUmVjb3JkfSBnYWluc1xuICogQHBhcmFtIHtaQ0ZTZWF0fSBbemNmU2VhdF1cbiAqIEByZXR1cm5zIHtaQ0ZTZWF0fVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFpDRk1pbnRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSXNzdWVyUmVjb3JkPEs+fSBnZXRJc3N1ZXJSZWNvcmRcbiAqIEBwcm9wZXJ0eSB7WkNGTWludE1pbnRHYWluc30gbWludEdhaW5zXG4gKiBBbGwgdGhlIGFtb3VudHMgaW4gZ2FpbnMgbXVzdCBiZSBvZiB0aGlzIFpDRk1pbnQncyBicmFuZC5cbiAqIFRoZSBnYWlucycga2V5d29yZHMgYXJlIGluIHRoZSBuYW1lc3BhY2Ugb2YgdGhhdCBzZWF0LlxuICogQWRkIHRoZSBnYWlucyB0byB0aGF0IHNlYXQncyBhbGxvY2F0aW9uLlxuICogVGhlIHJlc3VsdGluZyBzdGF0ZSBtdXN0IGJlIG9mZmVyIHNhZmUuIChDdXJyZW50bHksIGluY3JlYXNpbmcgYXNzZXRzIGNhblxuICogbmV2ZXIgdmlvbGF0ZSBvZmZlciBzYWZldHkgYW55d2F5LilcbiAqXG4gKiBNaW50IHRoYXQgYW1vdW50IG9mIGFzc2V0cyBpbnRvIHRoZSBwb29sZWQgcHVyc2UuXG4gKiBJZiBhIHNlYXQgaXMgcHJvdmlkZWQsIGl0IGlzIHJldHVybmVkLiBPdGhlcndpc2UgYSBuZXcgc2VhdCBpc1xuICogcmV0dXJuZWQuXG4gKiBUT0RPIHVuaW1wbGVtZW50ZWRcbiAqIFRoaXMgY3JlYXRpb24tb24tZGVtYW5kIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQuXG4gKlxuICogQHByb3BlcnR5IHsobG9zc2VzOiBBbW91bnRLZXl3b3JkUmVjb3JkLFxuICogICAgICAgICAgICAgemNmU2VhdDogWkNGU2VhdCxcbiAqICAgICAgICAgICAgKSA9PiB2b2lkfSBidXJuTG9zc2VzXG4gKiBBbGwgdGhlIGFtb3VudHMgaW4gbG9zc2VzIG11c3QgYmUgb2YgdGhpcyBaQ0ZNaW50J3MgYnJhbmQuXG4gKiBUaGUgbG9zc2VzJyBrZXl3b3JkcyBhcmUgaW4gdGhlIG5hbWVzcGFjZSBvZiB0aGF0IHNlYXQuXG4gKiBTdWJ0cmFjdCBsb3NzZXMgZnJvbSB0aGF0IHNlYXQncyBhbGxvY2F0aW9uLlxuICogVGhlIHJlc3VsdGluZyBzdGF0ZSBtdXN0IGJlIG9mZmVyIHNhZmUuXG4gKlxuICogQnVybiB0aGF0IGFtb3VudCBvZiBhc3NldHMgZnJvbSB0aGUgcG9vbGVkIHB1cnNlLlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFpDRlNlYXRGYWlsXG4gKlxuICogZmFpbCBjYWxsZWQgd2l0aCB0aGUgcmVhc29uIGZvciB0aGlzIGZhaWx1cmUsIHdoZXJlIHJlYXNvbiBpc1xuICogbm9ybWFsbHkgYW4gaW5zdGFuY2VvZiBFcnJvci5cbiAqIEBwYXJhbSB7dW5rbm93bn0gcmVhc29uXG4gKiBAcmV0dXJucyB7RXJyb3J9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgWkNGR2V0QW1vdW50QWxsb2NhdGVkXG4gKiBUaGUgYnJhbmQgaXMgdXNlZCBmb3IgZmlsbGluZyBpbiBhbiBlbXB0eSBhbW91bnQgaWYgdGhlIGBrZXl3b3JkYFxuICogaXMgbm90IHByZXNlbnQgaW4gdGhlIGFsbG9jYXRpb25cbiAqIEBwYXJhbSB7S2V5d29yZH0ga2V5d29yZFxuICogQHBhcmFtIHtCcmFuZH0gW2JyYW5kXVxuICogQHJldHVybnMge0Ftb3VudDxhbnk+fVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gWkNGU2VhdFxuICogQHByb3BlcnR5IHsoY29tcGxldGlvbj86IENvbXBsZXRpb24pID0+IHZvaWR9IGV4aXRcbiAqIEBwcm9wZXJ0eSB7WkNGU2VhdEZhaWx9IGZhaWxcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxTdWJzY3JpYmVyPEFsbG9jYXRpb24+Pn0gZ2V0U3Vic2NyaWJlclxuICogQHByb3BlcnR5IHsoKSA9PiBib29sZWFufSBoYXNFeGl0ZWRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvcG9zYWxSZWNvcmR9IGdldFByb3Bvc2FsXG4gKiBAcHJvcGVydHkge1pDRkdldEFtb3VudEFsbG9jYXRlZH0gZ2V0QW1vdW50QWxsb2NhdGVkXG4gKiBAcHJvcGVydHkgeygpID0+IEFsbG9jYXRpb259IGdldEN1cnJlbnRBbGxvY2F0aW9uXG4gKiBAcHJvcGVydHkgeygpID0+IEFsbG9jYXRpb259IGdldFN0YWdlZEFsbG9jYXRpb25cbiAqIERlcHJlY2F0ZWQ6IFVzZSBhdG9taWNSZWFycmFuZ2UgaW5zdGVhZFxuICogQHByb3BlcnR5IHsoKSA9PiBib29sZWFufSBoYXNTdGFnZWRBbGxvY2F0aW9uXG4gKiBEZXByZWNhdGVkOiBVc2UgYXRvbWljUmVhcnJhbmdlIGluc3RlYWRcbiAqIEBwcm9wZXJ0eSB7KG5ld0FsbG9jYXRpb246IEFsbG9jYXRpb24pID0+IGJvb2xlYW59IGlzT2ZmZXJTYWZlXG4gKiBAcHJvcGVydHkgeyhhbW91bnRLZXl3b3JkUmVjb3JkOiBBbW91bnRLZXl3b3JkUmVjb3JkKSA9PiBBbW91bnRLZXl3b3JkUmVjb3JkfSBpbmNyZW1lbnRCeVxuICogRGVwcmVjYXRlZDogVXNlIGF0b21pY1JlYXJyYW5nZSBpbnN0ZWFkXG4gKiBAcHJvcGVydHkgeyhhbW91bnRLZXl3b3JkUmVjb3JkOiBBbW91bnRLZXl3b3JkUmVjb3JkKSA9PiBBbW91bnRLZXl3b3JkUmVjb3JkfSBkZWNyZW1lbnRCeVxuICogRGVwcmVjYXRlZDogVXNlIGF0b21pY1JlYXJyYW5nZSBpbnN0ZWFkXG4gKiBAcHJvcGVydHkgeygpID0+IHZvaWR9IGNsZWFyXG4gKiBEZXByZWNhdGVkOiBVc2UgYXRvbWljUmVhcnJhbmdlIGluc3RlYWRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7IHpjZlNlYXQ6IFpDRlNlYXQsIHVzZXJTZWF0OiBFUmVmPFVzZXJTZWF0Pn19IFpjZlNlYXRLaXRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7b2JqZWN0fSBPUiBPZmZlciByZXN1bHRzXG4gKiBAdHlwZWRlZiB7KHNlYXQ6IFpDRlNlYXQsIG9mZmVyQXJncz86IG9iamVjdCkgPT4gT1J9IEhhbmRsZU9mZmVyXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge29iamVjdH0gW09SPXVua25vd25dIE9mZmVyIHJlc3VsdHNcbiAqIEB0eXBlZGVmIHtIYW5kbGVPZmZlcjxPUj4gfCB7IGhhbmRsZTogSGFuZGxlT2ZmZXI8T1I+IH19IE9mZmVySGFuZGxlclxuICovXG5cbi8qKlxuICogQVBJIGZvciBhIGNvbnRyYWN0IHN0YXJ0IGZ1bmN0aW9uLlxuICpcbiAqIENBVkVBVDogYXNzdW1lcyBzeW5jaHJvbm91c1xuICpcbiAqIEBkZXByZWNhdGVkIGRlZmluZSBmdW5jdGlvbiBzaWduYXR1cmUgZGlyZWN0bHlcbiAqXG4gKiBAdGVtcGxhdGUge29iamVjdH0gW1BGPWFueV0gUHVibGljIGZhY2V0XG4gKiBAdGVtcGxhdGUge29iamVjdH0gW0NGPWFueV0gQ3JlYXRvciBmYWNldFxuICogQHRlbXBsYXRlIHtvYmplY3R9IFtDVD1hbnldIEN1c3RvbSB0ZXJtc1xuICogQHRlbXBsYXRlIHtvYmplY3R9IFtQQT1hbnldIFByaXZhdGUgYXJnc1xuICogQGNhbGxiYWNrIENvbnRyYWN0U3RhcnRGblxuICogQHBhcmFtIHtaQ0Y8Q1Q+fSB6Y2ZcbiAqIEBwYXJhbSB7UEF9IHByaXZhdGVBcmdzXG4gKiBAcmV0dXJucyB7Q29udHJhY3RTdGFydEZuUmVzdWx0PFBGLCBDRj59XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgUEYgUHVibGljIGZhY2V0XG4gKiBAdGVtcGxhdGUgQ0YgQ3JlYXRvciBmYWNldFxuICogQHR5cGVkZWYge29iamVjdH0gQ29udHJhY3RTdGFydEZuUmVzdWx0XG4gKiBAcHJvcGVydHkge1BGfSBwdWJsaWNGYWNldFxuICogQHByb3BlcnR5IHtDRn0gY3JlYXRvckZhY2V0XG4gKiBAcHJvcGVydHkge1Byb21pc2U8SW52aXRhdGlvbj59IFtjcmVhdG9ySW52aXRhdGlvbl1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBTXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vem9lU2VydmljZS91dGlscycpLkNvbnRyYWN0T2Y8Uz59IENvbnRyYWN0T2ZcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi96b2VTZXJ2aWNlL3V0aWxzJykuQWRtaW5GYWNldH0gQWRtaW5GYWNldFxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJ25fTuvCwAArwsAADAAAABAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdFN1cHBvcnQvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNlYXRHYWluc0xvc3Nlc1JlY29yZFxuICogQHByb3BlcnR5IHtaQ0ZTZWF0fSBzZWF0XG4gKiBAcHJvcGVydHkge0Ftb3VudEtleXdvcmRSZWNvcmR9IGdhaW5zIC0gd2hhdCB0aGUgc2VhdCB3aWxsXG4gKiBnYWluIGFzIGEgcmVzdWx0IG9mIHRoaXMgdHJhZGVcbiAqIEBwcm9wZXJ0eSB7QW1vdW50S2V5d29yZFJlY29yZH0gbG9zc2VzIC0gd2hhdCB0aGUgc2VhdCBbd2lsbF1cbiAqIGdpdmUgdXAgYXMgYSByZXN1bHQgb2YgdGhpcyB0cmFkZS4gTG9zc2VzIGlzIG9wdGlvbmFsLCBidXQgY2FuXG4gKiBvbmx5IGJlIG9taXR0ZWQgaWYgdGhlIGtleXdvcmRzIGZvciBib3RoIHNlYXRzIGFyZSB0aGUgc2FtZS5cbiAqIElmIGxvc3NlcyBpcyBub3QgZGVmaW5lZCwgdGhlIGdhaW5zIG9mIHRoZSBvdGhlciBzZWF0IGlzXG4gKiBzdWJ0cmFjdGVkLlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFN3YXBcbiAqIElmIHR3byBzZWF0cyBjYW4gc2F0aXNmeSBlYWNoIG90aGVyJ3Mgd2FudHMsIHRyYWRlIGVub3VnaCB0b1xuICogc2F0aXNmeSB0aGUgd2FudHMgb2YgYm90aCBzZWF0cyBhbmQgZXhpdCBib3RoIHNlYXRzLlxuICpcbiAqIFRoZSBzdXJwbHVzIHJlbWFpbnMgd2l0aCB0aGUgb3JpZ2luYWwgc2VhdC4gRm9yIGV4YW1wbGUgaWYgc2VhdCBBXG4gKiBnaXZlcyA1IG1vb2xhIGFuZCBzZWF0IEIgb25seSB3YW50cyAzIG1vb2xhLCBzZWF0IEEgcmV0YWlucyAyXG4gKiBtb29sYS5cbiAqXG4gKiBJZiB0aGUgc3dhcCBmYWlscywgbm8gYXNzZXRzIGFyZSB0cmFuc2ZlcnJlZCwgYm90aCBzZWF0cyB3aWxsIGZhaWwsXG4gKiBhbmQgdGhlIGZ1bmN0aW9uIHRocm93cy5cbiAqXG4gKiBUaGUga2V5d29yZHMgZm9yIGJvdGggc2VhdHMgbXVzdCBtYXRjaC5cbiAqXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge1pDRlNlYXR9IGxlZnRTZWF0XG4gKiBAcGFyYW0ge1pDRlNlYXR9IHJpZ2h0U2VhdFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBTd2FwRXhhY3RcbiAqXG4gKiBTd2FwIHN1Y2ggdGhhdCBib3RoIHNlYXRzIGdhaW4gd2hhdCB0aGV5IHdhbnQgYW5kIGxvc2UgZXZlcnl0aGluZ1xuICogdGhhdCB0aGV5IGdhdmUuIE9ubHkgZ29vZCBmb3IgZXhhY3QgYW5kIGVudGlyZSBzd2FwcyB3aGVyZSBlYWNoXG4gKiBzZWF0IHdhbnRzIGV2ZXJ5dGhpbmcgdGhhdCB0aGUgb3RoZXIgc2VhdCBoYXMuIFRoZSBiZW5lZml0IG9mIHVzaW5nXG4gKiB0aGlzIG1ldGhvZCBpcyB0aGF0IHRoZSBrZXl3b3JkcyBvZiBlYWNoIHNlYXQgZG8gbm90IG1hdHRlci5cbiAqXG4gKiBJZiB0aGUgc3dhcCBmYWlscywgbm8gYXNzZXRzIGFyZSB0cmFuc2ZlcnJlZCwgYm90aCBzZWF0cyB3aWxsIGZhaWwsXG4gKiBhbmQgdGhlIGZ1bmN0aW9uIHRocm93cy5cbiAqXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge1pDRlNlYXR9IGxlZnRTZWF0XG4gKiBAcGFyYW0ge1pDRlNlYXR9IHJpZ2h0U2VhdFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8S2V5d29yZCxLZXl3b3JkPn0gS2V5d29yZEtleXdvcmRSZWNvcmRcbiAqXG4gKiBBIG1hcHBpbmcgb2Yga2V5d29yZHMgdG8ga2V5d29yZHMuXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgUmV2ZXJzZVxuICpcbiAqIEdpdmVuIGEgbWFwcGluZyBvZiBrZXl3b3JkcyB0byBrZXl3b3JkcywgaW52ZXJ0IHRoZSBrZXlzIGFuZFxuICogdmFsdWVzLiBUaGlzIGlzIHVzZWQgdG8gbWFwIHRoZSBvZmZlcnMgbWFkZSB0byBhbm90aGVyIGNvbnRyYWN0XG4gKiBiYWNrIHRvIHRoZSBrZXl3b3JkcyB1c2VkIGluIHRoZSBmaXJzdCBjb250cmFjdC5cbiAqIEBwYXJhbSB7S2V5d29yZEtleXdvcmRSZWNvcmR9IFtrZXl3b3JkUmVjb3JkXVxuICogQHJldHVybnMge0tleXdvcmRLZXl3b3JkUmVjb3JkIH1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBNYXBLZXl3b3Jkc1xuICpcbiAqIFJlbWFwIHRoZSBrZXl3b3JkcyBvZiBhbiBhbW91bnRLZXl3b3JkUmVjb3JkLCBpc3N1ZXJLZXl3b3JkUmVjb3JkLCBvciBhXG4gKiBQYXltZW50UEtleXdvcmRSZWNvcmQgYWNjb3JkaW5nIHRvIGEgbWFwcGluZy4gVGhpcyBpcyB1c2VkIHRvIHJlbWFwXG4gKiBmcm9tIGtleXdvcmRzIHVzZWQgaW4gY29udHJhY3RBIHRvIGtleXdvcmRzIHVzZWQgaW4gY29udHJhY3RCIGFuZFxuICogdmljZSB2ZXJzYSBpbiBgb2ZmZXJUb2BcbiAqXG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmQgfCBQYXltZW50UEtleXdvcmRSZWNvcmQgfCBJc3N1ZXJLZXl3b3JkUmVjb3JkIHwgdW5kZWZpbmVkIH0ga2V5d29yZFJlY29yZFxuICogQHBhcmFtIHtLZXl3b3JkS2V5d29yZFJlY29yZH0ga2V5d29yZE1hcHBpbmdcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJhdGlvXG4gKiBAcHJvcGVydHkge0Ftb3VudDwnbmF0Jz59IG51bWVyYXRvclxuICogQHByb3BlcnR5IHtBbW91bnQ8J25hdCc+fSBkZW5vbWluYXRvclxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFNjYWxlQW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IGFtb3VudFxuICogQHBhcmFtIHtSYXRpb30gcmF0aW9cbiAqIEByZXR1cm5zIHtBbW91bnQ8J25hdCc+fVxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKnQ3z1CBwAAQgcAADUAAABAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdHMvY2FsbFNwcmVhZC90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qKlxuICogQHR5cGVkZWYgeydsb25nJyB8ICdzaG9ydCd9IFBvc2l0aW9uS2luZFxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIE1ha2VPcHRpb25JbnZpdGF0aW9uXG4gKiBAcGFyYW0ge1Bvc2l0aW9uS2luZH0gcG9zaXRpb25LaW5kXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJbnZpdGF0aW9uPn1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBheW9mZkhhbmRsZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gdm9pZH0gc2NoZWR1bGVQYXlvZmZzXG4gKiBAcHJvcGVydHkgIHtNYWtlT3B0aW9uSW52aXRhdGlvbn0gbWFrZU9wdGlvbkludml0YXRpb25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENhbGN1bGF0ZVNoYXJlc1JldHVyblxuICogUmV0dXJuIHZhbHVlIGZyb20gY2FsY3VsYXRlU2hhcmVzLCB3aGljaCByZXByZXNlbnRzIHRoZSBwb3J0aW9ucyBhc3NpZ25lZCB0b1xuICogdGhlIGxvbmcgYW5kIHNob3J0IHNpZGUgb2YgYSB0cmFuc2FjdGlvbi4gVGhlc2Ugd2lsbCBiZSB0d28gbm9uLW5lZ2F0aXZlXG4gKiBpbnRlZ2VycyB0aGF0IHN1bSB0byAxMDAuXG4gKiBAcHJvcGVydHkge1JhdGlvfSBsb25nU2hhcmVcbiAqIEBwcm9wZXJ0eSB7UmF0aW99IHNob3J0U2hhcmVcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBDYWxjdWxhdGVTaGFyZXNcbiAqIGNhbGN1bGF0ZSB0aGUgcG9ydGlvbiAoYXMgYSBwZXJjZW50YWdlKSBvZiB0aGUgY29sbGF0ZXJhbCB0aGF0IHNob3VsZCBiZVxuICogYWxsb2NhdGVkIHRvIHRoZSBsb25nIHNpZGUgb2YgYSBjYWxsIHNwcmVhZCBjb250cmFjdC4gcHJpY2UgZ2l2ZXMgdGhlIHZhbHVlXG4gKiBvZiB0aGUgdW5kZXJseWluZyBhc3NldCBhdCBjbG9zaW5nIHRoYXQgZGV0ZXJtaW5lcyB0aGUgcGF5b3V0cyB0byB0aGUgcGFydGllc1xuICpcbiAqIGlmIHByaWNlIDw9IHN0cmlrZVByaWNlMSwgcmV0dXJuIFJhdGlvIHJlcHJlc2VudGluZyAwXG4gKiBpZiBwcmljZSA+PSBzdHJpa2VQcmljZTIsIHJldHVybiBSYXRpbyByZXByZXNlbnRpbmcgMS5cbiAqIE90aGVyd2lzZSByZXR1cm4gbG9uZ1NoYXJlIGFuZCBzaG9ydFNoYXJlIHJlcHJlc2VudGluZyByYXRpb3MgYmV0d2VlbiAwJSBhbmRcbiAqIDEwMCUgcmVmbGVjdGluZyB0aGUgcG9zaXRpb24gb2YgdGhlIHByaWNlIGluIHRoZSByYW5nZSBmcm9tIHN0cmlrZVByaWNlMSB0b1xuICogc3RyaWtlUHJpY2UyLlxuICogQHBhcmFtIHtCcmFuZH0gY29sbGF0ZXJhbEJyYW5kXG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IHByaWNlXG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IHN0cmlrZVByaWNlMVxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBzdHJpa2VQcmljZTJcbiAqIEByZXR1cm5zIHtDYWxjdWxhdGVTaGFyZXNSZXR1cm59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTWFrZTEwMFBlcmNlbnRcbiAqIEBwYXJhbSB7QnJhbmR9IGJyYW5kXG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTWFrZTBQZXJjZW50XG4gKiBAcGFyYW0ge0JyYW5kfSBicmFuZFxuICogQHJldHVybnMge1JhdGlvfVxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANxeljujAQAAowEAAC0AAABAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdHMvZXhwb3J0ZWQuanN7ImltcG9ydHMiOlsiLi9jYWxsU3ByZWFkL3R5cGVzLmpzIiwiLi9sb2FuL3R5cGVzLmpzIiwiLi90eXBlcy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3R5cGVzLmpzXCIsIFtdXSxbXCIuL2xvYW4vdHlwZXMuanNcIiwgW11dLFtcIi4vY2FsbFNwcmVhZC90eXBlcy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAY1/usogaAACIGgAALwAAAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL2NvbnRyYWN0cy9sb2FuL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyoqXG4gKiBAdHlwZWRlZiB7Tm90aWZpZXI8WGltcG9ydCgnQGFnb3JpYy90aW1lL3NyYy90eXBlcycpLlRpbWVzdGFtcD59IFBlcmlvZE5vdGlmaWVyXG4gKlxuICogIFRoZSBOb3RpZmllciB0aGF0IHByb3ZpZGVzIG5vdGlmaWNhdGlvbnMgdGhhdCBwZXJpb2RzIGhhdmUgcGFzc2VkLlxuICogIFNpbmNlIG5vdGlmaWVycyBjYW4ndCBiZSByZWxpZWQgb24gdG8gcHJvZHVjZSBhbiBvdXRwdXQgZXZlcnkgdGltZVxuICogIHRoZXkgc2hvdWxkLCB3ZSdsbCB0cmFjayB0aGUgdGltZSBvZiBsYXN0IHBheW1lbnQsIGFuZCBjYXRjaCB1cCBpZlxuICogIGFueSB0aW1lcyBoYXZlIGJlZW4gbWlzc2VkLiBDb21wb3VuZCBpbnRlcmVzdCB3aWxsIGJlIGNhbGN1bGF0ZWRcbiAqICB1c2luZyB0aGUgaW50ZXJlc3RSYXRlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0luc3RhbmNlfSBBdXRvc3dhcEluc3RhbmNlXG4gKiAgIFRoZSBydW5uaW5nIGNvbnRyYWN0IGluc3RhbmNlIGZvciBhbiBBdXRvc3dhcCBpbnN0YWxsYXRpb24uICBUaGVcbiAqICAgcHVibGljRmFjZXQgZnJvbSB0aGUgQXV0b3N3YXBcbiAqICAgaW5zdGFuY2UgaXMgdXNlZCBmb3IgcHJvZHVjaW5nIGFuIGludml0YXRpb24gdG8gc2VsbCB0aGVcbiAqICAgY29sbGF0ZXJhbCBvbiBsaXF1aWRhdGlvbi5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExvYW5UZXJtc1xuICpcbiAqIEBwcm9wZXJ0eSB7UmF0aW99IG1tciAtIE1haW50ZW5hbmNlIE1hcmdpbiBSZXF1aXJlbWVudCwgYSBSYXRpbyByZWNvcmQuXG4gKiBEZWZhdWx0IGlzIDE1MCVcbiAqXG4gKiBAcHJvcGVydHkge0F1dG9zd2FwSW5zdGFuY2V9IGF1dG9zd2FwSW5zdGFuY2VcbiAqXG4gKiBAcHJvcGVydHkge1ByaWNlQXV0aG9yaXR5fSBwcmljZUF1dGhvcml0eVxuICpcbiAqICAgVXNlZCBmb3IgZ2V0dGluZyB0aGUgY3VycmVudCB2YWx1ZSBvZiBjb2xsYXRlcmFsIGFuZCBzZXR0aW5nXG4gKiAgIGxpcXVpZGF0aW9uIHRyaWdnZXJzLlxuICpcbiAqIEBwcm9wZXJ0eSB7UGVyaW9kTm90aWZpZXJ9IHBlcmlvZE5vdGlmaWVyXG4gKlxuICogQHByb3BlcnR5IHtSYXRpb30gaW50ZXJlc3RSYXRlXG4gKiAgIFRoZSByYXRlIGluIGJhc2lzIHBvaW50cyB0aGF0IHdpbGwgYmUgbXVsdGlwbGllZCB3aXRoIHRoZSBkZWJ0IG9uXG4gKiAgIGV2ZXJ5IHBlcmlvZCB0byBjb21wb3VuZCBpbnRlcmVzdC5cbiAqXG4gKiBAcHJvcGVydHkge1hpbXBvcnQoJ0BhZ29yaWMvdGltZS9zcmMvdHlwZXMnKS5SZWxhdGl2ZVRpbWV9IGludGVyZXN0UGVyaW9kXG4gKlxuICogQHByb3BlcnR5IHtCcmFuZH0gbG9hbkJyYW5kXG4gKiBAcHJvcGVydHkge0JyYW5kfSBjb2xsYXRlcmFsQnJhbmRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExlbmRlclNlYXRQcm9wZXJ0eVxuICogQHByb3BlcnR5IHtaQ0ZTZWF0fSBsZW5kZXJTZWF0XG4gKlxuICogICBUaGUgWkNGU2VhdCByZXByZXNlbnRpbmcgdGhlIGxlbmRlcidzIHBvc2l0aW9uIGluIHRoZSBjb250cmFjdC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtMb2FuVGVybXMgJiBMZW5kZXJTZWF0UHJvcGVydHl9IExvYW5Db25maWdXaXRoTGVuZGVyXG4gKlxuICogVGhlIGxvYW4gbm93IGhhcyBhIGxlbmRlclNlYXQsIHdoaWNoIGlzIGFkZGVkIHRvIHRoZSBjb25maWcuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBCb3Jyb3dlckNvbmZpZ1Byb3BlcnRpZXNcbiAqXG4gKiBAcHJvcGVydHkge1pDRlNlYXR9IGNvbGxhdGVyYWxTZWF0XG4gKlxuICogICBUaGUgWkNGU2VhdCBob2xkaW5nIHRoZSBjb2xsYXRlcmFsIGluIGVzY3JvdyBhZnRlciB0aGUgYm9ycm93ZXJcbiAqICAgZXNjcm93cyBpdFxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQW1vdW50PCduYXQnPn0gZ2V0RGVidFxuICpcbiAqICAgQSBmdW5jdGlvbiB0byBnZXQgdGhlIGN1cnJlbnQgZGVidFxuICpcbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZVJlY29yZDxQcmljZVF1b3RlPn0gbGlxdWlkYXRpb25Qcm9taXNlS2l0XG4gKlxuICogICBQcm9taXNlS2l0IHRoYXQgaW5jbHVkZXMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBQcmljZVF1b3RlXG4gKiAgIHdoZW4gbGlxdWlkYXRpb24gaXMgdHJpZ2dlcmVkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBCb3Jyb3dlckNvbmZpZ1Byb3BlcnRpZXNNaW51c0RlYnRcbiAqXG4gKiBAcHJvcGVydHkge1pDRlNlYXR9IGNvbGxhdGVyYWxTZWF0XG4gKlxuICogICBUaGUgWkNGU2VhdCBob2xkaW5nIHRoZSBjb2xsYXRlcmFsIGluIGVzY3JvdyBhZnRlciB0aGUgYm9ycm93ZXJcbiAqICAgZXNjcm93cyBpdFxuICpcbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZVJlY29yZDxQcmljZVF1b3RlPn0gbGlxdWlkYXRpb25Qcm9taXNlS2l0XG4gKlxuICogICBQcm9taXNlS2l0IHRoYXQgaW5jbHVkZXMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBQcmljZVF1b3RlXG4gKiAgIHdoZW4gbGlxdWlkYXRpb24gaXMgdHJpZ2dlcmVkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7TG9hbkNvbmZpZ1dpdGhMZW5kZXIgJiBCb3Jyb3dlckNvbmZpZ1Byb3BlcnRpZXMgfSBMb2FuQ29uZmlnV2l0aEJvcnJvd2VyXG4gKlxuICogVGhlIGxvYW4gaGFzIGEgbGVuZGVyLCBhIGJvcnJvd2VyLCBhbmQgY29sbGF0ZXJhbCBlc2Nyb3dlZC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtMb2FuQ29uZmlnV2l0aExlbmRlciAmIEJvcnJvd2VyQ29uZmlnUHJvcGVydGllc01pbnVzRGVidFxuICogfSBMb2FuQ29uZmlnV2l0aEJvcnJvd2VyTWludXNEZWJ0XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgU2NoZWR1bGVMaXF1aWRhdGlvblxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtMb2FuQ29uZmlnV2l0aEJvcnJvd2VyfSBjb25maWdcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBNYWtlTGVuZEludml0YXRpb25cbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqIEBwYXJhbSB7TG9hblRlcm1zfSBjb25maWdcbiAqIEByZXR1cm5zIHtQcm9taXNlPEludml0YXRpb24+fSBsZW5kSW52aXRhdGlvblxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIE1ha2VCb3Jyb3dJbnZpdGF0aW9uXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge0xvYW5Db25maWdXaXRoTGVuZGVyfSBjb25maWdcbiAqIEByZXR1cm5zIHtQcm9taXNlPEludml0YXRpb24+fSBib3Jyb3dJbnZpdGF0aW9uXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTWFrZUNsb3NlTG9hbkludml0YXRpb25cbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqIEBwYXJhbSB7TG9hbkNvbmZpZ1dpdGhCb3Jyb3dlcn0gY29uZmlnXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJbnZpdGF0aW9uPn0gY2xvc2VMb2FuSW52aXRhdGlvblxuICovXG5cbi8qKlxuICogQWxsb3dzIGhvbGRlciB0byBhZGQgY29sbGF0ZXJhbCB0byB0aGUgY29udHJhY3QuIEV4aXRzIHRoZSBzZWF0XG4gKiBhZnRlciBhZGRpbmcuXG4gKlxuICogQGNhbGxiYWNrIE1ha2VBZGRDb2xsYXRlcmFsSW52aXRhdGlvblxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtMb2FuQ29uZmlnV2l0aEJvcnJvd2VyfSBjb25maWdcbiAqIEByZXR1cm5zIHtQcm9taXNlPEludml0YXRpb24+fSBhZGRDb2xsYXRlcmFsSW52aXRhdGlvblxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIExpcXVpZGF0ZVxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtMb2FuQ29uZmlnV2l0aEJvcnJvd2VyfSBjb25maWdcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIE1ha2VEZWJ0Q2FsY3VsYXRvclxuICogQHBhcmFtIHtEZWJ0Q2FsY3VsYXRvckNvbmZpZ30gZGVidENhbGN1bGF0b3JDb25maWdcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBDYWxjSW50ZXJlc3RGblxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBvbGREZWJ0XG4gKiBAcGFyYW0ge1JhdGlvfSBpbnRlcmVzdFJhdGVcbiAqIEByZXR1cm5zIHtBbW91bnQ8J25hdCc+fSBpbnRlcmVzdFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGVidENhbGN1bGF0b3JDb25maWdcbiAqIEBwcm9wZXJ0eSB7Q2FsY0ludGVyZXN0Rm59IGNhbGNJbnRlcmVzdEZuXG4gKlxuICogICBBIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSB0aGUgaW50ZXJlc3QsIGdpdmVuIHRoZSBkZWJ0IHZhbHVlIGFuZCBhblxuICogICBpbnRlcmVzdCByYXRlIGluIGJhc2lzIHBvaW50cy5cbiAqXG4gKiBAcHJvcGVydHkge0Ftb3VudDwnbmF0Jz59IG9yaWdpbmFsRGVidFxuICpcbiAqICAgVGhlIGRlYnQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsb2FuLCBpbiBMb2FuIGJyYW5kXG4gKlxuICogQHByb3BlcnR5IHtQZXJpb2ROb3RpZmllcn0gcGVyaW9kTm90aWZpZXJcbiAqXG4gKiAgIFRoZSBBc3luY0l0ZXJhYmxlIHRvIG5vdGlmeSB3aGVuIGEgcGVyaW9kIGhhcyBvY2N1cnJlZFxuICpcbiAqIEBwcm9wZXJ0eSB7UmF0aW99IGludGVyZXN0UmF0ZVxuICogQHByb3BlcnR5IHtYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuUmVsYXRpdmVUaW1lfSBpbnRlcmVzdFBlcmlvZFxuICpcbiAqICB0aGUgcGVyaW9kIGF0IHdoaWNoIHRoZSBvdXRzdGFuZGluZyBkZWJ0IGluY3JlYXNlcyBieSB0aGUgaW50ZXJlc3RSYXRlXG4gKlxuICogQHByb3BlcnR5IHtaQ0Z9IHpjZlxuICpcbiAqIEBwcm9wZXJ0eSB7TG9hbkNvbmZpZ1dpdGhCb3Jyb3dlck1pbnVzRGVidH0gY29uZmlnTWludXNHZXREZWJ0XG4gKiBAcHJvcGVydHkge1hpbXBvcnQoJ0BhZ29yaWMvdGltZS9zcmMvdHlwZXMnKS5UaW1lc3RhbXB9IGJhc2V0aW1lIFRoZSBzdGFydGluZyBwb2ludCBmcm9tIHdoaWNoIHRvIGNhbGN1bGF0ZVxuICogaW50ZXJlc3QuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDb25maWdNaW51c0dldERlYnRcbiAqIEBwcm9wZXJ0eSB7WkNGU2VhdH0gY29sbGF0ZXJhbFNlYXRcbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZVJlY29yZDxhbnk+fSBsaXF1aWRhdGlvblByb21pc2VLaXRcbiAqIEBwcm9wZXJ0eSB7YmlnaW50fSBbbW1yXVxuICogQHByb3BlcnR5IHtIYW5kbGU8J0luc3RhbmNlJz59IGF1dG9zd2FwSW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7UHJpY2VBdXRob3JpdHl9IHByaWNlQXV0aG9yaXR5XG4gKiBAcHJvcGVydHkge1BlcmlvZE5vdGlmaWVyfSBwZXJpb2ROb3RpZmllclxuICogQHByb3BlcnR5IHtiaWdpbnR9IGludGVyZXN0UmF0ZVxuICogQHByb3BlcnR5IHtYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuUmVsYXRpdmVUaW1lfSBpbnRlcmVzdFBlcmlvZFxuICogQHByb3BlcnR5IHtaQ0ZTZWF0fSBsZW5kZXJTZWF0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCb3Jyb3dGYWNldFxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxJbnZpdGF0aW9uPn0gbWFrZUNsb3NlTG9hbkludml0YXRpb25cbiAqXG4gKiBNYWtlIGFuIGludml0YXRpb24gdG8gY2xvc2UgdGhlIGxvYW4gYnkgcmVwYXlpbmcgdGhlIGRlYnRcbiAqICAgKGluY2x1ZGluZyBpbnRlcmVzdCkuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEludml0YXRpb24+fSBtYWtlQWRkQ29sbGF0ZXJhbEludml0YXRpb25cbiAqXG4gKiBNYWtlIGFuIGludml0YXRpb24gdG8gYWRkIGNvbGxhdGVyYWwgdG8gcHJvdGVjdCBhZ2FpbnN0IGxpcXVpZGF0aW9uXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPFByaWNlUXVvdGU+fSBnZXRMaXF1aWRhdGlvblByb21pc2VcbiAqXG4gKiBHZXQgYSBwcm9taXNlIGZvciBhIHByaWNlUXVvdGUgdGhhdCB3aWxsIHJlc29sdmUgaWYgbGlxdWlkYXRpb25cbiAqIG9jY3Vycy4gVGhlIHByaWNlUXVvdGUgaXMgZm9yIHRoZSB2YWx1ZSBvZiB0aGUgY29sbGF0ZXJhbCB0aGF0XG4gKiB0cmlnZ2VyZWQgdGhlIGxpcXVpZGF0aW9uLiBUaGlzIG1heSBiZSBsb3dlciB0aGFuIGV4cGVjdGVkIGlmIHRoZVxuICogcHJpY2UgaXMgbW92aW5nIHF1aWNrbHkuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXN0YW1wfSBnZXRMYXN0Q2FsY3VsYXRpb25UaW1lc3RhbXBcbiAqXG4gKiBHZXQgdGhlIHRpbWVzdGFtcCBhdCB3aGljaCB0aGUgZGVidCB3YXMgbW9zdCByZWNlbnRseSByZWNhbGN1bGF0ZWQuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBOb3RpZmllcjxBbW91bnQ+fSBnZXREZWJ0Tm90aWZpZXJcbiAqXG4gKiBHZXQgYSBOb3RpZmllciB0aGF0IHdpbGwgYmUgdXBkYXRlZCB3aGVuIHRoZSBjdXJyZW50IGRlYnQgKGFuIEFtb3VudCB3aXRoIHRoZSBMb2FuXG4gKiBCcmFuZCkgY2hhbmdlcy4gVGhpcyB3aWxsIGluY3JlYXNlIGFzIGludGVyZXN0IGlzIGFkZGVkLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQW1vdW50fSBnZXRSZWNlbnRDb2xsYXRlcmFsQW1vdW50XG4gKlxuICogR2V0IGEgcmVjZW50IHJlcG9ydCBvZiB0aGUgYW1vdW50IG9mIGNvbGxhdGVyYWwgaW4gdGhlIGxvYW5cbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC2UO1PvQsAAL0LAAAqAAAAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvY29udHJhY3RzL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTZWxsSXRlbXNQdWJsaWNGYWNldFxuICogQHByb3BlcnR5IHsoKSA9PiBJc3N1ZXJ9IGdldEl0ZW1zSXNzdWVyXG4gKiBAcHJvcGVydHkgeygpID0+IEFtb3VudH0gZ2V0QXZhaWxhYmxlSXRlbXNcbiAqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTZWxsSXRlbXNDcmVhdG9yT25seVxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEludml0YXRpb24+fSBtYWtlQnV5ZXJJbnZpdGF0aW9uXG4gKlxuICogQHR5cGVkZWYge1NlbGxJdGVtc1B1YmxpY0ZhY2V0ICYgU2VsbEl0ZW1zQ3JlYXRvck9ubHl9IFNlbGxJdGVtc0NyZWF0b3JGYWNldFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2VsbEl0ZW1zUGFyYW1ldGVyc1xuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBjdXN0b21WYWx1ZVByb3BlcnRpZXNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBjb3VudFxuICogQHByb3BlcnR5IHtJc3N1ZXJ9IG1vbmV5SXNzdWVyXG4gKiBAcHJvcGVydHkge0luc3RhbGxhdGlvbn0gc2VsbEl0ZW1zSW5zdGFsbGF0aW9uXG4gKiBAcHJvcGVydHkge0Ftb3VudH0gcHJpY2VQZXJJdGVtXG4gKlxuICogQHR5cGVkZWYge29iamVjdH0gU2VsbEl0ZW1zUmVzdWx0XG4gKiBAcHJvcGVydHkge1VzZXJTZWF0fSBzZWxsSXRlbXNDcmVhdG9yU2VhdFxuICogQHByb3BlcnR5IHtTZWxsSXRlbXNDcmVhdG9yRmFjZXR9IHNlbGxJdGVtc0NyZWF0b3JGYWNldFxuICogQHByb3BlcnR5IHtJbnN0YW5jZX0gc2VsbEl0ZW1zSW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7U2VsbEl0ZW1zUHVibGljRmFjZXR9IHNlbGxJdGVtc1B1YmxpY0ZhY2V0XG4gKlxuICogQHR5cGVkZWYge29iamVjdH0gTWludEFuZFNlbGxORlRDcmVhdG9yRmFjZXRcbiAqIEBwcm9wZXJ0eSB7KHNlbGxQYXJhbXM6IFNlbGxJdGVtc1BhcmFtZXRlcnMpID0+IFByb21pc2U8U2VsbEl0ZW1zUmVzdWx0Pn0gc2VsbFRva2Vuc1xuICogQHByb3BlcnR5IHsoKSA9PiBJc3N1ZXJ9IGdldElzc3VlclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQXV0b21hdGljUmVmdW5kUHVibGljRmFjZXRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gYmlnaW50fSBnZXRPZmZlcnNDb3VudFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEludml0YXRpb24+fSBtYWtlSW52aXRhdGlvblxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQXV0b3N3YXBQdWJsaWNGYWNldFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEludml0YXRpb24+fSBtYWtlU3dhcEludml0YXRpb24gc3lub255bSBmb3JcbiAqIG1ha2VTd2FwSW5JbnZpdGF0aW9uXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8SW52aXRhdGlvbj59IG1ha2VTd2FwSW5JbnZpdGF0aW9uIG1ha2UgYW4gaW52aXRhdGlvblxuICogdGhhdCBhbGxvd3Mgb25lIHRvIGRvIGEgc3dhcCBpbiB3aGljaCB0aGUgSW4gYW1vdW50IGlzIHNwZWNpZmllZCBhbmQgdGhlIE91dFxuICogYW1vdW50IGlzIGNhbGN1bGF0ZWRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxJbnZpdGF0aW9uPn0gbWFrZVN3YXBPdXRJbnZpdGF0aW9uIG1ha2UgYW4gaW52aXRhdGlvblxuICogdGhhdCBhbGxvd3Mgb25lIHRvIGRvIGEgc3dhcCBpbiB3aGljaCB0aGUgT3V0IGFtb3VudCBpcyBzcGVjaWZpZWQgYW5kIHRoZSBJblxuICogYW1vdW50IGlzIGNhbGN1bGF0ZWRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxJbnZpdGF0aW9uPn0gbWFrZUFkZExpcXVpZGl0eUludml0YXRpb24gbWFrZSBhblxuICogaW52aXRhdGlvbiB0aGF0IGFsbG93cyBvbmUgdG8gYWRkIGxpcXVpZGl0eSB0byB0aGUgcG9vbC5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxJbnZpdGF0aW9uPn0gbWFrZVJlbW92ZUxpcXVpZGl0eUludml0YXRpb24gbWFrZSBhblxuICogaW52aXRhdGlvbiB0aGF0IGFsbG93cyBvbmUgdG8gcmVtb3ZlIGxpcXVpZGl0eSBmcm9tIHRoZSBwb29sLlxuICogQHByb3BlcnR5IHsoKSA9PiBJc3N1ZXJ9IGdldExpcXVpZGl0eUlzc3VlclxuICogQHByb3BlcnR5IHsoKSA9PiBiaWdpbnR9IGdldExpcXVpZGl0eVN1cHBseSBnZXQgdGhlIGN1cnJlbnQgdmFsdWUgb2ZcbiAqIGxpcXVpZGl0eSBoZWxkIGJ5IGludmVzdG9ycy5cbiAqIEBwcm9wZXJ0eSB7KGFtb3VudEluOiBBbW91bnQsIGJyYW5kT3V0OiBCcmFuZCkgPT4gQW1vdW50fSBnZXRJbnB1dFByaWNlXG4gKiBjYWxjdWxhdGUgdGhlIGFtb3VudCBvZiBicmFuZE91dCB0aGF0IHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlIGFtb3VudEluIGlzXG4gKiBvZmZlcmVkIHVzaW5nIG1ha2VTd2FwSW5JbnZpdGF0aW9uIGF0IHRoZSBjdXJyZW50IHByaWNlLlxuICogQHByb3BlcnR5IHsoYW1vdW50T3V0OiBBbW91bnQsIGJyYW5kSW46IEJyYW5kKSA9PiBBbW91bnR9IGdldE91dHB1dFByaWNlXG4gKiBjYWxjdWxhdGUgdGhlIGFtb3VudCBvZiBicmFuZEluIHRoYXQgaXMgcmVxdWlyZWQgaW4gb3JkZXIgdG8gZ2V0IGFtb3VudE91dFxuICogdXNpbmcgbWFrZVN3YXBPdXRJbnZpdGF0aW9uIGF0IHRoZSBjdXJyZW50IHByaWNlXG4gKiBAcHJvcGVydHkgeygpID0+IFJlY29yZDxzdHJpbmcsIEFtb3VudD59IGdldFBvb2xBbGxvY2F0aW9uIGdldCBhblxuICogQW1vdW50S2V5d29yZFJlY29yZCBzaG93aW5nIHRoZSBjdXJyZW50IGJhbGFuY2VzIGluIHRoZSBwb29sLlxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFRHQeUSQwAAEkMAACUAAABAYWdvcmljL3pvZS12MC4yNS4zL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvbm90aWZpZXIiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy90aW1lIl0sImV4cG9ydHMiOlsiQWRtaW5GYWNldEkiLCJBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUiLCJBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlIiwiQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUiLCJCdW5kbGVDYXBTaGFwZSIsIkJ1bmRsZVNoYXBlIiwiRXhpdE9iamVjdEkiLCJFeGl0T2JqZWN0U2hhcGUiLCJGdWxsUHJvcG9zYWxTaGFwZSIsIkhhbmRsZUkiLCJIYW5kbGVPZmZlckkiLCJJbnN0YWxsYXRpb25TaGFwZSIsIkluc3RhbmNlQWRtaW5JIiwiSW5zdGFuY2VBZG1pblNoYXBlIiwiSW5zdGFuY2VIYW5kbGVTaGFwZSIsIkluc3RhbmNlUmVjb3JkU2hhcGUiLCJJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCIsIkludml0YXRpb25FbGVtZW50U2hhcGUiLCJJbnZpdGF0aW9uSGFuZGxlU2hhcGUiLCJJbnZpdGF0aW9uU2hhcGUiLCJJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUiLCJJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlIiwiSXNzdWVyUmVjb3JkU2hhcGUiLCJLZXl3b3JkU2hhcGUiLCJPZmZlckhhbmRsZXJJIiwiUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUiLCJQcmljZVF1b3RlU2hhcGUiLCJQcm9wb3NhbFNoYXBlIiwiU2VhdERhdGFTaGFwZSIsIlNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlIiwiU2VhdFNoYXBlIiwiVGVybXNTaGFwZSIsIlRpbWVyU2hhcGUiLCJVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZSIsIlpjZk1pbnRJIiwiWm9lTWludEkiLCJab2VNaW50U2hhcGUiLCJab2VTZXJ2aWNlSSIsIlpvZVN0b3JhZ2VNYW5hZ2VySUtpdCIsImlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlIiwiaXNPbkRlbWFuZEV4aXRSdWxlIiwiaXNXYWl2ZWRFeGl0UnVsZSIsIm1ha2VIYW5kbGVTaGFwZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBBbW91bnRTaGFwZSxBc3NldEtpbmRTaGFwZSxEaXNwbGF5SW5mb1NoYXBlLElzc3VlclNoYXBlLEJyYW5kU2hhcGUsUGF5bWVudFNoYXBlLElzc3VlcktpdFNoYXBlLE0sVGltZXN0YW1wVmFsdWVTaGFwZSxTdWJzY3JpYmVyU2hhcGU7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRTaGFwZVwiLCBbJGjigI1fYSA9PiAoQW1vdW50U2hhcGUgPSAkaOKAjV9hKV1dLFtcIkFzc2V0S2luZFNoYXBlXCIsIFskaOKAjV9hID0+IChBc3NldEtpbmRTaGFwZSA9ICRo4oCNX2EpXV0sW1wiRGlzcGxheUluZm9TaGFwZVwiLCBbJGjigI1fYSA9PiAoRGlzcGxheUluZm9TaGFwZSA9ICRo4oCNX2EpXV0sW1wiSXNzdWVyU2hhcGVcIiwgWyRo4oCNX2EgPT4gKElzc3VlclNoYXBlID0gJGjigI1fYSldXSxbXCJCcmFuZFNoYXBlXCIsIFskaOKAjV9hID0+IChCcmFuZFNoYXBlID0gJGjigI1fYSldXSxbXCJQYXltZW50U2hhcGVcIiwgWyRo4oCNX2EgPT4gKFBheW1lbnRTaGFwZSA9ICRo4oCNX2EpXV0sW1wiSXNzdWVyS2l0U2hhcGVcIiwgWyRo4oCNX2EgPT4gKElzc3VlcktpdFNoYXBlID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy90aW1lXCIsIFtbXCJUaW1lc3RhbXBWYWx1ZVNoYXBlXCIsIFskaOKAjV9hID0+IChUaW1lc3RhbXBWYWx1ZVNoYXBlID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcIlN1YnNjcmliZXJTaGFwZVwiLCBbJGjigI1fYSA9PiAoU3Vic2NyaWJlclNoYXBlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiBrZXl3b3JkcyBoYXZlIGFuIGluaXRpYWwgY2FwKi9cbmNvbnN0ICAgICAgICBLZXl3b3JkU2hhcGU9TS5zdHJpbmcoKTskaOKAjV9vbmNlLktleXdvcmRTaGFwZShLZXl3b3JkU2hhcGUpO1xuXG5jb25zdCAgICAgICAgSW52aXRhdGlvbkhhbmRsZVNoYXBlPU0ucmVtb3RhYmxlKCdJbnZpdGF0aW9uSGFuZGxlJyk7JGjigI1fb25jZS5JbnZpdGF0aW9uSGFuZGxlU2hhcGUoSW52aXRhdGlvbkhhbmRsZVNoYXBlKTtcbmNvbnN0ICAgICAgICBJbnZpdGF0aW9uU2hhcGU9TS5yZW1vdGFibGUoJ0ludml0YXRpb24nKTskaOKAjV9vbmNlLkludml0YXRpb25TaGFwZShJbnZpdGF0aW9uU2hhcGUpO1xuY29uc3QgICAgICAgIEluc3RhbmNlSGFuZGxlU2hhcGU9TS5yZW1vdGFibGUoJ0luc3RhbmNlSGFuZGxlJyk7JGjigI1fb25jZS5JbnN0YW5jZUhhbmRsZVNoYXBlKEluc3RhbmNlSGFuZGxlU2hhcGUpO1xuY29uc3QgICAgICAgIEluc3RhbGxhdGlvblNoYXBlPU0ucmVtb3RhYmxlKCdJbnN0YWxsYXRpb24nKTskaOKAjV9vbmNlLkluc3RhbGxhdGlvblNoYXBlKEluc3RhbGxhdGlvblNoYXBlKTtcbmNvbnN0ICAgICAgICBTZWF0U2hhcGU9TS5yZW1vdGFibGUoJ1NlYXQnKTskaOKAjV9vbmNlLlNlYXRTaGFwZShTZWF0U2hhcGUpO1xuXG5jb25zdCAgICAgICAgQW1vdW50S2V5d29yZFJlY29yZFNoYXBlPU0ucmVjb3JkT2YoS2V5d29yZFNoYXBlLEFtb3VudFNoYXBlKTskaOKAjV9vbmNlLkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZShBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUpO1xuY29uc3QgICAgICAgIEFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGU9TS5yZWNvcmRPZihcbktleXdvcmRTaGFwZSxcbk0ucGF0dGVybigpKTskaOKAjV9vbmNlLkFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUoQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZT1NLnJlY29yZE9mKFxuS2V5d29yZFNoYXBlLFxuTS5lcmVmKFBheW1lbnRTaGFwZSkpOyRo4oCNX29uY2UuUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUoUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUpO1xuXG5jb25zdCAgICAgICAgSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlPU0ucmVjb3JkT2YoS2V5d29yZFNoYXBlLElzc3VlclNoYXBlKTskaOKAjV9vbmNlLklzc3VlcktleXdvcmRSZWNvcmRTaGFwZShJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUpO1xuY29uc3QgICAgICAgIElzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGU9TS5yZWNvcmRPZihcbktleXdvcmRTaGFwZSxcbk0uZXJlZihJc3N1ZXJTaGFwZSkpOyRo4oCNX29uY2UuSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZShJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlKTtcblxuY29uc3QgICAgICAgIEJyYW5kS2V5d29yZFJlY29yZFNoYXBlPU0ucmVjb3JkT2YoS2V5d29yZFNoYXBlLEJyYW5kU2hhcGUpOyRo4oCNX29uY2UuQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUoQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUpO1xuXG5jb25zdCAgICAgICAgSXNzdWVyUmVjb3JkU2hhcGU9TS5zcGxpdFJlY29yZChcbntcbmJyYW5kOkJyYW5kU2hhcGUsXG5pc3N1ZXI6SXNzdWVyU2hhcGUsXG5hc3NldEtpbmQ6QXNzZXRLaW5kU2hhcGV9LFxuXG57ZGlzcGxheUluZm86RGlzcGxheUluZm9TaGFwZX0pOyRo4oCNX29uY2UuSXNzdWVyUmVjb3JkU2hhcGUoSXNzdWVyUmVjb3JkU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBUZXJtc1NoYXBlPWhhcmRlbih7XG5pc3N1ZXJzOklzc3VlcktleXdvcmRSZWNvcmRTaGFwZSxcbmJyYW5kczpCcmFuZEtleXdvcmRSZWNvcmRTaGFwZX0pOyRo4oCNX29uY2UuVGVybXNTaGFwZShUZXJtc1NoYXBlKTtcblxuXG5jb25zdCAgICAgICAgSW5zdGFuY2VSZWNvcmRTaGFwZT1oYXJkZW4oe1xuaW5zdGFsbGF0aW9uOkluc3RhbGxhdGlvblNoYXBlLFxuaW5zdGFuY2U6SW5zdGFuY2VIYW5kbGVTaGFwZSxcbnRlcm1zOk0uc3BsaXRSZWNvcmQoVGVybXNTaGFwZSl9KTskaOKAjV9vbmNlLkluc3RhbmNlUmVjb3JkU2hhcGUoSW5zdGFuY2VSZWNvcmRTaGFwZSk7XG5cblxuY29uc3QgICAgICAgIEhhbmRsZUk9TS5pbnRlcmZhY2UoJ0hhbmRsZScse30pOyRo4oCNX29uY2UuSGFuZGxlSShIYW5kbGVJKTtcblxuY29uc3QgICAgICAgIG1ha2VIYW5kbGVTaGFwZT0obmFtZSk9Pk0ucmVtb3RhYmxlKCBgJHtuYW1lfUhhbmRsZWApOyRo4oCNX29uY2UubWFrZUhhbmRsZVNoYXBlKG1ha2VIYW5kbGVTaGFwZSk7XG5jb25zdCAgICAgICAgVGltZXJTaGFwZT1tYWtlSGFuZGxlU2hhcGUoJ3RpbWVyJyk7XG5cbi8qKlxuICogQWZ0ZXIgZGVmYXVsdHMgYXJlIGZpbGxlZCBpblxuICpcbiAqIEBzZWUge1Byb3Bvc2FsUmVjb3JkfSB0eXBlXG4gKi8kaOKAjV9vbmNlLlRpbWVyU2hhcGUoVGltZXJTaGFwZSk7XG5jb25zdCAgICAgICAgRnVsbFByb3Bvc2FsU2hhcGU9aGFyZGVuKHtcbndhbnQ6QW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZSxcbmdpdmU6QW1vdW50S2V5d29yZFJlY29yZFNoYXBlLFxuLyogVG8gYWNjZXB0IG9ubHkgb25lLCB3ZSBjb3VsZCB1c2UgTS5vciByYXRoZXIgdGhhbiBNLnNwbGl0UmVjb3JkLCovXG4vKiBidXQgdGhlIGVycm9yIG1lc3NhZ2VzIHdvdWxkIGhhdmUgYmVlbiB3b3JzZS4gUmF0aGVyLCovXG4vKiBjbGVhblByb3Bvc2FsJ3MgYXNzZXJ0RXhpdCBjaGVja3MgdGhhdCB0aGVyZSdzIGV4YWN0bHkgb25lLiovXG5leGl0Ok0uc3BsaXRSZWNvcmQoXG57fSxcbntcbm9uRGVtYW5kOm51bGwsXG53YWl2ZWQ6bnVsbCxcbmFmdGVyRGVhZGxpbmU6e1xudGltZXI6TS5lcmVmKFRpbWVyU2hhcGUpLFxuZGVhZGxpbmU6VGltZXN0YW1wVmFsdWVTaGFwZX19LFxuXG5cbnt9KX0pO1xuXG5cbi8qKiBAc2VlIHtQcm9wb3NhbH0gdHlwZSAqLyRo4oCNX29uY2UuRnVsbFByb3Bvc2FsU2hhcGUoRnVsbFByb3Bvc2FsU2hhcGUpO1xuY29uc3QgICAgICAgIFByb3Bvc2FsU2hhcGU9TS5zcGxpdFJlY29yZCh7fSxGdWxsUHJvcG9zYWxTaGFwZSx7fSk7JGjigI1fb25jZS5Qcm9wb3NhbFNoYXBlKFByb3Bvc2FsU2hhcGUpO1xuXG5jb25zdCAgICAgICAgaXNPbkRlbWFuZEV4aXRSdWxlPShleGl0KT0+e1xuY29uc3RbZXhpdEtleV09T2JqZWN0LmtleXMoZXhpdCk7XG5yZXR1cm4gZXhpdEtleT09PSdvbkRlbWFuZCc7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge0V4aXRSdWxlfSBleGl0XG4gKiBAcmV0dXJucyB7ZXhpdCBpcyBXYWl2ZWRFeGl0UnVsZX1cbiAqLyRo4oCNX29uY2UuaXNPbkRlbWFuZEV4aXRSdWxlKGlzT25EZW1hbmRFeGl0UnVsZSk7XG5jb25zdCAgICAgICAgaXNXYWl2ZWRFeGl0UnVsZT0oZXhpdCk9PntcbmNvbnN0W2V4aXRLZXldPU9iamVjdC5rZXlzKGV4aXQpO1xucmV0dXJuIGV4aXRLZXk9PT0nd2FpdmVkJztcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7RXhpdFJ1bGV9IGV4aXRcbiAqIEByZXR1cm5zIHtleGl0IGlzIEFmdGVyRGVhZGxpbmVFeGl0UnVsZX1cbiAqLyRo4oCNX29uY2UuaXNXYWl2ZWRFeGl0UnVsZShpc1dhaXZlZEV4aXRSdWxlKTtcbmNvbnN0ICAgICAgICBpc0FmdGVyRGVhZGxpbmVFeGl0UnVsZT0oZXhpdCk9PntcbmNvbnN0W2V4aXRLZXldPU9iamVjdC5rZXlzKGV4aXQpO1xucmV0dXJuIGV4aXRLZXk9PT0nYWZ0ZXJEZWFkbGluZSc7XG4gfTskaOKAjV9vbmNlLmlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlKGlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlKTtcblxuY29uc3QgICAgICAgIEludml0YXRpb25FbGVtZW50U2hhcGU9TS5zcGxpdFJlY29yZCh7XG5kZXNjcmlwdGlvbjpNLnN0cmluZygpLFxuaGFuZGxlOkludml0YXRpb25IYW5kbGVTaGFwZSxcbmluc3RhbmNlOkluc3RhbmNlSGFuZGxlU2hhcGUsXG5pbnN0YWxsYXRpb246SW5zdGFsbGF0aW9uU2hhcGV9KTskaOKAjV9vbmNlLkludml0YXRpb25FbGVtZW50U2hhcGUoSW52aXRhdGlvbkVsZW1lbnRTaGFwZSk7XG5cblxuY29uc3QgICAgICAgIE9mZmVySGFuZGxlckk9TS5pbnRlcmZhY2UoJ09mZmVySGFuZGxlcicse1xuaGFuZGxlOk0uY2FsbChTZWF0U2hhcGUpLm9wdGlvbmFsKE0uYW55KCkpLnJldHVybnMoTS5zdHJpbmcoKSl9KTskaOKAjV9vbmNlLk9mZmVySGFuZGxlckkoT2ZmZXJIYW5kbGVySSk7XG5cblxuY29uc3QgICAgICAgIFNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlPU0uYXJyYXlPZihcbmhhcmRlbih7XG5zZWF0SGFuZGxlOlNlYXRTaGFwZSxcbmFsbG9jYXRpb246QW1vdW50S2V5d29yZFJlY29yZFNoYXBlfSkpOyRo4oCNX29uY2UuU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGUoU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGUpO1xuXG5cblxuY29uc3QgICAgICAgIFpvZU1pbnRTaGFwZT1NLnJlbW90YWJsZSgnWm9lTWludCcpOyRo4oCNX29uY2UuWm9lTWludFNoYXBlKFpvZU1pbnRTaGFwZSk7XG5jb25zdCAgICAgICAgWm9lTWludEk9TS5pbnRlcmZhY2UoJ1pvZU1pbnQnLHtcbmdldElzc3VlclJlY29yZDpNLmNhbGwoKS5yZXR1cm5zKElzc3VlclJlY29yZFNoYXBlKSxcbm1pbnRBbmRFc2Nyb3c6TS5jYWxsKEFtb3VudFNoYXBlKS5yZXR1cm5zKCksXG53aXRoZHJhd0FuZEJ1cm46TS5jYWxsKEFtb3VudFNoYXBlKS5yZXR1cm5zKCl9KTskaOKAjV9vbmNlLlpvZU1pbnRJKFpvZU1pbnRJKTtcblxuXG5jb25zdCAgICAgICAgWmNmTWludEk9TS5pbnRlcmZhY2UoJ1pjZk1pbnQnLHtcbmdldElzc3VlclJlY29yZDpNLmNhbGwoKS5yZXR1cm5zKElzc3VlclJlY29yZFNoYXBlKSxcbm1pbnRHYWluczpNLmNhbGwoQW1vdW50S2V5d29yZFJlY29yZFNoYXBlLE0ucmVtb3RhYmxlKCd6Y2ZTZWF0JykpLnJldHVybnMoKSxcbmJ1cm5Mb3NzZXM6TS5jYWxsKFxuQW1vdW50S2V5d29yZFJlY29yZFNoYXBlLFxuTS5yZW1vdGFibGUoJ3pjZlNlYXQnKSkuXG5yZXR1cm5zKCl9KTskaOKAjV9vbmNlLlpjZk1pbnRJKFpjZk1pbnRJKTtcblxuXG5jb25zdCAgICAgICAgRXhpdE9iamVjdEk9TS5pbnRlcmZhY2UoJ0V4aXQgT2JqZWN0Jyx7XG5leGl0Ok0uY2FsbCgpLnJldHVybnMoKX0pOyRo4oCNX29uY2UuRXhpdE9iamVjdEkoRXhpdE9iamVjdEkpO1xuXG5cbmNvbnN0ICAgICAgICBFeGl0T2JqZWN0U2hhcGU9TS5yZW1vdGFibGUoJ0V4aXRPYmonKTskaOKAjV9vbmNlLkV4aXRPYmplY3RTaGFwZShFeGl0T2JqZWN0U2hhcGUpO1xuY29uc3QgICAgICAgIEluc3RhbmNlQWRtaW5TaGFwZT1NLnJlbW90YWJsZSgnSW5zdGFuY2VBZG1pbicpOyRo4oCNX29uY2UuSW5zdGFuY2VBZG1pblNoYXBlKEluc3RhbmNlQWRtaW5TaGFwZSk7XG5jb25zdCAgICAgICAgSW5zdGFuY2VBZG1pbkk9TS5pbnRlcmZhY2UoJ0luc3RhbmNlQWRtaW4nLHtcbm1ha2VJbnZpdGF0aW9uOk0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUsTS5zdHJpbmcoKSkuXG5vcHRpb25hbChNLnJlY29yZCgpLE0ucGF0dGVybigpKS5cbnJldHVybnMoSW52aXRhdGlvblNoYXBlKSxcbnNhdmVJc3N1ZXI6TS5jYWxsV2hlbihNLmF3YWl0KElzc3VlclNoYXBlKSxLZXl3b3JkU2hhcGUpLnJldHVybnMoXG5Jc3N1ZXJSZWNvcmRTaGFwZSksXG5cbm1ha2VOb0VzY3Jvd1NlYXQ6TS5jYWxsKFxuQW1vdW50S2V5d29yZFJlY29yZFNoYXBlLFxuUHJvcG9zYWxTaGFwZSxcbkV4aXRPYmplY3RTaGFwZSxcblNlYXRTaGFwZSkuXG5yZXR1cm5zKFNlYXRTaGFwZSksXG5leGl0QWxsU2VhdHM6TS5jYWxsKE0uYW55KCkpLnJldHVybnMoKSxcbmZhaWxBbGxTZWF0czpNLmNhbGwoTS5hbnkoKSkucmV0dXJucygpLFxuZXhpdFNlYXQ6TS5jYWxsKFNlYXRTaGFwZSxNLmFueSgpKS5yZXR1cm5zKCksXG5mYWlsU2VhdDpNLmNhbGwoU2VhdFNoYXBlLE0uYW55KCkpLnJldHVybnMoKSxcbm1ha2Vab2VNaW50Ok0uY2FsbChLZXl3b3JkU2hhcGUpLlxub3B0aW9uYWwoXG5Bc3NldEtpbmRTaGFwZSxcbkRpc3BsYXlJbmZvU2hhcGUsXG5NLnNwbGl0UmVjb3JkKGhhcmRlbih7fSksaGFyZGVuKHtlbGVtZW50U2hhcGU6TS5wYXR0ZXJuKCl9KSkpLlxuXG5yZXR1cm5zKE0ucmVtb3RhYmxlKCd6b2VNaW50JykpLFxucmVnaXN0ZXJGZWVNaW50Ok0uY2FsbChLZXl3b3JkU2hhcGUsTS5yZW1vdGFibGUoJ2ZlZU1pbnRBY2Nlc3MnKSkucmV0dXJucyhcbk0ucmVtb3RhYmxlKCdmZWVNaW50JykpLFxuXG5yZXBsYWNlQWxsb2NhdGlvbnM6TS5jYWxsKFNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlKS5yZXR1cm5zKCksXG5zdG9wQWNjZXB0aW5nT2ZmZXJzOk0uY2FsbCgpLnJldHVybnMoKSxcbnNldE9mZmVyRmlsdGVyOk0uY2FsbChNLmFycmF5T2YoTS5zdHJpbmcoKSkpLnJldHVybnMoKSxcbmdldE9mZmVyRmlsdGVyOk0uY2FsbCgpLnJldHVybnMoTS5hcnJheU9mKE0uc3RyaW5nKCkpKSxcbmdldEV4aXRTdWJzY3JpYmVyOk0uY2FsbChTZWF0U2hhcGUpLnJldHVybnMoU3Vic2NyaWJlclNoYXBlKSxcbmlzQmxvY2tlZDpNLmNhbGwoTS5zdHJpbmcoKSkucmV0dXJucyhNLmJvb2xlYW4oKSl9KTskaOKAjV9vbmNlLkluc3RhbmNlQWRtaW5JKEluc3RhbmNlQWRtaW5JKTtcblxuXG5jb25zdCAgICAgICAgSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQ9aGFyZGVuKHtcbmluc3RhbmNlU3RvcmFnZU1hbmFnZXI6TS5pbnRlcmZhY2UoJ0luc3RhbmNlU3RvcmFnZU1hbmFnZXInLHtcbmdldFRlcm1zOk0uY2FsbCgpLnJldHVybnMoTS5zcGxpdFJlY29yZChUZXJtc1NoYXBlKSksXG5nZXRJc3N1ZXJzOk0uY2FsbCgpLnJldHVybnMoSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlKSxcbmdldEJyYW5kczpNLmNhbGwoKS5yZXR1cm5zKEJyYW5kS2V5d29yZFJlY29yZFNoYXBlKSxcbmdldEluc3RhbGxhdGlvbjpNLmNhbGwoKS5yZXR1cm5zKEluc3RhbGxhdGlvblNoYXBlKSxcbmdldEludml0YXRpb25Jc3N1ZXI6TS5jYWxsKCkucmV0dXJucyhJc3N1ZXJTaGFwZSksXG5cbnNhdmVJc3N1ZXI6TS5jYWxsKElzc3VlclNoYXBlLEtleXdvcmRTaGFwZSkucmV0dXJucyhNLnByb21pc2UoKSksXG5tYWtlWm9lTWludDpNLmNhbGwoS2V5d29yZFNoYXBlKS5cbm9wdGlvbmFsKFxuQXNzZXRLaW5kU2hhcGUsXG5EaXNwbGF5SW5mb1NoYXBlLFxuTS5zcGxpdFJlY29yZChoYXJkZW4oe30pLGhhcmRlbih7ZWxlbWVudFNoYXBlOk0ucGF0dGVybigpfSkpKS5cblxucmV0dXJucyhNLmVyZWYoWm9lTWludFNoYXBlKSksXG5yZWdpc3RlckZlZU1pbnQ6TS5jYWxsKEtleXdvcmRTaGFwZSxNLnJlbW90YWJsZSgnZmVlTWludEFjY2VzcycpKS5yZXR1cm5zKFxuTS5yZW1vdGFibGUoJ2ZlZU1pbnQnKSksXG5cbmdldEluc3RhbmNlUmVjb3JkOk0uY2FsbCgpLnJldHVybnMoSW5zdGFuY2VSZWNvcmRTaGFwZSksXG5nZXRJc3N1ZXJSZWNvcmRzOk0uY2FsbCgpLnJldHVybnMoTS5hcnJheU9mKElzc3VlclJlY29yZFNoYXBlKSksXG5nZXRXaXRoZHJhd0ZhY2V0Ok0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoJ1dpdGhkcmF3RmFjZXQnKSksXG5pbml0SW5zdGFuY2VBZG1pbjpNLmNhbGwoXG5JbnN0YW5jZUhhbmRsZVNoYXBlLFxuTS5yZW1vdGFibGUoJ2luc3RhbmNlQWRtaW4nKSkuXG5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbmRlbGV0ZUluc3RhbmNlQWRtaW46TS5jYWxsKEluc3RhbmNlQWRtaW5JKS5yZXR1cm5zKCksXG5tYWtlSW52aXRhdGlvbjpNLmNhbGwoSW52aXRhdGlvbkhhbmRsZVNoYXBlLE0uc3RyaW5nKCkpLlxub3B0aW9uYWwoTS5yZWNvcmQoKSxNLnBhdHRlcm4oKSkuXG5yZXR1cm5zKFBheW1lbnRTaGFwZSksXG5nZXRSb290Ok0uY2FsbCgpLnJldHVybnMoTS5hbnkoKSksXG5nZXRBZG1pbk5vZGU6TS5jYWxsKCkucmV0dXJucyhNLnJlbW90YWJsZSgnYWRtaW5Ob2RlJykpfSksXG5cbndpdGhkcmF3RmFjZXQ6TS5pbnRlcmZhY2UoJ1dpdGhkcmF3RmFjZXQnLHtcbndpdGhkcmF3UGF5bWVudHM6TS5jYWxsKEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSkucmV0dXJucyhcblBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlKX0pLFxuXG5cbmhlbHBlcnM6TS5pbnRlcmZhY2UoJ0luc3RhbmNlU3RvcmFnZU1hbmFnZXIgaGVscGVyJyx7XG53cmFwSXNzdWVyS2l0V2l0aFpvZU1pbnQ6TS5jYWxsKFxuS2V5d29yZFNoYXBlLFxuSXNzdWVyS2l0U2hhcGUsXG5NLnJlbW90YWJsZSgnYWRtaW5Ob2RlJykpLlxucmV0dXJucyhab2VNaW50U2hhcGUpfSl9KTskaOKAjV9vbmNlLkluc3RhbmNlU3RvcmFnZU1hbmFnZXJJS2l0KEluc3RhbmNlU3RvcmFnZU1hbmFnZXJJS2l0KTtcblxuXG5cbmNvbnN0ICAgICAgICBCdW5kbGVDYXBTaGFwZT1NLnJlbW90YWJsZSgnYnVuZGxlQ2FwJyk7JGjigI1fb25jZS5CdW5kbGVDYXBTaGFwZShCdW5kbGVDYXBTaGFwZSk7XG5jb25zdCAgICAgICAgQnVuZGxlU2hhcGU9TS5hbmQoXG5NLnNwbGl0UmVjb3JkKHttb2R1bGVGb3JtYXQ6TS5hbnkoKX0pLFxuTS5yZWNvcmRPZihNLnN0cmluZygpLE0uc3RyaW5nKHtzdHJpbmdMZW5ndGhMaW1pdDpJbmZpbml0eX0pKSk7JGjigI1fb25jZS5CdW5kbGVTaGFwZShCdW5kbGVTaGFwZSk7XG5cblxuY29uc3QgICAgICAgIFVud3JhcHBlZEluc3RhbGxhdGlvblNoYXBlPU0uc3BsaXRSZWNvcmQoXG5oYXJkZW4oe1xuaW5zdGFsbGF0aW9uOkluc3RhbGxhdGlvblNoYXBlfSksXG5cbmhhcmRlbih7XG5idW5kbGU6TS5yZWNvcmRPZihNLnN0cmluZygpLE0uc3RyaW5nKHtzdHJpbmdMZW5ndGhMaW1pdDpJbmZpbml0eX0pKSxcbmJ1bmRsZUNhcDpCdW5kbGVDYXBTaGFwZSxcbmJ1bmRsZUlEOk0uc3RyaW5nKCl9KSxcblxuaGFyZGVuKHt9KSk7JGjigI1fb25jZS5VbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZShVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZSk7XG5cblxuY29uc3QgICAgICAgIFpvZVN0b3JhZ2VNYW5hZ2VySUtpdD1oYXJkZW4oe1xuem9lU2VydmljZURhdGFBY2Nlc3M6TS5pbnRlcmZhY2UoJ1pvZVNlcnZpY2UgZGF0YUFjY2Vzcycse1xuZ2V0VGVybXM6TS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoTS5zcGxpdFJlY29yZChUZXJtc1NoYXBlKSksXG5nZXRJc3N1ZXJzOk0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKElzc3VlcktleXdvcmRSZWNvcmRTaGFwZSksXG5nZXRCcmFuZHM6TS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUpLFxuZ2V0SW5zdGFsbGF0aW9uOk0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuTS5lcmVmKE0ucmVtb3RhYmxlKCdJbnN0YWxsYXRpb24nKSkpLFxuXG5nZXRJbnZpdGF0aW9uSXNzdWVyOk0uY2FsbCgpLnJldHVybnMoSXNzdWVyU2hhcGUpLFxuXG5nZXRCdW5kbGVJREZyb21JbnN0YWxsYXRpb246TS5jYWxsKEluc3RhbGxhdGlvblNoYXBlKS5yZXR1cm5zKFxuTS5lcmVmKE0uc3RyaW5nKCkpKSxcblxuaW5zdGFsbEJ1bmRsZTpNLmNhbGwoTS5vcihJbnN0YW5jZUhhbmRsZVNoYXBlLEJ1bmRsZVNoYXBlKSkucmV0dXJucyhcbk0ucHJvbWlzZSgpKSxcblxuaW5zdGFsbEJ1bmRsZUlEOk0uY2FsbChNLnN0cmluZygpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcblxuZ2V0UHVibGljRmFjZXQ6TS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoXG5NLmVyZWYoTS5yZW1vdGFibGUoJ1B1YmxpY0ZhY2V0JykpKSxcblxuZ2V0T2ZmZXJGaWx0ZXI6TS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoTS5hcnJheU9mKE0uc3RyaW5nKCkpKSxcbmdldFByb3Bvc2FsU2hhcGVGb3JJbnZpdGF0aW9uOk0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUpLnJldHVybnMoXG5NLm9wdChNLnBhdHRlcm4oKSkpfSksXG5cblxubWFrZU9mZmVyQWNjZXNzOk0uaW50ZXJmYWNlKCdab2VTdG9yYWdlIG1ha2VPZmZlciBhY2Nlc3MnLHtcbmdldEFzc2V0S2luZEJ5QnJhbmQ6TS5jYWxsKEJyYW5kU2hhcGUpLnJldHVybnMoQXNzZXRLaW5kU2hhcGUpLFxuZ2V0SW5zdGFuY2VBZG1pbjpNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhcbk0ucmVtb3RhYmxlKCdpbnN0YW5jZUFkbWluJykpLFxuXG5nZXRQcm9wb3NhbFNoYXBlRm9ySW52aXRhdGlvbjpNLmNhbGwoSW52aXRhdGlvbkhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuTS5vcHQoTS5wYXR0ZXJuKCkpKSxcblxuZ2V0SW52aXRhdGlvbklzc3VlcjpNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKSxcbmRlcG9zaXRQYXltZW50czpNLmNhbGwoUHJvcG9zYWxTaGFwZSxQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSkucmV0dXJucyhcbk0ucHJvbWlzZSgpKX0pLFxuXG5cbnN0YXJ0SW5zdGFuY2VBY2Nlc3M6TS5pbnRlcmZhY2UoJ1pvZVN0b3JhZ2Ugc3RhcnRJbnN0YW5jZSBhY2Nlc3MnLHtcbm1ha2Vab2VJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyOk0uY2FsbChcbk0uYW55KCksXG5JbnN0YWxsYXRpb25TaGFwZSxcbk0uYW55KCksXG5Jc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlLFxuTS5vcihJbnN0YW5jZUhhbmRsZVNoYXBlLEJ1bmRsZVNoYXBlKSxcbk0ub3IoQnVuZGxlQ2FwU2hhcGUsQnVuZGxlU2hhcGUpKS5cbnJldHVybnMoTS5wcm9taXNlKCkpLFxudW53cmFwSW5zdGFsbGF0aW9uOk0uY2FsbFdoZW4oTS5lcmVmKEluc3RhbGxhdGlvblNoYXBlKSkucmV0dXJucyhcblVud3JhcHBlZEluc3RhbGxhdGlvblNoYXBlKX0pLFxuXG5cbmludml0YXRpb25Jc3N1ZXJBY2Nlc3M6TS5pbnRlcmZhY2UoJ1pvZVN0b3JhZ2UgaW52aXRhdGlvbklzc3Vlcicse1xuZ2V0SW52aXRhdGlvbklzc3VlcjpNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKX0pfSk7JGjigI1fb25jZS5ab2VTdG9yYWdlTWFuYWdlcklLaXQoWm9lU3RvcmFnZU1hbmFnZXJJS2l0KTtcblxuXG5cbmNvbnN0ICAgICAgICBab2VTZXJ2aWNlST1NLmludGVyZmFjZSgnWm9lU2VydmljZScse1xuaW5zdGFsbDpNLmNhbGwoTS5hbnkoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG5pbnN0YWxsQnVuZGxlSUQ6TS5jYWxsKE0uc3RyaW5nKCkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuc3RhcnRJbnN0YW5jZTpNLmNhbGwoTS5lcmVmKEluc3RhbGxhdGlvblNoYXBlKSkuXG5vcHRpb25hbChJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlLE0uYW55KCksTS5hbnkoKSkuXG5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbm9mZmVyOk0uY2FsbChNLmVyZWYoSW52aXRhdGlvblNoYXBlKSkuXG5vcHRpb25hbChQcm9wb3NhbFNoYXBlLFBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlLE0uYW55KCkpLlxucmV0dXJucyhNLnByb21pc2UoKSksXG5cbmdldE9mZmVyRmlsdGVyOk0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkucmV0dXJucyhcbk0uYXJyYXlPZihNLnN0cmluZygpKSksXG5cbmdldEludml0YXRpb25Jc3N1ZXI6TS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG5nZXRGZWVJc3N1ZXI6TS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG5nZXRCcmFuZHM6TS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbmNlSGFuZGxlU2hhcGUpKS5yZXR1cm5zKFxuQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUpLFxuXG5nZXRJc3N1ZXJzOk0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkucmV0dXJucyhcbklzc3VlcktleXdvcmRSZWNvcmRTaGFwZSksXG5cbmdldFB1YmxpY0ZhY2V0Ok0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkucmV0dXJucyhcbk0ucmVtb3RhYmxlKCdQdWJsaWNGYWNldCcpKSxcblxuZ2V0VGVybXM6TS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbmNlSGFuZGxlU2hhcGUpKS5yZXR1cm5zKE0uYW55KCkpLFxuZ2V0SW5zdGFsbGF0aW9uRm9ySW5zdGFuY2U6TS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbmNlSGFuZGxlU2hhcGUpKS5yZXR1cm5zKFxuTS5lcmVmKE0ucmVtb3RhYmxlKCdJbnN0YWxsYXRpb24nKSkpLFxuXG5nZXRCdW5kbGVJREZyb21JbnN0YWxsYXRpb246TS5jYWxsKEluc3RhbGxhdGlvblNoYXBlKS5yZXR1cm5zKFxuTS5lcmVmKE0uc3RyaW5nKCkpKSxcblxuXG5nZXRJbnN0YWxsYXRpb246TS5jYWxsKE0uZXJlZihJbnZpdGF0aW9uU2hhcGUpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbmdldEluc3RhbmNlOk0uY2FsbChNLmVyZWYoSW52aXRhdGlvblNoYXBlKSkucmV0dXJucyhNLnByb21pc2UoKSksXG5nZXRDb25maWd1cmF0aW9uOk0uY2FsbCgpLnJldHVybnMoe1xuZmVlSXNzdWVyQ29uZmlnOntcbm5hbWU6TS5zdHJpbmcoKSxcbmFzc2V0S2luZDonbmF0JyxcbmRpc3BsYXlJbmZvOkRpc3BsYXlJbmZvU2hhcGV9fSksXG5cblxuZ2V0SW52aXRhdGlvbkRldGFpbHM6TS5jYWxsKE0uZXJlZihJbnZpdGF0aW9uU2hhcGUpKS5yZXR1cm5zKE0uYW55KCkpLFxuZ2V0UHJvcG9zYWxTaGFwZUZvckludml0YXRpb246TS5jYWxsKEludml0YXRpb25IYW5kbGVTaGFwZSkucmV0dXJucyhcbk0ub3B0KFByb3Bvc2FsU2hhcGUpKX0pOyRo4oCNX29uY2UuWm9lU2VydmljZUkoWm9lU2VydmljZUkpO1xuXG5cblxuY29uc3QgICAgICAgIEFkbWluRmFjZXRJPU0uaW50ZXJmYWNlKCdaY2ZBZG1pbkZhY2V0Jyx7XG5nZXRWYXRTaHV0ZG93blByb21pc2U6TS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG5yZXN0YXJ0Q29udHJhY3Q6TS5jYWxsKCkub3B0aW9uYWwoTS5hbnkoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG51cGdyYWRlQ29udHJhY3Q6TS5jYWxsKE0uc3RyaW5nKCkpLm9wdGlvbmFsKE0uYW55KCkpLnJldHVybnMoTS5wcm9taXNlKCkpfSk7JGjigI1fb25jZS5BZG1pbkZhY2V0SShBZG1pbkZhY2V0SSk7XG5cblxuY29uc3QgICAgICAgIFNlYXREYXRhU2hhcGU9TS5zcGxpdFJlY29yZChcbntcbnByb3Bvc2FsOlByb3Bvc2FsU2hhcGUsXG5pbml0aWFsQWxsb2NhdGlvbjpBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUsXG5zZWF0SGFuZGxlOlNlYXRTaGFwZX0sXG5cbntcbm9mZmVyQXJnczpNLmFueSgpfSk7JGjigI1fb25jZS5TZWF0RGF0YVNoYXBlKFNlYXREYXRhU2hhcGUpO1xuXG5cblxuY29uc3QgICAgICAgIEhhbmRsZU9mZmVyST1NLmludGVyZmFjZSgnSGFuZGxlT2ZmZXInLHtcbmhhbmRsZU9mZmVyOk0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUsU2VhdERhdGFTaGFwZSkucmV0dXJucyh7XG5vZmZlclJlc3VsdFByb21pc2U6TS5wcm9taXNlKCksXG5leGl0T2JqOkV4aXRPYmplY3RTaGFwZX0pfSk7JGjigI1fb25jZS5IYW5kbGVPZmZlckkoSGFuZGxlT2ZmZXJJKTtcblxuXG5cbmNvbnN0ICAgICAgICBQcmljZVF1b3RlU2hhcGU9aGFyZGVuKHtcbnF1b3RlQW1vdW50OkFtb3VudFNoYXBlLFxucXVvdGVQYXltZW50Ok0uZXJlZihQYXltZW50U2hhcGUpfSk7JGjigI1fb25jZS5QcmljZVF1b3RlU2hhcGUoUHJpY2VRdW90ZVNoYXBlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJLZXl3b3JkU2hhcGUiOlsiS2V5d29yZFNoYXBlIl0sIkludml0YXRpb25IYW5kbGVTaGFwZSI6WyJJbnZpdGF0aW9uSGFuZGxlU2hhcGUiXSwiSW52aXRhdGlvblNoYXBlIjpbIkludml0YXRpb25TaGFwZSJdLCJJbnN0YW5jZUhhbmRsZVNoYXBlIjpbIkluc3RhbmNlSGFuZGxlU2hhcGUiXSwiSW5zdGFsbGF0aW9uU2hhcGUiOlsiSW5zdGFsbGF0aW9uU2hhcGUiXSwiU2VhdFNoYXBlIjpbIlNlYXRTaGFwZSJdLCJBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUiOlsiQW1vdW50S2V5d29yZFJlY29yZFNoYXBlIl0sIkFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUiOlsiQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZSJdLCJQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSI6WyJQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSJdLCJJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUiOlsiSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlIl0sIklzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUiOlsiSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSJdLCJCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSI6WyJCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSJdLCJJc3N1ZXJSZWNvcmRTaGFwZSI6WyJJc3N1ZXJSZWNvcmRTaGFwZSJdLCJUZXJtc1NoYXBlIjpbIlRlcm1zU2hhcGUiXSwiSW5zdGFuY2VSZWNvcmRTaGFwZSI6WyJJbnN0YW5jZVJlY29yZFNoYXBlIl0sIkhhbmRsZUkiOlsiSGFuZGxlSSJdLCJtYWtlSGFuZGxlU2hhcGUiOlsibWFrZUhhbmRsZVNoYXBlIl0sIlRpbWVyU2hhcGUiOlsiVGltZXJTaGFwZSJdLCJGdWxsUHJvcG9zYWxTaGFwZSI6WyJGdWxsUHJvcG9zYWxTaGFwZSJdLCJQcm9wb3NhbFNoYXBlIjpbIlByb3Bvc2FsU2hhcGUiXSwiaXNPbkRlbWFuZEV4aXRSdWxlIjpbImlzT25EZW1hbmRFeGl0UnVsZSJdLCJpc1dhaXZlZEV4aXRSdWxlIjpbImlzV2FpdmVkRXhpdFJ1bGUiXSwiaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGUiOlsiaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGUiXSwiSW52aXRhdGlvbkVsZW1lbnRTaGFwZSI6WyJJbnZpdGF0aW9uRWxlbWVudFNoYXBlIl0sIk9mZmVySGFuZGxlckkiOlsiT2ZmZXJIYW5kbGVySSJdLCJTZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZSI6WyJTZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZSJdLCJab2VNaW50U2hhcGUiOlsiWm9lTWludFNoYXBlIl0sIlpvZU1pbnRJIjpbIlpvZU1pbnRJIl0sIlpjZk1pbnRJIjpbIlpjZk1pbnRJIl0sIkV4aXRPYmplY3RJIjpbIkV4aXRPYmplY3RJIl0sIkV4aXRPYmplY3RTaGFwZSI6WyJFeGl0T2JqZWN0U2hhcGUiXSwiSW5zdGFuY2VBZG1pblNoYXBlIjpbIkluc3RhbmNlQWRtaW5TaGFwZSJdLCJJbnN0YW5jZUFkbWluSSI6WyJJbnN0YW5jZUFkbWluSSJdLCJJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCI6WyJJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCJdLCJCdW5kbGVDYXBTaGFwZSI6WyJCdW5kbGVDYXBTaGFwZSJdLCJCdW5kbGVTaGFwZSI6WyJCdW5kbGVTaGFwZSJdLCJVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZSI6WyJVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZSJdLCJab2VTdG9yYWdlTWFuYWdlcklLaXQiOlsiWm9lU3RvcmFnZU1hbmFnZXJJS2l0Il0sIlpvZVNlcnZpY2VJIjpbIlpvZVNlcnZpY2VJIl0sIkFkbWluRmFjZXRJIjpbIkFkbWluRmFjZXRJIl0sIlNlYXREYXRhU2hhcGUiOlsiU2VhdERhdGFTaGFwZSJdLCJIYW5kbGVPZmZlckkiOlsiSGFuZGxlT2ZmZXJJIl0sIlByaWNlUXVvdGVTaGFwZSI6WyJQcmljZVF1b3RlU2hhcGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAfqSfx2sHAABrBwAAIAAAAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqXG4gKiBAdGVtcGxhdGUge3N0cmluZ30gSCAtIHRoZSBuYW1lIG9mIHRoZSBoYW5kbGVcbiAqIEB0eXBlZGVmIHtIICYgWGltcG9ydChcIkBlbmRvL21hcnNoYWxcIikuUmVtb3RhYmxlfSBIYW5kbGUgQSB0eXBlIGNvbnN0cnVjdG9yIGZvciBhbiBvcGFxdWUgdHlwZVxuICogaWRlbnRpZmllZCBieSB0aGUgSCBzdHJpbmcuIFRoaXMgdXNlcyBhbiBpbnRlcnNlY3Rpb24gdHlwZVxuICogKCdNeUhhbmRsZScgJiB7fSkgdG8gdGFnIHRoZSBoYW5kbGUncyB0eXBlIGV2ZW4gdGhvdWdoIHRoZSBhY3R1YWxcbiAqIHZhbHVlIGlzIGp1c3QgYW4gZW1wdHkgb2JqZWN0LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3N0cmluZ30gS2V5d29yZFxuICogQHR5cGVkZWYge0hhbmRsZTwnSW52aXRhdGlvbic+fSBJbnZpdGF0aW9uSGFuZGxlIC0gYW4gb3BhcXVlIGhhbmRsZSBmb3IgYW4gaW52aXRhdGlvblxuICogQHR5cGVkZWYge1JlY29yZDxLZXl3b3JkLCBJc3N1ZXI8YW55Pj59IElzc3VlcktleXdvcmRSZWNvcmRcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8S2V5d29yZCwgRVJlZjxJc3N1ZXI8YW55Pj4+fSBJc3N1ZXJQS2V5d29yZFJlY29yZFxuICogQHR5cGVkZWYge1JlY29yZDxLZXl3b3JkLCBCcmFuZDxhbnk+Pn0gQnJhbmRLZXl3b3JkUmVjb3JkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdGFuZGFyZFRlcm1zXG4gKiBAcHJvcGVydHkge0lzc3VlcktleXdvcmRSZWNvcmR9IGlzc3VlcnMgLSByZWNvcmQgd2l0aFxuICoga2V5d29yZHMga2V5cywgaXNzdWVyIHZhbHVlc1xuICogQHByb3BlcnR5IHtCcmFuZEtleXdvcmRSZWNvcmR9IGJyYW5kcyAtIHJlY29yZCB3aXRoIGtleXdvcmRzXG4gKiBrZXlzLCBicmFuZCB2YWx1ZXNcbiAqXG4gKiBAdHlwZWRlZiB7U3RhbmRhcmRUZXJtcyAmIFJlY29yZDxzdHJpbmcsIGFueT59IEFueVRlcm1zXG4gKlxuICogQHR5cGVkZWYge29iamVjdH0gSW5zdGFuY2VSZWNvcmRcbiAqIEBwcm9wZXJ0eSB7SW5zdGFsbGF0aW9ufSBpbnN0YWxsYXRpb25cbiAqIEBwcm9wZXJ0eSB7WGltcG9ydChcIi4vem9lU2VydmljZS91dGlscy5qc1wiKS5JbnN0YW5jZTxhbnk+fSBpbnN0YW5jZVxuICogQHByb3BlcnR5IHtBbnlUZXJtc30gdGVybXMgLSBjb250cmFjdCBwYXJhbWV0ZXJzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gSXNzdWVyUmVjb3JkXG4gKiBAcHJvcGVydHkge0JyYW5kPEs+fSBicmFuZFxuICogQHByb3BlcnR5IHtJc3N1ZXI8Sz59IGlzc3VlclxuICogQHByb3BlcnR5IHtLfSBhc3NldEtpbmRcbiAqIEBwcm9wZXJ0eSB7RGlzcGxheUluZm88Sz59IFtkaXNwbGF5SW5mb11cbiAqXG4gKiBAdHlwZWRlZiB7QW1vdW50S2V5d29yZFJlY29yZH0gQWxsb2NhdGlvblxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtvYmplY3R9IFtSPXVua25vd25dIE9mZmVyIHJlc3VsdFxuICogQHRlbXBsYXRlIHtvYmplY3R9IFtBPW5ldmVyXSBPZmZlciBhcmdzXG4gKiBAdHlwZWRlZiB7UGF5bWVudDwnc2V0Jz59IEludml0YXRpb25cbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACkLACEuiwAALosAAArAAAAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvem9lU2VydmljZS90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gWm9lU2VydmljZVxuICpcbiAqIFpvZSBwcm92aWRlcyBhIGZyYW1ld29yayBmb3IgZGVwbG95aW5nIGFuZCB3b3JraW5nIHdpdGggc21hcnRcbiAqIGNvbnRyYWN0cy4gSXQgaXMgYWNjZXNzZWQgYXMgYSBsb25nLWxpdmVkIGFuZCB3ZWxsLXRydXN0ZWQgc2VydmljZVxuICogdGhhdCBlbmZvcmNlcyBvZmZlciBzYWZldHkgZm9yIHRoZSBjb250cmFjdHMgdGhhdCB1c2UgaXQuIFpvZSBoYXMgYVxuICogc2luZ2xlIGBpbnZpdGF0aW9uSXNzdWVyYCBmb3IgdGhlIGVudGlyZXR5IG9mIGl0cyBsaWZldGltZS4gQnlcbiAqIGhhdmluZyBhIHJlZmVyZW5jZSB0byBab2UsIGEgdXNlciBjYW4gZ2V0IHRoZSBgaW52aXRhdGlvbklzc3VlcmBcbiAqIGFuZCB0aHVzIHZhbGlkYXRlIGFueSBgaW52aXRhdGlvbmAgdGhleSByZWNlaXZlIGZyb20gc29tZW9uZSBlbHNlLlxuICpcbiAqIFpvZSBoYXMgdHdvIGRpZmZlcmVudCBmYWNldHM6IHRoZSBwdWJsaWMgWm9lIHNlcnZpY2UgYW5kIHRoZVxuICogY29udHJhY3QgZmFjZXQgKFpDRikuIEVhY2ggY29udHJhY3QgaW5zdGFuY2UgaGFzIGEgY29weSBvZiBaQ0ZcbiAqIHdpdGhpbiBpdHMgdmF0LiBUaGUgY29udHJhY3QgYW5kIFpDRiBuZXZlciBoYXZlIGRpcmVjdCBhY2Nlc3MgdG9cbiAqIHRoZSB1c2VycycgcGF5bWVudHMgb3IgdGhlIFpvZSBwdXJzZXMuXG4gKlxuICogQHByb3BlcnR5IHtHZXRJbnZpdGF0aW9uSXNzdWVyfSBnZXRJbnZpdGF0aW9uSXNzdWVyXG4gKlxuICogWm9lIGhhcyBhIHNpbmdsZSBgaW52aXRhdGlvbklzc3VlcmAgZm9yIHRoZSBlbnRpcmV0eSBvZiBpdHNcbiAqIGxpZmV0aW1lLiBCeSBoYXZpbmcgYSByZWZlcmVuY2UgdG8gWm9lLCBhIHVzZXIgY2FuIGdldCB0aGVcbiAqIGBpbnZpdGF0aW9uSXNzdWVyYCBhbmQgdGh1cyB2YWxpZGF0ZSBhbnkgYGludml0YXRpb25gIHRoZXkgcmVjZWl2ZVxuICogZnJvbSBzb21lb25lIGVsc2UuIFRoZSBtaW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgaW52aXRhdGlvbklzc3VlclxuICogY3JlYXRlcyB0aGUgRVJUUCBwYXltZW50cyB0aGF0IHJlcHJlc2VudCB0aGUgcmlnaHQgdG8gaW50ZXJhY3Qgd2l0aFxuICogYSBzbWFydCBjb250cmFjdCBpbiBwYXJ0aWN1bGFyIHdheXMuXG4gKlxuICogQHByb3BlcnR5IHtJbnN0YWxsQnVuZGxlfSBpbnN0YWxsXG4gKiBAcHJvcGVydHkge0luc3RhbGxCdW5kbGVJRH0gaW5zdGFsbEJ1bmRsZUlEXG4gKiBAcHJvcGVydHkge1hpbXBvcnQoJy4vdXRpbHMnKS5TdGFydEluc3RhbmNlfSBzdGFydEluc3RhbmNlXG4gKiBAcHJvcGVydHkge09mZmVyfSBvZmZlclxuICogQHByb3BlcnR5IHtYaW1wb3J0KCcuL3V0aWxzJykuR2V0UHVibGljRmFjZXR9IGdldFB1YmxpY0ZhY2V0XG4gKiBAcHJvcGVydHkge0dldElzc3VlcnN9IGdldElzc3VlcnNcbiAqIEBwcm9wZXJ0eSB7R2V0QnJhbmRzfSBnZXRCcmFuZHNcbiAqIEBwcm9wZXJ0eSB7WGltcG9ydCgnLi91dGlscycpLkdldFRlcm1zfSBnZXRUZXJtc1xuICogQHByb3BlcnR5IHtHZXRPZmZlckZpbHRlcn0gZ2V0T2ZmZXJGaWx0ZXJcbiAqIEBwcm9wZXJ0eSB7R2V0SW5zdGFsbGF0aW9uRm9ySW5zdGFuY2V9IGdldEluc3RhbGxhdGlvbkZvckluc3RhbmNlXG4gKiBAcHJvcGVydHkge0dldEluc3RhbmNlfSBnZXRJbnN0YW5jZVxuICogQHByb3BlcnR5IHtHZXRJbnN0YWxsYXRpb259IGdldEluc3RhbGxhdGlvblxuICogQHByb3BlcnR5IHtHZXRJbnZpdGF0aW9uRGV0YWlsc30gZ2V0SW52aXRhdGlvbkRldGFpbHNcbiAqIFJldHVybiBhbiBvYmplY3Qgd2l0aCB0aGUgaW5zdGFuY2UsIGluc3RhbGxhdGlvbiwgZGVzY3JpcHRpb24sIGludml0YXRpb25cbiAqIGhhbmRsZSwgYW5kIGFueSBjdXN0b20gcHJvcGVydGllcyBzcGVjaWZpYyB0byB0aGUgY29udHJhY3QuXG4gKiBAcHJvcGVydHkge0dldEZlZUlzc3Vlcn0gZ2V0RmVlSXNzdWVyXG4gKiBAcHJvcGVydHkge0dldENvbmZpZ3VyYXRpb259IGdldENvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7R2V0QnVuZGxlSURGcm9tSW5zdGFsbGF0aW9ufSBnZXRCdW5kbGVJREZyb21JbnN0YWxsYXRpb25cbiAqIEBwcm9wZXJ0eSB7KGludml0YXRpb25IYW5kbGU6IEludml0YXRpb25IYW5kbGUpID0+IFBhdHRlcm4gfCB1bmRlZmluZWR9IGdldFByb3Bvc2FsU2hhcGVGb3JJbnZpdGF0aW9uXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0SW52aXRhdGlvbklzc3VlclxuICogQHJldHVybnMge1Byb21pc2U8SXNzdWVyPCdzZXQnPj59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0RmVlSXNzdWVyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJc3N1ZXI8J25hdCc+Pn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRDb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyB7e1xuICogICBmZWVJc3N1ZXJDb25maWc6IEZlZUlzc3VlckNvbmZpZyxcbiAqIH19XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0SXNzdWVyc1xuICogQHBhcmFtIHtYaW1wb3J0KCcuL3V0aWxzJykuSW5zdGFuY2U8YW55Pn0gaW5zdGFuY2VcbiAqIEByZXR1cm5zIHtQcm9taXNlPElzc3VlcktleXdvcmRSZWNvcmQ+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldEJyYW5kc1xuICogQHBhcmFtIHtYaW1wb3J0KCcuL3V0aWxzJykuSW5zdGFuY2U8YW55Pn0gaW5zdGFuY2VcbiAqIEByZXR1cm5zIHtQcm9taXNlPEJyYW5kS2V5d29yZFJlY29yZD59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0T2ZmZXJGaWx0ZXJcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi91dGlscycpLkluc3RhbmNlPGFueT59IGluc3RhbmNlXG4gKiBAcmV0dXJucyB7c3RyaW5nW119XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgU2V0T2ZmZXJGaWx0ZXJcbiAqIEBwYXJhbSB7SW5zdGFuY2V9IGluc3RhbmNlXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBzdHJpbmdzXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0SW5zdGFsbGF0aW9uRm9ySW5zdGFuY2VcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi91dGlscycpLkluc3RhbmNlPGFueT59IGluc3RhbmNlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJbnN0YWxsYXRpb24+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldEluc3RhbmNlXG4gKiBAcGFyYW0ge0VSZWY8SW52aXRhdGlvbj59IGludml0YXRpb25cbiAqIEByZXR1cm5zIHtQcm9taXNlPFhpbXBvcnQoJy4vdXRpbHMnKS5JbnN0YW5jZTxhbnk+Pn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRJbnN0YWxsYXRpb25cbiAqIEBwYXJhbSB7RVJlZjxJbnZpdGF0aW9uPn0gaW52aXRhdGlvblxuICogQHJldHVybnMge1Byb21pc2U8SW5zdGFsbGF0aW9uPn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRJbnZpdGF0aW9uRGV0YWlsc1xuICogQHBhcmFtIHtFUmVmPEludml0YXRpb24+fSBpbnZpdGF0aW9uXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJbnZpdGF0aW9uRGV0YWlscz59XG4gKi9cblxuLyogVE9ETyByZW1vdmUgc3VwcG9ydCBmb3Igc291cmNlIGJ1bmRsZXMsIGxlYXZpbmcgb25seSBzdXBwb3J0IGZvciBoYXNoIGJ1bmRsZXMuKi9cbi8qIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDU2NSovXG4vKipcbiAqIEBjYWxsYmFjayBJbnN0YWxsQnVuZGxlXG4gKlxuICogQ3JlYXRlIGFuIGluc3RhbGxhdGlvbiBieSBzYWZlbHkgZXZhbHVhdGluZyB0aGUgY29kZSBhbmRcbiAqIHJlZ2lzdGVyaW5nIGl0IHdpdGggWm9lLiBSZXR1cm5zIGFuIGluc3RhbGxhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0J1bmRsZSB8IFNvdXJjZUJ1bmRsZX0gYnVuZGxlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJbnN0YWxsYXRpb24+fVxuICovXG5cbi8qIFRPRE8gY29uc29saWRhdGUgaW5zdGFsbEJ1bmRsZUlEIGludG8gaW5zdGFsbC4qL1xuLyogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80OTc0Ki9cbi8qKlxuICogQGNhbGxiYWNrIEluc3RhbGxCdW5kbGVJRFxuICpcbiAqIENyZWF0ZSBhbiBpbnN0YWxsYXRpb24gZnJvbSBhIEJ1bmRsZSBJRC4gUmV0dXJucyBhbiBpbnN0YWxsYXRpb24uXG4gKlxuICogQHBhcmFtIHtCdW5kbGVJRH0gYnVuZGxlSURcbiAqIEByZXR1cm5zIHtQcm9taXNlPEluc3RhbGxhdGlvbj59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0QnVuZGxlSURGcm9tSW5zdGFsbGF0aW9uXG4gKlxuICogVmVyaWZ5IHRoYXQgYW4gYWxsZWdlZCBJbnN0YWxsYXRpb24gaXMgcmVhbCwgYW5kIHJldHVybiB0aGUgQnVuZGxlIElEIGl0XG4gKiB3aWxsIHVzZSBmb3IgY29udHJhY3QgY29kZS5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8SW5zdGFsbGF0aW9uPn0gYWxsZWdlZEluc3RhbGxhdGlvblxuICogQHJldHVybnMge1Byb21pc2U8QnVuZGxlSUQ+fVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgezxBcmdzLCBSZXN1bHQ+KFxuICogICBpbnZpdGF0aW9uOiBFUmVmPEludml0YXRpb248UmVzdWx0LCBBcmdzPj4sXG4gKiAgIHByb3Bvc2FsPzogUHJvcG9zYWwsXG4gKiAgIHBheW1lbnRLZXl3b3JkUmVjb3JkPzogUGF5bWVudFBLZXl3b3JkUmVjb3JkLFxuICogICBvZmZlckFyZ3M/OiBBcmdzLFxuICogICApID0+IFByb21pc2U8VXNlclNlYXQ8UmVzdWx0Pj5cbiAqIH0gT2ZmZXJcbiAqXG4gKiBUbyByZWRlZW0gYW4gaW52aXRhdGlvbiwgdGhlIHVzZXIgbm9ybWFsbHkgcHJvdmlkZXMgYSBwcm9wb3NhbCAodGhlaXJcbiAqIHJ1bGVzIGZvciB0aGUgb2ZmZXIpIGFzIHdlbGwgYXMgcGF5bWVudHMgdG8gYmUgZXNjcm93ZWQgYnkgWm9lLiAgSWZcbiAqIGVpdGhlciB0aGUgcHJvcG9zYWwgb3IgcGF5bWVudHMgd291bGQgYmUgZW1wdHksIGluZGljYXRlIHRoaXMgYnlcbiAqIG9taXR0aW5nIHRoYXQgYXJndW1lbnQgb3IgcGFzc2luZyB1bmRlZmluZWQsIHJhdGhlciB0aGFuIHBhc3NpbmcgYW5cbiAqIGVtcHR5IHJlY29yZC5cbiAqXG4gKiBUaGUgcHJvcG9zYWwgaGFzIHRocmVlIHBhcnRzOiBgd2FudGAgYW5kIGBnaXZlYCBhcmUgdXNlZCBieSBab2UgdG9cbiAqIGVuZm9yY2Ugb2ZmZXIgc2FmZXR5LCBhbmQgYGV4aXRgIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgcGFydGljdWxhclxuICogcGF5b3V0LWxpdmVuZXNzIHBvbGljeSB0aGF0IFpvZSBjYW4gZ3VhcmFudGVlLiBgd2FudGAgYW5kIGBnaXZlYFxuICogYXJlIG9iamVjdHMgd2l0aCBrZXl3b3JkcyBhcyBrZXlzIGFuZCBhbW91bnRzIGFzIHZhbHVlcy5cbiAqIGBwYXltZW50S2V5d29yZFJlY29yZGAgaXMgYSByZWNvcmQgd2l0aCBrZXl3b3JkcyBhcyBrZXlzLCBhbmQgdGhlXG4gKiB2YWx1ZXMgYXJlIHRoZSBhY3R1YWwgcGF5bWVudHMgdG8gYmUgZXNjcm93ZWQuIEEgcGF5bWVudCBpc1xuICogZXhwZWN0ZWQgZm9yIGV2ZXJ5IHJ1bGUgdW5kZXIgYGdpdmVgLlxuICovXG5cbi8qKlxuICogWm9lIHVzZXMgc2VhdHMgdG8gYWNjZXNzIG9yIG1hbmlwdWxhdGUgb2ZmZXJzLiBUaGV5IGxldCBjb250cmFjdHMgYW5kIHVzZXJzXG4gKiBpbnRlcmFjdCB3aXRoIHRoZW0uIFpvZSBoYXMgdHdvIGtpbmRzIG9mIHNlYXRzLiBaQ0ZTZWF0cyBhcmUgdXNlZCB3aXRoaW5cbiAqIGNvbnRyYWN0cyBhbmQgd2l0aCB6Y2YgbWV0aG9kcy4gVXNlclNlYXRzIHJlcHJlc2VudCBvZmZlcnMgZXh0ZXJuYWwgdG8gWm9lXG4gKiBhbmQgdGhlIGNvbnRyYWN0LiBUaGUgcGFydHkgd2hvIGV4ZXJjaXNlcyBhbiBpbnZpdGF0aW9uIGFuZCBzZW5kcyB0aGUgb2ZmZXIoKVxuICogbWVzc2FnZSB0byBab2UgZ2V0cyBhIFVzZXJTZWF0IHRoYXQgY2FuIGNoZWNrIHBheW91dHMnIHN0YXR1cyBvciByZXRyaWV2ZSB0aGVcbiAqIHJlc3VsdCBvZiBwcm9jZXNzaW5nIHRoZSBvZmZlciBpbiB0aGUgY29udHJhY3QuIFRoaXMgdmFyaWVzLCBidXQgZXhhbXBsZXMgYXJlXG4gKiBhIHN0cmluZyBhbmQgYW4gaW52aXRhdGlvbiBmb3IgYW5vdGhlciBzZWF0LlxuICpcbiAqIEFsc28sIGEgVXNlclNlYXQgY2FuIGJlIGhhbmRlZCB0byBhbiBhZ2VudCBvdXRzaWRlIFpvZSBhbmQgdGhlIGNvbnRyYWN0LFxuICogbGV0dGluZyB0aGVtIHF1ZXJ5IG9yIG1vbml0b3IgdGhlIGN1cnJlbnQgc3RhdGUsIGFjY2VzcyB0aGUgcGF5b3V0cyBhbmRcbiAqIHJlc3VsdCwgYW5kLCBpZiBpdCdzIGFsbG93ZWQgZm9yIHRoaXMgc2VhdCwgY2FsbCB0cnlFeGl0KCkuXG4gKlxuICogU2luY2UgYW55b25lIGNhbiBhdHRlbXB0IHRvIGV4aXQgdGhlIHNlYXQgaWYgdGhleSBoYXZlIGEgcmVmZXJlbmNlIHRvIGl0LCB5b3VcbiAqIHNob3VsZCBvbmx5IHNoYXJlIGEgVXNlclNlYXQgd2l0aCB0cnVzdGVkIHBhcnRpZXMuXG4gKlxuICogVXNlclNlYXQgaW5jbHVkZXMgcXVlcmllcyBmb3IgdGhlIGFzc29jaWF0ZWQgb2ZmZXIncyBjdXJyZW50IHN0YXRlIGFuZCBhblxuICogb3BlcmF0aW9uIHRvIHJlcXVlc3QgdGhhdCB0aGUgb2ZmZXIgZXhpdCwgYXMgZm9sbG93czpcbiAqXG4gKiBAc2VlIHtAbGluayBodHRwczovL2RvY3MuYWdvcmljLmNvbS96b2UvYXBpL3pvZS5odG1sI3VzZXJzZWF0LW9iamVjdH19XG4gKiBAdGVtcGxhdGUge29iamVjdH0gW09SPXVua25vd25dXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBVc2VyU2VhdFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPFByb3Bvc2FsUmVjb3JkPn0gZ2V0UHJvcG9zYWxcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxQYXltZW50UEtleXdvcmRSZWNvcmQ+fSBnZXRQYXlvdXRzXG4gKiByZXR1cm5zIGEgcHJvbWlzZSBmb3IgYSBLZXl3b3JkUGF5bWVudFJlY29yZCBjb250YWluaW5nIGFsbCB0aGUgcGF5b3V0cyBmcm9tXG4gKiB0aGlzIHNlYXQuIFRoZSBwcm9taXNlIHdpbGwgcmVzb2x2ZSBhZnRlciB0aGUgc2VhdCBoYXMgZXhpdGVkLlxuICogQHByb3BlcnR5IHsoa2V5d29yZDogS2V5d29yZCkgPT4gUHJvbWlzZTxQYXltZW50PGFueT4+fSBnZXRQYXlvdXRcbiAqIHJldHVybnMgYSBwcm9taXNlIGZvciB0aGUgUGF5bWVudCBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbmRpY2F0ZWQga2V5d29yZC5cbiAqIFRoZSBwcm9taXNlIHdpbGwgcmVzb2x2ZSBhZnRlciB0aGUgc2VhdCBoYXMgZXhpdGVkLlxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPE9SPn0gZ2V0T2ZmZXJSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gdm9pZH0gW3RyeUV4aXRdXG4gKiBOb3RlOiBPbmx5IHdvcmtzIGlmIHRoZSBzZWF0J3MgYHByb3Bvc2FsYCBoYXMgYW4gYE9uRGVtYW5kYCBgZXhpdGAgY2xhdXNlLiBab2Unc1xuICogb2ZmZXItc2FmZXR5IGd1YXJhbnRlZSBhcHBsaWVzIG5vIG1hdHRlciBob3cgYSBzZWF0J3MgaW50ZXJhY3Rpb24gd2l0aCBhXG4gKiBjb250cmFjdCBlbmRzLiBVbmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcywgdGhlIHBhcnRpY2lwYW50IG1pZ2h0IGJlIGFibGUgdG9cbiAqIGNhbGwgYHRyeUV4aXQoKWAsIG9yIHRoZSBjb250cmFjdCBtaWdodCBkbyBzb21ldGhpbmcgZXhwbGljaXRseS4gT24gZXhpdGluZyxcbiAqIHRoZSBzZWF0IGhvbGRlciBnZXRzIGl0cyBjdXJyZW50IGBhbGxvY2F0aW9uYCBhbmQgdGhlIGBzZWF0YCBjYW4gbm8gbG9uZ2VyXG4gKiBpbnRlcmFjdCB3aXRoIHRoZSBjb250cmFjdC5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxib29sZWFuPn0gaGFzRXhpdGVkXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlYXQgaGFzIGV4aXRlZCwgZmFsc2UgaWYgaXQgaXMgc3RpbGwgYWN0aXZlLlxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPDB8MT59IG51bVdhbnRzU2F0aXNmaWVkIHJldHVybnMgMSBpZiB0aGUgcHJvcG9zYWwnc1xuICogd2FudCBjbGF1c2Ugd2FzIHNhdGlzZmllZCBieSB0aGUgZmluYWwgYWxsb2NhdGlvbiwgb3RoZXJ3aXNlIDAuIFRoaXMgaXNcbiAqIG51bWVyaWMgdG8gc3VwcG9ydCBhIHBsYW5uZWQgZW5oYW5jZW1lbnQgY2FsbGVkIFwibXVsdGlwbGVzXCIgd2hpY2ggd2lsbCBhbGxvd1xuICogdGhlIHJldHVybiB2YWx1ZSB0byBiZSBhbnkgbm9uLW5lZ2F0aXZlIG51bWJlci4gVGhlIHByb21pc2Ugd2lsbCByZXNvbHZlXG4gKiBhZnRlciB0aGUgc2VhdCBoYXMgZXhpdGVkLlxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEFsbG9jYXRpb24+fSBnZXRGaW5hbEFsbG9jYXRpb25cbiAqIHJldHVybiBhIHByb21pc2UgZm9yIHRoZSBmaW5hbCBhbGxvY2F0aW9uLiBUaGUgcHJvbWlzZSB3aWxsIHJlc29sdmUgYWZ0ZXIgdGhlXG4gKiBzZWF0IGhhcyBleGl0ZWQuXG4gKiBAcHJvcGVydHkgeygpID0+IFN1YnNjcmliZXI8YW55Pn0gZ2V0RXhpdFN1YnNjcmliZXIgcmV0dXJucyBhIHN1YnNjcmliZXIgdGhhdFxuICogd2lsbCBiZSBub3RpZmllZCB3aGVuIHRoZSBzZWF0IGhhcyBleGl0ZWQgb3IgZmFpbGVkLlxuICovXG5cbi8qKlxuICpcbiAqIEB0eXBlZGVmIHtQYXJ0aWFsPFByb3Bvc2FsUmVjb3JkPn0gUHJvcG9zYWxcbiAqXG4gKiBAdHlwZWRlZiB7e2dpdmU6IEFtb3VudEtleXdvcmRSZWNvcmQsXG4gKiAgICAgICAgICAgIHdhbnQ6IEFtb3VudEtleXdvcmRSZWNvcmQsXG4gKiAgICAgICAgICAgIGV4aXQ6IEV4aXRSdWxlXG4gKiAgICAgICAgICAgfX0gUHJvcG9zYWxSZWNvcmRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8S2V5d29yZCwgQW1vdW50PGFueT4+fSBBbW91bnRLZXl3b3JkUmVjb3JkXG4gKlxuICogVGhlIGtleXMgYXJlIGtleXdvcmRzLCBhbmQgdGhlIHZhbHVlcyBhcmUgYW1vdW50cy4gRm9yIGV4YW1wbGU6XG4gKiB7IEFzc2V0OiBBbW91bnRNYXRoLm1ha2UoYXNzZXRCcmFuZCwgNW4pLCBQcmljZTpcbiAqIEFtb3VudE1hdGgubWFrZShwcmljZUJyYW5kLCA5bikgfVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gV2FrZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gdm9pZH0gd2FrZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvdGltZS9zcmMvdHlwZXMnKS5UaW1lc3RhbXB9IERlYWRsaW5lXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBUaW1lclxuICogQHByb3BlcnR5IHsoZGVhZGxpbmU6IERlYWRsaW5lLCB3YWtlclA6IEVSZWY8V2FrZXI+KSA9PiB2b2lkfSBzZXRXYWtldXBcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE9uRGVtYW5kRXhpdFJ1bGVcbiAqIEBwcm9wZXJ0eSB7bnVsbH0gb25EZW1hbmRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFdhaXZlZEV4aXRSdWxlXG4gKiBAcHJvcGVydHkge251bGx9IHdhaXZlZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQWZ0ZXJEZWFkbGluZUV4aXRSdWxlXG4gKiBAcHJvcGVydHkge3t0aW1lcjpUaW1lciwgZGVhZGxpbmU6RGVhZGxpbmV9fSBhZnRlckRlYWRsaW5lXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T25EZW1hbmRFeGl0UnVsZSB8IFdhaXZlZEV4aXRSdWxlIHwgQWZ0ZXJEZWFkbGluZUV4aXRSdWxlfSBFeGl0UnVsZVxuICpcbiAqIFRoZSBwb3NzaWJsZSBrZXlzIGFyZSAnd2FpdmVkJywgJ29uRGVtYW5kJywgYW5kICdhZnRlckRlYWRsaW5lJy5cbiAqIGB0aW1lcmAgYW5kIGBkZWFkbGluZWAgb25seSBhcmUgdXNlZCBmb3IgdGhlIGBhZnRlckRlYWRsaW5lYCBrZXkuXG4gKiBUaGUgcG9zc2libGUgcmVjb3JkcyBhcmU6XG4gKiBgeyB3YWl2ZWQ6IG51bGwgfWBcbiAqIGB7IG9uRGVtYW5kOiBudWxsIH1gXG4gKiBgeyBhZnRlckRlYWRsaW5lOiB7IHRpbWVyIDpUaW1lcjxEZWFkbGluZT4sIGRlYWRsaW5lIDpEZWFkbGluZSB9IH1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3V0aWxzJykuSW5zdGFuY2U8YW55Pn0gSW5zdGFuY2VcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCdAYWdvcmljL3N3aW5nc2V0LXZhdCcpLlZhdEFkbWluU3ZjfSBWYXRBZG1pblN2Y1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3tidW5kbGVDYXA6IFhpbXBvcnQoJ0BhZ29yaWMvc3dpbmdzZXQtdmF0JykuQnVuZGxlQ2FwIH0gfCB7bmFtZTogc3RyaW5nfSB8IHtpZDogQnVuZGxlSUR9fSBaQ0ZTcGVjXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZywgYW55Pn0gU291cmNlQnVuZGxlXG4gKiBPcGFxdWUgdHlwZSBmb3IgYSBKU09OYWJsZSBzb3VyY2UgYnVuZGxlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPEtleXdvcmQsRVJlZjxQYXltZW50PGFueT4+Pn0gUGF5bWVudFBLZXl3b3JkUmVjb3JkXG4gKiBAdHlwZWRlZiB7UmVjb3JkPEtleXdvcmQsUGF5bWVudDxhbnk+Pn0gUGF5bWVudEtleXdvcmRSZWNvcmRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEludml0YXRpb25EZXRhaWxzXG4gKiBAcHJvcGVydHkge0luc3RhbGxhdGlvbn0gaW5zdGFsbGF0aW9uXG4gKiBAcHJvcGVydHkge1hpbXBvcnQoJy4vdXRpbHMnKS5JbnN0YW5jZTxhbnk+fSBpbnN0YW5jZVxuICogQHByb3BlcnR5IHtJbnZpdGF0aW9uSGFuZGxlfSBoYW5kbGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZXNjcmlwdGlvblxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbY3VzdG9tRGV0YWlsc11cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbU0Y9YW55XSBjb250cmFjdCBzdGFydCBmdW5jdGlvblxuICogQHR5cGVkZWYge1hpbXBvcnQoJy4vdXRpbHMnKS5JbnN0YWxsYXRpb248U0Y+fSBJbnN0YWxsYXRpb25cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7SW5zdGFsbGF0aW9ufSBJXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi91dGlscycpLkluc3RhbGxhdGlvblN0YXJ0PEk+fSBJbnN0YWxsYXRpb25TdGFydFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRmVlSXNzdWVyQ29uZmlnXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZVxuICogQHByb3BlcnR5IHtBc3NldEtpbmR9IGFzc2V0S2luZFxuICogQHByb3BlcnR5IHtEaXNwbGF5SW5mb30gZGlzcGxheUluZm9cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFpvZUZlZXNDb25maWdcbiAqIEBwcm9wZXJ0eSB7TmF0VmFsdWV9IGdldFB1YmxpY0ZhY2V0RmVlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7SGFuZGxlPCdmZWVNaW50QWNjZXNzJz59IEZlZU1pbnRBY2Nlc3NcbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAWydfnbRUAAG0VAAAqAAAAQGFnb3JpYy96b2UtdjAuMjUuMy90b29scy90eXBlcy1hbWJpZW50LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQcmljZVF1b3RlXG4gKiBAcHJvcGVydHkge0Ftb3VudDwnc2V0Jz59IHF1b3RlQW1vdW50XG4gKiBBbW91bnQgd2hvc2UgdmFsdWUgaXMgYSBQcmljZVF1b3RlVmFsdWVcbiAqIEBwcm9wZXJ0eSB7RVJlZjxQYXltZW50PCdzZXQnPj59IHF1b3RlUGF5bWVudFxuICogVGhlIGBxdW90ZUFtb3VudGAgd3JhcHBlZCBhcyBhIHBheW1lbnRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtbUHJpY2VEZXNjcmlwdGlvbl19IFByaWNlUXVvdGVWYWx1ZVxuICogQSBzaW5nbGUtdmFsdWVkIHNldCBvZiBQcmljZURlc2NyaXB0aW9ucy4gIFRoaXMgaXMgdGhlIGB2YWx1ZWAgaW5cbiAqIFByaWNlUXVvdGUucXVvdGVBbW91bnQgKGB7IGJyYW5kLCB2YWx1ZTogUHJpY2VRdW90ZVZhbHVlIH1gKS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFByaWNlRGVzY3JpcHRpb25cbiAqIEEgZGVzY3JpcHRpb24gb2YgYSBzaW5nbGUgcXVvdGVcbiAqIEBwcm9wZXJ0eSB7QW1vdW50PCduYXQnPn0gYW1vdW50SW5cbiAqIFRoZSBhbW91bnQgc3VwcGxpZWQgdG8gYSB0cmFkZVxuICogQHByb3BlcnR5IHtBbW91bnQ8J25hdCc+fSBhbW91bnRPdXRcbiAqIFRoZSBxdW90ZWQgcmVzdWx0IG9mIHRyYWRpbmcgYGFtb3VudEluYFxuICogQHByb3BlcnR5IHtYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXJTZXJ2aWNlfSB0aW1lclxuICogVGhlIHNlcnZpY2UgdGhhdCBnYXZlIHRoZSBgdGltZXN0YW1wYFxuICogQHByb3BlcnR5IHtYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXN0YW1wfSB0aW1lc3RhbXBcbiAqIEEgdGltZXN0YW1wIGFjY29yZGluZyB0byBgdGltZXJgIGZvciB0aGUgcXVvdGVcbiAqIEBwcm9wZXJ0eSB7YW55fSBbY29uZGl0aW9uc11cbiAqIEFkZGl0aW9uYWwgY29uZGl0aW9ucyBmb3IgdGhlIHF1b3RlXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgUHJpY2VRdW90ZUNyZWF0ZVxuICogQHBhcmFtIHtQcmljZVF1ZXJ5fSBwcmljZVF1ZXJ5XG4gKiBAcmV0dXJucyB7RVJlZjxQcmljZVF1b3RlPiB8IHVuZGVmaW5lZH1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBQcmljZVF1b3RlVHJpZ2dlclxuICogQHBhcmFtIHtQcmljZVF1b3RlQ3JlYXRlfSBjcmVhdGVRdW90ZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUHJpY2VBdXRob3JpdHlBZG1pblxuICogQHByb3BlcnR5IHsoY3JlYXRlUXVvdGU6IFByaWNlUXVvdGVDcmVhdGUpID0+IFByb21pc2U8dm9pZD59IGZpcmVUcmlnZ2Vyc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUHJpY2VBdXRob3JpdHlLaXRcbiAqIEBwcm9wZXJ0eSB7UHJpY2VBdXRob3JpdHl9IHByaWNlQXV0aG9yaXR5XG4gKiBAcHJvcGVydHkge1ByaWNlQXV0aG9yaXR5QWRtaW59IGFkbWluRmFjZXRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE11dGFibGVRdW90ZVxuICogQHByb3BlcnR5IHsocmVhc29uPzogYW55KSA9PiB2b2lkfSBjYW5jZWxcbiAqIEBwcm9wZXJ0eSB7KGFtb3VudEluOiBBbW91bnQ8J25hdCc+LCBhbW91bnRPdXQ6IEFtb3VudDwnbmF0Jz4pID0+IHZvaWR9IHVwZGF0ZUxldmVsXG4gKiBAcHJvcGVydHkgeygpID0+IEVSZWY8UHJpY2VRdW90ZT59IGdldFByb21pc2VcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFByaWNlQXV0aG9yaXR5XG4gKiBBbiBvYmplY3QgdGhhdCBtaW50cyBQcmljZVF1b3RlcyBhbmQgaGFuZGxlc1xuICogdHJpZ2dlcnMgYW5kIG5vdGlmaWVycyBmb3IgY2hhbmdlcyBpbiB0aGUgcHJpY2VcbiAqXG4gKiBAcHJvcGVydHkgeyhicmFuZEluOiBCcmFuZCwgYnJhbmRPdXQ6IEJyYW5kKSA9PiBFUmVmPElzc3Vlcjwnc2V0Jz4+fSBnZXRRdW90ZUlzc3VlclxuICogR2V0IHRoZSBFUlRQIGlzc3VlciBvZiBQcmljZVF1b3RlcyBmb3IgYSBnaXZlbiBicmFuZEluL2JyYW5kT3V0IHBhaXJcbiAqXG4gKiBAcHJvcGVydHkgeyhicmFuZEluOiBCcmFuZCxcbiAqICAgICAgICAgICAgIGJyYW5kT3V0OiBCcmFuZFxuICogKSA9PiBFUmVmPFhpbXBvcnQoJ0BhZ29yaWMvdGltZS9zcmMvdHlwZXMnKS5UaW1lclNlcnZpY2U+fSBnZXRUaW1lclNlcnZpY2VcbiAqIEdldCB0aGUgdGltZXIgdXNlZCBpbiBQcmljZVF1b3RlcyBmb3IgYSBnaXZlbiBicmFuZEluL2JyYW5kT3V0IHBhaXJcbiAqXG4gKiBAcHJvcGVydHkgeyhhbW91bnRJbjogQW1vdW50PCduYXQnPixcbiAqICAgICAgICAgICAgIGJyYW5kT3V0OiBCcmFuZDwnbmF0Jz5cbiAqICAgICAgICAgICAgKSA9PiBFUmVmPE5vdGlmaWVyPFByaWNlUXVvdGU+Pn0gbWFrZVF1b3RlTm90aWZpZXJcbiAqIEJlIG5vdGlmaWVkIG9mIHRoZSBsYXRlc3QgUHJpY2VRdW90ZXMgZm9yIGEgZ2l2ZW5cbiAqIGBhbW91bnRJbmAuICBUaGUgcmF0ZSBhdCB3aGljaCB0aGVzZSBhcmUgaXNzdWVkIG1heSBiZSB2ZXJ5IGRpZmZlcmVudCBiZXR3ZWVuXG4gKiBgcHJpY2VBdXRob3JpdGllc2AuXG4gKlxuICogQHByb3BlcnR5IHsoZGVhZGxpbmU6IFhpbXBvcnQoJ0BhZ29yaWMvdGltZS9zcmMvdHlwZXMnKS5UaW1lc3RhbXAsXG4gKiAgICAgICAgICAgICBhbW91bnRJbjogQW1vdW50PCduYXQnPixcbiAqICAgICAgICAgICAgIGJyYW5kT3V0OiBCcmFuZDwnbmF0Jz5cbiAqICkgPT4gUHJvbWlzZTxQcmljZVF1b3RlPn0gcXVvdGVBdFRpbWVcbiAqIFJlc29sdmVzIGFmdGVyIGBkZWFkbGluZWAgcGFzc2VzIG9uIHRoZVxuICogcHJpY2VBdXRob3JpdHkncyB0aW1lclNlcnZpY2Ugd2l0aCB0aGUgcHJpY2UgcXVvdGUgb2YgYGFtb3VudEluYCBhdCB0aGF0IHRpbWVcbiAqXG4gKiBAcHJvcGVydHkgeyhhbW91bnRJbjogQW1vdW50PCduYXQnPixcbiAqICAgICAgICAgICAgIGJyYW5kT3V0OiBCcmFuZDwnbmF0Jz5cbiAqICkgPT4gUHJvbWlzZTxQcmljZVF1b3RlPn0gcXVvdGVHaXZlblxuICogR2V0IGEgcXVvdGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGFtb3VudEluXG4gKlxuICogQHByb3BlcnR5IHsoYnJhbmRJbjogQnJhbmQ8J25hdCc+LFxuICogICAgICAgICAgICAgYW1vdW50T3V0OiBBbW91bnQ8J25hdCc+KSA9PiBQcm9taXNlPFByaWNlUXVvdGU+fSBxdW90ZVdhbnRlZFxuICogR2V0IGEgcXVvdGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGFtb3VudE91dFxuICpcbiAqIEBwcm9wZXJ0eSB7KGFtb3VudEluOiBBbW91bnQ8J25hdCc+LFxuICogICAgICAgICAgICAgYW1vdW50T3V0TGltaXQ6IEFtb3VudDwnbmF0Jz5cbiAqICkgPT4gUHJvbWlzZTxQcmljZVF1b3RlPn0gcXVvdGVXaGVuR1RcbiAqIFJlc29sdmUgd2hlbiBhIHByaWNlIHF1b3RlIG9mIGBhbW91bnRJbmAgZXhjZWVkcyBgYW1vdW50T3V0TGltaXRgXG4gKlxuICogQHByb3BlcnR5IHsoYW1vdW50SW46IEFtb3VudDwnbmF0Jz4sXG4gKiAgICAgICAgICAgICBhbW91bnRPdXRMaW1pdDogQW1vdW50PCduYXQnPlxuICogKSA9PiBQcm9taXNlPFByaWNlUXVvdGU+fSBxdW90ZVdoZW5HVEVcbiAqIFJlc29sdmUgd2hlbiBhIHByaWNlIHF1b3RlIG9mIGBhbW91bnRJbmAgcmVhY2hlcyBvciBleGNlZWRzIGBhbW91bnRPdXRMaW1pdGBcbiAqXG4gKiBAcHJvcGVydHkgeyhhbW91bnRJbjogQW1vdW50LFxuICogICAgICAgICAgICAgYW1vdW50T3V0TGltaXQ6IEFtb3VudFxuICogKSA9PiBQcm9taXNlPFByaWNlUXVvdGU+fSBxdW90ZVdoZW5MVEVcbiAqIFJlc29sdmUgd2hlbiBhIHByaWNlIHF1b3RlIG9mIGBhbW91bnRJbmAgcmVhY2hlcyBvciBkcm9wcyBiZWxvd1xuICogYGFtb3VudE91dExpbWl0YFxuICpcbiAqIEBwcm9wZXJ0eSB7KGFtb3VudEluOiBBbW91bnQsXG4gKiAgICAgICAgICAgICBhbW91bnRPdXRMaW1pdDogQW1vdW50XG4gKiApID0+IFByb21pc2U8UHJpY2VRdW90ZT59IHF1b3RlV2hlbkxUXG4gKiBSZXNvbHZlIHdoZW4gdGhlIHByaWNlIHF1b3RlIG9mIGBhbW91bnRJbmAgZHJvcHMgYmVsb3cgYGFtb3VudE91dExpbWl0YFxuICpcbiAqIEBwcm9wZXJ0eSB7KGFtb3VudEluOiBBbW91bnQsXG4gKiAgICAgICAgICAgICBhbW91bnRPdXRMaW1pdDogQW1vdW50XG4gKiApID0+IEVSZWY8TXV0YWJsZVF1b3RlPn0gbXV0YWJsZVF1b3RlV2hlbkdUXG4gKiBSZXNvbHZlIHdoZW4gYSBwcmljZSBxdW90ZSBvZiBgYW1vdW50SW5gIGV4Y2VlZHMgYGFtb3VudE91dExpbWl0YFxuICpcbiAqIEBwcm9wZXJ0eSB7KGFtb3VudEluOiBBbW91bnQsXG4gKiAgICAgICAgICAgICBhbW91bnRPdXRMaW1pdDogQW1vdW50XG4gKiApID0+IEVSZWY8TXV0YWJsZVF1b3RlPn0gbXV0YWJsZVF1b3RlV2hlbkdURVxuICogUmVzb2x2ZSB3aGVuIGEgcHJpY2UgcXVvdGUgb2YgYGFtb3VudEluYCByZWFjaGVzIG9yIGV4Y2VlZHNcbiAqIGBhbW91bnRPdXRMaW1pdGBcbiAqXG4gKiBAcHJvcGVydHkgeyhhbW91bnRJbjogQW1vdW50LFxuICogICAgICAgICAgICAgYW1vdW50T3V0TGltaXQ6IEFtb3VudFxuICogKSA9PiBFUmVmPE11dGFibGVRdW90ZT59IG11dGFibGVRdW90ZVdoZW5MVEVcbiAqIFJlc29sdmUgd2hlbiBhIHByaWNlIHF1b3RlIG9mIGBhbW91bnRJbmAgcmVhY2hlcyBvciBkcm9wcyBiZWxvd1xuICogYGFtb3VudE91dExpbWl0YFxuICpcbiAqIEBwcm9wZXJ0eSB7KGFtb3VudEluOiBBbW91bnQsXG4gKiAgICAgICAgICAgICBhbW91bnRPdXRMaW1pdDogQW1vdW50XG4gKiApID0+IEVSZWY8TXV0YWJsZVF1b3RlPn0gbXV0YWJsZVF1b3RlV2hlbkxUXG4gKiBSZXNvbHZlIHdoZW4gdGhlIHByaWNlIHF1b3RlIG9mIGBhbW91bnRJbmAgZHJvcHMgYmVsb3cgYGFtb3VudE91dExpbWl0YFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyhhbW91bnQ6IEFtb3VudDwnbmF0Jz4pID0+IEFtb3VudDwnbmF0Jz59IFByaWNlQ2FsY3VsYXRvclxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFByaWNlUXVlcnlcbiAqIEBwYXJhbSB7UHJpY2VDYWxjdWxhdG9yfSBjYWxjQW1vdW50SW5cbiAqIEBwYXJhbSB7UHJpY2VDYWxjdWxhdG9yfSBjYWxjQW1vdW50T3V0XG4gKiBAcmV0dXJucyB7eyBhbW91bnRJbjogQW1vdW50PCduYXQnPiwgYW1vdW50T3V0OiBBbW91bnQ8J25hdCc+LCB0aW1lc3RhbXA/OiBYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXN0YW1wIH0gfCB1bmRlZmluZWR9XG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA+g/tX+sRAADrEQAAJAAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOC9zcmMvRS5qc3siaW1wb3J0cyI6WyIuL3RyYWNrLXR1cm5zLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCB0cmFja1R1cm5zOyRo4oCNX2ltcG9ydHMoW1tcIi4vdHJhY2stdHVybnMuanNcIiwgW1tcInRyYWNrVHVybnNcIiwgWyRo4oCNX2EgPT4gKHRyYWNrVHVybnMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG4vKi8gPHJlZmVyZW5jZSBwYXRoPVwiaW5kZXguZC50c1wiIC8+Ki9cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnF9PWFzc2VydDtcblxuLyoqIEB0eXBlIHtQcm94eUhhbmRsZXI8YW55Pn0gKi9cbmNvbnN0IGJhc2VGcmVlemFibGVQcm94eUhhbmRsZXI9e1xuc2V0KF90YXJnZXQsX3Byb3AsX3ZhbHVlKXtcbnJldHVybiBmYWxzZTtcbiB9LFxuaXNFeHRlbnNpYmxlKF90YXJnZXQpe1xucmV0dXJuIGZhbHNlO1xuIH0sXG5zZXRQcm90b3R5cGVPZihfdGFyZ2V0LF92YWx1ZSl7XG5yZXR1cm4gZmFsc2U7XG4gfSxcbmRlbGV0ZVByb3BlcnR5KF90YXJnZXQsX3Byb3Ape1xucmV0dXJuIGZhbHNlO1xuIH19O1xuXG5cbi8qIEUgUHJveHkgaGFuZGxlcnMgcHJldGVuZCB0aGF0IGFueSBwcm9wZXJ0eSBleGlzdHMgb24gdGhlIHRhcmdldCBhbmQgcmV0dXJucyovXG4vKiBhIGZ1bmN0aW9uIGZvciB0aGVpciB2YWx1ZS4gV2hpbGUgdGhpcyBmdW5jdGlvbiBpcyBcImJvdW5kXCIgYnkgY29udGV4dCwgaXQgaXMqL1xuLyogbWVhbnQgdG8gYmUgY2FsbGVkIGFzIGEgbWV0aG9kLiBGb3IgdGhhdCByZWFzb24sIHRoZSByZXR1cm5lZCBmdW5jdGlvbiovXG4vKiBpbmNsdWRlcyBhIGNoZWNrIHRoYXQgdGhlIGB0aGlzYCBhcmd1bWVudCBjb3JyZXNwb25kcyB0byB0aGUgaW5pdGlhbCovXG4vKiByZWNlaXZlciB3aGVuIHRoZSBmdW5jdGlvbiB3YXMgcmV0cmlldmVkLiovXG4vKiBFIFByb3h5IGhhbmRsZXJzIGFsc28gZm9yd2FyZCBkaXJlY3QgY2FsbHMgdG8gdGhlIHRhcmdldCBpbiBjYXNlIHRoZSByZW1vdGUqL1xuLyogaXMgYSBmdW5jdGlvbiBpbnN0ZWFkIG9mIGFuIG9iamVjdC4gTm8gc3VjaCByZWNlaXZlciBjaGVja3MgYXJlIG5lY2Vzc2FyeSBpbiovXG4vKiB0aGF0IGNhc2UuKi9cblxuLyoqXG4gKiBBIFByb3h5IGhhbmRsZXIgZm9yIEUoeCkuXG4gKlxuICogQHBhcmFtIHsqfSB4IEFueSB2YWx1ZSBwYXNzZWQgdG8gRSh4KVxuICogQHBhcmFtIHtYaW1wb3J0KCcuL2luZGV4JykuSGFuZGxlZFByb21pc2VDb25zdHJ1Y3Rvcn0gSGFuZGxlZFByb21pc2VcbiAqIEByZXR1cm5zIHtQcm94eUhhbmRsZXJ9IHRoZSBQcm94eSBoYW5kbGVyXG4gKi9cbmZ1bmN0aW9uIEVQcm94eUhhbmRsZXIoeCxIYW5kbGVkUHJvbWlzZSl7XG5yZXR1cm4gaGFyZGVuKHtcbi4uLmJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIsXG5nZXQoX3RhcmdldCxwLHJlY2VpdmVyKXtcbnJldHVybiBoYXJkZW4oXG57XG4vKiBUaGlzIGZ1bmN0aW9uIHB1cnBvc2VseSBjaGVja3MgdGhlIGB0aGlzYCB2YWx1ZSAoc2VlIGFib3ZlKSovXG4vKiBJbiBvcmRlciB0byBiZSBgdGhpc2Agc2Vuc2l0aXZlIGl0IGlzIGRlZmluZWQgdXNpbmcgY29uY2lzZSBtZXRob2QqL1xuLyogc3ludGF4IHJhdGhlciB0aGFuIGFzIGFuIGFycm93IGZ1bmN0aW9uLiBUbyBlbnN1cmUgdGhlIGZ1bmN0aW9uKi9cbi8qIGlzIG5vdCBjb25zdHJ1Y3RhYmxlLCBpdCBhbHNvIGF2b2lkcyB0aGUgYGZ1bmN0aW9uYCBzeW50YXguKi9cbltwXSguLi5hcmdzKXtcbmlmKHRoaXMhPT1yZWNlaXZlcil7XG4vKiBSZWplY3QgdGhlIGFzeW5jIGZ1bmN0aW9uIGNhbGwqL1xucmV0dXJuIEhhbmRsZWRQcm9taXNlLnJlamVjdChcbmFzc2VydC5lcnJvcihcblggYFVuZXhwZWN0ZWQgcmVjZWl2ZXIgZm9yIFwiJHtwfVwiIG1ldGhvZCBvZiBFKCR7cSh4KX0pYCkpO1xuXG5cbiB9XG5cbnJldHVybiBIYW5kbGVkUHJvbWlzZS5hcHBseU1ldGhvZCh4LHAsYXJncyk7XG4gfVxuLyogQHRzLWV4cGVjdC1lcnJvciBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzUwMzE5Ki99W1xucF0pO1xuXG4gfSxcbmFwcGx5KF90YXJnZXQsX3RoaXNBcmcsYXJnQXJyYXk9W10pe1xucmV0dXJuIEhhbmRsZWRQcm9taXNlLmFwcGx5RnVuY3Rpb24oeCxhcmdBcnJheSk7XG4gfSxcbmhhcyhfdGFyZ2V0LF9wKXtcbi8qIFdlIGp1c3QgcHJldGVuZCBldmVyeXRoaW5nIGV4aXN0cy4qL1xucmV0dXJuIHRydWU7XG4gfX0pO1xuXG4gfVxuXG4vKipcbiAqIEEgUHJveHkgaGFuZGxlciBmb3IgRS5zZW5kT25seSh4KVxuICogSXQgaXMgYSB2YXJpYW50IG9uIHRoZSBFKHgpIFByb3h5IGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIHsqfSB4IEFueSB2YWx1ZSBwYXNzZWQgdG8gRS5zZW5kT25seSh4KVxuICogQHBhcmFtIHtYaW1wb3J0KCcuL2luZGV4JykuSGFuZGxlZFByb21pc2VDb25zdHJ1Y3Rvcn0gSGFuZGxlZFByb21pc2VcbiAqIEByZXR1cm5zIHtQcm94eUhhbmRsZXJ9IHRoZSBQcm94eSBoYW5kbGVyXG4gKi9cbmZ1bmN0aW9uIEVzZW5kT25seVByb3h5SGFuZGxlcih4LEhhbmRsZWRQcm9taXNlKXtcbnJldHVybiBoYXJkZW4oe1xuLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbmdldChfdGFyZ2V0LHAscmVjZWl2ZXIpe1xucmV0dXJuIGhhcmRlbihcbntcbi8qIFRoaXMgZnVuY3Rpb24gcHVycG9zZWx5IGNoZWNrcyB0aGUgYHRoaXNgIHZhbHVlIChzZWUgYWJvdmUpKi9cbi8qIEluIG9yZGVyIHRvIGJlIGB0aGlzYCBzZW5zaXRpdmUgaXQgaXMgZGVmaW5lZCB1c2luZyBjb25jaXNlIG1ldGhvZCovXG4vKiBzeW50YXggcmF0aGVyIHRoYW4gYXMgYW4gYXJyb3cgZnVuY3Rpb24uIFRvIGVuc3VyZSB0aGUgZnVuY3Rpb24qL1xuLyogaXMgbm90IGNvbnN0cnVjdGFibGUsIGl0IGFsc28gYXZvaWRzIHRoZSBgZnVuY3Rpb25gIHN5bnRheC4qL1xuW3BdKC4uLmFyZ3Mpe1xuLyogVGhyb3cgc2luY2UgdGhlIGZ1bmN0aW9uIHJldHVybnMgbm90aGluZyovXG5hc3NlcnQuZXF1YWwoXG50aGlzLFxucmVjZWl2ZXIsXG5YIGBVbmV4cGVjdGVkIHJlY2VpdmVyIGZvciBcIiR7cH1cIiBtZXRob2Qgb2YgRS5zZW5kT25seSgke3EoeCl9KWApO1xuXG5IYW5kbGVkUHJvbWlzZS5hcHBseU1ldGhvZFNlbmRPbmx5KHgscCxhcmdzKTtcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuLyogQHRzLWV4cGVjdC1lcnJvciBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzUwMzE5Ki99W1xucF0pO1xuXG4gfSxcbmFwcGx5KF90YXJnZXQsX3RoaXNBcmcsYXJnc0FycmF5PVtdKXtcbkhhbmRsZWRQcm9taXNlLmFwcGx5RnVuY3Rpb25TZW5kT25seSh4LGFyZ3NBcnJheSk7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH0sXG5oYXMoX3RhcmdldCxfcCl7XG4vKiBXZSBqdXN0IHByZXRlbmQgdGhhdCBldmVyeXRoaW5nIGV4aXN0cy4qL1xucmV0dXJuIHRydWU7XG4gfX0pO1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi9pbmRleCcpLkhhbmRsZWRQcm9taXNlQ29uc3RydWN0b3J9IEhhbmRsZWRQcm9taXNlXG4gKiBAcmV0dXJucyB7WGltcG9ydCgnLi9pbmRleCcpLkVQcm94eX1cbiAqL1xuZnVuY3Rpb24gICAgICAgICAgICAgICAgbWFrZUUoSGFuZGxlZFByb21pc2Upe1xuZnVuY3Rpb24gRSh4KXtcbmNvbnN0IGhhbmRsZXI9RVByb3h5SGFuZGxlcih4LEhhbmRsZWRQcm9taXNlKTtcbnJldHVybiBoYXJkZW4obmV3IFByb3h5KCgpPT57IH0saGFuZGxlcikpO1xuIH1cblxuY29uc3QgbWFrZUVHZXR0ZXJQcm94eT0oeCk9PlxubmV3IFByb3h5KE9iamVjdC5jcmVhdGUobnVsbCkse1xuLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbmhhcyhfdGFyZ2V0LF9wcm9wKXtcbnJldHVybiB0cnVlO1xuIH0sXG5nZXQoX3RhcmdldCxwcm9wKXtcbnJldHVybiBIYW5kbGVkUHJvbWlzZS5nZXQoeCxwcm9wKTtcbiB9fSk7XG5cblxuRS5nZXQ9bWFrZUVHZXR0ZXJQcm94eTtcbkUucmVzb2x2ZT1IYW5kbGVkUHJvbWlzZS5yZXNvbHZlO1xuRS5zZW5kT25seT0oeCk9PntcbmNvbnN0IGhhbmRsZXI9RXNlbmRPbmx5UHJveHlIYW5kbGVyKHgsSGFuZGxlZFByb21pc2UpO1xucmV0dXJuIGhhcmRlbihuZXcgUHJveHkoKCk9PnsgfSxoYW5kbGVyKSk7XG4gfTtcblxuRS53aGVuPSh4LG9uZnVsZmlsbGVkLG9ucmVqZWN0ZWQpPT57XG5jb25zdFtvbnN1Y2Nlc3Msb25mYWlsdXJlXT10cmFja1R1cm5zKFtvbmZ1bGZpbGxlZCxvbnJlamVjdGVkXSk7XG5yZXR1cm4gSGFuZGxlZFByb21pc2UucmVzb2x2ZSh4KS50aGVuKG9uc3VjY2VzcyxvbmZhaWx1cmUpO1xuIH07XG5cbnJldHVybiBoYXJkZW4oRSk7XG4gfSRo4oCNX29uY2UuZGVmYXVsdCggICAgIG1ha2VFKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAotScywoCAAAKAgAAKgAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOC9zcmMvbm8tc2hpbS5qc3siaW1wb3J0cyI6WyIuL0UuanMiXSwiZXhwb3J0cyI6WyJFIiwiSGFuZGxlZFByb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZUU7JGjigI1faW1wb3J0cyhbW1wiLi9FLmpzXCIsIFtbXCJkZWZhdWx0XCIsIFskaOKAjV9hID0+IChtYWtlRSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cbmNvbnN0IGhwPUhhbmRsZWRQcm9taXNlOyRo4oCNX29uY2UuaHAoaHApO1xuY29uc3QgICAgICAgIEU9bWFrZUUoSGFuZGxlZFByb21pc2UpOyRo4oCNX29uY2UuRShFKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJIYW5kbGVkUHJvbWlzZSI6WyJocCJdLCJFIjpbIkUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA4rOx3dgPAADYDwAALgAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOC9zcmMvdHJhY2stdHVybnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbInRyYWNrVHVybnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBnbG9iYWwgZ2xvYmFsVGhpcyAqL1xuLyogQHRzLW5vY2hlY2sqL1xuXG4vKiBOT1RFOiBXZSBjYW4ndCBpbXBvcnQgdGhlc2UgYmVjYXVzZSB0aGV5J3JlIG5vdCBpbiBzY29wZSBiZWZvcmUgbG9ja2Rvd24uKi9cbi8qIGltcG9ydCB7IGFzc2VydCwgZGV0YWlscyBhcyBYLCBGYWlsIH0gZnJvbSAnQGFnb3JpYy9hc3NlcnQnOyovXG5cbi8qIFdBUk5JTkc6IEdsb2JhbCBNdXRhYmxlIFN0YXRlISovXG4vKiBUaGlzIHN0YXRlIGlzIGNvbW11bmljYXRlZCB0byBgYXNzZXJ0YCB0aGF0IG1ha2VzIGl0IGF2YWlsYWJsZSB0byB0aGUqL1xuLyogY2F1c2FsIGNvbnNvbGUsIHdoaWNoIGFmZmVjdHMgdGhlIGNvbnNvbGUgbG9nIG91dHB1dC4gTm9ybWFsbHkgd2UqL1xuLyogcmVnYXJkIHRoZSBhYmlsaXR5IHRvIHNlZSBjb25zb2xlIGxvZyBvdXRwdXQgYXMgYSBtZXRhLWxldmVsIHByaXZpbGVnZSovXG4vKiBhbmFsb2dvdXMgdG8gdGhlIGFiaWxpdHkgdG8gZGVidWcuIEFzaWRlIGZyb20gdGhhdCwgdGhpcyBtb2R1bGUgc2hvdWxkKi9cbi8qIG5vdCBoYXZlIGFueSBvYnNlcnZhYmx5IG11dGFibGUgc3RhdGUuKi9cblxubGV0IGhpZGRlblByaW9yRXJyb3I7XG5sZXQgaGlkZGVuQ3VycmVudFR1cm49MDtcbmxldCBoaWRkZW5DdXJyZW50RXZlbnQ9MDtcblxuLyogVE9ETyBVc2UgZW52aXJvbm1lbnQtb3B0aW9ucy5qcyBjdXJyZW50bHkgaW4gc2VzL3NyYyBhZnRlciBmYWN0b3JpbmcgaXQgb3V0Ki9cbi8qIHRvIGEgbmV3IHBhY2thZ2UuKi9cbmNvbnN0IGVudj0oZ2xvYmFsVGhpcy5wcm9jZXNzfHx7fSkuZW52fHx7fTtcblxuLyogVHVybiBvbiBpZiB5b3Ugc2VlbSB0byBiZSBsb3NpbmcgZXJyb3IgbG9nZ2luZyBhdCB0aGUgdG9wIG9mIHRoZSBldmVudCBsb29wKi9cbmNvbnN0IFZFUkJPU0U9KGVudi5ERUJVR3x8JycpLnNwbGl0KCc6JykuaW5jbHVkZXMoJ3RyYWNrLXR1cm5zJyk7XG5cbi8qIFRyYWNrLXR1cm5zIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgYW5kIGNhbiBiZSBlbmFibGVkIGJ5IGFuIGVudmlyb25tZW50Ki9cbi8qIG9wdGlvbi4gV2UgaW50ZW5kIHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBhZnRlciB2ZXJpZnlpbmcgdGhhdCBoYXZpbmcqL1xuLyogdGhlIGZlYXR1cmUgZW5hYmxlZCBpbiBwcm9kdWN0aW9uIGRvZXMgbm90IGNhdXNlIG1lbW9yeSB0byBsZWFrLiovXG5jb25zdCBFTkFCTEVEPWVudi5UUkFDS19UVVJOUz09PSdlbmFibGVkJztcblxuLyogV2UgaG9pc3QgdGhlc2UgZnVuY3Rpb25zIG91dCBvZiB0cmFja1R1cm5zKCkgdG8gZGlzY291cmFnZSB0aGUqL1xuLyogY2xvc3VyZXMgZnJvbSBob2xkaW5nIG9udG8gJ2FyZ3MnIG9yICdmdW5jJyBsb25nZXIgdGhhbiBuZWNlc3NhcnksKi9cbi8qIHdoaWNoIHdlJ3ZlIHNlZW4gY2F1c2UgSGFuZGxlZFByb21pc2UgYXJndW1lbnRzIHRvIGJlIHJldGFpbmVkIGZvciovXG4vKiBhIHN1cnByaXNpbmdseSBsb25nIHRpbWUuKi9cblxuY29uc3QgYWRkUmVqZWN0aW9uTm90ZT0oZGV0YWlsc05vdGUpPT4ocmVhc29uKT0+e1xuaWYocmVhc29uIGluc3RhbmNlb2YgRXJyb3Ipe1xuYXNzZXJ0Lm5vdGUocmVhc29uLGRldGFpbHNOb3RlKTtcbiB9XG5pZihWRVJCT1NFKXtcbmNvbnNvbGUubG9nKCdSRUpFQ1RFRCBhdCB0b3Agb2YgZXZlbnQgbG9vcCcscmVhc29uKTtcbiB9XG4gfTtcblxuY29uc3Qgd3JhcEZ1bmN0aW9uPShmdW5jLHNlbmRpbmdFcnJvcixYKT0+KC4uLmFyZ3MpPT57XG5oaWRkZW5QcmlvckVycm9yPXNlbmRpbmdFcnJvcjtcbmhpZGRlbkN1cnJlbnRUdXJuKz0xO1xuaGlkZGVuQ3VycmVudEV2ZW50PTA7XG50cnl7XG5sZXQgcmVzdWx0O1xudHJ5e1xucmVzdWx0PWZ1bmMoLi4uYXJncyk7XG4gfWNhdGNoKGVycil7XG5pZihlcnIgaW5zdGFuY2VvZiBFcnJvcil7XG5hc3NlcnQubm90ZShcbmVycixcblggYFRocm93biBmcm9tOiAke2hpZGRlblByaW9yRXJyb3J9OiR7aGlkZGVuQ3VycmVudFR1cm59LiR7aGlkZGVuQ3VycmVudEV2ZW50fWApO1xuXG4gfVxuaWYoVkVSQk9TRSl7XG5jb25zb2xlLmxvZygnVEhST1dOIHRvIHRvcCBvZiBldmVudCBsb29wJyxlcnIpO1xuIH1cbnRocm93IGVycjtcbiB9XG4vKiBNdXN0IGNhcHR1cmUgdGhpcyBub3csIG5vdCB3aGVuIHRoZSBjYXRjaCB0cmlnZ2Vycy4qL1xuY29uc3QgZGV0YWlsc05vdGU9WCBgUmVqZWN0aW9uIGZyb206ICR7aGlkZGVuUHJpb3JFcnJvcn06JHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YDtcblByb21pc2UucmVzb2x2ZShyZXN1bHQpLmNhdGNoKGFkZFJlamVjdGlvbk5vdGUoZGV0YWlsc05vdGUpKTtcbnJldHVybiBoYXJkZW4ocmVzdWx0KTtcbiB9ZmluYWxseXtcbmhpZGRlblByaW9yRXJyb3I9dW5kZWZpbmVkO1xuIH1cbiB9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpIHwgdW5kZWZpbmVkfSBUdXJuU3RhcnRlckZuXG4gKiBBbiBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IGlzIG5vdCB0aGlzLXNlbnNpdGl2ZSwgZXhwZWN0ZWQgdG8gYmUgY2FsbGVkIGF0XG4gKiBib3R0b20gb2Ygc3RhY2sgdG8gc3RhcnQgYSBuZXcgdHVybi5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7VHVyblN0YXJ0ZXJGbltdfSBUXG4gKiBHaXZlbiBhIGxpc3Qgb2YgYFR1cm5TdGFydGVyRm5gcywgcmV0dXJucyBhIGxpc3Qgb2YgYFR1cm5TdGFydGVyRm5gcyB3aG9zZVxuICogYHRoaXNgLWZyZWUgY2FsbCBiZWhhdmlvcnMgYXJlIG5vdCBvYnNlcnZhYmx5IGRpZmZlcmVudCB0byB0aG9zZSB0aGF0XG4gKiBjYW5ub3Qgc2VlIGNvbnNvbGUgb3V0cHV0LiBUaGUgb25seSBwdXJwb3NlIGlzIHRvIGNhdXNlIGFkZGl0aW9uYWxcbiAqIGluZm9ybWF0aW9uIHRvIGFwcGVhciBvbiB0aGUgY29uc29sZS5cbiAqXG4gKiBUaGUgY2FsbCB0byBgdHJhY2tUdXJuc2AgaXMgaXRzZWxmIGEgc2VuZGluZyBldmVudCwgdGhhdCBvY2N1cnMgaW4gc29tZSBjYWxsXG4gKiBzdGFjayBpbiBzb21lIHR1cm4gbnVtYmVyIGF0IHNvbWUgZXZlbnQgbnVtYmVyIHdpdGhpbiB0aGF0IHR1cm4uIEVhY2ggY2FsbFxuICogdG8gYW55IG9mIHRoZSByZXR1cm5lZCBgVHVyblN0YXJ0Rm5gcyBpcyBhIHJlY2VpdmluZyBldmVudCB0aGF0IGJlZ2lucyBhIG5ld1xuICogdHVybi4gVGhpcyBzZW5kaW5nIGV2ZW50IGNhdXNlZCBlYWNoIG9mIHRob3NlIHJlY2VpdmluZyBldmVudHMuXG4gKlxuICogQHBhcmFtIHtUfSBmdW5jc1xuICogQHJldHVybnMge1R9XG4gKi9cbmNvbnN0ICAgICAgICB0cmFja1R1cm5zPShmdW5jcyk9PntcbmlmKCFFTkFCTEVEfHx0eXBlb2YgZ2xvYmFsVGhpcz09PSd1bmRlZmluZWQnfHwhZ2xvYmFsVGhpcy5hc3NlcnQpe1xucmV0dXJuIGZ1bmNzO1xuIH1cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuXG5oaWRkZW5DdXJyZW50RXZlbnQrPTE7XG5jb25zdCBzZW5kaW5nRXJyb3I9bmV3IEVycm9yKFxuIGBFdmVudDogJHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCk7XG5cbmlmKGhpZGRlblByaW9yRXJyb3IhPT11bmRlZmluZWQpe1xuYXNzZXJ0Lm5vdGUoc2VuZGluZ0Vycm9yLFggYENhdXNlZCBieTogJHtoaWRkZW5QcmlvckVycm9yfWApO1xuIH1cblxucmV0dXJuIGZ1bmNzLm1hcCgoZnVuYyk9PmZ1bmMmJndyYXBGdW5jdGlvbihmdW5jLHNlbmRpbmdFcnJvcixYKSk7XG4gfTskaOKAjV9vbmNlLnRyYWNrVHVybnModHJhY2tUdXJucyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidHJhY2tUdXJucyI6WyJ0cmFja1R1cm5zIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAD7lgF62AgAAtgIAAB4AAABAZW5kby9mYXItdjAuMi4xNC9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJFIiwiRmFyIiwiZ2V0SW50ZXJmYWNlT2YiLCJwYXNzU3R5bGVPZiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2xpdmVbXCJFXCJdXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2xpdmVbXCJGYXJcIl1dXSxbXCJnZXRJbnRlcmZhY2VPZlwiLCBbJGjigI1fbGl2ZVtcImdldEludGVyZmFjZU9mXCJdXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2xpdmVbXCJwYXNzU3R5bGVPZlwiXV1dXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6eyJFIjpbIkUiLGZhbHNlXSwiRmFyIjpbIkZhciIsZmFsc2VdLCJnZXRJbnRlcmZhY2VPZiI6WyJnZXRJbnRlcmZhY2VPZiIsZmFsc2VdLCJwYXNzU3R5bGVPZiI6WyJwYXNzU3R5bGVPZiIsZmFsc2VdfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACE1ofwvxAAAL8QAAAdAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzIiwiLi9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzIiwiLi9zcmMvaGVscGVycy9lcnJvci5qcyIsIi4vc3JjL2hlbHBlcnMvaXRlci1oZWxwZXJzLmpzIiwiLi9zcmMvaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vc3JjL2hlbHBlcnMvcmVtb3RhYmxlLmpzIiwiLi9zcmMvaGVscGVycy9zeW1ib2wuanMiLCIuL3NyYy9tYWtlLWZhci5qcyIsIi4vc3JjL21ha2VUYWdnZWQuanMiLCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qcyIsIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIiwiLi9zcmMvbWFyc2hhbC5qcyIsIi4vc3JjL3Bhc3NTdHlsZU9mLmpzIiwiLi9zcmMvdHlwZUd1YXJkcy5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sImV4cG9ydHMiOlsiRmFyIiwiUEFTU19TVFlMRSIsIlFDTEFTUyIsIlJlbW90YWJsZSIsIlRvRmFyRnVuY3Rpb24iLCJhc3NlcnRDaGVja2VyIiwiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0UGFzc2FibGUiLCJhc3NlcnRSZWNvcmQiLCJhc3NlcnRSZW1vdGFibGUiLCJkZWNvZGVUb0p1c3RpbiIsImRlZXBseUZ1bGZpbGxlZCIsImZpbHRlckl0ZXJhYmxlIiwiZ2V0RXJyb3JDb25zdHJ1Y3RvciIsImdldEludGVyZmFjZU9mIiwiZ2V0VGFnIiwiaGFzT3duUHJvcGVydHlPZiIsImlzQ29weUFycmF5IiwiaXNPYmplY3QiLCJpc1JlY29yZCIsImlzUmVtb3RhYmxlIiwibWFrZU1hcnNoYWwiLCJtYWtlVGFnZ2VkIiwibWFwSXRlcmFibGUiLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiLCJwYXJzZSIsInBhc3NTdHlsZU9mIiwicGFzc2FibGVTeW1ib2xGb3JOYW1lIiwic3RyaW5naWZ5IiwidG9QYXNzYWJsZUVycm9yIl0sInJlZXhwb3J0cyI6WyIuL3NyYy90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL2hlbHBlcnMvaXRlci1oZWxwZXJzLmpzXCIsIFtbXCJtYXBJdGVyYWJsZVwiLCBbJGjigI1fbGl2ZVtcIm1hcEl0ZXJhYmxlXCJdXV0sW1wiZmlsdGVySXRlcmFibGVcIiwgWyRo4oCNX2xpdmVbXCJmaWx0ZXJJdGVyYWJsZVwiXV1dXV0sW1wiLi9zcmMvaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fbGl2ZVtcIlBBU1NfU1RZTEVcIl1dXSxbXCJpc09iamVjdFwiLCBbJGjigI1fbGl2ZVtcImlzT2JqZWN0XCJdXV0sW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fbGl2ZVtcImFzc2VydENoZWNrZXJcIl1dXSxbXCJnZXRUYWdcIiwgWyRo4oCNX2xpdmVbXCJnZXRUYWdcIl1dXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9saXZlW1wiaGFzT3duUHJvcGVydHlPZlwiXV1dXV0sW1wiLi9zcmMvaGVscGVycy9lcnJvci5qc1wiLCBbW1wiZ2V0RXJyb3JDb25zdHJ1Y3RvclwiLCBbJGjigI1fbGl2ZVtcImdldEVycm9yQ29uc3RydWN0b3JcIl1dXSxbXCJ0b1Bhc3NhYmxlRXJyb3JcIiwgWyRo4oCNX2xpdmVbXCJ0b1Bhc3NhYmxlRXJyb3JcIl1dXV1dLFtcIi4vc3JjL2hlbHBlcnMvcmVtb3RhYmxlLmpzXCIsIFtbXCJnZXRJbnRlcmZhY2VPZlwiLCBbJGjigI1fbGl2ZVtcImdldEludGVyZmFjZU9mXCJdXV1dXSxbXCIuL3NyYy9oZWxwZXJzL3N5bWJvbC5qc1wiLCBbW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9saXZlW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCJdXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsIFskaOKAjV9saXZlW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCJdXV1dXSxbXCIuL3NyYy9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2xpdmVbXCJwYXNzU3R5bGVPZlwiXV1dLFtcImFzc2VydFBhc3NhYmxlXCIsIFskaOKAjV9saXZlW1wiYXNzZXJ0UGFzc2FibGVcIl1dXV1dLFtcIi4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qc1wiLCBbW1wiZGVlcGx5RnVsZmlsbGVkXCIsIFskaOKAjV9saXZlW1wiZGVlcGx5RnVsZmlsbGVkXCJdXV1dXSxbXCIuL3NyYy9tYWtlVGFnZ2VkLmpzXCIsIFtbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9saXZlW1wibWFrZVRhZ2dlZFwiXV1dXV0sW1wiLi9zcmMvbWFrZS1mYXIuanNcIiwgW1tcIlJlbW90YWJsZVwiLCBbJGjigI1fbGl2ZVtcIlJlbW90YWJsZVwiXV1dLFtcIkZhclwiLCBbJGjigI1fbGl2ZVtcIkZhclwiXV1dLFtcIlRvRmFyRnVuY3Rpb25cIiwgWyRo4oCNX2xpdmVbXCJUb0ZhckZ1bmN0aW9uXCJdXV1dXSxbXCIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanNcIiwgW1tcIlFDTEFTU1wiLCBbJGjigI1fbGl2ZVtcIlFDTEFTU1wiXV1dXV0sW1wiLi9zcmMvbWFyc2hhbC5qc1wiLCBbW1wibWFrZU1hcnNoYWxcIiwgWyRo4oCNX2xpdmVbXCJtYWtlTWFyc2hhbFwiXV1dXV0sW1wiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanNcIiwgW1tcInN0cmluZ2lmeVwiLCBbJGjigI1fbGl2ZVtcInN0cmluZ2lmeVwiXV1dLFtcInBhcnNlXCIsIFskaOKAjV9saXZlW1wicGFyc2VcIl1dXV1dLFtcIi4vc3JjL21hcnNoYWwtanVzdGluLmpzXCIsIFtbXCJkZWNvZGVUb0p1c3RpblwiLCBbJGjigI1fbGl2ZVtcImRlY29kZVRvSnVzdGluXCJdXV1dXSxbXCIuL3NyYy90eXBlR3VhcmRzLmpzXCIsIFtbXCJhc3NlcnRSZWNvcmRcIiwgWyRo4oCNX2xpdmVbXCJhc3NlcnRSZWNvcmRcIl1dXSxbXCJhc3NlcnRDb3B5QXJyYXlcIiwgWyRo4oCNX2xpdmVbXCJhc3NlcnRDb3B5QXJyYXlcIl1dXSxbXCJhc3NlcnRSZW1vdGFibGVcIiwgWyRo4oCNX2xpdmVbXCJhc3NlcnRSZW1vdGFibGVcIl1dXSxbXCJpc1JlbW90YWJsZVwiLCBbJGjigI1fbGl2ZVtcImlzUmVtb3RhYmxlXCJdXV0sW1wiaXNSZWNvcmRcIiwgWyRo4oCNX2xpdmVbXCJpc1JlY29yZFwiXV1dLFtcImlzQ29weUFycmF5XCIsIFskaOKAjV9saXZlW1wiaXNDb3B5QXJyYXlcIl1dXV1dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7Im1hcEl0ZXJhYmxlIjpbIm1hcEl0ZXJhYmxlIixmYWxzZV0sImZpbHRlckl0ZXJhYmxlIjpbImZpbHRlckl0ZXJhYmxlIixmYWxzZV0sIlBBU1NfU1RZTEUiOlsiUEFTU19TVFlMRSIsZmFsc2VdLCJpc09iamVjdCI6WyJpc09iamVjdCIsZmFsc2VdLCJhc3NlcnRDaGVja2VyIjpbImFzc2VydENoZWNrZXIiLGZhbHNlXSwiZ2V0VGFnIjpbImdldFRhZyIsZmFsc2VdLCJoYXNPd25Qcm9wZXJ0eU9mIjpbImhhc093blByb3BlcnR5T2YiLGZhbHNlXSwiZ2V0RXJyb3JDb25zdHJ1Y3RvciI6WyJnZXRFcnJvckNvbnN0cnVjdG9yIixmYWxzZV0sInRvUGFzc2FibGVFcnJvciI6WyJ0b1Bhc3NhYmxlRXJyb3IiLGZhbHNlXSwiZ2V0SW50ZXJmYWNlT2YiOlsiZ2V0SW50ZXJmYWNlT2YiLGZhbHNlXSwibmFtZUZvclBhc3NhYmxlU3ltYm9sIjpbIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCIsZmFsc2VdLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiOlsicGFzc2FibGVTeW1ib2xGb3JOYW1lIixmYWxzZV0sInBhc3NTdHlsZU9mIjpbInBhc3NTdHlsZU9mIixmYWxzZV0sImFzc2VydFBhc3NhYmxlIjpbImFzc2VydFBhc3NhYmxlIixmYWxzZV0sImRlZXBseUZ1bGZpbGxlZCI6WyJkZWVwbHlGdWxmaWxsZWQiLGZhbHNlXSwibWFrZVRhZ2dlZCI6WyJtYWtlVGFnZ2VkIixmYWxzZV0sIlJlbW90YWJsZSI6WyJSZW1vdGFibGUiLGZhbHNlXSwiRmFyIjpbIkZhciIsZmFsc2VdLCJUb0ZhckZ1bmN0aW9uIjpbIlRvRmFyRnVuY3Rpb24iLGZhbHNlXSwiUUNMQVNTIjpbIlFDTEFTUyIsZmFsc2VdLCJtYWtlTWFyc2hhbCI6WyJtYWtlTWFyc2hhbCIsZmFsc2VdLCJzdHJpbmdpZnkiOlsic3RyaW5naWZ5IixmYWxzZV0sInBhcnNlIjpbInBhcnNlIixmYWxzZV0sImRlY29kZVRvSnVzdGluIjpbImRlY29kZVRvSnVzdGluIixmYWxzZV0sImFzc2VydFJlY29yZCI6WyJhc3NlcnRSZWNvcmQiLGZhbHNlXSwiYXNzZXJ0Q29weUFycmF5IjpbImFzc2VydENvcHlBcnJheSIsZmFsc2VdLCJhc3NlcnRSZW1vdGFibGUiOlsiYXNzZXJ0UmVtb3RhYmxlIixmYWxzZV0sImlzUmVtb3RhYmxlIjpbImlzUmVtb3RhYmxlIixmYWxzZV0sImlzUmVjb3JkIjpbImlzUmVjb3JkIixmYWxzZV0sImlzQ29weUFycmF5IjpbImlzQ29weUFycmF5IixmYWxzZV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKo0/YJCDAAAQgwAACsAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzeyJpbXBvcnRzIjpbIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vbWFrZVRhZ2dlZC5qcyIsIi4vcGFzc1N0eWxlT2YuanMiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vcHJvbWlzZS1raXQiXSwiZXhwb3J0cyI6WyJkZWVwbHlGdWxmaWxsZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxpc1Byb21pc2UsZ2V0VGFnLGlzT2JqZWN0LG1ha2VUYWdnZWQscGFzc1N0eWxlT2Y7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsIFskaOKAjV9hID0+IChpc1Byb21pc2UgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXV1dLFtcIi4vbWFrZVRhZ2dlZC5qc1wiLCBbW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuRVJlZjxUPn0gRVJlZiAqL1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2Zyb21FbnRyaWVzfT1PYmplY3Q7XG5cbi8qKlxuICogR2l2ZW4gYSBQYXNzYWJsZSBgdmFsYCB3aG9zZSBwYXNzLWJ5LWNvcHkgc3RydWN0dXJlIG1heSBjb250YWluIGxlYWZcbiAqIHByb21pc2VzLCByZXR1cm4gZWl0aGVyIGEgcmVwbGFjZW1lbnQgUGFzc2FibGUsIG9yIGEgcHJvbWlzZSBmb3IgdGhhdFxuICogcmVwbGFjZW1lbnQsIHdoZXJlIHRoYXQgcmVwbGFjZW1lbnQgaXMgKmRlZXBseSBmdWxmaWxsZWQqLCBpLmUuLCBpdHNcbiAqIHBhc3MtYnktY29weSBzdHJ1Y3R1cmUgZG9lcyBub3QgY29udGFpbiBhbnkgcHJvbWlzZXMuXG4gKlxuICogVGhpcyBpcyBhIGRlZXAgZm9ybSBvZiBgUHJvbWlzZS5hbGxgIHNwZWNpYWxpemVkIGZvciBQYXNzYWJsZXMuIEZvciBlYWNoXG4gKiBlbmNvdW50ZXJlZCBwcm9taXNlLCByZXBsYWNlIGl0IHdpdGggdGhlIGRlZXBseSBmdWxmaWxsZWQgZm9ybSBvZlxuICogaXRzIGZ1bGZpbGxtZW50LlxuICogSWYgYW55IG9mIHRoZSBwcm9taXNlcyByZWplY3QsIHRoZW4gdGhlIHByb21pc2UgZm9yIHRoZSByZXBsYWNlbWVudFxuICogcmVqZWN0cy4gSWYgYW55IG9mIHRoZSBwcm9taXNlcyBuZXZlciBzZXR0bGUsIHRoZW4gdGhlIHByb21pc2UgZm9yXG4gKiB0aGUgcmVwbGFjZW1lbnQgbmV2ZXIgc2V0dGxlcy5cbiAqXG4gKiBJZiBgdmFsYCBvciBpdHMgcGFydHMgYXJlIG5vbi1rZXkgcGFzc2FibGVzICpiZWNhdXNlKiB0aGV5IGNvbnRhaW5zXG4gKiBwcm9taXNlcywgdGhlIGRlZXBseSBmdWxmaWxsZWQgZm9ybXMgb2YgdmFsIG9yIGl0cyBwYXJ0cyBtYXkgYmUga2V5cy4gVGhpc1xuICogaXMgZm9yIHRoZSBoaWdoZXIgXCJzdG9yZVwiIGxldmVsIG9mIGFic3RyYWN0aW9uIHRvIGRldGVybWluZSwgYmVjYXVzZSBpdFxuICogZGVmaW5lcyB0aGUgXCJrZXlcIiBub3Rpb24gaW4gcXVlc3Rpb24uXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7RVJlZjxQYXNzYWJsZT59XG4gKi9cbmNvbnN0ICAgICAgICBkZWVwbHlGdWxmaWxsZWQ9KHZhbCk9PntcbmlmKCFpc09iamVjdCh2YWwpKXtcbnJldHVybiB2YWw7XG4gfVxuaWYoaXNQcm9taXNlKHZhbCkpe1xucmV0dXJuIEUud2hlbih2YWwsKG5vbnApPT5kZWVwbHlGdWxmaWxsZWQobm9ucCkpO1xuIH1cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZih2YWwpO1xuc3dpdGNoKHBhc3NTdHlsZSl7XG5jYXNlJ2NvcHlSZWNvcmQnOntcbmNvbnN0IG5hbWVzPW93bktleXModmFsKTtcbmNvbnN0IHZhbFBzPW5hbWVzLm1hcCgobmFtZSk9PmRlZXBseUZ1bGZpbGxlZCh2YWxbbmFtZV0pKTtcbnJldHVybiBFLndoZW4oUHJvbWlzZS5hbGwodmFsUHMpLCh2YWxzKT0+XG5oYXJkZW4oZnJvbUVudHJpZXModmFscy5tYXAoKGMsaSk9PltuYW1lc1tpXSxjXSkpKSk7XG5cbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xuY29uc3QgdmFsUHM9dmFsLm1hcCgocCk9PmRlZXBseUZ1bGZpbGxlZChwKSk7XG5yZXR1cm4gRS53aGVuKFByb21pc2UuYWxsKHZhbFBzKSwodmFscyk9PmhhcmRlbih2YWxzKSk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0IHRhZz1nZXRUYWcodmFsKTtcbnJldHVybiBFLndoZW4oZGVlcGx5RnVsZmlsbGVkKHZhbC5wYXlsb2FkKSwocGF5bG9hZCk9PlxubWFrZVRhZ2dlZCh0YWcscGF5bG9hZCkpO1xuXG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbnJldHVybiB2YWw7XG4gfVxuY2FzZSdlcnJvcic6e1xucmV0dXJuIHZhbDtcbiB9XG5jYXNlJ3Byb21pc2UnOntcbnJldHVybiBFLndoZW4odmFsLChub25wKT0+ZGVlcGx5RnVsZmlsbGVkKG5vbnApKTtcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFggYFVuZXhwZWN0ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfWAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfTskaOKAjV9vbmNlLmRlZXBseUZ1bGZpbGxlZChkZWVwbHlGdWxmaWxsZWQpO1xuaGFyZGVuKGRlZXBseUZ1bGZpbGxlZCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVlcGx5RnVsZmlsbGVkIjpbImRlZXBseUZ1bGZpbGxlZCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAANP5P3u0MAALtDAAAqAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2VuY29kZVBhc3NhYmxlLmpzeyJpbXBvcnRzIjpbIi4vaGVscGVycy9lcnJvci5qcyIsIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vaGVscGVycy9zeW1ib2wuanMiLCIuL21ha2VUYWdnZWQuanMiLCIuL3Bhc3NTdHlsZU9mLmpzIiwiLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsiaXNFbmNvZGVkUmVtb3RhYmxlIiwibWFrZURlY29kZVBhc3NhYmxlIiwibWFrZUVuY29kZVBhc3NhYmxlIiwicGFzc1N0eWxlUHJlZml4ZXMiLCJyZWNvcmROYW1lcyIsInJlY29yZFZhbHVlcyIsInplcm9QYWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgZ2V0VGFnLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsYXNzZXJ0UmVjb3JkLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWUsRXJyb3JIZWxwZXI7JGjigI1faW1wb3J0cyhbW1wiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV1dXSxbXCIuL21ha2VUYWdnZWQuanNcIiwgW1tcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiYXNzZXJ0UmVjb3JkXCIsIFskaOKAjV9hID0+IChhc3NlcnRSZWNvcmQgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3N5bWJvbC5qc1wiLCBbW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLCBbJGjigI1fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9lcnJvci5qc1wiLCBbW1wiRXJyb3JIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKEVycm9ySGVscGVyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFzc1N0eWxlfSBQYXNzU3R5bGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmVtb3RhYmxlfSBSZW1vdGFibGUgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNvcHlSZWNvcmQ8VD59IENvcHlSZWNvcmQgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJhbmtDb3Zlcn0gUmFua0NvdmVyICovXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtmcm9tRW50cmllcyxpc309T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqXG4gKiBBc3N1bWluZyB0aGF0IGByZWNvcmRgIGlzIGEgQ29weVJlY29yZCwgd2UgaGF2ZSBvbmx5XG4gKiBzdHJpbmctbmFtZWQgb3duIHByb3BlcnRpZXMuIGByZWNvcmROYW1lc2AgcmV0dXJucyB0aG9zZSBuYW1lICpyZXZlcnNlKlxuICogc29ydGVkLCBiZWNhdXNlIHRoYXQncyBob3cgcmVjb3JkcyBhcmUgY29tcGFyZWQsIGVuY29kZWQsIGFuZCBzb3J0ZWQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxUPn0gcmVjb3JkXG4gKiBAcmV0dXJucyB7c3RyaW5nW119XG4gKi9cbmNvbnN0ICAgICAgICByZWNvcmROYW1lcz0ocmVjb3JkKT0+XG4vKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjYwI2Rpc2N1c3Npb25fcjEwMDM2NTcyNDQqL1xuLyogY29tcGFyZXMgdHdvIHdheXMgb2YgcmV2ZXJzZSBzb3J0aW5nLCBhbmQgc2hvd3MgdGhhdCBgLnNvcnQoKS5yZXZlcnNlKClgKi9cbi8qIGlzIGN1cnJlbnRseSBmYXN0ZXIgb24gTW9kZGFibGUgWFMsIHdoaWxlIHRoZSBvdGhlciB3YXksKi9cbi8qIGAuc29ydChyZXZlcnNlQ29tcGFyYXRvcilgLCBpcyBmYXN0ZXIgb24gdjguIFdlIGN1cnJlbnRseSBjYXJlIG1vcmUgYWJvdXQqL1xuLyogWFMgcGVyZm9ybWFuY2UsIHNvIHdlIHJldmVyc2Ugc29ydCB1c2luZyBgLnNvcnQoKS5yZXZlcnNlKClgLiovXG5oYXJkZW4oXG4vKiogQHR5cGUge3N0cmluZ1tdfSAqL293bktleXMocmVjb3JkKS5cbnNvcnQoKS5cbnJldmVyc2UoKSk7JGjigI1fb25jZS5yZWNvcmROYW1lcyhyZWNvcmROYW1lcyk7XG5cbmhhcmRlbihyZWNvcmROYW1lcyk7XG5cbi8qKlxuICogQXNzdW1pbmcgdGhhdCBgcmVjb3JkYCBpcyBhIENvcHlSZWNvcmQgYW5kIGBuYW1lc2AgaXMgYHJlY29yZE5hbWVzKHJlY29yZClgLFxuICogcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFQ+fSByZWNvcmRcbiAqIEBwYXJhbSB7c3RyaW5nW119IG5hbWVzXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG5jb25zdCAgICAgICAgcmVjb3JkVmFsdWVzPShyZWNvcmQsbmFtZXMpPT5cbmhhcmRlbihuYW1lcy5tYXAoKG5hbWUpPT5yZWNvcmRbbmFtZV0pKTskaOKAjV9vbmNlLnJlY29yZFZhbHVlcyhyZWNvcmRWYWx1ZXMpO1xuaGFyZGVuKHJlY29yZFZhbHVlcyk7XG5cbmNvbnN0ICAgICAgICB6ZXJvUGFkPShuLHNpemUpPT57XG5jb25zdCBuU3RyPSBgJHtufWA7XG5hc3NlcnQoblN0ci5sZW5ndGg8PXNpemUpO1xuY29uc3Qgc3RyPSBgMDAwMDAwMDAwMDAwMDAwMDAwMDAke25TdHJ9YDtcbmNvbnN0IHJlc3VsdD1zdHIuc3Vic3RyaW5nKHN0ci5sZW5ndGgtc2l6ZSk7XG5hc3NlcnQocmVzdWx0Lmxlbmd0aD09PXNpemUpO1xucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UuemVyb1BhZCh6ZXJvUGFkKTtcbmhhcmRlbih6ZXJvUGFkKTtcblxuLyogVGhpcyBpcyB0aGUgSmF2YVNjcmlwdCBhbmFsb2cgdG8gYSBDIHVuaW9uOiBhIHdheSB0byBtYXAgYmV0d2VlbiBhIGZsb2F0IGFzIGEqL1xuLyogbnVtYmVyIGFuZCB0aGUgYml0cyB0aGF0IHJlcHJlc2VudCB0aGUgZmxvYXQgYXMgYSBidWZmZXIgZnVsbCBvZiBieXRlcy4gIE5vdGUqL1xuLyogdGhhdCB0aGUgbXV0YXRpb24gb2Ygc3RhdGljIHN0YXRlIGhlcmUgbWFrZXMgdGhpcyBpbnZhbGlkIEplc3NpZSBjb2RlLCBidXQqL1xuLyogZG9pbmcgaXQgdGhpcyB3YXkgc2F2ZXMgdGhlIG51Z2F0b3J5IGFuZCBncmF0dWl0b3VzIGFsbG9jYXRpb25zIHRoYXQgd291bGQqL1xuLyogaGFwcGVuIGV2ZXJ5IHRpbWUgeW91IGRvIGEgY29udmVyc2lvbiAtLSBhbmQgaW4gcHJhY3RpY2FsIHRlcm1zIGl0J3Mgc2FmZSovXG4vKiBiZWNhdXNlIHdlIHB1dCB0aGUgdmFsdWUgaW4gb25lIHNpZGUgYW5kIHRoZW4gaW1tZWRpYXRlbHkgdGFrZSBpdCBvdXQgdGhlKi9cbi8qIG90aGVyOyB0aGVyZSBpcyBubyBhY3R1YWwgc3RhdGUgcmV0YWluZWQgaW4gdGhlIGNsYXNzaWMgc2Vuc2UgYW5kIHRodXMgbm8qL1xuLyogcmUtZW50cmFuY3kgaXNzdWUuKi9cbmNvbnN0IGFzTnVtYmVyPW5ldyBGbG9hdDY0QXJyYXkoMSk7XG5jb25zdCBhc0JpdHM9bmV3IEJpZ1VpbnQ2NEFycmF5KGFzTnVtYmVyLmJ1ZmZlcik7XG5cbi8qIEphdmFTY3JpcHQgbnVtYmVycyBhcmUgZW5jb2RlZCBieSBvdXRwdXR0aW5nIHRoZSBiYXNlLTE2Ki9cbi8qIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBiaW5hcnkgdmFsdWUgb2YgdGhlIHVuZGVybHlpbmcgSUVFRSBmbG9hdGluZyBwb2ludCovXG4vKiByZXByZXNlbnRhdGlvbi4gIEZvciBuZWdhdGl2ZSB2YWx1ZXMsIGFsbCBiaXRzIG9mIHRoaXMgcmVwcmVzZW50YXRpb24gYXJlKi9cbi8qIGNvbXBsZW1lbnRlZCBwcmlvciB0byB0aGUgYmFzZS0xNiBjb252ZXJzaW9uLCB3aGlsZSBmb3IgcG9zaXRpdmUgdmFsdWVzLCB0aGUqL1xuLyogc2lnbiBiaXQgaXMgY29tcGxlbWVudGVkLiAgVGhpcyBlbnN1cmVzIGJvdGggdGhhdCBuZWdhdGl2ZSB2YWx1ZXMgc29ydCBiZWZvcmUqL1xuLyogcG9zaXRpdmUgdmFsdWVzIGFuZCB0aGF0IG5lZ2F0aXZlIHZhbHVlcyBzb3J0IGFjY29yZGluZyB0byB0aGVpciBuZWdhdGl2ZSovXG4vKiBtYWduaXR1ZGUgcmF0aGVyIHRoYW4gdGhlaXIgcG9zaXRpdmUgbWFnbml0dWRlLiAgVGhpcyByZXN1bHRzIGluIGFuIEFTQ0lJKi9cbi8qIGVuY29kaW5nIHdob3NlIGxleGljb2dyYXBoaWMgc29ydCBvcmRlciBpcyB0aGUgc2FtZSBhcyB0aGUgbnVtZXJpYyBzb3J0IG9yZGVyKi9cbi8qIG9mIHRoZSBjb3JyZXNwb25kaW5nIG51bWJlcnMuKi9cblxuLyogVE9ETyBDaG9vc2UgdGhlIHNhbWUgY2Fub25pY2FsIE5hTiBlbmNvZGluZyB0aGF0IGNvc21XYXNtIGFuZCBld2FzbSBjaG9zZS4qL1xuY29uc3QgQ2Fub25pY2FsTmFOQml0cz0nZmZmODAwMDAwMDAwMDAwMCc7XG5cbmNvbnN0IGVuY29kZUJpbmFyeTY0PShuKT0+e1xuLyogTm9ybWFsaXplIC0wIHRvIDAgYW5kIE5hTiB0byBhIGNhbm9uaWNhbCBlbmNvZGluZyovXG5pZihpcyhuLC0wKSl7XG5uPTA7XG4gfWVsc2UgaWYoaXMobixOYU4pKXtcbnJldHVybiBgZiR7Q2Fub25pY2FsTmFOQml0c31gO1xuIH1cbmFzTnVtYmVyWzBdPW47XG5sZXQgYml0cz1hc0JpdHNbMF07XG5pZihuPDApe1xuYml0c149MHhmZmZmZmZmZmZmZmZmZmZmbjtcbiB9ZWxzZXtcbmJpdHNePTB4ODAwMDAwMDAwMDAwMDAwMG47XG4gfVxucmV0dXJuIGBmJHt6ZXJvUGFkKGJpdHMudG9TdHJpbmcoMTYpLDE2KX1gO1xuIH07XG5cbmNvbnN0IGRlY29kZUJpbmFyeTY0PShlbmNvZGVkKT0+e1xuZW5jb2RlZC5zdGFydHNXaXRoKCdmJyl8fFxuYXNzZXJ0LmZhaWwoWCBgRW5jb2RlZCBudW1iZXIgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gKTtcbmxldCBiaXRzPUJpZ0ludCggYDB4JHtlbmNvZGVkLnN1YnN0cmluZygxKX1gKTtcbmlmKGVuY29kZWRbMV08JzgnKXtcbmJpdHNePTB4ZmZmZmZmZmZmZmZmZmZmZm47XG4gfWVsc2V7XG5iaXRzXj0weDgwMDAwMDAwMDAwMDAwMDBuO1xuIH1cbmFzQml0c1swXT1iaXRzO1xuY29uc3QgcmVzdWx0PWFzTnVtYmVyWzBdO1xuIWlzKHJlc3VsdCwtMCl8fGFzc2VydC5mYWlsKFggYFVuZXhwZWN0ZWQgbmVnYXRpdmUgemVybzogJHtlbmNvZGVkfWApO1xucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vKiBKYXZhU2NyaXB0IGJpZ2ludHMgYXJlIGVuY29kZWQgdXNpbmcgYSB2YXJpYW50IG9mIEVsaWFzIGRlbHRhIGNvZGluZywgd2l0aCBhbiovXG4vKiBpbml0aWFsIGNvbXBvbmVudCBmb3IgdGhlIGxlbmd0aCBvZiB0aGUgZGlnaXQgY291bnQgYXMgYSB1bmFyeSBzdHJpbmcsIGEqL1xuLyogc2Vjb25kIGNvbXBvbmVudCBmb3IgdGhlIGRlY2ltYWwgZGlnaXQgY291bnQsIGFuZCBhIHRoaXJkIGNvbXBvbmVudCBmb3IgdGhlKi9cbi8qIGRlY2ltYWwgZGlnaXRzIHByZWNlZGVkIGJ5IGEgZ3JhdHVpdG91cyBzZXBhcmF0aW5nIGNvbG9uLiovXG4vKiBUbyBlbnN1cmUgdGhhdCB0aGUgbGV4aWNvZ3JhcGhpYyBzb3J0IG9yZGVyIG9mIGVuY29kZWQgdmFsdWVzIG1hdGNoZXMgdGhlKi9cbi8qIG51bWVyaWMgc29ydCBvcmRlciBvZiB0aGUgY29ycmVzcG9uZGluZyBudW1iZXJzLCB0aGUgY2hhcmFjdGVycyBvZiB0aGUgdW5hcnkqL1xuLyogcHJlZml4IGFyZSBkaWZmZXJlbnQgZm9yIG5lZ2F0aXZlIHZhbHVlcyAodHlwZSBcIm5cIiBmb2xsb3dlZCBieSBhbnkgbnVtYmVyIG9mKi9cbi8qIFwiI1wicyBbd2hpY2ggc29ydCBiZWZvcmUgZGVjaW1hbCBkaWdpdHNdKSB2cy4gcG9zaXRpdmUgYW5kIHplcm8gdmFsdWVzICh0eXBlKi9cbi8qIFwicFwiIGZvbGxvd2VkIGJ5IGFueSBudW1iZXIgb2YgXCJ+XCJzIFt3aGljaCBzb3J0IGFmdGVyIGRlY2ltYWwgZGlnaXRzXSkgYW5kKi9cbi8qIGVhY2ggZGVjaW1hbCBkaWdpdCBvZiB0aGUgZW5jb2RpbmcgZm9yIGEgbmVnYXRpdmUgdmFsdWUgaXMgcmVwbGFjZWQgd2l0aCBpdHMqL1xuLyogdGVuJ3MgY29tcGxlbWVudCAoc28gdGhhdCBuZWdhdGl2ZSB2YWx1ZXMgb2YgdGhlIHNhbWUgc2NhbGUgc29ydCBieSovXG4vKiAqZGVzY2VuZGluZyogYWJzb2x1dGUgdmFsdWUpLiovXG5jb25zdCBlbmNvZGVCaWdJbnQ9KG4pPT57XG5jb25zdCBhYnM9bjwwbj8tbjpuO1xuY29uc3QgbkRpZ2l0cz1hYnMudG9TdHJpbmcoKS5sZW5ndGg7XG5jb25zdCBsRGlnaXRzPW5EaWdpdHMudG9TdHJpbmcoKS5sZW5ndGg7XG5pZihuPDBuKXtcbnJldHVybiBgbiR7XG4vKiBBIFwiI1wiIGZvciBlYWNoIGRpZ2l0IGJleW9uZCB0aGUgZmlyc3QqL1xuLyogaW4gdGhlIGRlY2ltYWwgKmNvdW50KiBvZiBkZWNpbWFsIGRpZ2l0cy4qL1xuJyMnLnJlcGVhdChsRGlnaXRzLTEpXG4gfSR7XG4vKiBUaGUgdGVuJ3MgY29tcGxlbWVudCBvZiB0aGUgY291bnQgb2YgZGlnaXRzLiovXG4oMTAqKmxEaWdpdHMtbkRpZ2l0cykudG9TdHJpbmcoKS5wYWRTdGFydChsRGlnaXRzLCcwJylcbiB9OiR7XG4vKiBUaGUgdGVuJ3MgY29tcGxlbWVudCBvZiB0aGUgZGlnaXRzLiovXG4oMTBuKipCaWdJbnQobkRpZ2l0cykrbikudG9TdHJpbmcoKS5wYWRTdGFydChuRGlnaXRzLCcwJylcbiB9YDtcbiB9ZWxzZXtcbnJldHVybiBgcCR7XG4vKiBBIFwiflwiIGZvciBlYWNoIGRpZ2l0IGJleW9uZCB0aGUgZmlyc3QqL1xuLyogaW4gdGhlIGRlY2ltYWwgKmNvdW50KiBvZiBkZWNpbWFsIGRpZ2l0cy4qL1xuJ34nLnJlcGVhdChsRGlnaXRzLTEpXG4gfSR7XG4vKiBUaGUgY291bnQgb2YgZGlnaXRzLiovXG5uRGlnaXRzXG4gfToke1xuLyogVGhlIGRpZ2l0cy4qL1xublxuIH1gO1xuIH1cbiB9O1xuXG5jb25zdCBkZWNvZGVCaWdJbnQ9KGVuY29kZWQpPT57XG5jb25zdCB0eXBlUHJlZml4PWVuY29kZWQuY2hhckF0KDApOy8qIGZhc3RlciB0aGFuIGVuY29kZWRbMF0qL1xubGV0IHJlbT1lbmNvZGVkLnNsaWNlKDEpO1xudHlwZVByZWZpeD09PSdwJ3x8XG50eXBlUHJlZml4PT09J24nfHxcbmFzc2VydC5mYWlsKFggYEVuY29kZWQgYmlnaW50IGV4cGVjdGVkOiAke2VuY29kZWR9YCk7XG5cbmNvbnN0IGxEaWdpdHM9cmVtLnNlYXJjaCgvWzAtOV0vKSsxO1xubERpZ2l0cz49MXx8YXNzZXJ0LmZhaWwoWCBgRGlnaXQgY291bnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gKTtcbnJlbT1yZW0uc2xpY2UobERpZ2l0cy0xKTtcblxucmVtLmxlbmd0aD49bERpZ2l0c3x8XG5hc3NlcnQuZmFpbChYIGBDb21wbGV0ZSBkaWdpdCBjb3VudCBleHBlY3RlZDogJHtlbmNvZGVkfWApO1xuY29uc3Qgc25EaWdpdHM9cmVtLnNsaWNlKDAsbERpZ2l0cyk7XG5yZW09cmVtLnNsaWNlKGxEaWdpdHMpO1xuL15bMC05XSskLy50ZXN0KHNuRGlnaXRzKXx8XG5hc3NlcnQuZmFpbChYIGBEZWNpbWFsIGRpZ2l0IGNvdW50IGV4cGVjdGVkOiAke2VuY29kZWR9YCk7XG5sZXQgbkRpZ2l0cz1wYXJzZUludChzbkRpZ2l0cywxMCk7XG5pZih0eXBlUHJlZml4PT09J24nKXtcbi8qIFRPRE8gQXNzZXJ0IHRvIHJlamVjdCBmb3JiaWRkZW4gZW5jb2RpbmdzKi9cbi8qIGxpa2UgXCJuMDpcIiBhbmQgXCJuMDA64oCmXCIgYW5kIFwibjkxOuKAplwiIHRocm91Z2ggXCJuOTk64oCmXCI/Ki9cbm5EaWdpdHM9MTAqKmxEaWdpdHMtbkRpZ2l0cztcbiB9XG5cbnJlbS5zdGFydHNXaXRoKCc6Jyl8fGFzc2VydC5mYWlsKFggYFNlcGFyYXRvciBleHBlY3RlZDogJHtlbmNvZGVkfWApO1xucmVtPXJlbS5zbGljZSgxKTtcbnJlbS5sZW5ndGg9PT1uRGlnaXRzfHxcbmFzc2VydC5mYWlsKFggYEZpeGVkLWxlbmd0aCBkaWdpdCBzZXF1ZW5jZSBleHBlY3RlZDogJHtlbmNvZGVkfWApO1xubGV0IG49QmlnSW50KHJlbSk7XG5pZih0eXBlUHJlZml4PT09J24nKXtcbi8qIFRPRE8gQXNzZXJ0IHRvIHJlamVjdCBmb3JiaWRkZW4gZW5jb2RpbmdzKi9cbi8qIGxpa2UgXCJuOTowXCIgYW5kIFwibjg6MDBcIiBhbmQgXCJuODo5MVwiIHRocm91Z2ggXCJuODo5OVwiPyovXG5uPS0oMTBuKipCaWdJbnQobkRpZ2l0cyktbik7XG4gfVxuXG5yZXR1cm4gbjtcbiB9O1xuXG4vKiBgJ1xcdTAwMDAnYCBpcyB0aGUgdGVybWluYXRvciBhZnRlciBlbGVtZW50cy4qL1xuLyogYCdcXHUwMDAxJ2AgaXMgdGhlIGJhY2tzbGFzaC1saWtlIGVzY2FwZSBjaGFyYWN0ZXIsIGZvciovXG4vKiBlc2NhcGluZyBib3RoIG9mIHRoZXNlIGNoYXJhY3RlcnMuKi9cblxuY29uc3QgZW5jb2RlQXJyYXk9KGFycmF5LGVuY29kZVBhc3NhYmxlKT0+e1xuY29uc3QgY2hhcnM9WydbJ107XG5mb3IoY29uc3QgZWxlbWVudCBvZiBhcnJheSl7XG5jb25zdCBlbmM9ZW5jb2RlUGFzc2FibGUoZWxlbWVudCk7XG5mb3IoY29uc3QgYyBvZiBlbmMpe1xuaWYoYz09PSdcXHUwMDAwJ3x8Yz09PSdcXHUwMDAxJyl7XG5jaGFycy5wdXNoKCdcXHUwMDAxJyk7XG4gfVxuY2hhcnMucHVzaChjKTtcbiB9XG5jaGFycy5wdXNoKCdcXHUwMDAwJyk7XG4gfVxucmV0dXJuIGNoYXJzLmpvaW4oJycpO1xuIH07XG5cbmNvbnN0IGRlY29kZUFycmF5PShlbmNvZGVkLGRlY29kZVBhc3NhYmxlKT0+e1xuZW5jb2RlZC5zdGFydHNXaXRoKCdbJyl8fGFzc2VydC5mYWlsKFggYEVuY29kZWQgYXJyYXkgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gKTtcbmNvbnN0IGVsZW1lbnRzPVtdO1xuY29uc3QgZWxlbUNoYXJzPVtdO1xuZm9yKGxldCBpPTE7aTxlbmNvZGVkLmxlbmd0aDtpKz0xKXtcbmNvbnN0IGM9ZW5jb2RlZFtpXTtcbmlmKGM9PT0nXFx1MDAwMCcpe1xuY29uc3QgZW5jb2RlZEVsZW1lbnQ9ZWxlbUNoYXJzLmpvaW4oJycpO1xuZWxlbUNoYXJzLmxlbmd0aD0wO1xuY29uc3QgZWxlbWVudD1kZWNvZGVQYXNzYWJsZShlbmNvZGVkRWxlbWVudCk7XG5lbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuIH1lbHNlIGlmKGM9PT0nXFx1MDAwMScpe1xuaSs9MTtcbmk8ZW5jb2RlZC5sZW5ndGh8fFxuYXNzZXJ0LmZhaWwoWCBgdW5leHBlY3RlZCBlbmQgb2YgZW5jb2RpbmcgJHtlbmNvZGVkfWApO1xuY29uc3QgYzI9ZW5jb2RlZFtpXTtcbmMyPT09J1xcdTAwMDAnfHxcbmMyPT09J1xcdTAwMDEnfHxcbmFzc2VydC5mYWlsKFggYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGFmdGVyIHUwMDAxIGVzY2FwZTogJHtjMn1gKTtcbmVsZW1DaGFycy5wdXNoKGMyKTtcbiB9ZWxzZXtcbmVsZW1DaGFycy5wdXNoKGMpO1xuIH1cbiB9XG5lbGVtQ2hhcnMubGVuZ3RoPT09MHx8XG5hc3NlcnQuZmFpbChYIGBlbmNvZGluZyB0ZXJtaW5hdGVkIGVhcmx5OiAke2VuY29kZWR9YCk7XG5yZXR1cm4gaGFyZGVuKGVsZW1lbnRzKTtcbiB9O1xuXG5jb25zdCBlbmNvZGVSZWNvcmQ9KHJlY29yZCxlbmNvZGVQYXNzYWJsZSk9PntcbmNvbnN0IG5hbWVzPXJlY29yZE5hbWVzKHJlY29yZCk7XG5jb25zdCB2YWx1ZXM9cmVjb3JkVmFsdWVzKHJlY29yZCxuYW1lcyk7XG5yZXR1cm4gYCgke2VuY29kZUFycmF5KGhhcmRlbihbbmFtZXMsdmFsdWVzXSksZW5jb2RlUGFzc2FibGUpfWA7XG4gfTtcblxuY29uc3QgZGVjb2RlUmVjb3JkPShlbmNvZGVkLGRlY29kZVBhc3NhYmxlKT0+e1xuYXNzZXJ0KGVuY29kZWQuc3RhcnRzV2l0aCgnKCcpKTtcbmNvbnN0IGtleXN2YWxzPWRlY29kZUFycmF5KGVuY29kZWQuc3Vic3RyaW5nKDEpLGRlY29kZVBhc3NhYmxlKTtcbmtleXN2YWxzLmxlbmd0aD09PTJ8fFxuYXNzZXJ0LmZhaWwoWCBgZXhwZWN0ZWQga2V5cyx2YWx1ZXMgcGFpcjogJHtlbmNvZGVkfWApO1xuY29uc3Rba2V5cyx2YWxzXT1rZXlzdmFscztcblxucGFzc1N0eWxlT2Yoa2V5cyk9PT0nY29weUFycmF5JyYmXG5wYXNzU3R5bGVPZih2YWxzKT09PSdjb3B5QXJyYXknJiZcbmtleXMubGVuZ3RoPT09dmFscy5sZW5ndGgmJlxua2V5cy5ldmVyeSgoa2V5KT0+dHlwZW9mIGtleT09PSdzdHJpbmcnKXx8XG5hc3NlcnQuZmFpbChYIGBub3QgYSB2YWxpZCByZWNvcmQgZW5jb2Rpbmc6ICR7ZW5jb2RlZH1gKTtcbmNvbnN0IG1hcEVudHJpZXM9a2V5cy5tYXAoKGtleSxpKT0+W2tleSx2YWxzW2ldXSk7XG5jb25zdCByZWNvcmQ9aGFyZGVuKGZyb21FbnRyaWVzKG1hcEVudHJpZXMpKTtcbmFzc2VydFJlY29yZChyZWNvcmQsJ2RlY29kZWQgcmVjb3JkJyk7XG5yZXR1cm4gcmVjb3JkO1xuIH07XG5cbmNvbnN0IGVuY29kZVRhZ2dlZD0odGFnZ2VkLGVuY29kZVBhc3NhYmxlKT0+XG4gYDoke2VuY29kZUFycmF5KGhhcmRlbihbZ2V0VGFnKHRhZ2dlZCksdGFnZ2VkLnBheWxvYWRdKSxlbmNvZGVQYXNzYWJsZSl9YDtcblxuY29uc3QgZGVjb2RlVGFnZ2VkPShlbmNvZGVkLGRlY29kZVBhc3NhYmxlKT0+e1xuYXNzZXJ0KGVuY29kZWQuc3RhcnRzV2l0aCgnOicpKTtcbmNvbnN0IHRhZ3BheWxvYWQ9ZGVjb2RlQXJyYXkoZW5jb2RlZC5zdWJzdHJpbmcoMSksZGVjb2RlUGFzc2FibGUpO1xudGFncGF5bG9hZC5sZW5ndGg9PT0yfHxcbmFzc2VydC5mYWlsKFggYGV4cGVjdGVkIHRhZyxwYXlsb2FkIHBhaXI6ICR7ZW5jb2RlZH1gKTtcbmNvbnN0W3RhZyxwYXlsb2FkXT10YWdwYXlsb2FkO1xucGFzc1N0eWxlT2YodGFnKT09PSdzdHJpbmcnfHxcbmFzc2VydC5mYWlsKFggYG5vdCBhIHZhbGlkIHRhZ2dlZCBlbmNvZGluZzogJHtlbmNvZGVkfWApO1xucmV0dXJuIG1ha2VUYWdnZWQodGFnLHBheWxvYWQpO1xuIH07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRW5jb2RlT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIHJlbW90YWJsZTogUmVtb3RhYmxlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBzdHJpbmcsXG4gKiApID0+IHN0cmluZ30gW2VuY29kZVJlbW90YWJsZV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBwcm9taXNlOiBQcm9taXNlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBzdHJpbmcsXG4gKiApID0+IHN0cmluZ30gW2VuY29kZVByb21pc2VdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZXJyb3I6IEVycm9yLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBzdHJpbmcsXG4gKiApID0+IHN0cmluZ30gW2VuY29kZUVycm9yXVxuICovXG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGVPcHRpb25zfSBbZW5jb2RlT3B0aW9uc11cbiAqIEByZXR1cm5zIHsocGFzc2FibGU6IFBhc3NhYmxlKSA9PiBzdHJpbmd9XG4gKi9cbi8qIGB5YXJuIGxpbnRgIGNvbXBsYWlucyBoZXJlIGJ1dCBub3QgZm9yIGVxdWl2YWxlbnQgY29kZSBpbiBhZ29yaWMtc2RrLiovXG4vKiBBbHNvLCB2c2NvZGUgZG9lcyBub3QgY29tcGxhaW4uIEhlbmNlIHdlJ3JlIHVzaW5nIGF0LXRzLWlnbm9yZSByYXRoZXIgdGhhbiovXG4vKiBhdC10cy1leHBlY3QtZXJyb3IuIFVzaW5nIGF0LXRzLWlnbm9yZSBzaG91bGQgYWxzbyBnZW5lcmF0ZSBhIGNvbXBsYWludCovXG4vKiB0aGF0IHdlIHNob3VsZCBiZSB1c2luZyBhdC1leHBlY3QtZXJyb3IsIHdoZXJlIHdlIHdvdWxkIG5vcm1hbGx5IG5lZWQqL1xuLyogdG8gc3VwcHJlc3MgdGhhdCBlcnJvciBhcyB3ZWxsLiBIb3dldmVyLCBwZXJoYXBzIHRoYXQgc2Vjb25kIGVycm9yIGN1cnJlbnRseSovXG4vKiBoYXBwZW5zIG9ubHkgaW4gYWdvcmljLXNkaywgYnV0IG5vdCB5ZXQgaW4gZW5kby4gVE9ETyBmaWd1cmUgb3V0IGFuZCBmaXguKi9cbi8qIEB0cy1pZ25vcmUqL1xuY29uc3QgICAgICAgIG1ha2VFbmNvZGVQYXNzYWJsZT0oe1xuZW5jb2RlUmVtb3RhYmxlPShyZW0sXyk9PmFzc2VydC5mYWlsKFggYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gKSxcbmVuY29kZVByb21pc2U9KHByb20sXyk9PmFzc2VydC5mYWlsKFggYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWApLFxuZW5jb2RlRXJyb3I9KGVycixfKT0+YXNzZXJ0LmZhaWwoWCBgZXJyb3IgdW5leHBlY3RlZDogJHtlcnJ9YCl9PVxue30pPT57XG5jb25zdCBlbmNvZGVQYXNzYWJsZT0ocGFzc2FibGUpPT57XG5pZihFcnJvckhlbHBlci5jYW5CZVZhbGlkKHBhc3NhYmxlLCh4KT0+eCkpe1xucmV0dXJuIGVuY29kZUVycm9yKHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbiB9XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocGFzc2FibGUpO1xuc3dpdGNoKHBhc3NTdHlsZSl7XG5jYXNlJ251bGwnOntcbnJldHVybid2JztcbiB9XG5jYXNlJ3VuZGVmaW5lZCc6e1xucmV0dXJuJ3onO1xuIH1cbmNhc2UnbnVtYmVyJzp7XG5yZXR1cm4gZW5jb2RlQmluYXJ5NjQocGFzc2FibGUpO1xuIH1cbmNhc2Unc3RyaW5nJzp7XG5yZXR1cm4gYHMke3Bhc3NhYmxlfWA7XG4gfVxuY2FzZSdib29sZWFuJzp7XG5yZXR1cm4gYGIke3Bhc3NhYmxlfWA7XG4gfVxuY2FzZSdiaWdpbnQnOntcbnJldHVybiBlbmNvZGVCaWdJbnQocGFzc2FibGUpO1xuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlUmVtb3RhYmxlKHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbnJlc3VsdC5zdGFydHNXaXRoKCdyJyl8fFxuYXNzZXJ0LmZhaWwoXG5YIGBpbnRlcm5hbDogUmVtb3RhYmxlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcInJcIjogJHtyZXN1bHR9YCk7XG5cbnJldHVybiByZXN1bHQ7XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3QgcmVzdWx0PWVuY29kZUVycm9yKHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbnJlc3VsdC5zdGFydHNXaXRoKCchJyl8fFxuYXNzZXJ0LmZhaWwoXG5YIGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiIVwiOiAke3Jlc3VsdH1gKTtcblxucmV0dXJuIHJlc3VsdDtcbiB9XG5jYXNlJ3Byb21pc2UnOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVQcm9taXNlKHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbnJlc3VsdC5zdGFydHNXaXRoKCc/Jyl8fFxuYXNzZXJ0LmZhaWwoXG5YIGBpbnRlcm5hbDogUHJvbWlzZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCI/XCI6ICR7cmVzdWx0fWApO1xuXG5yZXR1cm4gcmVzdWx0O1xuIH1cbmNhc2Unc3ltYm9sJzp7XG5yZXR1cm4gYHkke25hbWVGb3JQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSl9YDtcbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xucmV0dXJuIGVuY29kZUFycmF5KHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbnJldHVybiBlbmNvZGVSZWNvcmQocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5yZXR1cm4gZW5jb2RlVGFnZ2VkKHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFxuWCBgYSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIHVzZWQgYXMgYSBjb2xsZWN0aW9uIHBhc3NhYmxlYCk7XG5cbiB9fVxuXG4gfTtcbnJldHVybiBoYXJkZW4oZW5jb2RlUGFzc2FibGUpO1xuIH07JGjigI1fb25jZS5tYWtlRW5jb2RlUGFzc2FibGUobWFrZUVuY29kZVBhc3NhYmxlKTtcbmhhcmRlbihtYWtlRW5jb2RlUGFzc2FibGUpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlY29kZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUmVtb3RhYmxlOiBzdHJpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogc3RyaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBSZW1vdGFibGV9IFtkZWNvZGVSZW1vdGFibGVdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFByb21pc2U6IHN0cmluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBzdHJpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IFByb21pc2V9IFtkZWNvZGVQcm9taXNlXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRFcnJvcjogc3RyaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IHN0cmluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gRXJyb3J9IFtkZWNvZGVFcnJvcl1cbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7RGVjb2RlT3B0aW9uc30gW2RlY29kZU9wdGlvbnNdXG4gKiBAcmV0dXJucyB7KGVuY29kZWQ6IHN0cmluZykgPT4gUGFzc2FibGV9XG4gKi9cbi8qIGB5YXJuIGxpbnRgIGNvbXBsYWlucyBoZXJlIGJ1dCBub3QgZm9yIGVxdWl2YWxlbnQgY29kZSBpbiBhZ29yaWMtc2RrLiovXG4vKiBBbHNvLCB2c2NvZGUgZG9lcyBub3QgY29tcGxhaW4uIEhlbmNlIHdlJ3JlIHVzaW5nIGF0LXRzLWlnbm9yZSByYXRoZXIgdGhhbiovXG4vKiBhdC10cy1leHBlY3QtZXJyb3IuIFVzaW5nIGF0LXRzLWlnbm9yZSBzaG91bGQgYWxzbyBnZW5lcmF0ZSBhIGNvbXBsYWludCovXG4vKiB0aGF0IHdlIHNob3VsZCBiZSB1c2luZyBhdC1leHBlY3QtZXJyb3IsIHdoZXJlIHdlIHdvdWxkIG5vcm1hbGx5IG5lZWQqL1xuLyogdG8gc3VwcHJlc3MgdGhhdCBlcnJvciBhcyB3ZWxsLiBIb3dldmVyLCBwZXJoYXBzIHRoYXQgc2Vjb25kIGVycm9yIGN1cnJlbnRseSovXG4vKiBoYXBwZW5zIG9ubHkgaW4gYWdvcmljLXNkaywgYnV0IG5vdCB5ZXQgaW4gZW5kby4gVE9ETyBmaWd1cmUgb3V0IGFuZCBmaXguKi9cbi8qIEB0cy1pZ25vcmUqL1xuY29uc3QgICAgICAgIG1ha2VEZWNvZGVQYXNzYWJsZT0oe1xuZGVjb2RlUmVtb3RhYmxlPShyZW0sXyk9PmFzc2VydC5mYWlsKFggYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gKSxcbmRlY29kZVByb21pc2U9KHByb20sXyk9PmFzc2VydC5mYWlsKFggYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWApLFxuZGVjb2RlRXJyb3I9KGVycixfKT0+YXNzZXJ0LmZhaWwoWCBgZXJyb3IgdW5leHBlY3RlZDogJHtlcnJ9YCl9PVxue30pPT57XG5jb25zdCBkZWNvZGVQYXNzYWJsZT0oZW5jb2RlZCk9PntcbnN3aXRjaChlbmNvZGVkLmNoYXJBdCgwKSl7XG5jYXNlJ3YnOntcbnJldHVybiBudWxsO1xuIH1cbmNhc2Uneic6e1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5jYXNlJ2YnOntcbnJldHVybiBkZWNvZGVCaW5hcnk2NChlbmNvZGVkKTtcbiB9XG5jYXNlJ3MnOntcbnJldHVybiBlbmNvZGVkLnN1YnN0cmluZygxKTtcbiB9XG5jYXNlJ2InOntcbnJldHVybiBlbmNvZGVkLnN1YnN0cmluZygxKSE9PSdmYWxzZSc7XG4gfVxuY2FzZSduJzpcbmNhc2UncCc6e1xucmV0dXJuIGRlY29kZUJpZ0ludChlbmNvZGVkKTtcbiB9XG5jYXNlJ3InOntcbnJldHVybiBkZWNvZGVSZW1vdGFibGUoZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZSc/Jzp7XG5yZXR1cm4gZGVjb2RlUHJvbWlzZShlbmNvZGVkLGRlY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJyEnOntcbnJldHVybiBkZWNvZGVFcnJvcihlbmNvZGVkLGRlY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJ3knOntcbnJldHVybiBwYXNzYWJsZVN5bWJvbEZvck5hbWUoZW5jb2RlZC5zdWJzdHJpbmcoMSkpO1xuIH1cbmNhc2UnWyc6e1xucmV0dXJuIGRlY29kZUFycmF5KGVuY29kZWQsZGVjb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UnKCc6e1xucmV0dXJuIGRlY29kZVJlY29yZChlbmNvZGVkLGRlY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJzonOntcbnJldHVybiBkZWNvZGVUYWdnZWQoZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk7XG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChYIGBpbnZhbGlkIGRhdGFiYXNlIGtleTogJHtlbmNvZGVkfWApO1xuIH19XG5cbiB9O1xucmV0dXJuIGhhcmRlbihkZWNvZGVQYXNzYWJsZSk7XG4gfTskaOKAjV9vbmNlLm1ha2VEZWNvZGVQYXNzYWJsZShtYWtlRGVjb2RlUGFzc2FibGUpO1xuaGFyZGVuKG1ha2VEZWNvZGVQYXNzYWJsZSk7XG5cbmNvbnN0ICAgICAgICBpc0VuY29kZWRSZW1vdGFibGU9KGVuY29kZWQpPT5lbmNvZGVkLmNoYXJBdCgwKT09PSdyJzskaOKAjV9vbmNlLmlzRW5jb2RlZFJlbW90YWJsZShpc0VuY29kZWRSZW1vdGFibGUpO1xuaGFyZGVuKGlzRW5jb2RlZFJlbW90YWJsZSk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdHlwZSB7UmVjb3JkPFBhc3NTdHlsZSwgc3RyaW5nPn1cbiAqIFRoZSBzaW5nbGUgcHJlZml4IGNoYXJhY3RlcnMgdG8gYmUgdXNlZCBmb3IgZWFjaCBQYXNzU3R5bGUgY2F0ZWdvcnkuXG4gKiBgYmlnaW50YCBpcyBhIHR3byBjaGFyYWN0ZXIgc3RyaW5nIGJlY2F1c2UgZWFjaCBvZiB0aG9zZSBjaGFyYWN0ZXJzXG4gKiBpbmRpdmlkdWFsbHkgaXMgYSB2YWxpZCBiaWdpbnQgcHJlZml4LiBgbmAgZm9yIFwibmVnYXRpdmVcIiBhbmQgYHBgIGZvclxuICogXCJwb3NpdGl2ZVwiLiBUaGUgb3JkZXJpbmcgb2YgdGhlc2UgcHJlZml4ZXMgaXMgdGhlIHNhbWUgYXMgdGhlXG4gKiByYW5rT3JkZXJpbmcgb2YgdGhlaXIgcmVzcGVjdGl2ZSBQYXNzU3R5bGVzLiBUaGlzIHRhYmxlIGlzIGltcG9ydGVkIGJ5XG4gKiByYW5kT3JkZXIuanMgZm9yIHRoaXMgcHVycG9zZS5cbiAqXG4gKiBJbiBhZGRpdGlvbiwgYHxgIGlzIHRoZSByZW1vdGFibGUtPm9yZGluYWwgbWFwcGluZyBwcmVmaXg6XG4gKiBUaGlzIGlzIG5vdCB1c2VkIGluIGNvdmVycyBidXQgaXQgaXNcbiAqIHJlc2VydmVkIGZyb20gdGhlIHNhbWUgc2V0IG9mIHN0cmluZ3MuIE5vdGUgdGhhdCB0aGUgcHJlZml4IGlzID4gYW55XG4gKiBwcmVmaXggdXNlZCBieSBhbnkgY292ZXIgc28gdGhhdCBvcmRpbmFsIG1hcHBpbmcga2V5cyBhcmUgYWx3YXlzIG91dHNpZGVcbiAqIHRoZSByYW5nZSBvZiB2YWxpZCBjb2xsZWN0aW9uIGVudHJ5IGtleXMuXG4gKi9cbmNvbnN0ICAgICAgICBwYXNzU3R5bGVQcmVmaXhlcz1oYXJkZW4oe1xuX19wcm90b19fOm51bGwsXG5lcnJvcjonIScsXG5jb3B5UmVjb3JkOicoJyxcbnRhZ2dlZDonOicsXG5wcm9taXNlOic/JyxcbmNvcHlBcnJheTonWycsXG5ib29sZWFuOidiJyxcbm51bWJlcjonZicsXG5iaWdpbnQ6J25wJyxcbnJlbW90YWJsZToncicsXG5zdHJpbmc6J3MnLFxubnVsbDondicsXG5zeW1ib2w6J3knLFxudW5kZWZpbmVkOid6J30pOyRo4oCNX29uY2UucGFzc1N0eWxlUHJlZml4ZXMocGFzc1N0eWxlUHJlZml4ZXMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InJlY29yZE5hbWVzIjpbInJlY29yZE5hbWVzIl0sInJlY29yZFZhbHVlcyI6WyJyZWNvcmRWYWx1ZXMiXSwiemVyb1BhZCI6WyJ6ZXJvUGFkIl0sIm1ha2VFbmNvZGVQYXNzYWJsZSI6WyJtYWtlRW5jb2RlUGFzc2FibGUiXSwibWFrZURlY29kZVBhc3NhYmxlIjpbIm1ha2VEZWNvZGVQYXNzYWJsZSJdLCJpc0VuY29kZWRSZW1vdGFibGUiOlsiaXNFbmNvZGVkUmVtb3RhYmxlIl0sInBhc3NTdHlsZVByZWZpeGVzIjpbInBhc3NTdHlsZVByZWZpeGVzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADDAhnAKQAAACkAAACsAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzeyJpbXBvcnRzIjpbIi4vaGVscGVycy9lcnJvci5qcyIsIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vaGVscGVycy9zeW1ib2wuanMiLCIuL21ha2VUYWdnZWQuanMiLCIuL3Bhc3NTdHlsZU9mLmpzIl0sImV4cG9ydHMiOlsiUUNMQVNTIiwibWFrZURlY29kZUZyb21DYXBEYXRhIiwibWFrZUVuY29kZVRvQ2FwRGF0YSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwYXNzU3R5bGVPZixFcnJvckhlbHBlcixtYWtlVGFnZ2VkLGlzT2JqZWN0LGdldFRhZyxoYXNPd25Qcm9wZXJ0eU9mLGFzc2VydFBhc3NhYmxlU3ltYm9sLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWU7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9lcnJvci5qc1wiLCBbW1wiRXJyb3JIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKEVycm9ySGVscGVyID0gJGjigI1fYSldXV1dLFtcIi4vbWFrZVRhZ2dlZC5qc1wiLCBbW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3N5bWJvbC5qc1wiLCBbW1wiYXNzZXJ0UGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsIFskaOKAjV9hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRW5jb2Rpbmd9IEVuY29kaW5nICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5SZW1vdGFibGV9IFJlbW90YWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRW5jb2RpbmdVbmlvbn0gRW5jb2RpbmdVbmlvbiAqL1xuXG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtcbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsXG5kZWZpbmVQcm9wZXJ0aWVzLFxuaXMsXG5lbnRyaWVzLFxuZnJvbUVudHJpZXMsXG5mcmVlemV9PVxuT2JqZWN0O1xuY29uc3R7ZGV0YWlsczpYLEZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG4vKipcbiAqIFNwZWNpYWwgcHJvcGVydHkgbmFtZSB0aGF0IGluZGljYXRlcyBhbiBlbmNvZGluZyB0aGF0IG5lZWRzIHNwZWNpYWxcbiAqIGRlY29kaW5nLlxuICovXG5jb25zdCBRQ0xBU1M9J0BxY2xhc3MnOyRo4oCNX29uY2UuUUNMQVNTKFFDTEFTUyk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSBlbmNvZGVkXG4gKiBAcmV0dXJucyB7ZW5jb2RlZCBpcyBFbmNvZGluZ1VuaW9ufVxuICovXG5jb25zdCBoYXNRQ2xhc3M9KGVuY29kZWQpPT5oYXNPd25Qcm9wZXJ0eU9mKGVuY29kZWQsUUNMQVNTKTtcblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSBlbmNvZGVkXG4gKiBAcGFyYW0ge3N0cmluZ30gcWNsYXNzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgcWNsYXNzTWF0Y2hlcz0oZW5jb2RlZCxxY2xhc3MpPT5cbmlzT2JqZWN0KGVuY29kZWQpJiZcbiFpc0FycmF5KGVuY29kZWQpJiZcbmhhc1FDbGFzcyhlbmNvZGVkKSYmXG5lbmNvZGVkW1FDTEFTU109PT1xY2xhc3M7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRW5jb2RlVG9DYXBEYXRhT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIHJlbW90YWJsZTogUmVtb3RhYmxlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ1xuICogKSA9PiBFbmNvZGluZ30gW2VuY29kZVJlbW90YWJsZVRvQ2FwRGF0YV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBwcm9taXNlOiBQcm9taXNlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ1xuICogKSA9PiBFbmNvZGluZ30gW2VuY29kZVByb21pc2VUb0NhcERhdGFdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZXJyb3I6IEVycm9yLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ1xuICogKSA9PiBFbmNvZGluZ30gW2VuY29kZUVycm9yVG9DYXBEYXRhXVxuICovXG5cbmNvbnN0IGRvbnRFbmNvZGVSZW1vdGFibGVUb0NhcERhdGE9KHJlbSk9PkZhaWwgYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gO1xuXG5jb25zdCBkb250RW5jb2RlUHJvbWlzZVRvQ2FwRGF0YT0ocHJvbSk9PkZhaWwgYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVFcnJvclRvQ2FwRGF0YT0oZXJyKT0+RmFpbCBgZXJyb3Igb2JqZWN0IHVuZXhwZWN0ZWQ6ICR7ZXJyfWA7XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGVUb0NhcERhdGFPcHRpb25zfSBlbmNvZGVPcHRpb25zXG4gKiBAcmV0dXJucyB7KHBhc3NhYmxlOiBQYXNzYWJsZSkgPT4gRW5jb2Rpbmd9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRW5jb2RlVG9DYXBEYXRhPSh7XG5lbmNvZGVSZW1vdGFibGVUb0NhcERhdGE9ZG9udEVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSxcbmVuY29kZVByb21pc2VUb0NhcERhdGE9ZG9udEVuY29kZVByb21pc2VUb0NhcERhdGEsXG5lbmNvZGVFcnJvclRvQ2FwRGF0YT1kb250RW5jb2RlRXJyb3JUb0NhcERhdGF9PVxue30pPT57XG4vKipcbiAqIE11c3QgZW5jb2RlIGB2YWxgIGludG8gcGxhaW4gSlNPTiBkYXRhICpjYW5vbmljYWxseSosIHN1Y2ggdGhhdFxuICogYEpTT04uc3RyaW5naWZ5KGVuY29kZSh2MSkpID09PSBKU09OLnN0cmluZ2lmeShlbmNvZGUodjEpKWAuIEZvciBtb3N0XG4gKiBlbmNvZGluZ3MsIHRoZSBvcmRlciBvZiBwcm9wZXJ0aWVzIG9mIGVhY2ggbm9kZSBvZiB0aGUgb3V0cHV0XG4gKiBzdHJ1Y3R1cmUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYWxnb3JpdGhtIGJlbG93IHdpdGhvdXQgc3BlY2lhbFxuICogYXJyYW5nZW1lbnQsIHVzdWFsbHkgYnkgYmVpbmcgZXhwcmVzc2VkIGRpcmVjdGx5IGFzIGFuIG9iamVjdCBsaXRlcmFsLlxuICogVGhlIGV4Y2VwdGlvbiBpcyBjb3B5UmVjb3Jkcywgd2hvc2UgbmF0dXJhbCBlbnVtZXJhdGlvbiBvcmRlclxuICogY2FuIGRpZmZlciBiZXR3ZWVuIGNvcHlSZWNvcmRzIHRoYXQgb3VyIGRpc3RyaWJ1dGVkIG9iamVjdCBzZW1hbnRpY3NcbiAqIGNvbnNpZGVycyB0byBiZSBlcXVpdmFsZW50LlxuICogU2luY2UsIGZvciBlYWNoIGNvcHlSZWNvcmQsIHdlIG9ubHkgYWNjZXB0IHN0cmluZyBwcm9wZXJ0eSBuYW1lcyxcbiAqIG5vdCBzeW1ib2xzLCB3ZSBjYW4gY2Fub25pY2FsbHkgc29ydCB0aGUgbmFtZXMgZmlyc3QuXG4gKiBKU09OLnN0cmluZ2lmeSB3aWxsIHRoZW4gdmlzaXQgdGhlc2UgaW4gdGhhdCBzb3J0ZWQgb3JkZXIuXG4gKlxuICogRW5jb2Rpbmcgd2l0aCBhIGNhbm9uaWNhbC1KU09OIGVuY29kZXIgd291bGQgYWxzbyBzb2x2ZSB0aGlzIGNhbm9uaWNhbG5lc3NcbiAqIHByb2JsZW0gaW4gYSBtb3JlIG1vZHVsYXIgYW5kIGVuY2Fwc3VsYXRlZCBtYW5uZXIuIE5vdGUgdGhhdCB0aGVcbiAqIGFjdHVhbCBvcmRlciBwcm9kdWNlZCBoZXJlLCB0aG91Z2ggaXQgYWdyZWVzIHdpdGggY2Fub25pY2FsLUpTT04gb25cbiAqIGNvcHlSZWNvcmQgcHJvcGVydHkgb3JkZXJpbmcsIGRpZmZlcnMgZnJvbSBjYW5vbmljYWwtSlNPTiBhcyBhIHdob2xlXG4gKiBpbiB0aGF0IHRoZSBvdGhlciByZWNvcmQgcHJvcGVydGllcyBhcmUgdmlzaXRlZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2hcbiAqIHRoZXkgYXJlIGxpdGVyYWxseSB3cml0dGVuIGJlbG93LiBUT0RPIHBlcmhhcHMgd2Ugc2hvdWxkIGluZGVlZCBzd2l0Y2hcbiAqIHRvIGEgY2Fub25pY2FsIEpTT04gZW5jb2RlciwgYW5kIG5vdCBkZWxpY2F0ZXRseSBkZXBlbmQgb24gdGhlIG9yZGVyXG4gKiBpbiB3aGljaCB0aGVzZSBvYmplY3QgbGl0ZXJhbHMgYXJlIHdyaXR0ZW4uXG4gKlxuICogUmVhZGVycyBtdXN0IG5vdCBjYXJlIGFib3V0IHRoaXMgb3JkZXIgYW55d2F5LiBXZSBpbXBvc2UgdGhpcyByZXF1aXJlbWVudFxuICogbWFpbmx5IHRvIHJlZHVjZSBub24tZGV0ZXJtaW5pc20gZXhwb3NlZCBvdXRzaWRlIGEgdmF0LlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhc3NhYmxlXG4gKiBAcmV0dXJucyB7RW5jb2Rpbmd9IGV4Y2VwdCB0aGF0IGBlbmNvZGVUb0NhcERhdGFgIGRvZXMgbm90IGdlbmVyYWxseVxuICogYGhhcmRlbmAgdGhpcyByZXN1bHQgYmVmb3JlIHJldHVybmluZy4gUmF0aGVyLCBgZW5jb2RlVG9DYXBEYXRhYCBpcyBub3RcbiAqIGRpcmVjdGx5IGV4cG9zZWQuXG4gKiBXaGF0J3MgZXhwb3NlZCBpbnN0ZWFkIGlzIGEgd3JhcHBlciB0aGF0IGZyZWV6ZXMgdGhlIG91dHB1dCBiZWZvcmVcbiAqIHJldHVybmluZy4gSWYgdGhpcyB0dXJucyBvdXQgdG8gaW1wZWRlIHN0YXRpYyBhbmFseXNpcyBmb3IgYGhhcmRlbmAgc2FmZXR5LFxuICogd2UgY2FuIGFsd2F5cyBwdXQgdGhlIChub3cgcmVkdW5kYW50KSBoYXJkZW5zIGJhY2sgaW4uIFRoZXkgZG9uJ3QgaHVydC5cbiAqL1xuY29uc3QgZW5jb2RlVG9DYXBEYXRhUmVjdXI9KHBhc3NhYmxlKT0+e1xuLyogRmlyc3Qgd2UgaGFuZGxlIGFsbCBwcmltaXRpdmVzLiBTb21lIGNhbiBiZSByZXByZXNlbnRlZCBkaXJlY3RseSBhcyovXG4vKiBKU09OLCBhbmQgc29tZSBtdXN0IGJlIGVuY29kZWQgYXMgW1FDTEFTU10gY29tcG9zaXRlcy4qL1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdudWxsJzp7XG5yZXR1cm4gbnVsbDtcbiB9XG5jYXNlJ3VuZGVmaW5lZCc6e1xucmV0dXJue1tRQ0xBU1NdOid1bmRlZmluZWQnfTtcbiB9XG5jYXNlJ3N0cmluZyc6XG5jYXNlJ2Jvb2xlYW4nOntcbnJldHVybiBwYXNzYWJsZTtcbiB9XG5jYXNlJ251bWJlcic6e1xuaWYoTnVtYmVyLmlzTmFOKHBhc3NhYmxlKSl7XG5yZXR1cm57W1FDTEFTU106J05hTid9O1xuIH1cbmlmKGlzKHBhc3NhYmxlLC0wKSl7XG5yZXR1cm4gMDtcbiB9XG5pZihwYXNzYWJsZT09PUluZmluaXR5KXtcbnJldHVybntbUUNMQVNTXTonSW5maW5pdHknfTtcbiB9XG5pZihwYXNzYWJsZT09PS1JbmZpbml0eSl7XG5yZXR1cm57W1FDTEFTU106Jy1JbmZpbml0eSd9O1xuIH1cbnJldHVybiBwYXNzYWJsZTtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xucmV0dXJue1xuW1FDTEFTU106J2JpZ2ludCcsXG5kaWdpdHM6U3RyaW5nKHBhc3NhYmxlKX07XG5cbiB9XG5jYXNlJ3N5bWJvbCc6e1xuYXNzZXJ0UGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xuY29uc3QgbmFtZT0vKiogQHR5cGUge3N0cmluZ30gKi9uYW1lRm9yUGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xucmV0dXJue1xuW1FDTEFTU106J3N5bWJvbCcsXG5uYW1lfTtcblxuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuaWYoaGFzT3duUHJvcGVydHlPZihwYXNzYWJsZSxRQ0xBU1MpKXtcbi8qIEhpbGJlcnQgaG90ZWwqL1xuY29uc3R7W1FDTEFTU106cWNsYXNzVmFsdWUsLi4ucmVzdH09cGFzc2FibGU7XG4vKiogQHR5cGUge0VuY29kaW5nfSAqL1xuY29uc3QgcmVzdWx0PXtcbltRQ0xBU1NdOidoaWxiZXJ0Jyxcbm9yaWdpbmFsOmVuY29kZVRvQ2FwRGF0YVJlY3VyKHFjbGFzc1ZhbHVlKX07XG5cbmlmKG93bktleXMocmVzdCkubGVuZ3RoPj0xKXtcbi8qIFdlIGhhcmRlbiB0aGUgZW50aXJlIGNhcERhdGEgZW5jb2RpbmcgYmVmb3JlIHdlIHJldHVybiBpdC4qL1xuLyogYGVuY29kZVRvQ2FwRGF0YWAgcmVxdWlyZXMgdGhhdCBpdHMgaW5wdXQgYmUgUGFzc2FibGUsIGFuZCovXG4vKiB0aGVyZWZvcmUgaGFyZGVuZWQuKi9cbi8qIFRoZSBgZnJlZXplYCBoZXJlIGlzIG5lZWRlZCBhbnl3YXksIGJlY2F1c2UgdGhlIGByZXN0YCBpcyovXG4vKiBmcmVzaGx5IGNvbnN0cnVjdGVkIGJ5IHRoZSBgLi4uYCBhYm92ZSwgYW5kIHdlJ3JlIHVzaW5nIGl0Ki9cbi8qIGFzIGltcHV0IGluIGFub3RoZXIgY2FsbCB0byBgZW5jb2RlVG9DYXBEYXRhYC4qL1xucmVzdWx0LnJlc3Q9ZW5jb2RlVG9DYXBEYXRhUmVjdXIoZnJlZXplKHJlc3QpKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH1cbi8qIEN1cnJlbnRseSBjb3B5UmVjb3JkIGFsbG93cyBvbmx5IHN0cmluZyBrZXlzIHNvIHRoaXMgd2lsbCovXG4vKiB3b3JrLiBJZiB3ZSBhbGxvdyBzb3J0YWJsZSBzeW1ib2wga2V5cywgdGhpcyB3aWxsIG5lZWQgdG8qL1xuLyogYmVjb21lIG1vcmUgaW50ZXJlc3RpbmcuKi9cbmNvbnN0IG5hbWVzPW93bktleXMocGFzc2FibGUpLnNvcnQoKTtcbnJldHVybiBmcm9tRW50cmllcyhcbm5hbWVzLm1hcCgobmFtZSk9PltuYW1lLGVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlW25hbWVdKV0pKTtcblxuIH1cbmNhc2UnY29weUFycmF5Jzp7XG5yZXR1cm4gcGFzc2FibGUubWFwKGVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xucmV0dXJue1xuW1FDTEFTU106J3RhZ2dlZCcsXG50YWc6Z2V0VGFnKHBhc3NhYmxlKSxcbnBheWxvYWQ6ZW5jb2RlVG9DYXBEYXRhUmVjdXIocGFzc2FibGUucGF5bG9hZCl9O1xuXG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbmNvbnN0IGVuY29kZWQ9ZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhKFxucGFzc2FibGUsXG5lbmNvZGVUb0NhcERhdGFSZWN1cik7XG5cbmlmKHFjbGFzc01hdGNoZXMoZW5jb2RlZCwnc2xvdCcpKXtcbnJldHVybiBlbmNvZGVkO1xuIH1cbi8qIGB0aHJvd2AgaXMgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLiBCdXQgbGludGVyIGNvbmZ1c2VkKi9cbnRocm93IEZhaWwgYGludGVybmFsOiBSZW1vdGFibGUgZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCAke3EoXG5RQ0xBU1MpXG4gfSAke3EoJ3Nsb3QnKX06ICR7ZW5jb2RlZH1gO1xuIH1cbmNhc2UncHJvbWlzZSc6e1xuY29uc3QgZW5jb2RlZD1lbmNvZGVQcm9taXNlVG9DYXBEYXRhKHBhc3NhYmxlLGVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcbmlmKHFjbGFzc01hdGNoZXMoZW5jb2RlZCwnc2xvdCcpKXtcbnJldHVybiBlbmNvZGVkO1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBQcm9taXNlIGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggJHtxKFxuUUNMQVNTLFxuJ3Nsb3QnKVxuIH06ICR7ZW5jb2RlZH1gO1xuIH1cbmNhc2UnZXJyb3InOntcbmNvbnN0IGVuY29kZWQ9ZW5jb2RlRXJyb3JUb0NhcERhdGEocGFzc2FibGUsZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuaWYocWNsYXNzTWF0Y2hlcyhlbmNvZGVkLCdlcnJvcicpKXtcbnJldHVybiBlbmNvZGVkO1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoICR7cShcblFDTEFTUyxcbidlcnJvcicpXG4gfTogJHtlbmNvZGVkfWA7XG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChcblggYGludGVybmFsOiBVbnJlY29nbml6ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfWAsXG5UeXBlRXJyb3IpO1xuXG4gfX1cblxuIH07XG5jb25zdCBlbmNvZGVUb0NhcERhdGE9KHBhc3NhYmxlKT0+e1xuaWYoRXJyb3JIZWxwZXIuY2FuQmVWYWxpZChwYXNzYWJsZSkpe1xuLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgdG8gYWNjb21tb2RhdGUgZXJyb3JzIHRoYXQgYXJlIG5vdCovXG4vKiB2YWxpZCBQYXNzYWJsZXMuIEZvciBleGFtcGxlLCBiZWNhdXNlIHRoZXkncmUgbm90IGZyb3plbi4qL1xuLyogVGhlIHNwZWNpYWwgY2FzZSBjYW4gb25seSBldmVyIGFwcGx5IGF0IHRoZSByb290LCBhbmQgdGhlcmVmb3JlKi9cbi8qIG91dHNpZGUgdGhlIHJlY3Vyc2lvbiwgc2luY2UgYW4gZXJyb3IgY291bGQgb25seSBiZSBkZWVwZXIgaW4qL1xuLyogYSBwYXNzYWJsZSBzdHJ1Y3R1cmUgaWYgaXQgd2VyZSBwYXNzYWJsZS4qL1xuLyoqL1xuLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgYmVjYXVzZSwgZm9yIHRoZXNlIGVycm9ycywgd2UncmUgbXVjaCovXG4vKiBtb3JlIGludGVyZXN0ZWQgaW4gcmVwb3J0aW5nIHdoYXRldmVyIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gdGhleSovXG4vKiBjYXJyeSB0aGFuIHdlIGFyZSBhYm91dCByZXBvcnRpbmcgcHJvYmxlbXMgZW5jb3VudGVyZWQgaW4gcmVwb3J0aW5nKi9cbi8qIHRoaXMgaW5mb3JtYXRpb24uKi9cbnJldHVybiBoYXJkZW4oZW5jb2RlRXJyb3JUb0NhcERhdGEocGFzc2FibGUsZW5jb2RlVG9DYXBEYXRhUmVjdXIpKTtcbiB9XG5yZXR1cm4gaGFyZGVuKGVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlKSk7XG4gfTtcbnJldHVybiBoYXJkZW4oZW5jb2RlVG9DYXBEYXRhKTtcbiB9OyRo4oCNX29uY2UubWFrZUVuY29kZVRvQ2FwRGF0YShtYWtlRW5jb2RlVG9DYXBEYXRhKTtcbmhhcmRlbihtYWtlRW5jb2RlVG9DYXBEYXRhKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWNvZGVPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFJlbW90YWJsZTogRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IChQcm9taXNlfFJlbW90YWJsZSl9IFtkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUHJvbWlzZTogRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IChQcm9taXNlfFJlbW90YWJsZSl9IFtkZWNvZGVQcm9taXNlRnJvbUNhcERhdGFdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZEVycm9yOiBFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gRXJyb3J9IFtkZWNvZGVFcnJvckZyb21DYXBEYXRhXVxuICovXG5cbmNvbnN0IGRvbnREZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YT0oc2xvdEVuY29kaW5nKT0+XG5GYWlsIGByZW1vdGFibGUgb3IgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Nsb3RFbmNvZGluZ31gO1xuY29uc3QgZG9udERlY29kZUVycm9yRnJvbUNhcERhdGE9KGVycm9yRW5jb2RpbmcpPT5cbkZhaWwgYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZXJyb3JFbmNvZGluZ31gO1xuXG4vKipcbiAqIFRoZSBjdXJyZW50IGVuY29kaW5nIGRvZXMgbm90IGdpdmUgdGhlIGRlY29kZXIgZW5vdWdoIGludG8gdG8gZGlzdGluZ3Vpc2hcbiAqIHdoZXRoZXIgYSBzbG90IHJlcHJlc2VudHMgYSBwcm9taXNlIG9yIGEgcmVtb3RhYmxlLiBBcyBhbiBpbXBsZW1lbnRhdGlvblxuICogcmVzdHJpY3Rpb24gdW50aWwgdGhpcyBpcyBmaXhlZCwgaWYgZWl0aGVyIGlzIHByb3ZpZGVkLCBib3RoIG11c3QgYmVcbiAqIHByb3ZpZGVkIGFuZCB0aGV5IG11c3QgYmUgdGhlIHNhbWUuXG4gKlxuICogVGhpcyBzZWVtcyBsaWtlIHRoZSBiZXN0IHN0YXJ0aW5nIHBvaW50IHRvIGluY3JlbWVudGFsbHkgZXZvbHZlIHRvIGFuXG4gKiBBUEkgd2hlcmUgdGhlc2UgY2FuIHJlbGlhYmx5IGRpZmZlci5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQzMzRcbiAqXG4gKiBAcGFyYW0ge0RlY29kZU9wdGlvbnN9IGRlY29kZU9wdGlvbnNcbiAqIEByZXR1cm5zIHsoZW5jb2RlZDogRW5jb2RpbmcpID0+IFBhc3NhYmxlfVxuICovXG5jb25zdCAgICAgICAgbWFrZURlY29kZUZyb21DYXBEYXRhPSh7XG5kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YT1kb250RGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG5kZWNvZGVQcm9taXNlRnJvbUNhcERhdGE9ZG9udERlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YT1kb250RGVjb2RlRXJyb3JGcm9tQ2FwRGF0YX09XG57fSk9PntcbmRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhPT09ZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhfHxcbkZhaWwgYEFuIGltcGxlbWVudGF0aW9uIHJlc3RyaWN0aW9uIGZvciBub3c6IElmIGVpdGhlciBkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YSBvciBkZWNvZGVQcm9taXNlRnJvbUNhcERhdGEgaXMgcHJvdmlkZWQsIGJvdGggbXVzdCBiZSBwcm92aWRlZCBhbmQgdGhleSBtdXN0IGJlIHRoZSBzYW1lOiAke3EoXG5kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YSlcbiB9IHZzICR7cShkZWNvZGVQcm9taXNlRnJvbUNhcERhdGEpfWA7XG5cbi8qKlxuICogYGRlY29kZUZyb21DYXBEYXRhYCBtYXkgcmVseSBvbiBganNvbkVuY29kZWRgIGJlaW5nIHRoZSByZXN1bHQgb2YgYVxuICogcGxhaW4gY2FsbCB0byBKU09OLnBhcnNlLiBIb3dldmVyLCBpdCAqY2Fubm90KiByZWx5IG9uIGBqc29uRW5jb2RlZGBcbiAqIGhhdmluZyBiZWVuIHByb2R1Y2VkIGJ5IEpTT04uc3RyaW5naWZ5IG9uIHRoZSBvdXRwdXQgb2YgYGVuY29kZVRvQ2FwRGF0YWBcbiAqIGFib3ZlLCBpLmUuLCBgZGVjb2RlRnJvbUNhcERhdGFgIGNhbm5vdCByZWx5IG9uIGBqc29uRW5jb2RlZGAgYmVpbmcgYVxuICogdmFsaWQgbWFyc2hhbGxlZCByZXByZXNlbnRhdGlvbi4gUmF0aGVyLCBgZGVjb2RlRnJvbUNhcERhdGFgIG11c3RcbiAqIHZhbGlkYXRlIHRoYXQuXG4gKlxuICogQHBhcmFtIHtFbmNvZGluZ30ganNvbkVuY29kZWQgbXVzdCBiZSBoYXJkZW5lZFxuICovXG5jb25zdCBkZWNvZGVGcm9tQ2FwRGF0YT0oanNvbkVuY29kZWQpPT57XG5pZighaXNPYmplY3QoanNvbkVuY29kZWQpKXtcbi8qIHByaW1pdGl2ZXMgcGFzcyB0aHJvdWdoKi9cbnJldHVybiBqc29uRW5jb2RlZDtcbiB9XG5pZihpc0FycmF5KGpzb25FbmNvZGVkKSl7XG5yZXR1cm4ganNvbkVuY29kZWQubWFwKChlbmNvZGVkVmFsKT0+ZGVjb2RlRnJvbUNhcERhdGEoZW5jb2RlZFZhbCkpO1xuIH1lbHNlIGlmKGhhc1FDbGFzcyhqc29uRW5jb2RlZCkpe1xuY29uc3QgcWNsYXNzPWpzb25FbmNvZGVkW1FDTEFTU107XG5hc3NlcnQudHlwZW9mKFxucWNsYXNzLFxuJ3N0cmluZycsXG5YIGBpbnZhbGlkICR7cShRQ0xBU1MpfSB0eXBlb2YgJHtxKHR5cGVvZiBxY2xhc3MpfWApO1xuXG5zd2l0Y2gocWNsYXNzKXtcbi8qIEVuY29kaW5nIG9mIHByaW1pdGl2ZXMgbm90IGhhbmRsZWQgYnkgSlNPTiovXG5jYXNlJ3VuZGVmaW5lZCc6e1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5jYXNlJ05hTic6e1xucmV0dXJuIE5hTjtcbiB9XG5jYXNlJ0luZmluaXR5Jzp7XG5yZXR1cm4gSW5maW5pdHk7XG4gfVxuY2FzZSctSW5maW5pdHknOntcbnJldHVybi1JbmZpbml0eTtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xuLyogVXNpbmcgQHRzLWlnbm9yZSByYXRoZXIgdGhhbiBAdHMtZXhwZWN0LWVycm9yIGJlbG93IGJlY2F1c2UqL1xuLyogd2l0aCBAdHMtZXhwZWN0LWVycm9yIEkgZ2V0IGEgcmVkIHVuZGVybGluZSBpbiB2c2NvZGUsIGJ1dCovXG4vKiB3aXRob3V0IGl0IEkgZ2V0IGVycm9ycyBmcm9tIGB5YXJuIGxpbnRgLiovXG4vKiBAdHMtaWdub3JlIGluYWRlcXVhdGUgdHlwZSBpbmZlcmVuY2UqL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNTkjZGlzY3Vzc2lvbl9yOTU0NTYxOTAxKi9cbmNvbnN0e2RpZ2l0c309anNvbkVuY29kZWQ7XG5hc3NlcnQudHlwZW9mKFxuZGlnaXRzLFxuJ3N0cmluZycsXG5YIGBpbnZhbGlkIGRpZ2l0cyB0eXBlb2YgJHtxKHR5cGVvZiBkaWdpdHMpfWApO1xuXG5yZXR1cm4gQmlnSW50KGRpZ2l0cyk7XG4gfVxuY2FzZSdAQGFzeW5jSXRlcmF0b3InOntcbi8qIERlcHJlY2F0ZWQgcWNsYXNzLiBUT0RPIG1ha2UgY29uZGl0aW9uYWwqL1xuLyogb24gZW52aXJvbm1lbnQgdmFyaWFibGUuIEV2ZW50dWFsbHkgcmVtb3ZlLCBidXQgYWZ0ZXIgY29uZmlkZW50Ki9cbi8qIHRoYXQgdGhlcmUgYXJlIG5vIG1vcmUgc3VwcG9ydGVkIHNlbmRlcnMuKi9cbi8qKi9cbi8qIFVzaW5nIEB0cy1pZ25vcmUgcmF0aGVyIHRoYW4gQHRzLWV4cGVjdC1lcnJvciBiZWxvdyBiZWNhdXNlKi9cbi8qIHdpdGggQHRzLWV4cGVjdC1lcnJvciBJIGdldCBhIHJlZCB1bmRlcmxpbmUgaW4gdnNjb2RlLCBidXQqL1xuLyogd2l0aG91dCBpdCBJIGdldCBlcnJvcnMgZnJvbSBgeWFybiBsaW50YC4qL1xuLyogQHRzLWlnbm9yZSBpbmFkZXF1YXRlIHR5cGUgaW5mZXJlbmNlKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjU5I2Rpc2N1c3Npb25fcjk1NDU2MTkwMSovXG5yZXR1cm4gU3ltYm9sLmFzeW5jSXRlcmF0b3I7XG4gfVxuY2FzZSdzeW1ib2wnOntcbi8qIFVzaW5nIEB0cy1pZ25vcmUgcmF0aGVyIHRoYW4gQHRzLWV4cGVjdC1lcnJvciBiZWxvdyBiZWNhdXNlKi9cbi8qIHdpdGggQHRzLWV4cGVjdC1lcnJvciBJIGdldCBhIHJlZCB1bmRlcmxpbmUgaW4gdnNjb2RlLCBidXQqL1xuLyogd2l0aG91dCBpdCBJIGdldCBlcnJvcnMgZnJvbSBgeWFybiBsaW50YC4qL1xuLyogQHRzLWlnbm9yZSBpbmFkZXF1YXRlIHR5cGUgaW5mZXJlbmNlKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjU5I2Rpc2N1c3Npb25fcjk1NDU2MTkwMSovXG5jb25zdHtuYW1lfT1qc29uRW5jb2RlZDtcbnJldHVybiBwYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbi8qIFVzaW5nIEB0cy1pZ25vcmUgcmF0aGVyIHRoYW4gQHRzLWV4cGVjdC1lcnJvciBiZWxvdyBiZWNhdXNlKi9cbi8qIHdpdGggQHRzLWV4cGVjdC1lcnJvciBJIGdldCBhIHJlZCB1bmRlcmxpbmUgaW4gdnNjb2RlLCBidXQqL1xuLyogd2l0aG91dCBpdCBJIGdldCBlcnJvcnMgZnJvbSBgeWFybiBsaW50YC4qL1xuLyogQHRzLWlnbm9yZSBpbmFkZXF1YXRlIHR5cGUgaW5mZXJlbmNlKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjU5I2Rpc2N1c3Npb25fcjk1NDU2MTkwMSovXG5jb25zdHt0YWcscGF5bG9hZH09anNvbkVuY29kZWQ7XG5yZXR1cm4gbWFrZVRhZ2dlZCh0YWcsZGVjb2RlRnJvbUNhcERhdGEocGF5bG9hZCkpO1xuIH1cbmNhc2Unc2xvdCc6e1xuLyogU2VlIG5vdGUgYWJvdmUgYWJvdXQgaG93IHRoZSBjdXJyZW50IGVuY29kaW5nIGNhbm5vdCByZWxpYWJseSovXG4vKiBkaXN0aW5ndWlzaCB3aGljaCB3ZSBzaG91bGQgY2FsbCwgc28gaW4gdGhlIG5vbi1kZWZhdWx0IGNhc2UqL1xuLyogYm90aCBtdXN0IGJlIHRoZSBzYW1lIGFuZCBpdCBkb2Vzbid0IG1hdHRlciB3aGljaCB3ZSBjYWxsLiovXG5jb25zdCBkZWNvZGVkPWRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhKFxuanNvbkVuY29kZWQsXG5kZWNvZGVGcm9tQ2FwRGF0YSk7XG5cbi8qIEJFV0FSRTogY2FwZGF0YSBkb2VzIG5vdCBjaGVjayB0aGF0IGBkZWNvZGVkYCBpcyovXG4vKiBhIHByb21pc2Ugb3IgYSByZW1vdGFibGUsIHNpbmNlIHRoYXQgd291bGQgYnJlYWsgc29tZSovXG4vKiBjYXBkYXRhIGNsaWVudHMuIFdlIGFyZSBkZXByZWNhdGluZyBjYXBkYXRhLCBhbmQgdGhlc2UgY2xpZW50cyovXG4vKiB3aWxsIG5lZWQgdG8gdXBkYXRlIGJlZm9yZSBzd2l0Y2hpbmcgdG8gc21hbGxjYXBzLiovXG5yZXR1cm4gZGVjb2RlZDtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5jb25zdCBkZWNvZGVkPWRlY29kZUVycm9yRnJvbUNhcERhdGEoXG5qc29uRW5jb2RlZCxcbmRlY29kZUZyb21DYXBEYXRhKTtcblxuaWYocGFzc1N0eWxlT2YoZGVjb2RlZCk9PT0nZXJyb3InKXtcbnJldHVybiBkZWNvZGVkO1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBkZWNvZGVFcnJvckZyb21DYXBEYXRhIG9wdGlvbiBtdXN0IHJldHVybiBhbiBlcnJvcjogJHtkZWNvZGVkfWA7XG4gfVxuY2FzZSdoaWxiZXJ0Jzp7XG4vKiBVc2luZyBAdHMtaWdub3JlIHJhdGhlciB0aGFuIEB0cy1leHBlY3QtZXJyb3IgYmVsb3cgYmVjYXVzZSovXG4vKiB3aXRoIEB0cy1leHBlY3QtZXJyb3IgSSBnZXQgYSByZWQgdW5kZXJsaW5lIGluIHZzY29kZSwgYnV0Ki9cbi8qIHdpdGhvdXQgaXQgSSBnZXQgZXJyb3JzIGZyb20gYHlhcm4gbGludGAuKi9cbi8qIEB0cy1pZ25vcmUgaW5hZGVxdWF0ZSB0eXBlIGluZmVyZW5jZSovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTI1OSNkaXNjdXNzaW9uX3I5NTQ1NjE5MDEqL1xuY29uc3R7b3JpZ2luYWwscmVzdH09anNvbkVuY29kZWQ7XG5oYXNPd25Qcm9wZXJ0eU9mKGpzb25FbmNvZGVkLCdvcmlnaW5hbCcpfHxcbkZhaWwgYEludmFsaWQgSGlsYmVydCBIb3RlbCBlbmNvZGluZyAke2pzb25FbmNvZGVkfWA7XG4vKiBEb24ndCBoYXJkZW4gc2luY2Ugd2UncmUgbm90IGRvbmUgbXV0YXRpbmcgaXQqL1xuY29uc3QgcmVzdWx0PXtbUUNMQVNTXTpkZWNvZGVGcm9tQ2FwRGF0YShvcmlnaW5hbCl9O1xuaWYoaGFzT3duUHJvcGVydHlPZihqc29uRW5jb2RlZCwncmVzdCcpKXtcbmNvbnN0IGlzTm9uRW1wdHlPYmplY3Q9XG50eXBlb2YgcmVzdD09PSdvYmplY3QnJiZcbnJlc3QhPT1udWxsJiZcbm93bktleXMocmVzdCkubGVuZ3RoPj0xO1xuaXNOb25FbXB0eU9iamVjdHx8XG5GYWlsIGBSZXN0IGVuY29kaW5nIG11c3QgYmUgYSBub24tZW1wdHkgb2JqZWN0OiAke3Jlc3R9YDtcbmNvbnN0IHJlc3RPYmo9ZGVjb2RlRnJvbUNhcERhdGEocmVzdCk7XG4vKiBUT0RPIHJlYWxseSBzaG91bGQgYXNzZXJ0IHRoYXQgYHBhc3NTdHlsZU9mKHJlc3QpYCBpcyovXG4vKiBgJ2NvcHlSZWNvcmQnYCBidXQgd2UnZCBoYXZlIHRvIGhhcmRlbiBpdCBhbmQgaXQgaXMgdG9vKi9cbi8qIGVhcmx5IHRvIGRvIHRoYXQuKi9cbiFoYXNPd25Qcm9wZXJ0eU9mKHJlc3RPYmosUUNMQVNTKXx8XG5GYWlsIGBSZXN0IG11c3Qgbm90IGNvbnRhaW4gaXRzIG93biBkZWZpbml0aW9uIG9mICR7cShRQ0xBU1MpfWA7XG5kZWZpbmVQcm9wZXJ0aWVzKHJlc3VsdCxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHJlc3RPYmopKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH1cbi8qIEB0cy1leHBlY3QtZXJyb3IgVGhpcyBpcyB0aGUgZXJyb3IgY2FzZSB3ZSdyZSB0ZXN0aW5nIGZvciovXG5jYXNlJ2liaWQnOntcbnRocm93IEZhaWwgYFRoZSBjYXBEYXRhIHByb3RvY29sIG5vIGxvbmdlciBzdXBwb3J0cyAke3EoUUNMQVNTKX0gJHtxKFxucWNsYXNzKVxuIH1gO1xuIH1cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoWCBgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLFR5cGVFcnJvcik7XG4gfX1cblxuIH1lbHNle1xuYXNzZXJ0KHR5cGVvZiBqc29uRW5jb2RlZD09PSdvYmplY3QnJiZqc29uRW5jb2RlZCE9PW51bGwpO1xuY29uc3QgZGVjb2RlRW50cnk9KFtuYW1lLGVuY29kZWRWYWxdKT0+e1xudHlwZW9mIG5hbWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBQcm9wZXJ0eSAke3EobmFtZSl9IG9mICR7anNvbkVuY29kZWR9IG11c3QgYmUgYSBzdHJpbmdgO1xucmV0dXJuW25hbWUsZGVjb2RlRnJvbUNhcERhdGEoZW5jb2RlZFZhbCldO1xuIH07XG5jb25zdCBkZWNvZGVkRW50cmllcz1lbnRyaWVzKGpzb25FbmNvZGVkKS5tYXAoZGVjb2RlRW50cnkpO1xucmV0dXJuIGZyb21FbnRyaWVzKGRlY29kZWRFbnRyaWVzKTtcbiB9XG4gfTtcbnJldHVybiBoYXJkZW4oZGVjb2RlRnJvbUNhcERhdGEpO1xuIH07JGjigI1fb25jZS5tYWtlRGVjb2RlRnJvbUNhcERhdGEobWFrZURlY29kZUZyb21DYXBEYXRhKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJRQ0xBU1MiOlsiUUNMQVNTIl0sIm1ha2VFbmNvZGVUb0NhcERhdGEiOlsibWFrZUVuY29kZVRvQ2FwRGF0YSJdLCJtYWtlRGVjb2RlRnJvbUNhcERhdGEiOlsibWFrZURlY29kZUZyb21DYXBEYXRhIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMAaDCF5PQAAeT0AAC0AAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvZW5jb2RlVG9TbWFsbGNhcHMuanN7ImltcG9ydHMiOlsiLi9oZWxwZXJzL2Vycm9yLmpzIiwiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9oZWxwZXJzL3N5bWJvbC5qcyIsIi4vbWFrZVRhZ2dlZC5qcyIsIi4vcGFzc1N0eWxlT2YuanMiXSwiZXhwb3J0cyI6WyJtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyIsIm1ha2VFbmNvZGVUb1NtYWxsY2FwcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwYXNzU3R5bGVPZixFcnJvckhlbHBlcixtYWtlVGFnZ2VkLGdldFRhZyxoYXNPd25Qcm9wZXJ0eU9mLGFzc2VydFBhc3NhYmxlU3ltYm9sLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWU7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9lcnJvci5qc1wiLCBbW1wiRXJyb3JIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKEVycm9ySGVscGVyID0gJGjigI1fYSldXV1dLFtcIi4vbWFrZVRhZ2dlZC5qc1wiLCBbW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9zeW1ib2wuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLCBbJGjigI1fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5SZW1vdGFibGV9IFJlbW90YWJsZSAqL1xuLyogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5TbWFsbGNhcHNFbmNvZGluZ30gU21hbGxjYXBzRW5jb2RpbmcgKlgvKi9cbi8qIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuU21hbGxjYXBzRW5jb2RpbmdVbmlvbn0gU21hbGxjYXBzRW5jb2RpbmdVbmlvbiAqWC8qL1xuLyoqIEB0eXBlZGVmIHthbnl9IFNtYWxsY2Fwc0VuY29kaW5nICovXG4vKiogQHR5cGVkZWYge2FueX0gU21hbGxjYXBzRW5jb2RpbmdVbmlvbiAqL1xuXG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtpcyxlbnRyaWVzLGZyb21FbnRyaWVzfT1PYmplY3Q7XG5jb25zdHtkZXRhaWxzOlgsRmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5cbmNvbnN0IEJBTkc9JyEnLmNoYXJDb2RlQXQoMCk7XG5jb25zdCBEQVNIPSctJy5jaGFyQ29kZUF0KDApO1xuXG4vKipcbiAqIEFuIGBlbmNvZGVUb1NtYWxsY2Fwc2AgZnVuY3Rpb24gdGFrZXMgYSBwYXNzYWJsZSBhbmQgcmV0dXJucyBhXG4gKiBKU09OLXJlcHJlc2VudGFibGUgb2JqZWN0IChpLmUuLCByb3VuZC10cmlwcGluZyBpdCB0aHJvdWdoXG4gKiBgSlNPTi5zdHJpbmdpZnlgIGFuZCBgSlNPTi5wYXJzZWAgd2l0aCBubyByZXBsYWNlcnMgb3IgcmV2aXZlcnNcbiAqIHJldHVybnMgYW4gZXF1aXZhbGVudCBzdHJ1Y3R1cmUgZXhjZXB0IGZvciBvYmplY3QgaWRlbnRpdHkpLlxuICogV2UgY2FsbCB0aGlzIHJlcHJlc2VudGF0aW9uIGEgU21hbGxjYXBzIEVuY29kaW5nLlxuICpcbiAqIEEgYGRlY29kZUZyb21TbWFsbGNhcHNgIGZ1bmN0aW9uIHRha2VzIGFzIGFyZ3VtZW50IHdoYXQgaXRcbiAqICphc3N1bWVzKiBpcyB0aGUgcmVzdWx0IG9mIGEgcGxhaW4gYEpTT04ucGFyc2VgIHdpdGggbm8gcmVzb2x2ZXIuIEl0IHRoZW5cbiAqIG11c3QgdmFsaWRhdGUgdGhhdCBpdCBpcyBhIHZhbGlkIFNtYWxsY2FwcyBFbmNvZGluZywgYW5kIGlmIGl0IGlzLFxuICogcmV0dXJuIGEgY29ycmVzcG9uZGluZyBwYXNzYWJsZS5cbiAqXG4gKiBTbWFsbGNhcHMgY29uc2lkZXJzIHRoZSBjaGFyYWN0ZXJzIGJldHdlZW4gYCFgIChhc2NpaSBjb2RlIDMzLCBCQU5HKVxuICogYW5kIGAtYCAoYXNjaWkgY29kZSA0NSwgREFTSCkgdG8gYmUgc3BlY2lhbCBwcmVmaXhlcyBhbGxvd2luZ1xuICogcmVwcmVzZW50YXRpb24gb2YgSlNPTi1pbmNvbXBhdGlibGUgZGF0YSB1c2luZyBzdHJpbmdzLlxuICogVGhlc2UgY2hhcmFjdGVycywgaW4gb3JkZXIsIGFyZSBgIVwiIyQlJicoKSorLC1gXG4gKiBPZiB0aGVzZSwgc21hbGxjYXBzIGN1cnJlbnRseSB1c2VzIHRoZSBmb2xsb3dpbmc6XG4gKlxuICogICogYCFgIC0gZXNjYXBlZCBzdHJpbmdcbiAqICAqIGArYCAtIG5vbi1uZWdhdGl2ZSBiaWdpbnRcbiAqICAqIGAtYCAtIG5lZ2F0aXZlIGJpZ2ludFxuICogICogYCNgIC0gbWFuaWZlc3QgY29uc3RhbnRcbiAqICAqIGAlYCAtIHN5bWJvbFxuICogICogYCRgIC0gcmVtb3RhYmxlXG4gKiAgKiBgJmAgLSBwcm9taXNlXG4gKlxuICogQWxsIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVycyAoYFwiJygpKixgKSBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuXG4gKlxuICogVGhlIG1hbmlmZXN0IGNvbnN0YW50cyB0aGF0IHNtYWxsY2FwcyBjdXJyZW50bHkgdXNlcyBmb3IgdmFsdWVzOlxuICogICogYCN1bmRlZmluZWRgXG4gKiAgKiBgI05hTmBcbiAqICAqIGAjSW5maW5pdHlgXG4gKiAgKiBgIy1JbmZpbml0eWBcbiAqXG4gKiBhbmQgZm9yIHByb3BlcnR5IG5hbWVzIGFuYWxvZ291cyB0byBjYXBkYXRhIEBxY2xhc3M6XG4gKiAgKiBgI3RhZ2BcbiAqICAqIGAjZXJyb3JgXG4gKlxuICogQWxsIG90aGVyIGVuY29kZWQgc3RyaW5ncyBiZWdpbm5pbmcgd2l0aCBgI2AgYXJlIHJlc2VydmVkIGZvclxuICogZnV0dXJlIHVzZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZFN0clxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IHN0YXJ0c1NwZWNpYWw9KGVuY29kZWRTdHIpPT57XG5pZihlbmNvZGVkU3RyPT09Jycpe1xucmV0dXJuIGZhbHNlO1xuIH1cbi8qIGNoYXJDb2RlQXQoMCkgYW5kIG51bWJlciBjb21wYXJlIGlzIGEgYml0IGZhc3Rlci4qL1xuY29uc3QgY29kZT1lbmNvZGVkU3RyLmNoYXJDb2RlQXQoMCk7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgeW9kYSovXG5yZXR1cm4gQkFORzw9Y29kZSYmY29kZTw9REFTSDtcbiB9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEVuY29kZVRvU21hbGxjYXBzT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIHJlbW90YWJsZTogUmVtb3RhYmxlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBTbWFsbGNhcHNFbmNvZGluZ1xuICogKSA9PiBTbWFsbGNhcHNFbmNvZGluZ30gW2VuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIHByb21pc2U6IFByb21pc2UsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IFNtYWxsY2Fwc0VuY29kaW5nXG4gKiApID0+IFNtYWxsY2Fwc0VuY29kaW5nfSBbZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVycm9yOiBFcnJvcixcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gU21hbGxjYXBzRW5jb2RpbmdcbiAqICkgPT4gU21hbGxjYXBzRW5jb2Rpbmd9IFtlbmNvZGVFcnJvclRvU21hbGxjYXBzXVxuICovXG5cbmNvbnN0IGRvbnRFbmNvZGVSZW1vdGFibGVUb1NtYWxsY2Fwcz0ocmVtKT0+XG5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YDtcblxuY29uc3QgZG9udEVuY29kZVByb21pc2VUb1NtYWxsY2Fwcz0ocHJvbSk9PkZhaWwgYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVFcnJvclRvU21hbGxjYXBzPShlcnIpPT5cbkZhaWwgYGVycm9yIG9iamVjdCB1bmV4cGVjdGVkOiAke3EoZXJyKX1gO1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2RlVG9TbWFsbGNhcHNPcHRpb25zfSBlbmNvZGVPcHRpb25zXG4gKiBAcmV0dXJucyB7KHBhc3NhYmxlOiBQYXNzYWJsZSkgPT4gU21hbGxjYXBzRW5jb2Rpbmd9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRW5jb2RlVG9TbWFsbGNhcHM9KHtcbmVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzPWRvbnRFbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyxcbmVuY29kZVByb21pc2VUb1NtYWxsY2Fwcz1kb250RW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzLFxuZW5jb2RlRXJyb3JUb1NtYWxsY2Fwcz1kb250RW5jb2RlRXJyb3JUb1NtYWxsY2Fwc309XG57fSk9Pntcbi8qKlxuICogTXVzdCBlbmNvZGUgYHZhbGAgaW50byBwbGFpbiBKU09OIGRhdGEgKmNhbm9uaWNhbGx5Kiwgc3VjaCB0aGF0XG4gKiBgSlNPTi5zdHJpbmdpZnkoZW5jb2RlKHYxKSkgPT09IEpTT04uc3RyaW5naWZ5KGVuY29kZSh2MSkpYC4gRm9yIG1vc3RcbiAqIGVuY29kaW5ncywgdGhlIG9yZGVyIG9mIHByb3BlcnRpZXMgb2YgZWFjaCBub2RlIG9mIHRoZSBvdXRwdXRcbiAqIHN0cnVjdHVyZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBhbGdvcml0aG0gYmVsb3cgd2l0aG91dCBzcGVjaWFsXG4gKiBhcnJhbmdlbWVudCwgdXN1YWxseSBieSBiZWluZyBleHByZXNzZWQgZGlyZWN0bHkgYXMgYW4gb2JqZWN0IGxpdGVyYWwuXG4gKiBUaGUgZXhjZXB0aW9uIGlzIGNvcHlSZWNvcmRzLCB3aG9zZSBuYXR1cmFsIGVudW1lcmF0aW9uIG9yZGVyXG4gKiBjYW4gZGlmZmVyIGJldHdlZW4gY29weVJlY29yZHMgdGhhdCBvdXIgZGlzdHJpYnV0ZWQgb2JqZWN0IHNlbWFudGljc1xuICogY29uc2lkZXJzIHRvIGJlIGVxdWl2YWxlbnQuXG4gKiBTaW5jZSwgZm9yIGVhY2ggY29weVJlY29yZCwgd2Ugb25seSBhY2NlcHQgc3RyaW5nIHByb3BlcnR5IG5hbWVzLFxuICogbm90IHN5bWJvbHMsIHdlIGNhbiBjYW5vbmljYWxseSBzb3J0IHRoZSBuYW1lcyBmaXJzdC5cbiAqIEpTT04uc3RyaW5naWZ5IHdpbGwgdGhlbiB2aXNpdCB0aGVzZSBpbiB0aGF0IHNvcnRlZCBvcmRlci5cbiAqXG4gKiBTbWFsbGNhcHNFbmNvZGluZyB3aXRoIGEgY2Fub25pY2FsLUpTT04gZW5jb2RlciB3b3VsZCBhbHNvIHNvbHZlXG4gKiB0aGlzIGNhbm9uaWNhbG5lc3NcbiAqIHByb2JsZW0gaW4gYSBtb3JlIG1vZHVsYXIgYW5kIGVuY2Fwc3VsYXRlZCBtYW5uZXIuIE5vdGUgdGhhdCB0aGVcbiAqIGFjdHVhbCBvcmRlciBwcm9kdWNlZCBoZXJlLCB0aG91Z2ggaXQgYWdyZWVzIHdpdGggY2Fub25pY2FsLUpTT04gb25cbiAqIGNvcHlSZWNvcmQgcHJvcGVydHkgb3JkZXJpbmcsIGRpZmZlcnMgZnJvbSBjYW5vbmljYWwtSlNPTiBhcyBhIHdob2xlXG4gKiBpbiB0aGF0IHRoZSBvdGhlciByZWNvcmQgcHJvcGVydGllcyBhcmUgdmlzaXRlZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2hcbiAqIHRoZXkgYXJlIGxpdGVyYWxseSB3cml0dGVuIGJlbG93LiBUT0RPIHBlcmhhcHMgd2Ugc2hvdWxkIGluZGVlZCBzd2l0Y2hcbiAqIHRvIGEgY2Fub25pY2FsIEpTT04gZW5jb2RlciwgYW5kIG5vdCBkZWxpY2F0ZXRseSBkZXBlbmQgb24gdGhlIG9yZGVyXG4gKiBpbiB3aGljaCB0aGVzZSBvYmplY3QgbGl0ZXJhbHMgYXJlIHdyaXR0ZW4uXG4gKlxuICogUmVhZGVycyBtdXN0IG5vdCBjYXJlIGFib3V0IHRoaXMgb3JkZXIgYW55d2F5LiBXZSBpbXBvc2UgdGhpcyByZXF1aXJlbWVudFxuICogbWFpbmx5IHRvIHJlZHVjZSBub24tZGV0ZXJtaW5pc20gZXhwb3NlZCBvdXRzaWRlIGEgdmF0LlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhc3NhYmxlXG4gKiBAcmV0dXJucyB7U21hbGxjYXBzRW5jb2Rpbmd9IGV4Y2VwdCB0aGF0IGBlbmNvZGVUb1NtYWxsY2Fwc2AgZG9lcyBub3QgZ2VuZXJhbGx5XG4gKiBgaGFyZGVuYCB0aGlzIHJlc3VsdCBiZWZvcmUgcmV0dXJuaW5nLiBSYXRoZXIsIGBlbmNvZGVUb1NtYWxsY2Fwc2AgaXMgbm90XG4gKiBkaXJlY3RseSBleHBvc2VkLlxuICogV2hhdCdzIGV4cG9zZWQgaW5zdGVhZCBpcyBhIHdyYXBwZXIgdGhhdCBmcmVlemVzIHRoZSBvdXRwdXQgYmVmb3JlXG4gKiByZXR1cm5pbmcuIElmIHRoaXMgdHVybnMgb3V0IHRvIGltcGVkZSBzdGF0aWMgYW5hbHlzaXMgZm9yIGBoYXJkZW5gIHNhZmV0eSxcbiAqIHdlIGNhbiBhbHdheXMgcHV0IHRoZSAobm93IHJlZHVuZGFudCkgaGFyZGVucyBiYWNrIGluLiBUaGV5IGRvbid0IGh1cnQuXG4gKi9cbmNvbnN0IGVuY29kZVRvU21hbGxjYXBzUmVjdXI9KHBhc3NhYmxlKT0+e1xuLyogRmlyc3Qgd2UgaGFuZGxlIGFsbCBwcmltaXRpdmVzLiBTb21lIGNhbiBiZSByZXByZXNlbnRlZCBkaXJlY3RseSBhcyovXG4vKiBKU09OLCBhbmQgc29tZSBtdXN0IGJlIGVuY29kZWQgaW50byBzbWFsbGNhcHMgc3RyaW5ncy4qL1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdudWxsJzpcbmNhc2UnYm9vbGVhbic6e1xuLyogcGFzcyB0aHJvdWdoIHRvIEpTT04qL1xucmV0dXJuIHBhc3NhYmxlO1xuIH1cbmNhc2Unc3RyaW5nJzp7XG5pZihzdGFydHNTcGVjaWFsKHBhc3NhYmxlKSl7XG4vKiBTdHJpbmdzIHRoYXQgc3RhcnQgd2l0aCBhIHNwZWNpYWwgY2hhciBhcmUgcXVvdGVkIHdpdGggYCFgLiovXG4vKiBTaW5jZSBgIWAgaXMgaXRzZWxmIGEgc3BlY2lhbCBjaGFyYWN0ZXIsIHRoaXMgdHJpdmlhbGx5IGRvZXMqL1xuLyogdGhlIEhpbGJlcnQgaG90ZWwuIEFsc28sIHNpbmNlIHRoZSBzcGVjaWFsIGNoYXJhY3RlcnMgYXJlKi9cbi8qIGEgY29udGludW91cyBzdWJyYW5nZSBvZiBhc2NpaSwgdGhpcyBxdW90aW5nIGlzIHNvcnQtb3JkZXIqL1xuLyogcHJlc2VydmluZy4qL1xucmV0dXJuIGAhJHtwYXNzYWJsZX1gO1xuIH1cbi8qIEFsbCBvdGhlciBzdHJpbmdzIHBhc3MgdGhyb3VnaCB0byBKU09OKi9cbnJldHVybiBwYXNzYWJsZTtcbiB9XG5jYXNlJ3N5bWJvbCc6e1xuLyogQXQgdGhlIHNtYWxsY2FwcyBsZXZlbCwgd2UgcHJlZml4IHN5bWJvbCBuYW1lcyB3aXRoIGAlYC4qL1xuLyogQnkgXCJzeW1ib2wgbmFtZVwiLCB3ZSBtZWFuIGFjY29yZGluZyB0byBgbmFtZUZvclBhc3NhYmxlU3ltYm9sYCovXG4vKiB3aGljaCBkb2VzIHNvbWUgZnVydGhlciBlc2NhcGluZy4gU2VlIGNvbW1lbnQgb24gdGhhdCBmdW5jdGlvbi4qL1xuYXNzZXJ0UGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xuY29uc3QgbmFtZT0vKiogQHR5cGUge3N0cmluZ30gKi9uYW1lRm9yUGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xucmV0dXJuIGAlJHtuYW1lfWA7XG4gfVxuY2FzZSd1bmRlZmluZWQnOntcbnJldHVybicjdW5kZWZpbmVkJztcbiB9XG5jYXNlJ251bWJlcic6e1xuaWYoTnVtYmVyLmlzTmFOKHBhc3NhYmxlKSl7XG5yZXR1cm4nI05hTic7XG4gfVxuaWYoaXMocGFzc2FibGUsLTApKXtcbnJldHVybiAwO1xuIH1cbmlmKHBhc3NhYmxlPT09SW5maW5pdHkpe1xucmV0dXJuJyNJbmZpbml0eSc7XG4gfVxuaWYocGFzc2FibGU9PT0tSW5maW5pdHkpe1xucmV0dXJuJyMtSW5maW5pdHknO1xuIH1cbi8qIEFsbCBvdGhlciBudW1iZXJzIHBhc3MgdGhyb3VnaCB0byBKU09OKi9cbnJldHVybiBwYXNzYWJsZTtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xuY29uc3Qgc3RyPVN0cmluZyhwYXNzYWJsZSk7XG5yZXR1cm4gcGFzc2FibGU8MG4/c3RyOiBgKyR7c3RyfWA7XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG4vKiBDdXJyZW50bHkgY29weVJlY29yZCBhbGxvd3Mgb25seSBzdHJpbmcga2V5cyBzbyB0aGlzIHdpbGwqL1xuLyogd29yay4gSWYgd2UgYWxsb3cgc29ydGFibGUgc3ltYm9sIGtleXMsIHRoaXMgd2lsbCBuZWVkIHRvKi9cbi8qIGJlY29tZSBtb3JlIGludGVyZXN0aW5nLiovXG5jb25zdCBuYW1lcz1vd25LZXlzKHBhc3NhYmxlKS5zb3J0KCk7XG5yZXR1cm4gZnJvbUVudHJpZXMoXG5uYW1lcy5tYXAoKG5hbWUpPT5bXG5lbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKG5hbWUpLFxuZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZVtuYW1lXSldKSk7XG5cblxuIH1cbmNhc2UnY29weUFycmF5Jzp7XG5yZXR1cm4gcGFzc2FibGUubWFwKGVuY29kZVRvU21hbGxjYXBzUmVjdXIpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5yZXR1cm57XG4nI3RhZyc6ZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihnZXRUYWcocGFzc2FibGUpKSxcbnBheWxvYWQ6ZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZS5wYXlsb2FkKX07XG5cbiB9XG5jYXNlJ3JlbW90YWJsZSc6e1xuY29uc3QgcmVzdWx0PWVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzKFxucGFzc2FibGUsXG5lbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcblxuaWYodHlwZW9mIHJlc3VsdD09PSdzdHJpbmcnJiZyZXN1bHQuc3RhcnRzV2l0aCgnJCcpKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuLyogYHRocm93YCBpcyBub29wIHNpbmNlIGBGYWlsYCB0aHJvd3MuIEJ1dCBsaW50ZXIgY29uZnVzZWQqL1xudGhyb3cgRmFpbCBgaW50ZXJuYWw6IFJlbW90YWJsZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCIkXCI6ICR7cmVzdWx0fWA7XG4gfVxuY2FzZSdwcm9taXNlJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzKFxucGFzc2FibGUsXG5lbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcblxuaWYodHlwZW9mIHJlc3VsdD09PSdzdHJpbmcnJiZyZXN1bHQuc3RhcnRzV2l0aCgnJicpKXtcbnJldHVybiByZXN1bHQ7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IFByb21pc2UgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiJlwiOiAke3Jlc3VsdH1gO1xuIH1cbmNhc2UnZXJyb3InOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVFcnJvclRvU21hbGxjYXBzKHBhc3NhYmxlLGVuY29kZVRvU21hbGxjYXBzUmVjdXIpO1xuaWYodHlwZW9mIHJlc3VsdD09PSdvYmplY3QnJiZoYXNPd25Qcm9wZXJ0eU9mKHJlc3VsdCwnI2Vycm9yJykpe1xuY29uc3QgbWVzc2FnZT1yZXN1bHRbJyNlcnJvciddO1xuaWYoXG50eXBlb2YgbWVzc2FnZT09PSdzdHJpbmcnJiYoXG4vKiBjaGVjayB0aGF0IGl0IGRlY29kZXMgdG8gYSBzdHJpbmcqL1xuIXN0YXJ0c1NwZWNpYWwobWVzc2FnZSl8fG1lc3NhZ2Uuc3RhcnRzV2l0aCgnIScpKSlcbntcbnJldHVybiByZXN1bHQ7XG4gfVxuRmFpbCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgaGF2ZSBzdHJpbmcgbWVzc2FnZTogJHtxKFxubWVzc2FnZSlcbiB9YDtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBoYXZlIFwiI2Vycm9yXCIgcHJvcGVydHk6ICR7cShcbnJlc3VsdClcbiB9YDtcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFxuWCBgaW50ZXJuYWw6IFVucmVjb2duaXplZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9YCxcblR5cGVFcnJvcik7XG5cbiB9fVxuXG4gfTtcbmNvbnN0IGVuY29kZVRvU21hbGxjYXBzPShwYXNzYWJsZSk9PntcbmlmKEVycm9ySGVscGVyLmNhbkJlVmFsaWQocGFzc2FibGUpKXtcbi8qIFdlIHB1bGwgb3V0IHRoaXMgc3BlY2lhbCBjYXNlIHRvIGFjY29tbW9kYXRlIGVycm9ycyB0aGF0IGFyZSBub3QqL1xuLyogdmFsaWQgUGFzc2FibGVzLiBGb3IgZXhhbXBsZSwgYmVjYXVzZSB0aGV5J3JlIG5vdCBmcm96ZW4uKi9cbi8qIFRoZSBzcGVjaWFsIGNhc2UgY2FuIG9ubHkgZXZlciBhcHBseSBhdCB0aGUgcm9vdCwgYW5kIHRoZXJlZm9yZSovXG4vKiBvdXRzaWRlIHRoZSByZWN1cnNpb24sIHNpbmNlIGFuIGVycm9yIGNvdWxkIG9ubHkgYmUgZGVlcGVyIGluKi9cbi8qIGEgcGFzc2FibGUgc3RydWN0dXJlIGlmIGl0IHdlcmUgcGFzc2FibGUuKi9cbi8qKi9cbi8qIFdlIHB1bGwgb3V0IHRoaXMgc3BlY2lhbCBjYXNlIGJlY2F1c2UsIGZvciB0aGVzZSBlcnJvcnMsIHdlJ3JlIG11Y2gqL1xuLyogbW9yZSBpbnRlcmVzdGVkIGluIHJlcG9ydGluZyB3aGF0ZXZlciBkaWFnbm9zdGljIGluZm9ybWF0aW9uIHRoZXkqL1xuLyogY2FycnkgdGhhbiB3ZSBhcmUgYWJvdXQgcmVwb3J0aW5nIHByb2JsZW1zIGVuY291bnRlcmVkIGluIHJlcG9ydGluZyovXG4vKiB0aGlzIGluZm9ybWF0aW9uLiovXG5jb25zdCByZXN1bHQ9aGFyZGVuKFxuZW5jb2RlRXJyb3JUb1NtYWxsY2FwcyhwYXNzYWJsZSxlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKSk7XG5cbmlmKHR5cGVvZiByZXN1bHQ9PT0nb2JqZWN0JyYmaGFzT3duUHJvcGVydHlPZihyZXN1bHQsJyNlcnJvcicpKXtcbmNvbnN0IG1lc3NhZ2U9cmVzdWx0WycjZXJyb3InXTtcbmlmKFxudHlwZW9mIG1lc3NhZ2U9PT0nc3RyaW5nJyYmKFxuLyogY2hlY2sgdGhhdCBpdCBkZWNvZGVzIHRvIGEgc3RyaW5nKi9cbiFzdGFydHNTcGVjaWFsKG1lc3NhZ2UpfHxtZXNzYWdlLnN0YXJ0c1dpdGgoJyEnKSkpXG57XG5yZXR1cm4gcmVzdWx0O1xuIH1cbkZhaWwgYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IHN0cmluZyBtZXNzYWdlOiAke3EobWVzc2FnZSl9YDtcbiB9XG5GYWlsIGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBoYXZlIFwiI2Vycm9yXCIgcHJvcGVydHk6ICR7cShyZXN1bHQpfWA7XG4gfVxucmV0dXJuIGhhcmRlbihlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKHBhc3NhYmxlKSk7XG4gfTtcbnJldHVybiBoYXJkZW4oZW5jb2RlVG9TbWFsbGNhcHMpO1xuIH07JGjigI1fb25jZS5tYWtlRW5jb2RlVG9TbWFsbGNhcHMobWFrZUVuY29kZVRvU21hbGxjYXBzKTtcbmhhcmRlbihtYWtlRW5jb2RlVG9TbWFsbGNhcHMpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlY29kZUZyb21TbWFsbGNhcHNPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFJlbW90YWJsZTogU21hbGxjYXBzRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZSA6U21hbGxjYXBzRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IFJlbW90YWJsZX0gW2RlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHNdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFByb21pc2U6IFNtYWxsY2Fwc0VuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGUgOlNtYWxsY2Fwc0VuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBQcm9taXNlfSBbZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHNdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZEVycm9yOiBTbWFsbGNhcHNFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlIDpTbWFsbGNhcHNFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gRXJyb3J9IFtkZWNvZGVFcnJvckZyb21TbWFsbGNhcHNdXG4gKi9cblxuY29uc3QgZG9udERlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHM9KGVuY29kaW5nKT0+XG5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gO1xuY29uc3QgZG9udERlY29kZVByb21pc2VGcm9tU21hbGxjYXBzPShlbmNvZGluZyk9PlxuRmFpbCBgcHJvbWlzZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzPShlbmNvZGluZyk9PlxuRmFpbCBgZXJyb3IgdW5leHBlY3RlZDogJHtxKGVuY29kaW5nKX1gO1xuXG4vKipcbiAqIEBwYXJhbSB7RGVjb2RlRnJvbVNtYWxsY2Fwc09wdGlvbnN9IGRlY29kZU9wdGlvbnNcbiAqIEByZXR1cm5zIHsoZW5jb2RlZDogU21hbGxjYXBzRW5jb2RpbmcpID0+IFBhc3NhYmxlfVxuICovXG5jb25zdCAgICAgICAgbWFrZURlY29kZUZyb21TbWFsbGNhcHM9KHtcbmRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHM9ZG9udERlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMsXG5kZWNvZGVQcm9taXNlRnJvbVNtYWxsY2Fwcz1kb250RGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMsXG5kZWNvZGVFcnJvckZyb21TbWFsbGNhcHM9ZG9udERlY29kZUVycm9yRnJvbVNtYWxsY2Fwc309XG57fSk9Pntcbi8qKlxuICogYGRlY29kZUZyb21TbWFsbGNhcHNgIG1heSByZWx5IG9uIGBlbmNvZGluZ2AgYmVpbmcgdGhlIHJlc3VsdCBvZiBhXG4gKiBwbGFpbiBjYWxsIHRvIEpTT04ucGFyc2UuIEhvd2V2ZXIsIGl0ICpjYW5ub3QqIHJlbHkgb24gYGVuY29kaW5nYFxuICogaGF2aW5nIGJlZW4gcHJvZHVjZWQgYnkgSlNPTi5zdHJpbmdpZnkgb24gdGhlIG91dHB1dCBvZiBgZW5jb2RlVG9TbWFsbGNhcHNgXG4gKiBhYm92ZSwgaS5lLiwgYGRlY29kZUZyb21TbWFsbGNhcHNgIGNhbm5vdCByZWx5IG9uIGBlbmNvZGluZ2AgYmVpbmcgYVxuICogdmFsaWQgbWFyc2hhbGxlZCByZXByZXNlbnRhdGlvbi4gUmF0aGVyLCBgZGVjb2RlRnJvbVNtYWxsY2Fwc2AgbXVzdFxuICogdmFsaWRhdGUgdGhhdC5cbiAqXG4gKiBAcGFyYW0ge1NtYWxsY2Fwc0VuY29kaW5nfSBlbmNvZGluZyBtdXN0IGJlIGhhcmRlbmVkXG4gKi9cbmNvbnN0IGRlY29kZUZyb21TbWFsbGNhcHM9KGVuY29kaW5nKT0+e1xuc3dpdGNoKHR5cGVvZiBlbmNvZGluZyl7XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdudW1iZXInOntcbnJldHVybiBlbmNvZGluZztcbiB9XG5jYXNlJ3N0cmluZyc6e1xuaWYoIXN0YXJ0c1NwZWNpYWwoZW5jb2RpbmcpKXtcbnJldHVybiBlbmNvZGluZztcbiB9XG5jb25zdCBjPWVuY29kaW5nLmNoYXJBdCgwKTtcbnN3aXRjaChjKXtcbmNhc2UnISc6e1xuLyogdW4taGlsYmVydC1pZnkgdGhlIHN0cmluZyovXG5yZXR1cm4gZW5jb2Rpbmcuc2xpY2UoMSk7XG4gfVxuY2FzZSclJzp7XG5yZXR1cm4gcGFzc2FibGVTeW1ib2xGb3JOYW1lKGVuY29kaW5nLnNsaWNlKDEpKTtcbiB9XG5jYXNlJyMnOntcbnN3aXRjaChlbmNvZGluZyl7XG5jYXNlJyN1bmRlZmluZWQnOntcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuY2FzZScjTmFOJzp7XG5yZXR1cm4gTmFOO1xuIH1cbmNhc2UnI0luZmluaXR5Jzp7XG5yZXR1cm4gSW5maW5pdHk7XG4gfVxuY2FzZScjLUluZmluaXR5Jzp7XG5yZXR1cm4tSW5maW5pdHk7XG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChYIGB1bmtub3duIGNvbnN0YW50IFwiJHtxKGVuY29kaW5nKX1cImAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfVxuY2FzZScrJzp7XG5yZXR1cm4gQmlnSW50KGVuY29kaW5nLnNsaWNlKDEpKTtcbiB9XG5jYXNlJy0nOntcbnJldHVybiBCaWdJbnQoZW5jb2RpbmcpO1xuIH1cbmNhc2UnJCc6e1xuY29uc3QgcmVzdWx0PWRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMoXG5lbmNvZGluZyxcbmRlY29kZUZyb21TbWFsbGNhcHMpO1xuXG5pZihwYXNzU3R5bGVPZihyZXN1bHQpIT09J3JlbW90YWJsZScpe1xuRmFpbCBgaW50ZXJuYWw6IGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMgb3B0aW9uIG11c3QgcmV0dXJuIGEgcmVtb3RhYmxlOiAke3Jlc3VsdH1gO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfVxuY2FzZScmJzp7XG5jb25zdCByZXN1bHQ9ZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMoXG5lbmNvZGluZyxcbmRlY29kZUZyb21TbWFsbGNhcHMpO1xuXG5pZihwYXNzU3R5bGVPZihyZXN1bHQpIT09J3Byb21pc2UnKXtcbkZhaWwgYGludGVybmFsOiBkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyBvcHRpb24gbXVzdCByZXR1cm4gYSBwcm9taXNlOiAke3Jlc3VsdH1gO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGBTcGVjaWFsIGNoYXIgJHtxKFxuYylcbiB9IHJlc2VydmVkIGZvciBmdXR1cmUgdXNlOiAke2VuY29kaW5nfWA7XG4gfX1cblxuIH1cbmNhc2Unb2JqZWN0Jzp7XG5pZihlbmNvZGluZz09PW51bGwpe1xucmV0dXJuIGVuY29kaW5nO1xuIH1cblxuaWYoaXNBcnJheShlbmNvZGluZykpe1xucmV0dXJuIGVuY29kaW5nLm1hcCgodmFsKT0+ZGVjb2RlRnJvbVNtYWxsY2Fwcyh2YWwpKTtcbiB9XG5cbmlmKGhhc093blByb3BlcnR5T2YoZW5jb2RpbmcsJyN0YWcnKSl7XG5jb25zdHsnI3RhZyc6dGFnLHBheWxvYWQsLi4ucmVzdH09ZW5jb2Rpbmc7XG50eXBlb2YgdGFnPT09J3N0cmluZyd8fFxuRmFpbCBgVmFsdWUgb2YgXCIjdGFnXCIsIHRoZSB0YWcsIG11c3QgYmUgYSBzdHJpbmc6ICR7ZW5jb2Rpbmd9YDtcbm93bktleXMocmVzdCkubGVuZ3RoPT09MHx8XG5GYWlsIGAjdGFnIHJlY29yZCB1bmV4cGVjdGVkIHByb3BlcnRpZXM6ICR7cShvd25LZXlzKHJlc3QpKX1gO1xucmV0dXJuIG1ha2VUYWdnZWQoXG5kZWNvZGVGcm9tU21hbGxjYXBzKHRhZyksXG5kZWNvZGVGcm9tU21hbGxjYXBzKHBheWxvYWQpKTtcblxuIH1cblxuaWYoaGFzT3duUHJvcGVydHlPZihlbmNvZGluZywnI2Vycm9yJykpe1xuY29uc3QgcmVzdWx0PWRlY29kZUVycm9yRnJvbVNtYWxsY2FwcyhcbmVuY29kaW5nLFxuZGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG5cbnBhc3NTdHlsZU9mKHJlc3VsdCk9PT0nZXJyb3InfHxcbkZhaWwgYGludGVybmFsOiBkZWNvZGVFcnJvckZyb21TbWFsbGNhcHMgb3B0aW9uIG11c3QgcmV0dXJuIGFuIGVycm9yOiAke3Jlc3VsdH1gO1xucmV0dXJuIHJlc3VsdDtcbiB9XG5cbmNvbnN0IGRlY29kZUVudHJ5PShbZW5jb2RlZE5hbWUsZW5jb2RlZFZhbF0pPT57XG50eXBlb2YgZW5jb2RlZE5hbWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBQcm9wZXJ0eSBuYW1lICR7cShcbmVuY29kZWROYW1lKVxuIH0gb2YgJHtlbmNvZGluZ30gbXVzdCBiZSBhIHN0cmluZ2A7XG4hZW5jb2RlZE5hbWUuc3RhcnRzV2l0aCgnIycpfHxcbkZhaWwgYFVucmVjb2duaXplZCByZWNvcmQgdHlwZSAke3EoZW5jb2RlZE5hbWUpfTogJHtlbmNvZGluZ31gO1xuY29uc3QgbmFtZT1kZWNvZGVGcm9tU21hbGxjYXBzKGVuY29kZWROYW1lKTtcbnR5cGVvZiBuYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgRGVjb2RlZCBwcm9wZXJ0eSBuYW1lICR7bmFtZX0gZnJvbSAke2VuY29kaW5nfSBtdXN0IGJlIGEgc3RyaW5nYDtcbnJldHVybltuYW1lLGRlY29kZUZyb21TbWFsbGNhcHMoZW5jb2RlZFZhbCldO1xuIH07XG5jb25zdCBkZWNvZGVkRW50cmllcz1lbnRyaWVzKGVuY29kaW5nKS5tYXAoZGVjb2RlRW50cnkpO1xucmV0dXJuIGZyb21FbnRyaWVzKGRlY29kZWRFbnRyaWVzKTtcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFxuWCBgaW50ZXJuYWw6IHVucmVjb2duaXplZCBKU09OIHR5cGVvZiAke3EoXG50eXBlb2YgZW5jb2RpbmcpXG4gfTogJHtlbmNvZGluZ31gLFxuVHlwZUVycm9yKTtcblxuIH19XG5cbiB9O1xucmV0dXJuIGhhcmRlbihkZWNvZGVGcm9tU21hbGxjYXBzKTtcbiB9OyRo4oCNX29uY2UubWFrZURlY29kZUZyb21TbWFsbGNhcHMobWFrZURlY29kZUZyb21TbWFsbGNhcHMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VFbmNvZGVUb1NtYWxsY2FwcyI6WyJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiXSwibWFrZURlY29kZUZyb21TbWFsbGNhcHMiOlsibWFrZURlY29kZUZyb21TbWFsbGNhcHMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAApsoXZOgGAADoBgAALQAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL2NvcHlBcnJheS5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiQ29weUFycmF5SGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsY2hlY2tOb3JtYWxQcm9wZXJ0eTskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJjaGVja05vcm1hbFByb3BlcnR5XCIsIFskaOKAjV9hID0+IChjaGVja05vcm1hbFByb3BlcnR5ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5jb25zdHtnZXRQcm90b3R5cGVPZn09T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXkscHJvdG90eXBlOmFycmF5UHJvdG90eXBlfT1BcnJheTtcblxuLyoqXG4gKlxuICogQHR5cGUge1hpbXBvcnQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBDb3B5QXJyYXlIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZTonY29weUFycmF5JyxcblxuY2FuQmVWYWxpZDooY2FuZGlkYXRlLGNoZWNrKT0+XG5pc0FycmF5KGNhbmRpZGF0ZSl8fFxuISFjaGVjayYmY2hlY2soZmFsc2UsWCBgQXJyYXkgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApLFxuXG5hc3NlcnRWYWxpZDooY2FuZGlkYXRlLHBhc3NTdHlsZU9mUmVjdXIpPT57XG5Db3B5QXJyYXlIZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlcik7XG5nZXRQcm90b3R5cGVPZihjYW5kaWRhdGUpPT09YXJyYXlQcm90b3R5cGV8fFxuYXNzZXJ0LmZhaWwoWCBgTWFsZm9ybWVkIGFycmF5OiAke2NhbmRpZGF0ZX1gLFR5cGVFcnJvcik7XG4vKiBTaW5jZSB3ZSdyZSBhbHJlYWR5IGVuc3VyZWQgY2FuZGlkYXRlIGlzIGFuIGFycmF5LCBpdCBzaG91bGQgbm90IGJlKi9cbi8qIHBvc3NpYmxlIGZvciB0aGUgZm9sbG93aW5nIHRlc3QgdG8gZmFpbCovXG5jaGVja05vcm1hbFByb3BlcnR5KGNhbmRpZGF0ZSwnbGVuZ3RoJyxmYWxzZSxhc3NlcnRDaGVja2VyKTtcbmNvbnN0IGxlbj1jYW5kaWRhdGUubGVuZ3RoO1xuZm9yKGxldCBpPTA7aTxsZW47aSs9MSl7XG5jaGVja05vcm1hbFByb3BlcnR5KGNhbmRpZGF0ZSxpLHRydWUsYXNzZXJ0Q2hlY2tlcik7XG4gfVxuLyogKzEgZm9yIHRoZSAnbGVuZ3RoJyBwcm9wZXJ0eSBpdHNlbGYuKi9cbm93bktleXMoY2FuZGlkYXRlKS5sZW5ndGg9PT1sZW4rMXx8XG5hc3NlcnQuZmFpbChYIGBBcnJheXMgbXVzdCBub3QgaGF2ZSBub24taW5kZXhlczogJHtjYW5kaWRhdGV9YCxUeXBlRXJyb3IpO1xuLyogUmVjdXJzaXZlbHkgdmFsaWRhdGUgdGhhdCBlYWNoIG1lbWJlciBpcyBwYXNzYWJsZS4qL1xuY2FuZGlkYXRlLmV2ZXJ5KCh2KT0+ISFwYXNzU3R5bGVPZlJlY3VyKHYpKTtcbiB9fSk7JGjigI1fb25jZS5Db3B5QXJyYXlIZWxwZXIoQ29weUFycmF5SGVscGVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJDb3B5QXJyYXlIZWxwZXIiOlsiQ29weUFycmF5SGVscGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJOHBWHTBwAA0wcAAC4AAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9jb3B5UmVjb3JkLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJDb3B5UmVjb3JkSGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsY2FuQmVNZXRob2QsY2hlY2tOb3JtYWxQcm9wZXJ0eTskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJjYW5CZU1ldGhvZFwiLCBbJGjigI1fYSA9PiAoY2FuQmVNZXRob2QgPSAkaOKAjV9hKV1dLFtcImNoZWNrTm9ybWFsUHJvcGVydHlcIiwgWyRo4oCNX2EgPT4gKGNoZWNrTm9ybWFsUHJvcGVydHkgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2dldFByb3RvdHlwZU9mLHZhbHVlcyxwcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlfT1PYmplY3Q7XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtYaW1wb3J0KCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgQ29weVJlY29yZEhlbHBlcj1oYXJkZW4oe1xuc3R5bGVOYW1lOidjb3B5UmVjb3JkJyxcblxuY2FuQmVWYWxpZDooY2FuZGlkYXRlLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmlmKGdldFByb3RvdHlwZU9mKGNhbmRpZGF0ZSkhPT1vYmplY3RQcm90b3R5cGUpe1xucmV0dXJuKFxucmVqZWN0JiZcbnJlamVjdChYIGBSZWNvcmRzIG11c3QgaW5oZXJpdCBmcm9tIE9iamVjdC5wcm90b3R5cGU6ICR7Y2FuZGlkYXRlfWApKTtcblxuIH1cblxuZm9yKGNvbnN0IGtleSBvZiBvd25LZXlzKGNhbmRpZGF0ZSkpe1xuY29uc3QgdmFsaWQ9XG4odHlwZW9mIGtleT09PSdzdHJpbmcnfHxcbiEhcmVqZWN0JiZcbnJlamVjdChcblggYFJlY29yZHMgY2FuIG9ubHkgaGF2ZSBzdHJpbmctbmFtZWQgcHJvcGVydGllczogJHtjYW5kaWRhdGV9YCkpJiYoXG5cbiFjYW5CZU1ldGhvZChjYW5kaWRhdGVba2V5XSl8fFxuISFyZWplY3QmJlxucmVqZWN0KFxuLyogVE9ETzogVXBkYXRlIG1lc3NhZ2Ugbm93IHRoYXQgdGhlcmUgaXMgbm8gc3VjaCB0aGluZyBhcyBcImltcGxpY2l0IFJlbW90YWJsZVwiLiovXG5YIGBSZWNvcmRzIGNhbm5vdCBjb250YWluIG5vbi1mYXIgZnVuY3Rpb25zIGJlY2F1c2UgdGhleSBtYXkgYmUgbWV0aG9kcyBvZiBhbiBpbXBsaWNpdCBSZW1vdGFibGU6ICR7Y2FuZGlkYXRlfWApKTtcblxuaWYoIXZhbGlkKXtcbnJldHVybiBmYWxzZTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfSxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSxwYXNzU3R5bGVPZlJlY3VyKT0+e1xuQ29weVJlY29yZEhlbHBlci5jYW5CZVZhbGlkKGNhbmRpZGF0ZSxhc3NlcnRDaGVja2VyKTtcbmZvcihjb25zdCBuYW1lIG9mIG93bktleXMoY2FuZGlkYXRlKSl7XG5jaGVja05vcm1hbFByb3BlcnR5KGNhbmRpZGF0ZSxuYW1lLHRydWUsYXNzZXJ0Q2hlY2tlcik7XG4gfVxuLyogUmVjdXJzaXZlbHkgdmFsaWRhdGUgdGhhdCBlYWNoIG1lbWJlciBpcyBwYXNzYWJsZS4qL1xudmFsdWVzKGNhbmRpZGF0ZSkuZXZlcnkoKHYpPT4hIXBhc3NTdHlsZU9mUmVjdXIodikpO1xuIH19KTskaOKAjV9vbmNlLkNvcHlSZWNvcmRIZWxwZXIoQ29weVJlY29yZEhlbHBlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ29weVJlY29yZEhlbHBlciI6WyJDb3B5UmVjb3JkSGVscGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAyZpNpgEQAAYBEAACkAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9lcnJvci5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiRXJyb3JIZWxwZXIiLCJnZXRFcnJvckNvbnN0cnVjdG9yIiwidG9QYXNzYWJsZUVycm9yIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXI7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn0gUGFzc1N0eWxlSGVscGVyICovXG5cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuY29uc3R7Z2V0UHJvdG90eXBlT2YsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yc309T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyogVE9ETzogTWFpbnRlbmFuY2UgaGF6YXJkOiBDb29yZGluYXRlIHdpdGggdGhlIGxpc3Qgb2YgZXJyb3JzIGluIHRoZSBTRVMqL1xuLyogd2hpbGVsaXN0LiBDdXJyZW50bHksIGJvdGggb21pdCBBZ2dyZWdhdGVFcnJvciwgd2hpY2ggaXMgbm93IHN0YW5kYXJkLiBCb3RoKi9cbi8qIG11c3QgZXZlbnR1YWxseSBpbmNsdWRlIGl0LiovXG5jb25zdCBlcnJvckNvbnN0cnVjdG9ycz1uZXcgTWFwKFtcblsnRXJyb3InLEVycm9yXSxcblsnRXZhbEVycm9yJyxFdmFsRXJyb3JdLFxuWydSYW5nZUVycm9yJyxSYW5nZUVycm9yXSxcblsnUmVmZXJlbmNlRXJyb3InLFJlZmVyZW5jZUVycm9yXSxcblsnU3ludGF4RXJyb3InLFN5bnRheEVycm9yXSxcblsnVHlwZUVycm9yJyxUeXBlRXJyb3JdLFxuWydVUklFcnJvcicsVVJJRXJyb3JdXSk7XG5cblxuY29uc3QgICAgICAgIGdldEVycm9yQ29uc3RydWN0b3I9KG5hbWUpPT5lcnJvckNvbnN0cnVjdG9ycy5nZXQobmFtZSk7JGjigI1fb25jZS5nZXRFcnJvckNvbnN0cnVjdG9yKGdldEVycm9yQ29uc3RydWN0b3IpO1xuaGFyZGVuKGdldEVycm9yQ29uc3RydWN0b3IpO1xuXG4vKipcbiAqIFZhbGlkYXRpbmcgZXJyb3Igb2JqZWN0cyBhcmUgcGFzc2FibGUgcmFpc2VzIGEgdGVuc2lvbiBiZXR3ZWVuIHNlY3VyaXR5XG4gKiB2cyBwcmVzZXJ2aW5nIGRpYWdub3N0aWMgaW5mb3JtYXRpb24uIEZvciBlcnJvcnMsIHdlIG5lZWQgdG8gcmVtZW1iZXJcbiAqIHRoZSBlcnJvciBpdHNlbGYgZXhpc3RzIHRvIGhlbHAgdXMgZGlhZ25vc2UgYSBidWcgdGhhdCdzIGxpa2VseSBtb3JlXG4gKiBwcmVzc2luZyB0aGFuIGEgdmFsaWRpdHkgYnVnIGluIHRoZSBlcnJvciBpdHNlbGYuIFRodXMsIHdoZW5ldmVyIGl0IGlzIHNhZmVcbiAqIHRvIGRvIHNvLCB3ZSBwcmVmZXIgdG8gbGV0IHRoZSBlcnJvciB0ZXN0IHN1Y2NlZWQgYW5kIHRvIGNvdWNoIHRoZXNlXG4gKiBjb21wbGFpbnRzIGFzIG5vdGVzIG9uIHRoZSBlcnJvci5cbiAqXG4gKiBUbyByZXNvbHZlIHRoaXMsIHN1Y2ggYSBtYWxmb3JtZWQgZXJyb3Igb2JqZWN0IHdpbGwgc3RpbGwgcGFzc1xuICogYGNhbkJlVmFsaWRgIHNvIG1hcnNoYWwgY2FuIHVzZSB0aGlzIGZvciB0b3AgbGV2ZWwgZXJyb3IgdG8gcmVwb3J0IGZyb20sXG4gKiBldmVuIGlmIGl0IHdvdWxkIG5vdCBhY3R1YWxseSB2YWxpZGF0ZS5cbiAqIEluc3RlYWQsIHRoZSBkaWFnbm9zdGljcyB0aGF0IGBhc3NlcnRFcnJvcmAgd291bGQgaGF2ZSByZXBvcnRlZCBhcmVcbiAqIGF0dGFjaGVkIGFzIG5vdGVzIHRvIHRoZSBtYWxmb3JtZWQgZXJyb3IuIFRodXMsIGEgbWFsZm9ybWVkXG4gKiBlcnJvciBpcyBwYXNzYWJsZSBieSBpdHNlbGYsIGJ1dCBub3QgYXMgcGFydCBvZiBhIHBhc3NhYmxlIHN0cnVjdHVyZS5cbiAqXG4gKiBAdHlwZSB7UGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgRXJyb3JIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZTonZXJyb3InLFxuXG5jYW5CZVZhbGlkOihjYW5kaWRhdGUsY2hlY2spPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuLyogVE9ETzogTmVlZCBhIGJldHRlciB0ZXN0IHRoYW4gaW5zdGFuY2VvZiovXG5pZighKGNhbmRpZGF0ZSBpbnN0YW5jZW9mIEVycm9yKSl7XG5yZXR1cm4gcmVqZWN0JiZyZWplY3QoWCBgRXJyb3IgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApO1xuIH1cbmNvbnN0IHByb3RvPWdldFByb3RvdHlwZU9mKGNhbmRpZGF0ZSk7XG5jb25zdHtuYW1lfT1wcm90bztcbmNvbnN0IEVDPWdldEVycm9yQ29uc3RydWN0b3IobmFtZSk7XG5pZighRUN8fEVDLnByb3RvdHlwZSE9PXByb3RvKXtcbmNvbnN0IG5vdGU9WCBgRXJyb3JzIG11c3QgaW5oZXJpdCBmcm9tIGFuIGVycm9yIGNsYXNzIC5wcm90b3R5cGUgJHtjYW5kaWRhdGV9YDtcbi8qIE9ubHkgdGVybWluYXRlIGlmIGNoZWNrIHRocm93cyovXG5yZWplY3QmJnJlamVjdChub3RlKTtcbmFzc2VydC5ub3RlKGNhbmRpZGF0ZSxub3RlKTtcbiB9XG5cbmNvbnN0e1xuLyogTXVzdCBhbGxvdyBgY2F1c2VgLCBgZXJyb3JzYCovXG5tZXNzYWdlOm1EZXNjLFxuLyogQWxsb3cgYnV0IGlnbm9yZSBvbmx5IGV4dHJhbmVvdXMgb3duIGBzdGFja2AgcHJvcGVydHkuKi9cbnN0YWNrOl9vcHRTdGFja0Rlc2MsXG4uLi5yZXN0RGVzY3N9PVxuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xuaWYob3duS2V5cyhyZXN0RGVzY3MpLmxlbmd0aD49MSl7XG5jb25zdCBub3RlPVggYFBhc3NlZCBFcnJvciBoYXMgZXh0cmEgdW5wYXNzZWQgcHJvcGVydGllcyAke3Jlc3REZXNjc31gO1xuLyogT25seSB0ZXJtaW5hdGUgaWYgY2hlY2sgdGhyb3dzKi9cbnJlamVjdCYmcmVqZWN0KG5vdGUpO1xuYXNzZXJ0Lm5vdGUoY2FuZGlkYXRlLG5vdGUpO1xuIH1cbmlmKG1EZXNjKXtcbmlmKHR5cGVvZiBtRGVzYy52YWx1ZSE9PSdzdHJpbmcnKXtcbmNvbnN0IG5vdGU9WCBgUGFzc2VkIEVycm9yIFwibWVzc2FnZVwiICR7bURlc2N9IG11c3QgYmUgYSBzdHJpbmctdmFsdWVkIGRhdGEgcHJvcGVydHkuYDtcbi8qIE9ubHkgdGVybWluYXRlIGlmIGNoZWNrIHRocm93cyovXG5yZWplY3QmJnJlamVjdChub3RlKTtcbmFzc2VydC5ub3RlKGNhbmRpZGF0ZSxub3RlKTtcbiB9XG5pZihtRGVzYy5lbnVtZXJhYmxlKXtcbmNvbnN0IG5vdGU9WCBgUGFzc2VkIEVycm9yIFwibWVzc2FnZVwiICR7bURlc2N9IG11c3Qgbm90IGJlIGVudW1lcmFibGVgO1xuLyogT25seSB0ZXJtaW5hdGUgaWYgY2hlY2sgdGhyb3dzKi9cbnJlamVjdCYmcmVqZWN0KG5vdGUpO1xuYXNzZXJ0Lm5vdGUoY2FuZGlkYXRlLG5vdGUpO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9LFxuXG5hc3NlcnRWYWxpZDooY2FuZGlkYXRlKT0+e1xuRXJyb3JIZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlcik7XG4gfX0pO1xuXG5cbi8qKlxuICogUmV0dXJuIGEgbmV3IHBhc3NhYmxlIGVycm9yIHRoYXQgcHJvcGFnYXRlcyB0aGUgZGlhZ25vc3RpYyBpbmZvIG9mIHRoZVxuICogb3JpZ2luYWwsIGFuZCBpcyBsaW5rZWQgdG8gdGhlIG9yaWdpbmFsIGFzIGEgbm90ZS5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEByZXR1cm5zIHtFcnJvcn1cbiAqLyRo4oCNX29uY2UuRXJyb3JIZWxwZXIoRXJyb3JIZWxwZXIpO1xuY29uc3QgICAgICAgIHRvUGFzc2FibGVFcnJvcj0oZXJyKT0+e1xuY29uc3R7bmFtZSxtZXNzYWdlfT1lcnI7XG5cbmNvbnN0IEVDPWdldEVycm9yQ29uc3RydWN0b3IoIGAke25hbWV9YCl8fEVycm9yO1xuY29uc3QgbmV3RXJyb3I9aGFyZGVuKG5ldyBFQyggYCR7bWVzc2FnZX1gKSk7XG4vKiBFdmVuIHRoZSBjbGVhbmVkIHVwIGVycm9yIGNvcHksIGlmIHNlbnQgdG8gdGhlIGNvbnNvbGUsIHNob3VsZCovXG4vKiBjYXVzZSBoaWRkZW4gZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiBvZiB0aGUgb3JpZ2luYWwgZXJyb3IqL1xuLyogdG8gYmUgbG9nZ2VkLiovXG5hc3NlcnQubm90ZShuZXdFcnJvcixYIGBjb3BpZWQgZnJvbSBlcnJvciAke2Vycn1gKTtcbnJldHVybiBuZXdFcnJvcjtcbiB9OyRo4oCNX29uY2UudG9QYXNzYWJsZUVycm9yKHRvUGFzc2FibGVFcnJvcik7XG5oYXJkZW4odG9QYXNzYWJsZUVycm9yKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRFcnJvckNvbnN0cnVjdG9yIjpbImdldEVycm9yQ29uc3RydWN0b3IiXSwiRXJyb3JIZWxwZXIiOlsiRXJyb3JIZWxwZXIiXSwidG9QYXNzYWJsZUVycm9yIjpbInRvUGFzc2FibGVFcnJvciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADRMbrZRggAAEYIAAAwAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvaXRlci1oZWxwZXJzLmpzeyJpbXBvcnRzIjpbIi4uL21ha2UtZmFyLmpzIl0sImV4cG9ydHMiOlsiZmlsdGVySXRlcmFibGUiLCJtYXBJdGVyYWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXI7JGjigI1faW1wb3J0cyhbW1wiLi4vbWFrZS1mYXIuanNcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG4vKipcbiAqIFRoZSByZXN1bHQgaXRlcmF0b3IgaGFzIGFzIG1hbnkgZWxlbWVudHMgYXMgdGhlIGBiYXNlSXRlcmF0b3JgIGFuZFxuICogaGF2ZSB0aGUgc2FtZSB0ZXJtaW5hdGlvbiAtLSB0aGUgc2FtZSBjb21wbGV0aW9uIHZhbHVlIG9yIGZhaWx1cmVcbiAqIHJlYXNvbi4gQnV0IHRoZSBub24tZmluYWwgdmFsdWVzIGFyZSB0aGUgY29ycmVzcG9uZGluZyBub24tZmluYWxcbiAqIHZhbHVlcyBmcm9tIGBiYXNlSXRlcmF0b3JgIGFzIHRyYW5zZm9ybWVkIGJ5IGBmdW5jYC5cbiAqXG4gKiBAdGVtcGxhdGUgVCxVXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFQ+fSBiYXNlSXRlcmFibGVcbiAqIEBwYXJhbSB7KHZhbHVlOiBUKSA9PiBVfSBmdW5jXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8VT59XG4gKi9cbmNvbnN0ICAgICAgICBtYXBJdGVyYWJsZT0oYmFzZUl0ZXJhYmxlLGZ1bmMpPT5cbi8qKiBAdHlwZSB7SXRlcmFibGU8VT59ICovXG5GYXIoJ21hcHBlZCBpdGVyYWJsZScse1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PntcbmNvbnN0IGJhc2VJdGVyYXRvcj1iYXNlSXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSgpO1xucmV0dXJuIEZhcignbWFwcGVkIGl0ZXJhdG9yJyx7XG5uZXh0OigpPT57XG5jb25zdHt2YWx1ZTpiYXNlVmFsdWUsZG9uZX09YmFzZUl0ZXJhdG9yLm5leHQoKTtcbmNvbnN0IHZhbHVlPWRvbmU/YmFzZVZhbHVlOmZ1bmMoYmFzZVZhbHVlKTtcbnJldHVybiBoYXJkZW4oe3ZhbHVlLGRvbmV9KTtcbiB9fSk7XG5cbiB9fSk7JGjigI1fb25jZS5tYXBJdGVyYWJsZShtYXBJdGVyYWJsZSk7XG5cbmhhcmRlbihtYXBJdGVyYWJsZSk7XG5cbi8qKlxuICogVGhlIHJlc3VsdCBpdGVyYXRvciBoYXMgYSBzdWJzZXQgb2YgdGhlIG5vbi1maW5hbCB2YWx1ZXMgZnJvbSB0aGVcbiAqIGBiYXNlSXRlcmF0b3JgIC0tLSB0aG9zZSBmb3Igd2hpY2ggYHByZWQodmFsdWUpYCB3YXMgdHJ1dGh5LiBUaGUgcmVzdWx0XG4gKiBoYXMgdGhlIHNhbWUgdGVybWluYXRpb24gYXMgdGhlIGBiYXNlSXRlcmF0b3JgIC0tIHRoZSBzYW1lIGNvbXBsZXRpb24gdmFsdWVcbiAqIG9yIGZhaWx1cmUgcmVhc29uLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFQ+fSBiYXNlSXRlcmFibGVcbiAqIEBwYXJhbSB7KHZhbHVlOiBUKSA9PiBib29sZWFufSBwcmVkXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8VD59XG4gKi9cbmNvbnN0ICAgICAgICBmaWx0ZXJJdGVyYWJsZT0oYmFzZUl0ZXJhYmxlLHByZWQpPT5cbi8qKiBAdHlwZSB7SXRlcmFibGU8VT59ICovXG5GYXIoJ2ZpbHRlcmVkIGl0ZXJhYmxlJyx7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+e1xuY29uc3QgYmFzZUl0ZXJhdG9yPWJhc2VJdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKCk7XG5yZXR1cm4gRmFyKCdmaWx0ZXJlZCBpdGVyYXRvcicse1xubmV4dDooKT0+e1xuZm9yKDs7KXtcbmNvbnN0IHJlc3VsdD1iYXNlSXRlcmF0b3IubmV4dCgpO1xuY29uc3R7dmFsdWUsZG9uZX09cmVzdWx0O1xuaWYoZG9uZXx8cHJlZCh2YWx1ZSkpe1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfVxuIH19KTtcblxuIH19KTskaOKAjV9vbmNlLmZpbHRlckl0ZXJhYmxlKGZpbHRlckl0ZXJhYmxlKTtcblxuaGFyZGVuKGZpbHRlckl0ZXJhYmxlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYXBJdGVyYWJsZSI6WyJtYXBJdGVyYWJsZSJdLCJmaWx0ZXJJdGVyYWJsZSI6WyJmaWx0ZXJJdGVyYWJsZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAMAuon9BkAAPQZAAA1AAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIlBBU1NfU1RZTEUiLCJhc3NlcnRDaGVja2VyIiwiY2FuQmVNZXRob2QiLCJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIiwiY2hlY2tOb3JtYWxQcm9wZXJ0eSIsImNoZWNrUGFzc1N0eWxlIiwiY2hlY2tUYWdSZWNvcmQiLCJnZXRUYWciLCJoYXNPd25Qcm9wZXJ0eU9mIiwiaXNPYmplY3QiLCJpc1R5cGVkQXJyYXkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzLmpzJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcy5qcycpLlBhc3NTdHlsZX0gUGFzc1N0eWxlICovXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e3Byb3RvdHlwZTpmdW5jdGlvblByb3RvdHlwZX09RnVuY3Rpb247XG5jb25zdHtcbmdldE93blByb3BlcnR5RGVzY3JpcHRvcixcbmdldFByb3RvdHlwZU9mLFxuaGFzT3duUHJvcGVydHk6b2JqZWN0SGFzT3duUHJvcGVydHksXG5pc0Zyb3plbixcbnByb3RvdHlwZTpvYmplY3RQcm90b3R5cGV9PVxuT2JqZWN0O1xuY29uc3R7YXBwbHl9PVJlZmxlY3Q7XG5jb25zdHt0b1N0cmluZ1RhZzp0b1N0cmluZ1RhZ1N5bWJvbH09U3ltYm9sO1xuXG5jb25zdCB0eXBlZEFycmF5UHJvdG90eXBlPWdldFByb3RvdHlwZU9mKFVpbnQ4QXJyYXkucHJvdG90eXBlKTtcbmNvbnN0IHR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxudHlwZWRBcnJheVByb3RvdHlwZSxcbnRvU3RyaW5nVGFnU3ltYm9sKTtcblxuYXNzZXJ0KHR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2MpO1xuY29uc3QgZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnPXR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2MuZ2V0O1xuYXNzZXJ0KHR5cGVvZiBnZXRUeXBlZEFycmF5VG9TdHJpbmdUYWc9PT0nZnVuY3Rpb24nKTtcblxuY29uc3QgICAgICAgIGhhc093blByb3BlcnR5T2Y9KG9iaixwcm9wKT0+XG5hcHBseShvYmplY3RIYXNPd25Qcm9wZXJ0eSxvYmosW3Byb3BdKTskaOKAjV9vbmNlLmhhc093blByb3BlcnR5T2YoaGFzT3duUHJvcGVydHlPZik7XG5oYXJkZW4oaGFzT3duUHJvcGVydHlPZik7XG5cbmNvbnN0ICAgICAgICBpc09iamVjdD0odmFsKT0+T2JqZWN0KHZhbCk9PT12YWw7JGjigI1fb25jZS5pc09iamVjdChpc09iamVjdCk7XG5oYXJkZW4oaXNPYmplY3QpO1xuXG4vKipcbiAqIER1cGxpY2F0ZXMgcGFja2FnZXMvc2VzL3NyYy9tYWtlLWhhcmRlbmVyLmpzIHRvIGF2b2lkIGEgZGVwZW5kZW5jeS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IG9iamVjdFxuICovXG5jb25zdCAgICAgICAgaXNUeXBlZEFycmF5PShvYmplY3QpPT57XG4vKiBUaGUgb2JqZWN0IG11c3QgcGFzcyBhIGJyYW5kIGNoZWNrIG9yIHRvU3RyaW5nVGFnIHdpbGwgcmV0dXJuIHVuZGVmaW5lZC4qL1xuY29uc3QgdGFnPWFwcGx5KGdldFR5cGVkQXJyYXlUb1N0cmluZ1RhZyxvYmplY3QsW10pO1xucmV0dXJuIHRhZyE9PXVuZGVmaW5lZDtcbiB9OyRo4oCNX29uY2UuaXNUeXBlZEFycmF5KGlzVHlwZWRBcnJheSk7XG5oYXJkZW4oaXNUeXBlZEFycmF5KTtcblxuY29uc3QgICAgICAgIFBBU1NfU1RZTEU9U3ltYm9sLmZvcigncGFzc1N0eWxlJyk7XG5cbi8qKlxuICogRm9yIGEgZnVuY3Rpb24gdG8gYmUgYSB2YWxpZCBtZXRob2QsIGl0IG11c3Qgbm90IGJlIHBhc3NhYmxlLlxuICogT3RoZXJ3aXNlLCB3ZSByaXNrIGNvbmZ1c2luZyBwYXNzLWJ5LWNvcHkgZGF0YSBjYXJyeWluZ1xuICogZmFyIGZ1bmN0aW9ucyB3aXRoIGF0dGVtcHRzIGF0IGZhciBvYmplY3RzIHdpdGggbWV0aG9kcy5cbiAqXG4gKiBUT0RPIEhBWkFSRCBCZWNhdXNlIHdlIGNoZWNrIHRoaXMgb24gdGhlIHdheSB0byBoYXJkZW5pbmcgYSByZW1vdGFibGUsXG4gKiB3ZSBjYW5ub3QgeWV0IGNoZWNrIHRoYXQgYGZ1bmNgIGlzIGhhcmRlbmVkLiBIb3dldmVyLCB3aXRob3V0XG4gKiBkb2luZyBzbywgaXQncyBpbmhlcml0YW5jZSBtaWdodCBjaGFuZ2UgYWZ0ZXIgdGhlIGBQQVNTX1NUWUxFYFxuICogY2hlY2sgYmVsb3cuXG4gKlxuICogQHBhcmFtIHthbnl9IGZ1bmNcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjigI1fb25jZS5QQVNTX1NUWUxFKFBBU1NfU1RZTEUpO1xuY29uc3QgICAgICAgIGNhbkJlTWV0aG9kPShmdW5jKT0+XG50eXBlb2YgZnVuYz09PSdmdW5jdGlvbicmJiEoUEFTU19TVFlMRSBpbiBmdW5jKTskaOKAjV9vbmNlLmNhbkJlTWV0aG9kKGNhbkJlTWV0aG9kKTtcbmhhcmRlbihjYW5CZU1ldGhvZCk7XG5cbi8qKlxuICogQmVsb3cgd2UgaGF2ZSBhIHNlcmllcyBvZiBwcmVkaWNhdGUgZnVuY3Rpb25zIGFuZCB0aGVpciAoY3VycmllZCkgYXNzZXJ0aW9uXG4gKiBmdW5jdGlvbnMuIFRoZSBzZW1hbnRpY3Mgb2YgdGhlIGFzc2VydGlvbiBmdW5jdGlvbiBpcyBqdXN0IHRvIGFzc2VydCB0aGF0XG4gKiB0aGUgY29ycmVzcG9uZGluZyBwcmVkaWNhdGUgZnVuY3Rpb24gd291bGQgaGF2ZSByZXR1cm5lZCB0cnVlLiBCdXQgaXRcbiAqIHJlcHJvZHVjZXMgdGhlIGludGVybmFsIHRlc3RzIHNvIGZhaWx1cmVzIGNhbiBnaXZlIGEgYmV0dGVyIGVycm9yIG1lc3NhZ2UuXG4gKlxuICogQHR5cGUge0NoZWNrZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRDaGVja2VyPShjb25kLGRldGFpbHMpPT57XG5hc3NlcnQoY29uZCxkZXRhaWxzKTtcbnJldHVybiB0cnVlO1xuIH07JGjigI1fb25jZS5hc3NlcnRDaGVja2VyKGFzc2VydENoZWNrZXIpO1xuaGFyZGVuKGFzc2VydENoZWNrZXIpO1xuXG4vKipcbiAqIENoZWNrcyBmb3IgdGhlIHByZXNlbmNlIGFuZCBlbnVtZXJhYmlsaXR5IG9mIGFuIG93biBkYXRhIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjYW5kaWRhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxzeW1ib2x9IHByb3BlcnR5TmFtZVxuICogQHBhcmFtIHtib29sZWFufSBzaG91bGRCZUVudW1lcmFibGVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBjaGVja05vcm1hbFByb3BlcnR5PShcbmNhbmRpZGF0ZSxcbnByb3BlcnR5TmFtZSxcbnNob3VsZEJlRW51bWVyYWJsZSxcbmNoZWNrKT0+XG57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuY29uc3QgZGVzYz1nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY2FuZGlkYXRlLHByb3BlcnR5TmFtZSk7XG5pZihkZXNjPT09dW5kZWZpbmVkKXtcbnJldHVybihcbnJlamVjdCYmcmVqZWN0KFggYCR7cShwcm9wZXJ0eU5hbWUpfSBwcm9wZXJ0eSBleHBlY3RlZDogJHtjYW5kaWRhdGV9YCkpO1xuXG4gfVxucmV0dXJuKFxuKGhhc093blByb3BlcnR5T2YoZGVzYywndmFsdWUnKXx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgJHtxKHByb3BlcnR5TmFtZSl9IG11c3Qgbm90IGJlIGFuIGFjY2Vzc29yIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gKSkmJihcblxuc2hvdWxkQmVFbnVtZXJhYmxlP1xuZGVzYy5lbnVtZXJhYmxlfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGAke3EocHJvcGVydHlOYW1lKX0gbXVzdCBiZSBhbiBlbnVtZXJhYmxlIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gKTpcblxuIWRlc2MuZW51bWVyYWJsZXx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgJHtxKFxucHJvcGVydHlOYW1lKVxuIH0gbXVzdCBub3QgYmUgYW4gZW51bWVyYWJsZSBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YCkpKTtcblxuXG4gfTskaOKAjV9vbmNlLmNoZWNrTm9ybWFsUHJvcGVydHkoY2hlY2tOb3JtYWxQcm9wZXJ0eSk7XG5oYXJkZW4oY2hlY2tOb3JtYWxQcm9wZXJ0eSk7XG5cbmNvbnN0ICAgICAgICBnZXRUYWc9KHRhZ1JlY29yZCk9PnRhZ1JlY29yZFtTeW1ib2wudG9TdHJpbmdUYWddOyRo4oCNX29uY2UuZ2V0VGFnKGdldFRhZyk7XG5oYXJkZW4oZ2V0VGFnKTtcblxuY29uc3QgICAgICAgIGNoZWNrUGFzc1N0eWxlPShvYmosZXhwZWN0ZWRQYXNzU3R5bGUsY2hlY2spPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuY29uc3QgYWN0dWFsPW9ialtQQVNTX1NUWUxFXTtcbnJldHVybihcbmFjdHVhbD09PWV4cGVjdGVkUGFzc1N0eWxlfHxcbnJlamVjdCYmXG5yZWplY3QoWCBgRXhwZWN0ZWQgJHtxKGV4cGVjdGVkUGFzc1N0eWxlKX0sIG5vdCAke3EoYWN0dWFsKX06ICR7b2JqfWApKTtcblxuIH07JGjigI1fb25jZS5jaGVja1Bhc3NTdHlsZShjaGVja1Bhc3NTdHlsZSk7XG5oYXJkZW4oY2hlY2tQYXNzU3R5bGUpO1xuXG5jb25zdCBtYWtlQ2hlY2tUYWdSZWNvcmQ9KGNoZWNrUHJvdG8pPT57XG4vKipcbiAqIEBwYXJhbSB7eyBbUEFTU19TVFlMRV06IHN0cmluZyB9fSB0YWdSZWNvcmRcbiAqIEBwYXJhbSB7UGFzc1N0eWxlfSBwYXNzU3R5bGVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrVGFnUmVjb3JkPSh0YWdSZWNvcmQscGFzc1N0eWxlLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbnJldHVybihcbihpc09iamVjdCh0YWdSZWNvcmQpfHxcbnJlamVjdCYmXG5yZWplY3QoWCBgQSBub24tb2JqZWN0IGNhbm5vdCBiZSBhIHRhZ1JlY29yZDogJHt0YWdSZWNvcmR9YCkpJiYoXG5pc0Zyb3plbih0YWdSZWNvcmQpfHxcbnJlamVjdCYmcmVqZWN0KFggYEEgdGFnUmVjb3JkIG11c3QgYmUgZnJvemVuOiAke3RhZ1JlY29yZH1gKSkmJihcbiFpc0FycmF5KHRhZ1JlY29yZCl8fFxucmVqZWN0JiZyZWplY3QoWCBgQW4gYXJyYXkgY2Fubm90IGJlIGEgdGFnUmVjb3JkOiAke3RhZ1JlY29yZH1gKSkmJlxuY2hlY2tOb3JtYWxQcm9wZXJ0eSh0YWdSZWNvcmQsUEFTU19TVFlMRSxmYWxzZSxjaGVjaykmJlxuY2hlY2tQYXNzU3R5bGUodGFnUmVjb3JkLHBhc3NTdHlsZSxjaGVjaykmJlxuY2hlY2tOb3JtYWxQcm9wZXJ0eSh0YWdSZWNvcmQsU3ltYm9sLnRvU3RyaW5nVGFnLGZhbHNlLGNoZWNrKSYmKFxudHlwZW9mIGdldFRhZyh0YWdSZWNvcmQpPT09J3N0cmluZyd8fFxucmVqZWN0JiZcbnJlamVjdChcblggYEEgW1N5bWJvbC50b1N0cmluZ1RhZ10tbmFtZWQgcHJvcGVydHkgbXVzdCBiZSBhIHN0cmluZzogJHt0YWdSZWNvcmR9YCkpJiZcblxuY2hlY2tQcm90byh0YWdSZWNvcmQsZ2V0UHJvdG90eXBlT2YodGFnUmVjb3JkKSxjaGVjaykpO1xuXG4gfTtcbnJldHVybiBoYXJkZW4oY2hlY2tUYWdSZWNvcmQpO1xuIH07XG5cbmNvbnN0ICAgICAgICBjaGVja1RhZ1JlY29yZD1tYWtlQ2hlY2tUYWdSZWNvcmQoXG4odmFsLHByb3RvLGNoZWNrKT0+XG5wcm90bz09PW9iamVjdFByb3RvdHlwZXx8XG4hIWNoZWNrJiZcbmNoZWNrKGZhbHNlLFggYEEgdGFnUmVjb3JkIG11c3QgaW5oZXJpdCBmcm9tIE9iamVjdC5wcm90b3R5cGU6ICR7dmFsfWApKTskaOKAjV9vbmNlLmNoZWNrVGFnUmVjb3JkKGNoZWNrVGFnUmVjb3JkKTtcblxuaGFyZGVuKGNoZWNrVGFnUmVjb3JkKTtcblxuY29uc3QgICAgICAgIGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQ9bWFrZUNoZWNrVGFnUmVjb3JkKFxuKHZhbCxwcm90byxjaGVjayk9PlxucHJvdG89PT1mdW5jdGlvblByb3RvdHlwZXx8XG5wcm90byE9PW51bGwmJmdldFByb3RvdHlwZU9mKHByb3RvKT09PWZ1bmN0aW9uUHJvdG90eXBlfHxcbiEhY2hlY2smJlxuY2hlY2soXG5mYWxzZSxcblggYEZvciBmdW5jdGlvbnMsIGEgdGFnUmVjb3JkIG11c3QgaW5oZXJpdCBmcm9tIEZ1bmN0aW9uLnByb3RvdHlwZTogJHt2YWx9YCkpOyRo4oCNX29uY2UuY2hlY2tGdW5jdGlvblRhZ1JlY29yZChjaGVja0Z1bmN0aW9uVGFnUmVjb3JkKTtcblxuXG5oYXJkZW4oY2hlY2tGdW5jdGlvblRhZ1JlY29yZCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaGFzT3duUHJvcGVydHlPZiI6WyJoYXNPd25Qcm9wZXJ0eU9mIl0sImlzT2JqZWN0IjpbImlzT2JqZWN0Il0sImlzVHlwZWRBcnJheSI6WyJpc1R5cGVkQXJyYXkiXSwiUEFTU19TVFlMRSI6WyJQQVNTX1NUWUxFIl0sImNhbkJlTWV0aG9kIjpbImNhbkJlTWV0aG9kIl0sImFzc2VydENoZWNrZXIiOlsiYXNzZXJ0Q2hlY2tlciJdLCJjaGVja05vcm1hbFByb3BlcnR5IjpbImNoZWNrTm9ybWFsUHJvcGVydHkiXSwiZ2V0VGFnIjpbImdldFRhZyJdLCJjaGVja1Bhc3NTdHlsZSI6WyJjaGVja1Bhc3NTdHlsZSJdLCJjaGVja1RhZ1JlY29yZCI6WyJjaGVja1RhZ1JlY29yZCJdLCJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIjpbImNoZWNrRnVuY3Rpb25UYWdSZWNvcmQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAABPJsPvYfAAD2HwAALQAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL3JlbW90YWJsZS5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiUmVtb3RhYmxlSGVscGVyIiwiYXNzZXJ0SWZhY2UiLCJnZXRJbnRlcmZhY2VPZiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLGNhbkJlTWV0aG9kLGhhc093blByb3BlcnR5T2YsUEFTU19TVFlMRSxjaGVja1RhZ1JlY29yZCxjaGVja0Z1bmN0aW9uVGFnUmVjb3JkLGlzT2JqZWN0LGdldFRhZzskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJjYW5CZU1ldGhvZFwiLCBbJGjigI1fYSA9PiAoY2FuQmVNZXRob2QgPSAkaOKAjV9hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dLFtcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2EgPT4gKFBBU1NfU1RZTEUgPSAkaOKAjV9hKV1dLFtcImNoZWNrVGFnUmVjb3JkXCIsIFskaOKAjV9hID0+IChjaGVja1RhZ1JlY29yZCA9ICRo4oCNX2EpXV0sW1wiY2hlY2tGdW5jdGlvblRhZ1JlY29yZFwiLCBbJGjigI1fYSA9PiAoY2hlY2tGdW5jdGlvblRhZ1JlY29yZCA9ICRo4oCNX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMuanMnKS5DaGVja2VyfSBDaGVja2VyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzLmpzJykuSW50ZXJmYWNlU3BlY30gSW50ZXJmYWNlU3BlYyAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcy5qcycpLk1hcnNoYWxHZXRJbnRlcmZhY2VPZn0gTWFyc2hhbEdldEludGVyZmFjZU9mICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9IFBhc3NTdHlsZUhlbHBlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcy5qcycpLlJlbW90YWJsZX0gUmVtb3RhYmxlICovXG5cbmNvbnN0e2RldGFpbHM6WCxGYWlsLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e1xuZ2V0UHJvdG90eXBlT2YsXG5pc0Zyb3plbixcbnByb3RvdHlwZTpvYmplY3RQcm90b3R5cGUsXG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzfT1cbk9iamVjdDtcblxuLyoqXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IGlmYWNlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqL1xuY29uc3QgY2hlY2tJZmFjZT0oaWZhY2UsY2hlY2spPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xucmV0dXJuKFxuLyogVE9ETyBvdGhlciBwb3NzaWJsZSBpZmFjZXMsIG9uY2Ugd2UgaGF2ZSB0aGlyZCBwYXJ0eSB2ZXJhY2l0eSovXG4odHlwZW9mIGlmYWNlPT09J3N0cmluZyd8fFxucmVqZWN0JiZcbnJlamVjdChcblggYEZvciBub3csIGludGVyZmFjZSAke2lmYWNlfSBtdXN0IGJlIGEgc3RyaW5nOyB1bmltcGxlbWVudGVkYCkpJiYoXG5cbmlmYWNlPT09J1JlbW90YWJsZSd8fFxuaWZhY2Uuc3RhcnRzV2l0aCgnQWxsZWdlZDogJyl8fFxucmVqZWN0JiZcbnJlamVjdChcblggYEZvciBub3csIGlmYWNlICR7cShcbmlmYWNlKVxuIH0gbXVzdCBiZSBcIlJlbW90YWJsZVwiIG9yIGJlZ2luIHdpdGggXCJBbGxlZ2VkOiBcIjsgdW5pbXBsZW1lbnRlZGApKSk7XG5cblxuIH07XG5cbi8qKlxuICogQW4gYGlmYWNlYCBtdXN0IGJlIHB1cmUuIFJpZ2h0IG5vdyBpdCBtdXN0IGJlIGEgc3RyaW5nLCB3aGljaCBpcyBwdXJlLlxuICogTGF0ZXIgd2UgZXhwZWN0IHRvIGluY2x1ZGUgc29tZSBvdGhlciB2YWx1ZXMgdGhhdCBxdWFsaWZ5IGFzIGBQdXJlRGF0YWAsXG4gKiB3aGljaCBpcyBhIHBhc3MtYnktY29weSBzdXBlcnN0cnVjdHVyZSBlbmRpbmcgb25seSBpbiBwcmltaXRpdmVzIG9yXG4gKiBlbXB0eSBwYXNzLWJ5LWNvcHkgY29tcG9zaXRlcy4gTm8gcmVtb3RhYmxlcywgcHJvbWlzZXMsIG9yIGVycm9ycy5cbiAqIFdlICphc3N1bWUqIGZvciBub3cgdGhhdCB0aGUgcGFzcy1ieS1jb3B5IHN1cGVyc3RydWN0dXJlIGNvbnRhaW5zIG5vXG4gKiBwcm94aWVzLlxuICpcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gaWZhY2VcbiAqL1xuY29uc3QgICAgICAgIGFzc2VydElmYWNlPShpZmFjZSk9PmNoZWNrSWZhY2UoaWZhY2UsYXNzZXJ0Q2hlY2tlcik7JGjigI1fb25jZS5hc3NlcnRJZmFjZShhc3NlcnRJZmFjZSk7XG5oYXJkZW4oYXNzZXJ0SWZhY2UpO1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0IHwgRnVuY3Rpb259IG9yaWdpbmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja1JlbW90YWJsZVByb3RvT2Y9KG9yaWdpbmFsLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmlzT2JqZWN0KG9yaWdpbmFsKXx8XG5GYWlsIGBSZW1vdGFibGVzIG11c3QgYmUgb2JqZWN0cyBvciBmdW5jdGlvbnM6ICR7b3JpZ2luYWx9YDtcblxuLyogQSB2YWxpZCByZW1vdGFibGUgb2JqZWN0IG11c3QgaW5oZXJpdCBmcm9tIGEgXCJ0YWcgcmVjb3JkXCIgLS0gYSovXG4vKiBwbGFpbi1vYmplY3QgcHJvdG90eXBlIGNvbnNpc3Rpbmcgb2Ygb25seSovXG4vKiBhIGBQQVNTX1NUWUxFYCBwcm9wZXJ0eSB3aXRoIHZhbHVlIFwicmVtb3RhYmxlXCIgYW5kIGEgc3VpdGFibGUgYFN5bWJvbC50b1N0cmluZ1RhZ2AqL1xuLyogcHJvcGVydHkuIFRoZSByZW1vdGFibGUgY291bGQgaW5oZXJpdCBkaXJlY3RseSBmcm9tIHN1Y2ggYSB0YWcgcmVjb3JkLCBvciovXG4vKiBpdCBjb3VsZCBpbmhlcml0IGZyb20gYW5vdGhlciB2YWxpZCByZW1vdGFibGUsIHRoYXQgdGhlcmVmb3JlIGl0c2VsZiovXG4vKiBpbmhlcml0cyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGZyb20gc3VjaCBhIHRhZyByZWNvcmQuKi9cbi8qKi9cbi8qIFRPRE86IEl0IHdvdWxkIGJlIG5pY2UgdG8gdHlwZWRlZiB0aGlzIHNoYXBlLCBidXQgd2UgY2FuJ3QgZGVjbGFyZSBhIHR5cGUqL1xuLyogd2l0aCBQQVNTX1NUWUxFIGZyb20gSlNEb2MuKi9cbi8qKi9cbi8qIEB0eXBlIHt7IFtQQVNTX1NUWUxFXTogc3RyaW5nLCovXG4vKiBbU3ltYm9sLnRvU3RyaW5nVGFnXTogc3RyaW5nLCovXG4vKiB9fSovXG4vKiovXG5jb25zdCBwcm90bz1nZXRQcm90b3R5cGVPZihvcmlnaW5hbCk7XG5pZihwcm90bz09PW9iamVjdFByb3RvdHlwZXx8cHJvdG89PT1udWxsKXtcbnJldHVybihcbnJlamVjdCYmXG5yZWplY3QoWCBgUmVtb3RhYmxlcyBtdXN0IGJlIGV4cGxpY2l0bHkgZGVjbGFyZWQ6ICR7cShvcmlnaW5hbCl9YCkpO1xuXG4gfVxuXG5pZih0eXBlb2Ygb3JpZ2luYWw9PT0nb2JqZWN0Jyl7XG5jb25zdCBwcm90b1Byb3RvPWdldFByb3RvdHlwZU9mKHByb3RvKTtcbmlmKHByb3RvUHJvdG8hPT1vYmplY3RQcm90b3R5cGUmJnByb3RvUHJvdG8hPT1udWxsKXtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5yZXR1cm4gY2hlY2tSZW1vdGFibGUocHJvdG8sY2hlY2spO1xuIH1cbmlmKCFjaGVja1RhZ1JlY29yZChwcm90bywncmVtb3RhYmxlJyxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9ZWxzZSBpZih0eXBlb2Ygb3JpZ2luYWw9PT0nZnVuY3Rpb24nKXtcbmlmKCFjaGVja0Z1bmN0aW9uVGFnUmVjb3JkKHByb3RvLCdyZW1vdGFibGUnLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cblxuLyogVHlwZWNhc3RzIG5lZWRlZCBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8xODYzKi9cbmNvbnN0IHBhc3NTdHlsZUtleT0vKiogQHR5cGUge3Vua25vd259ICovUEFTU19TVFlMRTtcbmNvbnN0IHRhZ0tleT0vKiogQHR5cGUge3Vua25vd259ICovU3ltYm9sLnRvU3RyaW5nVGFnO1xuY29uc3R7XG4vKiBjaGVja1RhZ1JlY29yZCBhbHJlYWR5IHZlcmlmaWVkIFBBU1NfU1RZTEUgYW5kIFN5bWJvbC50b1N0cmluZ1RhZyBvd24gZGF0YSBwcm9wZXJ0aWVzLiovXG5bLyoqIEB0eXBlIHtzdHJpbmd9ICovcGFzc1N0eWxlS2V5XTpfcGFzc1N0eWxlRGVzYyxcblsvKiogQHR5cGUge3N0cmluZ30gKi90YWdLZXldOnt2YWx1ZTppZmFjZX0sXG4uLi5yZXN0RGVzY3N9PVxuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhwcm90byk7XG5cbnJldHVybihcbihvd25LZXlzKHJlc3REZXNjcykubGVuZ3RoPT09MHx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgVW5leHBlY3RlZCBwcm9wZXJ0aWVzIG9uIFJlbW90YWJsZSBQcm90byAke293bktleXMocmVzdERlc2NzKX1gKSkmJlxuXG5jaGVja0lmYWNlKGlmYWNlLGNoZWNrKSk7XG5cbiB9O1xuXG4vKipcbiAqIEtlZXAgYSB3ZWFrIHNldCBvZiBjb25maXJtZWQgcmVtb3RhYmxlcyBmb3IgbWFyc2hhbCBwZXJmb3JtYW5jZVxuICogKHdpdGhvdXQgd2hpY2ggd2Ugd291bGQgaW5jdXIgYSByZWR1bmRhbnQgdmVyaWZpY2F0aW9uIGluXG4gKiBnZXRJbnRlcmZhY2VPZikuXG4gKiBXZSBkb24ndCByZW1lbWJlciByZWplY3Rpb25zIGJlY2F1c2UgdGhleSBhcmUgcG9zc2libGUgdG8gY29ycmVjdFxuICogd2l0aCBlLmcuIGBoYXJkZW5gLlxuICpcbiAqIEB0eXBlIHtXZWFrU2V0PFJlbW90YWJsZT59XG4gKi9cbmNvbnN0IGNvbmZpcm1lZFJlbW90YWJsZXM9bmV3IFdlYWtTZXQoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JlbW90YWJsZX0gdmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja1JlbW90YWJsZT0odmFsLGNoZWNrKT0+e1xuaWYoY29uZmlybWVkUmVtb3RhYmxlcy5oYXModmFsKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuaWYoIWlzRnJvemVuKHZhbCkpe1xucmV0dXJuIHJlamVjdCYmcmVqZWN0KFggYGNhbm5vdCBzZXJpYWxpemUgbm9uLWZyb3plbiBvYmplY3RzIGxpa2UgJHt2YWx9YCk7XG4gfVxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmlmKCFSZW1vdGFibGVIZWxwZXIuY2FuQmVWYWxpZCh2YWwsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdCByZXN1bHQ9Y2hlY2tSZW1vdGFibGVQcm90b09mKHZhbCxjaGVjayk7XG5pZihyZXN1bHQpe1xuY29uZmlybWVkUmVtb3RhYmxlcy5hZGQodmFsKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qKiBAdHlwZSB7TWFyc2hhbEdldEludGVyZmFjZU9mfSAqL1xuY29uc3QgICAgICAgIGdldEludGVyZmFjZU9mPSh2YWwpPT57XG5pZihcbiFpc09iamVjdCh2YWwpfHxcbnZhbFtQQVNTX1NUWUxFXSE9PSdyZW1vdGFibGUnfHxcbiFjaGVja1JlbW90YWJsZSh2YWwpKVxue1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5yZXR1cm4gZ2V0VGFnKHZhbCk7XG4gfTskaOKAjV9vbmNlLmdldEludGVyZmFjZU9mKGdldEludGVyZmFjZU9mKTtcbmhhcmRlbihnZXRJbnRlcmZhY2VPZik7XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtQYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBSZW1vdGFibGVIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZToncmVtb3RhYmxlJyxcblxuY2FuQmVWYWxpZDooY2FuZGlkYXRlLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmlmKCFpc09iamVjdChjYW5kaWRhdGUpKXtcbnJldHVybihcbnJlamVjdCYmXG5yZWplY3QoWCBgY2Fubm90IHNlcmlhbGl6ZSBub24tb2JqZWN0cyBhcyBSZW1vdGFibGUgJHtjYW5kaWRhdGV9YCkpO1xuXG4gfWVsc2UgaWYoaXNBcnJheShjYW5kaWRhdGUpKXtcbnJldHVybihcbnJlamVjdCYmcmVqZWN0KFggYGNhbm5vdCBzZXJpYWxpemUgYXJyYXlzIGFzIFJlbW90YWJsZSAke2NhbmRpZGF0ZX1gKSk7XG5cbiB9XG5cbmNvbnN0IGRlc2NzPWdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY2FuZGlkYXRlKTtcbmlmKHR5cGVvZiBjYW5kaWRhdGU9PT0nb2JqZWN0Jyl7XG4vKiBFdmVyeSBvd24gcHJvcGVydHkgKHJlZ2FyZGxlc3Mgb2YgZW51bWVyYWJpbGl0eSkqL1xuLyogbXVzdCBoYXZlIGEgZnVuY3Rpb24gdmFsdWUuKi9cbmNvbnN0IGtleXM9b3duS2V5cyhkZXNjcyk7XG5yZXR1cm4ga2V5cy5ldmVyeSgoa2V5KT0+e1xucmV0dXJuKFxuLyogVHlwZWNhc3QgbmVlZGVkIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzE4NjMqL1xuKGhhc093blByb3BlcnR5T2YoZGVzY3NbLyoqIEB0eXBlIHtzdHJpbmd9ICova2V5XSwndmFsdWUnKXx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgY2Fubm90IHNlcmlhbGl6ZSBSZW1vdGFibGVzIHdpdGggYWNjZXNzb3JzIGxpa2UgJHtxKFxuU3RyaW5nKGtleSkpXG4gfSBpbiAke2NhbmRpZGF0ZX1gKSkmJihcblxuY2FuQmVNZXRob2QoY2FuZGlkYXRlW2tleV0pfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBjYW5ub3Qgc2VyaWFsaXplIFJlbW90YWJsZXMgd2l0aCBub24tbWV0aG9kcyBsaWtlICR7cShcblN0cmluZyhrZXkpKVxuIH0gaW4gJHtjYW5kaWRhdGV9YCkpJiYoXG5cbmtleSE9PVBBU1NfU1RZTEV8fFxucmVqZWN0JiZcbnJlamVjdChYIGBBIHBhc3MtYnktcmVtb3RlIGNhbm5vdCBzaGFkb3cgJHtxKFBBU1NfU1RZTEUpfWApKSk7XG5cbiB9KTtcbiB9ZWxzZSBpZih0eXBlb2YgY2FuZGlkYXRlPT09J2Z1bmN0aW9uJyl7XG4vKiBGYXIgZnVuY3Rpb25zIGNhbm5vdCBiZSBtZXRob2RzLCBhbmQgY2Fubm90IGhhdmUgbWV0aG9kcy4qL1xuLyogVGhleSBtdXN0IGhhdmUgZXhhY3RseSBleHBlY3RlZCBgLm5hbWVgIGFuZCBgLmxlbmd0aGAgcHJvcGVydGllcyovXG5jb25zdHtuYW1lOm5hbWVEZXNjLGxlbmd0aDpsZW5ndGhEZXNjLC4uLnJlc3REZXNjc309ZGVzY3M7XG5jb25zdCByZXN0S2V5cz1vd25LZXlzKHJlc3REZXNjcyk7XG5yZXR1cm4oXG4obmFtZURlc2MmJnR5cGVvZiBuYW1lRGVzYy52YWx1ZT09PSdzdHJpbmcnfHxcbnJlamVjdCYmXG5yZWplY3QoWCBgRmFyIGZ1bmN0aW9uIG5hbWUgbXVzdCBiZSBhIHN0cmluZywgaW4gJHtjYW5kaWRhdGV9YCkpJiYoXG5sZW5ndGhEZXNjJiZ0eXBlb2YgbGVuZ3RoRGVzYy52YWx1ZT09PSdudW1iZXInfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBGYXIgZnVuY3Rpb24gbGVuZ3RoIG11c3QgYmUgYSBudW1iZXIsIGluICR7Y2FuZGlkYXRlfWApKSYmKFxuXG5yZXN0S2V5cy5sZW5ndGg9PT0wfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBGYXIgZnVuY3Rpb25zIHVuZXhwZWN0ZWQgcHJvcGVydGllcyBiZXNpZGVzIC5uYW1lIGFuZCAubGVuZ3RoICR7cmVzdEtleXN9YCkpKTtcblxuXG4gfWVsc2V7XG5yZXR1cm4gcmVqZWN0JiZyZWplY3QoWCBgdW5yZWNvZ25pemVkIHR5cGVvZiAke2NhbmRpZGF0ZX1gKTtcbiB9XG4gfSxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSk9PmNoZWNrUmVtb3RhYmxlKGNhbmRpZGF0ZSxhc3NlcnRDaGVja2VyKSxcblxuZXZlcnk6KF9wYXNzYWJsZSxfZm4pPT50cnVlfSk7JGjigI1fb25jZS5SZW1vdGFibGVIZWxwZXIoUmVtb3RhYmxlSGVscGVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3NlcnRJZmFjZSI6WyJhc3NlcnRJZmFjZSJdLCJnZXRJbnRlcmZhY2VPZiI6WyJnZXRJbnRlcmZhY2VPZiJdLCJSZW1vdGFibGVIZWxwZXIiOlsiUmVtb3RhYmxlSGVscGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABTGqsGKDwAAig8AADAAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9zYWZlLXByb21pc2UuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsiYXNzZXJ0U2FmZVByb21pc2UiLCJpc1NhZmVQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGlzUHJvbWlzZSxhc3NlcnRDaGVja2VyLGhhc093blByb3BlcnR5T2Y7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoaXNQcm9taXNlID0gJGjigI1fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMuanMnKS5DaGVja2VyfSBDaGVja2VyICovXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtpc0Zyb3plbixnZXRQcm90b3R5cGVPZn09T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqXG4gKiBAcGFyYW0ge1Byb21pc2V9IHByIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7cHIgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHNhZmUgcHJvbWlzZVxuICovXG5jb25zdCBjaGVja1Byb21pc2VPd25LZXlzPShwcixjaGVjayk9PntcbmNvbnN0IHJlamVjdD0oZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpO1xuY29uc3Qga2V5cz1vd25LZXlzKHByKTtcblxuaWYoa2V5cy5sZW5ndGg9PT0wKXtcbnJldHVybiB0cnVlO1xuIH1cblxuY29uc3QgdW5rbm93bktleXM9a2V5cy5maWx0ZXIoXG4oa2V5KT0+dHlwZW9mIGtleSE9PSdzeW1ib2wnfHwhaGFzT3duUHJvcGVydHlPZihQcm9taXNlLnByb3RvdHlwZSxrZXkpKTtcblxuXG5pZih1bmtub3duS2V5cy5sZW5ndGghPT0wKXtcbnJldHVybiByZWplY3QoXG5YIGAke3ByfSAtIE11c3Qgbm90IGhhdmUgYW55IG93biBwcm9wZXJ0aWVzOiAke3EodW5rbm93bktleXMpfWApO1xuXG4gfVxuXG4vKipcbiAqIEF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZywgTm9kZSdzIGFzeW5jX2hvb2tzIGNvbnRhaW5zIHRoZVxuICogZm9sbG93aW5nIGNvZGUsIHdoaWNoIHdlIGNhbiBhbHNvIHNhZmVseSB0b2xlcmF0ZVxuICpcbiAqIGBgYGpzXG4gKiBmdW5jdGlvbiBkZXN0cm95VHJhY2tpbmcocHJvbWlzZSwgcGFyZW50KSB7XG4gKiB0cmFja1Byb21pc2UocHJvbWlzZSwgcGFyZW50KTtcbiAqICAgY29uc3QgYXN5bmNJZCA9IHByb21pc2VbYXN5bmNfaWRfc3ltYm9sXTtcbiAqICAgY29uc3QgZGVzdHJveWVkID0geyBkZXN0cm95ZWQ6IGZhbHNlIH07XG4gKiAgIHByb21pc2VbZGVzdHJveWVkU3ltYm9sXSA9IGRlc3Ryb3llZDtcbiAqICAgcmVnaXN0ZXJEZXN0cm95SG9vayhwcm9taXNlLCBhc3luY0lkLCBkZXN0cm95ZWQpO1xuICogfVxuICogYGBgXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8c3ltYm9sfSBrZXlcbiAqL1xuY29uc3QgY2hlY2tTYWZlQXN5bmNIb29rc0tleT0oa2V5KT0+e1xuY29uc3QgdmFsPXByW2tleV07XG5pZih2YWw9PT11bmRlZmluZWR8fHR5cGVvZiB2YWw9PT0nbnVtYmVyJyl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihcbnR5cGVvZiB2YWw9PT0nb2JqZWN0JyYmXG52YWwhPT1udWxsJiZcbmlzRnJvemVuKHZhbCkmJlxuZ2V0UHJvdG90eXBlT2YodmFsKT09PU9iamVjdC5wcm90b3R5cGUpXG57XG5jb25zdCBzdWJLZXlzPW93bktleXModmFsKTtcbmlmKHN1YktleXMubGVuZ3RoPT09MCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5cbmlmKFxuc3ViS2V5cy5sZW5ndGg9PT0xJiZcbnN1YktleXNbMF09PT0nZGVzdHJveWVkJyYmXG52YWwuZGVzdHJveWVkPT09ZmFsc2UpXG57XG5yZXR1cm4gdHJ1ZTtcbiB9XG4gfVxucmV0dXJuIHJlamVjdChcblggYFVuZXhwZWN0ZWQgTm9kZSBhc3luY19ob29rcyBhZGRpdGlvbnMgdG8gcHJvbWlzZTogJHtwcn0uJHtxKFxuU3RyaW5nKGtleSkpXG4gfSBpcyAke3ZhbH1gKTtcblxuIH07XG5cbnJldHVybiBrZXlzLmV2ZXJ5KGNoZWNrU2FmZUFzeW5jSG9va3NLZXkpO1xuIH07XG5cbi8qKlxuICogVW5kZXIgSGFyZGVuZWQgSlMgYSBwcm9taXNlIGlzIFwic2FmZVwiIGlmIGl0cyBgdGhlbmAgbWV0aG9kIGNhbiBiZSBjYWxsZWRcbiAqIHN5bmNocm9ub3VzbHkgd2l0aG91dCBnaXZpbmcgdGhlIHByb21pc2UgYW4gb3Bwb3J0dW5pdHkgZm9yIGFcbiAqIHJlZW50cmFuY3kgYXR0YWNrIGR1cmluZyB0aGF0IGNhbGwuXG4gKlxuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy85XG4gKiByYWlzZXMgdGhlIGlzc3VlIG9mIHRlc3RpbmcgdGhhdCBhIHNwZWNpbWVuIGlzIGEgc2FmZSBwcm9taXNlXG4gKiBzdWNoIHRoYXQgdGhlIHRlc3QgYWxzbyBkb2VzIG5vdCBnaXZlIHRoZSBzcGVjaW1lbiBhXG4gKiByZWVudHJhbmN5IG9wcG9ydHVuaXR5LiBUaGF0IGlzIHdlbGwgYmV5b25kIHRoZSBhbWJpdGlvbiBoZXJlLlxuICogVE9ETyBUaG91Z2ggaWYgd2UgZmlndXJlIG91dCBhIG5pY2Ugc29sdXRpb24sIGl0IG1pZ2h0IGJlIGdvb2QgdG9cbiAqIHVzZSBpdCBoZXJlIGFzIHdlbGwuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBwciBUaGUgdmFsdWUgdG8gZXhhbWluZVxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge3ByIGlzIFByb21pc2V9IFdoZXRoZXIgaXQgaXMgYSBzYWZlIHByb21pc2VcbiAqL1xuY29uc3QgY2hlY2tTYWZlUHJvbWlzZT0ocHIsY2hlY2spPT57XG5jb25zdCByZWplY3Q9KGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKTtcbnJldHVybihcbihpc0Zyb3plbihwcil8fHJlamVjdChYIGAke3ByfSAtIE11c3QgYmUgZnJvemVuYCkpJiYoXG5pc1Byb21pc2UocHIpfHxyZWplY3QoWCBgJHtwcn0gLSBNdXN0IGJlIGEgcHJvbWlzZWApKSYmKFxuZ2V0UHJvdG90eXBlT2YocHIpPT09UHJvbWlzZS5wcm90b3R5cGV8fFxucmVqZWN0KFxuWCBgJHtwcn0gLSBNdXN0IGluaGVyaXQgZnJvbSBQcm9taXNlLnByb3RvdHlwZTogJHtxKFxuZ2V0UHJvdG90eXBlT2YocHIpKVxuIH1gKSkmJlxuXG5jaGVja1Byb21pc2VPd25LZXlzKC8qKiBAdHlwZSB7UHJvbWlzZX0gKi9wcixjaGVjaykpO1xuXG4gfTtcbmhhcmRlbihjaGVja1NhZmVQcm9taXNlKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlIGFyZ3VtZW50IGlzIGEgUHJvbWlzZS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHByIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcmV0dXJucyB7cHIgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHByb21pc2VcbiAqL1xuY29uc3QgICAgICAgIGlzU2FmZVByb21pc2U9KHByKT0+Y2hlY2tTYWZlUHJvbWlzZShwciwoeCk9PngpOyRo4oCNX29uY2UuaXNTYWZlUHJvbWlzZShpc1NhZmVQcm9taXNlKTtcbmhhcmRlbihpc1NhZmVQcm9taXNlKTtcblxuY29uc3QgICAgICAgIGFzc2VydFNhZmVQcm9taXNlPShwcik9PmNoZWNrU2FmZVByb21pc2UocHIsYXNzZXJ0Q2hlY2tlcik7JGjigI1fb25jZS5hc3NlcnRTYWZlUHJvbWlzZShhc3NlcnRTYWZlUHJvbWlzZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNTYWZlUHJvbWlzZSI6WyJpc1NhZmVQcm9taXNlIl0sImFzc2VydFNhZmVQcm9taXNlIjpbImFzc2VydFNhZmVQcm9taXNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGUT/Wi5EgAAuRIAACoAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9zeW1ib2wuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkF0QXRQcmVmaXhQYXR0ZXJuIiwiYXNzZXJ0UGFzc2FibGVTeW1ib2wiLCJpc1Bhc3NhYmxlU3ltYm9sIiwibmFtZUZvclBhc3NhYmxlU3ltYm9sIiwicGFzc2FibGVTeW1ib2xGb3JOYW1lIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cblxuY29uc3R7RmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKipcbiAqIFRoZSB3ZWxsIGtub3duIHN5bWJvbHMgYXJlIHN0YXRpYyBzeW1ib2wgdmFsdWVzIG9uIHRoZSBgU3ltYm9sYCBjb25zdHJ1Y3Rvci5cbiAqL1xuY29uc3Qgd2VsbEtub3duU3ltYm9sTmFtZXM9bmV3IE1hcChcbm93bktleXMoU3ltYm9sKS5cbmZpbHRlcihcbihuYW1lKT0+dHlwZW9mIG5hbWU9PT0nc3RyaW5nJyYmdHlwZW9mIFN5bWJvbFtuYW1lXT09PSdzeW1ib2wnKS5cblxuZmlsdGVyKChuYW1lKT0+e1xuLyogQHRzLWV4cGVjdC1lcnJvciBJdCBkb2Vzbid0IGtub3cgbmFtZSBjYW5ub3QgYmUgYSBzeW1ib2wqL1xuIW5hbWUuc3RhcnRzV2l0aCgnQEAnKXx8XG5GYWlsIGBEaWQgbm90IGV4cGVjdCBTeW1ib2wgdG8gaGF2ZSBhIHN5bWJvbC12YWx1ZWQgcHJvcGVydHkgbmFtZSBzdGFydGluZyB3aXRoIFwiQEBcIiAke3EoXG5uYW1lKVxuIH1gO1xucmV0dXJuIHRydWU7XG4gfSlcbi8qIEB0cy1pZ25vcmUgSXQgZG9lc24ndCBrbm93IG5hbWUgY2Fubm90IGJlIGEgc3ltYm9sKi8uXG5tYXAoKG5hbWUpPT5bU3ltYm9sW25hbWVdLCBgQEAke25hbWV9YF0pKTtcblxuXG4vKipcbiAqIFRoZSBwYXNzYWJsZSBzeW1ib2xzIGFyZSB0aGUgd2VsbCBrbm93biBzeW1ib2xzICh0aGUgc3ltYm9sIHZhbHVlc1xuICogb2Ygc3RhdGljIHByb3BlcnRpZXMgb2YgdGhlIGBTeW1ib2xgIGNvbnN0cnVjdG9yKSBhbmQgdGhlIHJlZ2lzdGVyZWRcbiAqIHN5bWJvbHMuXG4gKlxuICogQHBhcmFtIHthbnl9IHN5bVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBpc1Bhc3NhYmxlU3ltYm9sPShzeW0pPT5cbnR5cGVvZiBzeW09PT0nc3ltYm9sJyYmKFxudHlwZW9mIFN5bWJvbC5rZXlGb3Ioc3ltKT09PSdzdHJpbmcnfHx3ZWxsS25vd25TeW1ib2xOYW1lcy5oYXMoc3ltKSk7JGjigI1fb25jZS5pc1Bhc3NhYmxlU3ltYm9sKGlzUGFzc2FibGVTeW1ib2wpO1xuaGFyZGVuKGlzUGFzc2FibGVTeW1ib2wpO1xuXG5jb25zdCAgICAgICAgYXNzZXJ0UGFzc2FibGVTeW1ib2w9KHN5bSk9PlxuaXNQYXNzYWJsZVN5bWJvbChzeW0pfHxcbkZhaWwgYE9ubHkgcmVnaXN0ZXJlZCBzeW1ib2xzIG9yIHdlbGwta25vd24gc3ltYm9scyBhcmUgcGFzc2FibGU6ICR7cShzeW0pfWA7JGjigI1fb25jZS5hc3NlcnRQYXNzYWJsZVN5bWJvbChhc3NlcnRQYXNzYWJsZVN5bWJvbCk7XG5oYXJkZW4oYXNzZXJ0UGFzc2FibGVTeW1ib2wpO1xuXG4vKipcbiAqIElmIGBzeW1gIGlzIGEgcGFzc2FibGUgc3ltYm9sLCByZXR1cm4gYSBzdHJpbmcgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoaXNcbiAqIHN5bWJvbC4gSWYgYHN5bWAgaXMgYSBub24tcGFzc2FibGUgc3ltYm9sLCByZXR1cm4gYHVuZGVmaW5lZGAuXG4gKlxuICogVGhlIHBhc3NhYmxlIHN5bWJvbHMgYXJlIHRoZSB3ZWxsIGtub3duIHN5bWJvbHMgKHRoZSBzeW1ib2wgdmFsdWVzXG4gKiBvZiBzdGF0aWMgcHJvcGVydGllcyBvZiB0aGUgYFN5bWJvbGAgY29uc3RydWN0b3IpIGFuZCB0aGUgcmVnaXN0ZXJlZFxuICogc3ltYm9scy4gU2luY2UgdGhlIHJlZ2lzdHJhdGlvbiBzdHJpbmcgb2YgYSByZWdpc3RlcmVkIHN5bWJvbCBjYW4gYmUgYW55XG4gKiBzdHJpbmcsIGlmIHdlIHNpbXBseSB1c2VkIHRoYXQgdG8gaWRlbnRpZnkgdGhvc2Ugc3ltYm9scywgdGhlcmUgd291bGQgbm90XG4gKiBiZSBhbnkgcmVtYWluaW5nIHN0cmluZ3MgbGVmdCBvdmVyIHRvIGlkZW50aWZ5IHRoZSB3ZWxsLWtub3duIHN5bWJvbHMuXG4gKiBJbnN0ZWFkLCB3ZSByZXNlcnZlIHN0cmluZ3MgYmVnaW5uaW5nIHdpdGggYFwiQEBcImAgZm9yIHB1cnBvc2VzIG9mIHRoaXNcbiAqIGVuY29kaW5nLiBXZSBpZGVudGlmeSBhIHdlbGwga25vd24gc3ltYm9sIHN1Y2ggYXMgYFN5bWJvbC5pdGVyYXRvcmBcbiAqIGJ5IHByZWZpeGluZyB0aGUgcHJvcGVydHkgbmFtZSB3aXRoIGBcIkBAXCJgLCBzdWNoIGFzIGBcIkBAaXRlcmF0b3JcImAuXG4gKiBGb3IgcmVnaXN0ZXJlZCBzeW1ib2xzIHdob3NlIG5hbWUgaGFwcGVucyB0byBiZWdpbiB3aXRoIGBcIkBAXCJgLCBzdWNoXG4gKiBhcyBgU3ltYm9sLmZvcignQEBpdGVyYXRvcicpYCBvciBgU3ltYm9sLmZvcignQEBmb28nKWAsIHdlIGlkZW50aWZ5XG4gKiB0aGVtIGJ5IHByZWZpeGluZyB0aGVtIHdpdGggYW4gZXh0cmEgYFwiQEBcImAsIHN1Y2ggYXNcbiAqIGBcIkBAQEBpdGVyYXRvclwiYCBvciBgXCJAQEBAZm9vXCJgLiAoVGhpcyBpcyB0aGUgSGlsYmVydCBIb3RlbCBlbmNvZGluZ1xuICogdGVjaG5pcXVlLilcbiAqXG4gKiBAcGFyYW0ge3N5bWJvbH0gc3ltXG4gKiBAcmV0dXJucyB7c3RyaW5nPX1cbiAqL1xuY29uc3QgICAgICAgIG5hbWVGb3JQYXNzYWJsZVN5bWJvbD0oc3ltKT0+e1xuY29uc3QgbmFtZT1TeW1ib2wua2V5Rm9yKHN5bSk7XG5pZihuYW1lPT09dW5kZWZpbmVkKXtcbnJldHVybiB3ZWxsS25vd25TeW1ib2xOYW1lcy5nZXQoc3ltKTtcbiB9XG5pZihuYW1lLnN0YXJ0c1dpdGgoJ0BAJykpe1xucmV0dXJuIGBAQCR7bmFtZX1gO1xuIH1cbnJldHVybiBuYW1lO1xuIH07JGjigI1fb25jZS5uYW1lRm9yUGFzc2FibGVTeW1ib2wobmFtZUZvclBhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihuYW1lRm9yUGFzc2FibGVTeW1ib2wpO1xuXG5jb25zdCAgICAgICAgQXRBdFByZWZpeFBhdHRlcm49L15AQCguKikkLzskaOKAjV9vbmNlLkF0QXRQcmVmaXhQYXR0ZXJuKEF0QXRQcmVmaXhQYXR0ZXJuKTtcbmhhcmRlbihBdEF0UHJlZml4UGF0dGVybik7XG5cbi8qKlxuICogSWYgYG5hbWVgIGlzIGEgc3RyaW5nIHRoYXQgY291bGQgaGF2ZSBiZWVuIHByb2R1Y2VkIGJ5XG4gKiBgbmFtZUZvclBhc3NhYmxlU3ltYm9sYCwgcmV0dXJuIHRoZSBzeW1ib2wgYXJndW1lbnQgaXQgd2FzIHByb2R1Y2VkIHRvXG4gKiByZXByZXNlbnQuXG4gKlxuICogICAgSWYgYG5hbWVgIGRvZXMgbm90IGJlZ2luIHdpdGggYFwiQEBcImAsIHRoZW4ganVzdCB0aGUgY29ycmVzcG9uZGluZ1xuICogICAgICByZWdpc3RlcmVkIHN5bWJvbCwgYFN5bWJvbC5mb3IobmFtZSlgLlxuICogICAgSWYgYG5hbWVgIGlzIGBcIkBAXCJgIGZvbGxvd2VkIGJ5IGEgd2VsbCBrbm93biBzeW1ib2wncyBwcm9wZXJ0eSBuYW1lIG9uXG4gKiAgICAgIGBTeW1ib2xgIHN1Y2ggYFwiQEBpdGVyYXRvclwiLCByZXR1cm4gdGhhdCB3ZWxsIGtub3duIHN5bWJvbCBzdWNoIGFzXG4gKiAgICAgIGBTeW1ib2wuaXRlcmF0b3JgXG4gKiAgICBJZiBgbmFtZWAgYmVnaW5zIHdpdGggYFwiQEBAQFwiYCBpdCBlbmNvZGVzIHRoZSByZWdpc3RlcmVkIHN5bWJvbCB3aG9zZVxuICogICAgICBuYW1lIGJlZ2lucyB3aXRoIGBcIkBAXCJgIGluc3RlYWQuXG4gKiAgICBPdGhlcndpc2UsIGlmIG5hbWUgYmVnaW5zIHdpdGggYFwiQEBcImAgaXQgbWF5IGVuY29kZSBhIHJlZ2lzdGVyZWQgc3ltYm9sXG4gKiAgICAgIGZyb20gYSBmdXR1cmUgdmVyc2lvbiBvZiBKYXZhU2NyaXB0LCBidXQgaXQgaXMgbm90IG9uZSB3ZSBjYW4gZGVjb2RlXG4gKiAgICAgIHlldCwgc28gdGhyb3cuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHtzeW1ib2w9fVxuICovXG5jb25zdCAgICAgICAgcGFzc2FibGVTeW1ib2xGb3JOYW1lPShuYW1lKT0+e1xuaWYodHlwZW9mIG5hbWUhPT0nc3RyaW5nJyl7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmNvbnN0IG1hdGNoPUF0QXRQcmVmaXhQYXR0ZXJuLmV4ZWMobmFtZSk7XG5pZihtYXRjaCl7XG5jb25zdCBzdWZmaXg9bWF0Y2hbMV07XG5pZihzdWZmaXguc3RhcnRzV2l0aCgnQEAnKSl7XG5yZXR1cm4gU3ltYm9sLmZvcihzdWZmaXgpO1xuIH1lbHNle1xuY29uc3Qgc3ltPVN5bWJvbFtzdWZmaXhdO1xuaWYodHlwZW9mIHN5bT09PSdzeW1ib2wnKXtcbnJldHVybiBzeW07XG4gfVxuRmFpbCBgUmVzZXJ2ZWQgZm9yIHdlbGwga25vd24gc3ltYm9sICR7cShzdWZmaXgpfTogJHtxKG5hbWUpfWA7XG4gfVxuIH1cbnJldHVybiBTeW1ib2wuZm9yKG5hbWUpO1xuIH07JGjigI1fb25jZS5wYXNzYWJsZVN5bWJvbEZvck5hbWUocGFzc2FibGVTeW1ib2xGb3JOYW1lKTtcbmhhcmRlbihwYXNzYWJsZVN5bWJvbEZvck5hbWUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUGFzc2FibGVTeW1ib2wiOlsiaXNQYXNzYWJsZVN5bWJvbCJdLCJhc3NlcnRQYXNzYWJsZVN5bWJvbCI6WyJhc3NlcnRQYXNzYWJsZVN5bWJvbCJdLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiOlsibmFtZUZvclBhc3NhYmxlU3ltYm9sIl0sIkF0QXRQcmVmaXhQYXR0ZXJuIjpbIkF0QXRQcmVmaXhQYXR0ZXJuIl0sInBhc3NhYmxlU3ltYm9sRm9yTmFtZSI6WyJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAACrS51uAHAADgBwAAKgAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL3RhZ2dlZC5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiVGFnZ2VkSGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsY2hlY2tUYWdSZWNvcmQsUEFTU19TVFlMRSxjaGVja05vcm1hbFByb3BlcnR5LGNoZWNrUGFzc1N0eWxlOyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImNoZWNrVGFnUmVjb3JkXCIsIFskaOKAjV9hID0+IChjaGVja1RhZ1JlY29yZCA9ICRo4oCNX2EpXV0sW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV0sW1wiY2hlY2tOb3JtYWxQcm9wZXJ0eVwiLCBbJGjigI1fYSA9PiAoY2hlY2tOb3JtYWxQcm9wZXJ0eSA9ICRo4oCNX2EpXV0sW1wiY2hlY2tQYXNzU3R5bGVcIiwgWyRo4oCNX2EgPT4gKGNoZWNrUGFzc1N0eWxlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2dldE93blByb3BlcnR5RGVzY3JpcHRvcnN9PU9iamVjdDtcblxuLyoqXG4gKlxuICogQHR5cGUge1hpbXBvcnQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBUYWdnZWRIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZTondGFnZ2VkJyxcblxuY2FuQmVWYWxpZDooY2FuZGlkYXRlLGNoZWNrKT0+Y2hlY2tQYXNzU3R5bGUoY2FuZGlkYXRlLCd0YWdnZWQnLGNoZWNrKSxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSxwYXNzU3R5bGVPZlJlY3VyKT0+e1xuY2hlY2tUYWdSZWNvcmQoY2FuZGlkYXRlLCd0YWdnZWQnLGFzc2VydENoZWNrZXIpO1xuXG4vKiBUeXBlY2FzdHMgbmVlZGVkIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzE4NjMqL1xuY29uc3QgcGFzc1N0eWxlS2V5PS8qKiBAdHlwZSB7dW5rbm93bn0gKi9QQVNTX1NUWUxFO1xuY29uc3QgdGFnS2V5PS8qKiBAdHlwZSB7dW5rbm93bn0gKi9TeW1ib2wudG9TdHJpbmdUYWc7XG5jb25zdHtcbi8qIGNoZWNrVGFnUmVjb3JkIGFscmVhZHkgdmVyaWZpZWQgUEFTU19TVFlMRSBhbmQgU3ltYm9sLnRvU3RyaW5nVGFnIG93biBkYXRhIHByb3BlcnRpZXMuKi9cblsvKiogQHR5cGUge3N0cmluZ30gKi9wYXNzU3R5bGVLZXldOl9wYXNzU3R5bGVEZXNjLFxuWy8qKiBAdHlwZSB7c3RyaW5nfSAqL3RhZ0tleV06X2xhYmVsRGVzYyxcbnBheWxvYWQ6X3BheWxvYWREZXNjLC8qIHZhbHVlIGNoZWNrZWQgYnkgcmVjdXJzaXZlIHdhbGsgYXQgdGhlIGVuZCovXG4uLi5yZXN0RGVzY3N9PVxuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xub3duS2V5cyhyZXN0RGVzY3MpLmxlbmd0aD09PTB8fFxuRmFpbCBgVW5leHBlY3RlZCBwcm9wZXJ0aWVzIG9uIHRhZ2dlZCByZWNvcmQgJHtvd25LZXlzKHJlc3REZXNjcyl9YDtcblxuY2hlY2tOb3JtYWxQcm9wZXJ0eShjYW5kaWRhdGUsJ3BheWxvYWQnLHRydWUsYXNzZXJ0Q2hlY2tlcik7XG5cbi8qIFJlY3Vyc2l2ZWx5IHZhbGlkYXRlIHRoYXQgZWFjaCBtZW1iZXIgaXMgcGFzc2FibGUuKi9cbnBhc3NTdHlsZU9mUmVjdXIoY2FuZGlkYXRlLnBheWxvYWQpO1xuIH19KTskaOKAjV9vbmNlLlRhZ2dlZEhlbHBlcihUYWdnZWRIZWxwZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlRhZ2dlZEhlbHBlciI6WyJUYWdnZWRIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAEZo7UPQYAAD0GAAAJAAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9tYWtlLWZhci5qc3siaW1wb3J0cyI6WyIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL2hlbHBlcnMvcmVtb3RhYmxlLmpzIl0sImV4cG9ydHMiOlsiRmFyIiwiUmVtb3RhYmxlIiwiVG9GYXJGdW5jdGlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLFBBU1NfU1RZTEUsYXNzZXJ0SWZhY2UsZ2V0SW50ZXJmYWNlT2YsUmVtb3RhYmxlSGVscGVyOyRo4oCNX2ltcG9ydHMoW1tcIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvcmVtb3RhYmxlLmpzXCIsIFtbXCJhc3NlcnRJZmFjZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0SWZhY2UgPSAkaOKAjV9hKV1dLFtcImdldEludGVyZmFjZU9mXCIsIFskaOKAjV9hID0+IChnZXRJbnRlcmZhY2VPZiA9ICRo4oCNX2EpXV0sW1wiUmVtb3RhYmxlSGVscGVyXCIsIFskaOKAjV9hID0+IChSZW1vdGFibGVIZWxwZXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuSW50ZXJmYWNlU3BlY30gSW50ZXJmYWNlU3BlYyAqL1xuLyoqIEB0ZW1wbGF0ZSBMLFIgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5SZW1vdGFibGVCcmFuZDxMLCBSPn0gUmVtb3RhYmxlQnJhbmQgKi9cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbmNvbnN0e3Byb3RvdHlwZTpmdW5jdGlvblByb3RvdHlwZX09RnVuY3Rpb247XG5jb25zdHtcbmdldFByb3RvdHlwZU9mLFxuc2V0UHJvdG90eXBlT2YsXG5jcmVhdGUsXG5pc0Zyb3plbixcbnByb3RvdHlwZTpvYmplY3RQcm90b3R5cGV9PVxuT2JqZWN0O1xuXG4vKipcbiAqIE5vdyB0aGF0IHRoZSByZW1vdGFibGVQcm90byBkb2VzIG5vdCBwcm92aWRlIGl0cyBvd24gYHRvU3RyaW5nYCBtZXRob2QsXG4gKiBlbnN1cmUgaXQgYWx3YXlzIGluaGVyaXRzIGZyb20gc29tZXRoaW5nLiBUaGUgb3JpZ2luYWwgcHJvdG90eXBlIG9mXG4gKiBgcmVtb3RhYmxlYCBpZiB0aGVyZSB3YXMgb25lLCBvciBgT2JqZWN0LnByb3RvdHlwZWAgb3RoZXJ3aXNlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSByZW1vdGFibGVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gaWZhY2VcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbmNvbnN0IG1ha2VSZW1vdGFibGVQcm90bz0ocmVtb3RhYmxlLGlmYWNlKT0+e1xubGV0IG9sZFByb3RvPWdldFByb3RvdHlwZU9mKHJlbW90YWJsZSk7XG5pZih0eXBlb2YgcmVtb3RhYmxlPT09J29iamVjdCcpe1xuaWYob2xkUHJvdG89PT1udWxsKXtcbm9sZFByb3RvPW9iamVjdFByb3RvdHlwZTtcbiB9XG5vbGRQcm90bz09PW9iamVjdFByb3RvdHlwZXx8XG5GYWlsIGBGb3Igbm93LCByZW1vdGFibGVzIGNhbm5vdCBpbmhlcml0IGZyb20gYW55dGhpbmcgdW51c3VhbCwgaW4gJHtyZW1vdGFibGV9YDtcbiB9ZWxzZSBpZih0eXBlb2YgcmVtb3RhYmxlPT09J2Z1bmN0aW9uJyl7XG5vbGRQcm90byE9PW51bGx8fFxuRmFpbCBgT3JpZ2luYWwgZnVuY3Rpb24gbXVzdCBub3QgaW5oZXJpdCBmcm9tIG51bGw6ICR7cmVtb3RhYmxlfWA7XG5vbGRQcm90bz09PWZ1bmN0aW9uUHJvdG90eXBlfHxcbmdldFByb3RvdHlwZU9mKG9sZFByb3RvKT09PWZ1bmN0aW9uUHJvdG90eXBlfHxcbkZhaWwgYEZhciBmdW5jdGlvbnMgbXVzdCBvcmlnaW5hbGx5IGluaGVyaXQgZnJvbSBGdW5jdGlvbi5wcm90b3R5cGUsIGluICR7cmVtb3RhYmxlfWA7XG4gfWVsc2V7XG5GYWlsIGB1bnJlY29nbml6ZWQgdHlwZW9mICR7cmVtb3RhYmxlfWA7XG4gfVxucmV0dXJuIGhhcmRlbihcbmNyZWF0ZShvbGRQcm90byx7XG5bUEFTU19TVFlMRV06e3ZhbHVlOidyZW1vdGFibGUnfSxcbltTeW1ib2wudG9TdHJpbmdUYWddOnt2YWx1ZTppZmFjZX19KSk7XG5cblxuIH07XG5cbmNvbnN0IGFzc2VydENhbkJlUmVtb3RhYmxlPShjYW5kaWRhdGUpPT5cblJlbW90YWJsZUhlbHBlci5jYW5CZVZhbGlkKGNhbmRpZGF0ZSxhc3NlcnRDaGVja2VyKTtcblxuLyoqXG4gKiBDcmVhdGUgYW5kIHJlZ2lzdGVyIGEgUmVtb3RhYmxlLiAgQWZ0ZXIgdGhpcywgZ2V0SW50ZXJmYWNlT2YocmVtb3RhYmxlKVxuICogcmV0dXJucyBpZmFjZS5cbiAqXG4gKiAvLyBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzgwNFxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IFtpZmFjZT0nUmVtb3RhYmxlJ10gVGhlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9uIGZvclxuICogdGhlIHJlbW90YWJsZS4gRm9yIG5vdywgYSBzdHJpbmcgaWZhY2UgbXVzdCBiZSBcIlJlbW90YWJsZVwiIG9yIGJlZ2luIHdpdGhcbiAqIFwiQWxsZWdlZDogXCIsIHRvIHNlcnZlIGFzIHRoZSBhbGxlZ2VkIG5hbWUuIE1vcmUgZ2VuZXJhbCBpZmFjZXMgYXJlIG5vdCB5ZXRcbiAqIGltcGxlbWVudGVkLiBUaGlzIGlzIHRlbXBvcmFyeS4gV2UgaW5jbHVkZSB0aGVcbiAqIFwiQWxsZWdlZFwiIGFzIGEgcmVtaW5kZXIgdGhhdCB3ZSBkbyBub3QgeWV0IGhhdmUgU3dpbmdTZXQgb3IgQ29tbXMgVmF0XG4gKiBzdXBwb3J0IGZvciBlbnN1cmluZyB0aGlzIGlzIGFjY29yZGluZyB0byB0aGUgdmF0IGhvc3RpbmcgdGhlIG9iamVjdC5cbiAqIEN1cnJlbnRseSwgQWxpY2UgY2FuIHRlbGwgQm9iIGFib3V0IENhcm9sLCB3aGVyZSBWYXRBIChvbiBBbGljZSdzIGJlaGFsZilcbiAqIG1pc3JlcHJlc2VudHMgQ2Fyb2wncyBgaWZhY2VgLiBWYXRCIGFuZCB0aGVyZWZvcmUgQm9iIHdpbGwgdGhlbiBzZWVcbiAqIENhcm9sJ3MgYGlmYWNlYCBhcyBtaXNyZXByZXNlbnRlZCBieSBWYXRBLlxuICogQHBhcmFtIHt1bmRlZmluZWR9IFtwcm9wcz11bmRlZmluZWRdIEN1cnJlbnRseSBtYXkgb25seSBiZSB1bmRlZmluZWQuXG4gKiBUaGF0IHBsYW4gaXMgdGhhdCBvd24tcHJvcGVydGllcyBhcmUgY29waWVkIHRvIHRoZSByZW1vdGFibGVcbiAqIEBwYXJhbSB7VH0gW3JlbW90YWJsZT17fV0gVGhlIG9iamVjdCB1c2VkIGFzIHRoZSByZW1vdGFibGVcbiAqIEByZXR1cm5zIHtUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+fSByZW1vdGFibGUsIG1vZGlmaWVkIGZvciBkZWJ1Z2dhYmlsaXR5XG4gKi9cbmNvbnN0ICAgICAgICBSZW1vdGFibGU9KFxuaWZhY2U9J1JlbW90YWJsZScsXG5wcm9wcz11bmRlZmluZWQsXG5yZW1vdGFibGU9LyoqIEB0eXBlIHtUfSAqL3t9KT0+XG57XG5hc3NlcnRJZmFjZShpZmFjZSk7XG5hc3NlcnQoaWZhY2UpO1xuLyogVE9ETzogV2hlbiBpZmFjZSBpcyByaWNoZXIgdGhhbiBqdXN0IHN0cmluZywgd2UgbmVlZCB0byBnZXQgdGhlIGFsbGVnZWROYW1lKi9cbi8qIGluIGEgZGlmZmVyZW50IHdheS4qL1xucHJvcHM9PT11bmRlZmluZWR8fEZhaWwgYFJlbW90YWJsZSBwcm9wcyBub3QgeWV0IGltcGxlbWVudGVkICR7cHJvcHN9YDtcblxuLyogRmFpbCBmYXN0OiBjaGVjayB0aGF0IHRoZSB1bm1vZGlmaWVkIG9iamVjdCBpcyBhYmxlIHRvIGJlY29tZSBhIFJlbW90YWJsZS4qL1xuYXNzZXJ0Q2FuQmVSZW1vdGFibGUocmVtb3RhYmxlKTtcblxuLyogRW5zdXJlIHRoYXQgdGhlIHJlbW90YWJsZSBpc24ndCBhbHJlYWR5IG1hcmtlZC4qL1xuIShQQVNTX1NUWUxFIGluIHJlbW90YWJsZSl8fFxuRmFpbCBgUmVtb3RhYmxlICR7cmVtb3RhYmxlfSBpcyBhbHJlYWR5IG1hcmtlZCBhcyBhICR7cShcbnJlbW90YWJsZVtQQVNTX1NUWUxFXSlcbiB9YDtcbi8qIEVuc3VyZSB0aGF0IHRoZSByZW1vdGFibGUgaXNuJ3QgYWxyZWFkeSBmcm96ZW4uKi9cbiFpc0Zyb3plbihyZW1vdGFibGUpfHxGYWlsIGBSZW1vdGFibGUgJHtyZW1vdGFibGV9IGlzIGFscmVhZHkgZnJvemVuYDtcbmNvbnN0IHJlbW90YWJsZVByb3RvPW1ha2VSZW1vdGFibGVQcm90byhyZW1vdGFibGUsaWZhY2UpO1xuXG4vKiBUYWtlIGEgc3RhdGljIGNvcHkgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgYXMgZGF0YSBwcm9wZXJ0aWVzLiovXG4vKiBjb25zdCBwcm9wRGVzY3MgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHsgLi4ucHJvcHMgfSk7Ki9cbmNvbnN0IG11dGF0ZUhhcmRlbkFuZENoZWNrPSh0YXJnZXQpPT57XG4vKiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcERlc2NzKTsqL1xuc2V0UHJvdG90eXBlT2YodGFyZ2V0LHJlbW90YWJsZVByb3RvKTtcbmhhcmRlbih0YXJnZXQpO1xuYXNzZXJ0Q2FuQmVSZW1vdGFibGUodGFyZ2V0KTtcbiB9O1xuXG4vKiBGYWlsIGZhc3Q6IGNoZWNrIGEgZnJlc2ggcmVtb3RhYmxlIHRvIHNlZSBpZiBvdXIgcnVsZXMgZml0LiovXG5tdXRhdGVIYXJkZW5BbmRDaGVjayh7fSk7XG5cbi8qIEFjdHVhbGx5IGZpbmlzaCB0aGUgbmV3IHJlbW90YWJsZS4qL1xubXV0YXRlSGFyZGVuQW5kQ2hlY2socmVtb3RhYmxlKTtcblxuLyogQ09NTUlUVEVEISovXG4vKiBXZSdyZSBjb21taXR0ZWQsIHNvIGtlZXAgdGhlIGludGVyZmFjZSBmb3IgZnV0dXJlIHJlZmVyZW5jZS4qL1xuYXNzZXJ0KGlmYWNlIT09dW5kZWZpbmVkKTsvKiBUbyBtYWtlIFR5cGVTY3JpcHQgaGFwcHkqL1xucmV0dXJuICgvKiogQHR5cGUge1QgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD59ICovcmVtb3RhYmxlKTtcbiB9OyRo4oCNX29uY2UuUmVtb3RhYmxlKFJlbW90YWJsZSk7XG5oYXJkZW4oUmVtb3RhYmxlKTtcblxuLyoqXG4gKiBBIGNvbmNpc2UgY29udmVuaWVuY2UgZm9yIHRoZSBtb3N0IGNvbW1vbiBgUmVtb3RhYmxlYCB1c2UuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7c3RyaW5nfSBmYXJOYW1lIFRoaXMgbmFtZSB3aWxsIGJlIHByZXBlbmRlZCB3aXRoIGBBbGxlZ2VkOiBgXG4gKiBmb3Igbm93IHRvIGZvcm0gdGhlIGBSZW1vdGFibGVgIGBpZmFjZWAgYXJndW1lbnQuXG4gKiBAcGFyYW0ge1R9IFtyZW1vdGFibGU9e31dIFRoZSBvYmplY3QgdXNlZCBhcyB0aGUgcmVtb3RhYmxlXG4gKi9cbmNvbnN0ICAgICAgICBGYXI9KGZhck5hbWUscmVtb3RhYmxlPXVuZGVmaW5lZCk9PntcbmNvbnN0IHI9cmVtb3RhYmxlPT09dW5kZWZpbmVkPy8qKiBAdHlwZSB7VH0gKi97fTpyZW1vdGFibGU7XG5yZXR1cm4gUmVtb3RhYmxlKCBgQWxsZWdlZDogJHtmYXJOYW1lfWAsdW5kZWZpbmVkLHIpO1xuIH07JGjigI1fb25jZS5GYXIoRmFyKTtcbmhhcmRlbihGYXIpO1xuXG4vKipcbiAqIENvZXJjZSBgZnVuY2AgdG8gYSBmYXIgZnVuY3Rpb24gdGhhdCBwcmVzZXJ2ZXMgaXRzIGNhbGwgYmVoYXZpb3IuXG4gKiBJZiBpdCBpcyBhbHJlYWR5IGEgZmFyIGZ1bmN0aW9uLCByZXR1cm4gaXQuIE90aGVyd2lzZSBtYWtlIGFuZCByZXR1cm4gYVxuICogbmV3IGZhciBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCBhbmQgZm9yd2FyZHMgY2FsbHMgdG8gaXQuIFRoaXNcbiAqIHdvcmtzIGV2ZW4gaWYgYGZ1bmNgIGlzIGFscmVhZHkgZnJvemVuLiBgVG9GYXJGdW5jdGlvbmAgaXMgdG8gYmUgdXNlZFxuICogd2hlbiB0aGUgZnVuY3Rpb24gY29tZXMgZnJvbSBlbHNld2hlcmUgdW5kZXIgbGVzcyBjb250cm9sLiBGb3IgZnVuY3Rpb25zXG4gKiB5b3UgYXV0aG9yIGluIHBsYWNlLCBiZXR0ZXIgdG8gdXNlIGBGYXJgIG9uIHRoZWlyIGZ1bmN0aW9uIGxpdGVyYWwgZGlyZWN0bHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZhck5hbWUgdG8gYmUgdXNlZCBvbmx5IGlmIGBmdW5jYCBpcyBub3QgYWxyZWFkeSBhXG4gKiBmYXIgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBmdW5jXG4gKi9cbmNvbnN0ICAgICAgICBUb0ZhckZ1bmN0aW9uPShmYXJOYW1lLGZ1bmMpPT57XG5pZihnZXRJbnRlcmZhY2VPZihmdW5jKSE9PXVuZGVmaW5lZCl7XG5yZXR1cm4gZnVuYztcbiB9XG5yZXR1cm4gRmFyKGZhck5hbWUsKC4uLmFyZ3MpPT5mdW5jKC4uLmFyZ3MpKTtcbiB9OyRo4oCNX29uY2UuVG9GYXJGdW5jdGlvbihUb0ZhckZ1bmN0aW9uKTtcbmhhcmRlbihUb0ZhckZ1bmN0aW9uKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJSZW1vdGFibGUiOlsiUmVtb3RhYmxlIl0sIkZhciI6WyJGYXIiXSwiVG9GYXJGdW5jdGlvbiI6WyJUb0ZhckZ1bmN0aW9uIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFvzA2cpBAAAKQQAACYAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvbWFrZVRhZ2dlZC5qc3siaW1wb3J0cyI6WyIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL3Bhc3NTdHlsZU9mLmpzIl0sImV4cG9ydHMiOlsibWFrZVRhZ2dlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBQQVNTX1NUWUxFLGFzc2VydFBhc3NhYmxlOyRo4oCNX2ltcG9ydHMoW1tcIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cbmNvbnN0e2NyZWF0ZSxwcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlfT1PYmplY3Q7XG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcblxuY29uc3QgICAgICAgIG1ha2VUYWdnZWQ9KHRhZyxwYXlsb2FkKT0+e1xuYXNzZXJ0LnR5cGVvZihcbnRhZyxcbidzdHJpbmcnLFxuWCBgVGhlIHRhZyBvZiBhIHRhZ2dlZCByZWNvcmQgbXVzdCBiZSBhIHN0cmluZzogJHt0YWd9YCk7XG5cbmFzc2VydFBhc3NhYmxlKGhhcmRlbihwYXlsb2FkKSk7XG5yZXR1cm4gaGFyZGVuKFxuY3JlYXRlKG9iamVjdFByb3RvdHlwZSx7XG5bUEFTU19TVFlMRV06e3ZhbHVlOid0YWdnZWQnfSxcbltTeW1ib2wudG9TdHJpbmdUYWddOnt2YWx1ZTp0YWd9LFxucGF5bG9hZDp7dmFsdWU6cGF5bG9hZCxlbnVtZXJhYmxlOnRydWV9fSkpO1xuXG5cbiB9OyRo4oCNX29uY2UubWFrZVRhZ2dlZChtYWtlVGFnZ2VkKTtcbmhhcmRlbihtYWtlVGFnZ2VkKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlVGFnZ2VkIjpbIm1ha2VUYWdnZWQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA0CUOi7woAAC8KAAAKgAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9tYXJzaGFsLWp1c3Rpbi5qc3siaW1wb3J0cyI6WyIuL2VuY29kZVRvQ2FwRGF0YS5qcyIsIi4vaGVscGVycy9lcnJvci5qcyIsIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vaGVscGVycy9zeW1ib2wuanMiLCJAZW5kby9uYXQiXSwiZXhwb3J0cyI6WyJkZWNvZGVUb0p1c3RpbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBOYXQsUUNMQVNTLGdldEVycm9yQ29uc3RydWN0b3IsaXNPYmplY3QsQXRBdFByZWZpeFBhdHRlcm4scGFzc2FibGVTeW1ib2xGb3JOYW1lOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsIFskaOKAjV9hID0+IChOYXQgPSAkaOKAjV9hKV1dXV0sW1wiLi9lbmNvZGVUb0NhcERhdGEuanNcIiwgW1tcIlFDTEFTU1wiLCBbJGjigI1fYSA9PiAoUUNMQVNTID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9lcnJvci5qc1wiLCBbW1wiZ2V0RXJyb3JDb25zdHJ1Y3RvclwiLCBbJGjigI1fYSA9PiAoZ2V0RXJyb3JDb25zdHJ1Y3RvciA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvc3ltYm9sLmpzXCIsIFtbXCJBdEF0UHJlZml4UGF0dGVyblwiLCBbJGjigI1fYSA9PiAoQXRBdFByZWZpeFBhdHRlcm4gPSAkaOKAjV9hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLCBbJGjigI1fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkVuY29kaW5nfSBFbmNvZGluZyAqL1xuXG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtzdHJpbmdpZnk6cXVvdGV9PUpTT047XG5jb25zdHtxdW90ZTpxLGRldGFpbHM6WCxGYWlsfT1hc3NlcnQ7XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSW5kZW50ZXJcbiAqIEBwcm9wZXJ0eSB7KG9wZW5CcmFja2V0OiBzdHJpbmcpID0+IG51bWJlcn0gb3BlblxuICogQHByb3BlcnR5IHsoKSA9PiBudW1iZXJ9IGxpbmVcbiAqIEBwcm9wZXJ0eSB7KHRva2VuOiBzdHJpbmcpID0+IG51bWJlcn0gbmV4dFxuICogQHByb3BlcnR5IHsoY2xvc2VCcmFja2V0OiBzdHJpbmcpID0+IG51bWJlcn0gY2xvc2VcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nfSBkb25lXG4gKi9cblxuLyoqXG4gKiBHZW5lcm91cyB3aGl0ZXNwYWNlIGZvciByZWFkYWJpbGl0eVxuICpcbiAqIEByZXR1cm5zIHtJbmRlbnRlcn1cbiAqL1xuY29uc3QgbWFrZVllc0luZGVudGVyPSgpPT57XG5jb25zdCBzdHJpbmdzPVtdO1xubGV0IGxldmVsPTA7XG5sZXQgbmVlZFNwYWNlPWZhbHNlO1xuY29uc3QgbGluZT0oKT0+e1xubmVlZFNwYWNlPWZhbHNlO1xucmV0dXJuIHN0cmluZ3MucHVzaCgnXFxuJywnICAnLnJlcGVhdChsZXZlbCkpO1xuIH07XG5yZXR1cm4gaGFyZGVuKHtcbm9wZW46KG9wZW5CcmFja2V0KT0+e1xubGV2ZWwrPTE7XG5pZihuZWVkU3BhY2Upe1xuc3RyaW5ncy5wdXNoKCcgJyk7XG4gfVxubmVlZFNwYWNlPWZhbHNlO1xucmV0dXJuIHN0cmluZ3MucHVzaChvcGVuQnJhY2tldCk7XG4gfSxcbmxpbmUsXG5uZXh0Oih0b2tlbik9PntcbmlmKG5lZWRTcGFjZSYmdG9rZW4hPT0nLCcpe1xuc3RyaW5ncy5wdXNoKCcgJyk7XG4gfVxubmVlZFNwYWNlPXRydWU7XG5yZXR1cm4gc3RyaW5ncy5wdXNoKHRva2VuKTtcbiB9LFxuY2xvc2U6KGNsb3NlQnJhY2tldCk9PntcbmFzc2VydChsZXZlbD49MSk7XG5sZXZlbC09MTtcbmxpbmUoKTtcbnJldHVybiBzdHJpbmdzLnB1c2goY2xvc2VCcmFja2V0KTtcbiB9LFxuZG9uZTooKT0+e1xuYXNzZXJ0LmVxdWFsKGxldmVsLDApO1xucmV0dXJuIHN0cmluZ3Muam9pbignJyk7XG4gfX0pO1xuXG4gfTtcblxuLyoqXG4gKiBJZiB0aGUgbGFzdCBjaGFyYWN0ZXIgb2Ygb25lIHRva2VuIHRvZ2V0aGVyIHdpdGggdGhlIGZpcnN0IGNoYXJhY3RlclxuICogb2YgdGhlIG5leHQgdG9rZW4gbWF0Y2hlcyB0aGlzIHBhdHRlcm4sIHRoZW4gdGhlIHR3byB0b2tlbnMgbXVzdCBiZVxuICogc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UgdG8gcHJlc2VydmUgdGhlaXIgbWVhbmluZy4gT3RoZXJ3aXNlIHRoZVxuICogd2hpdGVzcGFjZSBpbiB1bm5lY2Vzc2FyeS5cbiAqXG4gKiBUaGUgYDwhYCBhbmQgYC0+YCBjYXNlcyBwcmV2ZW50IHRoZSBhY2NpZGVudGFsIGZvcm1hdGlvbiBvZiBhblxuICogaHRtbC1saWtlIGNvbW1lbnQuIEkgZG9uJ3QgdGhpbmsgdGhlIGRvdWJsZSBhbmdsZSBicmFja2V0cyBhcmUgYWN0dWFsbHlcbiAqIG5lZWRlZCBidXQgSSBoYXZlbid0IHRob3VnaHQgYWJvdXQgaXQgZW5vdWdoIHRvIHJlbW92ZSB0aGVtLlxuICovXG5jb25zdCBiYWRQYWlyUGF0dGVybj0vXig/Olxcd1xcd3w8PHw+PnxcXCtcXCt8LS18PCF8LT4pJC87XG5cbi8qKlxuICogTWluaW11bSB3aGl0ZXNwYWNlIG5lZWRlZCB0byBwcmVzZXZlIG1lYW5pbmcuXG4gKlxuICogQHJldHVybnMge0luZGVudGVyfVxuICovXG5jb25zdCBtYWtlTm9JbmRlbnRlcj0oKT0+e1xuY29uc3Qgc3RyaW5ncz1bXTtcbnJldHVybiBoYXJkZW4oe1xub3Blbjoob3BlbkJyYWNrZXQpPT5zdHJpbmdzLnB1c2gob3BlbkJyYWNrZXQpLFxubGluZTooKT0+c3RyaW5ncy5sZW5ndGgsXG5uZXh0Oih0b2tlbik9PntcbmlmKHN0cmluZ3MubGVuZ3RoPj0xKXtcbmNvbnN0IGxhc3Q9c3RyaW5nc1tzdHJpbmdzLmxlbmd0aC0xXTtcbmlmKGxhc3QubGVuZ3RoPj0xJiZ0b2tlbi5sZW5ndGg+PTEpe1xuY29uc3QgcGFpcj0gYCR7bGFzdFtsYXN0Lmxlbmd0aC0xXX0ke3Rva2VuWzBdfWA7XG5pZihiYWRQYWlyUGF0dGVybi50ZXN0KHBhaXIpKXtcbnN0cmluZ3MucHVzaCgnICcpO1xuIH1cbiB9XG4gfVxucmV0dXJuIHN0cmluZ3MucHVzaCh0b2tlbik7XG4gfSxcbmNsb3NlOihjbG9zZUJyYWNrZXQpPT57XG5pZihzdHJpbmdzLmxlbmd0aD49MSYmc3RyaW5nc1tzdHJpbmdzLmxlbmd0aC0xXT09PScsJyl7XG5zdHJpbmdzLnBvcCgpO1xuIH1cbnJldHVybiBzdHJpbmdzLnB1c2goY2xvc2VCcmFja2V0KTtcbiB9LFxuZG9uZTooKT0+c3RyaW5ncy5qb2luKCcnKX0pO1xuXG4gfTtcblxuY29uc3QgaWRlbnRQYXR0ZXJuPS9eW2EtekEtWl1cXHcqJC87XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGluZ30gZW5jb2RpbmdcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHNob3VsZEluZGVudFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZGVjb2RlVG9KdXN0aW49KGVuY29kaW5nLHNob3VsZEluZGVudD1mYWxzZSk9Pntcbi8qKlxuICogVGhlIGZpcnN0IHBhc3MgZG9lcyBzb21lIGlucHV0IHZhbGlkYXRpb24uXG4gKiBJdHMgY29udHJvbCBmbG93IHNob3VsZCBtaXJyb3IgYHJlY3VyYCBhcyBjbG9zZWx5IGFzIHBvc3NpYmxlXG4gKiBhbmQgdGhlIHR3byBzaG91bGQgYmUgbWFpbnRhaW5lZCB0b2dldGhlci4gVGhleSBtdXN0IHZpc2l0IGV2ZXJ5dGhpbmdcbiAqIGluIHRoZSBzYW1lIG9yZGVyLlxuICpcbiAqIFRPRE8gbm93IHRoYXQgaWJpZHMgYXJlIGdvbmUsIHdlIHNob3VsZCBmb2xkIHRoaXMgYmFjayB0b2dldGhlciBpbnRvXG4gKiBvbmUgdmFsaWRhdGluZyBwYXNzLlxuICpcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IHJhd1RyZWVcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCBwcmVwYXJlPShyYXdUcmVlKT0+e1xuaWYoIWlzT2JqZWN0KHJhd1RyZWUpKXtcbnJldHVybjtcbiB9XG4vKiBBc3NlcnRpb25zIG9mIHRoZSBhYm92ZSB0byBuYXJyb3cgdGhlIHR5cGUuKi9cbmFzc2VydC50eXBlb2YocmF3VHJlZSwnb2JqZWN0Jyk7XG5hc3NlcnQocmF3VHJlZSE9PW51bGwpO1xuaWYoUUNMQVNTIGluIHJhd1RyZWUpe1xuY29uc3QgcWNsYXNzPXJhd1RyZWVbUUNMQVNTXTtcbmFzc2VydC50eXBlb2YoXG5xY2xhc3MsXG4nc3RyaW5nJyxcblggYGludmFsaWQgcWNsYXNzIHR5cGVvZiAke3EodHlwZW9mIHFjbGFzcyl9YCk7XG5cbmFzc2VydCghaXNBcnJheShyYXdUcmVlKSk7XG5zd2l0Y2gocmF3VHJlZVsnQHFjbGFzcyddKXtcbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnTmFOJzpcbmNhc2UnSW5maW5pdHknOlxuY2FzZSctSW5maW5pdHknOntcbnJldHVybjtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xuY29uc3R7ZGlnaXRzfT1yYXdUcmVlO1xuYXNzZXJ0LnR5cGVvZihcbmRpZ2l0cyxcbidzdHJpbmcnLFxuWCBgaW52YWxpZCBkaWdpdHMgdHlwZW9mICR7cSh0eXBlb2YgZGlnaXRzKX1gKTtcblxucmV0dXJuO1xuIH1cbmNhc2UnQEBhc3luY0l0ZXJhdG9yJzp7XG5yZXR1cm47XG4gfVxuY2FzZSdzeW1ib2wnOntcbmNvbnN0e25hbWV9PXJhd1RyZWU7XG5jb25zdCBzeW09cGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuYXNzZXJ0LnR5cGVvZihzeW0sJ3N5bWJvbCcpO1xucmV0dXJuO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdHt0YWcscGF5bG9hZH09cmF3VHJlZTtcbmFzc2VydC50eXBlb2YodGFnLCdzdHJpbmcnKTtcbnByZXBhcmUocGF5bG9hZCk7XG5yZXR1cm47XG4gfVxuY2FzZSdzbG90Jzp7XG5jb25zdHtpbmRleCxpZmFjZX09cmF3VHJlZTtcbmFzc2VydC50eXBlb2YoaW5kZXgsJ251bWJlcicpO1xuTmF0KGluZGV4KTtcbmlmKGlmYWNlIT09dW5kZWZpbmVkKXtcbmFzc2VydC50eXBlb2YoaWZhY2UsJ3N0cmluZycpO1xuIH1cbnJldHVybjtcbiB9XG5jYXNlJ2hpbGJlcnQnOntcbmNvbnN0e29yaWdpbmFsLHJlc3R9PXJhd1RyZWU7XG4nb3JpZ2luYWwnaW4gcmF3VHJlZXx8XG5GYWlsIGBJbnZhbGlkIEhpbGJlcnQgSG90ZWwgZW5jb2RpbmcgJHtyYXdUcmVlfWA7XG5wcmVwYXJlKG9yaWdpbmFsKTtcbmlmKCdyZXN0J2luIHJhd1RyZWUpe1xuYXNzZXJ0LnR5cGVvZihcbnJlc3QsXG4nb2JqZWN0JyxcblggYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdGApO1xuXG5pZihyZXN0PT09bnVsbCl7XG50aHJvdyBGYWlsIGBSZXN0ICR7cmVzdH0gZW5jb2RpbmcgbXVzdCBub3QgYmUgbnVsbGA7XG4gfVxuIWlzQXJyYXkocmVzdCl8fEZhaWwgYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IG5vdCBiZSBhbiBhcnJheWA7XG4hKFFDTEFTUyBpbiByZXN0KXx8XG5GYWlsIGBSZXN0IGVuY29kaW5nICR7cmVzdH0gbXVzdCBub3QgY29udGFpbiAke3EoUUNMQVNTKX1gO1xuY29uc3QgbmFtZXM9b3duS2V5cyhyZXN0KTtcbmZvcihjb25zdCBuYW1lIG9mIG5hbWVzKXtcbmFzc2VydC50eXBlb2YoXG5uYW1lLFxuJ3N0cmluZycsXG5YIGBQcm9wZXJ0eSBuYW1lICR7bmFtZX0gb2YgJHtyYXdUcmVlfSBtdXN0IGJlIGEgc3RyaW5nYCk7XG5cbnByZXBhcmUocmVzdFtuYW1lXSk7XG4gfVxuIH1cbnJldHVybjtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5jb25zdHtuYW1lLG1lc3NhZ2V9PXJhd1RyZWU7XG5hc3NlcnQudHlwZW9mKFxubmFtZSxcbidzdHJpbmcnLFxuWCBgaW52YWxpZCBlcnJvciBuYW1lIHR5cGVvZiAke3EodHlwZW9mIG5hbWUpfWApO1xuXG5nZXRFcnJvckNvbnN0cnVjdG9yKG5hbWUpIT09dW5kZWZpbmVkfHxcbkZhaWwgYE11c3QgYmUgdGhlIG5hbWUgb2YgYW4gRXJyb3IgY29uc3RydWN0b3IgJHtuYW1lfWA7XG5hc3NlcnQudHlwZW9mKFxubWVzc2FnZSxcbidzdHJpbmcnLFxuWCBgaW52YWxpZCBlcnJvciBtZXNzYWdlIHR5cGVvZiAke3EodHlwZW9mIG1lc3NhZ2UpfWApO1xuXG5yZXR1cm47XG4gfVxuXG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFggYHVucmVjb2duaXplZCAke3EoUUNMQVNTKX0gJHtxKHFjbGFzcyl9YCxUeXBlRXJyb3IpO1xuIH19XG5cbiB9ZWxzZSBpZihpc0FycmF5KHJhd1RyZWUpKXtcbmNvbnN0e2xlbmd0aH09cmF3VHJlZTtcbmZvcihsZXQgaT0wO2k8bGVuZ3RoO2krPTEpe1xucHJlcGFyZShyYXdUcmVlW2ldKTtcbiB9XG4gfWVsc2V7XG5jb25zdCBuYW1lcz1vd25LZXlzKHJhd1RyZWUpO1xuZm9yKGNvbnN0IG5hbWUgb2YgbmFtZXMpe1xuYXNzZXJ0LnR5cGVvZihcbm5hbWUsXG4nc3RyaW5nJyxcblggYFByb3BlcnR5IG5hbWUgJHtuYW1lfSBvZiAke3Jhd1RyZWV9IG11c3QgYmUgYSBzdHJpbmdgKTtcblxucHJlcGFyZShyYXdUcmVlW25hbWVdKTtcbiB9XG4gfVxuIH07XG5cbmNvbnN0IG1ha2VJbmRlbnRlcj1zaG91bGRJbmRlbnQ/bWFrZVllc0luZGVudGVyOm1ha2VOb0luZGVudGVyO1xuY29uc3Qgb3V0PW1ha2VJbmRlbnRlcigpO1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIHNlY29uZCBwYXNzIHJlY3Vyc2lvbiBhZnRlciB0aGUgZmlyc3QgcGFzcyBgcHJlcGFyZWAuXG4gKiBUaGUgZmlyc3QgcGFzcyBkaWQgc29tZSBpbnB1dCB2YWxpZGF0aW9uIHNvXG4gKiBoZXJlIHdlIGNhbiBzYWZlbHkgYXNzdW1lIGV2ZXJ5dGhpbmcgdGhvc2UgdGhpbmdzIGFyZSB2YWxpZGF0ZWQuXG4gKlxuICogQHBhcmFtIHtFbmNvZGluZ30gcmF3VHJlZVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuY29uc3QgZGVjb2RlPShyYXdUcmVlKT0+e1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbnJldHVybiByZWN1cihyYXdUcmVlKTtcbiB9O1xuXG5jb25zdCBkZWNvZGVQcm9wZXJ0eT0obmFtZSx2YWx1ZSk9Pntcbm91dC5saW5lKCk7XG5pZihuYW1lPT09J19fcHJvdG9fXycpe1xuLyogSmF2YVNjcmlwdCBpbnRlcnByZXRzIGB7X19wcm90b19fOiB4LCAuLi59YCovXG4vKiBhcyBtYWtpbmcgYW4gb2JqZWN0IGluaGVyaXRpbmcgZnJvbSBgeGAsIHdoZXJlYXMqL1xuLyogaW4gSlNPTiBpdCBpcyBzaW1wbHkgYSBwcm9wZXJ0eSBuYW1lLiBQcmVzZXJ2ZSB0aGUqL1xuLyogSlNPTiBtZWFuaW5nLiovXG5vdXQubmV4dCggYFtcIl9fcHJvdG9fX1wiXTpgKTtcbiB9ZWxzZSBpZihpZGVudFBhdHRlcm4udGVzdChuYW1lKSl7XG5vdXQubmV4dCggYCR7bmFtZX06YCk7XG4gfWVsc2V7XG5vdXQubmV4dCggYCR7cXVvdGUobmFtZSl9OmApO1xuIH1cbmRlY29kZSh2YWx1ZSk7XG5vdXQubmV4dCgnLCcpO1xuIH07XG5cbi8qKlxuICogTW9kZWxlZCBhZnRlciBgZnVsbFJldml2ZWAgaW4gbWFyc2hhbC5qc1xuICpcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IHJhd1RyZWVcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmNvbnN0IHJlY3VyPShyYXdUcmVlKT0+e1xuaWYoIWlzT2JqZWN0KHJhd1RyZWUpKXtcbi8qIHByaW1pdGl2ZXMgZ2V0IHF1b3RlZCovXG5yZXR1cm4gb3V0Lm5leHQocXVvdGUocmF3VHJlZSkpO1xuIH1cbi8qIEFzc2VydGlvbnMgb2YgdGhlIGFib3ZlIHRvIG5hcnJvdyB0aGUgdHlwZS4qL1xuYXNzZXJ0LnR5cGVvZihyYXdUcmVlLCdvYmplY3QnKTtcbmFzc2VydChyYXdUcmVlIT09bnVsbCk7XG5pZihRQ0xBU1MgaW4gcmF3VHJlZSl7XG5jb25zdCBxY2xhc3M9cmF3VHJlZVtRQ0xBU1NdO1xuYXNzZXJ0LnR5cGVvZihxY2xhc3MsJ3N0cmluZycpO1xuYXNzZXJ0KCFpc0FycmF5KHJhd1RyZWUpKTtcbi8qIFN3aXRjaGluZyBvbiBgZW5jb2RlZFtRQ0xBU1NdYCAob3IgYW55dGhpbmcgbGVzcyBkaXJlY3QsIGxpa2UqL1xuLyogYHFjbGFzc2ApIGRvZXMgbm90IGRpc2NyaW1pbmF0ZSByYXdUcmVlIGluIHR5cGVzY3JpcHRANC4yLjMgYW5kKi9cbi8qIGVhcmxpZXIuKi9cbnN3aXRjaChyYXdUcmVlWydAcWNsYXNzJ10pe1xuLyogRW5jb2Rpbmcgb2YgcHJpbWl0aXZlcyBub3QgaGFuZGxlZCBieSBKU09OKi9cbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnTmFOJzpcbmNhc2UnSW5maW5pdHknOlxuY2FzZSctSW5maW5pdHknOntcbi8qIFRoZWlyIHFjbGFzcyBpcyB0aGVpciBleHByZXNzaW9uIHNvdXJjZS4qL1xucmV0dXJuIG91dC5uZXh0KHFjbGFzcyk7XG4gfVxuY2FzZSdiaWdpbnQnOntcbmNvbnN0e2RpZ2l0c309cmF3VHJlZTtcbnJldHVybiBvdXQubmV4dCggYCR7QmlnSW50KGRpZ2l0cyl9bmApO1xuIH1cbmNhc2UnQEBhc3luY0l0ZXJhdG9yJzp7XG4vKiBUT0RPIGRlcHJlY2F0ZWQuIEV2ZW50dWFsbHkgcmVtb3ZlLiovXG5yZXR1cm4gb3V0Lm5leHQoJ1N5bWJvbC5hc3luY0l0ZXJhdG9yJyk7XG4gfVxuY2FzZSdzeW1ib2wnOntcbmNvbnN0e25hbWV9PXJhd1RyZWU7XG5jb25zdCBzeW09cGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuYXNzZXJ0LnR5cGVvZihzeW0sJ3N5bWJvbCcpO1xuY29uc3QgcmVnaXN0ZXJlZE5hbWU9U3ltYm9sLmtleUZvcihzeW0pO1xuaWYocmVnaXN0ZXJlZE5hbWU9PT11bmRlZmluZWQpe1xuY29uc3QgbWF0Y2g9QXRBdFByZWZpeFBhdHRlcm4uZXhlYyhuYW1lKTtcbmFzc2VydChtYXRjaCE9PW51bGwpO1xuY29uc3Qgc3VmZml4PW1hdGNoWzFdO1xuYXNzZXJ0KFN5bWJvbFtzdWZmaXhdPT09c3ltKTtcbmFzc2VydChpZGVudFBhdHRlcm4udGVzdChzdWZmaXgpKTtcbnJldHVybiBvdXQubmV4dCggYFN5bWJvbC4ke3N1ZmZpeH1gKTtcbiB9XG5yZXR1cm4gb3V0Lm5leHQoIGBTeW1ib2wuZm9yKCR7cXVvdGUocmVnaXN0ZXJlZE5hbWUpfSlgKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuY29uc3R7dGFnLHBheWxvYWR9PXJhd1RyZWU7XG5vdXQubmV4dCggYG1ha2VUYWdnZWQoJHtxdW90ZSh0YWcpfSxgKTtcbmRlY29kZShwYXlsb2FkKTtcbnJldHVybiBvdXQubmV4dCgnKScpO1xuIH1cblxuY2FzZSdzbG90Jzp7XG5sZXR7aW5kZXgsaWZhY2V9PXJhd1RyZWU7XG5pbmRleD1OdW1iZXIoTmF0KGluZGV4KSk7XG5pZihpZmFjZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gb3V0Lm5leHQoIGBzbG90KCR7aW5kZXh9KWApO1xuIH1lbHNle1xuaWZhY2U9cXVvdGUoaWZhY2UpO1xucmV0dXJuIG91dC5uZXh0KCBgc2xvdCgke2luZGV4fSwke2lmYWNlfSlgKTtcbiB9XG4gfVxuXG5jYXNlJ2hpbGJlcnQnOntcbmNvbnN0e29yaWdpbmFsLHJlc3R9PXJhd1RyZWU7XG5vdXQub3BlbigneycpO1xuZGVjb2RlUHJvcGVydHkoUUNMQVNTLG9yaWdpbmFsKTtcbmlmKCdyZXN0J2luIHJhd1RyZWUpe1xuYXNzZXJ0LnR5cGVvZihyZXN0LCdvYmplY3QnKTtcbmFzc2VydChyZXN0IT09bnVsbCk7XG5jb25zdCBuYW1lcz1vd25LZXlzKHJlc3QpO1xuZm9yKGNvbnN0IG5hbWUgb2YgbmFtZXMpe1xuYXNzZXJ0LnR5cGVvZihcbm5hbWUsXG4nc3RyaW5nJyxcblggYFByb3BlcnR5IG5hbWUgJHtuYW1lfSBvZiAke3Jlc3R9IG11c3QgYmUgYSBzdHJpbmdgKTtcblxuZGVjb2RlUHJvcGVydHkobmFtZSxyZXN0W25hbWVdKTtcbiB9XG4gfVxucmV0dXJuIG91dC5jbG9zZSgnfScpO1xuIH1cblxuY2FzZSdlcnJvcic6e1xuY29uc3R7bmFtZSxtZXNzYWdlfT1yYXdUcmVlO1xucmV0dXJuIG91dC5uZXh0KCBgJHtuYW1lfSgke3F1b3RlKG1lc3NhZ2UpfSlgKTtcbiB9XG5cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoWCBgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLFR5cGVFcnJvcik7XG4gfX1cblxuIH1lbHNlIGlmKGlzQXJyYXkocmF3VHJlZSkpe1xuY29uc3R7bGVuZ3RofT1yYXdUcmVlO1xuaWYobGVuZ3RoPT09MCl7XG5yZXR1cm4gb3V0Lm5leHQoJ1tdJyk7XG4gfWVsc2V7XG5vdXQub3BlbignWycpO1xuZm9yKGxldCBpPTA7aTxsZW5ndGg7aSs9MSl7XG5vdXQubGluZSgpO1xuZGVjb2RlKHJhd1RyZWVbaV0pO1xub3V0Lm5leHQoJywnKTtcbiB9XG5yZXR1cm4gb3V0LmNsb3NlKCddJyk7XG4gfVxuIH1lbHNle1xuLyogcmF3VHJlZSBpcyBhbiBgRW5jb2RpbmdSZWNvcmRgIHdoaWNoIG9ubHkgaGFzIHN0cmluZyBrZXlzLCovXG4vKiBidXQgc2luY2Ugb3duS2V5cyBpcyBub3QgZ2VuZXJpYywgaXQgY2FuJ3QgcHJvcGFnYXRlIHRoYXQqL1xuY29uc3QgbmFtZXM9LyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9vd25LZXlzKHJhd1RyZWUpO1xuaWYobmFtZXMubGVuZ3RoPT09MCl7XG5yZXR1cm4gb3V0Lm5leHQoJ3t9Jyk7XG4gfWVsc2V7XG5vdXQub3BlbigneycpO1xuZm9yKGNvbnN0IG5hbWUgb2YgbmFtZXMpe1xuZGVjb2RlUHJvcGVydHkobmFtZSxyYXdUcmVlW25hbWVdKTtcbiB9XG5yZXR1cm4gb3V0LmNsb3NlKCd9Jyk7XG4gfVxuIH1cbiB9O1xucHJlcGFyZShlbmNvZGluZyk7XG5kZWNvZGUoZW5jb2RpbmcpO1xucmV0dXJuIG91dC5kb25lKCk7XG4gfTskaOKAjV9vbmNlLmRlY29kZVRvSnVzdGluKGRlY29kZVRvSnVzdGluKTtcbmhhcmRlbihkZWNvZGVUb0p1c3Rpbik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVjb2RlVG9KdXN0aW4iOlsiZGVjb2RlVG9KdXN0aW4iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAMteTRcMGAADDBgAALQAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qc3siaW1wb3J0cyI6WyIuL21hcnNoYWwuanMiXSwiZXhwb3J0cyI6WyJwYXJzZSIsInN0cmluZ2lmeSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBtYWtlTWFyc2hhbDskaOKAjV9pbXBvcnRzKFtbXCIuL21hcnNoYWwuanNcIiwgW1tcIm1ha2VNYXJzaGFsXCIsIFskaOKAjV9hID0+IChtYWtlTWFyc2hhbCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuXG4vKiogQHR5cGUge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db252ZXJ0VmFsVG9TbG90PGFueT59ICovXG5jb25zdCBkb05vdENvbnZlcnRWYWxUb1Nsb3Q9KHZhbCk9PlxuRmFpbCBgTWFyc2hhbCdzIHN0cmluZ2lmeSByZWplY3RzIHByZXNlbmNlcyBhbmQgcHJvbWlzZXMgJHt2YWx9YDtcblxuLyoqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29udmVydFNsb3RUb1ZhbDxhbnk+fSAqL1xuY29uc3QgZG9Ob3RDb252ZXJ0U2xvdFRvVmFsPShzbG90LF9pZmFjZSk9PlxuRmFpbCBgTWFyc2hhbCdzIHBhcnNlIG11c3Qgbm90IGVuY29kZSBhbnkgc2xvdHMgJHtzbG90fWA7XG5cbmNvbnN0IGJhZEFycmF5SGFuZGxlcj1oYXJkZW4oe1xuZ2V0OihfdGFyZ2V0LG5hbWUsX3JlY2VpdmVyKT0+e1xuaWYobmFtZT09PSdsZW5ndGgnKXtcbnJldHVybiAwO1xuIH1cbi8qIGB0aHJvd2AgaXMgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLiBCdXQgbGludGVyIGNvbmZ1c2VkKi9cbnRocm93IEZhaWwgYE1hcnNoYWwncyBwYXJzZSBtdXN0IG5vdCBlbmNvZGUgYW55IHNsb3QgcG9zaXRpb25zICR7bmFtZX1gO1xuIH19KTtcblxuXG5jb25zdCBiYWRBcnJheT1oYXJkZW4obmV3IFByb3h5KGhhcmRlbihbXSksYmFkQXJyYXlIYW5kbGVyKSk7XG5cbmNvbnN0e3NlcmlhbGl6ZSx1bnNlcmlhbGl6ZX09bWFrZU1hcnNoYWwoXG5kb05vdENvbnZlcnRWYWxUb1Nsb3QsXG5kb05vdENvbnZlcnRTbG90VG9WYWwsXG57XG5lcnJvclRhZ2dpbmc6J29mZicsXG4vKiBUT0RPIGZpeCB0ZXN0cyB0byB3b3JrcyB3aXRoIHNtYWxsY2Fwcy4qL1xuc2VyaWFsaXplQm9keUZvcm1hdDonY2FwZGF0YSd9KTtcblxuXG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBzdHJpbmdpZnk9KHZhbCk9PnNlcmlhbGl6ZSh2YWwpLmJvZHk7JGjigI1fb25jZS5zdHJpbmdpZnkoc3RyaW5naWZ5KTtcbmhhcmRlbihzdHJpbmdpZnkpO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEByZXR1cm5zIHtQYXNzYWJsZX1cbiAqL1xuY29uc3QgcGFyc2U9KHN0cik9PlxudW5zZXJpYWxpemUoXG5oYXJkZW4oe1xuYm9keTpzdHIsXG5zbG90czpiYWRBcnJheX0pKTskaOKAjV9vbmNlLnBhcnNlKHBhcnNlKTtcblxuXG5oYXJkZW4ocGFyc2UpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InN0cmluZ2lmeSI6WyJzdHJpbmdpZnkiXSwicGFyc2UiOlsicGFyc2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAad/d+VUyAABVMgAAIwAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9tYXJzaGFsLmpzeyJpbXBvcnRzIjpbIi4vZW5jb2RlVG9DYXBEYXRhLmpzIiwiLi9lbmNvZGVUb1NtYWxsY2Fwcy5qcyIsIi4vaGVscGVycy9lcnJvci5qcyIsIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vaGVscGVycy9yZW1vdGFibGUuanMiLCIuL3Bhc3NTdHlsZU9mLmpzIiwiQGVuZG8vbmF0Il0sImV4cG9ydHMiOlsibWFrZU1hcnNoYWwiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgTmF0LGFzc2VydFBhc3NhYmxlLGdldEludGVyZmFjZU9mLGdldEVycm9yQ29uc3RydWN0b3IsUUNMQVNTLG1ha2VFbmNvZGVUb0NhcERhdGEsbWFrZURlY29kZUZyb21DYXBEYXRhLG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzLG1ha2VFbmNvZGVUb1NtYWxsY2FwcyxoYXNPd25Qcm9wZXJ0eU9mOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsIFskaOKAjV9hID0+IChOYXQgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9yZW1vdGFibGUuanNcIiwgW1tcImdldEludGVyZmFjZU9mXCIsIFskaOKAjV9hID0+IChnZXRJbnRlcmZhY2VPZiA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvZXJyb3IuanNcIiwgW1tcImdldEVycm9yQ29uc3RydWN0b3JcIiwgWyRo4oCNX2EgPT4gKGdldEVycm9yQ29uc3RydWN0b3IgPSAkaOKAjV9hKV1dXV0sW1wiLi9lbmNvZGVUb0NhcERhdGEuanNcIiwgW1tcIlFDTEFTU1wiLCBbJGjigI1fYSA9PiAoUUNMQVNTID0gJGjigI1fYSldXSxbXCJtYWtlRW5jb2RlVG9DYXBEYXRhXCIsIFskaOKAjV9hID0+IChtYWtlRW5jb2RlVG9DYXBEYXRhID0gJGjigI1fYSldXSxbXCJtYWtlRGVjb2RlRnJvbUNhcERhdGFcIiwgWyRo4oCNX2EgPT4gKG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSA9ICRo4oCNX2EpXV1dXSxbXCIuL2VuY29kZVRvU21hbGxjYXBzLmpzXCIsIFtbXCJtYWtlRGVjb2RlRnJvbVNtYWxsY2Fwc1wiLCBbJGjigI1fYSA9PiAobWFrZURlY29kZUZyb21TbWFsbGNhcHMgPSAkaOKAjV9hKV1dLFtcIm1ha2VFbmNvZGVUb1NtYWxsY2Fwc1wiLCBbJGjigI1fYSA9PiAobWFrZUVuY29kZVRvU21hbGxjYXBzID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5NYWtlTWFyc2hhbE9wdGlvbnN9IE1ha2VNYXJzaGFsT3B0aW9ucyAqL1xuLyoqIEB0ZW1wbGF0ZSBTbG90IEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29udmVydFNsb3RUb1ZhbDxTbG90Pn0gQ29udmVydFNsb3RUb1ZhbCAqL1xuLyoqIEB0ZW1wbGF0ZSBTbG90IEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29udmVydFZhbFRvU2xvdDxTbG90Pn0gQ29udmVydFZhbFRvU2xvdCAqL1xuLyoqIEB0ZW1wbGF0ZSBTbG90IEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuU2VyaWFsaXplPFNsb3Q+fSBTZXJpYWxpemUgKi9cbi8qKiBAdGVtcGxhdGUgU2xvdCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlVuc2VyaWFsaXplPFNsb3Q+fSBVbnNlcmlhbGl6ZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5JbnRlcmZhY2VTcGVjfSBJbnRlcmZhY2VTcGVjICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5FbmNvZGluZ30gRW5jb2RpbmcgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJlbW90YWJsZX0gUmVtb3RhYmxlICovXG5cbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7ZGV0YWlsczpYLEZhaWwscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqIEB0eXBlIHtDb252ZXJ0VmFsVG9TbG90PGFueT59ICovXG5jb25zdCBkZWZhdWx0VmFsVG9TbG90Rm49KHgpPT54O1xuLyoqIEB0eXBlIHtDb252ZXJ0U2xvdFRvVmFsPGFueT59ICovXG5jb25zdCBkZWZhdWx0U2xvdFRvVmFsRm49KHgsXyk9Png7XG5cbi8qKlxuICogQHRlbXBsYXRlIFNsb3RcbiAqIEBwYXJhbSB7Q29udmVydFZhbFRvU2xvdDxTbG90Pn0gW2NvbnZlcnRWYWxUb1Nsb3RdXG4gKiBAcGFyYW0ge0NvbnZlcnRTbG90VG9WYWw8U2xvdD59IFtjb252ZXJ0U2xvdFRvVmFsXVxuICogQHBhcmFtIHtNYWtlTWFyc2hhbE9wdGlvbnN9IG9wdGlvbnNcbiAqL1xuY29uc3QgICAgICAgIG1ha2VNYXJzaGFsPShcbmNvbnZlcnRWYWxUb1Nsb3Q9ZGVmYXVsdFZhbFRvU2xvdEZuLFxuY29udmVydFNsb3RUb1ZhbD1kZWZhdWx0U2xvdFRvVmFsRm4sXG57XG5lcnJvclRhZ2dpbmc9J29uJyxcbm1hcnNoYWxOYW1lPSdhbm9uLW1hcnNoYWwnLFxuLyogVE9ETyBUZW1wb3JhcnkgaGFjay4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMjc4MCovXG5lcnJvcklkTnVtPTEwMDAwLFxuLyogV2UgcHJlZmVyIHRoYXQgdGhlIGNhbGxlciBpbnN0ZWFkIGxvZyB0byBzb21ld2hlcmUgaGlkZGVuKi9cbi8qIHRvIGJlIHJldmVhbGVkIHdoZW4gY29ycmVsYXRpbmcgd2l0aCB0aGUgcmVjZWl2ZWQgZXJyb3IuKi9cbm1hcnNoYWxTYXZlRXJyb3I9KGVycik9PlxuY29uc29sZS5sb2coJ1RlbXBvcmFyeSBsb2dnaW5nIG9mIHNlbnQgZXJyb3InLGVyciksXG4vKiBEZWZhdWx0IHRvICdjYXBkYXRhJyBiZWNhdXNlIGl0IHdhcyBpbXBsZW1lbnRlZCBmaXJzdC4qL1xuLyogU29tZXRpbWVzLCBvbnRvZ2VueSBkb2VzIHJlY2FwaXR1bGF0ZSBwaHlsb2dlbnkgOykqL1xuc2VyaWFsaXplQm9keUZvcm1hdD0nY2FwZGF0YSd9PVxue30pPT5cbntcbmFzc2VydC50eXBlb2YobWFyc2hhbE5hbWUsJ3N0cmluZycpO1xuZXJyb3JUYWdnaW5nPT09J29uJ3x8XG5lcnJvclRhZ2dpbmc9PT0nb2ZmJ3x8XG5GYWlsIGBUaGUgZXJyb3JUYWdnaW5nIG9wdGlvbiBjYW4gb25seSBiZSBcIm9uXCIgb3IgXCJvZmZcIiAke2Vycm9yVGFnZ2luZ31gO1xuY29uc3QgbmV4dEVycm9ySWQ9KCk9PntcbmVycm9ySWROdW0rPTE7XG5yZXR1cm4gYGVycm9yOiR7bWFyc2hhbE5hbWV9IyR7ZXJyb3JJZE51bX1gO1xuIH07XG5cbi8qKlxuICogQHR5cGUge1NlcmlhbGl6ZTxTbG90Pn1cbiAqL1xuY29uc3Qgc2VyaWFsaXplPShyb290KT0+e1xuY29uc3Qgc2xvdHM9W107XG4vKiBtYXBzIHZhbCAocHJvbWlzZSBvciByZW1vdGFibGUpIHRvIGluZGV4IG9mIHNsb3RzW10qL1xuY29uc3Qgc2xvdE1hcD1uZXcgTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHtSZW1vdGFibGUgfCBQcm9taXNlfSBwYXNzYWJsZVxuICogQHJldHVybnMge3tpbmRleDogbnVtYmVyLCByZXBlYXQ6IGJvb2xlYW59fVxuICovXG5jb25zdCBlbmNvZGVTbG90Q29tbW9uPShwYXNzYWJsZSk9PntcbmxldCBpbmRleD1zbG90TWFwLmdldChwYXNzYWJsZSk7XG5pZihpbmRleCE9PXVuZGVmaW5lZCl7XG4vKiBUT0RPIGFzc2VydCB0aGF0IGl0J3MgdGhlIHNhbWUgaWZhY2UgYXMgYmVmb3JlKi9cbmFzc2VydC50eXBlb2YoaW5kZXgsJ251bWJlcicpO1xucmV0dXJuIGhhcmRlbih7aW5kZXgscmVwZWF0OnRydWV9KTtcbiB9XG5cbmluZGV4PXNsb3RzLmxlbmd0aDtcbmNvbnN0IHNsb3Q9Y29udmVydFZhbFRvU2xvdChwYXNzYWJsZSk7XG5zbG90cy5wdXNoKHNsb3QpO1xuc2xvdE1hcC5zZXQocGFzc2FibGUsaW5kZXgpO1xucmV0dXJuIGhhcmRlbih7aW5kZXgscmVwZWF0OmZhbHNlfSk7XG4gfTtcblxuLyoqXG4gKiBFdmVuIGlmIGFuIEVycm9yIGlzIG5vdCBhY3R1YWxseSBwYXNzYWJsZSwgd2UnZCByYXRoZXIgc2VuZFxuICogaXQgYW55d2F5IGJlY2F1c2UgdGhlIGRpYWdub3N0aWMgaW5mbyBjYXJyaWVkIGJ5IHRoZSBlcnJvclxuICogaXMgbW9yZSB2YWx1YWJsZSB0aGFuIGRpYWdub3Npbmcgd2h5IHRoZSBlcnJvciBpc24ndFxuICogcGFzc2FibGUuIFNlZSBjb21tZW50cyBpbiBFcnJvckhlbHBlci5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEBwYXJhbSB7KHA6IFBhc3NhYmxlKSA9PiB1bmtub3dufSBlbmNvZGVSZWN1clxuICogQHJldHVybnMge3tlcnJvcklkPzogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcsIG5hbWU6IHN0cmluZ319XG4gKi9cbmNvbnN0IGVuY29kZUVycm9yQ29tbW9uPShlcnIsZW5jb2RlUmVjdXIpPT57XG5jb25zdCBtZXNzYWdlPWVuY29kZVJlY3VyKCBgJHtlcnIubWVzc2FnZX1gKTtcbmFzc2VydC50eXBlb2YobWVzc2FnZSwnc3RyaW5nJyk7XG5jb25zdCBuYW1lPWVuY29kZVJlY3VyKCBgJHtlcnIubmFtZX1gKTtcbmFzc2VydC50eXBlb2YobmFtZSwnc3RyaW5nJyk7XG4vKiBNdXN0IGVuY29kZSBgY2F1c2VgLCBgZXJyb3JzYC4qL1xuLyogbmVzdGVkIG5vbi1wYXNzYWJsZSBlcnJvcnMgbXVzdCBiZSBvayBmcm9tIGhlcmUuKi9cbmlmKGVycm9yVGFnZ2luZz09PSdvbicpe1xuLyogV2UgZGVsaWJlcmF0ZWx5IGRvIG5vdCBzaGFyZSB0aGUgc3RhY2ssIGJ1dCBpdCB3b3VsZCovXG4vKiBiZSB1c2VmdWwgdG8gbG9nIHRoZSBzdGFjayBsb2NhbGx5IHNvIHNvbWVvbmUgd2hvIGhhcyovXG4vKiBwcml2aWxlZ2VkIGFjY2VzcyB0byB0aGUgdGhyb3dpbmcgVmF0IGNhbiBjb3JyZWxhdGUqL1xuLyogdGhlIHByb2JsZW0gd2l0aCB0aGUgcmVtb3RlIFZhdCB0aGF0IGdldHMgdGhpcyovXG4vKiBzdW1tYXJ5LiBJZiB3ZSBkbyB0aGF0LCB3ZSBjb3VsZCBhbGxvY2F0ZSBzb21lIHJhbmRvbSovXG4vKiBpZGVudGlmaWVyIGFuZCBpbmNsdWRlIGl0IGluIHRoZSBtZXNzYWdlLCB0byBoZWxwKi9cbi8qIHdpdGggdGhlIGNvcnJlbGF0aW9uLiovXG5jb25zdCBlcnJvcklkPWVuY29kZVJlY3VyKG5leHRFcnJvcklkKCkpO1xuYXNzZXJ0LnR5cGVvZihlcnJvcklkLCdzdHJpbmcnKTtcbmFzc2VydC5ub3RlKGVycixYIGBTZW50IGFzICR7ZXJyb3JJZH1gKTtcbm1hcnNoYWxTYXZlRXJyb3IoZXJyKTtcbnJldHVybiBoYXJkZW4oe2Vycm9ySWQsbWVzc2FnZSxuYW1lfSk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHttZXNzYWdlLG5hbWV9KTtcbiB9XG4gfTtcblxuaWYoc2VyaWFsaXplQm9keUZvcm1hdD09PSdjYXBkYXRhJyl7XG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhc3NhYmxlXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IFtpZmFjZV1cbiAqIEByZXR1cm5zIHtFbmNvZGluZ31cbiAqL1xuY29uc3QgZW5jb2RlU2xvdFRvQ2FwRGF0YT0ocGFzc2FibGUsaWZhY2U9dW5kZWZpbmVkKT0+e1xuY29uc3R7aW5kZXgscmVwZWF0fT1lbmNvZGVTbG90Q29tbW9uKHBhc3NhYmxlKTtcblxuaWYocmVwZWF0PT09dHJ1ZXx8aWZhY2U9PT11bmRlZmluZWQpe1xucmV0dXJuIGhhcmRlbih7W1FDTEFTU106J3Nsb3QnLGluZGV4fSk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHtbUUNMQVNTXTonc2xvdCcsaWZhY2UsaW5kZXh9KTtcbiB9XG4gfTtcblxuY29uc3QgZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhPSh2YWwsX2VuY29kZVJlY3VyKT0+XG5lbmNvZGVTbG90VG9DYXBEYXRhKHZhbCxnZXRJbnRlcmZhY2VPZih2YWwpKTtcblxuY29uc3QgZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YT0ocHJvbWlzZSxfZW5jb2RlUmVjdXIpPT5cbmVuY29kZVNsb3RUb0NhcERhdGEocHJvbWlzZSk7XG5cbi8qKlxuICogRXZlbiBpZiBhbiBFcnJvciBpcyBub3QgYWN0dWFsbHkgcGFzc2FibGUsIHdlJ2QgcmF0aGVyIHNlbmRcbiAqIGl0IGFueXdheSBiZWNhdXNlIHRoZSBkaWFnbm9zdGljIGluZm8gY2FycmllZCBieSB0aGUgZXJyb3JcbiAqIGlzIG1vcmUgdmFsdWFibGUgdGhhbiBkaWFnbm9zaW5nIHdoeSB0aGUgZXJyb3IgaXNuJ3RcbiAqIHBhc3NhYmxlLiBTZWUgY29tbWVudHMgaW4gRXJyb3JIZWxwZXIuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcGFyYW0geyhwOiBQYXNzYWJsZSkgPT4gRW5jb2Rpbmd9IGVuY29kZVJlY3VyXG4gKiBAcmV0dXJucyB7RW5jb2Rpbmd9XG4gKi9cbmNvbnN0IGVuY29kZUVycm9yVG9DYXBEYXRhPShlcnIsZW5jb2RlUmVjdXIpPT57XG5jb25zdCBlcnJEYXRhPWVuY29kZUVycm9yQ29tbW9uKGVycixlbmNvZGVSZWN1cik7XG5yZXR1cm4gaGFyZGVuKHtbUUNMQVNTXTonZXJyb3InLC4uLmVyckRhdGF9KTtcbiB9O1xuXG5jb25zdCBlbmNvZGVUb0NhcERhdGE9bWFrZUVuY29kZVRvQ2FwRGF0YSh7XG5lbmNvZGVSZW1vdGFibGVUb0NhcERhdGEsXG5lbmNvZGVQcm9taXNlVG9DYXBEYXRhLFxuZW5jb2RlRXJyb3JUb0NhcERhdGF9KTtcblxuXG5jb25zdCBlbmNvZGVkPWVuY29kZVRvQ2FwRGF0YShyb290KTtcbmNvbnN0IGJvZHk9SlNPTi5zdHJpbmdpZnkoZW5jb2RlZCk7XG5yZXR1cm4gaGFyZGVuKHtcbmJvZHksXG5zbG90c30pO1xuXG4gfWVsc2UgaWYoc2VyaWFsaXplQm9keUZvcm1hdD09PSdzbWFsbGNhcHMnKXtcbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeFxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGFzc2FibGVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gW2lmYWNlXVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZW5jb2RlU2xvdFRvU21hbGxjYXBzPShwcmVmaXgscGFzc2FibGUsaWZhY2U9dW5kZWZpbmVkKT0+e1xuY29uc3R7aW5kZXgscmVwZWF0fT1lbmNvZGVTbG90Q29tbW9uKHBhc3NhYmxlKTtcblxuLyogVE9ETyBleHBsb3JlIHJlbW92aW5nIHRoaXMgc3BlY2lhbCBjYXNlKi9cbmlmKHJlcGVhdD09PXRydWV8fGlmYWNlPT09dW5kZWZpbmVkKXtcbnJldHVybiBgJHtwcmVmaXh9JHtpbmRleH1gO1xuIH1cbnJldHVybiBgJHtwcmVmaXh9JHtpbmRleH0uJHtpZmFjZX1gO1xuIH07XG5cbmNvbnN0IGVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzPShyZW1vdGFibGUsX2VuY29kZVJlY3VyKT0+XG5lbmNvZGVTbG90VG9TbWFsbGNhcHMoJyQnLHJlbW90YWJsZSxnZXRJbnRlcmZhY2VPZihyZW1vdGFibGUpKTtcblxuY29uc3QgZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzPShwcm9taXNlLF9lbmNvZGVSZWN1cik9PlxuZW5jb2RlU2xvdFRvU21hbGxjYXBzKCcmJyxwcm9taXNlKTtcblxuY29uc3QgZW5jb2RlRXJyb3JUb1NtYWxsY2Fwcz0oZXJyLGVuY29kZVJlY3VyKT0+e1xuY29uc3QgZXJyRGF0YT1lbmNvZGVFcnJvckNvbW1vbihlcnIsZW5jb2RlUmVjdXIpO1xuY29uc3R7bWVzc2FnZSwuLi5yZXN0fT1lcnJEYXRhO1xucmV0dXJuIGhhcmRlbih7JyNlcnJvcic6bWVzc2FnZSwuLi5yZXN0fSk7XG4gfTtcblxuY29uc3QgZW5jb2RlVG9TbWFsbGNhcHM9bWFrZUVuY29kZVRvU21hbGxjYXBzKHtcbmVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzLFxuZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzLFxuZW5jb2RlRXJyb3JUb1NtYWxsY2Fwc30pO1xuXG5cbmNvbnN0IGVuY29kZWQ9ZW5jb2RlVG9TbWFsbGNhcHMocm9vdCk7XG5jb25zdCBzbWFsbGNhcHNCb2R5PUpTT04uc3RyaW5naWZ5KGVuY29kZWQpO1xucmV0dXJuIGhhcmRlbih7XG4vKiBWYWxpZCBKU09OIGNhbm5vdCBiZWdpbiB3aXRoIGEgJyMnLCBzbyB0aGlzIGlzIGEgdmFsaWQgc2lnbmFsKi9cbi8qIGluZGljYXRpbmcgc21hbGxjYXBzIGZvcm1hdC4qL1xuYm9keTogYCMke3NtYWxsY2Fwc0JvZHl9YCxcbnNsb3RzfSk7XG5cbiB9ZWxzZXtcbi8qIFRoZSBgdGhyb3dgIGlzIGEgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLiBBZGRlZCBmb3IgY29uZnVzZWQgbGludGVycy4qL1xudGhyb3cgRmFpbCBgVW5yZWNvZ25pemVkIHNlcmlhbGl6ZUJvZHlGb3JtYXQ6ICR7cShzZXJpYWxpemVCb2R5Rm9ybWF0KX1gO1xuIH1cbiB9O1xuXG5jb25zdCBtYWtlRnVsbFJldml2ZT0oc2xvdHMpPT57XG4vKiogQHR5cGUge01hcDxudW1iZXIsIFBhc3NhYmxlPn0gKi9cbmNvbnN0IHZhbE1hcD1uZXcgTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHt7aWZhY2U/OiBzdHJpbmcsIGluZGV4OiBudW1iZXJ9fSBzbG90RGF0YVxuICogQHJldHVybnMge1JlbW90YWJsZSB8IFByb21pc2V9XG4gKi9cbmNvbnN0IGRlY29kZVNsb3RDb21tb249KHNsb3REYXRhKT0+e1xuY29uc3R7aWZhY2U9dW5kZWZpbmVkLGluZGV4LC4uLnJlc3R9PXNsb3REYXRhO1xub3duS2V5cyhyZXN0KS5sZW5ndGg9PT0wfHxcbkZhaWwgYHVuZXhwZWN0ZWQgZW5jb2RlZCBzbG90IHByb3BlcnRpZXMgJHtxKG93bktleXMocmVzdCkpfWA7XG5pZih2YWxNYXAuaGFzKGluZGV4KSl7XG5yZXR1cm4gdmFsTWFwLmdldChpbmRleCk7XG4gfVxuLyogVE9ETyBTRUNVUklUWSBIQVpBUkQ6IG11c3QgZW5mb2NlIHRoYXQgcmVtb3RhYmxlIHZzIHByb21pc2UqL1xuLyogaXMgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGVkIHN0cmluZy4qL1xuY29uc3Qgc2xvdD1zbG90c1tOdW1iZXIoTmF0KGluZGV4KSldO1xuY29uc3QgdmFsPWNvbnZlcnRTbG90VG9WYWwoc2xvdCxpZmFjZSk7XG52YWxNYXAuc2V0KGluZGV4LHZhbCk7XG5yZXR1cm4gdmFsO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHt7ZXJyb3JJZD86IHN0cmluZywgbWVzc2FnZTogc3RyaW5nLCBuYW1lOiBzdHJpbmd9fSBlcnJEYXRhXG4gKiBAcGFyYW0geyhlOiB1bmtub3duKSA9PiBQYXNzYWJsZX0gZGVjb2RlUmVjdXJcbiAqIEByZXR1cm5zIHtFcnJvcn1cbiAqL1xuY29uc3QgZGVjb2RlRXJyb3JDb21tb249KGVyckRhdGEsZGVjb2RlUmVjdXIpPT57XG5jb25zdHtlcnJvcklkPXVuZGVmaW5lZCxtZXNzYWdlLG5hbWUsLi4ucmVzdH09ZXJyRGF0YTtcbm93bktleXMocmVzdCkubGVuZ3RoPT09MHx8XG5GYWlsIGB1bmV4cGVjdGVkIGVuY29kZWQgZXJyb3IgcHJvcGVydGllcyAke3Eob3duS2V5cyhyZXN0KSl9YDtcbi8qIFRPRE8gTXVzdCBkZWNvZGUgYGNhdXNlYCBhbmQgYGVycm9yc2AgcHJvcGVydGllcyovXG4vKiBjYXBEYXRhIGRvZXMgbm90IHRyYW5zZm9ybSBzdHJpbmdzLiBUaGUgY2FsbHMgdG8gYGRlY29kZVJlY3VyYCovXG4vKiBhcmUgZm9yIHJldXNlIGJ5IG90aGVyIGVuY29kaW5ncyB0aGF0IGRvLCBzdWNoIGFzIHNtYWxsY2Fwcy4qL1xuY29uc3QgZE5hbWU9ZGVjb2RlUmVjdXIobmFtZSk7XG5jb25zdCBkTWVzc2FnZT1kZWNvZGVSZWN1cihtZXNzYWdlKTtcbmNvbnN0IGRFcnJvcklkPWVycm9ySWQmJmRlY29kZVJlY3VyKGVycm9ySWQpO1xudHlwZW9mIGROYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBlcnJvciBuYW1lIHR5cGVvZiAke3EodHlwZW9mIGROYW1lKX1gO1xudHlwZW9mIGRNZXNzYWdlPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBlcnJvciBtZXNzYWdlIHR5cGVvZiAke3EodHlwZW9mIGRNZXNzYWdlKX1gO1xuY29uc3QgRUM9Z2V0RXJyb3JDb25zdHJ1Y3RvcihkTmFtZSl8fEVycm9yO1xuLyogZXJyb3JJZCBpcyBhIGxhdGUgYWRkaXRpb24gc28gYmUgdG9sZXJhbnQgb2YgaXRzIGFic2VuY2UuKi9cbmNvbnN0IGVycm9yTmFtZT1cbmRFcnJvcklkPT09dW5kZWZpbmVkP1xuIGBSZW1vdGUke0VDLm5hbWV9YDpcbiBgUmVtb3RlJHtFQy5uYW1lfSgke2RFcnJvcklkfSlgO1xuY29uc3QgZXJyb3I9YXNzZXJ0LmVycm9yKGRNZXNzYWdlLEVDLHtlcnJvck5hbWV9KTtcbnJldHVybiBoYXJkZW4oZXJyb3IpO1xuIH07XG5cbi8qIFRoZSBjdXJyZW50IGVuY29kaW5nIGRvZXMgbm90IGdpdmUgdGhlIGRlY29kZXIgZW5vdWdoIGludG8gdG8gZGlzdGluZ3Vpc2gqL1xuLyogd2hldGhlciBhIHNsb3QgcmVwcmVzZW50cyBhIHByb21pc2Ugb3IgYSByZW1vdGFibGUuIEFzIGFuIGltcGxlbWVudGF0aW9uKi9cbi8qIHJlc3RyaWN0aW9uIHVudGlsIHRoaXMgaXMgZml4ZWQsIGlmIGVpdGhlciBpcyBwcm92aWRlZCwgYm90aCBtdXN0IGJlKi9cbi8qIHByb3ZpZGVkIGFuZCB0aGV5IG11c3QgYmUgdGhlIHNhbWUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQzMzQqL1xuY29uc3QgZGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGE9KHJhd1RyZWUsX2RlY29kZVJlY3VyKT0+e1xuY29uc3R7W1FDTEFTU106XywuLi5zbG90RGF0YX09cmF3VHJlZTtcbnJldHVybiBkZWNvZGVTbG90Q29tbW9uKHNsb3REYXRhKTtcbiB9O1xuXG5jb25zdCBkZWNvZGVFcnJvckZyb21DYXBEYXRhPShyYXdUcmVlLGRlY29kZVJlY3VyKT0+e1xuY29uc3R7W1FDTEFTU106XywuLi5lcnJEYXRhfT1yYXdUcmVlO1xucmV0dXJuIGRlY29kZUVycm9yQ29tbW9uKGVyckRhdGEsZGVjb2RlUmVjdXIpO1xuIH07XG5cbmNvbnN0IHJldml2ZUZyb21DYXBEYXRhPW1ha2VEZWNvZGVGcm9tQ2FwRGF0YSh7XG5kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YTpkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbmRlY29kZVByb21pc2VGcm9tQ2FwRGF0YTpkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbmRlY29kZUVycm9yRnJvbUNhcERhdGF9KTtcblxuXG5jb25zdCBtYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHM9KHByZWZpeCk9PntcbnJldHVybihzdHJpbmdFbmNvZGluZyxfZGVjb2RlUmVjdXIpPT57XG5hc3NlcnQoc3RyaW5nRW5jb2Rpbmcuc3RhcnRzV2l0aChwcmVmaXgpKTtcbi8qIHNsb3RzOiAkc2xvdEluZGV4LmlmYWNlIG9yICRzbG90SW5kZXgqL1xuY29uc3QgaT1zdHJpbmdFbmNvZGluZy5pbmRleE9mKCcuJyk7XG5jb25zdCBpbmRleD1OdW1iZXIoc3RyaW5nRW5jb2Rpbmcuc2xpY2UoMSxpPDA/dW5kZWZpbmVkOmkpKTtcbi8qIGkgPCAwIG1lYW5zIHRoZXJlIHdhcyBubyBpZmFjZSBpbmNsdWRlZC4qL1xuY29uc3QgaWZhY2U9aTwwP3VuZGVmaW5lZDpzdHJpbmdFbmNvZGluZy5zbGljZShpKzEpO1xucmV0dXJuIGRlY29kZVNsb3RDb21tb24oe2lmYWNlLGluZGV4fSk7XG4gfTtcbiB9O1xuY29uc3QgZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2Fwcz1tYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHMoJyQnKTtcbmNvbnN0IGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzPW1ha2VEZWNvZGVTbG90RnJvbVNtYWxsY2FwcygnJicpO1xuXG5jb25zdCBkZWNvZGVFcnJvckZyb21TbWFsbGNhcHM9KGVuY29kaW5nLGRlY29kZVJlY3VyKT0+e1xuY29uc3R7JyNlcnJvcic6bWVzc2FnZSwuLi5yZXN0RXJyRGF0YX09ZW5jb2Rpbmc7XG4haGFzT3duUHJvcGVydHlPZihyZXN0RXJyRGF0YSwnbWVzc2FnZScpfHxcbkZhaWwgYHVuZXhwZWN0ZWQgZW5jb2RlZCBlcnJvciBwcm9wZXJ0eSAke3EoJ21lc3NhZ2UnKX1gO1xucmV0dXJuIGRlY29kZUVycm9yQ29tbW9uKHttZXNzYWdlLC4uLnJlc3RFcnJEYXRhfSxkZWNvZGVSZWN1cik7XG4gfTtcblxuY29uc3QgcmV2aXZlRnJvbVNtYWxsY2Fwcz1tYWtlRGVjb2RlRnJvbVNtYWxsY2Fwcyh7XG5kZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzLFxuZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMsXG5kZWNvZGVFcnJvckZyb21TbWFsbGNhcHN9KTtcblxuXG5yZXR1cm4gaGFyZGVuKHtyZXZpdmVGcm9tQ2FwRGF0YSxyZXZpdmVGcm9tU21hbGxjYXBzfSk7XG4gfTtcblxuLyoqXG4gKiBAdHlwZSB7VW5zZXJpYWxpemU8U2xvdD59XG4gKi9cbmNvbnN0IHVuc2VyaWFsaXplPShkYXRhKT0+e1xuY29uc3R7Ym9keSxzbG90c309ZGF0YTtcbnR5cGVvZiBib2R5PT09J3N0cmluZyd8fFxuRmFpbCBgdW5zZXJpYWxpemUoKSBnaXZlbiBub24tY2FwZGF0YSAoLmJvZHkgaXMgJHtib2R5fSwgbm90IHN0cmluZylgO1xuaXNBcnJheShkYXRhLnNsb3RzKXx8XG5GYWlsIGB1bnNlcmlhbGl6ZSgpIGdpdmVuIG5vbi1jYXBkYXRhICguc2xvdHMgYXJlIG5vdCBBcnJheSlgO1xuY29uc3R7cmV2aXZlRnJvbUNhcERhdGEscmV2aXZlRnJvbVNtYWxsY2Fwc309bWFrZUZ1bGxSZXZpdmUoc2xvdHMpO1xubGV0IHJlc3VsdDtcbi8qIEpTT04gY2Fubm90IGJlZ2luIHdpdGggYSAnIycsIHNvIHRoaXMgaXMgYW4gdW5hbWJpZ3VvdXMgc2lnbmFsLiovXG5pZihib2R5LnN0YXJ0c1dpdGgoJyMnKSl7XG5jb25zdCBzbWFsbGNhcHNCb2R5PWJvZHkuc2xpY2UoMSk7XG5jb25zdCBlbmNvZGluZz1oYXJkZW4oSlNPTi5wYXJzZShzbWFsbGNhcHNCb2R5KSk7XG5yZXN1bHQ9aGFyZGVuKHJldml2ZUZyb21TbWFsbGNhcHMoZW5jb2RpbmcpKTtcbiB9ZWxzZXtcbmNvbnN0IHJhd1RyZWU9aGFyZGVuKEpTT04ucGFyc2UoYm9keSkpO1xucmVzdWx0PWhhcmRlbihyZXZpdmVGcm9tQ2FwRGF0YShyYXdUcmVlKSk7XG4gfVxuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDMzNyovXG4vKiB3aGljaCBzaG91bGQgYmUgY29uc2lkZXJlZCBmaXhlZCBvbmNlIHdlJ3ZlIGNvbXBsZXRlZCB0aGUgc3dpdGNoKi9cbi8qIHRvIHNtYWxsY2Fwcy4qL1xuYXNzZXJ0UGFzc2FibGUocmVzdWx0KTtcbnJldHVybiByZXN1bHQ7XG4gfTtcblxucmV0dXJuIGhhcmRlbih7XG5zZXJpYWxpemUsXG51bnNlcmlhbGl6ZX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VNYXJzaGFsKG1ha2VNYXJzaGFsKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTWFyc2hhbCI6WyJtYWtlTWFyc2hhbCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABBZ7N5AhwAAAIcAAAnAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL3Bhc3NTdHlsZU9mLmpzeyJpbXBvcnRzIjpbIi4vaGVscGVycy9jb3B5QXJyYXkuanMiLCIuL2hlbHBlcnMvY29weVJlY29yZC5qcyIsIi4vaGVscGVycy9lcnJvci5qcyIsIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vaGVscGVycy9yZW1vdGFibGUuanMiLCIuL2hlbHBlcnMvc2FmZS1wcm9taXNlLmpzIiwiLi9oZWxwZXJzL3N5bWJvbC5qcyIsIi4vaGVscGVycy90YWdnZWQuanMiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbImFzc2VydFBhc3NhYmxlIiwicGFzc1N0eWxlT2YiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaXNQcm9taXNlLGlzT2JqZWN0LGlzVHlwZWRBcnJheSxQQVNTX1NUWUxFLENvcHlBcnJheUhlbHBlcixDb3B5UmVjb3JkSGVscGVyLFRhZ2dlZEhlbHBlcixFcnJvckhlbHBlcixSZW1vdGFibGVIZWxwZXIsYXNzZXJ0UGFzc2FibGVTeW1ib2wsYXNzZXJ0U2FmZVByb21pc2U7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoaXNQcm9taXNlID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJpc1R5cGVkQXJyYXlcIiwgWyRo4oCNX2EgPT4gKGlzVHlwZWRBcnJheSA9ICRo4oCNX2EpXV0sW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvY29weUFycmF5LmpzXCIsIFtbXCJDb3B5QXJyYXlIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKENvcHlBcnJheUhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvY29weVJlY29yZC5qc1wiLCBbW1wiQ29weVJlY29yZEhlbHBlclwiLCBbJGjigI1fYSA9PiAoQ29weVJlY29yZEhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvdGFnZ2VkLmpzXCIsIFtbXCJUYWdnZWRIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKFRhZ2dlZEhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvZXJyb3IuanNcIiwgW1tcIkVycm9ySGVscGVyXCIsIFskaOKAjV9hID0+IChFcnJvckhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvcmVtb3RhYmxlLmpzXCIsIFtbXCJSZW1vdGFibGVIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKFJlbW90YWJsZUhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvc3ltYm9sLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3NhZmUtcHJvbWlzZS5qc1wiLCBbW1wiYXNzZXJ0U2FmZVByb21pc2VcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFNhZmVQcm9taXNlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi9oZWxwZXJzL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfSBQYXNzU3R5bGVIZWxwZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFzc1N0eWxlfSBQYXNzU3R5bGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NTdHlsZU9mfSBQYXNzU3R5bGVPZiAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUHJpbWl0aXZlU3R5bGV9IFByaW1pdGl2ZVN0eWxlICovXG5cbi8qKiBAdHlwZWRlZiB7RXhjbHVkZTxQYXNzU3R5bGUsIFByaW1pdGl2ZVN0eWxlIHwgXCJwcm9taXNlXCI+fSBIZWxwZXJQYXNzU3R5bGUgKi9cblxuY29uc3R7ZGV0YWlsczpYLEZhaWwscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzRnJvemVufT1PYmplY3Q7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzU3R5bGVIZWxwZXJbXX0gcGFzc1N0eWxlSGVscGVyc1xuICogQHJldHVybnMge1JlY29yZDxIZWxwZXJQYXNzU3R5bGUsIFBhc3NTdHlsZUhlbHBlcj4gfVxuICovXG5cbmNvbnN0IG1ha2VIZWxwZXJUYWJsZT0ocGFzc1N0eWxlSGVscGVycyk9Pntcbi8qKiBAdHlwZSB7UmVjb3JkPEhlbHBlclBhc3NTdHlsZSwgYW55PiAmIHtfX3Byb3RvX186IG51bGx9fSAqL1xuY29uc3QgSGVscGVyVGFibGU9e1xuX19wcm90b19fOm51bGwsXG5jb3B5QXJyYXk6dW5kZWZpbmVkLFxuY29weVJlY29yZDp1bmRlZmluZWQsXG50YWdnZWQ6dW5kZWZpbmVkLFxuZXJyb3I6dW5kZWZpbmVkLFxucmVtb3RhYmxlOnVuZGVmaW5lZH07XG5cbmZvcihjb25zdCBoZWxwZXIgb2YgcGFzc1N0eWxlSGVscGVycyl7XG5jb25zdHtzdHlsZU5hbWV9PWhlbHBlcjtcbnN0eWxlTmFtZSBpbiBIZWxwZXJUYWJsZXx8RmFpbCBgVW5yZWNvZ25pemVkIGhlbHBlcjogJHtxKHN0eWxlTmFtZSl9YDtcbkhlbHBlclRhYmxlW3N0eWxlTmFtZV09PT11bmRlZmluZWR8fFxuRmFpbCBgY29uZmxpY3RpbmcgaGVscGVycyBmb3IgJHtxKHN0eWxlTmFtZSl9YDtcbkhlbHBlclRhYmxlW3N0eWxlTmFtZV09aGVscGVyO1xuIH1cbmZvcihjb25zdCBzdHlsZU5hbWUgb2Ygb3duS2V5cyhIZWxwZXJUYWJsZSkpe1xuSGVscGVyVGFibGVbc3R5bGVOYW1lXSE9PXVuZGVmaW5lZHx8XG5GYWlsIGBtaXNzaW5nIGhlbHBlciBmb3IgJHtxKHN0eWxlTmFtZSl9YDtcbiB9XG5cbnJldHVybiBoYXJkZW4oSGVscGVyVGFibGUpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzU3R5bGVIZWxwZXJbXX0gcGFzc1N0eWxlSGVscGVycyBUaGUgcGFzc1N0eWxlSGVscGVycyB0byByZWdpc3RlcixcbiAqIGluIHByaW9yaXR5IG9yZGVyLlxuICogTk9URSBUaGVzZSBtdXN0IGFsbCBiZSBcInRydXN0ZWRcIixcbiAqIGNvbXBsZXRlLCBhbmQgbm9uLWNvbGxpZGluZy4gYG1ha2VQYXNzU3R5bGVPZmAgbWF5ICphc3N1bWUqIHRoYXQgZWFjaCBoZWxwZXJcbiAqIGRvZXMgd2hhdCBpdCBpcyBzdXBwb3NlZCB0byBkby4gYG1ha2VQYXNzU3R5bGVPZmAgaXMgbm90IHRyeWluZyB0byBkZWZlbmRcbiAqIGl0c2VsZiBhZ2FpbnN0IG1hbGljaW91cyBoZWxwZXJzLCB0aG91Z2ggaXQgZG9lcyBkZWZlbmQgYWdhaW5zdCBzb21lXG4gKiBhY2NpZGVudHMuXG4gKiBAcmV0dXJucyB7UGFzc1N0eWxlT2Z9XG4gKi9cbmNvbnN0IG1ha2VQYXNzU3R5bGVPZj0ocGFzc1N0eWxlSGVscGVycyk9PntcbmNvbnN0IEhlbHBlclRhYmxlPW1ha2VIZWxwZXJUYWJsZShwYXNzU3R5bGVIZWxwZXJzKTtcbmNvbnN0IHJlbW90YWJsZUhlbHBlcj1IZWxwZXJUYWJsZS5yZW1vdGFibGU7XG5cbi8qKlxuICogUHVyZWx5IGZvciBwZXJmb3JtYW5jZS4gSG93ZXZlciBpdCBpcyBtdXRhYmxlIHN0YXRpYyBzdGF0ZSwgYW5kXG4gKiBpdCBkb2VzIGhhdmUgc29tZSBvYnNlcnZhYmlsaXR5IG9uIHByb3hpZXMuIFRPRE8gbmVlZCB0byBhc3Nlc3NcbiAqIHdoZXRoZXIgdGhpcyBjcmVhdGVzIGEgc3RhdGljIGNvbW11bmljYXRpb25zIGNoYW5uZWwuXG4gKlxuICogcGFzc1N0eWxlT2YgZG9lcyBhIGZ1bGwgcmVjdXJzaXZlIHdhbGsgb2YgcGFzcy1ieS1jb3B5XG4gKiBzdHJ1Y3R1cmVzLCBpbiBvcmRlciB0byB2YWxpZGF0ZSB0aGF0IHRoZXkgYXJlIGFjeWNsaWMuIEluIGFkZGl0aW9uXG4gKiBpdCBpcyB1c2VkIGJ5IG90aGVyIGFsZ29yaXRobXMgdG8gcmVjdXJzaXZlbHkgd2FsayB0aGVzZSBwYXNzLWJ5LWNvcHlcbiAqIHN0cnVjdHVyZXMsIHNvIHdpdGhvdXQgdGhpcyBjYWNoZSwgdGhlc2UgYWxnb3JpdGhtcyBjb3VsZCBiZVxuICogTyhOKioyKSBvciB3b3JzZS5cbiAqXG4gKiBAdHlwZSB7V2Vha01hcDxQYXNzYWJsZSwgUGFzc1N0eWxlPn1cbiAqL1xuY29uc3QgcGFzc1N0eWxlTWVtbz1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEB0eXBlIHtQYXNzU3R5bGVPZn1cbiAqL1xuY29uc3QgcGFzc1N0eWxlT2Y9KHBhc3NhYmxlKT0+e1xuLyogRXZlbiB3aGVuIGEgV2Vha1NldCBpcyBjb3JyZWN0LCB3aGVuIHRoZSBzZXQgaGFzIGEgc2hvcnRlciBsaWZldGltZSovXG4vKiB0aGFuIGl0cyBrZXlzLCB3ZSBwcmVmZXIgYSBTZXQgZHVlIHRvIGV4cGVjdGVkIGltcGxlbWVudGF0aW9uKi9cbi8qIHRyYWRlb2Zmcy4qL1xuY29uc3QgaW5Qcm9ncmVzcz1uZXcgU2V0KCk7XG5cbi8qKlxuICogQHR5cGUge1Bhc3NTdHlsZU9mfVxuICovXG5jb25zdCBwYXNzU3R5bGVPZlJlY3VyPShpbm5lcik9PntcbmNvbnN0IGlubmVySXNPYmplY3Q9aXNPYmplY3QoaW5uZXIpO1xuaWYoaW5uZXJJc09iamVjdCl7XG5pZihwYXNzU3R5bGVNZW1vLmhhcyhpbm5lcikpe1xuLyogQHRzLWlnbm9yZSBUeXBlU2NyaXB0IGRvZXNuJ3Qga25vdyB0aGF0IGBnZXRgIGFmdGVyIGBoYXNgIGlzIHNhZmUqL1xucmV0dXJuIHBhc3NTdHlsZU1lbW8uZ2V0KGlubmVyKTtcbiB9XG4haW5Qcm9ncmVzcy5oYXMoaW5uZXIpfHxcbkZhaWwgYFBhc3MtYnktY29weSBkYXRhIGNhbm5vdCBiZSBjeWNsaWMgJHtpbm5lcn1gO1xuaW5Qcm9ncmVzcy5hZGQoaW5uZXIpO1xuIH1cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2ZJbnRlcm5hbChpbm5lcik7XG5pZihpbm5lcklzT2JqZWN0KXtcbnBhc3NTdHlsZU1lbW8uc2V0KGlubmVyLHBhc3NTdHlsZSk7XG5pblByb2dyZXNzLmRlbGV0ZShpbm5lcik7XG4gfVxucmV0dXJuIHBhc3NTdHlsZTtcbiB9O1xuXG4vKipcbiAqIEB0eXBlIHtQYXNzU3R5bGVPZn1cbiAqL1xuY29uc3QgcGFzc1N0eWxlT2ZJbnRlcm5hbD0oaW5uZXIpPT57XG5jb25zdCB0eXBlc3RyPXR5cGVvZiBpbm5lcjtcbnN3aXRjaCh0eXBlc3RyKXtcbmNhc2UndW5kZWZpbmVkJzpcbmNhc2Unc3RyaW5nJzpcbmNhc2UnYm9vbGVhbic6XG5jYXNlJ251bWJlcic6XG5jYXNlJ2JpZ2ludCc6e1xucmV0dXJuIHR5cGVzdHI7XG4gfVxuY2FzZSdzeW1ib2wnOntcbmFzc2VydFBhc3NhYmxlU3ltYm9sKGlubmVyKTtcbnJldHVybidzeW1ib2wnO1xuIH1cbmNhc2Unb2JqZWN0Jzp7XG5pZihpbm5lcj09PW51bGwpe1xucmV0dXJuJ251bGwnO1xuIH1cbmlmKCFpc0Zyb3plbihpbm5lcikpe1xuYXNzZXJ0LmZhaWwoXG4vKiBUeXBlZEFycmF5cyBnZXQgc3BlY2lhbCB0cmVhdG1lbnQgaW4gaGFyZGVuKCkqL1xuLyogYW5kIGEgY29ycmVzcG9uZGluZyBzcGVjaWFsIGVycm9yIG1lc3NhZ2UgaGVyZS4qL1xuaXNUeXBlZEFycmF5KGlubmVyKT9cblggYENhbm5vdCBwYXNzIG11dGFibGUgdHlwZWQgYXJyYXlzIGxpa2UgJHtpbm5lcn0uYDpcblggYENhbm5vdCBwYXNzIG5vbi1mcm96ZW4gb2JqZWN0cyBsaWtlICR7aW5uZXJ9LiBVc2UgaGFyZGVuKClgKTtcblxuIH1cbmlmKGlzUHJvbWlzZShpbm5lcikpe1xuYXNzZXJ0U2FmZVByb21pc2UoaW5uZXIpO1xucmV0dXJuJ3Byb21pc2UnO1xuIH1cbnR5cGVvZiBpbm5lci50aGVuIT09J2Z1bmN0aW9uJ3x8XG5GYWlsIGBDYW5ub3QgcGFzcyBub24tcHJvbWlzZSB0aGVuYWJsZXNgO1xuY29uc3QgcGFzc1N0eWxlVGFnPWlubmVyW1BBU1NfU1RZTEVdO1xuaWYocGFzc1N0eWxlVGFnIT09dW5kZWZpbmVkKXtcbmFzc2VydC50eXBlb2YocGFzc1N0eWxlVGFnLCdzdHJpbmcnKTtcbmNvbnN0IGhlbHBlcj1IZWxwZXJUYWJsZVtwYXNzU3R5bGVUYWddO1xuaGVscGVyIT09dW5kZWZpbmVkfHxcbkZhaWwgYFVucmVjb2duaXplZCBQYXNzU3R5bGU6ICR7cShwYXNzU3R5bGVUYWcpfWA7XG5oZWxwZXIuYXNzZXJ0VmFsaWQoaW5uZXIscGFzc1N0eWxlT2ZSZWN1cik7XG5yZXR1cm4gKC8qKiBAdHlwZSB7UGFzc1N0eWxlfSAqL3Bhc3NTdHlsZVRhZyk7XG4gfVxuZm9yKGNvbnN0IGhlbHBlciBvZiBwYXNzU3R5bGVIZWxwZXJzKXtcbmlmKGhlbHBlci5jYW5CZVZhbGlkKGlubmVyKSl7XG5oZWxwZXIuYXNzZXJ0VmFsaWQoaW5uZXIscGFzc1N0eWxlT2ZSZWN1cik7XG5yZXR1cm4gaGVscGVyLnN0eWxlTmFtZTtcbiB9XG4gfVxucmVtb3RhYmxlSGVscGVyLmFzc2VydFZhbGlkKGlubmVyLHBhc3NTdHlsZU9mUmVjdXIpO1xucmV0dXJuJ3JlbW90YWJsZSc7XG4gfVxuY2FzZSdmdW5jdGlvbic6e1xuaXNGcm96ZW4oaW5uZXIpfHxcbkZhaWwgYENhbm5vdCBwYXNzIG5vbi1mcm96ZW4gb2JqZWN0cyBsaWtlICR7aW5uZXJ9LiBVc2UgaGFyZGVuKClgO1xudHlwZW9mIGlubmVyLnRoZW4hPT0nZnVuY3Rpb24nfHxcbkZhaWwgYENhbm5vdCBwYXNzIG5vbi1wcm9taXNlIHRoZW5hYmxlc2A7XG5yZW1vdGFibGVIZWxwZXIuYXNzZXJ0VmFsaWQoaW5uZXIscGFzc1N0eWxlT2ZSZWN1cik7XG5yZXR1cm4ncmVtb3RhYmxlJztcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFggYFVucmVjb2duaXplZCB0eXBlb2YgJHtxKHR5cGVzdHIpfWAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfTtcblxucmV0dXJuIHBhc3NTdHlsZU9mUmVjdXIocGFzc2FibGUpO1xuIH07XG5yZXR1cm4gaGFyZGVuKHBhc3NTdHlsZU9mKTtcbiB9O1xuXG5jb25zdCAgICAgICAgcGFzc1N0eWxlT2Y9bWFrZVBhc3NTdHlsZU9mKFtcbkNvcHlBcnJheUhlbHBlcixcbkNvcHlSZWNvcmRIZWxwZXIsXG5UYWdnZWRIZWxwZXIsXG5FcnJvckhlbHBlcixcblJlbW90YWJsZUhlbHBlcl0pOyRo4oCNX29uY2UucGFzc1N0eWxlT2YocGFzc1N0eWxlT2YpO1xuXG5cbmNvbnN0ICAgICAgICBhc3NlcnRQYXNzYWJsZT0odmFsKT0+e1xucGFzc1N0eWxlT2YodmFsKTsvKiB0aHJvd3MgaWYgdmFsIGlzIG5vdCBhIHBhc3NhYmxlKi9cbiB9OyRo4oCNX29uY2UuYXNzZXJ0UGFzc2FibGUoYXNzZXJ0UGFzc2FibGUpO1xuaGFyZGVuKGFzc2VydFBhc3NhYmxlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwYXNzU3R5bGVPZiI6WyJwYXNzU3R5bGVPZiJdLCJhc3NlcnRQYXNzYWJsZSI6WyJhc3NlcnRQYXNzYWJsZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABYoj/ms0kAALNJAAAlAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL3JhbmtPcmRlci5qc3siaW1wb3J0cyI6WyIuL2VuY29kZVBhc3NhYmxlLmpzIiwiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9oZWxwZXJzL3N5bWJvbC5qcyIsIi4vcGFzc1N0eWxlT2YuanMiXSwiZXhwb3J0cyI6WyJGdWxsUmFua0NvdmVyIiwiYXNzZXJ0UmFua1NvcnRlZCIsImNvbXBhcmF0b3JNaXJyb3JJbWFnZSIsImNvbXBhcmVBbnRpUmFuayIsImNvbXBhcmVSYW5rIiwiY292ZXJlZEVudHJpZXMiLCJnZXRJbmRleENvdmVyIiwiZ2V0UGFzc1N0eWxlQ292ZXIiLCJpbnRlcnNlY3RSYW5rQ292ZXJzIiwiaXNSYW5rU29ydGVkIiwibWFrZUNvbXBhcmF0b3JLaXQiLCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCIsInNvcnRCeVJhbmsiLCJ1bmlvblJhbmtDb3ZlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgZ2V0VGFnLHBhc3NTdHlsZU9mLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzU3R5bGVQcmVmaXhlcyxyZWNvcmROYW1lcyxyZWNvcmRWYWx1ZXM7JGjigI1faW1wb3J0cyhbW1wiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3N5bWJvbC5qc1wiLCBbW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dXV0sW1wiLi9lbmNvZGVQYXNzYWJsZS5qc1wiLCBbW1wicGFzc1N0eWxlUHJlZml4ZXNcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZVByZWZpeGVzID0gJGjigI1fYSldXSxbXCJyZWNvcmROYW1lc1wiLCBbJGjigI1fYSA9PiAocmVjb3JkTmFtZXMgPSAkaOKAjV9hKV1dLFtcInJlY29yZFZhbHVlc1wiLCBbJGjigI1fYSA9PiAocmVjb3JkVmFsdWVzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NTdHlsZX0gUGFzc1N0eWxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5SYW5rQ292ZXJ9IFJhbmtDb3ZlciAqL1xuXG5jb25zdHtGYWlsLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e2VudHJpZXMsZnJvbUVudHJpZXMsc2V0UHJvdG90eXBlT2YsaXN9PU9iamVjdDtcblxuLyoqXG4gKiBAdHlwZWRlZiB7LTEgfCAwIHwgMX0gUmFua0NvbXBhcmlzb25cbiAqIFRoZSByZXN1bHQgb2YgYSBgUmFua0NvbXBhcmVgIGZ1bmN0aW9uIHRoYXQgZGVmaW5lcyBhIHJhbmstb3JkZXIsIGkuZS4sXG4gKiBhIHRvdGFsIHByZW9yZGVyIGluIHdoaWNoIGRpZmZlcmVudCBlbGVtZW50cyBhcmUgYWx3YXlzIGNvbXBhcmFibGUgYnV0XG4gKiBjYW4gYmUgdGllZCBmb3IgdGhlIHNhbWUgcmFuay4gU2VlIGBSYW5rQ29tcGFyZWAuXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgUmFua0NvbXBhcmVcbiAqIFJldHVybnMgYC0xYCwgYDBgLCBvciBgMWAgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIHJhbmsgb2YgYGxlZnRgXG4gKiBpcyByZXNwZWN0aXZlbHkgYmVmb3JlLCB0aWVkLXdpdGgsIG9yIGFmdGVyIHRoZSByYW5rIG9mIGByaWdodGAuXG4gKlxuICogVGhpcyBjb21wYXJpc29uIGZ1bmN0aW9uIGlzIHZhbGlkIGFzIGFyZ3VtZW50IHRvXG4gKiBgQXJyYXkucHJvdG90eXBlLnNvcnRgLiBUaGlzIGlzIHNvbWV0aW1lcyBkZXNjcmliZWQgYXMgYSBcInRvdGFsIG9yZGVyXCJcbiAqIGJ1dCwgZGVwZW5kaW5nIG9uIHlvdXIgZGVmaW5pdGlvbnMsIHRoaXMgaXMgdGVjaG5pY2FsbHkgaW5jb3JyZWN0IGJlY2F1c2VcbiAqIGl0IG1heSByZXR1cm4gYDBgIHRvIGluZGljYXRlIHRoYXQgdHdvIGRpc3Rpbmd1aXNoYWJsZSBlbGVtZW50cyBzdWNoIGFzXG4gKiBgLTBgIGFuZCBgMGAgYXJlIHRpZWQgKGkuZS4sIGFyZSBpbiB0aGUgc2FtZSBlcXVpdmFsZW5jZSBjbGFzc1xuICogZm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIG9yZGVyaW5nKS4gSWYgZWFjaCBzdWNoIGVxdWl2YWxlbmNlIGNsYXNzIGlzXG4gKiBhICpyYW5rKiBhbmQgcmFua3MgYXJlIGRpc2pvaW50LCB0aGVuIHRoaXMgXCJyYW5rIG9yZGVyXCIgaXMgYVxuICogdHJ1ZSB0b3RhbCBvcmRlciBvdmVyIHRoZXNlIHJhbmtzLiBJbiBtYXRoZW1hdGljcyB0aGlzIGdvZXMgYnkgc2V2ZXJhbFxuICogb3RoZXIgbmFtZXMgc3VjaCBhcyBcInRvdGFsIHByZW9yZGVyXCIuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBlc3RhYmxpc2hlcyBhIHRvdGFsIHJhbmsgb3JkZXIgb3ZlciBhbGwgcGFzc2FibGVzLlxuICogVG8gZG8gc28gaXQgbWFrZXMgYXJiaXRyYXJ5IGNob2ljZXMsIHN1Y2ggYXMgdGhhdCBhbGwgc3RyaW5nc1xuICogYXJlIGFmdGVyIGFsbCBudW1iZXJzLiBUaHVzLCB0aGlzIG9yZGVyIGlzIG5vdCBpbnRlbmRlZCB0byBiZVxuICogdXNlZCBkaXJlY3RseSBhcyBhIGNvbXBhcmlzb24gd2l0aCB1c2VmdWwgc2VtYW50aWNzLiBIb3dldmVyLCBpdCBtdXN0IGJlXG4gKiBjbG9zZWx5IGVub3VnaCByZWxhdGVkIHRvIHN1Y2ggY29tcGFyaXNvbnMgdG8gYWlkIGluIGltcGxlbWVudGluZ1xuICogbG9va3VwcyBiYXNlZCBvbiB0aG9zZSBjb21wYXJpc29ucy4gRm9yIGV4YW1wbGUsIGluIG9yZGVyIHRvIGdldCBhIHRvdGFsXG4gKiBvcmRlciBhbW9uZyByYW5rcywgd2UgcHV0IGBOYU5gIGFmdGVyIGFsbCBvdGhlciBKYXZhU2NyaXB0IFwibnVtYmVyXCIgdmFsdWVzXG4gKiAoaS5lLiwgSUVFRSA3NTQgZmxvYXRpbmctcG9pbnQgdmFsdWVzKS4gQnV0IG90aGVyd2lzZSwgd2UgcmFuayBKYXZhU2NyaXB0XG4gKiBudW1iZXJzIGJ5IHNpZ25lZCBtYWduaXR1ZGUsIHdpdGggYDBgIGFuZCBgLTBgIHRpZWQuIEEgc2VtYW50aWNhbGx5IHVzZWZ1bFxuICogb3JkZXJpbmcgd291bGQgYWxzbyBjb21wYXJlIG1hZ25pdHVkZXMsIGFuZCBzbyBhZ3JlZSB3aXRoIHRoZSByYW5rIG9yZGVyaW5nXG4gKiBvZiBhbGwgdmFsdWVzIG90aGVyIHRoYW4gYE5hTmAuIEFuIGFycmF5IHNvcnRlZCBieSByYW5rIHdvdWxkIGVuYWJsZSByYW5nZVxuICogcXVlcmllcyBieSBtYWduaXR1ZGUuXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBsZWZ0XG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSByaWdodFxuICogQHJldHVybnMge1JhbmtDb21wYXJpc29ufVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUmFua0NvbXBhcmF0b3JLaXRcbiAqIEBwcm9wZXJ0eSB7UmFua0NvbXBhcmV9IGNvbXBhcmF0b3JcbiAqIEBwcm9wZXJ0eSB7UmFua0NvbXBhcmV9IGFudGlDb21wYXJhdG9yXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UmFua0NvbXBhcmV9IEZ1bGxDb21wYXJlXG4gKiBBIGBGdWxsQ29tcGFyZWAgZnVuY3Rpb24gc2F0aXNmaWVzIGFsbCB0aGUgaW52YXJpYW50cyBzdGF0ZWQgYmVsb3cgZm9yXG4gKiBgUmFua0NvbXBhcmVgJ3MgcmVsYXRpb24gd2l0aCBLZXlDb21wYXJlLlxuICogSW4gYWRkaXRpb24sIGl0cyBlcXVhbGl0eSBpcyBhcyBwcmVjaXNlIGFzIHRoZSBgS2V5Q29tcGFyZWBcbiAqIGNvbXBhcmlzb24gZGVmaW5lZCBiZWxvdywgaW4gdGhhdCwgZm9yIGFsbCBLZXlzIGB4YCBhbmQgYHlgLFxuICogYEZ1bGxDb21wYXJlKHgsIHkpID09PSAwYCBpZmYgYEtleUNvbXBhcmUoeCwgeSkgPT09IDBgLlxuICpcbiAqIEZvciBub24ta2V5cyBhIGBGdWxsQ29tcGFyZWAgc2hvdWxkIGJlIGV4YWN0bHkgYXMgaW1wcmVjaXNlIGFzXG4gKiBgUmFua0NvbXBhcmVgLiBGb3IgZXhhbXBsZSwgYm90aCB3aWxsIHRyZWF0IGFsbCBlcnJvcnMgYXMgaW4gdGhlIHNhbWVcbiAqIGVxdWl2YWxlbmNlIGNsYXNzLiBCb3RoIHdpbGwgdHJlYXQgYWxsIHByb21pc2VzIGFzIGluIHRoZSBzYW1lXG4gKiBlcXVpdmFsZW5jZSBjbGFzcy4gQm90aCB3aWxsIG9yZGVyIHRhZ2dlZHMgdGhlIHNhbWUgd2F5LCB3aGljaCBpcyBhZG1pdHRlZGx5XG4gKiB3ZWlyZCwgYXMgc29tZSB0YWdnZWRzIHdpbGwgYmUgY29uc2lkZXJlZCBrZXlzIGFuZCBvdGhlciB0YWdnZWRzIHdpbGwgYmVcbiAqIGNvbnNpZGVyZWQgbm9uLWtleXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGdWxsQ29tcGFyYXRvcktpdFxuICogQHByb3BlcnR5IHtGdWxsQ29tcGFyZX0gY29tcGFyYXRvclxuICogQHByb3BlcnR5IHtGdWxsQ29tcGFyZX0gYW50aUNvbXBhcmF0b3JcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtbbnVtYmVyLCBudW1iZXJdfSBJbmRleENvdmVyXG4gKi9cblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBlcXVhbGl0eSBjb21wYXJpc29uIHVzZWQgYnkgSmF2YVNjcmlwdCdzIE1hcCBhbmQgU2V0XG4gKiBhYnN0cmFjdGlvbnMsIHdoZXJlIE5hTiBpcyB0aGUgc2FtZSBhcyBOYU4gYW5kIC0wIGlzIHRoZSBzYW1lIGFzXG4gKiAwLiBNYXJzaGFsIHNlcmlhbGl6ZXMgLTAgYXMgemVybywgc28gdGhlIHNlbWFudGljcyBvZiBvdXIgZGlzdHJpYnV0ZWRcbiAqIG9iamVjdCBzeXN0ZW0gZG9lcyBub3QgZGlzdGluZ3Vpc2ggMCBmcm9tIC0wLlxuICpcbiAqIGBzYW1lVmFsdWVaZXJvYCBpcyB0aGUgRWNtYVNjcmlwdCBzcGVjIG5hbWUgZm9yIHRoaXMgZXF1YWxpdHkgY29tcGFyaXNvbixcbiAqIGJ1dCBUT0RPIHdlIG5lZWQgYSBiZXR0ZXIgbmFtZSBmb3IgdGhlIEFQSS5cbiAqXG4gKiBAcGFyYW0ge2FueX0geFxuICogQHBhcmFtIHthbnl9IHlcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBzYW1lVmFsdWVaZXJvPSh4LHkpPT54PT09eXx8aXMoeCx5KTtcblxuY29uc3QgdHJpdmlhbENvbXBhcmF0b3I9KGxlZnQscmlnaHQpPT5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeSovXG5sZWZ0PHJpZ2h0Py0xOmxlZnQ9PT1yaWdodD8wOjE7XG5cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxQYXNzU3R5bGUsIHsgaW5kZXg6IG51bWJlciwgY292ZXI6IFJhbmtDb3ZlciB9Pn0gUGFzc1N0eWxlUmFua3NSZWNvcmRcbiAqL1xuXG5jb25zdCBwYXNzU3R5bGVSYW5rcz0vKiogQHR5cGUge1Bhc3NTdHlsZVJhbmtzUmVjb3JkfSAqL2Zyb21FbnRyaWVzKFxuZW50cmllcyhwYXNzU3R5bGVQcmVmaXhlcylcbi8qIFNvcnQgZW50cmllcyBieSBhc2NlbmRpbmcgcHJlZml4LiovLlxuc29ydCgoW19sZWZ0U3R5bGUsbGVmdFByZWZpeGVzXSxbX3JpZ2h0U3R5bGUscmlnaHRQcmVmaXhlc10pPT57XG5yZXR1cm4gdHJpdmlhbENvbXBhcmF0b3IobGVmdFByZWZpeGVzLHJpZ2h0UHJlZml4ZXMpO1xuIH0pLlxubWFwKChbcGFzc1N0eWxlLHByZWZpeGVzXSxpbmRleCk9Pntcbi8qIENvdmVyIGFsbCBzdHJpbmdzIHRoYXQgc3RhcnQgd2l0aCBhbnkgY2hhcmFjdGVyIGluIGBwcmVmaXhlc2AuKi9cbi8qIGBwcmVmaXhlc2AgaXMgYWxyZWFkeSBzb3J0ZWQsIHNvIHRoYXQncyovXG4vKiBhbGwgcyBzdWNoIHRoYXQgcHJlZml4ZXMuYXQoMCkg4omkIHMgPCBzdWNjZXNzb3IocHJlZml4ZXMuYXQoLTEpKS4qL1xuY29uc3QgY292ZXI9W1xucHJlZml4ZXMuY2hhckF0KDApLFxuU3RyaW5nLmZyb21DaGFyQ29kZShwcmVmaXhlcy5jaGFyQ29kZUF0KHByZWZpeGVzLmxlbmd0aC0xKSsxKV07XG5cbnJldHVybltwYXNzU3R5bGUse2luZGV4LGNvdmVyfV07XG4gfSkpO1xuXG5zZXRQcm90b3R5cGVPZihwYXNzU3R5bGVSYW5rcyxudWxsKTtcbmhhcmRlbihwYXNzU3R5bGVSYW5rcyk7XG5cbi8qKlxuICogQXNzb2NpYXRlIHdpdGggZWFjaCBwYXNzU3R5bGUgYSBSYW5rQ292ZXIgdGhhdCBtYXkgYmUgYW4gb3ZlcmVzdGltYXRlLFxuICogYW5kIHdob3NlIHJlc3VsdHMgdGhlcmVmb3JlIG5lZWQgdG8gYmUgZmlsdGVyZWQgZG93bi4gRm9yIGV4YW1wbGUsIGJlY2F1c2VcbiAqIHRoZXJlIGlzIG5vdCBhIHNtYWxsZXN0IG9yIGJpZ2dlc3QgYmlnaW50LCBib3VuZCBpdCBieSBgTmFOYCAodGhlIGxhc3QgcGxhY2VcbiAqIG51bWJlcikgYW5kIGAnJ2AgKHRoZSBlbXB0eSBzdHJpbmcsIHdoaWNoIGlzIHRoZSBmaXJzdCBwbGFjZSBzdHJpbmcpLiBUaHVzLFxuICogYSByYW5nZSBxdWVyeSB1c2luZyB0aGlzIHJhbmdlIG1heSBpbmNsdWRlIHRoZXNlIHZhbHVlcywgd2hpY2ggd291bGQgdGhlblxuICogbmVlZCB0byBiZSBmaWx0ZXJlZCBvdXQuXG4gKlxuICogQHBhcmFtIHtQYXNzU3R5bGV9IHBhc3NTdHlsZVxuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuY29uc3QgICAgICAgIGdldFBhc3NTdHlsZUNvdmVyPShwYXNzU3R5bGUpPT5wYXNzU3R5bGVSYW5rc1twYXNzU3R5bGVdLmNvdmVyOyRo4oCNX29uY2UuZ2V0UGFzc1N0eWxlQ292ZXIoZ2V0UGFzc1N0eWxlQ292ZXIpO1xuaGFyZGVuKGdldFBhc3NTdHlsZUNvdmVyKTtcblxuLyoqXG4gKiBAdHlwZSB7V2Vha01hcDxSYW5rQ29tcGFyZSxXZWFrU2V0PFBhc3NhYmxlW10+Pn1cbiAqL1xuY29uc3QgbWVtb09mU29ydGVkPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHR5cGUge1dlYWtNYXA8UmFua0NvbXBhcmUsUmFua0NvbXBhcmU+fVxuICovXG5jb25zdCBjb21wYXJhdG9yTWlycm9ySW1hZ2VzPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZT19IGNvbXBhcmVSZW1vdGFibGVzXG4gKiBBbiBvcHRpb24gdG8gY3JlYXRlIGEgY29tcGFyYXRvciBpbiB3aGljaCBhbiBpbnRlcm5hbCBvcmRlciBpc1xuICogYXNzaWduZWQgdG8gcmVtb3RhYmxlcy4gVGhpcyBkZWZhdWx0cyB0byBhIGNvbXBhcmF0b3IgdGhhdFxuICogYWx3YXlzIHJldHVybnMgYDBgLCBtZWFuaW5nIHRoYXQgYWxsIHJlbW90YWJsZXMgYXJlIHRpZWRcbiAqIGZvciB0aGUgc2FtZSByYW5rLlxuICogQHJldHVybnMge1JhbmtDb21wYXJhdG9yS2l0fVxuICovXG5jb25zdCAgICAgICAgbWFrZUNvbXBhcmF0b3JLaXQ9KGNvbXBhcmVSZW1vdGFibGVzPShfeCxfeSk9PjApPT57XG4vKiogQHR5cGUge1JhbmtDb21wYXJlfSAqL1xuY29uc3QgY29tcGFyYXRvcj0obGVmdCxyaWdodCk9PntcbmlmKHNhbWVWYWx1ZVplcm8obGVmdCxyaWdodCkpe1xucmV0dXJuIDA7XG4gfVxuY29uc3QgbGVmdFN0eWxlPXBhc3NTdHlsZU9mKGxlZnQpO1xuY29uc3QgcmlnaHRTdHlsZT1wYXNzU3R5bGVPZihyaWdodCk7XG5pZihsZWZ0U3R5bGUhPT1yaWdodFN0eWxlKXtcbnJldHVybiB0cml2aWFsQ29tcGFyYXRvcihcbnBhc3NTdHlsZVJhbmtzW2xlZnRTdHlsZV0uaW5kZXgsXG5wYXNzU3R5bGVSYW5rc1tyaWdodFN0eWxlXS5pbmRleCk7XG5cbiB9XG5zd2l0Y2gobGVmdFN0eWxlKXtcbmNhc2UncmVtb3RhYmxlJzp7XG5yZXR1cm4gY29tcGFyZVJlbW90YWJsZXMobGVmdCxyaWdodCk7XG4gfVxuY2FzZSd1bmRlZmluZWQnOlxuY2FzZSdudWxsJzpcbmNhc2UnZXJyb3InOlxuY2FzZSdwcm9taXNlJzp7XG4vKiBGb3IgZWFjaCBvZiB0aGVzZSBwYXNzU3R5bGVzLCBhbGwgbWVtYmVycyBvZiB0aGF0IHBhc3NTdHlsZSBhcmUgdGllZCovXG4vKiBmb3IgdGhlIHNhbWUgcmFuay4qL1xucmV0dXJuIDA7XG4gfVxuY2FzZSdib29sZWFuJzpcbmNhc2UnYmlnaW50JzpcbmNhc2Unc3RyaW5nJzp7XG4vKiBXaXRoaW4gZWFjaCBvZiB0aGVzZSBwYXNzU3R5bGVzLCB0aGUgcmFuayBvcmRlcmluZyBhZ3JlZXMgd2l0aCovXG4vKiBKYXZhU2NyaXB0J3MgcmVsYXRpb25hbCBvcGVyYXRvcnMgYDxgIGFuZCBgPmAuKi9cbmlmKGxlZnQ8cmlnaHQpe1xucmV0dXJuLTE7XG4gfWVsc2V7XG5hc3NlcnQobGVmdD5yaWdodCk7XG5yZXR1cm4gMTtcbiB9XG4gfVxuY2FzZSdzeW1ib2wnOntcbnJldHVybiBjb21wYXJhdG9yKFxubmFtZUZvclBhc3NhYmxlU3ltYm9sKGxlZnQpLFxubmFtZUZvclBhc3NhYmxlU3ltYm9sKHJpZ2h0KSk7XG5cbiB9XG5jYXNlJ251bWJlcic6e1xuLyogYE5hTmAncyByYW5rIGlzIGFmdGVyIGFsbCBvdGhlciBudW1iZXJzLiovXG5pZihOdW1iZXIuaXNOYU4obGVmdCkpe1xuYXNzZXJ0KCFOdW1iZXIuaXNOYU4ocmlnaHQpKTtcbnJldHVybiAxO1xuIH1lbHNlIGlmKE51bWJlci5pc05hTihyaWdodCkpe1xucmV0dXJuLTE7XG4gfVxuLyogVGhlIHJhbmsgb3JkZXJpbmcgb2Ygbm9uLU5hTiBudW1iZXJzIGFncmVlcyB3aXRoIEphdmFTY3JpcHQncyovXG4vKiByZWxhdGlvbmFsIG9wZXJhdG9ycyAnPCcgYW5kICc+Jy4qL1xuaWYobGVmdDxyaWdodCl7XG5yZXR1cm4tMTtcbiB9ZWxzZXtcbmFzc2VydChsZWZ0PnJpZ2h0KTtcbnJldHVybiAxO1xuIH1cbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbi8qIExleGljb2dyYXBoaWMgYnkgaW52ZXJzZSBzb3J0ZWQgb3JkZXIgb2YgcHJvcGVydHkgbmFtZXMsIHRoZW4qL1xuLyogbGV4aWNvZ3JhcGhpYyBieSBjb3JyZXNwb25kaW5nIHZhbHVlcyBpbiB0aGF0IHNhbWUgaW52ZXJzZSovXG4vKiBvcmRlciBvZiB0aGVpciBwcm9wZXJ0eSBuYW1lcy4gQ29tcGFyaW5nIG5hbWVzIGJ5IHRoZW1zZWx2ZXMgZmlyc3QsKi9cbi8qIGFsbCByZWNvcmRzIHdpdGggdGhlIGV4YWN0IHNhbWUgc2V0IG9mIHByb3BlcnR5IG5hbWVzIHNvcnQgbmV4dCB0byovXG4vKiBlYWNoIG90aGVyIGluIGEgcmFuay1zb3J0IG9mIGNvcHlSZWNvcmRzLiovXG5cbi8qIFRoZSBjb3B5UmVjb3JkIGludmFyaWFudHMgZW5mb3JjZWQgYnkgcGFzc1N0eWxlT2YgZW5zdXJlIHRoYXQqL1xuLyogYWxsIHRoZSBwcm9wZXJ0eSBuYW1lcyBhcmUgc3RyaW5ncy4gV2UgbmVlZCB0aGUgcmV2ZXJzZSBzb3J0ZWQgb3JkZXIqL1xuLyogb2YgdGhlc2UgbmFtZXMsIHdoaWNoIHdlIHRoZW4gY29tcGFyZSBsZXhpY29ncmFwaGljYWxseS4gVGhpcyBlbnN1cmVzKi9cbi8qIHRoYXQgaWYgdGhlIG5hbWVzIG9mIHJlY29yZCBYIGFyZSBhIHN1YnNldCBvZiB0aGUgbmFtZXMgb2YgcmVjb3JkIFksKi9cbi8qIHRoZW4gcmVjb3JkIFggd2lsbCBoYXZlIGFuIGVhcmxpZXIgcmFuayBhbmQgc29ydCB0byB0aGUgbGVmdCBvZiBZLiovXG5jb25zdCBsZWZ0TmFtZXM9cmVjb3JkTmFtZXMobGVmdCk7XG5jb25zdCByaWdodE5hbWVzPXJlY29yZE5hbWVzKHJpZ2h0KTtcblxuY29uc3QgcmVzdWx0PWNvbXBhcmF0b3IobGVmdE5hbWVzLHJpZ2h0TmFtZXMpO1xuaWYocmVzdWx0IT09MCl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbnJldHVybiBjb21wYXJhdG9yKFxucmVjb3JkVmFsdWVzKGxlZnQsbGVmdE5hbWVzKSxcbnJlY29yZFZhbHVlcyhyaWdodCxyaWdodE5hbWVzKSk7XG5cbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xuLyogTGV4aWNvZ3JhcGhpYyovXG5jb25zdCBsZW49TWF0aC5taW4obGVmdC5sZW5ndGgscmlnaHQubGVuZ3RoKTtcbmZvcihsZXQgaT0wO2k8bGVuO2krPTEpe1xuY29uc3QgcmVzdWx0PWNvbXBhcmF0b3IobGVmdFtpXSxyaWdodFtpXSk7XG5pZihyZXN1bHQhPT0wKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbi8qIElmIGFsbCBtYXRjaGluZyBlbGVtZW50cyB3ZXJlIHRpZWQsIHRoZW4gYWNjb3JkaW5nIHRvIHRoZWlyIGxlbmd0aHMuKi9cbi8qIElmIGFycmF5IFggaXMgYSBwcmVmaXggb2YgYXJyYXkgWSwgdGhlbiBYIGhhcyBhbiBlYXJsaWVyIHJhbmsgdGhhbiBZLiovXG5yZXR1cm4gY29tcGFyYXRvcihsZWZ0Lmxlbmd0aCxyaWdodC5sZW5ndGgpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG4vKiBMZXhpY29ncmFwaGljIGJ5IGBbU3ltYm9sLnRvU3RyaW5nVGFnXWAgdGhlbiBgLnBheWxvYWRgLiovXG5jb25zdCBsYWJlbENvbXA9Y29tcGFyYXRvcihnZXRUYWcobGVmdCksZ2V0VGFnKHJpZ2h0KSk7XG5pZihsYWJlbENvbXAhPT0wKXtcbnJldHVybiBsYWJlbENvbXA7XG4gfVxucmV0dXJuIGNvbXBhcmF0b3IobGVmdC5wYXlsb2FkLHJpZ2h0LnBheWxvYWQpO1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgVW5yZWNvZ25pemVkIHBhc3NTdHlsZTogJHtxKGxlZnRTdHlsZSl9YDtcbiB9fVxuXG4gfTtcblxuLyoqIEB0eXBlIHtSYW5rQ29tcGFyZX0gKi9cbmNvbnN0IGFudGlDb21wYXJhdG9yPSh4LHkpPT5jb21wYXJhdG9yKHkseCk7XG5cbm1lbW9PZlNvcnRlZC5zZXQoY29tcGFyYXRvcixuZXcgV2Vha1NldCgpKTtcbm1lbW9PZlNvcnRlZC5zZXQoYW50aUNvbXBhcmF0b3IsbmV3IFdlYWtTZXQoKSk7XG5jb21wYXJhdG9yTWlycm9ySW1hZ2VzLnNldChjb21wYXJhdG9yLGFudGlDb21wYXJhdG9yKTtcbmNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuc2V0KGFudGlDb21wYXJhdG9yLGNvbXBhcmF0b3IpO1xuXG5yZXR1cm4gaGFyZGVuKHtjb21wYXJhdG9yLGFudGlDb21wYXJhdG9yfSk7XG4gfTtcbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyYXRvclxuICogQHJldHVybnMge1JhbmtDb21wYXJlPX1cbiAqLyRo4oCNX29uY2UubWFrZUNvbXBhcmF0b3JLaXQobWFrZUNvbXBhcmF0b3JLaXQpO1xuY29uc3QgICAgICAgIGNvbXBhcmF0b3JNaXJyb3JJbWFnZT0oY29tcGFyYXRvcik9PlxuY29tcGFyYXRvck1pcnJvckltYWdlcy5nZXQoY29tcGFyYXRvcik7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBwYXNzYWJsZXNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjigI1fb25jZS5jb21wYXJhdG9yTWlycm9ySW1hZ2UoY29tcGFyYXRvck1pcnJvckltYWdlKTtcbmNvbnN0ICAgICAgICBpc1JhbmtTb3J0ZWQ9KHBhc3NhYmxlcyxjb21wYXJlKT0+e1xuY29uc3Qgc3ViTWVtb09mU29ydGVkPW1lbW9PZlNvcnRlZC5nZXQoY29tcGFyZSk7XG5hc3NlcnQoc3ViTWVtb09mU29ydGVkIT09dW5kZWZpbmVkKTtcbmlmKHN1Yk1lbW9PZlNvcnRlZC5oYXMocGFzc2FibGVzKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5hc3NlcnQocGFzc1N0eWxlT2YocGFzc2FibGVzKT09PSdjb3B5QXJyYXknKTtcbmZvcihsZXQgaT0xO2k8cGFzc2FibGVzLmxlbmd0aDtpKz0xKXtcbmlmKGNvbXBhcmUocGFzc2FibGVzW2ktMV0scGFzc2FibGVzW2ldKT49MSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cbnN1Yk1lbW9PZlNvcnRlZC5hZGQocGFzc2FibGVzKTtcbnJldHVybiB0cnVlO1xuIH07JGjigI1fb25jZS5pc1JhbmtTb3J0ZWQoaXNSYW5rU29ydGVkKTtcbmhhcmRlbihpc1JhbmtTb3J0ZWQpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc29ydGVkXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRSYW5rU29ydGVkPShzb3J0ZWQsY29tcGFyZSk9PlxuaXNSYW5rU29ydGVkKHNvcnRlZCxjb21wYXJlKXx8XG4vKiBUT0RPIGFzc2VydCBvbiBidWcgY291bGQgbGVhZCB0byBpbmZpbml0ZSByZWN1cnNpb24uIEZpeC4qL1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbkZhaWwgYE11c3QgYmUgcmFuayBzb3J0ZWQ6ICR7c29ydGVkfSB2cyAke3NvcnRCeVJhbmsoc29ydGVkLGNvbXBhcmUpfWA7JGjigI1fb25jZS5hc3NlcnRSYW5rU29ydGVkKGFzc2VydFJhbmtTb3J0ZWQpO1xuaGFyZGVuKGFzc2VydFJhbmtTb3J0ZWQpO1xuXG4vKipcbiAqIFRPRE8gU0VDVVJJVFkgQlVHOiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQyNjBcbiAqIHNvcnRCeVJhbmsgY3VycmVudGx5IHVzZXMgYEFycmF5LnByb3RvdHlwZS5zb3J0YCBkaXJlY3RseSwgYW5kXG4gKiBzbyBvbmx5IHdvcmtzIGNvcnJlY3RseSB3aGVuIGdpdmVuIGEgYGNvbXBhcmVgIGZ1bmN0aW9uIHRoYXQgY29uc2lkZXJzXG4gKiBgdW5kZWZpbmVkYCBzdHJpY3RseSBiaWdnZXIgKGA+YCkgdGhhbiBldmVyeXRoaW5nIGVsc2UuIFRoaXMgaXNcbiAqIGJlY2F1c2UgYEFycmF5LnByb3RvdHlwZS5zb3J0YCBiaXphcnJlbHkgbW92ZXMgYWxsIGB1bmRlZmluZWRgcyB0b1xuICogdGhlIGVuZCBvZiB0aGUgYXJyYXkgcmVnYXJkbGVzcywgd2l0aG91dCBjb25zdWx0aW5nIHRoZSBgY29tcGFyZWBcbiAqIGZ1bmN0aW9uLiBUaGlzIGlzIGEgZ2VudWluZSBidWcgZm9yIHVzIE5PVyBiZWNhdXNlIHNvbWV0aW1lcyB3ZSBzb3J0XG4gKiBpbiByZXZlcnNlIG9yZGVyIGJ5IHBhc3NpbmcgYSByZXZlcnNlZCByYW5rIGNvbXBhcmlzb24gZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtJdGVyYWJsZTxQYXNzYWJsZT59IHBhc3NhYmxlc1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHJldHVybnMge1Bhc3NhYmxlW119XG4gKi9cbmNvbnN0ICAgICAgICBzb3J0QnlSYW5rPShwYXNzYWJsZXMsY29tcGFyZSk9PntcbmlmKEFycmF5LmlzQXJyYXkocGFzc2FibGVzKSl7XG5oYXJkZW4ocGFzc2FibGVzKTtcbi8qIENhbGxpbmcgaXNSYW5rU29ydGVkIGdpdmVzIGl0IGEgY2hhbmNlIHRvIGdldCBtZW1vaXplZCBmb3IqL1xuLyogdGhpcyBgY29tcGFyZWAgZnVuY3Rpb24gZXZlbiBpZiBpdCB3YXMgYWxyZWFkeSBtZW1vaXplZCBmb3IgYSBkaWZmZXJlbnQqL1xuLyogYGNvbXBhcmVgIGZ1bmN0aW9uLiovXG5pZihpc1JhbmtTb3J0ZWQocGFzc2FibGVzLGNvbXBhcmUpKXtcbnJldHVybiBwYXNzYWJsZXM7XG4gfVxuIH1cbmNvbnN0IHVuc29ydGVkPVsuLi5wYXNzYWJsZXNdO1xudW5zb3J0ZWQuZm9yRWFjaChoYXJkZW4pO1xuY29uc3Qgc29ydGVkPWhhcmRlbih1bnNvcnRlZC5zb3J0KGNvbXBhcmUpKTtcbmNvbnN0IHN1Yk1lbW9PZlNvcnRlZD1tZW1vT2ZTb3J0ZWQuZ2V0KGNvbXBhcmUpO1xuYXNzZXJ0KHN1Yk1lbW9PZlNvcnRlZCE9PXVuZGVmaW5lZCk7XG5zdWJNZW1vT2ZTb3J0ZWQuYWRkKHNvcnRlZCk7XG5yZXR1cm4gc29ydGVkO1xuIH07JGjigI1fb25jZS5zb3J0QnlSYW5rKHNvcnRCeVJhbmspO1xuaGFyZGVuKHNvcnRCeVJhbmspO1xuXG4vKipcbiAqIFNlZVxuICogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmluYXJ5X3NlYXJjaF9hbGdvcml0aG0jUHJvY2VkdXJlX2Zvcl9maW5kaW5nX3RoZV9sZWZ0bW9zdF9lbGVtZW50XG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGtleVxuICogQHBhcmFtIHsoXCJsZWZ0TW9zdFwiIHwgXCJyaWdodE1vc3RcIik9fSBiaWFzXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5jb25zdCByYW5rU2VhcmNoPShzb3J0ZWQsY29tcGFyZSxrZXksYmlhcz0nbGVmdE1vc3QnKT0+e1xuYXNzZXJ0UmFua1NvcnRlZChzb3J0ZWQsY29tcGFyZSk7XG5sZXQgbGVmdD0wO1xubGV0IHJpZ2h0PXNvcnRlZC5sZW5ndGg7XG53aGlsZShsZWZ0PHJpZ2h0KXtcbmNvbnN0IG09TWF0aC5mbG9vcigobGVmdCtyaWdodCkvMik7XG5jb25zdCBjb21wPWNvbXBhcmUoc29ydGVkW21dLGtleSk7XG5pZihjb21wPD0tMXx8Y29tcD09PTAmJmJpYXM9PT0ncmlnaHRNb3N0Jyl7XG5sZWZ0PW0rMTtcbiB9ZWxzZXtcbmFzc2VydChjb21wPj0xfHxjb21wPT09MCYmYmlhcz09PSdsZWZ0TW9zdCcpO1xucmlnaHQ9bTtcbiB9XG4gfVxucmV0dXJuIGJpYXM9PT0nbGVmdE1vc3QnP2xlZnQ6cmlnaHQtMTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc29ydGVkXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gcmFua0NvdmVyXG4gKiBAcmV0dXJucyB7SW5kZXhDb3Zlcn1cbiAqL1xuY29uc3QgICAgICAgIGdldEluZGV4Q292ZXI9KHNvcnRlZCxjb21wYXJlLFtsZWZ0S2V5LHJpZ2h0S2V5XSk9PntcbmFzc2VydFJhbmtTb3J0ZWQoc29ydGVkLGNvbXBhcmUpO1xuY29uc3QgbGVmdEluZGV4PXJhbmtTZWFyY2goc29ydGVkLGNvbXBhcmUsbGVmdEtleSwnbGVmdE1vc3QnKTtcbmNvbnN0IHJpZ2h0SW5kZXg9cmFua1NlYXJjaChzb3J0ZWQsY29tcGFyZSxyaWdodEtleSwncmlnaHRNb3N0Jyk7XG5yZXR1cm5bbGVmdEluZGV4LHJpZ2h0SW5kZXhdO1xuIH07JGjigI1fb25jZS5nZXRJbmRleENvdmVyKGdldEluZGV4Q292ZXIpO1xuaGFyZGVuKGdldEluZGV4Q292ZXIpO1xuXG4vKiogQHR5cGUge1JhbmtDb3Zlcn0gKi9cbmNvbnN0ICAgICAgICBGdWxsUmFua0NvdmVyPWhhcmRlbihbJycsJ3snXSk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7SW5kZXhDb3Zlcn0gaW5kZXhDb3ZlclxuICogQHJldHVybnMge0l0ZXJhYmxlPFtudW1iZXIsIFBhc3NhYmxlXT59XG4gKi8kaOKAjV9vbmNlLkZ1bGxSYW5rQ292ZXIoRnVsbFJhbmtDb3Zlcik7XG5jb25zdCAgICAgICAgY292ZXJlZEVudHJpZXM9KHNvcnRlZCxbbGVmdEluZGV4LHJpZ2h0SW5kZXhdKT0+e1xuLyoqIEB0eXBlIHtJdGVyYWJsZTxbbnVtYmVyLCBQYXNzYWJsZV0+fSAqL1xuY29uc3QgaXRlcmFibGU9aGFyZGVuKHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5sZXQgaT1sZWZ0SW5kZXg7XG5yZXR1cm4gaGFyZGVuKHtcbm5leHQ6KCk9PntcbmlmKGk8PXJpZ2h0SW5kZXgpe1xuY29uc3QgZWxlbWVudD1zb3J0ZWRbaV07XG5pKz0xO1xucmV0dXJuIGhhcmRlbih7dmFsdWU6W2ksZWxlbWVudF0sZG9uZTpmYWxzZX0pO1xuIH1lbHNle1xucmV0dXJuIGhhcmRlbih7dmFsdWU6dW5kZWZpbmVkLGRvbmU6dHJ1ZX0pO1xuIH1cbiB9fSk7XG5cbiB9fSk7XG5cbnJldHVybiBpdGVyYWJsZTtcbiB9OyRo4oCNX29uY2UuY292ZXJlZEVudHJpZXMoY292ZXJlZEVudHJpZXMpO1xuaGFyZGVuKGNvdmVyZWRFbnRyaWVzKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBhXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBiXG4gKiBAcmV0dXJucyB7UGFzc2FibGV9XG4gKi9cbmNvbnN0IG1heFJhbms9KGNvbXBhcmUsYSxiKT0+Y29tcGFyZShhLGIpPj0wP2E6YjtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBhXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBiXG4gKiBAcmV0dXJucyB7UGFzc2FibGV9XG4gKi9cbmNvbnN0IG1pblJhbms9KGNvbXBhcmUsYSxiKT0+Y29tcGFyZShhLGIpPD0wP2E6YjtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1JhbmtDb3ZlcltdfSBjb3ZlcnNcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0ICAgICAgICB1bmlvblJhbmtDb3ZlcnM9KGNvbXBhcmUsY292ZXJzKT0+e1xuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gYVxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IGJcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0IHVuaW9uUmFua0NvdmVyUGFpcj0oW2xlZnRBLHJpZ2h0QV0sW2xlZnRCLHJpZ2h0Ql0pPT5bXG5taW5SYW5rKGNvbXBhcmUsbGVmdEEsbGVmdEIpLFxubWF4UmFuayhjb21wYXJlLHJpZ2h0QSxyaWdodEIpXTtcblxucmV0dXJuIGNvdmVycy5yZWR1Y2UodW5pb25SYW5rQ292ZXJQYWlyLFsneycsJyddKTtcbiB9OyRo4oCNX29uY2UudW5pb25SYW5rQ292ZXJzKHVuaW9uUmFua0NvdmVycyk7XG5oYXJkZW4odW5pb25SYW5rQ292ZXJzKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1JhbmtDb3ZlcltdfSBjb3ZlcnNcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBpbnRlcnNlY3RSYW5rQ292ZXJzPShjb21wYXJlLGNvdmVycyk9Pntcbi8qKlxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IGFcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSBiXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG5jb25zdCBpbnRlcnNlY3RSYW5rQ292ZXJQYWlyPShbbGVmdEEscmlnaHRBXSxbbGVmdEIscmlnaHRCXSk9Pltcbm1heFJhbmsoY29tcGFyZSxsZWZ0QSxsZWZ0QiksXG5taW5SYW5rKGNvbXBhcmUscmlnaHRBLHJpZ2h0QildO1xuXG5yZXR1cm4gY292ZXJzLnJlZHVjZShpbnRlcnNlY3RSYW5rQ292ZXJQYWlyLFsnJywneyddKTtcbiB9OyRo4oCNX29uY2UuaW50ZXJzZWN0UmFua0NvdmVycyhpbnRlcnNlY3RSYW5rQ292ZXJzKTtcblxuY29uc3QgICAgICAge1xuY29tcGFyYXRvcjpjb21wYXJlUmFuayxcbmFudGlDb21wYXJhdG9yOmNvbXBhcmVBbnRpUmFua309XG5tYWtlQ29tcGFyYXRvcktpdCgpO1xuXG4vKipcbiAqIENyZWF0ZSBhIGNvbXBhcmF0b3Iga2l0IGluIHdoaWNoIHJlbW90YWJsZXMgYXJlIGZ1bGx5IG9yZGVyZWRcbiAqIGJ5IHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFyZSBmaXJzdCBzZWVuIGJ5ICp0aGlzKiBjb21wYXJhdG9yIGtpdC5cbiAqIEJFV0FSRTogVGhpcyBpcyBvYnNlcnZhYmxlIG11dGFibGUgc3RhdGUsIHNvIHN1Y2ggYSBjb21wYXJhdG9yIGtpdFxuICogc2hvdWxkIG5ldmVyIGJlIHNoYXJlZCBhbW9uZyBzdWJzeXN0ZW1zIHRoYXQgc2hvdWxkIG5vdCBiZSBhYmxlXG4gKiB0byBjb21tdW5pY2F0ZS5cbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBvcmRlciBkb2VzIG5vdCBtZWV0IHRoZSByZXF1aXJlbWVudHMgZm9yIHN0b3JlXG4gKiBvcmRlcmluZywgc2luY2UgaXQgaGFzIG5vIG1lbW9yeSBvZiBkZWxldGVkIGtleXMuXG4gKlxuICogVGhlc2UgZnVsbCBvcmRlciBjb21wYXJhdG9yIGtpdCBpcyBzdHJpY3RseSBtb3JlIHByZWNpc2UgdGhhdCB0aGVcbiAqIHJhbmsgb3JkZXIgY29tcGFyYXRvciBraXRzIGFib3ZlLiBBcyBhIHJlc3VsdCwgYW55IGFycmF5IHdoaWNoIGlzXG4gKiBzb3J0ZWQgYnkgc3VjaCBhIGZ1bGwgb3JkZXIgd2lsbCBwYXNzIHRoZSBpc1JhbmtTb3J0ZWQgdGVzdCB3aXRoXG4gKiBhIGNvcnJlc3BvbmRpbmcgcmFuayBvcmRlci5cbiAqXG4gKiBBbiBhcnJheSB3aGljaCBpcyBzb3J0ZWQgYnkgYSAqZnJlc2gqIGZ1bGwgb3JkZXIgY29tcGFyYXRvciwgaS5lLixcbiAqIG9uZSB0aGF0IGhhcyBub3QgeWV0IHNlZW4gYW55IHJlbW90YWJsZXMsIHdpbGwgb2YgY291cnNlIHJlbWFpblxuICogc29ydGVkIGJ5IGFjY29yZGluZyB0byAqdGhhdCogZnVsbCBvcmRlciBjb21wYXJhdG9yLiBBbiBhcnJheSAqb2ZcbiAqIHNjYWxhcnMqIHNvcnRlZCBieSBhIGZyZXNoIGZ1bGwgb3JkZXIgd2lsbCByZW1haW4gc29ydGVkIGV2ZW5cbiAqIGFjY29yZGluZyB0byBhIG5ldyBmcmVzaCBmdWxsIG9yZGVyIGNvbXBhcmF0b3IsIHNpbmNlIGl0IHdpbGwgc2VlXG4gKiB0aGUgcmVtb3RhYmxlcyBpbiB0aGUgc2FtZSBvcmRlciBhZ2Fpbi4gVW5mb3J0dW5hdGVseSwgdGhpcyBpc1xuICogbm90IHRydWUgb2YgYXJyYXlzIG9mIHBhc3NhYmxlcyBpbiBnZW5lcmFsLlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IGxvbmdMaXZlZFxuICogQHJldHVybnMge0Z1bGxDb21wYXJhdG9yS2l0fVxuICovJGjigI1fb25jZS5jb21wYXJlUmFuayhjb21wYXJlUmFuayk7JGjigI1fb25jZS5jb21wYXJlQW50aVJhbmsoY29tcGFyZUFudGlSYW5rKTtcbmNvbnN0ICAgICAgICBtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdD0obG9uZ0xpdmVkPWZhbHNlKT0+e1xubGV0IG51bVNlZW49MDtcbi8qIFdoZW4gZHluYW1pY2FsbHkgY3JlYXRlZCB3aXRoIHNob3J0IGxpZmV0aW1lcyAodGhlIGRlZmF1bHQpIGEgV2Vha01hcCovXG4vKiB3b3VsZCBwZXJmb3JtIHBvb3JseSwgYW5kIHRoZSBsZWFrIGNyZWF0ZWQgYnkgYSBNYXAgb25seSBsYXN0cyBhcyBsb25nKi9cbi8qIGFzIHRoZSBNYXAuKi9cbmNvbnN0IE1hcENvbnN0cnVjdG9yPWxvbmdMaXZlZD9XZWFrTWFwOk1hcDtcbmNvbnN0IHNlZW49bmV3IE1hcENvbnN0cnVjdG9yKCk7XG5jb25zdCB0YWc9KHIpPT57XG5pZihzZWVuLmhhcyhyKSl7XG5yZXR1cm4gc2Vlbi5nZXQocik7XG4gfVxubnVtU2Vlbis9MTtcbnNlZW4uc2V0KHIsbnVtU2Vlbik7XG5yZXR1cm4gbnVtU2VlbjtcbiB9O1xuY29uc3QgY29tcGFyZVJlbW90YWJsZXM9KHgseSk9PmNvbXBhcmVSYW5rKHRhZyh4KSx0YWcoeSkpO1xucmV0dXJuIG1ha2VDb21wYXJhdG9yS2l0KGNvbXBhcmVSZW1vdGFibGVzKTtcbiB9OyRo4oCNX29uY2UubWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQpO1xuaGFyZGVuKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRQYXNzU3R5bGVDb3ZlciI6WyJnZXRQYXNzU3R5bGVDb3ZlciJdLCJtYWtlQ29tcGFyYXRvcktpdCI6WyJtYWtlQ29tcGFyYXRvcktpdCJdLCJjb21wYXJhdG9yTWlycm9ySW1hZ2UiOlsiY29tcGFyYXRvck1pcnJvckltYWdlIl0sImlzUmFua1NvcnRlZCI6WyJpc1JhbmtTb3J0ZWQiXSwiYXNzZXJ0UmFua1NvcnRlZCI6WyJhc3NlcnRSYW5rU29ydGVkIl0sInNvcnRCeVJhbmsiOlsic29ydEJ5UmFuayJdLCJnZXRJbmRleENvdmVyIjpbImdldEluZGV4Q292ZXIiXSwiRnVsbFJhbmtDb3ZlciI6WyJGdWxsUmFua0NvdmVyIl0sImNvdmVyZWRFbnRyaWVzIjpbImNvdmVyZWRFbnRyaWVzIl0sInVuaW9uUmFua0NvdmVycyI6WyJ1bmlvblJhbmtDb3ZlcnMiXSwiaW50ZXJzZWN0UmFua0NvdmVycyI6WyJpbnRlcnNlY3RSYW5rQ292ZXJzIl0sImNvbXBhcmVSYW5rIjpbImNvbXBhcmVSYW5rIl0sImNvbXBhcmVBbnRpUmFuayI6WyJjb21wYXJlQW50aVJhbmsiXSwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiOlsibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAgjnZkwMNAAADDQAAJgAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlT2YuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRSZWNvcmQiLCJhc3NlcnRSZW1vdGFibGUiLCJpc0NvcHlBcnJheSIsImlzUmVjb3JkIiwiaXNSZW1vdGFibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFzc1N0eWxlT2Y7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNvcHlBcnJheTxUPn0gQ29weUFycmF5ICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db3B5UmVjb3JkPFQ+fSBDb3B5UmVjb3JkICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5SZW1vdGFibGV9IFJlbW90YWJsZSAqL1xuXG5jb25zdHtGYWlsLHF1b3RlOnF9PWFzc2VydDtcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIHBhc3MtYnktY29weSBhcnJheSwgQUtBIGEgXCJjb3B5QXJyYXlcIlxuICogaW4gQGVuZG8vbWFyc2hhbCB0ZXJtc1xuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFycmF5XG4gKiBAcmV0dXJucyB7YXJyYXkgaXMgQ29weUFycmF5PGFueT59XG4gKi9cbmNvbnN0IGlzQ29weUFycmF5PShhcnJheSk9PnBhc3NTdHlsZU9mKGFycmF5KT09PSdjb3B5QXJyYXknOyRo4oCNX29uY2UuaXNDb3B5QXJyYXkoaXNDb3B5QXJyYXkpO1xuaGFyZGVuKGlzQ29weUFycmF5KTtcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIHBhc3MtYnktY29weSByZWNvcmQsIEFLQSBhXG4gKiBcImNvcHlSZWNvcmRcIiBpbiBAZW5kby9tYXJzaGFsIHRlcm1zXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcmVjb3JkXG4gKiBAcmV0dXJucyB7cmVjb3JkIGlzIENvcHlSZWNvcmQ8YW55Pn1cbiAqL1xuY29uc3QgaXNSZWNvcmQ9KHJlY29yZCk9PnBhc3NTdHlsZU9mKHJlY29yZCk9PT0nY29weVJlY29yZCc7JGjigI1fb25jZS5pc1JlY29yZChpc1JlY29yZCk7XG5oYXJkZW4oaXNSZWNvcmQpO1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgcmVtb3RhYmxlLlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJlbW90YWJsZVxuICogQHJldHVybnMge3JlbW90YWJsZSBpcyBSZW1vdGFibGV9XG4gKi9cbmNvbnN0IGlzUmVtb3RhYmxlPShyZW1vdGFibGUpPT5wYXNzU3R5bGVPZihyZW1vdGFibGUpPT09J3JlbW90YWJsZSc7JGjigI1fb25jZS5pc1JlbW90YWJsZShpc1JlbW90YWJsZSk7XG5oYXJkZW4oaXNSZW1vdGFibGUpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRBcnJheVxuICogQHBhcmFtIHtQYXNzYWJsZX0gYXJyYXlcbiAqIEBwYXJhbSB7c3RyaW5nPX0gb3B0TmFtZU9mQXJyYXlcbiAqIEByZXR1cm5zIHthc3NlcnRzIGFycmF5IGlzIENvcHlBcnJheTxhbnk+fVxuICovXG5cbi8qKiBAdHlwZSB7QXNzZXJ0QXJyYXl9ICovXG5jb25zdCBhc3NlcnRDb3B5QXJyYXk9KGFycmF5LG9wdE5hbWVPZkFycmF5PSdBbGxlZ2VkIGFycmF5Jyk9PntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihhcnJheSk7XG5wYXNzU3R5bGU9PT0nY29weUFycmF5J3x8XG5GYWlsIGAke3Eob3B0TmFtZU9mQXJyYXkpfSAke2FycmF5fSBtdXN0IGJlIGEgcGFzcy1ieS1jb3B5IGFycmF5LCBub3QgJHtxKFxucGFzc1N0eWxlKVxuIH1gO1xuIH07JGjigI1fb25jZS5hc3NlcnRDb3B5QXJyYXkoYXNzZXJ0Q29weUFycmF5KTtcbmhhcmRlbihhc3NlcnRDb3B5QXJyYXkpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRSZWNvcmRcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJlY29yZFxuICogQHBhcmFtIHtzdHJpbmc9fSBvcHROYW1lT2ZSZWNvcmRcbiAqIEByZXR1cm5zIHthc3NlcnRzIHJlY29yZCBpcyBDb3B5UmVjb3JkPGFueT59XG4gKi9cblxuLyoqIEB0eXBlIHtBc3NlcnRSZWNvcmR9ICovXG5jb25zdCBhc3NlcnRSZWNvcmQ9KHJlY29yZCxvcHROYW1lT2ZSZWNvcmQ9J0FsbGVnZWQgcmVjb3JkJyk9PntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihyZWNvcmQpO1xucGFzc1N0eWxlPT09J2NvcHlSZWNvcmQnfHxcbkZhaWwgYCR7cShvcHROYW1lT2ZSZWNvcmQpfSAke3JlY29yZH0gbXVzdCBiZSBhIHBhc3MtYnktY29weSByZWNvcmQsIG5vdCAke3EoXG5wYXNzU3R5bGUpXG4gfWA7XG4gfTskaOKAjV9vbmNlLmFzc2VydFJlY29yZChhc3NlcnRSZWNvcmQpO1xuaGFyZGVuKGFzc2VydFJlY29yZCk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFJlbW90YWJsZVxuICogQHBhcmFtIHtQYXNzYWJsZX0gcmVtb3RhYmxlXG4gKiBAcGFyYW0ge3N0cmluZz19IG9wdE5hbWVPZlJlbW90YWJsZVxuICogQHJldHVybnMge2Fzc2VydHMgcmVtb3RhYmxlIGlzIFJlbW90YWJsZX1cbiAqL1xuXG4vKiogQHR5cGUge0Fzc2VydFJlbW90YWJsZX0gKi9cbmNvbnN0IGFzc2VydFJlbW90YWJsZT0oXG5yZW1vdGFibGUsXG5vcHROYW1lT2ZSZW1vdGFibGU9J0FsbGVnZWQgcmVtb3RhYmxlJyk9Plxue1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHJlbW90YWJsZSk7XG5wYXNzU3R5bGU9PT0ncmVtb3RhYmxlJ3x8XG5GYWlsIGAke3Eob3B0TmFtZU9mUmVtb3RhYmxlKX0gJHtyZW1vdGFibGV9IG11c3QgYmUgYSByZW1vdGFibGUsIG5vdCAke3EoXG5wYXNzU3R5bGUpXG4gfWA7XG4gfTskaOKAjV9vbmNlLmFzc2VydFJlbW90YWJsZShhc3NlcnRSZW1vdGFibGUpO1xuaGFyZGVuKGFzc2VydFJlbW90YWJsZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNDb3B5QXJyYXkiOlsiaXNDb3B5QXJyYXkiXSwiaXNSZWNvcmQiOlsiaXNSZWNvcmQiXSwiaXNSZW1vdGFibGUiOlsiaXNSZW1vdGFibGUiXSwiYXNzZXJ0Q29weUFycmF5IjpbImFzc2VydENvcHlBcnJheSJdLCJhc3NlcnRSZWNvcmQiOlsiYXNzZXJ0UmVjb3JkIl0sImFzc2VydFJlbW90YWJsZSI6WyJhc3NlcnRSZW1vdGFibGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAu1cO9x8BAAAfAQAAIQAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD/CipPugsAALoLAAAeAAAAQGVuZG8vbmF0LXY0LjEuMjQvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJOYXQiLCJpc05hdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShpc05hdCwgJ25hbWUnLCB7dmFsdWU6IFwiaXNOYXRcIn0pOyRo4oCNX29uY2UuaXNOYXQoaXNOYXQpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShOYXQsICduYW1lJywge3ZhbHVlOiBcIk5hdFwifSk7JGjigI1fb25jZS5OYXQoTmF0KTsgICAvKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4qL1xuLyogQ29weXJpZ2h0IChDKSAyMDE4IEFnb3JpYyovXG4vKiovXG4vKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyovXG4vKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuKi9cbi8qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCovXG4vKiovXG4vKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAqL1xuLyoqL1xuLyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSovXG4vKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsKi9cbi8qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiovXG4vKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kKi9cbi8qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiovXG5cbi8qIEB0cy1jaGVjayovXG5cbi8qKlxuICogSXMgYGFsbGVnZWROdW1gIGEgbnVtYmVyIGluIHRoZSBbY29udGlndW91cyByYW5nZSBvZiBleGFjdGx5IGFuZFxuICogdW5hbWJpZ3VvdXNseVxuICogcmVwcmVzZW50YWJsZV0oaHR0cHM6Ly9lc2Rpc2N1c3Mub3JnL3RvcGljL21vcmUtbnVtZXJpYy1jb25zdGFudHMtcGxlYXNlLWVzcGVjaWFsbHktZXBzaWxvbiNjb250ZW50LTE0KVxuICogIG5hdHVyYWwgbnVtYmVycyAobm9uLW5lZ2F0aXZlIGludGVnZXJzKT9cbiAqXG4gKiBUbyBxdWFsaWZ5IGBhbGxlZ2VkTnVtYCBtdXN0IGVpdGhlciBiZSBhXG4gKiBub24tbmVnYXRpdmUgYGJpZ2ludGAsIG9yIGEgbm9uLW5lZ2F0aXZlIGBudW1iZXJgIHJlcHJlc2VudGluZyBhbiBpbnRlZ2VyXG4gKiB3aXRoaW4gcmFuZ2Ugb2YgW2ludGVnZXJzIHNhZmVseSByZXByZXNlbnRhYmxlIGluXG4gKiBmbG9hdGluZyBwb2ludF0oaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1udW1iZXIuaXNzYWZlaW50ZWdlcikuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkTnVtXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNOYXQoYWxsZWdlZE51bSl7XG5pZih0eXBlb2YgYWxsZWdlZE51bT09PSdiaWdpbnQnKXtcbnJldHVybiBhbGxlZ2VkTnVtPj0wO1xuIH1cbmlmKHR5cGVvZiBhbGxlZ2VkTnVtIT09J251bWJlcicpe1xucmV0dXJuIGZhbHNlO1xuIH1cblxucmV0dXJuIE51bWJlci5pc1NhZmVJbnRlZ2VyKGFsbGVnZWROdW0pJiZhbGxlZ2VkTnVtPj0wO1xuIH1cblxuLyoqXG4gKiBJZiBgYWxsZWdlZE51bWJlcmAgcGFzc2VzIHRoZSBgaXNOYXRgIHRlc3QsIHRoZW4gcmV0dXJuIGl0IGFzIGEgYmlnaW50LlxuICogT3RoZXJ3aXNlIHRocm93IGFuIGFwcHJvcHJpYXRlIGVycm9yLlxuICpcbiAqIElmIGBhbGxlZ2VkTnVtYCBpcyBuZWl0aGVyIGEgYmlnaW50IG5vciBhIG51bWJlciwgYE5hdGAgdGhyb3dzIGEgYFR5cGVFcnJvcmAuXG4gKiBPdGhlcndpc2UsIGlmIGl0IGlzIG5vdCBhIFtzYWZlbHlcbiAqIHJlcHJlc2VudGFibGVdKGh0dHBzOi8vZXNkaXNjdXNzLm9yZy90b3BpYy9tb3JlLW51bWVyaWMtY29uc3RhbnRzLXBsZWFzZS1lc3BlY2lhbGx5LWVwc2lsb24jY29udGVudC0xNClcbiAqIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLCBgTmF0YCB0aHJvd3MgYSBgUmFuZ2VFcnJvcmAuXG4gKiBPdGhlcndpc2UsIGl0IGlzIGNvbnZlcnRlZCB0byBhIGJpZ2ludCBpZiBuZWNlc3NhcnkgYW5kIHJldHVybmVkLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZE51bVxuICogQHJldHVybnMge2JpZ2ludH1cbiAqL1xuZnVuY3Rpb24gTmF0KGFsbGVnZWROdW0pe1xuaWYodHlwZW9mIGFsbGVnZWROdW09PT0nYmlnaW50Jyl7XG5pZihhbGxlZ2VkTnVtPDApe1xudGhyb3cgbmV3IFJhbmdlRXJyb3IoIGAke2FsbGVnZWROdW19IGlzIG5lZ2F0aXZlYCk7XG4gfVxucmV0dXJuIGFsbGVnZWROdW07XG4gfVxuXG5pZih0eXBlb2YgYWxsZWdlZE51bT09PSdudW1iZXInKXtcbmlmKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihhbGxlZ2VkTnVtKSl7XG50aHJvdyBuZXcgUmFuZ2VFcnJvciggYCR7YWxsZWdlZE51bX0gbm90IGEgc2FmZSBpbnRlZ2VyYCk7XG4gfVxuaWYoYWxsZWdlZE51bTwwKXtcbnRocm93IG5ldyBSYW5nZUVycm9yKCBgJHthbGxlZ2VkTnVtfSBpcyBuZWdhdGl2ZWApO1xuIH1cbnJldHVybiBCaWdJbnQoYWxsZWdlZE51bSk7XG4gfVxuXG50aHJvdyBuZXcgVHlwZUVycm9yKFxuIGAke2FsbGVnZWROdW19IGlzIGEgJHt0eXBlb2YgYWxsZWdlZE51bX0gYnV0IG11c3QgYmUgYSBiaWdpbnQgb3IgYSBudW1iZXJgKTtcblxuIH1cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc05hdCI6WyJpc05hdCJdLCJOYXQiOlsiTmF0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEdvKsdbCQAAWwkAACIAAABAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2lzLXByb21pc2UuanMiLCIuL3NyYy9tZW1vLXJhY2UuanMiLCIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sImV4cG9ydHMiOlsibWFrZVByb21pc2VLaXQiLCJyYWNlUHJvbWlzZXMiXSwicmVleHBvcnRzIjpbIi4vc3JjL2lzLXByb21pc2UuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQsbWVtb1JhY2U7JGjigI1faW1wb3J0cyhbW1wiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanNcIiwgW1tcIm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdFwiLCBbJGjigI1fYSA9PiAobWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0ID0gJGjigI1fYSldXV1dLFtcIi4vc3JjL21lbW8tcmFjZS5qc1wiLCBbW1wibWVtb1JhY2VcIiwgWyRo4oCNX2EgPT4gKG1lbW9SYWNlID0gJGjigI1fYSldXV1dLFtcIi4vc3JjL2lzLXByb21pc2UuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShtYWtlUHJvbWlzZUtpdCwgJ25hbWUnLCB7dmFsdWU6IFwibWFrZVByb21pc2VLaXRcIn0pOyRo4oCNX29uY2UubWFrZVByb21pc2VLaXQobWFrZVByb21pc2VLaXQpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyYWNlUHJvbWlzZXMsICduYW1lJywge3ZhbHVlOiBcInJhY2VQcm9taXNlc1wifSk7JGjigI1fb25jZS5yYWNlUHJvbWlzZXMocmFjZVByb21pc2VzKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlIHtQcm9taXNlQ29uc3RydWN0b3J9ICovXG5jb25zdCBCZXN0UGlwZWxpbmFibGVQcm9taXNlPWdsb2JhbFRoaXMuSGFuZGxlZFByb21pc2V8fFByb21pc2U7XG5cbi8qKlxuICogbWFrZVByb21pc2VLaXQoKSBidWlsZHMgYSBQcm9taXNlIG9iamVjdCwgYW5kIHJldHVybnMgYSByZWNvcmRcbiAqIGNvbnRhaW5pbmcgdGhlIHByb21pc2UgaXRzZWxmLCBhcyB3ZWxsIGFzIHNlcGFyYXRlIGZhY2V0cyBmb3IgcmVzb2x2aW5nXG4gKiBhbmQgcmVqZWN0aW5nIGl0LlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcmV0dXJucyB7WGltcG9ydCgnLi9zcmMvdHlwZXMuanMnKS5Qcm9taXNlS2l0PFQ+fVxuICovXG5mdW5jdGlvbiAgICAgICAgbWFrZVByb21pc2VLaXQoKXtcbmNvbnN0e3Jlc29sdmUscmVqZWN0LGV4ZWN1dG9yfT1tYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQoKTtcblxuY29uc3QgcHJvbWlzZT1uZXcgQmVzdFBpcGVsaW5hYmxlUHJvbWlzZShleGVjdXRvcik7XG5cbnJldHVybiBoYXJkZW4oe3Byb21pc2UscmVzb2x2ZSxyZWplY3R9KTtcbiB9XG5oYXJkZW4obWFrZVByb21pc2VLaXQpO1xuXG4vKiBOQjogQW5vdGhlciBpbXBsZW1lbnRhdGlvbiBmb3IgUHJvbWlzZS5yYWNlIHdvdWxkIGJlIHRvIHVzZSB0aGUgcmVsZWFzaW5nIGV4ZWN1dG9yLCovXG4vKiBIb3dldmVyIHdoaWxlIGl0IHdvdWxkIG5vIGxvbmdlciBsZWFrIHRoZSByYWNlZCBwcm9taXNlIG9iamVjdHMgdGhlbXNlbHZlcywgaXQgd291bGQqL1xuLyogc3RpbGwgbGVhayByZWFjdGlvbnMgb24gdGhlIG5vbi1yZXNvbHZlZCBwcm9taXNlcyBjb250ZW5kaW5nIGZvciB0aGUgcmFjZS4qL1xuXG4vKipcbiAqIENyZWF0ZXMgYSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgd2hlbiBhbnkgb2YgdGhlIHByb3ZpZGVkIFByb21pc2VzIGFyZSByZXNvbHZlZFxuICogb3IgcmVqZWN0ZWQuXG4gKlxuICogVW5saWtlIGBQcm9taXNlLnJhY2VgIGl0IGNsZWFucyB1cCBhZnRlciBpdHNlbGYgc28gYSBub24tcmVzb2x2ZWQgdmFsdWUgZG9lc24ndCBob2xkIG9udG9cbiAqIHRoZSByZXN1bHQgcHJvbWlzZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gdmFsdWVzIEFuIGl0ZXJhYmxlIG9mIFByb21pc2VzLlxuICogQHJldHVybnMge1Byb21pc2U8QXdhaXRlZDxUPj59IEEgbmV3IFByb21pc2UuXG4gKi9cbmZ1bmN0aW9uICAgICAgICByYWNlUHJvbWlzZXModmFsdWVzKXtcbnJldHVybiBoYXJkZW4obWVtb1JhY2UuY2FsbChCZXN0UGlwZWxpbmFibGVQcm9taXNlLHZhbHVlcykpO1xuIH1cbmhhcmRlbihyYWNlUHJvbWlzZXMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VQcm9taXNlS2l0IjpbIm1ha2VQcm9taXNlS2l0Il0sInJhY2VQcm9taXNlcyI6WyJyYWNlUHJvbWlzZXMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAl4jgW8oCAADKAgAAKwAAAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIvc3JjL2lzLXByb21pc2UuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImlzUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShpc1Byb21pc2UsICduYW1lJywge3ZhbHVlOiBcImlzUHJvbWlzZVwifSk7JGjigI1fb25jZS5pc1Byb21pc2UoaXNQcm9taXNlKTsgICAvKipcbiAqIERldGVybWluZSBpZiB0aGUgYXJndW1lbnQgaXMgYSBQcm9taXNlLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gbWF5YmVQcm9taXNlIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcmV0dXJucyB7bWF5YmVQcm9taXNlIGlzIFByb21pc2V9IFdoZXRoZXIgaXQgaXMgYSBwcm9taXNlXG4gKi9cbmZ1bmN0aW9uICAgICAgICBpc1Byb21pc2UobWF5YmVQcm9taXNlKXtcbnJldHVybiBQcm9taXNlLnJlc29sdmUobWF5YmVQcm9taXNlKT09PW1heWJlUHJvbWlzZTtcbiB9XG5oYXJkZW4oaXNQcm9taXNlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1Byb21pc2UiOlsiaXNQcm9taXNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIQRv9OpEgAAqRIAACoAAABAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyL3NyYy9tZW1vLXJhY2UuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1lbW9SYWNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogSW5pdGlhbCB2ZXJzaW9uIGF1dGhvcmVkIGJ5IEJyaWFuIEtpbTpcbmh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9pc3N1ZXMvMTc0NjkjaXNzdWVjb21tZW50LTY4NTIxNjc3N1xuIFRoaXMgaXMgZnJlZSBhbmQgdW5lbmN1bWJlcmVkIHNvZnR3YXJlIHJlbGVhc2VkIGludG8gdGhlIHB1YmxpYyBkb21haW4uXG4gQW55b25lIGlzIGZyZWUgdG8gY29weSwgbW9kaWZ5LCBwdWJsaXNoLCB1c2UsIGNvbXBpbGUsIHNlbGwsIG9yXG5kaXN0cmlidXRlIHRoaXMgc29mdHdhcmUsIGVpdGhlciBpbiBzb3VyY2UgY29kZSBmb3JtIG9yIGFzIGEgY29tcGlsZWRcbmJpbmFyeSwgZm9yIGFueSBwdXJwb3NlLCBjb21tZXJjaWFsIG9yIG5vbi1jb21tZXJjaWFsLCBhbmQgYnkgYW55XG5tZWFucy5cbiBJbiBqdXJpc2RpY3Rpb25zIHRoYXQgcmVjb2duaXplIGNvcHlyaWdodCBsYXdzLCB0aGUgYXV0aG9yIG9yIGF1dGhvcnNcbm9mIHRoaXMgc29mdHdhcmUgZGVkaWNhdGUgYW55IGFuZCBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZVxuc29mdHdhcmUgdG8gdGhlIHB1YmxpYyBkb21haW4uIFdlIG1ha2UgdGhpcyBkZWRpY2F0aW9uIGZvciB0aGUgYmVuZWZpdFxub2YgdGhlIHB1YmxpYyBhdCBsYXJnZSBhbmQgdG8gdGhlIGRldHJpbWVudCBvZiBvdXIgaGVpcnMgYW5kXG5zdWNjZXNzb3JzLiBXZSBpbnRlbmQgdGhpcyBkZWRpY2F0aW9uIHRvIGJlIGFuIG92ZXJ0IGFjdCBvZlxucmVsaW5xdWlzaG1lbnQgaW4gcGVycGV0dWl0eSBvZiBhbGwgcHJlc2VudCBhbmQgZnV0dXJlIHJpZ2h0cyB0byB0aGlzXG5zb2Z0d2FyZSB1bmRlciBjb3B5cmlnaHQgbGF3LlxuIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsXG5FWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbk1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC5cbklOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SXG5PVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSxcbkFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUlxuT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2UgcmVmZXIgdG8gPGh0dHA6Ly91bmxpY2Vuc2Uub3JnLz5cbiovXG5cblxuXG5cblxuXG5cbmNvbnN0IGlzT2JqZWN0PSh2YWx1ZSk9Pk9iamVjdCh2YWx1ZSk9PT12YWx1ZTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgW1Q9YW55XVxuICogQHR5cGVkZWYge29iamVjdH0gRGVmZXJyZWRcbiAqIEBwcm9wZXJ0eSB7KHZhbHVlPzogWGltcG9ydChcIi4vdHlwZXMuanNcIikuRVJlZjxUPiApID0+IHZvaWR9IHJlc29sdmVcbiAqIEBwcm9wZXJ0eSB7KGVycj86IGFueSApID0+IHZvaWR9IHJlamVjdFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyBuZXZlclxuICogIHwge3NldHRsZWQ6IGZhbHNlLCBkZWZlcnJlZHM6IFNldDxEZWZlcnJlZD59XG4gKiAgfCB7c2V0dGxlZDogdHJ1ZSwgZGVmZXJyZWRzPzogdW5kZWZpbmVkfVxuICogfSBQcm9taXNlTWVtb1JlY29yZFxuICovXG5cbi8qIEtleXMgYXJlIHRoZSB2YWx1ZXMgcGFzc2VkIHRvIHJhY2UsIHZhbHVlcyBhcmUgYSByZWNvcmQgb2YgZGF0YSBjb250YWluaW5nIGEqL1xuLyogc2V0IG9mIGRlZmVycmVkcyBhbmQgd2hldGhlciB0aGUgdmFsdWUgaGFzIHNldHRsZWQuKi9cbi8qKiBAdHlwZSB7V2Vha01hcDxvYmplY3QsIFByb21pc2VNZW1vUmVjb3JkPn0gKi9cbmNvbnN0IGtub3duUHJvbWlzZXM9bmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Byb21pc2VNZW1vUmVjb3JkIHwgdW5kZWZpbmVkfSByZWNvcmRcbiAqIEByZXR1cm5zIHtTZXQ8RGVmZXJyZWQ+fVxuICovXG5jb25zdCBtYXJrU2V0dGxlZD0ocmVjb3JkKT0+e1xuaWYoIXJlY29yZHx8cmVjb3JkLnNldHRsZWQpe1xucmV0dXJuIG5ldyBTZXQoKTtcbiB9XG5cbmNvbnN0e2RlZmVycmVkc309cmVjb3JkO1xuT2JqZWN0LmFzc2lnbihyZWNvcmQse1xuZGVmZXJyZWRzOnVuZGVmaW5lZCxcbnNldHRsZWQ6dHJ1ZX0pO1xuXG5PYmplY3QuZnJlZXplKHJlY29yZCk7XG5yZXR1cm4gZGVmZXJyZWRzO1xuIH07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICogQHJldHVybnMge1Byb21pc2VNZW1vUmVjb3JkfVxuICovXG5jb25zdCBnZXRNZW1vUmVjb3JkPSh2YWx1ZSk9PntcbmlmKCFpc09iamVjdCh2YWx1ZSkpe1xuLyogSWYgdGhlIGNvbnRlbmRlciBpcyBhIHByaW1pdGl2ZSwgYXR0ZW1wdGluZyB0byB1c2UgaXQgYXMgYSBrZXkgaW4gdGhlKi9cbi8qIHdlYWttYXAgd291bGQgdGhyb3cgYW4gZXJyb3IuIEx1Y2tpbHksIGl0IGlzIHNhZmUgdG8gY2FsbCovXG4vKiBgUHJvbWlzZS5yZXNvbHZlKGNvbnRlbmRlcikudGhlbmAgb24gYSBwcmltaXRpdmUgdmFsdWUgbXVsdGlwbGUgdGltZXMqL1xuLyogYmVjYXVzZSB0aGUgcHJvbWlzZSBmdWxmaWxscyBpbW1lZGlhdGVseS4gU28gd2UgZmFrZSBhIHNldHRsZWQgcmVjb3JkLiovXG5yZXR1cm4gaGFyZGVuKHtzZXR0bGVkOnRydWV9KTtcbiB9XG5cbmxldCByZWNvcmQ9a25vd25Qcm9taXNlcy5nZXQodmFsdWUpO1xuXG5pZighcmVjb3JkKXtcbnJlY29yZD17ZGVmZXJyZWRzOm5ldyBTZXQoKSxzZXR0bGVkOmZhbHNlfTtcbmtub3duUHJvbWlzZXMuc2V0KHZhbHVlLHJlY29yZCk7XG4vKiBUaGlzIGNhbGwgdG8gYHRoZW5gIGhhcHBlbnMgb25jZSBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSB2YWx1ZS4qL1xuUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKFxuKHZhbCk9PntcbmZvcihjb25zdHtyZXNvbHZlfW9mIG1hcmtTZXR0bGVkKHJlY29yZCkpe1xucmVzb2x2ZSh2YWwpO1xuIH1cbiB9LFxuKGVycik9PntcbmZvcihjb25zdHtyZWplY3R9b2YgbWFya1NldHRsZWQocmVjb3JkKSl7XG5yZWplY3QoZXJyKTtcbiB9XG4gfSk7XG5cbiB9XG5yZXR1cm4gcmVjb3JkO1xuIH07XG5cbmNvbnN0e3JhY2V9PXtcbi8qKlxuICogQ3JlYXRlcyBhIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCBvciByZWplY3RlZCB3aGVuIGFueSBvZiB0aGUgcHJvdmlkZWQgUHJvbWlzZXMgYXJlIHJlc29sdmVkXG4gKiBvciByZWplY3RlZC5cbiAqXG4gKiBVbmxpa2UgYFByb21pc2UucmFjZWAgaXQgY2xlYW5zIHVwIGFmdGVyIGl0c2VsZiBzbyBhIG5vbi1yZXNvbHZlZCB2YWx1ZSBkb2Vzbid0IGhvbGQgb250b1xuICogdGhlIHJlc3VsdCBwcm9taXNlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdGVtcGxhdGUge1Byb21pc2VDb25zdHJ1Y3Rvcn0gW1A9UHJvbWlzZUNvbnN0cnVjdG9yXVxuICogQHRoaXMge1B9XG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFQ+fSB2YWx1ZXMgQW4gaXRlcmFibGUgb2YgUHJvbWlzZXMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBd2FpdGVkPFQ+Pn0gQSBuZXcgUHJvbWlzZS5cbiAqL1xucmFjZSh2YWx1ZXMpe1xubGV0IGRlZmVycmVkO1xuLyoqIEB0eXBlIHtUW119ICovXG5jb25zdCBjYWNoZWRWYWx1ZXM9W107XG5jb25zdCBDPXRoaXM7XG5jb25zdCByZXN1bHQ9bmV3IEMoKHJlc29sdmUscmVqZWN0KT0+e1xuZGVmZXJyZWQ9e3Jlc29sdmUscmVqZWN0fTtcbmZvcihjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpe1xuY2FjaGVkVmFsdWVzLnB1c2godmFsdWUpO1xuY29uc3R7c2V0dGxlZCxkZWZlcnJlZHN9PWdldE1lbW9SZWNvcmQodmFsdWUpO1xuaWYoc2V0dGxlZCl7XG4vKiBJZiB0aGUgY29udGVuZGVyIGlzIHNldHRsZWQgKGluY2x1ZGluZyBwcmltaXRpdmVzKSwgaXQgaXMgc2FmZSovXG4vKiB0byBjYWxsIGBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW5gIG9uIGl0LiovXG5DLnJlc29sdmUodmFsdWUpLnRoZW4ocmVzb2x2ZSxyZWplY3QpO1xuIH1lbHNle1xuZGVmZXJyZWRzLmFkZChkZWZlcnJlZCk7XG4gfVxuIH1cbiB9KTtcblxuLyogVGhlIGZpbmFsbHkgY2FsbGJhY2sgZXhlY3V0ZXMgd2hlbiBhbnkgdmFsdWUgc2V0dGxlcywgcHJldmVudGluZyBhbnkgb2YqL1xuLyogdGhlIHVucmVzb2x2ZWQgdmFsdWVzIGZyb20gcmV0YWluaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSByZXNvbHZlZCB2YWx1ZS4qL1xucmV0dXJuIHJlc3VsdC5maW5hbGx5KCgpPT57XG5mb3IoY29uc3QgdmFsdWUgb2YgY2FjaGVkVmFsdWVzKXtcbmNvbnN0e2RlZmVycmVkc309Z2V0TWVtb1JlY29yZCh2YWx1ZSk7XG5pZihkZWZlcnJlZHMpe1xuZGVmZXJyZWRzLmRlbGV0ZShkZWZlcnJlZCk7XG4gfVxuIH1cbiB9KTtcbiB9fTskaOKAjV9vbmNlLnJhY2UocmFjZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWVtb1JhY2UiOlsicmFjZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB0DAyPVAcAAFQHAAA1AAAAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Mi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBjYWxsYmFjayBQcm9taXNlRXhlY3V0b3IgVGhlIHByb21pc2UgZXhlY3V0b3JcbiAqIEBwYXJhbSB7KHZhbHVlOiBYaW1wb3J0KCcuL3R5cGVzLmpzJykuRVJlZjxUPikgPT4gdm9pZH0gcmVzb2x2ZVxuICogQHBhcmFtIHsocmVhc29uOiBhbnkpID0+IHZvaWR9IHJlamVjdFxuICovXG5cbi8qKlxuICogbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KCkgYnVpbGRzIHJlc29sdmUvcmVqZWN0IGZ1bmN0aW9ucyB3aGljaCBkcm9wIHJlZmVyZW5jZXNcbiAqIHRvIHRoZSByZXNvbHZlL3JlamVjdCBmdW5jdGlvbnMgZ2F0aGVyZWQgZnJvbSBhbiBleGVjdXRvciB0byBiZSB1c2VkIHdpdGggYVxuICogcHJvbWlzZSBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHJldHVybnMge1BpY2s8WGltcG9ydCgnLi90eXBlcy5qcycpLlByb21pc2VLaXQ8VD4sICdyZXNvbHZlJyB8ICdyZWplY3QnPiAmIHsgZXhlY3V0b3I6IFByb21pc2VFeGVjdXRvcjxUPn19XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQ9KCk9Pntcbi8qKiBAdHlwZSB7bnVsbCB8IHVuZGVmaW5lZCB8ICgodmFsdWU6IFhpbXBvcnQoJy4vdHlwZXMuanMnKS5FUmVmPFQ+KSA9PiB2b2lkKX0gKi9cbmxldCBpbnRlcm5hbFJlc29sdmU7XG4vKiogQHR5cGUge251bGwgfCB1bmRlZmluZWQgfCAoKHJlYXNvbjogdW5rbm93bikgPT4gdm9pZCl9ICovXG5sZXQgaW50ZXJuYWxSZWplY3Q7XG5cbi8qKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5FUmVmPFQ+fSB2YWx1ZSAqL1xuY29uc3QgcmVzb2x2ZT0odmFsdWUpPT57XG5pZihpbnRlcm5hbFJlc29sdmUpe1xuaW50ZXJuYWxSZXNvbHZlKHZhbHVlKTtcbmludGVybmFsUmVzb2x2ZT1udWxsO1xuaW50ZXJuYWxSZWplY3Q9bnVsbDtcbiB9ZWxzZXtcbmFzc2VydChpbnRlcm5hbFJlc29sdmU9PT1udWxsKTtcbiB9XG4gfTtcblxuLyoqIEBwYXJhbSB7dW5rbm93bn0gcmVhc29uICovXG5jb25zdCByZWplY3Q9KHJlYXNvbik9PntcbmlmKGludGVybmFsUmVqZWN0KXtcbmludGVybmFsUmVqZWN0KHJlYXNvbik7XG5pbnRlcm5hbFJlc29sdmU9bnVsbDtcbmludGVybmFsUmVqZWN0PW51bGw7XG4gfWVsc2V7XG5hc3NlcnQoaW50ZXJuYWxSZWplY3Q9PT1udWxsKTtcbiB9XG4gfTtcblxuY29uc3QgZXhlY3V0b3I9KHJlcyxyZWopPT57XG5hc3NlcnQoaW50ZXJuYWxSZXNvbHZlPT09dW5kZWZpbmVkJiZpbnRlcm5hbFJlamVjdD09PXVuZGVmaW5lZCk7XG5pbnRlcm5hbFJlc29sdmU9cmVzO1xuaW50ZXJuYWxSZWplY3Q9cmVqO1xuIH07XG5cbnJldHVybiBoYXJkZW4oe3Jlc29sdmUscmVqZWN0LGV4ZWN1dG9yfSk7XG4gfTskaOKAjV9vbmNlLm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdChtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQpO1xuaGFyZGVuKG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0IjpbIm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC7Vw73HwEAAB8BAAAmAAAAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Mi9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAytetOJgBAACYAQAAHAAAAGplc3NpZS5qcy12MC4zLjIvc3JjL21haW4uanN7ImltcG9ydHMiOlsiLi9yaW5nMC9tYWluLmpzIiwiLi9yaW5nMS9tYWluLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9yaW5nMC9tYWluLmpzIiwiLi9yaW5nMS9tYWluLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9yaW5nMC9tYWluLmpzXCIsIFtdXSxbXCIuL3JpbmcxL21haW4uanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIbCvttIAQAASAEAAB8AAABqZXNzaWUuanMtdjAuMy4yL3NyYy9yaW5nMC9FLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIkBlbmRvL2ZhciJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAuN5BcJQDAACUAwAALAAAAGplc3NpZS5qcy12MC4zLjIvc3JjL3JpbmcwL2FzeW5jLWdlbmVyYXRlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJhc3luY0dlbmVyYXRlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cblxuLyoqXG4gKiBSZXR1cm4gYW4gYXN5bmMgaXRlcmFibGUgdGhhdCBwcm9kdWNlcyBpdGVyYXRvciByZXN1bHRzIHZpYSBgbmV4dGAuXG4gKlxuICogVGhpcyB3b3JrcyBhcm91bmQgSmVzc2llJ3MgZm9yYmlkZGFuY2Ugb2YgU3ltYm9sLlxuICpcbiAqIEB0ZW1wbGF0ZSBULFRSZXR1cm5cbiAqIEBwYXJhbSB7KCkgPT4gSXRlcmF0b3JSZXN1bHQ8VCwgVFJldHVybj4gfFxuICogICAgICAgICAgICAgICBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQsIFRSZXR1cm4+PlxuICogfSBuZXh0IHByb2R1Y2UgYSBzaW5nbGUtc3RlcCBpdGVyYXRvciByZXN1bHRcbiAqIEByZXR1cm5zIHtBc3luY0l0ZXJhYmxlPFQ+fVxuICovXG5jb25zdCAgICAgICAgYXN5bmNHZW5lcmF0ZT0obmV4dCk9PntcbnJldHVybiBoYXJkZW4oe1xuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTooKT0+e1xucmV0dXJuIGhhcmRlbih7XG5uZXh0OmFzeW5jKCk9PmhhcmRlbihuZXh0KCkpfSk7XG5cbiB9fSk7XG5cbiB9OyRo4oCNX29uY2UuYXN5bmNHZW5lcmF0ZShhc3luY0dlbmVyYXRlKTtcbmhhcmRlbihhc3luY0dlbmVyYXRlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3luY0dlbmVyYXRlIjpbImFzeW5jR2VuZXJhdGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAx53YNbsBAAC7AQAAIgAAAGplc3NpZS5qcy12MC4zLjIvc3JjL3JpbmcwL21haW4uanN7ImltcG9ydHMiOlsiLi9FLmpzIiwiLi9hc3luYy1nZW5lcmF0ZS5qcyIsIi4vbWFrZXJzLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9FLmpzIiwiLi9hc3luYy1nZW5lcmF0ZS5qcyIsIi4vbWFrZXJzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9FLmpzXCIsIFtdXSxbXCIuL21ha2Vycy5qc1wiLCBbXV0sW1wiLi9hc3luYy1nZW5lcmF0ZS5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAwxAVss4IAADOCAAAJAAAAGplc3NpZS5qcy12MC4zLjIvc3JjL3JpbmcwL21ha2Vycy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWFrZU1hcCIsIm1ha2VQcm9taXNlIiwibWFrZVNldCIsIm1ha2VXZWFrTWFwIiwibWFrZVdlYWtTZXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuLyogVGhlc2Ugd29yayBhcm91bmQgSmVzc2llJ3MgZm9yYmlkZGFuY2Ugb2YgYG5ld2AuKi9cbi8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIgLz4qL1xuXG4vKiogQHR5cGUgezxUPihleGVjdXRvcjogKHJlc29sdmU6ICh2YWx1ZTogVCkgPT4gdm9pZCwgcmVqZWN0OiAocmVhc29uPzogYW55KSA9PlxuICogdm9pZCkgPT4gdm9pZCkgPT4gUHJvbWlzZTxUPn0gKi9cbmNvbnN0ICAgICAgICBtYWtlUHJvbWlzZT0oZXhlY3V0b3IpPT5oYXJkZW4obmV3IFByb21pc2UoZXhlY3V0b3IpKTskaOKAjV9vbmNlLm1ha2VQcm9taXNlKG1ha2VQcm9taXNlKTtcbmhhcmRlbihtYWtlUHJvbWlzZSk7XG5cbi8qKiBAdHlwZWRlZiB7PEssIFY+KGVudHJpZXM/OiByZWFkb25seSAocmVhZG9ubHkgW0ssIFZdKVtdKSA9PiBNYXA8SywgVj59IE1hcEZyb21FbnRyaWVzICovXG4vKiogQHR5cGVkZWYgezxLLCBWPihpdGVyYWJsZTogSXRlcmFibGU8cmVhZG9ubHkgW0ssIFZdPikgPT4gTWFwPEssIFY+fSBNYXBGcm9tSXRlcmFibGUgKi9cblxuLyoqIEB0eXBlIHtNYXBGcm9tRW50cmllcyAmIE1hcEZyb21JdGVyYWJsZX0gKi9cbmNvbnN0ICAgICAgICBtYWtlTWFwPShlbnRyaWVzT3JJdGVyYWJsZSk9PmhhcmRlbihuZXcgTWFwKGVudHJpZXNPckl0ZXJhYmxlKSk7JGjigI1fb25jZS5tYWtlTWFwKG1ha2VNYXApO1xuaGFyZGVuKG1ha2VNYXApO1xuXG4vKiogQHR5cGVkZWYgezxUPih2YWx1ZXM/OiByZWFkb25seSBUW10pID0+IFNldDxUPn0gU2V0RnJvbVZhbHVlcyAqL1xuLyoqIEB0eXBlZGVmIHs8VD4oaXRlcmFibGU6IEl0ZXJhYmxlPFQ+KSA9PiBTZXQ8VD59IFNldEZyb21JdGVyYWJsZSAqL1xuLyoqIEB0eXBlIHtTZXRGcm9tVmFsdWVzICYgU2V0RnJvbUl0ZXJhYmxlfSAqL1xuY29uc3QgICAgICAgIG1ha2VTZXQ9KHZhbHVlcyk9PmhhcmRlbihuZXcgU2V0KHZhbHVlcykpOyRo4oCNX29uY2UubWFrZVNldChtYWtlU2V0KTtcbmhhcmRlbihtYWtlU2V0KTtcblxuLyoqIEB0eXBlZGVmIHs8SyBleHRlbmRzIHt9LCBWID0gYW55PihlbnRyaWVzPzogcmVhZG9ubHkgW0ssIFZdW10gfCBudWxsKSA9PiBXZWFrTWFwPEssIFY+fSBXZWFrTWFwRnJvbUVudHJpZXMgKi9cbi8qKiBAdHlwZWRlZiB7PEsgZXh0ZW5kcyB7fSwgVj4oaXRlcmFibGU6IEl0ZXJhYmxlPFtLLCBWXT4pID0+IFdlYWtNYXA8SywgVj59IFdlYWtNYXBGcm9tSXRlcmFibGUgKi9cbi8qKiBAdHlwZSB7V2Vha01hcEZyb21FbnRyaWVzICYgV2Vha01hcEZyb21JdGVyYWJsZX0gKi9cbmNvbnN0ICAgICAgICBtYWtlV2Vha01hcD0oZW50cmllcyk9PmhhcmRlbihuZXcgV2Vha01hcChlbnRyaWVzKSk7JGjigI1fb25jZS5tYWtlV2Vha01hcChtYWtlV2Vha01hcCk7XG5oYXJkZW4obWFrZVdlYWtNYXApO1xuXG4vKiogQHR5cGVkZWYgezxUIGV4dGVuZHMge30+KHZhbHVlcz86IHJlYWRvbmx5IFRbXSkgPT4gV2Vha1NldDxUPn0gV2Vha1NldEZyb21WYWx1ZXMgKi9cbi8qKiBAdHlwZWRlZiB7PFQgZXh0ZW5kcyB7fT4oaXRlcmFibGU6IEl0ZXJhYmxlPFQ+KSA9PiBXZWFrU2V0PFQ+fSBXZWFrU2V0RnJvbUl0ZXJhYmxlICovXG4vKiogQHR5cGUge1dlYWtTZXRGcm9tVmFsdWVzICYgV2Vha1NldEZyb21JdGVyYWJsZX0gKi9cbmNvbnN0ICAgICAgICBtYWtlV2Vha1NldD0odmFsdWVzKT0+aGFyZGVuKG5ldyBXZWFrU2V0KHZhbHVlcykpOyRo4oCNX29uY2UubWFrZVdlYWtTZXQobWFrZVdlYWtTZXQpO1xuaGFyZGVuKG1ha2VXZWFrU2V0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUHJvbWlzZSI6WyJtYWtlUHJvbWlzZSJdLCJtYWtlTWFwIjpbIm1ha2VNYXAiXSwibWFrZVNldCI6WyJtYWtlU2V0Il0sIm1ha2VXZWFrTWFwIjpbIm1ha2VXZWFrTWFwIl0sIm1ha2VXZWFrU2V0IjpbIm1ha2VXZWFrU2V0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJmM4vLpBAAA6QQAACkAAABqZXNzaWUuanMtdjAuMy4yL3NyYy9yaW5nMS9hc3luYy10b29scy5qc3siaW1wb3J0cyI6WyIuLi9yaW5nMC9tYWluLmpzIl0sImV4cG9ydHMiOlsiYXN5bmNEb1doaWxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG1ha2VQcm9taXNlOyRo4oCNX2ltcG9ydHMoW1tcIi4uL3JpbmcwL21haW4uanNcIiwgW1tcIm1ha2VQcm9taXNlXCIsIFskaOKAjV9hID0+IChtYWtlUHJvbWlzZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuLyoqXG4gKiBSZXNvbHZlIHJldHVybmVkIHByb21pc2Ugd2l0aCB1bmRlZmluZWQgd2hlbiBgYm9keWAgcmV0dXJucyBmYWxzeS5cbiAqXG4gKiBUaGlzIHdvcmtzIGFyb3VuZCBKZXNzaWUncyBmb3JiaWRkYW5jZSBvZiBgYXdhaXRgIG5vdCBhdCB0aGUgZnVuY3Rpb24tbGV2ZWwuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7KCkgPT4gVCB8IFByb21pc2U8VD59IGJvZHkgcGVyZm9ybSBzaWRlLWVmZmVjdHMsIGFuZCByZXR1cm4gdHJ1dGh5IGlmXG4gKiB3ZSBzaG91bGQgcnVuIGFnYWluXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuY29uc3QgICAgICAgIGFzeW5jRG9XaGlsZT0oYm9keSk9PntcbmNvbnN0IGxvb3A9YXN5bmMocmVzb2x2ZSxyZWplY3QpPT57XG5jb25zdCBkb0NvbnRpbnVlPWF3YWl0IGJvZHkoKTtcbmlmKCFkb0NvbnRpbnVlKXtcbi8qIFJlc29sdmUgdGhlIG91dGVybW9zdCBwcm9taXNlLiovXG5yZXNvbHZlKHVuZGVmaW5lZCk7XG5yZXR1cm47XG4gfVxuXG4vKiBEbyB0aGUgbG9vcCBhZ2Fpbi4gIFdlIGFyZSBjYXJlZnVsIG5vdCB0byBhd2FpdCBzbyB0aGF0IHdlIGRvbid0IGNyZWF0ZSBhKi9cbi8qIHByb21pc2UgY2hhaW4uKi9cbmxvb3AocmVzb2x2ZSxyZWplY3QpLmNhdGNoKHJlamVjdCk7XG4gfTtcblxucmV0dXJuIG1ha2VQcm9taXNlKChyZXNvbHZlLHJlamVjdCk9Pmxvb3AocmVzb2x2ZSxyZWplY3QpLmNhdGNoKHJlamVjdCkpO1xuIH07JGjigI1fb25jZS5hc3luY0RvV2hpbGUoYXN5bmNEb1doaWxlKTtcbmhhcmRlbihhc3luY0RvV2hpbGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzeW5jRG9XaGlsZSI6WyJhc3luY0RvV2hpbGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAJcK18V0BAABdAQAAIgAAAGplc3NpZS5qcy12MC4zLjIvc3JjL3JpbmcxL21haW4uanN7ImltcG9ydHMiOlsiLi9hc3luYy10b29scy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vYXN5bmMtdG9vbHMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL2FzeW5jLXRvb2xzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsBAh4DCgAAAAAAAAAAAK9FFi9D/wAAQ/8AABQAAAAAAAAAAAAAAKSBAAAAAGNvbXBhcnRtZW50LW1hcC5qc29uUEsBAh4DCgAAAAAAAAAAAIhDF8IuCwAALgsAACMAAAAAAAAAAAAAAKSBdf8AAEBhZ29yaWMvYXNzZXJ0LXYwLjUuMS9zcmMvYXNzZXJ0LmpzUEsBAh4DCgAAAAAAAAAAAAPpI5TFLgAAxS4AACIAAAAAAAAAAAAAAKSB5AoBAEBhZ29yaWMvYXNzZXJ0LXYwLjUuMS9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAXc3uDlcBAABXAQAAIAAAAAAAAAAAAAAApIHpOQEAQGFnb3JpYy9lcnRwLXYwLjE1LjMvZXhwb3J0ZWQuanNQSwECHgMKAAAAAAAAAAAAZxF0nbU3AAC1NwAAJgAAAAAAAAAAAAAApIF+OwEAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL2Ftb3VudE1hdGguanNQSwECHgMKAAAAAAAAAAAA7h+P6LwFAAC8BQAAJwAAAAAAAAAAAAAApIF3cwEAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL2Rpc3BsYXlJbmZvLmpzUEsBAh4DCgAAAAAAAAAAAMm9LDjTAQAA0wEAACEAAAAAAAAAAAAAAKSBeHkBAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAD3PQYogyAAAIMgAAAlAAAAAAAAAAAAAACkgYp7AQBAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvaXNzdWVyS2l0LmpzUEsBAh4DCgAAAAAAAAAAANcomp39DwAA/Q8AADIAAAAAAAAAAAAAAKSBUJwBAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9sZWdhY3ktcGF5bWVudC1oZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAADEJxIikBQAApAUAADoAAAAAAAAAAAAAAKSBnawBAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAnZ+IzrEFAACxBQAAOgAAAAAAAAAAAAAApIGZsgEAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAC2LOSgDwYAAA8GAAA2AAAAAAAAAAAAAACkgaK4AQBAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAkYC5rn8HAAB/BwAANgAAAAAAAAAAAAAApIEFvwEAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAAsI0hSMBAAAjAQAACMAAAAAAAAAAAAAAKSB2MYBAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9wYXltZW50LmpzUEsBAh4DCgAAAAAAAAAAAEFJ25gJPgAACT4AACkAAAAAAAAAAAAAAKSBpcsBAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9wYXltZW50TGVkZ2VyLmpzUEsBAh4DCgAAAAAAAAAAAPq+y1urDwAAqw8AACEAAAAAAAAAAAAAAKSB9QkCAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9wdXJzZS5qc1BLAQIeAwoAAAAAAAAAAADe2zWl+wUAAPsFAAAtAAAAAAAAAAAAAACkgd8ZAgBAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvdHJhbnNpZW50Tm90aWZpZXIuanNQSwECHgMKAAAAAAAAAAAAxRhX1I4oAACOKAAAJgAAAAAAAAAAAAAApIElIAIAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAAV+iQ9X5BAAB+QQAAKQAAAAAAAAAAAAAApIH3SAIAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL3R5cGVzLWFtYmllbnQuanNQSwECHgMKAAAAAAAAAAAAXc3uDlcBAABXAQAAJQAAAAAAAAAAAAAApIG8igIAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjkuMS9leHBvcnRlZC5qc1BLAQIeAwoAAAAAAAAAAACSif7VDF4AAAxeAAAuAAAAAAAAAAAAAACkgVaMAgBAYWdvcmljL2dvdmVybmFuY2UtdjAuOS4xL3NyYy90eXBlcy1hbWJpZW50LmpzUEsBAh4DCgAAAAAAAAAAAAMPLDVHFAAARxQAADoAAAAAAAAAAAAAAKSBruoCAEBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMS9zcmMvZWNvbkNvbW1pdHRlZUNoYXJ0ZXIuanNQSwECHgMKAAAAAAAAAAAAgO+ZRPMFAADzBQAAJQAAAAAAAAAAAAAApIFN/wIAQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEvc3JjL2NvbmZpZy5qc1BLAQIeAwoAAAAAAAAAAABENUIhoQQAAKEEAAAkAAAAAAAAAAAAAACkgYMFAwBAYWdvcmljL2ludGVybmFsLXYwLjIuMS9zcmMvZGVidWcuanNQSwECHgMKAAAAAAAAAAAAxjCg3y4CAAAuAgAAJAAAAAAAAAAAAAAApIFmCgMAQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAE2lq7PYHAAA2BwAAC8AAAAAAAAAAAAAAKSB1gwDAEBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzUEsBAh4DCgAAAAAAAAAAAOjrlFL8DgAA/A4AACsAAAAAAAAAAAAAAKSB+ykDAEBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xL3NyYy9tZXRob2QtdG9vbHMuanNQSwECHgMKAAAAAAAAAAAAsnjEEC0CAAAtAgAAKQAAAAAAAAAAAAAApIFAOQMAQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAAzwFitb8wAAC/MAAAJAAAAAAAAAAAAAAApIG0OwMAQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEvc3JjL3V0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAF3N7g5XAQAAVwEAACMAAAAAAAAAAAAAAKSBtWwDAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL2V4cG9ydGVkLmpzUEsBAh4DCgAAAAAAAAAAAIjIaJy9EgAAvRIAADMAAAAAAAAAAAAAAKSBTW4DAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc1BLAQIeAwoAAAAAAAAAAADQNydkswoAALMKAAAkAAAAAAAAAAAAAACkgVuBAwBAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAOpoockkYAABJGAAAJwAAAAAAAAAAAAAApIFQjAMAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL25vdGlmaWVyLmpzUEsBAh4DCgAAAAAAAAAAADLasXEHLwAABy8AACoAAAAAAAAAAAAAAKSB3qQDAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9wdWJsaXNoLWtpdC5qc1BLAQIeAwoAAAAAAAAAAADHo8Uj4wkAAOMJAAAuAAAAAAAAAAAAAACkgS3UAwBAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvc3RvcmVkLW5vdGlmaWVyLmpzUEsBAh4DCgAAAAAAAAAAAPTDcWR4DAAAeAwAACsAAAAAAAAAAAAAAKSBXN4DAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9zdG9yZWQtdG9waWMuanNQSwECHgMKAAAAAAAAAAAAHwUHayUiAAAlIgAAJwAAAAAAAAAAAAAApIEd6wMAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL3N0b3Jlc3ViLmpzUEsBAh4DCgAAAAAAAAAAADDTPAY0GAAANBgAACgAAAAAAAAAAAAAAKSBhw0EAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9zdWJzY3JpYmUuanNQSwECHgMKAAAAAAAAAAAApIa3j6wLAACsCwAAKQAAAAAAAAAAAAAApIEBJgQAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL3N1YnNjcmliZXIuanNQSwECHgMKAAAAAAAAAAAAM/x5GPMFAADzBQAAJAAAAAAAAAAAAAAApIH0MQQAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL3RvcGljLmpzUEsBAh4DCgAAAAAAAAAAAGNGw7teKgAAXioAACwAAAAAAAAAAAAAAKSBKTgEAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy90eXBlcy1hbWJpZW50LmpzUEsBAh4DCgAAAAAAAAAAANbWKjOVAQAAlQEAACAAAAAAAAAAAAAAAKSB0WIEAEBhZ29yaWMvc3RvcmUtdjAuOC4zL2V4cG9ydGVkLmpzUEsBAh4DCgAAAAAAAAAAAHn0upjoGwAA6BsAACEAAAAAAAAAAAAAAKSBpGQEAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAABH8+Dqe0QAAHtEAAApAAAAAAAAAAAAAACkgcuABABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMva2V5cy9jaGVja0tleS5qc1BLAQIeAwoAAAAAAAAAAAArf4Jz4hoAAOIaAAAsAAAAAAAAAAAAAACkgY3FBABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMva2V5cy9jb21wYXJlS2V5cy5qc1BLAQIeAwoAAAAAAAAAAAAtvE4RGxMAABsTAAAoAAAAAAAAAAAAAACkgbngBABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMva2V5cy9jb3B5QmFnLmpzUEsBAh4DCgAAAAAAAAAAAKJ8YRiUDwAAlA8AACgAAAAAAAAAAAAAAKSBGvQEAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9rZXlzL2NvcHlTZXQuanNQSwECHgMKAAAAAAAAAAAApI9mP74kAAC+JAAANAAAAAAAAAAAAAAApIH0AwUAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc1BLAQIeAwoAAAAAAAAAAADQmXCH4ycAAOMnAAA0AAAAAAAAAAAAAACkgQQpBQBAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzUEsBAh4DCgAAAAAAAAAAAMIJ83kJCwAACQsAACwAAAAAAAAAAAAAAKSBOVEFAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9sZWdhY3kvbGVnYWN5TWFwLmpzUEsBAh4DCgAAAAAAAAAAAFrLlgatBgAArQYAADAAAAAAAAAAAAAAAKSBjFwFAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9sZWdhY3kvbGVnYWN5V2Vha01hcC5qc1BLAQIeAwoAAAAAAAAAAAD29iQutBQAALQUAAAvAAAAAAAAAAAAAACkgYdjBQBAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvcGF0dGVybnMvZXhvLW1ha2Vycy5qc1BLAQIeAwoAAAAAAAAAAACrxdmQKCQAACgkAAAuAAAAAAAAAAAAAACkgYh4BQBAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvcGF0dGVybnMvZXhvLXRvb2xzLmpzUEsBAh4DCgAAAAAAAAAAAKJ1R3y1BwAAtQcAADMAAAAAAAAAAAAAAKSB/JwFAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9wYXR0ZXJucy9pbnRlcm5hbC10eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAD7TT8Oy7sAAMu7AAA0AAAAAAAAAAAAAACkgQKlBQBAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzUEsBAh4DCgAAAAAAAAAAAF8GszVuFgAAbhYAADEAAAAAAAAAAAAAAKSBH2EGAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanNQSwECHgMKAAAAAAAAAAAA/Rvdg5kPAACZDwAAMQAAAAAAAAAAAAAApIHcdwYAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAABYkblt7hIAAO4SAAA1AAAAAAAAAAAAAACkgcSHBgBAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAABKRpv9jw4AAI8OAAA1AAAAAAAAAAAAAACkgQWbBgBAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAADxEp10/xQAAP8UAAAuAAAAAAAAAAAAAACkgeepBgBAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvc3RvcmVzL3N0b3JlLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAADy8K6EAhQAAAIUAACEAAAAAAAAAAAAAAKSBMr8GAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAC7Vw73HwEAAB8BAAAoAAAAAAAAAAAAAACkgXFEBwBAYWdvcmljL3N3aW5nc2V0LXZhdC12MC4zMC4yL2V4cG9ydGVkLmpzUEsBAh4DCgAAAAAAAAAAAH/8s2KqAQAAqgEAABwAAAAAAAAAAAAAAKSB1kUHAEBhZ29yaWMvdGltZS12MC4yLjEvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAD+5aFoQgAACEIAAAIwAAAAAAAAAAAAAApIG6RwcAQGFnb3JpYy90aW1lLXYwLjIuMS9zcmMvdGltZU1hdGguanNQSwECHgMKAAAAAAAAAAAA0kaFHZIHAACSBwAAJQAAAAAAAAAAAAAApIF/aAcAQGFnb3JpYy90aW1lLXYwLjIuMS9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAADFimbD/ygAAP8oAAAoAAAAAAAAAAAAAACkgVRwBwBAYWdvcmljL3ZhdC1kYXRhLXYwLjQuMy9zcmMvZXhvLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAADfjjLJlEwAAZRMAACQAAAAAAAAAAAAAAKSBmZkHAEBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADTSXUOTyUAAE8lAAAwAAAAAAAAAAAAAACkgUCtBwBAYWdvcmljL3ZhdC1kYXRhLXYwLjQuMy9zcmMvdmF0LWRhdGEtYmluZGluZ3MuanNQSwECHgMKAAAAAAAAAAAAeMZXlqsDAACrAwAAHwAAAAAAAAAAAAAApIHd0gcAQGFnb3JpYy96b2UtdjAuMjUuMy9leHBvcnRlZC5qc1BLAQIeAwoAAAAAAAAAAABOeFMAECYAABAmAAAuAAAAAAAAAAAAAACkgcXWBwBAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdEZhY2V0L3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAJ25fTuvCwAArwsAADAAAAAAAAAAAAAAAKSBIf0HAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL2NvbnRyYWN0U3VwcG9ydC90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAACp0N89QgcAAEIHAAA1AAAAAAAAAAAAAACkgR4JCABAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdHMvY2FsbFNwcmVhZC90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAADcXpY7owEAAKMBAAAtAAAAAAAAAAAAAACkgbMQCABAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdHMvZXhwb3J0ZWQuanNQSwECHgMKAAAAAAAAAAAAY1/usogaAACIGgAALwAAAAAAAAAAAAAApIGhEggAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvY29udHJhY3RzL2xvYW4vdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAtlDtT70LAAC9CwAAKgAAAAAAAAAAAAAApIF2LQgAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvY29udHJhY3RzL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAFRHQeUSQwAAEkMAACUAAAAAAAAAAAAAAKSBezkIAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAAfqSfx2sHAABrBwAAIAAAAAAAAAAAAAAApIHQfAgAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAApCwAhLosAAC6LAAAKwAAAAAAAAAAAAAApIF5hAgAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvem9lU2VydmljZS90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAAWydfnbRUAAG0VAAAqAAAAAAAAAAAAAACkgXyxCABAYWdvcmljL3pvZS12MC4yNS4zL3Rvb2xzL3R5cGVzLWFtYmllbnQuanNQSwECHgMKAAAAAAAAAAAA+g/tX+sRAADrEQAAJAAAAAAAAAAAAAAApIExxwgAQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi44L3NyYy9FLmpzUEsBAh4DCgAAAAAAAAAAAKLUnMsKAgAACgIAACoAAAAAAAAAAAAAAKSBXtkIAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOC9zcmMvbm8tc2hpbS5qc1BLAQIeAwoAAAAAAAAAAADis7Hd2A8AANgPAAAuAAAAAAAAAAAAAACkgbDbCABAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2Ljgvc3JjL3RyYWNrLXR1cm5zLmpzUEsBAh4DCgAAAAAAAAAAAD7lgF62AgAAtgIAAB4AAAAAAAAAAAAAAKSB1OsIAEBlbmRvL2Zhci12MC4yLjE0L3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACE1ofwvxAAAL8QAAAdAAAAAAAAAAAAAACkgcbuCABAZW5kby9tYXJzaGFsLXYwLjguMS9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACqNP2CQgwAAEIMAAArAAAAAAAAAAAAAACkgcD/CABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzUEsBAh4DCgAAAAAAAAAAAA0/k/e7QwAAu0MAACoAAAAAAAAAAAAAAKSBSwwJAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9lbmNvZGVQYXNzYWJsZS5qc1BLAQIeAwoAAAAAAAAAAAAwwIZwCkAAAApAAAArAAAAAAAAAAAAAACkgU5QCQBAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzUEsBAh4DCgAAAAAAAAAAAMAaDCF5PQAAeT0AAC0AAAAAAAAAAAAAAKSBoZAJAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qc1BLAQIeAwoAAAAAAAAAAACmyhdk6AYAAOgGAAAtAAAAAAAAAAAAAACkgWXOCQBAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9jb3B5QXJyYXkuanNQSwECHgMKAAAAAAAAAAAAk4cFYdMHAADTBwAALgAAAAAAAAAAAAAApIGY1QkAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvY29weVJlY29yZC5qc1BLAQIeAwoAAAAAAAAAAAAMmaTaYBEAAGARAAApAAAAAAAAAAAAAACkgbfdCQBAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9lcnJvci5qc1BLAQIeAwoAAAAAAAAAAADRMbrZRggAAEYIAAAwAAAAAAAAAAAAAACkgV7vCQBAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9pdGVyLWhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAADALqJ/QZAAD0GQAANQAAAAAAAAAAAAAApIHy9wkAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAABPJsPvYfAAD2HwAALQAAAAAAAAAAAAAApIE5EgoAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvcmVtb3RhYmxlLmpzUEsBAh4DCgAAAAAAAAAAABTGqsGKDwAAig8AADAAAAAAAAAAAAAAAKSBejIKAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL3NhZmUtcHJvbWlzZS5qc1BLAQIeAwoAAAAAAAAAAABlE/1ouRIAALkSAAAqAAAAAAAAAAAAAACkgVJCCgBAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9zeW1ib2wuanNQSwECHgMKAAAAAAAAAAAACrS51uAHAADgBwAAKgAAAAAAAAAAAAAApIFTVQoAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvdGFnZ2VkLmpzUEsBAh4DCgAAAAAAAAAAABGaO1D0GAAA9BgAACQAAAAAAAAAAAAAAKSBe10KAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9tYWtlLWZhci5qc1BLAQIeAwoAAAAAAAAAAABb8wNnKQQAACkEAAAmAAAAAAAAAAAAAACkgbF2CgBAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvbWFrZVRhZ2dlZC5qc1BLAQIeAwoAAAAAAAAAAADQJQ6LvCgAALwoAAAqAAAAAAAAAAAAAACkgR57CgBAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvbWFyc2hhbC1qdXN0aW4uanNQSwECHgMKAAAAAAAAAAAAMteTRcMGAADDBgAALQAAAAAAAAAAAAAApIEipAoAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzUEsBAh4DCgAAAAAAAAAAAGnf3flVMgAAVTIAACMAAAAAAAAAAAAAAKSBMKsKAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9tYXJzaGFsLmpzUEsBAh4DCgAAAAAAAAAAAEFns3kCHAAAAhwAACcAAAAAAAAAAAAAAKSBxt0KAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9wYXNzU3R5bGVPZi5qc1BLAQIeAwoAAAAAAAAAAABYoj/ms0kAALNJAAAlAAAAAAAAAAAAAACkgQ36CgBAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvcmFua09yZGVyLmpzUEsBAh4DCgAAAAAAAAAAAII52ZMDDQAAAw0AACYAAAAAAAAAAAAAAKSBA0QLAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAALtXDvcfAQAAHwEAACEAAAAAAAAAAAAAAKSBSlELAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAD/CipPugsAALoLAAAeAAAAAAAAAAAAAACkgahSCwBAZW5kby9uYXQtdjQuMS4yNC9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAR28qx1sJAABbCQAAIgAAAAAAAAAAAAAApIGeXgsAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Mi9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACXiOBbygIAAMoCAAArAAAAAAAAAAAAAACkgTloCwBAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyL3NyYy9pcy1wcm9taXNlLmpzUEsBAh4DCgAAAAAAAAAAAIQRv9OpEgAAqRIAACoAAAAAAAAAAAAAAKSBTGsLAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIvc3JjL21lbW8tcmFjZS5qc1BLAQIeAwoAAAAAAAAAAAB0DAyPVAcAAFQHAAA1AAAAAAAAAAAAAACkgT1+CwBAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc1BLAQIeAwoAAAAAAAAAAAC7Vw73HwEAAB8BAAAmAAAAAAAAAAAAAACkgeSFCwBAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAADK1604mAEAAJgBAAAcAAAAAAAAAAAAAACkgUeHCwBqZXNzaWUuanMtdjAuMy4yL3NyYy9tYWluLmpzUEsBAh4DCgAAAAAAAAAAAIbCvttIAQAASAEAAB8AAAAAAAAAAAAAAKSBGYkLAGplc3NpZS5qcy12MC4zLjIvc3JjL3JpbmcwL0UuanNQSwECHgMKAAAAAAAAAAAAuN5BcJQDAACUAwAALAAAAAAAAAAAAAAApIGeigsAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzAvYXN5bmMtZ2VuZXJhdGUuanNQSwECHgMKAAAAAAAAAAAAx53YNbsBAAC7AQAAIgAAAAAAAAAAAAAApIF8jgsAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzAvbWFpbi5qc1BLAQIeAwoAAAAAAAAAAADDEBWyzggAAM4IAAAkAAAAAAAAAAAAAACkgXeQCwBqZXNzaWUuanMtdjAuMy4yL3NyYy9yaW5nMC9tYWtlcnMuanNQSwECHgMKAAAAAAAAAAAAmYzi8ukEAADpBAAAKQAAAAAAAAAAAAAApIGHmQsAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzEvYXN5bmMtdG9vbHMuanNQSwECHgMKAAAAAAAAAAAAJcK18V0BAABdAQAAIgAAAAAAAAAAAAAApIG3ngsAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzEvbWFpbi5qc1BLBQYAAAAAdwB3AJYoAABUoAsAAAA=","endoZipBase64Sha512":"d27dd9adc56d2a3bae7d862efaf1d77ecc68d8340f1a6423876d9c7d7071ef601a797998a2c442e1f3de533c83aa3464cf44474447c54ffbeefef8640a0e64fe"};
|
|
1
|
+
export default {"moduleFormat":"endoZipBase64","endoZipBase64":"UEsDBAoAAAAAAAAAAAAYgSMpQ/8AAEP/AAAUAAAAY29tcGFydG1lbnQtbWFwLmpzb257CiAgImVudHJ5IjogewogICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAibW9kdWxlIjogIi4vc3JjL2Vjb25Db21taXR0ZWVDaGFydGVyLmpzIgogIH0sCiAgImNvbXBhcnRtZW50cyI6IHsKICAgICJAYWdvcmljL2Fzc2VydC12MC41LjEiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvYXNzZXJ0IiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvYXNzZXJ0LXYwLjUuMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL2Fzc2VydC12MC41LjEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9hc3NlcnQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2Fzc2VydC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjgxMzZlMThiYzA3MDIyZjM0MzBkZTdiN2ZlZTA5ODVmMjEwYTE1M2FhYWJiNDc2ZWUzOGZlNDAxYjY3YzM0MmY0NGRiYmJjZTcwZDkzMTBlMGNjMTJlYmRhMDgwYjJmMmYyNTJkNjQ2YWZmYTQ4YzU5ODVkMGFlNTA3NDQzMzlkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjI3OThjMWFiM2QxNTVmOTNhYTkyZjdkNjFlZjhkNDlhNGQ5NDE5MzFlNGI0YzFkYTdmNmM5NWNhZmQxY2Q2MWFhYjJmZmRkYjA5NmUzNzNkY2Y0ZWUwNmM2NzJmOTFiMTI5YWY3ZGNjODBkNTlhOTMwNGM5Y2Q1YmQwYTc4OTk4IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL2VydHAtdjAuMTUuMyI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9lcnRwIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvZXJ0cC12MC4xNS4zIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvZXJ0cC12MC4xNS4zIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL3N1YnNjcmliZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3Vic2NyaWJlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIvdG9vbHMvdGVzdFN1cHBvcnRzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy90ZXN0U3VwcG9ydHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjguMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC44LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2V4cG9ydGVkLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3dpbmdzZXQtdmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMwLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2LjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjAuMi4xNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC44LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICIuL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImV4cG9ydGVkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODlhNTIwY2JmMWYxZGQwNWRmMjVjN2FmMWJhYWIxNzlkOTg5YWEyZGNiM2ZkN2JmNzRiZmRlMjU5MmIzMzM4NjQyY2NlYzU3ZmMzYjNjNGYxODY1YTdiZTMxZWMyNGJlNmQ1ODU5N2ZhZDBlNjc2ZmUyNzcxYmM5NTU4MzQwOGEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvYW1vdW50TWF0aC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvYW1vdW50TWF0aC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjkyZjE0Mjc2NjhlNWE3ZmNmZmU3NWZmOTdjOTcxOTcxMDlhMTdmMjVlYjY5OTU4NTQzNmVhNTJiMGE1YTM4YWM0MjYwNGJhZGUwZjU0MmI0MzdlNTA3YjM1NTgwYzU2MzRhMzU1ZmE5ZThkYjFiODAzN2VkNThiMjZhZTQyMjkyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2Rpc3BsYXlJbmZvLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kaXNwbGF5SW5mby5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjdmOWU1Zjc4NWRjYjcyMDQ2MjM1MTU0NmRhOWY4OTZiODU5NDY1ZjliOGJiYzg1ODUyOGNjNWIxNWEzY2Y2MjZlZjJiYjNjZjM1NTA5MjNmZTBjMTNmOTczNTQ3MDljOGU5MTU1Y2YxNDNhMTM2ZGY4OThlMTAyODE5MjJkMzg4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImViZWE3NGFlZjAwODNlNWUyM2RmMTJkOTIzZDgxZmRmYmYxYmRmOGRkNjFmOGUzMmFjODU4YWJjZTM4MWYyMzNkMWM1NGQ5ZTZiMTcxNGEyOWJjYmE5NjE5ZDQ4YmI5YTYwNzE4ZWNmNjBlMDg1MWFhMjEzMjUzNmEwMjNiY2FjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2lzc3VlcktpdC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaXNzdWVyS2l0LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDcwZDdlZmI4ZTZkOTZhN2FjOTkzZTVhNzZhNGEwYzdlOTRmM2RhODcwZjZjMzc2OTRjNGI4YzQ4MmEwODJiY2VjNDZlYjBmNTgyOWVkMzM3ZTQ5NDZhNThiNjRiMWY1MzQ4MzFiZTFmYWEzNWM0Njk4OWQ3MDU0MDUyOTlhZjMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGVnYWN5LXBheW1lbnQtaGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGVnYWN5LXBheW1lbnQtaGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjg1OTlkNThjMjYyZGRiNzY4M2RjNjliNGE4NGJhYjhkYzdkYTg0NmZlNjA1MTZhNWRiN2JiZDQ2ZGY4N2M5NGQzNzRhODEwN2RhODc2N2QwZDQwNmRmYTAxNWVlMTFjZTY0ODA3ZDliMzhiNDljYzMwMmYzOWI1NDk2MWYyNjNkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWF0aEhlbHBlcnMvY29weUJhZ01hdGhIZWxwZXJzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2I4MTY1MWI1YjZkODI3OWUxMjgzMTc0MWRkYjU1YjBjNzZhMmUzNDczODdlZjMxM2RmNGUzYzMwYjg4NjgyZWU4MTk1MTVjMjhkNmQ1N2YzMzRkZTQ5NGQ2ZDZmYzUyZGQ2NzcxZjljYjQwODFhNjIwMTUzNmQ1MzJmODMwZDEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYXRoSGVscGVycy9jb3B5U2V0TWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlZTAwODY3N2Y1ZjFkZWEyMzVkMzk3OWI1OGFiYzM0YjFlNjFjYzVhZThiMjIyZDM0MDFhNDMwZmQ5NDZiZjQxZjkxNmYxNTQ1ZjZkNWQwNjczNGFmMzMzYTE1NjFiZDNlMGQ5MzcwZTFhMGM2ODcxNjI3YTI5NGQ5MDIwYjVjMCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXRoSGVscGVycy9uYXRNYXRoSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI2NjQ4NDA4YTJkYjg1ZjJmZWYzZjYzYjY2ZWEwNDkzZjBkMzExMWY5ZDlmZWQzMzUxMTAxNWE5MzliYjhjYTE3MjM3YjAxYzVlMDA1MjhkN2E0ZmQyM2FkYmRkM2Q3YTEzNzU2NzhjMDcyZGIwZTg1Y2VjY2VkYjRkZGMyOTg5YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhNjE5NmQ3N2ViZDQwMzUyNmM0ZGE4NTM2ZWVlYzM2YTExMGEzMDQzOGEwMTk4MjE5MWQ3ZWYxNjQ3NjdhZWQ3OWM2YzhjNWRiZDYzZjdkNzM4NDk5NWY5ZmZjMDZhZTgzYmJkMTg3N2FjNGI1YzFmNzAzYzIxNTcxMzIxMGJkMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9wYXltZW50LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXltZW50LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZmFjOWUwOTZkZjNkZWY5ZjQ1NGRmYmJhYTFiZTc5ZDM2NTFiMWVhYWQ4YmY1YmM3MGMzMzlkYzljMmFkZmU4NmEzNDhiZDNkODU0YWM0ODAzOGMwYzk0NTEzY2IyOTRmMmJiNmI2YjMzZWFjMDU0YWM5ODcyMTg2ZmUwMDcxMGQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF5bWVudExlZGdlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF5bWVudExlZGdlci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjZkM2RjNDdhYTdiZjRjMDkzMWFjMzMwMDYyZGU4ZGNhZmE4MGYxY2UzZmZlMTZlNzM0ZmU4YWJhMjgyYjJiNmIzZTA4YzE5MzkwYWVjYzA0MWYyMDA4YjEyYTYzNDgxZjIwZGU2Mjc4MjFjZjBjOGNiNzUzYWViYWY2OGEwYzFmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3B1cnNlLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wdXJzZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI2ZjVlN2VjZGViYWMzMGE5NTljMmE2ZWRmMzI0NDg4NTg1MzFlNDAwOGZhNzIzY2I0ZjQyZmY4ZDY4OWI5OGYzZjE2YTI5MGUwZWM2OGU5YzAwYjVjMjE5YjVkMWIzMTA2NjMyOGMyNDQzYzNkNThmYWY2OWZlYzY2OGVmNWRjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3RyYW5zaWVudE5vdGlmaWVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90cmFuc2llbnROb3RpZmllci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjc4ZTljZjZkMTkwMTNkYzQ0YTk3Mzg3Zjk2NDczYjBlZWY0YzM3MzNmZDg1OTJjM2UwNzZjYjVmZGY2YzBhZWQ4MTFlZDNmZmM4YzczMTQwZjcxMjNkNWNjYmUyNDVkY2EyYzE3NTU3YTNhYjlmZGE1NTAwNGJiMGVhNGEyOGI2IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVHdWFyZHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3R5cGVHdWFyZHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1OWQ5MGQ2YzNjZWRiOTM2NzJjZjVkNzljMDhlZjYyZWNiMDU2MTc2YTgxMWU5MTVjOGFjZjFiZjdhOTc4YmZhYWEyMzkwMDRiYTM0ZGJjYmUzZmMwNzc0NDkyZTU0YjE1YjRiZjZmMWFjNjQzNDAyNDQzYzdhMGQxZmQ0NWJjMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1hbWJpZW50LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy1hbWJpZW50LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYWM0MmI4ZDQ0YjI0MmFjMTQ2ZWYwNWYxNDYyN2EzMjc5OGVjNGRlZjAxNjM1NWIwNjA0YWEyZmViYWNiM2EzZTQ4NGFiZGY4N2I3MzI0NmY3ZjVlZjkwOTU4ZTIzYzEyMmRhMjBkNGU2Mjk5OWJlYzM1MDdmNzE5ZGQ1MjQzNmIiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvZ292ZXJuYW5jZS12MC45LjEiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvZ292ZXJuYW5jZSIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL2dvdmVybmFuY2UtdjAuOS4xIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvZ292ZXJuYW5jZS12MC45LjEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZXJ0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2VydHAtdjAuMTUuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjIuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL3N1YnNjcmliZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3Vic2NyaWJlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIvdG9vbHMvdGVzdFN1cHBvcnRzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy90ZXN0U3VwcG9ydHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjguMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3dpbmdzZXQtdmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMwLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3RpbWUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy90aW1lLXYwLjIuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjQuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0cyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdHMtdjAuMTMuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b2UiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjUuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3pvZVNlcnZpY2Uvem9lLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NhcHRwIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NhcHRwLXYyLjAuMTgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MC4yLjE0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjI0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZXhwb3J0ZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4OWE1MjBjYmYxZjFkZDA1ZGYyNWM3YWYxYmFhYjE3OWQ5ODlhYTJkY2IzZmQ3YmY3NGJmZGUyNTkyYjMzMzg2NDJjY2VjNTdmYzNiM2M0ZjE4NjVhN2JlMzFlYzI0YmU2ZDU4NTk3ZmFkMGU2NzZmZTI3NzFiYzk1NTgzNDA4YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1hbWJpZW50LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy1hbWJpZW50LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZTRjM2FiMjU0ZjZiZTQxYTM4YTQ3YTlmYTIwMWM5NmNlOTBhNjQ2ZjU3ZTI1MjQzZTIxOTI1ZTBiNzVlNTEwMGVkYzA1YjRiZTU3YTM1ZDkzMzU1MjM1YTIwMTAzYTJlZGRiZDBiZTEwMTllYjliN2IxMmI5MTI2YzUzMjkyNDAiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2VydHAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9lcnRwLXYwLjE1LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2dvdmVybmFuY2UiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjkuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvZ292ZXJuYW5jZS9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2dvdmVybmFuY2UtdjAuOS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllci9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZXhwb3J0ZWQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9ub3RpZmllci9zdWJzY3JpYmUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3N1YnNjcmliZS5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL3Rvb2xzL3Rlc3RTdXBwb3J0cy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vdG9vbHMvdGVzdFN1cHBvcnRzLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC44LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3RpbWUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy90aW1lLXYwLjIuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjQuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdmF0cyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdHMtdjAuMTMuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy96b2UiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjUuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL3pvZVNlcnZpY2Uvem9lLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvem9lLXYwLjI1LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2V4cG9ydGVkLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdHMvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy96b2UtdjAuMjUuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2NvbnRyYWN0cy9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3pvZS9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3pvZS12MC4yNS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvdHlwZUd1YXJkcy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jYXB0cCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jYXB0cC12Mi4wLjE4IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2LjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ZhciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9mYXItdjAuMi4xNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL21hcnNoYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC44LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lY29uQ29tbWl0dGVlQ2hhcnRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZWNvbkNvbW1pdHRlZUNoYXJ0ZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5NDQxMWE3ZDAyODM3MzdhM2YwOGY0NWMyYjc4MmExOGRjYWE4YjZhZjA4YmM3ZmFmMTZkYmU3NTBlMGJhNjcyMWZjYmU4YzRiNTQwMjcxZjQ4YWM5MTg2NGMxYWQyYjlmMDg2MzQzZDk1OTBjYTNiMTVjNTA2ZGU0MGE5ZGQwOCIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEiOiB7CiAgICAgICJuYW1lIjogIkBhZ29yaWMvaW50ZXJuYWwiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiamVzc2llLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogImplc3NpZS5qcy12MC4zLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9tYWluLmpzIgogICAgICAgIH0sCiAgICAgICAgImplc3NpZS5qcy9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiamVzc2llLmpzLXYwLjMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbmZpZy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29uZmlnLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDY1ZGQ0MmU4MjVlNjg4NTc2OGFlZGU4NjEzZDNhMGJhODgyMmMxMzkxYjVlZGRiZDhiYzk4ZmNlYzcxZDhiYjk3Yzk0YTRhM2Y0ZmRmZTlhN2M0Yjc0OTU2ZjEzZTA2OWQyMmRjMzY0MmRmMjYzYWUxZDAxZjEwYTAzNTk5ZGEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGVidWcuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2RlYnVnLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDk4YzZmNDMyYmI4ZWY3MzdlZTc5NTk3YzljNjQ0MTg3NzcxNTQ0MjE1ZWUwOGRiMzM4ZGE2MmU2N2E2YjYxZjA4Mjg1OTUxNmY1NGNmNDk3YWI3YTE1MGU1MmFjNTdiNGU3OTUzNWY1MzhiNWFjMjI1ODFkZDYxOWI1MzFhNWIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWY5ZmY1MjJlNzhiMzkxMGZlYTc0MTlhZTI5N2QwYmI5YTFkMGQwZmQ5ZDg4OTk5ODIwZDcxN2FiZjE3NzBiZWRjMzQ2MWVhNTQxNDkzNmY1NWZkNmFjZGFlYjQwMjEzY2UzZGZkMjYzNTFhMWJjZmRiMGIxMzkyZWE5NjNjNDAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbGliLWNoYWluU3RvcmFnZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImE5MjY3NzQ4YzU3ZDVhODE2NTU4NWM2YzVlNmQ3NzdjZWIxOWVhZDU4MGVkMGQ0MTlmZTg4ZGVlY2Q0NTNiZTZjOTUzOWRjZjI5ZDAxYzc2NTViNzQ5OTE0MWNlYTQ4ZjBlZWI3OGI3Y2UzYzk0YTA2MWNkYWMyN2IxYzZlZTIxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL21ldGhvZC10b29scy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWV0aG9kLXRvb2xzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOTMyNzg4ZmRiNmQ1ZjNkY2IzOGQ4NmMyODhkOGM5YjIxNjE4MTk2NDNmMmJiN2FiYmQ3M2QzNzM4OGYwNzYxODM1YWZkYzBkNTM5ZjAxOTgyYjVmNDIwNzEwNzY2ZmU3ZTE4NzhhZjA2YzM0ZjA2M2RhMzJjYTZjZjhiZjljODEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY2YjQwZDY2ZjMyNTVjODc3YjUwNmUyNTE1NDc3YWRmMjc5MzIwN2YyYjg2NjM2NzYzZjk5MDEzZTgxOWMzOGE1MmNhNjQxMGQzOWI3NThkNGM3MjQ0YmU1NGU5ODI0YTI2YThhNTkwMzU1OTc5ZWVlMGNlNWI3NjMxMGExOWUwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3V0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy91dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNmYTUzN2YyZGRjYjg0MGZlYTExMDU4YzNkMmNlNGJhOGE5MTc5NGQzMTI4MWUxMTM5NzVlOWNiMzlmZmE5Y2UzZDVmNGZhYjdjM2E1MTM4MDFiZGQ4ODRiNmJmZTY1YWU4ZGRjYThiNjhhNTNjNTUzNjM4YWE5ZGQ3MDA3Yjk5IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL25vdGlmaWVyLXYwLjUuMSI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy9ub3RpZmllciIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjUuMSIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjUuMSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Fzc2VydCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Fzc2VydC12MC41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9hc3NlcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVybmFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjIuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjguMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3dpbmctc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zd2luZy1zdG9yZS12MC44LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9zd2luZ1N0b3JlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3dpbmdzZXQtdmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMwLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MC4yLjE0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiLi9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJleHBvcnRlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjg5YTUyMGNiZjFmMWRkMDVkZjI1YzdhZjFiYWFiMTc5ZDk4OWFhMmRjYjNmZDdiZjc0YmZkZTI1OTJiMzMzODY0MmNjZWM1N2ZjM2IzYzRmMTg2NWE3YmUzMWVjMjRiZTZkNTg1OTdmYWQwZTY3NmZlMjc3MWJjOTU1ODM0MDhhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImYzMDdlODQ1ODYxMDBhNzM5ZmRlYzU1NDk4ODkwZGI0NDQ4MjkxYTA2NzU3MWE1MTczOWU4YTQ4NTk4N2M4MTkwYzg5NTBjYjJiM2I4MTdiZDAxNzgyODIyOTI1YmEwYTVlZDk3ZmI5NGEyYzRhZWZmYjIzNjM0ZmJlOTA0ZGIwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNkYzI2MGViMGU0MjkwMzgwNDEyNWIzZjUxYzA3OWM4MzMzMDE2ZWIxNmQ3YTQ1Njk0MmJmYjViODg0Mjg5YzJhNjI0N2M3ZDkxNGZmMmNiZjgwNzhkMmYxYjVkOTE4ZjhkZTJkOWNjMWVmN2JkOWQ1Y2VlYjdmNTRmMTQwZWY4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL25vdGlmaWVyLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9ub3RpZmllci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImFlMmVmZDJiZjAzOGRkYmY4ZjZkMWY3NDA0NTcwMzk1NTE1ZWExY2U0ZGRhZDkzYTk3M2UyMGFjY2M0MjJiOGE1MzY0NjI1YzdlN2I0MzQ0NjI4YjQwNDQ2YWJiZDkzMWQxMTY5NzkzMzRiN2ZhZDkwMWM3N2JlOGE5NTM3NDNhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3B1Ymxpc2gta2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wdWJsaXNoLWtpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU1ZmZkM2I3ZmNjMGNhOWMwODZjMGI1Yjg0ZjM2OTM2YmM4NWExMmE5NTgxZTM3ZjJjZDU1MjkxYzJlNDUxNDdmYWNkNmU5OTYyNWIyOTkwNzBlYzdiNzUxMWViMDdmOGIzMGZhYzcyNDM3Y2U5NTg3NGZiOGM2NTA5NzM2YTY1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3JlZC1ub3RpZmllci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVkLW5vdGlmaWVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzBhNzM2MjAxZjQxMjg5ZTliZDkwZjIwMTQ4ZjA0OTc4ZWUxN2Q0MTQyZGU1ZWFkNDRhMWY0OWRmZTMxNDU5ZjQ2OTM2MTE0ODJkYTRhMGMyMTVmNDRlYjZhMWI0MGE2NjA1Mjg5MjAwMTA3ODczMTc3MzViZmQ5YzBkMDg2NDgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVkLXRvcGljLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9zdG9yZWQtdG9waWMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5ODg4NTg2NDc4YWZlN2JjM2UyZjUxOTJjMGQxODExYmYyYTE3ODg2NDM0MTRkOGZlZTY5NjlkZmVkZGJiNGU3ZWRjYTI1NzE0MWU3Yzk4YmZhNzY1NmViMjFiMzY0YmU5YTIyYjM3OWE5NjVlZWY5YTdhNzU2ZWU0OTJkNWZlMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXN1Yi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzdWIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkZGZlNTg1ZmY5MjAwZTFlNzFmYmM2YjU0NDllMWFhNmExMmZjMTZiYjI1NmMwZTM3YTY1MTBjMjhiZTkxOTE0OTM5Yjg5ZGJjODVjYTljNTYzMzhkY2IxYzU3MzJlY2JhOTlmMWVjNmU3N2NjZWY3OWRkNmFmODU3MjZkZTY1MiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdWJzY3JpYmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N1YnNjcmliZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImIyNzc5MWNkYmZjMGRiZTFmYWJhYjExODBhMWY5ZjRhNDk0YjM5ZDA3OTA3YTU5NTRiYThlY2MwM2IyYjhlNDFjY2RiMWE3OWEwNmQxYmFhMjViNGM4Njk3YWM0ZWY1NmVkYjNmZmI0MzFjYTBiZGM2M2NkM2JkZTcwYWE5MjMwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N1YnNjcmliZXIuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N1YnNjcmliZXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1MTJjYmMwNzAxMTkwN2Y5MGMxZmE1ZWY0NzFjNGFhODhlMWUyODY2YzAyNjg1NjVmOTBiMjkwMDU5YWFhMTc1OTkzY2U4OWZjY2EwYjVlZGU1Y2UxZmIyZTczOWFmN2Y4ZTk3ODkxMDU4MDI1MGNiNjFhNDNiNGUxMWQ4ZDQ5YyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90b3BpYy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdG9waWMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmZWQ1NjE3OTY4MjJmYWY3OWZjZDk1OTI1YWQ4NDJjMzU5YjlkMDliYmExNTQ5MGMyNDg2MjhlYjYyMTg2NzFkNWE4NDE1MzVmMDRmMjA4ZThmNWM4ZTBiNzZmZjBlMWQ4YjkwM2JiNDRlNTBiMzkxYmQwMGE2N2NhNjMzNjQzYSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlcy1hbWJpZW50LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy1hbWJpZW50LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjZjZjgxMGNlMzQzZDFkOWFjMDJjNjQ3N2JkYzA4Y2E4YTgxMTkxN2NhZGI5Yjg1NGQ1Y2FmZTUxYzFkNDI0YmMzZWUzNDdmNzBmZWNhODZmYzkwNGZkOGNiYjc1ZjE2Zjk3MWM5NmYxNDAyMTE2MGYzZTNjNmRlMTQwZmRhYzEiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvc3RvcmUtdjAuOC4zIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3N0b3JlIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvc3RvcmUtdjAuOC4zIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvc3RvcmUtdjAuOC4zIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MC4yLjE0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbC9zcmMvZW5jb2RlUGFzc2FibGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC44LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsL3NyYy9yYW5rT3JkZXIuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbWFyc2hhbC12MC44LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9yYW5rT3JkZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGZhc3QtY2hlY2svYXZhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBmYXN0LWNoZWNrL2F2YS12MS4xLjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2xpYi9lc20vYXZhLWZhc3QtY2hlY2suanMiCiAgICAgICAgfSwKICAgICAgICAiQGZhc3QtY2hlY2svYXZhL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZmFzdC1jaGVjay9hdmEtdjEuMS4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiLi9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJleHBvcnRlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImYyOWZlMzUzMDVmODA3ZGEyMzVmMDY4OGQzYjY1ZTM1MTAzOGRmYjU3NDBjZjcyODFjMjBjNDUzODI1ZjgzYTA2Njc3Njk2ZDNiZTJjMDE4NGJmMmQyNTA4MWEwOGI5MjkwZGVlYzY5YTM5Zjg4NjI5MDAxN2NjODJiYjA0YzZlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9pbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNiNTJkMDdkN2E1ZWRjOWY5YTcxY2ExZWExNjViNGJiNTNmMDU4MzUwZjZlNTJmNjVmNmJmNjZiYzIzYjFiODg5MWZiZDM2MzNiNWJmMTczZGJmOTk0YjAyMDhiNmVjYjZjYWI0OTNkMmJjODQzOTQ3NzYzNjlmMTU4ZmM0NDRkIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvY2hlY2tLZXkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY2hlY2tLZXkuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4YWM3YjA4NmJlY2IxODYxNmNkODY3NTc3ZjdkNjQ5OTU1OTU1NjZmZDVhNDRkOTkwY2U0NzUwMDJlNjYxOTBlOWZiNjc0MDQwMWY0NzhjMmNhYTljNjZiZjQwMDlmMjAxNDNiZjZhODBlYjg4MTM1Njk0ODFjYzRjNWM0YTE5ZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2NvbXBhcmVLZXlzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTkxZTVmMjA3MjY1NmFlZWU3Nzg1OTIxNWNlOTJlY2M4NjhiMTljN2UyZjY4MGNmMTVhYjUwYjgzZTZmNTlmNjVlZDcwODFmMjE5OWJkMTQ3MTJiNzUzYWI2YTNiNDU0NTVlODZhNjhkOTA5ZDJhZmQ3YjZiYWEwMDFiNDBkMjkiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9jb3B5QmFnLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL2NvcHlCYWcuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3ZDI0OGExZGI1MWZmMjQ0YThjOTkwOWFhMTk0Y2U0OWMxZDEwYTBmNTljM2Y2NGFiYjg2NTBkNTYxMzA1MDgzNGViNTIwNDkzOGMxMzk2OGFjZTUwZTQwYzIzN2Q5YmU0NGNkYmRlYWFmYTc0OGY5NTEwOTgyOGMzNjFiZjY2YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9rZXlzL2NvcHlTZXQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2tleXMvY29weVNldC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjYyODQzOTc0ZjlhNjkxYWQ0MjNhY2ZmYzg5YjU2Y2M2MzE2NzdmMTk4MWNiNjcxN2YxZTE3ZTliMzFhZjBhY2ExNzQxMzExNTRiYTcwMGUwMjcxYjgwYmVjNDM1NzA1Nzk3MDExNTU5MzEwNTJkZTZjMzJmNjMyZTFlZGU0OGRmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMva2V5cy9tZXJnZS1iYWctb3BlcmF0b3JzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTljYjUyYzEzOTY0Mjc0NjFiNDAwZjY4YzllOTUyYjY2YzFlYWYwYTUxYjEyYmM3YmE5YWMxOTlhYjZkYWY2ZTRlYjMzZTNiMTM4ZmE5MzY0MmU0OGYwZDgwYTMzNTM3NWNjZGNjNTUyZTZmN2IxNmU2NzQxNDBlYjBlNDg2NmQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4MzRkYTlkOGI0NTFmNDVmNjUxOTYwNjhmNDgyODMzNmRkMzVjM2FlNjliYzU1MDRkNDI4MjdiNWJjYzZjMTkyZmUxOWE2YThjYWViMmNkZTE2YTdmYzE5ODE1ZDRkN2FmMTE0MWIxNDRiOTg0NzM2NzdmNTA3Y2JmOTA4NzE1NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9sZWdhY3kvbGVnYWN5TWFwLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9sZWdhY3kvbGVnYWN5TWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZThkYmFiYTFhOGE2M2FjMGYwMDE0YzFiNDhmNTZjZDM0MjE2YWYzMzRjM2ZlODI4M2Y2MzM4YzlhNjdmZWY0ODQyODA5ZDkwMTMyNmE5ZWFmMDVhZDY4NGY0YTRiMDM3YjUzZTNhOTBmOGJiMGE4YmRkNTg3MjJiMGYwMTAzYjYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNjRmYTEwNTY5Mjc3Y2Y2NzMzOTA3ZmRiMjQ1ZTliZWYyMmE4ZmU3ZTc5Y2EwNWJlZGY3ZDU4YjllYzU1MjZjMzhjMWE5MGUzZDgyYWRiZWJkY2M5NTExZGY5ODM0YzEzMGRlZmNkM2RkOWQyMGYxNDJhMDY2YjBmMjNlOGVjYmMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF0dGVybnMvZXhvLW1ha2Vycy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF0dGVybnMvZXhvLW1ha2Vycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjE4NTkwNDFjMTJjYTRhYzFhYTc5NmQ0NDcxMWQwMjI3NzMwNDQ1YmY4ZDYxOWFhZWEzYTcyYjAyYmJkNGE3MWQ5MmY1ZTVjYThkMzc3NTdkYzI5MjQzMDM0NWI0ZDMzZjI4Yjg1MDI4YjZhNmEwZTU3NjdiZjQ4YWQ4Y2UyN2I4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3BhdHRlcm5zL2V4by10b29scy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcGF0dGVybnMvZXhvLXRvb2xzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDkxMWJhNGQ1NGFjNmEyYTY4MzZkNWYwMzk3NjRmYjEyOTY2ZThkNzJjYzdkZjViN2MyODZmMTk5NmNkYjZmM2NjODg1YTAxOGJlOGUxZWRlNjg3OTBlZTRkMjU1NjBmMGQyNzI1MjM4MjQ2YjNlNmVlYzFkMGUxZjRhYjJmMDMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF0dGVybnMvaW50ZXJuYWwtdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3BhdHRlcm5zL2ludGVybmFsLXR5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNDM1ZDI2ODVhMWNmNjA5YmVlNTkwM2IyMjE2YWVlMzdjODA3ZmU0ZTFhY2M1MjlmZmVlYzVmMjUyOTYyODRmMmRlZjU2NjE2ZGU3MzZiYjJkNTRiMWY2NTMxNmZiN2M1OWQyYmM5ODY2YWMyYjU2MzNiZTAyYWEzN2UyOTMzZDIiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlNTQ5YjcxZWFhYjU2MWVhODE1NzU2NGRhYjc5MGI3YTVmMWYzYzYyMzVkZTI2MjBjMWYzODdhM2M2ODBkZTJlNThmNThhZTBiZTA0MWIxZDgzMGQzNTFmOTEwMGQ1ZjJmZjdlYjFhZjBhNjk0YjA2NjA4MWY2NDE5MmM0NjE0NCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI5YmFmZDg4ZGE0YTJhZjZkODcwOWVlZTdmZjJjMDgyN2M1MjFiYjVlODk3NjhmZTEwNDEzMjI4ZDBiNGI1MDk3ZWE5M2IwMDgzMWZiMTNjMjVmOTcyNjM0YTUyMWE4Y2NjZDg4YzVkOWRhY2U0YThkYThiNTViYTM2MmFjNTNmIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzL3NjYWxhclNldFN0b3JlLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiYTQwNDM4YjJlMTIyMDc0MzJkYWYzMDM0NDI0ZTgyNWU0MGQyMjhhZmEyOWI0ODJmNjc4N2Y5ZDAyMGEwM2Y0NTMxMTgwNTc1NWRhZjJkNzk4MDQzYTJkNWEzYjU4MDQ3ZjQxZDUwYWVjNDQ1N2RmYmRlY2JkZmNlYzUxNWZjMjYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjhkOTE4MjliN2Y4YmJkYjQwNDQ2MjMzYjc4Njk2NGM2YTA3ODhmYzc1Y2NkMzRiNDNkNGQ1ZTAwNWYzOWZlMWQ3N2ZjZDViYTJiMTkwZjYyYTk3MjQwMjVkNWNhMDRmMjY3MzViY2E3MDY3M2RjOWJmNGEzM2E5NGNhOTZiODAzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5NjE1MTUxZmUzZjhhMTJkNTdlZGExZWZkOGE4MzdlZDFiNWZiOTkzMTFmYjdhMDJhMTcxOWQ1NzA0ZjIxNmExNGY4MmUwODczMTU3ZTcyZGViMGIyZWMxOTM1NjZhNTZkMjNjNjg2YTg2ZWYyMDYyZWI1ZWFiYTdhOTZlOGNmMyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3N0b3Jlcy9zdG9yZS11dGlscy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImZhMTA5M2ViZTdkMTgxM2U2ZTg4ZmEwOTFmNmZjOTlkMWFkZWMyYjI3YWQwMzNjODA1NDFiOThiMGIwNjg5MGU3NTE4MGM5ZGE5NmVhMjIyNzQ5MDJkODlhZjhlYTlkMTc3MTU1ODMxYTNlNjIwMmZjZGRiZjkyM2E5NzQwMGM5IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjQ2NGY3OGJhOGVjYWMxM2MxMjEyYTUzMmE2OGI2OGJlZWVhZGQ4ODBmZjBkZTI1ZGY0YWUwNjZiMWM0YmY0ODdiN2E5ZGEyZGY3MmZiZjY2NDZiNjBlYTlkYWZjODc1ZjA4ODRmYWVlZjE4YTVkZjg2ZWI1NDc5YmQ5YThkYjdhIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAYWdvcmljL3N3aW5nc2V0LXZhdC12MC4zMC4yIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3N3aW5nc2V0LXZhdCIsCiAgICAgICJsYWJlbCI6ICJAYWdvcmljL3N3aW5nc2V0LXZhdC12MC4zMC4yIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMwLjIiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9hc3NlcnQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9hc3NlcnQtdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvYXNzZXJ0LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjIuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL3N1YnNjcmliZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3Vic2NyaWJlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIvdG9vbHMvdGVzdFN1cHBvcnRzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy90ZXN0U3VwcG9ydHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjguMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3dpbmctc3RvcmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zd2luZy1zdG9yZS12MC44LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9zd2luZ1N0b3JlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3dpbmdzZXQtbGl2ZXNsb3RzLXYwLjkuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvdGltZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3RpbWUtdjAuMi4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3ZhdC1kYXRhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy94c25hcCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3hzbmFwLXYwLjEzLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3hzbmFwLWxvY2tkb3duIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMveHNuYXAtbG9ja2Rvd24tdjAuMTMuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjAuMi4yOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L2F0b2IuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYwLjIuMjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2F0b2IuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L2J0b2EuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYwLjIuMjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2J0b2EuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L2RlY29kZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9iYXNlNjQtdjAuMi4yOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vZGVjb2RlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2Jhc2U2NC9lbmNvZGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYwLjIuMjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2VuY29kZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9iYXNlNjQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Jhc2U2NC12MC4yLjI4IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYmFzZTY0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYmFzZTY0LXYwLjIuMjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vYnVuZGxlLXNvdXJjZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9idW5kbGUtc291cmNlLXYyLjQuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2J1bmRsZS1zb3VyY2UvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYnVuZGxlLXNvdXJjZS12Mi40LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2V4cG9ydGVkLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2J1bmRsZS1zb3VyY2UvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2J1bmRsZS1zb3VyY2UtdjIuNC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY2FwdHAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY2FwdHAtdjIuMC4xOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NoZWNrLWJ1bmRsZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jaGVjay1idW5kbGUtdjAuMi4xNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY2hlY2stYnVuZGxlL2xpdGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY2hlY2stYnVuZGxlLXYwLjIuMTQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2xpdGUuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY2hlY2stYnVuZGxlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jaGVjay1idW5kbGUtdjAuMi4xNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9hcmNoaXZlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9idW5kbGUuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vYnVuZGxlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci9pbXBvcnQtYXJjaGl2ZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbXBvcnQtYXJjaGl2ZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvaW1wb3J0LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2NvbXBhcnRtZW50LW1hcHBlci12MC44LjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2ltcG9ydC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXIvbm9kZS1wb3dlcnMuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyLXYwLjguMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbm9kZS1wb3dlcnMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vY29tcGFydG1lbnQtbWFwcGVyL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9jb21wYXJ0bWVudC1tYXBwZXItdjAuOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2LjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2ltcG9ydC1idW5kbGUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW1wb3J0LWJ1bmRsZS12MC4zLjAiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbml0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2luaXQtdjAuNS41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vaW5pdC9kZWJ1Zy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbml0LXYwLjUuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2RlYnVnLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2luaXQvbGVnYWN5LmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2luaXQtdjAuNS41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vbGVnYWN5LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2luaXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2luaXQtdjAuNS41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2luaXQvcHJlLWJ1bmRsZS1zb3VyY2UuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vaW5pdC12MC41LjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wcmUtYnVuZGxlLXNvdXJjZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbml0L3ByZS1yZW1vdGluZy5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbml0LXYwLjUuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3ByZS1yZW1vdGluZy5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbml0L3ByZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9pbml0LXYwLjUuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3ByZS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9tYXJzaGFsIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL21hcnNoYWwtdjAuOC4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9uYXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjI0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9zaGltLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vc2VzLWF2YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9zZXMtYXZhLXYwLjIuMzYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Nlcy1hdmEvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vc2VzLWF2YS12MC4yLjM2IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9zZXMtYXZhL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9zZXMtYXZhLXYwLjIuMzYiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby96aXAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYwLjIuMjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3ppcC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vemlwLXYwLjIuMjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby96aXAvcmVhZGVyLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3ppcC12MC4yLjI4IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9yZWFkZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vemlwL3dyaXRlci5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby96aXAtdjAuMi4yOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vd3JpdGVyLmpzIgogICAgICAgIH0sCiAgICAgICAgImFuc2ktc3R5bGVzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogImFuc2ktc3R5bGVzLXY2LjIuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiYW55bG9nZ2VyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogImFueWxvZ2dlci12MC4yMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9hbnlsb2dnZXIuanMiCiAgICAgICAgfSwKICAgICAgICAiYXZhIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogImF2YS12NS4xLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2VudHJ5cG9pbnRzL21haW4ubWpzIgogICAgICAgIH0sCiAgICAgICAgImF2YS9lc2xpbnQtcGx1Z2luLWhlbHBlciI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJhdmEtdjUuMS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9lbnRyeXBvaW50cy9lc2xpbnQtcGx1Z2luLWhlbHBlci5janMiCiAgICAgICAgfSwKICAgICAgICAiYXZhL3BsdWdpbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJhdmEtdjUuMS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9lbnRyeXBvaW50cy9wbHVnaW4ubWpzIgogICAgICAgIH0sCiAgICAgICAgImltcG9ydC1tZXRhLXJlc29sdmUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiaW1wb3J0LW1ldGEtcmVzb2x2ZS12Mi4yLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIm1pY3JvdGltZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJtaWNyb3RpbWUtdjMuMS4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleCIKICAgICAgICB9LAogICAgICAgICJzZW12ZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAic2VtdmVyLXY2LjMuMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2VtdmVyLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZXhwb3J0ZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI1NjdlZjFiMWIxNjJkMDI4YWQ0OTM4MjhjZTNlZDQ1MDkzOGQwYmZmZDRmOGNlZTFkNzYxOGQ1OTk3MDlhY2ZjNGI5MjVlMDM3OTVlODYxZDdkYmI5Yjg5ZjAxNDdlZWMyYjIxZjE5NDRmN2E5Mjk3MDM1NTUwMjVmODYyODdlNiIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy90aW1lLXYwLjIuMSI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy90aW1lIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvdGltZS12MC4yLjEiLAogICAgICAibG9jYXRpb24iOiAiQGFnb3JpYy90aW1lLXYwLjIuMSIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2Fzc2VydCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2Fzc2VydC12MC41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9hc3NlcnQuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOC4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjI0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIi4vaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4MTdjZTI0ZjU0ZTA5Nzk3MzIyODdjMzFjNGE1Yjg2YzkyNmFhODA0Mzg0YzlmMWI3ZmRkOGRiYjQ0ZTcwYmRlMzdhYTk2MGRiM2NiZWMwOTVmZTU0ZTEzOGY2MTgzYTRmOTlmMjkyMWZiYjZkN2M5NzEwZTg1NWZhZjdlMDI3YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90aW1lTWF0aC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdGltZU1hdGguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhZjA0MDQzODE3NjM0ZGM1NzY2MTM2Yjk2ZGJmY2RjYTlkNWRiYjZhNWVmOWQ2OWY3NTI0ODFmOWQzZTE5ZTNmMWVkM2U3OGNhZWE5NWU5MTZjMmE1MmVjMjdlZjQ0YjI3OTBiY2I5MzYzOTFhMThhYzRkYTg2ODAwZjE1ZGE1NyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy90eXBlR3VhcmRzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlR3VhcmRzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiM2Y3MGFjMmY4NmNmYmU4NTgwZmE5MGE2MzFhOTJlMDA4OGI1ZGQ4MTU5ZTUwNjYxMDdiOWQ5ZDc4OWY4YTFjYWJlMjk5MmM0YWQ4NGRmYzUxOGViOWZhMjZhY2FlYzA5NGI1ZTQ5ODFhNjRmNDRjZTQ3NTNmNTc4YTJhOWZlYTAiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zIjogewogICAgICAibmFtZSI6ICJAYWdvcmljL3ZhdC1kYXRhIiwKICAgICAgImxhYmVsIjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zIiwKICAgICAgImxvY2F0aW9uIjogIkBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXJuYWwiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N0b3JlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3RvcmUtdjAuOC4zIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZXhvLXV0aWxzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9leG8tdXRpbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI4ZmFiZmMwZmI1MWYxY2Y5NTQ0YzMyY2M3MzA2ZDcyNWE2ZTljNDA2ZmNlZGQxNGM3N2U0MTdiZTkwZmQ2YTU2OTQ4YmMzZDkzYWI1ODdmZTYyNjU1YzRkMzRhYzIxMmRmNTRkODMwZmIxYmJlNGZlNjdjOTM5YzNjYmNlMWRlZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaW5kZXguanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3N2UzYjUzNjg5ODdjMjk5MTM4MDY2YmZkMGY4ZDNiMTI0MTFmZTg3NDI4ZGI4YzBjYjQwYjVhYjk1ZjA0Y2JjNWMzNDI0MzMxMmU0NTY2NWQ0MzZjOTJhMzEwMmNlYmUyY2Q2YzQzMDAwOTJiZmFkNGQzNmFhN2EwN2EyMTFmNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy92YXQtZGF0YS1iaW5kaW5ncy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdmF0LWRhdGEtYmluZGluZ3MuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5ZWY2M2ZiMmE1ODI1ODhjMWZmM2ZmNzA0M2I2MDYzZDE0Y2NmNzI0NzkwYmUzY2ZkNzQ3ZTBhNzA4MWQ3MDQ3YWViZjZmZWY2NDA1NzA3ZmNlZDYzOGJkMDc0YWZhOWUyM2M2ZDAxYmY4YzFiZTM0MTRhNGFmMzM3MDE0YmY3MyIKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICAiQGFnb3JpYy96b2UtdjAuMjUuMyI6IHsKICAgICAgIm5hbWUiOiAiQGFnb3JpYy96b2UiLAogICAgICAibGFiZWwiOiAiQGFnb3JpYy96b2UtdjAuMjUuMyIsCiAgICAgICJsb2NhdGlvbiI6ICJAYWdvcmljL3pvZS12MC4yNS4zIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvYXNzZXJ0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvYXNzZXJ0LXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2Fzc2VydC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2VydHAiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9lcnRwLXYwLjE1LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL2VydHAvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9lcnRwLXYwLjE1LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2V4cG9ydGVkLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9pbnRlcm5hbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVybmFsLXYwLjIuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9ub3RpZmllci12MC41LjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL25vdGlmaWVyL3N1YnNjcmliZS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL25vdGlmaWVyLXYwLjUuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3Vic2NyaWJlLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvbm90aWZpZXIvdG9vbHMvdGVzdFN1cHBvcnRzLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvbm90aWZpZXItdjAuNS4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi90b29scy90ZXN0U3VwcG9ydHMuanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy9zdG9yZSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N0b3JlLXYwLjguMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3RvcmUvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9zdG9yZS12MC44LjMiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2V4cG9ydGVkLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBhZ29yaWMvc3dpbmdzZXQtdmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvc3dpbmdzZXQtdmF0LXYwLjMwLjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3N3aW5nc2V0LXZhdC9leHBvcnRlZC5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3N3aW5nc2V0LXZhdC12MC4zMC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAYWdvcmljL3RpbWUiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy90aW1lLXYwLjIuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGFnb3JpYy92YXQtZGF0YSI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL3ZhdC1kYXRhLXYwLjQuMyIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2J1bmRsZS1zb3VyY2UiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vYnVuZGxlLXNvdXJjZS12Mi40LjIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9idW5kbGUtc291cmNlL2V4cG9ydGVkLmpzIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2J1bmRsZS1zb3VyY2UtdjIuNC4yIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9leHBvcnRlZC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9idW5kbGUtc291cmNlL3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9idW5kbGUtc291cmNlLXYyLjQuMiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL2V2ZW50dWFsLXNlbmQiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi44IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvbm8tc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9mYXIiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vZmFyLXYwLjIuMTQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9pbXBvcnQtYnVuZGxlIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2ltcG9ydC1idW5kbGUtdjAuMy4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL25hdC12NC4xLjI0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbmF0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0IjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3BhY2thZ2UuanNvbiI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vcHJvbWlzZS1raXQvc2hpbS5qcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAiZXhwb3J0ZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJhYmE0N2UxZDVlOWUyYjdmMDQwMDgzOTk2Yjg3Yzg1YmVkNjIyNGMyMjEyYjE2MTVhNzkyNzYzMWJkOTQ1ZDQxNGFiOGIxMWJlMDVkMWEwYTVjMGVjMTRkZjYwMTAwNjZjYThjNmY3NTg3OGIzNWJiY2NhNmZiZTIzMjg3OGY5OCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdEZhY2V0L3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdEZhY2V0L3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZWYyNWM5YjhlOTIyM2E5Y2VkNTUzYjRiMjc3MDRiOWI3YTBiZGNmM2U5ZDc2OWM4ZjdmZDQwM2E3NmEzNDU3ZDg1YmZjZjA1ZWNjOTBiYmUzY2FiNGY5NDZhZGFkMTY4YjFhNTcyYzFjYTU2OGNlZjM4NjMwMjZjODE3ZWI2MTQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvY29udHJhY3RTdXBwb3J0L3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdFN1cHBvcnQvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlNDg1N2NkMTk0ZTMxYjRlZjAxNWUzYWE5ZmRjYmU3MzA2MmVhYjk4YTQ2ZTc5Mjg0MjhlZjEzMjFhMjU3OGNhMGRiZWZmMTM0ZTg1OTY0NTM5OTBhZWU5MDZmZTJlZjEyNjBiYTkxYmQ1ZjdiMDMwZDM0OTliOThjNDBjNDQzZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdHMvY2FsbFNwcmVhZC90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RzL2NhbGxTcHJlYWQvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiNTc1MDAwMjk1Yzk1MzkzN2YxMGZiNWUzODNjODQzYmM3MTY0YTQ5MDc1YzUzZTE5Y2JhNDQ1YzFmZDVlNDFmZWEzMmQxYzI3NWFmNTRjNGNhZDFjNDlmNGE3NzE2YTljODU0MDYxMjY3YmY3MGQ1NzRlYmNhZWQ4ZDFjOTJiYyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9jb250cmFjdHMvZXhwb3J0ZWQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2NvbnRyYWN0cy9leHBvcnRlZC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImM0NjUxOGZkZjFjODVhMzljZjBmNTdkZTFlMWJhNmE3N2FjMTY3ZTMyYTg0YTVlMjg3OGQxY2I5NWMyMTA4NzkyYjBmMThkYWJhZTZmZDA0ZTI0NWZiY2IwZDRkYTg3YTUwMmE5YmY3YzA3ZTkyZjBkMDgyZTI4MzhhYTlhOGM4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0cy9sb2FuL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9jb250cmFjdHMvbG9hbi90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjY0YTAyOGRhOWY1MGY2YjM1MGJjMmJmMDg1Y2JiMmVkYmE2NjZjMzE2MGI5ZmRmYzQxODMyNWU2MjM5ZDI2OWE4MDQzMTdmY2Q5ZDg2YjczYjIxZTkzNDVhZTNiMmNlZGMyNWFmMzZjM2I3NjJmODAwZjI2OWNkYzZhMmNjOGUxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2NvbnRyYWN0cy90eXBlcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvY29udHJhY3RzL3R5cGVzLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODFkNDI5YTA4OWNhNWFjMzM1ZjZhOTBkMjFiNTMxOGZkZTg4NGE5ZDIzNDU1MzM0Y2U1YjAxZWNmOTljZTA5Nzk4OThhYTQ3ZTBjMmQzN2I2YzhmMjQxMmQ4M2Q0ZDkzMDk5MWIwMmUwNTBhMzJiYzg5NzM2NDgwYTE0NDg3MTAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjYyZTEyZTVjMjM5MzUwMmQzMDU4Njk3OWE5ZmVkZmE0MDA2NjBlYjllYWE4Yzg0NDUwMDJlNWJjOTA0NGM2NjI1YmFiYzBmMGE3NTQ1ZjYxYWY5NTdmNmY4MzcxOWY0YjVkYjI2YjcyNWRhZWVmMTUzZjRlNTRiNDY3NTdhOTE1IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjg3ODdmNDc3NGFlYmMxOGQ2Njk1ZTQxMmU4ZDg2ZmQ4YjUxMDE3ZGEwODE4MGQxYThjNWVhMTY4NDY0MTE2ZjM4YjI4NDBkZjYzNjU4ZjFhNTIwODI5YzE1Y2FiN2ZjYjRjZGY5OTc4ZTdlYjg5MWVjNjQzYzBlYzFiN2E0ZTYyIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3pvZVNlcnZpY2UvdHlwZXMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3pvZVNlcnZpY2UvdHlwZXMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmOTc5MzQ0NzQ3MTJlNjI5OWQ1Mjg3ODBlODI5Y2E0NGVmZDRmNWM4ZGUxYzJhMDczNzZmMDA0MzAzMDhkZGU2NGUyZTUzMGY3Y2FkNDY4NTg3ODgzNjc1YmI5MGEzYjk0NWNlN2ZmM2JlOTBiMWRiMjMyOTdmODU5YzcxNTliOCIKICAgICAgICB9LAogICAgICAgICIuL3Rvb2xzL3R5cGVzLWFtYmllbnQuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAidG9vbHMvdHlwZXMtYW1iaWVudC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImViNjk1ZDgyM2Q5ZGQwMjZjN2Y2MjE0MDVjOWE4ZDJkYzA3Y2VmNWMyZTAyYWU0OTM4MjM1Yjc0ZDM2ZGYwOWI3MTY5MGZlOWRiM2E1MjIzM2Q4ZGYzMTEyZTNjZDE4MTNkY2JiMjkzYzAzMzJkZWZhZTc3MTNjNGY2YzBmMWZlIgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2LjgiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQiLAogICAgICAibGFiZWwiOiAiQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi44IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOCIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL0UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL0UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJmNTVmYzg5OTM0MzYxYmRmMjUyYTEwNGNkNmZiNGZhN2JhOTRlZDI3ZTkxMmRhYmU0YmZlMjdhZmM0MDYyMTU0NTcxMTY5NzdkNjg2OTg3ZDA2MjFiNTc4ZWQxMWY4MDExYmE2MjNlODdlMDAxMGJlMTFmYmFhYmQxNWFlNGQzOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9uby1zaGltLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9uby1zaGltLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiOGM2ODUzYmExZTU0NmVmZWM4NWIyZjY4YzkzNThkMTc0NzlhY2FjOTNmZGE5ZWUwNDRlMmZlODAwNjA3ZTFhNmI2MzMzMDZjNTk3ZjkyOWZkYWM4ZjU0YWNkZmU2NGFiZGI1MWI1MzA0NGQyZDA4YmFkOTBhMmRkNmVhMTc4MDAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHJhY2stdHVybnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3RyYWNrLXR1cm5zLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNTIyYWIwNzRmNTE2MDNhYmQwNmUzYjE5NmZlYWIxY2MxODI2YjFhMjYzNzhkMDI1YmJiM2RkMjVhZTY2NDQzMDkxNTUzOGYwYTU4YWY2YmQyOTdmNTFiYjFmM2UwYTYyYzM3MDdhZGUzMzdiOWZiNmJmZDhhOGZhMzA4NGExZDQiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL2Zhci12MC4yLjE0IjogewogICAgICAibmFtZSI6ICJAZW5kby9mYXIiLAogICAgICAibGFiZWwiOiAiQGVuZG8vZmFyLXYwLjIuMTQiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vZmFyLXYwLjIuMTQiLAogICAgICAibW9kdWxlcyI6IHsKICAgICAgICAiQGFnb3JpYy9pbnRlci1wcm90b2NvbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9ldmVudHVhbC1zZW5kIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL25vLXNoaW0uanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vbWFyc2hhbCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9tYXJzaGFsLXYwLjguMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMjg2OGQ4M2E1NWE2M2QxNmJiNTQwN2IyMzg3NzU4YTEyNjZiNTZjYzU4ZTRhY2ZhYzhhNmUxMmEwMzVmNTg5ZWI3M2YxYmEyMzFkYWQxM2Q1YzY1Y2U0OGVlYjJkNjI2MjgxNDIxMTg0MmRmMzkxY2JjNDRiZWJjNmUwMDBjMjIiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL21hcnNoYWwtdjAuOC4xIjogewogICAgICAibmFtZSI6ICJAZW5kby9tYXJzaGFsIiwKICAgICAgImxhYmVsIjogIkBlbmRvL21hcnNoYWwtdjAuOC4xIiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL21hcnNoYWwtdjAuOC4xIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZXZlbnR1YWwtc2VuZCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2LjgiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3NyYy9uby1zaGltLmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9uYXQtdjQuMS4yNCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL25hdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vbmF0LXY0LjEuMjQiLAogICAgICAgICAgIm1vZHVsZSI6ICIuL3BhY2thZ2UuanNvbiIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdCI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJAZW5kby9wcm9taXNlLWtpdC9wYWNrYWdlLmpzb24iOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vcGFja2FnZS5qc29uIgogICAgICAgIH0sCiAgICAgICAgIkBlbmRvL3Byb21pc2Uta2l0L3NoaW0uanMiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc2hpbS5qcyIKICAgICAgICB9LAogICAgICAgICIuL2luZGV4LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogImluZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiZDljZWYzNmEyMTcxNTAwOGFiYTVlOTI5NjUzZjI3MjA4YzY2YmI3OThmNDBjYjZkMzMyZGZlNDM5ZGRhY2FkYzU2MjJkNWMwMDhmNzY1NzI0MjE3MTIwOTY3Y2JlOTI0ODBmZjM1NjZmMWQ5MmMyMWRiOGNhNmY4ZTBmOWRmMjEiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9kZWVwbHlGdWxmaWxsZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI0MzhhMDJiZGRmNmVkYTVmODlkYzE3OTI0OTNiZWYzMDVkMGM4Njk5ZmE1Y2QxYTVkNGVmZDk4MzZmYzRlOWY1ZWIyZGRkODZmMTNjYzFiNDY3MTQ0MjNlOGY4YTU5ZGEyZTAwM2QzODJlNWU4NWEwYjczNzlmN2FjMWIzYzBiOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvZW5jb2RlUGFzc2FibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlYTAwNGJhYzBlN2UwYTIyYTc2ZDllMzlhYTAwZDc3OTNhNzlmZGVhYjYzYzBlZmM1ZmNkYjY4ZDgxZGQ5NDdjZGY4ZGUwYjBlMWMxM2VjNWVmMjRiMzk1ODhhMmJiM2E3ZjRmZjQ4OTEyMmY5YWQ5Y2NkODc0MmQzYjRlMTI2YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2VuY29kZVRvQ2FwRGF0YS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjgyM2NlOWY2MDExZDI1MTE0YWZmZGRjN2ZjY2MyOTc3ZWJjMTUzNDcwNzBmNjIzZWRjZTU2NDczNjQ3Y2IwOTRmY2IxN2RiODMwZTY5NDgzYTYxN2YxZjNiYTdkYzFhM2Q5NThjOTk4YTE3MmI2ODAxMWM2MzRkYjIxZWNhNWE0IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2VuY29kZVRvU21hbGxjYXBzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjViODVkYmU0Y2Q1OTdkYjI4NWFhZDUyNGUyMTRjYzlhOTM2NTFkZjNkODc4OTAwZWNjYTY5ODdjOTAxZjY4NTE4N2VjNWE5ZTI2MWY4N2M2MTFlZWI3ZmFiYzg1NTM2MzI5NTMwNmU5YjUzZjFkOTdmNGY2YjAyZTRiYmQzM2U4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2hlbHBlcnMvY29weUFycmF5LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9oZWxwZXJzL2NvcHlBcnJheS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImYyZWQzOTM4ZjFlYzE4MDk2MWY5NjExZDgzMzQyNjdiMjg5ZjlmN2FjMjE3ZGE1NTYxOTBlNzU3ZDg1ZWM4YzVmYjk4MWM4NWM1NWVkNjdhNjg2YmY1ZmE1MjA1MzA2YWNlNTc2OWE5MmU4ZjdhZWYxOGY1MWE1MDAzYzE0ZDRlIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2hlbHBlcnMvY29weVJlY29yZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaGVscGVycy9jb3B5UmVjb3JkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMTI3YmJkZTY5YTY4NTg2Njc2YTUxMTJmNTQyZTc5N2Y1ODAzZGZhZDU4MmE2NmUwY2Q2MTQ1OTg4NDk1NDM5MzhmMWE4OTFiNjhlNDU5ODFkMTIyMjI4NTU4YTZkMDliNjdlYWFhNGVmMmJjMzBiYjI4Yjc4MGU4MWFmNjEyNWYiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaGVscGVycy9lcnJvci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaGVscGVycy9lcnJvci5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjgxZmZhODhhNjYxYmNkOTE3NDljMWI0ZGY1ZWE4ZjJhN2Y4YzUzNDhiN2Q4NGVhYjMzYzQwNmQ1NjY5MjZlYjhjZDY1ZDQ2MGYyMTA4OWZmZWZhOTM0Y2Q3NDUwYTc4MzYwMjc3NGFjNzBlNjUzYTQxNTE5MWQxYjMxNmE5NWJiIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2hlbHBlcnMvaXRlci1oZWxwZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9oZWxwZXJzL2l0ZXItaGVscGVycy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjJkMTExZjFiNmMxODllNTIwYWNlMzVlZDhlMGJiYTZhYTZkMjA3ZWU4NzgxZjZhNzY5ODgxM2Q1NjFjN2VjOWFkZmEyY2NiZjRmOGZhNTIxNzc1ZWQyYTIxMGM0NDdlMDE3NGI3YTM2ZThmZmJkMGYwZWM3NzcyN2NkZDFjODIwIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI3NGUyMDYyNjMwMjc2ZmViMzUxZDFjZDQzNzMyNDMyMGVkZDA5YjllM2IyNzdiNTI3ODc3OWU1MTdjOTVmMDY4ZjZmYzMxMzhhYTgyNzkwODIwYThmZDM4OTkwNzUzYzZlMmQyZTQ0NjU5ZGQ4ZTIyZTNlMzgxMmE1OGM3MzRkMiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9oZWxwZXJzL3JlbW90YWJsZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaGVscGVycy9yZW1vdGFibGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwY2I1MzJjYmUzMjZmODZlYjRjY2QzNTI5OTEyYmFlNTU0OTIyNDhhNDU1ODlhODA3MDcyYzVjMzg0YmY0NzRjNGQ2ZTE5MGRhNDMzZjU2YmJiMjBjYTYzNmQ2MjZiNmMwYWNhNDU3NjZkY2IyZTFkNjc5OWVhOTQ1OTU1ODYwOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9oZWxwZXJzL3NhZmUtcHJvbWlzZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaGVscGVycy9zYWZlLXByb21pc2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJkYTkyM2M3ODgxZGU2MDExMGNhYTkzZTZkZjlkMGQ0Zjc1YmQ1MGY5MGIzNWM4MjNiZjNmYThlNTE3NzA5MmUzYzcxMjc5ZjkzZGRmMjUxMTY2MmU0OTYzYmVjNzJjNGU5NThhNTIyNGIyZjc2N2Q0MWU0Y2RjMWMwYmI1ZDE4NiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9oZWxwZXJzL3N5bWJvbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaGVscGVycy9zeW1ib2wuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJiY2YxNzc2MTJmZDcyZWNhMGUzZTVjY2UxODk0Y2Q0Yjg0MGFkYzM0NDU4MDg5N2Y5NzA2MmQyNzhmMDU0YzdiNzMwNDVmNTQ0YjgzN2Q0NGEzOGE3ODVhOTgyM2Y1NjE3ZWFhMzA4NzgyYjljMmFmYjE4MGUzMGUwMDU5OTMzZiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9oZWxwZXJzL3RhZ2dlZC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvaGVscGVycy90YWdnZWQuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwNTkwZjMyZGEzZWYzYzM1NjYyNDAxMjBmNTYyZjU2ZjAyYTdhNDVhN2QyYzhmYTAxZDZmMjZhNDFhNTcxZDVkM2M1NDgxMzFmMDkxMWRhYjZjNTVmMzU2NzNiNjJkYTk0ODJkNDkxZDNjY2MyMDQwMGFmNjZjYTJhMjNiZjZiOSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlLWZhci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFrZS1mYXIuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIwZDI5YTY4ZmQyZDQ5NzE3NTZkY2FkMzQ3YWE1YmYxMjRkMmQ3ZjRjZmJmN2ViNTVjMjNjOTY0OTgwNGFkYzIxOGFlMzA4MGNkMTI0MGNjM2FmMWY3ZmMwNGY1YzMwNjIyNDA2YTVjMWMxZjFmNzA4NGQyN2RkMmU1OTk2YmY1MyIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tYWtlVGFnZ2VkLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9tYWtlVGFnZ2VkLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzBiZTZhYTI3YTBhNmIxMmQ4NjY3ODU5MTAxOGQxMmU5Yzg4MWE3NGZlZDNkZGNlMWU3NzMzZTI5OTgzNTY2MDA1MmRkNDJkOTZmNjVhNGJkNTY2YjJhMWZlOGUyYWVmNWVkNTNmYjQ5MDUwYjc5OTQ1OWI3NDZkNDY3NTI2MGUiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC1qdXN0aW4uanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwtanVzdGluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMzczYmMxMTAxYTVkMWUxODYzOGM2OTRmZWE2ZTA3ZTEyZjAwMWM2YjQ0N2FkMzEwYTVmMTFkNjNmZTU4YjE1OTQ4MzdiOWQ0OWE3OGYzZDJhYzNjOTk4ZTA4NGQ5N2U3MDNhMzJlMDliMjY2ZGM1YzI5MmM2MmRkM2NjZTVlNDgiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiODVkNjM2YWNmODllM2MwZDA4N2NmMTU0YmQ0MzQ3NmQ5ODYwZmZjNTJkNzlmMWMyOWZkM2M4NmVjYmU4NjBkZjZiYzYyMjhhNDNjYTM4YTNkNzZkOTdkMTU1MDk0YTg5NzY5OWNkNGY3YWE0ZDJjNWViMmUyMmE2N2U1ZDJkYTciCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFyc2hhbC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFyc2hhbC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjM0Y2EwZTFkYTVmNGY4M2ZiZmNkNTliM2I3YTg4YmVkZDU5NThjZWE2ZjZjM2M4MjdlNzc0OWUxZTMxYTkxNjMwNmM4OGZjNzE4ZTJjZDQ2MDI0YjRjZTE1ZjNjN2E0MWNhY2ZlZmRhYTA5ZTM0M2VmMjkyYmJhNjQ5MjJkNTg3IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Bhc3NTdHlsZU9mLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wYXNzU3R5bGVPZi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImExZjBkZmQ1ZTk5Mzc2NjJjMjdlMTk0YWM1OWE5OGNlZTIyZDRkOTg4ZGFjNTE4ZjhiNmM2OWI2MjJhYTFmODU2MTU2ZWI3NmUxNGJjM2M0M2ZlYTNkMGQxOGI4YmU5YTdiZGNjZTc5NDYwZDU4ZTkzNjBkMTU2MThiZDFkMWVhIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JhbmtPcmRlci5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmFua09yZGVyLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMGE1NTQxZDkzMWU2NDI3YWJkZjBkMTNhODdkNjc3MzQzMmQ1NGMzMWQ5NTIwMzljNjQ3ZjBiYTlmZjJmOWY1NjQ3MzM0OTA4Yzk2ZWIwNDE2MGE1YjQzOGJjYzg0NTU2ZTUyMzI5ZWZjMThhYmMxNzM3MjczZTY5MjJlMWI3ZjAiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvdHlwZUd1YXJkcy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvdHlwZUd1YXJkcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImI1ODM5N2U4NmI0NjBjMGQ2MmQ3ODk4ZjljMzhhOTAzNDljMTJmYmI0NmQzY2ExMmQwZTgzZjg2YzM4ZTg2MDg5Njc4M2EyN2IzMzRhMzE0ODhlYzRkZmRjYjVjYjBkYWI0YzVhNTg5M2U0NDFjNzEwODhjMTliYTQ0MTczMzI4IgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU2N2VmMWIxYjE2MmQwMjhhZDQ5MzgyOGNlM2VkNDUwOTM4ZDBiZmZkNGY4Y2VlMWQ3NjE4ZDU5OTcwOWFjZmM0YjkyNWUwMzc5NWU4NjFkN2RiYjliODlmMDE0N2VlYzJiMjFmMTk0NGY3YTkyOTcwMzU1NTAyNWY4NjI4N2U2IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJAZW5kby9uYXQtdjQuMS4yNCI6IHsKICAgICAgIm5hbWUiOiAiQGVuZG8vbmF0IiwKICAgICAgImxhYmVsIjogIkBlbmRvL25hdC12NC4xLjI0IiwKICAgICAgImxvY2F0aW9uIjogIkBlbmRvL25hdC12NC4xLjI0IiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvaW5kZXguanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2luZGV4LmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiNWNkNjc5Mjg3NTAwMWRlZGRhNTUxY2U5MjRlZjFhM2UyZDA2M2Q1Zjc3NmZjM2FkZjQ3NDJkMzM2MjJkNDUxYzU0NTUzNDY2ZWM4ZGY0MjhlMWU3M2JiMGQyNzQyMzIxNmU0MzlhYjE2ODUzNDk4M2E4OGU5MzhlOTRkOTFmMzQiCiAgICAgICAgfQogICAgICB9CiAgICB9LAogICAgIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiOiB7CiAgICAgICJuYW1lIjogIkBlbmRvL3Byb21pc2Uta2l0IiwKICAgICAgImxhYmVsIjogIkBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIiLAogICAgICAibG9jYXRpb24iOiAiQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41MiIsCiAgICAgICJtb2R1bGVzIjogewogICAgICAgICJAYWdvcmljL2ludGVyLXByb3RvY29sIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMSIsCiAgICAgICAgICAibW9kdWxlIjogIi4vc3JjL2luZGV4LmpzIgogICAgICAgIH0sCiAgICAgICAgInNlcyI6IHsKICAgICAgICAgICJjb21wYXJ0bWVudCI6ICJzZXMtdjAuMTguMCIsCiAgICAgICAgICAibW9kdWxlIjogIi4vaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAic2VzL2xvY2tkb3duIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9pbmRleC5qcyIKICAgICAgICB9LAogICAgICAgICJzZXMvcGFja2FnZS5qc29uIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogInNlcy12MC4xOC4wIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9wYWNrYWdlLmpzb24iCiAgICAgICAgfSwKICAgICAgICAiLi9pbmRleC5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJpbmRleC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjkyZmY5OGQ1MmVkZGYzOThjZjk2YWNiMTA1OWJlZDAyN2Y0ODZlNWJkZDcxYzA1NzZiMjhhZmEyMTE5ZGE2Yjg0MWMzODlkMDJiMzMxMDdkOGFiYTBhZWU0OTI1ZTYzZmI3YzM1OGE2YTQ1ZmE0YWMxYWU3NzY1ODAyMDU2YWIzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL2lzLXByb21pc2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL2lzLXByb21pc2UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICJlYWZhYjE5Y2I5ZDczMjM3YmI2YzVmNTY4ZTU3ODY3NTFhN2FlZWY5NjYzZjJhMzBjNGI4ZjQ2NWUyMDEzOWYzZGEzNDZlYjJlNDEwMzg2ZjJkOTkyOWRmMzNjNTBmYThmMjQzNzMzZDc0ZjhiMGNmYzljOGI5ZjMxOGM0YWMwZSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9tZW1vLXJhY2UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL21lbW8tcmFjZS5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjZlZGI2ZThhZjFjYzkxYzY2MzJhYjI2ZTU4NjkwOGM5N2NhNmYyNmM5N2VhZTEzNjZjMGYwNTc3OTc5MTEzYjE1YzViYTRiMzQzZDUxOWE5ZWQwNWRjZmMyMTA3OTAxNDhkN2E3YzY5ZDllNjYyNDQ2N2I2NTlkMGM2ZTI5MTMzIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3Byb21pc2UtZXhlY3V0b3Ita2l0LmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogImNjODNhM2EzZTk2ZTZjNTlmMTllZWY1OWY3ZTQxN2RiNzViZjFlNmQxZGM3NmFhZGRkMmJlNDYzZTVmNGU0NzkyOWNjMWNiYjMzZjkxY2FiODZjMTc5NGY1Zjg0MDNiYzQ3ZTMzZTI2ZDExODYwM2M3ZDA1MjgxZjQ1MTdhNGFjIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3R5cGVzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy90eXBlcy5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjU2N2VmMWIxYjE2MmQwMjhhZDQ5MzgyOGNlM2VkNDUwOTM4ZDBiZmZkNGY4Y2VlMWQ3NjE4ZDU5OTcwOWFjZmM0YjkyNWUwMzc5NWU4NjFkN2RiYjliODlmMDE0N2VlYzJiMjFmMTk0NGY3YTkyOTcwMzU1NTAyNWY4NjI4N2U2IgogICAgICAgIH0KICAgICAgfQogICAgfSwKICAgICJqZXNzaWUuanMtdjAuMy4yIjogewogICAgICAibmFtZSI6ICJqZXNzaWUuanMiLAogICAgICAibGFiZWwiOiAiamVzc2llLmpzLXYwLjMuMiIsCiAgICAgICJsb2NhdGlvbiI6ICJqZXNzaWUuanMtdjAuMy4yIiwKICAgICAgIm1vZHVsZXMiOiB7CiAgICAgICAgIkBhZ29yaWMvaW50ZXItcHJvdG9jb2wiOiB7CiAgICAgICAgICAiY29tcGFydG1lbnQiOiAiQGFnb3JpYy9pbnRlci1wcm90b2NvbC12MC4xMy4xIiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiQGVuZG8vZmFyIjogewogICAgICAgICAgImNvbXBhcnRtZW50IjogIkBlbmRvL2Zhci12MC4yLjE0IiwKICAgICAgICAgICJtb2R1bGUiOiAiLi9zcmMvaW5kZXguanMiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvbWFpbi5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvbWFpbi5qcyIsCiAgICAgICAgICAicGFyc2VyIjogInByZS1tanMtanNvbiIsCiAgICAgICAgICAic2hhNTEyIjogIjg4MzkwZTg4OTQ1ZGY3NmZjYzY5YTE5ODM1YzY3NjlkOTcyZjVhY2IzNjM0ODdmMGIwYjk1NDBkYzhlNDZjMGI2Njc3NjEzZjZlNDkyNGZhYjM4Zjc5YmZiMGY2NDIzMTlmYjQ0ODEzNjNkN2M3NmRlNjU2NTJiYjNjYzIyYTcxIgogICAgICAgIH0sCiAgICAgICAgIi4vc3JjL3JpbmcwL0UuanMiOiB7CiAgICAgICAgICAibG9jYXRpb24iOiAic3JjL3JpbmcwL0UuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyNDlkNzBlZDAxZDRjNDI0ODJkZmY1ZmMxNmRlNjY4YzgwNjFkMDU4OTQ4NjIyNjE3OTY3MDhlZGIwNGEzM2I0MmY3YWJkMzQ2ZmVhMGQwNjc0ZDY5ODg1MWEzNzk0YzE2NGUzNTM0ZDc2ZGFmN2MwZWEzODk2YTNiYjA5OWIzNiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMC9hc3luYy1nZW5lcmF0ZS5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzAvYXN5bmMtZ2VuZXJhdGUuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5NDlkNWFiNTdlNjk4YjM2ZGJkOGE5NzMzNmZjZTBjNTRhMGJlN2JmNjI3ZGJiMmM2OTI5NzgzM2QxOGIxZTU1ZmIxNmU2ZTNhNTExNDMxODE0MTI5YWU3NmIzOWQ4MWI5NmRjNWUxMTg2ZmJjN2U1NTg2YjkwNDk3MGU1Mzc5YSIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMC9tYWluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMC9tYWluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiMDEwOTk1NzFmMDM2MTc2NDg2ODM2ZDBkMjkzMzc5NjgwMDIwNTA5MTM2N2IxYjczMDBiN2UwZDUyZmRmNTA2MjkwMjYyZGQ5NzlmNjg2OGFjMWE0NmM3MTljOWYyNDk2OWU0ODVkNTFiY2Q2MTI2M2JmMGE0YjcyY2JkYmMxMmQiCiAgICAgICAgfSwKICAgICAgICAiLi9zcmMvcmluZzAvbWFrZXJzLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMC9tYWtlcnMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICI5ODRjZTk2NmM4MjJhMDIxZjhjZWMwY2U5MTFlYTc1NGJiY2RmZGQ3ZDlkMmFhZjgyNmVjZWMzZTUxNTU5MWI3MWY2NWJiMDZhNmIzODBiM2U3MzZlMjY0MDI2OGYwNWE1NDNjYTE3N2E1ZWZmZmM3ZGE0YWU4OWNiNGRlNGZkYiIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMS9hc3luYy10b29scy5qcyI6IHsKICAgICAgICAgICJsb2NhdGlvbiI6ICJzcmMvcmluZzEvYXN5bmMtdG9vbHMuanMiLAogICAgICAgICAgInBhcnNlciI6ICJwcmUtbWpzLWpzb24iLAogICAgICAgICAgInNoYTUxMiI6ICIyZDE2NDE1ODg3NWMyNjQ0ZjZkOTRlNGU2YWNmOTY2MjljMTRkYTA2MTIyMDliMjAwMmYxYjVlYjQyODM3NzIyMmM3MTQzNTg5ODk2ZWM5MGYzOGIxNzhkMzU0MDA3MGQ3Y2MwN2NjNTE4ZjFlYWQ2OWMxMzk1ODA2NjViYTQ0ZCIKICAgICAgICB9LAogICAgICAgICIuL3NyYy9yaW5nMS9tYWluLmpzIjogewogICAgICAgICAgImxvY2F0aW9uIjogInNyYy9yaW5nMS9tYWluLmpzIiwKICAgICAgICAgICJwYXJzZXIiOiAicHJlLW1qcy1qc29uIiwKICAgICAgICAgICJzaGE1MTIiOiAiY2YxN2Q1ZjRhNDE5NjhlZmE3ZTcxOTA0MmEyZmQ1Mzk0OGFmYmZmZDg2MDhhMzQ5M2Y5ZWExYjg4YjJiMGU5YTNiMTc2MWU3M2Y0MmMzMDQxM2VkMzE1NThiN2Q5MTEyMjU3YzViNzhkNzZiNDQ2OGJiYTI3OTcxNmQ5NjliMTMiCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQp9UEsDBAoAAAAAAAAAAACIQxfCLgsAAC4LAAAjAAAAQGFnb3JpYy9hc3NlcnQtdjAuNS4xL3NyYy9hc3NlcnQuanN7ImltcG9ydHMiOlsiLi90eXBlcy5qcyJdLCJleHBvcnRzIjpbIkZhaWwiLCJOb25OdWxsaXNoIiwiYW4iLCJhc3NlcnQiLCJkZXRhaWxzIiwiaWRlbnRDaGVja2VyIiwibWFrZUFzc2VydCIsInEiLCJxdW90ZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vdHlwZXMuanNcIiwgW11dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KGFuLCAnbmFtZScsIHt2YWx1ZTogXCJhblwifSk7JGjigI1fb25jZS5hbihhbik7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5DaGVja2VyfSBDaGVja2VyICovXG5cbmNvbnN0e2ZyZWV6ZX09T2JqZWN0O1xuXG4vKiogQHR5cGUge0Fzc2VydH0gKi9cbmNvbnN0IGdsb2JhbEFzc2VydD1nbG9iYWxUaGlzLmFzc2VydDskaOKAjV9vbmNlLmdsb2JhbEFzc2VydChnbG9iYWxBc3NlcnQpO1xuXG5pZihnbG9iYWxBc3NlcnQ9PT11bmRlZmluZWQpe1xudGhyb3cgbmV3IEVycm9yKFxuIGBDYW5ub3QgaW5pdGlhbGl6ZSBAYWdvcmljL2Fzc2VydCwgbWlzc2luZyBnbG9iYWxUaGlzLmFzc2VydCwgaW1wb3J0ICdzZXMnIGJlZm9yZSAnQGFnb3JpYy9hc3NlcnQnYCk7XG5cbiB9XG5cbmNvbnN0IG1pc3Npbmc9LyoqIEB0eXBlIHtjb25zdH0gKi9bXG4nZmFpbCcsXG4nZXF1YWwnLFxuJ3R5cGVvZicsXG4nc3RyaW5nJyxcbidub3RlJyxcbidkZXRhaWxzJyxcbidGYWlsJyxcbidxdW90ZScsXG4nbWFrZUFzc2VydCddLlxuZmlsdGVyKChuYW1lKT0+Z2xvYmFsQXNzZXJ0W25hbWVdPT09dW5kZWZpbmVkKTtcbmlmKG1pc3NpbmcubGVuZ3RoPjApe1xudGhyb3cgbmV3IEVycm9yKFxuIGBDYW5ub3QgaW5pdGlhbGl6ZSBAYWdvcmljL2Fzc2VydCwgbWlzc2luZyBnbG9iYWxUaGlzLmFzc2VydCBtZXRob2RzICR7bWlzc2luZy5qb2luKFxuJywgJylcbiB9YCk7XG5cbiB9XG5cbmNvbnN0e2RldGFpbHMsRmFpbCxxdW90ZSxtYWtlQXNzZXJ0fT1nbG9iYWxBc3NlcnQ7JGjigI1fb25jZS5kZXRhaWxzKGRldGFpbHMpOyRo4oCNX29uY2UuRmFpbChGYWlsKTskaOKAjV9vbmNlLnF1b3RlKHF1b3RlKTskaOKAjV9vbmNlLm1ha2VBc3NlcnQobWFrZUFzc2VydCk7XG5cblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1QgfCBudWxsIHwgdW5kZWZpbmVkfSB2YWxcbiAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0RGV0YWlsc11cbiAqIEByZXR1cm5zIHtUfVxuICovXG5jb25zdCAgICAgICAgTm9uTnVsbGlzaD0odmFsLG9wdERldGFpbHM9IGB1bmV4cGVjdGVkICR7cXVvdGUodmFsKX1gKT0+e1xuaWYodmFsIT1udWxsKXtcbi8qIFRoaXMgYCE9IG51bGxgIGlkaW9tIGNoZWNrcyB0aGF0IGB2YWxgIGlzIG5laXRoZXIgYG51bGxgIG5vciBgdW5kZWZpbmVkYC4qL1xucmV0dXJuIHZhbDtcbiB9XG5hc3NlcnQuZmFpbChvcHREZXRhaWxzKTtcbiB9OyRo4oCNX29uY2UuTm9uTnVsbGlzaChOb25OdWxsaXNoKTtcbmhhcmRlbihOb25OdWxsaXNoKTtcblxuLyoqXG4gKiBQcmVwZW5kIHRoZSBjb3JyZWN0IGluZGVmaW5pdGUgYXJ0aWNsZSBvbnRvIGEgbm91biwgdHlwaWNhbGx5IGEgdHlwZW9mIHJlc3VsdFxuICogZS5nLiwgXCJhbiBPYmplY3RcIiB2cy4gXCJhIE51bWJlclwiXG4gKlxuICogQGRlcHJlY2F0ZWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgVGhlIG5vdW4gdG8gcHJlcGVuZFxuICogQHJldHVybnMge3N0cmluZ30gVGhlIG5vdW4gcHJlcGVuZGVkIHdpdGggYS9hblxuICovXG5mdW5jdGlvbiBhbihzdHIpe1xuc3RyPSBgJHtzdHJ9YDtcbmlmKHN0ci5sZW5ndGg+PTEmJidhZWlvdUFFSU9VJy5pbmNsdWRlcyhzdHJbMF0pKXtcbnJldHVybiBgYW4gJHtzdHJ9YDtcbiB9XG5yZXR1cm4gYGEgJHtzdHJ9YDtcbiB9XG5mcmVlemUoYW4pO1xuXG5cbi8qKlxuICogSW4gdGhlIGBhc3NlcnRGb29gL2Bpc0Zvb2AvYGNoZWNrRm9vYCBwYXR0ZXJuLCBgY2hlY2tGb29gIGhhcyBhIGBjaGVja2BcbiAqIHBhcmFtZXRlciBvZiB0eXBlIGBDaGVja2VyYC4gYGFzc2VydEZvb2AgY2FsbHMgYGNoZWNrRm9vYCBwYXNzZXNcbiAqIGBhc3NlcnRDaGVja2VyYCBhcyB0aGUgYGNoZWNrYCBhcmd1bWVudC4gYGlzRm9vYCBwYXNzZXMgYGlkZW50Q2hlY2tlcmBcbiAqIGFzIHRoZSBgY2hlY2tgIGFyZ3VtZW50LiBgaWRlbnRDaGVja2VyYCBhY3RzIHByZWNpc2VseSBsaWtlIGFuXG4gKiBpZGVudGl0eSBmdW5jdGlvbiwgYnV0IGlzIHR5cGVkIGFzIGEgYENoZWNrZXJgIHRvIGluZGljYXRlIGl0c1xuICogaW50ZW5kZWQgdXNlLlxuICpcbiAqIEB0eXBlIHtDaGVja2VyfVxuICovXG5jb25zdCAgICAgICAgaWRlbnRDaGVja2VyPShjb25kLF9kZXRhaWxzKT0+Y29uZDskaOKAjV9vbmNlLmlkZW50Q2hlY2tlcihpZGVudENoZWNrZXIpO1xuaGFyZGVuKGlkZW50Q2hlY2tlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiYXNzZXJ0IjpbImdsb2JhbEFzc2VydCJdLCJkZXRhaWxzIjpbImRldGFpbHMiXSwiRmFpbCI6WyJGYWlsIl0sInF1b3RlIjpbInF1b3RlIl0sInEiOlsicXVvdGUiXSwibWFrZUFzc2VydCI6WyJtYWtlQXNzZXJ0Il0sImFuIjpbImFuIl0sIk5vbk51bGxpc2giOlsiTm9uTnVsbGlzaCJdLCJpZGVudENoZWNrZXIiOlsiaWRlbnRDaGVja2VyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAPpI5TFLgAAxS4AACIAAABAYWdvcmljL2Fzc2VydC12MC41LjEvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cbi8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbi8qIEJhc2VkIG9uKi9cbi8qIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9ibG9iL0hFQUQvcGFja2FnZXMvc2VzL3NyYy9lcnJvci90eXBlcy5qcyovXG4vKiBDb29yZGluYXRlIGVkaXRzIHVudGlsIHdlIHJlZmFjdG9yIHRvIGF2b2lkIHRoaXMgZHVwbGljYXRpb24qL1xuLyogQXQgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8yNzc0Ki9cbi8qIGlzIGEgcmVjb3JkIG9mIGEgZmFpbGVkIGF0dGVtcHQgdG8gcmVtb3ZlIHRoaXMgZHVwbGljYXRpb24uKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQmFzZUFzc2VydFxuICogVGhlIGBhc3NlcnRgIGZ1bmN0aW9uIGl0c2VsZi5cbiAqXG4gKiBAcGFyYW0geyp9IGZsYWcgVGhlIHRydXRoeS9mYWxzeSB2YWx1ZVxuICogQHBhcmFtIHtEZXRhaWxzfSBbb3B0RGV0YWlsc10gVGhlIGRldGFpbHMgdG8gdGhyb3dcbiAqIEBwYXJhbSB7RXJyb3JDb25zdHJ1Y3Rvcn0gW0Vycm9yQ29uc3RydWN0b3JdIEFuIG9wdGlvbmFsIGFsdGVybmF0ZSBlcnJvclxuICogY29uc3RydWN0b3IgdG8gdXNlLlxuICogQHJldHVybnMge2Fzc2VydHMgZmxhZ31cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFzc2VydE1ha2VFcnJvck9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbZXJyb3JOYW1lXVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydE1ha2VFcnJvclxuICpcbiAqIFRoZSBgYXNzZXJ0LmVycm9yYCBtZXRob2QsIHJlY29yZGluZyBkZXRhaWxzIGZvciB0aGUgY29uc29sZS5cbiAqXG4gKiBUaGUgb3B0aW9uYWwgYG9wdERldGFpbHNgIGNhbiBiZSBhIHN0cmluZy5cbiAqIEBwYXJhbSB7RGV0YWlsc30gW29wdERldGFpbHNdIFRoZSBkZXRhaWxzIG9mIHdoYXQgd2FzIGFzc2VydGVkXG4gKiBAcGFyYW0ge0Vycm9yQ29uc3RydWN0b3J9IFtFcnJvckNvbnN0cnVjdG9yXSBBbiBvcHRpb25hbCBhbHRlcm5hdGUgZXJyb3JcbiAqIGNvbnN0cnVjdG9yIHRvIHVzZS5cbiAqIEBwYXJhbSB7QXNzZXJ0TWFrZUVycm9yT3B0aW9uc30gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7RXJyb3J9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0RmFpbFxuICpcbiAqIFRoZSBgYXNzZXJ0LmZhaWxgIG1ldGhvZC5cbiAqXG4gKiBGYWlsIGFuIGFzc2VydGlvbiwgcmVjb3JkaW5nIGZ1bGwgZGV0YWlscyB0byB0aGUgY29uc29sZSBhbmRcbiAqIHJhaXNpbmcgYW4gZXhjZXB0aW9uIHdpdGggYSBtZXNzYWdlIGluIHdoaWNoIGBkZXRhaWxzYCBzdWJzdGl0dXRpb24gdmFsdWVzXG4gKiBoYXZlIGJlZW4gbWFza2VkLlxuICpcbiAqIFRoZSBvcHRpb25hbCBgb3B0RGV0YWlsc2AgY2FuIGJlIGEgc3RyaW5nIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICogd2l0aCB0aGUgbm9kZWpzIGFzc2VydGlvbiBsaWJyYXJ5LlxuICogQHBhcmFtIHtEZXRhaWxzfSBbb3B0RGV0YWlsc10gVGhlIGRldGFpbHMgb2Ygd2hhdCB3YXMgYXNzZXJ0ZWRcbiAqIEBwYXJhbSB7RXJyb3JDb25zdHJ1Y3Rvcn0gW0Vycm9yQ29uc3RydWN0b3JdIEFuIG9wdGlvbmFsIGFsdGVybmF0ZSBlcnJvclxuICogY29uc3RydWN0b3IgdG8gdXNlLlxuICogQHJldHVybnMge25ldmVyfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydEVxdWFsXG4gKiBUaGUgYGFzc2VydC5lcXVhbGAgbWV0aG9kXG4gKlxuICogQXNzZXJ0IHRoYXQgdHdvIHZhbHVlcyBtdXN0IGJlIGBPYmplY3QuaXNgLlxuICogQHBhcmFtIHsqfSBhY3R1YWwgVGhlIHZhbHVlIHdlIHJlY2VpdmVkXG4gKiBAcGFyYW0geyp9IGV4cGVjdGVkIFdoYXQgd2Ugd2FudGVkXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXSBUaGUgZGV0YWlscyB0byB0aHJvd1xuICogQHBhcmFtIHtFcnJvckNvbnN0cnVjdG9yfSBbRXJyb3JDb25zdHJ1Y3Rvcl0gQW4gb3B0aW9uYWwgYWx0ZXJuYXRlIGVycm9yXG4gKiBjb25zdHJ1Y3RvciB0byB1c2UuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuXG4vKiBUeXBlIGFsbCB0aGUgb3ZlcmxvYWRzIG9mIHRoZSBhc3NlcnRUeXBlb2YgZnVuY3Rpb24uKi9cbi8qIFRoZXJlIG1heSBldmVudHVhbGx5IGJlIGEgYmV0dGVyIHdheSB0byBkbyB0aGlzLCBidXQqL1xuLyogdGhlbXMgdGhlIGJyZWFrcyB3aXRoIFR5cGVzY3JpcHQgNC4wLiovXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRUeXBlb2ZCaWdpbnRcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHsnYmlnaW50J30gdHlwZW5hbWVcbiAqIEBwYXJhbSB7RGV0YWlsc30gW29wdERldGFpbHNdXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBiaWdpbnR9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mQm9vbGVhblxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydib29sZWFuJ30gdHlwZW5hbWVcbiAqIEBwYXJhbSB7RGV0YWlsc30gW29wdERldGFpbHNdXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBib29sZWFufVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZkZ1bmN0aW9uXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J2Z1bmN0aW9uJ30gdHlwZW5hbWVcbiAqIEBwYXJhbSB7RGV0YWlsc30gW29wdERldGFpbHNdXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBGdW5jdGlvbn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRUeXBlb2ZOdW1iZXJcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHsnbnVtYmVyJ30gdHlwZW5hbWVcbiAqIEBwYXJhbSB7RGV0YWlsc30gW29wdERldGFpbHNdXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBudW1iZXJ9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mT2JqZWN0XG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J29iamVjdCd9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXVxuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgUmVjb3JkPGFueSwgYW55PiB8IG51bGx9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0VHlwZW9mU3RyaW5nXG4gKiBAcGFyYW0ge2FueX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7J3N0cmluZyd9IHR5cGVuYW1lXG4gKiBAcGFyYW0ge0RldGFpbHN9IFtvcHREZXRhaWxzXVxuICogQHJldHVybnMge2Fzc2VydHMgc3BlY2ltZW4gaXMgc3RyaW5nfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFR5cGVvZlN5bWJvbFxuICogQHBhcmFtIHthbnl9IHNwZWNpbWVuXG4gKiBAcGFyYW0geydzeW1ib2wnfSB0eXBlbmFtZVxuICogQHBhcmFtIHtEZXRhaWxzfSBbb3B0RGV0YWlsc11cbiAqIEByZXR1cm5zIHthc3NlcnRzIHNwZWNpbWVuIGlzIHN5bWJvbH1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRUeXBlb2ZVbmRlZmluZWRcbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lblxuICogQHBhcmFtIHsndW5kZWZpbmVkJ30gdHlwZW5hbWVcbiAqIEBwYXJhbSB7RGV0YWlsc30gW29wdERldGFpbHNdXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyB1bmRlZmluZWR9XG4gKi9cblxuLyoqXG4gKiBUaGUgYGFzc2VydC50eXBlb2ZgIG1ldGhvZFxuICpcbiAqIEB0eXBlZGVmIHtBc3NlcnRUeXBlb2ZCaWdpbnQgJiBBc3NlcnRUeXBlb2ZCb29sZWFuICYgQXNzZXJ0VHlwZW9mRnVuY3Rpb24gJiBBc3NlcnRUeXBlb2ZOdW1iZXIgJiBBc3NlcnRUeXBlb2ZPYmplY3QgJiBBc3NlcnRUeXBlb2ZTdHJpbmcgJiBBc3NlcnRUeXBlb2ZTeW1ib2wgJiBBc3NlcnRUeXBlb2ZVbmRlZmluZWR9IEFzc2VydFR5cGVvZlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFN0cmluZ1xuICogVGhlIGBhc3NlcnQuc3RyaW5nYCBtZXRob2QuXG4gKlxuICogYGFzc2VydC5zdHJpbmcodilgIGlzIGVxdWl2YWxlbnQgdG8gYGFzc2VydC50eXBlb2YodiwgJ3N0cmluZycpYC4gV2VcbiAqIHNwZWNpYWwgY2FzZSB0aGlzIG9uZSBiZWNhdXNlIGl0IGlzIHRoZSBtb3N0IGZyZXF1ZW50bHkgdXNlZC5cbiAqXG4gKiBBc3NlcnQgYW4gZXhwZWN0ZWQgdHlwZW9mIHJlc3VsdC5cbiAqIEBwYXJhbSB7YW55fSBzcGVjaW1lbiBUaGUgdmFsdWUgdG8gZ2V0IHRoZSB0eXBlb2ZcbiAqIEBwYXJhbSB7RGV0YWlsc30gW29wdERldGFpbHNdIFRoZSBkZXRhaWxzIHRvIHRocm93XG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBzcGVjaW1lbiBpcyBzdHJpbmd9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0Tm90ZVxuICogVGhlIGBhc3NlcnQubm90ZWAgbWV0aG9kLlxuICpcbiAqIEFubm90YXRlIGFuIGVycm9yIHdpdGggZGV0YWlscywgcG90ZW50aWFsbHkgdG8gYmUgdXNlZCBieSBhblxuICogYXVnbWVudGVkIGNvbnNvbGUgc3VjaCBhcyB0aGUgY2F1c2FsIGNvbnNvbGUgb2YgYGNvbnNvbGUuanNgLCB0b1xuICogcHJvdmlkZSBleHRyYSBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGggbG9nZ2VkIGVycm9ycy5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJvclxuICogQHBhcmFtIHtEZXRhaWxzfSBkZXRhaWxzTm90ZVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7fX0gRGV0YWlsc1Rva2VuXG4gKiBBIGNhbGwgdG8gdGhlIGBkZXRhaWxzYCB0ZW1wbGF0ZSBsaXRlcmFsIG1ha2VzIGFuZCByZXR1cm5zIGEgZnJlc2ggZGV0YWlsc1xuICogdG9rZW4sIHdoaWNoIGlzIGEgZnJvemVuIGVtcHR5IG9iamVjdCBhc3NvY2lhdGVkIHdpdGggdGhlIGFyZ3VtZW50cyBvZiB0aGF0XG4gKiBgZGV0YWlsc2AgdGVtcGxhdGUgbGl0ZXJhbCBleHByZXNzaW9uLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3N0cmluZyB8IERldGFpbHNUb2tlbn0gRGV0YWlsc1xuICogRWl0aGVyIGEgcGxhaW4gc3RyaW5nLCBvciBtYWRlIGJ5IHRoZSBgZGV0YWlsc2AgdGVtcGxhdGUgbGl0ZXJhbCB0YWcuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdHJpbmdhYmxlUGF5bG9hZFxuICogSG9sZHMgdGhlIHBheWxvYWQgcGFzc2VkIHRvIHF1b3RlIHNvIHRoYXQgaXRzIHByaW50ZWQgZm9ybSBpcyB2aXNpYmxlLlxuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmd9IHRvU3RyaW5nIEhvdyB0byBwcmludCB0aGUgcGF5bG9hZFxuICovXG5cbi8qKlxuICogVG8gXCJkZWNsYXNzaWZ5XCIgYW5kIHF1b3RlIGEgc3Vic3RpdHV0aW9uIHZhbHVlIHVzZWQgaW4gYVxuICogYGBgIGRldGFpbHNgLi4uYCBgYGAgdGVtcGxhdGUgbGl0ZXJhbCwgZW5jbG9zZSB0aGF0IHN1YnN0aXR1dGlvbiBleHByZXNzaW9uXG4gKiBpbiBhIGNhbGwgdG8gYHF1b3RlYC4gVGhpcyBtYWtlcyB0aGUgdmFsdWUgYXBwZWFyIHF1b3RlZFxuICogKGFzIGlmIHdpdGggYEpTT04uc3RyaW5naWZ5YCkgaW4gdGhlIG1lc3NhZ2Ugb2YgdGhlIHRocm93biBlcnJvci4gVGhlXG4gKiBwYXlsb2FkIGl0c2VsZiBpcyBzdGlsbCBwYXNzZWQgdW5xdW90ZWQgdG8gdGhlIGNvbnNvbGUgYXMgaXQgd291bGQgYmVcbiAqIHdpdGhvdXQgYHF1b3RlYC5cbiAqXG4gKiBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyB3aWxsIHJldmVhbCB0aGUgZXhwZWN0ZWQgc2t5IGNvbG9yLCBidXQgbm90IHRoZVxuICogYWN0dWFsIGluY29ycmVjdCBza3kgY29sb3IsIGluIHRoZSB0aHJvd24gZXJyb3IncyBtZXNzYWdlOlxuICogYGBganNcbiAqIHNreS5jb2xvciA9PT0gZXhwZWN0ZWRDb2xvciB8fCBGYWlsYCR7c2t5LmNvbG9yfSBzaG91bGQgYmUgJHtxdW90ZShleHBlY3RlZENvbG9yKX1gO1xuICogYGBgXG4gKlxuICogVGhlIG5vcm1hbCBjb252ZW50aW9uIGlzIHRvIGxvY2FsbHkgcmVuYW1lIGBkZXRhaWxzYCB0byBgWGAgYW5kIGBxdW90ZWAgdG8gYHFgXG4gKiBsaWtlIGBjb25zdCB7IGRldGFpbHM6IFgsIHF1b3RlOiBxIH0gPSBhc3NlcnQ7YCwgc28gdGhlIGFib3ZlIGV4YW1wbGUgd291bGQgdGhlbiBiZVxuICogYGBganNcbiAqIHNreS5jb2xvciA9PT0gZXhwZWN0ZWRDb2xvciB8fCBGYWlsYCR7c2t5LmNvbG9yfSBzaG91bGQgYmUgJHtxKGV4cGVjdGVkQ29sb3IpfWA7XG4gKiBgYGBcbiAqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0UXVvdGVcbiAqIEBwYXJhbSB7Kn0gcGF5bG9hZCBXaGF0IHRvIGRlY2xhc3NpZnlcbiAqIEBwYXJhbSB7KHN0cmluZ3xudW1iZXIpfSBbc3BhY2VzXVxuICogQHJldHVybnMge1N0cmluZ2FibGVQYXlsb2FkfSBUaGUgZGVjbGFzc2lmaWVkIHBheWxvYWRcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBSYWlzZVxuICpcbiAqIFRvIG1ha2UgYW4gYGFzc2VydGAgd2hpY2ggdGVybWluYXRlcyBzb21lIGxhcmdlciB1bml0IG9mIGNvbXB1dGF0aW9uXG4gKiBsaWtlIGEgdHJhbnNhY3Rpb24sIHZhdCwgb3IgcHJvY2VzcywgY2FsbCBgbWFrZUFzc2VydGAgd2l0aCBhIGBSYWlzZWBcbiAqIGNhbGxiYWNrLCB3aGVyZSB0aGF0IGNhbGxiYWNrIGFjdHVhbGx5IHBlcmZvcm1zIHRoYXQgbGFyZ2VyIHRlcm1pbmF0aW9uLlxuICogSWYgcG9zc2libGUsIHRoZSBjYWxsYmFjayBzaG91bGQgYWxzbyByZXBvcnQgaXRzIGByZWFzb25gIHBhcmFtZXRlciBhc1xuICogdGhlIGFsbGVnZWQgcmVhc29uIGZvciB0aGUgdGVybWluYXRpb24uXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gcmVhc29uXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTWFrZUFzc2VydFxuICpcbiAqIE1ha2VzIGFuZCByZXR1cm5zIGFuIGBhc3NlcnRgIGZ1bmN0aW9uIG9iamVjdCB0aGF0IHNoYXJlcyB0aGUgYm9va2tlZXBpbmdcbiAqIHN0YXRlIGRlZmluZWQgYnkgdGhpcyBtb2R1bGUgd2l0aCBvdGhlciBgYXNzZXJ0YCBmdW5jdGlvbiBvYmplY3RzIG1hZGUgYnlcbiAqIGBtYWtlQXNzZXJ0YC4gVGhpcyBzdGF0ZSBpcyBwZXItbW9kdWxlLWluc3RhbmNlIGFuZCBpcyBleHBvc2VkIGJ5IHRoZVxuICogYGxvZ2dlZEVycm9ySGFuZGxlcmAgYWJvdmUuIFdlIHJlZmVyIHRvIGBhc3NlcnRgIGFzIGEgXCJmdW5jdGlvbiBvYmplY3RcIlxuICogYmVjYXVzZSBpdCBjYW4gYmUgY2FsbGVkIGRpcmVjdGx5IGFzIGEgZnVuY3Rpb24sIGJ1dCBhbHNvIGhhcyBtZXRob2RzIHRoYXRcbiAqIGNhbiBiZSBjYWxsZWQuXG4gKlxuICogSWYgYG9wdFJhaXNlYCBpcyBwcm92aWRlZCwgdGhlIHJldHVybmVkIGBhc3NlcnRgIGZ1bmN0aW9uIG9iamVjdCB3aWxsIGNhbGxcbiAqIGBvcHRSYWlzZShyZWFzb24pYCBiZWZvcmUgdGhyb3dpbmcgdGhlIGVycm9yLiBUaGlzIGVuYWJsZXMgYG9wdFJhaXNlYCB0b1xuICogZW5nYWdlIGluIGV2ZW4gbW9yZSB2aW9sZW50IHRlcm1pbmF0aW9uIGJlaGF2aW9yLCBsaWtlIHRlcm1pbmF0aW5nIHRoZSB2YXQsXG4gKiB0aGF0IHByZXZlbnRzIGV4ZWN1dGlvbiBmcm9tIHJlYWNoaW5nIHRoZSBmb2xsb3dpbmcgdGhyb3cuIEhvd2V2ZXIsIGlmXG4gKiBgb3B0UmFpc2VgIHJldHVybnMgbm9ybWFsbHksIHdoaWNoIHdvdWxkIGJlIHVudXN1YWwsIHRoZSB0aHJvdyBmb2xsb3dpbmdcbiAqIGBvcHRSYWlzZShyZWFzb24pYCB3b3VsZCBzdGlsbCBoYXBwZW4uXG4gKlxuICogQHBhcmFtIHtSYWlzZX0gW29wdFJhaXNlXVxuICogQHBhcmFtIHtib29sZWFufSBbdW5yZWRhY3RlZF1cbiAqIEByZXR1cm5zIHtBc3NlcnR9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KHRlbXBsYXRlOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSB8IHN0cmluZ1tdLCAuLi5hcmdzOiBhbnkpID0+IERldGFpbHNUb2tlbn0gRGV0YWlsc1RhZ1xuICpcbiAqIFVzZSB0aGUgYGRldGFpbHNgIGZ1bmN0aW9uIGFzIGEgdGVtcGxhdGUgbGl0ZXJhbCB0YWcgdG8gY3JlYXRlXG4gKiBpbmZvcm1hdGl2ZSBlcnJvciBtZXNzYWdlcy4gVGhlIGFzc2VydGlvbiBmdW5jdGlvbnMgdGFrZSBzdWNoIG1lc3NhZ2VzXG4gKiBhcyBvcHRpb25hbCBhcmd1bWVudHM6XG4gKiBgYGBqc1xuICogYXNzZXJ0KHNreS5pc0JsdWUoKSwgZGV0YWlsc2Ake3NreS5jb2xvcn0gc2hvdWxkIGJlIFwiYmx1ZVwiYCk7XG4gKiBgYGBcbiAqIG9yIGZvbGxvd2luZyB0aGUgbm9ybWFsIGNvbnZlbnRpb24gdG8gbG9jYWxseSByZW5hbWUgYGRldGFpbHNgIHRvIGBYYFxuICogYW5kIGBxdW90ZWAgdG8gYHFgIGxpa2UgYGNvbnN0IHsgZGV0YWlsczogWCwgcXVvdGU6IHEgfSA9IGFzc2VydDtgOlxuICogYGBganNcbiAqIGFzc2VydChza3kuaXNCbHVlKCksIFhgJHtza3kuY29sb3J9IHNob3VsZCBiZSBcImJsdWVcImApO1xuICogYGBgXG4gKiBIb3dldmVyLCBub3RlIHRoYXQgaW4gbW9zdCBjYXNlcyBpdCBpcyBwcmVmZXJhYmxlIHRvIGluc3RlYWQgdXNlIHRoZSBgRmFpbGBcbiAqIHRlbXBsYXRlIGxpdGVyYWwgdGFnICh3aGljaCBoYXMgdGhlIHNhbWUgaW5wdXQgc2lnbmF0dXJlIGFzIGBkZXRhaWxzYFxuICogYnV0IGF1dG9tYXRpY2FsbHkgY3JlYXRlcyBhbmQgdGhyb3dzIGFuIGVycm9yKTpcbiAqIGBgYGpzXG4gKiBza3kuaXNCbHVlKCkgfHwgRmFpbGAke3NreS5jb2xvcn0gc2hvdWxkIGJlIFwiYmx1ZVwiYDtcbiAqIGBgYFxuICpcbiAqIFRoZSBkZXRhaWxzIHRlbXBsYXRlIHRhZyByZXR1cm5zIGEgYERldGFpbHNUb2tlbmAgb2JqZWN0IHRoYXQgY2FuIHByaW50XG4gKiBpdHNlbGYgd2l0aCB0aGUgZm9ybWF0dGVkIG1lc3NhZ2UgaW4gdHdvIHdheXMuXG4gKiBJdCB3aWxsIHJlcG9ydCBmdWxsIGRldGFpbHMgdG8gdGhlIGNvbnNvbGUsIGJ1dFxuICogbWFzayBlbWJlZGRlZCBzdWJzdGl0dXRpb24gdmFsdWVzIHdpdGggdGhlaXIgdHlwZW9mIGluZm9ybWF0aW9uIGluIHRoZSB0aHJvd24gZXJyb3JcbiAqIHRvIHByZXZlbnQgcmV2ZWFsaW5nIHNlY3JldHMgdXAgdGhlIGV4Y2VwdGlvbmFsIHBhdGguIEluIHRoZSBleGFtcGxlXG4gKiBhYm92ZSwgdGhlIHRocm93biBlcnJvciBtYXkgcmV2ZWFsIG9ubHkgdGhhdCBgc2t5LmNvbG9yYCBpcyBhIHN0cmluZyxcbiAqIHdoZXJlYXMgdGhlIHNhbWUgZGlhZ25vc3RpYyBwcmludGVkIHRvIHRoZSBjb25zb2xlIHJldmVhbHMgdGhhdCB0aGVcbiAqIHNreSB3YXMgZ3JlZW4uIFRoaXMgbWFza2luZyBjYW4gYmUgZGlzYWJsZWQgZm9yIGFuIGluZGl2aWR1YWwgc3Vic3RpdHV0aW9uIHZhbHVlXG4gKiB1c2luZyBgcXVvdGVgLlxuICpcbiAqIFRoZSBgcmF3YCBwcm9wZXJ0eSBvZiBhbiBpbnB1dCB0ZW1wbGF0ZSBhcnJheSBpcyBpZ25vcmVkLCBzbyBhIHNpbXBsZVxuICogYXJyYXkgb2Ygc3RyaW5ncyBtYXkgYmUgcHJvdmlkZWQgZGlyZWN0bHkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KHRlbXBsYXRlOiBUZW1wbGF0ZVN0cmluZ3NBcnJheSB8IHN0cmluZ1tdLCAuLi5hcmdzOiBhbnkpID0+IG5ldmVyfSBGYWlsVGFnXG4gKlxuICogVXNlIHRoZSBgRmFpbGAgZnVuY3Rpb24gYXMgYSB0ZW1wbGF0ZSBsaXRlcmFsIHRhZyB0byBlZmZpY2llbnRseVxuICogY3JlYXRlIGFuZCB0aHJvdyBhIGBkZXRhaWxzYC1zdHlsZSBlcnJvciBvbmx5IHdoZW4gYSBjb25kaXRpb24gaXMgbm90IHNhdGlzZmllZC5cbiAqIGBgYGpzXG4gKiBjb25kaXRpb24gfHwgRmFpbGAuLi5jb21wbGFpbnQuLi5gO1xuICogYGBgXG4gKiBUaGlzIGF2b2lkcyB0aGUgb3ZlcmhlYWQgb2YgY3JlYXRpbmcgdXN1YWxseS11bm5lY2Vzc2FyeSBlcnJvcnMgbGlrZVxuICogYGBganNcbiAqIGFzc2VydChjb25kaXRpb24sIGRldGFpbHNgLi4uY29tcGxhaW50Li4uYCk7XG4gKiBgYGBcbiAqIHdoaWxlIGltcHJvdmluZyByZWFkYWJpbGl0eSBvdmVyIGFsdGVybmF0aXZlcyBsaWtlXG4gKiBgYGBqc1xuICogY29uZGl0aW9uIHx8IGFzc2VydC5mYWlsKGRldGFpbHNgLi4uY29tcGxhaW50Li4uYCk7XG4gKiBgYGBcbiAqXG4gKiBIb3dldmVyLCBkdWUgdG8gY3VycmVudCB3ZWFrbmVzcyBpbiBUeXBlU2NyaXB0LCBzdGF0aWMgcmVhc29uaW5nXG4gKiBpcyBsZXNzIHBvd2VyZnVsIHdpdGggdGhlIGB8fGAgcGF0dGVybnMgdGhhbiB3aXRoIGFuIGBhc3NlcnRgIGNhbGwuXG4gKiBVbnRpbC91bmxlc3MgaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy81MTQyNiBpcyBmaXhlZCxcbiAqIGZvciBgfHxgLXN0eWxlIGFzc2VydGlvbnMgd2hlcmUgdGhpcyBsb3NzIG9mIHN0YXRpYyByZWFzb25pbmcgaXMgYSBwcm9ibGVtLFxuICogaW5zdGVhZCBleHByZXNzIHRoZSBhc3NlcnRpb24gYXNcbiAqIGBgYGpzXG4gKiAgIGlmICghY29uZGl0aW9uKSB7XG4gKiAgICAgRmFpbGAuLi5jb21wbGFpbnQuLi5gO1xuICogICB9XG4gKiBgYGBcbiAqIG9yLCBpZiBuZWVkZWQsXG4gKiBgYGBqc1xuICogICBpZiAoIWNvbmRpdGlvbikge1xuICogICAgIC8vIGB0aHJvd2AgaXMgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLCBidXQgaXQgaW1wcm92ZXMgc3RhdGljIGFuYWx5c2lzXG4gKiAgICAgdGhyb3cgRmFpbGAuLi5jb21wbGFpbnQuLi5gO1xuICogICB9XG4gKiBgYGBcbiAqL1xuXG4vKipcbiAqIGFzc2VydCB0aGF0IGV4cHIgaXMgdHJ1dGh5LCB3aXRoIGFuIG9wdGlvbmFsIGRldGFpbHMgdG8gZGVzY3JpYmVcbiAqIHRoZSBhc3NlcnRpb24uIEl0IGlzIGEgdGFnZ2VkIHRlbXBsYXRlIGxpdGVyYWwgbGlrZVxuICogYGBganNcbiAqIGFzc2VydChleHByLCBkZXRhaWxzYC4uLi5gKTtgXG4gKiBgYGBcbiAqXG4gKiBUaGUgbGl0ZXJhbCBwb3J0aW9ucyBvZiB0aGUgdGVtcGxhdGUgYXJlIGFzc3VtZWQgbm9uLXNlbnNpdGl2ZSwgYXNcbiAqIGFyZSB0aGUgYHR5cGVvZmAgdHlwZXMgb2YgdGhlIHN1YnN0aXR1dGlvbiB2YWx1ZXMuIFRoZXNlIGFyZVxuICogYXNzZW1ibGVkIGludG8gdGhlIHRocm93biBlcnJvciBtZXNzYWdlLiBUaGUgYWN0dWFsIGNvbnRlbnRzIG9mIHRoZVxuICogc3Vic3RpdHV0aW9uIHZhbHVlcyBhcmUgYXNzdW1lZCBzZW5zaXRpdmUsIHRvIGJlIHJldmVhbGVkIHRvXG4gKiB0aGUgY29uc29sZSBvbmx5LiBXZSBhc3N1bWUgb25seSB0aGUgdmlydHVhbCBwbGF0Zm9ybSdzIG93bmVyIGNhbiByZWFkXG4gKiB3aGF0IGlzIHdyaXR0ZW4gdG8gdGhlIGNvbnNvbGUsIHdoZXJlIHRoZSBvd25lciBpcyBpbiBhIHByaXZpbGVnZWRcbiAqIHBvc2l0aW9uIG92ZXIgY29tcHV0YXRpb24gcnVubmluZyBvbiB0aGF0IHBsYXRmb3JtLlxuICpcbiAqIFRoZSBvcHRpb25hbCBgb3B0RGV0YWlsc2AgY2FuIGJlIGEgc3RyaW5nIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICogd2l0aCB0aGUgbm9kZWpzIGFzc2VydGlvbiBsaWJyYXJ5LlxuICpcbiAqIEB0eXBlZGVmIHsgQmFzZUFzc2VydCAmIHtcbiAqICAgdHlwZW9mOiBBc3NlcnRUeXBlb2YsXG4gKiAgIGVycm9yOiBBc3NlcnRNYWtlRXJyb3IsXG4gKiAgIGZhaWw6IEFzc2VydEZhaWwsXG4gKiAgIGVxdWFsOiBBc3NlcnRFcXVhbCxcbiAqICAgc3RyaW5nOiBBc3NlcnRTdHJpbmcsXG4gKiAgIG5vdGU6IEFzc2VydE5vdGUsXG4gKiAgIGRldGFpbHM6IERldGFpbHNUYWcsXG4gKiAgIEZhaWw6IEZhaWxUYWcsXG4gKiAgIHF1b3RlOiBBc3NlcnRRdW90ZSxcbiAqICAgbWFrZUFzc2VydDogTWFrZUFzc2VydCxcbiAqIH0gfSBBc3NlcnRcbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABdze4OVwEAAFcBAAAgAAAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvZXhwb3J0ZWQuanN7ImltcG9ydHMiOlsiLi9zcmMvdHlwZXMtYW1iaWVudC5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABnEXSdtTcAALU3AAAmAAAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL2Ftb3VudE1hdGguanN7ImltcG9ydHMiOlsiLi9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanMiLCIuL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qcyIsIi4vbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanMiLCIuL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzIiwiQGFnb3JpYy9zdG9yZSIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJBbW91bnRNYXRoIiwiQXNzZXRLaW5kIiwiYXNzZXJ0QXNzZXRLaW5kIiwiYXNzZXJ0VmFsdWVHZXRIZWxwZXJzIiwiZ2V0QXNzZXRLaW5kIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHBhc3NTdHlsZU9mLGFzc2VydFJlbW90YWJsZSxhc3NlcnRSZWNvcmQsTSxtYXRjaGVzLG5hdE1hdGhIZWxwZXJzLHNldE1hdGhIZWxwZXJzLGNvcHlTZXRNYXRoSGVscGVycyxjb3B5QmFnTWF0aEhlbHBlcnM7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXSxbXCJhc3NlcnRSZW1vdGFibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFJlbW90YWJsZSA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UmVjb3JkXCIsIFskaOKAjV9hID0+IChhc3NlcnRSZWNvcmQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV0sW1wibWF0Y2hlc1wiLCBbJGjigI1fYSA9PiAobWF0Y2hlcyA9ICRo4oCNX2EpXV1dXSxbXCIuL21hdGhIZWxwZXJzL25hdE1hdGhIZWxwZXJzLmpzXCIsIFtbXCJuYXRNYXRoSGVscGVyc1wiLCBbJGjigI1fYSA9PiAobmF0TWF0aEhlbHBlcnMgPSAkaOKAjV9hKV1dXV0sW1wiLi9tYXRoSGVscGVycy9zZXRNYXRoSGVscGVycy5qc1wiLCBbW1wic2V0TWF0aEhlbHBlcnNcIiwgWyRo4oCNX2EgPT4gKHNldE1hdGhIZWxwZXJzID0gJGjigI1fYSldXV1dLFtcIi4vbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzXCIsIFtbXCJjb3B5U2V0TWF0aEhlbHBlcnNcIiwgWyRo4oCNX2EgPT4gKGNvcHlTZXRNYXRoSGVscGVycyA9ICRo4oCNX2EpXV1dXSxbXCIuL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qc1wiLCBbW1wiY29weUJhZ01hdGhIZWxwZXJzXCIsIFskaOKAjV9hID0+IChjb3B5QmFnTWF0aEhlbHBlcnMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbi8qKlxuICogQ29uc3RhbnRzIGZvciB0aGUga2luZHMgb2YgYXNzZXRzIHdlIHN1cHBvcnQuXG4gKlxuICogQHR5cGUge3sgTkFUOiAnbmF0JywgU0VUOiAnc2V0JywgQ09QWV9TRVQ6ICdjb3B5U2V0JywgQ09QWV9CQUc6ICdjb3B5QmFnJyB9fVxuICovXG5jb25zdCBBc3NldEtpbmQ9aGFyZGVuKHtcbk5BVDonbmF0JyxcblNFVDonc2V0JyxcbkNPUFlfU0VUOidjb3B5U2V0JyxcbkNPUFlfQkFHOidjb3B5QmFnJ30pOyRo4oCNX29uY2UuQXNzZXRLaW5kKEFzc2V0S2luZCk7XG5cbmNvbnN0IGFzc2V0S2luZE5hbWVzPWhhcmRlbihPYmplY3QudmFsdWVzKEFzc2V0S2luZCkuc29ydCgpKTtcblxuLyoqXG4gKlxuICogQHBhcmFtIHtBc3NldEtpbmR9IGFsbGVnZWRBS1xuICovXG5jb25zdCBhc3NlcnRBc3NldEtpbmQ9KGFsbGVnZWRBSyk9PntcbmFzc2V0S2luZE5hbWVzLmluY2x1ZGVzKGFsbGVnZWRBSyl8fFxuRmFpbCBgVGhlIGFzc2V0S2luZCAke2FsbGVnZWRBS30gbXVzdCBiZSBvbmUgb2YgJHtxKGFzc2V0S2luZE5hbWVzKX1gO1xuIH07JGjigI1fb25jZS5hc3NlcnRBc3NldEtpbmQoYXNzZXJ0QXNzZXRLaW5kKTtcbmhhcmRlbihhc3NlcnRBc3NldEtpbmQpO1xuXG4vKipcbiAqIEFtb3VudHMgZGVzY3JpYmUgZGlnaXRhbCBhc3NldHMuIEZyb20gYW4gYW1vdW50LCB5b3UgY2FuIGxlYXJuIHRoZVxuICogYnJhbmQgb2YgZGlnaXRhbCBhc3NldCBhcyB3ZWxsIGFzIFwiaG93IG11Y2hcIiBvciBcImhvdyBtYW55XCIuIEFtb3VudHNcbiAqIGhhdmUgdHdvIHBhcnRzOiBhIGJyYW5kIChsb29zZWx5IHNwZWFraW5nLCB0aGUgdHlwZSBvZiBkaWdpdGFsXG4gKiBhc3NldCkgYW5kIHRoZSB2YWx1ZSAodGhlIGFuc3dlciB0byBcImhvdyBtdWNoXCIpLiBGb3IgZXhhbXBsZSwgaW5cbiAqIHRoZSBwaHJhc2UgXCI1IGJ1Y2tzXCIsIFwiYnVja3NcIiB0YWtlcyB0aGUgcm9sZSBvZiB0aGUgYnJhbmQgYW5kIHRoZVxuICogdmFsdWUgaXMgNS4gQW1vdW50cyBjYW4gZGVzY3JpYmUgZnVuZ2libGUgYW5kIG5vbi1mdW5naWJsZSBkaWdpdGFsXG4gKiBhc3NldHMuIEFtb3VudHMgYXJlIHBhc3MtYnktY29weSBhbmQgY2FuIGJlIG1hZGUgYnkgYW5kIHNlbnQgdG9cbiAqIGFueW9uZS5cbiAqXG4gKiBUaGUgaXNzdWVyIGlzIHRoZSBhdXRob3JpdGF0aXZlIHNvdXJjZSBvZiB0aGUgYW1vdW50IGluIHBheW1lbnRzXG4gKiBhbmQgcHVyc2VzLiBUaGUgaXNzdWVyIG11c3QgYmUgYWJsZSB0byBkbyB0aGluZ3Mgc3VjaCBhcyBhZGRcbiAqIGRpZ2l0YWwgYXNzZXRzIHRvIGEgcHVyc2UgYW5kIHdpdGhkcmF3IGRpZ2l0YWwgYXNzZXRzIGZyb20gYSBwdXJzZS5cbiAqIFRvIGRvIHNvLCBpdCBtdXN0IGtub3cgaG93IHRvIGFkZCBhbmQgc3VidHJhY3QgZGlnaXRhbCBhc3NldHMuXG4gKiBSYXRoZXIgdGhhbiBoYXJkLWNvZGluZyBhIHBhcnRpY3VsYXIgc29sdXRpb24sIHdlIGNob3NlIHRvXG4gKiBwYXJhbWV0ZXJpemUgdGhlIGlzc3VlciB3aXRoIGEgY29sbGVjdGlvbiBvZiBwb2x5bW9ycGhpYyBmdW5jdGlvbnMsXG4gKiB3aGljaCB3ZSBjYWxsIGBBbW91bnRNYXRoYC4gVGhlc2UgbWF0aCBmdW5jdGlvbnMgaW5jbHVkZSBjb25jZXB0c1xuICogbGlrZSBhZGRpdGlvbiwgc3VidHJhY3Rpb24sIGFuZCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8uXG4gKlxuICogV2UgYWxzbyB3YW50IHRvIG1ha2Ugc3VyZSB0aGVyZSBpcyBubyBjb25mdXNpb24gYXMgdG8gd2hhdCBraW5kIG9mXG4gKiBhc3NldCB3ZSBhcmUgdXNpbmcuIFRodXMsIEFtb3VudE1hdGggaW5jbHVkZXMgY2hlY2tzIG9mIHRoZVxuICogYGJyYW5kYCwgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgdHlwZSBvZiBkaWdpdGFsIGFzc2V0LiBJZlxuICogdGhlIHdyb25nIGJyYW5kIGlzIHVzZWQgaW4gQW1vdW50TWF0aCwgYW4gZXJyb3IgaXMgdGhyb3duIGFuZCB0aGVcbiAqIG9wZXJhdGlvbiBkb2VzIG5vdCBzdWNjZWVkLlxuICpcbiAqIEFtb3VudE1hdGggdXNlcyBtYXRoSGVscGVycyB0byBkbyBtb3N0IG9mIHRoZSB3b3JrLCBidXQgdGhlbiBhZGRzXG4gKiB0aGUgYnJhbmQgdG8gdGhlIHJlc3VsdC4gVGhlIGZ1bmN0aW9uIGB2YWx1ZWAgZ2V0cyB0aGUgdmFsdWUgZnJvbVxuICogdGhlIGFtb3VudCBieSByZW1vdmluZyB0aGUgYnJhbmQgKGFtb3VudCAtPiB2YWx1ZSksIGFuZCB0aGVcbiAqIGZ1bmN0aW9uIGBtYWtlYCBhZGRzIHRoZSBicmFuZCB0byBwcm9kdWNlIGFuIGFtb3VudCAodmFsdWUgLT5cbiAqIGFtb3VudCkuIFRoZSBmdW5jdGlvbiBgY29lcmNlYCB0YWtlcyBhbiBhbW91bnQgYW5kIGNoZWNrcyBpdCxcbiAqIHJldHVybmluZyBhbiBhbW91bnQgKGFtb3VudCAtPiBhbW91bnQpLlxuICpcbiAqIEVhY2ggaXNzdWVyIG9mIGRpZ2l0YWwgYXNzZXRzIGhhcyBhbiBhc3NvY2lhdGVkIGJyYW5kIGluIGFcbiAqIG9uZS10by1vbmUgbWFwcGluZy4gSW4gdW50cnVzdGVkIGNvbnRleHRzLCBzdWNoIGFzIGluIGFuYWx5emluZ1xuICogcGF5bWVudHMgYW5kIGFtb3VudHMsIHdlIGNhbiBnZXQgdGhlIGJyYW5kIGFuZCBmaW5kIHRoZSBpc3N1ZXJcbiAqIHdoaWNoIG1hdGNoZXMgdGhlIGJyYW5kLiBUaGUgaXNzdWVyIGFuZCB0aGUgYnJhbmQgbXV0dWFsbHkgdmFsaWRhdGVcbiAqIGVhY2ggb3RoZXIuXG4gKi9cblxuY29uc3QgaGVscGVycz17XG5uYXQ6bmF0TWF0aEhlbHBlcnMsXG5zZXQ6c2V0TWF0aEhlbHBlcnMsXG5jb3B5U2V0OmNvcHlTZXRNYXRoSGVscGVycyxcbmNvcHlCYWc6Y29weUJhZ01hdGhIZWxwZXJzfTtcblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50VmFsdWV9IFZcbiAqIEB0eXBlIHsodmFsdWU6IFYpID0+IEFzc2V0S2luZEZvclZhbHVlPFY+fVxuICovXG5jb25zdCBhc3NlcnRWYWx1ZUdldEFzc2V0S2luZD0odmFsdWUpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YodmFsdWUpO1xuaWYocGFzc1N0eWxlPT09J2JpZ2ludCcpe1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbnJldHVybiduYXQnO1xuIH1cbmlmKHBhc3NTdHlsZT09PSdjb3B5QXJyYXknKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5yZXR1cm4nc2V0JztcbiB9XG5pZihtYXRjaGVzKHZhbHVlLE0uc2V0KCkpKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5yZXR1cm4nY29weVNldCc7XG4gfVxuaWYobWF0Y2hlcyh2YWx1ZSxNLmJhZygpKSl7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xucmV0dXJuJ2NvcHlCYWcnO1xuIH1cbi8qIFRPRE8gVGhpcyBpc24ndCBxdWl0ZSB0aGUgcmlnaHQgZXJyb3IgbWVzc2FnZSwgaW4gY2FzZSB2YWx1ZVBhc3NTdHlsZSovXG4vKiBpcyAndGFnZ2VkJy4gV2Ugd291bGQgbmVlZCB0byBkaXN0aW5ndWlzaCB3aGF0IGtpbmQgb2YgdGFnZ2VkKi9cbi8qIG9iamVjdCBpdCBpcy4qL1xuLyogQWxzbywgdGhpcyBraW5kIG9mIG1hbnVhbCBsaXN0aW5nIGlzIGEgbWFpbnRlbmFuY2UgaGF6YXJkIHdlKi9cbi8qIChUT0RPKSB3aWxsIGVuY291bnRlciB3aGVuIHdlIGV4dGVuZCB0aGUgbWF0aCBoZWxwZXJzIGZ1cnRoZXIuKi9cbnRocm93IEZhaWwgYHZhbHVlICR7dmFsdWV9IG11c3QgYmUgYSBiaWdpbnQsIGNvcHlTZXQsIGNvcHlCYWcsIG9yIGFuIGFycmF5LCBub3QgJHtxKFxucGFzc1N0eWxlKVxuIH1gO1xuIH07XG5cbi8qKlxuICpcbiAqIEFzc2VydHMgdGhhdCB2YWx1ZSBpcyBhIHZhbGlkIEFtb3VudE1hdGggYW5kIHJldHVybnMgdGhlIGFwcHJvcHJpYXRlIGhlbHBlcnMuXG4gKlxuICogTWFkZSBhdmFpbGFibGUgb25seSBmb3IgdGVzdGluZywgYnV0IGl0IGlzIGhhcm1sZXNzIGZvciBvdGhlciB1c2VzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50VmFsdWV9IFZcbiAqIEBwYXJhbSB7Vn0gdmFsdWVcbiAqIEByZXR1cm5zIHtNYXRoSGVscGVyczxWPn1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydFZhbHVlR2V0SGVscGVycz0odmFsdWUpPT5cbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCovXG5oZWxwZXJzW2Fzc2VydFZhbHVlR2V0QXNzZXRLaW5kKHZhbHVlKV07XG5cbi8qKiBAdHlwZSB7KGFsbGVnZWRCcmFuZDogQnJhbmQsIGJyYW5kPzogQnJhbmQpID0+IHZvaWR9ICovJGjigI1fb25jZS5hc3NlcnRWYWx1ZUdldEhlbHBlcnMoYXNzZXJ0VmFsdWVHZXRIZWxwZXJzKTtcbmNvbnN0IG9wdGlvbmFsQnJhbmRDaGVjaz0oYWxsZWdlZEJyYW5kLGJyYW5kKT0+e1xuaWYoYnJhbmQhPT11bmRlZmluZWQpe1xuYXNzZXJ0UmVtb3RhYmxlKGJyYW5kLCdicmFuZCcpO1xuYWxsZWdlZEJyYW5kPT09YnJhbmR8fFxuRmFpbCBgYW1vdW50J3MgYnJhbmQgJHtxKGFsbGVnZWRCcmFuZCl9IGRpZCBub3QgbWF0Y2ggZXhwZWN0ZWQgYnJhbmQgJHtxKFxuYnJhbmQpXG4gfWA7XG4gfVxuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEBwYXJhbSB7QW1vdW50PEs+fSBsZWZ0QW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcmlnaHRBbW91bnRcbiAqIEBwYXJhbSB7QnJhbmQ8Sz4gfCB1bmRlZmluZWR9IGJyYW5kXG4gKiBAcmV0dXJucyB7TWF0aEhlbHBlcnM8Kj59XG4gKi9cbmNvbnN0IGNoZWNrTFJBbmRHZXRIZWxwZXJzPShsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kPXVuZGVmaW5lZCk9PntcbmFzc2VydFJlY29yZChsZWZ0QW1vdW50LCdsZWZ0QW1vdW50Jyk7XG5hc3NlcnRSZWNvcmQocmlnaHRBbW91bnQsJ3JpZ2h0QW1vdW50Jyk7XG5jb25zdHt2YWx1ZTpsZWZ0VmFsdWUsYnJhbmQ6bGVmdEJyYW5kfT1sZWZ0QW1vdW50O1xuY29uc3R7dmFsdWU6cmlnaHRWYWx1ZSxicmFuZDpyaWdodEJyYW5kfT1yaWdodEFtb3VudDtcbmFzc2VydFJlbW90YWJsZShsZWZ0QnJhbmQsJ2xlZnRCcmFuZCcpO1xuYXNzZXJ0UmVtb3RhYmxlKHJpZ2h0QnJhbmQsJ3JpZ2h0QnJhbmQnKTtcbm9wdGlvbmFsQnJhbmRDaGVjayhsZWZ0QnJhbmQsYnJhbmQpO1xub3B0aW9uYWxCcmFuZENoZWNrKHJpZ2h0QnJhbmQsYnJhbmQpO1xubGVmdEJyYW5kPT09cmlnaHRCcmFuZHx8XG5GYWlsIGBCcmFuZHMgaW4gbGVmdCAke3EobGVmdEJyYW5kKX0gYW5kIHJpZ2h0ICR7cShcbnJpZ2h0QnJhbmQpXG4gfSBzaG91bGQgbWF0Y2ggYnV0IGRvIG5vdGA7XG5jb25zdCBsZWZ0SGVscGVycz1hc3NlcnRWYWx1ZUdldEhlbHBlcnMobGVmdFZhbHVlKTtcbmNvbnN0IHJpZ2h0SGVscGVycz1hc3NlcnRWYWx1ZUdldEhlbHBlcnMocmlnaHRWYWx1ZSk7XG5sZWZ0SGVscGVycz09PXJpZ2h0SGVscGVyc3x8XG5GYWlsIGBUaGUgbGVmdCAke2xlZnRBbW91bnR9IGFuZCByaWdodCBhbW91bnQgJHtyaWdodEFtb3VudH0gaGFkIGRpZmZlcmVudCBhc3NldEtpbmRzYDtcbnJldHVybiBsZWZ0SGVscGVycztcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge01hdGhIZWxwZXJzPEFzc2V0VmFsdWVGb3JLaW5kPEs+Pn0gaFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IGxlZnRBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSByaWdodEFtb3VudFxuICogQHJldHVybnMge1tLLCBLXX1cbiAqL1xuY29uc3QgY29lcmNlTFI9KGgsbGVmdEFtb3VudCxyaWdodEFtb3VudCk9Pntcbi8qIEB0cy1leHBlY3QtZXJyb3IgY291bGQgYmUgYXJiaXRyYXJ5IHN1YnR5cGUqL1xucmV0dXJuW2guZG9Db2VyY2UobGVmdEFtb3VudC52YWx1ZSksaC5kb0NvZXJjZShyaWdodEFtb3VudC52YWx1ZSldO1xuIH07XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHRoZSBsZWZ0QW1vdW50IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGVcbiAqIHJpZ2h0QW1vdW50LiBUaGUgbm90aW9uIG9mIFwiZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvXCIgZGVwZW5kc1xuICogb24gdGhlIGtpbmQgb2YgYW1vdW50LCBhcyBkZWZpbmVkIGJ5IHRoZSBNYXRoSGVscGVycy4gRm9yIGV4YW1wbGUsXG4gKiB3aGV0aGVyIHJlY3RhbmdsZSBBIGlzIGdyZWF0ZXIgdGhhbiByZWN0YW5nbGUgQiBkZXBlbmRzIG9uIHdoZXRoZXIgcmVjdGFuZ2xlXG4gKiBBIGluY2x1ZGVzIHJlY3RhbmdsZSBCIGFzIGRlZmluZWQgYnkgdGhlIGxvZ2ljIGluIE1hdGhIZWxwZXJzLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHJpZ2h0QW1vdW50XG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBbYnJhbmRdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXNHVEU9KGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQ9dW5kZWZpbmVkKT0+e1xuY29uc3QgaD1jaGVja0xSQW5kR2V0SGVscGVycyhsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kKTtcbnJldHVybiBoLmRvSXNHVEUoLi4uY29lcmNlTFIoaCxsZWZ0QW1vdW50LHJpZ2h0QW1vdW50KSk7XG4gfTtcblxuLyoqXG4gKiBMb2dpYyBmb3IgbWFuaXB1bGF0aW5nIGFtb3VudHMuXG4gKlxuICogQW1vdW50cyBhcmUgdGhlIGNhbm9uaWNhbCBkZXNjcmlwdGlvbiBvZiB0cmFkYWJsZSBnb29kcy4gVGhleSBhcmUgbWFuaXB1bGF0ZWRcbiAqIGJ5IGlzc3VlcnMgYW5kIG1pbnRzLCBhbmQgcmVwcmVzZW50IHRoZSBnb29kcyBhbmQgY3VycmVuY3kgY2FycmllZCBieSBwdXJzZXNcbiAqIGFuZFxuICogcGF5bWVudHMuIFRoZXkgY2FuIGJlIHVzZWQgdG8gcmVwcmVzZW50IHRoaW5ncyBsaWtlIGN1cnJlbmN5LCBzdG9jaywgYW5kIHRoZVxuICogYWJzdHJhY3QgcmlnaHQgdG8gcGFydGljaXBhdGUgaW4gYSBwYXJ0aWN1bGFyIGV4Y2hhbmdlLlxuICovXG5jb25zdCBBbW91bnRNYXRoPXtcbi8qKlxuICogTWFrZSBhbiBhbW91bnQgZnJvbSBhIHZhbHVlIGJ5IGFkZGluZyB0aGUgYnJhbmQuXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IGJyYW5kXG4gKiBAcGFyYW0ge0Fzc2V0VmFsdWVGb3JLaW5kPEs+fSBhbGxlZ2VkVmFsdWVcbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cbi8qIGFsbGVnZWRWYWx1ZSBoYXMgYSBjb25kaXRpb25hbCBleHByZXNzaW9uIGZvciB0eXBlIHdpZGVuaW5nLCB0byBwcmV2ZW50IFYgYmVpbmcgYm91bmQgdG8gYSBhIGxpdGVyYWwgbGlrZSAxbiovXG5tYWtlOihicmFuZCxhbGxlZ2VkVmFsdWUpPT57XG5hc3NlcnRSZW1vdGFibGUoYnJhbmQsJ2JyYW5kJyk7XG5jb25zdCBoPWFzc2VydFZhbHVlR2V0SGVscGVycyhhbGxlZ2VkVmFsdWUpO1xuY29uc3QgdmFsdWU9aC5kb0NvZXJjZShhbGxlZ2VkVmFsdWUpO1xucmV0dXJuIGhhcmRlbih7YnJhbmQsdmFsdWV9KTtcbiB9LFxuLyoqXG4gKiBNYWtlIHN1cmUgdGhpcyBhbW91bnQgaXMgdmFsaWQgZW5vdWdoLCBhbmQgcmV0dXJuIGEgY29ycmVzcG9uZGluZ1xuICogdmFsaWQgYW1vdW50IGlmIHNvLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBicmFuZFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IGFsbGVnZWRBbW91bnRcbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cbmNvZXJjZTooYnJhbmQsYWxsZWdlZEFtb3VudCk9PntcbmFzc2VydFJlbW90YWJsZShicmFuZCwnYnJhbmQnKTtcbmFzc2VydFJlY29yZChhbGxlZ2VkQW1vdW50LCdhbW91bnQnKTtcbmNvbnN0e2JyYW5kOmFsbGVnZWRCcmFuZCx2YWx1ZTphbGxlZ2VkVmFsdWV9PWFsbGVnZWRBbW91bnQ7XG5icmFuZD09PWFsbGVnZWRCcmFuZHx8XG5GYWlsIGBUaGUgYnJhbmQgaW4gdGhlIGFsbGVnZWRBbW91bnQgJHthbGxlZ2VkQW1vdW50fSBpbiAnY29lcmNlJyBkaWRuJ3QgbWF0Y2ggdGhlIHNwZWNpZmllZCBicmFuZCAke2JyYW5kfS5gO1xuLyogV2lsbCB0aHJvdyBvbiBpbmFwcHJvcHJpYXRlIHZhbHVlKi9cbnJldHVybiBBbW91bnRNYXRoLm1ha2UoYnJhbmQsYWxsZWdlZFZhbHVlKTtcbiB9LFxuLyoqXG4gKiBFeHRyYWN0IGFuZCByZXR1cm4gdGhlIHZhbHVlLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBicmFuZFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IGFtb3VudFxuICogQHJldHVybnMge0Fzc2V0VmFsdWVGb3JLaW5kPEs+fVxuICovXG5nZXRWYWx1ZTooYnJhbmQsYW1vdW50KT0+QW1vdW50TWF0aC5jb2VyY2UoYnJhbmQsYW1vdW50KS52YWx1ZSxcbi8qKlxuICogUmV0dXJuIHRoZSBhbW91bnQgcmVwcmVzZW50aW5nIGFuIGVtcHR5IGFtb3VudC4gVGhpcyBpcyB0aGVcbiAqIGlkZW50aXR5IGVsZW1lbnQgZm9yIE1hdGhIZWxwZXJzLmFkZCBhbmQgTWF0SGVscGVycy5zdWJ0cmFjdC5cbiAqXG4gKiBAdHlwZSB7e1xuICogICAoYnJhbmQ6IEJyYW5kKTogQW1vdW50PCduYXQnPjtcbiAqICAgPEsgZXh0ZW5kcyBBc3NldEtpbmQ+KGJyYW5kOiBCcmFuZCwgYXNzZXRLaW5kOiBLKTogQW1vdW50PEs+O1xuICogfX1cbiAqL1xubWFrZUVtcHR5OihicmFuZCxhc3NldEtpbmQ9LyoqIEB0eXBlIHtjb25zdH0gKi8nbmF0Jyk9PntcbmFzc2VydFJlbW90YWJsZShicmFuZCwnYnJhbmQnKTtcbmFzc2VydEFzc2V0S2luZChhc3NldEtpbmQpO1xuY29uc3QgdmFsdWU9aGVscGVyc1thc3NldEtpbmRdLmRvTWFrZUVtcHR5KCk7XG5yZXR1cm4gaGFyZGVuKHticmFuZCx2YWx1ZX0pO1xuIH0sXG4vKipcbiAqIFJldHVybiB0aGUgYW1vdW50IHJlcHJlc2VudGluZyBhbiBlbXB0eSBhbW91bnQsIHVzaW5nIGFub3RoZXJcbiAqIGFtb3VudCBhcyB0aGUgdGVtcGxhdGUgZm9yIHRoZSBicmFuZCBhbmQgYXNzZXRLaW5kLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gYW1vdW50XG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5tYWtlRW1wdHlGcm9tQW1vdW50OihhbW91bnQpPT57XG5hc3NlcnRSZWNvcmQoYW1vdW50LCdhbW91bnQnKTtcbmNvbnN0e2JyYW5kLHZhbHVlfT1hbW91bnQ7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QqL1xuY29uc3QgYXNzZXRLaW5kPWFzc2VydFZhbHVlR2V0QXNzZXRLaW5kKHZhbHVlKTtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCAoaWdub3JlIGIvYyBlcnJvcmluZyBpbiBDSSBidXQgbm90IG15IElERSkqL1xucmV0dXJuIEFtb3VudE1hdGgubWFrZUVtcHR5KGJyYW5kLGFzc2V0S2luZCk7XG4gfSxcbi8qKlxuICogUmV0dXJuIHRydWUgaWYgdGhlIEFtb3VudCBpcyBlbXB0eS4gT3RoZXJ3aXNlIGZhbHNlLlxuICpcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRcbiAqIEBwYXJhbSB7QnJhbmR9IFticmFuZF1cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5pc0VtcHR5OihhbW91bnQsYnJhbmQ9dW5kZWZpbmVkKT0+e1xuYXNzZXJ0UmVjb3JkKGFtb3VudCwnYW1vdW50Jyk7XG5jb25zdHticmFuZDphbGxlZ2VkQnJhbmQsdmFsdWV9PWFtb3VudDtcbmFzc2VydFJlbW90YWJsZShhbGxlZ2VkQnJhbmQsJ2JyYW5kJyk7XG5vcHRpb25hbEJyYW5kQ2hlY2soYWxsZWdlZEJyYW5kLGJyYW5kKTtcbmNvbnN0IGg9YXNzZXJ0VmFsdWVHZXRIZWxwZXJzKHZhbHVlKTtcbnJldHVybiBoLmRvSXNFbXB0eShoLmRvQ29lcmNlKHZhbHVlKSk7XG4gfSxcbmlzR1RFLFxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGxlZnRBbW91bnQgZXF1YWxzIHRoZSByaWdodEFtb3VudC4gV2UgYXNzdW1lXG4gKiB0aGF0IGlmIGlzR1RFIGlzIHRydWUgaW4gYm90aCBkaXJlY3Rpb25zLCBpc0VxdWFsIGlzIGFsc28gdHJ1ZVxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHJpZ2h0QW1vdW50XG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBbYnJhbmRdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuaXNFcXVhbDoobGVmdEFtb3VudCxyaWdodEFtb3VudCxicmFuZD11bmRlZmluZWQpPT57XG5jb25zdCBoPWNoZWNrTFJBbmRHZXRIZWxwZXJzKGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQpO1xucmV0dXJuIGguZG9Jc0VxdWFsKC4uLmNvZXJjZUxSKGgsbGVmdEFtb3VudCxyaWdodEFtb3VudCkpO1xuIH0sXG4vKipcbiAqIFJldHVybnMgYSBuZXcgYW1vdW50IHRoYXQgaXMgdGhlIHVuaW9uIG9mIGJvdGggbGVmdEFtb3VudCBhbmQgcmlnaHRBbW91bnQuXG4gKlxuICogRm9yIGZ1bmdpYmxlIGFtb3VudCB0aGlzIG1lYW5zIGFkZGluZyB0aGUgdmFsdWVzLiBGb3Igb3RoZXIga2luZHMgb2ZcbiAqIGFtb3VudCwgaXQgdXN1YWxseSBtZWFucyBpbmNsdWRpbmcgYWxsIG9mIHRoZSBlbGVtZW50cyBmcm9tIGJvdGhcbiAqIGxlZnQgYW5kIHJpZ2h0LlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gbGVmdEFtb3VudFxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHJpZ2h0QW1vdW50XG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBbYnJhbmRdXG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5hZGQ6KGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQ9dW5kZWZpbmVkKT0+e1xuY29uc3QgaD1jaGVja0xSQW5kR2V0SGVscGVycyhsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kKTtcbmNvbnN0IHZhbHVlPWguZG9BZGQoLi4uY29lcmNlTFIoaCxsZWZ0QW1vdW50LHJpZ2h0QW1vdW50KSk7XG5yZXR1cm4gaGFyZGVuKHticmFuZDpsZWZ0QW1vdW50LmJyYW5kLHZhbHVlfSk7XG4gfSxcbi8qKlxuICogUmV0dXJucyBhIG5ldyBhbW91bnQgdGhhdCBpcyB0aGUgbGVmdEFtb3VudCBtaW51cyB0aGUgcmlnaHRBbW91bnRcbiAqIChpLmUuIGV2ZXJ5dGhpbmcgaW4gdGhlIGxlZnRBbW91bnQgdGhhdCBpcyBub3QgaW4gdGhlXG4gKiByaWdodEFtb3VudCkuIElmIGxlZnRBbW91bnQgZG9lc24ndCBpbmNsdWRlIHJpZ2h0QW1vdW50XG4gKiAoc3VidHJhY3Rpb24gcmVzdWx0cyBpbiBhIG5lZ2F0aXZlKSwgdGhyb3cgIGFuIGVycm9yLiBCZWNhdXNlIHRoZVxuICogbGVmdCBhbW91bnQgbXVzdCBpbmNsdWRlIHRoZSByaWdodCBhbW91bnQsIHRoaXMgaXMgTk9UIGVxdWl2YWxlbnRcbiAqIHRvIHNldCBzdWJ0cmFjdGlvbi5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHBhcmFtIHtBbW91bnQ8Sz59IGxlZnRBbW91bnRcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSByaWdodEFtb3VudFxuICogQHBhcmFtIHtCcmFuZDxLPn0gW2JyYW5kXVxuICogQHJldHVybnMge0Ftb3VudDxLPn1cbiAqL1xuc3VidHJhY3Q6KGxlZnRBbW91bnQscmlnaHRBbW91bnQsYnJhbmQ9dW5kZWZpbmVkKT0+e1xuY29uc3QgaD1jaGVja0xSQW5kR2V0SGVscGVycyhsZWZ0QW1vdW50LHJpZ2h0QW1vdW50LGJyYW5kKTtcbmNvbnN0IHZhbHVlPWguZG9TdWJ0cmFjdCguLi5jb2VyY2VMUihoLGxlZnRBbW91bnQscmlnaHRBbW91bnQpKTtcbnJldHVybiBoYXJkZW4oe2JyYW5kOmxlZnRBbW91bnQuYnJhbmQsdmFsdWV9KTtcbiB9LFxuLyoqXG4gKiBSZXR1cm5zIHRoZSBtaW4gdmFsdWUgYmV0d2VlbiB4IGFuZCB5IHVzaW5nIGlzR1RFXG4gKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEBwYXJhbSB7QW1vdW50PEs+fSB4XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0geVxuICogQHBhcmFtIHtCcmFuZDxLPn0gW2JyYW5kXVxuICogQHJldHVybnMge0Ftb3VudDxLPn1cbiAqL1xubWluOih4LHksYnJhbmQ9dW5kZWZpbmVkKT0+XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnkqL1xuaXNHVEUoeCx5LGJyYW5kKT9cbnk6XG5pc0dURSh5LHgsYnJhbmQpP1xueDpcbkZhaWwgYCR7eH0gYW5kICR7eX0gYXJlIGluY29tcGFyYWJsZWAsXG4vKipcbiAqIFJldHVybnMgdGhlIG1heCB2YWx1ZSBiZXR3ZWVuIHggYW5kIHkgdXNpbmcgaXNHVEVcbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHBhcmFtIHtBbW91bnQ8Sz59IHhcbiAqIEBwYXJhbSB7QW1vdW50PEs+fSB5XG4gKiBAcGFyYW0ge0JyYW5kPEs+fSBbYnJhbmRdXG4gKiBAcmV0dXJucyB7QW1vdW50PEs+fVxuICovXG5tYXg6KHgseSxicmFuZD11bmRlZmluZWQpPT5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeSovXG5pc0dURSh4LHksYnJhbmQpP1xueDpcbmlzR1RFKHkseCk/XG55OlxuRmFpbCBgJHt4fSBhbmQgJHt5fSBhcmUgaW5jb21wYXJhYmxlYH07JGjigI1fb25jZS5BbW91bnRNYXRoKEFtb3VudE1hdGgpO1xuXG5oYXJkZW4oQW1vdW50TWF0aCk7XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRcbiAqL1xuY29uc3QgZ2V0QXNzZXRLaW5kPShhbW91bnQpPT57XG5hc3NlcnRSZWNvcmQoYW1vdW50LCdhbW91bnQnKTtcbmNvbnN0e3ZhbHVlfT1hbW91bnQ7XG4vKiBAdHMtZXhwZWN0LWVycm9yIGNhc3QgKGlnbm9yZSBiL2MgZXJyb3JpbmcgaW4gQ0kgYnV0IG5vdCBteSBJREUpKi9cbnJldHVybiBhc3NlcnRWYWx1ZUdldEFzc2V0S2luZCh2YWx1ZSk7XG4gfTskaOKAjV9vbmNlLmdldEFzc2V0S2luZChnZXRBc3NldEtpbmQpO1xuaGFyZGVuKGdldEFzc2V0S2luZCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQXNzZXRLaW5kIjpbIkFzc2V0S2luZCJdLCJhc3NlcnRBc3NldEtpbmQiOlsiYXNzZXJ0QXNzZXRLaW5kIl0sIkFtb3VudE1hdGgiOlsiQW1vdW50TWF0aCJdLCJnZXRBc3NldEtpbmQiOlsiZ2V0QXNzZXRLaW5kIl0sImFzc2VydFZhbHVlR2V0SGVscGVycyI6WyJhc3NlcnRWYWx1ZUdldEhlbHBlcnMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA7h+P6LwFAAC8BQAAJwAAAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9kaXNwbGF5SW5mby5qc3siaW1wb3J0cyI6WyIuL3R5cGVHdWFyZHMuanMiLCJAYWdvcmljL2Fzc2VydCIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJjb2VyY2VEaXNwbGF5SW5mbyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYWlsLG11c3RNYXRjaCxEaXNwbGF5SW5mb1NoYXBlOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJGYWlsXCIsIFskaOKAjV9hID0+IChGYWlsID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIm11c3RNYXRjaFwiLCBbJGjigI1fYSA9PiAobXVzdE1hdGNoID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiRGlzcGxheUluZm9TaGFwZVwiLCBbJGjigI1fYSA9PiAoRGlzcGxheUluZm9TaGFwZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG4vKipcbiAqIEBwYXJhbSB7QWRkaXRpb25hbERpc3BsYXlJbmZvfSBhbGxlZ2VkRGlzcGxheUluZm9cbiAqIEBwYXJhbSB7QXNzZXRLaW5kfSBhc3NldEtpbmRcbiAqIEByZXR1cm5zIHtEaXNwbGF5SW5mb31cbiAqL1xuY29uc3QgICAgICAgIGNvZXJjZURpc3BsYXlJbmZvPShhbGxlZ2VkRGlzcGxheUluZm8sYXNzZXRLaW5kKT0+e1xubXVzdE1hdGNoKGFsbGVnZWREaXNwbGF5SW5mbyxEaXNwbGF5SW5mb1NoYXBlLCdkaXNwbGF5SW5mbycpO1xuXG5pZihhbGxlZ2VkRGlzcGxheUluZm8uYXNzZXRLaW5kIT09dW5kZWZpbmVkKXtcbmFsbGVnZWREaXNwbGF5SW5mby5hc3NldEtpbmQ9PT1hc3NldEtpbmR8fFxuRmFpbCBgZGlzcGxheUluZm8uYXNzZXRLaW5kIHdhcyBwcmVzZW50ICgke2FsbGVnZWREaXNwbGF5SW5mby5hc3NldEtpbmR9KSBhbmQgZGlkIG5vdCBtYXRjaCB0aGUgYXNzZXRLaW5kIGFyZ3VtZW50ICgke2Fzc2V0S2luZH0pYDtcbiB9XG5jb25zdCBkaXNwbGF5SW5mbz1oYXJkZW4oey4uLmFsbGVnZWREaXNwbGF5SW5mbyxhc3NldEtpbmR9KTtcblxuaWYoZGlzcGxheUluZm8uZGVjaW1hbFBsYWNlcyE9PXVuZGVmaW5lZCl7XG5OdW1iZXIuaXNTYWZlSW50ZWdlcihkaXNwbGF5SW5mby5kZWNpbWFsUGxhY2VzKXx8XG5GYWlsIGBkZWNpbWFsUGxhY2VzICR7ZGlzcGxheUluZm8uZGVjaW1hbFBsYWNlc30gaXMgbm90IGEgc2FmZSBpbnRlZ2VyYDtcbiB9XG5cbnJldHVybiBkaXNwbGF5SW5mbztcbiB9OyRo4oCNX29uY2UuY29lcmNlRGlzcGxheUluZm8oY29lcmNlRGlzcGxheUluZm8pO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImNvZXJjZURpc3BsYXlJbmZvIjpbImNvZXJjZURpc3BsYXlJbmZvIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMm9LDjTAQAA0wEAACEAAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiLi9hbW91bnRNYXRoLmpzIiwiLi9pc3N1ZXJLaXQuanMiLCIuL3R5cGVHdWFyZHMuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL2lzc3VlcktpdC5qcyIsIi4vdHlwZUd1YXJkcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vYW1vdW50TWF0aC5qc1wiLCBbXV0sW1wiLi9pc3N1ZXJLaXQuanNcIiwgW11dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA9z0GKIMgAACDIAAAJQAAAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9pc3N1ZXJLaXQuanN7ImltcG9ydHMiOlsiLi9hbW91bnRNYXRoLmpzIiwiLi9kaXNwbGF5SW5mby5qcyIsIi4vcGF5bWVudExlZGdlci5qcyIsIi4vdHlwZXMtYW1iaWVudC5qcyIsIkBhZ29yaWMvYXNzZXJ0IiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiXSwiZXhwb3J0cyI6WyJoYXNJc3N1ZXIiLCJtYWtlRHVyYWJsZUlzc3VlcktpdCIsIm1ha2VJc3N1ZXJLaXQiLCJwcmVwYXJlSXNzdWVyS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydCxhc3NlcnRQYXR0ZXJuLG1ha2VTY2FsYXJCaWdNYXBTdG9yZSxBc3NldEtpbmQsYXNzZXJ0QXNzZXRLaW5kLGNvZXJjZURpc3BsYXlJbmZvLHByZXBhcmVQYXltZW50TGVkZ2VyOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJhc3NlcnRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJhc3NlcnRQYXR0ZXJuXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXR0ZXJuID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcIm1ha2VTY2FsYXJCaWdNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhckJpZ01hcFN0b3JlID0gJGjigI1fYSldXV1dLFtcIi4vYW1vdW50TWF0aC5qc1wiLCBbW1wiQXNzZXRLaW5kXCIsIFskaOKAjV9hID0+IChBc3NldEtpbmQgPSAkaOKAjV9hKV1dLFtcImFzc2VydEFzc2V0S2luZFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0QXNzZXRLaW5kID0gJGjigI1fYSldXV1dLFtcIi4vZGlzcGxheUluZm8uanNcIiwgW1tcImNvZXJjZURpc3BsYXlJbmZvXCIsIFskaOKAjV9hID0+IChjb2VyY2VEaXNwbGF5SW5mbyA9ICRo4oCNX2EpXV1dXSxbXCIuL3BheW1lbnRMZWRnZXIuanNcIiwgW1tcInByZXBhcmVQYXltZW50TGVkZ2VyXCIsIFskaOKAjV9hID0+IChwcmVwYXJlUGF5bWVudExlZGdlciA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAYWdvcmljL3ZhdC1kYXRhJykuQmFnZ2FnZX0gQmFnZ2FnZSAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJc3N1ZXJSZWNvcmRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBuYW1lXG4gKiBAcHJvcGVydHkge0t9IGFzc2V0S2luZFxuICogQHByb3BlcnR5IHtBZGRpdGlvbmFsRGlzcGxheUluZm99IGRpc3BsYXlJbmZvXG4gKiBAcHJvcGVydHkge1BhdHRlcm59IGVsZW1lbnRTaGFwZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7SXNzdWVyUmVjb3JkPEs+fSBpc3N1ZXJSZWNvcmRcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gaXNzdWVyQmFnZ2FnZVxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlfSBbb3B0U2h1dGRvd25XaXRoRmFpbHVyZV0gSWYgdGhpcyBpc3N1ZXIgZmFpbHNcbiAqIGluIHRoZSBtaWRkbGUgb2YgYW4gYXRvbWljIGFjdGlvbiAod2hpY2ggYnR3IHNob3VsZCBuZXZlciBoYXBwZW4pLCBpdFxuICogcG90ZW50aWFsbHkgbGVhdmVzIGl0cyBsZWRnZXIgaW4gYSBjb3JydXB0ZWQgc3RhdGUuIElmIHRoaXMgZnVuY3Rpb24gd2FzXG4gKiBwcm92aWRlZCwgdGhlbiB0aGUgZmFpbGVkIGF0b21pYyBhY3Rpb24gd2lsbCBjYWxsIGl0LCBzbyB0aGF0IHNvbWVcbiAqIGxhcmdlciB1bml0IG9mIGNvbXB1dGF0aW9uLCBsaWtlIHRoZSBlbmNsb3NpbmcgdmF0LCBjYW4gYmUgc2h1dGRvd25cbiAqIGJlZm9yZSBhbnl0aGluZyBlbHNlIGlzIGNvcnJ1cHRlZCBieSB0aGF0IGNvcnJ1cHRlZCBzdGF0ZS5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM0MzRcbiAqIEByZXR1cm5zIHtJc3N1ZXJLaXQ8Sz59XG4gKi9cbmNvbnN0IHNldHVwSXNzdWVyS2l0PShcbntuYW1lLGFzc2V0S2luZCxkaXNwbGF5SW5mbyxlbGVtZW50U2hhcGV9LFxuaXNzdWVyQmFnZ2FnZSxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmU9dW5kZWZpbmVkKT0+XG57XG5hc3NlcnQudHlwZW9mKG5hbWUsJ3N0cmluZycpO1xuYXNzZXJ0QXNzZXRLaW5kKGFzc2V0S2luZCk7XG5cbi8qIEFkZCBhc3NldEtpbmQgdG8gZGlzcGxheUluZm8sIG9yIG92ZXJyaWRlIGlmIHByZXNlbnQqL1xuY29uc3QgY2xlYW5EaXNwbGF5SW5mbz1jb2VyY2VEaXNwbGF5SW5mbyhkaXNwbGF5SW5mbyxhc3NldEtpbmQpO1xuaWYob3B0U2h1dGRvd25XaXRoRmFpbHVyZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnQudHlwZW9mKG9wdFNodXRkb3duV2l0aEZhaWx1cmUsJ2Z1bmN0aW9uJyk7XG4gfVxuXG5pZihlbGVtZW50U2hhcGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0UGF0dGVybihlbGVtZW50U2hhcGUpO1xuIH1cblxuLyogQXR0ZW51YXRlIHRoZSBwb3dlcmZ1bCBhdXRob3JpdHkgdG8gbWludCBhbmQgY2hhbmdlIGJhbGFuY2VzKi9cbi8qKiBAdHlwZSB7UGF5bWVudExlZGdlcjxLPn0gKi9cbi8qIEB0cy1leHBlY3QtZXJyb3IgY291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggZGlmZmVyZW50IHN1YnR5cGUgb2YgQXNzZXRLaW5kKi9cbmNvbnN0e2lzc3VlcixtaW50LGJyYW5kLG1pbnRSZWNvdmVyeVB1cnNlfT1wcmVwYXJlUGF5bWVudExlZGdlcihcbmlzc3VlckJhZ2dhZ2UsXG5uYW1lLFxuYXNzZXRLaW5kLFxuY2xlYW5EaXNwbGF5SW5mbyxcbmVsZW1lbnRTaGFwZSxcbm9wdFNodXRkb3duV2l0aEZhaWx1cmUpO1xuXG5cbnJldHVybiBoYXJkZW4oe1xuYnJhbmQsXG5pc3N1ZXIsXG5taW50LFxubWludFJlY292ZXJ5UHVyc2UsXG5kaXNwbGF5SW5mbzpjbGVhbkRpc3BsYXlJbmZvfSk7XG5cbiB9O1xuaGFyZGVuKHNldHVwSXNzdWVyS2l0KTtcblxuLyoqIFRoZSBrZXkgYXQgd2hpY2ggdGhlIGlzc3VlciByZWNvcmQgaXMgc3RvcmVkLiAqL1xuY29uc3QgSU5TVEFOQ0VfS0VZPSdpc3N1ZXInO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGlzc3VlckJhZ2dhZ2VcbiAqIEBwYXJhbSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gW29wdFNodXRkb3duV2l0aEZhaWx1cmVdIElmIHRoaXMgaXNzdWVyIGZhaWxzXG4gKiBpbiB0aGUgbWlkZGxlIG9mIGFuIGF0b21pYyBhY3Rpb24gKHdoaWNoIGJ0dyBzaG91bGQgbmV2ZXIgaGFwcGVuKSwgaXRcbiAqIHBvdGVudGlhbGx5IGxlYXZlcyBpdHMgbGVkZ2VyIGluIGEgY29ycnVwdGVkIHN0YXRlLiBJZiB0aGlzIGZ1bmN0aW9uIHdhc1xuICogcHJvdmlkZWQsIHRoZW4gdGhlIGZhaWxlZCBhdG9taWMgYWN0aW9uIHdpbGwgY2FsbCBpdCwgc28gdGhhdCBzb21lXG4gKiBsYXJnZXIgdW5pdCBvZiBjb21wdXRhdGlvbiwgbGlrZSB0aGUgZW5jbG9zaW5nIHZhdCwgY2FuIGJlIHNodXRkb3duXG4gKiBiZWZvcmUgYW55dGhpbmcgZWxzZSBpcyBjb3JydXB0ZWQgYnkgdGhhdCBjb3JydXB0ZWQgc3RhdGUuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNDM0XG4gKiBAcmV0dXJucyB7SXNzdWVyS2l0PEs+fVxuICovXG5jb25zdCAgICAgICAgcHJlcGFyZUlzc3VlcktpdD0oXG5pc3N1ZXJCYWdnYWdlLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZT11bmRlZmluZWQpPT5cbntcbmNvbnN0IGlzc3VlclJlY29yZD1pc3N1ZXJCYWdnYWdlLmdldChJTlNUQU5DRV9LRVkpO1xucmV0dXJuIHNldHVwSXNzdWVyS2l0KGlzc3VlclJlY29yZCxpc3N1ZXJCYWdnYWdlLG9wdFNodXRkb3duV2l0aEZhaWx1cmUpO1xuIH07JGjigI1fb25jZS5wcmVwYXJlSXNzdWVyS2l0KHByZXBhcmVJc3N1ZXJLaXQpO1xuaGFyZGVuKHByZXBhcmVJc3N1ZXJLaXQpO1xuXG4vKipcbiAqIERvZXMgYmFnZ2FnZSBhbHJlYWR5IGhhdmUgYW4gaXNzdWVyIGZyb20gcHJlcGFyZUlzc3VlcktpdCgpP1xuICogVGhhdCBpczogZG9lcyBpdCBoYXZlIHRoZSByZWxldmFudCBrZXlzIGRlZmluZWQ/XG4gKlxuICogQHBhcmFtIHtCYWdnYWdlfSBiYWdnYWdlXG4gKi9cbmNvbnN0ICAgICAgICBoYXNJc3N1ZXI9KGJhZ2dhZ2UpPT5iYWdnYWdlLmhhcyhJTlNUQU5DRV9LRVkpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtQYXJ0aWFsPHtlbGVtZW50U2hhcGU6IFBhdHRlcm59Pn0gSXNzdWVyT3B0aW9uc1JlY29yZFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIFRoZSBuYW1lIGJlY29tZXMgcGFydCBvZiB0aGUgYnJhbmQgaW4gYXNzZXQgZGVzY3JpcHRpb25zLlxuICogVGhlIG5hbWUgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgYW5kIGRvdWJsZS1jaGVja2luZ1xuICogYXNzdW1wdGlvbnMsIGJ1dCBzaG91bGQgbm90IGJlIHRydXN0ZWQgd3J0IGFueSBleHRlcm5hbCBuYW1lc3BhY2UuXG4gKiBGb3IgZXhhbXBsZSwgYW55b25lIGNvdWxkIGNyZWF0ZSBhIG5ldyBpc3N1ZXIga2l0IHdpdGggbmFtZSAnQlRDJywgYnV0XG4gKiBpdCBpcyBub3QgYml0Y29pbiBvciBldmVuIHJlbGF0ZWQuIEl0IGlzIG9ubHkgdGhlIG5hbWUgYWNjb3JkaW5nXG4gKiB0byB0aGF0IGlzc3VlciBhbmQgYnJhbmQuXG4gKlxuICogVGhlIGFzc2V0S2luZCB3aWxsIGJlIHVzZWQgdG8gaW1wb3J0IGEgc3BlY2lmaWMgbWF0aEhlbHBlcnNcbiAqIGZyb20gdGhlIG1hdGhIZWxwZXJzIGxpYnJhcnkuIEZvciBleGFtcGxlLCBuYXRNYXRoSGVscGVycywgdGhlXG4gKiBkZWZhdWx0LCBpcyB1c2VkIGZvciBiYXNpYyBmdW5naWJsZSB0b2tlbnMuXG4gKlxuICogIGBkaXNwbGF5SW5mb2AgZ2l2ZXMgaW5mb3JtYXRpb24gdG8gdGhlIFVJIG9uIGhvdyB0byBkaXNwbGF5IHRoZSBhbW91bnQuXG4gKlxuICogQHBhcmFtIHtCYWdnYWdlfSBpc3N1ZXJCYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtLfSBbYXNzZXRLaW5kPUFzc2V0S2luZC5OQVRdXG4gKiBAcGFyYW0ge0FkZGl0aW9uYWxEaXNwbGF5SW5mb30gW2Rpc3BsYXlJbmZvPXt9XVxuICogQHBhcmFtIHtTaHV0ZG93bldpdGhGYWlsdXJlfSBbb3B0U2h1dGRvd25XaXRoRmFpbHVyZV0gSWYgdGhpcyBpc3N1ZXIgZmFpbHNcbiAqIGluIHRoZSBtaWRkbGUgb2YgYW4gYXRvbWljIGFjdGlvbiAod2hpY2ggYnR3IHNob3VsZCBuZXZlciBoYXBwZW4pLCBpdFxuICogcG90ZW50aWFsbHkgbGVhdmVzIGl0cyBsZWRnZXIgaW4gYSBjb3JydXB0ZWQgc3RhdGUuIElmIHRoaXMgZnVuY3Rpb24gd2FzXG4gKiBwcm92aWRlZCwgdGhlbiB0aGUgZmFpbGVkIGF0b21pYyBhY3Rpb24gd2lsbCBjYWxsIGl0LCBzbyB0aGF0IHNvbWVcbiAqIGxhcmdlciB1bml0IG9mIGNvbXB1dGF0aW9uLCBsaWtlIHRoZSBlbmNsb3NpbmcgdmF0LCBjYW4gYmUgc2h1dGRvd25cbiAqIGJlZm9yZSBhbnl0aGluZyBlbHNlIGlzIGNvcnJ1cHRlZCBieSB0aGF0IGNvcnJ1cHRlZCBzdGF0ZS5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM0MzRcbiAqIEBwYXJhbSB7SXNzdWVyT3B0aW9uc1JlY29yZH0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7SXNzdWVyS2l0PEs+fVxuICovJGjigI1fb25jZS5oYXNJc3N1ZXIoaGFzSXNzdWVyKTtcbmNvbnN0ICAgICAgICBtYWtlRHVyYWJsZUlzc3VlcktpdD0oXG5pc3N1ZXJCYWdnYWdlLFxubmFtZSxcbi8qIEB0cy1leHBlY3QtZXJyb3IgSyBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIGRpZmZlcmVudCBzdWJ0eXBlIG9mIEFzc2V0S2luZCovXG5hc3NldEtpbmQ9QXNzZXRLaW5kLk5BVCxcbmRpc3BsYXlJbmZvPWhhcmRlbih7fSksXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlPXVuZGVmaW5lZCxcbntlbGVtZW50U2hhcGU9dW5kZWZpbmVkfT17fSk9Plxue1xuY29uc3QgaXNzdWVyRGF0YT1oYXJkZW4oe25hbWUsYXNzZXRLaW5kLGRpc3BsYXlJbmZvLGVsZW1lbnRTaGFwZX0pO1xuaXNzdWVyQmFnZ2FnZS5pbml0KElOU1RBTkNFX0tFWSxpc3N1ZXJEYXRhKTtcbnJldHVybiBzZXR1cElzc3VlcktpdChpc3N1ZXJEYXRhLGlzc3VlckJhZ2dhZ2Usb3B0U2h1dGRvd25XaXRoRmFpbHVyZSk7XG4gfTskaOKAjV9vbmNlLm1ha2VEdXJhYmxlSXNzdWVyS2l0KG1ha2VEdXJhYmxlSXNzdWVyS2l0KTtcbmhhcmRlbihtYWtlRHVyYWJsZUlzc3VlcktpdCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPSduYXQnXVxuICogVGhlIG5hbWUgYmVjb21lcyBwYXJ0IG9mIHRoZSBicmFuZCBpbiBhc3NldCBkZXNjcmlwdGlvbnMuXG4gKiBUaGUgbmFtZSBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZyBhbmQgZG91YmxlLWNoZWNraW5nXG4gKiBhc3N1bXB0aW9ucywgYnV0IHNob3VsZCBub3QgYmUgdHJ1c3RlZCB3cnQgYW55IGV4dGVybmFsIG5hbWVzcGFjZS5cbiAqIEZvciBleGFtcGxlLCBhbnlvbmUgY291bGQgY3JlYXRlIGEgbmV3IGlzc3VlciBraXQgd2l0aCBuYW1lICdCVEMnLCBidXRcbiAqIGl0IGlzIG5vdCBiaXRjb2luIG9yIGV2ZW4gcmVsYXRlZC4gSXQgaXMgb25seSB0aGUgbmFtZSBhY2NvcmRpbmdcbiAqIHRvIHRoYXQgaXNzdWVyIGFuZCBicmFuZC5cbiAqXG4gKiBUaGUgYXNzZXRLaW5kIHdpbGwgYmUgdXNlZCB0byBpbXBvcnQgYSBzcGVjaWZpYyBtYXRoSGVscGVyc1xuICogZnJvbSB0aGUgbWF0aEhlbHBlcnMgbGlicmFyeS4gRm9yIGV4YW1wbGUsIG5hdE1hdGhIZWxwZXJzLCB0aGVcbiAqIGRlZmF1bHQsIGlzIHVzZWQgZm9yIGJhc2ljIGZ1bmdpYmxlIHRva2Vucy5cbiAqXG4gKiAgYGRpc3BsYXlJbmZvYCBnaXZlcyBpbmZvcm1hdGlvbiB0byB0aGUgVUkgb24gaG93IHRvIGRpc3BsYXkgdGhlIGFtb3VudC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtLfSBbYXNzZXRLaW5kPSduYXQnXVxuICogQHBhcmFtIHtBZGRpdGlvbmFsRGlzcGxheUluZm99IFtkaXNwbGF5SW5mbz17fV1cbiAqIEBwYXJhbSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gW29wdFNodXRkb3duV2l0aEZhaWx1cmVdIElmIHRoaXMgaXNzdWVyIGZhaWxzXG4gKiBpbiB0aGUgbWlkZGxlIG9mIGFuIGF0b21pYyBhY3Rpb24gKHdoaWNoIGJ0dyBzaG91bGQgbmV2ZXIgaGFwcGVuKSwgaXRcbiAqIHBvdGVudGlhbGx5IGxlYXZlcyBpdHMgbGVkZ2VyIGluIGEgY29ycnVwdGVkIHN0YXRlLiBJZiB0aGlzIGZ1bmN0aW9uIHdhc1xuICogcHJvdmlkZWQsIHRoZW4gdGhlIGZhaWxlZCBhdG9taWMgYWN0aW9uIHdpbGwgY2FsbCBpdCwgc28gdGhhdCBzb21lXG4gKiBsYXJnZXIgdW5pdCBvZiBjb21wdXRhdGlvbiwgbGlrZSB0aGUgZW5jbG9zaW5nIHZhdCwgY2FuIGJlIHNodXRkb3duXG4gKiBiZWZvcmUgYW55dGhpbmcgZWxzZSBpcyBjb3JydXB0ZWQgYnkgdGhhdCBjb3JydXB0ZWQgc3RhdGUuXG4gKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNDM0XG4gKiBAcGFyYW0ge0lzc3Vlck9wdGlvbnNSZWNvcmR9IFtvcHRpb25zXVxuICogQHJldHVybnMge0lzc3VlcktpdDxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VJc3N1ZXJLaXQ9KFxubmFtZSxcbi8qIEB0cy1leHBlY3QtZXJyb3IgSyBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhIGRpZmZlcmVudCBzdWJ0eXBlIG9mIEFzc2V0S2luZCovXG5hc3NldEtpbmQ9QXNzZXRLaW5kLk5BVCxcbmRpc3BsYXlJbmZvPWhhcmRlbih7fSksXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlPXVuZGVmaW5lZCxcbntlbGVtZW50U2hhcGU9dW5kZWZpbmVkfT17fSk9PlxuXG5tYWtlRHVyYWJsZUlzc3VlcktpdChcbm1ha2VTY2FsYXJCaWdNYXBTdG9yZSgnZHJvcHBlZCBpc3N1ZXIga2l0Jyx7ZHVyYWJsZTp0cnVlfSksXG5uYW1lLFxuYXNzZXRLaW5kLFxuZGlzcGxheUluZm8sXG5vcHRTaHV0ZG93bldpdGhGYWlsdXJlLFxue2VsZW1lbnRTaGFwZX0pOyRo4oCNX29uY2UubWFrZUlzc3VlcktpdChtYWtlSXNzdWVyS2l0KTtcblxuaGFyZGVuKG1ha2VJc3N1ZXJLaXQpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InByZXBhcmVJc3N1ZXJLaXQiOlsicHJlcGFyZUlzc3VlcktpdCJdLCJoYXNJc3N1ZXIiOlsiaGFzSXNzdWVyIl0sIm1ha2VEdXJhYmxlSXNzdWVyS2l0IjpbIm1ha2VEdXJhYmxlSXNzdWVyS2l0Il0sIm1ha2VJc3N1ZXJLaXQiOlsibWFrZUlzc3VlcktpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADXKJqd/Q8AAP0PAAAyAAAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL2xlZ2FjeS1wYXltZW50LWhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi9hbW91bnRNYXRoLmpzIiwiQGFnb3JpYy9zdG9yZSIsIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbImNsYWltIiwiY29tYmluZSIsInNwbGl0Iiwic3BsaXRNYW55Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG11c3RNYXRjaCxFLEFtb3VudE1hdGg7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIi4vYW1vdW50TWF0aC5qc1wiLCBbW1wiQW1vdW50TWF0aFwiLCBbJGjigI1fYSA9PiAoQW1vdW50TWF0aCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuXG4vKiBUaGlzIGZpbGUgY29udGFpbnMgc2FmZXIgaGVscGVyIGZ1bmN0aW9uIGFsdGVybmF0aXZlcyB0byB0aGUqL1xuLyogc2ltaWxhcmx5IG5hbWVkIG1ldGhvZHMgb24gaXNzdWVyLiovXG4vKiBUaGVzZSBhcmUgcGFyYW1ldGVyaXplZCBieSBhIHB1cnNlLiBBbnkgcGF5bWVudHMgY3JlYXRlZCBieSB0aGVzZSovXG4vKiBoZWxwZXIgZnVuY3Rpb25zIGFyZSBpbiB0aGUgcmVjb3Zlcnkgc2V0IG9mIHRoYXQgcHVyc2UgdW50aWwgb3RoZXJ3aXNlKi9cbi8qIHVzZWQgdXAuKi9cbi8qKi9cbi8qIE9uZSBvZiB0aGVzZSBoZWxwZXIgZnVuY3Rpb25zIGlzIGxlc3Mgc2FmZSBpbiBvbmUgd2F5OiovXG4vKiBgY29tYmluZWAgaXMgbm90IGZhaWx1cmUgYXRvbWljLiBJZiB0aGUgYGNvbWJpbmVgIGhlbHBlciBmdW5jdGlvbiovXG4vKiBmYWlscywgc29tZSBvZiB0aGUgaW5wdXQgcGF5bWVudHMgbWF5IGhhdmUgYmVlbiB1c2VkIHVwLiBIb3dldmVyLCBldmVuKi9cbi8qIGluIHRoYXQgY2FzZSwgbm8gYXNzZXRzIHdvdWxkIGJlIGxvc3QuIFRoZSBhc3NldHMgZnJvbSB0aGUgdXNlZCB1cCBwYXltZW50cyovXG4vKiB3aWxsIGJlIGluIHRoZSBhcmd1bWVudCBwdXJzZS4qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0VSZWY8UHVyc2U8Sz4+fSBwdXJzZVxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ8Sz4+fSBzcmNQYXltZW50UFxuICogQHBhcmFtIHtQYXR0ZXJufSBbb3B0QW1vdW50U2hhcGVdXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxQYXltZW50PEs+Pn1cbiAqL1xuY29uc3QgICAgICAgIGNsYWltPWFzeW5jKHB1cnNlLHNyY1BheW1lbnRQLG9wdEFtb3VudFNoYXBlPXVuZGVmaW5lZCk9PntcbmNvbnN0IHNyY1BheW1lbnQ9YXdhaXQgc3JjUGF5bWVudFA7XG5yZXR1cm4gRS53aGVuKEUocHVyc2UpLmRlcG9zaXQoc3JjUGF5bWVudCxvcHRBbW91bnRTaGFwZSksKGFtb3VudCk9PlxuRShwdXJzZSkud2l0aGRyYXcoYW1vdW50KSk7XG5cbiB9OyRo4oCNX29uY2UuY2xhaW0oY2xhaW0pO1xuaGFyZGVuKGNsYWltKTtcblxuLyoqXG4gKiBOb3RlOiBOb3QgZmFpbHVyZSBhdG9taWMuIElmIGFueSBvZiB0aGUgZGVwb3NpdHMgZmFpbCwgb3IgdGhlIHRvdGFsIGRvZXMgbm90XG4gKiBtYXRjaCBvcHRUb3RhbEFtb3VudCwgc29tZSBwYXltZW50cyBtYXkgc3RpbGwgaGF2ZSBiZWVuIGRlcG9zaXRlZC5cbiAqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQHBhcmFtIHtFUmVmPFB1cnNlPEs+Pn0gcHVyc2VcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50PEs+PltdfSBzcmNQYXltZW50c1BzXG4gKiBAcGFyYW0ge1BhdHRlcm59IFtvcHRUb3RhbEFtb3VudF1cbiAqIEByZXR1cm5zIHtQcm9taXNlPFBheW1lbnQ8Sz4+fVxuICovXG5jb25zdCAgICAgICAgY29tYmluZT1hc3luYyhcbnB1cnNlLFxuc3JjUGF5bWVudHNQcyxcbm9wdFRvdGFsQW1vdW50PXVuZGVmaW5lZCk9Plxue1xuY29uc3RbYnJhbmQsZGlzcGxheUluZm8sLi4uc3JjUGF5bWVudHNdPWF3YWl0IFByb21pc2UuYWxsKFtcbkUocHVyc2UpLmdldEFsbGVnZWRCcmFuZCgpLFxuRShFKHB1cnNlKS5nZXRBbGxlZ2VkQnJhbmQoKSkuZ2V0RGlzcGxheUluZm8oKSxcbi4uLnNyY1BheW1lbnRzUHNdKTtcblxuY29uc3QgZW1wdHlBbW91bnQ9QW1vdW50TWF0aC5tYWtlRW1wdHkoYnJhbmQsZGlzcGxheUluZm8uYXNzZXRLaW5kKTtcbmNvbnN0IGFtb3VudFBzPXNyY1BheW1lbnRzLm1hcCgoc3JjUGF5bWVudCk9PkUocHVyc2UpLmRlcG9zaXQoc3JjUGF5bWVudCkpO1xuY29uc3QgYW1vdW50cz1hd2FpdCBQcm9taXNlLmFsbChhbW91bnRQcyk7XG5jb25zdCB0b3RhbD1hbW91bnRzLnJlZHVjZShcbih4LHkpPT5BbW91bnRNYXRoLmFkZCh4LHksYnJhbmQpLFxuZW1wdHlBbW91bnQpO1xuXG5pZihvcHRUb3RhbEFtb3VudCE9PXVuZGVmaW5lZCl7XG5tdXN0TWF0Y2godG90YWwsb3B0VG90YWxBbW91bnQsJ2Ftb3VudCcpO1xuIH1cbnJldHVybiBFKHB1cnNlKS53aXRoZHJhdyh0b3RhbCk7XG4gfTskaOKAjV9vbmNlLmNvbWJpbmUoY29tYmluZSk7XG5oYXJkZW4oY29tYmluZSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7RVJlZjxQdXJzZTxLPj59IHB1cnNlXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudDxLPj59IHNyY1BheW1lbnRQXG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcGF5bWVudEFtb3VudEFcbiAqIEByZXR1cm5zIHtQcm9taXNlPFBheW1lbnQ8Sz5bXT59XG4gKi9cbmNvbnN0ICAgICAgICBzcGxpdD1hc3luYyhwdXJzZSxzcmNQYXltZW50UCxwYXltZW50QW1vdW50QSk9PntcbmNvbnN0IHNyY1BheW1lbnQ9YXdhaXQgc3JjUGF5bWVudFA7XG5jb25zdCBzcmNBbW91bnQ9YXdhaXQgRShwdXJzZSkuZGVwb3NpdChzcmNQYXltZW50KTtcbmNvbnN0IHBheW1lbnRBbW91bnRCPUFtb3VudE1hdGguc3VidHJhY3Qoc3JjQW1vdW50LHBheW1lbnRBbW91bnRBKTtcbnJldHVybiBQcm9taXNlLmFsbChbXG5FKHB1cnNlKS53aXRoZHJhdyhwYXltZW50QW1vdW50QSksXG5FKHB1cnNlKS53aXRoZHJhdyhwYXltZW50QW1vdW50QildKTtcblxuIH07JGjigI1fb25jZS5zcGxpdChzcGxpdCk7XG5oYXJkZW4oc3BsaXQpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0VSZWY8UHVyc2U8Sz4+fSBwdXJzZVxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ8Sz4+fSBzcmNQYXltZW50UFxuICogQHBhcmFtIHtBbW91bnQ8Sz5bXX0gYW1vdW50c1xuICogQHJldHVybnMge1Byb21pc2U8UGF5bWVudFtdPn1cbiAqL1xuY29uc3QgICAgICAgIHNwbGl0TWFueT1hc3luYyhwdXJzZSxzcmNQYXltZW50UCxhbW91bnRzKT0+e1xuY29uc3Qgc3JjUGF5bWVudD1hd2FpdCBzcmNQYXltZW50UDtcbmNvbnN0IHNyY0Ftb3VudD1hd2FpdCBFKHB1cnNlKS5kZXBvc2l0KHNyY1BheW1lbnQpO1xuY29uc3QgYnJhbmQ9c3JjQW1vdW50LmJyYW5kO1xuY29uc3QgZW1wdHlBbW91bnQ9QW1vdW50TWF0aC5tYWtlRW1wdHlGcm9tQW1vdW50KHNyY0Ftb3VudCk7XG5jb25zdCB0b3RhbD1hbW91bnRzLnJlZHVjZShcbih4LHkpPT5BbW91bnRNYXRoLmFkZCh4LHksYnJhbmQpLFxuZW1wdHlBbW91bnQpO1xuXG5BbW91bnRNYXRoLmlzRXF1YWwoc3JjQW1vdW50LHRvdGFsKXx8XG5GYWlsIGByaWdodHMgd2VyZSBub3QgY29uc2VydmVkOiAke3RvdGFsfSB2cyAke3NyY0Ftb3VudH1gO1xuXG5yZXR1cm4gUHJvbWlzZS5hbGwoYW1vdW50cy5tYXAoKGFtb3VudCk9PkUocHVyc2UpLndpdGhkcmF3KGFtb3VudCkpKTtcbiB9OyRo4oCNX29uY2Uuc3BsaXRNYW55KHNwbGl0TWFueSk7XG5oYXJkZW4oc3BsaXRNYW55KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjbGFpbSI6WyJjbGFpbSJdLCJjb21iaW5lIjpbImNvbWJpbmUiXSwic3BsaXQiOlsic3BsaXQiXSwic3BsaXRNYW55IjpbInNwbGl0TWFueSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAxCcSIpAUAAKQFAAA6AAAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL21hdGhIZWxwZXJzL2NvcHlCYWdNYXRoSGVscGVycy5qc3siaW1wb3J0cyI6WyIuLi90eXBlcy1hbWJpZW50LmpzIiwiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbImNvcHlCYWdNYXRoSGVscGVycyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBrZXlFUSxtYWtlQ29weUJhZyxtdXN0TWF0Y2gsTSxnZXRDb3B5QmFnRW50cmllcyxiYWdJc1N1cGVyYmFnLGJhZ1VuaW9uLGJhZ0Rpc2pvaW50U3VidHJhY3Q7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wia2V5RVFcIiwgWyRo4oCNX2EgPT4gKGtleUVRID0gJGjigI1fYSldXSxbXCJtYWtlQ29weUJhZ1wiLCBbJGjigI1fYSA9PiAobWFrZUNvcHlCYWcgPSAkaOKAjV9hKV1dLFtcIm11c3RNYXRjaFwiLCBbJGjigI1fYSA9PiAobXVzdE1hdGNoID0gJGjigI1fYSldXSxbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXSxbXCJnZXRDb3B5QmFnRW50cmllc1wiLCBbJGjigI1fYSA9PiAoZ2V0Q29weUJhZ0VudHJpZXMgPSAkaOKAjV9hKV1dLFtcImJhZ0lzU3VwZXJiYWdcIiwgWyRo4oCNX2EgPT4gKGJhZ0lzU3VwZXJiYWcgPSAkaOKAjV9hKV1dLFtcImJhZ1VuaW9uXCIsIFskaOKAjV9hID0+IChiYWdVbmlvbiA9ICRo4oCNX2EpXV0sW1wiYmFnRGlzam9pbnRTdWJ0cmFjdFwiLCBbJGjigI1fYSA9PiAoYmFnRGlzam9pbnRTdWJ0cmFjdCA9ICRo4oCNX2EpXV1dXSxbXCIuLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZSB7Q29weUJhZ1ZhbHVlfSAqL1xuY29uc3QgZW1wdHk9bWFrZUNvcHlCYWcoW10pO1xuXG4vKipcbiAqIEB0eXBlIHtNYXRoSGVscGVyczxDb3B5QmFnVmFsdWU+fVxuICovXG5jb25zdCAgICAgICAgY29weUJhZ01hdGhIZWxwZXJzPWhhcmRlbih7XG5kb0NvZXJjZTooYmFnKT0+e1xubXVzdE1hdGNoKGJhZyxNLmJhZygpLCdiYWcgb2YgYW1vdW50Jyk7XG5yZXR1cm4gYmFnO1xuIH0sXG5kb01ha2VFbXB0eTooKT0+ZW1wdHksXG5kb0lzRW1wdHk6KGJhZyk9PmdldENvcHlCYWdFbnRyaWVzKGJhZykubGVuZ3RoPT09MCxcbmRvSXNHVEU6YmFnSXNTdXBlcmJhZyxcbmRvSXNFcXVhbDprZXlFUSxcbmRvQWRkOmJhZ1VuaW9uLFxuZG9TdWJ0cmFjdDpiYWdEaXNqb2ludFN1YnRyYWN0fSk7JGjigI1fb25jZS5jb3B5QmFnTWF0aEhlbHBlcnMoY29weUJhZ01hdGhIZWxwZXJzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjb3B5QmFnTWF0aEhlbHBlcnMiOlsiY29weUJhZ01hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJ2fiM6xBQAAsQUAADoAAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvbWF0aEhlbHBlcnMvY29weVNldE1hdGhIZWxwZXJzLmpzeyJpbXBvcnRzIjpbIi4uL3R5cGVzLWFtYmllbnQuanMiLCJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiY29weVNldE1hdGhIZWxwZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGtleUVRLG1ha2VDb3B5U2V0LG11c3RNYXRjaCxNLGdldENvcHlTZXRLZXlzLHNldElzU3VwZXJzZXQsc2V0RGlzam9pbnRVbmlvbixzZXREaXNqb2ludFN1YnRyYWN0OyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcImtleUVRXCIsIFskaOKAjV9hID0+IChrZXlFUSA9ICRo4oCNX2EpXV0sW1wibWFrZUNvcHlTZXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VDb3B5U2V0ID0gJGjigI1fYSldXSxbXCJtdXN0TWF0Y2hcIiwgWyRo4oCNX2EgPT4gKG11c3RNYXRjaCA9ICRo4oCNX2EpXV0sW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV0sW1wiZ2V0Q29weVNldEtleXNcIiwgWyRo4oCNX2EgPT4gKGdldENvcHlTZXRLZXlzID0gJGjigI1fYSldXSxbXCJzZXRJc1N1cGVyc2V0XCIsIFskaOKAjV9hID0+IChzZXRJc1N1cGVyc2V0ID0gJGjigI1fYSldXSxbXCJzZXREaXNqb2ludFVuaW9uXCIsIFskaOKAjV9hID0+IChzZXREaXNqb2ludFVuaW9uID0gJGjigI1fYSldXSxbXCJzZXREaXNqb2ludFN1YnRyYWN0XCIsIFskaOKAjV9hID0+IChzZXREaXNqb2ludFN1YnRyYWN0ID0gJGjigI1fYSldXV1dLFtcIi4uL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlIHtDb3B5U2V0VmFsdWV9ICovXG5jb25zdCBlbXB0eT1tYWtlQ29weVNldChbXSk7XG5cbi8qKlxuICogQHR5cGUge0NvcHlTZXRNYXRoSGVscGVyc31cbiAqL1xuY29uc3QgICAgICAgIGNvcHlTZXRNYXRoSGVscGVycz1oYXJkZW4oe1xuZG9Db2VyY2U6KHNldCk9Pntcbm11c3RNYXRjaChzZXQsTS5zZXQoKSwnc2V0IG9mIGFtb3VudCcpO1xucmV0dXJuIHNldDtcbiB9LFxuZG9NYWtlRW1wdHk6KCk9PmVtcHR5LFxuZG9Jc0VtcHR5OihzZXQpPT5nZXRDb3B5U2V0S2V5cyhzZXQpLmxlbmd0aD09PTAsXG5kb0lzR1RFOnNldElzU3VwZXJzZXQsXG5kb0lzRXF1YWw6a2V5RVEsXG5kb0FkZDpzZXREaXNqb2ludFVuaW9uLFxuZG9TdWJ0cmFjdDpzZXREaXNqb2ludFN1YnRyYWN0fSk7JGjigI1fb25jZS5jb3B5U2V0TWF0aEhlbHBlcnMoY29weVNldE1hdGhIZWxwZXJzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJjb3B5U2V0TWF0aEhlbHBlcnMiOlsiY29weVNldE1hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALYs5KAPBgAADwYAADYAAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi4vdHlwZXMtYW1iaWVudC5qcyIsIkBlbmRvL25hdCJdLCJleHBvcnRzIjpbIm5hdE1hdGhIZWxwZXJzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE5hdCxpc05hdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9uYXRcIiwgW1tcIk5hdFwiLCBbJGjigI1fYSA9PiAoTmF0ID0gJGjigI1fYSldXSxbXCJpc05hdFwiLCBbJGjigI1fYSA9PiAoaXNOYXQgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cbmNvbnN0e0ZhaWx9PWFzc2VydDtcbmNvbnN0IGVtcHR5PTBuO1xuXG4vKipcbiAqIEZ1bmdpYmxlIGRpZ2l0YWwgYXNzZXRzIHVzZSB0aGUgbmF0TWF0aEhlbHBlcnMgdG8gbWFuYWdlIGJhbGFuY2VzIC1cbiAqIHRoZSBvcGVyYXRpb25zIGFyZSBtZXJlbHkgYXJpdGhtZXRpYyBvbiBuYXR1cmFsLCBub24tbmVnYXRpdmVcbiAqIG51bWJlcnMuXG4gKlxuICogTmF0dXJhbCBudW1iZXJzIGFyZSB1c2VkIGZvciBmdW5naWJsZSBlcmlnaHRzIHN1Y2ggYXMgbW9uZXkgYmVjYXVzZVxuICogcm91bmRpbmcgaXNzdWVzIG1ha2UgZmxvYXRzIHByb2JsZW1hdGljLiBBbGwgb3BlcmF0aW9ucyBzaG91bGQgYmVcbiAqIGRvbmUgd2l0aCB0aGUgc21hbGxlc3Qgd2hvbGUgdW5pdCBzdWNoIHRoYXQgdGhlIE5hdE1hdGhIZWxwZXJzIG5ldmVyXG4gKiBkZWFscyB3aXRoIGZyYWN0aW9uYWwgcGFydHMuXG4gKlxuICogQHR5cGUge01hdGhIZWxwZXJzPE5hdFZhbHVlPn1cbiAqL1xuY29uc3QgICAgICAgIG5hdE1hdGhIZWxwZXJzPWhhcmRlbih7XG5kb0NvZXJjZToobmF0KT0+e1xuLyogVE9ETzogdGlnaHRlbiB0aGUgZGVmaW5pdGlvbiBvZiBOYXQgaW4gQGFnb3JpYy9uYXQgdG8gdGhyb3cgb24gYG51bWJlcmAqL1xuYXNzZXJ0LnR5cGVvZihuYXQsJ2JpZ2ludCcpO1xuaXNOYXQobmF0KXx8RmFpbCBgdmFsdWUgJHtuYXR9IG11c3QgYmUgYSBuYXR1cmFsIG51bWJlcmA7XG5yZXR1cm4gTmF0KG5hdCk7XG4gfSxcbmRvTWFrZUVtcHR5OigpPT5lbXB0eSxcbmRvSXNFbXB0eToobmF0KT0+bmF0PT09ZW1wdHksXG5kb0lzR1RFOihsZWZ0LHJpZ2h0KT0+bGVmdD49cmlnaHQsXG5kb0lzRXF1YWw6KGxlZnQscmlnaHQpPT5sZWZ0PT09cmlnaHQsXG4vKiBCaWdJbnRzIGRvbid0IG9ic2VydmFibHkgb3ZlcmZsb3cqL1xuZG9BZGQ6KGxlZnQscmlnaHQpPT5sZWZ0K3JpZ2h0LFxuZG9TdWJ0cmFjdDoobGVmdCxyaWdodCk9Pk5hdChsZWZ0LXJpZ2h0KX0pOyRo4oCNX29uY2UubmF0TWF0aEhlbHBlcnMobmF0TWF0aEhlbHBlcnMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im5hdE1hdGhIZWxwZXJzIjpbIm5hdE1hdGhIZWxwZXJzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJGAua5/BwAAfwcAADYAAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvbWF0aEhlbHBlcnMvc2V0TWF0aEhlbHBlcnMuanN7ImltcG9ydHMiOlsiLi4vdHlwZXMtYW1iaWVudC5qcyIsIkBhZ29yaWMvc3RvcmUiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsic2V0TWF0aEhlbHBlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFzc1N0eWxlT2YsYXNzZXJ0S2V5LGVsZW1lbnRzSXNTdXBlcnNldCxlbGVtZW50c0Rpc2pvaW50VW5pb24sZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0LGNvZXJjZVRvRWxlbWVudHMsZWxlbWVudHNDb21wYXJlOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJhc3NlcnRLZXlcIiwgWyRo4oCNX2EgPT4gKGFzc2VydEtleSA9ICRo4oCNX2EpXV0sW1wiZWxlbWVudHNJc1N1cGVyc2V0XCIsIFskaOKAjV9hID0+IChlbGVtZW50c0lzU3VwZXJzZXQgPSAkaOKAjV9hKV1dLFtcImVsZW1lbnRzRGlzam9pbnRVbmlvblwiLCBbJGjigI1fYSA9PiAoZWxlbWVudHNEaXNqb2ludFVuaW9uID0gJGjigI1fYSldXSxbXCJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3RcIiwgWyRo4oCNX2EgPT4gKGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCA9ICRo4oCNX2EpXV0sW1wiY29lcmNlVG9FbGVtZW50c1wiLCBbJGjigI1fYSA9PiAoY29lcmNlVG9FbGVtZW50cyA9ICRo4oCNX2EpXV0sW1wiZWxlbWVudHNDb21wYXJlXCIsIFskaOKAjV9hID0+IChlbGVtZW50c0NvbXBhcmUgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuLyogT3BlcmF0aW9ucyBmb3IgYXJyYXlzIHdpdGggdW5pcXVlIG9iamVjdHMgaWRlbnRpZnlpbmcgYW5kIHByb3ZpZGluZyovXG4vKiBpbmZvcm1hdGlvbiBhYm91dCBkaWdpdGFsIGFzc2V0cy4gVXNlZCBmb3IgWm9lIGludml0ZXMuKi9cbi8qKiBAdHlwZSB7U2V0VmFsdWV9ICovXG5jb25zdCBlbXB0eT1oYXJkZW4oW10pO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFJlcGxhY2UgYXJyYXktYmFzZWQgU2V0TWF0aCB3aXRoIENvcHlTZXQtYmFzZWQgQ29weVNldE1hdGhcbiAqIEB0eXBlIHtTZXRNYXRoSGVscGVyc31cbiAqL1xuY29uc3QgICAgICAgIHNldE1hdGhIZWxwZXJzPWhhcmRlbih7XG5kb0NvZXJjZToobGlzdCk9Pntcbmxpc3Q9Y29lcmNlVG9FbGVtZW50cyhsaXN0KTtcbi8qIEFzc2VydCB0aGF0IGxpc3QgY29udGFpbnMgb25seSovXG4vKiAqIHBhc3MtYnktY29weSBwcmltaXRpdmVzLCovXG4vKiAqIHBhc3MtYnktY29weSBjb250YWluZXJzIGNvbnRhaW5pbmcga2V5cywqL1xuLyogKiByZW1vdGFibGVzLiovXG5hc3NlcnRLZXkobGlzdCk7XG5yZXR1cm4gbGlzdDtcbiB9LFxuZG9NYWtlRW1wdHk6KCk9PmVtcHR5LFxuZG9Jc0VtcHR5OihsaXN0KT0+cGFzc1N0eWxlT2YobGlzdCk9PT0nY29weUFycmF5JyYmbGlzdC5sZW5ndGg9PT0wLFxuZG9Jc0dURTplbGVtZW50c0lzU3VwZXJzZXQsXG5kb0lzRXF1YWw6KHgseSk9PmVsZW1lbnRzQ29tcGFyZSh4LHkpPT09MCxcbmRvQWRkOmVsZW1lbnRzRGlzam9pbnRVbmlvbixcbmRvU3VidHJhY3Q6ZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0fSk7JGjigI1fb25jZS5zZXRNYXRoSGVscGVycyhzZXRNYXRoSGVscGVycyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsic2V0TWF0aEhlbHBlcnMiOlsic2V0TWF0aEhlbHBlcnMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAACwjSFIwEAACMBAAAIwAAAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9wYXltZW50LmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3ZhdC1kYXRhIl0sImV4cG9ydHMiOlsicHJlcGFyZVBheW1lbnRLaW5kIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGluaXRFbXB0eSxwcmVwYXJlRXhvQ2xhc3M7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiaW5pdEVtcHR5XCIsIFskaOKAjV9hID0+IChpbml0RW1wdHkgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wicHJlcGFyZUV4b0NsYXNzXCIsIFskaOKAjV9hID0+IChwcmVwYXJlRXhvQ2xhc3MgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvdmF0LWRhdGEnKS5CYWdnYWdlfSBCYWdnYWdlICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gaXNzdWVyQmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7QnJhbmQ8Sz59IGJyYW5kXG4gKiBAcGFyYW0ge0ludGVyZmFjZUd1YXJkfSBQYXltZW50SVxuICogQHJldHVybnMgeygpID0+IFBheW1lbnQ8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBwcmVwYXJlUGF5bWVudEtpbmQ9KGlzc3VlckJhZ2dhZ2UsbmFtZSxicmFuZCxQYXltZW50SSk9PntcbmNvbnN0IG1ha2VQYXltZW50PXByZXBhcmVFeG9DbGFzcyhcbmlzc3VlckJhZ2dhZ2UsXG4gYCR7bmFtZX0gcGF5bWVudGAsXG5QYXltZW50SSxcbmluaXRFbXB0eSxcbntcbmdldEFsbGVnZWRCcmFuZCgpe1xucmV0dXJuIGJyYW5kO1xuIH19KTtcblxuXG5yZXR1cm4gbWFrZVBheW1lbnQ7XG4gfTskaOKAjV9vbmNlLnByZXBhcmVQYXltZW50S2luZChwcmVwYXJlUGF5bWVudEtpbmQpO1xuaGFyZGVuKHByZXBhcmVQYXltZW50S2luZCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZVBheW1lbnRLaW5kIjpbInByZXBhcmVQYXltZW50S2luZCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABBSduYCT4AAAk+AAApAAAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL3BheW1lbnRMZWRnZXIuanN7ImltcG9ydHMiOlsiLi9hbW91bnRNYXRoLmpzIiwiLi9sZWdhY3ktcGF5bWVudC1oZWxwZXJzLmpzIiwiLi9wYXltZW50LmpzIiwiLi9wdXJzZS5qcyIsIi4vdHlwZUd1YXJkcy5qcyIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3N0b3JlL2V4cG9ydGVkLmpzIiwiQGFnb3JpYy92YXQtZGF0YSIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsicHJlcGFyZVBheW1lbnRMZWRnZXIiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaXNQcm9taXNlLG11c3RNYXRjaCxNLGtleUVRLHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlLHByZXBhcmVFeG8scHJvdmlkZSxBbW91bnRNYXRoLHByZXBhcmVQYXltZW50S2luZCxwcmVwYXJlUHVyc2VLaW5kLEJyYW5kSSxtYWtlSXNzdWVySW50ZXJmYWNlcyxjbGFpbSxjb21iaW5lLHNwbGl0LHNwbGl0TWFueTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsIFskaOKAjV9hID0+IChpc1Byb21pc2UgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dLFtcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dLFtcImtleUVRXCIsIFskaOKAjV9hID0+IChrZXlFUSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUgPSAkaOKAjV9hKV1dLFtcInByZXBhcmVFeG9cIiwgWyRo4oCNX2EgPT4gKHByZXBhcmVFeG8gPSAkaOKAjV9hKV1dLFtcInByb3ZpZGVcIiwgWyRo4oCNX2EgPT4gKHByb3ZpZGUgPSAkaOKAjV9hKV1dXV0sW1wiLi9hbW91bnRNYXRoLmpzXCIsIFtbXCJBbW91bnRNYXRoXCIsIFskaOKAjV9hID0+IChBbW91bnRNYXRoID0gJGjigI1fYSldXV1dLFtcIi4vcGF5bWVudC5qc1wiLCBbW1wicHJlcGFyZVBheW1lbnRLaW5kXCIsIFskaOKAjV9hID0+IChwcmVwYXJlUGF5bWVudEtpbmQgPSAkaOKAjV9hKV1dXV0sW1wiLi9wdXJzZS5qc1wiLCBbW1wicHJlcGFyZVB1cnNlS2luZFwiLCBbJGjigI1fYSA9PiAocHJlcGFyZVB1cnNlS2luZCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlL2V4cG9ydGVkLmpzXCIsIFtdXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIkJyYW5kSVwiLCBbJGjigI1fYSA9PiAoQnJhbmRJID0gJGjigI1fYSldXSxbXCJtYWtlSXNzdWVySW50ZXJmYWNlc1wiLCBbJGjigI1fYSA9PiAobWFrZUlzc3VlckludGVyZmFjZXMgPSAkaOKAjV9hKV1dXV0sW1wiLi9sZWdhY3ktcGF5bWVudC1oZWxwZXJzLmpzXCIsIFtbXCJjbGFpbVwiLCBbJGjigI1fYSA9PiAoY2xhaW0gPSAkaOKAjV9hKV1dLFtcImNvbWJpbmVcIiwgWyRo4oCNX2EgPT4gKGNvbWJpbmUgPSAkaOKAjV9hKV1dLFtcInNwbGl0XCIsIFskaOKAjV9hID0+IChzcGxpdCA9ICRo4oCNX2EpXV0sW1wic3BsaXRNYW55XCIsIFskaOKAjV9hID0+IChzcGxpdE1hbnkgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGFnb3JpYy92YXQtZGF0YScpLkJhZ2dhZ2V9IEJhZ2dhZ2UgKi9cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG4vKipcbiAqIEBwYXJhbSB7QnJhbmR9IGJyYW5kXG4gKiBAcGFyYW0ge0Fzc2V0S2luZH0gYXNzZXRLaW5kXG4gKiBAcGFyYW0ge01hdGNoZXJ9IGVsZW1lbnRTaGFwZVxuICovXG5jb25zdCBhbW91bnRTaGFwZUZyb21FbGVtZW50U2hhcGU9KGJyYW5kLGFzc2V0S2luZCxlbGVtZW50U2hhcGUpPT57XG5sZXQgdmFsdWVTaGFwZTtcbnN3aXRjaChhc3NldEtpbmQpe1xuY2FzZSduYXQnOntcbnZhbHVlU2hhcGU9TS5uYXQoKTtcbmVsZW1lbnRTaGFwZT09PXVuZGVmaW5lZHx8XG5GYWlsIGBGdW5naWJsZSBhc3NldHMgY2Fubm90IGhhdmUgYW4gZWxlbWVudFNoYXBlOiAke3EoZWxlbWVudFNoYXBlKX1gO1xuYnJlYWs7XG4gfVxuY2FzZSdzZXQnOntcbmlmKGVsZW1lbnRTaGFwZT09PXVuZGVmaW5lZCl7XG52YWx1ZVNoYXBlPU0uYXJyYXlPZihNLmtleSgpKTtcbiB9ZWxzZXtcbnZhbHVlU2hhcGU9TS5hcnJheU9mKE0uYW5kKE0ua2V5KCksZWxlbWVudFNoYXBlKSk7XG4gfVxuYnJlYWs7XG4gfVxuY2FzZSdjb3B5U2V0Jzp7XG5pZihlbGVtZW50U2hhcGU9PT11bmRlZmluZWQpe1xudmFsdWVTaGFwZT1NLnNldCgpO1xuIH1lbHNle1xudmFsdWVTaGFwZT1NLnNldE9mKGVsZW1lbnRTaGFwZSk7XG4gfVxuYnJlYWs7XG4gfVxuY2FzZSdjb3B5QmFnJzp7XG5pZihlbGVtZW50U2hhcGU9PT11bmRlZmluZWQpe1xudmFsdWVTaGFwZT1NLmJhZygpO1xuIH1lbHNle1xudmFsdWVTaGFwZT1NLmJhZ09mKGVsZW1lbnRTaGFwZSk7XG4gfVxuYnJlYWs7XG4gfVxuZGVmYXVsdDp7XG5GYWlsIGB1bmV4cGVjdGVkIGFzc2V0IGtpbmQgJHtxKGFzc2V0S2luZCl9YDtcbiB9fVxuXG5cbmNvbnN0IGFtb3VudFNoYXBlPWhhcmRlbih7XG5icmFuZCwvKiBtYXRjaGVzIG9ubHkgdGhpcyBleGFjdCBicmFuZCovXG52YWx1ZTp2YWx1ZVNoYXBlfSk7XG5cbnJldHVybiBhbW91bnRTaGFwZTtcbiB9O1xuXG4vKipcbiAqIE1ha2UgdGhlIHBheW1lbnRMZWRnZXIsIHRoZSBzb3VyY2Ugb2YgdHJ1dGggZm9yIHRoZSBiYWxhbmNlcyBvZlxuICogcGF5bWVudHMuIEFsbCBtaW50aW5nIGFuZCB0cmFuc2ZlciBhdXRob3JpdHkgb3JpZ2luYXRlcyBoZXJlLlxuICpcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGlzc3VlckJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge0t9IGFzc2V0S2luZFxuICogQHBhcmFtIHtEaXNwbGF5SW5mbzxLPn0gZGlzcGxheUluZm9cbiAqIEBwYXJhbSB7UGF0dGVybn0gZWxlbWVudFNoYXBlXG4gKiBAcGFyYW0ge1NodXRkb3duV2l0aEZhaWx1cmV9IFtvcHRTaHV0ZG93bldpdGhGYWlsdXJlXVxuICogQHJldHVybnMge1BheW1lbnRMZWRnZXI8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBwcmVwYXJlUGF5bWVudExlZGdlcj0oXG5pc3N1ZXJCYWdnYWdlLFxubmFtZSxcbmFzc2V0S2luZCxcbmRpc3BsYXlJbmZvLFxuZWxlbWVudFNoYXBlLFxub3B0U2h1dGRvd25XaXRoRmFpbHVyZT11bmRlZmluZWQpPT5cbntcbi8qKiBAdHlwZSB7QnJhbmQ8Sz59ICovXG4vKiBAdHMtZXhwZWN0LWVycm9yIFhYWCBjYWxsV2hlbiovXG5jb25zdCBicmFuZD1wcmVwYXJlRXhvKGlzc3VlckJhZ2dhZ2UsIGAke25hbWV9IGJyYW5kYCxCcmFuZEkse1xuaXNNeUlzc3VlcihhbGxlZ2VkSXNzdWVyKXtcbi8qIEJyYW5kSSBkZWxheXMgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBgYWxsZWdlZElzc3VlcmAgaXMgYSBSZW1vdGFibGUqL1xucmV0dXJuIGFsbGVnZWRJc3N1ZXI9PT1pc3N1ZXI7XG4gfSxcbmdldEFsbGVnZWROYW1lKCl7XG5yZXR1cm4gbmFtZTtcbiB9LFxuLyogR2l2ZSBpbmZvcm1hdGlvbiB0byBVSSBvbiBob3cgdG8gZGlzcGxheSB0aGUgYW1vdW50LiovXG5nZXREaXNwbGF5SW5mbygpe1xucmV0dXJuIGRpc3BsYXlJbmZvO1xuIH0sXG5nZXRBbW91bnRTaGFwZSgpe1xucmV0dXJuIGFtb3VudFNoYXBlO1xuIH19KTtcblxuXG5jb25zdCBhbW91bnRTaGFwZT1hbW91bnRTaGFwZUZyb21FbGVtZW50U2hhcGUoXG5icmFuZCxcbmFzc2V0S2luZCxcbmVsZW1lbnRTaGFwZSk7XG5cblxuY29uc3R7SXNzdWVySSxNaW50SSxQYXltZW50SSxQdXJzZUlLaXR9PW1ha2VJc3N1ZXJJbnRlcmZhY2VzKFxuYnJhbmQsXG5hc3NldEtpbmQsXG5hbW91bnRTaGFwZSk7XG5cblxuY29uc3QgbWFrZVBheW1lbnQ9cHJlcGFyZVBheW1lbnRLaW5kKGlzc3VlckJhZ2dhZ2UsbmFtZSxicmFuZCxQYXltZW50SSk7XG5cbi8qKiBAdHlwZSB7U2h1dGRvd25XaXRoRmFpbHVyZX0gKi9cbmNvbnN0IHNodXRkb3duTGVkZ2VyV2l0aEZhaWx1cmU9KHJlYXNvbik9Pntcbi8qIFRPRE8gVGhpcyBzaG91bGQgYWxzbyBkZXN0cm95IGxlZGdlciBzdGF0ZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzQzNCovXG5pZihvcHRTaHV0ZG93bldpdGhGYWlsdXJlIT09dW5kZWZpbmVkKXtcbnRyeXtcbm9wdFNodXRkb3duV2l0aEZhaWx1cmUocmVhc29uKTtcbiB9Y2F0Y2goZXJySW5TaHV0ZG93bil7XG5hc3NlcnQubm90ZShlcnJJblNodXRkb3duLFggYENhdXNlZCBieTogJHtyZWFzb259YCk7XG50aHJvdyBlcnJJblNodXRkb3duO1xuIH1cbiB9XG50aHJvdyByZWFzb247XG4gfTtcblxuLyoqIEB0eXBlIHtXZWFrTWFwU3RvcmU8UGF5bWVudCwgQW1vdW50Pn0gKi9cbmNvbnN0IHBheW1lbnRMZWRnZXI9cHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUoXG5pc3N1ZXJCYWdnYWdlLFxuJ3BheW1lbnRMZWRnZXInLFxue3ZhbHVlU2hhcGU6YW1vdW50U2hhcGV9KTtcblxuXG4vKipcbiAqIEEgd2l0aGRyYXduIGxpdmUgcGF5bWVudCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlY292ZXJ5IHNldCBvZlxuICogdGhlIHB1cnNlIGl0IHdhcyB3aXRoZHJhd24gZnJvbS4gTGV0J3MgY2FsbCB0aGVzZSBcInJlY292ZXJhYmxlXCJcbiAqIHBheW1lbnRzLiBBbGwgcmVjb3ZlcmFibGUgcGF5bWVudHMgYXJlIGxpdmUsIGJ1dCBub3QgYWxsIGxpdmVcbiAqIHBheW1lbnRzIGFyZSByZWNvdmVyYWJsZS4gV2UgZG8gdGhlIGJvb2trZWVwaW5nIGZvciBwYXltZW50IHJlY292ZXJ5XG4gKiB3aXRoIHRoaXMgd2Vha21hcCBmcm9tIHJlY292ZXJhYmxlIHBheW1lbnRzIHRvIHRoZSByZWNvdmVyeSBzZXQgdGhleSBhcmVcbiAqIGluLlxuICogQSBidW5jaCBvZiBpbnRlcmVzdGluZyBpbnZhcmlhbnRzIGhlcmU6XG4gKiAgICAqIEV2ZXJ5IHBheW1lbnQgdGhhdCBpcyBhIGtleSBpbiB0aGUgb3V0ZXIgYHBheW1lbnRSZWNvdmVyeVNldHNgXG4gKiAgICAgIHdlYWtNYXAgaXMgYWxzbyBpbiB0aGUgcmVjb3Zlcnkgc2V0IGluZGV4ZWQgYnkgdGhhdCBwYXltZW50LlxuICogICAgKiBJbXBsaWVkIGJ5IHRoZSBhYm92ZSBidXQgd29ydGggc3RhdGluZzogdGhlIHBheW1lbnQgaXMgb25seVxuICogICAgICBpbiBhdCBtb3N0IG9uZSByZWNvdmVyeSBzZXQuXG4gKiAgICAqIEEgcmVjb3Zlcnkgc2V0IG9ubHkgY29udGFpbnMgc3VjaCBwYXltZW50cy5cbiAqICAgICogRXZlcnkgcHVyc2UgaXMgYXNzb2NpYXRlZCB3aXRoIGV4YWN0bHkgb25lIHJlY292ZXJ5IHNldCB1bmlxdWUgdG9cbiAqICAgICAgaXQuXG4gKiAgICAqIEEgcHVyc2UncyByZWNvdmVyeSBzZXQgb25seSBjb250YWlucyBwYXltZW50cyB3aXRoZHJhd24gZnJvbVxuICogICAgICB0aGF0IHB1cnNlIGFuZCBub3QgeWV0IGNvbnN1bWVkLlxuICpcbiAqIEB0eXBlIHtXZWFrTWFwU3RvcmU8UGF5bWVudCwgU2V0U3RvcmU8UGF5bWVudD4+fVxuICovXG5jb25zdCBwYXltZW50UmVjb3ZlcnlTZXRzPXByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKFxuaXNzdWVyQmFnZ2FnZSxcbidwYXltZW50UmVjb3ZlcnlTZXRzJyk7XG5cblxuLyoqXG4gKiBUbyBtYWludGFpbiB0aGUgaW52YXJpYW50cyBsaXN0ZWQgaW4gdGhlIGBwYXltZW50UmVjb3ZlcnlTZXRzYCBjb21tZW50LFxuICogYGluaXRQYXltZW50YCBzaG91bGQgY29udGFpbiB0aGUgb25seVxuICogY2FsbCB0byBgcGF5bWVudExlZGdlci5pbml0YC5cbiAqXG4gKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnRcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnRcbiAqIEBwYXJhbSB7U2V0U3RvcmU8UGF5bWVudD59IFtvcHRSZWNvdmVyeVNldF1cbiAqL1xuY29uc3QgaW5pdFBheW1lbnQ9KHBheW1lbnQsYW1vdW50LG9wdFJlY292ZXJ5U2V0PXVuZGVmaW5lZCk9PntcbmlmKG9wdFJlY292ZXJ5U2V0IT09dW5kZWZpbmVkKXtcbm9wdFJlY292ZXJ5U2V0LmFkZChwYXltZW50KTtcbnBheW1lbnRSZWNvdmVyeVNldHMuaW5pdChwYXltZW50LG9wdFJlY292ZXJ5U2V0KTtcbiB9XG5wYXltZW50TGVkZ2VyLmluaXQocGF5bWVudCxhbW91bnQpO1xuIH07XG5cbi8qKlxuICogVG8gbWFpbnRhaW4gdGhlIGludmFyaWFudHMgbGlzdGVkIGluIHRoZSBgcGF5bWVudFJlY292ZXJ5U2V0c2AgY29tbWVudCxcbiAqIGBkZWxldGVQYXltZW50YCBzaG91bGQgY29udGFpbiB0aGUgb25seVxuICogY2FsbCB0byBgcGF5bWVudExlZGdlci5kZWxldGVgLlxuICpcbiAqIEBwYXJhbSB7UGF5bWVudH0gcGF5bWVudFxuICovXG5jb25zdCBkZWxldGVQYXltZW50PShwYXltZW50KT0+e1xucGF5bWVudExlZGdlci5kZWxldGUocGF5bWVudCk7XG5pZihwYXltZW50UmVjb3ZlcnlTZXRzLmhhcyhwYXltZW50KSl7XG5jb25zdCByZWNvdmVyeVNldD1wYXltZW50UmVjb3ZlcnlTZXRzLmdldChwYXltZW50KTtcbnBheW1lbnRSZWNvdmVyeVNldHMuZGVsZXRlKHBheW1lbnQpO1xucmVjb3ZlcnlTZXQuZGVsZXRlKHBheW1lbnQpO1xuIH1cbiB9O1xuXG4vKiogQHR5cGUgeyhsZWZ0OiBBbW91bnQsIHJpZ2h0OiBBbW91bnQpID0+IEFtb3VudCB9ICovXG5jb25zdCBhZGQ9KGxlZnQscmlnaHQpPT5BbW91bnRNYXRoLmFkZChsZWZ0LHJpZ2h0LGJyYW5kKTtcbi8qKiBAdHlwZSB7KGxlZnQ6IEFtb3VudCwgcmlnaHQ6IEFtb3VudCkgPT4gQW1vdW50IH0gKi9cbmNvbnN0IHN1YnRyYWN0PShsZWZ0LHJpZ2h0KT0+QW1vdW50TWF0aC5zdWJ0cmFjdChsZWZ0LHJpZ2h0LGJyYW5kKTtcbi8qKiBAdHlwZSB7KGFsbGVnZWRBbW91bnQ6IEFtb3VudCkgPT4gQW1vdW50fSAqL1xuY29uc3QgY29lcmNlPShhbGxlZ2VkQW1vdW50KT0+QW1vdW50TWF0aC5jb2VyY2UoYnJhbmQsYWxsZWdlZEFtb3VudCk7XG4vKiogQHR5cGUgeyhsZWZ0OiBBbW91bnQsIHJpZ2h0OiBBbW91bnQpID0+IGJvb2xlYW4gfSAqL1xuXG4vKipcbiAqIE1ldGhvZHMgbGlrZSBkZXBvc2l0KCkgaGF2ZSBhbiBvcHRpb25hbCBzZWNvbmQgcGFyYW1ldGVyXG4gKiBgb3B0QW1vdW50U2hhcGVgXG4gKiB3aGljaCwgaWYgcHJlc2VudCwgaXMgc3VwcG9zZWQgdG8gbWF0Y2ggdGhlIGJhbGFuY2Ugb2YgdGhlXG4gKiBwYXltZW50LiBUaGlzIGhlbHBlciBmdW5jdGlvbiBkb2VzIHRoYXQgY2hlY2suXG4gKlxuICogTm90ZTogYG9wdEFtb3VudFNoYXBlYCBpcyB1c2VyLXN1cHBsaWVkIHdpdGggbm8gcHJldmlvdXMgdmFsaWRhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0Ftb3VudH0gcGF5bWVudEJhbGFuY2VcbiAqIEBwYXJhbSB7UGF0dGVybn0gW29wdEFtb3VudFNoYXBlXVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0IGFzc2VydEFtb3VudENvbnNpc3RlbnQ9KHBheW1lbnRCYWxhbmNlLG9wdEFtb3VudFNoYXBlKT0+e1xuaWYob3B0QW1vdW50U2hhcGUhPT11bmRlZmluZWQpe1xubXVzdE1hdGNoKHBheW1lbnRCYWxhbmNlLG9wdEFtb3VudFNoYXBlLCdhbW91bnQnKTtcbiB9XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnRcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCBhc3NlcnRMaXZlUGF5bWVudD0ocGF5bWVudCk9PntcbnBheW1lbnRMZWRnZXIuaGFzKHBheW1lbnQpfHxcbkZhaWwgYCR7cGF5bWVudH0gd2FzIG5vdCBhIGxpdmUgcGF5bWVudCBmb3IgYnJhbmQgJHtxKFxuYnJhbmQpXG4gfS4gSXQgY291bGQgYmUgYSB1c2VkLXVwIHBheW1lbnQsIGEgcGF5bWVudCBmb3IgYW5vdGhlciBicmFuZCwgb3IgaXQgbWlnaHQgbm90IGJlIGEgcGF5bWVudCBhdCBhbGwuYDtcbiB9O1xuXG4vKipcbiAqIFVzZWQgYnkgdGhlIHB1cnNlIGNvZGUgdG8gaW1wbGVtZW50IHB1cnNlLmRlcG9zaXRcbiAqXG4gKiBAcGFyYW0ge0Ftb3VudH0gY3VycmVudEJhbGFuY2UgLSB0aGUgY3VycmVudCBiYWxhbmNlIG9mIHRoZSBwdXJzZVxuICogYmVmb3JlIGEgZGVwb3NpdFxuICogQHBhcmFtIHsobmV3UHVyc2VCYWxhbmNlOiBBbW91bnQpID0+IHZvaWR9IHVwZGF0ZVB1cnNlQmFsYW5jZSAtXG4gKiBjb21taXQgdGhlIHB1cnNlIGJhbGFuY2VcbiAqIEBwYXJhbSB7UGF5bWVudH0gc3JjUGF5bWVudFxuICogQHBhcmFtIHtQYXR0ZXJufSBbb3B0QW1vdW50U2hhcGVdXG4gKiBAcmV0dXJucyB7QW1vdW50fVxuICovXG5jb25zdCBkZXBvc2l0SW50ZXJuYWw9KFxuY3VycmVudEJhbGFuY2UsXG51cGRhdGVQdXJzZUJhbGFuY2UsXG5zcmNQYXltZW50LFxub3B0QW1vdW50U2hhcGU9dW5kZWZpbmVkKT0+XG57XG4haXNQcm9taXNlKHNyY1BheW1lbnQpfHxcbmFzc2VydC5mYWlsKFxuIGBkZXBvc2l0IGRvZXMgbm90IGFjY2VwdCBwcm9taXNlcyBhcyBmaXJzdCBhcmd1bWVudC4gSW5zdGVhZCBvZiBwYXNzaW5nIHRoZSBwcm9taXNlIChkZXBvc2l0KHBheW1lbnRQcm9taXNlKSksIGNvbnNpZGVyIHVud3JhcHBpbmcgdGhlIHByb21pc2UgZmlyc3Q6IEUud2hlbihwYXltZW50UHJvbWlzZSwgKGFjdHVhbFBheW1lbnQgPT4gZGVwb3NpdChhY3R1YWxQYXltZW50KSlgLFxuVHlwZUVycm9yKTtcblxuYXNzZXJ0TGl2ZVBheW1lbnQoc3JjUGF5bWVudCk7XG5jb25zdCBzcmNQYXltZW50QmFsYW5jZT1wYXltZW50TGVkZ2VyLmdldChzcmNQYXltZW50KTtcbmFzc2VydEFtb3VudENvbnNpc3RlbnQoc3JjUGF5bWVudEJhbGFuY2Usb3B0QW1vdW50U2hhcGUpO1xuY29uc3QgbmV3UHVyc2VCYWxhbmNlPWFkZChzcmNQYXltZW50QmFsYW5jZSxjdXJyZW50QmFsYW5jZSk7XG50cnl7XG4vKiBDT01NSVQgUE9JTlQqL1xuLyogTW92ZSB0aGUgYXNzZXRzIGluIGBzcmNQYXltZW50YCBpbnRvIHRoaXMgcHVyc2UsIHVzaW5nIHVwIHRoZSovXG4vKiBzb3VyY2UgcGF5bWVudCwgc3VjaCB0aGF0IHRvdGFsIGFzc2V0cyBhcmUgY29uc2VydmVkLiovXG5kZWxldGVQYXltZW50KHNyY1BheW1lbnQpO1xudXBkYXRlUHVyc2VCYWxhbmNlKG5ld1B1cnNlQmFsYW5jZSk7XG4gfWNhdGNoKGVycil7XG5zaHV0ZG93bkxlZGdlcldpdGhGYWlsdXJlKGVycik7XG50aHJvdyBlcnI7XG4gfVxucmV0dXJuIHNyY1BheW1lbnRCYWxhbmNlO1xuIH07XG5cbi8qKlxuICogVXNlZCBieSB0aGUgcHVyc2UgY29kZSB0byBpbXBsZW1lbnQgcHVyc2Uud2l0aGRyYXdcbiAqXG4gKiBAcGFyYW0ge0Ftb3VudH0gY3VycmVudEJhbGFuY2UgLSB0aGUgY3VycmVudCBiYWxhbmNlIG9mIHRoZSBwdXJzZVxuICogYmVmb3JlIGEgd2l0aGRyYXdhbFxuICogQHBhcmFtIHsobmV3UHVyc2VCYWxhbmNlOiBBbW91bnQpID0+IHZvaWR9IHVwZGF0ZVB1cnNlQmFsYW5jZSAtXG4gKiBjb21taXQgdGhlIHB1cnNlIGJhbGFuY2VcbiAqIEBwYXJhbSB7QW1vdW50fSBhbW91bnQgLSB0aGUgYW1vdW50IHRvIGJlIHdpdGhkcmF3blxuICogQHBhcmFtIHtTZXRTdG9yZTxQYXltZW50Pn0gcmVjb3ZlcnlTZXRcbiAqIEByZXR1cm5zIHtQYXltZW50fVxuICovXG5jb25zdCB3aXRoZHJhd0ludGVybmFsPShcbmN1cnJlbnRCYWxhbmNlLFxudXBkYXRlUHVyc2VCYWxhbmNlLFxuYW1vdW50LFxucmVjb3ZlcnlTZXQpPT5cbntcbmFtb3VudD1jb2VyY2UoYW1vdW50KTtcbkFtb3VudE1hdGguaXNHVEUoY3VycmVudEJhbGFuY2UsYW1vdW50KXx8XG5GYWlsIGBXaXRoZHJhd2FsIG9mICR7YW1vdW50fSBmYWlsZWQgYmVjYXVzZSB0aGUgcHVyc2Ugb25seSBjb250YWluZWQgJHtjdXJyZW50QmFsYW5jZX1gO1xuY29uc3QgbmV3UHVyc2VCYWxhbmNlPXN1YnRyYWN0KGN1cnJlbnRCYWxhbmNlLGFtb3VudCk7XG5cbmNvbnN0IHBheW1lbnQ9bWFrZVBheW1lbnQoKTtcbnRyeXtcbi8qIENPTU1JVCBQT0lOVCBNb3ZlIHRoZSB3aXRoZHJhd24gYXNzZXRzIGZyb20gdGhpcyBwdXJzZSBpbnRvKi9cbi8qIHBheW1lbnQuIFRvdGFsIGFzc2V0cyBtdXN0IHJlbWFpbiBjb25zZXJ2ZWQuKi9cbnVwZGF0ZVB1cnNlQmFsYW5jZShuZXdQdXJzZUJhbGFuY2UpO1xuaW5pdFBheW1lbnQocGF5bWVudCxhbW91bnQscmVjb3ZlcnlTZXQpO1xuIH1jYXRjaChlcnIpe1xuc2h1dGRvd25MZWRnZXJXaXRoRmFpbHVyZShlcnIpO1xudGhyb3cgZXJyO1xuIH1cbnJldHVybiBwYXltZW50O1xuIH07XG5cbmNvbnN0IG1ha2VFbXB0eVB1cnNlPXByZXBhcmVQdXJzZUtpbmQoXG5pc3N1ZXJCYWdnYWdlLFxubmFtZSxcbmFzc2V0S2luZCxcbmJyYW5kLFxuUHVyc2VJS2l0LFxuaGFyZGVuKHtcbmRlcG9zaXRJbnRlcm5hbCxcbndpdGhkcmF3SW50ZXJuYWx9KSk7XG5cblxuXG4vKiogQHR5cGUge0lzc3VlcjxLPn0gKi9cbi8qIEB0cy1leHBlY3QtZXJyb3IgY2FzdCBkdWUgdG8gY2FsbFdoZW4gZGlzY3JlcGFuY3kqL1xuY29uc3QgaXNzdWVyPXByZXBhcmVFeG8oaXNzdWVyQmFnZ2FnZSwgYCR7bmFtZX0gaXNzdWVyYCxJc3N1ZXJJLHtcbmdldEJyYW5kKCl7XG5yZXR1cm4gYnJhbmQ7XG4gfSxcbmdldEFsbGVnZWROYW1lKCl7XG5yZXR1cm4gbmFtZTtcbiB9LFxuZ2V0QXNzZXRLaW5kKCl7XG5yZXR1cm4gYXNzZXRLaW5kO1xuIH0sXG5nZXREaXNwbGF5SW5mbygpe1xucmV0dXJuIGRpc3BsYXlJbmZvO1xuIH0sXG5tYWtlRW1wdHlQdXJzZSgpe1xucmV0dXJuIG1ha2VFbXB0eVB1cnNlKCk7XG4gfSxcbi8qKiBAcGFyYW0ge1BheW1lbnR9IHBheW1lbnQgYXdhaXRlZCBieSBjYWxsV2hlbiAqL1xuaXNMaXZlKHBheW1lbnQpe1xuLyogSXNzdWVySSBkZWxheXMgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBgcGF5bWVudGAgaXMgYSBSZW1vdGFibGUqL1xucmV0dXJuIHBheW1lbnRMZWRnZXIuaGFzKHBheW1lbnQpO1xuIH0sXG4vKiogQHBhcmFtIHtQYXltZW50fSBwYXltZW50IGF3YWl0ZWQgYnkgY2FsbFdoZW4gKi9cbmdldEFtb3VudE9mKHBheW1lbnQpe1xuLyogSXNzdWVySSBkZWxheXMgY2FsbGluZyB0aGlzIG1ldGhvZCB1bnRpbCBgcGF5bWVudGAgaXMgYSBSZW1vdGFibGUqL1xuYXNzZXJ0TGl2ZVBheW1lbnQocGF5bWVudCk7XG5yZXR1cm4gcGF5bWVudExlZGdlci5nZXQocGF5bWVudCk7XG4gfSxcbi8qKlxuICogQHBhcmFtIHtQYXltZW50fSBwYXltZW50IGF3YWl0ZWQgYnkgY2FsbFdoZW5cbiAqIEBwYXJhbSB7UGF0dGVybn0gb3B0QW1vdW50U2hhcGVcbiAqL1xuYnVybihwYXltZW50LG9wdEFtb3VudFNoYXBlPXVuZGVmaW5lZCl7XG4vKiBJc3N1ZXJJIGRlbGF5cyBjYWxsaW5nIHRoaXMgbWV0aG9kIHVudGlsIGBwYXltZW50YCBpcyBhIFJlbW90YWJsZSovXG5hc3NlcnRMaXZlUGF5bWVudChwYXltZW50KTtcbmNvbnN0IHBheW1lbnRCYWxhbmNlPXBheW1lbnRMZWRnZXIuZ2V0KHBheW1lbnQpO1xuYXNzZXJ0QW1vdW50Q29uc2lzdGVudChwYXltZW50QmFsYW5jZSxvcHRBbW91bnRTaGFwZSk7XG50cnl7XG4vKiBDT01NSVQgUE9JTlQuKi9cbmRlbGV0ZVBheW1lbnQocGF5bWVudCk7XG4gfWNhdGNoKGVycil7XG5zaHV0ZG93bkxlZGdlcldpdGhGYWlsdXJlKGVycik7XG50aHJvdyBlcnI7XG4gfVxucmV0dXJuIHBheW1lbnRCYWxhbmNlO1xuIH0sXG4vKipcbiAqIEluaGVyZW50IHRvIHRoZSBuYXR1cmUgb2YgdGhlIElzc3VlciBBUEksIHRoaXMgbWV0aG9kIGlzIGxlc3Mgc2FmZVxuICogdGhhbiB0aGUgc2ltaWxhcmx5IG5hbWVkIGhlbHBlciBmdW5jdGlvbiBpbiBsZWdhY3ktcGF5bWVudC1oZWxwZXJzLmpzXG4gKiBzaW5jZSB0aG9zZSBoZWxwZXIgZnVuY3Rpb25zIHdpbGwgYXNzb2NpYXRlIGFueSBuZXdseSBjcmVhdGVkIHBheW1lbnRcbiAqIHdpdGggdGhlIHJlY292ZXJ5IHNldCBvZiB0aGUgYXJndW1lbnQgcHVyc2UuIFRoZSBtZXRob2RzIGhlcmUgYXJlXG4gKiBub3cgdHJpdmlhbCB3cmFwcGVycyBhcm91bmQgdGhvc2UgaGVscGVycywgdXNpbmcgYSBgbWFrZUVtcHR5UHVyc2UoKWBcbiAqIHRvIG1ha2UgdGhlIG5lZWRlZCBwdXJzZSwgd2hpY2ggdGhleSB1bnNhZmVseSB0aGVuIGRyb3Agb24gdGhlIGZsb29yLlxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSBoZWxwZXIgZnVuY3Rpb24gZnJvbSBsZWdhY3ktcGF5bWVudC1oZWxwZXJzLmpzXG4gKiBAcGFyYW0ge1BheW1lbnR9IHNyY1BheW1lbnQgYXdhaXRlZCBieSBjYWxsV2hlblxuICogQHBhcmFtIHtQYXR0ZXJufSBbb3B0QW1vdW50U2hhcGVdXG4gKi9cbmNsYWltKHNyY1BheW1lbnQsb3B0QW1vdW50U2hhcGU9dW5kZWZpbmVkKXtcbnJldHVybiBjbGFpbShtYWtlRW1wdHlQdXJzZSgpLHNyY1BheW1lbnQsb3B0QW1vdW50U2hhcGUpO1xuIH0sXG4vKipcbiAqIEluaGVyZW50IHRvIHRoZSBuYXR1cmUgb2YgdGhlIElzc3VlciBBUEksIHRoaXMgbWV0aG9kIGlzIGxlc3Mgc2FmZVxuICogdGhhbiB0aGUgc2ltaWxhcmx5IG5hbWVkIGhlbHBlciBmdW5jdGlvbiBpbiBsZWdhY3ktcGF5bWVudC1oZWxwZXJzLmpzXG4gKiBzaW5jZSB0aG9zZSBoZWxwZXIgZnVuY3Rpb25zIHdpbGwgYXNzb2NpYXRlIGFueSBuZXdseSBjcmVhdGVkIHBheW1lbnRcbiAqIHdpdGggdGhlIHJlY292ZXJ5IHNldCBvZiB0aGUgYXJndW1lbnQgcHVyc2UuIFRoZSBtZXRob2RzIGhlcmUgYXJlXG4gKiBub3cgdHJpdmlhbCB3cmFwcGVycyBhcm91bmQgdGhvc2UgaGVscGVycywgdXNpbmcgYSBgbWFrZUVtcHR5UHVyc2UoKWBcbiAqIHRvIG1ha2UgdGhlIG5lZWRlZCBwdXJzZSwgd2hpY2ggdGhleSB1bnNhZmVseSB0aGVuIGRyb3Agb24gdGhlIGZsb29yLlxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSBoZWxwZXIgZnVuY3Rpb24gZnJvbSBsZWdhY3ktcGF5bWVudC1oZWxwZXJzLmpzXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudD5bXX0gZnJvbVBheW1lbnRzUEFycmF5XG4gKiBAcGFyYW0ge1BhdHRlcm59IFtvcHRUb3RhbEFtb3VudF1cbiAqL1xuY29tYmluZShmcm9tUGF5bWVudHNQQXJyYXksb3B0VG90YWxBbW91bnQ9dW5kZWZpbmVkKXtcbnJldHVybiBjb21iaW5lKG1ha2VFbXB0eVB1cnNlKCksZnJvbVBheW1lbnRzUEFycmF5LG9wdFRvdGFsQW1vdW50KTtcbiB9LFxuLyoqXG4gKiBJbmhlcmVudCB0byB0aGUgbmF0dXJlIG9mIHRoZSBJc3N1ZXIgQVBJLCB0aGlzIG1ldGhvZCBpcyBsZXNzIHNhZmVcbiAqIHRoYW4gdGhlIHNpbWlsYXJseSBuYW1lZCBoZWxwZXIgZnVuY3Rpb24gaW4gbGVnYWN5LXBheW1lbnQtaGVscGVycy5qc1xuICogc2luY2UgdGhvc2UgaGVscGVyIGZ1bmN0aW9ucyB3aWxsIGFzc29jaWF0ZSBhbnkgbmV3bHkgY3JlYXRlZCBwYXltZW50XG4gKiB3aXRoIHRoZSByZWNvdmVyeSBzZXQgb2YgdGhlIGFyZ3VtZW50IHB1cnNlLiBUaGUgbWV0aG9kcyBoZXJlIGFyZVxuICogbm93IHRyaXZpYWwgd3JhcHBlcnMgYXJvdW5kIHRob3NlIGhlbHBlcnMsIHVzaW5nIGEgYG1ha2VFbXB0eVB1cnNlKClgXG4gKiB0byBtYWtlIHRoZSBuZWVkZWQgcHVyc2UsIHdoaWNoIHRoZXkgdW5zYWZlbHkgdGhlbiBkcm9wIG9uIHRoZSBmbG9vci5cbiAqXG4gKiBAZGVwcmVjYXRlZCBVc2UgaGVscGVyIGZ1bmN0aW9uIGZyb20gbGVnYWN5LXBheW1lbnQtaGVscGVycy5qc1xuICogQHBhcmFtIHtQYXltZW50fSBzcmNQYXltZW50IGF3YWl0ZWQgYnkgY2FsbFdoZW5cbiAqIEBwYXJhbSB7QW1vdW50fSBwYXltZW50QW1vdW50QVxuICovXG5zcGxpdChzcmNQYXltZW50LHBheW1lbnRBbW91bnRBKXtcbnJldHVybiBzcGxpdChtYWtlRW1wdHlQdXJzZSgpLHNyY1BheW1lbnQscGF5bWVudEFtb3VudEEpO1xuIH0sXG4vKipcbiAqIEluaGVyZW50IHRvIHRoZSBuYXR1cmUgb2YgdGhlIElzc3VlciBBUEksIHRoaXMgbWV0aG9kIGlzIGxlc3Mgc2FmZVxuICogdGhhbiB0aGUgc2ltaWxhcmx5IG5hbWVkIGhlbHBlciBmdW5jdGlvbiBpbiBsZWdhY3ktcGF5bWVudC1oZWxwZXJzLmpzXG4gKiBzaW5jZSB0aG9zZSBoZWxwZXIgZnVuY3Rpb25zIHdpbGwgYXNzb2NpYXRlIGFueSBuZXdseSBjcmVhdGVkIHBheW1lbnRcbiAqIHdpdGggdGhlIHJlY292ZXJ5IHNldCBvZiB0aGUgYXJndW1lbnQgcHVyc2UuIFRoZSBtZXRob2RzIGhlcmUgYXJlXG4gKiBub3cgdHJpdmlhbCB3cmFwcGVycyBhcm91bmQgdGhvc2UgaGVscGVycywgdXNpbmcgYSBgbWFrZUVtcHR5UHVyc2UoKWBcbiAqIHRvIG1ha2UgdGhlIG5lZWRlZCBwdXJzZSwgd2hpY2ggdGhleSB1bnNhZmVseSB0aGVuIGRyb3Agb24gdGhlIGZsb29yLlxuICpcbiAqIEBkZXByZWNhdGVkIFVzZSBoZWxwZXIgZnVuY3Rpb24gZnJvbSBsZWdhY3ktcGF5bWVudC1oZWxwZXJzLmpzXG4gKiBAcGFyYW0ge1BheW1lbnR9IHNyY1BheW1lbnQgYXdhaXRlZCBieSBjYWxsV2hlblxuICogQHBhcmFtIHsqfSBhbW91bnRzXG4gKi9cbnNwbGl0TWFueShzcmNQYXltZW50LGFtb3VudHMpe1xucmV0dXJuIHNwbGl0TWFueShtYWtlRW1wdHlQdXJzZSgpLHNyY1BheW1lbnQsYW1vdW50cyk7XG4gfX0pO1xuXG5cbi8qKlxuICogUHJvdmlkZXMgZm9yIHRoZSByZWNvdmVyeSBvZiBuZXdseSBtaW50ZWQgYnV0IG5vdC15ZXQtZGVwb3NpdGVkIHBheW1lbnRzLlxuICpcbiAqIEJlY2F1c2UgdGhlIGBtaW50UmVjb3ZlcnlQdXJzZWAgaXMgcGxhY2VkIGluIGJhZ2dhZ2UsIGV2ZW4gaWYgdGhlXG4gKiBjYWxsZXIgb2YgYG1ha2VJc3N1ZXJLaXRgIGRyb3BzIGl0IG9uIHRoZSBmbG9vciwgaXQgY2FuIHN0aWxsIGJlXG4gKiByZWNvdmVyZWQgaW4gYW4gZW1lcmdlbmN5IHVwZ3JhZGUuXG4gKlxuICogQHR5cGUge1B1cnNlPEs+fVxuICovXG5jb25zdCBtaW50UmVjb3ZlcnlQdXJzZT1wcm92aWRlKGlzc3VlckJhZ2dhZ2UsJ21pbnRSZWNvdmVyeVB1cnNlJywoKT0+XG5tYWtlRW1wdHlQdXJzZSgpKTtcblxuXG4vKiogQHR5cGUge01pbnQ8Sz59ICovXG5jb25zdCBtaW50PXByZXBhcmVFeG8oaXNzdWVyQmFnZ2FnZSwgYCR7bmFtZX0gbWludGAsTWludEkse1xuZ2V0SXNzdWVyKCl7XG5yZXR1cm4gaXNzdWVyO1xuIH0sXG5taW50UGF5bWVudChuZXdBbW91bnQpe1xuLyogQHRzLWV4cGVjdC1lcnJvciBjaGVja2VkIGNhc3QqL1xubmV3QW1vdW50PWNvZXJjZShuZXdBbW91bnQpO1xubXVzdE1hdGNoKG5ld0Ftb3VudCxhbW91bnRTaGFwZSwnbWludGVkIGFtb3VudCcpO1xuLyogYHJhd1BheW1lbnRgIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYW55IHJlY292ZXJ5IHNldCwgYW5kKi9cbi8qIHNvIG11c3Qgbm90IGVzY2FwZS4qL1xuY29uc3QgcmF3UGF5bWVudD1tYWtlUGF5bWVudCgpO1xuaW5pdFBheW1lbnQocmF3UGF5bWVudCxuZXdBbW91bnQsdW5kZWZpbmVkKTtcblxuY29uc3QgbWludFJlY292ZXJ5UHVyc2VCZWZvcmU9bWludFJlY292ZXJ5UHVyc2UuZ2V0Q3VycmVudEFtb3VudCgpO1xubWludFJlY292ZXJ5UHVyc2UuZGVwb3NpdChyYXdQYXltZW50LG5ld0Ftb3VudCk7XG5jb25zdCBwYXltZW50PW1pbnRSZWNvdmVyeVB1cnNlLndpdGhkcmF3KG5ld0Ftb3VudCk7XG5jb25zdCBtaW50UmVjb3ZlcnlQdXJzZUFmdGVyPW1pbnRSZWNvdmVyeVB1cnNlLmdldEN1cnJlbnRBbW91bnQoKTtcbmFzc2VydChrZXlFUShtaW50UmVjb3ZlcnlQdXJzZUJlZm9yZSxtaW50UmVjb3ZlcnlQdXJzZUFmdGVyKSk7XG5yZXR1cm4gcGF5bWVudDtcbiB9fSk7XG5cblxuY29uc3QgaXNzdWVyS2l0PWhhcmRlbih7aXNzdWVyLG1pbnQsYnJhbmQsbWludFJlY292ZXJ5UHVyc2V9KTtcbnJldHVybiBpc3N1ZXJLaXQ7XG4gfTskaOKAjV9vbmNlLnByZXBhcmVQYXltZW50TGVkZ2VyKHByZXBhcmVQYXltZW50TGVkZ2VyKTtcbmhhcmRlbihwcmVwYXJlUGF5bWVudExlZGdlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsicHJlcGFyZVBheW1lbnRMZWRnZXIiOlsicHJlcGFyZVBheW1lbnRMZWRnZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA+r7LW6sPAACrDwAAIQAAAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9wdXJzZS5qc3siaW1wb3J0cyI6WyIuL2Ftb3VudE1hdGguanMiLCIuL3RyYW5zaWVudE5vdGlmaWVyLmpzIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiXSwiZXhwb3J0cyI6WyJwcmVwYXJlUHVyc2VLaW5kIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE0scHJlcGFyZUV4b0NsYXNzS2l0LG1ha2VTY2FsYXJCaWdTZXRTdG9yZSxBbW91bnRNYXRoLG1ha2VUcmFuc2llbnROb3RpZmllcktpdDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJNXCIsIFskaOKAjV9hID0+IChNID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvdmF0LWRhdGFcIiwgW1tcInByZXBhcmVFeG9DbGFzc0tpdFwiLCBbJGjigI1fYSA9PiAocHJlcGFyZUV4b0NsYXNzS2l0ID0gJGjigI1fYSldXSxbXCJtYWtlU2NhbGFyQmlnU2V0U3RvcmVcIiwgWyRo4oCNX2EgPT4gKG1ha2VTY2FsYXJCaWdTZXRTdG9yZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2Ftb3VudE1hdGguanNcIiwgW1tcIkFtb3VudE1hdGhcIiwgWyRo4oCNX2EgPT4gKEFtb3VudE1hdGggPSAkaOKAjV9hKV1dXV0sW1wiLi90cmFuc2llbnROb3RpZmllci5qc1wiLCBbW1wibWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0XCIsIFskaOKAjV9hID0+IChtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuXG5jb25zdCAgICAgICAgcHJlcGFyZVB1cnNlS2luZD0oXG5pc3N1ZXJCYWdnYWdlLFxubmFtZSxcbmFzc2V0S2luZCxcbmJyYW5kLFxuUHVyc2VJS2l0LFxucHVyc2VNZXRob2RzKT0+XG57XG5jb25zdCBhbW91bnRTaGFwZT1icmFuZC5nZXRBbW91bnRTaGFwZSgpO1xuXG4vKiBOb3RlOiBWaXJ0dWFsIGZvciBoaWdoIGNhcmRpbmFsaXR5LCBidXQgKm5vdCogZHVyYWJsZSwgYW5kIHNvKi9cbi8qIGJyb2tlbiBhY3Jvc3MgYW4gdXBncmFkZS4qL1xuY29uc3R7cHJvdmlkZU5vdGlmaWVyLHVwZGF0ZTp1cGRhdGVCYWxhbmNlfT1tYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQoKTtcblxuY29uc3QgdXBkYXRlUHVyc2VCYWxhbmNlPShzdGF0ZSxuZXdQdXJzZUJhbGFuY2UscHVyc2UpPT57XG5zdGF0ZS5jdXJyZW50QmFsYW5jZT1uZXdQdXJzZUJhbGFuY2U7XG51cGRhdGVCYWxhbmNlKHB1cnNlLHB1cnNlLmdldEN1cnJlbnRBbW91bnQoKSk7XG4gfTtcblxuLyogLSBUaGlzIGtpbmQgaXMgYSBwYWlyIG9mIHB1cnNlIGFuZCBkZXBvc2l0RmFjZXQgdGhhdCBoYXZlIGEgMToxKi9cbi8qIGNvcnJlc3BvbmRlbmNlLiovXG4vKiAtIFRoZXkgYXJlIHZpcnR1YWxpemVkIHRvZ2V0aGVyIHRvIHNoYXJlIGEgc2luZ2xlIHN0YXRlIHJlY29yZC4qL1xuLyogLSBBbiBhbHRlcm5hdGl2ZSBkZXNpZ24gY29uc2lkZXJlZCB3YXMgdG8gaGF2ZSB0aGlzIHJldHVybiBhIFB1cnNlIGFsb25lKi9cbi8qIHRoYXQgY3JlYXRlZCBkZXBvc2l0RmFjZXQgYXMgbmVlZGVkLiBCdXQgdGhpcyBhcHByb2FjaCBlbnN1cmVzIGEgY29uc3RhbnQqL1xuLyogaWRlbnRpdHkgZm9yIHRoZSBmYWNldCBhbmQgZXhlcmNpc2VzIHRoZSBtdWx0aS1mYWNldGVkIG9iamVjdCBzdHlsZS4qL1xuY29uc3R7ZGVwb3NpdEludGVybmFsLHdpdGhkcmF3SW50ZXJuYWx9PXB1cnNlTWV0aG9kcztcbmNvbnN0IG1ha2VQdXJzZUtpdD1wcmVwYXJlRXhvQ2xhc3NLaXQoXG5pc3N1ZXJCYWdnYWdlLFxuIGAke25hbWV9IFB1cnNlYCxcblB1cnNlSUtpdCxcbigpPT57XG5jb25zdCBjdXJyZW50QmFsYW5jZT1BbW91bnRNYXRoLm1ha2VFbXB0eShicmFuZCxhc3NldEtpbmQpO1xuXG4vKiogQHR5cGUge1NldFN0b3JlPFBheW1lbnQ+fSAqL1xuY29uc3QgcmVjb3ZlcnlTZXQ9bWFrZVNjYWxhckJpZ1NldFN0b3JlKCdyZWNvdmVyeSBzZXQnLHtcbmR1cmFibGU6dHJ1ZX0pO1xuXG5cbnJldHVybntcbmN1cnJlbnRCYWxhbmNlLFxucmVjb3ZlcnlTZXR9O1xuXG4gfSxcbntcbnB1cnNlOntcbmRlcG9zaXQoc3JjUGF5bWVudCxvcHRBbW91bnRTaGFwZT11bmRlZmluZWQpe1xuLyogUHVyc2VJIGRvZXMgKm5vdCogZGVsYXkgYGRlcG9zaXRgIHVudGlsIGBzcmNQYXltZW50YCBpcyBmdWxmdWxsZWQuKi9cbi8qIFNlZSB0aGUgY29tbWVudHMgb24gUHVyc2VJLmRlcG9zaXQgaW4gdHlwZUd1YXJkcy5qcyovXG5jb25zdHtzdGF0ZX09dGhpcztcbi8qIE5vdGUgQ09NTUlUIFBPSU5UIHdpdGhpbiBkZXBvc2l0LiovXG5yZXR1cm4gZGVwb3NpdEludGVybmFsKFxuc3RhdGUuY3VycmVudEJhbGFuY2UsXG4obmV3UHVyc2VCYWxhbmNlKT0+XG51cGRhdGVQdXJzZUJhbGFuY2Uoc3RhdGUsbmV3UHVyc2VCYWxhbmNlLHRoaXMuZmFjZXRzLnB1cnNlKSxcbnNyY1BheW1lbnQsXG5vcHRBbW91bnRTaGFwZSk7XG5cbiB9LFxud2l0aGRyYXcoYW1vdW50KXtcbmNvbnN0e3N0YXRlfT10aGlzO1xuLyogTm90ZSBDT01NSVQgUE9JTlQgd2l0aGluIHdpdGhkcmF3LiovXG5yZXR1cm4gd2l0aGRyYXdJbnRlcm5hbChcbnN0YXRlLmN1cnJlbnRCYWxhbmNlLFxuKG5ld1B1cnNlQmFsYW5jZSk9PlxudXBkYXRlUHVyc2VCYWxhbmNlKHN0YXRlLG5ld1B1cnNlQmFsYW5jZSx0aGlzLmZhY2V0cy5wdXJzZSksXG5hbW91bnQsXG5zdGF0ZS5yZWNvdmVyeVNldCk7XG5cbiB9LFxuZ2V0Q3VycmVudEFtb3VudCgpe1xucmV0dXJuIHRoaXMuc3RhdGUuY3VycmVudEJhbGFuY2U7XG4gfSxcbmdldEN1cnJlbnRBbW91bnROb3RpZmllcigpe1xucmV0dXJuIHByb3ZpZGVOb3RpZmllcih0aGlzLmZhY2V0cy5wdXJzZSk7XG4gfSxcbmdldEFsbGVnZWRCcmFuZCgpe1xucmV0dXJuIGJyYW5kO1xuIH0sXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuZ2V0RGVwb3NpdEZhY2V0KCl7XG5yZXR1cm4gdGhpcy5mYWNldHMuZGVwb3NpdEZhY2V0O1xuIH0sXG5cbmdldFJlY292ZXJ5U2V0KCl7XG5yZXR1cm4gdGhpcy5zdGF0ZS5yZWNvdmVyeVNldC5zbmFwc2hvdCgpO1xuIH0sXG5yZWNvdmVyQWxsKCl7XG5jb25zdHtzdGF0ZSxmYWNldHN9PXRoaXM7XG5sZXQgYW1vdW50PUFtb3VudE1hdGgubWFrZUVtcHR5KGJyYW5kLGFzc2V0S2luZCk7XG5mb3IoY29uc3QgcGF5bWVudCBvZiBzdGF0ZS5yZWNvdmVyeVNldC5rZXlzKCkpe1xuLyogVGhpcyBkb2VzIGNhdXNlIGRlbGV0aW9ucyBmcm9tIHRoZSBzZXQgd2hpbGUgaXRlcmF0aW5nLCovXG4vKiBidXQgdGhpcyBzcGVjaWFsIGNhc2UgaXMgYWxsb3dlZC4qL1xuY29uc3QgZGVsdGE9ZmFjZXRzLnB1cnNlLmRlcG9zaXQocGF5bWVudCk7XG5hbW91bnQ9QW1vdW50TWF0aC5hZGQoYW1vdW50LGRlbHRhLGJyYW5kKTtcbiB9XG5zdGF0ZS5yZWNvdmVyeVNldC5nZXRTaXplKCk9PT0wfHxcbkZhaWwgYGludGVybmFsOiBSZW1haW5pbmcgdW5yZWNvdmVyZWQgcGF5bWVudHM6ICR7ZmFjZXRzLnB1cnNlLmdldFJlY292ZXJ5U2V0KCl9YDtcbnJldHVybiBhbW91bnQ7XG4gfX0sXG5cbmRlcG9zaXRGYWNldDp7XG5yZWNlaXZlKC4uLmFyZ3Mpe1xucmV0dXJuIHRoaXMuZmFjZXRzLnB1cnNlLmRlcG9zaXQoLi4uYXJncyk7XG4gfX19LFxuXG5cbntcbnN0YXRlU2hhcGU6e1xuY3VycmVudEJhbGFuY2U6YW1vdW50U2hhcGUsXG5yZWNvdmVyeVNldDpNLnJlbW90YWJsZSgncmVjb3ZlcnlTZXQnKX19KTtcblxuXG5cbnJldHVybigpPT5tYWtlUHVyc2VLaXQoKS5wdXJzZTtcbiB9OyRo4oCNX29uY2UucHJlcGFyZVB1cnNlS2luZChwcmVwYXJlUHVyc2VLaW5kKTtcbmhhcmRlbihwcmVwYXJlUHVyc2VLaW5kKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwcmVwYXJlUHVyc2VLaW5kIjpbInByZXBhcmVQdXJzZUtpbmQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA3ts1pfsFAAD7BQAALQAAAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy90cmFuc2llbnROb3RpZmllci5qc3siaW1wb3J0cyI6WyJAYWdvcmljL25vdGlmaWVyIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiXSwiZXhwb3J0cyI6WyJtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSxwcm92aWRlTGF6eSxtYWtlTm90aWZpZXJLaXQ7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy92YXQtZGF0YVwiLCBbW1wibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZVwiLCBbJGjigI1fYSA9PiAobWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJwcm92aWRlTGF6eVwiLCBbJGjigI1fYSA9PiAocHJvdmlkZUxhenkgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9ub3RpZmllclwiLCBbW1wibWFrZU5vdGlmaWVyS2l0XCIsIFskaOKAjV9hID0+IChtYWtlTm90aWZpZXJLaXQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbi8qIE5vdGU6IFZpcnR1YWwgZm9yIGhpZ2ggY2FyZGluYWxpdHksIGJ1dCAqbm90KiBkdXJhYmxlLCBhbmQgc28qL1xuLyogYnJva2VuIGFjcm9zcyBhbiB1cGdyYWRlLiovXG5jb25zdCAgICAgICAgbWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0PSgpPT57XG4vKiogQHR5cGUge1dlYWtNYXBTdG9yZTxQdXJzZSwgTm90aWZpZXJSZWNvcmQ8YW55Pj59ICovXG5jb25zdCB0cmFuc2llbnROb3RpZmVyS2l0cz1tYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlKFxuJ3RyYW5zaWVudE5vdGlmZXJLaXRzJyk7XG5cblxuY29uc3QgcHJvdmlkZU5vdGlmaWVyS2l0PShrZXkpPT5cbnByb3ZpZGVMYXp5KHRyYW5zaWVudE5vdGlmZXJLaXRzLGtleSwoKT0+XG5tYWtlTm90aWZpZXJLaXQoa2V5LmdldEN1cnJlbnRBbW91bnQoKSkpO1xuXG5cbmNvbnN0IHByb3ZpZGVOb3RpZmllcj0oa2V5KT0+cHJvdmlkZU5vdGlmaWVyS2l0KGtleSkubm90aWZpZXI7XG5jb25zdCB1cGRhdGU9KGtleSxuZXdWYWx1ZSk9PntcbmlmKHRyYW5zaWVudE5vdGlmZXJLaXRzLmhhcyhrZXkpKXtcbmNvbnN0e3VwZGF0ZXJ9PXRyYW5zaWVudE5vdGlmZXJLaXRzLmdldChrZXkpO1xudXBkYXRlci51cGRhdGVTdGF0ZShuZXdWYWx1ZSk7XG4gfVxuIH07XG5cbnJldHVybntwcm92aWRlTm90aWZpZXIsdXBkYXRlfTtcbiB9OyRo4oCNX29uY2UubWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0KG1ha2VUcmFuc2llbnROb3RpZmllcktpdCk7XG5oYXJkZW4obWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlVHJhbnNpZW50Tm90aWZpZXJLaXQiOlsibWFrZVRyYW5zaWVudE5vdGlmaWVyS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMUYV9SOKAAAjigAACYAAABAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvdHlwZUd1YXJkcy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiQW1vdW50U2hhcGUiLCJBc3NldEtpbmRTaGFwZSIsIkJyYW5kSSIsIkJyYW5kU2hhcGUiLCJEZXBvc2l0RmFjZXRTaGFwZSIsIkRpc3BsYXlJbmZvU2hhcGUiLCJJc3N1ZXJLaXRTaGFwZSIsIklzc3VlclNoYXBlIiwiTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTIiwiTWludFNoYXBlIiwiTm90aWZpZXJTaGFwZSIsIlBheW1lbnRTaGFwZSIsIlB1cnNlU2hhcGUiLCJSYXRpb1NoYXBlIiwiaXNDb3B5QmFnVmFsdWUiLCJpc0NvcHlTZXRWYWx1ZSIsImlzTmF0VmFsdWUiLCJpc1NldFZhbHVlIiwibWFrZUlzc3VlckludGVyZmFjZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgTSxtYXRjaGVzOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dLFtcIm1hdGNoZXNcIiwgWyRo4oCNX2EgPT4gKG1hdGNoZXMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuY29uc3QgICAgICAgIEJyYW5kU2hhcGU9TS5yZW1vdGFibGUoJ0JyYW5kJyk7JGjigI1fb25jZS5CcmFuZFNoYXBlKEJyYW5kU2hhcGUpO1xuY29uc3QgICAgICAgIElzc3VlclNoYXBlPU0ucmVtb3RhYmxlKCdJc3N1ZXInKTskaOKAjV9vbmNlLklzc3VlclNoYXBlKElzc3VlclNoYXBlKTtcbmNvbnN0ICAgICAgICBQYXltZW50U2hhcGU9TS5yZW1vdGFibGUoJ1BheW1lbnQnKTskaOKAjV9vbmNlLlBheW1lbnRTaGFwZShQYXltZW50U2hhcGUpO1xuY29uc3QgICAgICAgIFB1cnNlU2hhcGU9TS5yZW1vdGFibGUoJ1B1cnNlJyk7JGjigI1fb25jZS5QdXJzZVNoYXBlKFB1cnNlU2hhcGUpO1xuY29uc3QgICAgICAgIERlcG9zaXRGYWNldFNoYXBlPU0ucmVtb3RhYmxlKCdEZXBvc2l0RmFjZXQnKTskaOKAjV9vbmNlLkRlcG9zaXRGYWNldFNoYXBlKERlcG9zaXRGYWNldFNoYXBlKTtcbmNvbnN0ICAgICAgICBOb3RpZmllclNoYXBlPU0ucmVtb3RhYmxlKCdOb3RpZmllcicpOyRo4oCNX29uY2UuTm90aWZpZXJTaGFwZShOb3RpZmllclNoYXBlKTtcbmNvbnN0ICAgICAgICBNaW50U2hhcGU9TS5yZW1vdGFibGUoJ01pbnQnKTtcblxuLyoqXG4gKiBXaGVuIHRoZSBBbW91bnRWYWx1ZSBvZiBhbiBBbW91bnQgZml0cyB0aGUgTmF0VmFsdWVTaGFwZSwgaS5lLiwgd2hlbiBpdCBpc1xuICogYSBub24tbmVnYXRpdmUgYmlnaW50LCB0aGVuIGl0IHJlcHJlc2VudHMgdGhhdCBtYW55IHVuaXRzIG9mIHRoZVxuICogZnVuZ2libGUgYXNzZXQgcmVwcmVzZW50ZWQgYnkgdGhhdCBhbW91bnQuIFRoZSBicmFuZCBvZiB0aGF0IGFtb3VudFxuICogc2hvdWxkIGluZGVlZCByZXByZXNlbnQgYSBraW5kIG9mIGFzc2V0IGNvbnNpc3Rpbmcgb2YgYSBjb3VudGFibGVcbiAqIHNldCBvZiBmdW5naWJsZSB1bml0cy5cbiAqLyRo4oCNX29uY2UuTWludFNoYXBlKE1pbnRTaGFwZSk7XG5jb25zdCBOYXRWYWx1ZVNoYXBlPU0ubmF0KCk7XG5cbi8qKlxuICogV2hlbiB0aGUgQW1vdW50VmFsdWUgb2YgYW4gQW1vdW50IGZpdHMgdGhlIENvcHlTZXRWYWx1ZVNoYXBlLCBpLmUuLCB3aGVuIGl0XG4gKiBpcyBhIENvcHlTZXQsIHRoZW4gaXQgcmVwcmVzZW50cyB0aGUgc2V0IG9mIHRob3NlXG4gKiBrZXlzLCB3aGVyZSBlYWNoIGtleSByZXByZXNlbnRzIHNvbWUgaW5kaXZpZHVhbCBub24tZnVuZ2libGVcbiAqIGl0ZW0sIGxpa2UgYSBjb25jZXJ0IHRpY2tldCwgZnJvbSB0aGUgbm9uLWZ1bmdpYmxlIGFzc2V0IGNsYXNzXG4gKiByZXByZXNlbnRlZCBieSB0aGF0IGFtb3VudCdzIGJyYW5kLiBUaGUgYW1vdW50IGl0c2VsZiByZXByZXNlbnRzXG4gKiB0aGUgc2V0IG9mIHRoZXNlIGl0ZW1zLCBhcyBvcHBvc2VkIHRvIGFueSBvZiB0aGUgb3RoZXIgaXRlbXNcbiAqIGZyb20gdGhlIHNhbWUgYXNzZXQgY2xhc3MuXG4gKlxuICogSWYgYSBnaXZlbiB2YWx1ZSBjbGFzcyByZXByZXNlbnRzIGNvbmNlcnQgdGlja2V0cywgaXQgc2VlbXMgYml6YXJyZVxuICogdGhhdCB3ZSBjYW4gZm9ybSBhbW91bnRzIG9mIGFueSBrZXkuIFRoZSBoYXJkIGNvbnN0cmFpbnQgaXMgdGhhdFxuICogdGhlIGNvZGUgdGhhdCBob2xkcyB0aGUgbWludCBmb3IgdGhhdCBhc3NldCBjbGFzcy0tLXRoZSBvbmUgYXNzb2NpYXRlZFxuICogd2l0aCB0aGF0IGJyYW5kLCBvbmx5IG1pbnRzIHRoZSBpdGVtcyByZXByZXNlbnRpbmcgdGhlIHJlYWwgdW5pdHNcbiAqIG9mIHRoYXQgYXNzZXQgY2xhc3MgYXMgZGVmaW5lZCBieSBpdC4gQW55b25lIGVsc2UgY2FuIHB1dCB0b2dldGhlclxuICogYW4gYW1vdW50IGV4cHJlc3NpbmcsIGZvciBleGFtcGxlLCB0aGF0IHRoZXkgXCJ3YW50XCIgc29tZSBpdGVtcyB0aGF0XG4gKiB3aWxsIG5ldmVyIGJlIG1pbnRlZC4gVGhhdCB3YW50IHdpbGwgbmV2ZXIgYmUgc2F0aXNmaWVkLlxuICogXCJZb3UgY2FuJ3QgYWx3YXlzIGdldC4uLlwiXG4gKi9cbmNvbnN0IENvcHlTZXRWYWx1ZVNoYXBlPU0uc2V0KCk7XG5cbi8qKlxuICogV2hlbiB0aGUgQW1vdW50VmFsdWUgb2YgYW4gQW1vdW50IGZpdHMgdGhlIFNldFZhbHVlU2hhcGUsIGkuZS4sIHdoZW4gaXRcbiAqIGlzIGEgQ29weUFycmF5IG9mIHBhc3NhYmxlIEtleXMuIFRoaXMgcmVwcmVzZW50YXRpb24gaXMgZGVwcmVjYXRlZC5cbiAqXG4gKiBAZGVwcmVjYXRlZCBQbGVhc2UgY2hhbmdlIGZyb20gdXNpbmcgYXJyYXktYmFzZWQgU2V0VmFsdWVzIHRvIENvcHlTZXQtYmFzZWRcbiAqIENvcHlTZXRWYWx1ZXMuXG4gKi9cbmNvbnN0IFNldFZhbHVlU2hhcGU9TS5hcnJheU9mKE0ua2V5KCkpO1xuXG4vKipcbiAqIFdoZW4gdGhlIEFtb3VudFZhbHVlIG9mIGFuIEFtb3VudCBmaXRzIHRoZSBDb3B5QmFnVmFsdWVTaGFwZSwgaS5lLiwgd2hlbiBpdFxuICogaXMgYSBDb3B5QmFnLCB0aGVuIGl0IHJlcHJlc2VudHMgdGhlIGJhZyAobXVsdGlzZXQpIG9mIHRob3NlXG4gKiBrZXlzLCB3aGVyZSBlYWNoIGtleSByZXByZXNlbnRzIHNvbWUgaW5kaXZpZHVhbCBzZW1pLWZ1bmdpYmxlXG4gKiBpdGVtLCBsaWtlIGEgY29uY2VydCB0aWNrZXQsIGZyb20gdGhlIHNlbWktZnVuZ2libGUgYXNzZXQgY2xhc3NcbiAqIHJlcHJlc2VudGVkIGJ5IHRoYXQgYW1vdW50J3MgYnJhbmQuIFRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCBrZXlcbiAqIGFwcGVhcnMgaW4gdGhlIGJhZyBpcyB0aGUgbnVtYmVyIG9mIGZ1bmdpYmxlIHVuaXRzIG9mIHRoYXQga2V5LlxuICogVGhlIGFtb3VudCBpdHNlbGYgcmVwcmVzZW50c1xuICogdGhlIGJhZyBvZiB0aGVzZSBpdGVtcywgYXMgb3Bwb3NlZCB0byBhbnkgb2YgdGhlIG90aGVyIGl0ZW1zXG4gKiBmcm9tIHRoZSBzYW1lIGFzc2V0IGNsYXNzLlxuICpcbiAqIElmIGEgZ2l2ZW4gdmFsdWUgY2xhc3MgcmVwcmVzZW50cyBjb25jZXJ0IHRpY2tldHMsIGl0IHNlZW1zIGJpemFycmVcbiAqIHRoYXQgd2UgY2FuIGZvcm0gYW1vdW50cyBvZiBhbnkga2V5LiBUaGUgaGFyZCBjb25zdHJhaW50IGlzIHRoYXRcbiAqIHRoZSBjb2RlIHRoYXQgaG9sZHMgdGhlIG1pbnQgZm9yIHRoYXQgYXNzZXQgY2xhc3MtLS10aGUgb25lIGFzc29jaWF0ZWRcbiAqIHdpdGggdGhhdCBicmFuZCwgb25seSBtaW50cyB0aGUgaXRlbXMgcmVwcmVzZW50aW5nIHRoZSByZWFsIHVuaXRzXG4gKiBvZiB0aGF0IGFzc2V0IGNsYXNzIGFzIGRlZmluZWQgYnkgaXQuIEFueW9uZSBlbHNlIGNhbiBwdXQgdG9nZXRoZXJcbiAqIGFuIGFtb3VudCBleHByZXNzaW5nLCBmb3IgZXhhbXBsZSwgdGhhdCB0aGV5IFwid2FudFwiIHNvbWUgaXRlbXMgdGhhdFxuICogd2lsbCBuZXZlciBiZSBtaW50ZWQuIFRoYXQgd2FudCB3aWxsIG5ldmVyIGJlIHNhdGlzZmllZC5cbiAqIFwiWW91IGNhbid0IGFsd2F5cyBnZXQuLi5cIlxuICovXG5jb25zdCBDb3B5QmFnVmFsdWVTaGFwZT1NLmJhZygpO1xuXG5jb25zdCBBbW91bnRWYWx1ZVNoYXBlPU0ub3IoXG5OYXRWYWx1ZVNoYXBlLFxuQ29weVNldFZhbHVlU2hhcGUsXG5TZXRWYWx1ZVNoYXBlLFxuQ29weUJhZ1ZhbHVlU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBBbW91bnRTaGFwZT1oYXJkZW4oe1xuYnJhbmQ6QnJhbmRTaGFwZSxcbnZhbHVlOkFtb3VudFZhbHVlU2hhcGV9KTskaOKAjV9vbmNlLkFtb3VudFNoYXBlKEFtb3VudFNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgUmF0aW9TaGFwZT1oYXJkZW4oe1xubnVtZXJhdG9yOkFtb3VudFNoYXBlLFxuZGVub21pbmF0b3I6QW1vdW50U2hhcGV9KTtcblxuXG4vKipcbiAqIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBhIE5hdCBiaWdpbnQuXG4gKlxuICogQHBhcmFtIHtBbW91bnRWYWx1ZX0gdmFsdWVcbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBYaW1wb3J0KCcuL3R5cGVzLmpzJykuTmF0VmFsdWV9XG4gKi8kaOKAjV9vbmNlLlJhdGlvU2hhcGUoUmF0aW9TaGFwZSk7XG5jb25zdCAgICAgICAgaXNOYXRWYWx1ZT0odmFsdWUpPT5tYXRjaGVzKHZhbHVlLE5hdFZhbHVlU2hhcGUpOyRo4oCNX29uY2UuaXNOYXRWYWx1ZShpc05hdFZhbHVlKTtcbmhhcmRlbihpc05hdFZhbHVlKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgYSBDb3B5U2V0XG4gKlxuICogQHBhcmFtIHtBbW91bnRWYWx1ZX0gdmFsdWVcbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBDb3B5U2V0VmFsdWV9XG4gKi9cbmNvbnN0ICAgICAgICBpc0NvcHlTZXRWYWx1ZT0odmFsdWUpPT5tYXRjaGVzKHZhbHVlLENvcHlTZXRWYWx1ZVNoYXBlKTskaOKAjV9vbmNlLmlzQ29weVNldFZhbHVlKGlzQ29weVNldFZhbHVlKTtcbmhhcmRlbihpc0NvcHlTZXRWYWx1ZSk7XG5cbi8qKlxuICogUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGEgcGFzcyBieSBjb3B5IGFycmF5IHN0cnVjdHVyZS4gRG9lcyBub3RcbiAqIGNoZWNrIGZvciBkdXBsaWNhdGVzLiBUbyBjaGVjayBmb3IgZHVwbGljYXRlcywgdXNlIHNldE1hdGhIZWxwZXJzLmNvZXJjZS5cbiAqXG4gKiBAZGVwcmVjYXRlZCBQbGVhc2UgY2hhbmdlIGZyb20gdXNpbmcgYXJyYXktYmFzZWQgU2V0VmFsdWVzIHRvIENvcHlTZXQtYmFzZWRcbiAqIENvcHlTZXRWYWx1ZXMuXG4gKiBAcGFyYW0ge0Ftb3VudFZhbHVlfSB2YWx1ZVxuICogQHJldHVybnMge3ZhbHVlIGlzIFNldFZhbHVlfVxuICovXG5jb25zdCAgICAgICAgaXNTZXRWYWx1ZT0odmFsdWUpPT5tYXRjaGVzKHZhbHVlLFNldFZhbHVlU2hhcGUpOyRo4oCNX29uY2UuaXNTZXRWYWx1ZShpc1NldFZhbHVlKTtcbmhhcmRlbihpc1NldFZhbHVlKTtcblxuLyoqXG4gKiBSZXR1cm5zIHRydWUgaWYgdmFsdWUgaXMgYSBDb3B5QmFnXG4gKlxuICogQHBhcmFtIHtBbW91bnRWYWx1ZX0gdmFsdWVcbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBDb3B5QmFnVmFsdWV9XG4gKi9cbmNvbnN0ICAgICAgICBpc0NvcHlCYWdWYWx1ZT0odmFsdWUpPT5tYXRjaGVzKHZhbHVlLENvcHlCYWdWYWx1ZVNoYXBlKTskaOKAjV9vbmNlLmlzQ29weUJhZ1ZhbHVlKGlzQ29weUJhZ1ZhbHVlKTtcbmhhcmRlbihpc0NvcHlCYWdWYWx1ZSk7XG5cbi8qIE9uZSBHT09HT0x0aCBzaG91bGQgYmUgZW5vdWdoIGRlY2ltYWwgcGxhY2VzIGZvciBhbnlib2R5LiovXG5jb25zdCAgICAgICAgTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTPTEwMDskaOKAjV9vbmNlLk1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyhNQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMpO1xuXG5jb25zdCAgICAgICAgQXNzZXRLaW5kU2hhcGU9TS5vcignbmF0Jywnc2V0JywnY29weVNldCcsJ2NvcHlCYWcnKTskaOKAjV9vbmNlLkFzc2V0S2luZFNoYXBlKEFzc2V0S2luZFNoYXBlKTtcblxuY29uc3QgICAgICAgIERpc3BsYXlJbmZvU2hhcGU9TS5zcGxpdFJlY29yZChcbnt9LFxue1xuZGVjaW1hbFBsYWNlczpNLmFuZChcbk0uZ3RlKC1NQVhfQUJTT0xVVEVfREVDSU1BTF9QTEFDRVMpLFxuTS5sdGUoTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTKSksXG5cbmFzc2V0S2luZDpBc3NldEtpbmRTaGFwZX0sXG5cbntcbi8qIEluY2x1ZGluZyB0aGlzIGVtcHR5IGByZXN0YCBlbnN1cmVzIHRoYXQgdGhlcmUgYXJlIG5vIG90aGVyKi9cbi8qIHByb3BlcnRpZXMgYmV5b25kIHRob3NlIGluIHRoZSBgYmFzZWAgcmVjb3JkLiovfSk7JGjigI1fb25jZS5EaXNwbGF5SW5mb1NoYXBlKERpc3BsYXlJbmZvU2hhcGUpO1xuXG5cblxuY29uc3QgICAgICAgIElzc3VlcktpdFNoYXBlPWhhcmRlbih7XG5icmFuZDpCcmFuZFNoYXBlLFxubWludDpNaW50U2hhcGUsXG5taW50UmVjb3ZlcnlQdXJzZTpQdXJzZVNoYXBlLFxuaXNzdWVyOklzc3VlclNoYXBlLFxuZGlzcGxheUluZm86RGlzcGxheUluZm9TaGFwZX0pO1xuXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBJbnRlcmZhY2VzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi8kaOKAjV9vbmNlLklzc3VlcktpdFNoYXBlKElzc3VlcktpdFNoYXBlKTtcblxuY29uc3QgICAgICAgIEJyYW5kST1NLmludGVyZmFjZSgnQnJhbmQnLHtcbmlzTXlJc3N1ZXI6TS5jYWxsV2hlbihNLmF3YWl0KElzc3VlclNoYXBlKSkucmV0dXJucyhNLmJvb2xlYW4oKSksXG5nZXRBbGxlZ2VkTmFtZTpNLmNhbGwoKS5yZXR1cm5zKE0uc3RyaW5nKCkpLFxuZ2V0RGlzcGxheUluZm86TS5jYWxsKCkucmV0dXJucyhEaXNwbGF5SW5mb1NoYXBlKSxcbmdldEFtb3VudFNoYXBlOk0uY2FsbCgpLnJldHVybnMoTS5wYXR0ZXJuKCkpfSk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm59IFticmFuZFNoYXBlXVxuICogQHBhcmFtIHtQYXR0ZXJufSBbYXNzZXRLaW5kU2hhcGVdXG4gKiBAcGFyYW0ge1BhdHRlcm59IFthbW91bnRTaGFwZV1cbiAqLyRo4oCNX29uY2UuQnJhbmRJKEJyYW5kSSk7XG5jb25zdCAgICAgICAgbWFrZUlzc3VlckludGVyZmFjZXM9KFxuYnJhbmRTaGFwZT1CcmFuZFNoYXBlLFxuYXNzZXRLaW5kU2hhcGU9QXNzZXRLaW5kU2hhcGUsXG5hbW91bnRTaGFwZT1BbW91bnRTaGFwZSk9Plxue1xuY29uc3QgSXNzdWVyST1NLmludGVyZmFjZSgnSXNzdWVyJyx7XG5nZXRCcmFuZDpNLmNhbGwoKS5yZXR1cm5zKGJyYW5kU2hhcGUpLFxuZ2V0QWxsZWdlZE5hbWU6TS5jYWxsKCkucmV0dXJucyhNLnN0cmluZygpKSxcbmdldEFzc2V0S2luZDpNLmNhbGwoKS5yZXR1cm5zKGFzc2V0S2luZFNoYXBlKSxcbmdldERpc3BsYXlJbmZvOk0uY2FsbCgpLnJldHVybnMoRGlzcGxheUluZm9TaGFwZSksXG5tYWtlRW1wdHlQdXJzZTpNLmNhbGwoKS5yZXR1cm5zKFB1cnNlU2hhcGUpLFxuXG5pc0xpdmU6TS5jYWxsV2hlbihNLmF3YWl0KFBheW1lbnRTaGFwZSkpLnJldHVybnMoTS5ib29sZWFuKCkpLFxuZ2V0QW1vdW50T2Y6TS5jYWxsV2hlbihNLmF3YWl0KFBheW1lbnRTaGFwZSkpLnJldHVybnMoYW1vdW50U2hhcGUpLFxuYnVybjpNLmNhbGxXaGVuKE0uYXdhaXQoUGF5bWVudFNoYXBlKSkuXG5vcHRpb25hbChNLnBhdHRlcm4oKSkuXG5yZXR1cm5zKGFtb3VudFNoYXBlKSxcbmNsYWltOk0uY2FsbFdoZW4oTS5hd2FpdChQYXltZW50U2hhcGUpKS5cbm9wdGlvbmFsKE0ucGF0dGVybigpKS5cbnJldHVybnMoUGF5bWVudFNoYXBlKSxcbmNvbWJpbmU6TS5jYWxsKE0uYXJyYXlPZihNLmVyZWYoUGF5bWVudFNoYXBlKSkpLlxub3B0aW9uYWwoYW1vdW50U2hhcGUpLlxucmV0dXJucyhNLmVyZWYoUGF5bWVudFNoYXBlKSksXG5zcGxpdDpNLmNhbGxXaGVuKE0uYXdhaXQoUGF5bWVudFNoYXBlKSxhbW91bnRTaGFwZSkucmV0dXJucyhcbk0uYXJyYXlPZihQYXltZW50U2hhcGUpKSxcblxuc3BsaXRNYW55Ok0uY2FsbFdoZW4oXG5NLmF3YWl0KFBheW1lbnRTaGFwZSksXG5NLmFycmF5T2YoYW1vdW50U2hhcGUpKS5cbnJldHVybnMoTS5hcnJheU9mKFBheW1lbnRTaGFwZSkpfSk7XG5cblxuY29uc3QgTWludEk9TS5pbnRlcmZhY2UoJ01pbnQnLHtcbmdldElzc3VlcjpNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKSxcbm1pbnRQYXltZW50Ok0uY2FsbChhbW91bnRTaGFwZSkucmV0dXJucyhQYXltZW50U2hhcGUpfSk7XG5cblxuY29uc3QgUGF5bWVudEk9TS5pbnRlcmZhY2UoJ1BheW1lbnQnLHtcbmdldEFsbGVnZWRCcmFuZDpNLmNhbGwoKS5yZXR1cm5zKGJyYW5kU2hhcGUpfSk7XG5cblxuY29uc3QgUHVyc2VJPU0uaW50ZXJmYWNlKCdQdXJzZScse1xuZ2V0QWxsZWdlZEJyYW5kOk0uY2FsbCgpLnJldHVybnMoYnJhbmRTaGFwZSksXG5nZXRDdXJyZW50QW1vdW50Ok0uY2FsbCgpLnJldHVybnMoYW1vdW50U2hhcGUpLFxuZ2V0Q3VycmVudEFtb3VudE5vdGlmaWVyOk0uY2FsbCgpLnJldHVybnMoTm90aWZpZXJTaGFwZSksXG4vKiBQdXJzZUkgZG9lcyAqbm90KiBkZWxheSBgZGVwb3NpdGAgdW50aWwgYHNyY1BheW1lbnRgIGlzIGZ1bGZ1bGxlZC4qL1xuLyogUmF0aGVyLCB0aGUgc2VtYW50aWNzIG9mIGBkZXBvc2l0YCByZXF1aXJlIGl0IHRvIHByb3ZpZGUgaXRzKi9cbi8qIGNhbGxlcnMgd2l0aCBhIHN0cm9uZyBndWFyYW50ZWUgdGhhdCBgZGVwb3NpdGAgbWVzc2FnZXMgYXJlKi9cbi8qIHByb2Nlc3NlZCB3aXRob3V0IGZ1cnRoZXIgZGVsYXkgaW4gdGhlIG9yZGVyIHRoZXkgYXJyaXZlLiovXG4vKiBQdXJzZUkgdGhlcmVmb3JlIHJlcXVpcmVzIHRoYXQgdGhlIGBzcmNQYXltZW50YCBhcmd1bWVudCBhbHJlYWR5Ki9cbi8qIGJlIGEgcmVtb3RhYmxlLCBub3QgYSBwcm9taXNlLiovXG4vKiBQdXJzZUkgb25seSBjYWxscyB0aGlzIHJhdyBtZXRob2QgYWZ0ZXIgdmFsaWRhdGluZyB0aGF0Ki9cbi8qIGBzcmNQYXltZW50YCBpcyBhIHJlbW90YWJsZSwgbGVhdmluZyBpdCovXG4vKiB0byB0aGlzIHJhdyBtZXRob2QgdG8gdmFsaWRhdGUgdGhhdCB0aGlzIHJlbW90YWJsZSBpcyBhY3R1YWxseSovXG4vKiBhIGxpdmUgcGF5bWVudCBvZiB0aGUgY29ycmVjdCBicmFuZCB3aXRoIHN1ZmZpY2llbnQgZnVuZHMuKi9cbmRlcG9zaXQ6TS5jYWxsKFBheW1lbnRTaGFwZSkub3B0aW9uYWwoTS5wYXR0ZXJuKCkpLnJldHVybnMoYW1vdW50U2hhcGUpLFxuZ2V0RGVwb3NpdEZhY2V0Ok0uY2FsbCgpLnJldHVybnMoRGVwb3NpdEZhY2V0U2hhcGUpLFxud2l0aGRyYXc6TS5jYWxsKGFtb3VudFNoYXBlKS5yZXR1cm5zKFBheW1lbnRTaGFwZSksXG5nZXRSZWNvdmVyeVNldDpNLmNhbGwoKS5yZXR1cm5zKE0uc2V0T2YoUGF5bWVudFNoYXBlKSksXG5yZWNvdmVyQWxsOk0uY2FsbCgpLnJldHVybnMoYW1vdW50U2hhcGUpfSk7XG5cblxuY29uc3QgRGVwb3NpdEZhY2V0ST1NLmludGVyZmFjZSgnRGVwb3NpdEZhY2V0Jyx7XG5yZWNlaXZlOlB1cnNlSS5tZXRob2RHdWFyZHMuZGVwb3NpdH0pO1xuXG5cbmNvbnN0IFB1cnNlSUtpdD1oYXJkZW4oe1xucHVyc2U6UHVyc2VJLFxuZGVwb3NpdEZhY2V0OkRlcG9zaXRGYWNldEl9KTtcblxuXG5yZXR1cm4gaGFyZGVuKHtcbklzc3VlckksXG5NaW50SSxcblBheW1lbnRJLFxuUHVyc2VJS2l0fSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZUlzc3VlckludGVyZmFjZXMobWFrZUlzc3VlckludGVyZmFjZXMpO1xuaGFyZGVuKG1ha2VJc3N1ZXJJbnRlcmZhY2VzKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJCcmFuZFNoYXBlIjpbIkJyYW5kU2hhcGUiXSwiSXNzdWVyU2hhcGUiOlsiSXNzdWVyU2hhcGUiXSwiUGF5bWVudFNoYXBlIjpbIlBheW1lbnRTaGFwZSJdLCJQdXJzZVNoYXBlIjpbIlB1cnNlU2hhcGUiXSwiRGVwb3NpdEZhY2V0U2hhcGUiOlsiRGVwb3NpdEZhY2V0U2hhcGUiXSwiTm90aWZpZXJTaGFwZSI6WyJOb3RpZmllclNoYXBlIl0sIk1pbnRTaGFwZSI6WyJNaW50U2hhcGUiXSwiQW1vdW50U2hhcGUiOlsiQW1vdW50U2hhcGUiXSwiUmF0aW9TaGFwZSI6WyJSYXRpb1NoYXBlIl0sImlzTmF0VmFsdWUiOlsiaXNOYXRWYWx1ZSJdLCJpc0NvcHlTZXRWYWx1ZSI6WyJpc0NvcHlTZXRWYWx1ZSJdLCJpc1NldFZhbHVlIjpbImlzU2V0VmFsdWUiXSwiaXNDb3B5QmFnVmFsdWUiOlsiaXNDb3B5QmFnVmFsdWUiXSwiTUFYX0FCU09MVVRFX0RFQ0lNQUxfUExBQ0VTIjpbIk1BWF9BQlNPTFVURV9ERUNJTUFMX1BMQUNFUyJdLCJBc3NldEtpbmRTaGFwZSI6WyJBc3NldEtpbmRTaGFwZSJdLCJEaXNwbGF5SW5mb1NoYXBlIjpbIkRpc3BsYXlJbmZvU2hhcGUiXSwiSXNzdWVyS2l0U2hhcGUiOlsiSXNzdWVyS2l0U2hhcGUiXSwiQnJhbmRJIjpbIkJyYW5kSSJdLCJtYWtlSXNzdWVySW50ZXJmYWNlcyI6WyJtYWtlSXNzdWVySW50ZXJmYWNlcyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABX6JD1fkEAAH5BAAApAAAAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL3R5cGVzLWFtYmllbnQuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBbW91bnRcbiAqIEFtb3VudHMgYXJlIGRlc2NyaXB0aW9ucyBvZiBkaWdpdGFsIGFzc2V0cywgYW5zd2VyaW5nIHRoZSBxdWVzdGlvbnNcbiAqIFwiaG93IG11Y2hcIiBhbmQgXCJvZiB3aGF0IGtpbmRcIi4gQW1vdW50cyBhcmUgdmFsdWVzIGxhYmVsZWQgd2l0aCBhIGJyYW5kLlxuICogQW1vdW50TWF0aCBleGVjdXRlcyB0aGUgbG9naWMgb2YgaG93IGFtb3VudHMgYXJlIGNoYW5nZWQgd2hlbiBkaWdpdGFsXG4gKiBhc3NldHMgYXJlIG1lcmdlZCwgc2VwYXJhdGVkLCBvciBvdGhlcndpc2UgbWFuaXB1bGF0ZWQuIEZvclxuICogZXhhbXBsZSwgYSBkZXBvc2l0IG9mIDIgYnVja3MgaW50byBhIHB1cnNlIHRoYXQgYWxyZWFkeSBoYXMgMyBidWNrc1xuICogZ2l2ZXMgYSBuZXcgcHVyc2UgYmFsYW5jZSBvZiA1IGJ1Y2tzLiBBbiBlbXB0eSBwdXJzZSBoYXMgMCBidWNrcy4gQW1vdW50TWF0aFxuICogcmVsaWVzIGhlYXZpbHkgb24gcG9seW1vcnBoaWMgTWF0aEhlbHBlcnMsIHdoaWNoIG1hbmlwdWxhdGUgdGhlIHVuYnJhbmRlZFxuICogcG9ydGlvbi5cbiAqXG4gKiBAcHJvcGVydHkge0JyYW5kPEs+fSBicmFuZFxuICogQHByb3BlcnR5IHtBc3NldFZhbHVlRm9yS2luZDxLPn0gdmFsdWVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtOYXRWYWx1ZSB8IFNldFZhbHVlIHwgQ29weVNldFZhbHVlIHwgQ29weUJhZ1ZhbHVlfSBBbW91bnRWYWx1ZVxuICogQW4gYEFtb3VudFZhbHVlYCBkZXNjcmliZXMgYSBzZXQgb3IgcXVhbnRpdHkgb2YgYXNzZXRzIHRoYXQgY2FuIGJlIG93bmVkIG9yXG4gKiBzaGFyZWQuXG4gKlxuICogQSBmdW5naWJsZSBgQW1vdW50VmFsdWVgIHVzZXMgYSBub24tbmVnYXRpdmUgYmlnaW50IHRvIHJlcHJlc2VudCBhIHF1YW50aXR5XG4gKiBvZiB0aGF0IG1hbnkgYXNzZXRzLlxuICpcbiAqIEEgbm9uLWZ1bmdpYmxlIGBBbW91bnRWYWx1ZWAgdXNlcyBhbiBhcnJheSBvciBDb3B5U2V0IG9mIGBLZXlgcyB0byByZXByZXNlbnRcbiAqIGEgc2V0IG9mIHdoYXRldmVyIGFzc2V0IGVhY2gga2V5IHJlcHJlc2VudHMuIEEgYEtleWAgaXMgYSBwYXNzYWJsZSB2YWx1ZVxuICogdGhhdCBjYW4gYmUgdXNlZCBhcyBhbiBlbGVtZW50IGluIGEgc2V0IChTZXRTdG9yZSBvciBDb3B5U2V0KSBvciBhcyB0aGVcbiAqIGtleSBpbiBhIG1hcCAoTWFwU3RvcmUgb3IgQ29weU1hcCkuXG4gKlxuICogYFNldFZhbHVlYCBpcyBmb3IgdGhlIGRlcHJlY2F0ZWQgc2V0IHJlcHJlc2VudGF0aW9uLCB1c2luZyBhbiBhcnJheSBkaXJlY3RseVxuICogdG8gcmVwcmVzZW50IHRoZSBhcnJheSBvZiBpdHMgZWxlbWVudHMuIGBDb3B5U2V0VmFsdWVgIGlzIHRoZSBwcm9wZXJcbiAqIHJlcHJlc2VudGF0aW9uIHVzaW5nIGEgQ29weVNldC5cbiAqXG4gKiBBIHNlbWktZnVuZ2libGUgYENvcHlCYWdWYWx1ZWAgaXMgcmVwcmVzZW50ZWQgYXMgYVxuICogYENvcHlCYWdgIG9mIGBLZXlgIG9iamVjdHMuIFwiQmFnXCIgaXMgc3lub255bW91cyB3aXRoIE11bHRpU2V0LCB3aGVyZSBhblxuICogZWxlbWVudCBvZiBhIGJhZyBjYW4gYmUgcHJlc2VudCBvbmNlIG9yIG1vcmUgdGltZXMsIGkuZS4sIHNvbWUgcG9zaXRpdmVcbiAqIGJpZ2ludCBudW1iZXIgb2YgdGltZXMsIHJlcHJlc2VudGluZyB0aGF0IHF1YW50aXR5IG9mIHRoZSBhc3NldCByZXByZXNlbnRlZFxuICogYnkgdGhhdCBrZXkuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7J25hdCcgfCAnc2V0JyB8ICdjb3B5U2V0JyB8ICdjb3B5QmFnJyB9IEFzc2V0S2luZFxuICpcbiAqIFNlZSBkb2MtY29tbWVudCBmb3IgYEFtb3VudFZhbHVlYC5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAdHlwZWRlZiB7SyBleHRlbmRzICduYXQnID8gTmF0VmFsdWUgOlxuICogSyBleHRlbmRzICdzZXQnID8gU2V0VmFsdWUgOlxuICogSyBleHRlbmRzICdjb3B5U2V0JyA/IENvcHlTZXRWYWx1ZTpcbiAqIEsgZXh0ZW5kcyAnY29weUJhZycgPyBDb3B5QmFnVmFsdWUgOlxuICogbmV2ZXJcbiAqIH0gQXNzZXRWYWx1ZUZvcktpbmRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QW1vdW50VmFsdWV9IFZcbiAqIEB0eXBlZGVmIHtWIGV4dGVuZHMgTmF0VmFsdWUgPyAnbmF0JyA6XG4gKiAgViBleHRlbmRzIFNldFZhbHVlID8gJ3NldCcgOlxuICogIFYgZXh0ZW5kcyBDb3B5U2V0VmFsdWUgPyAnY29weVNldCcgOlxuICogIFYgZXh0ZW5kcyBDb3B5QmFnVmFsdWUgPyAnY29weUJhZycgOlxuICogIG5ldmVyfSBBc3NldEtpbmRGb3JWYWx1ZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IERpc3BsYXlJbmZvXG4gKiBAcHJvcGVydHkge251bWJlcn0gW2RlY2ltYWxQbGFjZXNdIFRlbGxzIHRoZSBkaXNwbGF5IHNvZnR3YXJlIGhvd1xuICogICBtYW55IGRlY2ltYWwgcGxhY2VzIHRvIG1vdmUgdGhlIGRlY2ltYWwgb3ZlciB0byB0aGUgbGVmdCwgb3IgaW5cbiAqICAgb3RoZXIgd29yZHMsIHdoaWNoIHBvc2l0aW9uIGNvcnJlc3BvbmRzIHRvIHdob2xlIG51bWJlcnMuIFdlXG4gKiAgIHJlcXVpcmUgZnVuZ2libGUgZGlnaXRhbCBhc3NldHMgdG8gYmUgcmVwcmVzZW50ZWQgaW4gaW50ZWdlcnMsIGluXG4gKiAgIHRoZSBzbWFsbGVzdCB1bml0IChpLmUuIFVTRCBtaWdodCBiZSByZXByZXNlbnRlZCBpbiBtaWxsLCBhXG4gKiAgIHRob3VzYW5kdGggb2YgYSBkb2xsYXIuIEluIHRoYXQgY2FzZSwgYGRlY2ltYWxQbGFjZXNgIHdvdWxkIGJlXG4gKiAgIDMuKSBUaGlzIHByb3BlcnR5IGlzIG9wdGlvbmFsLCBhbmQgZm9yIG5vbi1mdW5naWJsZSBkaWdpdGFsXG4gKiAgIGFzc2V0cywgc2hvdWxkIG5vdCBiZSBzcGVjaWZpZWQuIFRoZSBkZWNpbWFsUGxhY2VzIHByb3BlcnR5XG4gKiAgIHNob3VsZCBiZSB1c2VkIGZvciAqZGlzcGxheSBwdXJwb3NlcyBvbmx5Ki4gQW55IG90aGVyIHVzZSBpcyBhblxuICogICBhbnRpLXBhdHRlcm4uXG4gKiBAcHJvcGVydHkge0t9IGFzc2V0S2luZCAtIHRoZSBraW5kIG9mIGFzc2V0LCBlaXRoZXJcbiAqICAgQXNzZXRLaW5kLk5BVCAoZnVuZ2libGUpIG9yXG4gKiAgIEFzc2V0S2luZC5TRVQgb3IgQXNzZXRLaW5kLkNPUFlfU0VUIChub24tZnVuZ2libGUpXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gQnJhbmRcbiAqIFRoZSBicmFuZCBpZGVudGlmaWVzIHRoZSBraW5kIG9mIGlzc3VlciwgYW5kIGhhcyBhIGZ1bmN0aW9uIHRvIGdldCB0aGVcbiAqIGFsbGVnZWQgbmFtZSBmb3IgdGhlIGtpbmQgb2YgYXNzZXQgZGVzY3JpYmVkLiBUaGUgYWxsZWdlZCBuYW1lIChzdWNoXG4gKiBhcyAnQlRDJyBvciAnbW9vbGEnKSBpcyBwcm92aWRlZCBieSB0aGUgbWFrZXIgb2YgdGhlIGlzc3VlciBhbmQgc2hvdWxkXG4gKiBub3QgYmUgdHJ1c3RlZCBhcyBhY2N1cmF0ZS5cbiAqXG4gKiBFdmVyeSBhbW91bnQgY3JlYXRlZCBieSBhIHBhcnRpY3VsYXIgQW1vdW50TWF0aCB3aWxsIHNoYXJlIHRoZSBzYW1lIGJyYW5kLFxuICogYnV0IHJlY2lwaWVudHMgY2Fubm90IHJlbHkgb24gdGhlIGJyYW5kIHRvIHZlcmlmeSB0aGF0IGEgcHVycG9ydGVkIGFtb3VudFxuICogcmVwcmVzZW50cyB0aGUgaXNzdWVyIHRoZXkgaW50ZW5kZWQsIHNpbmNlIHRoZSBzYW1lIGJyYW5kIGNhbiBiZSByZXVzZWQgYnlcbiAqIGEgbWlzYmVoYXZpbmcgaXNzdWVyLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGFsbGVnZWRJc3N1ZXI6IEVSZWY8SXNzdWVyPikgPT4gUHJvbWlzZTxib29sZWFuPn0gaXNNeUlzc3VlclxuICogU2hvdWxkIGJlIHVzZWQgd2l0aCBgaXNzdWVyLmdldEJyYW5kYCB0byBlbnN1cmUgYW4gaXNzdWVyIGFuZCBicmFuZCBtYXRjaC5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nfSBnZXRBbGxlZ2VkTmFtZVxuICogQHByb3BlcnR5IHsoKSA9PiBEaXNwbGF5SW5mbzxLPn0gZ2V0RGlzcGxheUluZm9cbiAqIEdpdmUgaW5mb3JtYXRpb24gdG8gVUkgb24gaG93IHRvIGRpc3BsYXkgdGhlIGFtb3VudC5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUGF0dGVybn0gZ2V0QW1vdW50U2hhcGVcbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gSXNzdWVyIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQGNhbGxiYWNrIElzc3VlcklzTGl2ZVxuICpcbiAqIFJldHVybiB0cnVlIGlmIHRoZSBwYXltZW50IGNvbnRpbnVlcyB0byBleGlzdC5cbiAqXG4gKiBJZiB0aGUgcGF5bWVudCBpcyBhIHByb21pc2UsIHRoZSBvcGVyYXRpb24gd2lsbCBwcm9jZWVkIHVwb25cbiAqIHJlc29sdXRpb24uXG4gKlxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ+fSBwYXltZW50XG4gKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn1cbiAqL1xuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQGNhbGxiYWNrIElzc3VlckdldEFtb3VudE9mXG4gKlxuICogR2V0IHRoZSBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgaW4gdGhlIHBheW1lbnQuIEJlY2F1c2UgdGhlXG4gKiBwYXltZW50IGlzIG5vdCB0cnVzdGVkLCB3ZSBjYW5ub3QgY2FsbCBhIG1ldGhvZCBvbiBpdCBkaXJlY3RseSwgYW5kXG4gKiBtdXN0IHVzZSB0aGUgaXNzdWVyIGluc3RlYWQuXG4gKlxuICogSWYgdGhlIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aGUgb3BlcmF0aW9uIHdpbGwgcHJvY2VlZCB1cG9uXG4gKiByZXNvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50Pn0gcGF5bWVudFxuICogQHJldHVybnMge1Byb21pc2U8QW1vdW50PEs+Pn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBJc3N1ZXJCdXJuXG4gKlxuICogQnVybiBhbGwgb2YgdGhlIGRpZ2l0YWwgYXNzZXRzIGluIHRoZVxuICogcGF5bWVudC4gYG9wdEFtb3VudGAgaXMgb3B0aW9uYWwuIElmIGBvcHRBbW91bnRgIGlzIHByZXNlbnQsIHRoZVxuICogY29kZSB3aWxsIGluc2lzdCB0aGF0IHRoZSBhbW91bnQgb2YgdGhlIGRpZ2l0YWwgYXNzZXRzIGluIHRoZVxuICogcGF5bWVudCBpcyBlcXVhbCB0byBgb3B0QW1vdW50YCwgdG8gcHJldmVudCBzZW5kaW5nIHRoZSB3cm9uZ1xuICogcGF5bWVudCBhbmQgb3RoZXIgY29uZnVzaW9uLlxuICpcbiAqIElmIHRoZSBwYXltZW50IGlzIGEgcHJvbWlzZSwgdGhlIG9wZXJhdGlvbiB3aWxsIHByb2NlZWQgdXBvblxuICogcmVzb2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudD59IHBheW1lbnRcbiAqIEBwYXJhbSB7UGF0dGVybn0gW29wdEFtb3VudFNoYXBlXVxuICogQHJldHVybnMge1Byb21pc2U8QW1vdW50Pn1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAY2FsbGJhY2sgSXNzdWVyQ2xhaW1cbiAqXG4gKiBUcmFuc2ZlciBhbGwgZGlnaXRhbCBhc3NldHMgZnJvbSB0aGUgcGF5bWVudCB0byBhIG5ldyBwYXltZW50IGFuZFxuICogZGVsZXRlIHRoZSBvcmlnaW5hbC4gYG9wdEFtb3VudGAgaXMgb3B0aW9uYWwuIElmIGBvcHRBbW91bnRgIGlzXG4gKiBwcmVzZW50LCB0aGUgY29kZSB3aWxsIGluc2lzdCB0aGF0IHRoZSBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgaW5cbiAqIHRoZSBwYXltZW50IGlzIGVxdWFsIHRvIGBvcHRBbW91bnRgLCB0byBwcmV2ZW50IHNlbmRpbmcgdGhlIHdyb25nXG4gKiBwYXltZW50IGFuZCBvdGhlciBjb25mdXNpb24uXG4gKlxuICogSWYgdGhlIHBheW1lbnQgaXMgYSBwcm9taXNlLCB0aGUgb3BlcmF0aW9uIHdpbGwgcHJvY2VlZCB1cG9uXG4gKiByZXNvbHV0aW9uLlxuICpcbiAqIEBwYXJhbSB7RVJlZjxQYXltZW50PEs+Pn0gcGF5bWVudFxuICogQHBhcmFtIHtQYXR0ZXJufSBbb3B0QW1vdW50U2hhcGVdXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxQYXltZW50PEs+Pn1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBLXG4gKiBAY2FsbGJhY2sgSXNzdWVyQ29tYmluZVxuICpcbiAqIENvbWJpbmUgbXVsdGlwbGUgcGF5bWVudHMgaW50byBvbmUgcGF5bWVudC5cbiAqXG4gKiBJZiBhbnkgb2YgdGhlIHBheW1lbnRzIGlzIGEgcHJvbWlzZSwgdGhlIG9wZXJhdGlvbiB3aWxsIHByb2NlZWRcbiAqIHVwb24gcmVzb2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudDxLPj5bXX0gcGF5bWVudHNBcnJheVxuICogQHBhcmFtIHtBbW91bnQ8Sz59IFtvcHRUb3RhbEFtb3VudF1cbiAqIEByZXR1cm5zIHtQcm9taXNlPFBheW1lbnQ8Sz4+fVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IEtcbiAqIEBjYWxsYmFjayBJc3N1ZXJTcGxpdFxuICpcbiAqIFNwbGl0IGEgc2luZ2xlIHBheW1lbnQgaW50byB0d28gcGF5bWVudHMsXG4gKiBBIGFuZCBCLCBhY2NvcmRpbmcgdG8gdGhlIHBheW1lbnRBbW91bnRBIHBhc3NlZCBpbi5cbiAqXG4gKiBJZiB0aGUgcGF5bWVudCBpcyBhIHByb21pc2UsIHRoZSBvcGVyYXRpb24gd2lsbCBwcm9jZWVkIHVwb25cbiAqIHJlc29sdXRpb24uXG4gKlxuICogQHBhcmFtIHtFUmVmPFBheW1lbnQ8Sz4+fSBwYXltZW50XG4gKiBAcGFyYW0ge0Ftb3VudDxLPn0gcGF5bWVudEFtb3VudEFcbiAqIEByZXR1cm5zIHtQcm9taXNlPFBheW1lbnQ8Sz5bXT59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgSXNzdWVyU3BsaXRNYW55XG4gKlxuICogU3BsaXQgYSBzaW5nbGUgcGF5bWVudCBpbnRvIG1hbnkgcGF5bWVudHMsIGFjY29yZGluZyB0byB0aGUgYW1vdW50c1xuICogcGFzc2VkIGluLlxuICpcbiAqIElmIHRoZSBwYXltZW50IGlzIGEgcHJvbWlzZSwgdGhlIG9wZXJhdGlvbiB3aWxsIHByb2NlZWQgdXBvblxuICogcmVzb2x1dGlvbi5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8UGF5bWVudD59IHBheW1lbnRcbiAqIEBwYXJhbSB7QW1vdW50W119IGFtb3VudHNcbiAqIEByZXR1cm5zIHtQcm9taXNlPFBheW1lbnRbXT59XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gSXNzdWVyXG4gKlxuICogVGhlIGlzc3VlciBjYW5ub3QgbWludCBhIG5ldyBhbW91bnQsIGJ1dCBpdCBjYW4gY3JlYXRlIGVtcHR5IHB1cnNlc1xuICogYW5kIHBheW1lbnRzLiBUaGUgaXNzdWVyIGNhbiBhbHNvIHRyYW5zZm9ybSBwYXltZW50cyAoc3BsaXR0aW5nXG4gKiBwYXltZW50cywgY29tYmluaW5nIHBheW1lbnRzLCBidXJuaW5nIHBheW1lbnRzLCBhbmQgY2xhaW1pbmdcbiAqIHBheW1lbnRzIGV4Y2x1c2l2ZWx5KS4gVGhlIGlzc3VlciBzaG91bGQgYmUgZ290dGVuIGZyb20gYSB0cnVzdGVkXG4gKiBzb3VyY2UgYW5kIHRoZW4gcmVsaWVkIHVwb24gYXMgdGhlIGRlY2lkZXIgb2Ygd2hldGhlciBhbiB1bnRydXN0ZWRcbiAqIHBheW1lbnQgaXMgdmFsaWQuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBCcmFuZDxLPn0gZ2V0QnJhbmQgR2V0IHRoZSBCcmFuZCBmb3IgdGhpcyBJc3N1ZXIuIFRoZVxuICogQnJhbmQgaW5kaWNhdGVzIHRoZSB0eXBlIG9mIGRpZ2l0YWwgYXNzZXQgYW5kIGlzIHNoYXJlZCBieSB0aGVcbiAqIG1pbnQsIHRoZSBpc3N1ZXIsIGFuZCBhbnkgcHVyc2VzIGFuZCBwYXltZW50cyBvZiB0aGlzIHBhcnRpY3VsYXJcbiAqIGtpbmQuIFRoZSBicmFuZCBpcyBub3QgY2xvc2VseSBoZWxkLCBzbyB0aGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmVcbiAqIHRydXN0ZWQgdG8gaWRlbnRpZnkgYW4gaXNzdWVyIGFsb25lLiBGYWtlIGRpZ2l0YWwgYXNzZXRzIGFuZCBhbW91bnRcbiAqIGNhbiB1c2UgYW5vdGhlciBpc3N1ZXIncyBicmFuZC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gZ2V0QWxsZWdlZE5hbWUgR2V0IHRoZSBhbGxlZ2VkTmFtZSBmb3JcbiAqIHRoaXMgbWludC9pc3N1ZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQXNzZXRLaW5kfSBnZXRBc3NldEtpbmQgR2V0IHRoZSBraW5kIG9mXG4gKiBNYXRoSGVscGVycyB1c2VkIGJ5IHRoaXMgSXNzdWVyLlxuICogQHByb3BlcnR5IHsoKSA9PiBEaXNwbGF5SW5mb30gZ2V0RGlzcGxheUluZm8gR2l2ZSBpbmZvcm1hdGlvbiB0byBVSVxuICogIG9uIGhvdyB0byBkaXNwbGF5IGFtb3VudHMgZm9yIHRoaXMgaXNzdWVyLlxuICogQHByb3BlcnR5IHsoKSA9PiBQdXJzZTxLPn0gbWFrZUVtcHR5UHVyc2UgTWFrZSBhbiBlbXB0eSBwdXJzZSBvZiB0aGlzXG4gKiBicmFuZC5cbiAqIEBwcm9wZXJ0eSB7SXNzdWVySXNMaXZlfSBpc0xpdmVcbiAqIEBwcm9wZXJ0eSB7SXNzdWVyR2V0QW1vdW50T2Y8Sz59IGdldEFtb3VudE9mXG4gKiBAcHJvcGVydHkge0lzc3VlckJ1cm59IGJ1cm5cbiAqIEBwcm9wZXJ0eSB7SXNzdWVyQ2xhaW08Sz59IGNsYWltXG4gKiBAcHJvcGVydHkge0lzc3VlckNvbWJpbmU8Sz59IGNvbWJpbmVcbiAqIEBwcm9wZXJ0eSB7SXNzdWVyU3BsaXQ8Sz59IHNwbGl0XG4gKiBAcHJvcGVydHkge0lzc3VlclNwbGl0TWFueX0gc3BsaXRNYW55XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gUGF5bWVudExlZGdlclxuICogQHByb3BlcnR5IHtNaW50PEs+fSBtaW50XG4gKiBAcHJvcGVydHkge1B1cnNlPEs+fSBtaW50UmVjb3ZlcnlQdXJzZVxuICogQHByb3BlcnR5IHtJc3N1ZXI8Sz59IGlzc3VlclxuICogQHByb3BlcnR5IHtCcmFuZDxLPn0gYnJhbmRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7QXNzZXRLaW5kfSBbSz1Bc3NldEtpbmRdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBJc3N1ZXJLaXRcbiAqIEBwcm9wZXJ0eSB7TWludDxLPn0gbWludFxuICogQHByb3BlcnR5IHtQdXJzZTxLPn0gbWludFJlY292ZXJ5UHVyc2VcbiAqIEBwcm9wZXJ0eSB7SXNzdWVyPEs+fSBpc3N1ZXJcbiAqIEBwcm9wZXJ0eSB7QnJhbmQ8Sz59IGJyYW5kXG4gKiBAcHJvcGVydHkge0Rpc3BsYXlJbmZvfSBkaXNwbGF5SW5mb1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQWRkaXRpb25hbERpc3BsYXlJbmZvXG4gKlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtkZWNpbWFsUGxhY2VzXSBUZWxscyB0aGUgZGlzcGxheSBzb2Z0d2FyZSBob3dcbiAqICAgbWFueSBkZWNpbWFsIHBsYWNlcyB0byBtb3ZlIHRoZSBkZWNpbWFsIG92ZXIgdG8gdGhlIGxlZnQsIG9yIGluXG4gKiAgIG90aGVyIHdvcmRzLCB3aGljaCBwb3NpdGlvbiBjb3JyZXNwb25kcyB0byB3aG9sZSBudW1iZXJzLiBXZVxuICogICByZXF1aXJlIGZ1bmdpYmxlIGRpZ2l0YWwgYXNzZXRzIHRvIGJlIHJlcHJlc2VudGVkIGluIGludGVnZXJzLCBpblxuICogICB0aGUgc21hbGxlc3QgdW5pdCAoaS5lLiBVU0QgbWlnaHQgYmUgcmVwcmVzZW50ZWQgaW4gbWlsbCwgYVxuICogICB0aG91c2FuZHRoIG9mIGEgZG9sbGFyLiBJbiB0aGF0IGNhc2UsIGBkZWNpbWFsUGxhY2VzYCB3b3VsZCBiZVxuICogICAzLikgVGhpcyBwcm9wZXJ0eSBpcyBvcHRpb25hbCwgYW5kIGZvciBub24tZnVuZ2libGUgZGlnaXRhbFxuICogICBhc3NldHMsIHNob3VsZCBub3QgYmUgc3BlY2lmaWVkLiBUaGUgZGVjaW1hbFBsYWNlcyBwcm9wZXJ0eVxuICogICBzaG91bGQgYmUgdXNlZCBmb3IgKmRpc3BsYXkgcHVycG9zZXMgb25seSouIEFueSBvdGhlciB1c2UgaXMgYW5cbiAqICAgYW50aS1wYXR0ZXJuLlxuICogQHByb3BlcnR5IHtBc3NldEtpbmR9IFthc3NldEtpbmRdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnQGFnb3JpYy9zd2luZ3NldC12YXQnKS5TaHV0ZG93bldpdGhGYWlsdXJlfSBTaHV0ZG93bldpdGhGYWlsdXJlXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gTWludFxuICogSG9sZGluZyBhIE1pbnQgY2FycmllcyB0aGUgcmlnaHQgdG8gaXNzdWUgbmV3IGRpZ2l0YWwgYXNzZXRzLiBUaGVzZVxuICogYXNzZXRzIGFsbCBoYXZlIHRoZSBzYW1lIGtpbmQsIHdoaWNoIGlzIGNhbGxlZCBhIEJyYW5kLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSXNzdWVyPEs+fSBnZXRJc3N1ZXIgR2V0cyB0aGUgSXNzdWVyIGZvciB0aGlzIG1pbnQuXG4gKiBAcHJvcGVydHkgeyhuZXdBbW91bnQ6IEFtb3VudDxLPikgPT4gUGF5bWVudDxLPn0gbWludFBheW1lbnRcbiAqIENyZWF0ZXMgYSBuZXcgUGF5bWVudCBjb250YWluaW5nIG5ld2x5IG1pbnRlZCBhbW91bnQuXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgRGVwb3NpdEZhY2V0UmVjZWl2ZVxuICogQHBhcmFtIHtQYXltZW50fSBwYXltZW50XG4gKiBAcGFyYW0ge1BhdHRlcm59IFtvcHRBbW91bnRTaGFwZV1cbiAqIEByZXR1cm5zIHtBbW91bnR9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZXBvc2l0RmFjZXRcbiAqIEBwcm9wZXJ0eSB7RGVwb3NpdEZhY2V0UmVjZWl2ZX0gcmVjZWl2ZVxuICogRGVwb3NpdCBhbGwgdGhlIGNvbnRlbnRzIG9mIHBheW1lbnQgaW50byB0aGUgcHVyc2UgdGhhdCBtYWRlIHRoaXMgZmFjZXQsXG4gKiByZXR1cm5pbmcgdGhlIGFtb3VudC4gSWYgdGhlIG9wdGlvbmFsIGFyZ3VtZW50IGBvcHRBbW91bnRgIGRvZXMgbm90IGVxdWFsIHRoZVxuICogYW1vdW50IG9mIGRpZ2l0YWwgYXNzZXRzIGluIHRoZSBwYXltZW50LCB0aHJvdyBhbiBlcnJvci5cbiAqXG4gKiBJZiBwYXltZW50IGlzIGEgcHJvbWlzZSwgdGhyb3cgYW4gZXJyb3IuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gS1xuICogQGNhbGxiYWNrIFB1cnNlRGVwb3NpdFxuICogQHBhcmFtIHtQYXltZW50PEs+fSBwYXltZW50XG4gKiBAcGFyYW0ge1BhdHRlcm59IFtvcHRBbW91bnRTaGFwZV1cbiAqIEByZXR1cm5zIHtBbW91bnQ8Sz59XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gUHVyc2VcbiAqIFB1cnNlcyBob2xkIGFtb3VudCBvZiBkaWdpdGFsIGFzc2V0cyBvZiB0aGUgc2FtZSBicmFuZCwgYnV0IHVubGlrZSBQYXltZW50cyxcbiAqIHRoZXkgYXJlIG5vdCBtZWFudCB0byBiZSBzZW50IHRvIG90aGVycy4gVG8gdHJhbnNmZXIgZGlnaXRhbCBhc3NldHMsIGFcbiAqIFBheW1lbnQgc2hvdWxkIGJlIHdpdGhkcmF3biBmcm9tIGEgUHVyc2UuIFRoZSBhbW91bnQgb2YgZGlnaXRhbFxuICogYXNzZXRzIGluIGEgcHVyc2UgY2FuIGNoYW5nZSB0aHJvdWdoIHRoZSBhY3Rpb24gb2YgZGVwb3NpdCgpIGFuZCB3aXRoZHJhdygpLlxuICpcbiAqIFRoZSBwcmltYXJ5IHVzZSBmb3IgUHVyc2VzIGFuZCBQYXltZW50cyBpcyBmb3IgY3VycmVuY3ktbGlrZSBhbmQgZ29vZHMtbGlrZVxuICogZGlnaXRhbCBhc3NldHMsIGJ1dCB0aGV5IGNhbiBhbHNvIGJlIHVzZWQgdG8gcmVwcmVzZW50IG90aGVyIGtpbmRzIG9mIHJpZ2h0cyxcbiAqIHN1Y2ggYXMgdGhlIHJpZ2h0IHRvIHBhcnRpY2lwYXRlIGluIGEgcGFydGljdWxhciBjb250cmFjdC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IEJyYW5kPEs+fSBnZXRBbGxlZ2VkQnJhbmQgR2V0IHRoZSBhbGxlZ2VkIEJyYW5kIGZvciB0aGlzIFB1cnNlXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBBbW91bnQ8Sz59IGdldEN1cnJlbnRBbW91bnRcbiAqIEdldCB0aGUgYW1vdW50IGNvbnRhaW5lZCBpbiB0aGlzIHB1cnNlLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTm90aWZpZXI8QW1vdW50PEs+Pn0gZ2V0Q3VycmVudEFtb3VudE5vdGlmaWVyXG4gKiBHZXQgYSBsb3NzeSBub3RpZmllciBmb3IgY2hhbmdlcyB0byB0aGlzIHB1cnNlJ3MgYmFsYW5jZS5cbiAqXG4gKiBAcHJvcGVydHkge1B1cnNlRGVwb3NpdDxLPn0gZGVwb3NpdFxuICogRGVwb3NpdCBhbGwgdGhlIGNvbnRlbnRzIG9mIHBheW1lbnQgaW50byB0aGlzIHB1cnNlLCByZXR1cm5pbmcgdGhlXG4gKiBhbW91bnQuIElmIHRoZSBvcHRpb25hbCBhcmd1bWVudCBgb3B0QW1vdW50YCBkb2VzIG5vdCBlcXVhbCB0aGVcbiAqIGFtb3VudCBvZiBkaWdpdGFsIGFzc2V0cyBpbiB0aGUgcGF5bWVudCwgdGhyb3cgYW4gZXJyb3IuXG4gKlxuICogSWYgcGF5bWVudCBpcyBhIHByb21pc2UsIHRocm93IGFuIGVycm9yLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gRGVwb3NpdEZhY2V0fSBnZXREZXBvc2l0RmFjZXRcbiAqIFJldHVybiBhbiBvYmplY3Qgd2hvc2UgYHJlY2VpdmVgIG1ldGhvZCBkZXBvc2l0cyB0byB0aGUgY3VycmVudCBQdXJzZS5cbiAqXG4gKiBAcHJvcGVydHkgeyhhbW91bnQ6IEFtb3VudDxLPikgPT4gUGF5bWVudDxLPn0gd2l0aGRyYXdcbiAqIFdpdGhkcmF3IGFtb3VudCBmcm9tIHRoaXMgcHVyc2UgaW50byBhIG5ldyBQYXltZW50LlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQ29weVNldDxQYXltZW50PEs+Pn0gZ2V0UmVjb3ZlcnlTZXRcbiAqIFRoZSBzZXQgb2YgcGF5bWVudHMgd2l0aGRyYXduIGZyb20gdGhpcyBwdXJzZSB0aGF0IGFyZSBzdGlsbCBsaXZlLiBUaGVzZVxuICogYXJlIHRoZSBwYXltZW50cyB0aGF0IGNhbiBzdGlsbCBiZSByZWNvdmVyZWQgaW4gZW1lcmdlbmNpZXMgYnksIGZvciBleGFtcGxlLFxuICogZGVwb3NpdGluZyBpbnRvIHRoaXMgcHVyc2UuIFN1Y2ggYSBkZXBvc2l0IGFjdGlvbiBpcyBsaWtlIGNhbmNlbGluZyBhblxuICogb3V0c3RhbmRpbmcgY2hlY2sgYmVjYXVzZSB5b3UncmUgdGlyZWQgb2Ygd2FpdGluZyBmb3IgaXQuIE9uY2UgeW91clxuICogY2FuY2VsbGF0aW9uIGlzIGFja25vd2xlZGdlZCwgeW91IGNhbiBzcGVuZCB0aGUgYXNzZXRzIGF0IHN0YWtlIG9uIG90aGVyXG4gKiB0aGluZ3MuIEFmdGVyd2FyZHMsIGlmIHRoZSByZWNpcGllbnQgb2YgdGhlIG9yaWdpbmFsIGNoZWNrIGZpbmFsbHkgZ2V0c1xuICogYXJvdW5kIHRvIGRlcG9zaXRpbmcgaXQsIHRoZWlyIGRlcG9zaXQgZmFpbHMuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBBbW91bnQ8Sz59IHJlY292ZXJBbGxcbiAqIEZvciB1c2UgaW4gZW1lcmdlbmNpZXMsIHN1Y2ggYXMgY29taW5nIGJhY2sgZnJvbSBhIHRyYXVtYXRpYyBjcmFzaCBhbmRcbiAqIHVwZ3JhZGUuIFRoaXMgZGVwb3NpdHMgYWxsIHRoZSBwYXltZW50cyBpbiB0aGlzIHB1cnNlJ3MgcmVjb3Zlcnkgc2V0XG4gKiBpbnRvIHRoZSBwdXJzZSBpdHNlbGYsIHJldHVybmluZyB0aGUgdG90YWwgYW1vdW50IG9mIGFzc2V0cyByZWNvdmVyZWQuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gUGF5bWVudFxuICogUGF5bWVudHMgaG9sZCBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgb2YgdGhlIHNhbWUgYnJhbmQgaW4gdHJhbnNpdC4gUGF5bWVudHNcbiAqIGNhbiBiZSBkZXBvc2l0ZWQgaW4gcHVyc2VzLCBzcGxpdCBpbnRvIG11bHRpcGxlIHBheW1lbnRzLCBjb21iaW5lZCwgYW5kXG4gKiBjbGFpbWVkIChnZXR0aW5nIGFuIGV4Y2x1c2l2ZSBwYXltZW50KS4gUGF5bWVudHMgYXJlIGxpbmVhciwgbWVhbmluZ1xuICogdGhhdCBlaXRoZXIgYSBwYXltZW50IGhhcyB0aGUgc2FtZSBhbW91bnQgb2YgZGlnaXRhbCBhc3NldHMgaXRcbiAqIHN0YXJ0ZWQgd2l0aCwgb3IgaXQgaXMgdXNlZCB1cCBlbnRpcmVseS4gSXQgaXMgaW1wb3NzaWJsZSB0byBwYXJ0aWFsbHkgdXNlIGFcbiAqIHBheW1lbnQuXG4gKlxuICogUGF5bWVudHMgYXJlIG9mdGVuIHJlY2VpdmVkIGZyb20gb3RoZXIgYWN0b3JzIGFuZCB0aGVyZWZvcmUgc2hvdWxkXG4gKiBub3QgYmUgdHJ1c3RlZCB0aGVtc2VsdmVzLiBUbyBnZXQgdGhlIGFtb3VudCBvZiBkaWdpdGFsIGFzc2V0cyBpbiBhIHBheW1lbnQsXG4gKiB1c2UgdGhlIHRydXN0ZWQgaXNzdWVyOiBpc3N1ZXIuZ2V0QW1vdW50T2YocGF5bWVudCksXG4gKlxuICogUGF5bWVudHMgY2FuIGJlIGNvbnZlcnRlZCB0byBQdXJzZXMgYnkgZ2V0dGluZyBhIHRydXN0ZWQgaXNzdWVyIGFuZFxuICogY2FsbGluZyBgaXNzdWVyLm1ha2VFbXB0eVB1cnNlKClgIHRvIGNyZWF0ZSBhIHB1cnNlLCB0aGVuXG4gKiBgcHVyc2UuZGVwb3NpdChwYXltZW50KWAuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBCcmFuZDxLPn0gZ2V0QWxsZWdlZEJyYW5kXG4gKiBHZXQgdGhlIGFsbGVnZWRCcmFuZCwgaW5kaWNhdGluZyB0aGUgdHlwZSBvZiBkaWdpdGFsIGFzc2V0IHRoaXNcbiAqIHBheW1lbnQgcHVycG9ydHMgdG8gYmUsIGFuZCB3aGljaCBpc3N1ZXIgdG8gdXNlLiBCZWNhdXNlIHBheW1lbnRzXG4gKiBhcmUgbm90IHRydXN0ZWQsIGFueSBtZXRob2QgY2FsbHMgb24gcGF5bWVudHMgc2hvdWxkIGJlIHRyZWF0ZWRcbiAqIHdpdGggc3VzcGljaW9uIGFuZCB2ZXJpZmllZCBlbHNld2hlcmUuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Ftb3VudFZhbHVlfSBWXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNYXRoSGVscGVyc1xuICogQWxsIG9mIHRoZSBkaWZmZXJlbmNlIGluIGhvdyBkaWdpdGFsIGFzc2V0IGFtb3VudCBhcmUgbWFuaXB1bGF0ZWQgY2FuIGJlXG4gKiByZWR1Y2VkIHRvIHRoZSBiZWhhdmlvciBvZiB0aGUgbWF0aCBvbiB2YWx1ZXMuIFdlIGV4dHJhY3QgdGhpc1xuICogY3VzdG9tIGxvZ2ljIGludG8gbWF0aEhlbHBlcnMuIE1hdGhIZWxwZXJzIGFyZSBhYm91dCB2YWx1ZVxuICogYXJpdGhtZXRpYywgd2hlcmVhcyBBbW91bnRNYXRoIGlzIGFib3V0IGFtb3VudHMsIHdoaWNoIGFyZSB0aGVcbiAqIHZhbHVlcyBsYWJlbGVkIHdpdGggYSBicmFuZC4gQW1vdW50TWF0aCB1c2UgbWF0aEhlbHBlcnMgdG8gZG8gdGhlaXIgdmFsdWVcbiAqIGFyaXRobWV0aWMsIGFuZCB0aGVuIGJyYW5kIHRoZSByZXN1bHRzLCBtYWtpbmcgYSBuZXcgYW1vdW50LlxuICpcbiAqIFRoZSBNYXRoSGVscGVycyBhcmUgZGVzaWduZWQgdG8gYmUgY2FsbGVkIG9ubHkgZnJvbSBBbW91bnRNYXRoLCBhbmQgc29cbiAqIGFsbCBtZXRob2RzIGJ1dCBjb2VyY2UgY2FuIGFzc3VtZSB0aGVpciBpbnB1dHMgYXJlIHZhbGlkLiBUaGV5IG9ubHlcbiAqIG5lZWQgdG8gZG8gb3V0cHV0IHZhbGlkYXRpb24sIGFuZCBvbmx5IHdoZW4gdGhlcmUgaXMgYSBwb3NzaWJpbGl0eSBvZlxuICogaW52YWxpZCBvdXRwdXQuXG4gKlxuICogQHByb3BlcnR5IHsoYWxsZWdlZFZhbHVlOiBWKSA9PiBWfSBkb0NvZXJjZVxuICogQ2hlY2sgdGhlIGtpbmQgb2YgdGhpcyB2YWx1ZSBhbmQgdGhyb3cgaWYgaXQgaXMgbm90IHRoZVxuICogZXhwZWN0ZWQga2luZC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IFZ9IGRvTWFrZUVtcHR5XG4gKiBHZXQgdGhlIHJlcHJlc2VudGF0aW9uIGZvciB0aGUgaWRlbnRpdHkgZWxlbWVudCAob2Z0ZW4gMCBvciBhblxuICogZW1wdHkgYXJyYXkpXG4gKlxuICogQHByb3BlcnR5IHsodmFsdWU6IFYpID0+IGJvb2xlYW59IGRvSXNFbXB0eVxuICogSXMgdGhlIHZhbHVlIHRoZSBpZGVudGl0eSBlbGVtZW50P1xuICpcbiAqIEBwcm9wZXJ0eSB7KGxlZnQ6IFYsIHJpZ2h0OiBWKSA9PiBib29sZWFufSBkb0lzR1RFXG4gKiBJcyB0aGUgbGVmdCBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHJpZ2h0P1xuICpcbiAqIEBwcm9wZXJ0eSB7KGxlZnQ6IFYsIHJpZ2h0OiBWKSA9PiBib29sZWFufSBkb0lzRXF1YWxcbiAqIERvZXMgbGVmdCBlcXVhbCByaWdodD9cbiAqXG4gKiBAcHJvcGVydHkgeyhsZWZ0OiBWLCByaWdodDogVikgPT4gVn0gZG9BZGRcbiAqIFJldHVybiB0aGUgbGVmdCBjb21iaW5lZCB3aXRoIHRoZSByaWdodC5cbiAqXG4gKiBAcHJvcGVydHkgeyhsZWZ0OiBWLCByaWdodDogVikgPT4gVn0gZG9TdWJ0cmFjdFxuICogUmV0dXJuIHdoYXQgcmVtYWlucyBhZnRlciByZW1vdmluZyB0aGUgcmlnaHQgZnJvbSB0aGUgbGVmdC4gSWZcbiAqIHNvbWV0aGluZyBpbiB0aGUgcmlnaHQgd2FzIG5vdCBpbiB0aGUgbGVmdCwgd2UgdGhyb3cgYW4gZXJyb3IuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7YmlnaW50fSBOYXRWYWx1ZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge01hdGhIZWxwZXJzPE5hdFZhbHVlPn0gTmF0TWF0aEhlbHBlcnNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtBcnJheTxLZXk+fSBTZXRWYWx1ZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge01hdGhIZWxwZXJzPFNldFZhbHVlPn0gU2V0TWF0aEhlbHBlcnNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtDb3B5U2V0PEtleT59IENvcHlTZXRWYWx1ZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge01hdGhIZWxwZXJzPENvcHlTZXRWYWx1ZT59IENvcHlTZXRNYXRoSGVscGVyc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0NvcHlCYWc8S2V5Pn0gQ29weUJhZ1ZhbHVlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7TWF0aEhlbHBlcnM8Q29weUJhZ1ZhbHVlPn0gQ29weUJhZ01hdGhIZWxwZXJzXG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAXc3uDlcBAABXAQAAJQAAAEBhZ29yaWMvZ292ZXJuYW5jZS12MC45LjEvZXhwb3J0ZWQuanN7ImltcG9ydHMiOlsiLi9zcmMvdHlwZXMtYW1iaWVudC5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACSif7VDF4AAAxeAAAuAAAAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjkuMS9zcmMvdHlwZXMtYW1iaWVudC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qKlxuICogQHR5cGVkZWYgeyAndW5yYW5rZWQnIHwgJ29yZGVyJyB8ICdwbHVyYWxpdHknIH0gQ2hvaWNlTWV0aG9kXG4gKiAqIFVOUkFOS0VEOiBcInVucmFua2VkIHZvdGluZ1wiIG1lYW5zIHRoYXQgdGhlIHZvdGVyIHNwZWNpZmllcyBzb21lIG51bWJlciBvZlxuICogICAgcG9zaXRpb25zLCBhbmQgaXMgZW5kb3JzaW5nIHRoZW0gZXF1YWxseS5cbiAqICogT1JERVI6IFRoZSB2b3RlciBhc3NpZ25zIG9yZGluYWwgbnVtYmVycyB0byBzb21lIG9mIHRoZSBwb3NpdGlvbnMuIFRoZVxuICogICAgcG9zaXRpb25zIHdpbGwgYmUgdHJlYXRlZCBhcyBhbiBvcmRlcmVkIGxpc3Qgd2l0aCBubyBnYXBzLlxuICpcbiAqIFdoZW4gdm90ZXJzIGFyZSBsaW1pdGVkIHRvIGNob29zaW5nIGEgc2luZ2xlIGNhbmRpZGF0ZSwgZWl0aGVyIFVOUkFOS0VEIG9yXG4gKiBPUkRFUiB3b3VsZCB3b3JrLiBVTlJBTktFRCBoYXMgYSBzaW1wbGVyIHJlcHJlc2VudGF0aW9uIHNvIHdlIHVzZSB0aGF0LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyAncGFyYW1fY2hhbmdlJyB8ICdlbGVjdGlvbicgfCAnc3VydmV5JyB8ICdhcGlfaW52b2NhdGlvbicgfFxuICogICAnb2ZmZXJfZmlsdGVyJyB9IEVsZWN0aW9uVHlwZVxuICogcGFyYW1fY2hhbmdlIGlzIHZlcnkgc3BlY2lmaWMuIFN1cnZleSBtZWFucyBtdWx0aXBsZSBhbnN3ZXJzIGFyZSBwb3NzaWJsZSxcbiAqIEVsZWN0aW9uIG1lYW5zIHNvbWUgY2FuZGlkYXRlcyBhcmUgZ29pbmcgdG8gXCJ3aW5cIi4gSXQncyBub3QgY2xlYXIgdGhlc2UgYXJlXG4gKiBvcnRob2dvbmFsLiBUaGUgaW1wb3J0YW50IGRpc3RpbmN0aW9uIGlzIHRoYXQgcGFyYW1fY2hhbmdlIGhhcyBhIHN0cnVjdHVyZWRcbiAqIGlzc3VlLCB3aGlsZSB0aGUgb3RoZXJzIGhhdmUgYSBpc3N1ZSBwcmVzZW50ZWQgYXMgYSBzdHJpbmcuXG4gKi9cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL2NvbnN0YW50cy5qcycpLlBhcmFtVHlwZX0gUGFyYW1UeXBlICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyAnbWFqb3JpdHknIHwgJ2FsbCcgfCAnbm9fcXVvcnVtJyB9IFF1b3J1bVJ1bGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNpbXBsZUlzc3VlXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGV4dFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyBBbW91bnQgfCBCcmFuZCB8IEluc3RhbGxhdGlvbiB8IEluc3RhbmNlIHwgYmlnaW50IHxcbiAqICAgUmF0aW8gfCBzdHJpbmcgfCBYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXN0YW1wUmVjb3JkIHxcbiAqICAgWGltcG9ydCgnQGFnb3JpYy90aW1lL3NyYy90eXBlcycpLlJlbGF0aXZlVGltZVJlY29yZCB8IHVua25vd24gfSBQYXJhbVZhbHVlXG4gKi9cblxuLyogWFhYIGJldHRlciB0byB1c2UgdGhlIG1hbmlmZXN0IGNvbnN0YW50IFBhcmFtVHlwZXMqL1xuLyogYnV0IGltcG9ydGluZyB0aGF0IGhlcmUgdHVybnMgdGhpcyBmaWxlIGludG8gYSBtb2R1bGUsKi9cbi8qIGJyZWFraW5nIHRoZSBhbWJpZW50IHR5cGluZyovXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UGFyYW1UeXBlfSBUXG4gKiBAdHlwZWRlZiB7VCBleHRlbmRzICdhbW91bnQnID8gQW1vdW50IDpcbiAqIFQgZXh0ZW5kcyAnYnJhbmQnID8gQnJhbmQgOlxuICogVCBleHRlbmRzICdpbnN0YWxsYXRpb24nID8gSW5zdGFsbGF0aW9uOlxuICogVCBleHRlbmRzICdpbnN0YW5jZScgPyBJbnN0YW5jZSA6XG4gKiBUIGV4dGVuZHMgJ2ludml0YXRpb24nID8gQW1vdW50IDogLy8gWFhYIHRoaXMgaXMgdGhlIGdldHRlciB2YWx1ZSBidXQgbm90IHRoZSBzZXR0ZXJcbiAqIFQgZXh0ZW5kcyAnbmF0JyA/IGJpZ2ludCA6XG4gKiBUIGV4dGVuZHMgJ3JhdGlvJyA/IFJhdGlvIDpcbiAqIFQgZXh0ZW5kcyAnc3RyaW5nJyA/IHN0cmluZyA6XG4gKiBUIGV4dGVuZHMgJ3RpbWVzdGFtcCcgPyBYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXN0YW1wUmVjb3JkIDpcbiAqIFQgZXh0ZW5kcyAncmVsYXRpdmVUaW1lJyA/IFhpbXBvcnQoJ0BhZ29yaWMvdGltZS9zcmMvdHlwZXMnKS5SZWxhdGl2ZVRpbWVSZWNvcmQgOlxuICogVCBleHRlbmRzICd1bmtub3duJyA/IHVua25vd24gOlxuICogbmV2ZXJcbiAqIH0gUGFyYW1WYWx1ZUZvclR5cGVcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UGFyYW1UeXBlfSBbVD1QYXJhbVR5cGVdXG4gKiBAdHlwZWRlZiB7eyB0eXBlOiBULCB2YWx1ZTogUGFyYW1WYWx1ZUZvclR5cGU8VD4gfX0gUGFyYW1WYWx1ZVR5cGVkPFQ+XG4gKi9cblxuLyoqXG4gKiBUZXJtcyBhIGNvbnRyYWN0IG11c3QgcHJvdmlkZSBpbiBvcmRlciB0byBiZSBnb3Zlcm5lZC5cbiAqXG4gKiBAdGVtcGxhdGUge1hpbXBvcnQoJy4vY29udHJhY3RHb3Zlcm5hbmNlL3R5cGVkUGFyYW1NYW5hZ2VyLmpzJykuUGFyYW1UeXBlc01hcH0gVCBHb3Zlcm5lZCBwYXJhbWV0ZXJzIG9mIGNvbnRyYWN0XG4gKiBAdHlwZWRlZiB7e1xuICogICBlbGVjdGlvbk1hbmFnZXI6IFhpbXBvcnQoJ0BhZ29yaWMvem9lL3NyYy96b2VTZXJ2aWNlL3V0aWxzLmpzJykuSW5zdGFuY2U8WGltcG9ydCgnLi9jb250cmFjdEdvdmVybm9yJykuc3RhcnQ+LFxuICogICBnb3Zlcm5lZFBhcmFtczogWGltcG9ydCgnLi9jb250cmFjdEdvdmVybmFuY2UvdHlwZWRQYXJhbU1hbmFnZXIuanMnKS5QYXJhbVJlY29yZHNGcm9tVHlwZXM8VCAmIHtcbiAqICAgICBFbGVjdG9yYXRlOiAnaW52aXRhdGlvbidcbiAqICAgfT5cbiAqIH19IEdvdmVybmFuY2VUZXJtczxUPlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyBTaW1wbGVJc3N1ZSB8IFBhcmFtQ2hhbmdlSXNzdWU8dW5rbm93bj4gfCBBcGlJbnZvY2F0aW9uSXNzdWUgfFxuICogICBPZmZlckZpbHRlcklzc3VlIH0gSXNzdWVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFF1ZXN0aW9uVGVybXMgLSBRdWVzdGlvblNwZWMgcGx1cyB0aGUgRWxlY3RvcmF0ZSBJbnN0YW5jZSBhbmRcbiAqICAgYSBudW1lcmljYWwgdGhyZXNob2xkIGZvciB0aGUgcXVvcnVtLiAoVGhlIHZvdGVDb3VudGVyIGRvZXNuJ3Qga25vdyB0aGVcbiAqICAgc2l6ZSBvZiB0aGUgZWxlY3RvcmF0ZSwgc28gdGhlIEVsZWN0b3JhdGUgaGFzIHRvIHNheSB3aGF0IGxpbWl0IHRvIGVuZm9yY2UuKVxuICogQHByb3BlcnR5IHtRdWVzdGlvblNwZWN9IHF1ZXN0aW9uU3BlY1xuICogQHByb3BlcnR5IHtudW1iZXJ9IHF1b3J1bVRocmVzaG9sZFxuICogQHByb3BlcnR5IHtJbnN0YW5jZX0gZWxlY3RvcmF0ZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gVGV4dFBvc2l0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdGV4dFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyBUZXh0UG9zaXRpb24gfCBDaGFuZ2VQYXJhbXNQb3NpdGlvbiB8IE5vQ2hhbmdlUGFyYW1zUG9zaXRpb24gfCBJbnZva2VBcGlQb3NpdGlvbiB8IERvbnRJbnZva2VBcGlQb3NpdGlvbiB8XG4gKiAgICBPZmZlckZpbHRlclBvc2l0aW9uIHwgTm9DaGFuZ2VPZmZlckZpbHRlclBvc2l0aW9uIHwgSW52b2tlQXBpUG9zaXRpb24gfSBQb3NpdGlvblxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3sgcXVlc3Rpb246IEhhbmRsZTwnUXVlc3Rpb24nPiB9ICYgKFxuICogICB7IG91dGNvbWU6ICd3aW4nLCBwb3NpdGlvbjogUG9zaXRpb24gfSB8XG4gKiAgIHsgb3V0Y29tZTogJ2ZhaWwnLCByZWFzb246ICdObyBxdW9ydW0nIH1cbiAqICl9IE91dGNvbWVSZWNvcmRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7IHF1ZXN0aW9uOiBIYW5kbGU8J1F1ZXN0aW9uJz4gfSAmIChcbiAqICB7IG91dGNvbWU6ICd3aW4nLCBwb3NpdGlvbnM6IFBvc2l0aW9uW10gfSB8XG4gKiAgeyBvdXRjb21lOiAnZmFpbCcsIHJlYXNvbjogJ05vIHF1b3J1bScgfVxuICogKX0gTXVsdGlPdXRjb21lUmVjb3JkXG4gKi9cblxuLyoqXG4gKiBTcGVjaWZpY2F0aW9uIHdoZW4gcmVxdWVzdGluZyBjcmVhdGlvbiBvZiBhIFF1ZXN0aW9uXG4gKlxuICogQHRlbXBsYXRlIHtJc3N1ZX0gW0k9SXNzdWVdXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBRdWVzdGlvblNwZWNcbiAqIEBwcm9wZXJ0eSB7Q2hvaWNlTWV0aG9kfSBtZXRob2RcbiAqIEBwcm9wZXJ0eSB7SX0gaXNzdWVcbiAqIEBwcm9wZXJ0eSB7UG9zaXRpb25bXX0gcG9zaXRpb25zXG4gKiBAcHJvcGVydHkge0VsZWN0aW9uVHlwZX0gZWxlY3Rpb25UeXBlXG4gKiBAcHJvcGVydHkge251bWJlcn0gbWF4Q2hvaWNlc1xuICogQHByb3BlcnR5IHtudW1iZXJ9IG1heFdpbm5lcnNcbiAqIEBwcm9wZXJ0eSB7Q2xvc2luZ1J1bGV9IGNsb3NpbmdSdWxlXG4gKiBAcHJvcGVydHkge1F1b3J1bVJ1bGV9IHF1b3J1bVJ1bGVcbiAqIEBwcm9wZXJ0eSB7UG9zaXRpb259IHRpZU91dGNvbWVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFF1ZXN0aW9uRGV0YWlsc0V4dHJhUHJvcGVydGllc1xuICogQHByb3BlcnR5IHtJbnN0YW5jZX0gY291bnRlckluc3RhbmNlIC0gaW5zdGFuY2Ugb2YgdGhlIFZvdGVDb3VudGVyXG4gKiBAcHJvcGVydHkge0hhbmRsZTwnUXVlc3Rpb24nPn0gcXVlc3Rpb25IYW5kbGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtRdWVzdGlvblNwZWMgJiBRdWVzdGlvbkRldGFpbHNFeHRyYVByb3BlcnRpZXN9IFF1ZXN0aW9uRGV0YWlsc1xuICogICAgY29tcGxldGUgcXVlc3Rpb24gZGV0YWlsczogcXVlc3Rpb25TcGVjIHBsdXMgY291bnRlciBhbmQgcXVlc3Rpb25IYW5kbGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEdvdmVybmFuY2VQYWlyXG4gKiBAcHJvcGVydHkge0luc3RhbmNlfSBnb3Zlcm5vclxuICogQHByb3BlcnR5IHtJbnN0YW5jZX0gZ292ZXJuZWRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFF1ZXN0aW9uXG4gKiBAcHJvcGVydHkgeygpID0+IEluc3RhbmNlfSBnZXRWb3RlQ291bnRlclxuICogQHByb3BlcnR5IHsoKSA9PiBRdWVzdGlvbkRldGFpbHN9IGdldERldGFpbHNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENvbXBsZXRlVW5yYW5rZWRRdWVzdGlvblxuICogQHByb3BlcnR5IHtIYW5kbGU8J1F1ZXN0aW9uJz59IHF1ZXN0aW9uSGFuZGxlXG4gKiBAcHJvcGVydHkge1Bvc2l0aW9uW119IGNob3NlbiAtIGEgbGlzdCBvZiBlcXVhbC13ZWlnaHQgcHJlZmVycmVkIHBvc2l0aW9uc1xuICovXG5cbi8qIG5vdCB5ZXQgaW4gdXNlKi9cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQ29tcGxldGVXZWlnaHRlZEJhbGxvdFxuICogQHByb3BlcnR5IHtIYW5kbGU8J1F1ZXN0aW9uJz59IHF1ZXN0aW9uSGFuZGxlXG4gKiBAcHJvcGVydHkge1tQb3NpdGlvbixiaWdpbnRdW119IHdlaWdodGVkIC0gbGlzdCBvZiBwb3NpdGlvbnMgd2l0aFxuICogICB3ZWlnaHRzLiBWb3RlQ291bnRlciBtYXkgbGltaXQgd2VpZ2h0cyB0byBhIHJhbmdlIG9yIHJlcXVpcmUgdW5pcXVlbmVzcy5cbiAqL1xuXG4vKiBub3QgeWV0IGluIHVzZSovXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENvbXBsZXRlT3JkZXJlZEJhbGxvdFxuICogQHByb3BlcnR5IHtIYW5kbGU8J1F1ZXN0aW9uJz59IHF1ZXN0aW9uSGFuZGxlXG4gKiBAcHJvcGVydHkge1Bvc2l0aW9uW119IG9yZGVyZWQgLSBvcmRlcmVkIGxpc3Qgb2YgcG9zaXRpb24gZnJvbSBtb3N0IHByZWZlcnJlZFxuICogICB0byBsZWFzdCBwcmVmZXJyZWRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBvc2l0aW9uQ291bnRcbiAqIEBwcm9wZXJ0eSB7UG9zaXRpb259IHBvc2l0aW9uXG4gKiBAcHJvcGVydHkge2JpZ2ludH0gdG90YWxcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFZvdGVTdGF0aXN0aWNzXG4gKiBAcHJvcGVydHkge2JpZ2ludH0gc3BvaWxlZFxuICogQHByb3BlcnR5IHtudW1iZXJ9IHZvdGVzXG4gKiBAcHJvcGVydHkge1Bvc2l0aW9uQ291bnRbXX0gcmVzdWx0c1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUXVvcnVtQ291bnRlclxuICogQHByb3BlcnR5IHsoc3RhdHM6IFZvdGVTdGF0aXN0aWNzKSA9PiBib29sZWFufSBjaGVja1xuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEJ1aWxkUXVlc3Rpb25cbiAqIEBwYXJhbSB7UXVlc3Rpb25TcGVjfSBxdWVzdGlvblNwZWNcbiAqIEBwYXJhbSB7SW5zdGFuY2V9IGluc3RhbmNlIC0gdm90ZUNvdW50ZXIgaW5zdGFuY2VcbiAqIEByZXR1cm5zIHtRdWVzdGlvbn1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFZvdGVDb3VudGVyQ3JlYXRvckZhY2V0IC0gYSBmYWNldCB0aGF0IHRoZSBFbGVjdG9yYXRlIHNob3VsZFxuICogICBob2xkIHRpZ2h0bHkuIHN1Ym1pdFZvdGUoKSBpcyB0aGUgY29yZSBjYXBhYmlsaXR5IHRoYXQgYWxsb3dzIHRoZSBob2xkZXIgdG9cbiAqICAgc3BlY2lmeSB0aGUgaWRlbnRpdHkgYW5kIGNob2ljZSBvZiBhIHZvdGVyLiBUaGUgdm90ZUNvdW50ZXIgaXMgbWFraW5nIHRoYXRcbiAqICAgYXZhaWxhYmxlIHRvIHRoZSBFbGVjdG9yYXRlLCB3aGljaCBzaG91bGQgd3JhcCBhbmQgYXR0ZW51YXRlIGl0IHNvIGVhY2hcbiAqICAgdm90ZXIgZ2V0cyBvbmx5IHRoZSBhYmlsaXR5IHRvIGNhc3QgdGhlaXIgb3duIHZvdGUgYXQgYSB3ZWlnaHQgc3BlY2lmaWVkIGJ5XG4gKiAgIHRoZSBlbGVjdG9yYXRlLlxuICogQHByb3BlcnR5IHtTdWJtaXRWb3RlfSBzdWJtaXRWb3RlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBWb3RlQ291bnRlclB1YmxpY0ZhY2V0XG4gKiBAcHJvcGVydHkgeygpID0+IGJvb2xlYW59IGlzT3BlblxuICogQHByb3BlcnR5IHsoKSA9PiBRdWVzdGlvbn0gZ2V0UXVlc3Rpb25cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxQb3NpdGlvbj59IGdldE91dGNvbWVcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUXVlc3Rpb25EZXRhaWxzfSBnZXREZXRhaWxzXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8Vm90ZVN0YXRpc3RpY3M+fSBnZXRTdGF0c1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTXVsdGlWb3RlQ291bnRlclB1YmxpY0ZhY2V0XG4gKiBAcHJvcGVydHkgeygpID0+IGJvb2xlYW59IGlzT3BlblxuICogQHByb3BlcnR5IHsoKSA9PiBRdWVzdGlvbn0gZ2V0UXVlc3Rpb25cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxQb3NpdGlvbltdPn0gZ2V0T3V0Y29tZVxuICogQHByb3BlcnR5IHsoKSA9PiBRdWVzdGlvbkRldGFpbHN9IGdldERldGFpbHNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxWb3RlU3RhdGlzdGljcz59IGdldFN0YXRzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBWb3RlQ291bnRlckNsb3NlRmFjZXRcbiAqICAgVEVTVCBPTkxZOiBTaG91bGQgbm90IGJlIGFsbG93ZWQgdG8gZXNjYXBlIGZyb20gY29udHJhY3RzXG4gKiBAcHJvcGVydHkgeygpID0+IHZvaWR9IGNsb3NlVm90aW5nXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBWb3RlQ291bnRlckZhY2V0c1xuICogQHByb3BlcnR5IHtWb3RlQ291bnRlclB1YmxpY0ZhY2V0fSBwdWJsaWNGYWNldFxuICogQHByb3BlcnR5IHtWb3RlQ291bnRlckNyZWF0b3JGYWNldH0gY3JlYXRvckZhY2V0XG4gKiBAcHJvcGVydHkge1ZvdGVDb3VudGVyQ2xvc2VGYWNldH0gY2xvc2VGYWNldFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gTXVsdGlWb3RlQ291bnRlckZhY2V0c1xuICogQHByb3BlcnR5IHtNdWx0aVZvdGVDb3VudGVyUHVibGljRmFjZXR9IHB1YmxpY0ZhY2V0XG4gKiBAcHJvcGVydHkge1ZvdGVDb3VudGVyQ3JlYXRvckZhY2V0fSBjcmVhdG9yRmFjZXRcbiAqIEBwcm9wZXJ0eSB7Vm90ZUNvdW50ZXJDbG9zZUZhY2V0fSBjbG9zZUZhY2V0XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQnVpbGRWb3RlQ291bnRlclxuICogQHBhcmFtIHtRdWVzdGlvblNwZWN9IHF1ZXN0aW9uU3BlY1xuICogQHBhcmFtIHtiaWdpbnR9IHRocmVzaG9sZCAtIHF1ZXN0aW9uU3BlYyBpbmNsdWRlcyBxdW9ydW1SdWxlOyB0aGUgZWxlY3RvcmF0ZVxuICogICAgY29udmVydHMgdGhhdCB0byBhIG51bWJlciB0aGF0IHRoZSBjb3VudGVyIGNhbiBlbmZvcmNlLlxuICogQHBhcmFtIHtJbnN0YW5jZX0gaW5zdGFuY2VcbiAqIEBwYXJhbSB7RVJlZjxQdWJsaXNoZXI8T3V0Y29tZVJlY29yZD4+fSBwdWJsaXNoZXJcbiAqIEByZXR1cm5zIHtWb3RlQ291bnRlckZhY2V0c31cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBCdWlsZE11bHRpVm90ZUNvdW50ZXJcbiAqIEBwYXJhbSB7UXVlc3Rpb25TcGVjfSBxdWVzdGlvblNwZWNcbiAqIEBwYXJhbSB7YmlnaW50fSB0aHJlc2hvbGQgLSBxdWVzdGlvblNwZWMgaW5jbHVkZXMgcXVvcnVtUnVsZTsgdGhlIGVsZWN0b3JhdGVcbiAqICAgIGNvbnZlcnRzIHRoYXQgdG8gYSBudW1iZXIgdGhhdCB0aGUgY291bnRlciBjYW4gZW5mb3JjZS5cbiAqIEBwYXJhbSB7SW5zdGFuY2V9IGluc3RhbmNlXG4gKiBAcGFyYW0ge0VSZWY8UHVibGlzaGVyPE11bHRpT3V0Y29tZVJlY29yZD4+fSBwdWJsaXNoZXJcbiAqIEByZXR1cm5zIHtNdWx0aVZvdGVDb3VudGVyRmFjZXRzfVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQ29tcGxldGVkQmFsbGV0XG4gKiBAcHJvcGVydHkge1Bvc2l0aW9ufSBjaG9zZW5cbiAqIEBwcm9wZXJ0eSB7YmlnaW50fSBzaGFyZXNcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBTdWJtaXRWb3RlXG4gKiBAcGFyYW0ge0hhbmRsZTwnVm90ZXInPn0gdm90ZXJIYW5kbGVcbiAqIEBwYXJhbSB7UG9zaXRpb25bXX0gY2hvc2VuUG9zaXRpb25zXG4gKiBAcGFyYW0ge2JpZ2ludH0gW3dlaWdodF1cbiAqIEByZXR1cm5zIHtDb21wbGV0ZWRCYWxsZXR9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0T3BlblF1ZXN0aW9uc1xuICogQHJldHVybnMge1Byb21pc2U8SGFuZGxlPCdRdWVzdGlvbic+W10+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldFF1ZXN0aW9uXG4gKiBAcGFyYW0ge0hhbmRsZTwnUXVlc3Rpb24nPn0gaFxuICogQHJldHVybnMge1Byb21pc2U8UXVlc3Rpb24+fVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRWxlY3RvcmF0ZVB1YmxpY1xuICogQHByb3BlcnR5IHsoKSA9PiBTdWJzY3JpYmVyPFF1ZXN0aW9uRGV0YWlscz59IGdldFF1ZXN0aW9uU3Vic2NyaWJlclxuICogQHByb3BlcnR5IHtHZXRPcGVuUXVlc3Rpb25zfSBnZXRPcGVuUXVlc3Rpb25zLFxuICogQHByb3BlcnR5IHsoKSA9PiBJbnN0YW5jZX0gZ2V0SW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7R2V0UXVlc3Rpb259IGdldFF1ZXN0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7IEVsZWN0b3JhdGVQdWJsaWMgJiB7bWFrZVZvdGVySW52aXRhdGlvbjogKCkgPT4gRVJlZjxJbnZpdGF0aW9uPn0gfSBDbGFpbXNFbGVjdG9yYXRlUHVibGljXG4gKiBAdHlwZWRlZiB7IEVsZWN0b3JhdGVQdWJsaWMgJiB7Z2V0TmFtZTogKCkgPT4gc3RyaW5nfSB9IENvbW1pdHRlZUVsZWN0b3JhdGVQdWJsaWNcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBvc2VyRmFjZXRcbiAqIEBwcm9wZXJ0eSB7QWRkUXVlc3Rpb259IGFkZFF1ZXN0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFbGVjdG9yYXRlQ3JlYXRvckZhY2V0XG4gKiBAcHJvcGVydHkge0FkZFF1ZXN0aW9ufSBhZGRRdWVzdGlvbiBjYW4gYmUgdXNlZCBkaXJlY3RseSB3aGVuIHRoZSBjcmVhdG9yIGRvZXNuJ3QgbmVlZCBhbnlcbiAqICByZWFzc3VyYW5jZS4gV2hlbiBzb21lb25lIG5lZWRzIHRvIGNvbm5lY3QgYWRkUXVlc3Rpb24gdG8gdGhlIEVsZWN0b3JhdGVcbiAqICBpbnN0YW5jZSwgZ2V0UG9zZXJJbnZpdGF0aW9uKCkgbGV0cyB0aGVtIGdldCBhZGRRdWVzdGlvbiB3aXRoIGFzc3VyYW5jZS5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxJbnZpdGF0aW9uPn0gZ2V0UG9zZXJJbnZpdGF0aW9uXG4gKiBAcHJvcGVydHkgeygpID0+IFN1YnNjcmliZXI8UXVlc3Rpb25EZXRhaWxzPn0gZ2V0UXVlc3Rpb25TdWJzY3JpYmVyXG4gKiBAcHJvcGVydHkgeygpID0+IEVsZWN0b3JhdGVQdWJsaWN9IGdldFB1YmxpY0ZhY2V0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBHZXRWb3Rlckludml0YXRpb25zXG4gKiBAcHJvcGVydHkgeygpID0+IEludml0YXRpb25bXX0gZ2V0Vm90ZXJJbnZpdGF0aW9uc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gVm90ZXJGYWNldCAtIGEgZmFjZXQgdGhhdCB0aGUgRWxlY3RvcmF0ZSBzaG91bGQgaG9sZFxuICogICB0aWdodGx5LiBJdCBhbGxvd3Mgc3BlY2lmaWNhdGlvbiBvZiB0aGUgdm90ZSdzIHdlaWdodCwgc28gdGhlIEVsZWN0b3JhdGVcbiAqICAgc2hvdWxkIGRpc3RyaWJ1dGUgYW4gYXR0ZW51YXRlZCB3cmFwcGVyIHRoYXQgZG9lc24ndCBtYWtlIHRoYXQgYXZhaWxhYmxlIVxuICogQHByb3BlcnR5IHtTdWJtaXRWb3RlfSBzdWJtaXRWb3RlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDbG9zaW5nUnVsZVxuICogQHByb3BlcnR5IHtFUmVmPFRpbWVyPn0gdGltZXJcbiAqIEBwcm9wZXJ0eSB7WGltcG9ydCgnQGFnb3JpYy90aW1lL3NyYy90eXBlcycpLlRpbWVzdGFtcH0gZGVhZGxpbmVcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBDbG9zZVZvdGluZ1xuICogQHBhcmFtIHtDbG9zaW5nUnVsZX0gY2xvc2luZ1J1bGVcbiAqIEBwYXJhbSB7KCkgPT4gdm9pZH0gY2xvc2VWb3RpbmdcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFkZFF1ZXN0aW9uUmV0dXJuXG4gKiBAcHJvcGVydHkge1ZvdGVDb3VudGVyUHVibGljRmFjZXR9IHB1YmxpY0ZhY2V0XG4gKiBAcHJvcGVydHkge1ZvdGVDb3VudGVyQ3JlYXRvckZhY2V0fSBjcmVhdG9yRmFjZXRcbiAqIEBwcm9wZXJ0eSB7WGltcG9ydCgnQGFnb3JpYy96b2Uvc3JjL3pvZVNlcnZpY2UvdXRpbHMuanMnKS5JbnN0YW5jZTx0eXBlb2YgWGltcG9ydCgnLi9iaW5hcnlWb3RlQ291bnRlci5qcycpLnN0YXJ0Pn0gaW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7WGltcG9ydCgnQGFnb3JpYy90aW1lL3NyYy90eXBlcycpLlRpbWVzdGFtcH0gZGVhZGxpbmVcbiAqIEBwcm9wZXJ0eSB7SGFuZGxlPCdRdWVzdGlvbic+fSBxdWVzdGlvbkhhbmRsZVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEFkZFF1ZXN0aW9uXG4gKiBAcGFyYW0ge0VSZWY8SW5zdGFsbGF0aW9uPn0gdm90ZUNvdW50ZXJcbiAqIEBwYXJhbSB7UXVlc3Rpb25TcGVjfSBxdWVzdGlvblNwZWNcbiAqIEByZXR1cm5zIHtQcm9taXNlPEFkZFF1ZXN0aW9uUmV0dXJuPn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBDcmVhdGVRdWVzdGlvblxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIC0gVGhlIG5hbWUgb2YgdGhlIHBhcmFtZXRlciB0byBjaGFuZ2VcbiAqIEBwYXJhbSB7UGFyYW1WYWx1ZX0gcHJvcG9zZWRWYWx1ZSAtIHRoZSBwcm9wb3NlZCB2YWx1ZSBmb3IgdGhlIG5hbWVkXG4gKiAgIHBhcmFtZXRlclxuICogQHBhcmFtIHtJbnN0YWxsYXRpb259IHZvdGVDb3VudGVySW5zdGFsbGF0aW9uIC0gdGhlIHZvdGVDb3VudGVyIHRvXG4gKiAgIGluc3RhbnRpYXRlIHRvIGNvdW50IHZvdGVzLiBFeHBlY3RlZCB0byBiZSBhIGJpbmFyeVZvdGVDb3VudGVyLiBPdGhlclxuICogICB2b3RlQ291bnRlcnMgbWlnaHQgYmUgYWRkZWQgaGVyZSwgb3IgbWlnaHQgcmVxdWlyZSBzZXBhcmF0ZSBnb3Zlcm5vcnMuXG4gKiAgIHVuZGVyIG1hbmFnZW1lbnQgc28gdXNlcnMgY2FuIHRyYWNlIGl0IGJhY2sgYW5kIHNlZSB0aGF0IGl0IHdvdWxkIHVzZVxuICogICB0aGlzIGVsZWN0aW9uTWFuYWdlciB0byBtYW5hZ2UgcGFyYW1ldGVyc1xuICogQHBhcmFtIHtJbnN0YW5jZX0gY29udHJhY3RJbnN0YW5jZSAtIGluY2x1ZGUgdGhlIGluc3RhbmNlIG9mIHRoZSBjb250cmFjdFxuICogQHBhcmFtIHtDbG9zaW5nUnVsZX0gY2xvc2luZ1J1bGUgLSBkZWFkbGluZSBhbmQgdGltZXIgZm9yIGNsb3Npbmcgdm90aW5nXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxRdWVzdGlvbkRldGFpbHM+fVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFtQPVN0YW5kYXJkUGFyYW1QYXRoXSBwYXRoIGZvciBhIHBhcmFtTWFuYWdlclJldHJpZXZlclxuICogQHR5cGVkZWYge29iamVjdH0gUGFyYW1DaGFuZ2VJc3N1ZVxuICogQHByb3BlcnR5IHtQYXJhbUNoYW5nZXNTcGVjPFA+fSBzcGVjXG4gKiBAcHJvcGVydHkge1hpbXBvcnQoJ0BhZ29yaWMvem9lL3NyYy96b2VTZXJ2aWNlL3V0aWxzLmpzJykuSW5zdGFuY2U8KHpjZjogWkNGPEdvdmVybmFuY2VUZXJtczx7fT4+KSA9PiB7fT59IGNvbnRyYWN0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBcGlJbnZvY2F0aW9uSXNzdWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBhcGlNZXRob2ROYW1lXG4gKiBAcHJvcGVydHkge3Vua25vd25bXX0gbWV0aG9kQXJnc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gT2ZmZXJGaWx0ZXJJc3N1ZVxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gc3RyaW5nc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUGFyYW1DaGFuZ2VQb3NpdGlvbnNcbiAqIEBwcm9wZXJ0eSB7Q2hhbmdlUGFyYW1zUG9zaXRpb259IHBvc2l0aXZlXG4gKiBAcHJvcGVydHkge05vQ2hhbmdlUGFyYW1zUG9zaXRpb259IG5lZ2F0aXZlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQYXJhbUNoYW5nZUlzc3VlRGV0YWlsc1xuICogICAgZGV0YWlscyBmb3IgYSBxdWVzdGlvbiB0aGF0IGNhbiBjaGFuZ2UgYSBjb250cmFjdCBwYXJhbWV0ZXJcbiAqIEBwcm9wZXJ0eSB7Q2hvaWNlTWV0aG9kfSBtZXRob2RcbiAqIEBwcm9wZXJ0eSB7UGFyYW1DaGFuZ2VJc3N1ZTx1bmtub3duPn0gaXNzdWVcbiAqIEBwcm9wZXJ0eSB7UGFyYW1DaGFuZ2VQb3NpdGlvbnN9IHBvc2l0aW9uc1xuICogQHByb3BlcnR5IHtFbGVjdGlvblR5cGV9IGVsZWN0aW9uVHlwZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IG1heENob2ljZXNcbiAqIEBwcm9wZXJ0eSB7Q2xvc2luZ1J1bGV9IGNsb3NpbmdSdWxlXG4gKiBAcHJvcGVydHkge1F1b3J1bVJ1bGV9IHF1b3J1bVJ1bGVcbiAqIEBwcm9wZXJ0eSB7Tm9DaGFuZ2VQYXJhbXNQb3NpdGlvbn0gdGllT3V0Y29tZVxuICogQHByb3BlcnR5IHtJbnN0YW5jZX0gY291bnRlckluc3RhbmNlIC0gaW5zdGFuY2Ugb2YgdGhlIFZvdGVDb3VudGVyXG4gKiBAcHJvcGVydHkge0hhbmRsZTwnUXVlc3Rpb24nPn0gcXVlc3Rpb25IYW5kbGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8S2V5d29yZCwgUGFyYW1WYWx1ZVR5cGVkPn0gUGFyYW1TdGF0ZVJlY29yZCBhIFJlY29yZCBjb250YWluaW5nXG4gKiAgIGtleXdvcmQgcGFpcnMgd2l0aCBkZXNjcmlwdGlvbnMgb2YgcGFyYW1ldGVycyB1bmRlciBnb3Zlcm5hbmNlLlxuICovXG5cbi8qKiBAdHlwZWRlZiB7e2N1cnJlbnQ6IFBhcmFtU3RhdGVSZWNvcmR9fSBHb3Zlcm5hbmNlU3Vic2NyaXB0aW9uU3RhdGUgKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQYXJhbU1hbmFnZXJCYXNlIFRoZSBiYXNlIHBhcmFtTWFuYWdlciB3aXRoIHR5cGVkIGdldHRlcnNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUGFyYW1TdGF0ZVJlY29yZH0gZ2V0UGFyYW1zXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IEFtb3VudH0gZ2V0QW1vdW50XG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IEJyYW5kfSBnZXRCcmFuZFxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBJbnN0YW5jZX0gZ2V0SW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gSW5zdGFsbGF0aW9ufSBnZXRJbnN0YWxsYXRpb25cbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gQW1vdW50PCdzZXQnPn0gZ2V0SW52aXRhdGlvbkFtb3VudFxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBiaWdpbnR9IGdldE5hdFxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBSYXRpb30gZ2V0UmF0aW9cbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gc3RyaW5nfSBnZXRTdHJpbmdcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gWGltcG9ydCgnQGFnb3JpYy90aW1lL3NyYy90eXBlcycpLlRpbWVzdGFtcFJlY29yZH0gZ2V0VGltZXN0YW1wXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IFhpbXBvcnQoJ0BhZ29yaWMvdGltZS9zcmMvdHlwZXMnKS5SZWxhdGl2ZVRpbWVSZWNvcmR9IGdldFJlbGF0aXZlVGltZVxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBhbnl9IGdldFVua25vd25cbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZywgcHJvcG9zZWRWYWx1ZTogUGFyYW1WYWx1ZSkgPT4gUGFyYW1WYWx1ZX0gZ2V0VmlzaWJsZVZhbHVlIC0gZm9yXG4gKiAgIG1vc3QgdHlwZXMsIHRoZSB2aXNpYmxlIHZhbHVlIGlzIHRoZSBzYW1lIGFzIHByb3Bvc2VkVmFsdWUuIEZvciBJbnZpdGF0aW9uc1xuICogICB0aGUgdmlzaWJsZSB2YWx1ZSBpcyB0aGUgYW1vdW50IG9mIHRoZSBpbnZpdGF0aW9uLlxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBQcm9taXNlPEludml0YXRpb24+fSBnZXRJbnRlcm5hbFBhcmFtVmFsdWVcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gU3RvcmVkU3Vic2NyaXB0aW9uPEdvdmVybmFuY2VTdWJzY3JpcHRpb25TdGF0ZT59IGdldFN1YnNjcmlwdGlvblxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFVwZGF0ZVBhcmFtc1xuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLFBhcmFtVmFsdWU+fSBwYXJhbUNoYW5nZXNcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fVxuICovXG5cbi8qKlxuICogVGhlc2UgYXJlIHR5cGVkIGBhbnlgIGJlY2F1c2UgdGhlIGJ1aWxkZXIgcGF0dGVybiBvZiBwYXJhbU1hbmFnZXIgbWFrZXMgaXQgdmVyeVxuICogY29tcGxpY2F0ZWQgZm9yIHRoZSB0eXBlIHN5c3RlbSB0byBrbm93IHRoZSBzZXQgb2YgcGFyYW0tc3BlY2lmaWMgZnVuY3Rpb25zXG4gKiByZXR1cm5lZCBieSBgLmJ1aWxkKClgLiBJbnN0ZWFkIHdlIGxldCBwYXJhbU1hbmFnZXIgY3JlYXRlIHRoZSBkZXNpcmVkIG1ldGhvZHNcbiAqIGFuZCB1c2UgdHlwZWRQYXJhbU1hbmFnZXIgdG8gY3JlYXRlIGEgdmVyc2lvbiB0aGF0IGluY2x1ZGVzIHRoZSBzdGF0aWMgdHlwZXMuXG4gKlxuICogQHR5cGVkZWYge1JlY29yZDxzdHJpbmcsIGFueT59IFBhcmFtTWFuYWdlckdldHRlcnNBbmRVcGRhdGVyc1xuICogQHR5cGVkZWYge1BhcmFtTWFuYWdlckJhc2UgJiBQYXJhbU1hbmFnZXJHZXR0ZXJzQW5kVXBkYXRlcnMgJiB7dXBkYXRlUGFyYW1zOiBVcGRhdGVQYXJhbXN9fSBBbnlQYXJhbU1hbmFnZXJcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmdbXT59IFBhcmFtZXRlck5hbWVMaXN0XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0UGFyYW1NYW5hZ2VyVHlwZVxuICogQHBhcmFtIHtQYXJhbVR5cGV9IHR5cGVcbiAqIEBwYXJhbSB7UGFyYW1WYWx1ZX0gdmFsdWVcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQnVpbGRQYXJhbU1hbmFnZXIgLSBQYXJhbU1hbmFnZXIgaXMgYSBmYWNpbGl0eSB0aGF0IGdvdmVybmVkXG4gKiAgIGNvbnRyYWN0cyBjYW4gdXNlIHRvIG1hbmFnZSB0aGVpciB2aXNpYmxlIHN0YXRlIGluIGEgd2F5IHRoYXQgYWxsb3dzIHRoZVxuICogICBDb250cmFjdEdvdmVybm9yIHRvIHVwZGF0ZSB2YWx1ZXMgdXNpbmcgZ292ZXJuYW5jZS4gV2hlbiBwYXJhbU1hbmFnZXIgaXNcbiAqICAgaW5zdGFudGlhdGVkIGluc2lkZSB0aGUgY29udHJhY3QsIHRoZSBjb250cmFjdCBoYXMgc3luY2hyb25vdXMgYWNjZXNzIHRvXG4gKiAgIHRoZSB2YWx1ZXMsIGFuZCBjbGllbnRzIG9mIHRoZSBjb250cmFjdCBjYW4gdmVyaWZ5IHRoYXQgYSBDb250cmFjdEdvdmVybm9yXG4gKiAgIGNhbiBjaGFuZ2UgdGhlIHZhbHVlcyBpbiBhIGxlZ2libGUgd2F5LlxuICogQHBhcmFtIHtJdGVyYWJsZTxQYXJhbVZhbHVlVHlwZWQ+fSBwYXJhbURlc2NyaXB0aW9uc1xuICogQHJldHVybnMge0FueVBhcmFtTWFuYWdlcn1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENoYW5nZVBhcmFtc1Bvc2l0aW9uXG4gKiBAcHJvcGVydHkge1JlY29yZDxzdHJpbmcsUGFyYW1WYWx1ZT59IGNoYW5nZXMgb25lIG9yIG1vcmUgY2hhbmdlcyB0byBwYXJhbWV0ZXJzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBPZmZlckZpbHRlclBvc2l0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ1tdfSBzdHJpbmdzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBOb0NoYW5nZU9mZmVyRmlsdGVyUG9zaXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IGRvbnRVcGRhdGVcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEludm9rZUFwaVBvc2l0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gYXBpTWV0aG9kTmFtZVxuICogQHByb3BlcnR5IHt1bmtub3duW119IG1ldGhvZEFyZ3NcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERvbnRJbnZva2VBcGlQb3NpdGlvblxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRvbnRJbnZva2VcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE5vQ2hhbmdlUGFyYW1zUG9zaXRpb25cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nW119IG5vQ2hhbmdlIFBhcmFtZXRlcnMgaW4gdGhlIHByb3Bvc2FsIHRoYXQgdGhpcyBwb3NpdGlvblxuICogICBpcyBvcHBvc2VkIHRvXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBHb3Zlcm5vclxuICogQHByb3BlcnR5IHtDcmVhdGVRdWVzdGlvbn0gY3JlYXRlUXVlc3Rpb25cbiAqL1xuXG4vKiogQHR5cGVkZWYge3sgW21ldGhvZE5hbWU6IHN0cmluZ106ICguLi5hcmdzOiBhbnkpID0+IHVua25vd24gfX0gR292ZXJuZWRBcGlzICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHt7fX0gQ0ZcbiAqIEB0eXBlZGVmIHtHb3Zlcm5lZENyZWF0b3JGYWNldDxDRj4gJiB7XG4gKiBnZXRHb3Zlcm5lZEFwaXM6ICgpID0+IEVSZWY8R292ZXJuZWRBcGlzPjtcbiAqIGdldEdvdmVybmVkQXBpTmFtZXM6ICgpID0+IChzdHJpbmcgfCBzeW1ib2wpW107XG4gKiBzZXRPZmZlckZpbHRlcjogKHN0cmluZ3M6IHN0cmluZ1tdKSA9PiB2b2lkO1xuICogfX0gR292ZXJub3JGYWNldFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gR292ZXJub3JQdWJsaWNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxJbnN0YW5jZT59IGdldEVsZWN0b3JhdGVcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSW5zdGFuY2V9IGdldEdvdmVybmVkQ29udHJhY3RcbiAqIEBwcm9wZXJ0eSB7KHZvdGVDb3VudGVyOiBJbnN0YW5jZSkgPT4gUHJvbWlzZTxib29sZWFuPn0gdmFsaWRhdGVWb3RlQ291bnRlclxuICogQHByb3BlcnR5IHsocmVnUDogRVJlZjxJbnN0YW5jZT4pID0+IFByb21pc2U8Ym9vbGVhbj59IHZhbGlkYXRlRWxlY3RvcmF0ZVxuICogQHByb3BlcnR5IHsoY2xvc2luZ1J1bGU6IENsb3NpbmdSdWxlKSA9PiBib29sZWFufSB2YWxpZGF0ZVRpbWVyXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQYXJhbUtleSBpZGVudGlmaWVyIGZvciBhIHBhcmFtTWFuYWdlciB3aXRoaW4gYSBjb250cmFjdFxuICogQHByb3BlcnR5IHtzdHJpbmd9IGtleVxuICovXG5cbi8qKlxuICogRGVzY3JpcHRpb24gb2YgYSBzZXQgb2YgY29vcmRpbmF0ZWQgY2hhbmdlcyBmb3IgYSBQYXJhbU1hbmFnZXJcbiAqXG4gKiBAdGVtcGxhdGUgUCBwYXRoIGZvciBhIHBhcmFtTWFuYWdlclJldHJpZXZlclxuICogQHR5cGVkZWYge29iamVjdH0gUGFyYW1DaGFuZ2VzU3BlYzxQPlxuICogQHByb3BlcnR5IHtQfSBwYXJhbVBhdGhcbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgUGFyYW1WYWx1ZT59IGNoYW5nZXMgb25lIG9yIG1vcmUgY2hhbmdlcyB0byBwYXJhbWV0ZXJzXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDb250cmFjdEdvdmVybmFuY2VWb3RlUmVzdWx0XG4gKiBAcHJvcGVydHkge0luc3RhbmNlfSBpbnN0YW5jZSAtIGluc3RhbmNlIG9mIHRoZSBWb3RlQ291bnRlclxuICogQHByb3BlcnR5IHtFUmVmPFF1ZXN0aW9uRGV0YWlscz59IGRldGFpbHNcbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZTxQYXJhbVZhbHVlPn0gb3V0Y29tZU9mVXBkYXRlIC0gQSBwcm9taXNlIGZvciB0aGUgcmVzdWx0XG4gKiAgICBvZiB1cGRhdGluZyB0aGUgcGFyYW1ldGVyIHZhbHVlLiBQcmltYXJpbHkgdXNlZnVsIGZvciBpdHMgYmVoYXZpb3Igb25cbiAqICAgIHJlamVjdGlvbi5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7e319IENGXG4gKiBAdHlwZWRlZiB7Q0Z9IExpbWl0ZWRDcmVhdG9yRmFjZXRcbiAqXG4gKiBUaGUgY3JlYXRvckZhY2V0IGZvciB0aGUgZ292ZXJuZWQgY29udHJhY3QgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGVcbiAqIHJlc3BvbnNpYmxlIHBhcnR5LiBJdCBkb2VzIG5vdCBoYXZlIGFjY2VzcyB0byB0aGUgcGFyYW1NYW5hZ2VyLlxuICogQHByb3BlcnR5IHsoKSA9PiBJbnN0YW5jZX0gZ2V0Q29udHJhY3RHb3Zlcm5vclxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHt7fX0gUEYgUHVibGljIGZhY2V0IG9mIGdvdmVybmVkIGNvbnRyYWN0XG4gKiBAdGVtcGxhdGUge3t9fSBDRiBDcmVhdG9yIGZhY2V0IG9mIGdvdmVybmVkIGNvbnRyYWN0XG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBHb3Zlcm5lZENvbnRyYWN0RmFjZXRBY2Nlc3NcbiAqIEBwcm9wZXJ0eSB7Vm90ZU9uUGFyYW1DaGFuZ2VzfSB2b3RlT25QYXJhbUNoYW5nZXNcbiAqIEBwcm9wZXJ0eSB7Vm90ZU9uQXBpSW52b2NhdGlvbn0gdm90ZU9uQXBpSW52b2NhdGlvblxuICogQHByb3BlcnR5IHtWb3RlT25PZmZlckZpbHRlcn0gdm90ZU9uT2ZmZXJGaWx0ZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxMaW1pdGVkQ3JlYXRvckZhY2V0PENGPj59IGdldENyZWF0b3JGYWNldCAtIGNyZWF0b3JcbiAqICAgZmFjZXQgb2YgdGhlIGdvdmVybmVkIGNvbnRyYWN0LCB3aXRob3V0IHRoZSB0aWdodGx5IGhlbGQgYWJpbGl0eSB0byBjaGFuZ2VcbiAqICAgcGFyYW0gdmFsdWVzLlxuICogQHByb3BlcnR5IHsocG9zZXJJbnZpdGF0aW9uOiBJbnZpdGF0aW9uKSA9PiBQcm9taXNlPHZvaWQ+fSByZXBsYWNlRWxlY3RvcmF0ZVxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEFkbWluRmFjZXQ+fSBnZXRBZG1pbkZhY2V0XG4gKiBAcHJvcGVydHkgeygpID0+IEdvdmVybmVkUHVibGljRmFjZXQ8UEY+fSBnZXRQdWJsaWNGYWNldCAtIHB1YmxpYyBmYWNldCBvZiB0aGUgZ292ZXJuZWQgY29udHJhY3RcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSW5zdGFuY2V9IGdldEluc3RhbmNlIC0gaW5zdGFuY2Ugb2YgdGhlIGdvdmVybmVkXG4gKiAgIGNvbnRyYWN0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBHb3Zlcm5lZFB1YmxpY0ZhY2V0TWV0aG9kc1xuICogQHByb3BlcnR5IHsoKSA9PiBTdG9yZWRTdWJzY3JpcHRpb248R292ZXJuYW5jZVN1YnNjcmlwdGlvblN0YXRlPn0gZ2V0U3Vic2NyaXB0aW9uXG4gKiBAcHJvcGVydHkgeygpID0+IEluc3RhbmNlfSBnZXRDb250cmFjdEdvdmVybm9yXG4gKiBAcHJvcGVydHkgeygpID0+IFBhcmFtU3RhdGVSZWNvcmR9IGdldEdvdmVybmVkUGFyYW1zIC0gZ2V0IGRlc2NyaXB0aW9ucyBvZlxuICogICBhbGwgdGhlIGdvdmVybmVkIHBhcmFtZXRlcnNcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gQW1vdW50fSBnZXRBbW91bnRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gQnJhbmR9IGdldEJyYW5kXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IEluc3RhbmNlfSBnZXRJbnN0YW5jZVxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBJbnN0YWxsYXRpb259IGdldEluc3RhbGxhdGlvblxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBBbW91bnR9IGdldEludml0YXRpb25BbW91bnRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gYmlnaW50fSBnZXROYXRcbiAqIEBwcm9wZXJ0eSB7KG5hbWU6IHN0cmluZykgPT4gUmF0aW99IGdldFJhdGlvXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IHN0cmluZ30gZ2V0U3RyaW5nXG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcpID0+IGFueX0gZ2V0VW5rbm93blxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHt7fX0gUEYgUHVibGljIGZhY2V0XG4gKiBAdHlwZWRlZiB7UEYgJiBHb3Zlcm5lZFB1YmxpY0ZhY2V0TWV0aG9kc30gR292ZXJuZWRQdWJsaWNGYWNldFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHt7fX0gQ0YgY3JlYXRvciBmYWNldFxuICogQHR5cGVkZWYgR292ZXJuZWRDcmVhdG9yRmFjZXRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUGFyYW1NYW5hZ2VyUmV0cmlldmVyfSBnZXRQYXJhbU1nclJldHJpZXZlciAtIGFsbG93cyBhY2Nlc3NpbmdcbiAqICAgYW5kIHVwZGF0aW5nIGdvdmVybmVkIHBhcmFtZXRlcnMuIFNob3VsZCBvbmx5IGJlIGRpcmVjdGx5IGFjY2Vzc2libGUgdG8gdGhlXG4gKiAgIGNvbnRyYWN0R292ZXJub3JcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTGltaXRlZENyZWF0b3JGYWNldDxDRj59IGdldExpbWl0ZWRDcmVhdG9yRmFjZXQgLSB0aGUgY3JlYXRvclxuICogICBmYWNldCBvZiB0aGUgZ292ZXJuZWQgY29udHJhY3QuIERvZXNuJ3QgcHJvdmlkZSBhY2Nlc3MgdG8gYW55IGdvdmVybmFuY2VcbiAqICAgZnVuY3Rpb25hbGl0eVxuICogQHByb3BlcnR5IHsobmFtZTogc3RyaW5nKSA9PiBQcm9taXNlPEludml0YXRpb24+fSBnZXRJbnZpdGF0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e2tleTogc3RyaW5nfX0gU3RhbmRhcmRQYXJhbVBhdGhcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBhcmFtTWFuYWdlclJldHJpZXZlclxuICogQHByb3BlcnR5IHsocGFyYW1LZXk/OiBQYXJhbUtleSkgPT4gQW55UGFyYW1NYW5hZ2VyfSBnZXRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbUD1TdGFuZGFyZFBhcmFtUGF0aF1cbiAqXG4gKiBAY2FsbGJhY2sgVm90ZU9uUGFyYW1DaGFuZ2VzXG4gKiBAcGFyYW0ge0luc3RhbGxhdGlvbn0gdm90ZUNvdW50ZXJJbnN0YWxsYXRpb25cbiAqIEBwYXJhbSB7WGltcG9ydCgnQGFnb3JpYy90aW1lL3NyYy90eXBlcycpLlRpbWVzdGFtcH0gZGVhZGxpbmVcbiAqIEBwYXJhbSB7UGFyYW1DaGFuZ2VzU3BlYzxQPn0gcGFyYW1TcGVjXG4gKiBAcmV0dXJucyB7Q29udHJhY3RHb3Zlcm5hbmNlVm90ZVJlc3VsdH1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBWb3RlT25BcGlJbnZvY2F0aW9uXG4gKiBAcGFyYW0ge3N0cmluZ30gYXBpTWV0aG9kTmFtZVxuICogQHBhcmFtIHt1bmtub3duW119IG1ldGhvZEFyZ3NcbiAqIEBwYXJhbSB7SW5zdGFsbGF0aW9ufSB2b3RlQ291bnRlckluc3RhbGxhdGlvblxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXN0YW1wfSBkZWFkbGluZVxuICogQHJldHVybnMge0NvbnRyYWN0R292ZXJuYW5jZVZvdGVSZXN1bHR9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgVm90ZU9uT2ZmZXJGaWx0ZXJcbiAqIEBwYXJhbSB7SW5zdGFsbGF0aW9ufSB2b3RlQ291bnRlckluc3RhbGxhdGlvblxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXN0YW1wfSBkZWFkbGluZVxuICogQHBhcmFtIHtzdHJpbmdbXX0gc3RyaW5nc1xuICogQHJldHVybnMge0NvbnRyYWN0R292ZXJuYW5jZVZvdGVSZXN1bHR9XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQYXJhbUdvdmVybm9yXG4gKiBAcHJvcGVydHkge1ZvdGVPblBhcmFtQ2hhbmdlc30gdm90ZU9uUGFyYW1DaGFuZ2VzXG4gKiBAcHJvcGVydHkge0NyZWF0ZWRRdWVzdGlvbn0gY3JlYXRlZFF1ZXN0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBBcGlHb3Zlcm5vclxuICogQHByb3BlcnR5IHtWb3RlT25BcGlJbnZvY2F0aW9ufSB2b3RlT25BcGlJbnZvY2F0aW9uXG4gKiBAcHJvcGVydHkge0NyZWF0ZWRRdWVzdGlvbn0gY3JlYXRlZFF1ZXN0aW9uXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGaWx0ZXJHb3Zlcm5vclxuICogQHByb3BlcnR5IHtWb3RlT25PZmZlckZpbHRlcn0gdm90ZU9uRmlsdGVyXG4gKiBAcHJvcGVydHkge0NyZWF0ZWRRdWVzdGlvbn0gY3JlYXRlZEZpbHRlclF1ZXN0aW9uXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgU2V0dXBHb3Zlcm5hbmNlXG4gKiBAcGFyYW0ge0VSZWY8Wm9lU2VydmljZT59IHpvZVxuICogQHBhcmFtIHtFUmVmPFBhcmFtTWFuYWdlclJldHJpZXZlcj59IHBhcmFtTWFuYWdlclJldHJpZXZlclxuICogQHBhcmFtIHtJbnN0YW5jZX0gY29udHJhY3RJbnN0YW5jZVxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXJTZXJ2aWNlfSB0aW1lclxuICogQHBhcmFtIHsoKSA9PiBQcm9taXNlPFBvc2VyRmFjZXQ+fSBnZXRVcGRhdGVkUG9zZXJGYWNldFxuICogQHJldHVybnMge1BhcmFtR292ZXJub3J9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQ3JlYXRlZFF1ZXN0aW9uXG4gKiAgIFdhcyB0aGlzIHF1ZXN0aW9uIGNyZWF0ZWQgYnkgdGhpcyBDb250cmFjdEdvdmVybm9yP1xuICogQHBhcmFtIHtJbnN0YW5jZX0gcXVlc3Rpb25JbnN0YW5jZVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgUG9zaXRpb25JbmNsdWRlZFxuICogQHBhcmFtIHtQb3NpdGlvbltdfSBwb3NpdGlvbnNcbiAqIEBwYXJhbSB7UG9zaXRpb259IHBvc2l0aW9uXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEdvdmVybmVkQ29udHJhY3RUZXJtc1xuICogQHByb3BlcnR5IHtYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXJTZXJ2aWNlfSB0aW1lclxuICogQHByb3BlcnR5IHtJc3N1ZXJLZXl3b3JkUmVjb3JkfSBpc3N1ZXJLZXl3b3JkUmVjb3JkXG4gKiBAcHJvcGVydHkge29iamVjdH0gcHJpdmF0ZUFyZ3NcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRDb250cmFjdEdvdmVybmFuY2VcbiAqXG4gKiBAcGFyYW0ge0VSZWY8Wm9lU2VydmljZT59IHpvZVxuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3pvZS9zcmMvem9lU2VydmljZS91dGlscy5qcycpLkluc3RhbmNlPCh6Y2Y6IFpDRjxHb3Zlcm5hbmNlVGVybXM8e30+PikgPT4ge30+fSBhbGxlZ2VkR292ZXJuZWRcbiAqIEBwYXJhbSB7SW5zdGFuY2V9IGFsbGVnZWRHb3Zlcm5vclxuICogQHBhcmFtIHtJbnN0YWxsYXRpb248WGltcG9ydCgnQGFnb3JpYy9nb3Zlcm5hbmNlL3NyYy9jb250cmFjdEdvdmVybm9yJykuc3RhcnQ+fSBjb250cmFjdEdvdmVybm9ySW5zdGFsbGF0aW9uXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxHb3Zlcm5hbmNlUGFpcj59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQXNzZXJ0Q29udHJhY3RFbGVjdG9yYXRlIC0gYXNzZXJ0IHRoYXQgdGhlIGNvbnRyYWN0IHVzZXMgdGhlXG4gKiAgIGVsZWN0b3JhdGVcbiAqXG4gKiBAcGFyYW0ge0VSZWY8Wm9lU2VydmljZT59IHpvZVxuICogQHBhcmFtIHtJbnN0YW5jZX0gYWxsZWdlZEdvdmVybm9yXG4gKiBAcGFyYW0ge0luc3RhbmNlfSBhbGxlZ2VkRWxlY3RvcmF0ZVxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAMPLDVHFAAARxQAADoAAABAYWdvcmljL2ludGVyLXByb3RvY29sLXYwLjEzLjEvc3JjL2Vjb25Db21taXR0ZWVDaGFydGVyLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvZ292ZXJuYW5jZS9leHBvcnRlZC5qcyIsIkBhZ29yaWMvc3RvcmUiLCJAYWdvcmljL3RpbWUiLCJAYWdvcmljL3pvZS9leHBvcnRlZC5qcyIsIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdHMvZXhwb3J0ZWQuanMiLCJAYWdvcmljL3pvZS9zcmMvdHlwZUd1YXJkcy5qcyIsIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbIklOVklUQVRJT05fTUFLRVJTX0RFU0MiLCJzdGFydCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBtYWtlU2NhbGFyTWFwU3RvcmUsTSxtYWtlRXhvLG11c3RNYXRjaCxJbnN0YW5jZUhhbmRsZVNoYXBlLFRpbWVzdGFtcFNoYXBlLEU7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9nb3Zlcm5hbmNlL2V4cG9ydGVkLmpzXCIsIFtdXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtYWtlU2NhbGFyTWFwU3RvcmVcIiwgWyRo4oCNX2EgPT4gKG1ha2VTY2FsYXJNYXBTdG9yZSA9ICRo4oCNX2EpXV0sW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV0sW1wibWFrZUV4b1wiLCBbJGjigI1fYSA9PiAobWFrZUV4byA9ICRo4oCNX2EpXV0sW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy96b2UvZXhwb3J0ZWQuanNcIiwgW11dLFtcIkBhZ29yaWMvem9lL3NyYy9jb250cmFjdHMvZXhwb3J0ZWQuanNcIiwgW11dLFtcIkBhZ29yaWMvem9lL3NyYy90eXBlR3VhcmRzLmpzXCIsIFtbXCJJbnN0YW5jZUhhbmRsZVNoYXBlXCIsIFskaOKAjV9hID0+IChJbnN0YW5jZUhhbmRsZVNoYXBlID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvdGltZVwiLCBbW1wiVGltZXN0YW1wU2hhcGVcIiwgWyRo4oCNX2EgPT4gKFRpbWVzdGFtcFNoYXBlID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG4vKipcbiAqIEBmaWxlXG4gKlxuICogVGhpcyBjb250cmFjdCBtYWtlcyBpdCBwb3NzaWJsZSBmb3IgdGhvc2Ugd2hvIGdvdmVybiBjb250cmFjdHMgdG8gY2FsbCBmb3JcbiAqIHZvdGVzIG9uIGNoYW5nZXMuIEEgbW9yZSBjb21wbGV0ZSBpbXBsZW1lbnRhdGlvbiB3b3VsZCB2YWxpZGF0ZSBwYXJhbWV0ZXJzLFxuICogY29uc3RyYWluIGRlYWRsaW5lcyBhbmQgcG9zc2libHkgc3BsaXQgdGhlIGFiaWxpdHkgdG8gY2FsbCBmb3Igdm90ZXMgaW50b1xuICogc2VwYXJhdGUgY2FwYWJpbGl0aWVzIGZvciBmaW5lciBncmFpbiBlbmNhcHN1bGF0aW9uLlxuICovXG5cbmNvbnN0ICAgICAgICBJTlZJVEFUSU9OX01BS0VSU19ERVNDPSdjaGFydGVyIG1lbWJlciBpbnZpdGF0aW9uJztcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQYXJhbUNoYW5nZXNPZmZlckFyZ3NcbiAqIEBwcm9wZXJ0eSB7YmlnaW50fSBkZWFkbGluZVxuICogQHByb3BlcnR5IHtJbnN0YW5jZX0gaW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59IHBhcmFtc1xuICogQHByb3BlcnR5IHt7cGFyYW1QYXRoOiB7IGtleTogc3RyaW5nIH19fSBbcGF0aF1cbiAqLyRo4oCNX29uY2UuSU5WSVRBVElPTl9NQUtFUlNfREVTQyhJTlZJVEFUSU9OX01BS0VSU19ERVNDKTtcbmNvbnN0IFBhcmFtQ2hhbmdlc09mZmVyQXJnc1NoYXBlPU0uc3BsaXRSZWNvcmQoXG57XG5kZWFkbGluZTpUaW1lc3RhbXBTaGFwZSxcbmluc3RhbmNlOkluc3RhbmNlSGFuZGxlU2hhcGUsXG5wYXJhbXM6TS5yZWNvcmRPZihNLnN0cmluZygpLE0uYW55KCkpfSxcblxue1xucGF0aDp7cGFyYW1QYXRoOntrZXk6TS5hbnkoKX19fSk7XG5cblxuXG4vKipcbiAqIEBwYXJhbSB7WkNGPHtiaW5hcnlWb3RlQ291bnRlckluc3RhbGxhdGlvbjpJbnN0YWxsYXRpb259Pn0gemNmXG4gKi9cbmNvbnN0ICAgICAgICBzdGFydD1hc3luYyh6Y2YpPT57XG5jb25zdHtiaW5hcnlWb3RlQ291bnRlckluc3RhbGxhdGlvbjpjb3VudGVyfT16Y2YuZ2V0VGVybXMoKTtcbi8qKiBAdHlwZSB7TWFwU3RvcmU8SW5zdGFuY2UsR292ZXJuZWRDb250cmFjdEZhY2V0QWNjZXNzPHt9LHt9Pj59ICovXG5jb25zdCBpbnN0YW5jZVRvR292ZXJub3I9bWFrZVNjYWxhck1hcFN0b3JlKCk7XG5cbmNvbnN0IG1ha2VQYXJhbUludml0YXRpb249KCk9Pntcbi8qKlxuICogQHBhcmFtIHtaQ0ZTZWF0fSBzZWF0XG4gKiBAcGFyYW0ge1BhcmFtQ2hhbmdlc09mZmVyQXJnc30gYXJnc1xuICovXG5jb25zdCB2b3RlT25QYXJhbUNoYW5nZXM9KHNlYXQsYXJncyk9Pntcbm11c3RNYXRjaChhcmdzLFBhcmFtQ2hhbmdlc09mZmVyQXJnc1NoYXBlKTtcbnNlYXQuZXhpdCgpO1xuXG5jb25zdHtcbnBhcmFtcyxcbmluc3RhbmNlLFxuZGVhZGxpbmUsXG5wYXRoPXtwYXJhbVBhdGg6e2tleTonZ292ZXJuZWRBcGknfX19PVxuYXJncztcbmNvbnN0IGdvdmVybm9yPWluc3RhbmNlVG9Hb3Zlcm5vci5nZXQoaW5zdGFuY2UpO1xucmV0dXJuIEUoZ292ZXJub3IpLnZvdGVPblBhcmFtQ2hhbmdlcyhjb3VudGVyLGRlYWRsaW5lLHtcbi4uLnBhdGgsXG5jaGFuZ2VzOnBhcmFtc30pO1xuXG4gfTtcblxucmV0dXJuIHpjZi5tYWtlSW52aXRhdGlvbih2b3RlT25QYXJhbUNoYW5nZXMsJ3ZvdGUgb24gcGFyYW0gY2hhbmdlcycpO1xuIH07XG5cbmNvbnN0IG1ha2VPZmZlckZpbHRlckludml0YXRpb249KGluc3RhbmNlLHN0cmluZ3MsZGVhZGxpbmUpPT57XG5jb25zdCB2b3RlT25PZmZlckZpbHRlckhhbmRsZXI9KHNlYXQpPT57XG5zZWF0LmV4aXQoKTtcblxuY29uc3QgZ292ZXJub3I9aW5zdGFuY2VUb0dvdmVybm9yLmdldChpbnN0YW5jZSk7XG5yZXR1cm4gRShnb3Zlcm5vcikudm90ZU9uT2ZmZXJGaWx0ZXIoY291bnRlcixkZWFkbGluZSxzdHJpbmdzKTtcbiB9O1xuXG5yZXR1cm4gemNmLm1ha2VJbnZpdGF0aW9uKHZvdGVPbk9mZmVyRmlsdGVySGFuZGxlciwndm90ZSBvbiBvZmZlciBmaWx0ZXInKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7SW5zdGFuY2V9IGluc3RhbmNlXG4gKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kTmFtZVxuICogQHBhcmFtIHtzdHJpbmdbXX0gbWV0aG9kQXJnc1xuICogQHBhcmFtIHtYaW1wb3J0KCdAYWdvcmljL3RpbWUnKS5UaW1lc3RhbXBWYWx1ZX0gZGVhZGxpbmVcbiAqL1xuY29uc3QgbWFrZUFwaUludm9jYXRpb25JbnZpdGF0aW9uPShcbmluc3RhbmNlLFxubWV0aG9kTmFtZSxcbm1ldGhvZEFyZ3MsXG5kZWFkbGluZSk9Plxue1xuY29uc3QgaGFuZGxlcj0oc2VhdCk9PntcbnNlYXQuZXhpdCgpO1xuXG5jb25zdCBnb3Zlcm5vcj1pbnN0YW5jZVRvR292ZXJub3IuZ2V0KGluc3RhbmNlKTtcbnJldHVybiBFKGdvdmVybm9yKS52b3RlT25BcGlJbnZvY2F0aW9uKFxubWV0aG9kTmFtZSxcbm1ldGhvZEFyZ3MsXG5jb3VudGVyLFxuZGVhZGxpbmUpO1xuXG4gfTtcbnJldHVybiB6Y2YubWFrZUludml0YXRpb24oaGFuZGxlciwndm90ZSBvbiBBUEkgaW52b2NhdGlvbicpO1xuIH07XG5cbmNvbnN0IE1ha2VyST1NLmludGVyZmFjZSgnQ2hhcnRlciBJbnZpdGF0aW9uTWFrZXJzJyx7XG5Wb3RlT25QYXJhbUNoYW5nZTpNLmNhbGwoKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcblZvdGVPblBhdXNlT2ZmZXJzOk0uY2FsbChcbkluc3RhbmNlSGFuZGxlU2hhcGUsXG5NLmFycmF5T2YoTS5zdHJpbmcoKSksXG5UaW1lc3RhbXBTaGFwZSkuXG5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcblZvdGVPbkFwaUNhbGw6TS5jYWxsKFxuSW5zdGFuY2VIYW5kbGVTaGFwZSxcbk0uc3RyaW5nKCksXG5NLmFycmF5T2YoTS5hbnkoKSksXG5UaW1lc3RhbXBTaGFwZSkuXG5yZXR1cm5zKE0ucHJvbWlzZSgpKX0pO1xuXG5jb25zdCBpbnZpdGF0aW9uTWFrZXJzPW1ha2VFeG8oJ0NoYXJ0ZXIgSW52aXRhdGlvbiBNYWtlcnMnLE1ha2VySSx7XG5Wb3RlT25QYXJhbUNoYW5nZTptYWtlUGFyYW1JbnZpdGF0aW9uLFxuVm90ZU9uUGF1c2VPZmZlcnM6bWFrZU9mZmVyRmlsdGVySW52aXRhdGlvbixcblZvdGVPbkFwaUNhbGw6bWFrZUFwaUludm9jYXRpb25JbnZpdGF0aW9ufSk7XG5cblxuY29uc3QgY2hhcnRlck1lbWJlckhhbmRsZXI9KHNlYXQpPT57XG5zZWF0LmV4aXQoKTtcbnJldHVybiBoYXJkZW4oe2ludml0YXRpb25NYWtlcnN9KTtcbiB9O1xuXG5jb25zdCBjaGFydGVyQ3JlYXRvckk9TS5pbnRlcmZhY2UoJ0NoYXJ0ZXIgY3JlYXRvckZhY2V0Jyx7XG5hZGRJbnN0YW5jZTpNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSxNLmFueSgpKS5cbm9wdGlvbmFsKE0uc3RyaW5nKCkpLlxucmV0dXJucygpLFxubWFrZUNoYXJ0ZXJNZW1iZXJJbnZpdGF0aW9uOk0uY2FsbCgpLnJldHVybnMoTS5wcm9taXNlKCkpfSk7XG5cblxuY29uc3QgY3JlYXRvckZhY2V0PW1ha2VFeG8oJ0NoYXJ0ZXIgY3JlYXRvckZhY2V0JyxjaGFydGVyQ3JlYXRvckkse1xuLyoqXG4gKiBAcGFyYW0ge0luc3RhbmNlfSBnb3Zlcm5lZEluc3RhbmNlXG4gKiBAcGFyYW0ge0dvdmVybmVkQ29udHJhY3RGYWNldEFjY2Vzczx7fSx7fT59IGdvdmVybm9yRmFjZXRcbiAqIEBwYXJhbSB7c3RyaW5nfSBbbGFiZWxdIGZvciBkaWFnbm9zdGljIHVzZSBvbmx5XG4gKi9cbmFkZEluc3RhbmNlOihnb3Zlcm5lZEluc3RhbmNlLGdvdmVybm9yRmFjZXQsbGFiZWwpPT57XG5jb25zb2xlLmxvZygnY2hhcnRlcjogYWRkaW5nIGluc3RhbmNlJyxsYWJlbCk7XG5pbnN0YW5jZVRvR292ZXJub3IuaW5pdChnb3Zlcm5lZEluc3RhbmNlLGdvdmVybm9yRmFjZXQpO1xuIH0sXG5tYWtlQ2hhcnRlck1lbWJlckludml0YXRpb246KCk9PlxuemNmLm1ha2VJbnZpdGF0aW9uKGNoYXJ0ZXJNZW1iZXJIYW5kbGVyLElOVklUQVRJT05fTUFLRVJTX0RFU0MpfSk7XG5cblxucmV0dXJuIGhhcmRlbih7Y3JlYXRvckZhY2V0fSk7XG4gfTskaOKAjV9vbmNlLnN0YXJ0KHN0YXJ0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJJTlZJVEFUSU9OX01BS0VSU19ERVNDIjpbIklOVklUQVRJT05fTUFLRVJTX0RFU0MiXSwic3RhcnQiOlsic3RhcnQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAgO+ZRPMFAADzBQAAJQAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xL3NyYy9jb25maWcuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkJyaWRnZUlkIiwiVkJhbmtBY2NvdW50IiwiV2FsbGV0TmFtZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qIEB0cy1jaGVjayovXG4vKiogQGZpbGVcbiAqXG4gKiBTb21lIG9mIHRoaXMgY29uZmlnIGluZm8gbWF5IG1ha2UgbW9yZSBzZW5zZSBpbiBhIHBhcnRpY3VsYXIgcGFja2FnZS4gSG93ZXZlclxuICogZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDYyMCBhbmQgb3VyIGxheCBwYWNrYWdlXG4gKiBkZXBlbmRlbmN5IGdyYXBoLCBzb21ldGltZXMgcmF0aW9uYWwgcGxhY2VtZW50cyBjYXVzZSB0eXBlIHJlc29sdXRpb24gZXJyb3JzLlxuICpcbiAqIFNvIGFzIGEgd29yay1hcm91bmQgc29tZSBjb25zdGFudHMgdGhhdCBuZWVkIGFjY2VzcyBmcm9tIG1vcmUgdGhhbiBvbmUgcGFja2FnZSBhcmUgcGxhY2VkIGhlcmUuXG4gKi9cblxuLyoqXG4gKiBFdmVudCBzb3VyY2UgaWRzIHVzZWQgYnkgdGhlIGJyaWRnZSBkZXZpY2UuXG4gKi9cbmNvbnN0ICAgICAgICBCcmlkZ2VJZD17XG5CQU5LOidiYW5rJyxcbkNPUkU6J2NvcmUnLFxuRElCQzonZGliYycsXG5TVE9SQUdFOidzdG9yYWdlJyxcblBST1ZJU0lPTjoncHJvdmlzaW9uJyxcblBST1ZJU0lPTl9TTUFSVF9XQUxMRVQ6J3Byb3Zpc2lvbldhbGxldCcsXG5XQUxMRVQ6J3dhbGxldCd9OyRo4oCNX29uY2UuQnJpZGdlSWQoQnJpZGdlSWQpO1xuXG5oYXJkZW4oQnJpZGdlSWQpO1xuXG5jb25zdCAgICAgICAgV2FsbGV0TmFtZT17XG5kZXBvc2l0RmFjZXQ6J2RlcG9zaXRGYWNldCd9OyRo4oCNX29uY2UuV2FsbGV0TmFtZShXYWxsZXROYW1lKTtcblxuaGFyZGVuKFdhbGxldE5hbWUpO1xuXG4vKiBkZWZpbmVkIGluIGdvbGFuZy9jb3Ntb3MveC92YmFuayovXG5jb25zdCAgICAgICAgVkJhbmtBY2NvdW50PXtcbnJlc2VydmU6e1xubW9kdWxlOid2YmFuay9yZXNlcnZlJyxcbmFkZHJlc3M6J2Fnb3JpYzFhZTBsbXR6bGdyY25sYTl4amtwYWFycTVkNWRmZXo2M2gzbnVjbCd9LFxuXG5wcm92aXNpb246e1xubW9kdWxlOid2YmFuay9wcm92aXNpb24nLFxuYWRkcmVzczonYWdvcmljMW1lZ3p5dGc2NWN5cmd6czZmdnp4Z3JjcXZ3d2w3dWdwdDYyMzQ2J319OyRo4oCNX29uY2UuVkJhbmtBY2NvdW50KFZCYW5rQWNjb3VudCk7XG5cblxuaGFyZGVuKFZCYW5rQWNjb3VudCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQnJpZGdlSWQiOlsiQnJpZGdlSWQiXSwiV2FsbGV0TmFtZSI6WyJXYWxsZXROYW1lIl0sIlZCYW5rQWNjb3VudCI6WyJWQmFua0FjY291bnQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAARDVCIaEEAAChBAAAJAAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xL3NyYy9kZWJ1Zy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWFrZVRyYWNlciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIGxldCBkZWJ1Z0luc3RhbmNlPTE7XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge2Jvb2xlYW4gfCAndmVyYm9zZSd9IGVuYWJsZVxuICovXG5jb25zdCAgICAgICAgbWFrZVRyYWNlcj0obmFtZSxlbmFibGU9dHJ1ZSk9PntcbmRlYnVnSW5zdGFuY2UrPTE7XG5sZXQgZGVidWdDb3VudD0xO1xuY29uc3Qga2V5PSBgLS0tLS0gJHtuYW1lfS4ke2RlYnVnSW5zdGFuY2V9IGA7XG4vKiB0aGUgY2FzZXMgYmVsb3cgZGVmaW5lIGEgbmFtZWQgdmFyaWFibGUgdG8gcHJvdmlkZSBiZXR0ZXIgZGVidWcgaW5mbyovXG5zd2l0Y2goZW5hYmxlKXtcbmNhc2UgZmFsc2U6e1xuY29uc3QgbG9nRGlzYWJsZWQ9KC4uLl9hcmdzKT0+eyB9O1xucmV0dXJuIGxvZ0Rpc2FibGVkO1xuIH1cbmNhc2UndmVyYm9zZSc6e1xuY29uc3QgaW5mb1RpY2s9KG9wdExvZywuLi5hcmdzKT0+e1xuaWYob3B0TG9nLmxvZyl7XG5jb25zb2xlLmluZm8oa2V5LGRlYnVnQ291bnQrPTEsLi4uYXJncyk7XG4gfWVsc2V7XG5jb25zb2xlLmluZm8oa2V5LGRlYnVnQ291bnQrPTEsb3B0TG9nLC4uLmFyZ3MpO1xuIH1cbiB9O1xucmV0dXJuIGluZm9UaWNrO1xuIH1cbmRlZmF1bHQ6e1xuY29uc3QgZGVidWdUaWNrPShvcHRMb2csLi4uYXJncyk9PntcbmlmKG9wdExvZy5sb2cpe1xub3B0TG9nLmxvZyhrZXksZGVidWdDb3VudCs9MSwuLi5hcmdzKTtcbiB9ZWxzZXtcbmNvbnNvbGUuaW5mbyhrZXksZGVidWdDb3VudCs9MSxvcHRMb2csLi4uYXJncyk7XG4gfVxuIH07XG5yZXR1cm4gZGVidWdUaWNrO1xuIH19XG5cbiB9OyRo4oCNX29uY2UubWFrZVRyYWNlcihtYWtlVHJhY2VyKTtcbmhhcmRlbihtYWtlVHJhY2VyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlVHJhY2VyIjpbIm1ha2VUcmFjZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAxjCg3y4CAAAuAgAAJAAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL2NvbmZpZy5qcyIsIi4vZGVidWcuanMiLCIuL21ldGhvZC10b29scy5qcyIsIi4vdHlwZUd1YXJkcy5qcyIsIi4vdXRpbHMuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6WyIuL2NvbmZpZy5qcyIsIi4vZGVidWcuanMiLCIuL21ldGhvZC10b29scy5qcyIsIi4vdHlwZUd1YXJkcy5qcyIsIi4vdXRpbHMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL2NvbmZpZy5qc1wiLCBbXV0sW1wiLi9kZWJ1Zy5qc1wiLCBbXV0sW1wiLi91dGlscy5qc1wiLCBbXV0sW1wiLi9tZXRob2QtdG9vbHMuanNcIiwgW11dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAATaWrs9gcAADYHAAALwAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2V2ZW50dWFsLXNlbmQiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsiYXNzZXJ0UGF0aFNlZ21lbnQiLCJtYWtlQ2hhaW5TdG9yYWdlUm9vdCIsIm1ha2VTZXJpYWxpemVUb1N0b3JhZ2UiLCJtYWtlU3RvcmFnZU5vZGVDaGlsZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLEZhcjskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dXSk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1ha2VDaGFpblN0b3JhZ2VSb290LCAnbmFtZScsIHt2YWx1ZTogXCJtYWtlQ2hhaW5TdG9yYWdlUm9vdFwifSk7JGjigI1fb25jZS5tYWtlQ2hhaW5TdG9yYWdlUm9vdChtYWtlQ2hhaW5TdG9yYWdlUm9vdCk7T2JqZWN0LmRlZmluZVByb3BlcnR5KG1ha2VTdG9yYWdlTm9kZUNoaWxkLCAnbmFtZScsIHt2YWx1ZTogXCJtYWtlU3RvcmFnZU5vZGVDaGlsZFwifSk7JGjigI1fb25jZS5tYWtlU3RvcmFnZU5vZGVDaGlsZChtYWtlU3RvcmFnZU5vZGVDaGlsZCk7ICAgXG5cblxuXG5cbmNvbnN0e0ZhaWx9PWFzc2VydDtcblxuLyoqIEB0eXBlZGVmIHtSZXR1cm5UeXBlPHR5cGVvZiBYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykubWFrZU1hcnNoYWw+fSBNYXJzaGFsbGVyICovXG4vKiogQHR5cGVkZWYge1BpY2s8TWFyc2hhbGxlciwgJ3Vuc2VyaWFsaXplJz59IFVuc2VyaWFsaXplciAqL1xuXG4vKipcbiAqIERlZmluZWQgYnkgdnN0b3JhZ2VTdG9yZUtleSBpbiB2c3RvcmFnZS5nb1xuICpcbiAqIEB0eXBlZGVmIFZTdG9yYWdlS2V5XG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RvcmVOYW1lXG4gKiBAcHJvcGVydHkge3N0cmluZ30gc3RvcmVTdWJrZXlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkYXRhUHJlZml4Qnl0ZXNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbbm9EYXRhVmFsdWVdXG4gKi9cblxuLyoqXG4gKiBUaGlzIHJlcHJlc2VudHMgYSBub2RlIGluIGFuIElBVkwgdHJlZS5cbiAqXG4gKiBUaGUgYWN0aXZlIGltcGxlbWVudGF0aW9uIGlzIHgvdnN0b3JhZ2UsIGFuIEFnb3JpYyBleHRlbnNpb24gb2YgdGhlIENvc21vcyBTREsuXG4gKlxuICogVnN0b3JhZ2UgaXMgYSBoaWVyYXJjaGljYWwgZXh0ZXJuYWxseS1yZWFjaGFibGUgc3RvcmFnZSBzdHJ1Y3R1cmUgdGhhdFxuICogaWRlbnRpZmllcyBjaGlsZHJlbiBieSByZXN0cmljdGVkIEFTQ0lJIG5hbWUgYW5kIGlzIGFzc29jaWF0ZWQgd2l0aCBhcmJpdHJhcnlcbiAqIHN0cmluZy12YWx1ZWQgZGF0YSBmb3IgZWFjaCBub2RlLCBkZWZhdWx0aW5nIHRvIHRoZSBlbXB0eSBzdHJpbmcuXG4gKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmFnZU5vZGVcbiAqIEBwcm9wZXJ0eSB7KGRhdGE6IHN0cmluZykgPT4gUHJvbWlzZTx2b2lkPn0gc2V0VmFsdWUgcHVibGlzaGVzIHNvbWUgZGF0YVxuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmd9IGdldFBhdGggdGhlIGNoYWluIHN0b3JhZ2UgcGF0aCBhdCB3aGljaCB0aGUgbm9kZSB3YXMgY29uc3RydWN0ZWRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxWU3RvcmFnZUtleT59IGdldFN0b3JlS2V5IERFUFJFQ0FURUQgdXNlIGdldFBhdGhcbiAqIEBwcm9wZXJ0eSB7KHN1YlBhdGg6IHN0cmluZywgb3B0aW9ucz86IHtzZXF1ZW5jZT86IGJvb2xlYW59KSA9PiBTdG9yYWdlTm9kZX0gbWFrZUNoaWxkTm9kZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVkRmFjZXRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxzdHJpbmc+fSBnZXRQYXRoIHRoZSBjaGFpbiBzdG9yYWdlIHBhdGggYXQgd2hpY2ggdGhlIG5vZGUgd2FzIGNvbnN0cnVjdGVkXG4gKiBAcHJvcGVydHkge1N0b3JhZ2VOb2RlWydnZXRTdG9yZUtleSddfSBnZXRTdG9yZUtleSBERVBSRUNBVEVEIHVzZSBnZXRQYXRoXG4gKiBAcHJvcGVydHkgeygpID0+IFVuc2VyaWFsaXplcn0gZ2V0VW5zZXJpYWxpemVyIGdldCB0aGUgdW5zZXJpYWxpemVyIGZvciB0aGUgc3RvcmVkIGRhdGFcbiAqL1xuXG4vKiBUT0RPOiBGb3JtYWxpemUgc2VnbWVudCBjb25zdHJhaW50cy4qL1xuLyogTXVzdCBiZSBub25lbXB0eSBhbmQgZGlzYWxsb3cgKHVuZXNjYXBlZCkgYC5gLCBhbmQgZm9yIHNpbXBsaWNpdHkqL1xuLyogKGFuZCBmdXR1cmUgcG9zc2liaWxpdHkgb2YgZS5nLiBlc2NhcGluZykgd2UgY3VycmVudGx5IGxpbWl0IHRvKi9cbi8qIEFTQ0lJIGFscGhhbnVtZXJpYyBwbHVzIHVuZGVyc2NvcmUgYW5kIGRhc2guKi9cbmNvbnN0IHBhdGhTZWdtZW50UGF0dGVybj0vXlthLXpBLVowLTlfLV17MSwxMDB9JC87XG5cbi8qKiBAdHlwZSB7KG5hbWU6IHN0cmluZykgPT4gdm9pZH0gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRQYXRoU2VnbWVudD0obmFtZSk9PntcbnBhdGhTZWdtZW50UGF0dGVybi50ZXN0KG5hbWUpfHxcbkZhaWwgYFBhdGggc2VnbWVudCBuYW1lcyBtdXN0IGNvbnNpc3Qgb2YgMSB0byAxMDAgY2hhcmFjdGVycyBsaW1pdGVkIHRvIEFTQ0lJIGFscGhhbnVtZXJpY3MsIHVuZGVyc2NvcmVzLCBhbmQvb3IgZGFzaGVzOiAke25hbWV9YDtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0UGF0aFNlZ21lbnQoYXNzZXJ0UGF0aFNlZ21lbnQpO1xuaGFyZGVuKGFzc2VydFBhdGhTZWdtZW50KTtcblxuLyoqXG4gKiBNdXN0IG1hdGNoIHRoZSBzd2l0Y2ggaW4gdnN0b3JhZ2UuZ28gdXNpbmcgYHZzdG9yYWdlTWVzc2FnZWAgdHlwZVxuICpcbiAqIEB0eXBlZGVmIHsgJ2dldCcgfCAnZ2V0U3RvcmVLZXknIHwgJ2hhcycgfCAnZW50cmllcycgfCAndmFsdWVzJyB8J3NpemUnIH0gU3RvcmFnZUdldEJ5UGF0aE1lc3NhZ2VNZXRob2RcbiAqIEB0eXBlZGVmIHsgJ3NldCcgfCAnYXBwZW5kJyB9IFN0b3JhZ2VVcGRhdGVFbnRyaWVzTWVzc2FnZU1ldGhvZFxuICogQHR5cGVkZWYge1N0b3JhZ2VHZXRCeVBhdGhNZXNzYWdlTWV0aG9kIHwgU3RvcmFnZVVwZGF0ZUVudHJpZXNNZXNzYWdlTWV0aG9kIH0gU3RvcmFnZU1lc3NhZ2VNZXRob2RcbiAqIEB0eXBlZGVmIHsgW3BhdGg6IHN0cmluZ10gfSBTdG9yYWdlR2V0QnlQYXRoTWVzc2FnZUFyZ3NcbiAqIEB0eXBlZGVmIHsgW3BhdGg6IHN0cmluZywgdmFsdWU/OiBzdHJpbmcgfCBudWxsXSB9IFN0b3JhZ2VFbnRyeVxuICogQHR5cGVkZWYgeyBTdG9yYWdlRW50cnlbXSB9IFN0b3JhZ2VVcGRhdGVFbnRyaWVzTWVzc2FnZUFyZ3NcbiAqIEB0eXBlZGVmIHt7XG4gKiAgIG1ldGhvZDogU3RvcmFnZUdldEJ5UGF0aE1lc3NhZ2VNZXRob2Q7XG4gKiAgIGFyZ3M6IFN0b3JhZ2VHZXRCeVBhdGhNZXNzYWdlQXJncztcbiAqICB9IHwge1xuICogICBtZXRob2Q6IFN0b3JhZ2VVcGRhdGVFbnRyaWVzTWVzc2FnZU1ldGhvZDtcbiAqICAgYXJnczogU3RvcmFnZVVwZGF0ZUVudHJpZXNNZXNzYWdlQXJncztcbiAqIH19IFN0b3JhZ2VNZXNzYWdlXG4gKi9cblxuLyoqXG4gKiBDcmVhdGUgYSByb290IHN0b3JhZ2Ugbm9kZSBmb3IgYSBnaXZlbiBiYWNraW5nIGZ1bmN0aW9uIGFuZCByb290IHBhdGguXG4gKlxuICogQHBhcmFtIHsobWVzc2FnZTogU3RvcmFnZU1lc3NhZ2UpID0+IGFueX0gaGFuZGxlU3RvcmFnZU1lc3NhZ2UgYSBmdW5jdGlvbiBmb3Igc2VuZGluZyBhIHN0b3JhZ2VNZXNzYWdlIG9iamVjdCB0byB0aGUgc3RvcmFnZSBpbXBsZW1lbnRhdGlvbiAoY2YuIGdvbGFuZy9jb3Ntb3MveC92c3RvcmFnZS92c3RvcmFnZS5nbylcbiAqIEBwYXJhbSB7c3RyaW5nfSByb290UGF0aFxuICogQHBhcmFtIHtvYmplY3R9IFtyb290T3B0aW9uc11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3Jvb3RPcHRpb25zLnNlcXVlbmNlXSBlbXBsb3kgYSB3cmFwcGluZyBzdHJ1Y3R1cmUgdGhhdCBwcmVzZXJ2ZXMgZWFjaCB2YWx1ZSBzZXQgd2l0aGluIGEgc2luZ2xlIGJsb2NrLCBhbmQgZGVmYXVsdCBjaGlsZCBub2RlcyB0byBkbyB0aGUgc2FtZVxuICovXG5mdW5jdGlvbiAgICAgICAgbWFrZUNoYWluU3RvcmFnZVJvb3QoXG5oYW5kbGVTdG9yYWdlTWVzc2FnZSxcbnJvb3RQYXRoLFxucm9vdE9wdGlvbnM9e30pXG57XG5hc3NlcnQudHlwZW9mKHJvb3RQYXRoLCdzdHJpbmcnKTtcblxuLyoqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICogQHBhcmFtIHtvYmplY3R9IFtvcHRpb25zXVxuICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5zZXF1ZW5jZV1cbiAqIEByZXR1cm5zIHtTdG9yYWdlTm9kZX1cbiAqL1xuZnVuY3Rpb24gbWFrZUNoYWluU3RvcmFnZU5vZGUocGF0aCxvcHRpb25zPXt9KXtcbmNvbnN0e3NlcXVlbmNlPWZhbHNlfT1vcHRpb25zO1xuY29uc3Qgbm9kZT17XG5nZXRQYXRoKCl7XG5yZXR1cm4gcGF0aDtcbiB9LFxuLyoqXG4gKiBAZGVwcmVjYXRlZCB1c2UgZ2V0UGF0aFxuICogQHR5cGUgeygpID0+IFByb21pc2U8VlN0b3JhZ2VLZXk+fVxuICovXG4gICAgICBhc3luYyBnZXRTdG9yZUtleSgpe1xucmV0dXJuIGhhbmRsZVN0b3JhZ2VNZXNzYWdlKHtcbm1ldGhvZDonZ2V0U3RvcmVLZXknLFxuYXJnczpbcGF0aF19KTtcblxuIH0sXG4vKiogQHR5cGUgeyhuYW1lOiBzdHJpbmcsIGNoaWxkTm9kZU9wdGlvbnM/OiB7c2VxdWVuY2U/OiBib29sZWFufSkgPT4gU3RvcmFnZU5vZGV9ICovXG5tYWtlQ2hpbGROb2RlKG5hbWUsY2hpbGROb2RlT3B0aW9ucz17fSl7XG5hc3NlcnQudHlwZW9mKG5hbWUsJ3N0cmluZycpO1xuYXNzZXJ0UGF0aFNlZ21lbnQobmFtZSk7XG5jb25zdCBtZXJnZWRPcHRpb25zPXtzZXF1ZW5jZSwuLi5jaGlsZE5vZGVPcHRpb25zfTtcbnJldHVybiBtYWtlQ2hhaW5TdG9yYWdlTm9kZSggYCR7cGF0aH0uJHtuYW1lfWAsbWVyZ2VkT3B0aW9ucyk7XG4gfSxcbi8qKiBAdHlwZSB7KHZhbHVlOiBzdHJpbmcpID0+IFByb21pc2U8dm9pZD59ICovXG4gICAgICBhc3luYyBzZXRWYWx1ZSh2YWx1ZSl7XG5hc3NlcnQudHlwZW9mKHZhbHVlLCdzdHJpbmcnKTtcbi8qKiBAdHlwZSB7U3RvcmFnZUVudHJ5fSAqL1xubGV0IGVudHJ5O1xuaWYoIXNlcXVlbmNlJiYhdmFsdWUpe1xuZW50cnk9W3BhdGhdO1xuIH1lbHNle1xuZW50cnk9W3BhdGgsdmFsdWVdO1xuIH1cbmF3YWl0IGhhbmRsZVN0b3JhZ2VNZXNzYWdlKHtcbm1ldGhvZDpzZXF1ZW5jZT8nYXBwZW5kJzonc2V0JyxcbmFyZ3M6W2VudHJ5XX0pO1xuXG4gfVxuLyogUG9zc2libGUgZXh0ZW5zaW9uczoqL1xuLyogKiBnZXRWYWx1ZSgpKi9cbi8qICogZ2V0Q2hpbGROYW1lcygpIGFuZC9vciBtYWtlQ2hpbGROb2RlcygpKi9cbi8qICogZ2V0TmFtZSgpKi9cbi8qICogcmVjdXJzaXZlIGRlbGV0ZSovXG4vKiAqIGJhdGNoIG9wZXJhdGlvbnMqL1xuLyogKiBsb2NhbCBidWZmZXJpbmcgKHdpdGggZW5kLW9mLWJsb2NrIGNvbW1pdCkqL307XG5cbnJldHVybiBGYXIoJ2NoYWluU3RvcmFnZU5vZGUnLG5vZGUpO1xuIH1cblxuY29uc3Qgcm9vdE5vZGU9bWFrZUNoYWluU3RvcmFnZU5vZGUocm9vdFBhdGgscm9vdE9wdGlvbnMpO1xucmV0dXJuIHJvb3ROb2RlO1xuIH1cblxuLyoqXG4gKiBAcmV0dXJucyB7U3RvcmFnZU5vZGV9IGFuIG9iamVjdCB0aGF0IGNvbmZpcm1zIHRvIFN0b3JhZ2VOb2RlIEFQSSBidXQgZG9lcyBub3Qgc3RvcmUgYW55d2hlcmUuXG4gKi9cbmNvbnN0IG1ha2VOdWxsU3RvcmFnZU5vZGU9KCk9Pntcbi8qIFhYWCByZS11c2UgXCJDaGFpblN0b3JhZ2VcIiBtZXRob2RzIGFib3ZlIHdoaWNoIGRvbid0IGFjdHVhbGx5IGRlcGVuZCBvbiBjaGFpbnMqL1xucmV0dXJuIG1ha2VDaGFpblN0b3JhZ2VSb290KCgpPT5udWxsLCdudWxsJyk7XG4gfTtcblxuLyoqXG4gKiBDb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgcmV0dXJuaW5nIGEgc3RvcmFnZSBub2RlIGF0IG9yIHVuZGVyIGl0cyBpbnB1dCxcbiAqIGZhbGxpbmcgYmFjayB0byBhbiBpbmVydCBvYmplY3Qgd2l0aCB0aGUgY29ycmVjdCBpbnRlcmZhY2UgKGJ1dCBpbmNvbXBsZXRlXG4gKiBiZWhhdmlvcikgd2hlbiB0aGF0IGlzIHVuYXZhaWxhYmxlLlxuICpcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGVuZG8vZmFyJykuRVJlZjxTdG9yYWdlTm9kZT8+fSBzdG9yYWdlTm9kZVJlZlxuICogQHBhcmFtIHtzdHJpbmd9IGNoaWxkTmFtZVxuICogQHJldHVybnMge1Byb21pc2U8U3RvcmFnZU5vZGU+fVxuICovXG5hc3luYyBmdW5jdGlvbiAgICAgICAgbWFrZVN0b3JhZ2VOb2RlQ2hpbGQoc3RvcmFnZU5vZGVSZWYsY2hpbGROYW1lKXtcbmNvbnN0IGV4aXN0aW5nU3RvcmFnZU5vZGU9YXdhaXQgc3RvcmFnZU5vZGVSZWY7XG5jb25zdCBzdG9yYWdlTm9kZT1leGlzdGluZ1N0b3JhZ2VOb2RlfHxtYWtlTnVsbFN0b3JhZ2VOb2RlKCk7XG5yZXR1cm4gRShzdG9yYWdlTm9kZSkubWFrZUNoaWxkTm9kZShjaGlsZE5hbWUpO1xuIH1cbmhhcmRlbihtYWtlU3RvcmFnZU5vZGVDaGlsZCk7XG5cbi8qIFRPRE8gZmluZCBhIGJldHRlciBtb2R1bGUgZm9yIHRoaXMqL1xuLyoqXG4gKlxuICogQHBhcmFtIHtYaW1wb3J0KCdAZW5kby9mYXInKS5FUmVmPFN0b3JhZ2VOb2RlPn0gc3RvcmFnZU5vZGVcbiAqIEBwYXJhbSB7WGltcG9ydCgnQGVuZG8vZmFyJykuRVJlZjxNYXJzaGFsbGVyPn0gbWFyc2hhbGxlclxuICogQHJldHVybnMgeyh2YWx1ZTogdW5rbm93bikgPT4gUHJvbWlzZTx2b2lkPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VTZXJpYWxpemVUb1N0b3JhZ2U9KHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIpPT57XG5yZXR1cm4gYXN5bmModmFsdWUpPT57XG5jb25zdCBtYXJzaGFsbGVkPWF3YWl0IEUobWFyc2hhbGxlcikuc2VyaWFsaXplKHZhbHVlKTtcbmNvbnN0IHNlcmlhbGl6ZWQ9SlNPTi5zdHJpbmdpZnkobWFyc2hhbGxlZCk7XG5yZXR1cm4gRShzdG9yYWdlTm9kZSkuc2V0VmFsdWUoc2VyaWFsaXplZCk7XG4gfTtcbiB9OyRo4oCNX29uY2UubWFrZVNlcmlhbGl6ZVRvU3RvcmFnZShtYWtlU2VyaWFsaXplVG9TdG9yYWdlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3NlcnRQYXRoU2VnbWVudCI6WyJhc3NlcnRQYXRoU2VnbWVudCJdLCJtYWtlQ2hhaW5TdG9yYWdlUm9vdCI6WyJtYWtlQ2hhaW5TdG9yYWdlUm9vdCJdLCJtYWtlU3RvcmFnZU5vZGVDaGlsZCI6WyJtYWtlU3RvcmFnZU5vZGVDaGlsZCJdLCJtYWtlU2VyaWFsaXplVG9TdG9yYWdlIjpbIm1ha2VTZXJpYWxpemVUb1N0b3JhZ2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA6OuUUvwOAAD8DgAAKwAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xL3NyYy9tZXRob2QtdG9vbHMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImJpbmRBbGxNZXRob2RzIiwiZ2V0TWV0aG9kTmFtZXMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaXNPYmplY3Q7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuLyoqXG4gKiBAZmlsZSBtZXRob2QtdG9vbHMgdXNlIGR5bmFtaWMgcHJvcGVydHkgbG9va3VwLCB3aGljaCBpcyBub3QgSmVzc2llLWNvbXBhdGlibGVcbiAqL1xuXG5jb25zdHtnZXRQcm90b3R5cGVPZixjcmVhdGUsZnJvbUVudHJpZXMsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yc309XG5PYmplY3Q7XG5jb25zdHtvd25LZXlzLGFwcGx5fT1SZWZsZWN0O1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwvc3JjL3R5cGVzJykuUmVtb3RhYmxlfSBSZW1vdGFibGUgKi9cblxuLyoqXG4gKiBQcmlvcml0aXplIHN5bWJvbHMgYXMgZWFybGllciB0aGFuIHN0cmluZ3MuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8c3ltYm9sfSBhXG4gKiBAcGFyYW0ge3N0cmluZ3xzeW1ib2x9IGJcbiAqIEByZXR1cm5zIHstMSB8IDAgfCAxfVxuICovXG5jb25zdCBjb21wYXJlU3RyaW5naWZpZWQ9KGEsYik9PntcbmlmKHR5cGVvZiBhPT09dHlwZW9mIGIpe1xuY29uc3QgbGVmdD1TdHJpbmcoYSk7XG5jb25zdCByaWdodD1TdHJpbmcoYik7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmVzdGVkLXRlcm5hcnkqL1xucmV0dXJuIGxlZnQ8cmlnaHQ/LTE6bGVmdD5yaWdodD8xOjA7XG4gfVxuaWYodHlwZW9mIGE9PT0nc3ltYm9sJyl7XG5hc3NlcnQodHlwZW9mIGI9PT0nc3RyaW5nJyk7XG5yZXR1cm4tMTtcbiB9XG5hc3NlcnQodHlwZW9mIGE9PT0nc3RyaW5nJyk7XG5hc3NlcnQodHlwZW9mIGI9PT0nc3ltYm9sJyk7XG5yZXR1cm4gMTtcbiB9O1xuXG4vKipcbiAqIFRPRE8gQ29uc29saWRhdGUgd2l0aCB0aGUgYGdldE1ldGhvZE5hbWVzYCBpbiBgQGVuZG8vZXZlbnR1YWwtc2VuZGBcbiAqXG4gKiBAcGFyYW0ge2FueX0gdmFsXG4gKiBAcmV0dXJucyB7KHN0cmluZ3xzeW1ib2wpW119XG4gKi9cbmNvbnN0ICAgICAgICBnZXRNZXRob2ROYW1lcz0odmFsKT0+e1xubGV0IGxheWVyPXZhbDtcbmNvbnN0IG5hbWVzPW5ldyBTZXQoKTsvKiBTZXQgdG8gZGVkdXBsaWNhdGUqL1xud2hpbGUobGF5ZXIhPT1udWxsJiZsYXllciE9PU9iamVjdC5wcm90b3R5cGUpe1xuLyogYmUgdG9sZXJhbnQgb2Ygbm9uLW9iamVjdHMqL1xuY29uc3QgZGVzY3M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhsYXllcik7XG5mb3IoY29uc3QgbmFtZSBvZiBvd25LZXlzKGRlc2NzKSl7XG4vKiBJbiBjYXNlIGEgbWV0aG9kIGlzIG92ZXJyaWRkZW4gYnkgYSBub24tbWV0aG9kLCovXG4vKiB0ZXN0IGB2YWxbbmFtZV1gIHJhdGhlciB0aGFuIGBsYXllcltuYW1lXWAqL1xuaWYodHlwZW9mIHZhbFtuYW1lXT09PSdmdW5jdGlvbicpe1xubmFtZXMuYWRkKG5hbWUpO1xuIH1cbiB9XG5pZighaXNPYmplY3QodmFsKSl7XG5icmVhaztcbiB9XG5sYXllcj1nZXRQcm90b3R5cGVPZihsYXllcik7XG4gfVxucmV0dXJuIGhhcmRlbihbLi4ubmFtZXNdLnNvcnQoY29tcGFyZVN0cmluZ2lmaWVkKSk7XG4gfTskaOKAjV9vbmNlLmdldE1ldGhvZE5hbWVzKGdldE1ldGhvZE5hbWVzKTtcbmhhcmRlbihnZXRNZXRob2ROYW1lcyk7XG5cbi8qKlxuICogVE9ETyBUaGlzIGZ1bmN0aW9uIGV4aXN0cyBvbmx5IHRvIGVhc2UgdGhlXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC81OTcwIHRyYW5zaXRpb24sIGZyb20gYWxsIG1ldGhvZHNcbiAqIGJlaW5nIG93biBwcm9wZXJ0aWVzIHRvIG1ldGhvZHMgYmVpbmcgaW5oZXJpdGVkIGZyb20gYSBjb21tb24gcHJvdG90eXBlLlxuICogVGhpcyB0cmFuc2l0aW9uIGJyZWFrcyB0d28gcGF0dGVybnMgdXNlZCBpbiBwcmlvciBjb2RlOiBhdXRvYmluZGluZyxcbiAqIGFuZCBlbnVtZXJhdGluZyBtZXRob2RzIGJ5IGVudW1lcmF0aW5nIG93biBwcm9wZXJ0aWVzLiBGb3IgYm90aCwgdGhlXG4gKiBwcmVmZXJyZWQgcmVwYWlycyBhcmVcbiAqICAgICogYXV0b2JpbmRpbmc6IFJlcGxhY2UsIGZvciBleGFtcGxlLFxuICogICAgICBgZm9vKG9iai5tZXRob2QpYCB3aXRoIGBmb28oYXJnID0+IGBvYmoubWV0aG9kKGFyZykpYC4gSU9XLCBzdG9wIHJlbHlpbmdcbiAqICAgICAgb24gZXhwcmVzc2lvbnMgbGlrZSBgb2JqLm1ldGhvZGAgdG8gZXh0cmFjdCBhIG1ldGhvZCBzdGlsbCBib3VuZCB0byB0aGVcbiAqICAgICAgc3RhdGUgb2YgYG9iamAgYmVjYXVzZSwgZm9yIHZpcnR1YWwgYW5kIGR1cmFibGUgb2JqZWN0cyxcbiAqICAgICAgdGhleSBubyBsb25nZXIgd2lsbCBhZnRlciAjNTk3MC5cbiAqICAgICogbWV0aG9kIGVudW1lcmF0aW9uOiBSZXBsYWNlLCBmb3IgZXhhbXBsZVxuICogICAgICBgUmVmbGVjdC5vd25LZXlzKG9iailgIHdpdGggYGdldE1ldGhvZE5hbWVzKG9iailgLlxuICpcbiAqIE9uY2UgYWxsIHByb2JsZW1hdGljIGNhc2VzIGhhdmUgYmVlbiBjb252ZXJ0ZWQgaW4gdGhpcyBtYW5uZXIsIHRoaXNcbiAqIGBiaW5kQWxsTWV0aG9kc2AgaGFjayBjYW4gYW5kIFRPRE8gc2hvdWxkIGJlIGRlbGV0ZWQuIEhvd2V2ZXIsIHdlIGN1cnJlbnRseVxuICogaGF2ZSBubyByZWxpYWJsZSBzdGF0aWMgd2F5IHRvIHRyYWNrIGRvd24gYW5kIGZpeCBhbGwgYXV0b2JpbmRpbmcgc2l0ZXMuXG4gKiBGb3IgdGhvc2Ugb2JqZWN0cyB0aGF0IGhhdmUgbm90IHlldCBiZWVuIGZ1bGx5IHJlcGFpcmVkIGJ5IHRoZSBhYm92ZSB0d29cbiAqIHRlY2huaXF1ZXMsIGBiaW5kQWxsTWV0aG9kc2AgY3JlYXRlcyBhbiBvYmplY3QgdGhhdCBhY3RzIG11Y2ggbGlrZSB0aGVcbiAqIHByZS0jNTk3MCBvYmplY3RzLCB3aXRoIGFsbCB0aGVpciBtZXRob2RzIGFzIGluc3RhbmNlLWJvdW5kIG93biBwcm9wZXJ0aWVzLlxuICogSXQgZG9lcyB0aGlzIGJ5IG1ha2luZyBhIG5ldyBvYmplY3QgaW5oZXJpdGluZyBmcm9tIGBvYmpgIHdoZXJlIHRoZSBuZXdcbiAqIG9iamVjdCBoYXMgYm91bmQgb3duIG1ldGhvZHMgb3ZlcnJpZGRpbmcgYWxsIHRoZSBtZXRob2RzIGl0IHdvdWxkIGhhdmVcbiAqIGluaGVyaXRlZCBmcm9tIGBvYmpgLlxuICpcbiAqIEBwYXJhbSB7UmVtb3RhYmxlfSBvYmpcbiAqIEByZXR1cm5zIHtSZW1vdGFibGV9XG4gKi9cbmNvbnN0ICAgICAgICBiaW5kQWxsTWV0aG9kcz0ob2JqKT0+XG5oYXJkZW4oXG5jcmVhdGUoXG5vYmosXG5mcm9tRW50cmllcyhcbmdldE1ldGhvZE5hbWVzKG9iaikubWFwKChuYW1lKT0+W1xubmFtZSxcbntcbnZhbHVlOigvKiogQHR5cGUge3Vua25vd25bXX0gKi8uLi5hcmdzKT0+XG5hcHBseShvYmpbbmFtZV0sb2JqLGFyZ3MpLFxuZW51bWVyYWJsZTp0cnVlfV0pKSkpOyRo4oCNX29uY2UuYmluZEFsbE1ldGhvZHMoYmluZEFsbE1ldGhvZHMpO1xuXG5cblxuXG5cbmhhcmRlbihiaW5kQWxsTWV0aG9kcyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZ2V0TWV0aG9kTmFtZXMiOlsiZ2V0TWV0aG9kTmFtZXMiXSwiYmluZEFsbE1ldGhvZHMiOlsiYmluZEFsbE1ldGhvZHMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAsnjEEC0CAAAtAgAAKQAAAEBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJtYWtlVHlwZUd1YXJkcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qKlxuICogQHBhcmFtIHt0eXBlb2YgWGltcG9ydCgnQGFnb3JpYy9zdG9yZScpLk19IE1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VUeXBlR3VhcmRzPShNKT0+XG5oYXJkZW4oe1xuU3RvcmFnZU5vZGVTaGFwZTpNLnJlbW90YWJsZSgnU3RvcmFnZU5vZGUnKX0pOyRo4oCNX29uY2UubWFrZVR5cGVHdWFyZHMobWFrZVR5cGVHdWFyZHMpO1xuXG5oYXJkZW4obWFrZVR5cGVHdWFyZHMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VUeXBlR3VhcmRzIjpbIm1ha2VUeXBlR3VhcmRzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAM8BYrW/MAAAvzAAACQAAABAYWdvcmljL2ludGVybmFsLXYwLjIuMS9zcmMvdXRpbHMuanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9wcm9taXNlLWtpdCIsImplc3NpZS5qcyJdLCJleHBvcnRzIjpbIkJBU0lTX1BPSU5UUyIsIlByb21pc2VBbGxPckVycm9ycyIsImFnZ3JlZ2F0ZVRyeUZpbmFsbHkiLCJhbGxWYWx1ZXMiLCJhcHBseUxhYmVsaW5nRXJyb3IiLCJhc3NlcnRBbGxEZWZpbmVkIiwiZGVlcGx5RnVsZmlsbGVkT2JqZWN0IiwiZm9yZXZlciIsImZyb21VbmlxdWVFbnRyaWVzIiwibGlzdERpZmZlcmVuY2UiLCJtYWtlQWdncmVnYXRlRXJyb3IiLCJtYWtlTWVhc3VyZVNlY29uZHMiLCJvYmplY3RNYXAiLCJ0aHJvd0xhYmVsZWQiLCJ1bnRpbFRydWUiLCJ3aGlsZVRydWUiLCJ6aXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxkZWVwbHlGdWxmaWxsZWQsaXNPYmplY3QsaXNQcm9taXNlLGFzeW5jR2VuZXJhdGUsbWFrZVNldDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9ldmVudHVhbC1zZW5kXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWxcIiwgW1tcImRlZXBseUZ1bGZpbGxlZFwiLCBbJGjigI1fYSA9PiAoZGVlcGx5RnVsZmlsbGVkID0gJGjigI1fYSldXSxbXCJpc09iamVjdFwiLCBbJGjigI1fYSA9PiAoaXNPYmplY3QgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoaXNQcm9taXNlID0gJGjigI1fYSldXV1dLFtcImplc3NpZS5qc1wiLCBbW1wiYXN5bmNHZW5lcmF0ZVwiLCBbJGjigI1fYSA9PiAoYXN5bmNHZW5lcmF0ZSA9ICRo4oCNX2EpXV0sW1wibWFrZVNldFwiLCBbJGjigI1fYSA9PiAobWFrZVNldCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuY29uc3R7ZW50cmllcyxmcm9tRW50cmllcyxrZXlzLHZhbHVlc309T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG5jb25zdCAgICAgICAgQkFTSVNfUE9JTlRTPTEwXzAwMG47XG5cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLkVSZWY8VD59IEVSZWY8VD4gKi9cblxuLyoqXG4gKiBUaHJvd3MgaWYgbXVsdGlwbGUgZW50cmllcyB1c2UgdGhlIHNhbWUgcHJvcGVydHkgbmFtZS4gT3RoZXJ3aXNlIGFjdHNcbiAqIGxpa2UgYE9iamVjdC5mcm9tRW50cmllc2AgYnV0IGhhcmRlbnMgdGhlIHJlc3VsdC5cbiAqIFVzZSBpdCB0byBwcm90ZWN0IGZyb20gcHJvcGVydHkgbmFtZXMgY29tcHV0ZWQgZnJvbSB1c2VyLXByb3ZpZGVkIGRhdGEuXG4gKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtJdGVyYWJsZTxbSyxWXT59IGFsbEVudHJpZXNcbiAqIEByZXR1cm5zIHt7W2s6IEtdOiBWfX1cbiAqLyRo4oCNX29uY2UuQkFTSVNfUE9JTlRTKEJBU0lTX1BPSU5UUyk7XG5jb25zdCAgICAgICAgZnJvbVVuaXF1ZUVudHJpZXM9KGFsbEVudHJpZXMpPT57XG5jb25zdCBlbnRyaWVzQXJyYXk9Wy4uLmFsbEVudHJpZXNdO1xuY29uc3QgcmVzdWx0PWhhcmRlbihmcm9tRW50cmllcyhlbnRyaWVzQXJyYXkpKTtcbmlmKG93bktleXMocmVzdWx0KS5sZW5ndGg9PT1lbnRyaWVzQXJyYXkubGVuZ3RoKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuY29uc3QgbmFtZXM9bWFrZVNldCgpO1xuZm9yKGNvbnN0W25hbWUsX11vZiBlbnRyaWVzQXJyYXkpe1xuaWYobmFtZXMuaGFzKG5hbWUpKXtcbkZhaWwgYGNvbGxpc2lvbiBvbiBwcm9wZXJ0eSBuYW1lICR7cShuYW1lKX06ICR7ZW50cmllc0FycmF5fWA7XG4gfVxubmFtZXMuYWRkKG5hbWUpO1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBmYWlsZWQgdG8gY3JlYXRlIG9iamVjdCBmcm9tIHVuaXF1ZSBlbnRyaWVzYDtcbiB9OyRo4oCNX29uY2UuZnJvbVVuaXF1ZUVudHJpZXMoZnJvbVVuaXF1ZUVudHJpZXMpO1xuaGFyZGVuKGZyb21VbmlxdWVFbnRyaWVzKTtcblxuLyoqXG4gKiBCeSBhbmFsb2d5IHdpdGggaG93IGBBcnJheS5wcm90b3R5cGUubWFwYCB3aWxsIG1hcCB0aGUgZWxlbWVudHMgb2ZcbiAqIGFuIGFycmF5IHRvIHRyYW5zZm9ybWVkIGVsZW1lbnRzIG9mIGFuIGFycmF5IG9mIHRoZSBzYW1lIHNoYXBlLFxuICogYG9iamVjdE1hcGAgd2lsbCBkbyBsaWtld2lzZSBmb3IgdGhlIHN0cmluZy1uYW1lZCBvd24gZW51bWVyYWJsZVxuICogcHJvcGVydGllcyBvZiBhbiBvYmplY3QuXG4gKlxuICogVHlwaWNhbCB1c2FnZSBhcHBsaWVzIGBvYmplY3RNYXBgIHRvIGEgQ29weVJlY29yZCwgaS5lLixcbiAqIGFuIG9iamVjdCBmb3Igd2hpY2ggYHBhc3NTdHlsZU9mKG9yaWdpbmFsKSA9PT0gJ2NvcHlSZWNvcmQnYC4gRm9yIHRoZXNlLFxuICogbm9uZSBvZiB0aGUgZm9sbG93aW5nIGVkZ2UgY2FzZXMgYXJpc2UuIFRoZSByZXN1bHQgd2lsbCBiZSBhIENvcHlSZWNvcmRcbiAqIHdpdGggZXhhY3RseSB0aGUgc2FtZSBwcm9wZXJ0eSBuYW1lcywgd2hvc2UgdmFsdWVzIGFyZSB0aGUgbWFwcGVkIGZvcm0gb2ZcbiAqIHRoZSBvcmlnaW5hbCdzIHZhbHVlcy5cbiAqXG4gKiBXaGVuIHRoZSBvcmlnaW5hbCBpcyBub3QgYSBDb3B5UmVjb3JkLCBzb21lIGVkZ2UgY2FzZXMgdG8gYmUgYXdhcmUgb2ZcbiAqICAgICogTm8gbWF0dGVyIGhvdyBtdXRhYmxlIHRoZSBvcmlnaW5hbCBvYmplY3QsIHRoZSByZXR1cm5lZCBvYmplY3QgaXNcbiAqICAgICAgaGFyZGVuZWQuXG4gKiAgICAqIE9ubHkgdGhlIHN0cmluZy1uYW1lZCBlbnVtZXJhYmxlIG93biBwcm9wZXJ0aWVzIG9mIHRoZSBvcmlnaW5hbFxuICogICAgICBhcmUgbWFwcGVkLiBBbGwgb3RoZXIgcHJvcGVydGllcyBhcmUgaWdub3JlZC5cbiAqICAgICogSWYgYW55IG9mIHRoZSBvcmlnaW5hbCBwcm9wZXJ0aWVzIHdlcmUgYWNjZXNzb3JzLCBgT2JqZWN0LmVudHJpZXNgXG4gKiAgICAgIHdpbGwgY2F1c2UgaXRzIGBnZXR0ZXJgIHRvIGJlIGNhbGxlZCBhbmQgd2lsbCB1c2UgdGhlIHJlc3VsdGluZ1xuICogICAgICB2YWx1ZS5cbiAqICAgICogTm8gbWF0dGVyIHdoZXRoZXIgdGhlIG9yaWdpbmFsIHByb3BlcnR5IHdhcyBhbiBhY2Nlc3Nvciwgd3JpdGFibGUsXG4gKiAgICAgIG9yIGNvbmZpZ3VyYWJsZSwgYWxsIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBiZVxuICogICAgICBub24td3JpdGFibGUsIG5vbi1jb25maWd1cmFibGUsIGRhdGEgcHJvcGVydGllcy5cbiAqICAgICogTm8gbWF0dGVyIHdoYXQgdGhlIG9yaWdpbmFsIG9iamVjdCBtYXkgaGF2ZSBpbmhlcml0ZWQgZnJvbSwgYW5kXG4gKiAgICAgIG5vIG1hdHRlciB3aGV0aGVyIGl0IHdhcyBhIHNwZWNpYWwga2luZCBvZiBvYmplY3Qgc3VjaCBhcyBhbiBhcnJheSxcbiAqICAgICAgdGhlIHJldHVybmVkIG9iamVjdCB3aWxsIGFsd2F5cyBiZSBhIHBsYWluIG9iamVjdCBpbmhlcml0aW5nIGRpcmVjdGx5XG4gKiAgICAgIGZyb20gYE9iamVjdC5wcm90b3R5cGVgIGFuZCB3aG9zZSBzdGF0ZSBpcyBvbmx5IHRoZXNlIG5ldyBtYXBwZWRcbiAqICAgICAgb3duIHByb3BlcnRpZXMuXG4gKlxuICogV2l0aCB0aGVzZSBkaWZmZXJlbmNlcywgZXZlbiBpZiB0aGUgb3JpZ2luYWwgb2JqZWN0IHdhcyBub3QgYSBDb3B5UmVjb3JkLFxuICogaWYgYWxsIHRoZSBtYXBwZWQgdmFsdWVzIGFyZSBQYXNzYWJsZSwgdGhlbiB0aGUgcmV0dXJuZWQgb2JqZWN0IHdpbGwgYmVcbiAqIGEgQ29weVJlY29yZC5cbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIGFueT59IE9cbiAqIEBwYXJhbSB7T30gb3JpZ2luYWxcbiAqIEB0ZW1wbGF0ZSBSIG1hcCByZXN1bHRcbiAqIEBwYXJhbSB7KHZhbHVlOiBPW2tleW9mIE9dLCBrZXk6IGtleW9mIE8pID0+IFJ9IG1hcEZuXG4gKiBAcmV0dXJucyB7eyBbUCBpbiBrZXlvZiBPXTogUn19XG4gKi9cbmNvbnN0ICAgICAgICBvYmplY3RNYXA9KG9yaWdpbmFsLG1hcEZuKT0+e1xuY29uc3QgZW50cz1lbnRyaWVzKG9yaWdpbmFsKTtcbmNvbnN0IG1hcEVudHM9ZW50cy5tYXAoKFtrLHZdKT0+W2ssbWFwRm4odixrKV0pO1xucmV0dXJuIGhhcmRlbihmcm9tRW50cmllcyhtYXBFbnRzKSk7XG4gfTskaOKAjV9vbmNlLm9iamVjdE1hcChvYmplY3RNYXApO1xuaGFyZGVuKG9iamVjdE1hcCk7XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7QXJyYXk8c3RyaW5nIHwgc3ltYm9sPn0gbGVmdE5hbWVzXG4gKiBAcGFyYW0ge0FycmF5PHN0cmluZyB8IHN5bWJvbD59IHJpZ2h0TmFtZXNcbiAqL1xuY29uc3QgICAgICAgIGxpc3REaWZmZXJlbmNlPShsZWZ0TmFtZXMscmlnaHROYW1lcyk9PntcbmNvbnN0IHJpZ2h0U2V0PW1ha2VTZXQocmlnaHROYW1lcyk7XG5yZXR1cm4gbGVmdE5hbWVzLmZpbHRlcigobmFtZSk9PiFyaWdodFNldC5oYXMobmFtZSkpO1xuIH07JGjigI1fb25jZS5saXN0RGlmZmVyZW5jZShsaXN0RGlmZmVyZW5jZSk7XG5oYXJkZW4obGlzdERpZmZlcmVuY2UpO1xuXG4vKipcbiAqIEBwYXJhbSB7RXJyb3J9IGlubmVyRXJyXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IGxhYmVsXG4gKiBAcGFyYW0ge0Vycm9yQ29uc3RydWN0b3J9IFtFcnJvckNvbnN0cnVjdG9yXVxuICogQHJldHVybnMge25ldmVyfVxuICovXG5jb25zdCAgICAgICAgdGhyb3dMYWJlbGVkPShpbm5lckVycixsYWJlbCxFcnJvckNvbnN0cnVjdG9yPXVuZGVmaW5lZCk9PntcbmlmKHR5cGVvZiBsYWJlbD09PSdudW1iZXInKXtcbmxhYmVsPSBgWyR7bGFiZWx9XWA7XG4gfVxuY29uc3Qgb3V0ZXJFcnI9YXNzZXJ0LmVycm9yKFxuIGAke2xhYmVsfTogJHtpbm5lckVyci5tZXNzYWdlfWAsXG5FcnJvckNvbnN0cnVjdG9yKTtcblxuYXNzZXJ0Lm5vdGUob3V0ZXJFcnIsWCBgQ2F1c2VkIGJ5ICR7aW5uZXJFcnJ9YCk7XG50aHJvdyBvdXRlckVycjtcbiB9OyRo4oCNX29uY2UudGhyb3dMYWJlbGVkKHRocm93TGFiZWxlZCk7XG5oYXJkZW4odGhyb3dMYWJlbGVkKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgQSxSXG4gKiBAcGFyYW0geyguLi5hcmdzOiBBW10pID0+IFJ9IGZ1bmNcbiAqIEBwYXJhbSB7QVtdfSBhcmdzXG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtsYWJlbF1cbiAqIEByZXR1cm5zIHtSfVxuICovXG5jb25zdCAgICAgICAgYXBwbHlMYWJlbGluZ0Vycm9yPShmdW5jLGFyZ3MsbGFiZWw9dW5kZWZpbmVkKT0+e1xuaWYobGFiZWw9PT11bmRlZmluZWQpe1xucmV0dXJuIGZ1bmMoLi4uYXJncyk7XG4gfVxubGV0IHJlc3VsdDtcbnRyeXtcbnJlc3VsdD1mdW5jKC4uLmFyZ3MpO1xuIH1jYXRjaChlcnIpe1xudGhyb3dMYWJlbGVkKGVycixsYWJlbCk7XG4gfVxuaWYoaXNQcm9taXNlKHJlc3VsdCkpe1xuLyogQHRzLWV4cGVjdC1lcnJvciBJZiByZXN1bHQgaXMgYSByZWplY3RlZCBwcm9taXNlLCB0aGlzIHdpbGwqL1xuLyogcmV0dXJuIGEgcHJvbWlzZSB3aXRoIGEgZGlmZmVyZW50IHJlamVjdGlvbiByZWFzb24uIEJ1dCB0aGlzKi9cbi8qIGNvbmZ1c2VzIFR5cGVTY3JpcHQgYmVjYXVzZSBpdCB0eXBlcyB0aGF0IGNhc2UgYXMgYFByb21pc2U8bmV2ZXI+YCovXG4vKiB3aGljaCBpcyBjb29sIGZvciBhIHByb21pc2UgdGhhdCB3aWxsIG5ldmVyIGZ1bGZsbC4qL1xuLyogQnV0IFR5cGVTY3JpcHQgZG9lc24ndCB1bmRlcnN0YW5kIHRoYXQgdGhpcyB3aWxsIG9ubHkgaGFwcGVuKi9cbi8qIHdoZW4gYHJlc3VsdGAgd2FzIGEgcmVqZWN0ZWQgcHJvbWlzZS4gSW4gb25seSB0aGlzIGNhc2UgYFJgKi9cbi8qIHNob3VsZCBhbHJlYWR5IGFsbG93IGBQcm9taXNlPG5ldmVyPmAgYXMgYSBzdWJ0eXBlLiovXG5yZXR1cm4gRS53aGVuKHJlc3VsdCx1bmRlZmluZWQsKHJlYXNvbik9PnRocm93TGFiZWxlZChyZWFzb24sbGFiZWwpKTtcbiB9ZWxzZXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH07JGjigI1fb25jZS5hcHBseUxhYmVsaW5nRXJyb3IoYXBwbHlMYWJlbGluZ0Vycm9yKTtcbmhhcmRlbihhcHBseUxhYmVsaW5nRXJyb3IpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7e1tLZXlUeXBlIGluIGtleW9mIFRdOiBUW0tleVR5cGVdfSAmIHt9fSBTaW1wbGlmeVxuICogZmxhdHRlbiB0aGUgdHlwZSBvdXRwdXQgdG8gaW1wcm92ZSB0eXBlIGhpbnRzIHNob3duIGluIGVkaXRvcnNcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvdHlwZS1mZXN0L2Jsb2IvbWFpbi9zb3VyY2Uvc2ltcGxpZnkuZC50c1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBDYWxsYWJsZVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHt7fX0gVFxuICogQHR5cGVkZWYge3sgW0sgaW4ga2V5b2YgVF06IFRbS10gZXh0ZW5kcyBDYWxsYWJsZSA/IFRbS10gOiBEZWVwbHlBd2FpdGVkPFRbS10+IH19IERlZXBseUF3YWl0ZWRPYmplY3RcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7VCBleHRlbmRzIFByb21pc2VMaWtlPGFueT4gPyBBd2FpdGVkPFQ+IDogVCBleHRlbmRzIHt9ID8gU2ltcGxpZnk8RGVlcGx5QXdhaXRlZE9iamVjdDxUPj4gOiBBd2FpdGVkPFQ+fSBEZWVwbHlBd2FpdGVkXG4gKi9cblxuLyoqXG4gKiBBIG1vcmUgY29uc3RyYWluZWQgdmVyc2lvbiBvZiB7ZGVlcGx5RnVsZmlsbGVkfSBmb3IgdHlwZSBzYWZldHkgdW50aWxcbiAqIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9pc3N1ZXMvMTI1N1xuICogVXNlZnVsIGluIHN0YXJ0aW5nIGNvbnRyYWN0cyB0aGF0IG5lZWQgYWxsIHRlcm1zIHRvIGJlIGZ1bGZpbGxlZFxuICogaW4gb3JkZXIgdG8gYmUgZHVyYWJsZS5cbiAqXG4gKiBAdHlwZSB7PFQgZXh0ZW5kcyB7fT4odW5mdWxmaWxsZWRUZXJtczogVCkgPT4gUHJvbWlzZTxEZWVwbHlBd2FpdGVkPFQ+Pn1cbiAqL1xuY29uc3QgICAgICAgIGRlZXBseUZ1bGZpbGxlZE9iamVjdD1hc3luYyhvYmopPT57XG5pc09iamVjdChvYmopfHxGYWlsIGBwYXJhbSBtdXN0IGJlIGFuIG9iamVjdGA7XG5yZXR1cm4gZGVlcGx5RnVsZmlsbGVkKG9iaik7XG4gfTtcblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCB1c2VzIGEgbWlsbGlzZWNvbmQtYmFzZWQgdGltZS1zaW5jZS1lcG9jaCBjYXBhYmlsaXR5XG4gKiAoc3VjaCBhcyBgcGVyZm9ybWFuY2Uubm93YCkgdG8gbWVhc3VyZSBleGVjdXRpb24gdGltZSBvZiBhbiBhc3luYyBmdW5jdGlvblxuICogYW5kIHJlcG9ydCB0aGUgcmVzdWx0IGluIHNlY29uZHMgdG8gbWF0Y2ggb3VyIHRlbGVtZXRyeSBzdGFuZGFyZC5cbiAqXG4gKiBAcGFyYW0ge3R5cGVvZiBYaW1wb3J0KCdwZXJmX2hvb2tzJykucGVyZm9ybWFuY2Uubm93fSBjdXJyZW50VGltZU1pbGxpc2VjXG4gKiBAcmV0dXJucyB7PFQ+KGZuOiAoKSA9PiBQcm9taXNlPFQ+KSA9PiBQcm9taXNlPHsgcmVzdWx0OiBULCBkdXJhdGlvbjogbnVtYmVyIH0+fVxuICovJGjigI1fb25jZS5kZWVwbHlGdWxmaWxsZWRPYmplY3QoZGVlcGx5RnVsZmlsbGVkT2JqZWN0KTtcbmNvbnN0ICAgICAgICBtYWtlTWVhc3VyZVNlY29uZHM9KGN1cnJlbnRUaW1lTWlsbGlzZWMpPT57XG4vKiogQHBhcmFtIHsoKSA9PiBhbnl9IGZuICovXG5jb25zdCBtZWFzdXJlU2Vjb25kcz1hc3luYyhmbik9PntcbmNvbnN0IHQwPWN1cnJlbnRUaW1lTWlsbGlzZWMoKTtcbmNvbnN0IHJlc3VsdD1hd2FpdCBmbigpO1xuY29uc3QgZHVyYXRpb25NaWxsaXNlYz1jdXJyZW50VGltZU1pbGxpc2VjKCktdDA7XG5yZXR1cm57cmVzdWx0LGR1cmF0aW9uOmR1cmF0aW9uTWlsbGlzZWMvMTAwMH07XG4gfTtcbnJldHVybiBtZWFzdXJlU2Vjb25kcztcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7RXJyb3JbXX0gZXJyb3JzXG4gKiBAcGFyYW0ge3N0cmluZ30gW21lc3NhZ2VdXG4gKi8kaOKAjV9vbmNlLm1ha2VNZWFzdXJlU2Vjb25kcyhtYWtlTWVhc3VyZVNlY29uZHMpO1xuY29uc3QgICAgICAgIG1ha2VBZ2dyZWdhdGVFcnJvcj0oZXJyb3JzLG1lc3NhZ2UpPT57XG5jb25zdCBlcnI9RXJyb3IobWVzc2FnZSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydGllcyhlcnIse1xubmFtZTp7XG52YWx1ZTonQWdncmVnYXRlRXJyb3InfSxcblxuZXJyb3JzOntcbnZhbHVlOmVycm9yc319KTtcblxuXG5yZXR1cm4gZXJyO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7cmVhZG9ubHkgKFQgfCBQcm9taXNlTGlrZTxUPilbXX0gaXRlbXNcbiAqIEByZXR1cm5zIHtQcm9taXNlPFRbXT59XG4gKi8kaOKAjV9vbmNlLm1ha2VBZ2dyZWdhdGVFcnJvcihtYWtlQWdncmVnYXRlRXJyb3IpO1xuY29uc3QgICAgICAgIFByb21pc2VBbGxPckVycm9ycz1hc3luYyhpdGVtcyk9PntcbnJldHVybiBQcm9taXNlLmFsbFNldHRsZWQoaXRlbXMpLnRoZW4oKHJlc3VsdHMpPT57XG5jb25zdCBlcnJvcnM9LyoqIEB0eXBlIHtQcm9taXNlUmVqZWN0ZWRSZXN1bHRbXX0gKi9cbnJlc3VsdHMuZmlsdGVyKCh7c3RhdHVzfSk9PnN0YXR1cz09PSdyZWplY3RlZCcpLlxubWFwKChyZXN1bHQpPT5yZXN1bHQucmVhc29uKTtcbmlmKCFlcnJvcnMubGVuZ3RoKXtcbnJldHVybiAoLyoqIEB0eXBlIHtQcm9taXNlRnVsZmlsbGVkUmVzdWx0PFQ+W119ICovcmVzdWx0cy5tYXAoXG4ocmVzdWx0KT0+cmVzdWx0LnZhbHVlKSk7XG5cbiB9ZWxzZSBpZihlcnJvcnMubGVuZ3RoPT09MSl7XG50aHJvdyBlcnJvcnNbMF07XG4gfWVsc2V7XG50aHJvdyBtYWtlQWdncmVnYXRlRXJyb3IoZXJyb3JzKTtcbiB9XG4gfSk7XG4gfTtcblxuLyoqXG4gKiBAdHlwZSB7PFQ+KFxuICogICB0cmllcjogKCkgPT4gUHJvbWlzZTxUPixcbiAqICBmaW5hbGl6ZXI6IChlcnJvcj86IHVua25vd24pID0+IFByb21pc2U8dm9pZD4sXG4gKiApID0+IFByb21pc2U8VD59XG4gKi8kaOKAjV9vbmNlLlByb21pc2VBbGxPckVycm9ycyhQcm9taXNlQWxsT3JFcnJvcnMpO2NvbnN0IGFnZ3JlZ2F0ZVRyeUZpbmFsbHk9YXN5bmModHJpZXIsZmluYWxpemVyKT0+XG50cmllcigpLnRoZW4oXG5hc3luYyhyZXN1bHQpPT5maW5hbGl6ZXIoKS50aGVuKCgpPT5yZXN1bHQpLFxuYXN5bmModHJ5RXJyb3IpPT5cbmZpbmFsaXplcih0cnlFcnJvcikuXG50aGVuKFxuKCk9PnRyeUVycm9yLFxuKGZpbmFsaXplRXJyb3IpPT5tYWtlQWdncmVnYXRlRXJyb3IoW3RyeUVycm9yLGZpbmFsaXplRXJyb3JdKSkuXG5cbnRoZW4oKGVycm9yKT0+UHJvbWlzZS5yZWplY3QoZXJyb3IpKSk7XG5cblxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBUXG4gKiBAdHlwZWRlZiB7e1tQIGluIGtleW9mIFRdOiBFeGNsdWRlPFRbUF0sIHVuZGVmaW5lZD47fX0gQWxsRGVmaW5lZFxuICovXG5cbi8qKlxuICogQ29uY2lzZSB3YXkgdG8gY2hlY2sgdmFsdWVzIGFyZSBhdmFpbGFibGUgZnJvbSBvYmplY3QgbGl0ZXJhbCBzaG9ydGhhbmQuXG4gKiBUaHJvd3MgZXJyb3IgbWVzc2FnZSB0byBzcGVjaWZ5IHRoZSBtaXNzaW5nIHZhbHVlcy5cbiAqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIHVua25vd24+fSBUXG4gKiBAcGFyYW0ge1R9IG9ialxuICogQHRocm93cyBpZiBhbnkgdmFsdWUgaW4gdGhlIG9iamVjdCBlbnRyaWVzIGlzIG5vdCBkZWZpbmVkXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBvYmogaXMgQWxsRGVmaW5lZDxUPn1cbiAqLyRo4oCNX29uY2UuYWdncmVnYXRlVHJ5RmluYWxseShhZ2dyZWdhdGVUcnlGaW5hbGx5KTtcblxuY29uc3QgICAgICAgIGFzc2VydEFsbERlZmluZWQ9KG9iaik9PntcbmNvbnN0IG1pc3Npbmc9W107XG5mb3IoY29uc3Rba2V5LHZhbF1vZiBPYmplY3QuZW50cmllcyhvYmopKXtcbmlmKHZhbD09PXVuZGVmaW5lZCl7XG5taXNzaW5nLnB1c2goa2V5KTtcbiB9XG4gfVxuaWYobWlzc2luZy5sZW5ndGg+MCl7XG5GYWlsIGBtaXNzaW5nICR7cShtaXNzaW5nKX1gO1xuIH1cbiB9O1xuXG4vKiogQHR5cGUge0l0ZXJhdG9yUmVzdWx0PHVuZGVmaW5lZCwgbmV2ZXI+fSAqLyRo4oCNX29uY2UuYXNzZXJ0QWxsRGVmaW5lZChhc3NlcnRBbGxEZWZpbmVkKTtcbmNvbnN0IG5vdERvbmU9aGFyZGVuKHtkb25lOmZhbHNlLHZhbHVlOnVuZGVmaW5lZH0pO1xuXG4vKiogQHR5cGUge0l0ZXJhdG9yUmVzdWx0PG5ldmVyLCB2b2lkPn0gKi9cbmNvbnN0IGFsd2F5c0RvbmU9aGFyZGVuKHtkb25lOnRydWUsdmFsdWU6dW5kZWZpbmVkfSk7XG5cbmNvbnN0ICAgICAgICBmb3JldmVyPWFzeW5jR2VuZXJhdGUoKCk9Pm5vdERvbmUpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0geygpID0+IFR9IHByb2R1Y2VcbiAqIFRoZSB2YWx1ZSBvZiBgYXdhaXQgcHJvZHVjZSgpYCBpcyB1c2VkIGZvciBpdHMgdHJ1dGhpbmVzcyB2cyBmYWxzaW5lc3MuXG4gKiBJT1csIGl0IGlzIGNvZXJjZWQgdG8gYSBib29sZWFuIHNvIHRoZSBjYWxsZXIgbmVlZCBub3QgYm90aGVyIGRvaW5nIHRoaXNcbiAqIHRoZW1zZWx2ZXMuXG4gKiBAcmV0dXJucyB7QXN5bmNJdGVyYWJsZTxBd2FpdGVkPFQ+Pn1cbiAqLyRo4oCNX29uY2UuZm9yZXZlcihmb3JldmVyKTtcbmNvbnN0ICAgICAgICB3aGlsZVRydWU9KHByb2R1Y2UpPT5cbmFzeW5jR2VuZXJhdGUoYXN5bmMoKT0+e1xuY29uc3QgdmFsdWU9YXdhaXQgcHJvZHVjZSgpO1xuaWYoIXZhbHVlKXtcbnJldHVybiBhbHdheXNEb25lO1xuIH1cbnJldHVybiBoYXJkZW4oe1xuZG9uZTpmYWxzZSxcbnZhbHVlfSk7XG5cbiB9KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHsoKSA9PiBUfSBwcm9kdWNlXG4gKiBUaGUgdmFsdWUgb2YgYGF3YWl0IHByb2R1Y2UoKWAgaXMgdXNlZCBmb3IgaXRzIHRydXRoaW5lc3MgdnMgZmFsc2luZXNzLlxuICogSU9XLCBpdCBpcyBjb2VyY2VkIHRvIGEgYm9vbGVhbiBzbyB0aGUgY2FsbGVyIG5lZWQgbm90IGJvdGhlciBkb2luZyB0aGlzXG4gKiB0aGVtc2VsdmVzLlxuICogQHJldHVybnMge0FzeW5jSXRlcmFibGU8QXdhaXRlZDxUPj59XG4gKi8kaOKAjV9vbmNlLndoaWxlVHJ1ZSh3aGlsZVRydWUpO1xuY29uc3QgICAgICAgIHVudGlsVHJ1ZT0ocHJvZHVjZSk9PlxuYXN5bmNHZW5lcmF0ZShhc3luYygpPT57XG5jb25zdCB2YWx1ZT1hd2FpdCBwcm9kdWNlKCk7XG5pZih2YWx1ZSl7XG5yZXR1cm4gaGFyZGVuKHtcbmRvbmU6dHJ1ZSxcbnZhbHVlfSk7XG5cbiB9XG5yZXR1cm4gaGFyZGVuKHtcbmRvbmU6ZmFsc2UsXG52YWx1ZX0pO1xuXG4gfSk7XG5cbi8qKiBAdHlwZSB7IDxYLCBZPih4czogWFtdLCB5czogWVtdKSA9PiBbWCwgWV1bXX0gKi8kaOKAjV9vbmNlLnVudGlsVHJ1ZSh1bnRpbFRydWUpO1xuY29uc3QgICAgICAgIHppcD0oeHMseXMpPT5oYXJkZW4oeHMubWFwKCh4LGkpPT5beCx5c1sraV1dKSk7XG5cbi8qKiBAdHlwZSB7IDxUIGV4dGVuZHMgUmVjb3JkPHN0cmluZywgRVJlZjxhbnk+Pj4ob2JqOiBUKSA9PiBQcm9taXNlPHsgW0sgaW4ga2V5b2YgVF06IEF3YWl0ZWQ8VFtLXT59PiB9ICovJGjigI1fb25jZS56aXAoemlwKTtcbmNvbnN0ICAgICAgICBhbGxWYWx1ZXM9YXN5bmMob2JqKT0+e1xuY29uc3QgcmVzb2x2ZWQ9YXdhaXQgUHJvbWlzZS5hbGwodmFsdWVzKG9iaikpO1xuLyogQHRzLWV4cGVjdC1lcnJvciBjYXN0Ki9cbnJldHVybiBoYXJkZW4oZnJvbUVudHJpZXMoemlwKGtleXMob2JqKSxyZXNvbHZlZCkpKTtcbiB9OyRo4oCNX29uY2UuYWxsVmFsdWVzKGFsbFZhbHVlcyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQkFTSVNfUE9JTlRTIjpbIkJBU0lTX1BPSU5UUyJdLCJmcm9tVW5pcXVlRW50cmllcyI6WyJmcm9tVW5pcXVlRW50cmllcyJdLCJvYmplY3RNYXAiOlsib2JqZWN0TWFwIl0sImxpc3REaWZmZXJlbmNlIjpbImxpc3REaWZmZXJlbmNlIl0sInRocm93TGFiZWxlZCI6WyJ0aHJvd0xhYmVsZWQiXSwiYXBwbHlMYWJlbGluZ0Vycm9yIjpbImFwcGx5TGFiZWxpbmdFcnJvciJdLCJkZWVwbHlGdWxmaWxsZWRPYmplY3QiOlsiZGVlcGx5RnVsZmlsbGVkT2JqZWN0Il0sIm1ha2VNZWFzdXJlU2Vjb25kcyI6WyJtYWtlTWVhc3VyZVNlY29uZHMiXSwibWFrZUFnZ3JlZ2F0ZUVycm9yIjpbIm1ha2VBZ2dyZWdhdGVFcnJvciJdLCJQcm9taXNlQWxsT3JFcnJvcnMiOlsiUHJvbWlzZUFsbE9yRXJyb3JzIl0sImFnZ3JlZ2F0ZVRyeUZpbmFsbHkiOlsiYWdncmVnYXRlVHJ5RmluYWxseSJdLCJhc3NlcnRBbGxEZWZpbmVkIjpbImFzc2VydEFsbERlZmluZWQiXSwiZm9yZXZlciI6WyJmb3JldmVyIl0sIndoaWxlVHJ1ZSI6WyJ3aGlsZVRydWUiXSwidW50aWxUcnVlIjpbInVudGlsVHJ1ZSJdLCJ6aXAiOlsiemlwIl0sImFsbFZhbHVlcyI6WyJhbGxWYWx1ZXMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAXc3uDlcBAABXAQAAIwAAAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL2V4cG9ydGVkLmpzeyJpbXBvcnRzIjpbIi4vc3JjL3R5cGVzLWFtYmllbnQuanMiXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9zcmMvdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAiMhonL0SAAC9EgAAMwAAAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc3siaW1wb3J0cyI6WyIuL3N1YnNjcmliZS5qcyIsIi4vdHlwZXMtYW1iaWVudC5qcyIsIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIiwib2JzZXJ2ZUl0ZXJhdGlvbiIsIm9ic2VydmVJdGVyYXRvciIsIm9ic2VydmVOb3RpZmllciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLHN1YnNjcmliZUxhdGVzdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiLi9zdWJzY3JpYmUuanNcIiwgW1tcInN1YnNjcmliZUxhdGVzdFwiLCBbJGjigI1fYSA9PiAoc3Vic2NyaWJlTGF0ZXN0ID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZXMtYW1iaWVudC5qc1wiLCBbXV1dKTsgICBcblxuXG5cblxuXG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIGBzdWJzY3JpYmVMYXRlc3RgIGZyb20gYEBhZ29yaWMvbm90aWZpZXIvc3Vic2NyaWJlLmpzYCBpbnN0ZWFkLlxuICpcbiAqIEFkYXB0b3IgZnJvbSBhIG5vdGlmaWVyUCB0byBhbiBhc3luYyBpdGVyYWJsZS5cbiAqIFRoZSBub3RpZmllclAgY2FuIGJlIGFueSBvYmplY3QgdGhhdCBoYXMgYW4gZXZlbnR1YWxseSBpbnZvY2FibGVcbiAqIGBnZXRVcGRhdGVTaW5jZWAgbWV0aG9kIHRoYXQgYmVoYXZlcyBhY2NvcmRpbmcgdG8gdGhlIG5vdGlmaWVyXG4gKiBzcGVjLiBUaGlzIGNhbiBiZSBhIG5vdGlmaWVyLCBhIHByb21pc2UgZm9yIGEgbG9jYWwgb3IgcmVtb3RlXG4gKiBub3RpZmllciwgb3IgYSBwcmVzZW5jZSBvZiBhIHJlbW90ZSBub3RpZmllci5cbiAqXG4gKiBJdCBpcyBhbHNvIHVzZWQgaW50ZXJuYWxseSBieSBub3RpZmllci5qcyBzbyB0aGF0IGEgbm90aWZpZXIgaXRzZWxmIGlzIGFuXG4gKiBhc3luYyBpdGVyYWJsZS5cbiAqXG4gKiBBbiBhc3luYyBpdGVyYWJsZSBpcyBhbiBvYmplY3Qgd2l0aCBhIGBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdKClgIG1ldGhvZFxuICogdGhhdCByZXR1cm5zIGFuIGFzeW5jIGl0ZXJhdG9yLiBUaGUgYXN5bmMgaXRlcmF0b3Igd2UgcmV0dXJuIGhlcmUgaGFzIG9ubHlcbiAqIGEgYG5leHQoKWAgbWV0aG9kLCB3aXRob3V0IHRoZSBvcHRpb25hbCBgcmV0dXJuYCBhbmQgYHRocm93YCBtZXRob2RzLiBUaGVcbiAqIG9taXR0ZWQgbWV0aG9kcywgaWYgcHJlc2VudCwgd291bGQgYmUgdXNlZCBieSB0aGUgZm9yL2F3YWl0L29mIGxvb3AgdG9cbiAqIGluZm9ybSB0aGUgaXRlcmF0b3Igb2YgZWFybHkgdGVybWluYXRpb24uIEJ1dCB0aGlzIGFkYXB0b3Igd291bGQgbm90IGRvXG4gKiBhbnl0aGluZyB1c2VmdWwgaW4gcmVhY3Rpb24gdG8gdGhpcyBub3RpZmljYXRpb24uXG4gKlxuICogQW4gYXN5bmMgaXRlcmF0b3IncyBgbmV4dCgpYCBtZXRob2QgcmV0dXJucyBhIHByb21pc2UgZm9yIGFuIGl0ZXJhdGlvblxuICogcmVzdWx0LiBBbiBpdGVyYXRpb24gcmVzdWx0IGlzIGEgcmVjb3JkIHdpdGggYHZhbHVlYCBhbmQgYGRvbmVgIHByb3BlcnRpZXMuXG4gKlxuICogVGhlIHB1cnBvc2Ugb2YgYnVpbGRpbmcgb24gdGhlIG5vdGlmaWVyIHByb3RvY29sIGlzIHRvIGhhdmUgYSBsb3NzeVxuICogYWRhcHRvciwgd2hlcmUgaW50ZXJtZWRpYXRlIHJlc3VsdHMgY2FuIGJlIG1pc3NlZCBpbiBmYXZvciBvZiBtb3JlIHJlY2VudFxuICogcmVzdWx0cyB3aGljaCBhcmUgdGhlcmVmb3JlIGxlc3Mgc3RhbGUuIFNlZVxuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9kb2N1bWVudGF0aW9uL2Jsb2IvSEVBRC9tYWluL2d1aWRlcy9qcy1wcm9ncmFtbWluZy9ub3RpZmllcnMubWRcbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEJhc2VOb3RpZmllcjxUPj59IG5vdGlmaWVyUFxuICogQHJldHVybnMge0ZvcmthYmxlQXN5bmNJdGVyYWJsZTxUPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyPXN1YnNjcmliZUxhdGVzdDtcblxuLyoqXG4gKiBUaGlzIGFkdmFuY2VzIGBhc3luY0l0ZXJhdG9yUGAgdXBkYXRpbmcgYGl0ZXJhdGlvbk9ic2VydmVyYCB3aXRoIGVhY2hcbiAqIHN1Y2Nlc3NpdmUgdmFsdWUuIFRoZSBgaXRlcmF0aW9uT2JzZXJ2ZXJgIG1heSBvbmx5IGJlIGludGVyZXN0ZWQgaW4gY2VydGFpblxuICogb2NjdXJyZW5jZXMgKGB1cGRhdGVTdGF0ZWAsIGBmaW5pc2hgLCBgZmFpbGApLCBzbyBmb3IgY29udmVuaWVuY2UsXG4gKiBgb2JzZXJ2ZUl0ZXJhdG9yYCBmZWF0dXJlIHRlc3RzIGZvciB0aG9zZSBtZXRob2RzIGJlZm9yZSBjYWxsaW5nIHRoZW0uXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxBc3luY0l0ZXJhdG9yPFQ+Pn0gYXN5bmNJdGVyYXRvclBcbiAqIEBwYXJhbSB7UGFydGlhbDxJdGVyYXRpb25PYnNlcnZlcjxUPj59IGl0ZXJhdGlvbk9ic2VydmVyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx1bmRlZmluZWQ+fVxuICovJGjigI1fb25jZS5tYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllcihtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllcik7XG5jb25zdCAgICAgICAgb2JzZXJ2ZUl0ZXJhdG9yPShhc3luY0l0ZXJhdG9yUCxpdGVyYXRpb25PYnNlcnZlcik9PntcbnJldHVybiBuZXcgUHJvbWlzZSgoYWNrLG9ic2VydmVyRXJyb3IpPT57XG5jb25zdCByZWN1cj0oKT0+e1xuRS53aGVuKFxuRShhc3luY0l0ZXJhdG9yUCkubmV4dCgpLFxuKHt2YWx1ZSxkb25lfSk9PntcbmlmKGRvbmUpe1xuaXRlcmF0aW9uT2JzZXJ2ZXIuZmluaXNoJiZpdGVyYXRpb25PYnNlcnZlci5maW5pc2godmFsdWUpO1xuYWNrKHVuZGVmaW5lZCk7XG4gfWVsc2V7XG5pdGVyYXRpb25PYnNlcnZlci51cGRhdGVTdGF0ZSYmXG5pdGVyYXRpb25PYnNlcnZlci51cGRhdGVTdGF0ZSh2YWx1ZSk7XG5yZWN1cigpO1xuIH1cbiB9LFxuKHJlYXNvbik9Pntcbml0ZXJhdGlvbk9ic2VydmVyLmZhaWwmJml0ZXJhdGlvbk9ic2VydmVyLmZhaWwocmVhc29uKTtcbmFjayh1bmRlZmluZWQpO1xuIH0pLlxuY2F0Y2gob2JzZXJ2ZXJFcnJvcik7XG4gfTtcbnJlY3VyKCk7XG4gfSk7XG4gfTtcblxuLyoqXG4gKiBUaGlzIHJlYWRzIGZyb20gYGFzeW5jSXRlcmFibGVQYCB1cGRhdGluZyBgaXRlcmF0aW9uT2JzZXJ2ZXJgIHdpdGggZWFjaFxuICogc3VjY2Vzc2l2ZSB2YWx1ZS4gVGhlIGBpdGVyYXRpb25PYnNlcnZlcmAgbWF5IG9ubHkgYmUgaW50ZXJlc3RlZCBpbiBjZXJ0YWluXG4gKiBvY2N1cnJlbmNlcyAoYHVwZGF0ZVN0YXRlYCwgYGZpbmlzaGAsIGBmYWlsYCksIHNvIGZvciBjb252ZW5pZW5jZSxcbiAqIGBvYnNlcnZlSXRlcmF0aW9uYCBmZWF0dXJlIHRlc3RzIGZvciB0aG9zZSBtZXRob2RzIGJlZm9yZSBjYWxsaW5nIHRoZW0uXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxBc3luY0l0ZXJhYmxlPFQ+Pn0gYXN5bmNJdGVyYWJsZVBcbiAqIEBwYXJhbSB7UGFydGlhbDxJdGVyYXRpb25PYnNlcnZlcjxUPj59IGl0ZXJhdGlvbk9ic2VydmVyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx1bmRlZmluZWQ+fVxuICovJGjigI1fb25jZS5vYnNlcnZlSXRlcmF0b3Iob2JzZXJ2ZUl0ZXJhdG9yKTtcbmNvbnN0ICAgICAgICBvYnNlcnZlSXRlcmF0aW9uPShhc3luY0l0ZXJhYmxlUCxpdGVyYXRpb25PYnNlcnZlcik9PntcbmNvbnN0IGl0ZXJhdG9yUD1FKGFzeW5jSXRlcmFibGVQKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcbnJldHVybiBvYnNlcnZlSXRlcmF0b3IoaXRlcmF0b3JQLGl0ZXJhdGlvbk9ic2VydmVyKTtcbiB9O1xuXG4vKipcbiAqIEFzIHVwZGF0ZXMgY29tZSBpbiBmcm9tIHRoZSBwb3NzaWJseSByZW1vdGUgYG5vdGlmaWVyUGAsIHVwZGF0ZVxuICogdGhlIGxvY2FsIGB1cGRhdGVyYC4gU2luY2UgdGhlIHVwZGF0ZXMgY29tZSBmcm9tIGEgbm90aWZpZXIsIHRoZXlcbiAqIGFyZSBsb3NzeSwgaS5lLiwgb25jZSBhIG1vcmUgcmVjZW50IHN0YXRlIGNhbiBiZSByZXBvcnRlZCwgbGVzcyByZWNlbnRcbiAqIHN0YXRlcyBhcmUgYXNzdW1lZCBpcnJlbGV2YW50IGFuZCBkcm9wcGVkLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8Tm90aWZpZXI8VD4+fSBub3RpZmllclBcbiAqIEBwYXJhbSB7UGFydGlhbDxJdGVyYXRpb25PYnNlcnZlcjxUPj59IGl0ZXJhdGlvbk9ic2VydmVyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx1bmRlZmluZWQ+fVxuICovJGjigI1fb25jZS5vYnNlcnZlSXRlcmF0aW9uKG9ic2VydmVJdGVyYXRpb24pO1xuY29uc3QgICAgICAgIG9ic2VydmVOb3RpZmllcj0obm90aWZpZXJQLGl0ZXJhdGlvbk9ic2VydmVyKT0+XG5vYnNlcnZlSXRlcmF0aW9uKHN1YnNjcmliZUxhdGVzdChub3RpZmllclApLGl0ZXJhdGlvbk9ic2VydmVyKTskaOKAjV9vbmNlLm9ic2VydmVOb3RpZmllcihvYnNlcnZlTm90aWZpZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIjpbIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyIl0sIm9ic2VydmVJdGVyYXRvciI6WyJvYnNlcnZlSXRlcmF0b3IiXSwib2JzZXJ2ZUl0ZXJhdGlvbiI6WyJvYnNlcnZlSXRlcmF0aW9uIl0sIm9ic2VydmVOb3RpZmllciI6WyJvYnNlcnZlTm90aWZpZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA0DcnZLMKAACzCgAAJAAAAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzIiwiLi9ub3RpZmllci5qcyIsIi4vcHVibGlzaC1raXQuanMiLCIuL3N0b3JlZC1ub3RpZmllci5qcyIsIi4vc3RvcmVkLXRvcGljLmpzIiwiLi9zdG9yZXN1Yi5qcyIsIi4vc3Vic2NyaWJlLmpzIiwiLi9zdWJzY3JpYmVyLmpzIl0sImV4cG9ydHMiOlsiU3Vic2NyaWJlclNoYXBlIiwibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiLCJtYWtlTm90aWZpZXIiLCJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSIsIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyIiwibWFrZU5vdGlmaWVyS2l0IiwibWFrZVB1Ymxpc2hLaXQiLCJtYWtlU3Vic2NyaXB0aW9uIiwibWFrZVN1YnNjcmlwdGlvbktpdCIsIm9ic2VydmVJdGVyYXRpb24iLCJvYnNlcnZlSXRlcmF0b3IiLCJvYnNlcnZlTm90aWZpZXIiLCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQiLCJzdWJzY3JpYmVFYWNoIiwic3Vic2NyaWJlTGF0ZXN0Il0sInJlZXhwb3J0cyI6WyIuL3N0b3JlZC1ub3RpZmllci5qcyIsIi4vc3RvcmVkLXRvcGljLmpzIiwiLi9zdG9yZXN1Yi5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vcHVibGlzaC1raXQuanNcIiwgW1tcIm1ha2VQdWJsaXNoS2l0XCIsIFskaOKAjV9saXZlW1wibWFrZVB1Ymxpc2hLaXRcIl1dXSxbXCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXRcIiwgWyRo4oCNX2xpdmVbXCJwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXRcIl1dXSxbXCJTdWJzY3JpYmVyU2hhcGVcIiwgWyRo4oCNX2xpdmVbXCJTdWJzY3JpYmVyU2hhcGVcIl1dXV1dLFtcIi4vc3Vic2NyaWJlLmpzXCIsIFtbXCJzdWJzY3JpYmVFYWNoXCIsIFskaOKAjV9saXZlW1wic3Vic2NyaWJlRWFjaFwiXV1dLFtcInN1YnNjcmliZUxhdGVzdFwiLCBbJGjigI1fbGl2ZVtcInN1YnNjcmliZUxhdGVzdFwiXV1dXV0sW1wiLi9ub3RpZmllci5qc1wiLCBbW1wibWFrZU5vdGlmaWVyXCIsIFskaOKAjV9saXZlW1wibWFrZU5vdGlmaWVyXCJdXV0sW1wibWFrZU5vdGlmaWVyS2l0XCIsIFskaOKAjV9saXZlW1wibWFrZU5vdGlmaWVyS2l0XCJdXV0sW1wibWFrZU5vdGlmaWVyRnJvbUFzeW5jSXRlcmFibGVcIiwgWyRo4oCNX2xpdmVbXCJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZVwiXV1dLFtcIm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyXCIsIFskaOKAjV9saXZlW1wibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXJcIl1dXV1dLFtcIi4vc3Vic2NyaWJlci5qc1wiLCBbW1wibWFrZVN1YnNjcmlwdGlvblwiLCBbJGjigI1fbGl2ZVtcIm1ha2VTdWJzY3JpcHRpb25cIl1dXSxbXCJtYWtlU3Vic2NyaXB0aW9uS2l0XCIsIFskaOKAjV9saXZlW1wibWFrZVN1YnNjcmlwdGlvbktpdFwiXV1dXV0sW1wiLi9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc1wiLCBbW1wib2JzZXJ2ZU5vdGlmaWVyXCIsIFskaOKAjV9saXZlW1wib2JzZXJ2ZU5vdGlmaWVyXCJdXV0sW1wib2JzZXJ2ZUl0ZXJhdG9yXCIsIFskaOKAjV9saXZlW1wib2JzZXJ2ZUl0ZXJhdG9yXCJdXV0sW1wib2JzZXJ2ZUl0ZXJhdGlvblwiLCBbJGjigI1fbGl2ZVtcIm9ic2VydmVJdGVyYXRpb25cIl1dXSxbXCJtYWtlQXN5bmNJdGVyYWJsZUZyb21Ob3RpZmllclwiLCBbJGjigI1fbGl2ZVtcIm1ha2VBc3luY0l0ZXJhYmxlRnJvbU5vdGlmaWVyXCJdXV1dXSxbXCIuL3N0b3Jlc3ViLmpzXCIsIFtdXSxbXCIuL3N0b3JlZC1ub3RpZmllci5qc1wiLCBbXV0sW1wiLi9zdG9yZWQtdG9waWMuanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnsibWFrZVB1Ymxpc2hLaXQiOlsibWFrZVB1Ymxpc2hLaXQiLGZhbHNlXSwicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0IjpbInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCIsZmFsc2VdLCJTdWJzY3JpYmVyU2hhcGUiOlsiU3Vic2NyaWJlclNoYXBlIixmYWxzZV0sInN1YnNjcmliZUVhY2giOlsic3Vic2NyaWJlRWFjaCIsZmFsc2VdLCJzdWJzY3JpYmVMYXRlc3QiOlsic3Vic2NyaWJlTGF0ZXN0IixmYWxzZV0sIm1ha2VOb3RpZmllciI6WyJtYWtlTm90aWZpZXIiLGZhbHNlXSwibWFrZU5vdGlmaWVyS2l0IjpbIm1ha2VOb3RpZmllcktpdCIsZmFsc2VdLCJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSI6WyJtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSIsZmFsc2VdLCJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciI6WyJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciIsZmFsc2VdLCJtYWtlU3Vic2NyaXB0aW9uIjpbIm1ha2VTdWJzY3JpcHRpb24iLGZhbHNlXSwibWFrZVN1YnNjcmlwdGlvbktpdCI6WyJtYWtlU3Vic2NyaXB0aW9uS2l0IixmYWxzZV0sIm9ic2VydmVOb3RpZmllciI6WyJvYnNlcnZlTm90aWZpZXIiLGZhbHNlXSwib2JzZXJ2ZUl0ZXJhdG9yIjpbIm9ic2VydmVJdGVyYXRvciIsZmFsc2VdLCJvYnNlcnZlSXRlcmF0aW9uIjpbIm9ic2VydmVJdGVyYXRpb24iLGZhbHNlXSwibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiOlsibWFrZUFzeW5jSXRlcmFibGVGcm9tTm90aWZpZXIiLGZhbHNlXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAOpoockkYAABJGAAAJwAAAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9ub3RpZmllci5qc3siaW1wb3J0cyI6WyIuL3B1Ymxpc2gta2l0LmpzIiwiLi9zdWJzY3JpYmUuanMiLCIuL3R5cGVzLWFtYmllbnQuanMiLCJAYWdvcmljL2Fzc2VydCIsIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbIm1ha2VOb3RpZmllciIsIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIiwibWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXIiLCJtYWtlTm90aWZpZXJLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0LEUsRmFyLG1ha2VQdWJsaXNoS2l0LHN1YnNjcmliZUxhdGVzdDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2Fzc2VydFwiLCBbW1wiYXNzZXJ0XCIsIFskaOKAjV9hID0+IChhc3NlcnQgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXSxbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVzLWFtYmllbnQuanNcIiwgW11dLFtcIi4vcHVibGlzaC1raXQuanNcIiwgW1tcIm1ha2VQdWJsaXNoS2l0XCIsIFskaOKAjV9hID0+IChtYWtlUHVibGlzaEtpdCA9ICRo4oCNX2EpXV1dXSxbXCIuL3N1YnNjcmliZS5qc1wiLCBbW1wic3Vic2NyaWJlTGF0ZXN0XCIsIFskaOKAjV9hID0+IChzdWJzY3JpYmVMYXRlc3QgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8TGF0ZXN0VG9waWM8VD4+fSBzaGFyYWJsZUludGVybmFsc1BcbiAqIEByZXR1cm5zIHtOb3RpZmllcjxUPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VOb3RpZmllcj0oc2hhcmFibGVJbnRlcm5hbHNQKT0+e1xuLyoqIEB0eXBlIHtOb3RpZmllcjxUPn0gKi9cbmNvbnN0IG5vdGlmaWVyPUZhcignbm90aWZpZXInLHtcbi4uLnN1YnNjcmliZUxhdGVzdChzaGFyYWJsZUludGVybmFsc1ApLFxuZ2V0VXBkYXRlU2luY2U6YXN5bmModXBkYXRlQ291bnQpPT5cbkUoc2hhcmFibGVJbnRlcm5hbHNQKS5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCksXG5cbi8qKlxuICogVXNlIHRoaXMgdG8gZGlzdHJpYnV0ZSBhIE5vdGlmaWVyIGVmZmljaWVudGx5IG92ZXIgdGhlIG5ldHdvcmssXG4gKiBieSBvYnRhaW5pbmcgdGhpcyBmcm9tIHRoZSBOb3RpZmllciB0byBiZSByZXBsaWNhdGVkLCBhbmQgYXBwbHlpbmdcbiAqIGBtYWtlTm90aWZpZXJgIHRvIGl0IGF0IHRoZSBuZXcgc2l0ZSB0byBnZXQgYW4gZXF1aXZhbGVudCBsb2NhbFxuICogTm90aWZpZXIgYXQgdGhhdCBzaXRlLlxuICovXG5nZXRTaGFyYWJsZU5vdGlmaWVySW50ZXJuYWxzOmFzeW5jKCk9PnNoYXJhYmxlSW50ZXJuYWxzUCxcbi8qKlxuICogQGRlcHJlY2F0ZWRcbiAqIFVzZWQgb25seSBieSBgbWFrZUNhc3RpbmdTcGVjRnJvbVJlZmAuICBJbnN0ZWFkIHRoYXQgZnVuY3Rpb24gc2hvdWxkIHVzZVxuICogdGhlIGBTdG9yZWRGYWNldGAgQVBJLlxuICovXG5nZXRTdG9yZUtleTooKT0+aGFyZGVuKHtub3RpZmllcn0pfSk7XG5cbnJldHVybiBub3RpZmllcjtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8U3Vic2NyaWJlcjxUPj59IHN1YnNjcmliZXJcbiAqIEByZXR1cm5zIHtOb3RpZmllcjxUPn1cbiAqLyRo4oCNX29uY2UubWFrZU5vdGlmaWVyKG1ha2VOb3RpZmllcik7XG5jb25zdCAgICAgICAgbWFrZU5vdGlmaWVyRnJvbVN1YnNjcmliZXI9KHN1YnNjcmliZXIpPT57XG4vKipcbiAqIEB0eXBlIHtMYXRlc3RUb3BpYzxUPn1cbiAqL1xuY29uc3QgYmFzZU5vdGlmaWVyPWhhcmRlbih7XG5nZXRVcGRhdGVTaW5jZToodXBkYXRlQ291bnQ9dW5kZWZpbmVkKT0+XG5FKHN1YnNjcmliZXIpLmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50KX0pO1xuXG5cbi8qKiBAdHlwZSB7Tm90aWZpZXI8VD59ICovXG5jb25zdCBub3RpZmllcj1GYXIoJ25vdGlmaWVyJyx7XG4uLi5tYWtlTm90aWZpZXIoYmFzZU5vdGlmaWVyKSxcbi4uLmJhc2VOb3RpZmllcn0pO1xuXG5yZXR1cm4gbm90aWZpZXI7XG4gfTskaOKAjV9vbmNlLm1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyKG1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyKTtcbmhhcmRlbihtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlcik7XG5cbi8qKlxuICogUHJvZHVjZXMgYSBwYWlyIG9mIG9iamVjdHMsIHdoaWNoIGFsbG93IGEgc2VydmljZSB0byBwcm9kdWNlIGEgc3RyZWFtIG9mXG4gKiB1cGRhdGUgcHJvbWlzZXMuXG4gKlxuICogVGhlIGluaXRpYWwgc3RhdGUgYXJndW1lbnQgaGFzIHRvIGJlIHRydWx5IG9wdGlvbmFsIGV2ZW4gdGhvdWdoIGl0IGNhblxuICogYmUgYW55IGZpcnN0IGNsYXNzIHZhbHVlIGluY2x1ZGluZyBgdW5kZWZpbmVkYC4gV2UgbmVlZCB0byBkaXN0aW5ndWlzaCB0aGVcbiAqIHByZXNlbmNlIHZzIHRoZSBhYnNlbmNlIG9mIGl0LCB3aGljaCB3ZSBjYW5ub3QgZG8gd2l0aCB0aGUgb3B0aW9uYWwgYXJndW1lbnRcbiAqIHN5bnRheC4gUmF0aGVyIHdlIHVzZSB0aGUgYXJpdHkgb2YgdGhlIGBpbml0aWFsU3RhdGVBcnJgIGFycmF5LlxuICpcbiAqIElmIG5vIGluaXRpYWwgc3RhdGUgaXMgcHJvdmlkZWQgdG8gYG1ha2VOb3RpZmllcktpdGAsIHRoZW4gaXQgc3RhcnRzIHdpdGhvdXRcbiAqIGFuIGluaXRpYWwgc3RhdGUuIEl0cyBpbml0aWFsIHN0YXRlIHdpbGwgaW5zdGVhZCBiZSB0aGUgc3RhdGUgb2YgdGhlIGZpcnN0XG4gKiB1cGRhdGUuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7W10gfCBbVF19IGluaXRpYWxTdGF0ZUFyciB0aGUgZmlyc3Qgc3RhdGUgdG8gYmUgcmV0dXJuZWQgKHR5cGVkIGFzIHJlc3QgYXJyYXkgdG8gcGVybWl0IGB1bmRlZmluZWRgKVxuICogQHJldHVybnMge05vdGlmaWVyUmVjb3JkPFQ+fSB0aGUgbm90aWZpZXIgYW5kIHVwZGF0ZXJcbiAqL1xuY29uc3QgICAgICAgIG1ha2VOb3RpZmllcktpdD0oLi4uaW5pdGlhbFN0YXRlQXJyKT0+e1xuLyoqIEB0eXBlIHtQdWJsaXNoS2l0PFQ+fSAqL1xuY29uc3R7cHVibGlzaGVyLHN1YnNjcmliZXJ9PW1ha2VQdWJsaXNoS2l0KCk7XG5cbmNvbnN0IG5vdGlmaWVyPW1ha2VOb3RpZmllckZyb21TdWJzY3JpYmVyKHN1YnNjcmliZXIpO1xuXG5jb25zdCB1cGRhdGVyPUZhcigndXBkYXRlcicse1xudXBkYXRlU3RhdGU6KHN0YXRlKT0+cHVibGlzaGVyLnB1Ymxpc2goc3RhdGUpLFxuZmluaXNoOihjb21wbGV0aW9uKT0+cHVibGlzaGVyLmZpbmlzaChjb21wbGV0aW9uKSxcbmZhaWw6KHJlYXNvbik9PnB1Ymxpc2hlci5mYWlsKHJlYXNvbil9KTtcblxuXG5hc3NlcnQoaW5pdGlhbFN0YXRlQXJyLmxlbmd0aDw9MSwndG9vIG1hbnkgYXJndW1lbnRzJyk7XG5pZihpbml0aWFsU3RhdGVBcnIubGVuZ3RoPT09MSl7XG51cGRhdGVyLnVwZGF0ZVN0YXRlKGluaXRpYWxTdGF0ZUFyclswXSk7XG4gfVxuXG4vKiBub3RpZmllciBmYWNldCBpcyBzZXBhcmF0ZSBzbyBpdCBjYW4gYmUgaGFuZGVkIG91dCB3aGlsZSB1cGRhdGVyKi9cbi8qIGlzIHRpZ2h0bHkgaGVsZCovXG5yZXR1cm4gaGFyZGVuKHtub3RpZmllcix1cGRhdGVyfSk7XG4gfTtcblxuLyoqXG4gKiBBZGFwdG9yIGZyb20gYXN5bmMgaXRlcmFibGUgdG8gbm90aWZpZXIuXG4gKlxuICogQGRlcHJlY2F0ZWQgVGhlIHJlc3VsdGluZyBub3RpZmllciBpcyBsb3NzbGVzcywgd2hpY2ggaXMgbm90IGRlc2lyYWJsZS5cbiAqIFByZWZlciBtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciwgYW5kIHJlZmVyIHRvXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzU0MTMgYW5kXG4gKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC81Njk1IGZvciBjb250ZXh0LlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8QXN5bmNJdGVyYWJsZTxUPj59IGFzeW5jSXRlcmFibGVQXG4gKiBAcmV0dXJucyB7Tm90aWZpZXI8VD59XG4gKi8kaOKAjV9vbmNlLm1ha2VOb3RpZmllcktpdChtYWtlTm90aWZpZXJLaXQpO1xuY29uc3QgICAgICAgIG1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlPShhc3luY0l0ZXJhYmxlUCk9PntcbmNvbnN0IGl0ZXJhdG9yUD1FKGFzeW5jSXRlcmFibGVQKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcblxuLyoqIEB0eXBlIHtQcm9taXNlPFVwZGF0ZVJlY29yZDxUPj58dW5kZWZpbmVkfSAqL1xubGV0IG9wdE5leHRQcm9taXNlO1xubGV0IGN1cnJlbnRVcGRhdGVDb3VudD0wbjtcbi8qKiBAdHlwZSB7RVJlZjxVcGRhdGVSZWNvcmQ8VD4+fHVuZGVmaW5lZH0gKi9cbmxldCBjdXJyZW50UmVzcG9uc2U7XG5sZXQgZmluYWw9ZmFsc2U7XG5cbi8qKlxuICogQHR5cGUge0xhdGVzdFRvcGljPFQ+fVxuICovXG5jb25zdCBiYXNlTm90aWZpZXI9RmFyKCdiYXNlTm90aWZpZXInLHtcbmdldFVwZGF0ZVNpbmNlKHVwZGF0ZUNvdW50PS0xbil7XG5pZih1cGRhdGVDb3VudDxjdXJyZW50VXBkYXRlQ291bnQpe1xuaWYoY3VycmVudFJlc3BvbnNlKXtcbnJldHVybiBQcm9taXNlLnJlc29sdmUoY3VycmVudFJlc3BvbnNlKTtcbiB9XG4gfWVsc2UgaWYodXBkYXRlQ291bnQhPT1jdXJyZW50VXBkYXRlQ291bnQpe1xudGhyb3cgbmV3IEVycm9yKFxuJ2dldFVwZGF0ZVNpbmNlIGFyZ3VtZW50IG11c3QgYmUgYSBwcmV2aW91c2x5LWlzc3VlZCB1cGRhdGVDb3VudC4nKTtcblxuIH1cblxuLyogUmV0dXJuIGEgZmluYWwgcmVzcG9uc2UgaWYgd2UgaGF2ZSBvbmUsIG90aGVyd2lzZSBhIHByb21pc2UgZm9yIHRoZSBuZXh0IHN0YXRlLiovXG5pZihmaW5hbCl7XG5hc3NlcnQoY3VycmVudFJlc3BvbnNlIT09dW5kZWZpbmVkKTtcbnJldHVybiBQcm9taXNlLnJlc29sdmUoY3VycmVudFJlc3BvbnNlKTtcbiB9XG5pZighb3B0TmV4dFByb21pc2Upe1xuY29uc3QgbmV4dEl0ZXJSZXN1bHRQPUUoaXRlcmF0b3JQKS5uZXh0KCk7XG5vcHROZXh0UHJvbWlzZT1FLndoZW4oXG5uZXh0SXRlclJlc3VsdFAsXG4oe2RvbmUsdmFsdWV9KT0+e1xuYXNzZXJ0KCFmaW5hbCk7XG5pZihkb25lKXtcbmZpbmFsPXRydWU7XG4gfVxuY3VycmVudFVwZGF0ZUNvdW50Kz0xbjtcbmN1cnJlbnRSZXNwb25zZT1oYXJkZW4oe1xudmFsdWUsXG51cGRhdGVDb3VudDpkb25lP3VuZGVmaW5lZDpjdXJyZW50VXBkYXRlQ291bnR9KTtcblxub3B0TmV4dFByb21pc2U9dW5kZWZpbmVkO1xucmV0dXJuIGN1cnJlbnRSZXNwb25zZTtcbiB9LFxuKF9yZWFzb24pPT57XG5maW5hbD10cnVlO1xuY3VycmVudFJlc3BvbnNlPVxuLyoqIEB0eXBlIHtQcm9taXNlPFVwZGF0ZVJlY29yZDxUPj59ICovXG5uZXh0SXRlclJlc3VsdFA7XG5vcHROZXh0UHJvbWlzZT11bmRlZmluZWQ7XG5yZXR1cm4gY3VycmVudFJlc3BvbnNlO1xuIH0pO1xuXG4gfVxucmV0dXJuIG9wdE5leHRQcm9taXNlO1xuIH19KTtcblxuXG4vKiogQHR5cGUge05vdGlmaWVyPFQ+fSAqL1xuY29uc3Qgbm90aWZpZXI9RmFyKCdub3RpZmllcicse1xuLyogRG9uJ3QgbGVhayB0aGUgb3JpZ2luYWwgYXN5bmNJdGVyYWJsZVAgc2luY2UgaXQgbWF5IGJlIHJlbW90ZSBhbmQgd2UgYWxzbyovXG4vKiB3YW50IHRoZSBzYW1lIHNlbWFudGljcyBmb3IgdGhpcyBleHBvc2VkIGl0ZXJhYmxlIGFuZCB0aGUgYmFzZU5vdGlmaWVyLiovXG4uLi5tYWtlTm90aWZpZXIoYmFzZU5vdGlmaWVyKSxcbi4uLmJhc2VOb3RpZmllcn0pO1xuXG5yZXR1cm4gbm90aWZpZXI7XG4gfTskaOKAjV9vbmNlLm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlKG1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlKTtcbmhhcmRlbihtYWtlTm90aWZpZXJGcm9tQXN5bmNJdGVyYWJsZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZU5vdGlmaWVyIjpbIm1ha2VOb3RpZmllciJdLCJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciI6WyJtYWtlTm90aWZpZXJGcm9tU3Vic2NyaWJlciJdLCJtYWtlTm90aWZpZXJLaXQiOlsibWFrZU5vdGlmaWVyS2l0Il0sIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIjpbIm1ha2VOb3RpZmllckZyb21Bc3luY0l0ZXJhYmxlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADLasXEHLwAABy8AACoAAABAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvcHVibGlzaC1raXQuanN7ImltcG9ydHMiOlsiLi90eXBlcy1hbWJpZW50LmpzIiwiQGFnb3JpYy9zdG9yZSIsIkBhZ29yaWMvdmF0LWRhdGEiLCJAZW5kby9mYXIiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbIlB1Ymxpc2hlckkiLCJTdWJzY3JpYmVySSIsIlN1YnNjcmliZXJTaGFwZSIsIlVwZGF0ZUNvdW50U2hhcGUiLCJtYWtlUHVibGlzaEtpdCIsInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCIsInB1Ymxpc2hLaXRJS2l0Il0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG1ha2VQcm9taXNlS2l0LEUsRmFyLE0sY2FuQmVEdXJhYmxlLHByZXBhcmVFeG9DbGFzc0tpdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wibWFrZVByb21pc2VLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VQcm9taXNlS2l0ID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV0sW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3ZhdC1kYXRhXCIsIFtbXCJjYW5CZUR1cmFibGVcIiwgWyRo4oCNX2EgPT4gKGNhbkJlRHVyYWJsZSA9ICRo4oCNX2EpXV0sW1wicHJlcGFyZUV4b0NsYXNzS2l0XCIsIFskaOKAjV9hID0+IChwcmVwYXJlRXhvQ2xhc3NLaXQgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG5jb25zdCBzaW5rPSgpPT57IH07XG5jb25zdCBtYWtlUXVpZXRSZWplY3Rpb249KHJlYXNvbik9PntcbmNvbnN0IHJlamVjdGlvbj1oYXJkZW4oUHJvbWlzZS5yZWplY3QocmVhc29uKSk7XG52b2lkIEUud2hlbihyZWplY3Rpb24sc2luayxzaW5rKTtcbnJldHVybiByZWplY3Rpb247XG4gfTtcblxuY29uc3QgICAgICAgIFB1Ymxpc2hlckk9TS5pbnRlcmZhY2UoJ1B1Ymxpc2hlcicse1xucHVibGlzaDpNLmNhbGwoTS5hbnkoKSkucmV0dXJucygpLFxuZmluaXNoOk0uY2FsbChNLmFueSgpKS5yZXR1cm5zKCksXG5mYWlsOk0uY2FsbChNLmFueSgpKS5yZXR1cm5zKCl9KTtcblxuXG4vKiBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgd2l0aCBOb3RpZmllciBgZ2V0VXBkYXRlU2luY2VgLiovJGjigI1fb25jZS5QdWJsaXNoZXJJKFB1Ymxpc2hlckkpO1xuY29uc3QgICAgICAgIFVwZGF0ZUNvdW50U2hhcGU9TS5vcihNLmJpZ2ludCgpLE0ubnVtYmVyKCkpOyRo4oCNX29uY2UuVXBkYXRlQ291bnRTaGFwZShVcGRhdGVDb3VudFNoYXBlKTtcbmNvbnN0ICAgICAgICBTdWJzY3JpYmVyST1NLmludGVyZmFjZSgnU3Vic2NyaWJlcicse1xuc3Vic2NyaWJlQWZ0ZXI6TS5jYWxsKCkub3B0aW9uYWwoTS5iaWdpbnQoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG5nZXRVcGRhdGVTaW5jZTpNLmNhbGwoKS5vcHRpb25hbChVcGRhdGVDb3VudFNoYXBlKS5yZXR1cm5zKE0ucHJvbWlzZSgpKX0pOyRo4oCNX29uY2UuU3Vic2NyaWJlckkoU3Vic2NyaWJlckkpO1xuXG5jb25zdCAgICAgICAgcHVibGlzaEtpdElLaXQ9aGFyZGVuKHtcbnB1Ymxpc2hlcjpQdWJsaXNoZXJJLFxuc3Vic2NyaWJlcjpTdWJzY3JpYmVySX0pO1xuXG5cbi8qKlxuICogQHRlbXBsYXRlIHtvYmplY3R9IEFyZ1xuICogQHRlbXBsYXRlIFJldFxuICogQHBhcmFtIHsoYXJnOiBBcmcpID0+IFJldH0gZm5cbiAqIEByZXR1cm5zIHsoYXJnOiBBcmcpID0+IFJldH1cbiAqLyRo4oCNX29uY2UucHVibGlzaEtpdElLaXQocHVibGlzaEtpdElLaXQpO1xuY29uc3Qgd2Vha01lbW9pemVVbmFyeT0oZm4pPT57XG5jb25zdCBjYWNoZT1uZXcgV2Vha01hcCgpO1xucmV0dXJuKGFyZyk9Pntcbi8qKiBAdHlwZSB7b2JqZWN0fSAqL1xuY29uc3Qgb2FyZz1hcmc7XG5pZihjYWNoZS5oYXMob2FyZykpe1xucmV0dXJuIGNhY2hlLmdldChvYXJnKTtcbiB9XG5jb25zdCByZXN1bHQ9Zm4oYXJnKTtcbmNhY2hlLnNldChvYXJnLHJlc3VsdCk7XG5yZXR1cm4gcmVzdWx0O1xuIH07XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtQdWJsaWNhdGlvblJlY29yZDxUPn0gcmVjb3JkXG4gKiBAcmV0dXJucyB7VXBkYXRlUmVjb3JkPFQ+fVxuICovXG5jb25zdCBtYWtlVXBkYXRlUmVjb3JkRnJvbVB1YmxpY2F0aW9uUmVjb3JkPShyZWNvcmQpPT57XG5jb25zdHtcbmhlYWQ6e3ZhbHVlLGRvbmV9LFxucHVibGlzaENvdW50fT1cbnJlY29yZDtcbmlmKGRvbmUpe1xuLyogRmluYWwgcmVzdWx0cyBoYXZlIHVuZGVmaW5lZCB1cGRhdGVDb3VudC4qL1xucmV0dXJuIGhhcmRlbih7dmFsdWUsdXBkYXRlQ291bnQ6dW5kZWZpbmVkfSk7XG4gfVxucmV0dXJuIGhhcmRlbih7dmFsdWUsdXBkYXRlQ291bnQ6cHVibGlzaENvdW50fSk7XG4gfTtcblxuLyoqXG4gKiBNYWtlcyBhIGB7IHB1Ymxpc2hlciwgc3Vic2NyaWJlciB9YCBwYWlyIGZvciBkb2luZyBlZmZpY2llbnRcbiAqIGRpc3RyaWJ1dGVkIHB1Yi9zdWIgc3VwcG9ydGluZyBib3RoIFwiZWFjaFwiIGFuZCBcImxhdGVzdFwiIGl0ZXJhdGlvblxuICogb2YgcHVibGlzaGVkIHZhbHVlcy5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHJldHVybnMge1B1Ymxpc2hLaXQ8VD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlUHVibGlzaEtpdD0oKT0+e1xuLyoqIEB0eXBlIHtQcm9taXNlPFB1YmxpY2F0aW9uUmVjb3JkPFQ+Pn0gKi9cbmxldCB0YWlsUDtcbi8qKiBAdHlwZSB7dW5kZWZpbmVkIHwgKCh2YWx1ZTogRVJlZjxQdWJsaWNhdGlvblJlY29yZDxUPj4pID0+IHZvaWQpfSAqL1xubGV0IHRhaWxSO1xuKHtwcm9taXNlOnRhaWxQLHJlc29sdmU6dGFpbFJ9PW1ha2VQcm9taXNlS2l0KCkpO1xuXG5sZXQgY3VycmVudFB1Ymxpc2hDb3VudD0wbjtcbmxldCBjdXJyZW50UD10YWlsUDtcbmNvbnN0IGFkdmFuY2VDdXJyZW50PShkb25lLHZhbHVlLHJlamVjdGlvbik9PntcbmlmKHRhaWxSPT09dW5kZWZpbmVkKXtcbnRocm93IG5ldyBFcnJvcignQ2Fubm90IHVwZGF0ZSBzdGF0ZSBhZnRlciB0ZXJtaW5hdGlvbi4nKTtcbiB9XG5cbmN1cnJlbnRQdWJsaXNoQ291bnQrPTFuO1xuY3VycmVudFA9dGFpbFA7XG5jb25zdCByZXNvbHZlQ3VycmVudD10YWlsUjtcblxuaWYoZG9uZSl7XG50YWlsUD1tYWtlUXVpZXRSZWplY3Rpb24oXG5uZXcgRXJyb3IoJ0Nhbm5vdCByZWFkIHBhc3QgZW5kIG9mIGl0ZXJhdGlvbi4nKSk7XG5cbnRhaWxSPXVuZGVmaW5lZDtcbiB9ZWxzZXtcbih7cHJvbWlzZTp0YWlsUCxyZXNvbHZlOnRhaWxSfT1tYWtlUHJvbWlzZUtpdCgpKTtcbiB9XG5cbmlmKHJlamVjdGlvbil7XG5yZXNvbHZlQ3VycmVudChyZWplY3Rpb24pO1xuIH1lbHNle1xucmVzb2x2ZUN1cnJlbnQoXG5oYXJkZW4oe1xuaGVhZDp7dmFsdWUsZG9uZX0sXG5wdWJsaXNoQ291bnQ6Y3VycmVudFB1Ymxpc2hDb3VudCxcbnRhaWw6dGFpbFB9KSk7XG5cblxuIH1cbiB9O1xuXG5jb25zdCBtYWtlTWVtb2l6ZWRVcGRhdGVSZWNvcmQ9d2Vha01lbW9pemVVbmFyeShcbm1ha2VVcGRhdGVSZWNvcmRGcm9tUHVibGljYXRpb25SZWNvcmQpO1xuXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlIHtTdWJzY3JpYmVyPFQ+fVxuICovXG5jb25zdCBzdWJzY3JpYmVyPUZhcignU3Vic2NyaWJlcicse1xuc3Vic2NyaWJlQWZ0ZXI6KHB1Ymxpc2hDb3VudD0tMW4pPT57XG5hc3NlcnQudHlwZW9mKHB1Ymxpc2hDb3VudCwnYmlnaW50Jyk7XG5pZihwdWJsaXNoQ291bnQ9PT1jdXJyZW50UHVibGlzaENvdW50KXtcbnJldHVybiB0YWlsUDtcbiB9ZWxzZSBpZihwdWJsaXNoQ291bnQ8Y3VycmVudFB1Ymxpc2hDb3VudCl7XG5yZXR1cm4gY3VycmVudFA7XG4gfWVsc2V7XG50aHJvdyBuZXcgRXJyb3IoXG4nc3Vic2NyaWJlQWZ0ZXIgYXJndW1lbnQgbXVzdCBiZSBhIHByZXZpb3VzbHktaXNzdWVkIHB1Ymxpc2hDb3VudC4nKTtcblxuIH1cbiB9LFxuZ2V0VXBkYXRlU2luY2U6KHVwZGF0ZUNvdW50KT0+e1xuaWYodXBkYXRlQ291bnQ9PT11bmRlZmluZWQpe1xucmV0dXJuIHN1YnNjcmliZXIuc3Vic2NyaWJlQWZ0ZXIoKS50aGVuKG1ha2VNZW1vaXplZFVwZGF0ZVJlY29yZCk7XG4gfVxudXBkYXRlQ291bnQ9QmlnSW50KHVwZGF0ZUNvdW50KTtcbnJldHVybihcbnN1YnNjcmliZXJcbi8qIGBzdWJzY3JpYmVBZnRlcmAgbWF5IHJlc29sdmUgd2l0aCB0aGUgdXBkYXRlIHJlY29yZCBudW1iZXJlZCovXG4vKiBgdXBkYXRlQ291bnQgKyAxYCwgZXZlbiBpZiBzZXZlcmFsIHVwZGF0ZXMgYXJlIHB1Ymxpc2hlZCBpbiB0aGUqL1xuLyogc2FtZSBjcmFuay4uLiovLlxuc3Vic2NyaWJlQWZ0ZXIodXBkYXRlQ291bnQpXG4vKiAuLi4gc28gd2UgcG9sbCB0aGUgbGF0ZXN0IHB1Ymxpc2hlZCB1cGRhdGUsIHdpdGhvdXQgd2FpdGluZyBmb3IgYW55Ki9cbi8qIGZ1cnRoZXIgb25lcy4qLy5cbnRoZW4oKCk9PnN1YnNjcmliZXIuZ2V0VXBkYXRlU2luY2UoKSkpO1xuXG4gfX0pO1xuXG5cbi8qKiBAdHlwZSB7UHVibGlzaGVyPFQ+fSAqL1xuY29uc3QgcHVibGlzaGVyPUZhcignUHVibGlzaGVyJyx7XG5wdWJsaXNoOih2YWx1ZSk9PntcbmFkdmFuY2VDdXJyZW50KGZhbHNlLHZhbHVlKTtcbiB9LFxuZmluaXNoOihmaW5hbFZhbHVlKT0+e1xuYWR2YW5jZUN1cnJlbnQodHJ1ZSxmaW5hbFZhbHVlKTtcbiB9LFxuZmFpbDoocmVhc29uKT0+e1xuYWR2YW5jZUN1cnJlbnQodHJ1ZSx1bmRlZmluZWQsbWFrZVF1aWV0UmVqZWN0aW9uKHJlYXNvbikpO1xuIH19KTtcblxucmV0dXJuIGhhcmRlbih7cHVibGlzaGVyLHN1YnNjcmliZXJ9KTtcbiB9OyRo4oCNX29uY2UubWFrZVB1Ymxpc2hLaXQobWFrZVB1Ymxpc2hLaXQpO1xuaGFyZGVuKG1ha2VQdWJsaXNoS2l0KTtcblxuLyogVE9ETzogTW92ZSBkdXJhYmxlIHB1Ymxpc2gga2l0IHRvIGEgbmV3IGZpbGU/Ki9cblxuLyoqXG4gKiBAcGFyYW0ge29iamVjdH0gW29wdGlvbnNdXG4gKiBAcGFyYW0ge0R1cmFibGVQdWJsaXNoS2l0VmFsdWVEdXJhYmlsaXR5ICYgJ21hbmRhdG9yeSd9IFtvcHRpb25zLnZhbHVlRHVyYWJpbGl0eT0nbWFuZGF0b3J5J11cbiAqIEByZXR1cm5zIHtEdXJhYmxlUHVibGlzaEtpdFN0YXRlfVxuICovXG5jb25zdCBpbml0RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZT0ob3B0aW9ucz17fSk9PntcbmNvbnN0e3ZhbHVlRHVyYWJpbGl0eT0nbWFuZGF0b3J5J309b3B0aW9ucztcbmFzc2VydC5lcXVhbCh2YWx1ZUR1cmFiaWxpdHksJ21hbmRhdG9yeScpO1xucmV0dXJue1xuLyogY29uZmlndXJhdGlvbiovXG52YWx1ZUR1cmFiaWxpdHksXG5cbi8qIGxpZmVjeWNsZSBwcm9ncmVzcyovXG5wdWJsaXNoQ291bnQ6MG4sXG5zdGF0dXM6J2xpdmUnLC8qIHwgJ2ZpbmlzaGVkJyB8ICdmYWlsZWQnKi9cblxuLyogcGVyc2lzdGVkIHJlc3VsdCBkYXRhKi9cbi8qIE5vdGUgdGhhdCBpbiBhZGRpdGlvbiB0byBub24tdGVybWluYWwgdmFsdWVzIGZyb20gYHB1Ymxpc2hgLCovXG4vKiB2YWx1ZSBhbHNvIGhvbGRzIHRoZSB0ZXJtaW5hbCB2YWx1ZSBmcm9tIGBmaW5pc2hgIG9yIGBmYWlsYC4qL1xuaGFzVmFsdWU6ZmFsc2UsXG52YWx1ZTp1bmRlZmluZWR9O1xuXG4gfTtcblxuLyogV2UgbmVlZCB0aGUgV2Vha01hcCBrZXkgZm9yIGEga2l0IHRvIGJlIGEgdnJlZi1iZWFyaW5nIG9iamVjdCovXG4vKiBpbiBpdHMgY29ob3J0LCBhbmQgaGF2ZSBhcmJpdHJhcmlseSBjaG9zZW4gdGhlIHB1Ymxpc2hlciBmYWNldC4qL1xuLyoqIEB0eXBlZGVmIHtQdWJsaXNoZXI8Kj59IER1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsS2V5ICovXG4vKipcbiAqIEBwYXJhbSB7UHVibGlzaEtpdDwqPn0gZmFjZXRzXG4gKiBAcmV0dXJucyB7RHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxLZXl9XG4gKi9cbmNvbnN0IGdldEVwaGVtZXJhbEtleT0oZmFjZXRzKT0+ZmFjZXRzLnB1Ymxpc2hlcjtcblxuLyoqIEB0eXBlIHtXZWFrTWFwPER1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsS2V5LCB7Y3VycmVudFAsIHRhaWxQLCB0YWlsUn0+fSAqL1xuY29uc3QgZHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogUmV0dXJucyB0aGUgY3VycmVudC9uZXh0LXJlc3VsdCBwcm9taXNlcyBhbmQgbmV4dC1yZXN1bHQgcmVzb2x2ZXJcbiAqIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGR1cmFibGUgcHVibGlzaCBraXQuXG4gKiBUaGV5IGFyZSBsb3N0IG9uIHVwZ3JhZGUsIGJ1dCByZWNyZWF0ZWQgb24tZGVtYW5kLlxuICogU3VjaCByZWNyZWF0aW9uIHByZXNlcnZlcyB0aGUgdmFsdWUgaW4gKGJ1dCBub3QgdGhlIGlkZW50aXR5IG9mKSB0aGVcbiAqIGN1cnJlbnQgeyB2YWx1ZSwgZG9uZSB9IHJlc3VsdCB3aGVuIHBvc3NpYmxlLCB3aGljaCBpcyBhbHdheXMgdGhlXG4gKiBjYXNlIHdoZW4gdGhhdCB2YWx1ZSBpcyB0ZXJtaW5hbCAoaS5lLiwgZnJvbSBgZmluaXNoYCBvciBgZmFpbGApIG9yXG4gKiB3aGVuIHRoZSBkdXJhYmxlIHB1Ymxpc2gga2l0IGlzIGNvbmZpZ3VyZWQgd2l0aFxuICogYHZhbHVlRHVyYWJpbGl0eTogJ21hbmRhdG9yeSdgLlxuICpcbiAqIEBwYXJhbSB7RHVyYWJsZVB1Ymxpc2hLaXRTdGF0ZX0gc3RhdGVcbiAqIEBwYXJhbSB7UHVibGlzaEtpdDwqPn0gZmFjZXRzXG4gKi9cbmNvbnN0IHByb3ZpZGVEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGE9KHN0YXRlLGZhY2V0cyk9PntcbmNvbnN0IGVwaGVtZXJhbEtleT1nZXRFcGhlbWVyYWxLZXkoZmFjZXRzKTtcbmNvbnN0IGZvdW5kRGF0YT1kdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEuZ2V0KGVwaGVtZXJhbEtleSk7XG5pZihmb3VuZERhdGEpe1xucmV0dXJuIGZvdW5kRGF0YTtcbiB9XG5jb25zdHtzdGF0dXMscHVibGlzaENvdW50fT1zdGF0ZTtcbi8qKiBAdHlwZSB7b2JqZWN0fSAqL1xubGV0IG5ld0RhdGE7XG5pZihzdGF0dXM9PT0nZmFpbGVkJyl7XG5uZXdEYXRhPXtcbmN1cnJlbnRQOm1ha2VRdWlldFJlamVjdGlvbihzdGF0ZS52YWx1ZSksXG50YWlsUDptYWtlUXVpZXRSZWplY3Rpb24oXG5uZXcgRXJyb3IoJ0Nhbm5vdCByZWFkIHBhc3QgZW5kIG9mIGl0ZXJhdGlvbi4nKSksXG5cbnRhaWxSOnVuZGVmaW5lZH07XG5cbiB9ZWxzZSBpZihzdGF0dXM9PT0nZmluaXNoZWQnKXtcbmNvbnN0IHRhaWxQPW1ha2VRdWlldFJlamVjdGlvbihcbm5ldyBFcnJvcignQ2Fubm90IHJlYWQgcGFzdCBlbmQgb2YgaXRlcmF0aW9uLicpKTtcblxubmV3RGF0YT17XG5jdXJyZW50UDpFLnJlc29sdmUoXG5oYXJkZW4oe1xuaGVhZDp7dmFsdWU6c3RhdGUudmFsdWUsZG9uZTp0cnVlfSxcbnB1Ymxpc2hDb3VudCxcbnRhaWw6dGFpbFB9KSksXG5cblxudGFpbFAsXG50YWlsUjp1bmRlZmluZWR9O1xuXG4gfWVsc2UgaWYoc3RhdHVzPT09J2xpdmUnKXtcbmNvbnN0e3Byb21pc2U6dGFpbFAscmVzb2x2ZTp0YWlsUn09bWFrZVByb21pc2VLaXQoKTtcbnZvaWQgRS53aGVuKHRhaWxQLHNpbmssc2luayk7XG5uZXdEYXRhPXtcbmN1cnJlbnRQOnN0YXRlLmhhc1ZhbHVlP1xuRS5yZXNvbHZlKFxuaGFyZGVuKHtcbmhlYWQ6e3ZhbHVlOnN0YXRlLnZhbHVlLGRvbmU6ZmFsc2V9LFxucHVibGlzaENvdW50LFxudGFpbDp0YWlsUH0pKTpcblxuXG50YWlsUCxcbnRhaWxQLFxudGFpbFJ9O1xuXG4gfWVsc2V7XG5GYWlsIGBJbnZhbGlkIGR1cmFibGUgcHJvbWlzZSBraXQgc3RhdHVzOiAke3Eoc3RhdHVzKX1gO1xuIH1cbmR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YS5zZXQoZXBoZW1lcmFsS2V5LGhhcmRlbihuZXdEYXRhKSk7XG5yZXR1cm4gbmV3RGF0YTtcbiB9O1xuXG4vKipcbiAqIEV4dGVuZHMgdGhlIHNlcXVlbmNlIG9mIHJlc3VsdHMuXG4gKlxuICogQHBhcmFtIHt7c3RhdGU6IER1cmFibGVQdWJsaXNoS2l0U3RhdGUsIGZhY2V0czogUHVibGlzaEtpdDwqPn19IGNvbnRleHRcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICogQHBhcmFtIHtEdXJhYmxlUHVibGlzaEtpdFN0YXRlWydzdGF0dXMnXX0gW3RhcmdldFN0YXR1c11cbiAqL1xuY29uc3QgYWR2YW5jZUR1cmFibGVQdWJsaXNoS2l0PShjb250ZXh0LHZhbHVlLHRhcmdldFN0YXR1cz0nbGl2ZScpPT57XG5jb25zdHtzdGF0ZSxmYWNldHN9PWNvbnRleHQ7XG5jb25zdHt2YWx1ZUR1cmFiaWxpdHksc3RhdHVzfT1zdGF0ZTtcbmlmKHN0YXR1cyE9PSdsaXZlJyl7XG50aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCB1cGRhdGUgc3RhdGUgYWZ0ZXIgdGVybWluYXRpb24uJyk7XG4gfVxuY29uc3QgZG9uZT10YXJnZXRTdGF0dXMhPT0nbGl2ZSc7XG5pZihkb25lfHx2YWx1ZUR1cmFiaWxpdHk9PT0nbWFuZGF0b3J5Jyl7XG5jYW5CZUR1cmFibGUodmFsdWUpfHxGYWlsIGBDYW5ub3QgYWNjZXB0IG5vbi1kdXJhYmxlIHZhbHVlOiAke3ZhbHVlfWA7XG4gfVxuY29uc3R7dGFpbFA6Y3VycmVudFAsdGFpbFI6cmVzb2x2ZUN1cnJlbnR9PVxucHJvdmlkZUR1cmFibGVQdWJsaXNoS2l0RXBoZW1lcmFsRGF0YShzdGF0ZSxmYWNldHMpO1xuXG5jb25zdCBwdWJsaXNoQ291bnQ9c3RhdGUucHVibGlzaENvdW50KzFuO1xuc3RhdGUucHVibGlzaENvdW50PXB1Ymxpc2hDb3VudDtcbmxldCB0YWlsUDtcbmxldCB0YWlsUjtcblxuaWYoZG9uZSl7XG5zdGF0ZS5zdGF0dXM9dGFyZ2V0U3RhdHVzO1xudGFpbFA9bWFrZVF1aWV0UmVqZWN0aW9uKG5ldyBFcnJvcignQ2Fubm90IHJlYWQgcGFzdCBlbmQgb2YgaXRlcmF0aW9uLicpKTtcbnRhaWxSPXVuZGVmaW5lZDtcbiB9ZWxzZXtcbih7cHJvbWlzZTp0YWlsUCxyZXNvbHZlOnRhaWxSfT1tYWtlUHJvbWlzZUtpdCgpKTtcbnZvaWQgRS53aGVuKHRhaWxQLHNpbmssc2luayk7XG4gfVxuZHVyYWJsZVB1Ymxpc2hLaXRFcGhlbWVyYWxEYXRhLnNldChcbmdldEVwaGVtZXJhbEtleShmYWNldHMpLFxuaGFyZGVuKHtjdXJyZW50UCx0YWlsUCx0YWlsUn0pKTtcblxuXG5pZih0YXJnZXRTdGF0dXM9PT0nZmFpbGVkJyl7XG5zdGF0ZS5oYXNWYWx1ZT10cnVlO1xuc3RhdGUudmFsdWU9dmFsdWU7XG5jb25zdCByZWplY3Rpb249bWFrZVF1aWV0UmVqZWN0aW9uKHZhbHVlKTtcbnJlc29sdmVDdXJyZW50KHJlamVjdGlvbik7XG4gfWVsc2V7XG4vKiBQZXJzaXN0IGEgdGVybWluYWwgdmFsdWUsIG9yIGEgbm9uLXRlcm1pbmFsIHZhbHVlKi9cbi8qIGlmIGNvbmZpZ3VyZWQgYXMgJ21hbmRhdG9yeScgb3IgJ29wcG9ydHVuaXN0aWMnLiovXG5pZihkb25lfHx2YWx1ZUR1cmFiaWxpdHkhPT0naWdub3JlZCcmJmNhbkJlRHVyYWJsZSh2YWx1ZSkpe1xuc3RhdGUuaGFzVmFsdWU9dHJ1ZTtcbnN0YXRlLnZhbHVlPXZhbHVlO1xuIH1lbHNle1xuc3RhdGUuaGFzVmFsdWU9ZmFsc2U7XG5zdGF0ZS52YWx1ZT11bmRlZmluZWQ7XG4gfVxuXG5yZXNvbHZlQ3VycmVudChcbmhhcmRlbih7XG5oZWFkOnt2YWx1ZSxkb25lfSxcbnB1Ymxpc2hDb3VudCxcbnRhaWw6dGFpbFB9KSk7XG5cblxuIH1cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi4vLi4vdmF0LWRhdGEvc3JjL3R5cGVzLmpzJykuQmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IGtpbmROYW1lXG4gKi9cbmNvbnN0ICAgICAgICBwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQ9KGJhZ2dhZ2Usa2luZE5hbWUpPT57XG4vKiBUT0RPOiBPbmNlIHdlIHVuaWZ5IHdpdGggbWFrZVB1Ymxpc2hLaXQsIHdlIHdpbGwgdXNlIGEgWm9uZS1jb21wYXRpYmxlIHdlYWsqL1xuLyogbWFwIGZvciBtZW1vaXphdGlvbi4qL1xuY29uc3QgbWFrZU1lbW9pemVkVXBkYXRlUmVjb3JkPW1ha2VVcGRhdGVSZWNvcmRGcm9tUHVibGljYXRpb25SZWNvcmQ7XG5cbi8qKlxuICogQHJldHVybnMgeygpID0+IFB1Ymxpc2hLaXQ8Kj59XG4gKi9cbnJldHVybiBwcmVwYXJlRXhvQ2xhc3NLaXQoXG5iYWdnYWdlLFxua2luZE5hbWUsXG5wdWJsaXNoS2l0SUtpdCxcbmluaXREdXJhYmxlUHVibGlzaEtpdFN0YXRlLFxue1xuLyogVGhlIHB1Ymxpc2hlciBmYWNldCBvZiBhIGR1cmFibGUgcHVibGlzaCBraXQqL1xuLyogYWNjZXB0cyBuZXcgdmFsdWVzLiovXG5wdWJsaXNoZXI6e1xucHVibGlzaCh2YWx1ZSl7XG5hZHZhbmNlRHVyYWJsZVB1Ymxpc2hLaXQodGhpcyx2YWx1ZSk7XG4gfSxcbmZpbmlzaChmaW5hbFZhbHVlKXtcbmFkdmFuY2VEdXJhYmxlUHVibGlzaEtpdCh0aGlzLGZpbmFsVmFsdWUsJ2ZpbmlzaGVkJyk7XG4gfSxcbmZhaWwocmVhc29uKXtcbmFkdmFuY2VEdXJhYmxlUHVibGlzaEtpdCh0aGlzLHJlYXNvbiwnZmFpbGVkJyk7XG4gfX0sXG5cblxuLyogVGhlIHN1YnNjcmliZXIgZmFjZXQgb2YgYSBkdXJhYmxlIHB1Ymxpc2gga2l0Ki9cbi8qIHByb3BhZ2F0ZXMgdmFsdWVzLiovXG5zdWJzY3JpYmVyOntcbnN1YnNjcmliZUFmdGVyKHB1Ymxpc2hDb3VudD0tMW4pe1xuY29uc3R7c3RhdGUsZmFjZXRzfT10aGlzO1xuY29uc3R7cHVibGlzaENvdW50OmN1cnJlbnRQdWJsaXNoQ291bnR9PXN0YXRlO1xuY29uc3R7Y3VycmVudFAsdGFpbFB9PXByb3ZpZGVEdXJhYmxlUHVibGlzaEtpdEVwaGVtZXJhbERhdGEoXG5zdGF0ZSxcbmZhY2V0cyk7XG5cbmlmKHB1Ymxpc2hDb3VudD09PWN1cnJlbnRQdWJsaXNoQ291bnQpe1xucmV0dXJuIHRhaWxQO1xuIH1lbHNlIGlmKHB1Ymxpc2hDb3VudDxjdXJyZW50UHVibGlzaENvdW50KXtcbnJldHVybiBjdXJyZW50UDtcbiB9ZWxzZXtcbnRocm93IG5ldyBFcnJvcihcbidzdWJzY3JpYmVBZnRlciBhcmd1bWVudCBtdXN0IGJlIGEgcHJldmlvdXNseS1pc3N1ZWQgcHVibGlzaENvdW50LicpO1xuXG4gfVxuIH0sXG5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCl7XG5jb25zdHtcbmZhY2V0czp7c3Vic2NyaWJlcn19PVxudGhpcztcbmlmKHVwZGF0ZUNvdW50PT09dW5kZWZpbmVkKXtcbnJldHVybiBzdWJzY3JpYmVyLnN1YnNjcmliZUFmdGVyKCkudGhlbihtYWtlTWVtb2l6ZWRVcGRhdGVSZWNvcmQpO1xuIH1cbnVwZGF0ZUNvdW50PUJpZ0ludCh1cGRhdGVDb3VudCk7XG5yZXR1cm4oXG5zdWJzY3JpYmVyXG4vKiBgc3Vic2NyaWJlQWZ0ZXJgIG1heSByZXNvbHZlIHdpdGggdGhlIHVwZGF0ZSByZWNvcmQgbnVtYmVyZWQqL1xuLyogYHVwZGF0ZUNvdW50ICsgMWAsIGV2ZW4gaWYgc2V2ZXJhbCB1cGRhdGVzIGFyZSBwdWJsaXNoZWQgaW4gdGhlKi9cbi8qIHNhbWUgY3JhbmsuLi4qLy5cbnN1YnNjcmliZUFmdGVyKHVwZGF0ZUNvdW50KVxuLyogLi4uIHNvIHdlIHBvbGwgdGhlIGxhdGVzdCBwdWJsaXNoZWQgdXBkYXRlLCB3aXRob3V0IHdhaXRpbmcgZm9yIGFueSovXG4vKiBmdXJ0aGVyIG9uZXMuKi8uXG50aGVuKCgpPT5zdWJzY3JpYmVyLmdldFVwZGF0ZVNpbmNlKCkpKTtcblxuIH19fSk7XG5cblxuXG4gfTskaOKAjV9vbmNlLnByZXBhcmVEdXJhYmxlUHVibGlzaEtpdChwcmVwYXJlRHVyYWJsZVB1Ymxpc2hLaXQpO1xuaGFyZGVuKHByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCk7XG5cbmNvbnN0ICAgICAgICBTdWJzY3JpYmVyU2hhcGU9TS5yZW1vdGFibGUoJ1N1YnNjcmliZXInKTskaOKAjV9vbmNlLlN1YnNjcmliZXJTaGFwZShTdWJzY3JpYmVyU2hhcGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlB1Ymxpc2hlckkiOlsiUHVibGlzaGVySSJdLCJVcGRhdGVDb3VudFNoYXBlIjpbIlVwZGF0ZUNvdW50U2hhcGUiXSwiU3Vic2NyaWJlckkiOlsiU3Vic2NyaWJlckkiXSwicHVibGlzaEtpdElLaXQiOlsicHVibGlzaEtpdElLaXQiXSwibWFrZVB1Ymxpc2hLaXQiOlsibWFrZVB1Ymxpc2hLaXQiXSwicHJlcGFyZUR1cmFibGVQdWJsaXNoS2l0IjpbInByZXBhcmVEdXJhYmxlUHVibGlzaEtpdCJdLCJTdWJzY3JpYmVyU2hhcGUiOlsiU3Vic2NyaWJlclNoYXBlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMejxSPjCQAA4wkAAC4AAABAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvc3RvcmVkLW5vdGlmaWVyLmpzeyJpbXBvcnRzIjpbIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiLCJAYWdvcmljL2ludGVybmFsIiwiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyIsIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbIm1ha2VTdG9yZWROb3RpZmllciJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRBbGxEZWZpbmVkLG1ha2VTZXJpYWxpemVUb1N0b3JhZ2UsRSxGYXIsb2JzZXJ2ZU5vdGlmaWVyOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcImFzc2VydEFsbERlZmluZWRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydEFsbERlZmluZWQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qc1wiLCBbW1wibWFrZVNlcmlhbGl6ZVRvU3RvcmFnZVwiLCBbJGjigI1fYSA9PiAobWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dLFtcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dLFtcIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanNcIiwgW1tcIm9ic2VydmVOb3RpZmllclwiLCBbJGjigI1fYSA9PiAob2JzZXJ2ZU5vdGlmaWVyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtCYXNlTm90aWZpZXI8VD4gJiBPbWl0PFN0b3JlZEZhY2V0LCAnZ2V0U3RvcmVLZXknPn0gU3RvcmVkTm90aWZpZXJcbiAqL1xuXG4vKipcbiAqIEJlZ2luIGl0ZXJhdGluZyB0aGUgc291cmNlLCBzdG9yaW5nIHNlcmlhbGl6ZWQgaXRlcmF0aW9uIHZhbHVlcy4gIElmIHRoZVxuICogc3RvcmFnZU5vZGUncyBgc2V0VmFsdWVgIG9wZXJhdGlvbiByZWplY3RzLCBubyBmdXJ0aGVyIHdyaXRlcyB0byBpdCB3aWxsXG4gKiBiZSBhdHRlbXB0ZWQgKGJ1dCByZXN1bHRzIHdpbGwgcmVtYWluIGF2YWlsYWJsZSBmcm9tIHRoZSBzdWJzY3JpYmVyKS5cbiAqXG4gKiBSZXR1cm5zIGEgU3RvcmVkTm90aWZpZXIgdGhhdCBjYW4gYmUgdXNlZCBieSBhIGNsaWVudCB0byBkaXJlY3RseSBmb2xsb3dcbiAqIHRoZSBpdGVyYXRpb24gdGhlbXNlbHZlcywgb3Igb2J0YWluIGluZm9ybWF0aW9uIHRvIHN1YnNjcmliZSB0byB0aGUgc3RvcmVkXG4gKiBkYXRhIG91dC1vZi1iYW5kLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8Tm90aWZpZXI8VD4+fSBub3RpZmllclxuICogQHBhcmFtIHtFUmVmPFN0b3JhZ2VOb2RlPn0gc3RvcmFnZU5vZGVcbiAqIEBwYXJhbSB7RVJlZjxNYXJzaGFsbGVyPn0gbWFyc2hhbGxlclxuICogQHJldHVybnMge1N0b3JlZE5vdGlmaWVyPFQ+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVN0b3JlZE5vdGlmaWVyPShub3RpZmllcixzdG9yYWdlTm9kZSxtYXJzaGFsbGVyKT0+e1xuYXNzZXJ0QWxsRGVmaW5lZCh7bm90aWZpZXIsc3RvcmFnZU5vZGUsbWFyc2hhbGxlcn0pO1xuXG5jb25zdCBtYXJzaGFsbFRvU3RvcmFnZT1tYWtlU2VyaWFsaXplVG9TdG9yYWdlKHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIpO1xuXG5vYnNlcnZlTm90aWZpZXIobm90aWZpZXIse1xudXBkYXRlU3RhdGUodmFsdWUpe1xubWFyc2hhbGxUb1N0b3JhZ2UodmFsdWUpLmNhdGNoKChyZWFzb24pPT5cbmNvbnNvbGUuZXJyb3IoJ1N0b3JlZE5vdGlmaWVyIGZhaWxlZCB0byB1cGRhdGVTdGF0ZScscmVhc29uKSk7XG5cbiB9LFxuZmFpbChyZWFzb24pe1xuY29uc29sZS5lcnJvcignU3RvcmVkTm90aWZpZXIgZmFpbGVkIHRvIGl0ZXJhdGUnLHJlYXNvbik7XG4gfX0pO1xuXG5cbi8qKiBAdHlwZSB7VW5zZXJpYWxpemVyfSAqL1xuY29uc3QgdW5zZXJpYWxpemVyPUZhcigndW5zZXJpYWxpemVyJyx7XG51bnNlcmlhbGl6ZTooZGF0YSk9PkUobWFyc2hhbGxlcikudW5zZXJpYWxpemUoZGF0YSl9KTtcblxuXG4vKiogQHR5cGUge1N0b3JlZE5vdGlmaWVyPFQ+fSAqL1xuY29uc3Qgc3RvcmVkTm90aWZpZXI9RmFyKCdTdG9yZWROb3RpZmllcicse1xuZ2V0VXBkYXRlU2luY2U6KHVwZGF0ZUNvdW50KT0+RShub3RpZmllcikuZ2V0VXBkYXRlU2luY2UodXBkYXRlQ291bnQpLFxuZ2V0UGF0aDooKT0+RShzdG9yYWdlTm9kZSkuZ2V0UGF0aCgpLFxuZ2V0VW5zZXJpYWxpemVyOigpPT51bnNlcmlhbGl6ZXJ9KTtcblxucmV0dXJuIHN0b3JlZE5vdGlmaWVyO1xuIH07JGjigI1fb25jZS5tYWtlU3RvcmVkTm90aWZpZXIobWFrZVN0b3JlZE5vdGlmaWVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlU3RvcmVkTm90aWZpZXIiOlsibWFrZVN0b3JlZE5vdGlmaWVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPTDcWR4DAAAeAwAACsAAABAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvc3RvcmVkLXRvcGljLmpzeyJpbXBvcnRzIjpbIi4vcHVibGlzaC1raXQuanMiLCIuL3N0b3Jlc3ViLmpzIiwiQGFnb3JpYy9pbnRlcm5hbCIsIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanMiLCJAYWdvcmljL3N0b3JlIiwiQGVuZG8vZmFyIl0sImV4cG9ydHMiOlsiUHVibGljVG9waWNTaGFwZSIsIlRvcGljc1JlY29yZFNoYXBlIiwibWFrZVB1YmxpY1RvcGljIiwicGlwZVRvcGljVG9TdG9yYWdlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydEFsbERlZmluZWQsbWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSxNLEUsU3Vic2NyaWJlclNoYXBlLGZvckVhY2hQdWJsaWNhdGlvblJlY29yZDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJhc3NlcnRBbGxEZWZpbmVkXCIsIFskaOKAjV9hID0+IChhc3NlcnRBbGxEZWZpbmVkID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWwvc3JjL2xpYi1jaGFpblN0b3JhZ2UuanNcIiwgW1tcIm1ha2VTZXJpYWxpemVUb1N0b3JhZ2VcIiwgWyRo4oCNX2EgPT4gKG1ha2VTZXJpYWxpemVUb1N0b3JhZ2UgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9zdG9yZVwiLCBbW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9mYXJcIiwgW1tcIkVcIiwgWyRo4oCNX2EgPT4gKEUgPSAkaOKAjV9hKV1dXV0sW1wiLi9wdWJsaXNoLWtpdC5qc1wiLCBbW1wiU3Vic2NyaWJlclNoYXBlXCIsIFskaOKAjV9hID0+IChTdWJzY3JpYmVyU2hhcGUgPSAkaOKAjV9hKV1dXV0sW1wiLi9zdG9yZXN1Yi5qc1wiLCBbW1wiZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkXCIsIFskaOKAjV9hID0+IChmb3JFYWNoUHVibGljYXRpb25SZWNvcmQgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cbmNvbnN0ICAgICAgICBQdWJsaWNUb3BpY1NoYXBlPU0uc3BsaXRSZWNvcmQoXG57XG5zdWJzY3JpYmVyOlN1YnNjcmliZXJTaGFwZSxcbnN0b3JhZ2VQYXRoOk0ucHJvbWlzZSgpfSxcblxue2Rlc2NyaXB0aW9uOk0uc3RyaW5nKCl9KTtcblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7b2JqZWN0fSBUIHRvcGljIHZhbHVlXG4gKiBAdHlwZWRlZiB7e1xuICogICBkZXNjcmlwdGlvbj86IHN0cmluZyxcbiAqICAgc3Vic2NyaWJlcjogU3Vic2NyaWJlcjxUPixcbiAqICAgc3RvcmFnZVBhdGg6IEVSZWY8c3RyaW5nPixcbiAqIH19IFB1YmxpY1RvcGljXG4gKi8kaOKAjV9vbmNlLlB1YmxpY1RvcGljU2hhcGUoUHVibGljVG9waWNTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBUb3BpY3NSZWNvcmRTaGFwZT1NLnJlY29yZE9mKE0uc3RyaW5nKCksUHVibGljVG9waWNTaGFwZSk7XG5cbi8qKlxuICogQHR5cGVkZWYge3tcbiAqICAgW3RvcGljTmFtZTogc3RyaW5nXTogUHVibGljVG9waWM8dW5rbm93bj4sXG4gKiB9fSBUb3BpY3NSZWNvcmRcbiAqL1xuLyoqXG4gKiBOQjogY2FsbGVyIG11c3QgZW5zdXJlIHRoYXQgYHB1Ymxpc2hlci5maW5pc2goKWAgb3IgYHB1Ymxpc2hlci5mYWlsKClgIGlzXG4gKiBjYWxsZWQgd2hlbiB0aGUgcHVibGlzaGVyIHN0b3JlcyBpdHMgZmluYWwgdmFsdWUuXG4gKiBPdGhlcndpc2UgdGhpcyB3YXRjaCBpcyByZXRhaW5lZCBhbmQgY2FuJ3QgYmUgR0NlZC5cbiAqXG4gKiBAcGFyYW0ge1N1YnNjcmliZXI8YW55Pn0gdG9waWNcbiAqIEBwYXJhbSB7RVJlZjxTdG9yYWdlTm9kZT59IHN0b3JhZ2VOb2RlXG4gKiBAcGFyYW0ge0VSZWY8UmV0dXJuVHlwZTxYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykubWFrZU1hcnNoYWw+Pn0gbWFyc2hhbGxlclxuICogQHJldHVybnMge3ZvaWR9XG4gKi8kaOKAjV9vbmNlLlRvcGljc1JlY29yZFNoYXBlKFRvcGljc1JlY29yZFNoYXBlKTtcbmNvbnN0ICAgICAgICBwaXBlVG9waWNUb1N0b3JhZ2U9KHRvcGljLHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIpPT57XG5hc3NlcnRBbGxEZWZpbmVkKHt0b3BpYyxzdG9yYWdlTm9kZSxtYXJzaGFsbGVyfSk7XG5cbmNvbnN0IG1hcnNoYWxsVG9TdG9yYWdlPW1ha2VTZXJpYWxpemVUb1N0b3JhZ2Uoc3RvcmFnZU5vZGUsbWFyc2hhbGxlcik7XG5cbi8qIFN0YXJ0IHB1Ymxpc2hpbmcgdGhlIHNvdXJjZS4qL1xuZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkKHRvcGljLG1hcnNoYWxsVG9TdG9yYWdlKS5jYXRjaCgoZXJyKT0+e1xuLyogVE9ETzogSG93IHNob3VsZCB3ZSBoYW5kbGUgYW5kL29yIHN1cmZhY2UgdGhpcyBmYWlsdXJlPyovXG4vKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC81NzY2I2Rpc2N1c3Npb25fcjkyMjQ5ODA4OCovXG5jb25zb2xlLmVycm9yKCdmb2xsb3dBbmRTdG9yZVRvcGljIGZhaWxlZCB0byBpdGVyYXRlJyxlcnIpO1xuIH0pO1xuIH07JGjigI1fb25jZS5waXBlVG9waWNUb1N0b3JhZ2UocGlwZVRvcGljVG9TdG9yYWdlKTtcbmhhcmRlbihwaXBlVG9waWNUb1N0b3JhZ2UpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gZGVzY3JpcHRpb25cbiAqIEBwYXJhbSB7U3Vic2NyaWJlcjxUPn0gc3Vic2NyaWJlclxuICogQHBhcmFtIHtFUmVmPFN0b3JhZ2VOb2RlPn0gc3RvcmFnZU5vZGVcbiAqIEByZXR1cm5zIHtQdWJsaWNUb3BpYzxUPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VQdWJsaWNUb3BpYz0oZGVzY3JpcHRpb24sc3Vic2NyaWJlcixzdG9yYWdlTm9kZSk9PntcbnJldHVybntcbmRlc2NyaXB0aW9uLFxuc3Vic2NyaWJlcixcbnN0b3JhZ2VQYXRoOkUoc3RvcmFnZU5vZGUpLmdldFBhdGgoKX07XG5cbiB9OyRo4oCNX29uY2UubWFrZVB1YmxpY1RvcGljKG1ha2VQdWJsaWNUb3BpYyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiUHVibGljVG9waWNTaGFwZSI6WyJQdWJsaWNUb3BpY1NoYXBlIl0sIlRvcGljc1JlY29yZFNoYXBlIjpbIlRvcGljc1JlY29yZFNoYXBlIl0sInBpcGVUb3BpY1RvU3RvcmFnZSI6WyJwaXBlVG9waWNUb1N0b3JhZ2UiXSwibWFrZVB1YmxpY1RvcGljIjpbIm1ha2VQdWJsaWNUb3BpYyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAfBQdrJSIAACUiAAAnAAAAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL3N0b3Jlc3ViLmpzeyJpbXBvcnRzIjpbIi4vYXN5bmNJdGVyYWJsZUFkYXB0b3IuanMiLCIuL3B1Ymxpc2gta2l0LmpzIiwiLi9zdWJzY3JpYmUuanMiLCIuL3N1YnNjcmliZXIuanMiLCJAYWdvcmljL2ludGVybmFsIiwiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qcyIsIkBlbmRvL2ZhciIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJmb3JFYWNoUHVibGljYXRpb25SZWNvcmQiLCJtYWtlU3RvcmVkUHVibGlzaEtpdCIsIm1ha2VTdG9yZWRQdWJsaXNoZXJLaXQiLCJtYWtlU3RvcmVkU3Vic2NyaWJlciIsIm1ha2VTdG9yZWRTdWJzY3JpcHRpb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxGYXIsbWFrZU1hcnNoYWwsYXNzZXJ0QWxsRGVmaW5lZCxtYWtlU2VyaWFsaXplVG9TdG9yYWdlLG9ic2VydmVJdGVyYXRpb24sbWFrZVB1Ymxpc2hLaXQsbWFrZVN1YnNjcmlwdGlvbktpdCxzdWJzY3JpYmVFYWNoOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV0sW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wibWFrZU1hcnNoYWxcIiwgWyRo4oCNX2EgPT4gKG1ha2VNYXJzaGFsID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcImFzc2VydEFsbERlZmluZWRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydEFsbERlZmluZWQgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbC9zcmMvbGliLWNoYWluU3RvcmFnZS5qc1wiLCBbW1wibWFrZVNlcmlhbGl6ZVRvU3RvcmFnZVwiLCBbJGjigI1fYSA9PiAobWFrZVNlcmlhbGl6ZVRvU3RvcmFnZSA9ICRo4oCNX2EpXV1dXSxbXCIuL2FzeW5jSXRlcmFibGVBZGFwdG9yLmpzXCIsIFtbXCJvYnNlcnZlSXRlcmF0aW9uXCIsIFskaOKAjV9hID0+IChvYnNlcnZlSXRlcmF0aW9uID0gJGjigI1fYSldXV1dLFtcIi4vcHVibGlzaC1raXQuanNcIiwgW1tcIm1ha2VQdWJsaXNoS2l0XCIsIFskaOKAjV9hID0+IChtYWtlUHVibGlzaEtpdCA9ICRo4oCNX2EpXV1dXSxbXCIuL3N1YnNjcmliZXIuanNcIiwgW1tcIm1ha2VTdWJzY3JpcHRpb25LaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VTdWJzY3JpcHRpb25LaXQgPSAkaOKAjV9hKV1dXV0sW1wiLi9zdWJzY3JpYmUuanNcIiwgW1tcInN1YnNjcmliZUVhY2hcIiwgWyRo4oCNX2EgPT4gKHN1YnNjcmliZUVhY2ggPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG4vKipcbiAqIE5COiBkb2VzIG5vdCB5ZXQgc3Vydml2ZSB1cGdyYWRlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNjg5M1xuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1N1YnNjcmliZXI8VD59IHN1YnNjcmliZXJcbiAqIEBwYXJhbSB7KHY6IFQpID0+IHZvaWR9IGNvbnN1bWVWYWx1ZVxuICovXG5jb25zdCAgICAgICAgZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkPWFzeW5jKHN1YnNjcmliZXIsY29uc3VtZVZhbHVlKT0+e1xuLyogV2Ugb3Blbi1jb2RlIHRoZSBmb3ItYXdhaXQtb2YgaW1wbGVtZW50YXRpb24gcmF0aGVyIHRoYW4gdXNpbmcgdGhhdCBzeW50YXgqL1xuLyogZGlyZWN0bHkgYmVjYXVzZSB3ZSB3YW50IHRvIHJ1biB0aGUgY29uc3VtZXIgb24gdGhlIGRvbmUgdmFsdWUgYXMgd2VsbC4qL1xuY29uc3QgaXRlcmF0b3I9c3Vic2NyaWJlRWFjaChzdWJzY3JpYmVyKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcblxubGV0IGZpbmlzaGVkPWZhbHNlO1xud2hpbGUoIWZpbmlzaGVkKXtcbi8qIEFsbG93IG5lc3RlZCBhd2FpdHMgKGluIGxvb3ApIGJlY2F1c2UgaXQncyBzYWZlIGZvciBlYWNoIHRvIHJ1biBpbiBhIHR1cm4qL1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWF3YWl0LWluLWxvb3AsIEBqZXNzaWUuanMvbm8tbmVzdGVkLWF3YWl0Ki9cbmNvbnN0e3ZhbHVlLGRvbmV9PWF3YWl0IGl0ZXJhdG9yLm5leHQoKTtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1hd2FpdC1pbi1sb29wLCBAamVzc2llLmpzL25vLW5lc3RlZC1hd2FpdCovXG5hd2FpdCBjb25zdW1lVmFsdWUodmFsdWUpO1xuZmluaXNoZWQ9ISFkb25lO1xuIH1cbiB9O1xuXG4vKipcbiAqIEJlZ2luIGl0ZXJhdGluZyB0aGUgc291cmNlLCBzdG9yaW5nIHNlcmlhbGl6ZWQgaXRlcmF0aW9uIHZhbHVlcy4gIElmIHRoZVxuICogc3RvcmFnZU5vZGUncyBgc2V0VmFsdWVgIG9wZXJhdGlvbiByZWplY3RzLCBubyBmdXJ0aGVyIHdyaXRlcyB0byBpdCB3aWxsXG4gKiBiZSBhdHRlbXB0ZWQgKGJ1dCByZXN1bHRzIHdpbGwgcmVtYWluIGF2YWlsYWJsZSBmcm9tIHRoZSBzdWJzY3JpYmVyKS5cbiAqXG4gKiBSZXR1cm5zIGEgU3RvcmVkU3Vic2NyaWJlciB0aGF0IGNhbiBiZSB1c2VkIGJ5IGEgY2xpZW50IHRvIGRpcmVjdGx5IGZvbGxvd1xuICogdGhlIGl0ZXJhdGlvbiB0aGVtc2VsdmVzLCBvciBvYnRhaW4gaW5mb3JtYXRpb24gdG8gc3Vic2NyaWJlIHRvIHRoZSBzdG9yZWRcbiAqIGRhdGEgb3V0LW9mLWJhbmQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7U3Vic2NyaWJlcjxUPn0gc3Vic2NyaWJlclxuICogQHBhcmFtIHtFUmVmPFN0b3JhZ2VOb2RlPn0gc3RvcmFnZU5vZGVcbiAqIEBwYXJhbSB7RVJlZjxSZXR1cm5UeXBlPHR5cGVvZiBtYWtlTWFyc2hhbD4+fSBtYXJzaGFsbGVyXG4gKiBAcmV0dXJucyB7U3RvcmVkU3Vic2NyaWJlcjxUPn1cbiAqLyRo4oCNX29uY2UuZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkKGZvckVhY2hQdWJsaWNhdGlvblJlY29yZCk7XG5jb25zdCAgICAgICAgbWFrZVN0b3JlZFN1YnNjcmliZXI9KHN1YnNjcmliZXIsc3RvcmFnZU5vZGUsbWFyc2hhbGxlcik9PntcbmFzc2VydEFsbERlZmluZWQoe3N1YnNjcmliZXIsc3RvcmFnZU5vZGUsbWFyc2hhbGxlcn0pO1xuXG5jb25zdCBtYXJzaGFsbFRvU3RvcmFnZT1tYWtlU2VyaWFsaXplVG9TdG9yYWdlKHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIpO1xuXG4vKiBTdGFydCBwdWJsaXNoaW5nIHRoZSBzb3VyY2UuKi9cbmZvckVhY2hQdWJsaWNhdGlvblJlY29yZChzdWJzY3JpYmVyLG1hcnNoYWxsVG9TdG9yYWdlKS5jYXRjaCgoZXJyKT0+e1xuLyogVE9ETzogSG93IHNob3VsZCB3ZSBoYW5kbGUgYW5kL29yIHN1cmZhY2UgdGhpcyBmYWlsdXJlPyovXG4vKiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC81NzY2I2Rpc2N1c3Npb25fcjkyMjQ5ODA4OCovXG5jb25zb2xlLmVycm9yKCdTdG9yZWRTdWJzY3JpYmVyIGZhaWxlZCB0byBpdGVyYXRlJyxlcnIpO1xuIH0pO1xuXG4vKiogQHR5cGUge1Vuc2VyaWFsaXplcn0gKi9cbmNvbnN0IHVuc2VyaWFsaXplcj1GYXIoJ3Vuc2VyaWFsaXplcicse1xudW5zZXJpYWxpemU6KGRhdGEpPT5FKG1hcnNoYWxsZXIpLnVuc2VyaWFsaXplKGRhdGEpfSk7XG5cblxuLyoqIEB0eXBlIHtTdG9yZWRTdWJzY3JpYmVyPFQ+fSAqL1xuY29uc3Qgc3RvcmVzdWI9RmFyKCdTdG9yZWRTdWJzY3JpYmVyJyx7XG5zdWJzY3JpYmVBZnRlcjoocHVibGlzaENvdW50KT0+c3Vic2NyaWJlci5zdWJzY3JpYmVBZnRlcihwdWJsaXNoQ291bnQpLFxuZ2V0VXBkYXRlU2luY2U6KHVwZGF0ZUNvdW50KT0+c3Vic2NyaWJlci5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCksXG5nZXRQYXRoOigpPT5FKHN0b3JhZ2VOb2RlKS5nZXRQYXRoKCksXG5nZXRTdG9yZUtleTooKT0+RShzdG9yYWdlTm9kZSkuZ2V0U3RvcmVLZXkoKSxcbmdldFVuc2VyaWFsaXplcjooKT0+dW5zZXJpYWxpemVyfSk7XG5cbnJldHVybiBzdG9yZXN1YjtcbiB9O1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSBtYWtlU3RvcmVkU3Vic2NyaWJlclxuICpcbiAqIEJlZ2luIGl0ZXJhdGluZyB0aGUgc291cmNlLCBzdG9yaW5nIHNlcmlhbGl6ZWQgaXRlcmF0aW9uIHZhbHVlcy4gIElmIHRoZVxuICogc3RvcmFnZU5vZGUncyBgc2V0VmFsdWVgIG9wZXJhdGlvbiByZWplY3RzLCB0aGUgaXRlcmF0aW9uIHdpbGwgYmUgdGVybWluYXRlZC5cbiAqXG4gKiBSZXR1cm5zIGEgU3RvcmVkU3Vic2NyaXB0aW9uIHRoYXQgY2FuIGJlIHVzZWQgYnkgYSBjbGllbnQgdG8gZGlyZWN0bHkgZm9sbG93XG4gKiB0aGUgaXRlcmF0aW9uIHRoZW1zZWx2ZXMsIG9yIG9idGFpbiBpbmZvcm1hdGlvbiB0byBzdWJzY3JpYmUgdG8gdGhlIHN0b3JlZFxuICogZGF0YSBvdXQtb2YtYmFuZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtTdWJzY3JpcHRpb248VD59IHN1YnNjcmlwdGlvblxuICogQHBhcmFtIHtFUmVmPFN0b3JhZ2VOb2RlPn0gW3N0b3JhZ2VOb2RlXVxuICogQHBhcmFtIHtFUmVmPFJldHVyblR5cGU8dHlwZW9mIG1ha2VNYXJzaGFsPj59IFttYXJzaGFsbGVyXVxuICogQHJldHVybnMge1N0b3JlZFN1YnNjcmlwdGlvbjxUPn1cbiAqLyRo4oCNX29uY2UubWFrZVN0b3JlZFN1YnNjcmliZXIobWFrZVN0b3JlZFN1YnNjcmliZXIpO1xuY29uc3QgICAgICAgIG1ha2VTdG9yZWRTdWJzY3JpcHRpb249KFxuc3Vic2NyaXB0aW9uLFxuc3RvcmFnZU5vZGUsXG5tYXJzaGFsbGVyPW1ha2VNYXJzaGFsKHVuZGVmaW5lZCx1bmRlZmluZWQse1xubWFyc2hhbFNhdmVFcnJvcjooKT0+eyB9fSkpPT5cblxue1xuLyoqIEB0eXBlIHtVbnNlcmlhbGl6ZXJ9ICovXG5jb25zdCB1bnNlcmlhbGl6ZXI9RmFyKCd1bnNlcmlhbGl6ZXInLHtcbnVuc2VyaWFsaXplOihkYXRhKT0+RShtYXJzaGFsbGVyKS51bnNlcmlhbGl6ZShkYXRhKX0pO1xuXG5cbi8qIEFib3J0IHRoZSBpdGVyYXRpb24gb24gdGhlIG5leHQgb2JzZXJ2YXRpb24gaWYgdGhlIHB1Ymxpc2hlciBldmVyIGZhaWxzLiovXG5sZXQgcHVibGlzaEZhaWxlZD1mYWxzZTtcbmxldCBwdWJsaXNoRXhjZXB0aW9uO1xuXG5jb25zdCBmYWlsPShlcnIpPT57XG5wdWJsaXNoRmFpbGVkPXRydWU7XG5wdWJsaXNoRXhjZXB0aW9uPWVycjtcbiB9O1xuXG4vKiBNdXN0ICpub3QqIGJlIGFuIGFzeW5jIGZ1bmN0aW9uLCBiZWNhdXNlIGl0IHNvbWV0aW1lcyBtdXN0IHRocm93IHRvIGFib3J0Ki9cbi8qIHRoZSBpdGVyYXRpb24uKi9cbmNvbnN0IHB1Ymxpc2hWYWx1ZT0ob2JqKT0+e1xuYXNzZXJ0KHN0b3JhZ2VOb2RlKTtcbmlmKHB1Ymxpc2hGYWlsZWQpe1xuLyogVG8gcHJvcGVybHkgYWJvcnQgdGhlIGl0ZXJhdGlvbiwgdGhpcyBtdXN0IGJlIGEgc3luY2hyb25vdXMgZXhjZXB0aW9uLiovXG50aHJvdyBwdWJsaXNoRXhjZXB0aW9uO1xuIH1cblxuLyogUHVibGlzaCB0aGUgdmFsdWUsIGNhcHR1cmluZyBhbnkgZXJyb3IuKi9cbkUobWFyc2hhbGxlcikuXG5zZXJpYWxpemUob2JqKS5cbnRoZW4oKHNlcmlhbGl6ZWQpPT57XG5jb25zdCBlbmNvZGVkPUpTT04uc3RyaW5naWZ5KHNlcmlhbGl6ZWQpO1xucmV0dXJuIEUoc3RvcmFnZU5vZGUpLnNldFZhbHVlKGVuY29kZWQpO1xuIH0pLlxuY2F0Y2goZmFpbCk7XG4gfTtcblxuaWYoc3RvcmFnZU5vZGUpe1xuLyogU3RhcnQgcHVibGlzaGluZyB0aGUgc291cmNlLiovXG5vYnNlcnZlSXRlcmF0aW9uKHN1YnNjcmlwdGlvbix7XG51cGRhdGVTdGF0ZTpwdWJsaXNoVmFsdWUsXG5maW5pc2g6cHVibGlzaFZhbHVlfSkuXG5jYXRjaChmYWlsKTtcbiB9XG5cbi8qKiBAdHlwZSB7U3RvcmVkU3Vic2NyaXB0aW9uPFQ+fSAqL1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIC0tIGRpZmZlcmVudCBwZXIgcGFja2FnZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQ2MjAqL1xuLyogQHRzLWlnbm9yZSBnZXRTdG9yZUtleSB0eXBlIGRvZXMgbm90IGhhdmUgYHN1YnNjcmlwdGlvbmAqL1xuY29uc3Qgc3RvcmVzdWI9RmFyKCdTdG9yZWRTdWJzY3JpcHRpb24nLHtcbmdldFN0b3JlS2V5OmFzeW5jKCk9PntcbmlmKCFzdG9yYWdlTm9kZSl7XG5yZXR1cm4gaGFyZGVuKHtzdWJzY3JpcHRpb259KTtcbiB9XG5jb25zdCBzdG9yZUtleT1hd2FpdCBFKHN0b3JhZ2VOb2RlKS5nZXRTdG9yZUtleSgpO1xucmV0dXJuIGhhcmRlbih7Li4uc3RvcmVLZXksc3Vic2NyaXB0aW9ufSk7XG4gfSxcbmdldFVuc2VyaWFsaXplcjooKT0+dW5zZXJpYWxpemVyLFxuZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHM6KCk9Plxuc3Vic2NyaXB0aW9uLmdldFNoYXJhYmxlU3Vic2NyaXB0aW9uSW50ZXJuYWxzKCksXG5bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOigpPT5zdWJzY3JpcHRpb25bU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCl9KTtcblxucmV0dXJuIHN0b3Jlc3ViO1xuIH07JGjigI1fb25jZS5tYWtlU3RvcmVkU3Vic2NyaXB0aW9uKG1ha2VTdG9yZWRTdWJzY3JpcHRpb24pO1xuaGFyZGVuKG1ha2VTdG9yZWRTdWJzY3JpcHRpb24pO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIHVzZSBTdG9yZWRQdWJsaXNoS2l0XG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gU3RvcmVkUHVibGlzaGVyS2l0XG4gKiBAcHJvcGVydHkge1N0b3JlZFN1YnNjcmlwdGlvbjxUPn0gc3Vic2NyaWJlclxuICogQHByb3BlcnR5IHtJdGVyYXRpb25PYnNlcnZlcjxUPn0gcHVibGlzaGVyXG4gKi9cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBpbmNvbXBhdGlibGUgd2l0aCBkdXJhYmlsaXR5OyBpbnN0ZWFkIGhhbmRsZSB2c3RvcmFnZSBlcGhlbWVyYWxseSBvbiBhIGR1cmFibGUgUHVibGlzaEtpdFxuICpcbiAqIEB0ZW1wbGF0ZSBbVD11bmtub3duXVxuICogQHBhcmFtIHtFUmVmPFN0b3JhZ2VOb2RlPn0gW3N0b3JhZ2VOb2RlXVxuICogQHBhcmFtIHtFUmVmPE1hcnNoYWxsZXI+fSBbbWFyc2hhbGxlcl1cbiAqIEBwYXJhbSB7c3RyaW5nfSBbY2hpbGRQYXRoXVxuICogQHJldHVybnMge1N0b3JlZFB1Ymxpc2hlcktpdDxUPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VTdG9yZWRQdWJsaXNoZXJLaXQ9KHN0b3JhZ2VOb2RlLG1hcnNoYWxsZXIsY2hpbGRQYXRoKT0+e1xuY29uc3R7cHVibGljYXRpb24sc3Vic2NyaXB0aW9ufT1tYWtlU3Vic2NyaXB0aW9uS2l0KCk7XG5cbmlmKHN0b3JhZ2VOb2RlJiZjaGlsZFBhdGgpe1xuc3RvcmFnZU5vZGU9RShzdG9yYWdlTm9kZSkubWFrZUNoaWxkTm9kZShjaGlsZFBhdGgpO1xuIH1cblxuLyogd3JhcCB0aGUgc3Vic2NyaXB0aW9uIHRvIHRlZSBldmVudHMgdG8gc3RvcmFnZSwgcmVwZWF0aW5nIHRvIHRoaXMgYHN1YnNjcmliZXJgKi9cbmNvbnN0IHN1YnNjcmliZXI9bWFrZVN0b3JlZFN1YnNjcmlwdGlvbihcbnN1YnNjcmlwdGlvbixcbnN0b3JhZ2VOb2RlLFxubWFyc2hhbGxlcik7XG5cblxucmV0dXJue1xucHVibGlzaGVyOnB1YmxpY2F0aW9uLFxuc3Vic2NyaWJlcn07XG5cbiB9O1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIGluY29tcGF0aWJsZSB3aXRoIGR1cmFiaWxpdHk7IGluc3RlYWQgaGFuZGxlIHZzdG9yYWdlIGVwaGVtZXJhbGx5IG9uIGEgZHVyYWJsZSBQdWJsaXNoS2l0XG4gKlxuICogTGlrZSBtYWtlUHVibGlzaEtpdCB0aGlzIG1ha2VzIGEgYHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH1gIHBhaXIgZm9yIGRvaW5nIGVmZmljaWVudFxuICogZGlzdHJpYnV0ZWQgcHViL3N1YiBzdXBwb3J0aW5nIGJvdGggXCJlYWNoXCIgYW5kIFwibGF0ZXN0XCIgaXRlcmF0aW9uXG4gKiBvZiBwdWJsaXNoZWQgdmFsdWVzLlxuICpcbiAqIFdoYXQncyBkaWZmZXJlbnQgaXMgYHN1YnNjcmliZXJgIHRlZXMgcmVjb3Jkcywgd3JpdGluZyBvdXQgdG8gc3RvcmFnZU5vZGUuXG4gKlxuICogQHRlbXBsYXRlIFtUPXVua25vd25dXG4gKiBAcGFyYW0ge0VSZWY8U3RvcmFnZU5vZGU+fSBzdG9yYWdlTm9kZVxuICogQHBhcmFtIHtFUmVmPE1hcnNoYWxsZXI+fSBtYXJzaGFsbGVyXG4gKiBAcmV0dXJucyB7U3RvcmVkUHVibGlzaEtpdDxUPn1cbiAqLyRo4oCNX29uY2UubWFrZVN0b3JlZFB1Ymxpc2hlcktpdChtYWtlU3RvcmVkUHVibGlzaGVyS2l0KTtcbmNvbnN0ICAgICAgICBtYWtlU3RvcmVkUHVibGlzaEtpdD0oc3RvcmFnZU5vZGUsbWFyc2hhbGxlcik9PntcbmNvbnN0e3B1Ymxpc2hlcixzdWJzY3JpYmVyfT1tYWtlUHVibGlzaEtpdCgpO1xuXG5yZXR1cm57XG5wdWJsaXNoZXIsXG4vKiB3cmFwIHRoZSBzdWJzY3JpYmVyIHRvIHRlZSBldmVudHMgdG8gc3RvcmFnZSovXG5zdWJzY3JpYmVyOm1ha2VTdG9yZWRTdWJzY3JpYmVyKHN1YnNjcmliZXIsc3RvcmFnZU5vZGUsbWFyc2hhbGxlcil9O1xuXG4gfTskaOKAjV9vbmNlLm1ha2VTdG9yZWRQdWJsaXNoS2l0KG1ha2VTdG9yZWRQdWJsaXNoS2l0KTtcbmhhcmRlbihtYWtlU3RvcmVkUHVibGlzaEtpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZm9yRWFjaFB1YmxpY2F0aW9uUmVjb3JkIjpbImZvckVhY2hQdWJsaWNhdGlvblJlY29yZCJdLCJtYWtlU3RvcmVkU3Vic2NyaWJlciI6WyJtYWtlU3RvcmVkU3Vic2NyaWJlciJdLCJtYWtlU3RvcmVkU3Vic2NyaXB0aW9uIjpbIm1ha2VTdG9yZWRTdWJzY3JpcHRpb24iXSwibWFrZVN0b3JlZFB1Ymxpc2hlcktpdCI6WyJtYWtlU3RvcmVkUHVibGlzaGVyS2l0Il0sIm1ha2VTdG9yZWRQdWJsaXNoS2l0IjpbIm1ha2VTdG9yZWRQdWJsaXNoS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADDTPAY0GAAANBgAACgAAABAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvc3Vic2NyaWJlLmpzeyJpbXBvcnRzIjpbIi4vdHlwZXMtYW1iaWVudC5qcyIsIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbInN1YnNjcmliZSIsInN1YnNjcmliZUVhY2giLCJzdWJzY3JpYmVMYXRlc3QiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxGYXI7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXSxbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5jb25zdCBzaW5rPSgpPT57IH07XG5cbi8qKlxuICogQ3JlYXRlIGEgbmVhciBpdGVyYWJsZSB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgcG90ZW50aWFsbHkgZmFyIG9uZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFUmVmPEFzeW5jSXRlcmFibGU8VD4+fSBpdFBcbiAqL1xuY29uc3QgICAgICAgIHN1YnNjcmliZT0oaXRQKT0+XG5GYXIoJ0FzeW5jSXRlcmFibGUnLHtcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9PntcbmNvbnN0IGl0PUUoaXRQKVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKTtcbnJldHVybiBGYXIoJ0FzeW5jSXRlcmF0b3InLHtcbm5leHQ6YXN5bmMoKT0+RShpdCkubmV4dCgpfSk7XG5cbiB9fSk7XG5cblxuLyoqXG4gKiBBc3luY3Jvbm91c2x5IGl0ZXJhdGVzIG92ZXIgdGhlIGNvbnRlbnRzIG9mIGEgUHVibGljYXRpb25SZWNvcmQgY2hhaW4gYXMgdGhleVxuICogYXBwZWFyLiAgVGhpcyBpdGVyYXRpb24gbXVzdCBkcm9wIHBhcnRzIG9mIHB1YmxpY2F0aW9uIHJlY29yZHMgdGhhdCBhcmUgbm9cbiAqIGxvbmdlciBuZWVkZWQgc28gdGhleSBjYW4gYmUgZ2FyYmFnZSBjb2xsZWN0ZWQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxQdWJsaWNhdGlvblJlY29yZDxUPj59IHB1Ykxpc3RcbiAqIEByZXR1cm5zIHtGb3JrYWJsZUFzeW5jSXRlcmF0b3I8VCwgVD59XG4gKi8kaOKAjV9vbmNlLnN1YnNjcmliZShzdWJzY3JpYmUpO1xuY29uc3QgbWFrZUVhY2hJdGVyYXRvcj0ocHViTGlzdCk9Pntcbi8qIFRvIHVuZGVyc3RhbmQgdGhlIGltcGxlbWVudGF0aW9uLCBzdGFydCB3aXRoKi9cbi8qIGh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDE2MDQwNDEyMjI1MC9odHRwOi8vd2lraS5lY21hc2NyaXB0Lm9yZy9kb2t1LnBocD9pZD1zdHJhd21hbjpjb25jdXJyZW5jeSNpbmZpbml0ZV9xdWV1ZSovXG5yZXR1cm4gRmFyKCdFYWNoSXRlcmF0b3InLHtcbm5leHQ6KCk9PntcbmNvbnN0IHJlc3VsdFA9RS5nZXQocHViTGlzdCkuaGVhZDtcbnB1Ykxpc3Q9RS5nZXQocHViTGlzdCkudGFpbDtcbi8qIFdlIGV4cGVjdCB0aGUgdGFpbCB0byBiZSB0aGUgXCJjYW5ub3QgcmVhZCBwYXN0IGVuZFwiIGVycm9yIGF0IHRoZSBlbmQqL1xuLyogb2YgdGhlIGhhcHB5IHBhdGguKi9cbi8qIFNpbmNlIHdlIGFyZSB3cmFwcGluZyB0aGF0IGVycm9yIHdpdGggZXZlbnR1YWwgc2VuZCwgd2Ugc2luayB0aGUqL1xuLyogcmVqZWN0aW9uIGhlcmUgdG9vIHNvIGl0IGRvZXNuJ3QgYmVjb21lIGFuIGludmFsaWQgdW5oYW5kbGVkIHJlamVjdGlvbiovXG4vKiBsYXRlci4qL1xudm9pZCBFLndoZW4ocHViTGlzdCxzaW5rLHNpbmspO1xucmV0dXJuIHJlc3VsdFA7XG4gfSxcbmZvcms6KCk9Pm1ha2VFYWNoSXRlcmF0b3IocHViTGlzdCl9KTtcblxuIH07XG5cbi8qKlxuICogR2l2ZW4gYSBsb2NhbCBvciByZW1vdGUgc3Vic2NyaWJlciwgcmV0dXJucyBhIGxvY2FsIEFzeW5jSXRlcmFibGUgd2hpY2hcbiAqIHByb3ZpZGVzIFwicHJlZml4IGxvc3N5XCIgaXRlcmF0aW9ucyBvZiB0aGUgdW5kZXJseWluZyBQdWJsaWNhdGlvbkxpc3QuXG4gKiBCeSBcInByZWZpeCBsb3NzeVwiLCB3ZSBtZWFuIHRoYXQgeW91IG1heSBtaXNzIGV2ZXJ5dGhpbmcgcHVibGlzaGVkIGJlZm9yZVxuICogeW91IGFzayB0aGUgcmV0dXJuZWQgaXRlcmFibGUgZm9yIGFuIGl0ZXJhdG9yLiBCdXQgdGhlIHJldHVybmVkIGl0ZXJhdG9yXG4gKiB3aWxsIGVudW1lcmF0ZSBlYWNoIHRoaW5nIHB1Ymxpc2hlZCBmcm9tIHRoYXQgaXRlcmF0b3IncyBzdGFydGluZyBwb2ludC5cbiAqXG4gKiBJZiB0aGUgdW5kZXJseWluZyBQdWJsaWNhdGlvbkxpc3QgaXMgdGVybWluYXRlZCwgdGhhdCB0ZXJtaW5hbCB2YWx1ZSB3aWxsIGJlXG4gKiByZXBvcnRlZCBsb3NzbGVzc2x5LlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8RWFjaFRvcGljPFQ+Pn0gdG9waWNcbiAqL1xuY29uc3QgICAgICAgIHN1YnNjcmliZUVhY2g9KHRvcGljKT0+e1xuY29uc3QgaXRlcmFibGU9RmFyKCdFYWNoSXRlcmFibGUnLHtcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9PntcbmNvbnN0IHB1Ykxpc3Q9RSh0b3BpYykuc3Vic2NyaWJlQWZ0ZXIoKTtcbnJldHVybiBtYWtlRWFjaEl0ZXJhdG9yKHB1Ykxpc3QpO1xuIH19KTtcblxucmV0dXJuIGl0ZXJhYmxlO1xuIH07JGjigI1fb25jZS5zdWJzY3JpYmVFYWNoKHN1YnNjcmliZUVhY2gpO1xuaGFyZGVuKHN1YnNjcmliZUVhY2gpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8TGF0ZXN0VG9waWM8VD4+fSB0b3BpY1xuICogQHBhcmFtIHtiaWdpbnR9IFtsb2NhbFVwZGF0ZUNvdW50XVxuICogQHBhcmFtIHtJdGVyYXRvclJldHVyblJlc3VsdDxUPn0gW3Rlcm1pbmFsUmVzdWx0XVxuICogQHJldHVybnMge0ZvcmthYmxlQXN5bmNJdGVyYXRvcjxULCBUPn1cbiAqL1xuY29uc3QgY2xvbmVMYXRlc3RJdGVyYXRvcj0odG9waWMsbG9jYWxVcGRhdGVDb3VudCx0ZXJtaW5hbFJlc3VsdCk9PntcbmxldCBtdXRleD1Qcm9taXNlLnJlc29sdmUoKTtcblxuLyoqXG4gKiBSZXF1ZXN0IHRoZSBuZXh0IHVwZGF0ZSByZWNvcmQgZnJvbSB0aGUgdG9waWMsIHVwZGF0aW5nIG91ciBsb2NhbCBzdGF0ZSxcbiAqIGFuZCBjb252ZXJ0IGl0IHRvIGFuIGl0ZXJhdG9yIHJlc3VsdC5cbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJdGVyYXRvclJlc3VsdDxULCBUPj59XG4gKi9cbmNvbnN0IG1heWJlUmVxdWVzdE5leHRSZXN1bHQ9YXN5bmMoKT0+e1xuaWYodGVybWluYWxSZXN1bHQpe1xuLyogV2UndmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSB0b3BpYywganVzdCBrZWVwIHJldHVybmluZyB0aGUgbGFzdCByZXN1bHQqL1xuLyogd2l0aG91dCBmdXJ0aGVyIHJlcXVlc3RzLiovXG5yZXR1cm4gdGVybWluYWxSZXN1bHQ7XG4gfVxuXG4vKiBTZW5kIHRoZSBuZXh0IHJlcXVlc3Qgbm93LCBza2lwcGluZyBwYXN0IGludGVybWVkaWF0ZSB1cGRhdGVzLiovXG5jb25zdHt2YWx1ZSx1cGRhdGVDb3VudH09YXdhaXQgRSh0b3BpYykuZ2V0VXBkYXRlU2luY2UoXG5sb2NhbFVwZGF0ZUNvdW50KTtcblxuLyogTWFrZSBzdXJlIHRoZSBuZXh0IHJlcXVlc3QgaXMgZm9yIGEgZnJlc2hlciB2YWx1ZS4qL1xubG9jYWxVcGRhdGVDb3VudD11cGRhdGVDb3VudDtcblxuLyogTWFrZSBhbiBJdGVyYXRvclJlc3VsdC4qL1xuaWYodXBkYXRlQ291bnQ9PT11bmRlZmluZWQpe1xudGVybWluYWxSZXN1bHQ9aGFyZGVuKHtkb25lOnRydWUsdmFsdWV9KTtcbnJldHVybiB0ZXJtaW5hbFJlc3VsdDtcbiB9XG5yZXR1cm4gaGFyZGVuKHtkb25lOmZhbHNlLHZhbHVlfSk7XG4gfTtcblxucmV0dXJuIEZhcignTGF0ZXN0SXRlcmF0b3InLHtcbmZvcms6KCk9PmNsb25lTGF0ZXN0SXRlcmF0b3IodG9waWMsbG9jYWxVcGRhdGVDb3VudCx0ZXJtaW5hbFJlc3VsdCksXG5uZXh0OmFzeW5jKCk9Pntcbi8qIEluIHRoaXMgYWRhcHRvciwgb25jZSBgbmV4dCgpYCBpcyBjYWxsZWQgYW5kIHJldHVybnMgYW4gdW5yZXNvbHZlZCovXG4vKiBwcm9taXNlLCBmdXJ0aGVyIGBuZXh0KClgIGNhbGxzIHdpbGwgYWxzbyByZXR1cm4gdW5yZXNvbHZlZCBwcm9taXNlcyovXG4vKiBidXQgZWFjaCBjYWxsIHdpbGwgbm90IHRyaWdnZXIgYW5vdGhlciBgdG9waWNgIHJlcXVlc3QgdW50aWwgdGhlIHByaW9yKi9cbi8qIG9uZSBoYXMgc2V0dGxlZC4qL1xuLyoqL1xuLyogVGhpcyBsaW5lYXIgcXVldWVpbmcgYmVoYXZpb3IgaXMgb25seSBuZWVkZWQgZm9yIGNvZGUgdGhhdCB1c2VzIHRoZSovXG4vKiBhc3luYyBpdGVyYXRvciBwcm90b2NvbCBleHBsaWNpdGx5LiBXaGVuIHRoaXMgYXN5bmMgaXRlcmF0b3IgaXMqL1xuLyogY29uc3VtZWQgYnkgYSBmb3IvYXdhaXQvb2YgbG9vcCwgYG5leHQoKWAgd2lsbCBvbmx5IGJlIGNhbGxlZCBhZnRlciB0aGUqL1xuLyogcHJvbWlzZSBmb3IgdGhlIHByZXZpb3VzIGl0ZXJhdGlvbiByZXN1bHQgaGFzIGZ1bGZpbGxlZC4gSWYgaXQgZnVsZmlsbHMqL1xuLyogd2l0aCBgZG9uZTogdHJ1ZWAsIHRoZSBmb3IvYXdhaXQvb2YgbG9vcCB3aWxsIG5ldmVyIGNhbGwgYG5leHQoKWAqL1xuLyogYWdhaW4uKi9cbi8qKi9cbi8qIFNlZSovXG4vKiBodHRwczovLzJhbGl0eS5jb20vMjAxNi8xMC9hc3luY2hyb25vdXMtaXRlcmF0aW9uLmh0bWwjcXVldWluZy1uZXh0KCktaW52b2NhdGlvbnMqL1xuLyogZm9yIGFuIGV4cGxpY2l0IHVzZSB0aGF0IHNlbmRzIGBuZXh0KClgIHdpdGhvdXQgd2FpdGluZy4qL1xuXG5pZih0ZXJtaW5hbFJlc3VsdCl7XG4vKiBXZSd2ZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIHRvcGljLCBqdXN0IGtlZXAgcmV0dXJuaW5nIHRoZSBsYXN0Ki9cbi8qIHJlc3VsdC4qL1xucmV0dXJuIHRlcm1pbmFsUmVzdWx0O1xuIH1cblxuLyogQkVHSU4gQ1JJVElDQUwgU0VDVElPTiAtIHN5bmNocm9ub3VzbHkgZW5xdWV1ZSBhbmQgcmVhc3NpZ24gYG11dGV4YCovXG4vKiovXG4vKiBVc2UgYG11dGV4YCB0byBlbnN1cmUgdGhhdCB3ZSBoYXZlIG5vIG1vcmUgdGhhbiBhIHNpbmdsZSByZXF1ZXN0IGluKi9cbi8qIGZsaWdodC4qL1xuY29uc3QgbmV4dFJlc3VsdD1tdXRleC50aGVuKG1heWJlUmVxdWVzdE5leHRSZXN1bHQpO1xubXV0ZXg9bmV4dFJlc3VsdC50aGVuKHNpbmssc2luayk7XG4vKiBFTkQgQ1JJVElDQUwgU0VDVElPTiovXG5cbnJldHVybiBuZXh0UmVzdWx0O1xuIH19KTtcblxuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7RVJlZjxMYXRlc3RUb3BpYzxUPj59IHRvcGljXG4gKiBAcmV0dXJucyB7Rm9ya2FibGVBc3luY0l0ZXJhdG9yPFQsIFQ+fVxuICovXG5jb25zdCBtYWtlTGF0ZXN0SXRlcmF0b3I9KHRvcGljKT0+Y2xvbmVMYXRlc3RJdGVyYXRvcih0b3BpYyk7XG5cbi8qKlxuICogR2l2ZW4gYSBsb2NhbCBvciByZW1vdGUgc3Vic2NyaWJlciwgcmV0dXJucyBhIGxvY2FsIEFzeW5jSXRlcmFibGUgd2hpY2hcbiAqIHByb3ZpZGVzIFwibG9zc3lcIiBpdGVyYXRpb25zIG9mIHRoZSB1bmRlcmx5aW5nIFB1YmxpY2F0aW9uTGlzdC5cbiAqIEJ5IFwibG9zc3lcIiwgd2UgbWVhbiB0aGF0IHlvdSBtYXkgbWlzcyBhbnkgcHVibGlzaGVkIHN0YXRlIGlmIGEgbW9yZVxuICogcmVjZW50IHB1Ymxpc2hlZCBzdGF0ZSBjYW4gYmUgcmVwb3J0ZWQgaW5zdGVhZC5cbiAqXG4gKiBJZiB0aGUgdW5kZXJseWluZyBQdWJsaWNhdGlvbkxpc3QgaXMgdGVybWluYXRlZCwgdGhhdCB0ZXJtaW5hbCB2YWx1ZSB3aWxsIGJlXG4gKiByZXBvcnRlZCBsb3NzbGVzc2x5LlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8TGF0ZXN0VG9waWM8VD4+fSB0b3BpY1xuICovXG5jb25zdCAgICAgICAgc3Vic2NyaWJlTGF0ZXN0PSh0b3BpYyk9PntcbmNvbnN0IGl0ZXJhYmxlPUZhcignTGF0ZXN0SXRlcmFibGUnLHtcbltTeW1ib2wuYXN5bmNJdGVyYXRvcl06KCk9Pm1ha2VMYXRlc3RJdGVyYXRvcih0b3BpYyl9KTtcblxucmV0dXJuIGl0ZXJhYmxlO1xuIH07JGjigI1fb25jZS5zdWJzY3JpYmVMYXRlc3Qoc3Vic2NyaWJlTGF0ZXN0KTtcbmhhcmRlbihzdWJzY3JpYmVMYXRlc3QpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InN1YnNjcmliZSI6WyJzdWJzY3JpYmUiXSwic3Vic2NyaWJlRWFjaCI6WyJzdWJzY3JpYmVFYWNoIl0sInN1YnNjcmliZUxhdGVzdCI6WyJzdWJzY3JpYmVMYXRlc3QiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAApIa3j6wLAACsCwAAKQAAAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9zdWJzY3JpYmVyLmpzeyJpbXBvcnRzIjpbIi4vcHVibGlzaC1raXQuanMiLCIuL3N1YnNjcmliZS5qcyIsIi4vdG9waWMuanMiLCIuL3R5cGVzLWFtYmllbnQuanMiLCJAZW5kby9mYXIiXSwiZXhwb3J0cyI6WyJtYWtlU3Vic2NyaXB0aW9uIiwibWFrZVN1YnNjcmlwdGlvbktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBFLEZhcixzdWJzY3JpYmVFYWNoLG1ha2VQdWJsaXNoS2l0LG1ha2VQaW5uZWRIaXN0b3J5VG9waWM7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZmFyXCIsIFtbXCJFXCIsIFskaOKAjV9hID0+IChFID0gJGjigI1fYSldXSxbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV1dXSxbXCIuL3N1YnNjcmliZS5qc1wiLCBbW1wic3Vic2NyaWJlRWFjaFwiLCBbJGjigI1fYSA9PiAoc3Vic2NyaWJlRWFjaCA9ICRo4oCNX2EpXV1dXSxbXCIuL3B1Ymxpc2gta2l0LmpzXCIsIFtbXCJtYWtlUHVibGlzaEtpdFwiLCBbJGjigI1fYSA9PiAobWFrZVB1Ymxpc2hLaXQgPSAkaOKAjV9hKV1dXV0sW1wiLi90b3BpYy5qc1wiLCBbW1wibWFrZVBpbm5lZEhpc3RvcnlUb3BpY1wiLCBbJGjigI1fYSA9PiAobWFrZVBpbm5lZEhpc3RvcnlUb3BpYyA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVzLWFtYmllbnQuanNcIiwgW11dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0VSZWY8RWFjaFRvcGljPFQ+Pn0gdG9waWNcbiAqIEByZXR1cm5zIHtTdWJzY3JpcHRpb248VD59XG4gKi9cbmNvbnN0IG1ha2VTdWJzY3JpcHRpb249KHRvcGljKT0+e1xuY29uc3Qgc3Vic2NyaXB0aW9uPUZhcignU3Vic2NyaXB0aW9uJyx7XG4uLi5zdWJzY3JpYmVFYWNoKHRvcGljKSxcbnN1YnNjcmliZUFmdGVyOmFzeW5jKHB1Ymxpc2hDb3VudCk9PkUodG9waWMpLnN1YnNjcmliZUFmdGVyKHB1Ymxpc2hDb3VudCksXG5cbi8qKlxuICogVXNlIHRoaXMgdG8gZGlzdHJpYnV0ZSBhIFN1YnNjcmlwdGlvbiBlZmZpY2llbnRseSBvdmVyIHRoZSBuZXR3b3JrLFxuICogYnkgb2J0YWluaW5nIHRoaXMgZnJvbSB0aGUgU3Vic2NyaXB0aW9uIHRvIGJlIHJlcGxpY2F0ZWQsIGFuZCBhcHBseWluZ1xuICogYG1ha2VTdWJzY3JpcHRpb25gIHRvIGl0IGF0IHRoZSBuZXcgc2l0ZSB0byBnZXQgYW4gZXF1aXZhbGVudCBsb2NhbFxuICogU3Vic2NyaXB0aW9uIGF0IHRoYXQgc2l0ZS5cbiAqL1xuZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHM6YXN5bmMoKT0+dG9waWMsXG5cbmdldFN0b3JlS2V5OigpPT5oYXJkZW4oe3N1YnNjcmlwdGlvbn0pfSk7XG5cbnJldHVybiBzdWJzY3JpcHRpb247XG4gfTskaOKAjV9vbmNlLm1ha2VTdWJzY3JpcHRpb24obWFrZVN1YnNjcmlwdGlvbik7XG5oYXJkZW4obWFrZVN1YnNjcmlwdGlvbik7XG5cblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBQcm9kdWNlcnMgc2hvdWxkIHVzZVxuICogYGBganNcbiAqIGNvbnN0IHsgcHVibGlzaGVyLCBzdWJzY3JpYmVyIH0gPSBtYWtlUHVibGlzaEtpdCgpO1xuICogY29uc3QgdG9waWMgPSBtYWtlUGlubmVkSGlzdG9yeVRvcGljKHN1YnNjcmliZXIpO1xuICogYGBgXG4gKiBpbnN0ZWFkLCB3aGljaCBtYWtlcyBpdCBjbGVhcmVyIHRoYXQgYWxsIHRoZSBzdWJzY3JpYmVyJ3MgaGlzdG9yeSBpc1xuICogcmV0YWluZWQsIHByZXZlbnRpbmcgR0MuICBQb3RlbnRpYWxseSByZW1vdGUgY29uc3VtZXJzIHVzZVxuICogYGBganNcbiAqIGZvciBhd2FpdCAoY29uc3QgdmFsdWUgb2Ygc3Vic2NyaWJlRWFjaCh0b3BpYykpIHsgLi4uIH1cbiAqIGBgYFxuICpcbiAqIE1ha2VzIGEgYHsgcHVibGljYXRpb24sIHN1YnNjcmlwdGlvbiB9YCBmb3IgZG9pbmcgbG9zc2xlc3MgZWZmaWNpZW50XG4gKiBkaXN0cmlidXRlZCBwdWIvc3ViLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcmV0dXJucyB7U3Vic2NyaXB0aW9uUmVjb3JkPFQ+fVxuICovXG5jb25zdCBtYWtlU3Vic2NyaXB0aW9uS2l0PSgpPT57XG5jb25zdHtwdWJsaXNoZXIsc3Vic2NyaWJlcn09bWFrZVB1Ymxpc2hLaXQoKTtcblxuLyogVGhlIHB1Ymxpc2gga2l0IHN1YnNjcmliZXIgaXMgcHJlZml4LWxvc3N5LCBzbyBtYWtpbmcgKnRoaXMqIHN1YnNjcmliZXIgY29tcGxldGVseSovXG4vKiBsb3NzbGVzcyBmcm9tIGluaXRpYWxpc2F0aW9uIHJlcXVpcmVzIHBpbm5pbmcgdGhlIGZvcm1lcidzIGhpc3RvcnkuKi9cblxuY29uc3QgcGlubmVkSGlzdG9yeVRvcGljPW1ha2VQaW5uZWRIaXN0b3J5VG9waWMoc3Vic2NyaWJlcik7XG5jb25zdCBzdWJzY3JpcHRpb249bWFrZVN1YnNjcmlwdGlvbihwaW5uZWRIaXN0b3J5VG9waWMpO1xuXG4vKiogQHR5cGUge0l0ZXJhdGlvbk9ic2VydmVyPFQ+fSAqL1xuY29uc3QgcHVibGljYXRpb249RmFyKCdwdWJsaWNhdGlvbicse1xudXBkYXRlU3RhdGU6KG5vbkZpbmFsVmFsdWUpPT5wdWJsaXNoZXIucHVibGlzaChub25GaW5hbFZhbHVlKSxcbmZpbmlzaDooY29tcGxldGlvbik9PnB1Ymxpc2hlci5maW5pc2goY29tcGxldGlvbiksXG5mYWlsOihyZWFzb24pPT5wdWJsaXNoZXIuZmFpbChyZWFzb24pfSk7XG5cblxucmV0dXJuIGhhcmRlbih7cHVibGljYXRpb24sc3Vic2NyaXB0aW9ufSk7XG4gfTskaOKAjV9vbmNlLm1ha2VTdWJzY3JpcHRpb25LaXQobWFrZVN1YnNjcmlwdGlvbktpdCk7XG5oYXJkZW4obWFrZVN1YnNjcmlwdGlvbktpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVN1YnNjcmlwdGlvbiI6WyJtYWtlU3Vic2NyaXB0aW9uIl0sIm1ha2VTdWJzY3JpcHRpb25LaXQiOlsibWFrZVN1YnNjcmlwdGlvbktpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAz/HkY8wUAAPMFAAAkAAAAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL3RvcGljLmpzeyJpbXBvcnRzIjpbIi4vdHlwZXMtYW1iaWVudC5qcyIsIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbIm1ha2VQaW5uZWRIaXN0b3J5VG9waWMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiLi90eXBlcy1hbWJpZW50LmpzXCIsIFtdXV0pOyAgIFxuXG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgQSBwaW5uZWQtaGlzdG9yeSB0b3BpYyBwcmVzZXJ2ZXMgYWxsIG9mIGl0cyBwdWJsaXNoZWQgdmFsdWVzIGluXG4gKiBtZW1vcnkuICBVc2UgYSBwcmVmaXgtbG9zc3kgbWFrZVB1Ymxpc2hLaXQgaW5zdGVhZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtFYWNoVG9waWM8VD4gJiBMYXRlc3RUb3BpYzxUPn0gdG9waWMgbmVlZHMgdG8gYmUgbmVhciBpbiBvcmRlciB0b1xuICogcHJlc2VydmUgc3Vic2NyaXB0aW9uIHRpbWluZ3MuICBUT0RPOiBkcm9wIExhdGVzdFRvcGljPFQ+IHJlcXVpcmVtZW50XG4gKiBAcmV0dXJucyB7RWFjaFRvcGljPFQ+ICYgTGF0ZXN0VG9waWM8VD59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlUGlubmVkSGlzdG9yeVRvcGljPSh0b3BpYyk9Pntcbi8qIFN1Y2ggbG9zc2xlc3NuZXNzIGluaGliaXRzIEdDLCB3aGljaCBpcyB3aHkgd2UncmUgbW92aW5nIGF3YXkgZnJvbSBpdC4qL1xuXG4vKiBXZSBuZWVkIHRvIHRha2UgYW4gaW1tZWRpYXRlIHNuYXBzaG90IG9mIHRoZSB0b3BpYydzIGN1cnJlbnQgc3RhdGUuKi9cbmNvbnN0IHBpbm5lZFB1Ykxpc3Q9dG9waWMuc3Vic2NyaWJlQWZ0ZXIoKTtcblxucmV0dXJuIEZhcignUGlubmVkSGlzdG9yeVRvcGljJyx7XG5zdWJzY3JpYmVBZnRlcjphc3luYyhwdWJsaXNoQ291bnQ9LTFuKT0+e1xuaWYocHVibGlzaENvdW50PT09LTFuKXtcbnJldHVybiBwaW5uZWRQdWJMaXN0O1xuIH1cbnJldHVybiB0b3BpYy5zdWJzY3JpYmVBZnRlcihwdWJsaXNoQ291bnQpO1xuIH0sXG5nZXRVcGRhdGVTaW5jZTphc3luYyh1cGRhdGVDb3VudD11bmRlZmluZWQpPT57XG4vKiBUT0RPOiBCdWlsZCB0aGlzIG91dCBvZiBFYWNoVG9waWM8VD4uKi9cbnJldHVybiB0b3BpYy5nZXRVcGRhdGVTaW5jZSh1cGRhdGVDb3VudCk7XG4gfX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VQaW5uZWRIaXN0b3J5VG9waWMobWFrZVBpbm5lZEhpc3RvcnlUb3BpYyk7XG5oYXJkZW4obWFrZVBpbm5lZEhpc3RvcnlUb3BpYyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVBpbm5lZEhpc3RvcnlUb3BpYyI6WyJtYWtlUGlubmVkSGlzdG9yeVRvcGljIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGNGw7teKgAAXioAACwAAABAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvdHlwZXMtYW1iaWVudC5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9mYXInKS5FUmVmPFQ+fSBFUmVmXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Byb21pc2Uta2l0JykuUHJvbWlzZUtpdDxUPn0gUHJvbWlzZUtpdFxuICovXG5cbi8qKlxuICogRGVwcmVjYXRlZC4gVXNlIFByb21pc2VLaXQgaW5zdGVhZC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL3Byb21pc2Uta2l0JykuUHJvbWlzZVJlY29yZDxUPn0gUHJvbWlzZVJlY29yZFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0ZW1wbGF0ZSBbVFJldHVybj1hbnldXG4gKiBAdGVtcGxhdGUgW1ROZXh0PXVuZGVmaW5lZF1cbiAqIEB0eXBlZGVmIHtBc3luY0l0ZXJhdG9yPFQsIFRSZXR1cm4sIFROZXh0PiAmIHtcbiAqICAgZm9yaygpOiBGb3JrYWJsZUFzeW5jSXRlcmF0b3I8VCwgVFJldHVybiwgVE5leHQ+XG4gKiB9fSBGb3JrYWJsZUFzeW5jSXRlcmF0b3IgQW4gQXN5bmNJdGVyYXRvciB0aGF0IGNhbiBiZSBmb3JrZWQgYXQgYSBnaXZlbiBwb3NpdGlvblxuICogaW50byBtdWx0aXBsZSBpbmRlcGVuZGVudCBGb3JrYWJsZUFzeW5jSXRlcmF0b3JzIHN0YXJ0aW5nIGZyb20gdGhhdCBwb3NpdGlvbi5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdGVtcGxhdGUgW1RSZXR1cm49YW55XVxuICogQHRlbXBsYXRlIFtUTmV4dD11bmRlZmluZWRdXG4gKiBAdHlwZWRlZiB7e1xuICogICBbU3ltYm9sLmFzeW5jSXRlcmF0b3JdOiAoKSA9PiBGb3JrYWJsZUFzeW5jSXRlcmF0b3I8VCwgVFJldHVybiwgVE5leHQ+XG4gKiB9fSBGb3JrYWJsZUFzeW5jSXRlcmFibGVcbiAqIEFuIEFzeW5jSXRlcmFibGUgdGhhdCBwcm9kdWNlcyBGb3JrYWJsZUFzeW5jSXRlcmF0b3JzLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEl0ZXJhdGlvbk9ic2VydmVyPFQ+XG4gKiBBIHZhbGlkIHNlcXVlbmNlIG9mIGNhbGxzIHRvIHRoZSBtZXRob2RzIG9mIGFuIGBJdGVyYXRpb25PYnNlcnZlcmBcbiAqIHJlcHJlc2VudHMgYW4gaXRlcmF0aW9uLiBBIHZhbGlkIHNlcXVlbmNlIGNvbnNpc3RzIG9mIGFueSBudW1iZXIgb2YgY2FsbHNcbiAqIHRvIGB1cGRhdGVTdGF0ZWAgd2l0aCB0aGUgc3VjY2Vzc2l2ZSBub24tZmluYWwgdmFsdWVzLCBmb2xsb3dlZCBieSBhXG4gKiBmaW5hbCBjYWxsIHRvIGVpdGhlciBgZmluaXNoYCB3aXRoIGEgc3VjY2Vzc2Z1bCBgY29tcGxldGlvbmAgdmFsdWVcbiAqIG9yIGBmYWlsYCB3aXRoIHRoZSBhbGxlZ2VkIGByZWFzb25gIGZvciBmYWlsdXJlLiBBZnRlciBhdCBtb3N0IG9uZVxuICogdGVybWluYXRpbmcgY2FsbHMsIG5vIGZ1cnRoZXIgY2FsbHMgdG8gdGhlc2UgbWV0aG9kcyBhcmUgdmFsaWQgYW5kIG11c3QgYmVcbiAqIHJlamVjdGVkLlxuICogQHByb3BlcnR5IHsobm9uRmluYWxWYWx1ZTogVCkgPT4gdm9pZH0gdXBkYXRlU3RhdGVcbiAqIEBwcm9wZXJ0eSB7KGNvbXBsZXRpb246IFQpID0+IHZvaWR9IGZpbmlzaFxuICogQHByb3BlcnR5IHsocmVhc29uOiB1bmtub3duKSA9PiB2b2lkfSBmYWlsXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQdWJsaWNhdGlvblJlY29yZFxuICogV2lsbCBiZSBzaGFyZWQgYmV0d2VlbiBtYWNoaW5lcywgc28gaXQgbXVzdCBiZSBzYWZlIHRvIGV4cG9zZS4gQnV0IHNvZnR3YXJlXG4gKiBvdXRzaWRlIHRoZSBjdXJyZW50IHBhY2thZ2Ugc2hvdWxkIGNvbnNpZGVyIGl0IG9wYXF1ZSwgbm90IGRlcGVuZGluZyBvbiBpdHNcbiAqIGludGVybmFsIHN0cnVjdHVyZS5cbiAqIEBwcm9wZXJ0eSB7SXRlcmF0b3JSZXN1bHQ8VD59IGhlYWRcbiAqIEBwcm9wZXJ0eSB7YmlnaW50fSBwdWJsaXNoQ291bnRcbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZTxQdWJsaWNhdGlvblJlY29yZDxUPj59IHRhaWxcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBFYWNoVG9waWNcbiAqIEBwcm9wZXJ0eSB7KHB1Ymxpc2hDb3VudD86IGJpZ2ludCkgPT4gUHJvbWlzZTxQdWJsaWNhdGlvblJlY29yZDxUPj59IHN1YnNjcmliZUFmdGVyXG4gKiBSZXR1cm5zIGEgcHJvbWlzZSBmb3IgYSBcImN1cnJlbnRcIiBQdWJsaWNhdGlvblJlY29yZCAocmVmZXJlbmNpbmcgaXRzXG4gKiBpbW1lZGlhdGUgc3VjY2Vzc29yIHZpYSBhIGB0YWlsYCBwcm9taXNlKSB0aGF0IGlzIGxhdGVyIHRoYW4gdGhlXG4gKiBwcm92aWRlZCBwdWJsaXNoQ291bnQuXG4gKiBVc2VkIHRvIG1ha2UgZm9yd2FyZC1sb3NzbGVzcyAoXCJlYWNoXCIpIGl0ZXJhdG9ycy5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBMYXRlc3RUb3BpY1xuICogQHByb3BlcnR5IHsodXBkYXRlQ291bnQ/OiBiaWdpbnQgfCBudW1iZXIpID0+IFByb21pc2U8VXBkYXRlUmVjb3JkPFQ+Pn0gZ2V0VXBkYXRlU2luY2VcbiAqIFJldHVybnMgYSBwcm9taXNlIGZvciBhbiB1cGRhdGUgcmVjb3JkIGFzIG9mIGFuIHVwZGF0ZSBjb3VudC5cbiAqIElmIHRoZSBgdXBkYXRlQ291bnRgIGFyZ3VtZW50IGlzIG9taXR0ZWQgb3IgZGlmZmVycyBmcm9tIHRoZSBjdXJyZW50IHVwZGF0ZSBjb3VudCxcbiAqIHRoZSBwcm9taXNlIHByb21wdGx5IHJlc29sdmVzIHRvIHRoZSBjdXJyZW50IHJlY29yZC5cbiAqIE90aGVyd2lzZSwgYWZ0ZXIgdGhlIG5leHQgc3RhdGUgY2hhbmdlLCB0aGUgcHJvbWlzZSByZXNvbHZlcyB0byB0aGUgcmVzdWx0aW5nIHJlY29yZC5cbiAqIFRoaXMgaXMgYW4gYXR0ZW51YXRlZCBmb3JtIG9mIGBzdWJzY3JpYmVBZnRlcmAgd2hvc2UgcmV0dXJuIHZhbHVlIHN0YW5kcyBhbG9uZSBhbmRcbiAqIGRvZXMgbm90IGFsbG93IGNvbnN1bWVycyB0byBwaW4gYSBjaGFpbiBvZiBoaXN0b3JpY2FsIFB1YmxpY2F0aW9uUmVjb3Jkcy5cbiAqIFVzZWQgdG8gbWFrZSBsb3NzeSAoXCJsYXRlc3RcIikgaXRlcmF0b3JzLlxuICogTk9URTogVXNlIG9mIGBudW1iZXJgIGFzIGFuIGB1cGRhdGVDb3VudGAgaXMgZGVwcmVjYXRlZC5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7TGF0ZXN0VG9waWM8VD59IEJhc2VOb3RpZmllciBUaGlzIHR5cGUgaXMgZGVwcmVjYXRlZCBidXQgaXMgc3RpbGxcbiAqIHVzZWQgZXh0ZXJuYWxseS5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7TGF0ZXN0VG9waWM8VD4gJiBFYWNoVG9waWM8VD59IFN1YnNjcmliZXJcbiAqIEEgc3RyZWFtIG9mIHJlc3VsdHMgdGhhdCBhbGxvd3MgY29uc3VtZXJzIHRvIGNvbmZpZ3VyZVxuICogZm9yd2FyZC1sb3NzbGVzcyBcImVhY2hcIiBpdGVyYXRpb24gd2l0aCBgc3Vic2NyaWJlRWFjaGAgYW5kXG4gKiBsb3NzeSBcImxhdGVzdFwiIGl0ZXJhdGlvbiB3aXRoIGBzdWJzY3JpYmVMYXRlc3RgLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFB1Ymxpc2hlclxuICogQSB2YWxpZCBzZXF1ZW5jZSBvZiBjYWxscyB0byB0aGUgbWV0aG9kcyBvZiBhbiBgSXRlcmF0aW9uT2JzZXJ2ZXJgXG4gKiByZXByZXNlbnRzIGFuIGl0ZXJhdGlvbi4gQSB2YWxpZCBzZXF1ZW5jZSBjb25zaXN0cyBvZiBhbnkgbnVtYmVyIG9mIGNhbGxzXG4gKiB0byBgcHVibGlzaGAgd2l0aCB0aGUgc3VjY2Vzc2l2ZSBub24tZmluYWwgdmFsdWVzLCBmb2xsb3dlZCBieSBhXG4gKiBmaW5hbCBjYWxsIHRvIGVpdGhlciBgZmluaXNoYCB3aXRoIGEgc3VjY2Vzc2Z1bCBgY29tcGxldGlvbmAgdmFsdWVcbiAqIG9yIGBmYWlsYCB3aXRoIHRoZSBhbGxlZ2VkIGByZWFzb25gIGZvciBmYWlsdXJlLiBBZnRlciBhdCBtb3N0IG9uZVxuICogdGVybWluYXRpbmcgY2FsbHMsIG5vIGZ1cnRoZXIgY2FsbHMgdG8gdGhlc2UgbWV0aG9kcyBhcmUgdmFsaWQgYW5kIG11c3QgYmVcbiAqIHJlamVjdGVkLlxuICogQHByb3BlcnR5IHsobm9uRmluYWxWYWx1ZTogVCkgPT4gdm9pZH0gcHVibGlzaFxuICogQHByb3BlcnR5IHsoY29tcGxldGlvbjogVCkgPT4gdm9pZH0gZmluaXNoXG4gKiBAcHJvcGVydHkgeyhyZWFzb246IGFueSkgPT4gdm9pZH0gZmFpbFxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtQYXJ0aWFsPFB1Ymxpc2hlcjxUPj59IFB1Ymxpc2hPYnNlcnZlclxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFB1Ymxpc2hLaXQ8VD5cbiAqIEBwcm9wZXJ0eSB7UHVibGlzaGVyPFQ+fSBwdWJsaXNoZXJcbiAqIEBwcm9wZXJ0eSB7U3Vic2NyaWJlcjxUPn0gc3Vic2NyaWJlclxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFN0b3JlZFB1Ymxpc2hLaXQ8VD5cbiAqIEBwcm9wZXJ0eSB7UHVibGlzaGVyPFQ+fSBwdWJsaXNoZXJcbiAqIEBwcm9wZXJ0eSB7U3RvcmVkU3Vic2NyaWJlcjxUPn0gc3Vic2NyaWJlclxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7J21hbmRhdG9yeScgfCAnb3Bwb3J0dW5pc3RpYycgfCAnaWdub3JlZCd9IER1cmFibGVQdWJsaXNoS2l0VmFsdWVEdXJhYmlsaXR5XG4gKlxuICogRHVyYWJpbGl0eSBjb25maWd1cmVzIGNvbnN0cmFpbnRzIG9uIG5vbi10ZXJtaW5hbCB2YWx1ZXMgdGhhdCBjYW4gYmVcbiAqIHB1Ymxpc2hlZCB0byBhIGR1cmFibGUgcHVibGlzaCBraXQgKHRlcm1pbmFsIHZhbHVlcyBzZW50IHRvIGZpbmlzaCBvciBmYWlsXG4gKiBtdXN0IGFsd2F5cyBiZSBkdXJhYmxlKS5cbiAqIC0gJ21hbmRhdG9yeScgbWVhbnMgdGhhdCBlYWNoIHZhbHVlIG11c3QgYmUgZHVyYWJsZSwgc28gaXQgY2FuIGJlIHJlc3RvcmVkXG4gKiAgIG9uIHVwZ3JhZGUuXG4gKiAtICdvcHBvcnR1bmlzdGljJyBtZWFucyB0aGF0IGEgZHVyYWJsZSB2YWx1ZSBpcyBwZXJzaXN0ZWQgZm9yIHBvc3QtdXBncmFkZVxuICogICByZXN0b3JhdGlvbiwgYnV0IGEgbm9uLWR1cmFibGUgdmFsdWUgaXMgc3RpbGwgYWNjZXB0ZWQgKGFuZCB3aWxsIHJlc3VsdCBpblxuICogICB2YWx1ZWxlc3MgcmVzdG9yYXRpb24pLlxuICogLSAnaWdub3JlZCcgbWVhbnMgdGhhdCBhIHZhbHVlIGlzIG5vdCBwZXJzaXN0ZWQgZm9yIHJlc3RvcmF0aW9uIGV2ZW4gaWYgaXRcbiAqICAgaXMgZHVyYWJsZS5cbiAqXG4gKiAnbWFuZGF0b3J5JyBpcyB0aGUgb25seSBjdXJyZW50bHktc3VwcG9ydGVkIHZhbHVlLCBhbmQgb3RoZXJzIG11c3Qgbm90IGJlXG4gKiBlbmFibGVkIHdpdGhvdXQgdGVzdCBjb3ZlcmFnZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IER1cmFibGVQdWJsaXNoS2l0U3RhdGVcbiAqXG4gKiBAcHJvcGVydHkge0R1cmFibGVQdWJsaXNoS2l0VmFsdWVEdXJhYmlsaXR5fSB2YWx1ZUR1cmFiaWxpdHlcbiAqXG4gKiBAcHJvcGVydHkge2JpZ2ludH0gcHVibGlzaENvdW50XG4gKlxuICogQHByb3BlcnR5IHsnbGl2ZScgfCAnZmluaXNoZWQnIHwgJ2ZhaWxlZCd9IHN0YXR1c1xuICpcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gaGFzVmFsdWVcbiAqIGhhc1ZhbHVlIGluZGljYXRlcyB0aGUgcHJlc2VuY2Ugb2YgdmFsdWUuIEl0IHN0YXJ0cyBvZmYgZmFsc2UsXG4gKiBhbmQgY2FuIGJlIHJlc2V0IHRvIGZhbHNlIHdoZW4gYSBkdXJhYmxlIHB1Ymxpc2gga2l0IGlzIHJlc3RvcmVkIGFuZFxuICogdGhlIHByZXZpb3VzIHZhbHVlIHdhcyBub3QgZHVyYWJsZSwgb3Igbm9uLXRlcm1pbmFsIGFuZCB2YWx1ZUR1cmFibGl0eSBpcyAnaWdub3JlZCcuXG4gKlxuICogQHByb3BlcnR5IHthbnl9IHZhbHVlXG4gKiB2YWx1ZSBob2xkcyBlaXRoZXIgYSBub24tdGVybWluYWwgdmFsdWUgZnJvbSBgcHVibGlzaGAgb3IgYSB0ZXJtaW5hbCB2YWx1ZVxuICogZnJvbSBgZmluaXNoYCBvciBgZmFpbGAsIGRlcGVuZGluZyB1cG9uIHRoZSB2YWx1ZSBpbiBzdGF0dXMuXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBVcGRhdGVSZWNvcmQ8VD5cbiAqIEBwcm9wZXJ0eSB7VH0gdmFsdWUgaXMgd2hhdGV2ZXIgc3RhdGUgdGhlIHNlcnZpY2Ugd2FudHMgdG8gcHVibGlzaFxuICogQHByb3BlcnR5IHtiaWdpbnR9IFt1cGRhdGVDb3VudF0gaXMgYSB2YWx1ZSB0aGF0IGlkZW50aWZpZXMgdGhlIHVwZGF0ZS4gIEZvclxuICogdGhlIGxhc3QgdXBkYXRlLCBpdCBpcyBgdW5kZWZpbmVkYC5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7QmFzZU5vdGlmaWVyPFQ+fSBOb3RpZmllckludGVybmFscyBXaWxsIGJlIHNoYXJlZCBiZXR3ZWVuIG1hY2hpbmVzLFxuICogc28gaXQgbXVzdCBiZSBzYWZlIHRvIGV4cG9zZS4gQnV0IG90aGVyIHNvZnR3YXJlIHNob3VsZCBhdm9pZCBkZXBlbmRpbmcgb25cbiAqIGl0cyBpbnRlcm5hbCBzdHJ1Y3R1cmUuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge05vdGlmaWVySW50ZXJuYWxzPFQ+ICZcbiAqICAgRm9ya2FibGVBc3luY0l0ZXJhYmxlPFQsIFQ+ICZcbiAqICAgU2hhcmFibGVOb3RpZmllcjxUPlxuICogfSBOb3RpZmllcjxUPiBhbiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBnZXQgdGhlIGN1cnJlbnQgc3RhdGUgb3IgdXBkYXRlc1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNoYXJhYmxlTm90aWZpZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxOb3RpZmllckludGVybmFsczxUPj59IGdldFNoYXJhYmxlTm90aWZpZXJJbnRlcm5hbHNcbiAqIFVzZWQgdG8gcmVwbGljYXRlIHRoZSBtdWx0aWNhc3QgdmFsdWVzIGF0IG90aGVyIHNpdGVzLiBUbyBtYW51YWxseSBjcmVhdGUgYVxuICogbG9jYWwgcmVwcmVzZW50YXRpdmUgb2YgYSBOb3RpZmljYXRpb24sIGRvXG4gKiBgYGBqc1xuICogbG9jYWxJdGVyYWJsZSA9XG4gKiAgIG1ha2VOb3RpZmllcihFKHJlbW90ZUl0ZXJhYmxlKS5nZXRTaGFyYWJsZU5vdGlmaWVySW50ZXJuYWxzKCkpO1xuICogYGBgXG4gKiBUaGUgcmVzdWx0aW5nIGBsb2NhbEl0ZXJhYmxlYCBhbHNvIHN1cHBvcnRzIHN1Y2ggcmVtb3RlIHVzZSwgYW5kXG4gKiB3aWxsIHJldHVybiBhY2Nlc3MgdG8gdGhlIHNhbWUgcmVwcmVzZW50YXRpb24uXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge29iamVjdH0gTm90aWZpZXJSZWNvcmQ8VD4gdGhlIHByb2R1Y2VkIG5vdGlmaWVyL3VwZGF0ZXIgcGFpclxuICogQHByb3BlcnR5IHtJdGVyYXRpb25PYnNlcnZlcjxUPn0gdXBkYXRlciB0aGUgKGNsb3NlbHktaGVsZCkgbm90aWZpZXIgcHJvZHVjZXJcbiAqIEBwcm9wZXJ0eSB7Tm90aWZpZXI8VD59IG5vdGlmaWVyIHRoZSAod2lkZWx5LWhlbGQpIG5vdGlmaWVyIGNvbnN1bWVyXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7Rm9ya2FibGVBc3luY0l0ZXJhYmxlPFQsIFQ+ICYgRWFjaFRvcGljPFQ+ICZcbiAqICAgU2hhcmFibGVTdWJzY3JpcHRpb248VD59IFN1YnNjcmlwdGlvbjxUPlxuICogQSBmb3JtIG9mIEFzeW5jSXRlcmFibGUgc3VwcG9ydGluZyBkaXN0cmlidXRlZCBhbmQgbXVsdGljYXN0IHVzYWdlLlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNoYXJhYmxlU3Vic2NyaXB0aW9uXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8RWFjaFRvcGljPFQ+Pn0gZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHNcbiAqIFVzZWQgdG8gcmVwbGljYXRlIHRoZSBtdWx0aWNhc3QgdmFsdWVzIGF0IG90aGVyIHNpdGVzLiBUbyBtYW51YWxseSBjcmVhdGUgYVxuICogbG9jYWwgcmVwcmVzZW50YXRpdmUgb2YgYSBTdWJzY3JpcHRpb24sIGRvXG4gKiBgYGBqc1xuICogbG9jYWxJdGVyYWJsZSA9XG4gKiAgIG1ha2VTdWJzY3JpcHRpb24oRShyZW1vdGVJdGVyYWJsZSkuZ2V0U2hhcmFibGVTdWJzY3JpcHRpb25JbnRlcm5hbHMoKSk7XG4gKiBgYGBcbiAqIFRoZSByZXN1bHRpbmcgYGxvY2FsSXRlcmFibGVgIGFsc28gc3VwcG9ydHMgc3VjaCByZW1vdGUgdXNlLCBhbmRcbiAqIHdpbGwgcmV0dXJuIGFjY2VzcyB0byB0aGUgc2FtZSByZXByZXNlbnRhdGlvbi5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdWJzY3JpcHRpb25SZWNvcmQ8VD5cbiAqIEBwcm9wZXJ0eSB7SXRlcmF0aW9uT2JzZXJ2ZXI8VD59IHB1YmxpY2F0aW9uXG4gKiBAcHJvcGVydHkge1N1YnNjcmlwdGlvbjxUPn0gc3Vic2NyaXB0aW9uXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogQHR5cGVkZWYge1JldHVyblR5cGU8dHlwZW9mIFhpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5tYWtlTWFyc2hhbD59IE1hcnNoYWxsZXIgKi9cbi8qKiBAdHlwZWRlZiB7UGljazxNYXJzaGFsbGVyLCAndW5zZXJpYWxpemUnPn0gVW5zZXJpYWxpemVyICovXG5cbi8qKlxuICogRGVmaW5lZCBieSB2c3RvcmFnZVN0b3JlS2V5IGluIHZzdG9yYWdlLmdvXG4gKlxuICogQHR5cGVkZWYgVlN0b3JhZ2VLZXlcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdG9yZU5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzdG9yZVN1YmtleVxuICogQHByb3BlcnR5IHtzdHJpbmd9IGRhdGFQcmVmaXhCeXRlc1xuICogQHByb3BlcnR5IHtzdHJpbmd9IFtub0RhdGFWYWx1ZV1cbiAqL1xuXG4vKipcbiAqIFRoaXMgcmVwcmVzZW50cyBhIG5vZGUgaW4gYW4gSUFWTCB0cmVlLlxuICpcbiAqIFRoZSBhY3RpdmUgaW1wbGVtZW50YXRpb24gaXMgeC92c3RvcmFnZSwgYW4gQWdvcmljIGV4dGVuc2lvbiBvZiB0aGUgQ29zbW9zIFNESy5cbiAqXG4gKiBWc3RvcmFnZSBpcyBhIGhpZXJhcmNoaWNhbCBleHRlcm5hbGx5LXJlYWNoYWJsZSBzdG9yYWdlIHN0cnVjdHVyZSB0aGF0XG4gKiBpZGVudGlmaWVzIGNoaWxkcmVuIGJ5IHJlc3RyaWN0ZWQgQVNDSUkgbmFtZSBhbmQgaXMgYXNzb2NpYXRlZCB3aXRoIGFyYml0cmFyeVxuICogc3RyaW5nLXZhbHVlZCBkYXRhIGZvciBlYWNoIG5vZGUsIGRlZmF1bHRpbmcgdG8gdGhlIGVtcHR5IHN0cmluZy5cbiAqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yYWdlTm9kZVxuICogQHByb3BlcnR5IHsoZGF0YTogc3RyaW5nKSA9PiBQcm9taXNlPHZvaWQ+fSBzZXRWYWx1ZSBwdWJsaXNoZXMgc29tZSBkYXRhIChhcHBlbmQgdG8gdGhlIG5vZGUpXG4gKiBAcHJvcGVydHkgeygpID0+IHN0cmluZ30gZ2V0UGF0aCB0aGUgY2hhaW4gc3RvcmFnZSBwYXRoIGF0IHdoaWNoIHRoZSBub2RlIHdhcyBjb25zdHJ1Y3RlZFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPFZTdG9yYWdlS2V5Pn0gZ2V0U3RvcmVLZXkgREVQUkVDQVRFRCB1c2UgZ2V0UGF0aFxuICogQHByb3BlcnR5IHsoc3ViUGF0aDogc3RyaW5nLCBvcHRpb25zPzoge3NlcXVlbmNlPzogYm9vbGVhbn0pID0+IFN0b3JhZ2VOb2RlfSBtYWtlQ2hpbGROb2RlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yZWRGYWNldFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPHN0cmluZz59IGdldFBhdGggdGhlIGNoYWluIHN0b3JhZ2UgcGF0aCBhdCB3aGljaCB0aGUgbm9kZSB3YXMgY29uc3RydWN0ZWRcbiAqIEBwcm9wZXJ0eSB7U3RvcmFnZU5vZGVbJ2dldFN0b3JlS2V5J119IGdldFN0b3JlS2V5IERFUFJFQ0FURUQgdXNlIGdldFBhdGhcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gVW5zZXJpYWxpemVyfSBnZXRVbnNlcmlhbGl6ZXIgZ2V0IHRoZSB1bnNlcmlhbGl6ZXIgZm9yIHRoZSBzdG9yZWQgZGF0YVxuICovXG5cbi8qKlxuICogQGRlcHJlY2F0ZWQgdXNlIFN0b3JlZFN1YnNjcmliZXJcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdHlwZWRlZiB7U3Vic2NyaXB0aW9uPFQ+ICYge1xuICogICBnZXRTdG9yZUtleTogKCkgPT4gUHJvbWlzZTxWU3RvcmFnZUtleSAmIHsgc3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb248VD4gfT4sXG4gKiAgIGdldFVuc2VyaWFsaXplcjogKCkgPT4gVW5zZXJpYWxpemVyLFxuICogfX0gU3RvcmVkU3Vic2NyaXB0aW9uXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHR5cGVkZWYge1N1YnNjcmliZXI8VD4gJiBTdG9yZWRGYWNldH0gU3RvcmVkU3Vic2NyaWJlclxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANbWKjOVAQAAlQEAACAAAABAYWdvcmljL3N0b3JlLXYwLjguMy9leHBvcnRlZC5qc3siaW1wb3J0cyI6WyIuL3NyYy9wYXR0ZXJucy9pbnRlcm5hbC10eXBlcy5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXSxbXCIuL3NyYy9wYXR0ZXJucy9pbnRlcm5hbC10eXBlcy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAefS6mOgbAADoGwAAIQAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL2tleXMvY2hlY2tLZXkuanMiLCIuL2tleXMvY29tcGFyZUtleXMuanMiLCIuL2tleXMvY29weUJhZy5qcyIsIi4va2V5cy9jb3B5U2V0LmpzIiwiLi9rZXlzL21lcmdlLWJhZy1vcGVyYXRvcnMuanMiLCIuL2tleXMvbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcyIsIi4vbGVnYWN5L2xlZ2FjeU1hcC5qcyIsIi4vbGVnYWN5L2xlZ2FjeVdlYWtNYXAuanMiLCIuL3BhdHRlcm5zL2V4by1tYWtlcnMuanMiLCIuL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qcyIsIi4vc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzIiwiLi9zdG9yZXMvc2NhbGFyU2V0U3RvcmUuanMiLCIuL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanMiLCIuL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanMiLCIuL3N0b3Jlcy9zdG9yZS11dGlscy5qcyJdLCJleHBvcnRzIjpbIk0iLCJhc3NlcnRLZXkiLCJhc3NlcnRQYXR0ZXJuIiwiYXNzZXJ0U2NhbGFyS2V5IiwiYmFnQ29tcGFyZSIsImJhZ0Rpc2pvaW50U3VidHJhY3QiLCJiYWdJbnRlcnNlY3Rpb24iLCJiYWdJc1N1cGVyYmFnIiwiYmFnVW5pb24iLCJjb2VyY2VUb0JhZ0VudHJpZXMiLCJjb2VyY2VUb0VsZW1lbnRzIiwiY29tcGFyZUtleXMiLCJkZWZpbmVFeG9DbGFzcyIsImRlZmluZUV4b0NsYXNzS2l0IiwiZWxlbWVudHNDb21wYXJlIiwiZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0IiwiZWxlbWVudHNEaXNqb2ludFVuaW9uIiwiZWxlbWVudHNJbnRlcnNlY3Rpb24iLCJlbGVtZW50c0lzRGlzam9pbnQiLCJlbGVtZW50c0lzU3VwZXJzZXQiLCJlbGVtZW50c1VuaW9uIiwiZ2V0Q29weUJhZ0VudHJpZXMiLCJnZXRDb3B5TWFwRW50cmllcyIsImdldENvcHlTZXRLZXlzIiwiZ2V0UmFua0NvdmVyIiwiaW5pdEVtcHR5IiwiaXNLZXkiLCJpc1BhdHRlcm4iLCJrZXlFUSIsImtleUdUIiwia2V5R1RFIiwia2V5TFQiLCJrZXlMVEUiLCJtYWtlQ29weUJhZyIsIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIiwibWFrZUNvcHlNYXAiLCJtYWtlQ29weVNldCIsIm1ha2VFeG8iLCJtYWtlTGVnYWN5TWFwIiwibWFrZUxlZ2FjeVdlYWtNYXAiLCJtYWtlU2NhbGFyTWFwU3RvcmUiLCJtYWtlU2NhbGFyU2V0U3RvcmUiLCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhcldlYWtTZXRTdG9yZSIsIm1hdGNoZXMiLCJtdXN0TWF0Y2giLCJwcm92aWRlTGF6eSIsInNldENvbXBhcmUiLCJzZXREaXNqb2ludFN1YnRyYWN0Iiwic2V0RGlzam9pbnRVbmlvbiIsInNldEludGVyc2VjdGlvbiIsInNldElzRGlzam9pbnQiLCJzZXRJc1N1cGVyc2V0Iiwic2V0VW5pb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL2tleXMvY2hlY2tLZXkuanNcIiwgW1tcImlzS2V5XCIsIFskaOKAjV9saXZlW1wiaXNLZXlcIl1dXSxbXCJhc3NlcnRLZXlcIiwgWyRo4oCNX2xpdmVbXCJhc3NlcnRLZXlcIl1dXSxbXCJhc3NlcnRTY2FsYXJLZXlcIiwgWyRo4oCNX2xpdmVbXCJhc3NlcnRTY2FsYXJLZXlcIl1dXSxbXCJtYWtlQ29weVNldFwiLCBbJGjigI1fbGl2ZVtcIm1ha2VDb3B5U2V0XCJdXV0sW1wiZ2V0Q29weVNldEtleXNcIiwgWyRo4oCNX2xpdmVbXCJnZXRDb3B5U2V0S2V5c1wiXV1dLFtcIm1ha2VDb3B5QmFnXCIsIFskaOKAjV9saXZlW1wibWFrZUNvcHlCYWdcIl1dXSxbXCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50c1wiLCBbJGjigI1fbGl2ZVtcIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzXCJdXV0sW1wiZ2V0Q29weUJhZ0VudHJpZXNcIiwgWyRo4oCNX2xpdmVbXCJnZXRDb3B5QmFnRW50cmllc1wiXV1dLFtcIm1ha2VDb3B5TWFwXCIsIFskaOKAjV9saXZlW1wibWFrZUNvcHlNYXBcIl1dXSxbXCJnZXRDb3B5TWFwRW50cmllc1wiLCBbJGjigI1fbGl2ZVtcImdldENvcHlNYXBFbnRyaWVzXCJdXV1dXSxbXCIuL2tleXMvY29weVNldC5qc1wiLCBbW1wiY29lcmNlVG9FbGVtZW50c1wiLCBbJGjigI1fbGl2ZVtcImNvZXJjZVRvRWxlbWVudHNcIl1dXV1dLFtcIi4va2V5cy9jb3B5QmFnLmpzXCIsIFtbXCJjb2VyY2VUb0JhZ0VudHJpZXNcIiwgWyRo4oCNX2xpdmVbXCJjb2VyY2VUb0JhZ0VudHJpZXNcIl1dXV1dLFtcIi4va2V5cy9jb21wYXJlS2V5cy5qc1wiLCBbW1wiY29tcGFyZUtleXNcIiwgWyRo4oCNX2xpdmVbXCJjb21wYXJlS2V5c1wiXV1dLFtcImtleUxUXCIsIFskaOKAjV9saXZlW1wia2V5TFRcIl1dXSxbXCJrZXlMVEVcIiwgWyRo4oCNX2xpdmVbXCJrZXlMVEVcIl1dXSxbXCJrZXlFUVwiLCBbJGjigI1fbGl2ZVtcImtleUVRXCJdXV0sW1wia2V5R1RFXCIsIFskaOKAjV9saXZlW1wia2V5R1RFXCJdXV0sW1wia2V5R1RcIiwgWyRo4oCNX2xpdmVbXCJrZXlHVFwiXV1dXV0sW1wiLi9rZXlzL21lcmdlLXNldC1vcGVyYXRvcnMuanNcIiwgW1tcImVsZW1lbnRzSXNTdXBlcnNldFwiLCBbJGjigI1fbGl2ZVtcImVsZW1lbnRzSXNTdXBlcnNldFwiXV1dLFtcImVsZW1lbnRzSXNEaXNqb2ludFwiLCBbJGjigI1fbGl2ZVtcImVsZW1lbnRzSXNEaXNqb2ludFwiXV1dLFtcImVsZW1lbnRzQ29tcGFyZVwiLCBbJGjigI1fbGl2ZVtcImVsZW1lbnRzQ29tcGFyZVwiXV1dLFtcImVsZW1lbnRzVW5pb25cIiwgWyRo4oCNX2xpdmVbXCJlbGVtZW50c1VuaW9uXCJdXV0sW1wiZWxlbWVudHNEaXNqb2ludFVuaW9uXCIsIFskaOKAjV9saXZlW1wiZWxlbWVudHNEaXNqb2ludFVuaW9uXCJdXV0sW1wiZWxlbWVudHNJbnRlcnNlY3Rpb25cIiwgWyRo4oCNX2xpdmVbXCJlbGVtZW50c0ludGVyc2VjdGlvblwiXV1dLFtcImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdFwiLCBbJGjigI1fbGl2ZVtcImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdFwiXV1dLFtcInNldElzU3VwZXJzZXRcIiwgWyRo4oCNX2xpdmVbXCJzZXRJc1N1cGVyc2V0XCJdXV0sW1wic2V0SXNEaXNqb2ludFwiLCBbJGjigI1fbGl2ZVtcInNldElzRGlzam9pbnRcIl1dXSxbXCJzZXRDb21wYXJlXCIsIFskaOKAjV9saXZlW1wic2V0Q29tcGFyZVwiXV1dLFtcInNldFVuaW9uXCIsIFskaOKAjV9saXZlW1wic2V0VW5pb25cIl1dXSxbXCJzZXREaXNqb2ludFVuaW9uXCIsIFskaOKAjV9saXZlW1wic2V0RGlzam9pbnRVbmlvblwiXV1dLFtcInNldEludGVyc2VjdGlvblwiLCBbJGjigI1fbGl2ZVtcInNldEludGVyc2VjdGlvblwiXV1dLFtcInNldERpc2pvaW50U3VidHJhY3RcIiwgWyRo4oCNX2xpdmVbXCJzZXREaXNqb2ludFN1YnRyYWN0XCJdXV1dXSxbXCIuL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc1wiLCBbW1wiYmFnSXNTdXBlcmJhZ1wiLCBbJGjigI1fbGl2ZVtcImJhZ0lzU3VwZXJiYWdcIl1dXSxbXCJiYWdDb21wYXJlXCIsIFskaOKAjV9saXZlW1wiYmFnQ29tcGFyZVwiXV1dLFtcImJhZ1VuaW9uXCIsIFskaOKAjV9saXZlW1wiYmFnVW5pb25cIl1dXSxbXCJiYWdJbnRlcnNlY3Rpb25cIiwgWyRo4oCNX2xpdmVbXCJiYWdJbnRlcnNlY3Rpb25cIl1dXSxbXCJiYWdEaXNqb2ludFN1YnRyYWN0XCIsIFskaOKAjV9saXZlW1wiYmFnRGlzam9pbnRTdWJ0cmFjdFwiXV1dXV0sW1wiLi9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanNcIiwgW1tcIk1cIiwgWyRo4oCNX2xpdmVbXCJNXCJdXV0sW1wiZ2V0UmFua0NvdmVyXCIsIFskaOKAjV9saXZlW1wiZ2V0UmFua0NvdmVyXCJdXV0sW1wiaXNQYXR0ZXJuXCIsIFskaOKAjV9saXZlW1wiaXNQYXR0ZXJuXCJdXV0sW1wiYXNzZXJ0UGF0dGVyblwiLCBbJGjigI1fbGl2ZVtcImFzc2VydFBhdHRlcm5cIl1dXSxbXCJtYXRjaGVzXCIsIFskaOKAjV9saXZlW1wibWF0Y2hlc1wiXV1dLFtcIm11c3RNYXRjaFwiLCBbJGjigI1fbGl2ZVtcIm11c3RNYXRjaFwiXV1dXV0sW1wiLi9wYXR0ZXJucy9leG8tbWFrZXJzLmpzXCIsIFtbXCJpbml0RW1wdHlcIiwgWyRo4oCNX2xpdmVbXCJpbml0RW1wdHlcIl1dXSxbXCJkZWZpbmVFeG9DbGFzc1wiLCBbJGjigI1fbGl2ZVtcImRlZmluZUV4b0NsYXNzXCJdXV0sW1wiZGVmaW5lRXhvQ2xhc3NLaXRcIiwgWyRo4oCNX2xpdmVbXCJkZWZpbmVFeG9DbGFzc0tpdFwiXV1dLFtcIm1ha2VFeG9cIiwgWyRo4oCNX2xpdmVbXCJtYWtlRXhvXCJdXV1dXSxbXCIuL3N0b3Jlcy9zY2FsYXJXZWFrU2V0U3RvcmUuanNcIiwgW1tcIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmVcIiwgWyRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlXCJdXV1dXSxbXCIuL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qc1wiLCBbW1wibWFrZVNjYWxhclNldFN0b3JlXCIsIFskaOKAjV9saXZlW1wibWFrZVNjYWxhclNldFN0b3JlXCJdXV1dXSxbXCIuL3N0b3Jlcy9zY2FsYXJXZWFrTWFwU3RvcmUuanNcIiwgW1tcIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmVcIiwgWyRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlXCJdXV1dXSxbXCIuL3N0b3Jlcy9zY2FsYXJNYXBTdG9yZS5qc1wiLCBbW1wibWFrZVNjYWxhck1hcFN0b3JlXCIsIFskaOKAjV9saXZlW1wibWFrZVNjYWxhck1hcFN0b3JlXCJdXV1dXSxbXCIuL3N0b3Jlcy9zdG9yZS11dGlscy5qc1wiLCBbW1wicHJvdmlkZUxhenlcIiwgWyRo4oCNX2xpdmVbXCJwcm92aWRlTGF6eVwiXV1dXV0sW1wiLi9sZWdhY3kvbGVnYWN5TWFwLmpzXCIsIFtbXCJtYWtlTGVnYWN5TWFwXCIsIFskaOKAjV9saXZlW1wibWFrZUxlZ2FjeU1hcFwiXV1dXV0sW1wiLi9sZWdhY3kvbGVnYWN5V2Vha01hcC5qc1wiLCBbW1wibWFrZUxlZ2FjeVdlYWtNYXBcIiwgWyRo4oCNX2xpdmVbXCJtYWtlTGVnYWN5V2Vha01hcFwiXV1dXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6eyJpc0tleSI6WyJpc0tleSIsZmFsc2VdLCJhc3NlcnRLZXkiOlsiYXNzZXJ0S2V5IixmYWxzZV0sImFzc2VydFNjYWxhcktleSI6WyJhc3NlcnRTY2FsYXJLZXkiLGZhbHNlXSwibWFrZUNvcHlTZXQiOlsibWFrZUNvcHlTZXQiLGZhbHNlXSwiZ2V0Q29weVNldEtleXMiOlsiZ2V0Q29weVNldEtleXMiLGZhbHNlXSwibWFrZUNvcHlCYWciOlsibWFrZUNvcHlCYWciLGZhbHNlXSwibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiOlsibWFrZUNvcHlCYWdGcm9tRWxlbWVudHMiLGZhbHNlXSwiZ2V0Q29weUJhZ0VudHJpZXMiOlsiZ2V0Q29weUJhZ0VudHJpZXMiLGZhbHNlXSwibWFrZUNvcHlNYXAiOlsibWFrZUNvcHlNYXAiLGZhbHNlXSwiZ2V0Q29weU1hcEVudHJpZXMiOlsiZ2V0Q29weU1hcEVudHJpZXMiLGZhbHNlXSwiY29lcmNlVG9FbGVtZW50cyI6WyJjb2VyY2VUb0VsZW1lbnRzIixmYWxzZV0sImNvZXJjZVRvQmFnRW50cmllcyI6WyJjb2VyY2VUb0JhZ0VudHJpZXMiLGZhbHNlXSwiY29tcGFyZUtleXMiOlsiY29tcGFyZUtleXMiLGZhbHNlXSwia2V5TFQiOlsia2V5TFQiLGZhbHNlXSwia2V5TFRFIjpbImtleUxURSIsZmFsc2VdLCJrZXlFUSI6WyJrZXlFUSIsZmFsc2VdLCJrZXlHVEUiOlsia2V5R1RFIixmYWxzZV0sImtleUdUIjpbImtleUdUIixmYWxzZV0sImVsZW1lbnRzSXNTdXBlcnNldCI6WyJlbGVtZW50c0lzU3VwZXJzZXQiLGZhbHNlXSwiZWxlbWVudHNJc0Rpc2pvaW50IjpbImVsZW1lbnRzSXNEaXNqb2ludCIsZmFsc2VdLCJlbGVtZW50c0NvbXBhcmUiOlsiZWxlbWVudHNDb21wYXJlIixmYWxzZV0sImVsZW1lbnRzVW5pb24iOlsiZWxlbWVudHNVbmlvbiIsZmFsc2VdLCJlbGVtZW50c0Rpc2pvaW50VW5pb24iOlsiZWxlbWVudHNEaXNqb2ludFVuaW9uIixmYWxzZV0sImVsZW1lbnRzSW50ZXJzZWN0aW9uIjpbImVsZW1lbnRzSW50ZXJzZWN0aW9uIixmYWxzZV0sImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCI6WyJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiLGZhbHNlXSwic2V0SXNTdXBlcnNldCI6WyJzZXRJc1N1cGVyc2V0IixmYWxzZV0sInNldElzRGlzam9pbnQiOlsic2V0SXNEaXNqb2ludCIsZmFsc2VdLCJzZXRDb21wYXJlIjpbInNldENvbXBhcmUiLGZhbHNlXSwic2V0VW5pb24iOlsic2V0VW5pb24iLGZhbHNlXSwic2V0RGlzam9pbnRVbmlvbiI6WyJzZXREaXNqb2ludFVuaW9uIixmYWxzZV0sInNldEludGVyc2VjdGlvbiI6WyJzZXRJbnRlcnNlY3Rpb24iLGZhbHNlXSwic2V0RGlzam9pbnRTdWJ0cmFjdCI6WyJzZXREaXNqb2ludFN1YnRyYWN0IixmYWxzZV0sImJhZ0lzU3VwZXJiYWciOlsiYmFnSXNTdXBlcmJhZyIsZmFsc2VdLCJiYWdDb21wYXJlIjpbImJhZ0NvbXBhcmUiLGZhbHNlXSwiYmFnVW5pb24iOlsiYmFnVW5pb24iLGZhbHNlXSwiYmFnSW50ZXJzZWN0aW9uIjpbImJhZ0ludGVyc2VjdGlvbiIsZmFsc2VdLCJiYWdEaXNqb2ludFN1YnRyYWN0IjpbImJhZ0Rpc2pvaW50U3VidHJhY3QiLGZhbHNlXSwiTSI6WyJNIixmYWxzZV0sImdldFJhbmtDb3ZlciI6WyJnZXRSYW5rQ292ZXIiLGZhbHNlXSwiaXNQYXR0ZXJuIjpbImlzUGF0dGVybiIsZmFsc2VdLCJhc3NlcnRQYXR0ZXJuIjpbImFzc2VydFBhdHRlcm4iLGZhbHNlXSwibWF0Y2hlcyI6WyJtYXRjaGVzIixmYWxzZV0sIm11c3RNYXRjaCI6WyJtdXN0TWF0Y2giLGZhbHNlXSwiaW5pdEVtcHR5IjpbImluaXRFbXB0eSIsZmFsc2VdLCJkZWZpbmVFeG9DbGFzcyI6WyJkZWZpbmVFeG9DbGFzcyIsZmFsc2VdLCJkZWZpbmVFeG9DbGFzc0tpdCI6WyJkZWZpbmVFeG9DbGFzc0tpdCIsZmFsc2VdLCJtYWtlRXhvIjpbIm1ha2VFeG8iLGZhbHNlXSwibWFrZVNjYWxhcldlYWtTZXRTdG9yZSI6WyJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIixmYWxzZV0sIm1ha2VTY2FsYXJTZXRTdG9yZSI6WyJtYWtlU2NhbGFyU2V0U3RvcmUiLGZhbHNlXSwibWFrZVNjYWxhcldlYWtNYXBTdG9yZSI6WyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIixmYWxzZV0sIm1ha2VTY2FsYXJNYXBTdG9yZSI6WyJtYWtlU2NhbGFyTWFwU3RvcmUiLGZhbHNlXSwicHJvdmlkZUxhenkiOlsicHJvdmlkZUxhenkiLGZhbHNlXSwibWFrZUxlZ2FjeU1hcCI6WyJtYWtlTGVnYWN5TWFwIixmYWxzZV0sIm1ha2VMZWdhY3lXZWFrTWFwIjpbIm1ha2VMZWdhY3lXZWFrTWFwIixmYWxzZV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEfz4Op7RAAAe0QAACkAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMva2V5cy9jaGVja0tleS5qc3siaW1wb3J0cyI6WyIuL2NvcHlCYWcuanMiLCIuL2NvcHlTZXQuanMiLCJAYWdvcmljL2Fzc2VydCIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9tYXJzaGFsL3NyYy9yYW5rT3JkZXIuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRDb3B5QmFnIiwiYXNzZXJ0Q29weU1hcCIsImFzc2VydENvcHlTZXQiLCJhc3NlcnRLZXkiLCJhc3NlcnRQcmltaXRpdmVLZXkiLCJhc3NlcnRTY2FsYXJLZXkiLCJjaGVja0NvcHlCYWciLCJjaGVja0NvcHlNYXAiLCJjaGVja0NvcHlTZXQiLCJjaGVja0tleSIsImNoZWNrU2NhbGFyS2V5IiwiY29weU1hcEtleVNldCIsImV2ZXJ5Q29weUJhZ0VudHJ5IiwiZXZlcnlDb3B5TWFwS2V5IiwiZXZlcnlDb3B5TWFwVmFsdWUiLCJldmVyeUNvcHlTZXRLZXkiLCJnZXRDb3B5QmFnRW50cmllcyIsImdldENvcHlNYXBFbnRyaWVzIiwiZ2V0Q29weU1hcEtleXMiLCJnZXRDb3B5TWFwVmFsdWVzIiwiZ2V0Q29weVNldEtleXMiLCJpc0NvcHlCYWciLCJpc0NvcHlNYXAiLCJpc0NvcHlTZXQiLCJpc0tleSIsImlzUHJpbWl0aXZlS2V5IiwiaXNTY2FsYXJLZXkiLCJtYWtlQ29weUJhZyIsIm1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzIiwibWFrZUNvcHlNYXAiLCJtYWtlQ29weVNldCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLGFzc2VydFBhc3NhYmxlLEZhcixnZXRUYWcsaXNPYmplY3QsbWFrZVRhZ2dlZCxwYXNzU3R5bGVPZixpZGVudENoZWNrZXIsY29tcGFyZUFudGlSYW5rLG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0LHNvcnRCeVJhbmssY2hlY2tFbGVtZW50cyxtYWtlU2V0T2ZFbGVtZW50cyxjaGVja0JhZ0VudHJpZXMsbWFrZUJhZ09mRW50cmllczskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaOKAjV9hKV1dLFtcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXSxbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9hID0+IChtYWtlVGFnZ2VkID0gJGjigI1fYSldXSxbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcImlkZW50Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoaWRlbnRDaGVja2VyID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWwvc3JjL3JhbmtPcmRlci5qc1wiLCBbW1wiY29tcGFyZUFudGlSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlQW50aVJhbmsgPSAkaOKAjV9hKV1dLFtcIm1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0XCIsIFskaOKAjV9hID0+IChtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCA9ICRo4oCNX2EpXV0sW1wic29ydEJ5UmFua1wiLCBbJGjigI1fYSA9PiAoc29ydEJ5UmFuayA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvcHlTZXQuanNcIiwgW1tcImNoZWNrRWxlbWVudHNcIiwgWyRo4oCNX2EgPT4gKGNoZWNrRWxlbWVudHMgPSAkaOKAjV9hKV1dLFtcIm1ha2VTZXRPZkVsZW1lbnRzXCIsIFskaOKAjV9hID0+IChtYWtlU2V0T2ZFbGVtZW50cyA9ICRo4oCNX2EpXV1dXSxbXCIuL2NvcHlCYWcuanNcIiwgW1tcImNoZWNrQmFnRW50cmllc1wiLCBbJGjigI1fYSA9PiAoY2hlY2tCYWdFbnRyaWVzID0gJGjigI1fYSldXSxbXCJtYWtlQmFnT2ZFbnRyaWVzXCIsIFskaOKAjV9hID0+IChtYWtlQmFnT2ZFbnRyaWVzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnEsRmFpbH09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vIFByaW1pdGl2ZSBhbmQgU2NhbGFyIGtleXMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrUHJpbWl0aXZlS2V5PSh2YWwsY2hlY2spPT57XG5pZihpc09iamVjdCh2YWwpKXtcbnJldHVybihcbmNoZWNrIT09aWRlbnRDaGVja2VyJiZcbmNoZWNrKGZhbHNlLFggYEEgJHtxKHR5cGVvZiB2YWwpfSBjYW5ub3QgYmUgYSBwcmltaXRpdmU6ICR7dmFsfWApKTtcblxuIH1cbi8qIFRPRE8gVGhlcmUgaXMgbm90IHlldCBhIGNoZWNrUGFzc2FibGUsIGJ1dCBwZXJoYXBzIHRoZXJlIHNob3VsZCBiZS4qL1xuLyogSWYgdGhhdCBoYXBwZW5zLCB3ZSBzaG91bGQgY2FsbCBpdCBoZXJlIGluc3RlYWQuKi9cbmFzc2VydFBhc3NhYmxlKHZhbCk7XG5yZXR1cm4gdHJ1ZTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBpc1ByaW1pdGl2ZUtleT0odmFsKT0+Y2hlY2tQcmltaXRpdmVLZXkodmFsLGlkZW50Q2hlY2tlcik7JGjigI1fb25jZS5pc1ByaW1pdGl2ZUtleShpc1ByaW1pdGl2ZUtleSk7XG5oYXJkZW4oaXNQcmltaXRpdmVLZXkpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHZhbFxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRQcmltaXRpdmVLZXk9KHZhbCk9PntcbmNoZWNrUHJpbWl0aXZlS2V5KHZhbCxhc3NlcnRDaGVja2VyKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0UHJpbWl0aXZlS2V5KGFzc2VydFByaW1pdGl2ZUtleSk7XG5oYXJkZW4oYXNzZXJ0UHJpbWl0aXZlS2V5KTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgY2hlY2tTY2FsYXJLZXk9KHZhbCxjaGVjayk9PntcbmlmKGlzUHJpbWl0aXZlS2V5KHZhbCkpe1xucmV0dXJuIHRydWU7XG4gfVxuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHZhbCk7XG5pZihwYXNzU3R5bGU9PT0ncmVtb3RhYmxlJyl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgQSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIGEgc2NhbGFyIGtleTogJHt2YWx9YCk7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjigI1fb25jZS5jaGVja1NjYWxhcktleShjaGVja1NjYWxhcktleSk7XG5jb25zdCAgICAgICAgaXNTY2FsYXJLZXk9KHZhbCk9PmNoZWNrU2NhbGFyS2V5KHZhbCxpZGVudENoZWNrZXIpOyRo4oCNX29uY2UuaXNTY2FsYXJLZXkoaXNTY2FsYXJLZXkpO1xuaGFyZGVuKGlzU2NhbGFyS2V5KTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSB2YWxcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0U2NhbGFyS2V5PSh2YWwpPT57XG5jaGVja1NjYWxhcktleSh2YWwsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydFNjYWxhcktleShhc3NlcnRTY2FsYXJLZXkpO1xuaGFyZGVuKGFzc2VydFNjYWxhcktleSk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBLZXlzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEB0eXBlIHtXZWFrU2V0PEtleT59ICovXG5jb25zdCBrZXlNZW1vPW5ldyBXZWFrU2V0KCk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGNoZWNrS2V5PSh2YWwsY2hlY2spPT57XG5pZighaXNPYmplY3QodmFsKSl7XG4vKiBUT0RPIFRoZXJlIGlzIG5vdCB5ZXQgYSBjaGVja1Bhc3NhYmxlLCBidXQgcGVyaGFwcyB0aGVyZSBzaG91bGQgYmUuKi9cbi8qIElmIHRoYXQgaGFwcGVucywgd2Ugc2hvdWxkIGNhbGwgaXQgaGVyZSBpbnN0ZWFkLiovXG5hc3NlcnRQYXNzYWJsZSh2YWwpO1xucmV0dXJuIHRydWU7XG4gfVxuaWYoa2V5TWVtby5oYXModmFsKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdXNlLWJlZm9yZS1kZWZpbmUqL1xuY29uc3QgcmVzdWx0PWNoZWNrS2V5SW50ZXJuYWwodmFsLGNoZWNrKTtcbmlmKHJlc3VsdCl7XG4vKiBEb24ndCBjYWNoZSB0aGUgdW5kZWZpbmVkIGNhc2VzLCBzbyB0aGF0IGlmIGl0IGlzIHRyaWVkIGFnYWluKi9cbi8qIHdpdGggYGFzc2VydENoZWNrZXJgIGl0J2xsIHRocm93IGEgZGlhZ25vc3RpYyBhZ2FpbiovXG5rZXlNZW1vLmFkZCh2YWwpO1xuIH1cbi8qIE5vdGUgdGhhdCB3ZSBkbyBub3QgbWVtb2l6ZSBhIG5lZ2F0aXZlIGp1ZGdlbWVudCwgc28gdGhhdCBpZiBpdCBpcyB0cmllZCovXG4vKiBhZ2FpbiB3aXRoIGEgY2hlY2tlciwgaXQgd2lsbCBzdGlsbCBwcm9kdWNlIGEgdXNlZnVsIGRpYWdub3N0aWMuKi9cbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLmNoZWNrS2V5KGNoZWNrS2V5KTtcbmhhcmRlbihjaGVja0tleSk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGlzS2V5PSh2YWwpPT5jaGVja0tleSh2YWwsaWRlbnRDaGVja2VyKTskaOKAjV9vbmNlLmlzS2V5KGlzS2V5KTtcbmhhcmRlbihpc0tleSk7XG5cbi8qKlxuICogQHBhcmFtIHtLZXl9IHZhbFxuICovXG5jb25zdCAgICAgICAgYXNzZXJ0S2V5PSh2YWwpPT57XG5jaGVja0tleSh2YWwsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydEtleShhc3NlcnRLZXkpO1xuaGFyZGVuKGFzc2VydEtleSk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gQ29weVNldCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyogTW92ZWQgdG8gaGVyZSBzbyB0aGV5IGNhbiBjaGVjayB0aGF0IHRoZSBjb3B5U2V0IGNvbnRhaW5zIG9ubHkga2V5cyovXG4vKiB3aXRob3V0IGNyZWF0aW5nIGFuIGltcG9ydCBjeWNsZS4qL1xuXG4vKiogQHR5cGUgV2Vha1NldDxDb3B5U2V0PEtleT4+ICovXG5jb25zdCBjb3B5U2V0TWVtbz1uZXcgV2Vha1NldCgpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgY2hlY2tDb3B5U2V0PShzLGNoZWNrKT0+e1xuaWYoY29weVNldE1lbW8uaGFzKHMpKXtcbnJldHVybiB0cnVlO1xuIH1cbmNvbnN0IHJlc3VsdD1cbihwYXNzU3R5bGVPZihzKT09PSd0YWdnZWQnJiZnZXRUYWcocyk9PT0nY29weVNldCd8fFxuY2hlY2soZmFsc2UsWCBgTm90IGEgY29weVNldDogJHtzfWApKSYmXG5jaGVja0VsZW1lbnRzKHMucGF5bG9hZCxjaGVjaykmJlxuY2hlY2tLZXkocy5wYXlsb2FkLGNoZWNrKTtcbmlmKHJlc3VsdCl7XG5jb3B5U2V0TWVtby5hZGQocyk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UuY2hlY2tDb3B5U2V0KGNoZWNrQ29weVNldCk7XG5oYXJkZW4oY2hlY2tDb3B5U2V0KTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgSXNDb3B5U2V0XG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzXG4gKiBAcmV0dXJucyB7cyBpcyBDb3B5U2V0PEtleT59XG4gKi9cblxuLyoqIEB0eXBlIHtJc0NvcHlTZXR9ICovXG5jb25zdCAgICAgICAgaXNDb3B5U2V0PShzKT0+Y2hlY2tDb3B5U2V0KHMsaWRlbnRDaGVja2VyKTskaOKAjV9vbmNlLmlzQ29weVNldChpc0NvcHlTZXQpO1xuaGFyZGVuKGlzQ29weVNldCk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydENvcHlTZXRcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNcbiAqIEByZXR1cm5zIHthc3NlcnRzIHMgaXMgQ29weVNldDxLZXk+fVxuICovXG5cbi8qKiBAdHlwZSB7QXNzZXJ0Q29weVNldH0gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRDb3B5U2V0PShzKT0+e1xuY2hlY2tDb3B5U2V0KHMsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydENvcHlTZXQoYXNzZXJ0Q29weVNldCk7XG5oYXJkZW4oYXNzZXJ0Q29weVNldCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7Q29weVNldDxLPn0gc1xuICogQHJldHVybnMge0tbXX1cbiAqL1xuY29uc3QgICAgICAgIGdldENvcHlTZXRLZXlzPShzKT0+e1xuYXNzZXJ0Q29weVNldChzKTtcbnJldHVybiBzLnBheWxvYWQ7XG4gfTskaOKAjV9vbmNlLmdldENvcHlTZXRLZXlzKGdldENvcHlTZXRLZXlzKTtcbmhhcmRlbihnZXRDb3B5U2V0S2V5cyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7Q29weVNldDxLPn0gc1xuICogQHBhcmFtIHsoa2V5OiBLLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFufSBmblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBldmVyeUNvcHlTZXRLZXk9KHMsZm4pPT5cbmdldENvcHlTZXRLZXlzKHMpLmV2ZXJ5KChrZXksaW5kZXgpPT5mbihrZXksaW5kZXgpKTskaOKAjV9vbmNlLmV2ZXJ5Q29weVNldEtleShldmVyeUNvcHlTZXRLZXkpO1xuaGFyZGVuKGV2ZXJ5Q29weVNldEtleSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8Sz59IGVsZW1lbnRJdGVyXG4gKiBAcmV0dXJucyB7Q29weVNldDxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VDb3B5U2V0PShlbGVtZW50SXRlcik9PntcbmNvbnN0IHJlc3VsdD1tYWtlU2V0T2ZFbGVtZW50cyhlbGVtZW50SXRlcik7XG5hc3NlcnRDb3B5U2V0KHJlc3VsdCk7XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS5tYWtlQ29weVNldChtYWtlQ29weVNldCk7XG5oYXJkZW4obWFrZUNvcHlTZXQpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIENvcHlCYWcgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qIE1vdmVkIHRvIGhlcmUgc28gdGhleSBjYW4gY2hlY2sgdGhhdCB0aGUgY29weUJhZyBjb250YWlucyBvbmx5IGtleXMqL1xuLyogd2l0aG91dCBjcmVhdGluZyBhbiBpbXBvcnQgY3ljbGUuKi9cblxuLyoqIEB0eXBlIFdlYWtTZXQ8Q29weUJhZzxLZXk+PiAqL1xuY29uc3QgY29weUJhZ01lbW89bmV3IFdlYWtTZXQoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBiXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGNoZWNrQ29weUJhZz0oYixjaGVjayk9PntcbmlmKGNvcHlCYWdNZW1vLmhhcyhiKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5jb25zdCByZXN1bHQ9XG4ocGFzc1N0eWxlT2YoYik9PT0ndGFnZ2VkJyYmZ2V0VGFnKGIpPT09J2NvcHlCYWcnfHxcbmNoZWNrKGZhbHNlLFggYE5vdCBhIGNvcHlCYWc6ICR7Yn1gKSkmJlxuY2hlY2tCYWdFbnRyaWVzKGIucGF5bG9hZCxjaGVjaykmJlxuY2hlY2tLZXkoYi5wYXlsb2FkLGNoZWNrKTtcbmlmKHJlc3VsdCl7XG5jb3B5QmFnTWVtby5hZGQoYik7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UuY2hlY2tDb3B5QmFnKGNoZWNrQ29weUJhZyk7XG5oYXJkZW4oY2hlY2tDb3B5QmFnKTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgSXNDb3B5QmFnXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBiXG4gKiBAcmV0dXJucyB7YiBpcyBDb3B5QmFnPEtleT59XG4gKi9cblxuLyoqIEB0eXBlIHtJc0NvcHlCYWd9ICovXG5jb25zdCAgICAgICAgaXNDb3B5QmFnPShiKT0+Y2hlY2tDb3B5QmFnKGIsaWRlbnRDaGVja2VyKTskaOKAjV9vbmNlLmlzQ29weUJhZyhpc0NvcHlCYWcpO1xuaGFyZGVuKGlzQ29weUJhZyk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydENvcHlCYWdcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGJcbiAqIEByZXR1cm5zIHthc3NlcnRzIGIgaXMgQ29weUJhZzxLZXk+fVxuICovXG5cbi8qKiBAdHlwZSB7QXNzZXJ0Q29weUJhZ30gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRDb3B5QmFnPShiKT0+e1xuY2hlY2tDb3B5QmFnKGIsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydENvcHlCYWcoYXNzZXJ0Q29weUJhZyk7XG5oYXJkZW4oYXNzZXJ0Q29weUJhZyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7Q29weUJhZzxLPn0gYlxuICogQHJldHVybnMge0NvcHlCYWc8Sz5bJ3BheWxvYWQnXX1cbiAqL1xuY29uc3QgICAgICAgIGdldENvcHlCYWdFbnRyaWVzPShiKT0+e1xuYXNzZXJ0Q29weUJhZyhiKTtcbnJldHVybiBiLnBheWxvYWQ7XG4gfTskaOKAjV9vbmNlLmdldENvcHlCYWdFbnRyaWVzKGdldENvcHlCYWdFbnRyaWVzKTtcbmhhcmRlbihnZXRDb3B5QmFnRW50cmllcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7Q29weUJhZzxLPn0gYlxuICogQHBhcmFtIHsoZW50cnk6IFtLLCBiaWdpbnRdLCBpbmRleDogbnVtYmVyKSA9PiBib29sZWFufSBmblxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBldmVyeUNvcHlCYWdFbnRyeT0oYixmbik9PlxuZ2V0Q29weUJhZ0VudHJpZXMoYikuZXZlcnkoKGVudHJ5LGluZGV4KT0+Zm4oZW50cnksaW5kZXgpKTskaOKAjV9vbmNlLmV2ZXJ5Q29weUJhZ0VudHJ5KGV2ZXJ5Q29weUJhZ0VudHJ5KTtcbmhhcmRlbihldmVyeUNvcHlCYWdFbnRyeSk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8W0ssYmlnaW50XT59IGJhZ0VudHJ5SXRlclxuICogQHJldHVybnMge0NvcHlCYWc8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlQ29weUJhZz0oYmFnRW50cnlJdGVyKT0+e1xuY29uc3QgcmVzdWx0PW1ha2VCYWdPZkVudHJpZXMoYmFnRW50cnlJdGVyKTtcbmFzc2VydENvcHlCYWcocmVzdWx0KTtcbnJldHVybiByZXN1bHQ7XG4gfTskaOKAjV9vbmNlLm1ha2VDb3B5QmFnKG1ha2VDb3B5QmFnKTtcbmhhcmRlbihtYWtlQ29weUJhZyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8Sz59IGVsZW1lbnRJdGVyXG4gKiBAcmV0dXJucyB7Q29weUJhZzxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzPShlbGVtZW50SXRlcik9Pntcbi8qIFRoaXMgZnVsbE9yZGVyIGNvbnRhaW5zIGhpc3RvcnkgZGVwZW5kZW50IHN0YXRlLiBJdCBpcyBzcGVjaWZpYyovXG4vKiB0byB0aGlzIG9uZSBjYWxsIGFuZCBkb2VzIG5vdCBzdXJ2aXZlIGl0LiovXG5jb25zdCBmdWxsQ29tcGFyZT1tYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCgpLmFudGlDb21wYXJhdG9yO1xuY29uc3Qgc29ydGVkPXNvcnRCeVJhbmsoZWxlbWVudEl0ZXIsZnVsbENvbXBhcmUpO1xuLyoqIEB0eXBlIHtbSyxiaWdpbnRdW119ICovXG5jb25zdCBlbnRyaWVzPVtdO1xuZm9yKGxldCBpPTA7aTxzb3J0ZWQubGVuZ3RoOyl7XG5jb25zdCBrPXNvcnRlZFtpXTtcbmxldCBqPWkrMTtcbndoaWxlKGo8c29ydGVkLmxlbmd0aCYmZnVsbENvbXBhcmUoayxzb3J0ZWRbal0pPT09MCl7XG5qKz0xO1xuIH1cbmVudHJpZXMucHVzaChbayxCaWdJbnQoai1pKV0pO1xuaT1qO1xuIH1cbnJldHVybiBtYWtlQ29weUJhZyhlbnRyaWVzKTtcbiB9OyRo4oCNX29uY2UubWFrZUNvcHlCYWdGcm9tRWxlbWVudHMobWFrZUNvcHlCYWdGcm9tRWxlbWVudHMpO1xuaGFyZGVuKG1ha2VDb3B5QmFnRnJvbUVsZW1lbnRzKTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBDb3B5TWFwIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiBNb3ZlZCB0byBoZXJlIHNvIHRoZXkgY2FuIGNoZWNrIHRoYXQgdGhlIGNvcHlNYXAncyBrZXlzIGNvbnRhaW5zIG9ubHkga2V5cyovXG4vKiB3aXRob3V0IGNyZWF0aW5nIGFuIGltcG9ydCBjeWNsZS4qL1xuXG4vKiogQHR5cGUgV2Vha1NldDxDb3B5TWFwPGFueSxhbnk+PiAqL1xuY29uc3QgY29weU1hcE1lbW89bmV3IFdlYWtTZXQoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBtXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGNoZWNrQ29weU1hcD0obSxjaGVjayk9PntcbmlmKGNvcHlNYXBNZW1vLmhhcyhtKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZighKHBhc3NTdHlsZU9mKG0pPT09J3RhZ2dlZCcmJmdldFRhZyhtKT09PSdjb3B5TWFwJykpe1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYE5vdCBhIGNvcHlNYXA6ICR7bX1gKTtcbiB9XG5jb25zdHtwYXlsb2FkfT1tO1xuaWYocGFzc1N0eWxlT2YocGF5bG9hZCkhPT0nY29weVJlY29yZCcpe1xucmV0dXJuIGNoZWNrKGZhbHNlLFggYEEgY29weU1hcCdzIHBheWxvYWQgbXVzdCBiZSBhIHJlY29yZDogJHttfWApO1xuIH1cbmNvbnN0e2tleXMsdmFsdWVzLC4uLnJlc3R9PXBheWxvYWQ7XG5jb25zdCByZXN1bHQ9XG4ob3duS2V5cyhyZXN0KS5sZW5ndGg9PT0wfHxcbmNoZWNrKFxuZmFsc2UsXG5YIGBBIGNvcHlNYXAncyBwYXlsb2FkIG11c3Qgb25seSBoYXZlIC5rZXlzIGFuZCAudmFsdWVzOiAke219YCkpJiZcblxuY2hlY2tFbGVtZW50cyhrZXlzLGNoZWNrKSYmXG5jaGVja0tleShrZXlzLGNoZWNrKSYmKFxucGFzc1N0eWxlT2YodmFsdWVzKT09PSdjb3B5QXJyYXknfHxcbmNoZWNrKGZhbHNlLFggYEEgY29weU1hcCdzIC52YWx1ZXMgbXVzdCBiZSBhIGNvcHlBcnJheTogJHttfWApKSYmKFxua2V5cy5sZW5ndGg9PT12YWx1ZXMubGVuZ3RofHxcbmNoZWNrKFxuZmFsc2UsXG5YIGBBIGNvcHlNYXAgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBrZXlzIGFuZCB2YWx1ZXM6ICR7bX1gKSk7XG5cbmlmKHJlc3VsdCl7XG5jb3B5TWFwTWVtby5hZGQobSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UuY2hlY2tDb3B5TWFwKGNoZWNrQ29weU1hcCk7XG5oYXJkZW4oY2hlY2tDb3B5TWFwKTtcblxuLyoqXG4gKiBAY2FsbGJhY2sgSXNDb3B5TWFwXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBtXG4gKiBAcmV0dXJucyB7bSBpcyBDb3B5TWFwPEtleSwgUGFzc2FibGU+fVxuICovXG5cbi8qKiBAdHlwZSB7SXNDb3B5TWFwfSAqL1xuY29uc3QgICAgICAgIGlzQ29weU1hcD0obSk9PmNoZWNrQ29weU1hcChtLGlkZW50Q2hlY2tlcik7JGjigI1fb25jZS5pc0NvcHlNYXAoaXNDb3B5TWFwKTtcbmhhcmRlbihpc0NvcHlNYXApO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRDb3B5TWFwXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBtXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBtIGlzIENvcHlNYXA8S2V5LCBQYXNzYWJsZT59XG4gKi9cblxuLyoqIEB0eXBlIHtBc3NlcnRDb3B5TWFwfSAqL1xuY29uc3QgICAgICAgIGFzc2VydENvcHlNYXA9KG0pPT57XG5jaGVja0NvcHlNYXAobSxhc3NlcnRDaGVja2VyKTtcbiB9OyRo4oCNX29uY2UuYXNzZXJ0Q29weU1hcChhc3NlcnRDb3B5TWFwKTtcbmhhcmRlbihhc3NlcnRDb3B5TWFwKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEByZXR1cm5zIHtLW119XG4gKi9cbmNvbnN0ICAgICAgICBnZXRDb3B5TWFwS2V5cz0obSk9PntcbmFzc2VydENvcHlNYXAobSk7XG5yZXR1cm4gbS5wYXlsb2FkLmtleXM7XG4gfTskaOKAjV9vbmNlLmdldENvcHlNYXBLZXlzKGdldENvcHlNYXBLZXlzKTtcbmhhcmRlbihnZXRDb3B5TWFwS2V5cyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7Q29weU1hcDxLLFY+fSBtXG4gKiBAcmV0dXJucyB7VltdfVxuICovXG5jb25zdCAgICAgICAgZ2V0Q29weU1hcFZhbHVlcz0obSk9PntcbmFzc2VydENvcHlNYXAobSk7XG5yZXR1cm4gbS5wYXlsb2FkLnZhbHVlcztcbiB9OyRo4oCNX29uY2UuZ2V0Q29weU1hcFZhbHVlcyhnZXRDb3B5TWFwVmFsdWVzKTtcbmhhcmRlbihnZXRDb3B5TWFwVmFsdWVzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxbSyxWXT59XG4gKi9cbmNvbnN0ICAgICAgICBnZXRDb3B5TWFwRW50cmllcz0obSk9PntcbmFzc2VydENvcHlNYXAobSk7XG5jb25zdHtcbnBheWxvYWQ6e2tleXMsdmFsdWVzfX09XG5tO1xuY29uc3R7bGVuZ3RofT0vKiogQHR5cGUge0FycmF5fSAqL2tleXM7XG5yZXR1cm4gRmFyKCdDb3B5TWFwIGVudHJpZXMgaXRlcmFibGUnLHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5sZXQgaT0wO1xucmV0dXJuIEZhcignQ29weU1hcCBlbnRyaWVzIGl0ZXJhdG9yJyx7XG5uZXh0OigpPT57XG4vKiogQHR5cGUge0l0ZXJhdG9yUmVzdWx0PFtLLFZdLHZvaWQ+fSAqL1xubGV0IHJlc3VsdDtcbmlmKGk8bGVuZ3RoKXtcbnJlc3VsdD1oYXJkZW4oe2RvbmU6ZmFsc2UsdmFsdWU6W2tleXNbaV0sdmFsdWVzW2ldXX0pO1xuaSs9MTtcbnJldHVybiByZXN1bHQ7XG4gfWVsc2V7XG5yZXN1bHQ9aGFyZGVuKHtkb25lOnRydWUsdmFsdWU6dW5kZWZpbmVkfSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9fSk7XG5cbiB9fSk7XG5cbiB9OyRo4oCNX29uY2UuZ2V0Q29weU1hcEVudHJpZXMoZ2V0Q29weU1hcEVudHJpZXMpO1xuaGFyZGVuKGdldENvcHlNYXBFbnRyaWVzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHBhcmFtIHtDb3B5TWFwPEssVj59IG1cbiAqIEBwYXJhbSB7KGtleTogSywgaW5kZXg6IG51bWJlcikgPT4gYm9vbGVhbn0gZm5cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCAgICAgICAgZXZlcnlDb3B5TWFwS2V5PShtLGZuKT0+XG5nZXRDb3B5TWFwS2V5cyhtKS5ldmVyeSgoa2V5LGluZGV4KT0+Zm4oa2V5LGluZGV4KSk7JGjigI1fb25jZS5ldmVyeUNvcHlNYXBLZXkoZXZlcnlDb3B5TWFwS2V5KTtcbmhhcmRlbihldmVyeUNvcHlNYXBLZXkpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHBhcmFtIHsodmFsdWU6IFYsIGluZGV4OiBudW1iZXIpID0+IGJvb2xlYW59IGZuXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgICAgICAgIGV2ZXJ5Q29weU1hcFZhbHVlPShtLGZuKT0+XG5nZXRDb3B5TWFwVmFsdWVzKG0pLmV2ZXJ5KCh2YWx1ZSxpbmRleCk9PmZuKHZhbHVlLGluZGV4KSk7JGjigI1fb25jZS5ldmVyeUNvcHlNYXBWYWx1ZShldmVyeUNvcHlNYXBWYWx1ZSk7XG5oYXJkZW4oZXZlcnlDb3B5TWFwVmFsdWUpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAcGFyYW0ge0NvcHlNYXA8SyxWPn0gbVxuICogQHJldHVybnMge0NvcHlTZXQ8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBjb3B5TWFwS2V5U2V0PShtKT0+XG4vKiBBIGNvcHlNYXAncyBrZXlzIGFyZSBhbHJlYWR5IGluIHRoZSBpbnRlcm5hbCBmb3JtIHVzZWQgYnkgY29weVNldHMuKi9cbm1ha2VUYWdnZWQoJ2NvcHlTZXQnLG0ucGF5bG9hZC5rZXlzKTskaOKAjV9vbmNlLmNvcHlNYXBLZXlTZXQoY29weU1hcEtleVNldCk7XG5oYXJkZW4oY29weU1hcEtleVNldCk7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7SXRlcmFibGU8W0ssIFZdPn0gZW50cmllc1xuICogQHJldHVybnMge0NvcHlNYXA8SyxWPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VDb3B5TWFwPShlbnRyaWVzKT0+e1xuLyogVGhpcyBpcyB3ZWlyZCwgYnV0IHJldmVyc2UgcmFuayBzb3J0aW5nIHRoZSBlbnRyaWVzIGlzIGEgZ29vZCBmaXJzdCBzdGVwKi9cbi8qIGZvciBnZXR0aW5nIHRoZSByYW5rIHNvcnRlZCBrZXlzIHRvZ2V0aGVyIHdpdGggdGhlIHZhbHVlcyovXG4vKiBvcmdhbml6ZWQgYnkgdGhvc2Uga2V5cy4gQWxzbywgYW1vbmcgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCovXG4vKiBrZXlzIGluIHRoZSBzYW1lIGVxdWl2YWxlbmNlIGNsYXNzLCB0aG9zZSBhcmUgcmFuayBzb3J0ZWQuKi9cbi8qIFRPRE8gVGhpcyovXG4vKiBjb3VsZCBzb2x2ZSB0aGUgY29weU1hcCBjb3ZlciBpc3N1ZSBleHBsYWluZWQgaW4gcGF0dGVybk1hdGNoZXJzLmpzLiovXG4vKiBCdXQgb25seSBpZiB3ZSBpbmNsdWRlIHRoaXMgY3JpdGVyaWEgaW4gb3VyIHZhbGlkYXRpb24gb2YgY29weU1hcHMsKi9cbi8qIHdoaWNoIHdlIGN1cnJlbnRseSBkbyBub3QuKi9cbmNvbnN0IHNvcnRlZEVudHJpZXM9c29ydEJ5UmFuayhlbnRyaWVzLGNvbXBhcmVBbnRpUmFuayk7XG5jb25zdCBrZXlzPXNvcnRlZEVudHJpZXMubWFwKChbayxfdl0pPT5rKTtcbmNvbnN0IHZhbHVlcz1zb3J0ZWRFbnRyaWVzLm1hcCgoW19rLHZdKT0+dik7XG5jb25zdCByZXN1bHQ9bWFrZVRhZ2dlZCgnY29weU1hcCcse2tleXMsdmFsdWVzfSk7XG5hc3NlcnRDb3B5TWFwKHJlc3VsdCk7XG5yZXR1cm4gcmVzdWx0O1xuIH07JGjigI1fb25jZS5tYWtlQ29weU1hcChtYWtlQ29weU1hcCk7XG5oYXJkZW4obWFrZUNvcHlNYXApO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gS2V5cyBSZWN1ciAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tLZXlJbnRlcm5hbD0odmFsLGNoZWNrKT0+e1xuY29uc3QgY2hlY2tJdD0oY2hpbGQpPT5jaGVja0tleShjaGlsZCxjaGVjayk7XG5cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZih2YWwpO1xuc3dpdGNoKHBhc3NTdHlsZSl7XG5jYXNlJ2NvcHlSZWNvcmQnOntcbi8qIEEgY29weVJlY29yZCBpcyBhIGtleSBpZmYgYWxsIGl0cyBjaGlsZHJlbiBhcmUga2V5cyovXG5yZXR1cm4gT2JqZWN0LnZhbHVlcyh2YWwpLmV2ZXJ5KGNoZWNrSXQpO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG4vKiBBIGNvcHlBcnJheSBpcyBhIGtleSBpZmYgYWxsIGl0cyBjaGlsZHJlbiBhcmUga2V5cyovXG5yZXR1cm4gdmFsLmV2ZXJ5KGNoZWNrSXQpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdCB0YWc9Z2V0VGFnKHZhbCk7XG5zd2l0Y2godGFnKXtcbmNhc2UnY29weVNldCc6e1xucmV0dXJuIGNoZWNrQ29weVNldCh2YWwsY2hlY2spO1xuIH1cbmNhc2UnY29weUJhZyc6e1xucmV0dXJuIGNoZWNrQ29weUJhZyh2YWwsY2hlY2spO1xuIH1cbmNhc2UnY29weU1hcCc6e1xucmV0dXJuKFxuY2hlY2tDb3B5TWFwKHZhbCxjaGVjaykmJlxuLyogRm9yIGEgY29weU1hcCB0byBiZSBhIGtleSwgYWxsIGl0cyBrZXlzIGFuZCB2YWx1ZXMgbXVzdCovXG4vKiBiZSBrZXlzLiBLZXlzIGFscmVhZHkgY2hlY2tlZCBieSBgY2hlY2tDb3B5TWFwYCBzaW5jZSovXG4vKiB0aGF0J3MgYSBjb3B5TWFwIHJlcXVpcmVtZW50IGluIGdlbmVyYWwuKi9cbmV2ZXJ5Q29weU1hcFZhbHVlKHZhbCxjaGVja0l0KSk7XG5cbiB9XG5kZWZhdWx0OntcbnJldHVybihcbmNoZWNrIT09aWRlbnRDaGVja2VyJiZcbmNoZWNrKGZhbHNlLFggYEEgcGFzc2FibGUgdGFnZ2VkICR7cSh0YWcpfSBpcyBub3QgYSBrZXk6ICR7dmFsfWApKTtcblxuIH19XG5cbiB9XG5jYXNlJ3JlbW90YWJsZSc6e1xuLyogQWxsIHJlbW90YWJsZXMgYXJlIGtleXMuKi9cbnJldHVybiB0cnVlO1xuIH1cbmNhc2UnZXJyb3InOlxuY2FzZSdwcm9taXNlJzp7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgQSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIGEga2V5YCk7XG4gfVxuZGVmYXVsdDp7XG4vKiBVbmV4cGVjdGVkIHRhZ3MgYXJlIGp1c3Qgbm9uLWtleXMsIGJ1dCBhbiB1bmV4cGVjdGVkIHBhc3NTdHlsZSovXG4vKiBpcyBhbHdheXMgYW4gZXJyb3IuKi9cbnRocm93IEZhaWwgYHVuZXhwZWN0ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfTogJHt2YWx9YDtcbiB9fVxuXG4gfTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1ByaW1pdGl2ZUtleSI6WyJpc1ByaW1pdGl2ZUtleSJdLCJhc3NlcnRQcmltaXRpdmVLZXkiOlsiYXNzZXJ0UHJpbWl0aXZlS2V5Il0sImNoZWNrU2NhbGFyS2V5IjpbImNoZWNrU2NhbGFyS2V5Il0sImlzU2NhbGFyS2V5IjpbImlzU2NhbGFyS2V5Il0sImFzc2VydFNjYWxhcktleSI6WyJhc3NlcnRTY2FsYXJLZXkiXSwiY2hlY2tLZXkiOlsiY2hlY2tLZXkiXSwiaXNLZXkiOlsiaXNLZXkiXSwiYXNzZXJ0S2V5IjpbImFzc2VydEtleSJdLCJjaGVja0NvcHlTZXQiOlsiY2hlY2tDb3B5U2V0Il0sImlzQ29weVNldCI6WyJpc0NvcHlTZXQiXSwiYXNzZXJ0Q29weVNldCI6WyJhc3NlcnRDb3B5U2V0Il0sImdldENvcHlTZXRLZXlzIjpbImdldENvcHlTZXRLZXlzIl0sImV2ZXJ5Q29weVNldEtleSI6WyJldmVyeUNvcHlTZXRLZXkiXSwibWFrZUNvcHlTZXQiOlsibWFrZUNvcHlTZXQiXSwiY2hlY2tDb3B5QmFnIjpbImNoZWNrQ29weUJhZyJdLCJpc0NvcHlCYWciOlsiaXNDb3B5QmFnIl0sImFzc2VydENvcHlCYWciOlsiYXNzZXJ0Q29weUJhZyJdLCJnZXRDb3B5QmFnRW50cmllcyI6WyJnZXRDb3B5QmFnRW50cmllcyJdLCJldmVyeUNvcHlCYWdFbnRyeSI6WyJldmVyeUNvcHlCYWdFbnRyeSJdLCJtYWtlQ29weUJhZyI6WyJtYWtlQ29weUJhZyJdLCJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyI6WyJtYWtlQ29weUJhZ0Zyb21FbGVtZW50cyJdLCJjaGVja0NvcHlNYXAiOlsiY2hlY2tDb3B5TWFwIl0sImlzQ29weU1hcCI6WyJpc0NvcHlNYXAiXSwiYXNzZXJ0Q29weU1hcCI6WyJhc3NlcnRDb3B5TWFwIl0sImdldENvcHlNYXBLZXlzIjpbImdldENvcHlNYXBLZXlzIl0sImdldENvcHlNYXBWYWx1ZXMiOlsiZ2V0Q29weU1hcFZhbHVlcyJdLCJnZXRDb3B5TWFwRW50cmllcyI6WyJnZXRDb3B5TWFwRW50cmllcyJdLCJldmVyeUNvcHlNYXBLZXkiOlsiZXZlcnlDb3B5TWFwS2V5Il0sImV2ZXJ5Q29weU1hcFZhbHVlIjpbImV2ZXJ5Q29weU1hcFZhbHVlIl0sImNvcHlNYXBLZXlTZXQiOlsiY29weU1hcEtleVNldCJdLCJtYWtlQ29weU1hcCI6WyJtYWtlQ29weU1hcCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAArf4Jz4hoAAOIaAAAsAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2tleXMvY29tcGFyZUtleXMuanN7ImltcG9ydHMiOlsiLi9jaGVja0tleS5qcyIsIi4vbWVyZ2UtYmFnLW9wZXJhdG9ycy5qcyIsIi4vbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcyIsIkBlbmRvL21hcnNoYWwiLCJAZW5kby9tYXJzaGFsL3NyYy9lbmNvZGVQYXNzYWJsZS5qcyIsIkBlbmRvL21hcnNoYWwvc3JjL3JhbmtPcmRlci5qcyJdLCJleHBvcnRzIjpbImNvbXBhcmVLZXlzIiwia2V5RVEiLCJrZXlHVCIsImtleUdURSIsImtleUxUIiwia2V5TFRFIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IHBhc3NTdHlsZU9mLGdldFRhZyxjb21wYXJlUmFuayxyZWNvcmROYW1lcyxyZWNvcmRWYWx1ZXMsYXNzZXJ0S2V5LGJhZ0NvbXBhcmUsc2V0Q29tcGFyZTskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dLFtcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWwvc3JjL3JhbmtPcmRlci5qc1wiLCBbW1wiY29tcGFyZVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVSYW5rID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWwvc3JjL2VuY29kZVBhc3NhYmxlLmpzXCIsIFtbXCJyZWNvcmROYW1lc1wiLCBbJGjigI1fYSA9PiAocmVjb3JkTmFtZXMgPSAkaOKAjV9hKV1dLFtcInJlY29yZFZhbHVlc1wiLCBbJGjigI1fYSA9PiAocmVjb3JkVmFsdWVzID0gJGjigI1fYSldXV1dLFtcIi4vY2hlY2tLZXkuanNcIiwgW1tcImFzc2VydEtleVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0S2V5ID0gJGjigI1fYSldXV1dLFtcIi4vbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc1wiLCBbW1wiYmFnQ29tcGFyZVwiLCBbJGjigI1fYSA9PiAoYmFnQ29tcGFyZSA9ICRo4oCNX2EpXV1dXSxbXCIuL21lcmdlLXNldC1vcGVyYXRvcnMuanNcIiwgW1tcInNldENvbXBhcmVcIiwgWyRo4oCNX2EgPT4gKHNldENvbXBhcmUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuLyoqIEB0eXBlIHtLZXlDb21wYXJlfSAqL1xuY29uc3QgICAgICAgIGNvbXBhcmVLZXlzPShsZWZ0LHJpZ2h0KT0+e1xuYXNzZXJ0S2V5KGxlZnQpO1xuYXNzZXJ0S2V5KHJpZ2h0KTtcbmNvbnN0IGxlZnRTdHlsZT1wYXNzU3R5bGVPZihsZWZ0KTtcbmNvbnN0IHJpZ2h0U3R5bGU9cGFzc1N0eWxlT2YocmlnaHQpO1xuaWYobGVmdFN0eWxlIT09cmlnaHRTdHlsZSl7XG4vKiBEaWZmZXJlbnQgcGFzc1N0eWxlcyBhcmUgaW5jb21tZW5zdXJhdGUqL1xucmV0dXJuIE5hTjtcbiB9XG5zd2l0Y2gobGVmdFN0eWxlKXtcbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnbnVsbCc6XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdiaWdpbnQnOlxuY2FzZSdzdHJpbmcnOlxuY2FzZSdzeW1ib2wnOntcbi8qIGZvciB0aGVzZSwga2V5cyBjb21wYXJlIHRoZSBzYW1lIGFzIHJhbmsqL1xucmV0dXJuIGNvbXBhcmVSYW5rKGxlZnQscmlnaHQpO1xuIH1cbmNhc2UnbnVtYmVyJzp7XG5jb25zdCByYW5rQ29tcD1jb21wYXJlUmFuayhsZWZ0LHJpZ2h0KTtcbmlmKHJhbmtDb21wPT09MCl7XG5yZXR1cm4gMDtcbiB9XG5pZihOdW1iZXIuaXNOYU4obGVmdCl8fE51bWJlci5pc05hTihyaWdodCkpe1xuLyogTmFOIGlzIGVxdWFsIHRvIGl0c2VsZiwgYnV0IGluY29tbWVuc3VyYXRlIHdpdGggZXZlcnl0aGluZyBlbHNlKi9cbmFzc2VydCghTnVtYmVyLmlzTmFOKGxlZnQpfHwhTnVtYmVyLmlzTmFOKHJpZ2h0KSk7XG5yZXR1cm4gTmFOO1xuIH1cbi8qIEFtb25nIG5vbi1OYU4gbnVtYmVycywga2V5IG9yZGVyIGlzIHRoZSBzYW1lIGFzIHJhbmsgb3JkZXIuIE5vdGUgdGhhdCovXG4vKiBpbiBib3RoIG9yZGVycywgYC0wYCBpcyBpbiB0aGUgc2FtZSBlcXVpdmFsZW5jZSBjbGFzcyBhcyBgMGAuKi9cbnJldHVybiByYW5rQ29tcDtcbiB9XG5jYXNlJ3JlbW90YWJsZSc6e1xuaWYobGVmdD09PXJpZ2h0KXtcbnJldHVybiAwO1xuIH1cbi8qIElmIHR3byByZW1vdGFibGVzIGFyZSBub3QgaWRlbnRpY2FsLCB0aGVuIGFzIGtleXMgdGhleSBhcmUqL1xuLyogaW5jb21tZW5zdXJhdGUuKi9cbnJldHVybiBOYU47XG4gfVxuY2FzZSdjb3B5QXJyYXknOntcbi8qIExleGljb2dyYXBoaWMgYnkga2V5IG9yZGVyLiBSYW5rIG9yZGVyIG9mIGFycmF5cyBpcyBsZXhpY29ncmFwaGljIGJ5Ki9cbi8qIHJhbmsgb3JkZXIuKi9cbi8qIEJlY2F1c2UgdGhlIGludmFyaWFudHMgYWJvdmUgYXBwbHkgdG8gdGhlIGVsZW1lbnRzIG9mIHRoZSBhcnJheSwqL1xuLyogdGhleSBhcHBseSB0byB0aGUgYXJyYXkgYXMgYSB3aG9sZS4qL1xuY29uc3QgbGVuPU1hdGgubWluKGxlZnQubGVuZ3RoLHJpZ2h0Lmxlbmd0aCk7XG5mb3IobGV0IGk9MDtpPGxlbjtpKz0xKXtcbmNvbnN0IHJlc3VsdD1jb21wYXJlS2V5cyhsZWZ0W2ldLHJpZ2h0W2ldKTtcbmlmKHJlc3VsdCE9PTApe1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfVxuLyogSWYgYWxsIG1hdGNoaW5nIGVsZW1lbnRzIGFyZSBrZXlFUSwgdGhlbiBhY2NvcmRpbmcgdG8gdGhlaXIgbGVuZ3Rocy4qL1xuLyogVGh1cywgaWYgYXJyYXkgWCBpcyBhIHByZWZpeCBvZiBhcnJheSBZLCB0aGVuIFggaXMgc21hbGxlciB0aGFuIFkuKi9cbnJldHVybiBjb21wYXJlUmFuayhsZWZ0Lmxlbmd0aCxyaWdodC5sZW5ndGgpO1xuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuLyogUGFyZXRvIHBhcnRpYWwgb3JkZXIgY29tcGFyaXNvbi4qL1xuY29uc3QgbGVmdE5hbWVzPXJlY29yZE5hbWVzKGxlZnQpO1xuY29uc3QgcmlnaHROYW1lcz1yZWNvcmROYW1lcyhyaWdodCk7XG5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5pZigha2V5RVEobGVmdE5hbWVzLHJpZ2h0TmFtZXMpKXtcbi8qIElmIHRoZXkgZG8gbm90IGhhdmUgZXhhY3RseSB0aGUgc2FtZSBwcm9wZXJ0aWVzLCovXG4vKiB0aGV5IGFyZSBpbmNvbW1lbnN1cmF0ZS4qL1xuLyogTm90ZSB0aGF0IHJhbmsgc29ydGluZyBvZiBjb3B5UmVjb3JkcyBncm91cHMgYWxsIGNvcHlSZWNvcmRzIHdpdGgqL1xuLyogdGhlIHNhbWUga2V5cyB0b2dldGhlciwgZW5hYmxpbmcgcmFuZ2Ugc2VhcmNoaW5nIG92ZXIgY29weVJlY29yZHMqL1xuLyogdG8gYXZvaWQgbW9yZSBpcnJlbGV2YW50IG9uZXMuKi9cbnJldHVybiBOYU47XG4gfVxuY29uc3QgbGVmdFZhbHVlcz1yZWNvcmRWYWx1ZXMobGVmdCxsZWZ0TmFtZXMpO1xuY29uc3QgcmlnaHRWYWx1ZXM9cmVjb3JkVmFsdWVzKHJpZ2h0LHJpZ2h0TmFtZXMpO1xuLyogUHJlc3VtZSB0aGF0IGJvdGggY29weVJlY29yZHMgaGF2ZSB0aGUgc2FtZSBrZXkgb3JkZXIqL1xuLyogdW50aWwgZW5jb3VudGVyaW5nIGEgcHJvcGVydHkgZGlzcHJvdmluZyB0aGF0IGh5cG90aGVzaXMuKi9cbmxldCByZXN1bHQ9MDtcbmZvcihsZXQgaT0wO2k8bGVmdFZhbHVlcy5sZW5ndGg7aSs9MSl7XG5jb25zdCBjb21wPWNvbXBhcmVLZXlzKGxlZnRWYWx1ZXNbaV0scmlnaHRWYWx1ZXNbaV0pO1xuaWYoTnVtYmVyLmlzTmFOKGNvbXApKXtcbnJldHVybiBOYU47XG4gfVxuaWYocmVzdWx0IT09Y29tcCYmY29tcCE9PTApe1xuaWYocmVzdWx0PT09MCl7XG5yZXN1bHQ9Y29tcDtcbiB9ZWxzZXtcbmFzc2VydChcbnJlc3VsdD09PS0xJiZjb21wPT09MXx8cmVzdWx0PT09MSYmY29tcD09PS0xKTtcblxucmV0dXJuIE5hTjtcbiB9XG4gfVxuIH1cbi8qIElmIGNvcHlSZWNvcmQgWCBpcyBzbWFsbGVyIHRoYW4gY29weVJlY29yZCBZLCB0aGVuIHRoZXkgbXVzdCBoYXZlIHRoZSovXG4vKiBzYW1lIHByb3BlcnR5IG5hbWVzIGFuZCBldmVyeSB2YWx1ZSBpbiBYIG11c3QgYmUgc21hbGxlciBvciBlcXVhbCB0byovXG4vKiB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZSBpbiBZICh3aXRoIGF0IGxlYXN0IG9uZSB2YWx1ZSBzbWFsbGVyKS4qL1xuLyogVGhlIHJhbmsgb3JkZXIgb2YgWCBhbmQgWSBpcyBiYXNlZCBvbiBsZXhpY29ncmFwaGljIHJhbmsgb3JkZXIgb2YqL1xuLyogdGhlaXIgdmFsdWVzLCBhcyBvcmdhbml6ZWQgYnkgcmV2ZXJzZSBsZXhpY29ncmFwaGljIG9yZGVyIG9mIHRoZWlyKi9cbi8qIHByb3BlcnR5IG5hbWVzLiovXG4vKiBUaHVzIGlmIGNvbXBhcmVLZXlzKFgsWSkgPCAwIHRoZW4gY29tcGFyZVJhbmsoWCxZKSA8IDAuKi9cbnJldHVybiByZXN1bHQ7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0IGxlZnRUYWc9Z2V0VGFnKGxlZnQpO1xuY29uc3QgcmlnaHRUYWc9Z2V0VGFnKHJpZ2h0KTtcbmlmKGxlZnRUYWchPT1yaWdodFRhZyl7XG4vKiBkaWZmZXJlbnQgdGFncyBhcmUgaW5jb21tZW5zdXJhdGUqL1xucmV0dXJuIE5hTjtcbiB9XG5zd2l0Y2gobGVmdFRhZyl7XG5jYXNlJ2NvcHlTZXQnOntcbi8qIGNvcHlTZXQgWCBpcyBzbWFsbGVyIHRoYW4gY29weVNldCBZIHdoZW4gZXZlcnkgZWxlbWVudCBvZiBYKi9cbi8qIGlzIGtleUVRIHRvIHNvbWUgZWxlbWVudCBvZiBZIGFuZCBzb21lIGVsZW1lbnQgb2YgWSBpcyovXG4vKiBub3Qga2V5RVEgdG8gYW55IGVsZW1lbnQgb2YgWC4qL1xucmV0dXJuIHNldENvbXBhcmUobGVmdCxyaWdodCk7XG4gfVxuY2FzZSdjb3B5QmFnJzp7XG4vKiBjb3B5QmFnIFggaXMgc21hbGxlciB0aGFuIGNvcHlCYWcgWSB3aGVuIGV2ZXJ5IGVsZW1lbnQgb2YgWCovXG4vKiBvY2N1cnMgbm8gbW9yZSB0aGFuIHRoZSBrZXlFUSBlbGVtZW50IG9mIFksIGFuZCBzb21lIGVsZW1lbnQqL1xuLyogb2YgWSBvY2N1cnMgbW9yZSB0aGFuIHNvbWUgZWxlbWVudCBvZiBYLCB3aGVyZSBiZWluZyBhYnNlbnQqL1xuLyogZnJvbSBYIGNvdW50cyBhcyBvY2N1cnJpbmcgemVybyB0aW1lcy4qL1xucmV0dXJuIGJhZ0NvbXBhcmUobGVmdCxyaWdodCk7XG4gfVxuY2FzZSdjb3B5TWFwJzp7XG4vKiBUd28gY29weU1hcHMgdGhhdCBoYXZlIGRpZmZlcmVudCBrZXlzIChhY2NvcmRpbmcgdG8ga2V5RVEpIGFyZSovXG4vKiBpbmNvbW1lbnN1cmF0ZS4gVGhlIHJlcHJlc2VudGF0aW9uIG9mIGNvcHlNYXBzIGluY2x1ZGVzIHRoZSBrZXlzKi9cbi8qIGZpcnN0LCBpbiB0aGUgc2FtZSByZXZlcnNlIHJhbmsgb3JkZXIgdXNlZCBieSBzZXRzLiBUaHVzLCBhbGwqL1xuLyogY29weU1hcHMgd2l0aCBrZXlzIG9mIHRoZSBzYW1lIHJhbmsgKHdoaWNoIGlzKi9cbi8qIGxlc3MgcHJlY2lzZSEpIHdpbGwgYmUgZ3JvdXBlZCB0b2dldGhlciB3aGVuIGNvcHlNYXBzIGFyZSBzb3J0ZWQqL1xuLyogYnkgcmFuaywgbWluaW1pemluZyB0aGUgbnVtYmVyIG9mIG1pc3NlcyB3aGVuIHJhbmdlIHNlYXJjaGluZy4qL1xuLyoqL1xuLyogQW1vbmcgY29weU1hcHMgd2l0aCB0aGUgc2FtZSBrZXlzIChhY2NvcmRpbmcgdG8ga2V5RVEpLCB0aGV5Ki9cbi8qIGNvbXBhcmUgYnkgYSBjb3JyZXNwb25kaW5nIGNvbXBhcmlzb24gb2YgdGhlaXIgdmFsdWVzLiBUaHVzLCBhcyovXG4vKiB3aXRoIHJlY29yZHMsIGZvciB0d28gY29weU1hcHMgWCBhbmQgWSwgaWYgYGNvbXBhcmVLZXlzKFgsWSkgPCovXG4vKiAwYCB0aGVuLCBiZWNhdXNlIHRoZXNlIHZhbHVlcyBvYmV5IHRoZSBhYm92ZSBpbnZhcmlhbnRzLCBub25lIG9mKi9cbi8qIHRoZSB2YWx1ZXMgaW4gWCBoYXZlIGEgbGF0ZXIgcmFuayB0aGFuIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlKi9cbi8qIG9mIFkuIFRodXMsIGBjb21wYXJlUmFuayhYLFkpIDw9IDBgLiBUT0RPIGltcGxlbWVudCovXG50aHJvdyBGYWlsIGBNYXAgY29tcGFyaXNvbiBub3QgeWV0IGltcGxlbWVudGVkOiAke2xlZnR9IHZzICR7cmlnaHR9YDtcbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYHVuZXhwZWN0ZWQgdGFnICR7cShsZWZ0VGFnKX06ICR7bGVmdH1gO1xuIH19XG5cbiB9XG5kZWZhdWx0OntcbnRocm93IEZhaWwgYHVuZXhwZWN0ZWQgcGFzc1N0eWxlICR7cShsZWZ0U3R5bGUpfTogJHtsZWZ0fWA7XG4gfX1cblxuIH07JGjigI1fb25jZS5jb21wYXJlS2V5cyhjb21wYXJlS2V5cyk7XG5oYXJkZW4oY29tcGFyZUtleXMpO1xuXG5jb25zdCAgICAgICAga2V5TFQ9KGxlZnQscmlnaHQpPT5jb21wYXJlS2V5cyhsZWZ0LHJpZ2h0KTwwOyRo4oCNX29uY2Uua2V5TFQoa2V5TFQpO1xuaGFyZGVuKGtleUxUKTtcblxuY29uc3QgICAgICAgIGtleUxURT0obGVmdCxyaWdodCk9PmNvbXBhcmVLZXlzKGxlZnQscmlnaHQpPD0wOyRo4oCNX29uY2Uua2V5TFRFKGtleUxURSk7XG5oYXJkZW4oa2V5TFRFKTtcblxuY29uc3QgICAgICAgIGtleUVRPShsZWZ0LHJpZ2h0KT0+Y29tcGFyZUtleXMobGVmdCxyaWdodCk9PT0wOyRo4oCNX29uY2Uua2V5RVEoa2V5RVEpO1xuaGFyZGVuKGtleUVRKTtcblxuY29uc3QgICAgICAgIGtleUdURT0obGVmdCxyaWdodCk9PmNvbXBhcmVLZXlzKGxlZnQscmlnaHQpPj0wOyRo4oCNX29uY2Uua2V5R1RFKGtleUdURSk7XG5oYXJkZW4oa2V5R1RFKTtcblxuY29uc3QgICAgICAgIGtleUdUPShsZWZ0LHJpZ2h0KT0+Y29tcGFyZUtleXMobGVmdCxyaWdodCk+MDskaOKAjV9vbmNlLmtleUdUKGtleUdUKTtcbmhhcmRlbihrZXlHVCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiY29tcGFyZUtleXMiOlsiY29tcGFyZUtleXMiXSwia2V5TFQiOlsia2V5TFQiXSwia2V5TFRFIjpbImtleUxURSJdLCJrZXlFUSI6WyJrZXlFUSJdLCJrZXlHVEUiOlsia2V5R1RFIl0sImtleUdUIjpbImtleUdUIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAC28ThEbEwAAGxMAACgAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMva2V5cy9jb3B5QmFnLmpzeyJpbXBvcnRzIjpbIkBlbmRvL21hcnNoYWwiLCJAZW5kby9tYXJzaGFsL3NyYy9yYW5rT3JkZXIuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRCYWdFbnRyaWVzIiwiYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzIiwiY2hlY2tCYWdFbnRyaWVzIiwiY29lcmNlVG9CYWdFbnRyaWVzIiwibWFrZUJhZ09mRW50cmllcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsY29tcGFyZUFudGlSYW5rLGlzUmFua1NvcnRlZCxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsL3NyYy9yYW5rT3JkZXIuanNcIiwgW1tcImNvbXBhcmVBbnRpUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjigI1fYSldXSxbXCJpc1JhbmtTb3J0ZWRcIiwgWyRo4oCNX2EgPT4gKGlzUmFua1NvcnRlZCA9ICRo4oCNX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjigI1fYSldXSxbXCJzb3J0QnlSYW5rXCIsIFskaOKAjV9hID0+IChzb3J0QnlSYW5rID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cbi8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1tULGJpZ2ludF1bXX0gYmFnRW50cmllc1xuICogQHBhcmFtIHtGdWxsQ29tcGFyZSB8IHVuZGVmaW5lZH0gZnVsbENvbXBhcmUgSWYgcHJvdmlkZWQgYW5kIGBiYWdFbnRyaWVzYCBpcyBhbHJlYWR5XG4gKiBrbm93biB0byBiZSBzb3J0ZWQgYnkgdGhpcyBgZnVsbENvbXBhcmVgLCB0aGVuIHdlIHNob3VsZCBnZXQgYSBtZW1vIGhpdFxuICogcmF0aGVyIHRoYW4gYSByZXNvcnRpbmcuIEhvd2V2ZXIsIGN1cnJlbnRseSwgd2Ugc3RpbGwgZW51bWVyYXRlIHRoZSBlbnRpcmVcbiAqIGFycmF5IGVhY2ggdGltZS5cbiAqXG4gKiBUT0RPOiBJZiBkb2luZyB0aGlzIHJlZHVudGFudGx5IHR1cm5zIG91dCB0byBiZSBleHBlbnNpdmUsIHdlXG4gKiBjb3VsZCBtZW1vaXplIHRoaXMgbm8tZHVwbGljYXRlLWtleXMgZmluZGluZyBhcyB3ZWxsLCBpbmRlcGVuZGVudFxuICogb2YgdGhlIGBmdWxsT3JkZXJgIHVzZSB0byByZWFjaCB0aGlzIGZpbmRpbmcuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tOb0R1cGxpY2F0ZUtleXM9KGJhZ0VudHJpZXMsZnVsbENvbXBhcmUsY2hlY2spPT57XG4vKiBUaGlzIGZ1bGxPcmRlciBjb250YWlucyBoaXN0b3J5IGRlcGVuZGVudCBzdGF0ZS4gSXQgaXMgc3BlY2lmaWMqL1xuLyogdG8gdGhpcyBvbmUgY2FsbCBhbmQgZG9lcyBub3Qgc3Vydml2ZSBpdC4qL1xuLyogVE9ETyBPbmNlIGFsbCBvdXIgdG9vbGluZyBpcyByZWFkeSBmb3IgYCYmPWAsIHRoZSBmb2xsb3dpbmcqL1xuLyogbGluZSBzaG91bGQgYmUgcmV3cml0dGVuIHVzaW5nIGl0LiovXG5mdWxsQ29tcGFyZT1mdWxsQ29tcGFyZXx8bWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcblxuLyogU2luY2UgdGhlIGtleSBpcyBtb3JlIHNpZ25pZmljYW50IHRoYW4gdGhlIHZhbHVlICh0aGUgY291bnQpLCovXG4vKiBzb3J0aW5nIGJ5IGZ1bGxPcmRlciBpcyBndWFyYW50ZWVkIHRvIG1ha2UgZHVwbGljYXRlIGtleXMqL1xuLyogYWRqYWNlbnQgaW5kZXBlbmRlbnQgb2YgdGhlaXIgY291bnRzLiovXG5iYWdFbnRyaWVzPXNvcnRCeVJhbmsoYmFnRW50cmllcyxmdWxsQ29tcGFyZSk7XG5jb25zdHtsZW5ndGh9PWJhZ0VudHJpZXM7XG5mb3IobGV0IGk9MTtpPGxlbmd0aDtpKz0xKXtcbmNvbnN0IGswPWJhZ0VudHJpZXNbaS0xXVswXTtcbmNvbnN0IGsxPWJhZ0VudHJpZXNbaV1bMF07XG5pZihmdWxsQ29tcGFyZShrMCxrMSk9PT0wKXtcbnJldHVybiBjaGVjayhmYWxzZSxYIGB2YWx1ZSBoYXMgZHVwbGljYXRlIGtleXM6ICR7azB9YCk7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7W1QsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge0Z1bGxDb21wYXJlfSBbZnVsbENvbXBhcmVdXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuY29uc3QgICAgICAgIGFzc2VydE5vRHVwbGljYXRlS2V5cz0oYmFnRW50cmllcyxmdWxsQ29tcGFyZT11bmRlZmluZWQpPT57XG5jaGVja05vRHVwbGljYXRlS2V5cyhiYWdFbnRyaWVzLGZ1bGxDb21wYXJlLGFzc2VydENoZWNrZXIpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtbUGFzc2FibGUsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqLyRo4oCNX29uY2UuYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzKGFzc2VydE5vRHVwbGljYXRlS2V5cyk7XG5jb25zdCAgICAgICAgY2hlY2tCYWdFbnRyaWVzPShiYWdFbnRyaWVzLGNoZWNrKT0+e1xuaWYocGFzc1N0eWxlT2YoYmFnRW50cmllcykhPT0nY29weUFycmF5Jyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYFRoZSBlbnRyaWVzIG9mIGEgY29weUJhZyBtdXN0IGJlIGEgY29weUFycmF5OiAke2JhZ0VudHJpZXN9YCk7XG5cbiB9XG5pZighaXNSYW5rU29ydGVkKGJhZ0VudHJpZXMsY29tcGFyZUFudGlSYW5rKSl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYFRoZSBlbnRyaWVzIG9mIGEgY29weUJhZyBtdXN0IGJlIHNvcnRlZCBpbiByZXZlcnNlIHJhbmsgb3JkZXI6ICR7YmFnRW50cmllc31gKTtcblxuIH1cbmZvcihjb25zdCBlbnRyeSBvZiBiYWdFbnRyaWVzKXtcbmlmKFxucGFzc1N0eWxlT2YoZW50cnkpIT09J2NvcHlBcnJheSd8fFxuZW50cnkubGVuZ3RoIT09Mnx8XG50eXBlb2YgZW50cnlbMV0hPT0nYmlnaW50JylcbntcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgRWFjaCBlbnRyeSBvZiBhIGNvcHlCYWcgbXVzdCBiZSBwYWlyIG9mIGEga2V5IGFuZCBhIGJpZ2ludCByZXByZXNlbnRpbmcgYSBjb3VudDogJHtlbnRyeX1gKTtcblxuIH1cbmlmKGVudHJ5WzFdPDEpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBFYWNoIGVudHJ5IG9mIGEgY29weUJhZyBtdXN0IGhhdmUgYSBwb3NpdGl2ZSBjb3VudDogJHtlbnRyeX1gKTtcblxuIH1cbiB9XG5yZXR1cm4gY2hlY2tOb0R1cGxpY2F0ZUtleXMoYmFnRW50cmllcyx1bmRlZmluZWQsY2hlY2spO1xuIH07JGjigI1fb25jZS5jaGVja0JhZ0VudHJpZXMoY2hlY2tCYWdFbnRyaWVzKTtcbmhhcmRlbihjaGVja0JhZ0VudHJpZXMpO1xuXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUganNkb2MvcmVxdWlyZS1yZXR1cm5zLWNoZWNrIC0tIGRvZXNuJ3QgdW5kZXJzdGFuZCBhc3NlcnRzKi9cbi8qKlxuICogQHBhcmFtIHtbUGFzc2FibGUsYmlnaW50XVtdfSBiYWdFbnRyaWVzXG4gKiBAcmV0dXJucyB7YXNzZXJ0cyBiYWdFbnRyaWVzIGlzIFtQYXNzYWJsZSxiaWdpbnRdW119XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRCYWdFbnRyaWVzPShiYWdFbnRyaWVzKT0+e1xuY2hlY2tCYWdFbnRyaWVzKGJhZ0VudHJpZXMsYXNzZXJ0Q2hlY2tlcik7XG4gfTskaOKAjV9vbmNlLmFzc2VydEJhZ0VudHJpZXMoYXNzZXJ0QmFnRW50cmllcyk7XG5oYXJkZW4oYXNzZXJ0QmFnRW50cmllcyk7XG5cbmNvbnN0ICAgICAgICBjb2VyY2VUb0JhZ0VudHJpZXM9KGJhZ0VudHJpZXNMaXN0KT0+e1xuY29uc3QgYmFnRW50cmllcz1zb3J0QnlSYW5rKGJhZ0VudHJpZXNMaXN0LGNvbXBhcmVBbnRpUmFuayk7XG5hc3NlcnRCYWdFbnRyaWVzKGJhZ0VudHJpZXMpO1xucmV0dXJuIGJhZ0VudHJpZXM7XG4gfTskaOKAjV9vbmNlLmNvZXJjZVRvQmFnRW50cmllcyhjb2VyY2VUb0JhZ0VudHJpZXMpO1xuaGFyZGVuKGNvZXJjZVRvQmFnRW50cmllcyk7XG5cbi8qKlxuICogQHRlbXBsYXRlIEtcbiAqIEBwYXJhbSB7SXRlcmFibGU8W0ssIGJpZ2ludF0+fSBiYWdFbnRyeUl0ZXJcbiAqIEByZXR1cm5zIHtDb3B5QmFnPEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUJhZ09mRW50cmllcz0oYmFnRW50cnlJdGVyKT0+XG5tYWtlVGFnZ2VkKCdjb3B5QmFnJyxjb2VyY2VUb0JhZ0VudHJpZXMoYmFnRW50cnlJdGVyKSk7JGjigI1fb25jZS5tYWtlQmFnT2ZFbnRyaWVzKG1ha2VCYWdPZkVudHJpZXMpO1xuaGFyZGVuKG1ha2VCYWdPZkVudHJpZXMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydE5vRHVwbGljYXRlS2V5cyI6WyJhc3NlcnROb0R1cGxpY2F0ZUtleXMiXSwiY2hlY2tCYWdFbnRyaWVzIjpbImNoZWNrQmFnRW50cmllcyJdLCJhc3NlcnRCYWdFbnRyaWVzIjpbImFzc2VydEJhZ0VudHJpZXMiXSwiY29lcmNlVG9CYWdFbnRyaWVzIjpbImNvZXJjZVRvQmFnRW50cmllcyJdLCJtYWtlQmFnT2ZFbnRyaWVzIjpbIm1ha2VCYWdPZkVudHJpZXMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAonxhGJQPAACUDwAAKAAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9rZXlzL2NvcHlTZXQuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL21hcnNoYWwvc3JjL3JhbmtPcmRlci5qcyJdLCJleHBvcnRzIjpbImFzc2VydEVsZW1lbnRzIiwiYXNzZXJ0Tm9EdXBsaWNhdGVzIiwiY2hlY2tFbGVtZW50cyIsImNvZXJjZVRvRWxlbWVudHMiLCJtYWtlU2V0T2ZFbGVtZW50cyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsY29tcGFyZUFudGlSYW5rLGlzUmFua1NvcnRlZCxtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCxzb3J0QnlSYW5rOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsL3NyYy9yYW5rT3JkZXIuanNcIiwgW1tcImNvbXBhcmVBbnRpUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjigI1fYSldXSxbXCJpc1JhbmtTb3J0ZWRcIiwgWyRo4oCNX2EgPT4gKGlzUmFua1NvcnRlZCA9ICRo4oCNX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjigI1fYSldXSxbXCJzb3J0QnlSYW5rXCIsIFskaOKAjV9hID0+IChzb3J0QnlSYW5rID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cbi8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1RbXX0gZWxlbWVudHNcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmUgfCB1bmRlZmluZWR9IGZ1bGxDb21wYXJlIElmIHByb3ZpZGVkIGFuZCBgZWxlbWVudHNgIGlzIGFscmVhZHkga25vd25cbiAqIHRvIGJlIHNvcnRlZCBieSB0aGlzIGBmdWxsQ29tcGFyZWAsIHRoZW4gd2Ugc2hvdWxkIGdldCBhIG1lbW8gaGl0IHJhdGhlclxuICogdGhhbiBhIHJlc29ydGluZy4gSG93ZXZlciwgY3VycmVudGx5LCB3ZSBzdGlsbCBlbnVtZXJhdGUgdGhlIGVudGlyZSBhcnJheVxuICogZWFjaCB0aW1lLlxuICpcbiAqIFRPRE86IElmIGRvaW5nIHRoaXMgcmVkdW50YW50bHkgdHVybnMgb3V0IHRvIGJlIGV4cGVuc2l2ZSwgd2VcbiAqIGNvdWxkIG1lbW9pemUgdGhpcyBuby1kdXBsaWNhdGUgZmluZGluZyBhcyB3ZWxsLCBpbmRlcGVuZGVudFxuICogb2YgdGhlIGBmdWxsT3JkZXJgIHVzZSB0byByZWFjaCB0aGlzIGZpbmRpbmcuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tOb0R1cGxpY2F0ZXM9KGVsZW1lbnRzLGZ1bGxDb21wYXJlLGNoZWNrKT0+e1xuLyogVGhpcyBmdWxsT3JkZXIgY29udGFpbnMgaGlzdG9yeSBkZXBlbmRlbnQgc3RhdGUuIEl0IGlzIHNwZWNpZmljKi9cbi8qIHRvIHRoaXMgb25lIGNhbGwgYW5kIGRvZXMgbm90IHN1cnZpdmUgaXQuKi9cbi8qIFRPRE8gT25jZSBhbGwgb3VyIHRvb2xpbmcgaXMgcmVhZHkgZm9yIGAmJj1gLCB0aGUgZm9sbG93aW5nKi9cbi8qIGxpbmUgc2hvdWxkIGJlIHJld3JpdHRlbiB1c2luZyBpdC4qL1xuZnVsbENvbXBhcmU9ZnVsbENvbXBhcmV8fG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbmVsZW1lbnRzPXNvcnRCeVJhbmsoZWxlbWVudHMsZnVsbENvbXBhcmUpO1xuY29uc3R7bGVuZ3RofT1lbGVtZW50cztcbmZvcihsZXQgaT0xO2k8bGVuZ3RoO2krPTEpe1xuY29uc3QgazA9ZWxlbWVudHNbaS0xXTtcbmNvbnN0IGsxPWVsZW1lbnRzW2ldO1xuaWYoZnVsbENvbXBhcmUoazAsazEpPT09MCl7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgdmFsdWUgaGFzIGR1cGxpY2F0ZXM6ICR7azB9YCk7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VFtdfSBlbGVtZW50c1xuICogQHBhcmFtIHtGdWxsQ29tcGFyZX0gW2Z1bGxDb21wYXJlXVxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnROb0R1cGxpY2F0ZXM9KGVsZW1lbnRzLGZ1bGxDb21wYXJlPXVuZGVmaW5lZCk9PntcbmNoZWNrTm9EdXBsaWNhdGVzKGVsZW1lbnRzLGZ1bGxDb21wYXJlLGFzc2VydENoZWNrZXIpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBlbGVtZW50c1xuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi8kaOKAjV9vbmNlLmFzc2VydE5vRHVwbGljYXRlcyhhc3NlcnROb0R1cGxpY2F0ZXMpO1xuY29uc3QgICAgICAgIGNoZWNrRWxlbWVudHM9KGVsZW1lbnRzLGNoZWNrKT0+e1xuaWYocGFzc1N0eWxlT2YoZWxlbWVudHMpIT09J2NvcHlBcnJheScpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBUaGUga2V5cyBvZiBhIGNvcHlTZXQgb3IgY29weU1hcCBtdXN0IGJlIGEgY29weUFycmF5OiAke2VsZW1lbnRzfWApO1xuXG4gfVxuaWYoIWlzUmFua1NvcnRlZChlbGVtZW50cyxjb21wYXJlQW50aVJhbmspKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgVGhlIGtleXMgb2YgYSBjb3B5U2V0IG9yIGNvcHlNYXAgbXVzdCBiZSBzb3J0ZWQgaW4gcmV2ZXJzZSByYW5rIG9yZGVyOiAke2VsZW1lbnRzfWApO1xuXG4gfVxucmV0dXJuIGNoZWNrTm9EdXBsaWNhdGVzKGVsZW1lbnRzLHVuZGVmaW5lZCxjaGVjayk7XG4gfTskaOKAjV9vbmNlLmNoZWNrRWxlbWVudHMoY2hlY2tFbGVtZW50cyk7XG5oYXJkZW4oY2hlY2tFbGVtZW50cyk7XG5cbmNvbnN0ICAgICAgICBhc3NlcnRFbGVtZW50cz0oZWxlbWVudHMpPT57XG5jaGVja0VsZW1lbnRzKGVsZW1lbnRzLGFzc2VydENoZWNrZXIpO1xuIH07JGjigI1fb25jZS5hc3NlcnRFbGVtZW50cyhhc3NlcnRFbGVtZW50cyk7XG5oYXJkZW4oYXNzZXJ0RWxlbWVudHMpO1xuXG5jb25zdCAgICAgICAgY29lcmNlVG9FbGVtZW50cz0oZWxlbWVudHNMaXN0KT0+e1xuY29uc3QgZWxlbWVudHM9c29ydEJ5UmFuayhlbGVtZW50c0xpc3QsY29tcGFyZUFudGlSYW5rKTtcbmFzc2VydEVsZW1lbnRzKGVsZW1lbnRzKTtcbnJldHVybiBlbGVtZW50cztcbiB9OyRo4oCNX29uY2UuY29lcmNlVG9FbGVtZW50cyhjb2VyY2VUb0VsZW1lbnRzKTtcbmhhcmRlbihjb2VyY2VUb0VsZW1lbnRzKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtJdGVyYWJsZTxLPn0gZWxlbWVudEl0ZXJcbiAqIEByZXR1cm5zIHtDb3B5U2V0PEs+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVNldE9mRWxlbWVudHM9KGVsZW1lbnRJdGVyKT0+XG5tYWtlVGFnZ2VkKCdjb3B5U2V0Jyxjb2VyY2VUb0VsZW1lbnRzKGVsZW1lbnRJdGVyKSk7JGjigI1fb25jZS5tYWtlU2V0T2ZFbGVtZW50cyhtYWtlU2V0T2ZFbGVtZW50cyk7XG5oYXJkZW4obWFrZVNldE9mRWxlbWVudHMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzc2VydE5vRHVwbGljYXRlcyI6WyJhc3NlcnROb0R1cGxpY2F0ZXMiXSwiY2hlY2tFbGVtZW50cyI6WyJjaGVja0VsZW1lbnRzIl0sImFzc2VydEVsZW1lbnRzIjpbImFzc2VydEVsZW1lbnRzIl0sImNvZXJjZVRvRWxlbWVudHMiOlsiY29lcmNlVG9FbGVtZW50cyJdLCJtYWtlU2V0T2ZFbGVtZW50cyI6WyJtYWtlU2V0T2ZFbGVtZW50cyJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACkj2Y/viQAAL4kAAA0AAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc3siaW1wb3J0cyI6WyIuL2NvcHlCYWcuanMiLCJAZW5kby9tYXJzaGFsL3NyYy9yYW5rT3JkZXIuanMiXSwiZXhwb3J0cyI6WyJiYWdDb21wYXJlIiwiYmFnRGlzam9pbnRTdWJ0cmFjdCIsImJhZ0ludGVyc2VjdGlvbiIsImJhZ0lzRGlzam9pbnQiLCJiYWdJc1N1cGVyYmFnIiwiYmFnVW5pb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0UmFua1NvcnRlZCxjb21wYXJlQW50aVJhbmssbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQsc29ydEJ5UmFuayxhc3NlcnROb0R1cGxpY2F0ZUtleXMsbWFrZUJhZ09mRW50cmllczskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsL3NyYy9yYW5rT3JkZXIuanNcIiwgW1tcImFzc2VydFJhbmtTb3J0ZWRcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFJhbmtTb3J0ZWQgPSAkaOKAjV9hKV1dLFtcImNvbXBhcmVBbnRpUmFua1wiLCBbJGjigI1fYSA9PiAoY29tcGFyZUFudGlSYW5rID0gJGjigI1fYSldXSxbXCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdFwiLCBbJGjigI1fYSA9PiAobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQgPSAkaOKAjV9hKV1dLFtcInNvcnRCeVJhbmtcIiwgWyRo4oCNX2EgPT4gKHNvcnRCeVJhbmsgPSAkaOKAjV9hKV1dXV0sW1wiLi9jb3B5QmFnLmpzXCIsIFtbXCJhc3NlcnROb0R1cGxpY2F0ZUtleXNcIiwgWyRo4oCNX2EgPT4gKGFzc2VydE5vRHVwbGljYXRlS2V5cyA9ICRo4oCNX2EpXV0sW1wibWFrZUJhZ09mRW50cmllc1wiLCBbJGjigI1fYSA9PiAobWFrZUJhZ09mRW50cmllcyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuLyogQmFzZWQgb24gbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcywgYnV0IGFsdGVyZWQgZm9yIHRoZSBiYWcgcmVwcmVzZW50YXRpb24uKi9cbi8qIFRPRE8gc2hhcmUgbW9yZSBjb2RlIHdpdGggbWVyZ2Utc2V0LW9wZXJhdG9ycy5qcywgcmF0aGVyIHRoYW4qL1xuLyogZHVwbGljYXRpbmcgd2l0aCBjaGFuZ2VzLiovXG5cbi8qKlxuICogQXNzZXJ0cyB0aGF0IGBiYWdFbnRyaWVzYCBpcyBhbHJlYWR5IHJhbmsgc29ydGVkIGJ5IGByYW5rQ29tcGFyZWAsIHdoZXJlXG4gKiB0aGVyZVxuICogbWF5IGJlIGNvbnRpZ3VvdXMgcmVnaW9ucyBvZiBiYWdFbnRyaWVzIHdob3NlIGtleXMgYXJlIHRpZWQgZm9yIHRoZSBzYW1lXG4gKiByYW5rLlxuICogUmV0dXJucyBhbiBpdGVyYWJsZSB0aGF0IHdpbGwgZW51bWVyYXRlIGFsbCB0aGUgYmFnRW50cmllcyBpbiBvcmRlclxuICogYWNjb3JkaW5nIHRvIGBmdWxsT3JkZXJgLCB3aGljaCBzaG91bGQgZGlmZmVyIGZyb20gYHJhbmtPcmRlcmAgb25seVxuICogYnkgYmVpbmcgbW9yZSBwcmVjaXNlLlxuICpcbiAqIFRoaXMgc2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gcmVzb3J0aW5nIHRoZSBlbnRpcmUgYGJhZ0VudHJpZXNgIGFycmF5XG4gKiBhY2NvcmRpbmdcbiAqIHRvIGBmdWxsT3JkZXJgLiBIb3dldmVyLCBpdCBvcHRpbWl6ZXMgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZXNlIGNvbnRpZ3VvdXNcbiAqIHJ1bnMgdGhhdCBuZWVkIHRvIGJlIHJlc29ydGVkIGFyZSBlaXRoZXIgYWJzZW50IG9yIHNtYWxsLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1tULGJpZ2ludF1bXX0gYmFnRW50cmllc1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gcmFua0NvbXBhcmVcbiAqIEBwYXJhbSB7RnVsbENvbXBhcmV9IGZ1bGxDb21wYXJlXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W1QsYmlnaW50XT59XG4gKi9cbmNvbnN0IGJhZ1dpbmRvd1Jlc29ydD0oYmFnRW50cmllcyxyYW5rQ29tcGFyZSxmdWxsQ29tcGFyZSk9PntcbmFzc2VydFJhbmtTb3J0ZWQoYmFnRW50cmllcyxyYW5rQ29tcGFyZSk7XG5jb25zdHtsZW5ndGh9PWJhZ0VudHJpZXM7XG5sZXQgaT0wO1xubGV0IG9wdElubmVySXRlcmF0b3I7XG5yZXR1cm4gaGFyZGVuKHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT5cbmhhcmRlbih7XG5uZXh0OigpPT57XG5pZihvcHRJbm5lckl0ZXJhdG9yKXtcbmNvbnN0IHJlc3VsdD1vcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbmlmKHJlc3VsdC5kb25lKXtcbm9wdElubmVySXRlcmF0b3I9dW5kZWZpbmVkO1xuLyogZmFsbCB0aHJvdWdoKi9cbiB9ZWxzZXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbmlmKGk8bGVuZ3RoKXtcbmNvbnN0IGVudHJ5PWJhZ0VudHJpZXNbaV07XG5sZXQgaj1pKzE7XG53aGlsZShcbmo8bGVuZ3RoJiZcbnJhbmtDb21wYXJlKGVudHJ5WzBdLGJhZ0VudHJpZXNbal1bMF0pPT09MClcbntcbmorPTE7XG4gfVxuaWYoaj09PWkrMSl7XG5pPWo7XG5yZXR1cm4gaGFyZGVuKHtkb25lOmZhbHNlLHZhbHVlOmVudHJ5fSk7XG4gfVxuY29uc3Qgc2ltaWxhclJ1bj1iYWdFbnRyaWVzLnNsaWNlKGksaik7XG5pPWo7XG5jb25zdCByZXNvcnRlZD1zb3J0QnlSYW5rKHNpbWlsYXJSdW4sZnVsbENvbXBhcmUpO1xuLyogUHJvdmlkaW5nIHRoZSBzYW1lIGBmdWxsQ29tcGFyZWAgc2hvdWxkIGNhdXNlIGEgbWVtbyBoaXQqL1xuLyogd2l0aGluIGBhc3NlcnROb0R1cGxpY2F0ZXNgIGVuYWJsaW5nIGl0IHRvIGF2b2lkIGEqL1xuLyogcmVkdW5kYW50IHJlc29ydGluZy4qL1xuYXNzZXJ0Tm9EdXBsaWNhdGVLZXlzKHJlc29ydGVkLGZ1bGxDb21wYXJlKTtcbi8qIFRoaXMgaXMgdGhlIHJhdyBKUyBhcnJheSBpdGVyYXRvciB3aG9zZSBgLm5leHQoKWAgbWV0aG9kKi9cbi8qIGRvZXMgbm90IGhhcmRlbiB0aGUgSXRlcmF0b3JSZXN1bHQsIGluIHZpb2xhdGlvbiBvZiBvdXIqL1xuLyogY29udmVudGlvbnMuIEZpeGluZyB0aGlzIGlzIGV4cGVuc2l2ZSBhbmQgSSdtIGNvbmZpZGVudCB0aGUqL1xuLyogdW5mcm96ZW4gdmFsdWUgZG9lcyBub3QgZXNjYXBlIHRoaXMgZmlsZSwgc28gSSdtIGxlYXZpbmcgdGhpcyovXG4vKiBhcyBpcy4qL1xub3B0SW5uZXJJdGVyYXRvcj1yZXNvcnRlZFtTeW1ib2wuaXRlcmF0b3JdKCk7XG5yZXR1cm4gb3B0SW5uZXJJdGVyYXRvci5uZXh0KCk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHtkb25lOnRydWUsdmFsdWU6W251bGwsMG5dfSk7XG4gfVxuIH19KX0pO1xuXG5cbiB9O1xuXG4vKipcbiAqIFJldHVybnMgYW4gaXRlcmFibGUgd2hvc2UgaXRlcmF0aW9uIHJlc3VsdHMgYXJlIFtrZXksIHhDb3VudCwgeUNvdW50XSB0dXBsZXNcbiAqIHJlcHJlc2VudGluZyB0aGUgbmV4dCBrZXkgaW4gdGhlIGxvY2FsIGZ1bGwgb3JkZXIsIGFzIHdlbGwgYXMgaG93IG1hbnlcbiAqIHRpbWVzIGl0IG9jY3VycmVkIGluIHRoZSB4IGlucHV0IGl0ZXJhdG9yIGFuZCB0aGUgeSBpbnB1dCBpdGVyYXRvci5cbiAqXG4gKiBGb3Igc2V0cywgdGhlc2UgY291bnRzIGFyZSBhbHdheXMgMCBvciAxLCBidXQgdGhpcyByZXByZXNlbnRhdGlvblxuICogZ2VuZXJhbGl6ZXMgbmljZWx5IGZvciBiYWdzLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1tULGJpZ2ludF1bXX0geGJhZ0VudHJpZXNcbiAqIEBwYXJhbSB7W1QsYmlnaW50XVtdfSB5YmFnRW50cmllc1xuICogQHJldHVybnMge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn1cbiAqL1xuY29uc3QgbWVyZ2U9KHhiYWdFbnRyaWVzLHliYWdFbnRyaWVzKT0+e1xuLyogVGhpcyBmdWxsT3JkZXIgY29udGFpbnMgaGlzdG9yeSBkZXBlbmRlbnQgc3RhdGUuIEl0IGlzIHNwZWNpZmljKi9cbi8qIHRvIHRoaXMgb25lIGBtZXJnZWAgY2FsbCBhbmQgZG9lcyBub3Qgc3Vydml2ZSBpdC4qL1xuY29uc3QgZnVsbENvbXBhcmU9bWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQoKS5hbnRpQ29tcGFyYXRvcjtcblxuY29uc3QgeHM9YmFnV2luZG93UmVzb3J0KHhiYWdFbnRyaWVzLGNvbXBhcmVBbnRpUmFuayxmdWxsQ29tcGFyZSk7XG5jb25zdCB5cz1iYWdXaW5kb3dSZXNvcnQoeWJhZ0VudHJpZXMsY29tcGFyZUFudGlSYW5rLGZ1bGxDb21wYXJlKTtcbnJldHVybiBoYXJkZW4oe1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9Pntcbi8qIFRoZXNlIHNpeCBgbGV0YCB2YXJpYWJsZXMgYXJlIGJ1ZmZlcmluZyBvbmUgYWhlYWQgZnJvbSB0aGUgdW5kZXJseWluZyovXG4vKiBpdGVyYXRvcnMuIEVhY2ggaXRlcmF0aW9uIHJlcG9ydHMgb25lIG9yIHRoZSBvdGhlciBvciBib3RoLCBhbmQqL1xuLyogdGhlbiByZWZpbGxzIHRoZSBidWZmZXJzIG9mIHRob3NlIGl0IGFkdmFuY2VkLiovXG4vKiogQHR5cGUge1R9ICovXG5sZXQgeDtcbmxldCB4YztcbmxldCB4RG9uZTtcbi8qKiBAdHlwZSB7VH0gKi9cbmxldCB5O1xubGV0IHljO1xubGV0IHlEb25lO1xuXG5jb25zdCB4aT14c1tTeW1ib2wuaXRlcmF0b3JdKCk7XG5jb25zdCBuZXh0WD0oKT0+e1xuIXhEb25lfHxGYWlsIGBJbnRlcm5hbDogbmV4dFggc2hvdWxkIG5vdCBiZSBjYWxsZWQgb25jZSBkb25lYDtcbih7XG5kb25lOnhEb25lLFxudmFsdWU6W3gseGNdfT1cbnhpLm5leHQoKSk7XG4gfTtcbm5leHRYKCk7XG5cbmNvbnN0IHlpPXlzW1N5bWJvbC5pdGVyYXRvcl0oKTtcbmNvbnN0IG5leHRZPSgpPT57XG4heURvbmV8fEZhaWwgYEludGVybmFsOiBuZXh0WSBzaG91bGQgbm90IGJlIGNhbGxlZCBvbmNlIGRvbmVgO1xuKHtcbmRvbmU6eURvbmUsXG52YWx1ZTpbeSx5Y119PVxueWkubmV4dCgpKTtcbiB9O1xubmV4dFkoKTtcblxucmV0dXJuIGhhcmRlbih7XG5uZXh0OigpPT57XG4vKiogQHR5cGUge2Jvb2xlYW59ICovXG5sZXQgZG9uZT1mYWxzZTtcbi8qKiBAdHlwZSB7W1QsYmlnaW50LGJpZ2ludF19ICovXG5sZXQgdmFsdWU7XG5pZih4RG9uZSYmeURvbmUpe1xuZG9uZT10cnVlO1xuLyogQHRzLWV4cGVjdC1lcnJvciBCZWNhdXNlIHRoZSB0ZXJtaW5hdGluZyB2YWx1ZSBkb2VzIG5vdCBtYXR0ZXIqL1xudmFsdWU9W251bGwsMG4sMG5dO1xuIH1lbHNlIGlmKHhEb25lKXtcbi8qIG9ubHkgeXMgYXJlIGxlZnQqL1xudmFsdWU9W3ksMG4seWNdO1xubmV4dFkoKTtcbiB9ZWxzZSBpZih5RG9uZSl7XG4vKiBvbmx5IHhzIGFyZSBsZWZ0Ki9cbnZhbHVlPVt4LHhjLDBuXTtcbm5leHRYKCk7XG4gfWVsc2V7XG5jb25zdCBjb21wPWZ1bGxDb21wYXJlKHgseSk7XG5pZihjb21wPT09MCl7XG4vKiB4IGFuZCB5IGFyZSBlcXVpdmFsZW50LCBzbyByZXBvcnQgYm90aCovXG52YWx1ZT1beCx4Yyx5Y107XG5uZXh0WCgpO1xubmV4dFkoKTtcbiB9ZWxzZSBpZihjb21wPDApe1xuLyogeCBpcyBlYXJsaWVyLCBzbyByZXBvcnQgaXQqL1xudmFsdWU9W3gseGMsMG5dO1xubmV4dFgoKTtcbiB9ZWxzZXtcbi8qIHkgaXMgZWFybGllciwgc28gcmVwb3J0IGl0Ki9cbmNvbXA+MHx8RmFpbCBgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgY29tcCAke3EoY29tcCl9YDtcbnZhbHVlPVt5LDBuLHljXTtcbm5leHRZKCk7XG4gfVxuIH1cbnJldHVybiBoYXJkZW4oe2RvbmUsdmFsdWV9KTtcbiB9fSk7XG5cbiB9fSk7XG5cbiB9O1xuaGFyZGVuKG1lcmdlKTtcblxuLyogV2Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlIHRoaXMgZm9yIGl0ZXJJc1N1cGVyc2V0IGFzIHdlbGwuKi9cbi8qIFRoZSBnZW5lcmFsaXphdGlvbiBpcyBmcmVlLiovXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgYmFnSXRlcklzU3VwZXJiYWc9KHh5aSk9PntcbmZvcihjb25zdFtfbSx4Yyx5Y11vZiB4eWkpe1xuaWYoeGM8eWMpe1xuLyogc29tZXRoaW5nIGluIHkgaXMgbm90IGluIHgsIHNvIHggaXMgbm90IGEgc3VwZXJiYWcgb2YgeSovXG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07XG5cbi8qIFdlIHNob3VsZCBiZSBhYmxlIHRvIHVzZSB0aGlzIGZvciBpdGVySXNEaXNqb2ludCBhcyB3ZWxsLiovXG4vKiBUaGUgY29kZSBpcyBpZGVudGljYWwuKi9cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBiYWdJdGVySXNEaXNqb2ludD0oeHlpKT0+e1xuZm9yKGNvbnN0W19tLHhjLHljXW9mIHh5aSl7XG5pZih4Yz49MW4mJnljPj0xbil7XG4vKiBTb21ldGhpbmcgaW4gYm90aCwgc28gbm90IGRpc2pvaW50Ki9cbnJldHVybiBmYWxzZTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcblxuLyogV2Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlIHRoaXMgZm9yIGl0ZXJDb21wYXJlIGFzIHdlbGwuKi9cbi8qIFRoZSBnZW5lcmFsaXphdGlvbiBpcyBmcmVlLiovXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7S2V5Q29tcGFyaXNvbn1cbiAqL1xuY29uc3QgYmFnSXRlckNvbXBhcmU9KHh5aSk9PntcbmxldCBsb25lWT1mYWxzZTtcbmxldCBsb25lWD1mYWxzZTtcbmZvcihjb25zdFtfbSx4Yyx5Y11vZiB4eWkpe1xuaWYoeGM8eWMpe1xuLyogc29tZXRoaW5nIGluIHkgaXMgbm90IGluIHgsIHNvIHggaXMgbm90IGEgc3VwZXJiYWcgb2YgeSovXG5sb25lWT10cnVlO1xuIH1cbmlmKHhjPnljKXtcbi8qIHNvbWV0aGluZyBpbiB4IGlzIG5vdCBpbiB5LCBzbyB5IGlzIG5vdCBhIHN1cGVyYmFnIG9mIHgqL1xubG9uZVg9dHJ1ZTtcbiB9XG5pZihsb25lWCYmbG9uZVkpe1xucmV0dXJuIE5hTjtcbiB9XG4gfVxuaWYobG9uZVgpe1xucmV0dXJuIDE7XG4gfWVsc2UgaWYobG9uZVkpe1xucmV0dXJuLTE7XG4gfWVsc2V7XG4hbG9uZVgmJiFsb25lWXx8XG5GYWlsIGBJbnRlcm5hbDogVW5leHBlY3RlZCBsb25lIHBhaXIgJHtxKFtsb25lWCxsb25lWV0pfWA7XG5yZXR1cm4gMDtcbiB9XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtbVCxiaWdpbnQsYmlnaW50XVtdfSB4eWlcbiAqIEByZXR1cm5zIHtbVCxiaWdpbnRdW119XG4gKi9cbmNvbnN0IGJhZ0l0ZXJVbmlvbj0oeHlpKT0+e1xuLyoqIEB0eXBlIHtbVCxiaWdpbnRdW119ICovXG5jb25zdCByZXN1bHQ9W107XG5mb3IoY29uc3RbbSx4Yyx5Y11vZiB4eWkpe1xucmVzdWx0LnB1c2goW20seGMreWNdKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtbVCxiaWdpbnRdW119XG4gKi9cbmNvbnN0IGJhZ0l0ZXJJbnRlcnNlY3Rpb249KHh5aSk9Pntcbi8qKiBAdHlwZSB7W1QsYmlnaW50XVtdfSAqL1xuY29uc3QgcmVzdWx0PVtdO1xuZm9yKGNvbnN0W20seGMseWNdb2YgeHlpKXtcbmNvbnN0IG1jPXhjPD15Yz94Yzp5YztcbnJlc3VsdC5wdXNoKFttLG1jXSk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7W1QsYmlnaW50XVtdfVxuICovXG5jb25zdCBiYWdJdGVyRGlzam9pbnRTdWJ0cmFjdD0oeHlpKT0+e1xuLyoqIEB0eXBlIHtbVCxiaWdpbnRdW119ICovXG5jb25zdCByZXN1bHQ9W107XG5mb3IoY29uc3RbbSx4Yyx5Y11vZiB4eWkpe1xuY29uc3QgbWM9eGMteWM7XG5tYz49MG58fEZhaWwgYHJpZ2h0IGVsZW1lbnQgJHttfSB3YXMgbm90IGluIGxlZnRgO1xuaWYobWM+PTFuKXtcbi8qIHRoZSB4IHdhcyBub3QgaW4geSovXG5yZXN1bHQucHVzaChbbSxtY10pO1xuIH1cbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbmNvbnN0IG1lcmdlaWZ5PShiYWdJdGVyT3ApPT4oeGJhZ0VudHJpZXMseWJhZ0VudHJpZXMpPT5cbmJhZ0l0ZXJPcChtZXJnZSh4YmFnRW50cmllcyx5YmFnRW50cmllcykpO1xuXG5jb25zdCBiYWdFbnRyaWVzSXNTdXBlcmJhZz1tZXJnZWlmeShiYWdJdGVySXNTdXBlcmJhZyk7XG5jb25zdCBiYWdFbnRyaWVzSXNEaXNqb2ludD1tZXJnZWlmeShiYWdJdGVySXNEaXNqb2ludCk7XG5jb25zdCBiYWdFbnRyaWVzQ29tcGFyZT1tZXJnZWlmeShiYWdJdGVyQ29tcGFyZSk7XG5jb25zdCBiYWdFbnRyaWVzVW5pb249bWVyZ2VpZnkoYmFnSXRlclVuaW9uKTtcbmNvbnN0IGJhZ0VudHJpZXNJbnRlcnNlY3Rpb249bWVyZ2VpZnkoYmFnSXRlckludGVyc2VjdGlvbik7XG5jb25zdCBiYWdFbnRyaWVzRGlzam9pbnRTdWJ0cmFjdD1tZXJnZWlmeShiYWdJdGVyRGlzam9pbnRTdWJ0cmFjdCk7XG5cbmNvbnN0IHJhd0JhZ2lmeT0oYmFnRW50cmllc09wKT0+KHhiYWcseWJhZyk9PlxuYmFnRW50cmllc09wKHhiYWcucGF5bG9hZCx5YmFnLnBheWxvYWQpO1xuXG5jb25zdCBiYWdpZnk9KGJhZ0VudHJpZXNPcCk9Pih4YmFnLHliYWcpPT5cbm1ha2VCYWdPZkVudHJpZXMoYmFnRW50cmllc09wKHhiYWcucGF5bG9hZCx5YmFnLnBheWxvYWQpKTtcblxuY29uc3QgICAgICAgIGJhZ0lzU3VwZXJiYWc9cmF3QmFnaWZ5KGJhZ0VudHJpZXNJc1N1cGVyYmFnKTskaOKAjV9vbmNlLmJhZ0lzU3VwZXJiYWcoYmFnSXNTdXBlcmJhZyk7XG5jb25zdCAgICAgICAgYmFnSXNEaXNqb2ludD1yYXdCYWdpZnkoYmFnRW50cmllc0lzRGlzam9pbnQpOyRo4oCNX29uY2UuYmFnSXNEaXNqb2ludChiYWdJc0Rpc2pvaW50KTtcbmNvbnN0ICAgICAgICBiYWdDb21wYXJlPXJhd0JhZ2lmeShiYWdFbnRyaWVzQ29tcGFyZSk7JGjigI1fb25jZS5iYWdDb21wYXJlKGJhZ0NvbXBhcmUpO1xuY29uc3QgICAgICAgIGJhZ1VuaW9uPWJhZ2lmeShiYWdFbnRyaWVzVW5pb24pOyRo4oCNX29uY2UuYmFnVW5pb24oYmFnVW5pb24pO1xuY29uc3QgICAgICAgIGJhZ0ludGVyc2VjdGlvbj1iYWdpZnkoYmFnRW50cmllc0ludGVyc2VjdGlvbik7JGjigI1fb25jZS5iYWdJbnRlcnNlY3Rpb24oYmFnSW50ZXJzZWN0aW9uKTtcbmNvbnN0ICAgICAgICBiYWdEaXNqb2ludFN1YnRyYWN0PWJhZ2lmeShiYWdFbnRyaWVzRGlzam9pbnRTdWJ0cmFjdCk7JGjigI1fb25jZS5iYWdEaXNqb2ludFN1YnRyYWN0KGJhZ0Rpc2pvaW50U3VidHJhY3QpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImJhZ0lzU3VwZXJiYWciOlsiYmFnSXNTdXBlcmJhZyJdLCJiYWdJc0Rpc2pvaW50IjpbImJhZ0lzRGlzam9pbnQiXSwiYmFnQ29tcGFyZSI6WyJiYWdDb21wYXJlIl0sImJhZ1VuaW9uIjpbImJhZ1VuaW9uIl0sImJhZ0ludGVyc2VjdGlvbiI6WyJiYWdJbnRlcnNlY3Rpb24iXSwiYmFnRGlzam9pbnRTdWJ0cmFjdCI6WyJiYWdEaXNqb2ludFN1YnRyYWN0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANCZcIfjJwAA4ycAADQAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzeyJpbXBvcnRzIjpbIi4vY29weVNldC5qcyIsIkBlbmRvL21hcnNoYWwvc3JjL3JhbmtPcmRlci5qcyJdLCJleHBvcnRzIjpbImVsZW1lbnRzQ29tcGFyZSIsImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCIsImVsZW1lbnRzRGlzam9pbnRVbmlvbiIsImVsZW1lbnRzSW50ZXJzZWN0aW9uIiwiZWxlbWVudHNJc0Rpc2pvaW50IiwiZWxlbWVudHNJc1N1cGVyc2V0IiwiZWxlbWVudHNVbmlvbiIsInNldENvbXBhcmUiLCJzZXREaXNqb2ludFN1YnRyYWN0Iiwic2V0RGlzam9pbnRVbmlvbiIsInNldEludGVyc2VjdGlvbiIsInNldElzRGlzam9pbnQiLCJzZXRJc1N1cGVyc2V0Iiwic2V0VW5pb24iXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0UmFua1NvcnRlZCxjb21wYXJlQW50aVJhbmssbWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQsc29ydEJ5UmFuayxhc3NlcnROb0R1cGxpY2F0ZXMsbWFrZVNldE9mRWxlbWVudHM7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbC9zcmMvcmFua09yZGVyLmpzXCIsIFtbXCJhc3NlcnRSYW5rU29ydGVkXCIsIFskaOKAjV9hID0+IChhc3NlcnRSYW5rU29ydGVkID0gJGjigI1fYSldXSxbXCJjb21wYXJlQW50aVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVBbnRpUmFuayA9ICRo4oCNX2EpXV0sW1wibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXRcIiwgWyRo4oCNX2EgPT4gKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0ID0gJGjigI1fYSldXSxbXCJzb3J0QnlSYW5rXCIsIFskaOKAjV9hID0+IChzb3J0QnlSYW5rID0gJGjigI1fYSldXV1dLFtcIi4vY29weVNldC5qc1wiLCBbW1wiYXNzZXJ0Tm9EdXBsaWNhdGVzXCIsIFskaOKAjV9hID0+IChhc3NlcnROb0R1cGxpY2F0ZXMgPSAkaOKAjV9hKV1dLFtcIm1ha2VTZXRPZkVsZW1lbnRzXCIsIFskaOKAjV9hID0+IChtYWtlU2V0T2ZFbGVtZW50cyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcblxuLyoqXG4gKiBBc3NlcnRzIHRoYXQgYGVsZW1lbnRzYCBpcyBhbHJlYWR5IHJhbmsgc29ydGVkIGJ5IGByYW5rQ29tcGFyZWAsIHdoZXJlIHRoZXJlXG4gKiBtYXkgYmUgY29udGlndW91cyByZWdpb25zIG9mIGVsZW1lbnRzIHRpZWQgZm9yIHRoZSBzYW1lIHJhbmsuXG4gKiBSZXR1cm5zIGFuIGl0ZXJhYmxlIHRoYXQgd2lsbCBlbnVtZXJhdGUgYWxsIHRoZSBlbGVtZW50cyBpbiBvcmRlclxuICogYWNjb3JkaW5nIHRvIGBmdWxsT3JkZXJgLCB3aGljaCBzaG91bGQgZGlmZmVyIGZyb20gYHJhbmtPcmRlcmAgb25seVxuICogYnkgYmVpbmcgbW9yZSBwcmVjaXNlLlxuICpcbiAqIFRoaXMgc2hvdWxkIGJlIGVxdWl2YWxlbnQgdG8gcmVzb3J0aW5nIHRoZSBlbnRpcmUgYGVsZW1lbnRzYCBhcnJheSBhY2NvcmRpbmdcbiAqICB0byBgZnVsbE9yZGVyYC4gSG93ZXZlciwgaXQgb3B0aW1pemVzIGZvciB0aGUgY2FzZSB3aGVyZSB0aGVzZSBjb250aWd1b3VzXG4gKiBydW5zIHRoYXQgbmVlZCB0byBiZSByZXNvcnRlZCBhcmUgZWl0aGVyIGFic2VudCBvciBzbWFsbC5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUW119IGVsZW1lbnRzXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSByYW5rQ29tcGFyZVxuICogQHBhcmFtIHtGdWxsQ29tcGFyZX0gZnVsbENvbXBhcmVcbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxUPn1cbiAqL1xuY29uc3Qgd2luZG93UmVzb3J0PShlbGVtZW50cyxyYW5rQ29tcGFyZSxmdWxsQ29tcGFyZSk9PntcbmFzc2VydFJhbmtTb3J0ZWQoZWxlbWVudHMscmFua0NvbXBhcmUpO1xuY29uc3R7bGVuZ3RofT1lbGVtZW50cztcbmxldCBpPTA7XG5sZXQgb3B0SW5uZXJJdGVyYXRvcjtcbnJldHVybiBoYXJkZW4oe1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PlxuaGFyZGVuKHtcbm5leHQ6KCk9PntcbmlmKG9wdElubmVySXRlcmF0b3Ipe1xuY29uc3QgcmVzdWx0PW9wdElubmVySXRlcmF0b3IubmV4dCgpO1xuaWYocmVzdWx0LmRvbmUpe1xub3B0SW5uZXJJdGVyYXRvcj11bmRlZmluZWQ7XG4vKiBmYWxsIHRocm91Z2gqL1xuIH1lbHNle1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfVxuaWYoaTxsZW5ndGgpe1xuY29uc3QgdmFsdWU9ZWxlbWVudHNbaV07XG5sZXQgaj1pKzE7XG53aGlsZShqPGxlbmd0aCYmcmFua0NvbXBhcmUodmFsdWUsZWxlbWVudHNbal0pPT09MCl7XG5qKz0xO1xuIH1cbmlmKGo9PT1pKzEpe1xuaT1qO1xucmV0dXJuIGhhcmRlbih7ZG9uZTpmYWxzZSx2YWx1ZX0pO1xuIH1cbmNvbnN0IHNpbWlsYXJSdW49ZWxlbWVudHMuc2xpY2UoaSxqKTtcbmk9ajtcbmNvbnN0IHJlc29ydGVkPXNvcnRCeVJhbmsoc2ltaWxhclJ1bixmdWxsQ29tcGFyZSk7XG4vKiBQcm92aWRpbmcgdGhlIHNhbWUgYGZ1bGxDb21wYXJlYCBzaG91bGQgY2F1c2UgYSBtZW1vIGhpdCovXG4vKiB3aXRoaW4gYGFzc2VydE5vRHVwbGljYXRlc2AgZW5hYmxpbmcgaXQgdG8gYXZvaWQgYSovXG4vKiByZWR1bmRhbnQgcmVzb3J0aW5nLiovXG5hc3NlcnROb0R1cGxpY2F0ZXMocmVzb3J0ZWQsZnVsbENvbXBhcmUpO1xuLyogVGhpcyBpcyB0aGUgcmF3IEpTIGFycmF5IGl0ZXJhdG9yIHdob3NlIGAubmV4dCgpYCBtZXRob2QqL1xuLyogZG9lcyBub3QgaGFyZGVuIHRoZSBJdGVyYXRvclJlc3VsdCwgaW4gdmlvbGF0aW9uIG9mIG91ciovXG4vKiBjb252ZW50aW9ucy4gRml4aW5nIHRoaXMgaXMgZXhwZW5zaXZlIGFuZCBJJ20gY29uZmlkZW50IHRoZSovXG4vKiB1bmZyb3plbiB2YWx1ZSBkb2VzIG5vdCBlc2NhcGUgdGhpcyBmaWxlLCBzbyBJJ20gbGVhdmluZyB0aGlzKi9cbi8qIGFzIGlzLiovXG5vcHRJbm5lckl0ZXJhdG9yPXJlc29ydGVkW1N5bWJvbC5pdGVyYXRvcl0oKTtcbnJldHVybiBvcHRJbm5lckl0ZXJhdG9yLm5leHQoKTtcbiB9ZWxzZXtcbnJldHVybiBoYXJkZW4oe2RvbmU6dHJ1ZSx2YWx1ZTpudWxsfSk7XG4gfVxuIH19KX0pO1xuXG5cbiB9O1xuXG4vKipcbiAqIFJldHVybnMgYW4gaXRlcmFibGUgd2hvc2UgaXRlcmF0aW9uIHJlc3VsdHMgYXJlIFtrZXksIHhDb3VudCwgeUNvdW50XSB0dXBsZXNcbiAqIHJlcHJlc2VudGluZyB0aGUgbmV4dCBrZXkgaW4gdGhlIGxvY2FsIGZ1bGwgb3JkZXIsIGFzIHdlbGwgYXMgaG93IG1hbnlcbiAqIHRpbWVzIGl0IG9jY3VycmVkIGluIHRoZSB4IGlucHV0IGl0ZXJhdG9yIGFuZCB0aGUgeSBpbnB1dCBpdGVyYXRvci5cbiAqXG4gKiBGb3Igc2V0cywgdGhlc2UgY291bnRzIGFyZSBhbHdheXMgMCBvciAxLCBidXQgdGhpcyByZXByZXNlbnRhdGlvblxuICogZ2VuZXJhbGl6ZXMgbmljZWx5IGZvciBiYWdzLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1RbXX0geGVsZW1lbnRzXG4gKiBAcGFyYW0ge1RbXX0geWVsZW1lbnRzXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fVxuICovXG5jb25zdCBtZXJnZT0oeGVsZW1lbnRzLHllbGVtZW50cyk9Pntcbi8qIFRoaXMgZnVsbE9yZGVyIGNvbnRhaW5zIGhpc3RvcnkgZGVwZW5kZW50IHN0YXRlLiBJdCBpcyBzcGVjaWZpYyovXG4vKiB0byB0aGlzIG9uZSBgbWVyZ2VgIGNhbGwgYW5kIGRvZXMgbm90IHN1cnZpdmUgaXQuKi9cbmNvbnN0IGZ1bGxDb21wYXJlPW1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KCkuYW50aUNvbXBhcmF0b3I7XG5cbmNvbnN0IHhzPXdpbmRvd1Jlc29ydCh4ZWxlbWVudHMsY29tcGFyZUFudGlSYW5rLGZ1bGxDb21wYXJlKTtcbmNvbnN0IHlzPXdpbmRvd1Jlc29ydCh5ZWxlbWVudHMsY29tcGFyZUFudGlSYW5rLGZ1bGxDb21wYXJlKTtcbnJldHVybiBoYXJkZW4oe1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9Pntcbi8qIFRoZXNlIGZvdXIgYGxldGAgdmFyaWFibGVzIGFyZSBidWZmZXJpbmcgb25lIGFoZWFkIGZyb20gdGhlIHVuZGVybHlpbmcqL1xuLyogaXRlcmF0b3JzLiBFYWNoIGl0ZXJhdGlvbiByZXBvcnRzIG9uZSBvciB0aGUgb3RoZXIgb3IgYm90aCwgYW5kKi9cbi8qIHRoZW4gcmVmaWxscyB0aGUgYnVmZmVycyBvZiB0aG9zZSBpdCBhZHZhbmNlZC4qL1xuLyoqIEB0eXBlIHtUfSAqL1xubGV0IHg7XG5sZXQgeERvbmU7XG4vKiogQHR5cGUge1R9ICovXG5sZXQgeTtcbmxldCB5RG9uZTtcblxuY29uc3QgeGk9eHNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuY29uc3QgbmV4dFg9KCk9PntcbiF4RG9uZXx8RmFpbCBgSW50ZXJuYWw6IG5leHRYIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4oe2RvbmU6eERvbmUsdmFsdWU6eH09eGkubmV4dCgpKTtcbiB9O1xubmV4dFgoKTtcblxuY29uc3QgeWk9eXNbU3ltYm9sLml0ZXJhdG9yXSgpO1xuY29uc3QgbmV4dFk9KCk9PntcbiF5RG9uZXx8RmFpbCBgSW50ZXJuYWw6IG5leHRZIHNob3VsZCBub3QgYmUgY2FsbGVkIG9uY2UgZG9uZWA7XG4oe2RvbmU6eURvbmUsdmFsdWU6eX09eWkubmV4dCgpKTtcbiB9O1xubmV4dFkoKTtcblxucmV0dXJuIGhhcmRlbih7XG5uZXh0OigpPT57XG4vKiogQHR5cGUge2Jvb2xlYW59ICovXG5sZXQgZG9uZT1mYWxzZTtcbi8qKiBAdHlwZSB7W1QsYmlnaW50LGJpZ2ludF19ICovXG5sZXQgdmFsdWU7XG5pZih4RG9uZSYmeURvbmUpe1xuZG9uZT10cnVlO1xuLyogQHRzLWV4cGVjdC1lcnJvciBCZWNhdXNlIHRoZSB0ZXJtaW5hdGluZyB2YWx1ZSBkb2VzIG5vdCBtYXR0ZXIqL1xudmFsdWU9W251bGwsMG4sMG5dO1xuIH1lbHNlIGlmKHhEb25lKXtcbi8qIG9ubHkgeXMgYXJlIGxlZnQqL1xudmFsdWU9W3ksMG4sMW5dO1xubmV4dFkoKTtcbiB9ZWxzZSBpZih5RG9uZSl7XG4vKiBvbmx5IHhzIGFyZSBsZWZ0Ki9cbnZhbHVlPVt4LDFuLDBuXTtcbm5leHRYKCk7XG4gfWVsc2V7XG5jb25zdCBjb21wPWZ1bGxDb21wYXJlKHgseSk7XG5pZihjb21wPT09MCl7XG4vKiB4IGFuZCB5IGFyZSBlcXVpdmFsZW50LCBzbyByZXBvcnQgYm90aCovXG52YWx1ZT1beCwxbiwxbl07XG5uZXh0WCgpO1xubmV4dFkoKTtcbiB9ZWxzZSBpZihjb21wPDApe1xuLyogeCBpcyBlYXJsaWVyLCBzbyByZXBvcnQgaXQqL1xudmFsdWU9W3gsMW4sMG5dO1xubmV4dFgoKTtcbiB9ZWxzZXtcbi8qIHkgaXMgZWFybGllciwgc28gcmVwb3J0IGl0Ki9cbmNvbXA+MHx8RmFpbCBgSW50ZXJuYWw6IFVuZXhwZWN0ZWQgY29tcCAke3EoY29tcCl9YDtcbnZhbHVlPVt5LDBuLDFuXTtcbm5leHRZKCk7XG4gfVxuIH1cbnJldHVybiBoYXJkZW4oe2RvbmUsdmFsdWV9KTtcbiB9fSk7XG5cbiB9fSk7XG5cbiB9O1xuaGFyZGVuKG1lcmdlKTtcblxuY29uc3QgaXRlcklzU3VwZXJzZXQ9KHh5aSk9PntcbmZvcihjb25zdFtfbSx4YyxfeWNdb2YgeHlpKXtcbmlmKHhjPT09MG4pe1xuLyogc29tZXRoaW5nIGluIHkgaXMgbm90IGluIHgsIHNvIHggaXMgbm90IGEgc3VwZXJzZXQgb2YgeSovXG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cbnJldHVybiB0cnVlO1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBpdGVySXNEaXNqb2ludD0oeHlpKT0+e1xuZm9yKGNvbnN0W19tLHhjLHljXW9mIHh5aSl7XG5pZih4Yz49MW4mJnljPj0xbil7XG4vKiBTb21ldGhpbmcgaW4gYm90aCwgc28gbm90IGRpc2pvaW50Ki9cbnJldHVybiBmYWxzZTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge0tleUNvbXBhcmlzb259XG4gKi9cbmNvbnN0IGl0ZXJDb21wYXJlPSh4eWkpPT57XG5sZXQgbG9uZVk9ZmFsc2U7XG5sZXQgbG9uZVg9ZmFsc2U7XG5mb3IoY29uc3RbX20seGMseWNdb2YgeHlpKXtcbmlmKHhjPT09MG4pe1xuLyogc29tZXRoaW5nIGluIHkgaXMgbm90IGluIHgsIHNvIHggaXMgbm90IGEgc3VwZXJzZXQgb2YgeSovXG5sb25lWT10cnVlO1xuIH1cbmlmKHljPT09MG4pe1xuLyogc29tZXRoaW5nIGluIHggaXMgbm90IGluIHksIHNvIHkgaXMgbm90IGEgc3VwZXJzZXQgb2YgeCovXG5sb25lWD10cnVlO1xuIH1cbmlmKGxvbmVYJiZsb25lWSl7XG5yZXR1cm4gTmFOO1xuIH1cbiB9XG5pZihsb25lWCl7XG5yZXR1cm4gMTtcbiB9ZWxzZSBpZihsb25lWSl7XG5yZXR1cm4tMTtcbiB9ZWxzZXtcbiFsb25lWCYmIWxvbmVZfHxcbkZhaWwgYEludGVybmFsOiBVbmV4cGVjdGVkIGxvbmUgcGFpciAke3EoW2xvbmVYLGxvbmVZXSl9YDtcbnJldHVybiAwO1xuIH1cbiB9O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFtULGJpZ2ludCxiaWdpbnRdPn0geHlpXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG5jb25zdCBpdGVyVW5pb249KHh5aSk9PntcbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG5pZih4Yz49MG4pe1xucmVzdWx0LnB1c2gobSk7XG4gfWVsc2V7XG55Yz49MG58fEZhaWwgYEludGVybmFsOiBVbmV4cGVjdGVkIGNvdW50ICR7cSh5Yyl9YDtcbi8qIGlmIHggYW5kIHkgd2VyZSBib3RoIHJlYWR5LCB0aGVuIHRoZXkgd2VyZSBlcXVpdmFsZW50IGFuZCovXG4vKiBhYm92ZSBjbGF1c2UgYWxyZWFkeSB0b29rIGNhcmUgb2YgaXQuIE90aGVyd2lzZSBwdXNoIGhlcmUuKi9cbnJlc3VsdC5wdXNoKG0pO1xuIH1cbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtUW119XG4gKi9cbmNvbnN0IGl0ZXJEaXNqb2ludFVuaW9uPSh4eWkpPT57XG5jb25zdCByZXN1bHQ9W107XG5mb3IoY29uc3RbbSx4Yyx5Y11vZiB4eWkpe1xueGM9PT0wbnx8eWM9PT0wbnx8RmFpbCBgU2V0cyBtdXN0IG5vdCBoYXZlIGNvbW1vbiBlbGVtZW50czogJHttfWA7XG5pZih4Yz49MW4pe1xucmVzdWx0LnB1c2gobSk7XG4gfWVsc2V7XG55Yz49MW58fEZhaWwgYEludGVybmFsOiBVbmV4cGVjdGVkIGNvdW50ICR7cSh5Yyl9YDtcbnJlc3VsdC5wdXNoKG0pO1xuIH1cbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7SXRlcmFibGU8W1QsYmlnaW50LGJpZ2ludF0+fSB4eWlcbiAqIEByZXR1cm5zIHtUW119XG4gKi9cbmNvbnN0IGl0ZXJJbnRlcnNlY3Rpb249KHh5aSk9PntcbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG5pZih4Yz49MW4mJnljPj0xbil7XG4vKiBJZiB0aGV5IGFyZSBib3RoIHByZXNlbnQsIHRoZW4gdGhleSB3ZXJlIGVxdWl2YWxlbnQqL1xucmVzdWx0LnB1c2gobSk7XG4gfVxuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxbVCxiaWdpbnQsYmlnaW50XT59IHh5aVxuICogQHJldHVybnMge1RbXX1cbiAqL1xuY29uc3QgaXRlckRpc2pvaW50U3VidHJhY3Q9KHh5aSk9PntcbmNvbnN0IHJlc3VsdD1bXTtcbmZvcihjb25zdFttLHhjLHljXW9mIHh5aSl7XG54Yz49MW58fEZhaWwgYHJpZ2h0IGVsZW1lbnQgJHttfSB3YXMgbm90IGluIGxlZnRgO1xuaWYoeWM9PT0wbil7XG4vKiB0aGUgeCB3YXMgbm90IGluIHkqL1xucmVzdWx0LnB1c2gobSk7XG4gfVxuIH1cbnJldHVybiByZXN1bHQ7XG4gfTtcblxuY29uc3QgbWVyZ2VpZnk9KGl0ZXJPcCk9Pih4ZWxlbWVudHMseWVsZW1lbnRzKT0+XG5pdGVyT3AobWVyZ2UoeGVsZW1lbnRzLHllbGVtZW50cykpO1xuXG5jb25zdCAgICAgICAgZWxlbWVudHNJc1N1cGVyc2V0PW1lcmdlaWZ5KGl0ZXJJc1N1cGVyc2V0KTskaOKAjV9vbmNlLmVsZW1lbnRzSXNTdXBlcnNldChlbGVtZW50c0lzU3VwZXJzZXQpO1xuY29uc3QgICAgICAgIGVsZW1lbnRzSXNEaXNqb2ludD1tZXJnZWlmeShpdGVySXNEaXNqb2ludCk7JGjigI1fb25jZS5lbGVtZW50c0lzRGlzam9pbnQoZWxlbWVudHNJc0Rpc2pvaW50KTtcbmNvbnN0ICAgICAgICBlbGVtZW50c0NvbXBhcmU9bWVyZ2VpZnkoaXRlckNvbXBhcmUpOyRo4oCNX29uY2UuZWxlbWVudHNDb21wYXJlKGVsZW1lbnRzQ29tcGFyZSk7XG5jb25zdCAgICAgICAgZWxlbWVudHNVbmlvbj1tZXJnZWlmeShpdGVyVW5pb24pOyRo4oCNX29uY2UuZWxlbWVudHNVbmlvbihlbGVtZW50c1VuaW9uKTtcbmNvbnN0ICAgICAgICBlbGVtZW50c0Rpc2pvaW50VW5pb249bWVyZ2VpZnkoaXRlckRpc2pvaW50VW5pb24pOyRo4oCNX29uY2UuZWxlbWVudHNEaXNqb2ludFVuaW9uKGVsZW1lbnRzRGlzam9pbnRVbmlvbik7XG5jb25zdCAgICAgICAgZWxlbWVudHNJbnRlcnNlY3Rpb249bWVyZ2VpZnkoaXRlckludGVyc2VjdGlvbik7JGjigI1fb25jZS5lbGVtZW50c0ludGVyc2VjdGlvbihlbGVtZW50c0ludGVyc2VjdGlvbik7XG5jb25zdCAgICAgICAgZWxlbWVudHNEaXNqb2ludFN1YnRyYWN0PW1lcmdlaWZ5KGl0ZXJEaXNqb2ludFN1YnRyYWN0KTskaOKAjV9vbmNlLmVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdChlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QpO1xuXG5jb25zdCByYXdTZXRpZnk9KGVsZW1lbnRzT3ApPT4oeHNldCx5c2V0KT0+XG5lbGVtZW50c09wKHhzZXQucGF5bG9hZCx5c2V0LnBheWxvYWQpO1xuXG5jb25zdCBzZXRpZnk9KGVsZW1lbnRzT3ApPT4oeHNldCx5c2V0KT0+XG5tYWtlU2V0T2ZFbGVtZW50cyhlbGVtZW50c09wKHhzZXQucGF5bG9hZCx5c2V0LnBheWxvYWQpKTtcblxuY29uc3QgICAgICAgIHNldElzU3VwZXJzZXQ9cmF3U2V0aWZ5KGVsZW1lbnRzSXNTdXBlcnNldCk7JGjigI1fb25jZS5zZXRJc1N1cGVyc2V0KHNldElzU3VwZXJzZXQpO1xuY29uc3QgICAgICAgIHNldElzRGlzam9pbnQ9cmF3U2V0aWZ5KGVsZW1lbnRzSXNEaXNqb2ludCk7JGjigI1fb25jZS5zZXRJc0Rpc2pvaW50KHNldElzRGlzam9pbnQpO1xuY29uc3QgICAgICAgIHNldENvbXBhcmU9cmF3U2V0aWZ5KGVsZW1lbnRzQ29tcGFyZSk7JGjigI1fb25jZS5zZXRDb21wYXJlKHNldENvbXBhcmUpO1xuY29uc3QgICAgICAgIHNldFVuaW9uPXNldGlmeShlbGVtZW50c1VuaW9uKTskaOKAjV9vbmNlLnNldFVuaW9uKHNldFVuaW9uKTtcbmNvbnN0ICAgICAgICBzZXREaXNqb2ludFVuaW9uPXNldGlmeShlbGVtZW50c0Rpc2pvaW50VW5pb24pOyRo4oCNX29uY2Uuc2V0RGlzam9pbnRVbmlvbihzZXREaXNqb2ludFVuaW9uKTtcbmNvbnN0ICAgICAgICBzZXRJbnRlcnNlY3Rpb249c2V0aWZ5KGVsZW1lbnRzSW50ZXJzZWN0aW9uKTskaOKAjV9vbmNlLnNldEludGVyc2VjdGlvbihzZXRJbnRlcnNlY3Rpb24pO1xuY29uc3QgICAgICAgIHNldERpc2pvaW50U3VidHJhY3Q9c2V0aWZ5KGVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCk7JGjigI1fb25jZS5zZXREaXNqb2ludFN1YnRyYWN0KHNldERpc2pvaW50U3VidHJhY3QpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImVsZW1lbnRzSXNTdXBlcnNldCI6WyJlbGVtZW50c0lzU3VwZXJzZXQiXSwiZWxlbWVudHNJc0Rpc2pvaW50IjpbImVsZW1lbnRzSXNEaXNqb2ludCJdLCJlbGVtZW50c0NvbXBhcmUiOlsiZWxlbWVudHNDb21wYXJlIl0sImVsZW1lbnRzVW5pb24iOlsiZWxlbWVudHNVbmlvbiJdLCJlbGVtZW50c0Rpc2pvaW50VW5pb24iOlsiZWxlbWVudHNEaXNqb2ludFVuaW9uIl0sImVsZW1lbnRzSW50ZXJzZWN0aW9uIjpbImVsZW1lbnRzSW50ZXJzZWN0aW9uIl0sImVsZW1lbnRzRGlzam9pbnRTdWJ0cmFjdCI6WyJlbGVtZW50c0Rpc2pvaW50U3VidHJhY3QiXSwic2V0SXNTdXBlcnNldCI6WyJzZXRJc1N1cGVyc2V0Il0sInNldElzRGlzam9pbnQiOlsic2V0SXNEaXNqb2ludCJdLCJzZXRDb21wYXJlIjpbInNldENvbXBhcmUiXSwic2V0VW5pb24iOlsic2V0VW5pb24iXSwic2V0RGlzam9pbnRVbmlvbiI6WyJzZXREaXNqb2ludFVuaW9uIl0sInNldEludGVyc2VjdGlvbiI6WyJzZXRJbnRlcnNlY3Rpb24iXSwic2V0RGlzam9pbnRTdWJ0cmFjdCI6WyJzZXREaXNqb2ludFN1YnRyYWN0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMIJ83kJCwAACQsAACwAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvbGVnYWN5L2xlZ2FjeU1hcC5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2Fzc2VydCJdLCJleHBvcnRzIjpbIm1ha2VMZWdhY3lNYXAiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcSxGYWlsOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJxXCIsIFskaOKAjV9hID0+IChxID0gJGjigI1fYSldXSxbXCJGYWlsXCIsIFskaOKAjV9hID0+IChGYWlsID0gJGjigI1fYSldXV1dXSk7ICAgXG5cbi8qKlxuICogVGhpcyBtb2R1bGUgYW5kIGl0cyBmcmF0ZXJuYWwgc2libGluZyBsZWdhY3lXZWFrTWFwIGV4aXN0IG9ubHkgdG9cbiAqIGVhc2UgYSB0cmFuc2l0aW9uIHRvIHRoZSBtb2Rlcm4gYHN0b3JlYCBzeXN0ZW0sIGFyZSBkZXByZWNhdGVkLFxuICogYW5kIHdpbGwgZXZlbnR1YWxseSBkaXNhcHBlYXIuIFRoZXkgYXJlIG5lZWRlZCBmb3Igbm93IHRvIHN1cHBvcnRcbiAqIHNvbWUgb2YgdGhlIHVzZXMgb2YgdGhlIG9sZCBiZWhhdmlvciB0aGF0IGFyZSBub3QgY29tcGF0aWJsZSB3aXRoXG4gKiB0aGUgbmV3LiBUaGUgY29uc3RyYWludCBpbXBvc2VkIGJ5IHRoZSBuZXcgaXMgdGhhdCBvbmx5IHBhc3NhYmxlcyBjYW5cbiAqIGJlIHVzZWQgYXMgdmFsdWVzLCBhbmQgb25seSBrZXlzIChyb3VnaGx5LCBzdHJ1Y3R1cmVzLCBha2EgY29tcGFyYWJsZXMpXG4gKiBjYW4gYmUgdXNlZCBhcyB2YWx1ZXMuXG4gKlxuICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9wdWxsLzM1NjdcbiAqIFRPRE8gT25jZSB0aGF0IFBSIGlzIG1lcmdlZCwgbGluayB0byB0aGUgZG9jdW1lbnRzIHJhdGhlciB0aGFuIHRoZSBQUnMuXG4gKlxuICogRWFjaCBvZiB0aGVzZSBub24tY29uZm9ybWluZyB1c2VzIHNob3VsZCBiZSBtYXJrZWQgd2l0aCBhXG4gKiBgYGBqc1xuICogLy8gTGVnYWN5IGJlY2F1c2UuLi5cbiAqIGBgYFxuICogY29tbWVudCBleHBsYWluaW5nIHRoZSBwcm9ibGVtIGluaGliaXRpbmcgY29udmVyc2lvbiB0byB0aGUgbmV3XG4gKiBzeXN0ZW0uIFNvbWUgb2YgdGhlc2UgcHJvYmxlbXMgYXMgb2YgdGhpcyB3cml0aW5nOlxuICogICAgKiBBIHByb21pc2VLaXQgdXNlZCBhcyBhIHZhbHVlLCBldmVuIHRob3VnaCBhIHByb21pc2VLaXQgaXMgbm90XG4gKiAgICAgIGEgcGFzc2FibGUuIFNvbHV0aW9ucyBhcmUgdG8gbWFrZSBpdCBhIHBhc3NhYmxlLCBvciB0byBjb252ZXJ0XG4gKiAgICAgIHRoZSBjb250YWluZXIgYmFjayB0byBhIGNvbnZlbnRpb25hbCBKYXZhU2NyaXB0IE1hcC5cbiAqICAgICogQSBtdXRhYmxlIGFycmF5IHVzZWQgYXMgYSB2YWx1ZSwgdGhhdCBpcyBzdWJzZXF1ZW50bHkgbXV0YXRlZC5cbiAqICAgICAgRnJlZXppbmcgdGhlIGFycmF5IHdvdWxkbid0IHdvcmsgb2YgY291cnNlIGJlY2F1c2UgaXQgd291bGQgYnJlYWtcbiAqICAgICAgdGhlIHN1YnNlcXVlbnQgbXV0YXRpb24uIFVzaW5nIGEgZmFyIG9iamVjdCB3cmFwcGluZyBhbiBhcnJheSB3b3VsZFxuICogICAgICBsaWtlbHkgd29yayBmaW5lLlxuICpcbiAqIEBkZXByZWNhdGVkIHN3aXRjaCB0byBTY2FsYXJNYXAgaWYgcG9zc2libGUsIE1hcCBvdGhlcndpc2VcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnPSdrZXknXSAtIHRhZyBmb3IgZGVidWdnaW5nXG4gKiBAcmV0dXJucyB7TGVnYWN5TWFwPEssVj59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTGVnYWN5TWFwPSh0YWc9J2tleScpPT57XG5jb25zdCBtPW5ldyBNYXAoKTtcbmNvbnN0IGFzc2VydEtleURvZXNOb3RFeGlzdD0oa2V5KT0+XG4hbS5oYXMoa2V5KXx8RmFpbCBgJHtxKHRhZyl9IGFscmVhZHkgcmVnaXN0ZXJlZDogJHtrZXl9YDtcbmNvbnN0IGFzc2VydEtleUV4aXN0cz0oa2V5KT0+XG5tLmhhcyhrZXkpfHxGYWlsIGAke3EodGFnKX0gbm90IGZvdW5kOiAke2tleX1gO1xucmV0dXJuIGhhcmRlbih7XG5oYXM6KGtleSk9Pntcbi8qIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsKi9cbi8qIHRob3VnaCB0aGUgYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kKi9cbi8qIGluIHRoaXMgbWFwLiovXG5yZXR1cm4gbS5oYXMoa2V5KTtcbiB9LFxuaW5pdDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RG9lc05vdEV4aXN0KGtleSk7XG5tLnNldChrZXksdmFsdWUpO1xuIH0sXG5nZXQ6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xucmV0dXJuIG0uZ2V0KGtleSk7XG4gfSxcbnNldDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG5tLnNldChrZXksdmFsdWUpO1xuIH0sXG5kZWxldGU6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xubS5kZWxldGUoa2V5KTtcbiB9LFxua2V5czooKT0+bS5rZXlzKCksXG52YWx1ZXM6KCk9Pm0udmFsdWVzKCksXG5lbnRyaWVzOigpPT5tLmVudHJpZXMoKSxcbmdldFNpemU6KCk9Pm0uc2l6ZSxcbmNsZWFyOigpPT5tLmNsZWFyKCl9KTtcblxuIH07JGjigI1fb25jZS5tYWtlTGVnYWN5TWFwKG1ha2VMZWdhY3lNYXApO1xuaGFyZGVuKG1ha2VMZWdhY3lNYXApO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VMZWdhY3lNYXAiOlsibWFrZUxlZ2FjeU1hcCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABay5YGrQYAAK0GAAAwAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2xlZ2FjeS9sZWdhY3lXZWFrTWFwLmpzeyJpbXBvcnRzIjpbIi4uL3R5cGVzLmpzIiwiQGFnb3JpYy9hc3NlcnQiXSwiZXhwb3J0cyI6WyJtYWtlTGVnYWN5V2Vha01hcCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBxLEZhaWw7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcInFcIiwgWyRo4oCNX2EgPT4gKHEgPSAkaOKAjV9hKV1dLFtcIkZhaWxcIiwgWyRo4oCNX2EgPT4gKEZhaWwgPSAkaOKAjV9hKV1dXV0sW1wiLi4vdHlwZXMuanNcIiwgW11dXSk7ICAgXG5cblxuLyoqXG4gKiBTZWUgZG9jY29tbWVudCBpbiB0aGUgY2xvc2VseSByZWxhdGVkIGBsZWdhY3lNYXAuanNgIG1vZHVsZS5cbiAqXG4gKiBAZGVwcmVjYXRlZCBzd2l0Y2ggdG8gU2NhbGFyV2Vha01hcCBpZiBwb3NzaWJsZSwgV2Vha01hcCBvdGhlcndpc2VcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnPSdrZXknXSAtIHRhZyBmb3IgZGVidWdnaW5nXG4gKiBAcmV0dXJucyB7TGVnYWN5V2Vha01hcDxLLFY+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUxlZ2FjeVdlYWtNYXA9KHRhZz0na2V5Jyk9Pntcbi8qKiBAdHlwZSB7V2Vha01hcDxLICYgb2JqZWN0LCBWPn0gKi9cbmNvbnN0IHdtPW5ldyBXZWFrTWFwKCk7XG5jb25zdCBhc3NlcnRLZXlEb2VzTm90RXhpc3Q9KGtleSk9PlxuIXdtLmhhcyhrZXkpfHxGYWlsIGAke3EodGFnKX0gYWxyZWFkeSByZWdpc3RlcmVkOiAke2tleX1gO1xuY29uc3QgYXNzZXJ0S2V5RXhpc3RzPShrZXkpPT5cbndtLmhhcyhrZXkpfHxGYWlsIGAke3EodGFnKX0gbm90IGZvdW5kOiAke2tleX1gO1xucmV0dXJuIGhhcmRlbih7XG5oYXM6KGtleSk9Pntcbi8qIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsKi9cbi8qIHRob3VnaCB0aGUgYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kKi9cbi8qIGluIHRoaXMgbWFwLiovXG5yZXR1cm4gd20uaGFzKGtleSk7XG4gfSxcbmluaXQ6KGtleSx2YWx1ZSk9PntcbmFzc2VydEtleURvZXNOb3RFeGlzdChrZXkpO1xud20uc2V0KGtleSx2YWx1ZSk7XG4gfSxcbmdldDooa2V5KT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG4vKiBIb3cgdG8gdGVsbCB0eXBlc2NyaXB0IEkgYmVsaWV2ZSB0aGUgYGdldGAgd2lsbCBzdWNjZWVkLiovXG5yZXR1cm4gKC8qKiBAdHlwZSB7Vn0gKi93bS5nZXQoa2V5KSk7XG4gfSxcbnNldDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG53bS5zZXQoa2V5LHZhbHVlKTtcbiB9LFxuZGVsZXRlOihrZXkpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbndtLmRlbGV0ZShrZXkpO1xuIH19KTtcblxuIH07JGjigI1fb25jZS5tYWtlTGVnYWN5V2Vha01hcChtYWtlTGVnYWN5V2Vha01hcCk7XG5oYXJkZW4obWFrZUxlZ2FjeVdlYWtNYXApO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VMZWdhY3lXZWFrTWFwIjpbIm1ha2VMZWdhY3lXZWFrTWFwIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAPb2JC60FAAAtBQAAC8AAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvcGF0dGVybnMvZXhvLW1ha2Vycy5qc3siaW1wb3J0cyI6WyIuL2V4by10b29scy5qcyIsIkBhZ29yaWMvaW50ZXJuYWwiXSwiZXhwb3J0cyI6WyJkZWZpbmVFeG9DbGFzcyIsImRlZmluZUV4b0NsYXNzS2l0IiwiaW5pdEVtcHR5IiwibWFrZUV4byJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBvYmplY3RNYXAsZGVmZW5kUHJvdG90eXBlLGRlZmVuZFByb3RvdHlwZUtpdDskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL2ludGVybmFsXCIsIFtbXCJvYmplY3RNYXBcIiwgWyRo4oCNX2EgPT4gKG9iamVjdE1hcCA9ICRo4oCNX2EpXV1dXSxbXCIuL2V4by10b29scy5qc1wiLCBbW1wiZGVmZW5kUHJvdG90eXBlXCIsIFskaOKAjV9hID0+IChkZWZlbmRQcm90b3R5cGUgPSAkaOKAjV9hKV1dLFtcImRlZmVuZFByb3RvdHlwZUtpdFwiLCBbJGjigI1fYSA9PiAoZGVmZW5kUHJvdG90eXBlS2l0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5jb25zdHtzZWFsLGZyZWV6ZX09T2JqZWN0O1xuXG5jb25zdCBlbXB0eVJlY29yZD1oYXJkZW4oe30pO1xuXG4vKipcbiAqIFdoZW4gY2FsbGluZyBgZGVmaW5lRHVyYWJsZUtpbmRgIGFuZFxuICogaXRzIHNpYmxpbmdzLCB1c2VkIGFzIHRoZSBgaW5pdGAgZnVuY3Rpb24gYXJndW1lbnQgdG8gaW5kaWNhdGUgdGhhdCB0aGVcbiAqIHN0YXRlIHJlY29yZCBvZiB0aGUgKHZpcnR1YWwvZHVyYWJsZSkgaW5zdGFuY2VzIG9mIHRoZSBraW5kL2V4b0NsYXNzXG4gKiBzaG91bGQgYmUgZW1wdHksIGFuZCB0aGF0IHRoZSByZXR1cm5lZCBtYWtlciBmdW5jdGlvbiBzaG91bGQgaGF2ZSB6ZXJvXG4gKiBwYXJhbWV0ZXJzLlxuICpcbiAqIEByZXR1cm5zIHt7fX1cbiAqL1xuY29uc3QgICAgICAgIGluaXRFbXB0eT0oKT0+ZW1wdHlSZWNvcmQ7XG5cbi8qKlxuICogQHRlbXBsYXRlIFtTID0gYW55XVxuICogQHRlbXBsYXRlIFtUID0gYW55XVxuICogQHR5cGVkZWYge29iamVjdH0gQ29udGV4dFxuICogQHByb3BlcnR5IHtTfSBzdGF0ZVxuICogQHByb3BlcnR5IHtUfSBzZWxmXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgW1MgPSBhbnldXG4gKiBAdGVtcGxhdGUgW0YgPSBhbnldXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBLaXRDb250ZXh0XG4gKiBAcHJvcGVydHkge1N9IHN0YXRlXG4gKiBAcHJvcGVydHkge0Z9IGZhY2V0c1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3tbbmFtZTogc3RyaW5nXTogUGF0dGVybn19IFN0YXRlU2hhcGVcbiAqIEl0IGxvb2tzIGxpa2UgYSBjb3B5UmVjb3JkIHBhdHRlcm4sIGJ1dCB0aGUgaW50ZXJwcmV0YXRpb24gaXMgZGlmZmVyZW50LlxuICogRWFjaCBwcm9wZXJ0eSBpcyBkaXN0aW5jdCwgaXMgY2hlY2tlZCBhbmQgY2hhbmdlZCBzZXBhcmF0ZWx5LlxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIENcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEZhckNsYXNzT3B0aW9uc1xuICogQHByb3BlcnR5IHsoY29udGV4dDogQykgPT4gdm9pZH0gW2ZpbmlzaF1cbiAqIEBwcm9wZXJ0eSB7U3RhdGVTaGFwZX0gW3N0YXRlU2hhcGVdXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgQSBhcmdzIHRvIGluaXRcbiAqIEB0ZW1wbGF0ZSBTIHN0YXRlIGZyb20gaW5pdFxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPn0gVCBtZXRob2RzXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7KC4uLmFyZ3M6IEFbXSkgPT4gU30gaW5pdFxuICogQHBhcmFtIHtUICYgVGhpc1R5cGU8eyBzZWxmOiBULCBzdGF0ZTogUyB9Pn0gbWV0aG9kc1xuICogQHBhcmFtIHtGYXJDbGFzc09wdGlvbnM8Q29udGV4dDxTLFQ+Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IEFbXSkgPT4gKFQgJiBYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuUmVtb3RhYmxlQnJhbmQ8e30sIFQ+KX1cbiAqLyRo4oCNX29uY2UuaW5pdEVtcHR5KGluaXRFbXB0eSk7XG5jb25zdCAgICAgICAgZGVmaW5lRXhvQ2xhc3M9KFxudGFnLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0LFxubWV0aG9kcyxcbntmaW5pc2g9dW5kZWZpbmVkfT17fSk9Plxue1xuLyoqIEB0eXBlIHtXZWFrTWFwPFQsQ29udGV4dDxTLCBUPj59ICovXG5jb25zdCBjb250ZXh0TWFwPW5ldyBXZWFrTWFwKCk7XG5jb25zdCBwcm90b3R5cGU9ZGVmZW5kUHJvdG90eXBlKFxudGFnLFxuY29udGV4dE1hcCxcbm1ldGhvZHMsXG50cnVlLFxuaW50ZXJmYWNlR3VhcmQpO1xuXG5jb25zdCBtYWtlSW5zdGFuY2U9KC4uLmFyZ3MpPT57XG4vKiBCZSBjYXJlZnVsIG5vdCB0byBmcmVlemUgdGhlIHN0YXRlIHJlY29yZCovXG5jb25zdCBzdGF0ZT1zZWFsKGluaXQoLi4uYXJncykpO1xuLyoqIEB0eXBlIHtUfSAqL1xuLyogQHRzLWV4cGVjdC1lcnJvciBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBkaWZmZXJlbnQgc3VidHlwZSovXG5jb25zdCBzZWxmPWhhcmRlbih7X19wcm90b19fOnByb3RvdHlwZX0pO1xuLyogQmUgY2FyZWZ1bCBub3QgdG8gZnJlZXplIHRoZSBzdGF0ZSByZWNvcmQqL1xuLyoqIEB0eXBlIHtDb250ZXh0PFMsVD59ICovXG5jb25zdCBjb250ZXh0PWZyZWV6ZSh7c3RhdGUsc2VsZn0pO1xuY29udGV4dE1hcC5zZXQoc2VsZixjb250ZXh0KTtcbmlmKGZpbmlzaCl7XG5maW5pc2goY29udGV4dCk7XG4gfVxucmV0dXJuIHNlbGY7XG4gfTtcbi8qIEB0cy1leHBlY3QtZXJyb3IgY291bGQgYmUgaW5zdGFudGlhdGVkIHdpdGggZGlmZmVyZW50IHN1YnR5cGUqL1xucmV0dXJuIGhhcmRlbihtYWtlSW5zdGFuY2UpO1xuIH07JGjigI1fb25jZS5kZWZpbmVFeG9DbGFzcyhkZWZpbmVFeG9DbGFzcyk7XG5oYXJkZW4oZGVmaW5lRXhvQ2xhc3MpO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBBIGFyZ3MgdG8gaW5pdFxuICogQHRlbXBsYXRlIFMgc3RhdGUgZnJvbSBpbml0XG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+Pn0gRiBtZXRob2RzXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRLaXRcbiAqIEBwYXJhbSB7KC4uLmFyZ3M6IEFbXSkgPT4gU30gaW5pdFxuICogQHBhcmFtIHtGICYgVGhpc1R5cGU8eyBmYWNldHM6IEYsIHN0YXRlOiBTIH0+IH0gbWV0aG9kc0tpdFxuICogQHBhcmFtIHtGYXJDbGFzc09wdGlvbnM8S2l0Q29udGV4dDxTLEY+Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IEFbXSkgPT4gRn1cbiAqL1xuY29uc3QgICAgICAgIGRlZmluZUV4b0NsYXNzS2l0PShcbnRhZyxcbmludGVyZmFjZUd1YXJkS2l0LFxuaW5pdCxcbm1ldGhvZHNLaXQsXG57ZmluaXNoPXVuZGVmaW5lZH09e30pPT5cbntcbmNvbnN0IGNvbnRleHRNYXBLaXQ9b2JqZWN0TWFwKG1ldGhvZHNLaXQsKCk9Pm5ldyBXZWFrTWFwKCkpO1xuY29uc3QgcHJvdG90eXBlS2l0PWRlZmVuZFByb3RvdHlwZUtpdChcbnRhZyxcbmNvbnRleHRNYXBLaXQsXG5tZXRob2RzS2l0LFxudHJ1ZSxcbmludGVyZmFjZUd1YXJkS2l0KTtcblxuY29uc3QgbWFrZUluc3RhbmNlS2l0PSguLi5hcmdzKT0+e1xuLyogQmUgY2FyZWZ1bCBub3QgdG8gZnJlZXplIHRoZSBzdGF0ZSByZWNvcmQqL1xuY29uc3Qgc3RhdGU9c2VhbChpbml0KC4uLmFyZ3MpKTtcbi8qIERvbid0IGZyZWV6ZSBjb250ZXh0IHVudGlsIHdlIGFkZCBmYWNldHMqL1xuY29uc3QgY29udGV4dD17c3RhdGV9O1xuY29uc3QgZmFjZXRzPW9iamVjdE1hcChwcm90b3R5cGVLaXQsKHByb3RvdHlwZSxmYWNldE5hbWUpPT57XG5jb25zdCBzZWxmPWhhcmRlbih7X19wcm90b19fOnByb3RvdHlwZX0pO1xuY29udGV4dE1hcEtpdFtmYWNldE5hbWVdLnNldChzZWxmLGNvbnRleHQpO1xucmV0dXJuIHNlbGY7XG4gfSk7XG5jb250ZXh0LmZhY2V0cz1mYWNldHM7XG4vKiBCZSBjYXJlZnVsIG5vdCB0byBmcmVlemUgdGhlIHN0YXRlIHJlY29yZCovXG5mcmVlemUoY29udGV4dCk7XG5pZihmaW5pc2gpe1xuLyogQHRzLWV4cGVjdC1lcnJvciBgZmFjZXRzYCB3YXMgYWRkZWQqL1xuZmluaXNoKGNvbnRleHQpO1xuIH1cbnJldHVybiBmYWNldHM7XG4gfTtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLXRzLWV4cGVjdC1lcnJvciAtLSBkaWZmZXJlbnQgcGVyIHBhY2thZ2UgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80NjIwKi9cbi8qIEB0cy1pZ25vcmUgeHh4Ki9cbnJldHVybiBoYXJkZW4obWFrZUluc3RhbmNlS2l0KTtcbiB9OyRo4oCNX29uY2UuZGVmaW5lRXhvQ2xhc3NLaXQoZGVmaW5lRXhvQ2xhc3NLaXQpO1xuaGFyZGVuKGRlZmluZUV4b0NsYXNzS2l0KTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIE1ldGhvZD59IFRcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmQgfCB1bmRlZmluZWR9IGludGVyZmFjZUd1YXJkIENBVkVBVDogc3RhdGljIHR5cGluZyBkb2VzIG5vdCB5ZXQgc3VwcG9ydCBgY2FsbFdoZW5gIHRyYW5zZm9ybWF0aW9uXG4gKiBAcGFyYW0ge1R9IG1ldGhvZHNcbiAqIEBwYXJhbSB7RmFyQ2xhc3NPcHRpb25zPENvbnRleHQ8e30sVD4+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtUICYgWGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLlJlbW90YWJsZUJyYW5kPHt9LCBUPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VFeG89KHRhZyxpbnRlcmZhY2VHdWFyZCxtZXRob2RzLG9wdGlvbnM9dW5kZWZpbmVkKT0+e1xuY29uc3QgbWFrZUluc3RhbmNlPWRlZmluZUV4b0NsYXNzKFxudGFnLFxuaW50ZXJmYWNlR3VhcmQsXG5pbml0RW1wdHksXG5tZXRob2RzLFxub3B0aW9ucyk7XG5cbnJldHVybiBtYWtlSW5zdGFuY2UoKTtcbiB9OyRo4oCNX29uY2UubWFrZUV4byhtYWtlRXhvKTtcbmhhcmRlbihtYWtlRXhvKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpbml0RW1wdHkiOlsiaW5pdEVtcHR5Il0sImRlZmluZUV4b0NsYXNzIjpbImRlZmluZUV4b0NsYXNzIl0sImRlZmluZUV4b0NsYXNzS2l0IjpbImRlZmluZUV4b0NsYXNzS2l0Il0sIm1ha2VFeG8iOlsibWFrZUV4byJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAgzF3WMyIAADMiAAAuAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3BhdHRlcm5zL2V4by10b29scy5qc3siaW1wb3J0cyI6WyIuL3BhdHRlcm5NYXRjaGVycy5qcyIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAZW5kby9mYXIiXSwiZXhwb3J0cyI6WyJkZWZlbmRQcm90b3R5cGUiLCJkZWZlbmRQcm90b3R5cGVLaXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxGYXIsbGlzdERpZmZlcmVuY2Usb2JqZWN0TWFwLE1pbk1ldGhvZEd1YXJkLG11c3RNYXRjaCxNOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV0sW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9pbnRlcm5hbFwiLCBbW1wibGlzdERpZmZlcmVuY2VcIiwgWyRo4oCNX2EgPT4gKGxpc3REaWZmZXJlbmNlID0gJGjigI1fYSldXSxbXCJvYmplY3RNYXBcIiwgWyRo4oCNX2EgPT4gKG9iamVjdE1hcCA9ICRo4oCNX2EpXV1dXSxbXCIuL3BhdHRlcm5NYXRjaGVycy5qc1wiLCBbW1wiTWluTWV0aG9kR3VhcmRcIiwgWyRo4oCNX2EgPT4gKE1pbk1ldGhvZEd1YXJkID0gJGjigI1fYSldXSxbXCJtdXN0TWF0Y2hcIiwgWyRo4oCNX2EgPT4gKG11c3RNYXRjaCA9ICRo4oCNX2EpXV0sW1wiTVwiLCBbJGjigI1fYSA9PiAoTSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5jb25zdHtxdW90ZTpxLEZhaWx9PWFzc2VydDtcbmNvbnN0e2FwcGx5LG93bktleXN9PVJlZmxlY3Q7XG5jb25zdHtkZWZpbmVQcm9wZXJ0aWVzfT1PYmplY3Q7XG5cbmNvbnN0IGRlZmVuZFN5bmNBcmdzPShhcmdzLG1ldGhvZEd1YXJkLGxhYmVsKT0+e1xuY29uc3R7YXJnR3VhcmRzLG9wdGlvbmFsQXJnR3VhcmRzLHJlc3RBcmdHdWFyZH09bWV0aG9kR3VhcmQ7XG5jb25zdCBwYXJhbXNQYXR0ZXJuPU0uc3BsaXRBcnJheShcbmFyZ0d1YXJkcyxcbm9wdGlvbmFsQXJnR3VhcmRzLFxucmVzdEFyZ0d1YXJkKTtcblxubXVzdE1hdGNoKGhhcmRlbihhcmdzKSxwYXJhbXNQYXR0ZXJuLGxhYmVsKTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7TWV0aG9kfSBtZXRob2RcbiAqIEBwYXJhbSB7TWV0aG9kR3VhcmR9IG1ldGhvZEd1YXJkXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWxcbiAqIEByZXR1cm5zIHtNZXRob2R9XG4gKi9cbmNvbnN0IGRlZmVuZFN5bmNNZXRob2Q9KG1ldGhvZCxtZXRob2RHdWFyZCxsYWJlbCk9PntcbmNvbnN0e3JldHVybkd1YXJkfT1tZXRob2RHdWFyZDtcbmNvbnN0e3N5bmNNZXRob2R9PXtcbi8qIE5vdGUgcHVycG9zZWZ1bCB1c2Ugb2YgYHRoaXNgIGFuZCBjb25jaXNlIG1ldGhvZCBzeW50YXgqL1xuc3luY01ldGhvZCguLi5hcmdzKXtcbmRlZmVuZFN5bmNBcmdzKGhhcmRlbihhcmdzKSxtZXRob2RHdWFyZCxsYWJlbCk7XG5jb25zdCByZXN1bHQ9YXBwbHkobWV0aG9kLHRoaXMsYXJncyk7XG5tdXN0TWF0Y2goaGFyZGVuKHJlc3VsdCkscmV0dXJuR3VhcmQsIGAke2xhYmVsfTogcmVzdWx0YCk7XG5yZXR1cm4gcmVzdWx0O1xuIH19O1xuXG5yZXR1cm4gc3luY01ldGhvZDtcbiB9O1xuXG5jb25zdCBpc0F3YWl0QXJnR3VhcmQ9KGFyZ0d1YXJkKT0+XG5hcmdHdWFyZCYmdHlwZW9mIGFyZ0d1YXJkPT09J29iamVjdCcmJmFyZ0d1YXJkLmtsYXNzPT09J2F3YWl0QXJnJztcblxuY29uc3QgZGVzeW5jPShtZXRob2RHdWFyZCk9PntcbmNvbnN0e2FyZ0d1YXJkcyxvcHRpb25hbEFyZ0d1YXJkcz1bXSxyZXN0QXJnR3VhcmR9PW1ldGhvZEd1YXJkO1xuIWlzQXdhaXRBcmdHdWFyZChyZXN0QXJnR3VhcmQpfHxcbkZhaWwgYFJlc3QgYXJncyBtYXkgbm90IGJlIGF3YWl0ZWQ6ICR7cmVzdEFyZ0d1YXJkfWA7XG5jb25zdCByYXdBcmdHdWFyZHM9Wy4uLmFyZ0d1YXJkcywuLi5vcHRpb25hbEFyZ0d1YXJkc107XG5cbmNvbnN0IGF3YWl0SW5kZXhlcz1bXTtcbmZvcihsZXQgaT0wO2k8cmF3QXJnR3VhcmRzLmxlbmd0aDtpKz0xKXtcbmNvbnN0IGFyZ0d1YXJkPXJhd0FyZ0d1YXJkc1tpXTtcbmlmKGlzQXdhaXRBcmdHdWFyZChhcmdHdWFyZCkpe1xucmF3QXJnR3VhcmRzW2ldPWFyZ0d1YXJkLmFyZ0d1YXJkO1xuYXdhaXRJbmRleGVzLnB1c2goaSk7XG4gfVxuIH1cbnJldHVybntcbmF3YWl0SW5kZXhlcyxcbnJhd01ldGhvZEd1YXJkOntcbmFyZ0d1YXJkczpyYXdBcmdHdWFyZHMuc2xpY2UoMCxhcmdHdWFyZHMubGVuZ3RoKSxcbm9wdGlvbmFsQXJnR3VhcmRzOnJhd0FyZ0d1YXJkcy5zbGljZShhcmdHdWFyZHMubGVuZ3RoKSxcbnJlc3RBcmdHdWFyZH19O1xuXG5cbiB9O1xuXG5jb25zdCBkZWZlbmRBc3luY01ldGhvZD0obWV0aG9kLG1ldGhvZEd1YXJkLGxhYmVsKT0+e1xuY29uc3R7cmV0dXJuR3VhcmR9PW1ldGhvZEd1YXJkO1xuY29uc3R7YXdhaXRJbmRleGVzLHJhd01ldGhvZEd1YXJkfT1kZXN5bmMobWV0aG9kR3VhcmQpO1xuY29uc3R7YXN5bmNNZXRob2R9PXtcbi8qIE5vdGUgcHVycG9zZWZ1bCB1c2Ugb2YgYHRoaXNgIGFuZCBjb25jaXNlIG1ldGhvZCBzeW50YXgqL1xuYXN5bmNNZXRob2QoLi4uYXJncyl7XG5jb25zdCBhd2FpdExpc3Q9YXdhaXRJbmRleGVzLm1hcCgoaSk9PmFyZ3NbaV0pO1xuY29uc3QgcD1Qcm9taXNlLmFsbChhd2FpdExpc3QpO1xuY29uc3QgcmF3QXJncz1bLi4uYXJnc107XG5jb25zdCByZXN1bHRQPUUud2hlbihwLChhd2FpdGVkQXJncyk9PntcbmZvcihsZXQgaj0wO2o8YXdhaXRJbmRleGVzLmxlbmd0aDtqKz0xKXtcbnJhd0FyZ3NbYXdhaXRJbmRleGVzW2pdXT1hd2FpdGVkQXJnc1tqXTtcbiB9XG5kZWZlbmRTeW5jQXJncyhyYXdBcmdzLHJhd01ldGhvZEd1YXJkLGxhYmVsKTtcbnJldHVybiBhcHBseShtZXRob2QsdGhpcyxyYXdBcmdzKTtcbiB9KTtcbnJldHVybiBFLndoZW4ocmVzdWx0UCwocmVzdWx0KT0+e1xubXVzdE1hdGNoKGhhcmRlbihyZXN1bHQpLHJldHVybkd1YXJkLCBgJHtsYWJlbH06IHJlc3VsdGApO1xucmV0dXJuIHJlc3VsdDtcbiB9KTtcbiB9fTtcblxucmV0dXJuIGFzeW5jTWV0aG9kO1xuIH07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7TWV0aG9kfSBtZXRob2RcbiAqIEBwYXJhbSB7TWV0aG9kR3VhcmR9IG1ldGhvZEd1YXJkXG4gKiBAcGFyYW0ge3N0cmluZ30gbGFiZWxcbiAqL1xuY29uc3QgZGVmZW5kTWV0aG9kPShtZXRob2QsbWV0aG9kR3VhcmQsbGFiZWwpPT57XG5jb25zdHtrbGFzcyxjYWxsS2luZH09bWV0aG9kR3VhcmQ7XG5hc3NlcnQoa2xhc3M9PT0nbWV0aG9kR3VhcmQnKTtcbmlmKGNhbGxLaW5kPT09J3N5bmMnKXtcbnJldHVybiBkZWZlbmRTeW5jTWV0aG9kKG1ldGhvZCxtZXRob2RHdWFyZCxsYWJlbCk7XG4gfWVsc2V7XG5hc3NlcnQoY2FsbEtpbmQ9PT0nYXN5bmMnKTtcbnJldHVybiBkZWZlbmRBc3luY01ldGhvZChtZXRob2QsbWV0aG9kR3VhcmQsbGFiZWwpO1xuIH1cbiB9O1xuXG4vKipcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gbWV0aG9kVGFnXG4gKiBAcGFyYW0ge1dlYWtNYXB9IGNvbnRleHRNYXBcbiAqIEBwYXJhbSB7Q2FsbGFibGVGdW5jdGlvbn0gYmVoYXZpb3JNZXRob2RcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3RoaXNmdWxNZXRob2RzXVxuICogQHBhcmFtIHtNZXRob2RHdWFyZH0gW21ldGhvZEd1YXJkXVxuICovXG5jb25zdCBiaW5kTWV0aG9kPShcbm1ldGhvZFRhZyxcbmNvbnRleHRNYXAsXG5iZWhhdmlvck1ldGhvZCxcbnRoaXNmdWxNZXRob2RzPWZhbHNlLFxubWV0aG9kR3VhcmQ9dW5kZWZpbmVkKT0+XG57XG5hc3NlcnQudHlwZW9mKGJlaGF2aW9yTWV0aG9kLCdmdW5jdGlvbicpO1xuXG5jb25zdCBnZXRDb250ZXh0PShzZWxmKT0+e1xuY29uc3QgY29udGV4dD1jb250ZXh0TWFwLmdldChzZWxmKTtcbmNvbnRleHR8fFxuRmFpbCBgJHtxKG1ldGhvZFRhZyl9IG1heSBvbmx5IGJlIGFwcGxpZWQgdG8gYSB2YWxpZCBpbnN0YW5jZTogJHtzZWxmfWA7XG5yZXR1cm4gY29udGV4dDtcbiB9O1xuXG4vKiBWaW9sYXRpbmcgYWxsIEplc3NpZSBydWxlcyB0byBjcmVhdGUgcmVwcmVzZW50YXRpdmVzIHRoYXQgaW5oZXJpdCovXG4vKiBtZXRob2RzIGZyb20gYSBzaGFyZWQgcHJvdG90eXBlLiBUaGUgYm91bmQgbWV0aG9kIHRoZXJlZm9yZSBuZWVkcyovXG4vKiB0byBtZW50aW9uIGB0aGlzYC4gV2UgZGVmaW5lIGl0IHVzaW5nIGNvbmNpc2UgbWV0aG9kIHN5bnRheCovXG4vKiBzbyB0aGF0IGl0IHdpbGwgYmUgYHRoaXNgIHNlbnNpdGl2ZSBidXQgbm90IGNvbnN0cnVjdGFibGUuKi9cbi8qKi9cbi8qIFdlIG5vcm1hbGx5IGNvbnNpZGVyIGB0aGlzYCB1bnNhZmUgYmVjYXVzZSBvZiB0aGUgaGF6YXJkIG9mIGEqL1xuLyogbWV0aG9kIG9mIG9uZSBhYnN0cmFjdGlvbiBiZWluZyBhcHBsaWVkIHRvIGFuIGluc3RhbmNlIG9mKi9cbi8qIGFub3RoZXIgYWJzdHJhY3Rpb24uIFRvIHByZXZlbnQgdGhhdCBhdHRhY2ssIHRoZSBib3VuZCBtZXRob2QqL1xuLyogY2hlY2tzIHRoYXQgaXRzIGB0aGlzYCBpcyBpbiB0aGUgbWFwIGluIHdoaWNoIGl0cyByZXByZXNlbnRhdGl2ZXMqL1xuLyogYXJlIHJlZ2lzdGVyZWQuKi9cbmxldHttZXRob2R9PXRoaXNmdWxNZXRob2RzP1xue1xubWV0aG9kKC4uLmFyZ3Mpe1xudGhpc3x8XG5GYWlsIGB0aGlzZnVsIG1ldGhvZCAke21ldGhvZFRhZ30gY2FsbGVkIHdpdGhvdXQgJ3RoaXMnIG9iamVjdGA7XG5jb25zdCBjb250ZXh0PWdldENvbnRleHQodGhpcyk7XG5yZXR1cm4gYXBwbHkoYmVoYXZpb3JNZXRob2QsY29udGV4dCxhcmdzKTtcbiB9fTpcblxue1xubWV0aG9kKC4uLmFyZ3Mpe1xuY29uc3QgY29udGV4dD1nZXRDb250ZXh0KHRoaXMpO1xucmV0dXJuIGFwcGx5KGJlaGF2aW9yTWV0aG9kLG51bGwsW2NvbnRleHQsLi4uYXJnc10pO1xuIH19O1xuXG5pZihtZXRob2RHdWFyZCl7XG5tZXRob2Q9ZGVmZW5kTWV0aG9kKG1ldGhvZCxtZXRob2RHdWFyZCxtZXRob2RUYWcpO1xuIH1lbHNlIGlmKHRoaXNmdWxNZXRob2RzKXtcbi8qIEZvciBmYXIgY2xhc3NlcyBlbnN1cmUgdGhhdCBpbnB1dHMgYW5kIG91dHB1dHMgYXJlIHBhc3NhYmxlLiovXG5tZXRob2Q9ZGVmZW5kTWV0aG9kKG1ldGhvZCxNaW5NZXRob2RHdWFyZCxtZXRob2RUYWcpO1xuIH1cbmRlZmluZVByb3BlcnRpZXMobWV0aG9kLHtcbm5hbWU6e3ZhbHVlOm1ldGhvZFRhZ30sXG5sZW5ndGg6e1xudmFsdWU6dGhpc2Z1bE1ldGhvZHM/YmVoYXZpb3JNZXRob2QubGVuZ3RoOmJlaGF2aW9yTWV0aG9kLmxlbmd0aC0xfX0pO1xuXG5cbnJldHVybiBtZXRob2Q7XG4gfTtcblxuLyoqXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+fSBUXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge1dlYWtNYXB9IGNvbnRleHRNYXBcbiAqIEBwYXJhbSB7VH0gYmVoYXZpb3JNZXRob2RzXG4gKiBAcGFyYW0ge2Jvb2xlYW59IFt0aGlzZnVsTWV0aG9kc11cbiAqIEBwYXJhbSB7SW50ZXJmYWNlR3VhcmR9IFtpbnRlcmZhY2VHdWFyZF1cbiAqIEByZXR1cm5zIHtUICYgWGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLlJlbW90YWJsZUJyYW5kPHt9LCBUPn1cbiAqL1xuY29uc3QgICAgICAgIGRlZmVuZFByb3RvdHlwZT0oXG50YWcsXG5jb250ZXh0TWFwLFxuYmVoYXZpb3JNZXRob2RzLFxudGhpc2Z1bE1ldGhvZHM9ZmFsc2UsXG5pbnRlcmZhY2VHdWFyZD11bmRlZmluZWQpPT5cbntcbmNvbnN0IHByb3RvdHlwZT17fTtcbmNvbnN0IG1ldGhvZE5hbWVzPW93bktleXMoYmVoYXZpb3JNZXRob2RzKS5maWx0ZXIoXG4vKiBCeSBpZ25vcmluZyBhbnkgbWV0aG9kIG5hbWVkIFwiY29uc3RydWN0b3JcIiwgd2UgY2FuIHVzZSBhKi9cbi8qIGNsYXNzLnByb3RvdHlwZSBhcyBhIGJlaGF2aW9yTWV0aG9kcy4qL1xuKG5hbWUpPT5uYW1lIT09J2NvbnN0cnVjdG9yJyk7XG5cbmxldCBtZXRob2RHdWFyZHM7XG5pZihpbnRlcmZhY2VHdWFyZCl7XG5jb25zdHtcbmtsYXNzLFxuaW50ZXJmYWNlTmFtZSxcbm1ldGhvZEd1YXJkczptZyxcbnNsb3BweT1mYWxzZX09XG5pbnRlcmZhY2VHdWFyZDtcbm1ldGhvZEd1YXJkcz1tZztcbmFzc2VydC5lcXVhbChrbGFzcywnSW50ZXJmYWNlJyk7XG5hc3NlcnQudHlwZW9mKGludGVyZmFjZU5hbWUsJ3N0cmluZycpO1xue1xuY29uc3QgbWV0aG9kR3VhcmROYW1lcz1vd25LZXlzKG1ldGhvZEd1YXJkcyk7XG5jb25zdCB1bmltcGxlbWVudGVkPWxpc3REaWZmZXJlbmNlKG1ldGhvZEd1YXJkTmFtZXMsbWV0aG9kTmFtZXMpO1xudW5pbXBsZW1lbnRlZC5sZW5ndGg9PT0wfHxcbkZhaWwgYG1ldGhvZHMgJHtxKHVuaW1wbGVtZW50ZWQpfSBub3QgaW1wbGVtZW50ZWQgYnkgJHtxKHRhZyl9YDtcbmlmKCFzbG9wcHkpe1xuY29uc3QgdW5ndWFyZGVkPWxpc3REaWZmZXJlbmNlKG1ldGhvZE5hbWVzLG1ldGhvZEd1YXJkTmFtZXMpO1xudW5ndWFyZGVkLmxlbmd0aD09PTB8fFxuRmFpbCBgbWV0aG9kcyAke3EodW5ndWFyZGVkKX0gbm90IGd1YXJkZWQgYnkgJHtxKGludGVyZmFjZU5hbWUpfWA7XG4gfVxuIH1cbiB9XG5mb3IoY29uc3QgcHJvcCBvZiBtZXRob2ROYW1lcyl7XG5wcm90b3R5cGVbcHJvcF09YmluZE1ldGhvZChcbiBgSW4gJHtxKHByb3ApfSBtZXRob2Qgb2YgKCR7dGFnfSlgLFxuY29udGV4dE1hcCxcbmJlaGF2aW9yTWV0aG9kc1twcm9wXSxcbnRoaXNmdWxNZXRob2RzLFxuLyogVE9ETyBzb21lIHRvb2wgZG9lcyBub3QgeWV0IHVuZGVyc3RhbmQgdGhlIGA/LltgIHN5bnRheCovXG5tZXRob2RHdWFyZHMmJm1ldGhvZEd1YXJkc1twcm9wXSk7XG5cbiB9XG5cbnJldHVybiBGYXIodGFnLC8qKiBAdHlwZSB7VH0gKi9wcm90b3R5cGUpO1xuIH07JGjigI1fb25jZS5kZWZlbmRQcm90b3R5cGUoZGVmZW5kUHJvdG90eXBlKTtcbmhhcmRlbihkZWZlbmRQcm90b3R5cGUpO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgV2Vha01hcD59IGNvbnRleHRNYXBLaXRcbiAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj4+fSBiZWhhdmlvck1ldGhvZHNLaXRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW3RoaXNmdWxNZXRob2RzXVxuICogQHBhcmFtIHtSZWNvcmQ8c3RyaW5nLCBJbnRlcmZhY2VHdWFyZD59IFtpbnRlcmZhY2VHdWFyZEtpdF1cbiAqL1xuY29uc3QgICAgICAgIGRlZmVuZFByb3RvdHlwZUtpdD0oXG50YWcsXG5jb250ZXh0TWFwS2l0LFxuYmVoYXZpb3JNZXRob2RzS2l0LFxudGhpc2Z1bE1ldGhvZHM9ZmFsc2UsXG5pbnRlcmZhY2VHdWFyZEtpdD11bmRlZmluZWQpPT5cbntcbmNvbnN0IGZhY2V0TmFtZXM9b3duS2V5cyhiZWhhdmlvck1ldGhvZHNLaXQpLnNvcnQoKTtcbmZhY2V0TmFtZXMubGVuZ3RoPjF8fEZhaWwgYEEgbXVsdGktZmFjZXQgb2JqZWN0IG11c3QgaGF2ZSBtdWx0aXBsZSBmYWNldHNgO1xuaWYoaW50ZXJmYWNlR3VhcmRLaXQpe1xuY29uc3QgaW50ZXJmYWNlTmFtZXM9b3duS2V5cyhpbnRlcmZhY2VHdWFyZEtpdCk7XG5jb25zdCBleHRyYUludGVyZmFjZU5hbWVzPWxpc3REaWZmZXJlbmNlKGZhY2V0TmFtZXMsaW50ZXJmYWNlTmFtZXMpO1xuZXh0cmFJbnRlcmZhY2VOYW1lcy5sZW5ndGg9PT0wfHxcbkZhaWwgYEludGVyZmFjZXMgJHtxKGV4dHJhSW50ZXJmYWNlTmFtZXMpfSBub3QgaW1wbGVtZW50ZWQgYnkgJHtxKHRhZyl9YDtcbmNvbnN0IGV4dHJhRmFjZXROYW1lcz1saXN0RGlmZmVyZW5jZShpbnRlcmZhY2VOYW1lcyxmYWNldE5hbWVzKTtcbmV4dHJhRmFjZXROYW1lcy5sZW5ndGg9PT0wfHxcbkZhaWwgYEZhY2V0cyAke3EoZXh0cmFGYWNldE5hbWVzKX0gb2YgJHtxKHRhZyl9IG5vdCBndWFyZGVkIGJ5IGludGVyZmFjZXNgO1xuIH1cbmNvbnN0IGNvbnRleHRNYXBOYW1lcz1vd25LZXlzKGNvbnRleHRNYXBLaXQpO1xuY29uc3QgZXh0cmFDb250ZXh0TmFtZXM9bGlzdERpZmZlcmVuY2UoZmFjZXROYW1lcyxjb250ZXh0TWFwTmFtZXMpO1xuZXh0cmFDb250ZXh0TmFtZXMubGVuZ3RoPT09MHx8XG5GYWlsIGBDb250ZXh0cyAke3EoZXh0cmFDb250ZXh0TmFtZXMpfSBub3QgaW1wbGVtZW50ZWQgYnkgJHtxKHRhZyl9YDtcbmNvbnN0IGV4dHJhRmFjZXROYW1lcz1saXN0RGlmZmVyZW5jZShjb250ZXh0TWFwTmFtZXMsZmFjZXROYW1lcyk7XG5leHRyYUZhY2V0TmFtZXMubGVuZ3RoPT09MHx8XG5GYWlsIGBGYWNldHMgJHtxKGV4dHJhRmFjZXROYW1lcyl9IG9mICR7cSh0YWcpfSBtaXNzaW5nIGNvbnRleHRzYDtcbnJldHVybiBvYmplY3RNYXAoYmVoYXZpb3JNZXRob2RzS2l0LChiZWhhdmlvck1ldGhvZHMsZmFjZXROYW1lKT0+XG5kZWZlbmRQcm90b3R5cGUoXG4gYCR7dGFnfSAke2ZhY2V0TmFtZX1gLFxuY29udGV4dE1hcEtpdFtmYWNldE5hbWVdLFxuYmVoYXZpb3JNZXRob2RzLFxudGhpc2Z1bE1ldGhvZHMsXG5pbnRlcmZhY2VHdWFyZEtpdCYmaW50ZXJmYWNlR3VhcmRLaXRbZmFjZXROYW1lXSkpO1xuXG5cbiB9OyRo4oCNX29uY2UuZGVmZW5kUHJvdG90eXBlS2l0KGRlZmVuZFByb3RvdHlwZUtpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVmZW5kUHJvdG90eXBlIjpbImRlZmVuZFByb3RvdHlwZSJdLCJkZWZlbmRQcm90b3R5cGVLaXQiOlsiZGVmZW5kUHJvdG90eXBlS2l0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKJ1R3y1BwAAtQcAADMAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvcGF0dGVybnMvaW50ZXJuYWwtdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKiBUT0RPKi9cbi8qIFRoZSBmb2xsb3dpbmcgY29tbWVudGVkIG91dCB0eXBlIHNob3VsZCBiZSBpbiB0aGlzIGZpbGUsIHNpbmNlIHRoZSovXG4vKiBgTWF0Y2hIZWxwZXJgIHR5cGUgaXMgcHVyZWx5IGludGVybmFsIHRvIHRoaXMgcGFja2FnZS4gSG93ZXZlciwqL1xuLyogaW4gb3JkZXIgdG8gZ2V0IHRoZSBnb3Zlcm5hbmNlIGFuZCBzb2xvIHBhY2thZ2VzIGJvdGggdG8gcGFzcyBsaW50LCovXG4vKiBJIG1vdmVkIHRoZSB0eXBlIGRlY2xhcmF0aW9uIGl0c2VsZiB0byB0eXBlcy5qcy4gU2VlIHRoZSBjb21tZW50cyB0aGVyZSovXG4vKiBhbmQgaW4gZXhwb3J0cy5qcyovXG5cbi8qIC8qKiovXG4vKiAqIEB0eXBlZGVmIHtvYmplY3R9IE1hdGNoSGVscGVyKi9cbi8qICogVGhpcyBmYWN0b3JzIG91dCBvbmx5IHRoZSBwYXJ0cyBzcGVjaWZpYyB0byBlYWNoIGtpbmQgb2YgTWF0Y2hlci4gSXQgaXMqL1xuLyogKiBlbmNhcHN1bGF0ZWQsIGFuZCBpdHMgbWV0aG9kcyBjYW4gbWFrZSB0aGUgc3RhdGVkIHVuY2hlY2tlciBhc3N1bXB0aW9ucyovXG4vKiAqIGVuZm9yY2VkIGJ5IHRoZSBjb21tb24gY2FsbGluZyBsb2dpYy4qL1xuLyogKiovXG4vKiAqIEBwcm9wZXJ0eSB7KGFsbGVnZWRQYXlsb2FkOiBQYXNzYWJsZSwqL1xuLyogKiAgICAgICAgICAgICBjaGVjazogQ2hlY2tlciovXG4vKiAqICkgPT4gYm9vbGVhbn0gY2hlY2tJc1dlbGxGb3JtZWQqL1xuLyogKiBBc3N1bWVzIHRoaXMgaXMgdGhlIHBheWxvYWQgb2YgYSBDb3B5VGFnZ2VkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcqL1xuLyogKiBtYXRjaFRhZy4gSXMgdGhpcyBhIHZhbGlkIHBheWxvYWQgZm9yIGEgTWF0Y2hlciB3aXRoIHRoYXQgdGFnPyovXG4vKiAqKi9cbi8qICogQHByb3BlcnR5IHsoc3BlY2ltZW46IFBhc3NhYmxlLCovXG4vKiAqICAgICAgICAgICAgIG1hdGNoZXJQYXlsb2FkOiBQYXNzYWJsZSwqL1xuLyogKiAgICAgICAgICAgICBjaGVjazogQ2hlY2tlciovXG4vKiAqICkgPT4gYm9vbGVhbn0gY2hlY2tNYXRjaGVzKi9cbi8qICogQXNzdW1pbmcgYSB2YWxpZCBNYXRjaGVyIG9mIHRoaXMgdHlwZSB3aXRoIGBtYXRjaGVyUGF5bG9hZGAgYXMgaXRzKi9cbi8qICogcGF5bG9hZCwgZG9lcyB0aGlzIHNwZWNpbWVuIG1hdGNoIHRoYXQgTWF0Y2hlcj8qL1xuLyogKiovXG4vKiAqIEBwcm9wZXJ0eSB7KHBheWxvYWQ6IFBhc3NhYmxlKSA9PiBSYW5rQ292ZXJ9IGdldFJhbmtDb3ZlciovXG4vKiAqIEFzc3VtZXMgdGhpcyBpcyB0aGUgcGF5bG9hZCBvZiBhIENvcHlUYWdnZWQgd2l0aCB0aGUgY29ycmVzcG9uZGluZyovXG4vKiAqIG1hdGNoVGFnLiBSZXR1cm4gYSBSYW5rQ292ZXIgdG8gYm91bmQgZnJvbSBiZWxvdyBhbmQgYWJvdmUsKi9cbi8qICogaW4gcmFuayBvcmRlciwgYWxsIHBvc3NpYmxlIFBhc3NhYmxlcyB0aGF0IHdvdWxkIG1hdGNoIHRoaXMgTWF0Y2hlci4qL1xuLyogKiBUaGUgbGVmdCBlbGVtZW50IG11c3QgYmUgYmVmb3JlIG9yIHRoZSBzYW1lIHJhbmsgYXMgYW55IHBvc3NpYmxlKi9cbi8qICogbWF0Y2hpbmcgc3BlY2ltZW4uIFRoZSByaWdodCBlbGVtZW50IG11c3QgYmUgYWZ0ZXIgb3IgdGhlIHNhbWUqL1xuLyogKiByYW5rIGFzIGFueSBwb3NzaWJsZSBtYXRjaGluZyBzcGVjaW1lbi4qL1xuLyogKlgvKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA+00/Dsu7AADLuwAANAAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanN7ImltcG9ydHMiOlsiLi4va2V5cy9jaGVja0tleS5qcyIsIi4uL2tleXMvY29tcGFyZUtleXMuanMiLCJAYWdvcmljL2Fzc2VydCIsIkBhZ29yaWMvaW50ZXJuYWwiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vbWFyc2hhbC9zcmMvZW5jb2RlUGFzc2FibGUuanMiLCJAZW5kby9tYXJzaGFsL3NyYy9yYW5rT3JkZXIuanMiXSwiZXhwb3J0cyI6WyJNIiwiTWluTWV0aG9kR3VhcmQiLCJhc3NlcnRQYXR0ZXJuIiwiY2hlY2tNYXRjaGVzIiwiZGVmYXVsdExpbWl0cyIsImdldFJhbmtDb3ZlciIsImlzUGF0dGVybiIsIm1hdGNoZXMiLCJtdXN0TWF0Y2giXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgYXNzZXJ0Q2hlY2tlcixGYXIsZ2V0VGFnLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsaGFzT3duUHJvcGVydHlPZixuYW1lRm9yUGFzc2FibGVTeW1ib2wsaWRlbnRDaGVja2VyLGFwcGx5TGFiZWxpbmdFcnJvcixmcm9tVW5pcXVlRW50cmllcyxsaXN0RGlmZmVyZW5jZSxjb21wYXJlUmFuayxnZXRQYXNzU3R5bGVDb3ZlcixpbnRlcnNlY3RSYW5rQ292ZXJzLHVuaW9uUmFua0NvdmVycyxyZWNvcmROYW1lcyxyZWNvcmRWYWx1ZXMsa2V5RVEsa2V5R1Qsa2V5R1RFLGtleUxULGtleUxURSxhc3NlcnRLZXksY2hlY2tLZXksaXNLZXksY2hlY2tTY2FsYXJLZXksY2hlY2tDb3B5U2V0LGNoZWNrQ29weU1hcCxjb3B5TWFwS2V5U2V0LGNoZWNrQ29weUJhZzskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV0sW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy9hc3NlcnRcIiwgW1tcImlkZW50Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoaWRlbnRDaGVja2VyID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvaW50ZXJuYWxcIiwgW1tcImFwcGx5TGFiZWxpbmdFcnJvclwiLCBbJGjigI1fYSA9PiAoYXBwbHlMYWJlbGluZ0Vycm9yID0gJGjigI1fYSldXSxbXCJmcm9tVW5pcXVlRW50cmllc1wiLCBbJGjigI1fYSA9PiAoZnJvbVVuaXF1ZUVudHJpZXMgPSAkaOKAjV9hKV1dLFtcImxpc3REaWZmZXJlbmNlXCIsIFskaOKAjV9hID0+IChsaXN0RGlmZmVyZW5jZSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsL3NyYy9yYW5rT3JkZXIuanNcIiwgW1tcImNvbXBhcmVSYW5rXCIsIFskaOKAjV9hID0+IChjb21wYXJlUmFuayA9ICRo4oCNX2EpXV0sW1wiZ2V0UGFzc1N0eWxlQ292ZXJcIiwgWyRo4oCNX2EgPT4gKGdldFBhc3NTdHlsZUNvdmVyID0gJGjigI1fYSldXSxbXCJpbnRlcnNlY3RSYW5rQ292ZXJzXCIsIFskaOKAjV9hID0+IChpbnRlcnNlY3RSYW5rQ292ZXJzID0gJGjigI1fYSldXSxbXCJ1bmlvblJhbmtDb3ZlcnNcIiwgWyRo4oCNX2EgPT4gKHVuaW9uUmFua0NvdmVycyA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9tYXJzaGFsL3NyYy9lbmNvZGVQYXNzYWJsZS5qc1wiLCBbW1wicmVjb3JkTmFtZXNcIiwgWyRo4oCNX2EgPT4gKHJlY29yZE5hbWVzID0gJGjigI1fYSldXSxbXCJyZWNvcmRWYWx1ZXNcIiwgWyRo4oCNX2EgPT4gKHJlY29yZFZhbHVlcyA9ICRo4oCNX2EpXV1dXSxbXCIuLi9rZXlzL2NvbXBhcmVLZXlzLmpzXCIsIFtbXCJrZXlFUVwiLCBbJGjigI1fYSA9PiAoa2V5RVEgPSAkaOKAjV9hKV1dLFtcImtleUdUXCIsIFskaOKAjV9hID0+IChrZXlHVCA9ICRo4oCNX2EpXV0sW1wia2V5R1RFXCIsIFskaOKAjV9hID0+IChrZXlHVEUgPSAkaOKAjV9hKV1dLFtcImtleUxUXCIsIFskaOKAjV9hID0+IChrZXlMVCA9ICRo4oCNX2EpXV0sW1wia2V5TFRFXCIsIFskaOKAjV9hID0+IChrZXlMVEUgPSAkaOKAjV9hKV1dXV0sW1wiLi4va2V5cy9jaGVja0tleS5qc1wiLCBbW1wiYXNzZXJ0S2V5XCIsIFskaOKAjV9hID0+IChhc3NlcnRLZXkgPSAkaOKAjV9hKV1dLFtcImNoZWNrS2V5XCIsIFskaOKAjV9hID0+IChjaGVja0tleSA9ICRo4oCNX2EpXV0sW1wiaXNLZXlcIiwgWyRo4oCNX2EgPT4gKGlzS2V5ID0gJGjigI1fYSldXSxbXCJjaGVja1NjYWxhcktleVwiLCBbJGjigI1fYSA9PiAoY2hlY2tTY2FsYXJLZXkgPSAkaOKAjV9hKV1dLFtcImNoZWNrQ29weVNldFwiLCBbJGjigI1fYSA9PiAoY2hlY2tDb3B5U2V0ID0gJGjigI1fYSldXSxbXCJjaGVja0NvcHlNYXBcIiwgWyRo4oCNX2EgPT4gKGNoZWNrQ29weU1hcCA9ICRo4oCNX2EpXV0sW1wiY29weU1hcEtleVNldFwiLCBbJGjigI1fYSA9PiAoY29weU1hcEtleVNldCA9ICRo4oCNX2EpXV0sW1wiY2hlY2tDb3B5QmFnXCIsIFskaOKAjV9hID0+IChjaGVja0NvcHlCYWcgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuY29uc3R7cXVvdGU6cSxkZXRhaWxzOlgsRmFpbH09YXNzZXJ0O1xuY29uc3R7ZW50cmllcyx2YWx1ZXN9PU9iamVjdDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5cbi8qKiBAdHlwZSBXZWFrU2V0PFBhdHRlcm4+ICovXG5jb25zdCBwYXR0ZXJuTWVtbz1uZXcgV2Vha1NldCgpO1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBNYXRjaCBIZWxwZXJzIEhlbHBlcnMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogRm9yIGZvcndhcmQgcmVmZXJlbmNlcyB0byBgTWAgKi9cbmxldCBNTTtcblxuLyoqXG4gKiBUaGUgYWN0dWFsIGRlZmF1bHQgdmFsdWVzIGhlcmUgYXJlLCBhdCB0aGUgcHJlc2VudCB0aW1lLCBmYWlybHlcbiAqIGFyYml0cmFyeSBjaG9pY2VzIGFuZCBtYXkgY2hhbmdlIGJlZm9yZSB0aGV5IHNldHRsZSBkb3duLiBPZiBjb3Vyc2VcbiAqIGF0IHNvbWUgcG9pbnQgd2UnbGwgbmVlZCB0byBzdG9wIGNoYW5naW5nIHRoZW0uIEJ1dCB3ZSBzaG91bGQgZmlyc3RcbiAqIHNlZSBob3cgb3VyIHN5c3RlbSBob2xkcyB1cCB3aXRoIHRoZXNlIGNob2ljZXMuIFRoZSBtYWluIGNyaXRlcmlhXG4gKiBpcyB0aGF0IHRoZXkgYmUgYmlnIGVub3VnaCB0aGF0IFwibm9ybWFsXCIgaW5ub2NlbnQgcHJvZ3JhbXMgcmFyZWx5XG4gKiBlbmNvdW50ZXIgdGhlc2UgbGltaXRzLlxuICpcbiAqIEV4cG9ydGVkIHByaW1hcmlseSBmb3IgdGVzdGluZy5cbiAqL1xuY29uc3QgICAgICAgIGRlZmF1bHRMaW1pdHM9aGFyZGVuKHtcbmRlY2ltYWxEaWdpdHNMaW1pdDoxMDAsXG5zdHJpbmdMZW5ndGhMaW1pdDoxMDBfMDAwLFxuc3ltYm9sTmFtZUxlbmd0aExpbWl0OjEwMCxcbm51bVByb3BlcnRpZXNMaW1pdDo4MCxcbnByb3BlcnR5TmFtZUxlbmd0aExpbWl0OjEwMCxcbmFycmF5TGVuZ3RoTGltaXQ6MTBfMDAwLFxubnVtU2V0RWxlbWVudHNMaW1pdDoxMF8wMDAsXG5udW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0OjEwXzAwMCxcbm51bU1hcEVudHJpZXNMaW1pdDo1MDAwfSk7XG5cblxuLyoqXG4gKiBVc2UgdGhlIHJlc3VsdCBvbmx5IHRvIGdldCB0aGUgbGltaXRzIHlvdSBuZWVkIGJ5IGRlc3RydWN0dXJpbmcuXG4gKiBUaHVzLCB0aGUgcmVzdWx0IG9ubHkgbmVlZHMgdG8gc3VwcG9ydCBkZXN0cnVjdHVyaW5nLiBUaGUgY3VycmVudFxuICogaW1wbGVtZW50YXRpb24gdXNlcyBpbmhlcml0YW5jZSBhcyBhIGNoZWFwIGhhY2suXG4gKlxuICogQHBhcmFtIHtMaW1pdHN9IFtsaW1pdHNdXG4gKiBAcmV0dXJucyB7QWxsTGltaXRzfVxuICovJGjigI1fb25jZS5kZWZhdWx0TGltaXRzKGRlZmF1bHRMaW1pdHMpO1xuY29uc3QgbGltaXQ9KGxpbWl0cz17fSk9PlxuLyoqIEB0eXBlIHtBbGxMaW1pdHN9ICovaGFyZGVuKHtfX3Byb3RvX186ZGVmYXVsdExpbWl0cywuLi5saW1pdHN9KTtcblxuY29uc3QgY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQ9KFxucGF5bG9hZCxcbm1haW5QYXlsb2FkU2hhcGUsXG5jaGVjayxcbmxhYmVsKT0+XG57XG5hc3NlcnQoQXJyYXkuaXNBcnJheShtYWluUGF5bG9hZFNoYXBlKSk7XG5pZighQXJyYXkuaXNBcnJheShwYXlsb2FkKSl7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgJHtxKGxhYmVsKX0gcGF5bG9hZCBtdXN0IGJlIGFuIGFycmF5OiAke3BheWxvYWR9YCk7XG4gfVxuXG4vKiBXYXMgdGhlIGZvbGxvd2luZywgYnV0IGl0cyBvdmVydXNlIG9mIHBhdHRlcm5zIGNhdXNlZCBhbiBpbmZpbml0ZSByZWdyZXNzKi9cbi8qIGNvbnN0IHBheWxvYWRMaW1pdFNoYXBlID0gaGFyZGVuKCovXG4vKiBNLnNwbGl0KCovXG4vKiBtYWluUGF5bG9hZFNoYXBlLCovXG4vKiBNLnBhcnRpYWwoaGFyZGVuKFtNLnJlY29yZE9mKE0uc3RyaW5nKCksIE0ubnVtYmVyKCkpXSksIGhhcmRlbihbXSkpLCovXG4vKiApLCovXG4vKiApOyovXG4vKiByZXR1cm4gY2hlY2tNYXRjaGVzKHBheWxvYWQsIHBheWxvYWRMaW1pdFNoYXBlLCBjaGVjaywgbGFiZWwpOyovXG5cbmNvbnN0IG1haW5MZW5ndGg9bWFpblBheWxvYWRTaGFwZS5sZW5ndGg7XG5pZighKHBheWxvYWQubGVuZ3RoPT09bWFpbkxlbmd0aHx8cGF5bG9hZC5sZW5ndGg9PT1tYWluTGVuZ3RoKzEpKXtcbnJldHVybiBjaGVjayhmYWxzZSxYIGAke3EobGFiZWwpfSBwYXlsb2FkIHVuZXhwZWN0ZWQgc2l6ZTogJHtwYXlsb2FkfWApO1xuIH1cbmNvbnN0IGxpbWl0cz1wYXlsb2FkW21haW5MZW5ndGhdO1xucGF5bG9hZD1oYXJkZW4ocGF5bG9hZC5zbGljZSgwLG1haW5MZW5ndGgpKTtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5pZighY2hlY2tNYXRjaGVzKHBheWxvYWQsbWFpblBheWxvYWRTaGFwZSxjaGVjayxsYWJlbCkpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmlmKGxpbWl0cz09PXVuZGVmaW5lZCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4oXG4ocGFzc1N0eWxlT2YobGltaXRzKT09PSdjb3B5UmVjb3JkJ3x8XG5jaGVjayhmYWxzZSxYIGBMaW1pdHMgbXVzdCBiZSBhIHJlY29yZDogJHtxKGxpbWl0cyl9YCkpJiZcbmVudHJpZXMobGltaXRzKS5ldmVyeShcbihba2V5LHZhbHVlXSk9PlxucGFzc1N0eWxlT2YodmFsdWUpPT09J251bWJlcid8fFxuY2hlY2soZmFsc2UsWCBgVmFsdWUgb2YgbGltaXQgJHtxKGtleSl9IGJ1dCBiZSBhIG51bWJlcjogJHtxKHZhbHVlKX1gKSkpO1xuXG5cbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7dW5rbm93bn0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7bnVtYmVyfSBkZWNpbWFsRGlnaXRzTGltaXRcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqL1xuY29uc3QgY2hlY2tEZWNpbWFsRGlnaXRzTGltaXQ9KHNwZWNpbWVuLGRlY2ltYWxEaWdpdHNMaW1pdCxjaGVjayk9PntcbmlmKFxuTWF0aC5mbG9vcihNYXRoLmxvZzEwKE1hdGguYWJzKE51bWJlcihzcGVjaW1lbikpKSkrMTw9XG5kZWNpbWFsRGlnaXRzTGltaXQpXG57XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYGJpZ2ludCAke3NwZWNpbWVufSBtdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiAke2RlY2ltYWxEaWdpdHNMaW1pdH0gZGlnaXRzYCk7XG5cbiB9O1xuXG4vKipcbiAqIEByZXR1cm5zIHtQYXR0ZXJuS2l0fVxuICovXG5jb25zdCBtYWtlUGF0dGVybktpdD0oKT0+e1xuLyoqXG4gKiBJZiB0aGlzIGlzIGEgcmVjb2duaXplZCBtYXRjaCB0YWcsIHJldHVybiB0aGUgTWF0Y2hIZWxwZXIuXG4gKiBPdGhlcndpc2UgcmVzdWx0IHVuZGVmaW5lZC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcmV0dXJucyB7TWF0Y2hIZWxwZXIgfCB1bmRlZmluZWR9XG4gKi9cbmNvbnN0IG1heWJlTWF0Y2hIZWxwZXI9KHRhZyk9PlxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbkhlbHBlcnNCeU1hdGNoVGFnW3RhZ107XG5cbi8qKlxuICogQHR5cGVkZWYge3N0cmluZ30gS2luZFxuICogSXQgaXMgZWl0aGVyIGEgUGFzc1N0eWxlIG90aGVyIHRoYW4gJ3RhZ2dlZCcsIG9yLCBpZiB0aGUgdW5kZXJseWluZ1xuICogUGFzc1N0eWxlIGlzICd0YWdnZWQnLCB0aGVuIHRoZSBgZ2V0VGFnYCB2YWx1ZSBmb3IgdGFncyB0aGF0IGFyZVxuICogcmVjb2duaXplZCBhdCB0aGUgc3RvcmUgbGV2ZWwgb2YgYWJzdHJhY3Rpb24uIEZvciBlYWNoIG9mIHRob3NlXG4gKiB0YWdzLCBhIHRhZ2dlZCByZWNvcmQgb25seSBoYXMgdGhhdCBraW5kIGlmIGl0IHNhdGlzZmllcyB0aGUgaW52YXJpYW50c1xuICogdGhhdCB0aGUgc3RvcmUgbGV2ZWwgYXNzb2NpYXRlcyB3aXRoIHRoYXQga2luZC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlIHtXZWFrTWFwPENvcHlUYWdnZWQsIEtpbmQ+fVxuICogT25seSBmb3IgdGFnZ2VkIHJlY29yZHMgb2YgcmVjb2duaXplZCBraW5kcyB3aG9zZSBzdG9yZS1sZXZlbCBpbnZhcmlhbnRzXG4gKiBoYXZlIGFscmVhZHkgYmVlbiBjaGVja2VkLlxuICovXG5jb25zdCB0YWdNZW1vPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQ2hlY2tzIG9ubHkgcmVjb2duaXplZCB0YWdzLCBhbmQgb25seSBpZiB0aGUgdGFnZ2VkXG4gKiBwYXNzZXMgdGhlIGludmFyaWFudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgcmVjb2duaXRpb24uXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdGFnZ2VkXG4gKiBAcGFyYW0ge0tpbmR9IHRhZ1xuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrVGFnZ2VkPSh0YWdnZWQsdGFnLGNoZWNrKT0+e1xuY29uc3QgbWF0Y2hIZWxwZXI9bWF5YmVNYXRjaEhlbHBlcih0YWcpO1xuaWYobWF0Y2hIZWxwZXIpe1xuLyogQnVyaWVkIGhlcmUgaXMgdGhlIGltcG9ydGFudCBjYXNlLCB3aGVyZSB3ZSBwcm9jZXNzKi9cbi8qIHRoZSB2YXJpb3VzIHBhdHRlcm5Ob2RlcyovXG5yZXR1cm4gbWF0Y2hIZWxwZXIuY2hlY2tJc1dlbGxGb3JtZWQodGFnZ2VkLnBheWxvYWQsY2hlY2spO1xuIH1cbnN3aXRjaCh0YWcpe1xuY2FzZSdjb3B5U2V0Jzp7XG5yZXR1cm4gY2hlY2tDb3B5U2V0KHRhZ2dlZCxjaGVjayk7XG4gfVxuY2FzZSdjb3B5QmFnJzp7XG5yZXR1cm4gY2hlY2tDb3B5QmFnKHRhZ2dlZCxjaGVjayk7XG4gfVxuY2FzZSdjb3B5TWFwJzp7XG5yZXR1cm4gY2hlY2tDb3B5TWFwKHRhZ2dlZCxjaGVjayk7XG4gfVxuZGVmYXVsdDp7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYGNhbm5vdCBjaGVjayB1bnJlY29nbml6ZWQgdGFnICR7cSh0YWcpfTogJHt0YWdnZWR9YCk7XG5cbiB9fVxuXG4gfTtcblxuLyoqXG4gKiBSZXR1cm5zIG9ubHkgYSByZWNvZ25pemVkIGtpbmQsIGFuZCBvbmx5IGlmIHRoZSBzcGVjaW1lbiBwYXNzZXMgdGhlXG4gKiBpbnZhcmlhbnRzIGFzc29jaWF0ZWQgd2l0aCB0aGF0IHJlY29nbml0aW9uLlxuICogT3RoZXJ3aXNlLCBgY2hlY2soZmFsc2UsIC4uLilgIGFuZCByZXR1cm5zIHVuZGVmaW5lZFxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtLaW5kIHwgdW5kZWZpbmVkfVxuICovXG5jb25zdCBraW5kT2Y9KHNwZWNpbWVuLGNoZWNrPWlkZW50Q2hlY2tlcik9PntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihzcGVjaW1lbik7XG5pZihwYXNzU3R5bGUhPT0ndGFnZ2VkJyl7XG5yZXR1cm4gcGFzc1N0eWxlO1xuIH1cbi8qIEF0IHRoaXMgcG9pbnQgd2Uga25vdyB0aGF0IHNwZWNpbWVuIGlzIGEgd2VsbCBmb3JtZWQqL1xuLyogYXMgYSB0YWdnZWQgcmVjb3JkLCB3aGljaCBpcyBkZWZpbmVkIGF0IHRoZSBtYXJzaGFsIGxldmVsIG9mIGFic3RyYWN0aW9uLCovXG4vKiBzaW5jZSBgcGFzc1N0eWxlT2ZgIGNoZWNrcyB0aG9zZSBpbnZhcmlhbnRzLiovXG5pZih0YWdNZW1vLmhhcyhzcGVjaW1lbikpe1xucmV0dXJuIHRhZ01lbW8uZ2V0KHNwZWNpbWVuKTtcbiB9XG5jb25zdCB0YWc9Z2V0VGFnKHNwZWNpbWVuKTtcbmlmKGNoZWNrVGFnZ2VkKHNwZWNpbWVuLHRhZyxjaGVjaykpe1xudGFnTWVtby5zZXQoc3BlY2ltZW4sdGFnKTtcbnJldHVybiB0YWc7XG4gfVxuaWYoY2hlY2shPT1pZGVudENoZWNrZXIpe1xuY2hlY2soZmFsc2UsWCBgY2Fubm90IGNoZWNrIHVucmVjb2duaXplZCB0YWcgJHtxKHRhZyl9YCk7XG4gfVxucmV0dXJuIHVuZGVmaW5lZDtcbiB9O1xuaGFyZGVuKGtpbmRPZik7XG5cbi8qKlxuICogQ2hlY2tzIG9ubHkgcmVjb2duaXplZCBraW5kcywgYW5kIG9ubHkgaWYgdGhlIHNwZWNpbWVuXG4gKiBwYXNzZXMgdGhlIGludmFyaWFudHMgYXNzb2NpYXRlZCB3aXRoIHRoYXQgcmVjb2duaXRpb24uXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7S2luZH0ga2luZFxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrS2luZD0oc3BlY2ltZW4sa2luZCxjaGVjayk9PntcbmNvbnN0IHJlYWxLaW5kPWtpbmRPZihzcGVjaW1lbixjaGVjayk7XG5pZihraW5kPT09cmVhbEtpbmQpe1xucmV0dXJuIHRydWU7XG4gfVxuaWYoY2hlY2shPT1pZGVudENoZWNrZXIpe1xuLyogcXVvdGluZyB3aXRob3V0IHF1b3RlcyovXG5jb25zdCBkZXRhaWxzPVgoWyBgJHtyZWFsS2luZH0gYCxgIC0gTXVzdCBiZSBhICR7a2luZH1gXSxzcGVjaW1lbik7XG5jaGVjayhmYWxzZSxkZXRhaWxzKTtcbiB9XG5yZXR1cm4gZmFsc2U7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzcGVjaW1lblxuICogQHBhcmFtIHtLZXl9IGtleUFzUGF0dGVyblxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrQXNLZXlQYXR0PShzcGVjaW1lbixrZXlBc1BhdHRlcm4sY2hlY2spPT57XG5pZihrZXlFUShzcGVjaW1lbixrZXlBc1BhdHRlcm4pKXtcbnJldHVybiB0cnVlO1xuIH1cbnJldHVybihcbmNoZWNrIT09aWRlbnRDaGVja2VyJiZcbmNoZWNrKGZhbHNlLFggYCR7c3BlY2ltZW59IC0gTXVzdCBiZTogJHtrZXlBc1BhdHRlcm59YCkpO1xuXG4gfTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gaXNQYXR0ZXJuIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEB0eXBlIHtDaGVja1BhdHRlcm59ICovXG5jb25zdCBjaGVja1BhdHRlcm49KHBhdHQsY2hlY2spPT57XG5pZihpc0tleShwYXR0KSl7XG4vKiBBbGwga2V5cyBhcmUgcGF0dGVybnMuIEZvciB0aGVzZSwgdGhlIGtleU1lbW8gd2lsbCBkby4qL1xuLyogQWxsIHByaW1pdGl2ZXMgdGhhdCBhcmUgcGF0dGVybnMgYXJlIGFsc28ga2V5cywgd2hpY2ggdGhpcyovXG4vKiBhbHNvIHRha2VzIGNhcmUgb2Ygd2l0aG91dCBtZW1vLiBUaGUgcmVzdCBvZiBvdXIgY2hlY2tpbmcgbG9naWMqL1xuLyogaXMgb25seSBjb25jZXJuZWQgd2l0aCBub24ta2V5IHBhdHRlcm5zLiovXG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihwYXR0ZXJuTWVtby5oYXMocGF0dCkpe1xucmV0dXJuIHRydWU7XG4gfVxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmNvbnN0IHJlc3VsdD1jaGVja1BhdHRlcm5JbnRlcm5hbChwYXR0LGNoZWNrKTtcbmlmKHJlc3VsdCl7XG5wYXR0ZXJuTWVtby5hZGQocGF0dCk7XG4gfVxucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhdHQgLSBrbm93biBub3QgdG8gYmUgYSBrZXksIGFuZCB0aGVyZWZvcmUga25vd25cbiAqIG5vdCB0byBiZSBwcmltaXRpdmUuXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tQYXR0ZXJuSW50ZXJuYWw9KHBhdHQsY2hlY2spPT57XG4vKiBQdXJwb3NlbHkgcGFyYWxsZWxzIGNoZWNrS2V5LiBUT0RPIHJldXNlIG1vcmUgbG9naWMgYmV0d2VlbiB0aGVtLiovXG4vKiBNb3N0IG9mIHRoZSB0ZXh0IG9mIHRoZSBzd2l0Y2ggYmVsb3cgbm90IGRlYWxpbmcgd2l0aCBtYXRjaGVycyBpcyovXG4vKiBlc3NlbnRpYWxseSBpZGVudGljYWwuKi9cbmNvbnN0IGNoZWNrSXQ9KGNoaWxkKT0+Y2hlY2tQYXR0ZXJuKGNoaWxkLGNoZWNrKTtcblxuY29uc3Qga2luZD1raW5kT2YocGF0dCxjaGVjayk7XG5zd2l0Y2goa2luZCl7XG5jYXNlIHVuZGVmaW5lZDp7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG4vKiBBIGNvcHlSZWNvcmQgaXMgYSBwYXR0ZXJuIGlmZiBhbGwgaXRzIGNoaWxkcmVuIGFyZSovXG4vKiBwYXR0ZXJucyovXG5yZXR1cm4gdmFsdWVzKHBhdHQpLmV2ZXJ5KGNoZWNrSXQpO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG4vKiBBIGNvcHlBcnJheSBpcyBhIHBhdHRlcm4gaWZmIGFsbCBpdHMgY2hpbGRyZW4gYXJlKi9cbi8qIHBhdHRlcm5zKi9cbnJldHVybiBwYXR0LmV2ZXJ5KGNoZWNrSXQpO1xuIH1cbmNhc2UnY29weU1hcCc6e1xuLyogQSBjb3B5TWFwJ3Mga2V5cyBhcmUga2V5cyBhbmQgdGhlcmVmb3JlIGFscmVhZHkga25vd24gdG8gYmUqL1xuLyogcGF0dGVybnMuKi9cbi8qIEEgY29weU1hcCBpcyBhIHBhdHRlcm4gaWYgaXRzIHZhbHVlcyBhcmUgcGF0dGVybnMuKi9cbnJldHVybiBjaGVja1BhdHRlcm4ocGF0dC52YWx1ZXMsY2hlY2spO1xuIH1cbmNhc2UnZXJyb3InOlxuY2FzZSdwcm9taXNlJzp7XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgQSAke3Eoa2luZCl9IGNhbm5vdCBiZSBhIHBhdHRlcm5gKTtcbiB9XG5kZWZhdWx0OntcbmlmKG1heWJlTWF0Y2hIZWxwZXIoa2luZCkhPT11bmRlZmluZWQpe1xucmV0dXJuIHRydWU7XG4gfVxucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBBIHBhc3NhYmxlIG9mIGtpbmQgJHtxKGtpbmQpfSBpcyBub3QgYSBwYXR0ZXJuOiAke3BhdHR9YCk7XG5cbiB9fVxuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBwYXR0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgaXNQYXR0ZXJuPShwYXR0KT0+Y2hlY2tQYXR0ZXJuKHBhdHQsaWRlbnRDaGVja2VyKTtcblxuLyoqXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRcbiAqL1xuY29uc3QgYXNzZXJ0UGF0dGVybj0ocGF0dCk9PntcbmNoZWNrUGF0dGVybihwYXR0LGFzc2VydENoZWNrZXIpO1xuIH07XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIG1hdGNoZXMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gc3BlY2ltZW5cbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dGVyblxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfSBbbGFiZWxdXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgY2hlY2tNYXRjaGVzPShzcGVjaW1lbixwYXR0ZXJuLGNoZWNrLGxhYmVsPXVuZGVmaW5lZCk9PlxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmFwcGx5TGFiZWxpbmdFcnJvcihjaGVja01hdGNoZXNJbnRlcm5hbCxbc3BlY2ltZW4scGF0dGVybixjaGVja10sbGFiZWwpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHNwZWNpbWVuXG4gKiBAcGFyYW0ge1BhdHRlcm59IHBhdHRcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja01hdGNoZXNJbnRlcm5hbD0oc3BlY2ltZW4scGF0dCxjaGVjayk9Pntcbi8qIFdvcnRoIGJlaW5nIGEgYml0IHZlcmJvc2UgYW5kIHJlcGV0aXRpdmUgaW4gb3JkZXIgdG8gb3B0aW1pemUqL1xuY29uc3QgcGF0dGVybktpbmQ9a2luZE9mKHBhdHQsY2hlY2spO1xuY29uc3Qgc3BlY2ltZW5LaW5kPWtpbmRPZihzcGVjaW1lbik7LyogbWF5IGJlIHVuZGVmaW5lZCovXG5zd2l0Y2gocGF0dGVybktpbmQpe1xuY2FzZSB1bmRlZmluZWQ6e1xucmV0dXJuIEZhaWwgYHBhdHRlcm4gZXhwZWN0ZWQ6ICR7cGF0dH1gO1xuIH1cbmNhc2UncHJvbWlzZSc6e1xucmV0dXJuIEZhaWwgYHByb21pc2VzIGNhbm5vdCBiZSBwYXR0ZXJuczogJHtwYXR0fWA7XG4gfVxuY2FzZSdlcnJvcic6e1xucmV0dXJuIEZhaWwgYGVycm9ycyBjYW5ub3QgYmUgcGF0dGVybnM6ICR7cGF0dH1gO1xuIH1cbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnbnVsbCc6XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdudW1iZXInOlxuY2FzZSdiaWdpbnQnOlxuY2FzZSdzdHJpbmcnOlxuY2FzZSdzeW1ib2wnOlxuY2FzZSdjb3B5U2V0JzpcbmNhc2UnY29weUJhZyc6XG5jYXNlJ3JlbW90YWJsZSc6e1xuLyogVGhlc2Uga2luZHMgYXJlIG5lY2Vzc2FyaWx5IGtleXMqL1xucmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLHBhdHQsY2hlY2spO1xuIH1cbmNhc2UnY29weUFycmF5Jzp7XG5pZihpc0tleShwYXR0KSl7XG4vKiBUYWtlcyBjYXJlIG9mIHBhdHRlcm5zIHdoaWNoIGFyZSBrZXlzLCBzbyB0aGUgcmVzdCBvZiB0aGlzKi9cbi8qIGxvZ2ljIGNhbiBhc3N1bWUgcGF0dGVybnMgdGhhdCBhcmUgbm90IGtleXMuKi9cbnJldHVybiBjaGVja0FzS2V5UGF0dChzcGVjaW1lbixwYXR0LGNoZWNrKTtcbiB9XG5pZihzcGVjaW1lbktpbmQhPT0nY29weUFycmF5Jyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBhIGNvcHlBcnJheSB0byBtYXRjaCBhIGNvcHlBcnJheSBwYXR0ZXJuOiAke3BhdHR9YCk7XG5cbiB9XG5jb25zdHtsZW5ndGh9PXBhdHQ7XG5pZihzcGVjaW1lbi5sZW5ndGghPT1sZW5ndGgpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBBcnJheSAke3NwZWNpbWVufSAtIE11c3QgYmUgYXMgbG9uZyBhcyBjb3B5QXJyYXkgcGF0dGVybjogJHtwYXR0fWApO1xuXG4gfVxucmV0dXJuIHBhdHQuZXZlcnkoKHAsaSk9PmNoZWNrTWF0Y2hlcyhzcGVjaW1lbltpXSxwLGNoZWNrLGkpKTtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbmlmKGlzS2V5KHBhdHQpKXtcbi8qIFRha2VzIGNhcmUgb2YgcGF0dGVybnMgd2hpY2ggYXJlIGtleXMsIHNvIHRoZSByZXN0IG9mIHRoaXMqL1xuLyogbG9naWMgY2FuIGFzc3VtZSBwYXR0ZXJucyB0aGF0IGFyZSBub3Qga2V5cy4qL1xucmV0dXJuIGNoZWNrQXNLZXlQYXR0KHNwZWNpbWVuLHBhdHQsY2hlY2spO1xuIH1cbmlmKHNwZWNpbWVuS2luZCE9PSdjb3B5UmVjb3JkJyl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSBhIGNvcHlSZWNvcmQgdG8gbWF0Y2ggYSBjb3B5UmVjb3JkIHBhdHRlcm46ICR7cGF0dH1gKTtcblxuIH1cbi8qIFRPRE8gRGV0ZWN0IGFuZCBhY2N1bXVsYXRlIGRpZmZlcmVuY2UgaW4gb25lIHBhc3MuKi9cbi8qIFJhdGhlciB0aGFuIHVzaW5nIHR3byBjYWxscyB0byBgbGlzdERpZmZlcmVuY2VgIHRvIGRldGVjdCBhbmQqL1xuLyogcmVwb3J0IGlmIGFuZCBob3cgdGhlc2UgbGlzdHMgZGlmZmVyLCBzaW5jZSB0aGV5IGFyZSBhbHJlYWR5Ki9cbi8qIGluIHNvcnRlZCBvcmRlciwgd2Ugc2hvdWxkIGluc3RlYWQgdXNlIGFuIGFsZ29yaXRobSBsaWtlKi9cbi8qIGBpdGVyRGlzam9pbnRVbmlvbmAgZnJvbSBtZXJnZS1zb3J0LW9wZXJhdG9ycy5qcyovXG5jb25zdCBzcGVjaW1lbk5hbWVzPXJlY29yZE5hbWVzKHNwZWNpbWVuKTtcbmNvbnN0IHBhdHROYW1lcz1yZWNvcmROYW1lcyhwYXR0KTtcbmNvbnN0IG1pc3Npbmc9bGlzdERpZmZlcmVuY2UocGF0dE5hbWVzLHNwZWNpbWVuTmFtZXMpO1xuaWYobWlzc2luZy5sZW5ndGg+PTEpe1xucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGAke3NwZWNpbWVufSAtIE11c3QgaGF2ZSBtaXNzaW5nIHByb3BlcnRpZXMgJHtxKG1pc3NpbmcpfWApO1xuXG4gfVxuY29uc3QgdW5leHBlY3RlZD1saXN0RGlmZmVyZW5jZShzcGVjaW1lbk5hbWVzLHBhdHROYW1lcyk7XG5pZih1bmV4cGVjdGVkLmxlbmd0aD49MSl7XG5yZXR1cm4gY2hlY2soXG5mYWxzZSxcblggYCR7c3BlY2ltZW59IC0gTXVzdCBub3QgaGF2ZSB1bmV4cGVjdGVkIHByb3BlcnRpZXM6ICR7cShcbnVuZXhwZWN0ZWQpXG4gfWApO1xuXG4gfVxuY29uc3Qgc3BlY2ltZW5WYWx1ZXM9cmVjb3JkVmFsdWVzKHNwZWNpbWVuLHNwZWNpbWVuTmFtZXMpO1xuY29uc3QgcGF0dFZhbHVlcz1yZWNvcmRWYWx1ZXMocGF0dCxwYXR0TmFtZXMpO1xucmV0dXJuIHBhdHROYW1lcy5ldmVyeSgobGFiZWwsaSk9PlxuY2hlY2tNYXRjaGVzKHNwZWNpbWVuVmFsdWVzW2ldLHBhdHRWYWx1ZXNbaV0sY2hlY2ssbGFiZWwpKTtcblxuIH1cbmNhc2UnY29weU1hcCc6e1xuaWYoaXNLZXkocGF0dCkpe1xuLyogVGFrZXMgY2FyZSBvZiBwYXR0ZXJucyB3aGljaCBhcmUga2V5cywgc28gdGhlIHJlc3Qgb2YgdGhpcyovXG4vKiBsb2dpYyBjYW4gYXNzdW1lIHBhdHRlcm5zIHRoYXQgYXJlIG5vdCBrZXlzLiovXG5yZXR1cm4gY2hlY2tBc0tleVBhdHQoc3BlY2ltZW4scGF0dCxjaGVjayk7XG4gfVxuaWYoc3BlY2ltZW5LaW5kIT09J2NvcHlNYXAnKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIGEgY29weU1hcCB0byBtYXRjaCBhIGNvcHlNYXAgcGF0dGVybjogJHtwYXR0fWApO1xuXG4gfVxuY29uc3R7cGF5bG9hZDpwYXR0UGF5bG9hZH09cGF0dDtcbmNvbnN0e3BheWxvYWQ6c3BlY2ltZW5QYXlsb2FkfT1zcGVjaW1lbjtcbmNvbnN0IHBhdHRLZXlTZXQ9Y29weU1hcEtleVNldChwYXR0UGF5bG9hZCk7XG5jb25zdCBzcGVjaW1lbktleVNldD1jb3B5TWFwS2V5U2V0KHNwZWNpbWVuUGF5bG9hZCk7XG4vKiBDb21wYXJlIGtleXMgYXMgY29weVNldHMqL1xuaWYoIWNoZWNrTWF0Y2hlcyhzcGVjaW1lbktleVNldCxwYXR0S2V5U2V0LGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuY29uc3QgcGF0dFZhbHVlcz1wYXR0UGF5bG9hZC52YWx1ZXM7XG5jb25zdCBzcGVjaW1lblZhbHVlcz1zcGVjaW1lblBheWxvYWQudmFsdWVzO1xuLyogY29tcGFyZSB2YWx1ZXMgYXMgY29weUFycmF5cyovXG5yZXR1cm4gY2hlY2tNYXRjaGVzKHNwZWNpbWVuVmFsdWVzLHBhdHRWYWx1ZXMsY2hlY2spO1xuIH1cbmRlZmF1bHQ6e1xuY29uc3QgbWF0Y2hIZWxwZXI9bWF5YmVNYXRjaEhlbHBlcihwYXR0ZXJuS2luZCk7XG5pZihtYXRjaEhlbHBlcil7XG5yZXR1cm4gbWF0Y2hIZWxwZXIuY2hlY2tNYXRjaGVzKHNwZWNpbWVuLHBhdHQucGF5bG9hZCxjaGVjayk7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IHNob3VsZCBoYXZlIHJlY29nbml6ZWQgJHtxKHBhdHRlcm5LaW5kKX0gYDtcbiB9fVxuXG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJufSBwYXR0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgbWF0Y2hlcz0oc3BlY2ltZW4scGF0dCk9PlxuY2hlY2tNYXRjaGVzKHNwZWNpbWVuLHBhdHQsaWRlbnRDaGVja2VyKTtcblxuLyoqXG4gKiBSZXR1cm5pbmcgbm9ybWFsbHkgaW5kaWNhdGVzIHN1Y2Nlc3MuIE1hdGNoIGZhaWx1cmUgaXMgaW5kaWNhdGVkIGJ5XG4gKiB0aHJvd2luZy5cbiAqXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJufSBwYXR0XG4gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ9IFtsYWJlbF1cbiAqL1xuY29uc3QgbXVzdE1hdGNoPShzcGVjaW1lbixwYXR0LGxhYmVsPXVuZGVmaW5lZCk9PntcbmlmKGNoZWNrTWF0Y2hlcyhzcGVjaW1lbixwYXR0LGlkZW50Q2hlY2tlcixsYWJlbCkpe1xucmV0dXJuO1xuIH1cbi8qIHNob3VsZCBvbmx5IHRocm93Ki9cbmNoZWNrTWF0Y2hlcyhzcGVjaW1lbixwYXR0LGFzc2VydENoZWNrZXIsbGFiZWwpO1xuRmFpbCBgaW50ZXJuYWw6ICR7bGFiZWx9OiBpbmNvbnNpc3RlbnQgcGF0dGVybiBtYXRjaDogJHtxKHBhdHQpfWA7XG4gfTtcblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gZ2V0UmFua0NvdmVyIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEB0eXBlIHtHZXRSYW5rQ292ZXJ9ICovXG5jb25zdCBnZXRSYW5rQ292ZXI9KHBhdHQsZW5jb2RlUGFzc2FibGUpPT57XG5pZihpc0tleShwYXR0KSl7XG5jb25zdCBlbmNvZGVkPWVuY29kZVBhc3NhYmxlKHBhdHQpO1xuaWYoZW5jb2RlZCE9PXVuZGVmaW5lZCl7XG5yZXR1cm5bZW5jb2RlZCwgYCR7ZW5jb2RlZH1+YF07XG4gfVxuIH1cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihwYXR0KTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdjb3B5QXJyYXknOntcbi8qIFhYWCB0aGlzIGRvZXNuJ3QgZ2V0IGFsb25nIHdpdGggdGhlIHdvcmxkIG9mIGNvdmVyID09PSBwYWlyIG9mKi9cbi8qIHN0cmluZ3MuIEluIHRoZSBtZWFudGltZSwgZmFsbCB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IHdoaWNoKi9cbi8qIHJldHVybnMgYSBjb3ZlciB0aGF0IGNvdmVycyBhbGwgY29weUFycmF5cy4qL1xuLyoqL1xuLyogY29uc3QgcmFua0NvdmVycyA9IHBhdHQubWFwKHAgPT4gZ2V0UmFua0NvdmVyKHAsIGVuY29kZVBhc3NhYmxlKSk7Ki9cbi8qIHJldHVybiBoYXJkZW4oWyovXG4vKiByYW5rQ292ZXJzLm1hcCgoW2xlZnQsIF9yaWdodF0pID0+IGxlZnQpLCovXG4vKiByYW5rQ292ZXJzLm1hcCgoW19sZWZ0LCByaWdodF0pID0+IHJpZ2h0KSwqL1xuLyogXSk7Ki9cbmJyZWFrO1xuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuLyogWFhYIHRoaXMgZG9lc24ndCBnZXQgYWxvbmcgd2l0aCB0aGUgd29ybGQgb2YgY292ZXIgPT09IHBhaXIgb2YqL1xuLyogc3RyaW5ncy4gSW4gdGhlIG1lYW50aW1lLCBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgd2hpY2gqL1xuLyogcmV0dXJucyBhIGNvdmVyIHRoYXQgY292ZXJzIGFsbCBjb3B5UmVjb3Jkcy4qL1xuLyoqL1xuLyogY29uc3QgcGF0dEtleXMgPSBvd25LZXlzKHBhdHQpOyovXG4vKiBjb25zdCBwYXR0RW50cmllcyA9IGhhcmRlbihwYXR0S2V5cy5tYXAoa2V5ID0+IFtrZXksIHBhdHRba2V5XV0pKTsqL1xuLyogY29uc3QgW2xlZnRFbnRyaWVzTGltaXQsIHJpZ2h0RW50cmllc0xpbWl0XSA9Ki9cbi8qIGdldFJhbmtDb3ZlcihwYXR0RW50cmllcyk7Ki9cbi8qIHJldHVybiBoYXJkZW4oWyovXG4vKiBmcm9tVW5pcXVlRW50cmllcyhsZWZ0RW50cmllc0xpbWl0KSwqL1xuLyogZnJvbVVuaXF1ZUVudHJpZXMocmlnaHRFbnRyaWVzTGltaXQpLCovXG4vKiBdKTsqL1xuYnJlYWs7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0IHRhZz1nZXRUYWcocGF0dCk7XG5jb25zdCBtYXRjaEhlbHBlcj1tYXliZU1hdGNoSGVscGVyKHRhZyk7XG5pZihtYXRjaEhlbHBlcil7XG4vKiBCdXJpZWQgaGVyZSBpcyB0aGUgaW1wb3J0YW50IGNhc2UsIHdoZXJlIHdlIHByb2Nlc3MqL1xuLyogdGhlIHZhcmlvdXMgcGF0dGVybk5vZGVzKi9cbnJldHVybiBtYXRjaEhlbHBlci5nZXRSYW5rQ292ZXIocGF0dC5wYXlsb2FkLGVuY29kZVBhc3NhYmxlKTtcbiB9XG5zd2l0Y2godGFnKXtcbmNhc2UnY29weVNldCc6e1xuLyogWFhYIHRoaXMgZG9lc24ndCBnZXQgYWxvbmcgd2l0aCB0aGUgd29ybGQgb2YgY292ZXIgPT09IHBhaXIgb2YqL1xuLyogc3RyaW5ncy4gSW4gdGhlIG1lYW50aW1lLCBmYWxsIHRocm91Z2ggdG8gdGhlIGRlZmF1bHQgd2hpY2gqL1xuLyogcmV0dXJucyBhIGNvdmVyIHRoYXQgY292ZXJzIGFsbCBjb3B5U2V0cy4qL1xuLyoqL1xuLyogLy8gU2hvdWxkIGFscmVhZHkgYmUgdmFsaWRhdGVkIGJ5IGNoZWNrUGF0dGVybi4gQnV0IGJlY2F1c2UgdGhpcyovXG4vKiAvLyBpcyBhIGNoZWNrIHRoYXQgbWF5IGxvb3NlbiBvdmVyIHRpbWUsIHdlIGFsc28gYXNzZXJ0Ki9cbi8qIC8vIGV2ZXJ5d2hlcmUgd2Ugc3RpbGwgcmVseSBvbiB0aGUgcmVzdHJpY3Rpb24uKi9cbi8qIGBgYGpzKi9cbi8qIHBhdHQucGF5bG9hZC5sZW5ndGggPT09IDEgfHwqL1xuLyogRmFpbGBOb24tc2luZ2xldG9uIGNvcHlTZXRzIHdpdGggbWF0Y2hlciBub3QgeWV0IGltcGxlbWVudGVkOiAke3BhdHR9YDsqL1xuLyogYGBgKi9cbi8qKi9cbi8qIGNvbnN0IFtsZWZ0RWxlbWVudExpbWl0LCByaWdodEVsZW1lbnRMaW1pdF0gPSBnZXRSYW5rQ292ZXIoKi9cbi8qIHBhdHQucGF5bG9hZFswXSwqL1xuLyogKTsqL1xuLyogcmV0dXJuIGhhcmRlbihbKi9cbi8qIG1ha2VDb3B5U2V0KFtsZWZ0RWxlbWVudExpbWl0XSksKi9cbi8qIG1ha2VDb3B5U2V0KFtyaWdodEVsZW1lbnRMaW1pdF0pLCovXG4vKiBdKTsqL1xuYnJlYWs7XG4gfVxuY2FzZSdjb3B5TWFwJzp7XG4vKiBYWFggdGhpcyBkb2Vzbid0IGdldCBhbG9uZyB3aXRoIHRoZSB3b3JsZCBvZiBjb3ZlciA9PT0gcGFpciBvZiovXG4vKiBzdHJpbmdzLiBJbiB0aGUgbWVhbnRpbWUsIGZhbGwgdGhyb3VnaCB0byB0aGUgZGVmYXVsdCB3aGljaCovXG4vKiByZXR1cm5zIGEgY292ZXIgdGhhdCBjb3ZlcnMgYWxsIGNvcHlNYXBzLiovXG4vKiovXG4vKiAvLyBBIG1hdGNoaW5nIGNvcHlNYXAgbXVzdCBoYXZlIHRoZSBzYW1lIGtleXMsIG9yIGF0IG1vc3Qgb25lKi9cbi8qIC8vIG5vbi1rZXkga2V5IHBhdHRlcm4uIFRodXMgd2UgY2FuIGFzc3VtZSB0aGF0IHZhbHVlIHBvc2l0aW9ucyovXG4vKiAvLyBtYXRjaCAxLXRvLTEuKi9cbi8qIC8vKi9cbi8qIC8vIFRPRE8gSSBtYXkgYmUgb3Zlcmxvb2tpbmcgdGhhdCB0aGUgbGVzcyBwcmVjaXNlIHJhbmtPcmRlciovXG4vKiAvLyBlcXVpdmFsZW5jZSBjbGFzcyBtYXkgY2F1c2UgdmFsdWVzIHRvIGJlIG91dCBvZiBvcmRlciwqL1xuLyogLy8gbWFraW5nIHRoaXMgcmFua0NvdmVyIG5vdCBhY3R1YWxseSBjb3Zlci4gSW4gdGhhdCBjYXNlLCBmb3IqL1xuLyogLy8gYWxsIHRoZSB2YWx1ZXMgZm9yIGtleXMgYXQgdGhlIHNhbWUgcmFuaywgd2Ugc2hvdWxkIHVuaW9uIHRoZWlyKi9cbi8qIC8vIHJhbmsgY292ZXJzLiBUT0RPIFBPU1NJQkxFIFNJTEVOVCBDT1JSRUNUTkVTUyBCVUcqL1xuLyogLy8qL1xuLyogLy8gSWYgdGhpcyBpcyBhIGJ1ZywgaXQgcHJvYmFibHkgYWZmZWN0cyB0aGUgZ2V0UmFua0NvdmVyKi9cbi8qIC8vIGNhc2VzIG9mIG1hdGNoTFRFSGVscGVyIGFuZCBtYXRjaEdURUhlbHBlciBvbiBjb3B5TWFwIGFzKi9cbi8qIC8vIHdlbGwuIFNlZSBtYWtlQ29weU1hcCBmb3IgYW4gaWRlYSBvbiBmaXhpbmcqL1xuLyogLy8gdGhpcyBidWcuKi9cbi8qIGNvbnN0IFtsZWZ0UGF5bG9hZExpbWl0LCByaWdodFBheWxvYWRMaW1pdF0gPSBnZXRSYW5rQ292ZXIoKi9cbi8qIHBhdHQucGF5bG9hZCwqL1xuLyogZW5jb2RlUGFzc2FibGUsKi9cbi8qICk7Ki9cbi8qIHJldHVybiBoYXJkZW4oWyovXG4vKiBtYWtlVGFnZ2VkKCdjb3B5TWFwJywgbGVmdFBheWxvYWRMaW1pdCksKi9cbi8qIG1ha2VUYWdnZWQoJ2NvcHlNYXAnLCByaWdodFBheWxvYWRMaW1pdCksKi9cbi8qIF0pOyovXG5icmVhaztcbiB9XG5kZWZhdWx0OntcbmJyZWFrOy8qIGZhbGwgdGhyb3VnaCB0byBkZWZhdWx0Ki9cbiB9fVxuXG5icmVhazsvKiBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdCovXG4gfVxuZGVmYXVsdDp7XG5icmVhazsvKiBmYWxsIHRocm91Z2ggdG8gZGVmYXVsdCovXG4gfX1cblxucmV0dXJuIGdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZSk7XG4gfTtcblxuY29uc3QgYXJyYXlFdmVyeU1hdGNoUGF0dGVybj0oYXJyYXkscGF0dCxjaGVjayxsYWJlbFByZWZpeD0nJyk9PntcbmlmKGNoZWNrS2luZChwYXR0LCdtYXRjaDphbnknLGlkZW50Q2hlY2tlcikpe1xuLyogaWYgdGhlIHBhdHRlcm4gaXMgTS5hbnkoKSwgd2Uga25vdyBpdHMgdHJ1ZSovXG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4gYXJyYXkuZXZlcnkoKGVsLGkpPT5cbmNoZWNrTWF0Y2hlcyhlbCxwYXR0LGNoZWNrLCBgJHtsYWJlbFByZWZpeH1bJHtpfV1gKSk7XG5cbiB9O1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBNYXRjaCBIZWxwZXJzIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hBbnlIZWxwZXI9RmFyKCdtYXRjaDphbnkgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KF9zcGVjaW1lbixfbWF0Y2hlclBheWxvYWQsX2NoZWNrKT0+dHJ1ZSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KG1hdGNoZXJQYXlsb2FkLGNoZWNrKT0+XG5tYXRjaGVyUGF5bG9hZD09PXVuZGVmaW5lZHx8XG5jaGVjayhmYWxzZSxYIGBtYXRjaDphbnkgcGF5bG9hZDogJHttYXRjaGVyUGF5bG9hZH0gLSBNdXN0IGJlIHVuZGVmaW5lZGApLFxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+WycnLCd7J119KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hBbmRIZWxwZXI9RmFyKCdtYXRjaDphbmQgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHBhdHRzLGNoZWNrKT0+e1xucmV0dXJuIHBhdHRzLmV2ZXJ5KChwYXR0KT0+Y2hlY2tNYXRjaGVzKHNwZWNpbWVuLHBhdHQsY2hlY2spKTtcbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDooYWxsZWdlZFBhdHRzLGNoZWNrKT0+e1xuY29uc3QgY2hlY2tJdD0ocGF0dCk9PmNoZWNrUGF0dGVybihwYXR0LGNoZWNrKTtcbnJldHVybihcbihwYXNzU3R5bGVPZihhbGxlZ2VkUGF0dHMpPT09J2NvcHlBcnJheSd8fFxuY2hlY2soZmFsc2UsWCBgTmVlZHMgYXJyYXkgb2Ygc3ViLXBhdHRlcm5zOiAke2FsbGVnZWRQYXR0c31gKSkmJlxuYWxsZWdlZFBhdHRzLmV2ZXJ5KGNoZWNrSXQpKTtcblxuIH0sXG5cbmdldFJhbmtDb3ZlcjoocGF0dHMsZW5jb2RlUGFzc2FibGUpPT5cbmludGVyc2VjdFJhbmtDb3ZlcnMoXG5jb21wYXJlUmFuayxcbnBhdHRzLm1hcCgocCk9PmdldFJhbmtDb3ZlcihwLGVuY29kZVBhc3NhYmxlKSkpfSk7XG5cblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hPckhlbHBlcj1GYXIoJ21hdGNoOm9yIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixwYXR0cyxjaGVjayk9PntcbmNvbnN0e2xlbmd0aH09cGF0dHM7XG5pZihsZW5ndGg9PT0wKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBubyBwYXR0ZXJuIGRpc2p1bmN0cyB0byBtYXRjaDogJHtwYXR0c31gKTtcblxuIH1cbmlmKFxucGF0dHMubGVuZ3RoPT09MiYmXG4hbWF0Y2hlcyhzcGVjaW1lbixwYXR0c1swXSkmJlxuY2hlY2tLaW5kKHBhdHRzWzBdLCdtYXRjaDpraW5kJyxpZGVudENoZWNrZXIpJiZcbnBhdHRzWzBdLnBheWxvYWQ9PT0ndW5kZWZpbmVkJylcbntcbi8qIFdvcnRoIHNwZWNpYWwgY2FzaW5nIHRoZSBvcHRpb25hbCBwYXR0ZXJuIGZvciovXG4vKiBiZXR0ZXIgZXJyb3IgbWVzc2FnZXMuKi9cbnJldHVybiBjaGVja01hdGNoZXMoc3BlY2ltZW4scGF0dHNbMV0sY2hlY2spO1xuIH1cbmlmKHBhdHRzLnNvbWUoKHBhdHQpPT5tYXRjaGVzKHNwZWNpbWVuLHBhdHQpKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5yZXR1cm4gY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IG1hdGNoIG9uZSBvZiAke3BhdHRzfWApO1xuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOm1hdGNoQW5kSGVscGVyLmNoZWNrSXNXZWxsRm9ybWVkLFxuXG5nZXRSYW5rQ292ZXI6KHBhdHRzLGVuY29kZVBhc3NhYmxlKT0+XG51bmlvblJhbmtDb3ZlcnMoXG5jb21wYXJlUmFuayxcbnBhdHRzLm1hcCgocCk9PmdldFJhbmtDb3ZlcihwLGVuY29kZVBhc3NhYmxlKSkpfSk7XG5cblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hOb3RIZWxwZXI9RmFyKCdtYXRjaDpub3QgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHBhdHQsY2hlY2spPT57XG5pZihtYXRjaGVzKHNwZWNpbWVuLHBhdHQpKXtcbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGZhaWwgbmVnYXRlZCBwYXR0ZXJuOiAke3BhdHR9YCk7XG5cbiB9ZWxzZXtcbnJldHVybiB0cnVlO1xuIH1cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDpjaGVja1BhdHRlcm4sXG5cbmdldFJhbmtDb3ZlcjooX3BhdHQsX2VuY29kZVBhc3NhYmxlKT0+WycnLCd7J119KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hTY2FsYXJIZWxwZXI9RmFyKCdtYXRjaDpzY2FsYXIgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLF9tYXRjaGVyUGF5bG9hZCxjaGVjayk9PlxuY2hlY2tTY2FsYXJLZXkoc3BlY2ltZW4sY2hlY2spLFxuXG5jaGVja0lzV2VsbEZvcm1lZDptYXRjaEFueUhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlsnYScsJ3p+J119KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hLZXlIZWxwZXI9RmFyKCdtYXRjaDprZXkgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLF9tYXRjaGVyUGF5bG9hZCxjaGVjayk9PlxuY2hlY2tLZXkoc3BlY2ltZW4sY2hlY2spLFxuXG5jaGVja0lzV2VsbEZvcm1lZDptYXRjaEFueUhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlsnYScsJ3p+J119KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hQYXR0ZXJuSGVscGVyPUZhcignbWF0Y2g6cGF0dGVybiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sX21hdGNoZXJQYXlsb2FkLGNoZWNrKT0+XG5jaGVja1BhdHRlcm4oc3BlY2ltZW4sY2hlY2spLFxuXG5jaGVja0lzV2VsbEZvcm1lZDptYXRjaEFueUhlbHBlci5jaGVja0lzV2VsbEZvcm1lZCxcblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlsnYScsJ3p+J119KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hLaW5kSGVscGVyPUZhcignbWF0Y2g6a2luZCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczpjaGVja0tpbmQsXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihhbGxlZ2VkS2V5S2luZCxjaGVjayk9PlxudHlwZW9mIGFsbGVnZWRLZXlLaW5kPT09J3N0cmluZyd8fFxuY2hlY2soXG5mYWxzZSxcblggYG1hdGNoOmtpbmQ6IHBheWxvYWQ6ICR7YWxsZWdlZEtleUtpbmR9IC0gQSBraW5kIG5hbWUgbXVzdCBiZSBhIHN0cmluZ2ApLFxuXG5cbmdldFJhbmtDb3Zlcjooa2luZCxfZW5jb2RlUGFzc2FibGUpPT57XG5sZXQgc3R5bGU7XG5zd2l0Y2goa2luZCl7XG5jYXNlJ2NvcHlTZXQnOlxuY2FzZSdjb3B5TWFwJzp7XG5zdHlsZT0ndGFnZ2VkJztcbmJyZWFrO1xuIH1cbmRlZmF1bHQ6e1xuc3R5bGU9a2luZDtcbmJyZWFrO1xuIH19XG5cbnJldHVybiBnZXRQYXNzU3R5bGVDb3ZlcihzdHlsZSk7XG4gfX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEJpZ2ludEhlbHBlcj1GYXIoJ21hdGNoOmJpZ2ludCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sW2xpbWl0cz11bmRlZmluZWRdLGNoZWNrKT0+e1xuY29uc3R7ZGVjaW1hbERpZ2l0c0xpbWl0fT1saW1pdChsaW1pdHMpO1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdiaWdpbnQnLGNoZWNrKSYmXG5jaGVja0RlY2ltYWxEaWdpdHNMaW1pdChzcGVjaW1lbixkZWNpbWFsRGlnaXRzTGltaXQsY2hlY2spKTtcblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW10pLFxuY2hlY2ssXG4nbWF0Y2g6YmlnaW50IHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+XG5nZXRQYXNzU3R5bGVDb3ZlcignYmlnaW50Jyl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hOYXRIZWxwZXI9RmFyKCdtYXRjaDpuYXQgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLFtsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e2RlY2ltYWxEaWdpdHNMaW1pdH09bGltaXQobGltaXRzKTtcbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnYmlnaW50JyxjaGVjaykmJlxuY2hlY2soXG4vKiogQHR5cGUge2JpZ2ludH0gKi9zcGVjaW1lbj49MG4sXG5YIGAke3NwZWNpbWVufSAtIE11c3QgYmUgbm9uLW5lZ2F0aXZlYCkmJlxuXG5jaGVja0RlY2ltYWxEaWdpdHNMaW1pdChzcGVjaW1lbixkZWNpbWFsRGlnaXRzTGltaXQsY2hlY2spKTtcblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW10pLFxuY2hlY2ssXG4nbWF0Y2g6bmF0IHBheWxvYWQnKSxcblxuXG5nZXRSYW5rQ292ZXI6KF9tYXRjaFBheWxvYWQsX2VuY29kZVBhc3NhYmxlKT0+XG4vKiBUT0RPIENvdWxkIGJlIG1vcmUgcHJlY2lzZSovXG5nZXRQYXNzU3R5bGVDb3ZlcignYmlnaW50Jyl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hTdHJpbmdIZWxwZXI9RmFyKCdtYXRjaDpzdHJpbmcgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLFtsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e3N0cmluZ0xlbmd0aExpbWl0fT1saW1pdChsaW1pdHMpO1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdzdHJpbmcnLGNoZWNrKSYmKFxuc3BlY2ltZW4ubGVuZ3RoPD1zdHJpbmdMZW5ndGhMaW1pdHx8XG5jaGVjayhcbmZhbHNlLFxuWCBgc3RyaW5nICR7c3BlY2ltZW59IG11c3Qgbm90IGJlIGJpZ2dlciB0aGFuICR7c3RyaW5nTGVuZ3RoTGltaXR9YCkpKTtcblxuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbXSksXG5jaGVjayxcbidtYXRjaDpzdHJpbmcgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX21hdGNoUGF5bG9hZCxfZW5jb2RlUGFzc2FibGUpPT5cbmdldFBhc3NTdHlsZUNvdmVyKCdzdHJpbmcnKX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFN5bWJvbEhlbHBlcj1GYXIoJ21hdGNoOnN5bWJvbCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sW2xpbWl0cz11bmRlZmluZWRdLGNoZWNrKT0+e1xuY29uc3R7c3ltYm9sTmFtZUxlbmd0aExpbWl0fT1saW1pdChsaW1pdHMpO1xuaWYoIWNoZWNrS2luZChzcGVjaW1lbiwnc3ltYm9sJyxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmNvbnN0IHN5bWJvbE5hbWU9bmFtZUZvclBhc3NhYmxlU3ltYm9sKHNwZWNpbWVuKTtcblxuaWYodHlwZW9mIHN5bWJvbE5hbWUhPT0nc3RyaW5nJyl7XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogUGFzc2FibGUgc3ltYm9sICR7c3BlY2ltZW59IG11c3QgaGF2ZSBhIHBhc3NhYmxlIG5hbWVgO1xuIH1cbnJldHVybiBjaGVjayhcbnN5bWJvbE5hbWUubGVuZ3RoPD1zeW1ib2xOYW1lTGVuZ3RoTGltaXQsXG5YIGBTeW1ib2wgbmFtZSAke3EoXG5zeW1ib2xOYW1lKVxuIH0gbXVzdCBub3QgYmUgYmlnZ2VyIHRoYW4gJHtzeW1ib2xOYW1lTGVuZ3RoTGltaXR9YCk7XG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtdKSxcbmNoZWNrLFxuJ21hdGNoOnN5bWJvbCBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOihfbWF0Y2hQYXlsb2FkLF9lbmNvZGVQYXNzYWJsZSk9PlxuZ2V0UGFzc1N0eWxlQ292ZXIoJ3N5bWJvbCcpfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoUmVtb3RhYmxlSGVscGVyPUZhcignbWF0Y2g6cmVtb3RhYmxlIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixyZW1vdGFibGVEZXNjLGNoZWNrKT0+e1xuLyogVW5mb3J0dW5hdGUgZHVwbGljYXRpb24gb2YgY2hlY2tLaW5kIGxvZ2ljLCBidXQgbm8gYmV0dGVyIGNob2ljZXMuKi9cbmlmKGNoZWNrS2luZChzcGVjaW1lbiwncmVtb3RhYmxlJyxpZGVudENoZWNrZXIpKXtcbnJldHVybiB0cnVlO1xuIH1cbmlmKGNoZWNrPT09aWRlbnRDaGVja2VyKXtcbnJldHVybiBmYWxzZTtcbiB9XG5sZXQgc3BlY2ltZW5LaW5kPXBhc3NTdHlsZU9mKHNwZWNpbWVuKTtcbmlmKHNwZWNpbWVuS2luZD09PSd0YWdnZWQnKXtcbnNwZWNpbWVuS2luZD1nZXRUYWcoc3BlY2ltZW4pO1xuIH1cbmNvbnN0e2xhYmVsfT1yZW1vdGFibGVEZXNjO1xuXG4vKiBxdW90aW5nIHdpdGhvdXQgcXVvdGVzKi9cbmNvbnN0IGRldGFpbHM9WChcblsgYCR7c3BlY2ltZW5LaW5kfSBgLGAgLSBNdXN0IGJlIGEgcmVtb3RhYmxlICgke2xhYmVsfSlgXSxcbnNwZWNpbWVuKTtcblxucmV0dXJuIGNoZWNrKGZhbHNlLGRldGFpbHMpO1xuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihhbGxlZ2VkUmVtb3RhYmxlRGVzYyxjaGVjayk9PlxuY2hlY2tNYXRjaGVzKFxuYWxsZWdlZFJlbW90YWJsZURlc2MsXG5oYXJkZW4oe2xhYmVsOk1NLnN0cmluZygpfSksXG5jaGVjayxcbidtYXRjaDpyZW1vdGFibGUgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX3JlbW90YWJsZURlc2MsX2VuY29kZVBhc3NhYmxlKT0+XG5nZXRQYXNzU3R5bGVDb3ZlcigncmVtb3RhYmxlJyl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hMVEVIZWxwZXI9RmFyKCdtYXRjaDpsdGUgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCxjaGVjayk9Plxua2V5TFRFKHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCl8fFxuY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIDw9ICR7cmlnaHRPcGVyYW5kfWApLFxuXG5jaGVja0lzV2VsbEZvcm1lZDpjaGVja0tleSxcblxuZ2V0UmFua0NvdmVyOihyaWdodE9wZXJhbmQsZW5jb2RlUGFzc2FibGUpPT57XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocmlnaHRPcGVyYW5kKTtcbi8qIFRoZSBwcmVmZXItY29uc3QgbWFrZXMgbm8gc2Vuc2Ugd2hlbiBzb21lIG9mIHRoZSB2YXJpYWJsZXMgbmVlZCovXG4vKiB0byBiZSBgbGV0YCovXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0Ki9cbmxldFtsZWZ0Qm91bmQscmlnaHRCb3VuZF09Z2V0UGFzc1N0eWxlQ292ZXIocGFzc1N0eWxlKTtcbmNvbnN0IG5ld1JpZ2h0Qm91bmQ9IGAke2VuY29kZVBhc3NhYmxlKHJpZ2h0T3BlcmFuZCl9fmA7XG5pZihuZXdSaWdodEJvdW5kIT09dW5kZWZpbmVkKXtcbnJpZ2h0Qm91bmQ9bmV3UmlnaHRCb3VuZDtcbiB9XG5yZXR1cm5bbGVmdEJvdW5kLHJpZ2h0Qm91bmRdO1xuIH19KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hMVEhlbHBlcj1GYXIoJ21hdGNoOmx0IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixyaWdodE9wZXJhbmQsY2hlY2spPT5cbmtleUxUKHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCl8fFxuY2hlY2soZmFsc2UsWCBgJHtzcGVjaW1lbn0gLSBNdXN0IGJlIDwgJHtyaWdodE9wZXJhbmR9YCksXG5cbmNoZWNrSXNXZWxsRm9ybWVkOmNoZWNrS2V5LFxuXG5nZXRSYW5rQ292ZXI6bWF0Y2hMVEVIZWxwZXIuZ2V0UmFua0NvdmVyfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoR1RFSGVscGVyPUZhcignbWF0Y2g6Z3RlIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixyaWdodE9wZXJhbmQsY2hlY2spPT5cbmtleUdURShzcGVjaW1lbixyaWdodE9wZXJhbmQpfHxcbmNoZWNrKGZhbHNlLFggYCR7c3BlY2ltZW59IC0gTXVzdCBiZSA+PSAke3JpZ2h0T3BlcmFuZH1gKSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6Y2hlY2tLZXksXG5cbmdldFJhbmtDb3ZlcjoocmlnaHRPcGVyYW5kLGVuY29kZVBhc3NhYmxlKT0+e1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHJpZ2h0T3BlcmFuZCk7XG4vKiBUaGUgcHJlZmVyLWNvbnN0IG1ha2VzIG5vIHNlbnNlIHdoZW4gc29tZSBvZiB0aGUgdmFyaWFibGVzIG5lZWQqL1xuLyogdG8gYmUgYGxldGAqL1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHByZWZlci1jb25zdCovXG5sZXRbbGVmdEJvdW5kLHJpZ2h0Qm91bmRdPWdldFBhc3NTdHlsZUNvdmVyKHBhc3NTdHlsZSk7XG5jb25zdCBuZXdMZWZ0Qm91bmQ9ZW5jb2RlUGFzc2FibGUocmlnaHRPcGVyYW5kKTtcbmlmKG5ld0xlZnRCb3VuZCE9PXVuZGVmaW5lZCl7XG5sZWZ0Qm91bmQ9bmV3TGVmdEJvdW5kO1xuIH1cbnJldHVybltsZWZ0Qm91bmQscmlnaHRCb3VuZF07XG4gfX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEdUSGVscGVyPUZhcignbWF0Y2g6Z3QgaGVscGVyJyx7XG5jaGVja01hdGNoZXM6KHNwZWNpbWVuLHJpZ2h0T3BlcmFuZCxjaGVjayk9Plxua2V5R1Qoc3BlY2ltZW4scmlnaHRPcGVyYW5kKXx8XG5jaGVjayhmYWxzZSxYIGAke3NwZWNpbWVufSAtIE11c3QgYmUgPiAke3JpZ2h0T3BlcmFuZH1gKSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6Y2hlY2tLZXksXG5cbmdldFJhbmtDb3ZlcjptYXRjaEdURUhlbHBlci5nZXRSYW5rQ292ZXJ9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hSZWNvcmRPZkhlbHBlcj1GYXIoJ21hdGNoOnJlY29yZE9mIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihcbnNwZWNpbWVuLFxuW2tleVBhdHQsdmFsdWVQYXR0LGxpbWl0cz11bmRlZmluZWRdLFxuY2hlY2spPT5cbntcbmNvbnN0e251bVByb3BlcnRpZXNMaW1pdCxwcm9wZXJ0eU5hbWVMZW5ndGhMaW1pdH09bGltaXQobGltaXRzKTtcbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnY29weVJlY29yZCcsY2hlY2spJiZcbmNoZWNrKFxub3duS2V5cyhzcGVjaW1lbikubGVuZ3RoPD1udW1Qcm9wZXJ0aWVzTGltaXQsXG5YIGBNdXN0IG5vdCBoYXZlIG1vcmUgdGhhbiAke3EoXG5udW1Qcm9wZXJ0aWVzTGltaXQpXG4gfSBwcm9wZXJ0aWVzOiAke3NwZWNpbWVufWApJiZcblxuZW50cmllcyhzcGVjaW1lbikuZXZlcnkoXG4oW2tleSx2YWx1ZV0pPT5cbmFwcGx5TGFiZWxpbmdFcnJvcihcbmNoZWNrLFxuW1xua2V5Lmxlbmd0aDw9cHJvcGVydHlOYW1lTGVuZ3RoTGltaXQsXG5YIGBQcm9wZXJ0eSBuYW1lIG11c3Qgbm90IGJlIGxvbmdlciB0aGFuICR7cShcbnByb3BlcnR5TmFtZUxlbmd0aExpbWl0KVxuIH1gXSxcblxua2V5KSYmXG5cbmNoZWNrTWF0Y2hlcyhcbmhhcmRlbihba2V5LHZhbHVlXSksXG5oYXJkZW4oW2tleVBhdHQsdmFsdWVQYXR0XSksXG5jaGVjayxcbmtleSkpKTtcblxuXG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtNTS5wYXR0ZXJuKCksTU0ucGF0dGVybigpXSksXG5jaGVjayxcbidtYXRjaDpyZWNvcmRPZiBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOihfZW50cnlQYXR0KT0+Z2V0UGFzc1N0eWxlQ292ZXIoJ2NvcHlSZWNvcmQnKX0pO1xuXG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaEFycmF5T2ZIZWxwZXI9RmFyKCdtYXRjaDphcnJheU9mIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihzcGVjaW1lbixbc3ViUGF0dCxsaW1pdHM9dW5kZWZpbmVkXSxjaGVjayk9PntcbmNvbnN0e2FycmF5TGVuZ3RoTGltaXR9PWxpbWl0KGxpbWl0cyk7XG5yZXR1cm4oXG5jaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlBcnJheScsY2hlY2spJiYoXG5zcGVjaW1lbi5sZW5ndGg8PWFycmF5TGVuZ3RoTGltaXR8fFxuY2hlY2soXG5mYWxzZSxcblggYEFycmF5IGxlbmd0aCAke3NwZWNpbWVuLmxlbmd0aH0gbXVzdCBiZSA8PSBsaW1pdCAke2FycmF5TGVuZ3RoTGltaXR9YCkpJiZcblxuYXJyYXlFdmVyeU1hdGNoUGF0dGVybihzcGVjaW1lbixzdWJQYXR0LGNoZWNrKSk7XG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtNTS5wYXR0ZXJuKCldKSxcbmNoZWNrLFxuJ21hdGNoOmFycmF5T2YgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooKT0+Z2V0UGFzc1N0eWxlQ292ZXIoJ2NvcHlBcnJheScpfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoU2V0T2ZIZWxwZXI9RmFyKCdtYXRjaDpzZXRPZiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooc3BlY2ltZW4sW2tleVBhdHQsbGltaXRzPXVuZGVmaW5lZF0sY2hlY2spPT57XG5jb25zdHtudW1TZXRFbGVtZW50c0xpbWl0fT1saW1pdChsaW1pdHMpO1xucmV0dXJuKFxuY2hlY2tLaW5kKHNwZWNpbWVuLCdjb3B5U2V0JyxjaGVjaykmJlxuY2hlY2soXG4vKiogQHR5cGUge0FycmF5fSAqL3NwZWNpbWVuLnBheWxvYWQubGVuZ3RoPG51bVNldEVsZW1lbnRzTGltaXQsXG5YIGBTZXQgbXVzdCBub3QgaGF2ZSBtb3JlIHRoYW4gJHtxKG51bVNldEVsZW1lbnRzTGltaXQpfSBlbGVtZW50czogJHtcbnNwZWNpbWVuLnBheWxvYWQubGVuZ3RoXG4gfWApJiZcblxuYXJyYXlFdmVyeU1hdGNoUGF0dGVybihzcGVjaW1lbi5wYXlsb2FkLGtleVBhdHQsY2hlY2ssJ3NldCBlbGVtZW50cycpKTtcblxuIH0sXG5cbmNoZWNrSXNXZWxsRm9ybWVkOihwYXlsb2FkLGNoZWNrKT0+XG5jaGVja0lzV2VsbEZvcm1lZFdpdGhMaW1pdChcbnBheWxvYWQsXG5oYXJkZW4oW01NLnBhdHRlcm4oKV0pLFxuY2hlY2ssXG4nbWF0Y2g6c2V0T2YgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooKT0+Z2V0UGFzc1N0eWxlQ292ZXIoJ3RhZ2dlZCcpfSk7XG5cblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoQmFnT2ZIZWxwZXI9RmFyKCdtYXRjaDpiYWdPZiBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooXG5zcGVjaW1lbixcbltrZXlQYXR0LGNvdW50UGF0dCxsaW1pdHM9dW5kZWZpbmVkXSxcbmNoZWNrKT0+XG57XG5jb25zdHtudW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0LGRlY2ltYWxEaWdpdHNMaW1pdH09bGltaXQobGltaXRzKTtcbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnY29weUJhZycsY2hlY2spJiZcbmNoZWNrKFxuLyoqIEB0eXBlIHtBcnJheX0gKi9zcGVjaW1lbi5wYXlsb2FkLmxlbmd0aDw9XG5udW1VbmlxdWVCYWdFbGVtZW50c0xpbWl0LFxuWCBgQmFnIG11c3Qgbm90IGhhdmUgbW9yZSB0aGFuICR7cShcbm51bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXQpXG4gfSB1bmlxdWUgZWxlbWVudHM6ICR7c3BlY2ltZW59YCkmJlxuXG5zcGVjaW1lbi5wYXlsb2FkLmV2ZXJ5KFxuKFtrZXksY291bnRdLGkpPT5cbmNoZWNrTWF0Y2hlcyhrZXksa2V5UGF0dCxjaGVjaywgYGJhZyBrZXlzWyR7aX1dYCkmJlxuYXBwbHlMYWJlbGluZ0Vycm9yKFxuY2hlY2tEZWNpbWFsRGlnaXRzTGltaXQsXG5bY291bnQsZGVjaW1hbERpZ2l0c0xpbWl0LGNoZWNrXSxcbiBgYmFnIGNvdW50c1ske2l9XWApJiZcblxuY2hlY2tNYXRjaGVzKGNvdW50LGNvdW50UGF0dCxjaGVjaywgYGJhZyBjb3VudHNbJHtpfV1gKSkpO1xuXG5cbiB9LFxuXG5jaGVja0lzV2VsbEZvcm1lZDoocGF5bG9hZCxjaGVjayk9PlxuY2hlY2tJc1dlbGxGb3JtZWRXaXRoTGltaXQoXG5wYXlsb2FkLFxuaGFyZGVuKFtNTS5wYXR0ZXJuKCksTU0ucGF0dGVybigpXSksXG5jaGVjayxcbidtYXRjaDpiYWdPZiBwYXlsb2FkJyksXG5cblxuZ2V0UmFua0NvdmVyOigpPT5nZXRQYXNzU3R5bGVDb3ZlcigndGFnZ2VkJyl9KTtcblxuXG4vKiogQHR5cGUge01hdGNoSGVscGVyfSAqL1xuY29uc3QgbWF0Y2hNYXBPZkhlbHBlcj1GYXIoJ21hdGNoOm1hcE9mIGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihcbnNwZWNpbWVuLFxuW2tleVBhdHQsdmFsdWVQYXR0LGxpbWl0cz11bmRlZmluZWRdLFxuY2hlY2spPT5cbntcbmNvbnN0e251bU1hcEVudHJpZXNMaW1pdH09bGltaXQobGltaXRzKTtcbnJldHVybihcbmNoZWNrS2luZChzcGVjaW1lbiwnY29weU1hcCcsY2hlY2spJiZcbmNoZWNrKFxuLyoqIEB0eXBlIHtBcnJheX0gKi9zcGVjaW1lbi5wYXlsb2FkLmtleXMubGVuZ3RoPD1cbm51bU1hcEVudHJpZXNMaW1pdCxcblggYENvcHlNYXAgbXVzdCBoYXZlIG5vIG1vcmUgdGhhbiAke3EoXG5udW1NYXBFbnRyaWVzTGltaXQpXG4gfSBlbnRyaWVzOiAke3NwZWNpbWVufWApJiZcblxuYXJyYXlFdmVyeU1hdGNoUGF0dGVybihcbnNwZWNpbWVuLnBheWxvYWQua2V5cyxcbmtleVBhdHQsXG5jaGVjayxcbidtYXAga2V5cycpJiZcblxuYXJyYXlFdmVyeU1hdGNoUGF0dGVybihcbnNwZWNpbWVuLnBheWxvYWQudmFsdWVzLFxudmFsdWVQYXR0LFxuY2hlY2ssXG4nbWFwIHZhbHVlcycpKTtcblxuXG4gfSxcblxuY2hlY2tJc1dlbGxGb3JtZWQ6KHBheWxvYWQsY2hlY2spPT5cbmNoZWNrSXNXZWxsRm9ybWVkV2l0aExpbWl0KFxucGF5bG9hZCxcbmhhcmRlbihbTU0ucGF0dGVybigpLE1NLnBhdHRlcm4oKV0pLFxuY2hlY2ssXG4nbWF0Y2g6bWFwT2YgcGF5bG9hZCcpLFxuXG5cbmdldFJhbmtDb3ZlcjooX2VudHJ5UGF0dCk9PmdldFBhc3NTdHlsZUNvdmVyKCd0YWdnZWQnKX0pO1xuXG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzcGVjaW1lblxuICogQHBhcmFtIHtQYXR0ZXJuW119IHJlcXVpcmVkUGF0dFxuICogQHBhcmFtIHtQYXR0ZXJuW119IG9wdGlvbmFsUGF0dFxuICogQHJldHVybnMge3tcbiAqICAgcmVxdWlyZWRTcGVjaW1lbjogUGFzc2FibGVbXSxcbiAqICAgb3B0aW9uYWxTcGVjaW1lbjogUGFzc2FibGVbXSxcbiAqICAgcmVzdFNwZWNpbWVuOiBQYXNzYWJsZVtdXG4gKiB9fVxuICovXG5jb25zdCBzcGxpdEFycmF5UGFydHM9KHNwZWNpbWVuLHJlcXVpcmVkUGF0dCxvcHRpb25hbFBhdHQpPT57XG5jb25zdCBudW1SZXF1aXJlZD1yZXF1aXJlZFBhdHQubGVuZ3RoO1xuY29uc3QgbnVtT3B0aW9uYWw9b3B0aW9uYWxQYXR0Lmxlbmd0aDtcbmNvbnN0IHJlcXVpcmVkU3BlY2ltZW49c3BlY2ltZW4uc2xpY2UoMCxudW1SZXF1aXJlZCk7XG5jb25zdCBvcHRpb25hbFNwZWNpbWVuPXNwZWNpbWVuLnNsaWNlKFxubnVtUmVxdWlyZWQsXG5udW1SZXF1aXJlZCtudW1PcHRpb25hbCk7XG5cbmNvbnN0IHJlc3RTcGVjaW1lbj1zcGVjaW1lbi5zbGljZShudW1SZXF1aXJlZCtudW1PcHRpb25hbCk7XG5yZXR1cm4gaGFyZGVuKHtyZXF1aXJlZFNwZWNpbWVuLG9wdGlvbmFsU3BlY2ltZW4scmVzdFNwZWNpbWVufSk7XG4gfTtcblxuLyoqXG4gKiBPcHRpb25hbCBzcGVjaW1lbiBlbGVtZW50cyB3aGljaCBhcmUgYHVuZGVmaW5lZGAgcGFzcyB1bmNvbmRpdGlvbmFsbHkuXG4gKiBXZSBlbmNvZGUgdGhpcyB3aXRoIHRoZSBgTS5vcmAgcGF0dGVybiBzbyBpdCBhbHNvIHByb2R1Y2VzIGEgZ29vZFxuICogY29tcHJlc3Npb24gZGlzdGluZ3Vpc2hpbmcgYHVuZGVmaW5lZGAgZnJvbSBhYnNlbmNlLlxuICpcbiAqIEBwYXJhbSB7UGF0dGVybltdfSBvcHRpb25hbFBhdHRcbiAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGhcbiAqIEByZXR1cm5zIHtQYXR0ZXJuW119IFRoZSBwYXJ0aWFsUGF0dFxuICovXG5jb25zdCBhZGFwdEFycmF5UGF0dGVybj0ob3B0aW9uYWxQYXR0LGxlbmd0aCk9PlxuaGFyZGVuKG9wdGlvbmFsUGF0dC5zbGljZSgwLGxlbmd0aCkubWFwKChwYXR0KT0+TU0ub3B0KHBhdHQpKSk7XG5cbi8qKiBAdHlwZSB7TWF0Y2hIZWxwZXJ9ICovXG5jb25zdCBtYXRjaFNwbGl0QXJyYXlIZWxwZXI9RmFyKCdtYXRjaDpzcGxpdEFycmF5IGhlbHBlcicse1xuY2hlY2tNYXRjaGVzOihcbnNwZWNpbWVuLFxuW3JlcXVpcmVkUGF0dCxvcHRpb25hbFBhdHQ9W10scmVzdFBhdHQ9TU0uYW55KCldLFxuY2hlY2spPT5cbntcbmlmKCFjaGVja0tpbmQoc3BlY2ltZW4sJ2NvcHlBcnJheScsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdHtyZXF1aXJlZFNwZWNpbWVuLG9wdGlvbmFsU3BlY2ltZW4scmVzdFNwZWNpbWVufT1cbnNwbGl0QXJyYXlQYXJ0cyhzcGVjaW1lbixyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0KTtcbmNvbnN0IHBhcnRpYWxQYXR0PWFkYXB0QXJyYXlQYXR0ZXJuKFxub3B0aW9uYWxQYXR0LFxub3B0aW9uYWxTcGVjaW1lbi5sZW5ndGgpO1xuXG5sZXQgYXJnTnVtPTA7XG5yZXR1cm4oXG4ocmVxdWlyZWRTcGVjaW1lbi5sZW5ndGg9PT1yZXF1aXJlZFBhdHQubGVuZ3RofHxcbmNoZWNrKFxuZmFsc2UsXG5YIGBFeHBlY3RlZCBhdCBsZWFzdCAke3EoXG5yZXF1aXJlZFBhdHQubGVuZ3RoKVxuIH0gYXJndW1lbnRzOiAke3NwZWNpbWVufWApKSYmXG5cbnJlcXVpcmVkUGF0dC5ldmVyeSgocCxpKT0+XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcGx1c3BsdXMqL1xuY2hlY2tNYXRjaGVzKHJlcXVpcmVkU3BlY2ltZW5baV0scCxjaGVjaywgYGFyZyAke2FyZ051bSsrfWApKSYmXG5cbnBhcnRpYWxQYXR0LmV2ZXJ5KChwLGkpPT5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1wbHVzcGx1cyovXG5jaGVja01hdGNoZXMob3B0aW9uYWxTcGVjaW1lbltpXSxwLGNoZWNrLCBgYXJnICR7YXJnTnVtKyt9P2ApKSYmXG5cbmNoZWNrTWF0Y2hlcyhyZXN0U3BlY2ltZW4scmVzdFBhdHQsY2hlY2ssJy4uLnJlc3QnKSk7XG5cbiB9LFxuXG4vKipcbiAqIEBwYXJhbSB7QXJyYXl9IHNwbGl0QXJyYXlcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqL1xuY2hlY2tJc1dlbGxGb3JtZWQ6KHNwbGl0QXJyYXksY2hlY2spPT57XG5pZihcbnBhc3NTdHlsZU9mKHNwbGl0QXJyYXkpPT09J2NvcHlBcnJheScmJihcbnNwbGl0QXJyYXkubGVuZ3RoPj0xfHxzcGxpdEFycmF5Lmxlbmd0aDw9MykpXG57XG5jb25zdFtyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0PXVuZGVmaW5lZCxyZXN0UGF0dD11bmRlZmluZWRdPVxuc3BsaXRBcnJheTtcbmlmKFxuaXNQYXR0ZXJuKHJlcXVpcmVkUGF0dCkmJlxucGFzc1N0eWxlT2YocmVxdWlyZWRQYXR0KT09PSdjb3B5QXJyYXknJiYoXG5vcHRpb25hbFBhdHQ9PT11bmRlZmluZWR8fFxuaXNQYXR0ZXJuKG9wdGlvbmFsUGF0dCkmJlxucGFzc1N0eWxlT2Yob3B0aW9uYWxQYXR0KT09PSdjb3B5QXJyYXknKSYmKFxucmVzdFBhdHQ9PT11bmRlZmluZWR8fGlzUGF0dGVybihyZXN0UGF0dCkpKVxue1xucmV0dXJuIHRydWU7XG4gfVxuIH1cbnJldHVybiBjaGVjayhcbmZhbHNlLFxuWCBgTXVzdCBiZSBhbiBhcnJheSBvZiBhIHJlcXVpcmVkUGF0dCBhcnJheSwgYW4gb3B0aW9uYWwgb3B0aW9uYWxQYXR0IGFycmF5LCBhbmQgYW4gb3B0aW9uYWwgcmVzdFBhdHQ6ICR7cShcbnNwbGl0QXJyYXkpXG4gfWApO1xuXG4gfSxcblxuZ2V0UmFua0NvdmVyOihbXG5fcmVxdWlyZWRQYXR0LFxuX29wdGlvbmFsUGF0dD11bmRlZmluZWQsXG5fcmVzdFBhdHQ9dW5kZWZpbmVkXSk9PlxuZ2V0UGFzc1N0eWxlQ292ZXIoJ2NvcHlBcnJheScpfSk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge0NvcHlSZWNvcmQ8UGFzc2FibGU+fSBzcGVjaW1lblxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFBhdHRlcm4+fSByZXF1aXJlZFBhdHRcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxQYXR0ZXJuPn0gb3B0aW9uYWxQYXR0XG4gKiBAcmV0dXJucyB7e1xuICogICByZXF1aXJlZFNwZWNpbWVuOiBDb3B5UmVjb3JkPFBhc3NhYmxlPixcbiAqICAgb3B0aW9uYWxTcGVjaW1lbjogQ29weVJlY29yZDxQYXNzYWJsZT4sXG4gKiAgIHJlc3RTcGVjaW1lbjogQ29weVJlY29yZDxQYXNzYWJsZT5cbiAqIH19XG4gKi9cbmNvbnN0IHNwbGl0UmVjb3JkUGFydHM9KHNwZWNpbWVuLHJlcXVpcmVkUGF0dCxvcHRpb25hbFBhdHQpPT57XG4vKiBOb3QgZnJvemVuISBNdXRhdGVkIGluIHBsYWNlKi9cbi8qKiBAdHlwZSB7W3N0cmluZywgUGFzc2FibGVdW119ICovXG5jb25zdCByZXF1aXJlZEVudHJpZXM9W107XG4vKiogQHR5cGUge1tzdHJpbmcsIFBhc3NhYmxlXVtdfSAqL1xuY29uc3Qgb3B0aW9uYWxFbnRyaWVzPVtdO1xuLyoqIEB0eXBlIHtbc3RyaW5nLCBQYXNzYWJsZV1bXX0gKi9cbmNvbnN0IHJlc3RFbnRyaWVzPVtdO1xuZm9yKGNvbnN0W25hbWUsdmFsdWVdb2YgZW50cmllcyhzcGVjaW1lbikpe1xuaWYoaGFzT3duUHJvcGVydHlPZihyZXF1aXJlZFBhdHQsbmFtZSkpe1xucmVxdWlyZWRFbnRyaWVzLnB1c2goW25hbWUsdmFsdWVdKTtcbiB9ZWxzZSBpZihoYXNPd25Qcm9wZXJ0eU9mKG9wdGlvbmFsUGF0dCxuYW1lKSl7XG5vcHRpb25hbEVudHJpZXMucHVzaChbbmFtZSx2YWx1ZV0pO1xuIH1lbHNle1xucmVzdEVudHJpZXMucHVzaChbbmFtZSx2YWx1ZV0pO1xuIH1cbiB9XG5yZXR1cm4gaGFyZGVuKHtcbnJlcXVpcmVkU3BlY2ltZW46ZnJvbVVuaXF1ZUVudHJpZXMocmVxdWlyZWRFbnRyaWVzKSxcbm9wdGlvbmFsU3BlY2ltZW46ZnJvbVVuaXF1ZUVudHJpZXMob3B0aW9uYWxFbnRyaWVzKSxcbnJlc3RTcGVjaW1lbjpmcm9tVW5pcXVlRW50cmllcyhyZXN0RW50cmllcyl9KTtcblxuIH07XG5cbi8qKlxuICogT3B0aW9uYWwgc3BlY2ltZW4gdmFsdWVzIHdoaWNoIGFyZSBgdW5kZWZpbmVkYCBwYXNzIHVuY29uZGl0aW9uYWxseS5cbiAqIFdlIGVuY29kZSB0aGlzIHdpdGggdGhlIGBNLm9yYCBwYXR0ZXJuIHNvIGl0IGFsc28gcHJvZHVjZXMgYSBnb29kXG4gKiBjb21wcmVzc2lvbiBkaXN0aW5ndWlzaGluZyBgdW5kZWZpbmVkYCBmcm9tIGFic2VuY2UuXG4gKlxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFBhdHRlcm4+fSBvcHRpb25hbFBhdHRcbiAqIEBwYXJhbSB7c3RyaW5nW119IG5hbWVzXG4gKiBAcmV0dXJucyB7Q29weVJlY29yZDxQYXR0ZXJuPn0gVGhlIHBhcnRpYWxQYXR0XG4gKi9cbmNvbnN0IGFkYXB0UmVjb3JkUGF0dGVybj0ob3B0aW9uYWxQYXR0LG5hbWVzKT0+XG5mcm9tVW5pcXVlRW50cmllcyhuYW1lcy5tYXAoKG5hbWUpPT5bbmFtZSxNTS5vcHQob3B0aW9uYWxQYXR0W25hbWVdKV0pKTtcblxuLyoqIEB0eXBlIHtNYXRjaEhlbHBlcn0gKi9cbmNvbnN0IG1hdGNoU3BsaXRSZWNvcmRIZWxwZXI9RmFyKCdtYXRjaDpzcGxpdFJlY29yZCBoZWxwZXInLHtcbmNoZWNrTWF0Y2hlczooXG5zcGVjaW1lbixcbltyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0PXt9LHJlc3RQYXR0PU1NLmFueSgpXSxcbmNoZWNrKT0+XG57XG5pZighY2hlY2tLaW5kKHNwZWNpbWVuLCdjb3B5UmVjb3JkJyxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbmNvbnN0e3JlcXVpcmVkU3BlY2ltZW4sb3B0aW9uYWxTcGVjaW1lbixyZXN0U3BlY2ltZW59PVxuc3BsaXRSZWNvcmRQYXJ0cyhzcGVjaW1lbixyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0KTtcblxuY29uc3QgcGFydGlhbE5hbWVzPS8qKiBAdHlwZSB7c3RyaW5nW119ICovb3duS2V5cyhvcHRpb25hbFNwZWNpbWVuKTtcbmNvbnN0IHBhcnRpYWxQYXR0PWFkYXB0UmVjb3JkUGF0dGVybihvcHRpb25hbFBhdHQscGFydGlhbE5hbWVzKTtcbnJldHVybihcbmNoZWNrTWF0Y2hlcyhyZXF1aXJlZFNwZWNpbWVuLHJlcXVpcmVkUGF0dCxjaGVjaykmJlxucGFydGlhbE5hbWVzLmV2ZXJ5KChuYW1lKT0+XG5jaGVja01hdGNoZXMoXG5vcHRpb25hbFNwZWNpbWVuW25hbWVdLFxucGFydGlhbFBhdHRbbmFtZV0sXG5jaGVjayxcbiBgJHtuYW1lfT9gKSkmJlxuXG5cbmNoZWNrTWF0Y2hlcyhyZXN0U3BlY2ltZW4scmVzdFBhdHQsY2hlY2ssJy4uLnJlc3QnKSk7XG5cbiB9LFxuXG4vKipcbiAqIEBwYXJhbSB7QXJyYXl9IHNwbGl0QXJyYXlcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gY2hlY2tcbiAqL1xuY2hlY2tJc1dlbGxGb3JtZWQ6KHNwbGl0QXJyYXksY2hlY2spPT57XG5pZihcbnBhc3NTdHlsZU9mKHNwbGl0QXJyYXkpPT09J2NvcHlBcnJheScmJihcbnNwbGl0QXJyYXkubGVuZ3RoPj0xfHxzcGxpdEFycmF5Lmxlbmd0aDw9MykpXG57XG5jb25zdFtyZXF1aXJlZFBhdHQsb3B0aW9uYWxQYXR0PXVuZGVmaW5lZCxyZXN0UGF0dD11bmRlZmluZWRdPVxuc3BsaXRBcnJheTtcbmlmKFxuaXNQYXR0ZXJuKHJlcXVpcmVkUGF0dCkmJlxucGFzc1N0eWxlT2YocmVxdWlyZWRQYXR0KT09PSdjb3B5UmVjb3JkJyYmKFxub3B0aW9uYWxQYXR0PT09dW5kZWZpbmVkfHxcbmlzUGF0dGVybihvcHRpb25hbFBhdHQpJiZcbnBhc3NTdHlsZU9mKG9wdGlvbmFsUGF0dCk9PT0nY29weVJlY29yZCcpJiYoXG5yZXN0UGF0dD09PXVuZGVmaW5lZHx8aXNQYXR0ZXJuKHJlc3RQYXR0KSkpXG57XG5yZXR1cm4gdHJ1ZTtcbiB9XG4gfVxucmV0dXJuIGNoZWNrKFxuZmFsc2UsXG5YIGBNdXN0IGJlIGFuIGFycmF5IG9mIGEgcmVxdWlyZWRQYXR0IHJlY29yZCwgYW4gb3B0aW9uYWwgb3B0aW9uYWxQYXR0IHJlY29yZCwgYW5kIGFuIG9wdGlvbmFsIHJlc3RQYXR0OiAke3EoXG5zcGxpdEFycmF5KVxuIH1gKTtcblxuIH0sXG5cbmdldFJhbmtDb3ZlcjooW1xucmVxdWlyZWRQYXR0LFxuX29wdGlvbmFsUGF0dD11bmRlZmluZWQsXG5fcmVzdFBhdHQ9dW5kZWZpbmVkXSk9PlxuZ2V0UGFzc1N0eWxlQ292ZXIocGFzc1N0eWxlT2YocmVxdWlyZWRQYXR0KSl9KTtcblxuXG4vKiogQHR5cGUge1JlY29yZDxzdHJpbmcsIE1hdGNoSGVscGVyPn0gKi9cbmNvbnN0IEhlbHBlcnNCeU1hdGNoVGFnPWhhcmRlbih7XG4nbWF0Y2g6YW55JzptYXRjaEFueUhlbHBlcixcbidtYXRjaDphbmQnOm1hdGNoQW5kSGVscGVyLFxuJ21hdGNoOm9yJzptYXRjaE9ySGVscGVyLFxuJ21hdGNoOm5vdCc6bWF0Y2hOb3RIZWxwZXIsXG5cbidtYXRjaDpzY2FsYXInOm1hdGNoU2NhbGFySGVscGVyLFxuJ21hdGNoOmtleSc6bWF0Y2hLZXlIZWxwZXIsXG4nbWF0Y2g6cGF0dGVybic6bWF0Y2hQYXR0ZXJuSGVscGVyLFxuJ21hdGNoOmtpbmQnOm1hdGNoS2luZEhlbHBlcixcbidtYXRjaDpiaWdpbnQnOm1hdGNoQmlnaW50SGVscGVyLFxuJ21hdGNoOm5hdCc6bWF0Y2hOYXRIZWxwZXIsXG4nbWF0Y2g6c3RyaW5nJzptYXRjaFN0cmluZ0hlbHBlcixcbidtYXRjaDpzeW1ib2wnOm1hdGNoU3ltYm9sSGVscGVyLFxuJ21hdGNoOnJlbW90YWJsZSc6bWF0Y2hSZW1vdGFibGVIZWxwZXIsXG5cbidtYXRjaDpsdCc6bWF0Y2hMVEhlbHBlcixcbidtYXRjaDpsdGUnOm1hdGNoTFRFSGVscGVyLFxuJ21hdGNoOmd0ZSc6bWF0Y2hHVEVIZWxwZXIsXG4nbWF0Y2g6Z3QnOm1hdGNoR1RIZWxwZXIsXG5cbidtYXRjaDphcnJheU9mJzptYXRjaEFycmF5T2ZIZWxwZXIsXG4nbWF0Y2g6cmVjb3JkT2YnOm1hdGNoUmVjb3JkT2ZIZWxwZXIsXG4nbWF0Y2g6c2V0T2YnOm1hdGNoU2V0T2ZIZWxwZXIsXG4nbWF0Y2g6YmFnT2YnOm1hdGNoQmFnT2ZIZWxwZXIsXG4nbWF0Y2g6bWFwT2YnOm1hdGNoTWFwT2ZIZWxwZXIsXG4nbWF0Y2g6c3BsaXRBcnJheSc6bWF0Y2hTcGxpdEFycmF5SGVscGVyLFxuJ21hdGNoOnNwbGl0UmVjb3JkJzptYXRjaFNwbGl0UmVjb3JkSGVscGVyfSk7XG5cblxuY29uc3QgbWFrZU1hdGNoZXI9KHRhZyxwYXlsb2FkKT0+e1xuY29uc3QgbWF0Y2hlcj1tYWtlVGFnZ2VkKHRhZyxwYXlsb2FkKTtcbmFzc2VydFBhdHRlcm4obWF0Y2hlcik7XG5yZXR1cm4gbWF0Y2hlcjtcbiB9O1xuXG5jb25zdCBtYWtlS2luZE1hdGNoZXI9KGtpbmQpPT5tYWtlTWF0Y2hlcignbWF0Y2g6a2luZCcsa2luZCk7XG5cbmNvbnN0IEFueVNoYXBlPW1ha2VNYXRjaGVyKCdtYXRjaDphbnknLHVuZGVmaW5lZCk7XG5jb25zdCBTY2FsYXJTaGFwZT1tYWtlTWF0Y2hlcignbWF0Y2g6c2NhbGFyJyx1bmRlZmluZWQpO1xuY29uc3QgS2V5U2hhcGU9bWFrZU1hdGNoZXIoJ21hdGNoOmtleScsdW5kZWZpbmVkKTtcbmNvbnN0IFBhdHRlcm5TaGFwZT1tYWtlTWF0Y2hlcignbWF0Y2g6cGF0dGVybicsdW5kZWZpbmVkKTtcbmNvbnN0IEJvb2xlYW5TaGFwZT1tYWtlS2luZE1hdGNoZXIoJ2Jvb2xlYW4nKTtcbmNvbnN0IE51bWJlclNoYXBlPW1ha2VLaW5kTWF0Y2hlcignbnVtYmVyJyk7XG5jb25zdCBCaWdJbnRTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpiaWdpbnQnLFtdKTtcbmNvbnN0IE5hdFNoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOm5hdCcsW10pO1xuY29uc3QgU3RyaW5nU2hhcGU9bWFrZVRhZ2dlZCgnbWF0Y2g6c3RyaW5nJyxbXSk7XG5jb25zdCBTeW1ib2xTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpzeW1ib2wnLFtdKTtcbmNvbnN0IFJlY29yZFNoYXBlPW1ha2VUYWdnZWQoJ21hdGNoOnJlY29yZE9mJyxbQW55U2hhcGUsQW55U2hhcGVdKTtcbmNvbnN0IEFycmF5U2hhcGU9bWFrZVRhZ2dlZCgnbWF0Y2g6YXJyYXlPZicsW0FueVNoYXBlXSk7XG5jb25zdCBTZXRTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpzZXRPZicsW0FueVNoYXBlXSk7XG5jb25zdCBCYWdTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDpiYWdPZicsW0FueVNoYXBlLEFueVNoYXBlXSk7XG5jb25zdCBNYXBTaGFwZT1tYWtlVGFnZ2VkKCdtYXRjaDptYXBPZicsW0FueVNoYXBlLEFueVNoYXBlXSk7XG5jb25zdCBSZW1vdGFibGVTaGFwZT1tYWtlS2luZE1hdGNoZXIoJ3JlbW90YWJsZScpO1xuY29uc3QgRXJyb3JTaGFwZT1tYWtlS2luZE1hdGNoZXIoJ2Vycm9yJyk7XG5jb25zdCBQcm9taXNlU2hhcGU9bWFrZUtpbmRNYXRjaGVyKCdwcm9taXNlJyk7XG5jb25zdCBVbmRlZmluZWRTaGFwZT1tYWtlS2luZE1hdGNoZXIoJ3VuZGVmaW5lZCcpO1xuXG4vKipcbiAqIEZvciB3aGVuIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIHBheWxvYWQgaXMgdGhlIG9wdGlvbmFsIGxpbWl0cyxcbiAqIHNvIHRoYXQgd2hlbiBpdCBpcyBgdW5kZWZpbmVkYCBpdCBpcyBkcm9wcGVkIGZyb20gdGhlIGVuZCBvZiB0aGVcbiAqIHBheWxvYWRzIGFycmF5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB0YWdcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gcGF5bG9hZFxuICovXG5jb25zdCBtYWtlTGltaXRzTWF0Y2hlcj0odGFnLHBheWxvYWQpPT57XG5pZihwYXlsb2FkW3BheWxvYWQubGVuZ3RoLTFdPT09dW5kZWZpbmVkKXtcbnBheWxvYWQ9aGFyZGVuKHBheWxvYWQuc2xpY2UoMCxwYXlsb2FkLmxlbmd0aC0xKSk7XG4gfVxucmV0dXJuIG1ha2VNYXRjaGVyKHRhZyxwYXlsb2FkKTtcbiB9O1xuXG5jb25zdCBtYWtlUmVtb3RhYmxlTWF0Y2hlcj0obGFiZWw9dW5kZWZpbmVkKT0+XG5sYWJlbD09PXVuZGVmaW5lZD9cblJlbW90YWJsZVNoYXBlOlxubWFrZU1hdGNoZXIoJ21hdGNoOnJlbW90YWJsZScsaGFyZGVuKHtsYWJlbH0pKTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtUfSBlbXB0eVxuICogQHBhcmFtIHtUfSBiYXNlXG4gKiBAcGFyYW0ge1R9IFtvcHRpb25hbF1cbiAqIEBwYXJhbSB7VH0gW3Jlc3RdXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG5jb25zdCBtYWtlU3BsaXRQYXlsb2FkPShcbmVtcHR5LFxuYmFzZSxcbm9wdGlvbmFsPXVuZGVmaW5lZCxcbnJlc3Q9dW5kZWZpbmVkKT0+XG57XG5pZihyZXN0KXtcbnJldHVybltiYXNlLG9wdGlvbmFsfHxlbXB0eSxyZXN0XTtcbiB9XG5pZihvcHRpb25hbCl7XG5yZXR1cm5bYmFzZSxvcHRpb25hbF07XG4gfVxucmV0dXJuW2Jhc2VdO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHsnc3luYyd8J2FzeW5jJ30gY2FsbEtpbmRcbiAqIEBwYXJhbSB7QXJnR3VhcmRbXX0gYXJnR3VhcmRzXG4gKiBAcGFyYW0ge0FyZ0d1YXJkW119IFtvcHRpb25hbEFyZ0d1YXJkc11cbiAqIEBwYXJhbSB7QXJnR3VhcmR9IFtyZXN0QXJnR3VhcmRdXG4gKiBAcmV0dXJucyB7TWV0aG9kR3VhcmRNYWtlcn1cbiAqL1xuY29uc3QgbWFrZU1ldGhvZEd1YXJkTWFrZXI9KFxuY2FsbEtpbmQsXG5hcmdHdWFyZHMsXG5vcHRpb25hbEFyZ0d1YXJkcz11bmRlZmluZWQsXG5yZXN0QXJnR3VhcmQ9dW5kZWZpbmVkKT0+XG5cbmhhcmRlbih7XG5vcHRpb25hbDooLi4ub3B0QXJnR3VhcmRzKT0+e1xub3B0aW9uYWxBcmdHdWFyZHM9PT11bmRlZmluZWR8fFxuRmFpbCBgQ2FuIG9ubHkgaGF2ZSBvbmUgc2V0IG9mIG9wdGlvbmFsIGd1YXJkc2A7XG5yZXN0QXJnR3VhcmQ9PT11bmRlZmluZWR8fFxuRmFpbCBgb3B0aW9uYWwgYXJnIGd1YXJkcyBtdXN0IGNvbWUgYmVmb3JlIHJlc3QgYXJnYDtcbnJldHVybiBtYWtlTWV0aG9kR3VhcmRNYWtlcihjYWxsS2luZCxhcmdHdWFyZHMsb3B0QXJnR3VhcmRzKTtcbiB9LFxucmVzdDoockFyZ0d1YXJkKT0+e1xucmVzdEFyZ0d1YXJkPT09dW5kZWZpbmVkfHxGYWlsIGBDYW4gb25seSBoYXZlIG9uZSByZXN0IGFyZ2A7XG5yZXR1cm4gbWFrZU1ldGhvZEd1YXJkTWFrZXIoXG5jYWxsS2luZCxcbmFyZ0d1YXJkcyxcbm9wdGlvbmFsQXJnR3VhcmRzLFxuckFyZ0d1YXJkKTtcblxuIH0sXG5yZXR1cm5zOihyZXR1cm5HdWFyZD1VbmRlZmluZWRTaGFwZSk9PlxuaGFyZGVuKHtcbmtsYXNzOidtZXRob2RHdWFyZCcsXG5jYWxsS2luZCxcbmFyZ0d1YXJkcyxcbm9wdGlvbmFsQXJnR3VhcmRzLFxucmVzdEFyZ0d1YXJkLFxucmV0dXJuR3VhcmR9KX0pO1xuXG5cblxuY29uc3QgbWFrZUF3YWl0QXJnR3VhcmQ9KGFyZ0d1YXJkKT0+XG5oYXJkZW4oe1xua2xhc3M6J2F3YWl0QXJnJyxcbmFyZ0d1YXJkfSk7XG5cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqIEB0eXBlIHtNYXRjaGVyTmFtZXNwYWNlfSAqL1xuY29uc3QgTT1oYXJkZW4oe1xuYW55OigpPT5BbnlTaGFwZSxcbmFuZDooLi4ucGF0dHMpPT5tYWtlTWF0Y2hlcignbWF0Y2g6YW5kJyxwYXR0cyksXG5vcjooLi4ucGF0dHMpPT5tYWtlTWF0Y2hlcignbWF0Y2g6b3InLHBhdHRzKSxcbm5vdDooc3ViUGF0dCk9Pm1ha2VNYXRjaGVyKCdtYXRjaDpub3QnLHN1YlBhdHQpLFxuXG5zY2FsYXI6KCk9PlNjYWxhclNoYXBlLFxua2V5OigpPT5LZXlTaGFwZSxcbnBhdHRlcm46KCk9PlBhdHRlcm5TaGFwZSxcbmtpbmQ6bWFrZUtpbmRNYXRjaGVyLFxuYm9vbGVhbjooKT0+Qm9vbGVhblNoYXBlLFxubnVtYmVyOigpPT5OdW1iZXJTaGFwZSxcbmJpZ2ludDoobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP21ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpiaWdpbnQnLFtsaW1pdHNdKTpCaWdJbnRTaGFwZSxcbm5hdDoobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP21ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpuYXQnLFtsaW1pdHNdKTpOYXRTaGFwZSxcbnN0cmluZzoobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP21ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpzdHJpbmcnLFtsaW1pdHNdKTpTdHJpbmdTaGFwZSxcbnN5bWJvbDoobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP21ha2VMaW1pdHNNYXRjaGVyKCdtYXRjaDpzeW1ib2wnLFtsaW1pdHNdKTpTeW1ib2xTaGFwZSxcbnJlY29yZDoobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP00ucmVjb3JkT2YoTS5hbnkoKSxNLmFueSgpLGxpbWl0cyk6UmVjb3JkU2hhcGUsXG5hcnJheToobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP00uYXJyYXlPZihNLmFueSgpLGxpbWl0cyk6QXJyYXlTaGFwZSxcbnNldDoobGltaXRzPXVuZGVmaW5lZCk9PmxpbWl0cz9NLnNldE9mKE0uYW55KCksbGltaXRzKTpTZXRTaGFwZSxcbmJhZzoobGltaXRzPXVuZGVmaW5lZCk9PlxubGltaXRzP00uYmFnT2YoTS5hbnkoKSxNLmFueSgpLGxpbWl0cyk6QmFnU2hhcGUsXG5tYXA6KGxpbWl0cz11bmRlZmluZWQpPT5cbmxpbWl0cz9NLm1hcE9mKE0uYW55KCksTS5hbnkoKSxsaW1pdHMpOk1hcFNoYXBlLFxucmVtb3RhYmxlOm1ha2VSZW1vdGFibGVNYXRjaGVyLFxuZXJyb3I6KCk9PkVycm9yU2hhcGUsXG5wcm9taXNlOigpPT5Qcm9taXNlU2hhcGUsXG51bmRlZmluZWQ6KCk9PlVuZGVmaW5lZFNoYXBlLFxubnVsbDooKT0+bnVsbCxcblxubHQ6KHJpZ2h0T3BlcmFuZCk9Pm1ha2VNYXRjaGVyKCdtYXRjaDpsdCcscmlnaHRPcGVyYW5kKSxcbmx0ZToocmlnaHRPcGVyYW5kKT0+bWFrZU1hdGNoZXIoJ21hdGNoOmx0ZScscmlnaHRPcGVyYW5kKSxcbmVxOihrZXkpPT57XG5hc3NlcnRLZXkoa2V5KTtcbnJldHVybiBrZXk9PT11bmRlZmluZWQ/TS51bmRlZmluZWQoKTprZXk7XG4gfSxcbm5lcTooa2V5KT0+TS5ub3QoTS5lcShrZXkpKSxcbmd0ZToocmlnaHRPcGVyYW5kKT0+bWFrZU1hdGNoZXIoJ21hdGNoOmd0ZScscmlnaHRPcGVyYW5kKSxcbmd0OihyaWdodE9wZXJhbmQpPT5tYWtlTWF0Y2hlcignbWF0Y2g6Z3QnLHJpZ2h0T3BlcmFuZCksXG5cbnJlY29yZE9mOihrZXlQYXR0PU0uYW55KCksdmFsdWVQYXR0PU0uYW55KCksbGltaXRzPXVuZGVmaW5lZCk9PlxubWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOnJlY29yZE9mJyxba2V5UGF0dCx2YWx1ZVBhdHQsbGltaXRzXSksXG5hcnJheU9mOihzdWJQYXR0PU0uYW55KCksbGltaXRzPXVuZGVmaW5lZCk9PlxubWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOmFycmF5T2YnLFtzdWJQYXR0LGxpbWl0c10pLFxuc2V0T2Y6KGtleVBhdHQ9TS5hbnkoKSxsaW1pdHM9dW5kZWZpbmVkKT0+XG5tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6c2V0T2YnLFtrZXlQYXR0LGxpbWl0c10pLFxuYmFnT2Y6KGtleVBhdHQ9TS5hbnkoKSxjb3VudFBhdHQ9TS5hbnkoKSxsaW1pdHM9dW5kZWZpbmVkKT0+XG5tYWtlTGltaXRzTWF0Y2hlcignbWF0Y2g6YmFnT2YnLFtrZXlQYXR0LGNvdW50UGF0dCxsaW1pdHNdKSxcbm1hcE9mOihrZXlQYXR0PU0uYW55KCksdmFsdWVQYXR0PU0uYW55KCksbGltaXRzPXVuZGVmaW5lZCk9PlxubWFrZUxpbWl0c01hdGNoZXIoJ21hdGNoOm1hcE9mJyxba2V5UGF0dCx2YWx1ZVBhdHQsbGltaXRzXSksXG5zcGxpdEFycmF5OihiYXNlLG9wdGlvbmFsPXVuZGVmaW5lZCxyZXN0PXVuZGVmaW5lZCk9PlxubWFrZU1hdGNoZXIoXG4nbWF0Y2g6c3BsaXRBcnJheScsXG5tYWtlU3BsaXRQYXlsb2FkKFtdLGJhc2Usb3B0aW9uYWwscmVzdCkpLFxuXG5zcGxpdFJlY29yZDooYmFzZSxvcHRpb25hbD11bmRlZmluZWQscmVzdD11bmRlZmluZWQpPT5cbm1ha2VNYXRjaGVyKFxuJ21hdGNoOnNwbGl0UmVjb3JkJyxcbm1ha2VTcGxpdFBheWxvYWQoe30sYmFzZSxvcHRpb25hbCxyZXN0KSksXG5cbnNwbGl0OihiYXNlLHJlc3Q9dW5kZWZpbmVkKT0+e1xuaWYocGFzc1N0eWxlT2YoaGFyZGVuKGJhc2UpKT09PSdjb3B5QXJyYXknKXtcbi8qIEB0cy1leHBlY3QtZXJyb3IgV2Uga25vdyBpdCBzaG91bGQgYmUgYW4gYXJyYXkqL1xucmV0dXJuIE0uc3BsaXRBcnJheShiYXNlLHJlc3QmJltdLHJlc3QpO1xuIH1lbHNle1xucmV0dXJuIE0uc3BsaXRSZWNvcmQoYmFzZSxyZXN0JiZ7fSxyZXN0KTtcbiB9XG4gfSxcbnBhcnRpYWw6KGJhc2UscmVzdD11bmRlZmluZWQpPT57XG5pZihwYXNzU3R5bGVPZihoYXJkZW4oYmFzZSkpPT09J2NvcHlBcnJheScpe1xuLyogQHRzLWV4cGVjdC1lcnJvciBXZSBrbm93IGl0IHNob3VsZCBiZSBhbiBhcnJheSovXG5yZXR1cm4gTS5zcGxpdEFycmF5KFtdLGJhc2UscmVzdCk7XG4gfWVsc2V7XG5yZXR1cm4gTS5zcGxpdFJlY29yZCh7fSxiYXNlLHJlc3QpO1xuIH1cbiB9LFxuXG5lcmVmOih0KT0+TS5vcih0LE0ucHJvbWlzZSgpKSxcbm9wdDoodCk9Pk0ub3IoTS51bmRlZmluZWQoKSx0KSxcblxuaW50ZXJmYWNlOihpbnRlcmZhY2VOYW1lLG1ldGhvZEd1YXJkcyx7c2xvcHB5PWZhbHNlfT17fSk9PntcbmZvcihjb25zdFtfLG1ldGhvZEd1YXJkXW9mIGVudHJpZXMobWV0aG9kR3VhcmRzKSl7XG5tZXRob2RHdWFyZC5rbGFzcz09PSdtZXRob2RHdWFyZCd8fFxuRmFpbCBgdW5yZWNvZ25pemUgbWV0aG9kIGd1YXJkICR7bWV0aG9kR3VhcmR9YDtcbiB9XG5yZXR1cm4gaGFyZGVuKHtcbmtsYXNzOidJbnRlcmZhY2UnLFxuaW50ZXJmYWNlTmFtZSxcbm1ldGhvZEd1YXJkcyxcbnNsb3BweX0pO1xuXG4gfSxcbmNhbGw6KC4uLmFyZ0d1YXJkcyk9Pm1ha2VNZXRob2RHdWFyZE1ha2VyKCdzeW5jJyxhcmdHdWFyZHMpLFxuY2FsbFdoZW46KC4uLmFyZ0d1YXJkcyk9Pm1ha2VNZXRob2RHdWFyZE1ha2VyKCdhc3luYycsYXJnR3VhcmRzKSxcblxuYXdhaXQ6KGFyZ0d1YXJkKT0+bWFrZUF3YWl0QXJnR3VhcmQoYXJnR3VhcmQpfSk7XG5cblxucmV0dXJuIGhhcmRlbih7XG5jaGVja01hdGNoZXMsXG5tYXRjaGVzLFxubXVzdE1hdGNoLFxuYXNzZXJ0UGF0dGVybixcbmlzUGF0dGVybixcbmdldFJhbmtDb3Zlcixcbk19KTtcblxuIH07XG5cbi8qIE9ubHkgaW5jbHVkZSB0aG9zZSB3aG9zZSBtZWFuaW5nIGlzIGluZGVwZW5kZW50IG9mIGFuIGltcHV0ZWQgc29ydCBvcmRlciovXG4vKiBvZiByZW1vdGFibGVzLCBvciBvZiBlbmNvZGluZyBvZiBwYXNzYWJsZSBhcyBzb3J0YWJsZSBzdHJpbmdzLiBUaHVzLCovXG4vKiBnZXRSYW5rQ292ZXIgaXMgb21pdHRlZC4gVG8gZ2V0IG9uZSwgeW91J2QgbmVlZCB0byBpbnN0YW50aWF0ZSovXG4vKiBgbWFrZVBhdHRlcm5LaXQoKWAgeW91cnNlbGYuIFNpbmNlIHRoZXJlIGFyZSBjdXJyZW50bHkgbm8gZXh0ZXJuYWwqL1xuLyogdXNlcyBvZiBgZ2V0UmFua0NvdmVyYCwgZm9yIGNsYXJpdHkgZHVyaW5nIGRldmVsb3BtZW50LCBgbWFrZVBhdHRlcm5LaXRgKi9cbi8qIGlzIG5vdCBjdXJyZW50bHkgZXhwb3J0ZWQuKi9cbmNvbnN0ICAgICAgIHtcbmNoZWNrTWF0Y2hlcyxcbm1hdGNoZXMsXG5tdXN0TWF0Y2gsXG5hc3NlcnRQYXR0ZXJuLFxuaXNQYXR0ZXJuLFxuZ2V0UmFua0NvdmVyLFxuTX09XG5tYWtlUGF0dGVybktpdCgpO1xuXG4vKipcbiAqIEEgbWV0aG9kIGd1YXJkLCBmb3IgaW5jbHVzaW9uIGluIGFuIGludGVyZmFjZSBndWFyZCwgdGhhdCBlbmZvcmNlcyBvbmx5IHRoYXRcbiAqIGFsbCBhcmd1bWVudHMgYXJlIHBhc3NhYmxlIGFuZCB0aGF0IHRoZSByZXN1bHQgaXMgcGFzc2FibGUuIChJbiBmYXIgY2xhc3NlcyxcbiAqIFwiYW55XCIgbWVhbnMgYW55ICpwYXNzYWJsZSouKSBUaGlzIGlzIHRoZSBsZWFzdCBwb3NzaWJsZSBlbmZvcmNlbWVudCBmb3IgYVxuICogbWV0aG9kIGd1YXJkLCBhbmQgaXMgaW1wbGllZCBieSBhbGwgb3RoZXIgbWV0aG9kIGd1YXJkcy5cbiAqLyRo4oCNX29uY2UuY2hlY2tNYXRjaGVzKGNoZWNrTWF0Y2hlcyk7JGjigI1fb25jZS5tYXRjaGVzKG1hdGNoZXMpOyRo4oCNX29uY2UubXVzdE1hdGNoKG11c3RNYXRjaCk7JGjigI1fb25jZS5hc3NlcnRQYXR0ZXJuKGFzc2VydFBhdHRlcm4pOyRo4oCNX29uY2UuaXNQYXR0ZXJuKGlzUGF0dGVybik7JGjigI1fb25jZS5nZXRSYW5rQ292ZXIoZ2V0UmFua0NvdmVyKTskaOKAjV9vbmNlLk0oTSk7XG5jb25zdCAgICAgICAgTWluTWV0aG9kR3VhcmQ9TS5jYWxsKCkucmVzdChNLmFueSgpKS5yZXR1cm5zKE0uYW55KCkpOyRo4oCNX29uY2UuTWluTWV0aG9kR3VhcmQoTWluTWV0aG9kR3VhcmQpO1xuXG5NTT1NO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImRlZmF1bHRMaW1pdHMiOlsiZGVmYXVsdExpbWl0cyJdLCJjaGVja01hdGNoZXMiOlsiY2hlY2tNYXRjaGVzIl0sIm1hdGNoZXMiOlsibWF0Y2hlcyJdLCJtdXN0TWF0Y2giOlsibXVzdE1hdGNoIl0sImFzc2VydFBhdHRlcm4iOlsiYXNzZXJ0UGF0dGVybiJdLCJpc1BhdHRlcm4iOlsiaXNQYXR0ZXJuIl0sImdldFJhbmtDb3ZlciI6WyJnZXRSYW5rQ292ZXIiXSwiTSI6WyJNIl0sIk1pbk1ldGhvZEd1YXJkIjpbIk1pbk1ldGhvZEd1YXJkIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAF8GszVuFgAAbhYAADEAAABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvc3RvcmVzL3NjYWxhck1hcFN0b3JlLmpzeyJpbXBvcnRzIjpbIi4uL2tleXMvY2hlY2tLZXkuanMiLCIuLi9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiLCIuL3NjYWxhcldlYWtNYXBTdG9yZS5qcyIsIi4vc3RvcmUtdXRpbHMuanMiLCJAZW5kby9tYXJzaGFsIiwiQGVuZG8vbWFyc2hhbC9zcmMvcmFua09yZGVyLmpzIl0sImV4cG9ydHMiOlsibWFrZU1hcFN0b3JlTWV0aG9kcyIsIm1ha2VTY2FsYXJNYXBTdG9yZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXIsYXNzZXJ0UGFzc2FibGUsZmlsdGVySXRlcmFibGUsbWFwSXRlcmFibGUsY29tcGFyZVJhbmssYXNzZXJ0U2NhbGFyS2V5LG1ha2VDb3B5TWFwLG1hdGNoZXMsbXVzdE1hdGNoLGFzc2VydFBhdHRlcm4sbWFrZVdlYWtNYXBTdG9yZU1ldGhvZHMsbWFrZUN1cnJlbnRLZXlzS2l0OyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL21hcnNoYWxcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXSxbXCJhc3NlcnRQYXNzYWJsZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaOKAjV9hKV1dLFtcImZpbHRlckl0ZXJhYmxlXCIsIFskaOKAjV9hID0+IChmaWx0ZXJJdGVyYWJsZSA9ICRo4oCNX2EpXV0sW1wibWFwSXRlcmFibGVcIiwgWyRo4oCNX2EgPT4gKG1hcEl0ZXJhYmxlID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWwvc3JjL3JhbmtPcmRlci5qc1wiLCBbW1wiY29tcGFyZVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVSYW5rID0gJGjigI1fYSldXV1dLFtcIi4uL2tleXMvY2hlY2tLZXkuanNcIiwgW1tcImFzc2VydFNjYWxhcktleVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0U2NhbGFyS2V5ID0gJGjigI1fYSldXSxbXCJtYWtlQ29weU1hcFwiLCBbJGjigI1fYSA9PiAobWFrZUNvcHlNYXAgPSAkaOKAjV9hKV1dXV0sW1wiLi4vcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzXCIsIFtbXCJtYXRjaGVzXCIsIFskaOKAjV9hID0+IChtYXRjaGVzID0gJGjigI1fYSldXSxbXCJtdXN0TWF0Y2hcIiwgWyRo4oCNX2EgPT4gKG11c3RNYXRjaCA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGF0dGVyblwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRo4oCNX2EpXV1dXSxbXCIuL3NjYWxhcldlYWtNYXBTdG9yZS5qc1wiLCBbW1wibWFrZVdlYWtNYXBTdG9yZU1ldGhvZHNcIiwgWyRo4oCNX2EgPT4gKG1ha2VXZWFrTWFwU3RvcmVNZXRob2RzID0gJGjigI1fYSldXV1dLFtcIi4vc3RvcmUtdXRpbHMuanNcIiwgW1tcIm1ha2VDdXJyZW50S2V5c0tpdFwiLCBbJGjigI1fYSA9PiAobWFrZUN1cnJlbnRLZXlzS2l0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5jb25zdHtxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7TWFwPEssVj59IGpzbWFwXG4gKiBAcGFyYW0geyhrOiBLLCB2OiBWKSA9PiB2b2lkfSBhc3NlcnRLVk9rVG9BZGRcbiAqIEBwYXJhbSB7KGs6IEssIHY6IFYpID0+IHZvaWR9IGFzc2VydEtWT2tUb1NldFxuICogQHBhcmFtIHsoKGs6IEspID0+IHZvaWQpfSBbYXNzZXJ0S2V5T2tUb0RlbGV0ZV1cbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnXVxuICogQHJldHVybnMge01hcFN0b3JlPEssVj59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlTWFwU3RvcmVNZXRob2RzPShcbmpzbWFwLFxuYXNzZXJ0S1ZPa1RvQWRkLFxuYXNzZXJ0S1ZPa1RvU2V0LFxuYXNzZXJ0S2V5T2tUb0RlbGV0ZT11bmRlZmluZWQsXG50YWc9J2tleScpPT5cbntcbmNvbnN0e2Fzc2VydFVwZGF0ZU9uQWRkLGFzc2VydFVwZGF0ZU9uRGVsZXRlLGl0ZXJhYmxlS2V5c309XG5tYWtlQ3VycmVudEtleXNLaXQoXG4oKT0+anNtYXAua2V5cygpLFxuKGspPT5qc21hcC5oYXMoayksXG5jb21wYXJlUmFuayxcbmFzc2VydEtWT2tUb0FkZCxcbmFzc2VydEtleU9rVG9EZWxldGUsXG50YWcpO1xuXG5cbi8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBba2V5UGF0dF1cbiAqIEBwYXJhbSB7UGF0dGVybn0gW3ZhbHVlUGF0dF1cbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxLPn1cbiAqL1xuY29uc3Qga2V5cz0oa2V5UGF0dD11bmRlZmluZWQsdmFsdWVQYXR0PXVuZGVmaW5lZCk9PntcbmlmKGtleVBhdHQ9PT11bmRlZmluZWQmJnZhbHVlUGF0dD09PXVuZGVmaW5lZCl7XG5yZXR1cm4gaXRlcmFibGVLZXlzO1xuIH1cbmNvbnN0IGZpbHRlcj0oayk9PntcbmlmKGtleVBhdHQhPT11bmRlZmluZWQmJiFtYXRjaGVzKGssa2V5UGF0dCkpe1xucmV0dXJuIGZhbHNlO1xuIH1cbi8qIFVzZXMgdGhlIGN1cnJlbnQganNtYXAgdmFsdWUsIHNpbmNlIHRoZSBpdGVyYXRhdG9yIHN1cnZpdmVzIGAuc2V0YCovXG5pZih2YWx1ZVBhdHQhPT11bmRlZmluZWQmJiFtYXRjaGVzKGpzbWFwLmdldChrKSx2YWx1ZVBhdHQpKXtcbnJldHVybiBmYWxzZTtcbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9O1xucmV0dXJuIGZpbHRlckl0ZXJhYmxlKGl0ZXJhYmxlS2V5cyxmaWx0ZXIpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBba2V5UGF0dF1cbiAqIEBwYXJhbSB7UGF0dGVybn0gW3ZhbHVlUGF0dF1cbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxWPn1cbiAqL1xuY29uc3QgdmFsdWVzPShrZXlQYXR0PXVuZGVmaW5lZCx2YWx1ZVBhdHQ9dW5kZWZpbmVkKT0+XG5tYXBJdGVyYWJsZShrZXlzKGtleVBhdHQsdmFsdWVQYXR0KSwoayk9Pi8qKiBAdHlwZSB7Vn0gKi9qc21hcC5nZXQoaykpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGF0dGVybn0gW2tleVBhdHRdXG4gKiBAcGFyYW0ge1BhdHRlcm59IFt2YWx1ZVBhdHRdXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8W0ssVl0+fVxuICovXG5jb25zdCBlbnRyaWVzPShrZXlQYXR0PXVuZGVmaW5lZCx2YWx1ZVBhdHQ9dW5kZWZpbmVkKT0+XG5tYXBJdGVyYWJsZShrZXlzKGtleVBhdHQsdmFsdWVQYXR0KSwoayk9PltcbmssXG4vKiogQHR5cGUge1Z9ICovanNtYXAuZ2V0KGspXSk7XG5cblxucmV0dXJuIGhhcmRlbih7XG4uLi5tYWtlV2Vha01hcFN0b3JlTWV0aG9kcyhcbmpzbWFwLFxuLyoqIEB0eXBlIHsoazogSywgdjogVikgPT4gdm9pZH0gKi9hc3NlcnRVcGRhdGVPbkFkZCxcbmFzc2VydEtWT2tUb1NldCxcbmFzc2VydFVwZGF0ZU9uRGVsZXRlLFxudGFnKSxcblxua2V5cyxcbnZhbHVlcyxcbmVudHJpZXMsXG5cbnNuYXBzaG90OihrZXlQYXR0PXVuZGVmaW5lZCx2YWx1ZVBhdHQ9dW5kZWZpbmVkKT0+XG5tYWtlQ29weU1hcChlbnRyaWVzKGtleVBhdHQsdmFsdWVQYXR0KSksXG5cbmdldFNpemU6KGtleVBhdHQ9dW5kZWZpbmVkLHZhbHVlUGF0dD11bmRlZmluZWQpPT5cbmtleVBhdHQ9PT11bmRlZmluZWQmJnZhbHVlUGF0dD09PXVuZGVmaW5lZD9cbmpzbWFwLnNpemU6XG5bLi4ua2V5cyhrZXlQYXR0LHZhbHVlUGF0dCldLmxlbmd0aCxcblxuY2xlYXI6KGtleVBhdHQ9dW5kZWZpbmVkLHZhbHVlUGF0dD11bmRlZmluZWQpPT57XG5pZihrZXlQYXR0PT09dW5kZWZpbmVkJiZ2YWx1ZVBhdHQ9PT11bmRlZmluZWQpe1xuanNtYXAuY2xlYXIoKTtcbiB9XG5mb3IoY29uc3Qga2V5IG9mIGtleXMoa2V5UGF0dCx2YWx1ZVBhdHQpKXtcbmpzbWFwLmRlbGV0ZShrZXkpO1xuIH1cbiB9fSk7XG5cbiB9O1xuXG4vKipcbiAqIERpc3Rpbmd1aXNoZXMgYmV0d2VlbiBhZGRpbmcgYSBuZXcga2V5IChpbml0KSBhbmQgdXBkYXRpbmcgb3JcbiAqIHJlZmVyZW5jaW5nIGEga2V5IChnZXQsIHNldCwgZGVsZXRlKS5cbiAqXG4gKiBgaW5pdGAgaXMgb25seSBhbGxvd2VkIGlmIHRoZSBrZXkgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4gYEdldGAsXG4gKiBgc2V0YCBhbmQgYGRlbGV0ZWAgYXJlIG9ubHkgYWxsb3dlZCBpZiB0aGUga2V5IGRvZXMgYWxyZWFkeSBleGlzdC5cbiAqXG4gKiBUaGlzIGlzIGEgKnNjYWxhciogbWFwIGluIHRoYXQgdGhlIGtleXMgY2FuIG9ubHkgYmUgYXRvbWljIHZhbHVlcywgcHJpbWl0aXZlc1xuICogb3IgcmVtb3RhYmxlcy4gT3RoZXIgc3RvcmVNYXBzIHdpbGwgYWNjZXB0LCBmb3IgZXhhbXBsZSwgY29weUFycmF5cyBhbmRcbiAqIGNvcHlSZWNvcmRzLCBhcyBrZXlzIGFuZCBsb29rIHRoZW0gdXAgYmFzZWQgb24gZXF1YWxpdHkgb2YgdGhlaXIgY29udGVudHMuXG4gKlxuICogQHRlbXBsYXRlIHtLZXl9IEtcbiAqIEB0ZW1wbGF0ZSB7UGFzc2FibGV9IFZcbiAqIEBwYXJhbSB7c3RyaW5nfSBbdGFnPSdrZXknXSAtIHRoZSBjb2x1bW4gbmFtZSBmb3IgdGhlIGtleVxuICogQHBhcmFtIHtTdG9yZU9wdGlvbnN9IFtvcHRpb25zXVxuICogQHJldHVybnMge01hcFN0b3JlPEssVj59XG4gKi8kaOKAjV9vbmNlLm1ha2VNYXBTdG9yZU1ldGhvZHMobWFrZU1hcFN0b3JlTWV0aG9kcyk7XG5jb25zdCAgICAgICAgbWFrZVNjYWxhck1hcFN0b3JlPShcbnRhZz0na2V5JyxcbntrZXlTaGFwZT11bmRlZmluZWQsdmFsdWVTaGFwZT11bmRlZmluZWR9PXt9KT0+XG57XG5jb25zdCBqc21hcD1uZXcgTWFwKCk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRQYXR0ZXJuKGtleVNoYXBlKTtcbiB9XG5pZih2YWx1ZVNoYXBlIT09dW5kZWZpbmVkKXtcbmFzc2VydFBhdHRlcm4odmFsdWVTaGFwZSk7XG4gfVxuXG5jb25zdCBhc3NlcnRLVk9rVG9TZXQ9KF9rZXksdmFsdWUpPT57XG4vKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNjA2Ki9cbmhhcmRlbih2YWx1ZSk7XG5cbmFzc2VydFBhc3NhYmxlKHZhbHVlKTtcbmlmKHZhbHVlU2hhcGUhPT11bmRlZmluZWQpe1xubXVzdE1hdGNoKHZhbHVlLHZhbHVlU2hhcGUsJ21hcFN0b3JlIHZhbHVlJyk7XG4gfVxuIH07XG5cbmNvbnN0IGFzc2VydEtWT2tUb0FkZD0oa2V5LHZhbHVlKT0+e1xuLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG5oYXJkZW4oa2V5KTtcblxuYXNzZXJ0U2NhbGFyS2V5KGtleSk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5tdXN0TWF0Y2goa2V5LGtleVNoYXBlLCdtYXBTdG9yZSBrZXknKTtcbiB9XG5hc3NlcnRLVk9rVG9TZXQoa2V5LHZhbHVlKTtcbiB9O1xuXG5yZXR1cm4gRmFyKCBgc2NhbGFyIE1hcFN0b3JlIG9mICR7cSh0YWcpfWAse1xuLi4ubWFrZU1hcFN0b3JlTWV0aG9kcyhcbmpzbWFwLFxuYXNzZXJ0S1ZPa1RvQWRkLFxuYXNzZXJ0S1ZPa1RvU2V0LFxudW5kZWZpbmVkLFxudGFnKX0pO1xuXG5cbiB9OyRo4oCNX29uY2UubWFrZVNjYWxhck1hcFN0b3JlKG1ha2VTY2FsYXJNYXBTdG9yZSk7XG5oYXJkZW4obWFrZVNjYWxhck1hcFN0b3JlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTWFwU3RvcmVNZXRob2RzIjpbIm1ha2VNYXBTdG9yZU1ldGhvZHMiXSwibWFrZVNjYWxhck1hcFN0b3JlIjpbIm1ha2VTY2FsYXJNYXBTdG9yZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD9G92DmQ8AAJkPAAAxAAAAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qc3siaW1wb3J0cyI6WyIuLi9rZXlzL2NoZWNrS2V5LmpzIiwiLi4vcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzIiwiLi9zY2FsYXJXZWFrU2V0U3RvcmUuanMiLCIuL3N0b3JlLXV0aWxzLmpzIiwiQGVuZG8vbWFyc2hhbCIsIkBlbmRvL21hcnNoYWwvc3JjL3JhbmtPcmRlci5qcyJdLCJleHBvcnRzIjpbIm1ha2VTY2FsYXJTZXRTdG9yZSIsIm1ha2VTZXRTdG9yZU1ldGhvZHMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRmFyLGZpbHRlckl0ZXJhYmxlLGNvbXBhcmVSYW5rLGFzc2VydFNjYWxhcktleSxtYWtlQ29weVNldCxtYXRjaGVzLG11c3RNYXRjaCxhc3NlcnRQYXR0ZXJuLG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzLG1ha2VDdXJyZW50S2V5c0tpdDskaOKAjV9pbXBvcnRzKFtbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2EgPT4gKEZhciA9ICRo4oCNX2EpXV0sW1wiZmlsdGVySXRlcmFibGVcIiwgWyRo4oCNX2EgPT4gKGZpbHRlckl0ZXJhYmxlID0gJGjigI1fYSldXV1dLFtcIkBlbmRvL21hcnNoYWwvc3JjL3JhbmtPcmRlci5qc1wiLCBbW1wiY29tcGFyZVJhbmtcIiwgWyRo4oCNX2EgPT4gKGNvbXBhcmVSYW5rID0gJGjigI1fYSldXV1dLFtcIi4uL2tleXMvY2hlY2tLZXkuanNcIiwgW1tcImFzc2VydFNjYWxhcktleVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0U2NhbGFyS2V5ID0gJGjigI1fYSldXSxbXCJtYWtlQ29weVNldFwiLCBbJGjigI1fYSA9PiAobWFrZUNvcHlTZXQgPSAkaOKAjV9hKV1dXV0sW1wiLi4vcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzXCIsIFtbXCJtYXRjaGVzXCIsIFskaOKAjV9hID0+IChtYXRjaGVzID0gJGjigI1fYSldXSxbXCJtdXN0TWF0Y2hcIiwgWyRo4oCNX2EgPT4gKG11c3RNYXRjaCA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGF0dGVyblwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRo4oCNX2EpXV1dXSxbXCIuL3NjYWxhcldlYWtTZXRTdG9yZS5qc1wiLCBbW1wibWFrZVdlYWtTZXRTdG9yZU1ldGhvZHNcIiwgWyRo4oCNX2EgPT4gKG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzID0gJGjigI1fYSldXV1dLFtcIi4vc3RvcmUtdXRpbHMuanNcIiwgW1tcIm1ha2VDdXJyZW50S2V5c0tpdFwiLCBbJGjigI1fYSA9PiAobWFrZUN1cnJlbnRLZXlzS2l0ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e3F1b3RlOnF9PWFzc2VydDtcblxuLyoqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtTZXQ8Sz59IGpzc2V0XG4gKiBAcGFyYW0geyhrOiBLKSA9PiB2b2lkfSBhc3NlcnRLZXlPa1RvQWRkXG4gKiBAcGFyYW0geyhrOiBLKSA9PiB2b2lkfSBbYXNzZXJ0S2V5T2tUb0RlbGV0ZV1cbiAqIEBwYXJhbSB7c3RyaW5nfSBba2V5TmFtZV1cbiAqIEByZXR1cm5zIHtTZXRTdG9yZTxLPn1cbiAqL1xuY29uc3QgICAgICAgIG1ha2VTZXRTdG9yZU1ldGhvZHM9KFxuanNzZXQsXG5hc3NlcnRLZXlPa1RvQWRkLFxuYXNzZXJ0S2V5T2tUb0RlbGV0ZT11bmRlZmluZWQsXG5rZXlOYW1lPSdrZXknKT0+XG57XG5jb25zdHthc3NlcnRVcGRhdGVPbkFkZCxhc3NlcnRVcGRhdGVPbkRlbGV0ZSxpdGVyYWJsZUtleXN9PVxubWFrZUN1cnJlbnRLZXlzS2l0KFxuKCk9Pmpzc2V0LmtleXMoKSxcbihrKT0+anNzZXQuaGFzKGspLFxuY29tcGFyZVJhbmssXG5hc3NlcnRLZXlPa1RvQWRkLFxuYXNzZXJ0S2V5T2tUb0RlbGV0ZSxcbmtleU5hbWUpO1xuXG5cbi8qKlxuICogQHBhcmFtIHtQYXR0ZXJufSBba2V5UGF0dF1cbiAqIEByZXR1cm5zIHtJdGVyYWJsZTxLPn1cbiAqL1xuY29uc3Qga2V5cz0oa2V5UGF0dD11bmRlZmluZWQpPT5cbmtleVBhdHQ9PT11bmRlZmluZWQ/XG5pdGVyYWJsZUtleXM6XG5maWx0ZXJJdGVyYWJsZShpdGVyYWJsZUtleXMsKGspPT5tYXRjaGVzKGssa2V5UGF0dCkpO1xuXG5yZXR1cm4gaGFyZGVuKHtcbi4uLm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzKFxuanNzZXQsXG5hc3NlcnRVcGRhdGVPbkFkZCxcbmFzc2VydFVwZGF0ZU9uRGVsZXRlLFxua2V5TmFtZSksXG5cblxua2V5cyxcblxudmFsdWVzOmtleXMsXG5cbnNuYXBzaG90OihrZXlQYXR0PXVuZGVmaW5lZCk9Pm1ha2VDb3B5U2V0KGtleXMoa2V5UGF0dCkpLFxuXG5nZXRTaXplOihrZXlQYXR0PXVuZGVmaW5lZCk9Plxua2V5UGF0dD09PXVuZGVmaW5lZD9qc3NldC5zaXplOlsuLi5rZXlzKGtleVBhdHQpXS5sZW5ndGgsXG5cbmNsZWFyOihrZXlQYXR0PXVuZGVmaW5lZCk9PntcbmlmKGtleVBhdHQ9PT11bmRlZmluZWQpe1xuanNzZXQuY2xlYXIoKTtcbiB9XG5mb3IoY29uc3Qga2V5IG9mIGtleXMoa2V5UGF0dCkpe1xuanNzZXQuZGVsZXRlKGtleSk7XG4gfVxuIH19KTtcblxuIH07XG5cbi8qKlxuICogRGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGFkZGluZyBhIG5ldyBrZXkgKGluaXQpIGFuZCB1cGRhdGluZyBvclxuICogcmVmZXJlbmNpbmcgYSBrZXkgKGdldCwgc2V0LCBkZWxldGUpLlxuICpcbiAqIGBpbml0YCBpcyBvbmx5IGFsbG93ZWQgaWYgdGhlIGtleSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LiBgR2V0YCxcbiAqIGBzZXRgIGFuZCBgZGVsZXRlYCBhcmUgb25seSBhbGxvd2VkIGlmIHRoZSBrZXkgZG9lcyBhbHJlYWR5IGV4aXN0LlxuICpcbiAqIFRoaXMgaXMgYSAqc2NhbGFyKiBzZXQgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzLCBwcmltaXRpdmVzXG4gKiBvciByZW1vdGFibGVzLiBPdGhlciBzdG9yZVNldHMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLCBjb3B5QXJyYXlzIGFuZFxuICogY29weVJlY29yZHMsIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtzdHJpbmd9IFt0YWc9J2tleSddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7U3RvcmVPcHRpb25zfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtTZXRTdG9yZTxLPn1cbiAqLyRo4oCNX29uY2UubWFrZVNldFN0b3JlTWV0aG9kcyhtYWtlU2V0U3RvcmVNZXRob2RzKTtcbmNvbnN0ICAgICAgICBtYWtlU2NhbGFyU2V0U3RvcmU9KFxudGFnPSdrZXknLFxue2tleVNoYXBlPXVuZGVmaW5lZH09e30pPT5cbntcbmNvbnN0IGpzc2V0PW5ldyBTZXQoKTtcbmlmKGtleVNoYXBlIT09dW5kZWZpbmVkKXtcbmFzc2VydFBhdHRlcm4oa2V5U2hhcGUpO1xuIH1cblxuY29uc3QgYXNzZXJ0S2V5T2tUb0FkZD0oa2V5KT0+e1xuLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG5oYXJkZW4oa2V5KTtcblxuYXNzZXJ0U2NhbGFyS2V5KGtleSk7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5tdXN0TWF0Y2goa2V5LGtleVNoYXBlLCdzZXRTdG9yZSBrZXknKTtcbiB9XG4gfTtcblxucmV0dXJuIEZhciggYHNjYWxhciBTZXRTdG9yZSBvZiAke3EodGFnKX1gLHtcbi4uLm1ha2VTZXRTdG9yZU1ldGhvZHMoanNzZXQsYXNzZXJ0S2V5T2tUb0FkZCx1bmRlZmluZWQsdGFnKX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VTY2FsYXJTZXRTdG9yZShtYWtlU2NhbGFyU2V0U3RvcmUpO1xuaGFyZGVuKG1ha2VTY2FsYXJTZXRTdG9yZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVNldFN0b3JlTWV0aG9kcyI6WyJtYWtlU2V0U3RvcmVNZXRob2RzIl0sIm1ha2VTY2FsYXJTZXRTdG9yZSI6WyJtYWtlU2NhbGFyU2V0U3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAWJG5be4SAADuEgAANQAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9zdG9yZXMvc2NhbGFyV2Vha01hcFN0b3JlLmpzeyJpbXBvcnRzIjpbIi4uL2tleXMvY2hlY2tLZXkuanMiLCIuLi9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsibWFrZVNjYWxhcldlYWtNYXBTdG9yZSIsIm1ha2VXZWFrTWFwU3RvcmVNZXRob2RzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhcixhc3NlcnRQYXNzYWJsZSxwYXNzU3R5bGVPZixnZXRDb3B5TWFwRW50cmllcyxpc0NvcHlNYXAsbXVzdE1hdGNoLGFzc2VydFBhdHRlcm47JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhc3NhYmxlXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZSA9ICRo4oCNX2EpXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dLFtcIi4uL2tleXMvY2hlY2tLZXkuanNcIiwgW1tcImdldENvcHlNYXBFbnRyaWVzXCIsIFskaOKAjV9hID0+IChnZXRDb3B5TWFwRW50cmllcyA9ICRo4oCNX2EpXV0sW1wiaXNDb3B5TWFwXCIsIFskaOKAjV9hID0+IChpc0NvcHlNYXAgPSAkaOKAjV9hKV1dXV0sW1wiLi4vcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzXCIsIFtbXCJtdXN0TWF0Y2hcIiwgWyRo4oCNX2EgPT4gKG11c3RNYXRjaCA9ICRo4oCNX2EpXV0sW1wiYXNzZXJ0UGF0dGVyblwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGF0dGVybiA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHtXZWFrTWFwPEsgJiBvYmplY3QsIFY+fSBqc21hcFxuICogQHBhcmFtIHsoazogSywgdjogVikgPT4gdm9pZH0gYXNzZXJ0S1ZPa1RvQWRkXG4gKiBAcGFyYW0geyhrOiBLLCB2OiBWKSA9PiB2b2lkfSBhc3NlcnRLVk9rVG9TZXRcbiAqIEBwYXJhbSB7KGs6IEspID0+IHZvaWR9IFthc3NlcnRLZXlPa1RvRGVsZXRlXVxuICogQHBhcmFtIHtzdHJpbmd9IFtrZXlOYW1lXVxuICogQHJldHVybnMge1dlYWtNYXBTdG9yZTxLLFY+fVxuICovXG5jb25zdCAgICAgICAgbWFrZVdlYWtNYXBTdG9yZU1ldGhvZHM9KFxuanNtYXAsXG5hc3NlcnRLVk9rVG9BZGQsXG5hc3NlcnRLVk9rVG9TZXQsXG5hc3NlcnRLZXlPa1RvRGVsZXRlPXVuZGVmaW5lZCxcbmtleU5hbWU9J2tleScpPT5cbntcbmNvbnN0IGFzc2VydEtleURvZXNOb3RFeGlzdD0oa2V5KT0+XG4hanNtYXAuaGFzKGtleSl8fEZhaWwgYCR7cShrZXlOYW1lKX0gYWxyZWFkeSByZWdpc3RlcmVkOiAke2tleX1gO1xuXG5jb25zdCBhc3NlcnRLZXlFeGlzdHM9KGtleSk9PlxuanNtYXAuaGFzKGtleSl8fEZhaWwgYCR7cShrZXlOYW1lKX0gbm90IGZvdW5kOiAke2tleX1gO1xuXG5yZXR1cm4gaGFyZGVuKHtcbmhhczooa2V5KT0+e1xuLyogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwqL1xuLyogdGhvdWdoIHRoZSBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQqL1xuLyogaW4gdGhpcyBtYXAuKi9cbnJldHVybiBqc21hcC5oYXMoa2V5KTtcbiB9LFxuZ2V0OihrZXkpPT57XG5hc3NlcnRLZXlFeGlzdHMoa2V5KTtcbi8qIEhvdyB0byB0ZWxsIHR5cGVzY3JpcHQgSSBiZWxpZXZlIHRoZSBgZ2V0YCB3aWxsIHN1Y2NlZWQuKi9cbnJldHVybiAoLyoqIEB0eXBlIHtWfSAqL2pzbWFwLmdldChrZXkpKTtcbiB9LFxuXG5pbml0OihrZXksdmFsdWUpPT57XG5hc3NlcnRLZXlEb2VzTm90RXhpc3Qoa2V5KTtcbmFzc2VydEtWT2tUb0FkZChrZXksdmFsdWUpO1xuanNtYXAuc2V0KGtleSx2YWx1ZSk7XG4gfSxcbnNldDooa2V5LHZhbHVlKT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG5hc3NlcnRLVk9rVG9TZXQoa2V5LHZhbHVlKTtcbmpzbWFwLnNldChrZXksdmFsdWUpO1xuIH0sXG5kZWxldGU6KGtleSk9PntcbmFzc2VydEtleUV4aXN0cyhrZXkpO1xuaWYoYXNzZXJ0S2V5T2tUb0RlbGV0ZSE9PXVuZGVmaW5lZCl7XG5hc3NlcnRLZXlPa1RvRGVsZXRlKGtleSk7XG4gfVxuanNtYXAuZGVsZXRlKGtleSk7XG4gfSxcblxuYWRkQWxsOihlbnRyaWVzKT0+e1xuaWYoaXNDb3B5TWFwKGVudHJpZXMpKXtcbmVudHJpZXM9Z2V0Q29weU1hcEVudHJpZXMoZW50cmllcyk7XG4gfVxuZm9yKGNvbnN0W2tleSx2YWx1ZV1vZi8qKiBAdHlwZSB7SXRlcmFibGU8W0ssIFZdPn0gKi9lbnRyaWVzKXtcbi8qIERvbid0IGFzc2VydCB0aGF0IHRoZSBrZXkgZWl0aGVyIGRvZXMgb3IgZG9lcyBub3QgZXhpc3QuKi9cbmFzc2VydEtWT2tUb0FkZChrZXksdmFsdWUpO1xuanNtYXAuc2V0KGtleSx2YWx1ZSk7XG4gfVxuIH19KTtcblxuIH07XG5cbi8qKlxuICogVGhpcyBpcyBhICpzY2FsYXIqIG1hcFN0b3JlIGluIHRoYXQgdGhlIGtleXMgY2FuIG9ubHkgYmUgYXRvbWljIHZhbHVlczpcbiAqIHByaW1pdGl2ZXMgb3IgcmVtb3RhYmxlcy5cbiAqIE90aGVyIG1hcFN0b3JlcyB3aWxsIGFjY2VwdCwgZm9yIGV4YW1wbGUsIGNvcHlBcnJheXMgYW5kXG4gKiBjb3B5UmVjb3JkcyBhcyBrZXlzIGFuZCBsb29rIHRoZW0gdXAgYmFzZWQgb24gZXF1YWxpdHkgb2YgdGhlaXIgY29udGVudHMuXG4gKlxuICogVE9ETyBGb3Igbm93LCB0aGlzIHNjYWxhcldlYWtNYXAgYWNjZXB0cyBvbmx5IHJlbW90YWJsZXMsIHJlZmxlY3RpbmcgdGhlXG4gKiBjb25zdHJhaW50cyBvZiB0aGUgdW5kZXJseWluZyBKYXZhU2NyaXB0IFdlYWtNYXAgaXQgdXNlcyBpbnRlcm5hbGx5LiBCdXRcbiAqIGl0IHNob3VsZCBhY2NlcHQgdGhlIHByaW1pdGl2ZXMgYXMgd2VsbCwgc3RvcmluZyB0aGVtIGluIGEgc2VwYXJhdGUgaW50ZXJuYWxcbiAqIG1hcC4gV2hhdCBtYWtlcyBpdCBcIndlYWtcIiBpcyB0aGF0IGl0IHByb3ZpZGVzIG5vIEFQSSBmb3IgZW51bWVyYXRpbmcgd2hhdCdzXG4gKiB0aGVyZS4gVGhvdWdoIG5vdGUgdGhhdCB0aGlzIHdvdWxkIG9ubHkgZW5hYmxlcyBjb2xsZWN0aW9uIG9mIHRoZVxuICogcmVtb3RhYmxlcywgc2luY2UgdGhlIG90aGVyIHByaW1pdGl2ZXMgbWF5IGFsd2F5cyByZWFwcGVhci5cbiAqXG4gKiBAdGVtcGxhdGUgSyxWXG4gKiBAcGFyYW0ge3N0cmluZ30gW3RhZz0na2V5J10gLSB0YWcgZm9yIGRlYnVnZ2luZ1xuICogQHBhcmFtIHtTdG9yZU9wdGlvbnN9IFtvcHRpb25zXVxuICogQHJldHVybnMge1dlYWtNYXBTdG9yZTxLLFY+fVxuICovJGjigI1fb25jZS5tYWtlV2Vha01hcFN0b3JlTWV0aG9kcyhtYWtlV2Vha01hcFN0b3JlTWV0aG9kcyk7XG5jb25zdCAgICAgICAgbWFrZVNjYWxhcldlYWtNYXBTdG9yZT0oXG50YWc9J2tleScsXG57bG9uZ0xpdmVkPXRydWUsa2V5U2hhcGU9dW5kZWZpbmVkLHZhbHVlU2hhcGU9dW5kZWZpbmVkfT17fSk9Plxue1xuY29uc3QganNtYXA9bmV3KGxvbmdMaXZlZD9XZWFrTWFwOk1hcCkoKTtcbmlmKGtleVNoYXBlIT09dW5kZWZpbmVkKXtcbmFzc2VydFBhdHRlcm4oa2V5U2hhcGUpO1xuIH1cbmlmKHZhbHVlU2hhcGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0UGF0dGVybih2YWx1ZVNoYXBlKTtcbiB9XG5cbmNvbnN0IGFzc2VydEtWT2tUb1NldD0oX2tleSx2YWx1ZSk9Pntcbi8qIFRPRE86IEp1c3QgYSB0cmFuc2l0aW9uIGtsdWRnZS4gUmVtb3ZlIHdoZW4gcG9zc2libGUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzM2MDYqL1xuaGFyZGVuKHZhbHVlKTtcblxuYXNzZXJ0UGFzc2FibGUodmFsdWUpO1xuaWYodmFsdWVTaGFwZSE9PXVuZGVmaW5lZCl7XG5tdXN0TWF0Y2godmFsdWUsdmFsdWVTaGFwZSwnd2Vha01hcFN0b3JlIHZhbHVlJyk7XG4gfVxuIH07XG5cbmNvbnN0IGFzc2VydEtWT2tUb0FkZD0oa2V5LHZhbHVlKT0+e1xuLyogVE9ETzogSnVzdCBhIHRyYW5zaXRpb24ga2x1ZGdlLiBSZW1vdmUgd2hlbiBwb3NzaWJsZS4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMzYwNiovXG5oYXJkZW4oa2V5KTtcbnBhc3NTdHlsZU9mKGtleSk9PT0ncmVtb3RhYmxlJ3x8XG5GYWlsIGBPbmx5IHJlbW90YWJsZXMgY2FuIGJlIGtleXMgb2Ygc2NhbGFyIFdlYWtNYXBTdG9yZXM6ICR7a2V5fWA7XG5pZihrZXlTaGFwZSE9PXVuZGVmaW5lZCl7XG5tdXN0TWF0Y2goa2V5LGtleVNoYXBlLCd3ZWFrTWFwU3RvcmUga2V5Jyk7XG4gfVxuYXNzZXJ0S1ZPa1RvU2V0KGtleSx2YWx1ZSk7XG4gfTtcblxucmV0dXJuIEZhciggYHNjYWxhciBXZWFrTWFwU3RvcmUgb2YgJHtxKHRhZyl9YCx7XG4uLi5tYWtlV2Vha01hcFN0b3JlTWV0aG9kcyhcbmpzbWFwLFxuYXNzZXJ0S1ZPa1RvQWRkLFxuYXNzZXJ0S1ZPa1RvU2V0LFxudW5kZWZpbmVkLFxudGFnKX0pO1xuXG5cbiB9OyRo4oCNX29uY2UubWFrZVNjYWxhcldlYWtNYXBTdG9yZShtYWtlU2NhbGFyV2Vha01hcFN0b3JlKTtcbmhhcmRlbihtYWtlU2NhbGFyV2Vha01hcFN0b3JlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlV2Vha01hcFN0b3JlTWV0aG9kcyI6WyJtYWtlV2Vha01hcFN0b3JlTWV0aG9kcyJdLCJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIjpbIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAASkab/Y8OAACPDgAANQAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9zdG9yZXMvc2NhbGFyV2Vha1NldFN0b3JlLmpzeyJpbXBvcnRzIjpbIi4uL2tleXMvY2hlY2tLZXkuanMiLCIuLi9wYXR0ZXJucy9wYXR0ZXJuTWF0Y2hlcnMuanMiLCJAZW5kby9tYXJzaGFsIl0sImV4cG9ydHMiOlsibWFrZVNjYWxhcldlYWtTZXRTdG9yZSIsIm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IEZhcixwYXNzU3R5bGVPZixnZXRDb3B5U2V0S2V5cyxpc0NvcHlTZXQsbXVzdE1hdGNoLGFzc2VydFBhdHRlcm47JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dLFtcInBhc3NTdHlsZU9mXCIsIFskaOKAjV9hID0+IChwYXNzU3R5bGVPZiA9ICRo4oCNX2EpXV1dXSxbXCIuLi9rZXlzL2NoZWNrS2V5LmpzXCIsIFtbXCJnZXRDb3B5U2V0S2V5c1wiLCBbJGjigI1fYSA9PiAoZ2V0Q29weVNldEtleXMgPSAkaOKAjV9hKV1dLFtcImlzQ29weVNldFwiLCBbJGjigI1fYSA9PiAoaXNDb3B5U2V0ID0gJGjigI1fYSldXV1dLFtcIi4uL3BhdHRlcm5zL3BhdHRlcm5NYXRjaGVycy5qc1wiLCBbW1wibXVzdE1hdGNoXCIsIFskaOKAjV9hID0+IChtdXN0TWF0Y2ggPSAkaOKAjV9hKV1dLFtcImFzc2VydFBhdHRlcm5cIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhdHRlcm4gPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cbmNvbnN0e3F1b3RlOnEsRmFpbH09YXNzZXJ0O1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAcGFyYW0ge1dlYWtTZXQ8SyAmIG9iamVjdD59IGpzc2V0XG4gKiBAcGFyYW0geyhrOiBLKSA9PiB2b2lkfSBhc3NlcnRLZXlPa1RvQWRkXG4gKiBAcGFyYW0geyhrOiBLKSA9PiB2b2lkfSBbYXNzZXJ0S2V5T2tUb0RlbGV0ZV1cbiAqIEBwYXJhbSB7c3RyaW5nfSBba2V5TmFtZV1cbiAqIEByZXR1cm5zIHtXZWFrU2V0U3RvcmU8Sz59XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlV2Vha1NldFN0b3JlTWV0aG9kcz0oXG5qc3NldCxcbmFzc2VydEtleU9rVG9BZGQsXG5hc3NlcnRLZXlPa1RvRGVsZXRlPXVuZGVmaW5lZCxcbmtleU5hbWU9J2tleScpPT5cbntcbmNvbnN0IGFzc2VydEtleUV4aXN0cz0oa2V5KT0+XG5qc3NldC5oYXMoa2V5KXx8RmFpbCBgJHtxKGtleU5hbWUpfSBub3QgZm91bmQ6ICR7a2V5fWA7XG5cbnJldHVybiBoYXJkZW4oe1xuaGFzOihrZXkpPT57XG4vKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCovXG4vKiB0aG91Z2ggdGhlIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCovXG4vKiBpbiB0aGlzIHNldC4qL1xucmV0dXJuIGpzc2V0LmhhcyhrZXkpO1xuIH0sXG5cbmFkZDooa2V5KT0+e1xuYXNzZXJ0S2V5T2tUb0FkZChrZXkpO1xuanNzZXQuYWRkKGtleSk7XG4gfSxcbmRlbGV0ZTooa2V5KT0+e1xuYXNzZXJ0S2V5RXhpc3RzKGtleSk7XG5pZihhc3NlcnRLZXlPa1RvRGVsZXRlIT09dW5kZWZpbmVkKXtcbmFzc2VydEtleU9rVG9EZWxldGUoa2V5KTtcbiB9XG5qc3NldC5kZWxldGUoa2V5KTtcbiB9LFxuXG5hZGRBbGw6KGtleXMpPT57XG5pZihpc0NvcHlTZXQoa2V5cykpe1xua2V5cz1nZXRDb3B5U2V0S2V5cyhrZXlzKTtcbiB9XG5mb3IoY29uc3Qga2V5IG9mLyoqIEB0eXBlIHtJdGVyYWJsZTxLPn0gKi9rZXlzKXtcbmFzc2VydEtleU9rVG9BZGQoa2V5KTtcbmpzc2V0LmFkZChrZXkpO1xuIH1cbiB9fSk7XG5cbiB9O1xuXG4vKipcbiAqIFRoaXMgaXMgYSAqc2NhbGFyKiBzZXQgaW4gdGhhdCB0aGUga2V5cyBjYW4gb25seSBiZSBhdG9taWMgdmFsdWVzLCBwcmltaXRpdmVzXG4gKiBvciByZW1vdGFibGVzLiBPdGhlciBzdG9yZVNldHMgd2lsbCBhY2NlcHQsIGZvciBleGFtcGxlLCBjb3B5QXJyYXlzIGFuZFxuICogY29weVJlY29yZHMsIGFzIGtleXMgYW5kIGxvb2sgdGhlbSB1cCBiYXNlZCBvbiBlcXVhbGl0eSBvZiB0aGVpciBjb250ZW50cy5cbiAqXG4gKiBUT0RPIEZvciBub3csIHRoaXMgc2NhbGFyV2Vha1NldCBhY2NlcHRzIG9ubHkgcmVtb3RhYmxlcywgcmVmbGVjdGluZyB0aGVcbiAqIGNvbnN0cmFpbnRzIG9mIHRoZSB1bmRlcmx5aW5nIEphdmFTY3JpcHQgV2Vha1NldCBpdCB1c2VzIGludGVybmFsbHkuIEJ1dFxuICogaXQgc2hvdWxkIGFjY2VwdCB0aGUgcHJpbWl0aXZlcyBhcyB3ZWxsLCBzdG9yaW5nIHRoZW0gaW4gYSBzZXBhcmF0ZSBpbnRlcm5hbFxuICogc2V0LiBXaGF0IG1ha2VzIGl0IFwid2Vha1wiIGlzIHRoYXQgaXQgcHJvdmlkZXMgbm8gQVBJIGZvciBlbnVtZXJhdGluZyB3aGF0J3NcbiAqIHRoZXJlLiBUaG91Z2ggbm90ZSB0aGF0IHRoaXMgd291bGQgb25seSBlbmFibGVzIGNvbGxlY3Rpb24gb2YgdGhlXG4gKiByZW1vdGFibGVzLCBzaW5jZSB0aGUgb3RoZXIgcHJpbWl0aXZlcyBtYXkgYWx3YXlzIGFwcGVhci5cbiAqXG4gKiBAdGVtcGxhdGUgS1xuICogQHBhcmFtIHtzdHJpbmd9IFt0YWc9J2tleSddIC0gdGFnIGZvciBkZWJ1Z2dpbmdcbiAqIEBwYXJhbSB7U3RvcmVPcHRpb25zfSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtXZWFrU2V0U3RvcmU8Sz59XG4gKi8kaOKAjV9vbmNlLm1ha2VXZWFrU2V0U3RvcmVNZXRob2RzKG1ha2VXZWFrU2V0U3RvcmVNZXRob2RzKTtcbmNvbnN0ICAgICAgICBtYWtlU2NhbGFyV2Vha1NldFN0b3JlPShcbnRhZz0na2V5Jyxcbntsb25nTGl2ZWQ9dHJ1ZSxrZXlTaGFwZT11bmRlZmluZWR9PXt9KT0+XG57XG5jb25zdCBqc3NldD1uZXcobG9uZ0xpdmVkP1dlYWtTZXQ6U2V0KSgpO1xuaWYoa2V5U2hhcGUhPT11bmRlZmluZWQpe1xuYXNzZXJ0UGF0dGVybihrZXlTaGFwZSk7XG4gfVxuXG5jb25zdCBhc3NlcnRLZXlPa1RvQWRkPShrZXkpPT57XG4vKiBUT0RPOiBKdXN0IGEgdHJhbnNpdGlvbiBrbHVkZ2UuIFJlbW92ZSB3aGVuIHBvc3NpYmxlLiovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy8zNjA2Ki9cbmhhcmRlbihrZXkpO1xucGFzc1N0eWxlT2Yoa2V5KT09PSdyZW1vdGFibGUnfHxcbkZhaWwgYE9ubHkgcmVtb3RhYmxlcyBjYW4gYmUga2V5cyBvZiBzY2FsYXIgV2Vha1N0b3JlczogJHtrZXl9YDtcbmlmKGtleVNoYXBlIT09dW5kZWZpbmVkKXtcbm11c3RNYXRjaChrZXksa2V5U2hhcGUsJ3dlYWtTZXRTdG9yZSBrZXknKTtcbiB9XG4gfTtcblxucmV0dXJuIEZhciggYHNjYWxhciBXZWFrU2V0U3RvcmUgb2YgJHtxKHRhZyl9YCx7XG4uLi5tYWtlV2Vha1NldFN0b3JlTWV0aG9kcyhqc3NldCxhc3NlcnRLZXlPa1RvQWRkLHVuZGVmaW5lZCx0YWcpfSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZVNjYWxhcldlYWtTZXRTdG9yZShtYWtlU2NhbGFyV2Vha1NldFN0b3JlKTtcbmhhcmRlbihtYWtlU2NhbGFyV2Vha1NldFN0b3JlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyI6WyJtYWtlV2Vha1NldFN0b3JlTWV0aG9kcyJdLCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIjpbIm1ha2VTY2FsYXJXZWFrU2V0U3RvcmUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA8RKddP8UAAD/FAAALgAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9zdG9yZXMvc3RvcmUtdXRpbHMuanN7ImltcG9ydHMiOlsiQGVuZG8vbWFyc2hhbCJdLCJleHBvcnRzIjpbImFwcGVuZFRvU3RvcmVkQXJyYXkiLCJtYWtlQXRvbWljUHJvdmlkZXIiLCJtYWtlQ3VycmVudEtleXNLaXQiLCJwcm92aWRlTGF6eSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXI7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbWFyc2hhbFwiLCBbW1wiRmFyXCIsIFskaOKAjV9hID0+IChGYXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuY29uc3R7RmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHR5cGVkZWYge29iamVjdH0gQ3VycmVudEtleXNLaXRcbiAqIEBwcm9wZXJ0eSB7KGs6IEssIHY/OiBWKSA9PiB2b2lkfSBhc3NlcnRVcGRhdGVPbkFkZFxuICogQHByb3BlcnR5IHsoazogSykgPT4gdm9pZH0gYXNzZXJ0VXBkYXRlT25EZWxldGVcbiAqIEBwcm9wZXJ0eSB7SXRlcmFibGU8Sz59IGl0ZXJhYmxlS2V5c1xuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIEssVlxuICogQHBhcmFtIHsoKSA9PiBJdGVyYWJsZTxLPn0gZ2V0UmF3S2V5c1xuICogQHBhcmFtIHsoazogSykgPT4gYm9vbGVhbn0gY2hlY2tIYXNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7KGs6IEssIHY/OiBWKSA9PiB2b2lkfSBhc3NlcnRPa1RvQWRkXG4gKiBAcGFyYW0geyhrOiBLKSA9PiB2b2lkfSBbYXNzZXJ0T2tUb0RlbGV0ZV1cbiAqIEBwYXJhbSB7c3RyaW5nfSBba2V5TmFtZV1cbiAqIEByZXR1cm5zIHtDdXJyZW50S2V5c0tpdDxLLFY+fVxuICovXG5jb25zdCAgICAgICAgbWFrZUN1cnJlbnRLZXlzS2l0PShcbmdldFJhd0tleXMsXG5jaGVja0hhcyxcbmNvbXBhcmUsXG5hc3NlcnRPa1RvQWRkLFxuYXNzZXJ0T2tUb0RlbGV0ZT11bmRlZmluZWQsXG5rZXlOYW1lPSdrZXknKT0+XG57XG5sZXQgdXBkYXRlQ291bnQ9MDtcbmxldCBzb3J0ZWRLZXlzTWVtbztcblxuY29uc3QgYXNzZXJ0VXBkYXRlT25BZGQ9KGssdj11bmRlZmluZWQpPT57XG5hc3NlcnRPa1RvQWRkKGssdik7XG51cGRhdGVDb3VudCs9MTtcbnNvcnRlZEtleXNNZW1vPXVuZGVmaW5lZDtcbiB9O1xuXG5jb25zdCBhc3NlcnRVcGRhdGVPbkRlbGV0ZT0oayk9PmFzc2VydE9rVG9EZWxldGUmJmFzc2VydE9rVG9EZWxldGUoayk7XG5cbmNvbnN0IGdldFNvcnRlZEtleXM9KCk9PntcbmlmKHNvcnRlZEtleXNNZW1vPT09dW5kZWZpbmVkKXtcbnNvcnRlZEtleXNNZW1vPWhhcmRlbihbLi4uZ2V0UmF3S2V5cygpXS5zb3J0KGNvbXBhcmUpKTtcbiB9XG5yZXR1cm4gc29ydGVkS2V5c01lbW87XG4gfTtcblxuY29uc3QgaXRlcmFibGVLZXlzPUZhcignSXRlcmFibGUgb2Yga2V5cycse1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PntcbmNvbnN0IGdlbmVyYXRpb249dXBkYXRlQ291bnQ7XG5nZXRTb3J0ZWRLZXlzKCk7XG5jb25zdCBsZW49c29ydGVkS2V5c01lbW8ubGVuZ3RoO1xubGV0IGk9MDtcbnJldHVybiBGYXIoJ0l0ZXJhdG9yIG9mIGtleXMnLHtcbm5leHQ6KCk9PntcbmdlbmVyYXRpb249PT11cGRhdGVDb3VudHx8RmFpbCBgU3RvcmUgJHtxKGtleU5hbWUpfSBjdXJzb3Igc3RhbGVgO1xuLyogSWYgdGhleSdyZSBlcXVhbCwgdGhlbiB0aGUgc29ydGVkS2V5TWVtbyBpcyB0aGUgc2FtZSBvbmUqL1xuLyogd2Ugc3RhcnRlZCB3aXRoLiovXG5mb3IoOzspe1xuaWYoaTxsZW4pe1xuY29uc3QgdmFsdWU9c29ydGVkS2V5c01lbW9baV07XG5pKz0xO1xuaWYoY2hlY2tIYXModmFsdWUpKXtcbnJldHVybiBoYXJkZW4oe2RvbmU6ZmFsc2UsdmFsdWV9KTtcbiB9XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHtkb25lOnRydWUsdmFsdWU6dW5kZWZpbmVkfSk7XG4gfVxuIH1cbiB9fSk7XG5cbiB9fSk7XG5cblxucmV0dXJuIGhhcmRlbih7XG5hc3NlcnRVcGRhdGVPbkFkZCxcbmFzc2VydFVwZGF0ZU9uRGVsZXRlLFxuaXRlcmFibGVLZXlzfSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZUN1cnJlbnRLZXlzS2l0KG1ha2VDdXJyZW50S2V5c0tpdCk7XG5oYXJkZW4obWFrZUN1cnJlbnRLZXlzS2l0KTtcblxuLyoqXG4gKiBDYWxsIGBwcm92aWRlTGF6eWAgdG8gZ2V0IG9yIG1ha2UgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUga2V5LlxuICogSWYgdGhlcmUgYWxyZWFkeSBpcyBvbmUsIHJldHVybiB0aGF0LiBPdGhlcndpc2UsXG4gKiBjYWxsIGBtYWtlVmFsdWUoa2V5KWAsIHJlbWVtYmVyIGl0IGFzIHRoZSB2YWx1ZSBmb3JcbiAqIHRoYXQga2V5LCBhbmQgcmV0dXJuIGl0LlxuICpcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7V2Vha01hcFN0b3JlPEssVj59IG1hcFN0b3JlXG4gKiBAcGFyYW0ge0t9IGtleVxuICogQHBhcmFtIHsoa2V5OiBLKSA9PiBWfSBtYWtlVmFsdWVcbiAqIEByZXR1cm5zIHtWfVxuICovXG5jb25zdCAgICAgICAgcHJvdmlkZUxhenk9KG1hcFN0b3JlLGtleSxtYWtlVmFsdWUpPT57XG5pZighbWFwU3RvcmUuaGFzKGtleSkpe1xubWFwU3RvcmUuaW5pdChrZXksbWFrZVZhbHVlKGtleSkpO1xuIH1cbnJldHVybiBtYXBTdG9yZS5nZXQoa2V5KTtcbiB9OyRo4oCNX29uY2UucHJvdmlkZUxhenkocHJvdmlkZUxhenkpO1xuaGFyZGVuKHByb3ZpZGVMYXp5KTtcblxuLyoqXG4gKiBIZWxwZXIgZm9yIHVzZSBjYXNlcyBpbiB3aGljaCB0aGUgbWFrZXIgZnVuY3Rpb24gaXMgYXN5bmMuXG4gKiBGb3IgdHdvIHByb3ZpZGVMYXp5IGNhbGxzIHdpdGggdGhlIHNhbWUga2V5LCBvbmUgbWF5IGJlIG1ha2luZyB3aGVuIHRoZVxuICogb3RoZXIgY2FsbCBzdGFydHMgYW5kIGl0IHdvdWxkIG1ha2UgYWdhaW4uXG4gKiAoVGhlbiB0aGVyZSdkIGJlIGEgY29sbGlzaW9uIHdoZW4gdGhlIHNlY29uZCB0cmllcyB0byBzdG9yZVxuICogdGhlIGtleS4pIFRoaXMgcHJldmVudHMgdGhhdCByYWNlIGNvbmRpdGlvbiBieSBpbW1lZGlhdGVseSBzdG9yaW5nIGEgUHJvbWlzZVxuICogZm9yIHRoZSBtYWtlciBpbiBhbiBlcGhlbWVyYWwgc3RvcmUuXG4gKlxuICogV2hlbiB0aGUgYHN0b3JlYCBhcmd1bWVudCBpcyBkdXJhYmxlIHN0b3JhZ2UsIG5vdGUgdGhhdCBpdCdzIHBvc3NpYmxlIGZvclxuICogdGVybWluYXRpb24gdG8gaGFwcGVuIGFmdGVyIHRoZSBtYWtlIGNvbXBsZXRlcyBhbmQgYmVmb3JlIGl0IHJlYWNoZXMgZHVyYWJsZVxuICogc3RvcmFnZS5cbiAqXG4gKiBAdGVtcGxhdGUgS1xuICogQHRlbXBsYXRlIFZcbiAqIEBwYXJhbSB7V2Vha01hcFN0b3JlPEssIFY+fSBzdG9yZVxuICovXG5jb25zdCAgICAgICAgbWFrZUF0b21pY1Byb3ZpZGVyPShzdG9yZSk9Pntcbi8qKiBAdHlwZSB7TWFwPEssIFByb21pc2U8Vj4+fSAqL1xuY29uc3QgcGVuZGluZz1uZXcgTWFwKCk7XG5cbi8qKlxuICogQ2FsbCBgcHJvdmlkZUFzeW5jYCB0byBnZXQgb3IgbWFrZSB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBrZXksXG4gKiB3aGVuIHRoZSBtYWtlciBpcyBhc3luY2hyb25vdXMuXG4gKiBJZiB0aGVyZSBhbHJlYWR5IGlzIG9uZSwgcmV0dXJuIHRoYXQuIE90aGVyd2lzZSxcbiAqIGNhbGwgYG1ha2VWYWx1ZShrZXkpYCwgcmVtZW1iZXIgaXQgYXMgdGhlIHZhbHVlIGZvclxuICogdGhhdCBrZXksIGFuZCByZXR1cm4gaXQuXG4gKlxuICogQHBhcmFtIHtLfSBrZXlcbiAqIEBwYXJhbSB7KGtleTogSykgPT4gUHJvbWlzZTxWPn0gbWFrZVZhbHVlIG1ha2UgdGhlIHZhbHVlIGZvciB0aGUgc3RvcmVcbiAqIGlmIGl0IGhhc24ndCBiZWVuIG1hZGUgeWV0IG9yIHRoZSBsYXN0IG1ha2UgZmFpbGVkXG4gKiBAcGFyYW0geyhrZXk6IEssIHZhbHVlOiBWKSA9PiBQcm9taXNlPHZvaWQ+fSBbZmluaXNoVmFsdWVdIHJ1bnMgZXhhY3RseVxuICogb25jZSBhZnRlciBhIG5ldyB2YWx1ZSBpcyBhZGRlZCB0byB0aGUgc3RvcmVcbiAqIEByZXR1cm5zIHtQcm9taXNlPFY+fVxuICovXG5jb25zdCBwcm92aWRlQXN5bmM9KGtleSxtYWtlVmFsdWUsZmluaXNoVmFsdWUpPT57XG5pZihzdG9yZS5oYXMoa2V5KSl7XG5yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHN0b3JlLmdldChrZXkpKTtcbiB9XG5pZighcGVuZGluZy5oYXMoa2V5KSl7XG5jb25zdCB2YWxQPW1ha2VWYWx1ZShrZXkpLlxudGhlbigodik9PntcbnN0b3JlLmluaXQoa2V5LHYpO1xucmV0dXJuIHY7XG4gfSkuXG50aGVuKCh2KT0+e1xuaWYoZmluaXNoVmFsdWUpe1xucmV0dXJuIGZpbmlzaFZhbHVlKGtleSx2KS50aGVuKCgpPT52KTtcbiB9XG5yZXR1cm4gdjtcbiB9KS5cbmZpbmFsbHkoKCk9PntcbnBlbmRpbmcuZGVsZXRlKGtleSk7XG4gfSk7XG5wZW5kaW5nLnNldChrZXksdmFsUCk7XG4gfVxuY29uc3QgdmFsUD1wZW5kaW5nLmdldChrZXkpO1xuYXNzZXJ0KHZhbFApO1xucmV0dXJuIHZhbFA7XG4gfTtcblxucmV0dXJuIGhhcmRlbih7cHJvdmlkZUFzeW5jfSk7XG4gfTskaOKAjV9vbmNlLm1ha2VBdG9taWNQcm92aWRlcihtYWtlQXRvbWljUHJvdmlkZXIpO1xuaGFyZGVuKG1ha2VBdG9taWNQcm92aWRlcik7XG4vKipcbiAqIEB0ZW1wbGF0ZSBLXG4gKiBAdGVtcGxhdGUgVlxuICogQHR5cGVkZWYge1JldHVyblR5cGU8dHlwZW9mIG1ha2VBdG9taWNQcm92aWRlcjxLLCBWPj59IEF0b21pY1Byb3ZpZGVyPEssIFY+XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgSywgVlxuICogQHBhcmFtIHtNYXBTdG9yZTxLLCBWW10+fSBtYXBTdG9yZVxuICogQHBhcmFtIHtLfSBrZXlcbiAqIEBwYXJhbSB7Vn0gaXRlbVxuICovXG5jb25zdCAgICAgICAgYXBwZW5kVG9TdG9yZWRBcnJheT0obWFwU3RvcmUsa2V5LGl0ZW0pPT57XG5pZihtYXBTdG9yZS5oYXMoa2V5KSl7XG5jb25zdCBleHRhbnQ9bWFwU3RvcmUuZ2V0KGtleSk7XG5tYXBTdG9yZS5zZXQoa2V5LGhhcmRlbihbLi4uZXh0YW50LGl0ZW1dKSk7XG4gfWVsc2V7XG5tYXBTdG9yZS5pbml0KGtleSxoYXJkZW4oW2l0ZW1dKSk7XG4gfVxuIH07JGjigI1fb25jZS5hcHBlbmRUb1N0b3JlZEFycmF5KGFwcGVuZFRvU3RvcmVkQXJyYXkpO1xuaGFyZGVuKGFwcGVuZFRvU3RvcmVkQXJyYXkpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VDdXJyZW50S2V5c0tpdCI6WyJtYWtlQ3VycmVudEtleXNLaXQiXSwicHJvdmlkZUxhenkiOlsicHJvdmlkZUxhenkiXSwibWFrZUF0b21pY1Byb3ZpZGVyIjpbIm1ha2VBdG9taWNQcm92aWRlciJdLCJhcHBlbmRUb1N0b3JlZEFycmF5IjpbImFwcGVuZFRvU3RvcmVkQXJyYXkiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAPLwroQCFAAAAhQAAIQAAAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9tYXJzaGFsJykuUGFzc1N0eWxlfSBQYXNzU3R5bGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNvcHlUYWdnZWR9IENvcHlUYWdnZWQgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNvcHlSZWNvcmQ8VD59IENvcHlSZWNvcmQgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vbWFyc2hhbCcpLkNvcHlBcnJheTxUPn0gQ29weUFycmF5ICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL21hcnNoYWwnKS5DaGVja2VyfSBDaGVja2VyICovXG5cbi8qKlxuICogQHR5cGVkZWYge1Bhc3NhYmxlfSBLZXlcbiAqXG4gKiBLZXlzIGFyZSBQYXNzYWJsZSBhcmJpdHJhcmlseS1uZXN0ZWQgcGFzcy1ieS1jb3B5IGNvbnRhaW5lcnNcbiAqIChDb3B5QXJyYXksIENvcHlSZWNvcmQsIENvcHlTZXQsIENvcHlCYWcsIENvcHlNYXApIGluIHdoaWNoIGV2ZXJ5XG4gKiBub24tY29udGFpbmVyIGxlYWYgaXMgZWl0aGVyIGEgUGFzc2FibGUgcHJpbWl0aXZlIHZhbHVlIG9yIGEgUmVtb3RhYmxlIChhXG4gKiByZW1vdGVseS1hY2Nlc3NpYmxlIG9iamVjdCBvciBwcmVzZW5jZSBmb3IgYSByZW1vdGUgb2JqZWN0KSwgb3Igc3VjaCBsZWF2ZXNcbiAqIGluIGlzb2xhdGlvbiB3aXRoIG5vIGNvbnRhaW5lci5cbiAqXG4gKiBLZXlzIGFyZSBzbyBuYW1lZCBiZWNhdXNlIHRoZXkgY2FuIGJlIHVzZWQgYXMga2V5cyBpbiBDb3B5TWFwcyBhbmRcbiAqIFthZ29yaWMtc2RrIFN0b3Jlc10oaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2Jsb2IvbWFzdGVyL3BhY2thZ2VzL3N0b3JlL2RvY3Mvc3RvcmUtdGF4b25vbXkubWQpLFxuICogYW5kIGFzIGVsZW1lbnRzIGluIENvcHlTZXRzIGFuZCBDb3B5QmFncy5cbiAqXG4gKiBLZXlzIGNhbm5vdCBjb250YWluIHByb21pc2VzIG9yIGVycm9ycywgYXMgdGhlc2UgZG8gbm90IGhhdmUgdXNlZnVsXG4gKiBkaXN0cmlidXRlZCBlcXVhbGl0eSBzZW1hbnRpY3MuIEtleXMgYWxzbyBjYW5ub3QgY29udGFpbiBhbnkgQ29weVRhZ2dlZFxuICogZXhjZXB0IGZvciB0aG9zZSByZWNvZ25pemVkIGFzIENvcHlTZXRzLCBDb3B5QmFncywgYW5kIENvcHlNYXBzLlxuICpcbiAqIEJlIGF3YXJlIHRoYXQgd2UgbWF5IHJlY29nbml6ZSBtb3JlIENvcHlUYWdnZWRzIG92ZXIgdGltZSwgaW5jbHVkaW5nXG4gKiBDb3B5VGFnZ2VkcyByZWNvZ25pemVkIGFzIEtleXMuXG4gKlxuICogRGlzdHJpYnV0ZWQgZXF1YWxpdHkgaXMgbG9jYXRpb24gaW5kZXBlbmRlbnQuXG4gKiBUaGUgc2FtZSB0d28gS2V5cywgcGFzc2VkIHRvIGFub3RoZXIgbG9jYXRpb24sIHdpbGwgYmUgYGtleUVRYCB0aGVyZSBpZmZcbiAqIHRoZXkgYXJlIGBrZXlFUWAgaGVyZS4gKGBrZXlFUWAgdGVzdHMgZXF1YWxpdHkgYWNjb3JkaW5nIHRvIHRoZVxuICoga2V5IGRpc3RyaWJ1dGVkIGVxdWFsaXR5IHNlbWFudGljcy4pXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UGFzc2FibGV9IFBhdHRlcm5cbiAqXG4gKiBQYXR0ZXJucyBhcmUgUGFzc2FibGUgYXJiaXRyYXJpbHktbmVzdGVkIHBhc3MtYnktY29weSBjb250YWluZXJzXG4gKiAoQ29weUFycmF5LCBDb3B5UmVjb3JkLCBDb3B5U2V0LCBDb3B5QmFnLCBDb3B5TWFwKSBpbiB3aGljaCBldmVyeVxuICogbm9uLWNvbnRhaW5lciBsZWFmIGlzIGVpdGhlciBhIEtleSBvciBhIE1hdGNoZXIsIG9yIHN1Y2ggbGVhdmVzIGluIGlzb2xhdGlvblxuICogd2l0aCBubyBjb250YWluZXIuXG4gKlxuICogQSBQYXR0ZXJuIGFjdHMgYXMgYSBkZWNsYXJhdGl2ZSB0b3RhbCBwcmVkaWNhdGUgb3ZlciBQYXNzYWJsZXMsIHdoZXJlIGVhY2hcbiAqIFBhc3NhYmxlIGlzIGVpdGhlciBtYXRjaGVkIG9yIG5vdCBtYXRjaGVkIGJ5IGl0LiBFdmVyeSBLZXkgaXMgYWxzbyBhIFBhdHRlcm5cbiAqIHRoYXQgbWF0Y2hlcyBvbmx5IFwiaXRzZWxmXCIsIGkuZS4sIEtleXMgdGhhdCBhcmUgYGtleUVRYCB0byBpdCBhY2NvcmRpbmcgdG9cbiAqIHRoZSBrZXkgZGlzdHJpYnV0ZWQgZXF1YWxpdHkgc2VtYW50aWNzLlxuICpcbiAqIFBhdHRlcm5zIGNhbm5vdCBjb250YWluIHByb21pc2VzIG9yIGVycm9ycywgYXMgdGhlc2UgZG9cbiAqIG5vdCBoYXZlIHVzZWZ1bCBkaXN0cmlidXRlZCBlcXVhbGl0eSBvciBtYXRjaGluZyBzZW1hbnRpY3MuIExpa2V3aXNlLFxuICogbm8gUGF0dGVybiBjYW4gZGlzdGluZ3Vpc2ggYW1vbmcgcHJvbWlzZXMsIG9yIGRpc3Rpbmd1aXNoIGFtb25nIGVycm9ycy5cbiAqIFBhdHRlcm5zIGFsc28gY2Fubm90IGNvbnRhaW4gYW55IENvcHlUYWdnZWRzIGV4Y2VwdCBmb3IgdGhvc2UgcmVjb2duaXplZCBhc1xuICogQ29weVNldHMsIENvcHlCYWdzLCBDb3B5TWFwcywgb3IgTWF0Y2hlcnMuXG4gKlxuICogQmUgYXdhcmUgdGhhdCB3ZSBtYXkgcmVjb2duaXplIG1vcmUgQ29weVRhZ2dlZHMgb3ZlciB0aW1lLCBpbmNsdWRpbmdcbiAqIENvcHlUYWdnZWRzIHJlY29nbml6ZWQgYXMgUGF0dGVybnMuXG4gKlxuICogV2hldGhlciBhIFBhc3NhYmxlIGlzIG1hdGNoZWQgYnkgYSBnaXZlbiBQYXR0ZXJuIGlzIGxvY2F0aW9uIGluZGVwZW5kZW50LlxuICogSWYgYSBnaXZlbiBQYXNzYWJsZSBhbmQgUGF0dGVybiBhcmUgcGFzc2VkIHRvIGFub3RoZXIgbG9jYXRpb24sXG4gKiB0aGUgUGFzc2FibGUgd2lsbCBiZSBtYXRjaGVkIGJ5IHRoZSBQYXR0ZXJuIHRoZXJlIGlmZiB0aGUgUGFzc2FibGUgaXMgbWF0Y2hlZFxuICogYnkgdGhlIFBhdHRlcm4gaGVyZS5cbiAqXG4gKiBQYXR0ZXJucyBhcmUgb2Z0ZW4gdXNlZCBpbiBhIHR5cGUtbGlrZSBtYW5uZXIsIHRvIHJlcHJlc2VudCB0aGUgY2F0ZWdvcnlcbiAqIG9mIFBhc3NhYmxlcyB0aGF0IHRoZSBQYXR0ZXJuIGlzIGludGVuZGVkKiB0byBtYXRjaC4gVG8ga2VlcCB0aGlzXG4gKiBkaXN0aW5jdGlvbiBjbGVhciwgd2Ugb2Z0ZW4gdXNlIHRoZSBzdWZmaXggXCJTaGFwZVwiIHJhdGhlciB0aGFuIFwiUGF0dGVyblwiXG4gKiB0byBhdm9pZCBjb25mdXNpb24gd2hlbiB0aGUgUGF0dGVybiBpdHNlbGYgcmVwcmVzZW50c1xuICogc29tZSBjYXRlZ29yeSBvZiBQYXR0ZXJuLiBGb3IgZXhhbXBsZSwgYW4gXCJBbW91bnRTaGFwZVwiIHJlcHJlc2VudHMgdGhlXG4gKiBjYXRlZ29yeSBvZiBBbW91bnRzLiBBbmQgXCJBbW91bnRQYXR0ZXJuU2hhcGVcIiByZXByZXNlbnRzIHRoZVxuICogY2F0ZWdvcnkgb2YgUGF0dGVybnMgb3ZlciBBbW91bnRzLlxuICpcbiAqICogV2Ugc2F5IFwiaW50ZW5kZWRcIiBhYm92ZSBiZWNhdXNlIFBhdHRlcm5zLCBpbiBvcmRlciB0byBiZSBkZWNsYXJhdGl2ZVxuICogYW5kIFBhc3NhYmxlLCBjYW5ub3QgaGF2ZSB0aGUgZ2VuZXJhbGl0eSBvZiBwcmVkaWNhdGVzIHdyaXR0ZW4gaW4gYVxuICogVHVyaW5nLXVuaXZlcnNhbCBwcm9ncmFtbWluZyBsYW5ndWFnZS4gUmF0aGVyLCB0byByZXByZXNlbnQgdGhlIGNhdGVnb3J5IG9mXG4gKiB0aGluZ3MgaW50ZW5kZWQgdG8gYmUgYSBGb28sIGEgRm9vU2hhcGUgc2hvdWxkIHJlbGlhYmx5XG4gKiBhY2NlcHQgYWxsIEZvb3MgYW5kIHJlamVjdCBvbmx5IG5vbi1Gb29zLiBIb3dldmVyLCBhIEZvb1NoYXBlIG1heSBhbHNvIGFjY2VwdFxuICogbm9uLUZvb3MgdGhhdCBcImxvb2sgbGlrZVwiIG9yIFwiaGF2ZSB0aGUgc2FtZSBzaGFwZSBhc1wiIGdlbnVpbmUgRm9vcy5cbiAqIEFuIGFjY3VyYXRlIHByZWRpY2F0ZSBmb3IgZS5nLiBpbnB1dCB2YWxpZGF0aW9uIHdvdWxkIG5lZWQgdG8gc3VwcGxlbWVudCB0aGVcbiAqIFBhdHRlcm4gY2hlY2sgd2l0aCBjb2RlIHRvIGRldGVjdCB0aGUgcmVzaWR1YWwgY2FzZXMuXG4gKiBXZSBob3BlIHRoZSBcIlNoYXBlXCIgbWV0YXBob3IgaGVscHMgcmVtaW5kIHVzIG9mIHRoaXMgdHlwZS1saWtlIGltcHJlY2lzaW9uXG4gKiBvZiBQYXR0ZXJucy5cbiAqL1xuXG4vKiBUT0RPIHBhcmFtZXRlcml6ZSBDb3B5VGFnZ2VkIHRvIHN1cHBvcnQgdGhlc2UgcmVmaW5lbWVudHMqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdHlwZWRlZiB7Q29weVRhZ2dlZCAmIHtcbiAqICAgW1N5bWJvbC50b1N0cmluZ1RhZ106ICdjb3B5U2V0JyxcbiAqICAgcGF5bG9hZDogQXJyYXk8Sz4sXG4gKiB9fSBDb3B5U2V0XG4gKlxuICogQSBQYXNzYWJsZSBjb2xsZWN0aW9uIG9mIEtleXMgdGhhdCBhcmUgYWxsIG11dHVhbGx5IGRpc3Rpbmd1aXNoYWJsZVxuICogYWNjb3JkaW5nIHRvIHRoZSBrZXkgZGlzdHJpYnV0ZWQgZXF1YWxpdHkgc2VtYW50aWNzIGV4cG9zZWQgYnkgYGtleUVRYC5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdHlwZWRlZiB7Q29weVRhZ2dlZCAmIHtcbiAqICAgW1N5bWJvbC50b1N0cmluZ1RhZ106ICdjb3B5QmFnJyxcbiAqICAgcGF5bG9hZDogQXJyYXk8W0ssIGJpZ2ludF0+LFxuICogfX0gQ29weUJhZ1xuICpcbiAqIEEgUGFzc2FibGUgY29sbGVjdGlvbiBvZiBlbnRyaWVzIHdpdGggS2V5cyB0aGF0IGFyZSBhbGwgbXV0dWFsbHkgZGlzdGluZ3Vpc2hhYmxlXG4gKiBhY2NvcmRpbmcgdG8gdGhlIGtleSBkaXN0cmlidXRlZCBlcXVhbGl0eSBzZW1hbnRpY3MgZXhwb3NlZCBieSBga2V5RVFgLFxuICogZWFjaCB3aXRoIGEgY29ycmVzcG9uZGluZyBwb3NpdGl2ZSBjYXJkaW5hbGl0eS5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAdHlwZWRlZiB7Q29weVRhZ2dlZCAmIHtcbiAqICAgW1N5bWJvbC50b1N0cmluZ1RhZ106ICdjb3B5TWFwJyxcbiAqICAgcGF5bG9hZDogeyBrZXlzOiBBcnJheTxLPiwgdmFsdWVzOiBBcnJheTxWPiB9LFxuICogfX0gQ29weU1hcFxuICpcbiAqIEEgUGFzc2FibGUgY29sbGVjdGlvbiBvZiBlbnRyaWVzIHdpdGggS2V5cyB0aGF0IGFyZSBhbGwgbXV0dWFsbHkgZGlzdGluZ3Vpc2hhYmxlXG4gKiBhY2NvcmRpbmcgdG8gdGhlIGtleSBkaXN0cmlidXRlZCBlcXVhbGl0eSBzZW1hbnRpY3MgZXhwb3NlZCBieSBga2V5RVFgLFxuICogZWFjaCB3aXRoIGEgY29ycmVzcG9uZGluZyBQYXNzYWJsZSB2YWx1ZS5cbiAqL1xuXG4vKiBUT0RPOiBlbnVtZXJhdGUgTWF0Y2hlciB0YWcgdmFsdWVzPyovXG4vKipcbiAqIEB0eXBlZGVmIHtDb3B5VGFnZ2VkICYge1xuICogICBbU3ltYm9sLnRvU3RyaW5nVGFnXTogYG1hdGNoOiR7c3RyaW5nfWAsXG4gKiB9fSBNYXRjaGVyXG4gKlxuICogQSBQYXR0ZXJuIHJlcHJlc2VudGluZyB0aGUgcHJlZGljYXRlIGNoYXJhY3Rlcml6aW5nIGEgY2F0ZWdvcnkgb2YgUGFzc2FibGVzLFxuICogc3VjaCBhcyBzdHJpbmdzIG9yIDgtYml0IHVuc2lnbmVkIGludGVnZXIgbnVtYmVycyBvciBDb3B5QXJyYXlzIG9mIFJlbW90YWJsZXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yZU9wdGlvbnNcbiAqIE9mIHRoZSBkaW1lbnNpb25zIG9uIHdoaWNoIEtleWVkU3RvcmVzIGNhbiBkaWZmZXIsIHdlIG9ubHkgcmVwcmVzZW50IGEgZmV3XG4gKiBvZiB0aGVtIGFzIHN0YW5kYXJkIG9wdGlvbnMuIEEgZ2l2ZW4gc3RvcmUgbWFrZXIgc2hvdWxkIGRvY3VtZW50IHdoaWNoXG4gKiBvcHRpb25zIGl0IHN1cHBvcnRzLCBhcyB3ZWxsIGFzIGl0cyBwb3NpdGlvbnMgb24gZGltZW5zaW9ucyBmb3Igd2hpY2ggaXRcbiAqIGRvZXMgbm90IHN1cHBvcnQgb3B0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2xvbmdMaXZlZD10cnVlXSBXaGljaCB3YXkgdG8gb3B0aW1pemUgYSB3ZWFrIHN0b3JlLiBUcnVlIG1lYW5zXG4gKiB0aGF0IHdlIGV4cGVjdCB0aGlzIHdlYWsgc3RvcmUgdG8gb3V0bGl2ZSBtb3N0IG9mIGl0cyBrZXlzLCBpbiB3aGljaFxuICogY2FzZSB3ZSBpbnRlcm5hbGx5IG1heSB1c2UgYSBKYXZhU2NyaXB0IGBXZWFrTWFwYC4gT3RoZXJ3aXNlIHdlIGludGVybmFsbHlcbiAqIG1heSB1c2UgYSBKYXZhU2NyaXB0IGBNYXBgLlxuICogRGVmYXVsdHMgdG8gdHJ1ZSwgc28gcGxlYXNlIG1hcmsgc2hvcnQgbGl2ZWQgc3RvcmVzIGV4cGxpY2l0bHkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtkdXJhYmxlPWZhbHNlXSAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgc3RvcmUgc3Vydml2ZSB0ZXJtaW5hdGlvblxuICogICBvZiBpdHMgY29udGFpbmluZyBwcm9jZXNzLCBhbGxvd2luZyBmb3IgcmVzdGFydCBvciB1cGdyYWRlIGJ1dCBhdCB0aGUgY29zdFxuICogICBvZiBmb3JiaWRkaW5nIHN0b3JhZ2Ugb2YgcmVmZXJlbmNlcyB0byBlcGhlbWVyYWwgZGF0YS4gIERlZmF1bHRzIHRvIGZhbHNlLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZmFrZUR1cmFibGU9ZmFsc2VdICBUaGlzIHN0b3JlIHByZXRlbmRzIHRvIGJlIGEgZHVyYWJsZSBzdG9yZVxuICogICBidXQgZG9lcyBub3QgZW5mb3JjZSB0aGF0IHRoZSB0aGluZ3Mgc3RvcmVkIGluIGl0IGFjdHVhbGx5IGJlIHRoZW1zZWx2ZXNcbiAqICAgZHVyYWJsZSAod2hlcmVhcyBhbiBhY3R1YWwgZHVyYWJsZSBzdG9yZSB3b3VsZCBmb3JiaWQgc3RvcmFnZSBvZiBzdWNoXG4gKiAgIGl0ZW1zKS4gIFRoaXMgaXMgaW4gc2VydmljZSBvZiBhbGxvd2luZyBpbmNyZW1lbnRhbCB0cmFuc2l0aW9uIHRvIHVzZSBvZlxuICogICBkdXJhYmxlIHN0b3JlcywgdG8gZW5hYmxlIG5vcm1hbCBvcGVyYXRpb24gYW5kIHRlc3Rpbmcgd2hlbiBzb21lIHN0dWZmXG4gKiAgIGludGVuZGVkIHRvIGV2ZW50dWFsbHkgYmUgZHVyYWJsZSBoYXMgbm90IHlldCBiZWVuIG1hZGUgZHVyYWJsZS4gIEEgc3RvcmVcbiAqICAgbWFya2VkIGFzIGZha2VEdXJhYmxlIHdpbGwgYXBwZWFyIHRvIG9wZXJhdGUgbm9ybWFsbHkgYnV0IGFueSBhdHRlbXB0IHRvXG4gKiAgIHVwZ3JhZGUgaXRzIGNvbnRhaW5pbmcgdmF0IHdpbGwgZmFpbCB3aXRoIGFuIGVycm9yLlxuICogQHByb3BlcnR5IHtQYXR0ZXJufSBba2V5U2hhcGVdXG4gKiBAcHJvcGVydHkge1BhdHRlcm59IFt2YWx1ZVNoYXBlXVxuICovXG5cbi8qKlxuICogTW9zdCBzdG9yZSBtZXRob2RzIGFyZSBpbiBvbmUgb2YgdGhyZWUgY2F0ZWdvcmllc1xuICogICAqIGxvb2t1cCBtZXRob2RzIChgaGFzYCxgZ2V0YClcbiAqICAgKiB1cGRhdGUgbWV0aG9kcyAoYGFkZGAsYGluaXRgLGBzZXRgLGBkZWxldGVgLGBhZGRBbGxgKVxuICogICAqIHF1ZXJ5IG1ldGhvZHMgKGBzbmFwc2hvdGAsYGtleXNgLGB2YWx1ZXNgLGBlbnRyaWVzYCxgZ2V0U2l6ZWApXG4gKiAgICogcXVlcnktdXBkYXRlIG1ldGhvZHMgKGBjbGVhcmApXG4gKlxuICogV2Vha1N0b3JlcyBoYXZlIHRoZSBsb29rdXAgYW5kIHVwZGF0ZSBtZXRob2RzIGJ1dCBub3QgdGhlIHF1ZXJ5XG4gKiBvciBxdWVyeS11cGRhdGUgbWV0aG9kcy5cbiAqIE5vbi13ZWFrIFN0b3JlcyBhcmUgbGlrZSB0aGVpciBjb3JyZXNwb25kaW5nIFdlYWtTdG9yZXMsIGJ1dCB3aXRoIHRoZVxuICogYWRkaXRpb25hbCBxdWVyeSBhbmQgcXVlcnktdXBkYXRlIG1ldGhvZHMuXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleSAmIG9iamVjdH0gS1xuICogQHR5cGVkZWYge29iamVjdH0gV2Vha1NldFN0b3JlXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IGJvb2xlYW59IGhhc1xuICogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwgdGhvdWdoIHRoZVxuICogYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoaXMgc3RvcmUuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IHZvaWR9IGFkZFxuICogQWRkIHRoZSBrZXkgdG8gdGhlIHNldCBpZiBpdCBpcyBub3QgYWxyZWFkeSB0aGVyZS4gRG8gbm90aGluZyBzaWxlbnRseSBpZlxuICogYWxyZWFkeSB0aGVyZS5cbiAqIFRoZSBrZXkgbXVzdCBiZSBvbmUgYWxsb3dlZCBieSB0aGlzIHN0b3JlLiBGb3IgZXhhbXBsZSBhIHNjYWxhciBzdG9yZSBvbmx5XG4gKiBhbGxvd3MgcHJpbWl0aXZlcyBhbmQgcmVtb3RhYmxlcy5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gZGVsZXRlXG4gKiBSZW1vdmUgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleXM6IENvcHlTZXQ8Sz4gfCBJdGVyYWJsZTxLPikgPT4gdm9pZH0gYWRkQWxsXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleX0gS1xuICogQHR5cGVkZWYge29iamVjdH0gU2V0U3RvcmVcbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gYm9vbGVhbn0gaGFzXG4gKiBDaGVjayBpZiBhIGtleSBleGlzdHMuIFRoZSBrZXkgY2FuIGJlIGFueSBKYXZhU2NyaXB0IHZhbHVlLCB0aG91Z2ggdGhlXG4gKiBhbnN3ZXIgd2lsbCBhbHdheXMgYmUgZmFsc2UgZm9yIGtleXMgdGhhdCBjYW5ub3QgYmUgZm91bmQgaW4gdGhpcyBzdG9yZS5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gYWRkXG4gKiBBZGQgdGhlIGtleSB0byB0aGUgc2V0IGlmIGl0IGlzIG5vdCBhbHJlYWR5IHRoZXJlLiBEbyBub3RoaW5nIHNpbGVudGx5IGlmXG4gKiBhbHJlYWR5IHRoZXJlLlxuICogVGhlIGtleSBtdXN0IGJlIG9uZSBhbGxvd2VkIGJ5IHRoaXMgc3RvcmUuIEZvciBleGFtcGxlIGEgc2NhbGFyIHN0b3JlIG9ubHlcbiAqIGFsbG93cyBwcmltaXRpdmVzIGFuZCByZW1vdGFibGVzLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiB2b2lkfSBkZWxldGVcbiAqIFJlbW92ZSB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5czogQ29weVNldDxLPiB8IEl0ZXJhYmxlPEs+KSA9PiB2b2lkfSBhZGRBbGxcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuKSA9PiBJdGVyYWJsZTxLPn0ga2V5c1xuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4pID0+IEl0ZXJhYmxlPEs+fSB2YWx1ZXNcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuKSA9PiBDb3B5U2V0PEs+fSBzbmFwc2hvdFxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4pID0+IG51bWJlcn0gZ2V0U2l6ZVxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4pID0+IHZvaWR9IGNsZWFyXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0tleSAmIG9iamVjdH0gS1xuICogQHRlbXBsYXRlIHtQYXNzYWJsZX0gVlxuICogQHR5cGVkZWYge29iamVjdH0gV2Vha01hcFN0b3JlXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IGJvb2xlYW59IGhhc1xuICogQ2hlY2sgaWYgYSBrZXkgZXhpc3RzLiBUaGUga2V5IGNhbiBiZSBhbnkgSmF2YVNjcmlwdCB2YWx1ZSwgdGhvdWdoIHRoZVxuICogYW5zd2VyIHdpbGwgYWx3YXlzIGJlIGZhbHNlIGZvciBrZXlzIHRoYXQgY2Fubm90IGJlIGZvdW5kIGluIHRoaXMgc3RvcmUuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEspID0+IFZ9IGdldFxuICogUmV0dXJuIGEgdmFsdWUgZm9yIHRoZSBrZXkuIFRocm93cyBpZiBub3QgZm91bmQuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEssIHZhbHVlOiBWKSA9PiB2b2lkfSBpbml0XG4gKiBJbml0aWFsaXplIHRoZSBrZXkgb25seSBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QuXG4gKiBUaGUga2V5IG11c3QgYmUgb25lIGFsbG93ZWQgYnkgdGhpcyBzdG9yZS4gRm9yIGV4YW1wbGUgYSBzY2FsYXIgc3RvcmUgb25seVxuICogYWxsb3dzIHByaW1pdGl2ZXMgYW5kIHJlbW90YWJsZXMuXG4gKiBAcHJvcGVydHkgeyhrZXk6IEssIHZhbHVlOiBWKSA9PiB2b2lkfSBzZXRcbiAqIFNldCB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiB2b2lkfSBkZWxldGVcbiAqIFJlbW92ZSB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoZW50cmllczogQ29weU1hcDxLLFY+IHwgSXRlcmFibGU8W0ssVl0+KSA9PiB2b2lkfSBhZGRBbGxcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7S2V5fSBLXG4gKiBAdGVtcGxhdGUge1Bhc3NhYmxlfSBWXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBNYXBTdG9yZVxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBib29sZWFufSBoYXNcbiAqIENoZWNrIGlmIGEga2V5IGV4aXN0cy4gVGhlIGtleSBjYW4gYmUgYW55IEphdmFTY3JpcHQgdmFsdWUsIHRob3VnaCB0aGVcbiAqIGFuc3dlciB3aWxsIGFsd2F5cyBiZSBmYWxzZSBmb3Iga2V5cyB0aGF0IGNhbm5vdCBiZSBmb3VuZCBpbiB0aGlzIG1hcFxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBWfSBnZXRcbiAqIFJldHVybiBhIHZhbHVlIGZvciB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gaW5pdFxuICogSW5pdGlhbGl6ZSB0aGUga2V5IG9ubHkgaWYgaXQgZG9lc24ndCBhbHJlYWR5IGV4aXN0LlxuICogVGhlIGtleSBtdXN0IGJlIG9uZSBhbGxvd2VkIGJ5IHRoaXMgc3RvcmUuIEZvciBleGFtcGxlIGEgc2NhbGFyIHN0b3JlIG9ubHlcbiAqIGFsbG93cyBwcmltaXRpdmVzIGFuZCByZW1vdGFibGVzLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gc2V0XG4gKiBTZXQgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gZGVsZXRlXG4gKiBSZW1vdmUgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGVudHJpZXM6IENvcHlNYXA8SyxWPiB8IEl0ZXJhYmxlPFtLLFZdPikgPT4gdm9pZH0gYWRkQWxsXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybiwgdmFsdWVQYXR0PzogUGF0dGVybikgPT4gSXRlcmFibGU8Sz59IGtleXNcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLCB2YWx1ZVBhdHQ/OiBQYXR0ZXJuKSA9PiBJdGVyYWJsZTxWPn0gdmFsdWVzXG4gKiBAcHJvcGVydHkgeyhcbiAqICAga2V5UGF0dD86IFBhdHRlcm4sXG4gKiAgIHZhbHVlUGF0dD86IFBhdHRlcm5cbiAqICkgPT4gSXRlcmFibGU8W0ssVl0+fSBlbnRyaWVzXG4gKiBAcHJvcGVydHkgeyhrZXlQYXR0PzogUGF0dGVybiwgdmFsdWVQYXR0PzogUGF0dGVybikgPT4gQ29weU1hcDxLLFY+fSBzbmFwc2hvdFxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4sIHZhbHVlUGF0dD86IFBhdHRlcm4pID0+IG51bWJlcn0gZ2V0U2l6ZVxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4sIHZhbHVlUGF0dD86IFBhdHRlcm4pID0+IHZvaWR9IGNsZWFyXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBEZXByZWNhdGVkIExlZ2FjeSAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEB0eXBlZGVmIHtvYmplY3R9IExlZ2FjeVdlYWtNYXBcbiAqIExlZ2FjeVdlYWtNYXAgaXMgZGVwcmVjYXRlZC4gVXNlIFdlYWtNYXBTdG9yZSBpbnN0ZWFkIGlmIHBvc3NpYmxlLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBib29sZWFufSBoYXNcbiAqIENoZWNrIGlmIGEga2V5IGV4aXN0c1xuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBWfSBnZXRcbiAqIFJldHVybiBhIHZhbHVlIGZvciB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gaW5pdFxuICogSW5pdGlhbGl6ZSB0aGUga2V5IG9ubHkgaWYgaXRcbiAqIGRvZXNuJ3QgYWxyZWFkeSBleGlzdFxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gc2V0XG4gKiBTZXQgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gZGVsZXRlXG4gKiBSZW1vdmUgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEB0eXBlZGVmIHtvYmplY3R9IExlZ2FjeU1hcFxuICogTGVnYWN5TWFwIGlzIGRlcHJlY2F0ZWQuIFVzZSBNYXBTdG9yZSBpbnN0ZWFkIGlmIHBvc3NpYmxlLlxuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBib29sZWFufSBoYXNcbiAqIENoZWNrIGlmIGEga2V5IGV4aXN0c1xuICogQHByb3BlcnR5IHsoa2V5OiBLKSA9PiBWfSBnZXRcbiAqIFJldHVybiBhIHZhbHVlIGZvciB0aGUga2V5LiBUaHJvd3MgaWYgbm90IGZvdW5kLlxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gaW5pdFxuICogSW5pdGlhbGl6ZSB0aGUga2V5IG9ubHkgaWYgaXRcbiAqIGRvZXNuJ3QgYWxyZWFkeSBleGlzdFxuICogQHByb3BlcnR5IHsoa2V5OiBLLCB2YWx1ZTogVikgPT4gdm9pZH0gc2V0XG4gKiBTZXQgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KGtleTogSykgPT4gdm9pZH0gZGVsZXRlXG4gKiBSZW1vdmUgdGhlIGtleS4gVGhyb3dzIGlmIG5vdCBmb3VuZC5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSXRlcmFibGU8Sz59IGtleXNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSXRlcmFibGU8Vj59IHZhbHVlc1xuICogQHByb3BlcnR5IHsoKSA9PiBJdGVyYWJsZTxbSyxWXT59IGVudHJpZXNcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gbnVtYmVyfSBnZXRTaXplXG4gKiBAcHJvcGVydHkgeygpID0+IHZvaWR9IGNsZWFyXG4gKi9cblxuLyogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8qL1xuXG4vKipcbiAqIEB0eXBlZGVmIHstMSB8IDAgfCAxfSBSYW5rQ29tcGFyaXNvblxuICogVGhlIHJlc3VsdCBvZiBhIGBSYW5rQ29tcGFyZWAgZnVuY3Rpb24gdGhhdCBkZWZpbmVzIGEgcmFuay1vcmRlciwgaS5lLixcbiAqIGEgdG90YWwgcHJlb3JkZXIgaW4gd2hpY2ggZGlmZmVyZW50IGVsZW1lbnRzIGFyZSBhbHdheXMgY29tcGFyYWJsZSBidXRcbiAqIGNhbiBiZSB0aWVkIGZvciB0aGUgc2FtZSByYW5rLiBTZWUgYFJhbmtDb21wYXJlYC5cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBSYW5rQ29tcGFyZVxuICogUmV0dXJucyBgLTFgLCBgMGAsIG9yIGAxYCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgcmFuayBvZiBgbGVmdGBcbiAqIGlzIGJlZm9yZSwgdGllZC13aXRoLCBvciBhZnRlciB0aGUgcmFuayBvZiBgcmlnaHRgLlxuICpcbiAqIFRoaXMgY29tcGFyaXNvbiBmdW5jdGlvbiBpcyB2YWxpZCBhcyBhcmd1bWVudCB0b1xuICogYEFycmF5LnByb3RvdHlwZS5zb3J0YC4gVGhpcyBpcyBzb21ldGltZXMgZGVzY3JpYmVkIGFzIGEgXCJ0b3RhbCBvcmRlclwiXG4gKiBidXQsIGRlcGVuZGluZyBvbiB5b3VyIGRlZmluaXRpb25zLCB0aGlzIGlzIHRlY2huaWNhbGx5IGluY29ycmVjdCBiZWNhdXNlXG4gKiBpdCBtYXkgcmV0dXJuIGAwYCB0byBpbmRpY2F0ZSB0aGF0IHR3byBkaXN0aW5ndWlzaGFibGUgZWxlbWVudHMgc3VjaCBhc1xuICogYC0wYCBhbmQgYDBgIGFyZSB0aWVkIChpLmUuLCBhcmUgaW4gdGhlIHNhbWUgZXF1aXZhbGVuY2UgY2xhc3NcbiAqIGZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBvcmRlcmluZykuIElmIGVhY2ggc3VjaCBlcXVpdmFsZW5jZSBjbGFzcyBpc1xuICogYSAqcmFuayogYW5kIHJhbmtzIGFyZSBkaXNqb2ludCwgdGhlbiB0aGlzIFwicmFuayBvcmRlclwiIGlzIGFcbiAqIHRydWUgdG90YWwgb3JkZXIgb3ZlciB0aGVzZSByYW5rcy4gSW4gbWF0aGVtYXRpY3MgdGhpcyBnb2VzIGJ5IHNldmVyYWxcbiAqIG90aGVyIG5hbWVzIHN1Y2ggYXMgXCJ0b3RhbCBwcmVvcmRlclwiLlxuICpcbiAqIFRoaXMgZnVuY3Rpb24gZXN0YWJsaXNoZXMgYSB0b3RhbCByYW5rIG9yZGVyIG92ZXIgYWxsIHBhc3NhYmxlcy5cbiAqIFRvIGRvIHNvIGl0IG1ha2VzIGFyYml0cmFyeSBjaG9pY2VzLCBzdWNoIGFzIHRoYXQgYWxsIHN0cmluZ3NcbiAqIGFyZSBhZnRlciBhbGwgbnVtYmVycy4gVGh1cywgdGhpcyBvcmRlciBpcyBub3QgaW50ZW5kZWQgdG8gYmVcbiAqIHVzZWQgZGlyZWN0bHkgYXMgYSBjb21wYXJpc29uIHdpdGggdXNlZnVsIHNlbWFudGljcy4gSG93ZXZlciwgaXQgbXVzdCBiZVxuICogY2xvc2VseSBlbm91Z2ggcmVsYXRlZCB0byBzdWNoIGNvbXBhcmlzb25zIHRvIGFpZCBpbiBpbXBsZW1lbnRpbmdcbiAqIGxvb2t1cHMgYmFzZWQgb24gdGhvc2UgY29tcGFyaXNvbnMuIEZvciBleGFtcGxlLCBpbiBvcmRlciB0byBnZXQgYSB0b3RhbFxuICogb3JkZXIgYW1vbmcgcmFua3MsIHdlIHB1dCBgTmFOYCBhZnRlciBhbGwgb3RoZXIgSmF2YVNjcmlwdCBcIm51bWJlclwiIHZhbHVlc1xuICogKGkuZS4sIElFRUUgNzU0IGZsb2F0aW5nLXBvaW50IHZhbHVlcykuIEJ1dCBvdGhlcndpc2UsIHdlIHJhbmsgSmF2YVNjcmlwdFxuICogbnVtYmVycyBieSBzaWduZWQgbWFnbml0dWRlLCB3aXRoIGAwYCBhbmQgYC0wYCB0aWVkLiBBIHNlbWFudGljYWxseSB1c2VmdWxcbiAqIG9yZGVyaW5nIHdvdWxkIGFsc28gY29tcGFyZSBtYWduaXR1ZGVzLCBhbmQgc28gYWdyZWUgd2l0aCB0aGUgcmFuayBvcmRlcmluZ1xuICogb2YgYWxsIHZhbHVlcyBvdGhlciB0aGFuIGBOYU5gLiBBbiBhcnJheSBzb3J0ZWQgYnkgcmFuayB3b3VsZCBlbmFibGUgcmFuZ2VcbiAqIHF1ZXJpZXMgYnkgbWFnbml0dWRlLlxuICogQHBhcmFtIHtQYXNzYWJsZX0gbGVmdFxuICogQHBhcmFtIHtQYXNzYWJsZX0gcmlnaHRcbiAqIEByZXR1cm5zIHtSYW5rQ29tcGFyaXNvbn1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSYW5rQ29tcGFyZX0gRnVsbENvbXBhcmVcbiAqIEEgYEZ1bGxDb21wYXJlYCBmdW5jdGlvbiBzYXRpc2ZpZXMgYWxsIHRoZSBpbnZhcmlhbnRzIHN0YXRlZCBiZWxvdyBmb3JcbiAqIGBSYW5rQ29tcGFyZWAncyByZWxhdGlvbiB3aXRoIEtleUNvbXBhcmUuXG4gKiBJbiBhZGRpdGlvbiwgaXRzIGVxdWFsaXR5IGlzIGFzIHByZWNpc2UgYXMgdGhlIGBLZXlDb21wYXJlYFxuICogY29tcGFyaXNvbiBkZWZpbmVkIGJlbG93LCBpbiB0aGF0LCBmb3IgYWxsIEtleXMgYHhgIGFuZCBgeWAsXG4gKiBgRnVsbENvbXBhcmUoeCwgeSkgPT09IDBgIGlmZiBgS2V5Q29tcGFyZSh4LCB5KSA9PT0gMGAuXG4gKlxuICogRm9yIG5vbi1LZXkgaW5wdXRzLCBhIGBGdWxsQ29tcGFyZWAgc2hvdWxkIGJlIGV4YWN0bHkgYXMgaW1wcmVjaXNlIGFzXG4gKiBgUmFua0NvbXBhcmVgLiBGb3IgZXhhbXBsZSwgYm90aCB3aWxsIHRyZWF0IGFsbCBlcnJvcnMgYXMgaW4gdGhlIHNhbWVcbiAqIGVxdWl2YWxlbmNlIGNsYXNzLiBCb3RoIHdpbGwgdHJlYXQgYWxsIHByb21pc2VzIGFzIGluIHRoZSBzYW1lXG4gKiBlcXVpdmFsZW5jZSBjbGFzcy4gQm90aCB3aWxsIG9yZGVyIHRhZ2dlZCByZWNvcmRzIHRoZSBzYW1lIHdheSwgd2hpY2ggaXNcbiAqIGFkbWl0dGVkbHkgd2VpcmQgYmVjYXVzZSBzb21lIChzdWNoIGFzIENvcHlTZXRzLCBDb3B5QmFncywgYW5kIENvcHlNYXBzKVxuICogd2lsbCBiZSBjb25zaWRlcmVkIEtleXMgd2hpbGUgb3RoZXJzIHdpbGwgYmUgY29uc2lkZXJlZCBub24tS2V5cy5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJhbmtDb21wYXJhdG9yS2l0XG4gKiBAcHJvcGVydHkge1JhbmtDb21wYXJlfSBjb21wYXJhdG9yXG4gKiBAcHJvcGVydHkge1JhbmtDb21wYXJlfSBhbnRpQ29tcGFyYXRvclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRnVsbENvbXBhcmF0b3JLaXRcbiAqIEBwcm9wZXJ0eSB7RnVsbENvbXBhcmV9IGNvbXBhcmF0b3JcbiAqIEBwcm9wZXJ0eSB7RnVsbENvbXBhcmV9IGFudGlDb21wYXJhdG9yXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7LTEgfCAwIHwgMSB8IE5hTn0gS2V5Q29tcGFyaXNvblxuICogVGhlIHJlc3VsdCBvZiBhIGBLZXlDb21wYXJlYCBmdW5jdGlvbiB0aGF0IGRlZmluZXMgYSBtZWFuaW5nZnVsXG4gKiBhbmQgbWVhbmluZ2Z1bGx5IHByZWNpc2UgcGFydGlhbCBvcmRlciBvZiBLZXkgdmFsdWVzLiBTZWUgYEtleUNvbXBhcmVgLlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEtleUNvbXBhcmVcbiAqIGBjb21wYXJlS2V5c2AgaW1wbGVtZW50cyBhIHBhcnRpYWwgb3JkZXIgb3ZlciBrZXlzLiBBcyB3aXRoIHRoZVxuICogcmFuayBvcmRlcmluZyBwcm9kdWNlZCBieSBgY29tcGFyZVJhbmtgLCAtMSwgMCwgYW5kIDEgbWVhblxuICogXCJsZXNzIHRoYW5cIiwgXCJlcXVpdmFsZW50IHRvXCIsIGFuZCBcImdyZWF0ZXIgdGhhblwiIHJlc3BlY3RpdmVseS5cbiAqIE5hTiBtZWFucyBcImluY29tcGFyYWJsZVwiIC0tLSB0aGUgZmlyc3Qga2V5IGlzIG5vdCBsZXNzLCBlcXVpdmFsZW50LFxuICogb3IgZ3JlYXRlciB0aGFuIHRoZSBzZWNvbmQuIEZvciBleGFtcGxlLCBzdWJzZXRzIG92ZXIgc2V0cyBpc1xuICogYSBwYXJ0aWFsIG9yZGVyLlxuICpcbiAqIEJ5IHVzaW5nIE5hTiBmb3IgXCJpbmNvbXBhcmFibGVcIiwgdGhlIG5vcm1hbCBlcXVpdmFsZW5jZSBmb3IgdXNpbmdcbiAqIHRoZSByZXR1cm4gdmFsdWUgaW4gYSBjb21wYXJpc29uIGlzIHByZXNlcnZlZC5cbiAqIGBjb21wYXJlS2V5cyhsZWZ0LCByaWdodCkgPj0gMGAgaWZmIGBsZWZ0YCBpcyBncmVhdGVyIHRoYW4gb3JcbiAqIGVxdWl2YWxlbnQgdG8gYHJpZ2h0YCBpbiB0aGUgcGFydGlhbCBvcmRlcmluZy5cbiAqXG4gKiBLZXkgb3JkZXIgKGEgcGFydGlhbCBvcmRlcikgYW5kIHJhbmsgb3JkZXIgKGEgdG90YWwgcHJlb3JkZXIpIGFyZVxuICogY28tZGVzaWduZWQgc28gdGhhdCB3ZSBzdG9yZSBQYXNzYWJsZXMgaW4gcmFuayBvcmRlciBhbmQgaW5kZXggaW50byB0aGVtXG4gKiB3aXRoIGtleXMgZm9yIGtleS1iYXNlZCBxdWVyaWVzLiBUbyBrZWVwIHRoZXNlIGRpc3RpbmN0LCB3aGVuIHNwZWFraW5nXG4gKiBpbmZvcm1hbGx5IGFib3V0IHJhbmssIHdlIHRhbGsgYWJvdXQgXCJlYXJsaWVyXCIgYW5kIFwibGF0ZXJcIi4gV2hlbiBzcGVha2luZ1xuICogaW5mb3JtYWxseSBhYm91dCBrZXlzLCB3ZSB0YWxrIGFib3V0IFwic21hbGxlclwiIGFuZCBcImJpZ2dlclwiLlxuICpcbiAqIEluIGJvdGggb3JkZXJzLCB0aGUgcmV0dXJuLTAgY2FzZSBkZWZpbmVzXG4gKiBhbiBlcXVpdmFsZW5jZSBjbGFzcywgaS5lLiwgdGhvc2UgdGhhdCBhcmUgdGllZCBmb3IgdGhlIHNhbWUgcGxhY2UgaW4gdGhlXG4gKiBvcmRlci4gVGhlIGdsb2JhbCBpbnZhcmlhbnQgdGhhdCB3ZSBuZWVkIGJldHdlZW4gdGhlIHR3byBvcmRlcnMgaXMgdGhhdCB0aGVcbiAqIGtleSBvcmRlciBlcXVpdmFsZW5jZSBjbGFzcyBpcyBhbHdheXMgYXQgbGVhc3QgYXMgcHJlY2lzZSBhcyB0aGVcbiAqIHJhbmsgb3JkZXIgZXF1aXZhbGVuY2UgY2xhc3MuIElPVywgaWYgYGNvbXBhcmVLZXlzKFgsWSkgPT09IDBgIHRoZW5cbiAqIGBjb21wYXJlUmFuayhYLFkpID09PSAwYC4gQnV0IG5vdCB2aWNlIHZlcnNhLiBGb3IgZXhhbXBsZSwgdHdvIGRpZmZlcmVudFxuICogcmVtb3RhYmxlcyBhcmUgdGhlIHNhbWUgcmFuayBidXQgaW5jb21wYXJhYmxlIGFzIGtleXMuXG4gKlxuICogQSBmdXJ0aGVyIGludmFyaWFudCBpcyBpZiBgY29tcGFyZUtleXMoWCxZKSA8IDBgIHRoZW5cbiAqIGBjb21wYXJlUmFuayhYLFkpIDwgMGAsIGkuZS4sIGlmIFggaXMgc21hbGxlciB0aGFuIFkgaW4ga2V5IG9yZGVyLCB0aGVuIFhcbiAqIG11c3QgYmUgZWFybGllciB0aGFuIFkgaW4gcmFuayBvcmRlci4gQnV0IG5vdCB2aWNlIHZlcnNhLlxuICogWCBjYW4gYmUgZXF1aXZhbGVudCB0byBvciBlYXJsaWVyIHRoYW4gWSBpbiByYW5rIG9yZGVyIGFuZCBzdGlsbCBiZVxuICogaW5jb21wYXJhYmxlIHdpdGggWSBpbiBrZXkgb3JkZXIuIEZvciBleGFtcGxlLCB0aGUgcmVjb3JkIGB7YjogMywgYTogNX1gIGlzXG4gKiBlYXJsaWVyIHRoYW4gdGhlIHJlY29yZCBge2I6IDUsIGE6IDN9YCBpbiByYW5rIG9yZGVyIGJ1dCB0aGV5IGFyZVxuICogaW5jb21wYXJhYmxlIGFzIGtleXMuIEFuZCB0d28gZGlzdGluY3QgcmVtb3RhYmxlcyBzdWNoIGFzIGBGYXIoJ1gnLCB7fSlgIGFuZFxuICogYEZhcignWScsIHt9KWAgYXJlIGVxdWl2YWxlbnQgaW4gcmFuayBvcmRlciBidXQgaW5jb21wYXJhYmxlIGFzIEtleXMuXG4gKlxuICogVGhpcyBsZXRzIHVzIHRyYW5zbGF0ZSBhIHJhbmdlIHNlYXJjaCBvdmVyIHRoZVxuICogcGFydGlhbCBrZXkgb3JkZXIgaW50byBhIHJhbmdlIHNlYXJjaCBvdmVyIHJhbmsgb3JkZXIgZm9sbG93ZWQgYnkgZmlsdGVyaW5nXG4gKiBvdXQgdGhvc2UgdGhhdCBkb24ndCBtYXRjaC4gVG8gZ2V0IHRoaXMgZWZmZWN0LCB3ZSBzdG9yZSB0aGUgZWxlbWVudHMgb2ZcbiAqIGEgc2V0IGluIGFuIGFycmF5IHNvcnRlZCBpbiByZXZlcnNlIHJhbmsgb3JkZXIsIGZyb20gbGF0ZXIgdG8gZWFybGllci5cbiAqIENvbWJpbmVkIHdpdGggb3VyIGxleGljb2dyYXBoaWMgY29tcGFyaXNvbiBvZiBhcnJheXMsIGlmIHNldCBYIGlzIGEgc3Vic2V0XG4gKiBvZiBzZXQgWSB0aGVuIHRoZSBhcnJheSByZXByZXNlbnRpbmcgc2V0IFggd2lsbCBiZSBhbiBlYXJsaWVyIHJhbmsgdGhhdCB0aGVcbiAqIGFycmF5IHJlcHJlc2VudGluZyBzZXQgWS5cbiAqXG4gKiBAcGFyYW0ge0tleX0gbGVmdFxuICogQHBhcmFtIHtLZXl9IHJpZ2h0XG4gKiBAcmV0dXJucyB7S2V5Q29tcGFyaXNvbn1cbiAqL1xuXG4vKiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8gU2hvdWxkIGJlIGludGVybmFsIG9ubHkgdHlwZXMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyovXG5cbi8qKlxuICogQHR5cGVkZWYge1tzdHJpbmcsIHN0cmluZ119IFJhbmtDb3ZlclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1tudW1iZXIsIG51bWJlcl19IEluZGV4Q292ZXJcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRQYXNzU3R5bGVDb3ZlclxuICogQXNzb2NpYXRlIHdpdGggZWFjaCBwYXNzU3R5bGUgYSBSYW5rQ292ZXIgdGhhdCBtYXkgYmUgYW4gb3ZlcmVzdGltYXRlLFxuICogYW5kIHdob3NlIHJlc3VsdHMgdGhlcmVmb3JlIG5lZWQgdG8gYmUgZmlsdGVyZWQgZG93bi4gRm9yIGV4YW1wbGUsIGJlY2F1c2VcbiAqIHRoZXJlIGlzIG5vdCBhIHNtYWxsZXN0IG9yIGJpZ2dlc3QgYmlnaW50LCBib3VuZCBpdCBieSBgTmFOYCAodGhlIGxhc3QgcGxhY2VcbiAqIG51bWJlcikgYW5kIGAnJ2AgKHRoZSBlbXB0eSBzdHJpbmcsIHdoaWNoIGlzIHRoZSBmaXJzdCBwbGFjZSBzdHJpbmcpLiBUaHVzLFxuICogYSByYW5nZSBxdWVyeSB1c2luZyB0aGlzIHJhbmdlIG1heSBpbmNsdWRlIHRoZXNlIHZhbHVlcywgd2hpY2ggd291bGQgdGhlblxuICogbmVlZCB0byBiZSBmaWx0ZXJlZCBvdXQuXG4gKiBAcGFyYW0ge1Bhc3NTdHlsZX0gcGFzc1N0eWxlXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldEluZGV4Q292ZXJcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc29ydGVkXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gcmFua0NvdmVyXG4gKiBAcmV0dXJucyB7SW5kZXhDb3Zlcn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBDb3ZlcmVkRW50cmllc1xuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7SW5kZXhDb3Zlcn0gaW5kZXhDb3ZlclxuICogQHJldHVybnMge0l0ZXJhYmxlPFtudW1iZXIsIFBhc3NhYmxlXT59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgQ2hlY2tQYXR0ZXJuXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBhbGxlZ2VkUGF0dGVyblxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgS2V5VG9EQktleVxuICogSWYgdGhpcyBrZXkgY2FuIGJlIGVuY29kZWQgYXMgYSBEQktleSBzdHJpbmcgd2hpY2ggc29ydHMgY29ycmVjdGx5LFxuICogcmV0dXJuIHRoYXQgc3RyaW5nLiBFbHNlIHJldHVybiBgdW5kZWZpbmVkYC4gRm9yIGV4YW1wbGUsIGEgc2NhbGFyLW9ubHlcbiAqIGVuY29kZVBhc3NhYmxlIHdvdWxkIHJldHVybiBgdW5kZWZpbmVkYCBmb3IgYWxsIG5vbi1zY2FsYXIga2V5cy5cbiAqIEBwYXJhbSB7UGFzc2FibGV9IGtleVxuICogQHJldHVybnMge3N0cmluZyB8IHVuZGVmaW5lZH1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRSYW5rQ292ZXJcbiAqIEBwYXJhbSB7UGF0dGVybn0gcGF0dGVyblxuICogQHBhcmFtIHtLZXlUb0RCS2V5fSBlbmNvZGVQYXNzYWJsZVxuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEFsbExpbWl0c1xuICogQHByb3BlcnR5IHtudW1iZXJ9IGRlY2ltYWxEaWdpdHNMaW1pdFxuICogQHByb3BlcnR5IHtudW1iZXJ9IHN0cmluZ0xlbmd0aExpbWl0XG4gKiBAcHJvcGVydHkge251bWJlcn0gc3ltYm9sTmFtZUxlbmd0aExpbWl0XG4gKiBAcHJvcGVydHkge251bWJlcn0gbnVtUHJvcGVydGllc0xpbWl0XG4gKiBAcHJvcGVydHkge251bWJlcn0gcHJvcGVydHlOYW1lTGVuZ3RoTGltaXRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBhcnJheUxlbmd0aExpbWl0XG4gKiBAcHJvcGVydHkge251bWJlcn0gbnVtU2V0RWxlbWVudHNMaW1pdFxuICogQHByb3BlcnR5IHtudW1iZXJ9IG51bVVuaXF1ZUJhZ0VsZW1lbnRzTGltaXRcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBudW1NYXBFbnRyaWVzTGltaXRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtQYXJ0aWFsPEFsbExpbWl0cz59IExpbWl0c1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUGF0dGVybk1hdGNoZXJzXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBNYXRjaGVyfSBhbnlcbiAqIE1hdGNoZXMgYW55IFBhc3NhYmxlLlxuICpcbiAqIEBwcm9wZXJ0eSB7KC4uLnN1YlBhdHRzOiBQYXR0ZXJuW10pID0+IE1hdGNoZXJ9IGFuZFxuICogTWF0Y2hlcyBhZ2FpbnN0IHRoZSBpbnRlcnNlY3Rpb24gb2YgYWxsIHN1Yi1QYXR0ZXJucy5cbiAqXG4gKiBAcHJvcGVydHkgeyguLi5zdWJQYXR0czogUGF0dGVybltdKSA9PiBNYXRjaGVyfSBvclxuICogTWF0Y2hlcyBhZ2FpbnN0IHRoZSB1bmlvbiBvZiBhbGwgc3ViLVBhdHRlcm5zXG4gKiAocmVxdWlyaW5nIGEgc3VjY2Vzc2Z1bCBtYXRjaCBhZ2FpbnN0IGF0IGxlYXN0IG9uZSkuXG4gKlxuICogQHByb3BlcnR5IHsoc3ViUGF0dDogUGF0dGVybikgPT4gTWF0Y2hlcn0gbm90XG4gKiBNYXRjaGVzIGFnYWluc3QgdGhlIG5lZ2F0aW9uIG9mIHRoZSBzdWItUGF0dGVybi5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IE1hdGNoZXJ9IHNjYWxhclxuICogTWF0Y2hlcyBhbnkgUGFzc2FibGUgcHJpbWl0aXZlIHZhbHVlIG9yIFJlbW90YWJsZS5cbiAqIEFsbCBtYXRjaGVkIHZhbHVlcyBhcmUgS2V5cy5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IE1hdGNoZXJ9IGtleVxuICogTWF0Y2hlcyBhbnkgdmFsdWUgdGhhdCBjYW4gYmUgYSBrZXkgaW4gYSBDb3B5TWFwXG4gKiBvciBhbiBlbGVtZW50IGluIGEgQ29weVNldCBvciBDb3B5QmFnLlxuICogQWxsIG1hdGNoZWQgdmFsdWVzIGFyZSBhbHNvIHZhbGlkIFBhdHRlcm5zIHRoYXQgbWF0Y2ggb25seSB0aGVtc2VsdmVzLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTWF0Y2hlcn0gcGF0dGVyblxuICogTWF0Y2hlcyBhbnkgUGF0dGVybiB0aGF0IGNhbiBiZSB1c2VkIHRvIGNoYXJhY3Rlcml6ZSBQYXNzYWJsZXMuXG4gKiBBIFBhdHRlcm4gY2Fubm90IGNvbnRhaW4gcHJvbWlzZXMgb3IgZXJyb3JzLFxuICogYXMgdGhlc2UgYXJlIG5vdCBzdGFibGUgZW5vdWdoIHRvIHVzZWZ1bGx5IG1hdGNoLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGtpbmQ6IFBhc3NTdHlsZSB8IHN0cmluZykgPT4gTWF0Y2hlcn0ga2luZFxuICogV2hlbiBga2luZGAgc3BlY2lmaWVzIGEgUGFzc1N0eWxlIG90aGVyIHRoYW4gXCJ0YWdnZWRcIixcbiAqIG1hdGNoZXMgYW55IHZhbHVlIGhhdmluZyB0aGF0IFBhc3NTdHlsZS5cbiAqIE90aGVyd2lzZSwgd2hlbiBga2luZGAgc3BlY2lmaWVzIGEga25vd24gdGFnZ2VkIHJlY29yZCB0YWdcbiAqIChzdWNoIGFzICdjb3B5U2V0JywgJ2NvcHlCYWcnLCAnY29weU1hcCcsIG9yICdtYXRjaDpzY2FsYXInKSxcbiAqIG1hdGNoZXMgYW55IENvcHlUYWdnZWQgd2l0aCB0aGF0IHRhZyBhbmQgYSB2YWxpZCB0YWctc3BlY2lmaWMgcGF5bG9hZC5cbiAqIE90aGVyd2lzZSwgZG9lcyBub3QgbWF0Y2ggYW55IHZhbHVlLlxuICogVE9ETzogUmVqZWN0IGF0dGVtcHRzIHRvIGNyZWF0ZSBhIGtpbmQgbWF0Y2hlciB3aXRoIHVua25vd24gYGtpbmRgP1xuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gTWF0Y2hlcn0gYm9vbGVhblxuICogTWF0Y2hlcyBgdHJ1ZWAgb3IgYGZhbHNlYC5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IE1hdGNoZXJ9IG51bWJlclxuICogTWF0Y2hlcyBhbnkgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLFxuICogaW5jbHVkaW5nIGBOYU5gIGFuZCBlaXRoZXIgc2lnbmVkIEluZmluaXR5LlxuICpcbiAqIEBwcm9wZXJ0eSB7KGxpbWl0cz86IExpbWl0cykgPT4gTWF0Y2hlcn0gYmlnaW50XG4gKiBNYXRjaGVzIGFueSBiaWdpbnQsIHN1YmplY3QgdG8gbGltaXRzLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGxpbWl0cz86IExpbWl0cykgPT4gTWF0Y2hlcn0gbmF0XG4gKiBNYXRjaGVzIGFueSBub24tbmVnYXRpdmUgYmlnaW50IG9yXG4gKiBcInNhZmVcIiAobm8gZ3JlYXRlciB0aGFuIDIqKjUzIC0gMSkgbm9uLW5lZ2F0aXZlIGludGVncmFsIG51bWJlcixcbiAqIHN1YmplY3QgdG8gbGltaXRzLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGxpbWl0cz86IExpbWl0cykgPT4gTWF0Y2hlcn0gc3RyaW5nXG4gKiBNYXRjaGVzIGFueSBzdHJpbmcsIHN1YmplY3QgdG8gbGltaXRzLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGxpbWl0cz86IExpbWl0cykgPT4gTWF0Y2hlcn0gc3ltYm9sXG4gKiBNYXRjaGVzIGFueSByZWdpc3RlcmVkIG9yIHdlbGwta25vd24gc3ltYm9sLFxuICogc3ViamVjdCB0byBsaW1pdHMuXG4gKlxuICogQHByb3BlcnR5IHsobGltaXRzPzogTGltaXRzKSA9PiBNYXRjaGVyfSByZWNvcmRcbiAqIE1hdGNoZXMgYW55IENvcHlSZWNvcmQsIHN1YmplY3QgdG8gbGltaXRzLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGxpbWl0cz86IExpbWl0cykgPT4gTWF0Y2hlcn0gYXJyYXlcbiAqIE1hdGNoZXMgYW55IENvcHlBcnJheSwgc3ViamVjdCB0byBsaW1pdHMuXG4gKlxuICogQHByb3BlcnR5IHsobGltaXRzPzogTGltaXRzKSA9PiBNYXRjaGVyfSBzZXRcbiAqIE1hdGNoZXMgYW55IENvcHlTZXQsIHN1YmplY3QgdG8gbGltaXRzLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGxpbWl0cz86IExpbWl0cykgPT4gTWF0Y2hlcn0gYmFnXG4gKiBNYXRjaGVzIGFueSBDb3B5QmFnLCBzdWJqZWN0IHRvIGxpbWl0cy5cbiAqXG4gKiBAcHJvcGVydHkgeyhsaW1pdHM/OiBMaW1pdHMpID0+IE1hdGNoZXJ9IG1hcFxuICogTWF0Y2hlcyBhbnkgQ29weU1hcCwgc3ViamVjdCB0byBsaW1pdHMuXG4gKlxuICogQHByb3BlcnR5IHsobGFiZWw/OiBzdHJpbmcpID0+IE1hdGNoZXJ9IHJlbW90YWJsZVxuICogTWF0Y2hlcyBhIGZhciBvYmplY3Qgb3IgaXRzIHJlbW90ZSBwcmVzZW5jZS5cbiAqIFRoZSBvcHRpb25hbCBgbGFiZWxgIGlzIHB1cmVseSBmb3IgZGlhZ25vc3RpYyBwdXJwb3NlcyBhbmQgZG9lcyBub3RcbiAqIGFkZCBhbnkgY29uc3RyYWludHMuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBNYXRjaGVyfSBlcnJvclxuICogTWF0Y2hlcyBhbnkgZXJyb3Igb2JqZWN0LlxuICogRXJyb3Igb2JqZWN0cyBhcmUgUGFzc2FibGUsIGJ1dCBhcmUgbmVpdGhlciBLZXlzIG5vciBQYXR0ZXJucy5cbiAqIFRoZXkgZG8gbm90IGhhdmUgYSB1c2VmdWwgaWRlbnRpdHkuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBNYXRjaGVyfSBwcm9taXNlXG4gKiBNYXRjaGVzIGFueSBwcm9taXNlIG9iamVjdC5cbiAqIFByb21pc2VzIGFyZSBQYXNzYWJsZSwgYnV0IGFyZSBuZWl0aGVyIEtleXMgbm9yIFBhdHRlcm5zLlxuICogVGhleSBkbyBub3QgaGF2ZSBhIHVzZWZ1bCBpZGVudGl0eS5cbiAqXG4gKiBAcHJvcGVydHkgeygpID0+IE1hdGNoZXJ9IHVuZGVmaW5lZFxuICogTWF0Y2hlcyB0aGUgZXhhY3QgdmFsdWUgYHVuZGVmaW5lZGAuXG4gKiBBbGwga2V5cyBpbmNsdWRpbmcgYHVuZGVmaW5lZGAgYXJlIGFscmVhZHkgdmFsaWQgUGF0dGVybnMgYW5kXG4gKiBzbyBjYW4gdmFsaWRseSByZXByZXNlbnQgdGhlbXNlbHZlcy5cbiAqIEJ1dCBvcHRpb25hbCBQYXR0ZXJuIGFyZ3VtZW50cyBgKHBhdHQgPSB1bmRlZmluZWQpID0+IC4uLmBcbiAqIHRyZWF0IGV4cGxpY2l0IGB1bmRlZmluZWRgIGFzIG9taXNzaW9uIG9mIHRoZSBhcmd1bWVudC5cbiAqIFRodXMsIHdoZW4gYSBwYXNzZWQgUGF0dGVybiBkb2VzIG5vdCBhbHNvIG5lZWQgdG8gYmUgYSBLZXksXG4gKiB3ZSByZWNvbW1lbmQgcGFzc2luZyBgTS51bmRlZmluZWQoKWAgcmF0aGVyIHRoYW4gYHVuZGVmaW5lZGAuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBudWxsfSBudWxsXG4gKiBSZXR1cm5zIGBudWxsYCwgd2hpY2ggbWF0Y2hlcyBvbmx5IGl0c2VsZi5cbiAqXG4gKiBAcHJvcGVydHkgeyhyaWdodE9wZXJhbmQgOktleSkgPT4gTWF0Y2hlcn0gbHRcbiAqIE1hdGNoZXMgYW55IHZhbHVlIHRoYXQgY29tcGFyZUtleXMgcmVwb3J0cyBhcyBsZXNzIHRoYW4gcmlnaHRPcGVyYW5kLlxuICpcbiAqIEBwcm9wZXJ0eSB7KHJpZ2h0T3BlcmFuZCA6S2V5KSA9PiBNYXRjaGVyfSBsdGVcbiAqIE1hdGNoZXMgYW55IHZhbHVlIHRoYXQgY29tcGFyZUtleXMgcmVwb3J0cyBhcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG9cbiAqIHJpZ2h0T3BlcmFuZC5cbiAqXG4gKiBAcHJvcGVydHkgeyhrZXkgOktleSkgPT4gTWF0Y2hlcn0gZXFcbiAqIE1hdGNoZXMgYW55IHZhbHVlIHRoYXQgaXMgZXF1YWwgdG8ga2V5LlxuICpcbiAqIEBwcm9wZXJ0eSB7KGtleSA6S2V5KSA9PiBNYXRjaGVyfSBuZXFcbiAqIE1hdGNoZXMgYW55IHZhbHVlIHRoYXQgaXMgbm90IGVxdWFsIHRvIGtleS5cbiAqXG4gKiBAcHJvcGVydHkgeyhyaWdodE9wZXJhbmQgOktleSkgPT4gTWF0Y2hlcn0gZ3RlXG4gKiBNYXRjaGVzIGFueSB2YWx1ZSB0aGF0IGNvbXBhcmVLZXlzIHJlcG9ydHMgYXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsXG4gKiB0byByaWdodE9wZXJhbmQuXG4gKlxuICogQHByb3BlcnR5IHsocmlnaHRPcGVyYW5kIDpLZXkpID0+IE1hdGNoZXJ9IGd0XG4gKiBNYXRjaGVzIGFueSB2YWx1ZSB0aGF0IGNvbXBhcmVLZXlzIHJlcG9ydHMgYXMgZ3JlYXRlciB0aGFuXG4gKiByaWdodE9wZXJhbmQuXG4gKlxuICogQHByb3BlcnR5IHsoc3ViUGF0dD86IFBhdHRlcm4sIGxpbWl0cz86IExpbWl0cykgPT4gTWF0Y2hlcn0gYXJyYXlPZlxuICogTWF0Y2hlcyBhbnkgQ29weUFycmF5IHdob3NlIGVsZW1lbnRzIGFyZSBhbGwgbWF0Y2hlZCBieSBgc3ViUGF0dGBcbiAqIGlmIGRlZmluZWQsIHN1YmplY3QgdG8gbGltaXRzLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLFxuICogICAgICAgICAgICAgdmFsdWVQYXR0PzogUGF0dGVybixcbiAqICAgICAgICAgICAgIGxpbWl0cz86IExpbWl0c1xuICogKSA9PiBNYXRjaGVyfSByZWNvcmRPZlxuICogTWF0Y2hlcyBhbnkgQ29weVJlY29yZCB3aG9zZSBrZXlzIGFyZSBhbGwgbWF0Y2hlZCBieSBga2V5UGF0dGBcbiAqIGlmIGRlZmluZWQgYW5kIHZhbHVlcyBhcmUgYWxsIG1hdGNoZWQgYnkgYHZhbHVlUGF0dGAgaWYgZGVmaW5lZCxcbiAqIHN1YmplY3QgdG8gbGltaXRzLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLCBsaW1pdHM/OiBMaW1pdHMpID0+IE1hdGNoZXJ9IHNldE9mXG4gKiBNYXRjaGVzIGFueSBDb3B5U2V0IHdob3NlIGVsZW1lbnRzIGFyZSBhbGwgbWF0Y2hlZCBieSBga2V5UGF0dGBcbiAqIGlmIGRlZmluZWQsIHN1YmplY3QgdG8gbGltaXRzLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGtleVBhdHQ/OiBQYXR0ZXJuLFxuICogICAgICAgICAgICAgY291bnRQYXR0PzogUGF0dGVybixcbiAqICAgICAgICAgICAgIGxpbWl0cz86IExpbWl0c1xuICogKSA9PiBNYXRjaGVyfSBiYWdPZlxuICogTWF0Y2hlcyBhbnkgQ29weUJhZyB3aG9zZSBlbGVtZW50cyBhcmUgYWxsIG1hdGNoZWQgYnkgYGtleVBhdHRgXG4gKiBpZiBkZWZpbmVkIGFuZCB0aGUgY2FyZGluYWxpdHkgb2YgZWFjaCBpcyBtYXRjaGVkIGJ5IGBjb3VudFBhdHRgXG4gKiBpZiBkZWZpbmVkLCBzdWJqZWN0IHRvIGxpbWl0cy5cbiAqIGBjb3VudFBhdHRgIGlzIGV4cGVjdGVkIHRvIHJhcmVseSBiZSB1c2VmdWwsXG4gKiBidXQgaXMgcHJvdmlkZWQgdG8gbWluaW1pemUgc3VycHJpc2UuXG4gKlxuICogQHByb3BlcnR5IHsoa2V5UGF0dD86IFBhdHRlcm4sXG4gKiAgICAgICAgICAgICB2YWx1ZVBhdHQ/OiBQYXR0ZXJuLFxuICogICAgICAgICAgICAgbGltaXRzPzogTGltaXRzXG4gKiApID0+IE1hdGNoZXJ9IG1hcE9mXG4gKiBNYXRjaGVzIGFueSBDb3B5TWFwIHdob3NlIGtleXMgYXJlIGFsbCBtYXRjaGVkIGJ5IGBrZXlQYXR0YCBpZiBkZWZpbmVkXG4gKiBhbmQgdmFsdWVzIGFyZSBhbGwgbWF0Y2hlZCBieSBgdmFsdWVQYXR0YCBpZiBkZWZpbmVkLFxuICogc3ViamVjdCB0byBsaW1pdHMuXG4gKlxuICogQHByb3BlcnR5IHsocmVxdWlyZWQ6IFBhdHRlcm5bXSxcbiAqICAgICAgICAgICAgIG9wdGlvbmFsPzogUGF0dGVybltdLFxuICogICAgICAgICAgICAgcmVzdD86IFBhdHRlcm4sXG4gKiApID0+IE1hdGNoZXJ9IHNwbGl0QXJyYXlcbiAqIE1hdGNoZXMgYW55IGFycmF5IC0tLSB0eXBpY2FsbHkgYW4gYXJndW1lbnRzIGxpc3QgLS0tIGNvbnNpc3Rpbmcgb2ZcbiAqICAgLSBhbiBpbml0aWFsIHBvcnRpb24gbWF0Y2hlZCBieSBgcmVxdWlyZWRgLCBhbmRcbiAqICAgLSBhIG1pZGRsZSBwb3J0aW9uIG9mIGxlbmd0aCB1cCB0byB0aGUgbGVuZ3RoIG9mIGBvcHRpb25hbGAgdGhhdCBpc1xuICogICAgIG1hdGNoZWQgYnkgdGhlIGVxdWFsLWxlbmd0aCBwcmVmaXggb2YgYG9wdGlvbmFsYCBpZiBgb3B0aW9uYWxgIGlzXG4gKiAgICAgZGVmaW5lZCwgYW5kXG4gKiAgIC0gYSByZW1haW5kZXIgdGhhdCBpcyBtYXRjaGVkIGJ5IGByZXN0YCBpZiBgcmVzdGAgaXMgZGVmaW5lZC5cbiAqIFRoZSBhcnJheSBtdXN0IGJlIGF0IGxlYXN0IGFzIGxvbmcgYXMgYHJlcXVpcmVkYFxuICogYnV0IGl0cyByZW1haW5kZXIgY2FuIGJlIGFyYml0cmFyaWx5IHNob3J0LlxuICogQW55IGFycmF5IGVsZW1lbnRzIGJleW9uZCB0aGUgc3VtbWVkIGxlbmd0aCBvZiBgcmVxdWlyZWRgIGFuZCBgb3B0aW9uYWxgXG4gKiBhcmUgY29sbGVjdGVkIGFuZCBtYXRjaGVkIGFnYWluc3QgYHJlc3RgLlxuICpcbiAqIEBwcm9wZXJ0eSB7KHJlcXVpcmVkOiBDb3B5UmVjb3JkPFBhdHRlcm4+LFxuICogICAgICAgICAgICAgb3B0aW9uYWw/OiBDb3B5UmVjb3JkPFBhdHRlcm4+LFxuICogICAgICAgICAgICAgcmVzdD86IFBhdHRlcm4sXG4gKiApID0+IE1hdGNoZXJ9IHNwbGl0UmVjb3JkXG4gKiBNYXRjaGVzIGFueSBDb3B5UmVjb3JkIHRoYXQgY2FuIGJlIHNwbGl0IGludG8gY29tcG9uZW50IENvcHlSZWNvcmRzXG4gKiBhcyBmb2xsb3dzOlxuICogICAtIGFsbCBwcm9wZXJ0aWVzIGNvcnJlc3BvbmRpbmcgd2l0aCBhIHByb3BlcnR5IG9mIGByZXF1aXJlZGBcbiAqICAgLSBhbGwgcHJvcGVydGllcyBjb3JyZXNwb25kaW5nIHdpdGggYSBwcm9wZXJ0eSBvZiBgb3B0aW9uYWxgXG4gKiAgICAgYnV0IG5vdCBjb3JyZXNwb25kaW5nIHdpdGggYSBwcm9wZXJ0eSBvZiBgcmVxdWlyZWRgXG4gKiAgIC0gYWxsIG90aGVyIHByb3BlcnRpZXNcbiAqIHdoZXJlIHRoZSBmaXJzdCBjb21wb25lbnQgaXMgbWF0Y2hlZCBieSBgcmVxdWlyZWRgLFxuICogdGhlIHNlY29uZCBjb21wb25lbnQgaXMgbWF0Y2hlZCBieSB0aGUgc3Vic2V0IG9mIGBvcHRpb25hbGBcbiAqIGNvcnJlc3BvbmRpbmcgd2l0aCBpdHMgcHJvcGVydGllcyBpZiBgb3B0aW9uYWxgIGlzIGRlZmluZWQsIGFuZFxuICogdGhlIHRoaXJkIGNvbXBvbmVudCBpcyBtYXRjaGVkIGJ5IGByZXN0YCBpZiBkZWZpbmVkLlxuICogVGhlIENvcHlSZWNvcmQgbXVzdCBoYXZlIGFsbCBwcm9wZXJ0aWVzIHRoYXQgYXBwZWFyIG9uIGByZXF1aXJlZGAsXG4gKiBidXQgbWF5IG9taXQgcHJvcGVydGllcyB0aGF0IGFwcGVhciBvbiBgb3B0aW9uYWxgLlxuICpcbiAqIEBwcm9wZXJ0eSB7KGJhc2VQYXR0OiBDb3B5UmVjb3JkPCo+IHwgQ29weUFycmF5PCo+LFxuICogICAgICAgICAgICAgcmVzdD86IFBhdHRlcm4sXG4gKiApID0+IE1hdGNoZXJ9IHNwbGl0XG4gKiBEZXByZWNhdGVkLiBVc2UgYE0uc3BsaXRBcnJheWAgb3IgYE0uc3BsaXRSZWNvcmRgIGluc3RlYWQuXG4gKiBBbiBhcnJheSBvciByZWNvcmQgaXMgc3BsaXQgaW50byB0aGUgZmlyc3QgcGFydCB0aGF0IGlzIG1hdGNoZWQgYnlcbiAqIGBiYXNlUGF0dGAsIGFuZCB0aGUgcmVtYWluZGVyLCB3aGljaCBpcyBtYXRjaGVkIGFnYWluc3QgYHJlc3RgIGlmIHByZXNlbnQuXG4gKlxuICogQHByb3BlcnR5IHsoYmFzZVBhdHQ6IENvcHlSZWNvcmQ8Kj4gfCBDb3B5QXJyYXk8Kj4sXG4gKiAgICAgICAgICAgICByZXN0PzogUGF0dGVybixcbiAqICkgPT4gTWF0Y2hlcn0gcGFydGlhbFxuICogRGVwcmVjYXRlZC4gVXNlIGBNLnNwbGl0QXJyYXlgIG9yIGBNLnNwbGl0UmVjb3JkYCBpbnN0ZWFkLlxuICogQW4gYXJyYXkgb3IgcmVjb3JkIGlzIHNwbGl0IGludG8gdGhlIGZpcnN0IHBhcnQgdGhhdCBpcyBtYXRjaGVkIGJ5XG4gKiBgYmFzZVBhdHRgLCBhbmQgdGhlIHJlbWFpbmRlciwgd2hpY2ggaXMgbWF0Y2hlZCBhZ2FpbnN0IGByZXN0YCBpZiBwcmVzZW50LlxuICogYE0ucGFydGlhbGAgZGlmZmVycyBmcm9tIGBNLnNwbGl0YCBpbiB0aGUgaGFuZGxpbmcgb2YgZGF0YSB0aGF0IGlzXG4gKiBkZXNjcmliZWQgaW4gYGJhc2VQYXR0YCBidXQgYWJzZW50IGluIGEgcHJvdmlkZWQgc3BlY2ltZW46XG4gKiAgIC0gRm9yIGEgQ29weVJlY29yZCwgYE0ucGFydGlhbGAgaWdub3JlcyBwcm9wZXJ0aWVzIG9mIGBiYXNlUGF0dGBcbiAqICAgICB0aGF0IGFyZSBub3QgcHJlc2VudCBvbiB0aGUgc3BlY2ltZW4uXG4gKiAgIC0gRm9yIGEgQ29weUFycmF5LCBgTS5wYXJ0aWFsYCBpZ25vcmVzIGVsZW1lbnRzIG9mIGBiYXNlUGF0dGBcbiAqICAgICBhdCBpbmRpY2VzIGJleW9uZCB0aGUgbWF4aW11bSBpbmRleCBvZiB0aGUgc3BlY2ltZW4uXG4gKlxuICogQHByb3BlcnR5IHsoc3ViUGF0dDogUGF0dGVybikgPT4gUGF0dGVybn0gZXJlZlxuICogTWF0Y2hlcyBhbnkgUGFzc2FibGUgdGhhdCBpcyBlaXRoZXIgbWF0Y2hlZCBieSBgc3ViUGF0dGAgb3IgaXMgYSBwcm9taXNlIG9iamVjdC5cbiAqIE5vdGUgdGhhdCB2YWxpZGF0aW9uIGlzIGltbWVkaWF0ZSwgc28gKHVubGlrZSB0aGUgVHlwZVNjcmlwdCBFUmVmPFQ+XG4gKiB0eXBlKSBgTS5lcmVmYCBtYXRjaGVzIGEgcHJvbWlzZSBvYmplY3Qgd2hvc2UgZnVsZmlsbG1lbnQgdmFsdWUgaXNcbiAqIF9ub3RfIG1hdGNoZWQgYnkgYHN1YlBhdHRgLlxuICogRm9yIGRlc2NyaWJpbmcgYSB0b3AtbGV2ZWwgcGFyYW1ldGVyLFxuICogYE0uY2FsbFdoZW4oLi4uLCBNLmF3YWl0KHApLCAuLi4pYCBpcyBwcmVmZXJyZWQgb3ZlciBgTS5jYWxsKC4uLiwgTS5lcmVmKHApLCAuLi4pYFxuICogYmVjYXVzZSB0aGUgZm9ybWVyIGFsd2F5cyBjaGVja3MgYWdhaW5zdCB0aGUgc3ViLVBhdHRlcm4gKGF3YWl0aW5nIGZ1bGZpbGxtZW50XG4gKiBpZiBuZWNlc3NhcnkpIHdoaWxlIHRoZSBsYXR0ZXIgYnlwYXNzZXMgc3VjaCBjaGVja3Mgd2hlbiB0aGUgcmVsZXZhbnQgYXJndW1lbnRcbiAqIGlzIGEgcHJvbWlzZS5cbiAqXG4gKiBAcHJvcGVydHkgeyhzdWJQYXR0OiBQYXR0ZXJuKSA9PiBQYXR0ZXJufSBvcHRcbiAqIE1hdGNoZXMgYW55IFBhc3NhYmxlIHRoYXQgaXMgbWF0Y2hlZCBieSBgc3ViUGF0dGAgb3IgaXMgdGhlIGV4YWN0IHZhbHVlIGB1bmRlZmluZWRgLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gR3VhcmRNYWtlcnNcbiAqIEBwcm9wZXJ0eSB7PE0gZXh0ZW5kcyBSZWNvcmQ8YW55LCBhbnk+PihpbnRlcmZhY2VOYW1lOiBzdHJpbmcsXG4gKiAgICAgICAgICAgICBtZXRob2RHdWFyZHM6IE0sXG4gKiAgICAgICAgICAgICBvcHRpb25zPzoge3Nsb3BweT86IGJvb2xlYW59XG4gKiApID0+IEludGVyZmFjZUd1YXJkfSBpbnRlcmZhY2UgR3VhcmQgYW4gaW50ZXJmYWNlIHRvIGEgZmFyIG9iamVjdCBvciBmYWNldFxuICpcbiAqIEBwcm9wZXJ0eSB7KC4uLmFyZ0d1YXJkczogQXJnR3VhcmRbXSkgPT4gTWV0aG9kR3VhcmRNYWtlcn0gY2FsbCBHdWFyZCBhIHN5bmNocm9ub3VzIGNhbGxcbiAqXG4gKiBAcHJvcGVydHkgeyguLi5hcmdHdWFyZHM6IEFyZ0d1YXJkW10pID0+IE1ldGhvZEd1YXJkTWFrZXJ9IGNhbGxXaGVuIEd1YXJkIGFuIGFzeW5jIGNhbGxcbiAqXG4gKiBAcHJvcGVydHkgeyhhcmdHdWFyZDogQXJnR3VhcmQpID0+IEFyZ0d1YXJkfSBhd2FpdCBHdWFyZCBhbiBhd2FpdFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1BhdHRlcm5NYXRjaGVycyAmIEd1YXJkTWFrZXJzfSBNYXRjaGVyTmFtZXNwYWNlXG4gKi9cblxuLyoqIEB0eXBlZGVmIHsoLi4uYXJnczogYW55W10pID0+IGFueX0gTWV0aG9kICovXG5cbi8qIFRPRE8gcGFyYW1ldGVyaXplIHRoaXMgdG8gbWF0Y2ggdGhlIGJlaGF2aW9yIG9iamVjdCBpdCBndWFyZHMqL1xuLyoqXG4gKiBAdHlwZWRlZiB7e1xuICoga2xhc3M6ICdJbnRlcmZhY2UnLFxuICogaW50ZXJmYWNlTmFtZTogc3RyaW5nLFxuICogbWV0aG9kR3VhcmRzOiBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBNZXRob2RHdWFyZD5cbiAqIHNsb3BweT86IGJvb2xlYW5cbiAqIH19IEludGVyZmFjZUd1YXJkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7YW55fSBNZXRob2RHdWFyZE1ha2VyXG4gKiBhIHBhcmFtZXRlciBsaXN0IGxpa2UgZm9vKGEsIGIsIGMgPSBkLCDigKZlKSA9PiBmIHNob3VsZCBiZSBndWFyZGVkIGJ5XG4gKiBzb21ldGhpbmcgbGlrZVxuICogZm9vOiBNLmNhbGwoQVNoYXBlLCBCU2hhcGUpLm9wdGlvbmFsKENTaGFwZSkucmVzdChFU2hhcGUpLnJldHVybnMoRlNoYXBlKVxuICogb3B0aW9uYWwgaXMgZm9yIG9wdGlvbmFsICg9KSBwYXJhbXMuIHJlc3QgaXMgZm9yIOKApiAodmFyYXJncykgcGFyYW1zXG4gKi9cblxuLyoqIEB0eXBlZGVmIHt7IGtsYXNzOiAnbWV0aG9kR3VhcmQnLCBjYWxsS2luZDogJ3N5bmMnIHwgJ2FzeW5jJywgcmV0dXJuR3VhcmQ6IHVua25vd24gfX0gTWV0aG9kR3VhcmQgKi9cbi8qKiBAdHlwZWRlZiB7YW55fSBBcmdHdWFyZCAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBhdHRlcm5LaXRcbiAqIEBwcm9wZXJ0eSB7KHNwZWNpbWVuOiBQYXNzYWJsZSxcbiAqICAgICAgICAgICAgIHBhdHQ6IFBhc3NhYmxlLFxuICogICAgICAgICAgICAgY2hlY2s6IENoZWNrZXIsXG4gKiAgICAgICAgICAgICBsYWJlbD86IHN0cmluZ3xudW1iZXJcbiAqICkgPT4gYm9vbGVhbn0gY2hlY2tNYXRjaGVzXG4gKiBAcHJvcGVydHkgeyhzcGVjaW1lbjogUGFzc2FibGUsIHBhdHQ6IFBhdHRlcm4pID0+IGJvb2xlYW59IG1hdGNoZXNcbiAqIEBwcm9wZXJ0eSB7KHNwZWNpbWVuOiBQYXNzYWJsZSwgcGF0dDogUGF0dGVybiwgbGFiZWw/OiBzdHJpbmd8bnVtYmVyKSA9PiB2b2lkfSBtdXN0TWF0Y2hcbiAqIEBwcm9wZXJ0eSB7KHBhdHQ6IFBhdHRlcm4pID0+IHZvaWR9IGFzc2VydFBhdHRlcm5cbiAqIEBwcm9wZXJ0eSB7KHBhdHQ6IFBhc3NhYmxlKSA9PiBib29sZWFufSBpc1BhdHRlcm5cbiAqIEBwcm9wZXJ0eSB7R2V0UmFua0NvdmVyfSBnZXRSYW5rQ292ZXJcbiAqIEBwcm9wZXJ0eSB7TWF0Y2hlck5hbWVzcGFjZX0gTVxuICovXG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyogVE9ETyovXG4vKiBUaGUgZm9sbG93aW5nIHR5cGUgc2hvdWxkIGJlIGluIGludGVybmFsLXR5cGVzLmpzLCBzaW5jZSB0aGUqL1xuLyogYE1hdGNoSGVscGVyYCB0eXBlIGlzIHB1cmVseSBpbnRlcm5hbCB0byB0aGlzIHBhY2thZ2UuIEhvd2V2ZXIsKi9cbi8qIGluIG9yZGVyIHRvIGdldCB0aGUgZ292ZXJuYW5jZSBhbmQgc29sbyBwYWNrYWdlcyBib3RoIHRvIHBhc3MgbGludCwqL1xuLyogSSBtb3ZlZCB0aGUgdHlwZSBkZWNsYXJhdGlvbiBpdHNlbGYgdG8gdHlwZXMuanMuIFNlZSB0aGUgY29tbWVudHMgaW4qL1xuLyogaW4gaW50ZXJuYWwtdHlwZXMuanMgYW5kIGV4cG9ydHMuanMqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE1hdGNoSGVscGVyXG4gKiBUaGlzIGZhY3RvcnMgb3V0IG9ubHkgdGhlIHBhcnRzIHNwZWNpZmljIHRvIGVhY2gga2luZCBvZiBNYXRjaGVyLiBJdCBpc1xuICogZW5jYXBzdWxhdGVkLCBhbmQgaXRzIG1ldGhvZHMgY2FuIG1ha2UgdGhlIHN0YXRlZCB1bmNoZWNrZXIgYXNzdW1wdGlvbnNcbiAqIGVuZm9yY2VkIGJ5IHRoZSBjb21tb24gY2FsbGluZyBsb2dpYy5cbiAqXG4gKiBAcHJvcGVydHkgeyhhbGxlZ2VkUGF5bG9hZDogUGFzc2FibGUsXG4gKiAgICAgICAgICAgICBjaGVjazogQ2hlY2tlclxuICogKSA9PiBib29sZWFufSBjaGVja0lzV2VsbEZvcm1lZFxuICogUmVwb3J0cyB3aGV0aGVyIGBhbGxlZ2VkUGF5bG9hZGAgaXMgdmFsaWQgYXMgdGhlIHBheWxvYWQgb2YgYSBDb3B5VGFnZ2VkXG4gKiB3aG9zZSB0YWcgY29ycmVzcG9uZHMgd2l0aCB0aGlzIE1hdGNoSGVscGVyJ3MgTWF0Y2hlcnMuXG4gKlxuICogQHByb3BlcnR5IHsoc3BlY2ltZW46IFBhc3NhYmxlLFxuICogICAgICAgICAgICAgbWF0Y2hlclBheWxvYWQ6IFBhc3NhYmxlLFxuICogICAgICAgICAgICAgY2hlY2s6IENoZWNrZXIsXG4gKiApID0+IGJvb2xlYW59IGNoZWNrTWF0Y2hlc1xuICogQXNzdW1pbmcgdmFsaWRpdHkgb2YgYG1hdGNoZXJQYXlsb2FkYCBhcyB0aGUgcGF5bG9hZCBvZiBhIE1hdGNoZXIgY29ycmVzcG9uZGluZ1xuICogd2l0aCB0aGlzIE1hdGNoSGVscGVyLCByZXBvcnRzIHdoZXRoZXIgYHNwZWNpbWVuYCBpcyBtYXRjaGVkIGJ5IHRoYXQgTWF0Y2hlci5cbiAqXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgcGF5bG9hZDogUGFzc2FibGUsXG4gKiAgIGVuY29kZVBhc3NhYmxlOiBLZXlUb0RCS2V5XG4gKiApID0+IFJhbmtDb3Zlcn0gZ2V0UmFua0NvdmVyXG4gKiBBc3N1bWVzIHRoaXMgaXMgdGhlIHBheWxvYWQgb2YgYSBDb3B5VGFnZ2VkIHdpdGggdGhlIGNvcnJlc3BvbmRpbmdcbiAqIG1hdGNoVGFnLiBSZXR1cm4gYSBSYW5rQ292ZXIgdG8gYm91bmQgZnJvbSBiZWxvdyBhbmQgYWJvdmUsXG4gKiBpbiByYW5rIG9yZGVyLCBhbGwgcG9zc2libGUgUGFzc2FibGVzIHRoYXQgd291bGQgbWF0Y2ggdGhpcyBNYXRjaGVyLlxuICogVGhlIGxlZnQgZWxlbWVudCBtdXN0IGJlIGJlZm9yZSBvciB0aGUgc2FtZSByYW5rIGFzIGFueSBwb3NzaWJsZVxuICogbWF0Y2hpbmcgc3BlY2ltZW4uIFRoZSByaWdodCBlbGVtZW50IG11c3QgYmUgYWZ0ZXIgb3IgdGhlIHNhbWVcbiAqIHJhbmsgYXMgYW55IHBvc3NpYmxlIG1hdGNoaW5nIHNwZWNpbWVuLlxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAALtXDvcfAQAAHwEAACgAAABAYWdvcmljL3N3aW5nc2V0LXZhdC12MC4zMC4yL2V4cG9ydGVkLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAH/8s2KqAQAAqgEAABwAAABAYWdvcmljL3RpbWUtdjAuMi4xL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL3RpbWVNYXRoLmpzIiwiLi9zcmMvdHlwZUd1YXJkcy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vc3JjL3RpbWVNYXRoLmpzIiwiLi9zcmMvdHlwZUd1YXJkcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL3RpbWVNYXRoLmpzXCIsIFtdXSxbXCIuL3NyYy90eXBlR3VhcmRzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAP7loWhCAAAIQgAAAjAAAAQGFnb3JpYy90aW1lLXYwLjIuMS9zcmMvdGltZU1hdGguanN7ImltcG9ydHMiOlsiLi90eXBlR3VhcmRzLmpzIiwiQGFnb3JpYy9zdG9yZSIsIkBlbmRvL25hdCJdLCJleHBvcnRzIjpbIlRpbWVNYXRoIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IE5hdCxtdXN0TWF0Y2gsUmVsYXRpdmVUaW1lU2hhcGUsVGltZXN0YW1wU2hhcGU7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vbmF0XCIsIFtbXCJOYXRcIiwgWyRo4oCNX2EgPT4gKE5hdCA9ICRo4oCNX2EpXV1dXSxbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJtdXN0TWF0Y2hcIiwgWyRo4oCNX2EgPT4gKG11c3RNYXRjaCA9ICRo4oCNX2EpXV1dXSxbXCIuL3R5cGVHdWFyZHMuanNcIiwgW1tcIlJlbGF0aXZlVGltZVNoYXBlXCIsIFskaOKAjV9hID0+IChSZWxhdGl2ZVRpbWVTaGFwZSA9ICRo4oCNX2EpXV0sW1wiVGltZXN0YW1wU2hhcGVcIiwgWyRo4oCNX2EgPT4gKFRpbWVzdGFtcFNoYXBlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cbmNvbnN0e0ZhaWwscXVvdGU6cX09YXNzZXJ0O1xuLyoqXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcycpLlRpbWVyQnJhbmR9IFRpbWVyQnJhbmRcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzJykuVGltZXN0YW1wfSBUaW1lc3RhbXBcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzJykuUmVsYXRpdmVUaW1lfSBSZWxhdGl2ZVRpbWVcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzJykuUmVsYXRpdmVUaW1lVmFsdWV9IFJlbGF0aXZlVGltZVZhbHVlXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcycpLlRpbWVzdGFtcFZhbHVlfSBUaW1lc3RhbXBWYWx1ZVxuICogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMnKS5UaW1lTWF0aFR5cGV9IFRpbWVNYXRoVHlwZVxuICpcbiAqL1xuXG4vKipcbiAqIGBhZ3JlZWRUaW1lckJyYW5kYCBpcyBpbnRlcm5hbCB0byB0aGlzIG1vZHVsZS5cbiAqXG4gKiBAcGFyYW0ge1RpbWVyQnJhbmQgfCB1bmRlZmluZWR9IGxlZnRCcmFuZFxuICogQHBhcmFtIHtUaW1lckJyYW5kIHwgdW5kZWZpbmVkfSByaWdodEJyYW5kXG4gKiBAcmV0dXJucyB7VGltZXJCcmFuZCB8IHVuZGVmaW5lZH1cbiAqL1xuY29uc3QgYWdyZWVkVGltZXJCcmFuZD0obGVmdEJyYW5kLHJpZ2h0QnJhbmQpPT57XG5pZihsZWZ0QnJhbmQ9PT11bmRlZmluZWQpe1xuaWYocmlnaHRCcmFuZD09PXVuZGVmaW5lZCl7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1lbHNle1xucmV0dXJuIHJpZ2h0QnJhbmQ7XG4gfVxuIH1lbHNlIGlmKHJpZ2h0QnJhbmQ9PT11bmRlZmluZWQpe1xucmV0dXJuIGxlZnRCcmFuZDtcbiB9ZWxzZXtcbmxlZnRCcmFuZD09PXJpZ2h0QnJhbmR8fFxuRmFpbCBgVGltZXJCcmFuZHMgbXVzdCBtYXRjaDogJHtxKGxlZnRCcmFuZCl9IHZzICR7cShyaWdodEJyYW5kKX1gO1xucmV0dXJuIGxlZnRCcmFuZDtcbiB9XG4gfTtcblxuLyoqXG4gKiBgc2hhcmVkVGltZXJCcmFuZGAgaXMgaW50ZXJuYWwgdG8gdGhpcyBtb2R1bGUsIGFuZCBpbXBsZW1lbnRzIHRoZVxuICogdHJhbnNpdGlvbmFsIGJyYW5kIGNoZWNraW5nIGFuZCBjb250YWlnaW9uIGxvZ2ljIGV4cGxhaW5lZCBpbiB0aGUgYFRpbWVNYXRoYFxuICogY29tbWVudC4gSXQgaXMgdXNlZCB0byBkZWZpbmUgdGhlIGJpbmFyeSBvcGVyYXRvcnMgdGhhdCBzaG91bGQgZm9sbG93XG4gKiB0aGlzIGxvZ2ljLiBJdCBkb2VzIHRoZSBlcnJvciBjaGVja2luZyBiZXR3ZWVuIHRoZSBvcGVyYW5kcywgYW5kIHJldHVybnNcbiAqIHRoZSBicmFuZCwgaWYgYW55LCB0aGF0IHNob3VsZCBsYWJlbCB0aGUgcmVzdWx0aW5nIHRpbWUgdmFsdWUuXG4gKlxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IGxlZnRcbiAqIEBwYXJhbSB7VGltZXN0YW1wIHwgUmVsYXRpdmVUaW1lfSByaWdodFxuICogQHJldHVybnMge1RpbWVyQnJhbmQgfCB1bmRlZmluZWR9XG4gKi9cbmNvbnN0IHNoYXJlZFRpbWVyQnJhbmQ9KGxlZnQscmlnaHQpPT57XG5jb25zdCBsZWZ0QnJhbmQ9dHlwZW9mIGxlZnQ9PT0nYmlnaW50Jz91bmRlZmluZWQ6bGVmdC50aW1lckJyYW5kO1xuY29uc3QgcmlnaHRCcmFuZD10eXBlb2YgcmlnaHQ9PT0nYmlnaW50Jz91bmRlZmluZWQ6cmlnaHQudGltZXJCcmFuZDtcbnJldHVybiBhZ3JlZWRUaW1lckJyYW5kKGxlZnRCcmFuZCxyaWdodEJyYW5kKTtcbiB9O1xuXG4vKipcbiAqIGBhYnNMaWtlYCBpcyBpbnRlcm5hbCB0byB0aGlzIG1vZHVsZSwgYW5kIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBiaW5hcnlcbiAqIG9wZXJhdG9ycyBpbiB0aGUgY2FzZSB3aGVyZSB0aGUgcmV0dXJuZWQgdGltZSBzaG91bGQgYmUgYSBgVGltZXN0YW1wYFxuICogcmF0aGVyIHRoYW4gYSBgUmVsYXRpdmVUaW1lYC5cbiAqXG4gKiBAcGFyYW0ge1RpbWVzdGFtcCB8IFJlbGF0aXZlVGltZX0gbGVmdFxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IHJpZ2h0XG4gKiBAcGFyYW0ge1RpbWVzdGFtcFZhbHVlfSBhYnNWYWx1ZVxuICogQHJldHVybnMge1RpbWVzdGFtcH1cbiAqL1xuY29uc3QgYWJzTGlrZT0obGVmdCxyaWdodCxhYnNWYWx1ZSk9Pntcbk5hdChhYnNWYWx1ZSk7XG5jb25zdCB0aW1lckJyYW5kPXNoYXJlZFRpbWVyQnJhbmQobGVmdCxyaWdodCk7XG5pZih0aW1lckJyYW5kKXtcbnJldHVybiBoYXJkZW4oe1xudGltZXJCcmFuZCxcbmFic1ZhbHVlfSk7XG5cbiB9ZWxzZXtcbnJldHVybiBhYnNWYWx1ZTtcbiB9XG4gfTtcblxuLyoqXG4gKiBgcmVsTGlrZWAgaXMgaW50ZXJuYWwgdG8gdGhpcyBtb2R1bGUsIGFuZCB1c2VkIHRvIGltcGxlbWVudCB0aGUgYmluYXJ5XG4gKiBvcGVyYXRvcnMgaW4gdGhlIGNhc2Ugd2hlcmUgdGhlIHJldHVybmVkIHRpbWUgc2hvdWxkIGJlIGEgYFJlbGF0aXZlVGltZWBcbiAqIHJhdGhlciB0aGFuIGEgYFRpbWVzdGFtcGAuXG4gKlxuICogQHBhcmFtIHtUaW1lc3RhbXAgfCBSZWxhdGl2ZVRpbWV9IGxlZnRcbiAqIEBwYXJhbSB7VGltZXN0YW1wIHwgUmVsYXRpdmVUaW1lfSByaWdodFxuICogQHBhcmFtIHtSZWxhdGl2ZVRpbWVWYWx1ZX0gcmVsVmFsdWVcbiAqIEByZXR1cm5zIHtSZWxhdGl2ZVRpbWV9XG4gKi9cbmNvbnN0IHJlbExpa2U9KGxlZnQscmlnaHQscmVsVmFsdWUpPT57XG5OYXQocmVsVmFsdWUpO1xuY29uc3QgdGltZXJCcmFuZD1zaGFyZWRUaW1lckJyYW5kKGxlZnQscmlnaHQpO1xuaWYodGltZXJCcmFuZCl7XG5yZXR1cm4gaGFyZGVuKHtcbnRpbWVyQnJhbmQsXG5yZWxWYWx1ZX0pO1xuXG4gfWVsc2V7XG5yZXR1cm4gcmVsVmFsdWU7XG4gfVxuIH07XG5cbi8qIEZvciBhbGwgdGhlIGZvbGxvd2luZyB0aW1lIG9wZXJhdG9ycywgdGhlaXIgZG9jdW1lbnRhdGlvbiBpcyBpbiovXG4vKiB0aGUgYFRpbWVNYXRoVHlwZWAsIHNpbmNlIHRoYXQgaXMgdGhlIGRvY3VtZW50YXRpb24gdGhhdCBzaG93cyB1cCovXG4vKiBpbiB0aGUgSURFLiBXZWxsLCBhdCBsZWFzdCB0aGUgdnNjb2RlIElERS4qL1xuXG5jb25zdCBhYnNWYWx1ZT0oYWJzKT0+XG50eXBlb2YgYWJzPT09J2JpZ2ludCc/TmF0KGFicyk6TmF0KGFicy5hYnNWYWx1ZSk7XG5cbmNvbnN0IHJlbFZhbHVlPShyZWwpPT5cbnR5cGVvZiByZWw9PT0nYmlnaW50Jz9OYXQocmVsKTpOYXQocmVsLnJlbFZhbHVlKTtcblxuY29uc3QgdG9BYnM9KHRzLGJyYW5kPXVuZGVmaW5lZCk9PntcbmlmKHR5cGVvZiB0cz09PSdudW1iZXInKXtcbnRzPU5hdCh0cyk7XG4gfVxuaWYodHlwZW9mIHRzPT09J2JpZ2ludCcpe1xuaWYoYnJhbmQ9PT11bmRlZmluZWQpe1xucmV0dXJuIHRzO1xuIH1lbHNle1xucmV0dXJuIGhhcmRlbih7XG50aW1lckJyYW5kOmJyYW5kLFxuYWJzVmFsdWU6dHN9KTtcblxuIH1cbiB9ZWxzZXtcbmNvbnN0e3RpbWVyQnJhbmR9PXRzO1xuYWdyZWVkVGltZXJCcmFuZCh0aW1lckJyYW5kLGJyYW5kKTtcbm11c3RNYXRjaCh0cyxUaW1lc3RhbXBTaGFwZSwndGltZXN0YW1wJyk7XG5yZXR1cm4gdHM7XG4gfVxuIH07XG5cbmNvbnN0IHRvUmVsPShydCxicmFuZD11bmRlZmluZWQpPT57XG5pZih0eXBlb2YgcnQ9PT0nbnVtYmVyJyl7XG5ydD1OYXQocnQpO1xuIH1cbmlmKHR5cGVvZiBydD09PSdiaWdpbnQnKXtcbmlmKGJyYW5kPT09dW5kZWZpbmVkKXtcbnJldHVybiBydDtcbiB9ZWxzZXtcbnJldHVybiBoYXJkZW4oe1xudGltZXJCcmFuZDpicmFuZCxcbnJlbFZhbHVlOnJ0fSk7XG5cbiB9XG4gfWVsc2V7XG5jb25zdHt0aW1lckJyYW5kfT1ydDtcbmFncmVlZFRpbWVyQnJhbmQodGltZXJCcmFuZCxicmFuZCk7XG5tdXN0TWF0Y2gocnQsUmVsYXRpdmVUaW1lU2hhcGUsJ3JlbGF0aXZlVGltZScpO1xucmV0dXJuIHJ0O1xuIH1cbiB9O1xuXG5jb25zdCBhZGRBYnNSZWw9KGFicyxyZWwpPT5cbmFic0xpa2UoYWJzLHJlbCxhYnNWYWx1ZShhYnMpK3JlbFZhbHVlKHJlbCkpO1xuXG5jb25zdCBhZGRSZWxSZWw9KHJlbDEscmVsMik9PlxucmVsTGlrZShyZWwxLHJlbDIscmVsVmFsdWUocmVsMSkrcmVsVmFsdWUocmVsMikpO1xuXG5jb25zdCBzdWJ0cmFjdEFic0Ficz0oYWJzMSxhYnMyKT0+XG5yZWxMaWtlKGFiczEsYWJzMixhYnNWYWx1ZShhYnMxKS1hYnNWYWx1ZShhYnMyKSk7XG5cbmNvbnN0IGNsYW1wZWRTdWJ0cmFjdEFic0Ficz0oYWJzMSxhYnMyKT0+e1xuY29uc3QgdmFsMT1hYnNWYWx1ZShhYnMxKTtcbmNvbnN0IHZhbDI9YWJzVmFsdWUoYWJzMik7XG5yZXR1cm4gcmVsTGlrZShhYnMxLGFiczIsdmFsMT52YWwyP3ZhbDEtdmFsMjowbik7XG4gfTtcblxuY29uc3Qgc3VidHJhY3RBYnNSZWw9KGFicyxyZWwpPT5cbmFic0xpa2UoYWJzLHJlbCxhYnNWYWx1ZShhYnMpLXJlbFZhbHVlKHJlbCkpO1xuXG5jb25zdCBzdWJ0cmFjdFJlbFJlbD0ocmVsMSxyZWwyKT0+XG5yZWxMaWtlKHJlbDEscmVsMixyZWxWYWx1ZShyZWwxKS1yZWxWYWx1ZShyZWwyKSk7XG5cbmNvbnN0IGlzUmVsWmVybz0ocmVsKT0+cmVsVmFsdWUocmVsKT09PTBuO1xuXG5jb25zdCBtdWx0aXBseVJlbE5hdD0ocmVsLG5hdCk9PnJlbExpa2UocmVsLG5hdCxyZWxWYWx1ZShyZWwpKm5hdCk7XG5cbmNvbnN0IGRpdmlkZVJlbE5hdD0ocmVsLG5hdCk9PnJlbExpa2UocmVsLG5hdCxyZWxWYWx1ZShyZWwpL25hdCk7XG5cbmNvbnN0IGRpdmlkZVJlbFJlbD0ocmVsMSxyZWwyKT0+e1xuc2hhcmVkVGltZXJCcmFuZChyZWwxLHJlbDIpOy8qIGp1c3QgZXJyb3IgY2hlY2sqL1xucmV0dXJuIHJlbFZhbHVlKHJlbDEpL3JlbFZhbHVlKHJlbDIpO1xuIH07XG5cbmNvbnN0IG1vZEFic1JlbD0oYWJzLHN0ZXApPT5cbnJlbExpa2UoYWJzLHN0ZXAsYWJzVmFsdWUoYWJzKSVyZWxWYWx1ZShzdGVwKSk7XG5cbmNvbnN0IG1vZFJlbFJlbD0ocmVsLHN0ZXApPT5cbnJlbExpa2UocmVsLHN0ZXAscmVsVmFsdWUocmVsKSVyZWxWYWx1ZShzdGVwKSk7XG5cbi8qKlxuICogYGNvbXBhcmVWYWx1ZXNgIGlzIGludGVybmFsIHRvIHRoaXMgbW9kdWxlLCBhbmQgdXNlZCB0byBpbXBsZW1lbnRcbiAqIHRoZSB0aW1lIGNvbXBhcmlzb24gb3BlcmF0b3JzLlxuICpcbiAqIEBwYXJhbSB7YmlnaW50fSB2MVxuICogQHBhcmFtIHtiaWdpbnR9IHYyXG4gKiBAcmV0dXJucyB7UmFua0NvbXBhcmlzb259XG4gKi9cbmNvbnN0IGNvbXBhcmVWYWx1ZXM9KHYxLHYyKT0+e1xuaWYodjE8djIpe1xucmV0dXJuLTE7XG4gfWVsc2UgaWYodjE9PT12Mil7XG5yZXR1cm4gMDtcbiB9ZWxzZXtcbmFzc2VydCh2MT52Mik7XG5yZXR1cm4gMTtcbiB9XG4gfTtcblxuLyoqXG4gKiBUaGUgYFRpbWVNYXRoYCBvYmplY3QgcHJvdmlkZXMgaGVscGVyIG1ldGhvZHMgdG8gZG8gYXJpdGhtZXRpYyBvbiBsYWJlbGVkXG4gKiB0aW1lIHZhbHVlcywgbXVjaCBsaWtlIGBBbW91bnRNYXRoYCBwcm92aWRlcyBoZWxwZXIgbWV0aG9kcyB0byBkbyBhcml0aG1ldGljXG4gKiBvbiBsYWJlbGVkIGFzc2V0L21vbmV5IHZhbHVlcy4gQm90aCBjaGVjayBmb3IgY29uc2lzdGVuY3kgb2YgbGFiZWxzOiBhXG4gKiBiaW5hcnkgb3BlcmF0aW9uIG9uIHR3byBsYWJlbGVkIG9iamVjdHMgZW5zdXJlcyB0aGF0IHRoZSBib3RoIGNhcnJ5XG4gKiB0aGUgc2FtZSBsYWJlbC4gSWYgdGhleSBwcm9kdWNlIGFub3RoZXIgb2JqZWN0IGZyb20gdGhlIHNhbWUgZG9tYWluLCBpdFxuICogd2lsbCBjYXJyeSB0aGUgc2FtZSBsYWJlbC4gSWYgdGhlIG9wZXJhbmRzIGhhdmUgaW5jb21wYXRpYmxlIGxhYmVscyxcbiAqIGFuIGVycm9yIGlzIHRocm93bi5cbiAqXG4gKiBVbmxpa2UgYW1vdW50IGFyaXRobWV0aWMsIHRpbWUgYXJpdGhtZXRpYyBkZWFscyBpbiB0d28ga2luZHMgb2YgdGltZSBvYmplY3RzOlxuICogVGltZXN0YW1wcywgd2hpY2ggcmVwcmVzZW50IGFic29sdXRlIHRpbWUsIGFuZCBSZWxhdGl2ZVRpbWUsIHdoaWNoIHJlcHJlc2VudHNcbiAqIHRoZSBkdXJhdGlvbiBiZXR3ZWVuIHR3byBhYnNvbHV0ZSB0aW1lcy4gQm90aCBraW5kcyBvZiB0aW1lIG9iamVjdFxuICogYXJlIGxhYmVsZWQgYnkgYSBgVGltZXJCcmFuZGAuIEZvciBhIFRpbWVzdGFtcCBvYmplY3QsIHRoZSB2YWx1ZSBpc1xuICogYSBiaWdpbnQgaW4gYW4gYGFic1ZhbHVlYCBwcm9wZXJ0eS4gRm9yIGEgUmVsYXRpdmVUaW1lIG9iamVjdCwgdGhlIHZhbHVlXG4gKiBpcyBhIGJpZ2ludCBpbiBhIGByZWxWYWx1ZWAgcHJvcGVydHkuIFRodXMgd2UgaGF2ZSBhIHJ1bnRpbWUgc2FmZXR5IGNoZWNrXG4gKiB0byBlbnN1cmUgdGhhdCB3ZSBkb24ndCBjb25mdXNlZCB0aGUgdHdvLCBldmVuIGlmIHdlIGhhdmUgbWFuYWdlZCB0byBmb29sXG4gKiB0aGUgKHVuc291bmQpIHN0YXRpYyB0eXBlIHN5c3RlbS5cbiAqXG4gKiBBcyBhIHRyYW5zaXRpb25hbCBtZWFzdXJlLCBjdXJyZW50bHkgbWFueSBUaW1lc3RhbXBzIGFuZCBSZWxhdGl2ZVRpbWVzIGFyZVxuICogc3RpbGwgcmVwcmVzZW50ZWQgYnkgdW5sYWJlbGVkIGJpZ2ludHMuIER1cmluZyB0aGlzIHRyYW5zaXRpb25hbCBwZXJpb2QsXG4gKiB3ZSBhbGxvdyB0aGlzLCBib3RoIHN0YXRpY2FsbHkgYW5kIGR5bmFtaWNhbGx5LiBGb3IgYSBub3JtYWwgYmluYXJ5XG4gKiBvcGVyYXRpb24sIGlmIGJvdGggaW5wdXRzIGFyZSBsYWJlbGVkLCB0aGVuIHdlIGRvIHRoZSBmdWxsIGNoZWNraW5nIGFzXG4gKiBleHBsYWluZWQgYWJvdmUgYW5kIHJldHVybiBhIGxhYmVsZWQgcmVzdWx0LiBJZiBib3RoIGlucHV0cyBhcmUgdW5sYWJlbGVkXG4gKiBiaWdpbnRzLCB3ZSAqYXNzdW1lKiB0aGF0IHRoZXkgaW5kaWNhdGUgYSB0aW1lIG9mIHRoZSByaWdodCBraW5kXG4gKiAoVGltZXN0YW1wIHZzIFJlbGF0aXZlVGltZSkgYW5kIHRpbWVyIGJyYW5kLiBTaW5jZSB3ZSBkb24ndCBrbm93IHdoYXRcbiAqIGJyYW5kIHdhcyBpbnRlbmRlZCwgd2UgY2FuIG9ubHkgcmV0dXJuIHlldCBhbm90aGVyIHVubGFiZWxlZCBiaWdpbnQuXG4gKlxuICogSWYgb25lIG9wZXJhbmQgaXMgbGFiZWxlZCBhbmQgdGhlIG90aGVyIGlzIG5vdCwgd2UgY2hlY2sgdGhlIGxhYmVsZWQgb3BlcmFuZCxcbiAqICphc3N1bWUqIHRoZSB1bmxhYmVsZWQgYmlnaW50IHJlcHJlc2VudHMgdGhlIHZhbHVlIG5lZWRlZCBmb3IgdGhlIG90aGVyXG4gKiBvcGVyYW5kLCBhbmQgcmV0dXJuIGEgbGFiZWxlZCB0aW1lIG9iamVjdCB3aXRoIHRoZSBicmFuZCBvZiB0aGUgbGFiZWxlZFxuICogb3BlcmFuZC5cbiAqXG4gKiBAdHlwZSB7VGltZU1hdGhUeXBlfVxuICovXG5jb25zdCAgICAgICAgVGltZU1hdGg9aGFyZGVuKHtcbmFic1ZhbHVlLFxucmVsVmFsdWUsXG50b0FicyxcbnRvUmVsLFxuYWRkQWJzUmVsLFxuYWRkUmVsUmVsLFxuc3VidHJhY3RBYnNBYnMsXG5jbGFtcGVkU3VidHJhY3RBYnNBYnMsXG5zdWJ0cmFjdEFic1JlbCxcbnN1YnRyYWN0UmVsUmVsLFxuaXNSZWxaZXJvLFxubXVsdGlwbHlSZWxOYXQsXG5kaXZpZGVSZWxOYXQsXG5kaXZpZGVSZWxSZWwsXG5tb2RBYnNSZWwsXG5tb2RSZWxSZWwsXG5jb21wYXJlQWJzOihhYnMxLGFiczIpPT5jb21wYXJlVmFsdWVzKGFic1ZhbHVlKGFiczEpLGFic1ZhbHVlKGFiczIpKSxcbmNvbXBhcmVSZWw6KHJlbDEscmVsMik9PmNvbXBhcmVWYWx1ZXMocmVsVmFsdWUocmVsMSkscmVsVmFsdWUocmVsMikpfSk7JGjigI1fb25jZS5UaW1lTWF0aChUaW1lTWF0aCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiVGltZU1hdGgiOlsiVGltZU1hdGgiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA0kaFHZIHAACSBwAAJQAAAEBhZ29yaWMvdGltZS12MC4yLjEvc3JjL3R5cGVHdWFyZHMuanN7ImltcG9ydHMiOlsiQGFnb3JpYy9zdG9yZSJdLCJleHBvcnRzIjpbIlJlbGF0aXZlVGltZVJlY29yZFNoYXBlIiwiUmVsYXRpdmVUaW1lU2hhcGUiLCJSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlIiwiVGltZXJCcmFuZFNoYXBlIiwiVGltZXJTZXJ2aWNlU2hhcGUiLCJUaW1lc3RhbXBSZWNvcmRTaGFwZSIsIlRpbWVzdGFtcFNoYXBlIiwiVGltZXN0YW1wVmFsdWVTaGFwZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBNOyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuY29uc3QgICAgICAgIFRpbWVyQnJhbmRTaGFwZT1NLnJlbW90YWJsZSgnVGltZXJCcmFuZCcpOyRo4oCNX29uY2UuVGltZXJCcmFuZFNoYXBlKFRpbWVyQnJhbmRTaGFwZSk7XG5jb25zdCAgICAgICAgVGltZXN0YW1wVmFsdWVTaGFwZT1NLm5hdCgpOyRo4oCNX29uY2UuVGltZXN0YW1wVmFsdWVTaGFwZShUaW1lc3RhbXBWYWx1ZVNoYXBlKTtcbmNvbnN0ICAgICAgICBSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlPU0ubmF0KCk7LyogU2hvdWxkIHdlIGFsbG93IG5lZ2F0aXZlcz8qLyRo4oCNX29uY2UuUmVsYXRpdmVUaW1lVmFsdWVTaGFwZShSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlKTtcblxuY29uc3QgICAgICAgIFRpbWVzdGFtcFJlY29yZFNoYXBlPWhhcmRlbih7XG50aW1lckJyYW5kOlRpbWVyQnJhbmRTaGFwZSxcbmFic1ZhbHVlOlRpbWVzdGFtcFZhbHVlU2hhcGV9KTskaOKAjV9vbmNlLlRpbWVzdGFtcFJlY29yZFNoYXBlKFRpbWVzdGFtcFJlY29yZFNoYXBlKTtcblxuXG5jb25zdCAgICAgICAgUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGU9aGFyZGVuKHtcbnRpbWVyQnJhbmQ6VGltZXJCcmFuZFNoYXBlLFxucmVsVmFsdWU6UmVsYXRpdmVUaW1lVmFsdWVTaGFwZX0pOyRo4oCNX29uY2UuUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUoUmVsYXRpdmVUaW1lUmVjb3JkU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBUaW1lc3RhbXBTaGFwZT1NLm9yKFRpbWVzdGFtcFJlY29yZFNoYXBlLFRpbWVzdGFtcFZhbHVlU2hhcGUpOyRo4oCNX29uY2UuVGltZXN0YW1wU2hhcGUoVGltZXN0YW1wU2hhcGUpO1xuY29uc3QgICAgICAgIFJlbGF0aXZlVGltZVNoYXBlPU0ub3IoXG5SZWxhdGl2ZVRpbWVSZWNvcmRTaGFwZSxcblJlbGF0aXZlVGltZVZhbHVlU2hhcGUpOyRo4oCNX29uY2UuUmVsYXRpdmVUaW1lU2hhcGUoUmVsYXRpdmVUaW1lU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBUaW1lclNlcnZpY2VTaGFwZT1NLnJlbW90YWJsZSgnVGltZXJTZXJ2aWNlJyk7JGjigI1fb25jZS5UaW1lclNlcnZpY2VTaGFwZShUaW1lclNlcnZpY2VTaGFwZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiVGltZXJCcmFuZFNoYXBlIjpbIlRpbWVyQnJhbmRTaGFwZSJdLCJUaW1lc3RhbXBWYWx1ZVNoYXBlIjpbIlRpbWVzdGFtcFZhbHVlU2hhcGUiXSwiUmVsYXRpdmVUaW1lVmFsdWVTaGFwZSI6WyJSZWxhdGl2ZVRpbWVWYWx1ZVNoYXBlIl0sIlRpbWVzdGFtcFJlY29yZFNoYXBlIjpbIlRpbWVzdGFtcFJlY29yZFNoYXBlIl0sIlJlbGF0aXZlVGltZVJlY29yZFNoYXBlIjpbIlJlbGF0aXZlVGltZVJlY29yZFNoYXBlIl0sIlRpbWVzdGFtcFNoYXBlIjpbIlRpbWVzdGFtcFNoYXBlIl0sIlJlbGF0aXZlVGltZVNoYXBlIjpbIlJlbGF0aXZlVGltZVNoYXBlIl0sIlRpbWVyU2VydmljZVNoYXBlIjpbIlRpbWVyU2VydmljZVNoYXBlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMWKZsP/KAAA/ygAACgAAABAYWdvcmljL3ZhdC1kYXRhLXYwLjQuMy9zcmMvZXhvLXV0aWxzLmpzeyJpbXBvcnRzIjpbIi4vdmF0LWRhdGEtYmluZGluZ3MuanMiLCJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiZGVmaW5lRHVyYWJsZUV4b0NsYXNzIiwiZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0IiwiZGVmaW5lVmlydHVhbEV4b0NsYXNzIiwiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0IiwiaWdub3JlQ29udGV4dCIsIm1ha2VFeG9VdGlscyIsInByZXBhcmVFeG8iLCJwcmVwYXJlRXhvQ2xhc3MiLCJwcmVwYXJlRXhvQ2xhc3NLaXQiLCJwcmVwYXJlS2luZCIsInByZXBhcmVLaW5kTXVsdGkiLCJwcmVwYXJlU2luZ2xldG9uIiwicHJvdmlkZUtpbmRIYW5kbGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaW5pdEVtcHR5LHByb3ZpZGUsZ2xvYmFsVmF0RGF0YTskaOKAjV9pbXBvcnRzKFtbXCJAYWdvcmljL3N0b3JlXCIsIFtbXCJpbml0RW1wdHlcIiwgWyRo4oCNX2EgPT4gKGluaXRFbXB0eSA9ICRo4oCNX2EpXV1dXSxbXCIuL3ZhdC1kYXRhLWJpbmRpbmdzLmpzXCIsIFtbXCJwcm92aWRlXCIsIFskaOKAjV9hID0+IChwcm92aWRlID0gJGjigI1fYSldXSxbXCJWYXREYXRhXCIsIFskaOKAjV9hID0+IChnbG9iYWxWYXREYXRhID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG4vKiogQHRlbXBsYXRlIEwsUiBAdHlwZWRlZiB7WGltcG9ydCgnQGVuZG8vZXZlbnR1YWwtc2VuZCcpLlJlbW90YWJsZUJyYW5kPEwsIFI+fSBSZW1vdGFibGVCcmFuZCAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9mYXInKS5FUmVmPFQ+fSBFUmVmICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5CYWdnYWdlfSBCYWdnYWdlICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5EZWZpbmVLaW5kT3B0aW9uczxUPn0gRGVmaW5lS2luZE9wdGlvbnMgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLktpbmRGYWNldDxUPn0gS2luZEZhY2V0ICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5LaW5kRmFjZXRzPFQ+fSBLaW5kRmFjZXRzICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5EdXJhYmxlS2luZEhhbmRsZX0gRHVyYWJsZUtpbmRIYW5kbGUgKi9cblxuLyoqXG4gKiBNYWtlIGEgdmVyc2lvbiBvZiB0aGUgYXJndW1lbnQgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIGtpbmQgY29udGV4dCBidXRcbiAqIGlnbm9yZXMgaXQuXG4gKlxuICogQHR5cGUgezxUIGV4dGVuZHMgRnVuY3Rpb24+KGZuOiBUKSA9PiBYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGx1c0NvbnRleHQ8bmV2ZXIsIFQ+fVxuICovXG5jb25zdCAgICAgICAgaWdub3JlQ29udGV4dD1cbihmbik9PlxuKF9jb250ZXh0LC4uLmFyZ3MpPT5cbmZuKC4uLmFyZ3MpOyRo4oCNX29uY2UuaWdub3JlQ29udGV4dChpZ25vcmVDb250ZXh0KTtcbmhhcmRlbihpZ25vcmVDb250ZXh0KTtcblxuLyogVE9ETzogRmluZCBhIGdvb2QgaG9tZSBmb3IgdGhpcyBmdW5jdGlvbiB1c2VkIGJ5IEBhZ29yaWMvdmF0LWRhdGEgYW5kIHRlc3RpbmcgY29kZSovXG5jb25zdCAgICAgICAgbWFrZUV4b1V0aWxzPShWYXREYXRhKT0+e1xuY29uc3R7XG5kZWZpbmVLaW5kLFxuZGVmaW5lS2luZE11bHRpLFxuZGVmaW5lRHVyYWJsZUtpbmQsXG5kZWZpbmVEdXJhYmxlS2luZE11bHRpLFxubWFrZUtpbmRIYW5kbGV9PVxuVmF0RGF0YTtcblxuLyoqXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHJldHVybnMge0R1cmFibGVLaW5kSGFuZGxlfVxuICovXG5jb25zdCBwcm92aWRlS2luZEhhbmRsZT0oYmFnZ2FnZSxraW5kTmFtZSk9PlxucHJvdmlkZShiYWdnYWdlLCBgJHtraW5kTmFtZX1fa2luZEhhbmRsZWAsKCk9Pm1ha2VLaW5kSGFuZGxlKGtpbmROYW1lKSk7XG5oYXJkZW4ocHJvdmlkZUtpbmRIYW5kbGUpO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBwcmVwYXJlRXhvQ2xhc3MgaW5zdGVhZFxuICogQHR5cGUge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QcmVwYXJlS2luZH1cbiAqL1xuY29uc3QgcHJlcGFyZUtpbmQ9KFxuYmFnZ2FnZSxcbmtpbmROYW1lLFxuaW5pdCxcbmJlaGF2aW9yLFxub3B0aW9ucz11bmRlZmluZWQpPT5cblxuZGVmaW5lRHVyYWJsZUtpbmQoXG5wcm92aWRlS2luZEhhbmRsZShiYWdnYWdlLGtpbmROYW1lKSxcbmluaXQsXG5iZWhhdmlvcixcbm9wdGlvbnMpO1xuXG5oYXJkZW4ocHJlcGFyZUtpbmQpO1xuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBwcmVwYXJlRXhvQ2xhc3NLaXQgaW5zdGVhZFxuICogQHR5cGUge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QcmVwYXJlS2luZE11bHRpfVxuICovXG5jb25zdCBwcmVwYXJlS2luZE11bHRpPShcbmJhZ2dhZ2UsXG5raW5kTmFtZSxcbmluaXQsXG5iZWhhdmlvcixcbm9wdGlvbnM9dW5kZWZpbmVkKT0+XG5cbmRlZmluZUR1cmFibGVLaW5kTXVsdGkoXG5wcm92aWRlS2luZEhhbmRsZShiYWdnYWdlLGtpbmROYW1lKSxcbmluaXQsXG5iZWhhdmlvcixcbm9wdGlvbnMpO1xuXG5oYXJkZW4ocHJlcGFyZUtpbmRNdWx0aSk7XG5cbi8qIFRPRE8gaW50ZXJmYWNlR3VhcmQgdHlwZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzYyMDYqL1xuLyoqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnkpID0+IGFueX0gSSBpbml0IHN0YXRlIGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUgVCBiZWhhdmlvclxuICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICogQHBhcmFtIHthbnl9IGludGVyZmFjZUd1YXJkXG4gKiBAcGFyYW0ge0l9IGluaXRcbiAqIEBwYXJhbSB7VCAmIFRoaXNUeXBlPHsgc2VsZjogVCwgc3RhdGU6IFJldHVyblR5cGU8ST4gfT59IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8eyBzZWxmOiBULCBzdGF0ZTogUmV0dXJuVHlwZTxJPiB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IChUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+KX1cbiAqL1xuY29uc3QgZGVmaW5lVmlydHVhbEV4b0NsYXNzPSh0YWcsaW50ZXJmYWNlR3VhcmQsaW5pdCxtZXRob2RzLG9wdGlvbnMpPT5cbmRlZmluZUtpbmQodGFnLGluaXQsbWV0aG9kcyx7XG4uLi5vcHRpb25zLFxudGhpc2Z1bE1ldGhvZHM6dHJ1ZSxcbmludGVyZmFjZUd1YXJkfSk7XG5cbmhhcmRlbihkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MpO1xuXG4vKiBUT0RPIGludGVyZmFjZUd1YXJkIHR5cGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MjA2Ki9cbi8qKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55KSA9PiBhbnl9IEkgaW5pdCBzdGF0ZSBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nLCBSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPj59IFQgZmFjZXRzXG4gKiBAcGFyYW0ge3N0cmluZ30gdGFnXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRLaXRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICYgVGhpc1R5cGU8eyBmYWNldHM6IFQsIHN0YXRlOiBSZXR1cm5UeXBlPEk+IH0+IH0gZmFjZXRzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHsgZmFjZXRzOiBULCBzdGF0ZTogUmV0dXJuVHlwZTxJPiB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IChUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+KX1cbiAqL1xuY29uc3QgZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0PShcbnRhZyxcbmludGVyZmFjZUd1YXJkS2l0LFxuaW5pdCxcbmZhY2V0cyxcbm9wdGlvbnMpPT5cblxuZGVmaW5lS2luZE11bHRpKHRhZyxpbml0LGZhY2V0cyx7XG4uLi5vcHRpb25zLFxudGhpc2Z1bE1ldGhvZHM6dHJ1ZSxcbmludGVyZmFjZUd1YXJkOmludGVyZmFjZUd1YXJkS2l0fSk7XG5cbmhhcmRlbihkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQpO1xuXG4vKiBUT0RPIGludGVyZmFjZUd1YXJkIHR5cGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MjA2Ki9cbi8qKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55KSA9PiBhbnl9IEkgaW5pdCBzdGF0ZSBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPn0gVCBtZXRob2RzXG4gKiBAcGFyYW0ge0R1cmFibGVLaW5kSGFuZGxlfSBraW5kSGFuZGxlXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICYgVGhpc1R5cGU8eyBzZWxmOiBULCBzdGF0ZTogUmV0dXJuVHlwZTxJPiB9Pn0gbWV0aG9kc1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7IHNlbGY6IFQsIHN0YXRlOiBSZXR1cm5UeXBlPEk+IH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHsoLi4uYXJnczogUGFyYW1ldGVyczxJPikgPT4gKFQgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD4pfVxuICovXG5jb25zdCBkZWZpbmVEdXJhYmxlRXhvQ2xhc3M9KFxua2luZEhhbmRsZSxcbmludGVyZmFjZUd1YXJkLFxuaW5pdCxcbm1ldGhvZHMsXG5vcHRpb25zKT0+XG5cbmRlZmluZUR1cmFibGVLaW5kKGtpbmRIYW5kbGUsaW5pdCxtZXRob2RzLHtcbi4uLm9wdGlvbnMsXG50aGlzZnVsTWV0aG9kczp0cnVlLFxuaW50ZXJmYWNlR3VhcmR9KTtcblxuaGFyZGVuKGRlZmluZUR1cmFibGVFeG9DbGFzcyk7XG5cbi8qIFRPRE8gaW50ZXJmYWNlR3VhcmQgdHlwZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzYyMDYqL1xuLyoqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnkpID0+IGFueX0gSSBpbml0IHN0YXRlIGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+Pn0gVCBmYWNldHNcbiAqIEBwYXJhbSB7RHVyYWJsZUtpbmRIYW5kbGV9IGtpbmRIYW5kbGVcbiAqIEBwYXJhbSB7YW55fSBpbnRlcmZhY2VHdWFyZEtpdFxuICogQHBhcmFtIHtJfSBpbml0XG4gKiBAcGFyYW0ge1QgJiBUaGlzVHlwZTx7IGZhY2V0czogVCwgc3RhdGU6IFJldHVyblR5cGU8ST59PiB9IGZhY2V0c1xuICogQHBhcmFtIHtEZWZpbmVLaW5kT3B0aW9uczx7IGZhY2V0czogVCwgc3RhdGU6IFJldHVyblR5cGU8ST59Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IChUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+KX1cbiAqL1xuY29uc3QgZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0PShcbmtpbmRIYW5kbGUsXG5pbnRlcmZhY2VHdWFyZEtpdCxcbmluaXQsXG5mYWNldHMsXG5vcHRpb25zKT0+XG5cbmRlZmluZUR1cmFibGVLaW5kTXVsdGkoa2luZEhhbmRsZSxpbml0LGZhY2V0cyx7XG4uLi5vcHRpb25zLFxudGhpc2Z1bE1ldGhvZHM6dHJ1ZSxcbmludGVyZmFjZUd1YXJkOmludGVyZmFjZUd1YXJkS2l0fSk7XG5cbmhhcmRlbihkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQpO1xuXG4vKiBUT0RPIGludGVyZmFjZUd1YXJkIHR5cGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MjA2Ki9cbi8qKlxuICogQHRlbXBsYXRlIHsoLi4uYXJnczogYW55KSA9PiBhbnl9IEkgaW5pdCBzdGF0ZSBmdW5jdGlvblxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPn0gVCBtZXRob2RzXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHBhcmFtIHthbnl9IGludGVyZmFjZUd1YXJkXG4gKiBAcGFyYW0ge0l9IGluaXRcbiAqIEBwYXJhbSB7VCAmIFRoaXNUeXBlPHsgc2VsZjogVCwgc3RhdGU6IFJldHVyblR5cGU8ST4gfT59IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8eyBzZWxmOiBULCBzdGF0ZTogUmV0dXJuVHlwZTxJPiB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IChUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+KX1cbiAqL1xuY29uc3QgcHJlcGFyZUV4b0NsYXNzPShcbmJhZ2dhZ2UsXG5raW5kTmFtZSxcbmludGVyZmFjZUd1YXJkLFxuaW5pdCxcbm1ldGhvZHMsXG5vcHRpb25zPXVuZGVmaW5lZCk9PlxuXG5kZWZpbmVEdXJhYmxlRXhvQ2xhc3MoXG5wcm92aWRlS2luZEhhbmRsZShiYWdnYWdlLGtpbmROYW1lKSxcbmludGVyZmFjZUd1YXJkLFxuaW5pdCxcbm1ldGhvZHMsXG5vcHRpb25zKTtcblxuaGFyZGVuKHByZXBhcmVFeG9DbGFzcyk7XG5cbi8qIFRPRE8gaW50ZXJmYWNlR3VhcmQgdHlwZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzYyMDYqL1xuLyoqXG4gKiBAdGVtcGxhdGUgeyguLi5hcmdzOiBhbnkpID0+IGFueX0gSSBpbml0IHN0YXRlIGZ1bmN0aW9uXG4gKiBAdGVtcGxhdGUge1JlY29yZDxzdHJpbmcsIFJlY29yZDxzdHJpbmcgfCBzeW1ib2wsIENhbGxhYmxlRnVuY3Rpb24+Pn0gVCBmYWNldHNcbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IGtpbmROYW1lXG4gKiBAcGFyYW0ge2FueX0gaW50ZXJmYWNlR3VhcmRLaXRcbiAqIEBwYXJhbSB7SX0gaW5pdFxuICogQHBhcmFtIHtUICYgVGhpc1R5cGU8eyBmYWNldHM6IFQsIHN0YXRlOiBSZXR1cm5UeXBlPEk+IH0+IH0gZmFjZXRzXG4gKiBAcGFyYW0ge0RlZmluZUtpbmRPcHRpb25zPHsgZmFjZXRzOiBULCBzdGF0ZTogUmV0dXJuVHlwZTxJPiB9Pn0gW29wdGlvbnNdXG4gKiBAcmV0dXJucyB7KC4uLmFyZ3M6IFBhcmFtZXRlcnM8ST4pID0+IChUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+KX1cbiAqL1xuY29uc3QgcHJlcGFyZUV4b0NsYXNzS2l0PShcbmJhZ2dhZ2UsXG5raW5kTmFtZSxcbmludGVyZmFjZUd1YXJkS2l0LFxuaW5pdCxcbmZhY2V0cyxcbm9wdGlvbnM9dW5kZWZpbmVkKT0+XG5cbmRlZmluZUR1cmFibGVFeG9DbGFzc0tpdChcbnByb3ZpZGVLaW5kSGFuZGxlKGJhZ2dhZ2Usa2luZE5hbWUpLFxuaW50ZXJmYWNlR3VhcmRLaXQsXG5pbml0LFxuZmFjZXRzLFxub3B0aW9ucyk7XG5cbmhhcmRlbihwcmVwYXJlRXhvQ2xhc3NLaXQpO1xuXG4vKiBUT0RPIGludGVyZmFjZUd1YXJkIHR5cGUgaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy82MjA2Ki9cbi8qKlxuICogQHRlbXBsYXRlIHtSZWNvcmQ8c3RyaW5nIHwgc3ltYm9sLCBDYWxsYWJsZUZ1bmN0aW9uPn0gTSBtZXRob2RzXG4gKiBAcGFyYW0ge0JhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBraW5kTmFtZVxuICogQHBhcmFtIHthbnl9IGludGVyZmFjZUd1YXJkXG4gKiBAcGFyYW0ge019IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8eyBzZWxmOiBNIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtNICYgUmVtb3RhYmxlQnJhbmQ8e30sIE0+fVxuICovXG5jb25zdCBwcmVwYXJlRXhvPShcbmJhZ2dhZ2UsXG5raW5kTmFtZSxcbmludGVyZmFjZUd1YXJkLFxubWV0aG9kcyxcbm9wdGlvbnM9dW5kZWZpbmVkKT0+XG57XG5jb25zdCBtYWtlU2luZ2xldG9uPXByZXBhcmVFeG9DbGFzcyhcbmJhZ2dhZ2UsXG5raW5kTmFtZSxcbmludGVyZmFjZUd1YXJkLFxuaW5pdEVtcHR5LFxubWV0aG9kcyxcbm9wdGlvbnMpO1xuXG5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvcHJlZmVyLXRzLWV4cGVjdC1lcnJvciAtLSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQ2MjAqL1xuLyogQHRzLWlnbm9yZSBjb3VsZCBiZSBpbnN0YW50aWF0ZWQgd2l0aCBhbiBhcmJpdHJhcnkgdHlwZSovXG5yZXR1cm4gcHJvdmlkZShiYWdnYWdlLCBgdGhlXyR7a2luZE5hbWV9YCwoKT0+bWFrZVNpbmdsZXRvbigpKTtcbiB9O1xuaGFyZGVuKHByZXBhcmVFeG8pO1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7UmVjb3JkPHN0cmluZyB8IHN5bWJvbCwgQ2FsbGFibGVGdW5jdGlvbj59IE0gbWV0aG9kc1xuICogQGRlcHJlY2F0ZWQgVXNlIHByZXBhcmVFeG8gaW5zdGVhZC5cbiAqIEBwYXJhbSB7QmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IGtpbmROYW1lXG4gKiBAcGFyYW0ge019IG1ldGhvZHNcbiAqIEBwYXJhbSB7RGVmaW5lS2luZE9wdGlvbnM8eyBzZWxmOiBNIH0+fSBbb3B0aW9uc11cbiAqIEByZXR1cm5zIHtNICYgUmVtb3RhYmxlQnJhbmQ8e30sIE0+fVxuICovXG5jb25zdCBwcmVwYXJlU2luZ2xldG9uPShiYWdnYWdlLGtpbmROYW1lLG1ldGhvZHMsb3B0aW9ucz11bmRlZmluZWQpPT5cbnByZXBhcmVFeG8oYmFnZ2FnZSxraW5kTmFtZSx1bmRlZmluZWQsbWV0aG9kcyxvcHRpb25zKTtcbmhhcmRlbihwcmVwYXJlU2luZ2xldG9uKTtcblxucmV0dXJuIGhhcmRlbih7XG5kZWZpbmVWaXJ0dWFsRXhvQ2xhc3MsXG5kZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQsXG5kZWZpbmVEdXJhYmxlRXhvQ2xhc3MsXG5kZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQsXG5wcmVwYXJlRXhvQ2xhc3MsXG5wcmVwYXJlRXhvQ2xhc3NLaXQsXG5wcmVwYXJlRXhvLFxucHJlcGFyZVNpbmdsZXRvbixcblxucHJvdmlkZUtpbmRIYW5kbGUsXG5wcmVwYXJlS2luZCxcbnByZXBhcmVLaW5kTXVsdGl9KTtcblxuIH07JGjigI1fb25jZS5tYWtlRXhvVXRpbHMobWFrZUV4b1V0aWxzKTtcblxuY29uc3QgZ2xvYmFsRXhvVXRpbHM9bWFrZUV4b1V0aWxzKGdsb2JhbFZhdERhdGEpO1xuXG5jb25zdCAgICAgICB7XG5kZWZpbmVWaXJ0dWFsRXhvQ2xhc3MsXG5kZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQsXG5kZWZpbmVEdXJhYmxlRXhvQ2xhc3MsXG5kZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQsXG5wcmVwYXJlRXhvQ2xhc3MsXG5wcmVwYXJlRXhvQ2xhc3NLaXQsXG5wcmVwYXJlRXhvLFxucHJlcGFyZVNpbmdsZXRvbn09XG5nbG9iYWxFeG9VdGlscztcblxuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgRXhvcy9FeG9DbGFzc2VzIGluc3RlYWQgb2YgS2luZHNcbiAqLyRo4oCNX29uY2UuZGVmaW5lVmlydHVhbEV4b0NsYXNzKGRlZmluZVZpcnR1YWxFeG9DbGFzcyk7JGjigI1fb25jZS5kZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQoZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0KTskaOKAjV9vbmNlLmRlZmluZUR1cmFibGVFeG9DbGFzcyhkZWZpbmVEdXJhYmxlRXhvQ2xhc3MpOyRo4oCNX29uY2UuZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0KGRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCk7JGjigI1fb25jZS5wcmVwYXJlRXhvQ2xhc3MocHJlcGFyZUV4b0NsYXNzKTskaOKAjV9vbmNlLnByZXBhcmVFeG9DbGFzc0tpdChwcmVwYXJlRXhvQ2xhc3NLaXQpOyRo4oCNX29uY2UucHJlcGFyZUV4byhwcmVwYXJlRXhvKTskaOKAjV9vbmNlLnByZXBhcmVTaW5nbGV0b24ocHJlcGFyZVNpbmdsZXRvbik7XG5jb25zdCAgICAgICB7cHJvdmlkZUtpbmRIYW5kbGUscHJlcGFyZUtpbmQscHJlcGFyZUtpbmRNdWx0aX09XG5nbG9iYWxFeG9VdGlsczskaOKAjV9vbmNlLnByb3ZpZGVLaW5kSGFuZGxlKHByb3ZpZGVLaW5kSGFuZGxlKTskaOKAjV9vbmNlLnByZXBhcmVLaW5kKHByZXBhcmVLaW5kKTskaOKAjV9vbmNlLnByZXBhcmVLaW5kTXVsdGkocHJlcGFyZUtpbmRNdWx0aSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaWdub3JlQ29udGV4dCI6WyJpZ25vcmVDb250ZXh0Il0sIm1ha2VFeG9VdGlscyI6WyJtYWtlRXhvVXRpbHMiXSwiZGVmaW5lVmlydHVhbEV4b0NsYXNzIjpbImRlZmluZVZpcnR1YWxFeG9DbGFzcyJdLCJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQiOlsiZGVmaW5lVmlydHVhbEV4b0NsYXNzS2l0Il0sImRlZmluZUR1cmFibGVFeG9DbGFzcyI6WyJkZWZpbmVEdXJhYmxlRXhvQ2xhc3MiXSwiZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0IjpbImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCJdLCJwcmVwYXJlRXhvQ2xhc3MiOlsicHJlcGFyZUV4b0NsYXNzIl0sInByZXBhcmVFeG9DbGFzc0tpdCI6WyJwcmVwYXJlRXhvQ2xhc3NLaXQiXSwicHJlcGFyZUV4byI6WyJwcmVwYXJlRXhvIl0sInByZXBhcmVTaW5nbGV0b24iOlsicHJlcGFyZVNpbmdsZXRvbiJdLCJwcm92aWRlS2luZEhhbmRsZSI6WyJwcm92aWRlS2luZEhhbmRsZSJdLCJwcmVwYXJlS2luZCI6WyJwcmVwYXJlS2luZCJdLCJwcmVwYXJlS2luZE11bHRpIjpbInByZXBhcmVLaW5kTXVsdGkiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAN+OMsmUTAABlEwAAJAAAAEBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zL3NyYy9pbmRleC5qc3siaW1wb3J0cyI6WyIuL2V4by11dGlscy5qcyIsIi4vdmF0LWRhdGEtYmluZGluZ3MuanMiLCJAYWdvcmljL3N0b3JlIl0sImV4cG9ydHMiOlsiTSIsImNhbkJlRHVyYWJsZSIsImRlZmluZUR1cmFibGVFeG9DbGFzcyIsImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdCIsImRlZmluZUR1cmFibGVLaW5kIiwiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSIsImRlZmluZUtpbmQiLCJkZWZpbmVLaW5kTXVsdGkiLCJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MiLCJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQiLCJpZ25vcmVDb250ZXh0IiwibWFrZUtpbmRIYW5kbGUiLCJtYWtlU2NhbGFyQmlnTWFwU3RvcmUiLCJtYWtlU2NhbGFyQmlnU2V0U3RvcmUiLCJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSIsIm1ha2VTY2FsYXJNYXBTdG9yZSIsIm1ha2VTY2FsYXJTZXRTdG9yZSIsIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmUiLCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIiwicGFydGlhbEFzc2lnbiIsInBpY2tGYWNldCIsInByZXBhcmVFeG8iLCJwcmVwYXJlRXhvQ2xhc3MiLCJwcmVwYXJlRXhvQ2xhc3NLaXQiLCJwcmVwYXJlS2luZCIsInByZXBhcmVLaW5kTXVsdGkiLCJwcmVwYXJlU2luZ2xldG9uIiwicHJvdmlkZSIsInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiLCJwcm92aWRlRHVyYWJsZVNldFN0b3JlIiwicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUiLCJwcm92aWRlS2luZEhhbmRsZSIsInByb3ZpZGVQcm9taXNlV2F0Y2hlciIsIndhdGNoUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIiwgWyRo4oCNX2xpdmVbXCJNXCJdXV0sW1wibWFrZVNjYWxhck1hcFN0b3JlXCIsIFskaOKAjV9saXZlW1wibWFrZVNjYWxhck1hcFN0b3JlXCJdXV0sW1wibWFrZVNjYWxhcldlYWtNYXBTdG9yZVwiLCBbJGjigI1fbGl2ZVtcIm1ha2VTY2FsYXJXZWFrTWFwU3RvcmVcIl1dXSxbXCJtYWtlU2NhbGFyU2V0U3RvcmVcIiwgWyRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyU2V0U3RvcmVcIl1dXSxbXCJtYWtlU2NhbGFyV2Vha1NldFN0b3JlXCIsIFskaOKAjV9saXZlW1wibWFrZVNjYWxhcldlYWtTZXRTdG9yZVwiXV1dXV0sW1wiLi92YXQtZGF0YS1iaW5kaW5ncy5qc1wiLCBbW1wibWFrZUtpbmRIYW5kbGVcIiwgWyRo4oCNX2xpdmVbXCJtYWtlS2luZEhhbmRsZVwiXV1dLFtcInByb3ZpZGVQcm9taXNlV2F0Y2hlclwiLCBbJGjigI1fbGl2ZVtcInByb3ZpZGVQcm9taXNlV2F0Y2hlclwiXV1dLFtcIndhdGNoUHJvbWlzZVwiLCBbJGjigI1fbGl2ZVtcIndhdGNoUHJvbWlzZVwiXV1dLFtcIm1ha2VTY2FsYXJCaWdNYXBTdG9yZVwiLCBbJGjigI1fbGl2ZVtcIm1ha2VTY2FsYXJCaWdNYXBTdG9yZVwiXV1dLFtcIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmVcIiwgWyRo4oCNX2xpdmVbXCJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlXCJdXV0sW1wibWFrZVNjYWxhckJpZ1NldFN0b3JlXCIsIFskaOKAjV9saXZlW1wibWFrZVNjYWxhckJpZ1NldFN0b3JlXCJdXV0sW1wibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZVwiLCBbJGjigI1fbGl2ZVtcIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmVcIl1dXSxbXCJjYW5CZUR1cmFibGVcIiwgWyRo4oCNX2xpdmVbXCJjYW5CZUR1cmFibGVcIl1dXSxbXCJwaWNrRmFjZXRcIiwgWyRo4oCNX2xpdmVbXCJwaWNrRmFjZXRcIl1dXSxbXCJwYXJ0aWFsQXNzaWduXCIsIFskaOKAjV9saXZlW1wicGFydGlhbEFzc2lnblwiXV1dLFtcInByb3ZpZGVcIiwgWyRo4oCNX2xpdmVbXCJwcm92aWRlXCJdXV0sW1wicHJvdmlkZUR1cmFibGVNYXBTdG9yZVwiLCBbJGjigI1fbGl2ZVtcInByb3ZpZGVEdXJhYmxlTWFwU3RvcmVcIl1dXSxbXCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZVwiLCBbJGjigI1fbGl2ZVtcInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlXCJdXV0sW1wicHJvdmlkZUR1cmFibGVTZXRTdG9yZVwiLCBbJGjigI1fbGl2ZVtcInByb3ZpZGVEdXJhYmxlU2V0U3RvcmVcIl1dXSxbXCJkZWZpbmVLaW5kXCIsIFskaOKAjV9saXZlW1wiZGVmaW5lS2luZFwiXV1dLFtcImRlZmluZUtpbmRNdWx0aVwiLCBbJGjigI1fbGl2ZVtcImRlZmluZUtpbmRNdWx0aVwiXV1dLFtcImRlZmluZUR1cmFibGVLaW5kXCIsIFskaOKAjV9saXZlW1wiZGVmaW5lRHVyYWJsZUtpbmRcIl1dXSxbXCJkZWZpbmVEdXJhYmxlS2luZE11bHRpXCIsIFskaOKAjV9saXZlW1wiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aVwiXV1dXV0sW1wiLi9leG8tdXRpbHMuanNcIiwgW1tcImRlZmluZVZpcnR1YWxFeG9DbGFzc1wiLCBbJGjigI1fbGl2ZVtcImRlZmluZVZpcnR1YWxFeG9DbGFzc1wiXV1dLFtcImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdFwiLCBbJGjigI1fbGl2ZVtcImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdFwiXV1dLFtcImRlZmluZUR1cmFibGVFeG9DbGFzc1wiLCBbJGjigI1fbGl2ZVtcImRlZmluZUR1cmFibGVFeG9DbGFzc1wiXV1dLFtcImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdFwiLCBbJGjigI1fbGl2ZVtcImRlZmluZUR1cmFibGVFeG9DbGFzc0tpdFwiXV1dLFtcInByZXBhcmVFeG9DbGFzc1wiLCBbJGjigI1fbGl2ZVtcInByZXBhcmVFeG9DbGFzc1wiXV1dLFtcInByZXBhcmVFeG9DbGFzc0tpdFwiLCBbJGjigI1fbGl2ZVtcInByZXBhcmVFeG9DbGFzc0tpdFwiXV1dLFtcInByZXBhcmVFeG9cIiwgWyRo4oCNX2xpdmVbXCJwcmVwYXJlRXhvXCJdXV0sW1wicHJlcGFyZVNpbmdsZXRvblwiLCBbJGjigI1fbGl2ZVtcInByZXBhcmVTaW5nbGV0b25cIl1dXSxbXCJpZ25vcmVDb250ZXh0XCIsIFskaOKAjV9saXZlW1wiaWdub3JlQ29udGV4dFwiXV1dLFtcInByb3ZpZGVLaW5kSGFuZGxlXCIsIFskaOKAjV9saXZlW1wicHJvdmlkZUtpbmRIYW5kbGVcIl1dXSxbXCJwcmVwYXJlS2luZFwiLCBbJGjigI1fbGl2ZVtcInByZXBhcmVLaW5kXCJdXV0sW1wicHJlcGFyZUtpbmRNdWx0aVwiLCBbJGjigI1fbGl2ZVtcInByZXBhcmVLaW5kTXVsdGlcIl1dXV1dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnsiTSI6WyJNIixmYWxzZV0sIm1ha2VTY2FsYXJNYXBTdG9yZSI6WyJtYWtlU2NhbGFyTWFwU3RvcmUiLGZhbHNlXSwibWFrZVNjYWxhcldlYWtNYXBTdG9yZSI6WyJtYWtlU2NhbGFyV2Vha01hcFN0b3JlIixmYWxzZV0sIm1ha2VTY2FsYXJTZXRTdG9yZSI6WyJtYWtlU2NhbGFyU2V0U3RvcmUiLGZhbHNlXSwibWFrZVNjYWxhcldlYWtTZXRTdG9yZSI6WyJtYWtlU2NhbGFyV2Vha1NldFN0b3JlIixmYWxzZV0sIm1ha2VLaW5kSGFuZGxlIjpbIm1ha2VLaW5kSGFuZGxlIixmYWxzZV0sInByb3ZpZGVQcm9taXNlV2F0Y2hlciI6WyJwcm92aWRlUHJvbWlzZVdhdGNoZXIiLGZhbHNlXSwid2F0Y2hQcm9taXNlIjpbIndhdGNoUHJvbWlzZSIsZmFsc2VdLCJtYWtlU2NhbGFyQmlnTWFwU3RvcmUiOlsibWFrZVNjYWxhckJpZ01hcFN0b3JlIixmYWxzZV0sIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUiOlsibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSIsZmFsc2VdLCJtYWtlU2NhbGFyQmlnU2V0U3RvcmUiOlsibWFrZVNjYWxhckJpZ1NldFN0b3JlIixmYWxzZV0sIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiOlsibWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZSIsZmFsc2VdLCJjYW5CZUR1cmFibGUiOlsiY2FuQmVEdXJhYmxlIixmYWxzZV0sInBpY2tGYWNldCI6WyJwaWNrRmFjZXQiLGZhbHNlXSwicGFydGlhbEFzc2lnbiI6WyJwYXJ0aWFsQXNzaWduIixmYWxzZV0sInByb3ZpZGUiOlsicHJvdmlkZSIsZmFsc2VdLCJwcm92aWRlRHVyYWJsZU1hcFN0b3JlIjpbInByb3ZpZGVEdXJhYmxlTWFwU3RvcmUiLGZhbHNlXSwicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUiOlsicHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUiLGZhbHNlXSwicHJvdmlkZUR1cmFibGVTZXRTdG9yZSI6WyJwcm92aWRlRHVyYWJsZVNldFN0b3JlIixmYWxzZV0sImRlZmluZUtpbmQiOlsiZGVmaW5lS2luZCIsZmFsc2VdLCJkZWZpbmVLaW5kTXVsdGkiOlsiZGVmaW5lS2luZE11bHRpIixmYWxzZV0sImRlZmluZUR1cmFibGVLaW5kIjpbImRlZmluZUR1cmFibGVLaW5kIixmYWxzZV0sImRlZmluZUR1cmFibGVLaW5kTXVsdGkiOlsiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSIsZmFsc2VdLCJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3MiOlsiZGVmaW5lVmlydHVhbEV4b0NsYXNzIixmYWxzZV0sImRlZmluZVZpcnR1YWxFeG9DbGFzc0tpdCI6WyJkZWZpbmVWaXJ0dWFsRXhvQ2xhc3NLaXQiLGZhbHNlXSwiZGVmaW5lRHVyYWJsZUV4b0NsYXNzIjpbImRlZmluZUR1cmFibGVFeG9DbGFzcyIsZmFsc2VdLCJkZWZpbmVEdXJhYmxlRXhvQ2xhc3NLaXQiOlsiZGVmaW5lRHVyYWJsZUV4b0NsYXNzS2l0IixmYWxzZV0sInByZXBhcmVFeG9DbGFzcyI6WyJwcmVwYXJlRXhvQ2xhc3MiLGZhbHNlXSwicHJlcGFyZUV4b0NsYXNzS2l0IjpbInByZXBhcmVFeG9DbGFzc0tpdCIsZmFsc2VdLCJwcmVwYXJlRXhvIjpbInByZXBhcmVFeG8iLGZhbHNlXSwicHJlcGFyZVNpbmdsZXRvbiI6WyJwcmVwYXJlU2luZ2xldG9uIixmYWxzZV0sImlnbm9yZUNvbnRleHQiOlsiaWdub3JlQ29udGV4dCIsZmFsc2VdLCJwcm92aWRlS2luZEhhbmRsZSI6WyJwcm92aWRlS2luZEhhbmRsZSIsZmFsc2VdLCJwcmVwYXJlS2luZCI6WyJwcmVwYXJlS2luZCIsZmFsc2VdLCJwcmVwYXJlS2luZE11bHRpIjpbInByZXBhcmVLaW5kTXVsdGkiLGZhbHNlXX0sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA00l1Dk8lAABPJQAAMAAAAEBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zL3NyYy92YXQtZGF0YS1iaW5kaW5ncy5qc3siaW1wb3J0cyI6WyJAYWdvcmljL2Fzc2VydCIsIkBhZ29yaWMvc3RvcmUiXSwiZXhwb3J0cyI6WyJWYXREYXRhIiwiY2FuQmVEdXJhYmxlIiwiZGVmaW5lRHVyYWJsZUtpbmQiLCJkZWZpbmVEdXJhYmxlS2luZE11bHRpIiwiZGVmaW5lS2luZCIsImRlZmluZUtpbmRNdWx0aSIsIm1ha2VLaW5kSGFuZGxlIiwibWFrZVNjYWxhckJpZ01hcFN0b3JlIiwibWFrZVNjYWxhckJpZ1NldFN0b3JlIiwibWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSIsIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiLCJtYWtlU3RvcmVVdGlscyIsInBhcnRpYWxBc3NpZ24iLCJwaWNrRmFjZXQiLCJwcm92aWRlIiwicHJvdmlkZUR1cmFibGVNYXBTdG9yZSIsInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiLCJwcm92aWRlRHVyYWJsZVdlYWtNYXBTdG9yZSIsInByb3ZpZGVQcm9taXNlV2F0Y2hlciIsIndhdGNoUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYWlsLHByb3ZpZGVMYXp5OyRo4oCNX2ltcG9ydHMoW1tcIkBhZ29yaWMvYXNzZXJ0XCIsIFtbXCJGYWlsXCIsIFskaOKAjV9hID0+IChGYWlsID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcInByb3ZpZGVMYXp5XCIsIFskaOKAjV9hID0+IChwcm92aWRlTGF6eSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG4vKiogQHR5cGUge1hpbXBvcnQoJy4vdHlwZXMnKS5WYXREYXRhfSAqL1xubGV0IFZhdERhdGFHbG9iYWw7XG5pZignVmF0RGF0YSdpbiBnbG9iYWxUaGlzKXtcbmdsb2JhbFRoaXMuVmF0RGF0YXx8RmFpbCBgVmF0RGF0YSBkZWZpbmVkIGluIGdsb2JhbCBhcyBudWxsIG9yIHVuZGVmaW5lZGA7XG5WYXREYXRhR2xvYmFsPWdsb2JhbFRoaXMuVmF0RGF0YTtcbiB9ZWxzZXtcbi8qIFhYWCB0aGlzIG1vZHVsZSBoYXMgYmVlbiBrbm93biB0byBnZXQgaW1wb3J0ZWQgKHRyYW5zaXRpdmVseSkgaW4gY2FzZXMgdGhhdCovXG4vKiBuZXZlciB1c2UgaXQgc28gd2UgbWFrZSBhIHZlcnNpb24gdGhhdCB3aWxsIHNhdGlzZnkgbW9kdWxlIHJlc29sdXRpb24gYnV0Ki9cbi8qIGZhaWwgYXQgcnVudGltZS4qL1xuY29uc3QgdW52YWlsYWJsZT0oKT0+RmFpbCBgVmF0RGF0YSB1bmF2YWlsYWJsZWA7XG5WYXREYXRhR2xvYmFsPXtcbmRlZmluZUtpbmQ6dW52YWlsYWJsZSxcbmRlZmluZUtpbmRNdWx0aTp1bnZhaWxhYmxlLFxuZGVmaW5lRHVyYWJsZUtpbmQ6dW52YWlsYWJsZSxcbmRlZmluZUR1cmFibGVLaW5kTXVsdGk6dW52YWlsYWJsZSxcbm1ha2VLaW5kSGFuZGxlOnVudmFpbGFibGUsXG5wcm92aWRlUHJvbWlzZVdhdGNoZXI6dW52YWlsYWJsZSxcbndhdGNoUHJvbWlzZTp1bnZhaWxhYmxlLFxubWFrZVNjYWxhckJpZ01hcFN0b3JlOnVudmFpbGFibGUsXG5tYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlOnVudmFpbGFibGUsXG5tYWtlU2NhbGFyQmlnU2V0U3RvcmU6dW52YWlsYWJsZSxcbm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmU6dW52YWlsYWJsZSxcbmNhbkJlRHVyYWJsZTp1bnZhaWxhYmxlfTtcblxuIH1cblxuY29uc3QgVmF0RGF0YUV4cG9ydD1WYXREYXRhR2xvYmFsOyRo4oCNX29uY2UuVmF0RGF0YUV4cG9ydChWYXREYXRhRXhwb3J0KTtcblxuXG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSBFeG9zL0V4b0NsYXNzZXMgaW5zdGVhZCBvZiBLaW5kc1xuICovXG5jb25zdCAgICAgICB7XG5kZWZpbmVLaW5kLFxuZGVmaW5lS2luZE11bHRpLFxuZGVmaW5lRHVyYWJsZUtpbmQsXG5kZWZpbmVEdXJhYmxlS2luZE11bHRpfT1cblZhdERhdGFHbG9iYWw7JGjigI1fb25jZS5kZWZpbmVLaW5kKGRlZmluZUtpbmQpOyRo4oCNX29uY2UuZGVmaW5lS2luZE11bHRpKGRlZmluZUtpbmRNdWx0aSk7JGjigI1fb25jZS5kZWZpbmVEdXJhYmxlS2luZChkZWZpbmVEdXJhYmxlS2luZCk7JGjigI1fb25jZS5kZWZpbmVEdXJhYmxlS2luZE11bHRpKGRlZmluZUR1cmFibGVLaW5kTXVsdGkpO1xuXG5jb25zdCAgICAgICB7XG5tYWtlS2luZEhhbmRsZSxcbnByb3ZpZGVQcm9taXNlV2F0Y2hlcixcbndhdGNoUHJvbWlzZSxcbm1ha2VTY2FsYXJCaWdNYXBTdG9yZSxcbm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUsXG5tYWtlU2NhbGFyQmlnU2V0U3RvcmUsXG5tYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlLFxuY2FuQmVEdXJhYmxlfT1cblZhdERhdGFHbG9iYWw7XG5cbi8qKlxuICogV2hlbiBtYWtpbmcgYSBtdWx0aS1mYWNldCBraW5kLCBpdCdzIGNvbW1vbiB0byBwaWNrIG9uZSBmYWNldCB0byBleHBvc2UuIEUuZy4sXG4gKlxuICogICAgIGNvbnN0IG1ha2VGb28gPSAoYSwgYiwgYywgZCkgPT4gbWFrZUZvb0Jhc2UoYSwgYiwgYywgZCkuc2VsZjtcbiAqXG4gKiBUaGlzIGhlbHBlciByZWR1Y2VzIHRoZSBkdXBsaWNhdGlvbjpcbiAqXG4gKiAgICAgY29uc3QgbWFrZUZvbyA9IHBpY2tGYWNldChtYWtlRm9vQmFzZSwgJ3NlbGYnKTtcbiAqXG4gKiBAdHlwZSB7WGltcG9ydCgnLi90eXBlcycpLlBpY2tGYWNldH1cbiAqLyRo4oCNX29uY2UubWFrZUtpbmRIYW5kbGUobWFrZUtpbmRIYW5kbGUpOyRo4oCNX29uY2UucHJvdmlkZVByb21pc2VXYXRjaGVyKHByb3ZpZGVQcm9taXNlV2F0Y2hlcik7JGjigI1fb25jZS53YXRjaFByb21pc2Uod2F0Y2hQcm9taXNlKTskaOKAjV9vbmNlLm1ha2VTY2FsYXJCaWdNYXBTdG9yZShtYWtlU2NhbGFyQmlnTWFwU3RvcmUpOyRo4oCNX29uY2UubWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZShtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlKTskaOKAjV9vbmNlLm1ha2VTY2FsYXJCaWdTZXRTdG9yZShtYWtlU2NhbGFyQmlnU2V0U3RvcmUpOyRo4oCNX29uY2UubWFrZVNjYWxhckJpZ1dlYWtTZXRTdG9yZShtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlKTskaOKAjV9vbmNlLmNhbkJlRHVyYWJsZShjYW5CZUR1cmFibGUpO1xuY29uc3QgICAgICAgIHBpY2tGYWNldD1cbihtYWtlcixmYWNldE5hbWUpPT5cbiguLi5hcmdzKT0+XG5tYWtlciguLi5hcmdzKVtmYWNldE5hbWVdOyRo4oCNX29uY2UucGlja0ZhY2V0KHBpY2tGYWNldCk7XG5oYXJkZW4ocGlja0ZhY2V0KTtcblxuLyoqXG4gKiBBc3NpZ24gdGhlIHZhbHVlcyBvZiBhbGwgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgZnJvbSB0aGUgc291cmNlXG4gKiBvYmplY3QgdG8gdGhlaXIga2V5cyBpbiB0aGUgdGFyZ2V0IG9iamVjdC5cbiAqXG4gKiBAdGVtcGxhdGUge3t9fSBUXG4gKiBAcGFyYW0ge1R9IHRhcmdldFxuICogQHBhcmFtIHtQYXJ0aWFsPFQ+fSBzb3VyY2VcbiAqL1xuY29uc3QgICAgICAgIHBhcnRpYWxBc3NpZ249KHRhcmdldCxzb3VyY2UpPT57XG5PYmplY3QuYXNzaWduKHRhcmdldCxzb3VyY2UpO1xuIH07JGjigI1fb25jZS5wYXJ0aWFsQXNzaWduKHBhcnRpYWxBc3NpZ24pO1xuaGFyZGVuKHBhcnRpYWxBc3NpZ24pO1xuXG4vKiBYWFggY29waWVkIGZyb20gQGFnb3JpYy9zdG9yZSB0eXBlcyovXG4vKiBVTlRJTCBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQ1NjAqL1xuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdG9yZU9wdGlvbnNcbiAqIE9mIHRoZSBkaW1lbnNpb25zIG9uIHdoaWNoIEtleWVkU3RvcmVzIGNhbiBkaWZmZXIsIHdlIG9ubHkgcmVwcmVzZW50IGEgZmV3XG4gKiBvZiB0aGVtIGFzIHN0YW5kYXJkIG9wdGlvbnMuIEEgZ2l2ZW4gc3RvcmUgbWFrZXIgc2hvdWxkIGRvY3VtZW50IHdoaWNoXG4gKiBvcHRpb25zIGl0IHN1cHBvcnRzLCBhcyB3ZWxsIGFzIGl0cyBwb3NpdGlvbnMgb24gZGltZW5zaW9ucyBmb3Igd2hpY2ggaXRcbiAqIGRvZXMgbm90IHN1cHBvcnQgb3B0aW9ucy5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2xvbmdMaXZlZD10cnVlXSBXaGljaCB3YXkgdG8gb3B0aW1pemUgYSB3ZWFrIHN0b3JlLiBUcnVlIG1lYW5zXG4gKiB0aGF0IHdlIGV4cGVjdCB0aGlzIHdlYWsgc3RvcmUgdG8gb3V0bGl2ZSBtb3N0IG9mIGl0cyBrZXlzLCBpbiB3aGljaFxuICogY2FzZSB3ZSBpbnRlcm5hbGx5IG1heSB1c2UgYSBKYXZhU2NyaXB0IGBXZWFrTWFwYC4gT3RoZXJ3aXNlIHdlIGludGVybmFsbHlcbiAqIG1heSB1c2UgYSBKYXZhU2NyaXB0IGBNYXBgLlxuICogRGVmYXVsdHMgdG8gdHJ1ZSwgc28gcGxlYXNlIG1hcmsgc2hvcnQgbGl2ZWQgc3RvcmVzIGV4cGxpY2l0bHkuXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtkdXJhYmxlPWZhbHNlXSAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgc3RvcmUgc3Vydml2ZSB0ZXJtaW5hdGlvblxuICogICBvZiBpdHMgY29udGFpbmluZyBwcm9jZXNzLCBhbGxvd2luZyBmb3IgcmVzdGFydCBvciB1cGdyYWRlIGJ1dCBhdCB0aGUgY29zdFxuICogICBvZiBmb3JiaWRkaW5nIHN0b3JhZ2Ugb2YgcmVmZXJlbmNlcyB0byBlcGhlbWVyYWwgZGF0YS4gIERlZmF1bHRzIHRvIGZhbHNlLlxuICogQHByb3BlcnR5IHtib29sZWFufSBbZmFrZUR1cmFibGU9ZmFsc2VdICBUaGlzIHN0b3JlIHByZXRlbmRzIHRvIGJlIGEgZHVyYWJsZSBzdG9yZVxuICogICBidXQgZG9lcyBub3QgZW5mb3JjZSB0aGF0IHRoZSB0aGluZ3Mgc3RvcmVkIGluIGl0IGFjdHVhbGx5IGJlIHRoZW1zZWx2ZXNcbiAqICAgZHVyYWJsZSAod2hlcmVhcyBhbiBhY3R1YWwgZHVyYWJsZSBzdG9yZSB3b3VsZCBmb3JiaWQgc3RvcmFnZSBvZiBzdWNoXG4gKiAgIGl0ZW1zKS4gIFRoaXMgaXMgaW4gc2VydmljZSBvZiBhbGxvd2luZyBpbmNyZW1lbnRhbCB0cmFuc2l0aW9uIHRvIHVzZSBvZlxuICogICBkdXJhYmxlIHN0b3JlcywgdG8gZW5hYmxlIG5vcm1hbCBvcGVyYXRpb24gYW5kIHRlc3Rpbmcgd2hlbiBzb21lIHN0dWZmXG4gKiAgIGludGVuZGVkIHRvIGV2ZW50dWFsbHkgYmUgZHVyYWJsZSBoYXMgbm90IHlldCBiZWVuIG1hZGUgZHVyYWJsZS4gIEEgc3RvcmVcbiAqICAgbWFya2VkIGFzIGZha2VEdXJhYmxlIHdpbGwgYXBwZWFyIHRvIG9wZXJhdGUgbm9ybWFsbHkgYnV0IGFueSBhdHRlbXB0IHRvXG4gKiAgIHVwZ3JhZGUgaXRzIGNvbnRhaW5pbmcgdmF0IHdpbGwgZmFpbCB3aXRoIGFuIGVycm9yLlxuICogQHByb3BlcnR5IHtYaW1wb3J0KCcuL3R5cGVzJykuUGF0dGVybn0gW2tleVNoYXBlXVxuICogQHByb3BlcnR5IHtYaW1wb3J0KCcuL3R5cGVzJykuUGF0dGVybn0gW3ZhbHVlU2hhcGVdXG4gKi9cbi8qKlxuICogVW5saWtlIGBwcm92aWRlTGF6eWAsIGBwcm92aWRlYCBzaG91bGQgYmUgY2FsbGVkIGF0IG1vc3Qgb25jZVxuICogd2l0aGluIGFueSB2YXQgaW5jYXJuYXRpb24gd2l0aCBhIGdpdmVuIGBiYWdnYWdlYCxga2V5YCBwYWlyLlxuICpcbiAqIGBwcm92aWRlYCBzaG91bGQgb25seSB0byBiZSB1c2VkIHRvIHBvcHVsYXRlIGJhZ2dhZ2UsXG4gKiB3aGVyZSB0aGUgdG90YWwgbnVtYmVyIG9mIGNhbGxzIHRvIGBwcm92aWRlYCBtdXN0IGJlXG4gKiBsb3cgY2FyZGluYWxpdHksIHNpbmNlIHdlIGtlZXAgdGhlIGJvb2trZWVwaW5nIHRvIGRldGVjdCBjb2xsaXNpb25zXG4gKiBpbiBub3JtYWwgbGFuZ3VhZ2UtaGVhcCBtZW1vcnkuIEFsbCB0aGUgb3RoZXIgYmFnZ2FnZS1vcmllbnRlZFxuICogYHByb3ZpZGUqYCBhbmQgYHByZXBhcmUqYCBmdW5jdGlvbnMgY2FsbCBgcHJvdmlkZWAsXG4gKiBhbmQgc28gaW1wb3NlIHRoZSBzYW1lIGNvbnN0cmFpbnRzLiBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aFxuICogb3VyIGV4cGVjdGVkIGR1cmFiaWxpdHkgcGF0dGVybnM6IFdoYXQgd2Ugc3RvcmUgaW4gYmFnZ2FnZSBhcmVcbiAqICAgICoga2luZEhhbmRsZXMsIHdoaWNoIGFyZSBwZXIga2luZCwgd2hpY2ggbXVzdCBiZSBsb3cgY2FyZGluYWxpdHlcbiAqICAgICogZGF0YSBcInZhcmlhYmxlc1wiIGZvciByZWVzdGFibGlzaGluZyB0aGUgbGV4aWNhbCBzY29wZSwgZXNwZWNpYWxseVxuICogICAgICBvZiBzaW5nbGV0b25zXG4gKiAgICAqIG5hbWVkIG5vbi1iYWdnYWdlIGNvbGxlY3Rpb25zIGF0IHRoZSBsZWF2ZXMgb2YgdGhlIGJhZ2dhZ2UgdHJlZS5cbiAqXG4gKiBXaGF0IGlzIGV4cGVjdGVkIHRvIGJlIGhpZ2ggY2FyZGluYWxpdHkgYXJlIHRoZSBpbnN0YW5jZXMgb2YgdGhlIGtpbmRzLFxuICogYW5kIHRoZSBtZW1iZXJzIG9mIHRoZSBub24tYmFnZ2dhZ2UgY29sbGVjdGlvbnMuXG4gKlxuICogVE9ETyBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvcHVsbC81ODc1IDpcbiAqIEltcGxlbWVudCBkZXZlbG9wbWVudC10aW1lIGluc3RydW1lbnRhdGlvbiB0byBkZXRlY3Qgd2hlblxuICogYHByb3ZpZGVgIHZpb2xhdGVzIHRoZSBhYm92ZSBwcmVzY3JpcHRpb24sIGFuZCBpcyBjYWxsZWQgbW9yZVxuICogdGhhbiBvbmNlIGluIHRoZSBzYW1lIHZhdCBpbmNhcm5hdGlvbiB3aXRoIHRoZSBzYW1lXG4gKiBiYWdnYWdlLGtleSBwYWlyLlxuICpcbiAqIEB0ZW1wbGF0ZSBLLFZcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcy5qcycpLkJhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7S30ga2V5XG4gKiBAcGFyYW0geyhrZXk6IEspID0+IFZ9IG1ha2VWYWx1ZVxuICogQHJldHVybnMge1Z9XG4gKi9cbmNvbnN0ICAgICAgICBwcm92aWRlPXByb3ZpZGVMYXp5O1xuXG4vKiBUT0RPOiBGaW5kIGEgZ29vZCBob21lIGZvciB0aGlzIGZ1bmN0aW9uIHVzZWQgYnkgQGFnb3JpYy92YXQtZGF0YSBhbmQgdGVzdGluZyBjb2RlKi8kaOKAjV9vbmNlLnByb3ZpZGUocHJvdmlkZSk7XG5jb25zdCAgICAgICAgbWFrZVN0b3JlVXRpbHM9KFZhdERhdGEpPT57XG5jb25zdHtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3cgLS0gdGhlc2UgbGl0ZXJhbGx5IGRvIHNoYWRvdyB0aGUgZ2xvYmFscyovXG5tYWtlU2NhbGFyQmlnTWFwU3RvcmUsXG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93IC0tIHRoZXNlIGxpdGVyYWxseSBkbyBzaGFkb3cgdGhlIGdsb2JhbHMqL1xubWFrZVNjYWxhckJpZ1dlYWtNYXBTdG9yZSxcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3cgLS0gdGhlc2UgbGl0ZXJhbGx5IGRvIHNoYWRvdyB0aGUgZ2xvYmFscyovXG5tYWtlU2NhbGFyQmlnU2V0U3RvcmV9PVxuVmF0RGF0YTtcblxuLyoqXG4gKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMnKS5CYWdnYWdlfSBiYWdnYWdlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtPbWl0PFN0b3JlT3B0aW9ucywgJ2R1cmFibGUnPn0gb3B0aW9uc1xuICovXG5jb25zdCBwcm92aWRlRHVyYWJsZU1hcFN0b3JlPShiYWdnYWdlLG5hbWUsb3B0aW9ucz17fSk9PlxucHJvdmlkZShiYWdnYWdlLG5hbWUsKCk9PlxubWFrZVNjYWxhckJpZ01hcFN0b3JlKG5hbWUse2R1cmFibGU6dHJ1ZSwuLi5vcHRpb25zfSkpO1xuXG5oYXJkZW4ocHJvdmlkZUR1cmFibGVNYXBTdG9yZSk7XG5cbi8qKlxuICogQHBhcmFtIHtYaW1wb3J0KCcuL3R5cGVzJykuQmFnZ2FnZX0gYmFnZ2FnZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7T21pdDxTdG9yZU9wdGlvbnMsICdkdXJhYmxlJz59IG9wdGlvbnNcbiAqL1xuY29uc3QgcHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmU9KGJhZ2dhZ2UsbmFtZSxvcHRpb25zPXt9KT0+XG5wcm92aWRlKGJhZ2dhZ2UsbmFtZSwoKT0+XG5tYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlKG5hbWUse2R1cmFibGU6dHJ1ZSwuLi5vcHRpb25zfSkpO1xuXG5oYXJkZW4ocHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUpO1xuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi90eXBlcycpLkJhZ2dhZ2V9IGJhZ2dhZ2VcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKiBAcGFyYW0ge09taXQ8U3RvcmVPcHRpb25zLCAnZHVyYWJsZSc+fSBvcHRpb25zXG4gKi9cbmNvbnN0IHByb3ZpZGVEdXJhYmxlU2V0U3RvcmU9KGJhZ2dhZ2UsbmFtZSxvcHRpb25zPXt9KT0+XG5wcm92aWRlKGJhZ2dhZ2UsbmFtZSwoKT0+XG5tYWtlU2NhbGFyQmlnU2V0U3RvcmUobmFtZSx7ZHVyYWJsZTp0cnVlLC4uLm9wdGlvbnN9KSk7XG5cbmhhcmRlbihwcm92aWRlRHVyYWJsZVNldFN0b3JlKTtcblxucmV0dXJuIGhhcmRlbih7XG5wcm92aWRlRHVyYWJsZU1hcFN0b3JlLFxucHJvdmlkZUR1cmFibGVXZWFrTWFwU3RvcmUsXG5wcm92aWRlRHVyYWJsZVNldFN0b3JlfSk7XG5cbiB9OyRo4oCNX29uY2UubWFrZVN0b3JlVXRpbHMobWFrZVN0b3JlVXRpbHMpO1xuXG5jb25zdCBnbG9iYWxTdG9yZVV0aWxzPW1ha2VTdG9yZVV0aWxzKFZhdERhdGFHbG9iYWwpO1xuY29uc3QgICAgICAge1xucHJvdmlkZUR1cmFibGVNYXBTdG9yZSxcbnByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlLFxucHJvdmlkZUR1cmFibGVTZXRTdG9yZX09XG5nbG9iYWxTdG9yZVV0aWxzOyRo4oCNX29uY2UucHJvdmlkZUR1cmFibGVNYXBTdG9yZShwcm92aWRlRHVyYWJsZU1hcFN0b3JlKTskaOKAjV9vbmNlLnByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKHByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlKTskaOKAjV9vbmNlLnByb3ZpZGVEdXJhYmxlU2V0U3RvcmUocHJvdmlkZUR1cmFibGVTZXRTdG9yZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiVmF0RGF0YSI6WyJWYXREYXRhRXhwb3J0Il0sImRlZmluZUtpbmQiOlsiZGVmaW5lS2luZCJdLCJkZWZpbmVLaW5kTXVsdGkiOlsiZGVmaW5lS2luZE11bHRpIl0sImRlZmluZUR1cmFibGVLaW5kIjpbImRlZmluZUR1cmFibGVLaW5kIl0sImRlZmluZUR1cmFibGVLaW5kTXVsdGkiOlsiZGVmaW5lRHVyYWJsZUtpbmRNdWx0aSJdLCJtYWtlS2luZEhhbmRsZSI6WyJtYWtlS2luZEhhbmRsZSJdLCJwcm92aWRlUHJvbWlzZVdhdGNoZXIiOlsicHJvdmlkZVByb21pc2VXYXRjaGVyIl0sIndhdGNoUHJvbWlzZSI6WyJ3YXRjaFByb21pc2UiXSwibWFrZVNjYWxhckJpZ01hcFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdNYXBTdG9yZSJdLCJtYWtlU2NhbGFyQmlnV2Vha01hcFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdXZWFrTWFwU3RvcmUiXSwibWFrZVNjYWxhckJpZ1NldFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdTZXRTdG9yZSJdLCJtYWtlU2NhbGFyQmlnV2Vha1NldFN0b3JlIjpbIm1ha2VTY2FsYXJCaWdXZWFrU2V0U3RvcmUiXSwiY2FuQmVEdXJhYmxlIjpbImNhbkJlRHVyYWJsZSJdLCJwaWNrRmFjZXQiOlsicGlja0ZhY2V0Il0sInBhcnRpYWxBc3NpZ24iOlsicGFydGlhbEFzc2lnbiJdLCJwcm92aWRlIjpbInByb3ZpZGUiXSwibWFrZVN0b3JlVXRpbHMiOlsibWFrZVN0b3JlVXRpbHMiXSwicHJvdmlkZUR1cmFibGVNYXBTdG9yZSI6WyJwcm92aWRlRHVyYWJsZU1hcFN0b3JlIl0sInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIjpbInByb3ZpZGVEdXJhYmxlV2Vha01hcFN0b3JlIl0sInByb3ZpZGVEdXJhYmxlU2V0U3RvcmUiOlsicHJvdmlkZUR1cmFibGVTZXRTdG9yZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB4xleWqwMAAKsDAAAfAAAAQGFnb3JpYy96b2UtdjAuMjUuMy9leHBvcnRlZC5qc3siaW1wb3J0cyI6WyIuL3NyYy9jb250cmFjdEZhY2V0L3R5cGVzLmpzIiwiLi9zcmMvY29udHJhY3RTdXBwb3J0L3R5cGVzLmpzIiwiLi9zcmMvY29udHJhY3RzL2V4cG9ydGVkLmpzIiwiLi9zcmMvdHlwZXMuanMiLCIuL3NyYy96b2VTZXJ2aWNlL3R5cGVzLmpzIiwiLi90b29scy90eXBlcy1hbWJpZW50LmpzIiwiQGFnb3JpYy9lcnRwL2V4cG9ydGVkLmpzIiwiQGFnb3JpYy9ub3RpZmllci9leHBvcnRlZC5qcyIsIkBhZ29yaWMvc3RvcmUvZXhwb3J0ZWQuanMiLCJAYWdvcmljL3N3aW5nc2V0LXZhdC9leHBvcnRlZC5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3NyYy9jb250cmFjdEZhY2V0L3R5cGVzLmpzXCIsIFtdXSxbXCIuL3NyYy96b2VTZXJ2aWNlL3R5cGVzLmpzXCIsIFtdXSxbXCIuL3NyYy9jb250cmFjdFN1cHBvcnQvdHlwZXMuanNcIiwgW11dLFtcIi4vc3JjL2NvbnRyYWN0cy9leHBvcnRlZC5qc1wiLCBbXV0sW1wiLi9zcmMvdHlwZXMuanNcIiwgW11dLFtcIi4vdG9vbHMvdHlwZXMtYW1iaWVudC5qc1wiLCBbXV0sW1wiQGFnb3JpYy9ub3RpZmllci9leHBvcnRlZC5qc1wiLCBbXV0sW1wiQGFnb3JpYy9lcnRwL2V4cG9ydGVkLmpzXCIsIFtdXSxbXCJAYWdvcmljL3N0b3JlL2V4cG9ydGVkLmpzXCIsIFtdXSxbXCJAYWdvcmljL3N3aW5nc2V0LXZhdC9leHBvcnRlZC5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAATnhTABAmAAAQJgAALgAAAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL2NvbnRyYWN0RmFjZXQvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvZXJ0cCcpLklzc3Vlck9wdGlvbnNSZWNvcmR9IElzc3Vlck9wdGlvbnNSZWNvcmQgKi9cblxuLyogWFhYIGNhbiBiZSB0aWdodGVyIHRoYW4gJ2FueScqL1xuLyoqXG4gKiBAdHlwZWRlZiB7YW55fSBDb21wbGV0aW9uXG4gKiBBbnkgcGFzc2FibGUgbm9uLXRoZW5hYmxlLiBPZnRlbiBhbiBleHBsYW5hdG9yeSBzdHJpbmcuXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgWkNGTWFrZUVtcHR5U2VhdEtpdFxuICogQHBhcmFtIHtFeGl0UnVsZX0gW2V4aXRdXG4gKiBAcmV0dXJucyB7WmNmU2VhdEtpdH1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7b2JqZWN0fSBbQ1Q9UmVjb3JkPHN0cmluZywgdW5rbm93bj5dIENvbnRyYWN0J3MgY3VzdG9tIHRlcm1zXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBaQ0YgWm9lIENvbnRyYWN0IEZhY2V0XG4gKlxuICogVGhlIFpvZSBpbnRlcmZhY2Ugc3BlY2lmaWMgdG8gYSBjb250cmFjdCBpbnN0YW5jZS4gVGhlIFpvZSBDb250cmFjdFxuICogRmFjZXQgaXMgYW4gQVBJIG9iamVjdCB1c2VkIGJ5IHJ1bm5pbmcgY29udHJhY3QgaW5zdGFuY2VzIHRvIGFjY2Vzc1xuICogdGhlIFpvZSBzdGF0ZSBmb3IgdGhhdCBpbnN0YW5jZS4gVGhlIFpvZSBDb250cmFjdCBGYWNldCBpcyBhY2Nlc3NlZFxuICogc3luY2hyb25vdXNseSBmcm9tIHdpdGhpbiB0aGUgY29udHJhY3QsIGFuZCB1c3VhbGx5IGlzIHJlZmVycmVkIHRvXG4gKiBpbiBjb2RlIGFzIHpjZi5cbiAqXG4gKiBAcHJvcGVydHkge1JlYWxsb2NhdGV9IHJlYWxsb2NhdGUgLSByZWFsbG9jYXRlIGFtb3VudHMgYW1vbmcgc2VhdHMuXG4gKiBEZXByZWNhdGVkOiBVc2UgYXRvbWljUmVhcnJhbmdlIGluc3RlYWQuXG4gKiBAcHJvcGVydHkgeyhrZXl3b3JkOiBLZXl3b3JkKSA9PiB2b2lkfSBhc3NlcnRVbmlxdWVLZXl3b3JkIC0gY2hlY2tcbiAqIHdoZXRoZXIgYSBrZXl3b3JkIGlzIHZhbGlkIGFuZCB1bmlxdWUgYW5kIGNvdWxkIGJlIGFkZGVkIGluXG4gKiBgc2F2ZUlzc3VlcmBcbiAqIEBwcm9wZXJ0eSB7U2F2ZUlzc3Vlcn0gc2F2ZUlzc3VlciAtIHNhdmUgYW4gaXNzdWVyIHRvIFpDRiBhbmQgWm9lXG4gKiBhbmQgZ2V0IHRoZSBBbW91bnRNYXRoIGFuZCBicmFuZCBzeW5jaHJvbm91c2x5IGFjY2Vzc2libGUgYWZ0ZXJcbiAqIHNhdmluZ1xuICogQHByb3BlcnR5IHtNYWtlSW52aXRhdGlvbn0gbWFrZUludml0YXRpb25cbiAqIEBwcm9wZXJ0eSB7KGNvbXBsZXRpb246IENvbXBsZXRpb24pID0+IHZvaWR9IHNodXRkb3duXG4gKiBAcHJvcGVydHkge1NodXRkb3duV2l0aEZhaWx1cmV9IHNodXRkb3duV2l0aEZhaWx1cmVcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gRVJlZjxab2VTZXJ2aWNlPn0gZ2V0Wm9lU2VydmljZVxuICogQHByb3BlcnR5IHsoKSA9PiBJc3N1ZXI8J3NldCc+fSBnZXRJbnZpdGF0aW9uSXNzdWVyXG4gKiBAcHJvcGVydHkgeygpID0+IFN0YW5kYXJkVGVybXMgJiBDVH0gZ2V0VGVybXNcbiAqIEBwcm9wZXJ0eSB7PEsgZXh0ZW5kcyBBc3NldEtpbmQ+KGlzc3VlcjogSXNzdWVyPEs+KSA9PiBCcmFuZDxLPn0gZ2V0QnJhbmRGb3JJc3N1ZXJcbiAqIEBwcm9wZXJ0eSB7PEsgZXh0ZW5kcyBBc3NldEtpbmQ+KGJyYW5kOiBCcmFuZDxLPikgPT4gSXNzdWVyPEs+fSBnZXRJc3N1ZXJGb3JCcmFuZFxuICogQHByb3BlcnR5IHtHZXRBc3NldEtpbmRCeUJyYW5kfSBnZXRBc3NldEtpbmRcbiAqIEBwcm9wZXJ0eSB7PEsgZXh0ZW5kcyBBc3NldEtpbmQgPSAnbmF0Jz4oXG4gKiAgIGtleXdvcmQ6IEtleXdvcmQsXG4gKiAgIGFzc2V0S2luZD86IEssXG4gKiAgIGRpc3BsYXlJbmZvPzogQWRkaXRpb25hbERpc3BsYXlJbmZvLFxuICogICBvcHRpb25zPzogSXNzdWVyT3B0aW9uc1JlY29yZFxuICogKSA9PiBQcm9taXNlPFpDRk1pbnQ8Sz4+fSBtYWtlWkNGTWludFxuICogQHByb3BlcnR5IHtaQ0ZSZWdpc3RlckZlZU1pbnR9IHJlZ2lzdGVyRmVlTWludFxuICogQHByb3BlcnR5IHtaQ0ZNYWtlRW1wdHlTZWF0S2l0fSBtYWtlRW1wdHlTZWF0S2l0XG4gKiBAcHJvcGVydHkge1NldFRlc3RKaWd9IHNldFRlc3RKaWdcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTx2b2lkPn0gc3RvcEFjY2VwdGluZ09mZmVyc1xuICogQHByb3BlcnR5IHsoc3RyaW5nczogQXJyYXk8c3RyaW5nPikgPT4gUHJvbWlzZTx2b2lkPn0gc2V0T2ZmZXJGaWx0ZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxBcnJheTxzdHJpbmc+Pn0gZ2V0T2ZmZXJGaWx0ZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSW5zdGFuY2V9IGdldEluc3RhbmNlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KHNlYXQxOiBaQ0ZTZWF0LCBzZWF0MjogWkNGU2VhdCwgLi4uc2VhdFJlc3Q6XG4gKiBBcnJheTxaQ0ZTZWF0PikgPT4gdm9pZH0gUmVhbGxvY2F0ZVxuICpcbiAqIFRoZSBjb250cmFjdCBjYW4gcmVhbGxvY2F0ZSBvdmVyIHNlYXRzLCB3aGljaCBjb21taXRzIHRoZSBzdGFnZWRcbiAqIGFsbG9jYXRpb24gZm9yIGVhY2ggc2VhdC4gT24gY29tbWl0LCB0aGUgc3RhZ2VkIGFsbG9jYXRpb24gYmVjb21lc1xuICogdGhlIGN1cnJlbnQgYWxsb2NhdGlvbiBhbmQgdGhlIHN0YWdlZCBhbGxvY2F0aW9uIGlzIGRlbGV0ZWQuXG4gKlxuICogVGhlIHJlYWxsb2NhdGlvbiB3aWxsIG9ubHkgc3VjY2VlZCBpZiB0aGUgcmVhbGxvY2F0aW9uIDEpIGNvbnNlcnZlc1xuICogcmlnaHRzICh0aGUgYW1vdW50cyBzcGVjaWZpZWQgaGF2ZSB0aGUgc2FtZSB0b3RhbCB2YWx1ZSBhcyB0aGVcbiAqIGN1cnJlbnQgdG90YWwgYW1vdW50KSwgYW5kIDIpIGlzICdvZmZlci1zYWZlJyBmb3IgYWxsIHBhcnRpZXNcbiAqIGludm9sdmVkLiBBbGwgc2VhdHMgdGhhdCBoYXZlIHN0YWdlZCBhbGxvY2F0aW9ucyBtdXN0IGJlIGluY2x1ZGVkXG4gKiBhcyBhcmd1bWVudHMgdG8gYHJlYWxsb2NhdGVgLCBvciBhbiBlcnJvciBpcyB0aHJvd24uIEFkZGl0aW9uYWxseSxcbiAqIGFuIGVycm9yIGlzIHRocm93biBpZiBhbnkgc2VhdHMgaW5jbHVkZWQgaW4gYHJlYWxsb2NhdGVgIGRvIG5vdFxuICogaGF2ZSBhIHN0YWdlZCBhbGxvY2F0aW9uLlxuICpcbiAqIFRoZSByZWFsbG9jYXRpb24gaXMgcGFydGlhbCwgbWVhbmluZyB0aGF0IGl0IGFwcGxpZXMgb25seSB0byB0aGVcbiAqIHNlYXRzIHBhc3NlZCBpbiBhcyBhcmd1bWVudHMuIEJ5IGluZHVjdGlvbiwgaWYgcmlnaHRzIGNvbnNlcnZhdGlvblxuICogYW5kIG9mZmVyIHNhZmV0eSBob2xkIGJlZm9yZSwgdGhleSB3aWxsIGhvbGQgYWZ0ZXIgYSBzYWZlXG4gKiByZWFsbG9jYXRpb24sIGV2ZW4gdGhvdWdoIHdlIG9ubHkgcmUtdmFsaWRhdGUgZm9yIHRoZSBzZWF0cyB3aG9zZVxuICogYWxsb2NhdGlvbnMgd2lsbCBjaGFuZ2UuIFNpbmNlIHJpZ2h0cyBhcmUgY29uc2VydmVkIGZvciB0aGUgY2hhbmdlLFxuICogb3ZlcmFsbCByaWdodHMgd2lsbCBiZSB1bmNoYW5nZWQsIGFuZCBhIHJlYWxsb2NhdGlvbiBjYW4gb25seVxuICogZWZmZWN0IG9mZmVyIHNhZmV0eSBmb3Igc2VhdHMgd2hvc2UgYWxsb2NhdGlvbnMgY2hhbmdlLlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFNhdmVJc3N1ZXJcbiAqXG4gKiBJbmZvcm1zIFpvZSBhYm91dCBhbiBpc3N1ZXIgYW5kIHJldHVybnMgYSBwcm9taXNlIGZvciBhY2tub3dsZWRnaW5nXG4gKiB3aGVuIHRoZSBpc3N1ZXIgaXMgYWRkZWQgYW5kIHJlYWR5LlxuICpcbiAqIEBwYXJhbSB7RVJlZjxJc3N1ZXI+fSBpc3N1ZXJQIFByb21pc2UgZm9yIGlzc3VlclxuICogQHBhcmFtIHtLZXl3b3JkfSBrZXl3b3JkIEtleXdvcmQgZm9yIGFkZGVkIGlzc3VlclxuICogQHJldHVybnMge1Byb21pc2U8SXNzdWVyUmVjb3JkPCo+Pn0gSXNzdWVyIGlzIGFkZGVkIGFuZCByZWFkeVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgezxSZXN1bHQ+KFxuICogICBvZmZlckhhbmRsZXI6IE9mZmVySGFuZGxlcjxSZXN1bHQ+LFxuICogICBkZXNjcmlwdGlvbjogc3RyaW5nLFxuICogICBjdXN0b21EZXRhaWxzPzogb2JqZWN0LFxuICogICBwcm9wb3NhbFNoYXBlPzogUGF0dGVybixcbiAqICkgPT4gUHJvbWlzZTxJbnZpdGF0aW9uPEF3YWl0ZWQ8UmVzdWx0Pj4+XG4gKiB9IE1ha2VJbnZpdGF0aW9uXG4gKlxuICogTWFrZSBhIGNyZWRpYmxlIFpvZSBpbnZpdGF0aW9uIGZvciBhIHBhcnRpY3VsYXIgc21hcnQgY29udHJhY3RcbiAqIGluZGljYXRlZCBieSB0aGUgYGluc3RhbmNlYCBpbiB0aGUgZGV0YWlscyBvZiB0aGUgaW52aXRhdGlvbi4gWm9lXG4gKiBhbHNvIHB1dHMgdGhlIGBpbnN0YWxsYXRpb25gIGFuZCBhIHVuaXF1ZSBgaGFuZGxlYCBpbiB0aGUgZGV0YWlsc1xuICogb2YgdGhlIGludml0YXRpb24uIFRoZSBjb250cmFjdCBtdXN0IHByb3ZpZGUgYSBgZGVzY3JpcHRpb25gIGZvclxuICogdGhlIGludml0YXRpb24gYW5kIHNob3VsZCBpbmNsdWRlIHdoYXRldmVyIGluZm9ybWF0aW9uIGlzIG5lY2Vzc2FyeVxuICogZm9yIGEgcG90ZW50aWFsIGJ1eWVyIG9mIHRoZSBpbnZpdGF0aW9uIHRvIGtub3cgd2hhdCB0aGV5IGFyZVxuICogZ2V0dGluZyBpbiB0aGUgYGN1c3RvbURldGFpbHNgLiBgY3VzdG9tRGV0YWlsc2Agd2lsbCBiZVxuICogcGxhY2VkIGluIHRoZSBkZXRhaWxzIG9mIHRoZSBpbnZpdGF0aW9uLlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFpDRlJlZ2lzdGVyRmVlTWludFxuICogQHBhcmFtIHtLZXl3b3JkfSBrZXl3b3JkXG4gKiBAcGFyYW0ge0ZlZU1pbnRBY2Nlc3N9IGFsbGVnZWRGZWVNaW50QWNjZXNzIC0gYW4gb2JqZWN0IHRoYXRcbiAqIHB1cnBvcnRzIHRvIGJlIHRoZSBvYmplY3QgdGhhdCBncmFudHMgYWNjZXNzIHRvIHRoZSBmZWUgbWludFxuICogQHJldHVybnMge1Byb21pc2U8WkNGTWludDwnbmF0Jz4+fVxuICovXG5cbi8qKlxuICogUHJvdmlkZSBhIGppZyBvYmplY3QgZm9yIHRlc3RpbmcgcHVycG9zZXMgb25seS5cbiAqXG4gKiBUaGUgY29udHJhY3QgY29kZSBwcm92aWRlcyBhIGNhbGxiYWNrIHdob3NlIHJldHVybiByZXN1bHQgd2lsbFxuICogYmUgbWFkZSBhdmFpbGFibGUgdG8gdGhlIHRlc3QgdGhhdCBzdGFydGVkIHRoaXMgY29udHJhY3QuIFRoZVxuICogc3VwcGxpZWQgY2FsbGJhY2sgd2lsbCBvbmx5IGJlIGNhbGxlZCBpbiBhIHRlc3RpbmcgY29udGV4dCxcbiAqIG5ldmVyIGluIHByb2R1Y3Rpb247IGkuZS4sIGl0IGlzIG9ubHkgY2FsbGVkIGlmIGB0ZXN0SmlnU2V0dGVyYFxuICogd2FzIHN1cHBsaWVkLlxuICpcbiAqIElmIG5vLCBgdGVzdEZuYCBpcyBzdXBwbGllZCwgdGhlbiBhbiBlbXB0eSBqaWcgd2lsbCBiZSB1c2VkLlxuICogQW4gYWRkaXRpb25hbCBgemNmYCBwcm9wZXJ0eSBzZXQgdG8gdGhlIGN1cnJlbnQgQ29udHJhY3RGYWNldFxuICogd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgcmV0dXJuZWQgamlnIG9iamVjdCAob3ZlcnJpZGluZyBhbnlcbiAqIHByb3ZpZGVkIGJ5IHRoZSBgdGVzdEZuYCkuXG4gKlxuICogQGNhbGxiYWNrIFNldFRlc3RKaWdcbiAqIEBwYXJhbSB7KCkgPT4gUmVjb3JkPHN0cmluZywgdW5rbm93bj59IHRlc3RGblxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgWkNGTWludE1pbnRHYWluc1xuICogQHBhcmFtIHtBbW91bnRLZXl3b3JkUmVjb3JkfSBnYWluc1xuICogQHBhcmFtIHtaQ0ZTZWF0fSBbemNmU2VhdF1cbiAqIEByZXR1cm5zIHtaQ0ZTZWF0fVxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtBc3NldEtpbmR9IFtLPUFzc2V0S2luZF1cbiAqIEB0eXBlZGVmIHtvYmplY3R9IFpDRk1pbnRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gSXNzdWVyUmVjb3JkPEs+fSBnZXRJc3N1ZXJSZWNvcmRcbiAqIEBwcm9wZXJ0eSB7WkNGTWludE1pbnRHYWluc30gbWludEdhaW5zXG4gKiBBbGwgdGhlIGFtb3VudHMgaW4gZ2FpbnMgbXVzdCBiZSBvZiB0aGlzIFpDRk1pbnQncyBicmFuZC5cbiAqIFRoZSBnYWlucycga2V5d29yZHMgYXJlIGluIHRoZSBuYW1lc3BhY2Ugb2YgdGhhdCBzZWF0LlxuICogQWRkIHRoZSBnYWlucyB0byB0aGF0IHNlYXQncyBhbGxvY2F0aW9uLlxuICogVGhlIHJlc3VsdGluZyBzdGF0ZSBtdXN0IGJlIG9mZmVyIHNhZmUuIChDdXJyZW50bHksIGluY3JlYXNpbmcgYXNzZXRzIGNhblxuICogbmV2ZXIgdmlvbGF0ZSBvZmZlciBzYWZldHkgYW55d2F5LilcbiAqXG4gKiBNaW50IHRoYXQgYW1vdW50IG9mIGFzc2V0cyBpbnRvIHRoZSBwb29sZWQgcHVyc2UuXG4gKiBJZiBhIHNlYXQgaXMgcHJvdmlkZWQsIGl0IGlzIHJldHVybmVkLiBPdGhlcndpc2UgYSBuZXcgc2VhdCBpc1xuICogcmV0dXJuZWQuXG4gKiBUT0RPIHVuaW1wbGVtZW50ZWRcbiAqIFRoaXMgY3JlYXRpb24tb24tZGVtYW5kIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQuXG4gKlxuICogQHByb3BlcnR5IHsobG9zc2VzOiBBbW91bnRLZXl3b3JkUmVjb3JkLFxuICogICAgICAgICAgICAgemNmU2VhdDogWkNGU2VhdCxcbiAqICAgICAgICAgICAgKSA9PiB2b2lkfSBidXJuTG9zc2VzXG4gKiBBbGwgdGhlIGFtb3VudHMgaW4gbG9zc2VzIG11c3QgYmUgb2YgdGhpcyBaQ0ZNaW50J3MgYnJhbmQuXG4gKiBUaGUgbG9zc2VzJyBrZXl3b3JkcyBhcmUgaW4gdGhlIG5hbWVzcGFjZSBvZiB0aGF0IHNlYXQuXG4gKiBTdWJ0cmFjdCBsb3NzZXMgZnJvbSB0aGF0IHNlYXQncyBhbGxvY2F0aW9uLlxuICogVGhlIHJlc3VsdGluZyBzdGF0ZSBtdXN0IGJlIG9mZmVyIHNhZmUuXG4gKlxuICogQnVybiB0aGF0IGFtb3VudCBvZiBhc3NldHMgZnJvbSB0aGUgcG9vbGVkIHB1cnNlLlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFpDRlNlYXRGYWlsXG4gKlxuICogZmFpbCBjYWxsZWQgd2l0aCB0aGUgcmVhc29uIGZvciB0aGlzIGZhaWx1cmUsIHdoZXJlIHJlYXNvbiBpc1xuICogbm9ybWFsbHkgYW4gaW5zdGFuY2VvZiBFcnJvci5cbiAqIEBwYXJhbSB7dW5rbm93bn0gcmVhc29uXG4gKiBAcmV0dXJucyB7RXJyb3J9XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgWkNGR2V0QW1vdW50QWxsb2NhdGVkXG4gKiBUaGUgYnJhbmQgaXMgdXNlZCBmb3IgZmlsbGluZyBpbiBhbiBlbXB0eSBhbW91bnQgaWYgdGhlIGBrZXl3b3JkYFxuICogaXMgbm90IHByZXNlbnQgaW4gdGhlIGFsbG9jYXRpb25cbiAqIEBwYXJhbSB7S2V5d29yZH0ga2V5d29yZFxuICogQHBhcmFtIHtCcmFuZH0gW2JyYW5kXVxuICogQHJldHVybnMge0Ftb3VudDxhbnk+fVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gWkNGU2VhdFxuICogQHByb3BlcnR5IHsoY29tcGxldGlvbj86IENvbXBsZXRpb24pID0+IHZvaWR9IGV4aXRcbiAqIEBwcm9wZXJ0eSB7WkNGU2VhdEZhaWx9IGZhaWxcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxTdWJzY3JpYmVyPEFsbG9jYXRpb24+Pn0gZ2V0U3Vic2NyaWJlclxuICogQHByb3BlcnR5IHsoKSA9PiBib29sZWFufSBoYXNFeGl0ZWRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvcG9zYWxSZWNvcmR9IGdldFByb3Bvc2FsXG4gKiBAcHJvcGVydHkge1pDRkdldEFtb3VudEFsbG9jYXRlZH0gZ2V0QW1vdW50QWxsb2NhdGVkXG4gKiBAcHJvcGVydHkgeygpID0+IEFsbG9jYXRpb259IGdldEN1cnJlbnRBbGxvY2F0aW9uXG4gKiBAcHJvcGVydHkgeygpID0+IEFsbG9jYXRpb259IGdldFN0YWdlZEFsbG9jYXRpb25cbiAqIERlcHJlY2F0ZWQ6IFVzZSBhdG9taWNSZWFycmFuZ2UgaW5zdGVhZFxuICogQHByb3BlcnR5IHsoKSA9PiBib29sZWFufSBoYXNTdGFnZWRBbGxvY2F0aW9uXG4gKiBEZXByZWNhdGVkOiBVc2UgYXRvbWljUmVhcnJhbmdlIGluc3RlYWRcbiAqIEBwcm9wZXJ0eSB7KG5ld0FsbG9jYXRpb246IEFsbG9jYXRpb24pID0+IGJvb2xlYW59IGlzT2ZmZXJTYWZlXG4gKiBAcHJvcGVydHkgeyhhbW91bnRLZXl3b3JkUmVjb3JkOiBBbW91bnRLZXl3b3JkUmVjb3JkKSA9PiBBbW91bnRLZXl3b3JkUmVjb3JkfSBpbmNyZW1lbnRCeVxuICogRGVwcmVjYXRlZDogVXNlIGF0b21pY1JlYXJyYW5nZSBpbnN0ZWFkXG4gKiBAcHJvcGVydHkgeyhhbW91bnRLZXl3b3JkUmVjb3JkOiBBbW91bnRLZXl3b3JkUmVjb3JkKSA9PiBBbW91bnRLZXl3b3JkUmVjb3JkfSBkZWNyZW1lbnRCeVxuICogRGVwcmVjYXRlZDogVXNlIGF0b21pY1JlYXJyYW5nZSBpbnN0ZWFkXG4gKiBAcHJvcGVydHkgeygpID0+IHZvaWR9IGNsZWFyXG4gKiBEZXByZWNhdGVkOiBVc2UgYXRvbWljUmVhcnJhbmdlIGluc3RlYWRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHt7IHpjZlNlYXQ6IFpDRlNlYXQsIHVzZXJTZWF0OiBFUmVmPFVzZXJTZWF0Pn19IFpjZlNlYXRLaXRcbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7b2JqZWN0fSBPUiBPZmZlciByZXN1bHRzXG4gKiBAdHlwZWRlZiB7KHNlYXQ6IFpDRlNlYXQsIG9mZmVyQXJncz86IG9iamVjdCkgPT4gT1J9IEhhbmRsZU9mZmVyXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge29iamVjdH0gW09SPXVua25vd25dIE9mZmVyIHJlc3VsdHNcbiAqIEB0eXBlZGVmIHtIYW5kbGVPZmZlcjxPUj4gfCB7IGhhbmRsZTogSGFuZGxlT2ZmZXI8T1I+IH19IE9mZmVySGFuZGxlclxuICovXG5cbi8qKlxuICogQVBJIGZvciBhIGNvbnRyYWN0IHN0YXJ0IGZ1bmN0aW9uLlxuICpcbiAqIENBVkVBVDogYXNzdW1lcyBzeW5jaHJvbm91c1xuICpcbiAqIEBkZXByZWNhdGVkIGRlZmluZSBmdW5jdGlvbiBzaWduYXR1cmUgZGlyZWN0bHlcbiAqXG4gKiBAdGVtcGxhdGUge29iamVjdH0gW1BGPWFueV0gUHVibGljIGZhY2V0XG4gKiBAdGVtcGxhdGUge29iamVjdH0gW0NGPWFueV0gQ3JlYXRvciBmYWNldFxuICogQHRlbXBsYXRlIHtvYmplY3R9IFtDVD1hbnldIEN1c3RvbSB0ZXJtc1xuICogQHRlbXBsYXRlIHtvYmplY3R9IFtQQT1hbnldIFByaXZhdGUgYXJnc1xuICogQGNhbGxiYWNrIENvbnRyYWN0U3RhcnRGblxuICogQHBhcmFtIHtaQ0Y8Q1Q+fSB6Y2ZcbiAqIEBwYXJhbSB7UEF9IHByaXZhdGVBcmdzXG4gKiBAcmV0dXJucyB7Q29udHJhY3RTdGFydEZuUmVzdWx0PFBGLCBDRj59XG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUgUEYgUHVibGljIGZhY2V0XG4gKiBAdGVtcGxhdGUgQ0YgQ3JlYXRvciBmYWNldFxuICogQHR5cGVkZWYge29iamVjdH0gQ29udHJhY3RTdGFydEZuUmVzdWx0XG4gKiBAcHJvcGVydHkge1BGfSBwdWJsaWNGYWNldFxuICogQHByb3BlcnR5IHtDRn0gY3JlYXRvckZhY2V0XG4gKiBAcHJvcGVydHkge1Byb21pc2U8SW52aXRhdGlvbj59IFtjcmVhdG9ySW52aXRhdGlvbl1cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBTXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vem9lU2VydmljZS91dGlscycpLkNvbnRyYWN0T2Y8Uz59IENvbnRyYWN0T2ZcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi96b2VTZXJ2aWNlL3V0aWxzJykuQWRtaW5GYWNldH0gQWRtaW5GYWNldFxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJ25fTuvCwAArwsAADAAAABAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdFN1cHBvcnQvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFNlYXRHYWluc0xvc3Nlc1JlY29yZFxuICogQHByb3BlcnR5IHtaQ0ZTZWF0fSBzZWF0XG4gKiBAcHJvcGVydHkge0Ftb3VudEtleXdvcmRSZWNvcmR9IGdhaW5zIC0gd2hhdCB0aGUgc2VhdCB3aWxsXG4gKiBnYWluIGFzIGEgcmVzdWx0IG9mIHRoaXMgdHJhZGVcbiAqIEBwcm9wZXJ0eSB7QW1vdW50S2V5d29yZFJlY29yZH0gbG9zc2VzIC0gd2hhdCB0aGUgc2VhdCBbd2lsbF1cbiAqIGdpdmUgdXAgYXMgYSByZXN1bHQgb2YgdGhpcyB0cmFkZS4gTG9zc2VzIGlzIG9wdGlvbmFsLCBidXQgY2FuXG4gKiBvbmx5IGJlIG9taXR0ZWQgaWYgdGhlIGtleXdvcmRzIGZvciBib3RoIHNlYXRzIGFyZSB0aGUgc2FtZS5cbiAqIElmIGxvc3NlcyBpcyBub3QgZGVmaW5lZCwgdGhlIGdhaW5zIG9mIHRoZSBvdGhlciBzZWF0IGlzXG4gKiBzdWJ0cmFjdGVkLlxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFN3YXBcbiAqIElmIHR3byBzZWF0cyBjYW4gc2F0aXNmeSBlYWNoIG90aGVyJ3Mgd2FudHMsIHRyYWRlIGVub3VnaCB0b1xuICogc2F0aXNmeSB0aGUgd2FudHMgb2YgYm90aCBzZWF0cyBhbmQgZXhpdCBib3RoIHNlYXRzLlxuICpcbiAqIFRoZSBzdXJwbHVzIHJlbWFpbnMgd2l0aCB0aGUgb3JpZ2luYWwgc2VhdC4gRm9yIGV4YW1wbGUgaWYgc2VhdCBBXG4gKiBnaXZlcyA1IG1vb2xhIGFuZCBzZWF0IEIgb25seSB3YW50cyAzIG1vb2xhLCBzZWF0IEEgcmV0YWlucyAyXG4gKiBtb29sYS5cbiAqXG4gKiBJZiB0aGUgc3dhcCBmYWlscywgbm8gYXNzZXRzIGFyZSB0cmFuc2ZlcnJlZCwgYm90aCBzZWF0cyB3aWxsIGZhaWwsXG4gKiBhbmQgdGhlIGZ1bmN0aW9uIHRocm93cy5cbiAqXG4gKiBUaGUga2V5d29yZHMgZm9yIGJvdGggc2VhdHMgbXVzdCBtYXRjaC5cbiAqXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge1pDRlNlYXR9IGxlZnRTZWF0XG4gKiBAcGFyYW0ge1pDRlNlYXR9IHJpZ2h0U2VhdFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBTd2FwRXhhY3RcbiAqXG4gKiBTd2FwIHN1Y2ggdGhhdCBib3RoIHNlYXRzIGdhaW4gd2hhdCB0aGV5IHdhbnQgYW5kIGxvc2UgZXZlcnl0aGluZ1xuICogdGhhdCB0aGV5IGdhdmUuIE9ubHkgZ29vZCBmb3IgZXhhY3QgYW5kIGVudGlyZSBzd2FwcyB3aGVyZSBlYWNoXG4gKiBzZWF0IHdhbnRzIGV2ZXJ5dGhpbmcgdGhhdCB0aGUgb3RoZXIgc2VhdCBoYXMuIFRoZSBiZW5lZml0IG9mIHVzaW5nXG4gKiB0aGlzIG1ldGhvZCBpcyB0aGF0IHRoZSBrZXl3b3JkcyBvZiBlYWNoIHNlYXQgZG8gbm90IG1hdHRlci5cbiAqXG4gKiBJZiB0aGUgc3dhcCBmYWlscywgbm8gYXNzZXRzIGFyZSB0cmFuc2ZlcnJlZCwgYm90aCBzZWF0cyB3aWxsIGZhaWwsXG4gKiBhbmQgdGhlIGZ1bmN0aW9uIHRocm93cy5cbiAqXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge1pDRlNlYXR9IGxlZnRTZWF0XG4gKiBAcGFyYW0ge1pDRlNlYXR9IHJpZ2h0U2VhdFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8S2V5d29yZCxLZXl3b3JkPn0gS2V5d29yZEtleXdvcmRSZWNvcmRcbiAqXG4gKiBBIG1hcHBpbmcgb2Yga2V5d29yZHMgdG8ga2V5d29yZHMuXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgUmV2ZXJzZVxuICpcbiAqIEdpdmVuIGEgbWFwcGluZyBvZiBrZXl3b3JkcyB0byBrZXl3b3JkcywgaW52ZXJ0IHRoZSBrZXlzIGFuZFxuICogdmFsdWVzLiBUaGlzIGlzIHVzZWQgdG8gbWFwIHRoZSBvZmZlcnMgbWFkZSB0byBhbm90aGVyIGNvbnRyYWN0XG4gKiBiYWNrIHRvIHRoZSBrZXl3b3JkcyB1c2VkIGluIHRoZSBmaXJzdCBjb250cmFjdC5cbiAqIEBwYXJhbSB7S2V5d29yZEtleXdvcmRSZWNvcmR9IFtrZXl3b3JkUmVjb3JkXVxuICogQHJldHVybnMge0tleXdvcmRLZXl3b3JkUmVjb3JkIH1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBNYXBLZXl3b3Jkc1xuICpcbiAqIFJlbWFwIHRoZSBrZXl3b3JkcyBvZiBhbiBhbW91bnRLZXl3b3JkUmVjb3JkLCBpc3N1ZXJLZXl3b3JkUmVjb3JkLCBvciBhXG4gKiBQYXltZW50UEtleXdvcmRSZWNvcmQgYWNjb3JkaW5nIHRvIGEgbWFwcGluZy4gVGhpcyBpcyB1c2VkIHRvIHJlbWFwXG4gKiBmcm9tIGtleXdvcmRzIHVzZWQgaW4gY29udHJhY3RBIHRvIGtleXdvcmRzIHVzZWQgaW4gY29udHJhY3RCIGFuZFxuICogdmljZSB2ZXJzYSBpbiBgb2ZmZXJUb2BcbiAqXG4gKiBAcGFyYW0ge0Ftb3VudEtleXdvcmRSZWNvcmQgfCBQYXltZW50UEtleXdvcmRSZWNvcmQgfCBJc3N1ZXJLZXl3b3JkUmVjb3JkIHwgdW5kZWZpbmVkIH0ga2V5d29yZFJlY29yZFxuICogQHBhcmFtIHtLZXl3b3JkS2V5d29yZFJlY29yZH0ga2V5d29yZE1hcHBpbmdcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFJhdGlvXG4gKiBAcHJvcGVydHkge0Ftb3VudDwnbmF0Jz59IG51bWVyYXRvclxuICogQHByb3BlcnR5IHtBbW91bnQ8J25hdCc+fSBkZW5vbWluYXRvclxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFNjYWxlQW1vdW50XG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IGFtb3VudFxuICogQHBhcmFtIHtSYXRpb30gcmF0aW9cbiAqIEByZXR1cm5zIHtBbW91bnQ8J25hdCc+fVxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKnQ3z1CBwAAQgcAADUAAABAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdHMvY2FsbFNwcmVhZC90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qKlxuICogQHR5cGVkZWYgeydsb25nJyB8ICdzaG9ydCd9IFBvc2l0aW9uS2luZFxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIE1ha2VPcHRpb25JbnZpdGF0aW9uXG4gKiBAcGFyYW0ge1Bvc2l0aW9uS2luZH0gcG9zaXRpb25LaW5kXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJbnZpdGF0aW9uPn1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFBheW9mZkhhbmRsZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gdm9pZH0gc2NoZWR1bGVQYXlvZmZzXG4gKiBAcHJvcGVydHkgIHtNYWtlT3B0aW9uSW52aXRhdGlvbn0gbWFrZU9wdGlvbkludml0YXRpb25cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IENhbGN1bGF0ZVNoYXJlc1JldHVyblxuICogUmV0dXJuIHZhbHVlIGZyb20gY2FsY3VsYXRlU2hhcmVzLCB3aGljaCByZXByZXNlbnRzIHRoZSBwb3J0aW9ucyBhc3NpZ25lZCB0b1xuICogdGhlIGxvbmcgYW5kIHNob3J0IHNpZGUgb2YgYSB0cmFuc2FjdGlvbi4gVGhlc2Ugd2lsbCBiZSB0d28gbm9uLW5lZ2F0aXZlXG4gKiBpbnRlZ2VycyB0aGF0IHN1bSB0byAxMDAuXG4gKiBAcHJvcGVydHkge1JhdGlvfSBsb25nU2hhcmVcbiAqIEBwcm9wZXJ0eSB7UmF0aW99IHNob3J0U2hhcmVcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBDYWxjdWxhdGVTaGFyZXNcbiAqIGNhbGN1bGF0ZSB0aGUgcG9ydGlvbiAoYXMgYSBwZXJjZW50YWdlKSBvZiB0aGUgY29sbGF0ZXJhbCB0aGF0IHNob3VsZCBiZVxuICogYWxsb2NhdGVkIHRvIHRoZSBsb25nIHNpZGUgb2YgYSBjYWxsIHNwcmVhZCBjb250cmFjdC4gcHJpY2UgZ2l2ZXMgdGhlIHZhbHVlXG4gKiBvZiB0aGUgdW5kZXJseWluZyBhc3NldCBhdCBjbG9zaW5nIHRoYXQgZGV0ZXJtaW5lcyB0aGUgcGF5b3V0cyB0byB0aGUgcGFydGllc1xuICpcbiAqIGlmIHByaWNlIDw9IHN0cmlrZVByaWNlMSwgcmV0dXJuIFJhdGlvIHJlcHJlc2VudGluZyAwXG4gKiBpZiBwcmljZSA+PSBzdHJpa2VQcmljZTIsIHJldHVybiBSYXRpbyByZXByZXNlbnRpbmcgMS5cbiAqIE90aGVyd2lzZSByZXR1cm4gbG9uZ1NoYXJlIGFuZCBzaG9ydFNoYXJlIHJlcHJlc2VudGluZyByYXRpb3MgYmV0d2VlbiAwJSBhbmRcbiAqIDEwMCUgcmVmbGVjdGluZyB0aGUgcG9zaXRpb24gb2YgdGhlIHByaWNlIGluIHRoZSByYW5nZSBmcm9tIHN0cmlrZVByaWNlMSB0b1xuICogc3RyaWtlUHJpY2UyLlxuICogQHBhcmFtIHtCcmFuZH0gY29sbGF0ZXJhbEJyYW5kXG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IHByaWNlXG4gKiBAcGFyYW0ge0Ftb3VudDwnbmF0Jz59IHN0cmlrZVByaWNlMVxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBzdHJpa2VQcmljZTJcbiAqIEByZXR1cm5zIHtDYWxjdWxhdGVTaGFyZXNSZXR1cm59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTWFrZTEwMFBlcmNlbnRcbiAqIEBwYXJhbSB7QnJhbmR9IGJyYW5kXG4gKiBAcmV0dXJucyB7UmF0aW99XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTWFrZTBQZXJjZW50XG4gKiBAcGFyYW0ge0JyYW5kfSBicmFuZFxuICogQHJldHVybnMge1JhdGlvfVxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAANxeljujAQAAowEAAC0AAABAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdHMvZXhwb3J0ZWQuanN7ImltcG9ydHMiOlsiLi9jYWxsU3ByZWFkL3R5cGVzLmpzIiwiLi9sb2FuL3R5cGVzLmpzIiwiLi90eXBlcy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL3R5cGVzLmpzXCIsIFtdXSxbXCIuL2xvYW4vdHlwZXMuanNcIiwgW11dLFtcIi4vY2FsbFNwcmVhZC90eXBlcy5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAY1/usogaAACIGgAALwAAAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL2NvbnRyYWN0cy9sb2FuL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyoqXG4gKiBAdHlwZWRlZiB7Tm90aWZpZXI8WGltcG9ydCgnQGFnb3JpYy90aW1lL3NyYy90eXBlcycpLlRpbWVzdGFtcD59IFBlcmlvZE5vdGlmaWVyXG4gKlxuICogIFRoZSBOb3RpZmllciB0aGF0IHByb3ZpZGVzIG5vdGlmaWNhdGlvbnMgdGhhdCBwZXJpb2RzIGhhdmUgcGFzc2VkLlxuICogIFNpbmNlIG5vdGlmaWVycyBjYW4ndCBiZSByZWxpZWQgb24gdG8gcHJvZHVjZSBhbiBvdXRwdXQgZXZlcnkgdGltZVxuICogIHRoZXkgc2hvdWxkLCB3ZSdsbCB0cmFjayB0aGUgdGltZSBvZiBsYXN0IHBheW1lbnQsIGFuZCBjYXRjaCB1cCBpZlxuICogIGFueSB0aW1lcyBoYXZlIGJlZW4gbWlzc2VkLiBDb21wb3VuZCBpbnRlcmVzdCB3aWxsIGJlIGNhbGN1bGF0ZWRcbiAqICB1c2luZyB0aGUgaW50ZXJlc3RSYXRlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0luc3RhbmNlfSBBdXRvc3dhcEluc3RhbmNlXG4gKiAgIFRoZSBydW5uaW5nIGNvbnRyYWN0IGluc3RhbmNlIGZvciBhbiBBdXRvc3dhcCBpbnN0YWxsYXRpb24uICBUaGVcbiAqICAgcHVibGljRmFjZXQgZnJvbSB0aGUgQXV0b3N3YXBcbiAqICAgaW5zdGFuY2UgaXMgdXNlZCBmb3IgcHJvZHVjaW5nIGFuIGludml0YXRpb24gdG8gc2VsbCB0aGVcbiAqICAgY29sbGF0ZXJhbCBvbiBsaXF1aWRhdGlvbi5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExvYW5UZXJtc1xuICpcbiAqIEBwcm9wZXJ0eSB7UmF0aW99IG1tciAtIE1haW50ZW5hbmNlIE1hcmdpbiBSZXF1aXJlbWVudCwgYSBSYXRpbyByZWNvcmQuXG4gKiBEZWZhdWx0IGlzIDE1MCVcbiAqXG4gKiBAcHJvcGVydHkge0F1dG9zd2FwSW5zdGFuY2V9IGF1dG9zd2FwSW5zdGFuY2VcbiAqXG4gKiBAcHJvcGVydHkge1ByaWNlQXV0aG9yaXR5fSBwcmljZUF1dGhvcml0eVxuICpcbiAqICAgVXNlZCBmb3IgZ2V0dGluZyB0aGUgY3VycmVudCB2YWx1ZSBvZiBjb2xsYXRlcmFsIGFuZCBzZXR0aW5nXG4gKiAgIGxpcXVpZGF0aW9uIHRyaWdnZXJzLlxuICpcbiAqIEBwcm9wZXJ0eSB7UGVyaW9kTm90aWZpZXJ9IHBlcmlvZE5vdGlmaWVyXG4gKlxuICogQHByb3BlcnR5IHtSYXRpb30gaW50ZXJlc3RSYXRlXG4gKiAgIFRoZSByYXRlIGluIGJhc2lzIHBvaW50cyB0aGF0IHdpbGwgYmUgbXVsdGlwbGllZCB3aXRoIHRoZSBkZWJ0IG9uXG4gKiAgIGV2ZXJ5IHBlcmlvZCB0byBjb21wb3VuZCBpbnRlcmVzdC5cbiAqXG4gKiBAcHJvcGVydHkge1hpbXBvcnQoJ0BhZ29yaWMvdGltZS9zcmMvdHlwZXMnKS5SZWxhdGl2ZVRpbWV9IGludGVyZXN0UGVyaW9kXG4gKlxuICogQHByb3BlcnR5IHtCcmFuZH0gbG9hbkJyYW5kXG4gKiBAcHJvcGVydHkge0JyYW5kfSBjb2xsYXRlcmFsQnJhbmRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIExlbmRlclNlYXRQcm9wZXJ0eVxuICogQHByb3BlcnR5IHtaQ0ZTZWF0fSBsZW5kZXJTZWF0XG4gKlxuICogICBUaGUgWkNGU2VhdCByZXByZXNlbnRpbmcgdGhlIGxlbmRlcidzIHBvc2l0aW9uIGluIHRoZSBjb250cmFjdC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtMb2FuVGVybXMgJiBMZW5kZXJTZWF0UHJvcGVydHl9IExvYW5Db25maWdXaXRoTGVuZGVyXG4gKlxuICogVGhlIGxvYW4gbm93IGhhcyBhIGxlbmRlclNlYXQsIHdoaWNoIGlzIGFkZGVkIHRvIHRoZSBjb25maWcuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBCb3Jyb3dlckNvbmZpZ1Byb3BlcnRpZXNcbiAqXG4gKiBAcHJvcGVydHkge1pDRlNlYXR9IGNvbGxhdGVyYWxTZWF0XG4gKlxuICogICBUaGUgWkNGU2VhdCBob2xkaW5nIHRoZSBjb2xsYXRlcmFsIGluIGVzY3JvdyBhZnRlciB0aGUgYm9ycm93ZXJcbiAqICAgZXNjcm93cyBpdFxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQW1vdW50PCduYXQnPn0gZ2V0RGVidFxuICpcbiAqICAgQSBmdW5jdGlvbiB0byBnZXQgdGhlIGN1cnJlbnQgZGVidFxuICpcbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZVJlY29yZDxQcmljZVF1b3RlPn0gbGlxdWlkYXRpb25Qcm9taXNlS2l0XG4gKlxuICogICBQcm9taXNlS2l0IHRoYXQgaW5jbHVkZXMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBQcmljZVF1b3RlXG4gKiAgIHdoZW4gbGlxdWlkYXRpb24gaXMgdHJpZ2dlcmVkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiBCb3Jyb3dlckNvbmZpZ1Byb3BlcnRpZXNNaW51c0RlYnRcbiAqXG4gKiBAcHJvcGVydHkge1pDRlNlYXR9IGNvbGxhdGVyYWxTZWF0XG4gKlxuICogICBUaGUgWkNGU2VhdCBob2xkaW5nIHRoZSBjb2xsYXRlcmFsIGluIGVzY3JvdyBhZnRlciB0aGUgYm9ycm93ZXJcbiAqICAgZXNjcm93cyBpdFxuICpcbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZVJlY29yZDxQcmljZVF1b3RlPn0gbGlxdWlkYXRpb25Qcm9taXNlS2l0XG4gKlxuICogICBQcm9taXNlS2l0IHRoYXQgaW5jbHVkZXMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gYSBQcmljZVF1b3RlXG4gKiAgIHdoZW4gbGlxdWlkYXRpb24gaXMgdHJpZ2dlcmVkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7TG9hbkNvbmZpZ1dpdGhMZW5kZXIgJiBCb3Jyb3dlckNvbmZpZ1Byb3BlcnRpZXMgfSBMb2FuQ29uZmlnV2l0aEJvcnJvd2VyXG4gKlxuICogVGhlIGxvYW4gaGFzIGEgbGVuZGVyLCBhIGJvcnJvd2VyLCBhbmQgY29sbGF0ZXJhbCBlc2Nyb3dlZC5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtMb2FuQ29uZmlnV2l0aExlbmRlciAmIEJvcnJvd2VyQ29uZmlnUHJvcGVydGllc01pbnVzRGVidFxuICogfSBMb2FuQ29uZmlnV2l0aEJvcnJvd2VyTWludXNEZWJ0XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgU2NoZWR1bGVMaXF1aWRhdGlvblxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtMb2FuQ29uZmlnV2l0aEJvcnJvd2VyfSBjb25maWdcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBNYWtlTGVuZEludml0YXRpb25cbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqIEBwYXJhbSB7TG9hblRlcm1zfSBjb25maWdcbiAqIEByZXR1cm5zIHtQcm9taXNlPEludml0YXRpb24+fSBsZW5kSW52aXRhdGlvblxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIE1ha2VCb3Jyb3dJbnZpdGF0aW9uXG4gKiBAcGFyYW0ge1pDRn0gemNmXG4gKiBAcGFyYW0ge0xvYW5Db25maWdXaXRoTGVuZGVyfSBjb25maWdcbiAqIEByZXR1cm5zIHtQcm9taXNlPEludml0YXRpb24+fSBib3Jyb3dJbnZpdGF0aW9uXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgTWFrZUNsb3NlTG9hbkludml0YXRpb25cbiAqIEBwYXJhbSB7WkNGfSB6Y2ZcbiAqIEBwYXJhbSB7TG9hbkNvbmZpZ1dpdGhCb3Jyb3dlcn0gY29uZmlnXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJbnZpdGF0aW9uPn0gY2xvc2VMb2FuSW52aXRhdGlvblxuICovXG5cbi8qKlxuICogQWxsb3dzIGhvbGRlciB0byBhZGQgY29sbGF0ZXJhbCB0byB0aGUgY29udHJhY3QuIEV4aXRzIHRoZSBzZWF0XG4gKiBhZnRlciBhZGRpbmcuXG4gKlxuICogQGNhbGxiYWNrIE1ha2VBZGRDb2xsYXRlcmFsSW52aXRhdGlvblxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtMb2FuQ29uZmlnV2l0aEJvcnJvd2VyfSBjb25maWdcbiAqIEByZXR1cm5zIHtQcm9taXNlPEludml0YXRpb24+fSBhZGRDb2xsYXRlcmFsSW52aXRhdGlvblxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIExpcXVpZGF0ZVxuICogQHBhcmFtIHtaQ0Z9IHpjZlxuICogQHBhcmFtIHtMb2FuQ29uZmlnV2l0aEJvcnJvd2VyfSBjb25maWdcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIE1ha2VEZWJ0Q2FsY3VsYXRvclxuICogQHBhcmFtIHtEZWJ0Q2FsY3VsYXRvckNvbmZpZ30gZGVidENhbGN1bGF0b3JDb25maWdcbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBDYWxjSW50ZXJlc3RGblxuICogQHBhcmFtIHtBbW91bnQ8J25hdCc+fSBvbGREZWJ0XG4gKiBAcGFyYW0ge1JhdGlvfSBpbnRlcmVzdFJhdGVcbiAqIEByZXR1cm5zIHtBbW91bnQ8J25hdCc+fSBpbnRlcmVzdFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRGVidENhbGN1bGF0b3JDb25maWdcbiAqIEBwcm9wZXJ0eSB7Q2FsY0ludGVyZXN0Rm59IGNhbGNJbnRlcmVzdEZuXG4gKlxuICogICBBIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSB0aGUgaW50ZXJlc3QsIGdpdmVuIHRoZSBkZWJ0IHZhbHVlIGFuZCBhblxuICogICBpbnRlcmVzdCByYXRlIGluIGJhc2lzIHBvaW50cy5cbiAqXG4gKiBAcHJvcGVydHkge0Ftb3VudDwnbmF0Jz59IG9yaWdpbmFsRGVidFxuICpcbiAqICAgVGhlIGRlYnQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsb2FuLCBpbiBMb2FuIGJyYW5kXG4gKlxuICogQHByb3BlcnR5IHtQZXJpb2ROb3RpZmllcn0gcGVyaW9kTm90aWZpZXJcbiAqXG4gKiAgIFRoZSBBc3luY0l0ZXJhYmxlIHRvIG5vdGlmeSB3aGVuIGEgcGVyaW9kIGhhcyBvY2N1cnJlZFxuICpcbiAqIEBwcm9wZXJ0eSB7UmF0aW99IGludGVyZXN0UmF0ZVxuICogQHByb3BlcnR5IHtYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuUmVsYXRpdmVUaW1lfSBpbnRlcmVzdFBlcmlvZFxuICpcbiAqICB0aGUgcGVyaW9kIGF0IHdoaWNoIHRoZSBvdXRzdGFuZGluZyBkZWJ0IGluY3JlYXNlcyBieSB0aGUgaW50ZXJlc3RSYXRlXG4gKlxuICogQHByb3BlcnR5IHtaQ0Z9IHpjZlxuICpcbiAqIEBwcm9wZXJ0eSB7TG9hbkNvbmZpZ1dpdGhCb3Jyb3dlck1pbnVzRGVidH0gY29uZmlnTWludXNHZXREZWJ0XG4gKiBAcHJvcGVydHkge1hpbXBvcnQoJ0BhZ29yaWMvdGltZS9zcmMvdHlwZXMnKS5UaW1lc3RhbXB9IGJhc2V0aW1lIFRoZSBzdGFydGluZyBwb2ludCBmcm9tIHdoaWNoIHRvIGNhbGN1bGF0ZVxuICogaW50ZXJlc3QuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBDb25maWdNaW51c0dldERlYnRcbiAqIEBwcm9wZXJ0eSB7WkNGU2VhdH0gY29sbGF0ZXJhbFNlYXRcbiAqIEBwcm9wZXJ0eSB7UHJvbWlzZVJlY29yZDxhbnk+fSBsaXF1aWRhdGlvblByb21pc2VLaXRcbiAqIEBwcm9wZXJ0eSB7YmlnaW50fSBbbW1yXVxuICogQHByb3BlcnR5IHtIYW5kbGU8J0luc3RhbmNlJz59IGF1dG9zd2FwSW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7UHJpY2VBdXRob3JpdHl9IHByaWNlQXV0aG9yaXR5XG4gKiBAcHJvcGVydHkge1BlcmlvZE5vdGlmaWVyfSBwZXJpb2ROb3RpZmllclxuICogQHByb3BlcnR5IHtiaWdpbnR9IGludGVyZXN0UmF0ZVxuICogQHByb3BlcnR5IHtYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuUmVsYXRpdmVUaW1lfSBpbnRlcmVzdFBlcmlvZFxuICogQHByb3BlcnR5IHtaQ0ZTZWF0fSBsZW5kZXJTZWF0XG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBCb3Jyb3dGYWNldFxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxJbnZpdGF0aW9uPn0gbWFrZUNsb3NlTG9hbkludml0YXRpb25cbiAqXG4gKiBNYWtlIGFuIGludml0YXRpb24gdG8gY2xvc2UgdGhlIGxvYW4gYnkgcmVwYXlpbmcgdGhlIGRlYnRcbiAqICAgKGluY2x1ZGluZyBpbnRlcmVzdCkuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEludml0YXRpb24+fSBtYWtlQWRkQ29sbGF0ZXJhbEludml0YXRpb25cbiAqXG4gKiBNYWtlIGFuIGludml0YXRpb24gdG8gYWRkIGNvbGxhdGVyYWwgdG8gcHJvdGVjdCBhZ2FpbnN0IGxpcXVpZGF0aW9uXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPFByaWNlUXVvdGU+fSBnZXRMaXF1aWRhdGlvblByb21pc2VcbiAqXG4gKiBHZXQgYSBwcm9taXNlIGZvciBhIHByaWNlUXVvdGUgdGhhdCB3aWxsIHJlc29sdmUgaWYgbGlxdWlkYXRpb25cbiAqIG9jY3Vycy4gVGhlIHByaWNlUXVvdGUgaXMgZm9yIHRoZSB2YWx1ZSBvZiB0aGUgY29sbGF0ZXJhbCB0aGF0XG4gKiB0cmlnZ2VyZWQgdGhlIGxpcXVpZGF0aW9uLiBUaGlzIG1heSBiZSBsb3dlciB0aGFuIGV4cGVjdGVkIGlmIHRoZVxuICogcHJpY2UgaXMgbW92aW5nIHF1aWNrbHkuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXN0YW1wfSBnZXRMYXN0Q2FsY3VsYXRpb25UaW1lc3RhbXBcbiAqXG4gKiBHZXQgdGhlIHRpbWVzdGFtcCBhdCB3aGljaCB0aGUgZGVidCB3YXMgbW9zdCByZWNlbnRseSByZWNhbGN1bGF0ZWQuXG4gKlxuICogQHByb3BlcnR5IHsoKSA9PiBOb3RpZmllcjxBbW91bnQ+fSBnZXREZWJ0Tm90aWZpZXJcbiAqXG4gKiBHZXQgYSBOb3RpZmllciB0aGF0IHdpbGwgYmUgdXBkYXRlZCB3aGVuIHRoZSBjdXJyZW50IGRlYnQgKGFuIEFtb3VudCB3aXRoIHRoZSBMb2FuXG4gKiBCcmFuZCkgY2hhbmdlcy4gVGhpcyB3aWxsIGluY3JlYXNlIGFzIGludGVyZXN0IGlzIGFkZGVkLlxuICpcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gQW1vdW50fSBnZXRSZWNlbnRDb2xsYXRlcmFsQW1vdW50XG4gKlxuICogR2V0IGEgcmVjZW50IHJlcG9ydCBvZiB0aGUgYW1vdW50IG9mIGNvbGxhdGVyYWwgaW4gdGhlIGxvYW5cbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC2UO1PvQsAAL0LAAAqAAAAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvY29udHJhY3RzL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTZWxsSXRlbXNQdWJsaWNGYWNldFxuICogQHByb3BlcnR5IHsoKSA9PiBJc3N1ZXJ9IGdldEl0ZW1zSXNzdWVyXG4gKiBAcHJvcGVydHkgeygpID0+IEFtb3VudH0gZ2V0QXZhaWxhYmxlSXRlbXNcbiAqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTZWxsSXRlbXNDcmVhdG9yT25seVxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEludml0YXRpb24+fSBtYWtlQnV5ZXJJbnZpdGF0aW9uXG4gKlxuICogQHR5cGVkZWYge1NlbGxJdGVtc1B1YmxpY0ZhY2V0ICYgU2VsbEl0ZW1zQ3JlYXRvck9ubHl9IFNlbGxJdGVtc0NyZWF0b3JGYWNldFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gU2VsbEl0ZW1zUGFyYW1ldGVyc1xuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBjdXN0b21WYWx1ZVByb3BlcnRpZXNcbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBjb3VudFxuICogQHByb3BlcnR5IHtJc3N1ZXJ9IG1vbmV5SXNzdWVyXG4gKiBAcHJvcGVydHkge0luc3RhbGxhdGlvbn0gc2VsbEl0ZW1zSW5zdGFsbGF0aW9uXG4gKiBAcHJvcGVydHkge0Ftb3VudH0gcHJpY2VQZXJJdGVtXG4gKlxuICogQHR5cGVkZWYge29iamVjdH0gU2VsbEl0ZW1zUmVzdWx0XG4gKiBAcHJvcGVydHkge1VzZXJTZWF0fSBzZWxsSXRlbXNDcmVhdG9yU2VhdFxuICogQHByb3BlcnR5IHtTZWxsSXRlbXNDcmVhdG9yRmFjZXR9IHNlbGxJdGVtc0NyZWF0b3JGYWNldFxuICogQHByb3BlcnR5IHtJbnN0YW5jZX0gc2VsbEl0ZW1zSW5zdGFuY2VcbiAqIEBwcm9wZXJ0eSB7U2VsbEl0ZW1zUHVibGljRmFjZXR9IHNlbGxJdGVtc1B1YmxpY0ZhY2V0XG4gKlxuICogQHR5cGVkZWYge29iamVjdH0gTWludEFuZFNlbGxORlRDcmVhdG9yRmFjZXRcbiAqIEBwcm9wZXJ0eSB7KHNlbGxQYXJhbXM6IFNlbGxJdGVtc1BhcmFtZXRlcnMpID0+IFByb21pc2U8U2VsbEl0ZW1zUmVzdWx0Pn0gc2VsbFRva2Vuc1xuICogQHByb3BlcnR5IHsoKSA9PiBJc3N1ZXJ9IGdldElzc3VlclxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQXV0b21hdGljUmVmdW5kUHVibGljRmFjZXRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gYmlnaW50fSBnZXRPZmZlcnNDb3VudFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEludml0YXRpb24+fSBtYWtlSW52aXRhdGlvblxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQXV0b3N3YXBQdWJsaWNGYWNldFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEludml0YXRpb24+fSBtYWtlU3dhcEludml0YXRpb24gc3lub255bSBmb3JcbiAqIG1ha2VTd2FwSW5JbnZpdGF0aW9uXG4gKiBAcHJvcGVydHkgeygpID0+IFByb21pc2U8SW52aXRhdGlvbj59IG1ha2VTd2FwSW5JbnZpdGF0aW9uIG1ha2UgYW4gaW52aXRhdGlvblxuICogdGhhdCBhbGxvd3Mgb25lIHRvIGRvIGEgc3dhcCBpbiB3aGljaCB0aGUgSW4gYW1vdW50IGlzIHNwZWNpZmllZCBhbmQgdGhlIE91dFxuICogYW1vdW50IGlzIGNhbGN1bGF0ZWRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxJbnZpdGF0aW9uPn0gbWFrZVN3YXBPdXRJbnZpdGF0aW9uIG1ha2UgYW4gaW52aXRhdGlvblxuICogdGhhdCBhbGxvd3Mgb25lIHRvIGRvIGEgc3dhcCBpbiB3aGljaCB0aGUgT3V0IGFtb3VudCBpcyBzcGVjaWZpZWQgYW5kIHRoZSBJblxuICogYW1vdW50IGlzIGNhbGN1bGF0ZWRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxJbnZpdGF0aW9uPn0gbWFrZUFkZExpcXVpZGl0eUludml0YXRpb24gbWFrZSBhblxuICogaW52aXRhdGlvbiB0aGF0IGFsbG93cyBvbmUgdG8gYWRkIGxpcXVpZGl0eSB0byB0aGUgcG9vbC5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxJbnZpdGF0aW9uPn0gbWFrZVJlbW92ZUxpcXVpZGl0eUludml0YXRpb24gbWFrZSBhblxuICogaW52aXRhdGlvbiB0aGF0IGFsbG93cyBvbmUgdG8gcmVtb3ZlIGxpcXVpZGl0eSBmcm9tIHRoZSBwb29sLlxuICogQHByb3BlcnR5IHsoKSA9PiBJc3N1ZXJ9IGdldExpcXVpZGl0eUlzc3VlclxuICogQHByb3BlcnR5IHsoKSA9PiBiaWdpbnR9IGdldExpcXVpZGl0eVN1cHBseSBnZXQgdGhlIGN1cnJlbnQgdmFsdWUgb2ZcbiAqIGxpcXVpZGl0eSBoZWxkIGJ5IGludmVzdG9ycy5cbiAqIEBwcm9wZXJ0eSB7KGFtb3VudEluOiBBbW91bnQsIGJyYW5kT3V0OiBCcmFuZCkgPT4gQW1vdW50fSBnZXRJbnB1dFByaWNlXG4gKiBjYWxjdWxhdGUgdGhlIGFtb3VudCBvZiBicmFuZE91dCB0aGF0IHdpbGwgYmUgcmV0dXJuZWQgaWYgdGhlIGFtb3VudEluIGlzXG4gKiBvZmZlcmVkIHVzaW5nIG1ha2VTd2FwSW5JbnZpdGF0aW9uIGF0IHRoZSBjdXJyZW50IHByaWNlLlxuICogQHByb3BlcnR5IHsoYW1vdW50T3V0OiBBbW91bnQsIGJyYW5kSW46IEJyYW5kKSA9PiBBbW91bnR9IGdldE91dHB1dFByaWNlXG4gKiBjYWxjdWxhdGUgdGhlIGFtb3VudCBvZiBicmFuZEluIHRoYXQgaXMgcmVxdWlyZWQgaW4gb3JkZXIgdG8gZ2V0IGFtb3VudE91dFxuICogdXNpbmcgbWFrZVN3YXBPdXRJbnZpdGF0aW9uIGF0IHRoZSBjdXJyZW50IHByaWNlXG4gKiBAcHJvcGVydHkgeygpID0+IFJlY29yZDxzdHJpbmcsIEFtb3VudD59IGdldFBvb2xBbGxvY2F0aW9uIGdldCBhblxuICogQW1vdW50S2V5d29yZFJlY29yZCBzaG93aW5nIHRoZSBjdXJyZW50IGJhbGFuY2VzIGluIHRoZSBwb29sLlxuICovXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFRHQeUSQwAAEkMAACUAAABAYWdvcmljL3pvZS12MC4yNS4zL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIkBhZ29yaWMvZXJ0cCIsIkBhZ29yaWMvbm90aWZpZXIiLCJAYWdvcmljL3N0b3JlIiwiQGFnb3JpYy90aW1lIl0sImV4cG9ydHMiOlsiQWRtaW5GYWNldEkiLCJBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUiLCJBbW91bnRQYXR0ZXJuS2V5d29yZFJlY29yZFNoYXBlIiwiQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUiLCJCdW5kbGVDYXBTaGFwZSIsIkJ1bmRsZVNoYXBlIiwiRXhpdE9iamVjdEkiLCJFeGl0T2JqZWN0U2hhcGUiLCJGdWxsUHJvcG9zYWxTaGFwZSIsIkhhbmRsZUkiLCJIYW5kbGVPZmZlckkiLCJJbnN0YWxsYXRpb25TaGFwZSIsIkluc3RhbmNlQWRtaW5JIiwiSW5zdGFuY2VBZG1pblNoYXBlIiwiSW5zdGFuY2VIYW5kbGVTaGFwZSIsIkluc3RhbmNlUmVjb3JkU2hhcGUiLCJJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCIsIkludml0YXRpb25FbGVtZW50U2hhcGUiLCJJbnZpdGF0aW9uSGFuZGxlU2hhcGUiLCJJbnZpdGF0aW9uU2hhcGUiLCJJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUiLCJJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlIiwiSXNzdWVyUmVjb3JkU2hhcGUiLCJLZXl3b3JkU2hhcGUiLCJPZmZlckhhbmRsZXJJIiwiUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUiLCJQcmljZVF1b3RlU2hhcGUiLCJQcm9wb3NhbFNoYXBlIiwiU2VhdERhdGFTaGFwZSIsIlNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlIiwiU2VhdFNoYXBlIiwiVGVybXNTaGFwZSIsIlRpbWVyU2hhcGUiLCJVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZSIsIlpjZk1pbnRJIiwiWm9lTWludEkiLCJab2VNaW50U2hhcGUiLCJab2VTZXJ2aWNlSSIsIlpvZVN0b3JhZ2VNYW5hZ2VySUtpdCIsImlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlIiwiaXNPbkRlbWFuZEV4aXRSdWxlIiwiaXNXYWl2ZWRFeGl0UnVsZSIsIm1ha2VIYW5kbGVTaGFwZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBBbW91bnRTaGFwZSxBc3NldEtpbmRTaGFwZSxEaXNwbGF5SW5mb1NoYXBlLElzc3VlclNoYXBlLEJyYW5kU2hhcGUsUGF5bWVudFNoYXBlLElzc3VlcktpdFNoYXBlLE0sVGltZXN0YW1wVmFsdWVTaGFwZSxTdWJzY3JpYmVyU2hhcGU7JGjigI1faW1wb3J0cyhbW1wiQGFnb3JpYy9lcnRwXCIsIFtbXCJBbW91bnRTaGFwZVwiLCBbJGjigI1fYSA9PiAoQW1vdW50U2hhcGUgPSAkaOKAjV9hKV1dLFtcIkFzc2V0S2luZFNoYXBlXCIsIFskaOKAjV9hID0+IChBc3NldEtpbmRTaGFwZSA9ICRo4oCNX2EpXV0sW1wiRGlzcGxheUluZm9TaGFwZVwiLCBbJGjigI1fYSA9PiAoRGlzcGxheUluZm9TaGFwZSA9ICRo4oCNX2EpXV0sW1wiSXNzdWVyU2hhcGVcIiwgWyRo4oCNX2EgPT4gKElzc3VlclNoYXBlID0gJGjigI1fYSldXSxbXCJCcmFuZFNoYXBlXCIsIFskaOKAjV9hID0+IChCcmFuZFNoYXBlID0gJGjigI1fYSldXSxbXCJQYXltZW50U2hhcGVcIiwgWyRo4oCNX2EgPT4gKFBheW1lbnRTaGFwZSA9ICRo4oCNX2EpXV0sW1wiSXNzdWVyS2l0U2hhcGVcIiwgWyRo4oCNX2EgPT4gKElzc3VlcktpdFNoYXBlID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvc3RvcmVcIiwgW1tcIk1cIiwgWyRo4oCNX2EgPT4gKE0gPSAkaOKAjV9hKV1dXV0sW1wiQGFnb3JpYy90aW1lXCIsIFtbXCJUaW1lc3RhbXBWYWx1ZVNoYXBlXCIsIFskaOKAjV9hID0+IChUaW1lc3RhbXBWYWx1ZVNoYXBlID0gJGjigI1fYSldXV1dLFtcIkBhZ29yaWMvbm90aWZpZXJcIiwgW1tcIlN1YnNjcmliZXJTaGFwZVwiLCBbJGjigI1fYSA9PiAoU3Vic2NyaWJlclNoYXBlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiBrZXl3b3JkcyBoYXZlIGFuIGluaXRpYWwgY2FwKi9cbmNvbnN0ICAgICAgICBLZXl3b3JkU2hhcGU9TS5zdHJpbmcoKTskaOKAjV9vbmNlLktleXdvcmRTaGFwZShLZXl3b3JkU2hhcGUpO1xuXG5jb25zdCAgICAgICAgSW52aXRhdGlvbkhhbmRsZVNoYXBlPU0ucmVtb3RhYmxlKCdJbnZpdGF0aW9uSGFuZGxlJyk7JGjigI1fb25jZS5JbnZpdGF0aW9uSGFuZGxlU2hhcGUoSW52aXRhdGlvbkhhbmRsZVNoYXBlKTtcbmNvbnN0ICAgICAgICBJbnZpdGF0aW9uU2hhcGU9TS5yZW1vdGFibGUoJ0ludml0YXRpb24nKTskaOKAjV9vbmNlLkludml0YXRpb25TaGFwZShJbnZpdGF0aW9uU2hhcGUpO1xuY29uc3QgICAgICAgIEluc3RhbmNlSGFuZGxlU2hhcGU9TS5yZW1vdGFibGUoJ0luc3RhbmNlSGFuZGxlJyk7JGjigI1fb25jZS5JbnN0YW5jZUhhbmRsZVNoYXBlKEluc3RhbmNlSGFuZGxlU2hhcGUpO1xuY29uc3QgICAgICAgIEluc3RhbGxhdGlvblNoYXBlPU0ucmVtb3RhYmxlKCdJbnN0YWxsYXRpb24nKTskaOKAjV9vbmNlLkluc3RhbGxhdGlvblNoYXBlKEluc3RhbGxhdGlvblNoYXBlKTtcbmNvbnN0ICAgICAgICBTZWF0U2hhcGU9TS5yZW1vdGFibGUoJ1NlYXQnKTskaOKAjV9vbmNlLlNlYXRTaGFwZShTZWF0U2hhcGUpO1xuXG5jb25zdCAgICAgICAgQW1vdW50S2V5d29yZFJlY29yZFNoYXBlPU0ucmVjb3JkT2YoS2V5d29yZFNoYXBlLEFtb3VudFNoYXBlKTskaOKAjV9vbmNlLkFtb3VudEtleXdvcmRSZWNvcmRTaGFwZShBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUpO1xuY29uc3QgICAgICAgIEFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGU9TS5yZWNvcmRPZihcbktleXdvcmRTaGFwZSxcbk0ucGF0dGVybigpKTskaOKAjV9vbmNlLkFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUoQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZSk7XG5cbmNvbnN0ICAgICAgICBQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZT1NLnJlY29yZE9mKFxuS2V5d29yZFNoYXBlLFxuTS5lcmVmKFBheW1lbnRTaGFwZSkpOyRo4oCNX29uY2UuUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUoUGF5bWVudFBLZXl3b3JkUmVjb3JkU2hhcGUpO1xuXG5jb25zdCAgICAgICAgSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlPU0ucmVjb3JkT2YoS2V5d29yZFNoYXBlLElzc3VlclNoYXBlKTskaOKAjV9vbmNlLklzc3VlcktleXdvcmRSZWNvcmRTaGFwZShJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUpO1xuY29uc3QgICAgICAgIElzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGU9TS5yZWNvcmRPZihcbktleXdvcmRTaGFwZSxcbk0uZXJlZihJc3N1ZXJTaGFwZSkpOyRo4oCNX29uY2UuSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZShJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlKTtcblxuY29uc3QgICAgICAgIEJyYW5kS2V5d29yZFJlY29yZFNoYXBlPU0ucmVjb3JkT2YoS2V5d29yZFNoYXBlLEJyYW5kU2hhcGUpOyRo4oCNX29uY2UuQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUoQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUpO1xuXG5jb25zdCAgICAgICAgSXNzdWVyUmVjb3JkU2hhcGU9TS5zcGxpdFJlY29yZChcbntcbmJyYW5kOkJyYW5kU2hhcGUsXG5pc3N1ZXI6SXNzdWVyU2hhcGUsXG5hc3NldEtpbmQ6QXNzZXRLaW5kU2hhcGV9LFxuXG57ZGlzcGxheUluZm86RGlzcGxheUluZm9TaGFwZX0pOyRo4oCNX29uY2UuSXNzdWVyUmVjb3JkU2hhcGUoSXNzdWVyUmVjb3JkU2hhcGUpO1xuXG5cbmNvbnN0ICAgICAgICBUZXJtc1NoYXBlPWhhcmRlbih7XG5pc3N1ZXJzOklzc3VlcktleXdvcmRSZWNvcmRTaGFwZSxcbmJyYW5kczpCcmFuZEtleXdvcmRSZWNvcmRTaGFwZX0pOyRo4oCNX29uY2UuVGVybXNTaGFwZShUZXJtc1NoYXBlKTtcblxuXG5jb25zdCAgICAgICAgSW5zdGFuY2VSZWNvcmRTaGFwZT1oYXJkZW4oe1xuaW5zdGFsbGF0aW9uOkluc3RhbGxhdGlvblNoYXBlLFxuaW5zdGFuY2U6SW5zdGFuY2VIYW5kbGVTaGFwZSxcbnRlcm1zOk0uc3BsaXRSZWNvcmQoVGVybXNTaGFwZSl9KTskaOKAjV9vbmNlLkluc3RhbmNlUmVjb3JkU2hhcGUoSW5zdGFuY2VSZWNvcmRTaGFwZSk7XG5cblxuY29uc3QgICAgICAgIEhhbmRsZUk9TS5pbnRlcmZhY2UoJ0hhbmRsZScse30pOyRo4oCNX29uY2UuSGFuZGxlSShIYW5kbGVJKTtcblxuY29uc3QgICAgICAgIG1ha2VIYW5kbGVTaGFwZT0obmFtZSk9Pk0ucmVtb3RhYmxlKCBgJHtuYW1lfUhhbmRsZWApOyRo4oCNX29uY2UubWFrZUhhbmRsZVNoYXBlKG1ha2VIYW5kbGVTaGFwZSk7XG5jb25zdCAgICAgICAgVGltZXJTaGFwZT1tYWtlSGFuZGxlU2hhcGUoJ3RpbWVyJyk7XG5cbi8qKlxuICogQWZ0ZXIgZGVmYXVsdHMgYXJlIGZpbGxlZCBpblxuICpcbiAqIEBzZWUge1Byb3Bvc2FsUmVjb3JkfSB0eXBlXG4gKi8kaOKAjV9vbmNlLlRpbWVyU2hhcGUoVGltZXJTaGFwZSk7XG5jb25zdCAgICAgICAgRnVsbFByb3Bvc2FsU2hhcGU9aGFyZGVuKHtcbndhbnQ6QW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZSxcbmdpdmU6QW1vdW50S2V5d29yZFJlY29yZFNoYXBlLFxuLyogVG8gYWNjZXB0IG9ubHkgb25lLCB3ZSBjb3VsZCB1c2UgTS5vciByYXRoZXIgdGhhbiBNLnNwbGl0UmVjb3JkLCovXG4vKiBidXQgdGhlIGVycm9yIG1lc3NhZ2VzIHdvdWxkIGhhdmUgYmVlbiB3b3JzZS4gUmF0aGVyLCovXG4vKiBjbGVhblByb3Bvc2FsJ3MgYXNzZXJ0RXhpdCBjaGVja3MgdGhhdCB0aGVyZSdzIGV4YWN0bHkgb25lLiovXG5leGl0Ok0uc3BsaXRSZWNvcmQoXG57fSxcbntcbm9uRGVtYW5kOm51bGwsXG53YWl2ZWQ6bnVsbCxcbmFmdGVyRGVhZGxpbmU6e1xudGltZXI6TS5lcmVmKFRpbWVyU2hhcGUpLFxuZGVhZGxpbmU6VGltZXN0YW1wVmFsdWVTaGFwZX19LFxuXG5cbnt9KX0pO1xuXG5cbi8qKiBAc2VlIHtQcm9wb3NhbH0gdHlwZSAqLyRo4oCNX29uY2UuRnVsbFByb3Bvc2FsU2hhcGUoRnVsbFByb3Bvc2FsU2hhcGUpO1xuY29uc3QgICAgICAgIFByb3Bvc2FsU2hhcGU9TS5zcGxpdFJlY29yZCh7fSxGdWxsUHJvcG9zYWxTaGFwZSx7fSk7JGjigI1fb25jZS5Qcm9wb3NhbFNoYXBlKFByb3Bvc2FsU2hhcGUpO1xuXG5jb25zdCAgICAgICAgaXNPbkRlbWFuZEV4aXRSdWxlPShleGl0KT0+e1xuY29uc3RbZXhpdEtleV09T2JqZWN0LmtleXMoZXhpdCk7XG5yZXR1cm4gZXhpdEtleT09PSdvbkRlbWFuZCc7XG4gfTtcblxuLyoqXG4gKiBAcGFyYW0ge0V4aXRSdWxlfSBleGl0XG4gKiBAcmV0dXJucyB7ZXhpdCBpcyBXYWl2ZWRFeGl0UnVsZX1cbiAqLyRo4oCNX29uY2UuaXNPbkRlbWFuZEV4aXRSdWxlKGlzT25EZW1hbmRFeGl0UnVsZSk7XG5jb25zdCAgICAgICAgaXNXYWl2ZWRFeGl0UnVsZT0oZXhpdCk9PntcbmNvbnN0W2V4aXRLZXldPU9iamVjdC5rZXlzKGV4aXQpO1xucmV0dXJuIGV4aXRLZXk9PT0nd2FpdmVkJztcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7RXhpdFJ1bGV9IGV4aXRcbiAqIEByZXR1cm5zIHtleGl0IGlzIEFmdGVyRGVhZGxpbmVFeGl0UnVsZX1cbiAqLyRo4oCNX29uY2UuaXNXYWl2ZWRFeGl0UnVsZShpc1dhaXZlZEV4aXRSdWxlKTtcbmNvbnN0ICAgICAgICBpc0FmdGVyRGVhZGxpbmVFeGl0UnVsZT0oZXhpdCk9PntcbmNvbnN0W2V4aXRLZXldPU9iamVjdC5rZXlzKGV4aXQpO1xucmV0dXJuIGV4aXRLZXk9PT0nYWZ0ZXJEZWFkbGluZSc7XG4gfTskaOKAjV9vbmNlLmlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlKGlzQWZ0ZXJEZWFkbGluZUV4aXRSdWxlKTtcblxuY29uc3QgICAgICAgIEludml0YXRpb25FbGVtZW50U2hhcGU9TS5zcGxpdFJlY29yZCh7XG5kZXNjcmlwdGlvbjpNLnN0cmluZygpLFxuaGFuZGxlOkludml0YXRpb25IYW5kbGVTaGFwZSxcbmluc3RhbmNlOkluc3RhbmNlSGFuZGxlU2hhcGUsXG5pbnN0YWxsYXRpb246SW5zdGFsbGF0aW9uU2hhcGV9KTskaOKAjV9vbmNlLkludml0YXRpb25FbGVtZW50U2hhcGUoSW52aXRhdGlvbkVsZW1lbnRTaGFwZSk7XG5cblxuY29uc3QgICAgICAgIE9mZmVySGFuZGxlckk9TS5pbnRlcmZhY2UoJ09mZmVySGFuZGxlcicse1xuaGFuZGxlOk0uY2FsbChTZWF0U2hhcGUpLm9wdGlvbmFsKE0uYW55KCkpLnJldHVybnMoTS5zdHJpbmcoKSl9KTskaOKAjV9vbmNlLk9mZmVySGFuZGxlckkoT2ZmZXJIYW5kbGVySSk7XG5cblxuY29uc3QgICAgICAgIFNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlPU0uYXJyYXlPZihcbmhhcmRlbih7XG5zZWF0SGFuZGxlOlNlYXRTaGFwZSxcbmFsbG9jYXRpb246QW1vdW50S2V5d29yZFJlY29yZFNoYXBlfSkpOyRo4oCNX29uY2UuU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGUoU2VhdEhhbmRsZUFsbG9jYXRpb25zU2hhcGUpO1xuXG5cblxuY29uc3QgICAgICAgIFpvZU1pbnRTaGFwZT1NLnJlbW90YWJsZSgnWm9lTWludCcpOyRo4oCNX29uY2UuWm9lTWludFNoYXBlKFpvZU1pbnRTaGFwZSk7XG5jb25zdCAgICAgICAgWm9lTWludEk9TS5pbnRlcmZhY2UoJ1pvZU1pbnQnLHtcbmdldElzc3VlclJlY29yZDpNLmNhbGwoKS5yZXR1cm5zKElzc3VlclJlY29yZFNoYXBlKSxcbm1pbnRBbmRFc2Nyb3c6TS5jYWxsKEFtb3VudFNoYXBlKS5yZXR1cm5zKCksXG53aXRoZHJhd0FuZEJ1cm46TS5jYWxsKEFtb3VudFNoYXBlKS5yZXR1cm5zKCl9KTskaOKAjV9vbmNlLlpvZU1pbnRJKFpvZU1pbnRJKTtcblxuXG5jb25zdCAgICAgICAgWmNmTWludEk9TS5pbnRlcmZhY2UoJ1pjZk1pbnQnLHtcbmdldElzc3VlclJlY29yZDpNLmNhbGwoKS5yZXR1cm5zKElzc3VlclJlY29yZFNoYXBlKSxcbm1pbnRHYWluczpNLmNhbGwoQW1vdW50S2V5d29yZFJlY29yZFNoYXBlLE0ucmVtb3RhYmxlKCd6Y2ZTZWF0JykpLnJldHVybnMoKSxcbmJ1cm5Mb3NzZXM6TS5jYWxsKFxuQW1vdW50S2V5d29yZFJlY29yZFNoYXBlLFxuTS5yZW1vdGFibGUoJ3pjZlNlYXQnKSkuXG5yZXR1cm5zKCl9KTskaOKAjV9vbmNlLlpjZk1pbnRJKFpjZk1pbnRJKTtcblxuXG5jb25zdCAgICAgICAgRXhpdE9iamVjdEk9TS5pbnRlcmZhY2UoJ0V4aXQgT2JqZWN0Jyx7XG5leGl0Ok0uY2FsbCgpLnJldHVybnMoKX0pOyRo4oCNX29uY2UuRXhpdE9iamVjdEkoRXhpdE9iamVjdEkpO1xuXG5cbmNvbnN0ICAgICAgICBFeGl0T2JqZWN0U2hhcGU9TS5yZW1vdGFibGUoJ0V4aXRPYmonKTskaOKAjV9vbmNlLkV4aXRPYmplY3RTaGFwZShFeGl0T2JqZWN0U2hhcGUpO1xuY29uc3QgICAgICAgIEluc3RhbmNlQWRtaW5TaGFwZT1NLnJlbW90YWJsZSgnSW5zdGFuY2VBZG1pbicpOyRo4oCNX29uY2UuSW5zdGFuY2VBZG1pblNoYXBlKEluc3RhbmNlQWRtaW5TaGFwZSk7XG5jb25zdCAgICAgICAgSW5zdGFuY2VBZG1pbkk9TS5pbnRlcmZhY2UoJ0luc3RhbmNlQWRtaW4nLHtcbm1ha2VJbnZpdGF0aW9uOk0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUsTS5zdHJpbmcoKSkuXG5vcHRpb25hbChNLnJlY29yZCgpLE0ucGF0dGVybigpKS5cbnJldHVybnMoSW52aXRhdGlvblNoYXBlKSxcbnNhdmVJc3N1ZXI6TS5jYWxsV2hlbihNLmF3YWl0KElzc3VlclNoYXBlKSxLZXl3b3JkU2hhcGUpLnJldHVybnMoXG5Jc3N1ZXJSZWNvcmRTaGFwZSksXG5cbm1ha2VOb0VzY3Jvd1NlYXQ6TS5jYWxsKFxuQW1vdW50S2V5d29yZFJlY29yZFNoYXBlLFxuUHJvcG9zYWxTaGFwZSxcbkV4aXRPYmplY3RTaGFwZSxcblNlYXRTaGFwZSkuXG5yZXR1cm5zKFNlYXRTaGFwZSksXG5leGl0QWxsU2VhdHM6TS5jYWxsKE0uYW55KCkpLnJldHVybnMoKSxcbmZhaWxBbGxTZWF0czpNLmNhbGwoTS5hbnkoKSkucmV0dXJucygpLFxuZXhpdFNlYXQ6TS5jYWxsKFNlYXRTaGFwZSxNLmFueSgpKS5yZXR1cm5zKCksXG5mYWlsU2VhdDpNLmNhbGwoU2VhdFNoYXBlLE0uYW55KCkpLnJldHVybnMoKSxcbm1ha2Vab2VNaW50Ok0uY2FsbChLZXl3b3JkU2hhcGUpLlxub3B0aW9uYWwoXG5Bc3NldEtpbmRTaGFwZSxcbkRpc3BsYXlJbmZvU2hhcGUsXG5NLnNwbGl0UmVjb3JkKGhhcmRlbih7fSksaGFyZGVuKHtlbGVtZW50U2hhcGU6TS5wYXR0ZXJuKCl9KSkpLlxuXG5yZXR1cm5zKE0ucmVtb3RhYmxlKCd6b2VNaW50JykpLFxucmVnaXN0ZXJGZWVNaW50Ok0uY2FsbChLZXl3b3JkU2hhcGUsTS5yZW1vdGFibGUoJ2ZlZU1pbnRBY2Nlc3MnKSkucmV0dXJucyhcbk0ucmVtb3RhYmxlKCdmZWVNaW50JykpLFxuXG5yZXBsYWNlQWxsb2NhdGlvbnM6TS5jYWxsKFNlYXRIYW5kbGVBbGxvY2F0aW9uc1NoYXBlKS5yZXR1cm5zKCksXG5zdG9wQWNjZXB0aW5nT2ZmZXJzOk0uY2FsbCgpLnJldHVybnMoKSxcbnNldE9mZmVyRmlsdGVyOk0uY2FsbChNLmFycmF5T2YoTS5zdHJpbmcoKSkpLnJldHVybnMoKSxcbmdldE9mZmVyRmlsdGVyOk0uY2FsbCgpLnJldHVybnMoTS5hcnJheU9mKE0uc3RyaW5nKCkpKSxcbmdldEV4aXRTdWJzY3JpYmVyOk0uY2FsbChTZWF0U2hhcGUpLnJldHVybnMoU3Vic2NyaWJlclNoYXBlKSxcbmlzQmxvY2tlZDpNLmNhbGwoTS5zdHJpbmcoKSkucmV0dXJucyhNLmJvb2xlYW4oKSl9KTskaOKAjV9vbmNlLkluc3RhbmNlQWRtaW5JKEluc3RhbmNlQWRtaW5JKTtcblxuXG5jb25zdCAgICAgICAgSW5zdGFuY2VTdG9yYWdlTWFuYWdlcklLaXQ9aGFyZGVuKHtcbmluc3RhbmNlU3RvcmFnZU1hbmFnZXI6TS5pbnRlcmZhY2UoJ0luc3RhbmNlU3RvcmFnZU1hbmFnZXInLHtcbmdldFRlcm1zOk0uY2FsbCgpLnJldHVybnMoTS5zcGxpdFJlY29yZChUZXJtc1NoYXBlKSksXG5nZXRJc3N1ZXJzOk0uY2FsbCgpLnJldHVybnMoSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlKSxcbmdldEJyYW5kczpNLmNhbGwoKS5yZXR1cm5zKEJyYW5kS2V5d29yZFJlY29yZFNoYXBlKSxcbmdldEluc3RhbGxhdGlvbjpNLmNhbGwoKS5yZXR1cm5zKEluc3RhbGxhdGlvblNoYXBlKSxcbmdldEludml0YXRpb25Jc3N1ZXI6TS5jYWxsKCkucmV0dXJucyhJc3N1ZXJTaGFwZSksXG5cbnNhdmVJc3N1ZXI6TS5jYWxsKElzc3VlclNoYXBlLEtleXdvcmRTaGFwZSkucmV0dXJucyhNLnByb21pc2UoKSksXG5tYWtlWm9lTWludDpNLmNhbGwoS2V5d29yZFNoYXBlKS5cbm9wdGlvbmFsKFxuQXNzZXRLaW5kU2hhcGUsXG5EaXNwbGF5SW5mb1NoYXBlLFxuTS5zcGxpdFJlY29yZChoYXJkZW4oe30pLGhhcmRlbih7ZWxlbWVudFNoYXBlOk0ucGF0dGVybigpfSkpKS5cblxucmV0dXJucyhNLmVyZWYoWm9lTWludFNoYXBlKSksXG5yZWdpc3RlckZlZU1pbnQ6TS5jYWxsKEtleXdvcmRTaGFwZSxNLnJlbW90YWJsZSgnZmVlTWludEFjY2VzcycpKS5yZXR1cm5zKFxuTS5yZW1vdGFibGUoJ2ZlZU1pbnQnKSksXG5cbmdldEluc3RhbmNlUmVjb3JkOk0uY2FsbCgpLnJldHVybnMoSW5zdGFuY2VSZWNvcmRTaGFwZSksXG5nZXRJc3N1ZXJSZWNvcmRzOk0uY2FsbCgpLnJldHVybnMoTS5hcnJheU9mKElzc3VlclJlY29yZFNoYXBlKSksXG5nZXRXaXRoZHJhd0ZhY2V0Ok0uY2FsbCgpLnJldHVybnMoTS5yZW1vdGFibGUoJ1dpdGhkcmF3RmFjZXQnKSksXG5pbml0SW5zdGFuY2VBZG1pbjpNLmNhbGwoXG5JbnN0YW5jZUhhbmRsZVNoYXBlLFxuTS5yZW1vdGFibGUoJ2luc3RhbmNlQWRtaW4nKSkuXG5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbmRlbGV0ZUluc3RhbmNlQWRtaW46TS5jYWxsKEluc3RhbmNlQWRtaW5JKS5yZXR1cm5zKCksXG5tYWtlSW52aXRhdGlvbjpNLmNhbGwoSW52aXRhdGlvbkhhbmRsZVNoYXBlLE0uc3RyaW5nKCkpLlxub3B0aW9uYWwoTS5yZWNvcmQoKSxNLnBhdHRlcm4oKSkuXG5yZXR1cm5zKFBheW1lbnRTaGFwZSksXG5nZXRSb290Ok0uY2FsbCgpLnJldHVybnMoTS5hbnkoKSksXG5nZXRBZG1pbk5vZGU6TS5jYWxsKCkucmV0dXJucyhNLnJlbW90YWJsZSgnYWRtaW5Ob2RlJykpfSksXG5cbndpdGhkcmF3RmFjZXQ6TS5pbnRlcmZhY2UoJ1dpdGhkcmF3RmFjZXQnLHtcbndpdGhkcmF3UGF5bWVudHM6TS5jYWxsKEFtb3VudEtleXdvcmRSZWNvcmRTaGFwZSkucmV0dXJucyhcblBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlKX0pLFxuXG5cbmhlbHBlcnM6TS5pbnRlcmZhY2UoJ0luc3RhbmNlU3RvcmFnZU1hbmFnZXIgaGVscGVyJyx7XG53cmFwSXNzdWVyS2l0V2l0aFpvZU1pbnQ6TS5jYWxsKFxuS2V5d29yZFNoYXBlLFxuSXNzdWVyS2l0U2hhcGUsXG5NLnJlbW90YWJsZSgnYWRtaW5Ob2RlJykpLlxucmV0dXJucyhab2VNaW50U2hhcGUpfSl9KTskaOKAjV9vbmNlLkluc3RhbmNlU3RvcmFnZU1hbmFnZXJJS2l0KEluc3RhbmNlU3RvcmFnZU1hbmFnZXJJS2l0KTtcblxuXG5cbmNvbnN0ICAgICAgICBCdW5kbGVDYXBTaGFwZT1NLnJlbW90YWJsZSgnYnVuZGxlQ2FwJyk7JGjigI1fb25jZS5CdW5kbGVDYXBTaGFwZShCdW5kbGVDYXBTaGFwZSk7XG5jb25zdCAgICAgICAgQnVuZGxlU2hhcGU9TS5hbmQoXG5NLnNwbGl0UmVjb3JkKHttb2R1bGVGb3JtYXQ6TS5hbnkoKX0pLFxuTS5yZWNvcmRPZihNLnN0cmluZygpLE0uc3RyaW5nKHtzdHJpbmdMZW5ndGhMaW1pdDpJbmZpbml0eX0pKSk7JGjigI1fb25jZS5CdW5kbGVTaGFwZShCdW5kbGVTaGFwZSk7XG5cblxuY29uc3QgICAgICAgIFVud3JhcHBlZEluc3RhbGxhdGlvblNoYXBlPU0uc3BsaXRSZWNvcmQoXG5oYXJkZW4oe1xuaW5zdGFsbGF0aW9uOkluc3RhbGxhdGlvblNoYXBlfSksXG5cbmhhcmRlbih7XG5idW5kbGU6TS5yZWNvcmRPZihNLnN0cmluZygpLE0uc3RyaW5nKHtzdHJpbmdMZW5ndGhMaW1pdDpJbmZpbml0eX0pKSxcbmJ1bmRsZUNhcDpCdW5kbGVDYXBTaGFwZSxcbmJ1bmRsZUlEOk0uc3RyaW5nKCl9KSxcblxuaGFyZGVuKHt9KSk7JGjigI1fb25jZS5VbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZShVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZSk7XG5cblxuY29uc3QgICAgICAgIFpvZVN0b3JhZ2VNYW5hZ2VySUtpdD1oYXJkZW4oe1xuem9lU2VydmljZURhdGFBY2Nlc3M6TS5pbnRlcmZhY2UoJ1pvZVNlcnZpY2UgZGF0YUFjY2Vzcycse1xuZ2V0VGVybXM6TS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoTS5zcGxpdFJlY29yZChUZXJtc1NoYXBlKSksXG5nZXRJc3N1ZXJzOk0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKElzc3VlcktleXdvcmRSZWNvcmRTaGFwZSksXG5nZXRCcmFuZHM6TS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUpLFxuZ2V0SW5zdGFsbGF0aW9uOk0uY2FsbChJbnN0YW5jZUhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuTS5lcmVmKE0ucmVtb3RhYmxlKCdJbnN0YWxsYXRpb24nKSkpLFxuXG5nZXRJbnZpdGF0aW9uSXNzdWVyOk0uY2FsbCgpLnJldHVybnMoSXNzdWVyU2hhcGUpLFxuXG5nZXRCdW5kbGVJREZyb21JbnN0YWxsYXRpb246TS5jYWxsKEluc3RhbGxhdGlvblNoYXBlKS5yZXR1cm5zKFxuTS5lcmVmKE0uc3RyaW5nKCkpKSxcblxuaW5zdGFsbEJ1bmRsZTpNLmNhbGwoTS5vcihJbnN0YW5jZUhhbmRsZVNoYXBlLEJ1bmRsZVNoYXBlKSkucmV0dXJucyhcbk0ucHJvbWlzZSgpKSxcblxuaW5zdGFsbEJ1bmRsZUlEOk0uY2FsbChNLnN0cmluZygpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcblxuZ2V0UHVibGljRmFjZXQ6TS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoXG5NLmVyZWYoTS5yZW1vdGFibGUoJ1B1YmxpY0ZhY2V0JykpKSxcblxuZ2V0T2ZmZXJGaWx0ZXI6TS5jYWxsKEluc3RhbmNlSGFuZGxlU2hhcGUpLnJldHVybnMoTS5hcnJheU9mKE0uc3RyaW5nKCkpKSxcbmdldFByb3Bvc2FsU2hhcGVGb3JJbnZpdGF0aW9uOk0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUpLnJldHVybnMoXG5NLm9wdChNLnBhdHRlcm4oKSkpfSksXG5cblxubWFrZU9mZmVyQWNjZXNzOk0uaW50ZXJmYWNlKCdab2VTdG9yYWdlIG1ha2VPZmZlciBhY2Nlc3MnLHtcbmdldEFzc2V0S2luZEJ5QnJhbmQ6TS5jYWxsKEJyYW5kU2hhcGUpLnJldHVybnMoQXNzZXRLaW5kU2hhcGUpLFxuZ2V0SW5zdGFuY2VBZG1pbjpNLmNhbGwoSW5zdGFuY2VIYW5kbGVTaGFwZSkucmV0dXJucyhcbk0ucmVtb3RhYmxlKCdpbnN0YW5jZUFkbWluJykpLFxuXG5nZXRQcm9wb3NhbFNoYXBlRm9ySW52aXRhdGlvbjpNLmNhbGwoSW52aXRhdGlvbkhhbmRsZVNoYXBlKS5yZXR1cm5zKFxuTS5vcHQoTS5wYXR0ZXJuKCkpKSxcblxuZ2V0SW52aXRhdGlvbklzc3VlcjpNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKSxcbmRlcG9zaXRQYXltZW50czpNLmNhbGwoUHJvcG9zYWxTaGFwZSxQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSkucmV0dXJucyhcbk0ucHJvbWlzZSgpKX0pLFxuXG5cbnN0YXJ0SW5zdGFuY2VBY2Nlc3M6TS5pbnRlcmZhY2UoJ1pvZVN0b3JhZ2Ugc3RhcnRJbnN0YW5jZSBhY2Nlc3MnLHtcbm1ha2Vab2VJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VyOk0uY2FsbChcbk0uYW55KCksXG5JbnN0YWxsYXRpb25TaGFwZSxcbk0uYW55KCksXG5Jc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlLFxuTS5vcihJbnN0YW5jZUhhbmRsZVNoYXBlLEJ1bmRsZVNoYXBlKSxcbk0ub3IoQnVuZGxlQ2FwU2hhcGUsQnVuZGxlU2hhcGUpKS5cbnJldHVybnMoTS5wcm9taXNlKCkpLFxudW53cmFwSW5zdGFsbGF0aW9uOk0uY2FsbFdoZW4oTS5lcmVmKEluc3RhbGxhdGlvblNoYXBlKSkucmV0dXJucyhcblVud3JhcHBlZEluc3RhbGxhdGlvblNoYXBlKX0pLFxuXG5cbmludml0YXRpb25Jc3N1ZXJBY2Nlc3M6TS5pbnRlcmZhY2UoJ1pvZVN0b3JhZ2UgaW52aXRhdGlvbklzc3Vlcicse1xuZ2V0SW52aXRhdGlvbklzc3VlcjpNLmNhbGwoKS5yZXR1cm5zKElzc3VlclNoYXBlKX0pfSk7JGjigI1fb25jZS5ab2VTdG9yYWdlTWFuYWdlcklLaXQoWm9lU3RvcmFnZU1hbmFnZXJJS2l0KTtcblxuXG5cbmNvbnN0ICAgICAgICBab2VTZXJ2aWNlST1NLmludGVyZmFjZSgnWm9lU2VydmljZScse1xuaW5zdGFsbDpNLmNhbGwoTS5hbnkoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG5pbnN0YWxsQnVuZGxlSUQ6TS5jYWxsKE0uc3RyaW5nKCkpLnJldHVybnMoTS5wcm9taXNlKCkpLFxuc3RhcnRJbnN0YW5jZTpNLmNhbGwoTS5lcmVmKEluc3RhbGxhdGlvblNoYXBlKSkuXG5vcHRpb25hbChJc3N1ZXJQS2V5d29yZFJlY29yZFNoYXBlLE0uYW55KCksTS5hbnkoKSkuXG5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbm9mZmVyOk0uY2FsbChNLmVyZWYoSW52aXRhdGlvblNoYXBlKSkuXG5vcHRpb25hbChQcm9wb3NhbFNoYXBlLFBheW1lbnRQS2V5d29yZFJlY29yZFNoYXBlLE0uYW55KCkpLlxucmV0dXJucyhNLnByb21pc2UoKSksXG5cbmdldE9mZmVyRmlsdGVyOk0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkucmV0dXJucyhcbk0uYXJyYXlPZihNLnN0cmluZygpKSksXG5cbmdldEludml0YXRpb25Jc3N1ZXI6TS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG5nZXRGZWVJc3N1ZXI6TS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG5nZXRCcmFuZHM6TS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbmNlSGFuZGxlU2hhcGUpKS5yZXR1cm5zKFxuQnJhbmRLZXl3b3JkUmVjb3JkU2hhcGUpLFxuXG5nZXRJc3N1ZXJzOk0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkucmV0dXJucyhcbklzc3VlcktleXdvcmRSZWNvcmRTaGFwZSksXG5cbmdldFB1YmxpY0ZhY2V0Ok0uY2FsbFdoZW4oTS5hd2FpdChJbnN0YW5jZUhhbmRsZVNoYXBlKSkucmV0dXJucyhcbk0ucmVtb3RhYmxlKCdQdWJsaWNGYWNldCcpKSxcblxuZ2V0VGVybXM6TS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbmNlSGFuZGxlU2hhcGUpKS5yZXR1cm5zKE0uYW55KCkpLFxuZ2V0SW5zdGFsbGF0aW9uRm9ySW5zdGFuY2U6TS5jYWxsV2hlbihNLmF3YWl0KEluc3RhbmNlSGFuZGxlU2hhcGUpKS5yZXR1cm5zKFxuTS5lcmVmKE0ucmVtb3RhYmxlKCdJbnN0YWxsYXRpb24nKSkpLFxuXG5nZXRCdW5kbGVJREZyb21JbnN0YWxsYXRpb246TS5jYWxsKEluc3RhbGxhdGlvblNoYXBlKS5yZXR1cm5zKFxuTS5lcmVmKE0uc3RyaW5nKCkpKSxcblxuXG5nZXRJbnN0YWxsYXRpb246TS5jYWxsKE0uZXJlZihJbnZpdGF0aW9uU2hhcGUpKS5yZXR1cm5zKE0ucHJvbWlzZSgpKSxcbmdldEluc3RhbmNlOk0uY2FsbChNLmVyZWYoSW52aXRhdGlvblNoYXBlKSkucmV0dXJucyhNLnByb21pc2UoKSksXG5nZXRDb25maWd1cmF0aW9uOk0uY2FsbCgpLnJldHVybnMoe1xuZmVlSXNzdWVyQ29uZmlnOntcbm5hbWU6TS5zdHJpbmcoKSxcbmFzc2V0S2luZDonbmF0JyxcbmRpc3BsYXlJbmZvOkRpc3BsYXlJbmZvU2hhcGV9fSksXG5cblxuZ2V0SW52aXRhdGlvbkRldGFpbHM6TS5jYWxsKE0uZXJlZihJbnZpdGF0aW9uU2hhcGUpKS5yZXR1cm5zKE0uYW55KCkpLFxuZ2V0UHJvcG9zYWxTaGFwZUZvckludml0YXRpb246TS5jYWxsKEludml0YXRpb25IYW5kbGVTaGFwZSkucmV0dXJucyhcbk0ub3B0KFByb3Bvc2FsU2hhcGUpKX0pOyRo4oCNX29uY2UuWm9lU2VydmljZUkoWm9lU2VydmljZUkpO1xuXG5cblxuY29uc3QgICAgICAgIEFkbWluRmFjZXRJPU0uaW50ZXJmYWNlKCdaY2ZBZG1pbkZhY2V0Jyx7XG5nZXRWYXRTaHV0ZG93blByb21pc2U6TS5jYWxsKCkucmV0dXJucyhNLnByb21pc2UoKSksXG5yZXN0YXJ0Q29udHJhY3Q6TS5jYWxsKCkub3B0aW9uYWwoTS5hbnkoKSkucmV0dXJucyhNLnByb21pc2UoKSksXG51cGdyYWRlQ29udHJhY3Q6TS5jYWxsKE0uc3RyaW5nKCkpLm9wdGlvbmFsKE0uYW55KCkpLnJldHVybnMoTS5wcm9taXNlKCkpfSk7JGjigI1fb25jZS5BZG1pbkZhY2V0SShBZG1pbkZhY2V0SSk7XG5cblxuY29uc3QgICAgICAgIFNlYXREYXRhU2hhcGU9TS5zcGxpdFJlY29yZChcbntcbnByb3Bvc2FsOlByb3Bvc2FsU2hhcGUsXG5pbml0aWFsQWxsb2NhdGlvbjpBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUsXG5zZWF0SGFuZGxlOlNlYXRTaGFwZX0sXG5cbntcbm9mZmVyQXJnczpNLmFueSgpfSk7JGjigI1fb25jZS5TZWF0RGF0YVNoYXBlKFNlYXREYXRhU2hhcGUpO1xuXG5cblxuY29uc3QgICAgICAgIEhhbmRsZU9mZmVyST1NLmludGVyZmFjZSgnSGFuZGxlT2ZmZXInLHtcbmhhbmRsZU9mZmVyOk0uY2FsbChJbnZpdGF0aW9uSGFuZGxlU2hhcGUsU2VhdERhdGFTaGFwZSkucmV0dXJucyh7XG5vZmZlclJlc3VsdFByb21pc2U6TS5wcm9taXNlKCksXG5leGl0T2JqOkV4aXRPYmplY3RTaGFwZX0pfSk7JGjigI1fb25jZS5IYW5kbGVPZmZlckkoSGFuZGxlT2ZmZXJJKTtcblxuXG5cbmNvbnN0ICAgICAgICBQcmljZVF1b3RlU2hhcGU9aGFyZGVuKHtcbnF1b3RlQW1vdW50OkFtb3VudFNoYXBlLFxucXVvdGVQYXltZW50Ok0uZXJlZihQYXltZW50U2hhcGUpfSk7JGjigI1fb25jZS5QcmljZVF1b3RlU2hhcGUoUHJpY2VRdW90ZVNoYXBlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJLZXl3b3JkU2hhcGUiOlsiS2V5d29yZFNoYXBlIl0sIkludml0YXRpb25IYW5kbGVTaGFwZSI6WyJJbnZpdGF0aW9uSGFuZGxlU2hhcGUiXSwiSW52aXRhdGlvblNoYXBlIjpbIkludml0YXRpb25TaGFwZSJdLCJJbnN0YW5jZUhhbmRsZVNoYXBlIjpbIkluc3RhbmNlSGFuZGxlU2hhcGUiXSwiSW5zdGFsbGF0aW9uU2hhcGUiOlsiSW5zdGFsbGF0aW9uU2hhcGUiXSwiU2VhdFNoYXBlIjpbIlNlYXRTaGFwZSJdLCJBbW91bnRLZXl3b3JkUmVjb3JkU2hhcGUiOlsiQW1vdW50S2V5d29yZFJlY29yZFNoYXBlIl0sIkFtb3VudFBhdHRlcm5LZXl3b3JkUmVjb3JkU2hhcGUiOlsiQW1vdW50UGF0dGVybktleXdvcmRSZWNvcmRTaGFwZSJdLCJQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSI6WyJQYXltZW50UEtleXdvcmRSZWNvcmRTaGFwZSJdLCJJc3N1ZXJLZXl3b3JkUmVjb3JkU2hhcGUiOlsiSXNzdWVyS2V5d29yZFJlY29yZFNoYXBlIl0sIklzc3VlclBLZXl3b3JkUmVjb3JkU2hhcGUiOlsiSXNzdWVyUEtleXdvcmRSZWNvcmRTaGFwZSJdLCJCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSI6WyJCcmFuZEtleXdvcmRSZWNvcmRTaGFwZSJdLCJJc3N1ZXJSZWNvcmRTaGFwZSI6WyJJc3N1ZXJSZWNvcmRTaGFwZSJdLCJUZXJtc1NoYXBlIjpbIlRlcm1zU2hhcGUiXSwiSW5zdGFuY2VSZWNvcmRTaGFwZSI6WyJJbnN0YW5jZVJlY29yZFNoYXBlIl0sIkhhbmRsZUkiOlsiSGFuZGxlSSJdLCJtYWtlSGFuZGxlU2hhcGUiOlsibWFrZUhhbmRsZVNoYXBlIl0sIlRpbWVyU2hhcGUiOlsiVGltZXJTaGFwZSJdLCJGdWxsUHJvcG9zYWxTaGFwZSI6WyJGdWxsUHJvcG9zYWxTaGFwZSJdLCJQcm9wb3NhbFNoYXBlIjpbIlByb3Bvc2FsU2hhcGUiXSwiaXNPbkRlbWFuZEV4aXRSdWxlIjpbImlzT25EZW1hbmRFeGl0UnVsZSJdLCJpc1dhaXZlZEV4aXRSdWxlIjpbImlzV2FpdmVkRXhpdFJ1bGUiXSwiaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGUiOlsiaXNBZnRlckRlYWRsaW5lRXhpdFJ1bGUiXSwiSW52aXRhdGlvbkVsZW1lbnRTaGFwZSI6WyJJbnZpdGF0aW9uRWxlbWVudFNoYXBlIl0sIk9mZmVySGFuZGxlckkiOlsiT2ZmZXJIYW5kbGVySSJdLCJTZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZSI6WyJTZWF0SGFuZGxlQWxsb2NhdGlvbnNTaGFwZSJdLCJab2VNaW50U2hhcGUiOlsiWm9lTWludFNoYXBlIl0sIlpvZU1pbnRJIjpbIlpvZU1pbnRJIl0sIlpjZk1pbnRJIjpbIlpjZk1pbnRJIl0sIkV4aXRPYmplY3RJIjpbIkV4aXRPYmplY3RJIl0sIkV4aXRPYmplY3RTaGFwZSI6WyJFeGl0T2JqZWN0U2hhcGUiXSwiSW5zdGFuY2VBZG1pblNoYXBlIjpbIkluc3RhbmNlQWRtaW5TaGFwZSJdLCJJbnN0YW5jZUFkbWluSSI6WyJJbnN0YW5jZUFkbWluSSJdLCJJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCI6WyJJbnN0YW5jZVN0b3JhZ2VNYW5hZ2VySUtpdCJdLCJCdW5kbGVDYXBTaGFwZSI6WyJCdW5kbGVDYXBTaGFwZSJdLCJCdW5kbGVTaGFwZSI6WyJCdW5kbGVTaGFwZSJdLCJVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZSI6WyJVbndyYXBwZWRJbnN0YWxsYXRpb25TaGFwZSJdLCJab2VTdG9yYWdlTWFuYWdlcklLaXQiOlsiWm9lU3RvcmFnZU1hbmFnZXJJS2l0Il0sIlpvZVNlcnZpY2VJIjpbIlpvZVNlcnZpY2VJIl0sIkFkbWluRmFjZXRJIjpbIkFkbWluRmFjZXRJIl0sIlNlYXREYXRhU2hhcGUiOlsiU2VhdERhdGFTaGFwZSJdLCJIYW5kbGVPZmZlckkiOlsiSGFuZGxlT2ZmZXJJIl0sIlByaWNlUXVvdGVTaGFwZSI6WyJQcmljZVF1b3RlU2hhcGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAfqSfx2sHAABrBwAAIAAAAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL3R5cGVzLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyovIDxyZWZlcmVuY2UgdHlwZXM9XCJzZXNcIi8+Ki9cblxuLyoqXG4gKiBAdGVtcGxhdGUge3N0cmluZ30gSCAtIHRoZSBuYW1lIG9mIHRoZSBoYW5kbGVcbiAqIEB0eXBlZGVmIHtIICYgWGltcG9ydChcIkBlbmRvL21hcnNoYWxcIikuUmVtb3RhYmxlfSBIYW5kbGUgQSB0eXBlIGNvbnN0cnVjdG9yIGZvciBhbiBvcGFxdWUgdHlwZVxuICogaWRlbnRpZmllZCBieSB0aGUgSCBzdHJpbmcuIFRoaXMgdXNlcyBhbiBpbnRlcnNlY3Rpb24gdHlwZVxuICogKCdNeUhhbmRsZScgJiB7fSkgdG8gdGFnIHRoZSBoYW5kbGUncyB0eXBlIGV2ZW4gdGhvdWdoIHRoZSBhY3R1YWxcbiAqIHZhbHVlIGlzIGp1c3QgYW4gZW1wdHkgb2JqZWN0LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3N0cmluZ30gS2V5d29yZFxuICogQHR5cGVkZWYge0hhbmRsZTwnSW52aXRhdGlvbic+fSBJbnZpdGF0aW9uSGFuZGxlIC0gYW4gb3BhcXVlIGhhbmRsZSBmb3IgYW4gaW52aXRhdGlvblxuICogQHR5cGVkZWYge1JlY29yZDxLZXl3b3JkLCBJc3N1ZXI8YW55Pj59IElzc3VlcktleXdvcmRSZWNvcmRcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8S2V5d29yZCwgRVJlZjxJc3N1ZXI8YW55Pj4+fSBJc3N1ZXJQS2V5d29yZFJlY29yZFxuICogQHR5cGVkZWYge1JlY29yZDxLZXl3b3JkLCBCcmFuZDxhbnk+Pn0gQnJhbmRLZXl3b3JkUmVjb3JkXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBTdGFuZGFyZFRlcm1zXG4gKiBAcHJvcGVydHkge0lzc3VlcktleXdvcmRSZWNvcmR9IGlzc3VlcnMgLSByZWNvcmQgd2l0aFxuICoga2V5d29yZHMga2V5cywgaXNzdWVyIHZhbHVlc1xuICogQHByb3BlcnR5IHtCcmFuZEtleXdvcmRSZWNvcmR9IGJyYW5kcyAtIHJlY29yZCB3aXRoIGtleXdvcmRzXG4gKiBrZXlzLCBicmFuZCB2YWx1ZXNcbiAqXG4gKiBAdHlwZWRlZiB7U3RhbmRhcmRUZXJtcyAmIFJlY29yZDxzdHJpbmcsIGFueT59IEFueVRlcm1zXG4gKlxuICogQHR5cGVkZWYge29iamVjdH0gSW5zdGFuY2VSZWNvcmRcbiAqIEBwcm9wZXJ0eSB7SW5zdGFsbGF0aW9ufSBpbnN0YWxsYXRpb25cbiAqIEBwcm9wZXJ0eSB7WGltcG9ydChcIi4vem9lU2VydmljZS91dGlscy5qc1wiKS5JbnN0YW5jZTxhbnk+fSBpbnN0YW5jZVxuICogQHByb3BlcnR5IHtBbnlUZXJtc30gdGVybXMgLSBjb250cmFjdCBwYXJhbWV0ZXJzXG4gKi9cblxuLyoqXG4gKiBAdGVtcGxhdGUge0Fzc2V0S2luZH0gW0s9QXNzZXRLaW5kXVxuICogQHR5cGVkZWYge29iamVjdH0gSXNzdWVyUmVjb3JkXG4gKiBAcHJvcGVydHkge0JyYW5kPEs+fSBicmFuZFxuICogQHByb3BlcnR5IHtJc3N1ZXI8Sz59IGlzc3VlclxuICogQHByb3BlcnR5IHtLfSBhc3NldEtpbmRcbiAqIEBwcm9wZXJ0eSB7RGlzcGxheUluZm88Sz59IFtkaXNwbGF5SW5mb11cbiAqXG4gKiBAdHlwZWRlZiB7QW1vdW50S2V5d29yZFJlY29yZH0gQWxsb2NhdGlvblxuICovXG5cbi8qKlxuICogQHRlbXBsYXRlIHtvYmplY3R9IFtSPXVua25vd25dIE9mZmVyIHJlc3VsdFxuICogQHRlbXBsYXRlIHtvYmplY3R9IFtBPW5ldmVyXSBPZmZlciBhcmdzXG4gKiBAdHlwZWRlZiB7UGF5bWVudDwnc2V0Jz59IEludml0YXRpb25cbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACkLACEuiwAALosAAArAAAAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvem9lU2VydmljZS90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gWm9lU2VydmljZVxuICpcbiAqIFpvZSBwcm92aWRlcyBhIGZyYW1ld29yayBmb3IgZGVwbG95aW5nIGFuZCB3b3JraW5nIHdpdGggc21hcnRcbiAqIGNvbnRyYWN0cy4gSXQgaXMgYWNjZXNzZWQgYXMgYSBsb25nLWxpdmVkIGFuZCB3ZWxsLXRydXN0ZWQgc2VydmljZVxuICogdGhhdCBlbmZvcmNlcyBvZmZlciBzYWZldHkgZm9yIHRoZSBjb250cmFjdHMgdGhhdCB1c2UgaXQuIFpvZSBoYXMgYVxuICogc2luZ2xlIGBpbnZpdGF0aW9uSXNzdWVyYCBmb3IgdGhlIGVudGlyZXR5IG9mIGl0cyBsaWZldGltZS4gQnlcbiAqIGhhdmluZyBhIHJlZmVyZW5jZSB0byBab2UsIGEgdXNlciBjYW4gZ2V0IHRoZSBgaW52aXRhdGlvbklzc3VlcmBcbiAqIGFuZCB0aHVzIHZhbGlkYXRlIGFueSBgaW52aXRhdGlvbmAgdGhleSByZWNlaXZlIGZyb20gc29tZW9uZSBlbHNlLlxuICpcbiAqIFpvZSBoYXMgdHdvIGRpZmZlcmVudCBmYWNldHM6IHRoZSBwdWJsaWMgWm9lIHNlcnZpY2UgYW5kIHRoZVxuICogY29udHJhY3QgZmFjZXQgKFpDRikuIEVhY2ggY29udHJhY3QgaW5zdGFuY2UgaGFzIGEgY29weSBvZiBaQ0ZcbiAqIHdpdGhpbiBpdHMgdmF0LiBUaGUgY29udHJhY3QgYW5kIFpDRiBuZXZlciBoYXZlIGRpcmVjdCBhY2Nlc3MgdG9cbiAqIHRoZSB1c2VycycgcGF5bWVudHMgb3IgdGhlIFpvZSBwdXJzZXMuXG4gKlxuICogQHByb3BlcnR5IHtHZXRJbnZpdGF0aW9uSXNzdWVyfSBnZXRJbnZpdGF0aW9uSXNzdWVyXG4gKlxuICogWm9lIGhhcyBhIHNpbmdsZSBgaW52aXRhdGlvbklzc3VlcmAgZm9yIHRoZSBlbnRpcmV0eSBvZiBpdHNcbiAqIGxpZmV0aW1lLiBCeSBoYXZpbmcgYSByZWZlcmVuY2UgdG8gWm9lLCBhIHVzZXIgY2FuIGdldCB0aGVcbiAqIGBpbnZpdGF0aW9uSXNzdWVyYCBhbmQgdGh1cyB2YWxpZGF0ZSBhbnkgYGludml0YXRpb25gIHRoZXkgcmVjZWl2ZVxuICogZnJvbSBzb21lb25lIGVsc2UuIFRoZSBtaW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgaW52aXRhdGlvbklzc3VlclxuICogY3JlYXRlcyB0aGUgRVJUUCBwYXltZW50cyB0aGF0IHJlcHJlc2VudCB0aGUgcmlnaHQgdG8gaW50ZXJhY3Qgd2l0aFxuICogYSBzbWFydCBjb250cmFjdCBpbiBwYXJ0aWN1bGFyIHdheXMuXG4gKlxuICogQHByb3BlcnR5IHtJbnN0YWxsQnVuZGxlfSBpbnN0YWxsXG4gKiBAcHJvcGVydHkge0luc3RhbGxCdW5kbGVJRH0gaW5zdGFsbEJ1bmRsZUlEXG4gKiBAcHJvcGVydHkge1hpbXBvcnQoJy4vdXRpbHMnKS5TdGFydEluc3RhbmNlfSBzdGFydEluc3RhbmNlXG4gKiBAcHJvcGVydHkge09mZmVyfSBvZmZlclxuICogQHByb3BlcnR5IHtYaW1wb3J0KCcuL3V0aWxzJykuR2V0UHVibGljRmFjZXR9IGdldFB1YmxpY0ZhY2V0XG4gKiBAcHJvcGVydHkge0dldElzc3VlcnN9IGdldElzc3VlcnNcbiAqIEBwcm9wZXJ0eSB7R2V0QnJhbmRzfSBnZXRCcmFuZHNcbiAqIEBwcm9wZXJ0eSB7WGltcG9ydCgnLi91dGlscycpLkdldFRlcm1zfSBnZXRUZXJtc1xuICogQHByb3BlcnR5IHtHZXRPZmZlckZpbHRlcn0gZ2V0T2ZmZXJGaWx0ZXJcbiAqIEBwcm9wZXJ0eSB7R2V0SW5zdGFsbGF0aW9uRm9ySW5zdGFuY2V9IGdldEluc3RhbGxhdGlvbkZvckluc3RhbmNlXG4gKiBAcHJvcGVydHkge0dldEluc3RhbmNlfSBnZXRJbnN0YW5jZVxuICogQHByb3BlcnR5IHtHZXRJbnN0YWxsYXRpb259IGdldEluc3RhbGxhdGlvblxuICogQHByb3BlcnR5IHtHZXRJbnZpdGF0aW9uRGV0YWlsc30gZ2V0SW52aXRhdGlvbkRldGFpbHNcbiAqIFJldHVybiBhbiBvYmplY3Qgd2l0aCB0aGUgaW5zdGFuY2UsIGluc3RhbGxhdGlvbiwgZGVzY3JpcHRpb24sIGludml0YXRpb25cbiAqIGhhbmRsZSwgYW5kIGFueSBjdXN0b20gcHJvcGVydGllcyBzcGVjaWZpYyB0byB0aGUgY29udHJhY3QuXG4gKiBAcHJvcGVydHkge0dldEZlZUlzc3Vlcn0gZ2V0RmVlSXNzdWVyXG4gKiBAcHJvcGVydHkge0dldENvbmZpZ3VyYXRpb259IGdldENvbmZpZ3VyYXRpb25cbiAqIEBwcm9wZXJ0eSB7R2V0QnVuZGxlSURGcm9tSW5zdGFsbGF0aW9ufSBnZXRCdW5kbGVJREZyb21JbnN0YWxsYXRpb25cbiAqIEBwcm9wZXJ0eSB7KGludml0YXRpb25IYW5kbGU6IEludml0YXRpb25IYW5kbGUpID0+IFBhdHRlcm4gfCB1bmRlZmluZWR9IGdldFByb3Bvc2FsU2hhcGVGb3JJbnZpdGF0aW9uXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0SW52aXRhdGlvbklzc3VlclxuICogQHJldHVybnMge1Byb21pc2U8SXNzdWVyPCdzZXQnPj59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0RmVlSXNzdWVyXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJc3N1ZXI8J25hdCc+Pn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRDb25maWd1cmF0aW9uXG4gKiBAcmV0dXJucyB7e1xuICogICBmZWVJc3N1ZXJDb25maWc6IEZlZUlzc3VlckNvbmZpZyxcbiAqIH19XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0SXNzdWVyc1xuICogQHBhcmFtIHtYaW1wb3J0KCcuL3V0aWxzJykuSW5zdGFuY2U8YW55Pn0gaW5zdGFuY2VcbiAqIEByZXR1cm5zIHtQcm9taXNlPElzc3VlcktleXdvcmRSZWNvcmQ+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldEJyYW5kc1xuICogQHBhcmFtIHtYaW1wb3J0KCcuL3V0aWxzJykuSW5zdGFuY2U8YW55Pn0gaW5zdGFuY2VcbiAqIEByZXR1cm5zIHtQcm9taXNlPEJyYW5kS2V5d29yZFJlY29yZD59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0T2ZmZXJGaWx0ZXJcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi91dGlscycpLkluc3RhbmNlPGFueT59IGluc3RhbmNlXG4gKiBAcmV0dXJucyB7c3RyaW5nW119XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgU2V0T2ZmZXJGaWx0ZXJcbiAqIEBwYXJhbSB7SW5zdGFuY2V9IGluc3RhbmNlXG4gKiBAcGFyYW0ge3N0cmluZ1tdfSBzdHJpbmdzXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0SW5zdGFsbGF0aW9uRm9ySW5zdGFuY2VcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi91dGlscycpLkluc3RhbmNlPGFueT59IGluc3RhbmNlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJbnN0YWxsYXRpb24+fVxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEdldEluc3RhbmNlXG4gKiBAcGFyYW0ge0VSZWY8SW52aXRhdGlvbj59IGludml0YXRpb25cbiAqIEByZXR1cm5zIHtQcm9taXNlPFhpbXBvcnQoJy4vdXRpbHMnKS5JbnN0YW5jZTxhbnk+Pn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRJbnN0YWxsYXRpb25cbiAqIEBwYXJhbSB7RVJlZjxJbnZpdGF0aW9uPn0gaW52aXRhdGlvblxuICogQHJldHVybnMge1Byb21pc2U8SW5zdGFsbGF0aW9uPn1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBHZXRJbnZpdGF0aW9uRGV0YWlsc1xuICogQHBhcmFtIHtFUmVmPEludml0YXRpb24+fSBpbnZpdGF0aW9uXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJbnZpdGF0aW9uRGV0YWlscz59XG4gKi9cblxuLyogVE9ETyByZW1vdmUgc3VwcG9ydCBmb3Igc291cmNlIGJ1bmRsZXMsIGxlYXZpbmcgb25seSBzdXBwb3J0IGZvciBoYXNoIGJ1bmRsZXMuKi9cbi8qIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDU2NSovXG4vKipcbiAqIEBjYWxsYmFjayBJbnN0YWxsQnVuZGxlXG4gKlxuICogQ3JlYXRlIGFuIGluc3RhbGxhdGlvbiBieSBzYWZlbHkgZXZhbHVhdGluZyB0aGUgY29kZSBhbmRcbiAqIHJlZ2lzdGVyaW5nIGl0IHdpdGggWm9lLiBSZXR1cm5zIGFuIGluc3RhbGxhdGlvbi5cbiAqXG4gKiBAcGFyYW0ge0J1bmRsZSB8IFNvdXJjZUJ1bmRsZX0gYnVuZGxlXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxJbnN0YWxsYXRpb24+fVxuICovXG5cbi8qIFRPRE8gY29uc29saWRhdGUgaW5zdGFsbEJ1bmRsZUlEIGludG8gaW5zdGFsbC4qL1xuLyogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy80OTc0Ki9cbi8qKlxuICogQGNhbGxiYWNrIEluc3RhbGxCdW5kbGVJRFxuICpcbiAqIENyZWF0ZSBhbiBpbnN0YWxsYXRpb24gZnJvbSBhIEJ1bmRsZSBJRC4gUmV0dXJucyBhbiBpbnN0YWxsYXRpb24uXG4gKlxuICogQHBhcmFtIHtCdW5kbGVJRH0gYnVuZGxlSURcbiAqIEByZXR1cm5zIHtQcm9taXNlPEluc3RhbGxhdGlvbj59XG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgR2V0QnVuZGxlSURGcm9tSW5zdGFsbGF0aW9uXG4gKlxuICogVmVyaWZ5IHRoYXQgYW4gYWxsZWdlZCBJbnN0YWxsYXRpb24gaXMgcmVhbCwgYW5kIHJldHVybiB0aGUgQnVuZGxlIElEIGl0XG4gKiB3aWxsIHVzZSBmb3IgY29udHJhY3QgY29kZS5cbiAqXG4gKiBAcGFyYW0ge0VSZWY8SW5zdGFsbGF0aW9uPn0gYWxsZWdlZEluc3RhbGxhdGlvblxuICogQHJldHVybnMge1Byb21pc2U8QnVuZGxlSUQ+fVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgezxBcmdzLCBSZXN1bHQ+KFxuICogICBpbnZpdGF0aW9uOiBFUmVmPEludml0YXRpb248UmVzdWx0LCBBcmdzPj4sXG4gKiAgIHByb3Bvc2FsPzogUHJvcG9zYWwsXG4gKiAgIHBheW1lbnRLZXl3b3JkUmVjb3JkPzogUGF5bWVudFBLZXl3b3JkUmVjb3JkLFxuICogICBvZmZlckFyZ3M/OiBBcmdzLFxuICogICApID0+IFByb21pc2U8VXNlclNlYXQ8UmVzdWx0Pj5cbiAqIH0gT2ZmZXJcbiAqXG4gKiBUbyByZWRlZW0gYW4gaW52aXRhdGlvbiwgdGhlIHVzZXIgbm9ybWFsbHkgcHJvdmlkZXMgYSBwcm9wb3NhbCAodGhlaXJcbiAqIHJ1bGVzIGZvciB0aGUgb2ZmZXIpIGFzIHdlbGwgYXMgcGF5bWVudHMgdG8gYmUgZXNjcm93ZWQgYnkgWm9lLiAgSWZcbiAqIGVpdGhlciB0aGUgcHJvcG9zYWwgb3IgcGF5bWVudHMgd291bGQgYmUgZW1wdHksIGluZGljYXRlIHRoaXMgYnlcbiAqIG9taXR0aW5nIHRoYXQgYXJndW1lbnQgb3IgcGFzc2luZyB1bmRlZmluZWQsIHJhdGhlciB0aGFuIHBhc3NpbmcgYW5cbiAqIGVtcHR5IHJlY29yZC5cbiAqXG4gKiBUaGUgcHJvcG9zYWwgaGFzIHRocmVlIHBhcnRzOiBgd2FudGAgYW5kIGBnaXZlYCBhcmUgdXNlZCBieSBab2UgdG9cbiAqIGVuZm9yY2Ugb2ZmZXIgc2FmZXR5LCBhbmQgYGV4aXRgIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgcGFydGljdWxhclxuICogcGF5b3V0LWxpdmVuZXNzIHBvbGljeSB0aGF0IFpvZSBjYW4gZ3VhcmFudGVlLiBgd2FudGAgYW5kIGBnaXZlYFxuICogYXJlIG9iamVjdHMgd2l0aCBrZXl3b3JkcyBhcyBrZXlzIGFuZCBhbW91bnRzIGFzIHZhbHVlcy5cbiAqIGBwYXltZW50S2V5d29yZFJlY29yZGAgaXMgYSByZWNvcmQgd2l0aCBrZXl3b3JkcyBhcyBrZXlzLCBhbmQgdGhlXG4gKiB2YWx1ZXMgYXJlIHRoZSBhY3R1YWwgcGF5bWVudHMgdG8gYmUgZXNjcm93ZWQuIEEgcGF5bWVudCBpc1xuICogZXhwZWN0ZWQgZm9yIGV2ZXJ5IHJ1bGUgdW5kZXIgYGdpdmVgLlxuICovXG5cbi8qKlxuICogWm9lIHVzZXMgc2VhdHMgdG8gYWNjZXNzIG9yIG1hbmlwdWxhdGUgb2ZmZXJzLiBUaGV5IGxldCBjb250cmFjdHMgYW5kIHVzZXJzXG4gKiBpbnRlcmFjdCB3aXRoIHRoZW0uIFpvZSBoYXMgdHdvIGtpbmRzIG9mIHNlYXRzLiBaQ0ZTZWF0cyBhcmUgdXNlZCB3aXRoaW5cbiAqIGNvbnRyYWN0cyBhbmQgd2l0aCB6Y2YgbWV0aG9kcy4gVXNlclNlYXRzIHJlcHJlc2VudCBvZmZlcnMgZXh0ZXJuYWwgdG8gWm9lXG4gKiBhbmQgdGhlIGNvbnRyYWN0LiBUaGUgcGFydHkgd2hvIGV4ZXJjaXNlcyBhbiBpbnZpdGF0aW9uIGFuZCBzZW5kcyB0aGUgb2ZmZXIoKVxuICogbWVzc2FnZSB0byBab2UgZ2V0cyBhIFVzZXJTZWF0IHRoYXQgY2FuIGNoZWNrIHBheW91dHMnIHN0YXR1cyBvciByZXRyaWV2ZSB0aGVcbiAqIHJlc3VsdCBvZiBwcm9jZXNzaW5nIHRoZSBvZmZlciBpbiB0aGUgY29udHJhY3QuIFRoaXMgdmFyaWVzLCBidXQgZXhhbXBsZXMgYXJlXG4gKiBhIHN0cmluZyBhbmQgYW4gaW52aXRhdGlvbiBmb3IgYW5vdGhlciBzZWF0LlxuICpcbiAqIEFsc28sIGEgVXNlclNlYXQgY2FuIGJlIGhhbmRlZCB0byBhbiBhZ2VudCBvdXRzaWRlIFpvZSBhbmQgdGhlIGNvbnRyYWN0LFxuICogbGV0dGluZyB0aGVtIHF1ZXJ5IG9yIG1vbml0b3IgdGhlIGN1cnJlbnQgc3RhdGUsIGFjY2VzcyB0aGUgcGF5b3V0cyBhbmRcbiAqIHJlc3VsdCwgYW5kLCBpZiBpdCdzIGFsbG93ZWQgZm9yIHRoaXMgc2VhdCwgY2FsbCB0cnlFeGl0KCkuXG4gKlxuICogU2luY2UgYW55b25lIGNhbiBhdHRlbXB0IHRvIGV4aXQgdGhlIHNlYXQgaWYgdGhleSBoYXZlIGEgcmVmZXJlbmNlIHRvIGl0LCB5b3VcbiAqIHNob3VsZCBvbmx5IHNoYXJlIGEgVXNlclNlYXQgd2l0aCB0cnVzdGVkIHBhcnRpZXMuXG4gKlxuICogVXNlclNlYXQgaW5jbHVkZXMgcXVlcmllcyBmb3IgdGhlIGFzc29jaWF0ZWQgb2ZmZXIncyBjdXJyZW50IHN0YXRlIGFuZCBhblxuICogb3BlcmF0aW9uIHRvIHJlcXVlc3QgdGhhdCB0aGUgb2ZmZXIgZXhpdCwgYXMgZm9sbG93czpcbiAqXG4gKiBAc2VlIHtAbGluayBodHRwczovL2RvY3MuYWdvcmljLmNvbS96b2UvYXBpL3pvZS5odG1sI3VzZXJzZWF0LW9iamVjdH19XG4gKiBAdGVtcGxhdGUge29iamVjdH0gW09SPXVua25vd25dXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBVc2VyU2VhdFxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPFByb3Bvc2FsUmVjb3JkPn0gZ2V0UHJvcG9zYWxcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxQYXltZW50UEtleXdvcmRSZWNvcmQ+fSBnZXRQYXlvdXRzXG4gKiByZXR1cm5zIGEgcHJvbWlzZSBmb3IgYSBLZXl3b3JkUGF5bWVudFJlY29yZCBjb250YWluaW5nIGFsbCB0aGUgcGF5b3V0cyBmcm9tXG4gKiB0aGlzIHNlYXQuIFRoZSBwcm9taXNlIHdpbGwgcmVzb2x2ZSBhZnRlciB0aGUgc2VhdCBoYXMgZXhpdGVkLlxuICogQHByb3BlcnR5IHsoa2V5d29yZDogS2V5d29yZCkgPT4gUHJvbWlzZTxQYXltZW50PGFueT4+fSBnZXRQYXlvdXRcbiAqIHJldHVybnMgYSBwcm9taXNlIGZvciB0aGUgUGF5bWVudCBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbmRpY2F0ZWQga2V5d29yZC5cbiAqIFRoZSBwcm9taXNlIHdpbGwgcmVzb2x2ZSBhZnRlciB0aGUgc2VhdCBoYXMgZXhpdGVkLlxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPE9SPn0gZ2V0T2ZmZXJSZXN1bHRcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gdm9pZH0gW3RyeUV4aXRdXG4gKiBOb3RlOiBPbmx5IHdvcmtzIGlmIHRoZSBzZWF0J3MgYHByb3Bvc2FsYCBoYXMgYW4gYE9uRGVtYW5kYCBgZXhpdGAgY2xhdXNlLiBab2Unc1xuICogb2ZmZXItc2FmZXR5IGd1YXJhbnRlZSBhcHBsaWVzIG5vIG1hdHRlciBob3cgYSBzZWF0J3MgaW50ZXJhY3Rpb24gd2l0aCBhXG4gKiBjb250cmFjdCBlbmRzLiBVbmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcywgdGhlIHBhcnRpY2lwYW50IG1pZ2h0IGJlIGFibGUgdG9cbiAqIGNhbGwgYHRyeUV4aXQoKWAsIG9yIHRoZSBjb250cmFjdCBtaWdodCBkbyBzb21ldGhpbmcgZXhwbGljaXRseS4gT24gZXhpdGluZyxcbiAqIHRoZSBzZWF0IGhvbGRlciBnZXRzIGl0cyBjdXJyZW50IGBhbGxvY2F0aW9uYCBhbmQgdGhlIGBzZWF0YCBjYW4gbm8gbG9uZ2VyXG4gKiBpbnRlcmFjdCB3aXRoIHRoZSBjb250cmFjdC5cbiAqIEBwcm9wZXJ0eSB7KCkgPT4gUHJvbWlzZTxib29sZWFuPn0gaGFzRXhpdGVkXG4gKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlYXQgaGFzIGV4aXRlZCwgZmFsc2UgaWYgaXQgaXMgc3RpbGwgYWN0aXZlLlxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPDB8MT59IG51bVdhbnRzU2F0aXNmaWVkIHJldHVybnMgMSBpZiB0aGUgcHJvcG9zYWwnc1xuICogd2FudCBjbGF1c2Ugd2FzIHNhdGlzZmllZCBieSB0aGUgZmluYWwgYWxsb2NhdGlvbiwgb3RoZXJ3aXNlIDAuIFRoaXMgaXNcbiAqIG51bWVyaWMgdG8gc3VwcG9ydCBhIHBsYW5uZWQgZW5oYW5jZW1lbnQgY2FsbGVkIFwibXVsdGlwbGVzXCIgd2hpY2ggd2lsbCBhbGxvd1xuICogdGhlIHJldHVybiB2YWx1ZSB0byBiZSBhbnkgbm9uLW5lZ2F0aXZlIG51bWJlci4gVGhlIHByb21pc2Ugd2lsbCByZXNvbHZlXG4gKiBhZnRlciB0aGUgc2VhdCBoYXMgZXhpdGVkLlxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPEFsbG9jYXRpb24+fSBnZXRGaW5hbEFsbG9jYXRpb25cbiAqIHJldHVybiBhIHByb21pc2UgZm9yIHRoZSBmaW5hbCBhbGxvY2F0aW9uLiBUaGUgcHJvbWlzZSB3aWxsIHJlc29sdmUgYWZ0ZXIgdGhlXG4gKiBzZWF0IGhhcyBleGl0ZWQuXG4gKiBAcHJvcGVydHkgeygpID0+IFN1YnNjcmliZXI8YW55Pn0gZ2V0RXhpdFN1YnNjcmliZXIgcmV0dXJucyBhIHN1YnNjcmliZXIgdGhhdFxuICogd2lsbCBiZSBub3RpZmllZCB3aGVuIHRoZSBzZWF0IGhhcyBleGl0ZWQgb3IgZmFpbGVkLlxuICovXG5cbi8qKlxuICpcbiAqIEB0eXBlZGVmIHtQYXJ0aWFsPFByb3Bvc2FsUmVjb3JkPn0gUHJvcG9zYWxcbiAqXG4gKiBAdHlwZWRlZiB7e2dpdmU6IEFtb3VudEtleXdvcmRSZWNvcmQsXG4gKiAgICAgICAgICAgIHdhbnQ6IEFtb3VudEtleXdvcmRSZWNvcmQsXG4gKiAgICAgICAgICAgIGV4aXQ6IEV4aXRSdWxlXG4gKiAgICAgICAgICAgfX0gUHJvcG9zYWxSZWNvcmRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtSZWNvcmQ8S2V5d29yZCwgQW1vdW50PGFueT4+fSBBbW91bnRLZXl3b3JkUmVjb3JkXG4gKlxuICogVGhlIGtleXMgYXJlIGtleXdvcmRzLCBhbmQgdGhlIHZhbHVlcyBhcmUgYW1vdW50cy4gRm9yIGV4YW1wbGU6XG4gKiB7IEFzc2V0OiBBbW91bnRNYXRoLm1ha2UoYXNzZXRCcmFuZCwgNW4pLCBQcmljZTpcbiAqIEFtb3VudE1hdGgubWFrZShwcmljZUJyYW5kLCA5bikgfVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gV2FrZXJcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gdm9pZH0gd2FrZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge1hpbXBvcnQoJ0BhZ29yaWMvdGltZS9zcmMvdHlwZXMnKS5UaW1lc3RhbXB9IERlYWRsaW5lXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBUaW1lclxuICogQHByb3BlcnR5IHsoZGVhZGxpbmU6IERlYWRsaW5lLCB3YWtlclA6IEVSZWY8V2FrZXI+KSA9PiB2b2lkfSBzZXRXYWtldXBcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE9uRGVtYW5kRXhpdFJ1bGVcbiAqIEBwcm9wZXJ0eSB7bnVsbH0gb25EZW1hbmRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFdhaXZlZEV4aXRSdWxlXG4gKiBAcHJvcGVydHkge251bGx9IHdhaXZlZFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gQWZ0ZXJEZWFkbGluZUV4aXRSdWxlXG4gKiBAcHJvcGVydHkge3t0aW1lcjpUaW1lciwgZGVhZGxpbmU6RGVhZGxpbmV9fSBhZnRlckRlYWRsaW5lXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7T25EZW1hbmRFeGl0UnVsZSB8IFdhaXZlZEV4aXRSdWxlIHwgQWZ0ZXJEZWFkbGluZUV4aXRSdWxlfSBFeGl0UnVsZVxuICpcbiAqIFRoZSBwb3NzaWJsZSBrZXlzIGFyZSAnd2FpdmVkJywgJ29uRGVtYW5kJywgYW5kICdhZnRlckRlYWRsaW5lJy5cbiAqIGB0aW1lcmAgYW5kIGBkZWFkbGluZWAgb25seSBhcmUgdXNlZCBmb3IgdGhlIGBhZnRlckRlYWRsaW5lYCBrZXkuXG4gKiBUaGUgcG9zc2libGUgcmVjb3JkcyBhcmU6XG4gKiBgeyB3YWl2ZWQ6IG51bGwgfWBcbiAqIGB7IG9uRGVtYW5kOiBudWxsIH1gXG4gKiBgeyBhZnRlckRlYWRsaW5lOiB7IHRpbWVyIDpUaW1lcjxEZWFkbGluZT4sIGRlYWRsaW5lIDpEZWFkbGluZSB9IH1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3V0aWxzJykuSW5zdGFuY2U8YW55Pn0gSW5zdGFuY2VcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtYaW1wb3J0KCdAYWdvcmljL3N3aW5nc2V0LXZhdCcpLlZhdEFkbWluU3ZjfSBWYXRBZG1pblN2Y1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge3tidW5kbGVDYXA6IFhpbXBvcnQoJ0BhZ29yaWMvc3dpbmdzZXQtdmF0JykuQnVuZGxlQ2FwIH0gfCB7bmFtZTogc3RyaW5nfSB8IHtpZDogQnVuZGxlSUR9fSBaQ0ZTcGVjXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZywgYW55Pn0gU291cmNlQnVuZGxlXG4gKiBPcGFxdWUgdHlwZSBmb3IgYSBKU09OYWJsZSBzb3VyY2UgYnVuZGxlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPEtleXdvcmQsRVJlZjxQYXltZW50PGFueT4+Pn0gUGF5bWVudFBLZXl3b3JkUmVjb3JkXG4gKiBAdHlwZWRlZiB7UmVjb3JkPEtleXdvcmQsUGF5bWVudDxhbnk+Pn0gUGF5bWVudEtleXdvcmRSZWNvcmRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEludml0YXRpb25EZXRhaWxzXG4gKiBAcHJvcGVydHkge0luc3RhbGxhdGlvbn0gaW5zdGFsbGF0aW9uXG4gKiBAcHJvcGVydHkge1hpbXBvcnQoJy4vdXRpbHMnKS5JbnN0YW5jZTxhbnk+fSBpbnN0YW5jZVxuICogQHByb3BlcnR5IHtJbnZpdGF0aW9uSGFuZGxlfSBoYW5kbGVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBkZXNjcmlwdGlvblxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLCBhbnk+fSBbY3VzdG9tRGV0YWlsc11cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSBbU0Y9YW55XSBjb250cmFjdCBzdGFydCBmdW5jdGlvblxuICogQHR5cGVkZWYge1hpbXBvcnQoJy4vdXRpbHMnKS5JbnN0YWxsYXRpb248U0Y+fSBJbnN0YWxsYXRpb25cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7SW5zdGFsbGF0aW9ufSBJXG4gKiBAdHlwZWRlZiB7WGltcG9ydCgnLi91dGlscycpLkluc3RhbGxhdGlvblN0YXJ0PEk+fSBJbnN0YWxsYXRpb25TdGFydFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRmVlSXNzdWVyQ29uZmlnXG4gKiBAcHJvcGVydHkge3N0cmluZ30gbmFtZVxuICogQHByb3BlcnR5IHtBc3NldEtpbmR9IGFzc2V0S2luZFxuICogQHByb3BlcnR5IHtEaXNwbGF5SW5mb30gZGlzcGxheUluZm9cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFpvZUZlZXNDb25maWdcbiAqIEBwcm9wZXJ0eSB7TmF0VmFsdWV9IGdldFB1YmxpY0ZhY2V0RmVlXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7SGFuZGxlPCdmZWVNaW50QWNjZXNzJz59IEZlZU1pbnRBY2Nlc3NcbiAqL1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAWydfnbRUAAG0VAAAqAAAAQGFnb3JpYy96b2UtdjAuMjUuMy90b29scy90eXBlcy1hbWJpZW50LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6W10sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBQcmljZVF1b3RlXG4gKiBAcHJvcGVydHkge0Ftb3VudDwnc2V0Jz59IHF1b3RlQW1vdW50XG4gKiBBbW91bnQgd2hvc2UgdmFsdWUgaXMgYSBQcmljZVF1b3RlVmFsdWVcbiAqIEBwcm9wZXJ0eSB7RVJlZjxQYXltZW50PCdzZXQnPj59IHF1b3RlUGF5bWVudFxuICogVGhlIGBxdW90ZUFtb3VudGAgd3JhcHBlZCBhcyBhIHBheW1lbnRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtbUHJpY2VEZXNjcmlwdGlvbl19IFByaWNlUXVvdGVWYWx1ZVxuICogQSBzaW5nbGUtdmFsdWVkIHNldCBvZiBQcmljZURlc2NyaXB0aW9ucy4gIFRoaXMgaXMgdGhlIGB2YWx1ZWAgaW5cbiAqIFByaWNlUXVvdGUucXVvdGVBbW91bnQgKGB7IGJyYW5kLCB2YWx1ZTogUHJpY2VRdW90ZVZhbHVlIH1gKS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFByaWNlRGVzY3JpcHRpb25cbiAqIEEgZGVzY3JpcHRpb24gb2YgYSBzaW5nbGUgcXVvdGVcbiAqIEBwcm9wZXJ0eSB7QW1vdW50PCduYXQnPn0gYW1vdW50SW5cbiAqIFRoZSBhbW91bnQgc3VwcGxpZWQgdG8gYSB0cmFkZVxuICogQHByb3BlcnR5IHtBbW91bnQ8J25hdCc+fSBhbW91bnRPdXRcbiAqIFRoZSBxdW90ZWQgcmVzdWx0IG9mIHRyYWRpbmcgYGFtb3VudEluYFxuICogQHByb3BlcnR5IHtYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXJTZXJ2aWNlfSB0aW1lclxuICogVGhlIHNlcnZpY2UgdGhhdCBnYXZlIHRoZSBgdGltZXN0YW1wYFxuICogQHByb3BlcnR5IHtYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXN0YW1wfSB0aW1lc3RhbXBcbiAqIEEgdGltZXN0YW1wIGFjY29yZGluZyB0byBgdGltZXJgIGZvciB0aGUgcXVvdGVcbiAqIEBwcm9wZXJ0eSB7YW55fSBbY29uZGl0aW9uc11cbiAqIEFkZGl0aW9uYWwgY29uZGl0aW9ucyBmb3IgdGhlIHF1b3RlXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgUHJpY2VRdW90ZUNyZWF0ZVxuICogQHBhcmFtIHtQcmljZVF1ZXJ5fSBwcmljZVF1ZXJ5XG4gKiBAcmV0dXJucyB7RVJlZjxQcmljZVF1b3RlPiB8IHVuZGVmaW5lZH1cbiAqL1xuXG4vKipcbiAqIEBjYWxsYmFjayBQcmljZVF1b3RlVHJpZ2dlclxuICogQHBhcmFtIHtQcmljZVF1b3RlQ3JlYXRlfSBjcmVhdGVRdW90ZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUHJpY2VBdXRob3JpdHlBZG1pblxuICogQHByb3BlcnR5IHsoY3JlYXRlUXVvdGU6IFByaWNlUXVvdGVDcmVhdGUpID0+IFByb21pc2U8dm9pZD59IGZpcmVUcmlnZ2Vyc1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUHJpY2VBdXRob3JpdHlLaXRcbiAqIEBwcm9wZXJ0eSB7UHJpY2VBdXRob3JpdHl9IHByaWNlQXV0aG9yaXR5XG4gKiBAcHJvcGVydHkge1ByaWNlQXV0aG9yaXR5QWRtaW59IGFkbWluRmFjZXRcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IE11dGFibGVRdW90ZVxuICogQHByb3BlcnR5IHsocmVhc29uPzogYW55KSA9PiB2b2lkfSBjYW5jZWxcbiAqIEBwcm9wZXJ0eSB7KGFtb3VudEluOiBBbW91bnQ8J25hdCc+LCBhbW91bnRPdXQ6IEFtb3VudDwnbmF0Jz4pID0+IHZvaWR9IHVwZGF0ZUxldmVsXG4gKiBAcHJvcGVydHkgeygpID0+IEVSZWY8UHJpY2VRdW90ZT59IGdldFByb21pc2VcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IFByaWNlQXV0aG9yaXR5XG4gKiBBbiBvYmplY3QgdGhhdCBtaW50cyBQcmljZVF1b3RlcyBhbmQgaGFuZGxlc1xuICogdHJpZ2dlcnMgYW5kIG5vdGlmaWVycyBmb3IgY2hhbmdlcyBpbiB0aGUgcHJpY2VcbiAqXG4gKiBAcHJvcGVydHkgeyhicmFuZEluOiBCcmFuZCwgYnJhbmRPdXQ6IEJyYW5kKSA9PiBFUmVmPElzc3Vlcjwnc2V0Jz4+fSBnZXRRdW90ZUlzc3VlclxuICogR2V0IHRoZSBFUlRQIGlzc3VlciBvZiBQcmljZVF1b3RlcyBmb3IgYSBnaXZlbiBicmFuZEluL2JyYW5kT3V0IHBhaXJcbiAqXG4gKiBAcHJvcGVydHkgeyhicmFuZEluOiBCcmFuZCxcbiAqICAgICAgICAgICAgIGJyYW5kT3V0OiBCcmFuZFxuICogKSA9PiBFUmVmPFhpbXBvcnQoJ0BhZ29yaWMvdGltZS9zcmMvdHlwZXMnKS5UaW1lclNlcnZpY2U+fSBnZXRUaW1lclNlcnZpY2VcbiAqIEdldCB0aGUgdGltZXIgdXNlZCBpbiBQcmljZVF1b3RlcyBmb3IgYSBnaXZlbiBicmFuZEluL2JyYW5kT3V0IHBhaXJcbiAqXG4gKiBAcHJvcGVydHkgeyhhbW91bnRJbjogQW1vdW50PCduYXQnPixcbiAqICAgICAgICAgICAgIGJyYW5kT3V0OiBCcmFuZDwnbmF0Jz5cbiAqICAgICAgICAgICAgKSA9PiBFUmVmPE5vdGlmaWVyPFByaWNlUXVvdGU+Pn0gbWFrZVF1b3RlTm90aWZpZXJcbiAqIEJlIG5vdGlmaWVkIG9mIHRoZSBsYXRlc3QgUHJpY2VRdW90ZXMgZm9yIGEgZ2l2ZW5cbiAqIGBhbW91bnRJbmAuICBUaGUgcmF0ZSBhdCB3aGljaCB0aGVzZSBhcmUgaXNzdWVkIG1heSBiZSB2ZXJ5IGRpZmZlcmVudCBiZXR3ZWVuXG4gKiBgcHJpY2VBdXRob3JpdGllc2AuXG4gKlxuICogQHByb3BlcnR5IHsoZGVhZGxpbmU6IFhpbXBvcnQoJ0BhZ29yaWMvdGltZS9zcmMvdHlwZXMnKS5UaW1lc3RhbXAsXG4gKiAgICAgICAgICAgICBhbW91bnRJbjogQW1vdW50PCduYXQnPixcbiAqICAgICAgICAgICAgIGJyYW5kT3V0OiBCcmFuZDwnbmF0Jz5cbiAqICkgPT4gUHJvbWlzZTxQcmljZVF1b3RlPn0gcXVvdGVBdFRpbWVcbiAqIFJlc29sdmVzIGFmdGVyIGBkZWFkbGluZWAgcGFzc2VzIG9uIHRoZVxuICogcHJpY2VBdXRob3JpdHkncyB0aW1lclNlcnZpY2Ugd2l0aCB0aGUgcHJpY2UgcXVvdGUgb2YgYGFtb3VudEluYCBhdCB0aGF0IHRpbWVcbiAqXG4gKiBAcHJvcGVydHkgeyhhbW91bnRJbjogQW1vdW50PCduYXQnPixcbiAqICAgICAgICAgICAgIGJyYW5kT3V0OiBCcmFuZDwnbmF0Jz5cbiAqICkgPT4gUHJvbWlzZTxQcmljZVF1b3RlPn0gcXVvdGVHaXZlblxuICogR2V0IGEgcXVvdGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGFtb3VudEluXG4gKlxuICogQHByb3BlcnR5IHsoYnJhbmRJbjogQnJhbmQ8J25hdCc+LFxuICogICAgICAgICAgICAgYW1vdW50T3V0OiBBbW91bnQ8J25hdCc+KSA9PiBQcm9taXNlPFByaWNlUXVvdGU+fSBxdW90ZVdhbnRlZFxuICogR2V0IGEgcXVvdGUgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGFtb3VudE91dFxuICpcbiAqIEBwcm9wZXJ0eSB7KGFtb3VudEluOiBBbW91bnQ8J25hdCc+LFxuICogICAgICAgICAgICAgYW1vdW50T3V0TGltaXQ6IEFtb3VudDwnbmF0Jz5cbiAqICkgPT4gUHJvbWlzZTxQcmljZVF1b3RlPn0gcXVvdGVXaGVuR1RcbiAqIFJlc29sdmUgd2hlbiBhIHByaWNlIHF1b3RlIG9mIGBhbW91bnRJbmAgZXhjZWVkcyBgYW1vdW50T3V0TGltaXRgXG4gKlxuICogQHByb3BlcnR5IHsoYW1vdW50SW46IEFtb3VudDwnbmF0Jz4sXG4gKiAgICAgICAgICAgICBhbW91bnRPdXRMaW1pdDogQW1vdW50PCduYXQnPlxuICogKSA9PiBQcm9taXNlPFByaWNlUXVvdGU+fSBxdW90ZVdoZW5HVEVcbiAqIFJlc29sdmUgd2hlbiBhIHByaWNlIHF1b3RlIG9mIGBhbW91bnRJbmAgcmVhY2hlcyBvciBleGNlZWRzIGBhbW91bnRPdXRMaW1pdGBcbiAqXG4gKiBAcHJvcGVydHkgeyhhbW91bnRJbjogQW1vdW50LFxuICogICAgICAgICAgICAgYW1vdW50T3V0TGltaXQ6IEFtb3VudFxuICogKSA9PiBQcm9taXNlPFByaWNlUXVvdGU+fSBxdW90ZVdoZW5MVEVcbiAqIFJlc29sdmUgd2hlbiBhIHByaWNlIHF1b3RlIG9mIGBhbW91bnRJbmAgcmVhY2hlcyBvciBkcm9wcyBiZWxvd1xuICogYGFtb3VudE91dExpbWl0YFxuICpcbiAqIEBwcm9wZXJ0eSB7KGFtb3VudEluOiBBbW91bnQsXG4gKiAgICAgICAgICAgICBhbW91bnRPdXRMaW1pdDogQW1vdW50XG4gKiApID0+IFByb21pc2U8UHJpY2VRdW90ZT59IHF1b3RlV2hlbkxUXG4gKiBSZXNvbHZlIHdoZW4gdGhlIHByaWNlIHF1b3RlIG9mIGBhbW91bnRJbmAgZHJvcHMgYmVsb3cgYGFtb3VudE91dExpbWl0YFxuICpcbiAqIEBwcm9wZXJ0eSB7KGFtb3VudEluOiBBbW91bnQsXG4gKiAgICAgICAgICAgICBhbW91bnRPdXRMaW1pdDogQW1vdW50XG4gKiApID0+IEVSZWY8TXV0YWJsZVF1b3RlPn0gbXV0YWJsZVF1b3RlV2hlbkdUXG4gKiBSZXNvbHZlIHdoZW4gYSBwcmljZSBxdW90ZSBvZiBgYW1vdW50SW5gIGV4Y2VlZHMgYGFtb3VudE91dExpbWl0YFxuICpcbiAqIEBwcm9wZXJ0eSB7KGFtb3VudEluOiBBbW91bnQsXG4gKiAgICAgICAgICAgICBhbW91bnRPdXRMaW1pdDogQW1vdW50XG4gKiApID0+IEVSZWY8TXV0YWJsZVF1b3RlPn0gbXV0YWJsZVF1b3RlV2hlbkdURVxuICogUmVzb2x2ZSB3aGVuIGEgcHJpY2UgcXVvdGUgb2YgYGFtb3VudEluYCByZWFjaGVzIG9yIGV4Y2VlZHNcbiAqIGBhbW91bnRPdXRMaW1pdGBcbiAqXG4gKiBAcHJvcGVydHkgeyhhbW91bnRJbjogQW1vdW50LFxuICogICAgICAgICAgICAgYW1vdW50T3V0TGltaXQ6IEFtb3VudFxuICogKSA9PiBFUmVmPE11dGFibGVRdW90ZT59IG11dGFibGVRdW90ZVdoZW5MVEVcbiAqIFJlc29sdmUgd2hlbiBhIHByaWNlIHF1b3RlIG9mIGBhbW91bnRJbmAgcmVhY2hlcyBvciBkcm9wcyBiZWxvd1xuICogYGFtb3VudE91dExpbWl0YFxuICpcbiAqIEBwcm9wZXJ0eSB7KGFtb3VudEluOiBBbW91bnQsXG4gKiAgICAgICAgICAgICBhbW91bnRPdXRMaW1pdDogQW1vdW50XG4gKiApID0+IEVSZWY8TXV0YWJsZVF1b3RlPn0gbXV0YWJsZVF1b3RlV2hlbkxUXG4gKiBSZXNvbHZlIHdoZW4gdGhlIHByaWNlIHF1b3RlIG9mIGBhbW91bnRJbmAgZHJvcHMgYmVsb3cgYGFtb3VudE91dExpbWl0YFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyhhbW91bnQ6IEFtb3VudDwnbmF0Jz4pID0+IEFtb3VudDwnbmF0Jz59IFByaWNlQ2FsY3VsYXRvclxuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIFByaWNlUXVlcnlcbiAqIEBwYXJhbSB7UHJpY2VDYWxjdWxhdG9yfSBjYWxjQW1vdW50SW5cbiAqIEBwYXJhbSB7UHJpY2VDYWxjdWxhdG9yfSBjYWxjQW1vdW50T3V0XG4gKiBAcmV0dXJucyB7eyBhbW91bnRJbjogQW1vdW50PCduYXQnPiwgYW1vdW50T3V0OiBBbW91bnQ8J25hdCc+LCB0aW1lc3RhbXA/OiBYaW1wb3J0KCdAYWdvcmljL3RpbWUvc3JjL3R5cGVzJykuVGltZXN0YW1wIH0gfCB1bmRlZmluZWR9XG4gKi9cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA+g/tX+sRAADrEQAAJAAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOC9zcmMvRS5qc3siaW1wb3J0cyI6WyIuL3RyYWNrLXR1cm5zLmpzIl0sImV4cG9ydHMiOlsiZGVmYXVsdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCB0cmFja1R1cm5zOyRo4oCNX2ltcG9ydHMoW1tcIi4vdHJhY2stdHVybnMuanNcIiwgW1tcInRyYWNrVHVybnNcIiwgWyRo4oCNX2EgPT4gKHRyYWNrVHVybnMgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG4vKi8gPHJlZmVyZW5jZSBwYXRoPVwiaW5kZXguZC50c1wiIC8+Ki9cblxuY29uc3R7ZGV0YWlsczpYLHF1b3RlOnF9PWFzc2VydDtcblxuLyoqIEB0eXBlIHtQcm94eUhhbmRsZXI8YW55Pn0gKi9cbmNvbnN0IGJhc2VGcmVlemFibGVQcm94eUhhbmRsZXI9e1xuc2V0KF90YXJnZXQsX3Byb3AsX3ZhbHVlKXtcbnJldHVybiBmYWxzZTtcbiB9LFxuaXNFeHRlbnNpYmxlKF90YXJnZXQpe1xucmV0dXJuIGZhbHNlO1xuIH0sXG5zZXRQcm90b3R5cGVPZihfdGFyZ2V0LF92YWx1ZSl7XG5yZXR1cm4gZmFsc2U7XG4gfSxcbmRlbGV0ZVByb3BlcnR5KF90YXJnZXQsX3Byb3Ape1xucmV0dXJuIGZhbHNlO1xuIH19O1xuXG5cbi8qIEUgUHJveHkgaGFuZGxlcnMgcHJldGVuZCB0aGF0IGFueSBwcm9wZXJ0eSBleGlzdHMgb24gdGhlIHRhcmdldCBhbmQgcmV0dXJucyovXG4vKiBhIGZ1bmN0aW9uIGZvciB0aGVpciB2YWx1ZS4gV2hpbGUgdGhpcyBmdW5jdGlvbiBpcyBcImJvdW5kXCIgYnkgY29udGV4dCwgaXQgaXMqL1xuLyogbWVhbnQgdG8gYmUgY2FsbGVkIGFzIGEgbWV0aG9kLiBGb3IgdGhhdCByZWFzb24sIHRoZSByZXR1cm5lZCBmdW5jdGlvbiovXG4vKiBpbmNsdWRlcyBhIGNoZWNrIHRoYXQgdGhlIGB0aGlzYCBhcmd1bWVudCBjb3JyZXNwb25kcyB0byB0aGUgaW5pdGlhbCovXG4vKiByZWNlaXZlciB3aGVuIHRoZSBmdW5jdGlvbiB3YXMgcmV0cmlldmVkLiovXG4vKiBFIFByb3h5IGhhbmRsZXJzIGFsc28gZm9yd2FyZCBkaXJlY3QgY2FsbHMgdG8gdGhlIHRhcmdldCBpbiBjYXNlIHRoZSByZW1vdGUqL1xuLyogaXMgYSBmdW5jdGlvbiBpbnN0ZWFkIG9mIGFuIG9iamVjdC4gTm8gc3VjaCByZWNlaXZlciBjaGVja3MgYXJlIG5lY2Vzc2FyeSBpbiovXG4vKiB0aGF0IGNhc2UuKi9cblxuLyoqXG4gKiBBIFByb3h5IGhhbmRsZXIgZm9yIEUoeCkuXG4gKlxuICogQHBhcmFtIHsqfSB4IEFueSB2YWx1ZSBwYXNzZWQgdG8gRSh4KVxuICogQHBhcmFtIHtYaW1wb3J0KCcuL2luZGV4JykuSGFuZGxlZFByb21pc2VDb25zdHJ1Y3Rvcn0gSGFuZGxlZFByb21pc2VcbiAqIEByZXR1cm5zIHtQcm94eUhhbmRsZXJ9IHRoZSBQcm94eSBoYW5kbGVyXG4gKi9cbmZ1bmN0aW9uIEVQcm94eUhhbmRsZXIoeCxIYW5kbGVkUHJvbWlzZSl7XG5yZXR1cm4gaGFyZGVuKHtcbi4uLmJhc2VGcmVlemFibGVQcm94eUhhbmRsZXIsXG5nZXQoX3RhcmdldCxwLHJlY2VpdmVyKXtcbnJldHVybiBoYXJkZW4oXG57XG4vKiBUaGlzIGZ1bmN0aW9uIHB1cnBvc2VseSBjaGVja3MgdGhlIGB0aGlzYCB2YWx1ZSAoc2VlIGFib3ZlKSovXG4vKiBJbiBvcmRlciB0byBiZSBgdGhpc2Agc2Vuc2l0aXZlIGl0IGlzIGRlZmluZWQgdXNpbmcgY29uY2lzZSBtZXRob2QqL1xuLyogc3ludGF4IHJhdGhlciB0aGFuIGFzIGFuIGFycm93IGZ1bmN0aW9uLiBUbyBlbnN1cmUgdGhlIGZ1bmN0aW9uKi9cbi8qIGlzIG5vdCBjb25zdHJ1Y3RhYmxlLCBpdCBhbHNvIGF2b2lkcyB0aGUgYGZ1bmN0aW9uYCBzeW50YXguKi9cbltwXSguLi5hcmdzKXtcbmlmKHRoaXMhPT1yZWNlaXZlcil7XG4vKiBSZWplY3QgdGhlIGFzeW5jIGZ1bmN0aW9uIGNhbGwqL1xucmV0dXJuIEhhbmRsZWRQcm9taXNlLnJlamVjdChcbmFzc2VydC5lcnJvcihcblggYFVuZXhwZWN0ZWQgcmVjZWl2ZXIgZm9yIFwiJHtwfVwiIG1ldGhvZCBvZiBFKCR7cSh4KX0pYCkpO1xuXG5cbiB9XG5cbnJldHVybiBIYW5kbGVkUHJvbWlzZS5hcHBseU1ldGhvZCh4LHAsYXJncyk7XG4gfVxuLyogQHRzLWV4cGVjdC1lcnJvciBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzUwMzE5Ki99W1xucF0pO1xuXG4gfSxcbmFwcGx5KF90YXJnZXQsX3RoaXNBcmcsYXJnQXJyYXk9W10pe1xucmV0dXJuIEhhbmRsZWRQcm9taXNlLmFwcGx5RnVuY3Rpb24oeCxhcmdBcnJheSk7XG4gfSxcbmhhcyhfdGFyZ2V0LF9wKXtcbi8qIFdlIGp1c3QgcHJldGVuZCBldmVyeXRoaW5nIGV4aXN0cy4qL1xucmV0dXJuIHRydWU7XG4gfX0pO1xuXG4gfVxuXG4vKipcbiAqIEEgUHJveHkgaGFuZGxlciBmb3IgRS5zZW5kT25seSh4KVxuICogSXQgaXMgYSB2YXJpYW50IG9uIHRoZSBFKHgpIFByb3h5IGhhbmRsZXIuXG4gKlxuICogQHBhcmFtIHsqfSB4IEFueSB2YWx1ZSBwYXNzZWQgdG8gRS5zZW5kT25seSh4KVxuICogQHBhcmFtIHtYaW1wb3J0KCcuL2luZGV4JykuSGFuZGxlZFByb21pc2VDb25zdHJ1Y3Rvcn0gSGFuZGxlZFByb21pc2VcbiAqIEByZXR1cm5zIHtQcm94eUhhbmRsZXJ9IHRoZSBQcm94eSBoYW5kbGVyXG4gKi9cbmZ1bmN0aW9uIEVzZW5kT25seVByb3h5SGFuZGxlcih4LEhhbmRsZWRQcm9taXNlKXtcbnJldHVybiBoYXJkZW4oe1xuLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbmdldChfdGFyZ2V0LHAscmVjZWl2ZXIpe1xucmV0dXJuIGhhcmRlbihcbntcbi8qIFRoaXMgZnVuY3Rpb24gcHVycG9zZWx5IGNoZWNrcyB0aGUgYHRoaXNgIHZhbHVlIChzZWUgYWJvdmUpKi9cbi8qIEluIG9yZGVyIHRvIGJlIGB0aGlzYCBzZW5zaXRpdmUgaXQgaXMgZGVmaW5lZCB1c2luZyBjb25jaXNlIG1ldGhvZCovXG4vKiBzeW50YXggcmF0aGVyIHRoYW4gYXMgYW4gYXJyb3cgZnVuY3Rpb24uIFRvIGVuc3VyZSB0aGUgZnVuY3Rpb24qL1xuLyogaXMgbm90IGNvbnN0cnVjdGFibGUsIGl0IGFsc28gYXZvaWRzIHRoZSBgZnVuY3Rpb25gIHN5bnRheC4qL1xuW3BdKC4uLmFyZ3Mpe1xuLyogVGhyb3cgc2luY2UgdGhlIGZ1bmN0aW9uIHJldHVybnMgbm90aGluZyovXG5hc3NlcnQuZXF1YWwoXG50aGlzLFxucmVjZWl2ZXIsXG5YIGBVbmV4cGVjdGVkIHJlY2VpdmVyIGZvciBcIiR7cH1cIiBtZXRob2Qgb2YgRS5zZW5kT25seSgke3EoeCl9KWApO1xuXG5IYW5kbGVkUHJvbWlzZS5hcHBseU1ldGhvZFNlbmRPbmx5KHgscCxhcmdzKTtcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuLyogQHRzLWV4cGVjdC1lcnJvciBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzUwMzE5Ki99W1xucF0pO1xuXG4gfSxcbmFwcGx5KF90YXJnZXQsX3RoaXNBcmcsYXJnc0FycmF5PVtdKXtcbkhhbmRsZWRQcm9taXNlLmFwcGx5RnVuY3Rpb25TZW5kT25seSh4LGFyZ3NBcnJheSk7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH0sXG5oYXMoX3RhcmdldCxfcCl7XG4vKiBXZSBqdXN0IHByZXRlbmQgdGhhdCBldmVyeXRoaW5nIGV4aXN0cy4qL1xucmV0dXJuIHRydWU7XG4gfX0pO1xuXG4gfVxuXG4vKipcbiAqIEBwYXJhbSB7WGltcG9ydCgnLi9pbmRleCcpLkhhbmRsZWRQcm9taXNlQ29uc3RydWN0b3J9IEhhbmRsZWRQcm9taXNlXG4gKiBAcmV0dXJucyB7WGltcG9ydCgnLi9pbmRleCcpLkVQcm94eX1cbiAqL1xuZnVuY3Rpb24gICAgICAgICAgICAgICAgbWFrZUUoSGFuZGxlZFByb21pc2Upe1xuZnVuY3Rpb24gRSh4KXtcbmNvbnN0IGhhbmRsZXI9RVByb3h5SGFuZGxlcih4LEhhbmRsZWRQcm9taXNlKTtcbnJldHVybiBoYXJkZW4obmV3IFByb3h5KCgpPT57IH0saGFuZGxlcikpO1xuIH1cblxuY29uc3QgbWFrZUVHZXR0ZXJQcm94eT0oeCk9PlxubmV3IFByb3h5KE9iamVjdC5jcmVhdGUobnVsbCkse1xuLi4uYmFzZUZyZWV6YWJsZVByb3h5SGFuZGxlcixcbmhhcyhfdGFyZ2V0LF9wcm9wKXtcbnJldHVybiB0cnVlO1xuIH0sXG5nZXQoX3RhcmdldCxwcm9wKXtcbnJldHVybiBIYW5kbGVkUHJvbWlzZS5nZXQoeCxwcm9wKTtcbiB9fSk7XG5cblxuRS5nZXQ9bWFrZUVHZXR0ZXJQcm94eTtcbkUucmVzb2x2ZT1IYW5kbGVkUHJvbWlzZS5yZXNvbHZlO1xuRS5zZW5kT25seT0oeCk9PntcbmNvbnN0IGhhbmRsZXI9RXNlbmRPbmx5UHJveHlIYW5kbGVyKHgsSGFuZGxlZFByb21pc2UpO1xucmV0dXJuIGhhcmRlbihuZXcgUHJveHkoKCk9PnsgfSxoYW5kbGVyKSk7XG4gfTtcblxuRS53aGVuPSh4LG9uZnVsZmlsbGVkLG9ucmVqZWN0ZWQpPT57XG5jb25zdFtvbnN1Y2Nlc3Msb25mYWlsdXJlXT10cmFja1R1cm5zKFtvbmZ1bGZpbGxlZCxvbnJlamVjdGVkXSk7XG5yZXR1cm4gSGFuZGxlZFByb21pc2UucmVzb2x2ZSh4KS50aGVuKG9uc3VjY2VzcyxvbmZhaWx1cmUpO1xuIH07XG5cbnJldHVybiBoYXJkZW4oRSk7XG4gfSRo4oCNX29uY2UuZGVmYXVsdCggICAgIG1ha2VFKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJkZWZhdWx0IjpbImRlZmF1bHQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAotScywoCAAAKAgAAKgAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOC9zcmMvbm8tc2hpbS5qc3siaW1wb3J0cyI6WyIuL0UuanMiXSwiZXhwb3J0cyI6WyJFIiwiSGFuZGxlZFByb21pc2UiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgbWFrZUU7JGjigI1faW1wb3J0cyhbW1wiLi9FLmpzXCIsIFtbXCJkZWZhdWx0XCIsIFskaOKAjV9hID0+IChtYWtlRSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cbmNvbnN0IGhwPUhhbmRsZWRQcm9taXNlOyRo4oCNX29uY2UuaHAoaHApO1xuY29uc3QgICAgICAgIEU9bWFrZUUoSGFuZGxlZFByb21pc2UpOyRo4oCNX29uY2UuRShFKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJIYW5kbGVkUHJvbWlzZSI6WyJocCJdLCJFIjpbIkUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA4rOx3dgPAADYDwAALgAAAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOC9zcmMvdHJhY2stdHVybnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbInRyYWNrVHVybnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBnbG9iYWwgZ2xvYmFsVGhpcyAqL1xuLyogQHRzLW5vY2hlY2sqL1xuXG4vKiBOT1RFOiBXZSBjYW4ndCBpbXBvcnQgdGhlc2UgYmVjYXVzZSB0aGV5J3JlIG5vdCBpbiBzY29wZSBiZWZvcmUgbG9ja2Rvd24uKi9cbi8qIGltcG9ydCB7IGFzc2VydCwgZGV0YWlscyBhcyBYLCBGYWlsIH0gZnJvbSAnQGFnb3JpYy9hc3NlcnQnOyovXG5cbi8qIFdBUk5JTkc6IEdsb2JhbCBNdXRhYmxlIFN0YXRlISovXG4vKiBUaGlzIHN0YXRlIGlzIGNvbW11bmljYXRlZCB0byBgYXNzZXJ0YCB0aGF0IG1ha2VzIGl0IGF2YWlsYWJsZSB0byB0aGUqL1xuLyogY2F1c2FsIGNvbnNvbGUsIHdoaWNoIGFmZmVjdHMgdGhlIGNvbnNvbGUgbG9nIG91dHB1dC4gTm9ybWFsbHkgd2UqL1xuLyogcmVnYXJkIHRoZSBhYmlsaXR5IHRvIHNlZSBjb25zb2xlIGxvZyBvdXRwdXQgYXMgYSBtZXRhLWxldmVsIHByaXZpbGVnZSovXG4vKiBhbmFsb2dvdXMgdG8gdGhlIGFiaWxpdHkgdG8gZGVidWcuIEFzaWRlIGZyb20gdGhhdCwgdGhpcyBtb2R1bGUgc2hvdWxkKi9cbi8qIG5vdCBoYXZlIGFueSBvYnNlcnZhYmx5IG11dGFibGUgc3RhdGUuKi9cblxubGV0IGhpZGRlblByaW9yRXJyb3I7XG5sZXQgaGlkZGVuQ3VycmVudFR1cm49MDtcbmxldCBoaWRkZW5DdXJyZW50RXZlbnQ9MDtcblxuLyogVE9ETyBVc2UgZW52aXJvbm1lbnQtb3B0aW9ucy5qcyBjdXJyZW50bHkgaW4gc2VzL3NyYyBhZnRlciBmYWN0b3JpbmcgaXQgb3V0Ki9cbi8qIHRvIGEgbmV3IHBhY2thZ2UuKi9cbmNvbnN0IGVudj0oZ2xvYmFsVGhpcy5wcm9jZXNzfHx7fSkuZW52fHx7fTtcblxuLyogVHVybiBvbiBpZiB5b3Ugc2VlbSB0byBiZSBsb3NpbmcgZXJyb3IgbG9nZ2luZyBhdCB0aGUgdG9wIG9mIHRoZSBldmVudCBsb29wKi9cbmNvbnN0IFZFUkJPU0U9KGVudi5ERUJVR3x8JycpLnNwbGl0KCc6JykuaW5jbHVkZXMoJ3RyYWNrLXR1cm5zJyk7XG5cbi8qIFRyYWNrLXR1cm5zIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQgYW5kIGNhbiBiZSBlbmFibGVkIGJ5IGFuIGVudmlyb25tZW50Ki9cbi8qIG9wdGlvbi4gV2UgaW50ZW5kIHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBhZnRlciB2ZXJpZnlpbmcgdGhhdCBoYXZpbmcqL1xuLyogdGhlIGZlYXR1cmUgZW5hYmxlZCBpbiBwcm9kdWN0aW9uIGRvZXMgbm90IGNhdXNlIG1lbW9yeSB0byBsZWFrLiovXG5jb25zdCBFTkFCTEVEPWVudi5UUkFDS19UVVJOUz09PSdlbmFibGVkJztcblxuLyogV2UgaG9pc3QgdGhlc2UgZnVuY3Rpb25zIG91dCBvZiB0cmFja1R1cm5zKCkgdG8gZGlzY291cmFnZSB0aGUqL1xuLyogY2xvc3VyZXMgZnJvbSBob2xkaW5nIG9udG8gJ2FyZ3MnIG9yICdmdW5jJyBsb25nZXIgdGhhbiBuZWNlc3NhcnksKi9cbi8qIHdoaWNoIHdlJ3ZlIHNlZW4gY2F1c2UgSGFuZGxlZFByb21pc2UgYXJndW1lbnRzIHRvIGJlIHJldGFpbmVkIGZvciovXG4vKiBhIHN1cnByaXNpbmdseSBsb25nIHRpbWUuKi9cblxuY29uc3QgYWRkUmVqZWN0aW9uTm90ZT0oZGV0YWlsc05vdGUpPT4ocmVhc29uKT0+e1xuaWYocmVhc29uIGluc3RhbmNlb2YgRXJyb3Ipe1xuYXNzZXJ0Lm5vdGUocmVhc29uLGRldGFpbHNOb3RlKTtcbiB9XG5pZihWRVJCT1NFKXtcbmNvbnNvbGUubG9nKCdSRUpFQ1RFRCBhdCB0b3Agb2YgZXZlbnQgbG9vcCcscmVhc29uKTtcbiB9XG4gfTtcblxuY29uc3Qgd3JhcEZ1bmN0aW9uPShmdW5jLHNlbmRpbmdFcnJvcixYKT0+KC4uLmFyZ3MpPT57XG5oaWRkZW5QcmlvckVycm9yPXNlbmRpbmdFcnJvcjtcbmhpZGRlbkN1cnJlbnRUdXJuKz0xO1xuaGlkZGVuQ3VycmVudEV2ZW50PTA7XG50cnl7XG5sZXQgcmVzdWx0O1xudHJ5e1xucmVzdWx0PWZ1bmMoLi4uYXJncyk7XG4gfWNhdGNoKGVycil7XG5pZihlcnIgaW5zdGFuY2VvZiBFcnJvcil7XG5hc3NlcnQubm90ZShcbmVycixcblggYFRocm93biBmcm9tOiAke2hpZGRlblByaW9yRXJyb3J9OiR7aGlkZGVuQ3VycmVudFR1cm59LiR7aGlkZGVuQ3VycmVudEV2ZW50fWApO1xuXG4gfVxuaWYoVkVSQk9TRSl7XG5jb25zb2xlLmxvZygnVEhST1dOIHRvIHRvcCBvZiBldmVudCBsb29wJyxlcnIpO1xuIH1cbnRocm93IGVycjtcbiB9XG4vKiBNdXN0IGNhcHR1cmUgdGhpcyBub3csIG5vdCB3aGVuIHRoZSBjYXRjaCB0cmlnZ2Vycy4qL1xuY29uc3QgZGV0YWlsc05vdGU9WCBgUmVqZWN0aW9uIGZyb206ICR7aGlkZGVuUHJpb3JFcnJvcn06JHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YDtcblByb21pc2UucmVzb2x2ZShyZXN1bHQpLmNhdGNoKGFkZFJlamVjdGlvbk5vdGUoZGV0YWlsc05vdGUpKTtcbnJldHVybiBoYXJkZW4ocmVzdWx0KTtcbiB9ZmluYWxseXtcbmhpZGRlblByaW9yRXJyb3I9dW5kZWZpbmVkO1xuIH1cbiB9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHsoKC4uLmFyZ3M6IGFueVtdKSA9PiBhbnkpIHwgdW5kZWZpbmVkfSBUdXJuU3RhcnRlckZuXG4gKiBBbiBvcHRpb25hbCBmdW5jdGlvbiB0aGF0IGlzIG5vdCB0aGlzLXNlbnNpdGl2ZSwgZXhwZWN0ZWQgdG8gYmUgY2FsbGVkIGF0XG4gKiBib3R0b20gb2Ygc3RhY2sgdG8gc3RhcnQgYSBuZXcgdHVybi5cbiAqL1xuXG4vKipcbiAqIEB0ZW1wbGF0ZSB7VHVyblN0YXJ0ZXJGbltdfSBUXG4gKiBHaXZlbiBhIGxpc3Qgb2YgYFR1cm5TdGFydGVyRm5gcywgcmV0dXJucyBhIGxpc3Qgb2YgYFR1cm5TdGFydGVyRm5gcyB3aG9zZVxuICogYHRoaXNgLWZyZWUgY2FsbCBiZWhhdmlvcnMgYXJlIG5vdCBvYnNlcnZhYmx5IGRpZmZlcmVudCB0byB0aG9zZSB0aGF0XG4gKiBjYW5ub3Qgc2VlIGNvbnNvbGUgb3V0cHV0LiBUaGUgb25seSBwdXJwb3NlIGlzIHRvIGNhdXNlIGFkZGl0aW9uYWxcbiAqIGluZm9ybWF0aW9uIHRvIGFwcGVhciBvbiB0aGUgY29uc29sZS5cbiAqXG4gKiBUaGUgY2FsbCB0byBgdHJhY2tUdXJuc2AgaXMgaXRzZWxmIGEgc2VuZGluZyBldmVudCwgdGhhdCBvY2N1cnMgaW4gc29tZSBjYWxsXG4gKiBzdGFjayBpbiBzb21lIHR1cm4gbnVtYmVyIGF0IHNvbWUgZXZlbnQgbnVtYmVyIHdpdGhpbiB0aGF0IHR1cm4uIEVhY2ggY2FsbFxuICogdG8gYW55IG9mIHRoZSByZXR1cm5lZCBgVHVyblN0YXJ0Rm5gcyBpcyBhIHJlY2VpdmluZyBldmVudCB0aGF0IGJlZ2lucyBhIG5ld1xuICogdHVybi4gVGhpcyBzZW5kaW5nIGV2ZW50IGNhdXNlZCBlYWNoIG9mIHRob3NlIHJlY2VpdmluZyBldmVudHMuXG4gKlxuICogQHBhcmFtIHtUfSBmdW5jc1xuICogQHJldHVybnMge1R9XG4gKi9cbmNvbnN0ICAgICAgICB0cmFja1R1cm5zPShmdW5jcyk9PntcbmlmKCFFTkFCTEVEfHx0eXBlb2YgZ2xvYmFsVGhpcz09PSd1bmRlZmluZWQnfHwhZ2xvYmFsVGhpcy5hc3NlcnQpe1xucmV0dXJuIGZ1bmNzO1xuIH1cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuXG5oaWRkZW5DdXJyZW50RXZlbnQrPTE7XG5jb25zdCBzZW5kaW5nRXJyb3I9bmV3IEVycm9yKFxuIGBFdmVudDogJHtoaWRkZW5DdXJyZW50VHVybn0uJHtoaWRkZW5DdXJyZW50RXZlbnR9YCk7XG5cbmlmKGhpZGRlblByaW9yRXJyb3IhPT11bmRlZmluZWQpe1xuYXNzZXJ0Lm5vdGUoc2VuZGluZ0Vycm9yLFggYENhdXNlZCBieTogJHtoaWRkZW5QcmlvckVycm9yfWApO1xuIH1cblxucmV0dXJuIGZ1bmNzLm1hcCgoZnVuYyk9PmZ1bmMmJndyYXBGdW5jdGlvbihmdW5jLHNlbmRpbmdFcnJvcixYKSk7XG4gfTskaOKAjV9vbmNlLnRyYWNrVHVybnModHJhY2tUdXJucyk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsidHJhY2tUdXJucyI6WyJ0cmFja1R1cm5zIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAD7lgF62AgAAtgIAAB4AAABAZW5kby9mYXItdjAuMi4xNC9zcmMvaW5kZXguanN7ImltcG9ydHMiOlsiQGVuZG8vZXZlbnR1YWwtc2VuZCIsIkBlbmRvL21hcnNoYWwiXSwiZXhwb3J0cyI6WyJFIiwiRmFyIiwiZ2V0SW50ZXJmYWNlT2YiLCJwYXNzU3R5bGVPZiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2V2ZW50dWFsLXNlbmRcIiwgW1tcIkVcIiwgWyRo4oCNX2xpdmVbXCJFXCJdXV1dXSxbXCJAZW5kby9tYXJzaGFsXCIsIFtbXCJGYXJcIiwgWyRo4oCNX2xpdmVbXCJGYXJcIl1dXSxbXCJnZXRJbnRlcmZhY2VPZlwiLCBbJGjigI1fbGl2ZVtcImdldEludGVyZmFjZU9mXCJdXV0sW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2xpdmVbXCJwYXNzU3R5bGVPZlwiXV1dXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6eyJFIjpbIkUiLGZhbHNlXSwiRmFyIjpbIkZhciIsZmFsc2VdLCJnZXRJbnRlcmZhY2VPZiI6WyJnZXRJbnRlcmZhY2VPZiIsZmFsc2VdLCJwYXNzU3R5bGVPZiI6WyJwYXNzU3R5bGVPZiIsZmFsc2VdfSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAACE1ofwvxAAAL8QAAAdAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvaW5kZXguanN7ImltcG9ydHMiOlsiLi9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzIiwiLi9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzIiwiLi9zcmMvaGVscGVycy9lcnJvci5qcyIsIi4vc3JjL2hlbHBlcnMvaXRlci1oZWxwZXJzLmpzIiwiLi9zcmMvaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vc3JjL2hlbHBlcnMvcmVtb3RhYmxlLmpzIiwiLi9zcmMvaGVscGVycy9zeW1ib2wuanMiLCIuL3NyYy9tYWtlLWZhci5qcyIsIi4vc3JjL21ha2VUYWdnZWQuanMiLCIuL3NyYy9tYXJzaGFsLWp1c3Rpbi5qcyIsIi4vc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzIiwiLi9zcmMvbWFyc2hhbC5qcyIsIi4vc3JjL3Bhc3NTdHlsZU9mLmpzIiwiLi9zcmMvdHlwZUd1YXJkcy5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sImV4cG9ydHMiOlsiRmFyIiwiUEFTU19TVFlMRSIsIlFDTEFTUyIsIlJlbW90YWJsZSIsIlRvRmFyRnVuY3Rpb24iLCJhc3NlcnRDaGVja2VyIiwiYXNzZXJ0Q29weUFycmF5IiwiYXNzZXJ0UGFzc2FibGUiLCJhc3NlcnRSZWNvcmQiLCJhc3NlcnRSZW1vdGFibGUiLCJkZWNvZGVUb0p1c3RpbiIsImRlZXBseUZ1bGZpbGxlZCIsImZpbHRlckl0ZXJhYmxlIiwiZ2V0RXJyb3JDb25zdHJ1Y3RvciIsImdldEludGVyZmFjZU9mIiwiZ2V0VGFnIiwiaGFzT3duUHJvcGVydHlPZiIsImlzQ29weUFycmF5IiwiaXNPYmplY3QiLCJpc1JlY29yZCIsImlzUmVtb3RhYmxlIiwibWFrZU1hcnNoYWwiLCJtYWtlVGFnZ2VkIiwibWFwSXRlcmFibGUiLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiLCJwYXJzZSIsInBhc3NTdHlsZU9mIiwicGFzc2FibGVTeW1ib2xGb3JOYW1lIiwic3RyaW5naWZ5IiwidG9QYXNzYWJsZUVycm9yIl0sInJlZXhwb3J0cyI6WyIuL3NyYy90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIi4vc3JjL2hlbHBlcnMvaXRlci1oZWxwZXJzLmpzXCIsIFtbXCJtYXBJdGVyYWJsZVwiLCBbJGjigI1fbGl2ZVtcIm1hcEl0ZXJhYmxlXCJdXV0sW1wiZmlsdGVySXRlcmFibGVcIiwgWyRo4oCNX2xpdmVbXCJmaWx0ZXJJdGVyYWJsZVwiXV1dXV0sW1wiLi9zcmMvaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fbGl2ZVtcIlBBU1NfU1RZTEVcIl1dXSxbXCJpc09iamVjdFwiLCBbJGjigI1fbGl2ZVtcImlzT2JqZWN0XCJdXV0sW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fbGl2ZVtcImFzc2VydENoZWNrZXJcIl1dXSxbXCJnZXRUYWdcIiwgWyRo4oCNX2xpdmVbXCJnZXRUYWdcIl1dXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9saXZlW1wiaGFzT3duUHJvcGVydHlPZlwiXV1dXV0sW1wiLi9zcmMvaGVscGVycy9lcnJvci5qc1wiLCBbW1wiZ2V0RXJyb3JDb25zdHJ1Y3RvclwiLCBbJGjigI1fbGl2ZVtcImdldEVycm9yQ29uc3RydWN0b3JcIl1dXSxbXCJ0b1Bhc3NhYmxlRXJyb3JcIiwgWyRo4oCNX2xpdmVbXCJ0b1Bhc3NhYmxlRXJyb3JcIl1dXV1dLFtcIi4vc3JjL2hlbHBlcnMvcmVtb3RhYmxlLmpzXCIsIFtbXCJnZXRJbnRlcmZhY2VPZlwiLCBbJGjigI1fbGl2ZVtcImdldEludGVyZmFjZU9mXCJdXV1dXSxbXCIuL3NyYy9oZWxwZXJzL3N5bWJvbC5qc1wiLCBbW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9saXZlW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCJdXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsIFskaOKAjV9saXZlW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCJdXV1dXSxbXCIuL3NyYy9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2xpdmVbXCJwYXNzU3R5bGVPZlwiXV1dLFtcImFzc2VydFBhc3NhYmxlXCIsIFskaOKAjV9saXZlW1wiYXNzZXJ0UGFzc2FibGVcIl1dXV1dLFtcIi4vc3JjL2RlZXBseUZ1bGZpbGxlZC5qc1wiLCBbW1wiZGVlcGx5RnVsZmlsbGVkXCIsIFskaOKAjV9saXZlW1wiZGVlcGx5RnVsZmlsbGVkXCJdXV1dXSxbXCIuL3NyYy9tYWtlVGFnZ2VkLmpzXCIsIFtbXCJtYWtlVGFnZ2VkXCIsIFskaOKAjV9saXZlW1wibWFrZVRhZ2dlZFwiXV1dXV0sW1wiLi9zcmMvbWFrZS1mYXIuanNcIiwgW1tcIlJlbW90YWJsZVwiLCBbJGjigI1fbGl2ZVtcIlJlbW90YWJsZVwiXV1dLFtcIkZhclwiLCBbJGjigI1fbGl2ZVtcIkZhclwiXV1dLFtcIlRvRmFyRnVuY3Rpb25cIiwgWyRo4oCNX2xpdmVbXCJUb0ZhckZ1bmN0aW9uXCJdXV1dXSxbXCIuL3NyYy9lbmNvZGVUb0NhcERhdGEuanNcIiwgW1tcIlFDTEFTU1wiLCBbJGjigI1fbGl2ZVtcIlFDTEFTU1wiXV1dXV0sW1wiLi9zcmMvbWFyc2hhbC5qc1wiLCBbW1wibWFrZU1hcnNoYWxcIiwgWyRo4oCNX2xpdmVbXCJtYWtlTWFyc2hhbFwiXV1dXV0sW1wiLi9zcmMvbWFyc2hhbC1zdHJpbmdpZnkuanNcIiwgW1tcInN0cmluZ2lmeVwiLCBbJGjigI1fbGl2ZVtcInN0cmluZ2lmeVwiXV1dLFtcInBhcnNlXCIsIFskaOKAjV9saXZlW1wicGFyc2VcIl1dXV1dLFtcIi4vc3JjL21hcnNoYWwtanVzdGluLmpzXCIsIFtbXCJkZWNvZGVUb0p1c3RpblwiLCBbJGjigI1fbGl2ZVtcImRlY29kZVRvSnVzdGluXCJdXV1dXSxbXCIuL3NyYy90eXBlR3VhcmRzLmpzXCIsIFtbXCJhc3NlcnRSZWNvcmRcIiwgWyRo4oCNX2xpdmVbXCJhc3NlcnRSZWNvcmRcIl1dXSxbXCJhc3NlcnRDb3B5QXJyYXlcIiwgWyRo4oCNX2xpdmVbXCJhc3NlcnRDb3B5QXJyYXlcIl1dXSxbXCJhc3NlcnRSZW1vdGFibGVcIiwgWyRo4oCNX2xpdmVbXCJhc3NlcnRSZW1vdGFibGVcIl1dXSxbXCJpc1JlbW90YWJsZVwiLCBbJGjigI1fbGl2ZVtcImlzUmVtb3RhYmxlXCJdXV0sW1wiaXNSZWNvcmRcIiwgWyRo4oCNX2xpdmVbXCJpc1JlY29yZFwiXV1dLFtcImlzQ29weUFycmF5XCIsIFskaOKAjV9saXZlW1wiaXNDb3B5QXJyYXlcIl1dXV1dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7Im1hcEl0ZXJhYmxlIjpbIm1hcEl0ZXJhYmxlIixmYWxzZV0sImZpbHRlckl0ZXJhYmxlIjpbImZpbHRlckl0ZXJhYmxlIixmYWxzZV0sIlBBU1NfU1RZTEUiOlsiUEFTU19TVFlMRSIsZmFsc2VdLCJpc09iamVjdCI6WyJpc09iamVjdCIsZmFsc2VdLCJhc3NlcnRDaGVja2VyIjpbImFzc2VydENoZWNrZXIiLGZhbHNlXSwiZ2V0VGFnIjpbImdldFRhZyIsZmFsc2VdLCJoYXNPd25Qcm9wZXJ0eU9mIjpbImhhc093blByb3BlcnR5T2YiLGZhbHNlXSwiZ2V0RXJyb3JDb25zdHJ1Y3RvciI6WyJnZXRFcnJvckNvbnN0cnVjdG9yIixmYWxzZV0sInRvUGFzc2FibGVFcnJvciI6WyJ0b1Bhc3NhYmxlRXJyb3IiLGZhbHNlXSwiZ2V0SW50ZXJmYWNlT2YiOlsiZ2V0SW50ZXJmYWNlT2YiLGZhbHNlXSwibmFtZUZvclBhc3NhYmxlU3ltYm9sIjpbIm5hbWVGb3JQYXNzYWJsZVN5bWJvbCIsZmFsc2VdLCJwYXNzYWJsZVN5bWJvbEZvck5hbWUiOlsicGFzc2FibGVTeW1ib2xGb3JOYW1lIixmYWxzZV0sInBhc3NTdHlsZU9mIjpbInBhc3NTdHlsZU9mIixmYWxzZV0sImFzc2VydFBhc3NhYmxlIjpbImFzc2VydFBhc3NhYmxlIixmYWxzZV0sImRlZXBseUZ1bGZpbGxlZCI6WyJkZWVwbHlGdWxmaWxsZWQiLGZhbHNlXSwibWFrZVRhZ2dlZCI6WyJtYWtlVGFnZ2VkIixmYWxzZV0sIlJlbW90YWJsZSI6WyJSZW1vdGFibGUiLGZhbHNlXSwiRmFyIjpbIkZhciIsZmFsc2VdLCJUb0ZhckZ1bmN0aW9uIjpbIlRvRmFyRnVuY3Rpb24iLGZhbHNlXSwiUUNMQVNTIjpbIlFDTEFTUyIsZmFsc2VdLCJtYWtlTWFyc2hhbCI6WyJtYWtlTWFyc2hhbCIsZmFsc2VdLCJzdHJpbmdpZnkiOlsic3RyaW5naWZ5IixmYWxzZV0sInBhcnNlIjpbInBhcnNlIixmYWxzZV0sImRlY29kZVRvSnVzdGluIjpbImRlY29kZVRvSnVzdGluIixmYWxzZV0sImFzc2VydFJlY29yZCI6WyJhc3NlcnRSZWNvcmQiLGZhbHNlXSwiYXNzZXJ0Q29weUFycmF5IjpbImFzc2VydENvcHlBcnJheSIsZmFsc2VdLCJhc3NlcnRSZW1vdGFibGUiOlsiYXNzZXJ0UmVtb3RhYmxlIixmYWxzZV0sImlzUmVtb3RhYmxlIjpbImlzUmVtb3RhYmxlIixmYWxzZV0sImlzUmVjb3JkIjpbImlzUmVjb3JkIixmYWxzZV0sImlzQ29weUFycmF5IjpbImlzQ29weUFycmF5IixmYWxzZV19LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAKo0/YJCDAAAQgwAACsAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzeyJpbXBvcnRzIjpbIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vbWFrZVRhZ2dlZC5qcyIsIi4vcGFzc1N0eWxlT2YuanMiLCJAZW5kby9ldmVudHVhbC1zZW5kIiwiQGVuZG8vcHJvbWlzZS1raXQiXSwiZXhwb3J0cyI6WyJkZWVwbHlGdWxmaWxsZWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgRSxpc1Byb21pc2UsZ2V0VGFnLGlzT2JqZWN0LG1ha2VUYWdnZWQscGFzc1N0eWxlT2Y7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vZXZlbnR1YWwtc2VuZFwiLCBbW1wiRVwiLCBbJGjigI1fYSA9PiAoRSA9ICRo4oCNX2EpXV1dXSxbXCJAZW5kby9wcm9taXNlLWtpdFwiLCBbW1wiaXNQcm9taXNlXCIsIFskaOKAjV9hID0+IChpc1Byb21pc2UgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXV1dLFtcIi4vbWFrZVRhZ2dlZC5qc1wiLCBbW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0ZW1wbGF0ZSBUIEB0eXBlZGVmIHtYaW1wb3J0KCdAZW5kby9ldmVudHVhbC1zZW5kJykuRVJlZjxUPn0gRVJlZiAqL1xuXG5jb25zdHtkZXRhaWxzOlgscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2Zyb21FbnRyaWVzfT1PYmplY3Q7XG5cbi8qKlxuICogR2l2ZW4gYSBQYXNzYWJsZSBgdmFsYCB3aG9zZSBwYXNzLWJ5LWNvcHkgc3RydWN0dXJlIG1heSBjb250YWluIGxlYWZcbiAqIHByb21pc2VzLCByZXR1cm4gZWl0aGVyIGEgcmVwbGFjZW1lbnQgUGFzc2FibGUsIG9yIGEgcHJvbWlzZSBmb3IgdGhhdFxuICogcmVwbGFjZW1lbnQsIHdoZXJlIHRoYXQgcmVwbGFjZW1lbnQgaXMgKmRlZXBseSBmdWxmaWxsZWQqLCBpLmUuLCBpdHNcbiAqIHBhc3MtYnktY29weSBzdHJ1Y3R1cmUgZG9lcyBub3QgY29udGFpbiBhbnkgcHJvbWlzZXMuXG4gKlxuICogVGhpcyBpcyBhIGRlZXAgZm9ybSBvZiBgUHJvbWlzZS5hbGxgIHNwZWNpYWxpemVkIGZvciBQYXNzYWJsZXMuIEZvciBlYWNoXG4gKiBlbmNvdW50ZXJlZCBwcm9taXNlLCByZXBsYWNlIGl0IHdpdGggdGhlIGRlZXBseSBmdWxmaWxsZWQgZm9ybSBvZlxuICogaXRzIGZ1bGZpbGxtZW50LlxuICogSWYgYW55IG9mIHRoZSBwcm9taXNlcyByZWplY3QsIHRoZW4gdGhlIHByb21pc2UgZm9yIHRoZSByZXBsYWNlbWVudFxuICogcmVqZWN0cy4gSWYgYW55IG9mIHRoZSBwcm9taXNlcyBuZXZlciBzZXR0bGUsIHRoZW4gdGhlIHByb21pc2UgZm9yXG4gKiB0aGUgcmVwbGFjZW1lbnQgbmV2ZXIgc2V0dGxlcy5cbiAqXG4gKiBJZiBgdmFsYCBvciBpdHMgcGFydHMgYXJlIG5vbi1rZXkgcGFzc2FibGVzICpiZWNhdXNlKiB0aGV5IGNvbnRhaW5zXG4gKiBwcm9taXNlcywgdGhlIGRlZXBseSBmdWxmaWxsZWQgZm9ybXMgb2YgdmFsIG9yIGl0cyBwYXJ0cyBtYXkgYmUga2V5cy4gVGhpc1xuICogaXMgZm9yIHRoZSBoaWdoZXIgXCJzdG9yZVwiIGxldmVsIG9mIGFic3RyYWN0aW9uIHRvIGRldGVybWluZSwgYmVjYXVzZSBpdFxuICogZGVmaW5lcyB0aGUgXCJrZXlcIiBub3Rpb24gaW4gcXVlc3Rpb24uXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7RVJlZjxQYXNzYWJsZT59XG4gKi9cbmNvbnN0ICAgICAgICBkZWVwbHlGdWxmaWxsZWQ9KHZhbCk9PntcbmlmKCFpc09iamVjdCh2YWwpKXtcbnJldHVybiB2YWw7XG4gfVxuaWYoaXNQcm9taXNlKHZhbCkpe1xucmV0dXJuIEUud2hlbih2YWwsKG5vbnApPT5kZWVwbHlGdWxmaWxsZWQobm9ucCkpO1xuIH1cbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZih2YWwpO1xuc3dpdGNoKHBhc3NTdHlsZSl7XG5jYXNlJ2NvcHlSZWNvcmQnOntcbmNvbnN0IG5hbWVzPW93bktleXModmFsKTtcbmNvbnN0IHZhbFBzPW5hbWVzLm1hcCgobmFtZSk9PmRlZXBseUZ1bGZpbGxlZCh2YWxbbmFtZV0pKTtcbnJldHVybiBFLndoZW4oUHJvbWlzZS5hbGwodmFsUHMpLCh2YWxzKT0+XG5oYXJkZW4oZnJvbUVudHJpZXModmFscy5tYXAoKGMsaSk9PltuYW1lc1tpXSxjXSkpKSk7XG5cbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xuY29uc3QgdmFsUHM9dmFsLm1hcCgocCk9PmRlZXBseUZ1bGZpbGxlZChwKSk7XG5yZXR1cm4gRS53aGVuKFByb21pc2UuYWxsKHZhbFBzKSwodmFscyk9PmhhcmRlbih2YWxzKSk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbmNvbnN0IHRhZz1nZXRUYWcodmFsKTtcbnJldHVybiBFLndoZW4oZGVlcGx5RnVsZmlsbGVkKHZhbC5wYXlsb2FkKSwocGF5bG9hZCk9PlxubWFrZVRhZ2dlZCh0YWcscGF5bG9hZCkpO1xuXG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbnJldHVybiB2YWw7XG4gfVxuY2FzZSdlcnJvcic6e1xucmV0dXJuIHZhbDtcbiB9XG5jYXNlJ3Byb21pc2UnOntcbnJldHVybiBFLndoZW4odmFsLChub25wKT0+ZGVlcGx5RnVsZmlsbGVkKG5vbnApKTtcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFggYFVuZXhwZWN0ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfWAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfTskaOKAjV9vbmNlLmRlZXBseUZ1bGZpbGxlZChkZWVwbHlGdWxmaWxsZWQpO1xuaGFyZGVuKGRlZXBseUZ1bGZpbGxlZCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVlcGx5RnVsZmlsbGVkIjpbImRlZXBseUZ1bGZpbGxlZCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAANP5P3u0MAALtDAAAqAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2VuY29kZVBhc3NhYmxlLmpzeyJpbXBvcnRzIjpbIi4vaGVscGVycy9lcnJvci5qcyIsIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vaGVscGVycy9zeW1ib2wuanMiLCIuL21ha2VUYWdnZWQuanMiLCIuL3Bhc3NTdHlsZU9mLmpzIiwiLi90eXBlR3VhcmRzLmpzIl0sImV4cG9ydHMiOlsiaXNFbmNvZGVkUmVtb3RhYmxlIiwibWFrZURlY29kZVBhc3NhYmxlIiwibWFrZUVuY29kZVBhc3NhYmxlIiwicGFzc1N0eWxlUHJlZml4ZXMiLCJyZWNvcmROYW1lcyIsInJlY29yZFZhbHVlcyIsInplcm9QYWQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgZ2V0VGFnLG1ha2VUYWdnZWQscGFzc1N0eWxlT2YsYXNzZXJ0UmVjb3JkLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWUsRXJyb3JIZWxwZXI7JGjigI1faW1wb3J0cyhbW1wiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV1dXSxbXCIuL21ha2VUYWdnZWQuanNcIiwgW1tcIm1ha2VUYWdnZWRcIiwgWyRo4oCNX2EgPT4gKG1ha2VUYWdnZWQgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dLFtcIi4vdHlwZUd1YXJkcy5qc1wiLCBbW1wiYXNzZXJ0UmVjb3JkXCIsIFskaOKAjV9hID0+IChhc3NlcnRSZWNvcmQgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3N5bWJvbC5qc1wiLCBbW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLCBbJGjigI1fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9lcnJvci5qc1wiLCBbW1wiRXJyb3JIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKEVycm9ySGVscGVyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFzc1N0eWxlfSBQYXNzU3R5bGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUmVtb3RhYmxlfSBSZW1vdGFibGUgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNvcHlSZWNvcmQ8VD59IENvcHlSZWNvcmQgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJhbmtDb3Zlcn0gUmFua0NvdmVyICovXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtmcm9tRW50cmllcyxpc309T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqXG4gKiBBc3N1bWluZyB0aGF0IGByZWNvcmRgIGlzIGEgQ29weVJlY29yZCwgd2UgaGF2ZSBvbmx5XG4gKiBzdHJpbmctbmFtZWQgb3duIHByb3BlcnRpZXMuIGByZWNvcmROYW1lc2AgcmV0dXJucyB0aG9zZSBuYW1lICpyZXZlcnNlKlxuICogc29ydGVkLCBiZWNhdXNlIHRoYXQncyBob3cgcmVjb3JkcyBhcmUgY29tcGFyZWQsIGVuY29kZWQsIGFuZCBzb3J0ZWQuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7Q29weVJlY29yZDxUPn0gcmVjb3JkXG4gKiBAcmV0dXJucyB7c3RyaW5nW119XG4gKi9cbmNvbnN0ICAgICAgICByZWNvcmROYW1lcz0ocmVjb3JkKT0+XG4vKiBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjYwI2Rpc2N1c3Npb25fcjEwMDM2NTcyNDQqL1xuLyogY29tcGFyZXMgdHdvIHdheXMgb2YgcmV2ZXJzZSBzb3J0aW5nLCBhbmQgc2hvd3MgdGhhdCBgLnNvcnQoKS5yZXZlcnNlKClgKi9cbi8qIGlzIGN1cnJlbnRseSBmYXN0ZXIgb24gTW9kZGFibGUgWFMsIHdoaWxlIHRoZSBvdGhlciB3YXksKi9cbi8qIGAuc29ydChyZXZlcnNlQ29tcGFyYXRvcilgLCBpcyBmYXN0ZXIgb24gdjguIFdlIGN1cnJlbnRseSBjYXJlIG1vcmUgYWJvdXQqL1xuLyogWFMgcGVyZm9ybWFuY2UsIHNvIHdlIHJldmVyc2Ugc29ydCB1c2luZyBgLnNvcnQoKS5yZXZlcnNlKClgLiovXG5oYXJkZW4oXG4vKiogQHR5cGUge3N0cmluZ1tdfSAqL293bktleXMocmVjb3JkKS5cbnNvcnQoKS5cbnJldmVyc2UoKSk7JGjigI1fb25jZS5yZWNvcmROYW1lcyhyZWNvcmROYW1lcyk7XG5cbmhhcmRlbihyZWNvcmROYW1lcyk7XG5cbi8qKlxuICogQXNzdW1pbmcgdGhhdCBgcmVjb3JkYCBpcyBhIENvcHlSZWNvcmQgYW5kIGBuYW1lc2AgaXMgYHJlY29yZE5hbWVzKHJlY29yZClgLFxuICogcmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtDb3B5UmVjb3JkPFQ+fSByZWNvcmRcbiAqIEBwYXJhbSB7c3RyaW5nW119IG5hbWVzXG4gKiBAcmV0dXJucyB7VFtdfVxuICovXG5jb25zdCAgICAgICAgcmVjb3JkVmFsdWVzPShyZWNvcmQsbmFtZXMpPT5cbmhhcmRlbihuYW1lcy5tYXAoKG5hbWUpPT5yZWNvcmRbbmFtZV0pKTskaOKAjV9vbmNlLnJlY29yZFZhbHVlcyhyZWNvcmRWYWx1ZXMpO1xuaGFyZGVuKHJlY29yZFZhbHVlcyk7XG5cbmNvbnN0ICAgICAgICB6ZXJvUGFkPShuLHNpemUpPT57XG5jb25zdCBuU3RyPSBgJHtufWA7XG5hc3NlcnQoblN0ci5sZW5ndGg8PXNpemUpO1xuY29uc3Qgc3RyPSBgMDAwMDAwMDAwMDAwMDAwMDAwMDAke25TdHJ9YDtcbmNvbnN0IHJlc3VsdD1zdHIuc3Vic3RyaW5nKHN0ci5sZW5ndGgtc2l6ZSk7XG5hc3NlcnQocmVzdWx0Lmxlbmd0aD09PXNpemUpO1xucmV0dXJuIHJlc3VsdDtcbiB9OyRo4oCNX29uY2UuemVyb1BhZCh6ZXJvUGFkKTtcbmhhcmRlbih6ZXJvUGFkKTtcblxuLyogVGhpcyBpcyB0aGUgSmF2YVNjcmlwdCBhbmFsb2cgdG8gYSBDIHVuaW9uOiBhIHdheSB0byBtYXAgYmV0d2VlbiBhIGZsb2F0IGFzIGEqL1xuLyogbnVtYmVyIGFuZCB0aGUgYml0cyB0aGF0IHJlcHJlc2VudCB0aGUgZmxvYXQgYXMgYSBidWZmZXIgZnVsbCBvZiBieXRlcy4gIE5vdGUqL1xuLyogdGhhdCB0aGUgbXV0YXRpb24gb2Ygc3RhdGljIHN0YXRlIGhlcmUgbWFrZXMgdGhpcyBpbnZhbGlkIEplc3NpZSBjb2RlLCBidXQqL1xuLyogZG9pbmcgaXQgdGhpcyB3YXkgc2F2ZXMgdGhlIG51Z2F0b3J5IGFuZCBncmF0dWl0b3VzIGFsbG9jYXRpb25zIHRoYXQgd291bGQqL1xuLyogaGFwcGVuIGV2ZXJ5IHRpbWUgeW91IGRvIGEgY29udmVyc2lvbiAtLSBhbmQgaW4gcHJhY3RpY2FsIHRlcm1zIGl0J3Mgc2FmZSovXG4vKiBiZWNhdXNlIHdlIHB1dCB0aGUgdmFsdWUgaW4gb25lIHNpZGUgYW5kIHRoZW4gaW1tZWRpYXRlbHkgdGFrZSBpdCBvdXQgdGhlKi9cbi8qIG90aGVyOyB0aGVyZSBpcyBubyBhY3R1YWwgc3RhdGUgcmV0YWluZWQgaW4gdGhlIGNsYXNzaWMgc2Vuc2UgYW5kIHRodXMgbm8qL1xuLyogcmUtZW50cmFuY3kgaXNzdWUuKi9cbmNvbnN0IGFzTnVtYmVyPW5ldyBGbG9hdDY0QXJyYXkoMSk7XG5jb25zdCBhc0JpdHM9bmV3IEJpZ1VpbnQ2NEFycmF5KGFzTnVtYmVyLmJ1ZmZlcik7XG5cbi8qIEphdmFTY3JpcHQgbnVtYmVycyBhcmUgZW5jb2RlZCBieSBvdXRwdXR0aW5nIHRoZSBiYXNlLTE2Ki9cbi8qIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBiaW5hcnkgdmFsdWUgb2YgdGhlIHVuZGVybHlpbmcgSUVFRSBmbG9hdGluZyBwb2ludCovXG4vKiByZXByZXNlbnRhdGlvbi4gIEZvciBuZWdhdGl2ZSB2YWx1ZXMsIGFsbCBiaXRzIG9mIHRoaXMgcmVwcmVzZW50YXRpb24gYXJlKi9cbi8qIGNvbXBsZW1lbnRlZCBwcmlvciB0byB0aGUgYmFzZS0xNiBjb252ZXJzaW9uLCB3aGlsZSBmb3IgcG9zaXRpdmUgdmFsdWVzLCB0aGUqL1xuLyogc2lnbiBiaXQgaXMgY29tcGxlbWVudGVkLiAgVGhpcyBlbnN1cmVzIGJvdGggdGhhdCBuZWdhdGl2ZSB2YWx1ZXMgc29ydCBiZWZvcmUqL1xuLyogcG9zaXRpdmUgdmFsdWVzIGFuZCB0aGF0IG5lZ2F0aXZlIHZhbHVlcyBzb3J0IGFjY29yZGluZyB0byB0aGVpciBuZWdhdGl2ZSovXG4vKiBtYWduaXR1ZGUgcmF0aGVyIHRoYW4gdGhlaXIgcG9zaXRpdmUgbWFnbml0dWRlLiAgVGhpcyByZXN1bHRzIGluIGFuIEFTQ0lJKi9cbi8qIGVuY29kaW5nIHdob3NlIGxleGljb2dyYXBoaWMgc29ydCBvcmRlciBpcyB0aGUgc2FtZSBhcyB0aGUgbnVtZXJpYyBzb3J0IG9yZGVyKi9cbi8qIG9mIHRoZSBjb3JyZXNwb25kaW5nIG51bWJlcnMuKi9cblxuLyogVE9ETyBDaG9vc2UgdGhlIHNhbWUgY2Fub25pY2FsIE5hTiBlbmNvZGluZyB0aGF0IGNvc21XYXNtIGFuZCBld2FzbSBjaG9zZS4qL1xuY29uc3QgQ2Fub25pY2FsTmFOQml0cz0nZmZmODAwMDAwMDAwMDAwMCc7XG5cbmNvbnN0IGVuY29kZUJpbmFyeTY0PShuKT0+e1xuLyogTm9ybWFsaXplIC0wIHRvIDAgYW5kIE5hTiB0byBhIGNhbm9uaWNhbCBlbmNvZGluZyovXG5pZihpcyhuLC0wKSl7XG5uPTA7XG4gfWVsc2UgaWYoaXMobixOYU4pKXtcbnJldHVybiBgZiR7Q2Fub25pY2FsTmFOQml0c31gO1xuIH1cbmFzTnVtYmVyWzBdPW47XG5sZXQgYml0cz1hc0JpdHNbMF07XG5pZihuPDApe1xuYml0c149MHhmZmZmZmZmZmZmZmZmZmZmbjtcbiB9ZWxzZXtcbmJpdHNePTB4ODAwMDAwMDAwMDAwMDAwMG47XG4gfVxucmV0dXJuIGBmJHt6ZXJvUGFkKGJpdHMudG9TdHJpbmcoMTYpLDE2KX1gO1xuIH07XG5cbmNvbnN0IGRlY29kZUJpbmFyeTY0PShlbmNvZGVkKT0+e1xuZW5jb2RlZC5zdGFydHNXaXRoKCdmJyl8fFxuYXNzZXJ0LmZhaWwoWCBgRW5jb2RlZCBudW1iZXIgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gKTtcbmxldCBiaXRzPUJpZ0ludCggYDB4JHtlbmNvZGVkLnN1YnN0cmluZygxKX1gKTtcbmlmKGVuY29kZWRbMV08JzgnKXtcbmJpdHNePTB4ZmZmZmZmZmZmZmZmZmZmZm47XG4gfWVsc2V7XG5iaXRzXj0weDgwMDAwMDAwMDAwMDAwMDBuO1xuIH1cbmFzQml0c1swXT1iaXRzO1xuY29uc3QgcmVzdWx0PWFzTnVtYmVyWzBdO1xuIWlzKHJlc3VsdCwtMCl8fGFzc2VydC5mYWlsKFggYFVuZXhwZWN0ZWQgbmVnYXRpdmUgemVybzogJHtlbmNvZGVkfWApO1xucmV0dXJuIHJlc3VsdDtcbiB9O1xuXG4vKiBKYXZhU2NyaXB0IGJpZ2ludHMgYXJlIGVuY29kZWQgdXNpbmcgYSB2YXJpYW50IG9mIEVsaWFzIGRlbHRhIGNvZGluZywgd2l0aCBhbiovXG4vKiBpbml0aWFsIGNvbXBvbmVudCBmb3IgdGhlIGxlbmd0aCBvZiB0aGUgZGlnaXQgY291bnQgYXMgYSB1bmFyeSBzdHJpbmcsIGEqL1xuLyogc2Vjb25kIGNvbXBvbmVudCBmb3IgdGhlIGRlY2ltYWwgZGlnaXQgY291bnQsIGFuZCBhIHRoaXJkIGNvbXBvbmVudCBmb3IgdGhlKi9cbi8qIGRlY2ltYWwgZGlnaXRzIHByZWNlZGVkIGJ5IGEgZ3JhdHVpdG91cyBzZXBhcmF0aW5nIGNvbG9uLiovXG4vKiBUbyBlbnN1cmUgdGhhdCB0aGUgbGV4aWNvZ3JhcGhpYyBzb3J0IG9yZGVyIG9mIGVuY29kZWQgdmFsdWVzIG1hdGNoZXMgdGhlKi9cbi8qIG51bWVyaWMgc29ydCBvcmRlciBvZiB0aGUgY29ycmVzcG9uZGluZyBudW1iZXJzLCB0aGUgY2hhcmFjdGVycyBvZiB0aGUgdW5hcnkqL1xuLyogcHJlZml4IGFyZSBkaWZmZXJlbnQgZm9yIG5lZ2F0aXZlIHZhbHVlcyAodHlwZSBcIm5cIiBmb2xsb3dlZCBieSBhbnkgbnVtYmVyIG9mKi9cbi8qIFwiI1wicyBbd2hpY2ggc29ydCBiZWZvcmUgZGVjaW1hbCBkaWdpdHNdKSB2cy4gcG9zaXRpdmUgYW5kIHplcm8gdmFsdWVzICh0eXBlKi9cbi8qIFwicFwiIGZvbGxvd2VkIGJ5IGFueSBudW1iZXIgb2YgXCJ+XCJzIFt3aGljaCBzb3J0IGFmdGVyIGRlY2ltYWwgZGlnaXRzXSkgYW5kKi9cbi8qIGVhY2ggZGVjaW1hbCBkaWdpdCBvZiB0aGUgZW5jb2RpbmcgZm9yIGEgbmVnYXRpdmUgdmFsdWUgaXMgcmVwbGFjZWQgd2l0aCBpdHMqL1xuLyogdGVuJ3MgY29tcGxlbWVudCAoc28gdGhhdCBuZWdhdGl2ZSB2YWx1ZXMgb2YgdGhlIHNhbWUgc2NhbGUgc29ydCBieSovXG4vKiAqZGVzY2VuZGluZyogYWJzb2x1dGUgdmFsdWUpLiovXG5jb25zdCBlbmNvZGVCaWdJbnQ9KG4pPT57XG5jb25zdCBhYnM9bjwwbj8tbjpuO1xuY29uc3QgbkRpZ2l0cz1hYnMudG9TdHJpbmcoKS5sZW5ndGg7XG5jb25zdCBsRGlnaXRzPW5EaWdpdHMudG9TdHJpbmcoKS5sZW5ndGg7XG5pZihuPDBuKXtcbnJldHVybiBgbiR7XG4vKiBBIFwiI1wiIGZvciBlYWNoIGRpZ2l0IGJleW9uZCB0aGUgZmlyc3QqL1xuLyogaW4gdGhlIGRlY2ltYWwgKmNvdW50KiBvZiBkZWNpbWFsIGRpZ2l0cy4qL1xuJyMnLnJlcGVhdChsRGlnaXRzLTEpXG4gfSR7XG4vKiBUaGUgdGVuJ3MgY29tcGxlbWVudCBvZiB0aGUgY291bnQgb2YgZGlnaXRzLiovXG4oMTAqKmxEaWdpdHMtbkRpZ2l0cykudG9TdHJpbmcoKS5wYWRTdGFydChsRGlnaXRzLCcwJylcbiB9OiR7XG4vKiBUaGUgdGVuJ3MgY29tcGxlbWVudCBvZiB0aGUgZGlnaXRzLiovXG4oMTBuKipCaWdJbnQobkRpZ2l0cykrbikudG9TdHJpbmcoKS5wYWRTdGFydChuRGlnaXRzLCcwJylcbiB9YDtcbiB9ZWxzZXtcbnJldHVybiBgcCR7XG4vKiBBIFwiflwiIGZvciBlYWNoIGRpZ2l0IGJleW9uZCB0aGUgZmlyc3QqL1xuLyogaW4gdGhlIGRlY2ltYWwgKmNvdW50KiBvZiBkZWNpbWFsIGRpZ2l0cy4qL1xuJ34nLnJlcGVhdChsRGlnaXRzLTEpXG4gfSR7XG4vKiBUaGUgY291bnQgb2YgZGlnaXRzLiovXG5uRGlnaXRzXG4gfToke1xuLyogVGhlIGRpZ2l0cy4qL1xublxuIH1gO1xuIH1cbiB9O1xuXG5jb25zdCBkZWNvZGVCaWdJbnQ9KGVuY29kZWQpPT57XG5jb25zdCB0eXBlUHJlZml4PWVuY29kZWQuY2hhckF0KDApOy8qIGZhc3RlciB0aGFuIGVuY29kZWRbMF0qL1xubGV0IHJlbT1lbmNvZGVkLnNsaWNlKDEpO1xudHlwZVByZWZpeD09PSdwJ3x8XG50eXBlUHJlZml4PT09J24nfHxcbmFzc2VydC5mYWlsKFggYEVuY29kZWQgYmlnaW50IGV4cGVjdGVkOiAke2VuY29kZWR9YCk7XG5cbmNvbnN0IGxEaWdpdHM9cmVtLnNlYXJjaCgvWzAtOV0vKSsxO1xubERpZ2l0cz49MXx8YXNzZXJ0LmZhaWwoWCBgRGlnaXQgY291bnQgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gKTtcbnJlbT1yZW0uc2xpY2UobERpZ2l0cy0xKTtcblxucmVtLmxlbmd0aD49bERpZ2l0c3x8XG5hc3NlcnQuZmFpbChYIGBDb21wbGV0ZSBkaWdpdCBjb3VudCBleHBlY3RlZDogJHtlbmNvZGVkfWApO1xuY29uc3Qgc25EaWdpdHM9cmVtLnNsaWNlKDAsbERpZ2l0cyk7XG5yZW09cmVtLnNsaWNlKGxEaWdpdHMpO1xuL15bMC05XSskLy50ZXN0KHNuRGlnaXRzKXx8XG5hc3NlcnQuZmFpbChYIGBEZWNpbWFsIGRpZ2l0IGNvdW50IGV4cGVjdGVkOiAke2VuY29kZWR9YCk7XG5sZXQgbkRpZ2l0cz1wYXJzZUludChzbkRpZ2l0cywxMCk7XG5pZih0eXBlUHJlZml4PT09J24nKXtcbi8qIFRPRE8gQXNzZXJ0IHRvIHJlamVjdCBmb3JiaWRkZW4gZW5jb2RpbmdzKi9cbi8qIGxpa2UgXCJuMDpcIiBhbmQgXCJuMDA64oCmXCIgYW5kIFwibjkxOuKAplwiIHRocm91Z2ggXCJuOTk64oCmXCI/Ki9cbm5EaWdpdHM9MTAqKmxEaWdpdHMtbkRpZ2l0cztcbiB9XG5cbnJlbS5zdGFydHNXaXRoKCc6Jyl8fGFzc2VydC5mYWlsKFggYFNlcGFyYXRvciBleHBlY3RlZDogJHtlbmNvZGVkfWApO1xucmVtPXJlbS5zbGljZSgxKTtcbnJlbS5sZW5ndGg9PT1uRGlnaXRzfHxcbmFzc2VydC5mYWlsKFggYEZpeGVkLWxlbmd0aCBkaWdpdCBzZXF1ZW5jZSBleHBlY3RlZDogJHtlbmNvZGVkfWApO1xubGV0IG49QmlnSW50KHJlbSk7XG5pZih0eXBlUHJlZml4PT09J24nKXtcbi8qIFRPRE8gQXNzZXJ0IHRvIHJlamVjdCBmb3JiaWRkZW4gZW5jb2RpbmdzKi9cbi8qIGxpa2UgXCJuOTowXCIgYW5kIFwibjg6MDBcIiBhbmQgXCJuODo5MVwiIHRocm91Z2ggXCJuODo5OVwiPyovXG5uPS0oMTBuKipCaWdJbnQobkRpZ2l0cyktbik7XG4gfVxuXG5yZXR1cm4gbjtcbiB9O1xuXG4vKiBgJ1xcdTAwMDAnYCBpcyB0aGUgdGVybWluYXRvciBhZnRlciBlbGVtZW50cy4qL1xuLyogYCdcXHUwMDAxJ2AgaXMgdGhlIGJhY2tzbGFzaC1saWtlIGVzY2FwZSBjaGFyYWN0ZXIsIGZvciovXG4vKiBlc2NhcGluZyBib3RoIG9mIHRoZXNlIGNoYXJhY3RlcnMuKi9cblxuY29uc3QgZW5jb2RlQXJyYXk9KGFycmF5LGVuY29kZVBhc3NhYmxlKT0+e1xuY29uc3QgY2hhcnM9WydbJ107XG5mb3IoY29uc3QgZWxlbWVudCBvZiBhcnJheSl7XG5jb25zdCBlbmM9ZW5jb2RlUGFzc2FibGUoZWxlbWVudCk7XG5mb3IoY29uc3QgYyBvZiBlbmMpe1xuaWYoYz09PSdcXHUwMDAwJ3x8Yz09PSdcXHUwMDAxJyl7XG5jaGFycy5wdXNoKCdcXHUwMDAxJyk7XG4gfVxuY2hhcnMucHVzaChjKTtcbiB9XG5jaGFycy5wdXNoKCdcXHUwMDAwJyk7XG4gfVxucmV0dXJuIGNoYXJzLmpvaW4oJycpO1xuIH07XG5cbmNvbnN0IGRlY29kZUFycmF5PShlbmNvZGVkLGRlY29kZVBhc3NhYmxlKT0+e1xuZW5jb2RlZC5zdGFydHNXaXRoKCdbJyl8fGFzc2VydC5mYWlsKFggYEVuY29kZWQgYXJyYXkgZXhwZWN0ZWQ6ICR7ZW5jb2RlZH1gKTtcbmNvbnN0IGVsZW1lbnRzPVtdO1xuY29uc3QgZWxlbUNoYXJzPVtdO1xuZm9yKGxldCBpPTE7aTxlbmNvZGVkLmxlbmd0aDtpKz0xKXtcbmNvbnN0IGM9ZW5jb2RlZFtpXTtcbmlmKGM9PT0nXFx1MDAwMCcpe1xuY29uc3QgZW5jb2RlZEVsZW1lbnQ9ZWxlbUNoYXJzLmpvaW4oJycpO1xuZWxlbUNoYXJzLmxlbmd0aD0wO1xuY29uc3QgZWxlbWVudD1kZWNvZGVQYXNzYWJsZShlbmNvZGVkRWxlbWVudCk7XG5lbGVtZW50cy5wdXNoKGVsZW1lbnQpO1xuIH1lbHNlIGlmKGM9PT0nXFx1MDAwMScpe1xuaSs9MTtcbmk8ZW5jb2RlZC5sZW5ndGh8fFxuYXNzZXJ0LmZhaWwoWCBgdW5leHBlY3RlZCBlbmQgb2YgZW5jb2RpbmcgJHtlbmNvZGVkfWApO1xuY29uc3QgYzI9ZW5jb2RlZFtpXTtcbmMyPT09J1xcdTAwMDAnfHxcbmMyPT09J1xcdTAwMDEnfHxcbmFzc2VydC5mYWlsKFggYFVuZXhwZWN0ZWQgY2hhcmFjdGVyIGFmdGVyIHUwMDAxIGVzY2FwZTogJHtjMn1gKTtcbmVsZW1DaGFycy5wdXNoKGMyKTtcbiB9ZWxzZXtcbmVsZW1DaGFycy5wdXNoKGMpO1xuIH1cbiB9XG5lbGVtQ2hhcnMubGVuZ3RoPT09MHx8XG5hc3NlcnQuZmFpbChYIGBlbmNvZGluZyB0ZXJtaW5hdGVkIGVhcmx5OiAke2VuY29kZWR9YCk7XG5yZXR1cm4gaGFyZGVuKGVsZW1lbnRzKTtcbiB9O1xuXG5jb25zdCBlbmNvZGVSZWNvcmQ9KHJlY29yZCxlbmNvZGVQYXNzYWJsZSk9PntcbmNvbnN0IG5hbWVzPXJlY29yZE5hbWVzKHJlY29yZCk7XG5jb25zdCB2YWx1ZXM9cmVjb3JkVmFsdWVzKHJlY29yZCxuYW1lcyk7XG5yZXR1cm4gYCgke2VuY29kZUFycmF5KGhhcmRlbihbbmFtZXMsdmFsdWVzXSksZW5jb2RlUGFzc2FibGUpfWA7XG4gfTtcblxuY29uc3QgZGVjb2RlUmVjb3JkPShlbmNvZGVkLGRlY29kZVBhc3NhYmxlKT0+e1xuYXNzZXJ0KGVuY29kZWQuc3RhcnRzV2l0aCgnKCcpKTtcbmNvbnN0IGtleXN2YWxzPWRlY29kZUFycmF5KGVuY29kZWQuc3Vic3RyaW5nKDEpLGRlY29kZVBhc3NhYmxlKTtcbmtleXN2YWxzLmxlbmd0aD09PTJ8fFxuYXNzZXJ0LmZhaWwoWCBgZXhwZWN0ZWQga2V5cyx2YWx1ZXMgcGFpcjogJHtlbmNvZGVkfWApO1xuY29uc3Rba2V5cyx2YWxzXT1rZXlzdmFscztcblxucGFzc1N0eWxlT2Yoa2V5cyk9PT0nY29weUFycmF5JyYmXG5wYXNzU3R5bGVPZih2YWxzKT09PSdjb3B5QXJyYXknJiZcbmtleXMubGVuZ3RoPT09dmFscy5sZW5ndGgmJlxua2V5cy5ldmVyeSgoa2V5KT0+dHlwZW9mIGtleT09PSdzdHJpbmcnKXx8XG5hc3NlcnQuZmFpbChYIGBub3QgYSB2YWxpZCByZWNvcmQgZW5jb2Rpbmc6ICR7ZW5jb2RlZH1gKTtcbmNvbnN0IG1hcEVudHJpZXM9a2V5cy5tYXAoKGtleSxpKT0+W2tleSx2YWxzW2ldXSk7XG5jb25zdCByZWNvcmQ9aGFyZGVuKGZyb21FbnRyaWVzKG1hcEVudHJpZXMpKTtcbmFzc2VydFJlY29yZChyZWNvcmQsJ2RlY29kZWQgcmVjb3JkJyk7XG5yZXR1cm4gcmVjb3JkO1xuIH07XG5cbmNvbnN0IGVuY29kZVRhZ2dlZD0odGFnZ2VkLGVuY29kZVBhc3NhYmxlKT0+XG4gYDoke2VuY29kZUFycmF5KGhhcmRlbihbZ2V0VGFnKHRhZ2dlZCksdGFnZ2VkLnBheWxvYWRdKSxlbmNvZGVQYXNzYWJsZSl9YDtcblxuY29uc3QgZGVjb2RlVGFnZ2VkPShlbmNvZGVkLGRlY29kZVBhc3NhYmxlKT0+e1xuYXNzZXJ0KGVuY29kZWQuc3RhcnRzV2l0aCgnOicpKTtcbmNvbnN0IHRhZ3BheWxvYWQ9ZGVjb2RlQXJyYXkoZW5jb2RlZC5zdWJzdHJpbmcoMSksZGVjb2RlUGFzc2FibGUpO1xudGFncGF5bG9hZC5sZW5ndGg9PT0yfHxcbmFzc2VydC5mYWlsKFggYGV4cGVjdGVkIHRhZyxwYXlsb2FkIHBhaXI6ICR7ZW5jb2RlZH1gKTtcbmNvbnN0W3RhZyxwYXlsb2FkXT10YWdwYXlsb2FkO1xucGFzc1N0eWxlT2YodGFnKT09PSdzdHJpbmcnfHxcbmFzc2VydC5mYWlsKFggYG5vdCBhIHZhbGlkIHRhZ2dlZCBlbmNvZGluZzogJHtlbmNvZGVkfWApO1xucmV0dXJuIG1ha2VUYWdnZWQodGFnLHBheWxvYWQpO1xuIH07XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRW5jb2RlT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIHJlbW90YWJsZTogUmVtb3RhYmxlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBzdHJpbmcsXG4gKiApID0+IHN0cmluZ30gW2VuY29kZVJlbW90YWJsZV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBwcm9taXNlOiBQcm9taXNlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBzdHJpbmcsXG4gKiApID0+IHN0cmluZ30gW2VuY29kZVByb21pc2VdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZXJyb3I6IEVycm9yLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBzdHJpbmcsXG4gKiApID0+IHN0cmluZ30gW2VuY29kZUVycm9yXVxuICovXG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGVPcHRpb25zfSBbZW5jb2RlT3B0aW9uc11cbiAqIEByZXR1cm5zIHsocGFzc2FibGU6IFBhc3NhYmxlKSA9PiBzdHJpbmd9XG4gKi9cbi8qIGB5YXJuIGxpbnRgIGNvbXBsYWlucyBoZXJlIGJ1dCBub3QgZm9yIGVxdWl2YWxlbnQgY29kZSBpbiBhZ29yaWMtc2RrLiovXG4vKiBBbHNvLCB2c2NvZGUgZG9lcyBub3QgY29tcGxhaW4uIEhlbmNlIHdlJ3JlIHVzaW5nIGF0LXRzLWlnbm9yZSByYXRoZXIgdGhhbiovXG4vKiBhdC10cy1leHBlY3QtZXJyb3IuIFVzaW5nIGF0LXRzLWlnbm9yZSBzaG91bGQgYWxzbyBnZW5lcmF0ZSBhIGNvbXBsYWludCovXG4vKiB0aGF0IHdlIHNob3VsZCBiZSB1c2luZyBhdC1leHBlY3QtZXJyb3IsIHdoZXJlIHdlIHdvdWxkIG5vcm1hbGx5IG5lZWQqL1xuLyogdG8gc3VwcHJlc3MgdGhhdCBlcnJvciBhcyB3ZWxsLiBIb3dldmVyLCBwZXJoYXBzIHRoYXQgc2Vjb25kIGVycm9yIGN1cnJlbnRseSovXG4vKiBoYXBwZW5zIG9ubHkgaW4gYWdvcmljLXNkaywgYnV0IG5vdCB5ZXQgaW4gZW5kby4gVE9ETyBmaWd1cmUgb3V0IGFuZCBmaXguKi9cbi8qIEB0cy1pZ25vcmUqL1xuY29uc3QgICAgICAgIG1ha2VFbmNvZGVQYXNzYWJsZT0oe1xuZW5jb2RlUmVtb3RhYmxlPShyZW0sXyk9PmFzc2VydC5mYWlsKFggYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gKSxcbmVuY29kZVByb21pc2U9KHByb20sXyk9PmFzc2VydC5mYWlsKFggYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWApLFxuZW5jb2RlRXJyb3I9KGVycixfKT0+YXNzZXJ0LmZhaWwoWCBgZXJyb3IgdW5leHBlY3RlZDogJHtlcnJ9YCl9PVxue30pPT57XG5jb25zdCBlbmNvZGVQYXNzYWJsZT0ocGFzc2FibGUpPT57XG5pZihFcnJvckhlbHBlci5jYW5CZVZhbGlkKHBhc3NhYmxlLCh4KT0+eCkpe1xucmV0dXJuIGVuY29kZUVycm9yKHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbiB9XG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2YocGFzc2FibGUpO1xuc3dpdGNoKHBhc3NTdHlsZSl7XG5jYXNlJ251bGwnOntcbnJldHVybid2JztcbiB9XG5jYXNlJ3VuZGVmaW5lZCc6e1xucmV0dXJuJ3onO1xuIH1cbmNhc2UnbnVtYmVyJzp7XG5yZXR1cm4gZW5jb2RlQmluYXJ5NjQocGFzc2FibGUpO1xuIH1cbmNhc2Unc3RyaW5nJzp7XG5yZXR1cm4gYHMke3Bhc3NhYmxlfWA7XG4gfVxuY2FzZSdib29sZWFuJzp7XG5yZXR1cm4gYGIke3Bhc3NhYmxlfWA7XG4gfVxuY2FzZSdiaWdpbnQnOntcbnJldHVybiBlbmNvZGVCaWdJbnQocGFzc2FibGUpO1xuIH1cbmNhc2UncmVtb3RhYmxlJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlUmVtb3RhYmxlKHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbnJlc3VsdC5zdGFydHNXaXRoKCdyJyl8fFxuYXNzZXJ0LmZhaWwoXG5YIGBpbnRlcm5hbDogUmVtb3RhYmxlIGVuY29kaW5nIG11c3Qgc3RhcnQgd2l0aCBcInJcIjogJHtyZXN1bHR9YCk7XG5cbnJldHVybiByZXN1bHQ7XG4gfVxuY2FzZSdlcnJvcic6e1xuY29uc3QgcmVzdWx0PWVuY29kZUVycm9yKHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbnJlc3VsdC5zdGFydHNXaXRoKCchJyl8fFxuYXNzZXJ0LmZhaWwoXG5YIGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiIVwiOiAke3Jlc3VsdH1gKTtcblxucmV0dXJuIHJlc3VsdDtcbiB9XG5jYXNlJ3Byb21pc2UnOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVQcm9taXNlKHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbnJlc3VsdC5zdGFydHNXaXRoKCc/Jyl8fFxuYXNzZXJ0LmZhaWwoXG5YIGBpbnRlcm5hbDogUHJvbWlzZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCI/XCI6ICR7cmVzdWx0fWApO1xuXG5yZXR1cm4gcmVzdWx0O1xuIH1cbmNhc2Unc3ltYm9sJzp7XG5yZXR1cm4gYHkke25hbWVGb3JQYXNzYWJsZVN5bWJvbChwYXNzYWJsZSl9YDtcbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xucmV0dXJuIGVuY29kZUFycmF5KHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbnJldHVybiBlbmNvZGVSZWNvcmQocGFzc2FibGUsZW5jb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5yZXR1cm4gZW5jb2RlVGFnZ2VkKHBhc3NhYmxlLGVuY29kZVBhc3NhYmxlKTtcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFxuWCBgYSAke3EocGFzc1N0eWxlKX0gY2Fubm90IGJlIHVzZWQgYXMgYSBjb2xsZWN0aW9uIHBhc3NhYmxlYCk7XG5cbiB9fVxuXG4gfTtcbnJldHVybiBoYXJkZW4oZW5jb2RlUGFzc2FibGUpO1xuIH07JGjigI1fb25jZS5tYWtlRW5jb2RlUGFzc2FibGUobWFrZUVuY29kZVBhc3NhYmxlKTtcbmhhcmRlbihtYWtlRW5jb2RlUGFzc2FibGUpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlY29kZU9wdGlvbnNcbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUmVtb3RhYmxlOiBzdHJpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogc3RyaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBSZW1vdGFibGV9IFtkZWNvZGVSZW1vdGFibGVdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFByb21pc2U6IHN0cmluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBzdHJpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IFByb21pc2V9IFtkZWNvZGVQcm9taXNlXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVuY29kZWRFcnJvcjogc3RyaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGU6IHN0cmluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gRXJyb3J9IFtkZWNvZGVFcnJvcl1cbiAqL1xuXG4vKipcbiAqIEBwYXJhbSB7RGVjb2RlT3B0aW9uc30gW2RlY29kZU9wdGlvbnNdXG4gKiBAcmV0dXJucyB7KGVuY29kZWQ6IHN0cmluZykgPT4gUGFzc2FibGV9XG4gKi9cbi8qIGB5YXJuIGxpbnRgIGNvbXBsYWlucyBoZXJlIGJ1dCBub3QgZm9yIGVxdWl2YWxlbnQgY29kZSBpbiBhZ29yaWMtc2RrLiovXG4vKiBBbHNvLCB2c2NvZGUgZG9lcyBub3QgY29tcGxhaW4uIEhlbmNlIHdlJ3JlIHVzaW5nIGF0LXRzLWlnbm9yZSByYXRoZXIgdGhhbiovXG4vKiBhdC10cy1leHBlY3QtZXJyb3IuIFVzaW5nIGF0LXRzLWlnbm9yZSBzaG91bGQgYWxzbyBnZW5lcmF0ZSBhIGNvbXBsYWludCovXG4vKiB0aGF0IHdlIHNob3VsZCBiZSB1c2luZyBhdC1leHBlY3QtZXJyb3IsIHdoZXJlIHdlIHdvdWxkIG5vcm1hbGx5IG5lZWQqL1xuLyogdG8gc3VwcHJlc3MgdGhhdCBlcnJvciBhcyB3ZWxsLiBIb3dldmVyLCBwZXJoYXBzIHRoYXQgc2Vjb25kIGVycm9yIGN1cnJlbnRseSovXG4vKiBoYXBwZW5zIG9ubHkgaW4gYWdvcmljLXNkaywgYnV0IG5vdCB5ZXQgaW4gZW5kby4gVE9ETyBmaWd1cmUgb3V0IGFuZCBmaXguKi9cbi8qIEB0cy1pZ25vcmUqL1xuY29uc3QgICAgICAgIG1ha2VEZWNvZGVQYXNzYWJsZT0oe1xuZGVjb2RlUmVtb3RhYmxlPShyZW0sXyk9PmFzc2VydC5mYWlsKFggYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gKSxcbmRlY29kZVByb21pc2U9KHByb20sXyk9PmFzc2VydC5mYWlsKFggYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWApLFxuZGVjb2RlRXJyb3I9KGVycixfKT0+YXNzZXJ0LmZhaWwoWCBgZXJyb3IgdW5leHBlY3RlZDogJHtlcnJ9YCl9PVxue30pPT57XG5jb25zdCBkZWNvZGVQYXNzYWJsZT0oZW5jb2RlZCk9PntcbnN3aXRjaChlbmNvZGVkLmNoYXJBdCgwKSl7XG5jYXNlJ3YnOntcbnJldHVybiBudWxsO1xuIH1cbmNhc2Uneic6e1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5jYXNlJ2YnOntcbnJldHVybiBkZWNvZGVCaW5hcnk2NChlbmNvZGVkKTtcbiB9XG5jYXNlJ3MnOntcbnJldHVybiBlbmNvZGVkLnN1YnN0cmluZygxKTtcbiB9XG5jYXNlJ2InOntcbnJldHVybiBlbmNvZGVkLnN1YnN0cmluZygxKSE9PSdmYWxzZSc7XG4gfVxuY2FzZSduJzpcbmNhc2UncCc6e1xucmV0dXJuIGRlY29kZUJpZ0ludChlbmNvZGVkKTtcbiB9XG5jYXNlJ3InOntcbnJldHVybiBkZWNvZGVSZW1vdGFibGUoZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk7XG4gfVxuY2FzZSc/Jzp7XG5yZXR1cm4gZGVjb2RlUHJvbWlzZShlbmNvZGVkLGRlY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJyEnOntcbnJldHVybiBkZWNvZGVFcnJvcihlbmNvZGVkLGRlY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJ3knOntcbnJldHVybiBwYXNzYWJsZVN5bWJvbEZvck5hbWUoZW5jb2RlZC5zdWJzdHJpbmcoMSkpO1xuIH1cbmNhc2UnWyc6e1xucmV0dXJuIGRlY29kZUFycmF5KGVuY29kZWQsZGVjb2RlUGFzc2FibGUpO1xuIH1cbmNhc2UnKCc6e1xucmV0dXJuIGRlY29kZVJlY29yZChlbmNvZGVkLGRlY29kZVBhc3NhYmxlKTtcbiB9XG5jYXNlJzonOntcbnJldHVybiBkZWNvZGVUYWdnZWQoZW5jb2RlZCxkZWNvZGVQYXNzYWJsZSk7XG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChYIGBpbnZhbGlkIGRhdGFiYXNlIGtleTogJHtlbmNvZGVkfWApO1xuIH19XG5cbiB9O1xucmV0dXJuIGhhcmRlbihkZWNvZGVQYXNzYWJsZSk7XG4gfTskaOKAjV9vbmNlLm1ha2VEZWNvZGVQYXNzYWJsZShtYWtlRGVjb2RlUGFzc2FibGUpO1xuaGFyZGVuKG1ha2VEZWNvZGVQYXNzYWJsZSk7XG5cbmNvbnN0ICAgICAgICBpc0VuY29kZWRSZW1vdGFibGU9KGVuY29kZWQpPT5lbmNvZGVkLmNoYXJBdCgwKT09PSdyJzskaOKAjV9vbmNlLmlzRW5jb2RlZFJlbW90YWJsZShpc0VuY29kZWRSZW1vdGFibGUpO1xuaGFyZGVuKGlzRW5jb2RlZFJlbW90YWJsZSk7XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vKi9cblxuLyoqXG4gKiBAdHlwZSB7UmVjb3JkPFBhc3NTdHlsZSwgc3RyaW5nPn1cbiAqIFRoZSBzaW5nbGUgcHJlZml4IGNoYXJhY3RlcnMgdG8gYmUgdXNlZCBmb3IgZWFjaCBQYXNzU3R5bGUgY2F0ZWdvcnkuXG4gKiBgYmlnaW50YCBpcyBhIHR3byBjaGFyYWN0ZXIgc3RyaW5nIGJlY2F1c2UgZWFjaCBvZiB0aG9zZSBjaGFyYWN0ZXJzXG4gKiBpbmRpdmlkdWFsbHkgaXMgYSB2YWxpZCBiaWdpbnQgcHJlZml4LiBgbmAgZm9yIFwibmVnYXRpdmVcIiBhbmQgYHBgIGZvclxuICogXCJwb3NpdGl2ZVwiLiBUaGUgb3JkZXJpbmcgb2YgdGhlc2UgcHJlZml4ZXMgaXMgdGhlIHNhbWUgYXMgdGhlXG4gKiByYW5rT3JkZXJpbmcgb2YgdGhlaXIgcmVzcGVjdGl2ZSBQYXNzU3R5bGVzLiBUaGlzIHRhYmxlIGlzIGltcG9ydGVkIGJ5XG4gKiByYW5kT3JkZXIuanMgZm9yIHRoaXMgcHVycG9zZS5cbiAqXG4gKiBJbiBhZGRpdGlvbiwgYHxgIGlzIHRoZSByZW1vdGFibGUtPm9yZGluYWwgbWFwcGluZyBwcmVmaXg6XG4gKiBUaGlzIGlzIG5vdCB1c2VkIGluIGNvdmVycyBidXQgaXQgaXNcbiAqIHJlc2VydmVkIGZyb20gdGhlIHNhbWUgc2V0IG9mIHN0cmluZ3MuIE5vdGUgdGhhdCB0aGUgcHJlZml4IGlzID4gYW55XG4gKiBwcmVmaXggdXNlZCBieSBhbnkgY292ZXIgc28gdGhhdCBvcmRpbmFsIG1hcHBpbmcga2V5cyBhcmUgYWx3YXlzIG91dHNpZGVcbiAqIHRoZSByYW5nZSBvZiB2YWxpZCBjb2xsZWN0aW9uIGVudHJ5IGtleXMuXG4gKi9cbmNvbnN0ICAgICAgICBwYXNzU3R5bGVQcmVmaXhlcz1oYXJkZW4oe1xuX19wcm90b19fOm51bGwsXG5lcnJvcjonIScsXG5jb3B5UmVjb3JkOicoJyxcbnRhZ2dlZDonOicsXG5wcm9taXNlOic/JyxcbmNvcHlBcnJheTonWycsXG5ib29sZWFuOidiJyxcbm51bWJlcjonZicsXG5iaWdpbnQ6J25wJyxcbnJlbW90YWJsZToncicsXG5zdHJpbmc6J3MnLFxubnVsbDondicsXG5zeW1ib2w6J3knLFxudW5kZWZpbmVkOid6J30pOyRo4oCNX29uY2UucGFzc1N0eWxlUHJlZml4ZXMocGFzc1N0eWxlUHJlZml4ZXMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InJlY29yZE5hbWVzIjpbInJlY29yZE5hbWVzIl0sInJlY29yZFZhbHVlcyI6WyJyZWNvcmRWYWx1ZXMiXSwiemVyb1BhZCI6WyJ6ZXJvUGFkIl0sIm1ha2VFbmNvZGVQYXNzYWJsZSI6WyJtYWtlRW5jb2RlUGFzc2FibGUiXSwibWFrZURlY29kZVBhc3NhYmxlIjpbIm1ha2VEZWNvZGVQYXNzYWJsZSJdLCJpc0VuY29kZWRSZW1vdGFibGUiOlsiaXNFbmNvZGVkUmVtb3RhYmxlIl0sInBhc3NTdHlsZVByZWZpeGVzIjpbInBhc3NTdHlsZVByZWZpeGVzIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAADDAhnAKQAAACkAAACsAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzeyJpbXBvcnRzIjpbIi4vaGVscGVycy9lcnJvci5qcyIsIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vaGVscGVycy9zeW1ib2wuanMiLCIuL21ha2VUYWdnZWQuanMiLCIuL3Bhc3NTdHlsZU9mLmpzIl0sImV4cG9ydHMiOlsiUUNMQVNTIiwibWFrZURlY29kZUZyb21DYXBEYXRhIiwibWFrZUVuY29kZVRvQ2FwRGF0YSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwYXNzU3R5bGVPZixFcnJvckhlbHBlcixtYWtlVGFnZ2VkLGlzT2JqZWN0LGdldFRhZyxoYXNPd25Qcm9wZXJ0eU9mLGFzc2VydFBhc3NhYmxlU3ltYm9sLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWU7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9lcnJvci5qc1wiLCBbW1wiRXJyb3JIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKEVycm9ySGVscGVyID0gJGjigI1fYSldXV1dLFtcIi4vbWFrZVRhZ2dlZC5qc1wiLCBbW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV0sW1wiZ2V0VGFnXCIsIFskaOKAjV9hID0+IChnZXRUYWcgPSAkaOKAjV9hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3N5bWJvbC5qc1wiLCBbW1wiYXNzZXJ0UGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlU3ltYm9sID0gJGjigI1fYSldXSxbXCJuYW1lRm9yUGFzc2FibGVTeW1ib2xcIiwgWyRo4oCNX2EgPT4gKG5hbWVGb3JQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV0sW1wicGFzc2FibGVTeW1ib2xGb3JOYW1lXCIsIFskaOKAjV9hID0+IChwYXNzYWJsZVN5bWJvbEZvck5hbWUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRW5jb2Rpbmd9IEVuY29kaW5nICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5SZW1vdGFibGV9IFJlbW90YWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuRW5jb2RpbmdVbmlvbn0gRW5jb2RpbmdVbmlvbiAqL1xuXG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtcbmdldE93blByb3BlcnR5RGVzY3JpcHRvcnMsXG5kZWZpbmVQcm9wZXJ0aWVzLFxuaXMsXG5lbnRyaWVzLFxuZnJvbUVudHJpZXMsXG5mcmVlemV9PVxuT2JqZWN0O1xuY29uc3R7ZGV0YWlsczpYLEZhaWwscXVvdGU6cX09YXNzZXJ0O1xuXG4vKipcbiAqIFNwZWNpYWwgcHJvcGVydHkgbmFtZSB0aGF0IGluZGljYXRlcyBhbiBlbmNvZGluZyB0aGF0IG5lZWRzIHNwZWNpYWxcbiAqIGRlY29kaW5nLlxuICovXG5jb25zdCBRQ0xBU1M9J0BxY2xhc3MnOyRo4oCNX29uY2UuUUNMQVNTKFFDTEFTUyk7XG5cblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSBlbmNvZGVkXG4gKiBAcmV0dXJucyB7ZW5jb2RlZCBpcyBFbmNvZGluZ1VuaW9ufVxuICovXG5jb25zdCBoYXNRQ2xhc3M9KGVuY29kZWQpPT5oYXNPd25Qcm9wZXJ0eU9mKGVuY29kZWQsUUNMQVNTKTtcblxuLyoqXG4gKiBAcGFyYW0ge0VuY29kaW5nfSBlbmNvZGVkXG4gKiBAcGFyYW0ge3N0cmluZ30gcWNsYXNzXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuY29uc3QgcWNsYXNzTWF0Y2hlcz0oZW5jb2RlZCxxY2xhc3MpPT5cbmlzT2JqZWN0KGVuY29kZWQpJiZcbiFpc0FycmF5KGVuY29kZWQpJiZcbmhhc1FDbGFzcyhlbmNvZGVkKSYmXG5lbmNvZGVkW1FDTEFTU109PT1xY2xhc3M7XG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gRW5jb2RlVG9DYXBEYXRhT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIHJlbW90YWJsZTogUmVtb3RhYmxlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ1xuICogKSA9PiBFbmNvZGluZ30gW2VuY29kZVJlbW90YWJsZVRvQ2FwRGF0YV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBwcm9taXNlOiBQcm9taXNlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ1xuICogKSA9PiBFbmNvZGluZ30gW2VuY29kZVByb21pc2VUb0NhcERhdGFdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZXJyb3I6IEVycm9yLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBFbmNvZGluZ1xuICogKSA9PiBFbmNvZGluZ30gW2VuY29kZUVycm9yVG9DYXBEYXRhXVxuICovXG5cbmNvbnN0IGRvbnRFbmNvZGVSZW1vdGFibGVUb0NhcERhdGE9KHJlbSk9PkZhaWwgYHJlbW90YWJsZSB1bmV4cGVjdGVkOiAke3JlbX1gO1xuXG5jb25zdCBkb250RW5jb2RlUHJvbWlzZVRvQ2FwRGF0YT0ocHJvbSk9PkZhaWwgYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVFcnJvclRvQ2FwRGF0YT0oZXJyKT0+RmFpbCBgZXJyb3Igb2JqZWN0IHVuZXhwZWN0ZWQ6ICR7ZXJyfWA7XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGVUb0NhcERhdGFPcHRpb25zfSBlbmNvZGVPcHRpb25zXG4gKiBAcmV0dXJucyB7KHBhc3NhYmxlOiBQYXNzYWJsZSkgPT4gRW5jb2Rpbmd9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRW5jb2RlVG9DYXBEYXRhPSh7XG5lbmNvZGVSZW1vdGFibGVUb0NhcERhdGE9ZG9udEVuY29kZVJlbW90YWJsZVRvQ2FwRGF0YSxcbmVuY29kZVByb21pc2VUb0NhcERhdGE9ZG9udEVuY29kZVByb21pc2VUb0NhcERhdGEsXG5lbmNvZGVFcnJvclRvQ2FwRGF0YT1kb250RW5jb2RlRXJyb3JUb0NhcERhdGF9PVxue30pPT57XG4vKipcbiAqIE11c3QgZW5jb2RlIGB2YWxgIGludG8gcGxhaW4gSlNPTiBkYXRhICpjYW5vbmljYWxseSosIHN1Y2ggdGhhdFxuICogYEpTT04uc3RyaW5naWZ5KGVuY29kZSh2MSkpID09PSBKU09OLnN0cmluZ2lmeShlbmNvZGUodjEpKWAuIEZvciBtb3N0XG4gKiBlbmNvZGluZ3MsIHRoZSBvcmRlciBvZiBwcm9wZXJ0aWVzIG9mIGVhY2ggbm9kZSBvZiB0aGUgb3V0cHV0XG4gKiBzdHJ1Y3R1cmUgaXMgZGV0ZXJtaW5lZCBieSB0aGUgYWxnb3JpdGhtIGJlbG93IHdpdGhvdXQgc3BlY2lhbFxuICogYXJyYW5nZW1lbnQsIHVzdWFsbHkgYnkgYmVpbmcgZXhwcmVzc2VkIGRpcmVjdGx5IGFzIGFuIG9iamVjdCBsaXRlcmFsLlxuICogVGhlIGV4Y2VwdGlvbiBpcyBjb3B5UmVjb3Jkcywgd2hvc2UgbmF0dXJhbCBlbnVtZXJhdGlvbiBvcmRlclxuICogY2FuIGRpZmZlciBiZXR3ZWVuIGNvcHlSZWNvcmRzIHRoYXQgb3VyIGRpc3RyaWJ1dGVkIG9iamVjdCBzZW1hbnRpY3NcbiAqIGNvbnNpZGVycyB0byBiZSBlcXVpdmFsZW50LlxuICogU2luY2UsIGZvciBlYWNoIGNvcHlSZWNvcmQsIHdlIG9ubHkgYWNjZXB0IHN0cmluZyBwcm9wZXJ0eSBuYW1lcyxcbiAqIG5vdCBzeW1ib2xzLCB3ZSBjYW4gY2Fub25pY2FsbHkgc29ydCB0aGUgbmFtZXMgZmlyc3QuXG4gKiBKU09OLnN0cmluZ2lmeSB3aWxsIHRoZW4gdmlzaXQgdGhlc2UgaW4gdGhhdCBzb3J0ZWQgb3JkZXIuXG4gKlxuICogRW5jb2Rpbmcgd2l0aCBhIGNhbm9uaWNhbC1KU09OIGVuY29kZXIgd291bGQgYWxzbyBzb2x2ZSB0aGlzIGNhbm9uaWNhbG5lc3NcbiAqIHByb2JsZW0gaW4gYSBtb3JlIG1vZHVsYXIgYW5kIGVuY2Fwc3VsYXRlZCBtYW5uZXIuIE5vdGUgdGhhdCB0aGVcbiAqIGFjdHVhbCBvcmRlciBwcm9kdWNlZCBoZXJlLCB0aG91Z2ggaXQgYWdyZWVzIHdpdGggY2Fub25pY2FsLUpTT04gb25cbiAqIGNvcHlSZWNvcmQgcHJvcGVydHkgb3JkZXJpbmcsIGRpZmZlcnMgZnJvbSBjYW5vbmljYWwtSlNPTiBhcyBhIHdob2xlXG4gKiBpbiB0aGF0IHRoZSBvdGhlciByZWNvcmQgcHJvcGVydGllcyBhcmUgdmlzaXRlZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2hcbiAqIHRoZXkgYXJlIGxpdGVyYWxseSB3cml0dGVuIGJlbG93LiBUT0RPIHBlcmhhcHMgd2Ugc2hvdWxkIGluZGVlZCBzd2l0Y2hcbiAqIHRvIGEgY2Fub25pY2FsIEpTT04gZW5jb2RlciwgYW5kIG5vdCBkZWxpY2F0ZXRseSBkZXBlbmQgb24gdGhlIG9yZGVyXG4gKiBpbiB3aGljaCB0aGVzZSBvYmplY3QgbGl0ZXJhbHMgYXJlIHdyaXR0ZW4uXG4gKlxuICogUmVhZGVycyBtdXN0IG5vdCBjYXJlIGFib3V0IHRoaXMgb3JkZXIgYW55d2F5LiBXZSBpbXBvc2UgdGhpcyByZXF1aXJlbWVudFxuICogbWFpbmx5IHRvIHJlZHVjZSBub24tZGV0ZXJtaW5pc20gZXhwb3NlZCBvdXRzaWRlIGEgdmF0LlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhc3NhYmxlXG4gKiBAcmV0dXJucyB7RW5jb2Rpbmd9IGV4Y2VwdCB0aGF0IGBlbmNvZGVUb0NhcERhdGFgIGRvZXMgbm90IGdlbmVyYWxseVxuICogYGhhcmRlbmAgdGhpcyByZXN1bHQgYmVmb3JlIHJldHVybmluZy4gUmF0aGVyLCBgZW5jb2RlVG9DYXBEYXRhYCBpcyBub3RcbiAqIGRpcmVjdGx5IGV4cG9zZWQuXG4gKiBXaGF0J3MgZXhwb3NlZCBpbnN0ZWFkIGlzIGEgd3JhcHBlciB0aGF0IGZyZWV6ZXMgdGhlIG91dHB1dCBiZWZvcmVcbiAqIHJldHVybmluZy4gSWYgdGhpcyB0dXJucyBvdXQgdG8gaW1wZWRlIHN0YXRpYyBhbmFseXNpcyBmb3IgYGhhcmRlbmAgc2FmZXR5LFxuICogd2UgY2FuIGFsd2F5cyBwdXQgdGhlIChub3cgcmVkdW5kYW50KSBoYXJkZW5zIGJhY2sgaW4uIFRoZXkgZG9uJ3QgaHVydC5cbiAqL1xuY29uc3QgZW5jb2RlVG9DYXBEYXRhUmVjdXI9KHBhc3NhYmxlKT0+e1xuLyogRmlyc3Qgd2UgaGFuZGxlIGFsbCBwcmltaXRpdmVzLiBTb21lIGNhbiBiZSByZXByZXNlbnRlZCBkaXJlY3RseSBhcyovXG4vKiBKU09OLCBhbmQgc29tZSBtdXN0IGJlIGVuY29kZWQgYXMgW1FDTEFTU10gY29tcG9zaXRlcy4qL1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdudWxsJzp7XG5yZXR1cm4gbnVsbDtcbiB9XG5jYXNlJ3VuZGVmaW5lZCc6e1xucmV0dXJue1tRQ0xBU1NdOid1bmRlZmluZWQnfTtcbiB9XG5jYXNlJ3N0cmluZyc6XG5jYXNlJ2Jvb2xlYW4nOntcbnJldHVybiBwYXNzYWJsZTtcbiB9XG5jYXNlJ251bWJlcic6e1xuaWYoTnVtYmVyLmlzTmFOKHBhc3NhYmxlKSl7XG5yZXR1cm57W1FDTEFTU106J05hTid9O1xuIH1cbmlmKGlzKHBhc3NhYmxlLC0wKSl7XG5yZXR1cm4gMDtcbiB9XG5pZihwYXNzYWJsZT09PUluZmluaXR5KXtcbnJldHVybntbUUNMQVNTXTonSW5maW5pdHknfTtcbiB9XG5pZihwYXNzYWJsZT09PS1JbmZpbml0eSl7XG5yZXR1cm57W1FDTEFTU106Jy1JbmZpbml0eSd9O1xuIH1cbnJldHVybiBwYXNzYWJsZTtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xucmV0dXJue1xuW1FDTEFTU106J2JpZ2ludCcsXG5kaWdpdHM6U3RyaW5nKHBhc3NhYmxlKX07XG5cbiB9XG5jYXNlJ3N5bWJvbCc6e1xuYXNzZXJ0UGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xuY29uc3QgbmFtZT0vKiogQHR5cGUge3N0cmluZ30gKi9uYW1lRm9yUGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xucmV0dXJue1xuW1FDTEFTU106J3N5bWJvbCcsXG5uYW1lfTtcblxuIH1cbmNhc2UnY29weVJlY29yZCc6e1xuaWYoaGFzT3duUHJvcGVydHlPZihwYXNzYWJsZSxRQ0xBU1MpKXtcbi8qIEhpbGJlcnQgaG90ZWwqL1xuY29uc3R7W1FDTEFTU106cWNsYXNzVmFsdWUsLi4ucmVzdH09cGFzc2FibGU7XG4vKiogQHR5cGUge0VuY29kaW5nfSAqL1xuY29uc3QgcmVzdWx0PXtcbltRQ0xBU1NdOidoaWxiZXJ0Jyxcbm9yaWdpbmFsOmVuY29kZVRvQ2FwRGF0YVJlY3VyKHFjbGFzc1ZhbHVlKX07XG5cbmlmKG93bktleXMocmVzdCkubGVuZ3RoPj0xKXtcbi8qIFdlIGhhcmRlbiB0aGUgZW50aXJlIGNhcERhdGEgZW5jb2RpbmcgYmVmb3JlIHdlIHJldHVybiBpdC4qL1xuLyogYGVuY29kZVRvQ2FwRGF0YWAgcmVxdWlyZXMgdGhhdCBpdHMgaW5wdXQgYmUgUGFzc2FibGUsIGFuZCovXG4vKiB0aGVyZWZvcmUgaGFyZGVuZWQuKi9cbi8qIFRoZSBgZnJlZXplYCBoZXJlIGlzIG5lZWRlZCBhbnl3YXksIGJlY2F1c2UgdGhlIGByZXN0YCBpcyovXG4vKiBmcmVzaGx5IGNvbnN0cnVjdGVkIGJ5IHRoZSBgLi4uYCBhYm92ZSwgYW5kIHdlJ3JlIHVzaW5nIGl0Ki9cbi8qIGFzIGltcHV0IGluIGFub3RoZXIgY2FsbCB0byBgZW5jb2RlVG9DYXBEYXRhYC4qL1xucmVzdWx0LnJlc3Q9ZW5jb2RlVG9DYXBEYXRhUmVjdXIoZnJlZXplKHJlc3QpKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH1cbi8qIEN1cnJlbnRseSBjb3B5UmVjb3JkIGFsbG93cyBvbmx5IHN0cmluZyBrZXlzIHNvIHRoaXMgd2lsbCovXG4vKiB3b3JrLiBJZiB3ZSBhbGxvdyBzb3J0YWJsZSBzeW1ib2wga2V5cywgdGhpcyB3aWxsIG5lZWQgdG8qL1xuLyogYmVjb21lIG1vcmUgaW50ZXJlc3RpbmcuKi9cbmNvbnN0IG5hbWVzPW93bktleXMocGFzc2FibGUpLnNvcnQoKTtcbnJldHVybiBmcm9tRW50cmllcyhcbm5hbWVzLm1hcCgobmFtZSk9PltuYW1lLGVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlW25hbWVdKV0pKTtcblxuIH1cbmNhc2UnY29weUFycmF5Jzp7XG5yZXR1cm4gcGFzc2FibGUubWFwKGVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xucmV0dXJue1xuW1FDTEFTU106J3RhZ2dlZCcsXG50YWc6Z2V0VGFnKHBhc3NhYmxlKSxcbnBheWxvYWQ6ZW5jb2RlVG9DYXBEYXRhUmVjdXIocGFzc2FibGUucGF5bG9hZCl9O1xuXG4gfVxuY2FzZSdyZW1vdGFibGUnOntcbmNvbnN0IGVuY29kZWQ9ZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhKFxucGFzc2FibGUsXG5lbmNvZGVUb0NhcERhdGFSZWN1cik7XG5cbmlmKHFjbGFzc01hdGNoZXMoZW5jb2RlZCwnc2xvdCcpKXtcbnJldHVybiBlbmNvZGVkO1xuIH1cbi8qIGB0aHJvd2AgaXMgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLiBCdXQgbGludGVyIGNvbmZ1c2VkKi9cbnRocm93IEZhaWwgYGludGVybmFsOiBSZW1vdGFibGUgZW5jb2RpbmcgbXVzdCBiZSBhbiBvYmplY3Qgd2l0aCAke3EoXG5RQ0xBU1MpXG4gfSAke3EoJ3Nsb3QnKX06ICR7ZW5jb2RlZH1gO1xuIH1cbmNhc2UncHJvbWlzZSc6e1xuY29uc3QgZW5jb2RlZD1lbmNvZGVQcm9taXNlVG9DYXBEYXRhKHBhc3NhYmxlLGVuY29kZVRvQ2FwRGF0YVJlY3VyKTtcbmlmKHFjbGFzc01hdGNoZXMoZW5jb2RlZCwnc2xvdCcpKXtcbnJldHVybiBlbmNvZGVkO1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBQcm9taXNlIGVuY29kaW5nIG11c3QgYmUgYW4gb2JqZWN0IHdpdGggJHtxKFxuUUNMQVNTLFxuJ3Nsb3QnKVxuIH06ICR7ZW5jb2RlZH1gO1xuIH1cbmNhc2UnZXJyb3InOntcbmNvbnN0IGVuY29kZWQ9ZW5jb2RlRXJyb3JUb0NhcERhdGEocGFzc2FibGUsZW5jb2RlVG9DYXBEYXRhUmVjdXIpO1xuaWYocWNsYXNzTWF0Y2hlcyhlbmNvZGVkLCdlcnJvcicpKXtcbnJldHVybiBlbmNvZGVkO1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdCB3aXRoICR7cShcblFDTEFTUyxcbidlcnJvcicpXG4gfTogJHtlbmNvZGVkfWA7XG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChcblggYGludGVybmFsOiBVbnJlY29nbml6ZWQgcGFzc1N0eWxlICR7cShwYXNzU3R5bGUpfWAsXG5UeXBlRXJyb3IpO1xuXG4gfX1cblxuIH07XG5jb25zdCBlbmNvZGVUb0NhcERhdGE9KHBhc3NhYmxlKT0+e1xuaWYoRXJyb3JIZWxwZXIuY2FuQmVWYWxpZChwYXNzYWJsZSkpe1xuLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgdG8gYWNjb21tb2RhdGUgZXJyb3JzIHRoYXQgYXJlIG5vdCovXG4vKiB2YWxpZCBQYXNzYWJsZXMuIEZvciBleGFtcGxlLCBiZWNhdXNlIHRoZXkncmUgbm90IGZyb3plbi4qL1xuLyogVGhlIHNwZWNpYWwgY2FzZSBjYW4gb25seSBldmVyIGFwcGx5IGF0IHRoZSByb290LCBhbmQgdGhlcmVmb3JlKi9cbi8qIG91dHNpZGUgdGhlIHJlY3Vyc2lvbiwgc2luY2UgYW4gZXJyb3IgY291bGQgb25seSBiZSBkZWVwZXIgaW4qL1xuLyogYSBwYXNzYWJsZSBzdHJ1Y3R1cmUgaWYgaXQgd2VyZSBwYXNzYWJsZS4qL1xuLyoqL1xuLyogV2UgcHVsbCBvdXQgdGhpcyBzcGVjaWFsIGNhc2UgYmVjYXVzZSwgZm9yIHRoZXNlIGVycm9ycywgd2UncmUgbXVjaCovXG4vKiBtb3JlIGludGVyZXN0ZWQgaW4gcmVwb3J0aW5nIHdoYXRldmVyIGRpYWdub3N0aWMgaW5mb3JtYXRpb24gdGhleSovXG4vKiBjYXJyeSB0aGFuIHdlIGFyZSBhYm91dCByZXBvcnRpbmcgcHJvYmxlbXMgZW5jb3VudGVyZWQgaW4gcmVwb3J0aW5nKi9cbi8qIHRoaXMgaW5mb3JtYXRpb24uKi9cbnJldHVybiBoYXJkZW4oZW5jb2RlRXJyb3JUb0NhcERhdGEocGFzc2FibGUsZW5jb2RlVG9DYXBEYXRhUmVjdXIpKTtcbiB9XG5yZXR1cm4gaGFyZGVuKGVuY29kZVRvQ2FwRGF0YVJlY3VyKHBhc3NhYmxlKSk7XG4gfTtcbnJldHVybiBoYXJkZW4oZW5jb2RlVG9DYXBEYXRhKTtcbiB9OyRo4oCNX29uY2UubWFrZUVuY29kZVRvQ2FwRGF0YShtYWtlRW5jb2RlVG9DYXBEYXRhKTtcbmhhcmRlbihtYWtlRW5jb2RlVG9DYXBEYXRhKTtcblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBEZWNvZGVPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFJlbW90YWJsZTogRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IChQcm9taXNlfFJlbW90YWJsZSl9IFtkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YV1cbiAqIEBwcm9wZXJ0eSB7KFxuICogICBlbmNvZGVkUHJvbWlzZTogRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZTogRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IChQcm9taXNlfFJlbW90YWJsZSl9IFtkZWNvZGVQcm9taXNlRnJvbUNhcERhdGFdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZEVycm9yOiBFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlOiBFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gRXJyb3J9IFtkZWNvZGVFcnJvckZyb21DYXBEYXRhXVxuICovXG5cbmNvbnN0IGRvbnREZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YT0oc2xvdEVuY29kaW5nKT0+XG5GYWlsIGByZW1vdGFibGUgb3IgcHJvbWlzZSB1bmV4cGVjdGVkOiAke3Nsb3RFbmNvZGluZ31gO1xuY29uc3QgZG9udERlY29kZUVycm9yRnJvbUNhcERhdGE9KGVycm9yRW5jb2RpbmcpPT5cbkZhaWwgYGVycm9yIHVuZXhwZWN0ZWQ6ICR7ZXJyb3JFbmNvZGluZ31gO1xuXG4vKipcbiAqIFRoZSBjdXJyZW50IGVuY29kaW5nIGRvZXMgbm90IGdpdmUgdGhlIGRlY29kZXIgZW5vdWdoIGludG8gdG8gZGlzdGluZ3Vpc2hcbiAqIHdoZXRoZXIgYSBzbG90IHJlcHJlc2VudHMgYSBwcm9taXNlIG9yIGEgcmVtb3RhYmxlLiBBcyBhbiBpbXBsZW1lbnRhdGlvblxuICogcmVzdHJpY3Rpb24gdW50aWwgdGhpcyBpcyBmaXhlZCwgaWYgZWl0aGVyIGlzIHByb3ZpZGVkLCBib3RoIG11c3QgYmVcbiAqIHByb3ZpZGVkIGFuZCB0aGV5IG11c3QgYmUgdGhlIHNhbWUuXG4gKlxuICogVGhpcyBzZWVtcyBsaWtlIHRoZSBiZXN0IHN0YXJ0aW5nIHBvaW50IHRvIGluY3JlbWVudGFsbHkgZXZvbHZlIHRvIGFuXG4gKiBBUEkgd2hlcmUgdGhlc2UgY2FuIHJlbGlhYmx5IGRpZmZlci5cbiAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQzMzRcbiAqXG4gKiBAcGFyYW0ge0RlY29kZU9wdGlvbnN9IGRlY29kZU9wdGlvbnNcbiAqIEByZXR1cm5zIHsoZW5jb2RlZDogRW5jb2RpbmcpID0+IFBhc3NhYmxlfVxuICovXG5jb25zdCAgICAgICAgbWFrZURlY29kZUZyb21DYXBEYXRhPSh7XG5kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YT1kb250RGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGEsXG5kZWNvZGVQcm9taXNlRnJvbUNhcERhdGE9ZG9udERlY29kZVJlbW90YWJsZU9yUHJvbWlzZUZyb21DYXBEYXRhLFxuZGVjb2RlRXJyb3JGcm9tQ2FwRGF0YT1kb250RGVjb2RlRXJyb3JGcm9tQ2FwRGF0YX09XG57fSk9PntcbmRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhPT09ZGVjb2RlUHJvbWlzZUZyb21DYXBEYXRhfHxcbkZhaWwgYEFuIGltcGxlbWVudGF0aW9uIHJlc3RyaWN0aW9uIGZvciBub3c6IElmIGVpdGhlciBkZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YSBvciBkZWNvZGVQcm9taXNlRnJvbUNhcERhdGEgaXMgcHJvdmlkZWQsIGJvdGggbXVzdCBiZSBwcm92aWRlZCBhbmQgdGhleSBtdXN0IGJlIHRoZSBzYW1lOiAke3EoXG5kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YSlcbiB9IHZzICR7cShkZWNvZGVQcm9taXNlRnJvbUNhcERhdGEpfWA7XG5cbi8qKlxuICogYGRlY29kZUZyb21DYXBEYXRhYCBtYXkgcmVseSBvbiBganNvbkVuY29kZWRgIGJlaW5nIHRoZSByZXN1bHQgb2YgYVxuICogcGxhaW4gY2FsbCB0byBKU09OLnBhcnNlLiBIb3dldmVyLCBpdCAqY2Fubm90KiByZWx5IG9uIGBqc29uRW5jb2RlZGBcbiAqIGhhdmluZyBiZWVuIHByb2R1Y2VkIGJ5IEpTT04uc3RyaW5naWZ5IG9uIHRoZSBvdXRwdXQgb2YgYGVuY29kZVRvQ2FwRGF0YWBcbiAqIGFib3ZlLCBpLmUuLCBgZGVjb2RlRnJvbUNhcERhdGFgIGNhbm5vdCByZWx5IG9uIGBqc29uRW5jb2RlZGAgYmVpbmcgYVxuICogdmFsaWQgbWFyc2hhbGxlZCByZXByZXNlbnRhdGlvbi4gUmF0aGVyLCBgZGVjb2RlRnJvbUNhcERhdGFgIG11c3RcbiAqIHZhbGlkYXRlIHRoYXQuXG4gKlxuICogQHBhcmFtIHtFbmNvZGluZ30ganNvbkVuY29kZWQgbXVzdCBiZSBoYXJkZW5lZFxuICovXG5jb25zdCBkZWNvZGVGcm9tQ2FwRGF0YT0oanNvbkVuY29kZWQpPT57XG5pZighaXNPYmplY3QoanNvbkVuY29kZWQpKXtcbi8qIHByaW1pdGl2ZXMgcGFzcyB0aHJvdWdoKi9cbnJldHVybiBqc29uRW5jb2RlZDtcbiB9XG5pZihpc0FycmF5KGpzb25FbmNvZGVkKSl7XG5yZXR1cm4ganNvbkVuY29kZWQubWFwKChlbmNvZGVkVmFsKT0+ZGVjb2RlRnJvbUNhcERhdGEoZW5jb2RlZFZhbCkpO1xuIH1lbHNlIGlmKGhhc1FDbGFzcyhqc29uRW5jb2RlZCkpe1xuY29uc3QgcWNsYXNzPWpzb25FbmNvZGVkW1FDTEFTU107XG5hc3NlcnQudHlwZW9mKFxucWNsYXNzLFxuJ3N0cmluZycsXG5YIGBpbnZhbGlkICR7cShRQ0xBU1MpfSB0eXBlb2YgJHtxKHR5cGVvZiBxY2xhc3MpfWApO1xuXG5zd2l0Y2gocWNsYXNzKXtcbi8qIEVuY29kaW5nIG9mIHByaW1pdGl2ZXMgbm90IGhhbmRsZWQgYnkgSlNPTiovXG5jYXNlJ3VuZGVmaW5lZCc6e1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5jYXNlJ05hTic6e1xucmV0dXJuIE5hTjtcbiB9XG5jYXNlJ0luZmluaXR5Jzp7XG5yZXR1cm4gSW5maW5pdHk7XG4gfVxuY2FzZSctSW5maW5pdHknOntcbnJldHVybi1JbmZpbml0eTtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xuLyogVXNpbmcgQHRzLWlnbm9yZSByYXRoZXIgdGhhbiBAdHMtZXhwZWN0LWVycm9yIGJlbG93IGJlY2F1c2UqL1xuLyogd2l0aCBAdHMtZXhwZWN0LWVycm9yIEkgZ2V0IGEgcmVkIHVuZGVybGluZSBpbiB2c2NvZGUsIGJ1dCovXG4vKiB3aXRob3V0IGl0IEkgZ2V0IGVycm9ycyBmcm9tIGB5YXJuIGxpbnRgLiovXG4vKiBAdHMtaWdub3JlIGluYWRlcXVhdGUgdHlwZSBpbmZlcmVuY2UqL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lbmRvanMvZW5kby9wdWxsLzEyNTkjZGlzY3Vzc2lvbl9yOTU0NTYxOTAxKi9cbmNvbnN0e2RpZ2l0c309anNvbkVuY29kZWQ7XG5hc3NlcnQudHlwZW9mKFxuZGlnaXRzLFxuJ3N0cmluZycsXG5YIGBpbnZhbGlkIGRpZ2l0cyB0eXBlb2YgJHtxKHR5cGVvZiBkaWdpdHMpfWApO1xuXG5yZXR1cm4gQmlnSW50KGRpZ2l0cyk7XG4gfVxuY2FzZSdAQGFzeW5jSXRlcmF0b3InOntcbi8qIERlcHJlY2F0ZWQgcWNsYXNzLiBUT0RPIG1ha2UgY29uZGl0aW9uYWwqL1xuLyogb24gZW52aXJvbm1lbnQgdmFyaWFibGUuIEV2ZW50dWFsbHkgcmVtb3ZlLCBidXQgYWZ0ZXIgY29uZmlkZW50Ki9cbi8qIHRoYXQgdGhlcmUgYXJlIG5vIG1vcmUgc3VwcG9ydGVkIHNlbmRlcnMuKi9cbi8qKi9cbi8qIFVzaW5nIEB0cy1pZ25vcmUgcmF0aGVyIHRoYW4gQHRzLWV4cGVjdC1lcnJvciBiZWxvdyBiZWNhdXNlKi9cbi8qIHdpdGggQHRzLWV4cGVjdC1lcnJvciBJIGdldCBhIHJlZCB1bmRlcmxpbmUgaW4gdnNjb2RlLCBidXQqL1xuLyogd2l0aG91dCBpdCBJIGdldCBlcnJvcnMgZnJvbSBgeWFybiBsaW50YC4qL1xuLyogQHRzLWlnbm9yZSBpbmFkZXF1YXRlIHR5cGUgaW5mZXJlbmNlKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjU5I2Rpc2N1c3Npb25fcjk1NDU2MTkwMSovXG5yZXR1cm4gU3ltYm9sLmFzeW5jSXRlcmF0b3I7XG4gfVxuY2FzZSdzeW1ib2wnOntcbi8qIFVzaW5nIEB0cy1pZ25vcmUgcmF0aGVyIHRoYW4gQHRzLWV4cGVjdC1lcnJvciBiZWxvdyBiZWNhdXNlKi9cbi8qIHdpdGggQHRzLWV4cGVjdC1lcnJvciBJIGdldCBhIHJlZCB1bmRlcmxpbmUgaW4gdnNjb2RlLCBidXQqL1xuLyogd2l0aG91dCBpdCBJIGdldCBlcnJvcnMgZnJvbSBgeWFybiBsaW50YC4qL1xuLyogQHRzLWlnbm9yZSBpbmFkZXF1YXRlIHR5cGUgaW5mZXJlbmNlKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjU5I2Rpc2N1c3Npb25fcjk1NDU2MTkwMSovXG5jb25zdHtuYW1lfT1qc29uRW5jb2RlZDtcbnJldHVybiBwYXNzYWJsZVN5bWJvbEZvck5hbWUobmFtZSk7XG4gfVxuY2FzZSd0YWdnZWQnOntcbi8qIFVzaW5nIEB0cy1pZ25vcmUgcmF0aGVyIHRoYW4gQHRzLWV4cGVjdC1lcnJvciBiZWxvdyBiZWNhdXNlKi9cbi8qIHdpdGggQHRzLWV4cGVjdC1lcnJvciBJIGdldCBhIHJlZCB1bmRlcmxpbmUgaW4gdnNjb2RlLCBidXQqL1xuLyogd2l0aG91dCBpdCBJIGdldCBlcnJvcnMgZnJvbSBgeWFybiBsaW50YC4qL1xuLyogQHRzLWlnbm9yZSBpbmFkZXF1YXRlIHR5cGUgaW5mZXJlbmNlKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZW5kb2pzL2VuZG8vcHVsbC8xMjU5I2Rpc2N1c3Npb25fcjk1NDU2MTkwMSovXG5jb25zdHt0YWcscGF5bG9hZH09anNvbkVuY29kZWQ7XG5yZXR1cm4gbWFrZVRhZ2dlZCh0YWcsZGVjb2RlRnJvbUNhcERhdGEocGF5bG9hZCkpO1xuIH1cbmNhc2Unc2xvdCc6e1xuLyogU2VlIG5vdGUgYWJvdmUgYWJvdXQgaG93IHRoZSBjdXJyZW50IGVuY29kaW5nIGNhbm5vdCByZWxpYWJseSovXG4vKiBkaXN0aW5ndWlzaCB3aGljaCB3ZSBzaG91bGQgY2FsbCwgc28gaW4gdGhlIG5vbi1kZWZhdWx0IGNhc2UqL1xuLyogYm90aCBtdXN0IGJlIHRoZSBzYW1lIGFuZCBpdCBkb2Vzbid0IG1hdHRlciB3aGljaCB3ZSBjYWxsLiovXG5jb25zdCBkZWNvZGVkPWRlY29kZVJlbW90YWJsZUZyb21DYXBEYXRhKFxuanNvbkVuY29kZWQsXG5kZWNvZGVGcm9tQ2FwRGF0YSk7XG5cbi8qIEJFV0FSRTogY2FwZGF0YSBkb2VzIG5vdCBjaGVjayB0aGF0IGBkZWNvZGVkYCBpcyovXG4vKiBhIHByb21pc2Ugb3IgYSByZW1vdGFibGUsIHNpbmNlIHRoYXQgd291bGQgYnJlYWsgc29tZSovXG4vKiBjYXBkYXRhIGNsaWVudHMuIFdlIGFyZSBkZXByZWNhdGluZyBjYXBkYXRhLCBhbmQgdGhlc2UgY2xpZW50cyovXG4vKiB3aWxsIG5lZWQgdG8gdXBkYXRlIGJlZm9yZSBzd2l0Y2hpbmcgdG8gc21hbGxjYXBzLiovXG5yZXR1cm4gZGVjb2RlZDtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5jb25zdCBkZWNvZGVkPWRlY29kZUVycm9yRnJvbUNhcERhdGEoXG5qc29uRW5jb2RlZCxcbmRlY29kZUZyb21DYXBEYXRhKTtcblxuaWYocGFzc1N0eWxlT2YoZGVjb2RlZCk9PT0nZXJyb3InKXtcbnJldHVybiBkZWNvZGVkO1xuIH1cbnRocm93IEZhaWwgYGludGVybmFsOiBkZWNvZGVFcnJvckZyb21DYXBEYXRhIG9wdGlvbiBtdXN0IHJldHVybiBhbiBlcnJvcjogJHtkZWNvZGVkfWA7XG4gfVxuY2FzZSdoaWxiZXJ0Jzp7XG4vKiBVc2luZyBAdHMtaWdub3JlIHJhdGhlciB0aGFuIEB0cy1leHBlY3QtZXJyb3IgYmVsb3cgYmVjYXVzZSovXG4vKiB3aXRoIEB0cy1leHBlY3QtZXJyb3IgSSBnZXQgYSByZWQgdW5kZXJsaW5lIGluIHZzY29kZSwgYnV0Ki9cbi8qIHdpdGhvdXQgaXQgSSBnZXQgZXJyb3JzIGZyb20gYHlhcm4gbGludGAuKi9cbi8qIEB0cy1pZ25vcmUgaW5hZGVxdWF0ZSB0eXBlIGluZmVyZW5jZSovXG4vKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2VuZG9qcy9lbmRvL3B1bGwvMTI1OSNkaXNjdXNzaW9uX3I5NTQ1NjE5MDEqL1xuY29uc3R7b3JpZ2luYWwscmVzdH09anNvbkVuY29kZWQ7XG5oYXNPd25Qcm9wZXJ0eU9mKGpzb25FbmNvZGVkLCdvcmlnaW5hbCcpfHxcbkZhaWwgYEludmFsaWQgSGlsYmVydCBIb3RlbCBlbmNvZGluZyAke2pzb25FbmNvZGVkfWA7XG4vKiBEb24ndCBoYXJkZW4gc2luY2Ugd2UncmUgbm90IGRvbmUgbXV0YXRpbmcgaXQqL1xuY29uc3QgcmVzdWx0PXtbUUNMQVNTXTpkZWNvZGVGcm9tQ2FwRGF0YShvcmlnaW5hbCl9O1xuaWYoaGFzT3duUHJvcGVydHlPZihqc29uRW5jb2RlZCwncmVzdCcpKXtcbmNvbnN0IGlzTm9uRW1wdHlPYmplY3Q9XG50eXBlb2YgcmVzdD09PSdvYmplY3QnJiZcbnJlc3QhPT1udWxsJiZcbm93bktleXMocmVzdCkubGVuZ3RoPj0xO1xuaXNOb25FbXB0eU9iamVjdHx8XG5GYWlsIGBSZXN0IGVuY29kaW5nIG11c3QgYmUgYSBub24tZW1wdHkgb2JqZWN0OiAke3Jlc3R9YDtcbmNvbnN0IHJlc3RPYmo9ZGVjb2RlRnJvbUNhcERhdGEocmVzdCk7XG4vKiBUT0RPIHJlYWxseSBzaG91bGQgYXNzZXJ0IHRoYXQgYHBhc3NTdHlsZU9mKHJlc3QpYCBpcyovXG4vKiBgJ2NvcHlSZWNvcmQnYCBidXQgd2UnZCBoYXZlIHRvIGhhcmRlbiBpdCBhbmQgaXQgaXMgdG9vKi9cbi8qIGVhcmx5IHRvIGRvIHRoYXQuKi9cbiFoYXNPd25Qcm9wZXJ0eU9mKHJlc3RPYmosUUNMQVNTKXx8XG5GYWlsIGBSZXN0IG11c3Qgbm90IGNvbnRhaW4gaXRzIG93biBkZWZpbml0aW9uIG9mICR7cShRQ0xBU1MpfWA7XG5kZWZpbmVQcm9wZXJ0aWVzKHJlc3VsdCxnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHJlc3RPYmopKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH1cbi8qIEB0cy1leHBlY3QtZXJyb3IgVGhpcyBpcyB0aGUgZXJyb3IgY2FzZSB3ZSdyZSB0ZXN0aW5nIGZvciovXG5jYXNlJ2liaWQnOntcbnRocm93IEZhaWwgYFRoZSBjYXBEYXRhIHByb3RvY29sIG5vIGxvbmdlciBzdXBwb3J0cyAke3EoUUNMQVNTKX0gJHtxKFxucWNsYXNzKVxuIH1gO1xuIH1cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoWCBgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLFR5cGVFcnJvcik7XG4gfX1cblxuIH1lbHNle1xuYXNzZXJ0KHR5cGVvZiBqc29uRW5jb2RlZD09PSdvYmplY3QnJiZqc29uRW5jb2RlZCE9PW51bGwpO1xuY29uc3QgZGVjb2RlRW50cnk9KFtuYW1lLGVuY29kZWRWYWxdKT0+e1xudHlwZW9mIG5hbWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBQcm9wZXJ0eSAke3EobmFtZSl9IG9mICR7anNvbkVuY29kZWR9IG11c3QgYmUgYSBzdHJpbmdgO1xucmV0dXJuW25hbWUsZGVjb2RlRnJvbUNhcERhdGEoZW5jb2RlZFZhbCldO1xuIH07XG5jb25zdCBkZWNvZGVkRW50cmllcz1lbnRyaWVzKGpzb25FbmNvZGVkKS5tYXAoZGVjb2RlRW50cnkpO1xucmV0dXJuIGZyb21FbnRyaWVzKGRlY29kZWRFbnRyaWVzKTtcbiB9XG4gfTtcbnJldHVybiBoYXJkZW4oZGVjb2RlRnJvbUNhcERhdGEpO1xuIH07JGjigI1fb25jZS5tYWtlRGVjb2RlRnJvbUNhcERhdGEobWFrZURlY29kZUZyb21DYXBEYXRhKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJRQ0xBU1MiOlsiUUNMQVNTIl0sIm1ha2VFbmNvZGVUb0NhcERhdGEiOlsibWFrZUVuY29kZVRvQ2FwRGF0YSJdLCJtYWtlRGVjb2RlRnJvbUNhcERhdGEiOlsibWFrZURlY29kZUZyb21DYXBEYXRhIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAMAaDCF5PQAAeT0AAC0AAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvZW5jb2RlVG9TbWFsbGNhcHMuanN7ImltcG9ydHMiOlsiLi9oZWxwZXJzL2Vycm9yLmpzIiwiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9oZWxwZXJzL3N5bWJvbC5qcyIsIi4vbWFrZVRhZ2dlZC5qcyIsIi4vcGFzc1N0eWxlT2YuanMiXSwiZXhwb3J0cyI6WyJtYWtlRGVjb2RlRnJvbVNtYWxsY2FwcyIsIm1ha2VFbmNvZGVUb1NtYWxsY2FwcyJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBwYXNzU3R5bGVPZixFcnJvckhlbHBlcixtYWtlVGFnZ2VkLGdldFRhZyxoYXNPd25Qcm9wZXJ0eU9mLGFzc2VydFBhc3NhYmxlU3ltYm9sLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzYWJsZVN5bWJvbEZvck5hbWU7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9lcnJvci5qc1wiLCBbW1wiRXJyb3JIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKEVycm9ySGVscGVyID0gJGjigI1fYSldXV1dLFtcIi4vbWFrZVRhZ2dlZC5qc1wiLCBbW1wibWFrZVRhZ2dlZFwiLCBbJGjigI1fYSA9PiAobWFrZVRhZ2dlZCA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImdldFRhZ1wiLCBbJGjigI1fYSA9PiAoZ2V0VGFnID0gJGjigI1fYSldXSxbXCJoYXNPd25Qcm9wZXJ0eU9mXCIsIFskaOKAjV9hID0+IChoYXNPd25Qcm9wZXJ0eU9mID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9zeW1ib2wuanNcIiwgW1tcImFzc2VydFBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChhc3NlcnRQYXNzYWJsZVN5bWJvbCA9ICRo4oCNX2EpXV0sW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLCBbJGjigI1fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5SZW1vdGFibGV9IFJlbW90YWJsZSAqL1xuLyogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5TbWFsbGNhcHNFbmNvZGluZ30gU21hbGxjYXBzRW5jb2RpbmcgKlgvKi9cbi8qIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuU21hbGxjYXBzRW5jb2RpbmdVbmlvbn0gU21hbGxjYXBzRW5jb2RpbmdVbmlvbiAqWC8qL1xuLyoqIEB0eXBlZGVmIHthbnl9IFNtYWxsY2Fwc0VuY29kaW5nICovXG4vKiogQHR5cGVkZWYge2FueX0gU21hbGxjYXBzRW5jb2RpbmdVbmlvbiAqL1xuXG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtpcyxlbnRyaWVzLGZyb21FbnRyaWVzfT1PYmplY3Q7XG5jb25zdHtkZXRhaWxzOlgsRmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5cbmNvbnN0IEJBTkc9JyEnLmNoYXJDb2RlQXQoMCk7XG5jb25zdCBEQVNIPSctJy5jaGFyQ29kZUF0KDApO1xuXG4vKipcbiAqIEFuIGBlbmNvZGVUb1NtYWxsY2Fwc2AgZnVuY3Rpb24gdGFrZXMgYSBwYXNzYWJsZSBhbmQgcmV0dXJucyBhXG4gKiBKU09OLXJlcHJlc2VudGFibGUgb2JqZWN0IChpLmUuLCByb3VuZC10cmlwcGluZyBpdCB0aHJvdWdoXG4gKiBgSlNPTi5zdHJpbmdpZnlgIGFuZCBgSlNPTi5wYXJzZWAgd2l0aCBubyByZXBsYWNlcnMgb3IgcmV2aXZlcnNcbiAqIHJldHVybnMgYW4gZXF1aXZhbGVudCBzdHJ1Y3R1cmUgZXhjZXB0IGZvciBvYmplY3QgaWRlbnRpdHkpLlxuICogV2UgY2FsbCB0aGlzIHJlcHJlc2VudGF0aW9uIGEgU21hbGxjYXBzIEVuY29kaW5nLlxuICpcbiAqIEEgYGRlY29kZUZyb21TbWFsbGNhcHNgIGZ1bmN0aW9uIHRha2VzIGFzIGFyZ3VtZW50IHdoYXQgaXRcbiAqICphc3N1bWVzKiBpcyB0aGUgcmVzdWx0IG9mIGEgcGxhaW4gYEpTT04ucGFyc2VgIHdpdGggbm8gcmVzb2x2ZXIuIEl0IHRoZW5cbiAqIG11c3QgdmFsaWRhdGUgdGhhdCBpdCBpcyBhIHZhbGlkIFNtYWxsY2FwcyBFbmNvZGluZywgYW5kIGlmIGl0IGlzLFxuICogcmV0dXJuIGEgY29ycmVzcG9uZGluZyBwYXNzYWJsZS5cbiAqXG4gKiBTbWFsbGNhcHMgY29uc2lkZXJzIHRoZSBjaGFyYWN0ZXJzIGJldHdlZW4gYCFgIChhc2NpaSBjb2RlIDMzLCBCQU5HKVxuICogYW5kIGAtYCAoYXNjaWkgY29kZSA0NSwgREFTSCkgdG8gYmUgc3BlY2lhbCBwcmVmaXhlcyBhbGxvd2luZ1xuICogcmVwcmVzZW50YXRpb24gb2YgSlNPTi1pbmNvbXBhdGlibGUgZGF0YSB1c2luZyBzdHJpbmdzLlxuICogVGhlc2UgY2hhcmFjdGVycywgaW4gb3JkZXIsIGFyZSBgIVwiIyQlJicoKSorLC1gXG4gKiBPZiB0aGVzZSwgc21hbGxjYXBzIGN1cnJlbnRseSB1c2VzIHRoZSBmb2xsb3dpbmc6XG4gKlxuICogICogYCFgIC0gZXNjYXBlZCBzdHJpbmdcbiAqICAqIGArYCAtIG5vbi1uZWdhdGl2ZSBiaWdpbnRcbiAqICAqIGAtYCAtIG5lZ2F0aXZlIGJpZ2ludFxuICogICogYCNgIC0gbWFuaWZlc3QgY29uc3RhbnRcbiAqICAqIGAlYCAtIHN5bWJvbFxuICogICogYCRgIC0gcmVtb3RhYmxlXG4gKiAgKiBgJmAgLSBwcm9taXNlXG4gKlxuICogQWxsIG90aGVyIHNwZWNpYWwgY2hhcmFjdGVycyAoYFwiJygpKixgKSBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuXG4gKlxuICogVGhlIG1hbmlmZXN0IGNvbnN0YW50cyB0aGF0IHNtYWxsY2FwcyBjdXJyZW50bHkgdXNlcyBmb3IgdmFsdWVzOlxuICogICogYCN1bmRlZmluZWRgXG4gKiAgKiBgI05hTmBcbiAqICAqIGAjSW5maW5pdHlgXG4gKiAgKiBgIy1JbmZpbml0eWBcbiAqXG4gKiBhbmQgZm9yIHByb3BlcnR5IG5hbWVzIGFuYWxvZ291cyB0byBjYXBkYXRhIEBxY2xhc3M6XG4gKiAgKiBgI3RhZ2BcbiAqICAqIGAjZXJyb3JgXG4gKlxuICogQWxsIG90aGVyIGVuY29kZWQgc3RyaW5ncyBiZWdpbm5pbmcgd2l0aCBgI2AgYXJlIHJlc2VydmVkIGZvclxuICogZnV0dXJlIHVzZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RlZFN0clxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IHN0YXJ0c1NwZWNpYWw9KGVuY29kZWRTdHIpPT57XG5pZihlbmNvZGVkU3RyPT09Jycpe1xucmV0dXJuIGZhbHNlO1xuIH1cbi8qIGNoYXJDb2RlQXQoMCkgYW5kIG51bWJlciBjb21wYXJlIGlzIGEgYml0IGZhc3Rlci4qL1xuY29uc3QgY29kZT1lbmNvZGVkU3RyLmNoYXJDb2RlQXQoMCk7XG4vKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgeW9kYSovXG5yZXR1cm4gQkFORzw9Y29kZSYmY29kZTw9REFTSDtcbiB9O1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IEVuY29kZVRvU21hbGxjYXBzT3B0aW9uc1xuICogQHByb3BlcnR5IHsoXG4gKiAgIHJlbW90YWJsZTogUmVtb3RhYmxlLFxuICogICBlbmNvZGVSZWN1cjogKHA6IFBhc3NhYmxlKSA9PiBTbWFsbGNhcHNFbmNvZGluZ1xuICogKSA9PiBTbWFsbGNhcHNFbmNvZGluZ30gW2VuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIHByb21pc2U6IFByb21pc2UsXG4gKiAgIGVuY29kZVJlY3VyOiAocDogUGFzc2FibGUpID0+IFNtYWxsY2Fwc0VuY29kaW5nXG4gKiApID0+IFNtYWxsY2Fwc0VuY29kaW5nfSBbZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzXVxuICogQHByb3BlcnR5IHsoXG4gKiAgIGVycm9yOiBFcnJvcixcbiAqICAgZW5jb2RlUmVjdXI6IChwOiBQYXNzYWJsZSkgPT4gU21hbGxjYXBzRW5jb2RpbmdcbiAqICkgPT4gU21hbGxjYXBzRW5jb2Rpbmd9IFtlbmNvZGVFcnJvclRvU21hbGxjYXBzXVxuICovXG5cbmNvbnN0IGRvbnRFbmNvZGVSZW1vdGFibGVUb1NtYWxsY2Fwcz0ocmVtKT0+XG5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtyZW19YDtcblxuY29uc3QgZG9udEVuY29kZVByb21pc2VUb1NtYWxsY2Fwcz0ocHJvbSk9PkZhaWwgYHByb21pc2UgdW5leHBlY3RlZDogJHtwcm9tfWA7XG5cbmNvbnN0IGRvbnRFbmNvZGVFcnJvclRvU21hbGxjYXBzPShlcnIpPT5cbkZhaWwgYGVycm9yIG9iamVjdCB1bmV4cGVjdGVkOiAke3EoZXJyKX1gO1xuXG4vKipcbiAqIEBwYXJhbSB7RW5jb2RlVG9TbWFsbGNhcHNPcHRpb25zfSBlbmNvZGVPcHRpb25zXG4gKiBAcmV0dXJucyB7KHBhc3NhYmxlOiBQYXNzYWJsZSkgPT4gU21hbGxjYXBzRW5jb2Rpbmd9XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlRW5jb2RlVG9TbWFsbGNhcHM9KHtcbmVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzPWRvbnRFbmNvZGVSZW1vdGFibGVUb1NtYWxsY2FwcyxcbmVuY29kZVByb21pc2VUb1NtYWxsY2Fwcz1kb250RW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzLFxuZW5jb2RlRXJyb3JUb1NtYWxsY2Fwcz1kb250RW5jb2RlRXJyb3JUb1NtYWxsY2Fwc309XG57fSk9Pntcbi8qKlxuICogTXVzdCBlbmNvZGUgYHZhbGAgaW50byBwbGFpbiBKU09OIGRhdGEgKmNhbm9uaWNhbGx5Kiwgc3VjaCB0aGF0XG4gKiBgSlNPTi5zdHJpbmdpZnkoZW5jb2RlKHYxKSkgPT09IEpTT04uc3RyaW5naWZ5KGVuY29kZSh2MSkpYC4gRm9yIG1vc3RcbiAqIGVuY29kaW5ncywgdGhlIG9yZGVyIG9mIHByb3BlcnRpZXMgb2YgZWFjaCBub2RlIG9mIHRoZSBvdXRwdXRcbiAqIHN0cnVjdHVyZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBhbGdvcml0aG0gYmVsb3cgd2l0aG91dCBzcGVjaWFsXG4gKiBhcnJhbmdlbWVudCwgdXN1YWxseSBieSBiZWluZyBleHByZXNzZWQgZGlyZWN0bHkgYXMgYW4gb2JqZWN0IGxpdGVyYWwuXG4gKiBUaGUgZXhjZXB0aW9uIGlzIGNvcHlSZWNvcmRzLCB3aG9zZSBuYXR1cmFsIGVudW1lcmF0aW9uIG9yZGVyXG4gKiBjYW4gZGlmZmVyIGJldHdlZW4gY29weVJlY29yZHMgdGhhdCBvdXIgZGlzdHJpYnV0ZWQgb2JqZWN0IHNlbWFudGljc1xuICogY29uc2lkZXJzIHRvIGJlIGVxdWl2YWxlbnQuXG4gKiBTaW5jZSwgZm9yIGVhY2ggY29weVJlY29yZCwgd2Ugb25seSBhY2NlcHQgc3RyaW5nIHByb3BlcnR5IG5hbWVzLFxuICogbm90IHN5bWJvbHMsIHdlIGNhbiBjYW5vbmljYWxseSBzb3J0IHRoZSBuYW1lcyBmaXJzdC5cbiAqIEpTT04uc3RyaW5naWZ5IHdpbGwgdGhlbiB2aXNpdCB0aGVzZSBpbiB0aGF0IHNvcnRlZCBvcmRlci5cbiAqXG4gKiBTbWFsbGNhcHNFbmNvZGluZyB3aXRoIGEgY2Fub25pY2FsLUpTT04gZW5jb2RlciB3b3VsZCBhbHNvIHNvbHZlXG4gKiB0aGlzIGNhbm9uaWNhbG5lc3NcbiAqIHByb2JsZW0gaW4gYSBtb3JlIG1vZHVsYXIgYW5kIGVuY2Fwc3VsYXRlZCBtYW5uZXIuIE5vdGUgdGhhdCB0aGVcbiAqIGFjdHVhbCBvcmRlciBwcm9kdWNlZCBoZXJlLCB0aG91Z2ggaXQgYWdyZWVzIHdpdGggY2Fub25pY2FsLUpTT04gb25cbiAqIGNvcHlSZWNvcmQgcHJvcGVydHkgb3JkZXJpbmcsIGRpZmZlcnMgZnJvbSBjYW5vbmljYWwtSlNPTiBhcyBhIHdob2xlXG4gKiBpbiB0aGF0IHRoZSBvdGhlciByZWNvcmQgcHJvcGVydGllcyBhcmUgdmlzaXRlZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2hcbiAqIHRoZXkgYXJlIGxpdGVyYWxseSB3cml0dGVuIGJlbG93LiBUT0RPIHBlcmhhcHMgd2Ugc2hvdWxkIGluZGVlZCBzd2l0Y2hcbiAqIHRvIGEgY2Fub25pY2FsIEpTT04gZW5jb2RlciwgYW5kIG5vdCBkZWxpY2F0ZXRseSBkZXBlbmQgb24gdGhlIG9yZGVyXG4gKiBpbiB3aGljaCB0aGVzZSBvYmplY3QgbGl0ZXJhbHMgYXJlIHdyaXR0ZW4uXG4gKlxuICogUmVhZGVycyBtdXN0IG5vdCBjYXJlIGFib3V0IHRoaXMgb3JkZXIgYW55d2F5LiBXZSBpbXBvc2UgdGhpcyByZXF1aXJlbWVudFxuICogbWFpbmx5IHRvIHJlZHVjZSBub24tZGV0ZXJtaW5pc20gZXhwb3NlZCBvdXRzaWRlIGEgdmF0LlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhc3NhYmxlXG4gKiBAcmV0dXJucyB7U21hbGxjYXBzRW5jb2Rpbmd9IGV4Y2VwdCB0aGF0IGBlbmNvZGVUb1NtYWxsY2Fwc2AgZG9lcyBub3QgZ2VuZXJhbGx5XG4gKiBgaGFyZGVuYCB0aGlzIHJlc3VsdCBiZWZvcmUgcmV0dXJuaW5nLiBSYXRoZXIsIGBlbmNvZGVUb1NtYWxsY2Fwc2AgaXMgbm90XG4gKiBkaXJlY3RseSBleHBvc2VkLlxuICogV2hhdCdzIGV4cG9zZWQgaW5zdGVhZCBpcyBhIHdyYXBwZXIgdGhhdCBmcmVlemVzIHRoZSBvdXRwdXQgYmVmb3JlXG4gKiByZXR1cm5pbmcuIElmIHRoaXMgdHVybnMgb3V0IHRvIGltcGVkZSBzdGF0aWMgYW5hbHlzaXMgZm9yIGBoYXJkZW5gIHNhZmV0eSxcbiAqIHdlIGNhbiBhbHdheXMgcHV0IHRoZSAobm93IHJlZHVuZGFudCkgaGFyZGVucyBiYWNrIGluLiBUaGV5IGRvbid0IGh1cnQuXG4gKi9cbmNvbnN0IGVuY29kZVRvU21hbGxjYXBzUmVjdXI9KHBhc3NhYmxlKT0+e1xuLyogRmlyc3Qgd2UgaGFuZGxlIGFsbCBwcmltaXRpdmVzLiBTb21lIGNhbiBiZSByZXByZXNlbnRlZCBkaXJlY3RseSBhcyovXG4vKiBKU09OLCBhbmQgc29tZSBtdXN0IGJlIGVuY29kZWQgaW50byBzbWFsbGNhcHMgc3RyaW5ncy4qL1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHBhc3NhYmxlKTtcbnN3aXRjaChwYXNzU3R5bGUpe1xuY2FzZSdudWxsJzpcbmNhc2UnYm9vbGVhbic6e1xuLyogcGFzcyB0aHJvdWdoIHRvIEpTT04qL1xucmV0dXJuIHBhc3NhYmxlO1xuIH1cbmNhc2Unc3RyaW5nJzp7XG5pZihzdGFydHNTcGVjaWFsKHBhc3NhYmxlKSl7XG4vKiBTdHJpbmdzIHRoYXQgc3RhcnQgd2l0aCBhIHNwZWNpYWwgY2hhciBhcmUgcXVvdGVkIHdpdGggYCFgLiovXG4vKiBTaW5jZSBgIWAgaXMgaXRzZWxmIGEgc3BlY2lhbCBjaGFyYWN0ZXIsIHRoaXMgdHJpdmlhbGx5IGRvZXMqL1xuLyogdGhlIEhpbGJlcnQgaG90ZWwuIEFsc28sIHNpbmNlIHRoZSBzcGVjaWFsIGNoYXJhY3RlcnMgYXJlKi9cbi8qIGEgY29udGludW91cyBzdWJyYW5nZSBvZiBhc2NpaSwgdGhpcyBxdW90aW5nIGlzIHNvcnQtb3JkZXIqL1xuLyogcHJlc2VydmluZy4qL1xucmV0dXJuIGAhJHtwYXNzYWJsZX1gO1xuIH1cbi8qIEFsbCBvdGhlciBzdHJpbmdzIHBhc3MgdGhyb3VnaCB0byBKU09OKi9cbnJldHVybiBwYXNzYWJsZTtcbiB9XG5jYXNlJ3N5bWJvbCc6e1xuLyogQXQgdGhlIHNtYWxsY2FwcyBsZXZlbCwgd2UgcHJlZml4IHN5bWJvbCBuYW1lcyB3aXRoIGAlYC4qL1xuLyogQnkgXCJzeW1ib2wgbmFtZVwiLCB3ZSBtZWFuIGFjY29yZGluZyB0byBgbmFtZUZvclBhc3NhYmxlU3ltYm9sYCovXG4vKiB3aGljaCBkb2VzIHNvbWUgZnVydGhlciBlc2NhcGluZy4gU2VlIGNvbW1lbnQgb24gdGhhdCBmdW5jdGlvbi4qL1xuYXNzZXJ0UGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xuY29uc3QgbmFtZT0vKiogQHR5cGUge3N0cmluZ30gKi9uYW1lRm9yUGFzc2FibGVTeW1ib2wocGFzc2FibGUpO1xucmV0dXJuIGAlJHtuYW1lfWA7XG4gfVxuY2FzZSd1bmRlZmluZWQnOntcbnJldHVybicjdW5kZWZpbmVkJztcbiB9XG5jYXNlJ251bWJlcic6e1xuaWYoTnVtYmVyLmlzTmFOKHBhc3NhYmxlKSl7XG5yZXR1cm4nI05hTic7XG4gfVxuaWYoaXMocGFzc2FibGUsLTApKXtcbnJldHVybiAwO1xuIH1cbmlmKHBhc3NhYmxlPT09SW5maW5pdHkpe1xucmV0dXJuJyNJbmZpbml0eSc7XG4gfVxuaWYocGFzc2FibGU9PT0tSW5maW5pdHkpe1xucmV0dXJuJyMtSW5maW5pdHknO1xuIH1cbi8qIEFsbCBvdGhlciBudW1iZXJzIHBhc3MgdGhyb3VnaCB0byBKU09OKi9cbnJldHVybiBwYXNzYWJsZTtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xuY29uc3Qgc3RyPVN0cmluZyhwYXNzYWJsZSk7XG5yZXR1cm4gcGFzc2FibGU8MG4/c3RyOiBgKyR7c3RyfWA7XG4gfVxuY2FzZSdjb3B5UmVjb3JkJzp7XG4vKiBDdXJyZW50bHkgY29weVJlY29yZCBhbGxvd3Mgb25seSBzdHJpbmcga2V5cyBzbyB0aGlzIHdpbGwqL1xuLyogd29yay4gSWYgd2UgYWxsb3cgc29ydGFibGUgc3ltYm9sIGtleXMsIHRoaXMgd2lsbCBuZWVkIHRvKi9cbi8qIGJlY29tZSBtb3JlIGludGVyZXN0aW5nLiovXG5jb25zdCBuYW1lcz1vd25LZXlzKHBhc3NhYmxlKS5zb3J0KCk7XG5yZXR1cm4gZnJvbUVudHJpZXMoXG5uYW1lcy5tYXAoKG5hbWUpPT5bXG5lbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKG5hbWUpLFxuZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZVtuYW1lXSldKSk7XG5cblxuIH1cbmNhc2UnY29weUFycmF5Jzp7XG5yZXR1cm4gcGFzc2FibGUubWFwKGVuY29kZVRvU21hbGxjYXBzUmVjdXIpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5yZXR1cm57XG4nI3RhZyc6ZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihnZXRUYWcocGFzc2FibGUpKSxcbnBheWxvYWQ6ZW5jb2RlVG9TbWFsbGNhcHNSZWN1cihwYXNzYWJsZS5wYXlsb2FkKX07XG5cbiB9XG5jYXNlJ3JlbW90YWJsZSc6e1xuY29uc3QgcmVzdWx0PWVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzKFxucGFzc2FibGUsXG5lbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcblxuaWYodHlwZW9mIHJlc3VsdD09PSdzdHJpbmcnJiZyZXN1bHQuc3RhcnRzV2l0aCgnJCcpKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuLyogYHRocm93YCBpcyBub29wIHNpbmNlIGBGYWlsYCB0aHJvd3MuIEJ1dCBsaW50ZXIgY29uZnVzZWQqL1xudGhyb3cgRmFpbCBgaW50ZXJuYWw6IFJlbW90YWJsZSBlbmNvZGluZyBtdXN0IHN0YXJ0IHdpdGggXCIkXCI6ICR7cmVzdWx0fWA7XG4gfVxuY2FzZSdwcm9taXNlJzp7XG5jb25zdCByZXN1bHQ9ZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzKFxucGFzc2FibGUsXG5lbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKTtcblxuaWYodHlwZW9mIHJlc3VsdD09PSdzdHJpbmcnJiZyZXN1bHQuc3RhcnRzV2l0aCgnJicpKXtcbnJldHVybiByZXN1bHQ7XG4gfVxudGhyb3cgRmFpbCBgaW50ZXJuYWw6IFByb21pc2UgZW5jb2RpbmcgbXVzdCBzdGFydCB3aXRoIFwiJlwiOiAke3Jlc3VsdH1gO1xuIH1cbmNhc2UnZXJyb3InOntcbmNvbnN0IHJlc3VsdD1lbmNvZGVFcnJvclRvU21hbGxjYXBzKHBhc3NhYmxlLGVuY29kZVRvU21hbGxjYXBzUmVjdXIpO1xuaWYodHlwZW9mIHJlc3VsdD09PSdvYmplY3QnJiZoYXNPd25Qcm9wZXJ0eU9mKHJlc3VsdCwnI2Vycm9yJykpe1xuY29uc3QgbWVzc2FnZT1yZXN1bHRbJyNlcnJvciddO1xuaWYoXG50eXBlb2YgbWVzc2FnZT09PSdzdHJpbmcnJiYoXG4vKiBjaGVjayB0aGF0IGl0IGRlY29kZXMgdG8gYSBzdHJpbmcqL1xuIXN0YXJ0c1NwZWNpYWwobWVzc2FnZSl8fG1lc3NhZ2Uuc3RhcnRzV2l0aCgnIScpKSlcbntcbnJldHVybiByZXN1bHQ7XG4gfVxuRmFpbCBgaW50ZXJuYWw6IEVycm9yIGVuY29kaW5nIG11c3QgaGF2ZSBzdHJpbmcgbWVzc2FnZTogJHtxKFxubWVzc2FnZSlcbiB9YDtcbiB9XG50aHJvdyBGYWlsIGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBoYXZlIFwiI2Vycm9yXCIgcHJvcGVydHk6ICR7cShcbnJlc3VsdClcbiB9YDtcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFxuWCBgaW50ZXJuYWw6IFVucmVjb2duaXplZCBwYXNzU3R5bGUgJHtxKHBhc3NTdHlsZSl9YCxcblR5cGVFcnJvcik7XG5cbiB9fVxuXG4gfTtcbmNvbnN0IGVuY29kZVRvU21hbGxjYXBzPShwYXNzYWJsZSk9PntcbmlmKEVycm9ySGVscGVyLmNhbkJlVmFsaWQocGFzc2FibGUpKXtcbi8qIFdlIHB1bGwgb3V0IHRoaXMgc3BlY2lhbCBjYXNlIHRvIGFjY29tbW9kYXRlIGVycm9ycyB0aGF0IGFyZSBub3QqL1xuLyogdmFsaWQgUGFzc2FibGVzLiBGb3IgZXhhbXBsZSwgYmVjYXVzZSB0aGV5J3JlIG5vdCBmcm96ZW4uKi9cbi8qIFRoZSBzcGVjaWFsIGNhc2UgY2FuIG9ubHkgZXZlciBhcHBseSBhdCB0aGUgcm9vdCwgYW5kIHRoZXJlZm9yZSovXG4vKiBvdXRzaWRlIHRoZSByZWN1cnNpb24sIHNpbmNlIGFuIGVycm9yIGNvdWxkIG9ubHkgYmUgZGVlcGVyIGluKi9cbi8qIGEgcGFzc2FibGUgc3RydWN0dXJlIGlmIGl0IHdlcmUgcGFzc2FibGUuKi9cbi8qKi9cbi8qIFdlIHB1bGwgb3V0IHRoaXMgc3BlY2lhbCBjYXNlIGJlY2F1c2UsIGZvciB0aGVzZSBlcnJvcnMsIHdlJ3JlIG11Y2gqL1xuLyogbW9yZSBpbnRlcmVzdGVkIGluIHJlcG9ydGluZyB3aGF0ZXZlciBkaWFnbm9zdGljIGluZm9ybWF0aW9uIHRoZXkqL1xuLyogY2FycnkgdGhhbiB3ZSBhcmUgYWJvdXQgcmVwb3J0aW5nIHByb2JsZW1zIGVuY291bnRlcmVkIGluIHJlcG9ydGluZyovXG4vKiB0aGlzIGluZm9ybWF0aW9uLiovXG5jb25zdCByZXN1bHQ9aGFyZGVuKFxuZW5jb2RlRXJyb3JUb1NtYWxsY2FwcyhwYXNzYWJsZSxlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKSk7XG5cbmlmKHR5cGVvZiByZXN1bHQ9PT0nb2JqZWN0JyYmaGFzT3duUHJvcGVydHlPZihyZXN1bHQsJyNlcnJvcicpKXtcbmNvbnN0IG1lc3NhZ2U9cmVzdWx0WycjZXJyb3InXTtcbmlmKFxudHlwZW9mIG1lc3NhZ2U9PT0nc3RyaW5nJyYmKFxuLyogY2hlY2sgdGhhdCBpdCBkZWNvZGVzIHRvIGEgc3RyaW5nKi9cbiFzdGFydHNTcGVjaWFsKG1lc3NhZ2UpfHxtZXNzYWdlLnN0YXJ0c1dpdGgoJyEnKSkpXG57XG5yZXR1cm4gcmVzdWx0O1xuIH1cbkZhaWwgYGludGVybmFsOiBFcnJvciBlbmNvZGluZyBtdXN0IHN0cmluZyBtZXNzYWdlOiAke3EobWVzc2FnZSl9YDtcbiB9XG5GYWlsIGBpbnRlcm5hbDogRXJyb3IgZW5jb2RpbmcgbXVzdCBoYXZlIFwiI2Vycm9yXCIgcHJvcGVydHk6ICR7cShyZXN1bHQpfWA7XG4gfVxucmV0dXJuIGhhcmRlbihlbmNvZGVUb1NtYWxsY2Fwc1JlY3VyKHBhc3NhYmxlKSk7XG4gfTtcbnJldHVybiBoYXJkZW4oZW5jb2RlVG9TbWFsbGNhcHMpO1xuIH07JGjigI1fb25jZS5tYWtlRW5jb2RlVG9TbWFsbGNhcHMobWFrZUVuY29kZVRvU21hbGxjYXBzKTtcbmhhcmRlbihtYWtlRW5jb2RlVG9TbWFsbGNhcHMpO1xuXG4vKipcbiAqIEB0eXBlZGVmIHtvYmplY3R9IERlY29kZUZyb21TbWFsbGNhcHNPcHRpb25zXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFJlbW90YWJsZTogU21hbGxjYXBzRW5jb2RpbmcsXG4gKiAgIGRlY29kZVJlY3VyOiAoZSA6U21hbGxjYXBzRW5jb2RpbmcpID0+IFBhc3NhYmxlXG4gKiApID0+IFJlbW90YWJsZX0gW2RlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHNdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZFByb21pc2U6IFNtYWxsY2Fwc0VuY29kaW5nLFxuICogICBkZWNvZGVSZWN1cjogKGUgOlNtYWxsY2Fwc0VuY29kaW5nKSA9PiBQYXNzYWJsZVxuICogKSA9PiBQcm9taXNlfSBbZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHNdXG4gKiBAcHJvcGVydHkgeyhcbiAqICAgZW5jb2RlZEVycm9yOiBTbWFsbGNhcHNFbmNvZGluZyxcbiAqICAgZGVjb2RlUmVjdXI6IChlIDpTbWFsbGNhcHNFbmNvZGluZykgPT4gUGFzc2FibGVcbiAqICkgPT4gRXJyb3J9IFtkZWNvZGVFcnJvckZyb21TbWFsbGNhcHNdXG4gKi9cblxuY29uc3QgZG9udERlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHM9KGVuY29kaW5nKT0+XG5GYWlsIGByZW1vdGFibGUgdW5leHBlY3RlZDogJHtlbmNvZGluZ31gO1xuY29uc3QgZG9udERlY29kZVByb21pc2VGcm9tU21hbGxjYXBzPShlbmNvZGluZyk9PlxuRmFpbCBgcHJvbWlzZSB1bmV4cGVjdGVkOiAke2VuY29kaW5nfWA7XG5jb25zdCBkb250RGVjb2RlRXJyb3JGcm9tU21hbGxjYXBzPShlbmNvZGluZyk9PlxuRmFpbCBgZXJyb3IgdW5leHBlY3RlZDogJHtxKGVuY29kaW5nKX1gO1xuXG4vKipcbiAqIEBwYXJhbSB7RGVjb2RlRnJvbVNtYWxsY2Fwc09wdGlvbnN9IGRlY29kZU9wdGlvbnNcbiAqIEByZXR1cm5zIHsoZW5jb2RlZDogU21hbGxjYXBzRW5jb2RpbmcpID0+IFBhc3NhYmxlfVxuICovXG5jb25zdCAgICAgICAgbWFrZURlY29kZUZyb21TbWFsbGNhcHM9KHtcbmRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHM9ZG9udERlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMsXG5kZWNvZGVQcm9taXNlRnJvbVNtYWxsY2Fwcz1kb250RGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMsXG5kZWNvZGVFcnJvckZyb21TbWFsbGNhcHM9ZG9udERlY29kZUVycm9yRnJvbVNtYWxsY2Fwc309XG57fSk9Pntcbi8qKlxuICogYGRlY29kZUZyb21TbWFsbGNhcHNgIG1heSByZWx5IG9uIGBlbmNvZGluZ2AgYmVpbmcgdGhlIHJlc3VsdCBvZiBhXG4gKiBwbGFpbiBjYWxsIHRvIEpTT04ucGFyc2UuIEhvd2V2ZXIsIGl0ICpjYW5ub3QqIHJlbHkgb24gYGVuY29kaW5nYFxuICogaGF2aW5nIGJlZW4gcHJvZHVjZWQgYnkgSlNPTi5zdHJpbmdpZnkgb24gdGhlIG91dHB1dCBvZiBgZW5jb2RlVG9TbWFsbGNhcHNgXG4gKiBhYm92ZSwgaS5lLiwgYGRlY29kZUZyb21TbWFsbGNhcHNgIGNhbm5vdCByZWx5IG9uIGBlbmNvZGluZ2AgYmVpbmcgYVxuICogdmFsaWQgbWFyc2hhbGxlZCByZXByZXNlbnRhdGlvbi4gUmF0aGVyLCBgZGVjb2RlRnJvbVNtYWxsY2Fwc2AgbXVzdFxuICogdmFsaWRhdGUgdGhhdC5cbiAqXG4gKiBAcGFyYW0ge1NtYWxsY2Fwc0VuY29kaW5nfSBlbmNvZGluZyBtdXN0IGJlIGhhcmRlbmVkXG4gKi9cbmNvbnN0IGRlY29kZUZyb21TbWFsbGNhcHM9KGVuY29kaW5nKT0+e1xuc3dpdGNoKHR5cGVvZiBlbmNvZGluZyl7XG5jYXNlJ2Jvb2xlYW4nOlxuY2FzZSdudW1iZXInOntcbnJldHVybiBlbmNvZGluZztcbiB9XG5jYXNlJ3N0cmluZyc6e1xuaWYoIXN0YXJ0c1NwZWNpYWwoZW5jb2RpbmcpKXtcbnJldHVybiBlbmNvZGluZztcbiB9XG5jb25zdCBjPWVuY29kaW5nLmNoYXJBdCgwKTtcbnN3aXRjaChjKXtcbmNhc2UnISc6e1xuLyogdW4taGlsYmVydC1pZnkgdGhlIHN0cmluZyovXG5yZXR1cm4gZW5jb2Rpbmcuc2xpY2UoMSk7XG4gfVxuY2FzZSclJzp7XG5yZXR1cm4gcGFzc2FibGVTeW1ib2xGb3JOYW1lKGVuY29kaW5nLnNsaWNlKDEpKTtcbiB9XG5jYXNlJyMnOntcbnN3aXRjaChlbmNvZGluZyl7XG5jYXNlJyN1bmRlZmluZWQnOntcbnJldHVybiB1bmRlZmluZWQ7XG4gfVxuY2FzZScjTmFOJzp7XG5yZXR1cm4gTmFOO1xuIH1cbmNhc2UnI0luZmluaXR5Jzp7XG5yZXR1cm4gSW5maW5pdHk7XG4gfVxuY2FzZScjLUluZmluaXR5Jzp7XG5yZXR1cm4tSW5maW5pdHk7XG4gfVxuZGVmYXVsdDp7XG5hc3NlcnQuZmFpbChYIGB1bmtub3duIGNvbnN0YW50IFwiJHtxKGVuY29kaW5nKX1cImAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfVxuY2FzZScrJzp7XG5yZXR1cm4gQmlnSW50KGVuY29kaW5nLnNsaWNlKDEpKTtcbiB9XG5jYXNlJy0nOntcbnJldHVybiBCaWdJbnQoZW5jb2RpbmcpO1xuIH1cbmNhc2UnJCc6e1xuY29uc3QgcmVzdWx0PWRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMoXG5lbmNvZGluZyxcbmRlY29kZUZyb21TbWFsbGNhcHMpO1xuXG5pZihwYXNzU3R5bGVPZihyZXN1bHQpIT09J3JlbW90YWJsZScpe1xuRmFpbCBgaW50ZXJuYWw6IGRlY29kZVJlbW90YWJsZUZyb21TbWFsbGNhcHMgb3B0aW9uIG11c3QgcmV0dXJuIGEgcmVtb3RhYmxlOiAke3Jlc3VsdH1gO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfVxuY2FzZScmJzp7XG5jb25zdCByZXN1bHQ9ZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMoXG5lbmNvZGluZyxcbmRlY29kZUZyb21TbWFsbGNhcHMpO1xuXG5pZihwYXNzU3R5bGVPZihyZXN1bHQpIT09J3Byb21pc2UnKXtcbkZhaWwgYGludGVybmFsOiBkZWNvZGVQcm9taXNlRnJvbVNtYWxsY2FwcyBvcHRpb24gbXVzdCByZXR1cm4gYSBwcm9taXNlOiAke3Jlc3VsdH1gO1xuIH1cbnJldHVybiByZXN1bHQ7XG4gfVxuZGVmYXVsdDp7XG50aHJvdyBGYWlsIGBTcGVjaWFsIGNoYXIgJHtxKFxuYylcbiB9IHJlc2VydmVkIGZvciBmdXR1cmUgdXNlOiAke2VuY29kaW5nfWA7XG4gfX1cblxuIH1cbmNhc2Unb2JqZWN0Jzp7XG5pZihlbmNvZGluZz09PW51bGwpe1xucmV0dXJuIGVuY29kaW5nO1xuIH1cblxuaWYoaXNBcnJheShlbmNvZGluZykpe1xucmV0dXJuIGVuY29kaW5nLm1hcCgodmFsKT0+ZGVjb2RlRnJvbVNtYWxsY2Fwcyh2YWwpKTtcbiB9XG5cbmlmKGhhc093blByb3BlcnR5T2YoZW5jb2RpbmcsJyN0YWcnKSl7XG5jb25zdHsnI3RhZyc6dGFnLHBheWxvYWQsLi4ucmVzdH09ZW5jb2Rpbmc7XG50eXBlb2YgdGFnPT09J3N0cmluZyd8fFxuRmFpbCBgVmFsdWUgb2YgXCIjdGFnXCIsIHRoZSB0YWcsIG11c3QgYmUgYSBzdHJpbmc6ICR7ZW5jb2Rpbmd9YDtcbm93bktleXMocmVzdCkubGVuZ3RoPT09MHx8XG5GYWlsIGAjdGFnIHJlY29yZCB1bmV4cGVjdGVkIHByb3BlcnRpZXM6ICR7cShvd25LZXlzKHJlc3QpKX1gO1xucmV0dXJuIG1ha2VUYWdnZWQoXG5kZWNvZGVGcm9tU21hbGxjYXBzKHRhZyksXG5kZWNvZGVGcm9tU21hbGxjYXBzKHBheWxvYWQpKTtcblxuIH1cblxuaWYoaGFzT3duUHJvcGVydHlPZihlbmNvZGluZywnI2Vycm9yJykpe1xuY29uc3QgcmVzdWx0PWRlY29kZUVycm9yRnJvbVNtYWxsY2FwcyhcbmVuY29kaW5nLFxuZGVjb2RlRnJvbVNtYWxsY2Fwcyk7XG5cbnBhc3NTdHlsZU9mKHJlc3VsdCk9PT0nZXJyb3InfHxcbkZhaWwgYGludGVybmFsOiBkZWNvZGVFcnJvckZyb21TbWFsbGNhcHMgb3B0aW9uIG11c3QgcmV0dXJuIGFuIGVycm9yOiAke3Jlc3VsdH1gO1xucmV0dXJuIHJlc3VsdDtcbiB9XG5cbmNvbnN0IGRlY29kZUVudHJ5PShbZW5jb2RlZE5hbWUsZW5jb2RlZFZhbF0pPT57XG50eXBlb2YgZW5jb2RlZE5hbWU9PT0nc3RyaW5nJ3x8XG5GYWlsIGBQcm9wZXJ0eSBuYW1lICR7cShcbmVuY29kZWROYW1lKVxuIH0gb2YgJHtlbmNvZGluZ30gbXVzdCBiZSBhIHN0cmluZ2A7XG4hZW5jb2RlZE5hbWUuc3RhcnRzV2l0aCgnIycpfHxcbkZhaWwgYFVucmVjb2duaXplZCByZWNvcmQgdHlwZSAke3EoZW5jb2RlZE5hbWUpfTogJHtlbmNvZGluZ31gO1xuY29uc3QgbmFtZT1kZWNvZGVGcm9tU21hbGxjYXBzKGVuY29kZWROYW1lKTtcbnR5cGVvZiBuYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgRGVjb2RlZCBwcm9wZXJ0eSBuYW1lICR7bmFtZX0gZnJvbSAke2VuY29kaW5nfSBtdXN0IGJlIGEgc3RyaW5nYDtcbnJldHVybltuYW1lLGRlY29kZUZyb21TbWFsbGNhcHMoZW5jb2RlZFZhbCldO1xuIH07XG5jb25zdCBkZWNvZGVkRW50cmllcz1lbnRyaWVzKGVuY29kaW5nKS5tYXAoZGVjb2RlRW50cnkpO1xucmV0dXJuIGZyb21FbnRyaWVzKGRlY29kZWRFbnRyaWVzKTtcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFxuWCBgaW50ZXJuYWw6IHVucmVjb2duaXplZCBKU09OIHR5cGVvZiAke3EoXG50eXBlb2YgZW5jb2RpbmcpXG4gfTogJHtlbmNvZGluZ31gLFxuVHlwZUVycm9yKTtcblxuIH19XG5cbiB9O1xucmV0dXJuIGhhcmRlbihkZWNvZGVGcm9tU21hbGxjYXBzKTtcbiB9OyRo4oCNX29uY2UubWFrZURlY29kZUZyb21TbWFsbGNhcHMobWFrZURlY29kZUZyb21TbWFsbGNhcHMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VFbmNvZGVUb1NtYWxsY2FwcyI6WyJtYWtlRW5jb2RlVG9TbWFsbGNhcHMiXSwibWFrZURlY29kZUZyb21TbWFsbGNhcHMiOlsibWFrZURlY29kZUZyb21TbWFsbGNhcHMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAApsoXZOgGAADoBgAALQAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL2NvcHlBcnJheS5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiQ29weUFycmF5SGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsY2hlY2tOb3JtYWxQcm9wZXJ0eTskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJjaGVja05vcm1hbFByb3BlcnR5XCIsIFskaOKAjV9hID0+IChjaGVja05vcm1hbFByb3BlcnR5ID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuY29uc3R7ZGV0YWlsczpYfT1hc3NlcnQ7XG5jb25zdHtnZXRQcm90b3R5cGVPZn09T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzQXJyYXkscHJvdG90eXBlOmFycmF5UHJvdG90eXBlfT1BcnJheTtcblxuLyoqXG4gKlxuICogQHR5cGUge1hpbXBvcnQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBDb3B5QXJyYXlIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZTonY29weUFycmF5JyxcblxuY2FuQmVWYWxpZDooY2FuZGlkYXRlLGNoZWNrKT0+XG5pc0FycmF5KGNhbmRpZGF0ZSl8fFxuISFjaGVjayYmY2hlY2soZmFsc2UsWCBgQXJyYXkgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApLFxuXG5hc3NlcnRWYWxpZDooY2FuZGlkYXRlLHBhc3NTdHlsZU9mUmVjdXIpPT57XG5Db3B5QXJyYXlIZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlcik7XG5nZXRQcm90b3R5cGVPZihjYW5kaWRhdGUpPT09YXJyYXlQcm90b3R5cGV8fFxuYXNzZXJ0LmZhaWwoWCBgTWFsZm9ybWVkIGFycmF5OiAke2NhbmRpZGF0ZX1gLFR5cGVFcnJvcik7XG4vKiBTaW5jZSB3ZSdyZSBhbHJlYWR5IGVuc3VyZWQgY2FuZGlkYXRlIGlzIGFuIGFycmF5LCBpdCBzaG91bGQgbm90IGJlKi9cbi8qIHBvc3NpYmxlIGZvciB0aGUgZm9sbG93aW5nIHRlc3QgdG8gZmFpbCovXG5jaGVja05vcm1hbFByb3BlcnR5KGNhbmRpZGF0ZSwnbGVuZ3RoJyxmYWxzZSxhc3NlcnRDaGVja2VyKTtcbmNvbnN0IGxlbj1jYW5kaWRhdGUubGVuZ3RoO1xuZm9yKGxldCBpPTA7aTxsZW47aSs9MSl7XG5jaGVja05vcm1hbFByb3BlcnR5KGNhbmRpZGF0ZSxpLHRydWUsYXNzZXJ0Q2hlY2tlcik7XG4gfVxuLyogKzEgZm9yIHRoZSAnbGVuZ3RoJyBwcm9wZXJ0eSBpdHNlbGYuKi9cbm93bktleXMoY2FuZGlkYXRlKS5sZW5ndGg9PT1sZW4rMXx8XG5hc3NlcnQuZmFpbChYIGBBcnJheXMgbXVzdCBub3QgaGF2ZSBub24taW5kZXhlczogJHtjYW5kaWRhdGV9YCxUeXBlRXJyb3IpO1xuLyogUmVjdXJzaXZlbHkgdmFsaWRhdGUgdGhhdCBlYWNoIG1lbWJlciBpcyBwYXNzYWJsZS4qL1xuY2FuZGlkYXRlLmV2ZXJ5KCh2KT0+ISFwYXNzU3R5bGVPZlJlY3VyKHYpKTtcbiB9fSk7JGjigI1fb25jZS5Db3B5QXJyYXlIZWxwZXIoQ29weUFycmF5SGVscGVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJDb3B5QXJyYXlIZWxwZXIiOlsiQ29weUFycmF5SGVscGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJOHBWHTBwAA0wcAAC4AAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9jb3B5UmVjb3JkLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlLWhlbHBlcnMuanMiXSwiZXhwb3J0cyI6WyJDb3B5UmVjb3JkSGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsY2FuQmVNZXRob2QsY2hlY2tOb3JtYWxQcm9wZXJ0eTskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJjYW5CZU1ldGhvZFwiLCBbJGjigI1fYSA9PiAoY2FuQmVNZXRob2QgPSAkaOKAjV9hKV1dLFtcImNoZWNrTm9ybWFsUHJvcGVydHlcIiwgWyRo4oCNX2EgPT4gKGNoZWNrTm9ybWFsUHJvcGVydHkgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2dldFByb3RvdHlwZU9mLHZhbHVlcyxwcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlfT1PYmplY3Q7XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtYaW1wb3J0KCcuL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgQ29weVJlY29yZEhlbHBlcj1oYXJkZW4oe1xuc3R5bGVOYW1lOidjb3B5UmVjb3JkJyxcblxuY2FuQmVWYWxpZDooY2FuZGlkYXRlLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmlmKGdldFByb3RvdHlwZU9mKGNhbmRpZGF0ZSkhPT1vYmplY3RQcm90b3R5cGUpe1xucmV0dXJuKFxucmVqZWN0JiZcbnJlamVjdChYIGBSZWNvcmRzIG11c3QgaW5oZXJpdCBmcm9tIE9iamVjdC5wcm90b3R5cGU6ICR7Y2FuZGlkYXRlfWApKTtcblxuIH1cblxuZm9yKGNvbnN0IGtleSBvZiBvd25LZXlzKGNhbmRpZGF0ZSkpe1xuY29uc3QgdmFsaWQ9XG4odHlwZW9mIGtleT09PSdzdHJpbmcnfHxcbiEhcmVqZWN0JiZcbnJlamVjdChcblggYFJlY29yZHMgY2FuIG9ubHkgaGF2ZSBzdHJpbmctbmFtZWQgcHJvcGVydGllczogJHtjYW5kaWRhdGV9YCkpJiYoXG5cbiFjYW5CZU1ldGhvZChjYW5kaWRhdGVba2V5XSl8fFxuISFyZWplY3QmJlxucmVqZWN0KFxuLyogVE9ETzogVXBkYXRlIG1lc3NhZ2Ugbm93IHRoYXQgdGhlcmUgaXMgbm8gc3VjaCB0aGluZyBhcyBcImltcGxpY2l0IFJlbW90YWJsZVwiLiovXG5YIGBSZWNvcmRzIGNhbm5vdCBjb250YWluIG5vbi1mYXIgZnVuY3Rpb25zIGJlY2F1c2UgdGhleSBtYXkgYmUgbWV0aG9kcyBvZiBhbiBpbXBsaWNpdCBSZW1vdGFibGU6ICR7Y2FuZGlkYXRlfWApKTtcblxuaWYoIXZhbGlkKXtcbnJldHVybiBmYWxzZTtcbiB9XG4gfVxucmV0dXJuIHRydWU7XG4gfSxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSxwYXNzU3R5bGVPZlJlY3VyKT0+e1xuQ29weVJlY29yZEhlbHBlci5jYW5CZVZhbGlkKGNhbmRpZGF0ZSxhc3NlcnRDaGVja2VyKTtcbmZvcihjb25zdCBuYW1lIG9mIG93bktleXMoY2FuZGlkYXRlKSl7XG5jaGVja05vcm1hbFByb3BlcnR5KGNhbmRpZGF0ZSxuYW1lLHRydWUsYXNzZXJ0Q2hlY2tlcik7XG4gfVxuLyogUmVjdXJzaXZlbHkgdmFsaWRhdGUgdGhhdCBlYWNoIG1lbWJlciBpcyBwYXNzYWJsZS4qL1xudmFsdWVzKGNhbmRpZGF0ZSkuZXZlcnkoKHYpPT4hIXBhc3NTdHlsZU9mUmVjdXIodikpO1xuIH19KTskaOKAjV9vbmNlLkNvcHlSZWNvcmRIZWxwZXIoQ29weVJlY29yZEhlbHBlcik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiQ29weVJlY29yZEhlbHBlciI6WyJDb3B5UmVjb3JkSGVscGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAAyZpNpgEQAAYBEAACkAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9lcnJvci5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiRXJyb3JIZWxwZXIiLCJnZXRFcnJvckNvbnN0cnVjdG9yIiwidG9QYXNzYWJsZUVycm9yIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXI7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi9pbnRlcm5hbC10eXBlcy5qcycpLlBhc3NTdHlsZUhlbHBlcn0gUGFzc1N0eWxlSGVscGVyICovXG5cbmNvbnN0e2RldGFpbHM6WH09YXNzZXJ0O1xuY29uc3R7Z2V0UHJvdG90eXBlT2YsZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yc309T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyogVE9ETzogTWFpbnRlbmFuY2UgaGF6YXJkOiBDb29yZGluYXRlIHdpdGggdGhlIGxpc3Qgb2YgZXJyb3JzIGluIHRoZSBTRVMqL1xuLyogd2hpbGVsaXN0LiBDdXJyZW50bHksIGJvdGggb21pdCBBZ2dyZWdhdGVFcnJvciwgd2hpY2ggaXMgbm93IHN0YW5kYXJkLiBCb3RoKi9cbi8qIG11c3QgZXZlbnR1YWxseSBpbmNsdWRlIGl0LiovXG5jb25zdCBlcnJvckNvbnN0cnVjdG9ycz1uZXcgTWFwKFtcblsnRXJyb3InLEVycm9yXSxcblsnRXZhbEVycm9yJyxFdmFsRXJyb3JdLFxuWydSYW5nZUVycm9yJyxSYW5nZUVycm9yXSxcblsnUmVmZXJlbmNlRXJyb3InLFJlZmVyZW5jZUVycm9yXSxcblsnU3ludGF4RXJyb3InLFN5bnRheEVycm9yXSxcblsnVHlwZUVycm9yJyxUeXBlRXJyb3JdLFxuWydVUklFcnJvcicsVVJJRXJyb3JdXSk7XG5cblxuY29uc3QgICAgICAgIGdldEVycm9yQ29uc3RydWN0b3I9KG5hbWUpPT5lcnJvckNvbnN0cnVjdG9ycy5nZXQobmFtZSk7JGjigI1fb25jZS5nZXRFcnJvckNvbnN0cnVjdG9yKGdldEVycm9yQ29uc3RydWN0b3IpO1xuaGFyZGVuKGdldEVycm9yQ29uc3RydWN0b3IpO1xuXG4vKipcbiAqIFZhbGlkYXRpbmcgZXJyb3Igb2JqZWN0cyBhcmUgcGFzc2FibGUgcmFpc2VzIGEgdGVuc2lvbiBiZXR3ZWVuIHNlY3VyaXR5XG4gKiB2cyBwcmVzZXJ2aW5nIGRpYWdub3N0aWMgaW5mb3JtYXRpb24uIEZvciBlcnJvcnMsIHdlIG5lZWQgdG8gcmVtZW1iZXJcbiAqIHRoZSBlcnJvciBpdHNlbGYgZXhpc3RzIHRvIGhlbHAgdXMgZGlhZ25vc2UgYSBidWcgdGhhdCdzIGxpa2VseSBtb3JlXG4gKiBwcmVzc2luZyB0aGFuIGEgdmFsaWRpdHkgYnVnIGluIHRoZSBlcnJvciBpdHNlbGYuIFRodXMsIHdoZW5ldmVyIGl0IGlzIHNhZmVcbiAqIHRvIGRvIHNvLCB3ZSBwcmVmZXIgdG8gbGV0IHRoZSBlcnJvciB0ZXN0IHN1Y2NlZWQgYW5kIHRvIGNvdWNoIHRoZXNlXG4gKiBjb21wbGFpbnRzIGFzIG5vdGVzIG9uIHRoZSBlcnJvci5cbiAqXG4gKiBUbyByZXNvbHZlIHRoaXMsIHN1Y2ggYSBtYWxmb3JtZWQgZXJyb3Igb2JqZWN0IHdpbGwgc3RpbGwgcGFzc1xuICogYGNhbkJlVmFsaWRgIHNvIG1hcnNoYWwgY2FuIHVzZSB0aGlzIGZvciB0b3AgbGV2ZWwgZXJyb3IgdG8gcmVwb3J0IGZyb20sXG4gKiBldmVuIGlmIGl0IHdvdWxkIG5vdCBhY3R1YWxseSB2YWxpZGF0ZS5cbiAqIEluc3RlYWQsIHRoZSBkaWFnbm9zdGljcyB0aGF0IGBhc3NlcnRFcnJvcmAgd291bGQgaGF2ZSByZXBvcnRlZCBhcmVcbiAqIGF0dGFjaGVkIGFzIG5vdGVzIHRvIHRoZSBtYWxmb3JtZWQgZXJyb3IuIFRodXMsIGEgbWFsZm9ybWVkXG4gKiBlcnJvciBpcyBwYXNzYWJsZSBieSBpdHNlbGYsIGJ1dCBub3QgYXMgcGFydCBvZiBhIHBhc3NhYmxlIHN0cnVjdHVyZS5cbiAqXG4gKiBAdHlwZSB7UGFzc1N0eWxlSGVscGVyfVxuICovXG5jb25zdCAgICAgICAgRXJyb3JIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZTonZXJyb3InLFxuXG5jYW5CZVZhbGlkOihjYW5kaWRhdGUsY2hlY2spPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuLyogVE9ETzogTmVlZCBhIGJldHRlciB0ZXN0IHRoYW4gaW5zdGFuY2VvZiovXG5pZighKGNhbmRpZGF0ZSBpbnN0YW5jZW9mIEVycm9yKSl7XG5yZXR1cm4gcmVqZWN0JiZyZWplY3QoWCBgRXJyb3IgZXhwZWN0ZWQ6ICR7Y2FuZGlkYXRlfWApO1xuIH1cbmNvbnN0IHByb3RvPWdldFByb3RvdHlwZU9mKGNhbmRpZGF0ZSk7XG5jb25zdHtuYW1lfT1wcm90bztcbmNvbnN0IEVDPWdldEVycm9yQ29uc3RydWN0b3IobmFtZSk7XG5pZighRUN8fEVDLnByb3RvdHlwZSE9PXByb3RvKXtcbmNvbnN0IG5vdGU9WCBgRXJyb3JzIG11c3QgaW5oZXJpdCBmcm9tIGFuIGVycm9yIGNsYXNzIC5wcm90b3R5cGUgJHtjYW5kaWRhdGV9YDtcbi8qIE9ubHkgdGVybWluYXRlIGlmIGNoZWNrIHRocm93cyovXG5yZWplY3QmJnJlamVjdChub3RlKTtcbmFzc2VydC5ub3RlKGNhbmRpZGF0ZSxub3RlKTtcbiB9XG5cbmNvbnN0e1xuLyogTXVzdCBhbGxvdyBgY2F1c2VgLCBgZXJyb3JzYCovXG5tZXNzYWdlOm1EZXNjLFxuLyogQWxsb3cgYnV0IGlnbm9yZSBvbmx5IGV4dHJhbmVvdXMgb3duIGBzdGFja2AgcHJvcGVydHkuKi9cbnN0YWNrOl9vcHRTdGFja0Rlc2MsXG4uLi5yZXN0RGVzY3N9PVxuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xuaWYob3duS2V5cyhyZXN0RGVzY3MpLmxlbmd0aD49MSl7XG5jb25zdCBub3RlPVggYFBhc3NlZCBFcnJvciBoYXMgZXh0cmEgdW5wYXNzZWQgcHJvcGVydGllcyAke3Jlc3REZXNjc31gO1xuLyogT25seSB0ZXJtaW5hdGUgaWYgY2hlY2sgdGhyb3dzKi9cbnJlamVjdCYmcmVqZWN0KG5vdGUpO1xuYXNzZXJ0Lm5vdGUoY2FuZGlkYXRlLG5vdGUpO1xuIH1cbmlmKG1EZXNjKXtcbmlmKHR5cGVvZiBtRGVzYy52YWx1ZSE9PSdzdHJpbmcnKXtcbmNvbnN0IG5vdGU9WCBgUGFzc2VkIEVycm9yIFwibWVzc2FnZVwiICR7bURlc2N9IG11c3QgYmUgYSBzdHJpbmctdmFsdWVkIGRhdGEgcHJvcGVydHkuYDtcbi8qIE9ubHkgdGVybWluYXRlIGlmIGNoZWNrIHRocm93cyovXG5yZWplY3QmJnJlamVjdChub3RlKTtcbmFzc2VydC5ub3RlKGNhbmRpZGF0ZSxub3RlKTtcbiB9XG5pZihtRGVzYy5lbnVtZXJhYmxlKXtcbmNvbnN0IG5vdGU9WCBgUGFzc2VkIEVycm9yIFwibWVzc2FnZVwiICR7bURlc2N9IG11c3Qgbm90IGJlIGVudW1lcmFibGVgO1xuLyogT25seSB0ZXJtaW5hdGUgaWYgY2hlY2sgdGhyb3dzKi9cbnJlamVjdCYmcmVqZWN0KG5vdGUpO1xuYXNzZXJ0Lm5vdGUoY2FuZGlkYXRlLG5vdGUpO1xuIH1cbiB9XG5yZXR1cm4gdHJ1ZTtcbiB9LFxuXG5hc3NlcnRWYWxpZDooY2FuZGlkYXRlKT0+e1xuRXJyb3JIZWxwZXIuY2FuQmVWYWxpZChjYW5kaWRhdGUsYXNzZXJ0Q2hlY2tlcik7XG4gfX0pO1xuXG5cbi8qKlxuICogUmV0dXJuIGEgbmV3IHBhc3NhYmxlIGVycm9yIHRoYXQgcHJvcGFnYXRlcyB0aGUgZGlhZ25vc3RpYyBpbmZvIG9mIHRoZVxuICogb3JpZ2luYWwsIGFuZCBpcyBsaW5rZWQgdG8gdGhlIG9yaWdpbmFsIGFzIGEgbm90ZS5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEByZXR1cm5zIHtFcnJvcn1cbiAqLyRo4oCNX29uY2UuRXJyb3JIZWxwZXIoRXJyb3JIZWxwZXIpO1xuY29uc3QgICAgICAgIHRvUGFzc2FibGVFcnJvcj0oZXJyKT0+e1xuY29uc3R7bmFtZSxtZXNzYWdlfT1lcnI7XG5cbmNvbnN0IEVDPWdldEVycm9yQ29uc3RydWN0b3IoIGAke25hbWV9YCl8fEVycm9yO1xuY29uc3QgbmV3RXJyb3I9aGFyZGVuKG5ldyBFQyggYCR7bWVzc2FnZX1gKSk7XG4vKiBFdmVuIHRoZSBjbGVhbmVkIHVwIGVycm9yIGNvcHksIGlmIHNlbnQgdG8gdGhlIGNvbnNvbGUsIHNob3VsZCovXG4vKiBjYXVzZSBoaWRkZW4gZGlhZ25vc3RpYyBpbmZvcm1hdGlvbiBvZiB0aGUgb3JpZ2luYWwgZXJyb3IqL1xuLyogdG8gYmUgbG9nZ2VkLiovXG5hc3NlcnQubm90ZShuZXdFcnJvcixYIGBjb3BpZWQgZnJvbSBlcnJvciAke2Vycn1gKTtcbnJldHVybiBuZXdFcnJvcjtcbiB9OyRo4oCNX29uY2UudG9QYXNzYWJsZUVycm9yKHRvUGFzc2FibGVFcnJvcik7XG5oYXJkZW4odG9QYXNzYWJsZUVycm9yKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRFcnJvckNvbnN0cnVjdG9yIjpbImdldEVycm9yQ29uc3RydWN0b3IiXSwiRXJyb3JIZWxwZXIiOlsiRXJyb3JIZWxwZXIiXSwidG9QYXNzYWJsZUVycm9yIjpbInRvUGFzc2FibGVFcnJvciJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAADRMbrZRggAAEYIAAAwAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvaXRlci1oZWxwZXJzLmpzeyJpbXBvcnRzIjpbIi4uL21ha2UtZmFyLmpzIl0sImV4cG9ydHMiOlsiZmlsdGVySXRlcmFibGUiLCJtYXBJdGVyYWJsZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBGYXI7JGjigI1faW1wb3J0cyhbW1wiLi4vbWFrZS1mYXIuanNcIiwgW1tcIkZhclwiLCBbJGjigI1fYSA9PiAoRmFyID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG4vKipcbiAqIFRoZSByZXN1bHQgaXRlcmF0b3IgaGFzIGFzIG1hbnkgZWxlbWVudHMgYXMgdGhlIGBiYXNlSXRlcmF0b3JgIGFuZFxuICogaGF2ZSB0aGUgc2FtZSB0ZXJtaW5hdGlvbiAtLSB0aGUgc2FtZSBjb21wbGV0aW9uIHZhbHVlIG9yIGZhaWx1cmVcbiAqIHJlYXNvbi4gQnV0IHRoZSBub24tZmluYWwgdmFsdWVzIGFyZSB0aGUgY29ycmVzcG9uZGluZyBub24tZmluYWxcbiAqIHZhbHVlcyBmcm9tIGBiYXNlSXRlcmF0b3JgIGFzIHRyYW5zZm9ybWVkIGJ5IGBmdW5jYC5cbiAqXG4gKiBAdGVtcGxhdGUgVCxVXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFQ+fSBiYXNlSXRlcmFibGVcbiAqIEBwYXJhbSB7KHZhbHVlOiBUKSA9PiBVfSBmdW5jXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8VT59XG4gKi9cbmNvbnN0ICAgICAgICBtYXBJdGVyYWJsZT0oYmFzZUl0ZXJhYmxlLGZ1bmMpPT5cbi8qKiBAdHlwZSB7SXRlcmFibGU8VT59ICovXG5GYXIoJ21hcHBlZCBpdGVyYWJsZScse1xuW1N5bWJvbC5pdGVyYXRvcl06KCk9PntcbmNvbnN0IGJhc2VJdGVyYXRvcj1iYXNlSXRlcmFibGVbU3ltYm9sLml0ZXJhdG9yXSgpO1xucmV0dXJuIEZhcignbWFwcGVkIGl0ZXJhdG9yJyx7XG5uZXh0OigpPT57XG5jb25zdHt2YWx1ZTpiYXNlVmFsdWUsZG9uZX09YmFzZUl0ZXJhdG9yLm5leHQoKTtcbmNvbnN0IHZhbHVlPWRvbmU/YmFzZVZhbHVlOmZ1bmMoYmFzZVZhbHVlKTtcbnJldHVybiBoYXJkZW4oe3ZhbHVlLGRvbmV9KTtcbiB9fSk7XG5cbiB9fSk7JGjigI1fb25jZS5tYXBJdGVyYWJsZShtYXBJdGVyYWJsZSk7XG5cbmhhcmRlbihtYXBJdGVyYWJsZSk7XG5cbi8qKlxuICogVGhlIHJlc3VsdCBpdGVyYXRvciBoYXMgYSBzdWJzZXQgb2YgdGhlIG5vbi1maW5hbCB2YWx1ZXMgZnJvbSB0aGVcbiAqIGBiYXNlSXRlcmF0b3JgIC0tLSB0aG9zZSBmb3Igd2hpY2ggYHByZWQodmFsdWUpYCB3YXMgdHJ1dGh5LiBUaGUgcmVzdWx0XG4gKiBoYXMgdGhlIHNhbWUgdGVybWluYXRpb24gYXMgdGhlIGBiYXNlSXRlcmF0b3JgIC0tIHRoZSBzYW1lIGNvbXBsZXRpb24gdmFsdWVcbiAqIG9yIGZhaWx1cmUgcmVhc29uLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFQ+fSBiYXNlSXRlcmFibGVcbiAqIEBwYXJhbSB7KHZhbHVlOiBUKSA9PiBib29sZWFufSBwcmVkXG4gKiBAcmV0dXJucyB7SXRlcmFibGU8VD59XG4gKi9cbmNvbnN0ICAgICAgICBmaWx0ZXJJdGVyYWJsZT0oYmFzZUl0ZXJhYmxlLHByZWQpPT5cbi8qKiBAdHlwZSB7SXRlcmFibGU8VT59ICovXG5GYXIoJ2ZpbHRlcmVkIGl0ZXJhYmxlJyx7XG5bU3ltYm9sLml0ZXJhdG9yXTooKT0+e1xuY29uc3QgYmFzZUl0ZXJhdG9yPWJhc2VJdGVyYWJsZVtTeW1ib2wuaXRlcmF0b3JdKCk7XG5yZXR1cm4gRmFyKCdmaWx0ZXJlZCBpdGVyYXRvcicse1xubmV4dDooKT0+e1xuZm9yKDs7KXtcbmNvbnN0IHJlc3VsdD1iYXNlSXRlcmF0b3IubmV4dCgpO1xuY29uc3R7dmFsdWUsZG9uZX09cmVzdWx0O1xuaWYoZG9uZXx8cHJlZCh2YWx1ZSkpe1xucmV0dXJuIHJlc3VsdDtcbiB9XG4gfVxuIH19KTtcblxuIH19KTskaOKAjV9vbmNlLmZpbHRlckl0ZXJhYmxlKGZpbHRlckl0ZXJhYmxlKTtcblxuaGFyZGVuKGZpbHRlckl0ZXJhYmxlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYXBJdGVyYWJsZSI6WyJtYXBJdGVyYWJsZSJdLCJmaWx0ZXJJdGVyYWJsZSI6WyJmaWx0ZXJJdGVyYWJsZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAAMAuon9BkAAPQZAAA1AAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIlBBU1NfU1RZTEUiLCJhc3NlcnRDaGVja2VyIiwiY2FuQmVNZXRob2QiLCJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIiwiY2hlY2tOb3JtYWxQcm9wZXJ0eSIsImNoZWNrUGFzc1N0eWxlIiwiY2hlY2tUYWdSZWNvcmQiLCJnZXRUYWciLCJoYXNPd25Qcm9wZXJ0eU9mIiwiaXNPYmplY3QiLCJpc1R5cGVkQXJyYXkiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuXG4vKi8gPHJlZmVyZW5jZSB0eXBlcz1cInNlc1wiLz4qL1xuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzLmpzJykuQ2hlY2tlcn0gQ2hlY2tlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcy5qcycpLlBhc3NTdHlsZX0gUGFzc1N0eWxlICovXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e3Byb3RvdHlwZTpmdW5jdGlvblByb3RvdHlwZX09RnVuY3Rpb247XG5jb25zdHtcbmdldE93blByb3BlcnR5RGVzY3JpcHRvcixcbmdldFByb3RvdHlwZU9mLFxuaGFzT3duUHJvcGVydHk6b2JqZWN0SGFzT3duUHJvcGVydHksXG5pc0Zyb3plbixcbnByb3RvdHlwZTpvYmplY3RQcm90b3R5cGV9PVxuT2JqZWN0O1xuY29uc3R7YXBwbHl9PVJlZmxlY3Q7XG5jb25zdHt0b1N0cmluZ1RhZzp0b1N0cmluZ1RhZ1N5bWJvbH09U3ltYm9sO1xuXG5jb25zdCB0eXBlZEFycmF5UHJvdG90eXBlPWdldFByb3RvdHlwZU9mKFVpbnQ4QXJyYXkucHJvdG90eXBlKTtcbmNvbnN0IHR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2M9Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKFxudHlwZWRBcnJheVByb3RvdHlwZSxcbnRvU3RyaW5nVGFnU3ltYm9sKTtcblxuYXNzZXJ0KHR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2MpO1xuY29uc3QgZ2V0VHlwZWRBcnJheVRvU3RyaW5nVGFnPXR5cGVkQXJyYXlUb1N0cmluZ1RhZ0Rlc2MuZ2V0O1xuYXNzZXJ0KHR5cGVvZiBnZXRUeXBlZEFycmF5VG9TdHJpbmdUYWc9PT0nZnVuY3Rpb24nKTtcblxuY29uc3QgICAgICAgIGhhc093blByb3BlcnR5T2Y9KG9iaixwcm9wKT0+XG5hcHBseShvYmplY3RIYXNPd25Qcm9wZXJ0eSxvYmosW3Byb3BdKTskaOKAjV9vbmNlLmhhc093blByb3BlcnR5T2YoaGFzT3duUHJvcGVydHlPZik7XG5oYXJkZW4oaGFzT3duUHJvcGVydHlPZik7XG5cbmNvbnN0ICAgICAgICBpc09iamVjdD0odmFsKT0+T2JqZWN0KHZhbCk9PT12YWw7JGjigI1fb25jZS5pc09iamVjdChpc09iamVjdCk7XG5oYXJkZW4oaXNPYmplY3QpO1xuXG4vKipcbiAqIER1cGxpY2F0ZXMgcGFja2FnZXMvc2VzL3NyYy9tYWtlLWhhcmRlbmVyLmpzIHRvIGF2b2lkIGEgZGVwZW5kZW5jeS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IG9iamVjdFxuICovXG5jb25zdCAgICAgICAgaXNUeXBlZEFycmF5PShvYmplY3QpPT57XG4vKiBUaGUgb2JqZWN0IG11c3QgcGFzcyBhIGJyYW5kIGNoZWNrIG9yIHRvU3RyaW5nVGFnIHdpbGwgcmV0dXJuIHVuZGVmaW5lZC4qL1xuY29uc3QgdGFnPWFwcGx5KGdldFR5cGVkQXJyYXlUb1N0cmluZ1RhZyxvYmplY3QsW10pO1xucmV0dXJuIHRhZyE9PXVuZGVmaW5lZDtcbiB9OyRo4oCNX29uY2UuaXNUeXBlZEFycmF5KGlzVHlwZWRBcnJheSk7XG5oYXJkZW4oaXNUeXBlZEFycmF5KTtcblxuY29uc3QgICAgICAgIFBBU1NfU1RZTEU9U3ltYm9sLmZvcigncGFzc1N0eWxlJyk7XG5cbi8qKlxuICogRm9yIGEgZnVuY3Rpb24gdG8gYmUgYSB2YWxpZCBtZXRob2QsIGl0IG11c3Qgbm90IGJlIHBhc3NhYmxlLlxuICogT3RoZXJ3aXNlLCB3ZSByaXNrIGNvbmZ1c2luZyBwYXNzLWJ5LWNvcHkgZGF0YSBjYXJyeWluZ1xuICogZmFyIGZ1bmN0aW9ucyB3aXRoIGF0dGVtcHRzIGF0IGZhciBvYmplY3RzIHdpdGggbWV0aG9kcy5cbiAqXG4gKiBUT0RPIEhBWkFSRCBCZWNhdXNlIHdlIGNoZWNrIHRoaXMgb24gdGhlIHdheSB0byBoYXJkZW5pbmcgYSByZW1vdGFibGUsXG4gKiB3ZSBjYW5ub3QgeWV0IGNoZWNrIHRoYXQgYGZ1bmNgIGlzIGhhcmRlbmVkLiBIb3dldmVyLCB3aXRob3V0XG4gKiBkb2luZyBzbywgaXQncyBpbmhlcml0YW5jZSBtaWdodCBjaGFuZ2UgYWZ0ZXIgdGhlIGBQQVNTX1NUWUxFYFxuICogY2hlY2sgYmVsb3cuXG4gKlxuICogQHBhcmFtIHthbnl9IGZ1bmNcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjigI1fb25jZS5QQVNTX1NUWUxFKFBBU1NfU1RZTEUpO1xuY29uc3QgICAgICAgIGNhbkJlTWV0aG9kPShmdW5jKT0+XG50eXBlb2YgZnVuYz09PSdmdW5jdGlvbicmJiEoUEFTU19TVFlMRSBpbiBmdW5jKTskaOKAjV9vbmNlLmNhbkJlTWV0aG9kKGNhbkJlTWV0aG9kKTtcbmhhcmRlbihjYW5CZU1ldGhvZCk7XG5cbi8qKlxuICogQmVsb3cgd2UgaGF2ZSBhIHNlcmllcyBvZiBwcmVkaWNhdGUgZnVuY3Rpb25zIGFuZCB0aGVpciAoY3VycmllZCkgYXNzZXJ0aW9uXG4gKiBmdW5jdGlvbnMuIFRoZSBzZW1hbnRpY3Mgb2YgdGhlIGFzc2VydGlvbiBmdW5jdGlvbiBpcyBqdXN0IHRvIGFzc2VydCB0aGF0XG4gKiB0aGUgY29ycmVzcG9uZGluZyBwcmVkaWNhdGUgZnVuY3Rpb24gd291bGQgaGF2ZSByZXR1cm5lZCB0cnVlLiBCdXQgaXRcbiAqIHJlcHJvZHVjZXMgdGhlIGludGVybmFsIHRlc3RzIHNvIGZhaWx1cmVzIGNhbiBnaXZlIGEgYmV0dGVyIGVycm9yIG1lc3NhZ2UuXG4gKlxuICogQHR5cGUge0NoZWNrZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRDaGVja2VyPShjb25kLGRldGFpbHMpPT57XG5hc3NlcnQoY29uZCxkZXRhaWxzKTtcbnJldHVybiB0cnVlO1xuIH07JGjigI1fb25jZS5hc3NlcnRDaGVja2VyKGFzc2VydENoZWNrZXIpO1xuaGFyZGVuKGFzc2VydENoZWNrZXIpO1xuXG4vKipcbiAqIENoZWNrcyBmb3IgdGhlIHByZXNlbmNlIGFuZCBlbnVtZXJhYmlsaXR5IG9mIGFuIG93biBkYXRhIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjYW5kaWRhdGVcbiAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxzeW1ib2x9IHByb3BlcnR5TmFtZVxuICogQHBhcmFtIHtib29sZWFufSBzaG91bGRCZUVudW1lcmFibGVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBjaGVja05vcm1hbFByb3BlcnR5PShcbmNhbmRpZGF0ZSxcbnByb3BlcnR5TmFtZSxcbnNob3VsZEJlRW51bWVyYWJsZSxcbmNoZWNrKT0+XG57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuY29uc3QgZGVzYz1nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY2FuZGlkYXRlLHByb3BlcnR5TmFtZSk7XG5pZihkZXNjPT09dW5kZWZpbmVkKXtcbnJldHVybihcbnJlamVjdCYmcmVqZWN0KFggYCR7cShwcm9wZXJ0eU5hbWUpfSBwcm9wZXJ0eSBleHBlY3RlZDogJHtjYW5kaWRhdGV9YCkpO1xuXG4gfVxucmV0dXJuKFxuKGhhc093blByb3BlcnR5T2YoZGVzYywndmFsdWUnKXx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgJHtxKHByb3BlcnR5TmFtZSl9IG11c3Qgbm90IGJlIGFuIGFjY2Vzc29yIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gKSkmJihcblxuc2hvdWxkQmVFbnVtZXJhYmxlP1xuZGVzYy5lbnVtZXJhYmxlfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGAke3EocHJvcGVydHlOYW1lKX0gbXVzdCBiZSBhbiBlbnVtZXJhYmxlIHByb3BlcnR5OiAke2NhbmRpZGF0ZX1gKTpcblxuIWRlc2MuZW51bWVyYWJsZXx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgJHtxKFxucHJvcGVydHlOYW1lKVxuIH0gbXVzdCBub3QgYmUgYW4gZW51bWVyYWJsZSBwcm9wZXJ0eTogJHtjYW5kaWRhdGV9YCkpKTtcblxuXG4gfTskaOKAjV9vbmNlLmNoZWNrTm9ybWFsUHJvcGVydHkoY2hlY2tOb3JtYWxQcm9wZXJ0eSk7XG5oYXJkZW4oY2hlY2tOb3JtYWxQcm9wZXJ0eSk7XG5cbmNvbnN0ICAgICAgICBnZXRUYWc9KHRhZ1JlY29yZCk9PnRhZ1JlY29yZFtTeW1ib2wudG9TdHJpbmdUYWddOyRo4oCNX29uY2UuZ2V0VGFnKGdldFRhZyk7XG5oYXJkZW4oZ2V0VGFnKTtcblxuY29uc3QgICAgICAgIGNoZWNrUGFzc1N0eWxlPShvYmosZXhwZWN0ZWRQYXNzU3R5bGUsY2hlY2spPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuY29uc3QgYWN0dWFsPW9ialtQQVNTX1NUWUxFXTtcbnJldHVybihcbmFjdHVhbD09PWV4cGVjdGVkUGFzc1N0eWxlfHxcbnJlamVjdCYmXG5yZWplY3QoWCBgRXhwZWN0ZWQgJHtxKGV4cGVjdGVkUGFzc1N0eWxlKX0sIG5vdCAke3EoYWN0dWFsKX06ICR7b2JqfWApKTtcblxuIH07JGjigI1fb25jZS5jaGVja1Bhc3NTdHlsZShjaGVja1Bhc3NTdHlsZSk7XG5oYXJkZW4oY2hlY2tQYXNzU3R5bGUpO1xuXG5jb25zdCBtYWtlQ2hlY2tUYWdSZWNvcmQ9KGNoZWNrUHJvdG8pPT57XG4vKipcbiAqIEBwYXJhbSB7eyBbUEFTU19TVFlMRV06IHN0cmluZyB9fSB0YWdSZWNvcmRcbiAqIEBwYXJhbSB7UGFzc1N0eWxlfSBwYXNzU3R5bGVcbiAqIEBwYXJhbSB7Q2hlY2tlcn0gW2NoZWNrXVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0IGNoZWNrVGFnUmVjb3JkPSh0YWdSZWNvcmQscGFzc1N0eWxlLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbnJldHVybihcbihpc09iamVjdCh0YWdSZWNvcmQpfHxcbnJlamVjdCYmXG5yZWplY3QoWCBgQSBub24tb2JqZWN0IGNhbm5vdCBiZSBhIHRhZ1JlY29yZDogJHt0YWdSZWNvcmR9YCkpJiYoXG5pc0Zyb3plbih0YWdSZWNvcmQpfHxcbnJlamVjdCYmcmVqZWN0KFggYEEgdGFnUmVjb3JkIG11c3QgYmUgZnJvemVuOiAke3RhZ1JlY29yZH1gKSkmJihcbiFpc0FycmF5KHRhZ1JlY29yZCl8fFxucmVqZWN0JiZyZWplY3QoWCBgQW4gYXJyYXkgY2Fubm90IGJlIGEgdGFnUmVjb3JkOiAke3RhZ1JlY29yZH1gKSkmJlxuY2hlY2tOb3JtYWxQcm9wZXJ0eSh0YWdSZWNvcmQsUEFTU19TVFlMRSxmYWxzZSxjaGVjaykmJlxuY2hlY2tQYXNzU3R5bGUodGFnUmVjb3JkLHBhc3NTdHlsZSxjaGVjaykmJlxuY2hlY2tOb3JtYWxQcm9wZXJ0eSh0YWdSZWNvcmQsU3ltYm9sLnRvU3RyaW5nVGFnLGZhbHNlLGNoZWNrKSYmKFxudHlwZW9mIGdldFRhZyh0YWdSZWNvcmQpPT09J3N0cmluZyd8fFxucmVqZWN0JiZcbnJlamVjdChcblggYEEgW1N5bWJvbC50b1N0cmluZ1RhZ10tbmFtZWQgcHJvcGVydHkgbXVzdCBiZSBhIHN0cmluZzogJHt0YWdSZWNvcmR9YCkpJiZcblxuY2hlY2tQcm90byh0YWdSZWNvcmQsZ2V0UHJvdG90eXBlT2YodGFnUmVjb3JkKSxjaGVjaykpO1xuXG4gfTtcbnJldHVybiBoYXJkZW4oY2hlY2tUYWdSZWNvcmQpO1xuIH07XG5cbmNvbnN0ICAgICAgICBjaGVja1RhZ1JlY29yZD1tYWtlQ2hlY2tUYWdSZWNvcmQoXG4odmFsLHByb3RvLGNoZWNrKT0+XG5wcm90bz09PW9iamVjdFByb3RvdHlwZXx8XG4hIWNoZWNrJiZcbmNoZWNrKGZhbHNlLFggYEEgdGFnUmVjb3JkIG11c3QgaW5oZXJpdCBmcm9tIE9iamVjdC5wcm90b3R5cGU6ICR7dmFsfWApKTskaOKAjV9vbmNlLmNoZWNrVGFnUmVjb3JkKGNoZWNrVGFnUmVjb3JkKTtcblxuaGFyZGVuKGNoZWNrVGFnUmVjb3JkKTtcblxuY29uc3QgICAgICAgIGNoZWNrRnVuY3Rpb25UYWdSZWNvcmQ9bWFrZUNoZWNrVGFnUmVjb3JkKFxuKHZhbCxwcm90byxjaGVjayk9PlxucHJvdG89PT1mdW5jdGlvblByb3RvdHlwZXx8XG5wcm90byE9PW51bGwmJmdldFByb3RvdHlwZU9mKHByb3RvKT09PWZ1bmN0aW9uUHJvdG90eXBlfHxcbiEhY2hlY2smJlxuY2hlY2soXG5mYWxzZSxcblggYEZvciBmdW5jdGlvbnMsIGEgdGFnUmVjb3JkIG11c3QgaW5oZXJpdCBmcm9tIEZ1bmN0aW9uLnByb3RvdHlwZTogJHt2YWx9YCkpOyRo4oCNX29uY2UuY2hlY2tGdW5jdGlvblRhZ1JlY29yZChjaGVja0Z1bmN0aW9uVGFnUmVjb3JkKTtcblxuXG5oYXJkZW4oY2hlY2tGdW5jdGlvblRhZ1JlY29yZCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaGFzT3duUHJvcGVydHlPZiI6WyJoYXNPd25Qcm9wZXJ0eU9mIl0sImlzT2JqZWN0IjpbImlzT2JqZWN0Il0sImlzVHlwZWRBcnJheSI6WyJpc1R5cGVkQXJyYXkiXSwiUEFTU19TVFlMRSI6WyJQQVNTX1NUWUxFIl0sImNhbkJlTWV0aG9kIjpbImNhbkJlTWV0aG9kIl0sImFzc2VydENoZWNrZXIiOlsiYXNzZXJ0Q2hlY2tlciJdLCJjaGVja05vcm1hbFByb3BlcnR5IjpbImNoZWNrTm9ybWFsUHJvcGVydHkiXSwiZ2V0VGFnIjpbImdldFRhZyJdLCJjaGVja1Bhc3NTdHlsZSI6WyJjaGVja1Bhc3NTdHlsZSJdLCJjaGVja1RhZ1JlY29yZCI6WyJjaGVja1RhZ1JlY29yZCJdLCJjaGVja0Z1bmN0aW9uVGFnUmVjb3JkIjpbImNoZWNrRnVuY3Rpb25UYWdSZWNvcmQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAABPJsPvYfAAD2HwAALQAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL3JlbW90YWJsZS5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiUmVtb3RhYmxlSGVscGVyIiwiYXNzZXJ0SWZhY2UiLCJnZXRJbnRlcmZhY2VPZiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLGNhbkJlTWV0aG9kLGhhc093blByb3BlcnR5T2YsUEFTU19TVFlMRSxjaGVja1RhZ1JlY29yZCxjaGVja0Z1bmN0aW9uVGFnUmVjb3JkLGlzT2JqZWN0LGdldFRhZzskaOKAjV9pbXBvcnRzKFtbXCIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJhc3NlcnRDaGVja2VyXCIsIFskaOKAjV9hID0+IChhc3NlcnRDaGVja2VyID0gJGjigI1fYSldXSxbXCJjYW5CZU1ldGhvZFwiLCBbJGjigI1fYSA9PiAoY2FuQmVNZXRob2QgPSAkaOKAjV9hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dLFtcIlBBU1NfU1RZTEVcIiwgWyRo4oCNX2EgPT4gKFBBU1NfU1RZTEUgPSAkaOKAjV9hKV1dLFtcImNoZWNrVGFnUmVjb3JkXCIsIFskaOKAjV9hID0+IChjaGVja1RhZ1JlY29yZCA9ICRo4oCNX2EpXV0sW1wiY2hlY2tGdW5jdGlvblRhZ1JlY29yZFwiLCBbJGjigI1fYSA9PiAoY2hlY2tGdW5jdGlvblRhZ1JlY29yZCA9ICRo4oCNX2EpXV0sW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMuanMnKS5DaGVja2VyfSBDaGVja2VyICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4uL3R5cGVzLmpzJykuSW50ZXJmYWNlU3BlY30gSW50ZXJmYWNlU3BlYyAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcy5qcycpLk1hcnNoYWxHZXRJbnRlcmZhY2VPZn0gTWFyc2hhbEdldEludGVyZmFjZU9mICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9IFBhc3NTdHlsZUhlbHBlciAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuLi90eXBlcy5qcycpLlJlbW90YWJsZX0gUmVtb3RhYmxlICovXG5cbmNvbnN0e2RldGFpbHM6WCxGYWlsLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e293bktleXN9PVJlZmxlY3Q7XG5jb25zdHtpc0FycmF5fT1BcnJheTtcbmNvbnN0e1xuZ2V0UHJvdG90eXBlT2YsXG5pc0Zyb3plbixcbnByb3RvdHlwZTpvYmplY3RQcm90b3R5cGUsXG5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzfT1cbk9iamVjdDtcblxuLyoqXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IGlmYWNlXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqL1xuY29uc3QgY2hlY2tJZmFjZT0oaWZhY2UsY2hlY2spPT57XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xucmV0dXJuKFxuLyogVE9ETyBvdGhlciBwb3NzaWJsZSBpZmFjZXMsIG9uY2Ugd2UgaGF2ZSB0aGlyZCBwYXJ0eSB2ZXJhY2l0eSovXG4odHlwZW9mIGlmYWNlPT09J3N0cmluZyd8fFxucmVqZWN0JiZcbnJlamVjdChcblggYEZvciBub3csIGludGVyZmFjZSAke2lmYWNlfSBtdXN0IGJlIGEgc3RyaW5nOyB1bmltcGxlbWVudGVkYCkpJiYoXG5cbmlmYWNlPT09J1JlbW90YWJsZSd8fFxuaWZhY2Uuc3RhcnRzV2l0aCgnQWxsZWdlZDogJyl8fFxucmVqZWN0JiZcbnJlamVjdChcblggYEZvciBub3csIGlmYWNlICR7cShcbmlmYWNlKVxuIH0gbXVzdCBiZSBcIlJlbW90YWJsZVwiIG9yIGJlZ2luIHdpdGggXCJBbGxlZ2VkOiBcIjsgdW5pbXBsZW1lbnRlZGApKSk7XG5cblxuIH07XG5cbi8qKlxuICogQW4gYGlmYWNlYCBtdXN0IGJlIHB1cmUuIFJpZ2h0IG5vdyBpdCBtdXN0IGJlIGEgc3RyaW5nLCB3aGljaCBpcyBwdXJlLlxuICogTGF0ZXIgd2UgZXhwZWN0IHRvIGluY2x1ZGUgc29tZSBvdGhlciB2YWx1ZXMgdGhhdCBxdWFsaWZ5IGFzIGBQdXJlRGF0YWAsXG4gKiB3aGljaCBpcyBhIHBhc3MtYnktY29weSBzdXBlcnN0cnVjdHVyZSBlbmRpbmcgb25seSBpbiBwcmltaXRpdmVzIG9yXG4gKiBlbXB0eSBwYXNzLWJ5LWNvcHkgY29tcG9zaXRlcy4gTm8gcmVtb3RhYmxlcywgcHJvbWlzZXMsIG9yIGVycm9ycy5cbiAqIFdlICphc3N1bWUqIGZvciBub3cgdGhhdCB0aGUgcGFzcy1ieS1jb3B5IHN1cGVyc3RydWN0dXJlIGNvbnRhaW5zIG5vXG4gKiBwcm94aWVzLlxuICpcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gaWZhY2VcbiAqL1xuY29uc3QgICAgICAgIGFzc2VydElmYWNlPShpZmFjZSk9PmNoZWNrSWZhY2UoaWZhY2UsYXNzZXJ0Q2hlY2tlcik7JGjigI1fb25jZS5hc3NlcnRJZmFjZShhc3NlcnRJZmFjZSk7XG5oYXJkZW4oYXNzZXJ0SWZhY2UpO1xuXG4vKipcbiAqIEBwYXJhbSB7b2JqZWN0IHwgRnVuY3Rpb259IG9yaWdpbmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja1JlbW90YWJsZVByb3RvT2Y9KG9yaWdpbmFsLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmlzT2JqZWN0KG9yaWdpbmFsKXx8XG5GYWlsIGBSZW1vdGFibGVzIG11c3QgYmUgb2JqZWN0cyBvciBmdW5jdGlvbnM6ICR7b3JpZ2luYWx9YDtcblxuLyogQSB2YWxpZCByZW1vdGFibGUgb2JqZWN0IG11c3QgaW5oZXJpdCBmcm9tIGEgXCJ0YWcgcmVjb3JkXCIgLS0gYSovXG4vKiBwbGFpbi1vYmplY3QgcHJvdG90eXBlIGNvbnNpc3Rpbmcgb2Ygb25seSovXG4vKiBhIGBQQVNTX1NUWUxFYCBwcm9wZXJ0eSB3aXRoIHZhbHVlIFwicmVtb3RhYmxlXCIgYW5kIGEgc3VpdGFibGUgYFN5bWJvbC50b1N0cmluZ1RhZ2AqL1xuLyogcHJvcGVydHkuIFRoZSByZW1vdGFibGUgY291bGQgaW5oZXJpdCBkaXJlY3RseSBmcm9tIHN1Y2ggYSB0YWcgcmVjb3JkLCBvciovXG4vKiBpdCBjb3VsZCBpbmhlcml0IGZyb20gYW5vdGhlciB2YWxpZCByZW1vdGFibGUsIHRoYXQgdGhlcmVmb3JlIGl0c2VsZiovXG4vKiBpbmhlcml0cyBkaXJlY3RseSBvciBpbmRpcmVjdGx5IGZyb20gc3VjaCBhIHRhZyByZWNvcmQuKi9cbi8qKi9cbi8qIFRPRE86IEl0IHdvdWxkIGJlIG5pY2UgdG8gdHlwZWRlZiB0aGlzIHNoYXBlLCBidXQgd2UgY2FuJ3QgZGVjbGFyZSBhIHR5cGUqL1xuLyogd2l0aCBQQVNTX1NUWUxFIGZyb20gSlNEb2MuKi9cbi8qKi9cbi8qIEB0eXBlIHt7IFtQQVNTX1NUWUxFXTogc3RyaW5nLCovXG4vKiBbU3ltYm9sLnRvU3RyaW5nVGFnXTogc3RyaW5nLCovXG4vKiB9fSovXG4vKiovXG5jb25zdCBwcm90bz1nZXRQcm90b3R5cGVPZihvcmlnaW5hbCk7XG5pZihwcm90bz09PW9iamVjdFByb3RvdHlwZXx8cHJvdG89PT1udWxsKXtcbnJldHVybihcbnJlamVjdCYmXG5yZWplY3QoWCBgUmVtb3RhYmxlcyBtdXN0IGJlIGV4cGxpY2l0bHkgZGVjbGFyZWQ6ICR7cShvcmlnaW5hbCl9YCkpO1xuXG4gfVxuXG5pZih0eXBlb2Ygb3JpZ2luYWw9PT0nb2JqZWN0Jyl7XG5jb25zdCBwcm90b1Byb3RvPWdldFByb3RvdHlwZU9mKHByb3RvKTtcbmlmKHByb3RvUHJvdG8hPT1vYmplY3RQcm90b3R5cGUmJnByb3RvUHJvdG8hPT1udWxsKXtcbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5yZXR1cm4gY2hlY2tSZW1vdGFibGUocHJvdG8sY2hlY2spO1xuIH1cbmlmKCFjaGVja1RhZ1JlY29yZChwcm90bywncmVtb3RhYmxlJyxjaGVjaykpe1xucmV0dXJuIGZhbHNlO1xuIH1cbiB9ZWxzZSBpZih0eXBlb2Ygb3JpZ2luYWw9PT0nZnVuY3Rpb24nKXtcbmlmKCFjaGVja0Z1bmN0aW9uVGFnUmVjb3JkKHByb3RvLCdyZW1vdGFibGUnLGNoZWNrKSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cblxuLyogVHlwZWNhc3RzIG5lZWRlZCBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8xODYzKi9cbmNvbnN0IHBhc3NTdHlsZUtleT0vKiogQHR5cGUge3Vua25vd259ICovUEFTU19TVFlMRTtcbmNvbnN0IHRhZ0tleT0vKiogQHR5cGUge3Vua25vd259ICovU3ltYm9sLnRvU3RyaW5nVGFnO1xuY29uc3R7XG4vKiBjaGVja1RhZ1JlY29yZCBhbHJlYWR5IHZlcmlmaWVkIFBBU1NfU1RZTEUgYW5kIFN5bWJvbC50b1N0cmluZ1RhZyBvd24gZGF0YSBwcm9wZXJ0aWVzLiovXG5bLyoqIEB0eXBlIHtzdHJpbmd9ICovcGFzc1N0eWxlS2V5XTpfcGFzc1N0eWxlRGVzYyxcblsvKiogQHR5cGUge3N0cmluZ30gKi90YWdLZXldOnt2YWx1ZTppZmFjZX0sXG4uLi5yZXN0RGVzY3N9PVxuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhwcm90byk7XG5cbnJldHVybihcbihvd25LZXlzKHJlc3REZXNjcykubGVuZ3RoPT09MHx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgVW5leHBlY3RlZCBwcm9wZXJ0aWVzIG9uIFJlbW90YWJsZSBQcm90byAke293bktleXMocmVzdERlc2NzKX1gKSkmJlxuXG5jaGVja0lmYWNlKGlmYWNlLGNoZWNrKSk7XG5cbiB9O1xuXG4vKipcbiAqIEtlZXAgYSB3ZWFrIHNldCBvZiBjb25maXJtZWQgcmVtb3RhYmxlcyBmb3IgbWFyc2hhbCBwZXJmb3JtYW5jZVxuICogKHdpdGhvdXQgd2hpY2ggd2Ugd291bGQgaW5jdXIgYSByZWR1bmRhbnQgdmVyaWZpY2F0aW9uIGluXG4gKiBnZXRJbnRlcmZhY2VPZikuXG4gKiBXZSBkb24ndCByZW1lbWJlciByZWplY3Rpb25zIGJlY2F1c2UgdGhleSBhcmUgcG9zc2libGUgdG8gY29ycmVjdFxuICogd2l0aCBlLmcuIGBoYXJkZW5gLlxuICpcbiAqIEB0eXBlIHtXZWFrU2V0PFJlbW90YWJsZT59XG4gKi9cbmNvbnN0IGNvbmZpcm1lZFJlbW90YWJsZXM9bmV3IFdlYWtTZXQoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JlbW90YWJsZX0gdmFsXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IFtjaGVja11cbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBjaGVja1JlbW90YWJsZT0odmFsLGNoZWNrKT0+e1xuaWYoY29uZmlybWVkUmVtb3RhYmxlcy5oYXModmFsKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5jb25zdCByZWplY3Q9ISFjaGVjayYmKChkZXRhaWxzKT0+Y2hlY2soZmFsc2UsZGV0YWlscykpO1xuaWYoIWlzRnJvemVuKHZhbCkpe1xucmV0dXJuIHJlamVjdCYmcmVqZWN0KFggYGNhbm5vdCBzZXJpYWxpemUgbm9uLWZyb3plbiBvYmplY3RzIGxpa2UgJHt2YWx9YCk7XG4gfVxuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbmlmKCFSZW1vdGFibGVIZWxwZXIuY2FuQmVWYWxpZCh2YWwsY2hlY2spKXtcbnJldHVybiBmYWxzZTtcbiB9XG5jb25zdCByZXN1bHQ9Y2hlY2tSZW1vdGFibGVQcm90b09mKHZhbCxjaGVjayk7XG5pZihyZXN1bHQpe1xuY29uZmlybWVkUmVtb3RhYmxlcy5hZGQodmFsKTtcbiB9XG5yZXR1cm4gcmVzdWx0O1xuIH07XG5cbi8qKiBAdHlwZSB7TWFyc2hhbEdldEludGVyZmFjZU9mfSAqL1xuY29uc3QgICAgICAgIGdldEludGVyZmFjZU9mPSh2YWwpPT57XG5pZihcbiFpc09iamVjdCh2YWwpfHxcbnZhbFtQQVNTX1NUWUxFXSE9PSdyZW1vdGFibGUnfHxcbiFjaGVja1JlbW90YWJsZSh2YWwpKVxue1xucmV0dXJuIHVuZGVmaW5lZDtcbiB9XG5yZXR1cm4gZ2V0VGFnKHZhbCk7XG4gfTskaOKAjV9vbmNlLmdldEludGVyZmFjZU9mKGdldEludGVyZmFjZU9mKTtcbmhhcmRlbihnZXRJbnRlcmZhY2VPZik7XG5cbi8qKlxuICpcbiAqIEB0eXBlIHtQYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBSZW1vdGFibGVIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZToncmVtb3RhYmxlJyxcblxuY2FuQmVWYWxpZDooY2FuZGlkYXRlLGNoZWNrKT0+e1xuY29uc3QgcmVqZWN0PSEhY2hlY2smJigoZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpKTtcbmlmKCFpc09iamVjdChjYW5kaWRhdGUpKXtcbnJldHVybihcbnJlamVjdCYmXG5yZWplY3QoWCBgY2Fubm90IHNlcmlhbGl6ZSBub24tb2JqZWN0cyBhcyBSZW1vdGFibGUgJHtjYW5kaWRhdGV9YCkpO1xuXG4gfWVsc2UgaWYoaXNBcnJheShjYW5kaWRhdGUpKXtcbnJldHVybihcbnJlamVjdCYmcmVqZWN0KFggYGNhbm5vdCBzZXJpYWxpemUgYXJyYXlzIGFzIFJlbW90YWJsZSAke2NhbmRpZGF0ZX1gKSk7XG5cbiB9XG5cbmNvbnN0IGRlc2NzPWdldE93blByb3BlcnR5RGVzY3JpcHRvcnMoY2FuZGlkYXRlKTtcbmlmKHR5cGVvZiBjYW5kaWRhdGU9PT0nb2JqZWN0Jyl7XG4vKiBFdmVyeSBvd24gcHJvcGVydHkgKHJlZ2FyZGxlc3Mgb2YgZW51bWVyYWJpbGl0eSkqL1xuLyogbXVzdCBoYXZlIGEgZnVuY3Rpb24gdmFsdWUuKi9cbmNvbnN0IGtleXM9b3duS2V5cyhkZXNjcyk7XG5yZXR1cm4ga2V5cy5ldmVyeSgoa2V5KT0+e1xucmV0dXJuKFxuLyogVHlwZWNhc3QgbmVlZGVkIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzE4NjMqL1xuKGhhc093blByb3BlcnR5T2YoZGVzY3NbLyoqIEB0eXBlIHtzdHJpbmd9ICova2V5XSwndmFsdWUnKXx8XG5yZWplY3QmJlxucmVqZWN0KFxuWCBgY2Fubm90IHNlcmlhbGl6ZSBSZW1vdGFibGVzIHdpdGggYWNjZXNzb3JzIGxpa2UgJHtxKFxuU3RyaW5nKGtleSkpXG4gfSBpbiAke2NhbmRpZGF0ZX1gKSkmJihcblxuY2FuQmVNZXRob2QoY2FuZGlkYXRlW2tleV0pfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBjYW5ub3Qgc2VyaWFsaXplIFJlbW90YWJsZXMgd2l0aCBub24tbWV0aG9kcyBsaWtlICR7cShcblN0cmluZyhrZXkpKVxuIH0gaW4gJHtjYW5kaWRhdGV9YCkpJiYoXG5cbmtleSE9PVBBU1NfU1RZTEV8fFxucmVqZWN0JiZcbnJlamVjdChYIGBBIHBhc3MtYnktcmVtb3RlIGNhbm5vdCBzaGFkb3cgJHtxKFBBU1NfU1RZTEUpfWApKSk7XG5cbiB9KTtcbiB9ZWxzZSBpZih0eXBlb2YgY2FuZGlkYXRlPT09J2Z1bmN0aW9uJyl7XG4vKiBGYXIgZnVuY3Rpb25zIGNhbm5vdCBiZSBtZXRob2RzLCBhbmQgY2Fubm90IGhhdmUgbWV0aG9kcy4qL1xuLyogVGhleSBtdXN0IGhhdmUgZXhhY3RseSBleHBlY3RlZCBgLm5hbWVgIGFuZCBgLmxlbmd0aGAgcHJvcGVydGllcyovXG5jb25zdHtuYW1lOm5hbWVEZXNjLGxlbmd0aDpsZW5ndGhEZXNjLC4uLnJlc3REZXNjc309ZGVzY3M7XG5jb25zdCByZXN0S2V5cz1vd25LZXlzKHJlc3REZXNjcyk7XG5yZXR1cm4oXG4obmFtZURlc2MmJnR5cGVvZiBuYW1lRGVzYy52YWx1ZT09PSdzdHJpbmcnfHxcbnJlamVjdCYmXG5yZWplY3QoWCBgRmFyIGZ1bmN0aW9uIG5hbWUgbXVzdCBiZSBhIHN0cmluZywgaW4gJHtjYW5kaWRhdGV9YCkpJiYoXG5sZW5ndGhEZXNjJiZ0eXBlb2YgbGVuZ3RoRGVzYy52YWx1ZT09PSdudW1iZXInfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBGYXIgZnVuY3Rpb24gbGVuZ3RoIG11c3QgYmUgYSBudW1iZXIsIGluICR7Y2FuZGlkYXRlfWApKSYmKFxuXG5yZXN0S2V5cy5sZW5ndGg9PT0wfHxcbnJlamVjdCYmXG5yZWplY3QoXG5YIGBGYXIgZnVuY3Rpb25zIHVuZXhwZWN0ZWQgcHJvcGVydGllcyBiZXNpZGVzIC5uYW1lIGFuZCAubGVuZ3RoICR7cmVzdEtleXN9YCkpKTtcblxuXG4gfWVsc2V7XG5yZXR1cm4gcmVqZWN0JiZyZWplY3QoWCBgdW5yZWNvZ25pemVkIHR5cGVvZiAke2NhbmRpZGF0ZX1gKTtcbiB9XG4gfSxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSk9PmNoZWNrUmVtb3RhYmxlKGNhbmRpZGF0ZSxhc3NlcnRDaGVja2VyKSxcblxuZXZlcnk6KF9wYXNzYWJsZSxfZm4pPT50cnVlfSk7JGjigI1fb25jZS5SZW1vdGFibGVIZWxwZXIoUmVtb3RhYmxlSGVscGVyKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3NlcnRJZmFjZSI6WyJhc3NlcnRJZmFjZSJdLCJnZXRJbnRlcmZhY2VPZiI6WyJnZXRJbnRlcmZhY2VPZiJdLCJSZW1vdGFibGVIZWxwZXIiOlsiUmVtb3RhYmxlSGVscGVyIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAABTGqsGKDwAAig8AADAAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9zYWZlLXByb21pc2UuanN7ImltcG9ydHMiOlsiLi9wYXNzU3R5bGUtaGVscGVycy5qcyIsIkBlbmRvL3Byb21pc2Uta2l0Il0sImV4cG9ydHMiOlsiYXNzZXJ0U2FmZVByb21pc2UiLCJpc1NhZmVQcm9taXNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGlzUHJvbWlzZSxhc3NlcnRDaGVja2VyLGhhc093blByb3BlcnR5T2Y7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoaXNQcm9taXNlID0gJGjigI1fYSldXV1dLFtcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImhhc093blByb3BlcnR5T2ZcIiwgWyRo4oCNX2EgPT4gKGhhc093blByb3BlcnR5T2YgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi4vdHlwZXMuanMnKS5DaGVja2VyfSBDaGVja2VyICovXG5cbmNvbnN0e2RldGFpbHM6WCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtpc0Zyb3plbixnZXRQcm90b3R5cGVPZn09T2JqZWN0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqXG4gKiBAcGFyYW0ge1Byb21pc2V9IHByIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcGFyYW0ge0NoZWNrZXJ9IGNoZWNrXG4gKiBAcmV0dXJucyB7cHIgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHNhZmUgcHJvbWlzZVxuICovXG5jb25zdCBjaGVja1Byb21pc2VPd25LZXlzPShwcixjaGVjayk9PntcbmNvbnN0IHJlamVjdD0oZGV0YWlscyk9PmNoZWNrKGZhbHNlLGRldGFpbHMpO1xuY29uc3Qga2V5cz1vd25LZXlzKHByKTtcblxuaWYoa2V5cy5sZW5ndGg9PT0wKXtcbnJldHVybiB0cnVlO1xuIH1cblxuY29uc3QgdW5rbm93bktleXM9a2V5cy5maWx0ZXIoXG4oa2V5KT0+dHlwZW9mIGtleSE9PSdzeW1ib2wnfHwhaGFzT3duUHJvcGVydHlPZihQcm9taXNlLnByb3RvdHlwZSxrZXkpKTtcblxuXG5pZih1bmtub3duS2V5cy5sZW5ndGghPT0wKXtcbnJldHVybiByZWplY3QoXG5YIGAke3ByfSAtIE11c3Qgbm90IGhhdmUgYW55IG93biBwcm9wZXJ0aWVzOiAke3EodW5rbm93bktleXMpfWApO1xuXG4gfVxuXG4vKipcbiAqIEF0IHRoZSB0aW1lIG9mIHRoaXMgd3JpdGluZywgTm9kZSdzIGFzeW5jX2hvb2tzIGNvbnRhaW5zIHRoZVxuICogZm9sbG93aW5nIGNvZGUsIHdoaWNoIHdlIGNhbiBhbHNvIHNhZmVseSB0b2xlcmF0ZVxuICpcbiAqIGBgYGpzXG4gKiBmdW5jdGlvbiBkZXN0cm95VHJhY2tpbmcocHJvbWlzZSwgcGFyZW50KSB7XG4gKiB0cmFja1Byb21pc2UocHJvbWlzZSwgcGFyZW50KTtcbiAqICAgY29uc3QgYXN5bmNJZCA9IHByb21pc2VbYXN5bmNfaWRfc3ltYm9sXTtcbiAqICAgY29uc3QgZGVzdHJveWVkID0geyBkZXN0cm95ZWQ6IGZhbHNlIH07XG4gKiAgIHByb21pc2VbZGVzdHJveWVkU3ltYm9sXSA9IGRlc3Ryb3llZDtcbiAqICAgcmVnaXN0ZXJEZXN0cm95SG9vayhwcm9taXNlLCBhc3luY0lkLCBkZXN0cm95ZWQpO1xuICogfVxuICogYGBgXG4gKlxuICogQHBhcmFtIHtzdHJpbmd8c3ltYm9sfSBrZXlcbiAqL1xuY29uc3QgY2hlY2tTYWZlQXN5bmNIb29rc0tleT0oa2V5KT0+e1xuY29uc3QgdmFsPXByW2tleV07XG5pZih2YWw9PT11bmRlZmluZWR8fHR5cGVvZiB2YWw9PT0nbnVtYmVyJyl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5pZihcbnR5cGVvZiB2YWw9PT0nb2JqZWN0JyYmXG52YWwhPT1udWxsJiZcbmlzRnJvemVuKHZhbCkmJlxuZ2V0UHJvdG90eXBlT2YodmFsKT09PU9iamVjdC5wcm90b3R5cGUpXG57XG5jb25zdCBzdWJLZXlzPW93bktleXModmFsKTtcbmlmKHN1YktleXMubGVuZ3RoPT09MCl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5cbmlmKFxuc3ViS2V5cy5sZW5ndGg9PT0xJiZcbnN1YktleXNbMF09PT0nZGVzdHJveWVkJyYmXG52YWwuZGVzdHJveWVkPT09ZmFsc2UpXG57XG5yZXR1cm4gdHJ1ZTtcbiB9XG4gfVxucmV0dXJuIHJlamVjdChcblggYFVuZXhwZWN0ZWQgTm9kZSBhc3luY19ob29rcyBhZGRpdGlvbnMgdG8gcHJvbWlzZTogJHtwcn0uJHtxKFxuU3RyaW5nKGtleSkpXG4gfSBpcyAke3ZhbH1gKTtcblxuIH07XG5cbnJldHVybiBrZXlzLmV2ZXJ5KGNoZWNrU2FmZUFzeW5jSG9va3NLZXkpO1xuIH07XG5cbi8qKlxuICogVW5kZXIgSGFyZGVuZWQgSlMgYSBwcm9taXNlIGlzIFwic2FmZVwiIGlmIGl0cyBgdGhlbmAgbWV0aG9kIGNhbiBiZSBjYWxsZWRcbiAqIHN5bmNocm9ub3VzbHkgd2l0aG91dCBnaXZpbmcgdGhlIHByb21pc2UgYW4gb3Bwb3J0dW5pdHkgZm9yIGFcbiAqIHJlZW50cmFuY3kgYXR0YWNrIGR1cmluZyB0aGF0IGNhbGwuXG4gKlxuICogaHR0cHM6Ly9naXRodWIuY29tL0Fnb3JpYy9hZ29yaWMtc2RrL2lzc3Vlcy85XG4gKiByYWlzZXMgdGhlIGlzc3VlIG9mIHRlc3RpbmcgdGhhdCBhIHNwZWNpbWVuIGlzIGEgc2FmZSBwcm9taXNlXG4gKiBzdWNoIHRoYXQgdGhlIHRlc3QgYWxzbyBkb2VzIG5vdCBnaXZlIHRoZSBzcGVjaW1lbiBhXG4gKiByZWVudHJhbmN5IG9wcG9ydHVuaXR5LiBUaGF0IGlzIHdlbGwgYmV5b25kIHRoZSBhbWJpdGlvbiBoZXJlLlxuICogVE9ETyBUaG91Z2ggaWYgd2UgZmlndXJlIG91dCBhIG5pY2Ugc29sdXRpb24sIGl0IG1pZ2h0IGJlIGdvb2QgdG9cbiAqIHVzZSBpdCBoZXJlIGFzIHdlbGwuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBwciBUaGUgdmFsdWUgdG8gZXhhbWluZVxuICogQHBhcmFtIHtDaGVja2VyfSBjaGVja1xuICogQHJldHVybnMge3ByIGlzIFByb21pc2V9IFdoZXRoZXIgaXQgaXMgYSBzYWZlIHByb21pc2VcbiAqL1xuY29uc3QgY2hlY2tTYWZlUHJvbWlzZT0ocHIsY2hlY2spPT57XG5jb25zdCByZWplY3Q9KGRldGFpbHMpPT5jaGVjayhmYWxzZSxkZXRhaWxzKTtcbnJldHVybihcbihpc0Zyb3plbihwcil8fHJlamVjdChYIGAke3ByfSAtIE11c3QgYmUgZnJvemVuYCkpJiYoXG5pc1Byb21pc2UocHIpfHxyZWplY3QoWCBgJHtwcn0gLSBNdXN0IGJlIGEgcHJvbWlzZWApKSYmKFxuZ2V0UHJvdG90eXBlT2YocHIpPT09UHJvbWlzZS5wcm90b3R5cGV8fFxucmVqZWN0KFxuWCBgJHtwcn0gLSBNdXN0IGluaGVyaXQgZnJvbSBQcm9taXNlLnByb3RvdHlwZTogJHtxKFxuZ2V0UHJvdG90eXBlT2YocHIpKVxuIH1gKSkmJlxuXG5jaGVja1Byb21pc2VPd25LZXlzKC8qKiBAdHlwZSB7UHJvbWlzZX0gKi9wcixjaGVjaykpO1xuXG4gfTtcbmhhcmRlbihjaGVja1NhZmVQcm9taXNlKTtcblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgdGhlIGFyZ3VtZW50IGlzIGEgUHJvbWlzZS5cbiAqXG4gKiBAcGFyYW0ge3Vua25vd259IHByIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcmV0dXJucyB7cHIgaXMgUHJvbWlzZX0gV2hldGhlciBpdCBpcyBhIHByb21pc2VcbiAqL1xuY29uc3QgICAgICAgIGlzU2FmZVByb21pc2U9KHByKT0+Y2hlY2tTYWZlUHJvbWlzZShwciwoeCk9PngpOyRo4oCNX29uY2UuaXNTYWZlUHJvbWlzZShpc1NhZmVQcm9taXNlKTtcbmhhcmRlbihpc1NhZmVQcm9taXNlKTtcblxuY29uc3QgICAgICAgIGFzc2VydFNhZmVQcm9taXNlPShwcik9PmNoZWNrU2FmZVByb21pc2UocHIsYXNzZXJ0Q2hlY2tlcik7JGjigI1fb25jZS5hc3NlcnRTYWZlUHJvbWlzZShhc3NlcnRTYWZlUHJvbWlzZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNTYWZlUHJvbWlzZSI6WyJpc1NhZmVQcm9taXNlIl0sImFzc2VydFNhZmVQcm9taXNlIjpbImFzc2VydFNhZmVQcm9taXNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAGUT/Wi5EgAAuRIAACoAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9zeW1ib2wuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIkF0QXRQcmVmaXhQYXR0ZXJuIiwiYXNzZXJ0UGFzc2FibGVTeW1ib2wiLCJpc1Bhc3NhYmxlU3ltYm9sIiwibmFtZUZvclBhc3NhYmxlU3ltYm9sIiwicGFzc2FibGVTeW1ib2xGb3JOYW1lIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cblxuY29uc3R7RmFpbCxxdW90ZTpxfT1hc3NlcnQ7XG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuXG4vKipcbiAqIFRoZSB3ZWxsIGtub3duIHN5bWJvbHMgYXJlIHN0YXRpYyBzeW1ib2wgdmFsdWVzIG9uIHRoZSBgU3ltYm9sYCBjb25zdHJ1Y3Rvci5cbiAqL1xuY29uc3Qgd2VsbEtub3duU3ltYm9sTmFtZXM9bmV3IE1hcChcbm93bktleXMoU3ltYm9sKS5cbmZpbHRlcihcbihuYW1lKT0+dHlwZW9mIG5hbWU9PT0nc3RyaW5nJyYmdHlwZW9mIFN5bWJvbFtuYW1lXT09PSdzeW1ib2wnKS5cblxuZmlsdGVyKChuYW1lKT0+e1xuLyogQHRzLWV4cGVjdC1lcnJvciBJdCBkb2Vzbid0IGtub3cgbmFtZSBjYW5ub3QgYmUgYSBzeW1ib2wqL1xuIW5hbWUuc3RhcnRzV2l0aCgnQEAnKXx8XG5GYWlsIGBEaWQgbm90IGV4cGVjdCBTeW1ib2wgdG8gaGF2ZSBhIHN5bWJvbC12YWx1ZWQgcHJvcGVydHkgbmFtZSBzdGFydGluZyB3aXRoIFwiQEBcIiAke3EoXG5uYW1lKVxuIH1gO1xucmV0dXJuIHRydWU7XG4gfSlcbi8qIEB0cy1pZ25vcmUgSXQgZG9lc24ndCBrbm93IG5hbWUgY2Fubm90IGJlIGEgc3ltYm9sKi8uXG5tYXAoKG5hbWUpPT5bU3ltYm9sW25hbWVdLCBgQEAke25hbWV9YF0pKTtcblxuXG4vKipcbiAqIFRoZSBwYXNzYWJsZSBzeW1ib2xzIGFyZSB0aGUgd2VsbCBrbm93biBzeW1ib2xzICh0aGUgc3ltYm9sIHZhbHVlc1xuICogb2Ygc3RhdGljIHByb3BlcnRpZXMgb2YgdGhlIGBTeW1ib2xgIGNvbnN0cnVjdG9yKSBhbmQgdGhlIHJlZ2lzdGVyZWRcbiAqIHN5bWJvbHMuXG4gKlxuICogQHBhcmFtIHthbnl9IHN5bVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbmNvbnN0ICAgICAgICBpc1Bhc3NhYmxlU3ltYm9sPShzeW0pPT5cbnR5cGVvZiBzeW09PT0nc3ltYm9sJyYmKFxudHlwZW9mIFN5bWJvbC5rZXlGb3Ioc3ltKT09PSdzdHJpbmcnfHx3ZWxsS25vd25TeW1ib2xOYW1lcy5oYXMoc3ltKSk7JGjigI1fb25jZS5pc1Bhc3NhYmxlU3ltYm9sKGlzUGFzc2FibGVTeW1ib2wpO1xuaGFyZGVuKGlzUGFzc2FibGVTeW1ib2wpO1xuXG5jb25zdCAgICAgICAgYXNzZXJ0UGFzc2FibGVTeW1ib2w9KHN5bSk9PlxuaXNQYXNzYWJsZVN5bWJvbChzeW0pfHxcbkZhaWwgYE9ubHkgcmVnaXN0ZXJlZCBzeW1ib2xzIG9yIHdlbGwta25vd24gc3ltYm9scyBhcmUgcGFzc2FibGU6ICR7cShzeW0pfWA7JGjigI1fb25jZS5hc3NlcnRQYXNzYWJsZVN5bWJvbChhc3NlcnRQYXNzYWJsZVN5bWJvbCk7XG5oYXJkZW4oYXNzZXJ0UGFzc2FibGVTeW1ib2wpO1xuXG4vKipcbiAqIElmIGBzeW1gIGlzIGEgcGFzc2FibGUgc3ltYm9sLCByZXR1cm4gYSBzdHJpbmcgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoaXNcbiAqIHN5bWJvbC4gSWYgYHN5bWAgaXMgYSBub24tcGFzc2FibGUgc3ltYm9sLCByZXR1cm4gYHVuZGVmaW5lZGAuXG4gKlxuICogVGhlIHBhc3NhYmxlIHN5bWJvbHMgYXJlIHRoZSB3ZWxsIGtub3duIHN5bWJvbHMgKHRoZSBzeW1ib2wgdmFsdWVzXG4gKiBvZiBzdGF0aWMgcHJvcGVydGllcyBvZiB0aGUgYFN5bWJvbGAgY29uc3RydWN0b3IpIGFuZCB0aGUgcmVnaXN0ZXJlZFxuICogc3ltYm9scy4gU2luY2UgdGhlIHJlZ2lzdHJhdGlvbiBzdHJpbmcgb2YgYSByZWdpc3RlcmVkIHN5bWJvbCBjYW4gYmUgYW55XG4gKiBzdHJpbmcsIGlmIHdlIHNpbXBseSB1c2VkIHRoYXQgdG8gaWRlbnRpZnkgdGhvc2Ugc3ltYm9scywgdGhlcmUgd291bGQgbm90XG4gKiBiZSBhbnkgcmVtYWluaW5nIHN0cmluZ3MgbGVmdCBvdmVyIHRvIGlkZW50aWZ5IHRoZSB3ZWxsLWtub3duIHN5bWJvbHMuXG4gKiBJbnN0ZWFkLCB3ZSByZXNlcnZlIHN0cmluZ3MgYmVnaW5uaW5nIHdpdGggYFwiQEBcImAgZm9yIHB1cnBvc2VzIG9mIHRoaXNcbiAqIGVuY29kaW5nLiBXZSBpZGVudGlmeSBhIHdlbGwga25vd24gc3ltYm9sIHN1Y2ggYXMgYFN5bWJvbC5pdGVyYXRvcmBcbiAqIGJ5IHByZWZpeGluZyB0aGUgcHJvcGVydHkgbmFtZSB3aXRoIGBcIkBAXCJgLCBzdWNoIGFzIGBcIkBAaXRlcmF0b3JcImAuXG4gKiBGb3IgcmVnaXN0ZXJlZCBzeW1ib2xzIHdob3NlIG5hbWUgaGFwcGVucyB0byBiZWdpbiB3aXRoIGBcIkBAXCJgLCBzdWNoXG4gKiBhcyBgU3ltYm9sLmZvcignQEBpdGVyYXRvcicpYCBvciBgU3ltYm9sLmZvcignQEBmb28nKWAsIHdlIGlkZW50aWZ5XG4gKiB0aGVtIGJ5IHByZWZpeGluZyB0aGVtIHdpdGggYW4gZXh0cmEgYFwiQEBcImAsIHN1Y2ggYXNcbiAqIGBcIkBAQEBpdGVyYXRvclwiYCBvciBgXCJAQEBAZm9vXCJgLiAoVGhpcyBpcyB0aGUgSGlsYmVydCBIb3RlbCBlbmNvZGluZ1xuICogdGVjaG5pcXVlLilcbiAqXG4gKiBAcGFyYW0ge3N5bWJvbH0gc3ltXG4gKiBAcmV0dXJucyB7c3RyaW5nPX1cbiAqL1xuY29uc3QgICAgICAgIG5hbWVGb3JQYXNzYWJsZVN5bWJvbD0oc3ltKT0+e1xuY29uc3QgbmFtZT1TeW1ib2wua2V5Rm9yKHN5bSk7XG5pZihuYW1lPT09dW5kZWZpbmVkKXtcbnJldHVybiB3ZWxsS25vd25TeW1ib2xOYW1lcy5nZXQoc3ltKTtcbiB9XG5pZihuYW1lLnN0YXJ0c1dpdGgoJ0BAJykpe1xucmV0dXJuIGBAQCR7bmFtZX1gO1xuIH1cbnJldHVybiBuYW1lO1xuIH07JGjigI1fb25jZS5uYW1lRm9yUGFzc2FibGVTeW1ib2wobmFtZUZvclBhc3NhYmxlU3ltYm9sKTtcbmhhcmRlbihuYW1lRm9yUGFzc2FibGVTeW1ib2wpO1xuXG5jb25zdCAgICAgICAgQXRBdFByZWZpeFBhdHRlcm49L15AQCguKikkLzskaOKAjV9vbmNlLkF0QXRQcmVmaXhQYXR0ZXJuKEF0QXRQcmVmaXhQYXR0ZXJuKTtcbmhhcmRlbihBdEF0UHJlZml4UGF0dGVybik7XG5cbi8qKlxuICogSWYgYG5hbWVgIGlzIGEgc3RyaW5nIHRoYXQgY291bGQgaGF2ZSBiZWVuIHByb2R1Y2VkIGJ5XG4gKiBgbmFtZUZvclBhc3NhYmxlU3ltYm9sYCwgcmV0dXJuIHRoZSBzeW1ib2wgYXJndW1lbnQgaXQgd2FzIHByb2R1Y2VkIHRvXG4gKiByZXByZXNlbnQuXG4gKlxuICogICAgSWYgYG5hbWVgIGRvZXMgbm90IGJlZ2luIHdpdGggYFwiQEBcImAsIHRoZW4ganVzdCB0aGUgY29ycmVzcG9uZGluZ1xuICogICAgICByZWdpc3RlcmVkIHN5bWJvbCwgYFN5bWJvbC5mb3IobmFtZSlgLlxuICogICAgSWYgYG5hbWVgIGlzIGBcIkBAXCJgIGZvbGxvd2VkIGJ5IGEgd2VsbCBrbm93biBzeW1ib2wncyBwcm9wZXJ0eSBuYW1lIG9uXG4gKiAgICAgIGBTeW1ib2xgIHN1Y2ggYFwiQEBpdGVyYXRvclwiLCByZXR1cm4gdGhhdCB3ZWxsIGtub3duIHN5bWJvbCBzdWNoIGFzXG4gKiAgICAgIGBTeW1ib2wuaXRlcmF0b3JgXG4gKiAgICBJZiBgbmFtZWAgYmVnaW5zIHdpdGggYFwiQEBAQFwiYCBpdCBlbmNvZGVzIHRoZSByZWdpc3RlcmVkIHN5bWJvbCB3aG9zZVxuICogICAgICBuYW1lIGJlZ2lucyB3aXRoIGBcIkBAXCJgIGluc3RlYWQuXG4gKiAgICBPdGhlcndpc2UsIGlmIG5hbWUgYmVnaW5zIHdpdGggYFwiQEBcImAgaXQgbWF5IGVuY29kZSBhIHJlZ2lzdGVyZWQgc3ltYm9sXG4gKiAgICAgIGZyb20gYSBmdXR1cmUgdmVyc2lvbiBvZiBKYXZhU2NyaXB0LCBidXQgaXQgaXMgbm90IG9uZSB3ZSBjYW4gZGVjb2RlXG4gKiAgICAgIHlldCwgc28gdGhyb3cuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHtzeW1ib2w9fVxuICovXG5jb25zdCAgICAgICAgcGFzc2FibGVTeW1ib2xGb3JOYW1lPShuYW1lKT0+e1xuaWYodHlwZW9mIG5hbWUhPT0nc3RyaW5nJyl7XG5yZXR1cm4gdW5kZWZpbmVkO1xuIH1cbmNvbnN0IG1hdGNoPUF0QXRQcmVmaXhQYXR0ZXJuLmV4ZWMobmFtZSk7XG5pZihtYXRjaCl7XG5jb25zdCBzdWZmaXg9bWF0Y2hbMV07XG5pZihzdWZmaXguc3RhcnRzV2l0aCgnQEAnKSl7XG5yZXR1cm4gU3ltYm9sLmZvcihzdWZmaXgpO1xuIH1lbHNle1xuY29uc3Qgc3ltPVN5bWJvbFtzdWZmaXhdO1xuaWYodHlwZW9mIHN5bT09PSdzeW1ib2wnKXtcbnJldHVybiBzeW07XG4gfVxuRmFpbCBgUmVzZXJ2ZWQgZm9yIHdlbGwga25vd24gc3ltYm9sICR7cShzdWZmaXgpfTogJHtxKG5hbWUpfWA7XG4gfVxuIH1cbnJldHVybiBTeW1ib2wuZm9yKG5hbWUpO1xuIH07JGjigI1fb25jZS5wYXNzYWJsZVN5bWJvbEZvck5hbWUocGFzc2FibGVTeW1ib2xGb3JOYW1lKTtcbmhhcmRlbihwYXNzYWJsZVN5bWJvbEZvck5hbWUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImlzUGFzc2FibGVTeW1ib2wiOlsiaXNQYXNzYWJsZVN5bWJvbCJdLCJhc3NlcnRQYXNzYWJsZVN5bWJvbCI6WyJhc3NlcnRQYXNzYWJsZVN5bWJvbCJdLCJuYW1lRm9yUGFzc2FibGVTeW1ib2wiOlsibmFtZUZvclBhc3NhYmxlU3ltYm9sIl0sIkF0QXRQcmVmaXhQYXR0ZXJuIjpbIkF0QXRQcmVmaXhQYXR0ZXJuIl0sInBhc3NhYmxlU3ltYm9sRm9yTmFtZSI6WyJwYXNzYWJsZVN5bWJvbEZvck5hbWUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAACrS51uAHAADgBwAAKgAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL3RhZ2dlZC5qc3siaW1wb3J0cyI6WyIuL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIl0sImV4cG9ydHMiOlsiVGFnZ2VkSGVscGVyIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IGFzc2VydENoZWNrZXIsY2hlY2tUYWdSZWNvcmQsUEFTU19TVFlMRSxjaGVja05vcm1hbFByb3BlcnR5LGNoZWNrUGFzc1N0eWxlOyRo4oCNX2ltcG9ydHMoW1tcIi4vcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImFzc2VydENoZWNrZXJcIiwgWyRo4oCNX2EgPT4gKGFzc2VydENoZWNrZXIgPSAkaOKAjV9hKV1dLFtcImNoZWNrVGFnUmVjb3JkXCIsIFskaOKAjV9hID0+IChjaGVja1RhZ1JlY29yZCA9ICRo4oCNX2EpXV0sW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV0sW1wiY2hlY2tOb3JtYWxQcm9wZXJ0eVwiLCBbJGjigI1fYSA9PiAoY2hlY2tOb3JtYWxQcm9wZXJ0eSA9ICRo4oCNX2EpXV0sW1wiY2hlY2tQYXNzU3R5bGVcIiwgWyRo4oCNX2EgPT4gKGNoZWNrUGFzc1N0eWxlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2dldE93blByb3BlcnR5RGVzY3JpcHRvcnN9PU9iamVjdDtcblxuLyoqXG4gKlxuICogQHR5cGUge1hpbXBvcnQoJy4vaW50ZXJuYWwtdHlwZXMuanMnKS5QYXNzU3R5bGVIZWxwZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBUYWdnZWRIZWxwZXI9aGFyZGVuKHtcbnN0eWxlTmFtZTondGFnZ2VkJyxcblxuY2FuQmVWYWxpZDooY2FuZGlkYXRlLGNoZWNrKT0+Y2hlY2tQYXNzU3R5bGUoY2FuZGlkYXRlLCd0YWdnZWQnLGNoZWNrKSxcblxuYXNzZXJ0VmFsaWQ6KGNhbmRpZGF0ZSxwYXNzU3R5bGVPZlJlY3VyKT0+e1xuY2hlY2tUYWdSZWNvcmQoY2FuZGlkYXRlLCd0YWdnZWQnLGFzc2VydENoZWNrZXIpO1xuXG4vKiBUeXBlY2FzdHMgbmVlZGVkIGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzE4NjMqL1xuY29uc3QgcGFzc1N0eWxlS2V5PS8qKiBAdHlwZSB7dW5rbm93bn0gKi9QQVNTX1NUWUxFO1xuY29uc3QgdGFnS2V5PS8qKiBAdHlwZSB7dW5rbm93bn0gKi9TeW1ib2wudG9TdHJpbmdUYWc7XG5jb25zdHtcbi8qIGNoZWNrVGFnUmVjb3JkIGFscmVhZHkgdmVyaWZpZWQgUEFTU19TVFlMRSBhbmQgU3ltYm9sLnRvU3RyaW5nVGFnIG93biBkYXRhIHByb3BlcnRpZXMuKi9cblsvKiogQHR5cGUge3N0cmluZ30gKi9wYXNzU3R5bGVLZXldOl9wYXNzU3R5bGVEZXNjLFxuWy8qKiBAdHlwZSB7c3RyaW5nfSAqL3RhZ0tleV06X2xhYmVsRGVzYyxcbnBheWxvYWQ6X3BheWxvYWREZXNjLC8qIHZhbHVlIGNoZWNrZWQgYnkgcmVjdXJzaXZlIHdhbGsgYXQgdGhlIGVuZCovXG4uLi5yZXN0RGVzY3N9PVxuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyhjYW5kaWRhdGUpO1xub3duS2V5cyhyZXN0RGVzY3MpLmxlbmd0aD09PTB8fFxuRmFpbCBgVW5leHBlY3RlZCBwcm9wZXJ0aWVzIG9uIHRhZ2dlZCByZWNvcmQgJHtvd25LZXlzKHJlc3REZXNjcyl9YDtcblxuY2hlY2tOb3JtYWxQcm9wZXJ0eShjYW5kaWRhdGUsJ3BheWxvYWQnLHRydWUsYXNzZXJ0Q2hlY2tlcik7XG5cbi8qIFJlY3Vyc2l2ZWx5IHZhbGlkYXRlIHRoYXQgZWFjaCBtZW1iZXIgaXMgcGFzc2FibGUuKi9cbnBhc3NTdHlsZU9mUmVjdXIoY2FuZGlkYXRlLnBheWxvYWQpO1xuIH19KTskaOKAjV9vbmNlLlRhZ2dlZEhlbHBlcihUYWdnZWRIZWxwZXIpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7IlRhZ2dlZEhlbHBlciI6WyJUYWdnZWRIZWxwZXIiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAEZo7UPQYAAD0GAAAJAAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9tYWtlLWZhci5qc3siaW1wb3J0cyI6WyIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL2hlbHBlcnMvcmVtb3RhYmxlLmpzIl0sImV4cG9ydHMiOlsiRmFyIiwiUmVtb3RhYmxlIiwiVG9GYXJGdW5jdGlvbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBhc3NlcnRDaGVja2VyLFBBU1NfU1RZTEUsYXNzZXJ0SWZhY2UsZ2V0SW50ZXJmYWNlT2YsUmVtb3RhYmxlSGVscGVyOyRo4oCNX2ltcG9ydHMoW1tcIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiYXNzZXJ0Q2hlY2tlclwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0Q2hlY2tlciA9ICRo4oCNX2EpXV0sW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvcmVtb3RhYmxlLmpzXCIsIFtbXCJhc3NlcnRJZmFjZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0SWZhY2UgPSAkaOKAjV9hKV1dLFtcImdldEludGVyZmFjZU9mXCIsIFskaOKAjV9hID0+IChnZXRJbnRlcmZhY2VPZiA9ICRo4oCNX2EpXV0sW1wiUmVtb3RhYmxlSGVscGVyXCIsIFskaOKAjV9hID0+IChSZW1vdGFibGVIZWxwZXIgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuSW50ZXJmYWNlU3BlY30gSW50ZXJmYWNlU3BlYyAqL1xuLyoqIEB0ZW1wbGF0ZSBMLFIgQHR5cGVkZWYge1hpbXBvcnQoJ0BlbmRvL2V2ZW50dWFsLXNlbmQnKS5SZW1vdGFibGVCcmFuZDxMLCBSPn0gUmVtb3RhYmxlQnJhbmQgKi9cblxuY29uc3R7cXVvdGU6cSxGYWlsfT1hc3NlcnQ7XG5cbmNvbnN0e3Byb3RvdHlwZTpmdW5jdGlvblByb3RvdHlwZX09RnVuY3Rpb247XG5jb25zdHtcbmdldFByb3RvdHlwZU9mLFxuc2V0UHJvdG90eXBlT2YsXG5jcmVhdGUsXG5pc0Zyb3plbixcbnByb3RvdHlwZTpvYmplY3RQcm90b3R5cGV9PVxuT2JqZWN0O1xuXG4vKipcbiAqIE5vdyB0aGF0IHRoZSByZW1vdGFibGVQcm90byBkb2VzIG5vdCBwcm92aWRlIGl0cyBvd24gYHRvU3RyaW5nYCBtZXRob2QsXG4gKiBlbnN1cmUgaXQgYWx3YXlzIGluaGVyaXRzIGZyb20gc29tZXRoaW5nLiBUaGUgb3JpZ2luYWwgcHJvdG90eXBlIG9mXG4gKiBgcmVtb3RhYmxlYCBpZiB0aGVyZSB3YXMgb25lLCBvciBgT2JqZWN0LnByb3RvdHlwZWAgb3RoZXJ3aXNlLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSByZW1vdGFibGVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gaWZhY2VcbiAqIEByZXR1cm5zIHtPYmplY3R9XG4gKi9cbmNvbnN0IG1ha2VSZW1vdGFibGVQcm90bz0ocmVtb3RhYmxlLGlmYWNlKT0+e1xubGV0IG9sZFByb3RvPWdldFByb3RvdHlwZU9mKHJlbW90YWJsZSk7XG5pZih0eXBlb2YgcmVtb3RhYmxlPT09J29iamVjdCcpe1xuaWYob2xkUHJvdG89PT1udWxsKXtcbm9sZFByb3RvPW9iamVjdFByb3RvdHlwZTtcbiB9XG5vbGRQcm90bz09PW9iamVjdFByb3RvdHlwZXx8XG5GYWlsIGBGb3Igbm93LCByZW1vdGFibGVzIGNhbm5vdCBpbmhlcml0IGZyb20gYW55dGhpbmcgdW51c3VhbCwgaW4gJHtyZW1vdGFibGV9YDtcbiB9ZWxzZSBpZih0eXBlb2YgcmVtb3RhYmxlPT09J2Z1bmN0aW9uJyl7XG5vbGRQcm90byE9PW51bGx8fFxuRmFpbCBgT3JpZ2luYWwgZnVuY3Rpb24gbXVzdCBub3QgaW5oZXJpdCBmcm9tIG51bGw6ICR7cmVtb3RhYmxlfWA7XG5vbGRQcm90bz09PWZ1bmN0aW9uUHJvdG90eXBlfHxcbmdldFByb3RvdHlwZU9mKG9sZFByb3RvKT09PWZ1bmN0aW9uUHJvdG90eXBlfHxcbkZhaWwgYEZhciBmdW5jdGlvbnMgbXVzdCBvcmlnaW5hbGx5IGluaGVyaXQgZnJvbSBGdW5jdGlvbi5wcm90b3R5cGUsIGluICR7cmVtb3RhYmxlfWA7XG4gfWVsc2V7XG5GYWlsIGB1bnJlY29nbml6ZWQgdHlwZW9mICR7cmVtb3RhYmxlfWA7XG4gfVxucmV0dXJuIGhhcmRlbihcbmNyZWF0ZShvbGRQcm90byx7XG5bUEFTU19TVFlMRV06e3ZhbHVlOidyZW1vdGFibGUnfSxcbltTeW1ib2wudG9TdHJpbmdUYWddOnt2YWx1ZTppZmFjZX19KSk7XG5cblxuIH07XG5cbmNvbnN0IGFzc2VydENhbkJlUmVtb3RhYmxlPShjYW5kaWRhdGUpPT5cblJlbW90YWJsZUhlbHBlci5jYW5CZVZhbGlkKGNhbmRpZGF0ZSxhc3NlcnRDaGVja2VyKTtcblxuLyoqXG4gKiBDcmVhdGUgYW5kIHJlZ2lzdGVyIGEgUmVtb3RhYmxlLiAgQWZ0ZXIgdGhpcywgZ2V0SW50ZXJmYWNlT2YocmVtb3RhYmxlKVxuICogcmV0dXJucyBpZmFjZS5cbiAqXG4gKiAvLyBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzgwNFxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IFtpZmFjZT0nUmVtb3RhYmxlJ10gVGhlIGludGVyZmFjZSBzcGVjaWZpY2F0aW9uIGZvclxuICogdGhlIHJlbW90YWJsZS4gRm9yIG5vdywgYSBzdHJpbmcgaWZhY2UgbXVzdCBiZSBcIlJlbW90YWJsZVwiIG9yIGJlZ2luIHdpdGhcbiAqIFwiQWxsZWdlZDogXCIsIHRvIHNlcnZlIGFzIHRoZSBhbGxlZ2VkIG5hbWUuIE1vcmUgZ2VuZXJhbCBpZmFjZXMgYXJlIG5vdCB5ZXRcbiAqIGltcGxlbWVudGVkLiBUaGlzIGlzIHRlbXBvcmFyeS4gV2UgaW5jbHVkZSB0aGVcbiAqIFwiQWxsZWdlZFwiIGFzIGEgcmVtaW5kZXIgdGhhdCB3ZSBkbyBub3QgeWV0IGhhdmUgU3dpbmdTZXQgb3IgQ29tbXMgVmF0XG4gKiBzdXBwb3J0IGZvciBlbnN1cmluZyB0aGlzIGlzIGFjY29yZGluZyB0byB0aGUgdmF0IGhvc3RpbmcgdGhlIG9iamVjdC5cbiAqIEN1cnJlbnRseSwgQWxpY2UgY2FuIHRlbGwgQm9iIGFib3V0IENhcm9sLCB3aGVyZSBWYXRBIChvbiBBbGljZSdzIGJlaGFsZilcbiAqIG1pc3JlcHJlc2VudHMgQ2Fyb2wncyBgaWZhY2VgLiBWYXRCIGFuZCB0aGVyZWZvcmUgQm9iIHdpbGwgdGhlbiBzZWVcbiAqIENhcm9sJ3MgYGlmYWNlYCBhcyBtaXNyZXByZXNlbnRlZCBieSBWYXRBLlxuICogQHBhcmFtIHt1bmRlZmluZWR9IFtwcm9wcz11bmRlZmluZWRdIEN1cnJlbnRseSBtYXkgb25seSBiZSB1bmRlZmluZWQuXG4gKiBUaGF0IHBsYW4gaXMgdGhhdCBvd24tcHJvcGVydGllcyBhcmUgY29waWVkIHRvIHRoZSByZW1vdGFibGVcbiAqIEBwYXJhbSB7VH0gW3JlbW90YWJsZT17fV0gVGhlIG9iamVjdCB1c2VkIGFzIHRoZSByZW1vdGFibGVcbiAqIEByZXR1cm5zIHtUICYgUmVtb3RhYmxlQnJhbmQ8e30sIFQ+fSByZW1vdGFibGUsIG1vZGlmaWVkIGZvciBkZWJ1Z2dhYmlsaXR5XG4gKi9cbmNvbnN0ICAgICAgICBSZW1vdGFibGU9KFxuaWZhY2U9J1JlbW90YWJsZScsXG5wcm9wcz11bmRlZmluZWQsXG5yZW1vdGFibGU9LyoqIEB0eXBlIHtUfSAqL3t9KT0+XG57XG5hc3NlcnRJZmFjZShpZmFjZSk7XG5hc3NlcnQoaWZhY2UpO1xuLyogVE9ETzogV2hlbiBpZmFjZSBpcyByaWNoZXIgdGhhbiBqdXN0IHN0cmluZywgd2UgbmVlZCB0byBnZXQgdGhlIGFsbGVnZWROYW1lKi9cbi8qIGluIGEgZGlmZmVyZW50IHdheS4qL1xucHJvcHM9PT11bmRlZmluZWR8fEZhaWwgYFJlbW90YWJsZSBwcm9wcyBub3QgeWV0IGltcGxlbWVudGVkICR7cHJvcHN9YDtcblxuLyogRmFpbCBmYXN0OiBjaGVjayB0aGF0IHRoZSB1bm1vZGlmaWVkIG9iamVjdCBpcyBhYmxlIHRvIGJlY29tZSBhIFJlbW90YWJsZS4qL1xuYXNzZXJ0Q2FuQmVSZW1vdGFibGUocmVtb3RhYmxlKTtcblxuLyogRW5zdXJlIHRoYXQgdGhlIHJlbW90YWJsZSBpc24ndCBhbHJlYWR5IG1hcmtlZC4qL1xuIShQQVNTX1NUWUxFIGluIHJlbW90YWJsZSl8fFxuRmFpbCBgUmVtb3RhYmxlICR7cmVtb3RhYmxlfSBpcyBhbHJlYWR5IG1hcmtlZCBhcyBhICR7cShcbnJlbW90YWJsZVtQQVNTX1NUWUxFXSlcbiB9YDtcbi8qIEVuc3VyZSB0aGF0IHRoZSByZW1vdGFibGUgaXNuJ3QgYWxyZWFkeSBmcm96ZW4uKi9cbiFpc0Zyb3plbihyZW1vdGFibGUpfHxGYWlsIGBSZW1vdGFibGUgJHtyZW1vdGFibGV9IGlzIGFscmVhZHkgZnJvemVuYDtcbmNvbnN0IHJlbW90YWJsZVByb3RvPW1ha2VSZW1vdGFibGVQcm90byhyZW1vdGFibGUsaWZhY2UpO1xuXG4vKiBUYWtlIGEgc3RhdGljIGNvcHkgb2YgdGhlIGVudW1lcmFibGUgb3duIHByb3BlcnRpZXMgYXMgZGF0YSBwcm9wZXJ0aWVzLiovXG4vKiBjb25zdCBwcm9wRGVzY3MgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHsgLi4ucHJvcHMgfSk7Ki9cbmNvbnN0IG11dGF0ZUhhcmRlbkFuZENoZWNrPSh0YXJnZXQpPT57XG4vKiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcERlc2NzKTsqL1xuc2V0UHJvdG90eXBlT2YodGFyZ2V0LHJlbW90YWJsZVByb3RvKTtcbmhhcmRlbih0YXJnZXQpO1xuYXNzZXJ0Q2FuQmVSZW1vdGFibGUodGFyZ2V0KTtcbiB9O1xuXG4vKiBGYWlsIGZhc3Q6IGNoZWNrIGEgZnJlc2ggcmVtb3RhYmxlIHRvIHNlZSBpZiBvdXIgcnVsZXMgZml0LiovXG5tdXRhdGVIYXJkZW5BbmRDaGVjayh7fSk7XG5cbi8qIEFjdHVhbGx5IGZpbmlzaCB0aGUgbmV3IHJlbW90YWJsZS4qL1xubXV0YXRlSGFyZGVuQW5kQ2hlY2socmVtb3RhYmxlKTtcblxuLyogQ09NTUlUVEVEISovXG4vKiBXZSdyZSBjb21taXR0ZWQsIHNvIGtlZXAgdGhlIGludGVyZmFjZSBmb3IgZnV0dXJlIHJlZmVyZW5jZS4qL1xuYXNzZXJ0KGlmYWNlIT09dW5kZWZpbmVkKTsvKiBUbyBtYWtlIFR5cGVTY3JpcHQgaGFwcHkqL1xucmV0dXJuICgvKiogQHR5cGUge1QgJiBSZW1vdGFibGVCcmFuZDx7fSwgVD59ICovcmVtb3RhYmxlKTtcbiB9OyRo4oCNX29uY2UuUmVtb3RhYmxlKFJlbW90YWJsZSk7XG5oYXJkZW4oUmVtb3RhYmxlKTtcblxuLyoqXG4gKiBBIGNvbmNpc2UgY29udmVuaWVuY2UgZm9yIHRoZSBtb3N0IGNvbW1vbiBgUmVtb3RhYmxlYCB1c2UuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7c3RyaW5nfSBmYXJOYW1lIFRoaXMgbmFtZSB3aWxsIGJlIHByZXBlbmRlZCB3aXRoIGBBbGxlZ2VkOiBgXG4gKiBmb3Igbm93IHRvIGZvcm0gdGhlIGBSZW1vdGFibGVgIGBpZmFjZWAgYXJndW1lbnQuXG4gKiBAcGFyYW0ge1R9IFtyZW1vdGFibGU9e31dIFRoZSBvYmplY3QgdXNlZCBhcyB0aGUgcmVtb3RhYmxlXG4gKi9cbmNvbnN0ICAgICAgICBGYXI9KGZhck5hbWUscmVtb3RhYmxlPXVuZGVmaW5lZCk9PntcbmNvbnN0IHI9cmVtb3RhYmxlPT09dW5kZWZpbmVkPy8qKiBAdHlwZSB7VH0gKi97fTpyZW1vdGFibGU7XG5yZXR1cm4gUmVtb3RhYmxlKCBgQWxsZWdlZDogJHtmYXJOYW1lfWAsdW5kZWZpbmVkLHIpO1xuIH07JGjigI1fb25jZS5GYXIoRmFyKTtcbmhhcmRlbihGYXIpO1xuXG4vKipcbiAqIENvZXJjZSBgZnVuY2AgdG8gYSBmYXIgZnVuY3Rpb24gdGhhdCBwcmVzZXJ2ZXMgaXRzIGNhbGwgYmVoYXZpb3IuXG4gKiBJZiBpdCBpcyBhbHJlYWR5IGEgZmFyIGZ1bmN0aW9uLCByZXR1cm4gaXQuIE90aGVyd2lzZSBtYWtlIGFuZCByZXR1cm4gYVxuICogbmV3IGZhciBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCBhbmQgZm9yd2FyZHMgY2FsbHMgdG8gaXQuIFRoaXNcbiAqIHdvcmtzIGV2ZW4gaWYgYGZ1bmNgIGlzIGFscmVhZHkgZnJvemVuLiBgVG9GYXJGdW5jdGlvbmAgaXMgdG8gYmUgdXNlZFxuICogd2hlbiB0aGUgZnVuY3Rpb24gY29tZXMgZnJvbSBlbHNld2hlcmUgdW5kZXIgbGVzcyBjb250cm9sLiBGb3IgZnVuY3Rpb25zXG4gKiB5b3UgYXV0aG9yIGluIHBsYWNlLCBiZXR0ZXIgdG8gdXNlIGBGYXJgIG9uIHRoZWlyIGZ1bmN0aW9uIGxpdGVyYWwgZGlyZWN0bHkuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGZhck5hbWUgdG8gYmUgdXNlZCBvbmx5IGlmIGBmdW5jYCBpcyBub3QgYWxyZWFkeSBhXG4gKiBmYXIgZnVuY3Rpb24uXG4gKiBAcGFyYW0geyguLi5hcmdzOiBhbnlbXSkgPT4gYW55fSBmdW5jXG4gKi9cbmNvbnN0ICAgICAgICBUb0ZhckZ1bmN0aW9uPShmYXJOYW1lLGZ1bmMpPT57XG5pZihnZXRJbnRlcmZhY2VPZihmdW5jKSE9PXVuZGVmaW5lZCl7XG5yZXR1cm4gZnVuYztcbiB9XG5yZXR1cm4gRmFyKGZhck5hbWUsKC4uLmFyZ3MpPT5mdW5jKC4uLmFyZ3MpKTtcbiB9OyRo4oCNX29uY2UuVG9GYXJGdW5jdGlvbihUb0ZhckZ1bmN0aW9uKTtcbmhhcmRlbihUb0ZhckZ1bmN0aW9uKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJSZW1vdGFibGUiOlsiUmVtb3RhYmxlIl0sIkZhciI6WyJGYXIiXSwiVG9GYXJGdW5jdGlvbiI6WyJUb0ZhckZ1bmN0aW9uIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAFvzA2cpBAAAKQQAACYAAABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvbWFrZVRhZ2dlZC5qc3siaW1wb3J0cyI6WyIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanMiLCIuL3Bhc3NTdHlsZU9mLmpzIl0sImV4cG9ydHMiOlsibWFrZVRhZ2dlZCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBQQVNTX1NUWUxFLGFzc2VydFBhc3NhYmxlOyRo4oCNX2ltcG9ydHMoW1tcIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGUgPSAkaOKAjV9hKV1dXV1dKTsgICBcblxuXG5cblxuXG5cbmNvbnN0e2NyZWF0ZSxwcm90b3R5cGU6b2JqZWN0UHJvdG90eXBlfT1PYmplY3Q7XG5jb25zdHtkZXRhaWxzOlh9PWFzc2VydDtcblxuY29uc3QgICAgICAgIG1ha2VUYWdnZWQ9KHRhZyxwYXlsb2FkKT0+e1xuYXNzZXJ0LnR5cGVvZihcbnRhZyxcbidzdHJpbmcnLFxuWCBgVGhlIHRhZyBvZiBhIHRhZ2dlZCByZWNvcmQgbXVzdCBiZSBhIHN0cmluZzogJHt0YWd9YCk7XG5cbmFzc2VydFBhc3NhYmxlKGhhcmRlbihwYXlsb2FkKSk7XG5yZXR1cm4gaGFyZGVuKFxuY3JlYXRlKG9iamVjdFByb3RvdHlwZSx7XG5bUEFTU19TVFlMRV06e3ZhbHVlOid0YWdnZWQnfSxcbltTeW1ib2wudG9TdHJpbmdUYWddOnt2YWx1ZTp0YWd9LFxucGF5bG9hZDp7dmFsdWU6cGF5bG9hZCxlbnVtZXJhYmxlOnRydWV9fSkpO1xuXG5cbiB9OyRo4oCNX29uY2UubWFrZVRhZ2dlZChtYWtlVGFnZ2VkKTtcbmhhcmRlbihtYWtlVGFnZ2VkKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlVGFnZ2VkIjpbIm1ha2VUYWdnZWQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAA0CUOi7woAAC8KAAAKgAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9tYXJzaGFsLWp1c3Rpbi5qc3siaW1wb3J0cyI6WyIuL2VuY29kZVRvQ2FwRGF0YS5qcyIsIi4vaGVscGVycy9lcnJvci5qcyIsIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vaGVscGVycy9zeW1ib2wuanMiLCJAZW5kby9uYXQiXSwiZXhwb3J0cyI6WyJkZWNvZGVUb0p1c3RpbiJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBOYXQsUUNMQVNTLGdldEVycm9yQ29uc3RydWN0b3IsaXNPYmplY3QsQXRBdFByZWZpeFBhdHRlcm4scGFzc2FibGVTeW1ib2xGb3JOYW1lOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsIFskaOKAjV9hID0+IChOYXQgPSAkaOKAjV9hKV1dXV0sW1wiLi9lbmNvZGVUb0NhcERhdGEuanNcIiwgW1tcIlFDTEFTU1wiLCBbJGjigI1fYSA9PiAoUUNMQVNTID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9lcnJvci5qc1wiLCBbW1wiZ2V0RXJyb3JDb25zdHJ1Y3RvclwiLCBbJGjigI1fYSA9PiAoZ2V0RXJyb3JDb25zdHJ1Y3RvciA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanNcIiwgW1tcImlzT2JqZWN0XCIsIFskaOKAjV9hID0+IChpc09iamVjdCA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvc3ltYm9sLmpzXCIsIFtbXCJBdEF0UHJlZml4UGF0dGVyblwiLCBbJGjigI1fYSA9PiAoQXRBdFByZWZpeFBhdHRlcm4gPSAkaOKAjV9hKV1dLFtcInBhc3NhYmxlU3ltYm9sRm9yTmFtZVwiLCBbJGjigI1fYSA9PiAocGFzc2FibGVTeW1ib2xGb3JOYW1lID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkVuY29kaW5nfSBFbmNvZGluZyAqL1xuXG5jb25zdHtvd25LZXlzfT1SZWZsZWN0O1xuY29uc3R7aXNBcnJheX09QXJyYXk7XG5jb25zdHtzdHJpbmdpZnk6cXVvdGV9PUpTT047XG5jb25zdHtxdW90ZTpxLGRldGFpbHM6WCxGYWlsfT1hc3NlcnQ7XG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSW5kZW50ZXJcbiAqIEBwcm9wZXJ0eSB7KG9wZW5CcmFja2V0OiBzdHJpbmcpID0+IG51bWJlcn0gb3BlblxuICogQHByb3BlcnR5IHsoKSA9PiBudW1iZXJ9IGxpbmVcbiAqIEBwcm9wZXJ0eSB7KHRva2VuOiBzdHJpbmcpID0+IG51bWJlcn0gbmV4dFxuICogQHByb3BlcnR5IHsoY2xvc2VCcmFja2V0OiBzdHJpbmcpID0+IG51bWJlcn0gY2xvc2VcbiAqIEBwcm9wZXJ0eSB7KCkgPT4gc3RyaW5nfSBkb25lXG4gKi9cblxuLyoqXG4gKiBHZW5lcm91cyB3aGl0ZXNwYWNlIGZvciByZWFkYWJpbGl0eVxuICpcbiAqIEByZXR1cm5zIHtJbmRlbnRlcn1cbiAqL1xuY29uc3QgbWFrZVllc0luZGVudGVyPSgpPT57XG5jb25zdCBzdHJpbmdzPVtdO1xubGV0IGxldmVsPTA7XG5sZXQgbmVlZFNwYWNlPWZhbHNlO1xuY29uc3QgbGluZT0oKT0+e1xubmVlZFNwYWNlPWZhbHNlO1xucmV0dXJuIHN0cmluZ3MucHVzaCgnXFxuJywnICAnLnJlcGVhdChsZXZlbCkpO1xuIH07XG5yZXR1cm4gaGFyZGVuKHtcbm9wZW46KG9wZW5CcmFja2V0KT0+e1xubGV2ZWwrPTE7XG5pZihuZWVkU3BhY2Upe1xuc3RyaW5ncy5wdXNoKCcgJyk7XG4gfVxubmVlZFNwYWNlPWZhbHNlO1xucmV0dXJuIHN0cmluZ3MucHVzaChvcGVuQnJhY2tldCk7XG4gfSxcbmxpbmUsXG5uZXh0Oih0b2tlbik9PntcbmlmKG5lZWRTcGFjZSYmdG9rZW4hPT0nLCcpe1xuc3RyaW5ncy5wdXNoKCcgJyk7XG4gfVxubmVlZFNwYWNlPXRydWU7XG5yZXR1cm4gc3RyaW5ncy5wdXNoKHRva2VuKTtcbiB9LFxuY2xvc2U6KGNsb3NlQnJhY2tldCk9PntcbmFzc2VydChsZXZlbD49MSk7XG5sZXZlbC09MTtcbmxpbmUoKTtcbnJldHVybiBzdHJpbmdzLnB1c2goY2xvc2VCcmFja2V0KTtcbiB9LFxuZG9uZTooKT0+e1xuYXNzZXJ0LmVxdWFsKGxldmVsLDApO1xucmV0dXJuIHN0cmluZ3Muam9pbignJyk7XG4gfX0pO1xuXG4gfTtcblxuLyoqXG4gKiBJZiB0aGUgbGFzdCBjaGFyYWN0ZXIgb2Ygb25lIHRva2VuIHRvZ2V0aGVyIHdpdGggdGhlIGZpcnN0IGNoYXJhY3RlclxuICogb2YgdGhlIG5leHQgdG9rZW4gbWF0Y2hlcyB0aGlzIHBhdHRlcm4sIHRoZW4gdGhlIHR3byB0b2tlbnMgbXVzdCBiZVxuICogc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UgdG8gcHJlc2VydmUgdGhlaXIgbWVhbmluZy4gT3RoZXJ3aXNlIHRoZVxuICogd2hpdGVzcGFjZSBpbiB1bm5lY2Vzc2FyeS5cbiAqXG4gKiBUaGUgYDwhYCBhbmQgYC0+YCBjYXNlcyBwcmV2ZW50IHRoZSBhY2NpZGVudGFsIGZvcm1hdGlvbiBvZiBhblxuICogaHRtbC1saWtlIGNvbW1lbnQuIEkgZG9uJ3QgdGhpbmsgdGhlIGRvdWJsZSBhbmdsZSBicmFja2V0cyBhcmUgYWN0dWFsbHlcbiAqIG5lZWRlZCBidXQgSSBoYXZlbid0IHRob3VnaHQgYWJvdXQgaXQgZW5vdWdoIHRvIHJlbW92ZSB0aGVtLlxuICovXG5jb25zdCBiYWRQYWlyUGF0dGVybj0vXig/Olxcd1xcd3w8PHw+PnxcXCtcXCt8LS18PCF8LT4pJC87XG5cbi8qKlxuICogTWluaW11bSB3aGl0ZXNwYWNlIG5lZWRlZCB0byBwcmVzZXZlIG1lYW5pbmcuXG4gKlxuICogQHJldHVybnMge0luZGVudGVyfVxuICovXG5jb25zdCBtYWtlTm9JbmRlbnRlcj0oKT0+e1xuY29uc3Qgc3RyaW5ncz1bXTtcbnJldHVybiBoYXJkZW4oe1xub3Blbjoob3BlbkJyYWNrZXQpPT5zdHJpbmdzLnB1c2gob3BlbkJyYWNrZXQpLFxubGluZTooKT0+c3RyaW5ncy5sZW5ndGgsXG5uZXh0Oih0b2tlbik9PntcbmlmKHN0cmluZ3MubGVuZ3RoPj0xKXtcbmNvbnN0IGxhc3Q9c3RyaW5nc1tzdHJpbmdzLmxlbmd0aC0xXTtcbmlmKGxhc3QubGVuZ3RoPj0xJiZ0b2tlbi5sZW5ndGg+PTEpe1xuY29uc3QgcGFpcj0gYCR7bGFzdFtsYXN0Lmxlbmd0aC0xXX0ke3Rva2VuWzBdfWA7XG5pZihiYWRQYWlyUGF0dGVybi50ZXN0KHBhaXIpKXtcbnN0cmluZ3MucHVzaCgnICcpO1xuIH1cbiB9XG4gfVxucmV0dXJuIHN0cmluZ3MucHVzaCh0b2tlbik7XG4gfSxcbmNsb3NlOihjbG9zZUJyYWNrZXQpPT57XG5pZihzdHJpbmdzLmxlbmd0aD49MSYmc3RyaW5nc1tzdHJpbmdzLmxlbmd0aC0xXT09PScsJyl7XG5zdHJpbmdzLnBvcCgpO1xuIH1cbnJldHVybiBzdHJpbmdzLnB1c2goY2xvc2VCcmFja2V0KTtcbiB9LFxuZG9uZTooKT0+c3RyaW5ncy5qb2luKCcnKX0pO1xuXG4gfTtcblxuY29uc3QgaWRlbnRQYXR0ZXJuPS9eW2EtekEtWl1cXHcqJC87XG5cbi8qKlxuICogQHBhcmFtIHtFbmNvZGluZ30gZW5jb2RpbmdcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IHNob3VsZEluZGVudFxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZGVjb2RlVG9KdXN0aW49KGVuY29kaW5nLHNob3VsZEluZGVudD1mYWxzZSk9Pntcbi8qKlxuICogVGhlIGZpcnN0IHBhc3MgZG9lcyBzb21lIGlucHV0IHZhbGlkYXRpb24uXG4gKiBJdHMgY29udHJvbCBmbG93IHNob3VsZCBtaXJyb3IgYHJlY3VyYCBhcyBjbG9zZWx5IGFzIHBvc3NpYmxlXG4gKiBhbmQgdGhlIHR3byBzaG91bGQgYmUgbWFpbnRhaW5lZCB0b2dldGhlci4gVGhleSBtdXN0IHZpc2l0IGV2ZXJ5dGhpbmdcbiAqIGluIHRoZSBzYW1lIG9yZGVyLlxuICpcbiAqIFRPRE8gbm93IHRoYXQgaWJpZHMgYXJlIGdvbmUsIHdlIHNob3VsZCBmb2xkIHRoaXMgYmFjayB0b2dldGhlciBpbnRvXG4gKiBvbmUgdmFsaWRhdGluZyBwYXNzLlxuICpcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IHJhd1RyZWVcbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5jb25zdCBwcmVwYXJlPShyYXdUcmVlKT0+e1xuaWYoIWlzT2JqZWN0KHJhd1RyZWUpKXtcbnJldHVybjtcbiB9XG4vKiBBc3NlcnRpb25zIG9mIHRoZSBhYm92ZSB0byBuYXJyb3cgdGhlIHR5cGUuKi9cbmFzc2VydC50eXBlb2YocmF3VHJlZSwnb2JqZWN0Jyk7XG5hc3NlcnQocmF3VHJlZSE9PW51bGwpO1xuaWYoUUNMQVNTIGluIHJhd1RyZWUpe1xuY29uc3QgcWNsYXNzPXJhd1RyZWVbUUNMQVNTXTtcbmFzc2VydC50eXBlb2YoXG5xY2xhc3MsXG4nc3RyaW5nJyxcblggYGludmFsaWQgcWNsYXNzIHR5cGVvZiAke3EodHlwZW9mIHFjbGFzcyl9YCk7XG5cbmFzc2VydCghaXNBcnJheShyYXdUcmVlKSk7XG5zd2l0Y2gocmF3VHJlZVsnQHFjbGFzcyddKXtcbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnTmFOJzpcbmNhc2UnSW5maW5pdHknOlxuY2FzZSctSW5maW5pdHknOntcbnJldHVybjtcbiB9XG5jYXNlJ2JpZ2ludCc6e1xuY29uc3R7ZGlnaXRzfT1yYXdUcmVlO1xuYXNzZXJ0LnR5cGVvZihcbmRpZ2l0cyxcbidzdHJpbmcnLFxuWCBgaW52YWxpZCBkaWdpdHMgdHlwZW9mICR7cSh0eXBlb2YgZGlnaXRzKX1gKTtcblxucmV0dXJuO1xuIH1cbmNhc2UnQEBhc3luY0l0ZXJhdG9yJzp7XG5yZXR1cm47XG4gfVxuY2FzZSdzeW1ib2wnOntcbmNvbnN0e25hbWV9PXJhd1RyZWU7XG5jb25zdCBzeW09cGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuYXNzZXJ0LnR5cGVvZihzeW0sJ3N5bWJvbCcpO1xucmV0dXJuO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG5jb25zdHt0YWcscGF5bG9hZH09cmF3VHJlZTtcbmFzc2VydC50eXBlb2YodGFnLCdzdHJpbmcnKTtcbnByZXBhcmUocGF5bG9hZCk7XG5yZXR1cm47XG4gfVxuY2FzZSdzbG90Jzp7XG5jb25zdHtpbmRleCxpZmFjZX09cmF3VHJlZTtcbmFzc2VydC50eXBlb2YoaW5kZXgsJ251bWJlcicpO1xuTmF0KGluZGV4KTtcbmlmKGlmYWNlIT09dW5kZWZpbmVkKXtcbmFzc2VydC50eXBlb2YoaWZhY2UsJ3N0cmluZycpO1xuIH1cbnJldHVybjtcbiB9XG5jYXNlJ2hpbGJlcnQnOntcbmNvbnN0e29yaWdpbmFsLHJlc3R9PXJhd1RyZWU7XG4nb3JpZ2luYWwnaW4gcmF3VHJlZXx8XG5GYWlsIGBJbnZhbGlkIEhpbGJlcnQgSG90ZWwgZW5jb2RpbmcgJHtyYXdUcmVlfWA7XG5wcmVwYXJlKG9yaWdpbmFsKTtcbmlmKCdyZXN0J2luIHJhd1RyZWUpe1xuYXNzZXJ0LnR5cGVvZihcbnJlc3QsXG4nb2JqZWN0JyxcblggYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IGJlIGFuIG9iamVjdGApO1xuXG5pZihyZXN0PT09bnVsbCl7XG50aHJvdyBGYWlsIGBSZXN0ICR7cmVzdH0gZW5jb2RpbmcgbXVzdCBub3QgYmUgbnVsbGA7XG4gfVxuIWlzQXJyYXkocmVzdCl8fEZhaWwgYFJlc3QgJHtyZXN0fSBlbmNvZGluZyBtdXN0IG5vdCBiZSBhbiBhcnJheWA7XG4hKFFDTEFTUyBpbiByZXN0KXx8XG5GYWlsIGBSZXN0IGVuY29kaW5nICR7cmVzdH0gbXVzdCBub3QgY29udGFpbiAke3EoUUNMQVNTKX1gO1xuY29uc3QgbmFtZXM9b3duS2V5cyhyZXN0KTtcbmZvcihjb25zdCBuYW1lIG9mIG5hbWVzKXtcbmFzc2VydC50eXBlb2YoXG5uYW1lLFxuJ3N0cmluZycsXG5YIGBQcm9wZXJ0eSBuYW1lICR7bmFtZX0gb2YgJHtyYXdUcmVlfSBtdXN0IGJlIGEgc3RyaW5nYCk7XG5cbnByZXBhcmUocmVzdFtuYW1lXSk7XG4gfVxuIH1cbnJldHVybjtcbiB9XG5jYXNlJ2Vycm9yJzp7XG5jb25zdHtuYW1lLG1lc3NhZ2V9PXJhd1RyZWU7XG5hc3NlcnQudHlwZW9mKFxubmFtZSxcbidzdHJpbmcnLFxuWCBgaW52YWxpZCBlcnJvciBuYW1lIHR5cGVvZiAke3EodHlwZW9mIG5hbWUpfWApO1xuXG5nZXRFcnJvckNvbnN0cnVjdG9yKG5hbWUpIT09dW5kZWZpbmVkfHxcbkZhaWwgYE11c3QgYmUgdGhlIG5hbWUgb2YgYW4gRXJyb3IgY29uc3RydWN0b3IgJHtuYW1lfWA7XG5hc3NlcnQudHlwZW9mKFxubWVzc2FnZSxcbidzdHJpbmcnLFxuWCBgaW52YWxpZCBlcnJvciBtZXNzYWdlIHR5cGVvZiAke3EodHlwZW9mIG1lc3NhZ2UpfWApO1xuXG5yZXR1cm47XG4gfVxuXG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFggYHVucmVjb2duaXplZCAke3EoUUNMQVNTKX0gJHtxKHFjbGFzcyl9YCxUeXBlRXJyb3IpO1xuIH19XG5cbiB9ZWxzZSBpZihpc0FycmF5KHJhd1RyZWUpKXtcbmNvbnN0e2xlbmd0aH09cmF3VHJlZTtcbmZvcihsZXQgaT0wO2k8bGVuZ3RoO2krPTEpe1xucHJlcGFyZShyYXdUcmVlW2ldKTtcbiB9XG4gfWVsc2V7XG5jb25zdCBuYW1lcz1vd25LZXlzKHJhd1RyZWUpO1xuZm9yKGNvbnN0IG5hbWUgb2YgbmFtZXMpe1xuYXNzZXJ0LnR5cGVvZihcbm5hbWUsXG4nc3RyaW5nJyxcblggYFByb3BlcnR5IG5hbWUgJHtuYW1lfSBvZiAke3Jhd1RyZWV9IG11c3QgYmUgYSBzdHJpbmdgKTtcblxucHJlcGFyZShyYXdUcmVlW25hbWVdKTtcbiB9XG4gfVxuIH07XG5cbmNvbnN0IG1ha2VJbmRlbnRlcj1zaG91bGRJbmRlbnQ/bWFrZVllc0luZGVudGVyOm1ha2VOb0luZGVudGVyO1xuY29uc3Qgb3V0PW1ha2VJbmRlbnRlcigpO1xuXG4vKipcbiAqIFRoaXMgaXMgdGhlIHNlY29uZCBwYXNzIHJlY3Vyc2lvbiBhZnRlciB0aGUgZmlyc3QgcGFzcyBgcHJlcGFyZWAuXG4gKiBUaGUgZmlyc3QgcGFzcyBkaWQgc29tZSBpbnB1dCB2YWxpZGF0aW9uIHNvXG4gKiBoZXJlIHdlIGNhbiBzYWZlbHkgYXNzdW1lIGV2ZXJ5dGhpbmcgdGhvc2UgdGhpbmdzIGFyZSB2YWxpZGF0ZWQuXG4gKlxuICogQHBhcmFtIHtFbmNvZGluZ30gcmF3VHJlZVxuICogQHJldHVybnMge251bWJlcn1cbiAqL1xuY29uc3QgZGVjb2RlPShyYXdUcmVlKT0+e1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbnJldHVybiByZWN1cihyYXdUcmVlKTtcbiB9O1xuXG5jb25zdCBkZWNvZGVQcm9wZXJ0eT0obmFtZSx2YWx1ZSk9Pntcbm91dC5saW5lKCk7XG5pZihuYW1lPT09J19fcHJvdG9fXycpe1xuLyogSmF2YVNjcmlwdCBpbnRlcnByZXRzIGB7X19wcm90b19fOiB4LCAuLi59YCovXG4vKiBhcyBtYWtpbmcgYW4gb2JqZWN0IGluaGVyaXRpbmcgZnJvbSBgeGAsIHdoZXJlYXMqL1xuLyogaW4gSlNPTiBpdCBpcyBzaW1wbHkgYSBwcm9wZXJ0eSBuYW1lLiBQcmVzZXJ2ZSB0aGUqL1xuLyogSlNPTiBtZWFuaW5nLiovXG5vdXQubmV4dCggYFtcIl9fcHJvdG9fX1wiXTpgKTtcbiB9ZWxzZSBpZihpZGVudFBhdHRlcm4udGVzdChuYW1lKSl7XG5vdXQubmV4dCggYCR7bmFtZX06YCk7XG4gfWVsc2V7XG5vdXQubmV4dCggYCR7cXVvdGUobmFtZSl9OmApO1xuIH1cbmRlY29kZSh2YWx1ZSk7XG5vdXQubmV4dCgnLCcpO1xuIH07XG5cbi8qKlxuICogTW9kZWxlZCBhZnRlciBgZnVsbFJldml2ZWAgaW4gbWFyc2hhbC5qc1xuICpcbiAqIEBwYXJhbSB7RW5jb2Rpbmd9IHJhd1RyZWVcbiAqIEByZXR1cm5zIHtudW1iZXJ9XG4gKi9cbmNvbnN0IHJlY3VyPShyYXdUcmVlKT0+e1xuaWYoIWlzT2JqZWN0KHJhd1RyZWUpKXtcbi8qIHByaW1pdGl2ZXMgZ2V0IHF1b3RlZCovXG5yZXR1cm4gb3V0Lm5leHQocXVvdGUocmF3VHJlZSkpO1xuIH1cbi8qIEFzc2VydGlvbnMgb2YgdGhlIGFib3ZlIHRvIG5hcnJvdyB0aGUgdHlwZS4qL1xuYXNzZXJ0LnR5cGVvZihyYXdUcmVlLCdvYmplY3QnKTtcbmFzc2VydChyYXdUcmVlIT09bnVsbCk7XG5pZihRQ0xBU1MgaW4gcmF3VHJlZSl7XG5jb25zdCBxY2xhc3M9cmF3VHJlZVtRQ0xBU1NdO1xuYXNzZXJ0LnR5cGVvZihxY2xhc3MsJ3N0cmluZycpO1xuYXNzZXJ0KCFpc0FycmF5KHJhd1RyZWUpKTtcbi8qIFN3aXRjaGluZyBvbiBgZW5jb2RlZFtRQ0xBU1NdYCAob3IgYW55dGhpbmcgbGVzcyBkaXJlY3QsIGxpa2UqL1xuLyogYHFjbGFzc2ApIGRvZXMgbm90IGRpc2NyaW1pbmF0ZSByYXdUcmVlIGluIHR5cGVzY3JpcHRANC4yLjMgYW5kKi9cbi8qIGVhcmxpZXIuKi9cbnN3aXRjaChyYXdUcmVlWydAcWNsYXNzJ10pe1xuLyogRW5jb2Rpbmcgb2YgcHJpbWl0aXZlcyBub3QgaGFuZGxlZCBieSBKU09OKi9cbmNhc2UndW5kZWZpbmVkJzpcbmNhc2UnTmFOJzpcbmNhc2UnSW5maW5pdHknOlxuY2FzZSctSW5maW5pdHknOntcbi8qIFRoZWlyIHFjbGFzcyBpcyB0aGVpciBleHByZXNzaW9uIHNvdXJjZS4qL1xucmV0dXJuIG91dC5uZXh0KHFjbGFzcyk7XG4gfVxuY2FzZSdiaWdpbnQnOntcbmNvbnN0e2RpZ2l0c309cmF3VHJlZTtcbnJldHVybiBvdXQubmV4dCggYCR7QmlnSW50KGRpZ2l0cyl9bmApO1xuIH1cbmNhc2UnQEBhc3luY0l0ZXJhdG9yJzp7XG4vKiBUT0RPIGRlcHJlY2F0ZWQuIEV2ZW50dWFsbHkgcmVtb3ZlLiovXG5yZXR1cm4gb3V0Lm5leHQoJ1N5bWJvbC5hc3luY0l0ZXJhdG9yJyk7XG4gfVxuY2FzZSdzeW1ib2wnOntcbmNvbnN0e25hbWV9PXJhd1RyZWU7XG5jb25zdCBzeW09cGFzc2FibGVTeW1ib2xGb3JOYW1lKG5hbWUpO1xuYXNzZXJ0LnR5cGVvZihzeW0sJ3N5bWJvbCcpO1xuY29uc3QgcmVnaXN0ZXJlZE5hbWU9U3ltYm9sLmtleUZvcihzeW0pO1xuaWYocmVnaXN0ZXJlZE5hbWU9PT11bmRlZmluZWQpe1xuY29uc3QgbWF0Y2g9QXRBdFByZWZpeFBhdHRlcm4uZXhlYyhuYW1lKTtcbmFzc2VydChtYXRjaCE9PW51bGwpO1xuY29uc3Qgc3VmZml4PW1hdGNoWzFdO1xuYXNzZXJ0KFN5bWJvbFtzdWZmaXhdPT09c3ltKTtcbmFzc2VydChpZGVudFBhdHRlcm4udGVzdChzdWZmaXgpKTtcbnJldHVybiBvdXQubmV4dCggYFN5bWJvbC4ke3N1ZmZpeH1gKTtcbiB9XG5yZXR1cm4gb3V0Lm5leHQoIGBTeW1ib2wuZm9yKCR7cXVvdGUocmVnaXN0ZXJlZE5hbWUpfSlgKTtcbiB9XG5jYXNlJ3RhZ2dlZCc6e1xuY29uc3R7dGFnLHBheWxvYWR9PXJhd1RyZWU7XG5vdXQubmV4dCggYG1ha2VUYWdnZWQoJHtxdW90ZSh0YWcpfSxgKTtcbmRlY29kZShwYXlsb2FkKTtcbnJldHVybiBvdXQubmV4dCgnKScpO1xuIH1cblxuY2FzZSdzbG90Jzp7XG5sZXR7aW5kZXgsaWZhY2V9PXJhd1RyZWU7XG5pbmRleD1OdW1iZXIoTmF0KGluZGV4KSk7XG5pZihpZmFjZT09PXVuZGVmaW5lZCl7XG5yZXR1cm4gb3V0Lm5leHQoIGBzbG90KCR7aW5kZXh9KWApO1xuIH1lbHNle1xuaWZhY2U9cXVvdGUoaWZhY2UpO1xucmV0dXJuIG91dC5uZXh0KCBgc2xvdCgke2luZGV4fSwke2lmYWNlfSlgKTtcbiB9XG4gfVxuXG5jYXNlJ2hpbGJlcnQnOntcbmNvbnN0e29yaWdpbmFsLHJlc3R9PXJhd1RyZWU7XG5vdXQub3BlbigneycpO1xuZGVjb2RlUHJvcGVydHkoUUNMQVNTLG9yaWdpbmFsKTtcbmlmKCdyZXN0J2luIHJhd1RyZWUpe1xuYXNzZXJ0LnR5cGVvZihyZXN0LCdvYmplY3QnKTtcbmFzc2VydChyZXN0IT09bnVsbCk7XG5jb25zdCBuYW1lcz1vd25LZXlzKHJlc3QpO1xuZm9yKGNvbnN0IG5hbWUgb2YgbmFtZXMpe1xuYXNzZXJ0LnR5cGVvZihcbm5hbWUsXG4nc3RyaW5nJyxcblggYFByb3BlcnR5IG5hbWUgJHtuYW1lfSBvZiAke3Jlc3R9IG11c3QgYmUgYSBzdHJpbmdgKTtcblxuZGVjb2RlUHJvcGVydHkobmFtZSxyZXN0W25hbWVdKTtcbiB9XG4gfVxucmV0dXJuIG91dC5jbG9zZSgnfScpO1xuIH1cblxuY2FzZSdlcnJvcic6e1xuY29uc3R7bmFtZSxtZXNzYWdlfT1yYXdUcmVlO1xucmV0dXJuIG91dC5uZXh0KCBgJHtuYW1lfSgke3F1b3RlKG1lc3NhZ2UpfSlgKTtcbiB9XG5cbmRlZmF1bHQ6e1xuYXNzZXJ0LmZhaWwoWCBgdW5yZWNvZ25pemVkICR7cShRQ0xBU1MpfSAke3EocWNsYXNzKX1gLFR5cGVFcnJvcik7XG4gfX1cblxuIH1lbHNlIGlmKGlzQXJyYXkocmF3VHJlZSkpe1xuY29uc3R7bGVuZ3RofT1yYXdUcmVlO1xuaWYobGVuZ3RoPT09MCl7XG5yZXR1cm4gb3V0Lm5leHQoJ1tdJyk7XG4gfWVsc2V7XG5vdXQub3BlbignWycpO1xuZm9yKGxldCBpPTA7aTxsZW5ndGg7aSs9MSl7XG5vdXQubGluZSgpO1xuZGVjb2RlKHJhd1RyZWVbaV0pO1xub3V0Lm5leHQoJywnKTtcbiB9XG5yZXR1cm4gb3V0LmNsb3NlKCddJyk7XG4gfVxuIH1lbHNle1xuLyogcmF3VHJlZSBpcyBhbiBgRW5jb2RpbmdSZWNvcmRgIHdoaWNoIG9ubHkgaGFzIHN0cmluZyBrZXlzLCovXG4vKiBidXQgc2luY2Ugb3duS2V5cyBpcyBub3QgZ2VuZXJpYywgaXQgY2FuJ3QgcHJvcGFnYXRlIHRoYXQqL1xuY29uc3QgbmFtZXM9LyoqIEB0eXBlIHtzdHJpbmdbXX0gKi9vd25LZXlzKHJhd1RyZWUpO1xuaWYobmFtZXMubGVuZ3RoPT09MCl7XG5yZXR1cm4gb3V0Lm5leHQoJ3t9Jyk7XG4gfWVsc2V7XG5vdXQub3BlbigneycpO1xuZm9yKGNvbnN0IG5hbWUgb2YgbmFtZXMpe1xuZGVjb2RlUHJvcGVydHkobmFtZSxyYXdUcmVlW25hbWVdKTtcbiB9XG5yZXR1cm4gb3V0LmNsb3NlKCd9Jyk7XG4gfVxuIH1cbiB9O1xucHJlcGFyZShlbmNvZGluZyk7XG5kZWNvZGUoZW5jb2RpbmcpO1xucmV0dXJuIG91dC5kb25lKCk7XG4gfTskaOKAjV9vbmNlLmRlY29kZVRvSnVzdGluKGRlY29kZVRvSnVzdGluKTtcbmhhcmRlbihkZWNvZGVUb0p1c3Rpbik7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiZGVjb2RlVG9KdXN0aW4iOlsiZGVjb2RlVG9KdXN0aW4iXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAMteTRcMGAADDBgAALQAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9tYXJzaGFsLXN0cmluZ2lmeS5qc3siaW1wb3J0cyI6WyIuL21hcnNoYWwuanMiXSwiZXhwb3J0cyI6WyJwYXJzZSIsInN0cmluZ2lmeSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBtYWtlTWFyc2hhbDskaOKAjV9pbXBvcnRzKFtbXCIuL21hcnNoYWwuanNcIiwgW1tcIm1ha2VNYXJzaGFsXCIsIFskaOKAjV9hID0+IChtYWtlTWFyc2hhbCA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cblxuY29uc3R7RmFpbH09YXNzZXJ0O1xuXG4vKiogQHR5cGUge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db252ZXJ0VmFsVG9TbG90PGFueT59ICovXG5jb25zdCBkb05vdENvbnZlcnRWYWxUb1Nsb3Q9KHZhbCk9PlxuRmFpbCBgTWFyc2hhbCdzIHN0cmluZ2lmeSByZWplY3RzIHByZXNlbmNlcyBhbmQgcHJvbWlzZXMgJHt2YWx9YDtcblxuLyoqIEB0eXBlIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29udmVydFNsb3RUb1ZhbDxhbnk+fSAqL1xuY29uc3QgZG9Ob3RDb252ZXJ0U2xvdFRvVmFsPShzbG90LF9pZmFjZSk9PlxuRmFpbCBgTWFyc2hhbCdzIHBhcnNlIG11c3Qgbm90IGVuY29kZSBhbnkgc2xvdHMgJHtzbG90fWA7XG5cbmNvbnN0IGJhZEFycmF5SGFuZGxlcj1oYXJkZW4oe1xuZ2V0OihfdGFyZ2V0LG5hbWUsX3JlY2VpdmVyKT0+e1xuaWYobmFtZT09PSdsZW5ndGgnKXtcbnJldHVybiAwO1xuIH1cbi8qIGB0aHJvd2AgaXMgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLiBCdXQgbGludGVyIGNvbmZ1c2VkKi9cbnRocm93IEZhaWwgYE1hcnNoYWwncyBwYXJzZSBtdXN0IG5vdCBlbmNvZGUgYW55IHNsb3QgcG9zaXRpb25zICR7bmFtZX1gO1xuIH19KTtcblxuXG5jb25zdCBiYWRBcnJheT1oYXJkZW4obmV3IFByb3h5KGhhcmRlbihbXSksYmFkQXJyYXlIYW5kbGVyKSk7XG5cbmNvbnN0e3NlcmlhbGl6ZSx1bnNlcmlhbGl6ZX09bWFrZU1hcnNoYWwoXG5kb05vdENvbnZlcnRWYWxUb1Nsb3QsXG5kb05vdENvbnZlcnRTbG90VG9WYWwsXG57XG5lcnJvclRhZ2dpbmc6J29mZicsXG4vKiBUT0RPIGZpeCB0ZXN0cyB0byB3b3JrcyB3aXRoIHNtYWxsY2Fwcy4qL1xuc2VyaWFsaXplQm9keUZvcm1hdDonY2FwZGF0YSd9KTtcblxuXG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gdmFsXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCBzdHJpbmdpZnk9KHZhbCk9PnNlcmlhbGl6ZSh2YWwpLmJvZHk7JGjigI1fb25jZS5zdHJpbmdpZnkoc3RyaW5naWZ5KTtcbmhhcmRlbihzdHJpbmdpZnkpO1xuXG4vKipcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEByZXR1cm5zIHtQYXNzYWJsZX1cbiAqL1xuY29uc3QgcGFyc2U9KHN0cik9PlxudW5zZXJpYWxpemUoXG5oYXJkZW4oe1xuYm9keTpzdHIsXG5zbG90czpiYWRBcnJheX0pKTskaOKAjV9vbmNlLnBhcnNlKHBhcnNlKTtcblxuXG5oYXJkZW4ocGFyc2UpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7InN0cmluZ2lmeSI6WyJzdHJpbmdpZnkiXSwicGFyc2UiOlsicGFyc2UiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAad/d+VUyAABVMgAAIwAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9tYXJzaGFsLmpzeyJpbXBvcnRzIjpbIi4vZW5jb2RlVG9DYXBEYXRhLmpzIiwiLi9lbmNvZGVUb1NtYWxsY2Fwcy5qcyIsIi4vaGVscGVycy9lcnJvci5qcyIsIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vaGVscGVycy9yZW1vdGFibGUuanMiLCIuL3Bhc3NTdHlsZU9mLmpzIiwiQGVuZG8vbmF0Il0sImV4cG9ydHMiOlsibWFrZU1hcnNoYWwiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgTmF0LGFzc2VydFBhc3NhYmxlLGdldEludGVyZmFjZU9mLGdldEVycm9yQ29uc3RydWN0b3IsUUNMQVNTLG1ha2VFbmNvZGVUb0NhcERhdGEsbWFrZURlY29kZUZyb21DYXBEYXRhLG1ha2VEZWNvZGVGcm9tU21hbGxjYXBzLG1ha2VFbmNvZGVUb1NtYWxsY2FwcyxoYXNPd25Qcm9wZXJ0eU9mOyRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL25hdFwiLCBbW1wiTmF0XCIsIFskaOKAjV9hID0+IChOYXQgPSAkaOKAjV9hKV1dXV0sW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wiYXNzZXJ0UGFzc2FibGVcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFBhc3NhYmxlID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9yZW1vdGFibGUuanNcIiwgW1tcImdldEludGVyZmFjZU9mXCIsIFskaOKAjV9hID0+IChnZXRJbnRlcmZhY2VPZiA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvZXJyb3IuanNcIiwgW1tcImdldEVycm9yQ29uc3RydWN0b3JcIiwgWyRo4oCNX2EgPT4gKGdldEVycm9yQ29uc3RydWN0b3IgPSAkaOKAjV9hKV1dXV0sW1wiLi9lbmNvZGVUb0NhcERhdGEuanNcIiwgW1tcIlFDTEFTU1wiLCBbJGjigI1fYSA9PiAoUUNMQVNTID0gJGjigI1fYSldXSxbXCJtYWtlRW5jb2RlVG9DYXBEYXRhXCIsIFskaOKAjV9hID0+IChtYWtlRW5jb2RlVG9DYXBEYXRhID0gJGjigI1fYSldXSxbXCJtYWtlRGVjb2RlRnJvbUNhcERhdGFcIiwgWyRo4oCNX2EgPT4gKG1ha2VEZWNvZGVGcm9tQ2FwRGF0YSA9ICRo4oCNX2EpXV1dXSxbXCIuL2VuY29kZVRvU21hbGxjYXBzLmpzXCIsIFtbXCJtYWtlRGVjb2RlRnJvbVNtYWxsY2Fwc1wiLCBbJGjigI1fYSA9PiAobWFrZURlY29kZUZyb21TbWFsbGNhcHMgPSAkaOKAjV9hKV1dLFtcIm1ha2VFbmNvZGVUb1NtYWxsY2Fwc1wiLCBbJGjigI1fYSA9PiAobWFrZUVuY29kZVRvU21hbGxjYXBzID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiaGFzT3duUHJvcGVydHlPZlwiLCBbJGjigI1fYSA9PiAoaGFzT3duUHJvcGVydHlPZiA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5NYWtlTWFyc2hhbE9wdGlvbnN9IE1ha2VNYXJzaGFsT3B0aW9ucyAqL1xuLyoqIEB0ZW1wbGF0ZSBTbG90IEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29udmVydFNsb3RUb1ZhbDxTbG90Pn0gQ29udmVydFNsb3RUb1ZhbCAqL1xuLyoqIEB0ZW1wbGF0ZSBTbG90IEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuQ29udmVydFZhbFRvU2xvdDxTbG90Pn0gQ29udmVydFZhbFRvU2xvdCAqL1xuLyoqIEB0ZW1wbGF0ZSBTbG90IEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuU2VyaWFsaXplPFNsb3Q+fSBTZXJpYWxpemUgKi9cbi8qKiBAdGVtcGxhdGUgU2xvdCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlVuc2VyaWFsaXplPFNsb3Q+fSBVbnNlcmlhbGl6ZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFzc2FibGV9IFBhc3NhYmxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5JbnRlcmZhY2VTcGVjfSBJbnRlcmZhY2VTcGVjICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5FbmNvZGluZ30gRW5jb2RpbmcgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlJlbW90YWJsZX0gUmVtb3RhYmxlICovXG5cbmNvbnN0e2lzQXJyYXl9PUFycmF5O1xuY29uc3R7ZGV0YWlsczpYLEZhaWwscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcblxuLyoqIEB0eXBlIHtDb252ZXJ0VmFsVG9TbG90PGFueT59ICovXG5jb25zdCBkZWZhdWx0VmFsVG9TbG90Rm49KHgpPT54O1xuLyoqIEB0eXBlIHtDb252ZXJ0U2xvdFRvVmFsPGFueT59ICovXG5jb25zdCBkZWZhdWx0U2xvdFRvVmFsRm49KHgsXyk9Png7XG5cbi8qKlxuICogQHRlbXBsYXRlIFNsb3RcbiAqIEBwYXJhbSB7Q29udmVydFZhbFRvU2xvdDxTbG90Pn0gW2NvbnZlcnRWYWxUb1Nsb3RdXG4gKiBAcGFyYW0ge0NvbnZlcnRTbG90VG9WYWw8U2xvdD59IFtjb252ZXJ0U2xvdFRvVmFsXVxuICogQHBhcmFtIHtNYWtlTWFyc2hhbE9wdGlvbnN9IG9wdGlvbnNcbiAqL1xuY29uc3QgICAgICAgIG1ha2VNYXJzaGFsPShcbmNvbnZlcnRWYWxUb1Nsb3Q9ZGVmYXVsdFZhbFRvU2xvdEZuLFxuY29udmVydFNsb3RUb1ZhbD1kZWZhdWx0U2xvdFRvVmFsRm4sXG57XG5lcnJvclRhZ2dpbmc9J29uJyxcbm1hcnNoYWxOYW1lPSdhbm9uLW1hcnNoYWwnLFxuLyogVE9ETyBUZW1wb3JhcnkgaGFjay4qL1xuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvMjc4MCovXG5lcnJvcklkTnVtPTEwMDAwLFxuLyogV2UgcHJlZmVyIHRoYXQgdGhlIGNhbGxlciBpbnN0ZWFkIGxvZyB0byBzb21ld2hlcmUgaGlkZGVuKi9cbi8qIHRvIGJlIHJldmVhbGVkIHdoZW4gY29ycmVsYXRpbmcgd2l0aCB0aGUgcmVjZWl2ZWQgZXJyb3IuKi9cbm1hcnNoYWxTYXZlRXJyb3I9KGVycik9PlxuY29uc29sZS5sb2coJ1RlbXBvcmFyeSBsb2dnaW5nIG9mIHNlbnQgZXJyb3InLGVyciksXG4vKiBEZWZhdWx0IHRvICdjYXBkYXRhJyBiZWNhdXNlIGl0IHdhcyBpbXBsZW1lbnRlZCBmaXJzdC4qL1xuLyogU29tZXRpbWVzLCBvbnRvZ2VueSBkb2VzIHJlY2FwaXR1bGF0ZSBwaHlsb2dlbnkgOykqL1xuc2VyaWFsaXplQm9keUZvcm1hdD0nY2FwZGF0YSd9PVxue30pPT5cbntcbmFzc2VydC50eXBlb2YobWFyc2hhbE5hbWUsJ3N0cmluZycpO1xuZXJyb3JUYWdnaW5nPT09J29uJ3x8XG5lcnJvclRhZ2dpbmc9PT0nb2ZmJ3x8XG5GYWlsIGBUaGUgZXJyb3JUYWdnaW5nIG9wdGlvbiBjYW4gb25seSBiZSBcIm9uXCIgb3IgXCJvZmZcIiAke2Vycm9yVGFnZ2luZ31gO1xuY29uc3QgbmV4dEVycm9ySWQ9KCk9PntcbmVycm9ySWROdW0rPTE7XG5yZXR1cm4gYGVycm9yOiR7bWFyc2hhbE5hbWV9IyR7ZXJyb3JJZE51bX1gO1xuIH07XG5cbi8qKlxuICogQHR5cGUge1NlcmlhbGl6ZTxTbG90Pn1cbiAqL1xuY29uc3Qgc2VyaWFsaXplPShyb290KT0+e1xuY29uc3Qgc2xvdHM9W107XG4vKiBtYXBzIHZhbCAocHJvbWlzZSBvciByZW1vdGFibGUpIHRvIGluZGV4IG9mIHNsb3RzW10qL1xuY29uc3Qgc2xvdE1hcD1uZXcgTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHtSZW1vdGFibGUgfCBQcm9taXNlfSBwYXNzYWJsZVxuICogQHJldHVybnMge3tpbmRleDogbnVtYmVyLCByZXBlYXQ6IGJvb2xlYW59fVxuICovXG5jb25zdCBlbmNvZGVTbG90Q29tbW9uPShwYXNzYWJsZSk9PntcbmxldCBpbmRleD1zbG90TWFwLmdldChwYXNzYWJsZSk7XG5pZihpbmRleCE9PXVuZGVmaW5lZCl7XG4vKiBUT0RPIGFzc2VydCB0aGF0IGl0J3MgdGhlIHNhbWUgaWZhY2UgYXMgYmVmb3JlKi9cbmFzc2VydC50eXBlb2YoaW5kZXgsJ251bWJlcicpO1xucmV0dXJuIGhhcmRlbih7aW5kZXgscmVwZWF0OnRydWV9KTtcbiB9XG5cbmluZGV4PXNsb3RzLmxlbmd0aDtcbmNvbnN0IHNsb3Q9Y29udmVydFZhbFRvU2xvdChwYXNzYWJsZSk7XG5zbG90cy5wdXNoKHNsb3QpO1xuc2xvdE1hcC5zZXQocGFzc2FibGUsaW5kZXgpO1xucmV0dXJuIGhhcmRlbih7aW5kZXgscmVwZWF0OmZhbHNlfSk7XG4gfTtcblxuLyoqXG4gKiBFdmVuIGlmIGFuIEVycm9yIGlzIG5vdCBhY3R1YWxseSBwYXNzYWJsZSwgd2UnZCByYXRoZXIgc2VuZFxuICogaXQgYW55d2F5IGJlY2F1c2UgdGhlIGRpYWdub3N0aWMgaW5mbyBjYXJyaWVkIGJ5IHRoZSBlcnJvclxuICogaXMgbW9yZSB2YWx1YWJsZSB0aGFuIGRpYWdub3Npbmcgd2h5IHRoZSBlcnJvciBpc24ndFxuICogcGFzc2FibGUuIFNlZSBjb21tZW50cyBpbiBFcnJvckhlbHBlci5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJcbiAqIEBwYXJhbSB7KHA6IFBhc3NhYmxlKSA9PiB1bmtub3dufSBlbmNvZGVSZWN1clxuICogQHJldHVybnMge3tlcnJvcklkPzogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcsIG5hbWU6IHN0cmluZ319XG4gKi9cbmNvbnN0IGVuY29kZUVycm9yQ29tbW9uPShlcnIsZW5jb2RlUmVjdXIpPT57XG5jb25zdCBtZXNzYWdlPWVuY29kZVJlY3VyKCBgJHtlcnIubWVzc2FnZX1gKTtcbmFzc2VydC50eXBlb2YobWVzc2FnZSwnc3RyaW5nJyk7XG5jb25zdCBuYW1lPWVuY29kZVJlY3VyKCBgJHtlcnIubmFtZX1gKTtcbmFzc2VydC50eXBlb2YobmFtZSwnc3RyaW5nJyk7XG4vKiBNdXN0IGVuY29kZSBgY2F1c2VgLCBgZXJyb3JzYC4qL1xuLyogbmVzdGVkIG5vbi1wYXNzYWJsZSBlcnJvcnMgbXVzdCBiZSBvayBmcm9tIGhlcmUuKi9cbmlmKGVycm9yVGFnZ2luZz09PSdvbicpe1xuLyogV2UgZGVsaWJlcmF0ZWx5IGRvIG5vdCBzaGFyZSB0aGUgc3RhY2ssIGJ1dCBpdCB3b3VsZCovXG4vKiBiZSB1c2VmdWwgdG8gbG9nIHRoZSBzdGFjayBsb2NhbGx5IHNvIHNvbWVvbmUgd2hvIGhhcyovXG4vKiBwcml2aWxlZ2VkIGFjY2VzcyB0byB0aGUgdGhyb3dpbmcgVmF0IGNhbiBjb3JyZWxhdGUqL1xuLyogdGhlIHByb2JsZW0gd2l0aCB0aGUgcmVtb3RlIFZhdCB0aGF0IGdldHMgdGhpcyovXG4vKiBzdW1tYXJ5LiBJZiB3ZSBkbyB0aGF0LCB3ZSBjb3VsZCBhbGxvY2F0ZSBzb21lIHJhbmRvbSovXG4vKiBpZGVudGlmaWVyIGFuZCBpbmNsdWRlIGl0IGluIHRoZSBtZXNzYWdlLCB0byBoZWxwKi9cbi8qIHdpdGggdGhlIGNvcnJlbGF0aW9uLiovXG5jb25zdCBlcnJvcklkPWVuY29kZVJlY3VyKG5leHRFcnJvcklkKCkpO1xuYXNzZXJ0LnR5cGVvZihlcnJvcklkLCdzdHJpbmcnKTtcbmFzc2VydC5ub3RlKGVycixYIGBTZW50IGFzICR7ZXJyb3JJZH1gKTtcbm1hcnNoYWxTYXZlRXJyb3IoZXJyKTtcbnJldHVybiBoYXJkZW4oe2Vycm9ySWQsbWVzc2FnZSxuYW1lfSk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHttZXNzYWdlLG5hbWV9KTtcbiB9XG4gfTtcblxuaWYoc2VyaWFsaXplQm9keUZvcm1hdD09PSdjYXBkYXRhJyl7XG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHBhc3NhYmxlXG4gKiBAcGFyYW0ge0ludGVyZmFjZVNwZWN9IFtpZmFjZV1cbiAqIEByZXR1cm5zIHtFbmNvZGluZ31cbiAqL1xuY29uc3QgZW5jb2RlU2xvdFRvQ2FwRGF0YT0ocGFzc2FibGUsaWZhY2U9dW5kZWZpbmVkKT0+e1xuY29uc3R7aW5kZXgscmVwZWF0fT1lbmNvZGVTbG90Q29tbW9uKHBhc3NhYmxlKTtcblxuaWYocmVwZWF0PT09dHJ1ZXx8aWZhY2U9PT11bmRlZmluZWQpe1xucmV0dXJuIGhhcmRlbih7W1FDTEFTU106J3Nsb3QnLGluZGV4fSk7XG4gfWVsc2V7XG5yZXR1cm4gaGFyZGVuKHtbUUNMQVNTXTonc2xvdCcsaWZhY2UsaW5kZXh9KTtcbiB9XG4gfTtcblxuY29uc3QgZW5jb2RlUmVtb3RhYmxlVG9DYXBEYXRhPSh2YWwsX2VuY29kZVJlY3VyKT0+XG5lbmNvZGVTbG90VG9DYXBEYXRhKHZhbCxnZXRJbnRlcmZhY2VPZih2YWwpKTtcblxuY29uc3QgZW5jb2RlUHJvbWlzZVRvQ2FwRGF0YT0ocHJvbWlzZSxfZW5jb2RlUmVjdXIpPT5cbmVuY29kZVNsb3RUb0NhcERhdGEocHJvbWlzZSk7XG5cbi8qKlxuICogRXZlbiBpZiBhbiBFcnJvciBpcyBub3QgYWN0dWFsbHkgcGFzc2FibGUsIHdlJ2QgcmF0aGVyIHNlbmRcbiAqIGl0IGFueXdheSBiZWNhdXNlIHRoZSBkaWFnbm9zdGljIGluZm8gY2FycmllZCBieSB0aGUgZXJyb3JcbiAqIGlzIG1vcmUgdmFsdWFibGUgdGhhbiBkaWFnbm9zaW5nIHdoeSB0aGUgZXJyb3IgaXNuJ3RcbiAqIHBhc3NhYmxlLiBTZWUgY29tbWVudHMgaW4gRXJyb3JIZWxwZXIuXG4gKlxuICogQHBhcmFtIHtFcnJvcn0gZXJyXG4gKiBAcGFyYW0geyhwOiBQYXNzYWJsZSkgPT4gRW5jb2Rpbmd9IGVuY29kZVJlY3VyXG4gKiBAcmV0dXJucyB7RW5jb2Rpbmd9XG4gKi9cbmNvbnN0IGVuY29kZUVycm9yVG9DYXBEYXRhPShlcnIsZW5jb2RlUmVjdXIpPT57XG5jb25zdCBlcnJEYXRhPWVuY29kZUVycm9yQ29tbW9uKGVycixlbmNvZGVSZWN1cik7XG5yZXR1cm4gaGFyZGVuKHtbUUNMQVNTXTonZXJyb3InLC4uLmVyckRhdGF9KTtcbiB9O1xuXG5jb25zdCBlbmNvZGVUb0NhcERhdGE9bWFrZUVuY29kZVRvQ2FwRGF0YSh7XG5lbmNvZGVSZW1vdGFibGVUb0NhcERhdGEsXG5lbmNvZGVQcm9taXNlVG9DYXBEYXRhLFxuZW5jb2RlRXJyb3JUb0NhcERhdGF9KTtcblxuXG5jb25zdCBlbmNvZGVkPWVuY29kZVRvQ2FwRGF0YShyb290KTtcbmNvbnN0IGJvZHk9SlNPTi5zdHJpbmdpZnkoZW5jb2RlZCk7XG5yZXR1cm4gaGFyZGVuKHtcbmJvZHksXG5zbG90c30pO1xuXG4gfWVsc2UgaWYoc2VyaWFsaXplQm9keUZvcm1hdD09PSdzbWFsbGNhcHMnKXtcbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IHByZWZpeFxuICogQHBhcmFtIHtQYXNzYWJsZX0gcGFzc2FibGVcbiAqIEBwYXJhbSB7SW50ZXJmYWNlU3BlY30gW2lmYWNlXVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuY29uc3QgZW5jb2RlU2xvdFRvU21hbGxjYXBzPShwcmVmaXgscGFzc2FibGUsaWZhY2U9dW5kZWZpbmVkKT0+e1xuY29uc3R7aW5kZXgscmVwZWF0fT1lbmNvZGVTbG90Q29tbW9uKHBhc3NhYmxlKTtcblxuLyogVE9ETyBleHBsb3JlIHJlbW92aW5nIHRoaXMgc3BlY2lhbCBjYXNlKi9cbmlmKHJlcGVhdD09PXRydWV8fGlmYWNlPT09dW5kZWZpbmVkKXtcbnJldHVybiBgJHtwcmVmaXh9JHtpbmRleH1gO1xuIH1cbnJldHVybiBgJHtwcmVmaXh9JHtpbmRleH0uJHtpZmFjZX1gO1xuIH07XG5cbmNvbnN0IGVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzPShyZW1vdGFibGUsX2VuY29kZVJlY3VyKT0+XG5lbmNvZGVTbG90VG9TbWFsbGNhcHMoJyQnLHJlbW90YWJsZSxnZXRJbnRlcmZhY2VPZihyZW1vdGFibGUpKTtcblxuY29uc3QgZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzPShwcm9taXNlLF9lbmNvZGVSZWN1cik9PlxuZW5jb2RlU2xvdFRvU21hbGxjYXBzKCcmJyxwcm9taXNlKTtcblxuY29uc3QgZW5jb2RlRXJyb3JUb1NtYWxsY2Fwcz0oZXJyLGVuY29kZVJlY3VyKT0+e1xuY29uc3QgZXJyRGF0YT1lbmNvZGVFcnJvckNvbW1vbihlcnIsZW5jb2RlUmVjdXIpO1xuY29uc3R7bWVzc2FnZSwuLi5yZXN0fT1lcnJEYXRhO1xucmV0dXJuIGhhcmRlbih7JyNlcnJvcic6bWVzc2FnZSwuLi5yZXN0fSk7XG4gfTtcblxuY29uc3QgZW5jb2RlVG9TbWFsbGNhcHM9bWFrZUVuY29kZVRvU21hbGxjYXBzKHtcbmVuY29kZVJlbW90YWJsZVRvU21hbGxjYXBzLFxuZW5jb2RlUHJvbWlzZVRvU21hbGxjYXBzLFxuZW5jb2RlRXJyb3JUb1NtYWxsY2Fwc30pO1xuXG5cbmNvbnN0IGVuY29kZWQ9ZW5jb2RlVG9TbWFsbGNhcHMocm9vdCk7XG5jb25zdCBzbWFsbGNhcHNCb2R5PUpTT04uc3RyaW5naWZ5KGVuY29kZWQpO1xucmV0dXJuIGhhcmRlbih7XG4vKiBWYWxpZCBKU09OIGNhbm5vdCBiZWdpbiB3aXRoIGEgJyMnLCBzbyB0aGlzIGlzIGEgdmFsaWQgc2lnbmFsKi9cbi8qIGluZGljYXRpbmcgc21hbGxjYXBzIGZvcm1hdC4qL1xuYm9keTogYCMke3NtYWxsY2Fwc0JvZHl9YCxcbnNsb3RzfSk7XG5cbiB9ZWxzZXtcbi8qIFRoZSBgdGhyb3dgIGlzIGEgbm9vcCBzaW5jZSBgRmFpbGAgdGhyb3dzLiBBZGRlZCBmb3IgY29uZnVzZWQgbGludGVycy4qL1xudGhyb3cgRmFpbCBgVW5yZWNvZ25pemVkIHNlcmlhbGl6ZUJvZHlGb3JtYXQ6ICR7cShzZXJpYWxpemVCb2R5Rm9ybWF0KX1gO1xuIH1cbiB9O1xuXG5jb25zdCBtYWtlRnVsbFJldml2ZT0oc2xvdHMpPT57XG4vKiogQHR5cGUge01hcDxudW1iZXIsIFBhc3NhYmxlPn0gKi9cbmNvbnN0IHZhbE1hcD1uZXcgTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHt7aWZhY2U/OiBzdHJpbmcsIGluZGV4OiBudW1iZXJ9fSBzbG90RGF0YVxuICogQHJldHVybnMge1JlbW90YWJsZSB8IFByb21pc2V9XG4gKi9cbmNvbnN0IGRlY29kZVNsb3RDb21tb249KHNsb3REYXRhKT0+e1xuY29uc3R7aWZhY2U9dW5kZWZpbmVkLGluZGV4LC4uLnJlc3R9PXNsb3REYXRhO1xub3duS2V5cyhyZXN0KS5sZW5ndGg9PT0wfHxcbkZhaWwgYHVuZXhwZWN0ZWQgZW5jb2RlZCBzbG90IHByb3BlcnRpZXMgJHtxKG93bktleXMocmVzdCkpfWA7XG5pZih2YWxNYXAuaGFzKGluZGV4KSl7XG5yZXR1cm4gdmFsTWFwLmdldChpbmRleCk7XG4gfVxuLyogVE9ETyBTRUNVUklUWSBIQVpBUkQ6IG11c3QgZW5mb2NlIHRoYXQgcmVtb3RhYmxlIHZzIHByb21pc2UqL1xuLyogaXMgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGVkIHN0cmluZy4qL1xuY29uc3Qgc2xvdD1zbG90c1tOdW1iZXIoTmF0KGluZGV4KSldO1xuY29uc3QgdmFsPWNvbnZlcnRTbG90VG9WYWwoc2xvdCxpZmFjZSk7XG52YWxNYXAuc2V0KGluZGV4LHZhbCk7XG5yZXR1cm4gdmFsO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHt7ZXJyb3JJZD86IHN0cmluZywgbWVzc2FnZTogc3RyaW5nLCBuYW1lOiBzdHJpbmd9fSBlcnJEYXRhXG4gKiBAcGFyYW0geyhlOiB1bmtub3duKSA9PiBQYXNzYWJsZX0gZGVjb2RlUmVjdXJcbiAqIEByZXR1cm5zIHtFcnJvcn1cbiAqL1xuY29uc3QgZGVjb2RlRXJyb3JDb21tb249KGVyckRhdGEsZGVjb2RlUmVjdXIpPT57XG5jb25zdHtlcnJvcklkPXVuZGVmaW5lZCxtZXNzYWdlLG5hbWUsLi4ucmVzdH09ZXJyRGF0YTtcbm93bktleXMocmVzdCkubGVuZ3RoPT09MHx8XG5GYWlsIGB1bmV4cGVjdGVkIGVuY29kZWQgZXJyb3IgcHJvcGVydGllcyAke3Eob3duS2V5cyhyZXN0KSl9YDtcbi8qIFRPRE8gTXVzdCBkZWNvZGUgYGNhdXNlYCBhbmQgYGVycm9yc2AgcHJvcGVydGllcyovXG4vKiBjYXBEYXRhIGRvZXMgbm90IHRyYW5zZm9ybSBzdHJpbmdzLiBUaGUgY2FsbHMgdG8gYGRlY29kZVJlY3VyYCovXG4vKiBhcmUgZm9yIHJldXNlIGJ5IG90aGVyIGVuY29kaW5ncyB0aGF0IGRvLCBzdWNoIGFzIHNtYWxsY2Fwcy4qL1xuY29uc3QgZE5hbWU9ZGVjb2RlUmVjdXIobmFtZSk7XG5jb25zdCBkTWVzc2FnZT1kZWNvZGVSZWN1cihtZXNzYWdlKTtcbmNvbnN0IGRFcnJvcklkPWVycm9ySWQmJmRlY29kZVJlY3VyKGVycm9ySWQpO1xudHlwZW9mIGROYW1lPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBlcnJvciBuYW1lIHR5cGVvZiAke3EodHlwZW9mIGROYW1lKX1gO1xudHlwZW9mIGRNZXNzYWdlPT09J3N0cmluZyd8fFxuRmFpbCBgaW52YWxpZCBlcnJvciBtZXNzYWdlIHR5cGVvZiAke3EodHlwZW9mIGRNZXNzYWdlKX1gO1xuY29uc3QgRUM9Z2V0RXJyb3JDb25zdHJ1Y3RvcihkTmFtZSl8fEVycm9yO1xuLyogZXJyb3JJZCBpcyBhIGxhdGUgYWRkaXRpb24gc28gYmUgdG9sZXJhbnQgb2YgaXRzIGFic2VuY2UuKi9cbmNvbnN0IGVycm9yTmFtZT1cbmRFcnJvcklkPT09dW5kZWZpbmVkP1xuIGBSZW1vdGUke0VDLm5hbWV9YDpcbiBgUmVtb3RlJHtFQy5uYW1lfSgke2RFcnJvcklkfSlgO1xuY29uc3QgZXJyb3I9YXNzZXJ0LmVycm9yKGRNZXNzYWdlLEVDLHtlcnJvck5hbWV9KTtcbnJldHVybiBoYXJkZW4oZXJyb3IpO1xuIH07XG5cbi8qIFRoZSBjdXJyZW50IGVuY29kaW5nIGRvZXMgbm90IGdpdmUgdGhlIGRlY29kZXIgZW5vdWdoIGludG8gdG8gZGlzdGluZ3Vpc2gqL1xuLyogd2hldGhlciBhIHNsb3QgcmVwcmVzZW50cyBhIHByb21pc2Ugb3IgYSByZW1vdGFibGUuIEFzIGFuIGltcGxlbWVudGF0aW9uKi9cbi8qIHJlc3RyaWN0aW9uIHVudGlsIHRoaXMgaXMgZml4ZWQsIGlmIGVpdGhlciBpcyBwcm92aWRlZCwgYm90aCBtdXN0IGJlKi9cbi8qIHByb3ZpZGVkIGFuZCB0aGV5IG11c3QgYmUgdGhlIHNhbWUuKi9cbi8qIFNlZSBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQzMzQqL1xuY29uc3QgZGVjb2RlUmVtb3RhYmxlT3JQcm9taXNlRnJvbUNhcERhdGE9KHJhd1RyZWUsX2RlY29kZVJlY3VyKT0+e1xuY29uc3R7W1FDTEFTU106XywuLi5zbG90RGF0YX09cmF3VHJlZTtcbnJldHVybiBkZWNvZGVTbG90Q29tbW9uKHNsb3REYXRhKTtcbiB9O1xuXG5jb25zdCBkZWNvZGVFcnJvckZyb21DYXBEYXRhPShyYXdUcmVlLGRlY29kZVJlY3VyKT0+e1xuY29uc3R7W1FDTEFTU106XywuLi5lcnJEYXRhfT1yYXdUcmVlO1xucmV0dXJuIGRlY29kZUVycm9yQ29tbW9uKGVyckRhdGEsZGVjb2RlUmVjdXIpO1xuIH07XG5cbmNvbnN0IHJldml2ZUZyb21DYXBEYXRhPW1ha2VEZWNvZGVGcm9tQ2FwRGF0YSh7XG5kZWNvZGVSZW1vdGFibGVGcm9tQ2FwRGF0YTpkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbmRlY29kZVByb21pc2VGcm9tQ2FwRGF0YTpkZWNvZGVSZW1vdGFibGVPclByb21pc2VGcm9tQ2FwRGF0YSxcbmRlY29kZUVycm9yRnJvbUNhcERhdGF9KTtcblxuXG5jb25zdCBtYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHM9KHByZWZpeCk9PntcbnJldHVybihzdHJpbmdFbmNvZGluZyxfZGVjb2RlUmVjdXIpPT57XG5hc3NlcnQoc3RyaW5nRW5jb2Rpbmcuc3RhcnRzV2l0aChwcmVmaXgpKTtcbi8qIHNsb3RzOiAkc2xvdEluZGV4LmlmYWNlIG9yICRzbG90SW5kZXgqL1xuY29uc3QgaT1zdHJpbmdFbmNvZGluZy5pbmRleE9mKCcuJyk7XG5jb25zdCBpbmRleD1OdW1iZXIoc3RyaW5nRW5jb2Rpbmcuc2xpY2UoMSxpPDA/dW5kZWZpbmVkOmkpKTtcbi8qIGkgPCAwIG1lYW5zIHRoZXJlIHdhcyBubyBpZmFjZSBpbmNsdWRlZC4qL1xuY29uc3QgaWZhY2U9aTwwP3VuZGVmaW5lZDpzdHJpbmdFbmNvZGluZy5zbGljZShpKzEpO1xucmV0dXJuIGRlY29kZVNsb3RDb21tb24oe2lmYWNlLGluZGV4fSk7XG4gfTtcbiB9O1xuY29uc3QgZGVjb2RlUmVtb3RhYmxlRnJvbVNtYWxsY2Fwcz1tYWtlRGVjb2RlU2xvdEZyb21TbWFsbGNhcHMoJyQnKTtcbmNvbnN0IGRlY29kZVByb21pc2VGcm9tU21hbGxjYXBzPW1ha2VEZWNvZGVTbG90RnJvbVNtYWxsY2FwcygnJicpO1xuXG5jb25zdCBkZWNvZGVFcnJvckZyb21TbWFsbGNhcHM9KGVuY29kaW5nLGRlY29kZVJlY3VyKT0+e1xuY29uc3R7JyNlcnJvcic6bWVzc2FnZSwuLi5yZXN0RXJyRGF0YX09ZW5jb2Rpbmc7XG4haGFzT3duUHJvcGVydHlPZihyZXN0RXJyRGF0YSwnbWVzc2FnZScpfHxcbkZhaWwgYHVuZXhwZWN0ZWQgZW5jb2RlZCBlcnJvciBwcm9wZXJ0eSAke3EoJ21lc3NhZ2UnKX1gO1xucmV0dXJuIGRlY29kZUVycm9yQ29tbW9uKHttZXNzYWdlLC4uLnJlc3RFcnJEYXRhfSxkZWNvZGVSZWN1cik7XG4gfTtcblxuY29uc3QgcmV2aXZlRnJvbVNtYWxsY2Fwcz1tYWtlRGVjb2RlRnJvbVNtYWxsY2Fwcyh7XG5kZWNvZGVSZW1vdGFibGVGcm9tU21hbGxjYXBzLFxuZGVjb2RlUHJvbWlzZUZyb21TbWFsbGNhcHMsXG5kZWNvZGVFcnJvckZyb21TbWFsbGNhcHN9KTtcblxuXG5yZXR1cm4gaGFyZGVuKHtyZXZpdmVGcm9tQ2FwRGF0YSxyZXZpdmVGcm9tU21hbGxjYXBzfSk7XG4gfTtcblxuLyoqXG4gKiBAdHlwZSB7VW5zZXJpYWxpemU8U2xvdD59XG4gKi9cbmNvbnN0IHVuc2VyaWFsaXplPShkYXRhKT0+e1xuY29uc3R7Ym9keSxzbG90c309ZGF0YTtcbnR5cGVvZiBib2R5PT09J3N0cmluZyd8fFxuRmFpbCBgdW5zZXJpYWxpemUoKSBnaXZlbiBub24tY2FwZGF0YSAoLmJvZHkgaXMgJHtib2R5fSwgbm90IHN0cmluZylgO1xuaXNBcnJheShkYXRhLnNsb3RzKXx8XG5GYWlsIGB1bnNlcmlhbGl6ZSgpIGdpdmVuIG5vbi1jYXBkYXRhICguc2xvdHMgYXJlIG5vdCBBcnJheSlgO1xuY29uc3R7cmV2aXZlRnJvbUNhcERhdGEscmV2aXZlRnJvbVNtYWxsY2Fwc309bWFrZUZ1bGxSZXZpdmUoc2xvdHMpO1xubGV0IHJlc3VsdDtcbi8qIEpTT04gY2Fubm90IGJlZ2luIHdpdGggYSAnIycsIHNvIHRoaXMgaXMgYW4gdW5hbWJpZ3VvdXMgc2lnbmFsLiovXG5pZihib2R5LnN0YXJ0c1dpdGgoJyMnKSl7XG5jb25zdCBzbWFsbGNhcHNCb2R5PWJvZHkuc2xpY2UoMSk7XG5jb25zdCBlbmNvZGluZz1oYXJkZW4oSlNPTi5wYXJzZShzbWFsbGNhcHNCb2R5KSk7XG5yZXN1bHQ9aGFyZGVuKHJldml2ZUZyb21TbWFsbGNhcHMoZW5jb2RpbmcpKTtcbiB9ZWxzZXtcbmNvbnN0IHJhd1RyZWU9aGFyZGVuKEpTT04ucGFyc2UoYm9keSkpO1xucmVzdWx0PWhhcmRlbihyZXZpdmVGcm9tQ2FwRGF0YShyYXdUcmVlKSk7XG4gfVxuLyogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9BZ29yaWMvYWdvcmljLXNkay9pc3N1ZXMvNDMzNyovXG4vKiB3aGljaCBzaG91bGQgYmUgY29uc2lkZXJlZCBmaXhlZCBvbmNlIHdlJ3ZlIGNvbXBsZXRlZCB0aGUgc3dpdGNoKi9cbi8qIHRvIHNtYWxsY2Fwcy4qL1xuYXNzZXJ0UGFzc2FibGUocmVzdWx0KTtcbnJldHVybiByZXN1bHQ7XG4gfTtcblxucmV0dXJuIGhhcmRlbih7XG5zZXJpYWxpemUsXG51bnNlcmlhbGl6ZX0pO1xuXG4gfTskaOKAjV9vbmNlLm1ha2VNYXJzaGFsKG1ha2VNYXJzaGFsKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlTWFyc2hhbCI6WyJtYWtlTWFyc2hhbCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABBZ7N5AhwAAAIcAAAnAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL3Bhc3NTdHlsZU9mLmpzeyJpbXBvcnRzIjpbIi4vaGVscGVycy9jb3B5QXJyYXkuanMiLCIuL2hlbHBlcnMvY29weVJlY29yZC5qcyIsIi4vaGVscGVycy9lcnJvci5qcyIsIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qcyIsIi4vaGVscGVycy9yZW1vdGFibGUuanMiLCIuL2hlbHBlcnMvc2FmZS1wcm9taXNlLmpzIiwiLi9oZWxwZXJzL3N5bWJvbC5qcyIsIi4vaGVscGVycy90YWdnZWQuanMiLCJAZW5kby9wcm9taXNlLWtpdCJdLCJleHBvcnRzIjpbImFzc2VydFBhc3NhYmxlIiwicGFzc1N0eWxlT2YiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgaXNQcm9taXNlLGlzT2JqZWN0LGlzVHlwZWRBcnJheSxQQVNTX1NUWUxFLENvcHlBcnJheUhlbHBlcixDb3B5UmVjb3JkSGVscGVyLFRhZ2dlZEhlbHBlcixFcnJvckhlbHBlcixSZW1vdGFibGVIZWxwZXIsYXNzZXJ0UGFzc2FibGVTeW1ib2wsYXNzZXJ0U2FmZVByb21pc2U7JGjigI1faW1wb3J0cyhbW1wiQGVuZG8vcHJvbWlzZS1raXRcIiwgW1tcImlzUHJvbWlzZVwiLCBbJGjigI1fYSA9PiAoaXNQcm9taXNlID0gJGjigI1fYSldXV1dLFtcIi4vaGVscGVycy9wYXNzU3R5bGUtaGVscGVycy5qc1wiLCBbW1wiaXNPYmplY3RcIiwgWyRo4oCNX2EgPT4gKGlzT2JqZWN0ID0gJGjigI1fYSldXSxbXCJpc1R5cGVkQXJyYXlcIiwgWyRo4oCNX2EgPT4gKGlzVHlwZWRBcnJheSA9ICRo4oCNX2EpXV0sW1wiUEFTU19TVFlMRVwiLCBbJGjigI1fYSA9PiAoUEFTU19TVFlMRSA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvY29weUFycmF5LmpzXCIsIFtbXCJDb3B5QXJyYXlIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKENvcHlBcnJheUhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvY29weVJlY29yZC5qc1wiLCBbW1wiQ29weVJlY29yZEhlbHBlclwiLCBbJGjigI1fYSA9PiAoQ29weVJlY29yZEhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvdGFnZ2VkLmpzXCIsIFtbXCJUYWdnZWRIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKFRhZ2dlZEhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvZXJyb3IuanNcIiwgW1tcIkVycm9ySGVscGVyXCIsIFskaOKAjV9hID0+IChFcnJvckhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvcmVtb3RhYmxlLmpzXCIsIFtbXCJSZW1vdGFibGVIZWxwZXJcIiwgWyRo4oCNX2EgPT4gKFJlbW90YWJsZUhlbHBlciA9ICRo4oCNX2EpXV1dXSxbXCIuL2hlbHBlcnMvc3ltYm9sLmpzXCIsIFtbXCJhc3NlcnRQYXNzYWJsZVN5bWJvbFwiLCBbJGjigI1fYSA9PiAoYXNzZXJ0UGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3NhZmUtcHJvbWlzZS5qc1wiLCBbW1wiYXNzZXJ0U2FmZVByb21pc2VcIiwgWyRo4oCNX2EgPT4gKGFzc2VydFNhZmVQcm9taXNlID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi9oZWxwZXJzL2ludGVybmFsLXR5cGVzLmpzJykuUGFzc1N0eWxlSGVscGVyfSBQYXNzU3R5bGVIZWxwZXIgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NhYmxlfSBQYXNzYWJsZSAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUGFzc1N0eWxlfSBQYXNzU3R5bGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NTdHlsZU9mfSBQYXNzU3R5bGVPZiAqL1xuLyoqIEB0eXBlZGVmIHtYaW1wb3J0KCcuL3R5cGVzLmpzJykuUHJpbWl0aXZlU3R5bGV9IFByaW1pdGl2ZVN0eWxlICovXG5cbi8qKiBAdHlwZWRlZiB7RXhjbHVkZTxQYXNzU3R5bGUsIFByaW1pdGl2ZVN0eWxlIHwgXCJwcm9taXNlXCI+fSBIZWxwZXJQYXNzU3R5bGUgKi9cblxuY29uc3R7ZGV0YWlsczpYLEZhaWwscXVvdGU6cX09YXNzZXJ0O1xuY29uc3R7b3duS2V5c309UmVmbGVjdDtcbmNvbnN0e2lzRnJvemVufT1PYmplY3Q7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzU3R5bGVIZWxwZXJbXX0gcGFzc1N0eWxlSGVscGVyc1xuICogQHJldHVybnMge1JlY29yZDxIZWxwZXJQYXNzU3R5bGUsIFBhc3NTdHlsZUhlbHBlcj4gfVxuICovXG5cbmNvbnN0IG1ha2VIZWxwZXJUYWJsZT0ocGFzc1N0eWxlSGVscGVycyk9Pntcbi8qKiBAdHlwZSB7UmVjb3JkPEhlbHBlclBhc3NTdHlsZSwgYW55PiAmIHtfX3Byb3RvX186IG51bGx9fSAqL1xuY29uc3QgSGVscGVyVGFibGU9e1xuX19wcm90b19fOm51bGwsXG5jb3B5QXJyYXk6dW5kZWZpbmVkLFxuY29weVJlY29yZDp1bmRlZmluZWQsXG50YWdnZWQ6dW5kZWZpbmVkLFxuZXJyb3I6dW5kZWZpbmVkLFxucmVtb3RhYmxlOnVuZGVmaW5lZH07XG5cbmZvcihjb25zdCBoZWxwZXIgb2YgcGFzc1N0eWxlSGVscGVycyl7XG5jb25zdHtzdHlsZU5hbWV9PWhlbHBlcjtcbnN0eWxlTmFtZSBpbiBIZWxwZXJUYWJsZXx8RmFpbCBgVW5yZWNvZ25pemVkIGhlbHBlcjogJHtxKHN0eWxlTmFtZSl9YDtcbkhlbHBlclRhYmxlW3N0eWxlTmFtZV09PT11bmRlZmluZWR8fFxuRmFpbCBgY29uZmxpY3RpbmcgaGVscGVycyBmb3IgJHtxKHN0eWxlTmFtZSl9YDtcbkhlbHBlclRhYmxlW3N0eWxlTmFtZV09aGVscGVyO1xuIH1cbmZvcihjb25zdCBzdHlsZU5hbWUgb2Ygb3duS2V5cyhIZWxwZXJUYWJsZSkpe1xuSGVscGVyVGFibGVbc3R5bGVOYW1lXSE9PXVuZGVmaW5lZHx8XG5GYWlsIGBtaXNzaW5nIGhlbHBlciBmb3IgJHtxKHN0eWxlTmFtZSl9YDtcbiB9XG5cbnJldHVybiBoYXJkZW4oSGVscGVyVGFibGUpO1xuIH07XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzU3R5bGVIZWxwZXJbXX0gcGFzc1N0eWxlSGVscGVycyBUaGUgcGFzc1N0eWxlSGVscGVycyB0byByZWdpc3RlcixcbiAqIGluIHByaW9yaXR5IG9yZGVyLlxuICogTk9URSBUaGVzZSBtdXN0IGFsbCBiZSBcInRydXN0ZWRcIixcbiAqIGNvbXBsZXRlLCBhbmQgbm9uLWNvbGxpZGluZy4gYG1ha2VQYXNzU3R5bGVPZmAgbWF5ICphc3N1bWUqIHRoYXQgZWFjaCBoZWxwZXJcbiAqIGRvZXMgd2hhdCBpdCBpcyBzdXBwb3NlZCB0byBkby4gYG1ha2VQYXNzU3R5bGVPZmAgaXMgbm90IHRyeWluZyB0byBkZWZlbmRcbiAqIGl0c2VsZiBhZ2FpbnN0IG1hbGljaW91cyBoZWxwZXJzLCB0aG91Z2ggaXQgZG9lcyBkZWZlbmQgYWdhaW5zdCBzb21lXG4gKiBhY2NpZGVudHMuXG4gKiBAcmV0dXJucyB7UGFzc1N0eWxlT2Z9XG4gKi9cbmNvbnN0IG1ha2VQYXNzU3R5bGVPZj0ocGFzc1N0eWxlSGVscGVycyk9PntcbmNvbnN0IEhlbHBlclRhYmxlPW1ha2VIZWxwZXJUYWJsZShwYXNzU3R5bGVIZWxwZXJzKTtcbmNvbnN0IHJlbW90YWJsZUhlbHBlcj1IZWxwZXJUYWJsZS5yZW1vdGFibGU7XG5cbi8qKlxuICogUHVyZWx5IGZvciBwZXJmb3JtYW5jZS4gSG93ZXZlciBpdCBpcyBtdXRhYmxlIHN0YXRpYyBzdGF0ZSwgYW5kXG4gKiBpdCBkb2VzIGhhdmUgc29tZSBvYnNlcnZhYmlsaXR5IG9uIHByb3hpZXMuIFRPRE8gbmVlZCB0byBhc3Nlc3NcbiAqIHdoZXRoZXIgdGhpcyBjcmVhdGVzIGEgc3RhdGljIGNvbW11bmljYXRpb25zIGNoYW5uZWwuXG4gKlxuICogcGFzc1N0eWxlT2YgZG9lcyBhIGZ1bGwgcmVjdXJzaXZlIHdhbGsgb2YgcGFzcy1ieS1jb3B5XG4gKiBzdHJ1Y3R1cmVzLCBpbiBvcmRlciB0byB2YWxpZGF0ZSB0aGF0IHRoZXkgYXJlIGFjeWNsaWMuIEluIGFkZGl0aW9uXG4gKiBpdCBpcyB1c2VkIGJ5IG90aGVyIGFsZ29yaXRobXMgdG8gcmVjdXJzaXZlbHkgd2FsayB0aGVzZSBwYXNzLWJ5LWNvcHlcbiAqIHN0cnVjdHVyZXMsIHNvIHdpdGhvdXQgdGhpcyBjYWNoZSwgdGhlc2UgYWxnb3JpdGhtcyBjb3VsZCBiZVxuICogTyhOKioyKSBvciB3b3JzZS5cbiAqXG4gKiBAdHlwZSB7V2Vha01hcDxQYXNzYWJsZSwgUGFzc1N0eWxlPn1cbiAqL1xuY29uc3QgcGFzc1N0eWxlTWVtbz1uZXcgV2Vha01hcCgpO1xuXG4vKipcbiAqIEB0eXBlIHtQYXNzU3R5bGVPZn1cbiAqL1xuY29uc3QgcGFzc1N0eWxlT2Y9KHBhc3NhYmxlKT0+e1xuLyogRXZlbiB3aGVuIGEgV2Vha1NldCBpcyBjb3JyZWN0LCB3aGVuIHRoZSBzZXQgaGFzIGEgc2hvcnRlciBsaWZldGltZSovXG4vKiB0aGFuIGl0cyBrZXlzLCB3ZSBwcmVmZXIgYSBTZXQgZHVlIHRvIGV4cGVjdGVkIGltcGxlbWVudGF0aW9uKi9cbi8qIHRyYWRlb2Zmcy4qL1xuY29uc3QgaW5Qcm9ncmVzcz1uZXcgU2V0KCk7XG5cbi8qKlxuICogQHR5cGUge1Bhc3NTdHlsZU9mfVxuICovXG5jb25zdCBwYXNzU3R5bGVPZlJlY3VyPShpbm5lcik9PntcbmNvbnN0IGlubmVySXNPYmplY3Q9aXNPYmplY3QoaW5uZXIpO1xuaWYoaW5uZXJJc09iamVjdCl7XG5pZihwYXNzU3R5bGVNZW1vLmhhcyhpbm5lcikpe1xuLyogQHRzLWlnbm9yZSBUeXBlU2NyaXB0IGRvZXNuJ3Qga25vdyB0aGF0IGBnZXRgIGFmdGVyIGBoYXNgIGlzIHNhZmUqL1xucmV0dXJuIHBhc3NTdHlsZU1lbW8uZ2V0KGlubmVyKTtcbiB9XG4haW5Qcm9ncmVzcy5oYXMoaW5uZXIpfHxcbkZhaWwgYFBhc3MtYnktY29weSBkYXRhIGNhbm5vdCBiZSBjeWNsaWMgJHtpbm5lcn1gO1xuaW5Qcm9ncmVzcy5hZGQoaW5uZXIpO1xuIH1cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2UtYmVmb3JlLWRlZmluZSovXG5jb25zdCBwYXNzU3R5bGU9cGFzc1N0eWxlT2ZJbnRlcm5hbChpbm5lcik7XG5pZihpbm5lcklzT2JqZWN0KXtcbnBhc3NTdHlsZU1lbW8uc2V0KGlubmVyLHBhc3NTdHlsZSk7XG5pblByb2dyZXNzLmRlbGV0ZShpbm5lcik7XG4gfVxucmV0dXJuIHBhc3NTdHlsZTtcbiB9O1xuXG4vKipcbiAqIEB0eXBlIHtQYXNzU3R5bGVPZn1cbiAqL1xuY29uc3QgcGFzc1N0eWxlT2ZJbnRlcm5hbD0oaW5uZXIpPT57XG5jb25zdCB0eXBlc3RyPXR5cGVvZiBpbm5lcjtcbnN3aXRjaCh0eXBlc3RyKXtcbmNhc2UndW5kZWZpbmVkJzpcbmNhc2Unc3RyaW5nJzpcbmNhc2UnYm9vbGVhbic6XG5jYXNlJ251bWJlcic6XG5jYXNlJ2JpZ2ludCc6e1xucmV0dXJuIHR5cGVzdHI7XG4gfVxuY2FzZSdzeW1ib2wnOntcbmFzc2VydFBhc3NhYmxlU3ltYm9sKGlubmVyKTtcbnJldHVybidzeW1ib2wnO1xuIH1cbmNhc2Unb2JqZWN0Jzp7XG5pZihpbm5lcj09PW51bGwpe1xucmV0dXJuJ251bGwnO1xuIH1cbmlmKCFpc0Zyb3plbihpbm5lcikpe1xuYXNzZXJ0LmZhaWwoXG4vKiBUeXBlZEFycmF5cyBnZXQgc3BlY2lhbCB0cmVhdG1lbnQgaW4gaGFyZGVuKCkqL1xuLyogYW5kIGEgY29ycmVzcG9uZGluZyBzcGVjaWFsIGVycm9yIG1lc3NhZ2UgaGVyZS4qL1xuaXNUeXBlZEFycmF5KGlubmVyKT9cblggYENhbm5vdCBwYXNzIG11dGFibGUgdHlwZWQgYXJyYXlzIGxpa2UgJHtpbm5lcn0uYDpcblggYENhbm5vdCBwYXNzIG5vbi1mcm96ZW4gb2JqZWN0cyBsaWtlICR7aW5uZXJ9LiBVc2UgaGFyZGVuKClgKTtcblxuIH1cbmlmKGlzUHJvbWlzZShpbm5lcikpe1xuYXNzZXJ0U2FmZVByb21pc2UoaW5uZXIpO1xucmV0dXJuJ3Byb21pc2UnO1xuIH1cbnR5cGVvZiBpbm5lci50aGVuIT09J2Z1bmN0aW9uJ3x8XG5GYWlsIGBDYW5ub3QgcGFzcyBub24tcHJvbWlzZSB0aGVuYWJsZXNgO1xuY29uc3QgcGFzc1N0eWxlVGFnPWlubmVyW1BBU1NfU1RZTEVdO1xuaWYocGFzc1N0eWxlVGFnIT09dW5kZWZpbmVkKXtcbmFzc2VydC50eXBlb2YocGFzc1N0eWxlVGFnLCdzdHJpbmcnKTtcbmNvbnN0IGhlbHBlcj1IZWxwZXJUYWJsZVtwYXNzU3R5bGVUYWddO1xuaGVscGVyIT09dW5kZWZpbmVkfHxcbkZhaWwgYFVucmVjb2duaXplZCBQYXNzU3R5bGU6ICR7cShwYXNzU3R5bGVUYWcpfWA7XG5oZWxwZXIuYXNzZXJ0VmFsaWQoaW5uZXIscGFzc1N0eWxlT2ZSZWN1cik7XG5yZXR1cm4gKC8qKiBAdHlwZSB7UGFzc1N0eWxlfSAqL3Bhc3NTdHlsZVRhZyk7XG4gfVxuZm9yKGNvbnN0IGhlbHBlciBvZiBwYXNzU3R5bGVIZWxwZXJzKXtcbmlmKGhlbHBlci5jYW5CZVZhbGlkKGlubmVyKSl7XG5oZWxwZXIuYXNzZXJ0VmFsaWQoaW5uZXIscGFzc1N0eWxlT2ZSZWN1cik7XG5yZXR1cm4gaGVscGVyLnN0eWxlTmFtZTtcbiB9XG4gfVxucmVtb3RhYmxlSGVscGVyLmFzc2VydFZhbGlkKGlubmVyLHBhc3NTdHlsZU9mUmVjdXIpO1xucmV0dXJuJ3JlbW90YWJsZSc7XG4gfVxuY2FzZSdmdW5jdGlvbic6e1xuaXNGcm96ZW4oaW5uZXIpfHxcbkZhaWwgYENhbm5vdCBwYXNzIG5vbi1mcm96ZW4gb2JqZWN0cyBsaWtlICR7aW5uZXJ9LiBVc2UgaGFyZGVuKClgO1xudHlwZW9mIGlubmVyLnRoZW4hPT0nZnVuY3Rpb24nfHxcbkZhaWwgYENhbm5vdCBwYXNzIG5vbi1wcm9taXNlIHRoZW5hYmxlc2A7XG5yZW1vdGFibGVIZWxwZXIuYXNzZXJ0VmFsaWQoaW5uZXIscGFzc1N0eWxlT2ZSZWN1cik7XG5yZXR1cm4ncmVtb3RhYmxlJztcbiB9XG5kZWZhdWx0OntcbmFzc2VydC5mYWlsKFggYFVucmVjb2duaXplZCB0eXBlb2YgJHtxKHR5cGVzdHIpfWAsVHlwZUVycm9yKTtcbiB9fVxuXG4gfTtcblxucmV0dXJuIHBhc3NTdHlsZU9mUmVjdXIocGFzc2FibGUpO1xuIH07XG5yZXR1cm4gaGFyZGVuKHBhc3NTdHlsZU9mKTtcbiB9O1xuXG5jb25zdCAgICAgICAgcGFzc1N0eWxlT2Y9bWFrZVBhc3NTdHlsZU9mKFtcbkNvcHlBcnJheUhlbHBlcixcbkNvcHlSZWNvcmRIZWxwZXIsXG5UYWdnZWRIZWxwZXIsXG5FcnJvckhlbHBlcixcblJlbW90YWJsZUhlbHBlcl0pOyRo4oCNX29uY2UucGFzc1N0eWxlT2YocGFzc1N0eWxlT2YpO1xuXG5cbmNvbnN0ICAgICAgICBhc3NlcnRQYXNzYWJsZT0odmFsKT0+e1xucGFzc1N0eWxlT2YodmFsKTsvKiB0aHJvd3MgaWYgdmFsIGlzIG5vdCBhIHBhc3NhYmxlKi9cbiB9OyRo4oCNX29uY2UuYXNzZXJ0UGFzc2FibGUoYXNzZXJ0UGFzc2FibGUpO1xuaGFyZGVuKGFzc2VydFBhc3NhYmxlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJwYXNzU3R5bGVPZiI6WyJwYXNzU3R5bGVPZiJdLCJhc3NlcnRQYXNzYWJsZSI6WyJhc3NlcnRQYXNzYWJsZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAABYoj/ms0kAALNJAAAlAAAAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL3JhbmtPcmRlci5qc3siaW1wb3J0cyI6WyIuL2VuY29kZVBhc3NhYmxlLmpzIiwiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzIiwiLi9oZWxwZXJzL3N5bWJvbC5qcyIsIi4vcGFzc1N0eWxlT2YuanMiXSwiZXhwb3J0cyI6WyJGdWxsUmFua0NvdmVyIiwiYXNzZXJ0UmFua1NvcnRlZCIsImNvbXBhcmF0b3JNaXJyb3JJbWFnZSIsImNvbXBhcmVBbnRpUmFuayIsImNvbXBhcmVSYW5rIiwiY292ZXJlZEVudHJpZXMiLCJnZXRJbmRleENvdmVyIiwiZ2V0UGFzc1N0eWxlQ292ZXIiLCJpbnRlcnNlY3RSYW5rQ292ZXJzIiwiaXNSYW5rU29ydGVkIiwibWFrZUNvbXBhcmF0b3JLaXQiLCJtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdCIsInNvcnRCeVJhbmsiLCJ1bmlvblJhbmtDb3ZlcnMiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgZ2V0VGFnLHBhc3NTdHlsZU9mLG5hbWVGb3JQYXNzYWJsZVN5bWJvbCxwYXNzU3R5bGVQcmVmaXhlcyxyZWNvcmROYW1lcyxyZWNvcmRWYWx1ZXM7JGjigI1faW1wb3J0cyhbW1wiLi9oZWxwZXJzL3Bhc3NTdHlsZS1oZWxwZXJzLmpzXCIsIFtbXCJnZXRUYWdcIiwgWyRo4oCNX2EgPT4gKGdldFRhZyA9ICRo4oCNX2EpXV1dXSxbXCIuL3Bhc3NTdHlsZU9mLmpzXCIsIFtbXCJwYXNzU3R5bGVPZlwiLCBbJGjigI1fYSA9PiAocGFzc1N0eWxlT2YgPSAkaOKAjV9hKV1dXV0sW1wiLi9oZWxwZXJzL3N5bWJvbC5qc1wiLCBbW1wibmFtZUZvclBhc3NhYmxlU3ltYm9sXCIsIFskaOKAjV9hID0+IChuYW1lRm9yUGFzc2FibGVTeW1ib2wgPSAkaOKAjV9hKV1dXV0sW1wiLi9lbmNvZGVQYXNzYWJsZS5qc1wiLCBbW1wicGFzc1N0eWxlUHJlZml4ZXNcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZVByZWZpeGVzID0gJGjigI1fYSldXSxbXCJyZWNvcmROYW1lc1wiLCBbJGjigI1fYSA9PiAocmVjb3JkTmFtZXMgPSAkaOKAjV9hKV1dLFtcInJlY29yZFZhbHVlc1wiLCBbJGjigI1fYSA9PiAocmVjb3JkVmFsdWVzID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG5cblxuXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLlBhc3NTdHlsZX0gUGFzc1N0eWxlICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5SYW5rQ292ZXJ9IFJhbmtDb3ZlciAqL1xuXG5jb25zdHtGYWlsLHF1b3RlOnF9PWFzc2VydDtcbmNvbnN0e2VudHJpZXMsZnJvbUVudHJpZXMsc2V0UHJvdG90eXBlT2YsaXN9PU9iamVjdDtcblxuLyoqXG4gKiBAdHlwZWRlZiB7LTEgfCAwIHwgMX0gUmFua0NvbXBhcmlzb25cbiAqIFRoZSByZXN1bHQgb2YgYSBgUmFua0NvbXBhcmVgIGZ1bmN0aW9uIHRoYXQgZGVmaW5lcyBhIHJhbmstb3JkZXIsIGkuZS4sXG4gKiBhIHRvdGFsIHByZW9yZGVyIGluIHdoaWNoIGRpZmZlcmVudCBlbGVtZW50cyBhcmUgYWx3YXlzIGNvbXBhcmFibGUgYnV0XG4gKiBjYW4gYmUgdGllZCBmb3IgdGhlIHNhbWUgcmFuay4gU2VlIGBSYW5rQ29tcGFyZWAuXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgUmFua0NvbXBhcmVcbiAqIFJldHVybnMgYC0xYCwgYDBgLCBvciBgMWAgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIHJhbmsgb2YgYGxlZnRgXG4gKiBpcyByZXNwZWN0aXZlbHkgYmVmb3JlLCB0aWVkLXdpdGgsIG9yIGFmdGVyIHRoZSByYW5rIG9mIGByaWdodGAuXG4gKlxuICogVGhpcyBjb21wYXJpc29uIGZ1bmN0aW9uIGlzIHZhbGlkIGFzIGFyZ3VtZW50IHRvXG4gKiBgQXJyYXkucHJvdG90eXBlLnNvcnRgLiBUaGlzIGlzIHNvbWV0aW1lcyBkZXNjcmliZWQgYXMgYSBcInRvdGFsIG9yZGVyXCJcbiAqIGJ1dCwgZGVwZW5kaW5nIG9uIHlvdXIgZGVmaW5pdGlvbnMsIHRoaXMgaXMgdGVjaG5pY2FsbHkgaW5jb3JyZWN0IGJlY2F1c2VcbiAqIGl0IG1heSByZXR1cm4gYDBgIHRvIGluZGljYXRlIHRoYXQgdHdvIGRpc3Rpbmd1aXNoYWJsZSBlbGVtZW50cyBzdWNoIGFzXG4gKiBgLTBgIGFuZCBgMGAgYXJlIHRpZWQgKGkuZS4sIGFyZSBpbiB0aGUgc2FtZSBlcXVpdmFsZW5jZSBjbGFzc1xuICogZm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIG9yZGVyaW5nKS4gSWYgZWFjaCBzdWNoIGVxdWl2YWxlbmNlIGNsYXNzIGlzXG4gKiBhICpyYW5rKiBhbmQgcmFua3MgYXJlIGRpc2pvaW50LCB0aGVuIHRoaXMgXCJyYW5rIG9yZGVyXCIgaXMgYVxuICogdHJ1ZSB0b3RhbCBvcmRlciBvdmVyIHRoZXNlIHJhbmtzLiBJbiBtYXRoZW1hdGljcyB0aGlzIGdvZXMgYnkgc2V2ZXJhbFxuICogb3RoZXIgbmFtZXMgc3VjaCBhcyBcInRvdGFsIHByZW9yZGVyXCIuXG4gKlxuICogVGhpcyBmdW5jdGlvbiBlc3RhYmxpc2hlcyBhIHRvdGFsIHJhbmsgb3JkZXIgb3ZlciBhbGwgcGFzc2FibGVzLlxuICogVG8gZG8gc28gaXQgbWFrZXMgYXJiaXRyYXJ5IGNob2ljZXMsIHN1Y2ggYXMgdGhhdCBhbGwgc3RyaW5nc1xuICogYXJlIGFmdGVyIGFsbCBudW1iZXJzLiBUaHVzLCB0aGlzIG9yZGVyIGlzIG5vdCBpbnRlbmRlZCB0byBiZVxuICogdXNlZCBkaXJlY3RseSBhcyBhIGNvbXBhcmlzb24gd2l0aCB1c2VmdWwgc2VtYW50aWNzLiBIb3dldmVyLCBpdCBtdXN0IGJlXG4gKiBjbG9zZWx5IGVub3VnaCByZWxhdGVkIHRvIHN1Y2ggY29tcGFyaXNvbnMgdG8gYWlkIGluIGltcGxlbWVudGluZ1xuICogbG9va3VwcyBiYXNlZCBvbiB0aG9zZSBjb21wYXJpc29ucy4gRm9yIGV4YW1wbGUsIGluIG9yZGVyIHRvIGdldCBhIHRvdGFsXG4gKiBvcmRlciBhbW9uZyByYW5rcywgd2UgcHV0IGBOYU5gIGFmdGVyIGFsbCBvdGhlciBKYXZhU2NyaXB0IFwibnVtYmVyXCIgdmFsdWVzXG4gKiAoaS5lLiwgSUVFRSA3NTQgZmxvYXRpbmctcG9pbnQgdmFsdWVzKS4gQnV0IG90aGVyd2lzZSwgd2UgcmFuayBKYXZhU2NyaXB0XG4gKiBudW1iZXJzIGJ5IHNpZ25lZCBtYWduaXR1ZGUsIHdpdGggYDBgIGFuZCBgLTBgIHRpZWQuIEEgc2VtYW50aWNhbGx5IHVzZWZ1bFxuICogb3JkZXJpbmcgd291bGQgYWxzbyBjb21wYXJlIG1hZ25pdHVkZXMsIGFuZCBzbyBhZ3JlZSB3aXRoIHRoZSByYW5rIG9yZGVyaW5nXG4gKiBvZiBhbGwgdmFsdWVzIG90aGVyIHRoYW4gYE5hTmAuIEFuIGFycmF5IHNvcnRlZCBieSByYW5rIHdvdWxkIGVuYWJsZSByYW5nZVxuICogcXVlcmllcyBieSBtYWduaXR1ZGUuXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBsZWZ0XG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSByaWdodFxuICogQHJldHVybnMge1JhbmtDb21wYXJpc29ufVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge29iamVjdH0gUmFua0NvbXBhcmF0b3JLaXRcbiAqIEBwcm9wZXJ0eSB7UmFua0NvbXBhcmV9IGNvbXBhcmF0b3JcbiAqIEBwcm9wZXJ0eSB7UmFua0NvbXBhcmV9IGFudGlDb21wYXJhdG9yXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UmFua0NvbXBhcmV9IEZ1bGxDb21wYXJlXG4gKiBBIGBGdWxsQ29tcGFyZWAgZnVuY3Rpb24gc2F0aXNmaWVzIGFsbCB0aGUgaW52YXJpYW50cyBzdGF0ZWQgYmVsb3cgZm9yXG4gKiBgUmFua0NvbXBhcmVgJ3MgcmVsYXRpb24gd2l0aCBLZXlDb21wYXJlLlxuICogSW4gYWRkaXRpb24sIGl0cyBlcXVhbGl0eSBpcyBhcyBwcmVjaXNlIGFzIHRoZSBgS2V5Q29tcGFyZWBcbiAqIGNvbXBhcmlzb24gZGVmaW5lZCBiZWxvdywgaW4gdGhhdCwgZm9yIGFsbCBLZXlzIGB4YCBhbmQgYHlgLFxuICogYEZ1bGxDb21wYXJlKHgsIHkpID09PSAwYCBpZmYgYEtleUNvbXBhcmUoeCwgeSkgPT09IDBgLlxuICpcbiAqIEZvciBub24ta2V5cyBhIGBGdWxsQ29tcGFyZWAgc2hvdWxkIGJlIGV4YWN0bHkgYXMgaW1wcmVjaXNlIGFzXG4gKiBgUmFua0NvbXBhcmVgLiBGb3IgZXhhbXBsZSwgYm90aCB3aWxsIHRyZWF0IGFsbCBlcnJvcnMgYXMgaW4gdGhlIHNhbWVcbiAqIGVxdWl2YWxlbmNlIGNsYXNzLiBCb3RoIHdpbGwgdHJlYXQgYWxsIHByb21pc2VzIGFzIGluIHRoZSBzYW1lXG4gKiBlcXVpdmFsZW5jZSBjbGFzcy4gQm90aCB3aWxsIG9yZGVyIHRhZ2dlZHMgdGhlIHNhbWUgd2F5LCB3aGljaCBpcyBhZG1pdHRlZGx5XG4gKiB3ZWlyZCwgYXMgc29tZSB0YWdnZWRzIHdpbGwgYmUgY29uc2lkZXJlZCBrZXlzIGFuZCBvdGhlciB0YWdnZWRzIHdpbGwgYmVcbiAqIGNvbnNpZGVyZWQgbm9uLWtleXMuXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7b2JqZWN0fSBGdWxsQ29tcGFyYXRvcktpdFxuICogQHByb3BlcnR5IHtGdWxsQ29tcGFyZX0gY29tcGFyYXRvclxuICogQHByb3BlcnR5IHtGdWxsQ29tcGFyZX0gYW50aUNvbXBhcmF0b3JcbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtbbnVtYmVyLCBudW1iZXJdfSBJbmRleENvdmVyXG4gKi9cblxuLyoqXG4gKiBUaGlzIGlzIHRoZSBlcXVhbGl0eSBjb21wYXJpc29uIHVzZWQgYnkgSmF2YVNjcmlwdCdzIE1hcCBhbmQgU2V0XG4gKiBhYnN0cmFjdGlvbnMsIHdoZXJlIE5hTiBpcyB0aGUgc2FtZSBhcyBOYU4gYW5kIC0wIGlzIHRoZSBzYW1lIGFzXG4gKiAwLiBNYXJzaGFsIHNlcmlhbGl6ZXMgLTAgYXMgemVybywgc28gdGhlIHNlbWFudGljcyBvZiBvdXIgZGlzdHJpYnV0ZWRcbiAqIG9iamVjdCBzeXN0ZW0gZG9lcyBub3QgZGlzdGluZ3Vpc2ggMCBmcm9tIC0wLlxuICpcbiAqIGBzYW1lVmFsdWVaZXJvYCBpcyB0aGUgRWNtYVNjcmlwdCBzcGVjIG5hbWUgZm9yIHRoaXMgZXF1YWxpdHkgY29tcGFyaXNvbixcbiAqIGJ1dCBUT0RPIHdlIG5lZWQgYSBiZXR0ZXIgbmFtZSBmb3IgdGhlIEFQSS5cbiAqXG4gKiBAcGFyYW0ge2FueX0geFxuICogQHBhcmFtIHthbnl9IHlcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5jb25zdCBzYW1lVmFsdWVaZXJvPSh4LHkpPT54PT09eXx8aXMoeCx5KTtcblxuY29uc3QgdHJpdmlhbENvbXBhcmF0b3I9KGxlZnQscmlnaHQpPT5cbi8qIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXN0ZWQtdGVybmFyeSovXG5sZWZ0PHJpZ2h0Py0xOmxlZnQ9PT1yaWdodD8wOjE7XG5cbi8qKlxuICogQHR5cGVkZWYge1JlY29yZDxQYXNzU3R5bGUsIHsgaW5kZXg6IG51bWJlciwgY292ZXI6IFJhbmtDb3ZlciB9Pn0gUGFzc1N0eWxlUmFua3NSZWNvcmRcbiAqL1xuXG5jb25zdCBwYXNzU3R5bGVSYW5rcz0vKiogQHR5cGUge1Bhc3NTdHlsZVJhbmtzUmVjb3JkfSAqL2Zyb21FbnRyaWVzKFxuZW50cmllcyhwYXNzU3R5bGVQcmVmaXhlcylcbi8qIFNvcnQgZW50cmllcyBieSBhc2NlbmRpbmcgcHJlZml4LiovLlxuc29ydCgoW19sZWZ0U3R5bGUsbGVmdFByZWZpeGVzXSxbX3JpZ2h0U3R5bGUscmlnaHRQcmVmaXhlc10pPT57XG5yZXR1cm4gdHJpdmlhbENvbXBhcmF0b3IobGVmdFByZWZpeGVzLHJpZ2h0UHJlZml4ZXMpO1xuIH0pLlxubWFwKChbcGFzc1N0eWxlLHByZWZpeGVzXSxpbmRleCk9Pntcbi8qIENvdmVyIGFsbCBzdHJpbmdzIHRoYXQgc3RhcnQgd2l0aCBhbnkgY2hhcmFjdGVyIGluIGBwcmVmaXhlc2AuKi9cbi8qIGBwcmVmaXhlc2AgaXMgYWxyZWFkeSBzb3J0ZWQsIHNvIHRoYXQncyovXG4vKiBhbGwgcyBzdWNoIHRoYXQgcHJlZml4ZXMuYXQoMCkg4omkIHMgPCBzdWNjZXNzb3IocHJlZml4ZXMuYXQoLTEpKS4qL1xuY29uc3QgY292ZXI9W1xucHJlZml4ZXMuY2hhckF0KDApLFxuU3RyaW5nLmZyb21DaGFyQ29kZShwcmVmaXhlcy5jaGFyQ29kZUF0KHByZWZpeGVzLmxlbmd0aC0xKSsxKV07XG5cbnJldHVybltwYXNzU3R5bGUse2luZGV4LGNvdmVyfV07XG4gfSkpO1xuXG5zZXRQcm90b3R5cGVPZihwYXNzU3R5bGVSYW5rcyxudWxsKTtcbmhhcmRlbihwYXNzU3R5bGVSYW5rcyk7XG5cbi8qKlxuICogQXNzb2NpYXRlIHdpdGggZWFjaCBwYXNzU3R5bGUgYSBSYW5rQ292ZXIgdGhhdCBtYXkgYmUgYW4gb3ZlcmVzdGltYXRlLFxuICogYW5kIHdob3NlIHJlc3VsdHMgdGhlcmVmb3JlIG5lZWQgdG8gYmUgZmlsdGVyZWQgZG93bi4gRm9yIGV4YW1wbGUsIGJlY2F1c2VcbiAqIHRoZXJlIGlzIG5vdCBhIHNtYWxsZXN0IG9yIGJpZ2dlc3QgYmlnaW50LCBib3VuZCBpdCBieSBgTmFOYCAodGhlIGxhc3QgcGxhY2VcbiAqIG51bWJlcikgYW5kIGAnJ2AgKHRoZSBlbXB0eSBzdHJpbmcsIHdoaWNoIGlzIHRoZSBmaXJzdCBwbGFjZSBzdHJpbmcpLiBUaHVzLFxuICogYSByYW5nZSBxdWVyeSB1c2luZyB0aGlzIHJhbmdlIG1heSBpbmNsdWRlIHRoZXNlIHZhbHVlcywgd2hpY2ggd291bGQgdGhlblxuICogbmVlZCB0byBiZSBmaWx0ZXJlZCBvdXQuXG4gKlxuICogQHBhcmFtIHtQYXNzU3R5bGV9IHBhc3NTdHlsZVxuICogQHJldHVybnMge1JhbmtDb3Zlcn1cbiAqL1xuY29uc3QgICAgICAgIGdldFBhc3NTdHlsZUNvdmVyPShwYXNzU3R5bGUpPT5wYXNzU3R5bGVSYW5rc1twYXNzU3R5bGVdLmNvdmVyOyRo4oCNX29uY2UuZ2V0UGFzc1N0eWxlQ292ZXIoZ2V0UGFzc1N0eWxlQ292ZXIpO1xuaGFyZGVuKGdldFBhc3NTdHlsZUNvdmVyKTtcblxuLyoqXG4gKiBAdHlwZSB7V2Vha01hcDxSYW5rQ29tcGFyZSxXZWFrU2V0PFBhc3NhYmxlW10+Pn1cbiAqL1xuY29uc3QgbWVtb09mU29ydGVkPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHR5cGUge1dlYWtNYXA8UmFua0NvbXBhcmUsUmFua0NvbXBhcmU+fVxuICovXG5jb25zdCBjb21wYXJhdG9yTWlycm9ySW1hZ2VzPW5ldyBXZWFrTWFwKCk7XG5cbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZT19IGNvbXBhcmVSZW1vdGFibGVzXG4gKiBBbiBvcHRpb24gdG8gY3JlYXRlIGEgY29tcGFyYXRvciBpbiB3aGljaCBhbiBpbnRlcm5hbCBvcmRlciBpc1xuICogYXNzaWduZWQgdG8gcmVtb3RhYmxlcy4gVGhpcyBkZWZhdWx0cyB0byBhIGNvbXBhcmF0b3IgdGhhdFxuICogYWx3YXlzIHJldHVybnMgYDBgLCBtZWFuaW5nIHRoYXQgYWxsIHJlbW90YWJsZXMgYXJlIHRpZWRcbiAqIGZvciB0aGUgc2FtZSByYW5rLlxuICogQHJldHVybnMge1JhbmtDb21wYXJhdG9yS2l0fVxuICovXG5jb25zdCAgICAgICAgbWFrZUNvbXBhcmF0b3JLaXQ9KGNvbXBhcmVSZW1vdGFibGVzPShfeCxfeSk9PjApPT57XG4vKiogQHR5cGUge1JhbmtDb21wYXJlfSAqL1xuY29uc3QgY29tcGFyYXRvcj0obGVmdCxyaWdodCk9PntcbmlmKHNhbWVWYWx1ZVplcm8obGVmdCxyaWdodCkpe1xucmV0dXJuIDA7XG4gfVxuY29uc3QgbGVmdFN0eWxlPXBhc3NTdHlsZU9mKGxlZnQpO1xuY29uc3QgcmlnaHRTdHlsZT1wYXNzU3R5bGVPZihyaWdodCk7XG5pZihsZWZ0U3R5bGUhPT1yaWdodFN0eWxlKXtcbnJldHVybiB0cml2aWFsQ29tcGFyYXRvcihcbnBhc3NTdHlsZVJhbmtzW2xlZnRTdHlsZV0uaW5kZXgsXG5wYXNzU3R5bGVSYW5rc1tyaWdodFN0eWxlXS5pbmRleCk7XG5cbiB9XG5zd2l0Y2gobGVmdFN0eWxlKXtcbmNhc2UncmVtb3RhYmxlJzp7XG5yZXR1cm4gY29tcGFyZVJlbW90YWJsZXMobGVmdCxyaWdodCk7XG4gfVxuY2FzZSd1bmRlZmluZWQnOlxuY2FzZSdudWxsJzpcbmNhc2UnZXJyb3InOlxuY2FzZSdwcm9taXNlJzp7XG4vKiBGb3IgZWFjaCBvZiB0aGVzZSBwYXNzU3R5bGVzLCBhbGwgbWVtYmVycyBvZiB0aGF0IHBhc3NTdHlsZSBhcmUgdGllZCovXG4vKiBmb3IgdGhlIHNhbWUgcmFuay4qL1xucmV0dXJuIDA7XG4gfVxuY2FzZSdib29sZWFuJzpcbmNhc2UnYmlnaW50JzpcbmNhc2Unc3RyaW5nJzp7XG4vKiBXaXRoaW4gZWFjaCBvZiB0aGVzZSBwYXNzU3R5bGVzLCB0aGUgcmFuayBvcmRlcmluZyBhZ3JlZXMgd2l0aCovXG4vKiBKYXZhU2NyaXB0J3MgcmVsYXRpb25hbCBvcGVyYXRvcnMgYDxgIGFuZCBgPmAuKi9cbmlmKGxlZnQ8cmlnaHQpe1xucmV0dXJuLTE7XG4gfWVsc2V7XG5hc3NlcnQobGVmdD5yaWdodCk7XG5yZXR1cm4gMTtcbiB9XG4gfVxuY2FzZSdzeW1ib2wnOntcbnJldHVybiBjb21wYXJhdG9yKFxubmFtZUZvclBhc3NhYmxlU3ltYm9sKGxlZnQpLFxubmFtZUZvclBhc3NhYmxlU3ltYm9sKHJpZ2h0KSk7XG5cbiB9XG5jYXNlJ251bWJlcic6e1xuLyogYE5hTmAncyByYW5rIGlzIGFmdGVyIGFsbCBvdGhlciBudW1iZXJzLiovXG5pZihOdW1iZXIuaXNOYU4obGVmdCkpe1xuYXNzZXJ0KCFOdW1iZXIuaXNOYU4ocmlnaHQpKTtcbnJldHVybiAxO1xuIH1lbHNlIGlmKE51bWJlci5pc05hTihyaWdodCkpe1xucmV0dXJuLTE7XG4gfVxuLyogVGhlIHJhbmsgb3JkZXJpbmcgb2Ygbm9uLU5hTiBudW1iZXJzIGFncmVlcyB3aXRoIEphdmFTY3JpcHQncyovXG4vKiByZWxhdGlvbmFsIG9wZXJhdG9ycyAnPCcgYW5kICc+Jy4qL1xuaWYobGVmdDxyaWdodCl7XG5yZXR1cm4tMTtcbiB9ZWxzZXtcbmFzc2VydChsZWZ0PnJpZ2h0KTtcbnJldHVybiAxO1xuIH1cbiB9XG5jYXNlJ2NvcHlSZWNvcmQnOntcbi8qIExleGljb2dyYXBoaWMgYnkgaW52ZXJzZSBzb3J0ZWQgb3JkZXIgb2YgcHJvcGVydHkgbmFtZXMsIHRoZW4qL1xuLyogbGV4aWNvZ3JhcGhpYyBieSBjb3JyZXNwb25kaW5nIHZhbHVlcyBpbiB0aGF0IHNhbWUgaW52ZXJzZSovXG4vKiBvcmRlciBvZiB0aGVpciBwcm9wZXJ0eSBuYW1lcy4gQ29tcGFyaW5nIG5hbWVzIGJ5IHRoZW1zZWx2ZXMgZmlyc3QsKi9cbi8qIGFsbCByZWNvcmRzIHdpdGggdGhlIGV4YWN0IHNhbWUgc2V0IG9mIHByb3BlcnR5IG5hbWVzIHNvcnQgbmV4dCB0byovXG4vKiBlYWNoIG90aGVyIGluIGEgcmFuay1zb3J0IG9mIGNvcHlSZWNvcmRzLiovXG5cbi8qIFRoZSBjb3B5UmVjb3JkIGludmFyaWFudHMgZW5mb3JjZWQgYnkgcGFzc1N0eWxlT2YgZW5zdXJlIHRoYXQqL1xuLyogYWxsIHRoZSBwcm9wZXJ0eSBuYW1lcyBhcmUgc3RyaW5ncy4gV2UgbmVlZCB0aGUgcmV2ZXJzZSBzb3J0ZWQgb3JkZXIqL1xuLyogb2YgdGhlc2UgbmFtZXMsIHdoaWNoIHdlIHRoZW4gY29tcGFyZSBsZXhpY29ncmFwaGljYWxseS4gVGhpcyBlbnN1cmVzKi9cbi8qIHRoYXQgaWYgdGhlIG5hbWVzIG9mIHJlY29yZCBYIGFyZSBhIHN1YnNldCBvZiB0aGUgbmFtZXMgb2YgcmVjb3JkIFksKi9cbi8qIHRoZW4gcmVjb3JkIFggd2lsbCBoYXZlIGFuIGVhcmxpZXIgcmFuayBhbmQgc29ydCB0byB0aGUgbGVmdCBvZiBZLiovXG5jb25zdCBsZWZ0TmFtZXM9cmVjb3JkTmFtZXMobGVmdCk7XG5jb25zdCByaWdodE5hbWVzPXJlY29yZE5hbWVzKHJpZ2h0KTtcblxuY29uc3QgcmVzdWx0PWNvbXBhcmF0b3IobGVmdE5hbWVzLHJpZ2h0TmFtZXMpO1xuaWYocmVzdWx0IT09MCl7XG5yZXR1cm4gcmVzdWx0O1xuIH1cbnJldHVybiBjb21wYXJhdG9yKFxucmVjb3JkVmFsdWVzKGxlZnQsbGVmdE5hbWVzKSxcbnJlY29yZFZhbHVlcyhyaWdodCxyaWdodE5hbWVzKSk7XG5cbiB9XG5jYXNlJ2NvcHlBcnJheSc6e1xuLyogTGV4aWNvZ3JhcGhpYyovXG5jb25zdCBsZW49TWF0aC5taW4obGVmdC5sZW5ndGgscmlnaHQubGVuZ3RoKTtcbmZvcihsZXQgaT0wO2k8bGVuO2krPTEpe1xuY29uc3QgcmVzdWx0PWNvbXBhcmF0b3IobGVmdFtpXSxyaWdodFtpXSk7XG5pZihyZXN1bHQhPT0wKXtcbnJldHVybiByZXN1bHQ7XG4gfVxuIH1cbi8qIElmIGFsbCBtYXRjaGluZyBlbGVtZW50cyB3ZXJlIHRpZWQsIHRoZW4gYWNjb3JkaW5nIHRvIHRoZWlyIGxlbmd0aHMuKi9cbi8qIElmIGFycmF5IFggaXMgYSBwcmVmaXggb2YgYXJyYXkgWSwgdGhlbiBYIGhhcyBhbiBlYXJsaWVyIHJhbmsgdGhhbiBZLiovXG5yZXR1cm4gY29tcGFyYXRvcihsZWZ0Lmxlbmd0aCxyaWdodC5sZW5ndGgpO1xuIH1cbmNhc2UndGFnZ2VkJzp7XG4vKiBMZXhpY29ncmFwaGljIGJ5IGBbU3ltYm9sLnRvU3RyaW5nVGFnXWAgdGhlbiBgLnBheWxvYWRgLiovXG5jb25zdCBsYWJlbENvbXA9Y29tcGFyYXRvcihnZXRUYWcobGVmdCksZ2V0VGFnKHJpZ2h0KSk7XG5pZihsYWJlbENvbXAhPT0wKXtcbnJldHVybiBsYWJlbENvbXA7XG4gfVxucmV0dXJuIGNvbXBhcmF0b3IobGVmdC5wYXlsb2FkLHJpZ2h0LnBheWxvYWQpO1xuIH1cbmRlZmF1bHQ6e1xudGhyb3cgRmFpbCBgVW5yZWNvZ25pemVkIHBhc3NTdHlsZTogJHtxKGxlZnRTdHlsZSl9YDtcbiB9fVxuXG4gfTtcblxuLyoqIEB0eXBlIHtSYW5rQ29tcGFyZX0gKi9cbmNvbnN0IGFudGlDb21wYXJhdG9yPSh4LHkpPT5jb21wYXJhdG9yKHkseCk7XG5cbm1lbW9PZlNvcnRlZC5zZXQoY29tcGFyYXRvcixuZXcgV2Vha1NldCgpKTtcbm1lbW9PZlNvcnRlZC5zZXQoYW50aUNvbXBhcmF0b3IsbmV3IFdlYWtTZXQoKSk7XG5jb21wYXJhdG9yTWlycm9ySW1hZ2VzLnNldChjb21wYXJhdG9yLGFudGlDb21wYXJhdG9yKTtcbmNvbXBhcmF0b3JNaXJyb3JJbWFnZXMuc2V0KGFudGlDb21wYXJhdG9yLGNvbXBhcmF0b3IpO1xuXG5yZXR1cm4gaGFyZGVuKHtjb21wYXJhdG9yLGFudGlDb21wYXJhdG9yfSk7XG4gfTtcbi8qKlxuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyYXRvclxuICogQHJldHVybnMge1JhbmtDb21wYXJlPX1cbiAqLyRo4oCNX29uY2UubWFrZUNvbXBhcmF0b3JLaXQobWFrZUNvbXBhcmF0b3JLaXQpO1xuY29uc3QgICAgICAgIGNvbXBhcmF0b3JNaXJyb3JJbWFnZT0oY29tcGFyYXRvcik9PlxuY29tcGFyYXRvck1pcnJvckltYWdlcy5nZXQoY29tcGFyYXRvcik7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBwYXNzYWJsZXNcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovJGjigI1fb25jZS5jb21wYXJhdG9yTWlycm9ySW1hZ2UoY29tcGFyYXRvck1pcnJvckltYWdlKTtcbmNvbnN0ICAgICAgICBpc1JhbmtTb3J0ZWQ9KHBhc3NhYmxlcyxjb21wYXJlKT0+e1xuY29uc3Qgc3ViTWVtb09mU29ydGVkPW1lbW9PZlNvcnRlZC5nZXQoY29tcGFyZSk7XG5hc3NlcnQoc3ViTWVtb09mU29ydGVkIT09dW5kZWZpbmVkKTtcbmlmKHN1Yk1lbW9PZlNvcnRlZC5oYXMocGFzc2FibGVzKSl7XG5yZXR1cm4gdHJ1ZTtcbiB9XG5hc3NlcnQocGFzc1N0eWxlT2YocGFzc2FibGVzKT09PSdjb3B5QXJyYXknKTtcbmZvcihsZXQgaT0xO2k8cGFzc2FibGVzLmxlbmd0aDtpKz0xKXtcbmlmKGNvbXBhcmUocGFzc2FibGVzW2ktMV0scGFzc2FibGVzW2ldKT49MSl7XG5yZXR1cm4gZmFsc2U7XG4gfVxuIH1cbnN1Yk1lbW9PZlNvcnRlZC5hZGQocGFzc2FibGVzKTtcbnJldHVybiB0cnVlO1xuIH07JGjigI1fb25jZS5pc1JhbmtTb3J0ZWQoaXNSYW5rU29ydGVkKTtcbmhhcmRlbihpc1JhbmtTb3J0ZWQpO1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc29ydGVkXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKi9cbmNvbnN0ICAgICAgICBhc3NlcnRSYW5rU29ydGVkPShzb3J0ZWQsY29tcGFyZSk9PlxuaXNSYW5rU29ydGVkKHNvcnRlZCxjb21wYXJlKXx8XG4vKiBUT0RPIGFzc2VydCBvbiBidWcgY291bGQgbGVhZCB0byBpbmZpbml0ZSByZWN1cnNpb24uIEZpeC4qL1xuLyogZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cbkZhaWwgYE11c3QgYmUgcmFuayBzb3J0ZWQ6ICR7c29ydGVkfSB2cyAke3NvcnRCeVJhbmsoc29ydGVkLGNvbXBhcmUpfWA7JGjigI1fb25jZS5hc3NlcnRSYW5rU29ydGVkKGFzc2VydFJhbmtTb3J0ZWQpO1xuaGFyZGVuKGFzc2VydFJhbmtTb3J0ZWQpO1xuXG4vKipcbiAqIFRPRE8gU0VDVVJJVFkgQlVHOiBodHRwczovL2dpdGh1Yi5jb20vQWdvcmljL2Fnb3JpYy1zZGsvaXNzdWVzLzQyNjBcbiAqIHNvcnRCeVJhbmsgY3VycmVudGx5IHVzZXMgYEFycmF5LnByb3RvdHlwZS5zb3J0YCBkaXJlY3RseSwgYW5kXG4gKiBzbyBvbmx5IHdvcmtzIGNvcnJlY3RseSB3aGVuIGdpdmVuIGEgYGNvbXBhcmVgIGZ1bmN0aW9uIHRoYXQgY29uc2lkZXJzXG4gKiBgdW5kZWZpbmVkYCBzdHJpY3RseSBiaWdnZXIgKGA+YCkgdGhhbiBldmVyeXRoaW5nIGVsc2UuIFRoaXMgaXNcbiAqIGJlY2F1c2UgYEFycmF5LnByb3RvdHlwZS5zb3J0YCBiaXphcnJlbHkgbW92ZXMgYWxsIGB1bmRlZmluZWRgcyB0b1xuICogdGhlIGVuZCBvZiB0aGUgYXJyYXkgcmVnYXJkbGVzcywgd2l0aG91dCBjb25zdWx0aW5nIHRoZSBgY29tcGFyZWBcbiAqIGZ1bmN0aW9uLiBUaGlzIGlzIGEgZ2VudWluZSBidWcgZm9yIHVzIE5PVyBiZWNhdXNlIHNvbWV0aW1lcyB3ZSBzb3J0XG4gKiBpbiByZXZlcnNlIG9yZGVyIGJ5IHBhc3NpbmcgYSByZXZlcnNlZCByYW5rIGNvbXBhcmlzb24gZnVuY3Rpb24uXG4gKlxuICogQHBhcmFtIHtJdGVyYWJsZTxQYXNzYWJsZT59IHBhc3NhYmxlc1xuICogQHBhcmFtIHtSYW5rQ29tcGFyZX0gY29tcGFyZVxuICogQHJldHVybnMge1Bhc3NhYmxlW119XG4gKi9cbmNvbnN0ICAgICAgICBzb3J0QnlSYW5rPShwYXNzYWJsZXMsY29tcGFyZSk9PntcbmlmKEFycmF5LmlzQXJyYXkocGFzc2FibGVzKSl7XG5oYXJkZW4ocGFzc2FibGVzKTtcbi8qIENhbGxpbmcgaXNSYW5rU29ydGVkIGdpdmVzIGl0IGEgY2hhbmNlIHRvIGdldCBtZW1vaXplZCBmb3IqL1xuLyogdGhpcyBgY29tcGFyZWAgZnVuY3Rpb24gZXZlbiBpZiBpdCB3YXMgYWxyZWFkeSBtZW1vaXplZCBmb3IgYSBkaWZmZXJlbnQqL1xuLyogYGNvbXBhcmVgIGZ1bmN0aW9uLiovXG5pZihpc1JhbmtTb3J0ZWQocGFzc2FibGVzLGNvbXBhcmUpKXtcbnJldHVybiBwYXNzYWJsZXM7XG4gfVxuIH1cbmNvbnN0IHVuc29ydGVkPVsuLi5wYXNzYWJsZXNdO1xudW5zb3J0ZWQuZm9yRWFjaChoYXJkZW4pO1xuY29uc3Qgc29ydGVkPWhhcmRlbih1bnNvcnRlZC5zb3J0KGNvbXBhcmUpKTtcbmNvbnN0IHN1Yk1lbW9PZlNvcnRlZD1tZW1vT2ZTb3J0ZWQuZ2V0KGNvbXBhcmUpO1xuYXNzZXJ0KHN1Yk1lbW9PZlNvcnRlZCE9PXVuZGVmaW5lZCk7XG5zdWJNZW1vT2ZTb3J0ZWQuYWRkKHNvcnRlZCk7XG5yZXR1cm4gc29ydGVkO1xuIH07JGjigI1fb25jZS5zb3J0QnlSYW5rKHNvcnRCeVJhbmspO1xuaGFyZGVuKHNvcnRCeVJhbmspO1xuXG4vKipcbiAqIFNlZVxuICogaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmluYXJ5X3NlYXJjaF9hbGdvcml0aG0jUHJvY2VkdXJlX2Zvcl9maW5kaW5nX3RoZV9sZWZ0bW9zdF9lbGVtZW50XG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7UmFua0NvbXBhcmV9IGNvbXBhcmVcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGtleVxuICogQHBhcmFtIHsoXCJsZWZ0TW9zdFwiIHwgXCJyaWdodE1vc3RcIik9fSBiaWFzXG4gKiBAcmV0dXJucyB7bnVtYmVyfVxuICovXG5jb25zdCByYW5rU2VhcmNoPShzb3J0ZWQsY29tcGFyZSxrZXksYmlhcz0nbGVmdE1vc3QnKT0+e1xuYXNzZXJ0UmFua1NvcnRlZChzb3J0ZWQsY29tcGFyZSk7XG5sZXQgbGVmdD0wO1xubGV0IHJpZ2h0PXNvcnRlZC5sZW5ndGg7XG53aGlsZShsZWZ0PHJpZ2h0KXtcbmNvbnN0IG09TWF0aC5mbG9vcigobGVmdCtyaWdodCkvMik7XG5jb25zdCBjb21wPWNvbXBhcmUoc29ydGVkW21dLGtleSk7XG5pZihjb21wPD0tMXx8Y29tcD09PTAmJmJpYXM9PT0ncmlnaHRNb3N0Jyl7XG5sZWZ0PW0rMTtcbiB9ZWxzZXtcbmFzc2VydChjb21wPj0xfHxjb21wPT09MCYmYmlhcz09PSdsZWZ0TW9zdCcpO1xucmlnaHQ9bTtcbiB9XG4gfVxucmV0dXJuIGJpYXM9PT0nbGVmdE1vc3QnP2xlZnQ6cmlnaHQtMTtcbiB9O1xuXG4vKipcbiAqIEBwYXJhbSB7UGFzc2FibGVbXX0gc29ydGVkXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gcmFua0NvdmVyXG4gKiBAcmV0dXJucyB7SW5kZXhDb3Zlcn1cbiAqL1xuY29uc3QgICAgICAgIGdldEluZGV4Q292ZXI9KHNvcnRlZCxjb21wYXJlLFtsZWZ0S2V5LHJpZ2h0S2V5XSk9PntcbmFzc2VydFJhbmtTb3J0ZWQoc29ydGVkLGNvbXBhcmUpO1xuY29uc3QgbGVmdEluZGV4PXJhbmtTZWFyY2goc29ydGVkLGNvbXBhcmUsbGVmdEtleSwnbGVmdE1vc3QnKTtcbmNvbnN0IHJpZ2h0SW5kZXg9cmFua1NlYXJjaChzb3J0ZWQsY29tcGFyZSxyaWdodEtleSwncmlnaHRNb3N0Jyk7XG5yZXR1cm5bbGVmdEluZGV4LHJpZ2h0SW5kZXhdO1xuIH07JGjigI1fb25jZS5nZXRJbmRleENvdmVyKGdldEluZGV4Q292ZXIpO1xuaGFyZGVuKGdldEluZGV4Q292ZXIpO1xuXG4vKiogQHR5cGUge1JhbmtDb3Zlcn0gKi9cbmNvbnN0ICAgICAgICBGdWxsUmFua0NvdmVyPWhhcmRlbihbJycsJ3snXSk7XG5cbi8qKlxuICogQHBhcmFtIHtQYXNzYWJsZVtdfSBzb3J0ZWRcbiAqIEBwYXJhbSB7SW5kZXhDb3Zlcn0gaW5kZXhDb3ZlclxuICogQHJldHVybnMge0l0ZXJhYmxlPFtudW1iZXIsIFBhc3NhYmxlXT59XG4gKi8kaOKAjV9vbmNlLkZ1bGxSYW5rQ292ZXIoRnVsbFJhbmtDb3Zlcik7XG5jb25zdCAgICAgICAgY292ZXJlZEVudHJpZXM9KHNvcnRlZCxbbGVmdEluZGV4LHJpZ2h0SW5kZXhdKT0+e1xuLyoqIEB0eXBlIHtJdGVyYWJsZTxbbnVtYmVyLCBQYXNzYWJsZV0+fSAqL1xuY29uc3QgaXRlcmFibGU9aGFyZGVuKHtcbltTeW1ib2wuaXRlcmF0b3JdOigpPT57XG5sZXQgaT1sZWZ0SW5kZXg7XG5yZXR1cm4gaGFyZGVuKHtcbm5leHQ6KCk9PntcbmlmKGk8PXJpZ2h0SW5kZXgpe1xuY29uc3QgZWxlbWVudD1zb3J0ZWRbaV07XG5pKz0xO1xucmV0dXJuIGhhcmRlbih7dmFsdWU6W2ksZWxlbWVudF0sZG9uZTpmYWxzZX0pO1xuIH1lbHNle1xucmV0dXJuIGhhcmRlbih7dmFsdWU6dW5kZWZpbmVkLGRvbmU6dHJ1ZX0pO1xuIH1cbiB9fSk7XG5cbiB9fSk7XG5cbnJldHVybiBpdGVyYWJsZTtcbiB9OyRo4oCNX29uY2UuY292ZXJlZEVudHJpZXMoY292ZXJlZEVudHJpZXMpO1xuaGFyZGVuKGNvdmVyZWRFbnRyaWVzKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBhXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBiXG4gKiBAcmV0dXJucyB7UGFzc2FibGV9XG4gKi9cbmNvbnN0IG1heFJhbms9KGNvbXBhcmUsYSxiKT0+Y29tcGFyZShhLGIpPj0wP2E6YjtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBhXG4gKiBAcGFyYW0ge1Bhc3NhYmxlfSBiXG4gKiBAcmV0dXJucyB7UGFzc2FibGV9XG4gKi9cbmNvbnN0IG1pblJhbms9KGNvbXBhcmUsYSxiKT0+Y29tcGFyZShhLGIpPD0wP2E6YjtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1JhbmtDb3ZlcltdfSBjb3ZlcnNcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0ICAgICAgICB1bmlvblJhbmtDb3ZlcnM9KGNvbXBhcmUsY292ZXJzKT0+e1xuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb3Zlcn0gYVxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IGJcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0IHVuaW9uUmFua0NvdmVyUGFpcj0oW2xlZnRBLHJpZ2h0QV0sW2xlZnRCLHJpZ2h0Ql0pPT5bXG5taW5SYW5rKGNvbXBhcmUsbGVmdEEsbGVmdEIpLFxubWF4UmFuayhjb21wYXJlLHJpZ2h0QSxyaWdodEIpXTtcblxucmV0dXJuIGNvdmVycy5yZWR1Y2UodW5pb25SYW5rQ292ZXJQYWlyLFsneycsJyddKTtcbiB9OyRo4oCNX29uY2UudW5pb25SYW5rQ292ZXJzKHVuaW9uUmFua0NvdmVycyk7XG5oYXJkZW4odW5pb25SYW5rQ292ZXJzKTtcblxuLyoqXG4gKiBAcGFyYW0ge1JhbmtDb21wYXJlfSBjb21wYXJlXG4gKiBAcGFyYW0ge1JhbmtDb3ZlcltdfSBjb3ZlcnNcbiAqIEByZXR1cm5zIHtSYW5rQ292ZXJ9XG4gKi9cbmNvbnN0ICAgICAgICBpbnRlcnNlY3RSYW5rQ292ZXJzPShjb21wYXJlLGNvdmVycyk9Pntcbi8qKlxuICogQHBhcmFtIHtSYW5rQ292ZXJ9IGFcbiAqIEBwYXJhbSB7UmFua0NvdmVyfSBiXG4gKiBAcmV0dXJucyB7UmFua0NvdmVyfVxuICovXG5jb25zdCBpbnRlcnNlY3RSYW5rQ292ZXJQYWlyPShbbGVmdEEscmlnaHRBXSxbbGVmdEIscmlnaHRCXSk9Pltcbm1heFJhbmsoY29tcGFyZSxsZWZ0QSxsZWZ0QiksXG5taW5SYW5rKGNvbXBhcmUscmlnaHRBLHJpZ2h0QildO1xuXG5yZXR1cm4gY292ZXJzLnJlZHVjZShpbnRlcnNlY3RSYW5rQ292ZXJQYWlyLFsnJywneyddKTtcbiB9OyRo4oCNX29uY2UuaW50ZXJzZWN0UmFua0NvdmVycyhpbnRlcnNlY3RSYW5rQ292ZXJzKTtcblxuY29uc3QgICAgICAge1xuY29tcGFyYXRvcjpjb21wYXJlUmFuayxcbmFudGlDb21wYXJhdG9yOmNvbXBhcmVBbnRpUmFua309XG5tYWtlQ29tcGFyYXRvcktpdCgpO1xuXG4vKipcbiAqIENyZWF0ZSBhIGNvbXBhcmF0b3Iga2l0IGluIHdoaWNoIHJlbW90YWJsZXMgYXJlIGZ1bGx5IG9yZGVyZWRcbiAqIGJ5IHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFyZSBmaXJzdCBzZWVuIGJ5ICp0aGlzKiBjb21wYXJhdG9yIGtpdC5cbiAqIEJFV0FSRTogVGhpcyBpcyBvYnNlcnZhYmxlIG11dGFibGUgc3RhdGUsIHNvIHN1Y2ggYSBjb21wYXJhdG9yIGtpdFxuICogc2hvdWxkIG5ldmVyIGJlIHNoYXJlZCBhbW9uZyBzdWJzeXN0ZW1zIHRoYXQgc2hvdWxkIG5vdCBiZSBhYmxlXG4gKiB0byBjb21tdW5pY2F0ZS5cbiAqXG4gKiBOb3RlIHRoYXQgdGhpcyBvcmRlciBkb2VzIG5vdCBtZWV0IHRoZSByZXF1aXJlbWVudHMgZm9yIHN0b3JlXG4gKiBvcmRlcmluZywgc2luY2UgaXQgaGFzIG5vIG1lbW9yeSBvZiBkZWxldGVkIGtleXMuXG4gKlxuICogVGhlc2UgZnVsbCBvcmRlciBjb21wYXJhdG9yIGtpdCBpcyBzdHJpY3RseSBtb3JlIHByZWNpc2UgdGhhdCB0aGVcbiAqIHJhbmsgb3JkZXIgY29tcGFyYXRvciBraXRzIGFib3ZlLiBBcyBhIHJlc3VsdCwgYW55IGFycmF5IHdoaWNoIGlzXG4gKiBzb3J0ZWQgYnkgc3VjaCBhIGZ1bGwgb3JkZXIgd2lsbCBwYXNzIHRoZSBpc1JhbmtTb3J0ZWQgdGVzdCB3aXRoXG4gKiBhIGNvcnJlc3BvbmRpbmcgcmFuayBvcmRlci5cbiAqXG4gKiBBbiBhcnJheSB3aGljaCBpcyBzb3J0ZWQgYnkgYSAqZnJlc2gqIGZ1bGwgb3JkZXIgY29tcGFyYXRvciwgaS5lLixcbiAqIG9uZSB0aGF0IGhhcyBub3QgeWV0IHNlZW4gYW55IHJlbW90YWJsZXMsIHdpbGwgb2YgY291cnNlIHJlbWFpblxuICogc29ydGVkIGJ5IGFjY29yZGluZyB0byAqdGhhdCogZnVsbCBvcmRlciBjb21wYXJhdG9yLiBBbiBhcnJheSAqb2ZcbiAqIHNjYWxhcnMqIHNvcnRlZCBieSBhIGZyZXNoIGZ1bGwgb3JkZXIgd2lsbCByZW1haW4gc29ydGVkIGV2ZW5cbiAqIGFjY29yZGluZyB0byBhIG5ldyBmcmVzaCBmdWxsIG9yZGVyIGNvbXBhcmF0b3IsIHNpbmNlIGl0IHdpbGwgc2VlXG4gKiB0aGUgcmVtb3RhYmxlcyBpbiB0aGUgc2FtZSBvcmRlciBhZ2Fpbi4gVW5mb3J0dW5hdGVseSwgdGhpcyBpc1xuICogbm90IHRydWUgb2YgYXJyYXlzIG9mIHBhc3NhYmxlcyBpbiBnZW5lcmFsLlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IGxvbmdMaXZlZFxuICogQHJldHVybnMge0Z1bGxDb21wYXJhdG9yS2l0fVxuICovJGjigI1fb25jZS5jb21wYXJlUmFuayhjb21wYXJlUmFuayk7JGjigI1fb25jZS5jb21wYXJlQW50aVJhbmsoY29tcGFyZUFudGlSYW5rKTtcbmNvbnN0ICAgICAgICBtYWtlRnVsbE9yZGVyQ29tcGFyYXRvcktpdD0obG9uZ0xpdmVkPWZhbHNlKT0+e1xubGV0IG51bVNlZW49MDtcbi8qIFdoZW4gZHluYW1pY2FsbHkgY3JlYXRlZCB3aXRoIHNob3J0IGxpZmV0aW1lcyAodGhlIGRlZmF1bHQpIGEgV2Vha01hcCovXG4vKiB3b3VsZCBwZXJmb3JtIHBvb3JseSwgYW5kIHRoZSBsZWFrIGNyZWF0ZWQgYnkgYSBNYXAgb25seSBsYXN0cyBhcyBsb25nKi9cbi8qIGFzIHRoZSBNYXAuKi9cbmNvbnN0IE1hcENvbnN0cnVjdG9yPWxvbmdMaXZlZD9XZWFrTWFwOk1hcDtcbmNvbnN0IHNlZW49bmV3IE1hcENvbnN0cnVjdG9yKCk7XG5jb25zdCB0YWc9KHIpPT57XG5pZihzZWVuLmhhcyhyKSl7XG5yZXR1cm4gc2Vlbi5nZXQocik7XG4gfVxubnVtU2Vlbis9MTtcbnNlZW4uc2V0KHIsbnVtU2Vlbik7XG5yZXR1cm4gbnVtU2VlbjtcbiB9O1xuY29uc3QgY29tcGFyZVJlbW90YWJsZXM9KHgseSk9PmNvbXBhcmVSYW5rKHRhZyh4KSx0YWcoeSkpO1xucmV0dXJuIG1ha2VDb21wYXJhdG9yS2l0KGNvbXBhcmVSZW1vdGFibGVzKTtcbiB9OyRo4oCNX29uY2UubWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQobWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQpO1xuaGFyZGVuKG1ha2VGdWxsT3JkZXJDb21wYXJhdG9yS2l0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJnZXRQYXNzU3R5bGVDb3ZlciI6WyJnZXRQYXNzU3R5bGVDb3ZlciJdLCJtYWtlQ29tcGFyYXRvcktpdCI6WyJtYWtlQ29tcGFyYXRvcktpdCJdLCJjb21wYXJhdG9yTWlycm9ySW1hZ2UiOlsiY29tcGFyYXRvck1pcnJvckltYWdlIl0sImlzUmFua1NvcnRlZCI6WyJpc1JhbmtTb3J0ZWQiXSwiYXNzZXJ0UmFua1NvcnRlZCI6WyJhc3NlcnRSYW5rU29ydGVkIl0sInNvcnRCeVJhbmsiOlsic29ydEJ5UmFuayJdLCJnZXRJbmRleENvdmVyIjpbImdldEluZGV4Q292ZXIiXSwiRnVsbFJhbmtDb3ZlciI6WyJGdWxsUmFua0NvdmVyIl0sImNvdmVyZWRFbnRyaWVzIjpbImNvdmVyZWRFbnRyaWVzIl0sInVuaW9uUmFua0NvdmVycyI6WyJ1bmlvblJhbmtDb3ZlcnMiXSwiaW50ZXJzZWN0UmFua0NvdmVycyI6WyJpbnRlcnNlY3RSYW5rQ292ZXJzIl0sImNvbXBhcmVSYW5rIjpbImNvbXBhcmVSYW5rIl0sImNvbXBhcmVBbnRpUmFuayI6WyJjb21wYXJlQW50aVJhbmsiXSwibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiOlsibWFrZUZ1bGxPcmRlckNvbXBhcmF0b3JLaXQiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAgjnZkwMNAAADDQAAJgAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy90eXBlR3VhcmRzLmpzeyJpbXBvcnRzIjpbIi4vcGFzc1N0eWxlT2YuanMiXSwiZXhwb3J0cyI6WyJhc3NlcnRDb3B5QXJyYXkiLCJhc3NlcnRSZWNvcmQiLCJhc3NlcnRSZW1vdGFibGUiLCJpc0NvcHlBcnJheSIsImlzUmVjb3JkIiwiaXNSZW1vdGFibGUiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICBsZXQgcGFzc1N0eWxlT2Y7JGjigI1faW1wb3J0cyhbW1wiLi9wYXNzU3R5bGVPZi5qc1wiLCBbW1wicGFzc1N0eWxlT2ZcIiwgWyRo4oCNX2EgPT4gKHBhc3NTdHlsZU9mID0gJGjigI1fYSldXV1dXSk7ICAgXG5cblxuXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5QYXNzYWJsZX0gUGFzc2FibGUgKi9cbi8qKiBAdGVtcGxhdGUgVCBAdHlwZWRlZiB7WGltcG9ydCgnLi90eXBlcy5qcycpLkNvcHlBcnJheTxUPn0gQ29weUFycmF5ICovXG4vKiogQHRlbXBsYXRlIFQgQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5Db3B5UmVjb3JkPFQ+fSBDb3B5UmVjb3JkICovXG4vKiogQHR5cGVkZWYge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5SZW1vdGFibGV9IFJlbW90YWJsZSAqL1xuXG5jb25zdHtGYWlsLHF1b3RlOnF9PWFzc2VydDtcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIHBhc3MtYnktY29weSBhcnJheSwgQUtBIGEgXCJjb3B5QXJyYXlcIlxuICogaW4gQGVuZG8vbWFyc2hhbCB0ZXJtc1xuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IGFycmF5XG4gKiBAcmV0dXJucyB7YXJyYXkgaXMgQ29weUFycmF5PGFueT59XG4gKi9cbmNvbnN0IGlzQ29weUFycmF5PShhcnJheSk9PnBhc3NTdHlsZU9mKGFycmF5KT09PSdjb3B5QXJyYXknOyRo4oCNX29uY2UuaXNDb3B5QXJyYXkoaXNDb3B5QXJyYXkpO1xuaGFyZGVuKGlzQ29weUFycmF5KTtcblxuLyoqXG4gKiBDaGVjayB3aGV0aGVyIHRoZSBhcmd1bWVudCBpcyBhIHBhc3MtYnktY29weSByZWNvcmQsIEFLQSBhXG4gKiBcImNvcHlSZWNvcmRcIiBpbiBAZW5kby9tYXJzaGFsIHRlcm1zXG4gKlxuICogQHBhcmFtIHtQYXNzYWJsZX0gcmVjb3JkXG4gKiBAcmV0dXJucyB7cmVjb3JkIGlzIENvcHlSZWNvcmQ8YW55Pn1cbiAqL1xuY29uc3QgaXNSZWNvcmQ9KHJlY29yZCk9PnBhc3NTdHlsZU9mKHJlY29yZCk9PT0nY29weVJlY29yZCc7JGjigI1fb25jZS5pc1JlY29yZChpc1JlY29yZCk7XG5oYXJkZW4oaXNSZWNvcmQpO1xuXG4vKipcbiAqIENoZWNrIHdoZXRoZXIgdGhlIGFyZ3VtZW50IGlzIGEgcmVtb3RhYmxlLlxuICpcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJlbW90YWJsZVxuICogQHJldHVybnMge3JlbW90YWJsZSBpcyBSZW1vdGFibGV9XG4gKi9cbmNvbnN0IGlzUmVtb3RhYmxlPShyZW1vdGFibGUpPT5wYXNzU3R5bGVPZihyZW1vdGFibGUpPT09J3JlbW90YWJsZSc7JGjigI1fb25jZS5pc1JlbW90YWJsZShpc1JlbW90YWJsZSk7XG5oYXJkZW4oaXNSZW1vdGFibGUpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRBcnJheVxuICogQHBhcmFtIHtQYXNzYWJsZX0gYXJyYXlcbiAqIEBwYXJhbSB7c3RyaW5nPX0gb3B0TmFtZU9mQXJyYXlcbiAqIEByZXR1cm5zIHthc3NlcnRzIGFycmF5IGlzIENvcHlBcnJheTxhbnk+fVxuICovXG5cbi8qKiBAdHlwZSB7QXNzZXJ0QXJyYXl9ICovXG5jb25zdCBhc3NlcnRDb3B5QXJyYXk9KGFycmF5LG9wdE5hbWVPZkFycmF5PSdBbGxlZ2VkIGFycmF5Jyk9PntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihhcnJheSk7XG5wYXNzU3R5bGU9PT0nY29weUFycmF5J3x8XG5GYWlsIGAke3Eob3B0TmFtZU9mQXJyYXkpfSAke2FycmF5fSBtdXN0IGJlIGEgcGFzcy1ieS1jb3B5IGFycmF5LCBub3QgJHtxKFxucGFzc1N0eWxlKVxuIH1gO1xuIH07JGjigI1fb25jZS5hc3NlcnRDb3B5QXJyYXkoYXNzZXJ0Q29weUFycmF5KTtcbmhhcmRlbihhc3NlcnRDb3B5QXJyYXkpO1xuXG4vKipcbiAqIEBjYWxsYmFjayBBc3NlcnRSZWNvcmRcbiAqIEBwYXJhbSB7UGFzc2FibGV9IHJlY29yZFxuICogQHBhcmFtIHtzdHJpbmc9fSBvcHROYW1lT2ZSZWNvcmRcbiAqIEByZXR1cm5zIHthc3NlcnRzIHJlY29yZCBpcyBDb3B5UmVjb3JkPGFueT59XG4gKi9cblxuLyoqIEB0eXBlIHtBc3NlcnRSZWNvcmR9ICovXG5jb25zdCBhc3NlcnRSZWNvcmQ9KHJlY29yZCxvcHROYW1lT2ZSZWNvcmQ9J0FsbGVnZWQgcmVjb3JkJyk9PntcbmNvbnN0IHBhc3NTdHlsZT1wYXNzU3R5bGVPZihyZWNvcmQpO1xucGFzc1N0eWxlPT09J2NvcHlSZWNvcmQnfHxcbkZhaWwgYCR7cShvcHROYW1lT2ZSZWNvcmQpfSAke3JlY29yZH0gbXVzdCBiZSBhIHBhc3MtYnktY29weSByZWNvcmQsIG5vdCAke3EoXG5wYXNzU3R5bGUpXG4gfWA7XG4gfTskaOKAjV9vbmNlLmFzc2VydFJlY29yZChhc3NlcnRSZWNvcmQpO1xuaGFyZGVuKGFzc2VydFJlY29yZCk7XG5cbi8qKlxuICogQGNhbGxiYWNrIEFzc2VydFJlbW90YWJsZVxuICogQHBhcmFtIHtQYXNzYWJsZX0gcmVtb3RhYmxlXG4gKiBAcGFyYW0ge3N0cmluZz19IG9wdE5hbWVPZlJlbW90YWJsZVxuICogQHJldHVybnMge2Fzc2VydHMgcmVtb3RhYmxlIGlzIFJlbW90YWJsZX1cbiAqL1xuXG4vKiogQHR5cGUge0Fzc2VydFJlbW90YWJsZX0gKi9cbmNvbnN0IGFzc2VydFJlbW90YWJsZT0oXG5yZW1vdGFibGUsXG5vcHROYW1lT2ZSZW1vdGFibGU9J0FsbGVnZWQgcmVtb3RhYmxlJyk9Plxue1xuY29uc3QgcGFzc1N0eWxlPXBhc3NTdHlsZU9mKHJlbW90YWJsZSk7XG5wYXNzU3R5bGU9PT0ncmVtb3RhYmxlJ3x8XG5GYWlsIGAke3Eob3B0TmFtZU9mUmVtb3RhYmxlKX0gJHtyZW1vdGFibGV9IG11c3QgYmUgYSByZW1vdGFibGUsIG5vdCAke3EoXG5wYXNzU3R5bGUpXG4gfWA7XG4gfTskaOKAjV9vbmNlLmFzc2VydFJlbW90YWJsZShhc3NlcnRSZW1vdGFibGUpO1xuaGFyZGVuKGFzc2VydFJlbW90YWJsZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsiaXNDb3B5QXJyYXkiOlsiaXNDb3B5QXJyYXkiXSwiaXNSZWNvcmQiOlsiaXNSZWNvcmQiXSwiaXNSZW1vdGFibGUiOlsiaXNSZW1vdGFibGUiXSwiYXNzZXJ0Q29weUFycmF5IjpbImFzc2VydENvcHlBcnJheSJdLCJhc3NlcnRSZWNvcmQiOlsiYXNzZXJ0UmVjb3JkIl0sImFzc2VydFJlbW90YWJsZSI6WyJhc3NlcnRSZW1vdGFibGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAu1cO9x8BAAAfAQAAIQAAAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy90eXBlcy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAD/CipPugsAALoLAAAeAAAAQGVuZG8vbmF0LXY0LjEuMjQvc3JjL2luZGV4LmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJOYXQiLCJpc05hdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShpc05hdCwgJ25hbWUnLCB7dmFsdWU6IFwiaXNOYXRcIn0pOyRo4oCNX29uY2UuaXNOYXQoaXNOYXQpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShOYXQsICduYW1lJywge3ZhbHVlOiBcIk5hdFwifSk7JGjigI1fb25jZS5OYXQoTmF0KTsgICAvKiBDb3B5cmlnaHQgKEMpIDIwMTEgR29vZ2xlIEluYy4qL1xuLyogQ29weXJpZ2h0IChDKSAyMDE4IEFnb3JpYyovXG4vKiovXG4vKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgXCJMaWNlbnNlXCIpOyovXG4vKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuKi9cbi8qIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdCovXG4vKiovXG4vKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAqL1xuLyoqL1xuLyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZSovXG4vKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiBcIkFTIElTXCIgQkFTSVMsKi9cbi8qIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiovXG4vKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kKi9cbi8qIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiovXG5cbi8qIEB0cy1jaGVjayovXG5cbi8qKlxuICogSXMgYGFsbGVnZWROdW1gIGEgbnVtYmVyIGluIHRoZSBbY29udGlndW91cyByYW5nZSBvZiBleGFjdGx5IGFuZFxuICogdW5hbWJpZ3VvdXNseVxuICogcmVwcmVzZW50YWJsZV0oaHR0cHM6Ly9lc2Rpc2N1c3Mub3JnL3RvcGljL21vcmUtbnVtZXJpYy1jb25zdGFudHMtcGxlYXNlLWVzcGVjaWFsbHktZXBzaWxvbiNjb250ZW50LTE0KVxuICogIG5hdHVyYWwgbnVtYmVycyAobm9uLW5lZ2F0aXZlIGludGVnZXJzKT9cbiAqXG4gKiBUbyBxdWFsaWZ5IGBhbGxlZ2VkTnVtYCBtdXN0IGVpdGhlciBiZSBhXG4gKiBub24tbmVnYXRpdmUgYGJpZ2ludGAsIG9yIGEgbm9uLW5lZ2F0aXZlIGBudW1iZXJgIHJlcHJlc2VudGluZyBhbiBpbnRlZ2VyXG4gKiB3aXRoaW4gcmFuZ2Ugb2YgW2ludGVnZXJzIHNhZmVseSByZXByZXNlbnRhYmxlIGluXG4gKiBmbG9hdGluZyBwb2ludF0oaHR0cHM6Ly90YzM5LmVzL2VjbWEyNjIvI3NlYy1udW1iZXIuaXNzYWZlaW50ZWdlcikuXG4gKlxuICogQHBhcmFtIHt1bmtub3dufSBhbGxlZ2VkTnVtXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNOYXQoYWxsZWdlZE51bSl7XG5pZih0eXBlb2YgYWxsZWdlZE51bT09PSdiaWdpbnQnKXtcbnJldHVybiBhbGxlZ2VkTnVtPj0wO1xuIH1cbmlmKHR5cGVvZiBhbGxlZ2VkTnVtIT09J251bWJlcicpe1xucmV0dXJuIGZhbHNlO1xuIH1cblxucmV0dXJuIE51bWJlci5pc1NhZmVJbnRlZ2VyKGFsbGVnZWROdW0pJiZhbGxlZ2VkTnVtPj0wO1xuIH1cblxuLyoqXG4gKiBJZiBgYWxsZWdlZE51bWJlcmAgcGFzc2VzIHRoZSBgaXNOYXRgIHRlc3QsIHRoZW4gcmV0dXJuIGl0IGFzIGEgYmlnaW50LlxuICogT3RoZXJ3aXNlIHRocm93IGFuIGFwcHJvcHJpYXRlIGVycm9yLlxuICpcbiAqIElmIGBhbGxlZ2VkTnVtYCBpcyBuZWl0aGVyIGEgYmlnaW50IG5vciBhIG51bWJlciwgYE5hdGAgdGhyb3dzIGEgYFR5cGVFcnJvcmAuXG4gKiBPdGhlcndpc2UsIGlmIGl0IGlzIG5vdCBhIFtzYWZlbHlcbiAqIHJlcHJlc2VudGFibGVdKGh0dHBzOi8vZXNkaXNjdXNzLm9yZy90b3BpYy9tb3JlLW51bWVyaWMtY29uc3RhbnRzLXBsZWFzZS1lc3BlY2lhbGx5LWVwc2lsb24jY29udGVudC0xNClcbiAqIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLCBgTmF0YCB0aHJvd3MgYSBgUmFuZ2VFcnJvcmAuXG4gKiBPdGhlcndpc2UsIGl0IGlzIGNvbnZlcnRlZCB0byBhIGJpZ2ludCBpZiBuZWNlc3NhcnkgYW5kIHJldHVybmVkLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gYWxsZWdlZE51bVxuICogQHJldHVybnMge2JpZ2ludH1cbiAqL1xuZnVuY3Rpb24gTmF0KGFsbGVnZWROdW0pe1xuaWYodHlwZW9mIGFsbGVnZWROdW09PT0nYmlnaW50Jyl7XG5pZihhbGxlZ2VkTnVtPDApe1xudGhyb3cgbmV3IFJhbmdlRXJyb3IoIGAke2FsbGVnZWROdW19IGlzIG5lZ2F0aXZlYCk7XG4gfVxucmV0dXJuIGFsbGVnZWROdW07XG4gfVxuXG5pZih0eXBlb2YgYWxsZWdlZE51bT09PSdudW1iZXInKXtcbmlmKCFOdW1iZXIuaXNTYWZlSW50ZWdlcihhbGxlZ2VkTnVtKSl7XG50aHJvdyBuZXcgUmFuZ2VFcnJvciggYCR7YWxsZWdlZE51bX0gbm90IGEgc2FmZSBpbnRlZ2VyYCk7XG4gfVxuaWYoYWxsZWdlZE51bTwwKXtcbnRocm93IG5ldyBSYW5nZUVycm9yKCBgJHthbGxlZ2VkTnVtfSBpcyBuZWdhdGl2ZWApO1xuIH1cbnJldHVybiBCaWdJbnQoYWxsZWdlZE51bSk7XG4gfVxuXG50aHJvdyBuZXcgVHlwZUVycm9yKFxuIGAke2FsbGVnZWROdW19IGlzIGEgJHt0eXBlb2YgYWxsZWdlZE51bX0gYnV0IG11c3QgYmUgYSBiaWdpbnQgb3IgYSBudW1iZXJgKTtcblxuIH1cbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc05hdCI6WyJpc05hdCJdLCJOYXQiOlsiTmF0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAEdvKsdbCQAAWwkAACIAAABAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyL2luZGV4LmpzeyJpbXBvcnRzIjpbIi4vc3JjL2lzLXByb21pc2UuanMiLCIuL3NyYy9tZW1vLXJhY2UuanMiLCIuL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qcyIsIi4vc3JjL3R5cGVzLmpzIl0sImV4cG9ydHMiOlsibWFrZVByb21pc2VLaXQiLCJyYWNlUHJvbWlzZXMiXSwicmVleHBvcnRzIjpbIi4vc3JjL2lzLXByb21pc2UuanMiLCIuL3NyYy90eXBlcy5qcyJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgIGxldCBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQsbWVtb1JhY2U7JGjigI1faW1wb3J0cyhbW1wiLi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanNcIiwgW1tcIm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdFwiLCBbJGjigI1fYSA9PiAobWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0ID0gJGjigI1fYSldXV1dLFtcIi4vc3JjL21lbW8tcmFjZS5qc1wiLCBbW1wibWVtb1JhY2VcIiwgWyRo4oCNX2EgPT4gKG1lbW9SYWNlID0gJGjigI1fYSldXV1dLFtcIi4vc3JjL2lzLXByb21pc2UuanNcIiwgW11dLFtcIi4vc3JjL3R5cGVzLmpzXCIsIFtdXV0pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShtYWtlUHJvbWlzZUtpdCwgJ25hbWUnLCB7dmFsdWU6IFwibWFrZVByb21pc2VLaXRcIn0pOyRo4oCNX29uY2UubWFrZVByb21pc2VLaXQobWFrZVByb21pc2VLaXQpO09iamVjdC5kZWZpbmVQcm9wZXJ0eShyYWNlUHJvbWlzZXMsICduYW1lJywge3ZhbHVlOiBcInJhY2VQcm9taXNlc1wifSk7JGjigI1fb25jZS5yYWNlUHJvbWlzZXMocmFjZVByb21pc2VzKTsgICBcblxuXG5cblxuXG5cblxuXG5cblxuLyoqIEB0eXBlIHtQcm9taXNlQ29uc3RydWN0b3J9ICovXG5jb25zdCBCZXN0UGlwZWxpbmFibGVQcm9taXNlPWdsb2JhbFRoaXMuSGFuZGxlZFByb21pc2V8fFByb21pc2U7XG5cbi8qKlxuICogbWFrZVByb21pc2VLaXQoKSBidWlsZHMgYSBQcm9taXNlIG9iamVjdCwgYW5kIHJldHVybnMgYSByZWNvcmRcbiAqIGNvbnRhaW5pbmcgdGhlIHByb21pc2UgaXRzZWxmLCBhcyB3ZWxsIGFzIHNlcGFyYXRlIGZhY2V0cyBmb3IgcmVzb2x2aW5nXG4gKiBhbmQgcmVqZWN0aW5nIGl0LlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcmV0dXJucyB7WGltcG9ydCgnLi9zcmMvdHlwZXMuanMnKS5Qcm9taXNlS2l0PFQ+fVxuICovXG5mdW5jdGlvbiAgICAgICAgbWFrZVByb21pc2VLaXQoKXtcbmNvbnN0e3Jlc29sdmUscmVqZWN0LGV4ZWN1dG9yfT1tYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQoKTtcblxuY29uc3QgcHJvbWlzZT1uZXcgQmVzdFBpcGVsaW5hYmxlUHJvbWlzZShleGVjdXRvcik7XG5cbnJldHVybiBoYXJkZW4oe3Byb21pc2UscmVzb2x2ZSxyZWplY3R9KTtcbiB9XG5oYXJkZW4obWFrZVByb21pc2VLaXQpO1xuXG4vKiBOQjogQW5vdGhlciBpbXBsZW1lbnRhdGlvbiBmb3IgUHJvbWlzZS5yYWNlIHdvdWxkIGJlIHRvIHVzZSB0aGUgcmVsZWFzaW5nIGV4ZWN1dG9yLCovXG4vKiBIb3dldmVyIHdoaWxlIGl0IHdvdWxkIG5vIGxvbmdlciBsZWFrIHRoZSByYWNlZCBwcm9taXNlIG9iamVjdHMgdGhlbXNlbHZlcywgaXQgd291bGQqL1xuLyogc3RpbGwgbGVhayByZWFjdGlvbnMgb24gdGhlIG5vbi1yZXNvbHZlZCBwcm9taXNlcyBjb250ZW5kaW5nIGZvciB0aGUgcmFjZS4qL1xuXG4vKipcbiAqIENyZWF0ZXMgYSBQcm9taXNlIHRoYXQgaXMgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgd2hlbiBhbnkgb2YgdGhlIHByb3ZpZGVkIFByb21pc2VzIGFyZSByZXNvbHZlZFxuICogb3IgcmVqZWN0ZWQuXG4gKlxuICogVW5saWtlIGBQcm9taXNlLnJhY2VgIGl0IGNsZWFucyB1cCBhZnRlciBpdHNlbGYgc28gYSBub24tcmVzb2x2ZWQgdmFsdWUgZG9lc24ndCBob2xkIG9udG9cbiAqIHRoZSByZXN1bHQgcHJvbWlzZS5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHBhcmFtIHtJdGVyYWJsZTxUPn0gdmFsdWVzIEFuIGl0ZXJhYmxlIG9mIFByb21pc2VzLlxuICogQHJldHVybnMge1Byb21pc2U8QXdhaXRlZDxUPj59IEEgbmV3IFByb21pc2UuXG4gKi9cbmZ1bmN0aW9uICAgICAgICByYWNlUHJvbWlzZXModmFsdWVzKXtcbnJldHVybiBoYXJkZW4obWVtb1JhY2UuY2FsbChCZXN0UGlwZWxpbmFibGVQcm9taXNlLHZhbHVlcykpO1xuIH1cbmhhcmRlbihyYWNlUHJvbWlzZXMpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7Im1ha2VQcm9taXNlS2l0IjpbIm1ha2VQcm9taXNlS2l0Il0sInJhY2VQcm9taXNlcyI6WyJyYWNlUHJvbWlzZXMiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAl4jgW8oCAADKAgAAKwAAAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIvc3JjL2lzLXByb21pc2UuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbImlzUHJvbWlzZSJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShpc1Byb21pc2UsICduYW1lJywge3ZhbHVlOiBcImlzUHJvbWlzZVwifSk7JGjigI1fb25jZS5pc1Byb21pc2UoaXNQcm9taXNlKTsgICAvKipcbiAqIERldGVybWluZSBpZiB0aGUgYXJndW1lbnQgaXMgYSBQcm9taXNlLlxuICpcbiAqIEBwYXJhbSB7dW5rbm93bn0gbWF5YmVQcm9taXNlIFRoZSB2YWx1ZSB0byBleGFtaW5lXG4gKiBAcmV0dXJucyB7bWF5YmVQcm9taXNlIGlzIFByb21pc2V9IFdoZXRoZXIgaXQgaXMgYSBwcm9taXNlXG4gKi9cbmZ1bmN0aW9uICAgICAgICBpc1Byb21pc2UobWF5YmVQcm9taXNlKXtcbnJldHVybiBQcm9taXNlLnJlc29sdmUobWF5YmVQcm9taXNlKT09PW1heWJlUHJvbWlzZTtcbiB9XG5oYXJkZW4oaXNQcm9taXNlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJpc1Byb21pc2UiOlsiaXNQcm9taXNlIl19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIQRv9OpEgAAqRIAACoAAABAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyL3NyYy9tZW1vLXJhY2UuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1lbW9SYWNlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogSW5pdGlhbCB2ZXJzaW9uIGF1dGhvcmVkIGJ5IEJyaWFuIEtpbTpcbmh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlanMvbm9kZS9pc3N1ZXMvMTc0NjkjaXNzdWVjb21tZW50LTY4NTIxNjc3N1xuIFRoaXMgaXMgZnJlZSBhbmQgdW5lbmN1bWJlcmVkIHNvZnR3YXJlIHJlbGVhc2VkIGludG8gdGhlIHB1YmxpYyBkb21haW4uXG4gQW55b25lIGlzIGZyZWUgdG8gY29weSwgbW9kaWZ5LCBwdWJsaXNoLCB1c2UsIGNvbXBpbGUsIHNlbGwsIG9yXG5kaXN0cmlidXRlIHRoaXMgc29mdHdhcmUsIGVpdGhlciBpbiBzb3VyY2UgY29kZSBmb3JtIG9yIGFzIGEgY29tcGlsZWRcbmJpbmFyeSwgZm9yIGFueSBwdXJwb3NlLCBjb21tZXJjaWFsIG9yIG5vbi1jb21tZXJjaWFsLCBhbmQgYnkgYW55XG5tZWFucy5cbiBJbiBqdXJpc2RpY3Rpb25zIHRoYXQgcmVjb2duaXplIGNvcHlyaWdodCBsYXdzLCB0aGUgYXV0aG9yIG9yIGF1dGhvcnNcbm9mIHRoaXMgc29mdHdhcmUgZGVkaWNhdGUgYW55IGFuZCBhbGwgY29weXJpZ2h0IGludGVyZXN0IGluIHRoZVxuc29mdHdhcmUgdG8gdGhlIHB1YmxpYyBkb21haW4uIFdlIG1ha2UgdGhpcyBkZWRpY2F0aW9uIGZvciB0aGUgYmVuZWZpdFxub2YgdGhlIHB1YmxpYyBhdCBsYXJnZSBhbmQgdG8gdGhlIGRldHJpbWVudCBvZiBvdXIgaGVpcnMgYW5kXG5zdWNjZXNzb3JzLiBXZSBpbnRlbmQgdGhpcyBkZWRpY2F0aW9uIHRvIGJlIGFuIG92ZXJ0IGFjdCBvZlxucmVsaW5xdWlzaG1lbnQgaW4gcGVycGV0dWl0eSBvZiBhbGwgcHJlc2VudCBhbmQgZnV0dXJlIHJpZ2h0cyB0byB0aGlzXG5zb2Z0d2FyZSB1bmRlciBjb3B5cmlnaHQgbGF3LlxuIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsXG5FWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbk1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC5cbklOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SXG5PVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSxcbkFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUlxuT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2UgcmVmZXIgdG8gPGh0dHA6Ly91bmxpY2Vuc2Uub3JnLz5cbiovXG5cblxuXG5cblxuXG5cbmNvbnN0IGlzT2JqZWN0PSh2YWx1ZSk9Pk9iamVjdCh2YWx1ZSk9PT12YWx1ZTtcblxuLyoqXG4gKiBAdGVtcGxhdGUgW1Q9YW55XVxuICogQHR5cGVkZWYge29iamVjdH0gRGVmZXJyZWRcbiAqIEBwcm9wZXJ0eSB7KHZhbHVlPzogWGltcG9ydChcIi4vdHlwZXMuanNcIikuRVJlZjxUPiApID0+IHZvaWR9IHJlc29sdmVcbiAqIEBwcm9wZXJ0eSB7KGVycj86IGFueSApID0+IHZvaWR9IHJlamVjdFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeyBuZXZlclxuICogIHwge3NldHRsZWQ6IGZhbHNlLCBkZWZlcnJlZHM6IFNldDxEZWZlcnJlZD59XG4gKiAgfCB7c2V0dGxlZDogdHJ1ZSwgZGVmZXJyZWRzPzogdW5kZWZpbmVkfVxuICogfSBQcm9taXNlTWVtb1JlY29yZFxuICovXG5cbi8qIEtleXMgYXJlIHRoZSB2YWx1ZXMgcGFzc2VkIHRvIHJhY2UsIHZhbHVlcyBhcmUgYSByZWNvcmQgb2YgZGF0YSBjb250YWluaW5nIGEqL1xuLyogc2V0IG9mIGRlZmVycmVkcyBhbmQgd2hldGhlciB0aGUgdmFsdWUgaGFzIHNldHRsZWQuKi9cbi8qKiBAdHlwZSB7V2Vha01hcDxvYmplY3QsIFByb21pc2VNZW1vUmVjb3JkPn0gKi9cbmNvbnN0IGtub3duUHJvbWlzZXM9bmV3IFdlYWtNYXAoKTtcblxuLyoqXG4gKiBAcGFyYW0ge1Byb21pc2VNZW1vUmVjb3JkIHwgdW5kZWZpbmVkfSByZWNvcmRcbiAqIEByZXR1cm5zIHtTZXQ8RGVmZXJyZWQ+fVxuICovXG5jb25zdCBtYXJrU2V0dGxlZD0ocmVjb3JkKT0+e1xuaWYoIXJlY29yZHx8cmVjb3JkLnNldHRsZWQpe1xucmV0dXJuIG5ldyBTZXQoKTtcbiB9XG5cbmNvbnN0e2RlZmVycmVkc309cmVjb3JkO1xuT2JqZWN0LmFzc2lnbihyZWNvcmQse1xuZGVmZXJyZWRzOnVuZGVmaW5lZCxcbnNldHRsZWQ6dHJ1ZX0pO1xuXG5PYmplY3QuZnJlZXplKHJlY29yZCk7XG5yZXR1cm4gZGVmZXJyZWRzO1xuIH07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICogQHJldHVybnMge1Byb21pc2VNZW1vUmVjb3JkfVxuICovXG5jb25zdCBnZXRNZW1vUmVjb3JkPSh2YWx1ZSk9PntcbmlmKCFpc09iamVjdCh2YWx1ZSkpe1xuLyogSWYgdGhlIGNvbnRlbmRlciBpcyBhIHByaW1pdGl2ZSwgYXR0ZW1wdGluZyB0byB1c2UgaXQgYXMgYSBrZXkgaW4gdGhlKi9cbi8qIHdlYWttYXAgd291bGQgdGhyb3cgYW4gZXJyb3IuIEx1Y2tpbHksIGl0IGlzIHNhZmUgdG8gY2FsbCovXG4vKiBgUHJvbWlzZS5yZXNvbHZlKGNvbnRlbmRlcikudGhlbmAgb24gYSBwcmltaXRpdmUgdmFsdWUgbXVsdGlwbGUgdGltZXMqL1xuLyogYmVjYXVzZSB0aGUgcHJvbWlzZSBmdWxmaWxscyBpbW1lZGlhdGVseS4gU28gd2UgZmFrZSBhIHNldHRsZWQgcmVjb3JkLiovXG5yZXR1cm4gaGFyZGVuKHtzZXR0bGVkOnRydWV9KTtcbiB9XG5cbmxldCByZWNvcmQ9a25vd25Qcm9taXNlcy5nZXQodmFsdWUpO1xuXG5pZighcmVjb3JkKXtcbnJlY29yZD17ZGVmZXJyZWRzOm5ldyBTZXQoKSxzZXR0bGVkOmZhbHNlfTtcbmtub3duUHJvbWlzZXMuc2V0KHZhbHVlLHJlY29yZCk7XG4vKiBUaGlzIGNhbGwgdG8gYHRoZW5gIGhhcHBlbnMgb25jZSBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSB2YWx1ZS4qL1xuUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKFxuKHZhbCk9PntcbmZvcihjb25zdHtyZXNvbHZlfW9mIG1hcmtTZXR0bGVkKHJlY29yZCkpe1xucmVzb2x2ZSh2YWwpO1xuIH1cbiB9LFxuKGVycik9PntcbmZvcihjb25zdHtyZWplY3R9b2YgbWFya1NldHRsZWQocmVjb3JkKSl7XG5yZWplY3QoZXJyKTtcbiB9XG4gfSk7XG5cbiB9XG5yZXR1cm4gcmVjb3JkO1xuIH07XG5cbmNvbnN0e3JhY2V9PXtcbi8qKlxuICogQ3JlYXRlcyBhIFByb21pc2UgdGhhdCBpcyByZXNvbHZlZCBvciByZWplY3RlZCB3aGVuIGFueSBvZiB0aGUgcHJvdmlkZWQgUHJvbWlzZXMgYXJlIHJlc29sdmVkXG4gKiBvciByZWplY3RlZC5cbiAqXG4gKiBVbmxpa2UgYFByb21pc2UucmFjZWAgaXQgY2xlYW5zIHVwIGFmdGVyIGl0c2VsZiBzbyBhIG5vbi1yZXNvbHZlZCB2YWx1ZSBkb2Vzbid0IGhvbGQgb250b1xuICogdGhlIHJlc3VsdCBwcm9taXNlLlxuICpcbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAdGVtcGxhdGUge1Byb21pc2VDb25zdHJ1Y3Rvcn0gW1A9UHJvbWlzZUNvbnN0cnVjdG9yXVxuICogQHRoaXMge1B9XG4gKiBAcGFyYW0ge0l0ZXJhYmxlPFQ+fSB2YWx1ZXMgQW4gaXRlcmFibGUgb2YgUHJvbWlzZXMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxBd2FpdGVkPFQ+Pn0gQSBuZXcgUHJvbWlzZS5cbiAqL1xucmFjZSh2YWx1ZXMpe1xubGV0IGRlZmVycmVkO1xuLyoqIEB0eXBlIHtUW119ICovXG5jb25zdCBjYWNoZWRWYWx1ZXM9W107XG5jb25zdCBDPXRoaXM7XG5jb25zdCByZXN1bHQ9bmV3IEMoKHJlc29sdmUscmVqZWN0KT0+e1xuZGVmZXJyZWQ9e3Jlc29sdmUscmVqZWN0fTtcbmZvcihjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpe1xuY2FjaGVkVmFsdWVzLnB1c2godmFsdWUpO1xuY29uc3R7c2V0dGxlZCxkZWZlcnJlZHN9PWdldE1lbW9SZWNvcmQodmFsdWUpO1xuaWYoc2V0dGxlZCl7XG4vKiBJZiB0aGUgY29udGVuZGVyIGlzIHNldHRsZWQgKGluY2x1ZGluZyBwcmltaXRpdmVzKSwgaXQgaXMgc2FmZSovXG4vKiB0byBjYWxsIGBQcm9taXNlLnJlc29sdmUodmFsdWUpLnRoZW5gIG9uIGl0LiovXG5DLnJlc29sdmUodmFsdWUpLnRoZW4ocmVzb2x2ZSxyZWplY3QpO1xuIH1lbHNle1xuZGVmZXJyZWRzLmFkZChkZWZlcnJlZCk7XG4gfVxuIH1cbiB9KTtcblxuLyogVGhlIGZpbmFsbHkgY2FsbGJhY2sgZXhlY3V0ZXMgd2hlbiBhbnkgdmFsdWUgc2V0dGxlcywgcHJldmVudGluZyBhbnkgb2YqL1xuLyogdGhlIHVucmVzb2x2ZWQgdmFsdWVzIGZyb20gcmV0YWluaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSByZXNvbHZlZCB2YWx1ZS4qL1xucmV0dXJuIHJlc3VsdC5maW5hbGx5KCgpPT57XG5mb3IoY29uc3QgdmFsdWUgb2YgY2FjaGVkVmFsdWVzKXtcbmNvbnN0e2RlZmVycmVkc309Z2V0TWVtb1JlY29yZCh2YWx1ZSk7XG5pZihkZWZlcnJlZHMpe1xuZGVmZXJyZWRzLmRlbGV0ZShkZWZlcnJlZCk7XG4gfVxuIH1cbiB9KTtcbiB9fTskaOKAjV9vbmNlLnJhY2UocmFjZSk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWVtb1JhY2UiOlsicmFjZSJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAB0DAyPVAcAAFQHAAA1AAAAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Mi9zcmMvcHJvbWlzZS1leGVjdXRvci1raXQuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbIm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCJdLCJyZWV4cG9ydHMiOltdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW10pOyAgIC8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIvPiovXG5cbi8qKlxuICogQHRlbXBsYXRlIFRcbiAqIEBjYWxsYmFjayBQcm9taXNlRXhlY3V0b3IgVGhlIHByb21pc2UgZXhlY3V0b3JcbiAqIEBwYXJhbSB7KHZhbHVlOiBYaW1wb3J0KCcuL3R5cGVzLmpzJykuRVJlZjxUPikgPT4gdm9pZH0gcmVzb2x2ZVxuICogQHBhcmFtIHsocmVhc29uOiBhbnkpID0+IHZvaWR9IHJlamVjdFxuICovXG5cbi8qKlxuICogbWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0KCkgYnVpbGRzIHJlc29sdmUvcmVqZWN0IGZ1bmN0aW9ucyB3aGljaCBkcm9wIHJlZmVyZW5jZXNcbiAqIHRvIHRoZSByZXNvbHZlL3JlamVjdCBmdW5jdGlvbnMgZ2F0aGVyZWQgZnJvbSBhbiBleGVjdXRvciB0byBiZSB1c2VkIHdpdGggYVxuICogcHJvbWlzZSBjb25zdHJ1Y3Rvci5cbiAqXG4gKiBAdGVtcGxhdGUgVFxuICogQHJldHVybnMge1BpY2s8WGltcG9ydCgnLi90eXBlcy5qcycpLlByb21pc2VLaXQ8VD4sICdyZXNvbHZlJyB8ICdyZWplY3QnPiAmIHsgZXhlY3V0b3I6IFByb21pc2VFeGVjdXRvcjxUPn19XG4gKi9cbmNvbnN0ICAgICAgICBtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQ9KCk9Pntcbi8qKiBAdHlwZSB7bnVsbCB8IHVuZGVmaW5lZCB8ICgodmFsdWU6IFhpbXBvcnQoJy4vdHlwZXMuanMnKS5FUmVmPFQ+KSA9PiB2b2lkKX0gKi9cbmxldCBpbnRlcm5hbFJlc29sdmU7XG4vKiogQHR5cGUge251bGwgfCB1bmRlZmluZWQgfCAoKHJlYXNvbjogdW5rbm93bikgPT4gdm9pZCl9ICovXG5sZXQgaW50ZXJuYWxSZWplY3Q7XG5cbi8qKiBAcGFyYW0ge1hpbXBvcnQoJy4vdHlwZXMuanMnKS5FUmVmPFQ+fSB2YWx1ZSAqL1xuY29uc3QgcmVzb2x2ZT0odmFsdWUpPT57XG5pZihpbnRlcm5hbFJlc29sdmUpe1xuaW50ZXJuYWxSZXNvbHZlKHZhbHVlKTtcbmludGVybmFsUmVzb2x2ZT1udWxsO1xuaW50ZXJuYWxSZWplY3Q9bnVsbDtcbiB9ZWxzZXtcbmFzc2VydChpbnRlcm5hbFJlc29sdmU9PT1udWxsKTtcbiB9XG4gfTtcblxuLyoqIEBwYXJhbSB7dW5rbm93bn0gcmVhc29uICovXG5jb25zdCByZWplY3Q9KHJlYXNvbik9PntcbmlmKGludGVybmFsUmVqZWN0KXtcbmludGVybmFsUmVqZWN0KHJlYXNvbik7XG5pbnRlcm5hbFJlc29sdmU9bnVsbDtcbmludGVybmFsUmVqZWN0PW51bGw7XG4gfWVsc2V7XG5hc3NlcnQoaW50ZXJuYWxSZWplY3Q9PT1udWxsKTtcbiB9XG4gfTtcblxuY29uc3QgZXhlY3V0b3I9KHJlcyxyZWopPT57XG5hc3NlcnQoaW50ZXJuYWxSZXNvbHZlPT09dW5kZWZpbmVkJiZpbnRlcm5hbFJlamVjdD09PXVuZGVmaW5lZCk7XG5pbnRlcm5hbFJlc29sdmU9cmVzO1xuaW50ZXJuYWxSZWplY3Q9cmVqO1xuIH07XG5cbnJldHVybiBoYXJkZW4oe3Jlc29sdmUscmVqZWN0LGV4ZWN1dG9yfSk7XG4gfTskaOKAjV9vbmNlLm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdChtYWtlUmVsZWFzaW5nRXhlY3V0b3JLaXQpO1xuaGFyZGVuKG1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCk7XG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnsibWFrZVJlbGVhc2luZ0V4ZWN1dG9yS2l0IjpbIm1ha2VSZWxlYXNpbmdFeGVjdXRvcktpdCJdfSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsDBAoAAAAAAAAAAAC7Vw73HwEAAB8BAAAmAAAAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Mi9zcmMvdHlwZXMuanN7ImltcG9ydHMiOltdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAytetOJgBAACYAQAAHAAAAGplc3NpZS5qcy12MC4zLjIvc3JjL21haW4uanN7ImltcG9ydHMiOlsiLi9yaW5nMC9tYWluLmpzIiwiLi9yaW5nMS9tYWluLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9yaW5nMC9tYWluLmpzIiwiLi9yaW5nMS9tYWluLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9yaW5nMC9tYWluLmpzXCIsIFtdXSxbXCIuL3JpbmcxL21haW4uanNcIiwgW11dXSk7ICAgXG59KVxuIiwiX19saXZlRXhwb3J0TWFwX18iOnt9LCJfX2ZpeGVkRXhwb3J0TWFwX18iOnt9LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAIbCvttIAQAASAEAAB8AAABqZXNzaWUuanMtdjAuMy4yL3NyYy9yaW5nMC9FLmpzeyJpbXBvcnRzIjpbIkBlbmRvL2ZhciJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIkBlbmRvL2ZhciJdLCJfX3N5bmNNb2R1bGVQcm9ncmFtX18iOiIoKHsgICBpbXBvcnRzOiAkaOKAjV9pbXBvcnRzLCAgIGxpdmVWYXI6ICRo4oCNX2xpdmUsICAgb25jZVZhcjogJGjigI1fb25jZSwgICBpbXBvcnRNZXRhOiAkaOKAjV9fX19tZXRhLCAgfSkgPT4geyAgICRo4oCNX2ltcG9ydHMoW1tcIkBlbmRvL2ZhclwiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAuN5BcJQDAACUAwAALAAAAGplc3NpZS5qcy12MC4zLjIvc3JjL3JpbmcwL2FzeW5jLWdlbmVyYXRlLmpzeyJpbXBvcnRzIjpbXSwiZXhwb3J0cyI6WyJhc3luY0dlbmVyYXRlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbXSk7ICAgLyogQHRzLWNoZWNrKi9cblxuLyoqXG4gKiBSZXR1cm4gYW4gYXN5bmMgaXRlcmFibGUgdGhhdCBwcm9kdWNlcyBpdGVyYXRvciByZXN1bHRzIHZpYSBgbmV4dGAuXG4gKlxuICogVGhpcyB3b3JrcyBhcm91bmQgSmVzc2llJ3MgZm9yYmlkZGFuY2Ugb2YgU3ltYm9sLlxuICpcbiAqIEB0ZW1wbGF0ZSBULFRSZXR1cm5cbiAqIEBwYXJhbSB7KCkgPT4gSXRlcmF0b3JSZXN1bHQ8VCwgVFJldHVybj4gfFxuICogICAgICAgICAgICAgICBQcm9taXNlPEl0ZXJhdG9yUmVzdWx0PFQsIFRSZXR1cm4+PlxuICogfSBuZXh0IHByb2R1Y2UgYSBzaW5nbGUtc3RlcCBpdGVyYXRvciByZXN1bHRcbiAqIEByZXR1cm5zIHtBc3luY0l0ZXJhYmxlPFQ+fVxuICovXG5jb25zdCAgICAgICAgYXN5bmNHZW5lcmF0ZT0obmV4dCk9PntcbnJldHVybiBoYXJkZW4oe1xuW1N5bWJvbC5hc3luY0l0ZXJhdG9yXTooKT0+e1xucmV0dXJuIGhhcmRlbih7XG5uZXh0OmFzeW5jKCk9PmhhcmRlbihuZXh0KCkpfSk7XG5cbiB9fSk7XG5cbiB9OyRo4oCNX29uY2UuYXN5bmNHZW5lcmF0ZShhc3luY0dlbmVyYXRlKTtcbmhhcmRlbihhc3luY0dlbmVyYXRlKTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJhc3luY0dlbmVyYXRlIjpbImFzeW5jR2VuZXJhdGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAx53YNbsBAAC7AQAAIgAAAGplc3NpZS5qcy12MC4zLjIvc3JjL3JpbmcwL21haW4uanN7ImltcG9ydHMiOlsiLi9FLmpzIiwiLi9hc3luYy1nZW5lcmF0ZS5qcyIsIi4vbWFrZXJzLmpzIl0sImV4cG9ydHMiOltdLCJyZWV4cG9ydHMiOlsiLi9FLmpzIiwiLi9hc3luYy1nZW5lcmF0ZS5qcyIsIi4vbWFrZXJzLmpzIl0sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgJGjigI1faW1wb3J0cyhbW1wiLi9FLmpzXCIsIFtdXSxbXCIuL21ha2Vycy5qc1wiLCBbXV0sW1wiLi9hc3luYy1nZW5lcmF0ZS5qc1wiLCBbXV1dKTsgICBcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6e30sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAwxAVss4IAADOCAAAJAAAAGplc3NpZS5qcy12MC4zLjIvc3JjL3JpbmcwL21ha2Vycy5qc3siaW1wb3J0cyI6W10sImV4cG9ydHMiOlsibWFrZU1hcCIsIm1ha2VQcm9taXNlIiwibWFrZVNldCIsIm1ha2VXZWFrTWFwIiwibWFrZVdlYWtTZXQiXSwicmVleHBvcnRzIjpbXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtdKTsgICAvKiBAdHMtY2hlY2sqL1xuLyogVGhlc2Ugd29yayBhcm91bmQgSmVzc2llJ3MgZm9yYmlkZGFuY2Ugb2YgYG5ld2AuKi9cbi8qLyA8cmVmZXJlbmNlIHR5cGVzPVwic2VzXCIgLz4qL1xuXG4vKiogQHR5cGUgezxUPihleGVjdXRvcjogKHJlc29sdmU6ICh2YWx1ZTogVCkgPT4gdm9pZCwgcmVqZWN0OiAocmVhc29uPzogYW55KSA9PlxuICogdm9pZCkgPT4gdm9pZCkgPT4gUHJvbWlzZTxUPn0gKi9cbmNvbnN0ICAgICAgICBtYWtlUHJvbWlzZT0oZXhlY3V0b3IpPT5oYXJkZW4obmV3IFByb21pc2UoZXhlY3V0b3IpKTskaOKAjV9vbmNlLm1ha2VQcm9taXNlKG1ha2VQcm9taXNlKTtcbmhhcmRlbihtYWtlUHJvbWlzZSk7XG5cbi8qKiBAdHlwZWRlZiB7PEssIFY+KGVudHJpZXM/OiByZWFkb25seSAocmVhZG9ubHkgW0ssIFZdKVtdKSA9PiBNYXA8SywgVj59IE1hcEZyb21FbnRyaWVzICovXG4vKiogQHR5cGVkZWYgezxLLCBWPihpdGVyYWJsZTogSXRlcmFibGU8cmVhZG9ubHkgW0ssIFZdPikgPT4gTWFwPEssIFY+fSBNYXBGcm9tSXRlcmFibGUgKi9cblxuLyoqIEB0eXBlIHtNYXBGcm9tRW50cmllcyAmIE1hcEZyb21JdGVyYWJsZX0gKi9cbmNvbnN0ICAgICAgICBtYWtlTWFwPShlbnRyaWVzT3JJdGVyYWJsZSk9PmhhcmRlbihuZXcgTWFwKGVudHJpZXNPckl0ZXJhYmxlKSk7JGjigI1fb25jZS5tYWtlTWFwKG1ha2VNYXApO1xuaGFyZGVuKG1ha2VNYXApO1xuXG4vKiogQHR5cGVkZWYgezxUPih2YWx1ZXM/OiByZWFkb25seSBUW10pID0+IFNldDxUPn0gU2V0RnJvbVZhbHVlcyAqL1xuLyoqIEB0eXBlZGVmIHs8VD4oaXRlcmFibGU6IEl0ZXJhYmxlPFQ+KSA9PiBTZXQ8VD59IFNldEZyb21JdGVyYWJsZSAqL1xuLyoqIEB0eXBlIHtTZXRGcm9tVmFsdWVzICYgU2V0RnJvbUl0ZXJhYmxlfSAqL1xuY29uc3QgICAgICAgIG1ha2VTZXQ9KHZhbHVlcyk9PmhhcmRlbihuZXcgU2V0KHZhbHVlcykpOyRo4oCNX29uY2UubWFrZVNldChtYWtlU2V0KTtcbmhhcmRlbihtYWtlU2V0KTtcblxuLyoqIEB0eXBlZGVmIHs8SyBleHRlbmRzIHt9LCBWID0gYW55PihlbnRyaWVzPzogcmVhZG9ubHkgW0ssIFZdW10gfCBudWxsKSA9PiBXZWFrTWFwPEssIFY+fSBXZWFrTWFwRnJvbUVudHJpZXMgKi9cbi8qKiBAdHlwZWRlZiB7PEsgZXh0ZW5kcyB7fSwgVj4oaXRlcmFibGU6IEl0ZXJhYmxlPFtLLCBWXT4pID0+IFdlYWtNYXA8SywgVj59IFdlYWtNYXBGcm9tSXRlcmFibGUgKi9cbi8qKiBAdHlwZSB7V2Vha01hcEZyb21FbnRyaWVzICYgV2Vha01hcEZyb21JdGVyYWJsZX0gKi9cbmNvbnN0ICAgICAgICBtYWtlV2Vha01hcD0oZW50cmllcyk9PmhhcmRlbihuZXcgV2Vha01hcChlbnRyaWVzKSk7JGjigI1fb25jZS5tYWtlV2Vha01hcChtYWtlV2Vha01hcCk7XG5oYXJkZW4obWFrZVdlYWtNYXApO1xuXG4vKiogQHR5cGVkZWYgezxUIGV4dGVuZHMge30+KHZhbHVlcz86IHJlYWRvbmx5IFRbXSkgPT4gV2Vha1NldDxUPn0gV2Vha1NldEZyb21WYWx1ZXMgKi9cbi8qKiBAdHlwZWRlZiB7PFQgZXh0ZW5kcyB7fT4oaXRlcmFibGU6IEl0ZXJhYmxlPFQ+KSA9PiBXZWFrU2V0PFQ+fSBXZWFrU2V0RnJvbUl0ZXJhYmxlICovXG4vKiogQHR5cGUge1dlYWtTZXRGcm9tVmFsdWVzICYgV2Vha1NldEZyb21JdGVyYWJsZX0gKi9cbmNvbnN0ICAgICAgICBtYWtlV2Vha1NldD0odmFsdWVzKT0+aGFyZGVuKG5ldyBXZWFrU2V0KHZhbHVlcykpOyRo4oCNX29uY2UubWFrZVdlYWtTZXQobWFrZVdlYWtTZXQpO1xuaGFyZGVuKG1ha2VXZWFrU2V0KTtcbn0pXG4iLCJfX2xpdmVFeHBvcnRNYXBfXyI6e30sIl9fZml4ZWRFeHBvcnRNYXBfXyI6eyJtYWtlUHJvbWlzZSI6WyJtYWtlUHJvbWlzZSJdLCJtYWtlTWFwIjpbIm1ha2VNYXAiXSwibWFrZVNldCI6WyJtYWtlU2V0Il0sIm1ha2VXZWFrTWFwIjpbIm1ha2VXZWFrTWFwIl0sIm1ha2VXZWFrU2V0IjpbIm1ha2VXZWFrU2V0Il19LCJfX25lZWRzSW1wb3J0TWV0YV9fIjpmYWxzZX1QSwMECgAAAAAAAAAAAJmM4vLpBAAA6QQAACkAAABqZXNzaWUuanMtdjAuMy4yL3NyYy9yaW5nMS9hc3luYy10b29scy5qc3siaW1wb3J0cyI6WyIuLi9yaW5nMC9tYWluLmpzIl0sImV4cG9ydHMiOlsiYXN5bmNEb1doaWxlIl0sInJlZXhwb3J0cyI6W10sIl9fc3luY01vZHVsZVByb2dyYW1fXyI6IigoeyAgIGltcG9ydHM6ICRo4oCNX2ltcG9ydHMsICAgbGl2ZVZhcjogJGjigI1fbGl2ZSwgICBvbmNlVmFyOiAkaOKAjV9vbmNlLCAgIGltcG9ydE1ldGE6ICRo4oCNX19fX21ldGEsICB9KSA9PiB7ICAgbGV0IG1ha2VQcm9taXNlOyRo4oCNX2ltcG9ydHMoW1tcIi4uL3JpbmcwL21haW4uanNcIiwgW1tcIm1ha2VQcm9taXNlXCIsIFskaOKAjV9hID0+IChtYWtlUHJvbWlzZSA9ICRo4oCNX2EpXV1dXV0pOyAgIFxuXG5cblxuLyoqXG4gKiBSZXNvbHZlIHJldHVybmVkIHByb21pc2Ugd2l0aCB1bmRlZmluZWQgd2hlbiBgYm9keWAgcmV0dXJucyBmYWxzeS5cbiAqXG4gKiBUaGlzIHdvcmtzIGFyb3VuZCBKZXNzaWUncyBmb3JiaWRkYW5jZSBvZiBgYXdhaXRgIG5vdCBhdCB0aGUgZnVuY3Rpb24tbGV2ZWwuXG4gKlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7KCkgPT4gVCB8IFByb21pc2U8VD59IGJvZHkgcGVyZm9ybSBzaWRlLWVmZmVjdHMsIGFuZCByZXR1cm4gdHJ1dGh5IGlmXG4gKiB3ZSBzaG91bGQgcnVuIGFnYWluXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn1cbiAqL1xuY29uc3QgICAgICAgIGFzeW5jRG9XaGlsZT0oYm9keSk9PntcbmNvbnN0IGxvb3A9YXN5bmMocmVzb2x2ZSxyZWplY3QpPT57XG5jb25zdCBkb0NvbnRpbnVlPWF3YWl0IGJvZHkoKTtcbmlmKCFkb0NvbnRpbnVlKXtcbi8qIFJlc29sdmUgdGhlIG91dGVybW9zdCBwcm9taXNlLiovXG5yZXNvbHZlKHVuZGVmaW5lZCk7XG5yZXR1cm47XG4gfVxuXG4vKiBEbyB0aGUgbG9vcCBhZ2Fpbi4gIFdlIGFyZSBjYXJlZnVsIG5vdCB0byBhd2FpdCBzbyB0aGF0IHdlIGRvbid0IGNyZWF0ZSBhKi9cbi8qIHByb21pc2UgY2hhaW4uKi9cbmxvb3AocmVzb2x2ZSxyZWplY3QpLmNhdGNoKHJlamVjdCk7XG4gfTtcblxucmV0dXJuIG1ha2VQcm9taXNlKChyZXNvbHZlLHJlamVjdCk9Pmxvb3AocmVzb2x2ZSxyZWplY3QpLmNhdGNoKHJlamVjdCkpO1xuIH07JGjigI1fb25jZS5hc3luY0RvV2hpbGUoYXN5bmNEb1doaWxlKTtcbmhhcmRlbihhc3luY0RvV2hpbGUpO1xufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7ImFzeW5jRG9XaGlsZSI6WyJhc3luY0RvV2hpbGUiXX0sIl9fbmVlZHNJbXBvcnRNZXRhX18iOmZhbHNlfVBLAwQKAAAAAAAAAAAAJcK18V0BAABdAQAAIgAAAGplc3NpZS5qcy12MC4zLjIvc3JjL3JpbmcxL21haW4uanN7ImltcG9ydHMiOlsiLi9hc3luYy10b29scy5qcyJdLCJleHBvcnRzIjpbXSwicmVleHBvcnRzIjpbIi4vYXN5bmMtdG9vbHMuanMiXSwiX19zeW5jTW9kdWxlUHJvZ3JhbV9fIjoiKCh7ICAgaW1wb3J0czogJGjigI1faW1wb3J0cywgICBsaXZlVmFyOiAkaOKAjV9saXZlLCAgIG9uY2VWYXI6ICRo4oCNX29uY2UsICAgaW1wb3J0TWV0YTogJGjigI1fX19fbWV0YSwgIH0pID0+IHsgICAkaOKAjV9pbXBvcnRzKFtbXCIuL2FzeW5jLXRvb2xzLmpzXCIsIFtdXV0pOyAgIFxufSlcbiIsIl9fbGl2ZUV4cG9ydE1hcF9fIjp7fSwiX19maXhlZEV4cG9ydE1hcF9fIjp7fSwiX19uZWVkc0ltcG9ydE1ldGFfXyI6ZmFsc2V9UEsBAh4DCgAAAAAAAAAAABiBIylD/wAAQ/8AABQAAAAAAAAAAAAAAKSBAAAAAGNvbXBhcnRtZW50LW1hcC5qc29uUEsBAh4DCgAAAAAAAAAAAIhDF8IuCwAALgsAACMAAAAAAAAAAAAAAKSBdf8AAEBhZ29yaWMvYXNzZXJ0LXYwLjUuMS9zcmMvYXNzZXJ0LmpzUEsBAh4DCgAAAAAAAAAAAAPpI5TFLgAAxS4AACIAAAAAAAAAAAAAAKSB5AoBAEBhZ29yaWMvYXNzZXJ0LXYwLjUuMS9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAXc3uDlcBAABXAQAAIAAAAAAAAAAAAAAApIHpOQEAQGFnb3JpYy9lcnRwLXYwLjE1LjMvZXhwb3J0ZWQuanNQSwECHgMKAAAAAAAAAAAAZxF0nbU3AAC1NwAAJgAAAAAAAAAAAAAApIF+OwEAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL2Ftb3VudE1hdGguanNQSwECHgMKAAAAAAAAAAAA7h+P6LwFAAC8BQAAJwAAAAAAAAAAAAAApIF3cwEAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL2Rpc3BsYXlJbmZvLmpzUEsBAh4DCgAAAAAAAAAAAMm9LDjTAQAA0wEAACEAAAAAAAAAAAAAAKSBeHkBAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAAD3PQYogyAAAIMgAAAlAAAAAAAAAAAAAACkgYp7AQBAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvaXNzdWVyS2l0LmpzUEsBAh4DCgAAAAAAAAAAANcomp39DwAA/Q8AADIAAAAAAAAAAAAAAKSBUJwBAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9sZWdhY3ktcGF5bWVudC1oZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAADEJxIikBQAApAUAADoAAAAAAAAAAAAAAKSBnawBAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9tYXRoSGVscGVycy9jb3B5QmFnTWF0aEhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAnZ+IzrEFAACxBQAAOgAAAAAAAAAAAAAApIGZsgEAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL21hdGhIZWxwZXJzL2NvcHlTZXRNYXRoSGVscGVycy5qc1BLAQIeAwoAAAAAAAAAAAC2LOSgDwYAAA8GAAA2AAAAAAAAAAAAAACkgaK4AQBAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvbWF0aEhlbHBlcnMvbmF0TWF0aEhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAAkYC5rn8HAAB/BwAANgAAAAAAAAAAAAAApIEFvwEAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL21hdGhIZWxwZXJzL3NldE1hdGhIZWxwZXJzLmpzUEsBAh4DCgAAAAAAAAAAAAsI0hSMBAAAjAQAACMAAAAAAAAAAAAAAKSB2MYBAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9wYXltZW50LmpzUEsBAh4DCgAAAAAAAAAAAEFJ25gJPgAACT4AACkAAAAAAAAAAAAAAKSBpcsBAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9wYXltZW50TGVkZ2VyLmpzUEsBAh4DCgAAAAAAAAAAAPq+y1urDwAAqw8AACEAAAAAAAAAAAAAAKSB9QkCAEBhZ29yaWMvZXJ0cC12MC4xNS4zL3NyYy9wdXJzZS5qc1BLAQIeAwoAAAAAAAAAAADe2zWl+wUAAPsFAAAtAAAAAAAAAAAAAACkgd8ZAgBAYWdvcmljL2VydHAtdjAuMTUuMy9zcmMvdHJhbnNpZW50Tm90aWZpZXIuanNQSwECHgMKAAAAAAAAAAAAxRhX1I4oAACOKAAAJgAAAAAAAAAAAAAApIElIAIAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAAV+iQ9X5BAAB+QQAAKQAAAAAAAAAAAAAApIH3SAIAQGFnb3JpYy9lcnRwLXYwLjE1LjMvc3JjL3R5cGVzLWFtYmllbnQuanNQSwECHgMKAAAAAAAAAAAAXc3uDlcBAABXAQAAJQAAAAAAAAAAAAAApIG8igIAQGFnb3JpYy9nb3Zlcm5hbmNlLXYwLjkuMS9leHBvcnRlZC5qc1BLAQIeAwoAAAAAAAAAAACSif7VDF4AAAxeAAAuAAAAAAAAAAAAAACkgVaMAgBAYWdvcmljL2dvdmVybmFuY2UtdjAuOS4xL3NyYy90eXBlcy1hbWJpZW50LmpzUEsBAh4DCgAAAAAAAAAAAAMPLDVHFAAARxQAADoAAAAAAAAAAAAAAKSBruoCAEBhZ29yaWMvaW50ZXItcHJvdG9jb2wtdjAuMTMuMS9zcmMvZWNvbkNvbW1pdHRlZUNoYXJ0ZXIuanNQSwECHgMKAAAAAAAAAAAAgO+ZRPMFAADzBQAAJQAAAAAAAAAAAAAApIFN/wIAQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEvc3JjL2NvbmZpZy5qc1BLAQIeAwoAAAAAAAAAAABENUIhoQQAAKEEAAAkAAAAAAAAAAAAAACkgYMFAwBAYWdvcmljL2ludGVybmFsLXYwLjIuMS9zcmMvZGVidWcuanNQSwECHgMKAAAAAAAAAAAAxjCg3y4CAAAuAgAAJAAAAAAAAAAAAAAApIFmCgMAQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEvc3JjL2luZGV4LmpzUEsBAh4DCgAAAAAAAAAAAE2lq7PYHAAA2BwAAC8AAAAAAAAAAAAAAKSB1gwDAEBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xL3NyYy9saWItY2hhaW5TdG9yYWdlLmpzUEsBAh4DCgAAAAAAAAAAAOjrlFL8DgAA/A4AACsAAAAAAAAAAAAAAKSB+ykDAEBhZ29yaWMvaW50ZXJuYWwtdjAuMi4xL3NyYy9tZXRob2QtdG9vbHMuanNQSwECHgMKAAAAAAAAAAAAsnjEEC0CAAAtAgAAKQAAAAAAAAAAAAAApIFAOQMAQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAAzwFitb8wAAC/MAAAJAAAAAAAAAAAAAAApIG0OwMAQGFnb3JpYy9pbnRlcm5hbC12MC4yLjEvc3JjL3V0aWxzLmpzUEsBAh4DCgAAAAAAAAAAAF3N7g5XAQAAVwEAACMAAAAAAAAAAAAAAKSBtWwDAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL2V4cG9ydGVkLmpzUEsBAh4DCgAAAAAAAAAAAIjIaJy9EgAAvRIAADMAAAAAAAAAAAAAAKSBTW4DAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9hc3luY0l0ZXJhYmxlQWRhcHRvci5qc1BLAQIeAwoAAAAAAAAAAADQNydkswoAALMKAAAkAAAAAAAAAAAAAACkgVuBAwBAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAOpoockkYAABJGAAAJwAAAAAAAAAAAAAApIFQjAMAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL25vdGlmaWVyLmpzUEsBAh4DCgAAAAAAAAAAADLasXEHLwAABy8AACoAAAAAAAAAAAAAAKSB3qQDAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9wdWJsaXNoLWtpdC5qc1BLAQIeAwoAAAAAAAAAAADHo8Uj4wkAAOMJAAAuAAAAAAAAAAAAAACkgS3UAwBAYWdvcmljL25vdGlmaWVyLXYwLjUuMS9zcmMvc3RvcmVkLW5vdGlmaWVyLmpzUEsBAh4DCgAAAAAAAAAAAPTDcWR4DAAAeAwAACsAAAAAAAAAAAAAAKSBXN4DAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9zdG9yZWQtdG9waWMuanNQSwECHgMKAAAAAAAAAAAAHwUHayUiAAAlIgAAJwAAAAAAAAAAAAAApIEd6wMAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL3N0b3Jlc3ViLmpzUEsBAh4DCgAAAAAAAAAAADDTPAY0GAAANBgAACgAAAAAAAAAAAAAAKSBhw0EAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy9zdWJzY3JpYmUuanNQSwECHgMKAAAAAAAAAAAApIa3j6wLAACsCwAAKQAAAAAAAAAAAAAApIEBJgQAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL3N1YnNjcmliZXIuanNQSwECHgMKAAAAAAAAAAAAM/x5GPMFAADzBQAAJAAAAAAAAAAAAAAApIH0MQQAQGFnb3JpYy9ub3RpZmllci12MC41LjEvc3JjL3RvcGljLmpzUEsBAh4DCgAAAAAAAAAAAGNGw7teKgAAXioAACwAAAAAAAAAAAAAAKSBKTgEAEBhZ29yaWMvbm90aWZpZXItdjAuNS4xL3NyYy90eXBlcy1hbWJpZW50LmpzUEsBAh4DCgAAAAAAAAAAANbWKjOVAQAAlQEAACAAAAAAAAAAAAAAAKSB0WIEAEBhZ29yaWMvc3RvcmUtdjAuOC4zL2V4cG9ydGVkLmpzUEsBAh4DCgAAAAAAAAAAAHn0upjoGwAA6BsAACEAAAAAAAAAAAAAAKSBpGQEAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAABH8+Dqe0QAAHtEAAApAAAAAAAAAAAAAACkgcuABABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMva2V5cy9jaGVja0tleS5qc1BLAQIeAwoAAAAAAAAAAAArf4Jz4hoAAOIaAAAsAAAAAAAAAAAAAACkgY3FBABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMva2V5cy9jb21wYXJlS2V5cy5qc1BLAQIeAwoAAAAAAAAAAAAtvE4RGxMAABsTAAAoAAAAAAAAAAAAAACkgbngBABAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMva2V5cy9jb3B5QmFnLmpzUEsBAh4DCgAAAAAAAAAAAKJ8YRiUDwAAlA8AACgAAAAAAAAAAAAAAKSBGvQEAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9rZXlzL2NvcHlTZXQuanNQSwECHgMKAAAAAAAAAAAApI9mP74kAAC+JAAANAAAAAAAAAAAAAAApIH0AwUAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL2tleXMvbWVyZ2UtYmFnLW9wZXJhdG9ycy5qc1BLAQIeAwoAAAAAAAAAAADQmXCH4ycAAOMnAAA0AAAAAAAAAAAAAACkgQQpBQBAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMva2V5cy9tZXJnZS1zZXQtb3BlcmF0b3JzLmpzUEsBAh4DCgAAAAAAAAAAAMIJ83kJCwAACQsAACwAAAAAAAAAAAAAAKSBOVEFAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9sZWdhY3kvbGVnYWN5TWFwLmpzUEsBAh4DCgAAAAAAAAAAAFrLlgatBgAArQYAADAAAAAAAAAAAAAAAKSBjFwFAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9sZWdhY3kvbGVnYWN5V2Vha01hcC5qc1BLAQIeAwoAAAAAAAAAAAD29iQutBQAALQUAAAvAAAAAAAAAAAAAACkgYdjBQBAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvcGF0dGVybnMvZXhvLW1ha2Vycy5qc1BLAQIeAwoAAAAAAAAAAAAgzF3WMyIAADMiAAAuAAAAAAAAAAAAAACkgYh4BQBAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvcGF0dGVybnMvZXhvLXRvb2xzLmpzUEsBAh4DCgAAAAAAAAAAAKJ1R3y1BwAAtQcAADMAAAAAAAAAAAAAAKSBB5sFAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9wYXR0ZXJucy9pbnRlcm5hbC10eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAD7TT8Oy7sAAMu7AAA0AAAAAAAAAAAAAACkgQ2jBQBAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvcGF0dGVybnMvcGF0dGVybk1hdGNoZXJzLmpzUEsBAh4DCgAAAAAAAAAAAF8GszVuFgAAbhYAADEAAAAAAAAAAAAAAKSBKl8GAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy9zdG9yZXMvc2NhbGFyTWFwU3RvcmUuanNQSwECHgMKAAAAAAAAAAAA/Rvdg5kPAACZDwAAMQAAAAAAAAAAAAAApIHndQYAQGFnb3JpYy9zdG9yZS12MC44LjMvc3JjL3N0b3Jlcy9zY2FsYXJTZXRTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAABYkblt7hIAAO4SAAA1AAAAAAAAAAAAAACkgc+FBgBAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvc3RvcmVzL3NjYWxhcldlYWtNYXBTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAABKRpv9jw4AAI8OAAA1AAAAAAAAAAAAAACkgRCZBgBAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvc3RvcmVzL3NjYWxhcldlYWtTZXRTdG9yZS5qc1BLAQIeAwoAAAAAAAAAAADxEp10/xQAAP8UAAAuAAAAAAAAAAAAAACkgfKnBgBAYWdvcmljL3N0b3JlLXYwLjguMy9zcmMvc3RvcmVzL3N0b3JlLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAADy8K6EAhQAAAIUAACEAAAAAAAAAAAAAAKSBPb0GAEBhZ29yaWMvc3RvcmUtdjAuOC4zL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAC7Vw73HwEAAB8BAAAoAAAAAAAAAAAAAACkgXxCBwBAYWdvcmljL3N3aW5nc2V0LXZhdC12MC4zMC4yL2V4cG9ydGVkLmpzUEsBAh4DCgAAAAAAAAAAAH/8s2KqAQAAqgEAABwAAAAAAAAAAAAAAKSB4UMHAEBhZ29yaWMvdGltZS12MC4yLjEvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAD+5aFoQgAACEIAAAIwAAAAAAAAAAAAAApIHFRQcAQGFnb3JpYy90aW1lLXYwLjIuMS9zcmMvdGltZU1hdGguanNQSwECHgMKAAAAAAAAAAAA0kaFHZIHAACSBwAAJQAAAAAAAAAAAAAApIGKZgcAQGFnb3JpYy90aW1lLXYwLjIuMS9zcmMvdHlwZUd1YXJkcy5qc1BLAQIeAwoAAAAAAAAAAADFimbD/ygAAP8oAAAoAAAAAAAAAAAAAACkgV9uBwBAYWdvcmljL3ZhdC1kYXRhLXYwLjQuMy9zcmMvZXhvLXV0aWxzLmpzUEsBAh4DCgAAAAAAAAAAADfjjLJlEwAAZRMAACQAAAAAAAAAAAAAAKSBpJcHAEBhZ29yaWMvdmF0LWRhdGEtdjAuNC4zL3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAADTSXUOTyUAAE8lAAAwAAAAAAAAAAAAAACkgUurBwBAYWdvcmljL3ZhdC1kYXRhLXYwLjQuMy9zcmMvdmF0LWRhdGEtYmluZGluZ3MuanNQSwECHgMKAAAAAAAAAAAAeMZXlqsDAACrAwAAHwAAAAAAAAAAAAAApIHo0AcAQGFnb3JpYy96b2UtdjAuMjUuMy9leHBvcnRlZC5qc1BLAQIeAwoAAAAAAAAAAABOeFMAECYAABAmAAAuAAAAAAAAAAAAAACkgdDUBwBAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdEZhY2V0L3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAJ25fTuvCwAArwsAADAAAAAAAAAAAAAAAKSBLPsHAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL2NvbnRyYWN0U3VwcG9ydC90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAACp0N89QgcAAEIHAAA1AAAAAAAAAAAAAACkgSkHCABAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdHMvY2FsbFNwcmVhZC90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAADcXpY7owEAAKMBAAAtAAAAAAAAAAAAAACkgb4OCABAYWdvcmljL3pvZS12MC4yNS4zL3NyYy9jb250cmFjdHMvZXhwb3J0ZWQuanNQSwECHgMKAAAAAAAAAAAAY1/usogaAACIGgAALwAAAAAAAAAAAAAApIGsEAgAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvY29udHJhY3RzL2xvYW4vdHlwZXMuanNQSwECHgMKAAAAAAAAAAAAtlDtT70LAAC9CwAAKgAAAAAAAAAAAAAApIGBKwgAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvY29udHJhY3RzL3R5cGVzLmpzUEsBAh4DCgAAAAAAAAAAAFRHQeUSQwAAEkMAACUAAAAAAAAAAAAAAKSBhjcIAEBhZ29yaWMvem9lLXYwLjI1LjMvc3JjL3R5cGVHdWFyZHMuanNQSwECHgMKAAAAAAAAAAAAfqSfx2sHAABrBwAAIAAAAAAAAAAAAAAApIHbeggAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvdHlwZXMuanNQSwECHgMKAAAAAAAAAAAApCwAhLosAAC6LAAAKwAAAAAAAAAAAAAApIGEgggAQGFnb3JpYy96b2UtdjAuMjUuMy9zcmMvem9lU2VydmljZS90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAAWydfnbRUAAG0VAAAqAAAAAAAAAAAAAACkgYevCABAYWdvcmljL3pvZS12MC4yNS4zL3Rvb2xzL3R5cGVzLWFtYmllbnQuanNQSwECHgMKAAAAAAAAAAAA+g/tX+sRAADrEQAAJAAAAAAAAAAAAAAApIE8xQgAQGVuZG8vZXZlbnR1YWwtc2VuZC12MC4xNi44L3NyYy9FLmpzUEsBAh4DCgAAAAAAAAAAAKLUnMsKAgAACgIAACoAAAAAAAAAAAAAAKSBadcIAEBlbmRvL2V2ZW50dWFsLXNlbmQtdjAuMTYuOC9zcmMvbm8tc2hpbS5qc1BLAQIeAwoAAAAAAAAAAADis7Hd2A8AANgPAAAuAAAAAAAAAAAAAACkgbvZCABAZW5kby9ldmVudHVhbC1zZW5kLXYwLjE2Ljgvc3JjL3RyYWNrLXR1cm5zLmpzUEsBAh4DCgAAAAAAAAAAAD7lgF62AgAAtgIAAB4AAAAAAAAAAAAAAKSB3+kIAEBlbmRvL2Zhci12MC4yLjE0L3NyYy9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACE1ofwvxAAAL8QAAAdAAAAAAAAAAAAAACkgdHsCABAZW5kby9tYXJzaGFsLXYwLjguMS9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACqNP2CQgwAAEIMAAArAAAAAAAAAAAAAACkgcv9CABAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvZGVlcGx5RnVsZmlsbGVkLmpzUEsBAh4DCgAAAAAAAAAAAA0/k/e7QwAAu0MAACoAAAAAAAAAAAAAAKSBVgoJAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9lbmNvZGVQYXNzYWJsZS5qc1BLAQIeAwoAAAAAAAAAAAAwwIZwCkAAAApAAAArAAAAAAAAAAAAAACkgVlOCQBAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvZW5jb2RlVG9DYXBEYXRhLmpzUEsBAh4DCgAAAAAAAAAAAMAaDCF5PQAAeT0AAC0AAAAAAAAAAAAAAKSBrI4JAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9lbmNvZGVUb1NtYWxsY2Fwcy5qc1BLAQIeAwoAAAAAAAAAAACmyhdk6AYAAOgGAAAtAAAAAAAAAAAAAACkgXDMCQBAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9jb3B5QXJyYXkuanNQSwECHgMKAAAAAAAAAAAAk4cFYdMHAADTBwAALgAAAAAAAAAAAAAApIGj0wkAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvY29weVJlY29yZC5qc1BLAQIeAwoAAAAAAAAAAAAMmaTaYBEAAGARAAApAAAAAAAAAAAAAACkgcLbCQBAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9lcnJvci5qc1BLAQIeAwoAAAAAAAAAAADRMbrZRggAAEYIAAAwAAAAAAAAAAAAAACkgWntCQBAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9pdGVyLWhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAADALqJ/QZAAD0GQAANQAAAAAAAAAAAAAApIH99QkAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvcGFzc1N0eWxlLWhlbHBlcnMuanNQSwECHgMKAAAAAAAAAAAABPJsPvYfAAD2HwAALQAAAAAAAAAAAAAApIFEEAoAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvcmVtb3RhYmxlLmpzUEsBAh4DCgAAAAAAAAAAABTGqsGKDwAAig8AADAAAAAAAAAAAAAAAKSBhTAKAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9oZWxwZXJzL3NhZmUtcHJvbWlzZS5qc1BLAQIeAwoAAAAAAAAAAABlE/1ouRIAALkSAAAqAAAAAAAAAAAAAACkgV1ACgBAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvaGVscGVycy9zeW1ib2wuanNQSwECHgMKAAAAAAAAAAAACrS51uAHAADgBwAAKgAAAAAAAAAAAAAApIFeUwoAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL2hlbHBlcnMvdGFnZ2VkLmpzUEsBAh4DCgAAAAAAAAAAABGaO1D0GAAA9BgAACQAAAAAAAAAAAAAAKSBhlsKAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9tYWtlLWZhci5qc1BLAQIeAwoAAAAAAAAAAABb8wNnKQQAACkEAAAmAAAAAAAAAAAAAACkgbx0CgBAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvbWFrZVRhZ2dlZC5qc1BLAQIeAwoAAAAAAAAAAADQJQ6LvCgAALwoAAAqAAAAAAAAAAAAAACkgSl5CgBAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvbWFyc2hhbC1qdXN0aW4uanNQSwECHgMKAAAAAAAAAAAAMteTRcMGAADDBgAALQAAAAAAAAAAAAAApIEtogoAQGVuZG8vbWFyc2hhbC12MC44LjEvc3JjL21hcnNoYWwtc3RyaW5naWZ5LmpzUEsBAh4DCgAAAAAAAAAAAGnf3flVMgAAVTIAACMAAAAAAAAAAAAAAKSBO6kKAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9tYXJzaGFsLmpzUEsBAh4DCgAAAAAAAAAAAEFns3kCHAAAAhwAACcAAAAAAAAAAAAAAKSB0dsKAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy9wYXNzU3R5bGVPZi5qc1BLAQIeAwoAAAAAAAAAAABYoj/ms0kAALNJAAAlAAAAAAAAAAAAAACkgRj4CgBAZW5kby9tYXJzaGFsLXYwLjguMS9zcmMvcmFua09yZGVyLmpzUEsBAh4DCgAAAAAAAAAAAII52ZMDDQAAAw0AACYAAAAAAAAAAAAAAKSBDkILAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy90eXBlR3VhcmRzLmpzUEsBAh4DCgAAAAAAAAAAALtXDvcfAQAAHwEAACEAAAAAAAAAAAAAAKSBVU8LAEBlbmRvL21hcnNoYWwtdjAuOC4xL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAAD/CipPugsAALoLAAAeAAAAAAAAAAAAAACkgbNQCwBAZW5kby9uYXQtdjQuMS4yNC9zcmMvaW5kZXguanNQSwECHgMKAAAAAAAAAAAAR28qx1sJAABbCQAAIgAAAAAAAAAAAAAApIGpXAsAQGVuZG8vcHJvbWlzZS1raXQtdjAuMi41Mi9pbmRleC5qc1BLAQIeAwoAAAAAAAAAAACXiOBbygIAAMoCAAArAAAAAAAAAAAAAACkgURmCwBAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyL3NyYy9pcy1wcm9taXNlLmpzUEsBAh4DCgAAAAAAAAAAAIQRv9OpEgAAqRIAACoAAAAAAAAAAAAAAKSBV2kLAEBlbmRvL3Byb21pc2Uta2l0LXYwLjIuNTIvc3JjL21lbW8tcmFjZS5qc1BLAQIeAwoAAAAAAAAAAAB0DAyPVAcAAFQHAAA1AAAAAAAAAAAAAACkgUh8CwBAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyL3NyYy9wcm9taXNlLWV4ZWN1dG9yLWtpdC5qc1BLAQIeAwoAAAAAAAAAAAC7Vw73HwEAAB8BAAAmAAAAAAAAAAAAAACkge+DCwBAZW5kby9wcm9taXNlLWtpdC12MC4yLjUyL3NyYy90eXBlcy5qc1BLAQIeAwoAAAAAAAAAAADK1604mAEAAJgBAAAcAAAAAAAAAAAAAACkgVKFCwBqZXNzaWUuanMtdjAuMy4yL3NyYy9tYWluLmpzUEsBAh4DCgAAAAAAAAAAAIbCvttIAQAASAEAAB8AAAAAAAAAAAAAAKSBJIcLAGplc3NpZS5qcy12MC4zLjIvc3JjL3JpbmcwL0UuanNQSwECHgMKAAAAAAAAAAAAuN5BcJQDAACUAwAALAAAAAAAAAAAAAAApIGpiAsAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzAvYXN5bmMtZ2VuZXJhdGUuanNQSwECHgMKAAAAAAAAAAAAx53YNbsBAAC7AQAAIgAAAAAAAAAAAAAApIGHjAsAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzAvbWFpbi5qc1BLAQIeAwoAAAAAAAAAAADDEBWyzggAAM4IAAAkAAAAAAAAAAAAAACkgYKOCwBqZXNzaWUuanMtdjAuMy4yL3NyYy9yaW5nMC9tYWtlcnMuanNQSwECHgMKAAAAAAAAAAAAmYzi8ukEAADpBAAAKQAAAAAAAAAAAAAApIGSlwsAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzEvYXN5bmMtdG9vbHMuanNQSwECHgMKAAAAAAAAAAAAJcK18V0BAABdAQAAIgAAAAAAAAAAAAAApIHCnAsAamVzc2llLmpzLXYwLjMuMi9zcmMvcmluZzEvbWFpbi5qc1BLBQYAAAAAdwB3AJYoAABfngsAAAA=","endoZipBase64Sha512":"d95f93a55092dd7f5ff56df0a4f48cf0347b1146d5d50f752950e9b0e360eada059b1933db50cea13ceebe6f43d8e02556473a20a239c74dafad7e95ce38a195"};
|