SystemMonitoring
2.0.3
OTRS AG
http://otrs.org/
GNU GENERAL PUBLIC LICENSE Version 2, June 1991
Fixed some minor bugs, added Lookup for Status, Host and Service in Subject.
Fixed Nagios Performance Data.
New version with Nagios an acknowledge feature and Nagios checker script.
Basic mail interface to System Monitoring Suites. Also provides deeper integration to Nagios (Acknowledge on lock and Checkscript).
Einfache Email Schnittstelle zu System Monitoring Suites. Weitergehende Integration mit Nagios (Acknowledge on lock and Checkscript).
2.3.x
For configuration instructions please refer to the information in doc/SystemMonitoring.txt.
Eine Anleitung zur Konfiguration des SystemMonitoring Moduls findet sich in der Datei doc/SystemMonitoring.txt.
2008-12-10 18:39:48
opms.otrs.com
IyEvdXNyL2Jpbi9wZXJsIC13CiMgLS0KIyBvdHJzLk5hZ2lvc0NoZWNrLnBsIC0gT1RSUyBOYWdpb3MgY2hlY2tlcgojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogb3Rycy5OYWdpb3NDaGVjay5wbCx2IDEuNiAyMDA4LzEwLzE2IDIzOjA3OjUwIGpiIEV4cCAkCiMgLS0KIyBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQojIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKIyAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgojCiMgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiMgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKIyBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiMgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KIwojIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiMgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKIyBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiMgLS0KCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNiAkKSBbMV07Cgp1c2UgRmlsZTo6QmFzZW5hbWU7CnVzZSBGaW5kQmluIHF3KCRSZWFsQmluKTsKdXNlIGxpYiBkaXJuYW1lKCRSZWFsQmluKTsKdXNlIGxpYiBkaXJuYW1lKCRSZWFsQmluKSAuICcvS2VybmVsL2NwYW4tbGliJzsKCnVzZSBHZXRvcHQ6OlN0ZDsKbXkgJW9wdHM7CmdldG9wdCggJ2MnLCBcJW9wdHMgKTsKaWYgKCAkb3B0c3tofSApIHsKICAgIHByaW50ICJVc2FnZTogJEZpbmRCaW46OlNjcmlwdCBbLU4gKHJ1bnMgYXMgTmFnaW9zY2hlY2tlcildIFstdiAodmVyYm9zZSldIFstYyAvcGF0aC90by9jb25maWdfZmlsZV1cbiI7CiAgICBwcmludCAiXG4iOwogICAgZXhpdDsKfQoKaWYgKCAhJG9wdHN7Y30gKSB7CiAgICBwcmludCBTVERFUlIgIkVSUk9SOiBOZWVkIC1jIENPTkZJR0ZJTEVcbiI7CiAgICBleGl0IDE7Cn0KZWxzaWYgKCAhLWUgJG9wdHN7Y30gKSB7CiAgICBwcmludCBTVERFUlIgIkVSUk9SOiBObyBzdWNoIGZpbGUgJG9wdHN7Y31cbiI7CiAgICBleGl0IDE7Cn0KCiMgcmVhZCBjb25maWcgZmlsZQpteSAlQ29uZmlnOwpvcGVuIChteSAkSU4sICc8JywgJG9wdHN7Y30gKSB8fCBkaWUgIkVSUk9SOiBDYW4ndCBvcGVuICRvcHRze2N9OiAkIVxuIjsKbXkgJENvbnRlbnQgPSAnJzsKd2hpbGUgKDwkSU4+KSB7CiAgICAkQ29udGVudCAuPSAkXzsKfQppZiAoICFldmFsICRDb250ZW50ICkgewogICAgcHJpbnQgU1RERVJSICJFUlJPUjogSW52YWxpZCBjb25maWcgZmlsZSAkb3B0c3tjfTogJEBcbiI7CiAgICBleGl0IDE7Cn0KCnVzZSBLZXJuZWw6OkNvbmZpZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwp1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwp1c2UgS2VybmVsOjpTeXN0ZW06OlRpY2tldDsKCiMgY3JlYXRlIGNvbW1vbiBvYmplY3RzCm15ICVDb21tb25PYmplY3QgPSAoKTsKJENvbW1vbk9iamVjdHtDb25maWdPYmplY3R9ID0gS2VybmVsOjpDb25maWctPm5ldyglQ29tbW9uT2JqZWN0KTsKJENvbW1vbk9iamVjdHtMb2dPYmplY3R9ICAgID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KCAlQ29tbW9uT2JqZWN0LCBMb2dQcmVmaXggPT4gJ290cnMuTmFnaW9zQ2hlY2snICk7CiRDb21tb25PYmplY3R7VGltZU9iamVjdH0gICA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lLT5uZXcoJUNvbW1vbk9iamVjdCk7CiRDb21tb25PYmplY3R7TWFpbk9iamVjdH0gICA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoJUNvbW1vbk9iamVjdCk7CiRDb21tb25PYmplY3R7REJPYmplY3R9ICAgICA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KCVDb21tb25PYmplY3QpOwokQ29tbW9uT2JqZWN0e1RpY2tldE9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0LT5uZXcoJUNvbW1vbk9iamVjdCk7CgojIHNlYXJjaCB0aWNrZXRzCm15IEBUaWNrZXRJRHMgPSAkQ29tbW9uT2JqZWN0e1RpY2tldE9iamVjdH0tPlRpY2tldFNlYXJjaCgKICAgICV7ICRDb25maWd7U2VhcmNofSB9LAogICAgTGltaXQgID0+IDEwMF8wMDAsCiAgICBSZXN1bHQgPT4gJ0FSUkFZJywKICAgIFVzZXJJRCA9PiAxLAopOwpteSAkVGlja2V0Q291bnQgPSBzY2FsYXIgQFRpY2tldElEczsKCiMgdmVyYm9zZSBtb2RlCmlmICggJG9wdHN7dn0gKSB7CiAgICBmb3IgbXkgJFRpY2tldElEIChAVGlja2V0SURzKSB7CiAgICAgICAgbXkgJVRpY2tldCA9ICRDb21tb25PYmplY3R7VGlja2V0T2JqZWN0fS0+VGlja2V0R2V0KCBUaWNrZXRJRCA9PiAkVGlja2V0SUQgKTsKICAgICAgICBwcmludCBTVERFUlIgIiRUaWNrZXR7VGlja2V0SUR9OiRUaWNrZXR7VGlja2V0TnVtYmVyfVxuIjsKICAgIH0KfQoKIyBubyBjaGVja2VyIG1vZGUKaWYgKCAhJG9wdHN7Tn0gKSB7CiAgICBwcmludCAiJFRpY2tldENvdW50XG4iOwogICAgZXhpdCAwOwp9CgojIGNsZWFudXAgY29uZmlnIGZpbGUKbXkgJU1hcCA9ICgKICAgIG1heF9jcml0X3RyZXNoaG9sZCA9PiAnbWF4X2NyaXRfdHJlc2hvbGQnLAogICAgbWF4X3dhcm5fdHJlc2hob2xkID0+ICdtYXhfd2Fybl90cmVzaG9sZCcsCiAgICBtaW5fY3JpdF90cmVzaGhvbGQgPT4gJ21pbl9jcml0X3RyZXNob2xkJywKICAgIG1pbl93YXJuX3RyZXNoaG9sZCA9PiAnbWluX3dhcm5fdHJlc2hvbGQnLAopOwpmb3IgbXkgJFR5cGUgKCBrZXlzICVNYXAgKSB7CiAgICBpZiAoIGRlZmluZWQgJENvbmZpZ3skVHlwZX0gKSB7CiAgICAgICAgcHJpbnQgU1RERVJSICJOT1RJQ0U6IFR5cG8gaW4gY29uZmlnIG5hbWUsIHVzZSAkTWFweyRUeXBlfSBpbnN0ZWFkIG9mICRUeXBlXG4iOwogICAgICAgICRDb25maWd7JE1hcHskVHlwZX19ID0gJENvbmZpZ3skVHlwZX07CiAgICAgICAgZGVsZXRlICRDb25maWd7JFR5cGV9OwogICAgfQp9CgojIGRvIGNyaXRpY2FsIGFuZCB3YXJuaW5nIGNoZWNrCmZvciBteSAkVHlwZSAocXcoY3JpdF90cmVzaG9sZCB3YXJuX3RyZXNob2xkKSkgewogICAgaWYgKCBkZWZpbmVkICRDb25maWd7ICdtaW5fJyAuICRUeXBlIH0gKSB7CiAgICAgICAgaWYgKCAkQ29uZmlneyAnbWluXycgLiAkVHlwZSB9ID49ICRUaWNrZXRDb3VudCApIHsKICAgICAgICAgICAgaWYgKCAkVHlwZSA9fiAvXmNyaXRfLyApIHsKICAgICAgICAgICAgICAgIHByaW50ICIkQ29uZmlne2NoZWNrbmFtZX0gQ1JJVElDQUwgJENvbmZpZ3tDUklUX1RYVH0gJFRpY2tldENvdW50fHRpY2tldHM9JFRpY2tldENvdW50OyRDb25maWd7bWluX3dhcm5fdHJlc2hvbGR9OiRDb25maWd7bWF4X3dhcm5fdHJlc2hvbGR9OyRDb25maWd7bWluX2NyaXRfdHJlc2hvbGR9OiRDb25maWd7bWF4X2NyaXRfdHJlc2hvbGR9XG4iOwogICAgICAgICAgICAgICAgZXhpdCAyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJFR5cGUgPX4gL153YXJuXy8gKSB7CiAgICAgICAgICAgICAgICBwcmludCAiJENvbmZpZ3tjaGVja25hbWV9IFdBUk5JTkcgJENvbmZpZ3tXQVJOX1RYVH0gJFRpY2tldENvdW50fHRpY2tldHM9JFRpY2tldENvdW50OyRDb25maWd7bWluX3dhcm5fdHJlc2hvbGR9OiRDb25maWd7bWF4X3dhcm5fdHJlc2hvbGR9OyRDb25maWd7bWluX2NyaXRfdHJlc2hvbGR9OiRDb25maWd7bWF4X2NyaXRfdHJlc2hvbGR9XG4iOwogICAgICAgICAgICAgICAgZXhpdCAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgaWYgKCBkZWZpbmVkICRDb25maWd7ICdtYXhfJyAuICRUeXBlIH0gKSB7CiAgICAgICAgaWYgKCAkQ29uZmlneyAnbWF4XycgLiAkVHlwZSB9IDw9ICRUaWNrZXRDb3VudCApIHsKICAgICAgICAgICAgaWYgKCAkVHlwZSA9fiAvXmNyaXRfLyApIHsKICAgICAgICAgICAgICAgIHByaW50ICIkQ29uZmlne2NoZWNrbmFtZX0gQ1JJVElDQUwgJENvbmZpZ3tDUklUX1RYVH0gJFRpY2tldENvdW50fHRpY2tldHM9JFRpY2tldENvdW50OyRDb25maWd7bWluX3dhcm5fdHJlc2hvbGR9OiRDb25maWd7bWF4X3dhcm5fdHJlc2hvbGR9OyRDb25maWd7bWluX2NyaXRfdHJlc2hvbGR9OiRDb25maWd7bWF4X2NyaXRfdHJlc2hvbGR9XG4iOwogICAgICAgICAgICAgICAgZXhpdCAyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJFR5cGUgPX4gL153YXJuXy8gKSB7CiAgICAgICAgICAgICAgICBwcmludCAiJENvbmZpZ3tjaGVja25hbWV9IFdBUk5JTkcgJENvbmZpZ3tXQVJOX1RYVH0gJFRpY2tldENvdW50fHRpY2tldHM9JFRpY2tldENvdW50OyRDb25maWd7bWluX3dhcm5fdHJlc2hvbGR9OiRDb25maWd7bWF4X3dhcm5fdHJlc2hvbGR9OyRDb25maWd7bWluX2NyaXRfdHJlc2hvbGR9OiRDb25maWd7bWF4X2NyaXRfdHJlc2hvbGR9XG4iOwogICAgICAgICAgICAgICAgZXhpdCAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CgojIHJldHVybiBvawpwcmludCAiJENvbmZpZ3tjaGVja25hbWV9IE9LICRDb25maWd7T0tfVFhUfSAkVGlja2V0Q291bnR8dGlja2V0cz0kVGlja2V0Q291bnQ7JENvbmZpZ3ttaW5fd2Fybl90cmVzaG9sZH06JENvbmZpZ3ttYXhfd2Fybl90cmVzaG9sZH07JENvbmZpZ3ttaW5fY3JpdF90cmVzaG9sZH06JENvbmZpZ3ttYXhfY3JpdF90cmVzaG9sZH1cbiI7CmV4aXQgMDsK
IyAtLQojIEtlcm5lbC9TeXN0ZW0vUG9zdE1hc3Rlci9GaWx0ZXIvU3lzdGVtTW9uaXRvcmluZy5wbSAtIEJhc2ljIFN5c3RlbSBNb25pdG9yaW5nIEludGVyZmFjZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogU3lzdGVtTW9uaXRvcmluZy5wbSx2IDEuNSAyMDA4LzExLzE3IDE2OjQ0OjE1IGpiIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6RmlsdGVyOjpTeXN0ZW1Nb25pdG9yaW5nOwp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKCiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjUgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKICAgICRTZWxmLT57RGVidWd9ID0gJFBhcmFte0RlYnVnfSB8fCAwOwoKICAgICMgZ2V0IG5lZWRlZCBvYmplY3RzCiAgICBmb3JlYWNoIChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IFRpY2tldE9iamVjdCBUaW1lT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgICMgRGVmYXVsdCBTZXR0aW5ncwogICAgJFNlbGYtPntDb25maWd9ID0gewogICAgICAgIFN0YXRlUmVnRXhwICAgICAgID0+ICdccypTdGF0ZTpccysoXFMrKScsCiAgICAgICAgRnJvbUFkZHJlc3NSZWdFeHAgPT4gJ3N5c21vbkBleGFtcGxlLmNvbScsCiAgICAgICAgTmV3VGlja2V0UmVnRXhwICAgPT4gJ0NSSVRJQ0FMfERPV04nLAogICAgICAgIENsb3NlVGlja2V0UmVnRXhwID0+ICdPS3xVUCcsCiAgICAgICAgQ2xvc2VBY3Rpb25TdGF0ZSAgPT4gJ2Nsb3NlZCBzdWNjZXNzZnVsJywKICAgICAgICBDbG9zZVBlbmRpbmdUaW1lICA9PiA2MCAqIDYwICogMjQgKiAyLCAgICAgICAgICAgICAgICAgICAgICAgICMgMiBkYXlzCiAgICAgICAgSG9zdFJlZ0V4cCAgICAgICAgPT4gJ1xzKkFkZHJlc3M6XHMrKFxkK1wuXGQrXC5cZCtcLlxkKylccyonLAogICAgICAgIEZyZWVUZXh0SG9zdCAgICAgID0+ICcxJywKICAgICAgICBTZXJ2aWNlUmVnRXhwICAgICA9PiAnXHMqU2VydmljZTpccysoLiopXHMqJywKICAgICAgICBEZWZhdWx0U2VydmljZSAgICA9PiAnSG9zdCcsCiAgICAgICAgRnJlZVRleHRTZXJ2aWNlICAgPT4gJzInLAogICAgICAgIFNlbmRlclR5cGUgICAgICAgID0+ICdzeXN0ZW0nLAogICAgICAgIEFydGljbGVUeXBlICAgICAgID0+ICdub3RlLXJlcG9ydCcsCiAgICAgICAgRnJlZVRleHRTdGF0ZSAgICAgPT4gJzEnLAogICAgfTsKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAkU2VsZiAgICAgICA9IHNoaWZ0OwogICAgbXkgJVBhcmFtICAgICAgPSBAXzsKICAgIG15ICRMb2dNZXNzYWdlID0gdW5kZWY7CgogICAgIyBnZXQgY29uZmlnIG9wdGlvbnMsIHVzZSBkZWZhdWx0cyB1bmxlc3MgdmFsdWUgc3BlY2lmaWVkCiAgICBpZiAoICRQYXJhbXtKb2JDb25maWd9ICYmIHJlZiggJFBhcmFte0pvYkNvbmZpZ30gKSBlcSAnSEFTSCcgKSB7CiAgICAgICAgZm9yZWFjaCAoIGtleXMoICV7ICRQYXJhbXtKb2JDb25maWd9IH0gKSApIHsKICAgICAgICAgICAgJFNlbGYtPntDb25maWd9eyRffQogICAgICAgICAgICAgICAgJiYgKCAkU2VsZi0+e0NvbmZpZ317JF99ID0gJFBhcmFte0pvYkNvbmZpZ30tPnskX30gKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpZiBzZW5kZXIgaXMgb2YgaW50ZXJlc3QKICAgIGlmICggICAkUGFyYW17R2V0UGFyYW19LT57RnJvbX0KICAgICAgICAmJiAkUGFyYW17R2V0UGFyYW19LT57RnJvbX0gPX4gLyRTZWxmLT57Q29uZmlnfXtGcm9tQWRkcmVzc1JlZ0V4cH0vICkKICAgIHsKCiAgICAgICAgIyBUcnkgdG8gZ2V0IFN0YXRlLCBIb3N0IGFuZCBTZXJ2aWNlCiAgICAgICAgZm9yIG15ICRsaW5lICggc3BsaXQgL1xuLywgJFBhcmFte0dldFBhcmFtfS0+e1N1YmplY3R9ICkgewogICAgICAgICAgICBmb3IgKHF3ICggU3RhdGUgSG9zdCBTZXJ2aWNlICkpIHsKICAgICAgICAgICAgICAgICRsaW5lID1+IC8kU2VsZi0+e0NvbmZpZ317JF8uJ1JlZ0V4cCd9LwogICAgICAgICAgICAgICAgICAgICYmICggJFNlbGYtPnskX30gPSAkMSApOwogICAgICAgICAgICB9CiAgICB9CiAgICBmb3IgbXkgJGxpbmUgKCBzcGxpdCAvXG4vLCAkUGFyYW17R2V0UGFyYW19LT57Qm9keX0gKSB7CiAgICAgICAgICAgIGZvciAocXcgKCBTdGF0ZSBIb3N0IFNlcnZpY2UgKSkgewogICAgICAgICAgICAgICAgJGxpbmUgPX4gLyRTZWxmLT57Q29uZmlnfXskXy4nUmVnRXhwJ30vCiAgICAgICAgICAgICAgICAgICAgJiYgKCAkU2VsZi0+eyRffSA9ICQxICk7CiAgICAgICAgICAgIH0KICAgIH0KCiAgICAgICAgIyBXZSBuZWVkIFN0YXRlIGFuZCBIb3N0IHRvIHByb2NlZWQKICAgICAgICBpZiAoICRTZWxmLT57U3RhdGV9ICYmICRTZWxmLT57SG9zdH0gKSB7CgogICAgICAgICAgICAjIENoZWNrIGZvciBTZXJ2aWNlCiAgICAgICAgICAgICRTZWxmLT57U2VydmljZX0KICAgICAgICAgICAgICAgIHx8ICggJFNlbGYtPntTZXJ2aWNlfSA9ICRTZWxmLT57Q29uZmlnfXtEZWZhdWx0U2VydmljZX0gKTsKICAgICAgICAgICAgJExvZ01lc3NhZ2UKICAgICAgICAgICAgICAgID0gIiAtIEhvc3Q6ICRTZWxmLT57SG9zdH0sIFN0YXRlOiAkU2VsZi0+e1N0YXRlfSwgU2VydmljZTogJFNlbGYtPntTZXJ2aWNlfSI7CgogICAgICAgICAgICAjIElzIHRoZXJlIGEgdGlja2V0IGZvciB0aGlzIEhvc3QvU2VydmljZSBwYWlyPwogICAgICAgICAgICBteSAlcXVlcnkgPSAoCiAgICAgICAgICAgICAgICBSZXN1bHQgICAgPT4gJ0FSUkFZJywKICAgICAgICAgICAgICAgIExpbWl0ICAgICA9PiAxLAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICAgICAgICAgICAgICBTdGF0ZVR5cGUgPT4gJ09wZW4nCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIGZvciAocXcgKCBIb3N0IFNlcnZpY2UgKSkgewogICAgICAgICAgICAgICAgJHF1ZXJ5eyAnVGlja2V0RnJlZUtleScgLiAkU2VsZi0+e0NvbmZpZ317ICdGcmVlVGV4dCcgLiAkXyB9IH0KICAgICAgICAgICAgICAgICAgICA9ICRfOwogICAgICAgICAgICAgICAgJHF1ZXJ5eyAnVGlja2V0RnJlZVRleHQnCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJFNlbGYtPntDb25maWd9eyAnRnJlZVRleHQnIC4gJF8gfSB9ID0gJFNlbGYtPnskX307CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggbXkgJFRpY2tldElECiAgICAgICAgICAgICAgICA9ICggJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRTZWFyY2goJXF1ZXJ5KSApWzBdICkKICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICMgQWx3YXlzIHVzZSBmaXJzdCByZXN1bHQsIHRoZXJlIHNob3VsZCBiZSBvbmx5IG9uZS4uLgogICAgICAgICAgICAgICAgIyBPSywgZm91bmQgdGlja2V0IHRvIGRlYWwgd2l0aAogICAgICAgICAgICAgICAgJFBhcmFte0dldFBhcmFtfS0+e1N1YmplY3R9CiAgICAgICAgICAgICAgICAgICAgPSAkU2VsZi0+e1RpY2tldE9iamVjdH0tPlRpY2tldFN1YmplY3RCdWlsZCgKICAgICAgICAgICAgICAgICAgICBUaWNrZXROdW1iZXIgPT4gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXROdW1iZXJMb29rdXAoCiAgICAgICAgICAgICAgICAgICAgICAgIFRpY2tldElEID0+ICRUaWNrZXRJRCwKICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgPT4gMQogICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgICAgICAgU3ViamVjdCA9PiAkUGFyYW17R2V0UGFyYW19LT57U3ViamVjdH0sCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgICRQYXJhbXtHZXRQYXJhbX0tPnsnWC1PVFJTLUZvbGxvd1VwLVNlbmRlclR5cGUnfQogICAgICAgICAgICAgICAgICAgID0gJFNlbGYtPntDb25maWd9e1NlbmRlclR5cGV9OwogICAgICAgICAgICAgICAgJFBhcmFte0dldFBhcmFtfS0+eydYLU9UUlMtRm9sbG93VXAtQXJ0aWNsZVR5cGUnfQogICAgICAgICAgICAgICAgICAgID0gJFNlbGYtPntDb25maWd9e0FydGljbGVUeXBlfTsKCiAgICAgICAgICAgICAgICAjIFNldCBBcnRpY2xlIEZyZWUgRmllbGQgZm9yIFN0YXRlCiAgICAgICAgICAgICAgICAkUGFyYW17R2V0UGFyYW19LT57J1gtT1RSUy1Gb2xsb3dVcC1BcnRpY2xlS2V5JwogICAgICAgICAgICAgICAgICAgICAgICAuICRTZWxmLT57Q29uZmlnfXsgJ0ZyZWVUZXh0U3RhdGUnIH0gfSA9ICdTdGF0ZSc7CiAgICAgICAgICAgICAgICAkUGFyYW17R2V0UGFyYW19LT57J1gtT1RSUy1Gb2xsb3dVcC1BcnRpY2xlVmFsdWUnCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJFNlbGYtPntDb25maWd9eyAnRnJlZVRleHRTdGF0ZScgfSB9ID0gJFNlbGYtPntTdGF0ZX07CgogICAgICAgICAgICAgICAgaWYgKCAkU2VsZi0+e1N0YXRlfSA9fiAvJFNlbGYtPntDb25maWd9e0Nsb3NlVGlja2V0UmVnRXhwfS8gKQogICAgICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICAgICAjIENsb3NlIFRpY2tldCBDb25kaXRpb24gLT4gVGFrZSBDbG9zZSBBY3Rpb24KICAgICAgICAgICAgICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnfXtDbG9zZUFjdGlvblN0YXRlfSBuZSAnT0xEJyApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFBhcmFte0dldFBhcmFtfS0+eydYLU9UUlMtRm9sbG93VXAtU3RhdGUnfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ317Q2xvc2VBY3Rpb25TdGF0ZX07CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJhbXtHZXRQYXJhbX0tPnsnWC1PVFJTLVN0YXRlLVBlbmRpbmdUaW1lJ30KICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gJFNlbGYtPntUaW1lT2JqZWN0fS0+U3lzdGVtVGltZTJUaW1lU3RhbXAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeXN0ZW1UaW1lID0+ICRTZWxmLT57VGltZU9iamVjdH0tPlN5c3RlbVRpbWUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgJFNlbGYtPntDb25maWd9e0Nsb3NlUGVuZGluZ1RpbWV9ICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICRMb2dNZXNzYWdlID0gJ1JlY292ZXJlZCcgLiAkTG9nTWVzc2FnZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICAgICAjIEF0dGFjaCBub3RlIHRvIGV4aXN0aW5nIHRpY2tldAogICAgICAgICAgICAgICAgICAgICRMb2dNZXNzYWdlID0gJ05ldyBOb3RpY2UnIC4gJExvZ01lc3NhZ2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzaWYgKCAkU2VsZi0+e1N0YXRlfSA9fiAvJFNlbGYtPntDb25maWd9e05ld1RpY2tldFJlZ0V4cH0vICkgewoKICAgICAgICAgICAgICAgICMgQ3JlYXRlIFRpY2tldCBDb25kaXRpb24gLT4gQ3JlYXRlIG5ldyBUaWNrZXQgYW5kIHJlY29yZCBIb3N0IGFuZCBTZXJ2aWNlCiAgICAgICAgICAgICAgICBmb3IgKHF3ICggSG9zdCBTZXJ2aWNlICkpIHsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17R2V0UGFyYW19LT57ICdYLU9UUlMtVGlja2V0S2V5JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLiAkU2VsZi0+e0NvbmZpZ317ICdGcmVlVGV4dCcgLiAkXyB9IH0gPSAkXzsKICAgICAgICAgICAgICAgICAgICAkUGFyYW17R2V0UGFyYW19LT57ICdYLU9UUlMtVGlja2V0VmFsdWUnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuICRTZWxmLT57Q29uZmlnfXsgJ0ZyZWVUZXh0JyAuICRfIH0gfQogICAgICAgICAgICAgICAgICAgICAgICA9ICRTZWxmLT57JF99OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICMgU2V0IEFydGljbGUgRnJlZSBGaWVsZCBmb3IgU3RhdGUKICAgICAgICAgICAgICAgICRQYXJhbXtHZXRQYXJhbX0tPnsnWC1PVFJTLUFydGljbGVLZXknCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJFNlbGYtPntDb25maWd9eyAnRnJlZVRleHRTdGF0ZScgfSB9ID0gJ1N0YXRlJzsKICAgICAgICAgICAgICAgICRQYXJhbXtHZXRQYXJhbX0tPnsnWC1PVFJTLUFydGljbGVWYWx1ZScKICAgICAgICAgICAgICAgICAgICAgICAgLiAkU2VsZi0+e0NvbmZpZ317ICdGcmVlVGV4dFN0YXRlJyB9IH0gPSAkU2VsZi0+e1N0YXRlfTsKCiAgICAgICAgICAgICAgICAkUGFyYW17R2V0UGFyYW19LT57J1gtT1RSUy1TZW5kZXJUeXBlJ30KICAgICAgICAgICAgICAgICAgICA9ICRTZWxmLT57Q29uZmlnfXtTZW5kZXJUeXBlfTsKICAgICAgICAgICAgICAgICRQYXJhbXtHZXRQYXJhbX0tPnsnWC1PVFJTLUFydGljbGVUeXBlJ30KICAgICAgICAgICAgICAgICAgICA9ICRTZWxmLT57Q29uZmlnfXtBcnRpY2xlVHlwZX07CiAgICAgICAgICAgICAgICAkTG9nTWVzc2FnZSA9ICdOZXcgVGlja2V0JyAuICRMb2dNZXNzYWdlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewoKICAgICAgICAgICAgICAgICMgTm8gZXhpc3RpbmcgdGlja2V0IGFuZCBubyBvcGVuIGNvbmRpdGlvbiAtPiBkcm9wIHNpbGVudGx5CiAgICAgICAgICAgICAgICAkUGFyYW17R2V0UGFyYW19LT57J1gtT1RSUy1JZ25vcmUnfSA9ICd5ZXMnOwogICAgICAgICAgICAgICAgJExvZ01lc3NhZ2UKICAgICAgICAgICAgICAgICAgICA9ICdNYWlsIERyb3BwZWQsIG5vIG1hdGNoaW5nIHRpY2tldCBmb3VuZCwgbm8gb3BlbiBvbiB0aGlzIHN0YXRlJwogICAgICAgICAgICAgICAgICAgIC4gJExvZ01lc3NhZ2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRMb2dNZXNzYWdlCiAgICAgICAgICAgICAgICA9ICdTeXN0ZW1Nb25pdG9yaW5nOiBDb3VsZCBub3QgZmluZCBob3N0IGFkZHJlc3MgYW5kL29yIHN0YXRlIGluIG1haWwgPT4gSWdub3JpbmcnOwogICAgICAgIH0KICAgICAgICBpZiAoJExvZ01lc3NhZ2UpIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdTeXN0ZW1Nb25pdG9yaW5nIE1haWw6ICcgLiAkTG9nTWVzc2FnZSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgfQogICAgcmV0dXJuIDE7Cn0KCjE7Cg==
IyAtLQojIEtlcm5lbC9TeXN0ZW0vVGlja2V0L0V2ZW50L05hZ2lvc0Fja25vd2xlZGdlLnBtIC0gYWNrbm93bGVnZSBuYWdpb3MgdGlja2V0cwojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogTmFnaW9zQWNrbm93bGVkZ2UucG0sdiAxLjggMjAwOC8xMC8wOSAyMTo1ODozMCBqYiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpUaWNrZXQ6OkV2ZW50OjpOYWdpb3NBY2tub3dsZWRnZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKdXNlIExXUDo6VXNlckFnZW50OwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS44ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBnZXQgbmVlZGVkIG9iamVjdHMKICAgIGZvciAoCiAgICAgICAgcXcoQ29uZmlnT2JqZWN0IFRpY2tldE9iamVjdCBMb2dPYmplY3QgVXNlck9iamVjdCBDdXN0b21lclVzZXJPYmplY3QgU2VuZG1haWxPYmplY3QgVGltZU9iamVjdCBFbmNvZGVPYmplY3QgVXNlck9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CgogICAgIyBnZXQgY29ycmVjdCBGcmVlRmllbGRzCiAgICAkU2VsZi0+e0Zob3N0fSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnTmFnaW9zOjpBY2tub3dsZWRnZTo6RnJlZUZpZWxkOjpIb3N0JyApOwogICAgJFNlbGYtPntGc2VydmljZX0gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ05hZ2lvczo6QWNrbm93bGVkZ2U6OkZyZWVGaWVsZDo6U2VydmljZScgKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhUaWNrZXRJRCBFdmVudCBDb25maWcpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY2hlY2sgaWYgYWNrbm93bGVkZ2UgaXMgYWN0aXZlCiAgICBteSAkVHlwZSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdOYWdpb3M6OkFja25vd2xlZGdlOjpUeXBlJyk7CiAgICByZXR1cm4gMSBpZiAhJFR5cGU7CgogICAgIyBjaGVjayBpZiBpdCdzIGEgTmFnaW9zIHJlbGF0ZWQgdGlja2V0CiAgICBteSAlVGlja2V0ID0gJFNlbGYtPntUaWNrZXRPYmplY3R9LT5UaWNrZXRHZXQoIFRpY2tldElEID0+ICRQYXJhbXtUaWNrZXRJRH0gKTsKICAgIGlmICggISRUaWNrZXR7JFNlbGYtPntGaG9zdH19ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZGVidWcnLCBNZXNzYWdlID0+ICJObyBOYWdpb3MgVGlja2V0ISIgKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KCiAgICAjIGNoZWNrIGlmIGl0J3MgYW4gYWNrbm93bGVkZ2UKICAgIHJldHVybiAxIGlmICRUaWNrZXR7TG9ja30gbmUgJ2xvY2snOwoKICAgICMgYWdlbnQgbG9va3VwCiAgICBteSAlVXNlciA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgIENhY2hlZCA9PiAxLCAjIG5vdCByZXF1aXJlZCAtPiAwfDEgKGRlZmF1bHQgMCkKICAgICk7CgogICAgbXkgJFJldHVybjsKICAgIGlmICggJFR5cGUgZXEgJ3BpcGUnICkgewogICAgICAgICRSZXR1cm4gPSAkU2VsZi0+X1BpcGUoCiAgICAgICAgICAgIFRpY2tldCA9PiBcJVRpY2tldCwKICAgICAgICAgICAgVXNlciAgID0+IFwlVXNlciwKICAgICAgICApOwogICAgfQogICAgZWxzaWYgKCAkVHlwZSBlcSAnaHR0cCcgKSB7CiAgICAgICAgJFJldHVybiA9ICRTZWxmLT5fSFRUUCgKICAgICAgICAgICAgVGlja2V0ID0+IFwlVGlja2V0LAogICAgICAgICAgICBVc2VyICAgPT4gXCVVc2VyLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlVua25vd24gTmFnaW9zIGFja25vd2xlZGdlIHR5cGUgKCRUeXBlKSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgaWYgKCAkUmV0dXJuICkgewogICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+SGlzdG9yeUFkZCgKICAgICAgICAgICAgVGlja2V0SUQgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgIEhpc3RvcnlUeXBlICA9PiAnTWlzYycsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAiU2VudCBBY2tub3dsZWRnZSB0byBOYWdpb3MgKCRUeXBlKS4iLAogICAgICAgICAgICBDcmVhdGVVc2VySUQgPT4gJFBhcmFte1VzZXJJRH0sCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT57VGlja2V0T2JqZWN0fS0+SGlzdG9yeUFkZCgKICAgICAgICAgICAgVGlja2V0SUQgICAgID0+ICRQYXJhbXtUaWNrZXRJRH0sCiAgICAgICAgICAgIEhpc3RvcnlUeXBlICA9PiAnTWlzYycsCiAgICAgICAgICAgIE5hbWUgICAgICAgICA9PiAiV2FzIG5vdCBhYmxlIHRvIHNlbmQgQWNrbm93bGVkZ2UgdG8gTmFnaW9zICgkVHlwZSkhIiwKICAgICAgICAgICAgQ3JlYXRlVXNlcklEID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQp9CgpzdWIgX1BpcGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIChxdyhUaWNrZXQgVXNlcikpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAgICBteSAlVGlja2V0ID0gJXsgJFBhcmFte1RpY2tldH0gfTsKICAgIG15ICVVc2VyICAgPSAleyAkUGFyYW17VXNlcn0gfTsKCiAgICAjIHNlbmQgYWNrbm93bGVkZ2UgdG8gbmFnaW9zCiAgICBteSAkQ01EID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoICdOYWdpb3M6OkFja25vd2xlZGdlOjpOYW1lZFBpcGU6OkNNRCcgKTsKICAgIG15ICREYXRhOwogICAgaWYgKCAkVGlja2V0eyRTZWxmLT57RnNlcnZpY2V9fSAhfiAvXmhvc3QkL2kpIHsKICAgICAgICAkRGF0YSA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCAnTmFnaW9zOjpBY2tub3dsZWRnZTo6TmFtZWRQaXBlOjpTZXJ2aWNlJyApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJERhdGEgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCggJ05hZ2lvczo6QWNrbm93bGVkZ2U6Ok5hbWVkUGlwZTo6SG9zdCcgKTsKICAgIH0KCiAgICAjIHJlcGxhY2UgdGlja2V0IHRhZ3MKICAgIGZvciBteSAkS2V5ICgga2V5cyAlVGlja2V0ICkgewogICAgICAgIG5leHQgaWYgIWRlZmluZWQgJFRpY2tldHskS2V5fTsKCiAgICAgICAgIyBzdHJpcCBub3QgYWxsb3dkIGNoYXJzCiAgICAgICAgJFRpY2tldHskS2V5fSA9fiBzLycvL2c7CiAgICAgICAgJFRpY2tldHskS2V5fSA9fiBzLzsvL2c7CiAgICAgICAgJERhdGEgPX4gcy88JEtleT4vJFRpY2tldHskS2V5fS9nOwogICAgfQoKICAgICMgcmVwbGFjZSBjb25maWcgdGFncwogICAgJERhdGEgPX4gc3s8Q09ORklHXyguKz8pPn17JFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJDEpfWVneDsKCiAgICAjIHJlcGxhY2UgbG9naW4KICAgICREYXRhID1+IHMvPExPR0lOPi8kVXNlcntVc2VyTG9naW59L2c7CgogICAgIyByZXBsYWNlIGhvc3QKICAgICREYXRhID1+IHMvPEhPU1RfTkFNRT4vJFRpY2tldHskU2VsZi0+e0Zob3N0fX0vZzsKCiAgICAjIHJlcGxhY2UgdGltZSBzdGFtcAogICAgJERhdGEgPX4gcy88U0VSVklDRV9OQU1FPi8kVGlja2V0eyRTZWxmLT57RnNlcnZpY2V9fS9nOwoKICAgICMgcmVwbGFjZSB0aW1lIHN0YW1wCiAgICBteSAkVGltZSA9IHRpbWUoKTsKICAgICREYXRhID1+IHMvPFVOSVhUSU1FPi8kVGltZS9nOwoKICAgICMgcmVwbGFjZSBPVVRQVVRTVFJJTkcKICAgICRDTUQgPX4gcy88T1VUUFVUU1RSSU5HPi8kRGF0YS9nOwoKI3ByaW50IFNURE9VVCAiJENNRFxuIjsKICAgIHN5c3RlbSAoICRDTUQgKTsKCiAgICByZXR1cm4gMTsKfQoKc3ViIF9IVFRQIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciAocXcoVGlja2V0IFVzZXIpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgbXkgJVRpY2tldCA9ICV7ICRQYXJhbXtUaWNrZXR9IH07CiAgICBteSAlVXNlciAgID0gJXsgJFBhcmFte1VzZXJ9IH07CgogICAgbXkgJFVSTCAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnTmFnaW9zOjpBY2tub3dsZWRnZTo6SFRUUDo6VVJMJyk7CiAgICBteSAkVXNlciA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdOYWdpb3M6OkFja25vd2xlZGdlOjpIVFRQOjpVc2VyJyk7CiAgICBteSAkUHcgICA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdOYWdpb3M6OkFja25vd2xlZGdlOjpIVFRQOjpQYXNzd29yZCcpOwoKICAgIGlmICggJFRpY2tldHskU2VsZi0+e0ZzZXJ2aWNlfX0gIX4gL15ob3N0JC9pKSB7CiAgICAgICAgJFVSTCA9fiBzLzxDTURfVFlQPi8zNC9nOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFVSTCA9fiBzLzxDTURfVFlQPi8zMy9nOwogICAgfQoKICAgICMgcmVwbGFjZSBob3N0CiAgICAkVVJMID1+IHMvPEhPU1RfTkFNRT4vJFRpY2tldHskU2VsZi0+e0Zob3N0fX0vZzsKCiAgICAjIHJlcGxhY2UgdGltZSBzdGFtcAogICAgJFVSTCA9fiBzLzxTRVJWSUNFX05BTUU+LyRUaWNrZXR7JFNlbGYtPntGc2VydmljZX19L2c7CiAgICAjIHJlcGxhY2UgdGlja2V0IHRhZ3MKCiAgICBmb3IgbXkgJEtleSAoIGtleXMgJVRpY2tldCApIHsKICAgICAgICBuZXh0IGlmICFkZWZpbmVkICRUaWNrZXR7JEtleX07CgogICAgICAgICMgc3RyaXAgbm90IGFsbG93ZCBjaGFycwogICAgICAgICRUaWNrZXR7JEtleX0gPX4gcy8nLy9nOwogICAgICAgICRUaWNrZXR7JEtleX0gPX4gcy87Ly9nOwogICAgICAgICRVUkwgPX4gcy88JEtleT4vJFRpY2tldHskS2V5fS9nOwogICAgfQoKICAgICMgcmVwbGFjZSBjb25maWcgdGFncwogICAgJFVSTCA9fiBzezxDT05GSUdfKC4rPyk+fXskU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgkMSl9ZWd4OwoKICAgIG15ICRVc2VyQWdlbnQgPSBMV1A6OlVzZXJBZ2VudC0+bmV3KCk7CiAgICAkVXNlckFnZW50LT50aW1lb3V0KCAxNSApOwoKICAgIG15ICRSZXF1ZXN0ID0gSFRUUDo6UmVxdWVzdC0+bmV3KCBHRVQgPT4gJFVSTCApOwogICAgJFJlcXVlc3QtPmF1dGhvcml6YXRpb25fYmFzaWMoICRVc2VyLCAkUHcgKTsKICAgIG15ICRSZXNwb25zZSA9ICRVc2VyQWdlbnQtPnJlcXVlc3QoJFJlcXVlc3QpOwogICAgaWYgKCAhJFJlc3BvbnNlLT5pc19zdWNjZXNzKCkgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4ndCByZXF1ZXN0ICRVUkw6ICIgLiAkUmVzcG9uc2UtPnN0YXR1c19saW5lKCksCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CiMgICAgcmV0dXJuICRSZXNwb25zZS0+Y29udGVudCgpOwoKICAgIHJldHVybiAxOwp9CjE7Cg==
PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQXBwbGljYXRpb24iPgogICAgPENWUz4kSWQ6IFN5c3RlbU1vbml0b3JpbmcueG1sLHYgMS4xNCAyMDA4LzEwLzI5IDIxOjA3OjE1IGpiIEV4cCAkPC9DVlM+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJQb3N0TWFzdGVyOjpQcmVGaWx0ZXJNb2R1bGUjIyMxLVN5c3RlbU1vbml0b3JpbmciIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5CYXNpYyBtYWlsIGludGVyZmFjZSB0byBTeXN0ZW0gTW9uaXRvcmluZyBTdWl0ZXMuIFVzZSB0aGlzIGJsb2NrIGlmIHRoZSBmaWx0ZXIgc2hvdWxkIHJ1biBBRlRFUiBQb3N0TWFzdGVyRmlsdGVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5FaW5mYWNoZSBFbWFpbCBTY2huaXR0c3RlbGxlIHp1IFN5c3RlbSBNb25pdG9yaW5nIFN1aXRlcy4gRGllc2VuIEJsb2NrIG51dHplbiwgd2VubiBkaWVzZXIgRmlsdGVyIE5BQ0ggZGVuIFBvc3RNYXN0ZXJGaWx0ZXJuIGdlbnV0enQgd2VyZGVuIHNvbGwuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3lzdGVtTW9uaXRvcmluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OlBvc3RNYXN0ZXI8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6UG9zdE1hc3Rlcjo6RmlsdGVyOjpTeXN0ZW1Nb25pdG9yaW5nPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJGcm9tQWRkcmVzc1JlZ0V4cCI+bmFnaW9zQGV4YW1wbGUuY29tPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTdGF0ZVJlZ0V4cCI+XHMqU3RhdGU6XHMrKFxTKyk8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ikhvc3RSZWdFeHAiPlxzKkhvc3Q6XHMrKC4qKVxzKjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iU2VydmljZVJlZ0V4cCI+XHMqU2VydmljZTpccysoLiopXHMqPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOZXdUaWNrZXRSZWdFeHAiPkNSSVRJQ0FMfERPV048L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNsb3NlVGlja2V0UmVnRXhwIj5PS3xVUDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2xvc2VBY3Rpb25TdGF0ZSI+Y2xvc2VkIHN1Y2Nlc3NmdWw8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkNsb3NlUGVuZGluZ1RpbWUiPjE3MjgwMDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRGVmYXVsdFNlcnZpY2UiPkhvc3Q8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkZyZWVUZXh0SG9zdCI+MTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRnJlZVRleHRTZXJ2aWNlIj4yPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTZW5kZXJUeXBlIj5zeXN0ZW08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkFydGljbGVUeXBlIj5ub3RlLXJlcG9ydDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRnJlZVRleHRTdGF0ZSI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlBvc3RNYXN0ZXI6OlByZUZpbHRlck1vZHVsZSMjIzAwMDEtU3lzdGVtTW9uaXRvcmluZyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIwIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkJhc2ljIG1haWwgaW50ZXJmYWNlIHRvIFN5c3RlbSBNb25pdG9yaW5nIFN1aXRlcy4gVXNlIHRoaXMgYmxvY2sgaWYgdGhlIGZpbHRlciBzaG91bGQgcnVuIEJFRk9SRSBQb3N0TWFzdGVyRmlsdGVyLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5FaW5mYWNoZSBFbWFpbCBTY2huaXR0c3RlbGxlIHp1IFN5c3RlbSBNb25pdG9yaW5nIFN1aXRlcy4gRGllc2VuIEJsb2NrIG51dHplbiwgd2VubiBkaWVzZXIgRmlsdGVyIFZPUiBkZW4gUG9zdE1hc3RlckZpbHRlcm4gZ2VudXR6dCB3ZXJkZW4gc29sbC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5TeXN0ZW1Nb25pdG9yaW5nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6UG9zdE1hc3RlcjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOjpGaWx0ZXI6OlN5c3RlbU1vbml0b3Jpbmc8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkZyb21BZGRyZXNzUmVnRXhwIj5uYWdpb3NAZXhhbXBsZS5jb208L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlN0YXRlUmVnRXhwIj5ccypTdGF0ZTpccysoXFMrKTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iSG9zdFJlZ0V4cCI+XHMqSG9zdDpccysoLiopXHMqPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJTZXJ2aWNlUmVnRXhwIj5ccypTZXJ2aWNlOlxzKyguKilccyo8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik5ld1RpY2tldFJlZ0V4cCI+Q1JJVElDQUx8RE9XTjwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2xvc2VUaWNrZXRSZWdFeHAiPk9LfFVQPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJDbG9zZUFjdGlvblN0YXRlIj5jbG9zZWQgc3VjY2Vzc2Z1bDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQ2xvc2VQZW5kaW5nVGltZSI+MTcyODAwPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJEZWZhdWx0U2VydmljZSI+SG9zdDwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRnJlZVRleHRIb3N0Ij4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJGcmVlVGV4dFNlcnZpY2UiPjI8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IlNlbmRlclR5cGUiPnN5c3RlbTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iQXJ0aWNsZVR5cGUiPm5vdGUtcmVwb3J0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJGcmVlVGV4dFN0YXRlIj4xPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTmFnaW9zOjpBY2tub3dsZWRnZTo6RnJlZUZpZWxkOjpIb3N0IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TmFtZSBvZiBUaWNrZXRGcmVlRmllbGQgZm9yIEhvc3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPk5hbWUgZGVzIFRpY2tldCBGcmVpIEZlbGRlczogSG9zdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5TeXN0ZW1Nb25pdG9yaW5nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+TmFnaW9zOjpBY2tub3dsZWRnZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+VGlja2V0RnJlZVRleHQxPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTmFnaW9zOjpBY2tub3dsZWRnZTo6RnJlZUZpZWxkOjpTZXJ2aWNlIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TmFtZSBvZiBUaWNrZXRGcmVlRmllbGQgZm9yIFNlcnZpY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPk5hbWUgZGVzIFRpY2tldCBGcmVpIEZlbGRlczogU2VydmljZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5TeXN0ZW1Nb25pdG9yaW5nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+TmFnaW9zOjpBY2tub3dsZWRnZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+VGlja2V0RnJlZVRleHQyPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTmFnaW9zOjpBY2tub3dsZWRnZTo6VHlwZSIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZSBOYWdpb3MgYWNrbm93bGVkZ2UgdHlwZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPlN5c3RlbU1vbml0b3Jpbmc8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5OYWdpb3M6OkFja25vd2xlZGdlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIiPi08L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9InBpcGUiPnBpcGU8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Imh0dHAiPmh0dHA8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9Ik5hZ2lvczo6QWNrbm93bGVkZ2U6Ok5hbWVkUGlwZTo6Q01EIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+TmFtZWQgcGlwZSBhY2tub3dsZWRnZSBjb21tYW5kLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5OYW1lZCBwaXBlIEFja25vd2xlZGdlIEJlZmVobC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5TeXN0ZW1Nb25pdG9yaW5nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+TmFnaW9zOjpBY2tub3dsZWRnZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+ZWNobyAnJmx0O09VVFBVVFNUUklORyZndDsnID4gL3Vzci9sb2NhbC9uYWdpb3MvdmFyL3J3L25hZ2lvcy5jbWQ8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJOYWdpb3M6OkFja25vd2xlZGdlOjpOYW1lZFBpcGU6Okhvc3QiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5OYW1lZCBwaXBlIGFja25vd2xlZGdlIGZvcm1hdCBmb3IgaG9zdC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TmFtZWQgcGlwZSBBY2tub3dsZWRnZSBGb3JtYXQgZvxyIEhvc3QuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3lzdGVtTW9uaXRvcmluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPk5hZ2lvczo6QWNrbm93bGVkZ2U8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPlsmbHQ7VU5JWFRJTUUmZ3Q7XSBBQ0tOT1dMRURHRV9IT1NUX1BST0JMRU07Jmx0O0hPU1RfTkFNRSZndDs7MTsxOzE7Jmx0O0xPR0lOJmd0OzsmbHQ7YSBocmVmPSImbHQ7Q09ORklHX0h0dHBUeXBlJmd0OzovLyZsdDtDT05GSUdfRlFETiZndDsvJmx0O0NPTkZJR19TY3JpcHRBbGlhcyZndDtpbmRleC5wbD9BY3Rpb249QWdlbnRUaWNrZXRab29tJmFtcDtUaWNrZXRJRD0mbHQ7VGlja2V0SUQmZ3Q7IiZndDsmbHQ7Q09ORklHX1RpY2tldDo6SG9vayZndDsmbHQ7VGlja2V0TnVtYmVyJmd0OyZsdDsvYSZndDs8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJOYWdpb3M6OkFja25vd2xlZGdlOjpOYW1lZFBpcGU6OlNlcnZpY2UiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5OYW1lZCBwaXBlIGFja25vd2xlZGdlIGZvcm1hdCBmb3Igc2VydmljZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+TmFtZWQgcGlwZSBBY2tub3dsZWRnZSBGb3JtYXQgZvxyIFNlcnZpY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3lzdGVtTW9uaXRvcmluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPk5hZ2lvczo6QWNrbm93bGVkZ2U8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPlsmbHQ7VU5JWFRJTUUmZ3Q7XSBBQ0tOT1dMRURHRV9TVkNfUFJPQkxFTTsmbHQ7SE9TVF9OQU1FJmd0OzsmbHQ7U0VSVklDRV9OQU1FJmd0OzsxOzE7MTsmbHQ7TE9HSU4mZ3Q7OyZsdDthIGhyZWY9IiZsdDtDT05GSUdfSHR0cFR5cGUmZ3Q7Oi8vJmx0O0NPTkZJR19GUUROJmd0Oy8mbHQ7Q09ORklHX1NjcmlwdEFsaWFzJmd0O2luZGV4LnBsP0FjdGlvbj1BZ2VudFRpY2tldFpvb20mYW1wO1RpY2tldElEPSZsdDtUaWNrZXRJRCZndDsiJmd0OyZsdDtDT05GSUdfVGlja2V0OjpIb29rJmd0OyZsdDtUaWNrZXROdW1iZXImZ3Q7Jmx0Oy9hJmd0OzwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IlRpY2tldDo6RXZlbnRNb2R1bGVQb3N0IyMjOS1OYWdpb3NBY2tub3dsZWRnZSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRpY2tldCBldmVudCBtb2R1bGUgdG8gc2VuZCBhbiBhY2tub3dsYWdlIHRvIE5hZ2lvcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+VGlja2V0IEV2ZW50IE1vZHVsIGb8ciBhdXRvbWF0aXNjaGVzIHNlbmRlbiBlaW5lcyBBY2tub3dsZWRnZSBhbiBOYWdpb3MuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3lzdGVtTW9uaXRvcmluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPk5hZ2lvczo6QWNrbm93bGVkZ2U8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6VGlja2V0OjpFdmVudDo6TmFnaW9zQWNrbm93bGVkZ2U8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IkV2ZW50Ij5UaWNrZXRMb2NrVXBkYXRlPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iTmFnaW9zOjpBY2tub3dsZWRnZTo6SFRUUDo6VVJMIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGh0dHAgYWNrbm93bGVkZ2UgdXJsLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgaHR0cCBBY2tub3dsZWRnZSBVUkwuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3lzdGVtTW9uaXRvcmluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPk5hZ2lvczo6QWNrbm93bGVkZ2U8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPmh0dHA6Ly9uYWdpb3MuZXhhbXBsZS5jb20vbmFnaW9zL2NnaS1iaW4vY21kLmNnaT9jbWRfdHlwPSZsdDtDTURfVFlQJmd0OyZhbXA7Y21kX21vZD0yJmFtcDtob3N0PSZsdDtIT1NUX05BTUUmZ3Q7JmFtcDtzZXJ2aWNlPSZsdDtTRVJWSUNFX05BTUUmZ3Q7JmFtcDtzdGlja3lfYWNrPW9uJmFtcDtzZW5kX25vdGlmaWNhdGlvbj1vbiZhbXA7cGVyc2lzdGVudD1vbiZhbXA7Y29tX2RhdGE9Jmx0O1RpY2tldE51bWJlciZndDsmYW1wO2J0blN1Ym1pdD1Db21taXQ8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJOYWdpb3M6OkFja25vd2xlZGdlOjpIVFRQOjpVc2VyIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+VGhlIGh0dHAgYWNrbm93bGVkZ2UgdXNlci48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGllIGh0dHAgQWNrbm93bGVkZ2UgQmVudXR6ZXIuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+U3lzdGVtTW9uaXRvcmluZzwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPk5hZ2lvczo6QWNrbm93bGVkZ2U8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPkpvaG48L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJOYWdpb3M6OkFja25vd2xlZGdlOjpIVFRQOjpQYXNzd29yZCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlRoZSBodHRwIGFja25vd2xlZGdlIHBhc3N3b3JkLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5EaWUgaHR0cCBBY2tub3dsZWRnZSBQYXNzd29ydC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5TeXN0ZW1Nb25pdG9yaW5nPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+TmFnaW9zOjpBY2tub3dsZWRnZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+c29tZV9wYXNzPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgo8L290cnNfY29uZmlnPgo=
IyAtLQojIEV4YW1wbGUgQ29uZmlnZmlsZSBmb3Igb3Rycy5OYWdpb3NDaGVjayAtIE9UUlMgTmFnaW9zIGNoZWNrZXIKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IE5hZ2lvc0NoZWNrLnBtLmV4YW1wbGUsdiAxLjIgMjAwOC8xMC8xNiAyMzowNzoyOSBqYiBFeHAgJAojIC0tCiMgRm9yIHBvc3NpYmxlIHNlYXJjaCBvcHRpb25zIHNlZToKIyBodHRwOi8vZGV2Lm90cnMub3JnL2N2cy9LZXJuZWwvU3lzdGVtL1RpY2tldC5odG1sIC0+IFRpY2tldFNlYXJjaCgpCiMgRXhhbXBsZXMgc2VlIGJlbG93CiMgLS0KCiVDb25maWcgPSAoCiAgIFNlYXJjaCA9PiB7CgogICAgICAgIyB0aWNrZXRzIGNyZWF0ZWQgaW4gdGhlIGxhc3QgMTIwIG1pbnV0ZXMKICAgICAgIFRpY2tldENyZWF0ZVRpbWVOZXdlck1pbnV0ZXMgPT4gMTIwLAoKICAgICAgICMgdGlja2V0IG51bWJlciBhcyBTVFJJTkcgb3IgYXMgQVJSQVlSRUYKIyAgICAgICAgVGlja2V0TnVtYmVyID0+ICclMTIzNTQ2JScsCiMgICAgICAgIFRpY2tldE51bWJlciA9PiBbJyUxMjM1NDYlJywgJyUxMjM2NjYlJ10sCgogICAgICAgIyB0aWNrZXQgcXVldWVzCiMgICAgICAgIFF1ZXVlcyAgID0+IFsnc3lzdGVtIHF1ZXVlJywgJ290aGVyIHF1ZXVlJ10sCgogICAgICAgIyB0aWNrZXQgdHlwZXMKIyAgICAgICAgVHlwZXMgICA9PiBbJ25vcm1hbCcsICdjaGFuZ2UnLCAnaW5jaWRlbnQnXSwKCiAgICAgICAjIHRpY2tldCBwcmlvcml0aWVzCiMgICAgICAgIFByaW9yaXRpZXMgID0+IFsnMSB2ZXJ5IGxvdycsICcyIGxvdycsICczIG5vcm1hbCddLAoKICAgICAgICMgdGlja2V0IHNlcnZpY2VzCiMgICAgICAgIFNlcnZpY2VzICAgPT4gWydTZXJ2aWNlIEEnLCAnU2VydmljZSBCJ10sCgogICAgICAgIyB0aWNrZXQgbG9ja3MKIyAgICAgICAgTG9ja3MgICA9PiBbJ3VubG9jayddLAoKICAgICAgICMgdGlja2V0IGN1c3RvbWVycwojICAgICAgICBDdXN0b21lcklEID0+ICcxMjMnLAojICAgICAgICBDdXN0b21lcklEID0+IFsnMTIzJywgJ0FCQyddLAoKICAgICAgICMgMS4uMTYgZnJlZSB0ZXh0IGZpZWxkcwojICAgICAgICBUaWNrZXRGcmVlS2V5MSAgPT4gJ1Byb2R1Y3QnLAojICAgICAgICBUaWNrZXRGcmVlVGV4dDEgPT4gJ2FkYXNkJywKCiAgICAgICAjIG9yIHdpdGggbXVsdGkgb3B0aW9ucyBhcyBhcnJheSByZWYgb3Igc3RyaW5nIHBvc3NpYmxlCiMgICAgICAgIFRpY2tldEZyZWVLZXkyICA9PiBbJ1Byb2R1Y3QnLCAnUHJvZHVjdDInXSwKIyAgICAgICAgVGlja2V0RnJlZVRleHQyID0+IFsnQnJvd3NlcicsICdTb3VuZCcsICdNb3VzZSddLAogICB9LAoKIyBEZWNsYXJhdGlvbiBvZiB0cmVzaG9sZHMKIyBtaW5fd2Fybl90cmVzaG9sZCA+IE51bWJlciBvZiB0aWNrZXRzIC0+IFdBUk5JTkcKIyBtYXhfd2Fybl90cmVzaG9sZCA8IE51bWJlciBvZiB0aWNrZXRzIC0+IFdBUk5JTkcKIyBtaW5fY3JpdF90cmVzaG9sZCA+IE51bWJlciBvZiB0aWNrZXRzIC0+IEFMQVJNCiMgbWF4X3dhcm5fdHJlc2hvbGQgPCBOdW1iZXIgb2YgdGlja2V0cyAtPiBBTEFSTQoKICAgbWluX3dhcm5fdHJlc2hvbGQgPT4gNSwKICAgbWF4X3dhcm5fdHJlc2hvbGQgPT4gMTAsCiAgIG1pbl9jcml0X3RyZXNob2xkID0+IDIsCiAgIG1heF9jcml0X3RyZXNob2xkID0+IDIwLAoKIyBJbmZvcm1hdGlvbiB1c2VkIGJ5IE5hZ2lvcwojIE5hbWUgb2YgY2hlY2sgc2hvd24gaW4gTmFnaW9zIFN0YXR1cyBJbmZvcm1hdGlvbgogICBjaGVja25hbWUgPT4gJ09UUlMgQ2hlY2tlcicsCgojIFRleHQgc2hvd24gaW4gU3RhdHVzIEluZm9ybWF0aW9uIGlmIGV2ZXJ5dGhpbmcgaXMgb2sKICAgT0tfVFhUICAgID0+ICdlbmpveSAgIHRpY2tldHM6JywKCiMgVGV4dCBzaG93biBpbiBTdGF0dXMgSW5mb3JtYXRpb24gaWYgd2FybmluZyB0aHJlc2hob2xkIHJlYWNoZWQKICAgV0FSTl9UWFQgID0+ICdudW1iZXIgb2YgdGlja2V0czonLAoKIyBUZXh0IHNob3duIGluIFN0YXR1cyBJbmZvcm1hdGlvbiBpZiBjcml0aWNhbCB0aHJlc2hob2xkIHJlYWNoZWQKICAgQ1JJVF9UWFQgID0+ICdjcml0aWNhbCBudW1iZXIgb2YgdGlja2V0czonLAoKKTsKCg==
TkFNRQogICAgS2VybmVsOjpTeXN0ZW06OlBvc3RNYXN0ZXI6OkZpbHRlcjo6U3lzdGVtTW9uaXRvcmluZyAtIEJhc2ljIFN5c3RlbQogICAgTW9uaXRvcmluZyBJbnRlcmZhY2UKClNZTk9QU0lTCiAgICBUaGlzIG1vZHVsZSBpbXBsZW1ldHMgYSBiYXNpYyBpbnRlcmZhY2UgdG8gU3lzdGVtIE1vbml0b3JpbmcgU3VpdGVzLiBJdAogICAgd29ya3MgYnkgcmVjZWl2aW5nIGVtYWlsIG1lc3NhZ2VzIHNlbnQgYnkgdGhlIE1vbml0b3JpbmcgU3VpdGUuIE5ldwogICAgdGlja2V0cyBhcmUgY3JlYXRlZCBpbiBjYXNlIG9mIGNvbXBvbmVudCBmYWlsdXJlcy4gT25jZSBhIHRpY2tldCBoYXMKICAgIGJlZW4gb3BlbmVkIG1lc3NhZ2VzIHJlZ2FyZGluZyB0aGUgZWZmZWN0ZWQgY29tcG9uZW50IGFyZSBhdHRhY2hlZCB0bwogICAgdGhpcyB0aWNrZXQuIFdoZW4gdGhlIGNvbXBvbmVudCByZWNvdmVycywgdGhlIHRpY2tldCBzdGF0ZSBjYW4gYmUKICAgIGNoYW5nZWQgb3IgdGhlIHRpY2tldCBjYW4gYmUgY2xvc2VkLgoKICAgIE9uY2UgYSBvcGVuIHRpY2tldCBmb3IgYSBnaXZlbiBIb3N0L1NlcnZpY2UgY29tYmluYXRpb24gZXhpc3RzLCBhbGwKICAgIG1haWxzIGNvbmNlcm5pbmcgdGhpcyBwYXJ0aWN1bGFyIGNvbWJpbmF0aW9uIHdpbGwgYmUgYXR0YWNoZWQgdG8gdGhlCiAgICB0aWNrZXQgdW50aWwgaXQncyBjbG9zZWQuCgpDT05GSUdVUkFUSU9OIE9QVElPTlMKICAgIFRvIGFsbG93IGZsZXhpYmxlIGludGVncmF0aW9uIGJldHdlZW4gT1RSUyBhbmQgYSBTeXN0ZW0gTW9uaXRvcmluZyBTdWl0ZQogICAgdGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIGF2YWlsYWJsZS4gVGhlIGRlZmF1bHQgdmFsdWVzCiAgICAoYXMgc2hvd24gYmVsb3cpIHNob3VsZCBiZSBzdWl0YWJsZSBmb3IgYSBzdGFuZGFyZCBOYWdpb3MgaW5zdGFsbGF0aW9uLgoKICAgICogIkZyb21BZGRyZXNzUmVnRXhwIgogICAgICAgIE9ubHkgbWFpbHMgbWF0Y2hpbmcgdGhpcyAiRnJvbToiIGFkZHJlc3Mgd2lsbCBiZSBjb25zaWRlcmVkIGZvciB0aGlzCiAgICAgICAgZmlsdGVyLiBZb3UgbmVlZCB0byBhZGp1c3QgdGhpcyBzZXR0aW5nIHRvIHRoZSBmcm9tIGFkZHJlc3MgeW91cgogICAgICAgIFN5c3RlbSBNb25pdG9yaW5nIFN1aXRlIHVzZXMgZm9yIG91dGdvaW5nIG1haWxzLgoKICAgICAgICBEZWZhdWx0OiAnc3lzbW9uQG15c3lzdGVtLmNvbScKCiAgICAqICJTdGF0ZVJlZ0V4cCIKICAgICAgICBSZWd1bGFyIEV4cHJlc3Npb24gdG8gZXh0cmFjdCAiU3RhdGUiCgogICAgICAgIERlZmF1bHQ6ICdccypTdGF0ZTpccysoXFMrKScKCiAgICAqICJOZXdUaWNrZXRSZWdFeHAiCiAgICAgICAgUmVndWxhciBleHByZXNzaW9uIGZvciBleHRyYWN0ZWQgIlN0YXRlIiB0byB0cmlnZ2VyIG5ldyB0aWNrZXQKCiAgICAgICAgRGVmYXVsdDogJ0NSSVRJQ0FMfERPV04nCgogICAgKiAiQ2xvc2VUaWNrZXRSZWdFeHAiCiAgICAgICAgUmVndWxhciBleHByZXNzaW9uIGZvciBleHRyYWN0ZWQgIlN0YXRlIiB0byB0cmlnZ2VyIHRpY2tldAogICAgICAgIHRyYW5zaXRpb24gdG8gIkNsb3NlQWN0aW9uU3RhdGUiCgogICAgICAgIERlZmF1bHQ6ICdPS3xVUCcKCiAgICAqICJDbG9zZUFjdGlvblN0YXRlIgogICAgICAgIE5ldyBzdGF0dXMgZm9yIHRpY2tldCB3aGVuIHNlcnZpY2UgcmVjb3ZlcmVzLiBUaGlzIGNhbiBiZSBlaXRoZXIKICAgICAgICAiT0xEIiBpbiB3aGljaCBjYXNlIHRoZSBvbGQgc3RhdHVzIHN0YXlzLCBvciB0aGUgbmFtZSBvZiB0aGUgbmV3CiAgICAgICAgc3RhdHVzLiBQbGVhc2Ugbm90ZSwgdGhhdCB0aGlzIHN0YXRlIG5lZWRzIHRvIGJlIGNvbmZpZ3VyZWQgaW4geW91cgogICAgICAgIE9UUlMgaW5zdGFsbGF0aW9uIGFzIHZhbGlkIHN0YXRlLiBJZiB0aGUgc3RhdGUgeW91IHNldCBoZXJlIGRvZXMgbm90CiAgICAgICAgZXhpc3QsIHRoZSB0aWNrZXQgc3RhdGUgd2lsbCBub3QgYmUgYWx0ZXJlZC4KCiAgICAgICAgRGVmYXVsdDogJ2Nsb3NlZCBzdWNjZXNzZnVsJwoKICAgICogIkNsb3NlUGVuZGluZ1RpbWUiCiAgICAgICAgUGVuZGluZyB0aW1lIGluIHNlY29uZHMgZm9yICdQZW5kaW5nLi4uJyBzdGF0dXMgdGltZS4gKElnbm9yZWQgZm9yCiAgICAgICAgb3RoZXIgc3RhdHVzIHR5cGVzKS4gUGxlYXNlIG5vdGUgdGhhdCB0aGlzIHNldHRpbmcgd2lsbCBiZSBpZ25vcmVkCiAgICAgICAgYnkgT1RSUyB2ZXJzaW9ucyBvbGRlciB0aGFuIDIuMi4gT24gdGhlc2Ugc3lzdGVtcyB0aGUgcGVuZGluZyB0aW1lCiAgICAgICAgYWxyZWFkeSBhc3NvY2lhdGVkIHdpdGggdGhlIHRpY2tldCB3aWxsIGJlIHVzZWQsIHdoaWNoIG1heSBoYXZlIGluCiAgICAgICAgc3VycHJpc2luZyBlZmZlY3RzLiBJdCdzIHJlY29tbWVuZGVkIG5vdCB0byB1c2UgJ1BlbmRpbmcuLi4nIHN0YXRlcwogICAgICAgIHdpdGggT1RSUyBwcmlvciB0byAyLjIuCgogICAgICAgIERlZmF1bHQ6ICI2MCo2MCoyNCoyIiAoMiBkYXlzKQoKICAgICogIkhvc3RSZWdFeHAiCiAgICAgICAgUmVndWxhciBleHByZXNzaW9uIHRvIGV4dHJhY3QgIkhvc3QiCgogICAgICAgIERlZmF1bHQ6ICdccypBZGRyZXNzOlxzKyhcZCtcLlxkK1wuXGQrXC5cZCspXHMqJwoKICAgICogIkZyZWVUZXh0SG9zdCIKICAgICAgICBGcmVlIHRleHQgZmllbGQgaW5kZXggdG8gc3RvcmUgIkhvc3QiCgogICAgICAgIERlZmF1bHQ6ICcxJwoKICAgICogIlNlcnZpY2VSZWdFeHAiCiAgICAgICAgUmVndWxhciBleHByZXNzaW9uIHRvIGV4dHJhY3QgIlNlcnZpY2UiCgogICAgICAgIERlZmF1bHQ6ICdccypTZXJ2aWNlOlxzKyguKilccyonCgogICAgKiAiRGVmYXVsdFNlcnZpY2UiCiAgICAgICAgRGVmYXVsdCBmb3IgIlNlcnZpY2UiOyB1c2VkIGlmIG5vIHNlcnZpY2UgY2FuIGJlIGV4dHJhY3RlZCwgaS5lLiBpZgogICAgICAgIGhvc3QgZ29lcyBET1dOL1VQCgogICAgICAgIERlZmF1bHQ6ICdIb3N0JwoKICAgICogIkZyZWVUZXh5U2VydmljZSIKICAgICAgICBGcmVlIHRleHQgZmllbGQgaW5kZXggdG8gc3RvcmUgc2VydmljZQoKICAgICAgICBEZWZhdWx0OiAnMicKCiAgICAqICJTZW5kZXJUeXBlIgogICAgICAgIFNlbmRlciB0eXBlIHVzZWQgZm9yIGNyZWF0aW5nIHRpY2tldHMgYW5kIGF0dGFjaGluZyBub3RlcwoKICAgICAgICBEZWZhdWx0OiAic3lzdGVtIgoKICAgICogIkFydGljbGVUeXBlIgogICAgICAgIEFydGljbGUgdHlwZSB1c2VkIHRvIGF0dGFjaCBmb2xsb3cgdXAgZW1haWxzIHRvIGV4aXN0aW5nIHRpY2tldHMKCiAgICAgICAgRGVmYXVsdDogIm5vdGUtcmVwb3J0IgoKQ09OVFJPTCBGTE9XCiAgICBUaGUgZm9sbG93aW5nIGRpYWdyYW0gaWxsdXN0cmF0ZXMgaG93IG1haWxzIGFyZSBoYW5kbGVkIGJ5IHRoaXMgbW9kdWxlCiAgICBhbmQgaW4gd2hpY2ggY2FzZXMgdGhleSB0cmlnZ2VyIHdoaWNoIGFjdGlvbi4gUHJldHR5IG11Y2ggYWxsIGNoZWNrcyBhcmUKICAgIGNvbmZpZ2FibGUgdXNpbmcgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgZ2l2ZW4gYnkgdGhlIHBhcmFtZXRlcnMgbGlzdGVkCiAgICBhYm92ZS4KCiAgICAgTWFpbCBtYXRjaGVzICdGcm9tQWRkcmVzcyc/CiAgICAgfAogICAgICstPiBOTyAgLT4gQ29udGludWUgd2l0aCByZWd1bGFyIG1haWwgcHJvY2Vzc2luZwogICAgIHwKICAgICArLT4gWUVTIC0+IERvZXMgYSB0aWNrZXQgd2l0aCBtYXRjaGluZyBIb3N0L1NlcnZpY2UgY29tYmluYXRpb24KICAgICAgICAgICAgICAgIGFscmVhZHkgZXhpc3QgaW4gT1RSUz8KICAgICAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICstPiBOTyAgLT4gRG9lcyAnU3RhdGU6JyBtYXRjaCAnTmV3VGlja2V0UmVnRXhwJz8KICAgICAgICAgICAgICAgIHwgICAgICAgICAgfAogICAgICAgICAgICAgICAgfCAgICAgICAgICArLT4gTk8gIC0+IFN0b3AgcHJvY2Vzc2luZyB0aGlzIG1haWwKICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICAoc2lsZW50IGRyb3ApCiAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwKICAgICAgICAgICAgICAgIHwgICAgICAgICAgKy0+IFlFUyAtPiBDcmVhdGUgbmV3IHRpY2tldCwgcmVjb3JkIEhvc3QKICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICBhbmQgU2VydmljZSwgYXR0YWNoIG1haWwKICAgICAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICstPiBZRVMgLT4gQXR0YWNoIG1haWwgdG8gdGlja2V0CiAgICAgICAgICAgICAgICAgICAgICAgIC0+IERvZXMgJ1N0YXRlOicgbWF0Y2ggJ0Nsb3NlVGlja2V0UmVnRXhwJz8KICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICArLT4gTk8gIC0+IENvbnRpbnVlIHdpdGggcmVndWxhciBtYWlsIHByb2Nlc3NpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICArLT4gWUVTIC0+IENoYW5nZSB0aWNrZXQgdHlwZSBhcyBjb25maWd1cmVkIGluCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0Nsb3NlQWN0aW9uU3RhdGUnCgogICAgQmVzaWRlcyBvZiBhIGZldyBhZGRpdGlvbmFsIHNhbml0eSBjaGVja3MgdGhpcyBpcyBob3cgdGhlCiAgICBTeXN0ZW1Nb25pdG9yaW5nIG1vZHVsIHRyZWF0cyBpbmNvbWluZyBtYWlscy4gQnkgY2hhbmdpbmcgdGhlIHJlZ3VsYXIKICAgIGV4cHJlc3Npb25zIGl0IHNob3VsZCBiZSBwb3NzaWJsZSB0byBhZG9wdCBpdCB0byBkaWZmZXJlbnQgbW9uaXRvcmluZwogICAgc3lzdGVtcy4KCg==
IyAtLQojIFN5c3RlbU1vbml0b3JpbmcudCAtIFN5c3RlbU1vbml0b3JpbmcgdGVzdHMKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IFN5c3RlbU1vbml0b3JpbmcudCx2IDEuMSAyMDA4LzA5LzA4IDIyOjQ3OjE2IG1hcnRpbiBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgp1c2UgS2VybmVsOjpTeXN0ZW06OlRpY2tldDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyOwoKbXkgJEZpbGVBcnJheSA9ICRTZWxmLT57TWFpbk9iamVjdH0tPkZpbGVSZWFkKAogICAgTG9jYXRpb24gID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAnL3NjcmlwdHMvdGVzdC9zYW1wbGUvU3lzdGVtTW9uaXRvcmluZzEuYm94JywKICAgIFJlc3VsdCAgICA9PiAnQVJSQVknLCAjIG9wdGlvbmFsIC0gU0NBTEFSfEFSUkFZCik7CgpteSAkUG9zdE1hc3Rlck9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyLT5uZXcoCiAgICAleyRTZWxmfSwKICAgIEVtYWlsID0+ICRGaWxlQXJyYXksCik7CgpteSBAUmV0dXJuID0gJFBvc3RNYXN0ZXJPYmplY3QtPlJ1bigpOwokU2VsZi0+SXMoCiAgICAkUmV0dXJuWzBdIHx8IDAsCiAgICAxLAogICAgIlJ1bigpIC0gTmV3VGlja2V0IiwKKTsKJFNlbGYtPlRydWUoCiAgICAkUmV0dXJuWzFdIHx8IDAsCiAgICAiUnVuKCkgLSBOZXdUaWNrZXQvVGlja2V0SUQiLAopOwoKbXkgJFRpY2tldE9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpUaWNrZXQtPm5ldyggJXskU2VsZn0gKTsKbXkgJVRpY2tldCA9ICRUaWNrZXRPYmplY3QtPlRpY2tldEdldCgKICAgIFRpY2tldElEID0+ICRSZXR1cm5bMV0sCik7CgokU2VsZi0+SXMoCiAgICAkVGlja2V0e1RpY2tldEZyZWVUZXh0MX0sCiAgICAnZGVscGhpbicsCiAgICAiSG9zdCBjaGVjayIsCik7CgokU2VsZi0+SXMoCiAgICAkVGlja2V0e1RpY2tldEZyZWVUZXh0Mn0sCiAgICAnSG9zdCcsCiAgICAiU2VydmljZSBjaGVjayIsCik7CiRTZWxmLT5JcygKICAgICRUaWNrZXR7U3RhdGV9LAogICAgJ25ldycsCiAgICAiUnVuKCkgLSBUaWNrZXQgU3RhdGUiLAopOwoKJEZpbGVBcnJheSA9ICRTZWxmLT57TWFpbk9iamVjdH0tPkZpbGVSZWFkKAogICAgTG9jYXRpb24gID0+ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdIb21lJykgLiAnL3NjcmlwdHMvdGVzdC9zYW1wbGUvU3lzdGVtTW9uaXRvcmluZzIuYm94JywKICAgIFJlc3VsdCAgICA9PiAnQVJSQVknLCAjIG9wdGlvbmFsIC0gU0NBTEFSfEFSUkFZCik7CgokUG9zdE1hc3Rlck9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpQb3N0TWFzdGVyLT5uZXcoCiAgICAleyRTZWxmfSwKICAgIEVtYWlsID0+ICRGaWxlQXJyYXksCik7CgpAUmV0dXJuID0gJFBvc3RNYXN0ZXJPYmplY3QtPlJ1bigpOwokU2VsZi0+SXMoCiAgICAkUmV0dXJuWzBdIHx8IDAsCiAgICAyLAogICAgIlJ1bigpIC0gTmV3VGlja2V0IiwKKTsKJFNlbGYtPlRydWUoCiAgICAkUmV0dXJuWzFdID09ICRUaWNrZXR7VGlja2V0SUR9LAogICAgIlJ1bigpIC0gTmV3VGlja2V0L1RpY2tldElEIiwKKTsKCiRUaWNrZXRPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6VGlja2V0LT5uZXcoICV7JFNlbGZ9ICk7CiVUaWNrZXQgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXRHZXQoCiAgICBUaWNrZXRJRCA9PiAkUmV0dXJuWzFdLAopOwokU2VsZi0+SXMoCiAgICAkVGlja2V0e1N0YXRlfSwKICAgICdjbG9zZWQgc3VjY2Vzc2Z1bCcsCiAgICAiUnVuKCkgLSBUaWNrZXQgU3RhdGUiLAopOwoKIyBkZWxldGUgdGlja2V0Cm15ICREZWxldGUgPSAkVGlja2V0T2JqZWN0LT5UaWNrZXREZWxldGUoCiAgICBUaWNrZXRJRCA9PiAkUmV0dXJuWzFdLAogICAgVXNlcklEICAgPT4gMSwKKTsKJFNlbGYtPlRydWUoCiAgICAkRGVsZXRlIHx8IDAsCiAgICAiVGlja2V0RGVsZXRlKCkiLAopOwoKMTsK
UmV0dXJuLVBhdGg6IDxuYWdpb3NAZXhhbXBsZS5jb20+ClRvOiBvdHJzQGV4YW1wbGUuY29tClN1YmplY3Q6ICoqIFBST0JMRU0gYWxlcnQgMSAtIGRlbHBoaW4gaG9zdCBpcyBET1dOICoqCk1lc3NhZ2UtSWQ6IDwyMDA3MDMxNzIzMTU0Ni4wREZENTVEQzAwRkBoNTM3OTUuZXhhbXBsZS5jb20+CkRhdGU6IFN1biwgMTggTWFyIDIwMDcgMDA6MTU6NDYgKzAxMDAgKENFVCkKRnJvbTogbmFnaW9zQGV4YW1wbGUuY29tCk1pbWUtVmVyc2lvbjogMS4wCgoqKioqKiBOYWdpb3MgICoqKioqCgpOb3RpZmljYXRpb24gVHlwZTogUFJPQkxFTQpIb3N0OiBkZWxwaGluClN0YXRlOiBET1dOIGZvciAwZCAwaCAwbSAwcwpBZGRyZXNzOiAxMjcuMS4xLjEKSW5mbzoKCkNSSVRJQ0FMIC0gVGltZSB0byBsaXZlIGV4Y2VlZGVkICgxMjcuMS4xLjEpCgpEYXRlL1RpbWU6IFN1biBNYXIgMTggMDA6MTg6MzAgQ0VUIDIwMDcKCkFDSyBieTogCkNvbW1lbnQ6CiAKCgo=
UmV0dXJuLVBhdGg6IDxuYWdpb3NAZXhhbXBsZS5jb20+ClRvOiBvdHJzQGV4YW1wbGUuY29tClN1YmplY3Q6ICoqIFJFQ09WRVJZIGFsZXJ0IDIgLSBkZWxwaGluIGhvc3QgaXMgVVAgKioKTWVzc2FnZS1JZDogPDIwMDcwMzE3MjMxOTQ2LjBERkQ1NURDMDBGQGg1Mzc5NS5leGFtcGxlLmNvbT4KRGF0ZTogU3VuLCAxOCBNYXIgMjAwNyAwMDoxOTo0NiArMDEwMCAoQ0VUKQpGcm9tOiBuYWdpb3NAZXhhbXBsZS5jb20KTWltZS1WZXJzaW9uOiAxLjAKCioqKioqIE5hZ2lvcyAgKioqKioKCk5vdGlmaWNhdGlvbiBUeXBlOiBSRUNPVkVSWQpIb3N0OiBkZWxwaGluClN0YXRlOiBVUCBmb3IgMGQgMGggMG0gMHMKQWRkcmVzczogMTcyLjEuMS4xCkluZm86CgpQSU5HIE9LIC0gUGFja2V0IGxvc3MgPSAwJSwgUlRBID0gMTUuMDkgbXMKCkRhdGUvVGltZTogU3VuIE1hciAxOCAwMDoxOTo0NiBDRVQgMjAwNwoKQUNLIGJ5OiAKQ29tbWVudDogCg==