FAQImportExport 0.5.0 c.a.p.e. IT GmbH http://www.cape-it.de/ GNU GENERAL PUBLIC LICENSE Version 2, June 1991 First pre-productive release of general faq import/export backend . 2008-09-19 v0.0.0 Absolutely new package. Provides ImportExportBackend for FAQ. Stellt ImportExport-Backend fuer FAQ-Eintraege zur Verfuegung. 2.4.x <br> WELCOME<br> <br> You are about to install the OTRS module FAQImportExport.<br> <br> REQUIRED OTRS PACKAGES <ul> <li>ImportExport 1.3.x</li> </ul> <br> <br> c.a.p.e. IT ...global consulting - individual solutions.<br> <br> <br> The package has been installed. Your configuration has been changed.<br> <br> ImportExport my $FunctionName = 'CodeInstall'; my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content}; if ( $Self->{MainObject}->Require($CodeModule) ) { my $CodeObject = $CodeModule->new( %{$Self} ); if ($CodeObject) { if ( !$CodeObject->$FunctionName(%{$Self}) ) { $Self->{LogObject}->Log( Priority => 'error', Message => "Could not call method $FunctionName() on $CodeModule.pm." ); } } else { $Self->{LogObject}->Log( Priority => 'error', Message => "Could not call method new() on $CodeModule.pm." ); } } my $FunctionName = 'CodeUpgrade'; my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content}; if ( $Self->{MainObject}->Require($CodeModule) ) { my $CodeObject = $CodeModule->new( %{$Self} ); if ($CodeObject) { if ( !$CodeObject->$FunctionName(%{$Self}) ) { $Self->{LogObject}->Log( Priority => 'error', Message => "Could not call method $FunctionName() on $CodeModule.pm." ); } } else { $Self->{LogObject}->Log( Priority => 'error', Message => "Could not call method new() on $CodeModule.pm." ); } } my $FunctionName = 'CodeUninstall'; my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content}; if ( $Self->{MainObject}->Require($CodeModule) ) { my $CodeObject = $CodeModule->new( %{$Self} ); if ($CodeObject) { if ( !$CodeObject->$FunctionName(%{$Self}) ) { $Self->{LogObject}->Log( Priority => 'error', Message => "Could not call method $FunctionName() on $CodeModule.pm." ); } } else { $Self->{LogObject}->Log( Priority => 'error', Message => "Could not call method new() on $CodeModule.pm." ); } } my $FunctionName = 'CodeReinstall'; my $CodeModule = 'var::packagesetup::' . $Param{Structure}->{Name}->{Content}; if ( $Self->{MainObject}->Require($CodeModule) ) { my $CodeObject = $CodeModule->new( %{$Self} ); if ($CodeObject) { if ( !$CodeObject->$FunctionName(%{$Self}) ) { $Self->{LogObject}->Log( Priority => 'error', Message => "Could not call method $FunctionName() on $CodeModule.pm." ); } } else { $Self->{LogObject}->Log( Priority => 'error', Message => "Could not call method new() on $CodeModule.pm." ); } } 2010-10-01 14:51:51 cvs.intra.cape-it.de PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQXBwbGljYXRpb24iPgogICAgPENWUz4kSWQ6IEZBUUltcG9ydEV4cG9ydC54bWwsdiAxLjEgMjAxMC0xMC0wMSAxMTowMDoyMyByYWJvIEV4cCAkPC9DVlM+CgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kUmVnaXN0cmF0aW9uIyMjRkFRIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+T2JqZWN0IGJhY2tlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGltcG9ydC9leHBvcnQgbW9kdWwuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPk9iamVrdC1CYWNrZW5kIE1vZHVsIFJlZ2lzdHJhdGlvbiBkZXMgSW1wb3J0L0V4cG9ydCBNb2R1bHMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SW1wb3J0RXhwb3J0PC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+T2JqZWN0QmFja2VuZDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Ik1vZHVsZSI+S2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6RkFRPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJOYW1lIj5GQVE8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CgogICAgCjwvb3Ryc19jb25maWc+Cg== IyAtLQojIEtlcm5lbC9TeXN0ZW0vSW1wb3J0RXhwb3J0L09iamVjdEJhY2tlbmQvRkFRLnBtCiMKIy0gaW1wb3J0L2V4cG9ydCBiYWNrZW5kIGZvciBGQVEKIwojIENvcHlyaWdodCAoQykgMjAwNi0yMDEwIGMuYS5wLmUuIElUIEdtYkgsIGh0dHA6Ly93d3cuY2FwZS1pdC5kZQojCiMgLS0KIyAkSWQ6IEZBUS5wbSx2IDEuMSAyMDEwLTEwLTAxIDExOjAwOjIzIHJhYm8gRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjpGQVE7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpDb25maWc7CnVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwp1c2UgS2VybmVsOjpTeXN0ZW06OkNTVjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CnVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKdXNlIEtlcm5lbDo6U3lzdGVtOjpHcm91cDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpGQVE7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZTsKdXNlIERhdGE6OkR1bXBlcjsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMSAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICNjaGVjayByZXF1aXJlZCBvYmplY3RzLi4uCiAgICBmb3IgbXkgJE9iamVjdCAoCiAgICAgICAgcXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBEQk9iamVjdCBNYWluT2JqZWN0IEltcG9ydEV4cG9ydE9iamVjdCBFbmNvZGVPYmplY3QpCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQogICAgJFNlbGYtPntVc2VySUR9ID0gMTsKICAgIGlmICggISRTZWxmLT57VGltZU9iamVjdH0gKSB7CiAgICAgICAgJFNlbGYtPntUaW1lT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lLT5uZXcoICV7JFNlbGZ9ICk7CiAgICB9CiAgICBpZiAoICEkU2VsZi0+e1VzZXJPYmplY3R9ICkgewogICAgICAgICRTZWxmLT57VXNlck9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6VXNlci0+bmV3KCAleyRTZWxmfSApOwogICAgfQogICAgaWYgKCAhJFNlbGYtPntGQVFPYmplY3R9ICkgewogICAgICAgICRTZWxmLT57RkFRT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpGQVEtPm5ldyggJXskU2VsZn0gKTsKICAgIH0KICAgIGlmICggISRTZWxmLT57R3JvdXBPYmplY3R9ICkgewogICAgICAgICRTZWxmLT57R3JvdXBPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06Okdyb3VwLT5uZXcoICV7JFNlbGZ9ICk7CiAgICB9CiAgICBpZiAoICEkU2VsZi0+e1ZhbGlkT2JqZWN0fSApIHsKICAgICAgICAkU2VsZi0+e1ZhbGlkT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpWYWxpZC0+bmV3KCAleyRTZWxmfSApOwogICAgfQogICAgaWYgKCAhJFNlbGYtPntMb2dPYmplY3R9ICkgewogICAgICAgICRTZWxmLT57VmFsaWRPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KCBMb2dQcmVmaXggPT4gJ09UUlMtRkFRSW1wb3J0JywgJXskU2VsZn0gKTsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cgp9CgpzdWIgT2JqZWN0QXR0cmlidXRlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdAogICAgaWYgKCAhJFBhcmFte1VzZXJJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9CiAgICAgICAgICAgIC0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICdOZWVkIFVzZXJJRCEnICk7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgbXkgJVZhbGlkbGlzdCAgPSAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRMaXN0KCk7CiAgICBteSAkQXR0cmlidXRlcyA9IFsKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdMYWJlbEV4cG9ydCcsCiAgICAgICAgICAgIE5hbWUgID0+ICdFeHBvcnQgd2l0aCBsYWJlbHMnLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlID0+ICdTZWxlY3Rpb24nLAogICAgICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICAgICAgJzAnID0+ICdObycsCiAgICAgICAgICAgICAgICAgICAgJzEnID0+ICdZZXMnLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIFJlcXVpcmVkICAgICA9PiAwLAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gID0+IDEsCiAgICAgICAgICAgICAgICBQb3NzaWJsZU5vbmUgPT4gMCwKICAgICAgICAgICAgICAgIFZhbHVlRGVmYXVsdCA9PiAwLAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnRGVmYXVsdFZhbGlkJywKICAgICAgICAgICAgTmFtZSAgPT4gJ0RlZmF1bHQgVmFsaWRpdHknLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJ1NlbGVjdGlvbicsCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gXCVWYWxpZGxpc3QsCiAgICAgICAgICAgICAgICBSZXF1aXJlZCAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDAsCiAgICAgICAgICAgICAgICBWYWx1ZURlZmF1bHQgPT4gMSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgXTsKICAgIGlmICggJFNlbGYtPntGQVFPYmplY3R9LT57U3RhdGVUeXBlTGlzdH0gKSB7CiAgICAgICAgbXkgJFN0YXRlVHlwZURlZmF1bHQgPSB7CiAgICAgICAgICAgIEtleSAgID0+ICdGQVFTdGF0ZVR5cElEJywKICAgICAgICAgICAgTmFtZSAgPT4gJ0ZBUSBTdGF0ZSBUeXAnLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJ1NlbGVjdGlvbicsCiAgICAgICAgICAgICAgICBEYXRhICAgICAgICAgPT4gJFNlbGYtPntGQVFPYmplY3R9LT57U3RhdGVUeXBlTGlzdH0sCiAgICAgICAgICAgICAgICBSZXF1aXJlZCAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAwLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDAsCiAgICAgICAgICAgIH0sCiAgICAgICAgfTsKICAgICAgICBwdXNoKCBAeyRBdHRyaWJ1dGVzfSwgJFN0YXRlVHlwZURlZmF1bHQgKTsKICAgIH0KCiAgICByZXR1cm4gJEF0dHJpYnV0ZXM7Cn0KCnN1YiBNYXBwaW5nT2JqZWN0QXR0cmlidXRlc0dldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhUZW1wbGF0ZUlEIFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgb2JqZWN0IGRhdGEKICAgIG15ICRPYmplY3REYXRhID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5PYmplY3REYXRhR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwogICAgbXkgJEVsZW1lbnRMaXN0ID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ1RpdGxlJywKICAgICAgICAgICAgVmFsdWUgPT4gJ1RpdGxlIElEJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ0NhdGVnb3J5SUQnLAogICAgICAgICAgICBWYWx1ZSA9PiAnQ2F0ZWdvcnlJRCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdTdGF0ZUlEJywKICAgICAgICAgICAgVmFsdWUgPT4gJ1N0YXRlVHlwZUlEJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ0xhbmd1YWdlSUQnLAogICAgICAgICAgICBWYWx1ZSA9PiAnTGFuZ3VhZ2VJRCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdGaWVsZDEnLAogICAgICAgICAgICBWYWx1ZSA9PiAnRmllbGQxJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ0ZpZWxkMicsCiAgICAgICAgICAgIFZhbHVlID0+ICdGaWVsZDInLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnRmllbGQzJywKICAgICAgICAgICAgVmFsdWUgPT4gJ0ZpZWxkMycsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdGaWVsZDQnLAogICAgICAgICAgICBWYWx1ZSA9PiAnRmllbGQ0JywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ0ZpZWxkNScsCiAgICAgICAgICAgIFZhbHVlID0+ICdGaWVsZDUnLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnRmllbGQ2JywKICAgICAgICAgICAgVmFsdWUgPT4gJ0ZpZWxkNicsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdLZXl3b3JkcycsCiAgICAgICAgICAgIFZhbHVlID0+ICdLZXl3b3JkcycsCiAgICAgICAgfSwKICAgIF07CgogICAgbXkgJEF0dHJpYnV0ZXMgPSBbCiAgICAgICAgewogICAgICAgICAgICBLZXkgICA9PiAnS2V5JywKICAgICAgICAgICAgTmFtZSAgPT4gJ0tleScsCiAgICAgICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICA9PiAnU2VsZWN0aW9uJywKICAgICAgICAgICAgICAgIERhdGEgICAgICAgICA9PiAkRWxlbWVudExpc3QsCiAgICAgICAgICAgICAgICBSZXF1aXJlZCAgICAgPT4gMSwKICAgICAgICAgICAgICAgIFRyYW5zbGF0aW9uICA9PiAxLAogICAgICAgICAgICAgICAgUG9zc2libGVOb25lID0+IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIEtleSAgID0+ICdJZGVudGlmaWVyJywKICAgICAgICAgICAgTmFtZSAgPT4gJ0lkZW50aWZpZXInLAogICAgICAgICAgICBJbnB1dCA9PiB7IFR5cGUgPT4gJ0NoZWNrYm94JywgfSwKICAgICAgICB9LAogICAgXTsKCiAgICByZXR1cm4gJEF0dHJpYnV0ZXM7Cn0KCj1pdGVtIFNlYXJjaEF0dHJpYnV0ZXNHZXQoKQoKZ2V0IHRoZSBzZWFyY2ggb2JqZWN0IGF0dHJpYnV0ZXMgb2YgYW4gb2JqZWN0IGFzIGFycmF5L2hhc2ggcmVmZXJlbmNlCgogICAgbXkgJEF0dHJpYnV0ZUxpc3QgPSAkT2JqZWN0QmFja2VuZC0+U2VhcmNoQXR0cmlidXRlc0dldCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaEF0dHJpYnV0ZXNHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRBdHRyaWJ1dGVMaXN0ID0gWwogICAgICAgIHsKICAgICAgICAgICAgS2V5ICAgPT4gJ0ZBUU5hbWUnLAogICAgICAgICAgICBOYW1lICA9PiAnRkFRIE5hbWUnLAogICAgICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgICAgICBUeXBlICAgICAgPT4gJ1RleHQnLAogICAgICAgICAgICAgICAgU2l6ZSAgICAgID0+IDgwLAogICAgICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDI1NSwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgXTsKCiAgICByZXR1cm4gJEF0dHJpYnV0ZUxpc3Q7Cn0KCj1pdGVtIEV4cG9ydERhdGFHZXQoKQoKZ2V0IGV4cG9ydCBkYXRhIGFzIDJELWFycmF5LWhhc2ggcmVmZXJlbmNlCgogICAgbXkgJEV4cG9ydERhdGEgPSAkT2JqZWN0QmFja2VuZC0+RXhwb3J0RGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+IDEyMywKICAgICAgICBVc2VySUQgICAgID0+IDEsCiAgICApOwoKPWN1dAoKc3ViIEV4cG9ydERhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBVc2VySUQpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IG9iamVjdCBkYXRhCiAgICBteSAkT2JqZWN0RGF0YSA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+T2JqZWN0RGF0YUdldCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIG9iamVjdCBkYXRhCiAgICBpZiAoICEkT2JqZWN0RGF0YSB8fCByZWYgJE9iamVjdERhdGEgbmUgJ0hBU0gnICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gb2JqZWN0IGRhdGEgZm91bmQgZm9yIHRoZSB0ZW1wbGF0ZSBpZCAkUGFyYW17VGVtcGxhdGVJRH0iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IHRoZSBtYXBwaW5nIGxpc3QKICAgIG15ICRNYXBwaW5nTGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+TWFwcGluZ0xpc3QoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgIyBjaGVjayB0aGUgbWFwcGluZyBsaXN0CiAgICBpZiAoICEkTWFwcGluZ0xpc3QgfHwgcmVmICRNYXBwaW5nTGlzdCBuZSAnQVJSQVknIHx8ICFAeyRNYXBwaW5nTGlzdH0gKSB7CgogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gdmFsaWQgbWFwcGluZyBsaXN0IGZvdW5kIGZvciB0aGUgdGVtcGxhdGUgaWQgJFBhcmFte1RlbXBsYXRlSUR9IiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGNyZWF0ZSB0aGUgbWFwcGluZyBvYmplY3QgbGlzdAogICAgbXkgQE1hcHBpbmdPYmplY3RMaXN0OwogICAgZm9yIG15ICRNYXBwaW5nSUQgKCBAeyRNYXBwaW5nTGlzdH0gKSB7CgogICAgICAgICMgZ2V0IG1hcHBpbmcgb2JqZWN0IGRhdGEKICAgICAgICBteSAkTWFwcGluZ09iamVjdERhdGEgPQogICAgICAgICAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdPYmplY3REYXRhR2V0KAogICAgICAgICAgICBNYXBwaW5nSUQgPT4gJE1hcHBpbmdJRCwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIG1hcHBpbmcgb2JqZWN0IGRhdGEKICAgICAgICBpZiAoICEkTWFwcGluZ09iamVjdERhdGEgfHwgcmVmICRNYXBwaW5nT2JqZWN0RGF0YSBuZSAnSEFTSCcgKSB7CgogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gdmFsaWQgbWFwcGluZyBsaXN0IGZvdW5kIGZvciB0aGUgdGVtcGxhdGUgaWQgJFBhcmFte1RlbXBsYXRlSUR9IiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgcHVzaCggQE1hcHBpbmdPYmplY3RMaXN0LCAkTWFwcGluZ09iamVjdERhdGEgKTsKICAgIH0KCiAgICAjIGdldCBzZWFyY2ggZGF0YQogICAgbXkgJFNlYXJjaERhdGEgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPlNlYXJjaERhdGFHZXQoCiAgICAgICAgVGVtcGxhdGVJRCA9PiAkUGFyYW17VGVtcGxhdGVJRH0sCiAgICAgICAgVXNlcklEICAgICA9PiAkUGFyYW17VXNlcklEfSwKICAgICk7CgogICAgaWYgKCAkU2VhcmNoRGF0YSAmJiByZWYoJFNlYXJjaERhdGEpIG5lICdIQVNIJyApIHsKICAgICAgICAkU2VhcmNoRGF0YSA9IDA7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgPT4KICAgICAgICAgICAgICAgICJGQVEyQ3VzdG9tZXJVc2VyOiBzZWFyY2ggZGF0YSBpcyBub3QgYSBoYXNoIHJlZiAtIGlnbm9yaW5nIHNlYXJjaCBsaW1pdGF0aW9uLiIsCiAgICAgICAgKTsKICAgIH0KCiAgICBteSBARkFRTGlzdCA9ICRTZWxmLT57RkFRT2JqZWN0fS0+RkFRU2VhcmNoKAogICAgICAgIE5hbWUgID0+ICRTZWFyY2hEYXRhLT57RkFRTmFtZX0gfHwgJycsCiAgICAgICAgTGltaXQgPT4gJFNlYXJjaERhdGEtPntMaW1pdH0gICB8fCAnMCcsCiAgICAgICAgVXNlcklEID0+IDEsCgogICAgICAgICMgbm8gZnVydGhlciByZXN0cmljdGlvbiB5ZXQuLi4KICAgICAgICAjVHlwZUlEcyAgICAgICAgPT4gMiwKICAgICAgICAjQ3JpdGljYWxpdHlJRHMgPT4gMSwKICAgICk7CgogICAgIyBleHBvcnQgZGF0YS4uLgogICAgbXkgQEV4cG9ydERhdGE7CgogICAgIyBleHBvcnQgaGVhZGxpbmUvbGFiZWxzIC4uLgogICAgaWYgKCAkT2JqZWN0RGF0YS0+e0xhYmVsRXhwb3J0fSApIHsKICAgICAgICBteSBAQ3VyclJvdyA9IHF3e307CiAgICAgICAgZm9yIG15ICRNYXBwaW5nT2JqZWN0IChATWFwcGluZ09iamVjdExpc3QpIHsKICAgICAgICAgICAgcHVzaCggQEN1cnJSb3csICRNYXBwaW5nT2JqZWN0LT57S2V5fSB8fCAnLScgKTsKICAgICAgICB9CiAgICAgICAgcHVzaCBARXhwb3J0RGF0YSwgXEBDdXJyUm93OwogICAgfQoKICAgIGZvciBteSAkRkFRSUQgKEBGQVFMaXN0KSB7CgogICAgICAgIG15ICVGQVFEYXRhID0gJFNlbGYtPntGQVFPYmplY3R9LT5GQVFHZXQoCiAgICAgICAgICAgIEZBUUlEICA9PiAkRkFRSUQsCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLCAgICAgICAgIyBubyBwZXJtaXNzaW9uIHJlc3RyaWN0aW9uIGZvciB0aGlzIGV4cG9ydAogICAgICAgICk7CgogICAgICAgICRGQVFEYXRhe1ZhbGlkfSA9ICRTZWxmLT57VmFsaWRPYmplY3R9LT5WYWxpZExvb2t1cCgKICAgICAgICAgICAgVmFsaWRJRCA9PiAkRkFRRGF0YXtWYWxpZElEfSwKICAgICAgICApOwoKICAgICAgICBteSBAQ3VyclJvdyA9IHF3e307CiAgICAgICAgZm9yIG15ICRNYXBwaW5nT2JqZWN0IChATWFwcGluZ09iamVjdExpc3QpIHsKICAgICAgICAgICAgbXkgJEtleSA9ICRNYXBwaW5nT2JqZWN0LT57S2V5fTsKCiAgICAgICAgICAgIGlmICggJE1hcHBpbmdPYmplY3QtPntLZXl9ICYmICRGQVFEYXRheyAkTWFwcGluZ09iamVjdC0+e0tleX0gfSApIHsKICAgICAgICAgICAgICAgIHB1c2goIEBDdXJyUm93LCAkRkFRRGF0YXsgJE1hcHBpbmdPYmplY3QtPntLZXl9IH0gKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHB1c2goIEBDdXJyUm93LCAnLScgKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcHVzaCBARXhwb3J0RGF0YSwgXEBDdXJyUm93OwoKICAgIH0KCiAgICByZXR1cm4gXEBFeHBvcnREYXRhOwp9Cgo9aXRlbSBJbXBvcnREYXRhU2F2ZSgpCgppbXBvcnQgb25lIHJvdyBvZiB0aGUgaW1wb3J0IGRhdGEKCiAgICBteSAkQ29uZmlnSXRlbUlEID0gJE9iamVjdEJhY2tlbmQtPkltcG9ydERhdGFTYXZlKAogICAgICAgIFRlbXBsYXRlSUQgICAgPT4gMTIzLAogICAgICAgIEltcG9ydERhdGFSb3cgPT4gJEFycmF5UmVmLAogICAgICAgIFVzZXJJRCAgICAgICAgPT4gMSwKICAgICk7Cgo9Y3V0CgpzdWIgSW1wb3J0RGF0YVNhdmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoVGVtcGxhdGVJRCBJbXBvcnREYXRhUm93IFVzZXJJRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjaGVjayBpbXBvcnQgZGF0YSByb3cKICAgIGlmICggcmVmICRQYXJhbXtJbXBvcnREYXRhUm93fSBuZSAnQVJSQVknICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnSW1wb3J0RGF0YVJvdyBtdXN0IGJlIGFuIGFycmF5IHJlZmVyZW5jZScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgb2JqZWN0IGRhdGEKICAgIG15ICRPYmplY3REYXRhID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5PYmplY3REYXRhR2V0KAogICAgICAgIFRlbXBsYXRlSUQgPT4gJFBhcmFte1RlbXBsYXRlSUR9LAogICAgICAgIFVzZXJJRCAgICAgPT4gJFBhcmFte1VzZXJJRH0sCiAgICApOwoKICAgICMgY2hlY2sgb2JqZWN0IGRhdGEKICAgIGlmICggISRPYmplY3REYXRhIHx8IHJlZiAkT2JqZWN0RGF0YSBuZSAnSEFTSCcgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBvYmplY3QgZGF0YSBmb3VuZCBmb3IgdGhlIHRlbXBsYXRlIGlkICRQYXJhbXtUZW1wbGF0ZUlEfSIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgdGhlIG1hcHBpbmcgbGlzdAogICAgbXkgJE1hcHBpbmdMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5NYXBwaW5nTGlzdCgKICAgICAgICBUZW1wbGF0ZUlEID0+ICRQYXJhbXtUZW1wbGF0ZUlEfSwKICAgICAgICBVc2VySUQgICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgKTsKCiAgICAjIGNoZWNrIHRoZSBtYXBwaW5nIGxpc3QKICAgIGlmICggISRNYXBwaW5nTGlzdCB8fCByZWYgJE1hcHBpbmdMaXN0IG5lICdBUlJBWScgfHwgIUB7JE1hcHBpbmdMaXN0fSApIHsKCiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyB2YWxpZCBtYXBwaW5nIGxpc3QgZm91bmQgZm9yIHRoZSB0ZW1wbGF0ZSBpZCAkUGFyYW17VGVtcGxhdGVJRH0iLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgY3JlYXRlIHRoZSBtYXBwaW5nIG9iamVjdCBsaXN0CiAgICBteSBATWFwcGluZ09iamVjdExpc3Q7CiAgICBteSAlSWRlbnRpZmllcjsKICAgIG15ICRDb3VudGVyICAgICAgICAgID0gMDsKICAgIG15ICVOZXdGQVFEYXRhICAgICAgID0gcXd7fTsKICAgIG15ICRGQVFJZGVudGlmaWVyS2V5ID0gIiI7CgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjQlVJTEQgTUFQUElORyBUQUJMRS4uLgogICAgZm9yIG15ICRNYXBwaW5nSUQgKCBAeyRNYXBwaW5nTGlzdH0gKSB7CgogICAgICAgICMgZ2V0IG1hcHBpbmcgb2JqZWN0IGRhdGEKICAgICAgICBteSAkTWFwcGluZ09iamVjdERhdGEgPQogICAgICAgICAgICAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdPYmplY3REYXRhR2V0KAogICAgICAgICAgICBNYXBwaW5nSUQgPT4gJE1hcHBpbmdJRCwKICAgICAgICAgICAgVXNlcklEICAgID0+ICRQYXJhbXtVc2VySUR9LAogICAgICAgICAgICApOwoKICAgICAgICAjIGNoZWNrIG1hcHBpbmcgb2JqZWN0IGRhdGEKICAgICAgICBpZiAoICEkTWFwcGluZ09iamVjdERhdGEgfHwgcmVmICRNYXBwaW5nT2JqZWN0RGF0YSBuZSAnSEFTSCcgKSB7CgogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gdmFsaWQgbWFwcGluZyBsaXN0IGZvdW5kIGZvciB0ZW1wbGF0ZSBpZCAkUGFyYW17VGVtcGxhdGVJRH0iLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBwdXNoKCBATWFwcGluZ09iamVjdExpc3QsICRNYXBwaW5nT2JqZWN0RGF0YSApOwoKICAgICAgICBpZiAoCiAgICAgICAgICAgICRNYXBwaW5nT2JqZWN0RGF0YS0+e0lkZW50aWZpZXJ9CiAgICAgICAgICAgICYmICRJZGVudGlmaWVyeyAkTWFwcGluZ09iamVjdERhdGEtPntLZXl9IH0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNhbid0IGltcG9ydCB0aGlzIGVudGl0eS4gIgogICAgICAgICAgICAgICAgICAgIC4gIickTWFwcGluZ09iamVjdERhdGEtPntLZXl9JyBoYXMgYmVlbiB1c2VkIG11bHRpcGxlICIKICAgICAgICAgICAgICAgICAgICAuICJ0aW1lcyBhcyBpZGVudGlmaWVyLiEiLAogICAgICAgICAgICApOwogICAgICAgIH0KICAgICAgICBlbHNpZiAoICRNYXBwaW5nT2JqZWN0RGF0YS0+e0lkZW50aWZpZXJ9ICkgewogICAgICAgICAgICAkSWRlbnRpZmllcnsgJE1hcHBpbmdPYmplY3REYXRhLT57S2V5fSB9ID0KICAgICAgICAgICAgICAgICRQYXJhbXtJbXBvcnREYXRhUm93fS0+WyRDb3VudGVyXTsKICAgICAgICAgICAgJEZBUUlkZW50aWZpZXJLZXkgPSAkTWFwcGluZ09iamVjdERhdGEtPntLZXl9OwogICAgICAgIH0KCiAgICAgICAgJE5ld0ZBUURhdGF7ICRNYXBwaW5nT2JqZWN0RGF0YS0+e0tleX0gfSA9CiAgICAgICAgICAgICRQYXJhbXtJbXBvcnREYXRhUm93fS0+WyRDb3VudGVyXTsKCiAgICAgICAgJENvdW50ZXIrKzsKCiAgICB9CgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjRE8gVEhFIElNUE9SVC4uLgogICAgIyBsb29rdXAgVmFsaWQtSUQuLi4KICAgIGlmICggISROZXdGQVFEYXRhe1ZhbGlkSUR9ICYmICROZXdGQVFEYXRhe1ZhbGlkfSApIHsKICAgICAgICAkTmV3RkFRRGF0YXtWYWxpZElEfSA9ICRTZWxmLT57VmFsaWRPYmplY3R9LT5WYWxpZExvb2t1cCgKICAgICAgICAgICAgVmFsaWQgPT4gJE5ld0ZBUURhdGF7VmFsaWR9CiAgICAgICAgKTsKICAgIH0KCiAgICAjZGVmYXVsdCB2YWxpZGl0eS4uLgogICAgaWYgKCAhJE5ld0ZBUURhdGF7VmFsaWRJRH0gKSB7CiAgICAgICAgJE5ld0ZBUURhdGF7VmFsaWRJRH0gPSAkT2JqZWN0RGF0YS0+e0RlZmF1bHRWYWxpZH0gfHwgMTsKICAgIH0KCiAgICAjIGdldCBhbGwgRkFRIGxhbmd1YWdlIGlkcwogICAgbXkgJUxhbmd1YWdlSUQgPSByZXZlcnNlICRTZWxmLT57RkFRT2JqZWN0fS0+TGFuZ3VhZ2VMaXN0KCk7CgogICAgIyBnZXQgYWxsIHN0YXRlIHR5cGUgaWRzCiAgICBteSAlU3RhdGVUeXBlSUQgPSByZXZlcnNlICV7ICRTZWxmLT57RkFRT2JqZWN0fS0+U3RhdGVUeXBlTGlzdCgpIH07CgogICAgIyBnZXQgZ3JvdXAgaWQgZm9yIGZhcSBncm91cAogICAgbXkgJEZBUUdyb3VwSUQgPSAkU2VsZi0+e0dyb3VwT2JqZWN0fS0+R3JvdXBMb29rdXAoCiAgICAgICAgR3JvdXAgPT4gJ2ZhcScsCiAgICApOwoKICAgICMgbG9va3VwIFZhbGlkLUlELi4uCiAgICBpZiAoICEkTmV3RkFRRGF0YXtWYWxpZElEfSAmJiAkTmV3RkFRRGF0YXtWYWxpZH0gKSB7CiAgICAgICAgJE5ld0ZBUURhdGF7VmFsaWRJRH0gPSAkU2VsZi0+e1ZhbGlkT2JqZWN0fS0+VmFsaWRMb29rdXAoCiAgICAgICAgICAgIFZhbGlkID0+ICROZXdGQVFEYXRhe1ZhbGlkfQogICAgICAgICk7CiAgICB9CgogICAgI2RlZmF1bHQgdmFsaWRpdHkuLi4KICAgIGlmICggISROZXdGQVFEYXRhe1ZhbGlkSUR9ICkgewogICAgICAgICROZXdGQVFEYXRhe1ZhbGlkSUR9ID0gJE9iamVjdERhdGEtPntEZWZhdWx0VmFsaWR9IHx8IDE7CiAgICB9CiAgICBteSAkSXRlbUlEOwogICAgbXkgJExpbmVDb3VudGVyID0gMDsKICAgIG15ICRDYXRlZ29yeUlEOwoKICAgIGZvciBteSAkUm93UmVmICgga2V5cyglTmV3RkFRRGF0YSkgKSB7CgogICAgICAgICRMaW5lQ291bnRlcisrOwoKICAgICAgICAjIGNoZWNrIGxhbmd1YWdlCiAgICAgICAgaWYgKCAhJE5ld0ZBUURhdGF7TGFuZ3VhZ2VJRH0gKSB7CiAgICAgICAgICAgIHByaW50IFNURE9VVAogICAgICAgICAgICAgICAgIkVycm9yOiBDb3VsZCBub3QgaW1wb3J0IGxpbmUgJExpbmVDb3VudGVyLiBMYW5ndWFnZSAnJE5ld0ZBUURhdGF7TGFuZ3VhZ2VJRH0nIGRvZXMgbm90IGV4aXN0LlxuIjsKICAgICAgICAgICAgbmV4dDsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgc3RhdGUgdHlwZQogICAgICAgIGlmICggISROZXdGQVFEYXRhe1N0YXRlSUR9ICkgewogICAgICAgICAgICBwcmludCBTVERPVVQKICAgICAgICAgICAgICAgICJFcnJvcjogQ291bGQgbm90IGltcG9ydCBsaW5lICRMaW5lQ291bnRlci4gU3RhdGUgJyROZXdGQVFEYXRhe1N0YXRlVHlwZUlEfScgZG9lcyBub3QgZXhpc3QuXG4iOwogICAgICAgICAgICBuZXh0OwogICAgICAgIH0KICAgICAgICBteSAkQ2F0ZWdvcnlTdHJpbmcgPSAkTmV3RkFRRGF0YXtDYXRlZ29yeUlEfTsKCiAgICAgICAgIyBnZXQgc3ViLWNhdGVnb3JpZXMKICAgICAgICBteSBAQ2F0ZWdvcnlBcnJheSA9IHNwbGl0IC86Oi8sICRDYXRlZ29yeVN0cmluZzsKCiAgICAgICAgIyBjaGVjayBlYWNoIHN1Yi1jYXRlZ29yeSBpZiBpdCBleGlzdHMKICAgICAgICBteSAkUGFyZW50SUQgPSAwOwoKICAgICAgICBmb3IgbXkgJENhdGVnb3J5IChAQ2F0ZWdvcnlBcnJheSkgewoKICAgICAgICAgICAgIyBnZXQgdGhlIGNhdGVnb3J5IGlkCiAgICAgICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgICAgICAgICAgU1FMID0+ICdTRUxFQ1QgaWQgRlJPTSBmYXFfY2F0ZWdvcnkgJwogICAgICAgICAgICAgICAgICAgIC4gJ1dIRVJFIHZhbGlkX2lkID0gMSBBTkQgbmFtZSA9ID8gQU5EIHBhcmVudF9pZCA9ID8nLAogICAgICAgICAgICAgICAgQmluZCA9PiBbIFwkQ2F0ZWdvcnksIFwkUGFyZW50SUQgXSwKICAgICAgICAgICAgICAgIExpbWl0ID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15IEBSZXN1bHQ7CiAgICAgICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICAgICBwdXNoKCBAUmVzdWx0LCAkUm93WzBdICk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJENhdGVnb3J5SUQgPSAkUmVzdWx0WzBdOwoKICAgICAgICAgICAgIyBjcmVhdGUgY2F0ZWdvcnkgaWYgaXQgZG9lcyBub3QgZXhpc3QKICAgICAgICAgICAgaWYgKCAhJENhdGVnb3J5SUQgKSB7CiAgICAgICAgICAgICAgICAkQ2F0ZWdvcnlJRCA9ICRTZWxmLT57RkFRT2JqZWN0fS0+Q2F0ZWdvcnlBZGQoCiAgICAgICAgICAgICAgICAgICAgTmFtZSAgICAgPT4gJENhdGVnb3J5LAogICAgICAgICAgICAgICAgICAgIFBhcmVudElEID0+ICRQYXJlbnRJRCwKICAgICAgICAgICAgICAgICAgICBWYWxpZElEICA9PiAxLAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgID0+IDEsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgICMgYWRkIG5ldyBjYXRlZ29yeSB0byBmYXEgZ3JvdXAKICAgICAgICAgICAgICAgICRTZWxmLT57RkFRT2JqZWN0fS0+U2V0Q2F0ZWdvcnlHcm91cCgKICAgICAgICAgICAgICAgICAgICBDYXRlZ29yeUlEID0+ICRDYXRlZ29yeUlELAogICAgICAgICAgICAgICAgICAgIEdyb3VwSURzICAgPT4gWyRGQVFHcm91cElEXSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICMgc2V0IG5ldyBwYXJlbnQgaWQKICAgICAgICAgICAgJFBhcmVudElEID0gJENhdGVnb3J5SUQ7CiAgICAgICAgfQoKICAgICAgICAjIGNoZWNrIGNhdGVnb3J5CiAgICAgICAgaWYgKCAhJENhdGVnb3J5SUQgKSB7CiAgICAgICAgICAgIHByaW50IFNURE9VVAogICAgICAgICAgICAgICAgIkVycm9yOiBDb3VsZCBub3QgaW1wb3J0IGxpbmUgJExpbmVDb3VudGVyLiBDYXRlZ29yeSAnJENhdGVnb3J5U3RyaW5nJyBjb3VsZCBub3QgYmUgY3JlYXRlZC5cbiI7CiAgICAgICAgICAgIG5leHQ7CiAgICAgICAgfQogICAgfQoKICAgICMgYWRkIEZBUSBhcnRpY2xlCiAgICAkSXRlbUlEID0gJFNlbGYtPntGQVFPYmplY3R9LT5GQVFBZGQoCiAgICAgICAgVGl0bGUgICAgICA9PiAkTmV3RkFRRGF0YXtUaXRsZX0sCiAgICAgICAgQ2F0ZWdvcnlJRCA9PiAkQ2F0ZWdvcnlJRCwKICAgICAgICBTdGF0ZUlEICAgID0+ICRTdGF0ZVR5cGVJRHsgJE5ld0ZBUURhdGF7U3RhdGVJRH0gfSB8fCAxLAogICAgICAgIExhbmd1YWdlSUQgPT4gJExhbmd1YWdlSUR7ICROZXdGQVFEYXRhe0xhbmd1YWdlSUR9IH0gfHwgMiwKICAgICAgICBGaWVsZDEgICAgID0+ICROZXdGQVFEYXRhe0ZpZWxkMX0sCiAgICAgICAgRmllbGQyICAgICA9PiAkTmV3RkFRRGF0YXtGaWVsZDJ9LAogICAgICAgIEZpZWxkMyAgICAgPT4gJE5ld0ZBUURhdGF7RmllbGQzfSwKICAgICAgICBGaWVsZDQgICAgID0+ICROZXdGQVFEYXRhe0ZpZWxkNH0sCiAgICAgICAgRmllbGQ1ICAgICA9PiAkTmV3RkFRRGF0YXtGaWVsZDV9LAogICAgICAgIEZpZWxkNiAgICAgPT4gJE5ld0ZBUURhdGF7RmllbGQ2fSwKICAgICAgICBLZXl3b3JkcyAgID0+ICcgJywKICAgICAgICBBcHByb3ZlZCAgID0+IDEsCiAgICAgICAgVmFsaWRJRCAgICA9PiAxLAogICAgKTsKCiAgICAjIGNoZWNrIHN1Y2Nlc3MKICAgIGlmICggISRJdGVtSUQgKSB7CiAgICAgICAgcHJpbnQgU1RET1VUICJFcnJvcjogQ291bGQgbm90IGltcG9ydCBsaW5lICRMaW5lQ291bnRlci5cbiI7CiAgICAgICAgbmV4dDsKICAgIH0KCiAgICByZXR1cm4gKCAkSXRlbUlELCAxICk7Cn0KCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgU29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMTAtMTAtMDEgMTE6MDA6MjMgJAoKPWN1dAo= IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9GQVFJbXBvcnRFeHBvcnQgLSBwcm92aWRlcyBnZXJtYW4gbGFuZ3VhZ2UKIyB0cmFuc2xhdGlvbiBmb3IgRkFRSW1wb3J0RXhwb3J0IG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwNi0yMDEwIGMuYS5wLmUuIElUIEdtYkgsIGh0dHA6Ly93d3cuY2FwZS1pdC5kZQojCiMKIyAtLQojICRJZDogZGVfRkFRSW1wb3J0RXhwb3J0LnBtLHYgMS4xIDIwMTAtMTAtMDEgMTE6MDA6MjMgcmFibyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQpwYWNrYWdlIEtlcm5lbDo6TGFuZ3VhZ2U6OmRlX0ZBUUltcG9ydEV4cG9ydDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSAnJFJldmlzaW9uOiAxLjEgJCc7CiRWRVJTSU9OID1+IHMvXlwkLio6XFcoLiopXFcuKz8kLyQxLzsKCiMgLS0Kc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICBteSAkTGFuZyA9ICRTZWxmLT57VHJhbnNsYXRpb259OwoKICAgIHJldHVybiBpZiByZWYgJExhbmcgbmUgJ0hBU0gnOwoKICAgICMgJCRTVEFSVCQkCgogICAgIyB0cmFuc2xhdGlvbnMgbWlzc2luZyBpbiBJbXBvcnRFeHBvcnQuLi4KICAgICRMYW5nLT57J0NvbHVtbiBTZXBlcmF0b3InfSAgICAgICAgICAgPSAnU3BhbHRlbnRyZW5uZXInOwogICAgJExhbmctPnsnQ2hhcnNldCd9ICAgICAgICAgICAgICAgICAgICA9ICdaZWljaGVuc2F0eic7CiAgICAkTGFuZy0+eydSZXN0cmljdCBleHBvcnQgcGVyIHNlYXJjaCd9ID0gJ0V4cG9ydCBtaXR0ZWxzIFN1Y2hlIGVpbnNjaHLkbmtlbic7CgogICAgJExhbmctPnsnVmFsaWRpdHknfSA9ICdH/Gx0aWdrZWl0JzsKCiAgICAkTGFuZy0+eydFeHBvcnQgd2l0aCBsYWJlbHMnfSA9ICdNaXQgQmVzY2hyaWZ0dW5nIGV4cG9ydGllcmVuJzsKICAgICRMYW5nLT57Jyd9ICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eycnfSAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnJ30gICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57Jyd9ICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eycnfSAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnJ30gICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57Jyd9ICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eycnfSAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnJ30gICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57Jyd9ICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eycnfSAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnJ30gICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57Jyd9ICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eycnfSAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnJ30gICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57Jyd9ICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eycnfSAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnJ30gICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57Jyd9ICAgICAgICAgICAgICAgICAgID0gJyc7CiAgICAkTGFuZy0+eycnfSAgICAgICAgICAgICAgICAgICA9ICcnOwogICAgJExhbmctPnsnJ30gICAgICAgICAgICAgICAgICAgPSAnJzsKICAgICRMYW5nLT57Jyd9ICAgICAgICAgICAgICAgICAgID0gJyc7CgogICAgcmV0dXJuIDA7CgogICAgIyAkJFNUT1AkJAp9CgojIC0tCjE7Cg== IyAtLQojIEZBUUltcG9ydEV4cG9ydC5wbSAtIGNvZGUgcnVuIGR1cmluZyBwYWNrYWdlIGRlLS9pbnN0YWxsYXRpb24KIyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMCBjLmEucC5lLiBJVCBHbWJILCBodHRwOi8vd3d3LmNhcGUtaXQuZGUKIwojIHdyaXR0ZW4vZWRpdGVkIGJ5OgojICAgTWFydGluKGRvdClCYWx6YXJlayhhdCljYXBlLWl0LmRlCiMJUmFsZihkb3QpQm9laG0oYXQpY2FwZS1pdC5kZQojIC0tCiMgJElkOiBGQVFJbXBvcnRFeHBvcnQucG0sdiAxLjEgMjAxMC0xMC0wMSAxMTowMDoyMyByYWJvIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgdmFyOjpwYWNrYWdlc2V0dXA6OkZBUUltcG9ydEV4cG9ydDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OkNvbmZpZzsKdXNlIEtlcm5lbDo6U3lzdGVtOjpDb25maWc7CnVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwp1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwp1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CnVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwp1c2UgS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDsKdXNlIEtlcm5lbDo6U3lzdGVtOjpGQVE7CnVzZSBLZXJuZWw6OlN5c3RlbTo6VmFsaWQ7CnVzZSBLZXJuZWw6OlN5c3RlbTo6Q1NWOwp1c2UgS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydDo6T2JqZWN0QmFja2VuZDo6RkFROwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCk9UUlNfQ2lDUy5wbSAtIGNvZGUgdG8gZXhjZWN1dGUgZHVyaW5nIHBhY2thZ2UgaW5zdGFsbGF0aW9uCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBmdW5jdGlvbnMKCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpNYWluOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpUaW1lOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6WE1MOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkTG9nT2JqZWN0ICAgID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRNYWluT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkVGltZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpUaW1lLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRYTUxPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6WE1MLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJENvZGVPYmplY3QgPSB2YXI6OnBhY2thZ2VzZXR1cDo6T1RSUy1DaUNTLUlUU00ucG0tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICAgICAgVGltZU9iamVjdCAgID0+ICRUaW1lT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgWE1MT2JqZWN0ICAgID0+ICRYTUxPYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgI2NoZWNrIHJlcXVpcmVkIHBhcmFtcy4uLgogICAgZm9yIG15ICRPYmplY3QgKAogICAgICAgIHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCBUaW1lT2JqZWN0IERCT2JqZWN0IEVuY29kZU9iamVjdCBYTUxPYmplY3QpCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6Q29uZmlnLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgJFNlbGYtPntDb25maWdPYmplY3R9ICAgICAgID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgJFNlbGYtPntMb2dPYmplY3R9ICAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntNYWluT2JqZWN0fSAgICAgICAgID0gS2VybmVsOjpTeXN0ZW06Ok1haW4tPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57RW5jb2RlT2JqZWN0fSAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpFbmNvZGUtPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57REJPYmplY3R9ICAgICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkltcG9ydEV4cG9ydC0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntWYWxpZE9iamVjdH0gICAgICAgID0gS2VybmVsOjpTeXN0ZW06OlZhbGlkLT5uZXcoICV7JFNlbGZ9ICk7CiAgICAkU2VsZi0+e09iamVjdEJhY2tlbmRPYmplY3R9ID0KICAgICAgICBLZXJuZWw6OlN5c3RlbTo6SW1wb3J0RXhwb3J0OjpPYmplY3RCYWNrZW5kOjpGQVEtPm5ldyggJXskU2VsZn0gKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIENvZGVJbnN0YWxsKCkKCnJ1biB0aGUgY29kZSBpbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVJbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZUluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkU2VsZi0+X0NyZWF0ZU1hcHBpbmdzKCk7CgogICAgcmV0dXJuIDE7Cn0KCj1pdGVtIENvZGVSZWluc3RhbGwoKQoKcnVuIHRoZSBjb2RlIHJlaW5zdGFsbCBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlUmVpbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZVJlaW5zdGFsbCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICRTZWxmLT5fQ3JlYXRlTWFwcGluZ3MoKTsKCiAgICByZXR1cm4gMTsKfQoKPWl0ZW0gQ29kZVVwZ3JhZGUoKQoKcnVuIHRoZSBjb2RlIHVwZ3JhZGUgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVwZ3JhZGUoKTsKCj1jdXQKCnN1YiBDb2RlVXBncmFkZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb2RlVW5pbnN0YWxsKCkKCnJ1biB0aGUgY29kZSB1bmluc3RhbGwgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVuaW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVVbmluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkU2VsZi0+X1JlbW92ZVJlbGF0ZWRNYXBwaW5ncygpOwoKICAgIHJldHVybiAxOwp9CgpzdWIgX1JlbW92ZVJlbGF0ZWRNYXBwaW5ncyAoKSB7CgogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkVGVtcGxhdGVMaXN0OwogICAgbXkgQFRlbXBsYXRlT2JqZWN0cyA9ICgnRkFRJyk7CiAgICBteSBAVGVtcGxhdGVPYmplY3RzU3VtOwogICAgZm9yZWFjaCBteSAkVGVtcGxhdGVPYmplY3QgKEBUZW1wbGF0ZU9iamVjdHMpIHsKICAgICAgICAkVGVtcGxhdGVMaXN0ID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUxpc3QoCiAgICAgICAgICAgIE9iamVjdCA9PiAkVGVtcGxhdGVPYmplY3QsCiAgICAgICAgICAgIEZvcm1hdCA9PiAnQ1NWJywKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgKTsKICAgICAgICBAVGVtcGxhdGVPYmplY3RzU3VtID0gKCBAVGVtcGxhdGVPYmplY3RzU3VtLCBAeyRUZW1wbGF0ZUxpc3R9ICk7CiAgICB9CgogICAgIyBkZWxldGUgdGhlIHRlbXBsYXRlcwogICAgaWYgKCByZWYoJFRlbXBsYXRlTGlzdCkgZXEgJ0FSUkFZJyAmJiBAeyRUZW1wbGF0ZUxpc3R9ICkgewogICAgICAgICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+VGVtcGxhdGVEZWxldGUoCiAgICAgICAgICAgIFRlbXBsYXRlSUQgPT4gXEBUZW1wbGF0ZU9iamVjdHNTdW0sCiAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgIHJldHVybiAxOwp9CgpzdWIgX0NyZWF0ZU1hcHBpbmdzICgpIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJEltcG9ydEV4cG9ydE1hcHBpbmdIYXNoID0gdW5kZWY7CgogICAgJEltcG9ydEV4cG9ydE1hcHBpbmdIYXNoLT57RkFRfSA9IFsKICAgICAgICAnVGl0bGUnLCAnQ2F0ZWdvcnlJRCcsICdTdGF0ZUlEJywgJ0xhbmd1YWdlSUQnLAogICAgICAgICdGaWVsZDEnLCAnRmllbGQyJywgJ0ZpZWxkMycsICdGaWVsZDQnLCAnRmllbGQ1JywgJ0ZpZWxkNicsICdLZXl3b3JkcycKICAgIF07CgogICAgZm9yIG15ICRPYmplY3RNYXBwaW5nS2V5ICgga2V5cyAleyRJbXBvcnRFeHBvcnRNYXBwaW5nSGFzaH0gKSB7CgogICAgICAgICMgYWRkIGEgdGVtcGxhdGUgY3VzdG9tZXIgY29tcGFueQogICAgICAgIG15ICRUZW1wbGF0ZUlEID0gJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5UZW1wbGF0ZUFkZCgKICAgICAgICAgICAgT2JqZWN0ID0+ICRPYmplY3RNYXBwaW5nS2V5LAogICAgICAgICAgICBGb3JtYXQgPT4gJ0NTVicsCiAgICAgICAgICAgIE5hbWUgICA9PiAkT2JqZWN0TWFwcGluZ0tleSAuICIgKGF1dG8tY3JlYXRlZCBtYXApIiwKICAgICAgICAgICAgQ29tbWVudCA9PgogICAgICAgICAgICAgICAgIkF1dG9tYXRpY2FsbHkgY3JlYXRlZCBkdXJpbmcgRkFRSW1wb3J0RXhwb3J0IGluc3RhbGxhdGlvbiIsCiAgICAgICAgICAgICwKICAgICAgICAgICAgVmFsaWRJRCA9PiAxLAogICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJEZBUU1hcHBpbmdEYXRhID0gewogICAgICAgICAgICBTb3VyY2VGQVFEYXRhID0+IHsKICAgICAgICAgICAgICAgIEZvcm1hdERhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIENvbHVtblNlcGFyYXRvciA9PiAnU2VtaWNvbG9uJywKICAgICAgICAgICAgICAgICAgICBDaGFyc2V0ICAgICAgICAgPT4gJ1VURi04JywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBGQVFEYXRhR2V0ID0+IHsKICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+ICRUZW1wbGF0ZUlELAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCAgICAgPT4gMSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0sCiAgICAgICAgfTsKCiAgICAgICAgIyBnZXQgb2JqZWN0IGF0dHJpYnV0ZXMKICAgICAgICBteSAkT2JqZWN0QXR0cmlidXRlTGlzdCA9ICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+T2JqZWN0QXR0cmlidXRlc0dldCgKICAgICAgICAgICAgVGVtcGxhdGVJRCA9PiAkRkFRTWFwcGluZ0RhdGEtPntTb3VyY2VGQVFEYXRhfS0+e0ZBUURhdGFHZXR9CiAgICAgICAgICAgICAgICAtPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJEF0dHJpYnV0ZVZhbHVlczsKCiAgICAgICAgZm9yZWFjaCBteSAkRGVmYXVsdCAoIEB7JE9iamVjdEF0dHJpYnV0ZUxpc3R9ICkgewoKICAgICAgICAgICAgIyBzZXQgRkFRIHR5cGVzCiAgICAgICAgICAgIGlmICggJE9iamVjdE1hcHBpbmdLZXkgZXEgJ0ZBUScgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBteSAkQ3JpdGljYWxpdHlJRDsKICAgICAgICAgICAgICAgIG15ICRGQVFUeXBlSUQ7CgogICAgICAgICAgICAgICAgaWYgKCAkRGVmYXVsdC0+e0tleX0gZXEgJ0RlZmF1bHRGQVFUeXBlSUQnICkgewogICAgICAgICAgICAgICAgICAgIGZvciBteSAkSUQgKCBrZXlzICV7ICRTZWxmLT57RkFRVHlwZUxpc3R9IH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICRGQVFUeXBlSUQgPSAkU2VsZi0+e0ZBUVR5cGVMaXN0fS0+eyRJRH07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICggJFNlbGYtPntGQVFUeXBlTGlzdH0tPnskSUR9IGVxICdPdGhlcicgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkRkFRVHlwZUlEID0gJElEOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgJEF0dHJpYnV0ZVZhbHVlcy0+eyAkRGVmYXVsdC0+e0tleX0gfSA9CiAgICAgICAgICAgICAgICAgICAgICAgICRGQVFUeXBlSUQ7CiAgICAgICAgICAgICAgICAgICAgbmV4dDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEF0dHJpYnV0ZVZhbHVlcy0+eyAkRGVmYXVsdC0+e0tleX0gfSA9CiAgICAgICAgICAgICAgICAkRGVmYXVsdC0+e0lucHV0fS0+e1ZhbHVlRGVmYXVsdH07CiAgICAgICAgfQoKICAgICAgICAkRkFRTWFwcGluZ0RhdGEtPntTb3VyY2VGQVFEYXRhfS0+e09iamVjdERhdGF9ID0gJEF0dHJpYnV0ZVZhbHVlczsKCiAgICAgICAgbXkgJERlZmF1bHROdW1iZXJPZkFzc2lnbmFibGVGQVFzID0KICAgICAgICAgICAgJEZBUU1hcHBpbmdEYXRhLT57U291cmNlRkFRRGF0YX0tPntPYmplY3REYXRhfQogICAgICAgICAgICAtPntOdW1iZXJPZkFzc2lnbmFibGVGQVFzfTsKCiAgICAgICAgbXkgJGkgPSAwOwogICAgICAgIG15IEBNYXBwaW5nT2JqRGF0YTsKICAgICAgICBmb3JlYWNoIG15ICRLZXkgKCBAeyAkSW1wb3J0RXhwb3J0TWFwcGluZ0hhc2gtPnskT2JqZWN0TWFwcGluZ0tleX0gfSApIHsKCiAgICAgICAgICAgIG15ICVNYXBwaW5nT2JqZWN0RGF0YUhhc2g7CiAgICAgICAgICAgICRNYXBwaW5nT2JqZWN0RGF0YUhhc2h7S2V5fSA9CiAgICAgICAgICAgICAgICAkSW1wb3J0RXhwb3J0TWFwcGluZ0hhc2gtPnskT2JqZWN0TWFwcGluZ0tleX0tPlskaV07CiAgICAgICAgICAgIGlmICggJGkgPT0gMCApIHsKICAgICAgICAgICAgICAgICRNYXBwaW5nT2JqZWN0RGF0YUhhc2h7SWRlbnRpZmllcn0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICggJEtleSBlcSAnVmFsaWQnICYmICEkQXR0cmlidXRlVmFsdWVzLT57RGVmYXVsdFZhbGlkfSApIHsKICAgICAgICAgICAgICAgIG5leHQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggJEtleSBlcSAnQXNzaWduZWRGQVEnICkgewogICAgICAgICAgICAgICAgZm9yICgKICAgICAgICAgICAgICAgICAgICBteSAkQ291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgICRDb3VudCA8ICREZWZhdWx0TnVtYmVyT2ZBc3NpZ25hYmxlRkFRczsKICAgICAgICAgICAgICAgICAgICAkQ291bnQrKwogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBteSAlTWFwcGluZ09iamVjdERhdGFIYXNoTG9jYWwgPSAoKTsKICAgICAgICAgICAgICAgICAgICAkTWFwcGluZ09iamVjdERhdGFIYXNoTG9jYWx7S2V5fSA9CiAgICAgICAgICAgICAgICAgICAgICAgICdBc3NpZ25lZEZBUScgLiBzcHJpbnRmKCAnJTAzcycsICRDb3VudCApOwogICAgICAgICAgICAgICAgICAgIHB1c2goIEBNYXBwaW5nT2JqRGF0YSwgXCVNYXBwaW5nT2JqZWN0RGF0YUhhc2hMb2NhbCApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcHVzaCggQE1hcHBpbmdPYmpEYXRhLCBcJU1hcHBpbmdPYmplY3REYXRhSGFzaCApOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkaSsrOwogICAgICAgIH0KCiAgICAgICAgJEZBUU1hcHBpbmdEYXRhLT57U291cmNlRkFRRGF0YX0tPntNYXBwaW5nT2JqZWN0RGF0YX0gPQogICAgICAgICAgICBcQE1hcHBpbmdPYmpEYXRhOwoKICAgICAgICBpZiAoCiAgICAgICAgICAgICEkRkFRTWFwcGluZ0RhdGEKICAgICAgICAgICAgfHwgcmVmICRGQVFNYXBwaW5nRGF0YSBuZSAnSEFTSCcKICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICJObyB2YWxpZCBtYXBwaW5nIGxpc3QgZm91bmQgZm9yIHRlbXBsYXRlIGlkICRUZW1wbGF0ZUlEIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwoKICAgICAgICB9CgogICAgICAgICMgc2V0IHRoZSBvYmplY3QgZGF0YQogICAgICAgIGlmICgKICAgICAgICAgICAgJEZBUU1hcHBpbmdEYXRhLT57U291cmNlRkFRRGF0YX0tPntPYmplY3REYXRhfQogICAgICAgICAgICAmJiByZWYgJEZBUU1hcHBpbmdEYXRhLT57U291cmNlRkFRRGF0YX0tPntPYmplY3REYXRhfSBlcSAnSEFTSCcKICAgICAgICAgICAgJiYgJEZBUU1hcHBpbmdEYXRhLT57U291cmNlRkFRRGF0YX0tPntGQVFEYXRhR2V0fQogICAgICAgICAgICAtPntUZW1wbGF0ZUlEfQogICAgICAgICAgICApCiAgICAgICAgewoKICAgICAgICAgICAgIyBzYXZlIG9iamVjdCBkYXRhCiAgICAgICAgICAgICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+T2JqZWN0RGF0YVNhdmUoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+CiAgICAgICAgICAgICAgICAgICAgJEZBUU1hcHBpbmdEYXRhLT57U291cmNlRkFRRGF0YX0tPntGQVFEYXRhR2V0fQogICAgICAgICAgICAgICAgICAgIC0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICAgICAgT2JqZWN0RGF0YSA9PgogICAgICAgICAgICAgICAgICAgICRGQVFNYXBwaW5nRGF0YS0+e1NvdXJjZUZBUURhdGF9LT57T2JqZWN0RGF0YX0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IHRoZSBmb3JtYXQgZGF0YQogICAgICAgIGlmICgKICAgICAgICAgICAgJEZBUU1hcHBpbmdEYXRhLT57U291cmNlRkFRRGF0YX0tPntGb3JtYXREYXRhfQogICAgICAgICAgICAmJiByZWYgJEZBUU1hcHBpbmdEYXRhLT57U291cmNlRkFRRGF0YX0tPntGb3JtYXREYXRhfSBlcSAnSEFTSCcKICAgICAgICAgICAgJiYgJEZBUU1hcHBpbmdEYXRhLT57U291cmNlRkFRRGF0YX0tPntGQVFEYXRhR2V0fQogICAgICAgICAgICAtPntUZW1wbGF0ZUlEfQogICAgICAgICAgICApCiAgICAgICAgewoKICAgICAgICAgICAgIyBzYXZlIGZvcm1hdCBkYXRhCiAgICAgICAgICAgICRTZWxmLT57SW1wb3J0RXhwb3J0T2JqZWN0fS0+Rm9ybWF0RGF0YVNhdmUoCiAgICAgICAgICAgICAgICBUZW1wbGF0ZUlEID0+CiAgICAgICAgICAgICAgICAgICAgJEZBUU1hcHBpbmdEYXRhLT57U291cmNlRkFRRGF0YX0tPntGQVFEYXRhR2V0fQogICAgICAgICAgICAgICAgICAgIC0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICAgICAgRm9ybWF0RGF0YSA9PgogICAgICAgICAgICAgICAgICAgICRGQVFNYXBwaW5nRGF0YS0+e1NvdXJjZUZBUURhdGF9LT57Rm9ybWF0RGF0YX0sCiAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgICAgICMgc2V0IHRoZSBtYXBwaW5nIG9iamVjdCBkYXRhCiAgICAgICAgaWYgKAogICAgICAgICAgICAkRkFRTWFwcGluZ0RhdGEtPntTb3VyY2VGQVFEYXRhfS0+e09iamVjdERhdGF9CgogICAgICAgICAgICAjJiYgcmVmICRGQVFNYXBwaW5nRGF0YS0+e01hcHBpbmdPYmplY3REYXRhfSBlcSAnQVJSQVknCiAgICAgICAgICAgICYmICRGQVFNYXBwaW5nRGF0YS0+e1NvdXJjZUZBUURhdGF9LT57RkFRRGF0YUdldH0KICAgICAgICAgICAgLT57VGVtcGxhdGVJRH0KICAgICAgICAgICAgKQogICAgICAgIHsKCiAgICAgICAgICAgICMgZGVsZXRlIGFsbCBleGlzdGluZyBtYXBwaW5nIGRhdGEKICAgICAgICAgICAgJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5NYXBwaW5nRGVsZXRlKAogICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PgogICAgICAgICAgICAgICAgICAgICRGQVFNYXBwaW5nRGF0YS0+e1NvdXJjZUZBUURhdGF9LT57RkFRRGF0YUdldH0KICAgICAgICAgICAgICAgICAgICAtPntUZW1wbGF0ZUlEfSwKICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgIyBhZGQgdGhlIG1hcHBpbmcgb2JqZWN0IHJvd3MKCiAgICAgICAgICAgIGZvciBteSAkTWFwcGluZ09iamVjdERhdGEgKAogICAgICAgICAgICAgICAgQHsgJEZBUU1hcHBpbmdEYXRhLT57U291cmNlRkFRRGF0YX0tPntNYXBwaW5nT2JqZWN0RGF0YX0gfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgIyBhZGQgYSBuZXcgbWFwcGluZyByb3cKICAgICAgICAgICAgICAgIG15ICRNYXBwaW5nSUQgPSAkU2VsZi0+e0ltcG9ydEV4cG9ydE9iamVjdH0tPk1hcHBpbmdBZGQoCiAgICAgICAgICAgICAgICAgICAgVGVtcGxhdGVJRCA9PgogICAgICAgICAgICAgICAgICAgICAgICAkRkFRTWFwcGluZ0RhdGEtPntTb3VyY2VGQVFEYXRhfS0+e0ZBUURhdGFHZXR9CiAgICAgICAgICAgICAgICAgICAgICAgIC0+e1RlbXBsYXRlSUR9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAjIGFkZCB0aGUgbWFwcGluZyBvYmplY3QgZGF0YQogICAgICAgICAgICAgICAgJFNlbGYtPntJbXBvcnRFeHBvcnRPYmplY3R9LT5NYXBwaW5nT2JqZWN0RGF0YVNhdmUoCiAgICAgICAgICAgICAgICAgICAgTWFwcGluZ0lEICAgICAgICAgPT4gJE1hcHBpbmdJRCwKICAgICAgICAgICAgICAgICAgICBNYXBwaW5nT2JqZWN0RGF0YSA9PiAkTWFwcGluZ09iamVjdERhdGEsCiAgICAgICAgICAgICAgICAgICAgVXNlcklEICAgICAgICAgICAgPT4gMSwKICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cgp9CjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIFNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCiRSZXZpc2lvbjogMS4xICQgJERhdGU6IDIwMTAtMTAtMDEgMTE6MDA6MjMgJAo9Y3V0Cg== IyAtLQojIENIQU5HRVNfZmFxaW1wb3J0ZXhwb3J0LSBjaGFuZ2UgbG9nIG9mIHNlcnZpY2VpbXBvcnRleHBvcnQKIyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMCBjLmEucC5lLiBJVCBHbWJILCBodHRwOi8vd3d3LmNhcGUtaXQuZGUvCiMKIyAtLQojICRJZDogQ0hBTkdFU19mYXFpbXBvcnRleHBvcnQsdiAxLjEgMjAxMC0xMC0wMSAxMTowMDoyMyByYWJvIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0gMC4xLjAgKDIwMTAvMTAvMDEpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICogKDIwMTAvMTAvMDEpIC0gQ1I6IEZpcnN0IHByZS1wcm9kdWN0aXZlIHJlbGVhc2Ugb2YgZ2VuZXJhbCBmYXEgaW1wb3J0LS9leHBvcnQgYmFja2VuZC4KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSA=