Benchmark 1.1.2 OTRS GmbH http://otrs.org/ GNU GENERAL PUBLIC LICENSE Version 2, June 1991 fixed change log format upgrade to 2.1.x code clean up add OTRS 2.1 support New package A simple benchmark application. Ein einfache Benchmark Applikation. 2.1.x 2006-10-17 23:04:45 yourhost.example.com PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8b3Ryc19jb25maWcgdmVyc2lvbj0iMS4wIiBpbml0PSJBcHBsaWNhdGlvbiI+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWRtaW5CZW5jaG1hcmsiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgQWRtaW5CZW5jaCBvYmplY3QgIGluIHRoZSBhZG1pbiBhcmVhLjwvRGVzY3JpcHRpb24+RGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5Gcm9udGVuZG1vZHVsLVJlZ2lzdHJhdGlvbiBkZXMgQWRtaW5CZW5jaC1PYmpla3RzIGltIEFkbWluLUJlcmVpY2guPC9EZXNjcmlwdGlvbj5EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+QmVuY2htYXJrPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFkbWluOjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8VGl0bGU+QmVuY2htYXJrPC9UaXRsZT4KICAgICAgICAgICAgICAgIDxHcm91cD5hZG1pbjwvR3JvdXA+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+QWRtaW4tQmVuY2g8L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+QWRtaW48L05hdkJhck5hbWU+CiAgICAgICAgICAgICAgICA8TmF2QmFyTW9kdWxlPgogICAgICAgICAgICAgICAgICAgIDxNb2R1bGU+S2VybmVsOjpPdXRwdXQ6OkhUTUw6Ok5hdkJhck1vZHVsZUFkbWluPC9Nb2R1bGU+CiAgICAgICAgICAgICAgICAgICAgPE5hbWU+QmVuY2htYXJrPC9OYW1lPgogICAgICAgICAgICAgICAgICAgIDxCbG9jaz5CbG9jazQ8L0Jsb2NrPgogICAgICAgICAgICAgICAgICAgIDxQcmlvPjIxMDA8L1ByaW8+CiAgICAgICAgICAgICAgICA8L05hdkJhck1vZHVsZT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+Cjwvb3Ryc19jb25maWc+Cg== IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FkbWluQmVuY2htYXJrLnBtIC0gYSBiZW5jaCBtYXJrIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA2IE9UUlMgR21iSCwgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZG1pbkJlbmNobWFyay5wbSx2IDEuMiAyMDA2LzEwLzE3IDIwOjI2OjQ0IG1hcnRpbiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZG1pbkJlbmNobWFyazsKCnVzZSBzdHJpY3Q7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RmlsZVRlbXA7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gJyRSZXZpc2lvbjogMS4yICQnOwokVkVSU0lPTiA9fiBzL15cJC4qOlxXKC4qKVxXLis/JC8kMS87CgpzdWIgbmV3IHsKICAgIG15ICRUeXBlID0gc2hpZnQ7CiAgICBteSAlUGFyYW0gPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyAoJFNlbGYsICRUeXBlKTsKCiAgICBmb3JlYWNoIChrZXlzICVQYXJhbSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffTsKICAgIH0KCiAgICAjIGNoZWNrIG5lZWRlZCBPcGplY3RzCiAgICBmb3JlYWNoIChxdyhQYXJhbU9iamVjdCBMYXlvdXRPYmplY3QgTG9nT2JqZWN0IENvbmZpZ09iamVjdCkpIHsKICAgICAgICBkaWUgIkdvdCBubyAkXyEiIGlmICghJFNlbGYtPnskX30pOwogICAgfQoKICAgICRTZWxmLT57RmlsZVRlbXBPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkZpbGVUZW1wLT5uZXcoJVBhcmFtKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICVQYXJhbSA9IEBfOwogICAgaWYgKCRTZWxmLT57U3ViYWN0aW9ufSBlcSAnU1FMJykgewogICAgICAgIG15ICRJbnNlcnQgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ0luc2VydCcpOwogICAgICAgIG15ICRVcGRhdGUgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ1VwZGF0ZScpOwogICAgICAgIG15ICRTZWxlY3QgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ1NlbGVjdCcpOwogICAgICAgIG15ICRNb2RlID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKFBhcmFtID0+ICdNb2RlJyk7CiAgICAgICAgZm9yZWFjaCAoMS4uJE1vZGUpIHsKICAgICAgICAgICAgJFNlbGYtPnsiREJPYmplY3QkXyJ9ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoJXskU2VsZn0pOwogICAgICAgIH0KICAgICAgICAkUGFyYW17SW5zZXJ0VGltZX0gPSAwOwogICAgICAgICRQYXJhbXtVcGRhdGVUaW1lfSA9IDA7CiAgICAgICAgJFBhcmFte1NlbGVjdFRpbWV9ID0gMDsKICAgICAgICAkUGFyYW17RGVsZXRlVGltZX0gPSAwOwogICAgICAgIG15ICRUaW1lU3RhcnQgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCk7CiAgICAgICAgJFNlbGYtPl9TUUxJbnNlcnQoJEluc2VydCwgJE1vZGUpOwogICAgICAgIG15ICRUaW1lMSA9ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKTsKICAgICAgICAkU2VsZi0+X1NRTFVwZGF0ZSgkVXBkYXRlLCAkTW9kZSk7CiAgICAgICAgbXkgJFRpbWUyID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpOwogICAgICAgICRTZWxmLT5fU1FMU2VsZWN0KCRTZWxlY3QsICRNb2RlKTsKICAgICAgICBteSAkVGltZTMgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCk7CiAgICAgICAgJFNlbGYtPl9TUUxEZWxldGUoKTsKICAgICAgICBteSAkVGltZTQgPSAkU2VsZi0+e1RpbWVPYmplY3R9LT5TeXN0ZW1UaW1lKCk7CiAgICAgICAgJFBhcmFte0luc2VydFRpbWV9ID0gJFBhcmFte0luc2VydFRpbWV9KyRUaW1lMS0kVGltZVN0YXJ0OwogICAgICAgICRQYXJhbXtVcGRhdGVUaW1lfSA9ICRQYXJhbXtVcGRhdGVUaW1lfSskVGltZTItJFRpbWUxOwogICAgICAgICRQYXJhbXtTZWxlY3RUaW1lfSA9ICRQYXJhbXtTZWxlY3RUaW1lfSskVGltZTMtJFRpbWUyOwogICAgICAgICRQYXJhbXtEZWxldGVUaW1lfSA9ICRQYXJhbXtEZWxldGVUaW1lfSskVGltZTQtJFRpbWUzOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3VsdCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgJVBhcmFtLAogICAgICAgICAgICAgICAgSGVhZCA9PiAnU1FMJywKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgIGlmICgoJFBhcmFte0luc2VydFRpbWV9LyRNb2RlKSooMTAwMDAvJEluc2VydCkgPCAzKSB7CiAgICAgICAgICAgICRQYXJhbXtJbnNlcnRNb29kfSA9ICc6LSknOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoKCRQYXJhbXtJbnNlcnRUaW1lfS8kTW9kZSkqKDEwMDAwLyRJbnNlcnQpIDwgNCkgewogICAgICAgICAgICAkUGFyYW17SW5zZXJ0TW9vZH0gPSAnOi18JzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtJbnNlcnRNb29kfSA9ICc6LSgnOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSZXN1bHRSb3cnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEtleSA9PiAnSW5zZXJ0IFRpbWUnLAogICAgICAgICAgICAgICAgVGltZSA9PiAiJFBhcmFte0luc2VydFRpbWV9IHMgJFBhcmFte0luc2VydE1vb2R9IiwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICgkSW5zZXJ0KiRNb2RlKSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgIGlmICgoJFBhcmFte1VwZGF0ZVRpbWV9LyRNb2RlKSooMTAwMDAvJFVwZGF0ZSkgPCA0KSB7CiAgICAgICAgICAgICRQYXJhbXtVcGRhdGVNb29kfSA9ICc6LSknOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoKCRQYXJhbXtVcGRhdGVUaW1lfS8kTW9kZSkqKDEwMDAwLyRVcGRhdGUpIDwgNSkgewogICAgICAgICAgICAkUGFyYW17VXBkYXRlTW9vZH0gPSAnOi18JzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtVcGRhdGVNb29kfSA9ICc6LSgnOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSZXN1bHRSb3cnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEtleSA9PiAnVXBkYXRlIFRpbWUnLAogICAgICAgICAgICAgICAgVGltZSA9PiAiJFBhcmFte1VwZGF0ZVRpbWV9IHMgJFBhcmFte1VwZGF0ZU1vb2R9IiwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICgkVXBkYXRlKiRNb2RlKSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgIGlmICgoJFBhcmFte1NlbGVjdFRpbWV9LyRNb2RlKSooMTAwMDAvJFNlbGVjdCkgPCA1KSB7CiAgICAgICAgICAgICRQYXJhbXtTZWxlY3RNb29kfSA9ICc6LSknOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoKCRQYXJhbXtTZWxlY3RUaW1lfS8kTW9kZSkqKDEwMDAwLyRTZWxlY3QpIDwgNikgewogICAgICAgICAgICAkUGFyYW17U2VsZWN0TW9vZH0gPSAnOi18JzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRQYXJhbXtTZWxlY3RNb29kfSA9ICc6LSgnOwogICAgICAgIH0KICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdSZXN1bHRSb3cnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEtleSA9PiAnU2VsZWN0IFRpbWUnLAogICAgICAgICAgICAgICAgVGltZSA9PiAiJFBhcmFte1NlbGVjdFRpbWV9IHMgJFBhcmFte1NlbGVjdE1vb2R9IiwKICAgICAgICAgICAgICAgIFZhbHVlID0+ICgkU2VsZWN0KiRNb2RlKSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgIGlmICgoJFBhcmFte0RlbGV0ZVRpbWV9LyRNb2RlKSA8IDEuNSkgewogICAgICAgICAgICAkUGFyYW17RGVsZXRlTW9vZH0gPSAnOi0pJzsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCgkUGFyYW17RGVsZXRlVGltZX0vJE1vZGUpIDwgMi41KSB7CiAgICAgICAgICAgICRQYXJhbXtEZWxldGVNb29kfSA9ICc6LXwnOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFBhcmFte0RlbGV0ZU1vb2R9ID0gJzotKCc7CiAgICAgICAgfQogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3VsdFJvdycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgS2V5ID0+ICdEZWxldGUgVGltZScsCiAgICAgICAgICAgICAgICBUaW1lID0+ICIkUGFyYW17RGVsZXRlVGltZX0gcyAkUGFyYW17RGVsZXRlTW9vZH0iLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3VsdFJvdycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgS2V5ID0+ICdNdWx0aXBsaWVyJywKICAgICAgICAgICAgICAgIFZhbHVlID0+ICIqICRNb2RlIiwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkJlbmNobWFyaycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KICAgIGVsc2lmICgkU2VsZi0+e1N1YmFjdGlvbn0gZXEgJ0Zyb250ZW5kJykgewogICAgICAgIG15ICRNb2R1bGUgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oUGFyYW0gPT4gJ01vZHVsZScpOwogICAgICAgIG15ICRUaW1lcyA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnVGltZXMnKTsKCiAgICAgICAgIyBjaGVjayBtb2R1bGUgcmVnaXN0cnkKICAgICAgICBteSAkTW9kdWxlUmVnID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpNb2R1bGUnKS0+eyRNb2R1bGV9OwogICAgICAgICRTZWxmLT57TWFpbk9iamVjdH0tPlJlcXVpcmUoJ0tlcm5lbDo6TW9kdWxlczo6Jy4kTW9kdWxlKTsKICAgICAgICAjIHByb3ZlIG9mIGNvbmNlcHQhIC0gY3JlYXRlICRHZW5lcmljT2JqZWN0CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnUmVzdWx0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAlUGFyYW0sCiAgICAgICAgICAgICAgICBIZWFkID0+ICdGcm9udGVuZCcsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICBteSAkVGltZVN0YXJ0ID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpOwoKICAgICAgICAjIGNyZWF0ZSB0bXAgZmlsZSBoYW5kbGUKICAgICAgICBvcGVuKE9MRE9VVCwgIj4mU1RET1VUIik7CiAgICAgICAgIyBtb3ZlIFNURE9VVCB0byB0bXAgZmlsZQogICAgICAgIG15ICgkRkgsICRGaWxlbmFtZSkgPSAkU2VsZi0+e0ZpbGVUZW1wT2JqZWN0fS0+VGVtcEZpbGUoKTsKICAgICAgICBvcGVuKFNURE9VVCwgIj4gJEZpbGVuYW1lIik7CgogICAgICAgIGZvcmVhY2ggKDEuLiRUaW1lcykgewogICAgICAgICAgICBteSAkVGltZVN0YXJ0ID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpOwogICAgICAgICAgICBteSAkR2VuZXJpY09iamVjdCA9ICgnS2VybmVsOjpNb2R1bGVzOjonLiRNb2R1bGUpLT5uZXcoCiAgICAgICAgICAgICAgICAleyRTZWxmfSwKICAgICAgICAgICAgICAgIE1vZHVsZVJlZyA9PiAkTW9kdWxlUmVnLAogICAgICAgICAgICApOwogICAgICAgICAgICAjIC0+UnVuICRBY3Rpb24gd2l0aCAkR2VuZXJpY09iamVjdAojICAgICAgICAgICAgJE91dHB1dCAuPSAkR2VuZXJpY09iamVjdC0+UnVuKCk7CiAgICAgICAgICAgICRHZW5lcmljT2JqZWN0LT5SdW4oKTsKICAgICAgICAgICAgbXkgJFRpbWUxID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpOwogICAgICAgICAgICBteSAkVGltZSA9ICRUaW1lMS0kVGltZVN0YXJ0OwogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICAgICAgTmFtZSA9PiAnUmVzdWx0Um93JywKICAgICAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIEtleSA9PiAnUmVxdWVzdCcsCiAgICAgICAgICAgICAgICAgICAgVGltZSA9PiAiJFRpbWUgcyIsCiAgICAgICAgICAgICAgICAgICAgVmFsdWUgPT4gIiRfIiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgICMgcmVzdG9yZSBTVERPVVQgZmlsZSBoYW5kbGUKICAgICAgICBvcGVuKFNURE9VVCwgIj4mT0xET1VUIik7CiAgICAgICAgY2xvc2UoT0xET1VUKTsKCiAgICAgICAgbXkgJFRpbWUxID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZSgpOwogICAgICAgICRQYXJhbXtUaW1lfSA9ICRUaW1lMS0kVGltZVN0YXJ0OwoKICAgICAgICBpZiAoKCRQYXJhbXtUaW1lfS8kVGltZXMpIDwgMikgewogICAgICAgICAgICAkUGFyYW17TW9vZH0gPSAnOi0pJzsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCgkUGFyYW17VGltZX0vJFRpbWVzKSA8IDMpIHsKICAgICAgICAgICAgJFBhcmFte01vb2R9ID0gJzotfCc7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkUGFyYW17TW9vZH0gPSAnOi0oJzsKICAgICAgICB9CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1Jlc3VsdFJvdycsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgS2V5ID0+ICdNb2R1bGUnLAogICAgICAgICAgICAgICAgVmFsdWUgPT4gIiRNb2R1bGUiLAogICAgICAgICAgICAgICAgVGltZSA9PiAiJFBhcmFte1RpbWV9IHMgJFBhcmFte01vb2R9IiwKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICBteSAkT3V0cHV0ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5IZWFkZXIoKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+TmF2aWdhdGlvbkJhcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5PdXRwdXQoCiAgICAgICAgICAgIFRlbXBsYXRlRmlsZSA9PiAnQWRtaW5CZW5jaG1hcmsnLAogICAgICAgICAgICBEYXRhID0+IFwlUGFyYW0sCiAgICAgICAgKTsKICAgICAgICAkT3V0cHV0IC49ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+Rm9vdGVyKCk7CiAgICAgICAgcmV0dXJuICRPdXRwdXQ7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkUGFyYW17J01vZGVTdHJnJ30gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk9wdGlvblN0cmdIYXNoUmVmKAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIDEgPT4gJzEgKiBOb3JtYWwnLAogICAgICAgICAgICAgICAgMyA9PiAnMyAqIEhpZ2gnLAogICAgICAgICAgICAgICAgNSA9PiAnNSAqIEhlYXZ5JywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgTmFtZSA9PiAnTW9kZScsCiAgICAgICAgKTsKICAgICAgICAkUGFyYW17J01vZHVsZSd9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0Zyb250ZW5kOjpDb21tb25QYXJhbScpLT57QWN0aW9ufTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdPdmVydmlldycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgIG15ICRPdXRwdXQgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkhlYWRlcigpOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5OYXZpZ2F0aW9uQmFyKCk7CiAgICAgICAgJE91dHB1dCAuPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPk91dHB1dCgKICAgICAgICAgICAgVGVtcGxhdGVGaWxlID0+ICdBZG1pbkJlbmNobWFyaycsCiAgICAgICAgICAgIERhdGEgPT4gXCVQYXJhbSwKICAgICAgICApOwogICAgICAgICRPdXRwdXQgLj0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Gb290ZXIoKTsKICAgICAgICByZXR1cm4gJE91dHB1dDsKICAgIH0KfQoKc3ViIF9TUUxJbnNlcnQgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgIG15ICRDb3VudCA9IHNoaWZ0OwogICAgbXkgJE1vZGUgPSBzaGlmdDsKICAgIGZvcmVhY2ggbXkgJEMgKDEuLiRDb3VudCkgewogICAgICAgIGZvcmVhY2ggbXkgJE0gKDEuLiRNb2RlKSB7CiAgICAgICAgICAgICRTZWxmLT57IkRCT2JqZWN0JE0ifS0+RG8oCiAgICAgICAgICAgICAgICBTUUwgPT4gIklOU0VSVCBJTlRPIGJlbmNoX3Rlc3QgKG5hbWVfYSwgbmFtZV9iKSB2YWx1ZXMgKCdhYWEkQy0kTScsICdiYmInKSIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIDE7Cn0KCnN1YiBfU1FMVXBkYXRlIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICBteSAkQ291bnQgPSBzaGlmdDsKICAgIG15ICRNb2RlID0gc2hpZnQ7CiAgICBmb3JlYWNoIG15ICRDICgxLi4kQ291bnQpIHsKICAgICAgICBmb3JlYWNoIG15ICRNICgxLi4kTW9kZSkgewogICAgICAgICAgICAkU2VsZi0+eyJEQk9iamVjdCRNIn0tPkRvKAogICAgICAgICAgICAgICAgU1FMID0+ICJVUERBVEUgYmVuY2hfdGVzdCBTRVQgbmFtZV9hID0gJzExMScsIG5hbWVfYiA9ICcyMjInIFdIRVJFIG5hbWVfYSA9ICdhYWEkQy0kTSciLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwp9CgpzdWIgX1NRTFNlbGVjdCB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgbXkgJENvdW50ID0gc2hpZnQ7CiAgICBteSAkTW9kZSA9IHNoaWZ0OwogICAgZm9yZWFjaCBteSAkQyAoMS4uJENvdW50KSB7CiAgICAgICAgZm9yZWFjaCBteSAkTSAoMS4uJE1vZGUpIHsKICAgICAgICAgICAgJFNlbGYtPnsiREJPYmplY3QkTSJ9LT5QcmVwYXJlKAogICAgICAgICAgICAgICAgU1FMID0+ICJTRUxFQ1QgbmFtZV9hLCBuYW1lX2IgRlJPTSBiZW5jaF90ZXN0IFdIRVJFIG5hbWVfYSA9ICdhYWEkQy0kTSciLAogICAgICAgICAgICApOwogICAgICAgICAgICB3aGlsZSAobXkgQFJvdyA9ICRTZWxmLT57IkRCT2JqZWN0JE0ifS0+RmV0Y2hyb3dBcnJheSgpKSB7CiAgICAgICAgICAgICAgICAjIGRvIG5vdGhpbmcKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwp9CgpzdWIgX1NRTERlbGV0ZSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwogICAgJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgIFNRTCA9PiAiREVMRVRFIEZST00gYmVuY2hfdGVzdCIsCiAgICApOwogICAgcmV0dXJuIDE7Cn0KCjE7Cg== IyAtLQojIEFkbWluQmVuY2htYXJrLmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgYmVuY2ggbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDUgTWFydGluIEVkZW5ob2ZlciA8bWFydGluK2NvZGVAb3Rycy5vcmc+CiMgLS0KIyAkSWQ6IEFkbWluQmVuY2htYXJrLmR0bCx2IDEuMS4xLjEgMjAwNS8xMC8wMyAxNjo0MTo1MSBtYXJ0aW4gRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCjwhLS0gc3RhcnQgZm9ybSAtLT4KPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjEwMCUiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0iMyI+Cjx0cj4KICA8dGQgY2xhc3M9Im1haW5oZWFkIj4KICAgICRFbnZ7IkJveDAifSRUZXh0eyJCZW5jaG1hcmsifSRFbnZ7IkJveDEifQogIDwvdGQ+CjwvdHI+Cjx0cj4KICA8dGQgY2xhc3M9Im1haW5ib2R5Ij4KCiAgPGJyPgoKPCEtLSBkdGw6YmxvY2s6T3ZlcnZpZXcgLS0+CiAgPGZvcm0gYWN0aW9uPSIkRW52eyJDR0lIYW5kbGUifSIgbWV0aG9kPSJwb3N0IiBlbmN0eXBlPSJtdWx0aXBhcnQvZm9ybS1kYXRhIiBuYW1lPSJjb21wb3NlIj4KICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSI+CiAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iU3ViYWN0aW9uIiB2YWx1ZT0iU1FMIj4KCiAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjcwMCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICA8dHI+CiAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiQmVuY2htYXJrIn06ICRUZXh0eyJTUUwifTwvdGQ+CiAgPC90cj4KICA8dHI+CiAgPHRkIGNsYXNzPSJjb250ZW50Ym9keSI+CiAgICA8dGFibGUgYm9yZGVyPSIwIiB3aWR0aD0iMTAwJSI+CiAgICAgIDx0cj4KICAgICAgICA8dGQgd2lkdGg9IjIwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPkluc2VydDo8L3RkPgogICAgICAgIDx0ZCB3aWR0aD0iODAlIiBjbGFzcz0iY29udGVudHZhbHVlIj48aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iSW5zZXJ0IiB2YWx1ZT0iMTAwMDAiIHNpemU9IjYwIj48L3RkPgogICAgICA8L3RyPgogICAgICA8dHI+CiAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50a2V5Ij5VcGRhdGU6PC90ZD4KICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlVwZGF0ZSIgdmFsdWU9IjEwMDAwIiBzaXplPSI2MCI+PC90ZD4KICAgICAgPC90cj4KICAgICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+U2VsZWN0OjwvdGQ+CiAgICAgICAgPHRkIGNsYXNzPSJjb250ZW50dmFsdWUiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJTZWxlY3QiIHZhbHVlPSIxMDAwMCIgc2l6ZT0iNjAiPjwvdGQ+CiAgICAgIDwvdHI+CiAgICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPk11bHRpcGxpZXI6PC90ZD4KICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JERhdGF7Ik1vZGVTdHJnIn08L3RkPgogICAgICA8L3RyPgogICAgICA8L3RhYmxlPgoKICAgICAgPC90ZD4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIGFjY2Vzc2tleT0iZyIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7InN1Ym1pdCJ9Ij4KICAgICAgPC90ZD4KICAgIDwvdHI+CiAgICA8L3RhYmxlPgogICAgPC9mb3JtPgoKICA8YnI+CgogIDxmb3JtIGFjdGlvbj0iJEVudnsiQ0dJSGFuZGxlIn0iIG1ldGhvZD0icG9zdCIgZW5jdHlwZT0ibXVsdGlwYXJ0L2Zvcm0tZGF0YSIgbmFtZT0iY29tcG9zZSI+CiAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQWN0aW9uIiB2YWx1ZT0iJEVudnsiQWN0aW9uIn0iPgogIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IkZyb250ZW5kIj4KCiAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjcwMCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICA8dHI+CiAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiQmVuY2htYXJrIn06ICRUZXh0eyJGcm9udGVuZCJ9PC90ZD4KICA8L3RyPgogIDx0cj4KICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIj4KICAgICAgPHRyPgogICAgICAgIDx0ZCB3aWR0aD0iMjAlIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7Ik1vZHVsZSJ9OjwvdGQ+CiAgICAgICAgPHRkIHdpZHRoPSI4MCUiIGNsYXNzPSJjb250ZW50dmFsdWUiPjxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJNb2R1bGUiIHZhbHVlPSIkUURhdGF7Ik1vZHVsZSJ9IiBzaXplPSI2MCI+PC90ZD4KICAgICAgPC90cj4KICAgICAgPHRyPgogICAgICAgIDx0ZCBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IlJlcXVlc3RzIn06PC90ZD4KICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+PGlucHV0IHR5cGU9InRleHQiIG5hbWU9IlRpbWVzIiB2YWx1ZT0iMTAiIHNpemU9IjYwIj48L3RkPgogICAgICA8L3RyPgogICAgICA8L3RhYmxlPgoKICAgICAgPC90ZD4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgPGlucHV0IGNsYXNzPSJidXR0b24iIGFjY2Vzc2tleT0iZyIgdHlwZT0ic3VibWl0IiB2YWx1ZT0iJFRleHR7InN1Ym1pdCJ9Ij4KICAgICAgPC90ZD4KICAgIDwvdHI+CiAgICA8L3RhYmxlPgogICAgPC9mb3JtPgo8IS0tIGR0bDpibG9jazpPdmVydmlldyAtLT4KCjwhLS0gZHRsOmJsb2NrOlJlc3VsdCAtLT4KCiAgPHRhYmxlIGJvcmRlcj0iMCIgd2lkdGg9IjcwMCIgYWxpZ249ImNlbnRlciIgY2VsbHNwYWNpbmc9IjAiIGNlbGxwYWRkaW5nPSI0Ij4KICA8dHI+CiAgICA8dGQgY29sc3Bhbj0iMiIgY2xhc3M9ImNvbnRlbnRoZWFkIj4kVGV4dHsiUmVzdWx0In06ICRUZXh0eyIkUURhdGF7IkhlYWQifSJ9PC90ZD4KICA8L3RyPgogIDx0cj4KICA8dGQgY2xhc3M9ImNvbnRlbnRib2R5Ij4KICAgIDx0YWJsZSBib3JkZXI9IjAiIHdpZHRoPSIxMDAlIj4KICAgICAgPHRyPgogICAgICAgIDx0ZCB3aWR0aD0iMjAlIiBjbGFzcz0iY29udGVudGtleSI+JFRleHR7IktleSJ9PC90ZD4KICAgICAgICA8dGQgd2lkdGg9IjQwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJWYWx1ZSJ9PC90ZD4KICAgICAgICA8dGQgd2lkdGg9IjQwJSIgY2xhc3M9ImNvbnRlbnRrZXkiPiRUZXh0eyJUaW1lIn08L3RkPgogICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpSZXN1bHRSb3cgLS0+CiAgICAgIDx0cj4KICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnRrZXkiPiRRRGF0YXsiS2V5In06PC90ZD4KICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJWYWx1ZSJ9PC90ZD4KICAgICAgICA8dGQgY2xhc3M9ImNvbnRlbnR2YWx1ZSI+JFFEYXRheyJUaW1lIn08L3RkPgogICAgICA8L3RyPgo8IS0tIGR0bDpibG9jazpSZXN1bHRSb3cgLS0+CiAgICA8L3RhYmxlPgoKICAgICAgPC90ZD4KICAgIDwvdHI+CiAgICA8dHI+CiAgICAgIDx0ZCBjbGFzcz0iY29udGVudGZvb3RlciI+CiAgICAgICAgJm5ic3A7CiAgICAgIDwvdGQ+CiAgICA8L3RyPgogICAgPC90YWJsZT4KCjwhLS0gZHRsOmJsb2NrOlJlc3VsdCAtLT4KCiAgPGJyPgoKICA8L3RkPgo8L3RyPgo8L3RhYmxlPgo8IS0tIGVuZCBmb3JtIC0tPgo=