<?xml version="1.0" encoding="utf-8" ?>
<otrs_package version="1.1">
    <Name>CustomerMultitenancy</Name>
    <Version>11.1.1</Version>
    <Vendor>Rother OSS GmbH</Vendor>
    <URL>https://otobo.io/</URL>
    <License>GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007</License>
    <ChangeLog Date="2026-06-26 16:02:20" Version="11.1.1">Initial release for OTOBO 11.1.</ChangeLog>
    <Description Lang="en">Group-based multitenancy for customer and customer user.</Description>
    <Description Lang="de">Gruppenbasierte Mandantenfähigkeit für Kunden und Kundenbenutzer.</Description>
    <Framework>11.1.x</Framework>
    <BuildCommitID>31522f0bf96802d09d24af1b189ba7b2bcf38b05</BuildCommitID>
    <BuildDate>2026-06-26 16:02:23</BuildDate>
    <BuildHost>opms.rother-oss.com</BuildHost>
    <Filelist>
        <File Location="Custom/Kernel/Modules/AdminCustomerCompany.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSA2ZWZkYzdiZjJhMzMyNTI3N2NkNzlhNjBmMGYyNDA3ZjhhZDU5ZTg3IC0gS2VybmVsL01vZHVsZXMvQWRtaW5DdXN0b21lckNvbXBhbnkucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFkbWluQ3VzdG9tZXJDb21wYW55OwoKdXNlIHY1LjI0Owp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSBuYW1lc3BhY2U6OmF1dG9jbGVhbjsKCiMgY29yZSBtb2R1bGVzCnVzZSBMaXN0OjpVdGlsIHF3KGFueSk7CgojIENQQU4gbW9kdWxlcwoKIyBPVE9CTyBtb2R1bGVzCnVzZSBLZXJuZWw6Okxhbmd1YWdlICAgICAgICAgICAgICBxdyhUcmFuc2xhdGFibGUpOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IGJsZXNzIHslUGFyYW19LCAkVHlwZTsKCiAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlncyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBPYmplY3RUeXBlID0+ICdDdXN0b21lckNvbXBhbnknLAogICAgKTsKCiAgICAjIHNldCBwcmVmIGZvciBjb2x1bW5zIGtleQogICAgJFNlbGYtPntQcmVmS2V5SW5jbHVkZUludmFsaWR9ID0gJ0luY2x1ZGVJbnZhbGlkJyAuICctJyAuICRTZWxmLT57QWN0aW9ufTsKCiAgICBteSAlUHJlZmVyZW5jZXMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5HZXRQcmVmZXJlbmNlcygKICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgKTsKCiAgICAkU2VsZi0+e0luY2x1ZGVJbnZhbGlkfSA9ICRQcmVmZXJlbmNlc3sgJFNlbGYtPntQcmVmS2V5SW5jbHVkZUludmFsaWR9IH07CgogICAgJFNlbGYtPntEeW5hbWljRmllbGRMb29rdXB9ID0geyBtYXAgeyAkXy0+e05hbWV9ID0+ICRfIH0gQHskRHluYW1pY0ZpZWxkQ29uZmlnc30gfTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkUGFyYW1PYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgbXkgJE5hdiAgICAgICAgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ05hdicgKSB8fCAwOwogICAgbXkgJE5hdmlnYXRpb25CYXJUeXBlID0gJE5hdiBlcSAnQWdlbnQnID8gJ0N1c3RvbWVycycgOiAnQWRtaW4nOwogICAgbXkgJFNlYXJjaCAgICAgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NlYXJjaCcgKTsKICAgICRTZWFyY2gKICAgICAgICB8fD0gJENvbmZpZ09iamVjdC0+R2V0KCdBZG1pbkN1c3RvbWVyQ29tcGFueTo6UnVuSW5pdGlhbFdpbGRjYXJkU2VhcmNoJykgPyAnKicgOiAnJzsKICAgIG15ICRMYXlvdXRPYmplY3QgICAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQ29tcGFueScpOwoKICAgIG15ICVHZXRQYXJhbTsKICAgICRHZXRQYXJhbXtTb3VyY2V9ICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnU291cmNlJyApIHx8ICdDdXN0b21lckNvbXBhbnknOwogICAgJEdldFBhcmFte0luY2x1ZGVJbnZhbGlkfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJbmNsdWRlSW52YWxpZCcgKTsKCiAgICBpZiAoIGRlZmluZWQgJEdldFBhcmFte0luY2x1ZGVJbnZhbGlkfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5TZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgS2V5ICAgID0+ICRTZWxmLT57UHJlZktleUluY2x1ZGVJbnZhbGlkfSwKICAgICAgICAgICAgVmFsdWUgID0+ICRHZXRQYXJhbXtJbmNsdWRlSW52YWxpZH0sCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPntJbmNsdWRlSW52YWxpZH0gPSAkR2V0UGFyYW17SW5jbHVkZUludmFsaWR9OwogICAgfQoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICMgQ2hlY2sgaWYgdGhlIHVzZXIgaGFzIHBlcm1pc3Npb24gdG8gc2V0IG11bHRpdGVuYW5jeS4KICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdNdWx0aXRlbmFuY3knKSApIHsKICAgICAgICBteSAkR3JvdXBPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKTsKCiAgICAgICAgbXkgJE11bHRpdGVuYW5jeUdyb3VwSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBMb29rdXAoCiAgICAgICAgICAgIEdyb3VwID0+ICRDb25maWdPYmplY3QtPkdldCgnTXVsdGl0ZW5hbmN5OjpQZXJtaXNzaW9uR3JvdXAnKSwKICAgICAgICApOwoKICAgICAgICBteSAlR3JvdXBzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUeXBlICAgPT4gJ3J3JywKICAgICAgICApOwoKICAgICAgICBpZiAoICRHcm91cHN7JE11bHRpdGVuYW5jeUdyb3VwSUR9ICkgewogICAgICAgICAgICAkU2VsZi0+e011bHRpdGVuYW5jeVBlcm1pc3Npb259ID0gMTsKICAgICAgICB9CiAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGNoYW5nZQogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0NoYW5nZScgKSB7CiAgICAgICAgbXkgJEN1c3RvbWVySUQgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lcklEJyApICAgfHwgJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0lEJyApIHx8ICcnOwogICAgICAgIG15ICROb3RpZmljYXRpb24gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnTm90aWZpY2F0aW9uJyApIHx8ICcnOwogICAgICAgIG15ICVEYXRhICAgICAgICAgPSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0LT5DdXN0b21lckNvbXBhbnlHZXQoCiAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJEN1c3RvbWVySUQsCiAgICAgICAgKTsKICAgICAgICAkRGF0YXtDdXN0b21lckNvbXBhbnlJRH0gPSAkQ3VzdG9tZXJJRDsKICAgICAgICBteSAkT3V0cHV0ID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKAogICAgICAgICAgICBUeXBlID0+ICROYXZpZ2F0aW9uQmFyVHlwZSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KCBJbmZvID0+IFRyYW5zbGF0YWJsZSgnQ3VzdG9tZXIgY29tcGFueSB1cGRhdGVkIScpICkKICAgICAgICAgICAgaWYgKCAkTm90aWZpY2F0aW9uICYmICROb3RpZmljYXRpb24gZXEgJ1VwZGF0ZScgKTsKICAgICAgICAkU2VsZi0+X0VkaXQoCiAgICAgICAgICAgIEFjdGlvbiA9PiAnQ2hhbmdlJywKICAgICAgICAgICAgTmF2ICAgID0+ICROYXYsCiAgICAgICAgICAgICVEYXRhLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5DdXN0b21lckNvbXBhbnknLAogICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBjaGFuZ2UgYWN0aW9uCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQ2hhbmdlQWN0aW9uJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgbXkgJUVycm9yczsKICAgICAgICAkR2V0UGFyYW17Q3VzdG9tZXJDb21wYW55SUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVyQ29tcGFueUlEJyApOwoKICAgICAgICBteSBAQ3VzdG9tZXJDb21wYW55TWFwID0gJENvbmZpZ09iamVjdC0+R2V0KCAkR2V0UGFyYW17U291cmNlfSApLT57TWFwfS0+QCo7CgogICAgICAgICMgVGhlIHJlYWRvbmx5IGZpZWxkcyBzaG91bGQgbm90IGJlIHNldHRhYmxlIGZyb20gdGhlIFdlYkFwcC4KICAgICAgICAjIFNvIHVwZGF0ZSB3aXRoIHRoZSBvbGQgdmFsdWVzLCByZWdhcmRsZXNzIHdoYXQgd2FzIHBhc3NlZCBmcm9tIHRoZSBjbGllbnQuCiAgICAgICAgIyBUaGUgb2xkIGRhdGEgaXMgb25seSBuZWVkZWQgd2hlbiB0aGVyZSBhcmUgYW55IHJlYWRvbmx5IGZpZWxkcy4KICAgICAgICBteSAlT2xkRGF0YTsKICAgICAgICBpZiAoIGFueSB7ICRfLT5bN10gfSBAQ3VzdG9tZXJDb21wYW55TWFwICkgewogICAgICAgICAgICAlT2xkRGF0YSA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueUdldCgKICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJEdldFBhcmFte0N1c3RvbWVyQ29tcGFueUlEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgR2V0IGR5bmFtaWMgZmllbGQgYmFja2VuZCBvYmplY3QuCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgICAgIEVOVFJZOgogICAgICAgIGZvciBteSAkRW50cnkgKEBDdXN0b21lckNvbXBhbnlNYXApIHsKCiAgICAgICAgICAgICMgY2hlY2sgZHluYW1pYyBmaWVsZHMKICAgICAgICAgICAgaWYgKCAkRW50cnktPls1XSBlcSAnZHluYW1pY19maWVsZCcgKSB7CgogICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkTG9va3VwfS0+eyAkRW50cnktPlsyXSB9OwoKICAgICAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpICkgewogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiRHluYW1pY0ZpZWxkICRFbnRyeS0+WzJdIG5vdCBmb3VuZCEiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBFTlRSWTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkVmFsaWRhdGlvblJlc3VsdCA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZVZhbGlkYXRlKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ICAgICAgICAgID0+ICRFbnRyeS0+WzRdLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICRWYWxpZGF0aW9uUmVzdWx0LT57U2VydmVyRXJyb3J9ICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnN7ICRFbnRyeS0+WzBdIH0gPSAkVmFsaWRhdGlvblJlc3VsdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICAgICAjIGdlbmVyYXRlIHN0b3JhYmxlIHZhbHVlIG9mIGR5bmFtaWMgZmllbGQgZWRpdCBmaWVsZAogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJEVudHJ5LT5bMF0gfSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgcmV1c2UgdGhlIG9sZCBkYXRhIGZvciByZWFkb25seSBmaWVsZAogICAgICAgICAgICBlbHNpZiAoICRFbnRyeS0+WzddICkgewogICAgICAgICAgICAgICAgJEdldFBhcmFteyAkRW50cnktPlswXSB9ID0gJE9sZERhdGF7ICRFbnRyeS0+WzBdIH07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgcmVtYWluaW5nIG5vbi1keW5hbWljLWZpZWxkIG1hbmRhdG9yeSBmaWVsZHMKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRFbnRyeS0+WzBdIH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkRW50cnktPlswXSApIC8vICcnOwogICAgICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFteyAkRW50cnktPlswXSB9ICYmICRFbnRyeS0+WzRdICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnN7ICRFbnRyeS0+WzBdIC4gJ0ludmFsaWQnIH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoICFkZWZpbmVkICRHZXRQYXJhbXtDdXN0b21lcklEfSApIHsKICAgICAgICAgICAgJEdldFBhcmFte0N1c3RvbWVySUR9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0N1c3RvbWVySUQnICkgfHwgJyc7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGZvciBkdXBsaWNhdGUgZW50cmllcwogICAgICAgIGlmICggJEdldFBhcmFte0N1c3RvbWVyQ29tcGFueUlEfSBuZSAkR2V0UGFyYW17Q3VzdG9tZXJJRH0gKSB7CgogICAgICAgICAgICAjIGdldCBDdXN0b21lckNvbXBhbnkgbGlzdAogICAgICAgICAgICBteSAlTGlzdCA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueUxpc3QoCiAgICAgICAgICAgICAgICBTZWFyY2ggPT4gJFBhcmFte1NlYXJjaH0sCiAgICAgICAgICAgICAgICBWYWxpZCAgPT4gMCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgY2hlY2sgZHVwbGljYXRlIGZpZWxkCiAgICAgICAgICAgIGlmICggJUxpc3QgJiYgJExpc3R7ICRHZXRQYXJhbXtDdXN0b21lcklEfSB9ICkgewogICAgICAgICAgICAgICAgJEVycm9yc3tEdXBsaWNhdGV9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBpZiBubyBlcnJvcnMgb2NjdXJyZWQKICAgICAgICBpZiAoICElRXJyb3JzICkgewoKICAgICAgICAgICAgIyB1cGRhdGUgZ3JvdXAKICAgICAgICAgICAgbXkgJFVwZGF0ZSA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueVVwZGF0ZSggJUdldFBhcmFtLCBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9ICk7CgogICAgICAgICAgICBpZiAoJFVwZGF0ZSkgewoKICAgICAgICAgICAgICAgIG15ICRTZXRERkVycm9yOwoKICAgICAgICAgICAgICAgICMgc2V0IGR5bmFtaWMgZmllbGQgdmFsdWVzCiAgICAgICAgICAgICAgICBFTlRSWToKICAgICAgICAgICAgICAgIGZvciBteSAkRW50cnkgKEBDdXN0b21lckNvbXBhbnlNYXApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IEVOVFJZIGlmICRFbnRyeS0+WzVdIG5lICdkeW5hbWljX2ZpZWxkJzsKCiAgICAgICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkTG9va3VwfS0+eyAkRW50cnktPlsyXSB9OwoKICAgICAgICAgICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFNldERGRXJyb3IgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5mbyA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0R5bmFtaWMgZmllbGQgJXMgbm90IGZvdW5kIScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEVudHJ5LT5bMl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBFTlRSWTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIG15ICRWYWx1ZVNldCA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNldCgKICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgICAgICAgICA9PiAkR2V0UGFyYW17Q3VzdG9tZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkR2V0UGFyYW17ICRFbnRyeS0+WzBdIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJFZhbHVlU2V0ICkgewogICAgICAgICAgICAgICAgICAgICAgICAkU2V0REZFcnJvciAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmZvID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnVW5hYmxlIHRvIHNldCB2YWx1ZSBmb3IgZHluYW1pYyBmaWVsZCAlcyEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFbnRyeS0+WzJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQgRU5UUlk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15ICRDb250aW51ZUFmdGVyU2F2ZSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDb250aW51ZUFmdGVyU2F2ZScgKSB8fCAwOwoKICAgICAgICAgICAgICAgICMgaWYgc2V0IERGIGVycm9yIGV4aXN0cywgY3JlYXRlIG5vdGlmaWNhdGlvbgogICAgICAgICAgICAgICAgaWYgKCRTZXRERkVycm9yKSB7CgogICAgICAgICAgICAgICAgICAgICMgaWYgdGhlIHVzZXIgd291bGQgbGlrZSB0byBjb250aW51ZSBlZGl0aW5nIHRoZSBjdXN0b21lciBjb21wYW55LCBqdXN0IHJlZGlyZWN0IHRvIHRoZSBlZGl0IHNjcmVlbgogICAgICAgICAgICAgICAgICAgIGlmICggJENvbnRpbnVlQWZ0ZXJTYXZlIGVxICcxJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPl9FZGl0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uID0+ICdDaGFuZ2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmF2ICAgID0+ICROYXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvcnMgPT4gXCVFcnJvcnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+X092ZXJ2aWV3KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmF2ICAgID0+ICROYXYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWFyY2ggPT4gJFNlYXJjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAkTmF2aWdhdGlvbkJhclR5cGUsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSggSW5mbyA9PiBUcmFuc2xhdGFibGUoJ0N1c3RvbWVyIGNvbXBhbnkgdXBkYXRlZCEnKSApOwogICAgICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJFNldERGRXJyb3I7CiAgICAgICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5DdXN0b21lckNvbXBhbnknLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBpZiB0aGUgdXNlciB3b3VsZCBsaWtlIHRvIGNvbnRpbnVlIGVkaXRpbmcgdGhlIGN1c3RvbWVyIGNvbXBhbnksIGp1c3QgcmVkaXJlY3QgdG8gdGhlIGVkaXQgc2NyZWVuCiAgICAgICAgICAgICAgICBpZiAoICRDb250aW51ZUFmdGVyU2F2ZSBlcSAnMScgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJEN1c3RvbWVySUQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ3VzdG9tZXJJRCcgKSB8fCAnJzsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICAgICAgICAgIE9QID0+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufTtTdWJhY3Rpb249Q2hhbmdlO0N1c3RvbWVySUQ9IiAuICRMYXlvdXRPYmplY3QtPkxpbmtFbmNvZGUoJEN1c3RvbWVySUQpIC4gIjtOYXY9JE5hdjtOb3RpZmljYXRpb249VXBkYXRlIgogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAgICAgIyBvdGhlcndpc2UgcmV0dXJuIHRvIG92ZXJ2aWV3CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPlJlZGlyZWN0KCBPUCA9PiAiQWN0aW9uPSRTZWxmLT57QWN0aW9ufTtOb3RpZmljYXRpb249VXBkYXRlIiApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNvbWV0aGluZyB3ZW50IHdyb25nCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigKICAgICAgICAgICAgVHlwZSA9PiAkTmF2aWdhdGlvbkJhclR5cGUsCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoIFByaW9yaXR5ID0+ICdFcnJvcicgKTsKCiAgICAgICAgIyBzZXQgbm90aWZpY2F0aW9uIGZvciBkdXBsaWNhdGUgZW50cnkKICAgICAgICBpZiAoICRFcnJvcnN7RHVwbGljYXRlfSApIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgSW5mbyAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdDdXN0b21lciBDb21wYW55ICVzIGFscmVhZHkgZXhpc3RzIScsCiAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFte0N1c3RvbWVySUR9LAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRTZWxmLT5fRWRpdCgKICAgICAgICAgICAgQWN0aW9uID0+ICdDaGFuZ2UnLAogICAgICAgICAgICBOYXYgICAgPT4gJE5hdiwKICAgICAgICAgICAgRXJyb3JzID0+IFwlRXJyb3JzLAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkN1c3RvbWVyQ29tcGFueScsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGFkZAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FkZCcgKSB7CiAgICAgICAgJEdldFBhcmFte05hbWV9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ05hbWUnICk7CiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigKICAgICAgICAgICAgVHlwZSA9PiAkTmF2aWdhdGlvbkJhclR5cGUsCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+X0VkaXQoCiAgICAgICAgICAgIEFjdGlvbiA9PiAnQWRkJywKICAgICAgICAgICAgTmF2ICAgID0+ICROYXYsCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluQ3VzdG9tZXJDb21wYW55JywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgYWRkIGFjdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FkZEFjdGlvbicgKSB7CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgIG15ICVFcnJvcnM7CgogICAgICAgIG15ICRDdXN0b21lckNvbXBhbnlLZXkgPSAkQ29uZmlnT2JqZWN0LT5HZXQoICRHZXRQYXJhbXtTb3VyY2V9ICktPntDdXN0b21lckNvbXBhbnlLZXl9OwogICAgICAgIG15ICRDdXN0b21lckNvbXBhbnlJRDsKCiAgICAgICAgIyBHZXQgZHluYW1pYyBmaWVsZCBiYWNrZW5kIG9iamVjdC4KICAgICAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICAgICAgRU5UUlk6CiAgICAgICAgZm9yIG15ICRFbnRyeSAoIEB7ICRDb25maWdPYmplY3QtPkdldCggJEdldFBhcmFte1NvdXJjZX0gKS0+e01hcH0gfSApIHsKCiAgICAgICAgICAgICMgY2hlY2sgZHluYW1pYyBmaWVsZHMKICAgICAgICAgICAgaWYgKCAkRW50cnktPls1XSBlcSAnZHluYW1pY19maWVsZCcgKSB7CgogICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkTG9va3VwfS0+eyAkRW50cnktPlsyXSB9OwoKICAgICAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpICkgewogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiRHluYW1pY0ZpZWxkICRFbnRyeS0+WzJdIG5vdCBmb3VuZCEiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBFTlRSWTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkVmFsaWRhdGlvblJlc3VsdCA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZVZhbGlkYXRlKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ICAgICAgICAgID0+ICRFbnRyeS0+WzRdLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICRWYWxpZGF0aW9uUmVzdWx0LT57U2VydmVyRXJyb3J9ICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnN7ICRFbnRyeS0+WzBdIH0gPSAkVmFsaWRhdGlvblJlc3VsdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICAgICAjIGdlbmVyYXRlIHN0b3JhYmxlIHZhbHVlIG9mIGR5bmFtaWMgZmllbGQgZWRpdCBmaWVsZAogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJEVudHJ5LT5bMF0gfSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgcmVtYWluaW5nIG5vbi1keW5hbWljLWZpZWxkIG1hbmRhdG9yeSBmaWVsZHMKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRFbnRyeS0+WzBdIH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkRW50cnktPlswXSApIC8vICcnOwogICAgICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFteyAkRW50cnktPlswXSB9ICYmICRFbnRyeS0+WzRdICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnN7ICRFbnRyeS0+WzBdIC4gJ0ludmFsaWQnIH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIHNhdmUgY3VzdG9tZXIgY29tcGFueSBrZXkgZm9yIGNoZWNraW5nIGR1cGxpY2F0ZQogICAgICAgICAgICBpZiAoICRFbnRyeS0+WzJdIGVxICRDdXN0b21lckNvbXBhbnlLZXkgKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJDb21wYW55SUQgPSAkR2V0UGFyYW17ICRFbnRyeS0+WzBdIH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IEN1c3RvbWVyQ29tcGFueSBsaXN0CiAgICAgICAgbXkgJUxpc3QgPSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0LT5DdXN0b21lckNvbXBhbnlMaXN0KAogICAgICAgICAgICBTZWFyY2ggPT4gJFBhcmFte1NlYXJjaH0sCiAgICAgICAgICAgIFZhbGlkICA9PiAwLAogICAgICAgICk7CgogICAgICAgICMgY2hlY2sgZHVwbGljYXRlIGZpZWxkCiAgICAgICAgaWYgKCAlTGlzdCAmJiAkTGlzdHskQ3VzdG9tZXJDb21wYW55SUR9ICkgewogICAgICAgICAgICAkRXJyb3Jze0R1cGxpY2F0ZX0gPSAnU2VydmVyRXJyb3InOwogICAgICAgIH0KCiAgICAgICAgIyBpZiBubyBlcnJvcnMgb2NjdXJyZWQKICAgICAgICBpZiAoICElRXJyb3JzICkgewoKICAgICAgICAgICAgIyBhZGQgY29tcGFueQogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJDb21wYW55T2JqZWN0LT5DdXN0b21lckNvbXBhbnlBZGQoCiAgICAgICAgICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAkU2VsZi0+X092ZXJ2aWV3KAogICAgICAgICAgICAgICAgICAgIE5hdiAgICA9PiAkTmF2LAogICAgICAgICAgICAgICAgICAgIFNlYXJjaCA9PiAkU2VhcmNoLAogICAgICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBteSAkT3V0cHV0ID0gam9pbiAnJywKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5IZWFkZXIsCiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSA9PiAkTmF2aWdhdGlvbkJhclR5cGUsCiAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgICAgIEluZm8gPT4gVHJhbnNsYXRhYmxlKCdDdXN0b21lciBjb21wYW55IGFkZGVkIScpLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBzZXQgZHluYW1pYyBmaWVsZCB2YWx1ZXMKICAgICAgICAgICAgICAgIEVOVFJZOgogICAgICAgICAgICAgICAgZm9yIG15ICRFbnRyeSAoIEB7ICRDb25maWdPYmplY3QtPkdldCggJEdldFBhcmFte1NvdXJjZX0gKS0+e01hcH0gfSApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IEVOVFJZIGlmICRFbnRyeS0+WzVdIG5lICdkeW5hbWljX2ZpZWxkJzsKCiAgICAgICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkTG9va3VwfS0+eyAkRW50cnktPlsyXSB9OwoKICAgICAgICAgICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmZvID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRHluYW1pYyBmaWVsZCAlcyBub3QgZm91bmQhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRW50cnktPlsyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEVOVFJZOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgbXkgJFZhbHVlU2V0ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSAgICAgICAgID0+ICRHZXRQYXJhbXtDdXN0b21lcklEfSwKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXsgJEVudHJ5LT5bMF0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBpZiAoICEkVmFsdWVTZXQgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5mbyA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1VuYWJsZSB0byBzZXQgdmFsdWUgZm9yIGR5bmFtaWMgZmllbGQgJXMhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRW50cnktPlsyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEVOVFJZOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluQ3VzdG9tZXJDb21wYW55JywKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwoKICAgICAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIHNvbWV0aGluZyB3ZW50IHdyb25nCiAgICAgICAgbXkgJE91dHB1dCA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigKICAgICAgICAgICAgVHlwZSA9PiAkTmF2aWdhdGlvbkJhclR5cGUsCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoIFByaW9yaXR5ID0+ICdFcnJvcicgKTsKCiAgICAgICAgIyBzZXQgbm90aWZpY2F0aW9uIGZvciBkdXBsaWNhdGUgZW50cnkKICAgICAgICBpZiAoICRFcnJvcnN7RHVwbGljYXRlfSApIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnRXJyb3InLAogICAgICAgICAgICAgICAgSW5mbyAgICAgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICdDdXN0b21lciBDb21wYW55ICVzIGFscmVhZHkgZXhpc3RzIScsCiAgICAgICAgICAgICAgICAgICAgJEN1c3RvbWVyQ29tcGFueUlELAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICRTZWxmLT5fRWRpdCgKICAgICAgICAgICAgQWN0aW9uID0+ICdBZGQnLAogICAgICAgICAgICBOYXYgICAgPT4gJE5hdiwKICAgICAgICAgICAgRXJyb3JzID0+IFwlRXJyb3JzLAogICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkN1c3RvbWVyQ29tcGFueScsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBvdmVydmlldwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT5fT3ZlcnZpZXcoCiAgICAgICAgICAgIE5hdiAgICA9PiAkTmF2LAogICAgICAgICAgICBTZWFyY2ggPT4gJFNlYXJjaCwKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICk7CiAgICAgICAgbXkgJE91dHB1dCAgICAgICA9ICRMYXlvdXRPYmplY3QtPkhlYWRlcigpOwogICAgICAgIG15ICROb3RpZmljYXRpb24gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnTm90aWZpY2F0aW9uJyApIHx8ICcnOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+TmF2aWdhdGlvbkJhcigKICAgICAgICAgICAgVHlwZSA9PiAkTmF2aWdhdGlvbkJhclR5cGUsCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSggSW5mbyA9PiBUcmFuc2xhdGFibGUoJ0N1c3RvbWVyIGNvbXBhbnkgdXBkYXRlZCEnKSApCiAgICAgICAgICAgIGlmICggJE5vdGlmaWNhdGlvbiAmJiAkTm90aWZpY2F0aW9uIGVxICdVcGRhdGUnICk7CgogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluQ3VzdG9tZXJDb21wYW55JywKICAgICAgICAgICAgRGF0YSAgICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KfQoKc3ViIF9FZGl0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdBY3Rpb25MaXN0JyApOwogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnQWN0aW9uT3ZlcnZpZXcnLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdVcGRhdGUnLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgIyBzZW5kIHBhcmFtZXRlciBSZWFkT25seSB0byBKUyBvYmplY3QKICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnUmVhZE9ubHknLAogICAgICAgIFZhbHVlID0+ICRDb25maWdPYmplY3QtPnsgJFBhcmFte1NvdXJjZX0gfS0+e1JlYWRPbmx5fSwKICAgICk7CgogICAgIyBHZXQgdmFsaWQgb2JqZWN0LgogICAgbXkgJFZhbGlkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyk7CgogICAgJFBhcmFteydWYWxpZE9wdGlvbid9ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgRGF0YSAgICAgICA9PiB7ICRWYWxpZE9iamVjdC0+VmFsaWRMaXN0KCksIH0sCiAgICAgICAgTmFtZSAgICAgICA9PiAnVmFsaWRJRCcsCiAgICAgICAgQ2xhc3MgICAgICA9PiAnTW9kZXJuaXplJywKICAgICAgICBTZWxlY3RlZElEID0+ICRQYXJhbXtWYWxpZElEfSwKICAgICk7CgogICAgIyBHZXQgbmVlZGVkIG9iamVjdHMuCiAgICBteSAkUGFyYW1PYmplY3QgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpXZWI6OlJlcXVlc3QnKTsKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgIEVOVFJZOgogICAgZm9yIG15ICRFbnRyeSAoIEB7ICRDb25maWdPYmplY3QtPkdldCggJFBhcmFte1NvdXJjZX0gKS0+e01hcH0gfSApIHsKICAgICAgICBpZiAoICRFbnRyeS0+WzBdICkgewoKICAgICAgICAgICAgIyBIYW5kbGUgZHluYW1pYyBmaWVsZHMKICAgICAgICAgICAgaWYgKCAkRW50cnktPls1XSBlcSAnZHluYW1pY19maWVsZCcgKSB7CgogICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkTG9va3VwfS0+eyAkRW50cnktPlsyXSB9OwoKICAgICAgICAgICAgICAgIG5leHQgRU5UUlkgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgICAgICMgR2V0IEhUTUwgZm9yIGR5bmFtaWMgZmllbGQKICAgICAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRIVE1MID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPkVkaXRGaWVsZFJlbmRlcigKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFBhcmFteyAkRW50cnktPlswXSB9ID8gJFBhcmFteyAkRW50cnktPlswXSB9IDogdW5kZWYsCiAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ICAgICAgICAgID0+ICRFbnRyeS0+WzRdLAogICAgICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCgogICAgICAgICAgICAgICAgICAgICMgU2VydmVyIGVycm9yLCBpZiBhbnkKICAgICAgICAgICAgICAgICAgICAleyAkUGFyYW17RXJyb3JzfS0+eyAkRW50cnktPlswXSB9IH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgc2tpcCBmaWVsZHMgZm9yIHdoaWNoIEhUTUwgY291bGQgbm90IGJlIHJldHJpZXZlZAogICAgICAgICAgICAgICAgbmV4dCBFTlRSWSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZEhUTUwpOwoKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1ByZWZlcmVuY2VzR2VuZXJpYycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7fSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnRHluYW1pY0ZpZWxkJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgPT4gJER5bmFtaWNGaWVsZENvbmZpZy0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBMYWJlbCA9PiAkRHluYW1pY0ZpZWxkSFRNTC0+e0xhYmVsfSwKICAgICAgICAgICAgICAgICAgICAgICAgRmllbGQgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntGaWVsZH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbmV4dCBFTlRSWTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJEJsb2NrID0gJ0lucHV0JzsKCiAgICAgICAgICAgICMgYnVpbGQgc2VsZWN0aW9ucyBvciBpbnB1dCBmaWVsZHMKICAgICAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoICRQYXJhbXtTb3VyY2V9ICktPntTZWxlY3Rpb25zfS0+eyAkRW50cnktPlswXSB9ICkgewogICAgICAgICAgICAgICAgbXkgJE9wdGlvblJlcXVpcmVkID0gJyc7CiAgICAgICAgICAgICAgICBpZiAoICRFbnRyeS0+WzRdICkgewogICAgICAgICAgICAgICAgICAgICRPcHRpb25SZXF1aXJlZCA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBidWlsZCBWYWxpZElEIHN0cmluZwogICAgICAgICAgICAgICAgJEJsb2NrID0gJ09wdGlvbic7CiAgICAgICAgICAgICAgICAkUGFyYW17T3B0aW9ufSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4KICAgICAgICAgICAgICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCAkUGFyYW17U291cmNlfSApLT57U2VsZWN0aW9uc30KICAgICAgICAgICAgICAgICAgICAgICAgLT57ICRFbnRyeS0+WzBdIH0sCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgPT4gJEVudHJ5LT5bMF0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgPT4gIiRPcHRpb25SZXF1aXJlZCBNb2Rlcm5pemUgIiAuCiAgICAgICAgICAgICAgICAgICAgICAgICggJFBhcmFte0Vycm9yc30tPnsgJEVudHJ5LT5bMF0gLiAnSW52YWxpZCcgfSB8fCAnJyApLAogICAgICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uID0+IDEsCiAgICAgICAgICAgICAgICAgICAgU29ydCAgICAgICAgPT4gJ0FscGhhbnVtZXJpY0tleScsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFBhcmFteyAkRW50cnktPlswXSB9LAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgID0+IDM1LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkRW50cnktPlswXSA9fiBtL15DdXN0b21lckNvbXBhbnlDb3VudHJ5L2kgKSB7CgogICAgICAgICAgICAgICAgIyBidWlsZCBDb3VudHJ5IHNlbGVjdGlvbiB3aXRoIEVuZ2xpc2ggbmFtZXMKICAgICAgICAgICAgICAgICRCbG9jayA9ICdPcHRpb24nOwogICAgICAgICAgICAgICAgbXkgJE9wdGlvblJlcXVpcmVkID0gJEVudHJ5LT5bNF0gPyAnVmFsaWRhdGVfUmVxdWlyZWQnIDogJyc7CiAgICAgICAgICAgICAgICBteSAkQ291bnRyeUxpc3Q7CiAgICAgICAgICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnUmVmZXJlbmNlRGF0YTo6VHJhbnNsYXRlZENvdW50cnlOYW1lcycpICkgewoKICAgICAgICAgICAgICAgICAgICAjIEZsYWcrTmFtZSA9PiBjb2RlCiAgICAgICAgICAgICAgICAgICAgJENvdW50cnlMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlJlZmVyZW5jZURhdGEnKS0+Q0xEUkNvdW50cnlMaXN0KAogICAgICAgICAgICAgICAgICAgICAgICBMYW5ndWFnZSA9PiAkTGF5b3V0T2JqZWN0LT57VXNlckxhbmd1YWdlfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAjIE1ha2Ugc3VyZSB0aGF0IHRoZSBwcmV2aW91cyB2YWx1ZSBleGlzdHMgaW4gdGhlIHNlbGVjdGlvbiBsaXN0IGV2ZW4gaWYgaXQgaXNuJ3QgYSBjb3VudHJ5IGNvZGUuCiAgICAgICAgICAgICAgICAgICAgbXkgJFByZXZpb3VzQ291bnRyeSA9ICRQYXJhbXsgJEVudHJ5LT5bMF0gfTsKICAgICAgICAgICAgICAgICAgICBpZiAoJFByZXZpb3VzQ291bnRyeSkgewogICAgICAgICAgICAgICAgICAgICAgICAkQ291bnRyeUxpc3QtPnskUHJldmlvdXNDb3VudHJ5fSAvLz0gJFByZXZpb3VzQ291bnRyeTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAgICAgIyBFbmdsaXNoIG5hbWUgPT4gRW5nbGlzaCBuYW1lCiAgICAgICAgICAgICAgICAgICAgJENvdW50cnlMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlJlZmVyZW5jZURhdGEnKS0+Q291bnRyeUxpc3Q7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJFBhcmFte09wdGlvbn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJENvdW50cnlMaXN0LAogICAgICAgICAgICAgICAgICAgIFBvc3NpYmxlTm9uZSA9PiAxLAogICAgICAgICAgICAgICAgICAgIFNvcnQgICAgICAgICA9PiAnQWxwaGFudW1lcmljVmFsdWUnLAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkRW50cnktPlswXSwKICAgICAgICAgICAgICAgICAgICBDbGFzcyAgICAgICAgPT4gIiRPcHRpb25SZXF1aXJlZCBNb2Rlcm5pemUgIiAuCiAgICAgICAgICAgICAgICAgICAgICAgICggJFBhcmFte0Vycm9yc30tPnsgJEVudHJ5LT5bMF0gLiAnSW52YWxpZCcgfSB8fCAnJyApLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gKCAkUGFyYW17ICRFbnRyeS0+WzBdIH0gLy8gMSApLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRFbnRyeS0+WzBdID1+IG0vXlZhbGlkSUQvaSApIHsKCiAgICAgICAgICAgICAgICAjIGJ1aWxkIFZhbGlkSUQgc3RyaW5nCiAgICAgICAgICAgICAgICAkQmxvY2sgPSAnT3B0aW9uJzsKICAgICAgICAgICAgICAgIG15ICRPcHRpb25SZXF1aXJlZCA9ICRFbnRyeS0+WzRdID8gJ1ZhbGlkYXRlX1JlcXVpcmVkJyA6ICcnOwogICAgICAgICAgICAgICAgJFBhcmFte09wdGlvbn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgICAgICBEYXRhICA9PiB7ICRWYWxpZE9iamVjdC0+VmFsaWRMaXN0KCksIH0sCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgPT4gJEVudHJ5LT5bMF0sCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgPT4gIiRPcHRpb25SZXF1aXJlZCBNb2Rlcm5pemUgIiAuCiAgICAgICAgICAgICAgICAgICAgICAgICggJFBhcmFte0Vycm9yc30tPnsgJEVudHJ5LT5bMF0gLiAnSW52YWxpZCcgfSB8fCAnJyApLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gZGVmaW5lZCggJFBhcmFteyAkRW50cnktPlswXSB9ICkgPyAkUGFyYW17ICRFbnRyeS0+WzBdIH0gOiAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgICAgICAgICAjIEJ1aWxkIHRoZSBncm91cCBmaWVsZC4KICAgICAgICAgICAgZWxzaWYgKCAkRW50cnktPlswXSA9fiAvXlVzZXJHcm91cElEJC9pICkgewogICAgICAgICAgICAgICAgIyBDaGVjayBpZiB0aGUgdXNlciBoYXMgdGhlIHBlcm1pc3Npb24gdG8gc2VlL2NoYW5nZSB0aGUgbXVsdGl0ZW5hbmN5IGZpZWxkLgogICAgICAgICAgICAgICAgaWYgKCAhJFNlbGYtPntNdWx0aXRlbmFuY3lQZXJtaXNzaW9ufSApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IEVOVFJZOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAjIEJ1aWxkIHRoZSBmaWVsZC4KICAgICAgICAgICAgICAgICAgICAkQmxvY2sgPSAnT3B0aW9uJzsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17T3B0aW9ufSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5Hcm91cExpc3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgICAgID0+ICRFbnRyeS0+WzBdLAogICAgICAgICAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUgJyAuICggJFBhcmFte0Vycm9yc30tPnsgJEVudHJ5LT5bMF0gLiAnSW52YWxpZCcgfSB8fCAnJyApLAogICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RlZElEICAgPT4gJFBhcmFteyAkRW50cnktPlswXSB9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KIyBFTyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRQYXJhbXtWYWx1ZX0gPSAkUGFyYW17ICRFbnRyeS0+WzBdIH0gfHwgJyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2hvdyByZXF1aXJlZCBmbGFnCiAgICAgICAgICAgIGlmICggJEVudHJ5LT5bNF0gKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17TWFuZGF0b3J5Q2xhc3N9ID0gJ2NsYXNzPSJNYW5kYXRvcnkiJzsKICAgICAgICAgICAgICAgICRQYXJhbXtTdGFyTGFiZWx9ICAgICAgPSAnPHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4nOwogICAgICAgICAgICAgICAgJFBhcmFte1JlcXVpcmVkQ2xhc3N9ICA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUGFyYW17TWFuZGF0b3J5Q2xhc3N9ID0gJyc7CiAgICAgICAgICAgICAgICAkUGFyYW17U3RhckxhYmVsfSAgICAgID0gJyc7CiAgICAgICAgICAgICAgICAkUGFyYW17UmVxdWlyZWRDbGFzc30gID0gJyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2hvdyByZWFkb25seSBmbGFnCiAgICAgICAgICAgIGlmICggJEVudHJ5LT5bN10gKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17UmVhZE9ubHlUeXBlfSA9ICdyZWFkb25seSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUGFyYW17UmVhZE9ubHlUeXBlfSA9ICcnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGFkZCBmb3JtIG9wdGlvbgogICAgICAgICAgICBpZiAoICRQYXJhbXtUeXBlfSAmJiAkUGFyYW17VHlwZX0gZXEgJ2hpZGRlbicgKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17UHJlZmVyZW5jZXN9IC49ICRQYXJhbXtWYWx1ZX07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcmVmZXJlbmNlc0dlbmVyaWMnLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBJdGVtID0+ICRFbnRyeS0+WzFdLAogICAgICAgICAgICAgICAgICAgICAgICAlUGFyYW0KICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gIlByZWZlcmVuY2VzR2VuZXJpYyRCbG9jayIsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgSXRlbSAgICAgICAgID0+ICRFbnRyeS0+WzFdLAogICAgICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJEVudHJ5LT5bMF0sCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICA9PiAkUGFyYW17ICRFbnRyeS0+WzBdIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIEludmFsaWRGaWVsZCA9PiAkUGFyYW17RXJyb3JzfS0+eyAkRW50cnktPlswXSAuICdJbnZhbGlkJyB9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAkRW50cnktPls0XSApIHsKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAiUHJlZmVyZW5jZXNHZW5lcmljJHtCbG9ja31SZXF1aXJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkRW50cnktPlswXSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgX092ZXJ2aWV3IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdJbmNsdWRlSW52YWxpZCcsCiAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgIEluY2x1ZGVJbnZhbGlkICAgICAgICA9PiAkU2VsZi0+e0luY2x1ZGVJbnZhbGlkfSwKICAgICAgICAgICAgSW5jbHVkZUludmFsaWRDaGVja2VkID0+ICRTZWxmLT57SW5jbHVkZUludmFsaWR9ID8gJ2NoZWNrZWQnIDogJycsCiAgICAgICAgfSwKICAgICk7CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnQWN0aW9uTGlzdCcgKTsKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ0FjdGlvblNlYXJjaCcsCiAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgKTsKCiAgICBteSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQ29tcGFueScpOwoKICAgICMgZ2V0IHdyaXRhYmxlIGRhdGEgc291cmNlcwogICAgbXkgJUN1c3RvbWVyQ29tcGFueVNvdXJjZSA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueVNvdXJjZUxpc3QoCiAgICAgICAgUmVhZE9ubHkgPT4gMCwKICAgICk7CgogICAgIyBvbmx5IHNob3cgQWRkIG9wdGlvbiBpZiB3ZSBoYXZlIGF0IGxlYXN0IG9uZSB3cml0YWJsZSBiYWNrZW5kCiAgICBpZiAoIHNjYWxhciBrZXlzICVDdXN0b21lckNvbXBhbnlTb3VyY2UgKSB7CiAgICAgICAgJFBhcmFte1NvdXJjZU9wdGlvbn0gPSAkTGF5b3V0T2JqZWN0LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgRGF0YSAgICAgICA9PiB7ICVDdXN0b21lckNvbXBhbnlTb3VyY2UsIH0sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ1NvdXJjZScsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1NvdXJjZX0gfHwgJycsCiAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FjdGlvbkFkZCcsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgICMgaWYgdGhlcmUgYXJlIGFueSByZWdpc3RyaWVzIHRvIHNlYXJjaCwgdGhlIHRhYmxlIGlzIGZpbGxlZCBhbmQgc2hvd24KICAgIGlmICggJFBhcmFte1NlYXJjaH0gKSB7CgogICAgICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgICAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAgICAgIyBzYW1lIExpbWl0IGFzICRTZWxmLT57Q3VzdG9tZXJDb21wYW55fS0+e0N1c3RvbWVyQ29tcGFueVNlYXJjaExpc3RMaW1pdH0KICAgICAgICAjIHNtYWxsZXN0IExpbWl0IGZyb20gYWxsIHNvdXJjZXMKICAgICAgICBteSAkTGltaXQ7CiAgICAgICAgU09VUkNFOgogICAgICAgIGZvciBteSAkQ291bnQgKCAnJywgMSAuLiAxMCApIHsKICAgICAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJDb21wYW55JENvdW50Iik7CiAgICAgICAgICAgIG15ICRDdXN0b21lclVzZXJNYXAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoIkN1c3RvbWVyQ29tcGFueSRDb3VudCIpOwogICAgICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJEN1c3RvbWVyVXNlck1hcC0+e0N1c3RvbWVyQ29tcGFueVNlYXJjaExpc3RMaW1pdH07CiAgICAgICAgICAgIGlmICggIWRlZmluZWQgJExpbWl0IHx8ICRDdXN0b21lclVzZXJNYXAtPntDdXN0b21lckNvbXBhbnlTZWFyY2hMaXN0TGltaXR9IDwgJExpbWl0ICkgewogICAgICAgICAgICAgICAgJExpbWl0ID0gJEN1c3RvbWVyVXNlck1hcC0+e0N1c3RvbWVyQ29tcGFueVNlYXJjaExpc3RMaW1pdH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYXMgZmFsbGJhY2sgdGFrZSB0aGUgaGFyZGNvZGVkIGxpbWl0IG9mIEtlcm5lbC9TeXN0ZW0vQ3VzdG9tZXJDb21wYW55L0RCLnBtCiAgICAgICAgJExpbWl0IC8vPSA1MDAwMDsKCiAgICAgICAgbXkgJUxpc3RBbGxJdGVtcyA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueUxpc3QoCiAgICAgICAgICAgIFNlYXJjaCA9PiAkUGFyYW17U2VhcmNofSwKICAgICAgICAgICAgTGltaXQgID0+ICRMaW1pdCArIDEsCiAgICAgICAgICAgIFZhbGlkICA9PiAwLAogICAgICAgICk7CgogICAgICAgIGlmICgga2V5cyAlTGlzdEFsbEl0ZW1zIDw9ICRMaW1pdCApIHsKICAgICAgICAgICAgbXkgJExpc3RBbGxJdGVtcyA9IGtleXMgJUxpc3RBbGxJdGVtczsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0hlYWRlcicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBMaXN0QWxsID0+ICRMaXN0QWxsSXRlbXMsCiAgICAgICAgICAgICAgICAgICAgTGltaXQgICA9PiAkTGltaXQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJUxpc3QgPSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0LT5DdXN0b21lckNvbXBhbnlMaXN0KAogICAgICAgICAgICBTZWFyY2ggPT4gJFBhcmFte1NlYXJjaH0sCiAgICAgICAgICAgIFZhbGlkICA9PiAkU2VsZi0+e0luY2x1ZGVJbnZhbGlkfSA/IDAgOiAxLAogICAgICAgICk7CgogICAgICAgIGlmICgga2V5cyAlTGlzdEFsbEl0ZW1zID4gJExpbWl0ICkgewogICAgICAgICAgICBteSAkTGlzdEFsbEl0ZW1zICAgPSBrZXlzICVMaXN0QWxsSXRlbXM7CiAgICAgICAgICAgIG15ICRTZWFyY2hMaXN0U2l6ZSA9IGtleXMgJUxpc3Q7CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3SGVhZGVyJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIFNlYXJjaExpc3RTaXplID0+ICRTZWFyY2hMaXN0U2l6ZSwKICAgICAgICAgICAgICAgICAgICBMaXN0QWxsICAgICAgICA9PiAkTGlzdEFsbEl0ZW1zLAogICAgICAgICAgICAgICAgICAgIExpbWl0ICAgICAgICAgID0+ICRMaW1pdCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdSZXN1bHQnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgdmFsaWQgbGlzdAogICAgICAgIG15ICVWYWxpZExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRMaXN0KCk7CgogICAgICAgIGlmICggISRDb25maWdPYmplY3QtPkdldCggJFBhcmFte1NvdXJjZX0gKS0+e1BhcmFtc30tPntGb3JlaWduREJ9ICkgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnTG9jYWxEQicgKTsKICAgICAgICB9CgogICAgICAgICMgaWYgdGhlcmUgYXJlIHJlc3VsdHMgdG8gc2hvdwogICAgICAgIGlmICglTGlzdCkgewogICAgICAgICAgICBmb3IgbXkgJExpc3RLZXkgKCBzb3J0IHsgJExpc3R7JGF9IGNtcCAkTGlzdHskYn0gfSBrZXlzICVMaXN0ICkgewoKICAgICAgICAgICAgICAgIG15ICVEYXRhID0gJEN1c3RvbWVyQ29tcGFueU9iamVjdC0+Q3VzdG9tZXJDb21wYW55R2V0KCBDdXN0b21lcklEID0+ICRMaXN0S2V5ICk7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld1Jlc3VsdFJvdycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICVEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBTZWFyY2ggPT4gJFBhcmFte1NlYXJjaH0sCiAgICAgICAgICAgICAgICAgICAgICAgIE5hdiAgICA9PiAkUGFyYW17TmF2fSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICEkQ29uZmlnT2JqZWN0LT5HZXQoICRQYXJhbXtTb3VyY2V9ICktPntQYXJhbXN9LT57Rm9yZWlnbkRCfSApIHsKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnTG9jYWxEQlJvdycsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWQgPT4gJFZhbGlkTGlzdHsgJERhdGF7VmFsaWRJRH0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICVEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIG90aGVyd2lzZSBpdCBkaXNwbGF5cyBhIG5vIGRhdGEgZm91bmQgbWVzc2FnZQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ05vRGF0YUZvdW5kTXNnJywKICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgaWYgdGhlcmUgaXMgbm90aGluZyB0byBzZWFyY2ggaXQgc2hvd3MgYSBtZXNzYWdlCiAgICBlbHNlCiAgICB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ05vU2VhcmNoVGVybXMnLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gMTsKfQoKMTsK</File>
        <File Location="Custom/Kernel/Modules/AdminCustomerUser.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBkZWI5OWQ2MGRhZjIxMmFlNzNlYzdmZWI3ODA3NGYzZjdhZTU2M2Y4IC0gS2VybmVsL01vZHVsZXMvQWRtaW5DdXN0b21lclVzZXIucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFkbWluQ3VzdG9tZXJVc2VyOwoKdXNlIHY1LjI0Owp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSBuYW1lc3BhY2U6OmF1dG9jbGVhbjsKCiMgY29yZSBtb2R1bGVzCgojIENQQU4gbW9kdWxlcwoKIyBPVE9CTyBtb2R1bGVzCnVzZSBLZXJuZWw6Okxhbmd1YWdlICAgICAgICAgICAgICBxdyhUcmFuc2xhdGFibGUpOwp1c2UgS2VybmVsOjpTeXN0ZW06OlZhcmlhYmxlQ2hlY2sgcXcoOmFsbCk7CgpvdXIgJE9iamVjdE1hbmFnZXJEaXNhYmxlZCA9IDE7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgc2V0IHByZWYgZm9yIGNvbHVtbnMga2V5CiAgICAkU2VsZi0+e1ByZWZLZXlJbmNsdWRlSW52YWxpZH0gPSAnSW5jbHVkZUludmFsaWQnIC4gJy0nIC4gJFNlbGYtPntBY3Rpb259OwoKICAgIG15ICVQcmVmZXJlbmNlcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJyktPkdldFByZWZlcmVuY2VzKAogICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICApOwoKICAgICRTZWxmLT57SW5jbHVkZUludmFsaWR9ID0gJFByZWZlcmVuY2VzeyAkU2VsZi0+e1ByZWZLZXlJbmNsdWRlSW52YWxpZH0gfTsKCiAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlncyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBPYmplY3RUeXBlID0+ICdDdXN0b21lclVzZXInLAogICAgKTsKCiAgICAkU2VsZi0+e0R5bmFtaWNGaWVsZExvb2t1cH0gPSB7IG1hcCB7ICRfLT57TmFtZX0gPT4gJF8gfSBAeyREeW5hbWljRmllbGRDb25maWdzfSB9OwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRQYXJhbU9iamVjdCAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6V2ViOjpSZXF1ZXN0Jyk7CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBteSAkTmF2ICAgICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnTmF2JyApICAgIHx8ICcnOwogICAgbXkgJFNvdXJjZSAgICAgICAgID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1NvdXJjZScgKSB8fCAnQ3VzdG9tZXJVc2VyJzsKICAgIG15ICRTZWFyY2ggICAgICAgICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdTZWFyY2gnICk7CiAgICBteSAkSW5jbHVkZUludmFsaWQgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnSW5jbHVkZUludmFsaWQnICk7CgogICAgaWYgKCBkZWZpbmVkICRJbmNsdWRlSW52YWxpZCApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VXNlcicpLT5TZXRQcmVmZXJlbmNlcygKICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgS2V5ICAgID0+ICRTZWxmLT57UHJlZktleUluY2x1ZGVJbnZhbGlkfSwKICAgICAgICAgICAgVmFsdWUgID0+ICRJbmNsdWRlSW52YWxpZCwKICAgICAgICApOwoKICAgICAgICAkU2VsZi0+e0luY2x1ZGVJbnZhbGlkfSA9ICRJbmNsdWRlSW52YWxpZDsKICAgIH0KICAgICRTZWFyY2gKICAgICAgICB8fD0gJENvbmZpZ09iamVjdC0+R2V0KCdBZG1pbkN1c3RvbWVyVXNlcjo6UnVuSW5pdGlhbFdpbGRjYXJkU2VhcmNoJykgPyAnKicgOiAnJzsKCiAgICAjIGNyZWF0ZSBsb2NhbCBvYmplY3QKICAgIG15ICRDaGVja0l0ZW1PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2hlY2tJdGVtJyk7CgogICAgbXkgJE5hdkJhciAgICAgICA9ICcnOwogICAgbXkgJExheW91dE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnKTsKICAgIGlmICggJE5hdiBlcSAnTm9uZScgKSB7CiAgICAgICAgJE5hdkJhciA9ICRMYXlvdXRPYmplY3QtPkhlYWRlciggVHlwZSA9PiAnU21hbGwnICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkTmF2QmFyID0gJExheW91dE9iamVjdC0+SGVhZGVyKCk7CiAgICAgICAgJE5hdkJhciAuPSAkTGF5b3V0T2JqZWN0LT5OYXZpZ2F0aW9uQmFyKAogICAgICAgICAgICBUeXBlID0+ICROYXYgZXEgJ0FnZW50JyA/ICdDdXN0b21lcnMnIDogJ0FkbWluJywKICAgICAgICApOwogICAgfQoKICAgICMgR2V0IGxpc3Qgb2YgdmFsaWQgSURzLgogICAgbXkgQFZhbGlkSURMaXN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkSURzR2V0KCk7CgogICAgIyBjaGVjayB0aGUgcGVybWlzc2lvbiBmb3IgdGhlIFN3aXRjaFRvQ3VzdG9tZXIgZmVhdHVyZQogICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJ1N3aXRjaFRvQ3VzdG9tZXInKSApIHsKCiAgICAgICAgbXkgJEdyb3VwT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7CgogICAgICAgICMgZ2V0IHRoZSBncm91cCBpZCB3aGljaCBpcyBhbGxvd2VkIHRvIHVzZSB0aGUgc3dpdGNoIHRvIGN1c3RvbWVyIGZlYXR1cmUKICAgICAgICBteSAkU3dpdGNoVG9DdXN0b21lckdyb3VwSUQgPSAkR3JvdXBPYmplY3QtPkdyb3VwTG9va3VwKAogICAgICAgICAgICBHcm91cCA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1N3aXRjaFRvQ3VzdG9tZXI6OlBlcm1pc3Npb25Hcm91cCcpLAogICAgICAgICk7CgogICAgICAgICMgZ2V0IHVzZXIgZ3JvdXBzLCB3aGVyZSB0aGUgdXNlciBoYXMgdGhlIHJ3IHByaXZpbGVnZQogICAgICAgIG15ICVHcm91cHMgPSAkR3JvdXBPYmplY3QtPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUeXBlICAgPT4gJ3J3JywKICAgICAgICApOwoKICAgICAgICAjIGlmIHRoZSB1c2VyIGlzIGEgbWVtYmVyIGluIHRoaXMgZ3JvdXAgaGUgY2FuIGFjY2VzcyB0aGUgZmVhdHVyZQogICAgICAgIGlmICggJEdyb3Vwc3skU3dpdGNoVG9DdXN0b21lckdyb3VwSUR9ICkgewogICAgICAgICAgICAkU2VsZi0+e1N3aXRjaFRvQ3VzdG9tZXJQZXJtaXNzaW9ufSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyk7CiAgICBteSAkTWFpbk9iamVjdCAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAjIENoZWNrIGlmIHRoZSB1c2VyIGhhcyBwZXJtaXNzaW9uIHRvIHNldCBtdWx0aXRlbmFuY3kuCiAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnTXVsdGl0ZW5hbmN5JykgKSB7CiAgICAgICAgbXkgJEdyb3VwT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyk7CgogICAgICAgIG15ICRNdWx0aXRlbmFuY3lHcm91cElEID0gJEdyb3VwT2JqZWN0LT5Hcm91cExvb2t1cCgKICAgICAgICAgICAgR3JvdXAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdNdWx0aXRlbmFuY3k6OlBlcm1pc3Npb25Hcm91cCcpLAogICAgICAgICk7CgogICAgICAgIG15ICVHcm91cHMgPSAkR3JvdXBPYmplY3QtPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgICAgICBVc2VySUQgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICBUeXBlICAgPT4gJ3J3JywKICAgICAgICApOwoKICAgICAgICBpZiAoICRHcm91cHN7JE11bHRpdGVuYW5jeUdyb3VwSUR9ICkgewogICAgICAgICAgICAkU2VsZi0+e011bHRpdGVuYW5jeVBlcm1pc3Npb259ID0gMTsKICAgICAgICB9CiAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjICBzd2l0Y2ggdG8gY3VzdG9tZXIKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGlmICgKICAgICAgICAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ1N3aXRjaCcKICAgICAgICAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ1N3aXRjaFRvQ3VzdG9tZXInKQogICAgICAgICYmICRTZWxmLT57U3dpdGNoVG9DdXN0b21lclBlcm1pc3Npb259CiAgICAgICAgKQogICAgewoKICAgICAgICAjIGNoYWxsZW5nZSB0b2tlbiBjaGVjayBmb3Igd3JpdGUgYWN0aW9uCiAgICAgICAgJExheW91dE9iamVjdC0+Q2hhbGxlbmdlVG9rZW5DaGVjaygpOwoKICAgICAgICAjIGdldCB1c2VyIGRhdGEKICAgICAgICBteSAkVXNlcklEICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnSUQnICkgfHwgJyc7CiAgICAgICAgbXkgJVVzZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgVXNlciAgPT4gJFVzZXJJRCwKICAgICAgICAgICAgVmFsaWQgPT4gMSwKICAgICAgICApOwoKICAgICAgICAjIGNyZWF0ZSBuZXcgc2Vzc2lvbiBpZAogICAgICAgIG15ICROZXdTZXNzaW9uSUQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6QXV0aFNlc3Npb24nKS0+Q3JlYXRlU2Vzc2lvbklEKAogICAgICAgICAgICAlVXNlckRhdGEsCiAgICAgICAgICAgIFVzZXJMYXN0UmVxdWVzdCA9PiAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKS0+VG9FcG9jaCgpLAogICAgICAgICAgICBVc2VyVHlwZSAgICAgICAgPT4gJ0N1c3RvbWVyJywKICAgICAgICAgICAgU2Vzc2lvblNvdXJjZSAgID0+ICdDdXN0b21lckludGVyZmFjZScsCiAgICAgICAgKTsKCiAgICAgICAgIyBnZXQgY3VzdG9tZXIgaW50ZXJmYWNlIHNlc3Npb24gbmFtZQogICAgICAgIG15ICRTZXNzaW9uTmFtZSA9ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQYW5lbFNlc3Npb25OYW1lJykgfHwgJ0NTSUQnOwoKICAgICAgICAjIGNyZWF0ZSBhIG5ldyBMYXlvdXRPYmplY3QKICAgICAgICBteSAkTGF5b3V0T2JqZWN0ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dC0+bmV3KAogICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgU2Vzc2lvbklEICAgPT4gJE5ld1Nlc3Npb25JRCwKICAgICAgICAgICAgU2Vzc2lvbk5hbWUgPT4gJENvbmZpZ09iamVjdC0+R2V0KCdTZXNzaW9uTmFtZScpLAogICAgICAgICk7CgogICAgICAgICMgc2V0IHRoZSBzZXNzaW9uIGNvb2tpZQogICAgICAgIG15ICRFeHBpcmVzID0gJENvbmZpZ09iamVjdC0+R2V0KCdTZXNzaW9uVXNlQ29va2llQWZ0ZXJCcm93c2VyQ2xvc2UnKQogICAgICAgICAgICA/CiAgICAgICAgICAgICcrJyAuICRDb25maWdPYmplY3QtPkdldCgnU2Vzc2lvbk1heFRpbWUnKSAuICdzJwogICAgICAgICAgICA6CiAgICAgICAgICAgICcnOwogICAgICAgICRMYXlvdXRPYmplY3QtPlNldENvb2tpZSgKICAgICAgICAgICAgS2V5ICAgICA9PiAnU2Vzc2lvbklEQ29va2llJywKICAgICAgICAgICAgTmFtZSAgICA9PiAkU2Vzc2lvbk5hbWUsCiAgICAgICAgICAgIFZhbHVlICAgPT4gJE5ld1Nlc3Npb25JRCwKICAgICAgICAgICAgRXhwaXJlcyA9PiAkRXhwaXJlcywKICAgICAgICApOwoKICAgICAgICAjIGxvZyBldmVudAogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4KICAgICAgICAgICAgICAgICJTd2l0Y2hlZCBmcm9tIEFnZW50IHRvIEN1c3RvbWVyICgkU2VsZi0+e1VzZXJMb2dpbn0gLT0+ICRVc2VyRGF0YXtVc2VyTG9naW59KSIsCiAgICAgICAgKTsKCiAgICAgICAgIyByZWRpcmVjdCB0byBjdXN0b21lciBpbnRlcmZhY2UKICAgICAgICBteSAkRXh0VVJMID0gam9pbiAnJywKICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdIdHRwVHlwZScpLAogICAgICAgICAgICAnOi8vJywKICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdGUUROJyksCiAgICAgICAgICAgICcvJywKICAgICAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCdTY3JpcHRBbGlhcycpLAogICAgICAgICAgICAnY3VzdG9tZXIucGwnOwoKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoIEV4dFVSTCA9PiAkRXh0VVJMICk7CiAgICB9CgogICAgIyBzZWFyY2ggdXNlciBsaXN0CiAgICBpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU2VhcmNoJyApIHsKICAgICAgICAkU2VsZi0+X092ZXJ2aWV3KAogICAgICAgICAgICBOYXYgICAgPT4gJE5hdiwKICAgICAgICAgICAgU2VhcmNoID0+ICRTZWFyY2gsCiAgICAgICAgKTsKICAgICAgICBteSAkT3V0cHV0ID0gJE5hdkJhcjsKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkN1c3RvbWVyVXNlcicsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgIGlmICggJE5hdiBlcSAnTm9uZScgKSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCBUeXBlID0+ICdTbWFsbCcgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGRvd25sb2FkIGZpbGUgcHJlZmVyZW5jZXMKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdEb3dubG9hZCcgKSB7CiAgICAgICAgbXkgJEdyb3VwID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0dyb3VwJyApIHx8ICcnOwogICAgICAgIG15ICRVc2VyICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdJRCcgKSAgICB8fCAnJzsKCiAgICAgICAgIyBnZXQgdXNlciBkYXRhCiAgICAgICAgbXkgJVVzZXJEYXRhICAgID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCggVXNlciA9PiAkVXNlciApOwogICAgICAgIG15ICVQcmVmZXJlbmNlcyA9ICV7ICRDb25maWdPYmplY3QtPkdldCgnQ3VzdG9tZXJQcmVmZXJlbmNlc0dyb3VwcycpIH07CiAgICAgICAgbXkgJE1vZHVsZSAgICAgID0gJFByZWZlcmVuY2VzeyRHcm91cH0tPntNb2R1bGV9OwogICAgICAgIGlmICggISRNYWluT2JqZWN0LT5SZXF1aXJlKCRNb2R1bGUpICkgewogICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigpOwogICAgICAgIH0KICAgICAgICBteSAkT2JqZWN0ID0gJE1vZHVsZS0+bmV3KAogICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgQ29uZmlnSXRlbSA9PiAkUHJlZmVyZW5jZXN7JEdyb3VwfSwKICAgICAgICAgICAgVXNlck9iamVjdCA9PiAkQ3VzdG9tZXJVc2VyT2JqZWN0LAogICAgICAgICAgICBEZWJ1ZyAgICAgID0+ICRTZWxmLT57RGVidWd9LAogICAgICAgICk7CiAgICAgICAgbXkgJUZpbGUgPSAkT2JqZWN0LT5Eb3dubG9hZCggVXNlckRhdGEgPT4gXCVVc2VyRGF0YSApOwoKICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+QXR0YWNobWVudCglRmlsZSk7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBjaGFuZ2UKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgIGVsc2lmICggJFNlbGYtPntTdWJhY3Rpb259IGVxICdDaGFuZ2UnICkgewogICAgICAgIG15ICRVc2VyICAgICAgICAgPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnSUQnICkgICAgICAgICAgIHx8ICcnOwogICAgICAgIG15ICROb3RpZmljYXRpb24gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnTm90aWZpY2F0aW9uJyApIHx8ICcnOwoKICAgICAgICAjIGdldCB1c2VyIGRhdGEKICAgICAgICBteSAlVXNlckRhdGEgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KCBVc2VyID0+ICRVc2VyICk7CgogICAgICAgIG15ICRPdXRwdXQgPSAkTmF2QmFyOwogICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KCBJbmZvID0+IFRyYW5zbGF0YWJsZSgnQ3VzdG9tZXIgdXBkYXRlZCEnKSApCiAgICAgICAgICAgIGlmICggJE5vdGlmaWNhdGlvbiAmJiAkTm90aWZpY2F0aW9uIGVxICdVcGRhdGUnICk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+X0VkaXQoCiAgICAgICAgICAgIE5hdiAgICA9PiAkTmF2LAogICAgICAgICAgICBBY3Rpb24gPT4gJ0NoYW5nZScsCiAgICAgICAgICAgIFNvdXJjZSA9PiAkU291cmNlLAogICAgICAgICAgICBTZWFyY2ggPT4gJFNlYXJjaCwKICAgICAgICAgICAgSUQgICAgID0+ICRVc2VyLAogICAgICAgICAgICAlVXNlckRhdGEsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkTmF2IGVxICdOb25lJyApIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoIFR5cGUgPT4gJ1NtYWxsJyApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Gb290ZXIoKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgfQoKICAgICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICMKICAgICMgY2hhbmdlIGFjdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0NoYW5nZUFjdGlvbicgKSB7CgogICAgICAgICMgY2hhbGxlbmdlIHRva2VuIGNoZWNrIGZvciB3cml0ZSBhY3Rpb24KICAgICAgICAkTGF5b3V0T2JqZWN0LT5DaGFsbGVuZ2VUb2tlbkNoZWNrKCk7CgogICAgICAgICMgdXBkYXRlIG9ubHkgdGhlIHByZWZlcmVuY2VzIGFuZCBkeW5hbWljIGZpZWxkcywgaWYgdGhlIHNvdXJjZSBpcyByZWFkb25seSBvciBhIGxkYXAgYmFja2VuZAogICAgICAgIG15ICRVcGRhdGVPbmx5UHJlZmVyZW5jZXM7CgogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCRTb3VyY2UpLT57UmVhZE9ubHl9IHx8ICRDb25maWdPYmplY3QtPkdldCgkU291cmNlKS0+e01vZHVsZX0gPX4gL0xEQVAvaSApIHsKICAgICAgICAgICAgJFVwZGF0ZU9ubHlQcmVmZXJlbmNlcyA9IDE7CiAgICAgICAgfQoKICAgICAgICBteSAkTm90ZSA9ICcnOwogICAgICAgIG15ICggJUdldFBhcmFtLCAlRXJyb3JzICk7CgogICAgICAgICMgR2V0IGR5bmFtaWMgZmllbGQgYmFja2VuZCBvYmplY3QuCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgICAgIEVOVFJZOgogICAgICAgIGZvciBteSAkRW50cnkgKCBAeyAkQ29uZmlnT2JqZWN0LT5HZXQoJFNvdXJjZSktPntNYXB9IH0gKSB7CgogICAgICAgICAgICAjIGNoZWNrIGR5bmFtaWMgZmllbGRzCiAgICAgICAgICAgIGlmICggJEVudHJ5LT5bNV0gZXEgJ2R5bmFtaWNfZmllbGQnICkgewoKICAgICAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRDb25maWcgPSAkU2VsZi0+e0R5bmFtaWNGaWVsZExvb2t1cH0tPnsgJEVudHJ5LT5bMl0gfTsKCiAgICAgICAgICAgICAgICBpZiAoICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKSApIHsKICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkR5bmFtaWNGaWVsZCAkRW50cnktPlsyXSBub3QgZm91bmQhIiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIG5leHQgRU5UUlk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJFZhbGlkYXRpb25SZXN1bHQgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVWYWxpZGF0ZSgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICAgICAgICAgIE1hbmRhdG9yeSAgICAgICAgICA9PiAkRW50cnktPls0XSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCAkVmFsaWRhdGlvblJlc3VsdC0+e1NlcnZlckVycm9yfSApIHsKICAgICAgICAgICAgICAgICAgICAkRXJyb3JzeyAkRW50cnktPlswXSB9ID0gJFZhbGlkYXRpb25SZXN1bHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAgICAgIyBnZW5lcmF0ZSBzdG9yYWJsZSB2YWx1ZSBvZiBkeW5hbWljIGZpZWxkIGVkaXQgZmllbGQKICAgICAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRFbnRyeS0+WzBdIH0gPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+RWRpdEZpZWxkVmFsdWVHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICBQYXJhbU9iamVjdCAgICAgICAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICBMYXlvdXRPYmplY3QgICAgICAgPT4gJExheW91dE9iamVjdCwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGNoZWNrIHJlbWFpbmluZyBub24tZHluYW1pYy1maWVsZCBtYW5kYXRvcnkgZmllbGRzCiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJEdldFBhcmFteyAkRW50cnktPlswXSB9ID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJEVudHJ5LT5bMF0gKSB8fCAnJzsKCiAgICAgICAgICAgICAgICBuZXh0IEVOVFJZIGlmICRVcGRhdGVPbmx5UHJlZmVyZW5jZXM7CgogICAgICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFteyAkRW50cnktPlswXSB9ICYmICRFbnRyeS0+WzRdICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnN7ICRFbnRyeS0+WzBdIC4gJ0ludmFsaWQnIH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRHZXRQYXJhbXtJRH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnSUQnICkgfHwgJyc7CgogICAgICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcwogICAgICAgIGlmICgKICAgICAgICAgICAgISRVcGRhdGVPbmx5UHJlZmVyZW5jZXMKICAgICAgICAgICAgJiYgJEdldFBhcmFte1VzZXJFbWFpbH0KICAgICAgICAgICAgJiYgISRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRW1haWwoIEFkZHJlc3MgPT4gJEdldFBhcmFte1VzZXJFbWFpbH0gKQogICAgICAgICAgICAmJiBncmVwIHsgJF8gZXEgJEdldFBhcmFte1ZhbGlkSUR9IH0gQFZhbGlkSURMaXN0CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRFcnJvcnN7VXNlckVtYWlsSW52YWxpZH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAkRXJyb3Jze0Vycm9yVHlwZX0gICAgICAgID0gJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFcnJvclR5cGUoKSAuICdTZXJ2ZXJFcnJvck1zZyc7CiAgICAgICAgfQoKICAgICAgICAjIEdldCB0aGUgY3VycmVudCB1c2VyIGRhdGEgZm9yIHNvbWUgY2hlY2tzLgogICAgICAgIG15ICVDdXJyZW50VXNlckRhdGEgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICBVc2VyID0+ICRHZXRQYXJhbXtJRH0sCiAgICAgICAgKTsKCiAgICAgICAgIyBDaGVjayBDdXN0b21lcklELCBpZiBDdXN0b21lckNvbXBhbnlTdXBwb3J0IGlzIGVuYWJsZWQgYW5kIHRoZSBVc2VyQ3VzdG9tZXJJRCB3YXMgY2hhbmdlZC4KICAgICAgICBpZiAoCiAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgkU291cmNlKS0+e0N1c3RvbWVyQ29tcGFueVN1cHBvcnR9CiAgICAgICAgICAgICYmICRHZXRQYXJhbXtVc2VyQ3VzdG9tZXJJRH0KICAgICAgICAgICAgJiYgJEN1cnJlbnRVc2VyRGF0YXtVc2VyQ3VzdG9tZXJJRH0gbmUgJEdldFBhcmFte1VzZXJDdXN0b21lcklEfQogICAgICAgICAgICApCiAgICAgICAgewoKICAgICAgICAgICAgbXkgJUNvbXBhbnkgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJDb21wYW55JyktPkN1c3RvbWVyQ29tcGFueUdldCgKICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJEdldFBhcmFte1VzZXJDdXN0b21lcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISVDb21wYW55ICkgewogICAgICAgICAgICAgICAgJEVycm9yc3tVc2VyQ3VzdG9tZXJJREludmFsaWR9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBpZiBubyBlcnJvcnMgb2NjdXJyZWQKICAgICAgICBpZiAoICElRXJyb3JzICkgewoKICAgICAgICAgICAgbXkgJFVwZGF0ZVN1Y2Nlc3M7CiAgICAgICAgICAgIGlmICggISRVcGRhdGVPbmx5UHJlZmVyZW5jZXMgKSB7CiAgICAgICAgICAgICAgICAkVXBkYXRlU3VjY2VzcyA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlclVwZGF0ZSgKICAgICAgICAgICAgICAgICAgICAlR2V0UGFyYW0sCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJEdldFBhcmFte1VzZXJQYXNzd29yZH0gJiYgKCAkQ3VycmVudFVzZXJEYXRhe1VzZXJQYXNzd29yZH0gLy8gJycgKSBuZSAkR2V0UGFyYW17VXNlclBhc3N3b3JkfSApIHsKCiAgICAgICAgICAgICAgICAkVXBkYXRlU3VjY2VzcyA9ICRDdXN0b21lclVzZXJPYmplY3QtPkRlbGV0ZU9uZVByZWZlcmVuY2UoCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgID0+ICdVc2VyTGFzdFB3Q2hhbmdlVGltZScsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+ICRHZXRQYXJhbXtJRH0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkVXBkYXRlU3VjY2VzcyB8fCAkVXBkYXRlT25seVByZWZlcmVuY2VzICkgewoKICAgICAgICAgICAgICAgICMgc2V0IGR5bmFtaWMgZmllbGQgdmFsdWVzCiAgICAgICAgICAgICAgICBFTlRSWToKICAgICAgICAgICAgICAgIGZvciBteSAkRW50cnkgKCBAeyAkQ29uZmlnT2JqZWN0LT5HZXQoJFNvdXJjZSktPntNYXB9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBFTlRSWSBpZiAkRW50cnktPls1XSBuZSAnZHluYW1pY19maWVsZCc7CgogICAgICAgICAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRDb25maWcgPSAkU2VsZi0+e0R5bmFtaWNGaWVsZExvb2t1cH0tPnsgJEVudHJ5LT5bMl0gfTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZENvbmZpZykgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICROb3RlIC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZm8gPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdEeW5hbWljIGZpZWxkICVzIG5vdCBmb3VuZCEnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRFbnRyeS0+WzJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBFTlRSWTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIG15ICRWYWx1ZVNldCA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNldCgKICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgICAgICAgICA9PiAkR2V0UGFyYW17VXNlckxvZ2lufSwKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRHZXRQYXJhbXsgJEVudHJ5LT5bMF0gfSwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRTZWxmLT57VXNlcklEfSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBpZiAoICEkVmFsdWVTZXQgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICROb3RlIC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZm8gPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdVbmFibGUgdG8gc2V0IHZhbHVlIGZvciBkeW5hbWljIGZpZWxkICVzIScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEVudHJ5LT5bMl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEVOVFJZOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHVwZGF0ZSBwcmVmZXJlbmNlcwogICAgICAgICAgICAgICAgbXkgJVByZWZlcmVuY2VzID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclByZWZlcmVuY2VzR3JvdXBzJykgfTsKICAgICAgICAgICAgICAgIEdST1VQOgogICAgICAgICAgICAgICAgZm9yIG15ICRHcm91cCAoIHNvcnQga2V5cyAlUHJlZmVyZW5jZXMgKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBHUk9VUCBpZiAkR3JvdXAgZXEgJ1Bhc3N3b3JkJzsKCiAgICAgICAgICAgICAgICAgICAgIyBnZXQgdXNlciBkYXRhCiAgICAgICAgICAgICAgICAgICAgbXkgJVVzZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgVXNlciA9PiAkR2V0UGFyYW17VXNlckxvZ2lufQogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbXkgJE1vZHVsZSA9ICRQcmVmZXJlbmNlc3skR3JvdXB9LT57TW9kdWxlfTsKICAgICAgICAgICAgICAgICAgICBpZiAoICEkTWFpbk9iamVjdC0+UmVxdWlyZSgkTW9kdWxlKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPkZhdGFsRXJyb3IoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbXkgJE9iamVjdCA9ICRNb2R1bGUtPm5ldygKICAgICAgICAgICAgICAgICAgICAgICAgJXskU2VsZn0sCiAgICAgICAgICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW0gPT4gJFByZWZlcmVuY2VzeyRHcm91cH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJPYmplY3QgPT4gJEN1c3RvbWVyVXNlck9iamVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgRGVidWcgICAgICA9PiAkU2VsZi0+e0RlYnVnfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIG15IEBQYXJhbXMgPSAkT2JqZWN0LT5QYXJhbSgKICAgICAgICAgICAgICAgICAgICAgICAgVXNlckRhdGEgPT4gXCVVc2VyRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXIgPT4gMSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmIChAUGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICVHZXRQYXJhbTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRQYXJhbUl0ZW0gKEBQYXJhbXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15IEBBcnJheSA9ICRQYXJhbU9iamVjdC0+R2V0QXJyYXkoIFBhcmFtID0+ICRQYXJhbUl0ZW0tPntOYW1lfSApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJEdldFBhcmFteyAkUGFyYW1JdGVtLT57TmFtZX0gfSA9IFxAQXJyYXk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgISRPYmplY3QtPlJ1bigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRQYXJhbSA9PiBcJUdldFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJEYXRhID0+IFwlVXNlckRhdGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJE5vdGUgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KCBJbmZvID0+ICRPYmplY3QtPkVycm9yKCkgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGNsZWFyIGN1c3RvbWVyIHVzZXIgY2FjaGUKICAgICAgICAgICAgICAgICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckNhY2hlQ2xlYXIoCiAgICAgICAgICAgICAgICAgICAgVXNlckxvZ2luID0+ICRHZXRQYXJhbXtVc2VyTG9naW59LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGdldCB1c2VyIGRhdGEgYW5kIHNob3cgc2NyZWVuIGFnYWluCiAgICAgICAgICAgICAgICBpZiAoICEkTm90ZSApIHsKCiAgICAgICAgICAgICAgICAgICAgIyBpZiB0aGUgdXNlciB3b3VsZCBsaWtlIHRvIGNvbnRpbnVlIGVkaXRpbmcgdGhlIHByaW9yaXR5LCBqdXN0IHJlZGlyZWN0IHRvIHRoZSBlZGl0IHNjcmVlbgogICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ29udGludWVBZnRlclNhdmUnICkKICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAnQ29udGludWVBZnRlclNhdmUnICkgZXEgJzEnICkKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJElEID0gJFBhcmFtT2JqZWN0LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0lEJyApIHx8ICcnOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+UmVkaXJlY3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUCA9PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBY3Rpb249JFNlbGYtPntBY3Rpb259O1N1YmFjdGlvbj1DaGFuZ2U7SUQ9JElEO1NlYXJjaD0kU2VhcmNoO05hdj0kTmF2O05vdGlmaWNhdGlvbj1VcGRhdGUiCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICAgICAgICAgIyBvdGhlcndpc2UgcmV0dXJuIHRvIG92ZXJ2aWV3CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5SZWRpcmVjdCggT1AgPT4gIkFjdGlvbj0kU2VsZi0+e0FjdGlvbn07Tm90aWZpY2F0aW9uPVVwZGF0ZSIgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkTm90ZSAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoIFByaW9yaXR5ID0+ICdFcnJvcicgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzb21ldGhpbmcgaGFzIGdvbmUgd3JvbmcKICAgICAgICBteSAkT3V0cHV0ID0gJE5hdkJhcjsKICAgICAgICAkT3V0cHV0IC49ICROb3RlOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9FZGl0KAogICAgICAgICAgICBOYXYgICAgPT4gJE5hdiwKICAgICAgICAgICAgQWN0aW9uID0+ICdDaGFuZ2UnLAogICAgICAgICAgICBTb3VyY2UgPT4gJFNvdXJjZSwKICAgICAgICAgICAgU2VhcmNoID0+ICRTZWFyY2gsCiAgICAgICAgICAgIEVycm9ycyA9PiBcJUVycm9ycywKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICk7CgogICAgICAgIGlmICggJE5hdiBlcSAnTm9uZScgKSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCBUeXBlID0+ICdTbWFsbCcgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIGFkZAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgZWxzaWYgKCAkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0FkZCcgKSB7CiAgICAgICAgbXkgJUdldFBhcmFtOwogICAgICAgICRHZXRQYXJhbXtVc2VyTG9naW59ICA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdVc2VyTG9naW4nICkgIHx8ICcnOwogICAgICAgICRHZXRQYXJhbXtDdXN0b21lcklEfSA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdDdXN0b21lcklEJyApIHx8ICcnOwogICAgICAgIG15ICRPdXRwdXQgPSAkTmF2QmFyOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9FZGl0KAogICAgICAgICAgICBOYXYgICAgPT4gJE5hdiwKICAgICAgICAgICAgQWN0aW9uID0+ICdBZGQnLAogICAgICAgICAgICBTb3VyY2UgPT4gJFNvdXJjZSwKICAgICAgICAgICAgU2VhcmNoID0+ICRTZWFyY2gsCiAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICApOwoKICAgICAgICBpZiAoICROYXYgZXEgJ05vbmUnICkgewogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlciggVHlwZSA9PiAnU21hbGwnICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBhZGQgYWN0aW9uCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNpZiAoICRTZWxmLT57U3ViYWN0aW9ufSBlcSAnQWRkQWN0aW9uJyApIHsKCiAgICAgICAgIyBjaGFsbGVuZ2UgdG9rZW4gY2hlY2sgZm9yIHdyaXRlIGFjdGlvbgogICAgICAgICRMYXlvdXRPYmplY3QtPkNoYWxsZW5nZVRva2VuQ2hlY2soKTsKCiAgICAgICAgbXkgJE5vdGUgPSAnJzsKICAgICAgICBteSAoICVHZXRQYXJhbSwgJUVycm9ycyApOwoKICAgICAgICBteSAkQXV0b0xvZ2luQ3JlYXRpb24gPSAkQ29uZmlnT2JqZWN0LT5HZXQoJFNvdXJjZSktPntBdXRvTG9naW5DcmVhdGlvbn07CgogICAgICAgICMgR2V0IGR5bmFtaWMgZmllbGQgYmFja2VuZCBvYmplY3QuCiAgICAgICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgICAgIEVOVFJZOgogICAgICAgIGZvciBteSAkRW50cnkgKCBAeyAkQ29uZmlnT2JqZWN0LT5HZXQoJFNvdXJjZSktPntNYXB9IH0gKSB7CgogICAgICAgICAgICAjIGRvbid0IHZhbGlkYXRlIFVzZXJMb2dpbiBpZiBBdXRvTG9naW5DcmVhdGlvbiBpcyBjb25maWd1cmVkCiAgICAgICAgICAgIG5leHQgRU5UUlkgaWYgKCAkQXV0b0xvZ2luQ3JlYXRpb24gJiYgJEVudHJ5LT5bMF0gZXEgJ1VzZXJMb2dpbicgKTsKCiAgICAgICAgICAgICMgY2hlY2sgZHluYW1pYyBmaWVsZHMKICAgICAgICAgICAgaWYgKCAkRW50cnktPls1XSBlcSAnZHluYW1pY19maWVsZCcgKSB7CgogICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRTZWxmLT57RHluYW1pY0ZpZWxkTG9va3VwfS0+eyAkRW50cnktPlsyXSB9OwoKICAgICAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpICkgewogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiRHluYW1pY0ZpZWxkICRFbnRyeS0+WzJdIG5vdCBmb3VuZCEiLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBFTlRSWTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkVmFsaWRhdGlvblJlc3VsdCA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZVZhbGlkYXRlKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICAgICAgTWFuZGF0b3J5ICAgICAgICAgID0+ICRFbnRyeS0+WzRdLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBpZiAoICRWYWxpZGF0aW9uUmVzdWx0LT57U2VydmVyRXJyb3J9ICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnN7ICRFbnRyeS0+WzBdIH0gPSAkVmFsaWRhdGlvblJlc3VsdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICAgICAjIGdlbmVyYXRlIHN0b3JhYmxlIHZhbHVlIG9mIGR5bmFtaWMgZmllbGQgZWRpdCBmaWVsZAogICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJEVudHJ5LT5bMF0gfSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRWYWx1ZUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFtT2JqZWN0ICAgICAgICA9PiAkUGFyYW1PYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgY2hlY2sgcmVtYWluaW5nIG5vbi1keW5hbWljLWZpZWxkIG1hbmRhdG9yeSBmaWVsZHMKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkR2V0UGFyYW17ICRFbnRyeS0+WzBdIH0gPSAkUGFyYW1PYmplY3QtPkdldFBhcmFtKCBQYXJhbSA9PiAkRW50cnktPlswXSApIHx8ICcnOwogICAgICAgICAgICAgICAgaWYgKCAhJEdldFBhcmFteyAkRW50cnktPlswXSB9ICYmICRFbnRyeS0+WzRdICkgewogICAgICAgICAgICAgICAgICAgICRFcnJvcnN7ICRFbnRyeS0+WzBdIC4gJ0ludmFsaWQnIH0gPSAnU2VydmVyRXJyb3InOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGVtYWlsIGFkZHJlc3MKICAgICAgICBpZiAoCiAgICAgICAgICAgICRHZXRQYXJhbXtVc2VyRW1haWx9CiAgICAgICAgICAgICYmICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzID0+ICRHZXRQYXJhbXtVc2VyRW1haWx9ICkKICAgICAgICAgICAgJiYgZ3JlcCB7ICRfIGVxICRHZXRQYXJhbXtWYWxpZElEfSB9IEBWYWxpZElETGlzdAogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkRXJyb3Jze1VzZXJFbWFpbEludmFsaWR9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgJEVycm9yc3tFcnJvclR5cGV9ICAgICAgICA9ICRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRXJyb3JUeXBlKCkgLiAnU2VydmVyRXJyb3JNc2cnOwogICAgICAgIH0KCiAgICAgICAgIyBDaGVjayBDdXN0b21lcklELCBpZiBDdXN0b21lckNvbXBhbnlTdXBwb3J0IGlzIGVuYWJsZWQuCiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoJFNvdXJjZSktPntDdXN0b21lckNvbXBhbnlTdXBwb3J0fSAmJiAkR2V0UGFyYW17VXNlckN1c3RvbWVySUR9ICkgewoKICAgICAgICAgICAgbXkgJUNvbXBhbnkgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJDb21wYW55JyktPkN1c3RvbWVyQ29tcGFueUdldCgKICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJEdldFBhcmFte1VzZXJDdXN0b21lcklEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISVDb21wYW55ICkgewogICAgICAgICAgICAgICAgJEVycm9yc3tVc2VyQ3VzdG9tZXJJREludmFsaWR9ID0gJ1NlcnZlckVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBpZiBubyBlcnJvcnMgb2NjdXJyZWQKICAgICAgICBpZiAoICElRXJyb3JzICkgewoKICAgICAgICAgICAgIyBhZGQgdXNlcgogICAgICAgICAgICBteSAkVXNlciA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckFkZCgKICAgICAgICAgICAgICAgICVHZXRQYXJhbSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkU2VsZi0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBTb3VyY2UgPT4gJFNvdXJjZQogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoJFVzZXIpIHsKCiAgICAgICAgICAgICAgICBFTlRSWToKICAgICAgICAgICAgICAgIGZvciBteSAkRW50cnkgKCBAeyAkQ29uZmlnT2JqZWN0LT5HZXQoJFNvdXJjZSktPntNYXB9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBFTlRSWSB1bmxlc3MgJEVudHJ5LT5bNV0gZXEgJ2R5bmFtaWNfZmllbGQnOwoKICAgICAgICAgICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlnID0gJFNlbGYtPntEeW5hbWljRmllbGRMb29rdXB9LT57ICRFbnRyeS0+WzJdIH07CgogICAgICAgICAgICAgICAgICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpICkgewogICAgICAgICAgICAgICAgICAgICAgICAkTm90ZSAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmZvID0+ICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnRHluYW1pYyBmaWVsZCAlcyBub3QgZm91bmQhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRW50cnktPlsyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEVOVFJZOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgbXkgJFZhbHVlU2V0ID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlU2V0KAogICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSAgICAgICAgID0+ICRVc2VyLAogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJEdldFBhcmFteyAkRW50cnktPlswXSB9LAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFNlbGYtPntVc2VySUR9LAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIGlmICggISRWYWx1ZVNldCApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJE5vdGUgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5mbyA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1VuYWJsZSB0byBzZXQgdmFsdWUgZm9yIGR5bmFtaWMgZmllbGQgJXMhJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRW50cnktPlsyXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IEVOVFJZOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIHVwZGF0ZSBwcmVmZXJlbmNlcwogICAgICAgICAgICAgICAgbXkgJVByZWZlcmVuY2VzID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclByZWZlcmVuY2VzR3JvdXBzJykgfTsKICAgICAgICAgICAgICAgIEdST1VQOgogICAgICAgICAgICAgICAgZm9yIG15ICRHcm91cCAoIHNvcnQga2V5cyAlUHJlZmVyZW5jZXMgKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBHUk9VUCBpZiAkR3JvdXAgZXEgJ1Bhc3N3b3JkJzsKCiAgICAgICAgICAgICAgICAgICAgIyBnZXQgdXNlciBkYXRhCiAgICAgICAgICAgICAgICAgICAgbXkgJVVzZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICAgICAgVXNlciA9PiAkVXNlciwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIG15ICRNb2R1bGUgPSAkUHJlZmVyZW5jZXN7JEdyb3VwfS0+e01vZHVsZX07CiAgICAgICAgICAgICAgICAgICAgaWYgKCAhJE1haW5PYmplY3QtPlJlcXVpcmUoJE1vZHVsZSkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkTGF5b3V0T2JqZWN0LT5GYXRhbEVycm9yKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG15ICRPYmplY3QgPSAkTW9kdWxlLT5uZXcoCiAgICAgICAgICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgICAgICAgICBDb25maWdJdGVtID0+ICRQcmVmZXJlbmNlc3skR3JvdXB9LAogICAgICAgICAgICAgICAgICAgICAgICBVc2VyT2JqZWN0ID0+ICRDdXN0b21lclVzZXJPYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnICAgICAgPT4gJFNlbGYtPntEZWJ1Z30sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBteSBAUGFyYW1zID0gJE9iamVjdC0+UGFyYW0oCiAgICAgICAgICAgICAgICAgICAgICAgICV7ICRQcmVmZXJlbmNlc3skR3JvdXB9IH0sCiAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJEYXRhID0+IFwlVXNlckRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyID0+IDEsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoQFBhcmFtcykgewogICAgICAgICAgICAgICAgICAgICAgICBteSAlR2V0UGFyYW07CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciBteSAkUGFyYW1JdGVtIChAUGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSBAQXJyYXkgPSAkUGFyYW1PYmplY3QtPkdldEFycmF5KCBQYXJhbSA9PiAkUGFyYW1JdGVtLT57TmFtZX0gKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRHZXRQYXJhbXsgJFBhcmFtSXRlbS0+e05hbWV9IH0gPSBcQEFycmF5OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICEkT2JqZWN0LT5SdW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0UGFyYW0gPT4gXCVHZXRQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyRGF0YSA9PiBcJVVzZXJEYXRhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICROb3RlIC49ICRMYXlvdXRPYmplY3QtPk5vdGlmeSggSW5mbyA9PiAkT2JqZWN0LT5FcnJvcigpICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIyBnZXQgdXNlciBkYXRhIGFuZCBzaG93IHNjcmVlbiBhZ2FpbgogICAgICAgICAgICAgICAgaWYgKCAhJE5vdGUgKSB7CgogICAgICAgICAgICAgICAgICAgICMgaW4gYm9ycm93ZWQgdmlldywgdGFrZSB0aGUgbmV3IGNyZWF0ZWQgY3VzdG9tZXIgb3ZlciBpbnRvIHRoZSBuZXcgdGlja2V0CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkTmF2IGVxICdOb25lJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJE91dHB1dCA9ICROYXZCYXI7CgogICAgICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5BZGRKU0RhdGEoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXkgICA9PiAnQ3VzdG9tZXInLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJFVzZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICdOYXYnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJE5hdiwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+T3V0cHV0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkN1c3RvbWVyVXNlcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCBUeXBlID0+ICdTbWFsbCcgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAkT3V0cHV0OwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJFNlbGYtPl9PdmVydmlldygKICAgICAgICAgICAgICAgICAgICAgICAgTmF2ICAgID0+ICROYXYsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlYXJjaCA9PiAkU2VhcmNoLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIG15ICRPdXRwdXQgICAgICAgID0gJE5hdkJhciAuICROb3RlOwogICAgICAgICAgICAgICAgICAgIG15ICRVUkwgICAgICAgICAgID0gJyc7CiAgICAgICAgICAgICAgICAgICAgbXkgJFVzZXJIVE1MUXVvdGUgPSAkTGF5b3V0T2JqZWN0LT5MaW5rRW5jb2RlKCRVc2VyKTsKICAgICAgICAgICAgICAgICAgICBteSAkVXNlclF1b3RlICAgICA9ICRMYXlvdXRPYmplY3QtPkFzY2lpMkh0bWwoIFRleHQgPT4gJFVzZXIgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoICRDb25maWdPYmplY3QtPkdldCgnRnJvbnRlbmQ6Ok1vZHVsZScpLT57QWdlbnRUaWNrZXRQaG9uZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRVUkwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC49ICI8YSBocmVmPVwiJExheW91dE9iamVjdC0+e0Jhc2VsaW5rfUFjdGlvbj1BZ2VudFRpY2tldFBob25lO1N1YmFjdGlvbj1TdG9yZU5ldztFeHBhbmRDdXN0b21lck5hbWU9MjtDdXN0b21lclVzZXI9JFVzZXJIVE1MUXVvdGU7JExheW91dE9iamVjdC0+e0NoYWxsZW5nZVRva2VuUGFyYW19XCI+IgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoJ05ldyBwaG9uZSB0aWNrZXQnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiPC9hPiI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdGcm9udGVuZDo6TW9kdWxlJyktPntBZ2VudFRpY2tldEVtYWlsfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCRVUkwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRVUkwgLj0gIiAtICI7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgJFVSTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLj0gIjxhIGhyZWY9XCIkTGF5b3V0T2JqZWN0LT57QmFzZWxpbmt9QWN0aW9uPUFnZW50VGlja2V0RW1haWw7U3ViYWN0aW9uPVN0b3JlTmV3O0V4cGFuZEN1c3RvbWVyTmFtZT0yO0N1c3RvbWVyVXNlcj0kVXNlckhUTUxRdW90ZTskTGF5b3V0T2JqZWN0LT57Q2hhbGxlbmdlVG9rZW5QYXJhbX1cIj4iCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRMYXlvdXRPYmplY3QtPntMYW5ndWFnZU9iamVjdH0tPlRyYW5zbGF0ZSgnTmV3IGVtYWlsIHRpY2tldCcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICI8L2E+IjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCRVUkwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgJE91dHB1dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLj0gJExheW91dE9iamVjdC0+Tm90aWZ5KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJExheW91dE9iamVjdC0+e0xhbmd1YWdlT2JqZWN0fS0+VHJhbnNsYXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQ3VzdG9tZXIgJXMgYWRkZWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVXNlclF1b3RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICIgKCAkVVJMICkhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkT3V0cHV0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiAkTGF5b3V0T2JqZWN0LT57TGFuZ3VhZ2VPYmplY3R9LT5UcmFuc2xhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDdXN0b21lciAlcyBhZGRlZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRVc2VyUXVvdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIiEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5PdXRwdXQoCiAgICAgICAgICAgICAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5DdXN0b21lclVzZXInLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBpZiAoICROYXYgZXEgJ05vbmUnICkgewogICAgICAgICAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlciggVHlwZSA9PiAnU21hbGwnICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPkZvb3RlcigpOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkTm90ZSAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoIFByaW9yaXR5ID0+ICdFcnJvcicgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBzb21ldGhpbmcgaGFzIGdvbmUgd3JvbmcKICAgICAgICBteSAkT3V0cHV0ID0gJE5hdkJhciAuICROb3RlOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPl9FZGl0KAogICAgICAgICAgICBOYXYgICAgPT4gJE5hdiwKICAgICAgICAgICAgQWN0aW9uID0+ICdBZGQnLAogICAgICAgICAgICBTb3VyY2UgPT4gJFNvdXJjZSwKICAgICAgICAgICAgU2VhcmNoID0+ICRTZWFyY2gsCiAgICAgICAgICAgIEVycm9ycyA9PiBcJUVycm9ycywKICAgICAgICAgICAgJUdldFBhcmFtLAogICAgICAgICk7CgogICAgICAgIGlmICggJE5hdiBlcSAnTm9uZScgKSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCBUeXBlID0+ICdTbWFsbCcgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIG92ZXJ2aWV3CiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+X092ZXJ2aWV3KAogICAgICAgICAgICBOYXYgICAgPT4gJE5hdiwKICAgICAgICAgICAgU2VhcmNoID0+ICRTZWFyY2gsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJE5vdGlmaWNhdGlvbiA9ICRQYXJhbU9iamVjdC0+R2V0UGFyYW0oIFBhcmFtID0+ICdOb3RpZmljYXRpb24nICkgfHwgJyc7CiAgICAgICAgbXkgJE91dHB1dCAgICAgICA9ICROYXZCYXI7CiAgICAgICAgJE91dHB1dCAuPSAkTGF5b3V0T2JqZWN0LT5Ob3RpZnkoIEluZm8gPT4gVHJhbnNsYXRhYmxlKCdDdXN0b21lciB1c2VyIHVwZGF0ZWQhJykgKQogICAgICAgICAgICBpZiAoICROb3RpZmljYXRpb24gJiYgJE5vdGlmaWNhdGlvbiBlcSAnVXBkYXRlJyApOwoKICAgICAgICAkT3V0cHV0IC49ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkN1c3RvbWVyVXNlcicsCiAgICAgICAgICAgIERhdGEgICAgICAgICA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgIGlmICggJE5hdiBlcSAnTm9uZScgKSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCBUeXBlID0+ICdTbWFsbCcgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRPdXRwdXQgLj0gJExheW91dE9iamVjdC0+Rm9vdGVyKCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KfQoKc3ViIF9PdmVydmlldyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRMYXlvdXRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXcnLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnSW5jbHVkZUludmFsaWQnLAogICAgICAgIERhdGEgPT4gewogICAgICAgICAgICBJbmNsdWRlSW52YWxpZCAgICAgICAgPT4gJFNlbGYtPntJbmNsdWRlSW52YWxpZH0sCiAgICAgICAgICAgIEluY2x1ZGVJbnZhbGlkQ2hlY2tlZCA9PiAkU2VsZi0+e0luY2x1ZGVJbnZhbGlkfSA/ICdjaGVja2VkJyA6ICcnLAogICAgICAgIH0sCiAgICApOwogICAgJExheW91dE9iamVjdC0+QmxvY2soIE5hbWUgPT4gJ0FjdGlvbkxpc3QnICk7CiAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICBOYW1lID0+ICdBY3Rpb25TZWFyY2gnLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgbXkgJEN1c3RvbWVyVXNlck9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKTsKCiAgICAjIGdldCB3cml0YWJsZSBkYXRhIHNvdXJjZXMKICAgIG15ICVDdXN0b21lclNvdXJjZSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU291cmNlTGlzdCgKICAgICAgICBSZWFkT25seSA9PiAwLAogICAgKTsKCiAgICAjIG9ubHkgc2hvdyBBZGQgb3B0aW9uIGlmIHdlIGhhdmUgYXQgbGVhc3Qgb25lIHdyaXRhYmxlIGJhY2tlbmQKICAgIGlmICggc2NhbGFyIGtleXMgJUN1c3RvbWVyU291cmNlICkgewogICAgICAgICRQYXJhbXtTb3VyY2VPcHRpb259ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgIERhdGEgICAgICAgPT4geyAlQ3VzdG9tZXJTb3VyY2UsIH0sCiAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJ1NvdXJjZScsCiAgICAgICAgICAgIFNlbGVjdGVkSUQgPT4gJFBhcmFte1NvdXJjZX0gfHwgJycsCiAgICAgICAgICAgIENsYXNzICAgICAgPT4gJ01vZGVybml6ZScsCiAgICAgICAgKTsKCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0FjdGlvbkFkZCcsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgfQoKICAgIGlmICggJFBhcmFte1NlYXJjaH0gKSB7CgogICAgICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgICAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICAgICAgIyB3aGVuIHRoZXJlIGlzIG5vIGRhdGEgdG8gc2hvdywgYSBtZXNzYWdlIGlzIGRpc3BsYXllZCBvbiB0aGUgdGFibGUgd2l0aCB0aGlzIGNvbHNwYW4KICAgICAgICBteSAkQ29sU3BhbiA9IDY7CgogICAgICAgICMgc2FtZSBMaW1pdCBhcyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJTZWFyY2hMaXN0TGltaXR9CiAgICAgICAgIyBzbWFsbGVzdCBMaW1pdCBmcm9tIGFsbCBzb3VyY2VzCiAgICAgICAgbXkgJExpbWl0OwogICAgICAgIFNPVVJDRToKICAgICAgICBmb3IgbXkgJENvdW50ICggJycsIDEgLi4gMTAgKSB7CiAgICAgICAgICAgIG5leHQgU09VUkNFIGlmICEkQ29uZmlnT2JqZWN0LT5HZXQoIkN1c3RvbWVyVXNlciRDb3VudCIpOwogICAgICAgICAgICBteSAkQ3VzdG9tZXJVc2VyTWFwID0gJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lclVzZXIkQ291bnQiKTsKICAgICAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRDdXN0b21lclVzZXJNYXAtPntDdXN0b21lclVzZXJTZWFyY2hMaXN0TGltaXR9OwogICAgICAgICAgICBpZiAoICFkZWZpbmVkICRMaW1pdCB8fCAkQ3VzdG9tZXJVc2VyTWFwLT57Q3VzdG9tZXJVc2VyU2VhcmNoTGlzdExpbWl0fSA8ICRMaW1pdCApIHsKICAgICAgICAgICAgICAgICRMaW1pdCA9ICRDdXN0b21lclVzZXJNYXAtPntDdXN0b21lclVzZXJTZWFyY2hMaXN0TGltaXR9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGFzIGZhbGxiYWNrIHRha2UgdGhlIGhhcmRjb2RlZCBsaW1pdCBvZiBLZXJuZWwvU3lzdGVtL0N1c3RvbWVyVXNlci9EQi5wbQogICAgICAgICRMaW1pdCAvLz0gMjUwOwoKICAgICAgICBteSAlTGlzdEFsbEl0ZW1zID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJTZWFyY2goCiAgICAgICAgICAgIFNlYXJjaCA9PiAkUGFyYW17U2VhcmNofSwKICAgICAgICAgICAgTGltaXQgID0+ICRMaW1pdCArIDEsCiAgICAgICAgICAgIFZhbGlkICA9PiAwLAogICAgICAgICk7CgogICAgICAgIGlmICgga2V5cyAlTGlzdEFsbEl0ZW1zIDw9ICRMaW1pdCApIHsKICAgICAgICAgICAgbXkgJExpc3RBbGxJdGVtcyA9IGtleXMgJUxpc3RBbGxJdGVtczsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0hlYWRlcicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBMaXN0QWxsID0+ICRMaXN0QWxsSXRlbXMsCiAgICAgICAgICAgICAgICAgICAgTGltaXQgICA9PiAkTGltaXQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgbXkgJUxpc3QgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclNlYXJjaCgKICAgICAgICAgICAgU2VhcmNoID0+ICRQYXJhbXtTZWFyY2h9LAogICAgICAgICAgICBWYWxpZCAgPT4gJFNlbGYtPntJbmNsdWRlSW52YWxpZH0gPyAwIDogMSwKICAgICAgICApOwoKICAgICAgICBpZiAoIGtleXMgJUxpc3RBbGxJdGVtcyA+ICRMaW1pdCApIHsKICAgICAgICAgICAgbXkgJExpc3RBbGxJdGVtcyAgID0ga2V5cyAlTGlzdEFsbEl0ZW1zOwogICAgICAgICAgICBteSAkU2VhcmNoTGlzdFNpemUgPSBrZXlzICVMaXN0OwoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld0hlYWRlcicsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBTZWFyY2hMaXN0U2l6ZSA9PiAkU2VhcmNoTGlzdFNpemUsCiAgICAgICAgICAgICAgICAgICAgTGlzdEFsbCAgICAgICAgPT4gJExpc3RBbGxJdGVtcywKICAgICAgICAgICAgICAgICAgICBMaW1pdCAgICAgICAgICA9PiAkTGltaXQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3UmVzdWx0JywKICAgICAgICAgICAgRGF0YSA9PiBcJVBhcmFtLAogICAgICAgICk7CgogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCdTd2l0Y2hUb0N1c3RvbWVyJykgJiYgJFNlbGYtPntTd2l0Y2hUb0N1c3RvbWVyUGVybWlzc2lvbn0gJiYgJFBhcmFte05hdn0gbmUgJ05vbmUnICkKICAgICAgICB7CiAgICAgICAgICAgICRDb2xTcGFuID0gNzsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld1Jlc3VsdFN3aXRjaFRvQ3VzdG9tZXInLAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgIyBpZiB0aGVyZSBhcmUgcmVzdWx0cyB0byBzaG93CiAgICAgICAgaWYgKCVMaXN0KSB7CgogICAgICAgICAgICAjIGdldCB2YWxpZCBsaXN0CiAgICAgICAgICAgIG15ICVWYWxpZExpc3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRMaXN0KCk7CiAgICAgICAgICAgIGZvciBteSAkTGlzdEtleSAoIHNvcnQgeyBsYygkYSkgY21wIGxjKCRiKSB9IGtleXMgJUxpc3QgKSB7CgogICAgICAgICAgICAgICAgbXkgJVVzZXJEYXRhID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyRGF0YUdldCggVXNlciA9PiAkTGlzdEtleSApOwogICAgICAgICAgICAgICAgJFVzZXJEYXRhe1VzZXJGdWxsbmFtZX0gPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lck5hbWUoCiAgICAgICAgICAgICAgICAgICAgVXNlckxvZ2luID0+ICRVc2VyRGF0YXtVc2VyTG9naW59LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld1Jlc3VsdFJvdycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkICAgICAgID0+ICRWYWxpZExpc3R7ICRVc2VyRGF0YXtWYWxpZElEfSB8fCAnJyB9IHx8ICctJywKICAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoICAgICAgPT4gJFBhcmFte1NlYXJjaH0sCiAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyS2V5ID0+ICRMaXN0S2V5LAogICAgICAgICAgICAgICAgICAgICAgICAlVXNlckRhdGEsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXtOYXZ9IGVxICdOb25lJyApIHsKICAgICAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdSZXN1bHRSb3dMaW5rTm9uZScsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoICAgICAgPT4gJFBhcmFte1NlYXJjaH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXN0b21lcktleSA9PiAkTGlzdEtleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICVVc2VyRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3UmVzdWx0Um93TGluaycsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoICAgICAgPT4gJFBhcmFte1NlYXJjaH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYXYgICAgICAgICA9PiAkUGFyYW17TmF2fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1c3RvbWVyS2V5ID0+ICRMaXN0S2V5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJVVzZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgnU3dpdGNoVG9DdXN0b21lcicpCiAgICAgICAgICAgICAgICAgICAgJiYgJFNlbGYtPntTd2l0Y2hUb0N1c3RvbWVyUGVybWlzc2lvbn0KICAgICAgICAgICAgICAgICAgICAmJiAkUGFyYW17TmF2fSBuZSAnTm9uZScKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3UmVzdWx0Um93U3dpdGNoVG9DdXN0b21lcicsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoID0+ICRQYXJhbXtTZWFyY2h9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgJVVzZXJEYXRhLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgb3RoZXJ3aXNlIGl0IGRpc3BsYXlzIGEgbm8gZGF0YSBmb3VuZCBtZXNzYWdlCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnTm9EYXRhRm91bmRNc2cnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQ29sU3BhbiA9PiAkQ29sU3BhbiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgaWYgdGhlcmUgaXMgbm90aGluZyB0byBzZWFyY2ggaXQgc2hvd3MgYSBtZXNzYWdlCiAgICBlbHNlCiAgICB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ05vU2VhcmNoVGVybXMnLAogICAgICAgICAgICBEYXRhID0+IHt9LAogICAgICAgICk7CiAgICB9CgogICAgJExheW91dE9iamVjdC0+QWRkSlNEYXRhKAogICAgICAgIEtleSAgID0+ICdOYXYnLAogICAgICAgIFZhbHVlID0+ICRQYXJhbXtOYXZ9LAogICAgKTsKCiAgICByZXR1cm47Cn0KCnN1YiBfRWRpdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgR2V0IGxheW91dCBvYmplY3QuCiAgICBteSAkTGF5b3V0T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCcpOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICApOwoKICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdBY3Rpb25MaXN0JyApOwogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnQWN0aW9uT3ZlcnZpZXcnLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnT3ZlcnZpZXdVcGRhdGUnLAogICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICk7CgogICAgaWYgKCAkUGFyYW17QWN0aW9ufSBlcSAnQ2hhbmdlJyApIHsKCiAgICAgICAgIyBzaG93cyBlZGl0IGhlYWRlcgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKCBOYW1lID0+ICdIZWFkZXJFZGl0JyApOwoKICAgICAgICAjIHNob3dzIGVmZmVjdGl2ZSBwZXJtaXNzaW9ucyBtYXRyaXgKICAgICAgICAkU2VsZi0+X0VmZmVjdGl2ZVBlcm1pc3Npb25zKCVQYXJhbSk7CiAgICB9CgogICAgIyBzaG93cyBhZGQgaGVhZGVyCiAgICBlbHNlIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jayggTmFtZSA9PiAnSGVhZGVyQWRkJyApOwogICAgfQoKICAgIG15ICRVcGRhdGVPbmx5UHJlZmVyZW5jZXM7CgogICAgIyBHZXQgY29uZmlnIG9iamVjdAogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyB1cGRhdGUgdXNlcgogICAgaWYgKAogICAgICAgICRDb25maWdPYmplY3QtPkdldCggJFBhcmFte1NvdXJjZX0gKS0+e1JlYWRPbmx5fQogICAgICAgIHx8CiAgICAgICAgJENvbmZpZ09iamVjdC0+R2V0KCAkUGFyYW17U291cmNlfSApLT57TW9kdWxlfSA9fiAvTERBUC9pCiAgICAgICAgKQogICAgewogICAgICAgICRVcGRhdGVPbmx5UHJlZmVyZW5jZXMgPSAxOwogICAgfQoKICAgICMgR2V0IGR5bmFtaWMgZmllbGQgYmFja2VuZCBvYmplY3QuCiAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKICAgIG15ICRQYXJhbU9iamVjdCAgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OldlYjo6UmVxdWVzdCcpOwoKICAgIEVOVFJZOgogICAgZm9yIG15ICRFbnRyeSAoIEB7ICRDb25maWdPYmplY3QtPkdldCggJFBhcmFte1NvdXJjZX0gKS0+e01hcH0gfSApIHsKICAgICAgICBuZXh0IEVOVFJZIGlmICEkRW50cnktPlswXTsKCiAgICAgICAgIyBIYW5kbGUgZHluYW1pYyBmaWVsZHMKICAgICAgICBpZiAoICRFbnRyeS0+WzVdIGVxICdkeW5hbWljX2ZpZWxkJyApIHsKCiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRDb25maWcgPSAkU2VsZi0+e0R5bmFtaWNGaWVsZExvb2t1cH0tPnsgJEVudHJ5LT5bMl0gfTsKCiAgICAgICAgICAgIG5leHQgRU5UUlkgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgIyBHZXQgSFRNTCBmb3IgZHluYW1pYyBmaWVsZAogICAgICAgICAgICBteSAkRHluYW1pY0ZpZWxkSFRNTCA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5FZGl0RmllbGRSZW5kZXIoCiAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkUGFyYW17ICRFbnRyeS0+WzBdIH0gPyAkUGFyYW17ICRFbnRyeS0+WzBdIH0gOiB1bmRlZiwKICAgICAgICAgICAgICAgIE1hbmRhdG9yeSAgICAgICAgICA9PiAkRW50cnktPls0XSwKICAgICAgICAgICAgICAgIExheW91dE9iamVjdCAgICAgICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgICAgICAgICAgUGFyYW1PYmplY3QgICAgICAgID0+ICRQYXJhbU9iamVjdCwKCiAgICAgICAgICAgICAgICAjIFNlcnZlciBlcnJvciwgaWYgYW55CiAgICAgICAgICAgICAgICAleyAkUGFyYW17RXJyb3JzfS0+eyAkRW50cnktPlswXSB9IH0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIHNraXAgZmllbGRzIGZvciB3aGljaCBIVE1MIGNvdWxkIG5vdCBiZSByZXRyaWV2ZWQKICAgICAgICAgICAgbmV4dCBFTlRSWSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJER5bmFtaWNGaWVsZEhUTUwpOwoKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdJdGVtJywKICAgICAgICAgICAgICAgIERhdGEgPT4ge30sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0R5bmFtaWNGaWVsZCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBOYW1lICA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLT57TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgTGFiZWwgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntMYWJlbH0sCiAgICAgICAgICAgICAgICAgICAgRmllbGQgPT4gJER5bmFtaWNGaWVsZEhUTUwtPntGaWVsZH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBFTlRSWTsKICAgICAgICB9CgogICAgICAgIG15ICRCbG9jayA9ICdJbnB1dCc7CgogICAgICAgICMgY2hlY2sgaW5wdXQgdHlwZQogICAgICAgIGlmICggJEVudHJ5LT5bMF0gPX4gL15Vc2VyUGFzc3dvci9pICkgewogICAgICAgICAgICAkQmxvY2sgPSAnUGFzc3dvcmQnOwogICAgICAgIH0KCiAgICAgICAgIyBjaGVjayBpZiBsb2dpbiBhdXRvIGNyZWF0aW9uCiAgICAgICAgaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoICRQYXJhbXtTb3VyY2V9ICktPntBdXRvTG9naW5DcmVhdGlvbn0gJiYgJEVudHJ5LT5bMF0gZXEgJ1VzZXJMb2dpbicgKSB7CiAgICAgICAgICAgICRCbG9jayA9ICdJbnB1dEhpZGRlbic7CiAgICAgICAgfQoKICAgICAgICBpZiAoICRFbnRyeS0+WzddIHx8ICRVcGRhdGVPbmx5UHJlZmVyZW5jZXMgKSB7CiAgICAgICAgICAgICRQYXJhbXtSZWFkT25seX0gPSAxOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBhcmFte1JlYWRPbmx5fSA9IDA7CiAgICAgICAgfQoKICAgICAgICAjIHNob3cgcmVxdWlyZWQgZmxhZwogICAgICAgIGlmICggJEVudHJ5LT5bNF0gKSB7CiAgICAgICAgICAgICRQYXJhbXtSZXF1aXJlZENsYXNzfSAgICAgICAgICA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgICAgICRQYXJhbXtSZXF1aXJlZExhYmVsQ2xhc3N9ICAgICA9ICdNYW5kYXRvcnknOwogICAgICAgICAgICAkUGFyYW17UmVxdWlyZWRMYWJlbENoYXJhY3Rlcn0gPSAnKic7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17UmVxdWlyZWRDbGFzc30gICAgICAgICAgPSAnJzsKICAgICAgICAgICAgJFBhcmFte1JlcXVpcmVkTGFiZWxDbGFzc30gICAgID0gJyc7CiAgICAgICAgICAgICRQYXJhbXtSZXF1aXJlZExhYmVsQ2hhcmFjdGVyfSA9ICcnOwogICAgICAgIH0KCiAgICAgICAgIyBzZXQgZW1wdHkgc3RyaW5nCiAgICAgICAgJFBhcmFte0Vycm9yc30tPnsgJEVudHJ5LT5bMF0gLiAnSW52YWxpZCcgfSB8fD0gJyc7CgogICAgICAgICMgYWRkIGNsYXNzIHRvIHZhbGlkYXRlIGVtYWlscwogICAgICAgIGlmICggJEVudHJ5LT5bMF0gZXEgJ1VzZXJFbWFpbCcgKSB7CiAgICAgICAgICAgICRQYXJhbXtSZXF1aXJlZENsYXNzfSAuPSAnIFZhbGlkYXRlX0VtYWlsJzsKICAgICAgICB9CgogICAgICAgICMgQnVpbGQgc2VsZWN0aW9ucyBvciBpbnB1dCBmaWVsZHMuCiAgICAgICAgIyBBbiBleHBsaWNpdCBzZWxlY3Rpb24gaGFzIHRoZSBoaWdoZXN0IHByaW9yaXR5LgogICAgICAgIGlmICggJENvbmZpZ09iamVjdC0+R2V0KCAkUGFyYW17U291cmNlfSApLT57U2VsZWN0aW9uc30tPnsgJEVudHJ5LT5bMF0gfSApIHsKICAgICAgICAgICAgJEJsb2NrID0gJ09wdGlvbic7CgogICAgICAgICAgICAjIENoYW5nZSB0aGUgdmFsaWRhdGlvbiBjbGFzcwogICAgICAgICAgICBpZiAoICRQYXJhbXtSZXF1aXJlZENsYXNzfSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtSZXF1aXJlZENsYXNzfSA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgZ2V0IHRoZSBkYXRhIG9mIHRoZSBjdXJyZW50IHNlbGVjdGlvbgogICAgICAgICAgICBteSAkU2VsZWN0aW9uc0RhdGEgPSAkQ29uZmlnT2JqZWN0LT5HZXQoICRQYXJhbXtTb3VyY2V9ICktPntTZWxlY3Rpb25zfS0+eyAkRW50cnktPlswXSB9OwoKICAgICAgICAgICAgIyBtYWtlIHN1cmUgdGhlIGVuY29kaW5nIHN0YW1wIGlzIHNldAogICAgICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyRTZWxlY3Rpb25zRGF0YX0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZWN0aW9uc0RhdGEtPnskS2V5fSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnKS0+RW5jb2RlSW5wdXQoICRTZWxlY3Rpb25zRGF0YS0+eyRLZXl9ICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgYnVpbGQgb3B0aW9uIHN0cmluZwogICAgICAgICAgICAkUGFyYW17T3B0aW9ufSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICAgPT4gJFNlbGVjdGlvbnNEYXRhLAogICAgICAgICAgICAgICAgTmFtZSAgICAgICAgPT4gJEVudHJ5LT5bMF0sCiAgICAgICAgICAgICAgICBUcmFuc2xhdGlvbiA9PiAxLAogICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCAgPT4gJFBhcmFteyAkRW50cnktPlswXSB9LAogICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgPT4gIiRQYXJhbXtSZXF1aXJlZENsYXNzfSBNb2Rlcm5pemUgIiAuICRQYXJhbXtFcnJvcnN9LT57ICRFbnRyeS0+WzBdIC4gJ0ludmFsaWQnIH0sCiAgICAgICAgICAgICAgICBEaXNhYmxlZCAgICA9PiAkVXBkYXRlT25seVByZWZlcmVuY2VzID8gMSA6IDAsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICgKICAgICAgICAgICAgJEVudHJ5LT5bMF0gPX4gbS9eVXNlckNvdW50cnkvaQogICAgICAgICAgICAmJgogICAgICAgICAgICAkQ29uZmlnT2JqZWN0LT5HZXQoJ1JlZmVyZW5jZURhdGE6OlRyYW5zbGF0ZWRDb3VudHJ5TmFtZXMnKQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkQmxvY2sgPSAnT3B0aW9uJzsKCiAgICAgICAgICAgIG15ICRDb3VudHJ5TGlzdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpSZWZlcmVuY2VEYXRhJyktPkNMRFJDb3VudHJ5TGlzdCgKICAgICAgICAgICAgICAgIExhbmd1YWdlID0+ICRMYXlvdXRPYmplY3QtPntVc2VyTGFuZ3VhZ2V9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBNYWtlIHN1cmUgdGhhdCB0aGUgcHJldmlvdXMgdmFsdWUgZXhpc3RzIGluIHRoZSBzZWxlY3Rpb24gbGlzdCBldmVuIGlmIGlzbid0IGEgY291bnRyeSBjb2RlLgogICAgICAgICAgICBteSAkUHJldmlvdXNDb3VudHJ5ID0gJFBhcmFteyAkRW50cnktPlswXSB9OwogICAgICAgICAgICBpZiAoJFByZXZpb3VzQ291bnRyeSkgewogICAgICAgICAgICAgICAgJENvdW50cnlMaXN0LT57JFByZXZpb3VzQ291bnRyeX0gLy89ICRQcmV2aW91c0NvdW50cnk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRQYXJhbXtPcHRpb259ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJENvdW50cnlMaXN0LAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICBTb3J0ICAgICAgICAgPT4gJ0FscGhhbnVtZXJpY1ZhbHVlJywKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkRW50cnktPlswXSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgICA9PiAiJFBhcmFte1JlcXVpcmVkQ2xhc3N9IE1vZGVybml6ZSAiIC4gJFBhcmFte0Vycm9yc30tPnsgJEVudHJ5LT5bMF0gLiAnSW52YWxpZCcgfSwKICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAoICRQYXJhbXsgJEVudHJ5LT5bMF0gfSAvLyAxICksCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJEVudHJ5LT5bMF0gPX4gbS9eVmFsaWRJRC9pICkgewoKICAgICAgICAgICAgIyBDaGFuZ2UgdGhlIHZhbGlkYXRpb24gY2xhc3MKICAgICAgICAgICAgaWYgKCAkUGFyYW17UmVxdWlyZWRDbGFzc30gKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17UmVxdWlyZWRDbGFzc30gPSAnVmFsaWRhdGVfUmVxdWlyZWQnOwogICAgICAgICAgICB9CgogICAgICAgICAgICAjIGJ1aWxkIFZhbGlkSUQgc3RyaW5nCiAgICAgICAgICAgICRCbG9jayA9ICdPcHRpb24nOwogICAgICAgICAgICAkUGFyYW17T3B0aW9ufSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgRGF0YSAgICAgICA9PiB7ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpLT5WYWxpZExpc3QoKSwgfSwKICAgICAgICAgICAgICAgIE5hbWUgICAgICAgPT4gJEVudHJ5LT5bMF0sCiAgICAgICAgICAgICAgICBTZWxlY3RlZElEID0+IGRlZmluZWQoICRQYXJhbXsgJEVudHJ5LT5bMF0gfSApID8gJFBhcmFteyAkRW50cnktPlswXSB9IDogMSwKICAgICAgICAgICAgICAgIENsYXNzICAgICAgPT4gIiRQYXJhbXtSZXF1aXJlZENsYXNzfSBNb2Rlcm5pemUgIiAuICRQYXJhbXtFcnJvcnN9LT57ICRFbnRyeS0+WzBdIC4gJ0ludmFsaWQnIH0sCiAgICAgICAgICAgICAgICBEaXNhYmxlZCAgID0+ICRVcGRhdGVPbmx5UHJlZmVyZW5jZXMgPyAxIDogMCwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKAogICAgICAgICAgICAkRW50cnktPlswXSA9fiBtL15Vc2VyQ3VzdG9tZXJJRCQvaQogICAgICAgICAgICAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoICRQYXJhbXtTb3VyY2V9ICktPntDdXN0b21lckNvbXBhbnlTdXBwb3J0fQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICBteSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQ29tcGFueScpOwogICAgICAgICAgICBteSAlQ29tcGFueUxpc3QgICAgICAgICAgID0gKAogICAgICAgICAgICAgICAgJEN1c3RvbWVyQ29tcGFueU9iamVjdC0+Q3VzdG9tZXJDb21wYW55TGlzdCggTGltaXQgPT4gMCApLAogICAgICAgICAgICAgICAgJycgPT4gJy0nLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICRQYXJhbXsgJEVudHJ5LT5bMF0gfSApIHsKICAgICAgICAgICAgICAgIG15ICVDb21wYW55ID0gJEN1c3RvbWVyQ29tcGFueU9iamVjdC0+Q3VzdG9tZXJDb21wYW55R2V0KAogICAgICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJFBhcmFteyAkRW50cnktPlswXSB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggISVDb21wYW55ICkgewogICAgICAgICAgICAgICAgICAgICRDb21wYW55TGlzdHsgJFBhcmFteyAkRW50cnktPlswXSB9IH0gPSAkUGFyYW17ICRFbnRyeS0+WzBdIH0gLiAnICgtKSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEJsb2NrID0gJ09wdGlvbic7CgogICAgICAgICAgICAjIENoYW5nZSB0aGUgdmFsaWRhdGlvbiBjbGFzcwogICAgICAgICAgICBpZiAoICRQYXJhbXtSZXF1aXJlZENsYXNzfSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtSZXF1aXJlZENsYXNzfSA9ICdWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRVc2VBdXRvQ29tcGxldGUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpLT5HZXQoJ0FkbWluQ3VzdG9tZXJVc2VyOjpVc2VBdXRvQ29tcGxldGUnKTsKCiAgICAgICAgICAgIGlmICgkVXNlQXV0b0NvbXBsZXRlKSB7CgogICAgICAgICAgICAgICAgbXkgJFZhbHVlID0gJFBhcmFteyAkRW50cnktPlswXSB9IHx8ICRQYXJhbXtDdXN0b21lcklEfTsKICAgICAgICAgICAgICAgICRWYWx1ZSA9ICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZSA9PiAiWyUgRGF0YS5WYWx1ZSB8IGh0bWwgJV0iLAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJFBhcmFte09wdGlvbn0gPSAnPGlucHV0IHR5cGU9InRleHQiIGlkPSJVc2VyQ3VzdG9tZXJJRCIgbmFtZT0iVXNlckN1c3RvbWVySUQiIHZhbHVlPSInIC4gJFZhbHVlIC4gJyIKICAgICAgICAgICAgICAgICAgICBjbGFzcz0iVzUwcGMgQ3VzdG9tZXJBdXRvQ29tcGxldGVTaW1wbGUgJwogICAgICAgICAgICAgICAgICAgIC4gJFBhcmFte1JlcXVpcmVkQ2xhc3N9IC4gJyAnCiAgICAgICAgICAgICAgICAgICAgLiAkUGFyYW17RXJyb3JzfS0+eyAkRW50cnktPlswXSAuICdJbnZhbGlkJyB9CiAgICAgICAgICAgICAgICAgICAgLiAnIiBkYXRhLWN1c3RvbWVyLXNlYXJjaC10eXBlPSJDdXN0b21lcklEIiAvPic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkUGFyYW17T3B0aW9ufSA9ICRMYXlvdXRPYmplY3QtPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgICAgIERhdGEgICAgICAgPT4gXCVDb21wYW55TGlzdCwKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgID0+ICRFbnRyeS0+WzBdLAogICAgICAgICAgICAgICAgICAgIE1heCAgICAgICAgPT4gODAsCiAgICAgICAgICAgICAgICAgICAgU2VsZWN0ZWRJRCA9PiAkUGFyYW17ICRFbnRyeS0+WzBdIH0gfHwgJFBhcmFte0N1c3RvbWVySUR9LAogICAgICAgICAgICAgICAgICAgIENsYXNzICAgICAgPT4gIiRQYXJhbXtSZXF1aXJlZENsYXNzfSBNb2Rlcm5pemUgIiAuICRQYXJhbXtFcnJvcnN9LT57ICRFbnRyeS0+WzBdIC4gJ0ludmFsaWQnIH0sCiAgICAgICAgICAgICAgICAgICAgRGlzYWJsZWQgICA9PiAkVXBkYXRlT25seVByZWZlcmVuY2VzID8gMSA6IDAsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFBhcmFte0FjdGlvbn0gZXEgJ0FkZCcgJiYgJEVudHJ5LT5bMF0gPX4gL15Vc2VyQ3VzdG9tZXJJRCQvaSApIHsKCiAgICAgICAgICAgICMgVXNlIEN1c3RvbWVySUQgcGFyYW0gaWYgY2FsbGVkIGZyb20gQ0lDLgogICAgICAgICAgICAkUGFyYW17VmFsdWV9ID0gJFBhcmFteyAkRW50cnktPlswXSB9IHx8ICRQYXJhbXtDdXN0b21lcklEfSB8fCAnJzsKICAgICAgICB9CiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAgICAgIyBCdWlsZCB0aGUgZ3JvdXAgZmllbGQuCiAgICAgICAgZWxzaWYgKCAkRW50cnktPlswXSA9fiAvXlVzZXJHcm91cElEJC9pICkgewogICAgICAgICAgICAjIENoZWNrIGlmIHRoZSB1c2VyIGhhcyB0aGUgcGVybWlzc2lvbiB0byBzZWUvY2hhbmdlIHRoZSBtdWx0aXRlbmFuY3kgZmllbGQuCiAgICAgICAgICAgIGlmICggISRTZWxmLT57TXVsdGl0ZW5hbmN5UGVybWlzc2lvbn0gKSB7CiAgICAgICAgICAgICAgICBuZXh0IEVOVFJZOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIyBCdWlsZCB0aGUgZmllbGQuCiAgICAgICAgICAgICAgICAkQmxvY2sgPSAnT3B0aW9uJzsKICAgICAgICAgICAgICAgICRQYXJhbXtPcHRpb259ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5Hcm91cExpc3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZCA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBOYW1lICAgICAgICAgPT4gJEVudHJ5LT5bMF0sCiAgICAgICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MgICAgICAgID0+ICdNb2Rlcm5pemUgJyAuICggJFBhcmFte0Vycm9yc30tPnsgJEVudHJ5LT5bMF0gLiAnSW52YWxpZCcgfSB8fCAnJyApLAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkSUQgICA9PiAkUGFyYW17ICRFbnRyeS0+WzBdIH0gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgRGlzYWJsZWQgICAgID0+ICRVcGRhdGVPbmx5UHJlZmVyZW5jZXMgPyAxIDogMCwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBhcmFte1ZhbHVlfSA9ICRQYXJhbXsgJEVudHJ5LT5bMF0gfSB8fCAnJzsKICAgICAgICB9CgogICAgICAgICMgYWRkIGZvcm0gb3B0aW9uCiAgICAgICAgaWYgKCAkUGFyYW17VHlwZX0gJiYgJFBhcmFte1R5cGV9IGVxICdoaWRkZW4nICkgewogICAgICAgICAgICAkUGFyYW17UHJlZmVyZW5jZXN9IC49ICRQYXJhbXtWYWx1ZX07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1ByZWZlcmVuY2VzR2VuZXJpYycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBJdGVtID0+ICRFbnRyeS0+WzFdLAogICAgICAgICAgICAgICAgICAgICVQYXJhbQogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICJQcmVmZXJlbmNlc0dlbmVyaWMkQmxvY2siLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgSXRlbSAgICAgICAgID0+ICRFbnRyeS0+WzFdLAogICAgICAgICAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAkRW50cnktPlswXSwKICAgICAgICAgICAgICAgICAgICBJbnZhbGlkRmllbGQgPT4gJFBhcmFte0Vycm9yc30tPnsgJEVudHJ5LT5bMF0gLiAnSW52YWxpZCcgfSB8fCAnJywKICAgICAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBhZGQgdGhlIGNvcnJlY3QgY2xpZW50IHNpZGUgZXJyb3IgbXNnCiAgICAgICAgICAgIGlmICggJEJsb2NrIGVxICdJbnB1dCcgJiYgJEVudHJ5LT5bMF0gZXEgJ1VzZXJFbWFpbCcgKSB7CiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcmVmZXJlbmNlc1VzZXJFbWFpbEVycm9yTXNnJywKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgTmFtZSA9PiAkRW50cnktPlswXSB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gIlByZWZlcmVuY2VzR2VuZXJpY0Vycm9yTXNnIiwKICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsgTmFtZSA9PiAkRW50cnktPlswXSB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBhZGQgdGhlIGNvcnJlY3Qgc2VydmVyIGVycm9yIG1zZwogICAgICAgICAgICBpZiAoICRCbG9jayBlcSAnSW5wdXQnICYmICRQYXJhbXtVc2VyRW1haWx9ICYmICRFbnRyeS0+WzBdIGVxICdVc2VyRW1haWwnICkgewoKICAgICAgICAgICAgICAgICMgZGlzcGxheSBzZXJ2ZXIgZXJyb3IgbXNnIGFjY29yZGluZyB3aXRoIHRoZSBvY2N1cnJlZCBlbWFpbCBlcnJvciB0eXBlCiAgICAgICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdQcmVmZXJlbmNlc1VzZXJFbWFpbCcgLiAoICRQYXJhbXtFcnJvcnN9LT57RXJyb3JUeXBlfSB8fCAnJyApLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyBOYW1lID0+ICRFbnRyeS0+WzBdIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAiUHJlZmVyZW5jZXNHZW5lcmljU2VydmVyRXJyb3JNc2ciLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4geyBOYW1lID0+ICRFbnRyeS0+WzBdIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIG15ICRQcmVmZXJlbmNlc1VzZWQgPSAkQ29uZmlnT2JqZWN0LT5HZXQoICRQYXJhbXtTb3VyY2V9ICktPntBZG1pblNldFByZWZlcmVuY2VzfTsKICAgIGlmICggKCBkZWZpbmVkICRQcmVmZXJlbmNlc1VzZWQgJiYgJFByZWZlcmVuY2VzVXNlZCAhPSAwICkgfHwgIWRlZmluZWQgJFByZWZlcmVuY2VzVXNlZCApIHsKCiAgICAgICAgbXkgJURhdGE7CiAgICAgICAgbXkgJVByZWZlcmVuY2VzID0gJXsgJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclByZWZlcmVuY2VzR3JvdXBzJykgfTsKCiAgICAgICAgR1JPVVA6CiAgICAgICAgZm9yIG15ICRHcm91cCAoIHNvcnQga2V5cyAlUHJlZmVyZW5jZXMgKSB7CgogICAgICAgICAgICBuZXh0IEdST1VQIGlmICEkR3JvdXA7CgogICAgICAgICAgICBteSAkUHJlZmVyZW5jZXNHcm91cCA9ICRQcmVmZXJlbmNlc3skR3JvdXB9OwoKICAgICAgICAgICAgbmV4dCBHUk9VUCBpZiAhJFByZWZlcmVuY2VzR3JvdXA7CiAgICAgICAgICAgIG5leHQgR1JPVVAgaWYgcmVmICRQcmVmZXJlbmNlc0dyb3VwIG5lICdIQVNIJzsKCiAgICAgICAgICAgIGlmICggJERhdGF7ICRQcmVmZXJlbmNlc0dyb3VwLT57UHJpb30gfSApIHsKCiAgICAgICAgICAgICAgICBDT1VOVDoKICAgICAgICAgICAgICAgIGZvciAoIDEgLi4gMTUxICkgewoKICAgICAgICAgICAgICAgICAgICAkUHJlZmVyZW5jZXNHcm91cC0+e1ByaW99Kys7CgogICAgICAgICAgICAgICAgICAgIGlmICggISREYXRheyAkUHJlZmVyZW5jZXNHcm91cC0+e1ByaW99IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyAkUHJlZmVyZW5jZXNHcm91cC0+e1ByaW99IH0gPSAkR3JvdXA7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgQ09VTlQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAkRGF0YXsgJFByZWZlcmVuY2VzR3JvdXAtPntQcmlvfSB9ID0gJEdyb3VwOwogICAgICAgIH0KCiAgICAgICAgIyBzb3J0CiAgICAgICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJURhdGEgKSB7CiAgICAgICAgICAgICREYXRheyBzcHJpbnRmICIlMDdkIiwgJEtleSB9ID0gJERhdGF7JEtleX07CiAgICAgICAgICAgIGRlbGV0ZSAkRGF0YXskS2V5fTsKICAgICAgICB9CgogICAgICAgICMgc2hvdyBlYWNoIHByZWZlcmVuY2VzIHNldHRpbmcKICAgICAgICBQUklPOgogICAgICAgIGZvciBteSAkUHJpbyAoIHNvcnQga2V5cyAlRGF0YSApIHsKCiAgICAgICAgICAgIG15ICRHcm91cCA9ICREYXRheyRQcmlvfTsKICAgICAgICAgICAgaWYgKCAhJENvbmZpZ09iamVjdC0+e0N1c3RvbWVyUHJlZmVyZW5jZXNHcm91cHN9LT57JEdyb3VwfSApIHsKICAgICAgICAgICAgICAgIG5leHQgUFJJTzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJVByZWZlcmVuY2UgPSAleyAkQ29uZmlnT2JqZWN0LT57Q3VzdG9tZXJQcmVmZXJlbmNlc0dyb3Vwc30tPnskR3JvdXB9IH07CiAgICAgICAgICAgIGlmICggJEdyb3VwIGVxICdQYXNzd29yZCcgKSB7CiAgICAgICAgICAgICAgICBuZXh0IFBSSU87CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRNb2R1bGUgPSAkUHJlZmVyZW5jZXtNb2R1bGV9IHx8ICdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6Q3VzdG9tZXJQcmVmZXJlbmNlc0dlbmVyaWMnOwoKICAgICAgICAgICAgIyBsb2FkIG1vZHVsZQogICAgICAgICAgICBpZiAoICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPlJlcXVpcmUoJE1vZHVsZSkgKSB7CiAgICAgICAgICAgICAgICBteSAkT2JqZWN0ID0gJE1vZHVsZS0+bmV3KAogICAgICAgICAgICAgICAgICAgICV7JFNlbGZ9LAogICAgICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW0gPT4gXCVQcmVmZXJlbmNlLAogICAgICAgICAgICAgICAgICAgIFVzZXJPYmplY3QgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlcicpLAogICAgICAgICAgICAgICAgICAgIERlYnVnICAgICAgPT4gJFNlbGYtPntEZWJ1Z30sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgbXkgQFBhcmFtcyA9ICRPYmplY3QtPlBhcmFtKAogICAgICAgICAgICAgICAgICAgIFVzZXJEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXIgPT4gMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoQFBhcmFtcykgewogICAgICAgICAgICAgICAgICAgIGZvciBteSAkUGFyYW1JdGVtIChAUGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnSXRlbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHslUGFyYW19LAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWYgJFBhcmFtSXRlbS0+e0RhdGF9IGVxICdIQVNIJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgcmVmICRQcmVmZXJlbmNle0RhdGF9IGVxICdIQVNIJwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBteSAlQnVpbGRTZWxlY3Rpb25QYXJhbXMgPSAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJVByZWZlcmVuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJXskUGFyYW1JdGVtfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkQnVpbGRTZWxlY3Rpb25QYXJhbXN7Q2xhc3N9ID0gam9pbiggJyAnLCAkQnVpbGRTZWxlY3Rpb25QYXJhbXN7Q2xhc3N9IC8vICcnLCAnTW9kZXJuaXplJyApOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbUl0ZW0tPntPcHRpb259ID0gJExheW91dE9iamVjdC0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJUJ1aWxkU2VsZWN0aW9uUGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICRQYXJhbUl0ZW0tPntCbG9ja30gfHwgJFByZWZlcmVuY2V7QmxvY2t9IHx8ICdPcHRpb24nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXAgPT4gJEdyb3VwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlUHJlZmVyZW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAleyRQYXJhbUl0ZW19LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJExheW91dE9iamVjdC0+RmF0YWxFcnJvcigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICRMYXlvdXRPYmplY3QtPkFkZEpTRGF0YSgKICAgICAgICBLZXkgICA9PiAnTmF2JywKICAgICAgICBWYWx1ZSA9PiAkUGFyYW17TmF2fSwKICAgICk7CgogICAgcmV0dXJuICRMYXlvdXRPYmplY3QtPk91dHB1dCgKICAgICAgICBUZW1wbGF0ZUZpbGUgPT4gJ0FkbWluQ3VzdG9tZXJVc2VyJywKICAgICAgICBEYXRhICAgICAgICAgPT4gXCVQYXJhbSwKICAgICk7Cn0KCnN1YiBfRWZmZWN0aXZlUGVybWlzc2lvbnMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIG9ubHkgaWYgY3VzdG9tZXIgZ3JvdXAgZmVhdHVyZSBpcyBhY3RpdmUKICAgIGlmICggISRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyktPkdldCgnQ3VzdG9tZXJHcm91cFN1cHBvcnQnKSApIHsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAjIGdldCBuZWVkZWQgb2JqZWN0cwogICAgbXkgJENvbmZpZ09iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwogICAgbXkgJExheW91dE9iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Ok91dHB1dDo6SFRNTDo6TGF5b3V0Jyk7CiAgICBteSAkQ3VzdG9tZXJHcm91cE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckdyb3VwJyk7CgogICAgIyBzaG93IHRhYmxlcwogICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgTmFtZSA9PiAnRWZmZWN0aXZlUGVybWlzc2lvbnMnLAogICAgKTsKCiAgICBteSAlR3JvdXBzOwogICAgbXkgJVBlcm1pc3Npb25zOwoKICAgICMgZ28gdGhyb3VnaCBwZXJtaXNzaW9uIHR5cGVzCiAgICBteSBAVHlwZXMgPSBAeyAkQ29uZmlnT2JqZWN0LT5HZXQoJ1N5c3RlbTo6Q3VzdG9tZXI6OlBlcm1pc3Npb24nKSB9OwogICAgZm9yIG15ICRUeXBlIChAVHlwZXMpIHsKCiAgICAgICAgIyBzaG93IGhlYWRlcgogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICJIZWFkZXJHcm91cFBlcm1pc3Npb25UeXBlIiwKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICRUeXBlLAogICAgICAgICAgICB9LAogICAgICAgICk7CgogICAgICAgICMgZ2V0IGdyb3VwcyBvZiB0aGUgdXNlcgogICAgICAgIG15ICVVc2VyR3JvdXBzID0gJEN1c3RvbWVyR3JvdXBPYmplY3QtPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgVXNlcklEICAgICAgICAgPT4gJFBhcmFte0lEfSwKICAgICAgICAgICAgVHlwZSAgICAgICAgICAgPT4gJFR5cGUsCiAgICAgICAgICAgIFJlc3VsdCAgICAgICAgID0+ICdIQVNIJywKICAgICAgICAgICAgUmF3UGVybWlzc2lvbnMgPT4gMCwgICAgICAgICAgICAjIGdldCBlZmZlY3RpdmUgcGVybWlzc2lvbnMKICAgICAgICApOwoKICAgICAgICAjIHN0b3JlIGRhdGEgaW4gbG9va3VwIGhhc2hlcwogICAgICAgIGZvciBteSAkR3JvdXBJRCAoIHNvcnQga2V5cyAlVXNlckdyb3VwcyApIHsKICAgICAgICAgICAgJEdyb3Vwc3skR3JvdXBJRH0gPSAkVXNlckdyb3Vwc3skR3JvdXBJRH07CiAgICAgICAgICAgICRQZXJtaXNzaW9uc3skR3JvdXBJRH17JFR5cGV9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgIyBzaG93IG1lc3NhZ2UgaWYgbm8gcGVybWlzc2lvbnMgZm91bmQKICAgIGlmICggISVQZXJtaXNzaW9ucyApIHsKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnTm9Hcm91cFBlcm1pc3Npb25zRm91bmRNc2cnLAogICAgICAgICk7CiAgICB9CgogICAgIyBnbyB0aHJvdWdoIGdyb3Vwcywgc29ydCBieSBuYW1lCiAgICBlbHNlIHsKICAgICAgICBmb3IgbXkgJEdyb3VwSUQgKCBzb3J0IHsgdWMoICRHcm91cHN7JGF9ICkgY21wIHVjKCAkR3JvdXBzeyRifSApIH0ga2V5cyAlR3JvdXBzICkgewoKICAgICAgICAgICAgIyBzaG93IHRhYmxlIHJvd3MKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdHcm91cFBlcm1pc3Npb25UYWJsZVJvdycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBJRCAgID0+ICRHcm91cElELAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJEdyb3Vwc3skR3JvdXBJRH0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBzaG93IHBlcm1pc3Npb24gbWFya3MKICAgICAgICAgICAgZm9yIG15ICRUeXBlIChAVHlwZXMpIHsKICAgICAgICAgICAgICAgIG15ICRQZXJtaXNzaW9uTWFyayA9ICRQZXJtaXNzaW9uc3skR3JvdXBJRH17JFR5cGV9ID8gJ09uJyAgICAgICAgOiAnT2ZmJzsKICAgICAgICAgICAgICAgIG15ICRIaWdobGlnaHRNYXJrICA9ICRUeXBlIGVxICdydycgICAgICAgICAgICAgICAgID8gJ0hpZ2hsaWdodCcgOiAnJzsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0dyb3VwUGVybWlzc2lvbk1hcmsnLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0dyb3VwUGVybWlzc2lvbk1hcmsnIC4gJFBlcm1pc3Npb25NYXJrLAogICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBIaWdobGlnaHQgPT4gJEhpZ2hsaWdodE1hcmssCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgYWxsIGFjY2Vzc2libGUgY3VzdG9tZXJzIG9mIHRoZSB1c2VyCiAgICBteSAlQ3VzdG9tZXJzID0gJEN1c3RvbWVyR3JvdXBPYmplY3QtPkdyb3VwQ29udGV4dEN1c3RvbWVycygKICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAkUGFyYW17SUR9LAogICAgKTsKCiAgICAjIHNob3cgbWVzc2FnZSBpZiBubyBjdXN0b21lcnMgZm91bmQKICAgIGlmICggISVDdXN0b21lcnMgKSB7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ05vQ3VzdG9tZXJBY2Nlc3NGb3VuZE1zZycsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAjIGdldCBwZXJtaXNzaW9uIGNvbnRleHRzCiAgICBteSAkQ29udGV4dENvbmZpZyAgICAgICAgICAgID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lckdyb3VwUGVybWlzc2lvbkNvbnRleHQnKTsKICAgIG15ICREaXJlY3RBY2Nlc3NDb250ZXh0S2V5ICAgPSAnMDAxLUN1c3RvbWVySUQtc2FtZSc7CiAgICBteSAkSW5kaXJlY3RBY2Nlc3NDb250ZXh0S2V5ID0gJzEwMC1DdXN0b21lcklELW90aGVyJzsKCiAgICAjIHVzZSBkZWZhdWx0IGNvbnRleHQgaWYgbm9uZSBhcmUgZm91bmQKICAgIGlmICggIUlzSGFzaFJlZldpdGhEYXRhKCRDb250ZXh0Q29uZmlnKSApIHsKICAgICAgICAkQ29udGV4dENvbmZpZyA9IHsKICAgICAgICAgICAgJERpcmVjdEFjY2Vzc0NvbnRleHRLZXkgPT4gewogICAgICAgICAgICAgICAgTmFtZSA9PiBUcmFuc2xhdGFibGUoJ1NhbWUgQ3VzdG9tZXInKSwKICAgICAgICAgICAgfSwKICAgICAgICB9OwogICAgfQoKICAgICMgc2hvdyBkZWZhdWx0IGFuZCBleHRyYSBjb250ZXh0IGhlYWRlcnMgaWYgYXZhaWxhYmxlCiAgICBpZiAoICRDb250ZXh0Q29uZmlnLT57JERpcmVjdEFjY2Vzc0NvbnRleHRLZXl9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdIZWFkZXJDdXN0b21lckFjY2Vzc0NvbnRleHQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgPT4gVHJhbnNsYXRhYmxlKCdEaXJlY3QnKSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgfQogICAgaWYgKCAkQ29udGV4dENvbmZpZy0+eyRJbmRpcmVjdEFjY2Vzc0NvbnRleHRLZXl9ICkgewogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdIZWFkZXJDdXN0b21lckFjY2Vzc0NvbnRleHQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIE5hbWUgPT4gVHJhbnNsYXRhYmxlKCdJbmRpcmVjdCcpLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICB9CgogICAgIyBkZXRlcm1pbmUgY3VzdG9tZXJzIGZvciBkaXJlY3QgYW5kIGluZGlyZWN0IGFjY2VzcwogICAgbXkgQFVzZXJDdXN0b21lcklEcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXInKS0+Q3VzdG9tZXJJRHMoCiAgICAgICAgVXNlciA9PiAkUGFyYW17SUR9LAogICAgKTsKICAgIG15ICVFeHRyYUN1c3RvbWVySURzOwogICAgaWYgKCAkQ29udGV4dENvbmZpZy0+eyRJbmRpcmVjdEFjY2Vzc0NvbnRleHRLZXl9ICkgewogICAgICAgIG15ICRFeHRyYUNvbnRleHROYW1lID0gJEN1c3RvbWVyR3JvdXBPYmplY3QtPkdyb3VwQ29udGV4dE5hbWVHZXQoCiAgICAgICAgICAgIFN5c0NvbmZpZ05hbWUgPT4gJEluZGlyZWN0QWNjZXNzQ29udGV4dEtleSwKICAgICAgICApOwoKICAgICAgICAjIGZvciBhbGwgQ3VzdG9tZXJJRHMgZ2V0IGdyb3VwcyB3aXRoIGV4dHJhIGFjY2VzcwogICAgICAgIG15ICVFeHRyYVBlcm1pc3Npb25Hcm91cHM7CiAgICAgICAgQ1VTVE9NRVJJRDoKICAgICAgICBmb3IgbXkgJEN1c3RvbWVySUQgKEBVc2VyQ3VzdG9tZXJJRHMpIHsKICAgICAgICAgICAgbXkgJUdyb3VwTGlzdCA9ICRDdXN0b21lckdyb3VwT2JqZWN0LT5Hcm91cEN1c3RvbWVyTGlzdCgKICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJEN1c3RvbWVySUQsCiAgICAgICAgICAgICAgICBUeXBlICAgICAgID0+ICdybycsCiAgICAgICAgICAgICAgICBDb250ZXh0ICAgID0+ICRFeHRyYUNvbnRleHROYW1lLAogICAgICAgICAgICAgICAgUmVzdWx0ICAgICA9PiAnSEFTSCcsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG5leHQgQ1VTVE9NRVJJRCBpZiAhJUdyb3VwTGlzdDsKCiAgICAgICAgICAgICMgYWRkIHRvIGdyb3VwcwogICAgICAgICAgICAlRXh0cmFQZXJtaXNzaW9uR3JvdXBzID0gKAogICAgICAgICAgICAgICAgJUV4dHJhUGVybWlzc2lvbkdyb3VwcywKICAgICAgICAgICAgICAgICVHcm91cExpc3QsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGFkZCBhbGwgdW5pcXVlIGFjY2Vzc2libGUgR3JvdXA8LT5DdXN0b21lciBjb21iaW5hdGlvbnMKICAgICAgICBHUk9VUElEOgogICAgICAgIGZvciBteSAkR3JvdXBJRCAoIHNvcnQga2V5cyAlRXh0cmFQZXJtaXNzaW9uR3JvdXBzICkgewogICAgICAgICAgICBteSBAR3JvdXBDdXN0b21lcklEcyA9ICRDdXN0b21lckdyb3VwT2JqZWN0LT5Hcm91cEN1c3RvbWVyTGlzdCgKICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gJEdyb3VwSUQsCiAgICAgICAgICAgICAgICBUeXBlICAgID0+ICdybycsCiAgICAgICAgICAgICAgICBSZXN1bHQgID0+ICdJRCcsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG5leHQgR1JPVVBJRCBpZiAhQEdyb3VwQ3VzdG9tZXJJRHM7CgogICAgICAgICAgICAjIGFkZCB0byBFeHRyYUN1c3RvbWVySURzCiAgICAgICAgICAgICVFeHRyYUN1c3RvbWVySURzID0gKAogICAgICAgICAgICAgICAgJUV4dHJhQ3VzdG9tZXJJRHMsCiAgICAgICAgICAgICAgICBtYXAgeyAkXyA9PiAxIH0gQEdyb3VwQ3VzdG9tZXJJRHMsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgICMgZ28gdGhyb3VnaCBjdXN0b21lcnMKICAgIENVU1RPTUVSSUQ6CiAgICBmb3IgbXkgJEN1c3RvbWVySUQgKCBzb3J0IGtleXMgJUN1c3RvbWVycyApIHsKCiAgICAgICAgIyBzaG93IHRhYmxlIHJvd3MKICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ3VzdG9tZXJBY2Nlc3NUYWJsZVJvdycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgSUQgICA9PiAkQ3VzdG9tZXJJRCwKICAgICAgICAgICAgICAgIE5hbWUgPT4gJEN1c3RvbWVyc3skQ3VzdG9tZXJJRH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgIyAnU2FtZSBDdXN0b21lcicKICAgICAgICBpZiAoICRDb250ZXh0Q29uZmlnLT57JERpcmVjdEFjY2Vzc0NvbnRleHRLZXl9ICkgewoKICAgICAgICAgICAgIyBjaGVjayBpZiB3ZSBzaG91bGQgc2hvdyBjaGVjayBtYXJrIGZvciAnU2FtZSBDdXN0b21lcicKICAgICAgICAgICAgbXkgJEFjY2Vzc01hcmsgPSAoIGdyZXAgeyAkXyBlcSAkQ3VzdG9tZXJJRCB9IEBVc2VyQ3VzdG9tZXJJRHMgKSA/ICdPbicgOiAnT2ZmJzsKCiAgICAgICAgICAgICMgc2hvdyBibG9ja3MKICAgICAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgICAgICBOYW1lID0+ICdDdXN0b21lckFjY2Vzc01hcmsnLAogICAgICAgICAgICApOwogICAgICAgICAgICAkTGF5b3V0T2JqZWN0LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0N1c3RvbWVyQWNjZXNzTWFyaycgLiAkQWNjZXNzTWFyaywKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgJ090aGVyIEN1c3RvbWVycycKICAgICAgICBuZXh0IENVU1RPTUVSSUQgaWYgISRDb250ZXh0Q29uZmlnLT57JEluZGlyZWN0QWNjZXNzQ29udGV4dEtleX07CgogICAgICAgICMgY2hlY2sgaWYgd2Ugc2hvdWxkIHNob3cgY2hlY2sgbWFyayBmb3IgJ090aGVyIEN1c3RvbWVycycKICAgICAgICBteSAkQWNjZXNzTWFyayA9ICRFeHRyYUN1c3RvbWVySURzeyRDdXN0b21lcklEfSA/ICdPbicgOiAnT2ZmJzsKCiAgICAgICAgIyBzaG93IGJsb2NrcwogICAgICAgICRMYXlvdXRPYmplY3QtPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDdXN0b21lckFjY2Vzc01hcmsnLAogICAgICAgICk7CiAgICAgICAgJExheW91dE9iamVjdC0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0N1c3RvbWVyQWNjZXNzTWFyaycgLiAkQWNjZXNzTWFyaywKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgoxOwo=</File>
        <File Location="Custom/Kernel/System/CustomerCompany/DB.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBhYjc4ZTcwMDdjMzI3Y2I3MDcwMmVmZjJmYTNiNjY1YWQ5ZTcxZmMyIC0gS2VybmVsL1N5c3RlbS9DdXN0b21lckNvbXBhbnkvREIucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJDb21wYW55OjpEQjsKCnVzZSB2NS4yNDsKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKIyBjb3JlIG1vZHVsZXMKCiMgQ1BBTiBtb2R1bGVzCgojIE9UT0JPIG1vZHVsZXMKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpTeXN0ZW06OkNhY2hlJywKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICdLZXJuZWw6OkNvbmZpZycsCiMgRU8gUm90aGVyIE9TUwogICAgJ0tlcm5lbDo6U3lzdGVtOjpEQicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcsCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAnS2VybmVsOjpTeXN0ZW06Okdyb3VwJywKIyBFTyBSb3RoZXIgT1NTCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06OlZhbGlkJywKKTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0gYmxlc3Mge30sICRUeXBlOwoKICAgICMgZ2V0IGN1c3RvbWVyIGNvbXBhbnkgbWFwCiAgICAjIGFjdHVhbGx5IHRoZSBwYXJhbWV0ZXIgQ3VzdG9tZXJDb21wYW55TWFwIGluY2x1ZGVzIHRoZSBjb21wbGV0ZSBjb25maWcgb2YgdGhlIGJhY2tlbmQKICAgICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfSA9ICRQYXJhbXtDdXN0b21lckNvbXBhbnlNYXB9IHx8IGRpZSAiR290IG5vIEN1c3RvbWVyQ29tcGFueU1hcCEiOwoKICAgICMgY29uZmlnIG9wdGlvbnMKICAgICRTZWxmLT57Q3VzdG9tZXJDb21wYW55VGFibGV9ID0gJFNlbGYtPntDdXN0b21lckNvbXBhbnlNYXB9LT57UGFyYW1zfS0+e1RhYmxlfQogICAgICAgIHx8IGRpZSAiTmVlZCBDdXN0b21lckNvbXBhbnktPlBhcmFtcy0+VGFibGUgaW4gS2VybmVsL0NvbmZpZy5wbSEiOwogICAgJFNlbGYtPntDdXN0b21lckNvbXBhbnlLZXl9ID0gJFNlbGYtPntDdXN0b21lckNvbXBhbnlNYXB9LT57Q3VzdG9tZXJDb21wYW55S2V5fQogICAgICAgIHx8IGRpZSAiTmVlZCBDdXN0b21lckNvbXBhbnktPkN1c3RvbWVyQ29tcGFueUtleSBpbiBLZXJuZWwvQ29uZmlnLnBtISI7CiAgICAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueVZhbGlkfSA9ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+eydDdXN0b21lckNvbXBhbnlWYWxpZCd9OwogICAgJFNlbGYtPntTZWFyY2hMaXN0TGltaXR9ICAgICAgPSAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPnsnQ3VzdG9tZXJDb21wYW55U2VhcmNoTGlzdExpbWl0J30gfHwgNTAwMDA7CiAgICAkU2VsZi0+e1NlYXJjaFByZWZpeH0gICAgICAgICA9ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+eydDdXN0b21lckNvbXBhbnlTZWFyY2hQcmVmaXgnfTsKCiAgICBpZiAoICFkZWZpbmVkKCAkU2VsZi0+e1NlYXJjaFByZWZpeH0gKSApIHsKICAgICAgICAkU2VsZi0+e1NlYXJjaFByZWZpeH0gPSAnJzsKICAgIH0KICAgICRTZWxmLT57U2VhcmNoU3VmZml4fSA9ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+eydDdXN0b21lckNvbXBhbnlTZWFyY2hTdWZmaXgnfTsKICAgIGlmICggIWRlZmluZWQoICRTZWxmLT57U2VhcmNoU3VmZml4fSApICkgewogICAgICAgICRTZWxmLT57U2VhcmNoU3VmZml4fSA9ICcqJzsKICAgIH0KCiAgICAjIGNyZWF0ZSBjYWNoZSBvYmplY3QsIGJ1dCBvbmx5IGlmIENhY2hlVFRMIGlzIHNldCBpbiBjdXN0b21lciBjb25maWcKICAgIGlmICggJFNlbGYtPntDdXN0b21lckNvbXBhbnlNYXB9LT57Q2FjaGVUVEx9ICkgewogICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CiAgICAgICAgJFNlbGYtPntDYWNoZVR5cGV9ICAgPSAnQ3VzdG9tZXJDb21wYW55JyAuICRQYXJhbXtDb3VudH07CiAgICAgICAgJFNlbGYtPntDYWNoZVRUTH0gICAgPSAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntDYWNoZVRUTH0gfHwgMDsKICAgIH0KCiAgICAjIGNyZWF0ZSBuZXcgZGIgY29ubmVjdCBpZiBEU04gaXMgZ2l2ZW4KICAgIGlmICggJFNlbGYtPntDdXN0b21lckNvbXBhbnlNYXB9LT57UGFyYW1zfS0+e0RTTn0gKSB7CiAgICAgICAgJFNlbGYtPntEQk9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICAgICAgRGF0YWJhc2VEU04gICAgICAgICAgICAgPT4gJFNlbGYtPntDdXN0b21lckNvbXBhbnlNYXB9LT57UGFyYW1zfS0+e0RTTn0sCiAgICAgICAgICAgIEF0dHJpYnV0ZSAgICAgICAgICAgICAgID0+ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e1BhcmFtc30tPntBdHRyaWJ1dGV9LAogICAgICAgICAgICBEYXRhYmFzZVVzZXIgICAgICAgICAgICA9PiAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntQYXJhbXN9LT57VXNlcn0sCiAgICAgICAgICAgIERhdGFiYXNlUHcgICAgICAgICAgICAgID0+ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e1BhcmFtc30tPntQYXNzd29yZH0sCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgICAgID0+ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e1BhcmFtc30tPntUeXBlfSB8fCAnJywKICAgICAgICAgICAgRGlzY29ubmVjdE9uRGVzdHJ1Y3Rpb24gPT4gMSwKICAgICAgICApIHx8IGRpZSgnQ2FuXCd0IGNvbm5lY3QgdG8gZGF0YWJhc2UhJyk7CgogICAgICAgICMgcmVtZW1iZXIgdGhhdCB3ZSBoYXZlIHRoZSBEQk9iamVjdCBub3QgZnJvbSBwYXJlbnQgY2FsbAogICAgICAgICRTZWxmLT57Tm90UGFyZW50REJPYmplY3R9ID0gMTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT57REJPYmplY3R9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CiAgICB9CgogICAgIyB0aGlzIHNldHRpbmcgc3BlY2lmaWVzIGlmIHRoZSB0YWJsZSBoYXMgdGhlIGNyZWF0ZV90aW1lLAogICAgIyBjcmVhdGVfYnksIGNoYW5nZV90aW1lIGFuZCBjaGFuZ2VfYnkgZmllbGRzIG9mIE9UT0JPCiAgICAkU2VsZi0+e0ZvcmVpZ25EQn0gPSAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntQYXJhbXN9LT57Rm9yZWlnbkRCfSA/IDEgOiAwOwoKICAgICMgZGVmaW5lcyBpZiB0aGUgZGF0YWJhc2Ugc2VhcmNoIHdpbGwgYmUgcGVyZm9ybWVuZCBjYXNlIHNlbnNpdGl2ZSAoMSkgb3Igbm90ICgwKQogICAgJFNlbGYtPntDYXNlU2Vuc2l0aXZlfSA9ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e1BhcmFtc30tPntTZWFyY2hDYXNlU2Vuc2l0aXZlfQogICAgICAgIC8vICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e1BhcmFtc30tPntDYXNlU2Vuc2l0aXZlfSB8fCAwOwoKICAgICMgZmV0Y2ggbmFtZXMgb2YgY29uZmlndXJlZCBkeW5hbWljIGZpZWxkcwogICAgbXkgQER5bmFtaWNGaWVsZE1hcEVudHJpZXMgPSBncmVwIHsgJF8tPls1XSBlcSAnZHluYW1pY19maWVsZCcgfSBAeyAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntNYXB9IH07CiAgICAkU2VsZi0+e0NvbmZpZ3VyZWREeW5hbWljRmllbGROYW1lc30gPSB7IG1hcCB7ICRfLT5bMl0gPT4gMSB9IEBEeW5hbWljRmllbGRNYXBFbnRyaWVzIH07CgojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgbXkgJExheW91dFBhcmFtID0gJEtlcm5lbDo6T00tPntQYXJhbX0tPnsnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCd9OwogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBDaGVjayBpZiBtdWx0aXRlbmFuY3kgaXMgZW5hYmxlZCBhbmQgdGhlIHJlcXVlc3QgaXMgY29taW5nIGZyb20gYSB1c2VyLgogICAgaWYgKCAkTGF5b3V0UGFyYW0tPntVc2VyVHlwZX0gJiYgJExheW91dFBhcmFtLT57VXNlclR5cGV9IGVxICdVc2VyJyAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ011bHRpdGVuYW5jeScpICkgewoKICAgICAgICAjIFNhdmUgdGhlIFVzZXJJRCBhbmQgYWxsIGdyb3VwcyB0aGUgdXNlciBoYXMgJ3JvJyBwZXJtaXNzaW9uIG9uLgogICAgICAgIGlmICggJExheW91dFBhcmFtLT57VXNlcklEfSApIHsKICAgICAgICAgICAgIyBPbmx5IGdldCB0aGUgZ3JvdXAgbGlzdCBvbmNlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLgogICAgICAgICAgICBteSAlR3JvdXBzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRMYXlvdXRQYXJhbS0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgPT4gJ3JvJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgVGhlIGxpbWl0IGRvZXMgbm90IGNvdW50IGZvciBtZW1iZXJzIG9mIGEgc3BlY2lmaWMgZ3JvdXAuCiAgICAgICAgICAgIG15ICRQZXJtaXNzaW9uR3JvdXAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ011bHRpdGVuYW5jeTo6UGVybWlzc2lvbkdyb3VwJykgfHwgJyc7CiAgICAgICAgICAgIG15ICVHcm91cHNSZXZlcnNlICAgPSByZXZlcnNlICVHcm91cHM7CgogICAgICAgICAgICBpZiAoICEkR3JvdXBzUmV2ZXJzZXskUGVybWlzc2lvbkdyb3VwfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TXVsdGl0ZW5hbmN5fSA9ICRMYXlvdXRQYXJhbS0+e1VzZXJJRH07CiAgICAgICAgICAgICAgICAkU2VsZi0+e1VzZXJHcm91cElEc30gPSBbIHNvcnQga2V5cyAlR3JvdXBzIF07CiAgICAgICAgICAgICAgICAkU2VsZi0+e1VzZXJHcm91cHN9ICAgPSBbIHZhbHVlcyAlR3JvdXBzIF07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBDdXN0b21lckNvbXBhbnlMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIG15ICRWYWxpZCA9IDE7CiAgICBpZiAoICEkUGFyYW17VmFsaWR9ICYmIGRlZmluZWQoICRQYXJhbXtWYWxpZH0gKSApIHsKICAgICAgICAkVmFsaWQgPSAwOwogICAgfQoKICAgIG15ICRMaW1pdCA9ICRQYXJhbXtMaW1pdH0gLy8gJFNlbGYtPntTZWFyY2hMaXN0TGltaXR9OwoKICAgIG15ICRDYWNoZVR5cGU7CiAgICBteSAkQ2FjaGVLZXk7CgogICAgIyBjaGVjayBjYWNoZQogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKCiAgICAgICAgJENhY2hlVHlwZSA9ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdfQ3VzdG9tZXJDb21wYW55TGlzdCc7CiAgICAgICAgJENhY2hlS2V5ICA9ICJDdXN0b21lckNvbXBhbnlMaXN0Ojoke1ZhbGlkfTo6JHtMaW1pdH06OiIgLiAoICRQYXJhbXtTZWFyY2h9IHx8ICcnICk7CiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAgICAgIyBVc2UgY2FjaGUgZm9yIG11bHRpdGVuYW5jeS4KICAgICAgICBpZiAoICRTZWxmLT57TXVsdGl0ZW5hbmN5fSApIHsKICAgICAgICAgICAgJENhY2hlS2V5IC49IGpvaW4gJycsIG1hcCB7ICc6Okdyb3VwSUQ9JyAuICRfIH0gQHsgJFNlbGYtPntVc2VyR3JvdXBJRHN9IH07CiAgICAgICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAgICAgbXkgJERhdGEgPSAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+R2V0KAogICAgICAgICAgICBUeXBlID0+ICRDYWNoZVR5cGUsCiAgICAgICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICV7JERhdGF9IGlmIHJlZiAkRGF0YSBlcSAnSEFTSCc7CiAgICB9CgogICAgbXkgJEN1c3RvbWVyQ29tcGFueUxpc3RGaWVsZHMgPSAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntDdXN0b21lckNvbXBhbnlMaXN0RmllbGRzfTsKICAgIGlmICggIUlzQXJyYXlSZWZXaXRoRGF0YSgkQ3VzdG9tZXJDb21wYW55TGlzdEZpZWxkcykgKSB7CiAgICAgICAgJEN1c3RvbWVyQ29tcGFueUxpc3RGaWVsZHMgPSBbICdjdXN0b21lcl9pZCcsICduYW1lJywgXTsKICAgIH0KCiAgICAjIHJlbW92ZSBkeW5hbWljIGZpZWxkIG5hbWVzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgaW4gQ3VzdG9tZXJDb21wYW55TGlzdEZpZWxkcwogICAgIyBhcyB0aGV5IGNhbm5vdCBiZSBoYW5kbGVkIGhlcmUKICAgIG15IEBDdXN0b21lckNvbXBhbnlMaXN0RmllbGRzV2l0aG91dER5bmFtaWNGaWVsZHMgPSBncmVwIHsgIWV4aXN0cyAkU2VsZi0+e0NvbmZpZ3VyZWREeW5hbWljRmllbGROYW1lc30tPnskX30gfSBAeyRDdXN0b21lckNvbXBhbnlMaXN0RmllbGRzfTsKCiAgICAjIHdoYXQgaXMgdGhlIHJlc3VsdAogICAgbXkgJFdoYXQgPSBqb2luKAogICAgICAgICcsICcsCiAgICAgICAgQEN1c3RvbWVyQ29tcGFueUxpc3RGaWVsZHNXaXRob3V0RHluYW1pY0ZpZWxkcwogICAgKTsKCiAgICAjIGFkZCB2YWxpZCBvcHRpb24gaWYgcmVxdWlyZWQKICAgIG15ICRTUUw7CiAgICBteSBAQmluZDsKICAgIG15IEBDb25kaXRpb25zOwoKICAgIGlmICggJFZhbGlkICYmICRTZWxmLT57Q3VzdG9tZXJDb21wYW55VmFsaWR9ICkgewoKICAgICAgICAjIGdldCB2YWxpZCBvYmplY3QKICAgICAgICBteSAkVmFsaWRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKTsKCiAgICAgICAgcHVzaCBAQ29uZGl0aW9ucywgIiRTZWxmLT57Q3VzdG9tZXJDb21wYW55VmFsaWR9IElOICggJHtcKGpvaW4gJywgJywgJFZhbGlkT2JqZWN0LT5WYWxpZElEc0dldCgpKX0gKSI7CiAgICB9CgogICAgIyB3aGVyZQogICAgaWYgKCAkUGFyYW17U2VhcmNofSApIHsKCiAgICAgICAgIyByZW1vdmUgZHluYW1pYyBmaWVsZCBuYW1lcyB0aGF0IGFyZSBjb25maWd1cmVkIGluIEN1c3RvbWVyQ29tcGFueVNlYXJjaEZpZWxkcwogICAgICAgICMgYXMgdGhleSBjYW5ub3QgYmUgcmV0cmlldmVkIGhlcmUKICAgICAgICBteSBAQ3VzdG9tZXJDb21wYW55U2VhcmNoRmllbGRzID0gZ3JlcCB7ICFleGlzdHMgJFNlbGYtPntDb25maWd1cmVkRHluYW1pY0ZpZWxkTmFtZXN9LT57JF99IH0KICAgICAgICAgICAgQHsgJFNlbGYtPntDdXN0b21lckNvbXBhbnlNYXB9LT57Q3VzdG9tZXJDb21wYW55U2VhcmNoRmllbGRzfSB9OwoKICAgICAgICBteSAlUXVlcnlDb25kaXRpb24gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVlcnlDb25kaXRpb24oCiAgICAgICAgICAgIEtleSAgICAgICAgICAgPT4gXEBDdXN0b21lckNvbXBhbnlTZWFyY2hGaWVsZHMsCiAgICAgICAgICAgIFZhbHVlICAgICAgICAgPT4gJFBhcmFte1NlYXJjaH0sCiAgICAgICAgICAgIFNlYXJjaFByZWZpeCAgPT4gJFNlbGYtPntTZWFyY2hQcmVmaXh9LAogICAgICAgICAgICBTZWFyY2hTdWZmaXggID0+ICRTZWxmLT57U2VhcmNoU3VmZml4fSwKICAgICAgICAgICAgQ2FzZVNlbnNpdGl2ZSA9PiAkU2VsZi0+e0Nhc2VTZW5zaXRpdmV9LAogICAgICAgICAgICBCaW5kTW9kZSAgICAgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAkUXVlcnlDb25kaXRpb257U1FMfSApIHsKICAgICAgICAgICAgcHVzaCBAQ29uZGl0aW9ucywgIiAkUXVlcnlDb25kaXRpb257U1FMfSI7CiAgICAgICAgICAgIHB1c2ggQEJpbmQsICAgICAgIEB7ICRRdWVyeUNvbmRpdGlvbntWYWx1ZXN9IH07CiAgICAgICAgfQoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICAgICAjIERvbid0IHNlYXJjaCBmb3IgY3VzdG9tZXIgd2l0aG91dCBncm91cCBwZXJtaXNzaW9uLgogICAgICAgIGlmICggJFNlbGYtPntNdWx0aXRlbmFuY3l9ICkgewogICAgICAgICAgICAjIEdldCB0aGUgY29sdW1uIG5hbWUgd2hlcmUgdGhlIGdyb3VwIElEIGlzIHN0b3JlZC4KICAgICAgICAgICAgbXkgJEdyb3VwSURDb2w7CiAgICAgICAgICAgIGZvciBteSAkTWFwICggQHsgJFNlbGYtPntDdXN0b21lckNvbXBhbnlNYXB9LT57TWFwfSB9ICkgewogICAgICAgICAgICAgICAgaWYgKCAkTWFwLT5bMF0gZXEgJ1VzZXJHcm91cElEJyApIHsKICAgICAgICAgICAgICAgICAgICAkR3JvdXBJRENvbCA9ICRNYXAtPlsyXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCRHcm91cElEQ29sKSB7CiAgICAgICAgICAgICAgICBteSBAVXNlckdyb3VwSURzID0gQHsgJFNlbGYtPntVc2VyR3JvdXBJRHN9IH07ICAjIE5vdCBzYXZpbmcgdGhpcyBpbiBhbiBhcnJheSBjYW4gY2F1c2UgYW4gdW5rb3duIGVycm9yIGluIGEgbGF0ZXIgaXRlcmF0aW9uLgogICAgICAgICAgICAgICAgbXkgJFVzZXJHcm91cElEU3luYyA9ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e1VzZXJHcm91cElEU3luY307CiAgICAgICAgICAgICAgICBpZiAoICRVc2VyR3JvdXBJRFN5bmMtPntSZW1vdGVHcm91cFRvTG9jYWxHcm91cH0gKSB7CgogICAgICAgICAgICAgICAgICAgICMgQ2hlY2sgaWYgZ3JvdXAgSURzIG9yIG5hbWVzIHNob3VsZCBiZSBjaGVja2VkLgogICAgICAgICAgICAgICAgICAgIGlmICggJFVzZXJHcm91cElEU3luYy0+e1VzZUdyb3VwTmFtZXN9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFVzZXJHcm91cElEICggQFVzZXJHcm91cElEcyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15ICRHcm91cE5hbWUgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkVXNlckdyb3VwSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFVzZXJHcm91cElEID0gJEdyb3VwTmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIFJlcGxhY2UgdGhlIGxvY2FsIGdyb3VwIHdpdGggdGhlIGFzc29jaWF0ZWQgcmVtb3RlIGdyb3VwLgogICAgICAgICAgICAgICAgZm9yIG15ICRSZW1vdGVHcm91cCAoIGtleXMgJXsgJFVzZXJHcm91cElEU3luYy0+e1JlbW90ZUdyb3VwVG9Mb2NhbEdyb3VwfSB9ICkgewogICAgICAgICAgICAgICAgICAgIG15ICRMb2NhbEdyb3VwID0gJFVzZXJHcm91cElEU3luYy0+e1JlbW90ZUdyb3VwVG9Mb2NhbEdyb3VwfXskUmVtb3RlR3JvdXB9OwoKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJFVzZXJHcm91cElEICggQFVzZXJHcm91cElEcyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAkVXNlckdyb3VwSUQgZXEgJExvY2FsR3JvdXAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkVXNlckdyb3VwSUQgPSAkUmVtb3RlR3JvdXA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbXkgJEluQ29uZGl0aW9uID0gJFNlbGYtPntEQk9iamVjdH0tPlF1ZXJ5SW5Db25kaXRpb24oCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgICAgPT4gJEdyb3VwSURDb2wsCiAgICAgICAgICAgICAgICAgICAgVmFsdWVzICAgPT4gXEBVc2VyR3JvdXBJRHMsCiAgICAgICAgICAgICAgICAgICAgQmluZE1vZGUgPT4gMCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJEluQ29uZGl0aW9uIC49ICIgT1IgKCRHcm91cElEQ29sIElTIE5VTEwgT1IgJEdyb3VwSURDb2wgPSAnJykiOwogICAgICAgICAgICAgICAgcHVzaCBAQ29uZGl0aW9ucywgIiAoJEluQ29uZGl0aW9uKSI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgIH0KCiAgICAjIGR5bmFtaWMgZmllbGQgaGFuZGxpbmcKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwogICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZ3MgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgT2JqZWN0VHlwZSA9PiAnQ3VzdG9tZXJDb21wYW55JywKICAgICAgICBWYWxpZCAgICAgID0+IDEsCiAgICApOwogICAgbXkgJUR5bmFtaWNGaWVsZENvbmZpZ3NCeU5hbWUgPSBtYXAgeyAkXy0+e05hbWV9ID0+ICRfIH0gQHskRHluYW1pY0ZpZWxkQ29uZmlnc307CgogICAgbXkgQEN1c3RvbWVyQ29tcGFueUxpc3RGaWVsZHNEeW5hbWljRmllbGRzID0gZ3JlcCB7IGV4aXN0cyAkU2VsZi0+e0NvbmZpZ3VyZWREeW5hbWljRmllbGROYW1lc30tPnskX30gfSBAeyRDdXN0b21lckNvbXBhbnlMaXN0RmllbGRzfTsKCiAgICAjIHNxbAogICAgbXkgJENvbXBsZXRlU1FMID0gIlNFTEVDVCAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueUtleX0sICRXaGF0IEZST00gJFNlbGYtPntDdXN0b21lckNvbXBhbnlUYWJsZX0iOwoKICAgIGlmIChAQ29uZGl0aW9ucykgewogICAgICAgICRTUUwgPSBqb2luKCAnIEFORCAnLCBAQ29uZGl0aW9ucyApOwogICAgICAgICRDb21wbGV0ZVNRTCAuPSAiIFdIRVJFICRTUUwiOwogICAgfQoKICAgICMgZ2V0IGRhdGEgZnJvbSBjdXN0b21lciBjb21wYW55IHRhYmxlCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAkQ29tcGxldGVTUUwsCiAgICAgICAgQmluZCAgPT4gXEBCaW5kLAogICAgICAgIExpbWl0ID0+ICRMaW1pdCwKICAgICk7CgogICAgbXkgQEN1c3RvbWVyQ29tcGFueURhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQEN1c3RvbWVyQ29tcGFueURhdGEsIFtAUm93XTsKICAgIH0KCiAgICBteSAlTGlzdDsKCiAgICBDVVNUT01FUkNPTVBBTllEQVRBOgogICAgZm9yIG15ICRDdXN0b21lckNvbXBhbnlEYXRhIChAQ3VzdG9tZXJDb21wYW55RGF0YSkgewogICAgICAgIG15ICRDdXN0b21lckNvbXBhbnlJRCA9IHNoaWZ0IEB7JEN1c3RvbWVyQ29tcGFueURhdGF9OwogICAgICAgIG5leHQgQ1VTVE9NRVJDT01QQU5ZREFUQSBpZiAkTGlzdHskQ3VzdG9tZXJDb21wYW55SUR9OwoKICAgICAgICBteSAlQ29tcGFueVN0cmluZ1BhcnRzOwoKICAgICAgICBteSAkRmllbGRDb3VudGVyID0gMDsKICAgICAgICBmb3IgbXkgJEZpZWxkICggQHskQ3VzdG9tZXJDb21wYW55RGF0YX0gKSB7CiAgICAgICAgICAgICRDb21wYW55U3RyaW5nUGFydHN7ICRDdXN0b21lckNvbXBhbnlMaXN0RmllbGRzV2l0aG91dER5bmFtaWNGaWVsZHNbJEZpZWxkQ291bnRlcl0gfSA9ICRGaWVsZDsKICAgICAgICAgICAgJEZpZWxkQ291bnRlcisrOwogICAgICAgIH0KCiAgICAgICAgIyBmZXRjaCBkeW5hbWljIGZpZWxkIHZhbHVlcywgaWYgY29uZmlndXJlZAogICAgICAgIGlmIChAQ3VzdG9tZXJDb21wYW55TGlzdEZpZWxkc0R5bmFtaWNGaWVsZHMpIHsKICAgICAgICAgICAgRFlOQU1JQ0ZJRUxETkFNRToKICAgICAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGROYW1lIChAQ3VzdG9tZXJDb21wYW55TGlzdEZpZWxkc0R5bmFtaWNGaWVsZHMpIHsKICAgICAgICAgICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxETkFNRSBpZiAhZXhpc3RzICREeW5hbWljRmllbGRDb25maWdzQnlOYW1leyREeW5hbWljRmllbGROYW1lfTsKCiAgICAgICAgICAgICAgICBteSAkVmFsdWUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVHZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWdzQnlOYW1leyREeW5hbWljRmllbGROYW1lfSwKICAgICAgICAgICAgICAgICAgICBPYmplY3ROYW1lICAgICAgICAgPT4gJEN1c3RvbWVyQ29tcGFueUlELAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRE5BTUUgaWYgIWRlZmluZWQgJFZhbHVlOwoKICAgICAgICAgICAgICAgIGlmICggIUlzQXJyYXlSZWZXaXRoRGF0YSgkVmFsdWUpICkgewogICAgICAgICAgICAgICAgICAgICRWYWx1ZSA9IFskVmFsdWVdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15IEBWYWx1ZXM7CgogICAgICAgICAgICAgICAgVkFMVUU6CiAgICAgICAgICAgICAgICBmb3IgbXkgJEN1cnJlbnRWYWx1ZSAoIEB7JFZhbHVlfSApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IFZBTFVFIGlmICFkZWZpbmVkICRDdXJyZW50VmFsdWUgfHwgIWxlbmd0aCAkQ3VycmVudFZhbHVlOwoKICAgICAgICAgICAgICAgICAgICBteSAkUmVhZGFibGVWYWx1ZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5SZWFkYWJsZVZhbHVlUmVuZGVyKAogICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZ3NCeU5hbWV7JER5bmFtaWNGaWVsZE5hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJEN1cnJlbnRWYWx1ZSwKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBuZXh0IFZBTFVFIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkUmVhZGFibGVWYWx1ZSkgfHwgIWRlZmluZWQgJFJlYWRhYmxlVmFsdWUtPntWYWx1ZX07CgogICAgICAgICAgICAgICAgICAgIG15ICRJc0FDTFJlZHVjaWJsZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5IYXNCZWhhdmlvcigKICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWdzQnlOYW1leyREeW5hbWljRmllbGROYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgQmVoYXZpb3IgICAgICAgICAgID0+ICdJc0FDTFJlZHVjaWJsZScsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICBpZiAoJElzQUNMUmVkdWNpYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRQb3NzaWJsZVZhbHVlcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5Qb3NzaWJsZVZhbHVlc0dldCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnc0J5TmFtZXskRHluYW1pY0ZpZWxkTmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc0hhc2hSZWZXaXRoRGF0YSgkUG9zc2libGVWYWx1ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICRQb3NzaWJsZVZhbHVlcy0+eyAkUmVhZGFibGVWYWx1ZS0+e1ZhbHVlfSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRSZWFkYWJsZVZhbHVlLT57VmFsdWV9ID0gJFBvc3NpYmxlVmFsdWVzLT57ICRSZWFkYWJsZVZhbHVlLT57VmFsdWV9IH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHB1c2ggQFZhbHVlcywgJFJlYWRhYmxlVmFsdWUtPntWYWx1ZX07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJENvbXBhbnlTdHJpbmdQYXJ0c3skRHluYW1pY0ZpZWxkTmFtZX0gPSBqb2luICcgJywgQFZhbHVlczsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBhc3NlbWJsZSBjb21wYW55IHN0cmluZwogICAgICAgIG15IEBDb21wYW55U3RyaW5nUGFydHM7CiAgICAgICAgQ1VTVE9NRVJDT01QQU5ZTElTVEZJRUxEOgogICAgICAgIGZvciBteSAkQ3VzdG9tZXJDb21wYW55TGlzdEZpZWxkICggQHskQ3VzdG9tZXJDb21wYW55TGlzdEZpZWxkc30gKSB7CiAgICAgICAgICAgIG5leHQgQ1VTVE9NRVJDT01QQU5ZTElTVEZJRUxECiAgICAgICAgICAgICAgICBpZiAhZXhpc3RzICRDb21wYW55U3RyaW5nUGFydHN7JEN1c3RvbWVyQ29tcGFueUxpc3RGaWVsZH0KICAgICAgICAgICAgICAgIHx8ICFkZWZpbmVkICRDb21wYW55U3RyaW5nUGFydHN7JEN1c3RvbWVyQ29tcGFueUxpc3RGaWVsZH0KICAgICAgICAgICAgICAgIHx8ICFsZW5ndGggJENvbXBhbnlTdHJpbmdQYXJ0c3skQ3VzdG9tZXJDb21wYW55TGlzdEZpZWxkfTsKICAgICAgICAgICAgcHVzaCBAQ29tcGFueVN0cmluZ1BhcnRzLCAkQ29tcGFueVN0cmluZ1BhcnRzeyRDdXN0b21lckNvbXBhbnlMaXN0RmllbGR9OwogICAgICAgIH0KCiAgICAgICAgJExpc3R7JEN1c3RvbWVyQ29tcGFueUlEfSA9IGpvaW4gJyAnLCBAQ29tcGFueVN0cmluZ1BhcnRzOwogICAgfQoKICAgICMgY2FjaGUgcmVxdWVzdAogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkQ2FjaGVUeXBlLAogICAgICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgICAgIFZhbHVlID0+IFwlTGlzdCwKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gJUxpc3Q7Cn0KCnN1YiBDdXN0b21lckNvbXBhbnlTZWFyY2hEZXRhaWwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoIHJlZiAkUGFyYW17U2VhcmNoRmllbGRzfSBuZSAnQVJSQVknICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiU2VhcmNoRmllbGRzIG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJFZhbGlkID0gZGVmaW5lZCAkUGFyYW17VmFsaWR9ID8gJFBhcmFte1ZhbGlkfSA6IDE7CgogICAgJFBhcmFte0xpbWl0fSAvLz0gJyc7CgogICAgIyBTcGxpdCB0aGUgc2VhcmNoIGZpZWxkcyBpbiBzY2FsYXIgYW5kIGFycmF5IGZpZWxkcy4KICAgIG15IEBTY2FsYXJTZWFyY2hGaWVsZHMgPSBncmVwIHsgJ0lucHV0JyBlcSAkXy0+e1R5cGV9IH0gQHsgJFBhcmFte1NlYXJjaEZpZWxkc30gfTsKICAgIG15IEBBcnJheVNlYXJjaEZpZWxkcyAgPSBncmVwIHsgJ1NlbGVjdGlvbicgZXEgJF8tPntUeXBlfSB9IEB7ICRQYXJhbXtTZWFyY2hGaWVsZHN9IH07CgogICAgIyBWZXJpZnkgdGhhdCBhbGwgcGFzc2VkIGFycmF5IHBhcmFtZXRlcnMgY29udGFpbiBhbiBhcnJheXJlZi4KICAgIEFSR1VNRU5UOgogICAgZm9yIG15ICRBcmd1bWVudCAoQEFycmF5U2VhcmNoRmllbGRzKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17ICRBcmd1bWVudC0+e05hbWV9IH0gKSB7CiAgICAgICAgICAgICRQYXJhbXsgJEFyZ3VtZW50LT57TmFtZX0gfSB8fD0gW107CgogICAgICAgICAgICBuZXh0IEFSR1VNRU5UOwogICAgICAgIH0KCiAgICAgICAgaWYgKCByZWYgJFBhcmFteyAkQXJndW1lbnQtPntOYW1lfSB9IG5lICdBUlJBWScgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkQXJndW1lbnQtPntOYW1lfSBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgU2V0IHRoZSBkZWZhdWx0IGJlaGF2aW91ciBmb3IgdGhlIHJldHVybiB0eXBlLgogICAgbXkgJFJlc3VsdCA9ICRQYXJhbXtSZXN1bHR9IHx8ICdBUlJBWSc7CgogICAgIyBTcGVjaWFsIGhhbmRsaW5nIGlmIHRoZSByZXN1bHQgdHlwZSBpcyAnQ09VTlQnLgogICAgaWYgKCAkUmVzdWx0IGVxICdDT1VOVCcgKSB7CgogICAgICAgICMgSWdub3JlIHRoZSBwYXJhbWV0ZXIgJ0xpbWl0JyB3aGVuIHJlc3VsdCB0eXBlIGlzICdDT1VOVCcuCiAgICAgICAgJFBhcmFte0xpbWl0fSA9ICcnOwoKICAgICAgICAjIERlbGV0ZSB0aGUgT3JkZXJCeSBwYXJhbWV0ZXIgd2hlbiB0aGUgcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJy4KICAgICAgICAkUGFyYW17T3JkZXJCeX0gPSBbXTsKICAgIH0KCiAgICAjIERlZmluZSBvcmRlciB0YWJsZSBmcm9tIHRoZSBzZWFyY2ggZmllbGRzLgogICAgbXkgJU9yZGVyQnlUYWJsZSA9IG1hcCB7ICRfLT57TmFtZX0gPT4gJF8tPntEYXRhYmFzZUZpZWxkfSB9IEB7ICRQYXJhbXtTZWFyY2hGaWVsZHN9IH07CgogICAgZm9yIG15ICRGaWVsZCAoQEFycmF5U2VhcmNoRmllbGRzKSB7CgogICAgICAgIG15ICRTZWxlY3Rpb25zRGF0YSA9ICRGaWVsZC0+e1NlbGVjdGlvbnNEYXRhfTsKCiAgICAgICAgZm9yIG15ICRTZWxlY3RlZFZhbHVlICggQHsgJFBhcmFteyAkRmllbGQtPntOYW1lfSB9IH0gKSB7CgogICAgICAgICAgICAjIENoZWNrIGlmIHRoZSBzZWxlY3RlZCB2YWx1ZSBmb3IgdGhlIGN1cnJlbnQgZmllbGQgaXMgdmFsaWQuCiAgICAgICAgICAgIGlmICggISRTZWxlY3Rpb25zRGF0YS0+eyRTZWxlY3RlZFZhbHVlfSApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRoZSBzZWxlY3RlZCB2YWx1ZSAkRmllbGQtPntOYW1lfSBpcyBub3QgdmFsaWQhIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbXkgJERCT2JqZWN0ID0gJFNlbGYtPntEQk9iamVjdH07CgogICAgIyBBc3NlbWJsZSB0aGUgY29uZGl0aW9ucyB1c2VkIGluIHRoZSBXSEVSRSBjbGF1c2UuCiAgICBteSBAU1FMV2hlcmU7CgogICAgZm9yIG15ICRGaWVsZCAoQFNjYWxhclNlYXJjaEZpZWxkcykgewoKICAgICAgICAjIFNlYXJjaCBmb3Igc2NhbGFyIGZpZWxkcyAod2lsZGNhcmRzIGFyZSBhbGxvd2VkKS4KICAgICAgICBpZiAoICRQYXJhbXsgJEZpZWxkLT57TmFtZX0gfSApIHsKCiAgICAgICAgICAgICMgR2V0IGxpa2UgZXNjYXBlIHN0cmluZyBuZWVkZWQgZm9yIHNvbWUgZGF0YWJhc2VzIChlLmcuIG9yYWNsZSkuCiAgICAgICAgICAgIG15ICRMaWtlRXNjYXBlU3RyaW5nID0gJERCT2JqZWN0LT5HZXREYXRhYmFzZUZ1bmN0aW9uKCdMaWtlRXNjYXBlU3RyaW5nJyk7CgogICAgICAgICAgICAkUGFyYW17ICRGaWVsZC0+e05hbWV9IH0gPSAkREJPYmplY3QtPlF1b3RlKCAkUGFyYW17ICRGaWVsZC0+e05hbWV9IH0sICdMaWtlJyApOwoKICAgICAgICAgICAgJFBhcmFteyAkRmllbGQtPntOYW1lfSB9ID1+IHN7IFwqKyB9eyV9eG1zZzsKCiAgICAgICAgICAgICMgSWYgdGhlIGZpZWxkIGNvbnRhaW5zIG1vcmUgdGhhbiBvbmx5ICclJy4KICAgICAgICAgICAgaWYgKCAkUGFyYW17ICRGaWVsZC0+e05hbWV9IH0gIX4gbXsgXEEgJSogXHogfXhtcyApIHsKICAgICAgICAgICAgICAgIHB1c2ggQFNRTFdoZXJlLAogICAgICAgICAgICAgICAgICAgICJMT1dFUigkRmllbGQtPntEYXRhYmFzZUZpZWxkfSkgTElLRSBMT1dFUignJFBhcmFteyAkRmllbGQtPntOYW1lfSB9JykgJExpa2VFc2NhcGVTdHJpbmciOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgZHluYW1pYyBmaWVsZCBoYW5kbGluZwogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CiAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlncyAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBPYmplY3RUeXBlID0+ICdDdXN0b21lckNvbXBhbnknLAogICAgKTsKCiAgICBteSAkU1FMRHluYW1pY0ZpZWxkRnJvbSAgICAgPSAnJzsKICAgIG15ICRTUUxEeW5hbWljRmllbGRXaGVyZSAgICA9ICcnOwogICAgbXkgJER5bmFtaWNGaWVsZEpvaW5Db3VudGVyID0gMTsKCiAgICBEWU5BTUlDRklFTEQ6CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZCAoIEB7JER5bmFtaWNGaWVsZENvbmZpZ3N9ICkgewoKICAgICAgICBteSAkU2VhcmNoUGFyYW0gPSAkUGFyYW17ICJEeW5hbWljRmllbGRfIiAuICREeW5hbWljRmllbGQtPntOYW1lfSB9OwoKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAoICEkU2VhcmNoUGFyYW0gKTsKICAgICAgICBuZXh0IERZTkFNSUNGSUVMRCBpZiAoIHJlZiAkU2VhcmNoUGFyYW0gbmUgJ0hBU0gnICk7CgogICAgICAgIG15ICROZWVkSm9pbjsKCiAgICAgICAgZm9yIG15ICRPcGVyYXRvciAoIHNvcnQga2V5cyAleyRTZWFyY2hQYXJhbX0gKSB7CgogICAgICAgICAgICBteSBAU2VhcmNoUGFyYW1zID0gKCByZWYgJFNlYXJjaFBhcmFtLT57JE9wZXJhdG9yfSBlcSAnQVJSQVknICkKICAgICAgICAgICAgICAgID8gQHsgJFNlYXJjaFBhcmFtLT57JE9wZXJhdG9yfSB9CiAgICAgICAgICAgICAgICA6ICggJFNlYXJjaFBhcmFtLT57JE9wZXJhdG9yfSApOwoKICAgICAgICAgICAgbXkgJFNRTER5bmFtaWNGaWVsZFdoZXJlU3ViID0gJyc7CiAgICAgICAgICAgIGlmICgkU1FMRHluYW1pY0ZpZWxkV2hlcmUpIHsKICAgICAgICAgICAgICAgICRTUUxEeW5hbWljRmllbGRXaGVyZVN1YiA9ICcgQU5EICgnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNRTER5bmFtaWNGaWVsZFdoZXJlU3ViID0gJyAoJzsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbXkgJENvdW50ZXIgPSAwOwogICAgICAgICAgICBURVhUOgogICAgICAgICAgICBmb3IgbXkgJFRleHQgKEBTZWFyY2hQYXJhbXMpIHsKICAgICAgICAgICAgICAgIG5leHQgVEVYVCBpZiAoICFkZWZpbmVkICRUZXh0IHx8ICRUZXh0IGVxICcnICk7CgogICAgICAgICAgICAgICAgJFRleHQgPX4gcy9cKi8lL2dpOwoKICAgICAgICAgICAgICAgICMgQ2hlY2sgc2VhcmNoIGF0dHJpYnV0ZSwgd2UgZG8gbm90IG5lZWQgdG8gc2VhcmNoIGZvciAnKicuCiAgICAgICAgICAgICAgICBuZXh0IFRFWFQgaWYgJFRleHQgPX4gL15cJXsxLDN9JC87CgogICAgICAgICAgICAgICAgbXkgJFZhbGlkYXRlU3VjY2VzcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZVZhbGlkYXRlKAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkLAogICAgICAgICAgICAgICAgICAgIFZhbHVlICAgICAgICAgICAgICA9PiAkVGV4dCwKICAgICAgICAgICAgICAgICAgICBVc2VySUQgICAgICAgICAgICAgPT4gJFBhcmFte1VzZXJJRH0gfHwgMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICBpZiAoICEkVmFsaWRhdGVTdWNjZXNzICkgewogICAgICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiU2VhcmNoIG5vdCBleGVjdXRlZCBkdWUgdG8gaW52YWxpZCB2YWx1ZSAnIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkVGV4dAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAiJyBvbiBmaWVsZCAnIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkRHluYW1pY0ZpZWxkLT57TmFtZX0gLiAiJyEiLAogICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJENvdW50ZXIpIHsKICAgICAgICAgICAgICAgICAgICAkU1FMRHluYW1pY0ZpZWxkV2hlcmVTdWIgLj0gJyBPUiAnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJFNRTER5bmFtaWNGaWVsZFdoZXJlU3ViIC49ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5TZWFyY2hTUUxHZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGQsCiAgICAgICAgICAgICAgICAgICAgVGFibGVBbGlhcyAgICAgICAgID0+ICJkZnYkRHluYW1pY0ZpZWxkSm9pbkNvdW50ZXIiLAogICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yICAgICAgICAgICA9PiAkT3BlcmF0b3IsCiAgICAgICAgICAgICAgICAgICAgU2VhcmNoVGVybSAgICAgICAgID0+ICRUZXh0LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRTUUxEeW5hbWljRmllbGRXaGVyZVN1YiAuPSAnKSAnOwoKICAgICAgICAgICAgaWYgKCRDb3VudGVyKSB7CiAgICAgICAgICAgICAgICAkU1FMRHluYW1pY0ZpZWxkV2hlcmUgLj0gJFNRTER5bmFtaWNGaWVsZFdoZXJlU3ViOwogICAgICAgICAgICAgICAgJE5lZWRKb2luID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCROZWVkSm9pbikgewogICAgICAgICAgICAkU1FMRHluYW1pY0ZpZWxkRnJvbSAuPSAiCiAgICAgICAgICAgICAgICBJTk5FUiBKT0lOIGR5bmFtaWNfZmllbGRfdmFsdWUgZGZ2JER5bmFtaWNGaWVsZEpvaW5Db3VudGVyCiAgICAgICAgICAgICAgICAgICAgT04gKGRmX29ial9pZF9uYW1lLm9iamVjdF9pZCA9IGRmdiREeW5hbWljRmllbGRKb2luQ291bnRlci5vYmplY3RfaWQKICAgICAgICAgICAgICAgICAgICAgICAgQU5EIGRmdiREeW5hbWljRmllbGRKb2luQ291bnRlci5maWVsZF9pZCA9ICIKICAgICAgICAgICAgICAgIC4gJERCT2JqZWN0LT5RdW90ZSggJER5bmFtaWNGaWVsZC0+e0lEfSwgJ0ludGVnZXInICkgLiAiKQogICAgICAgICAgICAiOwoKICAgICAgICAgICAgJER5bmFtaWNGaWVsZEpvaW5Db3VudGVyKys7CiAgICAgICAgfQogICAgfQoKICAgICMgRXhlY3V0ZSBhIGR5bmFtaWMgZmllbGQgc2VhcmNoLCBpZiBhIGR5bmFtaWMgZmllbGQgd2hlcmUgc3RhdGVtZW50IGV4aXN0cy4KICAgIGlmICggJFNRTER5bmFtaWNGaWVsZEZyb20gJiYgJFNRTER5bmFtaWNGaWVsZFdoZXJlICkgewoKICAgICAgICBteSBARHluYW1pY0ZpZWxkQ3VzdG9tZXJJRHM7CgogICAgICAgICMgU3FsIHVlcnkgZm9yIHRoZSBkeW5hbWljIGZpZWxkcy4KICAgICAgICBteSAkU1FMRHluYW1pY0ZpZWxkID0gIlNFTEVDVCBESVNUSU5DVChkZl9vYmpfaWRfbmFtZS5vYmplY3RfbmFtZSkgRlJPTSBkeW5hbWljX2ZpZWxkX29ial9pZF9uYW1lIGRmX29ial9pZF9uYW1lICIKICAgICAgICAgICAgLiAkU1FMRHluYW1pY0ZpZWxkRnJvbQogICAgICAgICAgICAuICIgV0hFUkUgIgogICAgICAgICAgICAuICRTUUxEeW5hbWljRmllbGRXaGVyZTsKCiAgICAgICAgbXkgJFVzZWRDYWNoZTsKCiAgICAgICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKCiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRTZWFyY2hDYWNoZURhdGEgPSAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+R2V0KAogICAgICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVyU2VhcmNoRGV0YWlsRHluYW1pY0ZpZWxkcycsCiAgICAgICAgICAgICAgICBLZXkgID0+ICRTUUxEeW5hbWljRmllbGQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoIGRlZmluZWQgJER5bmFtaWNGaWVsZFNlYXJjaENhY2hlRGF0YSApIHsKICAgICAgICAgICAgICAgIGlmICggcmVmICREeW5hbWljRmllbGRTZWFyY2hDYWNoZURhdGEgZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgICAgICAgICBARHluYW1pY0ZpZWxkQ3VzdG9tZXJJRHMgPSBAeyREeW5hbWljRmllbGRTZWFyY2hDYWNoZURhdGF9OwoKICAgICAgICAgICAgICAgICAgICAjIFNldCB0aGUgdXNlZCBjYWNoZSBmbGFnLgogICAgICAgICAgICAgICAgICAgICRVc2VkQ2FjaGUgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdJbnZhbGlkIHJlZiAnIC4gcmVmKCREeW5hbWljRmllbGRTZWFyY2hDYWNoZURhdGEpIC4gJyEnCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgR2V0IHRoZSBkYXRhIG9ubHkgZnJvbSBkYXRhYmFzZSwgaWYgbm8gY2FjaGUgZW50cnkgZXhpc3RzLgogICAgICAgIGlmICggISRVc2VkQ2FjaGUgKSB7CgogICAgICAgICAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICAgICAgICAgIFNRTCA9PiAkU1FMRHluYW1pY0ZpZWxkLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBEeW5hbWljRmllbGRDdXN0b21lcklEcywgJFJvd1swXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5TZXQoCiAgICAgICAgICAgICAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ19DdXN0b21lclNlYXJjaERldGFpbER5bmFtaWNGaWVsZHMnLAogICAgICAgICAgICAgICAgICAgIEtleSAgID0+ICRTUUxEeW5hbWljRmllbGQsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gXEBEeW5hbWljRmllbGRDdXN0b21lcklEcywKICAgICAgICAgICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntDYWNoZVRUTH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIEFkZCB0aGUgdXNlciBsb2dpbnMgZnJvbSB0aGUgZHluYW1pYyBmaWVsZHMsIGlmIGEgc2VhcmNoIHJlc3VsdCBleGlzdHMgZnJvbSB0aGUgZHluYW1pYyBmaWVsZCBzZWFyY2gKICAgICAgICAjICAgb3Igc2tpcCB0aGUgc2VhcmNoIGFuZCByZXR1cm4gYSBlbXB0cnkgYXJyYXkgcmVmIChvciB6ZXJvIGZvciB0aGUgcmVzdWx0ICdDT1VOVCcsIGlmIG5vIHVzZXIgbG9naW5zIGV4aXN0cwogICAgICAgICMgICBmcm9tIHRoZSBkeW5hbWljIGZpZWxkIHNlYXJjaC4KICAgICAgICBpZiAoQER5bmFtaWNGaWVsZEN1c3RvbWVySURzKSB7CgogICAgICAgICAgICBteSAkU1FMUXVlcnlJbkNvbmRpdGlvbiA9ICREQk9iamVjdC0+UXVlcnlJbkNvbmRpdGlvbigKICAgICAgICAgICAgICAgIEtleSAgICAgID0+ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55S2V5fSwKICAgICAgICAgICAgICAgIFZhbHVlcyAgID0+IFxARHluYW1pY0ZpZWxkQ3VzdG9tZXJJRHMsCiAgICAgICAgICAgICAgICBCaW5kTW9kZSA9PiAwLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcHVzaCBAU1FMV2hlcmUsICRTUUxRdWVyeUluQ29uZGl0aW9uOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuICRSZXN1bHQgZXEgJ0NPVU5UJyA/IDAgOiBbXTsKICAgICAgICB9CiAgICB9CgogICAgRklFTEQ6CiAgICBmb3IgbXkgJEZpZWxkIChAQXJyYXlTZWFyY2hGaWVsZHMpIHsKCiAgICAgICAgbmV4dCBGSUVMRCBpZiAhQHsgJFBhcmFteyAkRmllbGQtPntOYW1lfSB9IH07CgogICAgICAgIG15ICRTUUxRdWVyeUluQ29uZGl0aW9uID0gJERCT2JqZWN0LT5RdWVyeUluQ29uZGl0aW9uKAogICAgICAgICAgICBLZXkgICAgICA9PiAkRmllbGQtPntEYXRhYmFzZUZpZWxkfSwKICAgICAgICAgICAgVmFsdWVzICAgPT4gJFBhcmFteyAkRmllbGQtPntOYW1lfSB9LAogICAgICAgICAgICBCaW5kTW9kZSA9PiAwLAogICAgICAgICk7CgogICAgICAgIHB1c2ggQFNRTFdoZXJlLCAkU1FMUXVlcnlJbkNvbmRpdGlvbjsKICAgIH0KCiAgICAjIEFkZCB0aGUgdmFsaWQgb3B0aW9uIGlmIG5lZWRlZC4KICAgIGlmICggJFNlbGYtPntDdXN0b21lckNvbXBhbnlNYXB9LT57Q3VzdG9tZXJWYWxpZH0gJiYgJFZhbGlkICkgewoKICAgICAgICBteSAkVmFsaWRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKTsKCiAgICAgICAgcHVzaCBAU1FMV2hlcmUsCiAgICAgICAgICAgICIkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntDdXN0b21lclZhbGlkfSBJTiAoIiAuIGpvaW4oICcsICcsICRWYWxpZE9iamVjdC0+VmFsaWRJRHNHZXQoKSApIC4gIikgIjsKICAgIH0KCiAgICAjIENoZWNrIGlmIE9yZGVyQnkgY29udGFpbnMgb25seSB1bmlxdWUgdmFsaWQgdmFsdWVzLgogICAgbXkgJU9yZGVyQnlTZWVuOwogICAgZm9yIG15ICRPcmRlckJ5ICggQHsgJFBhcmFte09yZGVyQnl9IH0gKSB7CgogICAgICAgIGlmICggISRPcmRlckJ5IHx8ICRPcmRlckJ5U2VlbnskT3JkZXJCeX0gKSB7CgogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiT3JkZXJCeSBjb250YWlucyBpbnZhbGlkIHZhbHVlICckT3JkZXJCeScgIgogICAgICAgICAgICAgICAgICAgIC4gJ29yIHRoZSB2YWx1ZSBpcyB1c2VkIG1vcmUgdGhhbiBvbmNlIScsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgUmVtZW1iZXIgdGhlIHZhbHVlIHRvIGNoZWNrIGlmIGl0IGFwcGVhcnMgbW9yZSB0aGFuIG9uY2UuCiAgICAgICAgJE9yZGVyQnlTZWVueyRPcmRlckJ5fSA9IDE7CiAgICB9CgogICAgIyBDaGVjayBpZiBPcmRlckJ5RGlyZWN0aW9uIGFycmF5IGNvbnRhaW5zIG9ubHkgJ1VwJyBvciAnRG93bicuCiAgICBESVJFQ1RJT046CiAgICBmb3IgbXkgJERpcmVjdGlvbiAoIEB7ICRQYXJhbXtPcmRlckJ5RGlyZWN0aW9ufSB9ICkgewoKICAgICAgICAjIE9ubHkgJ1VwJyBvciAnRG93bicgYWxsb3dlZC4KICAgICAgICBuZXh0IERJUkVDVElPTiBpZiAkRGlyZWN0aW9uIGVxICdVcCc7CiAgICAgICAgbmV4dCBESVJFQ1RJT04gaWYgJERpcmVjdGlvbiBlcSAnRG93bic7CgogICAgICAgICMgZm91bmQgYW4gZXJyb3IKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk9yZGVyQnlEaXJlY3Rpb24gY2FuIG9ubHkgY29udGFpbiAnVXAnIG9yICdEb3duJyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgQnVpbGQgdGhlIHNxbCBzdGF0ZW1lbnQgZm9yIHRoZSBzZWFyY2guCiAgICBteSAkU1FMID0gIlNFTEVDVCBESVNUSU5DVCgkU2VsZi0+e0N1c3RvbWVyQ29tcGFueUtleX0pIjsKCiAgICAjIE1vZGlmeSBTUUwgd2hlbiB0aGUgcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJy4KICAgIGlmICggJFJlc3VsdCBlcSAnQ09VTlQnICkgewogICAgICAgICRTUUwgPSAiU0VMRUNUIENPVU5UKERJU1RJTkNUKCRTZWxmLT57Q3VzdG9tZXJDb21wYW55S2V5fSkpIjsKICAgIH0KCiAgICBteSBAU1FMT3JkZXJCeTsKCiAgICAjIFRoZSBPcmRlciBieSBjbGF1c2UgaXMgbm90IG5lZWRlZCBmb3IgdGhlIHJlc3VsdCB0eXBlICdDT1VOVCcuCiAgICBpZiAoICRSZXN1bHQgbmUgJ0NPVU5UJyApIHsKCiAgICAgICAgbXkgJENvdW50ID0gMDsKCiAgICAgICAgT1JERVJCWToKICAgICAgICBmb3IgbXkgJE9yZGVyQnkgKCBAeyAkUGFyYW17T3JkZXJCeX0gfSApIHsKCiAgICAgICAgICAgICMgU2V0IHRoZSBkZWZhdWx0IG9yZGVyIGRpcmVjdGlvbi4KICAgICAgICAgICAgbXkgJERpcmVjdGlvbiA9ICdERVNDJzsKCiAgICAgICAgICAgICMgQWRkIHRoZSBnaXZlbiBvcmRlciBkaXJlY3Rpb24uCiAgICAgICAgICAgIGlmICggJFBhcmFte09yZGVyQnlEaXJlY3Rpb259LT5bJENvdW50XSApIHsKICAgICAgICAgICAgICAgIGlmICggJFBhcmFte09yZGVyQnlEaXJlY3Rpb259LT5bJENvdW50XSBlcSAnVXAnICkgewogICAgICAgICAgICAgICAgICAgICREaXJlY3Rpb24gPSAnQVNDJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICggJFBhcmFte09yZGVyQnlEaXJlY3Rpb259LT5bJENvdW50XSBlcSAnRG93bicgKSB7CiAgICAgICAgICAgICAgICAgICAgJERpcmVjdGlvbiA9ICdERVNDJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgJENvdW50Kys7CgogICAgICAgICAgICBuZXh0IE9SREVSQlkgaWYgISRPcmRlckJ5VGFibGV7JE9yZGVyQnl9OwoKICAgICAgICAgICAgcHVzaCBAU1FMT3JkZXJCeSwgIiRPcmRlckJ5VGFibGV7JE9yZGVyQnl9ICREaXJlY3Rpb24iOwoKICAgICAgICAgICAgbmV4dCBPUkRFUkJZIGlmICRPcmRlckJ5IGVxICdDdXN0b21lcklEJzsKCiAgICAgICAgICAgICRTUUwgLj0gIiwgJE9yZGVyQnlUYWJsZXskT3JkZXJCeX0iOwogICAgICAgIH0KCiAgICAgICAgIyBJZiB0aGVyZSBpcyBhIHBvc3NpYmlsaXR5IHRoYXQgdGhlIG9yZGVyaW5nIGlzIG5vdCBkZXRlcm1pbmVkCiAgICAgICAgIyAgIHdlIGFkZCBhbiBkZXNjZW5kaW5nIG9yZGVyaW5nIGJ5IGlkLgogICAgICAgIGlmICggIWdyZXAgeyAkXyBlcSAnQ3VzdG9tZXJJRCcgfSAoIEB7ICRQYXJhbXtPcmRlckJ5fSB9ICkgKSB7CiAgICAgICAgICAgIHB1c2ggQFNRTE9yZGVyQnksICIkU2VsZi0+e0N1c3RvbWVyQ29tcGFueUtleX0gREVTQyI7CiAgICAgICAgfQogICAgfQoKICAgICMgQWRkIGZvcm0gdG8gdGhlIFNRTCBhZnRlciB0aGUgb3JkZXIgYnkgY3JlYXRpb24uCiAgICAkU1FMIC49ICIgRlJPTSAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueVRhYmxlfSAiOwoKICAgIGlmIChAU1FMV2hlcmUpIHsKICAgICAgICBteSAkU1FMV2hlcmVTdHJpbmcgPSBqb2luICcgQU5EICcsIG1hcCB7IiggJF8gKSJ9IEBTUUxXaGVyZTsKICAgICAgICAkU1FMIC49ICJXSEVSRSAkU1FMV2hlcmVTdHJpbmcgIjsKICAgIH0KCiAgICBpZiAoQFNRTE9yZGVyQnkpIHsKICAgICAgICBteSAkT3JkZXJCeVN0cmluZyA9IGpvaW4gJywgJywgQFNRTE9yZGVyQnk7CiAgICAgICAgJFNRTCAuPSAiT1JERVIgQlkgJE9yZGVyQnlTdHJpbmciOwogICAgfQoKICAgICMgQ2hlY2sgaWYgYSBjYWNoZSBleGlzdHMgYmVmb3JlIHdlIGFzayB0aGUgZGF0YWJhc2UuCiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewoKICAgICAgICBteSAkQ2FjaGVEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPkdldCgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVyQ29tcGFueVNlYXJjaERldGFpbCcsCiAgICAgICAgICAgIEtleSAgPT4gJFNRTCAuICRQYXJhbXtMaW1pdH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCBkZWZpbmVkICRDYWNoZURhdGEgKSB7CiAgICAgICAgICAgIGlmICggcmVmICRDYWNoZURhdGEgZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkQ2FjaGVEYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggcmVmICRDYWNoZURhdGEgZXEgJycgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJENhY2hlRGF0YTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnSW52YWxpZCByZWYgJyAuIHJlZigkQ2FjaGVEYXRhKSAuICchJwogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICRTUUwsCiAgICAgICAgTGltaXQgPT4gJFBhcmFte0xpbWl0fSwKICAgICk7CgogICAgbXkgQElEczsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQElEcywgJFJvd1swXTsKICAgIH0KCiAgICAjIEhhbmRsZSB0aGUgZGlmZnJlbnQgcmVzdWx0IHR5cGVzLgogICAgaWYgKCAkUmVzdWx0IGVxICdDT1VOVCcgKSB7CgogICAgICAgIGlmICggJFNlbGYtPntDYWNoZU9iamVjdH0gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5TZXQoCiAgICAgICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVyQ29tcGFueVNlYXJjaERldGFpbCcsCiAgICAgICAgICAgICAgICBLZXkgICA9PiAkU1FMIC4gJFBhcmFte0xpbWl0fSwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICRJRHNbMF0sCiAgICAgICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkSURzWzBdOwogICAgfQoKICAgIGVsc2UgewoKICAgICAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgICAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ19DdXN0b21lckNvbXBhbnlTZWFyY2hEZXRhaWwnLAogICAgICAgICAgICAgICAgS2V5ICAgPT4gJFNRTCAuICRQYXJhbXtMaW1pdH0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiBcQElEcywKICAgICAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgICAgICApOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFxASURzOwogICAgfQp9CgpzdWIgQ3VzdG9tZXJDb21wYW55R2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDdXN0b21lcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ3VzdG9tZXJJRCEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBjYWNoZQogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICBteSAkRGF0YSA9ICRTZWxmLT57Q2FjaGVPYmplY3R9LT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICJDdXN0b21lckNvbXBhbnlHZXQ6OiRQYXJhbXtDdXN0b21lcklEfSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJXskRGF0YX0gaWYgcmVmICREYXRhIGVxICdIQVNIJzsKICAgIH0KCiAgICAjIGJ1aWxkIHNlbGVjdAogICAgbXkgQEZpZWxkczsKICAgIG15ICVGaWVsZHNNYXA7CgogICAgRU5UUlk6CiAgICBmb3IgbXkgJEVudHJ5ICggQHsgJFNlbGYtPntDdXN0b21lckNvbXBhbnlNYXB9LT57TWFwfSB9ICkgewogICAgICAgIG5leHQgRU5UUlkgaWYgJEVudHJ5LT5bNV0gZXEgJ2R5bmFtaWNfZmllbGQnOwogICAgICAgIHB1c2ggQEZpZWxkcywgJEVudHJ5LT5bMl07CiAgICAgICAgJEZpZWxkc01hcHsgJEVudHJ5LT5bMl0gfSA9ICRFbnRyeS0+WzBdOwogICAgfQogICAgbXkgJFNRTCA9ICdTRUxFQ1QgJyAuIGpvaW4oICcsICcsIEBGaWVsZHMgKTsKCiAgICBpZiAoICEkU2VsZi0+e0ZvcmVpZ25EQn0gKSB7CiAgICAgICAgJFNRTCAuPSAiLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5LCBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5IjsKICAgIH0KCiAgICAjIHRoaXMgc2VlbXMgdG8gYmUgbGVnYWN5LCBpZiBOYW1lIGlzIHBhc3NlZCBpdCBzaG91bGQgdGFrZSBwcmVjZWRlbmNlIG92ZXIgQ3VzdG9tZXJJRAogICAgbXkgJEN1c3RvbWVySUQgPSAkUGFyYW17TmFtZX0gfHwgJFBhcmFte0N1c3RvbWVySUR9OwoKICAgICRTUUwgLj0gIiBGUk9NICRTZWxmLT57Q3VzdG9tZXJDb21wYW55VGFibGV9IFdIRVJFICI7CgogICAgaWYgKCAkU2VsZi0+e0Nhc2VTZW5zaXRpdmV9ICkgewogICAgICAgICRTUUwgLj0gIiRTZWxmLT57Q3VzdG9tZXJDb21wYW55S2V5fSA9ID8iOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNRTCAuPSAiTE9XRVIoJFNlbGYtPntDdXN0b21lckNvbXBhbnlLZXl9KSA9IExPV0VSKCA/ICkiOwogICAgfQoKICAgICMgZ2V0IGluaXRpYWwgZGF0YQogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBbIFwkQ3VzdG9tZXJJRCBdCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJURhdGE7CiAgICBST1c6CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICBteSAkTWFwQ291bnRlciA9IDA7CgogICAgICAgIGZvciBteSAkRmllbGQgKEBGaWVsZHMpIHsKICAgICAgICAgICAgJERhdGF7ICRGaWVsZHNNYXB7JEZpZWxkfSB9ID0gJFJvd1skTWFwQ291bnRlcl07CiAgICAgICAgICAgICRNYXBDb3VudGVyKys7CiAgICAgICAgfQoKICAgICAgICBuZXh0IFJPVyBpZiAkU2VsZi0+e0ZvcmVpZ25EQn07CgogICAgICAgIGZvciBteSAkS2V5IChxdyhDcmVhdGVUaW1lIENyZWF0ZUJ5IENoYW5nZVRpbWUgQ2hhbmdlQnkpKSB7CiAgICAgICAgICAgICREYXRheyRLZXl9ID0gJFJvd1skTWFwQ291bnRlcl07CiAgICAgICAgICAgICRNYXBDb3VudGVyKys7CiAgICAgICAgfQogICAgfQoKICAgICMgY2FjaGUgcmVxdWVzdAogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgID0+ICJDdXN0b21lckNvbXBhbnlHZXQ6OiRQYXJhbXtDdXN0b21lcklEfSIsCiAgICAgICAgICAgIFZhbHVlID0+IFwlRGF0YSwKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDYWNoZVRUTH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIHJldHVybiBkYXRhCiAgICByZXR1cm4gKCVEYXRhKTsKfQoKc3ViIEN1c3RvbWVyQ29tcGFueUFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgcm8vcncKICAgIGlmICggJFNlbGYtPntSZWFkT25seX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdDdXN0b21lckNvbXBhbnkgYmFja2VuZCBpcyByZWFkIG9ubHkhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15IEBGaWVsZHM7CiAgICBteSBAUGxhY2Vob2xkZXJzOwogICAgbXkgQFZhbHVlczsKCiAgICBFTlRSWToKICAgIGZvciBteSAkRW50cnkgKCBAeyAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntNYXB9IH0gKSB7CgogICAgICAgICMgaWdub3JlIGR5bmFtaWMgZmllbGRzIGhlcmUKICAgICAgICBuZXh0IEVOVFJZIGlmICRFbnRyeS0+WzVdIGVxICdkeW5hbWljX2ZpZWxkJzsKCiAgICAgICAgcHVzaCBARmllbGRzLCAgICAgICAkRW50cnktPlsyXTsKICAgICAgICBwdXNoIEBQbGFjZWhvbGRlcnMsICc/JzsKICAgICAgICBwdXNoIEBWYWx1ZXMsICAgICAgIFwkUGFyYW17ICRFbnRyeS0+WzBdIH07CiAgICB9CiAgICBpZiAoICEkU2VsZi0+e0ZvcmVpZ25EQn0gKSB7CiAgICAgICAgcHVzaCBARmllbGRzLCAgICAgICBxdyhjcmVhdGVfdGltZSBjcmVhdGVfYnkgY2hhbmdlX3RpbWUgY2hhbmdlX2J5KTsKICAgICAgICBwdXNoIEBQbGFjZWhvbGRlcnMsIHF3KGN1cnJlbnRfdGltZXN0YW1wID8gY3VycmVudF90aW1lc3RhbXAgPyk7CiAgICAgICAgcHVzaCBAVmFsdWVzLCAoIFwkUGFyYW17VXNlcklEfSwgXCRQYXJhbXtVc2VySUR9ICk7CiAgICB9CgogICAgIyBidWlsZCBpbnNlcnQKICAgIG15ICRTUUwgPSAiSU5TRVJUIElOVE8gJFNlbGYtPntDdXN0b21lckNvbXBhbnlUYWJsZX0gKCI7CiAgICAkU1FMIC49IGpvaW4oICcsICcsIEBGaWVsZHMgKSAuICIgKSBWQUxVRVMgKCAiIC4gam9pbiggJywgJywgQFBsYWNlaG9sZGVycyApIC4gIiApIjsKCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQFZhbHVlcywKICAgICk7CgogICAgIyBsb2cgbm90aWNlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnaW5mbycsCiAgICAgICAgTWVzc2FnZSAgPT4KICAgICAgICAgICAgIkN1c3RvbWVyQ29tcGFueTogJyRQYXJhbXtDdXN0b21lckNvbXBhbnlOYW1lfS8kUGFyYW17Q3VzdG9tZXJJRH0nIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5ICgkUGFyYW17VXNlcklEfSkhIiwKICAgICk7CgogICAgJFNlbGYtPl9DdXN0b21lckNvbXBhbnlDYWNoZUNsZWFyKCBDdXN0b21lcklEID0+ICRQYXJhbXtDdXN0b21lcklEfSApOwoKICAgIHJldHVybiAkUGFyYW17Q3VzdG9tZXJJRH07Cn0KCnN1YiBDdXN0b21lckNvbXBhbnlVcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIHJvL3J3CiAgICBpZiAoICRTZWxmLT57UmVhZE9ubHl9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnQ3VzdG9tZXIgYmFja2VuZCBpcyByZWFkIG9ubHkhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBGSUVMRDoKICAgIGZvciBteSAkRW50cnkgKCBAeyAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntNYXB9IH0gKSB7CiAgICAgICAgbmV4dCBGSUVMRCBpZiAkUGFyYW17ICRFbnRyeS0+WzBdIH07ICAgICAgICAgICAgICMgd29ycnkgb25seSBhYm91dCBlbXB0eSBmaWVsZHMsICcwJyBpcyBjb25zaWRlcmVkIGFzIGJlaW5nIGVtcHR5CiAgICAgICAgbmV4dCBGSUVMRCBpZiAkRW50cnktPls1XSBlcSAnZHluYW1pY19maWVsZCc7ICAgICMgZG8gbm90IGNvbXBsYWluIGFib3V0IG1pc3NpbmcgZHluYW1pYyBmaWVsZHMKICAgICAgICBuZXh0IEZJRUxEIGlmICEkRW50cnktPls0XTsgICAgICAgICAgICAgICAgICAgICAgIyBjb21wbGFpbiBvbmx5IGFib3V0IG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzCiAgICAgICAgbmV4dCBGSUVMRCBpZiAkRW50cnktPlswXSBlcSAnVXNlclBhc3N3b3JkJzsgICAgICMgZG8gbm90IGNvbXBsYWluIGFib3V0IG1pc3NpbmcgcGFzc3dvcmQgZmllbGQKCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRFbnRyeS0+WzBdISIKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBDb2xsZWN0IHRoZSBpbmZvIG5lZWRlZCBmb3IgdGhlIFNRTCBVUERBVEUgc3RhdGVtZW50CiAgICAjIFRoZSByZWFkb25seSBmbGFnIGlzIG5vdCBob25vcmVkIGhlcmUuCiAgICBteSAoIEBGaWVsZHMsIEBWYWx1ZXMgKTsKICAgIEZJRUxEOgogICAgZm9yIG15ICRFbnRyeSAoIEB7ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e01hcH0gfSApIHsKICAgICAgICBuZXh0IEZJRUxEIGlmICRFbnRyeS0+WzBdID1+IG0vXlVzZXJQYXNzd29yZCQvaTsgICAgIyBza2lwIHRoZSBwYXNzd29yZCBmaWVsZAogICAgICAgIG5leHQgRklFTEQgaWYgJEVudHJ5LT5bNV0gZXEgJ2R5bmFtaWNfZmllbGQnOyAgICAgICAjIHNraXAgZHluYW1pYyBmaWVsZHMKICAgICAgICBwdXNoIEBGaWVsZHMsICRFbnRyeS0+WzJdIC4gJyA9ID8nOwogICAgICAgIHB1c2ggQFZhbHVlcywgXCRQYXJhbXsgJEVudHJ5LT5bMF0gfTsKICAgIH0KICAgIGlmICggISRTZWxmLT57Rm9yZWlnbkRCfSApIHsKICAgICAgICBwdXNoIEBGaWVsZHMsICggJ2NoYW5nZV90aW1lID0gY3VycmVudF90aW1lc3RhbXAnLCAnY2hhbmdlX2J5ID0gPycgKTsKICAgICAgICBwdXNoIEBWYWx1ZXMsIFwkUGFyYW17VXNlcklEfTsKICAgIH0KCiAgICAjIGNyZWF0ZSBTUUwgc3RhdGVtZW50CiAgICBteSAkU1FMID0gIlVQREFURSAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueVRhYmxlfSBTRVQgIjsKICAgICRTUUwgLj0gam9pbiggJywgJywgQEZpZWxkcyApOwoKICAgIGlmICggJFNlbGYtPntDYXNlU2Vuc2l0aXZlfSApIHsKICAgICAgICAkU1FMIC49ICIgV0hFUkUgJFNlbGYtPntDdXN0b21lckNvbXBhbnlLZXl9ID0gPyI7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU1FMIC49ICIgV0hFUkUgTE9XRVIoJFNlbGYtPntDdXN0b21lckNvbXBhbnlLZXl9KSA9IExPV0VSKCA/ICkiOwogICAgfQogICAgcHVzaCBAVmFsdWVzLCBcJFBhcmFte0N1c3RvbWVyQ29tcGFueUlEfTsKCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQFZhbHVlcywKICAgICk7CgogICAgIyBsb2cgbm90aWNlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnaW5mbycsCiAgICAgICAgTWVzc2FnZSAgPT4KICAgICAgICAgICAgIkN1c3RvbWVyQ29tcGFueTogJyRQYXJhbXtDdXN0b21lckNvbXBhbnlOYW1lfS8kUGFyYW17Q3VzdG9tZXJJRH0nIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5ICgkUGFyYW17VXNlcklEfSkhIiwKICAgICk7CgogICAgJFNlbGYtPl9DdXN0b21lckNvbXBhbnlDYWNoZUNsZWFyKCBDdXN0b21lcklEID0+ICRQYXJhbXtDdXN0b21lcklEfSApOwogICAgaWYgKCAkUGFyYW17Q3VzdG9tZXJDb21wYW55SUR9IG5lICRQYXJhbXtDdXN0b21lcklEfSApIHsKICAgICAgICAkU2VsZi0+X0N1c3RvbWVyQ29tcGFueUNhY2hlQ2xlYXIoIEN1c3RvbWVySUQgPT4gJFBhcmFte0N1c3RvbWVyQ29tcGFueUlEfSApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgX0N1c3RvbWVyQ29tcGFueUNhY2hlQ2xlYXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgISRTZWxmLT57Q2FjaGVPYmplY3R9OwoKICAgIGlmICggISRQYXJhbXtDdXN0b21lcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ3VzdG9tZXJJRCEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPkRlbGV0ZSgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICJDdXN0b21lckNvbXBhbnlHZXQ6OiRQYXJhbXtDdXN0b21lcklEfSIsCiAgICApOwoKICAgICMgZGVsZXRlIGFsbCBzZWFyY2ggY2FjaGUgZW50cmllcwogICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVyQ29tcGFueUxpc3QnLAogICAgKTsKICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ19DdXN0b21lckNvbXBhbnlTZWFyY2hEZXRhaWwnLAogICAgKTsKICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ19DdXN0b21lclNlYXJjaERldGFpbER5bmFtaWNGaWVsZHMnLAogICAgKTsKCiAgICBmb3IgbXkgJEZ1bmN0aW9uIChxdyhDdXN0b21lckNvbXBhbnlMaXN0KSkgewogICAgICAgIGZvciBteSAkVmFsaWQgKCAwIC4uIDEgKSB7CiAgICAgICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5EZWxldGUoCiAgICAgICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgICAgIEtleSAgPT4gIiR7RnVuY3Rpb259Ojoke1ZhbGlkfSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgREVTVFJPWSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgZGlzY29ubmVjdCBpZiBpdCdzIG5vdCBhIHBhcmVudCBEQk9iamVjdAogICAgaWYgKCAkU2VsZi0+e05vdFBhcmVudERCT2JqZWN0fSApIHsKICAgICAgICBpZiAoICRTZWxmLT57REJPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RGlzY29ubmVjdCgpOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsK</File>
        <File Location="Custom/Kernel/System/CustomerUser/DB.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBhNzJiMTRkZDc1ZjE4MWYwYTUzZGM0YmIxZDU3ZjE0N2ExMGI3N2M2IC0gS2VybmVsL1N5c3RlbS9DdXN0b21lclVzZXIvREIucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyOjpEQjsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCiMgY29yZSBtb2R1bGVzCnVzZSBEaWdlc3Q6OlNIQSAoKTsKCiMgQ1BBTiBtb2R1bGVzCnVzZSBDcnlwdDo6UGFzc3dkTUQ1IHF3KGFwYWNoZV9tZDVfY3J5cHQgdW5peF9tZDVfY3J5cHQpOwoKIyBPVE9CTyBtb2R1bGVzCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6Okxhbmd1YWdlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0nLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRCJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RW5jb2RlJywKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnLAojIEVPIFJvdGhlciBPU1MKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TWFpbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlZhbGlkJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkVmFsdWVPYmplY3ROYW1lJywKKTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0gYmxlc3Mge30sICRUeXBlOwoKICAgICMgY2hlY2sgbmVlZGVkIGRhdGEKICAgIGZvciBteSAkTmVlZGVkIChxdyggUHJlZmVyZW5jZXNPYmplY3QgQ3VzdG9tZXJVc2VyTWFwICkpIHsKICAgICAgICAkU2VsZi0+eyROZWVkZWR9ID0gJFBhcmFteyROZWVkZWR9IHx8IGRpZSAiR290IG5vICROZWVkZWQhIjsKICAgIH0KCiAgICAjIG1heCBzaG93biB1c2VyIHBlciBzZWFyY2ggbGlzdAogICAgJFNlbGYtPntVc2VyU2VhcmNoTGlzdExpbWl0fSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlclNlYXJjaExpc3RMaW1pdH0gfHwgMjUwOwoKICAgICMgY29uZmlnIG9wdGlvbnMKICAgICRTZWxmLT57Q3VzdG9tZXJUYWJsZX0gPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntQYXJhbXN9LT57VGFibGV9CiAgICAgICAgfHwgZGllICJOZWVkIEN1c3RvbWVyVXNlci0+UGFyYW1zLT5UYWJsZSBpbiBLZXJuZWwvQ29uZmlnLnBtISI7CiAgICAkU2VsZi0+e0N1c3RvbWVyS2V5fSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyS2V5fQogICAgICAgIHx8ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0tleX0KICAgICAgICB8fCBkaWUgIk5lZWQgQ3VzdG9tZXJVc2VyLT5DdXN0b21lcktleSBpbiBLZXJuZWwvQ29uZmlnLnBtISI7CiAgICAkU2VsZi0+e0N1c3RvbWVySUR9ID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJJRH0KICAgICAgICB8fCBkaWUgIk5lZWQgQ3VzdG9tZXJVc2VyLT5DdXN0b21lcklEIGluIEtlcm5lbC9Db25maWcucG0hIjsKICAgICRTZWxmLT57UmVhZE9ubHl9ICAgICAgICAgICAgICAgICA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1JlYWRPbmx5fTsKICAgICRTZWxmLT57RXhjbHVkZVByaW1hcnlDdXN0b21lcklEfSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlckV4Y2x1ZGVQcmltYXJ5Q3VzdG9tZXJJRH0gfHwgMDsKICAgICRTZWxmLT57U2VhcmNoUHJlZml4fSAgICAgICAgICAgICA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlclNlYXJjaFByZWZpeH07CgogICAgaWYgKCAhZGVmaW5lZCAkU2VsZi0+e1NlYXJjaFByZWZpeH0gKSB7CiAgICAgICAgJFNlbGYtPntTZWFyY2hQcmVmaXh9ID0gJyc7CiAgICB9CiAgICAkU2VsZi0+e1NlYXJjaFN1ZmZpeH0gPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJTZWFyY2hTdWZmaXh9OwogICAgaWYgKCAhZGVmaW5lZCAkU2VsZi0+e1NlYXJjaFN1ZmZpeH0gKSB7CiAgICAgICAgJFNlbGYtPntTZWFyY2hTdWZmaXh9ID0gJyonOwogICAgfQoKICAgICMgY2hlY2sgaWYgQ3VzdG9tZXJLZXkgaXMgdmFyIG9yIGludAogICAgRU5UUlk6CiAgICBmb3IgbXkgJEVudHJ5ICggQHsgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57TWFwfSB9ICkgewogICAgICAgIGlmICggJEVudHJ5LT5bMF0gZXEgJ1VzZXJMb2dpbicgJiYgJEVudHJ5LT5bNV0gPX4gL15pbnQkL2kgKSB7CiAgICAgICAgICAgICRTZWxmLT57Q3VzdG9tZXJLZXlJbnRlZ2VyfSA9IDE7CiAgICAgICAgICAgIGxhc3QgRU5UUlk7CiAgICAgICAgfQogICAgfQoKICAgICMgc2V0IGNhY2hlIHR5cGUKICAgICRTZWxmLT57Q2FjaGVUeXBlfSA9ICdDdXN0b21lclVzZXInIC4gJFBhcmFte0NvdW50fTsKCiAgICAjIGNyZWF0ZSBjYWNoZSBvYmplY3QsIGJ1dCBvbmx5IGlmIENhY2hlVFRMIGlzIHNldCBpbiBjdXN0b21lciBjb25maWcKICAgIGlmICggJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q2FjaGVUVEx9ICkgewogICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyk7CiAgICB9CgogICAgIyBjcmVhdGUgbmV3IGRiIGNvbm5lY3QgaWYgRFNOIGlzIGdpdmVuCiAgICBpZiAoICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1BhcmFtc30tPntEU059ICkgewogICAgICAgICRTZWxmLT57REJPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgICAgIERhdGFiYXNlRFNOICA9PiAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntQYXJhbXN9LT57RFNOfSwKICAgICAgICAgICAgRGF0YWJhc2VVc2VyID0+ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1BhcmFtc30tPntVc2VyfSwKICAgICAgICAgICAgRGF0YWJhc2VQdyAgID0+ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1BhcmFtc30tPntQYXNzd29yZH0sCiAgICAgICAgICAgICV7ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1BhcmFtc30gfSwKICAgICAgICAgICAgRGlzY29ubmVjdE9uRGVzdHJ1Y3Rpb24gPT4gMSwKICAgICAgICApIHx8IGRpZSgnQ2FuXCd0IGNvbm5lY3QgdG8gZGF0YWJhc2UhJyk7CgogICAgICAgICMgcmVtZW1iZXIgdGhhdCB3ZSBoYXZlIHRoZSBEQk9iamVjdCBub3QgZnJvbSBwYXJlbnQgY2FsbAogICAgICAgICRTZWxmLT57Tm90UGFyZW50REJPYmplY3R9ID0gMTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT57REJPYmplY3R9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkRCJyk7CiAgICB9CgogICAgIyB0aGlzIHNldHRpbmcgc3BlY2lmaWVzIGlmIHRoZSB0YWJsZSBoYXMgdGhlIGNyZWF0ZV90aW1lLAogICAgIyBjcmVhdGVfYnksIGNoYW5nZV90aW1lIGFuZCBjaGFuZ2VfYnkgZmllbGRzIG9mIE9UT0JPCiAgICAkU2VsZi0+e0ZvcmVpZ25EQn0gPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntQYXJhbXN9LT57Rm9yZWlnbkRCfSA/IDEgOiAwOwoKICAgICMgZGVmaW5lcyBpZiB0aGUgZGF0YWJhc2Ugc2VhcmNoIHdpbGwgYmUgcGVyZm9ybWVuZCBjYXNlIHNlbnNpdGl2ZSAoMSkgb3Igbm90ICgwKQogICAgJFNlbGYtPntDYXNlU2Vuc2l0aXZlfSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1BhcmFtc30tPntTZWFyY2hDYXNlU2Vuc2l0aXZlfQogICAgICAgIC8vICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1BhcmFtc30tPntDYXNlU2Vuc2l0aXZlfSB8fCAwOwoKICAgICMgZmV0Y2ggbmFtZXMgb2YgY29uZmlndXJlZCBkeW5hbWljIGZpZWxkcwogICAgbXkgQER5bmFtaWNGaWVsZE1hcEVudHJpZXMgPSBncmVwIHsgJF8tPls1XSBlcSAnZHluYW1pY19maWVsZCcgfSBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntNYXB9IH07CiAgICAkU2VsZi0+e0NvbmZpZ3VyZWREeW5hbWljRmllbGROYW1lc30gPSB7IG1hcCB7ICRfLT5bMl0gPT4gMSB9IEBEeW5hbWljRmllbGRNYXBFbnRyaWVzIH07CgojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgbXkgJExheW91dFBhcmFtID0gJEtlcm5lbDo6T00tPntQYXJhbX0tPnsnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCd9OwogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBDaGVjayBpZiBtdWx0aXRlbmFuY3kgaXMgZW5hYmxlZCBhbmQgdGhlIHJlcXVlc3QgaXMgY29taW5nIGZyb20gYSB1c2VyLgogICAgaWYgKCAkTGF5b3V0UGFyYW0tPntVc2VyVHlwZX0gJiYgJExheW91dFBhcmFtLT57VXNlclR5cGV9IGVxICdVc2VyJyAmJiAkQ29uZmlnT2JqZWN0LT5HZXQoJ011bHRpdGVuYW5jeScpICkgewoKICAgICAgICAjIFNhdmUgdGhlIFVzZXJJRCBhbmQgYWxsIGdyb3VwcyB0aGUgdXNlciBoYXMgJ3JvJyBwZXJtaXNzaW9uIG9uLgogICAgICAgIGlmICggJExheW91dFBhcmFtLT57VXNlcklEfSApIHsKICAgICAgICAgICAgIyBPbmx5IGdldCB0aGUgZ3JvdXAgbGlzdCBvbmNlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zLgogICAgICAgICAgICBteSAlR3JvdXBzID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPlBlcm1pc3Npb25Vc2VyR2V0KAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRMYXlvdXRQYXJhbS0+e1VzZXJJRH0sCiAgICAgICAgICAgICAgICBUeXBlICAgPT4gJ3JvJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICMgVGhlIGxpbWl0IGRvZXMgbm90IGNvdW50IGZvciBtZW1iZXJzIG9mIGEgc3BlY2lmaWMgZ3JvdXAuCiAgICAgICAgICAgIG15ICRQZXJtaXNzaW9uR3JvdXAgPSAkQ29uZmlnT2JqZWN0LT5HZXQoJ011bHRpdGVuYW5jeTo6UGVybWlzc2lvbkdyb3VwJykgfHwgJyc7CiAgICAgICAgICAgIG15ICVHcm91cHNSZXZlcnNlICAgPSByZXZlcnNlICVHcm91cHM7CgogICAgICAgICAgICBpZiAoICEkR3JvdXBzUmV2ZXJzZXskUGVybWlzc2lvbkdyb3VwfSApIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TXVsdGl0ZW5hbmN5fSA9ICRMYXlvdXRQYXJhbS0+e1VzZXJJRH07CiAgICAgICAgICAgICAgICAkU2VsZi0+e1VzZXJHcm91cElEc30gPSBbIHNvcnQga2V5cyAlR3JvdXBzIF07CiAgICAgICAgICAgICAgICAkU2VsZi0+e1VzZXJHcm91cHN9ICAgPSBbIHZhbHVlcyAlR3JvdXBzIF07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBDdXN0b21lck5hbWUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJMb2dpbn0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJMb2dpbiEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgY2FjaGUKICAgIGlmICggJFNlbGYtPntDYWNoZU9iamVjdH0gKSB7CiAgICAgICAgbXkgJE5hbWUgPSAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+R2V0KAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICA9PiAiQ3VzdG9tZXJOYW1lOjokUGFyYW17VXNlckxvZ2lufSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJE5hbWUgaWYgZGVmaW5lZCAkTmFtZTsKICAgIH0KCiAgICBteSAkQ3VzdG9tZXJVc2VyTmFtZUZpZWxkcyA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlck5hbWVGaWVsZHN9OwogICAgaWYgKCAhSXNBcnJheVJlZldpdGhEYXRhKCRDdXN0b21lclVzZXJOYW1lRmllbGRzKSApIHsKICAgICAgICAkQ3VzdG9tZXJVc2VyTmFtZUZpZWxkcyA9IFsgJ2ZpcnN0X25hbWUnLCAnbGFzdF9uYW1lJywgXTsKICAgIH0KCiAgICAjIHJlbW92ZSBkeW5hbWljIGZpZWxkIG5hbWVzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgaW4gQ3VzdG9tZXJVc2VyTmFtZUZpZWxkcwogICAgIyBhcyB0aGV5IGNhbm5vdCBiZSBoYW5kbGVkIGhlcmUKICAgIG15IEBDdXN0b21lclVzZXJOYW1lRmllbGRzV2l0aG91dER5bmFtaWNGaWVsZHMgPSBncmVwIHsgIWV4aXN0cyAkU2VsZi0+e0NvbmZpZ3VyZWREeW5hbWljRmllbGROYW1lc30tPnskX30gfSBAeyRDdXN0b21lclVzZXJOYW1lRmllbGRzfTsKCiAgICAjIGJ1aWxkIFNRTCBzdHJpbmcgMS8yCiAgICBteSAkU1FMID0gIlNFTEVDVCAiOwoKICAgICRTUUwgLj0gam9pbiggIiwgIiwgQEN1c3RvbWVyVXNlck5hbWVGaWVsZHNXaXRob3V0RHluYW1pY0ZpZWxkcyApOwogICAgJFNRTCAuPSAiIEZST00gJFNlbGYtPntDdXN0b21lclRhYmxlfSBXSEVSRSAiOwoKICAgICMgY2hlY2sgQ3VzdG9tZXJLZXkgdHlwZQogICAgbXkgJFVzZXJMb2dpbiA9ICRQYXJhbXtVc2VyTG9naW59OwogICAgaWYgKCAkU2VsZi0+e0Nhc2VTZW5zaXRpdmV9ICkgewogICAgICAgICRTUUwgLj0gIiRTZWxmLT57Q3VzdG9tZXJLZXl9ID0gPyI7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU1FMIC49ICJMT1dFUigkU2VsZi0+e0N1c3RvbWVyS2V5fSkgPSBMT1dFUig/KSI7CiAgICB9CgogICAgbXkgJU5hbWVQYXJ0czsKCiAgICAjIGdldCBkYXRhIGZyb20gY3VzdG9tZXIgdXNlciB0YWJsZQogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgICA9PiAkU1FMLAogICAgICAgIEJpbmQgID0+IFsgXCRQYXJhbXtVc2VyTG9naW59IF0sCiAgICAgICAgTGltaXQgPT4gMSwKICAgICk7CgogICAgbXkgJEZpZWxkQ291bnRlciA9IDA7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIGZvciBteSAkRmllbGQgKEBSb3cpIHsKICAgICAgICAgICAgJE5hbWVQYXJ0c3sgJEN1c3RvbWVyVXNlck5hbWVGaWVsZHNXaXRob3V0RHluYW1pY0ZpZWxkc1skRmllbGRDb3VudGVyXSB9ID0gJEZpZWxkOwogICAgICAgICAgICAkRmllbGRDb3VudGVyKys7CiAgICAgICAgfQogICAgfQoKICAgICMgZmV0Y2ggZHluYW1pYyBmaWVsZCB2YWx1ZXMsIGlmIGNvbmZpZ3VyZWQKICAgIG15IEBEeW5hbWljRmllbGRDdXN0b21lclVzZXJOYW1lRmllbGRzID0gZ3JlcCB7IGV4aXN0cyAkU2VsZi0+e0NvbmZpZ3VyZWREeW5hbWljRmllbGROYW1lc30tPnskX30gfSBAeyRDdXN0b21lclVzZXJOYW1lRmllbGRzfTsKICAgIGlmIChARHluYW1pY0ZpZWxkQ3VzdG9tZXJVc2VyTmFtZUZpZWxkcykgewogICAgICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgICAgICBEWU5BTUlDRklFTEROQU1FOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkTmFtZSAoQER5bmFtaWNGaWVsZEN1c3RvbWVyVXNlck5hbWVGaWVsZHMpIHsKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkR2V0KAogICAgICAgICAgICAgICAgTmFtZSA9PiAkRHluYW1pY0ZpZWxkTmFtZSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEROQU1FIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgICAgIG15ICRWYWx1ZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZUdldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgT2JqZWN0TmFtZSAgICAgICAgID0+ICRQYXJhbXtVc2VyTG9naW59LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEROQU1FIGlmICFkZWZpbmVkICRWYWx1ZTsKCiAgICAgICAgICAgIGlmICggIUlzQXJyYXlSZWZXaXRoRGF0YSgkVmFsdWUpICkgewogICAgICAgICAgICAgICAgJFZhbHVlID0gWyRWYWx1ZV07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15IEBSZW5kZXJlZFZhbHVlczsKCiAgICAgICAgICAgIFZBTFVFOgogICAgICAgICAgICBmb3IgbXkgJEN1cnJlbnRWYWx1ZSAoIEB7JFZhbHVlfSApIHsKICAgICAgICAgICAgICAgIG5leHQgVkFMVUUgaWYgIWRlZmluZWQgJEN1cnJlbnRWYWx1ZSB8fCAhbGVuZ3RoICRDdXJyZW50VmFsdWU7CgogICAgICAgICAgICAgICAgbXkgJFJlbmRlcmVkVmFsdWUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+UmVhZGFibGVWYWx1ZVJlbmRlcigKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJEN1cnJlbnRWYWx1ZSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbmV4dCBWQUxVRSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJFJlbmRlcmVkVmFsdWUpIHx8ICFkZWZpbmVkICRSZW5kZXJlZFZhbHVlLT57VmFsdWV9OwoKICAgICAgICAgICAgICAgIHB1c2ggQFJlbmRlcmVkVmFsdWVzLCAkUmVuZGVyZWRWYWx1ZS0+e1ZhbHVlfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJE5hbWVQYXJ0c3skRHluYW1pY0ZpZWxkTmFtZX0gPSBqb2luICcgJywgQFJlbmRlcmVkVmFsdWVzOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFzc2VtYmxlIG5hbWUKICAgIG15IEBOYW1lUGFydHM7CiAgICBDVVNUT01FUlVTRVJOQU1FRklFTEQ6CiAgICBmb3IgbXkgJEN1c3RvbWVyVXNlck5hbWVGaWVsZCAoIEB7JEN1c3RvbWVyVXNlck5hbWVGaWVsZHN9ICkgewogICAgICAgIG5leHQgQ1VTVE9NRVJVU0VSTkFNRUZJRUxECiAgICAgICAgICAgIGlmICFleGlzdHMgJE5hbWVQYXJ0c3skQ3VzdG9tZXJVc2VyTmFtZUZpZWxkfQogICAgICAgICAgICB8fCAhZGVmaW5lZCAkTmFtZVBhcnRzeyRDdXN0b21lclVzZXJOYW1lRmllbGR9CiAgICAgICAgICAgIHx8ICFsZW5ndGggJE5hbWVQYXJ0c3skQ3VzdG9tZXJVc2VyTmFtZUZpZWxkfTsKICAgICAgICBwdXNoIEBOYW1lUGFydHMsICROYW1lUGFydHN7JEN1c3RvbWVyVXNlck5hbWVGaWVsZH07CiAgICB9CgogICAgbXkgJEpvaW5DaGFyYWN0ZXIgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJOYW1lRmllbGRzSm9pbn0gLy8gJyAnOwogICAgbXkgJE5hbWUgICAgICAgICAgPSBqb2luICRKb2luQ2hhcmFjdGVyLCBATmFtZVBhcnRzOwoKICAgICMgY2FjaGUgcmVxdWVzdAogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgID0+ICJDdXN0b21lck5hbWU6OiRQYXJhbXtVc2VyTG9naW59IiwKICAgICAgICAgICAgVmFsdWUgPT4gJE5hbWUsCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0NhY2hlVFRMfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuICROYW1lOwp9CgpzdWIgQ3VzdG9tZXJTZWFyY2ggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlVXNlcnM7CiAgICBteSAkVmFsaWQgPSAkUGFyYW17VmFsaWR9IC8vIDE7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICgKICAgICAgICAhJFBhcmFte1NlYXJjaH0KICAgICAgICAmJiAhJFBhcmFte1VzZXJMb2dpbn0KICAgICAgICAmJiAhJFBhcmFte1Bvc3RNYXN0ZXJTZWFyY2h9CiAgICAgICAgJiYgISRQYXJhbXtDdXN0b21lcklEfQogICAgICAgICYmICEkUGFyYW17Q3VzdG9tZXJJRFJhd30KICAgICAgICApCiAgICB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFNlYXJjaCwgVXNlckxvZ2luLCBQb3N0TWFzdGVyU2VhcmNoLCBDdXN0b21lcklEUmF3IG9yIEN1c3RvbWVySUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNoZWNrIGNhY2hlCiAgICBteSAkQ2FjaGVLZXkgPSBqb2luICc6OicsIG1hcCB7ICRfIC4gJz0nIC4gJFBhcmFteyRffSB9IHNvcnQga2V5cyAlUGFyYW07CiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAjIFVzZSBjYWNoZSBmb3IgbXVsdGl0ZW5hbmN5LgogICAgaWYgKCAkU2VsZi0+e011bHRpdGVuYW5jeX0gKSB7CiAgICAgICAgJENhY2hlS2V5IC49IGpvaW4gJycsIG1hcCB7ICc6Okdyb3VwSUQ9JyAuICRfIH0gQHsgJFNlbGYtPntVc2VyR3JvdXBJRHN9IH07CiAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKCiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgIG15ICRVc2VycyA9ICRTZWxmLT57Q2FjaGVPYmplY3R9LT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ19DdXN0b21lclNlYXJjaCcsCiAgICAgICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICV7JFVzZXJzfSBpZiByZWYgJFVzZXJzIGVxICdIQVNIJzsKICAgIH0KCiAgICBteSAkQ3VzdG9tZXJVc2VyTGlzdEZpZWxkcyA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlckxpc3RGaWVsZHN9OwogICAgaWYgKCAhSXNBcnJheVJlZldpdGhEYXRhKCRDdXN0b21lclVzZXJMaXN0RmllbGRzKSApIHsKICAgICAgICAkQ3VzdG9tZXJVc2VyTGlzdEZpZWxkcyA9IFsgJ2ZpcnN0X25hbWUnLCAnbGFzdF9uYW1lJywgJ2VtYWlsJywgXTsKICAgIH0KCiAgICAjIHJlbW92ZSBkeW5hbWljIGZpZWxkIG5hbWVzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgaW4gQ3VzdG9tZXJVc2VyTGlzdEZpZWxkcwogICAgIyBhcyB0aGV5IGNhbm5vdCBiZSBoYW5kbGVkIGhlcmUKICAgIG15IEBDdXN0b21lclVzZXJMaXN0RmllbGRzV2l0aG91dER5bmFtaWNGaWVsZHMgPSBncmVwIHsgIWV4aXN0cyAkU2VsZi0+e0NvbmZpZ3VyZWREeW5hbWljRmllbGROYW1lc30tPnskX30gfSBAeyRDdXN0b21lclVzZXJMaXN0RmllbGRzfTsKCiAgICAjIGJ1aWxkIFNRTCBzdHJpbmcgMS8yCiAgICBteSAkU1FMID0gIlNFTEVDVCAkU2VsZi0+e0N1c3RvbWVyS2V5fSAiOwogICAgbXkgQEJpbmQ7CiAgICAkU1FMIC49ICcsICcgLiAoIGpvaW4gJywgJywgQEN1c3RvbWVyVXNlckxpc3RGaWVsZHNXaXRob3V0RHluYW1pY0ZpZWxkcyApOwoKICAgICMgZ2V0IGxpa2UgZXNjYXBlIHN0cmluZyBuZWVkZWQgZm9yIHNvbWUgZGF0YWJhc2VzIChlLmcuIG9yYWNsZSkKICAgIG15ICRMaWtlRXNjYXBlU3RyaW5nID0gJFNlbGYtPntEQk9iamVjdH0tPkdldERhdGFiYXNlRnVuY3Rpb24oJ0xpa2VFc2NhcGVTdHJpbmcnKTsKCiAgICAjIGJ1aWxkIFNRTCBzdHJpbmcgMi8yCiAgICAkU1FMIC49ICIgRlJPTSAkU2VsZi0+e0N1c3RvbWVyVGFibGV9IFdIRVJFICI7CiAgICBpZiAoICRQYXJhbXtTZWFyY2h9ICkgewogICAgICAgIGlmICggISRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlclNlYXJjaEZpZWxkc30gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+CiAgICAgICAgICAgICAgICAgICAgIk5lZWQgQ3VzdG9tZXJVc2VyU2VhcmNoRmllbGRzIGluIEN1c3RvbWVyVXNlciBjb25maWcsIHVuYWJsZSB0byBzZWFyY2ggZm9yICckUGFyYW17U2VhcmNofSchIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgbXkgJFNlYXJjaCA9ICRTZWxmLT57REJPYmplY3R9LT5RdWVyeVN0cmluZ0VzY2FwZSggUXVlcnlTdHJpbmcgPT4gJFBhcmFte1NlYXJjaH0gKTsKCiAgICAgICAgIyByZW1vdmUgZHluYW1pYyBmaWVsZCBuYW1lcyB0aGF0IGFyZSBjb25maWd1cmVkIGluIEN1c3RvbWVyVXNlclNlYXJjaEZpZWxkcwogICAgICAgICMgYXMgdGhleSBjYW5ub3QgYmUgcmV0cmlldmVkIGhlcmUKICAgICAgICBteSBAQ3VzdG9tZXJVc2VyU2VhcmNoRmllbGRzID0gZ3JlcCB7ICFleGlzdHMgJFNlbGYtPntDb25maWd1cmVkRHluYW1pY0ZpZWxkTmFtZXN9LT57JF99IH0KICAgICAgICAgICAgQHsgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJVc2VyU2VhcmNoRmllbGRzfSB9OwoKICAgICAgICBpZiAoICRQYXJhbXtDdXN0b21lclVzZXJPbmx5fSApIHsKICAgICAgICAgICAgQEN1c3RvbWVyVXNlclNlYXJjaEZpZWxkcyA9IGdyZXAgeyAkXyBuZSAnY3VzdG9tZXJfaWQnIH0gQEN1c3RvbWVyVXNlclNlYXJjaEZpZWxkczsKICAgICAgICB9CgogICAgICAgIG15ICVRdWVyeUNvbmRpdGlvbiA9ICRTZWxmLT57REJPYmplY3R9LT5RdWVyeUNvbmRpdGlvbigKICAgICAgICAgICAgS2V5ICAgICAgICAgICA9PiBcQEN1c3RvbWVyVXNlclNlYXJjaEZpZWxkcywgICAgIyRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlclNlYXJjaEZpZWxkc30sCiAgICAgICAgICAgIFZhbHVlICAgICAgICAgPT4gJFNlYXJjaCwKICAgICAgICAgICAgU2VhcmNoUHJlZml4ICA9PiAkU2VsZi0+e1NlYXJjaFByZWZpeH0sCiAgICAgICAgICAgIFNlYXJjaFN1ZmZpeCAgPT4gJFNlbGYtPntTZWFyY2hTdWZmaXh9LAogICAgICAgICAgICBDYXNlU2Vuc2l0aXZlID0+ICRTZWxmLT57Q2FzZVNlbnNpdGl2ZX0sCiAgICAgICAgICAgIEJpbmRNb2RlICAgICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICAkU1FMIC49ICRRdWVyeUNvbmRpdGlvbntTUUx9OwogICAgICAgIHB1c2ggQEJpbmQsIEB7ICRRdWVyeUNvbmRpdGlvbntWYWx1ZXN9IH07CgojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgICAgICMgRG9uJ3Qgc2VhcmNoIGZvciBjdXN0b21lciB1c2VycyB3aXRob3V0IGdyb3VwIHBlcm1pc3Npb24uCiAgICAgICAgaWYgKCAkU2VsZi0+e011bHRpdGVuYW5jeX0gKSB7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJDb21wYW55U3VwcG9ydH0gKSB7CiAgICAgICAgICAgICAgICAjIFRPRE86IFdvcmthcm91bmQgdW50aWwgdGhlIHNlYXJjaCBnZXRzIGNoYW5nZWQuCiAgICAgICAgICAgICAgICAkUGFyYW17TGltaXR9ID0gMTAwMDAwOwogICAgICAgICAgICAgICAgIyBOb3JtYWxseSwgd2Ugc2hvdWxkIGlubmVyIGpvaW4gYWxsIGN1c3RvbWVyIGNvbXBhbmllcyB0byBzZWUgaWYgdGhlIGFnZW50IGhhcyBwZXJtaXNzaW9uIHRvIHNlZSB0aGUgY3VzdG9tZXIgKGN1cnJlbnRseSB3b3JraW5nKSBvciB0aGUgY3VzdG9tZXIgY29tcGFueSAoaXRlcmF0ZSB0aHJvdWdoIGFsbCBEQiBiYWNrLWVuZHMpLgogICAgICAgICAgICAgICAgIyBJZiB0aGUgYWdlbnQgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIG9uIHRoZSBjdXN0b21lciBjb21wYW55IGJ1dCB0aGUgY3VzdG9tZXIgdXNlciwgdGhlIHF1ZXJ5IHNob3VsZG4ndCByZXR1cm4gdGhlIGN1c3RvbWVyIHVzZXIuCiAgICAgICAgICAgICAgICAjIEN1cnJlbnRseSwgd2UgYXJlIGxvb2tpbmcgZm9yIGV2ZXJ5dGhpbmcgYW5kIGZpbHRlcmluZyB0aGUgcmVzdWx0LCB3aGljaCBpcyBub3Qgb3B0aW1hbC4gVGhlIHJlYWwgbGltaXQgc2hvdWxkIHN0aWxsIGJlIGFwcGxpZWQgaW4gdGhlIFN5c3RlbS9DdXN0b21lclVzZXIucG0uCiAgICAgICAgICAgICAgICAjIFRoZSBzYW1lIGFwcGxpZXMgZm9yIHRoZSBDdXN0b21lclVzZXIvTERBUC5wbQogICAgICAgICAgICAgICAgIyBTRUxFQ1QgKiBGUk9NIGN1c3RvbWVyX3VzZXIgY3UKICAgICAgICAgICAgICAgICMgSk9JTiBjdXN0b21lcl9jb21wYW55IGNwIE9OIGN1LmN1c3RvbWVyX2lkID0gY3AuY3VzdG9tZXJfaWQKICAgICAgICAgICAgICAgICMgV0hFUkUgKChjcC5ncm91cF9pZCBJTiAoMSkgT1IgY3AuZ3JvdXBfaWQgSVMgTlVMTCBPUiBjcC5ncm91cF9pZCA9ICcnKQogICAgICAgICAgICAgICAgIyAgICAgQU5EIChjdS5ncm91cF9pZCBJUyBOVUxMIE9SIGN1Lmdyb3VwX2lkID0gJycpKQogICAgICAgICAgICAgICAgIyBPUiAoY3UuZ3JvdXBfaWQgSU4gKDEpKQogICAgICAgICAgICAgICAgIyBVTklPTgogICAgICAgICAgICAgICAgIyBTRUxFQ1QgKiBGUk9NIGN1c3RvbWVyX3VzZXIgY3UKICAgICAgICAgICAgICAgICMgSk9JTiBjdXN0b21lcl9jb21wYW55XzIgY3AgT04gY3UuY3VzdG9tZXJfaWQgPSBjcC5jdXN0b21lcl9pZAogICAgICAgICAgICAgICAgIyBXSEVSRSAoKGNwLmdyb3VwX2lkIElOICgxKSBPUiBjcC5ncm91cF9pZCBJUyBOVUxMIE9SIGNwLmdyb3VwX2lkID0gJycpCiAgICAgICAgICAgICAgICAjICAgICBBTkQgKGN1Lmdyb3VwX2lkIElTIE5VTEwgT1IgY3UuZ3JvdXBfaWQgPSAnJykpCiAgICAgICAgICAgICAgICAjIE9SIChjdS5ncm91cF9pZCBJTiAoMSkpCiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgR2V0IHRoZSBjb2x1bW4gbmFtZSB3aGVyZSB0aGUgZ3JvdXAgSUQgaXMgc3RvcmVkLgogICAgICAgICAgICBteSAkR3JvdXBJRENvbDsKICAgICAgICAgICAgZm9yIG15ICRNYXAgKCBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntNYXB9IH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRNYXAtPlswXSBlcSAnVXNlckdyb3VwSUQnICkgewogICAgICAgICAgICAgICAgICAgICRHcm91cElEQ29sID0gJE1hcC0+WzJdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIFRoZSBzb3VyY2Ugc3VwcG9ydHMgbXVsdGl0ZW5hbmN5LgogICAgICAgICAgICBpZiAoJEdyb3VwSURDb2wpIHsKICAgICAgICAgICAgICAgIG15ICRVc2VyR3JvdXBJRFN5bmMgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntVc2VyR3JvdXBJRFN5bmN9OwogICAgICAgICAgICAgICAgIyBDaGVjayBpZiB3ZSBtYXRjaCBmb3IgZ3JvdXAgSURzIG9yIGdyb3VwIG5hbWVzLgogICAgICAgICAgICAgICAgbXkgQFVzZXJHcm91cHMgPSAkVXNlckdyb3VwSURTeW5jLT57VXNlR3JvdXBOYW1lc30gPyBAeyAkU2VsZi0+e1VzZXJHcm91cHN9IH0gOiBAeyAkU2VsZi0+e1VzZXJHcm91cElEc30gfTsKCiAgICAgICAgICAgICAgICAjIFJlbWFwIGxvY2FsIGdyb3VwcyB0byByZW1vdGUgZ3JvdXBzLgogICAgICAgICAgICAgICAgZm9yIG15ICRSZW1vdGVHcm91cCAoIGtleXMgJXsgJFVzZXJHcm91cElEU3luYy0+e1JlbW90ZUdyb3VwVG9Mb2NhbEdyb3VwfSB9ICkgewogICAgICAgICAgICAgICAgICAgIG15ICRMb2NhbEdyb3VwID0gJFVzZXJHcm91cElEU3luYy0+e1JlbW90ZUdyb3VwVG9Mb2NhbEdyb3VwfXskUmVtb3RlR3JvdXB9OwoKICAgICAgICAgICAgICAgICAgICBAVXNlckdyb3VwcyA9IG1hcCB7ICRfIGVxICRMb2NhbEdyb3VwID8gJFJlbW90ZUdyb3VwIDogJF8gfSBAVXNlckdyb3VwczsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSAkSW5Db25kaXRpb24gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVlcnlJbkNvbmRpdGlvbigKICAgICAgICAgICAgICAgICAgICBLZXkgICAgICA9PiAkR3JvdXBJRENvbCwKICAgICAgICAgICAgICAgICAgICBWYWx1ZXMgICA9PiBcQFVzZXJHcm91cHMsCiAgICAgICAgICAgICAgICAgICAgQmluZE1vZGUgPT4gMCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgIyBJZiB0aGUgZmllbGQgaXMgZW1wdHksIHdlIGhhdmUgYWNjZXNzIGJ5IGRlZmF1bHQuCiAgICAgICAgICAgICAgICAkSW5Db25kaXRpb24gLj0gIiBPUiAoJEdyb3VwSURDb2wgSVMgTlVMTCBPUiAkR3JvdXBJRENvbCA9ICcnKSI7CiAgICAgICAgICAgICAgICAkU1FMIC49ICIgQU5EICgkSW5Db25kaXRpb24pIjsKICAgICAgICAgICAgfQogICAgICAgIH0KIyBFTyBDdXN0b21lck11bHRpdGVuYW5jeQoKICAgICAgICAkU1FMIC49ICcgJzsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte1Bvc3RNYXN0ZXJTZWFyY2h9ICkgewogICAgICAgIGlmICggJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJVc2VyUG9zdE1hc3RlclNlYXJjaEZpZWxkc30gKSB7CgogICAgICAgICAgICAjIHJlbW92ZSBkeW5hbWljIGZpZWxkIG5hbWVzIHRoYXQgYXJlIGNvbmZpZ3VyZWQgaW4gQ3VzdG9tZXJVc2VyUG9zdE1hc3RlclNlYXJjaEZpZWxkcwogICAgICAgICAgICAjIGFzIHRoZXkgY2Fubm90IGJlIHJldHJpZXZlZCBoZXJlCiAgICAgICAgICAgIG15IEBDdXN0b21lclVzZXJQb3N0TWFzdGVyU2VhcmNoRmllbGRzID0gZ3JlcCB7ICFleGlzdHMgJFNlbGYtPntDb25maWd1cmVkRHluYW1pY0ZpZWxkTmFtZXN9LT57JF99IH0KICAgICAgICAgICAgICAgIEB7ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlclBvc3RNYXN0ZXJTZWFyY2hGaWVsZHN9IH07CgogICAgICAgICAgICBteSAkU1FMRXh0ID0gJyc7CgogICAgICAgICAgICAjIGZvciBteSAkRmllbGQgKCBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJQb3N0TWFzdGVyU2VhcmNoRmllbGRzfSB9ICkgewogICAgICAgICAgICBmb3IgbXkgJEZpZWxkIChAQ3VzdG9tZXJVc2VyUG9zdE1hc3RlclNlYXJjaEZpZWxkcykgewogICAgICAgICAgICAgICAgaWYgKCRTUUxFeHQpIHsKICAgICAgICAgICAgICAgICAgICAkU1FMRXh0IC49ICcgT1IgJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG15ICRQb3N0TWFzdGVyU2VhcmNoID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17UG9zdE1hc3RlclNlYXJjaH0gKTsKICAgICAgICAgICAgICAgIHB1c2ggQEJpbmQsIFwkUG9zdE1hc3RlclNlYXJjaDsKCiAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57Q2FzZVNlbnNpdGl2ZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFNRTEV4dCAuPSAiICRGaWVsZCA9ID8gIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRTUUxFeHQgLj0gIiBMT1dFUigkRmllbGQpID0gTE9XRVIoPykgIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAkU1FMIC49ICRTUUxFeHQ7CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCAkUGFyYW17VXNlckxvZ2lufSApIHsKCiAgICAgICAgbXkgJFVzZXJMb2dpbiA9ICRQYXJhbXtVc2VyTG9naW59OwoKICAgICAgICAjIGNoZWNrIEN1c3RvbWVyS2V5IHR5cGUKICAgICAgICBpZiAoICRTZWxmLT57Q3VzdG9tZXJLZXlJbnRlZ2VyfSApIHsKCiAgICAgICAgICAgICMgcmV0dXJuIGlmIGxvZ2luIGlzIG5vIGludGVnZXIKICAgICAgICAgICAgcmV0dXJuIGlmICRQYXJhbXtVc2VyTG9naW59ICF+IC9eKFwrfFwtfClcZHsxLDE2fSQvOwoKICAgICAgICAgICAgJFNRTCAuPSAiJFNlbGYtPntDdXN0b21lcktleX0gPSA/IjsKICAgICAgICAgICAgcHVzaCBAQmluZCwgXCRVc2VyTG9naW47CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkVXNlckxvZ2luID0gJyUnIC4gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkVXNlckxvZ2luLCAnTGlrZScgKSAuICclJzsKICAgICAgICAgICAgJFVzZXJMb2dpbiA9fiBzL1wqLyUvZzsKICAgICAgICAgICAgcHVzaCBAQmluZCwgXCRVc2VyTG9naW47CiAgICAgICAgICAgIGlmICggJFNlbGYtPntDYXNlU2Vuc2l0aXZlfSApIHsKICAgICAgICAgICAgICAgICRTUUwgLj0gIiRTZWxmLT57Q3VzdG9tZXJLZXl9IExJS0UgPyAkTGlrZUVzY2FwZVN0cmluZyI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU1FMIC49ICJMT1dFUigkU2VsZi0+e0N1c3RvbWVyS2V5fSkgTElLRSBMT1dFUig/KSAkTGlrZUVzY2FwZVN0cmluZyI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtDdXN0b21lcklEfSApIHsKCiAgICAgICAgbXkgJEN1c3RvbWVySUQgPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXtDdXN0b21lcklEfSwgJ0xpa2UnICk7CiAgICAgICAgJEN1c3RvbWVySUQgPX4gcy9cKi8lL2c7CiAgICAgICAgcHVzaCBAQmluZCwgXCRDdXN0b21lcklEOwoKICAgICAgICBpZiAoICRTZWxmLT57Q2FzZVNlbnNpdGl2ZX0gKSB7CiAgICAgICAgICAgICRTUUwgLj0gIiRTZWxmLT57Q3VzdG9tZXJJRH0gTElLRSA/ICRMaWtlRXNjYXBlU3RyaW5nIjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTUUwgLj0gIkxPV0VSKCRTZWxmLT57Q3VzdG9tZXJJRH0pIExJS0UgTE9XRVIoPykgJExpa2VFc2NhcGVTdHJpbmciOwogICAgICAgIH0KICAgIH0KICAgIGVsc2lmICggJFBhcmFte0N1c3RvbWVySURSYXd9ICkgewoKICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte0N1c3RvbWVySURSYXd9OwoKICAgICAgICBpZiAoICRTZWxmLT57Q2FzZVNlbnNpdGl2ZX0gKSB7CiAgICAgICAgICAgICRTUUwgLj0gIiRTZWxmLT57Q3VzdG9tZXJJRH0gPSA/ICI7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU1FMIC49ICJMT1dFUigkU2VsZi0+e0N1c3RvbWVySUR9KSA9IExPV0VSKD8pICI7CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkIHZhbGlkIG9wdGlvbgogICAgaWYgKCAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclZhbGlkfSAmJiAkVmFsaWQgKSB7CgogICAgICAgICMgZ2V0IHZhbGlkIG9iamVjdAogICAgICAgIG15ICRWYWxpZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpOwoKICAgICAgICAkU1FMIC49ICcgQU5EICcKICAgICAgICAgICAgLiAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclZhbGlkfQogICAgICAgICAgICAuICcgSU4gKCcgLiBqb2luKCAnLCAnLCAkVmFsaWRPYmplY3QtPlZhbGlkSURzR2V0KCkgKSAuICcpICc7CiAgICB9CgogICAgIyBkeW5hbWljIGZpZWxkIGhhbmRsaW5nCiAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlncyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBPYmplY3RUeXBlID0+ICdDdXN0b21lclVzZXInLAogICAgICAgIFZhbGlkICAgICAgPT4gMSwKICAgICk7CiAgICBteSAlRHluYW1pY0ZpZWxkQ29uZmlnc0J5TmFtZSA9IG1hcCB7ICRfLT57TmFtZX0gPT4gJF8gfSBAeyREeW5hbWljRmllbGRDb25maWdzfTsKCiAgICBteSBAQ3VzdG9tZXJVc2VyTGlzdEZpZWxkc0R5bmFtaWNGaWVsZHMgPSBncmVwIHsgZXhpc3RzICRTZWxmLT57Q29uZmlndXJlZER5bmFtaWNGaWVsZE5hbWVzfS0+eyRffSB9IEB7JEN1c3RvbWVyVXNlckxpc3RGaWVsZHN9OwoKICAgICMgZ2V0IGRhdGEgZnJvbSBjdXN0b21lciB1c2VyIHRhYmxlCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICRTUUwsCiAgICAgICAgQmluZCAgPT4gXEBCaW5kLAogICAgICAgIExpbWl0ID0+ICRQYXJhbXtMaW1pdH0gfHwgJFNlbGYtPntVc2VyU2VhcmNoTGlzdExpbWl0fSwKICAgICk7CgogICAgbXkgQEN1c3RvbWVyVXNlckRhdGE7CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQEN1c3RvbWVyVXNlckRhdGEsIFtAUm93XTsKICAgIH0KCiAgICBDVVNUT01FUlVTRVJEQVRBOgogICAgZm9yIG15ICRDdXN0b21lclVzZXJEYXRhIChAQ3VzdG9tZXJVc2VyRGF0YSkgewogICAgICAgIG15ICRDdXN0b21lcktleSA9IHNoaWZ0IEB7JEN1c3RvbWVyVXNlckRhdGF9OwogICAgICAgIG5leHQgQ1VTVE9NRVJVU0VSREFUQSBpZiAkVXNlcnN7JEN1c3RvbWVyS2V5fTsKCiAgICAgICAgbXkgJVVzZXJTdHJpbmdQYXJ0czsKCiAgICAgICAgbXkgJEZpZWxkQ291bnRlciA9IDA7CiAgICAgICAgZm9yIG15ICRGaWVsZCAoIEB7JEN1c3RvbWVyVXNlckRhdGF9ICkgewogICAgICAgICAgICAkVXNlclN0cmluZ1BhcnRzeyAkQ3VzdG9tZXJVc2VyTGlzdEZpZWxkc1dpdGhvdXREeW5hbWljRmllbGRzWyRGaWVsZENvdW50ZXJdIH0gPSAkRmllbGQ7CiAgICAgICAgICAgICRGaWVsZENvdW50ZXIrKzsKICAgICAgICB9CgogICAgICAgICMgZmV0Y2ggZHluYW1pYyBmaWVsZCB2YWx1ZXMsIGlmIGNvbmZpZ3VyZWQKICAgICAgICBpZiAoQEN1c3RvbWVyVXNlckxpc3RGaWVsZHNEeW5hbWljRmllbGRzKSB7CiAgICAgICAgICAgIERZTkFNSUNGSUVMRE5BTUU6CiAgICAgICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkTmFtZSAoQEN1c3RvbWVyVXNlckxpc3RGaWVsZHNEeW5hbWljRmllbGRzKSB7CiAgICAgICAgICAgICAgICBuZXh0IERZTkFNSUNGSUVMRE5BTUUgaWYgIWV4aXN0cyAkRHluYW1pY0ZpZWxkQ29uZmlnc0J5TmFtZXskRHluYW1pY0ZpZWxkTmFtZX07CgogICAgICAgICAgICAgICAgbXkgJFZhbHVlID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlR2V0KAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnc0J5TmFtZXskRHluYW1pY0ZpZWxkTmFtZX0sCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSAgICAgICAgID0+ICRDdXN0b21lcktleSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEROQU1FIGlmICFkZWZpbmVkICRWYWx1ZTsKCiAgICAgICAgICAgICAgICBpZiAoICFJc0FycmF5UmVmV2l0aERhdGEoJFZhbHVlKSApIHsKICAgICAgICAgICAgICAgICAgICAkVmFsdWUgPSBbJFZhbHVlXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBteSBAVmFsdWVzOwoKICAgICAgICAgICAgICAgIFZBTFVFOgogICAgICAgICAgICAgICAgZm9yIG15ICRDdXJyZW50VmFsdWUgKCBAeyRWYWx1ZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dCBWQUxVRSBpZiAhZGVmaW5lZCAkQ3VycmVudFZhbHVlIHx8ICFsZW5ndGggJEN1cnJlbnRWYWx1ZTsKCiAgICAgICAgICAgICAgICAgICAgbXkgJFJlYWRhYmxlVmFsdWUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+UmVhZGFibGVWYWx1ZVJlbmRlcigKICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWdzQnlOYW1leyREeW5hbWljRmllbGROYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRDdXJyZW50VmFsdWUsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgbmV4dCBWQUxVRSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJFJlYWRhYmxlVmFsdWUpIHx8ICFkZWZpbmVkICRSZWFkYWJsZVZhbHVlLT57VmFsdWV9OwoKICAgICAgICAgICAgICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnc0J5TmFtZXskRHluYW1pY0ZpZWxkTmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgIEJlaGF2aW9yICAgICAgICAgICA9PiAnSXNBQ0xSZWR1Y2libGUnLAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCRJc0FDTFJlZHVjaWJsZSkgewogICAgICAgICAgICAgICAgICAgICAgICBteSAkUG9zc2libGVWYWx1ZXMgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+UG9zc2libGVWYWx1ZXNHZXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZ3NCeU5hbWV7JER5bmFtaWNGaWVsZE5hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNIYXNoUmVmV2l0aERhdGEoJFBvc3NpYmxlVmFsdWVzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgZGVmaW5lZCAkUG9zc2libGVWYWx1ZXMtPnsgJFJlYWRhYmxlVmFsdWUtPntWYWx1ZX0gfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUmVhZGFibGVWYWx1ZS0+e1ZhbHVlfSA9ICRQb3NzaWJsZVZhbHVlcy0+eyAkUmVhZGFibGVWYWx1ZS0+e1ZhbHVlfSB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICBwdXNoIEBWYWx1ZXMsICRSZWFkYWJsZVZhbHVlLT57VmFsdWV9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICRVc2VyU3RyaW5nUGFydHN7JER5bmFtaWNGaWVsZE5hbWV9ID0gam9pbiAnICcsIEBWYWx1ZXM7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYXNzZW1ibGUgdXNlciBzdHJpbmcKICAgICAgICBteSBAVXNlclN0cmluZ1BhcnRzOwogICAgICAgIENVU1RPTUVSVVNFUkxJU1RGSUVMRDoKICAgICAgICBmb3IgbXkgJEN1c3RvbWVyVXNlckxpc3RGaWVsZCAoIEB7JEN1c3RvbWVyVXNlckxpc3RGaWVsZHN9ICkgewogICAgICAgICAgICBuZXh0IENVU1RPTUVSVVNFUkxJU1RGSUVMRAogICAgICAgICAgICAgICAgaWYgIWV4aXN0cyAkVXNlclN0cmluZ1BhcnRzeyRDdXN0b21lclVzZXJMaXN0RmllbGR9CiAgICAgICAgICAgICAgICB8fCAhZGVmaW5lZCAkVXNlclN0cmluZ1BhcnRzeyRDdXN0b21lclVzZXJMaXN0RmllbGR9CiAgICAgICAgICAgICAgICB8fCAhbGVuZ3RoICRVc2VyU3RyaW5nUGFydHN7JEN1c3RvbWVyVXNlckxpc3RGaWVsZH07CiAgICAgICAgICAgIHB1c2ggQFVzZXJTdHJpbmdQYXJ0cywgJFVzZXJTdHJpbmdQYXJ0c3skQ3VzdG9tZXJVc2VyTGlzdEZpZWxkfTsKICAgICAgICB9CgogICAgICAgICRVc2Vyc3skQ3VzdG9tZXJLZXl9ID0gam9pbiAnICcsIEBVc2VyU3RyaW5nUGFydHM7CiAgICAgICAgJFVzZXJzeyRDdXN0b21lcktleX0gPX4gcy9eKC4qKVxzKC4rP1xALis/XC4uKz8pKFxzfCkkLyIkMSIgPCQyPi87CiAgICB9CgogICAgIyBjYWNoZSByZXF1ZXN0CiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdfQ3VzdG9tZXJTZWFyY2gnLAogICAgICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgICAgIFZhbHVlID0+IFwlVXNlcnMsCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0NhY2hlVFRMfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuICVVc2VyczsKfQoKc3ViIEN1c3RvbWVyU2VhcmNoRGV0YWlsIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCByZWYgJFBhcmFte1NlYXJjaEZpZWxkc30gbmUgJ0FSUkFZJyApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlNlYXJjaEZpZWxkcyBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgUmV0dXJuIG9ubHkgdmFsaWQgdXNlcnMgcGVyIGRlZmF1bHQKICAgIG15ICRWYWxpZCA9ICRQYXJhbXtWYWxpZH0gLy8gMTsKCiAgICAkUGFyYW17TGltaXR9IC8vPSAnJzsKCiAgICAjIFNwbGl0IHRoZSBzZWFyY2ggZmllbGRzIGluIHNjYWxhciBhbmQgYXJyYXkgZmllbGRzLCBiZWZvcmUgdGhlIGRpZmZyZW50IGhhbmRsaW5nLgogICAgbXkgQFNjYWxhclNlYXJjaEZpZWxkcyA9IGdyZXAgeyAnSW5wdXQnIGVxICRfLT57VHlwZX0gfSBAeyAkUGFyYW17U2VhcmNoRmllbGRzfSB9OwogICAgbXkgQEFycmF5U2VhcmNoRmllbGRzICA9IGdyZXAgeyAnU2VsZWN0aW9uJyBlcSAkXy0+e1R5cGV9IH0gQHsgJFBhcmFte1NlYXJjaEZpZWxkc30gfTsKCiAgICAjIFZlcmlmeSB0aGF0IGFsbCBwYXNzZWQgYXJyYXkgcGFyYW1ldGVycyBjb250YWluIGFuIGFycmF5cmVmLgogICAgQVJHVU1FTlQ6CiAgICBmb3IgbXkgJEFyZ3VtZW50IChAQXJyYXlTZWFyY2hGaWVsZHMpIHsKICAgICAgICBpZiAoICFkZWZpbmVkICRQYXJhbXsgJEFyZ3VtZW50LT57TmFtZX0gfSApIHsKICAgICAgICAgICAgJFBhcmFteyAkQXJndW1lbnQtPntOYW1lfSB9IHx8PSBbXTsKCiAgICAgICAgICAgIG5leHQgQVJHVU1FTlQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoIHJlZiAkUGFyYW17ICRBcmd1bWVudC0+e05hbWV9IH0gbmUgJ0FSUkFZJyApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRBcmd1bWVudC0+e05hbWV9IG11c3QgYmUgYW4gYXJyYXkgcmVmZXJlbmNlISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBTZXQgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIGZvciB0aGUgcmV0dXJuIHR5cGUuCiAgICBteSAkUmVzdWx0ID0gJFBhcmFte1Jlc3VsdH0gfHwgJ0FSUkFZJzsKCiAgICAjIFNwZWNpYWwgaGFuZGxpbmcgaWYgdGhlIHJlc3VsdCB0eXBlIGlzICdDT1VOVCcuCiAgICBpZiAoICRSZXN1bHQgZXEgJ0NPVU5UJyApIHsKCiAgICAgICAgIyBJZ25vcmUgdGhlIHBhcmFtZXRlciAnTGltaXQnIHdoZW4gcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJy4KICAgICAgICAkUGFyYW17TGltaXR9ID0gJyc7CgogICAgICAgICMgRGVsZXRlIHRoZSBPcmRlckJ5IHBhcmFtZXRlciB3aGVuIHRoZSByZXN1bHQgdHlwZSBpcyAnQ09VTlQnLgogICAgICAgICRQYXJhbXtPcmRlckJ5fSA9IFtdOwogICAgfQoKICAgICMgRGVmaW5lIG9yZGVyIHRhYmxlIGZyb20gdGhlIHNlYXJjaCBmaWVsZHMuCiAgICBteSAlT3JkZXJCeVRhYmxlID0gbWFwIHsgJF8tPntOYW1lfSA9PiAkXy0+e0RhdGFiYXNlRmllbGR9IH0gQHsgJFBhcmFte1NlYXJjaEZpZWxkc30gfTsKCiAgICBmb3IgbXkgJEZpZWxkIChAQXJyYXlTZWFyY2hGaWVsZHMpIHsKCiAgICAgICAgbXkgJFNlbGVjdGlvbnNEYXRhID0gJEZpZWxkLT57U2VsZWN0aW9uc0RhdGF9OwoKICAgICAgICBmb3IgbXkgJFNlbGVjdGVkVmFsdWUgKCBAeyAkUGFyYW17ICRGaWVsZC0+e05hbWV9IH0gfSApIHsKCiAgICAgICAgICAgICMgQ2hlY2sgaWYgdGhlIHNlbGVjdGVkIHZhbHVlIGZvciB0aGUgY3VycmVudCBmaWVsZCBpcyB2YWxpZC4KICAgICAgICAgICAgaWYgKCAhJFNlbGVjdGlvbnNEYXRhLT57JFNlbGVjdGVkVmFsdWV9ICkgewogICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiVGhlIHNlbGVjdGVkIHZhbHVlICRGaWVsZC0+e05hbWV9IGlzIG5vdCB2YWxpZCEiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBteSAkREJPYmplY3QgPSAkU2VsZi0+e0RCT2JqZWN0fTsKCiAgICAjIEFzc2VtYmxlIHRoZSBjb25kaXRpb25zIHVzZWQgaW4gdGhlIFdIRVJFIGNsYXVzZS4KICAgIG15IEBTUUxXaGVyZTsKCiAgICBmb3IgbXkgJEZpZWxkIChAU2NhbGFyU2VhcmNoRmllbGRzKSB7CgogICAgICAgICMgU2VhcmNoIGZvciBzY2FsYXIgZmllbGRzICh3aWxkY2FyZHMgYXJlIGFsbG93ZWQpLgogICAgICAgIGlmICggJFBhcmFteyAkRmllbGQtPntOYW1lfSB9ICkgewoKICAgICAgICAgICAgIyBHZXQgbGlrZSBlc2NhcGUgc3RyaW5nIG5lZWRlZCBmb3Igc29tZSBkYXRhYmFzZXMgKGUuZy4gb3JhY2xlKS4KICAgICAgICAgICAgbXkgJExpa2VFc2NhcGVTdHJpbmcgPSAkREJPYmplY3QtPkdldERhdGFiYXNlRnVuY3Rpb24oJ0xpa2VFc2NhcGVTdHJpbmcnKTsKCiAgICAgICAgICAgICRQYXJhbXsgJEZpZWxkLT57TmFtZX0gfSA9ICREQk9iamVjdC0+UXVvdGUoICRQYXJhbXsgJEZpZWxkLT57TmFtZX0gfSwgJ0xpa2UnICk7CgogICAgICAgICAgICAkUGFyYW17ICRGaWVsZC0+e05hbWV9IH0gPX4gc3sgXCorIH17JX14bXNnOwoKICAgICAgICAgICAgIyBJZiB0aGUgZmllbGQgY29udGFpbnMgbW9yZSB0aGFuIG9ubHkgJS4KICAgICAgICAgICAgaWYgKCAkUGFyYW17ICRGaWVsZC0+e05hbWV9IH0gIX4gbXsgXEEgJSogXHogfXhtcyApIHsKICAgICAgICAgICAgICAgIHB1c2ggQFNRTFdoZXJlLAogICAgICAgICAgICAgICAgICAgICJMT1dFUigkRmllbGQtPntEYXRhYmFzZUZpZWxkfSkgTElLRSBMT1dFUignJFBhcmFteyAkRmllbGQtPntOYW1lfSB9JykgJExpa2VFc2NhcGVTdHJpbmciOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIG15ICREeW5hbWljRmllbGRPYmplY3QgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcpOwogICAgbXkgJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJyk7CgogICAgIyBDaGVjayBhbGwgY29uZmlndXJlZCBjaGFuZ2UgZHluYW1pYyBmaWVsZHMsIGJ1aWxkIGxvb2t1cCBoYXNoIGJ5IG5hbWUuCiAgICBteSAlQ3VzdG9tZXJVc2VyRHluYW1pY0ZpZWxkTmFtZTJDb25maWc7CiAgICBteSAkQ3VzdG9tZXJVc2VyRHluYW1pY0ZpZWxkcyA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgT2JqZWN0VHlwZSA9PiAnQ3VzdG9tZXJVc2VyJywKICAgICk7CiAgICBmb3IgbXkgJER5bmFtaWNGaWVsZCAoIEB7JEN1c3RvbWVyVXNlckR5bmFtaWNGaWVsZHN9ICkgewogICAgICAgICRDdXN0b21lclVzZXJEeW5hbWljRmllbGROYW1lMkNvbmZpZ3sgJER5bmFtaWNGaWVsZC0+e05hbWV9IH0gPSAkRHluYW1pY0ZpZWxkOwogICAgfQoKICAgIG15ICRTUUxEeW5hbWljRmllbGRGcm9tICAgICA9ICcnOwogICAgbXkgJFNRTER5bmFtaWNGaWVsZFdoZXJlICAgID0gJyc7CiAgICBteSAkRHluYW1pY0ZpZWxkSm9pbkNvdW50ZXIgPSAxOwoKICAgIERZTkFNSUNGSUVMRDoKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkICggQHskQ3VzdG9tZXJVc2VyRHluYW1pY0ZpZWxkc30gKSB7CgogICAgICAgIG15ICRTZWFyY2hQYXJhbSA9ICRQYXJhbXsgIkR5bmFtaWNGaWVsZF8iIC4gJER5bmFtaWNGaWVsZC0+e05hbWV9IH07CgogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICggISRTZWFyY2hQYXJhbSApOwogICAgICAgIG5leHQgRFlOQU1JQ0ZJRUxEIGlmICggcmVmICRTZWFyY2hQYXJhbSBuZSAnSEFTSCcgKTsKCiAgICAgICAgbXkgJE5lZWRKb2luOwoKICAgICAgICBmb3IgbXkgJE9wZXJhdG9yICggc29ydCBrZXlzICV7JFNlYXJjaFBhcmFtfSApIHsKCiAgICAgICAgICAgIG15IEBTZWFyY2hQYXJhbXMgPSAoIHJlZiAkU2VhcmNoUGFyYW0tPnskT3BlcmF0b3J9IGVxICdBUlJBWScgKQogICAgICAgICAgICAgICAgPyBAeyAkU2VhcmNoUGFyYW0tPnskT3BlcmF0b3J9IH0KICAgICAgICAgICAgICAgIDogKCAkU2VhcmNoUGFyYW0tPnskT3BlcmF0b3J9ICk7CgogICAgICAgICAgICBteSAkU1FMRHluYW1pY0ZpZWxkV2hlcmVTdWIgPSAnJzsKICAgICAgICAgICAgaWYgKCRTUUxEeW5hbWljRmllbGRXaGVyZSkgewogICAgICAgICAgICAgICAgJFNRTER5bmFtaWNGaWVsZFdoZXJlU3ViID0gJyBBTkQgKCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkU1FMRHluYW1pY0ZpZWxkV2hlcmVTdWIgPSAnICgnOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkQ291bnRlciA9IDA7CiAgICAgICAgICAgIFRFWFQ6CiAgICAgICAgICAgIGZvciBteSAkVGV4dCAoQFNlYXJjaFBhcmFtcykgewogICAgICAgICAgICAgICAgbmV4dCBURVhUIGlmICggIWRlZmluZWQgJFRleHQgfHwgJFRleHQgZXEgJycgKTsKCiAgICAgICAgICAgICAgICAkVGV4dCA9fiBzL1wqLyUvZ2k7CgogICAgICAgICAgICAgICAgIyBDaGVjayBzZWFyY2ggYXR0cmlidXRlLCB3ZSBkbyBub3QgbmVlZCB0byBzZWFyY2ggZm9yICcqJy4KICAgICAgICAgICAgICAgIG5leHQgVEVYVCBpZiAkVGV4dCA9fiAvXlwlezEsM30kLzsKCiAgICAgICAgICAgICAgICBteSAkVmFsaWRhdGVTdWNjZXNzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlVmFsaWRhdGUoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGQsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRUZXh0LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgICAgICAgICA9PiAkUGFyYW17VXNlcklEfSB8fCAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIGlmICggISRWYWxpZGF0ZVN1Y2Nlc3MgKSB7CiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJTZWFyY2ggbm90IGV4ZWN1dGVkIGR1ZSB0byBpbnZhbGlkIHZhbHVlICciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRUZXh0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICInIG9uIGZpZWxkICciCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICREeW5hbWljRmllbGQtPntOYW1lfSAuICInISIsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCRDb3VudGVyKSB7CiAgICAgICAgICAgICAgICAgICAgJFNRTER5bmFtaWNGaWVsZFdoZXJlU3ViIC49ICcgT1IgJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRTUUxEeW5hbWljRmllbGRXaGVyZVN1YiAuPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+U2VhcmNoU1FMR2V0KAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkLAogICAgICAgICAgICAgICAgICAgIFRhYmxlQWxpYXMgICAgICAgICA9PiAiZGZ2JER5bmFtaWNGaWVsZEpvaW5Db3VudGVyIiwKICAgICAgICAgICAgICAgICAgICBPcGVyYXRvciAgICAgICAgICAgPT4gJE9wZXJhdG9yLAogICAgICAgICAgICAgICAgICAgIFNlYXJjaFRlcm0gICAgICAgICA9PiAkVGV4dCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgJENvdW50ZXIrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICAkU1FMRHluYW1pY0ZpZWxkV2hlcmVTdWIgLj0gJykgJzsKCiAgICAgICAgICAgIGlmICgkQ291bnRlcikgewogICAgICAgICAgICAgICAgJFNRTER5bmFtaWNGaWVsZFdoZXJlIC49ICRTUUxEeW5hbWljRmllbGRXaGVyZVN1YjsKICAgICAgICAgICAgICAgICROZWVkSm9pbiA9IDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICgkTmVlZEpvaW4pIHsKICAgICAgICAgICAgJFNRTER5bmFtaWNGaWVsZEZyb20gLj0gIgogICAgICAgICAgICAgICAgSU5ORVIgSk9JTiBkeW5hbWljX2ZpZWxkX3ZhbHVlIGRmdiREeW5hbWljRmllbGRKb2luQ291bnRlcgogICAgICAgICAgICAgICAgICAgIE9OIChkZl9vYmpfaWRfbmFtZS5vYmplY3RfaWQgPSBkZnYkRHluYW1pY0ZpZWxkSm9pbkNvdW50ZXIub2JqZWN0X2lkCiAgICAgICAgICAgICAgICAgICAgICAgIEFORCBkZnYkRHluYW1pY0ZpZWxkSm9pbkNvdW50ZXIuZmllbGRfaWQgPSAiCiAgICAgICAgICAgICAgICAuICREQk9iamVjdC0+UXVvdGUoICREeW5hbWljRmllbGQtPntJRH0sICdJbnRlZ2VyJyApIC4gIikKICAgICAgICAgICAgIjsKCiAgICAgICAgICAgICREeW5hbWljRmllbGRKb2luQ291bnRlcisrOwogICAgICAgIH0KICAgIH0KCiAgICAjIEV4ZWN1dGUgYSBkeW5hbWljIGZpZWxkIHNlYXJjaCwgaWYgYSBkeW5hbWljIGZpZWxkIHdoZXJlIHN0YXRlbWVudCBleGlzdHMuCiAgICBpZiAoJFNRTER5bmFtaWNGaWVsZFdoZXJlKSB7CgogICAgICAgIG15IEBEeW5hbWljRmllbGRVc2VyTG9naW5zOwoKICAgICAgICBteSAkU1FMRHluYW1pY0ZpZWxkID0gIlNFTEVDVCBESVNUSU5DVChkZl9vYmpfaWRfbmFtZS5vYmplY3RfbmFtZSkgRlJPTSBkeW5hbWljX2ZpZWxkX29ial9pZF9uYW1lIGRmX29ial9pZF9uYW1lICIKICAgICAgICAgICAgLiAkU1FMRHluYW1pY0ZpZWxkRnJvbQogICAgICAgICAgICAuICIgV0hFUkUgIgogICAgICAgICAgICAuICRTUUxEeW5hbWljRmllbGRXaGVyZTsKCiAgICAgICAgbXkgJFVzZWRDYWNoZTsKCiAgICAgICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKCiAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRTZWFyY2hDYWNoZURhdGEgPSAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+R2V0KAogICAgICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVyU2VhcmNoRGV0YWlsRHluYW1pY0ZpZWxkcycsCiAgICAgICAgICAgICAgICBLZXkgID0+ICRTUUxEeW5hbWljRmllbGQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoIGRlZmluZWQgJER5bmFtaWNGaWVsZFNlYXJjaENhY2hlRGF0YSApIHsKICAgICAgICAgICAgICAgIGlmICggcmVmICREeW5hbWljRmllbGRTZWFyY2hDYWNoZURhdGEgZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgICAgICAgICBARHluYW1pY0ZpZWxkVXNlckxvZ2lucyA9IEB7JER5bmFtaWNGaWVsZFNlYXJjaENhY2hlRGF0YX07CgogICAgICAgICAgICAgICAgICAgICRVc2VkQ2FjaGUgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdJbnZhbGlkIHJlZiAnIC4gcmVmKCREeW5hbWljRmllbGRTZWFyY2hDYWNoZURhdGEpIC4gJyEnCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgR2V0IHRoZSBkYXRhIG9ubHkgZnJvbSBkYXRhYmFzZSwgaWYgbm8gY2FjaGUgZW50cnkgZXhpc3RzLgogICAgICAgIGlmICggISRVc2VkQ2FjaGUgKSB7CgogICAgICAgICAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICAgICAgICAgIFNRTCA9PiAkU1FMRHluYW1pY0ZpZWxkLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBEeW5hbWljRmllbGRVc2VyTG9naW5zLCAkUm93WzBdOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPlNldCgKICAgICAgICAgICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVyU2VhcmNoRGV0YWlsRHluYW1pY0ZpZWxkcycsCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJFNRTER5bmFtaWNGaWVsZCwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiBcQER5bmFtaWNGaWVsZFVzZXJMb2dpbnMsCiAgICAgICAgICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q2FjaGVUVEx9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBBZGQgdGhlIHVzZXIgbG9naW5zIGZyb20gdGhlIGR5bmFtaWMgZmllbGRzLCBpZiBhIHNlYXJjaCByZXN1bHQgZXhpc3RzIGZyb20gdGhlIGR5bmFtaWMgZmllbGQgc2VhcmNoCiAgICAgICAgIyAgIG9yIHNraXAgdGhlIHNlYXJjaCBhbmQgcmV0dXJuIGEgZW1wdHJ5IGFycmF5IHJlZiwgaWYgbm8gdXNlciBsb2dpbnMgZXhpc3RzIGZyb20gdGhlIGR5bmFtaWMgZmllbGQgc2VhcmNoLgogICAgICAgIGlmIChARHluYW1pY0ZpZWxkVXNlckxvZ2lucykgewoKICAgICAgICAgICAgbXkgJFNRTFF1ZXJ5SW5Db25kaXRpb24gPSAkREJPYmplY3QtPlF1ZXJ5SW5Db25kaXRpb24oCiAgICAgICAgICAgICAgICBLZXkgICAgICA9PiAkU2VsZi0+e0N1c3RvbWVyS2V5fSwKICAgICAgICAgICAgICAgIFZhbHVlcyAgID0+IFxARHluYW1pY0ZpZWxkVXNlckxvZ2lucywKICAgICAgICAgICAgICAgIEJpbmRNb2RlID0+IDAsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBwdXNoIEBTUUxXaGVyZSwgJFNRTFF1ZXJ5SW5Db25kaXRpb247CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gJFJlc3VsdCBlcSAnQ09VTlQnID8gMCA6IFtdOwogICAgICAgIH0KICAgIH0KCiAgICBGSUVMRDoKICAgIGZvciBteSAkRmllbGQgKEBBcnJheVNlYXJjaEZpZWxkcykgewoKICAgICAgICBuZXh0IEZJRUxEIGlmICFAeyAkUGFyYW17ICRGaWVsZC0+e05hbWV9IH0gfTsKCiAgICAgICAgbXkgJFNRTFF1ZXJ5SW5Db25kaXRpb24gPSAkREJPYmplY3QtPlF1ZXJ5SW5Db25kaXRpb24oCiAgICAgICAgICAgIEtleSAgICAgID0+ICRGaWVsZC0+e0RhdGFiYXNlRmllbGR9LAogICAgICAgICAgICBWYWx1ZXMgICA9PiAkUGFyYW17ICRGaWVsZC0+e05hbWV9IH0sCiAgICAgICAgICAgIEJpbmRNb2RlID0+IDAsCiAgICAgICAgKTsKCiAgICAgICAgcHVzaCBAU1FMV2hlcmUsICRTUUxRdWVyeUluQ29uZGl0aW9uOwogICAgfQoKICAgICMgU3BlY2lhbCBwYXJhbWV0ZXIgZm9yIEN1c3RvbWVySURzIGZyb20gYSBjdXN0b21lciBjb21wYW55IHNlYXJjaCByZXN1bHQuCiAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggJFBhcmFte0N1c3RvbWVyQ29tcGFueVNlYXJjaEN1c3RvbWVySURzfSApICkgewoKICAgICAgICBteSAkU1FMUXVlcnlJbkNvbmRpdGlvbiA9ICREQk9iamVjdC0+UXVlcnlJbkNvbmRpdGlvbigKICAgICAgICAgICAgS2V5ICAgICAgPT4gJFNlbGYtPntDdXN0b21lcklEfSwKICAgICAgICAgICAgVmFsdWVzICAgPT4gJFBhcmFte0N1c3RvbWVyQ29tcGFueVNlYXJjaEN1c3RvbWVySURzfSwKICAgICAgICAgICAgQmluZE1vZGUgPT4gMCwKICAgICAgICApOwoKICAgICAgICBwdXNoIEBTUUxXaGVyZSwgJFNRTFF1ZXJ5SW5Db25kaXRpb247CiAgICB9CgogICAgIyBTcGVjaWFsIHBhcmFtZXRlciB0byBleGNsdWRlIHNvbWUgdXNlciBsb2dpbnMgZnJvbSB0aGUgc2VhcmNoIHJlc3VsdC4KICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCAkUGFyYW17RXhjbHVkZVVzZXJMb2dpbnN9ICkgKSB7CgogICAgICAgIG15ICRTUUxRdWVyeUluQ29uZGl0aW9uID0gJERCT2JqZWN0LT5RdWVyeUluQ29uZGl0aW9uKAogICAgICAgICAgICBLZXkgICAgICA9PiAkU2VsZi0+e0N1c3RvbWVyS2V5fSwKICAgICAgICAgICAgVmFsdWVzICAgPT4gJFBhcmFte0V4Y2x1ZGVVc2VyTG9naW5zfSwKICAgICAgICAgICAgQmluZE1vZGUgPT4gMCwKICAgICAgICAgICAgTmVnYXRlICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICBwdXNoIEBTUUxXaGVyZSwgJFNRTFF1ZXJ5SW5Db25kaXRpb247CiAgICB9CgogICAgIyBBZGQgdGhlIHZhbGlkIG9wdGlvbiBpZiBuZWVkZWQuCiAgICBpZiAoICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVmFsaWR9ICYmICRWYWxpZCApIHsKCiAgICAgICAgbXkgJFZhbGlkT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyk7CgogICAgICAgIHB1c2ggQFNRTFdoZXJlLAogICAgICAgICAgICAiJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJWYWxpZH0gSU4gKCIgLiBqb2luKCAnLCAnLCAkVmFsaWRPYmplY3QtPlZhbGlkSURzR2V0KCkgKSAuICIpICI7CiAgICB9CgogICAgIyBDaGVjayBpZiBPcmRlckJ5IGNvbnRhaW5zIG9ubHkgdW5pcXVlIHZhbGlkIHZhbHVlcy4KICAgIG15ICVPcmRlckJ5U2VlbjsKICAgIGZvciBteSAkT3JkZXJCeSAoIEB7ICRQYXJhbXtPcmRlckJ5fSB9ICkgewoKICAgICAgICBpZiAoICEkT3JkZXJCeSB8fCAkT3JkZXJCeVNlZW57JE9yZGVyQnl9ICkgewoKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk9yZGVyQnkgY29udGFpbnMgaW52YWxpZCB2YWx1ZSAnJE9yZGVyQnknIG9yIHRoZSB2YWx1ZSBpcyB1c2VkIG1vcmUgdGhhbiBvbmNlISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgUmVtZW1iZXIgdGhlIHZhbHVlIHRvIGNoZWNrIGlmIGl0IGFwcGVhcnMgbW9yZSB0aGFuIG9uY2UuCiAgICAgICAgJE9yZGVyQnlTZWVueyRPcmRlckJ5fSA9IDE7CiAgICB9CgogICAgIyBDaGVjayBpZiBPcmRlckJ5RGlyZWN0aW9uIGFycmF5IGNvbnRhaW5zIG9ubHkgJ1VwJyBvciAnRG93bicuCiAgICBESVJFQ1RJT046CiAgICBmb3IgbXkgJERpcmVjdGlvbiAoIEB7ICRQYXJhbXtPcmRlckJ5RGlyZWN0aW9ufSB9ICkgewoKICAgICAgICAjIE9ubHkgJ1VwJyBvciAnRG93bicgYWxsb3dlZC4KICAgICAgICBuZXh0IERJUkVDVElPTiBpZiAkRGlyZWN0aW9uIGVxICdVcCc7CiAgICAgICAgbmV4dCBESVJFQ1RJT04gaWYgJERpcmVjdGlvbiBlcSAnRG93bic7CgogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiT3JkZXJCeURpcmVjdGlvbiBjYW4gb25seSBjb250YWluICdVcCcgb3IgJ0Rvd24nISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBCdWlsZCB0aGUgc3FsIHN0YXRlbWVudCBmb3IgdGhlIHNlYXJjaC4KICAgIG15ICRTUUwgPSAiU0VMRUNUIERJU1RJTkNUKCRTZWxmLT57Q3VzdG9tZXJLZXl9KSI7CgogICAgIyBNb2RpZnkgU1FMIHdoZW4gdGhlIHJlc3VsdCB0eXBlIGlzICdDT1VOVCcuCiAgICBpZiAoICRSZXN1bHQgZXEgJ0NPVU5UJyApIHsKICAgICAgICAkU1FMID0gIlNFTEVDVCBDT1VOVChESVNUSU5DVCgkU2VsZi0+e0N1c3RvbWVyS2V5fSkpIjsKICAgIH0KCiAgICAjIEFzc2VtYmxlIHRoZSBPUkRFUiBCWSBjbGF1c2UuCiAgICBteSBAU1FMT3JkZXJCeTsKCiAgICAjIFRoZSBPcmRlciBieSBjbGF1c2UgaXMgbm90IG5lZWRlZCBmb3IgdGhlIHJlc3VsdCB0eXBlICdDT1VOVCcuCiAgICBpZiAoICRSZXN1bHQgbmUgJ0NPVU5UJyApIHsKCiAgICAgICAgbXkgJENvdW50ID0gMDsKCiAgICAgICAgT1JERVJCWToKICAgICAgICBmb3IgbXkgJE9yZGVyQnkgKCBAeyAkUGFyYW17T3JkZXJCeX0gfSApIHsKCiAgICAgICAgICAgIG15ICREaXJlY3Rpb24gPSAnREVTQyc7CgogICAgICAgICAgICBpZiAoICRQYXJhbXtPcmRlckJ5RGlyZWN0aW9ufS0+WyRDb3VudF0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXtPcmRlckJ5RGlyZWN0aW9ufS0+WyRDb3VudF0gZXEgJ1VwJyApIHsKICAgICAgICAgICAgICAgICAgICAkRGlyZWN0aW9uID0gJ0FTQyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRQYXJhbXtPcmRlckJ5RGlyZWN0aW9ufS0+WyRDb3VudF0gZXEgJ0Rvd24nICkgewogICAgICAgICAgICAgICAgICAgICREaXJlY3Rpb24gPSAnREVTQyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRDb3VudCsrOwoKICAgICAgICAgICAgbmV4dCBPUkRFUkJZIGlmICEkT3JkZXJCeVRhYmxleyRPcmRlckJ5fTsKCiAgICAgICAgICAgIHB1c2ggQFNRTE9yZGVyQnksICIkT3JkZXJCeVRhYmxleyRPcmRlckJ5fSAkRGlyZWN0aW9uIjsKCiAgICAgICAgICAgIG5leHQgT1JERVJCWSBpZiAkT3JkZXJCeSBlcSAnVXNlckxvZ2luJzsKCiAgICAgICAgICAgICRTUUwgLj0gIiwgJE9yZGVyQnlUYWJsZXskT3JkZXJCeX0iOwogICAgICAgIH0KCiAgICAgICAgIyBJZiB0aGVyZSBpcyBhIHBvc3NpYmlsaXR5IHRoYXQgdGhlIG9yZGVyaW5nIGlzIG5vdCBkZXRlcm1pbmVkCiAgICAgICAgIyAgIHdlIGFkZCBhbiBkZXNjZW5kaW5nIG9yZGVyaW5nIGJ5IGlkLgogICAgICAgIGlmICggIWdyZXAgeyAkXyBlcSAnVXNlckxvZ2luJyB9ICggQHsgJFBhcmFte09yZGVyQnl9IH0gKSApIHsKICAgICAgICAgICAgcHVzaCBAU1FMT3JkZXJCeSwgIiRTZWxmLT57Q3VzdG9tZXJLZXl9IERFU0MiOwogICAgICAgIH0KICAgIH0KCiAgICAkU1FMIC49ICIgRlJPTSAkU2VsZi0+e0N1c3RvbWVyVGFibGV9ICI7CgogICAgaWYgKEBTUUxXaGVyZSkgewogICAgICAgIG15ICRTUUxXaGVyZVN0cmluZyA9IGpvaW4gJyBBTkQgJywgbWFwIHsiKCAkXyApIn0gQFNRTFdoZXJlOwogICAgICAgICRTUUwgLj0gIldIRVJFICRTUUxXaGVyZVN0cmluZyAiOwogICAgfQogICAgaWYgKEBTUUxPcmRlckJ5KSB7CiAgICAgICAgbXkgJE9yZGVyQnlTdHJpbmcgPSBqb2luICcsICcsIEBTUUxPcmRlckJ5OwogICAgICAgICRTUUwgLj0gIk9SREVSIEJZICRPcmRlckJ5U3RyaW5nIjsKICAgIH0KCiAgICAjIENoZWNrIGlmIGEgY2FjaGUgZXhpc3RzIGJlZm9yZSB3ZSBhc2sgdGhlIGRhdGFiYXNlLgogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKCiAgICAgICAgbXkgJENhY2hlRGF0YSA9ICRTZWxmLT57Q2FjaGVPYmplY3R9LT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ19DdXN0b21lclNlYXJjaERldGFpbCcsCiAgICAgICAgICAgIEtleSAgPT4gJFNRTCAuICRQYXJhbXtMaW1pdH0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCBkZWZpbmVkICRDYWNoZURhdGEgKSB7CiAgICAgICAgICAgIGlmICggcmVmICRDYWNoZURhdGEgZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiAkQ2FjaGVEYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggcmVmICRDYWNoZURhdGEgZXEgJycgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJENhY2hlRGF0YTsKICAgICAgICAgICAgfQogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAnSW52YWxpZCByZWYgJyAuIHJlZigkQ2FjaGVEYXRhKSAuICchJwogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgIFNRTCAgID0+ICRTUUwsCiAgICAgICAgTGltaXQgPT4gJFBhcmFte0xpbWl0fSwKICAgICk7CgogICAgbXkgQElEczsKICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2ggQElEcywgJFJvd1swXTsKICAgIH0KCiAgICAjIEhhbmRsZSB0aGUgZGlmZnJlbnQgcmVzdWx0IHR5cGVzLgogICAgaWYgKCAkUmVzdWx0IGVxICdDT1VOVCcgKSB7CgogICAgICAgIGlmICggJFNlbGYtPntDYWNoZU9iamVjdH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5TZXQoCiAgICAgICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVyU2VhcmNoRGV0YWlsJywKICAgICAgICAgICAgICAgIEtleSAgID0+ICRTUUwgLiAkUGFyYW17TGltaXR9LAogICAgICAgICAgICAgICAgVmFsdWUgPT4gJElEc1swXSwKICAgICAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0NhY2hlVFRMfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAkSURzWzBdOwogICAgfQogICAgZWxzZSB7CgogICAgICAgIGlmICggJFNlbGYtPntDYWNoZU9iamVjdH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5TZXQoCiAgICAgICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVyU2VhcmNoRGV0YWlsJywKICAgICAgICAgICAgICAgIEtleSAgID0+ICRTUUwgLiAkUGFyYW17TGltaXR9LAogICAgICAgICAgICAgICAgVmFsdWUgPT4gXEBJRHMsCiAgICAgICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDYWNoZVRUTH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gXEBJRHM7CiAgICB9Cn0KCnN1YiBDdXN0b21lcklETGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRWYWxpZCAgICAgID0gZGVmaW5lZCAkUGFyYW17VmFsaWR9ID8gJFBhcmFte1ZhbGlkfSA6IDE7CiAgICBteSAkU2VhcmNoVGVybSA9ICRQYXJhbXtTZWFyY2hUZXJtfSB8fCAnJzsKCiAgICBteSAkQ2FjaGVUeXBlID0gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ19DdXN0b21lcklETGlzdCc7CiAgICBteSAkQ2FjaGVLZXkgID0gIkN1c3RvbWVySURMaXN0Ojoke1ZhbGlkfTo6JFNlYXJjaFRlcm0iOwoKICAgICMgY2hlY2sgY2FjaGUKICAgIGlmICggJFNlbGYtPntDYWNoZU9iamVjdH0gKSB7CiAgICAgICAgbXkgJFJlc3VsdCA9ICRTZWxmLT57Q2FjaGVPYmplY3R9LT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJENhY2hlVHlwZSwKICAgICAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gQHskUmVzdWx0fSBpZiByZWYgJFJlc3VsdCBlcSAnQVJSQVknOwogICAgfQoKICAgIG15ICRTUUwgPSAiCiAgICAgICAgU0VMRUNUIERJU1RJTkNUKCRTZWxmLT57Q3VzdG9tZXJJRH0pCiAgICAgICAgRlJPTSAkU2VsZi0+e0N1c3RvbWVyVGFibGV9CiAgICAgICAgV0hFUkUgMSA9IDEgIjsKICAgIG15IEBCaW5kOwoKICAgICMgYWRkIHZhbGlkIG9wdGlvbgogICAgaWYgKCAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclZhbGlkfSAmJiAkVmFsaWQgKSB7CgogICAgICAgICMgZ2V0IHZhbGlkIG9iamVjdAogICAgICAgIG15ICRWYWxpZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcpOwoKICAgICAgICBteSAkVmFsaWRJRHMgPSBqb2luKCAnLCAnLCAkVmFsaWRPYmplY3QtPlZhbGlkSURzR2V0KCkgKTsKICAgICAgICAkU1FMIC49ICIKICAgICAgICAgICAgQU5EICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVmFsaWR9IElOICgkVmFsaWRJRHMpICI7CiAgICB9CgogICAgIyBhZGQgc2VhcmNoIHRlcm0KICAgIGlmICgkU2VhcmNoVGVybSkgewogICAgICAgIG15ICRTZWFyY2hUZXJtRXNjYXBlZCA9ICRTZWxmLT57REJPYmplY3R9LT5RdWVyeVN0cmluZ0VzY2FwZSggUXVlcnlTdHJpbmcgPT4gJFNlYXJjaFRlcm0gKTsKCiAgICAgICAgJFNRTCAuPSAnIEFORCAnOwogICAgICAgIG15ICVRdWVyeUNvbmRpdGlvbiA9ICRTZWxmLT57REJPYmplY3R9LT5RdWVyeUNvbmRpdGlvbigKICAgICAgICAgICAgS2V5ICAgICAgICAgICA9PiAkU2VsZi0+e0N1c3RvbWVySUR9LAogICAgICAgICAgICBWYWx1ZSAgICAgICAgID0+ICRTZWFyY2hUZXJtRXNjYXBlZCwKICAgICAgICAgICAgU2VhcmNoUHJlZml4ICA9PiAkU2VsZi0+e1NlYXJjaFByZWZpeH0sCiAgICAgICAgICAgIFNlYXJjaFN1ZmZpeCAgPT4gJFNlbGYtPntTZWFyY2hTdWZmaXh9LAogICAgICAgICAgICBDYXNlU2Vuc2l0aXZlID0+ICRTZWxmLT57Q2FzZVNlbnNpdGl2ZX0sCiAgICAgICAgICAgIEJpbmRNb2RlICAgICAgPT4gMSwKICAgICAgICApOwogICAgICAgICRTUUwgLj0gJFF1ZXJ5Q29uZGl0aW9ue1NRTH07CiAgICAgICAgcHVzaCBAQmluZCwgQHsgJFF1ZXJ5Q29uZGl0aW9ue1ZhbHVlc30gfTsKCiAgICAgICAgJFNRTCAuPSAnICc7CiAgICB9CgogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQEJpbmQsCiAgICApOwoKICAgIG15IEBSZXN1bHQ7CgogICAgd2hpbGUgKCBteSBAUm93ID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICBwdXNoIEBSZXN1bHQsICRSb3dbMF07CiAgICB9CgogICAgIyBjYWNoZSByZXF1ZXN0CiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICRDYWNoZVR5cGUsCiAgICAgICAgICAgIEtleSAgID0+ICRDYWNoZUtleSwKICAgICAgICAgICAgVmFsdWUgPT4gXEBSZXN1bHQsCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0NhY2hlVFRMfSwKICAgICAgICApOwogICAgfQogICAgcmV0dXJuIEBSZXN1bHQ7Cn0KCnN1YiBDdXN0b21lcklEcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcn0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXIhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgY2FjaGUKICAgIGlmICggJFNlbGYtPntDYWNoZU9iamVjdH0gKSB7CiAgICAgICAgbXkgJEN1c3RvbWVySURzID0gJFNlbGYtPntDYWNoZU9iamVjdH0tPkdldCgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgPT4gIkN1c3RvbWVySURzOjokUGFyYW17VXNlcn0iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuIEB7JEN1c3RvbWVySURzfSBpZiByZWYgJEN1c3RvbWVySURzIGVxICdBUlJBWSc7CiAgICB9CgogICAgIyBnZXQgY3VzdG9tZXIgZGF0YQogICAgbXkgJURhdGEgPSAkU2VsZi0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICBVc2VyID0+ICRQYXJhbXtVc2VyfSwKICAgICk7CgogICAgIyB0aGVyZSBhcmUgbXVsdGkgY3VzdG9tZXIgaWRzCiAgICBteSBAQ3VzdG9tZXJJRHM7CiAgICBpZiAoICREYXRhe1VzZXJDdXN0b21lcklEc30gKSB7CgogICAgICAgICMgdXNlZCBzZXBhcmF0b3JzCiAgICAgICAgU0VQQVJBVE9SOgogICAgICAgIGZvciBteSAkU2VwYXJhdG9yICggJzsnLCAnLCcsICd8JyApIHsKCiAgICAgICAgICAgIG5leHQgU0VQQVJBVE9SIGlmICREYXRhe1VzZXJDdXN0b21lcklEc30gIX4gL1xRJFNlcGFyYXRvclxFLzsKCiAgICAgICAgICAgICMgc3BsaXQgaXQKICAgICAgICAgICAgbXkgQElEcyA9IHNwbGl0IC9cUSRTZXBhcmF0b3JcRS8sICREYXRhe1VzZXJDdXN0b21lcklEc307CgogICAgICAgICAgICBmb3IgbXkgJElEIChASURzKSB7CiAgICAgICAgICAgICAgICAkSUQgPX4gcy9eXHMrLy9nOwogICAgICAgICAgICAgICAgJElEID1+IHMvXHMrJC8vZzsKICAgICAgICAgICAgICAgIHB1c2ggQEN1c3RvbWVySURzLCAkSUQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxhc3QgU0VQQVJBVE9SOwogICAgICAgIH0KCiAgICAgICAgIyBmYWxsYmFjayBpZiBubyBzZXBhcmF0b3IgZ290IGZvdW5kCiAgICAgICAgaWYgKCAhQEN1c3RvbWVySURzICkgewogICAgICAgICAgICAkRGF0YXtVc2VyQ3VzdG9tZXJJRHN9ID1+IHMvXlxzKy8vZzsKICAgICAgICAgICAgJERhdGF7VXNlckN1c3RvbWVySURzfSA9fiBzL1xzKyQvL2c7CiAgICAgICAgICAgIHB1c2ggQEN1c3RvbWVySURzLCAkRGF0YXtVc2VyQ3VzdG9tZXJJRHN9OwogICAgICAgIH0KICAgIH0KCiAgICAjIHVzZSBhbHNvIHRoZSBwcmltYXJ5IGN1c3RvbWVyIGlkCiAgICBpZiAoICREYXRhe1VzZXJDdXN0b21lcklEfSAmJiAhJFNlbGYtPntFeGNsdWRlUHJpbWFyeUN1c3RvbWVySUR9ICkgewogICAgICAgIHB1c2ggQEN1c3RvbWVySURzLCAkRGF0YXtVc2VyQ3VzdG9tZXJJRH07CiAgICB9CgogICAgIyBjYWNoZSByZXF1ZXN0CiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICAgPT4gJ0N1c3RvbWVySURzOjonIC4gJFBhcmFte1VzZXJ9LAogICAgICAgICAgICBWYWx1ZSA9PiBcQEN1c3RvbWVySURzLAogICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDYWNoZVRUTH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gQEN1c3RvbWVySURzOwp9CgpzdWIgQ3VzdG9tZXJVc2VyRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcn0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXIhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGJ1aWxkIHNlbGVjdAogICAgbXkgJFNRTCA9ICdTRUxFQ1QgJzsKICAgIEVOVFJZOgogICAgZm9yIG15ICRFbnRyeSAoIEB7ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e01hcH0gfSApIHsKCiAgICAgICAgbmV4dCBFTlRSWSBpZiAkRW50cnktPls1XSBlcSAnZHluYW1pY19maWVsZCc7CgogICAgICAgICRTUUwgLj0gIiAkRW50cnktPlsyXSwgIjsKICAgIH0KCiAgICBpZiAoICEkU2VsZi0+e0ZvcmVpZ25EQn0gKSB7CiAgICAgICAgJFNRTCAuPSAiY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSwgIjsKICAgIH0KCiAgICAkU1FMIC49ICRTZWxmLT57Q3VzdG9tZXJLZXl9IC4gIiBGUk9NICRTZWxmLT57Q3VzdG9tZXJUYWJsZX0gV0hFUkUgIjsKCiAgICAjIGNoZWNrIGNhY2hlCiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgIG15ICREYXRhID0gJFNlbGYtPntDYWNoZU9iamVjdH0tPkdldCgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgPT4gIkN1c3RvbWVyVXNlckRhdGFHZXQ6OiRQYXJhbXtVc2VyfSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJXskRGF0YX0gaWYgcmVmICREYXRhIGVxICdIQVNIJzsKICAgIH0KCiAgICAjIGNoZWNrIGN1c3RvbWVyIGtleSB0eXBlCiAgICBteSAkVXNlciA9ICRQYXJhbXtVc2VyfTsKCiAgICBpZiAoICRTZWxmLT57Q2FzZVNlbnNpdGl2ZX0gKSB7CiAgICAgICAgJFNRTCAuPSAiJFNlbGYtPntDdXN0b21lcktleX0gPSA/IjsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTUUwgLj0gIkxPV0VSKCRTZWxmLT57Q3VzdG9tZXJLZXl9KSA9IExPV0VSKD8pIjsKICAgIH0KCiAgICAjIGFzayB0aGUgZGF0YWJhc2UKICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMICAgPT4gJFNRTCwKICAgICAgICBCaW5kICA9PiBbIFwkVXNlciBdLAogICAgICAgIExpbWl0ID0+IDEsCiAgICApOwoKICAgICMgZmV0Y2ggdGhlIHJlc3VsdAogICAgbXkgJURhdGE7CiAgICBST1c6CiAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewoKICAgICAgICBteSAkTWFwQ291bnRlciA9IDA7CgogICAgICAgIEVOVFJZOgogICAgICAgIGZvciBteSAkRW50cnkgKCBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntNYXB9IH0gKSB7CgogICAgICAgICAgICBuZXh0IEVOVFJZIGlmICRFbnRyeS0+WzVdIGVxICdkeW5hbWljX2ZpZWxkJzsKCiAgICAgICAgICAgICREYXRheyAkRW50cnktPlswXSB9ID0gJFJvd1skTWFwQ291bnRlcl07CiAgICAgICAgICAgICRNYXBDb3VudGVyKys7CiAgICAgICAgfQoKICAgICAgICBuZXh0IFJPVyBpZiAkU2VsZi0+e0ZvcmVpZ25EQn07CgogICAgICAgIGZvciBteSAkS2V5IChxdyhDcmVhdGVUaW1lIENyZWF0ZUJ5IENoYW5nZVRpbWUgQ2hhbmdlQnkpKSB7CiAgICAgICAgICAgICREYXRheyRLZXl9ID0gJFJvd1skTWFwQ291bnRlcl07CiAgICAgICAgICAgICRNYXBDb3VudGVyKys7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgZGF0YQogICAgaWYgKCAhJERhdGF7VXNlckxvZ2lufSApIHsKCiAgICAgICAgIyBjYWNoZSByZXF1ZXN0CiAgICAgICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICAgICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPlNldCgKICAgICAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgICAgIEtleSAgID0+ICJDdXN0b21lclVzZXJEYXRhR2V0OjokUGFyYW17VXNlcn0iLAogICAgICAgICAgICAgICAgVmFsdWUgPT4ge30sCiAgICAgICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDYWNoZVRUTH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkQ3VzdG9tZXJVc2VyTGlzdEZpZWxkc01hcCA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlckxpc3RGaWVsZHN9OwogICAgaWYgKCAhSXNBcnJheVJlZldpdGhEYXRhKCRDdXN0b21lclVzZXJMaXN0RmllbGRzTWFwKSApIHsKICAgICAgICAkQ3VzdG9tZXJVc2VyTGlzdEZpZWxkc01hcCA9IFsgJ2ZpcnN0X25hbWUnLCAnbGFzdF9uYW1lJywgJ2VtYWlsJywgXTsKICAgIH0KCiAgICAjIE9yZGVyIGZpZWxkcyBieSBDdXN0b21lclVzZXJMaXN0RmllbGRzIChzZWUgYnVnIzEzODIxKS4KICAgIG15IEBDdXN0b21lclVzZXJMaXN0RmllbGRzOwogICAgZm9yIG15ICRGaWVsZCAoIEB7JEN1c3RvbWVyVXNlckxpc3RGaWVsZHNNYXB9ICkgewogICAgICAgIG15IEBGaWVsZE5hbWVzID0gbWFwIHsgJF8tPlswXSB9IGdyZXAgeyAkXy0+WzJdIGVxICRGaWVsZCB9IEB7ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e01hcH0gfTsKICAgICAgICBwdXNoIEBDdXN0b21lclVzZXJMaXN0RmllbGRzLCAkRmllbGROYW1lc1swXTsKICAgIH0KCiAgICBteSAkVXNlck1haWxTdHJpbmcgPSAnJzsKICAgIG15IEBVc2VyTWFpbFN0cmluZ1BhcnRzOwoKICAgIEZJRUxEOgogICAgZm9yIG15ICRGaWVsZCAoQEN1c3RvbWVyVXNlckxpc3RGaWVsZHMpIHsKICAgICAgICBuZXh0IEZJRUxEIGlmICEkRGF0YXskRmllbGR9OwoKICAgICAgICBwdXNoIEBVc2VyTWFpbFN0cmluZ1BhcnRzLCAkRGF0YXskRmllbGR9OwogICAgfQogICAgJFVzZXJNYWlsU3RyaW5nID0gam9pbiAnICcsIEBVc2VyTWFpbFN0cmluZ1BhcnRzOwogICAgJFVzZXJNYWlsU3RyaW5nID1+IHMvXiguKilccyguKz9cQC4rP1wuLis/KShcc3wpJC8iJDEiIDwkMj4vOwoKICAgICMgYWRkIHRoZSBVc2VyTWFpbFN0cmluZyB0byB0aGUgZGF0YSBoYXNoCiAgICAkRGF0YXtVc2VyTWFpbFN0cmluZ30gPSAkVXNlck1haWxTdHJpbmc7CgogICAgIyBjb21wYXQhCiAgICAkRGF0YXtVc2VySUR9ID0gJERhdGF7VXNlckxvZ2lufTsKCiAgICAjIGdldCBwcmVmZXJlbmNlcwogICAgbXkgJVByZWZlcmVuY2VzID0gJFNlbGYtPkdldFByZWZlcmVuY2VzKCBVc2VySUQgPT4gJERhdGF7VXNlcklEfSApOwoKICAgICMgYWRkIGxhc3QgbG9naW4gdGltZXN0YW1wCiAgICBpZiAoICRQcmVmZXJlbmNlc3tVc2VyTGFzdExvZ2lufSApIHsKCiAgICAgICAgbXkgJERhdGVUaW1lT2JqZWN0ID0gJEtlcm5lbDo6T00tPkNyZWF0ZSgKICAgICAgICAgICAgJ0tlcm5lbDo6U3lzdGVtOjpEYXRlVGltZScsCiAgICAgICAgICAgIE9iamVjdFBhcmFtcyA9PiB7CiAgICAgICAgICAgICAgICBFcG9jaCA9PiAkUHJlZmVyZW5jZXN7VXNlckxhc3RMb2dpbn0sCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKCiAgICAgICAgJFByZWZlcmVuY2Vze1VzZXJMYXN0TG9naW5UaW1lc3RhbXB9ID0gJERhdGVUaW1lT2JqZWN0LT5Ub1N0cmluZygpOwoKICAgIH0KCiAgICAjIGNhY2hlIHJlcXVlc3QKICAgIGlmICggJFNlbGYtPntDYWNoZU9iamVjdH0gKSB7CiAgICAgICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPlNldCgKICAgICAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgICA9PiAiQ3VzdG9tZXJVc2VyRGF0YUdldDo6JFBhcmFte1VzZXJ9IiwKICAgICAgICAgICAgVmFsdWUgPT4geyAlRGF0YSwgJVByZWZlcmVuY2VzIH0sCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0NhY2hlVFRMfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAoICVEYXRhLCAlUHJlZmVyZW5jZXMgKTsKfQoKc3ViIEN1c3RvbWVyVXNlckFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgcm8vcncKICAgIGlmICggJFNlbGYtPntSZWFkT25seX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdDdXN0b21lciBiYWNrZW5kIGlzIHJlYWQgb25seSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBFTlRSWToKICAgIGZvciBteSAkRW50cnkgKCBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntNYXB9IH0gKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyAkRW50cnktPlswXSB9ICYmICRFbnRyeS0+WzRdICkgewoKICAgICAgICAgICAgIyBza2lwIFVzZXJMb2dpbiwgd2lsbCBiZSBjaGVja2VkIGxhdGVyCiAgICAgICAgICAgIG5leHQgRU5UUlkgaWYgKCAkRW50cnktPlswXSBlcSAnVXNlckxvZ2luJyApOwoKICAgICAgICAgICAgIyBpZ25vcmUgZHluYW1pYyBmaWVsZHMgaGVyZQogICAgICAgICAgICBuZXh0IEVOVFJZIGlmICRFbnRyeS0+WzVdIGVxICdkeW5hbWljX2ZpZWxkJzsKCiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRFbnRyeS0+WzBdISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlcklEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBpZiBubyBVc2VyTG9naW4gaXMgZ2l2ZW4KICAgIGlmICggISRQYXJhbXtVc2VyTG9naW59ICYmICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0F1dG9Mb2dpbkNyZWF0aW9ufSApIHsKCiAgICAgICAgIyBnZXQgdGltZSBvYmplY3QKICAgICAgICBteSAkRGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKCdLZXJuZWw6OlN5c3RlbTo6RGF0ZVRpbWUnKTsKICAgICAgICBteSAkRGF0ZVRpbWVTdHJpbmcgPSAkRGF0ZVRpbWVPYmplY3QtPkZvcm1hdCggRm9ybWF0ID0+ICclWSVtJWQlSCVNJyApOwoKICAgICAgICBteSAkUHJlZml4ID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57QXV0b0xvZ2luQ3JlYXRpb25QcmVmaXh9IHx8ICdhdXRvJzsKICAgICAgICAkUGFyYW17VXNlckxvZ2lufSA9ICIkUHJlZml4LSREYXRlVGltZVN0cmluZyIgLiBpbnQoIHJhbmQoOTkpICk7CiAgICB9CgogICAgIyBjaGVjayBpZiB1c2VyIGxvZ2luIGV4aXN0cwogICAgaWYgKCAhJFBhcmFte1VzZXJMb2dpbn0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJMb2dpbiEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcyBpZiBhbHJlYWR5IGV4aXN0cwogICAgaWYgKCAkUGFyYW17VXNlckVtYWlsfSAmJiAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJFbWFpbFVuaXFDaGVja30gKSB7CiAgICAgICAgbXkgJVJlc3VsdCA9ICRTZWxmLT5DdXN0b21lclNlYXJjaCgKICAgICAgICAgICAgVmFsaWQgICAgICAgICAgICA9PiAwLAogICAgICAgICAgICBQb3N0TWFzdGVyU2VhcmNoID0+ICRQYXJhbXtVc2VyRW1haWx9LAogICAgICAgICk7CiAgICAgICAgaWYgKCVSZXN1bHQpIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpMYW5ndWFnZScpLT5UcmFuc2xhdGUoJ1RoaXMgZW1haWwgYWRkcmVzcyBpcyBhbHJlYWR5IGluIHVzZSBmb3IgYW5vdGhlciBjdXN0b21lciB1c2VyLicpLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGNoZWNrIGl0ZW0gb2JqZWN0CiAgICBteSAkQ2hlY2tJdGVtT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNoZWNrSXRlbScpOwoKICAgICMgY2hlY2sgZW1haWwgYWRkcmVzcyBteAogICAgaWYgKAogICAgICAgICRQYXJhbXtVc2VyRW1haWx9CiAgICAgICAgJiYgISRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRW1haWwoIEFkZHJlc3MgPT4gJFBhcmFte1VzZXJFbWFpbH0gKQogICAgICAgICYmIGdyZXAgeyAkXyBlcSAkUGFyYW17VmFsaWRJRH0gfSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6VmFsaWQnKS0+VmFsaWRJRHNHZXQoKQogICAgICAgICkKICAgIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkVtYWlsIGFkZHJlc3MgKCRQYXJhbXtVc2VyRW1haWx9KSBub3QgdmFsaWQgKCIKICAgICAgICAgICAgICAgIC4gJENoZWNrSXRlbU9iamVjdC0+Q2hlY2tFcnJvcigpIC4gIikhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHF1b3RlIHZhbHVlcwogICAgbXkgJVZhbHVlOwogICAgZm9yIG15ICRFbnRyeSAoIEB7ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e01hcH0gfSApIHsKICAgICAgICBpZiAoICRFbnRyeS0+WzVdID1+IC9eaW50JC9pICkgewogICAgICAgICAgICBpZiAoICRQYXJhbXsgJEVudHJ5LT5bMF0gfSApIHsKICAgICAgICAgICAgICAgICRWYWx1ZXsgJEVudHJ5LT5bMF0gfSA9ICRQYXJhbXsgJEVudHJ5LT5bMF0gfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRWYWx1ZXsgJEVudHJ5LT5bMF0gfSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmICggJFBhcmFteyAkRW50cnktPlswXSB9ICkgewogICAgICAgICAgICAgICAgJFZhbHVleyAkRW50cnktPlswXSB9ID0gJFBhcmFteyAkRW50cnktPlswXSB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFZhbHVleyAkRW50cnktPlswXSB9ID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBidWlsZCBpbnNlcnQKICAgIG15ICRTUUwgPSAiSU5TRVJUIElOVE8gJFNlbGYtPntDdXN0b21lclRhYmxlfSAoIjsKICAgIG15IEBCaW5kOwogICAgbXkgJVNlZW5LZXk7ICAgICMgSWYgdGhlIG1hcCBjb250YWlucyBkdXBsaWNhdGVkIGZpZWxkIG5hbWVzLCBpbnNlcnQgb25seSBvbmNlLgogICAgbXkgQENvbHVtbk5hbWVzOwoKICAgIE1BUEVOVFJZOgogICAgZm9yIG15ICRFbnRyeSAoIEB7ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e01hcH0gfSApIHsKICAgICAgICBuZXh0IE1BUEVOVFJZIGlmICRFbnRyeS0+WzVdIGVxICdkeW5hbWljX2ZpZWxkJzsgICAgICAgICAgICAjIHNraXAgZHluYW1pYyBmaWVsZHMKICAgICAgICBuZXh0IE1BUEVOVFJZIGlmICggbGMoICRFbnRyeS0+WzBdICkgZXEgInVzZXJwYXNzd29yZCIgKTsKICAgICAgICBuZXh0IE1BUEVOVFJZIGlmICRTZWVuS2V5eyAkRW50cnktPlsyXSB9Kys7CiAgICAgICAgcHVzaCBAQ29sdW1uTmFtZXMsICRFbnRyeS0+WzJdOwogICAgfQoKICAgICRTUUwgLj0gam9pbiAnLCAnLCBAQ29sdW1uTmFtZXM7CgogICAgaWYgKCAhJFNlbGYtPntGb3JlaWduREJ9ICkgewogICAgICAgICRTUUwgLj0gJywgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSc7CiAgICB9CgogICAgJFNRTCAuPSAnKSBWQUxVRVMgKCc7CgogICAgbXkgJVNlZW5WYWx1ZTsKICAgIG15ICRCaW5kQ29sdW1ucyA9IDA7CgogICAgRU5UUlk6CiAgICBmb3IgbXkgJEVudHJ5ICggQHsgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57TWFwfSB9ICkgewogICAgICAgIG5leHQgRU5UUlkgaWYgJEVudHJ5LT5bNV0gZXEgJ2R5bmFtaWNfZmllbGQnOyAgICAgICAgICAgICMgc2tpcCBkeW5hbWljIGZpZWxkcwogICAgICAgIG5leHQgRU5UUlkgaWYgKCBsYyggJEVudHJ5LT5bMF0gKSBlcSAidXNlcnBhc3N3b3JkIiApOwogICAgICAgIG5leHQgRU5UUlkgaWYgJFNlZW5WYWx1ZXsgJEVudHJ5LT5bMl0gfSsrOwogICAgICAgICRCaW5kQ29sdW1ucysrOwogICAgICAgIHB1c2ggQEJpbmQsIFwkVmFsdWV7ICRFbnRyeS0+WzBdIH07CiAgICB9CgogICAgJFNRTCAuPSBqb2luICcsICcsICgnPycpIHggJEJpbmRDb2x1bW5zOwoKICAgIGlmICggISRTZWxmLT57Rm9yZWlnbkRCfSApIHsKICAgICAgICAkU1FMIC49ICcsIGN1cnJlbnRfdGltZXN0YW1wLCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPyc7CiAgICAgICAgcHVzaCBAQmluZCwgXCRQYXJhbXtVc2VySUR9OwogICAgICAgIHB1c2ggQEJpbmQsIFwkUGFyYW17VXNlcklEfTsKICAgIH0KCiAgICAkU1FMIC49ICcpJzsKCiAgICByZXR1cm4gaWYgISRTZWxmLT57REJPYmplY3R9LT5EbygKICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgQmluZCA9PiBcQEJpbmQKICAgICk7CgogICAgIyBsb2cgbm90aWNlCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnaW5mbycsCiAgICAgICAgTWVzc2FnZSAgPT4gIkN1c3RvbWVyVXNlcjogJyRQYXJhbXtVc2VyTG9naW59JyBjcmVhdGVkIHN1Y2Nlc3NmdWxseSAoJFBhcmFte1VzZXJJRH0pISIsCiAgICApOwoKICAgICMgc2V0IHBhc3N3b3JkCiAgICBpZiAoICRQYXJhbXtVc2VyUGFzc3dvcmR9ICkgewogICAgICAgICRTZWxmLT5TZXRQYXNzd29yZCgKICAgICAgICAgICAgVXNlckxvZ2luID0+ICRQYXJhbXtVc2VyTG9naW59LAogICAgICAgICAgICBQVyAgICAgICAgPT4gJFBhcmFte1VzZXJQYXNzd29yZH0KICAgICAgICApOwogICAgfQoKICAgICRTZWxmLT5fQ3VzdG9tZXJVc2VyQ2FjaGVDbGVhciggVXNlckxvZ2luID0+ICRQYXJhbXtVc2VyTG9naW59ICk7CgogICAgcmV0dXJuICRQYXJhbXtVc2VyTG9naW59Owp9CgpzdWIgQ3VzdG9tZXJVc2VyVXBkYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayByby9ydwogICAgaWYgKCAkU2VsZi0+e1JlYWRPbmx5fSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0N1c3RvbWVyIGJhY2tlbmQgaXMgcmVhZCBvbmx5IScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkRW50cnkgKCBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntNYXB9IH0gKSB7CiAgICAgICAgaWYgKAogICAgICAgICAgICAhJFBhcmFteyAkRW50cnktPlswXSB9CiAgICAgICAgICAgICYmICRFbnRyeS0+WzVdIG5lICdkeW5hbWljX2ZpZWxkJyAgICAjIGlnbm9yZSBkeW5hbWljIGZpZWxkcyBoZXJlCiAgICAgICAgICAgICYmICRFbnRyeS0+WzRdICAgICAgICAgICAgICAgICAgICAgICAjIG9ubHkgY2hlY2sgcmVxdWlyZWQgZmllbGRzCiAgICAgICAgICAgICYmICRFbnRyeS0+WzBdIG5lICdVc2VyUGFzc3dvcmQnICAgICAjIGlnbm9yZSBVc2VyUGFzc3dvcmQgZmllbGQKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEVudHJ5LT5bMF0hIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBjaGVjayBpdGVtIG9iamVjdAogICAgbXkgJENoZWNrSXRlbU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDaGVja0l0ZW0nKTsKCiAgICAjIGNoZWNrIGVtYWlsIGFkZHJlc3MKICAgIGlmICgKICAgICAgICAkUGFyYW17VXNlckVtYWlsfQogICAgICAgICYmICEkQ2hlY2tJdGVtT2JqZWN0LT5DaGVja0VtYWlsKCBBZGRyZXNzID0+ICRQYXJhbXtVc2VyRW1haWx9ICkKICAgICAgICAmJiBncmVwIHsgJF8gZXEgJFBhcmFte1ZhbGlkSUR9IH0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkSURzR2V0KCkKICAgICAgICApCiAgICB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJFbWFpbCBhZGRyZXNzICgkUGFyYW17VXNlckVtYWlsfSkgbm90IHZhbGlkICgiCiAgICAgICAgICAgICAgICAuICRDaGVja0l0ZW1PYmplY3QtPkNoZWNrRXJyb3IoKSAuICIpISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgb2xkIHVzZXIgZGF0YSAocHcpCiAgICBteSAlVXNlckRhdGEgPSAkU2VsZi0+Q3VzdG9tZXJVc2VyRGF0YUdldCggVXNlciA9PiAkUGFyYW17SUR9ICk7CgogICAgIyBpZiB3ZSB1cGRhdGUgdGhlIGVtYWlsIGFkZHJlc3MsIGNoZWNrIGlmIGl0IGFscmVhZHkgZXhpc3RzCiAgICBpZiAoCiAgICAgICAgJFBhcmFte1VzZXJFbWFpbH0KICAgICAgICAmJiAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJFbWFpbFVuaXFDaGVja30KICAgICAgICAmJiBsYyAkUGFyYW17VXNlckVtYWlsfSBuZSBsYyAkVXNlckRhdGF7VXNlckVtYWlsfQogICAgICAgICkKICAgIHsKICAgICAgICBteSAlUmVzdWx0ID0gJFNlbGYtPkN1c3RvbWVyU2VhcmNoKAogICAgICAgICAgICBWYWxpZCAgICAgICAgICAgID0+IDAsCiAgICAgICAgICAgIFBvc3RNYXN0ZXJTZWFyY2ggPT4gJFBhcmFte1VzZXJFbWFpbH0sCiAgICAgICAgKTsKICAgICAgICBpZiAoJVJlc3VsdCkgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Okxhbmd1YWdlJyktPlRyYW5zbGF0ZSgnVGhpcyBlbWFpbCBhZGRyZXNzIGlzIGFscmVhZHkgaW4gdXNlIGZvciBhbm90aGVyIGN1c3RvbWVyIHVzZXIuJyksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBxdW90ZSB2YWx1ZXMKICAgIG15ICVWYWx1ZTsKICAgIGZvciBteSAkRW50cnkgKCBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntNYXB9IH0gKSB7CiAgICAgICAgaWYgKCAkRW50cnktPls1XSA9fiAvXmludCQvaSApIHsKICAgICAgICAgICAgaWYgKCAkUGFyYW17ICRFbnRyeS0+WzBdIH0gKSB7CiAgICAgICAgICAgICAgICAkVmFsdWV7ICRFbnRyeS0+WzBdIH0gPSAkUGFyYW17ICRFbnRyeS0+WzBdIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkVmFsdWV7ICRFbnRyeS0+WzBdIH0gPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBpZiAoICRQYXJhbXsgJEVudHJ5LT5bMF0gfSApIHsKICAgICAgICAgICAgICAgICRWYWx1ZXsgJEVudHJ5LT5bMF0gfSA9ICRQYXJhbXsgJEVudHJ5LT5bMF0gfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRWYWx1ZXsgJEVudHJ5LT5bMF0gfSA9ICIiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgdXBkYXRlIGRiCiAgICBteSAkU1FMID0gIlVQREFURSAkU2VsZi0+e0N1c3RvbWVyVGFibGV9IFNFVCAiOwogICAgbXkgQEJpbmQ7CgogICAgbXkgJVNlZW5LZXk7ICAgICMgSWYgdGhlIG1hcCBjb250YWlucyBkdXBsaWNhdGVkIGZpZWxkIG5hbWVzLCBpbnNlcnQgb25seSBvbmNlLgogICAgRU5UUlk6CiAgICBmb3IgbXkgJEVudHJ5ICggQHsgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57TWFwfSB9ICkgewogICAgICAgIG5leHQgRU5UUlkgaWYgJEVudHJ5LT5bNV0gZXEgJ2R5bmFtaWNfZmllbGQnOyAgICAgICAgICAgICMgc2tpcCBkeW5hbWljIGZpZWxkcwogICAgICAgIG5leHQgRU5UUlkgaWYgJEVudHJ5LT5bN107ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc2tpcCByZWFkb25seSBmaWVsZHMKICAgICAgICBuZXh0IEVOVFJZIGlmICggbGMoICRFbnRyeS0+WzBdICkgZXEgInVzZXJwYXNzd29yZCIgKTsKICAgICAgICBuZXh0IEVOVFJZIGlmICRTZWVuS2V5eyAkRW50cnktPlsyXSB9Kys7CiAgICAgICAgJFNRTCAuPSAiICRFbnRyeS0+WzJdID0gPywgIjsKICAgICAgICBwdXNoIEBCaW5kLCBcJFZhbHVleyAkRW50cnktPlswXSB9OwogICAgfQoKICAgIGlmICggISRTZWxmLT57Rm9yZWlnbkRCfSApIHsKICAgICAgICAkU1FMIC49ICdjaGFuZ2VfdGltZSA9IGN1cnJlbnRfdGltZXN0YW1wLCBjaGFuZ2VfYnkgPSA/JzsKICAgICAgICBwdXNoIEBCaW5kLCBcJFBhcmFte1VzZXJJRH07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBjaG9wICRTUUw7CiAgICAgICAgY2hvcCAkU1FMOwogICAgfQoKICAgICRTUUwgLj0gJyBXSEVSRSAnOwoKICAgIGlmICggJFNlbGYtPntDYXNlU2Vuc2l0aXZlfSApIHsKICAgICAgICAkU1FMIC49ICIkU2VsZi0+e0N1c3RvbWVyS2V5fSA9ID8iOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNRTCAuPSAiTE9XRVIoJFNlbGYtPntDdXN0b21lcktleX0pID0gTE9XRVIoPykiOwogICAgfQogICAgcHVzaCBAQmluZCwgXCRQYXJhbXtJRH07CgogICAgcmV0dXJuIGlmICEkU2VsZi0+e0RCT2JqZWN0fS0+RG8oCiAgICAgICAgU1FMICA9PiAkU1FMLAogICAgICAgIEJpbmQgPT4gXEBCaW5kCiAgICApOwoKICAgICMgY2hlY2sgaWYgd2UgbmVlZCB0byB1cGRhdGUgQ3VzdG9tZXIgUHJlZmVyZW5jZXMKICAgIGlmICggJFBhcmFte1VzZXJMb2dpbn0gbmUgJFVzZXJEYXRhe1VzZXJMb2dpbn0gKSB7CgogICAgICAgICMgdXBkYXRlIHRoZSBwcmVmZXJlbmNlcwogICAgICAgICRTZWxmLT57UHJlZmVyZW5jZXNPYmplY3R9LT5SZW5hbWVQcmVmZXJlbmNlcygKICAgICAgICAgICAgTmV3VXNlcklEID0+ICRQYXJhbXtVc2VyTG9naW59LAogICAgICAgICAgICBPbGRVc2VySUQgPT4gJFVzZXJEYXRhe1VzZXJMb2dpbn0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGxvZyBub3RpY2UKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdpbmZvJywKICAgICAgICBNZXNzYWdlICA9PiAiQ3VzdG9tZXJVc2VyOiAnJFBhcmFte1VzZXJMb2dpbn0nIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5ICgkUGFyYW17VXNlcklEfSkhIiwKICAgICk7CgogICAgIyBjaGVjayBwdwogICAgaWYgKCAkUGFyYW17VXNlclBhc3N3b3JkfSApIHsKICAgICAgICAkU2VsZi0+U2V0UGFzc3dvcmQoCiAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkUGFyYW17VXNlckxvZ2lufSwKICAgICAgICAgICAgUFcgICAgICAgID0+ICRQYXJhbXtVc2VyUGFzc3dvcmR9CiAgICAgICAgKTsKICAgIH0KCiAgICAkU2VsZi0+X0N1c3RvbWVyVXNlckNhY2hlQ2xlYXIoIFVzZXJMb2dpbiA9PiAkUGFyYW17VXNlckxvZ2lufSApOwogICAgaWYgKCAkUGFyYW17VXNlckxvZ2lufSBuZSAkVXNlckRhdGF7VXNlckxvZ2lufSApIHsKICAgICAgICAkU2VsZi0+X0N1c3RvbWVyVXNlckNhY2hlQ2xlYXIoIFVzZXJMb2dpbiA9PiAkVXNlckRhdGF7VXNlckxvZ2lufSApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgU2V0UGFzc3dvcmQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIFRoaXMgbWV0aG9kIGlzIHNpbWlsYXIgdG8gS2VybmVsOjpTeXN0ZW06OlVzZXI6OlNldFBhc3N3b3JkKCkKCiAgICAjIGNoZWNrIHJvL3J3CiAgICBpZiAoICRTZWxmLT57UmVhZE9ubHl9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnQ3VzdG9tZXIgYmFja2VuZCBpcyByZWFkIG9ubHkhJywKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJExvZ2luID0gJFBhcmFte1VzZXJMb2dpbn07CiAgICBteSAkUHcgICAgPSAkUGFyYW17UFd9IHx8ICcnOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkTG9naW4gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJMb2dpbiEnLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIFRPRE86IGFkZCBjaGVjayB3aGV0aGVyIHRoZSBDdXN0b21lclVzZXIgZXhpc3RzCgogICAgbXkgJENyeXB0ZWRQdyA9ICcnOwoKICAgIG15ICRDb25maWdPYmplY3QgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRDb25maWdTZWN0aW9uID0gJ0N1c3RvbWVyOjpBdXRoTW9kdWxlOjpEQic7CgogICAgbXkgJENyeXB0VHlwZSA9ICRDb25maWdPYmplY3QtPkdldCgiJHtDb25maWdTZWN0aW9ufTo6Q3J5cHRUeXBlIikgfHwgJ3NoYTInOwoKICAgIG15ICRFbmNvZGVPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW5jb2RlJyk7CgogICAgIyBjcnlwdCBwbGFpbiAobm8gY3J5cHQgYXQgYWxsKQogICAgaWYgKCAkQ3J5cHRUeXBlIGVxICdwbGFpbicgKSB7CiAgICAgICAgJENyeXB0ZWRQdyA9ICRQdzsKICAgIH0KCiAgICAjIGNyeXB0IHdpdGggVU5JWCBjcnlwdAogICAgZWxzaWYgKCAkQ3J5cHRUeXBlIGVxICdjcnlwdCcgKSB7CgogICAgICAgICMgZW5jb2RlIG91dHB1dCwgbmVlZGVkIGJ5IGNyeXB0KCkgb25seSBub24gdXRmOCBzaWducwogICAgICAgICRFbmNvZGVPYmplY3QtPkVuY29kZU91dHB1dCggXCRQdyApOwogICAgICAgICRFbmNvZGVPYmplY3QtPkVuY29kZU91dHB1dCggXCRMb2dpbiApOwoKICAgICAgICAkQ3J5cHRlZFB3ID0gY3J5cHQoICRQdywgJExvZ2luICk7CiAgICAgICAgJEVuY29kZU9iamVjdC0+RW5jb2RlSW5wdXQoIFwkQ3J5cHRlZFB3ICk7CiAgICB9CgogICAgIyBjcnlwdCB3aXRoIHVuaXhfbWQ1X2NyeXB0CiAgICBlbHNpZiAoICRDcnlwdFR5cGUgZXEgJ21kNScgKSB7CgogICAgICAgICMgZW5jb2RlIG91dHB1dCwgbmVlZGVkIGJ5IHVuaXhfbWQ1X2NyeXB0KCkgb25seSBub24gdXRmOCBzaWducwogICAgICAgICRFbmNvZGVPYmplY3QtPkVuY29kZU91dHB1dCggXCRQdyApOwogICAgICAgICRFbmNvZGVPYmplY3QtPkVuY29kZU91dHB1dCggXCRMb2dpbiApOwoKICAgICAgICAkQ3J5cHRlZFB3ID0gdW5peF9tZDVfY3J5cHQoICRQdywgJExvZ2luICk7CiAgICAgICAgJEVuY29kZU9iamVjdC0+RW5jb2RlSW5wdXQoIFwkQ3J5cHRlZFB3ICk7CiAgICB9CgogICAgIyBjcnlwdCB3aXRoIG1kNSAoY29tcGF0aWJsZSB3aXRoIEFwYWNoZSdzIC5odHBhc3N3ZCBmaWxlcykKICAgIGVsc2lmICggJENyeXB0VHlwZSBlcSAnYXByMScgKSB7CgogICAgICAgICMgZW5jb2RlIG91dHB1dCwgbmVlZGVkIGJ5IGFwYWNoZV9tZDVfY3J5cHQoKSBvbmx5IG5vbiB1dGY4IHNpZ25zCiAgICAgICAgJEVuY29kZU9iamVjdC0+RW5jb2RlT3V0cHV0KCBcJFB3ICk7CiAgICAgICAgJEVuY29kZU9iamVjdC0+RW5jb2RlT3V0cHV0KCBcJExvZ2luICk7CgogICAgICAgICRDcnlwdGVkUHcgPSBhcGFjaGVfbWQ1X2NyeXB0KCAkUHcsICRMb2dpbiApOwogICAgICAgICRFbmNvZGVPYmplY3QtPkVuY29kZUlucHV0KCBcJENyeXB0ZWRQdyApOwogICAgfQoKICAgICMgY3J5cHQgd2l0aCBzaGExCiAgICBlbHNpZiAoICRDcnlwdFR5cGUgZXEgJ3NoYTEnICkgewoKICAgICAgICBteSAkU0hBT2JqZWN0ID0gRGlnZXN0OjpTSEEtPm5ldygnc2hhMScpOwogICAgICAgICRFbmNvZGVPYmplY3QtPkVuY29kZU91dHB1dCggXCRQdyApOwogICAgICAgICRTSEFPYmplY3QtPmFkZCgkUHcpOwogICAgICAgICRDcnlwdGVkUHcgPSAkU0hBT2JqZWN0LT5oZXhkaWdlc3QoKTsKICAgIH0KCiAgICAjIGNyeXB0IHdpdGggc2hhNTEyCiAgICBlbHNpZiAoICRDcnlwdFR5cGUgZXEgJ3NoYTUxMicgKSB7CgogICAgICAgIG15ICRTSEFPYmplY3QgPSBEaWdlc3Q6OlNIQS0+bmV3KCdzaGE1MTInKTsKICAgICAgICAkRW5jb2RlT2JqZWN0LT5FbmNvZGVPdXRwdXQoIFwkUHcgKTsKICAgICAgICAkU0hBT2JqZWN0LT5hZGQoJFB3KTsKICAgICAgICAkQ3J5cHRlZFB3ID0gJFNIQU9iamVjdC0+aGV4ZGlnZXN0KCk7CiAgICB9CgogICAgIyBiY3J5cHQKICAgIGVsc2lmICggJENyeXB0VHlwZSBlcSAnYmNyeXB0JyApIHsKCiAgICAgICAgbXkgJE1haW5PYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwoKICAgICAgICBpZiAoICEkTWFpbk9iamVjdC0+UmVxdWlyZSgnQ3J5cHQ6OkVrc2Jsb3dmaXNoOjpCY3J5cHQnKSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkN1c3RvbWVyVXNlcjogJyRMb2dpbicgdHJpZWQgdG8gc3RvcmUgcGFzc3dvcmQgd2l0aCBiY3J5cHQgYnV0ICdDcnlwdDo6RWtzYmxvd2Zpc2g6OkJjcnlwdCcgaXMgbm90IGluc3RhbGxlZCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBteSAkQ29zdCA9ICRDb25maWdPYmplY3QtPkdldCgiJHtDb25maWdTZWN0aW9ufTo6YmNyeXB0Q29zdCIpIC8vIDEyOwoKICAgICAgICAjIERvbid0IGFsbG93IHZhbHVlcyBzbWFsbGVyIHRoYW4gOSBmb3Igc2VjdXJpdHkuCiAgICAgICAgJENvc3QgPSA5IGlmICRDb3N0IDwgOTsKCiAgICAgICAgIyBDdXJyZW50IENyeXB0OjpFa3NibG93ZmlzaDo6QmNyeXB0IGxpbWl0IGlzIDMxLgogICAgICAgICRDb3N0ID0gMzEgaWYgJENvc3QgPiAzMTsKCiAgICAgICAgbXkgJFNhbHQgPSAkTWFpbk9iamVjdC0+R2VuZXJhdGVSYW5kb21TdHJpbmcoIExlbmd0aCA9PiAxNiApOwoKICAgICAgICAjIHJlbW92ZSBVVEY4IGZsYWcsIHJlcXVpcmVkIGJ5IENyeXB0OjpFa3NibG93ZmlzaDo6QmNyeXB0CiAgICAgICAgJEVuY29kZU9iamVjdC0+RW5jb2RlT3V0cHV0KCBcJFB3ICk7CgogICAgICAgICMgY2FsY3VsYXRlIHBhc3N3b3JkIGhhc2gKICAgICAgICBteSAkT2N0ZXRzID0gQ3J5cHQ6OkVrc2Jsb3dmaXNoOjpCY3J5cHQ6OmJjcnlwdF9oYXNoKAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBrZXlfbnVsID0+IDEsCiAgICAgICAgICAgICAgICBjb3N0ICAgID0+ICRDb3N0LAogICAgICAgICAgICAgICAgc2FsdCAgICA9PiAkU2FsdCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgJFB3CiAgICAgICAgKTsKCiAgICAgICAgIyBXZSB3aWxsIHN0b3JlIGNvc3QgYW5kIHNhbHQgaW4gdGhlIHBhc3N3b3JkIHN0cmluZyBzbyB0aGF0IGl0IGNhbiBiZSBkZWNvZGVkCiAgICAgICAgIyAgIGluIGZ1dHVyZSBldmVuIGlmIHdlIHVzZSBhIGhpZ2hlciBjb3N0IGJ5IGRlZmF1bHQuCiAgICAgICAgJENyeXB0ZWRQdyA9ICJCQ1JZUFQ6JENvc3Q6JFNhbHQ6IiAuIENyeXB0OjpFa3NibG93ZmlzaDo6QmNyeXB0Ojplbl9iYXNlNjQoJE9jdGV0cyk7CiAgICB9CgogICAgIyBjcnlwdCB3aXRoIHNoYTI1NiBhcyBmYWxsYmFjawogICAgZWxzZSB7CgogICAgICAgIG15ICRTSEFPYmplY3QgPSBEaWdlc3Q6OlNIQS0+bmV3KCdzaGEyNTYnKTsKCiAgICAgICAgIyBlbmNvZGUgb3V0cHV0LCBuZWVkZWQgYnkgc2hhMjU2X2hleCgpIG9ubHkgbm9uIHV0Zjggc2lnbnMKICAgICAgICAkRW5jb2RlT2JqZWN0LT5FbmNvZGVPdXRwdXQoIFwkUHcgKTsKCiAgICAgICAgJFNIQU9iamVjdC0+YWRkKCRQdyk7CiAgICAgICAgJENyeXB0ZWRQdyA9ICRTSEFPYmplY3QtPmhleGRpZ2VzdCgpOwogICAgfQoKICAgICMgdXBkYXRlIGRiCiAgICBmb3IgbXkgJEVudHJ5ICggQHsgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57TWFwfSB9ICkgewogICAgICAgIGlmICggJEVudHJ5LT5bMF0gPX4gL15Vc2VyUGFzc3dvcmQkL2kgKSB7CiAgICAgICAgICAgICRQYXJhbXtQYXNzd29yZENvbH0gPSAkRW50cnktPlsyXTsKICAgICAgICB9CiAgICAgICAgaWYgKCAkRW50cnktPlswXSA9fiAvXlVzZXJMb2dpbiQvaSApIHsKICAgICAgICAgICAgJFBhcmFte0xvZ2luQ29sfSA9ICRFbnRyeS0+WzJdOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNoZWNrIGlmIG5lZWRlZCBwdyBjb2wuIGV4aXN0cyAoZWxzZSB0aGVyZSBpcyBubyBwdyBjb2wuKQogICAgaWYgKCAkUGFyYW17UGFzc3dvcmRDb2x9ICYmICRQYXJhbXtMb2dpbkNvbH0gKSB7CiAgICAgICAgbXkgJFNRTCA9ICJVUERBVEUgJFNlbGYtPntDdXN0b21lclRhYmxlfSBTRVQgIgogICAgICAgICAgICAuICIgJFBhcmFte1Bhc3N3b3JkQ29sfSA9ID8gIgogICAgICAgICAgICAuICIgV0hFUkUgIjsKCiAgICAgICAgaWYgKCAkU2VsZi0+e0Nhc2VTZW5zaXRpdmV9ICkgewogICAgICAgICAgICAkU1FMIC49ICIkUGFyYW17TG9naW5Db2x9ID0gPyI7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU1FMIC49ICJMT1dFUigkUGFyYW17TG9naW5Db2x9KSA9IExPV0VSKD8pIjsKICAgICAgICB9CgogICAgICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgID0+ICRTUUwsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJENyeXB0ZWRQdywgXCRQYXJhbXtVc2VyTG9naW59IF0sCiAgICAgICAgKTsKCiAgICAgICAgIyBsb2cgbm90aWNlCiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ3VzdG9tZXJVc2VyOiAnJFBhcmFte1VzZXJMb2dpbn0nIGNoYW5nZWQgcGFzc3dvcmQgc3VjY2Vzc2Z1bGx5ISIsCiAgICAgICAgKTsKCiAgICAgICAgJFNlbGYtPl9DdXN0b21lclVzZXJDYWNoZUNsZWFyKCBVc2VyTG9naW4gPT4gJFBhcmFte1VzZXJMb2dpbn0gKTsKCiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgIyBuZWVkIG5vIHB3IHRvIHNldAogICAgcmV0dXJuIDE7Cn0KCnN1YiBHZW5lcmF0ZVJhbmRvbVBhc3N3b3JkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBnZW5lcmF0ZWQgcGFzc3dvcmRzIGFyZSBlaWdodCBjaGFyYWN0ZXJzIGxvbmcgYnkgZGVmYXVsdAogICAgbXkgJFNpemUgPSAkUGFyYW17U2l6ZX0gfHwgODsKCiAgICBteSAkUGFzc3dvcmQgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpLT5HZW5lcmF0ZVJhbmRvbVN0cmluZygKICAgICAgICBMZW5ndGggPT4gJFNpemUsCiAgICApOwoKICAgIHJldHVybiAkUGFzc3dvcmQ7Cn0KCnN1YiBTZXRQcmVmZXJlbmNlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtcwogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJJRCEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICRTZWxmLT5fQ3VzdG9tZXJVc2VyQ2FjaGVDbGVhciggVXNlckxvZ2luID0+ICRQYXJhbXtVc2VySUR9ICk7CgogICAgcmV0dXJuICRTZWxmLT57UHJlZmVyZW5jZXNPYmplY3R9LT5TZXRQcmVmZXJlbmNlcyglUGFyYW0pOwp9CgpzdWIgR2V0UHJlZmVyZW5jZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBwYXJhbXMKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VySUQhJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGYtPntQcmVmZXJlbmNlc09iamVjdH0tPkdldFByZWZlcmVuY2VzKCVQYXJhbSk7Cn0KCnN1YiBTZWFyY2hQcmVmZXJlbmNlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAkU2VsZi0+e1ByZWZlcmVuY2VzT2JqZWN0fS0+U2VhcmNoUHJlZmVyZW5jZXMoJVBhcmFtKTsKfQoKc3ViIF9DdXN0b21lclVzZXJDYWNoZUNsZWFyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICEkU2VsZi0+e0NhY2hlT2JqZWN0fTsKCiAgICBpZiAoICEkUGFyYW17VXNlckxvZ2lufSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlckxvZ2luIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPkRlbGV0ZSgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICJDdXN0b21lclVzZXJEYXRhR2V0OjokUGFyYW17VXNlckxvZ2lufSIsCiAgICApOwogICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPkRlbGV0ZSgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICJDdXN0b21lck5hbWU6OiRQYXJhbXtVc2VyTG9naW59IiwKICAgICk7CiAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+RGVsZXRlKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgIEtleSAgPT4gIkN1c3RvbWVySURzOjokUGFyYW17VXNlckxvZ2lufSIsCiAgICApOwoKICAgICMgZGVsZXRlIGFsbCBzZWFyY2ggY2FjaGUgZW50cmllcwogICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVySURMaXN0JywKICAgICk7CiAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+Q2xlYW5VcCgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdfQ3VzdG9tZXJTZWFyY2gnLAogICAgKTsKICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9IC4gJ19DdXN0b21lclNlYXJjaERldGFpbCcsCiAgICApOwogICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVyU2VhcmNoRGV0YWlsRHluYW1pY0ZpZWxkcycsCiAgICApOwoKICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5DbGVhblVwKAogICAgICAgIFR5cGUgPT4gJ0N1c3RvbWVyR3JvdXAnLAogICAgKTsKCiAgICBmb3IgbXkgJEZ1bmN0aW9uIChxdyhDdXN0b21lclVzZXJMaXN0KSkgewogICAgICAgIGZvciBteSAkVmFsaWQgKCAwIC4uIDEgKSB7CiAgICAgICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5EZWxldGUoCiAgICAgICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgICAgIEtleSAgPT4gIiR7RnVuY3Rpb259Ojoke1ZhbGlkfSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgREVTVFJPWSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgZGlzY29ubmVjdCBpZiBpdCdzIG5vdCBhIHBhcmVudCBEQk9iamVjdAogICAgaWYgKCAkU2VsZi0+e05vdFBhcmVudERCT2JqZWN0fSApIHsKICAgICAgICBpZiAoICRTZWxmLT57REJPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0RCT2JqZWN0fS0+RGlzY29ubmVjdCgpOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gMTsKfQoKMTsK</File>
        <File Location="Custom/Kernel/System/CustomerUser/LDAP.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSA2ZWZkYzdiZjJhMzMyNTI3N2NkNzlhNjBmMGYyNDA3ZjhhZDU5ZTg3IC0gS2VybmVsL1N5c3RlbS9DdXN0b21lclVzZXIvTERBUC5wbQojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXI6OkxEQVA7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgTmV0OjpMREFQOwp1c2UgTmV0OjpMREFQOjpVdGlsIHF3KGVzY2FwZV9maWx0ZXJfdmFsdWUpOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpWYXJpYWJsZUNoZWNrIHF3KDphbGwpOwoKb3VyIEBPYmplY3REZXBlbmRlbmNpZXMgPSAoCiAgICAnS2VybmVsOjpDb25maWcnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScsCiAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICdLZXJuZWw6OlN5c3RlbTo6REInLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnLAojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcsCiMgRU8gUm90aGVyIE9TUwogICAgJ0tlcm5lbDo6U3lzdGVtOjpMb2cnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpNYWluJywKKTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgZGF0YQogICAgZm9yIG15ICROZWVkZWQgKHF3KCBQcmVmZXJlbmNlc09iamVjdCBDdXN0b21lclVzZXJNYXAgKSkgewogICAgICAgICRTZWxmLT57JE5lZWRlZH0gPSAkUGFyYW17JE5lZWRlZH0gfHwgZGllICJHb3Qgbm8gJE5lZWRlZCEiOwogICAgfQoKICAgICMgbWF4IHNob3duIHVzZXIgYSBzZWFyY2ggbGlzdAogICAgJFNlbGYtPntVc2VyU2VhcmNoTGlzdExpbWl0fSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlclNlYXJjaExpc3RMaW1pdH0gfHwgMjAwOwoKICAgICMgZ2V0IGxkYXAgcHJlZmVyZW5jZXMKICAgICRTZWxmLT57RGllfSA9IDA7CiAgICBpZiAoIGRlZmluZWQgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e0RpZX0gKSB7CiAgICAgICAgJFNlbGYtPntEaWV9ID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e0RpZX07CiAgICB9CgogICAgIyBnZXQgY29uZmlnIG9iamVjdAogICAgbXkgJENvbmZpZ09iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CgogICAgIyBwYXJhbXMKICAgIGlmICggJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e1BhcmFtc30gKSB7CiAgICAgICAgJFNlbGYtPntQYXJhbXN9ID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e1BhcmFtc307CiAgICB9CgogICAgIyBOZXQ6OkxEQVAgbmV3IHBhcmFtcwogICAgZWxzaWYgKCAkQ29uZmlnT2JqZWN0LT5HZXQoICdBdXRoTW9kdWxlOjpMREFQOjpQYXJhbXMnIC4gJFBhcmFte0NvdW50fSApICkgewogICAgICAgICRTZWxmLT57UGFyYW1zfSA9ICRDb25maWdPYmplY3QtPkdldCggJ0F1dGhNb2R1bGU6OkxEQVA6OlBhcmFtcycgLiAkUGFyYW17Q291bnR9ICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+e1BhcmFtc30gPSB7fTsKICAgIH0KCiAgICAkU2VsZi0+e1N0YXJ0VExTfSA9ICRDb25maWdPYmplY3QtPkdldCggJ0F1dGhNb2R1bGU6OkxEQVA6OlN0YXJ0VExTJyAuICRQYXJhbXtDb3VudH0gKSB8fCAnJzsKCiAgICAjIGhvc3QKICAgIGlmICggJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e0hvc3R9ICkgewogICAgICAgICRTZWxmLT57SG9zdH0gPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntQYXJhbXN9LT57SG9zdH07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ3VzdG9tZXJVc2VyLT5QYXJhbXMtPkhvc3QgaW4gS2VybmVsL0NvbmZpZy5wbScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBiYXNlIGRuCiAgICBpZiAoIGRlZmluZWQgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e0Jhc2VETn0gKSB7CiAgICAgICAgJFNlbGYtPntCYXNlRE59ID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e0Jhc2VETn07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgQ3VzdG9tZXJVc2VyLT5QYXJhbXMtPkJhc2VETiBpbiBLZXJuZWwvQ29uZmlnLnBtJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIHNjb3BlCiAgICBpZiAoICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1BhcmFtc30tPntTU0NPUEV9ICkgewogICAgICAgICRTZWxmLT57U1Njb3BlfSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1BhcmFtc30tPntTU0NPUEV9OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEN1c3RvbWVyVXNlci0+UGFyYW1zLT5TU0NPUEUgaW4gS2VybmVsL0NvbmZpZy5wbScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBzZWFyY2ggdXNlcgogICAgJFNlbGYtPntTZWFyY2hVc2VyRE59ID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e1VzZXJETn0gfHwgJyc7CiAgICAkU2VsZi0+e1NlYXJjaFVzZXJQd30gPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntQYXJhbXN9LT57VXNlclB3fSB8fCAnJzsKCiAgICAjIGdyb3VwIGRuCiAgICAkU2VsZi0+e0dyb3VwRE59ID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57UGFyYW1zfS0+e0dyb3VwRE59IHx8ICcnOwoKICAgICMgY3VzdG9tZXIga2V5CiAgICBpZiAoICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyS2V5fSApIHsKICAgICAgICAkU2VsZi0+e0N1c3RvbWVyS2V5fSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyS2V5fTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBDdXN0b21lclVzZXItPkN1c3RvbWVyS2V5IGluIEtlcm5lbC9Db25maWcucG0nLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3VzdG9tZXIgaWQKICAgIGlmICggJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJJRH0gKSB7CiAgICAgICAgJFNlbGYtPntDdXN0b21lcklEfSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVySUR9OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEN1c3RvbWVyVXNlci0+Q3VzdG9tZXJJRCBpbiBLZXJuZWwvQ29uZmlnLnBtJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGxkYXAgZmlsdGVyIGFsd2F5cyB1c2VkCiAgICAkU2VsZi0+e0Fsd2F5c0ZpbHRlcn0gPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntQYXJhbXN9LT57QWx3YXlzRmlsdGVyfSB8fCAnJzsKCiAgICAkU2VsZi0+e0V4Y2x1ZGVQcmltYXJ5Q3VzdG9tZXJJRH0gPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJFeGNsdWRlUHJpbWFyeUN1c3RvbWVySUR9IHx8IDA7CiAgICAkU2VsZi0+e1NlYXJjaFByZWZpeH0gICAgICAgICAgICAgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJTZWFyY2hQcmVmaXh9OwogICAgaWYgKCAhZGVmaW5lZCAkU2VsZi0+e1NlYXJjaFByZWZpeH0gKSB7CiAgICAgICAgJFNlbGYtPntTZWFyY2hQcmVmaXh9ID0gJyc7CiAgICB9CiAgICAkU2VsZi0+e1NlYXJjaFN1ZmZpeH0gPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJTZWFyY2hTdWZmaXh9OwogICAgaWYgKCAhZGVmaW5lZCAkU2VsZi0+e1NlYXJjaFN1ZmZpeH0gKSB7CiAgICAgICAgJFNlbGYtPntTZWFyY2hTdWZmaXh9ID0gJyonOwogICAgfQoKICAgICMgY2hhcnNldCBzZXR0aW5ncwogICAgJFNlbGYtPntTb3VyY2VDaGFyc2V0fSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e1BhcmFtc30tPntTb3VyY2VDaGFyc2V0fSB8fCAnJzsKCiAgICAjIHNldCBjYWNoZSB0eXBlCiAgICAkU2VsZi0+e0NhY2hlVHlwZX0gPSAnQ3VzdG9tZXJVc2VyJyAuICRQYXJhbXtDb3VudH07CgogICAgIyBjcmVhdGUgY2FjaGUgb2JqZWN0LCBidXQgb25seSBpZiBDYWNoZVRUTCBpcyBzZXQgaW4gY3VzdG9tZXIgY29uZmlnCiAgICBpZiAoICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0NhY2hlVFRMfSApIHsKICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpOwogICAgfQoKICAgICMgZ2V0IHZhbGlkIGZpbHRlciBpZiB1c2VkCiAgICAkU2VsZi0+e1ZhbGlkRmlsdGVyfSA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlclZhbGlkRmlsdGVyfSB8fCAnJzsKCiAgICAjIGNvbm5lY3QgZmlyc3QgaWYgRGllIGlzIGVuYWJsZWQsIG1ha2Ugc3VyZSB0aGF0IGNvbm5lY3Rpb24gaXMgcG9zc2libGUsIGVsc2UgZGllCiAgICBpZiAoICRTZWxmLT57RGllfSApIHsKICAgICAgICByZXR1cm4gaWYgISRTZWxmLT5fQ29ubmVjdCgpOwogICAgfQoKICAgICMgZmV0Y2ggbmFtZXMgb2YgY29uZmlndXJlZCBkeW5hbWljIGZpZWxkcwogICAgbXkgQER5bmFtaWNGaWVsZE1hcEVudHJpZXMgPSBncmVwIHsgJF8tPls1XSBlcSAnZHluYW1pY19maWVsZCcgfSBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntNYXB9IH07CiAgICAkU2VsZi0+e0NvbmZpZ3VyZWREeW5hbWljRmllbGROYW1lc30gPSB7IG1hcCB7ICRfLT5bMl0gPT4gMSB9IEBEeW5hbWljRmllbGRNYXBFbnRyaWVzIH07CgojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgbXkgJExheW91dFBhcmFtID0gJEtlcm5lbDo6T00tPntQYXJhbX0tPnsnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCd9OwoKICAgICMgQ2hlY2sgaWYgbXVsdGl0ZW5hbmN5IGlzIGVuYWJsZWQgYW5kIHRoZSByZXF1ZXN0IGlzIGNvbWluZyBmcm9tIGEgdXNlci4KICAgIGlmICggJExheW91dFBhcmFtLT57VXNlclR5cGV9ICYmICRMYXlvdXRQYXJhbS0+e1VzZXJUeXBlfSBlcSAnVXNlcicgJiYgJENvbmZpZ09iamVjdC0+R2V0KCdNdWx0aXRlbmFuY3knKSApIHsKCiAgICAgICAgIyBTYXZlIHRoZSBVc2VySUQgYW5kIGFsbCBncm91cHMgdGhlIHVzZXIgaGFzICdybycgcGVybWlzc2lvbiBvbi4KICAgICAgICBpZiAoICRMYXlvdXRQYXJhbS0+e1VzZXJJRH0gKSB7CiAgICAgICAgICAgICMgT25seSBnZXQgdGhlIGdyb3VwIGxpc3Qgb25jZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4KICAgICAgICAgICAgbXkgJUdyb3VwcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5QZXJtaXNzaW9uVXNlckdldCgKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkTGF5b3V0UGFyYW0tPntVc2VySUR9LAogICAgICAgICAgICAgICAgVHlwZSAgID0+ICdybycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIFRoZSBsaW1pdCBkb2VzIG5vdCBjb3VudCBmb3IgbWVtYmVycyBvZiBhIHNwZWNpZmljIGdyb3VwLgogICAgICAgICAgICBteSAkUGVybWlzc2lvbkdyb3VwID0gJENvbmZpZ09iamVjdC0+R2V0KCdNdWx0aXRlbmFuY3k6OlBlcm1pc3Npb25Hcm91cCcpIHx8ICcnOwogICAgICAgICAgICBteSAlR3JvdXBzUmV2ZXJzZSAgID0gcmV2ZXJzZSAlR3JvdXBzOwoKICAgICAgICAgICAgaWYgKCAhJEdyb3Vwc1JldmVyc2V7JFBlcm1pc3Npb25Hcm91cH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e011bHRpdGVuYW5jeX0gPSAkTGF5b3V0UGFyYW0tPntVc2VySUR9OwogICAgICAgICAgICAgICAgJFNlbGYtPntVc2VyR3JvdXBJRHN9ID0gWyBzb3J0IGtleXMgJUdyb3VwcyBdOwogICAgICAgICAgICAgICAgJFNlbGYtPntVc2VyR3JvdXBzfSAgID0gWyB2YWx1ZXMgJUdyb3VwcyBdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgX0Nvbm5lY3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHJldHVybiBpZiBjb25uZWN0aW9uIGlzIGFscmVhZHkgb3BlbgogICAgcmV0dXJuIDEgaWYgJFNlbGYtPntMREFQfTsKCiAgICAjIGxkYXAgY29ubmVjdCBhbmQgYmluZCAobWF5YmUgd2l0aCBTZWFyY2hVc2VyRE4gYW5kIFNlYXJjaFVzZXJQdykKICAgICRTZWxmLT57TERBUH0gPSBOZXQ6OkxEQVAtPm5ldyggJFNlbGYtPntIb3N0fSwgJXsgJFNlbGYtPntQYXJhbXN9IH0gKTsKCiAgICBpZiAoICEkU2VsZi0+e0xEQVB9ICkgewogICAgICAgIGlmICggJFNlbGYtPntEaWV9ICkgewogICAgICAgICAgICBkaWUgIkNhbid0IGNvbm5lY3QgdG8gJFNlbGYtPntIb3N0fTogJEAiOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGNvbm5lY3QgdG8gJFNlbGYtPntIb3N0fTogJEAiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKCAkU2VsZi0+e1N0YXJ0VExTfSApIHsKICAgICAgICBteSAkU3RhcnRlZCA9ICRTZWxmLT57TERBUH0tPnN0YXJ0X3RscyggdmVyaWZ5ID0+ICRTZWxmLT57U3RhcnRUTFN9ICk7CiAgICAgICAgaWYgKCAhJFN0YXJ0ZWQgKSB7CiAgICAgICAgICAgIGlmICggJFNlbGYtPntEaWV9ICkgewogICAgICAgICAgICAgICAgZGllICJzdGFydF90bHMgb24gJFNlbGYtPntIb3N0fSBmYWlsZWQ6ICRAIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gInN0YXJ0X3RsczogJyRTZWxmLT57U3RhcnRUTFN9JyBvbiAkU2VsZi0+e0hvc3R9IGZhaWxlZDogJEAiLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRTZWxmLT57TERBUH0tPmRpc2Nvbm5lY3QoKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBteSAkUmVzdWx0OwogICAgaWYgKCAkU2VsZi0+e1NlYXJjaFVzZXJETn0gJiYgJFNlbGYtPntTZWFyY2hVc2VyUHd9ICkgewogICAgICAgICRSZXN1bHQgPSAkU2VsZi0+e0xEQVB9LT5iaW5kKAogICAgICAgICAgICBkbiAgICAgICA9PiAkU2VsZi0+e1NlYXJjaFVzZXJETn0sCiAgICAgICAgICAgIHBhc3N3b3JkID0+ICRTZWxmLT57U2VhcmNoVXNlclB3fSwKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFJlc3VsdCA9ICRTZWxmLT57TERBUH0tPmJpbmQoKTsKICAgIH0KCiAgICBpZiAoICRSZXN1bHQtPmNvZGUoKSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0ZpcnN0IGJpbmQgZmFpbGVkISAnIC4gJFJlc3VsdC0+ZXJyb3IoKSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TERBUH0tPmRpc2Nvbm5lY3QoKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBDdXN0b21lck5hbWUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJMb2dpbn0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJMb2dpbiEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBidWlsZCBmaWx0ZXIKICAgIG15ICRGaWx0ZXIgPSAiKCRTZWxmLT57Q3VzdG9tZXJLZXl9PSIgLiBlc2NhcGVfZmlsdGVyX3ZhbHVlKCAkUGFyYW17VXNlckxvZ2lufSApIC4gJyknOwoKICAgICMgcHJlcGFyZSBmaWx0ZXIKICAgIGlmICggJFNlbGYtPntBbHdheXNGaWx0ZXJ9ICkgewogICAgICAgICRGaWx0ZXIgPSAiKCYkRmlsdGVyJFNlbGYtPntBbHdheXNGaWx0ZXJ9KSI7CiAgICB9CgogICAgIyBjaGVjayBjYWNoZQogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICBteSAkTmFtZSA9ICRTZWxmLT57Q2FjaGVPYmplY3R9LT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICdDdXN0b21lck5hbWU6OicgLiAkUGFyYW17VXNlckxvZ2lufSwKICAgICAgICApOwogICAgICAgIHJldHVybiAkTmFtZSBpZiBkZWZpbmVkICROYW1lOwogICAgfQoKICAgICMgY3JlYXRlIGxkYXAgY29ubmVjdAogICAgcmV0dXJuIGlmICEkU2VsZi0+X0Nvbm5lY3QoKTsKCiAgICAjIHBlcmZvcm0gdXNlciBzZWFyY2gKICAgIG15ICRSZXN1bHQgPSAkU2VsZi0+e0xEQVB9LT5zZWFyY2goCiAgICAgICAgYmFzZSAgICAgID0+ICRTZWxmLT57QmFzZUROfSwKICAgICAgICBzY29wZSAgICAgPT4gJFNlbGYtPntTU2NvcGV9LAogICAgICAgIGZpbHRlciAgICA9PiAkRmlsdGVyLAogICAgICAgIHNpemVsaW1pdCA9PiAkU2VsZi0+e1VzZXJTZWFyY2hMaXN0TGltaXR9LAogICAgICAgIGF0dHJzICAgICA9PiAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJOYW1lRmllbGRzfSwKICAgICk7CgogICAgaWYgKCAkUmVzdWx0LT5jb2RlKCkgKSB7CiAgICAgICAgaWYgKCAkUmVzdWx0LT5jb2RlKCkgPT0gNCApIHsKCiAgICAgICAgICAgICMgUmVzdWx0IGNvZGUgNCAoTERBUF9TSVpFTElNSVRfRVhDRUVERUQpIGlzIG5vcm1hbCBpZiB0aGVyZQogICAgICAgICAgICAjIGFyZSBtb3JlIGl0ZW1zIGluIExEQVAgdGhhbiBzZWFyY2ggbGltaXQgZGVmaW5lZCBpbiBPVE9CTyBvcgogICAgICAgICAgICAjIGluIExEQVAgc2VydmVyLiBBdm9pZCBzcGFtbWluZyBsb2dzIHdpdGggc3VjaCBlcnJvcnMuCiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2RlYnVnJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdMREFQIHNpemUgbGltaXQgZXhjZWVkZWQgKCcgLiAkUmVzdWx0LT5lcnJvcigpIC4gJykuJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdTZWFyY2ggZmFpbGVkISAnIC4gJFJlc3VsdC0+ZXJyb3IoKSwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICVOYW1lUGFydHM7CgogICAgZm9yIG15ICRFbnRyeSAoICRSZXN1bHQtPmFsbF9lbnRyaWVzKCkgKSB7CgogICAgICAgIGZvciBteSAkRmllbGQgKCBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJOYW1lRmllbGRzfSB9ICkgewoKICAgICAgICAgICAgaWYgKCBkZWZpbmVkICRFbnRyeS0+Z2V0X3ZhbHVlKCRGaWVsZCkgKSB7CiAgICAgICAgICAgICAgICAkTmFtZVBhcnRzeyRGaWVsZH0gPSAkU2VsZi0+X0NvbnZlcnRGcm9tKCAkRW50cnktPmdldF92YWx1ZSgkRmllbGQpICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBmZXRjaCBkeW5hbWljIGZpZWxkIHZhbHVlcywgaWYgY29uZmlndXJlZAogICAgbXkgQER5bmFtaWNGaWVsZEN1c3RvbWVyVXNlck5hbWVGaWVsZHMgPSBncmVwIHsgZXhpc3RzICRTZWxmLT57Q29uZmlndXJlZER5bmFtaWNGaWVsZE5hbWVzfS0+eyRffSB9CiAgICAgICAgQHsgJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q3VzdG9tZXJVc2VyTmFtZUZpZWxkc30gfTsKICAgIGlmIChARHluYW1pY0ZpZWxkQ3VzdG9tZXJVc2VyTmFtZUZpZWxkcykgewogICAgICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgICAgICBEWU5BTUlDRklFTEROQU1FOgogICAgICAgIGZvciBteSAkRHluYW1pY0ZpZWxkTmFtZSAoQER5bmFtaWNGaWVsZEN1c3RvbWVyVXNlck5hbWVGaWVsZHMpIHsKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkR2V0KAogICAgICAgICAgICAgICAgTmFtZSA9PiAkRHluYW1pY0ZpZWxkTmFtZSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEROQU1FIGlmICFJc0hhc2hSZWZXaXRoRGF0YSgkRHluYW1pY0ZpZWxkQ29uZmlnKTsKCiAgICAgICAgICAgIG15ICRWYWx1ZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZUdldCgKICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgT2JqZWN0TmFtZSAgICAgICAgID0+ICRQYXJhbXtVc2VyTG9naW59LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBEWU5BTUlDRklFTEROQU1FIGlmICFkZWZpbmVkICRWYWx1ZTsKCiAgICAgICAgICAgIGlmICggIUlzQXJyYXlSZWZXaXRoRGF0YSgkVmFsdWUpICkgewogICAgICAgICAgICAgICAgJFZhbHVlID0gWyRWYWx1ZV07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15IEBSZW5kZXJlZFZhbHVlczsKCiAgICAgICAgICAgIFZBTFVFOgogICAgICAgICAgICBmb3IgbXkgJEN1cnJlbnRWYWx1ZSAoIEB7JFZhbHVlfSApIHsKICAgICAgICAgICAgICAgIG5leHQgVkFMVUUgaWYgIWRlZmluZWQgJEN1cnJlbnRWYWx1ZSB8fCAhbGVuZ3RoICRDdXJyZW50VmFsdWU7CgogICAgICAgICAgICAgICAgbXkgJFJlbmRlcmVkVmFsdWUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+UmVhZGFibGVWYWx1ZVJlbmRlcigKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZywKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJEN1cnJlbnRWYWx1ZSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgbmV4dCBWQUxVRSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJFJlbmRlcmVkVmFsdWUpIHx8ICFkZWZpbmVkICRSZW5kZXJlZFZhbHVlLT57VmFsdWV9OwoKICAgICAgICAgICAgICAgIHB1c2ggQFJlbmRlcmVkVmFsdWVzLCAkUmVuZGVyZWRWYWx1ZS0+e1ZhbHVlfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJE5hbWVQYXJ0c3skRHluYW1pY0ZpZWxkTmFtZX0gPSBqb2luICcgJywgQFJlbmRlcmVkVmFsdWVzOwogICAgICAgIH0KICAgIH0KCiAgICAjIGFzc2VtYmxlIG5hbWUKICAgIG15IEBOYW1lUGFydHM7CiAgICBDVVNUT01FUlVTRVJOQU1FRklFTEQ6CiAgICBmb3IgbXkgJEN1c3RvbWVyVXNlck5hbWVGaWVsZCAoIEB7ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlck5hbWVGaWVsZHN9IH0gKSB7CiAgICAgICAgbmV4dCBDVVNUT01FUlVTRVJOQU1FRklFTEQKICAgICAgICAgICAgaWYgIWV4aXN0cyAkTmFtZVBhcnRzeyRDdXN0b21lclVzZXJOYW1lRmllbGR9CiAgICAgICAgICAgIHx8ICFkZWZpbmVkICROYW1lUGFydHN7JEN1c3RvbWVyVXNlck5hbWVGaWVsZH0KICAgICAgICAgICAgfHwgIWxlbmd0aCAkTmFtZVBhcnRzeyRDdXN0b21lclVzZXJOYW1lRmllbGR9OwogICAgICAgIHB1c2ggQE5hbWVQYXJ0cywgJE5hbWVQYXJ0c3skQ3VzdG9tZXJVc2VyTmFtZUZpZWxkfTsKICAgIH0KCiAgICBteSAkSm9pbkNoYXJhY3RlciA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlck5hbWVGaWVsZHNKb2lufSAvLyAnICc7CiAgICBteSAkTmFtZSAgICAgICAgICA9IGpvaW4gJEpvaW5DaGFyYWN0ZXIsIEBOYW1lUGFydHM7CgogICAgIyBjYWNoZSByZXF1ZXN0CiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICAgPT4gJ0N1c3RvbWVyTmFtZTo6JyAuICRQYXJhbXtVc2VyTG9naW59LAogICAgICAgICAgICBWYWx1ZSA9PiAkTmFtZSwKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q2FjaGVUVEx9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICROYW1lOwp9CgpzdWIgQ3VzdG9tZXJTZWFyY2ggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoICRQYXJhbXtDdXN0b21lcklEUmF3fSApIHsKICAgICAgICAkUGFyYW17Q3VzdG9tZXJJRH0gPSAkUGFyYW17Q3VzdG9tZXJJRFJhd307CiAgICB9CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtTZWFyY2h9ICYmICEkUGFyYW17VXNlckxvZ2lufSAmJiAhJFBhcmFte1Bvc3RNYXN0ZXJTZWFyY2h9ICYmICEkUGFyYW17Q3VzdG9tZXJJRH0gKQogICAgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBTZWFyY2gsIFVzZXJMb2dpbiwgUG9zdE1hc3RlclNlYXJjaCBvciBDdXN0b21lcklEIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGJ1aWxkIGZpbHRlcgogICAgbXkgJEZpbHRlciA9ICcnOwogICAgaWYgKCAkUGFyYW17U2VhcmNofSApIHsKCiAgICAgICAgbXkgJENvdW50ID0gMDsKICAgICAgICBteSBAUGFydHMgPSBzcGxpdCggL1wrLywgJFBhcmFte1NlYXJjaH0sIDYgKTsKICAgICAgICBmb3IgbXkgJFBhcnQgKEBQYXJ0cykgewoKICAgICAgICAgICAgJFBhcnQgPSAkU2VsZi0+e1NlYXJjaFByZWZpeH0gLiAkUGFydCAuICRTZWxmLT57U2VhcmNoU3VmZml4fTsKICAgICAgICAgICAgJFBhcnQgPX4gcy8oXCUrKS9cJS9nOwogICAgICAgICAgICAkUGFydCA9fiBzLyhcKispXCovKi9nOwogICAgICAgICAgICAkQ291bnQrKzsKCiAgICAgICAgICAgICMgcmVtb3ZlIGR5bmFtaWMgZmllbGQgbmFtZXMgdGhhdCBhcmUgY29uZmlndXJlZCBpbiBDdXN0b21lclVzZXJTZWFyY2hGaWVsZHMKICAgICAgICAgICAgIyBhcyB0aGV5IGNhbm5vdCBiZSByZXRyaWV2ZWQgaGVyZQogICAgICAgICAgICBteSBAQ3VzdG9tZXJVc2VyU2VhcmNoRmllbGRzID0gZ3JlcCB7ICFleGlzdHMgJFNlbGYtPntDb25maWd1cmVkRHluYW1pY0ZpZWxkTmFtZXN9LT57JF99IH0KICAgICAgICAgICAgICAgIEB7ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlclNlYXJjaEZpZWxkc30gfTsKCiAgICAgICAgICAgIGlmIChAQ3VzdG9tZXJVc2VyU2VhcmNoRmllbGRzKSB7CgogICAgICAgICAgICAgICAgIyBxdW90ZSBMREFQIGZpbHRlciB2YWx1ZSBidXQga2VlcCBhc3Rlcmlza3MgdW5lc2NhcGVkICh3aWxkY2FyZCkKICAgICAgICAgICAgICAgICRQYXJ0ID1+IHMvXCovZW5jb2RlZGFzdGVyaXNrMjAxNjA5MzAvZzsKICAgICAgICAgICAgICAgICRQYXJ0ID0gZXNjYXBlX2ZpbHRlcl92YWx1ZSggJFNlbGYtPl9Db252ZXJ0VG8oJFBhcnQpICk7CiAgICAgICAgICAgICAgICAkUGFydCA9fiBzL2VuY29kZWRhc3RlcmlzazIwMTYwOTMwLyovZzsKCiAgICAgICAgICAgICAgICAkRmlsdGVyIC49ICcofCc7CiAgICAgICAgICAgICAgICBmb3IgbXkgJEZpZWxkIChAQ3VzdG9tZXJVc2VyU2VhcmNoRmllbGRzKSB7CiAgICAgICAgICAgICAgICAgICAgJEZpbHRlciAuPSAiKCRGaWVsZD0iIC4gJFBhcnQgLiAnKSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkRmlsdGVyIC49ICcpJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKCiAgICAgICAgICAgICAgICAjIHF1b3RlIExEQVAgZmlsdGVyIHZhbHVlIGJ1dCBrZWVwIGFzdGVyaXNrcyB1bmVzY2FwZWQgKHdpbGRjYXJkKQogICAgICAgICAgICAgICAgJFBhcnQgPX4gcy9cKi9lbmNvZGVkYXN0ZXJpc2syMDE2MDkzMC9nOwogICAgICAgICAgICAgICAgJFBhcnQgPSBlc2NhcGVfZmlsdGVyX3ZhbHVlKCRQYXJ0KTsKICAgICAgICAgICAgICAgICRQYXJ0ID1+IHMvZW5jb2RlZGFzdGVyaXNrMjAxNjA5MzAvKi9nOwoKICAgICAgICAgICAgICAgICRGaWx0ZXIgLj0gIigkU2VsZi0+e0N1c3RvbWVyS2V5fT0iIC4gJFBhcnQgLiAnKSc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggJENvdW50ID4gMSApIHsKICAgICAgICAgICAgJEZpbHRlciA9ICIoJiRGaWx0ZXIpIjsKICAgICAgICB9CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtQb3N0TWFzdGVyU2VhcmNofSApIHsKCiAgICAgICAgIyByZW1vdmUgZHluYW1pYyBmaWVsZCBuYW1lcyB0aGF0IGFyZSBjb25maWd1cmVkIGluIEN1c3RvbWVyVXNlclBvc3RNYXN0ZXJTZWFyY2hGaWVsZHMKICAgICAgICAjIGFzIHRoZXkgY2Fubm90IGJlIHJldHJpZXZlZCBoZXJlCiAgICAgICAgbXkgQEN1c3RvbWVyVXNlclBvc3RNYXN0ZXJTZWFyY2hGaWVsZHMgPSBncmVwIHsgIWV4aXN0cyAkU2VsZi0+e0NvbmZpZ3VyZWREeW5hbWljRmllbGROYW1lc30tPnskX30gfQogICAgICAgICAgICBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJQb3N0TWFzdGVyU2VhcmNoRmllbGRzfSB9OwoKICAgICAgICBpZiAoQEN1c3RvbWVyVXNlclBvc3RNYXN0ZXJTZWFyY2hGaWVsZHMpIHsKCiAgICAgICAgICAgICMgcXVvdGUgTERBUCBmaWx0ZXIgdmFsdWUgYnV0IGtlZXAgYXN0ZXJpc2tzIHVuZXNjYXBlZCAod2lsZGNhcmQpCiAgICAgICAgICAgICRQYXJhbXtQb3N0TWFzdGVyU2VhcmNofSA9fiBzL1wqL2VuY29kZWRhc3RlcmlzazIwMTYwOTMwL2c7CiAgICAgICAgICAgICRQYXJhbXtQb3N0TWFzdGVyU2VhcmNofSA9IGVzY2FwZV9maWx0ZXJfdmFsdWUoICRQYXJhbXtQb3N0TWFzdGVyU2VhcmNofSApOwogICAgICAgICAgICAkUGFyYW17UG9zdE1hc3RlclNlYXJjaH0gPX4gcy9lbmNvZGVkYXN0ZXJpc2syMDE2MDkzMC8qL2c7CgogICAgICAgICAgICAkRmlsdGVyID0gJyh8JzsKICAgICAgICAgICAgZm9yIG15ICRGaWVsZCAoQEN1c3RvbWVyVXNlclBvc3RNYXN0ZXJTZWFyY2hGaWVsZHMpIHsKICAgICAgICAgICAgICAgICRGaWx0ZXIgLj0gIigkRmllbGQ9JFBhcmFte1Bvc3RNYXN0ZXJTZWFyY2h9KSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEZpbHRlciAuPSAnKSc7CiAgICAgICAgfQogICAgfQogICAgZWxzaWYgKCAkUGFyYW17VXNlckxvZ2lufSApIHsKICAgICAgICAkRmlsdGVyID0gIigkU2VsZi0+e0N1c3RvbWVyS2V5fT0iIC4gZXNjYXBlX2ZpbHRlcl92YWx1ZSggJFBhcmFte1VzZXJMb2dpbn0gKSAuICcpJzsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte0N1c3RvbWVySUR9ICkgewogICAgICAgICRGaWx0ZXIgPSAiKCRTZWxmLT57Q3VzdG9tZXJJRH09IiAuIGVzY2FwZV9maWx0ZXJfdmFsdWUoICRQYXJhbXtDdXN0b21lcklEfSApIC4gJyknOwogICAgfQoKICAgICMgcHJlcGFyZSBmaWx0ZXIKICAgIGlmICggJFNlbGYtPntBbHdheXNGaWx0ZXJ9ICkgewogICAgICAgICRGaWx0ZXIgPSAiKCYkRmlsdGVyJFNlbGYtPntBbHdheXNGaWx0ZXJ9KSI7CiAgICB9CgogICAgIyBhZGQgdmFsaWQgZmlsdGVyCiAgICBpZiAoICRTZWxmLT57VmFsaWRGaWx0ZXJ9ICkgewogICAgICAgICRGaWx0ZXIgPSAiKCYkRmlsdGVyJFNlbGYtPntWYWxpZEZpbHRlcn0pIjsKICAgIH0KCiAgICAjIGNoZWNrIGNhY2hlCiAgICBteSAkQ2FjaGVLZXkgPSBqb2luICc6OicsIG1hcCB7ICRfIC4gJz0nIC4gJFBhcmFteyRffSB9IHNvcnQga2V5cyAlUGFyYW07CiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAjIFVzZSBjYWNoZSBmb3IgbXVsdGl0ZW5hbmN5LgogICAgaWYgKCAkU2VsZi0+e011bHRpdGVuYW5jeX0gKSB7CiAgICAgICAgJENhY2hlS2V5IC49IGpvaW4gJycsIG1hcCB7ICc6Okdyb3VwSUQ9JyAuICRfIH0gQHsgJFNlbGYtPntVc2VyR3JvdXBJRHN9IH07CiAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgIGlmICggJFNlbGYtPntDYWNoZU9iamVjdH0gKSB7CiAgICAgICAgbXkgJFVzZXJzID0gJFNlbGYtPntDYWNoZU9iamVjdH0tPkdldCgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVyU2VhcmNoJywKICAgICAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJXskVXNlcnN9IGlmIHJlZiAkVXNlcnMgZXEgJ0hBU0gnOwogICAgfQoKICAgICMgY3JlYXRlIGxkYXAgY29ubmVjdAogICAgcmV0dXJuIGlmICEkU2VsZi0+X0Nvbm5lY3QoKTsKCiAgICBteSAkQ3VzdG9tZXJVc2VyTGlzdEZpZWxkcyA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlckxpc3RGaWVsZHN9OwoKICAgICMgcmVtb3ZlIGR5bmFtaWMgZmllbGQgbmFtZXMgdGhhdCBhcmUgY29uZmlndXJlZCBpbiBDdXN0b21lclVzZXJMaXN0RmllbGRzCiAgICAjIGFzIHRoZXkgY2Fubm90IGJlIGhhbmRsZWQgaGVyZQogICAgbXkgQEN1c3RvbWVyVXNlckxpc3RGaWVsZHNXaXRob3V0RHluYW1pY0ZpZWxkcyA9IGdyZXAgeyAhZXhpc3RzICRTZWxmLT57Q29uZmlndXJlZER5bmFtaWNGaWVsZE5hbWVzfS0+eyRffSB9IEB7JEN1c3RvbWVyVXNlckxpc3RGaWVsZHN9OwoKICAgICMgY29tYmluZSBuZWVkZWQgYXR0cnMKICAgIG15IEBBdHRyaWJ1dGVzID0gKCBAQ3VzdG9tZXJVc2VyTGlzdEZpZWxkc1dpdGhvdXREeW5hbWljRmllbGRzLCAkU2VsZi0+e0N1c3RvbWVyS2V5fSApOwoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICMgRG9uJ3Qgc2VhcmNoIGZvciBjdXN0b21lciB1c2VycyB3aXRob3V0IGdyb3VwIHBlcm1pc3Npb24uCiAgICBpZiAoICRTZWxmLT57TXVsdGl0ZW5hbmN5fSApIHsKICAgICAgICBteSAkR3JvdXBJREF0dHI7CiAgICAgICAgZm9yIG15ICRNYXAgKCBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntNYXB9IH0gKSB7CiAgICAgICAgICAgIGlmICggJE1hcC0+WzBdIGVxICdVc2VyR3JvdXBJRCcgKSB7CiAgICAgICAgICAgICAgICAkR3JvdXBJREF0dHIgPSAkTWFwLT5bMl07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgVGhlIHNvdXJjZSBzdXBwb3J0cyBtdWx0aXRlbmFuY3kuCiAgICAgICAgaWYgKCRHcm91cElEQXR0cikgewogICAgICAgICAgICBpZiAoICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyQ29tcGFueVN1cHBvcnR9ICkgewogICAgICAgICAgICAgICAgIyBUT0RPOiBXb3JrYXJvdW5kIHVudGlsIHRoZSBzZWFyY2ggZ2V0cyBjaGFuZ2VkLiBTZWUgQ3VzdG9tZXJVc2VyL0xEQVAucG0gZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgICAgICAgICAgICAgICAkUGFyYW17TGltaXR9ID0gMTAwMDAwOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkVXNlckdyb3VwSURTeW5jID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57VXNlckdyb3VwSURTeW5jfTsKICAgICAgICAgICAgIyBDaGVjayBpZiB3ZSBtYXRjaCBmb3IgZ3JvdXAgSURzIG9yIGdyb3VwIG5hbWVzLgogICAgICAgICAgICBteSBAVXNlckdyb3VwcyA9ICRVc2VyR3JvdXBJRFN5bmMtPntVc2VHcm91cE5hbWVzfSA/IEB7ICRTZWxmLT57VXNlckdyb3Vwc30gfSA6IEB7ICRTZWxmLT57VXNlckdyb3VwSURzfSB9OwoKICAgICAgICAgICAgIyBSZW1hcCBsb2NhbCBncm91cHMgdG8gcmVtb3RlIGdyb3Vwcy4KICAgICAgICAgICAgZm9yIG15ICRSZW1vdGVHcm91cCAoIGtleXMgJXsgJFVzZXJHcm91cElEU3luYy0+e1JlbW90ZUdyb3VwVG9Mb2NhbEdyb3VwfSB9ICkgewogICAgICAgICAgICAgICAgbXkgJExvY2FsR3JvdXAgPSAkVXNlckdyb3VwSURTeW5jLT57UmVtb3RlR3JvdXBUb0xvY2FsR3JvdXB9eyRSZW1vdGVHcm91cH07CgogICAgICAgICAgICAgICAgQFVzZXJHcm91cHMgPSBtYXAgeyAkXyBlcSAkTG9jYWxHcm91cCA/ICRSZW1vdGVHcm91cCA6ICRfIH0gQFVzZXJHcm91cHM7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgQnVpbGQgZmlsdGVyIHN0cmluZy4gSWYgdGhlIGZpZWxkIGlzIGVtcHR5LCB3ZSBoYXZlIGFjY2VzcyBieSBkZWZhdWx0LgogICAgICAgICAgICBteSAkQWRkaXRpb25hbEZpbHRlciA9ICIofCghKCRHcm91cElEQXR0cj0qKSkiOwogICAgICAgICAgICBmb3IgbXkgJFVzZXJHcm91cCAoQFVzZXJHcm91cHMpIHsKICAgICAgICAgICAgICAgICRBZGRpdGlvbmFsRmlsdGVyIC49ICIoJEdyb3VwSURBdHRyPSRVc2VyR3JvdXApIjsKICAgICAgICAgICAgfQogICAgICAgICAgICAkQWRkaXRpb25hbEZpbHRlciAuPSAnKSknOwoKICAgICAgICAgICAgIyBSZW1vdmUgdGhlIGxhc3QgY2xvc2luZyBwYXJlbnRoZXNpcyBhbmQgYWRkIHRoZSBjdXN0b20gZmlsdGVyIHRvIHRoZSBzZWFyY2guCiAgICAgICAgICAgICRGaWx0ZXIgPSBzdWJzdHIgJEZpbHRlciwgMCwgLTE7CiAgICAgICAgICAgICRGaWx0ZXIgLj0gJEFkZGl0aW9uYWxGaWx0ZXI7CiAgICAgICAgfQogICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CgogICAgIyBwZXJmb3JtIHVzZXIgc2VhcmNoCiAgICBteSAkUmVzdWx0ID0gJFNlbGYtPntMREFQfS0+c2VhcmNoKAogICAgICAgIGJhc2UgICAgICA9PiAkU2VsZi0+e0Jhc2VETn0sCiAgICAgICAgc2NvcGUgICAgID0+ICRTZWxmLT57U1Njb3BlfSwKICAgICAgICBmaWx0ZXIgICAgPT4gJEZpbHRlciwKICAgICAgICBzaXplbGltaXQgPT4gJFBhcmFte0xpbWl0fSB8fCAkU2VsZi0+e1VzZXJTZWFyY2hMaXN0TGltaXR9LAogICAgICAgIGF0dHJzICAgICA9PiBcQEF0dHJpYnV0ZXMsCiAgICApOwoKICAgICMgbG9nIGxkYXAgZXJyb3JzCiAgICBpZiAoICRSZXN1bHQtPmNvZGUoKSApIHsKICAgICAgICBpZiAoICRSZXN1bHQtPmNvZGUoKSA9PSA0ICkgewoKICAgICAgICAgICAgIyBSZXN1bHQgY29kZSA0IChMREFQX1NJWkVMSU1JVF9FWENFRURFRCkgaXMgbm9ybWFsIGlmIHRoZXJlCiAgICAgICAgICAgICMgYXJlIG1vcmUgaXRlbXMgaW4gTERBUCB0aGFuIHNlYXJjaCBsaW1pdCBkZWZpbmVkIGluIE9UT0JPIG9yCiAgICAgICAgICAgICMgaW4gTERBUCBzZXJ2ZXIuIEF2b2lkIHNwYW1taW5nIGxvZ3Mgd2l0aCBzdWNoIGVycm9ycy4KICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0xEQVAgc2l6ZSBsaW1pdCBleGNlZWRlZCAoJyAuICRSZXN1bHQtPmVycm9yKCkgLiAnKS4nLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1NlYXJjaCBmYWlsZWQhICcgLiAkUmVzdWx0LT5lcnJvcigpLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGR5bmFtaWMgZmllbGQgaGFuZGxpbmcKICAgIG15IEBDdXN0b21lclVzZXJMaXN0RmllbGRzRHluYW1pY0ZpZWxkcyA9IGdyZXAgeyBleGlzdHMgJFNlbGYtPntDb25maWd1cmVkRHluYW1pY0ZpZWxkTmFtZXN9LT57JF99IH0gQHskQ3VzdG9tZXJVc2VyTGlzdEZpZWxkc307CiAgICBteSAlQ3VzdG9tZXJVc2VyTGlzdEZpZWxkc0R5bmFtaWNGaWVsZHMgPSBtYXAgIHsgJF8gPT4gMSB9IEBDdXN0b21lclVzZXJMaXN0RmllbGRzRHluYW1pY0ZpZWxkczsKCiAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlncyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBPYmplY3RUeXBlID0+ICdDdXN0b21lclVzZXInLAogICAgICAgIFZhbGlkICAgICAgPT4gMSwKICAgICk7CiAgICBteSAlRHluYW1pY0ZpZWxkQ29uZmlnc0J5TmFtZSA9IG1hcCB7ICRfLT57TmFtZX0gPT4gJF8gfSBAeyREeW5hbWljRmllbGRDb25maWdzfTsKCiAgICBteSAlVXNlcnM7CiAgICBmb3IgbXkgJEVudHJ5ICggJFJlc3VsdC0+YWxsX2VudHJpZXMoKSApIHsKCiAgICAgICAgbXkgJEN1c3RvbWVyU3RyaW5nID0gJyc7CgogICAgICAgIG15ICRDdXN0b21lcktleTsKICAgICAgICBpZiAoIGRlZmluZWQgJEVudHJ5LT5nZXRfdmFsdWUoICRTZWxmLT57Q3VzdG9tZXJLZXl9ICkgKSB7CiAgICAgICAgICAgICRDdXN0b21lcktleSA9ICRTZWxmLT5fQ29udmVydEZyb20oICRFbnRyeS0+Z2V0X3ZhbHVlKCAkU2VsZi0+e0N1c3RvbWVyS2V5fSApICk7CiAgICAgICAgfQoKICAgICAgICBGSUVMRDoKICAgICAgICBmb3IgbXkgJEZpZWxkICggQHskQ3VzdG9tZXJVc2VyTGlzdEZpZWxkc30gKSB7CgogICAgICAgICAgICAjIGR5bmFtaWMgZmllbGQgdmFsdWUKICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJVc2VyTGlzdEZpZWxkc0R5bmFtaWNGaWVsZHN7JEZpZWxkfSApIHsKICAgICAgICAgICAgICAgIG5leHQgRklFTEQgaWYgIWRlZmluZWQgJEN1c3RvbWVyS2V5OwogICAgICAgICAgICAgICAgbmV4dCBGSUVMRCBpZiAhZXhpc3RzICREeW5hbWljRmllbGRDb25maWdzQnlOYW1leyRGaWVsZH07CgogICAgICAgICAgICAgICAgbXkgJFZhbHVlID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlZhbHVlR2V0KAogICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnc0J5TmFtZXskRmllbGR9LAogICAgICAgICAgICAgICAgICAgIE9iamVjdE5hbWUgICAgICAgICA9PiAkQ3VzdG9tZXJLZXksCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG5leHQgRklFTEQgaWYgIWRlZmluZWQgJFZhbHVlOwoKICAgICAgICAgICAgICAgIGlmICggIUlzQXJyYXlSZWZXaXRoRGF0YSgkVmFsdWUpICkgewogICAgICAgICAgICAgICAgICAgICRWYWx1ZSA9IFskVmFsdWVdOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIG15IEBWYWx1ZXM7CgogICAgICAgICAgICAgICAgVkFMVUU6CiAgICAgICAgICAgICAgICBmb3IgbXkgJEN1cnJlbnRWYWx1ZSAoIEB7JFZhbHVlfSApIHsKICAgICAgICAgICAgICAgICAgICBuZXh0IFZBTFVFIGlmICFkZWZpbmVkICRDdXJyZW50VmFsdWUgfHwgIWxlbmd0aCAkQ3VycmVudFZhbHVlOwoKICAgICAgICAgICAgICAgICAgICBteSAkUmVhZGFibGVWYWx1ZSA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5SZWFkYWJsZVZhbHVlUmVuZGVyKAogICAgICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZENvbmZpZ3NCeU5hbWV7JEZpZWxkfSwKICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgICAgICAgICAgICAgID0+ICRDdXJyZW50VmFsdWUsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgbmV4dCBWQUxVRSBpZiAhSXNIYXNoUmVmV2l0aERhdGEoJFJlYWRhYmxlVmFsdWUpIHx8ICFkZWZpbmVkICRSZWFkYWJsZVZhbHVlLT57VmFsdWV9OwoKICAgICAgICAgICAgICAgICAgICBteSAkSXNBQ0xSZWR1Y2libGUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+SGFzQmVoYXZpb3IoCiAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnc0J5TmFtZXskRmllbGR9LAogICAgICAgICAgICAgICAgICAgICAgICBCZWhhdmlvciAgICAgICAgICAgPT4gJ0lzQUNMUmVkdWNpYmxlJywKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIGlmICgkSXNBQ0xSZWR1Y2libGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJFBvc3NpYmxlVmFsdWVzID0gJER5bmFtaWNGaWVsZEJhY2tlbmRPYmplY3QtPlBvc3NpYmxlVmFsdWVzR2V0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRDb25maWdzQnlOYW1leyRGaWVsZH0sCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc0hhc2hSZWZXaXRoRGF0YSgkUG9zc2libGVWYWx1ZXMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBkZWZpbmVkICRQb3NzaWJsZVZhbHVlcy0+eyAkUmVhZGFibGVWYWx1ZS0+e1ZhbHVlfSB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRSZWFkYWJsZVZhbHVlLT57VmFsdWV9ID0gJFBvc3NpYmxlVmFsdWVzLT57ICRSZWFkYWJsZVZhbHVlLT57VmFsdWV9IH07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIHB1c2ggQFZhbHVlcywgJFJlYWRhYmxlVmFsdWUtPntWYWx1ZX07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgJEN1c3RvbWVyU3RyaW5nIC49ICggam9pbiAnICcsIEBWYWx1ZXMgKSAuICcgJzsKCiAgICAgICAgICAgICAgICBuZXh0IEZJRUxEOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkVmFsdWUgPSAkU2VsZi0+X0NvbnZlcnRGcm9tKCAkRW50cnktPmdldF92YWx1ZSgkRmllbGQpICk7CgogICAgICAgICAgICBpZiAoJFZhbHVlKSB7CiAgICAgICAgICAgICAgICBpZiAoICRGaWVsZCA9fiAvXnRhcmdldGFkZHJlc3MkL2kgKSB7CiAgICAgICAgICAgICAgICAgICAgJFZhbHVlID1+IHMvU01UUDooLiopLyQxLzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICRDdXN0b21lclN0cmluZyAuPSAkVmFsdWUgLiAnICc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICRDdXN0b21lclN0cmluZyA9fiBzL14oLiopXHMoLis/XEAuKz9cLi4rPykoXHN8KSQvIiQxIiA8JDI+LzsKCiAgICAgICAgaWYgKCBkZWZpbmVkICRDdXN0b21lcktleSApIHsKICAgICAgICAgICAgJFVzZXJzeyRDdXN0b21lcktleX0gPSAkQ3VzdG9tZXJTdHJpbmc7CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgdXNlciBuZWVkIHRvIGJlIGluIGEgZ3JvdXAhCiAgICBpZiAoICRTZWxmLT57R3JvdXBETn0gKSB7CgogICAgICAgIGZvciBteSAkRmlsdGVyMiAoIHNvcnQga2V5cyAlVXNlcnMgKSB7CgogICAgICAgICAgICBteSAkUmVzdWx0MiA9ICRTZWxmLT57TERBUH0tPnNlYXJjaCgKICAgICAgICAgICAgICAgIGJhc2UgICAgICA9PiAkU2VsZi0+e0dyb3VwRE59LAogICAgICAgICAgICAgICAgc2NvcGUgICAgID0+ICRTZWxmLT57U1Njb3BlfSwKICAgICAgICAgICAgICAgIGZpbHRlciAgICA9PiAnbWVtYmVyVWlkPScgLiBlc2NhcGVfZmlsdGVyX3ZhbHVlKCRGaWx0ZXIyKSwKICAgICAgICAgICAgICAgIHNpemVsaW1pdCA9PiAkUGFyYW17TGltaXR9IHx8ICRTZWxmLT57VXNlclNlYXJjaExpc3RMaW1pdH0sCiAgICAgICAgICAgICAgICBhdHRycyAgICAgPT4gWycxLjEnXSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggISRSZXN1bHQyLT5hbGxfZW50cmllcygpICkgewogICAgICAgICAgICAgICAgZGVsZXRlICRVc2Vyc3skRmlsdGVyMn07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBjYWNoZSByZXF1ZXN0CiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdfQ3VzdG9tZXJTZWFyY2gnLAogICAgICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgICAgIFZhbHVlID0+IFwlVXNlcnMsCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q3VzdG9tZXJVc2VyTWFwfS0+e0NhY2hlVFRMfSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAlVXNlcnM7Cn0KCnN1YiBDdXN0b21lclNlYXJjaERldGFpbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGlmICggcmVmICRQYXJhbXtTZWFyY2hGaWVsZHN9IG5lICdBUlJBWScgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJTZWFyY2hGaWVsZHMgbXVzdCBiZSBhbiBhcnJheSByZWZlcmVuY2UhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIFJldHVybiBvbmx5IHZhbGlkIHVzZXJzIHBlciBkZWZhdWx0CiAgICBteSAkVmFsaWQgPSAkUGFyYW17VmFsaWR9IC8vIDE7CgogICAgJFBhcmFte0xpbWl0fSAvLz0gJyc7CgogICAgIyBTcGxpdCB0aGUgc2VhcmNoIGZpZWxkcyBpbiBzY2FsYXIgYW5kIGFycmF5IGZpZWxkcywgYmVmb3JlIHRoZSBkaWZmcmVudCBoYW5kbGluZy4KICAgIG15IEBTY2FsYXJTZWFyY2hGaWVsZHMgPSBncmVwIHsgJ0lucHV0JyBlcSAkXy0+e1R5cGV9IH0gQHsgJFBhcmFte1NlYXJjaEZpZWxkc30gfTsKICAgIG15IEBBcnJheVNlYXJjaEZpZWxkcyAgPSBncmVwIHsgJ1NlbGVjdGlvbicgZXEgJF8tPntUeXBlfSB9IEB7ICRQYXJhbXtTZWFyY2hGaWVsZHN9IH07CgogICAgIyBWZXJpZnkgdGhhdCBhbGwgcGFzc2VkIGFycmF5IHBhcmFtZXRlcnMgY29udGFpbiBhbiBhcnJheXJlZi4KICAgIEFSR1VNRU5UOgogICAgZm9yIG15ICRBcmd1bWVudCAoQEFycmF5U2VhcmNoRmllbGRzKSB7CiAgICAgICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17ICRBcmd1bWVudC0+e05hbWV9IH0gKSB7CiAgICAgICAgICAgICRQYXJhbXsgJEFyZ3VtZW50LT57TmFtZX0gfSB8fD0gW107CgogICAgICAgICAgICBuZXh0IEFSR1VNRU5UOwogICAgICAgIH0KCiAgICAgICAgaWYgKCByZWYgJFBhcmFteyAkQXJndW1lbnQtPntOYW1lfSB9IG5lICdBUlJBWScgKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICIkQXJndW1lbnQtPntOYW1lfSBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgU2V0IHRoZSBkZWZhdWx0IGJlaGF2aW91ciBmb3IgdGhlIHJldHVybiB0eXBlLgogICAgbXkgJFJlc3VsdCA9ICRQYXJhbXtSZXN1bHR9IHx8ICdBUlJBWSc7CgogICAgIyBTcGVjaWFsIGhhbmRsaW5nIGlmIHRoZSByZXN1bHQgdHlwZSBpcyAnQ09VTlQnLgogICAgaWYgKCAkUmVzdWx0IGVxICdDT1VOVCcgKSB7CgogICAgICAgICMgSWdub3JlIHRoZSBwYXJhbWV0ZXIgJ0xpbWl0JyB3aGVuIHJlc3VsdCB0eXBlIGlzICdDT1VOVCcuCiAgICAgICAgJFBhcmFte0xpbWl0fSA9ICcnOwoKICAgICAgICAjIERlbGV0ZSB0aGUgT3JkZXJCeSBwYXJhbWV0ZXIgd2hlbiB0aGUgcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJy4KICAgICAgICAkUGFyYW17T3JkZXJCeX0gPSBbXTsKICAgIH0KCiAgICAjIERlZmluZSBvcmRlciB0YWJsZSBmcm9tIHRoZSBzZWFyY2ggZmllbGRzLgogICAgbXkgJU9yZGVyQnlUYWJsZSA9IG1hcCB7ICRfLT57TmFtZX0gPT4gJF8tPntEYXRhYmFzZUZpZWxkfSB9IEB7ICRQYXJhbXtTZWFyY2hGaWVsZHN9IH07CgogICAgZm9yIG15ICRGaWVsZCAoQEFycmF5U2VhcmNoRmllbGRzKSB7CgogICAgICAgIG15ICRTZWxlY3Rpb25zRGF0YSA9ICRGaWVsZC0+e1NlbGVjdGlvbnNEYXRhfTsKCiAgICAgICAgZm9yIG15ICRTZWxlY3RlZFZhbHVlICggQHsgJFBhcmFteyAkRmllbGQtPntOYW1lfSB9IH0gKSB7CgogICAgICAgICAgICAjIENoZWNrIGlmIHRoZSBzZWxlY3RlZCB2YWx1ZSBmb3IgdGhlIGN1cnJlbnQgZmllbGQgaXMgdmFsaWQuCiAgICAgICAgICAgIGlmICggISRTZWxlY3Rpb25zRGF0YS0+eyRTZWxlY3RlZFZhbHVlfSApIHsKICAgICAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlRoZSBzZWxlY3RlZCB2YWx1ZSAkRmllbGQtPntOYW1lfSBpcyBub3QgdmFsaWQhIiwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgIyBCdWlsZCB0aGUgbGRhcCBmaWx0ZXIgZm9yIHRoZSBkaWZmcmVudCBzZWFyY2ggcGFyYW1zLgogICAgbXkgJEZpbHRlciA9ICcnOwoKICAgIGZvciBteSAkRmllbGQgKEBTY2FsYXJTZWFyY2hGaWVsZHMpIHsKCiAgICAgICAgIyBTZWFyY2ggZm9yIHNjYWxhciBmaWVsZHMgKHdpbGRjYXJkcyBhcmUgYWxsb3dlZCkuCiAgICAgICAgaWYgKCAkUGFyYW17ICRGaWVsZC0+e05hbWV9IH0gKSB7CgogICAgICAgICAgICAkUGFyYW17ICRGaWVsZC0+e05hbWV9IH0gPX4gcy8oXCUrKS9cJS9nOwogICAgICAgICAgICAkUGFyYW17ICRGaWVsZC0+e05hbWV9IH0gPX4gcy8oXCorKVwqLyovZzsKCiAgICAgICAgICAgICRGaWx0ZXIgLj0gIigkRmllbGQtPntEYXRhYmFzZUZpZWxkfT0iIC4gJFNlbGYtPl9Db252ZXJ0VG8oICRQYXJhbXsgJEZpZWxkLT57TmFtZX0gfSApIC4gIikiOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoJEZpbHRlcikgewogICAgICAgICRGaWx0ZXIgPSAiKCYkRmlsdGVyKSI7CiAgICB9CgogICAgbXkgJEFycmF5RmlsdGVyID0gJyc7CgogICAgIyBTcGVjaWFsIHBhcmFtZXRlciBmb3IgQ3VzdG9tZXJJRHMgZnJvbSBhIGN1c3RvbWVyIGNvbXBhbnkgc2VhcmNoIHJlc3VsdC4KICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCAkUGFyYW17Q3VzdG9tZXJDb21wYW55U2VhcmNoQ3VzdG9tZXJJRHN9ICkgKSB7CiAgICAgICAgJEFycmF5RmlsdGVyIC49ICcofCc7CiAgICAgICAgZm9yIG15ICRPbmVQYXJhbSAoIEB7ICRQYXJhbXtDdXN0b21lckNvbXBhbnlTZWFyY2hDdXN0b21lcklEc30gfSApIHsKICAgICAgICAgICAgJEFycmF5RmlsdGVyIC49ICIoJFNlbGYtPntDdXN0b21lcklEfT0iIC4gJFNlbGYtPl9Db252ZXJ0VG8oJE9uZVBhcmFtKSAuICIpIjsKICAgICAgICB9CiAgICAgICAgJEFycmF5RmlsdGVyIC49ICcpJzsKICAgIH0KCiAgICBGSUVMRDoKICAgIGZvciBteSAkRmllbGQgKEBBcnJheVNlYXJjaEZpZWxkcykgewoKICAgICAgICAjIElnbm9yZSBlbXB0eSBsaXN0cy4KICAgICAgICBuZXh0IEZJRUxEIGlmICFAeyAkUGFyYW17ICRGaWVsZC0+e05hbWV9IH0gfTsKCiAgICAgICAgJEFycmF5RmlsdGVyIC49ICcofCc7CiAgICAgICAgZm9yIG15ICRPbmVQYXJhbSAoIEB7ICRQYXJhbXsgJEZpZWxkLT57TmFtZX0gfSB9ICkgewogICAgICAgICAgICAkQXJyYXlGaWx0ZXIgLj0gIigkRmllbGQtPntEYXRhYmFzZUZpZWxkfT0iIC4gJFNlbGYtPl9Db252ZXJ0VG8oJE9uZVBhcmFtKSAuICIpIjsKICAgICAgICB9CiAgICAgICAgJEFycmF5RmlsdGVyIC49ICcpJzsKICAgIH0KCiAgICAjIEFkZCB0aGUgYXJyYXkgZmlsdGVyIGZpZWxkcyB0byB0aGUgbGRhcCBmaWx0ZXIuCiAgICBpZiAoJEFycmF5RmlsdGVyKSB7CiAgICAgICAgJEZpbHRlciA9ICIoJiRGaWx0ZXIkQXJyYXlGaWx0ZXIpIjsKICAgIH0KCiAgICBteSAkREJPYmplY3QgICAgICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwogICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCAgICAgICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyk7CiAgICBteSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQ6OkJhY2tlbmQnKTsKCiAgICAjIENoZWNrIGFsbCBjb25maWd1cmVkIGNoYW5nZSBkeW5hbWljIGZpZWxkcywgYnVpbGQgbG9va3VwIGhhc2ggYnkgbmFtZS4KICAgIG15ICVDdXN0b21lclVzZXJEeW5hbWljRmllbGROYW1lMkNvbmZpZzsKICAgIG15ICRDdXN0b21lclVzZXJEeW5hbWljRmllbGRzID0gJER5bmFtaWNGaWVsZE9iamVjdC0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBPYmplY3RUeXBlID0+ICdDdXN0b21lclVzZXInLAogICAgKTsKICAgIGZvciBteSAkRHluYW1pY0ZpZWxkICggQHskQ3VzdG9tZXJVc2VyRHluYW1pY0ZpZWxkc30gKSB7CiAgICAgICAgJEN1c3RvbWVyVXNlckR5bmFtaWNGaWVsZE5hbWUyQ29uZmlneyAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfSA9ICREeW5hbWljRmllbGQ7CiAgICB9CgogICAgbXkgJFNRTER5bmFtaWNGaWVsZEZyb20gICAgID0gJyc7CiAgICBteSAkU1FMRHluYW1pY0ZpZWxkV2hlcmUgICAgPSAnJzsKICAgIG15ICREeW5hbWljRmllbGRKb2luQ291bnRlciA9IDE7CgogICAgRFlOQU1JQ0ZJRUxEOgogICAgZm9yIG15ICREeW5hbWljRmllbGQgKCBAeyRDdXN0b21lclVzZXJEeW5hbWljRmllbGRzfSApIHsKCiAgICAgICAgbXkgJFNlYXJjaFBhcmFtID0gJFBhcmFteyAiRHluYW1pY0ZpZWxkXyIgLiAkRHluYW1pY0ZpZWxkLT57TmFtZX0gfTsKCiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgKCAhJFNlYXJjaFBhcmFtICk7CiAgICAgICAgbmV4dCBEWU5BTUlDRklFTEQgaWYgKCByZWYgJFNlYXJjaFBhcmFtIG5lICdIQVNIJyApOwoKICAgICAgICBteSAkTmVlZEpvaW47CgogICAgICAgIGZvciBteSAkT3BlcmF0b3IgKCBzb3J0IGtleXMgJXskU2VhcmNoUGFyYW19ICkgewoKICAgICAgICAgICAgbXkgQFNlYXJjaFBhcmFtcyA9ICggcmVmICRTZWFyY2hQYXJhbS0+eyRPcGVyYXRvcn0gZXEgJ0FSUkFZJyApCiAgICAgICAgICAgICAgICA/IEB7ICRTZWFyY2hQYXJhbS0+eyRPcGVyYXRvcn0gfQogICAgICAgICAgICAgICAgOiAoICRTZWFyY2hQYXJhbS0+eyRPcGVyYXRvcn0gKTsKCiAgICAgICAgICAgIG15ICRTUUxEeW5hbWljRmllbGRXaGVyZVN1YiA9ICcnOwogICAgICAgICAgICBpZiAoJFNRTER5bmFtaWNGaWVsZFdoZXJlKSB7CiAgICAgICAgICAgICAgICAkU1FMRHluYW1pY0ZpZWxkV2hlcmVTdWIgPSAnIEFORCAoJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRTUUxEeW5hbWljRmllbGRXaGVyZVN1YiA9ICcgKCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG15ICRDb3VudGVyID0gMDsKICAgICAgICAgICAgVEVYVDoKICAgICAgICAgICAgZm9yIG15ICRUZXh0IChAU2VhcmNoUGFyYW1zKSB7CiAgICAgICAgICAgICAgICBuZXh0IFRFWFQgaWYgKCAhZGVmaW5lZCAkVGV4dCB8fCAkVGV4dCBlcSAnJyApOwoKICAgICAgICAgICAgICAgICRUZXh0ID1+IHMvXCovJS9naTsKCiAgICAgICAgICAgICAgICAjIENoZWNrIHNlYXJjaCBhdHRyaWJ1dGUsIHdlIGRvIG5vdCBuZWVkIHRvIHNlYXJjaCBmb3IgJyonLgogICAgICAgICAgICAgICAgbmV4dCBURVhUIGlmICRUZXh0ID1+IC9eXCV7MSwzfSQvOwoKICAgICAgICAgICAgICAgIG15ICRWYWxpZGF0ZVN1Y2Nlc3MgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVWYWxpZGF0ZSgKICAgICAgICAgICAgICAgICAgICBEeW5hbWljRmllbGRDb25maWcgPT4gJER5bmFtaWNGaWVsZCwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSAgICAgICAgICAgICAgPT4gJFRleHQsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgID0+ICRQYXJhbXtVc2VySUR9IHx8IDEsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgaWYgKCAhJFZhbGlkYXRlU3VjY2VzcyApIHsKICAgICAgICAgICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlNlYXJjaCBub3QgZXhlY3V0ZWQgZHVlIHRvIGludmFsaWQgdmFsdWUgJyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJFRleHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gIicgb24gZmllbGQgJyIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJER5bmFtaWNGaWVsZC0+e05hbWV9IC4gIichIiwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoJENvdW50ZXIpIHsKICAgICAgICAgICAgICAgICAgICAkU1FMRHluYW1pY0ZpZWxkV2hlcmVTdWIgLj0gJyBPUiAnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJFNRTER5bmFtaWNGaWVsZFdoZXJlU3ViIC49ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5TZWFyY2hTUUxHZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGQsCiAgICAgICAgICAgICAgICAgICAgVGFibGVBbGlhcyAgICAgICAgID0+ICJkZnYkRHluYW1pY0ZpZWxkSm9pbkNvdW50ZXIiLAogICAgICAgICAgICAgICAgICAgIE9wZXJhdG9yICAgICAgICAgICA9PiAkT3BlcmF0b3IsCiAgICAgICAgICAgICAgICAgICAgU2VhcmNoVGVybSAgICAgICAgID0+ICRUZXh0LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkQ291bnRlcisrOwogICAgICAgICAgICB9CiAgICAgICAgICAgICRTUUxEeW5hbWljRmllbGRXaGVyZVN1YiAuPSAnKSAnOwoKICAgICAgICAgICAgaWYgKCRDb3VudGVyKSB7CiAgICAgICAgICAgICAgICAkU1FMRHluYW1pY0ZpZWxkV2hlcmUgLj0gJFNRTER5bmFtaWNGaWVsZFdoZXJlU3ViOwogICAgICAgICAgICAgICAgJE5lZWRKb2luID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCROZWVkSm9pbikgewogICAgICAgICAgICAkU1FMRHluYW1pY0ZpZWxkRnJvbSAuPSAiCiAgICAgICAgICAgICAgICBJTk5FUiBKT0lOIGR5bmFtaWNfZmllbGRfdmFsdWUgZGZ2JER5bmFtaWNGaWVsZEpvaW5Db3VudGVyCiAgICAgICAgICAgICAgICAgICAgT04gKGRmX29ial9pZF9uYW1lLm9iamVjdF9pZCA9IGRmdiREeW5hbWljRmllbGRKb2luQ291bnRlci5vYmplY3RfaWQKICAgICAgICAgICAgICAgICAgICAgICAgQU5EIGRmdiREeW5hbWljRmllbGRKb2luQ291bnRlci5maWVsZF9pZCA9ICIKICAgICAgICAgICAgICAgIC4gJERCT2JqZWN0LT5RdW90ZSggJER5bmFtaWNGaWVsZC0+e0lEfSwgJ0ludGVnZXInICkgLiAiKQogICAgICAgICAgICAiOwoKICAgICAgICAgICAgJER5bmFtaWNGaWVsZEpvaW5Db3VudGVyKys7CiAgICAgICAgfQogICAgfQoKICAgICMgRXhlY3V0ZSBhIGR5bmFtaWMgZmllbGQgc2VhcmNoLCBpZiBhIGR5bmFtaWMgZmllbGQgd2hlcmUgc3RhdGVtZW50IGV4aXN0cy4KICAgIGlmICgkU1FMRHluYW1pY0ZpZWxkV2hlcmUpIHsKCiAgICAgICAgbXkgQER5bmFtaWNGaWVsZFVzZXJMb2dpbnM7CgogICAgICAgICMgc3FsIHVlcnkgZm9yIHRoZSBkeW5hbWljIGZpZWxkcwogICAgICAgIG15ICRTUUxEeW5hbWljRmllbGQgPSAiU0VMRUNUIERJU1RJTkNUKGRmX29ial9pZF9uYW1lLm9iamVjdF9uYW1lKSBGUk9NIGR5bmFtaWNfZmllbGRfb2JqX2lkX25hbWUgZGZfb2JqX2lkX25hbWUgIgogICAgICAgICAgICAuICRTUUxEeW5hbWljRmllbGRGcm9tCiAgICAgICAgICAgIC4gIiBXSEVSRSAiCiAgICAgICAgICAgIC4gJFNRTER5bmFtaWNGaWVsZFdoZXJlOwoKICAgICAgICBteSAkVXNlZENhY2hlOwoKICAgICAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewoKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZFNlYXJjaENhY2hlRGF0YSA9ICRTZWxmLT57Q2FjaGVPYmplY3R9LT5HZXQoCiAgICAgICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSAuICdfQ3VzdG9tZXJTZWFyY2hEZXRhaWxEeW5hbWljRmllbGRzJywKICAgICAgICAgICAgICAgIEtleSAgPT4gJFNRTER5bmFtaWNGaWVsZCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggZGVmaW5lZCAkRHluYW1pY0ZpZWxkU2VhcmNoQ2FjaGVEYXRhICkgewogICAgICAgICAgICAgICAgaWYgKCByZWYgJER5bmFtaWNGaWVsZFNlYXJjaENhY2hlRGF0YSBlcSAnQVJSQVknICkgewogICAgICAgICAgICAgICAgICAgIEBEeW5hbWljRmllbGRVc2VyTG9naW5zID0gQHskRHluYW1pY0ZpZWxkU2VhcmNoQ2FjaGVEYXRhfTsKCiAgICAgICAgICAgICAgICAgICAgIyBzZXQgdGhlIHVzZWQgY2FjaGUgZmxhZwogICAgICAgICAgICAgICAgICAgICRVc2VkQ2FjaGUgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdJbnZhbGlkIHJlZiAnIC4gcmVmKCREeW5hbWljRmllbGRTZWFyY2hDYWNoZURhdGEpIC4gJyEnCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgR2V0IHRoZSBkYXRhIG9ubHkgZnJvbSBkYXRhYmFzZSwgaWYgbm8gY2FjaGUgZW50cnkgZXhpc3RzLgogICAgICAgIGlmICggISRVc2VkQ2FjaGUgKSB7CgogICAgICAgICAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICAgICAgICAgIFNRTCA9PiAkU1FMRHluYW1pY0ZpZWxkLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBEeW5hbWljRmllbGRVc2VyTG9naW5zLCAkUm93WzBdOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPlNldCgKICAgICAgICAgICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVyU2VhcmNoRGV0YWlsRHluYW1pY0ZpZWxkcycsCiAgICAgICAgICAgICAgICAgICAgS2V5ICAgPT4gJFNRTER5bmFtaWNGaWVsZCwKICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9PiBcQER5bmFtaWNGaWVsZFVzZXJMb2dpbnMsCiAgICAgICAgICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q2FjaGVUVEx9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyBBZGQgdGhlIHVzZXIgbG9naW5zIGZyb20gdGhlIGR5bmFtaWMgZmllbGRzLCBpZiBhIHNlYXJjaCByZXN1bHQgZXhpc3RzIGZyb20gdGhlIGR5bmFtaWMgZmllbGQgc2VhcmNoCiAgICAgICAgIyAgIG9yIHNraXAgdGhlIHNlYXJjaCBhbmQgcmV0dXJuIGEgZW1wdHJ5IGFycmF5IHJlZiwgaWYgbm8gdXNlciBsb2dpbnMgZXhpc3RzIGZyb20gdGhlIGR5bmFtaWMgZmllbGQgc2VhcmNoLgogICAgICAgIGlmIChARHluYW1pY0ZpZWxkVXNlckxvZ2lucykgewoKICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZFVzZXJMb2dpbnNGaWx0ZXIgPSAnKHwnOwogICAgICAgICAgICBmb3IgbXkgJE9uZVBhcmFtIChARHluYW1pY0ZpZWxkVXNlckxvZ2lucykgewogICAgICAgICAgICAgICAgJER5bmFtaWNGaWVsZFVzZXJMb2dpbnNGaWx0ZXIgLj0gIigkU2VsZi0+e0N1c3RvbWVyS2V5fT0iIC4gJFNlbGYtPl9Db252ZXJ0VG8oJE9uZVBhcmFtKSAuICIpIjsKICAgICAgICAgICAgfQogICAgICAgICAgICAkRHluYW1pY0ZpZWxkVXNlckxvZ2luc0ZpbHRlciAuPSAnKSc7CgogICAgICAgICAgICAjIEFkZCB0aGUgZHluYW1pYyBmaWVsZCB1c2VyIGxvZ2lucyBmaWx0ZXIgdG8gdGhlIGxkYXAgZmlsdGVyLgogICAgICAgICAgICAkRmlsdGVyID0gIigmJEZpbHRlciREeW5hbWljRmllbGRVc2VyTG9naW5zRmlsdGVyKSI7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gJFJlc3VsdCBlcSAnQ09VTlQnID8gMCA6IFtdOwogICAgICAgIH0KICAgIH0KCiAgICAjIFNwZWNpYWwgcGFyYW1ldGVyIHRvIGV4Y2x1ZGUgc29tZSB1c2VyIGxvZ2lucyBmcm9tIHRoZSBzZWFyY2ggcmVzdWx0LgogICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRQYXJhbXtFeGNsdWRlVXNlckxvZ2luc30gKSApIHsKICAgICAgICBteSAkRXhjbHVkZVVzZXJMb2dpbnNGaWx0ZXIgPSAnKCYnOwogICAgICAgIGZvciBteSAkT25lUGFyYW0gKCBAeyAkUGFyYW17RXhjbHVkZVVzZXJMb2dpbnN9IH0gKSB7CiAgICAgICAgICAgICRFeGNsdWRlVXNlckxvZ2luc0ZpbHRlciAuPSAiKCEoJFNlbGYtPntDdXN0b21lcktleX09IiAuICRTZWxmLT5fQ29udmVydFRvKCRPbmVQYXJhbSkgLiAiKSkiOwogICAgICAgIH0KICAgICAgICAkRXhjbHVkZVVzZXJMb2dpbnNGaWx0ZXIgLj0gJyknOwoKICAgICAgICAjIEFkZCB0aGUgZXhjbHVkZSB1c2VyIGxvZ2lucyBmaWx0ZXIgdG8gdGhlIGxkYXAgZmlsdGVyLgogICAgICAgICRGaWx0ZXIgPSAiKCYkRmlsdGVyJEV4Y2x1ZGVVc2VyTG9naW5zRmlsdGVyKSI7CiAgICB9CgogICAgaWYgKCAkU2VsZi0+e0Fsd2F5c0ZpbHRlcn0gKSB7CiAgICAgICAgJEZpbHRlciA9ICIoJiRGaWx0ZXIkU2VsZi0+e0Fsd2F5c0ZpbHRlcn0pIjsKICAgIH0KCiAgICBpZiAoICRTZWxmLT57VmFsaWRGaWx0ZXJ9ICYmICRWYWxpZCApIHsKICAgICAgICAkRmlsdGVyID0gIigmJEZpbHRlciRTZWxmLT57VmFsaWRGaWx0ZXJ9KSI7CiAgICB9CgogICAgIyBEZWZhdWx0IGZpbHRlciBmb3IgdGhlIHNlYXJjaCwgaWYgbm8gZmlsdGVyIGV4aXN0cy4KICAgIGlmICggISRGaWx0ZXIgKSB7CiAgICAgICAgJEZpbHRlciA9ICIoJFNlbGYtPntDdXN0b21lcktleX09KikiOwogICAgfQoKICAgICMgQ2hlY2sgaWYgT3JkZXJCeSBjb250YWlucyBvbmx5IHVuaXF1ZSB2YWxpZCB2YWx1ZXMuCiAgICBteSAlT3JkZXJCeVNlZW47CiAgICBmb3IgbXkgJE9yZGVyQnkgKCBAeyAkUGFyYW17T3JkZXJCeX0gfSApIHsKCiAgICAgICAgaWYgKCAhJE9yZGVyQnkgfHwgJE9yZGVyQnlTZWVueyRPcmRlckJ5fSApIHsKCiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJPcmRlckJ5IGNvbnRhaW5zIGludmFsaWQgdmFsdWUgJyRPcmRlckJ5JyBvciB0aGUgdmFsdWUgaXMgdXNlZCBtb3JlIHRoYW4gb25jZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAjIFJlbWVtYmVyIHRoZSB2YWx1ZSB0byBjaGVjayBpZiBpdCBhcHBlYXJzIG1vcmUgdGhhbiBvbmNlLgogICAgICAgICRPcmRlckJ5U2VlbnskT3JkZXJCeX0gPSAxOwogICAgfQoKICAgICMgQ2hlY2sgaWYgT3JkZXJCeURpcmVjdGlvbiBhcnJheSBjb250YWlucyBvbmx5ICdVcCcgb3IgJ0Rvd24nLgogICAgRElSRUNUSU9OOgogICAgZm9yIG15ICREaXJlY3Rpb24gKCBAeyAkUGFyYW17T3JkZXJCeURpcmVjdGlvbn0gfSApIHsKCiAgICAgICAgIyBPbmx5ICdVcCcgb3IgJ0Rvd24nIGFsbG93ZWQuCiAgICAgICAgbmV4dCBESVJFQ1RJT04gaWYgJERpcmVjdGlvbiBlcSAnVXAnOwogICAgICAgIG5leHQgRElSRUNUSU9OIGlmICREaXJlY3Rpb24gZXEgJ0Rvd24nOwoKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk9yZGVyQnlEaXJlY3Rpb24gY2FuIG9ubHkgY29udGFpbiAnVXAnIG9yICdEb3duJyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgQXNzZW1ibGUgdGhlIE9SREVSIEJZIGNsYXVzZS4KICAgIG15IEBPcmRlckJ5RmllbGRzOwogICAgbXkgJE9yZGVyQnlTdHJpbmcgPSAnJzsKICAgIG15ICRDb3VudCAgICAgICAgID0gMDsKCiAgICBPUkRFUkJZOgogICAgZm9yIG15ICRPcmRlckJ5ICggQHsgJFBhcmFte09yZGVyQnl9IH0gKSB7CiAgICAgICAgbmV4dCBPUkRFUkJZIGlmICEkT3JkZXJCeVRhYmxleyRPcmRlckJ5fTsKCiAgICAgICAgbXkgJERpcmVjdGlvbiA9ICRQYXJhbXtPcmRlckJ5RGlyZWN0aW9ufS0+WyRDb3VudF0gfHwgJ0Rvd24nOwoKICAgICAgICAkT3JkZXJCeVN0cmluZyAuPSAkT3JkZXJCeVRhYmxleyRPcmRlckJ5fSAuICREaXJlY3Rpb247CgogICAgICAgIHB1c2ggQE9yZGVyQnlGaWVsZHMsIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICA9PiAkT3JkZXJCeSwKICAgICAgICAgICAgRGF0YWJhc2VGaWVsZCA9PiAkT3JkZXJCeVRhYmxleyRPcmRlckJ5fSwKICAgICAgICAgICAgRGlyZWN0aW9uICAgICA9PiAkRGlyZWN0aW9uLAogICAgICAgIH07CiAgICB9CiAgICBjb250aW51ZSB7CiAgICAgICAgJENvdW50Kys7CiAgICB9CgogICAgIyBJZiB0aGVyZSBpcyBhIHBvc3NpYmlsaXR5IHRoYXQgdGhlIG9yZGVyaW5nIGlzIG5vdCBkZXRlcm1pbmVkCiAgICAjICAgd2UgYWRkIGFuIGRlc2NlbmRpbmcgb3JkZXJpbmcgYnkgaWQuCiAgICBpZiAoICFncmVwIHsgJF8gZXEgJ1VzZXJMb2dpbicgfSAoIEB7ICRQYXJhbXtPcmRlckJ5fSB9ICkgKSB7CiAgICAgICAgcHVzaCBAT3JkZXJCeUZpZWxkcywgewogICAgICAgICAgICBOYW1lICAgICAgICAgID0+ICdVc2VyTG9naW4nLAogICAgICAgICAgICBEYXRhYmFzZUZpZWxkID0+ICIkU2VsZi0+e0N1c3RvbWVyS2V5fSIsCiAgICAgICAgICAgIERpcmVjdGlvbiAgICAgPT4gJ0Rvd24nLAogICAgICAgIH07CiAgICB9CgogICAgbXkgJENhY2hlS2V5ID0gJ0N1c3RvbWVyU2VhcmNoRGV0YWlsOjonIC4gJFJlc3VsdCAuICRGaWx0ZXIgLiAkUGFyYW17TGltaXR9IC4gJE9yZGVyQnlTdHJpbmc7CgogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICBteSAkQ2FjaGVEYXRhID0gJFNlbGYtPntDYWNoZU9iamVjdH0tPkdldCgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgPT4gJENhY2hlS2V5LAogICAgICAgICk7CgogICAgICAgIGlmICggZGVmaW5lZCAkQ2FjaGVEYXRhICkgewogICAgICAgICAgICBpZiAoIHJlZiAkQ2FjaGVEYXRhIGVxICdBUlJBWScgKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJENhY2hlRGF0YTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoIHJlZiAkQ2FjaGVEYXRhIGVxICcnICkgewogICAgICAgICAgICAgICAgcmV0dXJuICRDYWNoZURhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0ludmFsaWQgcmVmICcgLiByZWYoJENhY2hlRGF0YSkgLiAnIScKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gaWYgISRTZWxmLT5fQ29ubmVjdCgpOwoKICAgICMgY0NtYmluZSBuZWVkZWQgYXR0cmlidXRlcy4KICAgIG15IEBBdHRyaWJ1dGVzID0gbWFwIHsgJF8tPntEYXRhYmFzZUZpZWxkfSB9IEBPcmRlckJ5RmllbGRzOwoKICAgICMgUGVyZm9ybSB0aGUgbGRhcCB1c2VyIHNlYXJjaC4KICAgIG15ICRSZXN1bHRTZWFyY2ggPSAkU2VsZi0+e0xEQVB9LT5zZWFyY2goCiAgICAgICAgYmFzZSAgICAgID0+ICRTZWxmLT57QmFzZUROfSwKICAgICAgICBzY29wZSAgICAgPT4gJFNlbGYtPntTU2NvcGV9LAogICAgICAgIGZpbHRlciAgICA9PiAkRmlsdGVyLAogICAgICAgIHNpemVsaW1pdCA9PiAkU2VsZi0+e1VzZXJTZWFyY2hMaXN0TGltaXR9LAogICAgICAgIGF0dHJzICAgICA9PiBcQEF0dHJpYnV0ZXMsCiAgICApOwoKICAgIGlmICggJFJlc3VsdFNlYXJjaC0+Y29kZSgpICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAkUmVzdWx0U2VhcmNoLT5lcnJvcigpLAogICAgICAgICk7CiAgICB9CgogICAgbXkgQFRtcEN1c3RvbWVyVXNlcnM7CiAgICBmb3IgbXkgJEVudHJ5ICggJFJlc3VsdFNlYXJjaC0+YWxsX2VudHJpZXMoKSApIHsKCiAgICAgICAgbXkgJURhdGE7CiAgICAgICAgZm9yIG15ICRPcmRlckJ5IChAT3JkZXJCeUZpZWxkcykgewoKICAgICAgICAgICAgbXkgJEZpZWxkVmFsdWUgPSAkRW50cnktPmdldF92YWx1ZSggJE9yZGVyQnktPntEYXRhYmFzZUZpZWxkfSApOwogICAgICAgICAgICAkRmllbGRWYWx1ZSA9ICRTZWxmLT5fQ29udmVydEZyb20oJEZpZWxkVmFsdWUpOwoKICAgICAgICAgICAgJERhdGF7ICRPcmRlckJ5LT57TmFtZX0gfSA9ICRGaWVsZFZhbHVlOwogICAgICAgIH0KCiAgICAgICAgcHVzaCBAVG1wQ3VzdG9tZXJVc2VycywgXCVEYXRhOwogICAgfQoKICAgICMgU29ydCB0aGUgY3VzdG9tZXIgdXNlcnMuCiAgICBAVG1wQ3VzdG9tZXJVc2VycyA9IHNvcnQgeyAkU2VsZi0+X1NlYXJjaFJlc3VsdFNvcnQoQE9yZGVyQnlGaWVsZHMpIH0gQFRtcEN1c3RvbWVyVXNlcnM7CgogICAgbXkgQElEczsKCiAgICAjIENoZWNrIGlmIHVzZXIgbmVlZCB0byBiZSBpbiBhIGdyb3VwIQogICAgaWYgKCAkU2VsZi0+e0dyb3VwRE59ICkgewoKICAgICAgICBGSUxURVJJRDoKICAgICAgICBmb3IgbXkgJERhdGEgKEBUbXBDdXN0b21lclVzZXJzKSB7CgogICAgICAgICAgICBteSAkUmVzdWx0R3JvdXBETiA9ICRTZWxmLT57TERBUH0tPnNlYXJjaCgKICAgICAgICAgICAgICAgIGJhc2UgICAgICA9PiAkU2VsZi0+e0dyb3VwRE59LAogICAgICAgICAgICAgICAgc2NvcGUgICAgID0+ICRTZWxmLT57U1Njb3BlfSwKICAgICAgICAgICAgICAgIGZpbHRlciAgICA9PiAnbWVtYmVyVWlkPScgLiAkRGF0YS0+e1VzZXJMb2dpbn0sCiAgICAgICAgICAgICAgICBzaXplbGltaXQgPT4gJFNlbGYtPntVc2VyU2VhcmNoTGlzdExpbWl0fSwKICAgICAgICAgICAgICAgIGF0dHJzICAgICA9PiBbJzEuMSddLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgbmV4dCBGSUxURVJJRCBpZiAhJFJlc3VsdEdyb3VwRE4tPmFsbF9lbnRyaWVzKCk7CgogICAgICAgICAgICBwdXNoIEBJRHMsICREYXRhLT57VXNlckxvZ2lufTsKICAgICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBASURzID0gbWFwIHsgJF8tPntVc2VyTG9naW59IH0gQFRtcEN1c3RvbWVyVXNlcnM7CiAgICB9CgogICAgaWYgKCAkUGFyYW17TGltaXR9ICkgewogICAgICAgIHNwbGljZSBASURzLCAkUGFyYW17TGltaXR9OwogICAgfQoKICAgIGlmICggJFJlc3VsdCBlcSAnQ09VTlQnICkgewoKICAgICAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+U2V0KAogICAgICAgICAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgICAgICAgICAgVmFsdWUgPT4gc2NhbGFyIEBJRHMsCiAgICAgICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDYWNoZVRUTH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzY2FsYXIgQElEczsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+U2V0KAogICAgICAgICAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgICAgICAgICAgVmFsdWUgPT4gXEBJRHMsCiAgICAgICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDYWNoZVRUTH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBcQElEczsKICAgIH0KfQoKc3ViIEN1c3RvbWVySURMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJFZhbGlkICAgICAgPSBkZWZpbmVkICRQYXJhbXtWYWxpZH0gPyAkUGFyYW17VmFsaWR9IDogMTsKICAgIG15ICRTZWFyY2hUZXJtID0gJFBhcmFte1NlYXJjaFRlcm19IHx8ICcnOwoKICAgIG15ICRDYWNoZUtleSA9ICJDdXN0b21lcklETGlzdDo6JHtWYWxpZH06OiRTZWFyY2hUZXJtIjsKCiAgICAjIGNoZWNrIGNhY2hlCiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgIG15ICRSZXN1bHQgPSAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+R2V0KAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXksCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gQHskUmVzdWx0fSBpZiByZWYgJFJlc3VsdCBlcSAnQVJSQVknOwogICAgfQoKICAgICMgcHJlcGFyZSBmaWx0ZXIKICAgIG15ICRGaWx0ZXIgPSAiKCRTZWxmLT57Q3VzdG9tZXJJRH09KikiOwogICAgaWYgKCRTZWFyY2hUZXJtKSB7CgogICAgICAgIG15ICRTZWFyY2hGaWx0ZXIgPSAkU2VsZi0+e1NlYXJjaFByZWZpeH0gLiAkU2VhcmNoVGVybSAuICRTZWxmLT57U2VhcmNoU3VmZml4fTsKICAgICAgICAkU2VhcmNoRmlsdGVyID1+IHMvKFwlKykvXCUvZzsKICAgICAgICAkU2VhcmNoRmlsdGVyID1+IHMvKFwqKylcKi8qL2c7CgogICAgICAgICMgcXVvdGUgTERBUCBmaWx0ZXIgdmFsdWUgYnV0IGtlZXAgYXN0ZXJpc2tzIHVuZXNjYXBlZCAod2lsZGNhcmQpCiAgICAgICAgJFNlYXJjaEZpbHRlciA9fiBzL1wqL2VuY29kZWRhc3RlcmlzazIwMTYwOTMwL2c7CiAgICAgICAgJFNlYXJjaEZpbHRlciA9IGVzY2FwZV9maWx0ZXJfdmFsdWUoJFNlYXJjaEZpbHRlcik7CiAgICAgICAgJFNlYXJjaEZpbHRlciA9fiBzL2VuY29kZWRhc3RlcmlzazIwMTYwOTMwLyovZzsKCiAgICAgICAgJEZpbHRlciA9ICIoJFNlbGYtPntDdXN0b21lcklEfT0kU2VhcmNoRmlsdGVyKSI7CgogICAgfQoKICAgIGlmICggJFNlbGYtPntBbHdheXNGaWx0ZXJ9ICkgewogICAgICAgICRGaWx0ZXIgPSAiKCYkRmlsdGVyJFNlbGYtPntBbHdheXNGaWx0ZXJ9KSI7CiAgICB9CgogICAgIyBhZGQgdmFsaWQgZmlsdGVyCiAgICBpZiAoICRTZWxmLT57VmFsaWRGaWx0ZXJ9ICYmICRWYWxpZCApIHsKICAgICAgICAkRmlsdGVyID0gIigmJEZpbHRlciRTZWxmLT57VmFsaWRGaWx0ZXJ9KSI7CiAgICB9CgogICAgIyBjcmVhdGUgbGRhcCBjb25uZWN0CiAgICByZXR1cm4gaWYgISRTZWxmLT5fQ29ubmVjdCgpOwoKICAgICMgY29tYmluZSBuZWVkZWQgYXR0cnMKICAgIG15IEBBdHRyaWJ1dGVzID0gKCAkU2VsZi0+e0N1c3RvbWVyS2V5fSwgJFNlbGYtPntDdXN0b21lcklEfSApOwoKICAgICMgcGVyZm9ybSB1c2VyIHNlYXJjaAogICAgbXkgJFJlc3VsdCA9ICRTZWxmLT57TERBUH0tPnNlYXJjaCgKICAgICAgICBiYXNlICAgICAgPT4gJFNlbGYtPntCYXNlRE59LAogICAgICAgIHNjb3BlICAgICA9PiAkU2VsZi0+e1NTY29wZX0sCiAgICAgICAgZmlsdGVyICAgID0+ICRGaWx0ZXIsCiAgICAgICAgc2l6ZWxpbWl0ID0+ICRTZWxmLT57VXNlclNlYXJjaExpc3RMaW1pdH0sCiAgICAgICAgYXR0cnMgICAgID0+IFxAQXR0cmlidXRlcywKICAgICk7CgogICAgIyBsb2cgbGRhcCBlcnJvcnMKICAgIGlmICggJFJlc3VsdC0+Y29kZSgpICkgewoKICAgICAgICBpZiAoICRSZXN1bHQtPmNvZGUoKSA9PSA0ICkgewoKICAgICAgICAgICAgIyBSZXN1bHQgY29kZSA0IChMREFQX1NJWkVMSU1JVF9FWENFRURFRCkgaXMgbm9ybWFsIGlmIHRoZXJlCiAgICAgICAgICAgICMgYXJlIG1vcmUgaXRlbXMgaW4gTERBUCB0aGFuIHNlYXJjaCBsaW1pdCBkZWZpbmVkIGluIE9UT0JPIG9yCiAgICAgICAgICAgICMgaW4gTERBUCBzZXJ2ZXIuIEF2b2lkIHNwYW1taW5nIGxvZ3Mgd2l0aCBzdWNoIGVycm9ycy4KICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZGVidWcnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0xEQVAgc2l6ZSBsaW1pdCBleGNlZWRlZCAoJyAuICRSZXN1bHQtPmVycm9yKCkgLiAnKS4nLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ1NlYXJjaCBmYWlsZWQhICcgLiAkUmVzdWx0LT5lcnJvcigpLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KCiAgICBteSAlVXNlcnM7CiAgICBmb3IgbXkgJEVudHJ5ICggJFJlc3VsdC0+YWxsX2VudHJpZXMoKSApIHsKCiAgICAgICAgbXkgJEZpZWxkVmFsdWUgPSAkRW50cnktPmdldF92YWx1ZSggJFNlbGYtPntDdXN0b21lcklEfSApOwogICAgICAgICRGaWVsZFZhbHVlID0gZGVmaW5lZCAkRmllbGRWYWx1ZSA/ICRGaWVsZFZhbHVlIDogJyc7CgogICAgICAgIG15ICRLZXlWYWx1ZSA9ICRFbnRyeS0+Z2V0X3ZhbHVlKCAkU2VsZi0+e0N1c3RvbWVyS2V5fSApOwogICAgICAgICRLZXlWYWx1ZSA9IGRlZmluZWQgJEtleVZhbHVlID8gJEtleVZhbHVlIDogJyc7CiAgICAgICAgJFVzZXJzeyAkU2VsZi0+X0NvbnZlcnRGcm9tKCRLZXlWYWx1ZSkgfSA9ICRTZWxmLT5fQ29udmVydEZyb20oJEZpZWxkVmFsdWUpOwogICAgfQoKICAgICMgY2hlY2sgaWYgdXNlciBuZWVkIHRvIGJlIGluIGEgZ3JvdXAhCiAgICBpZiAoICRTZWxmLT57R3JvdXBETn0gKSB7CiAgICAgICAgZm9yIG15ICRGaWx0ZXIyICggc29ydCBrZXlzICVVc2VycyApIHsKICAgICAgICAgICAgbXkgJFJlc3VsdDIgPSAkU2VsZi0+e0xEQVB9LT5zZWFyY2goCiAgICAgICAgICAgICAgICBiYXNlICAgICAgPT4gJFNlbGYtPntHcm91cEROfSwKICAgICAgICAgICAgICAgIHNjb3BlICAgICA9PiAkU2VsZi0+e1NTY29wZX0sCiAgICAgICAgICAgICAgICBmaWx0ZXIgICAgPT4gJ21lbWJlclVpZD0nIC4gZXNjYXBlX2ZpbHRlcl92YWx1ZSgkRmlsdGVyMiksCiAgICAgICAgICAgICAgICBzaXplbGltaXQgPT4gJFNlbGYtPntVc2VyU2VhcmNoTGlzdExpbWl0fSwKICAgICAgICAgICAgICAgIGF0dHJzICAgICA9PiBbJzEuMSddLAogICAgICAgICAgICApOwogICAgICAgICAgICBpZiAoICEkUmVzdWx0Mi0+YWxsX2VudHJpZXMoKSApIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSAkVXNlcnN7JEZpbHRlcjJ9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgbWFrZSBDdXN0b21lcklEcyB1bmlxdWUKICAgIG15ICVUbXA7CiAgICBAVG1weyB2YWx1ZXMgJVVzZXJzIH0gPSB1bmRlZjsKICAgIG15IEBSZXN1bHQgPSBrZXlzICVUbXA7CgogICAgIyBjYWNoZSByZXF1ZXN0CiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgICAgICBWYWx1ZSA9PiBcQFJlc3VsdCwKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q2FjaGVUVEx9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuIEBSZXN1bHQ7Cn0KCnN1YiBDdXN0b21lcklEcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcn0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXIhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgY2FjaGUKICAgIGlmICggJFNlbGYtPntDYWNoZU9iamVjdH0gKSB7CiAgICAgICAgbXkgJEN1c3RvbWVySURzID0gJFNlbGYtPntDYWNoZU9iamVjdH0tPkdldCgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgPT4gIkN1c3RvbWVySURzOjokUGFyYW17VXNlcn0iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuIEB7JEN1c3RvbWVySURzfSBpZiByZWYgJEN1c3RvbWVySURzIGVxICdBUlJBWSc7CiAgICB9CgogICAgIyBnZXQgY3VzdG9tZXIgZGF0YQogICAgbXkgJURhdGEgPSAkU2VsZi0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICBVc2VyID0+ICRQYXJhbXtVc2VyfSwKICAgICk7CgogICAgIyB0aGVyZSBhcmUgbXVsdGkgY3VzdG9tZXIgaWRzCiAgICBteSBAQ3VzdG9tZXJJRHM7CiAgICBpZiAoICREYXRhe1VzZXJDdXN0b21lcklEc30gKSB7CgogICAgICAgICMgdXNlZCBzZXBhcmF0b3JzCiAgICAgICAgU0VQQVJBVE9SOgogICAgICAgIGZvciBteSAkU2VwYXJhdG9yICggJzsnLCAnLCcsICd8JyApIHsKCiAgICAgICAgICAgIG5leHQgU0VQQVJBVE9SIGlmICREYXRhe1VzZXJDdXN0b21lcklEc30gIX4gL1xRJFNlcGFyYXRvclxFLzsKCiAgICAgICAgICAgICMgc3BsaXQgaXQKICAgICAgICAgICAgbXkgQElEcyA9IHNwbGl0IC9cUSRTZXBhcmF0b3JcRS8sICREYXRhe1VzZXJDdXN0b21lcklEc307CgogICAgICAgICAgICBmb3IgbXkgJElEIChASURzKSB7CiAgICAgICAgICAgICAgICAkSUQgPX4gcy9eXHMrLy9nOwogICAgICAgICAgICAgICAgJElEID1+IHMvXHMrJC8vZzsKICAgICAgICAgICAgICAgIHB1c2ggQEN1c3RvbWVySURzLCAkSUQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGxhc3QgU0VQQVJBVE9SOwogICAgICAgIH0KCiAgICAgICAgIyBmYWxsYmFjayBpZiBubyBzZXBhcmF0b3IgZ290IGZvdW5kCiAgICAgICAgaWYgKCAhQEN1c3RvbWVySURzICkgewogICAgICAgICAgICAkRGF0YXtVc2VyQ3VzdG9tZXJJRHN9ID1+IHMvXlxzKy8vZzsKICAgICAgICAgICAgJERhdGF7VXNlckN1c3RvbWVySURzfSA9fiBzL1xzKyQvL2c7CiAgICAgICAgICAgIHB1c2ggQEN1c3RvbWVySURzLCAkRGF0YXtVc2VyQ3VzdG9tZXJJRHN9OwogICAgICAgIH0KICAgIH0KCiAgICAjIHVzZSBhbHNvIHRoZSBwcmltYXJ5IGN1c3RvbWVyIGlkCiAgICBpZiAoICREYXRhe1VzZXJDdXN0b21lcklEfSAmJiAhJFNlbGYtPntFeGNsdWRlUHJpbWFyeUN1c3RvbWVySUR9ICkgewogICAgICAgIHB1c2ggQEN1c3RvbWVySURzLCAkRGF0YXtVc2VyQ3VzdG9tZXJJRH07CiAgICB9CgogICAgIyBjYWNoZSByZXF1ZXN0CiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgICRTZWxmLT57Q2FjaGVPYmplY3R9LT5TZXQoCiAgICAgICAgICAgIFR5cGUgID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICAgPT4gJ0N1c3RvbWVySURzOjonIC4gJFBhcmFte1VzZXJ9LAogICAgICAgICAgICBWYWx1ZSA9PiBcQEN1c3RvbWVySURzLAogICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDYWNoZVRUTH0sCiAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gQEN1c3RvbWVySURzOwp9CgpzdWIgQ3VzdG9tZXJVc2VyRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcn0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXIhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgcGVyZm9ybSB1c2VyIHNlYXJjaAogICAgbXkgQEF0dHJpYnV0ZXM7CiAgICBFTlRSWToKICAgIGZvciBteSAkRW50cnkgKCBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntNYXB9IH0gKSB7CiAgICAgICAgbmV4dCBFTlRSWSBpZiAkRW50cnktPls1XSBlcSAnZHluYW1pY19maWVsZCc7CiAgICAgICAgcHVzaCggQEF0dHJpYnV0ZXMsICRFbnRyeS0+WzJdICk7CiAgICB9CiAgICBteSAkRmlsdGVyID0gIigkU2VsZi0+e0N1c3RvbWVyS2V5fT0iIC4gZXNjYXBlX2ZpbHRlcl92YWx1ZSggJFBhcmFte1VzZXJ9ICkgLiAnKSc7CgogICAgIyBwcmVwYXJlIGZpbHRlcgogICAgaWYgKCAkU2VsZi0+e0Fsd2F5c0ZpbHRlcn0gKSB7CiAgICAgICAgJEZpbHRlciA9ICIoJiRGaWx0ZXIkU2VsZi0+e0Fsd2F5c0ZpbHRlcn0pIjsKICAgIH0KCiAgICAjIGNoZWNrIGNhY2hlCiAgICBpZiAoICRTZWxmLT57Q2FjaGVPYmplY3R9ICkgewogICAgICAgIG15ICREYXRhID0gJFNlbGYtPntDYWNoZU9iamVjdH0tPkdldCgKICAgICAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgPT4gJ0N1c3RvbWVyVXNlckRhdGFHZXQ6OicgLiAkUGFyYW17VXNlcn0sCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gJXskRGF0YX0gaWYgcmVmICREYXRhIGVxICdIQVNIJzsKICAgIH0KCiAgICAjIGNyZWF0ZSBsZGFwIGNvbm5lY3QKICAgIHJldHVybiBpZiAhJFNlbGYtPl9Db25uZWN0KCk7CgogICAgIyBwZXJmb3JtIHNlYXJjaAogICAgbXkgJFJlc3VsdCA9ICRTZWxmLT57TERBUH0tPnNlYXJjaCgKICAgICAgICBiYXNlICAgPT4gJFNlbGYtPntCYXNlRE59LAogICAgICAgIHNjb3BlICA9PiAkU2VsZi0+e1NTY29wZX0sCiAgICAgICAgZmlsdGVyID0+ICRGaWx0ZXIsCiAgICAgICAgYXR0cnMgID0+IFxAQXR0cmlidXRlcywKICAgICk7CgogICAgIyBsb2cgbGRhcCBlcnJvcnMKICAgIGlmICggJFJlc3VsdC0+Y29kZSgpICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAkUmVzdWx0LT5lcnJvcigpLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGZpcnN0IGVudHJ5CiAgICBteSAkUmVzdWx0MiA9ICRSZXN1bHQtPmVudHJ5KDApOwogICAgaWYgKCAhJFJlc3VsdDIgKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGN1c3RvbWVyIHVzZXIgaW5mbwogICAgbXkgJURhdGE7CiAgICBFTlRSWToKICAgIGZvciBteSAkRW50cnkgKCBAeyAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntNYXB9IH0gKSB7CiAgICAgICAgbmV4dCBFTlRSWSBpZiAkRW50cnktPls1XSBlcSAnZHluYW1pY19maWVsZCc7CgogICAgICAgIG15ICRWYWx1ZSA9ICRTZWxmLT5fQ29udmVydEZyb20oICRSZXN1bHQyLT5nZXRfdmFsdWUoICRFbnRyeS0+WzJdICkgKSB8fCAnJzsKCiAgICAgICAgaWYgKCAkVmFsdWUgJiYgJEVudHJ5LT5bMl0gPX4gL150YXJnZXRhZGRyZXNzJC9pICkgewogICAgICAgICAgICAkVmFsdWUgPX4gcy9TTVRQOiguKikvJDEvOwogICAgICAgIH0KCiAgICAgICAgaWYgKCBJc1N0cmluZ1dpdGhEYXRhKCAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntUcmFuc2xhdGVNYW5hZ2VyVG99ICkgKSB7CiAgICAgICAgICAgIGlmICggJFZhbHVlICYmICRFbnRyeS0+WzJdID1+IC9ebWFuYWdlciQvaSApIHsKCiAgICAgICAgICAgICAgICAjIFdlIG5lZWQgdG8gY2hlY2sgaWYgd2UgbmVlZCB0byB0cmFuc2xhdGUgdGhlIG1hbmFnZXIgZmxhZwogICAgICAgICAgICAgICAgbXkgJFRyYW5zbGF0ZVRvID0gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57VHJhbnNsYXRlTWFuYWdlclRvfTsKCiAgICAgICAgICAgICAgICAjIHBlcmZvcm0gc2VhcmNoCiAgICAgICAgICAgICAgICBteSAkUmVzdWx0TWFuYWdlciA9ICRTZWxmLT57TERBUH0tPnNlYXJjaCgKICAgICAgICAgICAgICAgICAgICBiYXNlICAgPT4gJFZhbHVlLAogICAgICAgICAgICAgICAgICAgIHNjb3BlICA9PiAnYmFzZScsCiAgICAgICAgICAgICAgICAgICAgZmlsdGVyID0+ICIob2JqZWN0Q2xhc3M9KikiLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGdldCBmaXJzdCBlbnRyeQogICAgICAgICAgICAgICAgbXkgJFJlc3VsdE1hbmFnZXIyID0gJFJlc3VsdE1hbmFnZXItPmVudHJ5KDApOwogICAgICAgICAgICAgICAgJFZhbHVlID0gJFNlbGYtPl9Db252ZXJ0RnJvbSggJFJlc3VsdE1hbmFnZXIyLT5nZXRfdmFsdWUoJFRyYW5zbGF0ZVRvKSApIHx8ICcnOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkRGF0YXsgJEVudHJ5LT5bMF0gfSA9ICRWYWx1ZTsKICAgIH0KCiAgICByZXR1cm4gaWYgISREYXRhe1VzZXJMb2dpbn07CgogICAgIyB0byBidWlsZCB0aGUgVXNlck1haWxTdHJpbmcKICAgIG15ICRVc2VyTWFpbFN0cmluZyA9ICcnOwogICAgbXkgQFVzZXJNYWlsU3RyaW5nUGFydHM7CgogICAgbXkgJEN1c3RvbWVyVXNlckxpc3RGaWVsZHNNYXAgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJMaXN0RmllbGRzfTsKICAgIGlmICggIUlzQXJyYXlSZWZXaXRoRGF0YSgkQ3VzdG9tZXJVc2VyTGlzdEZpZWxkc01hcCkgKSB7CiAgICAgICAgJEN1c3RvbWVyVXNlckxpc3RGaWVsZHNNYXAgPSBbICdmaXJzdF9uYW1lJywgJ2xhc3RfbmFtZScsICdlbWFpbCcsIF07CiAgICB9CgogICAgZm9yIG15ICRGaWVsZCAoIEB7JEN1c3RvbWVyVXNlckxpc3RGaWVsZHNNYXB9ICkgewoKICAgICAgICBteSAkVmFsdWUgPSAkU2VsZi0+X0NvbnZlcnRGcm9tKCAkUmVzdWx0Mi0+Z2V0X3ZhbHVlKCRGaWVsZCkgKSB8fCAnJzsKCiAgICAgICAgaWYgKCRWYWx1ZSkgewogICAgICAgICAgICBpZiAoICRGaWVsZCA9fiAvXnRhcmdldGFkZHJlc3MkL2kgKSB7CiAgICAgICAgICAgICAgICAkVmFsdWUgPX4gcy9TTVRQOiguKikvJDEvOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHB1c2ggQFVzZXJNYWlsU3RyaW5nUGFydHMsICRWYWx1ZTsKICAgICAgICB9CiAgICB9CiAgICAkVXNlck1haWxTdHJpbmcgPSBqb2luICcgJywgQFVzZXJNYWlsU3RyaW5nUGFydHM7CiAgICAkVXNlck1haWxTdHJpbmcgPX4gcy9eKC4qKVxzKC4rP1xALis/XC4uKz8pKFxzfCkkLyIkMSIgPCQyPi87CgogICAgIyBhZGQgdGhlIFVzZXJNYWlsU3RyaW5nIHRvIHRoZSBkYXRhIGhhc2gKICAgICREYXRhe1VzZXJNYWlsU3RyaW5nfSA9ICRVc2VyTWFpbFN0cmluZzsKCiAgICAjIGNvbXBhdCEKICAgICREYXRhe1VzZXJJRH0gPSAkRGF0YXtVc2VyTG9naW59OwoKICAgICMgZ2V0IHByZWZlcmVuY2VzCiAgICBteSAlUHJlZmVyZW5jZXMgPSAkU2VsZi0+R2V0UHJlZmVyZW5jZXMoIFVzZXJJRCA9PiAkRGF0YXtVc2VyTG9naW59ICk7CgogICAgIyBhZGQgbGFzdCBsb2dpbiB0aW1lc3RhbXAKICAgIGlmICggJFByZWZlcmVuY2Vze1VzZXJMYXN0TG9naW59ICkgewoKICAgICAgICBteSAkRGF0ZVRpbWVPYmplY3QgPSAkS2VybmVsOjpPTS0+Q3JlYXRlKAogICAgICAgICAgICAnS2VybmVsOjpTeXN0ZW06OkRhdGVUaW1lJywKICAgICAgICAgICAgT2JqZWN0UGFyYW1zID0+IHsKICAgICAgICAgICAgICAgIEVwb2NoID0+ICRQcmVmZXJlbmNlc3tVc2VyTGFzdExvZ2lufSwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAkUHJlZmVyZW5jZXN7VXNlckxhc3RMb2dpblRpbWVzdGFtcH0gPSAkRGF0ZVRpbWVPYmplY3QtPlRvU3RyaW5nKCk7CgogICAgfQoKICAgICMgY2FjaGUgcmVxdWVzdAogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIEtleSAgID0+ICdDdXN0b21lclVzZXJEYXRhR2V0OjonIC4gJFBhcmFte1VzZXJ9LAogICAgICAgICAgICBWYWx1ZSA9PiB7ICVEYXRhLCAlUHJlZmVyZW5jZXMgfSwKICAgICAgICAgICAgVFRMICAgPT4gJFNlbGYtPntDdXN0b21lclVzZXJNYXB9LT57Q2FjaGVUVEx9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICggJURhdGEsICVQcmVmZXJlbmNlcyApOwp9CgpzdWIgQ3VzdG9tZXJVc2VyQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayByby9ydwogICAgaWYgKCAkU2VsZi0+e1JlYWRPbmx5fSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0N1c3RvbWVyIGJhY2tlbmQgaXMgcmVhZCBvbmx5IScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgIE1lc3NhZ2UgID0+ICdOb3Qgc3VwcG9ydGVkIGZvciB0aGlzIG1vZHVsZSEnCiAgICApOwoKICAgIHJldHVybjsKfQoKc3ViIEN1c3RvbWVyVXNlclVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgcm8vcncKICAgIGlmICggJFNlbGYtPntSZWFkT25seX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdDdXN0b21lciBiYWNrZW5kIGlzIHJlYWQgb25seSEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICBNZXNzYWdlICA9PiAnTm90IHN1cHBvcnRlZCBmb3IgdGhpcyBtb2R1bGUhJwogICAgKTsKCiAgICByZXR1cm47Cn0KCnN1YiBTZXRQYXNzd29yZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRQdyA9ICRQYXJhbXtQV30gfHwgJyc7CgogICAgIyBjaGVjayByby9ydwogICAgaWYgKCAkU2VsZi0+e1JlYWRPbmx5fSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0N1c3RvbWVyIGJhY2tlbmQgaXMgcmVhZCBvbmx5IScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgIE1lc3NhZ2UgID0+ICdOb3Qgc3VwcG9ydGVkIGZvciB0aGlzIG1vZHVsZSEnCiAgICApOwoKICAgIHJldHVybjsKfQoKc3ViIEdlbmVyYXRlUmFuZG9tUGFzc3dvcmQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKS0+R2VuZXJhdGVSYW5kb21TdHJpbmcoCiAgICAgICAgTGVuZ3RoICAgICA9PiAkUGFyYW17U2l6ZX0gfHwgOCwKICAgICAgICBEaWN0aW9uYXJ5ID0+IFsgMCAuLiA5LCAnQScgLi4gJ1onLCAnYScgLi4gJ3onLCAnLScsICdfJywgJyEnLCAnQCcsICcjJywgJyQnLCAnJScsICdeJywgJyYnLCAnKicgXSwKICAgICk7Cn0KCnN1YiBTZXRQcmVmZXJlbmNlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtcwogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJJRCEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjYWNoZSByZXNldAogICAgaWYgKCAkU2VsZi0+e0NhY2hlT2JqZWN0fSApIHsKICAgICAgICAkU2VsZi0+e0NhY2hlT2JqZWN0fS0+RGVsZXRlKAogICAgICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICAgICAgS2V5ICA9PiAiQ3VzdG9tZXJVc2VyRGF0YUdldDo6JFBhcmFte1VzZXJJRH0iLAogICAgICAgICk7CiAgICB9CiAgICByZXR1cm4gJFNlbGYtPntQcmVmZXJlbmNlc09iamVjdH0tPlNldFByZWZlcmVuY2VzKCVQYXJhbSk7Cn0KCnN1YiBHZXRQcmVmZXJlbmNlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHBhcmFtcwogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIFVzZXJJRCEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgcmV0dXJuICRTZWxmLT57UHJlZmVyZW5jZXNPYmplY3R9LT5HZXRQcmVmZXJlbmNlcyglUGFyYW0pOwp9CgpzdWIgU2VhcmNoUHJlZmVyZW5jZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gJFNlbGYtPntQcmVmZXJlbmNlc09iamVjdH0tPlNlYXJjaFByZWZlcmVuY2VzKCVQYXJhbSk7Cn0KCnN1YiBfQ29udmVydEZyb20gewogICAgbXkgKCAkU2VsZiwgJFRleHQgKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkVGV4dDsKCiAgICBpZiAoICEkU2VsZi0+e1NvdXJjZUNoYXJzZXR9ICkgewogICAgICAgIHJldHVybiAkVGV4dDsKICAgIH0KCiAgICByZXR1cm4gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkVuY29kZScpLT5Db252ZXJ0KAogICAgICAgIFRleHQgPT4gJFRleHQsCiAgICAgICAgRnJvbSA9PiAkU2VsZi0+e1NvdXJjZUNoYXJzZXR9LAogICAgICAgIFRvICAgPT4gJ3V0Zi04JywKICAgICk7Cn0KCnN1YiBfQ29udmVydFRvIHsKICAgIG15ICggJFNlbGYsICRUZXh0ICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFRleHQ7CgogICAgIyBnZXQgZW5jb2RlIG9iamVjdAogICAgbXkgJEVuY29kZU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpFbmNvZGUnKTsKCiAgICBpZiAoICEkU2VsZi0+e1NvdXJjZUNoYXJzZXR9ICkgewogICAgICAgICRFbmNvZGVPYmplY3QtPkVuY29kZUlucHV0KCBcJFRleHQgKTsKICAgICAgICByZXR1cm4gJFRleHQ7CiAgICB9CgogICAgcmV0dXJuICRFbmNvZGVPYmplY3QtPkNvbnZlcnQoCiAgICAgICAgVGV4dCA9PiAkVGV4dCwKICAgICAgICBUbyAgID0+ICRTZWxmLT57U291cmNlQ2hhcnNldH0sCiAgICAgICAgRnJvbSA9PiAndXRmLTgnLAogICAgKTsKfQoKc3ViIF9DdXN0b21lclVzZXJDYWNoZUNsZWFyIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICEkU2VsZi0+e0NhY2hlT2JqZWN0fTsKCiAgICBpZiAoICEkUGFyYW17VXNlckxvZ2lufSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlckxvZ2luIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPkRlbGV0ZSgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICJDdXN0b21lclVzZXJEYXRhR2V0OjokUGFyYW17VXNlckxvZ2lufSIsCiAgICApOwogICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPkRlbGV0ZSgKICAgICAgICBUeXBlID0+ICRTZWxmLT57Q2FjaGVUeXBlfSwKICAgICAgICBLZXkgID0+ICJDdXN0b21lck5hbWU6OiRQYXJhbXtVc2VyTG9naW59IiwKICAgICk7CgogICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0gLiAnX0N1c3RvbWVyU2VhcmNoJywKICAgICk7CgogICAgJFNlbGYtPntDYWNoZU9iamVjdH0tPkNsZWFuVXAoCiAgICAgICAgVHlwZSA9PiAnQ3VzdG9tZXJHcm91cCcsCiAgICApOwoKICAgIHJldHVybiAxOwp9CgpzdWIgX1NlYXJjaFJlc3VsdFNvcnQgewogICAgbXkgKCAkU2VsZiwgQE9yZGVyQnlGaWVsZHMgKSA9IEBfOwoKICAgIGZvciBteSAkT3JkZXJCeSAoQE9yZGVyQnlGaWVsZHMpIHsKICAgICAgICBteSAkQ29tcGFyZTsKCiAgICAgICAgaWYgKCAkT3JkZXJCeS0+e0RpcmVjdGlvbn0gJiYgJE9yZGVyQnktPntEaXJlY3Rpb259IGVxICdVcCcgKSB7CiAgICAgICAgICAgICRDb21wYXJlID0gbGMoICRhLT57ICRPcmRlckJ5LT57TmFtZX0gfSApIGNtcCBsYyggJGItPnsgJE9yZGVyQnktPntOYW1lfSB9ICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkQ29tcGFyZSA9IGxjKCAkYi0+eyAkT3JkZXJCeS0+e05hbWV9IH0gKSBjbXAgbGMoICRhLT57ICRPcmRlckJ5LT57TmFtZX0gfSApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJENvbXBhcmUgaWYgJENvbXBhcmU7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKc3ViIERFU1RST1kgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHRha2UgZG93biBzZXNzaW9uCiAgICBpZiAoICRTZWxmLT57TERBUH0gKSB7CiAgICAgICAgJFNlbGYtPntMREFQfS0+dW5iaW5kKCk7CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCjE7Cg==</File>
        <File Location="Custom/Kernel/System/CustomerCompany.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSA2ZWZkYzdiZjJhMzMyNTI3N2NkNzlhNjBmMGYyNDA3ZjhhZDU5ZTg3IC0gS2VybmVsL1N5c3RlbS9DdXN0b21lckNvbXBhbnkucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJDb21wYW55OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHBhcmVudCBxdyhLZXJuZWw6OlN5c3RlbTo6RXZlbnRIYW5kbGVyKTsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkOjpCYWNrZW5kJywKICAgICdLZXJuZWw6OlN5c3RlbTo6RW5jb2RlJywKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnLAojIEVPIFJvdGhlciBPU1MKICAgICdLZXJuZWw6OlN5c3RlbTo6TG9nJywKICAgICdLZXJuZWw6OlN5c3RlbTo6TWFpbicsCiAgICAnS2VybmVsOjpTeXN0ZW06OlJlZmVyZW5jZURhdGEnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpWYWxpZCcsCik7Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQ29tcGFueSAtIGN1c3RvbWVyIGNvbXBhbnkgbGliCgo9aGVhZDEgREVTQ1JJUFRJT04KCkFsbCBDdXN0b21lciBmdW5jdGlvbnMuIEUuZy4gdG8gYWRkIGFuZCB1cGRhdGUgY3VzdG9tZXIgY29tcGFuaWVzLgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1oZWFkMiBuZXcoKQoKRG9uJ3QgdXNlIHRoZSBjb25zdHJ1Y3RvciBkaXJlY3RseSwgdXNlIHRoZSBPYmplY3RNYW5hZ2VyIGluc3RlYWQ6CgogICAgbXkgJEN1c3RvbWVyQ29tcGFueU9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckNvbXBhbnknKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0gYmxlc3Mge30sICRUeXBlOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICRNYWluT2JqZWN0ICAgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TWFpbicpOwoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgIG15ICRMYXlvdXRQYXJhbSA9ICRLZXJuZWw6Ok9NLT57UGFyYW19LT57J0tlcm5lbDo6T3V0cHV0OjpIVE1MOjpMYXlvdXQnfTsKCiAgICAjIENoZWNrIGlmIG11bHRpdGVuYW5jeSBpcyBlbmFibGVkIGFuZCB0aGUgcmVxdWVzdCBpcyBjb21pbmcgZnJvbSBhIHVzZXIuCiAgICBpZiAoICRMYXlvdXRQYXJhbS0+e1VzZXJUeXBlfSAmJiAkTGF5b3V0UGFyYW0tPntVc2VyVHlwZX0gZXEgJ1VzZXInICYmICRDb25maWdPYmplY3QtPkdldCgnTXVsdGl0ZW5hbmN5JykgKSB7CgogICAgICAgICMgU2F2ZSB0aGUgVXNlcklEIGFuZCBhbGwgZ3JvdXBzIHRoZSB1c2VyIGhhcyAncm8nIHBlcm1pc3Npb24gb24uCiAgICAgICAgaWYgKCAkTGF5b3V0UGFyYW0tPntVc2VySUR9ICkgewogICAgICAgICAgICAjIE9ubHkgZ2V0IHRoZSBncm91cCBsaXN0IG9uY2UgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuCiAgICAgICAgICAgIG15ICVHcm91cHMgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+UGVybWlzc2lvblVzZXJHZXQoCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gJExheW91dFBhcmFtLT57VXNlcklEfSwKICAgICAgICAgICAgICAgIFR5cGUgICA9PiAncm8nLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBUaGUgbGltaXQgZG9lcyBub3QgY291bnQgZm9yIG1lbWJlcnMgb2YgYSBzcGVjaWZpYyBncm91cC4KICAgICAgICAgICAgbXkgJFBlcm1pc3Npb25Hcm91cCA9ICRDb25maWdPYmplY3QtPkdldCgnTXVsdGl0ZW5hbmN5OjpQZXJtaXNzaW9uR3JvdXAnKSB8fCAnJzsKICAgICAgICAgICAgbXkgJUdyb3Vwc1JldmVyc2UgICA9IHJldmVyc2UgJUdyb3VwczsKCiAgICAgICAgICAgIGlmICggISRHcm91cHNSZXZlcnNleyRQZXJtaXNzaW9uR3JvdXB9ICkgewogICAgICAgICAgICAgICAgJFNlbGYtPntNdWx0aXRlbmFuY3l9ID0gJExheW91dFBhcmFtLT57VXNlcklEfTsKICAgICAgICAgICAgICAgICRTZWxmLT57VXNlckdyb3VwSURzfSA9IFsga2V5cyAlR3JvdXBzIF07CiAgICAgICAgICAgICAgICAkU2VsZi0+e1VzZXJHcm91cHN9ICAgPSBbIHZhbHVlcyAlR3JvdXBzIF07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKCiAgICAjIGxvYWQgY3VzdG9tZXIgY29tcGFueSBiYWNrZW5kIG1vZHVsZXMKICAgIFNPVVJDRToKICAgIGZvciBteSAkQ291bnQgKCAnJywgMSAuLiAxMCApIHsKCiAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJDb21wYW55JENvdW50Iik7CiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAgICAgIyBDaGVjayBpZiB0aGUgdXNlciBoYXMgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhlIHNvdXJjZS4KICAgICAgICBteSAkQ3VzdG9tZXJDb21wYW55VXNlckdyb3VwID0gJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lckNvbXBhbnkkQ291bnQiKS0+e0N1c3RvbWVyQ29tcGFueVVzZXJHcm91cH07CgogICAgICAgICMgVGhlIHVzZXIgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIGdldCBpbmZvcm1hdGlvbiBmcm9tIHRoaXMgc291cmNlLgogICAgICAgIGlmICggJFNlbGYtPntNdWx0aXRlbmFuY3l9ICYmICRDdXN0b21lckNvbXBhbnlVc2VyR3JvdXAgKSB7CiAgICAgICAgICAgIGlmICggIWdyZXAgeyAkXyA9fiAvXiRDdXN0b21lckNvbXBhbnlVc2VyR3JvdXAkLyB9IEB7ICRTZWxmLT57VXNlckdyb3Vwc30gfSApIHsKICAgICAgICAgICAgICAgIG5leHQgU09VUkNFOwogICAgICAgICAgICB9CiAgICAgICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CgogICAgICAgIG15ICRHZW5lcmljTW9kdWxlID0gJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lckNvbXBhbnkkQ291bnQiKS0+e01vZHVsZX0KICAgICAgICAgICAgfHwgJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckNvbXBhbnk6OkRCJzsKICAgICAgICBpZiAoICEkTWFpbk9iamVjdC0+UmVxdWlyZSgkR2VuZXJpY01vZHVsZSkgKSB7CiAgICAgICAgICAgICRNYWluT2JqZWN0LT5EaWUoIkNhbid0IGxvYWQgYmFja2VuZCBtb2R1bGUgJEdlbmVyaWNNb2R1bGUhICRAIik7CiAgICAgICAgfQogICAgICAgICRTZWxmLT57IkN1c3RvbWVyQ29tcGFueSRDb3VudCJ9ID0gJEdlbmVyaWNNb2R1bGUtPm5ldygKICAgICAgICAgICAgQ291bnQgICAgICAgICAgICAgID0+ICRDb3VudCwKICAgICAgICAgICAgQ3VzdG9tZXJDb21wYW55TWFwID0+ICRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJDb21wYW55JENvdW50IiksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGluaXQgb2YgZXZlbnQgaGFuZGxlcgogICAgJFNlbGYtPkV2ZW50SGFuZGxlckluaXQoCiAgICAgICAgQ29uZmlnID0+ICdDdXN0b21lckNvbXBhbnk6OkV2ZW50TW9kdWxlUG9zdCcsCiAgICApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWhlYWQyIEN1c3RvbWVyQ29tcGFueUFkZCgpCgphZGQgYSBuZXcgY3VzdG9tZXIgY29tcGFueQoKICAgIG15ICRJRCA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueUFkZCgKICAgICAgICBDdXN0b21lcklEICAgICAgICAgICAgICA9PiAnZXhhbXBsZS5jb20nLAogICAgICAgIEN1c3RvbWVyQ29tcGFueU5hbWUgICAgID0+ICdOZXcgQ3VzdG9tZXIgSW5jLicsCiAgICAgICAgQ3VzdG9tZXJDb21wYW55U3RyZWV0ICAgPT4gJzUyMDEgQmx1ZSBMYWdvb24gRHJpdmUnLAogICAgICAgIEN1c3RvbWVyQ29tcGFueVpJUCAgICAgID0+ICczMzEyNicsCiAgICAgICAgQ3VzdG9tZXJDb21wYW55Q2l0eSAgICAgPT4gJ01pYW1pJywKICAgICAgICBDdXN0b21lckNvbXBhbnlDb3VudHJ5ICA9PiAnVVNBJywKICAgICAgICBDdXN0b21lckNvbXBhbnlVUkwgICAgICA9PiAnaHR0cDovL3d3dy5leGFtcGxlLm9yZycsCiAgICAgICAgQ3VzdG9tZXJDb21wYW55Q29tbWVudCAgPT4gJ3NvbWUgY29tbWVudCcsCiAgICAgICAgVmFsaWRJRCAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICA9PiAxMjMsCiAgICApOwoKTk9URTogQWN0dWFsIGZpZWxkcyBhY2NlcHRlZCBieSB0aGlzIEFQSSBjYWxsIG1heSBkaWZmZXIgYmFzZWQgb24KQ3VzdG9tZXJDb21wYW55IG1hcHBpbmcgaW4geW91ciBzeXN0ZW0gY29uZmlndXJhdGlvbi4KCj1jdXQKCnN1YiBDdXN0b21lckNvbXBhbnlBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHNldCBkZWZhdWx0cwogICAgJFBhcmFte1NvdXJjZX0gfHw9ICdDdXN0b21lckNvbXBhbnknOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgKHF3KEN1c3RvbWVySUQgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRfISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIHN0b3JlIGN1c3RvbWVyIGNvbXBhbnkgZGF0YQogICAgbXkgJEN1c3RvbWVySUQgPSAkU2VsZi0+eyAkUGFyYW17U291cmNlfSB9LT5DdXN0b21lckNvbXBhbnlBZGQoJVBhcmFtKTsKCiAgICByZXR1cm4gdW5sZXNzICRDdXN0b21lcklEOwoKICAgICMgdHJpZ2dlciBldmVudAogICAgJFNlbGYtPkV2ZW50SGFuZGxlcigKICAgICAgICBFdmVudCA9PiAnQ3VzdG9tZXJDb21wYW55QWRkJywKICAgICAgICBEYXRhICA9PiB7CiAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJFBhcmFte0N1c3RvbWVySUR9LAogICAgICAgICAgICBOZXdEYXRhICAgID0+IFwlUGFyYW0sCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAkQ3VzdG9tZXJJRDsKfQoKPWhlYWQyIEN1c3RvbWVyQ29tcGFueUdldCgpCgpnZXQgY3VzdG9tZXIgY29tcGFueSBhdHRyaWJ1dGVzCgogICAgbXkgJUN1c3RvbWVyQ29tcGFueSA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueUdldCgKICAgICAgICBDdXN0b21lcklEID0+IDEyMywKICAgICk7CgpSZXR1cm5zOgoKICAgICVDdXN0b21lckNvbXBhbnkgPSAoCiAgICAgICAgJ0N1c3RvbWVyQ29tcGFueU5hbWUnICAgID0+ICdDdXN0b21lciBJbmMuJywKICAgICAgICAnQ3VzdG9tZXJJRCcgICAgICAgICAgICAgPT4gJ2V4YW1wbGUuY29tJywKICAgICAgICAnQ3VzdG9tZXJDb21wYW55U3RyZWV0JyAgPT4gJzUyMDEgQmx1ZSBMYWdvb24gRHJpdmUnLAogICAgICAgICdDdXN0b21lckNvbXBhbnlaSVAnICAgICA9PiAnMzMxMjYnLAogICAgICAgICdDdXN0b21lckNvbXBhbnlDaXR5JyAgICA9PiAnTWlhbWknLAogICAgICAgICdDdXN0b21lckNvbXBhbnlDb3VudHJ5JyA9PiAnVW5pdGVkIFN0YXRlcycsCiAgICAgICAgJ0N1c3RvbWVyQ29tcGFueVVSTCcgICAgID0+ICdodHRwOi8vZXhhbXBsZS5jb20nLAogICAgICAgICdDdXN0b21lckNvbXBhbnlDb21tZW50JyA9PiAnU29tZSBDb21tZW50cycsCiAgICAgICAgJ1ZhbGlkSUQnICAgICAgICAgICAgICAgID0+ICcxJywKICAgICAgICAnQ3JlYXRlVGltZScgICAgICAgICAgICAgPT4gJzIwMTAtMTAtMDQgMTY6MzU6NDknLAogICAgICAgICdDaGFuZ2VUaW1lJyAgICAgICAgICAgICA9PiAnMjAxMC0xMC0wNCAxNjozNjoxMicsCiAgICApOwoKTk9URTogQWN0dWFsIGZpZWxkcyByZXR1cm5lZCBieSB0aGlzIEFQSSBjYWxsIG1heSBkaWZmZXIgYmFzZWQgb24KQ3VzdG9tZXJDb21wYW55IG1hcHBpbmcgaW4geW91ciBzeXN0ZW0gY29uZmlndXJhdGlvbi4KCj1jdXQKCnN1YiBDdXN0b21lckNvbXBhbnlHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0N1c3RvbWVySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBDdXN0b21lcklEISIKICAgICAgICApOwoKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBGZXRjaCBkeW5hbWljIGZpZWxkIGNvbmZpZ3VyYXRpb25zIGZvciBDdXN0b21lckNvbXBhbnkuCiAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlncyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKS0+RHluYW1pY0ZpZWxkTGlzdEdldCgKICAgICAgICBPYmplY3RUeXBlID0+ICdDdXN0b21lckNvbXBhbnknLAogICAgICAgIFZhbGlkICAgICAgPT4gMSwKICAgICk7CgogICAgbXkgJUR5bmFtaWNGaWVsZExvb2t1cCA9IG1hcCB7ICRfLT57TmFtZX0gPT4gJF8gfSAkRHluYW1pY0ZpZWxkQ29uZmlncy0+QCo7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICRDb25maWdPYmplY3QgICAgICAgICAgICAgID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgICMgc2VhcmNoIGZvciB0aGUgY29tcGFueSBpbiB0aGUgY29uZmlndXJlZCBzb3VyY2VzCiAgICBTT1VSQ0U6CiAgICBmb3IgbXkgJENvdW50ICggJycsIDEgLi4gMTAgKSB7CgogICAgICAgIG5leHQgU09VUkNFIHVubGVzcyAkU2VsZi0+eyJDdXN0b21lckNvbXBhbnkkQ291bnQifTsKCiAgICAgICAgbXkgJUNvbXBhbnkgPSAkU2VsZi0+eyJDdXN0b21lckNvbXBhbnkkQ291bnQifS0+Q3VzdG9tZXJDb21wYW55R2V0KCAlUGFyYW0sICk7CgogICAgICAgIG5leHQgU09VUkNFIHVubGVzcyAlQ29tcGFueTsKCiAgICAgICAgIyBmZXRjaCBkeW5hbWljIGZpZWxkIHZhbHVlcwogICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCAkU2VsZi0+eyJDdXN0b21lckNvbXBhbnkkQ291bnQifS0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntNYXB9ICkgKSB7CiAgICAgICAgICAgIENVU1RPTUVSQ09NUEFOWUZJRUxEOgogICAgICAgICAgICBmb3IgbXkgJEN1c3RvbWVyQ29tcGFueUZpZWxkICggQHsgJFNlbGYtPnsiQ3VzdG9tZXJDb21wYW55JENvdW50In0tPntDdXN0b21lckNvbXBhbnlNYXB9LT57TWFwfSB9ICkgewogICAgICAgICAgICAgICAgbmV4dCBDVVNUT01FUkNPTVBBTllGSUVMRCB1bmxlc3MgJEN1c3RvbWVyQ29tcGFueUZpZWxkLT5bNV0gZXEgJ2R5bmFtaWNfZmllbGQnOwogICAgICAgICAgICAgICAgbmV4dCBDVVNUT01FUkNPTVBBTllGSUVMRCB1bmxlc3MgJER5bmFtaWNGaWVsZExvb2t1cHsgJEN1c3RvbWVyQ29tcGFueUZpZWxkLT5bMl0gfTsKCiAgICAgICAgICAgICAgICBteSAkVmFsdWUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVHZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRMb29rdXB7ICRDdXN0b21lckNvbXBhbnlGaWVsZC0+WzJdIH0sCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSAgICAgICAgID0+ICRDb21wYW55e0N1c3RvbWVySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkQ29tcGFueXsgJEN1c3RvbWVyQ29tcGFueUZpZWxkLT5bMF0gfSA9ICRWYWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAgICAgIyBDaGVjayBwZXJtaXNzaW9uLgogICAgICAgIG15ICRVc2VyR3JvdXBJRFN5bmMgPSAkU2VsZi0+eyJDdXN0b21lckNvbXBhbnkkQ291bnQifS0+e0N1c3RvbWVyQ29tcGFueU1hcH0tPntVc2VyR3JvdXBJRFN5bmN9OwoKICAgICAgICBpZiAoICRDb21wYW55e1VzZXJHcm91cElEfSAmJiAkVXNlckdyb3VwSURTeW5jLT57UmVtb3RlR3JvdXBUb0xvY2FsR3JvdXB9ICkgewogICAgICAgICAgICAjIFJlcGxhY2UgdGhlIHJlbW90ZSBncm91cCB3aXRoIHRoZSBhc3NvY2lhdGVkIGxvY2FsIGdyb3VwLgogICAgICAgICAgICBmb3IgbXkgJFJlbW90ZUdyb3VwICgga2V5cyAleyAkVXNlckdyb3VwSURTeW5jLT57UmVtb3RlR3JvdXBUb0xvY2FsR3JvdXB9IH0gKSB7CiAgICAgICAgICAgICAgICBpZiAoICRDb21wYW55e1VzZXJHcm91cElEfSBlcSAkUmVtb3RlR3JvdXAgKSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJExvY2FsR3JvdXAgPSAkVXNlckdyb3VwSURTeW5jLT57UmVtb3RlR3JvdXBUb0xvY2FsR3JvdXB9eyRSZW1vdGVHcm91cH07CiAgICAgICAgICAgICAgICAgICAgJENvbXBhbnl7VXNlckdyb3VwSUR9ID0gJExvY2FsR3JvdXA7CgogICAgICAgICAgICAgICAgICAgICMgQ2hlY2sgaWYgZ3JvdXAgSUQgb3IgZ3JvdXAgbmFtZXMgc2hvdWxkIGJlIHVzZWQuCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkVXNlckdyb3VwSURTeW5jLT57VXNlR3JvdXBOYW1lc30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG15ICRHcm91cElEID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwTG9va3VwKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXAgPT4gJExvY2FsR3JvdXAsCiAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICAkQ29tcGFueXtVc2VyR3JvdXBJRH0gPSAkR3JvdXBJRDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICggJFNlbGYtPntNdWx0aXRlbmFuY3l9ICYmICRDb21wYW55e1VzZXJHcm91cElEfSApIHsKICAgICAgICAgICAgIyBDaGVjayBpZiB0aGUgdXNlciBoYXMgcGVybWlzc2lvbiB0byBhY2Nlc3MgdGhlIGluZm9ybWF0aW9uLgogICAgICAgICAgICBpZiAoICFncmVwIHsgJF8gPX4gL14kQ29tcGFueXtVc2VyR3JvdXBJRH0kLyB9IEB7ICRTZWxmLT57VXNlckdyb3VwSURzfSB9ICkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CgogICAgICAgICMgcmV0dXJuIGRhdGEgZm9yIHRoZSBmaXJzdCBmb3VuZCBjb21wYW55CiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgJUNvbXBhbnksCiAgICAgICAgICAgIFNvdXJjZSA9PiAiQ3VzdG9tZXJDb21wYW55JENvdW50IiwKICAgICAgICAgICAgQ29uZmlnID0+ICRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJDb21wYW55JENvdW50IiksCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGNvbXBhbnkgd2FzIG5vdCBmb3VuZAogICAgcmV0dXJuOwp9Cgo9aGVhZDIgQ3VzdG9tZXJDb21wYW55VXBkYXRlKCkKCnVwZGF0ZSBjdXN0b21lciBjb21wYW55IGF0dHJpYnV0ZXMKCiAgICAkQ3VzdG9tZXJDb21wYW55T2JqZWN0LT5DdXN0b21lckNvbXBhbnlVcGRhdGUoCiAgICAgICAgQ3VzdG9tZXJDb21wYW55SUQgICAgICAgPT4gJ29sZGV4YW1wbGUuY29tJywgIyByZXF1aXJlZCBmb3IgQ3VzdG9tZXJDb21wYW55SUQtdXBkYXRlCiAgICAgICAgQ3VzdG9tZXJJRCAgICAgICAgICAgICAgPT4gJ2V4YW1wbGUuY29tJywKICAgICAgICBDdXN0b21lckNvbXBhbnlOYW1lICAgICA9PiAnTmV3IEN1c3RvbWVyIEluYy4nLAogICAgICAgIEN1c3RvbWVyQ29tcGFueVN0cmVldCAgID0+ICc1MjAxIEJsdWUgTGFnb29uIERyaXZlJywKICAgICAgICBDdXN0b21lckNvbXBhbnlaSVAgICAgICA9PiAnMzMxMjYnLAogICAgICAgIEN1c3RvbWVyQ29tcGFueUxvY2F0aW9uID0+ICdNaWFtaScsCiAgICAgICAgQ3VzdG9tZXJDb21wYW55Q291bnRyeSAgPT4gJ1VTQScsCiAgICAgICAgQ3VzdG9tZXJDb21wYW55VVJMICAgICAgPT4gJ2h0dHA6Ly9leGFtcGxlLmNvbScsCiAgICAgICAgQ3VzdG9tZXJDb21wYW55Q29tbWVudCAgPT4gJ3NvbWUgY29tbWVudCcsCiAgICAgICAgVmFsaWRJRCAgICAgICAgICAgICAgICAgPT4gMSwKICAgICAgICBVc2VySUQgICAgICAgICAgICAgICAgICA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIEN1c3RvbWVyQ29tcGFueVVwZGF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICRQYXJhbXtDdXN0b21lckNvbXBhbnlJRH0gfHw9ICRQYXJhbXtDdXN0b21lcklEfTsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0N1c3RvbWVyQ29tcGFueUlEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgQ3VzdG9tZXJDb21wYW55SUQgb3IgQ3VzdG9tZXJJRCEiCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBpZiBjb21wYW55IGV4aXN0cwogICAgbXkgJUNvbXBhbnkgPSAkU2VsZi0+Q3VzdG9tZXJDb21wYW55R2V0KCBDdXN0b21lcklEID0+ICRQYXJhbXtDdXN0b21lckNvbXBhbnlJRH0gKTsKICAgIGlmICggISVDb21wYW55ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gc3VjaCBjb21wYW55ICckUGFyYW17Q3VzdG9tZXJDb21wYW55SUR9JyEiLAogICAgICAgICk7CgogICAgICAgIHJldHVybjsKICAgIH0KCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAjIENoZWNrIGlmIHRoZSB1c2VyIGhhcyBwZXJtaXNzaW9uIHRvIGNoYW5nZSB0aGUgVXNlckdyb3VwSUQuCiAgICBpZiAoICRTZWxmLT57TXVsdGl0ZW5hbmN5fSApIHsKICAgICAgICAjIFNldCB0aGUgVXNlckdyb3VwSUQgdG8gdGhlIGN1cnJlbnQgVXNlckdyb3VwSUQuCiAgICAgICAgaWYgKCAkQ29tcGFueXtVc2VyR3JvdXBJRH0gKSB7CiAgICAgICAgICAgICRQYXJhbXtVc2VyR3JvdXBJRH0gPSAkQ29tcGFueXtVc2VyR3JvdXBJRH07CiAgICAgICAgfQogICAgfQoKICAgIG15ICRVc2VyR3JvdXBJRFN5bmMgPSAkU2VsZi0+eyRDb21wYW55e1NvdXJjZX19LT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e1VzZXJHcm91cElEU3luY307CiAgICBpZiAoICRQYXJhbXtVc2VyR3JvdXBJRH0gKSB7CiAgICAgICAgIyBDaGVjayBpZiBncm91cCBJRCBvciBncm91cCBuYW1lcyBzaG91bGQgYmUgdXNlZC4KICAgICAgICBpZiAoICRVc2VyR3JvdXBJRFN5bmMtPntVc2VHcm91cE5hbWVzfSApIHsKICAgICAgICAgICAgJFBhcmFte1VzZXJHcm91cElEfSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5Hcm91cExvb2t1cCgKICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gJFBhcmFte1VzZXJHcm91cElEfSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgUmVwbGFjZSB0aGUgbG9jYWwgZ3JvdXAgd2l0aCB0aGUgYXNzb2NpYXRlZCByZW1vdGUgZ3JvdXAuCiAgICAgICAgZm9yIG15ICRSZW1vdGVHcm91cCAoIGtleXMgJXsgJFVzZXJHcm91cElEU3luYy0+e1JlbW90ZUdyb3VwVG9Mb2NhbEdyb3VwfSB9ICkgewogICAgICAgICAgICBpZiAoICRQYXJhbXtVc2VyR3JvdXBJRH0gZXEgJFVzZXJHcm91cElEU3luYy0+e1JlbW90ZUdyb3VwVG9Mb2NhbEdyb3VwfXskUmVtb3RlR3JvdXB9ICkgewogICAgICAgICAgICAgICAgJFBhcmFte1VzZXJHcm91cElEfSA9ICRSZW1vdGVHcm91cDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KIyBFTyBDdXN0b21lck11bHRpdGVuYW5jeQoKICAgIG15ICRSZXN1bHQgPSAkU2VsZi0+eyAkQ29tcGFueXtTb3VyY2V9IH0tPkN1c3RvbWVyQ29tcGFueVVwZGF0ZSglUGFyYW0pOwoKICAgIHJldHVybiB1bmxlc3MgJFJlc3VsdDsKCiAgICAjIHRyaWdnZXIgZXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0N1c3RvbWVyQ29tcGFueVVwZGF0ZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICBDdXN0b21lcklEICAgID0+ICRQYXJhbXtDdXN0b21lcklEfSwKICAgICAgICAgICAgT2xkQ3VzdG9tZXJJRCA9PiAkUGFyYW17Q3VzdG9tZXJDb21wYW55SUR9LAogICAgICAgICAgICBOZXdEYXRhICAgICAgID0+IFwlUGFyYW0sCiAgICAgICAgICAgIE9sZERhdGEgICAgICAgPT4gXCVDb21wYW55LAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJFJlc3VsdDsKfQoKPWhlYWQyIEN1c3RvbWVyQ29tcGFueVNvdXJjZUxpc3QoKQoKcmV0dXJuIGN1c3RvbWVyIGNvbXBhbnkgc291cmNlIGxpc3QKCiAgICBteSAlTGlzdCA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueVNvdXJjZUxpc3QoCiAgICAgICAgUmVhZE9ubHkgPT4gMCAjIG9wdGlvbmFsLCAxIHJldHVybnMgb25seSBSTyBiYWNrZW5kcywgMCByZXR1cm5zIHdyaXRhYmxlLCBpZiBub3QgcGFzc2VkIHJldHVybnMgYWxsIGJhY2tlbmRzCiAgICApOwoKPWN1dAoKc3ViIEN1c3RvbWVyQ29tcGFueVNvdXJjZUxpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGdldCBjb25maWcgb2JqZWN0CiAgICBteSAkQ29uZmlnT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpDb25maWcnKTsKCiAgICBteSAlRGF0YTsKICAgIFNPVVJDRToKICAgIGZvciBteSAkQ291bnQgKCAnJywgMSAuLiAxMCApIHsKCiAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJDb21wYW55JENvdW50Iik7CgogICAgICAgIGlmICggZGVmaW5lZCAkUGFyYW17UmVhZE9ubHl9ICkgewogICAgICAgICAgICBteSAkQmFja2VuZENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJDb21wYW55JENvdW50Iik7CiAgICAgICAgICAgIGlmICggJFBhcmFte1JlYWRPbmx5fSApIHsKICAgICAgICAgICAgICAgIG5leHQgU09VUkNFIGlmICEkQmFja2VuZENvbmZpZy0+e1JlYWRPbmx5fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG5leHQgU09VUkNFIGlmICRCYWNrZW5kQ29uZmlnLT57UmVhZE9ubHl9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAkRGF0YXsiQ3VzdG9tZXJDb21wYW55JENvdW50In0gPSAkQ29uZmlnT2JqZWN0LT5HZXQoIkN1c3RvbWVyQ29tcGFueSRDb3VudCIpLT57TmFtZX0KICAgICAgICAgICAgfHwgIk5vIE5hbWUgJENvdW50IjsKICAgIH0KCiAgICByZXR1cm4gJURhdGE7Cn0KCj1oZWFkMiBDdXN0b21lckNvbXBhbnlMaXN0KCkKCmdldCBsaXN0IG9mIGN1c3RvbWVyIGNvbXBhbmllcy4KCiAgICBteSAlTGlzdCA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueUxpc3QoKTsKCiAgICBteSAlTGlzdCA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkN1c3RvbWVyQ29tcGFueUxpc3QoCiAgICAgICAgVmFsaWQgPT4gMCwKICAgICAgICBMaW1pdCA9PiAwLCAgICAgIyBvcHRpb25hbCwgb3ZlcnJpZGUgY29uZmlndXJlZCBzZWFyY2ggcmVzdWx0IGxpbWl0ICgwIG1lYW5zIHVubGltaXRlZCkKICAgICk7CgogICAgbXkgJUxpc3QgPSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0LT5DdXN0b21lckNvbXBhbnlMaXN0KAogICAgICAgIFNlYXJjaCA9PiAnc29tZWNvbXBhbnknLAogICAgKTsKClJldHVybnM6CgogICAgJUxpc3QgPSB7CiAgICAgICAgJ2V4YW1wbGUuY29tJyA9PiAnZXhhbXBsZS5jb20gQ3VzdG9tZXIgSW5jLicsCiAgICAgICAgJ2FjbWUuY29tJyAgICA9PiAnYWNtZS5jb20gQWNtZSwgSW5jLicKICAgIH07Cgo9Y3V0CgpzdWIgQ3VzdG9tZXJDb21wYW55TGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgR2V0IGR5bmFtaWMgZmllbGQgb2JqZWN0LgogICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKCiAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlncyA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgT2JqZWN0VHlwZSA9PiAnQ3VzdG9tZXJDb21wYW55JywKICAgICAgICBWYWxpZCAgICAgID0+IDEsCiAgICApOwoKICAgIG15ICVEeW5hbWljRmllbGRMb29rdXAgPSBtYXAgeyAkXy0+e05hbWV9ID0+ICRfIH0gQHskRHluYW1pY0ZpZWxkQ29uZmlnc307CgogICAgIyBHZXQgZHluYW1pYyBmaWVsZCBiYWNrZW5kIG9iamVjdC4KICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgIG15ICVEYXRhOwogICAgU09VUkNFOgogICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewoKICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJFNlbGYtPnsiQ3VzdG9tZXJDb21wYW55JENvdW50In07CgogICAgICAgICMgc2VhcmNoIGR5bmFtaWMgZmllbGQgdmFsdWVzLCBpZiBjb25maWd1cmVkCiAgICAgICAgbXkgJE1hcCA9ICRTZWxmLT57IkN1c3RvbWVyQ29tcGFueSRDb3VudCJ9LT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e01hcH07CiAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoJE1hcCkgKSB7CgogICAgICAgICAgICAjIGZldGNoIGR5bmFtaWMgZmllbGQgbmFtZXMgdGhhdCBhcmUgY29uZmlndXJlZCBpbiBNYXAKICAgICAgICAgICAgIyBvbmx5IHRoZXNlIHdpbGwgYmUgY29uc2lkZXJlZCBmb3IgYW55IG90aGVyIHNlYXJjaCBjb25maWcKICAgICAgICAgICAgIyBbICdEeW5hbWljRmllbGRfTmFtZV9ZJywgdW5kZWYsICdOYW1lX1knLCAwLCAwLCAnZHluYW1pY19maWVsZCcsIHVuZGVmLCAwLF0sCiAgICAgICAgICAgIG15ICVEeW5hbWljRmllbGROYW1lcyA9IG1hcCB7ICRfLT5bMl0gPT4gMSB9IGdyZXAgeyAkXy0+WzVdIGVxICdkeW5hbWljX2ZpZWxkJyB9IEB7JE1hcH07CgogICAgICAgICAgICBpZiAoJUR5bmFtaWNGaWVsZE5hbWVzKSB7CiAgICAgICAgICAgICAgICBteSAkRm91bmREeW5hbWljRmllbGRPYmplY3RJRHM7CiAgICAgICAgICAgICAgICBteSAkU2VhcmNoRmllbGRzOwogICAgICAgICAgICAgICAgbXkgJFNlYXJjaFBhcmFtOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgd2hpY2ggb2YgdGhlIGR5bmFtaWMgZmllbGRzIGNvbmZpZ3VyZWQgaW4gTWFwIGFyZSBhbHNvCiAgICAgICAgICAgICAgICAjIGNvbmZpZ3VyZWQgaW4gU2VhcmNoRmllbGRzCgogICAgICAgICAgICAgICAgIyBwYXJhbSBTZWFyY2gKICAgICAgICAgICAgICAgIGlmICggZGVmaW5lZCAkUGFyYW17U2VhcmNofSAmJiBsZW5ndGggJFBhcmFte1NlYXJjaH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlYXJjaEZpZWxkcyA9ICRTZWxmLT57IkN1c3RvbWVyQ29tcGFueSRDb3VudCJ9LT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e0N1c3RvbWVyQ29tcGFueVNlYXJjaEZpZWxkc307CiAgICAgICAgICAgICAgICAgICAgJFNlYXJjaFBhcmFtICA9ICRQYXJhbXtTZWFyY2h9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgc2VhcmNoIGR5bmFtaWMgZmllbGQgdmFsdWVzCiAgICAgICAgICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSgkU2VhcmNoRmllbGRzKSApIHsKICAgICAgICAgICAgICAgICAgICBteSBAU2VhcmNoRHluYW1pY0ZpZWxkTmFtZXMgPSBncmVwIHsgZXhpc3RzICREeW5hbWljRmllbGROYW1lc3skX30gfSBAeyRTZWFyY2hGaWVsZHN9OwoKICAgICAgICAgICAgICAgICAgICBteSAlRm91bmREeW5hbWljRmllbGRPYmplY3RJRHM7CiAgICAgICAgICAgICAgICAgICAgRklFTEROQU1FOgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkRmllbGROYW1lIChAU2VhcmNoRHluYW1pY0ZpZWxkTmFtZXMpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRDb25maWcgPSAkRHluYW1pY0ZpZWxkTG9va3VweyRGaWVsZE5hbWV9OwoKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBGSUVMRE5BTUUgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZFZhbHVlcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNlYXJjaCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoICAgICAgICAgICAgID0+ICRTZWFyY2hQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCREeW5hbWljRmllbGRWYWx1ZXMpICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRWYWx1ZSAoIEB7JER5bmFtaWNGaWVsZFZhbHVlc30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEZvdW5kRHluYW1pY0ZpZWxkT2JqZWN0SURzeyAkRHluYW1pY0ZpZWxkVmFsdWUtPntPYmplY3RJRH0gfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRGb3VuZER5bmFtaWNGaWVsZE9iamVjdElEcyA9IFsga2V5cyAlRm91bmREeW5hbWljRmllbGRPYmplY3RJRHMgXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGV4ZWN1dGUgYmFja2VuZCBzZWFyY2ggZm9yIGZvdW5kIG9iamVjdCBJRHMKICAgICAgICAgICAgICAgICMgdGhpcyBkYXRhIGlzIGJlaW5nIG1lcmdlZCB3aXRoIHRoZSBmb2xsb3dpbmcgQ3VzdG9tZXJDb21wYW55TGlzdCBjYWxsCiAgICAgICAgICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSgkRm91bmREeW5hbWljRmllbGRPYmplY3RJRHMpICkgewoKICAgICAgICAgICAgICAgICAgICBteSAkT2JqZWN0TmFtZXMgPSAkRHluYW1pY0ZpZWxkT2JqZWN0LT5PYmplY3RNYXBwaW5nR2V0KAogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3RJRCAgID0+ICRGb3VuZER5bmFtaWNGaWVsZE9iamVjdElEcywKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0VHlwZSA9PiAnQ3VzdG9tZXJDb21wYW55JywKICAgICAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICAgICBteSAlU2VhcmNoUGFyYW0gPSAlUGFyYW07CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRTZWFyY2hQYXJhbXtTZWFyY2h9OwogICAgICAgICAgICAgICAgICAgIG15ICVDb21wYW55TGlzdCA9ICRTZWxmLT57IkN1c3RvbWVyQ29tcGFueSRDb3VudCJ9LT5DdXN0b21lckNvbXBhbnlMaXN0KCVTZWFyY2hQYXJhbSk7CgogICAgICAgICAgICAgICAgICAgIE9CSkVDVE5BTUU6CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRPYmplY3ROYW1lICggdmFsdWVzICV7JE9iamVjdE5hbWVzfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBPQkpFQ1ROQU1FIGlmIGV4aXN0cyAkRGF0YXskT2JqZWN0TmFtZX07CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCBcJUNvbXBhbnlMaXN0ICkgJiYgZXhpc3RzICRDb21wYW55TGlzdHskT2JqZWN0TmFtZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlRGF0YSA9ICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkT2JqZWN0TmFtZSA9PiAkQ29tcGFueUxpc3R7JE9iamVjdE5hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICVEYXRhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAjIGdldCBjb21wYW55IGxpc3QgcmVzdWx0IG9mIGJhY2tlbmQgYW5kIG1lcmdlIGl0CiAgICAgICAgbXkgJVN1YkRhdGEgPSAkU2VsZi0+eyJDdXN0b21lckNvbXBhbnkkQ291bnQifS0+Q3VzdG9tZXJDb21wYW55TGlzdCglUGFyYW0pOwogICAgICAgICVEYXRhID0gKCAlRGF0YSwgJVN1YkRhdGEgKTsKICAgIH0KCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAjIENoZWNrIGlmIHRoZSB1c2VyIGhhcyBwZXJtaXNzaW9uIHRvIHNlZSB0aGUgY3VzdG9tZXIgdXNlciBkYXRhLgogICAgIyBJbXByb3ZlOiBDaGVjayBldmVyeSBjb21wYW55IG9uZSBieSBvbmUgYXMgQ3VzdG9tZXJDb21wYW55TGlzdCBkb2VzIHNvbWV0aW1lcyByZXR1cm4gYSBub24gZmlsdGVyZWQgbGlzdCAoQ3VzdG9tZXJDb21wYW55IGFkZCkKICAgIGlmICggJFNlbGYtPntNdWx0aXRlbmFuY3l9ICkgewogICAgICAgIGZvciBteSAkQ3VzdG9tZXJJRCAoIGtleXMgJURhdGEgKSB7CiAgICAgICAgICAgIG15ICVDb21wYW55ID0gJFNlbGYtPkN1c3RvbWVyQ29tcGFueUdldCgKICAgICAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJEN1c3RvbWVySUQsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICElQ29tcGFueSB8fCAhJENvbXBhbnl7Q3VzdG9tZXJJRH0gKSB7CiAgICAgICAgICAgICAgICBkZWxldGUgJERhdGF7JEN1c3RvbWVySUR9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CgogICAgcmV0dXJuICVEYXRhOwp9Cgo9aGVhZDIgQ3VzdG9tZXJDb21wYW55U2VhcmNoRGV0YWlsKCkKClRvIGZpbmQgY3VzdG9tZXIgY29tcGFuaWVzIGluIHRoZSBzeXN0ZW0uCgpUaGUgc2VhcmNoIGNyaXRlcmlhIGFyZSBsb2dpY2FsbHkgQU5EIGNvbm5lY3RlZC4KV2hlbiBhIGxpc3QgaXMgcGFzc2VkIGFzIGNyaXRlcmlhLCB0aGUgaW5kaXZpZHVhbCBtZW1iZXJzIGFyZSBPUiBjb25uZWN0ZWQuCldoZW4gYW4gdW5kZWYgb3IgYSByZWZlcmVuY2UgdG8gYW4gZW1wdHkgYXJyYXkgaXMgcGFzc2VkLCB0aGVuIHRoZSBzZWFyY2ggY3JpdGVyaWEKaXMgaWdub3JlZC4KClJldHVybnMgZWl0aGVyIGEgbGlzdCwgYXMgYW4gYXJyYXlyZWYsIG9yIGEgY291bnQgb2YgZm91bmQgY3VzdG9tZXIgY29tcGFueSBpZHMuClRoZSBjb3VudCBvZiByZXN1bHRzIGlzIHJldHVybmVkIHdoZW4gdGhlIHBhcmFtZXRlciBDPFJlc3VsdCA9ICdDT1VOVCc+IGlzIHBhc3NlZC4KCiAgICBteSAkQ3VzdG9tZXJDb21wYW55SURzUmVmID0gJEN1c3RvbWVyQ29tcGFueU9iamVjdC0+Q3VzdG9tZXJDb21wYW55U2VhcmNoRGV0YWlsKAoKICAgICAgICAjIGFsbCBmaWVsZHMgaW4gYSBDdXN0b21lckNvbXBhbnlNYXAgYXJlIHNlYXJjaGFibGUKICAgICAgICBDdXN0b21lcklEICAgICAgICAgID0+ICdleGFtcGxlKicsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIEN1c3RvbWVyQ29tcGFueU5hbWUgPT4gJ05hbWUqJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCgogICAgICAgICMgYXJyYXkgcGFyYW1ldGVycyBhcmUgdXNlZCB3aXRoIGxvZ2ljYWwgT1Igb3BlcmF0b3IgKGFsbCB2YWx1ZXMgYXJlIHBvc3NpYmxlIHdoaWNoCiAgICAgICAgYXJlIGRlZmluZWQgaW4gdGhlIGNvbmZpZyBzZWxlY3Rpb24gaGFzaCBmb3IgdGhlIGZpZWxkKQogICAgICAgIEN1c3RvbWVyQ29tcGFueUNvdW50cnkgPT4gWyAnQXVzdHJpYScsICdHZXJtYW55JywgXSwgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCgogICAgICAgICMgRHluYW1pY0ZpZWxkcwogICAgICAgICMgICBBdCBsZWFzdCBvbmUgb3BlcmF0b3IgbXVzdCBiZSBzcGVjaWZpZWQuIE9wZXJhdG9ycyB3aWxsIGJlIGNvbm5lY3RlZCB3aXRoIEFORCwKICAgICAgICAjICAgICAgIHZhbHVlcyBpbiBhbiBvcGVyYXRvciB3aXRoIE9SLgogICAgICAgICMgICBZb3UgY2FuIGFsc28gcGFzcyBtb3JlIHRoYW4gb25lIGFyZ3VtZW50IHRvIGFuIG9wZXJhdG9yOiBbJ3ZhbHVlMScsICd2YWx1ZTInXQogICAgICAgIER5bmFtaWNGaWVsZF9GaWVsZE5hbWVYID0+IHsKICAgICAgICAgICAgRXF1YWxzICAgICAgICAgICAgPT4gMTIzLAogICAgICAgICAgICBMaWtlICAgICAgICAgICAgICA9PiAndmFsdWUqJywgICAgICAgICAgICAgICAgIyAiZXF1YWxzIiBvcGVyYXRvciB3aXRoIHdpbGRjYXJkIHN1cHBvcnQKICAgICAgICAgICAgR3JlYXRlclRoYW4gICAgICAgPT4gJzIwMDEtMDEtMDEgMDE6MDE6MDEnLAogICAgICAgICAgICBHcmVhdGVyVGhhbkVxdWFscyA9PiAnMjAwMS0wMS0wMSAwMTowMTowMScsCiAgICAgICAgICAgIFNtYWxsZXJUaGFuICAgICAgID0+ICcyMDAyLTAyLTAyIDAyOjAyOjAyJywKICAgICAgICAgICAgU21hbGxlclRoYW5FcXVhbHMgPT4gJzIwMDItMDItMDIgMDI6MDI6MDInLAogICAgICAgIH0KCiAgICAgICAgT3JkZXJCeSA9PiBbICdDdXN0b21lcklEJywgJ0N1c3RvbWVyQ29tcGFueUNvdW50cnknIF0sICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICAjIGlnbm9yZWQgaWYgdGhlIHJlc3VsdCB0eXBlIGlzICdDT1VOVCcKICAgICAgICAjIGRlZmF1bHQ6IFsgJ0N1c3RvbWVySUQnIF0KICAgICAgICAjIChhbGwgZmllbGRzIHdoaWNoIGFyZSBpbiBhIEN1c3RvbWVyQ29tcGFueU1hcCBjYW4gYmUgdXNlZCBmb3Igb3JkZXJpbmcpCgogICAgICAgICMgQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgT3JkZXJCeToKICAgICAgICAjIFRoZSBPcmRlckJ5RGlyZWN0aW9uIGNhbiBiZSBzcGVjaWZpZWQgZm9yIGVhY2ggT3JkZXJCeSBhdHRyaWJ1dGUuCiAgICAgICAgIyBUaGUgcGFpcmluZyBpcyBtYWRlIGJ5IHRoZSBhcnJheSBpbmRpY2VzLgoKICAgICAgICBPcmRlckJ5RGlyZWN0aW9uID0+IFsgJ0Rvd24nLCAnVXAnIF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgICMgaWdub3JlZCBpZiB0aGUgcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJwogICAgICAgICMgKERvd24gfCBVcCkgRGVmYXVsdDogWyAnRG93bicgXQoKICAgICAgICBSZXN1bHQgPT4gJ0FSUkFZJyB8fCAnQ09VTlQnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgICMgZGVmYXVsdDogQVJSQVksIHJldHVybnMgYW4gYXJyYXkgb2YgY2hhbmdlIGlkcwogICAgICAgICMgQ09VTlQgcmV0dXJucyBhIHNjYWxhciB3aXRoIHRoZSBudW1iZXIgb2YgZm91bmQgY2hhbmdlcwoKICAgICAgICBMaW1pdCA9PiAxMDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgICMgaWdub3JlZCBpZiB0aGUgcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJwogICAgKTsKClJldHVybnM6CgpSZXN1bHQ6ICdBUlJBWScKCiAgICBAQ3VzdG9tZXJJRHMgPSAoIDEsIDIsIDMgKTsKClJlc3VsdDogJ0NPVU5UJwoKICAgICRDdXN0b21lcklEcyA9IDEwOwoKPWN1dAoKc3ViIEN1c3RvbWVyQ29tcGFueVNlYXJjaERldGFpbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgR2V0IGFsbCBnZW5lcmFsIHNlYXJjaCBmaWVsZHMgKHdpdGhvdXQgYSByZXN0cmljdGlvbiB0byBhIHNvdXJjZSkuCiAgICBteSBAQWxsU2VhcmNoRmllbGRzID0gJFNlbGYtPkN1c3RvbWVyQ29tcGFueVNlYXJjaEZpZWxkcygpOwoKICAgICMgR2VuZXJhdGUgYSBoYXNoIHdpdGggdGhlIGN1c3RvbWVyIGNvbXBhbnkgc291cmNlcyB3aGljaCBtdXN0IGJlIHNlYXJjaGVkLgogICAgbXkgJVNlYXJjaEN1c3RvbWVyQ29tcGFueVNvdXJjZXM7CgogICAgU09VUkNFOgogICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewogICAgICAgIG5leHQgU09VUkNFIGlmICEkU2VsZi0+eyJDdXN0b21lckNvbXBhbnkkQ291bnQifTsKCiAgICAgICAgIyBHZXQgdGhlIHNlYXJjaCBmaWVsZHMgZm9yIHRoZSBjdXJyZW50IHNvdXJjZS4KICAgICAgICBteSBAU291cmNlU2VhcmNoRmllbGRzID0gJFNlbGYtPkN1c3RvbWVyQ29tcGFueVNlYXJjaEZpZWxkcygKICAgICAgICAgICAgU291cmNlID0+ICJDdXN0b21lckNvbXBhbnkkQ291bnQiLAogICAgICAgICk7CiAgICAgICAgbXkgJUxvb2t1cFNvdXJjZVNlYXJjaEZpZWxkcyA9IG1hcCB7ICRfLT57TmFtZX0gPT4gMSB9IEBTb3VyY2VTZWFyY2hGaWVsZHM7CgogICAgICAgICMgQ2hlY2sgaWYgYWxsIHNlYXJjaCBwYXJhbSBleGlzdHMgaW4gdGhlIHNlYXJjaCBmaWVsZHMgZnJvbSB0aGUgY3VycmVudCBzb3VyY2UuCiAgICAgICAgU0VBUkNIRklFTEQ6CiAgICAgICAgZm9yIG15ICRTZWFyY2hGaWVsZCAoQEFsbFNlYXJjaEZpZWxkcykgewoKICAgICAgICAgICAgbmV4dCBTRUFSQ0hGSUVMRCBpZiAhJFBhcmFteyAkU2VhcmNoRmllbGQtPntOYW1lfSB9OwoKICAgICAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRMb29rdXBTb3VyY2VTZWFyY2hGaWVsZHN7ICRTZWFyY2hGaWVsZC0+e05hbWV9IH07CiAgICAgICAgfQogICAgICAgICRTZWFyY2hDdXN0b21lckNvbXBhbnlTb3VyY2VzeyJDdXN0b21lckNvbXBhbnkkQ291bnQifSA9IFxAU291cmNlU2VhcmNoRmllbGRzOwogICAgfQoKICAgICMgU2V0IHRoZSBkZWZhdWx0IGJlaGF2aW91ciBmb3IgdGhlIHJldHVybiB0eXBlLgogICAgJFBhcmFte1Jlc3VsdH0gfHw9ICdBUlJBWSc7CgogICAgaWYgKCAkUGFyYW17UmVzdWx0fSBlcSAnQ09VTlQnICkgewoKICAgICAgICBteSAkSURzQ291bnQgPSAwOwoKICAgICAgICBTT1VSQ0U6CiAgICAgICAgZm9yIG15ICRTb3VyY2UgKCBzb3J0IGtleXMgJVNlYXJjaEN1c3RvbWVyQ29tcGFueVNvdXJjZXMgKSB7CiAgICAgICAgICAgIG5leHQgU09VUkNFIGlmICEkU2VsZi0+eyRTb3VyY2V9OwoKICAgICAgICAgICAgbXkgJFN1YklEc0NvdW50ID0gJFNlbGYtPnskU291cmNlfS0+Q3VzdG9tZXJDb21wYW55U2VhcmNoRGV0YWlsKAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgU2VhcmNoRmllbGRzID0+ICRTZWFyY2hDdXN0b21lckNvbXBhbnlTb3VyY2VzeyRTb3VyY2V9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuIGlmICFkZWZpbmVkICRTdWJJRHNDb3VudDsKCiAgICAgICAgICAgICRJRHNDb3VudCArPSAkU3ViSURzQ291bnQgfHwgMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRJRHNDb3VudDsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICBteSBASURzOwoKICAgICAgICBteSAkUmVzdWx0Q291bnQgPSAwOwoKICAgICAgICBTT1VSQ0U6CiAgICAgICAgZm9yIG15ICRTb3VyY2UgKCBzb3J0IGtleXMgJVNlYXJjaEN1c3RvbWVyQ29tcGFueVNvdXJjZXMgKSB7CiAgICAgICAgICAgIG5leHQgU09VUkNFIGlmICEkU2VsZi0+eyRTb3VyY2V9OwoKICAgICAgICAgICAgbXkgJFN1YklEcyA9ICRTZWxmLT57JFNvdXJjZX0tPkN1c3RvbWVyQ29tcGFueVNlYXJjaERldGFpbCgKICAgICAgICAgICAgICAgICVQYXJhbSwKICAgICAgICAgICAgICAgIFNlYXJjaEZpZWxkcyA9PiAkU2VhcmNoQ3VzdG9tZXJDb21wYW55U291cmNlc3skU291cmNlfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiBpZiAhZGVmaW5lZCAkU3ViSURzOwoKICAgICAgICAgICAgbmV4dCBTT1VSQ0UgaWYgIUlzQXJyYXlSZWZXaXRoRGF0YSgkU3ViSURzKTsKCiAgICAgICAgICAgIHB1c2ggQElEcywgQHskU3ViSURzfTsKCiAgICAgICAgICAgICRSZXN1bHRDb3VudCsrOwogICAgICAgIH0KCiAgICAgICAgIyBJZiB3ZSBoYXZlIG1vcmUgdGhlbiBvbmUgc2VhcmNoIHJlc3VsdHMgZnJvbSBkaWZmcmVudCBzb3VyY2VzLCB3ZSBuZWVkIGEgcmVzb3J0aW5nCiAgICAgICAgIyAgIGFuZCBzcGxpY2UgKGZvciB0aGUgbGltaXQpIGJlY2F1c2Ugb2YgdGhlIG1lcmdlZCBzaW5nbGUgcmVzdWx0cy4KICAgICAgICBpZiAoICRSZXN1bHRDb3VudCA+IDEgKSB7CgogICAgICAgICAgICBteSBAQ3VzdG9tZXJDb21wYW55YXRhTGlzdDsKCiAgICAgICAgICAgIGZvciBteSAkSUQgKEBJRHMpIHsKCiAgICAgICAgICAgICAgICBteSAlQ3VzdG9tZXJDb21wYW55RGF0YSA9ICRTZWxmLT5DdXN0b21lckNvbXBhbnlHZXQoCiAgICAgICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiAkSUQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcHVzaCBAQ3VzdG9tZXJDb21wYW55YXRhTGlzdCwgXCVDdXN0b21lckNvbXBhbnlEYXRhOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkT3JkZXJCeSA9ICdDdXN0b21lcklEJzsKICAgICAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRQYXJhbXtPcmRlckJ5fSApICkgewogICAgICAgICAgICAgICAgJE9yZGVyQnkgPSAkUGFyYW17T3JkZXJCeX0tPlswXTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoICRQYXJhbXtPcmRlckJ5RGlyZWN0aW9ufSApICYmICRQYXJhbXtPcmRlckJ5RGlyZWN0aW9ufS0+WzBdIGVxICdVcCcgKSB7CiAgICAgICAgICAgICAgICBAQ3VzdG9tZXJDb21wYW55YXRhTGlzdCA9IHNvcnQgeyBsYyggJGEtPnskT3JkZXJCeX0gKSBjbXAgbGMoICRiLT57JE9yZGVyQnl9ICkgfSBAQ3VzdG9tZXJDb21wYW55YXRhTGlzdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIEBDdXN0b21lckNvbXBhbnlhdGFMaXN0ID0gc29ydCB7IGxjKCAkYi0+eyRPcmRlckJ5fSApIGNtcCBsYyggJGEtPnskT3JkZXJCeX0gKSB9IEBDdXN0b21lckNvbXBhbnlhdGFMaXN0OwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoICRQYXJhbXtMaW1pdH0gJiYgc2NhbGFyIEBDdXN0b21lckNvbXBhbnlhdGFMaXN0ID4gJFBhcmFte0xpbWl0fSApIHsKICAgICAgICAgICAgICAgIHNwbGljZSBAQ3VzdG9tZXJDb21wYW55YXRhTGlzdCwgJFBhcmFte0xpbWl0fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgQElEcyA9IG1hcCB7ICRfLT57Q3VzdG9tZXJJRH0gfSBAQ3VzdG9tZXJDb21wYW55YXRhTGlzdDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBcQElEczsKICAgIH0KfQoKPWhlYWQyIEN1c3RvbWVyQ29tcGFueVNlYXJjaEZpZWxkcygpCgpHZXQgYSBsaXN0IG9mIGRlZmluZWQgc2VhcmNoIGZpZWxkcyAob3B0aW9uYWwgb25seSB0aGUgcmVsZXZhbnQgZmllbGRzIGZvciB0aGUgZ2l2ZW4gc291cmNlKS4KCiAgICBteSBAU2VhY2hGaWVsZHMgPSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0LT5DdXN0b21lckNvbXBhbnlTZWFyY2hGaWVsZHMoCiAgICAgICAgU291cmNlID0+ICdDdXN0b21lckNvbXBhbnknLCAjIG9wdGlvbmFsLCBidXQgaW1wb3J0YW50IGluIHRoZSBDdXN0b21lckNvbXBhbnlTZWFyY2hEZXRhaWwgdG8gZ2V0IHRoZSByaWdodCBkYXRhYmFzZSBmaWVsZHMKICAgICk7CgpSZXR1cm5zIGFuIGFycmF5IG9mIGhhc2ggcmVmZXJlbmNlcy4KCiAgICBAU2VhY2hGaWVsZHMgPSAoCiAgICAgICAgewogICAgICAgICAgICBOYW1lICA9PiAnQ3VzdG9tZXJJRCcsCiAgICAgICAgICAgIExhYmVsID0+ICdDdXN0b21lcklEJywKICAgICAgICAgICAgVHlwZSAgPT4gJ0lucHV0JywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgPT4gJ0N1c3RvbWVyQ29tcGFueUNvdW50cnknLAogICAgICAgICAgICBMYWJlbCAgICAgICAgICA9PiAnQ291bnRyeScsCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgID0+ICdTZWxlY3Rpb24nLAogICAgICAgICAgICBTZWxlY3Rpb25zRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAnR2VybWFueScgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAgICAgICAgICdVbml0ZWQgS2luZ2RvbScgPT4gJ1VuaXRlZCBLaW5nZG9tJywKICAgICAgICAgICAgICAgICdVbml0ZWQgU3RhdGVzJyAgPT4gJ1VuaXRlZCBTdGF0ZXMnLAogICAgICAgICAgICAgICAgLi4uCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gJ0R5bmFtaWNGaWVsZF9CcmFuY2gnLAogICAgICAgICAgICBMYWJlbCAgICAgICAgID0+ICcnLAogICAgICAgICAgICBUeXBlICAgICAgICAgID0+ICdEeW5hbWljRmllbGQnLAogICAgICAgICAgICBEYXRhYmFzZUZpZWxkID0+ICdCcmFuY2gnLAogICAgICAgIH0sCiAgICApOwoKPWN1dAoKc3ViIEN1c3RvbWVyQ29tcGFueVNlYXJjaEZpZWxkcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgR2V0IHRoZSBzZWFyY2ggZmllbGRzIGZyb20gYWxsIGN1c3RvbWVyIGNvbXBhbnkgbWFwcyAobWVyZ2UgZnJvbSBhbGwgbWFwcyB0b2dldGhlcikuCiAgICBteSBAU2VhcmNoRmllbGRzOwoKICAgIG15ICVTZWFyY2hGaWVsZHNFeGlzdHM7CgogICAgU09VUkNFOgogICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewogICAgICAgIG5leHQgU09VUkNFIGlmICEkU2VsZi0+eyJDdXN0b21lckNvbXBhbnkkQ291bnQifTsKICAgICAgICBuZXh0IFNPVVJDRSBpZiAkUGFyYW17U291cmNlfSAmJiAkUGFyYW17U291cmNlfSBuZSAiQ3VzdG9tZXJDb21wYW55JENvdW50IjsKCiAgICAgICAgRU5UUlk6CiAgICAgICAgZm9yIG15ICRFbnRyeSAoIEB7ICRTZWxmLT57IkN1c3RvbWVyQ29tcGFueSRDb3VudCJ9LT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e01hcH0gfSApIHsKCiAgICAgICAgICAgIG15ICRTZWFyY2hGaWVsZE5hbWUgPSAkRW50cnktPlswXTsKCiAgICAgICAgICAgIG5leHQgRU5UUlkgaWYgJFNlYXJjaEZpZWxkc0V4aXN0c3skU2VhcmNoRmllbGROYW1lfTsKCiAgICAgICAgICAgICMgUmVtZWJlciB0aGUgYWxyZWFkeSBjb2xsZWN0ZWQgc2VhcmNoIGZpZWxkIG5hbWUuCiAgICAgICAgICAgICRTZWFyY2hGaWVsZHNFeGlzdHN7JFNlYXJjaEZpZWxkTmFtZX0gPSAxOwoKICAgICAgICAgICAgbXkgJUZpZWxkQ29uZmlnID0gJFNlbGYtPkdldEZpZWxkQ29uZmlnKAogICAgICAgICAgICAgICAgRmllbGROYW1lID0+ICRTZWFyY2hGaWVsZE5hbWUsCiAgICAgICAgICAgICAgICBTb3VyY2UgICAgPT4gJFBhcmFte1NvdXJjZX0sICAgICAjIHRvIGdldCB0aGUgcmlnaHQgZGF0YWJhc2UgZmllbGQgZm9yIHRoZSBnaXZlbiBzb3VyY2UKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgRU5UUlkgaWYgISVGaWVsZENvbmZpZzsKCiAgICAgICAgICAgIG15ICVTZWFyY2hGaWVsZERhdGEgPSAoCiAgICAgICAgICAgICAgICAlRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBOYW1lID0+ICRTZWFyY2hGaWVsZE5hbWUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAlU2VsZWN0aW9uc0RhdGEgPSAkU2VsZi0+R2V0RmllbGRTZWxlY3Rpb25zKAogICAgICAgICAgICAgICAgRmllbGROYW1lID0+ICRTZWFyY2hGaWVsZE5hbWUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRTZWFyY2hGaWVsZERhdGF7U3RvcmFnZVR5cGV9IGVxICdkeW5hbWljX2ZpZWxkJyApIHsKICAgICAgICAgICAgICAgICRTZWFyY2hGaWVsZERhdGF7VHlwZX0gPSAnRHluYW1pY0ZpZWxkJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoJVNlbGVjdGlvbnNEYXRhKSB7CiAgICAgICAgICAgICAgICAkU2VhcmNoRmllbGREYXRhe1R5cGV9ICAgICAgICAgICA9ICdTZWxlY3Rpb24nOwogICAgICAgICAgICAgICAgJFNlYXJjaEZpZWxkRGF0YXtTZWxlY3Rpb25zRGF0YX0gPSBcJVNlbGVjdGlvbnNEYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlYXJjaEZpZWxkRGF0YXtUeXBlfSA9ICdJbnB1dCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1c2ggQFNlYXJjaEZpZWxkcywgXCVTZWFyY2hGaWVsZERhdGE7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBAU2VhcmNoRmllbGRzOwp9Cgo9aGVhZDIgR2V0RmllbGRDb25maWcoKQoKVGhpcyBmdW5jdGlvbiBjb2xsZWN0IHNvbWUgZmllbGQgY29uZmlnIGluZm9ybWF0aW9uIGZyb20gdGhlIGN1c3RvbWVyIHVzZXIgbWFwLgoKICAgIG15ICVGaWVsZENvbmZpZyA9ICRDdXN0b21lckNvbXBhbnlPYmplY3QtPkdldEZpZWxkQ29uZmlnKAogICAgICAgIEZpZWxkTmFtZSA9PiAnQ3VzdG9tZXJDb21wYW55TmFtZScsCiAgICAgICAgU291cmNlICAgID0+ICdDdXN0b21lckNvbXBhbnknLCAjIG9wdGlvbmFsCiAgICApOwoKUmV0dXJucyBzb21lIGZpZWxkIGNvbmZpZyBpbmZvcm1hdGlvbjoKCiAgICBteSAlRmllbGRDb25maWcgPSAoCiAgICAgICAgTGFiZWwgICAgICAgICA9PiAnTmFtZScsCiAgICAgICAgRGF0YWJhc2VGaWVsZCA9PiAnbmFtZScsCiAgICAgICAgU3RvcmFnZVR5cGUgICA9PiAndmFyJywKICAgICk7Cgo9Y3V0CgpzdWIgR2V0RmllbGRDb25maWcgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBpZiAoICEkUGFyYW17RmllbGROYW1lfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgRmllbGROYW1lISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBTT1VSQ0U6CiAgICBmb3IgbXkgJENvdW50ICggJycsIDEgLi4gMTAgKSB7CiAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRTZWxmLT57IkN1c3RvbWVyQ29tcGFueSRDb3VudCJ9OwogICAgICAgIG5leHQgU09VUkNFIGlmICRQYXJhbXtTb3VyY2V9ICYmICRQYXJhbXtTb3VyY2V9IG5lICJDdXN0b21lckNvbXBhbnkkQ291bnQiOwoKICAgICAgICAjIFNlYXJjaCB0aGUgcmlnaHQgZmllbGQgYW5kIHJldHVybiB0aGUgbGFiZWwuCiAgICAgICAgRU5UUlk6CiAgICAgICAgZm9yIG15ICRFbnRyeSAoIEB7ICRTZWxmLT57IkN1c3RvbWVyQ29tcGFueSRDb3VudCJ9LT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e01hcH0gfSApIHsKICAgICAgICAgICAgbmV4dCBFTlRSWSBpZiAkUGFyYW17RmllbGROYW1lfSBuZSAkRW50cnktPlswXTsKCiAgICAgICAgICAgIG15ICVGaWVsZENvbmZpZyA9ICgKICAgICAgICAgICAgICAgIExhYmVsICAgICAgICAgPT4gJEVudHJ5LT5bMV0sCiAgICAgICAgICAgICAgICBEYXRhYmFzZUZpZWxkID0+ICRFbnRyeS0+WzJdLAogICAgICAgICAgICAgICAgU3RvcmFnZVR5cGUgICA9PiAkRW50cnktPls1XSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiAlRmllbGRDb25maWc7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybjsKfQoKPWhlYWQyIEdldEZpZWxkU2VsZWN0aW9ucygpCgpUaGlzIGZ1bmN0aW9uIGNvbGxlY3QgdGhlIHNlbGVjdGlvbnMgZm9yIHRoZSBnaXZlbiBmaWVsZCBuYW1lLCBpZiB0aGUgZmllbGQgaGFzIHNvbWUgc2VsZWN0aW9ucy4KCiAgICBteSAlU2VsZWN0aW9uc0RhdGEgPSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0LT5HZXRGaWVsZFNlbGVjdGlvbnMoCiAgICAgICAgRmllbGROYW1lID0+ICdDdXN0b21lckNvbXBhbnlDb3VudHJ5JywKICAgICk7CgpSZXR1cm5zIHRoZSBzZWxlY3Rpb25zIGZvciB0aGUgZ2l2ZW4gZmllbGQgbmFtZSAobWVyZ2VkIGZyb20gYWxsIHNvdXJjZXMpIG9yIGEgZW1wdHkgaGFzaDoKCiAgICBteSAlU2VsZWN0aW9uRGF0YSA9ICgKICAgICAgICAnR2VybWFueScgICAgICAgID0+ICdHZXJtYW55JywKICAgICAgICAnVW5pdGVkIEtpbmdkb20nID0+ICdVbml0ZWQgS2luZ2RvbScsCiAgICAgICAgJ1VuaXRlZCBTdGF0ZXMnICA9PiAnVW5pdGVkIFN0YXRlcycsCiAgICApOwoKPWN1dAoKc3ViIEdldEZpZWxkU2VsZWN0aW9ucyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17RmllbGROYW1lfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgRmllbGROYW1lISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAlU2VsZWN0aW9uc0RhdGE7CgogICAgU09VUkNFOgogICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewogICAgICAgIG5leHQgU09VUkNFIGlmICEkU2VsZi0+eyJDdXN0b21lckNvbXBhbnkkQ291bnQifTsKICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJFNlbGYtPnsiQ3VzdG9tZXJDb21wYW55JENvdW50In0tPntDdXN0b21lckNvbXBhbnlNYXB9LT57U2VsZWN0aW9uc30tPnsgJFBhcmFte0ZpZWxkTmFtZX0gfTsKCiAgICAgICAgJVNlbGVjdGlvbnNEYXRhID0gKAogICAgICAgICAgICAlU2VsZWN0aW9uc0RhdGEsCiAgICAgICAgICAgICV7ICRTZWxmLT57IkN1c3RvbWVyQ29tcGFueSRDb3VudCJ9LT57Q3VzdG9tZXJDb21wYW55TWFwfS0+e1NlbGVjdGlvbnN9LT57ICRQYXJhbXtGaWVsZE5hbWV9IH0gfQogICAgICAgICk7CiAgICB9CgogICAgIyBNYWtlIHN1cmUgdGhlIGVuY29kaW5nIHN0YW1wIGlzIHNldC4KICAgIGZvciBteSAkS2V5ICggc29ydCBrZXlzICVTZWxlY3Rpb25zRGF0YSApIHsKICAgICAgICAkU2VsZWN0aW9uc0RhdGF7JEtleX0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RW5jb2RlJyktPkVuY29kZUlucHV0KCAkU2VsZWN0aW9uc0RhdGF7JEtleX0gKTsKICAgIH0KCiAgICAjIERlZmF1bHQgaGFuZGxpbmcgZm9yIGZpZWxkICdDdXN0b21lckNvbXBhbnlDb3VudHJ5Jy4KICAgIGlmICggISVTZWxlY3Rpb25zRGF0YSAmJiAkUGFyYW17RmllbGROYW1lfSA9fiAvXkN1c3RvbWVyQ29tcGFueUNvdW50cnkvaSApIHsKICAgICAgICAlU2VsZWN0aW9uc0RhdGEgPSAleyAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6UmVmZXJlbmNlRGF0YScpLT5Db3VudHJ5TGlzdCgpIH07CiAgICB9CgogICAgIyBEZWZhdWx0IGhhbmRsaW5nIGZvciBmaWVsZCAnVmFsaWRJRCcuCiAgICBlbHNpZiAoICElU2VsZWN0aW9uc0RhdGEgJiYgJFBhcmFte0ZpZWxkTmFtZX0gPX4gL15WYWxpZElEL2kgKSB7CiAgICAgICAgJVNlbGVjdGlvbnNEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkTGlzdCgpOwogICAgfQoKICAgIHJldHVybiAlU2VsZWN0aW9uc0RhdGE7Cn0KCnN1YiBERVNUUk9ZIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBleGVjdXRlIGFsbCB0cmFuc2FjdGlvbiBldmVudHMKICAgICRTZWxmLT5FdmVudEhhbmRsZXJUcmFuc2FjdGlvbigpOwoKICAgIHJldHVybiAxOwp9CgoxOwo=</File>
        <File Location="Custom/Kernel/System/CustomerUser.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgJG9yaWdpbjogb3RvYm8gLSBkZWI5OWQ2MGRhZjIxMmFlNzNlYzdmZWI3ODA3NGYzZjdhZTU2M2Y4IC0gS2VybmVsL1N5c3RlbS9DdXN0b21lclVzZXIucG0KIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IHVuZGVyCiMgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAojIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTCiMgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiBTZWUgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gSWYgbm90LCBzZWUgPGh0dHBzOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHBhcmVudCBxdyhLZXJuZWw6OlN5c3RlbTo6RXZlbnRIYW5kbGVyKTsKCiMgY29yZSBtb2R1bGVzCgojIENQQU4gbW9kdWxlcwoKIyBPVE9CTyBtb2R1bGVzCnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFyaWFibGVDaGVjayBxdyg6YWxsKTsKCm91ciBAT2JqZWN0RGVwZW5kZW5jaWVzID0gKAogICAgJ0tlcm5lbDo6Q29uZmlnJywKICAgICdLZXJuZWw6Okxhbmd1YWdlJywKICAgICdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckNvbXBhbnknLAogICAgJ0tlcm5lbDo6U3lzdGVtOjpEQicsCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcsCiAgICAnS2VybmVsOjpTeXN0ZW06OkVuY29kZScsCiMgUm90aGVyIE9TUyAvIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CiAgICAnS2VybmVsOjpTeXN0ZW06Okdyb3VwJywKIyBFTyBSb3RoZXIgT1NTCiAgICAnS2VybmVsOjpTeXN0ZW06OkxvZycsCiAgICAnS2VybmVsOjpTeXN0ZW06Ok1haW4nLAojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgJ0tlcm5lbDo6U3lzdGVtOjpVc2VyJywKIyBFTyBSb3RoZXIgT1NTCiAgICAnS2VybmVsOjpTeXN0ZW06OlZhbGlkJywKKTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyIC0gY3VzdG9tZXIgdXNlciBsaWIKCj1oZWFkMSBERVNDUklQVElPTgoKQWxsIGN1c3RvbWVyIHVzZXIgZnVuY3Rpb25zLiBFLiBnLiB0byBhZGQgYW5kIHVwZGF0ZSBjdXN0b21lciB1c2Vycy4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9aGVhZDIgbmV3KCkKCkRvbid0IHVzZSB0aGUgY29uc3RydWN0b3IgZGlyZWN0bHksIHVzZSB0aGUgT2JqZWN0TWFuYWdlciBpbnN0ZWFkOgoKICAgIG15ICRDdXN0b21lclVzZXJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyJyk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IGJsZXNzIHt9LCAkVHlwZTsKCiAgICAkU2VsZi0+e0NhY2hlVHlwZX0gPSAnQ3VzdG9tZXJVc2VyJzsKICAgICRTZWxmLT57Q2FjaGVUVEx9ICA9IDYwICogNjAgKiAyNCAqIDIwOwoKICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgICMgbG9hZCBnZW5lcmF0b3IgY3VzdG9tZXIgcHJlZmVyZW5jZXMgbW9kdWxlCiAgICBteSAkR2VuZXJhdG9yTW9kdWxlID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclByZWZlcmVuY2VzJyktPntNb2R1bGV9CiAgICAgICAgfHwgJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXI6OlByZWZlcmVuY2VzOjpEQic7CgogICAgIyBnZXQgbWFpbiBvYmplY3QKICAgIG15ICRNYWluT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Ok1haW4nKTsKCiAgICBpZiAoICRNYWluT2JqZWN0LT5SZXF1aXJlKCRHZW5lcmF0b3JNb2R1bGUpICkgewogICAgICAgICRTZWxmLT57UHJlZmVyZW5jZXNPYmplY3R9ID0gJEdlbmVyYXRvck1vZHVsZS0+bmV3KCk7CiAgICB9CgojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgbXkgJExheW91dFBhcmFtID0gJEtlcm5lbDo6T00tPntQYXJhbX0tPnsnS2VybmVsOjpPdXRwdXQ6OkhUTUw6OkxheW91dCd9OwoKICAgICMgQ2hlY2sgaWYgbXVsdGl0ZW5hbmN5IGlzIGVuYWJsZWQgYW5kIHRoZSByZXF1ZXN0IGlzIGNvbWluZyBmcm9tIGEgdXNlci4KICAgIGlmICggJExheW91dFBhcmFtLT57VXNlclR5cGV9ICYmICRMYXlvdXRQYXJhbS0+e1VzZXJUeXBlfSBlcSAnVXNlcicgJiYgJENvbmZpZ09iamVjdC0+R2V0KCdNdWx0aXRlbmFuY3knKSApIHsKCiAgICAgICAgIyBTYXZlIHRoZSBVc2VySUQgYW5kIGFsbCBncm91cHMgdGhlIHVzZXIgaGFzICdybycgcGVybWlzc2lvbiBvbi4KICAgICAgICBpZiAoICRMYXlvdXRQYXJhbS0+e1VzZXJJRH0gKSB7CiAgICAgICAgICAgICMgT25seSBnZXQgdGhlIGdyb3VwIGxpc3Qgb25jZSBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucy4KICAgICAgICAgICAgbXkgJUdyb3VwcyA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5QZXJtaXNzaW9uVXNlckdldCgKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAkTGF5b3V0UGFyYW0tPntVc2VySUR9LAogICAgICAgICAgICAgICAgVHlwZSAgID0+ICdybycsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICAjIFRoZSBsaW1pdCBkb2VzIG5vdCBjb3VudCBmb3IgbWVtYmVycyBvZiBhIHNwZWNpZmljIGdyb3VwLgogICAgICAgICAgICBteSAkUGVybWlzc2lvbkdyb3VwID0gJENvbmZpZ09iamVjdC0+R2V0KCdNdWx0aXRlbmFuY3k6OlBlcm1pc3Npb25Hcm91cCcpIHx8ICcnOwogICAgICAgICAgICBteSAlR3JvdXBzUmV2ZXJzZSAgID0gcmV2ZXJzZSAlR3JvdXBzOwoKICAgICAgICAgICAgaWYgKCAhJEdyb3Vwc1JldmVyc2V7JFBlcm1pc3Npb25Hcm91cH0gKSB7CiAgICAgICAgICAgICAgICAkU2VsZi0+e011bHRpdGVuYW5jeX0gPSAkTGF5b3V0UGFyYW0tPntVc2VySUR9OwogICAgICAgICAgICAgICAgJFNlbGYtPntVc2VyR3JvdXBJRHN9ID0gWyBrZXlzICVHcm91cHMgXTsKICAgICAgICAgICAgICAgICRTZWxmLT57VXNlckdyb3Vwc30gICA9IFsgdmFsdWVzICVHcm91cHMgXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KIyBFTyBDdXN0b21lck11bHRpdGVuYW5jeQoKICAgICMgbG9hZCBjdXN0b21lciB1c2VyIGJhY2tlbmQgbW9kdWxlCiAgICBTT1VSQ0U6CiAgICBmb3IgbXkgJENvdW50ICggJycsIDEgLi4gMTAgKSB7CgogICAgICAgIG5leHQgU09VUkNFIHVubGVzcyAkQ29uZmlnT2JqZWN0LT5HZXQoIkN1c3RvbWVyVXNlciRDb3VudCIpOwojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgICAgICMgQ2hlY2sgaWYgdGhlIHVzZXIgaGFzIHBlcm1pc3Npb24gdG8gYWNjZXNzIHRoZSBzb3VyY2UuCiAgICAgICAgbXkgJEN1c3RvbWVyVXNlckdyb3VwID0gJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lclVzZXIkQ291bnQiKS0+e0N1c3RvbWVyVXNlckdyb3VwfTsKCiAgICAgICAgIyBUaGUgdXNlciBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gZ2V0IGluZm9ybWF0aW9uIGZyb20gdGhpcyBzb3VyY2UuCiAgICAgICAgaWYgKCAkU2VsZi0+e011bHRpdGVuYW5jeX0gJiYgJEN1c3RvbWVyVXNlckdyb3VwICkgewogICAgICAgICAgICBpZiAoICFncmVwIHsgJF8gPX4gL14kQ3VzdG9tZXJVc2VyR3JvdXAkLyB9IEB7ICRTZWxmLT57VXNlckdyb3Vwc30gfSApIHsKICAgICAgICAgICAgICAgIG5leHQgU09VUkNFOwogICAgICAgICAgICB9CiAgICAgICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CgogICAgICAgIG15ICRHZW5lcmljTW9kdWxlID0gJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lclVzZXIkQ291bnQiKS0+e01vZHVsZX07CiAgICAgICAgaWYgKCAhJE1haW5PYmplY3QtPlJlcXVpcmUoJEdlbmVyaWNNb2R1bGUpICkgewogICAgICAgICAgICAkTWFpbk9iamVjdC0+RGllKCJDYW4ndCBsb2FkIGJhY2tlbmQgbW9kdWxlICRHZW5lcmljTW9kdWxlISAkQCIpOwogICAgICAgIH0KCiAgICAgICAgJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In0gPSAkR2VuZXJpY01vZHVsZS0+bmV3KAogICAgICAgICAgICBDb3VudCAgICAgICAgICAgICA9PiAkQ291bnQsCiAgICAgICAgICAgIFByZWZlcmVuY2VzT2JqZWN0ID0+ICRTZWxmLT57UHJlZmVyZW5jZXNPYmplY3R9LAogICAgICAgICAgICBDdXN0b21lclVzZXJNYXAgICA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoIkN1c3RvbWVyVXNlciRDb3VudCIpLAogICAgICAgICk7CiAgICB9CgogICAgIyBpbml0IG9mIGV2ZW50IGhhbmRsZXIKICAgICRTZWxmLT5FdmVudEhhbmRsZXJJbml0KAogICAgICAgIENvbmZpZyA9PiAnQ3VzdG9tZXJVc2VyOjpFdmVudE1vZHVsZVBvc3QnLAogICAgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1oZWFkMiBDdXN0b21lclNvdXJjZUxpc3QoKQoKcmV0dXJuIGN1c3RvbWVyIHNvdXJjZSBsaXN0CgogICAgbXkgJUxpc3QgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclNvdXJjZUxpc3QoCiAgICAgICAgUmVhZE9ubHkgPT4gMCAjIG9wdGlvbmFsLCAxIHJldHVybnMgb25seSBSTyBiYWNrZW5kcywgMCByZXR1cm5zIHdyaXRhYmxlLCBpZiBub3QgcGFzc2VkIHJldHVybnMgYWxsIGJhY2tlbmRzCiAgICApOwoKPWN1dAoKc3ViIEN1c3RvbWVyU291cmNlTGlzdCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGNvbmZpZyBvYmplY3QKICAgIG15ICRDb25maWdPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OkNvbmZpZycpOwoKICAgIG15ICVEYXRhOwogICAgU09VUkNFOgogICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewoKICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lclVzZXIkQ291bnQiKTsKICAgICAgICBpZiAoIGRlZmluZWQgJFBhcmFte1JlYWRPbmx5fSApIHsKICAgICAgICAgICAgbXkgJEN1c3RvbWVyQmFja2VuZENvbmZpZyA9ICRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJVc2VyJENvdW50Iik7CiAgICAgICAgICAgIGlmICggJFBhcmFte1JlYWRPbmx5fSApIHsKICAgICAgICAgICAgICAgIG5leHQgU09VUkNFIGlmICEkQ3VzdG9tZXJCYWNrZW5kQ29uZmlnLT57UmVhZE9ubHl9IHx8ICRDdXN0b21lckJhY2tlbmRDb25maWctPntNb2R1bGV9ICF+IC9MREFQL2k7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBuZXh0IFNPVVJDRSBpZiAkQ3VzdG9tZXJCYWNrZW5kQ29uZmlnLT57UmVhZE9ubHl9IHx8ICRDdXN0b21lckJhY2tlbmRDb25maWctPntNb2R1bGV9ID1+IC9MREFQL2k7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJERhdGF7IkN1c3RvbWVyVXNlciRDb3VudCJ9ID0gJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lclVzZXIkQ291bnQiKS0+e05hbWV9CiAgICAgICAgICAgIHx8ICJObyBOYW1lICRDb3VudCI7CiAgICB9CiAgICByZXR1cm4gJURhdGE7Cn0KCj1oZWFkMiBDdXN0b21lclNlYXJjaCgpCgp0byBzZWFyY2ggY3VzdG9tZXIgdXNlcnMKCiAgICAjIHRleHQgc2VhcmNoCiAgICBteSAlTGlzdCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU2VhcmNoKAogICAgICAgIFNlYXJjaCA9PiAnKnNvbWUqJywgIyBhbHNvICdoYW5zK2h1YmVyJyBwb3NzaWJsZQogICAgICAgIFZhbGlkICA9PiAxLCAgICAgICAgIyAob3B0aW9uYWwpIGRlZmF1bHQgMQogICAgICAgIExpbWl0ICA9PiAxMDAsICAgICAgIyAob3B0aW9uYWwpIG92ZXJyaWRlcyBsaW1pdCBvZiB0aGUgY29uZmlnCiAgICApOwoKICAgICMgdXNlcm5hbWUgc2VhcmNoCiAgICBteSAlTGlzdCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU2VhcmNoKAogICAgICAgIFVzZXJMb2dpbiA9PiAnKnNvbWUqJywKICAgICAgICBWYWxpZCAgICAgPT4gMSwgICAgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAxCiAgICApOwoKICAgICMgZW1haWwgc2VhcmNoCiAgICBteSAlTGlzdCA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyU2VhcmNoKAogICAgICAgIFBvc3RNYXN0ZXJTZWFyY2ggPT4gJ2VtYWlsQGV4YW1wbGUuY29tJywKICAgICAgICBWYWxpZCAgICAgICAgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAxCiAgICApOwoKICAgICMgc2VhcmNoIGJ5IEN1c3RvbWVySUQKICAgIG15ICVMaXN0ID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJTZWFyY2goCiAgICAgICAgQ3VzdG9tZXJJRCAgICAgICA9PiAnQ3VzdG9tZXJJRDEyMycsCiAgICAgICAgVmFsaWQgICAgICAgICAgICA9PiAxLCAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkgZGVmYXVsdCAxCiAgICApOwoKUmV0dXJucyBhIGhhc2ggbGlrZToKCiAgICB7CiAgICAgICAgJ3RpbmEnID0+ICciVGluYSBUZXN0ZXIiIDx0aW5hQGV4YW1wbGUuY29tPicsCiAgICAgICAgJ3RvbmknID0+ICciVG9uaSBUZXN0ZXIiIDx0b25pQGV4YW1wbGUuY29tPicsCiAgICB9Cgo9Y3V0CgpzdWIgQ3VzdG9tZXJTZWFyY2ggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHJlbW92ZSBsZWFkaW5nIGFuZCBlbmRpbmcgc3BhY2VzCiAgICBpZiAoICRQYXJhbXtTZWFyY2h9ICkgewogICAgICAgICRQYXJhbXtTZWFyY2h9ID1+IHMvXlxzKy8vOwogICAgICAgICRQYXJhbXtTZWFyY2h9ID1+IHMvXHMrJC8vOwogICAgfQoKICAgICMgR2V0IGR5bmFtaWMgZmllbGQgb2JqZWN0LgogICAgbXkgJER5bmFtaWNGaWVsZE9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEeW5hbWljRmllbGQnKTsKCiAgICBteSAkRHluYW1pY0ZpZWxkQ29uZmlncyA9ICREeW5hbWljRmllbGRPYmplY3QtPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgT2JqZWN0VHlwZSA9PiAnQ3VzdG9tZXJVc2VyJywKICAgICAgICBWYWxpZCAgICAgID0+IDEsCiAgICApOwoKICAgIG15ICVEeW5hbWljRmllbGRMb29rdXAgPSBtYXAgeyAkXy0+e05hbWV9ID0+ICRfIH0gQHskRHluYW1pY0ZpZWxkQ29uZmlnc307CgogICAgIyBHZXQgZHluYW1pYyBmaWVsZCBiYWNrZW5kIG9iamVjdC4KICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgIG15ICVEYXRhOwogICAgU09VUkNFOgogICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewoKICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In07CgogICAgICAgICMgc2VhcmNoIGR5bmFtaWMgZmllbGQgdmFsdWVzLCBpZiBjb25maWd1cmVkCiAgICAgICAgbXkgJE1hcCA9ICRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9LT57Q3VzdG9tZXJVc2VyTWFwfS0+e01hcH07CiAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoJE1hcCkgKSB7CgogICAgICAgICAgICAjIGZldGNoIGR5bmFtaWMgZmllbGQgbmFtZXMgdGhhdCBhcmUgY29uZmlndXJlZCBpbiBNYXAKICAgICAgICAgICAgIyBvbmx5IHRoZXNlIHdpbGwgYmUgY29uc2lkZXJlZCBmb3IgYW55IG90aGVyIHNlYXJjaCBjb25maWcKICAgICAgICAgICAgIyBbICdEeW5hbWljRmllbGRfTmFtZV9YJywgdW5kZWYsICdOYW1lX1gnLCAwLCAwLCAnZHluYW1pY19maWVsZCcsIHVuZGVmLCAwLCB1bmRlZiwgdW5kZWYsIF0sCiAgICAgICAgICAgIG15ICVEeW5hbWljRmllbGROYW1lcyA9IG1hcCB7ICRfLT5bMl0gPT4gMSB9IGdyZXAgeyAkXy0+WzVdIGVxICdkeW5hbWljX2ZpZWxkJyB9IEB7JE1hcH07CgogICAgICAgICAgICBpZiAoIElzSGFzaFJlZldpdGhEYXRhKCBcJUR5bmFtaWNGaWVsZE5hbWVzICkgKSB7CiAgICAgICAgICAgICAgICBteSAkRm91bmREeW5hbWljRmllbGRPYmplY3RJRHM7CiAgICAgICAgICAgICAgICBteSAkU2VhcmNoRmllbGRzOwogICAgICAgICAgICAgICAgbXkgJFNlYXJjaFBhcmFtOwoKICAgICAgICAgICAgICAgICMgY2hlY2sgd2hpY2ggb2YgdGhlIGR5bmFtaWMgZmllbGRzIGNvbmZpZ3VyZWQgaW4gTWFwIGFyZSBhbHNvCiAgICAgICAgICAgICAgICAjIGNvbmZpZ3VyZWQgaW4gU2VhcmNoRmllbGRzCgogICAgICAgICAgICAgICAgIyBwYXJhbSBTZWFyY2gKICAgICAgICAgICAgICAgIGlmICggZGVmaW5lZCAkUGFyYW17U2VhcmNofSAmJiBsZW5ndGggJFBhcmFte1NlYXJjaH0gKSB7CiAgICAgICAgICAgICAgICAgICAgJFNlYXJjaEZpZWxkcyA9ICRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9LT57Q3VzdG9tZXJVc2VyTWFwfS0+e0N1c3RvbWVyVXNlclNlYXJjaEZpZWxkc307CiAgICAgICAgICAgICAgICAgICAgJFNlYXJjaFBhcmFtICA9ICRQYXJhbXtTZWFyY2h9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgcGFyYW0gUG9zdE1hc3RlclNlYXJjaAogICAgICAgICAgICAgICAgZWxzaWYgKCBkZWZpbmVkICRQYXJhbXtQb3N0TWFzdGVyU2VhcmNofSAmJiBsZW5ndGggJFBhcmFte1Bvc3RNYXN0ZXJTZWFyY2h9ICkgewogICAgICAgICAgICAgICAgICAgICRTZWFyY2hGaWVsZHMgPSAkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifS0+e0N1c3RvbWVyVXNlck1hcH0tPntDdXN0b21lclVzZXJQb3N0TWFzdGVyU2VhcmNoRmllbGRzfTsKICAgICAgICAgICAgICAgICAgICAkU2VhcmNoUGFyYW0gID0gJFBhcmFte1Bvc3RNYXN0ZXJTZWFyY2h9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgc2VhcmNoIGR5bmFtaWMgZmllbGQgdmFsdWVzCiAgICAgICAgICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSgkU2VhcmNoRmllbGRzKSApIHsKICAgICAgICAgICAgICAgICAgICBteSBAU2VhcmNoRHluYW1pY0ZpZWxkTmFtZXMgPSBncmVwIHsgZXhpc3RzICREeW5hbWljRmllbGROYW1lc3skX30gfSBAeyRTZWFyY2hGaWVsZHN9OwoKICAgICAgICAgICAgICAgICAgICBteSAlRm91bmREeW5hbWljRmllbGRPYmplY3RJRHM7CiAgICAgICAgICAgICAgICAgICAgRklFTEROQU1FOgogICAgICAgICAgICAgICAgICAgIGZvciBteSAkRmllbGROYW1lIChAU2VhcmNoRHluYW1pY0ZpZWxkTmFtZXMpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICREeW5hbWljRmllbGRDb25maWcgPSAkRHluYW1pY0ZpZWxkTG9va3VweyRGaWVsZE5hbWV9OwoKICAgICAgICAgICAgICAgICAgICAgICAgbmV4dCBGSUVMRE5BTUUgaWYgIUlzSGFzaFJlZldpdGhEYXRhKCREeW5hbWljRmllbGRDb25maWcpOwoKICAgICAgICAgICAgICAgICAgICAgICAgbXkgJER5bmFtaWNGaWVsZFZhbHVlcyA9ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0LT5WYWx1ZVNlYXJjaCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIER5bmFtaWNGaWVsZENvbmZpZyA9PiAkRHluYW1pY0ZpZWxkQ29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VhcmNoICAgICAgICAgICAgID0+ICRTZWFyY2hQYXJhbSwKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggSXNBcnJheVJlZldpdGhEYXRhKCREeW5hbWljRmllbGRWYWx1ZXMpICkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIG15ICREeW5hbWljRmllbGRWYWx1ZSAoIEB7JER5bmFtaWNGaWVsZFZhbHVlc30gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJEZvdW5kRHluYW1pY0ZpZWxkT2JqZWN0SURzeyAkRHluYW1pY0ZpZWxkVmFsdWUtPntPYmplY3RJRH0gfSA9IDE7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICRGb3VuZER5bmFtaWNGaWVsZE9iamVjdElEcyA9IFsga2V5cyAlRm91bmREeW5hbWljRmllbGRPYmplY3RJRHMgXTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjIGV4ZWN1dGUgYmFja2VuZCBzZWFyY2ggZm9yIGZvdW5kIG9iamVjdCBJRHMKICAgICAgICAgICAgICAgICMgdGhpcyBkYXRhIGlzIGJlaW5nIG1lcmdlZCB3aXRoIHRoZSBmb2xsb3dpbmcgQ3VzdG9tZXJTZWFyY2ggY2FsbAogICAgICAgICAgICAgICAgaWYgKCBJc0FycmF5UmVmV2l0aERhdGEoJEZvdW5kRHluYW1pY0ZpZWxkT2JqZWN0SURzKSApIHsKCiAgICAgICAgICAgICAgICAgICAgbXkgJE9iamVjdE5hbWVzID0gJER5bmFtaWNGaWVsZE9iamVjdC0+T2JqZWN0TWFwcGluZ0dldCgKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0SUQgICA9PiAkRm91bmREeW5hbWljRmllbGRPYmplY3RJRHMsCiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdFR5cGUgPT4gJ0N1c3RvbWVyVXNlcicsCiAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgT0JKRUNUTkFNRToKICAgICAgICAgICAgICAgICAgICBmb3IgbXkgJE9iamVjdE5hbWUgKCB2YWx1ZXMgJXskT2JqZWN0TmFtZXN9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBuZXh0IE9CSkVDVE5BTUUgaWYgZXhpc3RzICREYXRheyRPYmplY3ROYW1lfTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICVTZWFyY2hQYXJhbSA9ICVQYXJhbTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlICRTZWFyY2hQYXJhbXtTZWFyY2h9OwogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgJFNlYXJjaFBhcmFte1Bvc3RNYXN0ZXJTZWFyY2h9OwoKICAgICAgICAgICAgICAgICAgICAgICAgJFNlYXJjaFBhcmFte1VzZXJMb2dpbn0gPSAkT2JqZWN0TmFtZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG15ICVTdWJEYXRhID0gJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In0tPkN1c3RvbWVyU2VhcmNoKCVTZWFyY2hQYXJhbSk7CgogICAgICAgICAgICAgICAgICAgICAgICAjIFVzZXJMb2dpbiBzZWFyY2ggZG9lcyBhIHdpbGQtY2FyZCBzZWFyY2gsIGJ1dCBpbiB0aGlzIGNhc2Ugb25seSB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgIyBleGFjdCBtYXRjaGluZyB1c2VyIGxvZ2luIGlzIHJlbGV2YW50CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggSXNIYXNoUmVmV2l0aERhdGEoIFwlU3ViRGF0YSApICYmIGV4aXN0cyAkU3ViRGF0YXskT2JqZWN0TmFtZX0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAlRGF0YSA9ICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkT2JqZWN0TmFtZSA9PiAkU3ViRGF0YXskT2JqZWN0TmFtZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJURhdGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgZ2V0IGN1c3RvbWVyIHNlYXJjaCByZXN1bHQgb2YgYmFja2VuZCBhbmQgbWVyZ2UgaXQKICAgICAgICBteSAlU3ViRGF0YSA9ICRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9LT5DdXN0b21lclNlYXJjaCglUGFyYW0pOwoKICAgICAgICAlRGF0YSA9ICggJVN1YkRhdGEsICVEYXRhICk7CiAgICB9CgojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgIyBDaGVjayBpZiB0aGUgdXNlciBoYXMgcGVybWlzc2lvbiB0byBzZWUgdGhpcyBjdXN0b21lciB1c2VyLgogICAgIyBUT0RPOiBSZW1vdmUgdGhpcyBpZiB0aGUgREIvTERBUCBmdW5jdGlvbiBDdXN0b21lclNlYXJjaCBpcyBmdWxseSBpbXBsZW1lbnRlZC4KICAgIGlmICggJFNlbGYtPntNdWx0aXRlbmFuY3l9ICkgewogICAgICAgIENVU1RPTUVSTE9HSU46CiAgICAgICAgZm9yIG15ICRDdXN0b21lclVzZXJMb2dpbiAoIGtleXMgJURhdGEgKSB7CiAgICAgICAgICAgIG15ICVVc2VyRGF0YSA9ICRTZWxmLT5DdXN0b21lclVzZXJEYXRhR2V0KAogICAgICAgICAgICAgICAgVXNlciA9PiAkQ3VzdG9tZXJVc2VyTG9naW4sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICElVXNlckRhdGEgKSB7CiAgICAgICAgICAgICAgICBkZWxldGUgJERhdGF7JEN1c3RvbWVyVXNlckxvZ2lufTsKICAgICAgICAgICAgICAgIG5leHQgQ1VTVE9NRVJMT0dJTjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KIyBFTyBDdXN0b21lck11bHRpdGVuYW5jeQoKICAgIHJldHVybiAlRGF0YTsKfQoKPWhlYWQyIEN1c3RvbWVyU2VhcmNoRGV0YWlsKCkKClRvIGZpbmQgY3VzdG9tZXIgdXNlcnMgaW4gdGhlIHN5c3RlbS4KClRoZSBzZWFyY2ggY3JpdGVyaWEgYXJlIGxvZ2ljYWxseSBBTkQgY29ubmVjdGVkLgpXaGVuIGEgbGlzdCBpcyBwYXNzZWQgYXMgY3JpdGVyaWEsIHRoZSBpbmRpdmlkdWFsIG1lbWJlcnMgYXJlIE9SIGNvbm5lY3RlZC4KV2hlbiBhbiB1bmRlZiBvciBhIHJlZmVyZW5jZSB0byBhbiBlbXB0eSBhcnJheSBpcyBwYXNzZWQsIHRoZW4gdGhlIHNlYXJjaCBjcml0ZXJpYQppcyBpZ25vcmVkLgoKUmV0dXJucyBlaXRoZXIgYSBsaXN0LCBhcyBhbiBhcnJheXJlZiwgb3IgYSBjb3VudCBvZiBmb3VuZCBjdXN0b21lciB1c2VyIGlkcy4KVGhlIGNvdW50IG9mIHJlc3VsdHMgaXMgcmV0dXJuZWQgd2hlbiB0aGUgcGFyYW1ldGVyIEM8UmVzdWx0ID0gJ0NPVU5UJz4gaXMgcGFzc2VkLgoKICAgIG15ICRDdXN0b21lclVzZXJJRHNSZWYgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclNlYXJjaERldGFpbCgKCiAgICAgICAgIyBhbGwgZmllbGRzIHdoaWNoIGFyZSBkZWZpbmVkIGluIGEgQ3VzdG9tZXJVc2VyTWFwLCBleGNlcHQgcGFzc3dvcmQgZmllbGRzLCBhcmUgc2VhcmNoYWJsZQogICAgICAgIFVzZXJMb2dpbiAgICAgPT4gJ2V4YW1wbGUqJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBVc2VyRmlyc3RuYW1lID0+ICdGaXJzdG4qJywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCgogICAgICAgICMgc2VhcmNoIGZvciB2YWxpZCB1c2VycyBvbmx5IHBlciBkZWZhdWx0LAogICAgICAgICMgcGFzcyAwIGluIG9yZGVyIHRvIGFsc28gc2VhcmNoIGZvciBpbnZhbGlkIHVzZXJzCiAgICAgICAgVmFsaWQgICAgID0+IDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKSBkZWZhdWx0IDEKCiAgICAgICAgIyBzcGVjaWFsIHBhcmFtZXRlcnMKICAgICAgICBDdXN0b21lckNvbXBhbnlTZWFyY2hDdXN0b21lcklEcyA9PiBbICdleGFtcGxlLmNvbScgXSwgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgRXhjbHVkZVVzZXJMb2dpbnMgICAgICAgICAgICAgICAgPT4gWyAnZXhhbXBsZScsICdkb2Vqb2huJyBdLCAgICMgKG9wdGlvbmFsKQoKICAgICAgICAjIGFycmF5IHBhcmFtZXRlcnMgYXJlIHVzZWQgd2l0aCBsb2dpY2FsIE9SIG9wZXJhdG9yIChhbGwgdmFsdWVzIGFyZSBwb3NzaWJsZSB3aGljaAogICAgICAgICMgYXJlIGRlZmluZWQgaW4gdGhlIGNvbmZpZyBzZWxlY3Rpb24gaGFzaCBmb3IgdGhlIGZpZWxkKQogICAgICAgIFVzZXJDb3VudHJ5ICAgICAgICAgICAgICA9PiBbICdBdXN0cmlhJywgJ0dlcm1hbnknLCBdLCAgICAgICAgICAjIChvcHRpb25hbCkKCiAgICAgICAgIyBEeW5hbWljRmllbGRzCiAgICAgICAgIyAgIEF0IGxlYXN0IG9uZSBvcGVyYXRvciBtdXN0IGJlIHNwZWNpZmllZC4gT3BlcmF0b3JzIHdpbGwgYmUgY29ubmVjdGVkIHdpdGggQU5ELAogICAgICAgICMgICAgICAgdmFsdWVzIGluIGFuIG9wZXJhdG9yIHdpdGggT1IuCiAgICAgICAgIyAgIFlvdSBjYW4gYWxzbyBwYXNzIG1vcmUgdGhhbiBvbmUgYXJndW1lbnQgdG8gYW4gb3BlcmF0b3I6IFsndmFsdWUxJywgJ3ZhbHVlMiddCiAgICAgICAgRHluYW1pY0ZpZWxkX0ZpZWxkTmFtZVggPT4gewogICAgICAgICAgICBFcXVhbHMgICAgICAgICAgICA9PiAxMjMsCiAgICAgICAgICAgIExpa2UgICAgICAgICAgICAgID0+ICd2YWx1ZSonLCAgICAgICAgICAgICAgICAjICJlcXVhbHMiIG9wZXJhdG9yIHdpdGggd2lsZGNhcmQgc3VwcG9ydAogICAgICAgICAgICBHcmVhdGVyVGhhbiAgICAgICA9PiAnMjAwMS0wMS0wMSAwMTowMTowMScsCiAgICAgICAgICAgIEdyZWF0ZXJUaGFuRXF1YWxzID0+ICcyMDAxLTAxLTAxIDAxOjAxOjAxJywKICAgICAgICAgICAgU21hbGxlclRoYW4gICAgICAgPT4gJzIwMDItMDItMDIgMDI6MDI6MDInLAogICAgICAgICAgICBTbWFsbGVyVGhhbkVxdWFscyA9PiAnMjAwMi0wMi0wMiAwMjowMjowMicsCiAgICAgICAgfQoKICAgICAgICBPcmRlckJ5ID0+IFsgJ1VzZXJMb2dpbicsICdVc2VyQ3VzdG9tZXJJRCcgXSwgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgIyBpZ25vcmVkIGlmIHRoZSByZXN1bHQgdHlwZSBpcyAnQ09VTlQnCiAgICAgICAgIyBkZWZhdWx0OiBbICdVc2VyTG9naW4nIF0KICAgICAgICAjIChhbGwgZmllbGRzIHdoaWNoIGFyZSBkZWZpbmVkIGluIGEgQ3VzdG9tZXJVc2VyTWFwIGNhbiBiZSB1c2VkIGZvciBvcmRlcmluZykKCiAgICAgICAgIyBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciBPcmRlckJ5OgogICAgICAgICMgVGhlIE9yZGVyQnlEaXJlY3Rpb24gY2FuIGJlIHNwZWNpZmllZCBmb3IgZWFjaCBPcmRlckJ5IGF0dHJpYnV0ZS4KICAgICAgICAjIFRoZSBwYWlyaW5nIGlzIG1hZGUgYnkgdGhlIGFycmF5IGluZGljZXMuCgogICAgICAgIE9yZGVyQnlEaXJlY3Rpb24gPT4gWyAnRG93bicsICdVcCcgXSwgICAgICAgICAgICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgICMgaWdub3JlZCBpZiB0aGUgcmVzdWx0IHR5cGUgaXMgJ0NPVU5UJwogICAgICAgICMgKERvd24gfCBVcCkgRGVmYXVsdDogWyAnRG93bicgXQoKICAgICAgICBSZXN1bHQgPT4gJ0FSUkFZJyB8fCAnQ09VTlQnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIChvcHRpb25hbCkKICAgICAgICAjIGRlZmF1bHQ6IEFSUkFZLCByZXR1cm5zIGFuIGFycmF5IG9mIGNoYW5nZSBpZHMKICAgICAgICAjIENPVU5UIHJldHVybnMgYSBzY2FsYXIgd2l0aCB0aGUgbnVtYmVyIG9mIGZvdW5kIGNoYW5nZXMKCiAgICAgICAgTGltaXQgPT4gMTAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgIyBpZ25vcmVkIGlmIHRoZSByZXN1bHQgdHlwZSBpcyAnQ09VTlQnCiAgICApOwoKUmV0dXJucyBhIGxpc3Qgb2YgY3VzdG9tZXIgdXNlcnMgd2hlbiAkUmVzdWx0ID0+ICdBUlJBWScgd2FzIHBhc3NlZDoKCiAgICAkQ3VzdG9tZXJVc2VySURzID0gWyAnYWRhbGRyaWRhJywgJ2FkYW1hbnRhJywgJ2FkYWxncmltICcgXTsKICAgICRDdXN0b21lclVzZXJJRHMgPSBbXTsgIyB3aGVuIG5vIGN1c3RvbWVyIHVzZXJzIGhhZCBiZWVuIGZvdW5kCgpSZXR1cm5zIGEgY291bnQgb2YgY3VzdG9tZXIgdXNlcnMgd2hlbiAkUmVzdWx0ID0+ICdDT1VOVCcgd2FzIHBhc3NlZDoKCiAgICAkQ3VzdG9tZXJVc2VySURzID0gMzsKICAgICRDdXN0b21lclVzZXJJRHMgPSAwOyAjIHdoZW4gbm8gY3VzdG9tZXIgdXNlcnMgaGFkIGJlZW4gZm91bmQKCj1jdXQKCnN1YiBDdXN0b21lclNlYXJjaERldGFpbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgZ2V0IGFsbCBnZW5lcmFsIHNlYXJjaCBmaWVsZHMgKHdpdGhvdXQgYSByZXN0cmljdGlvbiB0byBhIHNvdXJjZSkKICAgIG15IEBBbGxTZWFyY2hGaWVsZHMgPSAkU2VsZi0+Q3VzdG9tZXJVc2VyU2VhcmNoRmllbGRzKCk7CgogICAgIyBnZW5lcmF0ZSBhIGhhc2ggd2l0aCB0aGUgY3VzdG9tZXIgdXNlciBzb3VyY2VzIHdoaWNoIG11c3QgYmUgc2VhcmNoZWQKICAgIG15ICVTZWFyY2hDdXN0b21lclVzZXJTb3VyY2VzOwoKICAgIFNPVVJDRToKICAgIGZvciBteSAkQ291bnQgKCAnJywgMSAuLiAxMCApIHsKICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In07CgogICAgICAgICMgZ2V0IHRoZSBzZWFyY2ggZmllbGRzIGZvciB0aGUgY3VycmVudCBzb3VyY2UKICAgICAgICBteSBAU291cmNlU2VhcmNoRmllbGRzID0gJFNlbGYtPkN1c3RvbWVyVXNlclNlYXJjaEZpZWxkcygKICAgICAgICAgICAgU291cmNlID0+ICJDdXN0b21lclVzZXIkQ291bnQiLAogICAgICAgICk7CiAgICAgICAgbXkgJUxvb2t1cFNvdXJjZVNlYXJjaEZpZWxkcyA9IG1hcCB7ICRfLT57TmFtZX0gPT4gMSB9IEBTb3VyY2VTZWFyY2hGaWVsZHM7CgogICAgICAgICMgY2hlY2sgaWYgYWxsIHNlYXJjaCBwYXJhbSBleGlzdHMgaW4gdGhlIHNlYXJjaCBmaWVsZHMgZnJvbSB0aGUgY3VycmVudCBzb3VyY2UKICAgICAgICBTRUFSQ0hGSUVMRDoKICAgICAgICBmb3IgbXkgJFNlYXJjaEZpZWxkIChAQWxsU2VhcmNoRmllbGRzKSB7CgogICAgICAgICAgICBuZXh0IFNFQVJDSEZJRUxEIGlmICEkUGFyYW17ICRTZWFyY2hGaWVsZC0+e05hbWV9IH07CgogICAgICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJExvb2t1cFNvdXJjZVNlYXJjaEZpZWxkc3sgJFNlYXJjaEZpZWxkLT57TmFtZX0gfTsKICAgICAgICB9CiAgICAgICAgJFNlYXJjaEN1c3RvbWVyVXNlclNvdXJjZXN7IkN1c3RvbWVyVXNlciRDb3VudCJ9ID0gXEBTb3VyY2VTZWFyY2hGaWVsZHM7CiAgICB9CgogICAgIyBzZXQgdGhlIGRlZmF1bHQgYmVoYXZpb3VyIGZvciB0aGUgcmV0dXJuIHR5cGUKICAgICRQYXJhbXtSZXN1bHR9IHx8PSAnQVJSQVknOwoKICAgIGlmICggJFBhcmFte1Jlc3VsdH0gZXEgJ0NPVU5UJyApIHsKCiAgICAgICAgbXkgJElEc0NvdW50ID0gMDsKCiAgICAgICAgU09VUkNFOgogICAgICAgIGZvciBteSAkU291cmNlICggc29ydCBrZXlzICVTZWFyY2hDdXN0b21lclVzZXJTb3VyY2VzICkgewogICAgICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJFNlbGYtPnskU291cmNlfTsKCiAgICAgICAgICAgIG15ICRTdWJJRHNDb3VudCA9ICRTZWxmLT57JFNvdXJjZX0tPkN1c3RvbWVyU2VhcmNoRGV0YWlsKAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgU2VhcmNoRmllbGRzID0+ICRTZWFyY2hDdXN0b21lclVzZXJTb3VyY2VzeyRTb3VyY2V9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuIGlmICFkZWZpbmVkICRTdWJJRHNDb3VudDsKCiAgICAgICAgICAgICRJRHNDb3VudCArPSAkU3ViSURzQ291bnQgfHwgMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRJRHNDb3VudDsKICAgIH0KICAgIGVsc2UgewoKICAgICAgICBteSBASURzOwoKICAgICAgICBteSAkUmVzdWx0Q291bnQgPSAwOwoKICAgICAgICBTT1VSQ0U6CiAgICAgICAgZm9yIG15ICRTb3VyY2UgKCBzb3J0IGtleXMgJVNlYXJjaEN1c3RvbWVyVXNlclNvdXJjZXMgKSB7CiAgICAgICAgICAgIG5leHQgU09VUkNFIGlmICEkU2VsZi0+eyRTb3VyY2V9OwoKICAgICAgICAgICAgbXkgJFN1YklEcyA9ICRTZWxmLT57JFNvdXJjZX0tPkN1c3RvbWVyU2VhcmNoRGV0YWlsKAogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgU2VhcmNoRmllbGRzID0+ICRTZWFyY2hDdXN0b21lclVzZXJTb3VyY2VzeyRTb3VyY2V9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgcmV0dXJuIGlmICFkZWZpbmVkICRTdWJJRHM7CgogICAgICAgICAgICBuZXh0IFNPVVJDRSBpZiAhSXNBcnJheVJlZldpdGhEYXRhKCRTdWJJRHMpOwoKICAgICAgICAgICAgcHVzaCBASURzLCBAeyRTdWJJRHN9OwoKICAgICAgICAgICAgJFJlc3VsdENvdW50Kys7CiAgICAgICAgfQoKICAgICAgICAjIGlmIHdlIGhhdmUgbW9yZSB0aGVuIG9uZSBzZWFyY2ggcmVzdWx0cyBmcm9tIGRpZmZyZW50IHNvdXJjZXMsIHdlIG5lZWQgYSByZXNvcnRpbmcKICAgICAgICAjIGJlY2F1c2Ugb2YgdGhlIG1lcmdlZCBzaW5nbGUgcmVzdWx0cwogICAgICAgIGlmICggJFJlc3VsdENvdW50ID4gMSApIHsKCiAgICAgICAgICAgIG15IEBVc2VyRGF0YUxpc3Q7CgogICAgICAgICAgICBmb3IgbXkgJElEIChASURzKSB7CgogICAgICAgICAgICAgICAgbXkgJVVzZXJEYXRhID0gJFNlbGYtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgICAgICAgICAgICAgVXNlciA9PiAkSUQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgcHVzaCBAVXNlckRhdGFMaXN0LCBcJVVzZXJEYXRhOwogICAgICAgICAgICB9CgogICAgICAgICAgICBteSAkT3JkZXJCeSA9ICdVc2VyTG9naW4nOwogICAgICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggJFBhcmFte09yZGVyQnl9ICkgKSB7CiAgICAgICAgICAgICAgICAkT3JkZXJCeSA9ICRQYXJhbXtPcmRlckJ5fS0+WzBdOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggJFBhcmFte09yZGVyQnlEaXJlY3Rpb259ICkgJiYgJFBhcmFte09yZGVyQnlEaXJlY3Rpb259LT5bMF0gZXEgJ1VwJyApIHsKICAgICAgICAgICAgICAgIEBVc2VyRGF0YUxpc3QgPSBzb3J0IHsgbGMoICRhLT57JE9yZGVyQnl9ICkgY21wIGxjKCAkYi0+eyRPcmRlckJ5fSApIH0gQFVzZXJEYXRhTGlzdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIEBVc2VyRGF0YUxpc3QgPSBzb3J0IHsgbGMoICRiLT57JE9yZGVyQnl9ICkgY21wIGxjKCAkYS0+eyRPcmRlckJ5fSApIH0gQFVzZXJEYXRhTGlzdDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCAkUGFyYW17TGltaXR9ICYmIHNjYWxhciBAVXNlckRhdGFMaXN0ID4gJFBhcmFte0xpbWl0fSApIHsKICAgICAgICAgICAgICAgIHNwbGljZSBAVXNlckRhdGFMaXN0LCAkUGFyYW17TGltaXR9OwogICAgICAgICAgICB9CgogICAgICAgICAgICBASURzID0gbWFwIHsgJF8tPntVc2VyTG9naW59IH0gQFVzZXJEYXRhTGlzdDsKICAgICAgICB9CgojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgICAgICMgQ2hlY2sgcGVybWlzc2lvbiBmb3IgZXZlcnkgc2luZ2xlIGN1c3RvbWVyIHVzZXIuCiAgICAgICAgaWYgKCAkU2VsZi0+e011bHRpdGVuYW5jeX0gKSB7CiAgICAgICAgICAgIG15IEBOZXdJRFMgPSBASURzOwogICAgICAgICAgICBASURzID0gKCk7CgogICAgICAgICAgICBmb3IgbXkgJElEIChATmV3SURTKSB7CiAgICAgICAgICAgICAgICBteSAlVXNlckRhdGEgPSAkU2VsZi0+Q3VzdG9tZXJVc2VyRGF0YUdldCgKICAgICAgICAgICAgICAgICAgICBVc2VyID0+ICRJRCwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgaWYgKCVVc2VyRGF0YSkgewogICAgICAgICAgICAgICAgICAgIHB1c2ggQElEcywgJElEOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CgogICAgICAgIHJldHVybiBcQElEczsKICAgIH0KfQoKPWhlYWQyIEN1c3RvbWVyVXNlclNlYXJjaEZpZWxkcygpCgpHZXQgYSBsaXN0IG9mIHRoZSBkZWZpbmVkIHNlYXJjaCBmaWVsZHMgKG9wdGlvbmFsIG9ubHkgdGhlIHJlbGV2YW50IGZpZWxkcyBmb3IgdGhlIGdpdmVuIHNvdXJjZSkuCgogICAgbXkgQFNlYWNoRmllbGRzID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyU2VhcmNoRmllbGRzKAogICAgICAgIFNvdXJjZSA9PiAnQ3VzdG9tZXJVc2VyJywgIyBvcHRpb25hbCwgYnV0IGltcG9ydGFudCBpbiB0aGUgQ3VzdG9tZXJTZWFyY2hEZXRhaWwgdG8gZ2V0IHRoZSByaWdodCBkYXRhYmFzZSBmaWVsZHMKICAgICk7CgpSZXR1cm5zIGFuIGFycmF5IG9mIGhhc2ggcmVmZXJlbmNlcy4KCiAgICBAU2VhY2hGaWVsZHMgPSAoCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgID0+ICdVc2VyRW1haWwnLAogICAgICAgICAgICBMYWJlbCAgICAgICAgID0+ICdFbWFpbCcsCiAgICAgICAgICAgIFR5cGUgICAgICAgICAgPT4gJ0lucHV0JywKICAgICAgICAgICAgRGF0YWJhc2VGaWVsZCA9PiAnbWFpbCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgID0+ICdVc2VyQ291bnRyeScsCiAgICAgICAgICAgIExhYmVsICAgICAgICAgID0+ICdDb3VudHJ5JywKICAgICAgICAgICAgVHlwZSAgICAgICAgICAgPT4gJ1NlbGVjdGlvbicsCiAgICAgICAgICAgIFNlbGVjdGlvbnNEYXRhID0+IHsKICAgICAgICAgICAgICAgICdHZXJtYW55JyAgICAgICAgPT4gJ0dlcm1hbnknLAogICAgICAgICAgICAgICAgJ1VuaXRlZCBLaW5nZG9tJyA9PiAnVW5pdGVkIEtpbmdkb20nLAogICAgICAgICAgICAgICAgJ1VuaXRlZCBTdGF0ZXMnICA9PiAnVW5pdGVkIFN0YXRlcycsCiAgICAgICAgICAgICAgICAuLi4KICAgICAgICAgICAgfSwKICAgICAgICAgICAgRGF0YWJhc2VGaWVsZCA9PiAnY291bnRyeScsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgPT4gJ0R5bmFtaWNGaWVsZF9Ta3lwZUFjY291bnROYW1lJywKICAgICAgICAgICAgTGFiZWwgICAgICAgICA9PiAnJywKICAgICAgICAgICAgVHlwZSAgICAgICAgICA9PiAnRHluYW1pY0ZpZWxkJywKICAgICAgICAgICAgRGF0YWJhc2VGaWVsZCA9PiAnU2t5cGVBY2NvdW50TmFtZScsCiAgICAgICAgfSwKICAgICk7Cgo9Y3V0CgpzdWIgQ3VzdG9tZXJVc2VyU2VhcmNoRmllbGRzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBHZXQgdGhlIHNlYXJjaCBmaWVsZHMgZnJvbSBhbGwgY3VzdG9tZXIgdXNlciBtYXBzIChtZXJnZSBmcm9tIGFsbCBtYXBzIHRvZ2V0aGVyKS4KICAgIG15IEBTZWFyY2hGaWVsZHM7CgogICAgbXkgJVNlYXJjaEZpZWxkc0V4aXN0czsKCiAgICBTT1VSQ0U6CiAgICBmb3IgbXkgJENvdW50ICggJycsIDEgLi4gMTAgKSB7CiAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9OwogICAgICAgIG5leHQgU09VUkNFIGlmICRQYXJhbXtTb3VyY2V9ICYmICRQYXJhbXtTb3VyY2V9IG5lICJDdXN0b21lclVzZXIkQ291bnQiOwoKICAgICAgICBFTlRSWToKICAgICAgICBmb3IgbXkgJEVudHJ5ICggQHsgJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In0tPntDdXN0b21lclVzZXJNYXB9LT57TWFwfSB9ICkgewoKICAgICAgICAgICAgbXkgJFNlYXJjaEZpZWxkTmFtZSA9ICRFbnRyeS0+WzBdOwoKICAgICAgICAgICAgbmV4dCBFTlRSWSBpZiAkU2VhcmNoRmllbGRzRXhpc3RzeyRTZWFyY2hGaWVsZE5hbWV9OwogICAgICAgICAgICBuZXh0IEVOVFJZIGlmICRTZWFyY2hGaWVsZE5hbWUgPX4gbXsoUGFzc3dvcmR8UHcpXGQqJH1zbXhpOwoKICAgICAgICAgICAgIyBSZW1lbWJlciB0aGUgYWxyZWFkeSBjb2xsZWN0ZWQgc2VhcmNoIGZpZWxkIG5hbWUuCiAgICAgICAgICAgICRTZWFyY2hGaWVsZHNFeGlzdHN7JFNlYXJjaEZpZWxkTmFtZX0gPSAxOwoKICAgICAgICAgICAgbXkgJUZpZWxkQ29uZmlnID0gJFNlbGYtPkdldEZpZWxkQ29uZmlnKAogICAgICAgICAgICAgICAgRmllbGROYW1lID0+ICRTZWFyY2hGaWVsZE5hbWUsCiAgICAgICAgICAgICAgICBTb3VyY2UgICAgPT4gJFBhcmFte1NvdXJjZX0sICAgICAjIHRvIGdldCB0aGUgcmlnaHQgZGF0YWJhc2UgZmllbGQgZm9yIHRoZSBnaXZlbiBzb3VyY2UKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG5leHQgRU5UUlkgaWYgISVGaWVsZENvbmZpZzsKCiAgICAgICAgICAgIG15ICVTZWFyY2hGaWVsZERhdGEgPSAoCiAgICAgICAgICAgICAgICAlRmllbGRDb25maWcsCiAgICAgICAgICAgICAgICBOYW1lID0+ICRTZWFyY2hGaWVsZE5hbWUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBteSAlU2VsZWN0aW9uc0RhdGEgPSAkU2VsZi0+R2V0RmllbGRTZWxlY3Rpb25zKAogICAgICAgICAgICAgICAgRmllbGROYW1lID0+ICRTZWFyY2hGaWVsZE5hbWUsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRTZWFyY2hGaWVsZERhdGF7U3RvcmFnZVR5cGV9IGVxICdkeW5hbWljX2ZpZWxkJyApIHsKICAgICAgICAgICAgICAgICRTZWFyY2hGaWVsZERhdGF7VHlwZX0gPSAnRHluYW1pY0ZpZWxkJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoJVNlbGVjdGlvbnNEYXRhKSB7CiAgICAgICAgICAgICAgICAkU2VhcmNoRmllbGREYXRhe1R5cGV9ICAgICAgICAgICA9ICdTZWxlY3Rpb24nOwogICAgICAgICAgICAgICAgJFNlYXJjaEZpZWxkRGF0YXtTZWxlY3Rpb25zRGF0YX0gPSBcJVNlbGVjdGlvbnNEYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgJFNlYXJjaEZpZWxkRGF0YXtUeXBlfSA9ICdJbnB1dCc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHB1c2ggQFNlYXJjaEZpZWxkcywgXCVTZWFyY2hGaWVsZERhdGE7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBAU2VhcmNoRmllbGRzOwp9Cgo9aGVhZDIgR2V0RmllbGRDb25maWcoKQoKVGhpcyBmdW5jdGlvbiBjb2xsZWN0IHNvbWUgZmllbGQgY29uZmlnIGluZm9ybWF0aW9uIGZyb20gdGhlIGN1c3RvbWVyIHVzZXIgbWFwLgoKICAgIG15ICVGaWVsZENvbmZpZyA9ICRDdXN0b21lclVzZXJPYmplY3QtPkdldEZpZWxkQ29uZmlnKAogICAgICAgIEZpZWxkTmFtZSA9PiAnVXNlckVtYWlsJywKICAgICAgICBTb3VyY2UgICAgPT4gJ0N1c3RvbWVyVXNlcicsICMgb3B0aW9uYWwKICAgICk7CgpSZXR1cm5zIHNvbWUgZmllbGQgY29uZmlnIGluZm9ybWF0aW9uOgoKICAgIG15ICVGaWVsZENvbmZpZyA9ICgKICAgICAgICBMYWJlbCAgICAgICAgID0+ICdFbWFpbCcsCiAgICAgICAgRGF0YWJhc2VGaWVsZCA9PiAnZW1haWwnLAogICAgICAgIFN0b3JhZ2VUeXBlICAgPT4gJ3ZhcicsCiAgICApOwoKPWN1dAoKc3ViIEdldEZpZWxkQ29uZmlnIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAhJFBhcmFte0ZpZWxkTmFtZX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIEZpZWxkTmFtZSEiCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgU09VUkNFOgogICAgZm9yIG15ICRDb3VudCAoICcnLCAxIC4uIDEwICkgewogICAgICAgIG5leHQgU09VUkNFIGlmICEkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifTsKICAgICAgICBuZXh0IFNPVVJDRSBpZiAkUGFyYW17U291cmNlfSAmJiAkUGFyYW17U291cmNlfSBuZSAiQ3VzdG9tZXJVc2VyJENvdW50IjsKCiAgICAgICAgIyBTZWFyY2ggdGhlIHJpZ2h0IGZpZWxkIGFuZCByZXR1cm4gc29tZSBjb25maWcgaW5mb3JtYXRpb24gZnJvbSB0aGUgZmllbGQuCiAgICAgICAgRU5UUlk6CiAgICAgICAgZm9yIG15ICRFbnRyeSAoIEB7ICRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9LT57Q3VzdG9tZXJVc2VyTWFwfS0+e01hcH0gfSApIHsKICAgICAgICAgICAgbmV4dCBFTlRSWSBpZiAkUGFyYW17RmllbGROYW1lfSBuZSAkRW50cnktPlswXTsKCiAgICAgICAgICAgIG15ICVGaWVsZENvbmZpZyA9ICgKICAgICAgICAgICAgICAgIExhYmVsICAgICAgICAgPT4gJEVudHJ5LT5bMV0sCiAgICAgICAgICAgICAgICBEYXRhYmFzZUZpZWxkID0+ICRFbnRyeS0+WzJdLAogICAgICAgICAgICAgICAgU3RvcmFnZVR5cGUgICA9PiAkRW50cnktPls1XSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybiAlRmllbGRDb25maWc7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybjsKfQoKPWhlYWQyIEdldEZpZWxkU2VsZWN0aW9ucygpCgpUaGlzIGZ1bmN0aW9uIGNvbGxlY3QgdGhlIHNlbGVjdGlvbnMgZm9yIHRoZSBnaXZlbiBmaWVsZCBuYW1lLCBpZiB0aGUgZmllbGQgaGFzIHNvbWUgc2VsZWN0aW9ucy4KCiAgICBteSAlU2VsZWN0aW9uc0RhdGEgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5HZXRGaWVsZFNlbGVjdGlvbnMoCiAgICAgICAgRmllbGROYW1lID0+ICdVc2VyVGl0bGUnLAogICAgKTsKClJldHVybnMgdGhlIHNlbGVjdGlvbnMgZm9yIHRoZSBnaXZlbiBmaWVsZCBuYW1lIChtZXJnZWQgZnJvbSBhbGwgc291cmNlcykgb3IgYSBlbXB0eSBoYXNoOgoKICAgIG15ICVTZWxlY3Rpb25EYXRhID0gKAogICAgICAgICdNci4nICA9PiAnTXIuJywKICAgICAgICAnTXJzLicgPT4gJ01ycy4nLAogICAgKTsKCj1jdXQKCnN1YiBHZXRGaWVsZFNlbGVjdGlvbnMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0ZpZWxkTmFtZX0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIEZpZWxkTmFtZSEiCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJVNlbGVjdGlvbnNEYXRhOwoKICAgIFNPVVJDRToKICAgIGZvciBteSAkQ291bnQgKCAnJywgMSAuLiAxMCApIHsKICAgICAgICBuZXh0IFNPVVJDRSBpZiAhJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In07CiAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9LT57Q3VzdG9tZXJVc2VyTWFwfS0+e1NlbGVjdGlvbnN9LT57ICRQYXJhbXtGaWVsZE5hbWV9IH07CgogICAgICAgICVTZWxlY3Rpb25zRGF0YSA9ICgKICAgICAgICAgICAgJVNlbGVjdGlvbnNEYXRhLCAleyAkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifS0+e0N1c3RvbWVyVXNlck1hcH0tPntTZWxlY3Rpb25zfS0+eyAkUGFyYW17RmllbGROYW1lfSB9IH0KICAgICAgICApOwogICAgfQoKICAgICMgTWFrZSBzdXJlIHRoZSBlbmNvZGluZyBzdGFtcCBpcyBzZXQuCiAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAlU2VsZWN0aW9uc0RhdGEgKSB7CiAgICAgICAgJFNlbGVjdGlvbnNEYXRheyRLZXl9ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkVuY29kZScpLT5FbmNvZGVJbnB1dCggJFNlbGVjdGlvbnNEYXRheyRLZXl9ICk7CiAgICB9CgogICAgIyBEZWZhdWx0IGhhbmRsaW5nIGZvciBmaWVsZCAnVmFsaWRJRCcuCiAgICBpZiAoICElU2VsZWN0aW9uc0RhdGEgJiYgJFBhcmFte0ZpZWxkTmFtZX0gPX4gL15WYWxpZElEL2kgKSB7CiAgICAgICAgJVNlbGVjdGlvbnNEYXRhID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OlZhbGlkJyktPlZhbGlkTGlzdCgpOwogICAgfQoKICAgIHJldHVybiAlU2VsZWN0aW9uc0RhdGE7Cn0KCj1oZWFkMiBDdXN0b21lcklETGlzdCgpCgpyZXR1cm4gYSBsaXN0IG9mIHdpdGggYWxsIGtub3duIHVuaXF1ZSBDdXN0b21lcklEcyBvZiB0aGUgcmVnaXN0ZXJlZCBjdXN0b21lcnMgdXNlcnMgKG5vIFNlYXJjaFRlcm0pLApvciBhIGZpbHRlcmVkIGxpc3Qgd2hlcmUgdGhlIEN1c3RvbWVySURzIG11c3QgY29udGFpbiBhIHNlYXJjaCB0ZXJtLgoKICAgIG15IEBDdXN0b21lcklEcyA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVySURMaXN0KAogICAgICAgIFNlYXJjaFRlcm0gID0+ICdzb21lY3VzdG9tZXInLCAgICAjIG9wdGlvbmFsCiAgICAgICAgVmFsaWQgICAgICAgPT4gMSwgICAgICAgICAgICAgICAgICMgb3B0aW9uYWwKICAgICk7Cgo9Y3V0CgpzdWIgQ3VzdG9tZXJJRExpc3QgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSBARGF0YTsKICAgIFNPVVJDRToKICAgIGZvciBteSAkQ291bnQgKCAnJywgMSAuLiAxMCApIHsKCiAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9OwoKICAgICAgICAjIGdldCBjdXN0b21lciBsaXN0IHJlc3VsdCBvZiBiYWNrZW5kIGFuZCBtZXJnZSBpdAogICAgICAgIHB1c2ggQERhdGEsICRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9LT5DdXN0b21lcklETGlzdCglUGFyYW0pOwogICAgfQoKICAgICMgbWFrZSBlbnRyaWVzIHVuaXF1ZQogICAgbXkgJVRtcDsKICAgIEBUbXB7QERhdGF9ID0gdW5kZWY7CiAgICBARGF0YSA9IHNvcnQgeyBsYyAkYSBjbXAgbGMgJGIgfSBrZXlzICVUbXA7CgojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgIyBEb24ndCByZXR1cm4gY3VzdG9tZXIgSURzIGlmIHRoZSBhZ2VudCBkb2VzIG5vdCBoYXZlIHBlcm1pc3Npb24gdG8gdmlldy4KICAgIGlmICggJFNlbGYtPntNdWx0aXRlbmFuY3l9ICkgewogICAgICAgIG15IEBDbGVhbmVkQ3VzdG9tZXJJRHM7CgogICAgICAgIGZvciBteSAkQ3VzdG9tZXJJRCAoIEBEYXRhICkgewogICAgICAgICAgICBteSAlQ29tcGFueSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckNvbXBhbnknKS0+Q3VzdG9tZXJDb21wYW55R2V0KAogICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiAkQ3VzdG9tZXJJRCwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggJUNvbXBhbnkgJiYgJENvbXBhbnl7Q3VzdG9tZXJJRH0gKSB7CiAgICAgICAgICAgICAgICBwdXNoIEBDbGVhbmVkQ3VzdG9tZXJJRHMsICRDdXN0b21lcklEOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBARGF0YSA9IEBDbGVhbmVkQ3VzdG9tZXJJRHM7CiAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKCiAgICByZXR1cm4gQERhdGE7Cn0KCj1oZWFkMiBDdXN0b21lck5hbWUoKQoKZ2V0IGN1c3RvbWVyIHVzZXIgbmFtZQoKICAgIG15ICROYW1lID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJOYW1lKAogICAgICAgIFVzZXJMb2dpbiA9PiAnc29tZS1sb2dpbicsCiAgICApOwoKPWN1dAoKc3ViIEN1c3RvbWVyTmFtZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIFNPVVJDRToKICAgIGZvciBteSAkQ291bnQgKCAnJywgMSAuLiAxMCApIHsKCiAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9OwoKICAgICAgICAjIEdldCBjdXN0b21lciBuYW1lIGFuZCByZXR1cm4gaXQuCiAgICAgICAgbXkgJE5hbWUgPSAkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifS0+Q3VzdG9tZXJOYW1lKCVQYXJhbSk7CiAgICAgICAgaWYgKCROYW1lKSB7CiAgICAgICAgICAgIHJldHVybiAkTmFtZTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm47Cn0KCj1oZWFkMiBDdXN0b21lcklEcygpCgpnZXQgY3VzdG9tZXIgdXNlciBjdXN0b21lciBpZHMKCiAgICBteSBAQ3VzdG9tZXJJRHMgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lcklEcygKICAgICAgICBVc2VyID0+ICdzb21lLWxvZ2luJywKICAgICk7Cgo9Y3V0CgpzdWIgQ3VzdG9tZXJJRHMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJ9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VyIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBjdXN0b21lciBpZHMgKHN0b3AgYWZ0ZXIgZmlyc3Qgc291cmNlIHdpdGggcmVzdWx0cykKICAgIG15IEBDdXN0b21lcklEczsKICAgIFNPVVJDRToKICAgIGZvciBteSAkQ291bnQgKCAnJywgMSAuLiAxMCApIHsKCiAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9OwoKICAgICAgICAjIGdldCBjdXN0b21lciBpZHMgZnJvbSBzb3VyY2UKICAgICAgICBteSBAU291cmNlQ3VzdG9tZXJJRHMgPSAkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifS0+Q3VzdG9tZXJJRHMoJVBhcmFtKTsKICAgICAgICBuZXh0IFNPVVJDRSBpZiAhQFNvdXJjZUN1c3RvbWVySURzOwoKICAgICAgICBAQ3VzdG9tZXJJRHMgPSBAU291cmNlQ3VzdG9tZXJJRHM7CiAgICAgICAgbGFzdCBTT1VSQ0U7CiAgICB9CgogICAgIyBjcmVhdGUgaGFzaCB3aXRoIGV4aXN0aW5nIGN1c3RvbWVyIGlkcwogICAgbXkgJUN1c3RvbWVySURzID0gbWFwIHsgJF8gPT4gMSB9IEBDdXN0b21lcklEczsKCiAgICAjIGdldCByZWxhdGVkIGN1c3RvbWVyIGlkcwogICAgbXkgQFJlbGF0ZWRDdXN0b21lcklEcyA9ICRTZWxmLT5DdXN0b21lclVzZXJDdXN0b21lck1lbWJlckxpc3QoCiAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gJFBhcmFte1VzZXJ9LAogICAgKTsKCiAgICAjIGFkZCByZWxhdGVkIGN1c3RvbWVyIGlkcyBpZiBub3QgZm91bmQgaW4gc291cmNlCiAgICBSRUxBVEVEQ1VTVE9NRVJJRDoKICAgIGZvciBteSAkUmVsYXRlZEN1c3RvbWVySUQgKEBSZWxhdGVkQ3VzdG9tZXJJRHMpIHsKICAgICAgICBuZXh0IFJFTEFURURDVVNUT01FUklEIGlmICRDdXN0b21lcklEc3skUmVsYXRlZEN1c3RvbWVySUR9OwoKICAgICAgICBwdXNoIEBDdXN0b21lcklEcywgJFJlbGF0ZWRDdXN0b21lcklEOwogICAgfQoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICMgRG9uJ3QgcmV0dXJuIGN1c3RvbWVyIElEcyBpZiB0aGUgYWdlbnQgZG9lcyBub3QgaGF2ZSBwZXJtaXNzaW9uIHRvIHZpZXcuCiAgICBpZiAoICRTZWxmLT57TXVsdGl0ZW5hbmN5fSApIHsKICAgICAgICBteSBAQ2xlYW5lZEN1c3RvbWVySURzOwoKICAgICAgICBmb3IgbXkgJEN1c3RvbWVySUQgKCBAQ3VzdG9tZXJJRHMgKSB7CiAgICAgICAgICAgIG15ICVDb21wYW55ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQ29tcGFueScpLT5DdXN0b21lckNvbXBhbnlHZXQoCiAgICAgICAgICAgICAgICBDdXN0b21lcklEID0+ICRDdXN0b21lcklELAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCAlQ29tcGFueSAmJiAkQ29tcGFueXtDdXN0b21lcklEfSApIHsKICAgICAgICAgICAgICAgIHB1c2ggQENsZWFuZWRDdXN0b21lcklEcywgJEN1c3RvbWVySUQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIEBDdXN0b21lcklEcyA9IEBDbGVhbmVkQ3VzdG9tZXJJRHM7CiAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKCiAgICAjIHJldHVybiBjdXN0b21lciBpZHMKICAgIHJldHVybiBAQ3VzdG9tZXJJRHM7Cn0KCj1oZWFkMiBDdXN0b21lclVzZXJEYXRhR2V0KCkKCmdldCB1c2VyIGRhdGEgKFVzZXJMb2dpbiwgVXNlckZpcnN0bmFtZSwgVXNlckxhc3RuYW1lLCBVc2VyRW1haWwsIC4uLikKCiAgICBteSAlQ3VzdG9tZXJVc2VyRGF0YSA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckRhdGFHZXQoCiAgICAgICAgVXNlciA9PiAnZnJhbnonLAogICAgKTsKCldoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGJhY2tlbmRzIHRoZW4gb25seSB0aGUgZGF0YSBmcm9tIHRoZSBmaXJzdCBiYWNrZW5kIHdoZXJlIHRoZSBjdXN0b21lciB1c2VyIGlzIGZvdW5kLgpBbiBlbXB0eSBsaXN0IGlzIHJldHVybmVkIHdoZW4gdGhlIGN1c3RvbWVyIHVzZXIgd2FzJ3QgZm91bmQgaW4gYW55IGJhY2tlbmQuCgo9Y3V0CgpzdWIgQ3VzdG9tZXJVc2VyRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiB1bmxlc3MgJFBhcmFte1VzZXJ9OwoKICAgICMgZmV0Y2ggZHluYW1pYyBmaWVsZCBjb25maWd1cmF0aW9ucyBmb3IgQ3VzdG9tZXJVc2VyLgogICAgbXkgJER5bmFtaWNGaWVsZENvbmZpZ3MgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6RHluYW1pY0ZpZWxkJyktPkR5bmFtaWNGaWVsZExpc3RHZXQoCiAgICAgICAgT2JqZWN0VHlwZSA9PiAnQ3VzdG9tZXJVc2VyJywKICAgICAgICBWYWxpZCAgICAgID0+IDEsCiAgICApOwoKICAgIG15ICVEeW5hbWljRmllbGRMb29rdXAgPSBtYXAgeyAkXy0+e05hbWV9ID0+ICRfIH0gQHskRHluYW1pY0ZpZWxkQ29uZmlnc307CgogICAgIyBHZXQgbmVlZGVkIG9iamVjdHMuCiAgICBteSAkQ29uZmlnT2JqZWN0ICAgICAgICAgICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6Q29uZmlnJyk7CiAgICBteSAkQ3VzdG9tZXJDb21wYW55T2JqZWN0ICAgICA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDdXN0b21lckNvbXBhbnknKTsKICAgIG15ICREeW5hbWljRmllbGRCYWNrZW5kT2JqZWN0ID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkR5bmFtaWNGaWVsZDo6QmFja2VuZCcpOwoKICAgIFNPVVJDRToKICAgIGZvciBteSAkQ291bnQgKCAnJywgMSAuLiAxMCApIHsKCiAgICAgICAgbmV4dCBTT1VSQ0UgaWYgISRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9OwoKICAgICAgICBteSAlQ3VzdG9tZXIgPSAkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifS0+Q3VzdG9tZXJVc2VyRGF0YUdldCglUGFyYW0pOwogICAgICAgIG5leHQgU09VUkNFIGlmICElQ3VzdG9tZXI7CgogICAgICAgICMgZ2VuZXJhdGUgdGhlIGZ1bGwgbmFtZSBhbmQgc2F2ZSBpdCBpbiB0aGUgaGFzaAogICAgICAgIG15ICRVc2VyRnVsbG5hbWUgPSAkU2VsZi0+Q3VzdG9tZXJOYW1lKCVDdXN0b21lcik7CgogICAgICAgICMgc2F2ZSB0aGUgZ2VuZXJhdGVkIGZ1bGxuYW1lIGluIHRoZSBoYXNoLgogICAgICAgICRDdXN0b21lcntVc2VyRnVsbG5hbWV9ID0gJFVzZXJGdWxsbmFtZTsKCiAgICAgICAgIyBhZGQgcHJlZmVyZW5jZXMgZGVmYXVsdHMKICAgICAgICBteSAkQ29uZmlnID0gJENvbmZpZ09iamVjdC0+R2V0KCdDdXN0b21lclByZWZlcmVuY2VzR3JvdXBzJyk7CiAgICAgICAgaWYgKCRDb25maWcpIHsKICAgICAgICAgICAgS0VZOgogICAgICAgICAgICBmb3IgbXkgJEtleSAoIHNvcnQga2V5cyAleyRDb25maWd9ICkgewoKICAgICAgICAgICAgICAgIG5leHQgS0VZIGlmICFkZWZpbmVkICRDb25maWctPnskS2V5fS0+e0RhdGFTZWxlY3RlZH07CiAgICAgICAgICAgICAgICBuZXh0IEtFWSBpZiBkZWZpbmVkICRDdXN0b21lcnsgJENvbmZpZy0+eyRLZXl9LT57UHJlZktleX0gfTsKCiAgICAgICAgICAgICAgICAjIHNldCBkZWZhdWx0IGRhdGEKICAgICAgICAgICAgICAgICRDdXN0b21lcnsgJENvbmZpZy0+eyRLZXl9LT57UHJlZktleX0gfSA9ICRDb25maWctPnskS2V5fS0+e0RhdGFTZWxlY3RlZH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgY2hlY2sgaWYgY3VzdG9tZXIgY29tcGFueSBzdXBwb3J0IGlzIGVuYWJsZWQgYW5kIGdldCBjb21wYW55IGRhdGEKICAgICAgICBteSAlQ29tcGFueTsKICAgICAgICBpZiAoCiAgICAgICAgICAgICRDb25maWdPYmplY3QtPkdldCgiQ3VzdG9tZXJDb21wYW55IikKICAgICAgICAgICAgJiYgJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lclVzZXIkQ291bnQiKS0+e0N1c3RvbWVyQ29tcGFueVN1cHBvcnR9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICVDb21wYW55ID0gJEN1c3RvbWVyQ29tcGFueU9iamVjdC0+Q3VzdG9tZXJDb21wYW55R2V0KAogICAgICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiAkQ3VzdG9tZXJ7VXNlckN1c3RvbWVySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJENvbXBhbnl7Q3VzdG9tZXJDb21wYW55VmFsaWRJRH0gPSAkQ29tcGFueXtWYWxpZElEfTsKICAgICAgICB9CgogICAgICAgICMgZmV0Y2ggZHluYW1pYyBmaWVsZCB2YWx1ZXMKICAgICAgICBpZiAoIElzQXJyYXlSZWZXaXRoRGF0YSggJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In0tPntDdXN0b21lclVzZXJNYXB9LT57TWFwfSApICkgewogICAgICAgICAgICBDVVNUT01FUlVTRVJGSUVMRDoKICAgICAgICAgICAgZm9yIG15ICRDdXN0b21lclVzZXJGaWVsZCAoIEB7ICRTZWxmLT57IkN1c3RvbWVyVXNlciRDb3VudCJ9LT57Q3VzdG9tZXJVc2VyTWFwfS0+e01hcH0gfSApIHsKICAgICAgICAgICAgICAgIG5leHQgQ1VTVE9NRVJVU0VSRklFTEQgaWYgJEN1c3RvbWVyVXNlckZpZWxkLT5bNV0gbmUgJ2R5bmFtaWNfZmllbGQnOwogICAgICAgICAgICAgICAgbmV4dCBDVVNUT01FUlVTRVJGSUVMRCBpZiAhJER5bmFtaWNGaWVsZExvb2t1cHsgJEN1c3RvbWVyVXNlckZpZWxkLT5bMl0gfTsKCiAgICAgICAgICAgICAgICBteSAkVmFsdWUgPSAkRHluYW1pY0ZpZWxkQmFja2VuZE9iamVjdC0+VmFsdWVHZXQoCiAgICAgICAgICAgICAgICAgICAgRHluYW1pY0ZpZWxkQ29uZmlnID0+ICREeW5hbWljRmllbGRMb29rdXB7ICRDdXN0b21lclVzZXJGaWVsZC0+WzJdIH0sCiAgICAgICAgICAgICAgICAgICAgT2JqZWN0TmFtZSAgICAgICAgID0+ICRDdXN0b21lcntVc2VySUR9LAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJ7ICRDdXN0b21lclVzZXJGaWVsZC0+WzBdIH0gPSAkVmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgICAgICMgQ2hlY2sgcGVybWlzc2lvbi4KICAgICAgICBpZiAoICRDdXN0b21lcntVc2VyR3JvdXBJRH0gKSB7CiAgICAgICAgICAgIG15ICRVc2VyR3JvdXBJRFN5bmMgPSAkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifS0+e0N1c3RvbWVyVXNlck1hcH0tPntVc2VyR3JvdXBJRFN5bmN9OwoKICAgICAgICAgICAgIyBSZXBsYWNlIHRoZSByZW1vdGUgZ3JvdXAgd2l0aCB0aGUgYXNzb2NpYXRlZCBsb2NhbCBncm91cC4KICAgICAgICAgICAgaWYgKCAkVXNlckdyb3VwSURTeW5jLT57UmVtb3RlR3JvdXBUb0xvY2FsR3JvdXB9ICkgewogICAgICAgICAgICAgICAgZm9yIG15ICRSZW1vdGVHcm91cCAoIGtleXMgJXsgJFVzZXJHcm91cElEU3luYy0+e1JlbW90ZUdyb3VwVG9Mb2NhbEdyb3VwfSB9ICkgewogICAgICAgICAgICAgICAgICAgIGlmICggJEN1c3RvbWVye1VzZXJHcm91cElEfSBlcSAkUmVtb3RlR3JvdXAgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRDdXN0b21lcntVc2VyR3JvdXBJRH0gPSAkVXNlckdyb3VwSURTeW5jLT57UmVtb3RlR3JvdXBUb0xvY2FsR3JvdXB9eyRSZW1vdGVHcm91cH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjIENoZWNrIGlmIGdyb3VwIElEIG9yIGdyb3VwIG5hbWVzIHNob3VsZCBiZSBtYXRjaGVkLgogICAgICAgICAgICBpZiAoICRVc2VyR3JvdXBJRFN5bmMtPntVc2VHcm91cE5hbWVzfSApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lcntVc2VyR3JvdXBJRH0gPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6R3JvdXAnKS0+R3JvdXBMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgR3JvdXAgPT4gJEN1c3RvbWVye1VzZXJHcm91cElEfSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgQ2hlY2sgaWYgYW55IGxpbWl0cyBhcmUgc2V0LgogICAgICAgICAgICBpZiAoICRTZWxmLT57TXVsdGl0ZW5hbmN5fSAmJiAhZ3JlcCB7ICRfID1+IC9eJEN1c3RvbWVye1VzZXJHcm91cElEfSQvIH0gQHsgJFNlbGYtPntVc2VyR3JvdXBJRHN9IH0gKSB7CiAgICAgICAgICAgICAgICAjIFRoZSB1c2VyIGRvZXMgbm90IGhhdmUgYWNjZXNzIHRvIHRoaXMgaW5mb3JtYXRpb24uCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgIyBJZiB0aGVyZSBhcmUgbm8gZ3JvdXAgc2V0dGluZ3MsIGNoZWNrIGlmIHBlcm1pc3Npb24gb24gY3VzdG9tZXIgY29tcGFueSBpcyBwZXJtaXR0ZWQuCiAgICAgICAgZWxzaWYgKCAkU2VsZi0+e011bHRpdGVuYW5jeX0gJiYgISRDdXN0b21lcntVc2VyR3JvdXBJRH0gJiYgKCAhJUNvbXBhbnkgfHwgISRDb21wYW55e0N1c3RvbWVySUR9ICkgKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKCiAgICAgICAgIyByZXR1cm4gY3VzdG9tZXIgZGF0YQogICAgICAgIHJldHVybiAoCiAgICAgICAgICAgICVDb21wYW55LAogICAgICAgICAgICAlQ3VzdG9tZXIsCiAgICAgICAgICAgIFNvdXJjZSAgICAgICAgPT4gIkN1c3RvbWVyVXNlciRDb3VudCIsCiAgICAgICAgICAgIENvbmZpZyAgICAgICAgPT4gJENvbmZpZ09iamVjdC0+R2V0KCJDdXN0b21lclVzZXIkQ291bnQiKSwKICAgICAgICAgICAgQ29tcGFueUNvbmZpZyA9PiAkQ29uZmlnT2JqZWN0LT5HZXQoICRDb21wYW55e1NvdXJjZX0gLy8gJ0N1c3RvbWVyQ29tcGFueScgKSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybjsKfQoKPWhlYWQyIEN1c3RvbWVyVXNlckFkZCgpCgp0byBhZGQgbmV3IGN1c3RvbWVyIHVzZXJzCgogICAgbXkgJFVzZXJMb2dpbiA9ICRDdXN0b21lclVzZXJPYmplY3QtPkN1c3RvbWVyVXNlckFkZCgKICAgICAgICBTb3VyY2UgICAgICAgICA9PiAnQ3VzdG9tZXJVc2VyJywgIyBDdXN0b21lclVzZXIgc291cmNlIGNvbmZpZwogICAgICAgIFVzZXJGaXJzdG5hbWUgID0+ICdNYW5mcmVkJywKICAgICAgICBVc2VyTGFzdG5hbWUgICA9PiAnSHViZXInLAogICAgICAgIFVzZXJDdXN0b21lcklEID0+ICdBMTI0JywKICAgICAgICBVc2VyTG9naW4gICAgICA9PiAnbWh1YmVyJywKICAgICAgICBVc2VyUGFzc3dvcmQgICA9PiAnc29tZS1wYXNzJywgIyBub3QgcmVxdWlyZWQKICAgICAgICBVc2VyRW1haWwgICAgICA9PiAnbWFuZnJlZC5odWJlckBleGFtcGxlLmNvbScsCiAgICAgICAgVmFsaWRJRCAgICAgICAgPT4gMSwKICAgICAgICBVc2VySUQgICAgICAgICA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIEN1c3RvbWVyVXNlckFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgZGF0YSBzb3VyY2UKICAgIGlmICggISRQYXJhbXtTb3VyY2V9ICkgewogICAgICAgICRQYXJhbXtTb3VyY2V9ID0gJ0N1c3RvbWVyVXNlcic7CiAgICB9CgogICAgIyBjaGVjayBpZiB1c2VyIGV4aXN0cwogICAgaWYgKCAkUGFyYW17VXNlckxvZ2lufSApIHsKICAgICAgICBteSAlVXNlciA9ICRTZWxmLT5DdXN0b21lclVzZXJEYXRhR2V0KCBVc2VyID0+ICRQYXJhbXtVc2VyTG9naW59ICk7CiAgICAgICAgaWYgKCVVc2VyKSB7CiAgICAgICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6TGFuZ3VhZ2UnKS0+VHJhbnNsYXRlKCAnQ3VzdG9tZXIgdXNlciAiJXMiIGFscmVhZHkgZXhpc3RzLicsICRQYXJhbXtVc2VyTG9naW59ICksCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgojIFJvdGhlciBPU1MgLyBDdXN0b21lck11bHRpdGVuYW5jeQogICAgIyBDaGVjayBpZiB0aGUgdXNlciBoYXMgcGVybWlzc2lvbiB0byBhZGQgdGhlIFVzZXJHcm91cElELgogICAgaWYgKCAkU2VsZi0+e011bHRpdGVuYW5jeX0gKSB7CiAgICAgICAgZGVsZXRlICRQYXJhbXtVc2VyR3JvdXBJRH07CiAgICB9CgogICAgbXkgJFVzZXJHcm91cElEU3luYyA9ICRTZWxmLT57JFBhcmFte1NvdXJjZX19LT57Q3VzdG9tZXJVc2VyTWFwfS0+e1VzZXJHcm91cElEU3luY307CiAgICBpZiAoICRQYXJhbXtVc2VyR3JvdXBJRH0gKSB7CiAgICAgICAgIyBDaGVjayBpZiBncm91cCBJRCBvciBncm91cCBuYW1lcyBzaG91bGQgYmUgbWF0Y2hlZC4KICAgICAgICBpZiAoICRVc2VyR3JvdXBJRFN5bmMtPntVc2VHcm91cE5hbWVzfSApIHsKICAgICAgICAgICAgbXkgJEdyb3VwTmFtZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpHcm91cCcpLT5Hcm91cExvb2t1cCgKICAgICAgICAgICAgICAgIEdyb3VwSUQgPT4gJFBhcmFte1VzZXJHcm91cElEfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRQYXJhbXtVc2VyR3JvdXBJRH0gPSAkR3JvdXBOYW1lOwogICAgICAgIH0KCiAgICAgICAgIyBSZXBsYWNlIHRoZSBsb2NhbCBncm91cCB3aXRoIHRoZSBhc3NvY2lhdGVkIHJlbW90ZSBncm91cC4KICAgICAgICBmb3IgbXkgJFJlbW90ZUdyb3VwICgga2V5cyAleyAkVXNlckdyb3VwSURTeW5jLT57UmVtb3RlR3JvdXBUb0xvY2FsR3JvdXB9IH0gKSB7CiAgICAgICAgICAgIGlmICggJFBhcmFte1VzZXJHcm91cElEfSBlcSAkVXNlckdyb3VwSURTeW5jLT57UmVtb3RlR3JvdXBUb0xvY2FsR3JvdXB9eyRSZW1vdGVHcm91cH0gKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17VXNlckdyb3VwSUR9ID0gJFJlbW90ZUdyb3VwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQojIEVPIEN1c3RvbWVyTXVsdGl0ZW5hbmN5CgogICAgIyBzdG9yZSBjdXN0b21lciB1c2VyIGRhdGEKICAgIG15ICRSZXN1bHQgPSAkU2VsZi0+eyAkUGFyYW17U291cmNlfSB9LT5DdXN0b21lclVzZXJBZGQoJVBhcmFtKTsKICAgIHJldHVybiBpZiAhJFJlc3VsdDsKCiAgICAjIHRyaWdnZXIgZXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0N1c3RvbWVyVXNlckFkZCcsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICBVc2VyTG9naW4gPT4gJFBhcmFte1VzZXJMb2dpbn0sCiAgICAgICAgICAgIE5ld0RhdGEgICA9PiBcJVBhcmFtLAogICAgICAgIH0sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJFJlc3VsdDsKCn0KCj1oZWFkMiBDdXN0b21lclVzZXJVcGRhdGUoKQoKdG8gdXBkYXRlIGN1c3RvbWVyIHVzZXJzCgogICAgJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyVXBkYXRlKAogICAgICAgIFNvdXJjZSAgICAgICAgPT4gJ0N1c3RvbWVyVXNlcicsICMgQ3VzdG9tZXJVc2VyIHNvdXJjZSBjb25maWcKICAgICAgICBJRCAgICAgICAgICAgID0+ICdtaCcgICAgICAgICAgICAjIGN1cnJlbnQgdXNlciBsb2dpbgogICAgICAgIFVzZXJMb2dpbiAgICAgPT4gJ21odWJlcicsICAgICAgICMgbmV3IHVzZXIgbG9naW4KICAgICAgICBVc2VyRmlyc3RuYW1lID0+ICdIdWJlcicsCiAgICAgICAgVXNlckxhc3RuYW1lICA9PiAnTWFuZnJlZCcsCiAgICAgICAgVXNlclBhc3N3b3JkICA9PiAnc29tZS1wYXNzJywgICAgIyBub3QgcmVxdWlyZWQKICAgICAgICBVc2VyRW1haWwgICAgID0+ICdlbWFpbEBleGFtcGxlLmNvbScsCiAgICAgICAgVmFsaWRJRCAgICAgICA9PiAxLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBDdXN0b21lclVzZXJVcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJMb2dpbn0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIFVzZXJMb2dpbiEiCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBmb3IgVXNlckxvZ2luLXJlbmFtaW5nIGFuZCBpZiBuZXcgVXNlckxvZ2luIGFscmVhZHkgZXhpc3RzLi4uCiAgICBpZiAoICRQYXJhbXtJRH0gJiYgKCBsYyAkUGFyYW17VXNlckxvZ2lufSBuZSBsYyAkUGFyYW17SUR9ICkgKSB7CiAgICAgICAgbXkgJVVzZXIgPSAkU2VsZi0+Q3VzdG9tZXJVc2VyRGF0YUdldCggVXNlciA9PiAkUGFyYW17VXNlckxvZ2lufSApOwogICAgICAgIGlmICglVXNlcikgewogICAgICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6Okxhbmd1YWdlJyktPlRyYW5zbGF0ZSggJ0N1c3RvbWVyIHVzZXIgIiVzIiBhbHJlYWR5IGV4aXN0cy4nLCAkUGFyYW17VXNlckxvZ2lufSApLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgdXNlciBleGlzdHMKICAgIG15ICRVc2VyTG9naW4gPSAkUGFyYW17SUR9IHx8ICRQYXJhbXtVc2VyTG9naW59OwogICAgbXkgJVVzZXIgICAgICA9ICRTZWxmLT5DdXN0b21lclVzZXJEYXRhR2V0KCBVc2VyID0+ICRVc2VyTG9naW4gKTsKICAgIGlmICggISVVc2VyICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gc3VjaCB1c2VyICckVXNlckxvZ2luJyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKIyBSb3RoZXIgT1NTIC8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKICAgICMgQ2hlY2sgaWYgdGhlIHVzZXIgaGFzIHBlcm1pc3Npb24gdG8gY2hhbmdlIHRoZSBVc2VyR3JvdXBJRC4KICAgIGlmICggJFNlbGYtPntNdWx0aXRlbmFuY3l9ICkgewogICAgICAgICMgU2V0IHRoZSBVc2VyR3JvdXBJRCB0byB0aGUgY3VycmVudCBVc2VyR3JvdXBJRC4KICAgICAgICBpZiAoICRVc2Vye1VzZXJHcm91cElEfSApIHsKICAgICAgICAgICAgJFBhcmFte1VzZXJHcm91cElEfSA9ICRVc2Vye1VzZXJHcm91cElEfTsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFVzZXJHcm91cElEU3luYyA9ICRTZWxmLT57JFVzZXJ7U291cmNlfX0tPntDdXN0b21lclVzZXJNYXB9LT57VXNlckdyb3VwSURTeW5jfTsKICAgIGlmICggJFBhcmFte1VzZXJHcm91cElEfSApIHsKICAgICAgICAjIENoZWNrIGlmIGdyb3VwIElEIG9yIGdyb3VwIG5hbWVzIHNob3VsZCBiZSBtYXRjaGVkLgogICAgICAgIGlmICggJFVzZXJHcm91cElEU3luYy0+e1VzZUdyb3VwTmFtZXN9ICkgewogICAgICAgICAgICBteSAkR3JvdXBOYW1lID0gJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06Okdyb3VwJyktPkdyb3VwTG9va3VwKAogICAgICAgICAgICAgICAgR3JvdXBJRCA9PiAkUGFyYW17VXNlckdyb3VwSUR9LAogICAgICAgICAgICApOwoKICAgICAgICAgICAgJFBhcmFte1VzZXJHcm91cElEfSA9ICRHcm91cE5hbWU7CiAgICAgICAgfQoKICAgICAgICAjIFJlcGxhY2UgdGhlIGxvY2FsIGdyb3VwIHdpdGggdGhlIGFzc29jaWF0ZWQgcmVtb3RlIGdyb3VwLgogICAgICAgIGZvciBteSAkUmVtb3RlR3JvdXAgKCBrZXlzICV7ICRVc2VyR3JvdXBJRFN5bmMtPntSZW1vdGVHcm91cFRvTG9jYWxHcm91cH0gfSApIHsKICAgICAgICAgICAgaWYgKCAkUGFyYW17VXNlckdyb3VwSUR9IGVxICRVc2VyR3JvdXBJRFN5bmMtPntSZW1vdGVHcm91cFRvTG9jYWxHcm91cH17JFJlbW90ZUdyb3VwfSApIHsKICAgICAgICAgICAgICAgICRQYXJhbXtVc2VyR3JvdXBJRH0gPSAkUmVtb3RlR3JvdXA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiMgRU8gQ3VzdG9tZXJNdWx0aXRlbmFuY3kKCiAgICBteSAkUmVzdWx0ID0gJFNlbGYtPnsgJFVzZXJ7U291cmNlfSB9LT5DdXN0b21lclVzZXJVcGRhdGUoJVBhcmFtKTsKICAgIHJldHVybiBpZiAhJFJlc3VsdDsKCiAgICAjIHRyaWdnZXIgZXZlbnQKICAgICRTZWxmLT5FdmVudEhhbmRsZXIoCiAgICAgICAgRXZlbnQgPT4gJ0N1c3RvbWVyVXNlclVwZGF0ZScsCiAgICAgICAgRGF0YSAgPT4gewogICAgICAgICAgICBVc2VyTG9naW4gPT4gJFBhcmFte0lEfSB8fCAkUGFyYW17VXNlckxvZ2lufSwKICAgICAgICAgICAgTmV3RGF0YSAgID0+IFwlUGFyYW0sCiAgICAgICAgICAgIE9sZERhdGEgICA9PiBcJVVzZXIsCiAgICAgICAgfSwKICAgICAgICBVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgIHJldHVybiAkUmVzdWx0Owp9Cgo9aGVhZDIgU2V0UGFzc3dvcmQoKQoKdG8gc2V0IGN1c3RvbWVyIHVzZXJzIHBhc3N3b3JkcwoKICAgICRDdXN0b21lclVzZXJPYmplY3QtPlNldFBhc3N3b3JkKAogICAgICAgIFVzZXJMb2dpbiA9PiAnc29tZS1sb2dpbicsCiAgICAgICAgUFcgICAgICAgID0+ICdzb21lLW5ldy1wYXNzd29yZCcKICAgICk7Cgo9Y3V0CgpzdWIgU2V0UGFzc3dvcmQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1VzZXJMb2dpbn0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdVc2VyIFVzZXJMb2dpbiEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBjaGVjayBpZiB1c2VyIGV4aXN0cwogICAgbXkgJVVzZXIgPSAkU2VsZi0+Q3VzdG9tZXJVc2VyRGF0YUdldCggVXNlciA9PiAkUGFyYW17VXNlckxvZ2lufSApOwogICAgaWYgKCAhJVVzZXIgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBzdWNoIHVzZXIgJyRQYXJhbXtVc2VyTG9naW59JyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgcmV0dXJuICRTZWxmLT57ICRVc2Vye1NvdXJjZX0gfS0+U2V0UGFzc3dvcmQoJVBhcmFtKTsKfQoKPWhlYWQyIEdlbmVyYXRlUmFuZG9tUGFzc3dvcmQoKQoKZ2VuZXJhdGUgYSByYW5kb20gcGFzc3dvcmQKCiAgICBteSAkUGFzc3dvcmQgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5HZW5lcmF0ZVJhbmRvbVBhc3N3b3JkKCk7CgogICAgb3IKCiAgICBteSAkUGFzc3dvcmQgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5HZW5lcmF0ZVJhbmRvbVBhc3N3b3JkKAogICAgICAgIFNpemUgPT4gMTYsCiAgICApOwoKPWN1dAoKc3ViIEdlbmVyYXRlUmFuZG9tUGFzc3dvcmQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gJFNlbGYtPntDdXN0b21lclVzZXJ9LT5HZW5lcmF0ZVJhbmRvbVBhc3N3b3JkKCVQYXJhbSk7Cn0KCj1oZWFkMiBTZXRQcmVmZXJlbmNlcygpCgpzZXQgY3VzdG9tZXIgdXNlciBwcmVmZXJlbmNlcwoKICAgICRDdXN0b21lclVzZXJPYmplY3QtPlNldFByZWZlcmVuY2VzKAogICAgICAgIEtleSAgICA9PiAnVXNlckNvbW1lbnQnLAogICAgICAgIFZhbHVlICA9PiAnc29tZSBjb21tZW50JywKICAgICAgICBVc2VySUQgPT4gJ3NvbWUtbG9naW4nLAogICAgKTsKCj1jdXQKCnN1YiBTZXRQcmVmZXJlbmNlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17VXNlcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgVXNlcklEIScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIERvbid0IGFsbG93IG92ZXJ3cml0aW5nIG9mIG5hdGl2ZSB1c2VyIGRhdGEuCiAgICBteSAlQmxhY2tsaXN0ZWQgPSAoCiAgICAgICAgVXNlcklEICAgICAgICAgPT4gMSwKICAgICAgICBVc2VyTG9naW4gICAgICA9PiAxLAogICAgICAgIFVzZXJQYXNzd29yZCAgID0+IDEsCiAgICAgICAgVXNlckZpcnN0bmFtZSAgPT4gMSwKICAgICAgICBVc2VyTGFzdG5hbWUgICA9PiAxLAogICAgICAgIFVzZXJGdWxsbmFtZSAgID0+IDEsCiAgICAgICAgVXNlclN0cmVldCAgICAgPT4gMSwKICAgICAgICBVc2VyQ2l0eSAgICAgICA9PiAxLAogICAgICAgIFVzZXJaaXAgICAgICAgID0+IDEsCiAgICAgICAgVXNlckNvdW50cnkgICAgPT4gMSwKICAgICAgICBVc2VyQ29tbWVudCAgICA9PiAxLAogICAgICAgIFVzZXJDdXN0b21lcklEID0+IDEsCiAgICAgICAgVXNlclRpdGxlICAgICAgPT4gMSwKICAgICAgICBVc2VyRW1haWwgICAgICA9PiAxLAogICAgICAgIENoYW5nZVRpbWUgICAgID0+IDEsCiAgICAgICAgQ2hhbmdlQnkgICAgICAgPT4gMSwKICAgICAgICBDcmVhdGVUaW1lICAgICA9PiAxLAogICAgICAgIENyZWF0ZUJ5ICAgICAgID0+IDEsCiAgICAgICAgVXNlclBob25lICAgICAgPT4gMSwKICAgICAgICBVc2VyTW9iaWxlICAgICA9PiAxLAogICAgICAgIFVzZXJGYXggICAgICAgID0+IDEsCiAgICAgICAgVXNlck1haWxTdHJpbmcgPT4gMSwKICAgICAgICBWYWxpZElEICAgICAgICA9PiAxLAogICAgKTsKCiAgICByZXR1cm4gMCBpZiAkQmxhY2tsaXN0ZWR7ICRQYXJhbXtLZXl9IH07CgogICAgIyBjaGVjayBpZiB1c2VyIGV4aXN0cwogICAgbXkgJVVzZXIgPSAkU2VsZi0+Q3VzdG9tZXJVc2VyRGF0YUdldCggVXNlciA9PiAkUGFyYW17VXNlcklEfSApOwogICAgaWYgKCAhJVVzZXIgKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBzdWNoIHVzZXIgJyRQYXJhbXtVc2VySUR9JyEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2FsbCBuZXcgYXBpICgyLjQuOCBhbmQgaGlnaGVyKQogICAgaWYgKCAkU2VsZi0+eyAkVXNlcntTb3VyY2V9IH0tPmNhbignU2V0UHJlZmVyZW5jZXMnKSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPnsgJFVzZXJ7U291cmNlfSB9LT5TZXRQcmVmZXJlbmNlcyglUGFyYW0pOwogICAgfQoKICAgICMgY2FsbCBvbGQgYXBpCiAgICByZXR1cm4gJFNlbGYtPntQcmVmZXJlbmNlc09iamVjdH0tPlNldFByZWZlcmVuY2VzKCVQYXJhbSk7Cn0KCj1oZWFkMiBHZXRQcmVmZXJlbmNlcygpCgpnZXQgY3VzdG9tZXIgdXNlciBwcmVmZXJlbmNlcwoKICAgIG15ICVQcmVmZXJlbmNlcyA9ICRDdXN0b21lclVzZXJPYmplY3QtPkdldFByZWZlcmVuY2VzKAogICAgICAgIFVzZXJJRCA9PiAnc29tZS1sb2dpbicsCiAgICApOwoKPWN1dAoKc3ViIEdldFByZWZlcmVuY2VzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VySUQhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgaWYgdXNlciBleGlzdHMKICAgIG15ICVVc2VyID0gJFNlbGYtPkN1c3RvbWVyVXNlckRhdGFHZXQoIFVzZXIgPT4gJFBhcmFte1VzZXJJRH0gKTsKICAgIGlmICggISVVc2VyICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gc3VjaCB1c2VyICckUGFyYW17VXNlcklEfSchIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNhbGwgbmV3IGFwaSAoMi40LjggYW5kIGhpZ2hlcikKICAgIGlmICggJFNlbGYtPnsgJFVzZXJ7U291cmNlfSB9LT5jYW4oJ0dldFByZWZlcmVuY2VzJykgKSB7CiAgICAgICAgcmV0dXJuICRTZWxmLT57ICRVc2Vye1NvdXJjZX0gfS0+R2V0UHJlZmVyZW5jZXMoJVBhcmFtKTsKICAgIH0KCiAgICAjIGNhbGwgb2xkIGFwaQogICAgcmV0dXJuICRTZWxmLT57UHJlZmVyZW5jZXNPYmplY3R9LT5HZXRQcmVmZXJlbmNlcyglUGFyYW0pOwp9Cgo9aGVhZDIgU2VhcmNoUHJlZmVyZW5jZXMoKQoKc2VhcmNoIGluIHVzZXIgcHJlZmVyZW5jZXMKCiAgICBteSAlVXNlckxpc3QgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5TZWFyY2hQcmVmZXJlbmNlcygKICAgICAgICBLZXkgICA9PiAnVXNlclNvbWVLZXknLAogICAgICAgIFZhbHVlID0+ICdTb21lVmFsdWUnLCAgICMgb3B0aW9uYWwsIGxpbWl0IHRvIGEgY2VydGFpbiB2YWx1ZS9wYXR0ZXJuCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaFByZWZlcmVuY2VzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJURhdGE7CiAgICBTT1VSQ0U6CiAgICBmb3IgbXkgJENvdW50ICggJycsIDEgLi4gMTAgKSB7CgogICAgICAgIG5leHQgU09VUkNFIGlmICEkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifTsKCiAgICAgICAgIyBnZXQgY3VzdG9tZXIgc2VhcmNoIHJlc3VsdCBvZiBiYWNrZW5kIGFuZCBtZXJnZSBpdAogICAgICAgICMgY2FsbCBuZXcgYXBpICgyLjQuOCBhbmQgaGlnaGVyKQogICAgICAgIG15ICVTdWJEYXRhOwogICAgICAgIGlmICggJFNlbGYtPnsiQ3VzdG9tZXJVc2VyJENvdW50In0tPmNhbignU2VhcmNoUHJlZmVyZW5jZXMnKSApIHsKICAgICAgICAgICAgJVN1YkRhdGEgPSAkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifS0+U2VhcmNoUHJlZmVyZW5jZXMoJVBhcmFtKTsKICAgICAgICB9CgogICAgICAgICMgY2FsbCBvbGQgYXBpCiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICVTdWJEYXRhID0gJFNlbGYtPntQcmVmZXJlbmNlc09iamVjdH0tPlNlYXJjaFByZWZlcmVuY2VzKCVQYXJhbSk7CiAgICAgICAgfQogICAgICAgICVEYXRhID0gKCAlU3ViRGF0YSwgJURhdGEgKTsKICAgIH0KCiAgICByZXR1cm4gJURhdGE7Cn0KCj1oZWFkMiBUb2tlbkdlbmVyYXRlKCkKCmdlbmVyYXRlIGEgcmFuZG9tIHRva2VuCgogICAgbXkgJFRva2VuID0gJEN1c3RvbWVyVXNlck9iamVjdC0+VG9rZW5HZW5lcmF0ZSgKICAgICAgICBVc2VySUQgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBUb2tlbkdlbmVyYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBVc2VySUQhIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRUb2tlbiA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpNYWluJyktPkdlbmVyYXRlUmFuZG9tU3RyaW5nKAogICAgICAgIExlbmd0aCA9PiAxNCwKICAgICk7CgogICAgIyBzYXZlIHRva2VuIGluIHByZWZlcmVuY2VzCiAgICAkU2VsZi0+U2V0UHJlZmVyZW5jZXMoCiAgICAgICAgS2V5ICAgID0+ICdVc2VyVG9rZW4nLAogICAgICAgIFZhbHVlICA9PiAkVG9rZW4sCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gJFRva2VuOwp9Cgo9aGVhZDIgVG9rZW5DaGVjaygpCgpjaGVjayBwYXNzd29yZCB0b2tlbgoKICAgIG15ICRWYWxpZCA9ICRDdXN0b21lclVzZXJPYmplY3Q+VG9rZW5DaGVjaygKICAgICAgICBUb2tlbiAgPT4gJFRva2VuLAogICAgICAgIFVzZXJJRCA9PiAxMjMsCiAgICApOwoKPWN1dAoKc3ViIFRva2VuQ2hlY2sgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte1Rva2VufSB8fCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkIFRva2VuIGFuZCBVc2VySUQhIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IHByZWZlcmVuY2VzIHRva2VuCiAgICBteSAlUHJlZmVyZW5jZXMgPSAkU2VsZi0+R2V0UHJlZmVyZW5jZXMoCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHJlcXVlc3RlZCB2cy4gc3RvcmVkIHRva2VuCiAgICByZXR1cm4gaWYgISRQcmVmZXJlbmNlc3tVc2VyVG9rZW59OwogICAgcmV0dXJuIGlmICRQcmVmZXJlbmNlc3tVc2VyVG9rZW59IG5lICRQYXJhbXtUb2tlbn07CgogICAgIyByZXNldCBwYXNzd29yZCB0b2tlbgogICAgJFNlbGYtPlNldFByZWZlcmVuY2VzKAogICAgICAgIEtleSAgICA9PiAnVXNlclRva2VuJywKICAgICAgICBWYWx1ZSAgPT4gJycsCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICByZXR1cm4gMTsKfQoKPWhlYWQyIEN1c3RvbWVyVXNlckNhY2hlQ2xlYXIoKQoKY2xlYXIgY2FjaGUgb2YgY3VzdG9tZXIgdXNlciBkYXRhCgogICAgJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyQ2FjaGVDbGVhcigKICAgICAgICBVc2VyTG9naW4gPT4gJ21odWJlcicsCiAgICApOwoKPWN1dAoKc3ViIEN1c3RvbWVyVXNlckNhY2hlQ2xlYXIgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBTT1VSQ0U6CiAgICBmb3IgbXkgJENvdW50ICggJycsIDEgLi4gMTAgKSB7CgogICAgICAgIG5leHQgU09VUkNFIGlmICEkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifTsKICAgICAgICAkU2VsZi0+eyJDdXN0b21lclVzZXIkQ291bnQifS0+X0N1c3RvbWVyVXNlckNhY2hlQ2xlYXIoCiAgICAgICAgICAgIFVzZXJMb2dpbiA9PiAkUGFyYW17VXNlckxvZ2lufSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgQ3VzdG9tZXJVc2VyQ3VzdG9tZXJNZW1iZXJBZGQoKQoKdG8gYWRkIGEgY3VzdG9tZXIgdXNlciB0byBhIGN1c3RvbWVyCgogICAgbXkgJFN1Y2Nlc3MgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJDdXN0b21lck1lbWJlckFkZCgKICAgICAgICBDdXN0b21lclVzZXJJRCA9PiAxMjMsCiAgICAgICAgQ3VzdG9tZXJJRCAgICAgPT4gMTIzLAogICAgICAgIEFjdGl2ZSAgICAgICAgID0+IDEsICAgICAgICAjIG9wdGlvbmFsCiAgICAgICAgVXNlcklEICAgICAgICAgPT4gMTIzLAogICAgKTsKCj1jdXQKCnN1YiBDdXN0b21lclVzZXJDdXN0b21lck1lbWJlckFkZCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhDdXN0b21lclVzZXJJRCBDdXN0b21lcklEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkxvZycpLT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBkZWxldGUgYWZmZWN0ZWQgY2FjaGVzCiAgICBteSAkQ2FjaGVLZXkgPSAnQ2FjaGU6OkN1c3RvbWVyVXNlckN1c3RvbWVyTWVtYmVyTGlzdDo6JzsKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5EZWxldGUoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXkgLiAnQ3VzdG9tZXJVc2VySUQ6OicgLiAkUGFyYW17Q3VzdG9tZXJVc2VySUR9LAogICAgKTsKICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5EZWxldGUoCiAgICAgICAgVHlwZSA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgS2V5ICA9PiAkQ2FjaGVLZXkgLiAnQ3VzdG9tZXJJRDo6JyAuICRQYXJhbXtDdXN0b21lcklEfSwKICAgICk7CgogICAgIyBnZXQgZGF0YWJhc2Ugb2JqZWN0CiAgICBteSAkREJPYmplY3QgPSAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6REInKTsKCiAgICAjIGRlbGV0ZSBleGlzdGluZyByZWxhdGlvbgogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCA9PiAnREVMRVRFIEZST00gY3VzdG9tZXJfdXNlcl9jdXN0b21lcgogICAgICAgICAgICBXSEVSRSB1c2VyX2lkID0gPwogICAgICAgICAgICBBTkQgY3VzdG9tZXJfaWQgPSA/JywKICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDdXN0b21lclVzZXJJRH0sIFwkUGFyYW17Q3VzdG9tZXJJRH0gXSwKICAgICk7CgogICAgIyByZXR1cm4gaWYgcmVsYXRpb24gaXMgbm90IGFjdGl2ZQogICAgcmV0dXJuIDEgaWYgISRQYXJhbXtBY3RpdmV9OwoKICAgICMgaW5zZXJ0IG5ldyByZWxhdGlvbgogICAgcmV0dXJuIGlmICEkREJPYmplY3QtPkRvKAogICAgICAgIFNRTCA9PiAnCiAgICAgICAgICAgIElOU0VSVCBJTlRPIGN1c3RvbWVyX3VzZXJfY3VzdG9tZXIgKHVzZXJfaWQsIGN1c3RvbWVyX2lkLCBjcmVhdGVfdGltZSwgY3JlYXRlX2J5LAogICAgICAgICAgICBjaGFuZ2VfdGltZSwgY2hhbmdlX2J5KQogICAgICAgICAgICBWQUxVRVMgKD8sID8sIGN1cnJlbnRfdGltZXN0YW1wLCA/LCBjdXJyZW50X3RpbWVzdGFtcCwgPyknLAogICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0N1c3RvbWVyVXNlcklEfSwgXCRQYXJhbXtDdXN0b21lcklEfSwgXCRQYXJhbXtVc2VySUR9LCBcJFBhcmFte1VzZXJJRH0sIF0sCiAgICApOwoKICAgIHJldHVybiAxOwp9Cgo9aGVhZDIgQ3VzdG9tZXJVc2VyQ3VzdG9tZXJNZW1iZXJMaXN0KCkKCmdldCByZWxhdGVkIGN1c3RvbWVyIElEcyBvZiBhIGN1c3RvbWVyIHVzZXIKCiAgICBteSBAQ3VzdG9tZXJJRHMgPSAkQ3VzdG9tZXJVc2VyT2JqZWN0LT5DdXN0b21lclVzZXJDdXN0b21lck1lbWJlckxpc3QoCiAgICAgICAgQ3VzdG9tZXJVc2VySUQgPT4gMTIzLAogICAgKTsKClJldHVybnM6CiAgICBAQ3VzdG9tZXJJRHMgPSAoCiAgICAgICAgJzEyMycsCiAgICAgICAgJzQ1NicsCiAgICApOwoKZ2V0IHJlbGF0ZWQgY3VzdG9tZXIgdXNlcnMgb2YgYSBjdXN0b21lciBJRAoKICAgIG15IEBDdXN0b21lclVzZXJzID0gJEN1c3RvbWVyVXNlck9iamVjdC0+Q3VzdG9tZXJVc2VyQ3VzdG9tZXJNZW1iZXJMaXN0KAogICAgICAgIEN1c3RvbWVySUQgPT4gMTIzLAogICAgKTsKClJldHVybnM6CiAgICBAQ3VzdG9tZXJVc2VycyA9ICgKICAgICAgICAnMTIzJywKICAgICAgICAnNDU2JywKICAgICk7Cgo9Y3V0CgpzdWIgQ3VzdG9tZXJVc2VyQ3VzdG9tZXJNZW1iZXJMaXN0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtDdXN0b21lclVzZXJJRH0gJiYgISRQYXJhbXtDdXN0b21lcklEfSApIHsKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6TG9nJyktPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0dvdCBubyBDdXN0b21lclVzZXJJRCBvciBDdXN0b21lcklEIScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIG15ICREQk9iamVjdCA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpEQicpOwogICAgbXkgJENhY2hlS2V5ID0gJ0NhY2hlOjpDdXN0b21lclVzZXJDdXN0b21lck1lbWJlckxpc3Q6Oic7CgogICAgaWYgKCAkUGFyYW17Q3VzdG9tZXJVc2VySUR9ICkgewoKICAgICAgICAjIGNoZWNrIGlmIHRoaXMgcmVzdWx0IGlzIHByZXNlbnQgKGluIGNhY2hlKQogICAgICAgICRDYWNoZUtleSAuPSAnQ3VzdG9tZXJVc2VySUQ6OicgLiAkUGFyYW17Q3VzdG9tZXJVc2VySUR9OwogICAgICAgIG15ICRDYWNoZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICAgICApOwogICAgICAgIHJldHVybiBAeyRDYWNoZX0gaWYgJENhY2hlOwoKICAgICAgICAjIGdldCBjdXN0b21lciBpZHMKICAgICAgICByZXR1cm4gaWYgISREQk9iamVjdC0+UHJlcGFyZSgKICAgICAgICAgICAgU1FMID0+CiAgICAgICAgICAgICAgICAnU0VMRUNUIGN1c3RvbWVyX2lkCiAgICAgICAgICAgICAgICBGUk9NIGN1c3RvbWVyX3VzZXJfY3VzdG9tZXIKICAgICAgICAgICAgICAgIFdIRVJFIHVzZXJfaWQgPSA/CiAgICAgICAgICAgICAgICBPUkRFUiBCWSBjdXN0b21lcl9pZCcsCiAgICAgICAgICAgIEJpbmQgPT4gWyBcJFBhcmFte0N1c3RvbWVyVXNlcklEfSwgXSwKICAgICAgICApOwoKICAgICAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgICAgICBteSBAQ3VzdG9tZXJJRHM7CiAgICAgICAgd2hpbGUgKCBteSBAUm93ID0gJERCT2JqZWN0LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgIHB1c2ggQEN1c3RvbWVySURzLCAkUm93WzBdOwogICAgICAgIH0KCiAgICAgICAgIyBjYWNoZSB0aGUgcmVzdWx0CiAgICAgICAgJEtlcm5lbDo6T00tPkdldCgnS2VybmVsOjpTeXN0ZW06OkNhY2hlJyktPlNldCgKICAgICAgICAgICAgVHlwZSAgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBUVEwgICA9PiAkU2VsZi0+e0NhY2hlVFRMfSwKICAgICAgICAgICAgS2V5ICAgPT4gJENhY2hlS2V5LAogICAgICAgICAgICBWYWx1ZSA9PiBcQEN1c3RvbWVySURzLAoKICAgICAgICApOwoKICAgICAgICByZXR1cm4gQEN1c3RvbWVySURzOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICMgY2hlY2sgaWYgdGhpcyByZXN1bHQgaXMgcHJlc2VudCAoaW4gY2FjaGUpCiAgICAgICAgJENhY2hlS2V5IC49ICdDdXN0b21lcklEOjonIC4gJFBhcmFte0N1c3RvbWVySUR9OwogICAgICAgIG15ICRDYWNoZSA9ICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpDYWNoZScpLT5HZXQoCiAgICAgICAgICAgIFR5cGUgPT4gJFNlbGYtPntDYWNoZVR5cGV9LAogICAgICAgICAgICBLZXkgID0+ICRDYWNoZUtleSwKICAgICAgICApOwogICAgICAgIHJldHVybiBAeyRDYWNoZX0gaWYgJENhY2hlOwoKICAgICAgICAjIGdldCBjdXN0b21lciB1c2VycwogICAgICAgIHJldHVybiBpZiAhJERCT2JqZWN0LT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgPT4KICAgICAgICAgICAgICAgICdTRUxFQ1QgdXNlcl9pZAogICAgICAgICAgICAgICAgRlJPTSBjdXN0b21lcl91c2VyX2N1c3RvbWVyIFdIRVJFCiAgICAgICAgICAgICAgICBjdXN0b21lcl9pZCA9ID8KICAgICAgICAgICAgICAgIE9SREVSIEJZIHVzZXJfaWQnLAogICAgICAgICAgICBCaW5kID0+IFsgXCRQYXJhbXtDdXN0b21lcklEfSwgXSwKICAgICAgICApOwoKICAgICAgICAjIGZldGNoIHRoZSByZXN1bHQKICAgICAgICBteSBAQ3VzdG9tZXJVc2VySURzOwogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICREQk9iamVjdC0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICAgICBwdXNoIEBDdXN0b21lclVzZXJJRHMsICRSb3dbMF07CiAgICAgICAgfQoKICAgICAgICAjIGNhY2hlIHRoZSByZXN1bHQKICAgICAgICAkS2VybmVsOjpPTS0+R2V0KCdLZXJuZWw6OlN5c3RlbTo6Q2FjaGUnKS0+U2V0KAogICAgICAgICAgICBUeXBlICA9PiAkU2VsZi0+e0NhY2hlVHlwZX0sCiAgICAgICAgICAgIFRUTCAgID0+ICRTZWxmLT57Q2FjaGVUVEx9LAogICAgICAgICAgICBLZXkgICA9PiAkQ2FjaGVLZXksCiAgICAgICAgICAgIFZhbHVlID0+IFxAQ3VzdG9tZXJVc2VySURzLAogICAgICAgICk7CgogICAgICAgIHJldHVybiBAQ3VzdG9tZXJVc2VySURzOwogICAgfQp9Cgo9aGVhZDIgRGVsZXRlT25lUHJlZmVyZW5jZSgpCgpnZXQgY3VzdG9tZXIgdXNlciBwcmVmZXJlbmNlcwoKICAgIG15ICVQcmVmZXJlbmNlcyA9ICRDdXN0b21lclVzZXJPYmplY3QtPkRlbGV0ZU9uZVByZWZlcmVuY2UoCiAgICAgICAgVXNlcklEID0+ICdzb21lLWxvZ2luJywKICAgICAgICBLZXkgICAgPT4gJ1ByZWZlcmVuY2VLZXknLAogICAgKTsKCj1jdXQKCnN1YiBEZWxldGVPbmVQcmVmZXJlbmNlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtVc2VySUR9ICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBVc2VySUQhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY2hlY2sgaWYgdXNlciBleGlzdHMKICAgIG15ICVVc2VyID0gJFNlbGYtPkN1c3RvbWVyVXNlckRhdGFHZXQoIFVzZXIgPT4gJFBhcmFte1VzZXJJRH0gKTsKICAgIGlmICggISVVc2VyICkgewogICAgICAgICRLZXJuZWw6Ok9NLT5HZXQoJ0tlcm5lbDo6U3lzdGVtOjpMb2cnKS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gc3VjaCB1c2VyICckUGFyYW17VXNlcklEfSchIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNhbGwgbmV3IGFwaSAoMi40LjggYW5kIGhpZ2hlcikKICAgIGlmICggJFNlbGYtPnsgJFVzZXJ7U291cmNlfSB9LT5jYW4oJ0RlbGV0ZU9uZVByZWZlcmVuY2UnKSApIHsKICAgICAgICByZXR1cm4gJFNlbGYtPnsgJFVzZXJ7U291cmNlfSB9LT5EZWxldGVPbmVQcmVmZXJlbmNlKCVQYXJhbSk7CiAgICB9CgogICAgIyBjYWxsIG9sZCBhcGkKICAgIHJldHVybiAkU2VsZi0+e1ByZWZlcmVuY2VzT2JqZWN0fS0+RGVsZXRlT25lUHJlZmVyZW5jZSglUGFyYW0pOwp9CgpzdWIgREVTVFJPWSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgICMgZXhlY3V0ZSBhbGwgdHJhbnNhY3Rpb24gZXZlbnRzCiAgICAkU2VsZi0+RXZlbnRIYW5kbGVyVHJhbnNhY3Rpb24oKTsKCiAgICByZXR1cm4gMTsKfQoKMTsK</File>
        <File Location="Kernel/Config/Files/XML/CustomerMultitenancy.xml" Permission="660" Encode="Base64">PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CjxvdG9ib19jb25maWcgdmVyc2lvbj0iMi4wIiBpbml0PSJBcHBsaWNhdGlvbiI+CiAgICA8U2V0dGluZyBOYW1lPSJNdWx0aXRlbmFuY3kiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RW5hYmxlcyB0aGUgbXVsdGl0ZW5hbmN5IGZ1bmN0aW9uIGZvciBjdXN0b21lciBhbmQgY3VzdG9tZXIgdXNlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxOYXZpZ2F0aW9uPkNvcmU6OlBlcm1pc3Npb248L05hdmlnYXRpb24+CiAgICAgICAgPFZhbHVlPgogICAgICAgICAgICA8SXRlbSBWYWx1ZVR5cGU9IkNoZWNrYm94Ij4xPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+CiAgICA8U2V0dGluZyBOYW1lPSJNdWx0aXRlbmFuY3k6OlBlcm1pc3Npb25Hcm91cCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TcGVjaWZpZXMgdGhlIGdyb3VwIHRoYXQgY2FuIHNldCBtdWx0aXRlbmFuY3kgZm9yIGN1c3RvbWVyLiBNdWx0aXRlbmFuY3kgZG9lcyBub3QgYXBwbHkgdG8gbWVtYmVycyBvZiB0aGlzIGdyb3VwLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPE5hdmlnYXRpb24+Q29yZTo6UGVybWlzc2lvbjwvTmF2aWdhdGlvbj4KICAgICAgICA8VmFsdWU+CiAgICAgICAgICAgIDxJdGVtIFZhbHVlVHlwZT0iU3RyaW5nIiBWYWx1ZVJlZ2V4PSIiPmFkbWluPC9JdGVtPgogICAgICAgIDwvVmFsdWU+CiAgICA8L1NldHRpbmc+Cjwvb3RvYm9fY29uZmlnPgo=</File>
        <File Location="Kernel/Language/de_CustomerMultitenancy.pm" Permission="660" Encode="Base64">IyAtLQojIE9UT0JPIGlzIGEgd2ViLWJhc2VkIHRpY2tldGluZyBzeXN0ZW0gZm9yIHNlcnZpY2Ugb3JnYW5pc2F0aW9ucy4KIyAtLQojIENvcHlyaWdodCAoQykgMjAwMS0yMDIwIE9UUlMgQUcsIGh0dHBzOi8vb3Rycy5jb20vCiMgQ29weXJpZ2h0IChDKSAyMDE5LTIwMjYgUm90aGVyIE9TUyBHbWJILCBodHRwczovL290b2JvLmlvLwojIC0tCiMgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQgdW5kZXIKIyB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUCiMgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MKIyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQojIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiBJZiBub3QsIHNlZSA8aHR0cHM6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0N1c3RvbWVyTXVsdGl0ZW5hbmN5OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwp1c2UgdXRmODsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CgogICAgIyBTeXNDb25maWcKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0VuYWJsZXMgdGhlIG11bHRpdGVuYW5jeSBmdW5jdGlvbiBmb3IgY3VzdG9tZXIgYW5kIGN1c3RvbWVyIHVzZXIuJ30gPQogICAgICAgICcnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU3BlY2lmaWVzIHRoZSBncm91cCB0aGF0IGNhbiBzZXQgbXVsdGl0ZW5hbmN5IGZvciBjdXN0b21lci4gTXVsdGl0ZW5hbmN5IGRvZXMgbm90IGFwcGx5IHRvIG1lbWJlcnMgb2YgdGhpcyBncm91cC4nfSA9CiAgICAgICAgJyc7CgoKICAgIHB1c2ggQHsgJFNlbGYtPntKYXZhU2NyaXB0U3RyaW5nc30gLy8gW10gfSwgKAogICAgKTsKCn0KCjE7Cg==</File>
        <File Location="doc/en/CustomerMultitenancy.pdf" Permission="644" Encode="Base64">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</File>
    </Filelist>
    <DatabaseInstall Type="post">
        <TableAlter Type="post" Name="customer_user">
            <ColumnAdd Name="group_id" Required="false" Size="100" Type="VARCHAR"></ColumnAdd>
        </TableAlter>
        <TableAlter Type="post" Name="customer_company">
            <ColumnAdd Name="group_id" Required="false" Size="100" Type="VARCHAR"></ColumnAdd>
        </TableAlter>
    </DatabaseInstall>
    <DatabaseUninstall Type="pre">
        <TableAlter Type="pre" Name="customer_user">
            <ColumnDrop Name="group_id"></ColumnDrop>
        </TableAlter>
        <TableAlter Type="pre" Name="customer_company">
            <ColumnDrop Name="group_id"></ColumnDrop>
        </TableAlter>
    </DatabaseUninstall>
</otrs_package>