Support
0.0.2
OTRS GmbH
http://otrs.org/
GNU GENERAL PUBLIC LICENSE Version 2, June 1991
Init release.
A admin support tool.
Ein Admin Support Tool.
2.2
2007-05-07 21:28:55
opms.otrs.com
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8b3Ryc19jb25maWcgdmVyc2lvbj0iMS4wIiBpbml0PSJBcHBsaWNhdGlvbiI+CiAgICA8Q1ZTPiRJZDogU3VwcG9ydC54bWwsdiAxLjEuMS4xIDIwMDcvMDUvMDcgMTg6NDc6NTUgc3IgRXhwICQ8L0NWUz4KICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZG1pblN1cHBvcnQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5TeXN0ZW1TdGF0dXMgb2JqZWN0ICBpbiB0aGUgYWRtaW4gYXJlYS48L0Rlc2NyaXB0aW9uPkRlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RnJvbnRlbmRtb2R1bC1SZWdpc3RyYXRpb24gZGVzIEFkbWluU3lzdGVtU3RhdHVzLU9iamVrdHMgaW0gQWRtaW4tQmVyZWljaC48L0Rlc2NyaXB0aW9uPkRlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5TeXN0ZW1TdGF0dXM8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWRtaW46Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxUaXRsZT5TdXBwb3J0IEluZm88L1RpdGxlPgogICAgICAgICAgICAgICAgPEdyb3VwPmFkbWluPC9Hcm91cD4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5BZG1pbi1TdXBwb3J0IE92ZXJ2aWV3PC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkFkbWluPC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPE5hdkJhck1vZHVsZT4KICAgICAgICAgICAgICAgICAgICA8TW9kdWxlPktlcm5lbDo6T3V0cHV0OjpIVE1MOjpOYXZCYXJNb2R1bGVBZG1pbjwvTW9kdWxlPgogICAgICAgICAgICAgICAgICAgIDxOYW1lPlN1cHBvcnQ8L05hbWU+CiAgICAgICAgICAgICAgICAgICAgPEJsb2NrPkJsb2NrNDwvQmxvY2s+CiAgICAgICAgICAgICAgICAgICAgPFByaW8+MjAwMDwvUHJpbz4KICAgICAgICAgICAgICAgIDwvTmF2QmFyTW9kdWxlPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KPC9vdHJzX2NvbmZpZz4=
IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluU3VwcG9ydC5wbSAtIHNob3cgc3VwcG9ydCBpbmZvcm1hdGlvbgojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZG1pblN1cHBvcnQucG0sdiAxLjEuMS4xIDIwMDcvMDUvMDcgMTg6NDc6NTUgc3IgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWRtaW5TdXBwb3J0OwoKdXNlIHN0cmljdDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9ICckUmV2aXNpb246IDEuMS4xLjEgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzICgkU2VsZiwgJFR5cGUpOwoKICAgIGZvcmVhY2ggKGtleXMgJVBhcmFtKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99OwogICAgfQoKICAgICMgY2hlY2sgbmVlZGVkIE9iamVjdHMKICAgIGZvcmVhY2ggKHF3KFBhcmFtT2JqZWN0IExheW91dE9iamVjdCBMb2dPYmplY3QgQ29uZmlnT2JqZWN0KSkgewogICAgICAgIGlmICghJFNlbGYtPnskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKE1lc3NhZ2UgPT4gIkdvdCBubyAkXyEiKTsKICAgICAgICB9CiAgICB9CiAgICAkU2VsZi0+e1N1cHBvcnRPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQtPm5ldyglUGFyYW0pOwogICAgCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJENvbmZpZ0hhc2ggPSB7fTsKICAgIAogICAgIyBjcmVhdGUgY29uZmlnIGhhc2ggcmVmZXJlbmNlCiAgICAkU2VsZi0+e1N1cHBvcnRPYmplY3R9LT5TdXBwb3J0Q29uZmlnSGFzaEdldCgKICAgICAgICBDb25maWdIYXNoID0+ICRDb25maWdIYXNoLAogICAgKTsKCiAgICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAjCiAgICAjIEdldCByZXF1aXJlZCBpbmZvcm1hdGlvbgogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwoKICAgIGlmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0dldFJlcXVpcmVkSW5mbycpIHsKICAgICAgICAjIGNyZWF0ZSAmIHJldHVybiBvdXRwdXQKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwoKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSZXF1aXJlZCcsCiAgICAgICAgKTsKICAgICAgICAjIGZpcnN0IGxldmVsIEhhc2hyZWYgKGVhY2ggbW9kdWxlIG5hbWUpCiAgICAgICAgZm9yZWFjaCBteSAkQ29uZmlnTW9kdWxlIChzb3J0IGtleXMgJXskQ29uZmlnSGFzaH0pIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JlcXVpcmVkSW5mbycsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBDb25maWdNb2R1bGUgPT4gJENvbmZpZ01vZHVsZSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICAjIHNlY29uZCBsZXZlbCBBcnJheXJlZiAoZWFjaCBtb2R1bGUpCiAgICAgICAgICAgIGZvcmVhY2ggbXkgJENvbmZpZ0hhc2hSb3cgKEB7JENvbmZpZ0hhc2gtPnskQ29uZmlnTW9kdWxlfX0pIHsKICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAnUmVxdWlyZWRJbmZvUm93JywKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAjIGlmICRDb25maWdIYXNoUm93LT57SW5wdXR9LT57VHlwZX0gPSAiVGV4dCIsIGNyZWF0ZSBhIG5ldyB0ZXh0ZmllbGQKICAgICAgICAgICAgICAgIGlmICgkQ29uZmlnSGFzaFJvdy0+e0lucHV0fS0+e1R5cGV9IGVxICJUZXh0IikgewogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JlcXVpcmVkSW5mb1Jvd1RleHQnLAogICAgICAgICAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleSA9PiAkQ29uZmlnTW9kdWxlIC4gJzo6JyAuICRDb25maWdIYXNoUm93LT57S2V5fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJENvbmZpZ0hhc2hSb3ctPntOYW1lfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRDb25maWdIYXNoUm93LT57VmFsdWV9IHx8ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZSA9PiAkQ29uZmlnSGFzaFJvdy0+e0lucHV0fS0+e1NpemV9IHx8ICc0MCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAkQ29uZmlnSGFzaFJvdy0+e0Rlc2NyaXB0aW9ufSB8fCAnJywKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIyBpZiAkQ29uZmlnSGFzaFJvdy0+e0lucHV0fS0+e1R5cGV9ID0gIlNlYXJjaCIsIGNyZWF0ZSBhIG5ldyBkcm9wZG93biBmaWVsZAogICAgICAgICAgICAgICAgZWxzaWYgKCRDb25maWdIYXNoUm93LT57SW5wdXR9LT57VHlwZX0gZXEgIlNlbGVjdCIpIHsKICAgICAgICAgICAgICAgICAgICBteSAkU2VsZWN0U3RyZyA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gJENvbmZpZ0hhc2hSb3ctPntJbnB1dH0tPntEYXRhfSB8fCB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkQ29uZmlnTW9kdWxlIC4gJzo6JyAuICRDb25maWdIYXNoUm93LT57S2V5fSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1JlcXVpcmVkSW5mb1Jvd1NlbGVjdCcsCiAgICAgICAgICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZSA9PiAkQ29uZmlnSGFzaFJvdy0+e05hbWV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJENvbmZpZ0hhc2hSb3ctPntEZXNjcmlwdGlvbn0gfHwgJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RTdHJnID0+ICRTZWxlY3RTdHJnLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pblN1cHBvcnQnLAogICAgICAgICAgICBEYXRhID0+IHsgfSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KICAgIAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBDb25maWRlbnRpYWwgYW5kIFN1cHBvcnRJRAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdDb25maWRlbnRpYWwnKSB7CiAgICAgICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0CiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ29uZmlkZW50aWFsJywKICAgICAgICApOwogICAgICAgICMgY3JlYXRlIGhpZGRlbiBmaWVsZHMsIGNhdXNlIHdlIG5lZWQgdGhlIGluZm9ybWF0aW9uIGFnYWluLgogICAgICAgIGZvcmVhY2ggbXkgJENvbmZpZ01vZHVsZSAoa2V5cyAleyRDb25maWdIYXNofSkgewogICAgICAgICAgICBmb3JlYWNoIG15ICRDb25maWdIYXNoUm93IChAeyRDb25maWdIYXNoLT57JENvbmZpZ01vZHVsZX19KSB7CiAgICAgICAgICAgICAgICBteSAkVmFsdWUgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJENvbmZpZ01vZHVsZSAuICc6OicgLiAkQ29uZmlnSGFzaFJvdy0+e0tleX0pOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJ0NvbmZpZGVudGlhbEhpZGRlbicsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUgPT4gJENvbmZpZ01vZHVsZSAuICc6OicgLiAkQ29uZmlnSGFzaFJvdy0+e0tleX0sCiAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlID0+ICRWYWx1ZSB8fCAnJywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pblN1cHBvcnQnLAogICAgICAgICAgICBEYXRhID0+IHsgfSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KICAgIAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBVcGxvYWRTdXBwb3J0SW5mbwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgCiAgICBlbHNpZiAoJFNlbGYtPntTdWJhY3Rpb259IGVxICdVcGxvYWRTdXBwb3J0SW5mbycpIHsKICAgICAgICBteSAkRGF0YUhhc2ggPSB7fTsKICAgICAgICBteSAkSW5wdXRIYXNoID0ge307CiAgICAgICAgCiAgICAgICAgIyBjcmVhdGUgJiByZXR1cm4gb3V0cHV0CiAgICAgICAgbXkgJE91dHB1dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SGVhZGVyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5hdmlnYXRpb25CYXIoKTsKCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ29uZmlkZW50aWFsJywKICAgICAgICApOwoKICAgICAgICAjIGdldCBoaWRkZW4gZmllbGRzLCBjYXVzZSB3ZSBuZWVkIHRoZSBpbmZvcm1hdGlvbiBhZ2Fpbi4KICAgICAgICBmb3JlYWNoIG15ICRDb25maWdNb2R1bGUgKGtleXMgJXskQ29uZmlnSGFzaH0pIHsKICAgICAgICAgICAgbXkgJE1vZHVsZUlucHV0RGF0YSA9IHt9OwogICAgICAgICAgICBmb3JlYWNoIG15ICRDb25maWdIYXNoUm93IChAeyRDb25maWdIYXNoLT57JENvbmZpZ01vZHVsZX19KSB7CiAgICAgICAgICAgICAgICAkTW9kdWxlSW5wdXREYXRhLT57JENvbmZpZ0hhc2hSb3ctPntLZXl9fSA9IAogICAgICAgICAgICAgICAgICAgICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAkQ29uZmlnTW9kdWxlIC4gJzo6JyAuICRDb25maWdIYXNoUm93LT57S2V5fSkgfHwgJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJElucHV0SGFzaC0+eyRDb25maWdNb2R1bGV9ID0gJE1vZHVsZUlucHV0RGF0YTsKICAgICAgICB9CiAgICAgICAgIyBjcmVhdGUgZGF0YSBoYXNoIHJlZmVyZW5jZQogICAgICAgICRTZWxmLT57U3VwcG9ydE9iamVjdH0tPlN1cHBvcnRJbmZvR2V0KAogICAgICAgICAgICBEYXRhSGFzaCA9PiAkRGF0YUhhc2gsCiAgICAgICAgICAgIElucHV0SGFzaCA9PiAkSW5wdXRIYXNoLAogICAgICAgICk7CiAgICAgICAgCiAgICAgICAgbXkgJFhNTFN0cmluZyA9ICRTZWxmLT57U3VwcG9ydE9iamVjdH0tPlhNTFN0cmluZ0NyZWF0ZSgKICAgICAgICAgICAgRGF0YUhhc2ggPT4gJERhdGFIYXNoLAogICAgICAgICk7CiAgICAgICAgIyBpZiB0aGUgYnV0dG9uIHNlbmQgYmVjb21lcyB0aGUgc3VibWl0CiAgICAgICAgaWYgKCRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiU2VuZCIpKSB7CiAgICAgICAgICAgIG15ICRTZW5kTWVzc2FnZTsKICAgICAgICAgICAgaWYgKGxlbmd0aCgkWE1MU3RyaW5nKSA8IDk5NjE0NzIpIHsKICAgICAgICAgICAgICAgICMgc2VuZCBpbmZvIHRvICgob3RycykpCiAgICAgICAgICAgICAgICAkU2VuZE1lc3NhZ2UgPSAkU2VsZi0+e1N1cHBvcnRPYmplY3R9LT5TdXBwb3J0U2VuZEluZm8oCiAgICAgICAgICAgICAgICAgICAgWE1MU3RyaW5nID0+ICRYTUxTdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgU3VwcG9ydElEID0+ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAiU3VwcG9ydElEIiksCiAgICAgICAgICAgICAgICApOyAgIAogICAgICAgICAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk5vdGlmeSgKICAgICAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnd2FybmluZycsCiAgICAgICAgICAgICAgICAgICAgSW5mbyA9PiAkU2VuZE1lc3NhZ2UsCiAgICAgICAgICAgICAgICApOyAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Tm90aWZ5KAogICAgICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ3dhcm5pbmcnLAogICAgICAgICAgICAgICAgICAgSW5mbyA9PiAnQ2FuXCd0IHNlbmQgZW1haWwgdG8gdGhlICgob3RycykpIHN1cHBvcnQgdGVhbSEnLiJcblxuIi4KICAgICAgICAgICAgICAgICAgICAgICAgIllvdSB3aWxsIGZvdW5kIHRoZSBvdHJzIHN5c3RlbSBpbmZvcm1hdGlvbiBwYWNrYWdlIGF0XG4iLgogICAgICAgICAgICAgICAgICAgICAgICAiSWYgeW91IHdvdWxkIGxpa2UgdG8gdXNlIE9UUlMgc3VwcG9ydCBzZXJ2aWNlcyBwbGVhc2Ugc2VuZCB0aGUgcGFja2FnZSB0byBzdXBwb3J0XEBvdHJzLmNvbSBvciBjYWxsXG4iLgogICAgICAgICAgICAgICAgICAgICAgICAib3VyIHN1cHBvcnQgdGVhbSBwZXIgcGhvbmUgdG8gcmV2aWV3IHRoZSBuZXh0IHN0ZXBcblxuIi4KICAgICAgICAgICAgICAgICAgICAgICAgIiBNb3JlIGFib3V0IE9UUlMgc3VwcG9ydCBvciBmYWNlLXRvLWZhY2UgY29udGFjdCBpbmZvcm1hdGlvbiB5b3Ugd2lsbCBmb3VuZCBhdFxuIi4KICAgICAgICAgICAgICAgICAgICAgICAgJ2h0dHA6Ly93d3cub3Rycy5jb20vJy4iXG5cbiIsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICMgaWYgdGhlIGJ1dHRvbiBkb3dubG9hZCBiZWNvbWVzIHRoZSBzdWJtaXQKICAgICAgICBlbHNpZiAoJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICJEb3dubG9hZCIpKSB7CiAgICAgICAgICAgIG15ICgkcywkbSwkaCwgJEQsJE0sJFksICR3ZCwkeWQsJGRzdCkgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lMkRhdGUoCiAgICAgICAgICAgIFN5c3RlbVRpbWUgPT4gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpLAogICAgICAgICAgICApOwogICAgICAgICAgICAkTSA9IHNwcmludGYoIiUwMmQiLCAkTSk7CiAgICAgICAgICAgICREID0gc3ByaW50ZigiJTAyZCIsICREKTsKICAgICAgICAgICAgJGggPSBzcHJpbnRmKCIlMDJkIiwgJGgpOwogICAgICAgICAgICAkbSA9IHNwcmludGYoIiUwMmQiLCAkbSk7CiAgICAgICAgICAgICMgcmV0dXJuIGZpbGUKICAgICAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXR0YWNobWVudCgKICAgICAgICAgICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nLAogICAgICAgICAgICAgICAgQ29udGVudCA9PiAkWE1MU3RyaW5nLAogICAgICAgICAgICAgICAgRmlsZW5hbWUgPT4gIlN1cHBvcnRJbmZvIi4iXyIuIiRZLSRNLSREIi4iXyRoLSRtLnBtIiwKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ2F0dGFjaGVkJywKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pblN1cHBvcnQnLAogICAgICAgICAgICBEYXRhID0+IHsgfSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KICAgIAogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgIyBvdmVydmlldwogICAgIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIwogICAgCiAgICBlbHNlIHsKICAgICAgICBteSAkRGF0YUhhc2ggPSB7fTsKICAgICAgICAjIGNyZWF0ZSBkYXRhIGhhc2ggcmVmZXJlbmNlCiAgICAgICAgJFNlbGYtPntTdXBwb3J0T2JqZWN0fS0+QWRtaW5DaGVja3NHZXQoCiAgICAgICAgICAgIERhdGFIYXNoID0+ICREYXRhSGFzaCwKICAgICAgICApOwogICAgICAgIAogICAgICAgICMgY3JlYXRlICYgcmV0dXJuIG91dHB1dAogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3JywKICAgICAgICApOwoKICAgICAgICBmb3JlYWNoIG15ICRNb2R1bGUgKHNvcnQga2V5cyAleyREYXRhSGFzaH0pIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ092ZXJ2aWV3TW9kdWxlJywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIE1vZHVsZSA9PiAkTW9kdWxlLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgIyBjaGVjayBjc3Mgcm90YXRvcnkKICAgICAgICAgICAgbXkgJENzc0NsYXNzOwogICAgICAgICAgICBmb3JlYWNoIG15ICRSb3dIYXNoIChAeyREYXRhSGFzaC0+eyRNb2R1bGV9fSkgewogICAgICAgICAgICAgICAgIyBzZXQgb3V0cHV0IGNsYXNzCiAgICAgICAgICAgICAgICBpZiAoJENzc0NsYXNzICYmICRDc3NDbGFzcyBlcSAnc2VhcmNoYWN0aXZlJykgewogICAgICAgICAgICAgICAgICAgICRDc3NDbGFzcyA9ICdzZWFyY2hwYXNzaXZlJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICRDc3NDbGFzcyA9ICdzZWFyY2hhY3RpdmUnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbXkgJEZvbnRDb2xvciA9ICJyZWQiOwogICAgICAgICAgICAgICAgaWYgKCRSb3dIYXNoLT57Q2hlY2t9IGVxICJPSyIpIHsKICAgICAgICAgICAgICAgICAgICAkRm9udENvbG9yID0gImdyZWVuIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICMgY3JlYXRlIG5ldyBibG9jayB3aXRoIHJvdGF0b3J5IGNzcwogICAgICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgICAgICAgICBOYW1lID0+ICdPdmVydmlld01vZHVsZVJvdycsCiAgICAgICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICV7JFJvd0hhc2h9LAogICAgICAgICAgICAgICAgICAgICAgICBDc3NDbGFzcyA9PiAkQ3NzQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgIEZvbnRDb2xvciA9PiAkRm9udENvbG9yLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5TdXBwb3J0JywKICAgICAgICAgICAgRGF0YSA9PiB7IH0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9Cn0KCjE7
IyAtLQojIEFkbWluU3VwcG9ydC5kdGwgLSBwcm92aWRlcyBIVE1MIGZvcm0gZm9yIEFkbWluU3VwcG9ydAojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZG1pblN1cHBvcnQuZHRsLHYgMS4xLjEuMSAyMDA3LzA1LzA3IDE4OjQ3OjU1IHNyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXcgLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPiRFbnZ7IkJveDAifSRUZXh0eyJBZG1pbiBTdXBwb3J0IEluZm8ifSRFbnZ7IkJveDEifTwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1lbnUiPgogICAgICA8YSBocmVmPSIkRW52eyJCYXNlbGluayJ9QWN0aW9uPSRFbnZ7IkFjdGlvbiJ9JlN1YmFjdGlvbj1HZXRSZXF1aXJlZEluZm8iPkNyZWF0ZSBTdXBwb3J0IFBhY2thZ2U8L2E+CiAgICA8L3RkPgogIDwvdHI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluYm9keSIgYWxpZ249ImNlbnRlciI+CiAgICAgIDxicj4KPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXdNb2R1bGUgLS0+CiAgICAgIDx0YWJsZSB3aWR0aD0iODAwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjQiPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGhlYWQiPiRRRGF0YXsiTW9kdWxlIn08L3RkPgogICAgICAgIDwvdHI+CiAgICAgICAgPHRyPgogICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iMTAwJSIgYm9yZGVyPSIwIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjE1MCI+JFRleHR7Ik5hbWUifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIyNTAiPiRUZXh0eyJEZXNjcmlwdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IkNvbW1lbnQifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSI1MCI+JFRleHR7IkNoZWNrIn08L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TW9kdWxlUm93IC0tPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4kUURhdGF7Ik5hbWUifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+JFFEYXRheyJEZXNjcmlwdGlvbiJ9PC90ZD4KICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iJFFEYXRheyJDc3NDbGFzcyJ9Ij4kUURhdGF7IkNvbW1lbnQifTwvdGQ+CiAgICAgICAgICAgICAgICA8dGQgY2xhc3M9IiRRRGF0YXsiQ3NzQ2xhc3MifSI+PGZvbnQgY29sb3I9IiRRRGF0YXsiRm9udENvbG9yIn0iPiRRRGF0YXsiQ2hlY2sifTwvZm9udD48L3RkPgogICAgICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TW9kdWxlUm93IC0tPgogICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICAgIDx0cj4KICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgICAgICZuYnNwOwogICAgICAgICAgPC90ZD4KICAgICAgICA8L3RyPgogICAgICA8L3RhYmxlPgogICAgICA8YnI+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3TW9kdWxlIC0tPgogICAgICA8YnI+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOk92ZXJ2aWV3IC0tPgo8IS0tIGR0bDpibG9jazpSZXF1aXJlZCAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMCI+CiAgPHRyPgogICAgPHRkIGNsYXNzPSJtYWluaGVhZCI+JEVudnsiQm94MCJ9JFRleHR7IkFkbWluIFN1cHBvcnQgSW5mbyJ9JEVudnsiQm94MSJ9PC90ZD4KICA8L3RyPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmJvZHkiIGFsaWduPSJjZW50ZXIiPgogICAgICA8YnI+CiAgICAgICAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iQ29uZmlkZW50aWFsIj4KICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iODAwcHgiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CjwhLS0gZHRsOmJsb2NrOlJlcXVpcmVkSW5mbyAtLT4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNvbHNwYW49IjMiIGNsYXNzPSJjb250ZW50aGVhZCI+JFFEYXRheyJDb25maWdNb2R1bGUifTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgICA8dGFibGUgd2lkdGg9IjgwMHB4IiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjMiPgo8IS0tIGR0bDpibG9jazpSZXF1aXJlZEluZm9Sb3cgLS0+CjwhLS0gZHRsOmJsb2NrOlJlcXVpcmVkSW5mb1Jvd1RleHQgLS0+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjI1JSI+JFFEYXRheyJOYW1lIn06PC90ZD4gICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIiB3aWR0aD0iMzUlIj48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iJFFEYXRheyJLZXkifSIgdmFsdWU9IiRRRGF0YXsiVmFsdWUifSIgc2l6ZT0iJFFEYXRheyJTaXplIn0iPjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+ICgqICRRRGF0YXsiRGVzY3JpcHRpb24ifTwvZm9udD48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UmVxdWlyZWRJbmZvUm93VGV4dCAtLT4KPCEtLSBkdGw6YmxvY2s6UmVxdWlyZWRJbmZvUm93U2VsZWN0IC0tPgogICAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiIHdpZHRoPSIyNSUiPiRRRGF0YXsiTmFtZSJ9OjwvdGQ+ICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSIgd2lkdGg9IjM1JSI+JERhdGF7IlNlbGVjdFN0cmcifTwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48Zm9udCBjb2xvcj0icmVkIiBzaXplPSItMiI+ICgqICRRRGF0YXsiRGVzY3JpcHRpb24ifTwvZm9udD48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KPCEtLSBkdGw6YmxvY2s6UmVxdWlyZWRJbmZvUm93U2VsZWN0IC0tPgo8IS0tIGR0bDpibG9jazpSZXF1aXJlZEluZm9Sb3cgLS0+CiAgICAgICAgICAgICAgPC90YWJsZT4KICAgICAgICAgICAgPC90ZD4KICAgICAgICAgIDwvdHI+CjwhLS0gZHRsOmJsb2NrOlJlcXVpcmVkSW5mbyAtLT4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7Ik5leHQuLi4ifSI+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgICAgPC9mb3JtPgogICAgICA8YnI+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOlJlcXVpcmVkIC0tPgo8IS0tIGR0bDpibG9jazpDb25maWRlbnRpYWwgLS0+Cjx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjAiPgogIDx0cj4KICAgIDx0ZCBjbGFzcz0ibWFpbmhlYWQiPiRFbnZ7IkJveDAifSRUZXh0eyJBZG1pbiBTdXBwb3J0IEluZm8ifSRFbnZ7IkJveDEifTwvdGQ+CiAgPC90cj4KICA8dHI+CiAgICA8dGQgY2xhc3M9Im1haW5ib2R5IiBhbGlnbj0iY2VudGVyIj4KICAgICAgPGJyPgogICAgICAgIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCI+CgkgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgoJICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlVwbG9hZFN1cHBvcnRJbmZvIj4KICAgICAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iODAwcHgiIGFsaWduPSJjZW50ZXIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICA8dHI+CiAgICAgICAgICAgIDx0ZCBjb2xzcGFuPSIzIiBjbGFzcz0iY29udGVudGhlYWQiPiRUZXh0eyJDb25maWRlbnRpYWwgaW5mb3JtYXRpb24ifTwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgICAgPHRyPgogICAgICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgICAgICAgICAgCjwhLS0gZHRsOmJsb2NrOkNvbmZpZGVudGlhbEhpZGRlbiAtLT4KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iJFFEYXRheyJOYW1lIn0iIHZhbHVlPSIkUURhdGF7IlZhbHVlIn0iPgo8IS0tIGR0bDpibG9jazpDb25maWRlbnRpYWxIaWRkZW4gLS0+CgogICAgICAgICAgICAgIDx0YWJsZSB3aWR0aD0iODAwcHgiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjE1MCI+JFRleHR7IkNvbmZpZGVudGlhbCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGJvZHkiIGNvbHNwYW49IjIiPgogICAgICAgICAgICAgICAgICA8dGV4dGFyZWEgbmFtZT0iQ29uZmlkZW50aWFsIiByb3dzPSI0IiBjb2xzPSI3OCI+CkFueSBhbmQgYWxsIGluZm9ybWF0aW9uIGRpc2Nsb3NlZCB0byBPVFJTIHdpbGwgYmUga2VwdCBzdHJpY3RseSBjb25maWRlbnRpYWwgYW5kIGFyZSBvbmx5IHVzZWQgZm9yIHByb3ZpZGluZyBiZXR0ZXIgc3VwcG9ydCBzZXJ2aWNlcyB0byBvdXIgY3VzdG9tZXJzLgogICAgICAgICAgICAgICAgICA8L3RleHRhcmVhPgogICAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgICAgPHRkIGNvbHNwYW49IjMiIGNsYXNzPSJjb250ZW50aGVhZCI+JFRleHR7IkNvbW1lcmNpYWwgc3VwcG9ydCJ9PC90ZD4KICAgICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSIgd2lkdGg9IjE1MCI+JFRleHR7IkNvbW1lcmNpYWwgc3VwcG9ydCBJRCJ9OjwvdGQ+CiAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iY29udGVudHZhbHVlIj48aW5wdXQgdHlwZT0iVGV4dCIgbmFtZT0iU3VwcG9ydElEIiB2YWx1ZT0iIiBzaXplPSI0MCI+PC90ZD4KICAgICAgICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxmb250IGNvbG9yPSJyZWQiIHNpemU9Ii0yIj4gKCogJFRleHR7ImlmIHlvdSBhcmUgYWxyZWFkeSBhIGNvbW1lcmNpYWwgc3VwcG9ydCBjdXN0b21lciwgcGxlYXNlIGFkZCB5b3VyIHN1cHBvcnQgaWQuIChub3QgcmVxdWlyZWQhKSJ9KTwvZm9udD48L3RkPgogICAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8L3RhYmxlPgogICAgICAgICAgICA8L3RkPgogICAgICAgICAgPC90cj4KICAgICAgICAgIDx0cj4KICAgICAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50Zm9vdGVyIj4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJEb3dubG9hZCIgdmFsdWU9IiRUZXh0eyJEb3dubG9hZCJ9Ij4KICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSJTZW5kIiB2YWx1ZT0iJFRleHR7IlNlbmQifSI+CiAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICA8L3RyPgogICAgICAgIDwvdGFibGU+CiAgICAgICAgPC9mb3JtPgogICAgICA8YnI+CiAgICA8L3RkPgogIDwvdHI+CjwvdGFibGU+CjwhLS0gZHRsOmJsb2NrOkNvbmZpZGVudGlhbCAtLT4=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC5wbSAtIGFsbCByZXF1aXJlZCBzeXN0ZW0gaW5mb3JtYXRpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IFN1cHBvcnQucG0sdiAxLjIgMjAwNy8wNS8wNyAxOToyMDo1NiBzciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ7Cgp1c2Ugc3RyaWN0OwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpYTUw7CnVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RW1haWw7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZTsKCnVzZSB2YXJzIHF3KEBJU0EgJFZFUlNJT04pOwokVkVSU0lPTiA9ICckUmV2aXNpb246IDEuMiAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpTdXBwb3J0IC0gZ2xvYmFsIHN5c3RlbSBpbmZvcm1hdGlvbnMKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHJlcXVpcmVkIHN1cHBvcnQgaW5mb3JtYXRpb25zIHRvIGEgcnVubmluZyBPVFJTIHN5c3RlbS4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIFN1cHBvcnQgb2JqZWN0Cgp1c2UgS2VybmVsOjpDb25maWc7CnVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwpteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwpteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCik7CgokU3VwcG9ydE9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0LT5uZXcoCiAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgIExvZ09iamVjdCA9PiAkTG9nT2JqZWN0LAopOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAkVHlwZSA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyAoJFNlbGYsICRUeXBlKTsKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvcmVhY2ggKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KICAgICRTZWxmLT57WE1MT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpYTUwtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntEQk9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LAogICAgICAgIE1haW5PYmplY3QgPT4gJFNlbGYtPntNYWluT2JqZWN0fSwKICAgICAgICBMb2dPYmplY3QgPT4gJFNlbGYtPntMb2dPYmplY3R9LAoKICAgICk7CiAgICAkU2VsZi0+e1RpbWVPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlRpbWUtPm5ldyglUGFyYW0pOwogICAgJFNlbGYtPntFbWFpbE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6RW1haWwtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJFNlbGYtPntDb25maWdPYmplY3R9LAogICAgICAgIE1haW5PYmplY3QgPT4gJFNlbGYtPntNYWluT2JqZWN0fSwKICAgICAgICBMb2dPYmplY3QgPT4gJFNlbGYtPntMb2dPYmplY3R9LAogICAgICAgIERCT2JqZWN0ID0+ICRTZWxmLT57REJPYmplY3R9LAogICAgICAgIFRpbWVPYmplY3QgPT4gJFNlbGYtPntUaW1lT2JqZWN0fSwKICAgICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBTdXBwb3J0Q29uZmlnSGFzaEdldCgpCgpnZXQgYSBoYXNoIHJlZmVyZW5jZSB3aXRoIHJlcXVpcmVkIGNvbmZpZyBpbmZvcm1hdGlvbi4KCiAgICAkU3VwcG9ydC0+U3VwcG9ydENvbmZpZ0hhc2hHZXQoCiAgICAgICAgQ29uZmlnSGFzaCA9PiAkSGFzaFJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgU3VwcG9ydENvbmZpZ0hhc2hHZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KENvbmZpZ0hhc2gpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIGNoZWNrIGlmICRDb25maWdIYXNoIG5lIGEgSGFzaFJlZgogICAgaWYgKHJlZigkUGFyYW17Q29uZmlnSGFzaH0pIG5lICdIQVNIJykgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIkNvbmZpZ0hhc2ggbXVzdCBiZSBhIGhhc2ggcmVmZXJlbmNlISIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgICMgZ2V0IHRoZSBkaXJlY3RvcnkgbmFtZQogICAgbXkgJERpck5hbWUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpLicvS2VybmVsL1N5c3RlbS9TdXBwb3J0Lyc7CiAgICAjIHJlYWQgYWxsIGF2YWlsaWJsZSBtb2R1bGVzIGluIEBMaXN0CiAgICBteSBATGlzdCA9IGdsb2IoJERpck5hbWUuIi8qLnBtIik7CiAgICBmb3JlYWNoIG15ICRGaWxlIChATGlzdCkgewogICAgICAgICMgcmVtb3ZlIC5wbQogICAgICAgICRGaWxlID1+IHMvXi4qXC8oLis/KVwucG0kLyQxLzsKICAgICAgICBteSAkR2VuZXJpY01vZHVsZSA9ICJLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6JEZpbGUiOwogICAgICAgICMgbG9hZCBtb2R1bGUgJEdlbmVyaWNNb2R1bGUgYW5kIGNoZWNrIGlmIGxvYWRhYmxlCiAgICAgICAgaWYgKCRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJEdlbmVyaWNNb2R1bGUpKXsKICAgICAgICAgICAgIyBjcmVhdGUgbmV3IG9iamVjdAogICAgICAgICAgICBteSAkU3VwcG9ydE9iamVjdCA9ICRHZW5lcmljTW9kdWxlLT5uZXcoJXskU2VsZn0pOwogICAgICAgICAgICBpZiAoJFN1cHBvcnRPYmplY3QpIHsKICAgICAgICAgICAgICAgIG15ICRBcnJheVJlZiA9ICRTdXBwb3J0T2JqZWN0LT5TdXBwb3J0Q29uZmlnQXJyYXlHZXQoKTsKICAgICAgICAgICAgICAgIGlmIChAeyRBcnJheVJlZn0pIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17Q29uZmlnSGFzaH0tPnskRmlsZX0gPSAkQXJyYXlSZWY7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gU3VwcG9ydEluZm9HZXQoKQoKZ2V0IGEgaGFzaCByZWZlcmVuY2Ugd2l0aCBzdXBwb3J0IGluZm9ybWF0aW9uLgoKICAgICRTdXBwb3J0LT5TdXBwb3J0SW5mb0dldCgKICAgICAgICBEYXRhSGFzaCA9PiAkRGF0YUhhc2gsCiAgICAgICAgSW5wdXRIYXNoID0+ICRJbnB1dEhhc2gsCiAgICApOwoKPWN1dAoKc3ViIFN1cHBvcnRJbmZvR2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhEYXRhSGFzaCBJbnB1dEhhc2gpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIGNoZWNrIGlmICREYXRhSGFzaCBhbmQgJElucHV0SGFzaCBuZSBhIEhhc2hSZWYKICAgIGlmIChyZWYoJFBhcmFte0RhdGFIYXNofSkgbmUgJ0hBU0gnIHx8IHJlZigkUGFyYW17SW5wdXRIYXNofSkgbmUgJ0hBU0gnKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiRGF0YUhhc2ggYW5kIElucHV0SGFzaCBtdXN0IGJlIGEgaGFzaCByZWZlcmVuY2UhIik7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IHRoZSBkaXJlY3RvcnkgbmFtZQogICAgbXkgJERpck5hbWUgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpLicvS2VybmVsL1N5c3RlbS9TdXBwb3J0Lyc7CgogICAgIyByZWFkIGFsbCBhdmFpbGlibGUgbW9kdWxlcyBpbiBATGlzdAogICAgbXkgQExpc3QgPSBnbG9iKCREaXJOYW1lLiIvKi5wbSIpOwogICAgZm9yZWFjaCBteSAkRmlsZSAoQExpc3QpIHsKICAgICAgICAjIHJlbW92ZSAucG0KICAgICAgICAkRmlsZSA9fiBzL14uKlwvKC4rPylcLnBtJC8kMS87CiAgICAgICAgbXkgJEdlbmVyaWNNb2R1bGUgPSAiS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OiRGaWxlIjsKICAgICAgICAjIGxvYWQgbW9kdWxlICRHZW5lcmljTW9kdWxlIGFuZCBjaGVjayBpZiBsb2FkYWJsZQogICAgICAgIGlmICgkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCRHZW5lcmljTW9kdWxlKSl7CiAgICAgICAgICAgICMgY3JlYXRlIG5ldyBvYmplY3QKICAgICAgICAgICAgbXkgJFN1cHBvcnRPYmplY3QgPSAkR2VuZXJpY01vZHVsZS0+bmV3KCV7JFNlbGZ9KTsKICAgICAgICAgICAgaWYgKCRTdXBwb3J0T2JqZWN0ICYmICRQYXJhbXtJbnB1dEhhc2h9LT57JEZpbGV9KSB7CiAgICAgICAgICAgICAgICBteSAkQXJyYXlSZWYgPSAkU3VwcG9ydE9iamVjdC0+U3VwcG9ydEluZm9HZXQoCiAgICAgICAgICAgICAgICAgICAgTW9kdWxlSW5wdXRIYXNoID0+ICRQYXJhbXtJbnB1dEhhc2h9LT57JEZpbGV9LAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgcmV0dXJuIHZhbHVlIGlzIHZhbGlkIGEgYXJyYXlyZWYKICAgICAgICAgICAgICAgIGlmIChAeyRBcnJheVJlZn0pIHsKICAgICAgICAgICAgICAgICAgICBteSAkU3RydWN0dXJlT0sgPSAxOwogICAgICAgICAgICAgICAgICAgICMgY2hlY2sgaWYgdGhlIGFycmF5cmVmIGluY2x1ZGVzIG9ubHkgdmFsaWQgaGFzaHJlZnMKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICRFbGVtZW50IChAeyRBcnJheVJlZn0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlZigkRWxlbWVudCkgbmUgJ0hBU0gnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU3RydWN0dXJlT0sgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICgkU3RydWN0dXJlT0sgZXEgIjEiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtEYXRhSGFzaH0tPnskRmlsZX0gPSAkQXJyYXlSZWY7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIEFkbWluQ2hlY2tzR2V0KCkKCmdldCBhIGhhc2ggcmVmZXJlbmNlIHdpdGggcG9zc2liaWxpdHkgY2hlY2tzLgoKICAgIG15ICRMaXN0ID0gJFN1cHBvcnQtPkFkbWluQ2hlY2tzR2V0KERhdGFIYXNoID0+ICREYXRhSGFzaCk7Cgo9Y3V0CgpzdWIgQWRtaW5DaGVja3NHZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KERhdGFIYXNoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgIyBjaGVjayBpZiAkRGF0YUhhc2ggbmUgYSBIYXNoUmVmCiAgICBpZiAocmVmKCRQYXJhbXtEYXRhSGFzaH0pIG5lICdIQVNIJykgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIkRhdGFIYXNoIG11c3QgYmUgYSBoYXNoIHJlZmVyZW5jZSEiKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICAjIGdldCB0aGUgZGlyZWN0b3J5IG5hbWUKICAgIG15ICREaXJOYW1lID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKS4nL0tlcm5lbC9TeXN0ZW0vU3VwcG9ydC8nOwoKICAgICMgcmVhZCBhbGwgYXZhaWxpYmxlIG1vZHVsZXMgaW4gQExpc3QKICAgIG15IEBMaXN0ID0gZ2xvYigkRGlyTmFtZS4iLyoucG0iKTsKICAgIGZvcmVhY2ggbXkgJEZpbGUgKEBMaXN0KSB7CiAgICAgICAgIyByZW1vdmUgLnBtCiAgICAgICAgJEZpbGUgPX4gcy9eLipcLyguKz8pXC5wbSQvJDEvOwogICAgICAgIG15ICRHZW5lcmljTW9kdWxlID0gIktlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjokRmlsZSI7CiAgICAgICAgIyBsb2FkIG1vZHVsZSAkR2VuZXJpY01vZHVsZSBhbmQgY2hlY2sgaWYgbG9hZGFibGUKICAgICAgICBpZiAoJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgkR2VuZXJpY01vZHVsZSkpewogICAgICAgICAgICAjIGNyZWF0ZSBuZXcgb2JqZWN0CiAgICAgICAgICAgIG15ICRTdXBwb3J0T2JqZWN0ID0gJEdlbmVyaWNNb2R1bGUtPm5ldygleyRTZWxmfSk7CiAgICAgICAgICAgIGlmICgkU3VwcG9ydE9iamVjdCkgewogICAgICAgICAgICAgICAgbXkgJEFycmF5UmVmID0gJFN1cHBvcnRPYmplY3QtPkFkbWluQ2hlY2tzR2V0KCk7CiAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIHJldHVybiB2YWx1ZSBpcyB2YWxpZCBhIGFycmF5cmVmCiAgICAgICAgICAgICAgICBpZiAoQHskQXJyYXlSZWZ9KSB7CiAgICAgICAgICAgICAgICAgICAgbXkgJFN0cnVjdHVyZU9LID0gMTsKICAgICAgICAgICAgICAgICAgICAjIGNoZWNrIGlmIHRoZSBhcnJheXJlZiBpbmNsdWRlcyBvbmx5IHZhbGlkIGhhc2hyZWZzCiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCBteSAkRWxlbWVudCAoQHskQXJyYXlSZWZ9KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZWYoJEVsZW1lbnQpIG5lICdIQVNIJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFN0cnVjdHVyZU9LID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoJFN0cnVjdHVyZU9LIGVxICIxIikgewogICAgICAgICAgICAgICAgICAgICAgICAkUGFyYW17RGF0YUhhc2h9LT57JEZpbGV9ID0gJEFycmF5UmVmOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwp9Cgo9aXRlbSBYTUxTdHJpbmdDcmVhdGUoKQoKcmV0dXJucyBhIHN0cmluZyB3aXRoIHhtbC4KCiAgICBteSAkTGlzdCA9ICRTdXBwb3J0LT5YTUxTdHJpbmdDcmVhdGUoRGF0YSA9PiAkRGF0YSk7Cgo8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJpc28tODg1OS0xIj8+CjxTdXBwb3J0SW5mbz4KICAgIDxIYXJkd2FyZT4KICAgICAgICA8TWVtb3J5U3dhcENoZWNrPgogICAgICAgICAgICA8Q2hlY2s+T0s8L0NoZWNrPgogICAgICAgICAgICA8Q29tbWVudD5UaGUgSG9zdCBTeXN0ZW0gaGFzIDEwMTEgTUIgTWVtb3J5IHRvdGFsLiAxMDggTUIgTWVtb3J5IGZyZWUuIDY0MyBNQiBTd2FwIHRvdGFsLiA2NDMgTUIgU3dhcCBmcmVlLiA8L0NvbW1lbnQ+CiAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5BIE1lbW9yeSBDaGVjay4gV2UgdHJ5IHRvIGZpbmQgb3V0IGlmIFN3YXBGcmVlIDogU3dhcFRvdGFsICZsdDsgNjAgJSBvciBpZiBtb3JlIHRoYW4gMjAwIE1CIFN3YXAgaXMgdXNlZC48L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICA8TmFtZT5NZW1vcnkgU3dhcCBDaGVjazwvTmFtZT4KICAgICAgICAgICAgPEtleT5NZW1vcnlTd2FwQ2hlY2s8L0tleT4KICAgICAgICA8L01lbW9yeVN3YXBDaGVjaz4KICAgIDwvSGFyZHdhcmU+CjwvU3VwcG9ydEluZm8+Cgo9Y3V0CgpzdWIgWE1MU3RyaW5nQ3JlYXRlIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhEYXRhSGFzaCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIGlmIChyZWYoJFBhcmFte0RhdGFIYXNofSkgbmUgJ0hBU0gnKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiRGF0YUhhc2ggbXVzdCBiZSBhIGhhc2ggcmVmZXJlbmNlISIpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkWE1MSGFzaCA9IFtdOwogICAgZm9yZWFjaCBteSAkTW9kdWxlIChrZXlzICV7JFBhcmFte0RhdGFIYXNofX0pIHsKICAgICAgICBmb3JlYWNoIG15ICREYXRhSGFzaFJvdyAoQHskUGFyYW17RGF0YUhhc2h9LT57JE1vZHVsZX19KSB7CiAgICAgICAgICAgIG15ICREYXRhID0ge307CiAgICAgICAgICAgIGZvcmVhY2ggbXkgJEVsZW1lbnQgKGtleXMgJXskRGF0YUhhc2hSb3d9KSB7CiAgICAgICAgICAgICAgICBpZiAoJEVsZW1lbnQgZXEgJ0tleScpIHsKICAgICAgICAgICAgICAgICAgICBuZXh0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgJERhdGEtPnskRWxlbWVudH0tPlsxXS0+e0NvbnRlbnR9ID0gJERhdGFIYXNoUm93LT57JEVsZW1lbnR9OwogICAgICAgICAgICB9CiAgICAgICAgICAgICRYTUxIYXNoLT5bMV0tPntTdXBwb3J0SW5mb30tPlsxXS0+eyRNb2R1bGV9LT5bMV0tPnskRGF0YUhhc2hSb3ctPntLZXl9fS0+WzFdID0gJERhdGE7CiAgICAgICAgfQogICAgfQoKICAgIG15ICRYTUxTdHJpbmcgPSAkU2VsZi0+e1hNTE9iamVjdH0tPlhNTEhhc2gyWE1MKEB7JFhNTEhhc2h9KTsKCiAgICByZXR1cm4gJFhNTFN0cmluZzsKfQoKc3ViIFN1cHBvcnRTZW5kSW5mbyB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkTWVzc2FnZSA9ICIiOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KFhNTFN0cmluZykpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgc2VuZCBtYWlsIHRvIGdhdGV3YXkKICAgIGlmICgkU2VsZi0+e0VtYWlsT2JqZWN0fS0+U2VuZCgKICAgICAgICBGcm9tID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdBZG1pbkVtYWlsJyksCiAgICAgICAgVG8gPT4gJ3N1cHBvcnRAb3Rycy5jb20nLAogICAgICAgIFN1YmplY3QgPT4gJ0N1c3RvbWVyIFN5c3RlbUluZm8gZnJvbScsCiAgICAgICAgVHlwZSA9PiAndGV4dC9wbGFpbicsCiAgICAgICAgQ2hhcnNldCA9PiAndXRmLTgnLAogICAgICAgIEJvZHkgPT4gJ0N1c3RvbWVyIFN1cHBvcnRJbmZvJywKICAgICAgICBMb29wID0+IDEsICMgbm90IHJlcXVpcmVkLCByZW1vdmVzIHNtdHAgZnJvbQogICAgICAgIEF0dGFjaG1lbnQgPT4gW3sKICAgICAgICBGaWxlbmFtZSAgICA9PiAiU3VwcG9ydElELSRQYXJhbXtTdXBwb3J0SUR9LnhtbCIsCiAgICAgICAgQ29udGVudCAgICAgPT4gIiRQYXJhbXtYTUxTdHJpbmd9IiwKICAgICAgICAgICAgQ29udGVudFR5cGUgPT4gImFwcGxpY2F0aW9uL3htbCIsCiAgICAgICAgICAgIH1dLAogICAgICAgICkpIHsKICAgICAgICAgICAgJE1lc3NhZ2UgPSAiRW1haWwgc2VudCB0byB0aGUgKChvdHJzKSkgc3VwcG9ydCB0ZWFtLlxuIjsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRNZXNzYWdlID0gJ0NhblwndCBzZW5kIGVtYWlsIHRvIHRoZSAoKG90cnMpKSBzdXBwb3J0IHRlYW0hJy4iXG5cbiIuCiAgICAgICAgICAgICJZb3Ugd2lsbCBmb3VuZCB0aGUgb3RycyBzeXN0ZW0gaW5mb3JtYXRpb24gcGFja2FnZSBhdFxuIi4KICAgICAgICAgICAgIklmIHlvdSB3b3VsZCBsaWtlIHRvIHVzZSBPVFJTIHN1cHBvcnQgc2VydmljZXMgcGxlYXNlIHNlbmQgdGhlIHBhY2thZ2UgdG8gc3VwcG9ydFxAb3Rycy5jb20gb3IgY2FsbFxuIi4KICAgICAgICAgICAgIm91ciBzdXBwb3J0IHRlYW0gcGVyIHBob25lIHRvIHJldmlldyB0aGUgbmV4dCBzdGVwXG5cbiIuCiAgICAgICAgICAgICIgTW9yZSBhYm91dCBPVFJTIHN1cHBvcnQgb3IgZmFjZS10by1mYWNlIGNvbnRhY3QgaW5mb3JtYXRpb24geW91IHdpbGwgZm91bmQgYXRcbiIuCiAgICAgICAgICAgICdodHRwOi8vd3d3Lm90cnMuY29tLycuIlxuXG4iOwogICAgfQogICAgcmV0dXJuICRNZXNzYWdlOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMiAkICREYXRlOiAyMDA3LzA1LzA3IDE5OjIwOjU2ICQKCj1jdXQ=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9Dcm9uLnBtIC0gYWxsIHJlcXVpcmVkIHN5c3RlbSBpbmZvcm1hdGlvbnMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQ3Jvbi5wbSx2IDEuMS4xLjEgMjAwNy8wNS8wNyAxODo0Nzo1NSBzciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OkNyb247Cgp1c2Ugc3RyaWN0OwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4xLjEuMSAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpDcm9uIC0gZ2xvYmFsIHN5c3RlbSBpbmZvcm1hdGlvbnMKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHJlcXVpcmVkIHN5c3RlbSBpbmZvcm1hdGlvbnMgdG8gYSBydW5uaW5nIE9UUlMgaG9zdC4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIENyb24gaW5mbyBvYmplY3QKCiAgdXNlIEtlcm5lbDo6Q29uZmlnOwogIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgKTsKCiAgJFN5c3RlbUluZm9PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6Q3Jvbi0+bmV3KAogICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgTG9nT2JqZWN0ID0+ICRMb2dPYmplY3QsCiAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3JlYWNoIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQogICAgCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFN1cHBvcnRDb25maWdBcnJheUdldCgpCgpyZXR1cm4gYW4gYXJyYXkgcmVmZXJlbmNlIHdpdGggcmVxdWlyZWQgY29uZmlnIGluZm9ybWF0aW9uLgoKICAgICRBcnJheVJlZiA9ICRTdXBwb3J0LT5TdXBwb3J0Q29uZmlnQXJyYXlHZXQoKTsKICAgIAogICAgbXkgJENvbmZpZ0FycmF5ID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ID0+ICdUaWNrZXREdW1wJywKICAgICAgICAgICAgTmFtZSA9PiAnRHVtcCBUaWNrZXRzJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSB0ZWxsIG1lIGhvdyBtYW55IGxhdGVzdCBUaWNrZXRzIHdlIHNodXQgZHVtcD8nLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdTZWxlY3QnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQWxsID0+ICdBbGwnLAogICAgICAgICAgICAgICAgICAgIDAgPT4gJzAnLAogICAgICAgICAgICAgICAgICAgIDEwID0+ICdMYXN0IDEwJywKICAgICAgICAgICAgICAgICAgICAxMDAgPT4gJ0xhc3QgMTAwJywKICAgICAgICAgICAgICAgICAgICAxMDAwID0+ICdMYXN0IDEwMDAnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ID0+ICdBcGFjaGVIb21lJywKICAgICAgICAgICAgTmFtZSA9PiAnQXBhY2hlIEhvbWUgRGlyZWN0b3J5JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSB0ZWxsIG1lIHRoZSBwYXRoIHRvIHRoZSBBcGFjaGUgaG9tZSBkaXJlY3RvcnkgKC9ldGMvYXBhY2hlMiknLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICAgICAgICAgIFNpemUgPT4gNDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIF07Cgo9Y3V0CgpzdWIgU3VwcG9ydENvbmZpZ0FycmF5R2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdygpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIGNyZWF0ZSBjb25maWcgYXJyYXkKICAgIG15ICRDb25maWdBcnJheSA9IFsKCiAgICBdOwogICAgIyByZXR1cm4gY29uZmlnIGFycmF5CiAgICByZXR1cm4gJENvbmZpZ0FycmF5Owp9Cgo9aXRlbSBTdXBwb3J0SW5mb0dldCgpCgpyZXR1cm5zIGEgYXJyYXkgcmVmZXJlbmNlIHdpdGggc3VwcG9ydCBpbmZvcm1hdGlvbi4KCiRDcm9uQXJyYXkgPT4gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPT4gJ1BsYXR0Zm9ybScsCiAgICAgICAgICAgICAgICBOYW1lID0+ICdQbGF0dGZvcm0nLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnTGludXgnLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSBhZGQgbW9yZSBtZW1vcnkuJywgCiAgICAgICAgICAgICAgICBDaGVjayA9PiAnT0snLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPT4gJ1ZlcnNpb24nLAogICAgICAgICAgICAgICAgTmFtZSA9PiAnVmVyc2lvbicsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdvcGVuU1VTRSAxMC4yJywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgYWRkIG1vcmUgbWVtb3J5LicsIAogICAgICAgICAgICAgICAgQ2hlY2sgPT4gJ09LJywKICAgICAgICAgICAgfSwKICAgICAgICBdOwogICAgICAgIAo9Y3V0CgpzdWIgU3VwcG9ydEluZm9HZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJERhdGFBcnJheSA9IFtdOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KE1vZHVsZUlucHV0SGFzaCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIGlmIChyZWYoJFBhcmFte01vZHVsZUlucHV0SGFzaH0pIG5lICdIQVNIJykgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk1vZHVsZUlucHV0SGFzaCBtdXN0IGJlIGEgaGFzaCByZWZlcmVuY2UhIik7CiAgICAgICAgcmV0dXJuOwogICAgfQojICAgICMgcGxlYXNlIGFkZCBmb3IgZWFjaCBuZXcgY2hlY2sgYSBwYXJ0IGxpa2UgdGhpcwojICAgIG15ICRPbmVDaGVjayA9ICRTZWxmLT5DaGVjaygKIyAgICAgICAgVHlwZSA9PiAkUGFyYW17TW9kdWxlSW5wdXRIYXNofS0+e1R5cGV9IHx8ICcnLAojICAgICk7CiMgICAgcHVzaCAoQHskRGF0YUFycmF5fSwgJE9uZUNoZWNrKTsKCiAgICByZXR1cm4gJERhdGFBcnJheTsKfQoKPWl0ZW0gQWRtaW5DaGVja3NHZXQoKQoKcmV0dXJucyBhIGFycmF5IHJlZmVyZW5jZSB3aXRoIEFkbWluQ2hlY2tzIGluZm9ybWF0aW9uLgoKJENyb25BcnJheSA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BsYXR0Zm9ybScsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdMaW51eCcsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIGFkZCBtb3JlIG1lbW9yeS4nLCAKICAgICAgICAgICAgICAgIENoZWNrID0+ICdPSycsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnVmVyc2lvbicsCiAgICAgICAgICAgICAgICBOYW1lID0+ICdWZXJzaW9uJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ29wZW5TVVNFIDEwLjInLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSBhZGQgbW9yZSBtZW1vcnkuJywgCiAgICAgICAgICAgICAgICBDaGVjayA9PiAnT0snLAogICAgICAgICAgICB9LAogICAgICAgIF07CiAgICAgICAgCj1jdXQKCnN1YiBBZG1pbkNoZWNrc0dldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkRGF0YUFycmF5ID0gW107CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQojICAgICMgcGxlYXNlIGFkZCBmb3IgZWFjaCBuZXcgY2hlY2sgYSBwYXJ0IGxpa2UgdGhpcwojICAgIG15ICRPbmVDaGVjayA9ICRTZWxmLT5DaGVjaygpOwojICAgIHB1c2ggKEB7JERhdGFBcnJheX0sICRPbmVDaGVjayk7CgogICAgcmV0dXJuICREYXRhQXJyYXk7Cn0KCj1pdGVtIENoZWNrKCkKCnJldHVybnMgYSBoYXNoIHJlZmVyZW5jZSB3aXRoIENoZWNrIGluZm9ybWF0aW9uLgoKJENoZWNrSGFzaCA9PiAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0+ICdQbGF0dGZvcm0nLAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ0xpbnV4JywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgYWRkIG1vcmUgbWVtb3J5LicsIAogICAgICAgICAgICAgICAgQ2hlY2sgPT4gJ09LJywKICAgICAgICAgICAgfTsKCiMgY2hlY2sgaWYgY29uZmlnIHZhbHVlIGF2YWlsaWJsZQppZiAoJFBhcmFte1R5cGV9KSB7CiAgICBwcmludCBTVERFUlIgIlRZUEU6ICIgLiAkUGFyYW17VHlwZX07Cn0KICAgICAgICAKPWN1dAoKc3ViIENoZWNrIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICRSZXR1cm5IYXNoID0ge307CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgCiAgICAjIElmIHVzZWQgT1MgaXMgYSBsaW51eCBzeXN0ZW0KICAgIGlmICgkXk8gPX4gL2xpbnV4LyB8fCAvdW5peC8gfHwgL25ldGJzZC8gfHwgL2ZyZWVic2QvIHx8IC9EYXJ3aW4vKSB7CiAgICAgIAogICAgfQogICAgZWxzaWYgKCReTyA9fiAvd2luL2kpIHsjIFRPRE8gLyBBdXNnYWJlIHVudGVyIFdpbmRvd3Mgbm9jaCBwcnVlZmVuCiAgICAgICAgCiAgICB9CiAgICByZXR1cm4gJFJldHVybkhhc2g7Cn0KCjE7
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9EYXRhYmFzZS5wbSAtIGFsbCByZXF1aXJlZCBzeXN0ZW0gaW5mb3JtYXRpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IERhdGFiYXNlLnBtLHYgMS4xLjEuMSAyMDA3LzA1LzA3IDE4OjQ3OjU1IHNyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6RGF0YWJhc2U7Cgp1c2Ugc3RyaWN0OwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4xLjEuMSAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpEYXRhYmFzZSAtIGdsb2JhbCBzeXN0ZW0gaW5mb3JtYXRpb25zCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCByZXF1aXJlZCBzeXN0ZW0gaW5mb3JtYXRpb25zIHRvIGEgcnVubmluZyBPVFJTIGhvc3QuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBEYXRhYmFzZSBpbmZvIG9iamVjdAoKICB1c2UgS2VybmVsOjpDb25maWc7CiAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICApOwoKICAkU3lzdGVtSW5mb09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpEYXRhYmFzZS0+bmV3KAogICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgTG9nT2JqZWN0ID0+ICRMb2dPYmplY3QsCiAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3JlYWNoIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQogICAgCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFN1cHBvcnRDb25maWdBcnJheUdldCgpCgpyZXR1cm4gYW4gYXJyYXkgcmVmZXJlbmNlIHdpdGggcmVxdWlyZWQgY29uZmlnIGluZm9ybWF0aW9uLgoKICAgICRBcnJheVJlZiA9ICRTdXBwb3J0LT5TdXBwb3J0Q29uZmlnQXJyYXlHZXQoKTsKCiAgICBteSAkQ29uZmlnQXJyYXkgPSBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJ1RpY2tldER1bXAnLAogICAgICAgICAgICBOYW1lID0+ICdEdW1wIFRpY2tldHMnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIHRlbGwgbWUgaG93IG1hbnkgbGF0ZXN0IFRpY2tldHMgd2Ugc2h1dCBkdW1wPycsCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1NlbGVjdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBBbGwgPT4gJ0FsbCcsCiAgICAgICAgICAgICAgICAgICAgMCA9PiAnMCcsCiAgICAgICAgICAgICAgICAgICAgMTAgPT4gJ0xhc3QgMTAnLAogICAgICAgICAgICAgICAgICAgIDEwMCA9PiAnTGFzdCAxMDAnLAogICAgICAgICAgICAgICAgICAgIDEwMDAgPT4gJ0xhc3QgMTAwMCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJ0FwYWNoZUhvbWUnLAogICAgICAgICAgICBOYW1lID0+ICdBcGFjaGUgSG9tZSBEaXJlY3RvcnknLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIHRlbGwgbWUgdGhlIHBhdGggdG8gdGhlIEFwYWNoZSBob21lIGRpcmVjdG9yeSAoL2V0Yy9hcGFjaGUyKScsCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgU2l6ZSA9PiA0MCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgXTsKCj1jdXQKCnN1YiBTdXBwb3J0Q29uZmlnQXJyYXlHZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgY3JlYXRlIGNvbmZpZyBhcnJheQogICAgbXkgJENvbmZpZ0FycmF5ID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ID0+ICdUaWNrZXREdW1wJywKICAgICAgICAgICAgTmFtZSA9PiAnRHVtcCBUaWNrZXRzJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSB0ZWxsIG1lIGhvdyBtYW55IGxhdGVzdCBUaWNrZXRzIHdlIHNodXQgZHVtcD8nLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdTZWxlY3QnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQWxsID0+ICdBbGwnLAogICAgICAgICAgICAgICAgICAgIDAgPT4gJzAnLAogICAgICAgICAgICAgICAgICAgIDEwID0+ICdMYXN0IDEwJywKICAgICAgICAgICAgICAgICAgICAxMDAgPT4gJ0xhc3QgMTAwJywKICAgICAgICAgICAgICAgICAgICAxMDAwID0+ICdMYXN0IDEwMDAnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgXTsKICAgICMgcmV0dXJuIGNvbmZpZyBhcnJheQogICAgcmV0dXJuICRDb25maWdBcnJheTsKfQoKPWl0ZW0gU3VwcG9ydEluZm9HZXQoKQoKcmV0dXJucyBhIGFycmF5IHJlZmVyZW5jZSB3aXRoIHN1cHBvcnQgaW5mb3JtYXRpb24uCgokRGF0YWJhc2VBcnJheSA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BsYXR0Zm9ybScsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdMaW51eCcsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIGFkZCBtb3JlIG1lbW9yeS4nLCAKICAgICAgICAgICAgICAgIENoZWNrID0+ICdPSycsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnVmVyc2lvbicsCiAgICAgICAgICAgICAgICBOYW1lID0+ICdWZXJzaW9uJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ29wZW5TVVNFIDEwLjInLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSBhZGQgbW9yZSBtZW1vcnkuJywgCiAgICAgICAgICAgICAgICBDaGVjayA9PiAnT0snLAogICAgICAgICAgICB9LAogICAgICAgIF07CiAgICAgICAgCj1jdXQKCnN1YiBTdXBwb3J0SW5mb0dldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkRGF0YUFycmF5ID0gW107CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoTW9kdWxlSW5wdXRIYXNoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKHJlZigkUGFyYW17TW9kdWxlSW5wdXRIYXNofSkgbmUgJ0hBU0gnKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTW9kdWxlSW5wdXRIYXNoIG11c3QgYmUgYSBoYXNoIHJlZmVyZW5jZSEiKTsKICAgICAgICByZXR1cm47CiAgICB9CiMgICAgIyBwbGVhc2UgYWRkIGZvciBlYWNoIG5ldyBjaGVjayBhIHBhcnQgbGlrZSB0aGlzCiMgICAgbXkgJE9uZUNoZWNrID0gJFNlbGYtPkNoZWNrKAojICAgICAgICBUeXBlID0+ICRQYXJhbXtNb2R1bGVJbnB1dEhhc2h9LT57VHlwZX0gfHwgJycsCiMgICAgKTsKIyAgICBwdXNoIChAeyREYXRhQXJyYXl9LCAkT25lQ2hlY2spOwoKICAgIHJldHVybiAkRGF0YUFycmF5Owp9Cgo9aXRlbSBBZG1pbkNoZWNrc0dldCgpCgpyZXR1cm5zIGEgYXJyYXkgcmVmZXJlbmNlIHdpdGggQWRtaW5DaGVja3MgaW5mb3JtYXRpb24uCgokRGF0YWJhc2VBcnJheSA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BsYXR0Zm9ybScsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdMaW51eCcsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIGFkZCBtb3JlIG1lbW9yeS4nLCAKICAgICAgICAgICAgICAgIENoZWNrID0+ICdPSycsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnVmVyc2lvbicsCiAgICAgICAgICAgICAgICBOYW1lID0+ICdWZXJzaW9uJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ29wZW5TVVNFIDEwLjInLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSBhZGQgbW9yZSBtZW1vcnkuJywgCiAgICAgICAgICAgICAgICBDaGVjayA9PiAnT0snLAogICAgICAgICAgICB9LAogICAgICAgIF07CiAgICAgICAgCj1jdXQKCnN1YiBBZG1pbkNoZWNrc0dldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkRGF0YUFycmF5ID0gW107CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQojICAgICMgcGxlYXNlIGFkZCBmb3IgZWFjaCBuZXcgY2hlY2sgYSBwYXJ0IGxpa2UgdGhpcwojICAgIG15ICRPbmVDaGVjayA9ICRTZWxmLT5DaGVjaygpOwojICAgIHB1c2ggKEB7JERhdGFBcnJheX0sICRPbmVDaGVjayk7CgogICAgcmV0dXJuICREYXRhQXJyYXk7Cn0KCj1pdGVtIENoZWNrKCkKCnJldHVybnMgYSBoYXNoIHJlZmVyZW5jZSB3aXRoIENoZWNrIGluZm9ybWF0aW9uLgoKJENoZWNrSGFzaCA9PiAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0+ICdQbGF0dGZvcm0nLAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ0xpbnV4JywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgYWRkIG1vcmUgbWVtb3J5LicsIAogICAgICAgICAgICAgICAgQ2hlY2sgPT4gJ09LJywKICAgICAgICAgICAgfTsKCiMgY2hlY2sgaWYgY29uZmlnIHZhbHVlIGF2YWlsaWJsZQppZiAoJFBhcmFte1R5cGV9KSB7CiAgICBwcmludCBTVERFUlIgIlRZUEU6ICIgLiAkUGFyYW17VHlwZX07Cn0KICAgICAgICAKPWN1dAoKc3ViIENoZWNrIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICRSZXR1cm5IYXNoID0ge307CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgCiAgICAjIElmIHVzZWQgT1MgaXMgYSBsaW51eCBzeXN0ZW0KICAgIGlmICgkXk8gPX4gL2xpbnV4LyB8fCAvdW5peC8gfHwgL25ldGJzZC8gfHwgL2ZyZWVic2QvIHx8IC9EYXJ3aW4vKSB7CiAgICAgIAogICAgfQogICAgZWxzaWYgKCReTyA9fiAvd2luL2kpIHsjIFRPRE8gLyBBdXNnYWJlIHVudGVyIFdpbmRvd3Mgbm9jaCBwcnVlZmVuCiAgICAgICAgCiAgICB9CiAgICByZXR1cm4gJFJldHVybkhhc2g7Cn0KCjE7
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9IYXJkd2FyZS5wbSAtIGFsbCByZXF1aXJlZCBzeXN0ZW0gaW5mb3JtYXRpb25zCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDcgT1RSUyBHbWJILCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEhhcmR3YXJlLnBtLHYgMS4xLjEuMSAyMDA3LzA1LzA3IDE4OjQ3OjU1IHNyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6SGFyZHdhcmU7Cgp1c2Ugc3RyaWN0OwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4xLjEuMSAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpIYXJkd2FyZSAtIGdsb2JhbCBzeXN0ZW0gaW5mb3JtYXRpb25zCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCByZXF1aXJlZCBzeXN0ZW0gaW5mb3JtYXRpb25zIHRvIGEgcnVubmluZyBPVFJTIGhvc3QuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBoYXJkd2FyZSBpbmZvIG9iamVjdAoKICB1c2UgS2VybmVsOjpDb25maWc7CiAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICApOwoKICAkU3lzdGVtSW5mb09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpIYXJkd2FyZS0+bmV3KAogICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgTG9nT2JqZWN0ID0+ICRMb2dPYmplY3QsCiAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3JlYWNoIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQogICAgCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFN1cHBvcnRDb25maWdBcnJheUdldCgpCgpyZXR1cm4gYW4gYXJyYXkgcmVmZXJlbmNlIHdpdGggcmVxdWlyZWQgY29uZmlnIGluZm9ybWF0aW9uLgoKICAgICRBcnJheVJlZiA9ICRTdXBwb3J0LT5TdXBwb3J0Q29uZmlnQXJyYXlHZXQoKTsKCiAgICBteSAkQ29uZmlnQXJyYXkgPSBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJ1RpY2tldER1bXAnLAogICAgICAgICAgICBOYW1lID0+ICdEdW1wIFRpY2tldHMnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIHRlbGwgbWUgaG93IG1hbnkgbGF0ZXN0IFRpY2tldHMgd2Ugc2h1dCBkdW1wPycsCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1NlbGVjdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBBbGwgPT4gJ0FsbCcsCiAgICAgICAgICAgICAgICAgICAgMCA9PiAnMCcsCiAgICAgICAgICAgICAgICAgICAgMTAgPT4gJ0xhc3QgMTAnLAogICAgICAgICAgICAgICAgICAgIDEwMCA9PiAnTGFzdCAxMDAnLAogICAgICAgICAgICAgICAgICAgIDEwMDAgPT4gJ0xhc3QgMTAwMCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJ0FwYWNoZUhvbWUnLAogICAgICAgICAgICBOYW1lID0+ICdBcGFjaGUgSG9tZSBEaXJlY3RvcnknLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIHRlbGwgbWUgdGhlIHBhdGggdG8gdGhlIEFwYWNoZSBob21lIGRpcmVjdG9yeSAoL2V0Yy9hcGFjaGUyKScsCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgU2l6ZSA9PiA0MCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgXTsKCj1jdXQKCnN1YiBTdXBwb3J0Q29uZmlnQXJyYXlHZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgY3JlYXRlIGNvbmZpZyBhcnJheQogICAgbXkgJENvbmZpZ0FycmF5ID0gWwogICAgXTsKICAgICMgcmV0dXJuIGNvbmZpZyBhcnJheQogICAgcmV0dXJuICRDb25maWdBcnJheTsKfQoKPWl0ZW0gU3VwcG9ydEluZm9HZXQoKQoKcmV0dXJucyBhIGFycmF5IHJlZmVyZW5jZSB3aXRoIHN1cHBvcnQgaW5mb3JtYXRpb24uCgokSGFyZHdhcmVBcnJheSA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BsYXR0Zm9ybScsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdMaW51eCcsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIGFkZCBtb3JlIG1lbW9yeS4nLCAKICAgICAgICAgICAgICAgIENoZWNrID0+ICdPSycsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnVmVyc2lvbicsCiAgICAgICAgICAgICAgICBOYW1lID0+ICdWZXJzaW9uJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ29wZW5TVVNFIDEwLjInLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSBhZGQgbW9yZSBtZW1vcnkuJywgCiAgICAgICAgICAgICAgICBDaGVjayA9PiAnT0snLAogICAgICAgICAgICB9LAogICAgICAgIF07CiAgICAgICAgCj1jdXQKCnN1YiBTdXBwb3J0SW5mb0dldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkRGF0YUFycmF5ID0gW107CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoTW9kdWxlSW5wdXRIYXNoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKHJlZigkUGFyYW17TW9kdWxlSW5wdXRIYXNofSkgbmUgJ0hBU0gnKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTW9kdWxlSW5wdXRIYXNoIG11c3QgYmUgYSBoYXNoIHJlZmVyZW5jZSEiKTsKICAgICAgICByZXR1cm47CiAgICB9CiAgICAjIHBsZWFzZSBhZGQgZm9yIGVhY2ggbmV3IGNoZWNrIGEgcGFydCBsaWtlIHRoaXMKICAgIG15ICRPbmVDaGVjayA9ICRTZWxmLT5NZW1vcnlTd2FwQ2hlY2soCiAgICAgICAgVHlwZSA9PiAkUGFyYW17TW9kdWxlSW5wdXRIYXNofS0+e1R5cGV9IHx8ICcnLAogICAgKTsKICAgIHB1c2ggKEB7JERhdGFBcnJheX0sICRPbmVDaGVjayk7CgogICAgcmV0dXJuICREYXRhQXJyYXk7Cn0KCj1pdGVtIEFkbWluQ2hlY2tzR2V0KCkKCnJldHVybnMgYSBhcnJheSByZWZlcmVuY2Ugd2l0aCBBZG1pbkNoZWNrcyBpbmZvcm1hdGlvbi4KCiRIYXJkd2FyZUFycmF5ID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0+ICdQbGF0dGZvcm0nLAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ0xpbnV4JywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgYWRkIG1vcmUgbWVtb3J5LicsIAogICAgICAgICAgICAgICAgQ2hlY2sgPT4gJ09LJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0+ICdWZXJzaW9uJywKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1ZlcnNpb24nLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnb3BlblNVU0UgMTAuMicsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIGFkZCBtb3JlIG1lbW9yeS4nLCAKICAgICAgICAgICAgICAgIENoZWNrID0+ICdPSycsCiAgICAgICAgICAgIH0sCiAgICAgICAgXTsKICAgICAgICAKPWN1dAoKc3ViIEFkbWluQ2hlY2tzR2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICREYXRhQXJyYXkgPSBbXTsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdygpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIHBsZWFzZSBhZGQgZm9yIGVhY2ggbmV3IGNoZWNrIGEgcGFydCBsaWtlIHRoaXMKICAgIG15ICRPbmVDaGVjayA9ICRTZWxmLT5NZW1vcnlTd2FwQ2hlY2soKTsKICAgIHB1c2ggKEB7JERhdGFBcnJheX0sICRPbmVDaGVjayk7CgogICAgcmV0dXJuICREYXRhQXJyYXk7Cn0KCj1pdGVtIE1lbW9yeVN3YXBDaGVjaygpCgpyZXR1cm5zIGEgaGFzaCByZWZlcmVuY2Ugd2l0aCBNZW1vcnlTd2FwQ2hlY2sgaW5mb3JtYXRpb24uCgokTWVtb3J5U3dhcENoZWNrSGFzaCA9PiAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0+ICdQbGF0dGZvcm0nLAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ0xpbnV4JywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgYWRkIG1vcmUgbWVtb3J5LicsIAogICAgICAgICAgICAgICAgQ2hlY2sgPT4gJ09LJywKICAgICAgICAgICAgfTsKCiMgY2hlY2sgaWYgY29uZmlnIHZhbHVlIGF2YWlsaWJsZQppZiAoJFBhcmFte1R5cGV9KSB7CiAgICBwcmludCBTVERFUlIgIlRZUEU6ICIgLiAkUGFyYW17VHlwZX07Cn0KICAgICAgICAKPWN1dAoKc3ViIE1lbW9yeVN3YXBDaGVjayB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkUmV0dXJuSGFzaCA9IHt9OwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgIAogICAgbXkgJU1lbVRtcEluZm8gPSAoKTsKICAgICMgSWYgdXNlZCBPUyBpcyBhIGxpbnV4IHN5c3RlbQogICAgaWYgKCReTyA9fiAvbGludXgvIHx8IC91bml4LyB8fCAvbmV0YnNkLyB8fCAvZnJlZWJzZC8gfHwgL0Rhcndpbi8pIHsKICAgICAgICBpZiAoLWUgIi9wcm9jL21lbWluZm8iKSB7CiAgICAgICAgICAgIG9wZW4oTUVNSU5GT0ZJTEUsICI8L3Byb2MvbWVtaW5mbyIpOwogICAgICAgICAgICB3aGlsZSg8TUVNSU5GT0ZJTEU+KSB7CiAgICAgICAgICAgICAgICBteSAkVG1wTGluZSA9ICRfOwogICAgICAgICAgICAgICAgaWYgKCRUbXBMaW5lID1+IC9NZW1Ub3RhbC8pIHsKICAgICAgICAgICAgICAgICAgICAkVG1wTGluZSA9fiBzL14uKj8oXGQrKS4qJC8kMS87IAogICAgICAgICAgICAgICAgICAgICRNZW1UbXBJbmZve01lbW9yeVN3YXBDaGVja317TWVtVG90YWx9ID0gJFRtcExpbmU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoJFRtcExpbmUgPX4gL01lbUZyZWUvKSB7CiAgICAgICAgICAgICAgICAgICAgJFRtcExpbmUgPX4gcy9eLio/KFxkKykuKiQvJDEvOwogICAgICAgICAgICAgICAgICAgICRNZW1UbXBJbmZve01lbW9yeVN3YXBDaGVja317TWVtRnJlZX0gPSAkVG1wTGluZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICgkVG1wTGluZSA9fiAvU3dhcFRvdGFsLykgewogICAgICAgICAgICAgICAgICAgICRUbXBMaW5lID1+IHMvXi4qPyhcZCspLiokLyQxLzsKICAgICAgICAgICAgICAgICAgICAkTWVtVG1wSW5mb3tNZW1vcnlTd2FwQ2hlY2t9e1N3YXBUb3RhbH0gPSAkVG1wTGluZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2lmICgkVG1wTGluZSA9fiAvU3dhcEZyZWUvKSB7CiAgICAgICAgICAgICAgICAgICAgJFRtcExpbmUgPX4gcy9eLio/KFxkKykuKiQvJDEvOwogICAgICAgICAgICAgICAgICAgICRNZW1UbXBJbmZve01lbW9yeVN3YXBDaGVja317U3dhcEZyZWV9ID0gJFRtcExpbmU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2xvc2UoTUVNSU5GT0ZJTEUpOwogICAgICAgIH0KICAgIH0KICAgIGVsc2lmICgkXk8gPX4gL3dpbi9pKSB7IyBUT0RPIC8gQXVzZ2FiZSB1bnRlciBXaW5kb3dzIG5vY2ggcHJ1ZWZlbgogICAgICAgIAogICAgfQogICAgICAgIAogICAgIyBidWlsZCByZXR1cm4gaGFzaAogICAgbXkgJERlc2NyaWJ0aW9uID0gJ1RoZSBIb3N0IFN5c3RlbSBoYXMgJwogICAgICAgIC5zcHJpbnRmICgiJS4wZiIsICgkTWVtVG1wSW5mb3tNZW1vcnlTd2FwQ2hlY2t9e01lbVRvdGFsfSAvIDEwMjQpKSAuICIgTUIgTWVtb3J5IHRvdGFsLiAiIAogICAgICAgIC5zcHJpbnRmICgiJS4wZiIsICgkTWVtVG1wSW5mb3tNZW1vcnlTd2FwQ2hlY2t9e01lbUZyZWV9IC8gMTAyNCkpIC4gIiBNQiBNZW1vcnkgZnJlZS4gIgogICAgICAgIC5zcHJpbnRmICgiJS4wZiIsICgkTWVtVG1wSW5mb3tNZW1vcnlTd2FwQ2hlY2t9e1N3YXBUb3RhbH0gLyAxMDI0KSkgLiAiIE1CIFN3YXAgdG90YWwuICIKICAgICAgICAuc3ByaW50ZiAoIiUuMGYiLCAoJE1lbVRtcEluZm97TWVtb3J5U3dhcENoZWNrfXtTd2FwRnJlZX0gLyAxMDI0KSkgLiAiIE1CIFN3YXAgZnJlZS4gIjsKICAgIAogICAgaWYgKCgoJE1lbVRtcEluZm97TWVtb3J5U3dhcENoZWNrfXtTd2FwRnJlZX0pLygkTWVtVG1wSW5mb3tNZW1vcnlTd2FwQ2hlY2t9e1N3YXBUb3RhbH0pIDwgNjApIHx8CiAgICAgICAgKCgkTWVtVG1wSW5mb3tNZW1vcnlTd2FwQ2hlY2t9e1N3YXBUb3RhbH0pLSgkTWVtVG1wSW5mb3tNZW1vcnlTd2FwQ2hlY2t9e1N3YXBGcmVlfSkgPiAyMDAwMCkKICAgICkgewogICAgICAgICRSZXR1cm5IYXNoID0gewogICAgICAgICAgICBLZXkgPT4gJ01lbW9yeVN3YXBDaGVjaycsCiAgICAgICAgICAgIE5hbWUgPT4gJ01lbW9yeSBTd2FwIENoZWNrJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ0EgTWVtb3J5IENoZWNrLiBXZSB0cnkgdG8gZmluZCBvdXQgaWYgJwogICAgICAgICAgICAgICAgLiJTd2FwRnJlZSA6IFN3YXBUb3RhbCA8IDYwICUiCiAgICAgICAgICAgICAgICAuIiBvciBpZiBtb3JlIHRoYW4gMjAwIE1CIFN3YXAgaXMgdXNlZC4iLAogICAgICAgICAgICBDb21tZW50ID0+ICIkRGVzY3JpYnRpb24iLCAKICAgICAgICAgICAgQ2hlY2sgPT4gJ09LJywKICAgICAgICB9OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFJldHVybkhhc2ggPSB7CiAgICAgICAgICAgIEtleSA9PiAnTWVtb3J5U3dhcENoZWNrJywKICAgICAgICAgICAgTmFtZSA9PiAnQSBNZW1vcnkgQ2hlY2suIFdlIHRyeSB0byBmaW5kIG91dCBpZiAnCiAgICAgICAgICAgICAgICAuIlN3YXBGcmVlIDogU3dhcFRvdGFsIDwgNjAgJSIKICAgICAgICAgICAgICAgIC4iIG9yIGlmIG1vcmUgdGhhbiAyMDAgTUIgU3dhcCBpcyB1c2VkLiIsCiAgICAgICAgICAgIENvbW1lbnQgPT4gIiREZXNjcmlidGlvbiIsIAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnQSBNZW1vcnkgQ2hlY2suJywKICAgICAgICAgICAgQ2hlY2sgPT4gJ0ZhaWxlZCcsCiAgICAgICAgfTsKICAgIH0KICAgIHJldHVybiAkUmV0dXJuSGFzaDsKfQoKMTs=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9PVFJTLnBtIC0gYWxsIHJlcXVpcmVkIHN5c3RlbSBpbmZvcm1hdGlvbnMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwNyBPVFJTIEdtYkgsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogT1RSUy5wbSx2IDEuMS4xLjEgMjAwNy8wNS8wNyAxODo0Nzo1NSBzciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6Ok9UUlM7Cgp1c2Ugc3RyaWN0OwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4xLjEuMSAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpPVFJTIC0gZ2xvYmFsIHN5c3RlbSBpbmZvcm1hdGlvbnMKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHJlcXVpcmVkIHN5c3RlbSBpbmZvcm1hdGlvbnMgdG8gYSBydW5uaW5nIE9UUlMgaG9zdC4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIE9UUlMgaW5mbyBvYmplY3QKCiAgdXNlIEtlcm5lbDo6Q29uZmlnOwogIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgKTsKCiAgJFN5c3RlbUluZm9PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6U3VwcG9ydDo6T1RSUy0+bmV3KAogICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgTG9nT2JqZWN0ID0+ICRMb2dPYmplY3QsCiAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3JlYWNoIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQogICAgCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFN1cHBvcnRDb25maWdBcnJheUdldCgpCgpyZXR1cm4gYW4gYXJyYXkgcmVmZXJlbmNlIHdpdGggcmVxdWlyZWQgY29uZmlnIGluZm9ybWF0aW9uLgoKICAgICRBcnJheVJlZiA9ICRTdXBwb3J0LT5TdXBwb3J0Q29uZmlnQXJyYXlHZXQoKTsKCiAgICBteSAkQ29uZmlnQXJyYXkgPSBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJ1RpY2tldER1bXAnLAogICAgICAgICAgICBOYW1lID0+ICdEdW1wIFRpY2tldHMnLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIHRlbGwgbWUgaG93IG1hbnkgbGF0ZXN0IFRpY2tldHMgd2Ugc2h1dCBkdW1wPycsCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1NlbGVjdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgICAgICBBbGwgPT4gJ0FsbCcsCiAgICAgICAgICAgICAgICAgICAgMCA9PiAnMCcsCiAgICAgICAgICAgICAgICAgICAgMTAgPT4gJ0xhc3QgMTAnLAogICAgICAgICAgICAgICAgICAgIDEwMCA9PiAnTGFzdCAxMDAnLAogICAgICAgICAgICAgICAgICAgIDEwMDAgPT4gJ0xhc3QgMTAwMCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJ0FwYWNoZUhvbWUnLAogICAgICAgICAgICBOYW1lID0+ICdBcGFjaGUgSG9tZSBEaXJlY3RvcnknLAogICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIHRlbGwgbWUgdGhlIHBhdGggdG8gdGhlIEFwYWNoZSBob21lIGRpcmVjdG9yeSAoL2V0Yy9hcGFjaGUyKScsCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgU2l6ZSA9PiA0MCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgXTsKCj1jdXQKCnN1YiBTdXBwb3J0Q29uZmlnQXJyYXlHZXQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KCkpIHsKICAgICAgICBpZiAoISRQYXJhbXskX30pIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KICAgICMgY3JlYXRlIGNvbmZpZyBhcnJheQogICAgbXkgJENvbmZpZ0FycmF5ID0gWwoKICAgIF07CiAgICAjIHJldHVybiBjb25maWcgYXJyYXkKICAgIHJldHVybiAkQ29uZmlnQXJyYXk7Cn0KCj1pdGVtIFN1cHBvcnRJbmZvR2V0KCkKCnJldHVybnMgYSBhcnJheSByZWZlcmVuY2Ugd2l0aCBzdXBwb3J0IGluZm9ybWF0aW9uLgoKJE9UUlNBcnJheSA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BsYXR0Zm9ybScsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdMaW51eCcsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIGFkZCBtb3JlIG1lbW9yeS4nLCAKICAgICAgICAgICAgICAgIENoZWNrID0+ICdPSycsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnVmVyc2lvbicsCiAgICAgICAgICAgICAgICBOYW1lID0+ICdWZXJzaW9uJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ29wZW5TVVNFIDEwLjInLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSBhZGQgbW9yZSBtZW1vcnkuJywgCiAgICAgICAgICAgICAgICBDaGVjayA9PiAnT0snLAogICAgICAgICAgICB9LAogICAgICAgIF07CiAgICAgICAgCj1jdXQKCnN1YiBTdXBwb3J0SW5mb0dldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkRGF0YUFycmF5ID0gW107CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoTW9kdWxlSW5wdXRIYXNoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKHJlZigkUGFyYW17TW9kdWxlSW5wdXRIYXNofSkgbmUgJ0hBU0gnKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTW9kdWxlSW5wdXRIYXNoIG11c3QgYmUgYSBoYXNoIHJlZmVyZW5jZSEiKTsKICAgICAgICByZXR1cm47CiAgICB9CiMgICAgIyBwbGVhc2UgYWRkIGZvciBlYWNoIG5ldyBjaGVjayBhIHBhcnQgbGlrZSB0aGlzCiMgICAgbXkgJE9uZUNoZWNrID0gJFNlbGYtPkNoZWNrKAojICAgICAgICBUeXBlID0+ICRQYXJhbXtNb2R1bGVJbnB1dEhhc2h9LT57VHlwZX0gfHwgJycsCiMgICAgKTsKIyAgICBwdXNoIChAeyREYXRhQXJyYXl9LCAkT25lQ2hlY2spOwoKICAgIHJldHVybiAkRGF0YUFycmF5Owp9Cgo9aXRlbSBBZG1pbkNoZWNrc0dldCgpCgpyZXR1cm5zIGEgYXJyYXkgcmVmZXJlbmNlIHdpdGggQWRtaW5DaGVja3MgaW5mb3JtYXRpb24uCgokT1RSU0FycmF5ID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0+ICdQbGF0dGZvcm0nLAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ0xpbnV4JywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgYWRkIG1vcmUgbWVtb3J5LicsIAogICAgICAgICAgICAgICAgQ2hlY2sgPT4gJ09LJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0+ICdWZXJzaW9uJywKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1ZlcnNpb24nLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnb3BlblNVU0UgMTAuMicsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIGFkZCBtb3JlIG1lbW9yeS4nLCAKICAgICAgICAgICAgICAgIENoZWNrID0+ICdPSycsCiAgICAgICAgICAgIH0sCiAgICAgICAgXTsKICAgICAgICAKPWN1dAoKc3ViIEFkbWluQ2hlY2tzR2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICREYXRhQXJyYXkgPSBbXTsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdygpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiMgICAgIyBwbGVhc2UgYWRkIGZvciBlYWNoIG5ldyBjaGVjayBhIHBhcnQgbGlrZSB0aGlzCiMgICAgbXkgJE9uZUNoZWNrID0gJFNlbGYtPkNoZWNrKCk7CiMgICAgcHVzaCAoQHskRGF0YUFycmF5fSwgJE9uZUNoZWNrKTsKCiAgICByZXR1cm4gJERhdGFBcnJheTsKfQoKPWl0ZW0gQ2hlY2soKQoKcmV0dXJucyBhIGhhc2ggcmVmZXJlbmNlIHdpdGggQ2hlY2sgaW5mb3JtYXRpb24uCgokQ2hlY2tIYXNoID0+IAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBLZXkgPT4gJ1BsYXR0Zm9ybScsCiAgICAgICAgICAgICAgICBOYW1lID0+ICdQbGF0dGZvcm0nLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnTGludXgnLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSBhZGQgbW9yZSBtZW1vcnkuJywgCiAgICAgICAgICAgICAgICBDaGVjayA9PiAnT0snLAogICAgICAgICAgICB9OwoKIyBjaGVjayBpZiBjb25maWcgdmFsdWUgYXZhaWxpYmxlCmlmICgkUGFyYW17VHlwZX0pIHsKICAgIHByaW50IFNUREVSUiAiVFlQRTogIiAuICRQYXJhbXtUeXBlfTsKfQogICAgICAgIAo9Y3V0CgpzdWIgQ2hlY2sgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgbXkgJFJldHVybkhhc2ggPSB7fTsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdygpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAKICAgICMgSWYgdXNlZCBPUyBpcyBhIGxpbnV4IHN5c3RlbQogICAgaWYgKCReTyA9fiAvbGludXgvIHx8IC91bml4LyB8fCAvbmV0YnNkLyB8fCAvZnJlZWJzZC8gfHwgL0Rhcndpbi8pIHsKICAgICAgCiAgICB9CiAgICBlbHNpZiAoJF5PID1+IC93aW4vaSkgeyMgVE9ETyAvIEF1c2dhYmUgdW50ZXIgV2luZG93cyBub2NoIHBydWVmZW4KICAgICAgICAKICAgIH0KICAgIHJldHVybiAkUmV0dXJuSGFzaDsKfQoKMTs=
IyAtLQojIEtlcm5lbC9TeXN0ZW0vU3VwcG9ydC9XZWJzZXJ2ZXIucG0gLSBhbGwgcmVxdWlyZWQgc3lzdGVtIGluZm9ybWF0aW9ucwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA3IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBXZWJzZXJ2ZXIucG0sdiAxLjEuMS4xIDIwMDcvMDUvMDcgMTg6NDc6NTUgc3IgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpXZWJzZXJ2ZXI7Cgp1c2Ugc3RyaWN0OwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4xLjEuMSAkJzsKJFZFUlNJT04gPX4gcy9eXCQuKjpcVyguKilcVy4rPyQvJDEvOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpTdXBwb3J0OjpXZWJzZXJ2ZXIgLSBnbG9iYWwgc3lzdGVtIGluZm9ybWF0aW9ucwoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgcmVxdWlyZWQgc3lzdGVtIGluZm9ybWF0aW9ucyB0byBhIHJ1bm5pbmcgT1RSUyBob3N0LgoKPWhlYWQxIFBVQkxJQyBJTlRFUkZBQ0UKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgV2Vic2VydmVyIGluZm8gb2JqZWN0CgogIHVzZSBLZXJuZWw6OkNvbmZpZzsKICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICk7CgogICRTeXN0ZW1JbmZvT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OlN1cHBvcnQ6OldlYnNlcnZlci0+bmV3KAogICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgTG9nT2JqZWN0ID0+ICRMb2dPYmplY3QsCiAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgJFR5cGUgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MgKCRTZWxmLCAkVHlwZSk7CiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3JlYWNoIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQogICAgCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFN1cHBvcnRDb25maWdBcnJheUdldCgpCgpyZXR1cm4gYW4gYXJyYXkgcmVmZXJlbmNlIHdpdGggcmVxdWlyZWQgY29uZmlnIGluZm9ybWF0aW9uLgoKICAgICRBcnJheVJlZiA9ICRTdXBwb3J0LT5TdXBwb3J0Q29uZmlnQXJyYXlHZXQoKTsKICAgIAogICAgbXkgJENvbmZpZ0FycmF5ID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ID0+ICdUaWNrZXREdW1wJywKICAgICAgICAgICAgTmFtZSA9PiAnRHVtcCBUaWNrZXRzJywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSB0ZWxsIG1lIGhvdyBtYW55IGxhdGVzdCBUaWNrZXRzIHdlIHNodXQgZHVtcD8nLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdTZWxlY3QnLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgQWxsID0+ICdBbGwnLAogICAgICAgICAgICAgICAgICAgIDAgPT4gJzAnLAogICAgICAgICAgICAgICAgICAgIDEwID0+ICdMYXN0IDEwJywKICAgICAgICAgICAgICAgICAgICAxMDAgPT4gJ0xhc3QgMTAwJywKICAgICAgICAgICAgICAgICAgICAxMDAwID0+ICdMYXN0IDEwMDAnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ID0+ICdBcGFjaGVIb21lJywKICAgICAgICAgICAgTmFtZSA9PiAnQXBhY2hlIEhvbWUgRGlyZWN0b3J5JywKICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSB0ZWxsIG1lIHRoZSBwYXRoIHRvIHRoZSBBcGFjaGUgaG9tZSBkaXJlY3RvcnkgKC9ldGMvYXBhY2hlMiknLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICAgICAgICAgIFNpemUgPT4gNDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIF07Cgo9Y3V0CgpzdWIgU3VwcG9ydENvbmZpZ0FycmF5R2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdygpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICAjIGNyZWF0ZSBjb25maWcgYXJyYXkKICAgIG15ICRDb25maWdBcnJheSA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSA9PiAnQXBhY2hlSG9tZScsCiAgICAgICAgICAgIE5hbWUgPT4gJ0FwYWNoZSBIb21lIERpcmVjdG9yeScsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgdGVsbCBtZSB0aGUgcGF0aCB0byB0aGUgQXBhY2hlIGhvbWUgZGlyZWN0b3J5ICgvZXRjL2FwYWNoZTIpJywKICAgICAgICAgICAgSW5wdXQgPT4gewogICAgICAgICAgICAgICAgVHlwZSA9PiAnVGV4dCcsCiAgICAgICAgICAgICAgICBTaXplID0+IDQwLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgPT4gJ0FwYWNoZUxvZycsCiAgICAgICAgICAgIE5hbWUgPT4gJ0FwYWNoZSBMb2cgRmlsZScsCiAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgdGVsbCBtZSB0aGUgcGF0aCB0byB0aGUgQXBhY2hlIGxvZyBmaWxlLCB1c2VkIGZvciBPVFJTICgvdmFyL2xvZy9hcGFjaGUyL2Vycm9yX2xvZyknLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdUZXh0JywKICAgICAgICAgICAgICAgIFNpemUgPT4gNDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgIF07CiAgICAjIHJldHVybiBjb25maWcgYXJyYXkKICAgIHJldHVybiAkQ29uZmlnQXJyYXk7Cn0KCj1pdGVtIFN1cHBvcnRJbmZvR2V0KCkKCnJldHVybnMgYSBhcnJheSByZWZlcmVuY2Ugd2l0aCBzdXBwb3J0IGluZm9ybWF0aW9uLgoKJFdlYnNlcnZlckFycmF5ID0+IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0+ICdQbGF0dGZvcm0nLAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ0xpbnV4JywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgYWRkIG1vcmUgbWVtb3J5LicsIAogICAgICAgICAgICAgICAgQ2hlY2sgPT4gJ09LJywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0+ICdWZXJzaW9uJywKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1ZlcnNpb24nLAogICAgICAgICAgICAgICAgQ29tbWVudCA9PiAnb3BlblNVU0UgMTAuMicsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIGFkZCBtb3JlIG1lbW9yeS4nLCAKICAgICAgICAgICAgICAgIENoZWNrID0+ICdPSycsCiAgICAgICAgICAgIH0sCiAgICAgICAgXTsKICAgICAgICAKPWN1dAoKc3ViIFN1cHBvcnRJbmZvR2V0IHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICREYXRhQXJyYXkgPSBbXTsKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3JlYWNoIChxdyhNb2R1bGVJbnB1dEhhc2gpKSB7CiAgICAgICAgaWYgKCEkUGFyYW17JF99KSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIik7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBpZiAocmVmKCRQYXJhbXtNb2R1bGVJbnB1dEhhc2h9KSBuZSAnSEFTSCcpIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJNb2R1bGVJbnB1dEhhc2ggbXVzdCBiZSBhIGhhc2ggcmVmZXJlbmNlISIpOwogICAgICAgIHJldHVybjsKICAgIH0KIyAgICAjIHBsZWFzZSBhZGQgZm9yIGVhY2ggbmV3IGNoZWNrIGEgcGFydCBsaWtlIHRoaXMKIyAgICBteSAkT25lQ2hlY2sgPSAkU2VsZi0+Q2hlY2soCiMgICAgICAgIFR5cGUgPT4gJFBhcmFte01vZHVsZUlucHV0SGFzaH0tPntUeXBlfSB8fCAnJywKIyAgICApOwojICAgIHB1c2ggKEB7JERhdGFBcnJheX0sICRPbmVDaGVjayk7CgogICAgcmV0dXJuICREYXRhQXJyYXk7Cn0KCj1pdGVtIEFkbWluQ2hlY2tzR2V0KCkKCnJldHVybnMgYSBhcnJheSByZWZlcmVuY2Ugd2l0aCBBZG1pbkNoZWNrcyBpbmZvcm1hdGlvbi4KCiRXZWJzZXJ2ZXJBcnJheSA9PiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIE5hbWUgPT4gJ1BsYXR0Zm9ybScsCiAgICAgICAgICAgICAgICBDb21tZW50ID0+ICdMaW51eCcsCiAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbiA9PiAnUGxlYXNlIGFkZCBtb3JlIG1lbW9yeS4nLCAKICAgICAgICAgICAgICAgIENoZWNrID0+ICdPSycsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIEtleSA9PiAnVmVyc2lvbicsCiAgICAgICAgICAgICAgICBOYW1lID0+ICdWZXJzaW9uJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ29wZW5TVVNFIDEwLjInLAogICAgICAgICAgICAgICAgRGVzY3JpcHRpb24gPT4gJ1BsZWFzZSBhZGQgbW9yZSBtZW1vcnkuJywgCiAgICAgICAgICAgICAgICBDaGVjayA9PiAnT0snLAogICAgICAgICAgICB9LAogICAgICAgIF07CiAgICAgICAgCj1jdXQKCnN1YiBBZG1pbkNoZWNrc0dldCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJVBhcmFtID0gQF87CiAgICBteSAkRGF0YUFycmF5ID0gW107CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQojICAgICMgcGxlYXNlIGFkZCBmb3IgZWFjaCBuZXcgY2hlY2sgYSBwYXJ0IGxpa2UgdGhpcwojICAgIG15ICRPbmVDaGVjayA9ICRTZWxmLT5DaGVjaygpOwojICAgIHB1c2ggKEB7JERhdGFBcnJheX0sICRPbmVDaGVjayk7CgogICAgcmV0dXJuICREYXRhQXJyYXk7Cn0KCj1pdGVtIENoZWNrKCkKCnJldHVybnMgYSBoYXNoIHJlZmVyZW5jZSB3aXRoIENoZWNrIGluZm9ybWF0aW9uLgoKJENoZWNrSGFzaCA9PiAKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgS2V5ID0+ICdQbGF0dGZvcm0nLAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUGxhdHRmb3JtJywKICAgICAgICAgICAgICAgIENvbW1lbnQgPT4gJ0xpbnV4JywKICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uID0+ICdQbGVhc2UgYWRkIG1vcmUgbWVtb3J5LicsIAogICAgICAgICAgICAgICAgQ2hlY2sgPT4gJ09LJywKICAgICAgICAgICAgfTsKCiMgY2hlY2sgaWYgY29uZmlnIHZhbHVlIGF2YWlsaWJsZQppZiAoJFBhcmFte1R5cGV9KSB7CiAgICBwcmludCBTVERFUlIgIlRZUEU6ICIgLiAkUGFyYW17VHlwZX07Cn0KICAgICAgICAKPWN1dAoKc3ViIENoZWNrIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKICAgIG15ICRSZXR1cm5IYXNoID0ge307CiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yZWFjaCAocXcoKSkgewogICAgICAgIGlmICghJFBhcmFteyRffSkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyhQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgCiAgICAjIElmIHVzZWQgT1MgaXMgYSBsaW51eCBzeXN0ZW0KICAgIGlmICgkXk8gPX4gL2xpbnV4LyB8fCAvdW5peC8gfHwgL25ldGJzZC8gfHwgL2ZyZWVic2QvIHx8IC9EYXJ3aW4vKSB7CiAgICAgIAogICAgfQogICAgZWxzaWYgKCReTyA9fiAvd2luL2kpIHsjIFRPRE8gLyBBdXNnYWJlIHVudGVyIFdpbmRvd3Mgbm9jaCBwcnVlZmVuCiAgICAgICAgCiAgICB9CiAgICByZXR1cm4gJFJldHVybkhhc2g7Cn0KCjE7