ITSM-CIAttributeCollection 1.9.4 c.a.p.e. IT GmbH http://www.cape-it.de/ GNU AFFERO GENERAL PUBLIC LICENSE Version 3, November 2007 Bugfix: T2011111699000048 (import/export encrypted text), T2011102490000247 (check encrypted text), T2011102490000238 (attribute DummyX), T2011102890000311 (autocomplete for sub-attributes), T2011102490000229 (AgentITSMConfigItemEdit.dtl). CR: T2011101290000242 (added attribute text link). Bugfix: T2011091690000149 encrypted text. Bugfix: missing DataRef in Kernel::System::CIAttachmentStorage::AttachmentStorageFS::AttachmentGet, S2011081999000031 (Linkadd in Event CIClassReference), S2011081999000031 (JS for AutoComplete). CR: changed install information according to new standard in OTRS 3, new CI-Attribute "EncryptedText". ITSM-CIAttributeCollection - provides additional CI-attributes. ITSM-CIAttributeCollection - stellt zusaetzliche CI-Attribute bereit. 3.0.x <br/> <strong>WELCOME</strong> <br/> <br/> You are about to install the OTRS module ITSM-CIAttributeCollection. This package provides additional CI-attribute types.<br/> <br/> <br/> Please note, that due to missing functionality it is required to modify an existing file of another package. Therefore, after installation ITSMConfigurationManagement will be shown as corrupt. This modification is essential for use of the CI-attachment functionality. If you update or restore ITSMConfigurationManagement you won't be able to upload new attachments to config items anymore. You can fix this by reinstalling this package.<br/> <br/> <br/> <strong>Required OTRS Packages:</strong><br/> <br/> <ul> <li>ITSMConfigutrationManagement 3.0.4 or higher</li> </ul> <br/> <br/> <strong>Required Perl Packages:</strong><br/> <br/> <ul> <li>Digest::MD5</li> <li>Encode</li> </ul> <br/> <br/> <br/> c.a.p.e. IT ...easy.<br/> <br/> <br/> The package has been installed. Your configuration has been changed<br/> <br/> <br/> <strong>NOTICE</strong> <br/> (1) Verify the installation and check your OTRS-SysLog.<br/> (2) If your OTRS-ITSM Configuration Management Package is now marked as not properly installed. As mentioned before, there's no need to worry. In order to keep ITSM-CIAttribute functionality you must not reinstall ITSMConfigItem!<br/> (3) <strong>Please see <i>OTRS_HOME/doc/en/USAGE_itsm-ciattributecollection.pod</i> or <i>USAGE_itsm-ciattributecollection.html</i> for documentation.</strong><br/> <br/> <br/> <br/> c.a.p.e. IT ...easy.<br/> <br/> <br/> <strong>WELCOME</strong> <br/> <br/> You are about to UNINSTALL the ITSM-CIAttributeCollection extensions package for OTRS.<br/> <br/> <br/> <br/> c.a.p.e. IT ...easy.<br/> <br/> <br/> <strong>WELCOME</strong> <br/> <br/> You are about to upgrade the ITSM-CIAttributeCollection extensions package for OTRS.<br/> <br/> <br/> <br/> c.a.p.e. IT ...easy.<br/> <br/> ITSMConfigurationManagement my $FunctionName = 'CodeInstall'; my $ModuleName = $Param{Structure}->{Name}->{Content}; $ModuleName =~ s/-/_/g; my $CodeModule = 'var::packagesetup::' . $ModuleName; 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 $ModuleName = $Param{Structure}->{Name}->{Content}; $ModuleName =~ s/-/_/g; my $CodeModule = 'var::packagesetup::' . $ModuleName; 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 $ModuleName = $Param{Structure}->{Name}->{Content}; $ModuleName =~ s/-/_/g; my $CodeModule = 'var::packagesetup::' . $ModuleName; 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 $ModuleName = $Param{Structure}->{Name}->{Content}; $ModuleName =~ s/-/_/g; my $CodeModule = 'var::packagesetup::' . $ModuleName; 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." ); } } 2011-11-17 13:04:25 cvs.intra.cape-it.de IyAtLQojIENIQU5HRVNfSVRTTS1DSUF0dHJpYnV0ZUNvbGxlY3Rpb24gLSBjaGFuZ2UgbG9nIG9mIElUU00tQ0lBdHRyaWJ1dGVDb2xsZWN0aW9uCiMgQ29weXJpZ2h0IChDKSAyMDA2LTIwMTEgYy5hLnAuZS4gSVQgR21iSCwgaHR0cDovL3d3dy5jYXBlLWl0LmRlLwojIC0tCiMgJElkOiBDSEFOR0VTX0lUU00tQ0lBdHRyaWJ1dGVDb2xsZWN0aW9uLHYgMS42OSAyMDExLTExLTE3IDEyOjAzOjA2IHNtZWhsaWcgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0gMS45LjQgKDIwMTEvMTEvMTcpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICogKDIwMTEvMTEvMTcpIC0gQnVnZml4OiBUMjAxMTExMTY5OTAwMDA0OCAoaW1wb3J0L2V4cG9ydCBlbmNyeXB0ZWQgdGV4dCkgKHNtZWhsaWcpCiMgKiAoMjAxMS8xMS8xNCkgLSBCdWdmaXg6IFQyMDExMTAyNDkwMDAwMjQ3IChjaGVjayBlbmNyeXB0ZWQgdGV4dCkgKGRkb2VyZmZlbCkKIyAqICgyMDExLzExLzE0KSAtIEJ1Z2ZpeDogVDIwMTExMDI0OTAwMDAyMzggKGF0dHJpYnV0ZSBEdW1teVgpIChkZG9lcmZmZWwpCiMgKiAoMjAxMS8xMC8yOCkgLSBCdWdmaXg6IFQyMDExMTAyODkwMDAwMzExIChhdXRvY29tcGxldGUgZm9yIHN1Yi1hdHRyaWJ1dGVzKSAobWFiYSkKIyAqICgyMDExLzEwLzI1KSAtIEJ1Z2ZpeDogVDIwMTExMDI0OTAwMDAyMjkgKEFnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0LmR0bCkgKHR0bykKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0gMS45LjMgKDIwMTEvMTAvMTMpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICogKDIwMTEvMTAvMTMpIC0gQ1I6IFQyMDExMTAxMjkwMDAwMjQyIGFkZGVkIGF0dHJpYnV0ZSB0ZXh0IGxpbmsgKHNtZWhsaWcpCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tIDEuOS4yICgyMDExLzA5LzE5KSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAqICgyMDExLzA5LzE5KSAtIEJ1Z2ZpeDogVDIwMTEwOTE2OTAwMDAxNDkgZW5jcnlwdGVkIHRleHQgKHNtZWhsaWcpCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tIDEuOS4xICgyMDExLzA5LzA1KSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAqICgyMDExLzA5LzA1KSAtIEJ1Z2ZpeDogUzIwMTEwODE5OTkwMDAwMzEgKEpTIGZvciBBdXRvQ29tcGxldGUpIChtYWJhKQojICogKDIwMTEvMDgvMjYpIC0gQnVnZml4OiBTMjAxMTA4MTk5OTAwMDAzMSAoTGlua2FkZCBpbiBFdmVudCBDSUNsYXNzUmVmZXJlbmNlKSAoc21laGxpZykKIyAqICgyMDExLzA4LzE3KSAtIEJ1Z2ZpeDogbWlzc2luZyBEYXRhUmVmIGluIEtlcm5lbDo6U3lzdGVtOjpDSUF0dGFjaG1lbnRTdG9yYWdlOjpBdHRhY2htZW50U3RvcmFnZUZTOjpBdHRhY2htZW50R2V0ICh0dG8pCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tIDEuOS4wICgyMDExLzA4LzA1KSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAqICgyMDExLzA4LzA1KSAtIENSOiBjaGFuZ2VkIGluc3RhbGwgaW5mb3JtYXRpb24gYWNjb3JkaW5nIHRvIG5ldyBzdGFuZGFyZCBpbiBPVFJTIDMgKG1hYmEpCiMgKiAoMjAxMS8wOC8wMSkgLSBDUjogbmV3IENJLUF0dHJpYnV0ZSAiRW5jcnlwdGVkVGV4dCIgKHNtZWhsaWcpCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tIDEuOC42ICgyMDExLzA3LzI1KSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAqICgyMDExLzA3LzI1KSAtIENSOiBjaGFuZ2VzIGZvciBwZXJsIGNyaXRpYyAoc21laGxpZykKIyAqICgyMDExLzA3LzI1KSAtIEJ1Z2ZpeDogdXNlIG9mIG5vdCBleGlzdGluZyBvYmplY3QgaW4gQXR0YWNobWVudFN0b3JhZ2UucG0gKHNtZWhsaWcpCiMgKiAoMjAxMS8wNy8yMikgLSBCdWdmaXg6IGFkZGVkIGNoZWNrIGZvciBFbmNvZGVPYmplY3QgdG8gQWdlbnRBdHRhY2htZW50U3RvcmFnZSAodHRvKQojICogKDIwMTEvMDcvMTgpIC0gQnVnZml4OiBhZGRlZCBtaXNzaW5nIG9wdGlvbiBpbiBBZ2VudENvbmZpZ0l0ZW1FZGl0IGZvciBkaXMvZW5hYmxpbmcgQ0lBdHRhY2htZW50IGNoZWNrIChzaXplICsgbWQ1KSAodHRvKQojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLSAxLjguNSAoMjAxMS8wNy8xOCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgKiAoMjAxMS8wNy8xOCkgLSBDUjogYWRkZWQgc3lzY29uZmlnIG9wdGlvbiBmb3IgZGlzL2VuYWJsaW5nIENJQXR0YWNobWVudCBjaGVjayAoc2l6ZSArIG1kNSkgKHR0bykKIyAqICgyMDExLzA3LzE4KSAtIEJ1Z2ZpeDogY3JvYWsgaW4gbWQ1X2hleCB3aGlsIGNhbHVjbGF0aW5nIG1kNS1zdW0gKHR0bykKIyAqICgyMDExLzA2LzE0KSAtIEJ1Z2ZpeDogdXNlIG9mIG5vdCBleGlzdGluZyBvYmplY3QgaW4gS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpYTUw6OlR5cGU6OkNJQXR0YWNobWVudCAodHRvKQojICogKDIwMTEvMDUvMTkpIC0gQ1I6IGFkZGVkIHRyYW5zbGF0aW9ucyB0byBkdGwgZm9yIEFnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0IChpZiBLSVhDb3JlIGlzIHVzZWQpICh0dG8pCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tIDEuOC40ICgyMDExLzA1LzEwKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAqICgyMDExLzA1LzEwKSAtIEJ1Z2ZpeDogVDIwMTEwNTEwOTAwMDAyOTIgKG1pc3NpbmcgY29udmVyc2lvbiBmb3IgZXgtL2ltcG9ydCBvZiBzZXJ2aWNlLSBhbmQgdXNlciBhdHRyaWJ1dGVzKQojICogKDIwMTEvMDUvMDUpIC0gQ1I6IGFkZGVkIHNjcmlwdCB0byBjaGVjayBwZXJsIG1vZHVsZSBkZXBlbmRlbmNpZXMgCiMgKiAoMjAxMS8wNC8yOCkgLSBCdWdmaXg6IFQyMDExMDQxODkwMDAyMzIxIChkZWJ1ZyBvdXRwdXQgY2F1c2VkIGluZGV4LnBsIHRvIGJlIGRvd25sb2FkZWQgaWYgYXR0cmlidXRlIHR5cGUgQ3VzdG9tZXJVc2VyQ29tcGFueSBpcyB1c2VkKQojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLSAxLjguMyAoMjAxMS8wNC8xOCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgKiAoMjAxMS8wNC8xOCkgLSBCdWdmaXg6IHdyb25nIHJldHVybiB2YWx1ZSBpbiBiYWNrZW5kIEN1c3RvbWVyVXNlckNvbXBhbnkKIyAqICgyMDExLzA0LzE4KSAtIEJ1Z2ZpeDogbWlzc2luZyAiY29tbW9uIiB3aWxkY2FyZCByZXBsYWNlbWVudCB0byBQZXJsLXJlZ2V4cCBpbiBBZ2VudFF1ZXVlU2VhcmNoCiMgKiAoMjAxMS8wNC8xOCkgLSBCdWdmaXg6IHVzZSBvZiB1bmRlY2xhcmVkIHZhcmlhYmxlIGluIElUU01Db25maWdJdGVtTGF5b3V0Q3VzdG9tZXJVc2VyQ29tcGFueQojICogKDIwMTEvMDQvMTgpIC0gQnVnZml4OiB0eXBlIGluIHBvZC1kb2N1bWVudGF0aW9uCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tIDEuOC4yICgyMDExLzA0LzE4KSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAqICgyMDExLzA0LzE1KSAtIEJ1Z2ZpeDogd2lkZSBjaGFyYWN0ZXIgcHJpbnQgZXJyb3IgaW4gbWQ1IGNhdXNlZCBzb2Z0d2FyZSBlcnJvciAobWlzc2luZyBVVEY4LWVuY29kZSkKIyAqICgyMDExLzA0LzEzKSAtIENSOiBhZGRlZCBwb2QtIGFuZCBodG1sIGRvY3VtZW50YXRpb24gZm9yIFVzZXIvQ3VzdG9tZXJDb21wYW55L0N1c3RvbWVyVXNlckNvbXBhbnkKIyAqICgyMDExLzA0LzEzKSAtIENSOiByZW1vdmVkIEhUTUwtdmVyc2lvbiBvZiBkb2N1bWVudGF0aW9uCiMgKiAoMjAxMS8wMy8zMCkgLSBDUjogbW9kaWZ5IEFnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0LmR0bCBvbmx5IGlmIEtJWENvcmUgaXMgbm90IGluc3RhbGxlZC9hdmFpbGFibGUKIyAqICgyMDExLzAzLzMwKSAtIENSOiBhZGRlZCBhdXRvY29tcGxldGUgZnVuY3Rpb25hbGl0eSBmb3IgQ3VzdG9tZXIoVXNlcilDb21wYW55CiMgKiAoMjAxMS8wMy8yOSkgLSBCdWdmaXg6IGZpeGVkIHdyb25nIGdyb3VwcyBpbiBjb25maWd1cmF0aW9uIAojICogKDIwMTEvMDMvMTgpIC0gQnVnZml4OiBmaXhlZCBwb2QtZXJyb3IKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0gMS44LjEgKDIwMTEvMDMvMTgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICogKDIwMTEvMDMvMTgpIC0gQ1I6IGFkZGVkIHBvZC0gYW5kIGh0bWwgZG9jdW1lbnRhdGlvbgojICogKDIwMTEvMDMvMTcpIC0gQnVnZml4OiBhZGRlZCBzZWFyY2ggZm9yIHJlZmVyZW5jZWQgQ0ljbGFzcyBDSS1udW1iZXIKIyAqICgyMDExLzAzLzE2KSAtIEJ1Z2ZpeDogYWRkZWQgc2VhcmNoIGZvciByZWZlcmVuY2VkIENJY2xhc3MgQ0ktbmFtZQojICogKDIwMTEvMDMvMTYpIC0gQnVnZml4OiBhZGRlZCBtaXNzaW5nIHN0YXRzLSBhbmQgaW0tL2V4cG9ydCBtZXRob2RzIHRvIFhNTDo6VHlwZTo6Q0lBdHRhY2htZW50CiMgKiAoMjAxMS8wMy8xNikgLSBCdWdmaXg6IGFkZGVkIHNlc3Npb24gSUQgdG8gQ0lhdHRhY2htZW50LWRvd25sb2FkIGxpbmsKIyAqICgyMDExLzAzLzE0KSAtIENSOiBjaGFuZ2VkIFN5c0NvbmZpZyB0byBmcmFtZXdvcmsgMy4wCiMgKiAoMjAxMS8wMy8xNCkgLSBDUjogYWRkZWQgcHJlLWluc3RhbGxhdGlvbiBub3RlIGFuZCByZXF1aXJlZCBQZXJsLXBhY2thZ2UKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0gMS44LjAgKDIwMTEvMDMvMTQpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICogKDIwMTEvMDMvMTQpIC0gQ1I6IG5ldyBDSS1BdHRyaWJ1dGUgIkNJQXR0YWNobWVudCIKIyAqICgyMDExLzAyLzIyKSAtIENSOiBhZGRlZCBkb2N1bWVudGF0aW9uCiMgKiAoMjAxMS8wMi8yMikgLSBDUjogYWRkZWQgYXV0b2NvbXBsZXRlIGZ1bmN0aW9uYWxpdHkgZm9yIFF1ZXVlLCBTZXJ2aWNlIGFuZCBDSUNsYXNzCiMgKiAoMjAxMS8wMi8yMikgLSBDUjogYWRkZWQgbmV3IGF0dHJpYnV0IFF1ZXVlUmVmZXJlbmNlCiMKIyBOT1RFOiBmdXJ0aGVyIDEuNi54ICsgMS43LnggQ1JzL2J1Z2ZpeGVzIChPVFJTIDIuNC54KSBjb250YWluZWQgaW4gYnJhbmNoIDEuNgojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLSAxLjYuMCAoMjAxMS8wMi8xNSkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgKiAoMjAxMS8wMi8xNSkgLSBDUjogYWRkZWQgZG9jdW1lbnRhdGlvbiBmb3IgU2VydmljZVJlZmVyZW5jZSB1c2FnZSwgcmVtb3ZlZCBTVERFUlItcHJpbnQKIyAqICgyMDExLzAyLzE0KSAtIENSOiBtYWtlIFNlcnZpY2VSZWZlcmVuY2UsIENJQ2xhc3NSZWZlcmVuY2Ugc2VhcmNoYWJsZSBpbiBBZ2VudElUU01Db25maWdJdGVtU2VhcmNoCiMgKiAoMjAxMS8wMi8wOCkgLSBDUjogYWRkZWQgbmV3IGF0dHJpYnV0IFNlcnZpY2VSZWZlcmVuY2UKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0gMS41LjAgKDIwMTAvMDcvMDEpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICogKDIwMTAvMDcvMDEpIC0gQ1I6IGFkZGVkIG5ldyBhdHRyaWJ1dCBDSUNsYXNzUmVmZXJlbmNlIGFzIGEgbW9yZSBnZW5lcmFsIGFwcHJvYWNoIHRoYW4gQ0lDb3N0Q2VudGVyL0NJTG9jYXRpb24KIyAqICgyMDEwLzA3LzAxKSAtIENSOiBzZXQgbmV3IGRlZmF1bHQgLSBkaXNhYmxlZCBldmVudHMgZm9yIGxpbmsgdXBkYXRlIChDSUNvc3RDZW50ZXIsIENJTG9jYXRpb24pCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tIDEuNC41ICgyMDEwLzA1LzMwKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAqICgyMDEwLzA1LzMwKSAtIENSOiByZXBsYWNlZCB1c2Ugb2YgQ2lDU1V0aWxzT2JqZWN0LT5HZXRMaW5rZWRPYmplY3RzIHRvIExpbmtPYmplY3QtPkdldExpbmtlZE9iamVjdHMKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0gMS40LjQgKDIwMTAvMDMvMTUpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICogKDIwMTAvMDMvMTUpIC0gQnVnZml4OiAgYWRkZWQgbWlzc2luZyBmaWxlCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tIDEuNC4zICgyMDEwLzAzLzE1KSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAqICgyMDEwLzAzLzE1KSAtIEJ1Z2ZpeDogIGFkZGVkIG1pc3NpbmcgZW5jb2RlIG9iamVjdAojICogKDIwMTAvMDEvMTgpIC0gQ1I6ICBhZGRlZCBDSS1udW1iZXIgdG8gQ29zdENlbnRlci1hdHRyaWJ1dGUgcHJlc2VudGF0aW9uCiMgKiAoMjAxMC8wMS8wOCkgLSBCdWdmaXg6ICBpbXByb3ZlZCBlcnJvciBoYW5kbGluZyBpbiBDSS1FdmVudHMgKENDICYgbG9jYXRpb24pCiMgKiAoMjAxMC8wMS8wOCkgLSBCdWdmaXg6ICByZS1hZGRlZCBtaXNzaW5nIGNvbmZpZyBvcHRpb24gCiMgICAgICAgICAgICAgICAgICBDSUxvY2F0aW9uTGlua1JlbW92ZUxpbmtzVG9PdGhlckNJcwojICogKDIwMTAvMDEvMDgpIC0gQnVnZml4OiAgZml4ZWQgbWV0aG9kcyBFeHBvcnRWYWx1ZVByZXBhcmUsIAojICAgICAgICAgICAgICAgICAgSW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlLCBJbXBvcnRWYWx1ZVByZXBhcmUgZm9yIENJQ29zdENlbnRlcgojICAgICAgICAgICAgICAgICAgYW5kIENJTG9jYXRpb24KIyAqICgyMDA5LzAxLzA4KSAtIG5ldyBDSS1BdHRyaWJ1dGUgIkNJQ29zdENlbnRlciIKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0gMS40LjIgKDIwMDkvMTEvMjUpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICogKDIwMDkvMTEvMjUpIC0gQnVnZml4OiBjaGFuZ2VkIFNlYXJjaFN0cmluZyBmb3IgTERBUCAKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0gMS40LjEgKDIwMDkvMTEvMjEpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICogKDIwMDkvMTEvMTMpIC0gQnVnZml4OiBjaGFuZ2VkIG1ldGhvZCBmb3Igc2VhcmNoIG9mIEN1c3RvbWVySUQoQ29tcGFueSkgLSAKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0gMS40LjAgKDIwMDkvMTAvMjEpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICogKDIwMDkvMTAvMjEpIC0gQ1I6IGFkZCBzZWFyY2hmaWVsZCBmb3IgQ3VzdG9tZXJJRChDb21wYW55KQojICogKDIwMDkvMTAvMjApIC0gQ1I6IGluaXRpYWwgaW1wb3J0IGZvciBPVFJTIDIuNC54CiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tIDEuMy4wICgyMDA5LzA3LzE1KSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAqICgyMDA5LzA3LzE1KSAtIENSOiBhZGQgQmFja2VuZE1hcHBpbmcgZm9yIFVzZXIgYW5kIEN1c3RvbWVyQ29tcGFueQojICogKDIwMDkvMDcvMTMpIC0gQ1I6IG5ldyBDSUF0dHJpYnV0ZSBVc2VyIGFuZCBDdXN0b21lckNvbXBhbnkKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0gMS4yLjAgKDIwMDkvMDcvMTApIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICogKDIwMDkvMDcvMTApIC0gQ1I6IHJlbW92ZSBsaW5rcyB0byBvdGhlciBDSXMgaWYgc3BlY2lmaWVkIENJbG9jYXRpb24gaXMgc2V0CiMKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0gMS4xLjAgKDIwMDkvMDQvMDEpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojICogKDIwMDkvMDQvMDEpIC0gQ1I6IG5ldyBDSS1BdHRyaWJ1dGUgIkNJTG9jYXRpb24iCiMgKiAoMjAwOS8wNC8wMikgLSBDUjogbmV3IENJLUV2ZW50IGZvciBhdXRvbWF0aWMgdXBkYXRlIG9mIGxpbmtzIGZyb20vdG8gQ0ktCiMgICAgICAgICAgICAgICAgICBsb2NhdGlvbgojCiMKIy0tLS0tLS0tLS0tLS0tLS0tLS0tIDEuMC4zICgyMDA5LzAyLzI2KSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIyAqICgyMDA5LzAyLzI2KSAtIENSOiBuZXcgQ0ktQXR0cmlidXRlICJEdW1teVgiCiMgKiAod2F5IGFnbykgICAgLSBDUjogbmV3IHBhY2thZ2UKIwojCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbm8gY29udGVudCBiZWxvdyB0aGlzIGxpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCg== IyAtLQojIEFnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0LmR0bCAtIHByb3ZpZGVzIEhUTUwgZm9ybSBmb3IgQWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMSBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgRXh0ZW5zaW9ucyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMSBjLmEucC5lLiBJVCBHbWJILCBodHRwOi8vd3d3LmNhcGUtaXQuZGUKIwojIHdyaXR0ZW4vZWRpdGVkIGJ5OgojICogTWFydGluKGRvdClCYWx6YXJlayhhdCljYXBlKGRhc2gpaXQoZG90KWRlCiMKIyAtLQojICRJZDogQWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQuZHRsLHYgMS40IDIwMTEtMTAtMjggMjI6Mjg6MzcgbWFiYSBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPCEtLWR0bDpibG9jazpTdGFydE5vcm1hbC0tPgo8ZGl2IGNsYXNzPSJNYWluQm94IEFSSUFSb2xlTWFpbiBMYXlvdXRGaXhlZFNpZGViYXIgU2lkZWJhckxhc3QiPgojIEtJWDRPVFJTLWNhcGVJVAojICAgIDxoMT4kVGV4dHsiRWRpdCJ9OiAkVGV4dHsiQ29uZmlnIEl0ZW0ifTogJFFEYXRheyJOdW1iZXIifSAtICRUZXh0eyJDbGFzcyJ9OiAkUURhdGF7IkNsYXNzIn08L2gxPgogICAgPGgxPiRUZXh0eyJFZGl0In06ICRUZXh0eyJDb25maWcgSXRlbSJ9OiAkVGV4dHsiJFFEYXRheyJOdW1iZXIifSJ9IC0gJFRleHR7IkNsYXNzIn06ICRUZXh0eyIkUURhdGF7IkNsYXNzIn0ifTwvaDE+CiMgRU8gS0lYNE9UUlMtY2FwZUlUCiAgICA8ZGl2IGNsYXNzPSJDb250ZW50Q29sdW1uIj4KPCEtLWR0bDpibG9jazpTdGFydE5vcm1hbC0tPgokSW5jbHVkZXsiQWdlbnRJVFNNQ3VzdG9tZXJTZWFyY2gifQojIEtJWDRPVFJTLWNhcGVJVAojICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIG5hbWU9IkNsYXNzSXRlbSIgY2xhc3M9IlZhbGlkYXRlIFByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiIGlkPSJDbGFzc0l0ZW0iPgogICAgICAgICA8Zm9ybSBhY3Rpb249IiRFbnZ7IkNHSUhhbmRsZSJ9IiBtZXRob2Q9InBvc3QiIG5hbWU9IkNsYXNzSXRlbSIgY2xhc3M9IlZhbGlkYXRlIFByZXZlbnRNdWx0aXBsZVN1Ym1pdHMiIGlkPSJDbGFzc0l0ZW0iIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiPgojIEVPIEtJWDRPVFJTLWNhcGVJVAo8IS0tZHRsOmJsb2NrOlN0YXJ0U21hbGwtLT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iTGF5b3V0UG9wdXAgQVJJQVJvbGVNYWluIj4KICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkhlYWRlciI+CiMgS0lYNE9UUlMtY2FwZUlUCiMgICAgICAgICAgICAgICAgICAgIDxoMT4kVGV4dHsiRWRpdCJ9OiAkVGV4dHsiQ29uZmlnIEl0ZW0ifTogJFFEYXRheyJOdW1iZXIifSAtICRUZXh0eyJDbGFzcyJ9OiAkUURhdGF7IkNsYXNzIn08L2gxPgogICAgICAgICAgICAgICAgICAgIDxoMT4kVGV4dHsiRWRpdCJ9OiAkVGV4dHsiQ29uZmlnIEl0ZW0ifTogJFFEYXRheyJOdW1iZXIifSAtICRUZXh0eyJDbGFzcyJ9OiAkVGV4dHsiJERhdGF7IkNsYXNzIn0ifTwvaDE+CiMgRU8gS0lYNE9UUlMtY2FwZUlUCiAgICAgICAgICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPSJDYW5jZWxDbG9zZVBvcHVwIiBocmVmPSIjIj4kVGV4dHsiQ2FuY2VsICYgY2xvc2Ugd2luZG93In08L2E+CiAgICAgICAgICAgICAgICAgICAgPC9wPgogICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJTY3JlZW5UeXBlIiB2YWx1ZT0iUG9wdXAiLz4KPCEtLWR0bDpibG9jazpTdGFydFNtYWxsLS0+CiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDb250ZW50Ij4KICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJBY3Rpb24iIHZhbHVlPSIkRW52eyJBY3Rpb24ifSIvPgogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IlN1YmFjdGlvbiIgdmFsdWU9IlZlcnNpb25TYXZlIi8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ2xhc3NJRCIgdmFsdWU9IiRRRGF0YXsiQ2xhc3NJRCJ9Ii8+CiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iQ29uZmlnSXRlbUlEIiB2YWx1ZT0iJFFEYXRheyJDb25maWdJdGVtSUQifSIvPgojIEtJWDRPVFJTLWNhcGVJVAo8IS0tIGR0bDpibG9jazpQbGF1c2lDaGVja05vdGUgLS0+CiAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJNZXNzYWdlQm94IE5vdGljZSI+CiAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+JFRleHR7IiREYXRheyJUZXh0In0ifSZuYnNwOyREYXRheyJDb2RlIn08L3A+CiAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6UGxhdXNpQ2hlY2tOb3RlIC0tPgojIEVPIEtJWDRPVFJTLWNhcGVJVAogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KPCEtLSBkdGw6YmxvY2s6Um93TmFtZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iTmFtZSI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4gJFRleHR7Ik5hbWUifTogPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9Ik5hbWUiIGlkPSJOYW1lIiBjbGFzcz0iVzUwcGMgVmFsaWRhdGVfUmVxdWlyZWQgJFFEYXRheyJSb3dOYW1lSW52YWxpZCJ9IiBtYXhsZW5ndGg9IjI1MCIgdmFsdWU9IiRRRGF0YXsiTmFtZSJ9IiB0aXRsZT0iJFRleHR7IlRoZSBuYW1lIG9mIHRoaXMgY29uZmlnIGl0ZW0ifSIvPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iTmFtZUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSIgPjxwPiRUZXh0eyJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiJ9PC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iTmFtZVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+JFRleHR7IlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIn08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwhLS0gZHRsOmJsb2NrOlJvd05hbWUgLS0+CjwhLS0gZHRsOmJsb2NrOlJvd0RlcGxTdGF0ZSAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSJNYW5kYXRvcnkiIGZvcj0iRGVwbFN0YXRlSUQiPjxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+ICRUZXh0eyJEZXBsb3ltZW50IFN0YXRlIn06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJEZXBsU3RhdGVPcHRpb25TdHJnIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkRlcGxTdGF0ZUlERXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIiA+PHA+JFRleHR7IlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIn08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJEZXBsU3RhdGVJRFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+JFRleHR7IlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIn08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwhLS0gZHRsOmJsb2NrOlJvd0RlcGxTdGF0ZSAtLT4KPCEtLSBkdGw6YmxvY2s6Um93SW5jaVN0YXRlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9Ik1hbmRhdG9yeSIgZm9yPSJJbmNpU3RhdGVJRCI+PHNwYW4gY2xhc3M9Ik1hcmtlciI+Kjwvc3Bhbj4gJFRleHR7IkluY2lkZW50IFN0YXRlIn06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICREYXRheyJJbmNpU3RhdGVPcHRpb25TdHJnIn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9IkluY2lTdGF0ZUlERXJyb3IiIGNsYXNzPSJUb29sdGlwRXJyb3JNZXNzYWdlIiA+PHA+JFRleHR7IlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIn08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPSJJbmNpU3RhdGVJRFNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+JFRleHR7IlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIn08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwhLS0gZHRsOmJsb2NrOlJvd0luY2lTdGF0ZSAtLT4KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgoKPCEtLSBkdGw6YmxvY2s6WE1MUm93IC0tPgo8IS0tIGR0bDpibG9jazpYTUxSb3dGaWVsZHNldFN0YXJ0IC0tPgogICAgICAgICAgICAgICAgICAgIDxmaWVsZHNldCBjbGFzcz0iVGFibGVMaWtlIj4KPCEtLSBkdGw6YmxvY2s6WE1MUm93RmllbGRzZXRTdGFydCAtLT4KPCEtLSBkdGw6YmxvY2s6WE1MUm93VmFsdWUgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCAkRGF0YXsiTGFiZWxDbGFzcyJ9ICREYXRheyJMYWJlbEZvciJ9Pgo8IS0tIGR0bDpibG9jazpYTUxSb3dWYWx1ZUNvbnRlbnRSZXF1aXJlZCAtLT4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJNYXJrZXIiPio8L3NwYW4+CjwhLS0gZHRsOmJsb2NrOlhNTFJvd1ZhbHVlQ29udGVudFJlcXVpcmVkIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFRleHR7IiREYXRheyJOYW1lIn0ifToKICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD4KICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iJERhdGF7IkNsYXNzIn0gRmllbGQiPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgJERhdGF7IklucHV0U3RyaW5nIn0KPCEtLSBkdGw6YmxvY2s6WE1MUm93VmFsdWVDb250ZW50RGVsZXRlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz0iRGlzYWJsZVZhbGlkYXRpb24gUmVtb3ZlIiB0eXBlPSJzdWJtaXQiIG5hbWU9IiRRRGF0YXsiSW5wdXRLZXkifTo6RGVsZXRlIiB2YWx1ZT0iJFRleHR7IkRlbGV0ZSJ9Ij4kVGV4dHsiRGVsZXRlIn08L2J1dHRvbj4KPCEtLSBkdGw6YmxvY2s6WE1MUm93VmFsdWVDb250ZW50RGVsZXRlIC0tPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iJFFEYXRheyJJdGVtSUQifUVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSIgPjxwPiRUZXh0eyJUaGlzIGZpZWxkIGlzIHJlcXVpcmVkLiJ9PC9wPjwvZGl2PgogICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBpZD0iJFFEYXRheyJJdGVtSUQifVNlcnZlckVycm9yIiBjbGFzcz0iVG9vbHRpcEVycm9yTWVzc2FnZSI+PHA+JFRleHR7IlRoaXMgZmllbGQgaXMgcmVxdWlyZWQuIn08L3A+PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2Pgo8IS0tIGR0bDpibG9jazpYTUxSb3dWYWx1ZSAtLT4KCjwhLS0gZHRsOmJsb2NrOlhNTFJvd0FkZENvbnRlbnQgLS0+CiAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCAkRGF0YXsiQ2xhc3MifSBmb3I9IiRRRGF0YXsiSXRlbUlEIn0iPiRUZXh0eyIkRGF0YXsiTmFtZSJ9In06IDwvbGFiZWw+CiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9IkZpZWxkIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9IkRpc2FibGVWYWxpZGF0aW9uIEFkZCIgaWQ9IiRRRGF0YXsiSXRlbUlEIn0iIHR5cGU9InN1Ym1pdCIgbmFtZT0iJFFEYXRheyJJbnB1dEtleSJ9OjpBZGQiIHZhbHVlPSIkVGV4dHsiQWRkIn0iIHRpdGxlPSIkVGV4dHsiJERhdGF7IkRlc2NyaXB0aW9uIn0ifSIgPjwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KPCEtLSBkdGw6YmxvY2s6WE1MUm93QWRkQ29udGVudCAtLT4KCjwhLS0gZHRsOmJsb2NrOlhNTFJvd0ZpZWxkc2V0RW5kIC0tPgogICAgICAgICAgICAgICAgICAgIDwvZmllbGRzZXQ+CjwhLS0gZHRsOmJsb2NrOlhNTFJvd0ZpZWxkc2V0RW5kIC0tPgo8IS0tIGR0bDpibG9jazpYTUxSb3cgLS0+CiAgICAgICAgICAgICAgICAgICAgPGZpZWxkc2V0IGNsYXNzPSJUYWJsZUxpa2UiPgogICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJGaWVsZCBTcGFjaW5nVG9wIj4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gbmFtZT0iU3VibWl0U2F2ZSIgY2xhc3M9IlByaW1hcnkiIHR5cGU9InN1Ym1pdCIgdmFsdWU9IiRUZXh0eyJTYXZlIn0iPiRUZXh0eyJTdWJtaXQifTwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgICAgICA8L2ZpZWxkc2V0PgogICAgICAgICAgICAgICAgPC9kaXY+Cgo8IS0tIGR0bDpibG9jazpFbmRTbWFsbCAtLT4KICAgICAgICAgICAgPC9kaXY+CjwhLS0gZHRsOmJsb2NrOkVuZFNtYWxsIC0tPgogICAgICAgIDwvZm9ybT4KPCEtLSBkdGw6YmxvY2s6RW5kTm9ybWFsIC0tPgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJDbGVhciI+PC9kaXY+CjwvZGl2Pgo8IS0tIGR0bDpibG9jazpFbmROb3JtYWwgLS0+CgoKPCEtLSBkdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUgLS0+CiAgICAgICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICAgICAgICAgICQoJy5EaXNhYmxlVmFsaWRhdGlvbicpLmJpbmQoJ2NsaWNrJywgZnVuY3Rpb24gKEV2ZW50KSB7CiAgICAgICAgICAgICAgICBDb3JlLkZvcm0uVmFsaWRhdGUuRGlzYWJsZVZhbGlkYXRpb24oJCgnI0NsYXNzSXRlbScpKTsKICAgICAgICAgICAgICAgIC8vIGZpeCBmb3IgU2FmYXJpOiByYWNlIGNvbmRpdGlvbiB3aXRoIHN1Ym1pdCBpbiBDb3JlLkZvcm0uVmFsaWRhdGUuanMKICAgICAgICAgICAgICAgIC8vIGZpeGVkIGluIE9UUlMgMy4wLjUsIHRoaXMgbGluZSByZW1haW5zIGhlcmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IHJlYXNvbnMKICAgICAgICAgICAgICAgICQoJyNDbGFzc0l0ZW0nKS5yZW1vdmVDbGFzcygnUHJldmVudE11bHRpcGxlU3VibWl0cycpOwogICAgICAgICAgICB9KTsKICAgICAgICAvL11dPjwvc2NyaXB0Pgo8IS0tIGR0bDpqc19vbl9kb2N1bWVudF9jb21wbGV0ZSAtLT4K IyEvdXNyL2Jpbi9wZXJsIC13CiMgLS0KIyBiaW4vb3Rycy5DaGVja01vZHVsZXNDSUF0dHJpYnV0ZUNvbGxlY3Rpb24ucGwgLSB0byBjaGVjayBuZWVkZWQgY3BhbiBmcmFtZXdvcmsgbW9kdWxlcwojIENvcHlyaWdodCAoQykgMjAwNi0yMDExIGMuYS5wLmUgSVQgR21iSCwgaHR0cDovL3d3dy5jYXBlLWl0LmRlLwojIC0tCiMgJElkOiBvdHJzLkNoZWNrTW9kdWxlc0NJQXR0cmlidXRlQ29sbGVjdGlvbi5wbCx2IDEuMyAyMDExLTA3LTI1IDA5OjAxOjMzIHNtZWhsaWcgRXhwICQKIyAtLQojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiMgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgQUZGRVJPIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiMgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKIyBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAojIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiMKIyBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKIyBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKIyBvciBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgojIHVzZSAuLi8gYXMgbGliIGxvY2F0aW9uCnVzZSBGaWxlOjpCYXNlbmFtZTsKdXNlIEZpbmRCaW4gcXcoJFJlYWxCaW4pOwp1c2UgbGliIGRpcm5hbWUoJFJlYWxCaW4pOwp1c2UgbGliIGRpcm5hbWUoJFJlYWxCaW4pIC4gJy9LZXJuZWwvY3Bhbi1saWInOwoKIyBjb25maWcKbXkgQE5lZWRlZE1vZHVsZXMgPSAoCiAgICB7CiAgICAgICAgTW9kdWxlICAgPT4gJ0RpZ2VzdDo6TUQ1JywKICAgICAgICBSZXF1aXJlZCA9PiAxLAogICAgfSwKICAgIHsKICAgICAgICBNb2R1bGUgICA9PiAnRW5jb2RlJywKICAgICAgICBSZXF1aXJlZCA9PiAxLAogICAgfSwKKTsKCiMgdHJ5IHRvIGxvYWQgbW9kdWxlcwpteSAkRGVwZW5kcyA9IDA7CmZvcmVhY2ggbXkgJE1vZHVsZSAoQE5lZWRlZE1vZHVsZXMpIHsKICAgIF9DaGVjayggJE1vZHVsZSwgJERlcGVuZHMgKTsKfQpleGl0OwoKc3ViIF9DaGVjayB7CiAgICBteSAoICRNb2R1bGUsICREZXBlbmRzICkgPSBAXzsKCiAgICBmb3IgKCAwIC4uICREZXBlbmRzICkgewogICAgICAgIHByaW50ICIgICAiOwogICAgfQogICAgcHJpbnQgIm8gJE1vZHVsZS0+e01vZHVsZX0iOwogICAgbXkgJExlbmd0aCA9IGxlbmd0aCggJE1vZHVsZS0+e01vZHVsZX0gKSArICggJERlcGVuZHMgKiAzICk7CiAgICBmb3IgKCAkTGVuZ3RoIC4uIDMwICkgewogICAgICAgIHByaW50ICIuIjsKICAgIH0KICAgIGlmICggZXZhbCAicmVxdWlyZSAkTW9kdWxlLT57TW9kdWxlfSIgKSB7CgogICAgICAgICMgc29tZSBzdHJhbmdlIENQQU4gbW9kdWxlIGRvIG5vdCBleHBvcnQgVkVSU0lPTgogICAgICAgIG15ICRWZXJzaW9uID0gZXZhbCAiXCQkTW9kdWxlLT57TW9kdWxlfTo6VmVyc2lvbjo6VkVSU0lPTiI7CgogICAgICAgICMgYXNrIGZvciBDUEFOIG1vZHVsZSBWRVJTSU9OCiAgICAgICAgaWYgKCAhJFZlcnNpb24gKSB7CiAgICAgICAgICAgICRWZXJzaW9uID0gZXZhbCAiXCQkTW9kdWxlLT57TW9kdWxlfTo6VkVSU0lPTiI7CiAgICAgICAgfQoKICAgICAgICAjIGNsZWFudXAgdmVyc2lvbiBudW1iZXIKICAgICAgICBteSAkQ2xlYW5lZFZlcnNpb24gPSBfVmVyc2lvbkNsZWFuKAogICAgICAgICAgICBWZXJzaW9uID0+ICRWZXJzaW9uLAogICAgICAgICk7CgogICAgICAgIGlmICggJE1vZHVsZS0+e05vdFN1cHBvcnRlZH0gKSB7CgogICAgICAgICAgICBteSAkTm90U3VwcG9ydGVkID0gMDsKICAgICAgICAgICAgSVRFTToKICAgICAgICAgICAgZm9yIG15ICRJdGVtICggQHsgJE1vZHVsZS0+e05vdFN1cHBvcnRlZH0gfSApIHsKCiAgICAgICAgICAgICAgICAjIGNsZWFudXAgaXRlbSB2ZXJzaW9uIG51bWJlcgogICAgICAgICAgICAgICAgbXkgJEl0ZW1WZXJzaW9uID0gX1ZlcnNpb25DbGVhbigKICAgICAgICAgICAgICAgICAgICBWZXJzaW9uID0+ICRJdGVtLT57VmVyc2lvbn0sCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIGlmICggJENsZWFuZWRWZXJzaW9uID09ICRJdGVtVmVyc2lvbiApIHsKICAgICAgICAgICAgICAgICAgICAkTm90U3VwcG9ydGVkID0gJEl0ZW0tPntDb21tZW50fTsKICAgICAgICAgICAgICAgICAgICBsYXN0IElURU07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgkTm90U3VwcG9ydGVkKSB7CiAgICAgICAgICAgICAgICBwcmludCAiZmFpbGVkISEhIFZlcnNpb24gJFZlcnNpb24gbm90IHN1cHBvcnRlZCEgJE5vdFN1cHBvcnRlZFxuIjsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCAkTW9kdWxlLT57VmVyc2lvbn0gKSB7CgogICAgICAgICAgICAjIGNsZWFudXAgaXRlbSB2ZXJzaW9uIG51bWJlcgogICAgICAgICAgICBteSAkTW9kdWxlVmVyc2lvbiA9IF9WZXJzaW9uQ2xlYW4oCiAgICAgICAgICAgICAgICBWZXJzaW9uID0+ICRNb2R1bGUtPntWZXJzaW9ufSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggJENsZWFuZWRWZXJzaW9uID49ICRNb2R1bGVWZXJzaW9uICkgewogICAgICAgICAgICAgICAgcHJpbnQgIm9rICh2JFZlcnNpb24pXG4iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcHJpbnQKICAgICAgICAgICAgICAgICAgICAiZmFpbGVkISEhIFZlcnNpb24gJFZlcnNpb24gaW5zdGFsbGVkIGJ1dCAkTW9kdWxlLT57VmVyc2lvbn0gb3IgaGlnaGVyIGlzIHJlcXVpcmVkIVxuIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcHJpbnQgIm9rICh2JFZlcnNpb24pXG4iOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgIG15ICRDb21tZW50ID0gJE1vZHVsZS0+e0NvbW1lbnR9IHx8ICcnOwogICAgICAgIG15ICRSZXF1aXJlZCA9ICRNb2R1bGUtPntSZXF1aXJlZH07CiAgICAgICAgaWYgKCRSZXF1aXJlZCkgewogICAgICAgICAgICAkUmVxdWlyZWQgPSAnUmVxdWlyZWQgLSB1c2UgInBlcmwgLU1DUEFOIC1lIHNoZWxsOyInOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgJFJlcXVpcmVkID0gJ09wdGlvbmFsJzsKICAgICAgICB9CiAgICAgICAgcHJpbnQgIk5vdCBpbnN0YWxsZWQhICgkUmVxdWlyZWQgLSAkQ29tbWVudClcbiI7CiAgICB9CgogICAgaWYgKCAkTW9kdWxlLT57RGVwZW5kc30gKSB7CiAgICAgICAgZm9yIG15ICRNb2R1bGVTdWIgKCBAeyAkTW9kdWxlLT57RGVwZW5kc30gfSApIHsKICAgICAgICAgICAgX0NoZWNrKCAkTW9kdWxlU3ViLCAkRGVwZW5kcyArIDEgKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIDE7Cn0KCnN1YiBfVmVyc2lvbkNsZWFuIHsKICAgIG15ICglUGFyYW0pID0gQF87CgogICAgcmV0dXJuIDAgaWYgISRQYXJhbXtWZXJzaW9ufTsKCiAgICAjIHJlcGxhY2UgYWxsIHNwZWNpYWwgY2hhcmFjdGVycyB3aXRoIGFuIGRvdAogICAgJFBhcmFte1ZlcnNpb259ID1+IHN7IFtfLV0gfXsufXhtc2c7CgogICAgbXkgQFZlcnNpb25QYXJ0cyA9IHNwbGl0IHF7XC59LCAkUGFyYW17VmVyc2lvbn07CgogICAgbXkgJENsZWFuZWRWZXJzaW9uID0gJyc7CiAgICBmb3IgbXkgJENvdW50ICggMCAuLiA0ICkgewogICAgICAgICRWZXJzaW9uUGFydHNbJENvdW50XSB8fD0gMDsKICAgICAgICAkQ2xlYW5lZFZlcnNpb24gLj0gc3ByaW50ZiAiJTA0ZCIsICRWZXJzaW9uUGFydHNbJENvdW50XTsKICAgIH0KCiAgICByZXR1cm4gaW50ICRDbGVhbmVkVmVyc2lvbjsKfQoK IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50Q0lDbGFzc1NlYXJjaC5wbSAtIGEgbW9kdWxlIHVzZWQgZm9yIHRoZSBhdXRvY29tcGxldGUgZmVhdHVyZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRDSUNsYXNzU2VhcmNoLnBtLHYgMS4yIDIwMTEtMDQtMTggMDc6NTQ6MDYgdHRvIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRDSUNsYXNzU2VhcmNoOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZzsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMiAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgYWxsIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgKHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IFRpY2tldE9iamVjdCBMYXlvdXRPYmplY3QgQ29uZmlnT2JqZWN0IExvZ09iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJF8hIiApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBuZWVkZWQgb2JqZWN0cwogICAgJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fSAgICAgPSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW0tPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57R2VuZXJhbENhdGFsb2dPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkdlbmVyYWxDYXRhbG9nLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJEpTT04gPSAnJzsKCiAgICAjIGdldCBuZWVkZWQgcGFyYW1zCiAgICBteSAkU2VhcmNoICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1Rlcm0nICkgICAgfHwgJyc7CiAgICBteSAkQ2xhc3NJRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0NsYXNzSUQnICkgfHwgMDsKCiAgICAjIHdvcmthcm91bmQsIGFsbCBhdXRvIGNvbXBsZXRpb24gcmVxdWVzdHMgZ2V0IHBvc3RlZCBieSB1dGY4IGFueXdheQogICAgIyBjb252ZXJ0IGFueSB0byA4Yml0IHN0cmluZyBpZiBhcHBsaWNhdGlvbiBpcyBub3QgcnVubmluZyBpbiB1dGY4CiAgICBpZiAoICEkU2VsZi0+e0VuY29kZU9iamVjdH0tPkVuY29kZUludGVybmFsVXNlZCgpICkgewogICAgICAgICRTZWFyY2ggPSAkU2VsZi0+e0VuY29kZU9iamVjdH0tPkNvbnZlcnQoCiAgICAgICAgICAgIFRleHQgPT4gJFNlYXJjaCwKICAgICAgICAgICAgRnJvbSA9PiAndXRmLTgnLAogICAgICAgICAgICBUbyAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e1VzZXJDaGFyc2V0fSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IGNpIENsYXNzIGxpc3QKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBzZWFyY2ggZm9yIG5hbWUuLi4uCiAgICBteSBARGF0YTsKICAgIG15ICRDSVNlYXJjaExpc3RSZWYgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5Db25maWdJdGVtU2VhcmNoRXh0ZW5kZWQoCiAgICAgICAgTmFtZSAgICAgPT4gJyonIC4gJFNlYXJjaCAuICcqJywKICAgICAgICBDbGFzc0lEcyA9PiBbJENsYXNzSURdLAogICAgKTsKICAgIG15ICVGb3VuZENJSGFzaCA9ICgpOwoKICAgICMgYnVpbGQgZGF0YQogICAgZm9yIG15ICRTZWFyY2hSZXN1bHQgKCBAeyRDSVNlYXJjaExpc3RSZWZ9ICkgewogICAgICAgIG15ICRDdXJyVmVyc2lvbkRhdGEgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5WZXJzaW9uR2V0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJFNlYXJjaFJlc3VsdCwKICAgICAgICAgICAgWE1MRGF0YUdldCAgID0+IDAsCiAgICAgICAgKTsKICAgICAgICBpZiAoCiAgICAgICAgICAgICRDdXJyVmVyc2lvbkRhdGEKICAgICAgICAgICAgJiYKICAgICAgICAgICAgKCByZWYoJEN1cnJWZXJzaW9uRGF0YSkgZXEgJ0hBU0gnICkgJiYKICAgICAgICAgICAgJEN1cnJWZXJzaW9uRGF0YS0+e05hbWV9ICYmCiAgICAgICAgICAgICRDdXJyVmVyc2lvbkRhdGEtPntOdW1iZXJ9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgIHB1c2ggQERhdGEsIHsKICAgICAgICAgICAgICAgIENJQ2xhc3NLZXkgICA9PiAkU2VhcmNoUmVzdWx0LAogICAgICAgICAgICAgICAgQ0lDbGFzc1ZhbHVlID0+ICRDdXJyVmVyc2lvbkRhdGEtPntOYW1lfSAuICcgKCcgLiAkQ3VyclZlcnNpb25EYXRhLT57TnVtYmVyfSAuICcpJywKICAgICAgICAgICAgfTsKCiAgICAgICAgICAgICRGb3VuZENJSGFzaHskU2VhcmNoUmVzdWx0fSA9IDE7CgogICAgICAgICAgICAjJENJU2VhcmNoTGlzdHskU2VhcmNoUmVzdWx0fSA9ICRDdXJyVmVyc2lvbkRhdGEtPntOdW1iZXJ9CiAgICAgICAgICAgICMuICIgKCIKICAgICAgICAgICAgIy4gJEN1cnJWZXJzaW9uRGF0YS0+e05hbWV9CiAgICAgICAgICAgICMuICIpIjsKICAgICAgICB9CiAgICB9CgogICAgIyBzZWFyY2ggZm9yIG51bWJlci4uLi4KICAgICRDSVNlYXJjaExpc3RSZWYgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5Db25maWdJdGVtU2VhcmNoRXh0ZW5kZWQoCiAgICAgICAgTnVtYmVyICAgPT4gJyonIC4gJFNlYXJjaCAuICcqJywKICAgICAgICBDbGFzc0lEcyA9PiBbJENsYXNzSURdLAogICAgKTsKCiAgICBmb3IgbXkgJFNlYXJjaFJlc3VsdCAoIEB7JENJU2VhcmNoTGlzdFJlZn0gKSB7CgogICAgICAgICMgcHJldmVudCBkb3VibGUgaGl0cy4uLgogICAgICAgIG5leHQgaWYgKCAkRm91bmRDSUhhc2h7JFNlYXJjaFJlc3VsdH0gKTsKCiAgICAgICAgbXkgJEN1cnJWZXJzaW9uRGF0YSA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPlZlcnNpb25HZXQoCiAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkU2VhcmNoUmVzdWx0LAogICAgICAgICAgICBYTUxEYXRhR2V0ICAgPT4gMCwKICAgICAgICApOwogICAgICAgIGlmICgKICAgICAgICAgICAgJEN1cnJWZXJzaW9uRGF0YQogICAgICAgICAgICAmJgogICAgICAgICAgICAoIHJlZigkQ3VyclZlcnNpb25EYXRhKSBlcSAnSEFTSCcgKSAmJgogICAgICAgICAgICAkQ3VyclZlcnNpb25EYXRhLT57TmFtZX0gJiYKICAgICAgICAgICAgJEN1cnJWZXJzaW9uRGF0YS0+e051bWJlcn0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgcHVzaCBARGF0YSwgewogICAgICAgICAgICAgICAgQ0lDbGFzc0tleSAgID0+ICRTZWFyY2hSZXN1bHQsCiAgICAgICAgICAgICAgICBDSUNsYXNzVmFsdWUgPT4gJEN1cnJWZXJzaW9uRGF0YS0+e05hbWV9IC4gJyAoJyAuICRDdXJyVmVyc2lvbkRhdGEtPntOdW1iZXJ9IC4gJyknLAogICAgICAgICAgICB9OwoKICAgICAgICAgICAgJEZvdW5kQ0lIYXNoeyRTZWFyY2hSZXN1bHR9ID0gMTsKCiAgICAgICAgICAgICMkQ0lTZWFyY2hMaXN0eyRTZWFyY2hSZXN1bHR9ID0gJEN1cnJWZXJzaW9uRGF0YS0+e051bWJlcn0KICAgICAgICAgICAgIy4gIiAoIgogICAgICAgICAgICAjLiAkQ3VyclZlcnNpb25EYXRhLT57TmFtZX0KICAgICAgICAgICAgIy4gIikiOwogICAgICAgIH0KICAgIH0KCiAgICAjIGJ1aWxkIEpTT04gb3V0cHV0CiAgICAkSlNPTiA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SlNPTkVuY29kZSgKICAgICAgICBEYXRhID0+IFxARGF0YSwKICAgICk7CgogICAgIyBzZW5kIEpTT04gcmVzcG9uc2UKICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0NoYXJzZXR9LAogICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OIHx8ICcnLAogICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICApOwoKfQoKMTsK IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50UXVldWVTZWFyY2gucG0gLSBhIG1vZHVsZSB1c2VkIGZvciB0aGUgYXV0b2NvbXBsZXRlIGZlYXR1cmUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50UXVldWVTZWFyY2gucG0sdiAxLjIgMjAxMS0wNC0xOCAwNzo1NDowNiB0dG8gRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFF1ZXVlU2VhcmNoOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpRdWV1ZTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMiAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0geyVQYXJhbX07CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBhbGwgbmVlZGVkIG9iamVjdHMKICAgIGZvciAocXcoUGFyYW1PYmplY3QgREJPYmplY3QgVGlja2V0T2JqZWN0IExheW91dE9iamVjdCBDb25maWdPYmplY3QgTG9nT2JqZWN0KSkgewogICAgICAgIGlmICggISRTZWxmLT57JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkZhdGFsRXJyb3IoIE1lc3NhZ2UgPT4gIkdvdCBubyAkXyEiICk7CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIG5lZWRlZCBvYmplY3RzCiAgICAkU2VsZi0+e1F1ZXVlVXNlck9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6UXVldWUtPm5ldyglUGFyYW0pOwoKICAgICNnZXQgY29uZmlnCiAgICAjJFNlbGYtPntDb25maWd9ID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoIlRpY2tldDo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRKU09OID0gJyc7CgogICAgIyBnZXQgbmVlZGVkIHBhcmFtcwogICAgbXkgJFNlYXJjaCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1Rlcm0nICkgfHwgJyc7CgogICAgIyB3b3JrYXJvdW5kLCBhbGwgYXV0byBjb21wbGV0aW9uIHJlcXVlc3RzIGdldCBwb3N0ZWQgYnkgdXRmOCBhbnl3YXkKICAgICMgY29udmVydCBhbnkgdG8gOGJpdCBzdHJpbmcgaWYgYXBwbGljYXRpb24gaXMgbm90IHJ1bm5pbmcgaW4gdXRmOAogICAgaWYgKCAhJFNlbGYtPntFbmNvZGVPYmplY3R9LT5FbmNvZGVJbnRlcm5hbFVzZWQoKSApIHsKICAgICAgICAkU2VhcmNoID0gJFNlbGYtPntFbmNvZGVPYmplY3R9LT5Db252ZXJ0KAogICAgICAgICAgICBUZXh0ID0+ICRTZWFyY2gsCiAgICAgICAgICAgIEZyb20gPT4gJ3V0Zi04JywKICAgICAgICAgICAgVG8gICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntVc2VyQ2hhcnNldH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAkU2VhcmNoID1+IHMvXF8vXC4vZzsKICAgICRTZWFyY2ggPX4gcy9cJS9cLlwqL2c7CiAgICAkU2VhcmNoID1+IHMvXCovXC5cKi9nOwoKICAgICMgZ2V0IHF1ZXVlIGxpc3QKICAgICMgc2VhcmNoIGZvciBuYW1lLi4uLgogICAgbXkgJVF1ZXVlcyA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5RdWV1ZUxpc3QoCiAgICAgICAgVmFsaWQgICA9PiAxLAogICAgKTsKCiAgICAjIGJ1aWxkIGRhdGEKICAgIG15IEBEYXRhOwogICAgZm9yIG15ICRRdWV1ZUlEIChrZXlzICVRdWV1ZXMpIHsKICAgICAgICBpZiAoICRRdWV1ZXN7JFF1ZXVlSUR9ID1+IC8kU2VhcmNoL2kgKSB7CiAgICAgICAgICAgIHB1c2ggQERhdGEsIHsKICAgICAgICAgICAgICAgIFF1ZXVlS2V5ICAgPT4gJFF1ZXVlSUQsCiAgICAgICAgICAgICAgICBRdWV1ZVZhbHVlID0+ICRRdWV1ZXN7JFF1ZXVlSUR9LAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KCiAgICAjIGJ1aWxkIEpTT04gb3V0cHV0CiAgICAkSlNPTiA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SlNPTkVuY29kZSgKICAgICAgICBEYXRhID0+IFxARGF0YSwKICAgICk7CgogICAgIyBzZW5kIEpTT04gcmVzcG9uc2UKICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0NoYXJzZXR9LAogICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OIHx8ICcnLAogICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICApOwoKfQoKMTsK IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50U2VydmljZVNlYXJjaC5wbSAtIGEgbW9kdWxlIHVzZWQgZm9yIHRoZSBhdXRvY29tcGxldGUgZmVhdHVyZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRTZXJ2aWNlU2VhcmNoLnBtLHYgMS4xIDIwMTEtMDItMjIgMDk6NTQ6MzEgZm9iZXIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFNlcnZpY2VTZWFyY2g7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlNlcnZpY2U7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgYWxsIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgKHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IFRpY2tldE9iamVjdCBMYXlvdXRPYmplY3QgQ29uZmlnT2JqZWN0IExvZ09iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJF8hIiApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBuZWVkZWQgb2JqZWN0cwogICAgJFNlbGYtPntTZXJ2aWNlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJEpTT04gPSAnJzsKCiAgICAjIGdldCBuZWVkZWQgcGFyYW1zCiAgICBteSAkU2VhcmNoID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVGVybScgKSB8fCAnJzsKCiAgICAjIHdvcmthcm91bmQsIGFsbCBhdXRvIGNvbXBsZXRpb24gcmVxdWVzdHMgZ2V0IHBvc3RlZCBieSB1dGY4IGFueXdheQogICAgIyBjb252ZXJ0IGFueSB0byA4Yml0IHN0cmluZyBpZiBhcHBsaWNhdGlvbiBpcyBub3QgcnVubmluZyBpbiB1dGY4CiAgICBpZiAoICEkU2VsZi0+e0VuY29kZU9iamVjdH0tPkVuY29kZUludGVybmFsVXNlZCgpICkgewogICAgICAgICRTZWFyY2ggPSAkU2VsZi0+e0VuY29kZU9iamVjdH0tPkNvbnZlcnQoCiAgICAgICAgICAgIFRleHQgPT4gJFNlYXJjaCwKICAgICAgICAgICAgRnJvbSA9PiAndXRmLTgnLAogICAgICAgICAgICBUbyAgID0+ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e1VzZXJDaGFyc2V0fSwKICAgICAgICApOwogICAgfQoKICAgICMgZ2V0IHF1ZXVlIGxpc3QKICAgICMgc2VhcmNoIGZvciBuYW1lLi4uLgogICAgbXkgQFNlcnZpY2VJRHMgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlU2VhcmNoKAogICAgICAgIE5hbWUgICA9PiAnKicgLiAkU2VhcmNoIC4gJyonLAogICAgICAgIFVzZXJJRCA9PiAxLAogICAgKTsKCiAgICAjIGJ1aWxkIGRhdGEKICAgIG15IEBEYXRhOwogICAgZm9yIG15ICRDdXJyS2V5IChAU2VydmljZUlEcykgewogICAgICAgIG15ICVTZXJ2aWNlRGF0YSA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VHZXQoCiAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkQ3VycktleSwKICAgICAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICAgICAgKTsKICAgICAgICBuZXh0IGlmICggISVTZXJ2aWNlRGF0YSApOwogICAgICAgIHB1c2ggQERhdGEsIHsKICAgICAgICAgICAgU2VydmljZUtleSAgID0+ICRDdXJyS2V5LAogICAgICAgICAgICBTZXJ2aWNlVmFsdWUgPT4gJFNlcnZpY2VEYXRhe05hbWV9LAogICAgICAgIH07CiAgICB9CgogICAgIyBidWlsZCBKU09OIG91dHB1dAogICAgJEpTT04gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkpTT05FbmNvZGUoCiAgICAgICAgRGF0YSA9PiBcQERhdGEsCiAgICApOwoKICAgICMgc2VuZCBKU09OIHJlc3BvbnNlCiAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KAogICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntDaGFyc2V0fSwKICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiB8fCAnJywKICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgKTsKCn0KCjE7Cg== IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50QXR0YWNobWVudFN0b3JhZ2UucG0gLSB0byBnZXQgdGhlIGF0dGFjaG1lbnRzCiMgQ29weXJpZ2h0IChDKSAyMDA2LTIwMTEgYy5hLnAuZS4gSVQgR21iSCwgaHR0cDovL3d3dy5jYXBlLWl0LmRlCiMKIyB3cml0dGVuL2VkaXRlZCBieToKIyAqIFRvcnN0ZW4oZG90KVRoYXUoYXQpY2FwZS1pdChkb3QpZGUKIyAqIEFubmEoZG90KUxpdHZpbm92YShhdCljYXBlLWl0KGRvdClkZQojIC0tCiMgJElkOiBBZ2VudEF0dGFjaG1lbnRTdG9yYWdlLnBtLHYgMS40IDIwMTEtMDctMjUgMDk6MDE6MzMgc21laGxpZyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudEF0dGFjaG1lbnRTdG9yYWdlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpDSUF0dGFjaG1lbnRTdG9yYWdlOjpBdHRhY2htZW50U3RvcmFnZTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNCAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpNb2R1bGVzOjpBZ2VudEF0dGFjaG1lbnRTdG9yYWdlIC0gZnJvbnRlbmQgbW9kdWxlIGZvciBhY2Nlc3MgdG8gYXR0YWNobWVudHMKCj1oZWFkMSBTWU5PUFNJUwoKQSBmcm9udGVuZCBtb2R1bGUgd2hpY2ggcHJvdmlkZXMgc3lzdGVtIHVzZXJzIGFjY2VzcyB0byBzdG9yZWQgYXR0YWNobWVudHMuCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGEgb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpDSUF0dGFjaG1lbnRTdG9yYWdlOjpBdHRhY2htZW50U3RvcmFnZTsKCiAgICBteSAkQXR0YWNobWVudFN0b3JhZ2VPYmplY3QgPSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50QXR0YWNobWVudFN0b3JhZ2UtPm5ldygKICAgICAgICBQYXJhbU9iamVjdCAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICA9PiAkREJPYmplY3QsCiAgICAgICAgTGF5b3V0T2JqZWN0ICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgPT4gJExvZ09iamVjdCwKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIGZvcmVhY2ggKCBrZXlzICVQYXJhbSApIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX307CiAgICB9CgogICAgI2NoZWNrIHJlcXVpcmVkIG9iamVjdHMuLi4KICAgIGZvcmVhY2ggKHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBMb2dPYmplY3QgQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJF8hIiApOwogICAgICAgIH0KICAgIH0KCiAgICAkU2VsZi0+e0F0dGFjaG1lbnRTdG9yYWdlT2JqZWN0fSA9CiAgICAgICAgS2VybmVsOjpTeXN0ZW06OkNJQXR0YWNobWVudFN0b3JhZ2U6OkF0dGFjaG1lbnRTdG9yYWdlLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgI2dldCBBdHRhY2htZW50RGlyZWN0b3J5SUQuLi4KICAgICRTZWxmLT57QXR0YWNobWVudERpcmVjdG9yeUlEfSA9CiAgICAgICAgJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQXR0YWNobWVudERpcmVjdG9yeUlEJyApOwogICAgJFNlbGYtPntWaWV3ZXJ9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVmlld2VyJyApIHx8IDA7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSAkT3V0cHV0ICA9ICcnOwogICAgbXkgJEFsbG93ZWQgPSAxOwoKICAgICNjaGVjayBwYXJhbXMuLi4KICAgIGlmICggISRTZWxmLT57QXR0YWNobWVudERpcmVjdG9yeUlEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0F0dGFjaG1lbnREaXJlY3RvcnlJRCBpcyBuZWVkZWQhJywKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICApOwogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICB9CgogICAgI2dldCB0aGUgYXR0YWNobWVudC4uLgogICAgbXkgJUF0dGFjaG1lbnREYXRhID0gJXsKICAgICAgICAkU2VsZi0+e0F0dGFjaG1lbnRTdG9yYWdlT2JqZWN0fS0+QXR0YWNobWVudFN0b3JhZ2VHZXQoCiAgICAgICAgICAgIElEID0+ICRTZWxmLT57QXR0YWNobWVudERpcmVjdG9yeUlEfSwKICAgICAgICAgICAgKQogICAgICAgIH07CgogICAgaWYgKCVBdHRhY2htZW50RGF0YSkgewogICAgICAgICRBdHRhY2htZW50RGF0YXtDb250ZW50fSAgICAgPSAkeyAkQXR0YWNobWVudERhdGF7Q29udGVudFJlZn0gfTsKICAgICAgICAkQXR0YWNobWVudERhdGF7RmlsZW5hbWV9ICAgID0gJEF0dGFjaG1lbnREYXRhe0ZpbGVOYW1lfTsKICAgICAgICAkQXR0YWNobWVudERhdGF7Q29udGVudFR5cGV9ID0gJEF0dGFjaG1lbnREYXRhe1ByZWZlcmVuY2VzfS0+e0RhdGFUeXBlfTsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KCVBdHRhY2htZW50RGF0YSk7CgogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBzdWNoIGF0dGFjaG1lbnQgaW4gZGlyZWN0b3J5IGluZGV4ICgkU2VsZi0+e0F0dGFjaG1lbnREaXJlY3RvcnlJRH0pISAiLAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgIH0KfQoKMTsK IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50Q3VzdG9tZXJDb21wYW55U2VhcmNoLnBtIC0gYSBtb2R1bGUgdXNlZCBmb3IgdGhlIGF1dG9jb21wbGV0ZSBmZWF0dXJlCiMgQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIC0tCiMgJElkOiBBZ2VudEN1c3RvbWVyQ29tcGFueVNlYXJjaC5wbSx2IDEuMSAyMDExLTAzLTI4IDE0OjU1OjE3IGZvYmVyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6TW9kdWxlczo6QWdlbnRDdXN0b21lckNvbXBhbnlTZWFyY2g7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQ29tcGFueTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMSAkKSBbMV07CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHslUGFyYW19OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgYWxsIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgKHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IFRpY2tldE9iamVjdCBMYXlvdXRPYmplY3QgQ29uZmlnT2JqZWN0IExvZ09iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJF8hIiApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBuZWVkZWQgb2JqZWN0cwogICAgJFNlbGYtPntDdXN0b21lckNvbXBhbnlPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQ29tcGFueS0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRKU09OID0gJyc7CgogICAgIyBnZXQgbmVlZGVkIHBhcmFtcwogICAgbXkgJFNlYXJjaCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ1Rlcm0nICkgfHwgJyc7CgogICAgIyB3b3JrYXJvdW5kLCBhbGwgYXV0byBjb21wbGV0aW9uIHJlcXVlc3RzIGdldCBwb3N0ZWQgYnkgdXRmOCBhbnl3YXkKICAgICMgY29udmVydCBhbnkgdG8gOGJpdCBzdHJpbmcgaWYgYXBwbGljYXRpb24gaXMgbm90IHJ1bm5pbmcgaW4gdXRmOAogICAgaWYgKCAhJFNlbGYtPntFbmNvZGVPYmplY3R9LT5FbmNvZGVJbnRlcm5hbFVzZWQoKSApIHsKICAgICAgICAkU2VhcmNoID0gJFNlbGYtPntFbmNvZGVPYmplY3R9LT5Db252ZXJ0KAogICAgICAgICAgICBUZXh0ID0+ICRTZWFyY2gsCiAgICAgICAgICAgIEZyb20gPT4gJ3V0Zi04JywKICAgICAgICAgICAgVG8gICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntVc2VyQ2hhcnNldH0sCiAgICAgICAgKTsKICAgIH0KCiAgICAjIGdldCBxdWV1ZSBsaXN0CiAgICAjIHNlYXJjaCBmb3IgbmFtZS4uLi4KICAgIG15ICVDdXN0b21lckNvbXBhbnlMaXN0ID0gJFNlbGYtPntDdXN0b21lckNvbXBhbnlPYmplY3R9LT5DdXN0b21lckNvbXBhbnlMaXN0KAogICAgICAgIFNlYXJjaCA9PiAnKicgLiAkU2VhcmNoIC4gJyonLAogICAgKTsKCiAgICAjIGJ1aWxkIGRhdGEKICAgIG15IEBEYXRhOwogICAgbXkgJEN1c3RDb21wYW55TWFwUmVmID0KICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTUNJQXR0cmlidXRlQ29sbGVjdGlvbjo6Q29tcGFueUJhY2tlbmRNYXBwaW5nJyk7CiAgICBmb3IgbXkgJEN1cnJLZXkgKCBrZXlzICVDdXN0b21lckNvbXBhbnlMaXN0ICkgewogICAgICAgIG15ICVDdXN0b21lckNvbXBhbnlTZWFyY2hMaXN0ID0gJFNlbGYtPntDdXN0b21lckNvbXBhbnlPYmplY3R9LT5DdXN0b21lckNvbXBhbnlHZXQoCiAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJEN1cnJLZXksCiAgICAgICAgKTsKICAgICAgICBteSAkU2VhcmNoID0gJEN1c3RvbWVyQ29tcGFueUxpc3R7JEN1cnJLZXl9OwoKICAgICAgICBteSAkQ3VzdG9tZXJDb21wYW55U3RyID0gJyc7CiAgICAgICAgaWYgKCAkQ3VzdENvbXBhbnlNYXBSZWYgJiYgcmVmKCRDdXN0Q29tcGFueU1hcFJlZikgZXEgJ0hBU0gnICkgewoKICAgICAgICAgICAgZm9yIG15ICRNYXBwaW5nRmllbGQgKCBzb3J0KCBrZXlzKCAleyRDdXN0Q29tcGFueU1hcFJlZn0gKSApICkgewogICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJDb21wYW55U2VhcmNoTGlzdHsgJEN1c3RDb21wYW55TWFwUmVmLT57JE1hcHBpbmdGaWVsZH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAkQ3VzdG9tZXJDb21wYW55U3RyIC49ICcgJwogICAgICAgICAgICAgICAgICAgICAgICAuICRDdXN0b21lckNvbXBhbnlTZWFyY2hMaXN0eyAkQ3VzdENvbXBhbnlNYXBSZWYtPnskTWFwcGluZ0ZpZWxkfSB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0KICAgICAgICAkQ3VzdG9tZXJDb21wYW55U3RyID1+IHMvXHMrJC8vZzsKICAgICAgICAkQ3VzdG9tZXJDb21wYW55U3RyID1+IHMvXlxzKy8vZzsKCiAgICAgICAgaWYgKCAkQ3VzdG9tZXJDb21wYW55U3RyIG5lICcnICkgewogICAgICAgICAgICAkU2VhcmNoID0gJEN1c3RvbWVyQ29tcGFueVN0cjsKICAgICAgICB9CgogICAgICAgIHB1c2ggQERhdGEsIHsKICAgICAgICAgICAgQ3VzdG9tZXJDb21wYW55S2V5ICAgPT4gJEN1cnJLZXksCiAgICAgICAgICAgIEN1c3RvbWVyQ29tcGFueVZhbHVlID0+ICRTZWFyY2gsCiAgICAgICAgfTsKICAgIH0KCiAgICAjIGJ1aWxkIEpTT04gb3V0cHV0CiAgICAkSlNPTiA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+SlNPTkVuY29kZSgKICAgICAgICBEYXRhID0+IFxARGF0YSwKICAgICk7CgogICAgIyBzZW5kIEpTT04gcmVzcG9uc2UKICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgQ29udGVudFR5cGUgPT4gJ2FwcGxpY2F0aW9uL2pzb247IGNoYXJzZXQ9JyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0NoYXJzZXR9LAogICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OIHx8ICcnLAogICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICApOwoKfQoKMTsK IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50Q3VzdG9tZXJVc2VyQ29tcGFueVNlYXJjaC5wbSAtIGEgbW9kdWxlIHVzZWQgZm9yIHRoZSBhdXRvY29tcGxldGUgZmVhdHVyZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDEwIE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyAtLQojICRJZDogQWdlbnRDdXN0b21lclVzZXJDb21wYW55U2VhcmNoLnBtLHYgMS4xIDIwMTEtMDMtMzAgMTM6MTI6NTcgZm9iZXIgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudEN1c3RvbWVyVXNlckNvbXBhbnlTZWFyY2g7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQ29tcGFueTsKdXNlIEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXI7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIGFsbCBuZWVkZWQgb2JqZWN0cwogICAgZm9yIChxdyhQYXJhbU9iamVjdCBEQk9iamVjdCBUaWNrZXRPYmplY3QgTGF5b3V0T2JqZWN0IENvbmZpZ09iamVjdCBMb2dPYmplY3QpKSB7CiAgICAgICAgaWYgKCAhJFNlbGYtPnskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRfISIgKTsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgbmVlZGVkIG9iamVjdHMKICAgICRTZWxmLT57Q3VzdG9tZXJDb21wYW55T2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lckNvbXBhbnktPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fSAgICA9IEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXItPm5ldyggJXskU2VsZn0gKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkSlNPTiA9ICcnOwoKICAgICMgZ2V0IG5lZWRlZCBwYXJhbXMKICAgIG15ICRTZWFyY2ggPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdUZXJtJyApIHx8ICcnOwoKICAgICMgd29ya2Fyb3VuZCwgYWxsIGF1dG8gY29tcGxldGlvbiByZXF1ZXN0cyBnZXQgcG9zdGVkIGJ5IHV0ZjggYW55d2F5CiAgICAjIGNvbnZlcnQgYW55IHRvIDhiaXQgc3RyaW5nIGlmIGFwcGxpY2F0aW9uIGlzIG5vdCBydW5uaW5nIGluIHV0ZjgKICAgIGlmICggISRTZWxmLT57RW5jb2RlT2JqZWN0fS0+RW5jb2RlSW50ZXJuYWxVc2VkKCkgKSB7CiAgICAgICAgJFNlYXJjaCA9ICRTZWxmLT57RW5jb2RlT2JqZWN0fS0+Q29udmVydCgKICAgICAgICAgICAgVGV4dCA9PiAkU2VhcmNoLAogICAgICAgICAgICBGcm9tID0+ICd1dGYtOCcsCiAgICAgICAgICAgIFRvICAgPT4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57VXNlckNoYXJzZXR9LAogICAgICAgICk7CiAgICB9CgogICAgIyBnZXQgcXVldWUgbGlzdAogICAgIyBzZWFyY2ggZm9yIG5hbWUuLi4uCiAgICAjbXkgJUN1c3RvbWVyQ29tcGFueUxpc3QgPSAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU9iamVjdH0tPkN1c3RvbWVyQ29tcGFueUxpc3QoCiAgICAjU2VhcmNoID0+ICcqJyAuICRTZWFyY2ggLiAnKicsCiAgICAjKTsKICAgIG15ICVTZWFyY2hGaWVsZHMgPSAoKTsKICAgICRTZWFyY2hGaWVsZHN7VXNlckN1c3RvbWVySUR9ID0gJFNlYXJjaDsKCiAgICAjIHN0YXJ0IHNlYXJjaAogICAgbXkgJUN1c3RvbWVyVXNlclNlYXJjaExpc3QgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyU2VhcmNoKAogICAgICAgIFNlYXJjaCA9PiAkU2VhcmNoLAogICAgKTsKCiAgICBteSAlQ3VzdG9tZXJDb21wYW55TGlzdDsKICAgIG15IEBDdXN0b21lcklEcyA9ICcnOwogICAgbXkgQEN1c3RvbWVySUQgID0gJyc7CiAgICBmb3IgbXkgJGtleXMgKCBrZXlzICVDdXN0b21lclVzZXJTZWFyY2hMaXN0ICkgewogICAgICAgIEBDdXN0b21lcklEcyA9ICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fS0+Q3VzdG9tZXJJRHMoCiAgICAgICAgICAgIFVzZXIgPT4gJGtleXMsCiAgICAgICAgKTsKCiAgICAgICAgJEN1c3RvbWVyQ29tcGFueUxpc3R7ICRDdXN0b21lcklEc1swXSB9ID0gJEN1c3RvbWVySURzWzBdOwogICAgfQoKICAgICMgYnVpbGQgZGF0YQogICAgbXkgQERhdGE7CiAgICBteSAkQ3VzdENvbXBhbnlNYXBSZWYgPQogICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdJVFNNQ0lBdHRyaWJ1dGVDb2xsZWN0aW9uOjpDb21wYW55QmFja2VuZE1hcHBpbmcnKTsKICAgIGZvciBteSAkQ3VycktleSAoIGtleXMgJUN1c3RvbWVyQ29tcGFueUxpc3QgKSB7CiAgICAgICAgbXkgJUN1c3RvbWVyQ29tcGFueVNlYXJjaExpc3QgPSAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU9iamVjdH0tPkN1c3RvbWVyQ29tcGFueUdldCgKICAgICAgICAgICAgQ3VzdG9tZXJJRCA9PiAkQ3VycktleSwKICAgICAgICApOwogICAgICAgIG15ICRTZWFyY2ggPSAkQ3VzdG9tZXJDb21wYW55TGlzdHskQ3VycktleX07CgogICAgICAgIG15ICRDdXN0b21lckNvbXBhbnlTdHIgPSAnJzsKICAgICAgICBpZiAoICRDdXN0Q29tcGFueU1hcFJlZiAmJiByZWYoJEN1c3RDb21wYW55TWFwUmVmKSBlcSAnSEFTSCcgKSB7CgogICAgICAgICAgICBmb3IgbXkgJE1hcHBpbmdGaWVsZCAoIHNvcnQoIGtleXMoICV7JEN1c3RDb21wYW55TWFwUmVmfSApICkgKSB7CiAgICAgICAgICAgICAgICBpZiAoICRDdXN0b21lckNvbXBhbnlTZWFyY2hMaXN0eyAkQ3VzdENvbXBhbnlNYXBSZWYtPnskTWFwcGluZ0ZpZWxkfSB9ICkgewogICAgICAgICAgICAgICAgICAgICRDdXN0b21lckNvbXBhbnlTdHIgLj0gJyAnCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJEN1c3RvbWVyQ29tcGFueVNlYXJjaExpc3R7ICRDdXN0Q29tcGFueU1hcFJlZi0+eyRNYXBwaW5nRmllbGR9IH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgfQogICAgICAgICRDdXN0b21lckNvbXBhbnlTdHIgPX4gcy9ccyskLy9nOwogICAgICAgICRDdXN0b21lckNvbXBhbnlTdHIgPX4gcy9eXHMrLy9nOwoKICAgICAgICBpZiAoICRDdXN0b21lckNvbXBhbnlTdHIgbmUgJycgKSB7CiAgICAgICAgICAgICRTZWFyY2ggPSAkQ3VzdG9tZXJDb21wYW55U3RyOwogICAgICAgIH0KCiAgICAgICAgcHVzaCBARGF0YSwgewogICAgICAgICAgICBDdXN0b21lclVzZXJDb21wYW55S2V5ICAgPT4gJEN1cnJLZXksCiAgICAgICAgICAgIEN1c3RvbWVyVXNlckNvbXBhbnlWYWx1ZSA9PiAkU2VhcmNoLAogICAgICAgIH07CiAgICB9CgogICAgIyBidWlsZCBKU09OIG91dHB1dAogICAgJEpTT04gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkpTT05FbmNvZGUoCiAgICAgICAgRGF0YSA9PiBcQERhdGEsCiAgICApOwoKICAgICMgc2VuZCBKU09OIHJlc3BvbnNlCiAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KAogICAgICAgIENvbnRlbnRUeXBlID0+ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PScgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntDaGFyc2V0fSwKICAgICAgICBDb250ZW50ICAgICA9PiAkSlNPTiB8fCAnJywKICAgICAgICBUeXBlICAgICAgICA9PiAnaW5saW5lJywKICAgICAgICBOb0NhY2hlICAgICA9PiAxLAogICAgKTsKCn0KCjE7Cg== IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50VXNlclNlYXJjaC5wbSAtIGEgbW9kdWxlIHVzZWQgZm9yIHRoZSBhdXRvY29tcGxldGUgZmVhdHVyZQojIG9yaWdpbmFsIEtlcm5lbC9Nb2R1bGVzL0FnZW50SVRTTVVzZXJTZWFyY2gucG0gLSBhIG1vZHVsZSB1c2VkIGZvciB0aGUgYXV0b2NvbXBsZXRlIGZlYXR1cmUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAxMCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgLS0KIyAkSWQ6IEFnZW50VXNlclNlYXJjaC5wbSx2IDEuMSAyMDExLTAzLTMwIDEzOjEyOjU3IGZvYmVyIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgojIElUU00tQ0lBdHRyaWJ1dGVDb2xsZWN0aW9uLWNhcGVJVAojcGFja2FnZSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50SVRTTVVzZXJTZWFyY2g7CnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudFVzZXJTZWFyY2g7CiMgRU8gSVRTTS1DSUF0dHJpYnV0ZUNvbGxlY3Rpb24tY2FwZUlUCgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7JVBhcmFtfTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIGFsbCBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKAogICAgICAgIHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBDb25maWdPYmplY3QgTG9nT2JqZWN0IFVzZXJPYmplY3QgR3JvdXBPYmplY3QpCiAgICAgICAgKQogICAgewogICAgICAgIGlmICggISRTZWxmLT57JE9iamVjdH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RmF0YWxFcnJvciggTWVzc2FnZSA9PiAiR290IG5vICRPYmplY3QhIiApOwogICAgICAgIH0KICAgIH0KCiAgICAjIGdldCBjb25maWcgZm9yIGZyb250ZW5kCiAgICAkU2VsZi0+e0NvbmZpZ30gPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgiSVRTTUNoYW5nZTo6RnJvbnRlbmQ6OiRTZWxmLT57QWN0aW9ufSIpOwoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRKU09OID0gJyc7CgogICAgIyBzZWFyY2ggdXNlcnMKICAgIGlmICggISRTZWxmLT57U3ViYWN0aW9ufSApIHsKCiAgICAgICAgIyBnZXQgbmVlZGVkIHBhcmFtcwogICAgICAgIG15ICRTZWFyY2ggPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICdUZXJtJyApICAgfHwgJyc7CiAgICAgICAgbXkgJEdyb3VwcyA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJ0dyb3VwcycgKSB8fCAnJzsKICAgICAgICBteSAkTWF4UmVzdWx0cyA9IGludCggJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnTWF4UmVzdWx0cycgKSB8fCAyMCApOwoKICAgICAgICAjIGdldCBhbGwgbWVtYmVycyBvZiB0aGUgZ3JvdXBzCiAgICAgICAgbXkgJUdyb3VwVXNlcnM7CiAgICAgICAgaWYgKCRHcm91cHMpIHsKICAgICAgICAgICAgbXkgQEdyb3VwTmFtZXMgPSBzcGxpdCAvLFxzKy8sICRHcm91cHM7CgogICAgICAgICAgICBHUk9VUE5BTUU6CiAgICAgICAgICAgIGZvciBteSAkR3JvdXBOYW1lIChAR3JvdXBOYW1lcykgewoKICAgICAgICAgICAgICAgICMgYWxsb3cgdHJhaWxpbmcgY29tbWEKICAgICAgICAgICAgICAgIG5leHQgR1JPVVBOQU1FIGlmICEkR3JvdXBOYW1lOwoKICAgICAgICAgICAgICAgIG15ICRHcm91cElEID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTG9va3VwKAogICAgICAgICAgICAgICAgICAgIEdyb3VwID0+ICRHcm91cE5hbWUsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG5leHQgR1JPVVBOQU1FIGlmICEkR3JvdXBJRDsKCiAgICAgICAgICAgICAgICAjIGdldCB1c2VycyBpbiBncm91cAogICAgICAgICAgICAgICAgbXkgJVVzZXJzID0gJFNlbGYtPntHcm91cE9iamVjdH0tPkdyb3VwTWVtYmVyTGlzdCgKICAgICAgICAgICAgICAgICAgICBHcm91cElEID0+ICRHcm91cElELAogICAgICAgICAgICAgICAgICAgIFR5cGUgICAgPT4gJ3JvJywKICAgICAgICAgICAgICAgICAgICBSZXN1bHQgID0+ICdIQVNIJywKICAgICAgICAgICAgICAgICAgICBDYWNoZWQgID0+IDEsCiAgICAgICAgICAgICAgICApOwoKICAgICAgICAgICAgICAgIG15IEBVc2VySURzID0ga2V5cyAlVXNlcnM7CiAgICAgICAgICAgICAgICBAR3JvdXBVc2Vyc3tAVXNlcklEc30gPSBAVXNlcklEczsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgIyB3b3JrYXJvdW5kLCBhbGwgYXV0byBjb21wbGV0aW9uIHJlcXVlc3RzIGdldCBwb3N0ZWQgYnkgdXRmOCBhbnl3YXkKICAgICAgICAjIGNvbnZlcnQgYW55IHRvIDhiaXQgc3RyaW5nIGlmIGFwcGxpY2F0aW9uIGlzIG5vdCBydW5uaW5nIGluIHV0ZjgKICAgICAgICBpZiAoICEkU2VsZi0+e0VuY29kZU9iamVjdH0tPkVuY29kZUludGVybmFsVXNlZCgpICkgewogICAgICAgICAgICAkU2VhcmNoID0gJFNlbGYtPntFbmNvZGVPYmplY3R9LT5Db252ZXJ0KAogICAgICAgICAgICAgICAgVGV4dCA9PiAkU2VhcmNoLAogICAgICAgICAgICAgICAgRnJvbSA9PiAndXRmLTgnLAogICAgICAgICAgICAgICAgVG8gICA9PiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntVc2VyQ2hhcnNldH0sCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAjIGdldCB1c2VyIGxpc3QKICAgICAgICBteSAlVXNlckxpc3QgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5Vc2VyU2VhcmNoKAogICAgICAgICAgICBTZWFyY2ggPT4gJFNlYXJjaCwKICAgICAgICAgICAgVmFsaWQgID0+IDEsCiAgICAgICAgKTsKCiAgICAgICAgbXkgJE1heFJlc3VsdENvdW50ID0gJE1heFJlc3VsdHM7CgogICAgICAgICMgdGhlIGRhdGEgdGhhdCB3aWxsIGJlIHNlbnQgYXMgcmVzcG9uc2UKICAgICAgICBteSBARGF0YTsKCiAgICAgICAgVVNFUklEOgogICAgICAgIGZvciBteSAkVXNlcklEICggc29ydCB7ICRVc2VyTGlzdHskYX0gY21wICRVc2VyTGlzdHskYn0gfSBrZXlzICVVc2VyTGlzdCApIHsKCiAgICAgICAgICAgICMgaWYgZ3JvdXBzIGFyZSByZXF1aXJlZCBhbmQgdXNlciBpcyBub3QgbWVtYmVyIG9mIG9uZSBvZiB0aGUgZ3JvdXBzCiAgICAgICAgICAgICMgdGhlbiBza2lwIHRoZSB1c2VyCiAgICAgICAgICAgIGlmICggJEdyb3VwcyAmJiAhJEdyb3VwVXNlcnN7JFVzZXJJRH0gKSB7CiAgICAgICAgICAgICAgICBuZXh0IFVTRVJJRDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgIyBUaGUgdmFsdWVzIGluICVVc2VyTGlzdCBhcmUgaW4gdGhlIGZvcm06ICdtbSBNYXggTXVzdGVybWFubicuCiAgICAgICAgICAgICMgU28gYXNzZW1ibGUgYSBuZWF0ZXIgc3RyaW5nIGZvciBkaXNwbGF5LgogICAgICAgICAgICAjIChBY3R1YWxseSBVc2VyU2VhcmNoKCkgY29udGFpbnMgY29kZSBmb3IgZm9ybWF0aW5nLCBidXQgdGhhdCBpcyB1c3VhbGx5IG5vdCBjYWxsZWQuKQogICAgICAgICAgICBteSAlVXNlciA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgICAgICAgICAgVXNlcklEID0+ICRVc2VySUQsCiAgICAgICAgICAgICAgICBWYWxpZCAgPT4gJFBhcmFte1ZhbGlkfSwKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIG15ICRVc2VyVmFsdWUgPSBzcHJpbnRmICciJXMgJXMiIDwlcz4nLAogICAgICAgICAgICAgICAgJFVzZXJ7VXNlckZpcnN0bmFtZX0sCiAgICAgICAgICAgICAgICAkVXNlcntVc2VyTGFzdG5hbWV9LAogICAgICAgICAgICAgICAgJFVzZXJ7VXNlckVtYWlsfTsKCiAgICAgICAgICAgIHB1c2ggQERhdGEsIHsKICAgICAgICAgICAgICAgIFVzZXJLZXkgICA9PiAkVXNlcklELAogICAgICAgICAgICAgICAgVXNlclZhbHVlID0+ICRVc2VyVmFsdWUsCiAgICAgICAgICAgIH07CgogICAgICAgICAgICAkTWF4UmVzdWx0Q291bnQtLTsKICAgICAgICAgICAgbGFzdCBVU0VSSUQgaWYgJE1heFJlc3VsdENvdW50IDw9IDA7CiAgICAgICAgfQoKICAgICAgICAjIGJ1aWxkIEpTT04gb3V0cHV0CiAgICAgICAgJEpTT04gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkpTT05FbmNvZGUoCiAgICAgICAgICAgIERhdGEgPT4gXEBEYXRhLAogICAgICAgICk7CiAgICB9CgogICAgIyBzZW5kIEpTT04gcmVzcG9uc2UKICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkF0dGFjaG1lbnQoCiAgICAgICAgQ29udGVudFR5cGUgPT4gJ3RleHQvcGxhaW47IGNoYXJzZXQ9JyAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0NoYXJzZXR9LAogICAgICAgIENvbnRlbnQgICAgID0+ICRKU09OIHx8ICcnLAogICAgICAgIFR5cGUgICAgICAgID0+ICdpbmxpbmUnLAogICAgICAgIE5vQ2FjaGUgICAgID0+IDEsCiAgICApOwoKfQoKMTsK IyAtLQojIEFnZW50Q0lDbGFzc1NlYXJjaC5kdGwgLSBwcm92aWRlcyBhdXRvY29tcGxldGUgZmVhdHVyZSBmb3IgQ0kgY2xhc3NlcyBzZWFyY2gKIyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMSBjLmEucC5lLiBJVCBHbWJILCBodHRwOi8vd3d3LmNhcGUtaXQuZGUKIwojIHdyaXR0ZW4vZWRpdGVkIGJ5OgojICogRnJhbmsoZG90KU9iZXJlbmRlcihhdCljYXBlKGRhc2gpaXQoZG90KWRlCiMgKiBNYXJ0aW4oZG90KUJhbHphcmVrKGF0KWNhcGUoZGFzaClpdChkb3QpZGUKIwojIC0tCiMgJElkOiBBZ2VudENJQ2xhc3NTZWFyY2guZHRsLHYgMS4yIDIwMTEtMDktMDUgMTA6MDM6MDkgbWFiYSBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPCEtLSBkdGw6YmxvY2s6Q0lDbGFzc1NlYXJjaEF1dG9Db21wbGV0ZSAtLT4KPCEtLSBkdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUgLS0+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgQ29yZS5Db25maWcuU2V0KCdDSUNsYXNzQXV0b2NvbXBsZXRlLk1pblF1ZXJ5TGVuZ3RoJywgIiRRRGF0YXsibWluUXVlcnlMZW5ndGgifSIpOwogICAgQ29yZS5Db25maWcuU2V0KCdDSUNsYXNzQXV0b2NvbXBsZXRlLlF1ZXJ5RGVsYXknLCAiJFFEYXRheyJxdWVyeURlbGF5In0iKTsKICAgIENvcmUuQ29uZmlnLlNldCgnQ0lDbGFzc0F1dG9jb21wbGV0ZS5NYXhSZXN1bHRzRGlzcGxheWVkJywgIiRRRGF0YXsibWF4UmVzdWx0c0Rpc3BsYXllZCJ9Iik7CiAgICBDb3JlLkNvbmZpZy5TZXQoJ0NJQ2xhc3NBdXRvY29tcGxldGUuRHluYW1pY1dpZHRoJywgIiRRRGF0YXsiZHluYW1pY1dpZHRoIn0iKTsKICAgIENvcmUuQ29uZmlnLlNldCgnQ0lDbGFzc0F1dG9jb21wbGV0ZS5TZWFyY2hCdXR0b25UZXh0JywgIiRKU1RleHR7IlNlYXJjaCBRdWV1ZSJ9Iik7Ci8vXV0+PC9zY3JpcHQ+Cgo8IS0tIGR0bDpibG9jazpDSUNsYXNzU2VhcmNoSW5pdCAtLT4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICB2YXIgRmllbGRJRCA9ICckUURhdGF7Ikl0ZW1JRCJ9JzsKICAgIEZpZWxkSUQgPSBGaWVsZElELnJlcGxhY2UoLzovZywgJ1xcOicpOwogICAgQ29yZS5BZ2VudC5DSUNsYXNzU2VhcmNoLkluaXQoJCgiIyIrRmllbGRJRCksICRRRGF0YXsiQ2xhc3NJRCJ9LCRRRGF0YXsiQWN0aXZlQXV0b0NvbXBsZXRlIn0pOwovL11dPjwvc2NyaXB0Pgo8IS0tIGR0bDpibG9jazpDSUNsYXNzU2VhcmNoSW5pdCAtLT4KCjwhLS0gZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlIC0tPgo8IS0tIGR0bDpibG9jazpDSUNsYXNzU2VhcmNoQXV0b0NvbXBsZXRlIC0tPgoK IyAtLQojIEFnZW50UXVldWVTZWFyY2guZHRsIC0gcHJvdmlkZXMgYXV0b2NvbXBsZXRlIGZlYXR1cmUgZm9yIHF1ZXVlIHNlYXJjaAojIENvcHlyaWdodCAoQykgMjAwNi0yMDExIGMuYS5wLmUuIElUIEdtYkgsIGh0dHA6Ly93d3cuY2FwZS1pdC5kZQojCiMgd3JpdHRlbi9lZGl0ZWQgYnk6CiMgKiBGcmFuayhkb3QpT2JlcmVuZGVyKGF0KWNhcGUoZGFzaClpdChkb3QpZGUKIyAqIE1hcnRpbihkb3QpQmFsemFyZWsoYXQpY2FwZShkYXNoKWl0KGRvdClkZQojCiMgLS0KIyAkSWQ6IEFnZW50UXVldWVTZWFyY2guZHRsLHYgMS4yIDIwMTEtMDktMDUgMTA6MDU6MTggbWFiYSBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPCEtLSBkdGw6YmxvY2s6UXVldWVTZWFyY2hBdXRvQ29tcGxldGUgLS0+CjwhLS0gZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlIC0tPgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgIENvcmUuQ29uZmlnLlNldCgnUXVldWVBdXRvY29tcGxldGUuTWluUXVlcnlMZW5ndGgnLCAiJFFEYXRheyJtaW5RdWVyeUxlbmd0aCJ9Iik7CiAgICBDb3JlLkNvbmZpZy5TZXQoJ1F1ZXVlQXV0b2NvbXBsZXRlLlF1ZXJ5RGVsYXknLCAiJFFEYXRheyJxdWVyeURlbGF5In0iKTsKICAgIENvcmUuQ29uZmlnLlNldCgnUXVldWVBdXRvY29tcGxldGUuTWF4UmVzdWx0c0Rpc3BsYXllZCcsICIkUURhdGF7Im1heFJlc3VsdHNEaXNwbGF5ZWQifSIpOwogICAgQ29yZS5Db25maWcuU2V0KCdRdWV1ZUF1dG9jb21wbGV0ZS5EeW5hbWljV2lkdGgnLCAiJFFEYXRheyJkeW5hbWljV2lkdGgifSIpOwogICAgQ29yZS5Db25maWcuU2V0KCdRdWV1ZUF1dG9jb21wbGV0ZS5TZWFyY2hCdXR0b25UZXh0JywgIiRKU1RleHR7IlNlYXJjaCBRdWV1ZSJ9Iik7Ci8vXV0+PC9zY3JpcHQ+Cgo8IS0tIGR0bDpibG9jazpRdWV1ZVNlYXJjaEluaXQgLS0+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgdmFyIEZpZWxkSUQgPSAnJFFEYXRheyJJdGVtSUQifSc7CiAgICBGaWVsZElEID0gRmllbGRJRC5yZXBsYWNlKC86L2csICdcXDonKTsKICAgIENvcmUuQWdlbnQuUXVldWVTZWFyY2guSW5pdCgkKCIjIitGaWVsZElEKSwgJFFEYXRheyJBY3RpdmVBdXRvQ29tcGxldGUifSk7Ci8vXV0+PC9zY3JpcHQ+CjwhLS0gZHRsOmJsb2NrOlF1ZXVlU2VhcmNoSW5pdCAtLT4KCjwhLS0gZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlIC0tPgo8IS0tIGR0bDpibG9jazpRdWV1ZVNlYXJjaEF1dG9Db21wbGV0ZSAtLT4KCg== IyAtLQojIEFnZW50U2VydmljZVNlYXJjaC5kdGwgLSBwcm92aWRlcyBhdXRvY29tcGxldGUgZmVhdHVyZSBmb3Igc2VydmljZSBzZWFyY2gKIyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMSBjLmEucC5lLiBJVCBHbWJILCBodHRwOi8vd3d3LmNhcGUtaXQuZGUKIwojIHdyaXR0ZW4vZWRpdGVkIGJ5OgojICogRnJhbmsoZG90KU9iZXJlbmRlcihhdCljYXBlKGRhc2gpaXQoZG90KWRlCiMgKiBNYXJ0aW4oZG90KUJhbHphcmVrKGF0KWNhcGUoZGFzaClpdChkb3QpZGUKIwojIC0tCiMgJElkOiBBZ2VudFNlcnZpY2VTZWFyY2guZHRsLHYgMS4yIDIwMTEtMDktMDUgMTA6MDU6MTggbWFiYSBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKPCEtLSBkdGw6YmxvY2s6U2VydmljZVNlYXJjaEF1dG9Db21wbGV0ZSAtLT4KPCEtLSBkdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUgLS0+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgQ29yZS5Db25maWcuU2V0KCdTZXJ2aWNlQXV0b2NvbXBsZXRlLk1pblF1ZXJ5TGVuZ3RoJywgIiRRRGF0YXsibWluUXVlcnlMZW5ndGgifSIpOwogICAgQ29yZS5Db25maWcuU2V0KCdTZXJ2aWNlQXV0b2NvbXBsZXRlLlF1ZXJ5RGVsYXknLCAiJFFEYXRheyJxdWVyeURlbGF5In0iKTsKICAgIENvcmUuQ29uZmlnLlNldCgnU2VydmljZUF1dG9jb21wbGV0ZS5NYXhSZXN1bHRzRGlzcGxheWVkJywgIiRRRGF0YXsibWF4UmVzdWx0c0Rpc3BsYXllZCJ9Iik7CiAgICBDb3JlLkNvbmZpZy5TZXQoJ1NlcnZpY2VBdXRvY29tcGxldGUuRHluYW1pY1dpZHRoJywgIiRRRGF0YXsiZHluYW1pY1dpZHRoIn0iKTsKICAgIENvcmUuQ29uZmlnLlNldCgnU2VydmljZUF1dG9jb21wbGV0ZS5TZWFyY2hCdXR0b25UZXh0JywgIiRKU1RleHR7IlNlYXJjaCBTZXJ2aWNlIn0iKTsKLy9dXT48L3NjcmlwdD4KCjwhLS0gZHRsOmJsb2NrOlNlcnZpY2VTZWFyY2hJbml0IC0tPgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgIHZhciBGaWVsZElEID0gJyRRRGF0YXsiSXRlbUlEIn0nOwogICAgRmllbGRJRCA9IEZpZWxkSUQucmVwbGFjZSgvOi9nLCAnXFw6Jyk7CiAgICBDb3JlLkFnZW50LlNlcnZpY2VTZWFyY2guSW5pdCgkKCIjIitGaWVsZElEKSwgJFFEYXRheyJBY3RpdmVBdXRvQ29tcGxldGUifSk7Ci8vXV0+PC9zY3JpcHQ+CjwhLS0gZHRsOmJsb2NrOlNlcnZpY2VTZWFyY2hJbml0IC0tPgoKPCEtLSBkdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUgLS0+CjwhLS0gZHRsOmJsb2NrOlNlcnZpY2VTZWFyY2hBdXRvQ29tcGxldGUgLS0+Cgo= IyAtLQojIEFnZW50Q3VzdG9tZXJDb21wYW55U2VhcmNoLmR0bCAtIHByb3ZpZGVzIGF1dG9jb21wbGV0ZSBmZWF0dXJlIGZvciBjdXN0b21lciBjb21wYW55IHNlYXJjaAojIENvcHlyaWdodCAoQykgMjAwNi0yMDExIGMuYS5wLmUuIElUIEdtYkgsIGh0dHA6Ly93d3cuY2FwZS1pdC5kZQojCiMgd3JpdHRlbi9lZGl0ZWQgYnk6CiMgKiBGcmFuayhkb3QpT2JlcmVuZGVyKGF0KWNhcGUoZGFzaClpdChkb3QpZGUKIyAqIE1hcnRpbihkb3QpQmFsemFyZWsoYXQpY2FwZShkYXNoKWl0KGRvdClkZQojCiMgLS0KIyAkSWQ6IEFnZW50Q3VzdG9tZXJDb21wYW55U2VhcmNoLmR0bCx2IDEuMiAyMDExLTA5LTA1IDEwOjA1OjE4IG1hYmEgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCjwhLS0gZHRsOmJsb2NrOkN1c3RvbWVyQ29tcGFueVNlYXJjaEF1dG9Db21wbGV0ZSAtLT4KPCEtLSBkdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUgLS0+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgQ29yZS5Db25maWcuU2V0KCdDdXN0b21lckNvbXBhbnlBdXRvY29tcGxldGUuTWluUXVlcnlMZW5ndGgnLCAiJFFEYXRheyJtaW5RdWVyeUxlbmd0aCJ9Iik7CiAgICBDb3JlLkNvbmZpZy5TZXQoJ0N1c3RvbWVyQ29tcGFueUF1dG9jb21wbGV0ZS5RdWVyeURlbGF5JywgIiRRRGF0YXsicXVlcnlEZWxheSJ9Iik7CiAgICBDb3JlLkNvbmZpZy5TZXQoJ0N1c3RvbWVyQ29tcGFueUF1dG9jb21wbGV0ZS5NYXhSZXN1bHRzRGlzcGxheWVkJywgIiRRRGF0YXsibWF4UmVzdWx0c0Rpc3BsYXllZCJ9Iik7CiAgICBDb3JlLkNvbmZpZy5TZXQoJ0N1c3RvbWVyQ29tcGFueUF1dG9jb21wbGV0ZS5EeW5hbWljV2lkdGgnLCAiJFFEYXRheyJkeW5hbWljV2lkdGgifSIpOwogICAgQ29yZS5Db25maWcuU2V0KCdDdXN0b21lckNvbXBhbnlBdXRvY29tcGxldGUuU2VhcmNoQnV0dG9uVGV4dCcsICIkSlNUZXh0eyJTZWFyY2ggQ3VzdG9tZXJDb21wYW55In0iKTsKLy9dXT48L3NjcmlwdD4KCjwhLS0gZHRsOmJsb2NrOkN1c3RvbWVyQ29tcGFueVNlYXJjaEluaXQgLS0+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgdmFyIEZpZWxkSUQgPSAnJFFEYXRheyJJdGVtSUQifSc7CiAgICBGaWVsZElEID0gRmllbGRJRC5yZXBsYWNlKC86L2csICdcXDonKTsKICAgIENvcmUuQWdlbnQuQ3VzdG9tZXJDb21wYW55U2VhcmNoLkluaXQoJCgiIyIrRmllbGRJRCksICRRRGF0YXsiQWN0aXZlQXV0b0NvbXBsZXRlIn0pOwovL11dPjwvc2NyaXB0Pgo8IS0tIGR0bDpibG9jazpDdXN0b21lckNvbXBhbnlTZWFyY2hJbml0IC0tPgoKPCEtLSBkdGw6anNfb25fZG9jdW1lbnRfY29tcGxldGUgLS0+CjwhLS0gZHRsOmJsb2NrOkN1c3RvbWVyQ29tcGFueVNlYXJjaEF1dG9Db21wbGV0ZSAtLT4KCg== IyAtLQojIEFnZW50Q3VzdG9tZXJVc2VyQ29tcGFueVNlYXJjaC5kdGwgLSBwcm92aWRlcyBhdXRvY29tcGxldGUgZmVhdHVyZSBmb3IgY3VzdG9tZXIgdXNlciBjb21wYW55IHNlYXJjaAojIENvcHlyaWdodCAoQykgMjAwNi0yMDExIGMuYS5wLmUuIElUIEdtYkgsIGh0dHA6Ly93d3cuY2FwZS1pdC5kZQojCiMgd3JpdHRlbi9lZGl0ZWQgYnk6CiMgKiBGcmFuayhkb3QpT2JlcmVuZGVyKGF0KWNhcGUoZGFzaClpdChkb3QpZGUKIyAqIE1hcnRpbihkb3QpQmFsemFyZWsoYXQpY2FwZShkYXNoKWl0KGRvdClkZQojCiMgLS0KIyAkSWQ6IEFnZW50Q3VzdG9tZXJVc2VyQ29tcGFueVNlYXJjaC5kdGwsdiAxLjIgMjAxMS0wOS0wNSAxMDowNToxOCBtYWJhIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgo8IS0tIGR0bDpibG9jazpDdXN0b21lclVzZXJDb21wYW55U2VhcmNoQXV0b0NvbXBsZXRlIC0tPgo8IS0tIGR0bDpqc19vbl9kb2N1bWVudF9jb21wbGV0ZSAtLT4KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPi8vPCFbQ0RBVEFbCiAgICBDb3JlLkNvbmZpZy5TZXQoJ0N1c3RvbWVyVXNlckNvbXBhbnlBdXRvY29tcGxldGUuTWluUXVlcnlMZW5ndGgnLCAiJFFEYXRheyJtaW5RdWVyeUxlbmd0aCJ9Iik7CiAgICBDb3JlLkNvbmZpZy5TZXQoJ0N1c3RvbWVyVXNlckNvbXBhbnlBdXRvY29tcGxldGUuUXVlcnlEZWxheScsICIkUURhdGF7InF1ZXJ5RGVsYXkifSIpOwogICAgQ29yZS5Db25maWcuU2V0KCdDdXN0b21lclVzZXJDb21wYW55QXV0b2NvbXBsZXRlLk1heFJlc3VsdHNEaXNwbGF5ZWQnLCAiJFFEYXRheyJtYXhSZXN1bHRzRGlzcGxheWVkIn0iKTsKICAgIENvcmUuQ29uZmlnLlNldCgnQ3VzdG9tZXJVc2VyQ29tcGFueUF1dG9jb21wbGV0ZS5EeW5hbWljV2lkdGgnLCAiJFFEYXRheyJkeW5hbWljV2lkdGgifSIpOwogICAgQ29yZS5Db25maWcuU2V0KCdDdXN0b21lclVzZXJDb21wYW55QXV0b2NvbXBsZXRlLlNlYXJjaEJ1dHRvblRleHQnLCAiJEpTVGV4dHsiU2VhcmNoIEN1c3RvbWVyVXNlckNvbXBhbnkifSIpOwovL11dPjwvc2NyaXB0PgoKPCEtLSBkdGw6YmxvY2s6Q3VzdG9tZXJVc2VyQ29tcGFueVNlYXJjaEluaXQgLS0+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgdmFyIEZpZWxkSUQgPSAnJFFEYXRheyJJdGVtSUQifSc7CiAgICBGaWVsZElEID0gRmllbGRJRC5yZXBsYWNlKC86L2csICdcXDonKTsKICAgIENvcmUuQWdlbnQuQ3VzdG9tZXJVc2VyQ29tcGFueVNlYXJjaC5Jbml0KCQoIiMiK0ZpZWxkSUQpLCAkUURhdGF7IkFjdGl2ZUF1dG9Db21wbGV0ZSJ9KTsKLy9dXT48L3NjcmlwdD4KPCEtLSBkdGw6YmxvY2s6Q3VzdG9tZXJVc2VyQ29tcGFueVNlYXJjaEluaXQgLS0+Cgo8IS0tIGR0bDpqc19vbl9kb2N1bWVudF9jb21wbGV0ZSAtLT4KPCEtLSBkdGw6YmxvY2s6Q3VzdG9tZXJVc2VyQ29tcGFueVNlYXJjaEF1dG9Db21wbGV0ZSAtLT4KCg== IyAtLQojIEFnZW50VXNlclNlYXJjaC5kdGwgLSBwcm92aWRlcyBhdXRvY29tcGxldGUgZmVhdHVyZSBmb3IgdXNlciBzZWFyY2gKIyBiYXNlZCBvbiBBZ2VudElUU01Vc2VyU2VhcmNoLmR0bDogQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIEV4dGVuc2lvbnMgQ29weXJpZ2h0IChDKSAyMDA2LTIwMTEgYy5hLnAuZS4gSVQgR21iSCwgaHR0cDovL3d3dy5jYXBlLWl0LmRlCiMKIyB3cml0dGVuL2VkaXRlZCBieToKIyAqIEZyYW5rKGRvdClPYmVyZW5kZXIoYXQpY2FwZShkYXNoKWl0KGRvdClkZQojICogTWFydGluKGRvdClCYWx6YXJlayhhdCljYXBlKGRhc2gpaXQoZG90KWRlCiMKIyAtLQojICRJZDogQWdlbnRVc2VyU2VhcmNoLmR0bCx2IDEuMyAyMDExLTA5LTA1IDEwOjA3OjMyIG1hYmEgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCiMgSVRTTS1DSUF0dHJpYnV0ZUNvbGxlY3Rpb24tY2FwZUlUCiM8IS0tIGR0bDpibG9jazpVc2VyU2VhcmNoQXV0b0NvbXBsZXRlIC0tPgo8IS0tIGR0bDpibG9jazpBZ2VudFVzZXJTZWFyY2hBdXRvQ29tcGxldGUgLS0+CiMgRU8gSVRTTS1DSUF0dHJpYnV0ZUNvbGxlY3Rpb24tY2FwZUlUCjwhLS0gZHRsOmpzX29uX2RvY3VtZW50X2NvbXBsZXRlIC0tPgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Ly88IVtDREFUQVsKICAgIENvcmUuQ29uZmlnLlNldCgnVXNlckF1dG9jb21wbGV0ZS5NaW5RdWVyeUxlbmd0aCcsICIkUURhdGF7Im1pblF1ZXJ5TGVuZ3RoIn0iKTsKICAgIENvcmUuQ29uZmlnLlNldCgnVXNlckF1dG9jb21wbGV0ZS5RdWVyeURlbGF5JywgIiRRRGF0YXsicXVlcnlEZWxheSJ9Iik7CiAgICBDb3JlLkNvbmZpZy5TZXQoJ1VzZXJBdXRvY29tcGxldGUuTWF4UmVzdWx0c0Rpc3BsYXllZCcsICIkUURhdGF7Im1heFJlc3VsdHNEaXNwbGF5ZWQifSIpOwogICAgQ29yZS5Db25maWcuU2V0KCdVc2VyQXV0b2NvbXBsZXRlLkR5bmFtaWNXaWR0aCcsICIkUURhdGF7ImR5bmFtaWNXaWR0aCJ9Iik7CiAgICBDb3JlLkNvbmZpZy5TZXQoJ1VzZXJBdXRvY29tcGxldGUuU2VhcmNoQnV0dG9uVGV4dCcsICIkSlNUZXh0eyJTZWFyY2ggQWdlbnQifSIpOwogICAgQ29yZS5Db25maWcuU2V0KCdVc2VyQXV0b2NvbXBsZXRlLkdyb3VwcycsICIkUURhdGF7Imdyb3VwcyJ9Iik7Ci8vXV0+PC9zY3JpcHQ+CgojIElUU00tQ0lBdHRyaWJ1dGVDb2xsZWN0aW9uLWNhcGVJVAojPCEtLSBkdGw6YmxvY2s6VXNlclNlYXJjaEluaXQgLS0+CjwhLS0gZHRsOmJsb2NrOkFnZW50VXNlclNlYXJjaEluaXQgLS0+CiMgRU8gSVRTTS1DSUF0dHJpYnV0ZUNvbGxlY3Rpb24tY2FwZUlUCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwovKmdsb2JhbCBJVFNNOiB0cnVlICovCiMgSVRTTS1DSUF0dHJpYnV0ZUNvbGxlY3Rpb24tY2FwZUlUCiMgICAgSVRTTS5BZ2VudC5Vc2VyU2VhcmNoLkluaXQoJCgiIyRRRGF0YXsiSXRlbUlEIn0iKSwgJFFEYXRheyJBY3RpdmVBdXRvQ29tcGxldGUifSk7CiAgICB2YXIgRmllbGRJRCA9ICckUURhdGF7Ikl0ZW1JRCJ9JzsKICAgIEZpZWxkSUQgPSBGaWVsZElELnJlcGxhY2UoLzovZywgJ1xcOicpOwogICAgQ29yZS5BZ2VudC5Vc2VyU2VhcmNoLkluaXQoJCgiIyIrRmllbGRJRCksICRRRGF0YXsiQWN0aXZlQXV0b0NvbXBsZXRlIn0pOwojIEVPIElUU00tQ0lBdHRyaWJ1dGVDb2xsZWN0aW9uLWNhcGVJVAovL11dPjwvc2NyaXB0PgojIElUU00tQ0lBdHRyaWJ1dGVDb2xsZWN0aW9uLWNhcGVJVAojPCEtLSBkdGw6YmxvY2s6VXNlclNlYXJjaEluaXQgLS0+CjwhLS0gZHRsOmJsb2NrOkFnZW50VXNlclNlYXJjaEluaXQgLS0+CiMgRU8gSVRTTS1DSUF0dHJpYnV0ZUNvbGxlY3Rpb24tY2FwZUlUCgo8IS0tIGR0bDpqc19vbl9kb2N1bWVudF9jb21wbGV0ZSAtLT4KIyBJVFNNLUNJQXR0cmlidXRlQ29sbGVjdGlvbi1jYXBlSVQKIzwhLS0gZHRsOmJsb2NrOlVzZXJTZWFyY2hBdXRvQ29tcGxldGUgLS0+CjwhLS0gZHRsOmJsb2NrOkFnZW50VXNlclNlYXJjaEF1dG9Db21wbGV0ZSAtLT4KCiM8IS0tIGR0bDpibG9jazpVc2VyU2VhcmNoSVRTTVNlYXJjaEF1dG9jb21wbGV0ZSAtLT4KIzxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwojICAgIENvcmUuQ29uZmlnLlNldCgnVXNlckF1dG9jb21wbGV0ZS5BY3RpdmUnLCAiJFFEYXRheyJhY3RpdmUifSIpOwojICAgIENvcmUuQ29uZmlnLlNldCgnVXNlckF1dG9jb21wbGV0ZS5RdWVyeURlbGF5JywgIiRRRGF0YXsicXVlcnlEZWxheSJ9Iik7CiMgICAgQ29yZS5Db25maWcuU2V0KCdVc2VyQXV0b2NvbXBsZXRlLk1heFJlc3VsdHNEaXNwbGF5ZWQnLCAiJFFEYXRheyJtYXhSZXN1bHRzRGlzcGxheWVkIn0iKTsKIyAgICBDb3JlLkNvbmZpZy5TZXQoJ1VzZXJBdXRvY29tcGxldGUuTWluUXVlcnlMZW5ndGgnLCAiJFFEYXRheyJtaW5RdWVyeUxlbmd0aCJ9Iik7CiMgICAgQ29yZS5Db25maWcuU2V0KCdVc2VyQXV0b2NvbXBsZXRlLkR5bmFtaWNXaWR0aCcsICIkUURhdGF7ImR5bmFtaWNXaWR0aCJ9Iik7CiMgICAgQ29yZS5Db25maWcuU2V0KCdVc2VyQXV0b2NvbXBsZXRlLlNlYXJjaEJ1dHRvblRleHQnLCAiJEpTVGV4dHsiU2VhcmNoIEFnZW50In0iKTsKIy8vXV0+PC9zY3JpcHQ+CiM8IS0tIGR0bDpibG9jazpVc2VyU2VhcmNoSVRTTVNlYXJjaEF1dG9jb21wbGV0ZSAtLT4KIyBFTyBJVFNNLUNJQXR0cmlidXRlQ29sbGVjdGlvbi1jYXBlSVQK IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ29uZmlnSXRlbUxheW91dEN1c3RvbWVyQ29tcGFueS5wbSAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyBFeHRlbnNpb25zIENvcHlyaWdodCAoQykgMjAwNi0yMDExIGMuYS5wLmUuIElUIEdtYkgsIGh0dHA6Ly93d3cuY2FwZS1pdC5kZQojCiMgd3JpdHRlbi9jaGFuZ2VkIGJ5OgojICogU3RlZmFuKGRvdClNZWhsaWcoYXQpY2FwZS1pdChkb3QpZGUKIyAqIFRvcnN0ZW4oZG90KVRoYXUoYXQpY2FwZS1pdChkb3QpZGUKIyAqIEZyYW5rKGRvdClPYmVyZW5kZXIoYXQpY2FwZS1pdChkb3QpZGUKIwojIC0tCiMgJElkOiBJVFNNQ29uZmlnSXRlbUxheW91dEN1c3RvbWVyQ29tcGFueS5wbSx2IDEuMTAgMjAxMS0wNC0xOCAwNzo1Mzo0OSB0dG8gRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW1MYXlvdXRDdXN0b21lckNvbXBhbnk7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQ29tcGFueTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMTAgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbUxheW91dEN1c3RvbWVyQ29tcGFueSAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBvZiBDdXN0b21lckNvbXBhbnkgb2JqZWN0cwoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbUxheW91dEN1c3RvbWVyQ29tcGFueS0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0ICgKICAgICAgICBxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgUGFyYW1PYmplY3QgVGltZU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgRW5jb2RlT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KICAgICRTZWxmLT57Q3VzdG9tZXJDb21wYW55T2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lckNvbXBhbnktPm5ldyggJXskU2VsZn0gKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIE91dHB1dFN0cmluZ0NyZWF0ZSgpCgpjcmVhdGUgb3V0cHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5PdXRwdXRTdHJpbmdDcmVhdGUoCiAgICAgICAgVmFsdWUgPT4gMTEsICAgICAgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBPdXRwdXRTdHJpbmdDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIHRyYW5zZm9ybSBhc2NpaSB0byBodG1sCiAgICAkUGFyYW17VmFsdWV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgIFRleHQgPT4gJFBhcmFte1ZhbHVlfSB8fCAnJywKICAgICAgICBIVE1MUmVzdWx0TW9kZSA9PiAxLAogICAgKTsKCiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gRm9ybURhdGFHZXQoKQoKZ2V0IGZvcm0gZGF0YSBhcyBoYXNoIHJlZmVyZW5jZQoKICAgIG15ICRGb3JtRGF0YVJlZiA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtRGF0YUdldCgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICVGb3JtRGF0YTsKCiAgICAjIGdldCBzZWxlY3RlZCBDdXN0b21lckNvbXBhbnkKICAgICRGb3JtRGF0YXtWYWx1ZX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9ICk7CgogICAgIyBjaGVjayBzZWFyY2ggYnV0dG9uCiAgICBpZiAoICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpCdXR0b25TZWFyY2gnICkgKSB7CiAgICAgICAgJFBhcmFte0l0ZW19LT57Rm9ybX0tPnsgJFBhcmFte0tleX0gfS0+e1NlYXJjaH0KICAgICAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9IC4gJzo6U2VhcmNoJyApOwogICAgfQoKICAgICMgY2hlY2sgc2VsZWN0IGJ1dHRvbgogICAgZWxzaWYgKCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9IC4gJzo6QnV0dG9uU2VsZWN0JyApICkgewogICAgICAgICRGb3JtRGF0YXtWYWx1ZX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9IC4gJzo6U2VsZWN0JyApOwogICAgfQoKICAgICMgY2hlY2sgY2xlYXIgYnV0dG9uCiAgICBlbHNpZiAoICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpCdXR0b25DbGVhcicgKSApIHsKICAgICAgICAkRm9ybURhdGF7VmFsdWV9ID0gJyc7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyByZXNldCB2YWx1ZSBpZiBzZWFyY2ggZmllbGQgaXMgZW10eQogICAgICAgIGlmICgKICAgICAgICAgICAgISRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpTZWFyY2gnICkKICAgICAgICAgICAgJiYgZGVmaW5lZCAkRm9ybURhdGF7VmFsdWV9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRGb3JtRGF0YXtWYWx1ZX0gPSAnJzsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgcmVxdWlyZWQgb3B0aW9uCiAgICAgICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntSZXF1aXJlZH0gJiYgISRGb3JtRGF0YXtWYWx1ZX0gKSB7CiAgICAgICAgICAgICRQYXJhbXtJdGVtfS0+e0Zvcm19LT57ICRQYXJhbXtLZXl9IH0tPntJbnZhbGlkfSA9IDE7CiAgICAgICAgICAgICRGb3JtRGF0YXtJbnZhbGlkfSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBcJUZvcm1EYXRhOwp9Cgo9aXRlbSBJbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+SW5wdXRDcmVhdGUoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBWYWx1ZSA9PiAxMSwgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgSW5wdXRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFZhbHVlID0gJyc7CiAgICBpZiAoIGRlZmluZWQgJFBhcmFte1ZhbHVlfSApIHsKICAgICAgICAkVmFsdWUgPSAkUGFyYW17VmFsdWV9OwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntWYWx1ZURlZmF1bHR9ICkgewogICAgICAgICRWYWx1ZSA9ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1ZhbHVlRGVmYXVsdH07CiAgICB9CiAgICBteSAkU2l6ZSAgICAgICAgID0gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57U2l6ZX0gfHwgNTA7CiAgICBteSAkU2VhcmNoICAgICAgID0gJyc7CiAgICBteSAkU3RyaW5nT3B0aW9uID0gJyc7CiAgICBteSAkU3RyaW5nU2VsZWN0ID0gJyc7CiAgICBteSAkQ2xhc3MgICAgICAgID0gJ1c1MHBjIEN1c3RvbWVyQ29tcGFueVNlYXJjaCc7CiAgICBteSAkUmVxdWlyZWQgICAgID0gJFBhcmFte1JlcXVpcmVkfSB8fCAnJzsKICAgIG15ICRJbnZhbGlkICAgICAgPSAkUGFyYW17SW52YWxpZH0gfHwgJyc7CiAgICBteSAkSXRlbUlkICAgICAgID0gJFBhcmFte0l0ZW1JZH0gfHwgJyc7CgogICAgIyBDdXN0b21lckNvbXBhbnkgc2VhcmNoCiAgICBpZiAoICRQYXJhbXtJdGVtfS0+e0Zvcm19LT57ICRQYXJhbXtLZXl9IH0tPntTZWFyY2h9ICkgewogICAgICAgIG15IEBTZWFyY2hBcnJheSA9IHNwbGl0KCAnICcsICRQYXJhbXtJdGVtfS0+e0Zvcm19LT57ICRQYXJhbXtLZXl9IH0tPntTZWFyY2h9ICk7CiAgICAgICAgbXkgJFNlYXJjaFN0cmluZyA9IGpvaW4oICcrJywgQFNlYXJjaEFycmF5ICk7CgogICAgICAgICMgc3RhcnQgc2VhcmNoCiAgICAgICAgbXkgJUN1c3RvbWVyQ29tcGFueVNlYXJjaExpc3QgPSAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU9iamVjdH0tPkN1c3RvbWVyQ29tcGFueUxpc3QoCiAgICAgICAgICAgIFNlYXJjaCA9PiAnKicgLiAkU2VhcmNoU3RyaW5nIC4gJyonLAogICAgICAgICk7CgogICAgICAgIGlmICggJUN1c3RvbWVyQ29tcGFueVNlYXJjaExpc3QgJiYgc2NhbGFyKCBrZXlzICVDdXN0b21lckNvbXBhbnlTZWFyY2hMaXN0ICkgPiAxICkgewoKICAgICAgICAgICAgIyBjcmVhdGUgb3B0aW9uIGxpc3QKICAgICAgICAgICAgJFN0cmluZ09wdGlvbiA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBOYW1lID0+ICRQYXJhbXtLZXl9IC4gJzo6U2VsZWN0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVDdXN0b21lckNvbXBhbnlTZWFyY2hMaXN0LAogICAgICAgICAgICApOwogICAgICAgICAgICAkU3RyaW5nT3B0aW9uIC49ICc8YnI+JzsKCiAgICAgICAgICAgICMgY3JlYXRlIHNlbGVjdCBidXR0b24KICAgICAgICAgICAgJFN0cmluZ1NlbGVjdCA9ICc8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSInCiAgICAgICAgICAgICAgICAuICRQYXJhbXtLZXl9CiAgICAgICAgICAgICAgICAuICc6OkJ1dHRvblNlbGVjdCIgJwogICAgICAgICAgICAgICAgLiAndmFsdWU9IiRUZXh0eyJTZWxlY3QifSI+Jm5ic3A7JzsKCiAgICAgICAgICAgICMgc2V0IHNlYXJjaAogICAgICAgICAgICAkU2VhcmNoID0gJFBhcmFte0l0ZW19LT57Rm9ybX0tPnsgJFBhcmFte0tleX0gfS0+e1NlYXJjaH07CiAgICAgICAgfQogICAgICAgIGVsc2lmICglQ3VzdG9tZXJDb21wYW55U2VhcmNoTGlzdCkgewoKICAgICAgICAgICAgIyBnZXQgQ3VzdG9tZXJDb21wYW55IGRhdGEKICAgICAgICAgICAgJFZhbHVlID0gKCBrZXlzICVDdXN0b21lckNvbXBhbnlTZWFyY2hMaXN0IClbMF07CiAgICAgICAgICAgIG15ICVDdXN0b21lckNvbXBhbnlTZWFyY2hMaXN0ID0gJFNlbGYtPntDdXN0b21lckNvbXBhbnlPYmplY3R9LT5DdXN0b21lckNvbXBhbnlHZXQoCiAgICAgICAgICAgICAgICBDdXN0b21lcklEID0+ICRWYWx1ZSwKICAgICAgICAgICAgKTsKCiMgdHJhbnNmb3JtIGFzY2lpIHRvIGh0bWwKIyRTZWFyY2ggPSAkQ3VzdG9tZXJDb21wYW55U2VhcmNoTGlzdHtDdXN0b21lcklEfS4iICIuJEN1c3RvbWVyQ29tcGFueVNlYXJjaExpc3R7Q3VzdG9tZXJDb21wYW55U3RyZWV0fQojLiIgIi4kQ3VzdG9tZXJDb21wYW55U2VhcmNoTGlzdHtDdXN0b21lckNvbXBhbnlaSVB9LiIgIi4kQ3VzdG9tZXJDb21wYW55U2VhcmNoTGlzdHtDdXN0b21lckNvbXBhbnlDaXR5fTsKICAgICAgICAgICAgbXkgJEN1c3RDb21wYW55TWFwUmVmID0KICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdJVFNNQ0lBdHRyaWJ1dGVDb2xsZWN0aW9uOjpDb21wYW55QmFja2VuZE1hcHBpbmcnKTsKCiAgICAgICAgICAgIGlmICggJEN1c3RDb21wYW55TWFwUmVmICYmIHJlZigkQ3VzdENvbXBhbnlNYXBSZWYpIGVxICdIQVNIJyApIHsKCiAgICAgICAgICAgICAgICBmb3IgbXkgJE1hcHBpbmdGaWVsZCAoIHNvcnQoIGtleXMoICV7JEN1c3RDb21wYW55TWFwUmVmfSApICkgKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJDb21wYW55U2VhcmNoTGlzdHsgJEN1c3RDb21wYW55TWFwUmVmLT57JE1hcHBpbmdGaWVsZH0gfSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFNlYXJjaCAuPSAnICcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4gJEN1c3RvbWVyQ29tcGFueVNlYXJjaExpc3R7ICRDdXN0Q29tcGFueU1hcFJlZi0+eyRNYXBwaW5nRmllbGR9IH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgfQoKICAgICAgICAgICAgJFNlYXJjaCA9fiBzL1xzKyQvL2c7CiAgICAgICAgICAgICRTZWFyY2ggPX4gcy9eXHMrLy9nOwoKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgQ3VzdG9tZXJDb21wYW55IHN0cmluZwogICAgZWxzaWYgKCRWYWx1ZSkgewoKICAgICAgICAjIGdldCBDdXN0b21lckNvbXBhbnkgZGF0YQogICAgICAgIG15ICVDdXN0b21lckNvbXBhbnlTZWFyY2hMaXN0ID0gJFNlbGYtPntDdXN0b21lckNvbXBhbnlPYmplY3R9LT5DdXN0b21lckNvbXBhbnlHZXQoCiAgICAgICAgICAgIEN1c3RvbWVySUQgPT4gJFZhbHVlLAogICAgICAgICk7CgojIHRyYW5zZm9ybSBhc2NpaSB0byBodG1sCiMkU2VhcmNoID0gJEN1c3RvbWVyQ29tcGFueVNlYXJjaExpc3R7Q3VzdG9tZXJJRH0uIiAiLiRDdXN0b21lckNvbXBhbnlTZWFyY2hMaXN0e0N1c3RvbWVyQ29tcGFueVN0cmVldH0KIy4iICIuJEN1c3RvbWVyQ29tcGFueVNlYXJjaExpc3R7Q3VzdG9tZXJDb21wYW55WklQfS4iICIuJEN1c3RvbWVyQ29tcGFueVNlYXJjaExpc3R7Q3VzdG9tZXJDb21wYW55Q2l0eX07CiAgICAgICAgbXkgJEN1c3RDb21wYW55TWFwUmVmID0KICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0lUU01DSUF0dHJpYnV0ZUNvbGxlY3Rpb246OkNvbXBhbnlCYWNrZW5kTWFwcGluZycpOwoKICAgICAgICBpZiAoICRDdXN0Q29tcGFueU1hcFJlZiAmJiByZWYoJEN1c3RDb21wYW55TWFwUmVmKSBlcSAnSEFTSCcgKSB7CgogICAgICAgICAgICBmb3IgbXkgJE1hcHBpbmdGaWVsZCAoIHNvcnQoIGtleXMoICV7JEN1c3RDb21wYW55TWFwUmVmfSApICkgKSB7CiAgICAgICAgICAgICAgICBpZiAoICRDdXN0b21lckNvbXBhbnlTZWFyY2hMaXN0eyAkQ3VzdENvbXBhbnlNYXBSZWYtPnskTWFwcGluZ0ZpZWxkfSB9ICkgewogICAgICAgICAgICAgICAgICAgICRTZWFyY2ggLj0gJyAnCiAgICAgICAgICAgICAgICAgICAgICAgIC4gJEN1c3RvbWVyQ29tcGFueVNlYXJjaExpc3R7ICRDdXN0Q29tcGFueU1hcFJlZi0+eyRNYXBwaW5nRmllbGR9IH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgfQoKICAgICAgICAkU2VhcmNoID1+IHMvXHMrJC8vZzsKICAgICAgICAkU2VhcmNoID1+IHMvXlxzKy8vZzsKCiAgICB9CgogICAgIyBBdXRvQ29tcGxldGUgQ0lDbGFzcwogICAgbXkgJEF1dG9Db21wbGV0ZUNvbmZpZwogICAgICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9CiAgICAgICAgLT5HZXQoJ0lUU01DSUF0dHJpYnV0ZUNvbGxlY3Rpb246OkZyb250ZW5kOjpDb21tb25TZWFyY2hBdXRvQ29tcGxldGUnKTsKCiAgICAjY3JlYXRlIHN0cmluZy4uLgogICAgbXkgJFN0cmluZyA9ICcnOwogICAgaWYgKAogICAgICAgICRBdXRvQ29tcGxldGVDb25maWcKICAgICAgICAmJiByZWYoJEF1dG9Db21wbGV0ZUNvbmZpZykgZXEgJ0hBU0gnCiAgICAgICAgJiYgJEF1dG9Db21wbGV0ZUNvbmZpZy0+e0FjdGl2ZX0KICAgICAgICApCiAgICB7CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0N1c3RvbWVyQ29tcGFueVNlYXJjaEF1dG9Db21wbGV0ZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgbWluUXVlcnlMZW5ndGggICAgICA9PiAkQXV0b0NvbXBsZXRlQ29uZmlnLT57TWluUXVlcnlMZW5ndGh9ICAgICAgfHwgMiwKICAgICAgICAgICAgICAgIHF1ZXJ5RGVsYXkgICAgICAgICAgPT4gJEF1dG9Db21wbGV0ZUNvbmZpZy0+e1F1ZXJ5RGVsYXl9ICAgICAgICAgIHx8IDAuMSwKICAgICAgICAgICAgICAgIHR5cGVBaGVhZCAgICAgICAgICAgPT4gJEF1dG9Db21wbGV0ZUNvbmZpZy0+e1R5cGVBaGVhZH0gICAgICAgICAgIHx8ICdmYWxzZScsCiAgICAgICAgICAgICAgICBtYXhSZXN1bHRzRGlzcGxheWVkID0+ICRBdXRvQ29tcGxldGVDb25maWctPntNYXhSZXN1bHRzRGlzcGxheWVkfSB8fCAyMCwKICAgICAgICAgICAgICAgIGR5bmFtaWNXaWR0aCAgICAgICAgPT4gJEF1dG9Db21wbGV0ZUNvbmZpZy0+e0R5bmFtaWNXaWR0aH0gICAgICAgIHx8IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDdXN0b21lckNvbXBhbnlTZWFyY2hJbml0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBJdGVtSUQgICAgICAgICAgICAgPT4gJEl0ZW1JZCwKICAgICAgICAgICAgICAgIEFjdGl2ZUF1dG9Db21wbGV0ZSA9PiAndHJ1ZScsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgKTsKCiAgICAgICAgJFN0cmluZwogICAgICAgICAgICA9ICckSW5jbHVkZXsiQWdlbnRDdXN0b21lckNvbXBhbnlTZWFyY2gifScKICAgICAgICAgICAgLiAnPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iJwogICAgICAgICAgICAuICRQYXJhbXtLZXl9CiAgICAgICAgICAgIC4gJyIgdmFsdWU9IicKICAgICAgICAgICAgLiAkVmFsdWUKICAgICAgICAgICAgLiAnIiBpZD0iJwogICAgICAgICAgICAuICRJdGVtSWQgLiAnU2VsZWN0ZWQnCiAgICAgICAgICAgIC4gJyIvPicKICAgICAgICAgICAgLiAnPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IicKICAgICAgICAgICAgLiAkUGFyYW17S2V5fQogICAgICAgICAgICAuICc6OlNlYXJjaCIgY2xhc3M9IicKICAgICAgICAgICAgLiAkQ2xhc3MKICAgICAgICAgICAgLiAnIiBpZD0iJwogICAgICAgICAgICAuICRJdGVtSWQKICAgICAgICAgICAgLiAnIiB2YWx1ZT0iJwogICAgICAgICAgICAuICRTZWFyY2ggLiAnIi8+JzsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTdHJpbmcKICAgICAgICAgICAgPSAnPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iJwogICAgICAgICAgICAuICRQYXJhbXtLZXl9CiAgICAgICAgICAgIC4gJyIgdmFsdWU9IicKICAgICAgICAgICAgLiAkVmFsdWUgLiAnIj4nCiAgICAgICAgICAgIC4gJzxpbnB1dCB0eXBlPSJUZXh0IiBuYW1lPSInCiAgICAgICAgICAgIC4gJFBhcmFte0tleX0KICAgICAgICAgICAgLiAnOjpTZWFyY2giIHNpemU9IicKICAgICAgICAgICAgLiAkU2l6ZQogICAgICAgICAgICAuICciIHZhbHVlPSInCiAgICAgICAgICAgIC4gJFNlYXJjaCAuICciPicgLiAnPGJyPicKICAgICAgICAgICAgLiAkU3RyaW5nT3B0aW9uCiAgICAgICAgICAgIC4gJFN0cmluZ1NlbGVjdAogICAgICAgICAgICAuICc8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSInCiAgICAgICAgICAgIC4gJFBhcmFte0tleX0KICAgICAgICAgICAgLiAnOjpCdXR0b25TZWFyY2giIHZhbHVlPSIkVGV4dHsiU2VhcmNoIn0iPicKICAgICAgICAgICAgLiAnJm5ic3A7JwogICAgICAgICAgICAuICc8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSInCiAgICAgICAgICAgIC4gJFBhcmFte0tleX0KICAgICAgICAgICAgLiAnOjpCdXR0b25DbGVhciIgdmFsdWU9IiRUZXh0eyJDbGVhciJ9Ij4nOwogICAgfQoKICAgIHJldHVybiAkU3RyaW5nOwp9Cgo9aXRlbSBTZWFyY2hGb3JtRGF0YUdldCgpCgpnZXQgc2VhcmNoIGZvcm0gZGF0YQoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hGb3JtRGF0YUdldCgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtLZXl9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBLZXkhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGZvcm0gZGF0YQogICAgI215IEBWYWx1ZXMgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0QXJyYXkoIFBhcmFtID0+ICRQYXJhbXtLZXl9ICk7CgogICAgbXkgQFNlYXJjaFZhbHVlcyA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gKTsKCiAgICByZXR1cm4gaWYgc2NhbGFyKEBTZWFyY2hWYWx1ZXMpIDwgMSB8fCAhJFNlYXJjaFZhbHVlc1swXTsKCiAgICBteSBAVmFsdWVzID0gKCk7CiAgICBmb3JlYWNoIG15ICRTZWFyY2hWYWx1ZSAoQFNlYXJjaFZhbHVlcykgewogICAgICAgIG15ICVDdXN0b21lckNvbXBhbnlMaXN0ID0gJFNlbGYtPntDdXN0b21lckNvbXBhbnlPYmplY3R9LT5DdXN0b21lckNvbXBhbnlMaXN0KAogICAgICAgICAgICBTZWFyY2ggPT4gJyonIC4gJFNlYXJjaFZhbHVlIC4gJyonLAogICAgICAgICk7CgogICAgICAgIGZvciBteSAkQ3VzdG9tZXJDb21wYW55SUQgKCBrZXlzICVDdXN0b21lckNvbXBhbnlMaXN0ICkgewogICAgICAgICAgICBwdXNoKCBAVmFsdWVzLCAkQ3VzdG9tZXJDb21wYW55SUQgKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCBzY2FsYXIoQFZhbHVlcykgPCAxIHx8ICEkVmFsdWVzWzBdICkgewogICAgICAgIEBWYWx1ZXMgPSBAU2VhcmNoVmFsdWVzOwogICAgfQoKICAgIHJldHVybiBcQFZhbHVlczsKfQoKPWl0ZW0gU2VhcmNoSW5wdXRDcmVhdGUoKQoKY3JlYXRlIGEgc2VhcmNoIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hJbnB1dENyZWF0ZSgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hJbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17S2V5fSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgS2V5IScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkU3RyaW5nID0gIjxpbnB1dCB0eXBlPVwiVGV4dFwiIG5hbWU9XCIkUGFyYW17S2V5fVwiIHNpemU9XCI2MFwiPiI7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMTAgJCAkRGF0ZTogMjAxMS0wNC0xOCAwNzo1Mzo0OSAkCgo9Y3V0Cg== IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ29uZmlnSXRlbUxheW91dEN1c3RvbWVyVXNlckNvbXBhbnkucG0gLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgRXh0ZW5zaW9ucyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMSBjLmEucC5lLiBJVCBHbWJILCBodHRwOi8vd3d3LmNhcGUtaXQuZGUKIwojIHdyaXR0ZW4vY2hhbmdlZCBieToKIyAqIFN0ZWZhbihkb3QpTWVobGlnKGF0KWNhcGUtaXQoZG90KWRlCiMgKiBUb3JzdGVuKGRvdClUaGF1KGF0KWNhcGUtaXQoZG90KWRlCiMgKiBGcmFuayhkb3QpT2JlcmVuZGVyKGF0KWNhcGUtaXQoZG90KWRlCiMKIyAtLQojICRJZDogSVRTTUNvbmZpZ0l0ZW1MYXlvdXRDdXN0b21lclVzZXJDb21wYW55LnBtLHYgMS45IDIwMTEtMDQtMTggMDg6MDg6MTMgdHRvIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTGF5b3V0Q3VzdG9tZXJVc2VyQ29tcGFueTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJVc2VyOwp1c2UgS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQ29tcGFueTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuOSAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTGF5b3V0Q3VzdG9tZXJVc2VyQ29tcGFueSAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBvZiBDdXN0b21lclVzZXJDb21wYW55IG9iamVjdHMKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW1MYXlvdXRDdXN0b21lclVzZXJDb21wYW55LT5uZXcoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKAogICAgICAgIHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCBQYXJhbU9iamVjdCBUaW1lT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBFbmNvZGVPYmplY3QpCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQogICAgJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9ICAgID0gS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyVXNlci0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntDdXN0b21lckNvbXBhbnlPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkN1c3RvbWVyQ29tcGFueS0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gT3V0cHV0U3RyaW5nQ3JlYXRlKCkKCmNyZWF0ZSBvdXRwdXQgc3RyaW5nCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPk91dHB1dFN0cmluZ0NyZWF0ZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgICAgICAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIE91dHB1dFN0cmluZ0NyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgdHJhbnNmb3JtIGFzY2lpIHRvIGh0bWwKICAgICRQYXJhbXtWYWx1ZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgVGV4dCA9PiAkUGFyYW17VmFsdWV9IHx8ICcnLAogICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICApOwoKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBGb3JtRGF0YUdldCgpCgpnZXQgZm9ybSBkYXRhIGFzIGhhc2ggcmVmZXJlbmNlCgogICAgbXkgJEZvcm1EYXRhUmVmID0gJEJhY2tlbmRPYmplY3QtPkZvcm1EYXRhR2V0KAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJUZvcm1EYXRhOwoKICAgICMgZ2V0IHNlbGVjdGVkIEN1c3RvbWVyVXNlckNvbXBhbnkKICAgICRGb3JtRGF0YXtWYWx1ZX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9ICk7CgogICAgIyBjaGVjayBzZWFyY2ggYnV0dG9uCiAgICBpZiAoICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpCdXR0b25TZWFyY2gnICkgKSB7CiAgICAgICAgJFBhcmFte0l0ZW19LT57Rm9ybX0tPnsgJFBhcmFte0tleX0gfS0+e1NlYXJjaH0KICAgICAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9IC4gJzo6U2VhcmNoJyApOwogICAgfQoKICAgICMgY2hlY2sgc2VsZWN0IGJ1dHRvbgogICAgZWxzaWYgKCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9IC4gJzo6QnV0dG9uU2VsZWN0JyApICkgewogICAgICAgICRGb3JtRGF0YXtWYWx1ZX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9IC4gJzo6U2VsZWN0JyApOwogICAgfQoKICAgICMgY2hlY2sgY2xlYXIgYnV0dG9uCiAgICBlbHNpZiAoICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpCdXR0b25DbGVhcicgKSApIHsKICAgICAgICAkRm9ybURhdGF7VmFsdWV9ID0gJyc7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyByZXNldCB2YWx1ZSBpZiBzZWFyY2ggZmllbGQgaXMgZW10eQogICAgICAgIGlmICgKICAgICAgICAgICAgISRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpTZWFyY2gnICkKICAgICAgICAgICAgJiYgZGVmaW5lZCAkRm9ybURhdGF7VmFsdWV9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRGb3JtRGF0YXtWYWx1ZX0gPSAnJzsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgcmVxdWlyZWQgb3B0aW9uCiAgICAgICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntSZXF1aXJlZH0gJiYgISRGb3JtRGF0YXtWYWx1ZX0gKSB7CiAgICAgICAgICAgICRQYXJhbXtJdGVtfS0+e0Zvcm19LT57ICRQYXJhbXtLZXl9IH0tPntJbnZhbGlkfSA9IDE7CiAgICAgICAgICAgICRGb3JtRGF0YXtJbnZhbGlkfSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBcJUZvcm1EYXRhOwp9Cgo9aXRlbSBJbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+SW5wdXRDcmVhdGUoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBWYWx1ZSA9PiAxMSwgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgSW5wdXRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFZhbHVlID0gJyc7CiAgICBpZiAoIGRlZmluZWQgJFBhcmFte1ZhbHVlfSApIHsKICAgICAgICAkVmFsdWUgPSAkUGFyYW17VmFsdWV9OwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntWYWx1ZURlZmF1bHR9ICkgewogICAgICAgICRWYWx1ZSA9ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1ZhbHVlRGVmYXVsdH07CiAgICB9CiAgICBteSAkU2l6ZSAgICAgICAgID0gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57U2l6ZX0gfHwgNTA7CiAgICBteSAkU3RyaW5nT3B0aW9uID0gJyc7CiAgICBteSAkU3RyaW5nU2VsZWN0ID0gJyc7CiAgICBteSAkQ2xhc3MgICAgICAgID0gJ1c1MHBjIEN1c3RvbWVyVXNlckNvbXBhbnlTZWFyY2gnOwogICAgbXkgJFJlcXVpcmVkICAgICA9ICRQYXJhbXtSZXF1aXJlZH0gfHwgJyc7CiAgICBteSAkSW52YWxpZCAgICAgID0gJFBhcmFte0ludmFsaWR9IHx8ICcnOwogICAgbXkgJEl0ZW1JZCAgICAgICA9ICRQYXJhbXtJdGVtSWR9IHx8ICcnOwoKICAgICMgQXV0b0NvbXBsZXRlCiAgICBteSAkQXV0b0NvbXBsZXRlQ29uZmlnCiAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0KICAgICAgICAtPkdldCgnSVRTTUNJQXR0cmlidXRlQ29sbGVjdGlvbjo6RnJvbnRlbmQ6OkNvbW1vblNlYXJjaEF1dG9Db21wbGV0ZScpOwoKICAgICNjcmVhdGUgc3RyaW5nLi4uCiAgICBteSAkU3RyaW5nID0gJyc7CiAgICBpZiAoCiAgICAgICAgJEF1dG9Db21wbGV0ZUNvbmZpZwogICAgICAgICYmIHJlZigkQXV0b0NvbXBsZXRlQ29uZmlnKSBlcSAnSEFTSCcKICAgICAgICAmJiAkQXV0b0NvbXBsZXRlQ29uZmlnLT57QWN0aXZlfQogICAgICAgICkKICAgIHsKCiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ3VzdG9tZXJVc2VyQ29tcGFueVNlYXJjaEF1dG9Db21wbGV0ZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgbWluUXVlcnlMZW5ndGggICAgICA9PiAkQXV0b0NvbXBsZXRlQ29uZmlnLT57TWluUXVlcnlMZW5ndGh9ICAgICAgfHwgMiwKICAgICAgICAgICAgICAgIHF1ZXJ5RGVsYXkgICAgICAgICAgPT4gJEF1dG9Db21wbGV0ZUNvbmZpZy0+e1F1ZXJ5RGVsYXl9ICAgICAgICAgIHx8IDAuMSwKICAgICAgICAgICAgICAgIHR5cGVBaGVhZCAgICAgICAgICAgPT4gJEF1dG9Db21wbGV0ZUNvbmZpZy0+e1R5cGVBaGVhZH0gICAgICAgICAgIHx8ICdmYWxzZScsCiAgICAgICAgICAgICAgICBtYXhSZXN1bHRzRGlzcGxheWVkID0+ICRBdXRvQ29tcGxldGVDb25maWctPntNYXhSZXN1bHRzRGlzcGxheWVkfSB8fCAyMCwKICAgICAgICAgICAgICAgIGR5bmFtaWNXaWR0aCAgICAgICAgPT4gJEF1dG9Db21wbGV0ZUNvbmZpZy0+e0R5bmFtaWNXaWR0aH0gICAgICAgIHx8IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdDdXN0b21lclVzZXJDb21wYW55U2VhcmNoSW5pdCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgSXRlbUlEICAgICAgICAgICAgID0+ICRJdGVtSWQsCiAgICAgICAgICAgICAgICBBY3RpdmVBdXRvQ29tcGxldGUgPT4gJ3RydWUnLAogICAgICAgICAgICAgICAgfQogICAgICAgICk7CgogICAgICAgICRTdHJpbmcKICAgICAgICAgICAgPSAnJEluY2x1ZGV7IkFnZW50Q3VzdG9tZXJVc2VyQ29tcGFueVNlYXJjaCJ9JwogICAgICAgICAgICAuICc8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSInCiAgICAgICAgICAgIC4gJFBhcmFte0tleX0KICAgICAgICAgICAgLiAnIiB2YWx1ZT0iJwogICAgICAgICAgICAuICRWYWx1ZQogICAgICAgICAgICAuICciIGlkPSInCiAgICAgICAgICAgIC4gJEl0ZW1JZCAuICdTZWxlY3RlZCcKICAgICAgICAgICAgLiAnIi8+JwogICAgICAgICAgICAuICc8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iJwogICAgICAgICAgICAuICRQYXJhbXtLZXl9CiAgICAgICAgICAgIC4gJzo6U2VhcmNoIiBjbGFzcz0iJwogICAgICAgICAgICAuICRDbGFzcwogICAgICAgICAgICAuICciIGlkPSInCiAgICAgICAgICAgIC4gJEl0ZW1JZAogICAgICAgICAgICAuICciIHZhbHVlPSInCiAgICAgICAgICAgIC4gJFZhbHVlIC4gJyIvPic7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU3RyaW5nCiAgICAgICAgICAgID0gJzxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IicKICAgICAgICAgICAgLiAkUGFyYW17S2V5fQogICAgICAgICAgICAuICciIHZhbHVlPSInCiAgICAgICAgICAgIC4gJFZhbHVlIC4gJyI+JwogICAgICAgICAgICAuICc8aW5wdXQgdHlwZT0iVGV4dCIgbmFtZT0iJwogICAgICAgICAgICAuICRQYXJhbXtLZXl9CiAgICAgICAgICAgIC4gJzo6U2VhcmNoIiBzaXplPSInCiAgICAgICAgICAgIC4gJFNpemUKICAgICAgICAgICAgLiAnIiB2YWx1ZT0iJwogICAgICAgICAgICAuICRWYWx1ZSAuICciPicgLiAnPGJyPicKICAgICAgICAgICAgLiAkU3RyaW5nT3B0aW9uCiAgICAgICAgICAgIC4gJFN0cmluZ1NlbGVjdAogICAgICAgICAgICAuICc8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSInCiAgICAgICAgICAgIC4gJFBhcmFte0tleX0KICAgICAgICAgICAgLiAnOjpCdXR0b25TZWFyY2giIHZhbHVlPSIkVGV4dHsiU2VhcmNoIn0iPicKICAgICAgICAgICAgLiAnJm5ic3A7JwogICAgICAgICAgICAuICc8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSInCiAgICAgICAgICAgIC4gJFBhcmFte0tleX0KICAgICAgICAgICAgLiAnOjpCdXR0b25DbGVhciIgdmFsdWU9IiRUZXh0eyJDbGVhciJ9Ij4nOwogICAgfQoKICAgIHJldHVybiAkU3RyaW5nOwp9Cgo9aXRlbSBTZWFyY2hGb3JtRGF0YUdldCgpCgpnZXQgc2VhcmNoIGZvcm0gZGF0YQoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hGb3JtRGF0YUdldCgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtLZXl9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBLZXkhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGZvcm0gZGF0YQogICAgI215IEBWYWx1ZXMgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0QXJyYXkoIFBhcmFtID0+ICRQYXJhbXtLZXl9ICk7CiAgICBteSBAU2VhcmNoVmFsdWVzID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSApOwoKICAgIG15IEBWYWx1ZXMgPSAoKTsKICAgIGZvciBteSAkU2VhcmNoVmFsdWUgKEBTZWFyY2hWYWx1ZXMpIHsKICAgICAgICBuZXh0IGlmICEkU2VhcmNoVmFsdWU7CgogICAgICAgICMgc3RhcnQgc2VhcmNoCiAgICAgICAgbXkgJUN1c3RvbWVyVXNlclNlYXJjaExpc3QgPSAkU2VsZi0+e0N1c3RvbWVyVXNlck9iamVjdH0tPkN1c3RvbWVyU2VhcmNoKAogICAgICAgICAgICBTZWFyY2ggPT4gJFNlYXJjaFZhbHVlLAogICAgICAgICk7CiAgICAgICAgZm9yIG15ICRrZXlzICgga2V5cyAlQ3VzdG9tZXJVc2VyU2VhcmNoTGlzdCApIHsKICAgICAgICAgICAgbXkgQEN1c3RvbWVySURzID0gJFNlbGYtPntDdXN0b21lclVzZXJPYmplY3R9LT5DdXN0b21lcklEcygKICAgICAgICAgICAgICAgIFVzZXIgPT4gJGtleXMsCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBwdXNoKCBAVmFsdWVzLCAkQ3VzdG9tZXJJRHNbMF0gKTsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCBzY2FsYXIoQFZhbHVlcykgPCAxIHx8ICEkVmFsdWVzWzBdICkgewogICAgICAgIEBWYWx1ZXMgPSBAU2VhcmNoVmFsdWVzOwogICAgfQoKICAgIHJldHVybiBcQFZhbHVlczsKfQoKPWl0ZW0gU2VhcmNoSW5wdXRDcmVhdGUoKQoKY3JlYXRlIGEgc2VhcmNoIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hJbnB1dENyZWF0ZSgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hJbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17S2V5fSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgS2V5IScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkU3RyaW5nID0gIjxpbnB1dCB0eXBlPVwiVGV4dFwiIG5hbWU9XCIkUGFyYW17S2V5fVwiIHNpemU9XCI2MFwiPiI7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuOSAkICREYXRlOiAyMDExLTA0LTE4IDA4OjA4OjEzICQKCj1jdXQK IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ29uZmlnSXRlbUxheW91dER1bW15WC5wbSAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQojIGJhc2VkIG9uOiBJVFNNQ29uZmlnSXRlbUxheW91dER1bW15LnBtLCBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgRXh0ZW5zaW9ucyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMSBjLmEucC5lLiBJVCBHbWJILCBodHRwOi8vd3d3LmNhcGUtaXQuZGUKIwojIHdyaXR0ZW4vZWRpdGVkIGJ5OgojICogTWFydGluKGRvdClCYWx6YXJlayhhdCljYXBlKGRhc2gpaXQoZG90KWRlCiMKIyAtLQojIGJhc2VkIHVwb24gSVRTTUNvbmZpZ0l0ZW1MYXlvdXREdW1teS5wbSAtIDEuOCAyMDA4LzA0LzAzIGJ5IG1oCiMgJElkOiBJVFNNQ29uZmlnSXRlbUxheW91dER1bW15WC5wbSx2IDEuNCAyMDExLTExLTE0IDEyOjU1OjQwIGRkb2VyZmZlbCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbUxheW91dER1bW15WDsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNCAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTGF5b3V0RHVtbXkgLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGxheW91dCBmdW5jdGlvbnMgb2YgZHVtbXkgb2JqZWN0cwoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbUxheW91dER1bW15LT5uZXcoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgIyBjYXBlSVQKICAgICNmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IEVuY29kZU9iamVjdCkpIHsKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgRW5jb2RlT2JqZWN0IFBhcmFtT2JqZWN0KSkgewoKICAgICAgICAjIEVPIGNhcGVJVAoKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIE91dHB1dFN0cmluZ0NyZWF0ZSgpCgpjcmVhdGUgb3V0cHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5PdXRwdXRTdHJpbmdDcmVhdGUoKTsKCj1jdXQKCnN1YiBPdXRwdXRTdHJpbmdDcmVhdGUgewogICAgcmV0dXJuICcgJzsKfQoKPWl0ZW0gRm9ybURhdGFHZXQoKQoKZ2V0IGZvcm0gZGF0YSBhcyBoYXNoIHJlZmVyZW5jZQoKICAgIG15ICRGb3JtRGF0YVJlZiA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtRGF0YUdldCgpOwoKPWN1dAoKc3ViIEZvcm1EYXRhR2V0IHsKCiAgICAjIGNhcGVJVAogICAgI3JldHVybiB7fTsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIklUU01Db25maWdJdGVtTGF5b3V0RHVtbXlYOiBOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgZ2V0IGZvcm0gZGF0YQogICAgbXkgJUZvcm1EYXRhOwogICAgJEZvcm1EYXRhe1ZhbHVlfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gKTsKICAgIHJldHVybiBcJUZvcm1EYXRhOwoKICAgICMgRU8gY2FwZUlUCn0KCj1pdGVtIElucHV0Q3JlYXRlKCkKCmNyZWF0ZSBhIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5JbnB1dENyZWF0ZSgpOwoKPWN1dAoKc3ViIElucHV0Q3JlYXRlIHsKCiAgICAjIGNhcGVJVAogICAgI3JldHVybiAnJm5ic3A7JzsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiSVRTTUNvbmZpZ0l0ZW1MYXlvdXREdW1teVg6IE5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFN0cmluZwogICAgICAgID0gJzxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IicKICAgICAgICAuICRQYXJhbXtLZXl9CiAgICAgICAgLiAnIiB2YWx1ZT0iJwogICAgICAgIC4gJFBhcmFte0l0ZW19LT57S2V5fQogICAgICAgIC4gJyIvPic7CgogICAgcmV0dXJuICRTdHJpbmc7CgogICAgIyBFTyBjYXBlSVQKfQoKPWl0ZW0gU2VhcmNoRm9ybURhdGFHZXQoKQoKZ2V0IHNlYXJjaCBmb3JtIGRhdGEKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+U2VhcmNoRm9ybURhdGFHZXQoKTsKCj1jdXQKCnN1YiBTZWFyY2hGb3JtRGF0YUdldCB7CiAgICByZXR1cm4gW107Cn0KCj1pdGVtIFNlYXJjaElucHV0Q3JlYXRlKCkKCmNyZWF0ZSBhIHNlcmNoIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hJbnB1dENyZWF0ZSgpOwoKPWN1dAoKc3ViIFNlYXJjaElucHV0Q3JlYXRlIHsKICAgIHJldHVybiAnJm5ic3A7JzsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS40ICQgJERhdGU6IDIwMTEtMTEtMTQgMTI6NTU6NDAgJAoKPWN1dAo= IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ29uZmlnSXRlbUxheW91dEVuY3J5cHRlZFRleHQucG0gLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMSBjLmEucC5lLiBJVCBHbWJILCBodHRwOi8vd3d3LmNhcGUtaXQuZGUKIwojIHdyaXR0ZW4vY2hhbmdlZCBieToKIyAqIFN0ZWZhbihkb3QpTWVobGlnKGF0KWNhcGUoZGFzaClpdChkb3QpZGUKIyAqIE1hcnRpbihkb3QpQmFsemFyZWsoYXQpY2FwZShkYXNoKWl0KGRvdClkZQojCiMgLS0KIyAkSWQ6IElUU01Db25maWdJdGVtTGF5b3V0RW5jcnlwdGVkVGV4dC5wbSx2IDEuNCAyMDExLTExLTE0IDEyOjU1OjUyIGRkb2VyZmZlbCBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW1MYXlvdXRFbmNyeXB0ZWRUZXh0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS40ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW1MYXlvdXRUZXh0IC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBsYXlvdXQgZnVuY3Rpb25zIG9mIHRleHQgb2JqZWN0cwoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbUxheW91dFRleHQtPm5ldygKICAgICAgICAlUGFyYW0sCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAoCiAgICAgICAgcXcoQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCBQYXJhbU9iamVjdCBMYXlvdXRPYmplY3QgREJPYmplY3QgVXNlcklEKQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9CiAgICAgICAgICAgIHx8IGRpZSAiSVRTTUNvbmZpZ0l0ZW1MYXlvdXRFbmNyeXB0ZWRUZXh0OiBHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gT3V0cHV0U3RyaW5nQ3JlYXRlKCkKCmNyZWF0ZSBvdXRwdXQgc3RyaW5nCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPk91dHB1dFN0cmluZ0NyZWF0ZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgT3V0cHV0U3RyaW5nQ3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtJdGVtfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgSXRlbSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIGlmICggIWRlZmluZWQgJFBhcmFte1ZhbHVlfSApIHsKICAgICAgICAkUGFyYW17VmFsdWV9ID0gJyc7CiAgICB9CgogICAgbXkgJEdyb3Vwc1JlZiA9ICRQYXJhbXtJdGVtfS0+e0dyb3VwfTsKICAgIG15IEBHcm91cHMgICAgPSAoKTsKICAgIGlmICggJEdyb3Vwc1JlZiAmJiByZWYgJEdyb3Vwc1JlZiBlcSAnSEFTSCcgKSB7CiAgICAgICAgQEdyb3VwcyA9IGtleXMgJXskR3JvdXBzUmVmfTsKICAgIH0KCiAgICBteSAkQWNjZXNzID0gMDsKICAgIGZvciBteSAkR3JvdXAgKEBHcm91cHMpIHsKCiAgICAgICAgbmV4dAogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICEkU2VsZi0+e0xheW91dE9iamVjdH0tPnsiVXNlcklzR3JvdXBbJEdyb3VwXSJ9CiAgICAgICAgICAgIHx8ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+eyJVc2VySXNHcm91cFskR3JvdXBdIn0gbmUgJ1llcycKICAgICAgICAgICAgKTsKCiAgICAgICAgJEFjY2VzcyA9IDE7CiAgICAgICAgbGFzdDsKICAgIH0KCiAgICBpZiAoJEFjY2VzcykgewogICAgICAgICRQYXJhbXtWYWx1ZX0gPSAkU2VsZi0+X0RlY3J5cHQoICRQYXJhbXtWYWx1ZX0gKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIHdoaWxlICggJFBhcmFte1ZhbHVlfSA9fiAvW2EtekEtWjAtOV9dLyApIHsKICAgICAgICAgICAgJFBhcmFte1ZhbHVlfSA9fiBzL1thLXpBLVowLTlfXS8qLzsKICAgICAgICB9CiAgICB9CgogICAgIyB0cmFuc2xhdGUKICAgIGlmICggJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VHJhbnNsYXRpb259ICkgewogICAgICAgICRQYXJhbXtWYWx1ZX0gPQogICAgICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCggJFBhcmFte1ZhbHVlfSApOwogICAgfQoKICAgIG15ICRMaW5rRmVhdHVyZSAgICA9IDE7CiAgICBteSAkSFRNTFJlc3VsdE1vZGUgPSAxOwoKICAgICMgZG8gbm90IHRyYW5zZm9ybSBsaW5rcyBpbiBwcmludCB2aWV3CiAgICBpZiAoICRQYXJhbXtQcmludH0gKSB7CiAgICAgICAgJExpbmtGZWF0dXJlID0gMDsKCiAgICAgICAgIyBkbyBub3QgY29udmVydCB3aGl0ZXNwYWNlIGFuZCBuZXdsaW5lcyBpbiBQREYgbW9kZQogICAgICAgIGlmICggJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ1BERicpICkgewogICAgICAgICAgICAkSFRNTFJlc3VsdE1vZGUgPSAwOwogICAgICAgIH0KICAgIH0KCiAgICAjIHRyYW5zZm9ybSBhc2NpaSB0byBodG1sCiAgICAkUGFyYW17VmFsdWV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgIFRleHQgICAgICAgICAgID0+ICRQYXJhbXtWYWx1ZX0sCiAgICAgICAgSFRNTFJlc3VsdE1vZGUgPT4gJEhUTUxSZXN1bHRNb2RlLAogICAgICAgIExpbmtGZWF0dXJlICAgID0+ICRMaW5rRmVhdHVyZSwKICAgICk7CgogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEZvcm1EYXRhR2V0KCkKCmdldCBmb3JtIGRhdGEgYXMgaGFzaCByZWZlcmVuY2UKCiAgICBteSAkRm9ybURhdGFSZWYgPSAkQmFja2VuZE9iamVjdC0+Rm9ybURhdGFHZXQoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBGb3JtRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJUZvcm1EYXRhOwoKICAgICMgZ2V0IGZvcm0gZGF0YQogICAgJEZvcm1EYXRhe1ZhbHVlfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gKTsKCiAgICBteSAkR3JvdXBzUmVmID0gJFBhcmFte0l0ZW19LT57R3JvdXB9OwogICAgbXkgQEdyb3VwcyAgICA9ICgpOwogICAgaWYgKCAkR3JvdXBzUmVmICYmIHJlZiAkR3JvdXBzUmVmIGVxICdIQVNIJyApIHsKICAgICAgICBAR3JvdXBzID0ga2V5cyAleyRHcm91cHNSZWZ9OwogICAgfQogICAgbXkgJEFjY2VzcyA9IDA7CiAgICBmb3IgbXkgJEdyb3VwIChAR3JvdXBzKSB7CgogICAgICAgIG5leHQKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAhJFNlbGYtPntMYXlvdXRPYmplY3R9LT57IlVzZXJJc0dyb3VwWyRHcm91cF0ifQogICAgICAgICAgICB8fCAkU2VsZi0+e0xheW91dE9iamVjdH0tPnsiVXNlcklzR3JvdXBbJEdyb3VwXSJ9IG5lICdZZXMnCiAgICAgICAgICAgICk7CgogICAgICAgICRBY2Nlc3MgPSAxOwogICAgICAgIGxhc3Q7CiAgICB9CiAgICBpZiAoJEFjY2VzcykgewoKICAgICAgICAjIGRvIGVuY3J5cHRpb24KICAgICAgICAkRm9ybURhdGF7VmFsdWV9ID0gJFNlbGYtPl9FbmNyeXB0KCAkRm9ybURhdGF7VmFsdWV9ICk7CiAgICB9CgogICAgIyBzZXQgaW52YWxpZCBwYXJhbQogICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntSZXF1aXJlZH0gJiYgISRGb3JtRGF0YXtWYWx1ZX0gKSB7CiAgICAgICAgJEZvcm1EYXRhe0ludmFsaWR9ID0gMTsKICAgICAgICAkUGFyYW17SXRlbX0tPntGb3JtfS0+eyAkUGFyYW17S2V5fSB9LT57SW52YWxpZH0gPSAxOwogICAgfQoKICAgIHJldHVybiBcJUZvcm1EYXRhOwp9Cgo9aXRlbSBJbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+SW5wdXRDcmVhdGUoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBWYWx1ZSA9PiAxMSwgICAgICAgICAgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgSW5wdXRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRWYWx1ZSA9ICRQYXJhbXtWYWx1ZX07CiAgICBpZiAoICFkZWZpbmVkICRQYXJhbXtWYWx1ZX0gKSB7CiAgICAgICAgJFZhbHVlID0gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VmFsdWVEZWZhdWx0fSB8fCAnJzsKICAgIH0KCiAgICBteSAkQ2xhc3MgICAgPSAnJzsKICAgIG15ICRTaXplICAgICA9ICdXNTBwYyc7CiAgICBteSAkUmVxdWlyZWQgPSAkUGFyYW17UmVxdWlyZWR9OwogICAgbXkgJEludmFsaWQgID0gJFBhcmFte0ludmFsaWR9OwogICAgbXkgJEl0ZW1JZCAgID0gJFBhcmFte0l0ZW1JZH07CgogICAgaWYgKCRSZXF1aXJlZCkgewogICAgICAgICRDbGFzcyAuPSAnIFZhbGlkYXRlX1JlcXVpcmVkJzsKICAgIH0KCiAgICBpZiAoJEludmFsaWQpIHsKICAgICAgICAkQ2xhc3MgLj0gJyBTZXJ2ZXJFcnJvcic7CiAgICB9CiAgICAkQ2xhc3MgLj0gJyAnIC4gJFNpemU7CiAgICBteSAkU3RyaW5nID0gIjxpbnB1dCB0eXBlPVwiaW5wdXRcIiBuYW1lPVwiJFBhcmFte0tleX1cIiBjbGFzcz1cIiRDbGFzc1wiICI7CgogICAgaWYgKCRJdGVtSWQpIHsKICAgICAgICAkU3RyaW5nIC49ICJpZD1cIiRJdGVtSWRcIiAiOwogICAgfQoKICAgIG15ICRHcm91cHNSZWYgPSAkUGFyYW17SXRlbX0tPntHcm91cH07CiAgICBteSBAR3JvdXBzICAgID0gKCk7CiAgICBpZiAoICRHcm91cHNSZWYgJiYgcmVmICRHcm91cHNSZWYgZXEgJ0hBU0gnICkgewogICAgICAgIEBHcm91cHMgPSBrZXlzICV7JEdyb3Vwc1JlZn07CiAgICB9CgogICAgbXkgJEFjY2VzcyA9IDA7CiAgICBmb3IgbXkgJEdyb3VwIChAR3JvdXBzKSB7CgogICAgICAgIG5leHQKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAhJFNlbGYtPntMYXlvdXRPYmplY3R9LT57IlVzZXJJc0dyb3VwWyRHcm91cF0ifQogICAgICAgICAgICB8fCAkU2VsZi0+e0xheW91dE9iamVjdH0tPnsiVXNlcklzR3JvdXBbJEdyb3VwXSJ9IG5lICdZZXMnCiAgICAgICAgICAgICk7CgogICAgICAgICRBY2Nlc3MgPSAxOwogICAgICAgIGxhc3Q7CiAgICB9CgogICAgIyBjaGVjayBpZiB2YWx1ZSBjYW4gYmUgZWRpdGVkIGFuZCBpZiBzbyBkZWNyeXB0IHZhbHVlCiAgICBpZiAoICEkQWNjZXNzICkgewogICAgICAgICRTdHJpbmcgLj0gInJlYWRvbmx5PVwicmVhZG9ubHlcIiAiOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFZhbHVlID0gJFNlbGYtPl9EZWNyeXB0KCRWYWx1ZSk7CiAgICB9CgogICAgJFN0cmluZyAuPSAidmFsdWU9XCIkVmFsdWVcIiAiOwoKICAgICMgYWRkIG1heGltdW0gbGVuZ3RoCiAgICBpZiAoICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e01heExlbmd0aH0gKSB7CiAgICAgICAgJFN0cmluZyAuPSAibWF4bGVuZ3RoPVwiJFBhcmFte0l0ZW19LT57SW5wdXR9LT57TWF4TGVuZ3RofVwiICI7CiAgICB9CgogICAgJFN0cmluZyAuPSAnLz4gJzsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKPWl0ZW0gU2VhcmNoRm9ybURhdGFHZXQoKQoKZ2V0IHNlYXJjaCBmb3JtIGRhdGEKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+U2VhcmNoRm9ybURhdGFHZXQoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hGb3JtRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17S2V5fSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgS2V5IScsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyBnZXQgZm9ybSBkYXRhCiAgICBteSAkVmFsdWU7CiAgICBpZiAoICRQYXJhbXtWYWx1ZX0gKSB7CiAgICAgICAgJFZhbHVlID0gJFBhcmFte1ZhbHVlfTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRWYWx1ZSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gKTsKICAgIH0KICAgIHJldHVybiAkVmFsdWU7Cn0KCj1pdGVtIFNlYXJjaElucHV0Q3JlYXRlKCkKCmNyZWF0ZSBhIHNlYXJjaCBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+U2VhcmNoSW5wdXRDcmVhdGUoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hJbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFZhbHVlID0gJFNlbGYtPlNlYXJjaEZvcm1EYXRhR2V0KCVQYXJhbSk7CiAgICBpZiAoICFkZWZpbmVkICRWYWx1ZSApIHsKICAgICAgICAkVmFsdWUgPSAnJzsKICAgIH0KCiAgICBteSAkU3RyaW5nID0KICAgICAgICBxcXs8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0iJFBhcmFte0tleX0iIHZhbHVlPSIkVmFsdWUiIGNsYXNzPSJXNTBwYyIgPn07CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCnN1YiBfRGVjcnlwdCB7CiAgICBteSAoICRTZWxmLCAkUHcgKSA9IEBfOwoKICAgIHJldHVybiAnJyBpZiAhJFB3OwoKICAgIG15ICRMZW5ndGggPSBsZW5ndGgoJFB3KSAqIDQ7CiAgICAkUHcgPSBwYWNrICJoJExlbmd0aCIsICRQdzsKICAgICRQdyA9IHVucGFjayAiQiRMZW5ndGgiLCAkUHc7CiAgICAkUHcgPX4gcy8xL0EvZzsKICAgICRQdyA9fiBzLzAvMS9nOwogICAgJFB3ID1+IHMvQS8wL2c7CiAgICAkUHcgPSBwYWNrICJCJExlbmd0aCIsICRQdzsKCiAgICByZXR1cm4gJFB3Owp9CgpzdWIgX0VuY3J5cHQgewogICAgbXkgKCAkU2VsZiwgJFB3ICkgPSBAXzsKCiAgICByZXR1cm4gJycgaWYgISRQdzsKCiAgICBteSAkTGVuZ3RoID0gbGVuZ3RoKCRQdykgKiA4OwogICAgY2hvbXAgJFB3OwoKICAgICMgZ2V0IGJpdCBjb2RlCiAgICBteSAkVCA9IHVucGFjayggIkIkTGVuZ3RoIiwgJFB3ICk7CgogICAgIyBjcnlwdCBiaXQgY29kZQogICAgJFQgPX4gcy8xL0EvZzsKICAgICRUID1+IHMvMC8xL2c7CiAgICAkVCA9fiBzL0EvMC9nOwoKICAgICMgZ2V0IGFzY2lpIGNvZGUKICAgICRUID0gcGFjayggIkIkTGVuZ3RoIiwgJFQgKTsKCiAgICAjIGdldCBoZXggY29kZQogICAgbXkgJEggPSB1bnBhY2soICJoJExlbmd0aCIsICRUICk7CgogICAgcmV0dXJuICRIOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKEw8aHR0cDovL290cnMub3JnLz4pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgTDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQ+LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS40ICQgJERhdGU6IDIwMTEtMTEtMTQgMTI6NTU6NTIgJAoKPWN1dAo= IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ29uZmlnSXRlbUxheW91dFVzZXIucG0gLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMgQ29weXJpZ2h0IChDKSAyMDA2LTIwMTEgYy5hLnAuZS4gSVQgR21iSCwgaHR0cDovL3d3dy5jYXBlLWl0LmRlLwojCiMgd3JpdHRlbi9jaGFuZ2VkIGJ5OiAKIyBTdGVmYW4gTWVobGlnCiMgLS0KIyAkSWQ6IElUU01Db25maWdJdGVtTGF5b3V0VXNlci5wbSx2IDEuMTAgMjAxMS0wMy0zMCAxMzoxMjo1NyBmb2JlciBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbUxheW91dFVzZXI7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OlVzZXI7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEwICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW1MYXlvdXRVc2VyIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBsYXlvdXQgZnVuY3Rpb25zIG9mIFVzZXIgb2JqZWN0cwoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbUxheW91dFVzZXItPm5ldygKICAgICAgICAlUGFyYW0sCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFBhcmFtT2JqZWN0IFRpbWVPYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IEVuY29kZU9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KICAgICRTZWxmLT57VXNlck9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6VXNlci0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gT3V0cHV0U3RyaW5nQ3JlYXRlKCkKCmNyZWF0ZSBvdXRwdXQgc3RyaW5nCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPk91dHB1dFN0cmluZ0NyZWF0ZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgICAgICAgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIE91dHB1dFN0cmluZ0NyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgdHJhbnNmb3JtIGFzY2lpIHRvIGh0bWwKICAgICRQYXJhbXtWYWx1ZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgVGV4dCA9PiAkUGFyYW17VmFsdWV9IHx8ICcnLAogICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICApOwoKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBGb3JtRGF0YUdldCgpCgpnZXQgZm9ybSBkYXRhIGFzIGhhc2ggcmVmZXJlbmNlCgogICAgbXkgJEZvcm1EYXRhUmVmID0gJEJhY2tlbmRPYmplY3QtPkZvcm1EYXRhR2V0KAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJUZvcm1EYXRhOwoKICAgICMgZ2V0IHNlbGVjdGVkIHVzZXIKICAgICRGb3JtRGF0YXtWYWx1ZX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9ICk7CgogICAgIyBjaGVjayBzZWFyY2ggYnV0dG9uCiAgICBpZiAoICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpCdXR0b25TZWFyY2gnICkgKSB7CiAgICAgICAgJFBhcmFte0l0ZW19LT57Rm9ybX0tPnsgJFBhcmFte0tleX0gfS0+e1NlYXJjaH0KICAgICAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9IC4gJzo6U2VhcmNoJyApOwogICAgfQoKICAgICMgY2hlY2sgc2VsZWN0IGJ1dHRvbgogICAgZWxzaWYgKCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9IC4gJzo6QnV0dG9uU2VsZWN0JyApICkgewogICAgICAgICRGb3JtRGF0YXtWYWx1ZX0gPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9IC4gJzo6U2VsZWN0JyApOwogICAgfQoKICAgICMgY2hlY2sgY2xlYXIgYnV0dG9uCiAgICBlbHNpZiAoICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpCdXR0b25DbGVhcicgKSApIHsKICAgICAgICAkRm9ybURhdGF7VmFsdWV9ID0gJyc7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgIyByZXNldCB2YWx1ZSBpZiBzZWFyY2ggZmllbGQgaXMgZW10eQogICAgICAgIGlmICgKICAgICAgICAgICAgISRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpTZWFyY2gnICkKICAgICAgICAgICAgJiYgZGVmaW5lZCAkRm9ybURhdGF7VmFsdWV9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRGb3JtRGF0YXtWYWx1ZX0gPSAnJzsKICAgICAgICB9CgogICAgICAgICMgY2hlY2sgcmVxdWlyZWQgb3B0aW9uCiAgICAgICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntSZXF1aXJlZH0gJiYgISRGb3JtRGF0YXtWYWx1ZX0gKSB7CiAgICAgICAgICAgICRQYXJhbXtJdGVtfS0+e0Zvcm19LT57ICRQYXJhbXtLZXl9IH0tPntJbnZhbGlkfSA9IDE7CiAgICAgICAgICAgICRGb3JtRGF0YXtJbnZhbGlkfSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBcJUZvcm1EYXRhOwp9Cgo9aXRlbSBJbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+SW5wdXRDcmVhdGUoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBWYWx1ZSA9PiAxMSwgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgSW5wdXRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CiAKICAgIG15ICRWYWx1ZSA9ICcnOwogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtWYWx1ZX0gKSB7CiAgICAgICAgJFZhbHVlID0gJFBhcmFte1ZhbHVlfTsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VmFsdWVEZWZhdWx0fSApIHsKICAgICAgICAkVmFsdWUgPSAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntWYWx1ZURlZmF1bHR9OwogICAgfQogICAgbXkgJFNpemUgICAgICAgICA9ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1NpemV9IHx8IDUwOwogICAgbXkgJFN0cmluZ09wdGlvbiA9ICcnOwogICAgbXkgJFN0cmluZ1NlbGVjdCA9ICcnOwogICAgbXkgJENsYXNzICAgID0gJ1c1MHBjIEFnZW50VXNlclNlYXJjaCc7CiAgICBteSAkU2VhcmNoICAgPSAnJzsKICAgIG15ICRSZXF1aXJlZCA9ICRQYXJhbXtSZXF1aXJlZH0gfHwgJyc7CiAgICBteSAkSW52YWxpZCAgPSAkUGFyYW17SW52YWxpZH0gfHwgJyc7CiAgICBteSAkSXRlbUlkICAgPSAkUGFyYW17SXRlbUlkfSB8fCAnJzsKCiAgICBpZiAoJFJlcXVpcmVkKSB7CiAgICAgICAgJENsYXNzIC49ICcgVmFsaWRhdGVfUmVxdWlyZWQnOwogICAgfQoKICAgIGlmICgkSW52YWxpZCkgewogICAgICAgICRDbGFzcyAuPSAnIFNlcnZlckVycm9yJzsKICAgIH0KCiAgICAjIGNyZWF0ZSBVc2VyIHN0cmluZwogICAgaWYgKCRWYWx1ZSkgewoKICAgICAgICAjIGdldCBVc2VyIGRhdGEKICAgICAgICBteSAlVXNlclNlYXJjaExpc3QgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICAgICAgVXNlcklEID0+ICRWYWx1ZSwKICAgICAgICApOwogICAgICAgIG15ICRVc2VyTmFtZSA9ICcnOwogICAgICAgIGlmICggJVVzZXJTZWFyY2hMaXN0ICkgewogICAgICAgICAgICAkVXNlck5hbWUgPSAnIicuJFVzZXJTZWFyY2hMaXN0e1VzZXJGaXJzdG5hbWV9LicgJy4kVXNlclNlYXJjaExpc3R7VXNlckxhc3RuYW1lfS4nIiA8Jy4kVXNlclNlYXJjaExpc3R7VXNlckVtYWlsfS4nPic7CiAgICAgICAgfQogICAgICAgICMgdHJhbnNmb3JtIGFzY2lpIHRvIGh0bWwgICAgICAgCiAgICAgICAgJFNlYXJjaCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCgKICAgICAgICAgICAgVGV4dCA9PiAkVXNlck5hbWUgfHwgJycsCiAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICBteSAkQXV0b0NvbXBsZXRlQ29uZmlnCiAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTUNJQXR0cmlidXRlQ29sbGVjdGlvbjo6RnJvbnRlbmQ6OkNvbW1vblNlYXJjaEF1dG9Db21wbGV0ZScpOwoKICAgICNjcmVhdGUgc3RyaW5nLi4uCiAgICBteSAkU3RyaW5nID0gJyc7CiAgICBpZiAoJEF1dG9Db21wbGV0ZUNvbmZpZyAmJiByZWYoJEF1dG9Db21wbGV0ZUNvbmZpZykgZXEgJ0hBU0gnICYmICRBdXRvQ29tcGxldGVDb25maWctPntBY3RpdmV9KSB7CiAgICAKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdBZ2VudFVzZXJTZWFyY2hBdXRvQ29tcGxldGUnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIG1pblF1ZXJ5TGVuZ3RoICAgICAgPT4gJEF1dG9Db21wbGV0ZUNvbmZpZy0+e01pblF1ZXJ5TGVuZ3RofSAgICAgIHx8IDIsCiAgICAgICAgICAgICAgICBxdWVyeURlbGF5ICAgICAgICAgID0+ICRBdXRvQ29tcGxldGVDb25maWctPntRdWVyeURlbGF5fSAgICAgICAgICB8fCAwLjEsCiAgICAgICAgICAgICAgICB0eXBlQWhlYWQgICAgICAgICAgID0+ICRBdXRvQ29tcGxldGVDb25maWctPntUeXBlQWhlYWR9ICAgICAgICAgICB8fCAnZmFsc2UnLAogICAgICAgICAgICAgICAgbWF4UmVzdWx0c0Rpc3BsYXllZCA9PiAkQXV0b0NvbXBsZXRlQ29uZmlnLT57TWF4UmVzdWx0c0Rpc3BsYXllZH0gfHwgMjAsCiAgICAgICAgICAgICAgICBkeW5hbWljV2lkdGggICAgICAgID0+ICRBdXRvQ29tcGxldGVDb25maWctPntEeW5hbWljV2lkdGh9ICAgICAgICB8fCAxLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQWdlbnRVc2VyU2VhcmNoSW5pdCcsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgSXRlbUlEICAgICAgICAgICAgID0+ICRJdGVtSWQsCiAgICAgICAgICAgICAgICBBY3RpdmVBdXRvQ29tcGxldGUgPT4gJ3RydWUnLAogICAgICAgICAgICAgICAgfQogICAgICAgICk7CgogICAgICAgICMgY3JlYXRlIHN0cmluZwogICAgICAgICRTdHJpbmcKICAgICAgICAgICAgPSAnJEluY2x1ZGV7IkFnZW50VXNlclNlYXJjaCJ9JwogICAgICAgICAgICAuJzxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IicKICAgICAgICAgICAgLiAkUGFyYW17S2V5fQogICAgICAgICAgICAuICciIHZhbHVlPSInCiAgICAgICAgICAgIC4gJFZhbHVlCiAgICAgICAgICAgIC4gJyIgaWQ9IicKICAgICAgICAgICAgLiAkSXRlbUlkIC4gJ1NlbGVjdGVkJwogICAgICAgICAgICAuICciLz4nCiAgICAgICAgICAgIC4gJzxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSInCiAgICAgICAgICAgIC4gJFBhcmFte0tleX0KICAgICAgICAgICAgLiAnOjpTZWFyY2giIGNsYXNzPSInCiAgICAgICAgICAgIC4gJENsYXNzCiAgICAgICAgICAgIC4gJyIgaWQ9IicKICAgICAgICAgICAgLiAkSXRlbUlkCiAgICAgICAgICAgIC4gJyIgdmFsdWU9IicKICAgICAgICAgICAgLiAkU2VhcmNoIC4gJyIvPic7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU3RyaW5nCiAgICAgICAgICAgID0gJzxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9IicKICAgICAgICAgICAgLiAkUGFyYW17S2V5fQogICAgICAgICAgICAuICciIHZhbHVlPSInCiAgICAgICAgICAgIC4gJFZhbHVlIC4gJyI+JwogICAgICAgICAgICAuICc8aW5wdXQgdHlwZT0iVGV4dCIgbmFtZT0iJwogICAgICAgICAgICAuICRQYXJhbXtLZXl9CiAgICAgICAgICAgIC4gJzo6U2VhcmNoIiBzaXplPSInCiAgICAgICAgICAgIC4gJFNpemUKICAgICAgICAgICAgLiAnIiB2YWx1ZT0iJwogICAgICAgICAgICAuICRTZWFyY2ggLiAnIj4nIC4gJzxicj4nCiAgICAgICAgICAgIC4gJFN0cmluZ09wdGlvbgogICAgICAgICAgICAuICRTdHJpbmdTZWxlY3QKICAgICAgICAgICAgLiAnPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iJwogICAgICAgICAgICAuICRQYXJhbXtLZXl9CiAgICAgICAgICAgIC4gJzo6QnV0dG9uU2VhcmNoIiB2YWx1ZT0iJFRleHR7IlNlYXJjaCJ9Ij4nCiAgICAgICAgICAgIC4gJyZuYnNwOycKICAgICAgICAgICAgLiAnPGlucHV0IGNsYXNzPSJidXR0b24iIHR5cGU9InN1Ym1pdCIgbmFtZT0iJwogICAgICAgICAgICAuICRQYXJhbXtLZXl9CiAgICAgICAgICAgIC4gJzo6QnV0dG9uQ2xlYXIiIHZhbHVlPSIkVGV4dHsiQ2xlYXIifSI+JzsKICAgIH0KCiAgICByZXR1cm4gJFN0cmluZzsKfQoKPWl0ZW0gU2VhcmNoRm9ybURhdGFHZXQoKQoKZ2V0IHNlYXJjaCBmb3JtIGRhdGEKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+U2VhcmNoRm9ybURhdGFHZXQoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hGb3JtRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17S2V5fSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgS2V5IScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjIGdldCBmb3JtIGRhdGEKICAgIG15IEBVc2VyTGlzdDsKICAgIG15IEBTZWFyY2hWYWx1ZXMgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9ICk7CiAgICBmb3IgbXkgJFNlYXJjaFZhbHVlIChAU2VhcmNoVmFsdWVzKSB7CiAgICAgICAgbmV4dCBpZiAhJFNlYXJjaFZhbHVlOwogICAgICAgIG15ICVVc2VyU2VhcmNoTGlzdCA9ICRTZWxmLT57VXNlck9iamVjdH0tPlVzZXJTZWFyY2goCiAgICAgICAgICAgIFNlYXJjaCA9PiAnKicuJFNlYXJjaFZhbHVlLicqJywgCiAgICAgICAgKTsKICAgICAgICAKICAgICAgICBAVXNlckxpc3QgPSBrZXlzICVVc2VyU2VhcmNoTGlzdDsKICAgIH0KCiAgICBpZiAoc2NhbGFyKEBVc2VyTGlzdCkgPCAxIHx8ICEkVXNlckxpc3RbMF0pIHsKICAgICAgICBAVXNlckxpc3QgPSBAU2VhcmNoVmFsdWVzOwogICAgfQoKICAgIHJldHVybiBcQFVzZXJMaXN0Owp9Cgo9aXRlbSBTZWFyY2hJbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBzZWFyY2ggaW5wdXQgc3RyaW5nCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPlNlYXJjaElucHV0Q3JlYXRlKAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaElucHV0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtLZXl9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBLZXkhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRTdHJpbmcgPSAiPGlucHV0IHR5cGU9XCJUZXh0XCIgbmFtZT1cIiRQYXJhbXtLZXl9XCIgc2l6ZT1cIjMwXCI+IjsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4xMCAkICREYXRlOiAyMDExLTAzLTMwIDEzOjEyOjU3ICQKCj1jdXQK IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ29uZmlnSXRlbUxheW91dENJQ2xhc3NSZWZlcmVuY2UucG0gLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMSBjLmEucC5lLiBJVCBHbWJILCBodHRwOi8vd3d3LmNhcGUtaXQuZGUKIwojIHdyaXR0ZW4vY2hhbmdlZCBieToKIyAqIE1hcnRpbihkb3QpQmFsemFyZWsoYXQpY2FwZShkYXNoKWl0KGRvdClkZQojCiMgLS0KIyAkSWQ6IElUU01Db25maWdJdGVtTGF5b3V0Q0lDbGFzc1JlZmVyZW5jZS5wbSx2IDEuMTMgMjAxMS0wOS0wNSAwOTozOTozOCBtYWJhIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTGF5b3V0Q0lDbGFzc1JlZmVyZW5jZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW07CnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEzICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW1MYXlvdXRDSUNsYXNzUmVmZXJlbmNlIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBsYXlvdXQgZnVuY3Rpb25zIG9mIENJQ2xhc3NSZWZlcmVuY2Ugb2JqZWN0cwoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbUxheW91dENJQ2xhc3NSZWZlcmVuY2UtPm5ldygKICAgICAgICAlUGFyYW0sCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICNhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0Li4uCiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICNjaGVjayBuZWVkZWQgb2JqZWN0cy4uLgogICAgZm9yIG15ICRPYmplY3QgKAogICAgICAgIHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCBQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgRW5jb2RlT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9ICAgICAgICA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbS0+bmV3KCAleyRTZWxmfSApOwogICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gICAgPSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57Q0lDbGFzc1JlZmVyZW5jZUNsYXNzSUR9ID0gMDsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIE91dHB1dFN0cmluZ0NyZWF0ZSgpCgpjcmVhdGUgb3V0cHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5PdXRwdXRTdHJpbmdDcmVhdGUoCiAgICAgICAgVmFsdWUgPT4gMTEsICAgICAgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBPdXRwdXRTdHJpbmdDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjdHJhbnNmb3JtIGFzY2lpIHRvIGh0bWwuLi4KICAgICRQYXJhbXtWYWx1ZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgVGV4dCA9PiAkUGFyYW17VmFsdWV9IHx8ICcnLAogICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICApOwoKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBGb3JtRGF0YUdldCgpCgpnZXQgZm9ybSBkYXRhIGFzIGhhc2ggcmVmZXJlbmNlCgogICAgbXkgJEZvcm1EYXRhUmVmID0gJEJhY2tlbmRPYmplY3QtPkZvcm1EYXRhR2V0KAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjY2hlY2sgbmVlZGVkIHN0dWZmLi4uCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAlRm9ybURhdGE7CgogICAgI2dldCBzZWxlY3RlZCBDSUNsYXNzUmVmZXJlbmNlLi4uCiAgICAkRm9ybURhdGF7VmFsdWV9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSApOwoKICAgICNjaGVjayBzZWFyY2ggYnV0dG9uLi4KICAgIGlmICggJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6OkJ1dHRvblNlYXJjaCcgKSApIHsKICAgICAgICAkUGFyYW17SXRlbX0tPntGb3JtfS0+eyAkUGFyYW17S2V5fSB9LT57U2VhcmNofQogICAgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpTZWFyY2gnICk7CiAgICB9CgogICAgI2NoZWNrIHNlbGVjdCBidXR0b24uLi4KICAgIGVsc2lmICggJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6OkJ1dHRvblNlbGVjdCcgKSApIHsKICAgICAgICAkRm9ybURhdGF7VmFsdWV9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6OlNlbGVjdCcgKTsKICAgIH0KCiAgICAjY2hlY2sgY2xlYXIgYnV0dG9uLi4uCiAgICBlbHNpZiAoICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpCdXR0b25DbGVhcicgKSApIHsKICAgICAgICAkRm9ybURhdGF7VmFsdWV9ID0gJyc7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgI3Jlc2V0IHZhbHVlIGlmIHNlYXJjaCBmaWVsZCBpcyBlbXB0eS4uLgogICAgICAgIGlmICgKICAgICAgICAgICAgISRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpTZWFyY2gnICkKICAgICAgICAgICAgJiYgZGVmaW5lZCAkRm9ybURhdGF7VmFsdWV9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRGb3JtRGF0YXtWYWx1ZX0gPSAnJzsKICAgICAgICB9CgogICAgICAgICNjaGVjayByZXF1aXJlZCBvcHRpb24uLi4KICAgICAgICBpZiAoICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1JlcXVpcmVkfSAmJiAhJEZvcm1EYXRhe1ZhbHVlfSApIHsKICAgICAgICAgICAgJFBhcmFte0l0ZW19LT57Rm9ybX0tPnsgJFBhcmFte0tleX0gfS0+e0ludmFsaWR9ID0gMTsKICAgICAgICAgICAgJEZvcm1EYXRhe0ludmFsaWR9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIFwlRm9ybURhdGE7Cn0KCj1pdGVtIElucHV0Q3JlYXRlKCkKCmNyZWF0ZSBhIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5JbnB1dENyZWF0ZSgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIFZhbHVlID0+IDExLCAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBJbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICNjaGVjayBuZWVkZWQgc3R1ZmYuLi4KICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRWYWx1ZSA9ICcnOwogICAgaWYgKCBkZWZpbmVkICRQYXJhbXtWYWx1ZX0gKSB7CiAgICAgICAgJFZhbHVlID0gJFBhcmFte1ZhbHVlfTsKICAgIH0KICAgIGVsc2lmICggJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VmFsdWVEZWZhdWx0fSApIHsKICAgICAgICAkVmFsdWUgPSAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntWYWx1ZURlZmF1bHR9OwogICAgfQoKICAgIGlmICgKICAgICAgICAhJFBhcmFte0l0ZW19LT57SW5wdXR9LT57UmVmZXJlbmNlZENJQ2xhc3NJRH0KICAgICAgICAmJiAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntSZWZlcmVuY2VkQ0lDbGFzc05hbWV9CiAgICAgICAgKQogICAgewoKICAgICAgICBteSAkSXRlbURhdGFSZWYgPSAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fS0+SXRlbUdldCgKICAgICAgICAgICAgQ2xhc3MgPT4gJ0lUU006OkNvbmZpZ0l0ZW06OkNsYXNzJywKICAgICAgICAgICAgTmFtZSAgPT4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57UmVmZXJlbmNlZENJQ2xhc3NOYW1lfSwKICAgICAgICApOwoKICAgICAgICBpZiAoICEkSXRlbURhdGFSZWYgfHwgISggJEl0ZW1EYXRhUmVmLT57SXRlbUlEfSApICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiSVRTTUNvbmZpZ0l0ZW1MYXlvdXRDSUNsYXNzUmVmZXJlbmNlOiBDSS1DbGFzcyA8IgogICAgICAgICAgICAgICAgICAgIC4gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57UmVmZXJlbmNlZENJQ2xhc3NOYW1lfQogICAgICAgICAgICAgICAgICAgIC4gIj4gbm90IGRlZmluZWQgaW4gR2VuZXJhbENhdGFsb2chIiwKICAgICAgICAgICAgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICRTZWxmLT57Q0lDbGFzc1JlZmVyZW5jZUNsYXNzSUR9ID0gJEl0ZW1EYXRhUmVmLT57SXRlbUlEfTsKICAgICAgICB9CgogICAgfQogICAgZWxzaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntSZWZlcmVuY2VkQ0lDbGFzc0lEfSApIHsKICAgICAgICAkU2VsZi0+e0NJQ2xhc3NSZWZlcmVuY2VDbGFzc0lEfSA9ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1JlZmVyZW5jZWRDSUNsYXNzSUR9OwogICAgfQoKICAgIG15ICRTaXplICAgICAgICAgPSAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntTaXplfSB8fCA1MDsKICAgIG15ICRTZWFyY2ggICAgICAgPSAnJzsKICAgIG15ICRTdHJpbmdPcHRpb24gPSAnJzsKICAgIG15ICRTdHJpbmdTZWxlY3QgPSAnJzsKCiAgICAjIEF1dG9Db21wbGV0ZSBDSUNsYXNzCiAgICBteSAkQ2xhc3MgPSAnVzUwcGMgQ0lDbGFzc1NlYXJjaCc7CgogICAgI215ICRTZWFyY2ggICA9ICcnOwogICAgbXkgJFJlcXVpcmVkID0gJFBhcmFte1JlcXVpcmVkfSB8fCAnJzsKICAgIG15ICRJbnZhbGlkICA9ICRQYXJhbXtJbnZhbGlkfSAgfHwgJyc7CiAgICBteSAkSXRlbUlkICAgPSAkUGFyYW17SXRlbUlkfSAgIHx8ICcnOwoKICAgICMgRU8gQXV0b0NvbXBsZXRlIENJQ2xhc3MKCiAgICAjIENJQ2xhc3NSZWZlcmVuY2Ugc2VhcmNoLi4uCiAgICBpZiAoICRQYXJhbXtJdGVtfS0+e0Zvcm19LT57ICRQYXJhbXtLZXl9IH0tPntTZWFyY2h9ICkgewoKICAgICAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAjIHNlYXJjaCBmb3IgbmFtZS4uLi4KICAgICAgICBteSAlQ0lTZWFyY2hMaXN0ICAgID0gKCk7CiAgICAgICAgbXkgJENJU2VhcmNoTGlzdFJlZiA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkNvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCgKICAgICAgICAgICAgTmFtZSAgICAgPT4gJyonIC4gJFBhcmFte0l0ZW19LT57Rm9ybX0tPnsgJFBhcmFte0tleX0gfS0+e1NlYXJjaH0gLiAnKicsCiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJFNlbGYtPntDSUNsYXNzUmVmZXJlbmNlQ2xhc3NJRH0gXSwKICAgICAgICApOwoKICAgICAgICBmb3IgbXkgJFNlYXJjaFJlc3VsdCAoIEB7JENJU2VhcmNoTGlzdFJlZn0gKSB7CiAgICAgICAgICAgIG15ICRDdXJyVmVyc2lvbkRhdGEgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5WZXJzaW9uR2V0KAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRTZWFyY2hSZXN1bHQsCiAgICAgICAgICAgICAgICBYTUxEYXRhR2V0ICAgPT4gMCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJEN1cnJWZXJzaW9uRGF0YQogICAgICAgICAgICAgICAgJiYKICAgICAgICAgICAgICAgICggcmVmKCRDdXJyVmVyc2lvbkRhdGEpIGVxICdIQVNIJyApICYmCiAgICAgICAgICAgICAgICAkQ3VyclZlcnNpb25EYXRhLT57TmFtZX0gJiYKICAgICAgICAgICAgICAgICRDdXJyVmVyc2lvbkRhdGEtPntOdW1iZXJ9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRDSVNlYXJjaExpc3R7JFNlYXJjaFJlc3VsdH0gPSAkQ3VyclZlcnNpb25EYXRhLT57TmFtZX0KICAgICAgICAgICAgICAgICAgICAuICIgKCIKICAgICAgICAgICAgICAgICAgICAuICRDdXJyVmVyc2lvbkRhdGEtPntOdW1iZXJ9CiAgICAgICAgICAgICAgICAgICAgLiAiKSI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICMgc2VhcmNoIGZvciBudW1iZXIuLi4uCiAgICAgICAgJENJU2VhcmNoTGlzdFJlZiA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkNvbmZpZ0l0ZW1TZWFyY2hFeHRlbmRlZCgKICAgICAgICAgICAgTnVtYmVyICAgPT4gJyonIC4gJFBhcmFte0l0ZW19LT57Rm9ybX0tPnsgJFBhcmFte0tleX0gfS0+e1NlYXJjaH0gLiAnKicsCiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJFNlbGYtPntDSUNsYXNzUmVmZXJlbmNlQ2xhc3NJRH0gXSwKICAgICAgICApOwoKICAgICAgICBmb3IgbXkgJFNlYXJjaFJlc3VsdCAoIEB7JENJU2VhcmNoTGlzdFJlZn0gKSB7CiAgICAgICAgICAgIG15ICRDdXJyVmVyc2lvbkRhdGEgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5WZXJzaW9uR2V0KAogICAgICAgICAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRTZWFyY2hSZXN1bHQsCiAgICAgICAgICAgICAgICBYTUxEYXRhR2V0ICAgPT4gMCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJEN1cnJWZXJzaW9uRGF0YQogICAgICAgICAgICAgICAgJiYKICAgICAgICAgICAgICAgICggcmVmKCRDdXJyVmVyc2lvbkRhdGEpIGVxICdIQVNIJyApICYmCiAgICAgICAgICAgICAgICAkQ3VyclZlcnNpb25EYXRhLT57TmFtZX0gJiYKICAgICAgICAgICAgICAgICRDdXJyVmVyc2lvbkRhdGEtPntOdW1iZXJ9CiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICRDSVNlYXJjaExpc3R7JFNlYXJjaFJlc3VsdH0gPSAkQ3VyclZlcnNpb25EYXRhLT57TmFtZX0KICAgICAgICAgICAgICAgICAgICAuICIgKCIKICAgICAgICAgICAgICAgICAgICAuICRDdXJyVmVyc2lvbkRhdGEtPntOdW1iZXJ9CiAgICAgICAgICAgICAgICAgICAgLiAiKSI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICMgYnVpbGQgc2VhcmNoIHJlc3VsdCBwcmVzZW50YXRpb24uLi4uCiAgICAgICAgaWYgKCAlQ0lTZWFyY2hMaXN0ICYmIHNjYWxhcigga2V5cyAlQ0lTZWFyY2hMaXN0ICkgPiAxICkgewoKICAgICAgICAgICAgI2NyZWF0ZSBvcHRpb24gbGlzdC4uLgogICAgICAgICAgICAkU3RyaW5nT3B0aW9uID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CdWlsZFNlbGVjdGlvbigKICAgICAgICAgICAgICAgIE5hbWUgPT4gJFBhcmFte0tleX0gLiAnOjpTZWxlY3QnLAogICAgICAgICAgICAgICAgRGF0YSA9PiBcJUNJU2VhcmNoTGlzdCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFN0cmluZ09wdGlvbiAuPSAnPGJyPic7CgogICAgICAgICAgICAjY3JlYXRlIHNlbGVjdCBidXR0b24uLi4KICAgICAgICAgICAgJFN0cmluZ1NlbGVjdCA9ICc8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSInCiAgICAgICAgICAgICAgICAuICRQYXJhbXtLZXl9CiAgICAgICAgICAgICAgICAuICc6OkJ1dHRvblNlbGVjdCIgJwogICAgICAgICAgICAgICAgLiAndmFsdWU9IiRUZXh0eyJTZWxlY3QifSI+Jm5ic3A7JzsKCiAgICAgICAgICAgICNzZXQgc2VhcmNoLi4uCiAgICAgICAgICAgICRTZWFyY2ggPSAkUGFyYW17SXRlbX0tPntGb3JtfS0+eyAkUGFyYW17S2V5fSB9LT57U2VhcmNofTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCVDSVNlYXJjaExpc3QpIHsKCiAgICAgICAgICAgICRWYWx1ZSA9ICgga2V5cyAlQ0lTZWFyY2hMaXN0IClbMF07CiAgICAgICAgICAgIG15ICRDSVZlcnNpb25EYXRhUmVmID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+VmVyc2lvbkdldCgKICAgICAgICAgICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkVmFsdWUsCiAgICAgICAgICAgICAgICBYTUxEYXRhR2V0ICAgPT4gMCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgbXkgJENJTmFtZSA9ICIiOwoKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgJENJVmVyc2lvbkRhdGFSZWYKICAgICAgICAgICAgICAgICYmCiAgICAgICAgICAgICAgICAoIHJlZigkQ0lWZXJzaW9uRGF0YVJlZikgZXEgJ0hBU0gnICkgJiYKICAgICAgICAgICAgICAgICRDSVZlcnNpb25EYXRhUmVmLT57TmFtZX0gJiYKICAgICAgICAgICAgICAgICRDSVZlcnNpb25EYXRhUmVmLT57TnVtYmVyfQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAkQ0lOYW1lID0gJENJVmVyc2lvbkRhdGFSZWYtPntOYW1lfQogICAgICAgICAgICAgICAgICAgIC4gIiAoIgogICAgICAgICAgICAgICAgICAgIC4gJENJVmVyc2lvbkRhdGFSZWYtPntOdW1iZXJ9CiAgICAgICAgICAgICAgICAgICAgLiAiKSI7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICN0cmFuc2Zvcm0gYXNjaWkgdG8gaHRtbC4uLgogICAgICAgICAgICAkU2VhcmNoID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgVGV4dCA9PiAkQ0lOYW1lIHx8ICcnLAogICAgICAgICAgICAgICAgSFRNTFJlc3VsdE1vZGUgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgfQoKICAgICNjcmVhdGUgQ0lDbGFzc1JlZmVyZW5jZSBzdHJpbmcuLi4KICAgIGVsc2lmICgkVmFsdWUpIHsKCiAgICAgICAgbXkgJENJVmVyc2lvbkRhdGFSZWYgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5WZXJzaW9uR2V0KAogICAgICAgICAgICBDb25maWdJdGVtSUQgPT4gJFZhbHVlLAogICAgICAgICAgICBYTUxEYXRhR2V0ICAgPT4gMCwKICAgICAgICApOwogICAgICAgIG15ICRDSU5hbWUgPSAiIjsKCiAgICAgICAgaWYgKAogICAgICAgICAgICAkQ0lWZXJzaW9uRGF0YVJlZgogICAgICAgICAgICAmJgogICAgICAgICAgICAoIHJlZigkQ0lWZXJzaW9uRGF0YVJlZikgZXEgJ0hBU0gnICkgJiYKICAgICAgICAgICAgJENJVmVyc2lvbkRhdGFSZWYtPntOYW1lfSAmJgogICAgICAgICAgICAkQ0lWZXJzaW9uRGF0YVJlZi0+e051bWJlcn0KICAgICAgICAgICAgKQogICAgICAgIHsKICAgICAgICAgICAgJENJTmFtZSA9ICRDSVZlcnNpb25EYXRhUmVmLT57TmFtZX0KICAgICAgICAgICAgICAgIC4gIiAoIgogICAgICAgICAgICAgICAgLiAkQ0lWZXJzaW9uRGF0YVJlZi0+e051bWJlcn0KICAgICAgICAgICAgICAgIC4gIikiOwogICAgICAgIH0KCiAgICAgICAgI3RyYW5zZm9ybSBhc2NpaSB0byBodG1sLi4uCiAgICAgICAgJFNlYXJjaCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCgKICAgICAgICAgICAgVGV4dCA9PiAkQ0lOYW1lIHx8ICcnLAogICAgICAgICAgICBIVE1MUmVzdWx0TW9kZSA9PiAxLAogICAgICAgICk7CiAgICB9CgogICAgIyBBdXRvQ29tcGxldGUgQ0lDbGFzcwogICAgbXkgJEF1dG9Db21wbGV0ZUNvbmZpZwogICAgICAgID0gJFNlbGYtPntDb25maWdPYmplY3R9CiAgICAgICAgLT5HZXQoJ0lUU01DSUF0dHJpYnV0ZUNvbGxlY3Rpb246OkZyb250ZW5kOjpDb21tb25TZWFyY2hBdXRvQ29tcGxldGUnKTsKCiAgICAjY3JlYXRlIHN0cmluZy4uLgogICAgbXkgJFN0cmluZyA9ICcnOwogICAgaWYgKAogICAgICAgICRBdXRvQ29tcGxldGVDb25maWcKICAgICAgICAmJiByZWYoJEF1dG9Db21wbGV0ZUNvbmZpZykgZXEgJ0hBU0gnCiAgICAgICAgJiYgJEF1dG9Db21wbGV0ZUNvbmZpZy0+e0FjdGl2ZX0KICAgICAgICApCiAgICB7CgogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ0NJQ2xhc3NTZWFyY2hBdXRvQ29tcGxldGUnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIG1pblF1ZXJ5TGVuZ3RoICAgICAgPT4gJEF1dG9Db21wbGV0ZUNvbmZpZy0+e01pblF1ZXJ5TGVuZ3RofSAgICAgIHx8IDIsCiAgICAgICAgICAgICAgICBxdWVyeURlbGF5ICAgICAgICAgID0+ICRBdXRvQ29tcGxldGVDb25maWctPntRdWVyeURlbGF5fSAgICAgICAgICB8fCAwLjEsCiAgICAgICAgICAgICAgICB0eXBlQWhlYWQgICAgICAgICAgID0+ICRBdXRvQ29tcGxldGVDb25maWctPntUeXBlQWhlYWR9ICAgICAgICAgICB8fCAnZmFsc2UnLAogICAgICAgICAgICAgICAgbWF4UmVzdWx0c0Rpc3BsYXllZCA9PiAkQXV0b0NvbXBsZXRlQ29uZmlnLT57TWF4UmVzdWx0c0Rpc3BsYXllZH0gfHwgMjAsCiAgICAgICAgICAgICAgICBkeW5hbWljV2lkdGggICAgICAgID0+ICRBdXRvQ29tcGxldGVDb25maWctPntEeW5hbWljV2lkdGh9ICAgICAgICB8fCAxLAogICAgICAgICAgICB9LAogICAgICAgICk7CiAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5CbG9jaygKICAgICAgICAgICAgTmFtZSA9PiAnQ0lDbGFzc1NlYXJjaEluaXQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEl0ZW1JRCAgICAgICAgICAgICA9PiAkSXRlbUlkLAogICAgICAgICAgICAgICAgQ2xhc3NJRCAgICAgICAgICAgID0+ICRTZWxmLT57Q0lDbGFzc1JlZmVyZW5jZUNsYXNzSUR9LAogICAgICAgICAgICAgICAgQWN0aXZlQXV0b0NvbXBsZXRlID0+ICd0cnVlJywKICAgICAgICAgICAgfSwKICAgICAgICApOwoKICAgICAgICAkU3RyaW5nID0gJyRJbmNsdWRleyJBZ2VudENJQ2xhc3NTZWFyY2gifScKICAgICAgICAgICAgLiAnPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iJwogICAgICAgICAgICAuICRQYXJhbXtLZXl9CiAgICAgICAgICAgIC4gJyIgdmFsdWU9IicKICAgICAgICAgICAgLiAkVmFsdWUKICAgICAgICAgICAgLiAnIiBpZD0iJwogICAgICAgICAgICAuICRJdGVtSWQgLiAnU2VsZWN0ZWQnCiAgICAgICAgICAgIC4gJyIvPicKICAgICAgICAgICAgLiAnPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IicKICAgICAgICAgICAgLiAkUGFyYW17S2V5fQogICAgICAgICAgICAuICc6OlNlYXJjaCIgY2xhc3M9IicKICAgICAgICAgICAgLiAkQ2xhc3MKICAgICAgICAgICAgLiAnIiBpZD0iJwogICAgICAgICAgICAuICRJdGVtSWQKICAgICAgICAgICAgLiAnIiB2YWx1ZT0iJwogICAgICAgICAgICAuICRTZWFyY2ggLiAnIi8+JzsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTdHJpbmcgPSAnPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iJwogICAgICAgICAgICAuICRQYXJhbXtLZXl9CiAgICAgICAgICAgIC4gJyIgdmFsdWU9IicKICAgICAgICAgICAgLiAkVmFsdWUgLiAnIj4nCiAgICAgICAgICAgIC4gJzxpbnB1dCB0eXBlPSJUZXh0IiBuYW1lPSInCiAgICAgICAgICAgIC4gJFBhcmFte0tleX0KICAgICAgICAgICAgLiAnOjpTZWFyY2giIHNpemU9IicKICAgICAgICAgICAgLiAkU2l6ZQogICAgICAgICAgICAuICciIHZhbHVlPSInCiAgICAgICAgICAgIC4gJFNlYXJjaCAuICciPicgLiAnPGJyPicKICAgICAgICAgICAgLiAkU3RyaW5nT3B0aW9uCiAgICAgICAgICAgIC4gJFN0cmluZ1NlbGVjdAogICAgICAgICAgICAuICc8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSInCiAgICAgICAgICAgIC4gJFBhcmFte0tleX0KICAgICAgICAgICAgLiAnOjpCdXR0b25TZWFyY2giIHZhbHVlPSIkVGV4dHsiU2VhcmNoIn0iPicKICAgICAgICAgICAgLiAnJm5ic3A7JwogICAgICAgICAgICAuICc8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSInCiAgICAgICAgICAgIC4gJFBhcmFte0tleX0KICAgICAgICAgICAgLiAnOjpCdXR0b25DbGVhciIgdmFsdWU9IiRUZXh0eyJDbGVhciJ9Ij4nOwogICAgfQoKICAgIHJldHVybiAkU3RyaW5nOwp9Cgo9aXRlbSBTZWFyY2hGb3JtRGF0YUdldCgpCgpnZXQgc2VhcmNoIGZvcm0gZGF0YQoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hGb3JtRGF0YUdldCgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSBAVmFsdWVzID0gcXd7fTsKCiAgICAjY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17S2V5fSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgS2V5IScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoICEkU2VsZi0+e0NJQ2xhc3NSZWZlcmVuY2VDbGFzc0lEfSApIHsKCiAgICAgICAgbXkgJEl0ZW1EYXRhUmVmID0gJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0tPkl0ZW1HZXQoCiAgICAgICAgICAgIENsYXNzID0+ICdJVFNNOjpDb25maWdJdGVtOjpDbGFzcycsCiAgICAgICAgICAgIE5hbWUgID0+ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1JlZmVyZW5jZWRDSUNsYXNzTmFtZX0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKCAhJEl0ZW1EYXRhUmVmIHx8ICEoICRJdGVtRGF0YVJlZi0+e0l0ZW1JRH0gKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIklUU01Db25maWdJdGVtTGF5b3V0Q0lDbGFzc1JlZmVyZW5jZTogQ0ktQ2xhc3MgPCIKICAgICAgICAgICAgICAgICAgICAuICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1JlZmVyZW5jZWRDSUNsYXNzTmFtZX0KICAgICAgICAgICAgICAgICAgICAuICI+IG5vdCBkZWZpbmVkIGluIEdlbmVyYWxDYXRhbG9nISIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+e0NJQ2xhc3NSZWZlcmVuY2VDbGFzc0lEfSA9ICRJdGVtRGF0YVJlZi0+e0l0ZW1JRH07CiAgICAgICAgfQoKICAgIH0KCiAgICBteSBAU2VhcmNoVmFsdWVzID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSApOwoKICAgIGZvciBteSAkQ3VyclNlYXJjaFZhbHVlIChAU2VhcmNoVmFsdWVzKSB7CiAgICAgICAgbmV4dCBpZiAhJEN1cnJTZWFyY2hWYWx1ZTsKICAgICAgICBteSAkQ0lTZWFyY2hMaXN0UmVmID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+Q29uZmlnSXRlbVNlYXJjaEV4dGVuZGVkKAogICAgICAgICAgICBOYW1lICAgICA9PiAkQ3VyclNlYXJjaFZhbHVlLAogICAgICAgICAgICBDbGFzc0lEcyA9PiBbICRTZWxmLT57Q0lDbGFzc1JlZmVyZW5jZUNsYXNzSUR9IF0sCiAgICAgICAgKTsKICAgICAgICBmb3IgbXkgJFNlYXJjaFJlc3VsdCAoIEB7JENJU2VhcmNoTGlzdFJlZn0gKSB7CiAgICAgICAgICAgIHB1c2goIEBWYWx1ZXMsICRTZWFyY2hSZXN1bHQgKTsKICAgICAgICB9CgogICAgICAgICRDSVNlYXJjaExpc3RSZWYgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5Db25maWdJdGVtU2VhcmNoRXh0ZW5kZWQoCiAgICAgICAgICAgIE51bWJlciAgID0+ICRDdXJyU2VhcmNoVmFsdWUsCiAgICAgICAgICAgIENsYXNzSURzID0+IFsgJFNlbGYtPntDSUNsYXNzUmVmZXJlbmNlQ2xhc3NJRH0gXSwKICAgICAgICApOwogICAgICAgIGZvciBteSAkU2VhcmNoUmVzdWx0ICggQHskQ0lTZWFyY2hMaXN0UmVmfSApIHsKICAgICAgICAgICAgcHVzaCggQFZhbHVlcywgJFNlYXJjaFJlc3VsdCApOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoIHNjYWxhcihAVmFsdWVzKSA8IDEgfHwgISRWYWx1ZXNbMF0gKSB7CiAgICAgICAgQFZhbHVlcyA9IEBTZWFyY2hWYWx1ZXM7CiAgICB9CgogICAgcmV0dXJuIFxAVmFsdWVzOwp9Cgo9aXRlbSBTZWFyY2hJbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBzZWFyY2ggaW5wdXQgc3RyaW5nCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPlNlYXJjaElucHV0Q3JlYXRlKAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaElucHV0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGlmICggISRQYXJhbXtLZXl9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAnTmVlZCBLZXkhJwogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRTdHJpbmcgPSAiPGlucHV0IHR5cGU9XCJUZXh0XCIgbmFtZT1cIiRQYXJhbXtLZXl9XCIgc2l6ZT1cIjMwXCI+IjsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4xMyAkICREYXRlOiAyMDExLTA5LTA1IDA5OjM5OjM4ICQKCj1jdXQKCg== Iy0tCiNLZXJuZWwvT3V0cHV0L0hUTUwvSVRTTUNvbmZpZ0l0ZW1MYXlvdXRRdWV1ZVJlZmVyZW5jZS5wbSAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQojCiMgQ29weXJpZ2h0IChDKSAyMDA2LTIwMTEgYy5hLnAuZS4gSVQgR21iSCwgaHR0cDovL3d3dy5jYXBlLWl0LmRlCiMKIy0tCiMkSWQ6IElUU01Db25maWdJdGVtTGF5b3V0UXVldWVSZWZlcmVuY2UucG0sdiAxLjYgMjAxMS0wNy0wNiAxMzo1MTo0MyBmb2JlciBFeHAgJAojLS0KI1RoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiN0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKI2RpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCiMtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW1MYXlvdXRRdWV1ZVJlZmVyZW5jZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6UXVldWU7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjYgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbUxheW91dFF1ZXVlUmVmZXJlbmNlIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCBsYXlvdXQgZnVuY3Rpb25zIG9mIFNlcnZpY2Ugb2JqZWN0cwoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICAkQmFja2VuZE9iamVjdCA9IEtlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbUxheW91dFF1ZXVlUmVmZXJlbmNlLT5uZXcoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdC4uLgogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjY2hlY2sgbmVlZGVkIG9iamVjdHMuLi4KICAgIGZvciBteSAkT2JqZWN0ICgKICAgICAgICBxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IEVuY29kZU9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgJFNlbGYtPntRdWV1ZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6UXVldWUtPm5ldyggJXskU2VsZn0gKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIE91dHB1dFN0cmluZ0NyZWF0ZSgpCgpjcmVhdGUgb3V0cHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5PdXRwdXRTdHJpbmdDcmVhdGUoCiAgICAgICAgVmFsdWUgPT4gMTEsICAgICAgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBPdXRwdXRTdHJpbmdDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjdHJhbnNmb3JtIGFzY2lpIHRvIGh0bWwuLi4KICAgICRQYXJhbXtWYWx1ZX0gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgVGV4dCA9PiAkUGFyYW17VmFsdWV9IHx8ICcnLAogICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICApOwoKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBGb3JtRGF0YUdldCgpCgpnZXQgZm9ybSBkYXRhIGFzIGhhc2ggcmVmZXJlbmNlCgogICAgbXkgJEZvcm1EYXRhUmVmID0gJEJhY2tlbmRPYmplY3QtPkZvcm1EYXRhR2V0KAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgRm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjY2hlY2sgbmVlZGVkIHN0dWZmLi4uCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAlRm9ybURhdGE7CgogICAgI2dldCBzZWxlY3RlZCBDSUNsYXNzUmVmZXJlbmNlLi4uCiAgICAkRm9ybURhdGF7VmFsdWV9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSApOwoKICAgICNjaGVjayBzZWFyY2ggYnV0dG9uLi4KICAgIGlmICggJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6OkJ1dHRvblNlYXJjaCcgKSApIHsKICAgICAgICAkUGFyYW17SXRlbX0tPntGb3JtfS0+eyAkUGFyYW17S2V5fSB9LT57U2VhcmNofQogICAgICAgICAgICA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpTZWFyY2gnICk7CiAgICB9CgogICAgI2NoZWNrIHNlbGVjdCBidXR0b24uLi4KICAgIGVsc2lmICggJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6OkJ1dHRvblNlbGVjdCcgKSApIHsKICAgICAgICAkRm9ybURhdGF7VmFsdWV9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICc6OlNlbGVjdCcgKTsKICAgIH0KCiAgICAjY2hlY2sgY2xlYXIgYnV0dG9uLi4uCiAgICBlbHNpZiAoICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpCdXR0b25DbGVhcicgKSApIHsKICAgICAgICAkRm9ybURhdGF7VmFsdWV9ID0gJyc7CiAgICB9CiAgICBlbHNlIHsKCiAgICAgICAgI3Jlc2V0IHZhbHVlIGlmIHNlYXJjaCBmaWVsZCBpcyBlbXB0eS4uLgogICAgICAgIGlmICgKICAgICAgICAgICAgISRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpTZWFyY2gnICkKICAgICAgICAgICAgJiYgZGVmaW5lZCAkRm9ybURhdGF7VmFsdWV9CiAgICAgICAgICAgICkKICAgICAgICB7CiAgICAgICAgICAgICRGb3JtRGF0YXtWYWx1ZX0gPSAnJzsKICAgICAgICB9CgogICAgICAgICNjaGVjayByZXF1aXJlZCBvcHRpb24uLi4KICAgICAgICBpZiAoICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1JlcXVpcmVkfSAmJiAhJEZvcm1EYXRhe1ZhbHVlfSApIHsKICAgICAgICAgICAgJFBhcmFte0l0ZW19LT57Rm9ybX0tPnsgJFBhcmFte0tleX0gfS0+e0ludmFsaWR9ID0gMTsKICAgICAgICAgICAgJEZvcm1EYXRhe0ludmFsaWR9ID0gMTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIFwlRm9ybURhdGE7Cn0KCj1pdGVtIElucHV0Q3JlYXRlKCkKCmNyZWF0ZSBhIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5JbnB1dENyZWF0ZSgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIFZhbHVlID0+IDExLCAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBJbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICNjaGVjayBuZWVkZWQgc3R1ZmYuLi4KICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgbXkgJFZhbHVlID0gJyc7CiAgICBpZiAoIGRlZmluZWQgJFBhcmFte1ZhbHVlfSApIHsKICAgICAgICAkVmFsdWUgPSAkUGFyYW17VmFsdWV9OwogICAgfQogICAgZWxzaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntWYWx1ZURlZmF1bHR9ICkgewogICAgICAgICRWYWx1ZSA9ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1ZhbHVlRGVmYXVsdH07CiAgICB9CgogICAgbXkgJFNpemUgICAgICAgICA9ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1NpemV9IHx8IDUwOwogICAgbXkgJFNlYXJjaCAgICAgICA9ICcnOwogICAgbXkgJFN0cmluZ09wdGlvbiA9ICcnOwogICAgbXkgJFN0cmluZ1NlbGVjdCA9ICcnOwogICAgbXkgJENsYXNzICAgID0gJ1c1MHBjIFF1ZXVlU2VhcmNoJzsKICAgIG15ICRSZXF1aXJlZCA9ICRQYXJhbXtSZXF1aXJlZH0gfHwgJyc7CiAgICBteSAkSW52YWxpZCAgPSAkUGFyYW17SW52YWxpZH0gfHwgJyc7CiAgICBteSAkSXRlbUlkICAgPSAkUGFyYW17SXRlbUlkfSB8fCAnJzsKCiAgICAjIFF1ZXVlUmVmZXJlbmNlIHNlYXJjaC4uLgogICAgaWYgKCAkUGFyYW17SXRlbX0tPntGb3JtfS0+eyAkUGFyYW17S2V5fSB9LT57U2VhcmNofSApIHsKCiAgICAgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIyBzZWFyY2ggZm9yIG5hbWUuLi4uCiAgICAgICAgbXkgJVF1ZXVlcyA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5RdWV1ZUxpc3QoCiAgICAgICAgICAgIFZhbGlkICAgPT4gMSwKICAgICAgICApOwoKICAgICAgICBteSAlUXVldWVMaXN0ID0gKCk7CiAgICAgICAgZm9yIG15ICRRdWV1ZUlEIChrZXlzICVRdWV1ZXMpIHsKICAgICAgICAgICAgaWYgKCAkUXVldWVzeyRRdWV1ZUlEfSA9fiAvXFEkUGFyYW17SXRlbX0tPntGb3JtfS0+eyAkUGFyYW17S2V5fSB9LT57U2VhcmNofVxFL2kgKSB7CiAgICAgICAgICAgICAgICAkUXVldWVMaXN0eyRRdWV1ZUlEfSA9ICRRdWV1ZXN7JFF1ZXVlSUR9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICMgYnVpbGQgc2VhcmNoIHJlc3VsdCBwcmVzZW50YXRpb24uLi4uCiAgICAgICAgaWYgKCVRdWV1ZUxpc3QgJiYgc2NhbGFyKGtleXMgJVF1ZXVlTGlzdCkgPiAxKSB7CgogICAgICAgICAgICAjY3JlYXRlIG9wdGlvbiBsaXN0Li4uCiAgICAgICAgICAgICRTdHJpbmdPcHRpb24gPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJ1aWxkU2VsZWN0aW9uKAogICAgICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17S2V5fSAuICc6OlNlbGVjdCcsCiAgICAgICAgICAgICAgICBEYXRhID0+IFwlUXVldWVMaXN0LAogICAgICAgICAgICAgICAgVHJhbnNsYXRpb24gPT4gMCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFN0cmluZ09wdGlvbiAuPSAnPGJyPic7CgogICAgICAgICAgICAjY3JlYXRlIHNlbGVjdCBidXR0b24uLi4KICAgICAgICAgICAgJFN0cmluZ1NlbGVjdCA9ICc8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSInCiAgICAgICAgICAgICAgICAuICRQYXJhbXtLZXl9CiAgICAgICAgICAgICAgICAuICc6OkJ1dHRvblNlbGVjdCIgJwogICAgICAgICAgICAgICAgLiAndmFsdWU9IiRUZXh0eyJTZWxlY3QifSI+Jm5ic3A7JzsKCiAgICAgICAgICAgICNzZXQgc2VhcmNoLi4uCiAgICAgICAgICAgICRTZWFyY2ggPSAkUGFyYW17SXRlbX0tPntGb3JtfS0+eyAkUGFyYW17S2V5fSB9LT57U2VhcmNofTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCVRdWV1ZUxpc3QpIHsKICAgICAgICAgICAgJFZhbHVlID0gKGtleXMgJVF1ZXVlTGlzdClbMF07CiAgICAgICAgICAgIG15ICVRdWV1ZURhdGEgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+UXVldWVHZXQoCiAgICAgICAgICAgICAgICBJRCA9PiAkVmFsdWUsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG15ICRRdWV1ZU5hbWUgPSAiIjsKCiAgICAgICAgICAgIGlmICggJVF1ZXVlRGF0YSAmJiAkUXVldWVEYXRhe05hbWV9ICkgewogICAgICAgICAgICAgICAgJFF1ZXVlTmFtZSA9ICRRdWV1ZURhdGF7TmFtZX07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICN0cmFuc2Zvcm0gYXNjaWkgdG8gaHRtbC4uLgogICAgICAgICAgICAkU2VhcmNoID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICAgICAgVGV4dCA9PiAkUXVldWVOYW1lIHx8ICcnLAogICAgICAgICAgICAgICAgSFRNTFJlc3VsdE1vZGUgPT4gMSwKICAgICAgICAgICAgKTsKICAgICAgICB9CgogICAgfQoKICAgICNjcmVhdGUgQ0lDbGFzc1JlZmVyZW5jZSBzdHJpbmcuLi4KICAgIGVsc2lmICgkVmFsdWUpIHsKCiAgICAgICAgbXkgJVF1ZXVlRGF0YSA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5RdWV1ZUdldCgKICAgICAgICAgICAgSUQgPT4gJFZhbHVlLAogICAgICAgICk7CiAgICAgICAgbXkgJFF1ZXVlTmFtZSA9ICIiOwoKICAgICAgICBpZiAoICVRdWV1ZURhdGEgJiYgJFF1ZXVlRGF0YXtOYW1lfSApIHsKICAgICAgICAgICAgJFF1ZXVlTmFtZSA9ICRRdWV1ZURhdGF7TmFtZX07CiAgICAgICAgfQoKICAgICAgICAjdHJhbnNmb3JtIGFzY2lpIHRvIGh0bWwuLi4KICAgICAgICAkU2VhcmNoID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgICAgICBUZXh0ID0+ICRRdWV1ZU5hbWUgfHwgJycsCiAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIEF1dG9Db21wbGV0ZSBDSUNsYXNzCiAgICBteSAkQXV0b0NvbXBsZXRlQ29uZmlnCiAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTUNJQXR0cmlidXRlQ29sbGVjdGlvbjo6RnJvbnRlbmQ6OkNvbW1vblNlYXJjaEF1dG9Db21wbGV0ZScpOwoKICAgICNjcmVhdGUgc3RyaW5nLi4uCiAgICBteSAkU3RyaW5nID0gJyc7CiAgICBpZiAoJEF1dG9Db21wbGV0ZUNvbmZpZyAmJiByZWYoJEF1dG9Db21wbGV0ZUNvbmZpZykgZXEgJ0hBU0gnICYmICRBdXRvQ29tcGxldGVDb25maWctPntBY3RpdmV9KSB7CiAgICAKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdRdWV1ZVNlYXJjaEF1dG9Db21wbGV0ZScsCiAgICAgICAgICAgIERhdGEgPT4gewogICAgICAgICAgICAgICAgbWluUXVlcnlMZW5ndGggICAgICA9PiAkQXV0b0NvbXBsZXRlQ29uZmlnLT57TWluUXVlcnlMZW5ndGh9ICAgICAgfHwgMiwKICAgICAgICAgICAgICAgIHF1ZXJ5RGVsYXkgICAgICAgICAgPT4gJEF1dG9Db21wbGV0ZUNvbmZpZy0+e1F1ZXJ5RGVsYXl9ICAgICAgICAgIHx8IDAuMSwKICAgICAgICAgICAgICAgIHR5cGVBaGVhZCAgICAgICAgICAgPT4gJEF1dG9Db21wbGV0ZUNvbmZpZy0+e1R5cGVBaGVhZH0gICAgICAgICAgIHx8ICdmYWxzZScsCiAgICAgICAgICAgICAgICBtYXhSZXN1bHRzRGlzcGxheWVkID0+ICRBdXRvQ29tcGxldGVDb25maWctPntNYXhSZXN1bHRzRGlzcGxheWVkfSB8fCAyMCwKICAgICAgICAgICAgICAgIGR5bmFtaWNXaWR0aCAgICAgICAgPT4gJEF1dG9Db21wbGV0ZUNvbmZpZy0+e0R5bmFtaWNXaWR0aH0gICAgICAgIHx8IDEsCiAgICAgICAgICAgIH0sCiAgICAgICAgKTsKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdRdWV1ZVNlYXJjaEluaXQnLAogICAgICAgICAgICBEYXRhID0+IHsKICAgICAgICAgICAgICAgIEl0ZW1JRCAgICAgICAgICAgICA9PiAkSXRlbUlkLAogICAgICAgICAgICAgICAgQWN0aXZlQXV0b0NvbXBsZXRlID0+ICd0cnVlJywKICAgICAgICAgICAgICAgIH0KICAgICAgICApOwoKICAgICAgICAkU3RyaW5nCiAgICAgICAgICAgID0gJyRJbmNsdWRleyJBZ2VudFF1ZXVlU2VhcmNoIn0nCiAgICAgICAgICAgIC4nPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iJwogICAgICAgICAgICAuICRQYXJhbXtLZXl9CiAgICAgICAgICAgIC4gJyIgdmFsdWU9IicKICAgICAgICAgICAgLiAkVmFsdWUKICAgICAgICAgICAgLiAnIiBpZD0iJwogICAgICAgICAgICAuICRJdGVtSWQgLiAnU2VsZWN0ZWQnCiAgICAgICAgICAgIC4gJyIvPicKICAgICAgICAgICAgLiAnPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IicKICAgICAgICAgICAgLiAkUGFyYW17S2V5fQogICAgICAgICAgICAuICc6OlNlYXJjaCIgY2xhc3M9IicKICAgICAgICAgICAgLiAkQ2xhc3MKICAgICAgICAgICAgLiAnIiBpZD0iJwogICAgICAgICAgICAuICRJdGVtSWQKICAgICAgICAgICAgLiAnIiB2YWx1ZT0iJwogICAgICAgICAgICAuICRTZWFyY2ggLiAnIi8+JzsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTdHJpbmcKICAgICAgICAgICAgPSAnPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iJwogICAgICAgICAgICAuICRQYXJhbXtLZXl9CiAgICAgICAgICAgIC4gJyIgdmFsdWU9IicKICAgICAgICAgICAgLiAkVmFsdWUgLiAnIj4nCiAgICAgICAgICAgIC4gJzxpbnB1dCB0eXBlPSJUZXh0IiBuYW1lPSInCiAgICAgICAgICAgIC4gJFBhcmFte0tleX0KICAgICAgICAgICAgLiAnOjpTZWFyY2giIHNpemU9IicKICAgICAgICAgICAgLiAkU2l6ZQogICAgICAgICAgICAuICciIHZhbHVlPSInCiAgICAgICAgICAgIC4gJFNlYXJjaCAuICciPicgLiAnPGJyPicKICAgICAgICAgICAgLiAkU3RyaW5nT3B0aW9uCiAgICAgICAgICAgIC4gJFN0cmluZ1NlbGVjdAogICAgICAgICAgICAuICc8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSInCiAgICAgICAgICAgIC4gJFBhcmFte0tleX0KICAgICAgICAgICAgLiAnOjpCdXR0b25TZWFyY2giIHZhbHVlPSIkVGV4dHsiU2VhcmNoIn0iPicKICAgICAgICAgICAgLiAnJm5ic3A7JwogICAgICAgICAgICAuICc8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSInCiAgICAgICAgICAgIC4gJFBhcmFte0tleX0KICAgICAgICAgICAgLiAnOjpCdXR0b25DbGVhciIgdmFsdWU9IiRUZXh0eyJDbGVhciJ9Ij4nOwogICAgfQoKICAgIHJldHVybiAkU3RyaW5nOwp9Cgo9aXRlbSBTZWFyY2hGb3JtRGF0YUdldCgpCgpnZXQgc2VhcmNoIGZvcm0gZGF0YQoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hGb3JtRGF0YUdldCgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgI2NoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0tleX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEtleSEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgI2dldCBmb3JtIGRhdGEKICAgIG15IEBTZWFyY2hWYWx1ZXMgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9ICk7CgogICAgbXkgJVF1ZXVlcyA9ICRTZWxmLT57UXVldWVPYmplY3R9LT5RdWV1ZUxpc3QoCiAgICAgICAgVmFsaWQgICA9PiAxLAogICAgKTsKCiAgICBteSBAUXVldWVMaXN0OwogICAgZm9yZWFjaCBteSAkU2VhcmNoVmFsdWUgKEBTZWFyY2hWYWx1ZXMpIHsKICAgICAgICBuZXh0IGlmICEkU2VhcmNoVmFsdWU7CiAgICAgICAgZm9yIG15ICRRdWV1ZUlEIChrZXlzICVRdWV1ZXMpIHsKICAgICAgICAgICAgaWYgKCAkUXVldWVzeyRRdWV1ZUlEfSA9fiAvJFNlYXJjaFZhbHVlL2kgKSB7CiAgICAgICAgICAgICAgICBwdXNoKEBRdWV1ZUxpc3QsICRRdWV1ZUlEKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBpZiAoc2NhbGFyKEBRdWV1ZUxpc3QpIDwgMSB8fCAhJFF1ZXVlTGlzdFswXSkgewogICAgICAgIEBRdWV1ZUxpc3QgPSBAU2VhcmNoVmFsdWVzOwogICAgfQoKICAgIHJldHVybiBcQFF1ZXVlTGlzdDsKfQoKPWl0ZW0gU2VhcmNoSW5wdXRDcmVhdGUoKQoKY3JlYXRlIGEgc2VhcmNoIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hJbnB1dENyZWF0ZSgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgKTsKCj1jdXQKCnN1YiBTZWFyY2hJbnB1dENyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17S2V5fSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ05lZWQgS2V5IScKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBteSAkU3RyaW5nID0gIjxpbnB1dCB0eXBlPVwiVGV4dFwiIG5hbWU9XCIkUGFyYW17S2V5fVwiIHNpemU9XCIzMFwiPiI7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNiAkICREYXRlOiAyMDExLTA3LTA2IDEzOjUxOjQzICQKCj1jdXQKCg== Iy0tCiNLZXJuZWwvT3V0cHV0L0hUTUwvSVRTTUNvbmZpZ0l0ZW1MYXlvdXRTZXJ2aWNlUmVmZXJlbmNlLnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMKIyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMSBjLmEucC5lLiBJVCBHbWJILCBodHRwOi8vd3d3LmNhcGUtaXQuZGUKIwojLS0KIyRJZDogSVRTTUNvbmZpZ0l0ZW1MYXlvdXRTZXJ2aWNlUmVmZXJlbmNlLnBtLHYgMS43IDIwMTEtMDMtMzAgMTM6MTI6NTcgZm9iZXIgRXhwICQKIy0tCiNUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiNkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTGF5b3V0U2VydmljZVJlZmVyZW5jZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNyAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTGF5b3V0U2VydmljZVJlZmVyZW5jZSAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBvZiBTZXJ2aWNlIG9iamVjdHMKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgJEJhY2tlbmRPYmplY3QgPSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW1MYXlvdXRTZXJ2aWNlUmVmZXJlbmNlLT5uZXcoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdC4uLgogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjY2hlY2sgbmVlZGVkIG9iamVjdHMuLi4KICAgIGZvciBteSAkT2JqZWN0ICgKICAgICAgICBxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgUGFyYW1PYmplY3QgREJPYmplY3QgTGF5b3V0T2JqZWN0IEVuY29kZU9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgJFNlbGYtPntTZXJ2aWNlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpTZXJ2aWNlLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBPdXRwdXRTdHJpbmdDcmVhdGUoKQoKY3JlYXRlIG91dHB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+T3V0cHV0U3RyaW5nQ3JlYXRlKAogICAgICAgIFZhbHVlID0+IDExLCAgICAgICAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgT3V0cHV0U3RyaW5nQ3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgI3RyYW5zZm9ybSBhc2NpaSB0byBodG1sLi4uCiAgICAkUGFyYW17VmFsdWV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5Bc2NpaTJIdG1sKAogICAgICAgIFRleHQgPT4gJFBhcmFte1ZhbHVlfSB8fCAnJywKICAgICAgICBIVE1MUmVzdWx0TW9kZSA9PiAxLAogICAgKTsKCiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gRm9ybURhdGFHZXQoKQoKZ2V0IGZvcm0gZGF0YSBhcyBoYXNoIHJlZmVyZW5jZQoKICAgIG15ICRGb3JtRGF0YVJlZiA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtRGF0YUdldCgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgI2NoZWNrIG5lZWRlZCBzdHVmZi4uLgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJUZvcm1EYXRhOwoKICAgICNnZXQgc2VsZWN0ZWQgQ0lDbGFzc1JlZmVyZW5jZS4uLgogICAgJEZvcm1EYXRhe1ZhbHVlfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gKTsKCiAgICAjY2hlY2sgc2VhcmNoIGJ1dHRvbi4uCiAgICBpZiAoICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpCdXR0b25TZWFyY2gnICkgKSB7CiAgICAgICAgJFBhcmFte0l0ZW19LT57Rm9ybX0tPnsgJFBhcmFte0tleX0gfS0+e1NlYXJjaH0KICAgICAgICAgICAgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9IC4gJzo6U2VhcmNoJyApOwogICAgfQoKICAgICNjaGVjayBzZWxlY3QgYnV0dG9uLi4uCiAgICBlbHNpZiAoICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpCdXR0b25TZWxlY3QnICkgKSB7CiAgICAgICAgJEZvcm1EYXRhe1ZhbHVlfSA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbSggUGFyYW0gPT4gJFBhcmFte0tleX0gLiAnOjpTZWxlY3QnICk7CiAgICB9CgogICAgI2NoZWNrIGNsZWFyIGJ1dHRvbi4uLgogICAgZWxzaWYgKCAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9IC4gJzo6QnV0dG9uQ2xlYXInICkgKSB7CiAgICAgICAgJEZvcm1EYXRhe1ZhbHVlfSA9ICcnOwogICAgfQogICAgZWxzZSB7CgogICAgICAgICNyZXNldCB2YWx1ZSBpZiBzZWFyY2ggZmllbGQgaXMgZW1wdHkuLi4KICAgICAgICBpZiAoCiAgICAgICAgICAgICEkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9IC4gJzo6U2VhcmNoJyApCiAgICAgICAgICAgICYmIGRlZmluZWQgJEZvcm1EYXRhe1ZhbHVlfQogICAgICAgICAgICApCiAgICAgICAgewogICAgICAgICAgICAkRm9ybURhdGF7VmFsdWV9ID0gJyc7CiAgICAgICAgfQoKICAgICAgICAjY2hlY2sgcmVxdWlyZWQgb3B0aW9uLi4uCiAgICAgICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntSZXF1aXJlZH0gJiYgISRGb3JtRGF0YXtWYWx1ZX0gKSB7CiAgICAgICAgICAgICRQYXJhbXtJdGVtfS0+e0Zvcm19LT57ICRQYXJhbXtLZXl9IH0tPntJbnZhbGlkfSA9IDE7CiAgICAgICAgICAgICRGb3JtRGF0YXtJbnZhbGlkfSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBcJUZvcm1EYXRhOwp9Cgo9aXRlbSBJbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+SW5wdXRDcmVhdGUoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBWYWx1ZSA9PiAxMSwgICAgICAgIyAob3B0aW9uYWwpCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgSW5wdXRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjY2hlY2sgbmVlZGVkIHN0dWZmLi4uCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkVmFsdWUgPSAnJzsKICAgIGlmICggZGVmaW5lZCAkUGFyYW17VmFsdWV9ICkgewogICAgICAgICRWYWx1ZSA9ICRQYXJhbXtWYWx1ZX07CiAgICB9CiAgICBlbHNpZiAoICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1ZhbHVlRGVmYXVsdH0gKSB7CiAgICAgICAgJFZhbHVlID0gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VmFsdWVEZWZhdWx0fTsKICAgIH0KCiAgICBteSAkU2l6ZSAgICAgICAgID0gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57U2l6ZX0gfHwgNTA7CiAgICBteSAkU2VhcmNoICAgICAgID0gJyc7CiAgICBteSAkU3RyaW5nT3B0aW9uID0gJyc7CiAgICBteSAkU3RyaW5nU2VsZWN0ID0gJyc7CiAgICBteSAkQ2xhc3MgICAgPSAnVzUwcGMgU2VydmljZVNlYXJjaCc7CiAgICBteSAkUmVxdWlyZWQgPSAkUGFyYW17UmVxdWlyZWR9IHx8ICcnOwogICAgbXkgJEludmFsaWQgID0gJFBhcmFte0ludmFsaWR9IHx8ICcnOwogICAgbXkgJEl0ZW1JZCAgID0gJFBhcmFte0l0ZW1JZH0gfHwgJyc7CgogICAgIyBTZXJ2aWNlUmVmZXJlbmNlIHNlYXJjaC4uLgogICAgaWYgKCAkUGFyYW17SXRlbX0tPntGb3JtfS0+eyAkUGFyYW17S2V5fSB9LT57U2VhcmNofSApIHsKCiAgICAgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIyBzZWFyY2ggZm9yIG5hbWUuLi4uCiAgICAgICAgbXkgQFNlcnZpY2VJRHMgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlU2VhcmNoKAogICAgICAgICAgICBOYW1lICAgPT4gJyonIC4gJFBhcmFte0l0ZW19LT57Rm9ybX0tPnsgJFBhcmFte0tleX0gfS0+e1NlYXJjaH0gLiAnKicsCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CiAgICAgICAgbXkgJVNlcnZpY2VMaXN0ID0gKCk7CiAgICAgICAgZm9yIG15ICRDdXJyS2V5IChAU2VydmljZUlEcykgewogICAgICAgICAgICBteSAlU2VydmljZURhdGEgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlR2V0KAogICAgICAgICAgICAgICAgU2VydmljZUlEID0+ICRDdXJyS2V5LAogICAgICAgICAgICAgICAgVXNlcklEICAgID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIG5leHQgaWYgKCAhJVNlcnZpY2VEYXRhICk7CiAgICAgICAgICAgICRTZXJ2aWNlTGlzdHskQ3VycktleX0gPSAkU2VydmljZURhdGF7TmFtZX07CiAgICAgICAgfQoKICAgICAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAjIGJ1aWxkIHNlYXJjaCByZXN1bHQgcHJlc2VudGF0aW9uLi4uLgogICAgICAgIGlmICglU2VydmljZUxpc3QgJiYgc2NhbGFyKGtleXMgJVNlcnZpY2VMaXN0KSA+IDEpIHsKCiAgICAgICAgICAgICNjcmVhdGUgb3B0aW9uIGxpc3QuLi4KICAgICAgICAgICAgJFN0cmluZ09wdGlvbiA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QnVpbGRTZWxlY3Rpb24oCiAgICAgICAgICAgICAgICBOYW1lID0+ICRQYXJhbXtLZXl9IC4gJzo6U2VsZWN0JywKICAgICAgICAgICAgICAgIERhdGEgPT4gXCVTZXJ2aWNlTGlzdCwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFN0cmluZ09wdGlvbiAuPSAnPGJyPic7CgogICAgICAgICAgICAjY3JlYXRlIHNlbGVjdCBidXR0b24uLi4KICAgICAgICAgICAgJFN0cmluZ1NlbGVjdCA9ICc8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSInCiAgICAgICAgICAgICAgICAuICRQYXJhbXtLZXl9CiAgICAgICAgICAgICAgICAuICc6OkJ1dHRvblNlbGVjdCIgJwogICAgICAgICAgICAgICAgLiAndmFsdWU9IiRUZXh0eyJTZWxlY3QifSI+Jm5ic3A7JzsKCiAgICAgICAgICAgICNzZXQgc2VhcmNoLi4uCiAgICAgICAgICAgICRTZWFyY2ggPSAkUGFyYW17SXRlbX0tPntGb3JtfS0+eyAkUGFyYW17S2V5fSB9LT57U2VhcmNofTsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCVTZXJ2aWNlTGlzdCkgewogICAgICAgICAgICAkVmFsdWUgPSAoa2V5cyAlU2VydmljZUxpc3QpWzBdOwogICAgICAgICAgICBteSAlU2VydmljZURhdGEgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlR2V0KAogICAgICAgICAgICAgICAgU2VydmljZUlEID0+ICRWYWx1ZSwKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBteSAkU2VydmljZU5hbWUgPSAiIjsKCiAgICAgICAgICAgIGlmICggJVNlcnZpY2VEYXRhICYmICRTZXJ2aWNlRGF0YXtOYW1lfSApIHsKICAgICAgICAgICAgICAgICRTZXJ2aWNlTmFtZSA9ICRTZXJ2aWNlRGF0YXtOYW1lfTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgI3RyYW5zZm9ybSBhc2NpaSB0byBodG1sLi4uCiAgICAgICAgICAgICRTZWFyY2ggPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgICAgICAgICBUZXh0ID0+ICRTZXJ2aWNlTmFtZSB8fCAnJywKICAgICAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICAgICAgICAgICk7CiAgICAgICAgfQoKICAgIH0KCiAgICAjY3JlYXRlIENJQ2xhc3NSZWZlcmVuY2Ugc3RyaW5nLi4uCiAgICBlbHNpZiAoJFZhbHVlKSB7CgogICAgICAgIG15ICVTZXJ2aWNlRGF0YSA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VHZXQoCiAgICAgICAgICAgIFNlcnZpY2VJRCA9PiAkVmFsdWUsCiAgICAgICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgICAgICk7CiAgICAgICAgbXkgJFNlcnZpY2VOYW1lID0gIiI7CgogICAgICAgIGlmICggJVNlcnZpY2VEYXRhICYmICRTZXJ2aWNlRGF0YXtOYW1lfSApIHsKICAgICAgICAgICAgJFNlcnZpY2VOYW1lID0gJFNlcnZpY2VEYXRhe05hbWV9OwogICAgICAgIH0KCiAgICAgICAgI3RyYW5zZm9ybSBhc2NpaSB0byBodG1sLi4uCiAgICAgICAgJFNlYXJjaCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCgKICAgICAgICAgICAgVGV4dCA9PiAkU2VydmljZU5hbWUgfHwgJycsCiAgICAgICAgICAgIEhUTUxSZXN1bHRNb2RlID0+IDEsCiAgICAgICAgKTsKICAgIH0KCiAgICAjIEF1dG9Db21wbGV0ZSBDSUNsYXNzCiAgICBteSAkQXV0b0NvbXBsZXRlQ29uZmlnCiAgICAgICAgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTUNJQXR0cmlidXRlQ29sbGVjdGlvbjo6RnJvbnRlbmQ6OkNvbW1vblNlYXJjaEF1dG9Db21wbGV0ZScpOwoKICAgICNjcmVhdGUgc3RyaW5nLi4uCiAgICBteSAkU3RyaW5nID0gJyc7CiAgICBpZiAoJEF1dG9Db21wbGV0ZUNvbmZpZyAmJiByZWYoJEF1dG9Db21wbGV0ZUNvbmZpZykgZXEgJ0hBU0gnICYmICRBdXRvQ29tcGxldGVDb25maWctPntBY3RpdmV9KSB7CiAgICAKICAgICAgICAkU2VsZi0+e0xheW91dE9iamVjdH0tPkJsb2NrKAogICAgICAgICAgICBOYW1lID0+ICdTZXJ2aWNlU2VhcmNoQXV0b0NvbXBsZXRlJywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBtaW5RdWVyeUxlbmd0aCAgICAgID0+ICRBdXRvQ29tcGxldGVDb25maWctPntNaW5RdWVyeUxlbmd0aH0gICAgICB8fCAyLAogICAgICAgICAgICAgICAgcXVlcnlEZWxheSAgICAgICAgICA9PiAkQXV0b0NvbXBsZXRlQ29uZmlnLT57UXVlcnlEZWxheX0gICAgICAgICAgfHwgMC4xLAogICAgICAgICAgICAgICAgdHlwZUFoZWFkICAgICAgICAgICA9PiAkQXV0b0NvbXBsZXRlQ29uZmlnLT57VHlwZUFoZWFkfSAgICAgICAgICAgfHwgJ2ZhbHNlJywKICAgICAgICAgICAgICAgIG1heFJlc3VsdHNEaXNwbGF5ZWQgPT4gJEF1dG9Db21wbGV0ZUNvbmZpZy0+e01heFJlc3VsdHNEaXNwbGF5ZWR9IHx8IDIwLAogICAgICAgICAgICAgICAgZHluYW1pY1dpZHRoICAgICAgICA9PiAkQXV0b0NvbXBsZXRlQ29uZmlnLT57RHluYW1pY1dpZHRofSAgICAgICAgfHwgMSwKICAgICAgICAgICAgfSwKICAgICAgICApOwogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QmxvY2soCiAgICAgICAgICAgIE5hbWUgPT4gJ1NlcnZpY2VTZWFyY2hJbml0JywKICAgICAgICAgICAgRGF0YSA9PiB7CiAgICAgICAgICAgICAgICBJdGVtSUQgICAgICAgICAgICAgPT4gJEl0ZW1JZCwKICAgICAgICAgICAgICAgIEFjdGl2ZUF1dG9Db21wbGV0ZSA9PiAndHJ1ZScsCiAgICAgICAgICAgICAgICB9CiAgICAgICAgKTsKCiAgICAgICAgJFN0cmluZwogICAgICAgICAgICA9ICckSW5jbHVkZXsiQWdlbnRTZXJ2aWNlU2VhcmNoIn0nCiAgICAgICAgICAgIC4nPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iJwogICAgICAgICAgICAuICRQYXJhbXtLZXl9CiAgICAgICAgICAgIC4gJyIgdmFsdWU9IicKICAgICAgICAgICAgLiAkVmFsdWUKICAgICAgICAgICAgLiAnIiBpZD0iJwogICAgICAgICAgICAuICRJdGVtSWQgLiAnU2VsZWN0ZWQnCiAgICAgICAgICAgIC4gJyIvPicKICAgICAgICAgICAgLiAnPGlucHV0IHR5cGU9InRleHQiIG5hbWU9IicKICAgICAgICAgICAgLiAkUGFyYW17S2V5fQogICAgICAgICAgICAuICc6OlNlYXJjaCIgY2xhc3M9IicKICAgICAgICAgICAgLiAkQ2xhc3MKICAgICAgICAgICAgLiAnIiBpZD0iJwogICAgICAgICAgICAuICRJdGVtSWQKICAgICAgICAgICAgLiAnIiB2YWx1ZT0iJwogICAgICAgICAgICAuICRTZWFyY2ggLiAnIi8+JzsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTdHJpbmcKICAgICAgICAgICAgPSAnPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iJwogICAgICAgICAgICAuICRQYXJhbXtLZXl9CiAgICAgICAgICAgIC4gJyIgdmFsdWU9IicKICAgICAgICAgICAgLiAkVmFsdWUgLiAnIj4nCiAgICAgICAgICAgIC4gJzxpbnB1dCB0eXBlPSJUZXh0IiBuYW1lPSInCiAgICAgICAgICAgIC4gJFBhcmFte0tleX0KICAgICAgICAgICAgLiAnOjpTZWFyY2giIHNpemU9IicKICAgICAgICAgICAgLiAkU2l6ZQogICAgICAgICAgICAuICciIHZhbHVlPSInCiAgICAgICAgICAgIC4gJFNlYXJjaCAuICciPicgLiAnPGJyPicKICAgICAgICAgICAgLiAkU3RyaW5nT3B0aW9uCiAgICAgICAgICAgIC4gJFN0cmluZ1NlbGVjdAogICAgICAgICAgICAuICc8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSInCiAgICAgICAgICAgIC4gJFBhcmFte0tleX0KICAgICAgICAgICAgLiAnOjpCdXR0b25TZWFyY2giIHZhbHVlPSIkVGV4dHsiU2VhcmNoIn0iPicKICAgICAgICAgICAgLiAnJm5ic3A7JwogICAgICAgICAgICAuICc8aW5wdXQgY2xhc3M9ImJ1dHRvbiIgdHlwZT0ic3VibWl0IiBuYW1lPSInCiAgICAgICAgICAgIC4gJFBhcmFte0tleX0KICAgICAgICAgICAgLiAnOjpCdXR0b25DbGVhciIgdmFsdWU9IiRUZXh0eyJDbGVhciJ9Ij4nOwogICAgfQoKICAgIHJldHVybiAkU3RyaW5nOwp9Cgo9aXRlbSBTZWFyY2hGb3JtRGF0YUdldCgpCgpnZXQgc2VhcmNoIGZvcm0gZGF0YQoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hGb3JtRGF0YUdldCgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgI2NoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0tleX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEtleSEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgQFNlcnZpY2VJRHM7CgogICAgI2dldCBmb3JtIGRhdGEKICAgIG15IEBTZWFyY2hWYWx1ZXMgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9ICk7CgogICAgZm9yZWFjaCBteSAkU2VhcmNoVmFsdWUgKEBTZWFyY2hWYWx1ZXMpIHsKICAgICAgICBuZXh0IGlmICEkU2VhcmNoVmFsdWU7CiAgICAgICAgbXkgQFNlcnZpY2VJRER1bW15cyA9ICRTZWxmLT57U2VydmljZU9iamVjdH0tPlNlcnZpY2VTZWFyY2goCiAgICAgICAgICAgIE5hbWUgICA9PiAnKicgLiAkU2VhcmNoVmFsdWUgLiAnKicsCiAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICk7CiAgICAgICAgcHVzaChAU2VydmljZUlEcyxAU2VydmljZUlERHVtbXlzKTsKICAgIH0KCiAgICBpZiAoc2NhbGFyKEBTZXJ2aWNlSURzKSA8IDEgfHwgISRTZXJ2aWNlSURzWzBdKSB7CiAgICAgICAgQFNlcnZpY2VJRHMgPSBAU2VhcmNoVmFsdWVzOwogICAgfQoKICAgIHJldHVybiBcQFNlcnZpY2VJRHM7Cn0KCj1pdGVtIFNlYXJjaElucHV0Q3JlYXRlKCkKCmNyZWF0ZSBhIHNlYXJjaCBpbnB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+U2VhcmNoSW5wdXRDcmVhdGUoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICk7Cgo9Y3V0CgpzdWIgU2VhcmNoSW5wdXRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0tleX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEtleSEnCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJFN0cmluZyA9ICI8aW5wdXQgdHlwZT1cIlRleHRcIiBuYW1lPVwiJFBhcmFte0tleX1cIiBzaXplPVwiMzBcIj4iOwoKICAgIHJldHVybiAkU3RyaW5nOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjcgJCAkRGF0ZTogMjAxMS0wMy0zMCAxMzoxMjo1NyAkCgo9Y3V0Cgo= IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ29uZmlnSXRlbUxheW91dENJQXR0YWNobWVudC5wbSAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwNi0yMDExIGMuYS5wLmUuIElUIEdtYkgsIGh0dHA6Ly93d3cuY2FwZS1pdC5kZQojCiMgd3JpdHRlbi9lZGl0ZWQgYnk6CiMgKiBUb3JzdGVuKGRvdClUaGF1KGF0KWNhcGUtaXQoZG90KWRlCiMgKiBBbm5hKGRvdClMaXR2aW5vdmEoYXQpY2FwZS1pdChkb3QpZGUKIyAtLQojICRJZDogSVRTTUNvbmZpZ0l0ZW1MYXlvdXRDSUF0dGFjaG1lbnQucG0sdiAxLjYgMjAxMS0wNy0yNSAwOTowMjowMSBzbWVobGlnIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6Ok91dHB1dDo6SFRNTDo6SVRTTUNvbmZpZ0l0ZW1MYXlvdXRDSUF0dGFjaG1lbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkNJQXR0YWNobWVudFN0b3JhZ2U6OkF0dGFjaG1lbnRTdG9yYWdlOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjYgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbUxheW91dENJQXR0YWNobWVudCAtIGxheW91dCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgbGF5b3V0IGZ1bmN0aW9ucyBvZiBDSUF0dGFjaG1lbnQgb2JqZWN0cwoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhIG9iamVjdAoKICAgICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTGF5b3V0Q0lBdHRhY2htZW50LT5uZXcoCiAgICAgICAgJVBhcmFtLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgI2NoZWNrIHJlcXVpcmVkIG9iamVjdHMuLi4KICAgIGZvcmVhY2ggKHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCBQYXJhbU9iamVjdCBEQk9iamVjdCBMYXlvdXRPYmplY3QgRW5jb2RlT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgIGlmICggISRTZWxmLT57QXR0YWNobWVudFN0b3JhZ2VPYmplY3R9ICkgewogICAgICAgICRTZWxmLT57QXR0YWNobWVudFN0b3JhZ2VPYmplY3R9ID0KICAgICAgICAgICAgS2VybmVsOjpTeXN0ZW06OkNJQXR0YWNobWVudFN0b3JhZ2U6OkF0dGFjaG1lbnRTdG9yYWdlLT5uZXcoICV7JFNlbGZ9ICk7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBPdXRwdXRTdHJpbmdDcmVhdGUoKQoKY3JlYXRlIG91dHB1dCBzdHJpbmcKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+T3V0cHV0U3RyaW5nQ3JlYXRlKAogICAgICAgIFZhbHVlID0+IDExLCAgICAgICAjIChvcHRpb25hbCkKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBPdXRwdXRTdHJpbmdDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIG15ICRTdHJpbmcgPSAiIjsKCiAgICAjY2hlY2sgcmVxdWlyZWQgc3R1ZmYuLi4KICAgIGZvcmVhY2ggKHF3KEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIGlmICggJFBhcmFte1ZhbHVlfSApIHsKICAgICAgICBteSAlQXR0RGlyRGF0YSAgID0gKCk7CiAgICAgICAgbXkgJFNpemVOb3RlICAgICA9ICIiOwogICAgICAgIG15ICRSZWFsRmlsZVNpemUgPSAwOwogICAgICAgIG15ICRNRDVOb3RlICAgICAgPSAiIjsKICAgICAgICBteSAkUmVhbE1ENVN1bSAgID0gIiI7CgogICAgICAgICMgZ2V0IHNhdmVkIHByb3BlcnRpZXMgKGF0dGFjaG1lbnQgZGlyZWN0b3J5IGluZm8pCiAgICAgICAgJUF0dERpckRhdGEgPSAkU2VsZi0+e0F0dGFjaG1lbnRTdG9yYWdlT2JqZWN0fS0+QXR0YWNobWVudFN0b3JhZ2VHZXREaXJlY3RvcnkoCiAgICAgICAgICAgIElEID0+ICRQYXJhbXtWYWx1ZX0sCiAgICAgICAgKTsKCiAgICAgICAgaWYgKAogICAgICAgICAgICAkQXR0RGlyRGF0YXtQcmVmZXJlbmNlc30tPntGaWxlU2l6ZUJ5dGVzfQogICAgICAgICAgICAmJgogICAgICAgICAgICAkQXR0RGlyRGF0YXtQcmVmZXJlbmNlc30tPntNRDVTdW19CiAgICAgICAgICAgICkKICAgICAgICB7CgogICAgICAgICAgICAjIGdldCByZWFsIHByb3BlcnRpZXMgdG8gY2hlY2sgaWYgdGhlIGF0dGFjaG1lbnQgY29udGVudCBoYXMgYmVlbiBjaGFuZ2VkCiAgICAgICAgICAgIG15ICVSZWFsUHJvcGVydGllcyA9CiAgICAgICAgICAgICAgICAkU2VsZi0+e0F0dGFjaG1lbnRTdG9yYWdlT2JqZWN0fS0+QXR0YWNobWVudFN0b3JhZ2VHZXRSZWFsUHJvcGVydGllcygKICAgICAgICAgICAgICAgICVBdHREaXJEYXRhLAogICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICRSZWFsTUQ1U3VtICAgPSAkUmVhbFByb3BlcnRpZXN7UmVhbE1ENVN1bX07CiAgICAgICAgICAgICRSZWFsRmlsZVNpemUgPSAkUmVhbFByb3BlcnRpZXN7UmVhbEZpbGVTaXplfTsKCiAgICAgICAgICAgIG15ICRNRDVDaGVja0VuYWJsZWQgPQogICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0lUU01DSUF0dHJpYnV0ZUNvbGxlY3Rpb246OkF0dGFjaG1lbnRNRDVDaGVjaycpIHx8ICcnOwogICAgICAgICAgICBteSAkU2l6ZUNoZWNrRW5hYmxlZCA9CiAgICAgICAgICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTUNJQXR0cmlidXRlQ29sbGVjdGlvbjo6QXR0YWNobWVudFNpemVDaGVjaycpIHx8ICcnOwoKICAgICAgICAgICAgaWYgKCAkU2l6ZUNoZWNrRW5hYmxlZCAmJiAkUmVhbEZpbGVTaXplICE9ICRBdHREaXJEYXRhe1ByZWZlcmVuY2VzfS0+e0ZpbGVTaXplQnl0ZXN9ICkgewogICAgICAgICAgICAgICAgJFNpemVOb3RlID0gIkludmFsaWQgY29udGVudCAtIGZpbGUgc2l6ZSBvbiBkaXNrICIKICAgICAgICAgICAgICAgICAgICAuICJoYXMgYmVlbiBjaGFuZ2VkIjsKCiAgICAgICAgICAgICAgICBpZiAoICRSZWFsRmlsZVNpemUgPiAoIDEwMjQgKiAxMDI0ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgJFJlYWxGaWxlU2l6ZSA9IHNwcmludGYgIiUuMWYgTUJ5dGVzIiwgKCAkUmVhbEZpbGVTaXplIC8gKCAxMDI0ICogMTAyNCApICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNpZiAoICRSZWFsRmlsZVNpemUgPiAxMDI0ICkgewogICAgICAgICAgICAgICAgICAgICRSZWFsRmlsZVNpemUgPSBzcHJpbnRmICIlLjFmIEtCeXRlcyIsICggKCAkUmVhbEZpbGVTaXplIC8gMTAyNCApICk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAkUmVhbEZpbGVTaXplID0gJFJlYWxGaWxlU2l6ZSAuICcgQnl0ZXMnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2lmICggJE1ENUNoZWNrRW5hYmxlZCAmJiAkUmVhbE1ENVN1bSBuZSAkQXR0RGlyRGF0YXtQcmVmZXJlbmNlc30tPntNRDVTdW19ICkgewogICAgICAgICAgICAgICAgJE1ENU5vdGUgPSAiSW52YWxpZCBtZDVzdW0gLSBUaGUgZmlsZSBtaWdodCBoYXZlIGJlZW4gY2hhbmdlZCI7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgICMgYnVpbGQgdGhlIGF0dGFjaG1lbnQgcGFydCBvZiB0aGUgb3V0cHV0CiAgICAgICAgJFN0cmluZyA9ICRTZWxmLT5CdWlsZEF0dGFjaG1lbnRQcmVzZW50YXRpb24oCiAgICAgICAgICAgIEZpbGVOYW1lICAgPT4gJEF0dERpckRhdGF7RmlsZU5hbWV9LAogICAgICAgICAgICBGaWxlU2l6ZSAgID0+ICRBdHREaXJEYXRhe1ByZWZlcmVuY2VzfS0+e0ZpbGVTaXplfSwKICAgICAgICAgICAgRGF0YVR5cGUgICA9PiAkQXR0RGlyRGF0YXtQcmVmZXJlbmNlc30tPntEYXRhVHlwZX0sCiAgICAgICAgICAgIFNpemVOb3RlICAgPT4gJFNpemVOb3RlLAogICAgICAgICAgICBTaXplT25EaXNrID0+ICRSZWFsRmlsZVNpemUsCiAgICAgICAgICAgIE1ENU5vdGUgICAgPT4gJE1ENU5vdGUsCiAgICAgICAgICAgIEF0dGFjaElEICAgPT4gJEF0dERpckRhdGF7QXR0RGlySUR9LAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCj1pdGVtIEZvcm1EYXRhR2V0KCkKCmdldCBmb3JtIGRhdGEgYXMgaGFzaCByZWZlcmVuY2UKCiAgICBteSAkRm9ybURhdGFSZWYgPSAkQmFja2VuZE9iamVjdC0+Rm9ybURhdGFHZXQoCiAgICAgICAgS2V5ID0+ICdJdGVtOjoxOjpOb2RlOjozJywKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBGb3JtRGF0YUdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgbXkgJUZvcm1EYXRhOwogICAgbXkgJEF0dERpcklEID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSAuICJJRCIgKSB8fCAnJzsKICAgIG15ICRBdHREaXJEZWwgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9IC4gIkRlbGV0ZSIgKTsKICAgIG15ICRDb25maWdJdGVtSUQgPSAkUGFyYW17Q29uZmlnSXRlbUlEfTsKCiAgICAjbXkgJENvbmZpZ0l0ZW1JRCA9ICRTZWxmLT57UGFyYW1PYmplY3R9LT5HZXRQYXJhbShQYXJhbSA9PiAnQ29uZmlnSXRlbUlEJyk7CgogICAgI2NoZWNrIHJlcXVpcmVkIHN0dWZmLi4uCiAgICBmb3JlYWNoIChxdyhLZXkgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgI2dldCB0aGUgdXBsb2FkIGZpbGUuLi4uCiAgICBteSAlVXBsb2FkU3R1ZmYgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0VXBsb2FkQWxsKAogICAgICAgIFBhcmFtICA9PiAkUGFyYW17S2V5fSAuICJVcGxvYWQiLAogICAgICAgIFNvdXJjZSA9PiAnc3RyaW5nJywKICAgICk7CgogICAgI3NhdmUgdGhlIGF0dGFjaG1lbnQgaWYgdGhlcmUgaXMgb25lLi4uCiAgICBpZiAoICglVXBsb2FkU3R1ZmYpICYmICRDb25maWdJdGVtSUQgKSB7CgogICAgICAgICNzdG9yZSB0aGUgYXR0YWNobWVudCBpbiB0aGUgZGVmYXVsdCBzdG9yYWdlIGJhY2tlbmQuLi4uCiAgICAgICAgJEF0dERpcklEID0gJFNlbGYtPntBdHRhY2htZW50U3RvcmFnZU9iamVjdH0tPkF0dGFjaG1lbnRTdG9yYWdlQWRkKAogICAgICAgICAgICBEYXRhUmVmICA9PiBcJFVwbG9hZFN0dWZme0NvbnRlbnR9LAogICAgICAgICAgICBGaWxlTmFtZSA9PiAkVXBsb2FkU3R1ZmZ7RmlsZW5hbWV9LAogICAgICAgICAgICBTdG9yYWdlQmFja2VuZCA9PgogICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0F0dGFjaG1lbnRTdG9yYWdlOjpEZWZhdWx0U3RvcmFnZUJhY2tlbmRNb2R1bGUnKSwKICAgICAgICAgICAgVXNlcklEICAgICAgPT4gMSwKICAgICAgICAgICAgUHJlZmVyZW5jZXMgPT4gewogICAgICAgICAgICAgICAgRGF0YVR5cGUgPT4gJFVwbG9hZFN0dWZme0NvbnRlbnRUeXBlfSwKICAgICAgICAgICAgICAgIH0KICAgICAgICApOwoKICAgIH0KCiAgICAjeG1sX3N0b3JhZ2Ugc3RvcmVzIG9ubHkgdGhlIHJlZmVyZW5jZSB0byB0aGUgYXR0YWNobWVudCBkaXJlY3RvcnkgZW50cnkKICAgICNnZXQgdGhlIEF0dGFjaG1lbnREaXJlY3RvcnktSUQgKGVpdGhlciBleGlzdGluZyBvciBqdXN0IHVwbG9hZGVkKS4uLgogICAgJEZvcm1EYXRhe1ZhbHVlfSA9IHVuZGVmOwoKICAgIGlmICgkQXR0RGlySUQpIHsKICAgICAgICAkRm9ybURhdGF7VmFsdWV9ID0gJEF0dERpcklEOwogICAgfQoKICAgIGlmICggKCRBdHREaXJEZWwpICkgeyAgICAjICYmICEoJVVwbG9hZFN0dWZmKQogICAgICAgICRGb3JtRGF0YXtWYWx1ZX0gPSAnJzsKICAgIH0KCiAgICAjc2V0IGludmFsaWQgcGFyYW0uLi4KICAgIGlmICggJFBhcmFte0l0ZW19LT57SW5wdXR9LT57UmVxdWlyZWR9ICYmICEkRm9ybURhdGF7VmFsdWV9ICkgewogICAgICAgICRGb3JtRGF0YXtJbnZhbGlkfSA9IDE7CiAgICAgICAgJFBhcmFte0l0ZW19LT57Rm9ybX0tPnsgJFBhcmFte0tleX0gfS0+e0ludmFsaWR9ID0gMTsKICAgIH0KCiAgICByZXR1cm4gXCVGb3JtRGF0YTsKfQoKPWl0ZW0gSW5wdXRDcmVhdGUoKQoKY3JlYXRlIGEgaW5wdXQgc3RyaW5nCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPklucHV0Q3JlYXRlKAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgVmFsdWUgPT4gMTEsICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIElucHV0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSAlQXR0RGlyRGF0YSAgID0gKCk7CiAgICBteSAkU2l6ZU5vdGUgICAgID0gIiI7CiAgICBteSAkUmVhbEZpbGVTaXplID0gMDsKICAgIG15ICRNRDVOb3RlICAgICAgPSAiIjsKICAgIG15ICRSZWFsTUQ1U3VtICAgPSAiIjsKCiAgICAjY2hlY2sgcmVxdWlyZWQgc3R1ZmYuLi4KICAgIGZvcmVhY2ggKHF3KEtleSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICRQYXJhbXtWYWx1ZX0gKSB7CgogICAgICAgICMgZ2V0IHNhdmVkIGF0dGFjaG1lbnQgcHJvcGVydGllcyB1bmQgcHJlZmVyZW5jZXMKICAgICAgICAlQXR0RGlyRGF0YSA9ICRTZWxmLT57QXR0YWNobWVudFN0b3JhZ2VPYmplY3R9LT5BdHRhY2htZW50U3RvcmFnZUdldERpcmVjdG9yeSgKICAgICAgICAgICAgSUQgPT4gJFBhcmFte1ZhbHVlfQogICAgICAgICk7CgogICAgICAgIGlmICgKICAgICAgICAgICAgJEF0dERpckRhdGF7UHJlZmVyZW5jZXN9LT57RmlsZVNpemVCeXRlc30KICAgICAgICAgICAgJiYKICAgICAgICAgICAgJEF0dERpckRhdGF7UHJlZmVyZW5jZXN9LT57TUQ1U3VtfQogICAgICAgICAgICApCiAgICAgICAgewoKICAgICAgICAgICAgIyBnZXQgcmVhbCBwcm9wZXJ0aWVzIHRvIGNoZWNrIGlmIHRoZSBhdHRhY2htZW50IGNvbnRlbnQgaGFzIGJlZW4gY2hhbmdlZAogICAgICAgICAgICBteSAlUmVhbFByb3BlcnRpZXMgPQogICAgICAgICAgICAgICAgJFNlbGYtPntBdHRhY2htZW50U3RvcmFnZU9iamVjdH0tPkF0dGFjaG1lbnRTdG9yYWdlR2V0UmVhbFByb3BlcnRpZXMoCiAgICAgICAgICAgICAgICAlQXR0RGlyRGF0YSwKICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAkUmVhbE1ENVN1bSAgID0gJFJlYWxQcm9wZXJ0aWVze1JlYWxNRDVTdW19OwogICAgICAgICAgICAkUmVhbEZpbGVTaXplID0gJFJlYWxQcm9wZXJ0aWVze1JlYWxGaWxlU2l6ZX07CgogICAgICAgICAgICBteSAkTUQ1Q2hlY2tFbmFibGVkID0KICAgICAgICAgICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdJVFNNQ0lBdHRyaWJ1dGVDb2xsZWN0aW9uOjpBdHRhY2htZW50TUQ1Q2hlY2snKSB8fCAnJzsKICAgICAgICAgICAgbXkgJFNpemVDaGVja0VuYWJsZWQgPQogICAgICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0lUU01DSUF0dHJpYnV0ZUNvbGxlY3Rpb246OkF0dGFjaG1lbnRTaXplQ2hlY2snKSB8fCAnJzsKCiAgICAgICAgICAgIGlmICggJFNpemVDaGVja0VuYWJsZWQgJiYgJFJlYWxGaWxlU2l6ZSAhPSAkQXR0RGlyRGF0YXtQcmVmZXJlbmNlc30tPntGaWxlU2l6ZUJ5dGVzfSApIHsKICAgICAgICAgICAgICAgICRTaXplTm90ZSA9ICJJbnZhbGlkIGNvbnRlbnQgLSBmaWxlIHNpemUgb24gZGlzayAiCiAgICAgICAgICAgICAgICAgICAgLiAiaGFzIGJlZW4gY2hhbmdlZCI7CgogICAgICAgICAgICAgICAgaWYgKCAkUmVhbEZpbGVTaXplID4gKCAxMDI0ICogMTAyNCApICkgewogICAgICAgICAgICAgICAgICAgICRSZWFsRmlsZVNpemUgPSBzcHJpbnRmICIlLjFmIE1CeXRlcyIsICggJFJlYWxGaWxlU2l6ZSAvICggMTAyNCAqIDEwMjQgKSApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzaWYgKCAkUmVhbEZpbGVTaXplID4gMTAyNCApIHsKICAgICAgICAgICAgICAgICAgICAkUmVhbEZpbGVTaXplID0gc3ByaW50ZiAiJS4xZiBLQnl0ZXMiLCAoICggJFJlYWxGaWxlU2l6ZSAvIDEwMjQgKSApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgJFJlYWxGaWxlU2l6ZSA9ICRSZWFsRmlsZVNpemUgLiAnIEJ5dGVzJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRNRDVDaGVja0VuYWJsZWQgJiYgJFJlYWxNRDVTdW0gbmUgJEF0dERpckRhdGF7UHJlZmVyZW5jZXN9LT57TUQ1U3VtfSApIHsKICAgICAgICAgICAgICAgICRNRDVOb3RlID0gIkludmFsaWQgbWQ1c3VtIC0gVGhlIGZpbGUgbWlnaHQgaGF2ZSBiZWVuIGNoYW5nZWQiOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgICMgYnVpbGQgdGhlIGF0dGFjaG1lbnQgcGFydCBvZiB0aGUgb3V0cHV0CiAgICBteSAkU3RyaW5nID0gJFNlbGYtPkJ1aWxkQXR0YWNobWVudE1vZGlmaWNhdGlvbigKICAgICAgICBGaWxlTmFtZSAgID0+ICRBdHREaXJEYXRhe0ZpbGVOYW1lfSwKICAgICAgICBGaWxlU2l6ZSAgID0+ICRBdHREaXJEYXRhe1ByZWZlcmVuY2VzfS0+e0ZpbGVTaXplfSwKICAgICAgICBEYXRhVHlwZSAgID0+ICRBdHREaXJEYXRhe1ByZWZlcmVuY2VzfS0+e0RhdGFUeXBlfSwKICAgICAgICBTaXplTm90ZSAgID0+ICRTaXplTm90ZSwKICAgICAgICBTaXplT25EaXNrID0+ICRSZWFsRmlsZVNpemUsCiAgICAgICAgTUQ1Tm90ZSAgICA9PiAkTUQ1Tm90ZSwKICAgICAgICBBdHRhY2hJRCAgID0+ICRQYXJhbXtWYWx1ZX0sCiAgICAgICAgS2V5ICAgICAgICA9PiAkUGFyYW17S2V5fSwKICAgICk7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCj1jdXQgaXRlbSBCdWlsZEF0dGFjaG1lbnRNb2RpZmljYXRpb24oKQpidWlsZCB0aGUgYXR0YWNobWVudCBwYXJ0IG9mIHRoZSBvdXRwdXQgaW4gQ29uZmlnSXRlbSBFZGl0IHdpbmRvdwo9Y3V0CgpzdWIgQnVpbGRBdHRhY2htZW50TW9kaWZpY2F0aW9uIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSAkRXhpc3RpbmdBdHRhY2htZW50ID0gIiI7CiAgICBteSAkQXR0RGlySUROYW1lICAgICAgID0gJFBhcmFte0tleX0gLiAiSUQiOwogICAgbXkgJEF0dERpckRlbCAgICAgICAgICA9ICRQYXJhbXtLZXl9IC4gIkRlbGV0ZSI7CiAgICBteSAkQXR0RGlySURVcGxvYWROYW1lID0gJFBhcmFte0tleX0gLiAiVXBsb2FkIjsKCiAgICBteSAkQXR0YWNoSUQgPSAkUGFyYW17QXR0YWNoSUR9IHx8ICcnOwoKICAgIG15ICRBZHZpY2UgPQogICAgICAgICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdTZWxlY3QgYSBmaWxlIHRvIHJlcGxhY2UgY3VycmVudCBhdHRhY2htZW50Jyk7CgogICAgIyAgICBteSAkRGVsZXRlVGV4dCA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdSZW1vdmUgYXR0YWNobWVudCcpOwogICAgIyAgICBteSAkWWVzVGV4dCAgICA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCdZZXMnKTsKCiAgICBpZiAoIGRlZmluZWQoICRQYXJhbXtGaWxlTmFtZX0gKSAmJiAoICRQYXJhbXtGaWxlTmFtZX0gKSApIHsKICAgICAgICBteSAkYWhyZWYgPQogICAgICAgICAgICAiPGEgaHJlZj1cIiIKICAgICAgICAgICAgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCYXNlbGlua30KICAgICAgICAgICAgLiAiQWN0aW9uPUFnZW50QXR0YWNobWVudFN0b3JhZ2U7IgogICAgICAgICAgICAuICJBdHRhY2htZW50RGlyZWN0b3J5SUQ9JFBhcmFte0F0dGFjaElEfSI7CgogICAgICAgICMgYWRkIHNlc3Npb24gaWQgaWYgbmVlZGVkCiAgICAgICAgaWYgKCAhJFNlbGYtPntMYXlvdXRPYmplY3R9LT57U2Vzc2lvbklEQ29va2llfSApIHsKICAgICAgICAgICAgJGFocmVmIC49ICI7IgogICAgICAgICAgICAgICAgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntTZXNzaW9uTmFtZX0KICAgICAgICAgICAgICAgIC4gIj0iCiAgICAgICAgICAgICAgICAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e1Nlc3Npb25JRH07CiAgICAgICAgfQogICAgICAgICRhaHJlZiAuPSAiXCI+IjsKCiAgICAgICAgJEV4aXN0aW5nQXR0YWNobWVudCA9ICIgPGxpPiIKICAgICAgICAgICAgLiAkYWhyZWYKICAgICAgICAgICAgLiAiPGI+JFBhcmFte0ZpbGVOYW1lfTwvYj48L2E+Jm5ic3A7Jm5ic3A7IgogICAgICAgICAgICAuICIoJFBhcmFte0ZpbGVTaXplfSkiCgogICAgICAgIyAgICAgICAgICAgLiAiPC9saT4iCiAgICAgICAjICAgICAgICAgICAuICIgPGxpPiIKICAgICAgICMgICAgICAgICAgIC4gIjxsYWJlbCBmb3I9XCIkQXR0RGlyRGVsXCI+JERlbGV0ZVRleHQ6IDwvbGFiZWw+IgogICAgICAgIyAgICAgICAgICAgLiAiIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBpZD0gXCIkQXR0RGlyRGVsXCIgbmFtZT1cIiRBdHREaXJEZWxcIiB2YWx1ZT1cIjFcIj4iCiAgICAgICAgICAgIC4gIiA8L2xpPiI7CgogICAgICAgIGlmICggJFBhcmFte1NpemVOb3RlfSApIHsKICAgICAgICAgICAgJEV4aXN0aW5nQXR0YWNobWVudCAuPSAiIDxsaT48Zm9udCBjb2xvcj1cInJlZFwiPiIKICAgICAgICAgICAgICAgIC4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoICRQYXJhbXtTaXplTm90ZX0gKQogICAgICAgICAgICAgICAgLiAiICgiCiAgICAgICAgICAgICAgICAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCAkUGFyYW17U2l6ZU9uRGlza30gKQogICAgICAgICAgICAgICAgLiAiKSIKICAgICAgICAgICAgICAgIC4gIiEgPC9mb250PjwvbGk+IjsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkUGFyYW17TUQ1Tm90ZX0gKSB7CiAgICAgICAgICAgICRFeGlzdGluZ0F0dGFjaG1lbnQgLj0gIiA8bGk+PGZvbnQgY29sb3I9XCJyZWRcIj4iCiAgICAgICAgICAgICAgICAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCAkUGFyYW17TUQ1Tm90ZX0gKQogICAgICAgICAgICAgICAgLiAiISA8L2ZvbnQ+PC9saT4iOwogICAgICAgIH0KICAgICAgICAkRXhpc3RpbmdBdHRhY2htZW50IC49ICI8bGk+IDxsYWJlbCBmb3I9XCIkQXR0RGlySUROYW1lXCI+JEFkdmljZTo8L2xhYmVsPjwvbGk+IjsKICAgIH0KICAgIG15ICRPdXRwdXQgPSAiPHVsPiIgLiAkRXhpc3RpbmdBdHRhY2htZW50CiAgICAgICAgLiAiPC91bD4iCiAgICAgICAgLiAiPGlucHV0IHR5cGU9XCJoaWRkZW5cIiBuYW1lPVwiJEF0dERpcklETmFtZVwiIHZhbHVlPVwiJEF0dGFjaElEXCIvPiAiCiAgICAgICAgLiAiPGlucHV0IHR5cGU9XCJmaWxlXCIgaWQ9XCIkQXR0RGlySUROYW1lXCIgbmFtZT1cIiRBdHREaXJJRFVwbG9hZE5hbWVcIiBjbGFzcz1cImZpeGVkXCIvPiAiOwoKICAgIHJldHVybiAkT3V0cHV0Owp9Cgo9Y3V0IGl0ZW0gQnVpbGRBdHRhY2htZW50TW9kaWZpY2F0aW9uKCkKYnVpbGQgdGhlIGF0dGFjaG1lbnQgcGFydCBvZiB0aGUgb3V0cHV0IGZvciBDb25maWdJdGVtIERldGFpbHMKPWN1dAoKc3ViIEJ1aWxkQXR0YWNobWVudFByZXNlbnRhdGlvbiB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgbXkgJE91dHB1dCA9ICcnOwoKICAgIGlmICggJFBhcmFte0F0dGFjaElEfSAmJiAkUGFyYW17RmlsZU5hbWV9ICkgewoKICAgICAgICBteSAkYWhyZWYgPSAiPGEgaHJlZj1cIiIKICAgICAgICAgICAgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntCYXNlbGlua30KICAgICAgICAgICAgLiAiQWN0aW9uPUFnZW50QXR0YWNobWVudFN0b3JhZ2U7IgogICAgICAgICAgICAuICJBdHRhY2htZW50RGlyZWN0b3J5SUQ9JFBhcmFte0F0dGFjaElEfSI7CgogICAgICAgICMgYWRkIHNlc3Npb24gaWQgaWYgbmVlZGVkCiAgICAgICAgaWYgKCAhJFNlbGYtPntMYXlvdXRPYmplY3R9LT57U2Vzc2lvbklEQ29va2llfSApIHsKICAgICAgICAgICAgJGFocmVmIC49ICI7IgogICAgICAgICAgICAgICAgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntTZXNzaW9uTmFtZX0KICAgICAgICAgICAgICAgIC4gIj0iCiAgICAgICAgICAgICAgICAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e1Nlc3Npb25JRH07CiAgICAgICAgfQogICAgICAgICRhaHJlZiAuPSAiXCI+IjsKCiAgICAgICAgJE91dHB1dCA9ICRhaHJlZiAuICIkUGFyYW17RmlsZU5hbWV9PC9hPiZuYnNwOyZuYnNwOyIgLgogICAgICAgICAgICAiJm5ic3A7KCRQYXJhbXtGaWxlU2l6ZX0pJm5ic3A7IjsKCiAgICAgICAgaWYgKCAkUGFyYW17U2l6ZU5vdGV9ICkgewogICAgICAgICAgICAkT3V0cHV0IC49ICc8Zm9udCBjb2xvcj0icmVkIj4nCiAgICAgICAgICAgICAgICAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCAkUGFyYW17U2l6ZU5vdGV9ICkKICAgICAgICAgICAgICAgIC4gIiAoIgogICAgICAgICAgICAgICAgLiAkU2VsZi0+e0xheW91dE9iamVjdH0tPntMYW5ndWFnZU9iamVjdH0tPkdldCggJFBhcmFte1NpemVPbkRpc2t9ICkKICAgICAgICAgICAgICAgIC4gIikiCiAgICAgICAgICAgICAgICAuICchPC9mb250Pic7CiAgICAgICAgfQogICAgICAgIGVsc2lmICggJFBhcmFte01ENU5vdGV9ICkgewogICAgICAgICAgICAkT3V0cHV0IC49ICc8Zm9udCBjb2xvcj0icmVkIj4nCiAgICAgICAgICAgICAgICAuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+e0xhbmd1YWdlT2JqZWN0fS0+R2V0KCAkUGFyYW17TUQ1Tm90ZX0gKQogICAgICAgICAgICAgICAgLiAnITwvZm9udD4nOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAkT3V0cHV0Owp9Cgo9aXRlbSBTZWFyY2hGb3JtRGF0YUdldCgpCgpnZXQgc2VhcmNoIGZvcm0gZGF0YQoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hGb3JtRGF0YUdldCgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgI2NoZWNrIHJlcXVpcmVkIHN0dWZmLi4uCiAgICBmb3JlYWNoIChxdyhLZXkgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBnZXQgZm9ybSBkYXRhCiAgICBteSBAVmFsdWVzID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldEFycmF5KCBQYXJhbSA9PiAkUGFyYW17S2V5fSApOwoKICAgICMgZmluZCBhbGwgYXR0YWNobWVudF9kaXJlY3RvcnkgSURzIGZvciB0aGUgZ2l2ZW4gRmlsZU5hbWUKICAgIGlmICggKCAkUGFyYW17S2V5fSBlcSAnQXR0YWNobWVudCcgKSAmJiAkVmFsdWVzWzBdICkgewogICAgICAgIG15ICRGaWxlTmFtZSA9ICRWYWx1ZXNbMF07CgogICAgICAgIG15ICRVc2luZ1dpbGRjYXJkcyA9IDA7CiAgICAgICAgaWYgKCAoICRGaWxlTmFtZSA9fiBzL1wqLyUvZyApIHx8ICggJEZpbGVOYW1lID1+IG0vJS8gKSApIHsKICAgICAgICAgICAgJFVzaW5nV2lsZGNhcmRzID0gMTsKICAgICAgICB9CgogICAgICAgIEBWYWx1ZXMgPSAkU2VsZi0+e0F0dGFjaG1lbnRTdG9yYWdlT2JqZWN0fS0+QXR0YWNobWVudFN0b3JhZ2VTZWFyY2goCiAgICAgICAgICAgIEZpbGVOYW1lICAgICAgID0+ICRGaWxlTmFtZSwKICAgICAgICAgICAgVXNpbmdXaWxkY2FyZHMgPT4gJFVzaW5nV2lsZGNhcmRzLAogICAgICAgICk7CiAgICAgICAgaWYgKCAhJFZhbHVlc1swXSApIHsKICAgICAgICAgICAgJFZhbHVlc1swXSA9IC0xOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBcQFZhbHVlczsKfQoKPWl0ZW0gU2VhcmNoSW5wdXRDcmVhdGUoKQoKY3JlYXRlIGEgc2VhcmNoIGlucHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5TZWFyY2hJbnB1dENyZWF0ZSgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIFNlYXJjaElucHV0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgI2NoZWNrIHJlcXVpcmVkIHN0dWZmLi4uCiAgICBmb3JlYWNoIChxdyhLZXkgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCAkXyEiICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgbXkgJFN0cmluZyA9ICI8aW5wdXQgdHlwZT1cIlRleHRcIiBuYW1lPVwiJFBhcmFte0tleX1cIiBzaXplPVwiNjBcIj4iOwoKICAgIHJldHVybiAkU3RyaW5nOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNiAkICREYXRlOiAyMDExLTA3LTI1IDA5OjAyOjAxICQKCj1jdXQK IyAtLQojIEtlcm5lbC9PdXRwdXQvSFRNTC9JVFNNQ29uZmlnSXRlbUxheW91dFRleHRMaW5rLnBtIC0gbGF5b3V0IGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDA2LTIwMTEgYy5hLnAuZS4gSVQgR21iSCwgaHR0cDovL3d3dy5jYXBlLWl0LmRlCiMKIyB3cml0dGVuL2NoYW5nZWQgYnk6CiMgKiBTdGVmYW4oZG90KU1laGxpZyhhdCljYXBlKGRhc2gpaXQoZG90KWRlCiMKIyAtLQojICRJZDogSVRTTUNvbmZpZ0l0ZW1MYXlvdXRUZXh0TGluay5wbSx2IDEuMSAyMDExLTEwLTEzIDExOjI2OjAxIHNtZWhsaWcgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTGF5b3V0VGV4dExpbms7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6T3V0cHV0OjpIVE1MOjpJVFNNQ29uZmlnSXRlbUxheW91dFRleHQgLSBsYXlvdXQgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGxheW91dCBmdW5jdGlvbnMgb2YgdGV4dCBvYmplY3RzCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgICRCYWNrZW5kT2JqZWN0ID0gS2VybmVsOjpPdXRwdXQ6OkhUTUw6OklUU01Db25maWdJdGVtTGF5b3V0VGV4dC0+bmV3KAogICAgICAgICVQYXJhbSwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhDb25maWdPYmplY3QgRW5jb2RlT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFBhcmFtT2JqZWN0IExheW91dE9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIE91dHB1dFN0cmluZ0NyZWF0ZSgpCgpjcmVhdGUgb3V0cHV0IHN0cmluZwoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5PdXRwdXRTdHJpbmdDcmVhdGUoCiAgICAgICAgVmFsdWUgPT4gMTEsICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIE91dHB1dFN0cmluZ0NyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBpZiAoICEkUGFyYW17SXRlbX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEl0ZW0hJywKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBpZiAoICFkZWZpbmVkICRQYXJhbXtWYWx1ZX0gKSB7CiAgICAgICAgJFBhcmFte1ZhbHVlfSA9ICcnOwogICAgfQoKICAgICMgdHJhbnNsYXRlCiAgICBpZiAoICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1RyYW5zbGF0aW9ufSApIHsKICAgICAgICAkUGFyYW17VmFsdWV9ID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoICRQYXJhbXtWYWx1ZX0gKTsKICAgIH0KCiAgICBteSAkTGlua0ZlYXR1cmUgICAgPSAxOwogICAgbXkgJEhUTUxSZXN1bHRNb2RlID0gMTsKCiAgICAjIGRvIG5vdCB0cmFuc2Zvcm0gbGlua3MgaW4gcHJpbnQgdmlldwogICAgaWYgKCAkUGFyYW17UHJpbnR9ICkgewogICAgICAgICRMaW5rRmVhdHVyZSA9IDA7CgogICAgICAgICMgZG8gbm90IGNvbnZlcnQgd2hpdGVzcGFjZSBhbmQgbmV3bGluZXMgaW4gUERGIG1vZGUKICAgICAgICBpZiAoICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdQREYnKSApIHsKICAgICAgICAgICAgJEhUTUxSZXN1bHRNb2RlID0gMDsKICAgICAgICB9CiAgICB9CgogICAgIyB0cmFuc2Zvcm0gYXNjaWkgdG8gaHRtbAogICAgJFBhcmFte1ZhbHVlfSA9ICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+QXNjaWkySHRtbCgKICAgICAgICBUZXh0ICAgICAgICAgICA9PiAkUGFyYW17VmFsdWV9LAogICAgICAgIEhUTUxSZXN1bHRNb2RlID0+ICRIVE1MUmVzdWx0TW9kZSwKICAgICAgICBMaW5rRmVhdHVyZSAgICA9PiAkTGlua0ZlYXR1cmUsCiAgICApOwoKICAgIG15ICRMaW5rID0gJFBhcmFte0l0ZW19LT57SW5wdXR9LT57VVJMfTsKICAgICRMaW5rID1+IHMvPFZBTFVFPi8kUGFyYW17VmFsdWV9LzsKICAgICRQYXJhbXtWYWx1ZX0gPQogICAgICAgICAgJzxhIGhyZWY9IicgCiAgICAgICAgLiAkTGluawogICAgICAgIC4gJyIgdGl0bGU9IiRUZXh0eyJPcGVuIGxpbmsgaW4gbmV3IHdpbmRvdyJ9IiB0YXJnZXQ9Il9ibGFuayI+JwogICAgICAgIC4gJFBhcmFte1ZhbHVlfSAuICc8L2E+JzsKCiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gRm9ybURhdGFHZXQoKQoKZ2V0IGZvcm0gZGF0YSBhcyBoYXNoIHJlZmVyZW5jZQoKICAgIG15ICRGb3JtRGF0YVJlZiA9ICRCYWNrZW5kT2JqZWN0LT5Gb3JtRGF0YUdldCgKICAgICAgICBLZXkgPT4gJ0l0ZW06OjE6Ok5vZGU6OjMnLAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIEZvcm1EYXRhR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAlRm9ybURhdGE7CgogICAgIyBnZXQgZm9ybSBkYXRhCiAgICAkRm9ybURhdGF7VmFsdWV9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAkUGFyYW17S2V5fSApOwoKICAgICMgc2V0IGludmFsaWQgcGFyYW0KICAgIGlmICggJFBhcmFte0l0ZW19LT57SW5wdXR9LT57UmVxdWlyZWR9ICYmICEkRm9ybURhdGF7VmFsdWV9ICkgewogICAgICAgICRGb3JtRGF0YXtJbnZhbGlkfSA9IDE7CiAgICAgICAgJFBhcmFte0l0ZW19LT57Rm9ybX0tPnsgJFBhcmFte0tleX0gfS0+e0ludmFsaWR9ID0gMTsKICAgIH0KCiAgICByZXR1cm4gXCVGb3JtRGF0YTsKfQoKPWl0ZW0gSW5wdXRDcmVhdGUoKQoKY3JlYXRlIGEgaW5wdXQgc3RyaW5nCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPklucHV0Q3JlYXRlKAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgVmFsdWUgPT4gMTEsICAgICAgICAgICAgICAgICMgKG9wdGlvbmFsKQogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIElucHV0Q3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBteSAkVmFsdWUgPSAkUGFyYW17VmFsdWV9OwogICAgaWYgKCAhZGVmaW5lZCAkUGFyYW17VmFsdWV9ICkgewogICAgICAgICRWYWx1ZSA9ICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1ZhbHVlRGVmYXVsdH0gfHwgJyc7CiAgICB9CgogICAgbXkgJENsYXNzICAgID0gJyc7CiAgICBteSAkU2l6ZSAgICAgPSAnVzUwcGMnOwogICAgbXkgJFJlcXVpcmVkID0gJFBhcmFte1JlcXVpcmVkfTsKICAgIG15ICRJbnZhbGlkICA9ICRQYXJhbXtJbnZhbGlkfTsKICAgIG15ICRJdGVtSWQgICA9ICRQYXJhbXtJdGVtSWR9OwoKICAgIGlmICgkUmVxdWlyZWQpIHsKICAgICAgICAkQ2xhc3MgLj0gJyBWYWxpZGF0ZV9SZXF1aXJlZCc7CiAgICB9CgogICAgaWYgKCRJbnZhbGlkKSB7CiAgICAgICAgJENsYXNzIC49ICcgU2VydmVyRXJyb3InOwogICAgfQogICAgJENsYXNzIC49ICcgJyAuICRTaXplOwogICAgbXkgJFN0cmluZyA9ICI8aW5wdXQgdHlwZT1cInRleHRcIiBuYW1lPVwiJFBhcmFte0tleX1cIiBjbGFzcz1cIiRDbGFzc1wiICI7CgogICAgaWYgKCRJdGVtSWQpIHsKICAgICAgICAkU3RyaW5nIC49ICJpZD1cIiRJdGVtSWRcIiAiOwogICAgfQoKICAgIGlmICgkVmFsdWUpIHsKCiAgICAgICAgIyB0cmFuc2xhdGUKICAgICAgICBpZiAoICRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1RyYW5zbGF0aW9ufSApIHsKICAgICAgICAgICAgJFZhbHVlID0gJFNlbGYtPntMYXlvdXRPYmplY3R9LT57TGFuZ3VhZ2VPYmplY3R9LT5HZXQoJFZhbHVlKTsKICAgICAgICB9CgogICAgICAgICMgdHJhbnNmb3JtIGFzY2lpIHRvIGh0bWwKICAgICAgICAkVmFsdWUgPSAkU2VsZi0+e0xheW91dE9iamVjdH0tPkFzY2lpMkh0bWwoCiAgICAgICAgICAgIFRleHQgICAgICAgICAgID0+ICRWYWx1ZSwKICAgICAgICAgICAgSFRNTFJlc3VsdE1vZGUgPT4gMSwKICAgICAgICApOwogICAgfQoKICAgICRTdHJpbmcgLj0gInZhbHVlPVwiJFZhbHVlXCIgIjsKCiAgICAjIGFkZCBtYXhpbXVtIGxlbmd0aAogICAgaWYgKCAkUGFyYW17SXRlbX0tPntJbnB1dH0tPntNYXhMZW5ndGh9ICkgewogICAgICAgICRTdHJpbmcgLj0gIm1heGxlbmd0aD1cIiRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e01heExlbmd0aH1cIiAiOwogICAgfQoKICAgICRTdHJpbmcgLj0gJy8+ICc7CgogICAgcmV0dXJuICRTdHJpbmc7Cn0KCj1pdGVtIFNlYXJjaEZvcm1EYXRhR2V0KCkKCmdldCBzZWFyY2ggZm9ybSBkYXRhCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPlNlYXJjaEZvcm1EYXRhR2V0KAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgU2VhcmNoRm9ybURhdGFHZXQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgaWYgKCAhJFBhcmFte0tleX0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICdOZWVkIEtleSEnLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMgZ2V0IGZvcm0gZGF0YQogICAgbXkgJFZhbHVlOwogICAgaWYgKCAkUGFyYW17VmFsdWV9ICkgewogICAgICAgICRWYWx1ZSA9ICRQYXJhbXtWYWx1ZX07CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkVmFsdWUgPSAkU2VsZi0+e1BhcmFtT2JqZWN0fS0+R2V0UGFyYW0oIFBhcmFtID0+ICRQYXJhbXtLZXl9ICk7CiAgICB9CiAgICByZXR1cm4gJFZhbHVlOwp9Cgo9aXRlbSBTZWFyY2hJbnB1dENyZWF0ZSgpCgpjcmVhdGUgYSBzZWFyY2ggaW5wdXQgc3RyaW5nCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPlNlYXJjaElucHV0Q3JlYXRlKAogICAgICAgIEtleSA9PiAnSXRlbTo6MTo6Tm9kZTo6MycsCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgU2VhcmNoSW5wdXRDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgIG15ICRWYWx1ZSA9ICRTZWxmLT5TZWFyY2hGb3JtRGF0YUdldCglUGFyYW0pOwogICAgaWYgKCAhZGVmaW5lZCAkVmFsdWUgKSB7CiAgICAgICAgJFZhbHVlID0gJyc7CiAgICB9CgogICAgbXkgJFN0cmluZyA9IHFxezxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSIkUGFyYW17S2V5fSIgdmFsdWU9IiRWYWx1ZSIgY2xhc3M9Ilc1MHBjIiA+fTsKCiAgICByZXR1cm4gJFN0cmluZzsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChMPGh0dHA6Ly9vdHJzLm9yZy8+KS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIEw8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0Pi4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDExLTEwLTEzIDExOjI2OjAxICQKCj1jdXQK IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vWE1ML1R5cGUvQ0lDbGFzc1JlZmVyZW5jZS5wbSAtIHhtbCBiYWNrZW5kIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwNi0yMDExIGMuYS5wLmUuIElUIEdtYkgsIGh0dHA6Ly93d3cuY2FwZS1pdC5kZQojCiMgLS0KIyAkSWQ6IENJQ2xhc3NSZWZlcmVuY2UucG0sdiAxLjMgMjAxMS0wNC0xOCAwNzo1MzowNyB0dG8gRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlhNTDo6VHlwZTo6Q0lDbGFzc1JlZmVyZW5jZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW07Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjMgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MOjpUeXBlOjpDSUNsYXNzUmVmZXJlbmNlIC0geG1sIGJhY2tlbmQgbW9kdWxlCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCB4bWwgZnVuY3Rpb25zIG9mIENJQ2xhc3NSZWZlcmVuY2Ugb2JqZWN0cwoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkNvbmZpZ0l0ZW07CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRDb25maWdJdGVtT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkNvbmZpZ0l0ZW0tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgKTsKICAgICRCYWNrZW5kT2JqZWN0ID0gJENvbmZpZ0l0ZW1PYmplY3QtPl9Mb2FkWE1MVHlwZUJhY2tlbmQoCiAgICAgICAgVHlwZSA9PiAnQ0lDbGFzc1JlZmVyZW5jZScsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IEVuY29kZU9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBWYWx1ZUxvb2t1cCgpCgpnZXQgdGhlIHhtbCBkYXRhIG9mIGEgdmVyc2lvbgoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5WYWx1ZUxvb2t1cCgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIFZhbHVlTG9va3VwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuICcnIGlmICEkUGFyYW17VmFsdWV9OwoKICAgIG15ICRDSVZlcnNpb25EYXRhUmVmID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+VmVyc2lvbkdldCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte1ZhbHVlfSwKICAgICAgICBYTUxEYXRhR2V0ICAgPT4gMCwKICAgICk7CiAgICBteSAkQ0lOYW1lID0gJFBhcmFte1ZhbHVlfTsKCiAgICBpZiAoCiAgICAgICAgJENJVmVyc2lvbkRhdGFSZWYKICAgICAgICAmJgogICAgICAgICggcmVmKCRDSVZlcnNpb25EYXRhUmVmKSBlcSAnSEFTSCcgKSAmJgogICAgICAgICRDSVZlcnNpb25EYXRhUmVmLT57TmFtZX0KICAgICAgICApCiAgICB7CiAgICAgICAgJENJTmFtZSA9ICRDSVZlcnNpb25EYXRhUmVmLT57TmFtZX0KICAgICAgICAgICAgLiAiICgiCiAgICAgICAgICAgIC4gJENJVmVyc2lvbkRhdGFSZWYtPntOdW1iZXJ9CiAgICAgICAgICAgIC4gIikiOwogICAgfQoKICAgIHJldHVybiAkQ0lOYW1lOwp9Cgo9aXRlbSBTdGF0c0F0dHJpYnV0ZUNyZWF0ZSgpCgpjcmVhdGUgYSBhdHRyaWJ1dGUgYXJyYXkgZm9yIHRoZSBzdGF0cyBmcmFtZXdvcmsKCiAgICBteSAkQXR0cmlidXRlID0gJEJhY2tlbmRPYmplY3QtPlN0YXRzQXR0cmlidXRlQ3JlYXRlKAogICAgICAgIEtleSA9PiAnS2V5OjpTdWJrZXknLAogICAgICAgIE5hbWUgPT4gJ05hbWUnLAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIFN0YXRzQXR0cmlidXRlQ3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBOYW1lIEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgYXJydGlidXRlCiAgICBteSAkQXR0cmlidXRlID0gWwogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAkUGFyYW17TmFtZX0sCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAwLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJFBhcmFte0tleX0sCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgIH0sCiAgICBdOwoKICAgIHJldHVybiAkQXR0cmlidXRlOwp9Cgo9aXRlbSBFeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSBzZWFyY2ggdmFsdWUgZm9yIGV4cG9ydAoKICAgIG15ICRBcnJheVJlZiA9ICRCYWNrZW5kT2JqZWN0LT5FeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBFeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBFeHBvcnRWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSB2YWx1ZSBmb3IgZXhwb3J0CgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPkV4cG9ydFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEV4cG9ydFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwoKICAgICNnZXQgQ0kgbnVtYmVyIGZyb20gQ0ktSUQuLi4KICAgIG15ICRDSVJlZiA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkNvbmZpZ0l0ZW1HZXQoCiAgICAgICAgQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtWYWx1ZX0sCgogICAgICAgICNDYWNoZSAgICAgICAgPT4gMCwKICAgICk7CgogICAgI3JldHVybiBDSS1OdW1iZXIuLi4KICAgIGlmICggJENJUmVmICYmICggcmVmKCRDSVJlZikgZXEgJ0hBU0gnICkgJiYgJENJUmVmLT57TnVtYmVyfSApIHsKICAgICAgICByZXR1cm4gJENJUmVmLT57TnVtYmVyfTsKICAgIH0KCiAgICByZXR1cm47Cn0KCj1pdGVtIEltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHNlYXJjaCB2YWx1ZSBmb3IgaW1wb3J0CgogICAgbXkgJEFycmF5UmVmID0gJEJhY2tlbmRPYmplY3QtPkltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwoKICAgIG15ICRSZXN1bHRBcnJheVJlZiA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkNvbmZpZ0l0ZW1TZWFyY2goCiAgICAgICAgTnVtYmVyID0+ICRQYXJhbXtWYWx1ZX0sCiAgICApOwoKICAgIGlmICgKICAgICAgICAkUmVzdWx0QXJyYXlSZWYKICAgICAgICAmJiAoIHJlZigkUmVzdWx0QXJyYXlSZWYpIGVxICdBUlJBWScgKQogICAgICAgICYmICggc2NhbGFyKCBAeyRSZXN1bHRBcnJheVJlZn0gKSA9PSAxICkKICAgICAgICApCiAgICB7CiAgICAgICAgcmV0dXJuICRSZXN1bHRBcnJheVJlZi0+WzBdOwogICAgfQoKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBJbXBvcnRWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSB2YWx1ZSBmb3IgaW1wb3J0CgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPkltcG9ydFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwoKICAgIG15ICRSZXN1bHRBcnJheVJlZiA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkNvbmZpZ0l0ZW1TZWFyY2goCiAgICAgICAgTnVtYmVyID0+ICRQYXJhbXtWYWx1ZX0sCiAgICApOwoKICAgIGlmICgKICAgICAgICAkUmVzdWx0QXJyYXlSZWYKICAgICAgICAmJiAoIHJlZigkUmVzdWx0QXJyYXlSZWYpIGVxICdBUlJBWScgKQogICAgICAgICYmICggc2NhbGFyKCBAeyRSZXN1bHRBcnJheVJlZn0gKSA9PSAxICkKICAgICAgICApCiAgICB7CiAgICAgICAgcmV0dXJuICRSZXN1bHRBcnJheVJlZi0+WzBdOwogICAgfQoKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLTIuMC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjMgJCAkRGF0ZTogMjAxMS0wNC0xOCAwNzo1MzowNyAkCgo9Y3V0Cg== IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vWE1ML1R5cGUvUXVldWVSZWZlcmVuY2UucG0gLSB4bWwgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMSBjLmEucC5lLiBJVCBHbWJILCBodHRwOi8vd3d3LmNhcGUtaXQuZGUKIwojIC0tCiMgJElkOiBRdWV1ZVJlZmVyZW5jZS5wbSx2IDEuMiAyMDExLTA0LTE4IDA3OjUzOjA3IHR0byBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MOjpUeXBlOjpRdWV1ZVJlZmVyZW5jZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW07CnVzZSBLZXJuZWw6OlN5c3RlbTo6UXVldWU7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjIgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MOjpUeXBlOjpRdWV1ZVJlZmVyZW5jZSAtIHhtbCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgeG1sIGZ1bmN0aW9ucyBvZiBRdWV1ZVJlZmVyZW5jZSBvYmplY3RzCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6Q29uZmlnSXRlbTsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJENvbmZpZ0l0ZW1PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6Q29uZmlnSXRlbS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICApOwogICAgJEJhY2tlbmRPYmplY3QgPSAkQ29uZmlnSXRlbU9iamVjdC0+X0xvYWRYTUxUeXBlQmFja2VuZCgKICAgICAgICBUeXBlID0+ICdRdWV1ZVJlZmVyZW5jZScsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IEVuY29kZU9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICAkU2VsZi0+e1F1ZXVlT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpRdWV1ZS0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gVmFsdWVMb29rdXAoKQoKZ2V0IHRoZSB4bWwgZGF0YSBvZiBhIHZlcnNpb24KCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+VmFsdWVMb29rdXAoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBWYWx1ZUxvb2t1cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAnJyBpZiAhJFBhcmFte1ZhbHVlfTsKCiAgICBteSAlUXVldWVEYXRhID0gJFNlbGYtPntRdWV1ZU9iamVjdH0tPlF1ZXVlR2V0KAogICAgICAgIElEID0+ICRQYXJhbXtWYWx1ZX0sCiAgICApOwoKICAgIG15ICRRdWV1ZU5hbWUgPSAkUGFyYW17VmFsdWV9OwoKICAgIGlmICggJVF1ZXVlRGF0YSAmJiAkUXVldWVEYXRhe05hbWV9ICkgewogICAgICAgICRRdWV1ZU5hbWUgPSAkUXVldWVEYXRhe05hbWV9OwogICAgfQoKICAgIHJldHVybiAkUXVldWVOYW1lOwp9Cgo9aXRlbSBTdGF0c0F0dHJpYnV0ZUNyZWF0ZSgpCgpjcmVhdGUgYSBhdHRyaWJ1dGUgYXJyYXkgZm9yIHRoZSBzdGF0cyBmcmFtZXdvcmsKCiAgICBteSAkQXR0cmlidXRlID0gJEJhY2tlbmRPYmplY3QtPlN0YXRzQXR0cmlidXRlQ3JlYXRlKAogICAgICAgIEtleSA9PiAnS2V5OjpTdWJrZXknLAogICAgICAgIE5hbWUgPT4gJ05hbWUnLAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIFN0YXRzQXR0cmlidXRlQ3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBOYW1lIEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgYXJydGlidXRlCiAgICBteSAkQXR0cmlidXRlID0gWwogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAkUGFyYW17TmFtZX0sCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAwLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJFBhcmFte0tleX0sCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgIH0sCiAgICBdOwoKICAgIHJldHVybiAkQXR0cmlidXRlOwp9Cgo9aXRlbSBFeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSBzZWFyY2ggdmFsdWUgZm9yIGV4cG9ydAoKICAgIG15ICRBcnJheVJlZiA9ICRCYWNrZW5kT2JqZWN0LT5FeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBFeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBFeHBvcnRWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSB2YWx1ZSBmb3IgZXhwb3J0CgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPkV4cG9ydFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEV4cG9ydFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwoKICAgIG15ICVRdWV1ZURhdGEgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+UXVldWVHZXQoCiAgICAgICAgSUQgPT4gJFBhcmFte1ZhbHVlfSwKICAgICk7CgogICAgbXkgJFF1ZXVlTmFtZSA9ICRQYXJhbXtWYWx1ZX0gfHwgJyc7CgogICAgaWYgKCAlUXVldWVEYXRhICYmICRRdWV1ZURhdGF7TmFtZX0gKSB7CiAgICAgICAgJFF1ZXVlTmFtZSA9ICRRdWV1ZURhdGF7TmFtZX07CiAgICB9CgogICAgcmV0dXJuICRRdWV1ZU5hbWU7Cgp9Cgo9aXRlbSBJbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSBzZWFyY2ggdmFsdWUgZm9yIGltcG9ydAoKICAgIG15ICRBcnJheVJlZiA9ICRCYWNrZW5kT2JqZWN0LT5JbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBJbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKCiAgICBteSAkUmVzdWx0QXJyYXlSZWYgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5Db25maWdJdGVtU2VhcmNoKAogICAgICAgIE51bWJlciA9PiAkUGFyYW17VmFsdWV9LAogICAgKTsKCiAgICBpZiAoCiAgICAgICAgJFJlc3VsdEFycmF5UmVmCiAgICAgICAgJiYgKCByZWYoJFJlc3VsdEFycmF5UmVmKSBlcSAnQVJSQVknICkKICAgICAgICAmJiAoIHNjYWxhciggQHskUmVzdWx0QXJyYXlSZWZ9ICkgPT0gMSApCiAgICAgICAgKQogICAgewogICAgICAgIHJldHVybiAkUmVzdWx0QXJyYXlSZWYtPlswXTsKICAgIH0KCiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gSW1wb3J0VmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgdmFsdWUgZm9yIGltcG9ydAoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5JbXBvcnRWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBJbXBvcnRWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKCiAgICBteSAkUXVldWVJRCA9ICRQYXJhbXtWYWx1ZX07CgogICAgaWYgKCAkUGFyYW17VmFsdWV9ID1+IC9cRC8gKSB7CiAgICAgICAgJFF1ZXVlSUQgPSAkU2VsZi0+e1F1ZXVlT2JqZWN0fS0+UXVldWVMb29rdXAoCiAgICAgICAgICAgIFF1ZXVlID0+ICRQYXJhbXtWYWx1ZX0sCiAgICAgICAgKTsKICAgICAgICBpZiAoJFF1ZXVlSUQpIHsKICAgICAgICAgICAgcmV0dXJuICRRdWV1ZUlEOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4yICQgJERhdGU6IDIwMTEtMDQtMTggMDc6NTM6MDcgJAoKPWN1dAo= IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vWE1ML1R5cGUvU2VydmljZVJlZmVyZW5jZS5wbSAtIHhtbCBiYWNrZW5kIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwNi0yMDExIGMuYS5wLmUuIElUIEdtYkgsIGh0dHA6Ly93d3cuY2FwZS1pdC5kZQojCiMgLS0KIyAkSWQ6IFNlcnZpY2VSZWZlcmVuY2UucG0sdiAxLjMgMjAxMS0wNS0xMCAxMzozMTo0NSB0dG8gRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlhNTDo6VHlwZTo6U2VydmljZVJlZmVyZW5jZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW07CnVzZSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuMyAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpYTUw6OlR5cGU6OlNlcnZpY2VSZWZlcmVuY2UgLSB4bWwgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHhtbCBmdW5jdGlvbnMgb2YgU2VydmljZVJlZmVyZW5jZSBvYmplY3RzCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6Q29uZmlnSXRlbTsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJENvbmZpZ0l0ZW1PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6Q29uZmlnSXRlbS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICApOwogICAgJEJhY2tlbmRPYmplY3QgPSAkQ29uZmlnSXRlbU9iamVjdC0+X0xvYWRYTUxUeXBlQmFja2VuZCgKICAgICAgICBUeXBlID0+ICdTZXJ2aWNlUmVmZXJlbmNlJywKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvciBteSAkT2JqZWN0IChxdyhEQk9iamVjdCBDb25maWdPYmplY3QgTG9nT2JqZWN0IE1haW5PYmplY3QgRW5jb2RlT2JqZWN0KSkgewogICAgICAgICRTZWxmLT57JE9iamVjdH0gPSAkUGFyYW17JE9iamVjdH0gfHwgZGllICJHb3Qgbm8gJE9iamVjdCEiOwogICAgfQoKICAgICRTZWxmLT57U2VydmljZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6U2VydmljZS0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gVmFsdWVMb29rdXAoKQoKZ2V0IHRoZSB4bWwgZGF0YSBvZiBhIHZlcnNpb24KCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+VmFsdWVMb29rdXAoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBWYWx1ZUxvb2t1cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAnJyBpZiAhJFBhcmFte1ZhbHVlfTsKCiAgICBteSAlU2VydmljZURhdGEgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlR2V0KAogICAgICAgIFNlcnZpY2VJRCA9PiAkUGFyYW17VmFsdWV9LAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCiAgICBteSAkU2VydmljZU5hbWUgPSAkUGFyYW17VmFsdWV9OwoKICAgIGlmICggJVNlcnZpY2VEYXRhICYmICRTZXJ2aWNlRGF0YXtOYW1lfSApIHsKICAgICAgICAkU2VydmljZU5hbWUgPSAkU2VydmljZURhdGF7TmFtZX07CiAgICB9CgogICAgcmV0dXJuICRTZXJ2aWNlTmFtZTsKfQoKPWl0ZW0gU3RhdHNBdHRyaWJ1dGVDcmVhdGUoKQoKY3JlYXRlIGEgYXR0cmlidXRlIGFycmF5IGZvciB0aGUgc3RhdHMgZnJhbWV3b3JrCgogICAgbXkgJEF0dHJpYnV0ZSA9ICRCYWNrZW5kT2JqZWN0LT5TdGF0c0F0dHJpYnV0ZUNyZWF0ZSgKICAgICAgICBLZXkgPT4gJ0tleTo6U3Via2V5JywKICAgICAgICBOYW1lID0+ICdOYW1lJywKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBTdGF0c0F0dHJpYnV0ZUNyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgTmFtZSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIGFycnRpYnV0ZQogICAgbXkgJEF0dHJpYnV0ZSA9IFsKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJFBhcmFte05hbWV9LAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICRQYXJhbXtLZXl9LAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdJbnB1dEZpZWxkJywKICAgICAgICB9LAogICAgXTsKCiAgICByZXR1cm4gJEF0dHJpYnV0ZTsKfQoKPWl0ZW0gRXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgc2VhcmNoIHZhbHVlIGZvciBleHBvcnQKCiAgICBteSAkQXJyYXlSZWYgPSAkQmFja2VuZE9iamVjdC0+RXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CgogICAgbXkgJVNlcnZpY2VEYXRhID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUdldCgKICAgICAgICBTZXJ2aWNlSUQgPT4gJFBhcmFte1ZhbHVlfSwKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7CgogICAgbXkgJFNlcnZpY2VOYW1lID0gJFBhcmFte1ZhbHVlfSB8fCAnJzsKCiAgICBpZiAoICVTZXJ2aWNlRGF0YSAmJiAkU2VydmljZURhdGF7TmFtZX0gKSB7CiAgICAgICAgJFNlcnZpY2VOYW1lID0gJFNlcnZpY2VEYXRhe05hbWV9OwogICAgfQoKICAgIHJldHVybiAkU2VydmljZU5hbWU7Cn0KCj1pdGVtIEV4cG9ydFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHZhbHVlIGZvciBleHBvcnQKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+RXhwb3J0VmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRXhwb3J0VmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CgogICAgbXkgJVNlcnZpY2VEYXRhID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUdldCgKICAgICAgICBTZXJ2aWNlSUQgPT4gJFBhcmFte1ZhbHVlfSwKICAgICAgICBVc2VySUQgICAgPT4gMSwKICAgICk7CgogICAgbXkgJFNlcnZpY2VOYW1lID0gJFBhcmFte1ZhbHVlfSB8fCAnJzsKCiAgICBpZiAoICVTZXJ2aWNlRGF0YSAmJiAkU2VydmljZURhdGF7TmFtZX0gKSB7CiAgICAgICAgJFNlcnZpY2VOYW1lID0gJFNlcnZpY2VEYXRhe05hbWV9OwogICAgfQoKICAgIHJldHVybiAkU2VydmljZU5hbWU7Cgp9Cgo9aXRlbSBJbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSBzZWFyY2ggdmFsdWUgZm9yIGltcG9ydAoKICAgIG15ICRBcnJheVJlZiA9ICRCYWNrZW5kT2JqZWN0LT5JbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBJbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKCiAgICBteSAkU2VydmljZUlEID0gJFBhcmFte1ZhbHVlfTsKCiAgICBpZiAoICRQYXJhbXtWYWx1ZX0gPX4gL1xELyApIHsKICAgICAgICAkU2VydmljZUlEID0gJFNlbGYtPntTZXJ2aWNlT2JqZWN0fS0+U2VydmljZUxvb2t1cCgKICAgICAgICAgICAgTmFtZSA9PiAkUGFyYW17VmFsdWV9LAogICAgICAgICk7CiAgICAgICAgaWYgKCRTZXJ2aWNlSUQpIHsKICAgICAgICAgICAgcmV0dXJuICRTZXJ2aWNlSUQ7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBJbXBvcnRWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSB2YWx1ZSBmb3IgaW1wb3J0CgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPkltcG9ydFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwoKICAgIG15ICRTZXJ2aWNlSUQgPSAkUGFyYW17VmFsdWV9OwoKICAgIGlmICggJFBhcmFte1ZhbHVlfSA9fiAvXEQvICkgewogICAgICAgICRTZXJ2aWNlSUQgPSAkU2VsZi0+e1NlcnZpY2VPYmplY3R9LT5TZXJ2aWNlTG9va3VwKAogICAgICAgICAgICBOYW1lID0+ICRQYXJhbXtWYWx1ZX0sCiAgICAgICAgKTsKICAgICAgICBpZiAoJFNlcnZpY2VJRCkgewogICAgICAgICAgICByZXR1cm4gJFNlcnZpY2VJRDsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMyAkICREYXRlOiAyMDExLTA1LTEwIDEzOjMxOjQ1ICQKCj1jdXQK IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vWE1ML1R5cGUvQ0lBdHRhY2htZW50LnBtIC0geG1sIGJhY2tlbmQgbW9kdWxlCiMKIyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMSBjLmEucC5lLiBJVCBHbWJILCBodHRwOi8vd3d3LmNhcGUtaXQuZGUKIyBvcmlnaW5hbCBDb3B5cmlnaHQgKEMpIDIwMDEtMjAwOCBPVFJTIEFHLCBodHRwOi8vb3Rycy5vcmcvCiMKIyB3cml0dGVuL2VkaXRlZCBieToKIyAqIFRvcnN0ZW4oZG90KVRoYXUoYXQpY2FwZS1pdChkb3QpZGUKIyAqIEFubmEoZG90KUxpdHZpbm92YShhdCljYXBlLWl0KGRvdClkZQojIC0tCiMgYmFzZWQgdXBvbiBDdXN0b21lci5wbSAtIDEuMi4yLjEgZnJvbSAyMDA3LzEwLzA5IGJ5IG1oCiMgJElkOiBDSUF0dGFjaG1lbnQucG0sdiAxLjYgMjAxMS0wNy0yNSAwOToyMzo0NiBzbWVobGlnIEV4cCAkCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MOjpUeXBlOjpDSUF0dGFjaG1lbnQ7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CnVzZSBLZXJuZWw6OlN5c3RlbTo6Q0lBdHRhY2htZW50U3RvcmFnZTo6QXR0YWNobWVudFN0b3JhZ2U7Cgp1c2UgdmFycyBxdyhASVNBICRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNiAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpYTUw6OlR5cGU6OkNJQXR0YWNobWVudCAtIHhtbCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgeG1sIGZ1bmN0aW9ucyBvZiBDSUF0dGFjaG1lbnQgb2JqZWN0cwoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6Q29uZmlnSXRlbTsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgPT4gJExvZ09iamVjdCwKICAgICk7CiAgICBteSAkQ29uZmlnSXRlbU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpDb25maWdJdGVtLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgPT4gJERCT2JqZWN0LAogICAgKTsKICAgICRCYWNrZW5kT2JqZWN0ID0gJENvbmZpZ0l0ZW1PYmplY3QtPl9Mb2FkWE1MVHlwZUJhY2tlbmQoCiAgICAgICAgVHlwZSA9PiAnQ0lBdHRhY2htZW50JywKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgbmVlZGVkIG9iamVjdHMKICAgIGZvcmVhY2ggKHF3KERCT2JqZWN0IENvbmZpZ09iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCBFbmNvZGVPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CgogICAgJFNlbGYtPntBdHRhY2htZW50U3RvcmFnZU9iamVjdH0gPQogICAgICAgIEtlcm5lbDo6U3lzdGVtOjpDSUF0dGFjaG1lbnRTdG9yYWdlOjpBdHRhY2htZW50U3RvcmFnZS0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gVmFsdWVMb29rdXAoKQoKZ2V0IHRoZSB4bWwgZGF0YSBvZiBhIHZlcnNpb24KCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+VmFsdWVMb29rdXAoCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICAgICBWYWx1ZSA9PiAxLjEuMS4xLAogICAgKTsKCj1jdXQKCnN1YiBWYWx1ZUxvb2t1cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgbXkgJFZhbHVlID0gJyc7CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvcmVhY2ggKHF3KEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIiRQYXJhbXtJdGVtfS0+e0lucHV0fS0+e1R5cGV9IDo6IE5lZWQgJF8hIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQogICAgaWYgKCAoIGRlZmluZWQgJFBhcmFte1ZhbHVlfSApICkgewogICAgICAgIG15ICRyZXRWYWwgPSAkUGFyYW17VmFsdWV9OwoKICAgICAgICAjcmV0cmlldmUgdGhlIGF0dGFjaG1lbnQgZGF0YSBmcm9tIHRoZSBhdHRhY2htZW50IHN0b3JhZ2UuLi4KICAgICAgICAjCiAgICAgICAgIyAuLi5ub3BlLCBub3QgeWV0IC0gdGhpbmsgaXQncyBiZXR0ZXIgaWYganVzdCB0aGUgYXR0YWNobWVudC0KICAgICAgICAjIGRpcmVjdG9yeS1pZCBpcyByZXR1cm5lZC4uLgogICAgICAgICMKCiAgICAgICAgcmV0dXJuICRyZXRWYWw7CiAgICB9CgogICAgcmV0dXJuICcnOwoKfQoKPWl0ZW0gU3RhdHNBdHRyaWJ1dGVDcmVhdGUoKQoKY3JlYXRlIGEgYXR0cmlidXRlIGFycmF5IGZvciB0aGUgc3RhdHMgZnJhbWV3b3JrCgogICAgbXkgJEF0dHJpYnV0ZSA9ICRCYWNrZW5kT2JqZWN0LT5TdGF0c0F0dHJpYnV0ZUNyZWF0ZSgKICAgICAgICBLZXkgPT4gJ0tleTo6U3Via2V5JywKICAgICAgICBOYW1lID0+ICdOYW1lJywKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBTdGF0c0F0dHJpYnV0ZUNyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgTmFtZSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIGFycnRpYnV0ZQogICAgbXkgJEF0dHJpYnV0ZSA9IFsKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJFBhcmFte05hbWV9LAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAwLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICRQYXJhbXtLZXl9LAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdJbnB1dEZpZWxkJywKICAgICAgICB9LAogICAgXTsKCiAgICByZXR1cm4gJEF0dHJpYnV0ZTsKfQoKPWl0ZW0gRXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgc2VhcmNoIHZhbHVlIGZvciBleHBvcnQKCiAgICBteSAkQXJyYXlSZWYgPSAkQmFja2VuZE9iamVjdC0+RXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gRXhwb3J0VmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgdmFsdWUgZm9yIGV4cG9ydAoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5FeHBvcnRWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBFeHBvcnRWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKCiAgICBteSAkUmV0VmFsICAgICAgID0gIiI7CiAgICBteSAlQXR0RGlyRGF0YSAgID0gKCk7CiAgICBteSAkU2l6ZU5vdGUgICAgID0gIiI7CiAgICBteSAkUmVhbEZpbGVTaXplID0gMDsKICAgIG15ICRNRDVOb3RlICAgICAgPSAiIjsKICAgIG15ICRSZWFsTUQ1U3VtICAgPSAiIjsKCiAgICAjIGdldCBzYXZlZCBwcm9wZXJ0aWVzIChhdHRhY2htZW50IGRpcmVjdG9yeSBpbmZvKQogICAgJUF0dERpckRhdGEgPSAkU2VsZi0+e0F0dGFjaG1lbnRTdG9yYWdlT2JqZWN0fS0+QXR0YWNobWVudFN0b3JhZ2VHZXREaXJlY3RvcnkoCiAgICAgICAgSUQgPT4gJFBhcmFte1ZhbHVlfSwKICAgICk7CgogICAgaWYgKAogICAgICAgICRBdHREaXJEYXRhe1ByZWZlcmVuY2VzfS0+e0ZpbGVTaXplQnl0ZXN9CiAgICAgICAgJiYKICAgICAgICAkQXR0RGlyRGF0YXtQcmVmZXJlbmNlc30tPntNRDVTdW19CiAgICAgICAgKQogICAgewoKICAgICAgICBteSAlUmVhbFByb3BlcnRpZXMgPQogICAgICAgICAgICAkU2VsZi0+e0F0dGFjaG1lbnRTdG9yYWdlT2JqZWN0fS0+QXR0YWNobWVudFN0b3JhZ2VHZXRSZWFsUHJvcGVydGllcygKICAgICAgICAgICAgJUF0dERpckRhdGEsCiAgICAgICAgICAgICk7CgogICAgICAgICRSZXRWYWwgICAgICAgPSAiKHNpemUgIiAuICRBdHREaXJEYXRhe1ByZWZlcmVuY2VzfS0+e0ZpbGVTaXplQnl0ZXN9IC4gIikiOwogICAgICAgICRSZWFsTUQ1U3VtICAgPSAkUmVhbFByb3BlcnRpZXN7UmVhbE1ENVN1bX07CiAgICAgICAgJFJlYWxGaWxlU2l6ZSA9ICRSZWFsUHJvcGVydGllc3tSZWFsRmlsZVNpemV9OwoKICAgICAgICBpZiAoICRSZWFsRmlsZVNpemUgIT0gJEF0dERpckRhdGF7UHJlZmVyZW5jZXN9LT57RmlsZVNpemVCeXRlc30gKSB7CiAgICAgICAgICAgICRTaXplTm90ZSA9ICIgSW52YWxpZCBjb250ZW50IC0gZmlsZSBzaXplIG9uIGRpc2sgaGFzIGJlZW4gY2hhbmdlZCI7CgogICAgICAgICAgICBpZiAoICRSZWFsRmlsZVNpemUgPiAoIDEwMjQgKiAxMDI0ICkgKSB7CiAgICAgICAgICAgICAgICAkUmVhbEZpbGVTaXplID0gc3ByaW50ZiAiJS4xZiBNQnl0ZXMiLCAoICRSZWFsRmlsZVNpemUgLyAoIDEwMjQgKiAxMDI0ICkgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNpZiAoICRSZWFsRmlsZVNpemUgPiAxMDI0ICkgewogICAgICAgICAgICAgICAgJFJlYWxGaWxlU2l6ZSA9IHNwcmludGYgIiUuMWYgS0J5dGVzIiwgKCAoICRSZWFsRmlsZVNpemUgLyAxMDI0ICkgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICRSZWFsRmlsZVNpemUgPSAkUmVhbEZpbGVTaXplIC4gJyBCeXRlcyc7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICRSZXRWYWwgPSAiKHJlYWwgc2l6ZSAiIC4gJFJlYWxGaWxlU2l6ZSAuICRTaXplTm90ZSAuICIpIjsKICAgICAgICB9CiAgICAgICAgZWxzaWYgKCAkUmVhbE1ENVN1bSBuZSAkQXR0RGlyRGF0YXtQcmVmZXJlbmNlc30tPntNRDVTdW19ICkgewogICAgICAgICAgICAkTUQ1Tm90ZSA9ICIgSW52YWxpZCBtZDVzdW0gLSBUaGUgZmlsZSBtaWdodCBoYXZlIGJlZW4gY2hhbmdlZC4iOwogICAgICAgICAgICAkUmV0VmFsID1+IHMvXCkvJE1ENU5vdGVcKS9nOwogICAgICAgIH0KCiAgICB9CiAgICAkUmV0VmFsID0gJEF0dERpckRhdGF7RmlsZU5hbWV9OwoKICAgICNyZXR1cm4gZmlsZSBpbmZvcm1hdGlvbi4uLgogICAgcmV0dXJuICRSZXRWYWw7Cn0KCj1pdGVtIEltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHNlYXJjaCB2YWx1ZSBmb3IgaW1wb3J0CgogICAgbXkgJEFycmF5UmVmID0gJEJhY2tlbmRPYmplY3QtPkltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwoKICAgICMgdGhpcyBhdHRyaWJ1dGUgaXMgbm90IGludGVuZGVkIGZvciBpbXBvcnQgeWV0Li4uCiAgICAkUGFyYW17VmFsdWV9ID0gIiI7CgogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEltcG9ydFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHZhbHVlIGZvciBpbXBvcnQKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+SW1wb3J0VmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgSW1wb3J0VmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CgogICAgIyB0aGlzIGF0dHJpYnV0ZSBpcyBub3QgaW50ZW5kZWQgZm9yIGltcG9ydCB5ZXQuLi4KICAgICRQYXJhbXtWYWx1ZX0gPSAiIjsKCiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjYgJCAkRGF0ZTogMjAxMS0wNy0yNSAwOToyMzo0NiAkCgo9Y3V0Cg== IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vWE1ML1R5cGUvQ3VzdG9tZXJDb21wYW55LnBtIC0geG1sIGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDA2LTIwMTEgYy5hLnAuZS4gSVQgR21iSCwgaHR0cDovL3d3dy5jYXBlLWl0LmRlCiMKIyB3cml0dGVuL2NoYW5nZWQgYnk6CiMgKiBTdGVmYW4oZG90KU1laGxpZyhhdCljYXBlLWl0KGRvdClkZQojCiMgLS0KIyAkSWQ6IEN1c3RvbWVyQ29tcGFueS5wbSx2IDEuMTAgMjAxMS0wNC0yOCAxMzowODo0NiB0dG8gRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlhNTDo6VHlwZTo6Q3VzdG9tZXJDb21wYW55OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lckNvbXBhbnk7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjEwICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlhNTDo6VHlwZTo6Q3VzdG9tZXJDb21wYW55IC0geG1sIGJhY2tlbmQgbW9kdWxlCgo9aGVhZDEgU1lOT1BTSVMKCkFsbCB4bWwgZnVuY3Rpb25zIG9mIEN1c3RvbWVyQ29tcGFueSBvYmplY3RzCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGFuIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpEQjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6Q29uZmlnSXRlbTsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ICAgPT4gJE1haW5PYmplY3QsCiAgICApOwogICAgbXkgJENvbmZpZ0l0ZW1PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6Q29uZmlnSXRlbS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICApOwogICAgJEJhY2tlbmRPYmplY3QgPSAkQ29uZmlnSXRlbU9iamVjdC0+X0xvYWRYTUxUeXBlQmFja2VuZCgKICAgICAgICBUeXBlID0+ICdDdXN0b21lckNvbXBhbnknLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KERCT2JqZWN0IENvbmZpZ09iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCBFbmNvZGVPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CiAgICAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJDb21wYW55LT5uZXcoICV7JFNlbGZ9ICk7CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBWYWx1ZUxvb2t1cCgpCgpnZXQgdGhlIHhtbCBkYXRhIG9mIGEgdmVyc2lvbgoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5WYWx1ZUxvb2t1cCgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIFZhbHVlTG9va3VwIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuICcnIGlmICEkUGFyYW17VmFsdWV9OwoKICAgIG15ICVDdXN0b21lckNvbXBhbnlTZWFyY2hMaXN0ID0gJFNlbGYtPntDdXN0b21lckNvbXBhbnlPYmplY3R9LT5DdXN0b21lckNvbXBhbnlHZXQoCiAgICAgICAgQ3VzdG9tZXJJRCA9PiAkUGFyYW17VmFsdWV9LAogICAgKTsKCiAgICBteSAkQ3VzdG9tZXJDb21wYW55RGF0YVN0ciA9ICcnOwogICAgbXkgJEN1c3RDb21wYW55TWFwUmVmID0KICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTUNJQXR0cmlidXRlQ29sbGVjdGlvbjo6Q29tcGFueUJhY2tlbmRNYXBwaW5nJyk7CgogICAgaWYgKCAkQ3VzdENvbXBhbnlNYXBSZWYgJiYgcmVmKCRDdXN0Q29tcGFueU1hcFJlZikgZXEgJ0hBU0gnICkgewoKICAgICAgICBmb3IgbXkgJE1hcHBpbmdGaWVsZCAoIHNvcnQoIGtleXMoICV7JEN1c3RDb21wYW55TWFwUmVmfSApICkgKSB7CiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyQ29tcGFueVNlYXJjaExpc3R7ICRDdXN0Q29tcGFueU1hcFJlZi0+eyRNYXBwaW5nRmllbGR9IH0gKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJDb21wYW55RGF0YVN0ciAuPSAnICcKICAgICAgICAgICAgICAgICAgICAuICRDdXN0b21lckNvbXBhbnlTZWFyY2hMaXN0eyAkQ3VzdENvbXBhbnlNYXBSZWYtPnskTWFwcGluZ0ZpZWxkfSB9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgIH0KCiAgICAkQ3VzdG9tZXJDb21wYW55RGF0YVN0ciA9fiBzL1xzKyQvL2c7CiAgICAkQ3VzdG9tZXJDb21wYW55RGF0YVN0ciA9fiBzL15ccysvL2c7CgogICAgcmV0dXJuICRDdXN0b21lckNvbXBhbnlEYXRhU3RyOwp9Cgo9aXRlbSBTdGF0c0F0dHJpYnV0ZUNyZWF0ZSgpCgpjcmVhdGUgYSBhdHRyaWJ1dGUgYXJyYXkgZm9yIHRoZSBzdGF0cyBmcmFtZXdvcmsKCiAgICBteSAkQXR0cmlidXRlID0gJEJhY2tlbmRPYmplY3QtPlN0YXRzQXR0cmlidXRlQ3JlYXRlKAogICAgICAgIEtleSA9PiAnS2V5OjpTdWJrZXknLAogICAgICAgIE5hbWUgPT4gJ05hbWUnLAogICAgICAgIEl0ZW0gPT4gJEl0ZW1SZWYsCiAgICApOwoKPWN1dAoKc3ViIFN0YXRzQXR0cmlidXRlQ3JlYXRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayBuZWVkZWQgc3R1ZmYKICAgIGZvciBteSAkQXJndW1lbnQgKHF3KEtleSBOYW1lIEl0ZW0pKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRBcmd1bWVudH0gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJOZWVkICRBcmd1bWVudCEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgYXJydGlidXRlCiAgICBteSAkQXR0cmlidXRlID0gWwogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAkUGFyYW17TmFtZX0sCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAwLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJFBhcmFte0tleX0sCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgIH0sCiAgICBdOwoKICAgIHJldHVybiAkQXR0cmlidXRlOwp9Cgo9aXRlbSBFeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSBzZWFyY2ggdmFsdWUgZm9yIGV4cG9ydAoKICAgIG15ICRBcnJheVJlZiA9ICRCYWNrZW5kT2JqZWN0LT5FeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBFeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBFeHBvcnRWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSB2YWx1ZSBmb3IgZXhwb3J0CgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPkV4cG9ydFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEV4cG9ydFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVDdXN0b21lckNvbXBhbnlTZWFyY2hMaXN0ID0gJFNlbGYtPntDdXN0b21lckNvbXBhbnlPYmplY3R9LT5DdXN0b21lckNvbXBhbnlHZXQoCiAgICAgICAgQ3VzdG9tZXJJRCA9PiAkUGFyYW17VmFsdWV9LAogICAgKTsKCiAgICBteSAkQ3VzdG9tZXJDb21wYW55RGF0YVN0ciA9ICcnOwogICAgbXkgJEN1c3RDb21wYW55TWFwUmVmID0KICAgICAgICAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSVRTTUNJQXR0cmlidXRlQ29sbGVjdGlvbjo6Q29tcGFueUJhY2tlbmRNYXBwaW5nJyk7CgogICAgaWYgKCAkQ3VzdENvbXBhbnlNYXBSZWYgJiYgcmVmKCRDdXN0Q29tcGFueU1hcFJlZikgZXEgJ0hBU0gnICkgewoKICAgICAgICBmb3IgbXkgJE1hcHBpbmdGaWVsZCAoIHNvcnQoIGtleXMoICV7JEN1c3RDb21wYW55TWFwUmVmfSApICkgKSB7CiAgICAgICAgICAgIGlmICggJEN1c3RvbWVyQ29tcGFueVNlYXJjaExpc3R7ICRDdXN0Q29tcGFueU1hcFJlZi0+eyRNYXBwaW5nRmllbGR9IH0gKSB7CiAgICAgICAgICAgICAgICAkQ3VzdG9tZXJDb21wYW55RGF0YVN0ciAuPSAnICcKICAgICAgICAgICAgICAgICAgICAuICRDdXN0b21lckNvbXBhbnlTZWFyY2hMaXN0eyAkQ3VzdENvbXBhbnlNYXBSZWYtPnskTWFwcGluZ0ZpZWxkfSB9OwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgIH0KCiAgICAkQ3VzdG9tZXJDb21wYW55RGF0YVN0ciA9fiBzL1xzKyQvL2c7CiAgICAkQ3VzdG9tZXJDb21wYW55RGF0YVN0ciA9fiBzL15ccysvL2c7CgogICAgcmV0dXJuICRDdXN0b21lckNvbXBhbnlEYXRhU3RyOwoKICAgICNyZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgICNyZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gSW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgc2VhcmNoIHZhbHVlIGZvciBpbXBvcnQKCiAgICBteSAkQXJyYXlSZWYgPSAkQmFja2VuZE9iamVjdC0+SW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgSW1wb3J0U2VhcmNoVmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CgogICAgIyBzZWFyY2ggZm9yIG5hbWUuLi4uCiAgICBteSAlQ3VzdG9tZXJDb21wYW55TGlzdCA9ICRTZWxmLT57Q3VzdG9tZXJDb21wYW55T2JqZWN0fS0+Q3VzdG9tZXJDb21wYW55TGlzdCgKICAgICAgICBTZWFyY2ggPT4gJyonIC4gJFBhcmFte1ZhbHVlfSAuICcqJywKICAgICk7CgogICAgaWYgKAogICAgICAgICVDdXN0b21lckNvbXBhbnlMaXN0CiAgICAgICAgJiYgKCBzY2FsYXIoIGtleXMgJUN1c3RvbWVyQ29tcGFueUxpc3QgKSA9PSAxICkKICAgICAgICApCiAgICB7CiAgICAgICAgbXkgQFJlc3VsdCA9IGtleXMgJUN1c3RvbWVyQ29tcGFueUxpc3Q7CiAgICAgICAgcmV0dXJuICRSZXN1bHRbMF07CiAgICB9CgogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEltcG9ydFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHZhbHVlIGZvciBpbXBvcnQKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+SW1wb3J0VmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgSW1wb3J0VmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4xMCAkICREYXRlOiAyMDExLTA0LTI4IDEzOjA4OjQ2ICQKCj1jdXQK IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vWE1ML1R5cGUvQ3VzdG9tZXJVc2Vyb21wYW55LnBtIC0geG1sIGJhY2tlbmQgbW9kdWxlCiMgQ29weXJpZ2h0IChDKSAyMDA2LTIwMTEgYy5hLnAuZS4gSVQgR21iSCwgaHR0cDovL3d3dy5jYXBlLWl0LmRlLwojCiMgd3JpdHRlbi9jaGFuZ2VkIGJ5OiAKIyAqIFN0ZWZhbihkb3QpTWVobGlnKGF0KWNhcGUtaXQoZG90KWRlCiMgKiBUb3JzdGVuKGRvdClUaGF1KGF0KWNhcGUtaXQoZG90KWRlCiMgKiBGcmFuayhkb3QpT2JlcmVuZGVyKGF0KWNhcGUtaXQoZG90KWRlCiMKIyAtLQojICRJZDogQ3VzdG9tZXJVc2VyQ29tcGFueS5wbSx2IDEuNSAyMDExLTA0LTE4IDA3OjUzOjA3IHR0byBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MOjpUeXBlOjpDdXN0b21lclVzZXJDb21wYW55OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXI7CnVzZSBLZXJuZWw6OlN5c3RlbTo6Q3VzdG9tZXJDb21wYW55OwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS41ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlhNTDo6VHlwZTo6VXNlciAtIHhtbCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgeG1sIGZ1bmN0aW9ucyBvZiBVc2VyIG9iamVjdHMKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpDb25maWdJdGVtOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkQ29uZmlnSXRlbU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpDb25maWdJdGVtLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICk7CiAgICAkQmFja2VuZE9iamVjdCA9ICRDb25maWdJdGVtT2JqZWN0LT5fTG9hZFhNTFR5cGVCYWNrZW5kKAogICAgICAgIFR5cGUgPT4gJ1VzZXInLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KERCT2JqZWN0IENvbmZpZ09iamVjdCBUaW1lT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IEVuY29kZU9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KICAgICRTZWxmLT57Q3VzdG9tZXJVc2VyT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lclVzZXItPm5ldyggJXskU2VsZn0gKTsKICAgICRTZWxmLT57Q3VzdG9tZXJDb21wYW55T2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpDdXN0b21lckNvbXBhbnktPm5ldyggJXskU2VsZn0gKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFZhbHVlTG9va3VwKCkKCmdldCB0aGUgeG1sIGRhdGEgb2YgYSB2ZXJzaW9uCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPlZhbHVlTG9va3VwKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgVmFsdWVMb29rdXAgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfSB8fCAnJzsKCn0KCj1pdGVtIFN0YXRzQXR0cmlidXRlQ3JlYXRlKCkKCmNyZWF0ZSBhIGF0dHJpYnV0ZSBhcnJheSBmb3IgdGhlIHN0YXRzIGZyYW1ld29yawoKICAgIG15ICRBdHRyaWJ1dGUgPSAkQmFja2VuZE9iamVjdC0+U3RhdHNBdHRyaWJ1dGVDcmVhdGUoCiAgICAgICAgS2V5ID0+ICdLZXk6OlN1YmtleScsCiAgICAgICAgTmFtZSA9PiAnTmFtZScsCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgU3RhdHNBdHRyaWJ1dGVDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IE5hbWUgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBhcnJ0aWJ1dGUKICAgIG15ICRBdHRyaWJ1dGUgPSBbCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICRQYXJhbXtOYW1lfSwKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAkUGFyYW17S2V5fSwKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgfSwKICAgIF07CgogICAgcmV0dXJuICRBdHRyaWJ1dGU7Cn0KCj1pdGVtIEV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHNlYXJjaCB2YWx1ZSBmb3IgZXhwb3J0CgogICAgbXkgJEFycmF5UmVmID0gJEJhY2tlbmRPYmplY3QtPkV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEV4cG9ydFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHZhbHVlIGZvciBleHBvcnQKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+RXhwb3J0VmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRXhwb3J0VmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJUN1c3RvbWVyQ29tcGFueVNlYXJjaExpc3QgPSAkU2VsZi0+e0N1c3RvbWVyQ29tcGFueU9iamVjdH0tPkN1c3RvbWVyQ29tcGFueUdldCgKICAgICAgICBDdXN0b21lcklEID0+ICRQYXJhbXtWYWx1ZX0sCiAgICApOwoKICAgIG15ICRDdXN0b21lckNvbXBhbnlEYXRhU3RyID0gJyc7CiAgICBteSAkQ3VzdENvbXBhbnlNYXBSZWYgPQogICAgICAgICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdJVFNNQ0lBdHRyaWJ1dGVDb2xsZWN0aW9uOjpDb21wYW55QmFja2VuZE1hcHBpbmcnKTsKCiAgICBpZiAoICRDdXN0Q29tcGFueU1hcFJlZiAmJiByZWYoJEN1c3RDb21wYW55TWFwUmVmKSBlcSAnSEFTSCcgKSB7CgogICAgICAgIGZvciBteSAkTWFwcGluZ0ZpZWxkICggc29ydCgga2V5cyggJXskQ3VzdENvbXBhbnlNYXBSZWZ9ICkgKSApIHsKICAgICAgICAgICAgaWYgKCAkQ3VzdG9tZXJDb21wYW55U2VhcmNoTGlzdHsgJEN1c3RDb21wYW55TWFwUmVmLT57JE1hcHBpbmdGaWVsZH0gfSApIHsKICAgICAgICAgICAgICAgICRDdXN0b21lckNvbXBhbnlEYXRhU3RyIC49ICcgJwogICAgICAgICAgICAgICAgICAgIC4gJEN1c3RvbWVyQ29tcGFueVNlYXJjaExpc3R7ICRDdXN0Q29tcGFueU1hcFJlZi0+eyRNYXBwaW5nRmllbGR9IH07CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgfQoKICAgICRDdXN0b21lckNvbXBhbnlEYXRhU3RyID1+IHMvXHMrJC8vZzsKICAgICRDdXN0b21lckNvbXBhbnlEYXRhU3RyID1+IHMvXlxzKy8vZzsKCiAgICByZXR1cm4gJEN1c3RvbWVyQ29tcGFueURhdGFTdHI7CgogICAgI3JldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgI3JldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBJbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSBzZWFyY2ggdmFsdWUgZm9yIGltcG9ydAoKICAgIG15ICRBcnJheVJlZiA9ICRCYWNrZW5kT2JqZWN0LT5JbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBJbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBJbXBvcnRWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSB2YWx1ZSBmb3IgaW1wb3J0CgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPkltcG9ydFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuNSAkICREYXRlOiAyMDExLTA0LTE4IDA3OjUzOjA3ICQKCj1jdXQK IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vWE1ML1R5cGUvRHVtbXlYLnBtIC0geG1sIGJhY2tlbmQgbW9kdWxlCiMgT3JpZ2luYWwgQ29weXJpZ2h0IChDKSAyMDAxLTIwMDggT1RSUyBBRywgaHR0cDovL290cnMub3JnLwojIAojIEV4dGVuc2lvbnMgQ29weXJpZ2h0IChDKSAyMDA2LTIwMTEgYy5hLnAuZS4gSVQgR21iSAojCiMgLS0KIyBiYXNlZCB1cG9uIER1bW15LnBtIC0gMS4xMSAyMDA4LzA1LzIxIGJ5IG1oCiMgJElkOiBEdW1teVgucG0sdiAxLjMgMjAxMS0wNC0xOCAwNzo1MzowNyB0dG8gRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlhNTDo6VHlwZTo6RHVtbXlYOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4zICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlhNTDo6VHlwZTo6RHVtbXkgLSB4bWwgYmFja2VuZCBtb2R1bGUKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIHhtbCBmdW5jdGlvbnMgb2YgZHVtbXkgb2JqZWN0cwoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkNvbmZpZ0l0ZW07CgogICAgbXkgJENvbmZpZ09iamVjdCA9IEtlcm5lbDo6Q29uZmlnLT5uZXcoKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICApOwogICAgbXkgJERCT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkRCLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgIG15ICRDb25maWdJdGVtT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkNvbmZpZ0l0ZW0tPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBMb2dPYmplY3QgICAgPT4gJExvZ09iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgKTsKICAgICRCYWNrZW5kT2JqZWN0ID0gJENvbmZpZ0l0ZW1PYmplY3QtPl9Mb2FkWE1MVHlwZUJhY2tlbmQoCiAgICAgICAgVHlwZSA9PiAnRHVtbXknLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KERCT2JqZWN0IENvbmZpZ09iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCBFbmNvZGVPYmplY3QpKSB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBWYWx1ZUxvb2t1cCgpCgpnZXQgdGhlIGR1bW15IGRhdGEgb2YgYSB2ZXJzaW9uCgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPlZhbHVlTG9va3VwKCk7Cgo9Y3V0CgpzdWIgVmFsdWVMb29rdXAgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKCiAgICByZXR1cm4gJyc7Cn0KCj1pdGVtIFN0YXRzQXR0cmlidXRlQ3JlYXRlKCkKCmNyZWF0ZSBhIGF0dHJpYnV0ZSBhcnJheSBmb3IgdGhlIHN0YXRzIGZyYW1ld29yawoKICAgIG15ICRBdHRyaWJ1dGUgPSAkQmFja2VuZE9iamVjdC0+U3RhdHNBdHRyaWJ1dGVDcmVhdGUoKTsKCj1jdXQKCnN1YiBTdGF0c0F0dHJpYnV0ZUNyZWF0ZSB7CiAgICBteSAkU2VsZiA9IHNoaWZ0OwoKICAgIHJldHVybjsKfQoKPWl0ZW0gRXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgc2VhcmNoIHZhbHVlIGZvciBleHBvcnQKCiAgICBteSAkQXJyYXlSZWYgPSAkQmFja2VuZE9iamVjdC0+RXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gRXhwb3J0VmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgdmFsdWUgZm9yIGV4cG9ydAoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5FeHBvcnRWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBFeHBvcnRWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBJbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSBzZWFyY2ggdmFsdWUgZm9yIGltcG9ydAoKICAgIG15ICRBcnJheVJlZiA9ICRCYWNrZW5kT2JqZWN0LT5JbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBJbXBvcnRTZWFyY2hWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBJbXBvcnRWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSB2YWx1ZSBmb3IgaW1wb3J0CgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPkltcG9ydFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMyAkICREYXRlOiAyMDExLTA0LTE4IDA3OjUzOjA3ICQKCj1jdXQK IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vWE1ML1R5cGUvVXNlci5wbSAtIHhtbCBiYWNrZW5kIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwMS0yMDA4IE9UUlMgQUcsIGh0dHA6Ly9vdHJzLm9yZy8KIyBFeHRlbnNpb25zIENvcHlyaWdodCAoQykgMjAwNi0yMDExIGMuYS5wLmUuIElUIEdtYkgsIGh0dHA6Ly93d3cuY2FwZS1pdC5kZQojCiMgd3JpdHRlbi9jaGFuZ2VkIGJ5OgojIFN0ZWZhbiBNZWhsaWcKIyAtLQojICRJZDogVXNlci5wbSx2IDEuOCAyMDExLTA1LTEwIDEzOjMxOjQ1IHR0byBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC0yLjAudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MOjpUeXBlOjpVc2VyOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpVc2VyOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS44ICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlhNTDo6VHlwZTo6VXNlciAtIHhtbCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgeG1sIGZ1bmN0aW9ucyBvZiBVc2VyIG9iamVjdHMKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpDb25maWdJdGVtOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkQ29uZmlnSXRlbU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpDb25maWdJdGVtLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgREJPYmplY3QgICAgID0+ICREQk9iamVjdCwKICAgICk7CiAgICAkQmFja2VuZE9iamVjdCA9ICRDb25maWdJdGVtT2JqZWN0LT5fTG9hZFhNTFR5cGVCYWNrZW5kKAogICAgICAgIFR5cGUgPT4gJ1VzZXInLAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGFsbG9jYXRlIG5ldyBoYXNoIGZvciBvYmplY3QKICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgIyBjaGVjayBuZWVkZWQgb2JqZWN0cwogICAgZm9yIG15ICRPYmplY3QgKHF3KERCT2JqZWN0IENvbmZpZ09iamVjdCBUaW1lT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IEVuY29kZU9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KICAgICRTZWxmLT57VXNlck9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6VXNlci0+bmV3KCAleyRTZWxmfSApOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gVmFsdWVMb29rdXAoKQoKZ2V0IHRoZSB4bWwgZGF0YSBvZiBhIHZlcnNpb24KCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+VmFsdWVMb29rdXAoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBWYWx1ZUxvb2t1cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAnJyBpZiAhJFBhcmFte1ZhbHVlfTsKCiAgICAjIGdldCBVc2VyIGRhdGEKICAgIG15ICVVc2VyU2VhcmNoTGlzdCA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VmFsdWV9LAogICAgKTsKICAgIG15ICRVc2VyTmFtZSA9ICcnOwogICAgaWYgKCVVc2VyU2VhcmNoTGlzdCkgewogICAgICAgICRVc2VyTmFtZSA9ICciJwogICAgICAgICAgICAuICRVc2VyU2VhcmNoTGlzdHtVc2VyRmlyc3RuYW1lfSAuICcgJwogICAgICAgICAgICAuICRVc2VyU2VhcmNoTGlzdHtVc2VyTGFzdG5hbWV9IC4gJyIgPCcKICAgICAgICAgICAgLiAkVXNlclNlYXJjaExpc3R7VXNlckVtYWlsfSAuICc+JzsKICAgIH0KCiAgICByZXR1cm4gJFVzZXJOYW1lIHx8ICcnOwoKfQoKPWl0ZW0gU3RhdHNBdHRyaWJ1dGVDcmVhdGUoKQoKY3JlYXRlIGEgYXR0cmlidXRlIGFycmF5IGZvciB0aGUgc3RhdHMgZnJhbWV3b3JrCgogICAgbXkgJEF0dHJpYnV0ZSA9ICRCYWNrZW5kT2JqZWN0LT5TdGF0c0F0dHJpYnV0ZUNyZWF0ZSgKICAgICAgICBLZXkgPT4gJ0tleTo6U3Via2V5JywKICAgICAgICBOYW1lID0+ICdOYW1lJywKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBTdGF0c0F0dHJpYnV0ZUNyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgTmFtZSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgY3JlYXRlIGFycnRpYnV0ZQogICAgbXkgJEF0dHJpYnV0ZSA9IFsKICAgICAgICB7CiAgICAgICAgICAgIE5hbWUgICAgICAgICAgICAgPT4gJFBhcmFte05hbWV9LAogICAgICAgICAgICBVc2VBc1h2YWx1ZSAgICAgID0+IDAsCiAgICAgICAgICAgIFVzZUFzVmFsdWVTZXJpZXMgPT4gMCwKICAgICAgICAgICAgVXNlQXNSZXN0cmljdGlvbiA9PiAxLAogICAgICAgICAgICBFbGVtZW50ICAgICAgICAgID0+ICRQYXJhbXtLZXl9LAogICAgICAgICAgICBCbG9jayAgICAgICAgICAgID0+ICdJbnB1dEZpZWxkJywKICAgICAgICB9LAogICAgXTsKCiAgICByZXR1cm4gJEF0dHJpYnV0ZTsKfQoKPWl0ZW0gRXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgc2VhcmNoIHZhbHVlIGZvciBleHBvcnQKCiAgICBteSAkQXJyYXlSZWYgPSAkQmFja2VuZE9iamVjdC0+RXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRXhwb3J0U2VhcmNoVmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CgogICAgbXkgJVVzZXJEYXRhID0gJFNlbGYtPntVc2VyT2JqZWN0fS0+R2V0VXNlckRhdGEoCiAgICAgICAgVXNlcklEID0+ICRQYXJhbXtWYWx1ZX0sCiAgICApOwoKICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgTWVzc2FnZSAgPT4gIk5vIHVzZXIgZm91bmQgZm9yIElEIDwkUGFyYW17VmFsdWV9PiEiCiAgICApOwoKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBFeHBvcnRWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSB2YWx1ZSBmb3IgZXhwb3J0CgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPkV4cG9ydFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEV4cG9ydFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwoKICAgIG15ICVVc2VyRGF0YSA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXJJRCA9PiAkUGFyYW17VmFsdWV9LAogICAgKTsKCiAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgIE1lc3NhZ2UgID0+ICJObyB1c2VyIGZvdW5kIGZvciBJRCA8JFBhcmFte1ZhbHVlfT4hIgogICAgKTsKCiAgICByZXR1cm4gJFVzZXJEYXRhe1VzZXJMb2dpbn0gfHwgJyc7Cn0KCj1pdGVtIEltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHNlYXJjaCB2YWx1ZSBmb3IgaW1wb3J0CgogICAgbXkgJEFycmF5UmVmID0gJEJhY2tlbmRPYmplY3QtPkltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwoKICAgIG15ICVVc2VyRGF0YSA9ICRTZWxmLT57VXNlck9iamVjdH0tPkdldFVzZXJEYXRhKAogICAgICAgIFVzZXIgPT4gJFBhcmFte1ZhbHVlfSwKICAgICk7CgogICAgaWYgKCAhJFVzZXJEYXRhe1VzZXJJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyB1c2VyIGZvdW5kIGZvciBsb2dpbiA8JFBhcmFte1ZhbHVlfT4hIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHJldHVybiAkVXNlckRhdGF7VXNlcklEfTsKfQoKPWl0ZW0gSW1wb3J0VmFsdWVQcmVwYXJlKCkKCnByZXBhcmUgdmFsdWUgZm9yIGltcG9ydAoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5JbXBvcnRWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBJbXBvcnRWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKCiAgICBteSAlVXNlckRhdGEgPSAkU2VsZi0+e1VzZXJPYmplY3R9LT5HZXRVc2VyRGF0YSgKICAgICAgICBVc2VyID0+ICRQYXJhbXtWYWx1ZX0sCiAgICApOwoKICAgIGlmICggISRVc2VyRGF0YXtVc2VySUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTm8gdXNlciBmb3VuZCBmb3IgbG9naW4gPCRQYXJhbXtWYWx1ZX0+ISIKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gJFVzZXJEYXRhe1VzZXJJRH07Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwtMi4wLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuOCAkICREYXRlOiAyMDExLTA1LTEwIDEzOjMxOjQ1ICQKCj1jdXQK IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vWE1ML1R5cGUvRW5jcnlwdGVkVGV4dC5wbSAtIHhtbCBiYWNrZW5kIG1vZHVsZQojIENvcHlyaWdodCAoQykgMjAwNi0yMDExIGMuYS5wLmUuIElUIEdtYkgsIGh0dHA6Ly93d3cuY2FwZS1pdC5kZQojCiMgd3JpdHRlbi9jaGFuZ2VkIGJ5OgojICogU3RlZmFuKGRvdClNZWhsaWcoYXQpY2FwZShkYXNoKWl0KGRvdClkZQojCiMgLS0KIyAkSWQ6IEVuY3J5cHRlZFRleHQucG0sdiAxLjMgMjAxMS0xMS0xNyAxMDo1OTo1MSBzbWVobGlnIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6WE1MOjpUeXBlOjpFbmNyeXB0ZWRUZXh0OwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4zICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlhNTDo6VHlwZTo6VGV4dCAtIHhtbCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgeG1sIGZ1bmN0aW9ucyBvZiB0ZXh0IG9iamVjdHMKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkQ29uZmlnSXRlbU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgICRCYWNrZW5kT2JqZWN0ID0gJENvbmZpZ0l0ZW1PYmplY3QtPl9Mb2FkWE1MVHlwZUJhY2tlbmQoCiAgICAgICAgVHlwZSA9PiAnVGV4dCcsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiRW5jcnlwdGVkVGV4dDogR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIFZhbHVlTG9va3VwKCkKCmdldCB0aGUgdGV4dCBkYXRhIG9mIGEgdmVyc2lvbgoKICAgIG15ICRWYWx1ZSA9ICRCYWNrZW5kT2JqZWN0LT5WYWx1ZUxvb2t1cCgKICAgICAgICBWYWx1ZSA9PiAxMSwgICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBWYWx1ZUxvb2t1cCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBTdGF0c0F0dHJpYnV0ZUNyZWF0ZSgpCgpjcmVhdGUgYSBhdHRyaWJ1dGUgYXJyYXkgZm9yIHRoZSBzdGF0cyBmcmFtZXdvcmsKCiAgICBteSAkQXR0cmlidXRlID0gJEJhY2tlbmRPYmplY3QtPlN0YXRzQXR0cmlidXRlQ3JlYXRlKAogICAgICAgIEtleSAgPT4gJ0tleTo6U3Via2V5JywKICAgICAgICBOYW1lID0+ICdOYW1lJywKICAgICAgICBJdGVtID0+ICRJdGVtUmVmLAogICAgKTsKCj1jdXQKCnN1YiBTdGF0c0F0dHJpYnV0ZUNyZWF0ZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgbmVlZGVkIHN0dWZmCiAgICBmb3IgbXkgJEFyZ3VtZW50IChxdyhLZXkgTmFtZSBJdGVtKSkgewogICAgICAgIGlmICggISRQYXJhbXskQXJndW1lbnR9ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCAkQXJndW1lbnQhIiwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjIGNyZWF0ZSBhcnJ0aWJ1dGUKICAgIG15ICRBdHRyaWJ1dGUgPSBbCiAgICAgICAgewogICAgICAgICAgICBOYW1lICAgICAgICAgICAgID0+ICRQYXJhbXtOYW1lfSwKICAgICAgICAgICAgVXNlQXNYdmFsdWUgICAgICA9PiAwLAogICAgICAgICAgICBVc2VBc1ZhbHVlU2VyaWVzID0+IDAsCiAgICAgICAgICAgIFVzZUFzUmVzdHJpY3Rpb24gPT4gMSwKICAgICAgICAgICAgRWxlbWVudCAgICAgICAgICA9PiAkUGFyYW17S2V5fSwKICAgICAgICAgICAgQmxvY2sgICAgICAgICAgICA9PiAnSW5wdXRGaWVsZCcsCiAgICAgICAgfSwKICAgIF07CgogICAgcmV0dXJuICRBdHRyaWJ1dGU7Cn0KCj1pdGVtIEV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHNlYXJjaCB2YWx1ZSBmb3IgZXhwb3J0CgogICAgbXkgJEFycmF5UmVmID0gJEJhY2tlbmRPYmplY3QtPkV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEV4cG9ydFNlYXJjaFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEV4cG9ydFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHZhbHVlIGZvciBleHBvcnQKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+RXhwb3J0VmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgRXhwb3J0VmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CgogICAgIyBkZWNyeXB0CiAgICAkUGFyYW17VmFsdWV9ID0gJFNlbGYtPl9EZWNyeXB0KCAkUGFyYW17VmFsdWV9ICk7CgogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHNlYXJjaCB2YWx1ZSBmb3IgaW1wb3J0CgogICAgbXkgJEFycmF5UmVmID0gJEJhY2tlbmRPYmplY3QtPkltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEltcG9ydFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHZhbHVlIGZvciBpbXBvcnQKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+SW1wb3J0VmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgSW1wb3J0VmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CgogICAgIyBlbmNyeXB0CiAgICAkUGFyYW17VmFsdWV9ID0gJFNlbGYtPl9FbmNyeXB0KCAkUGFyYW17VmFsdWV9ICk7CgogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCnN1YiBfRGVjcnlwdCB7CiAgICBteSAoICRTZWxmLCAkUHcgKSA9IEBfOwoKICAgIHJldHVybiAnJyBpZiAhJFB3OwoKICAgIG15ICRMZW5ndGggPSBsZW5ndGgoJFB3KSAqIDQ7CiAgICAkUHcgPSBwYWNrICJoJExlbmd0aCIsICRQdzsKICAgICRQdyA9IHVucGFjayAiQiRMZW5ndGgiLCAkUHc7CiAgICAkUHcgPX4gcy8xL0EvZzsKICAgICRQdyA9fiBzLzAvMS9nOwogICAgJFB3ID1+IHMvQS8wL2c7CiAgICAkUHcgPSBwYWNrICJCJExlbmd0aCIsICRQdzsKCiAgICByZXR1cm4gJFB3Owp9CgpzdWIgX0VuY3J5cHQgewogICAgbXkgKCAkU2VsZiwgJFB3ICkgPSBAXzsKCiAgICByZXR1cm4gJycgaWYgISRQdzsKCiAgICBteSAkTGVuZ3RoID0gbGVuZ3RoKCRQdykgKiA4OwogICAgY2hvbXAgJFB3OwoKICAgICMgZ2V0IGJpdCBjb2RlCiAgICBteSAkVCA9IHVucGFjayggIkIkTGVuZ3RoIiwgJFB3ICk7CgogICAgIyBjcnlwdCBiaXQgY29kZQogICAgJFQgPX4gcy8xL0EvZzsKICAgICRUID1+IHMvMC8xL2c7CiAgICAkVCA9fiBzL0EvMC9nOwoKICAgICMgZ2V0IGFzY2lpIGNvZGUKICAgICRUID0gcGFjayggIkIkTGVuZ3RoIiwgJFQgKTsKCiAgICAjIGdldCBoZXggY29kZQogICAgbXkgJEggPSB1bnBhY2soICJoJExlbmd0aCIsICRUICk7CgogICAgcmV0dXJuICRIOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBzb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS4zICQgJERhdGU6IDIwMTEtMTEtMTcgMTA6NTk6NTEgJAoKPWN1dAo= IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vWE1ML1R5cGUvVGV4dExpbmsucG0gLSB4bWwgYmFja2VuZCBtb2R1bGUKIyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMSBjLmEucC5lLiBJVCBHbWJILCBodHRwOi8vd3d3LmNhcGUtaXQuZGUKIwojIHdyaXR0ZW4vY2hhbmdlZCBieToKIyAqIFN0ZWZhbihkb3QpTWVobGlnKGF0KWNhcGUoZGFzaClpdChkb3QpZGUKIwojIC0tCiMgJElkOiBUZXh0TGluay5wbSx2IDEuMSAyMDExLTEwLTEzIDExOjI2OjAxIHNtZWhsaWcgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpYTUw6OlR5cGU6OlRleHRMaW5rOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIHZhcnMgcXcoJFZFUlNJT04pOwokVkVSU0lPTiA9IHF3KCRSZXZpc2lvbjogMS4xICQpIFsxXTsKCj1oZWFkMSBOQU1FCgpLZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OlhNTDo6VHlwZTo6VGV4dCAtIHhtbCBiYWNrZW5kIG1vZHVsZQoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgeG1sIGZ1bmN0aW9ucyBvZiB0ZXh0IG9iamVjdHMKCj1vdmVyIDQKCj1jdXQKCj1pdGVtIG5ldygpCgpjcmVhdGUgYW4gb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06Ok1haW47CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkRW5jb2RlT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkVuY29kZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRMb2dPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TG9nLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgRW5jb2RlT2JqZWN0ID0+ICRFbmNvZGVPYmplY3QsCiAgICApOwogICAgbXkgJE1haW5PYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6TWFpbi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CiAgICBteSAkQ29uZmlnSXRlbU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIEVuY29kZU9iamVjdCA9PiAkRW5jb2RlT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICAgICA9PiAkREJPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgKTsKICAgICRCYWNrZW5kT2JqZWN0ID0gJENvbmZpZ0l0ZW1PYmplY3QtPl9Mb2FkWE1MVHlwZUJhY2tlbmQoCiAgICAgICAgVHlwZSA9PiAnVGV4dCcsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGNoZWNrIG5lZWRlZCBvYmplY3RzCiAgICBmb3IgbXkgJE9iamVjdCAocXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCBMb2dPYmplY3QgTWFpbk9iamVjdCkpIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiVGV4dExpbms6IEdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBWYWx1ZUxvb2t1cCgpCgpnZXQgdGhlIHRleHQgZGF0YSBvZiBhIHZlcnNpb24KCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+VmFsdWVMb29rdXAoCiAgICAgICAgVmFsdWUgPT4gMTEsICAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgVmFsdWVMb29rdXAgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKPWl0ZW0gU3RhdHNBdHRyaWJ1dGVDcmVhdGUoKQoKY3JlYXRlIGEgYXR0cmlidXRlIGFycmF5IGZvciB0aGUgc3RhdHMgZnJhbWV3b3JrCgogICAgbXkgJEF0dHJpYnV0ZSA9ICRCYWNrZW5kT2JqZWN0LT5TdGF0c0F0dHJpYnV0ZUNyZWF0ZSgKICAgICAgICBLZXkgID0+ICdLZXk6OlN1YmtleScsCiAgICAgICAgTmFtZSA9PiAnTmFtZScsCiAgICAgICAgSXRlbSA9PiAkSXRlbVJlZiwKICAgICk7Cgo9Y3V0CgpzdWIgU3RhdHNBdHRyaWJ1dGVDcmVhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgZm9yIG15ICRBcmd1bWVudCAocXcoS2V5IE5hbWUgSXRlbSkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JEFyZ3VtZW50fSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgJEFyZ3VtZW50ISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICB9CgogICAgIyBjcmVhdGUgYXJydGlidXRlCiAgICBteSAkQXR0cmlidXRlID0gWwogICAgICAgIHsKICAgICAgICAgICAgTmFtZSAgICAgICAgICAgICA9PiAkUGFyYW17TmFtZX0sCiAgICAgICAgICAgIFVzZUFzWHZhbHVlICAgICAgPT4gMCwKICAgICAgICAgICAgVXNlQXNWYWx1ZVNlcmllcyA9PiAwLAogICAgICAgICAgICBVc2VBc1Jlc3RyaWN0aW9uID0+IDEsCiAgICAgICAgICAgIEVsZW1lbnQgICAgICAgICAgPT4gJFBhcmFte0tleX0sCiAgICAgICAgICAgIEJsb2NrICAgICAgICAgICAgPT4gJ0lucHV0RmllbGQnLAogICAgICAgIH0sCiAgICBdOwoKICAgIHJldHVybiAkQXR0cmlidXRlOwp9Cgo9aXRlbSBFeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSBzZWFyY2ggdmFsdWUgZm9yIGV4cG9ydAoKICAgIG15ICRBcnJheVJlZiA9ICRCYWNrZW5kT2JqZWN0LT5FeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUoCiAgICAgICAgVmFsdWUgPT4gMTEsICMgKG9wdGlvbmFsKQogICAgKTsKCj1jdXQKCnN1YiBFeHBvcnRTZWFyY2hWYWx1ZVByZXBhcmUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICByZXR1cm4gaWYgIWRlZmluZWQgJFBhcmFte1ZhbHVlfTsKICAgIHJldHVybiAkUGFyYW17VmFsdWV9Owp9Cgo9aXRlbSBFeHBvcnRWYWx1ZVByZXBhcmUoKQoKcHJlcGFyZSB2YWx1ZSBmb3IgZXhwb3J0CgogICAgbXkgJFZhbHVlID0gJEJhY2tlbmRPYmplY3QtPkV4cG9ydFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEV4cG9ydFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHNlYXJjaCB2YWx1ZSBmb3IgaW1wb3J0CgogICAgbXkgJEFycmF5UmVmID0gJEJhY2tlbmRPYmplY3QtPkltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSgKICAgICAgICBWYWx1ZSA9PiAxMSwgIyAob3B0aW9uYWwpCiAgICApOwoKPWN1dAoKc3ViIEltcG9ydFNlYXJjaFZhbHVlUHJlcGFyZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIHJldHVybiBpZiAhZGVmaW5lZCAkUGFyYW17VmFsdWV9OwogICAgcmV0dXJuICRQYXJhbXtWYWx1ZX07Cn0KCj1pdGVtIEltcG9ydFZhbHVlUHJlcGFyZSgpCgpwcmVwYXJlIHZhbHVlIGZvciBpbXBvcnQKCiAgICBteSAkVmFsdWUgPSAkQmFja2VuZE9iamVjdC0+SW1wb3J0VmFsdWVQcmVwYXJlKAogICAgICAgIFZhbHVlID0+IDExLCAjIChvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgSW1wb3J0VmFsdWVQcmVwYXJlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgcmV0dXJuIGlmICFkZWZpbmVkICRQYXJhbXtWYWx1ZX07CiAgICByZXR1cm4gJFBhcmFte1ZhbHVlfTsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMSAkICREYXRlOiAyMDExLTEwLTEzIDExOjI2OjAxICQKCj1jdXQK IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vRXZlbnQvQ0lDbGFzc1JlZmVyZW5jZV9SZWZyZXNoTGlua3MucG0KIwojIFNlYXJjaGVzIGZvciBhdHRyaWJ1dGVzIG9mIHR5cGUgQ0lDbGFzc1JlZmVyZW5jZSBpbiB0aGUgbmV3IENJcyB2ZXJzaW9uIGRhdGEKIyBhbmQgcmVmcmVzaGVzIGFsbCBsaW5rcyB0byB0aGF0IGNsYXNzLCBpZiBjb25maWd1cmVkIGluIENJLWNsYXNzIGRlZmluaXRpb24uCiMgSXQgZGVsZXRlcyBsaW5rcyB0byBhbnkgb2JqZWN0cyBvZiB0aGUgcmVmZXJlbmNlZCBDSS1jbGFzcyBpZiB0aGUgdmFsdWUgZG9lcwojIG5vdCBleGlzIGluIHRoZSBDSXMgdmVyc2lvbiBkYXRhLgojCiMgQ29weXJpZ2h0IChDKSAyMDA2LTIwMTEgYy5hLnAuZS4gSVQgR21iSCwgaHR0cDovL3d3dy5jYXBlLWl0LmRlCiMKIyAtLQojICRJZDogQ0lDbGFzc1JlZmVyZW5jZV9SZWZyZXNoTGlua3MucG0sdiAxLjE2IDIwMTEtMDgtMjYgMTM6MzU6MTUgc21laGxpZyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpFdmVudDo6Q0lDbGFzc1JlZmVyZW5jZV9SZWZyZXNoTGlua3M7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3Q7CnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNJQXR0cmlidXRDb2xsZWN0aW9uVXRpbHM7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjE2ICQpIFsxXTsKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICAjYWxDb0NlbnRhdGUgbmV3IGhhc2ggZm9yIG9iamVjdC4uLgogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjZ2V0IHJlcXVpcmVkIG9iamVjdHMuLi4KICAgIGZvcmVhY2ggKAogICAgICAgIHF3KENvbmZpZ09iamVjdCBMb2dPYmplY3QgREJPYmplY3QgTWFpbk9iamVjdCBUaW1lT2JqZWN0CiAgICAgICAgQ29uZmlnSXRlbU9iamVjdCBFbmNvZGVPYmplY3QpCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffSB8fCBkaWUgIkdvdCBubyAkXyEiOwogICAgfQoKICAgIGlmICggISRTZWxmLT57TGlua09iamVjdH0gKSB7CiAgICAgICAgJFNlbGYtPntMaW5rT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0LT5uZXcoICV7JFNlbGZ9ICk7CiAgICB9CgogICAgaWYgKCAhJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gKSB7CiAgICAgICAgJFNlbGYtPntHZW5lcmFsQ2F0YWxvZ09iamVjdH0gPQogICAgICAgICAgICBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2ctPm5ldyggJXskU2VsZn0gKTsKICAgIH0KCiAgICBpZiAoICEkU2VsZi0+e0NJQXR0cmlidXRDb2xsZWN0aW9uVXRpbHNPYmplY3R9ICkgewogICAgICAgICRTZWxmLT57Q0lBdHRyaWJ1dENvbGxlY3Rpb25VdGlsc09iamVjdH0gPQogICAgICAgICAgICBLZXJuZWw6OlN5c3RlbTo6SVRTTUNJQXR0cmlidXRDb2xsZWN0aW9uVXRpbHMtPm5ldyggJXskU2VsZn0gKTsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCnN1YiBSdW4gewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjY2hlY2sgcmVxdWlyZWQgc3R1ZmYuLi4KICAgIGZvcmVhY2ggKHF3KEV2ZW50IENvbmZpZ0l0ZW1JRCkpIHsKICAgICAgICBpZiAoICEkUGFyYW17JF99ICkgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgICAgICBNZXNzYWdlICA9PiAiRXZlbnQ6OkNJQ2xhc3NSZWZlcmVuY2VfUmVmcmVzaExpbmtzOiBOZWVkICRfISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjZ2V0IGNvbmZpZyBpdGVtLi4uCiAgICBteSAkQ29uZmlnSXRlbVJlZiA9CiAgICAgICAgJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fQogICAgICAgIC0+Q29uZmlnSXRlbUdldCggQ29uZmlnSXRlbUlEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LCApOwogICAgcmV0dXJuIGlmICggISRDb25maWdJdGVtUmVmIHx8IHJlZigkQ29uZmlnSXRlbVJlZikgbmUgJ0hBU0gnICk7CgogICAgI2NoZWNrIGlmIHRoZXJlIGlzIGEgdmVyc2lvbiBhdCBhbGwuLi4KICAgIG15ICRWZXJzaW9uTGlzdFJlZiA9CiAgICAgICAgJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fQogICAgICAgIC0+VmVyc2lvbkxpc3QoIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwgKTsKICAgIHJldHVybiBpZiAoICEkVmVyc2lvbkxpc3RSZWYtPlswXSApOwoKICAgICNnZXQgdGhlIG1vc3QgY3VycmVudCB2ZXJzaW9uLi4uCiAgICBteSAkVmVyc2lvbkRhdGEgPQogICAgICAgICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0KICAgICAgICAtPlZlcnNpb25HZXQoIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwgKTsKICAgIHJldHVybiBpZiAoICEkVmVyc2lvbkRhdGEgfHwgcmVmKCRWZXJzaW9uRGF0YSkgbmUgJ0hBU0gnICk7CgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBnZXQgaGFzaCB3aXRoIGFsbCBhdHRyaWJ1dGUta2V5cywgcmVmZXJlbmNlZCBDSS1jbGFzc2VzLAogICAgIyBjb3JyZXNwb25kaW5nIGxpbmsgdHlwZXMgYW5kIC1kaXJlY3Rpb25zIGZyb20gQ0ktY2xhc3MgZGVmaW5pdGlvbi4uLgoKICAgIG15ICVSZWxBdHRyID0gKCk7CiAgICBteSAkWE1MRGVmaW5pdGlvbiA9CiAgICAgICAgJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fQogICAgICAgIC0+RGVmaW5pdGlvbkdldCggQ2xhc3NJRCA9PiAkVmVyc2lvbkRhdGEtPntDbGFzc0lEfSwgKTsKCiAgICAjIF9DcmVhdGVDSVJlZmVyZW5jZXNIYXNoKCkgcmV0dXJucyBhIGhhc2ggcmVmIHdpdGggZm9sbG93aW5nIHN0cnVjdHVyZToKICAgICMgJFJlbEF0dHJ7S2V5fS0+e1JlZmVyZW5jZWRDSUNsYXNzTGlua1R5cGV9CiAgICAjICRSZWxBdHRye0tleX0tPntSZWZlcmVuY2VkQ0lDbGFzc0xpbmtEaXJlY3Rpb259CiAgICAjICRSZWxBdHRye0tleX0tPntSZWZlcmVuY2VkQ0lDbGFzc05hbWV9CiAgICAlUmVsQXR0ciA9ICRTZWxmLT5fQ3JlYXRlQ0lSZWZlcmVuY2VzSGFzaCgKICAgICAgICBYTUxEYXRhICAgICAgID0+ICRWZXJzaW9uRGF0YS0+e1hNTERhdGF9LT5bMV0tPntWZXJzaW9ufS0+WzFdLAogICAgICAgIFhNTERlZmluaXRpb24gPT4gJFhNTERlZmluaXRpb24tPntEZWZpbml0aW9uUmVmfSwKICAgICk7CgogICAgbXkgJUNJUmVmZXJlbmNlQXR0ckRhdGEgPSAoKTsKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIHVwZGF0ZSBDb25maWdJdGVtLWxpbmtzLi4uCiAgICBpZiAoICRWZXJzaW9uRGF0YSAmJiAkWE1MRGVmaW5pdGlvbiAmJiAlUmVsQXR0ciApIHsKCiAgICAgICAgZm9yIG15ICRDdXJyS2V5bmFtZSAoIGtleXMoJVJlbEF0dHIpICkgewoKICAgICAgICAgICAgbmV4dCBpZiAhJFJlbEF0dHJ7JEN1cnJLZXluYW1lfS0+WzBdLT57UmVmZXJlbmNlZENJQ2xhc3NMaW5rVHlwZX07CgogICAgICAgICAgICAjZ2V0IGN1cnJlbnQgbGlua3MgZnJvbSB0aGlzIENJLi4KICAgICAgICAgICAgI215IEBMaW5rZWRTcmNSZWZlcmVjZUlEcyA9IEB7CiAgICAgICAgICAgICMkU2VsZi0+R2V0TGlua2VkT2JqZWN0cygKICAgICAgICAgICAgI0Zyb21PYmplY3QgICA9PiAnSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgICAgICAjRnJvbU9iamVjdElEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgICAgICAjVG9PYmplY3QgICAgID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgICAgICNUb1N1Yk9iamVjdCAgPT4gJFJlbEF0dHJ7JEN1cnJLZXluYW1lfS0+WzBdLT57UmVmZXJlbmNlZENJQ2xhc3NOYW1lfSwKICAgICAgICAgICAgI0xpbmtUeXBlICAgICA9PiAkUmVsQXR0cnskQ3VycktleW5hbWV9LT5bMF0tPntSZWZlcmVuY2VkQ0lDbGFzc0xpbmtUeXBlfSwKICAgICAgICAgICAgI0RpcmVjdGlvbiAgICA9PiAnU291cmNlJywKICAgICAgICAgICAgIykKICAgICAgICAgICAgI307CiAgICAgICAgICAgIG15ICVMaW5rcyA9ICRTZWxmLT57TGlua09iamVjdH0tPkxpbmtLZXlMaXN0KAogICAgICAgICAgICAgICAgT2JqZWN0MSA9PiAnSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgICAgICAgICAgS2V5MSAgICA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgICAgIE9iamVjdDIgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICAgICAgICAgIFN0YXRlICAgPT4gJ1ZhbGlkJywKICAgICAgICAgICAgICAgIFR5cGUgPT4KICAgICAgICAgICAgICAgICAgICAkUmVsQXR0cnskQ3VycktleW5hbWV9LT5bMF0tPntSZWZlcmVuY2VkQ0lDbGFzc0xpbmtUeXBlfSwKICAgICAgICAgICAgICAgIERpcmVjdGlvbiA9PiAnU291cmNlJywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBteSBATGlua2VkU3JjUmVmZXJlY2VJRHMgPSBrZXlzICVMaW5rczsKCiAgICAgICAgICAgICVMaW5rcyA9ICRTZWxmLT57TGlua09iamVjdH0tPkxpbmtLZXlMaXN0KAogICAgICAgICAgICAgICAgT2JqZWN0MSA9PiAnSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgICAgICAgICAgS2V5MSAgICA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgICAgIE9iamVjdDIgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICAgICAgICAgIFN0YXRlICAgPT4gJ1ZhbGlkJywKICAgICAgICAgICAgICAgIFR5cGUgPT4KICAgICAgICAgICAgICAgICAgICAkUmVsQXR0cnskQ3VycktleW5hbWV9LT5bMF0tPntSZWZlcmVuY2VkQ0lDbGFzc0xpbmtUeXBlfSwKICAgICAgICAgICAgICAgIERpcmVjdGlvbiA9PiAnVGFyZ2V0JywKICAgICAgICAgICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgICAgICAgICApOwogICAgICAgICAgICBteSBATGlua2VkVGFyZ2V0UmVmZXJlbmNlSURzID0ga2V5cyAlTGlua3M7CgogICAgICAgICAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgIyBkZWxldGUgZXhpc3RpbmcgbGlua3MuLi4KICAgICAgICAgICAgI2lmIHBvc3NpYmxlLCBkbyB3aGF0IHdlJ3JlIGhlcmUgZm9yLi4uCgogICAgICAgICAgICAlQ0lSZWZlcmVuY2VBdHRyRGF0YSA9ICV7CiAgICAgICAgICAgICAgICAkU2VsZi0+X0dldEF0dHJpYnV0ZURhdGFCeUtleSgKICAgICAgICAgICAgICAgICAgICBYTUxEYXRhICAgICAgID0+ICRWZXJzaW9uRGF0YS0+e1hNTERhdGF9LT5bMV0tPntWZXJzaW9ufS0+WzFdLAogICAgICAgICAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJFhNTERlZmluaXRpb24tPntEZWZpbml0aW9uUmVmfSwKICAgICAgICAgICAgICAgICAgICBLZXlOYW1lICAgICAgID0+ICRDdXJyS2V5bmFtZSwKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+IDEsICAgICNuZWVkIHRoZSBDSS1JRCwgbm90IHRoZSBzaG93biB2YWx1ZQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAjZGVsZXRlIGFsbCBleGlzdGluZyBsaW5rcy4uLgogICAgICAgICAgICBpZiAoIGtleXMoJUNJUmVmZXJlbmNlQXR0ckRhdGEpICkgewogICAgICAgICAgICAgICAgZm9yIG15ICRDdXJyTGlua1BhcnRuZXJJRCAoQExpbmtlZFNyY1JlZmVyZWNlSURzKSB7CgogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGlua09iamVjdH0tPkxpbmtEZWxldGUoCiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdDEgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICAgICAgICAgICAgICAgICAgS2V5MSAgICA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0MiA9PiAnSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgICAgICAgICAgICAgICAgICBLZXkyICAgID0+ICRDdXJyTGlua1BhcnRuZXJJRCwKICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAgICA9PiAkUmVsQXR0cnskQ3VycktleW5hbWV9LT5bMF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+e1JlZmVyZW5jZWRDSUNsYXNzTGlua1R5cGV9LAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAjZGVsZXRlIGFsbCBleGlzdGluZyBUYXJnZXQgIGxpbmtzLi4uCiAgICAgICAgICAgIGZvciBteSAkQ3VyckxpbmtQYXJ0bmVySUQgKEBMaW5rZWRUYXJnZXRSZWZlcmVuY2VJRHMpIHsKCiAgICAgICAgICAgICAgICAkU2VsZi0+e0xpbmtPYmplY3R9LT5MaW5rRGVsZXRlKAogICAgICAgICAgICAgICAgICAgIE9iamVjdDEgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICAgICAgICAgICAgICBLZXkxICAgID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgICAgICAgICAgICAgIE9iamVjdDIgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICAgICAgICAgICAgICBLZXkyICAgID0+ICRDdXJyTGlua1BhcnRuZXJJRCwKICAgICAgICAgICAgICAgICAgICBUeXBlID0+CiAgICAgICAgICAgICAgICAgICAgICAgICRSZWxBdHRyeyRDdXJyS2V5bmFtZX0tPlswXS0+e1JlZmVyZW5jZWRDSUNsYXNzTGlua1R5cGV9LAogICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfQogICAgICAgIH0gICAgI0VPIGZvciBteSAkQ3VycktleW5hbWUgKCBrZXlzKCAlUmVsQXR0ciApKQoKICAgICAgICBmb3IgbXkgJEN1cnJLZXluYW1lICgga2V5cyglUmVsQXR0cikgKSB7CgogICAgICAgICAgICAlQ0lSZWZlcmVuY2VBdHRyRGF0YSA9ICV7CiAgICAgICAgICAgICAgICAkU2VsZi0+X0dldEF0dHJpYnV0ZURhdGFCeUtleSgKICAgICAgICAgICAgICAgICAgICBYTUxEYXRhICAgICAgID0+ICRWZXJzaW9uRGF0YS0+e1hNTERhdGF9LT5bMV0tPntWZXJzaW9ufS0+WzFdLAogICAgICAgICAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJFhNTERlZmluaXRpb24tPntEZWZpbml0aW9uUmVmfSwKICAgICAgICAgICAgICAgICAgICBLZXlOYW1lICAgICAgID0+ICRDdXJyS2V5bmFtZSwKICAgICAgICAgICAgICAgICAgICBDb250ZW50ID0+IDEsICAgICNuZWVkIHRoZSBDSS1JRCwgbm90IHRoZSBzaG93biB2YWx1ZQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgIyBjcmVhdGUgYWxsIGxpbmtzIGZyb20gYXZhaWxhYmxlIGRhdGEuLi4KICAgICAgICAgICAgZm9yIG15ICRTZWFyY2hSZXN1bHQgKCBrZXlzKCVDSVJlZmVyZW5jZUF0dHJEYXRhKSApIHsKCiAgICAgICAgICAgICAgICBteSBAUmVmZXJlbmNlQ0lJRHMgPSBAeyAkQ0lSZWZlcmVuY2VBdHRyRGF0YXskU2VhcmNoUmVzdWx0fSB9OwogICAgICAgICAgICAgICAgZm9yIG15ICRDdXJyQ0lSZWZlcmVuY2VJRCAoQFJlZmVyZW5jZUNJSURzKSB7CgogICAgICAgICAgICAgICAgICAgICNjcmVhdGUgbGluayBiZXR3ZWVuIHRoaXMgQ0kgYW5kIGN1cnJlbnQgQ0lSZWZlcmVuY2UtYXR0cmlidXRlLi4uCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkQ3VyckNJUmVmZXJlbmNlSUQgJiYgJFBhcmFte0NvbmZpZ0l0ZW1JRH0gKSB7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUmVsQXR0cnskQ3VycktleW5hbWV9LT5bMF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+e1JlZmVyZW5jZWRDSUNsYXNzTGlua0RpcmVjdGlvbn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICRSZWxBdHRyeyRDdXJyS2V5bmFtZX0tPlswXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLT57UmVmZXJlbmNlZENJQ2xhc3NMaW5rRGlyZWN0aW9ufSBlcSAnUmV2ZXJzZScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMaW5rT2JqZWN0fS0+TGlua0FkZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VPYmplY3QgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VLZXkgICAgPT4gJEN1cnJDSVJlZmVyZW5jZUlELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldE9iamVjdCA9PiAnSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldEtleSAgICA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgICAgICAgPT4gJFJlbEF0dHJ7JEN1cnJLZXluYW1lfS0+WzBdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+e1JlZmVyZW5jZWRDSUNsYXNzTGlua1R5cGV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlICA9PiAnVmFsaWQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXJJRCA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xpbmtPYmplY3R9LT5MaW5rQWRkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldE9iamVjdCA9PiAnSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldEtleSAgICA9PiAkQ3VyckNJUmVmZXJlbmNlSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlT2JqZWN0ID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlS2V5ICAgID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICAgICAgICA9PiAkUmVsQXR0cnskQ3VycktleW5hbWV9LT5bMF0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT57UmVmZXJlbmNlZENJQ2xhc3NMaW5rVHlwZX0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdGUgID0+ICdWYWxpZCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEID0+IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIH0gICAgI0VPIGlmKCAkQ3VyckNJUmVmZXJlbmNlSUQgJiYgJFBhcmFte0NvbmZpZ0l0ZW1JRH0pCgogICAgICAgICAgICAgICAgfSAgICAjRU8gZm9yIG15ICRDdXJyQ0lSZWZlcmVuY2VJRCggQFJlZmVyZW5jZUNJSURzICkKCiAgICAgICAgICAgIH0gICAgI0VPIGZvcmVhY2ggbXkgJFNlYXJjaFJlc3VsdCAoIGtleXMoICVDSVJlZmVyZW5jZUF0dHJEYXRhKSkKCiAgICAgICAgfSAgICAjRU8gZm9yIG15ICRDdXJyS2V5bmFtZSAoIGtleXMoICVSZWxBdHRyICkpCgogICAgfSAgICAjRU8gaWYgKCAkVmVyc2lvbkRhdGEgJiYgJFhNTERlZmluaXRpb24gJiYgJVJlbEF0dHIpCiAgICByZXR1cm47Cn0KCnN1YiBfQ3JlYXRlQ0lSZWZlcmVuY2VzSGFzaCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgY2hlY2sgcmVxdWlyZWQgcGFyYW1zLi4uCiAgICBpZiAoCiAgICAgICAgKCAhJFBhcmFte1hNTERhdGF9ICkKICAgICAgICB8fCAoICEkUGFyYW17WE1MRGVmaW5pdGlvbn0gKQogICAgICAgIHx8ICggcmVmICRQYXJhbXtYTUxEYXRhfSBuZSAnSEFTSCcgKQogICAgICAgIHx8ICggcmVmICRQYXJhbXtYTUxEZWZpbml0aW9ufSBuZSAnQVJSQVknICkKICAgICAgICApCiAgICB7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIG15ICRDSVJlbEF0dHIgPQoKICAgICAgICAjJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+R2V0QXR0cmlidXRlRGF0YUJ5VHlwZSgKICAgICAgICAkU2VsZi0+e0NJQXR0cmlidXRDb2xsZWN0aW9uVXRpbHNPYmplY3R9LT5HZXRBdHRyaWJ1dGVEYXRhQnlUeXBlKAogICAgICAgIFhNTERhdGEgICAgICAgPT4gJFBhcmFte1hNTERhdGF9LAogICAgICAgIFhNTERlZmluaXRpb24gPT4gJFBhcmFte1hNTERlZmluaXRpb259LAogICAgICAgIEF0dHJpYnV0ZVR5cGUgPT4gJ0NJQ2xhc3NSZWZlcmVuY2UnLAogICAgICAgICk7CgogICAgbXkgJVN1bVJlbEF0dHIgPSAoKTsKICAgIG15ICRQYXJhbVJlZjsKICAgIGZvciBteSAkS2V5ICgga2V5cyAleyRDSVJlbEF0dHJ9ICkgewoKICAgICAgICBteSAlUmV0SGFzaCA9ICgpOwogICAgICAgIElURU06CiAgICAgICAgZm9yIG15ICRJdGVtICggQHsgJFBhcmFte1hNTERlZmluaXRpb259IH0gKSB7CgogICAgICAgICAgICBDT1VOVEVSOgogICAgICAgICAgICBmb3IgbXkgJENvdW50ZXIgKCAxIC4uICRJdGVtLT57Q291bnRNYXh9ICkgewoKICAgICAgICAgICAgICAgICMgbm8gY29udGVudCB0aGVuIHN0b3AgbG9vcC4uLgogICAgICAgICAgICAgICAgbGFzdCBDT1VOVEVSCiAgICAgICAgICAgICAgICAgICAgaWYgIQogICAgICAgICAgICAgICAgICAgICAgICBkZWZpbmVkICRQYXJhbXtYTUxEYXRhfS0+eyAkSXRlbS0+e0tleX0gfS0+WyRDb3VudGVyXQogICAgICAgICAgICAgICAgICAgICAgICAtPntDb250ZW50fTsKCiAgICAgICAgICAgICAgICBpZiAoICRJdGVtLT57S2V5fSBlcSAkS2V5ICkgewoKICAgICAgICAgICAgICAgICAgICBmb3JlYWNoIG15ICRQYXJhbVJlZiAoCiAgICAgICAgICAgICAgICAgICAgICAgIHF3KFJlZmVyZW5jZWRDSUNsYXNzTmFtZSBSZWZlcmVuY2VkQ0lDbGFzc0xpbmtUeXBlIFJlZmVyZW5jZWRDSUNsYXNzTGlua0RpcmVjdGlvbikKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgJFJldEhhc2h7JFBhcmFtUmVmfSA9ICRJdGVtLT57SW5wdXR9LT57JFBhcmFtUmVmfTsKCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbmV4dCBDT1VOVEVSIGlmICEkSXRlbS0+e1N1Yn07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcHVzaCBAeyAkU3VtUmVsQXR0cnskS2V5fSB9LCBcJVJldEhhc2g7CgogICAgfQogICAgcmV0dXJuICVTdW1SZWxBdHRyOwp9Cgo9aXRlbSBfR2V0QXR0cmlidXRlRGF0YUJ5S2V5KCkKCiAgICBSZXR1cm5zIGEgaGFzaHJlZiB3aXRoIG5hbWVzIGFuZCBhdHRyaWJ1dGUgdmFsdWVzIGZyb20gdGhlIAogICAgWE1MLURhdGFIYXNoIGZvciBhIHNwZWNpZmllZCBkYXRhIHR5cGUuCgogICAgJENvbmZpZ0l0ZW1PYmplY3QtPkdldEF0dHJpYnV0ZURhdGFCeUtleSggCiAgICAgICAgWE1MRGF0YSAgICAgICA9PiAkWE1MRGF0YSwKICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRYTUxEZWZpbml0aW9uLAogICAgICAgIEtleU5hbWUgPT4gJEtleSwKICAgICk7Cgo9Y3V0CgpzdWIgX0dldEF0dHJpYnV0ZURhdGFCeUtleSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICVSZXN1bHQ7CgogICAgaWYgKCAkUGFyYW17Q29udGVudH0gKSB7CiAgICAgICAgbXkgJEN1cnJDb250ZW50ID0KCiAgICAgICAgICAgICMkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5HZXRBdHRyaWJ1dGVDb250ZW50c0J5S2V5KAogICAgICAgICAgICAkU2VsZi0+e0NJQXR0cmlidXRDb2xsZWN0aW9uVXRpbHNPYmplY3R9LT5HZXRBdHRyaWJ1dGVDb250ZW50c0J5S2V5KAogICAgICAgICAgICBLZXlOYW1lICAgICAgID0+ICRQYXJhbXtLZXlOYW1lfSwKICAgICAgICAgICAgWE1MRGF0YSAgICAgICA9PiAkUGFyYW17WE1MRGF0YX0sCiAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJFBhcmFte1hNTERlZmluaXRpb259LAogICAgICAgICAgICApOwogICAgICAgICRSZXN1bHR7ICRQYXJhbXtLZXlOYW1lfSB9ID0gJEN1cnJDb250ZW50OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgbXkgJEN1cnJWYWwgPQoKICAgICAgICAgICAgIyRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkdldEF0dHJpYnV0ZVZhbHVlc0J5S2V5KAogICAgICAgICAgICAkU2VsZi0+e0NJQXR0cmlidXRDb2xsZWN0aW9uVXRpbHNPYmplY3R9LT5HZXRBdHRyaWJ1dGVWYWx1ZXNCeUtleSgKICAgICAgICAgICAgS2V5TmFtZSAgICAgICA9PiAkUGFyYW17S2V5TmFtZX0sCiAgICAgICAgICAgIFhNTERhdGEgICAgICAgPT4gJFBhcmFte1hNTERhdGF9LAogICAgICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRQYXJhbXtYTUxEZWZpbml0aW9ufSwKICAgICAgICAgICAgKTsKICAgICAgICAkUmVzdWx0eyAkUGFyYW17S2V5TmFtZX0gfSA9ICRDdXJyVmFsOwogICAgfQogICAgcmV0dXJuIFwlUmVzdWx0OwoKfQoKMTsK IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNvbmZpZ0l0ZW0vRXZlbnQvU2VydmljZVJlZmVyZW5jZV9SZWZyZXNoTGlua3MucG0KIwojIFNlYXJjaGVzIGZvciBhdHRyaWJ1dGVzIG9mIHR5cGUgU2VydmljZVJlZmVyZW5jZSBpbiB0aGUgbmV3IENJcyB2ZXJzaW9uIGRhdGEKIyBhbmQgcmVmcmVzaGVzIGFsbCBsaW5rcyB0byB0aGF0IGNsYXNzLCBpZiBjb25maWd1cmVkIGluIENJLWNsYXNzIGRlZmluaXRpb24uCiMgSXQgZGVsZXRlcyBsaW5rcyB0byBhbnkgb2JqZWN0cyBvZiB0aGUgcmVmZXJlbmNlZCBDSS1jbGFzcyBpZiB0aGUgdmFsdWUgZG9lcwojIG5vdCBleGlzIGluIHRoZSBDSXMgdmVyc2lvbiBkYXRhLgojCiMgQ29weXJpZ2h0IChDKSAyMDA2LTIwMTEgYy5hLnAuZS4gSVQgR21iSCwgaHR0cDovL3d3dy5jYXBlLWl0LmRlCiMKIyB3cml0dGVuL2NoYW5nZWQgYnk6CiMgKiBTdGVmYW4oZG90KU1laGxpZyhhdCljYXBlLWl0KGRvdClkZQojCiMgLS0KIyAkSWQ6IFNlcnZpY2VSZWZlcmVuY2VfUmVmcmVzaExpbmtzLnBtLHYgMS42IDIwMTEtMDgtMjYgMTM6MzQ6NTcgc21laGxpZyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpTeXN0ZW06OklUU01Db25maWdJdGVtOjpFdmVudDo6U2VydmljZVJlZmVyZW5jZV9SZWZyZXNoTGlua3M7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7Cgp1c2UgS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3Q7CnVzZSBLZXJuZWw6OlN5c3RlbTo6R2VuZXJhbENhdGFsb2c7CnVzZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNJQXR0cmlidXRDb2xsZWN0aW9uVXRpbHM7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjYgJCkgWzFdOwoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICNhbENvQ2VudGF0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0Li4uCiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICNnZXQgcmVxdWlyZWQgb2JqZWN0cy4uLgogICAgZm9yZWFjaCAoCiAgICAgICAgcXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBEQk9iamVjdCBNYWluT2JqZWN0IFRpbWVPYmplY3QKICAgICAgICBDb25maWdJdGVtT2JqZWN0IEVuY29kZU9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPnskX30gPSAkUGFyYW17JF99IHx8IGRpZSAiR290IG5vICRfISI7CiAgICB9CgogICAgaWYgKCAhJFNlbGYtPntMaW5rT2JqZWN0fSApIHsKICAgICAgICAkU2VsZi0+e0xpbmtPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OkxpbmtPYmplY3QtPm5ldyggJXskU2VsZn0gKTsKICAgIH0KCiAgICBpZiAoICEkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSApIHsKICAgICAgICAkU2VsZi0+e0dlbmVyYWxDYXRhbG9nT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpHZW5lcmFsQ2F0YWxvZy0+bmV3KCAleyRTZWxmfSApOwogICAgfQoKICAgIGlmICggISRTZWxmLT57Q0lBdHRyaWJ1dENvbGxlY3Rpb25VdGlsc09iamVjdH0gKSB7CiAgICAgICAgJFNlbGYtPntDSUF0dHJpYnV0Q29sbGVjdGlvblV0aWxzT2JqZWN0fSA9CiAgICAgICAgICAgIEtlcm5lbDo6U3lzdGVtOjpJVFNNQ0lBdHRyaWJ1dENvbGxlY3Rpb25VdGlscy0+bmV3KCAleyRTZWxmfSApOwogICAgfQoKICAgIHJldHVybiAkU2VsZjsKfQoKc3ViIFJ1biB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgICNjaGVjayByZXF1aXJlZCBzdHVmZi4uLgogICAgZm9yZWFjaCAocXcoRXZlbnQgQ29uZmlnSXRlbUlEKSkgewogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJFdmVudDo6U2VydmljZVJlZmVyZW5jZV9SZWZyZXNoTGlua3M6IE5lZWQgJF8hIgogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICNnZXQgY29uZmlnIGl0ZW0uLi4KICAgIG15ICRDb25maWdJdGVtUmVmID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+Q29uZmlnSXRlbUdldCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICApOwogICAgcmV0dXJuIGlmICggISRDb25maWdJdGVtUmVmIHx8IHJlZigkQ29uZmlnSXRlbVJlZikgbmUgJ0hBU0gnICk7CgogICAgI2NoZWNrIGlmIHRoZXJlIGlzIGEgdmVyc2lvbiBhdCBhbGwuLi4KICAgIG15ICRWZXJzaW9uTGlzdFJlZiA9ICRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPlZlcnNpb25MaXN0KAogICAgICAgIENvbmZpZ0l0ZW1JRCA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICk7CiAgICByZXR1cm4gaWYgKCAhJFZlcnNpb25MaXN0UmVmLT5bMF0gKTsKCiAgICAjZ2V0IHRoZSBtb3N0IGN1cnJlbnQgdmVyc2lvbi4uLgogICAgbXkgJFZlcnNpb25EYXRhID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+VmVyc2lvbkdldCgKICAgICAgICBDb25maWdJdGVtSUQgPT4gJFBhcmFte0NvbmZpZ0l0ZW1JRH0sCiAgICApOwogICAgcmV0dXJuIGlmICggISRWZXJzaW9uRGF0YSB8fCByZWYoJFZlcnNpb25EYXRhKSBuZSAnSEFTSCcgKTsKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIGdldCBoYXNoIHdpdGggYWxsIGF0dHJpYnV0ZS1rZXlzLCByZWZlcmVuY2VkIENJLWNsYXNzZXMsCiAgICAjIGNvcnJlc3BvbmRpbmcgbGluayB0eXBlcyBhbmQgLWRpcmVjdGlvbnMgZnJvbSBDSS1jbGFzcyBkZWZpbml0aW9uLi4uCgogICAgbXkgJVJlbEF0dHIgICAgICAgPSAoKTsKICAgIG15ICRYTUxEZWZpbml0aW9uID0gJFNlbGYtPntDb25maWdJdGVtT2JqZWN0fS0+RGVmaW5pdGlvbkdldCgKICAgICAgICBDbGFzc0lEID0+ICRWZXJzaW9uRGF0YS0+e0NsYXNzSUR9LAogICAgKTsKCiAgICAjIF9DcmVhdGVDSVJlZmVyZW5jZXNIYXNoKCkgcmV0dXJucyBhIGhhc2ggcmVmIHdpdGggZm9sbG93aW5nIHN0cnVjdHVyZToKICAgICMgJFJlbEF0dHJ7S2V5fS0+e1JlZmVyZW5jZWRTZXJ2aWNlTGlua1R5cGV9CiAgICAjICRSZWxBdHRye0tleX0tPntSZWZlcmVuY2VkU2VydmljZUxpbmtEaXJlY3Rpb259CiAgICAlUmVsQXR0ciA9ICRTZWxmLT5fQ3JlYXRlQ0lSZWZlcmVuY2VzSGFzaCgKICAgICAgICBYTUxEYXRhICAgICAgID0+ICRWZXJzaW9uRGF0YS0+e1hNTERhdGF9LT5bMV0tPntWZXJzaW9ufS0+WzFdLAogICAgICAgIFhNTERlZmluaXRpb24gPT4gJFhNTERlZmluaXRpb24tPntEZWZpbml0aW9uUmVmfSwKICAgICk7CgogICAgbXkgJUNJUmVmZXJlbmNlQXR0ckRhdGEgPSAoKTsKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIHVwZGF0ZSBDb25maWdJdGVtLWxpbmtzLi4uCiAgICBpZiAoICRWZXJzaW9uRGF0YSAmJiAkWE1MRGVmaW5pdGlvbiAmJiAlUmVsQXR0ciApIHsKCiAgICAgICAgZm9yIG15ICRDdXJyS2V5bmFtZSAoIGtleXMoJVJlbEF0dHIpICkgewoKICAgICAgICAgICAgbmV4dCBpZiAhJFJlbEF0dHJ7JEN1cnJLZXluYW1lfS0+WzBdLT57UmVmZXJlbmNlZFNlcnZpY2VMaW5rVHlwZX07CgogICAgICAgICAgICAjZ2V0IGN1cnJlbnQgbGlua3MgZnJvbSB0aGlzIENJLi4KICAgICAgICAgICAgbXkgQExpbmtlZFNyY1JlZmVyZWNlSURzID0gQHsKICAgICAgICAgICAgICAgICRTZWxmLT5HZXRMaW5rZWRPYmplY3RzKAogICAgICAgICAgICAgICAgICAgIEZyb21PYmplY3QgICA9PiAnSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgICAgICAgICAgICAgIEZyb21PYmplY3RJRCA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgICAgICAgICBUb09iamVjdCAgICAgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICAgICAgICAgIFRvU3ViT2JqZWN0ICA9PiAnJywKICAgICAgICAgICAgICAgICAgICBMaW5rVHlwZSAgICAgPT4gJFJlbEF0dHJ7JEN1cnJLZXluYW1lfS0+WzBdLT57UmVmZXJlbmNlZFNlcnZpY2VMaW5rVHlwZX0sCiAgICAgICAgICAgICAgICAgICAgRGlyZWN0aW9uICAgID0+ICdTb3VyY2UnLAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAjZ2V0IGN1cnJlbnQgIGxpbmtzIHRvIHRoaXMgQ0kuLgogICAgICAgICAgICBteSBATGlua2VkVGFyZ2V0UmVmZXJlbmNlSURzID0gQHsKICAgICAgICAgICAgICAgICRTZWxmLT5HZXRMaW5rZWRPYmplY3RzKAogICAgICAgICAgICAgICAgICAgIEZyb21PYmplY3QgICA9PiAnU2VydmljZScsCiAgICAgICAgICAgICAgICAgICAgRnJvbU9iamVjdElEID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgICAgICAgICAgICAgIFRvT2JqZWN0ICAgICA9PiAnSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgICAgICAgICAgICAgIFRvU3ViT2JqZWN0ICA9PiAnJywKICAgICAgICAgICAgICAgICAgICBMaW5rVHlwZSAgICAgPT4gJFJlbEF0dHJ7JEN1cnJLZXluYW1lfS0+WzBdLT57UmVmZXJlbmNlZFNlcnZpY2VMaW5rVHlwZX0sCiAgICAgICAgICAgICAgICAgICAgRGlyZWN0aW9uICAgID0+ICdUYXJnZXQnLAogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgIyBkZWxldGUgZXhpc3RpbmcgbGlua3MuLi4KICAgICAgICAgICAgI2lmIHBvc3NpYmxlLCBkbyB3aGF0IHdlJ3JlIGhlcmUgZm9yLi4uCiAgICAgICAgICAgIGlmICggJFZlcnNpb25EYXRhICYmICRYTUxEZWZpbml0aW9uICkgewoKICAgICAgICAgICAgICAgICVDSVJlZmVyZW5jZUF0dHJEYXRhID0gJXsKICAgICAgICAgICAgICAgICAgICAkU2VsZi0+X0dldEF0dHJpYnV0ZURhdGFCeUtleSgKICAgICAgICAgICAgICAgICAgICAgICAgWE1MRGF0YSAgICAgICA9PiAkVmVyc2lvbkRhdGEtPntYTUxEYXRhfS0+WzFdLT57VmVyc2lvbn0tPlsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkWE1MRGVmaW5pdGlvbi0+e0RlZmluaXRpb25SZWZ9LAogICAgICAgICAgICAgICAgICAgICAgICBLZXlOYW1lICAgICAgID0+ICRDdXJyS2V5bmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCA9PiAxLCAgICAjbmVlZCB0aGUgQ0ktSUQsIG5vdCB0aGUgc2hvd24gdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgIH07CgogICAgICAgICAgICAgICAgI2RlbGV0ZSBhbGwgZXhpc3RpbmcgbGlua3MuLi4KICAgICAgICAgICAgICAgIGlmICgga2V5cyglQ0lSZWZlcmVuY2VBdHRyRGF0YSkgKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIG15ICRDdXJyTGlua1BhcnRuZXJJRCAoQExpbmtlZFNyY1JlZmVyZWNlSURzKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAkU2VsZi0+e0xpbmtPYmplY3R9LT5MaW5rRGVsZXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0MSA9PiAnSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5MSAgICA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdDIgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5MiAgICA9PiAkQ3VyckxpbmtQYXJ0bmVySUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICRSZWxBdHRyeyRDdXJyS2V5bmFtZX0tPlswXS0+e1JlZmVyZW5jZWRTZXJ2aWNlTGlua1R5cGV9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcklEICA9PiAxLAogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAjZGVsZXRlIGFsbCBleGlzdGluZyBUYXJnZXQgIGxpbmtzLi4uCiAgICAgICAgICAgICAgICBmb3IgbXkgJEN1cnJMaW5rUGFydG5lcklEIChATGlua2VkVGFyZ2V0UmVmZXJlbmNlSURzKSB7CgogICAgICAgICAgICAgICAgICAgICRTZWxmLT57TGlua09iamVjdH0tPkxpbmtEZWxldGUoCiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdDEgPT4gJ0lUU01Db25maWdJdGVtJywKICAgICAgICAgICAgICAgICAgICAgICAgS2V5MSAgICA9PiAkUGFyYW17Q29uZmlnSXRlbUlEfSwKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0MiA9PiAnU2VydmljZScsCiAgICAgICAgICAgICAgICAgICAgICAgIEtleTIgICAgPT4gJEN1cnJMaW5rUGFydG5lcklELAogICAgICAgICAgICAgICAgICAgICAgICBUeXBlICAgID0+ICRSZWxBdHRyeyRDdXJyS2V5bmFtZX0tPlswXS0+e1JlZmVyZW5jZWRTZXJ2aWNlTGlua1R5cGV9LAogICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgID0+IDEsCiAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICMgY3JlYXRlIGFsbCBsaW5rcyBmcm9tIGF2YWlsYWJsZSBkYXRhLi4uCiAgICAgICAgICAgIGZvciBteSAkU2VhcmNoUmVzdWx0ICgga2V5cyglQ0lSZWZlcmVuY2VBdHRyRGF0YSkgKSB7CiAgICAgICAgICAgICAgICBteSBAUmVmZXJlbmNlQ0lJRHMgPSBAeyAkQ0lSZWZlcmVuY2VBdHRyRGF0YXskU2VhcmNoUmVzdWx0fSB9OwogICAgICAgICAgICAgICAgZm9yIG15ICRDdXJyQ0lSZWZlcmVuY2VJRCAoQFJlZmVyZW5jZUNJSURzKSB7CgogICAgICAgICAgICAgICAgICAgICNjcmVhdGUgbGluayBiZXR3ZWVuIHRoaXMgQ0kgYW5kIGN1cnJlbnQgQ0lSZWZlcmVuY2UtYXR0cmlidXRlLi4uCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkQ3VyckNJUmVmZXJlbmNlSUQgJiYgJFBhcmFte0NvbmZpZ0l0ZW1JRH0gKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICRSZWxBdHRyeyRDdXJyS2V5bmFtZX0tPlswXS0+e1JlZmVyZW5jZWRTZXJ2aWNlTGlua0RpcmVjdGlvbn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkUmVsQXR0cnskQ3VycktleW5hbWV9LT5bMF0tPntSZWZlcmVuY2VkU2VydmljZUxpbmtEaXJlY3Rpb259IGVxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUmV2ZXJzZScKICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMaW5rT2JqZWN0fS0+TGlua0FkZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3VyY2VPYmplY3QgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUtleSAgICA9PiAkQ3VyckNJUmVmZXJlbmNlSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0T2JqZWN0ID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0S2V5ICAgID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICA9PiAkUmVsQXR0cnskQ3VycktleW5hbWV9LT5bMF0tPntSZWZlcmVuY2VkU2VydmljZUxpbmtUeXBlfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSAgPT4gJ1ZhbGlkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgJFNlbGYtPntMaW5rT2JqZWN0fS0+TGlua0FkZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRPYmplY3QgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldEtleSAgICA9PiAkQ3VyckNJUmVmZXJlbmNlSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlT2JqZWN0ID0+ICdJVFNNQ29uZmlnSXRlbScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlS2V5ICAgID0+ICRQYXJhbXtDb25maWdJdGVtSUR9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgICA9PiAkUmVsQXR0cnskQ3VycktleW5hbWV9LT5bMF0tPntSZWZlcmVuY2VkU2VydmljZUxpbmtUeXBlfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSAgPT4gJ1ZhbGlkJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VySUQgPT4gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgfSAgICAjRU8gaWYoICRDdXJyQ0lSZWZlcmVuY2VJRCAmJiAkUGFyYW17Q29uZmlnSXRlbUlEfSkKCiAgICAgICAgICAgICAgICB9ICAgICNFTyBmb3IgbXkgJEN1cnJDSVJlZmVyZW5jZUlEKCBAUmVmZXJlbmNlQ0lJRHMgKQoKICAgICAgICAgICAgfSAgICAjRU8gZm9yZWFjaCBteSAkU2VhcmNoUmVzdWx0ICgga2V5cyggJUNJUmVmZXJlbmNlQXR0ckRhdGEpKQoKICAgICAgICB9ICAgICNFTyBmb3IgbXkgJEN1cnJLZXluYW1lICgga2V5cyggJVJlbEF0dHIgKSkKCiAgICB9ICAgICNFTyBpZiAoICRWZXJzaW9uRGF0YSAmJiAkWE1MRGVmaW5pdGlvbiAmJiAlUmVsQXR0cikKICAgIHJldHVybjsKfQoKc3ViIF9DcmVhdGVDSVJlZmVyZW5jZXNIYXNoIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayByZXF1aXJlZCBwYXJhbXMuLi4KICAgIGlmICgKICAgICAgICAoICEkUGFyYW17WE1MRGF0YX0gKSB8fAogICAgICAgICggISRQYXJhbXtYTUxEZWZpbml0aW9ufSApIHx8CiAgICAgICAgKCByZWYgJFBhcmFte1hNTERhdGF9IG5lICdIQVNIJyApIHx8CiAgICAgICAgKCByZWYgJFBhcmFte1hNTERlZmluaXRpb259IG5lICdBUlJBWScgKQogICAgICAgICkKICAgIHsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgbXkgJENJUmVsQXR0ciA9CgogICAgICAgICMkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5HZXRBdHRyaWJ1dGVEYXRhQnlUeXBlKAogICAgICAgICRTZWxmLT57Q0lBdHRyaWJ1dENvbGxlY3Rpb25VdGlsc09iamVjdH0tPkdldEF0dHJpYnV0ZURhdGFCeVR5cGUoCiAgICAgICAgWE1MRGF0YSAgICAgICA9PiAkUGFyYW17WE1MRGF0YX0sCiAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkUGFyYW17WE1MRGVmaW5pdGlvbn0sCiAgICAgICAgQXR0cmlidXRlVHlwZSA9PiAnU2VydmljZVJlZmVyZW5jZScsCiAgICAgICAgKTsKCiAgICBteSAlU3VtUmVsQXR0ciA9ICgpOwogICAgbXkgJFBhcmFtUmVmOwogICAgZm9yIG15ICRLZXkgKCBrZXlzICV7JENJUmVsQXR0cn0gKSB7CgogICAgICAgIG15ICVSZXRIYXNoID0gKCk7CiAgICAgICAgSVRFTToKICAgICAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkUGFyYW17WE1MRGVmaW5pdGlvbn0gfSApIHsKCiAgICAgICAgICAgIENPVU5URVI6CiAgICAgICAgICAgIGZvciBteSAkQ291bnRlciAoIDEgLi4gJEl0ZW0tPntDb3VudE1heH0gKSB7CgogICAgICAgICAgICAgICAgIyBubyBjb250ZW50IHRoZW4gc3RvcCBsb29wLi4uCiAgICAgICAgICAgICAgICBsYXN0IENPVU5URVIgaWYgIWRlZmluZWQgJFBhcmFte1hNTERhdGF9LT57ICRJdGVtLT57S2V5fSB9LT5bJENvdW50ZXJdLT57Q29udGVudH07CgogICAgICAgICAgICAgICAgaWYgKCAkSXRlbS0+e0tleX0gZXEgJEtleSApIHsKCiAgICAgICAgICAgICAgICAgICAgZm9yZWFjaCBteSAkUGFyYW1SZWYgKAogICAgICAgICAgICAgICAgICAgICAgICBxdyhSZWZlcmVuY2VkU2VydmljZU5hbWUgUmVmZXJlbmNlZFNlcnZpY2VMaW5rVHlwZSBSZWZlcmVuY2VkU2VydmljZUxpbmtEaXJlY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICRSZXRIYXNoeyRQYXJhbVJlZn0gPSAkSXRlbS0+e0lucHV0fS0+eyRQYXJhbVJlZn07CgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG5leHQgQ09VTlRFUiBpZiAhJEl0ZW0tPntTdWJ9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHB1c2ggQHsgJFN1bVJlbEF0dHJ7JEtleX0gfSwgXCVSZXRIYXNoOwoKICAgIH0KICAgIHJldHVybiAlU3VtUmVsQXR0cjsKfQoKPWl0ZW0gX0dldEF0dHJpYnV0ZURhdGFCeUtleSgpCgogICAgUmV0dXJucyBhIGhhc2hyZWYgd2l0aCBuYW1lcyBhbmQgYXR0cmlidXRlIHZhbHVlcyBmcm9tIHRoZSAKICAgIFhNTC1EYXRhSGFzaCBmb3IgYSBzcGVjaWZpZWQgZGF0YSB0eXBlLgoKICAgICRDb25maWdJdGVtT2JqZWN0LT5HZXRBdHRyaWJ1dGVEYXRhQnlLZXkoIAogICAgICAgIFhNTERhdGEgICAgICAgPT4gJFhNTERhdGEsCiAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkWE1MRGVmaW5pdGlvbiwKICAgICAgICBLZXlOYW1lID0+ICRLZXksCiAgICApOwoKPWN1dAoKc3ViIF9HZXRBdHRyaWJ1dGVEYXRhQnlLZXkgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAlUmVzdWx0OwoKICAgIGlmICggJFBhcmFte0NvbnRlbnR9ICkgewogICAgICAgIG15ICRDdXJyQ29udGVudCA9ICAgICMkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5HZXRBdHRyaWJ1dGVDb250ZW50c0J5S2V5KAogICAgICAgICAgICAkU2VsZi0+e0NJQXR0cmlidXRDb2xsZWN0aW9uVXRpbHNPYmplY3R9LT5HZXRBdHRyaWJ1dGVDb250ZW50c0J5S2V5KAogICAgICAgICAgICBLZXlOYW1lICAgICAgID0+ICRQYXJhbXtLZXlOYW1lfSwKICAgICAgICAgICAgWE1MRGF0YSAgICAgICA9PiAkUGFyYW17WE1MRGF0YX0sCiAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJFBhcmFte1hNTERlZmluaXRpb259LAogICAgICAgICAgICApOwogICAgICAgICRSZXN1bHR7ICRQYXJhbXtLZXlOYW1lfSB9ID0gJEN1cnJDb250ZW50OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgbXkgJEN1cnJWYWwgPSAgICAgICAgIyRTZWxmLT57Q29uZmlnSXRlbU9iamVjdH0tPkdldEF0dHJpYnV0ZVZhbHVlc0J5S2V5KAogICAgICAgICAgICAkU2VsZi0+e0NJQXR0cmlidXRDb2xsZWN0aW9uVXRpbHNPYmplY3R9LT5HZXRBdHRyaWJ1dGVWYWx1ZXNCeUtleSgKICAgICAgICAgICAgS2V5TmFtZSAgICAgICA9PiAkUGFyYW17S2V5TmFtZX0sCiAgICAgICAgICAgIFhNTERhdGEgICAgICAgPT4gJFBhcmFte1hNTERhdGF9LAogICAgICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRQYXJhbXtYTUxEZWZpbml0aW9ufSwKICAgICAgICAgICAgKTsKICAgICAgICAkUmVzdWx0eyAkUGFyYW17S2V5TmFtZX0gfSA9ICRDdXJyVmFsOwogICAgfQogICAgcmV0dXJuIFwlUmVzdWx0OwoKfQoKIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIwoKPWl0ZW0gR2V0TGlua2VkT2JqZWN0cygpCgogICByZXR1cm5zIGFuIGFycmF5IHJlZiB3aXRoIElEcyBvZiBsaW5rZWQgb2JqZWN0cwogICAKICAgTk9URTogcmVtb3ZlIHRoaXMgbWV0aG9kIGFzIHNvb24gYXMgKEtJWCkgCiAgIEtlcm5lbDo6U3lzdGVtOjpMaW5rT2JqZWN0OjpHZXRMaW5rZWRPYmplY3RzIGhhcyBiZWVuIG1vZGlmaWVkIGFuZCBpcyAKICAgYXZhaWxhYmxlICEhIQogICAKICAgbXkgQExpbmtlZExvY2F0aW9uSURzID0gQHskU2VsZi0+R2V0TGlua2VkT2JqZWN0cygKICAgICAgIEZyb21PYmplY3QgICA9PiAnSVRTTUNvbmZpZ0l0ZW0nLAogICAgICAgRnJvbU9iamVjdElEID0+IDEyMywKICAgICAgIFRvT2JqZWN0ICAgICA9PiAnSVRTTUNvbmZpZ0l0ZW0nIHwgJ1RpY2tldCcsCiAgICAgICBUb1N1Yk9iamVjdCAgPT4gJ0xvY2F0aW9uLVNvbWUgQ0kgQ2xhc3MnIHwgJ09yU29tZVRpY2tldFR5cGUnLAogICAgICAgTGlua1R5cGUgICAgID0+ICdQYXJlbnRDaGlsZCcsICAgICAgICAjTGlua1R5cGUgLSBvcHRpb25hbAogICAgICAgRGlyZWN0aW9uICAgID0+IChTb3VyY2V8VGFyZ2V0fEJvdGgpLCAjTGlua0RpcmVjdGlvbiAtIG9wdGlvbmFsCiAgICl9OwoKPWN1dAoKc3ViIEdldExpbmtlZE9iamVjdHMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIG15IEBJREFyciA9IHF3e307CgogICAgIyBjaGVjayByZXF1aXJlZCBwYXJhbXMuLi4KICAgIGlmICggKCAhJFBhcmFte1RvT2JqZWN0fSApIHx8ICggISRQYXJhbXtGcm9tT2JqZWN0fSApIHx8ICggISRQYXJhbXtGcm9tT2JqZWN0SUR9ICkgKQogICAgewogICAgICAgIHJldHVybiBcQElEQXJyOwogICAgfQoKICAgICNhcyBsb25nIGFzIGl0J3Mgbm90IGltcGxlbWVudGVkLi4uCiAgICBpZiAoCiAgICAgICAgKCAkUGFyYW17VG9PYmplY3R9IG5lICdJVFNNQ29uZmlnSXRlbScgKQogICAgICAgICYmICggJFBhcmFte1RvT2JqZWN0fSBuZSAnVGlja2V0JyApCiAgICAgICAgJiYgKCAkUGFyYW17VG9PYmplY3R9IG5lICdTZXJ2aWNlJyApCiAgICAgICAgKQogICAgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkxpbmtPYmplY3Q6OkdldExpbmtlZE9iamVjdHM6ICIKICAgICAgICAgICAgICAgIC4gInVua25vd24gVG9PYmplY3QgJFBhcmFte1RvT2JqZWN0fSAtIHdvbid0IGRvIGFueXRoaW5nLiIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gXEBJREFycjsKICAgIH0KCiAgICBpZiAoICEkUGFyYW17VG9TdWJPYmplY3R9ICkgewogICAgICAgICRQYXJhbXtUb1N1Yk9iamVjdH0gPSAiIjsKICAgIH0KCiAgICAjZ2V0IGFsbCBsaW5rZWQgVG9PYmplY3RzLi4uCiAgICBteSAkUGFydG5lckxpbmtMaXN0ID0gJFNlbGYtPntMaW5rT2JqZWN0fS0+TGlua0xpc3RXaXRoRGF0YSgKICAgICAgICBPYmplY3QgICAgPT4gJFBhcmFte0Zyb21PYmplY3R9LAogICAgICAgIEtleSAgICAgICA9PiAkUGFyYW17RnJvbU9iamVjdElEfSwKICAgICAgICBPYmplY3QyICAgPT4gJFBhcmFte1RvT2JqZWN0fSwKICAgICAgICBTdGF0ZSAgICAgPT4gJ1ZhbGlkJywKICAgICAgICBUeXBlICAgICAgPT4gJFBhcmFte0xpbmtUeXBlfSB8fCAnJywKICAgICAgICBEaXJlY3Rpb24gPT4gJFBhcmFte0RpcmVjdGlvbn0gfHwgJ0JvdGgnLAogICAgICAgIFVzZXJJRCAgICA9PiAxLAogICAgKTsKCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIFRvUGFydG5lciAiSVRTTUNvbmZpZ0l0ZW0iCiAgICBpZiAoICRQYXJhbXtUb09iamVjdH0gZXEgJ0lUU01Db25maWdJdGVtJyApIHsKCiAgICAgICAgI2ZvciBlYWNoIGV4aXN0aW5nIGxpbmsgdHlwZQogICAgICAgIGZvciBteSAkTGlua1R5cGUgKCBrZXlzKCAleyAkUGFydG5lckxpbmtMaXN0LT57J0lUU01Db25maWdJdGVtJ30gfSApICkgewoKICAgICAgICAgICAgI2lmIGxpbmtlZCBvYmplY3QgaXMgYSBzb3VyY2UKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgKCBkZWZpbmVkKCAkUGFydG5lckxpbmtMaXN0LT57ICRQYXJhbXtUb09iamVjdH0gfS0+eyRMaW5rVHlwZX0tPntTb3VyY2V9ICkgKQogICAgICAgICAgICAgICAgJiYKICAgICAgICAgICAgICAgICggcmVmKCAkUGFydG5lckxpbmtMaXN0LT57ICRQYXJhbXtUb09iamVjdH0gfS0+eyRMaW5rVHlwZX0tPntTb3VyY2V9ICkgZXEgJ0hBU0gnICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yIG15ICRDdXJyQ0lJRCAoCiAgICAgICAgICAgICAgICAgICAga2V5cyggJXsgJFBhcnRuZXJMaW5rTGlzdC0+eyAkUGFyYW17VG9PYmplY3R9IH0tPnskTGlua1R5cGV9LT57U291cmNlfSB9ICkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbXkgJEN1cnJDSSA9CiAgICAgICAgICAgICAgICAgICAgICAgICRQYXJ0bmVyTGlua0xpc3QtPnsgJFBhcmFte1RvT2JqZWN0fSB9LT57JExpbmtUeXBlfS0+e1NvdXJjZX0tPnskQ3VyckNJSUR9OwoKICAgICAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXtUb1N1Yk9iamVjdH0gJiYgKCAkQ3VyckNJLT57Q2xhc3N9IGVxICRQYXJhbXtUb1N1Yk9iamVjdH0gKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCggQElEQXJyLCAkQ3VyckNJSUQgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAhJFBhcmFte1RvU3ViT2JqZWN0fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCggQElEQXJyLCAkQ3VyckNJSUQgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICNpZiBsaW5rZWQgb2JqZWN0IGlzIHRhcmdldAogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAoIGRlZmluZWQoICRQYXJ0bmVyTGlua0xpc3QtPnsgJFBhcmFte1RvT2JqZWN0fSB9LT57JExpbmtUeXBlfS0+e1RhcmdldH0gKSApCiAgICAgICAgICAgICAgICAmJgogICAgICAgICAgICAgICAgKCByZWYoICRQYXJ0bmVyTGlua0xpc3QtPnsgJFBhcmFte1RvT2JqZWN0fSB9LT57JExpbmtUeXBlfS0+e1RhcmdldH0gKSBlcSAnSEFTSCcgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3IgbXkgJEN1cnJDSUlEICgKICAgICAgICAgICAgICAgICAgICBrZXlzKCAleyAkUGFydG5lckxpbmtMaXN0LT57ICRQYXJhbXtUb09iamVjdH0gfS0+eyRMaW5rVHlwZX0tPntUYXJnZXR9IH0gKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBteSAkQ3VyckNJID0gJFBhcnRuZXJMaW5rTGlzdC0+eyAkUGFyYW17VG9PYmplY3R9IH0tPnskTGlua1R5cGV9LT57VGFyZ2V0fQogICAgICAgICAgICAgICAgICAgICAgICAtPnskQ3VyckNJSUR9OwoKICAgICAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXtUb1N1Yk9iamVjdH0gJiYgKCAkQ3VyckNJLT57Q2xhc3N9IGVxICRQYXJhbXtUb1N1Yk9iamVjdH0gKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCggQElEQXJyLCAkQ3VyckNJSUQgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAhJFBhcmFte1RvU3ViT2JqZWN0fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCggQElEQXJyLCAkQ3VyckNJSUQgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgfSAgICAjRU8gZm9yIGVhY2ggZXhpc3RpbmcgbGluayB0eXBlCgogICAgfQoKICAgICMgRU8gVG9QYXJ0bmVyICJJVFNNQ29uZmlnSXRlbSIKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIFRvUGFydG5lciAiVGlja2V0IgogICAgaWYgKCAkUGFyYW17VG9PYmplY3R9IGVxICdUaWNrZXQnICkgewoKICAgICAgICAjZm9yIGVhY2ggZXhpc3RpbmcgbGluayB0eXBlCiAgICAgICAgZm9yIG15ICRMaW5rVHlwZSAoIGtleXMoICV7ICRQYXJ0bmVyTGlua0xpc3QtPnsnVGlja2V0J30gfSApICkgewoKICAgICAgICAgICAgI2lmIGxpbmtlZCBvYmplY3QgaXMgYSBzb3VyY2UKICAgICAgICAgICAgaWYgKAogICAgICAgICAgICAgICAgKCBkZWZpbmVkKCAkUGFydG5lckxpbmtMaXN0LT57ICRQYXJhbXtUb09iamVjdH0gfS0+eyRMaW5rVHlwZX0tPntTb3VyY2V9ICkgKQogICAgICAgICAgICAgICAgJiYKICAgICAgICAgICAgICAgICggcmVmKCAkUGFydG5lckxpbmtMaXN0LT57ICRQYXJhbXtUb09iamVjdH0gfS0+eyRMaW5rVHlwZX0tPntTb3VyY2V9ICkgZXEgJ0hBU0gnICkKICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZm9yIG15ICRUaWNrZXRJRCAoCiAgICAgICAgICAgICAgICAgICAga2V5cyggJXsgJFBhcnRuZXJMaW5rTGlzdC0+eyAkUGFyYW17VG9PYmplY3R9IH0tPnskTGlua1R5cGV9LT57U291cmNlfSB9ICkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbXkgJEN1cnJUaWNrZXQgPSAkUGFydG5lckxpbmtMaXN0LT57ICRQYXJhbXtUb09iamVjdH0gfS0+eyRMaW5rVHlwZX0tPntTb3VyY2V9CiAgICAgICAgICAgICAgICAgICAgICAgIC0+eyRUaWNrZXRJRH07CgogICAgICAgICAgICAgICAgICAgIGlmICggJFBhcmFte1RvU3ViT2JqZWN0fSAmJiAoICRDdXJyVGlja2V0LT57VHlwZX0gZXEgJFBhcmFte1RvU3ViT2JqZWN0fSApICkgewogICAgICAgICAgICAgICAgICAgICAgICBwdXNoKCBASURBcnIsICRUaWNrZXRJRCApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICEkUGFyYW17VG9TdWJPYmplY3R9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBwdXNoKCBASURBcnIsICRUaWNrZXRJRCApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgI2lmIGxpbmtlZCBvYmplY3QgaXMgdGFyZ2V0CiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICggZGVmaW5lZCggJFBhcnRuZXJMaW5rTGlzdC0+eyAkUGFyYW17VG9PYmplY3R9IH0tPnskTGlua1R5cGV9LT57VGFyZ2V0fSApICkKICAgICAgICAgICAgICAgICYmCiAgICAgICAgICAgICAgICAoIHJlZiggJFBhcnRuZXJMaW5rTGlzdC0+eyAkUGFyYW17VG9PYmplY3R9IH0tPnskTGlua1R5cGV9LT57VGFyZ2V0fSApIGVxICdIQVNIJyApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciBteSAkVGlja2V0SUQgKAogICAgICAgICAgICAgICAgICAgIGtleXMoICV7ICRQYXJ0bmVyTGlua0xpc3QtPnsgJFBhcmFte1RvT2JqZWN0fSB9LT57JExpbmtUeXBlfS0+e1RhcmdldH0gfSApCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG15ICRDdXJyVGlja2V0ID0gJFBhcnRuZXJMaW5rTGlzdC0+eyAkUGFyYW17VG9PYmplY3R9IH0tPnskTGlua1R5cGV9LT57VGFyZ2V0fQogICAgICAgICAgICAgICAgICAgICAgICAtPnskVGlja2V0SUR9OwoKICAgICAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXtUb1N1Yk9iamVjdH0gJiYgKCAkQ3VyclRpY2tldC0+e1R5cGV9IGVxICRQYXJhbXtUb1N1Yk9iamVjdH0gKSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCggQElEQXJyLCAkVGlja2V0SUQgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAhJFBhcmFte1RvU3ViT2JqZWN0fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCggQElEQXJyLCAkVGlja2V0SUQgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgfSAgICAjRU8gZm9yIGVhY2ggZXhpc3RpbmcgbGluayB0eXBlCgogICAgfQoKICAgICMgRU8gVG9QYXJ0bmVyICJUaWNrZXQiCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyBUb1BhcnRuZXIgIlNlcnZpY2UiCiAgICBpZiAoICRQYXJhbXtUb09iamVjdH0gZXEgJ1NlcnZpY2UnICkgewoKICAgICAgICAjZm9yIGVhY2ggZXhpc3RpbmcgbGluayB0eXBlCiAgICAgICAgZm9yIG15ICRMaW5rVHlwZSAoIGtleXMoICV7ICRQYXJ0bmVyTGlua0xpc3QtPnsnU2VydmljZSd9IH0gKSApIHsKCiAgICAgICAgICAgICNpZiBsaW5rZWQgb2JqZWN0IGlzIGEgc291cmNlCiAgICAgICAgICAgIGlmICgKICAgICAgICAgICAgICAgICggZGVmaW5lZCggJFBhcnRuZXJMaW5rTGlzdC0+eyAkUGFyYW17VG9PYmplY3R9IH0tPnskTGlua1R5cGV9LT57U291cmNlfSApICkKICAgICAgICAgICAgICAgICYmCiAgICAgICAgICAgICAgICAoIHJlZiggJFBhcnRuZXJMaW5rTGlzdC0+eyAkUGFyYW17VG9PYmplY3R9IH0tPnskTGlua1R5cGV9LT57U291cmNlfSApIGVxICdIQVNIJyApCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZvciBteSAkU2VydmljZUlEICgKICAgICAgICAgICAgICAgICAgICBrZXlzKCAleyAkUGFydG5lckxpbmtMaXN0LT57ICRQYXJhbXtUb09iamVjdH0gfS0+eyRMaW5rVHlwZX0tPntTb3VyY2V9IH0gKQogICAgICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBteSAkQ3VyclNlcnZpY2UgPSAkUGFydG5lckxpbmtMaXN0LT57ICRQYXJhbXtUb09iamVjdH0gfS0+eyRMaW5rVHlwZX0tPntTb3VyY2V9CiAgICAgICAgICAgICAgICAgICAgICAgIC0+eyRTZXJ2aWNlSUR9OwoKICAgICAgICAgICAgICAgICAgICBpZiAoICRQYXJhbXtUb1N1Yk9iamVjdH0gJiYgKCAkQ3VyclNlcnZpY2UtPntUeXBlfSBlcSAkUGFyYW17VG9TdWJPYmplY3R9ICkgKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2goIEBJREFyciwgJFNlcnZpY2VJRCApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNpZiAoICEkUGFyYW17VG9TdWJPYmplY3R9ICkgewogICAgICAgICAgICAgICAgICAgICAgICBwdXNoKCBASURBcnIsICRTZXJ2aWNlSUQgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICNpZiBsaW5rZWQgb2JqZWN0IGlzIHRhcmdldAogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAoIGRlZmluZWQoICRQYXJ0bmVyTGlua0xpc3QtPnsgJFBhcmFte1RvT2JqZWN0fSB9LT57JExpbmtUeXBlfS0+e1RhcmdldH0gKSApCiAgICAgICAgICAgICAgICAmJgogICAgICAgICAgICAgICAgKCByZWYoICRQYXJ0bmVyTGlua0xpc3QtPnsgJFBhcmFte1RvT2JqZWN0fSB9LT57JExpbmtUeXBlfS0+e1RhcmdldH0gKSBlcSAnSEFTSCcgKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmb3IgbXkgJFNlcnZpY2VJRCAoCiAgICAgICAgICAgICAgICAgICAga2V5cyggJXsgJFBhcnRuZXJMaW5rTGlzdC0+eyAkUGFyYW17VG9PYmplY3R9IH0tPnskTGlua1R5cGV9LT57VGFyZ2V0fSB9ICkKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgbXkgJEN1cnJTZXJ2aWNlID0gJFBhcnRuZXJMaW5rTGlzdC0+eyAkUGFyYW17VG9PYmplY3R9IH0tPnskTGlua1R5cGV9LT57VGFyZ2V0fQogICAgICAgICAgICAgICAgICAgICAgICAtPnskU2VydmljZUlEfTsKCiAgICAgICAgICAgICAgICAgICAgaWYgKCAkUGFyYW17VG9TdWJPYmplY3R9ICYmICggJEN1cnJTZXJ2aWNlLT57VHlwZX0gZXEgJFBhcmFte1RvU3ViT2JqZWN0fSApICkgewogICAgICAgICAgICAgICAgICAgICAgICBwdXNoKCBASURBcnIsICRTZXJ2aWNlSUQgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzaWYgKCAhJFBhcmFte1RvU3ViT2JqZWN0fSApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHVzaCggQElEQXJyLCAkU2VydmljZUlEICk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgIH0gICAgI0VPIGZvciBlYWNoIGV4aXN0aW5nIGxpbmsgdHlwZQoKICAgIH0KCiAgICAjIEVPIFRvUGFydG5lciAiU2VydmljZSIKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICByZXR1cm4gXEBJREFycjsKfQoKIwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKMTsK IyAtLQojIEtlcm5lbC9TeXN0ZW0vSVRTTUNJQXR0cmlidXRDb2xsZWN0aW9uVXRpbHMucG0gLSBhZGRpdGlvbmFsIGNvbmZpZyBpdGVtIGZ1bmN0aW9ucwojIENvcHlyaWdodCAoQykgMjAwNi0yMDExIGMuYS5wLmUuIElUIEdtYkgsIGh0dHA6Ly93d3cuY2FwZS1pdC5kZQojCiMgd3JpdHRlbi9lZGl0ZWQgYnk6CiMgKiBUb3JzdGVuKGRvdClUaGF1KGF0KWNhcGUtaXQoZG90KWRlCiMgKiBSZW5lKGRvdClCb2VobShhdCljYXBlLWl0KGRvdClkZQojICogTWFydGluKGRvdClCYWx6YXJlayhhdCljYXBlLWl0KGRvdClkZQojICogRnJhbmsoZG90KU9iZXJlbmRlcihhdCljYXBlLWl0KGRvdClkZQojCiMgLS0KIyAkSWQ6IElUU01DSUF0dHJpYnV0Q29sbGVjdGlvblV0aWxzLnBtLHYgMS4yIDIwMTEtMDMtMTQgMTQ6MzM6MTUgYWxpdHZpbm92YSBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6SVRTTUNJQXR0cmlidXRDb2xsZWN0aW9uVXRpbHM7Cgp1c2Ugc3RyaWN0Owp1c2Ugd2FybmluZ3M7CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgI2FsQ29DZW50YXRlIG5ldyBoYXNoIGZvciBvYmplY3QuLi4KICAgIG15ICRTZWxmID0ge307CiAgICBibGVzcyggJFNlbGYsICRUeXBlICk7CgogICAgI2dldCByZXF1aXJlZCBvYmplY3RzLi4uCiAgICBmb3JlYWNoICgKICAgICAgICBxdyhDb25maWdPYmplY3QgTG9nT2JqZWN0IERCT2JqZWN0IE1haW5PYmplY3QgVGltZU9iamVjdAogICAgICAgIENvbmZpZ0l0ZW1PYmplY3QgRW5jb2RlT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX30gfHwgZGllICJHb3Qgbm8gJF8hIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCiMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMgY2FwZUlUCiMgVGhlZm9sbG93aW5nIG1ldGhvZHMgYXJlIG1lYW50IHRvIGVhc2UgdGhlIGhhbmRsaW5nIG9mIHRoZSBYTUwtTElLRSBkYXRhIGhhc2guCiMgVGhleSBkbyBub3QgcmVwbGFjZSBhbnkgaW50ZXJuYWwvb3JpZ2luYWwgbWV0aG9kcy4KCj1pdGVtIEdldEF0dHJpYnV0ZVZhbHVlc0J5S2V5KCkKCiAgICBSZXR1cm5zIHZhbHVlcyBmaXJzdCBmb3VuZCwgZm9yIGEgZ2l2ZW4gYXR0cmlidXRlIGtleS4KICAgICAgICBfR2V0QXR0cmlidXRlVmFsdWVzQnlLZXkgKAogICAgICAgICAgICBLZXlOYW1lICAgICAgID0+ICdGUUROJywKICAgICAgICAgICAgWE1MRGF0YSAgICAgICA9PiAkWE1MRGF0YVJlZiwKICAgICAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkWE1MRGVmUmVmLAogICAgICAgICk7Cj1jdXQKCnN1YiBHZXRBdHRyaWJ1dGVWYWx1ZXNCeUtleSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgbXkgQFJldEFycmF5ID0gcXd7fTsKCiAgICAjIGNoZWNrIHJlcXVpcmVkIHBhcmFtcy4uLgogICAgaWYgKAogICAgICAgICEkUGFyYW17S2V5TmFtZX0KICAgICAgICB8fAogICAgICAgICggISRQYXJhbXtYTUxEYXRhfSApIHx8CiAgICAgICAgKCAhJFBhcmFte1hNTERlZmluaXRpb259ICkgfHwKICAgICAgICAoIHJlZiAkUGFyYW17WE1MRGF0YX0gbmUgJ0hBU0gnICkgfHwKICAgICAgICAoIHJlZiAkUGFyYW17WE1MRGVmaW5pdGlvbn0gbmUgJ0FSUkFZJyApCiAgICAgICAgKQogICAgewogICAgICAgIHJldHVybiBcQFJldEFycmF5OwogICAgfQoKICAgIElURU06CiAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkUGFyYW17WE1MRGVmaW5pdGlvbn0gfSApIHsKCiAgICAgICAgQ09VTlRFUjoKICAgICAgICBmb3IgbXkgJENvdW50ZXIgKCAxIC4uICRJdGVtLT57Q291bnRNYXh9ICkgewoKICAgICAgICAgICAgIyBubyBjb250ZW50IHRoZW4gc3RvcCBsb29wLi4uCiAgICAgICAgICAgIGxhc3QgQ09VTlRFUiBpZiAhZGVmaW5lZCAkUGFyYW17WE1MRGF0YX0tPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlcl0tPntDb250ZW50fTsKCiAgICAgICAgICAgICMgZ2V0IHRoZSB2YWx1ZS4uLgogICAgICAgICAgICBteSAkVmFsdWUgPSAkU2VsZi0+e0NvbmZpZ0l0ZW1PYmplY3R9LT5YTUxWYWx1ZUxvb2t1cCgKICAgICAgICAgICAgICAgIEl0ZW0gPT4gJEl0ZW0sCiAgICAgICAgICAgICAgICBWYWx1ZSA9PiAkUGFyYW17WE1MRGF0YX0tPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlcl0tPntDb250ZW50fSB8fCAnJywKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIGlmICggKCAkSXRlbS0+e0tleX0gZXEgJFBhcmFte0tleU5hbWV9ICkgJiYgJFZhbHVlICkgewogICAgICAgICAgICAgICAgcHVzaCggQFJldEFycmF5LCAkVmFsdWUgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbmV4dCBDT1VOVEVSIGlmICEkSXRlbS0+e1N1Yn07CgogICAgICAgICAgICAjcmVjdXJzZSBpZiBzdWJzZWN0aW9uIGF2YWlsYWJsZS4uLgogICAgICAgICAgICBteSAkU3ViUmVzdWx0ID0gJFNlbGYtPkdldEF0dHJpYnV0ZVZhbHVlc0J5S2V5KAogICAgICAgICAgICAgICAgS2V5TmFtZSAgICAgICA9PiAkUGFyYW17S2V5TmFtZX0sCiAgICAgICAgICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRJdGVtLT57U3VifSwKICAgICAgICAgICAgICAgIFhNTERhdGEgICAgICAgPT4gJFBhcmFte1hNTERhdGF9LT57ICRJdGVtLT57S2V5fSB9LT5bJENvdW50ZXJdLAogICAgICAgICAgICApOwoKICAgICAgICAgICAgaWYgKCByZWYoJFN1YlJlc3VsdCkgZXEgJ0FSUkFZJyApIHsKICAgICAgICAgICAgICAgIGZvciBteSAkQXJyYXlFbGVtICggQHskU3ViUmVzdWx0fSApIHsKICAgICAgICAgICAgICAgICAgICBwdXNoKCBAUmV0QXJyYXksICRBcnJheUVsZW0gKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gXEBSZXRBcnJheTsKfQoKPWl0ZW0gR2V0QXR0cmlidXRlQ29udGVudHNCeUtleSgpCgogICAgUmV0dXJucyBjb250ZW50cyBmaXJzdCBmb3VuZCwgZm9yIGEgZ2l2ZW4gYXR0cmlidXRlIGtleS4KICAgICAgICBHZXRBdHRyaWJ1dGVDb250ZW50c0J5S2V5ICgKICAgICAgICAgICAgS2V5TmFtZSAgICAgICA9PiAnRlFETicsCiAgICAgICAgICAgIFhNTERhdGEgICAgICAgPT4gJFhNTERhdGFSZWYsCiAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJFhNTERlZlJlZiwKICAgICAgICApOwo9Y3V0CgpzdWIgR2V0QXR0cmlidXRlQ29udGVudHNCeUtleSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgbXkgQFJldEFycmF5ID0gcXd7fTsKCiAgICAjIGNoZWNrIHJlcXVpcmVkIHBhcmFtcy4uLgogICAgaWYgKAogICAgICAgICEkUGFyYW17S2V5TmFtZX0KICAgICAgICB8fAogICAgICAgICggISRQYXJhbXtYTUxEYXRhfSApIHx8CiAgICAgICAgKCAhJFBhcmFte1hNTERlZmluaXRpb259ICkgfHwKICAgICAgICAoIHJlZiAkUGFyYW17WE1MRGF0YX0gbmUgJ0hBU0gnICkgfHwKICAgICAgICAoIHJlZiAkUGFyYW17WE1MRGVmaW5pdGlvbn0gbmUgJ0FSUkFZJyApCiAgICAgICAgKQogICAgewogICAgICAgIHJldHVybiBcQFJldEFycmF5OwogICAgfQoKICAgIElURU06CiAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkUGFyYW17WE1MRGVmaW5pdGlvbn0gfSApIHsKCiAgICAgICAgQ09VTlRFUjoKICAgICAgICBmb3IgbXkgJENvdW50ZXIgKCAxIC4uICRJdGVtLT57Q291bnRNYXh9ICkgewoKICAgICAgICAgICAgIyBubyBjb250ZW50IHRoZW4gc3RvcCBsb29wLi4uCiAgICAgICAgICAgIGxhc3QgQ09VTlRFUiBpZiAhZGVmaW5lZCAkUGFyYW17WE1MRGF0YX0tPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlcl0tPntDb250ZW50fTsKCiAgICAgICAgICAgICMgZ2V0IHRoZSB2YWx1ZS4uLgogICAgICAgICAgICBteSAkQ29udGVudCA9ICRQYXJhbXtYTUxEYXRhfS0+eyAkSXRlbS0+e0tleX0gfS0+WyRDb3VudGVyXS0+e0NvbnRlbnR9IHx8ICcnOwoKICAgICAgICAgICAgaWYgKCAoICRJdGVtLT57S2V5fSBlcSAkUGFyYW17S2V5TmFtZX0gKSAmJiAkQ29udGVudCApIHsKICAgICAgICAgICAgICAgIHB1c2goIEBSZXRBcnJheSwgJENvbnRlbnQgKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbmV4dCBDT1VOVEVSIGlmICEkSXRlbS0+e1N1Yn07CgogICAgICAgICAgICAjcmVjdXJzZSBpZiBzdWJzZWN0aW9uIGF2YWlsYWJsZS4uLgogICAgICAgICAgICBteSAkU3ViUmVzdWx0ID0gJFNlbGYtPkdldEF0dHJpYnV0ZUNvbnRlbnRzQnlLZXkoCiAgICAgICAgICAgICAgICBLZXlOYW1lICAgICAgID0+ICRQYXJhbXtLZXlOYW1lfSwKICAgICAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJEl0ZW0tPntTdWJ9LAogICAgICAgICAgICAgICAgWE1MRGF0YSAgICAgICA9PiAkUGFyYW17WE1MRGF0YX0tPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlcl0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoIHJlZigkU3ViUmVzdWx0KSBlcSAnQVJSQVknICkgewogICAgICAgICAgICAgICAgZm9yIG15ICRBcnJheUVsZW0gKCBAeyRTdWJSZXN1bHR9ICkgewogICAgICAgICAgICAgICAgICAgIHB1c2goIEBSZXRBcnJheSwgJEFycmF5RWxlbSApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiBcQFJldEFycmF5Owp9Cgo9aXRlbSBHZXRBdHRyaWJ1dGVEYXRhQnlUeXBlKCkKCiAgICBSZXR1cm5zIGEgaGFzaHJlZiB3aXRoIG5hbWVzIGFuZCBhdHRyaWJ1dGUgdmFsdWVzIGZyb20gdGhlIAogICAgWE1MLURhdGFIYXNoIGZvciBhIHNwZWNpZmllZCBkYXRhIHR5cGUuCgogICAgJENvbmZpZ0l0ZW1PYmplY3QtPkdldEF0dHJpYnV0ZURhdGFCeVR5cGUoIAogICAgICAgIFhNTERhdGEgICAgICAgPT4gJFhNTERhdGEsCiAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkWE1MRGVmaW5pdGlvbiwKICAgICAgICBBdHRyaWJ1dGVUeXBlID0+ICRBdHRyaWJ1dGVUeXBlLAogICAgKTsKCj1jdXQKCnN1YiBHZXRBdHRyaWJ1dGVEYXRhQnlUeXBlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgQEtleXMgPSAoKTsKICAgIG15ICVSZXN1bHQ7CgogICAgI2dldCBhbGwga2V5cyBmb3Igc3BlY2lmaWVkIGlucHV0IHR5cGUuLi4KICAgIEBLZXlzID0gQHsKICAgICAgICAkU2VsZi0+R2V0S2V5TmFtZXNCeVR5cGUoCiAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJFBhcmFte1hNTERlZmluaXRpb259LAogICAgICAgICAgICBBdHRyaWJ1dGVUeXBlID0+ICRQYXJhbXtBdHRyaWJ1dGVUeXBlfQogICAgICAgICAgICApCiAgICAgICAgfTsKCiAgICBpZiAoICRQYXJhbXtDb250ZW50fSApIHsKICAgICAgICBmb3IgbXkgJEN1cnJLZXkgKEBLZXlzKSB7CiAgICAgICAgICAgIG15ICRDdXJyQ29udGVudCA9ICRTZWxmLT5HZXRBdHRyaWJ1dGVDb250ZW50c0J5S2V5KAogICAgICAgICAgICAgICAgS2V5TmFtZSAgICAgICA9PiAkQ3VycktleSwKICAgICAgICAgICAgICAgIFhNTERhdGEgICAgICAgPT4gJFBhcmFte1hNTERhdGF9LAogICAgICAgICAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkUGFyYW17WE1MRGVmaW5pdGlvbn0sCiAgICAgICAgICAgICk7CiAgICAgICAgICAgICRSZXN1bHR7JEN1cnJLZXl9ID0gJEN1cnJDb250ZW50OwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgewogICAgICAgIGZvciBteSAkQ3VycktleSAoQEtleXMpIHsKICAgICAgICAgICAgbXkgJEN1cnJWYWwgPSAkU2VsZi0+R2V0QXR0cmlidXRlVmFsdWVzQnlLZXkoCiAgICAgICAgICAgICAgICBLZXlOYW1lICAgICAgID0+ICRDdXJyS2V5LAogICAgICAgICAgICAgICAgWE1MRGF0YSAgICAgICA9PiAkUGFyYW17WE1MRGF0YX0sCiAgICAgICAgICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRQYXJhbXtYTUxEZWZpbml0aW9ufSwKICAgICAgICAgICAgKTsKICAgICAgICAgICAgJFJlc3VsdHskQ3VycktleX0gPSAkQ3VyclZhbDsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIFwlUmVzdWx0OwoKfQoKPWl0ZW0gR2V0S2V5TmFtZXNCeVR5cGUoKQoKICAgIFJldHVybnMgYW4gYXJyYXkgb2Yga2V5bmFtZXMgd2hpY2ggYXJlIG9mIGEgc3BlY2lmaWVkIGRhdGEgdHlwZS4KCiAgICAkQ29uZmlnSXRlbU9iamVjdC0+R2V0S2V5TmFtZXNCeVR5cGUoIAogICAgICAgIFhNTERlZmluaXRpb24gPT4gJFhNTERlZmluaXRpb24sCiAgICAgICAgQXR0cmlidXRlVHlwZSA9PiAkQXR0cmlidXRlVHlwZSwKICAgICk7Cgo9Y3V0CgpzdWIgR2V0S2V5TmFtZXNCeVR5cGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSBAS2V5cyA9ICgpOwogICAgbXkgJVJlc3VsdDsKCiAgICBpZiAoIGRlZmluZWQoICRQYXJhbXtYTUxEZWZpbml0aW9ufSApICkgewoKICAgICAgICBmb3IgbXkgJEF0dHJEZWYgKCBAeyAkUGFyYW17WE1MRGVmaW5pdGlvbn0gfSApIHsKICAgICAgICAgICAgaWYgKCAkQXR0ckRlZi0+e0lucHV0fS0+e1R5cGV9IGVxICRQYXJhbXtBdHRyaWJ1dGVUeXBlfSApIHsKICAgICAgICAgICAgICAgIHB1c2goIEBLZXlzLCAkQXR0ckRlZi0+e0tleX0gKQogICAgICAgICAgICB9CgogICAgICAgICAgICBuZXh0IGlmICEkQXR0ckRlZi0+e1N1Yn07CgogICAgICAgICAgICBteSBAU3ViUmVzdWx0ID0gQHsKICAgICAgICAgICAgICAgICRTZWxmLT5HZXRLZXlOYW1lc0J5VHlwZSgKICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVUeXBlID0+ICRQYXJhbXtBdHRyaWJ1dGVUeXBlfSwKICAgICAgICAgICAgICAgICAgICBYTUxEZWZpbml0aW9uID0+ICRBdHRyRGVmLT57U3VifSwKICAgICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgQEtleXMgPSAoIEBLZXlzLCBAU3ViUmVzdWx0ICk7CiAgICAgICAgfQoKICAgIH0KCiAgICByZXR1cm4gXEBLZXlzOwp9Cgo9aXRlbSBfR2V0S2V5TmFtZXNCeVR5cGUoKQoKICAgIFNhbWVzIGFzIEdldEtleU5hbWVzQnlUeXBlIC0gcmV0dXJucyBhbiBhcnJheSBvZiBrZXluYW1lcyB3aGljaCBhcmUgb2YgYSAKICAgIHNwZWNpZmllZCBkYXRhIHR5cGUuID0+IHVzZSBHZXRLZXlOYW1lc0J5VHlwZSBpbnN0ZWFkICEKICAgICEhISBERVBSRUNBVEVEIC0gT05MWSBGT1IgQ09NUEFUSUJJTElUWSAtIFdJTEwgQkUgUkVNT1ZFRCAhISEgCgogICAgJENvbmZpZ0l0ZW1PYmplY3QtPl9HZXRLZXlOYW1lc0J5VHlwZSggCiAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkWE1MRGVmaW5pdGlvbiwKICAgICAgICBBdHRyaWJ1dGVUeXBlID0+ICRBdHRyaWJ1dGVUeXBlLAogICAgKTsKCj1jdXQKCnN1YiBfR2V0S2V5TmFtZXNCeVR5cGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICBteSBAS2V5cyA9ICgpOwogICAgbXkgJVJlc3VsdDsKCiAgICBpZiAoIGRlZmluZWQoICRQYXJhbXtYTUxEZWZpbml0aW9ufSApICkgewoKICAgICAgICBmb3IgbXkgJEF0dHJEZWYgKCBAeyAkUGFyYW17WE1MRGVmaW5pdGlvbn0gfSApIHsKICAgICAgICAgICAgaWYgKCAkQXR0ckRlZi0+e0lucHV0fS0+e1R5cGV9IGVxICRQYXJhbXtBdHRyaWJ1dGVUeXBlfSApIHsKICAgICAgICAgICAgICAgIHB1c2goIEBLZXlzLCAkQXR0ckRlZi0+e0tleX0gKQogICAgICAgICAgICB9CgogICAgICAgICAgICBuZXh0IGlmICEkQXR0ckRlZi0+e1N1Yn07CgogICAgICAgICAgICBteSBAU3ViUmVzdWx0ID0gQHsKICAgICAgICAgICAgICAgICRTZWxmLT5fR2V0S2V5TmFtZXNCeVR5cGUoCiAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlVHlwZSA9PiAkUGFyYW17QXR0cmlidXRlVHlwZX0sCiAgICAgICAgICAgICAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkQXR0ckRlZi0+e1N1Yn0sCiAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgfTsKCiAgICAgICAgICAgIEBLZXlzID0gKCBAS2V5cywgQFN1YlJlc3VsdCApOwogICAgICAgIH0KCiAgICB9CgogICAgcmV0dXJuIFxAS2V5czsKfQoKPWl0ZW0gR2V0QXR0cmlidXRlRGVmQnlUYWdLZXkoKQoKUmV0dXJucyBjaG9vc2VuIENJIGF0dHJpYnV0ZSBkZWZpbml0aW9uLCBmb3IgYSBnaXZlbiB0YWcga2V5LgogICAgbXkgJUF0dHJEZWYgPSAkQ29uZmlnSXRlbU9iamVjdC0+R2V0QXR0cmlidXRlRGVmQnlUYWdLZXkgKAogICAgICAgIFRhZ0tleSAgICAgICAgPT4gIlsxXXsnVmVyc2lvbid9WzFdeydNb2RlbCd9WzFdIiwKICAgICAgICBYTUxEYXRhICAgICAgID0+ICRYTUxEYXRhUmVmLAogICAgICAgIFhNTERlZmluaXRpb24gPT4gJFhNTERlZlJlZiwKICAgICk7CgpyZXR1cm5zCgogICAgSW5wdXQgPT4gewogICAgICAgIFR5cGUKICAgICAgICBDbGFzcwogICAgICAgIFJlcXVpcmVkCiAgICAgICAgVHJhbnNsYXRpb24KICAgICAgICBTaXplCiAgICAgICAgTWF4TGVuZ3RoCiAgICB9CiAgICBLZXkKICAgIE5hbWUKICAgIFNlYXJjaGFibGUKICAgIENvdW50TWluCiAgICBDb3VudE1heAogICAgQ291bnREZWZhdWx0Cgo9Y3V0CgpzdWIgR2V0QXR0cmlidXRlRGVmQnlUYWdLZXkgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIHJlcXVpcmVkIHBhcmFtcy4uLgogICAgcmV0dXJuCiAgICAgICAgaWYgKAogICAgICAgICEkUGFyYW17WE1MRGF0YX0gICAgICAgfHwgcmVmKCAkUGFyYW17WE1MRGF0YX0gKSAgICAgICBuZSAnSEFTSCcgfHwKICAgICAgICAhJFBhcmFte1hNTERlZmluaXRpb259IHx8IHJlZiggJFBhcmFte1hNTERlZmluaXRpb259ICkgbmUgJ0FSUkFZJyB8fAogICAgICAgICEkUGFyYW17VGFnS2V5fQogICAgICAgICk7CgogICAgSVRFTToKICAgIGZvciBteSAkSXRlbSAoIEB7ICRQYXJhbXtYTUxEZWZpbml0aW9ufSB9ICkgewogICAgICAgIG5leHQgSVRFTSBpZiAoICEkUGFyYW17WE1MRGF0YX0tPnsgJEl0ZW0tPntLZXl9IH0gKTsKCiAgICAgICAgQ09VTlRFUjoKICAgICAgICBmb3IgbXkgJENvdW50ZXIgKCAxIC4uICRJdGVtLT57Q291bnRNYXh9ICkgewogICAgICAgICAgICBpZiAoICRQYXJhbXtYTUxEYXRhfS0+eyAkSXRlbS0+e0tleX0gfS0+WyRDb3VudGVyXS0+e1RhZ0tleX0gZXEgJFBhcmFte1RhZ0tleX0gKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gXCV7JEl0ZW19OwogICAgICAgICAgICB9CgogICAgICAgICAgICBuZXh0IENPVU5URVIgaWYgISRJdGVtLT57U3VifTsKCiAgICAgICAgICAgICMgcmVjdXJzZSBpZiBzdWJzZWN0aW9uIGF2YWlsYWJsZS4uLgogICAgICAgICAgICBteSAkU3ViUmVzdWx0ID0gJFNlbGYtPkdldEF0dHJpYnV0ZURlZkJ5VGFnS2V5KAogICAgICAgICAgICAgICAgVGFnS2V5ICAgICAgICA9PiAkUGFyYW17VGFnS2V5fSwKICAgICAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJEl0ZW0tPntTdWJ9LAogICAgICAgICAgICAgICAgWE1MRGF0YSAgICAgICA9PiAkUGFyYW17WE1MRGF0YX0tPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlcl0sCiAgICAgICAgICAgICk7CgogICAgICAgICAgICBpZiAoICRTdWJSZXN1bHQgJiYgcmVmKCRTdWJSZXN1bHQpIGVxICdIQVNIJyApIHsKICAgICAgICAgICAgICAgIHJldHVybiBcJXskU3ViUmVzdWx0fTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gKCk7Cn0KCj1pdGVtIFZlcnNpb25EYXRhVXBkYXRlKCkKCiAgICBSZXR1cm5zIGEgdGhlIGN1cnJlbnQgdmVyc2lvbiBkYXRhIGluIHRoZSBtb3N0IGN1cnJlbnQgZGVmaW5pdGlvbiBmb3JtYXQKICAgICh1c3VhbGx5IHRoaXMgaXMgZG9uZSBpbiB0aGUgZnJvbnRlbmQpLiBUaGUgdmVyc2lvbiBkYXRhIG1pZ2h0IGJlIHN0cnVjdHVyZWQKICAgIGluIGEgcHJldmlvdXMgZGVmaW5pdGlvbi4gCgogICAgJE5ld1ZlcnNpb25YTUxEYXRhID0gJENvbmZpZ0l0ZW1PYmplY3QtPlZlcnNpb25EYXRhVXBkYXRlKCAKICAgICAgICBYTUxEZWZpbml0aW9uID0+ICROZXdEZWZpbml0aW9uUmVmLT57RGVmaW5pdGlvblJlZn0sCiAgICAgICAgWE1MRGF0YSAgICAgICA9PiAkQ3VycmVudFZlcnNpb25SZWYtPntYTUxEYXRhfS0+WzFdLT57VmVyc2lvbn0tPlsxXSwKICAgICk7Cgo9Y3V0CgpzdWIgVmVyc2lvbkRhdGFVcGRhdGUgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAjIGNoZWNrIG5lZWRlZCBzdHVmZgogICAgcmV0dXJuIGlmICEkUGFyYW17WE1MRGF0YX07CiAgICByZXR1cm4gaWYgcmVmICRQYXJhbXtYTUxEYXRhfSBuZSAnSEFTSCc7CiAgICByZXR1cm4gaWYgISRQYXJhbXtYTUxEZWZpbml0aW9ufTsKICAgIHJldHVybiBpZiByZWYgJFBhcmFte1hNTERlZmluaXRpb259IG5lICdBUlJBWSc7CgogICAgbXkgJEZvcm1EYXRhID0ge307CgogICAgSVRFTToKICAgIGZvciBteSAkSXRlbSAoIEB7ICRQYXJhbXtYTUxEZWZpbml0aW9ufSB9ICkgewogICAgICAgIG15ICRDb3VudGVySW5zZXJ0ID0gMTsKCiAgICAgICAgQ09VTlRFUjoKICAgICAgICBmb3IgbXkgJENvdW50ZXIgKCAxIC4uICRJdGVtLT57Q291bnRNYXh9ICkgewoKICAgICAgICAgICAgIyBjcmVhdGUgaW5wdXRrZXkgYW5kIGFkZGtleQogICAgICAgICAgICBteSAkSW5wdXRLZXkgPSAkSXRlbS0+e0tleX0gLiAnOjonIC4gJENvdW50ZXI7CiAgICAgICAgICAgIGlmICggJFBhcmFte1ByZWZpeH0gKSB7CiAgICAgICAgICAgICAgICAkSW5wdXRLZXkgPSAkUGFyYW17UHJlZml4fSAuICc6OicgLiAkSW5wdXRLZXk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgICNnZXQgY29udGVudC4uLgogICAgICAgICAgICBteSAkQ29udGVudCA9ICRQYXJhbXtYTUxEYXRhfS0+eyAkSXRlbS0+e0tleX0gfS0+WzFdLT57Q29udGVudH0gfHwgJyc7CgogICAgICAgICAgICAjIHN0YXJ0IHJlY3Vyc2lvbiwgaWYgIlN1YiIgd2FzIGZvdW5kCiAgICAgICAgICAgIGlmICggJEl0ZW0tPntTdWJ9ICkgewogICAgICAgICAgICAgICAgbXkgJFN1YkZvcm1EYXRhID0gJFNlbGYtPlZlcnNpb25EYXRhVXBkYXRlKAogICAgICAgICAgICAgICAgICAgIFhNTERlZmluaXRpb24gPT4gJEl0ZW0tPntTdWJ9LAogICAgICAgICAgICAgICAgICAgIFhNTERhdGEgICAgICAgPT4gJFBhcmFte1hNTERhdGF9LT57ICRJdGVtLT57S2V5fSB9LT5bMV0sCiAgICAgICAgICAgICAgICAgICAgUHJlZml4ICAgICAgICA9PiAkSW5wdXRLZXksCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgJEZvcm1EYXRhLT57ICRJdGVtLT57S2V5fSB9LT5bJENvdW50ZXJJbnNlcnRdID0gJFN1YkZvcm1EYXRhOwogICAgICAgICAgICB9CgogICAgICAgICAgICAkRm9ybURhdGEtPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlckluc2VydF0tPntDb250ZW50fSA9ICRDb250ZW50OwogICAgICAgICAgICAkQ291bnRlckluc2VydCsrOwoKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRGb3JtRGF0YTsKfQoKPWl0ZW0gU2V0QXR0cmlidXRlQ29udGVudHNCeUtleSgpCgogICAgU2V0cyB0aGUgY29udGVudCBvZiB0aGUgc3BlY2lmaWVkIGtleW5hbWUgaW4gdGhlIFhNTCBkYXRhIGhhc2guIAoKICAgICRDb25maWdJdGVtT2JqZWN0LT5TZXRBdHRyaWJ1dGVDb250ZW50c0J5S2V5KCAKICAgICAgICBLZXlOYW1lICAgICAgID0+ICdMb2NhdGlvbicsCiAgICAgICAgTmV3Q29udGVudCAgICA9PiAkUmV0aXJlQ0lMb2NhdGlvbklELAogICAgICAgIFhNTERhdGEgICAgICAgPT4gJE5ld1ZlcnNpb25EYXRhLAogICAgICAgIFhNTERlZmluaXRpb24gPT4gJFVzZWRWZXJzaW9uLAogICAgKTsKCj1jdXQKCnN1YiBTZXRBdHRyaWJ1dGVDb250ZW50c0J5S2V5IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgIyBjaGVjayByZXF1aXJlZCBwYXJhbXMuLi4KICAgIGlmICgKICAgICAgICAhJFBhcmFte0tleU5hbWV9CiAgICAgICAgfHwKICAgICAgICAhbGVuZ3RoKCAkUGFyYW17TmV3Q29udGVudH0gKSB8fAogICAgICAgICggISRQYXJhbXtYTUxEYXRhfSApIHx8CiAgICAgICAgKCAhJFBhcmFte1hNTERlZmluaXRpb259ICkgfHwKICAgICAgICAoIHJlZiAkUGFyYW17WE1MRGF0YX0gbmUgJ0hBU0gnICkgfHwKICAgICAgICAoIHJlZiAkUGFyYW17WE1MRGVmaW5pdGlvbn0gbmUgJ0FSUkFZJyApCiAgICAgICAgKQogICAgewogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIElURU06CiAgICBmb3IgbXkgJEl0ZW0gKCBAeyAkUGFyYW17WE1MRGVmaW5pdGlvbn0gfSApIHsKCiAgICAgICAgQ09VTlRFUjoKICAgICAgICBmb3IgbXkgJENvdW50ZXIgKCAxIC4uICRJdGVtLT57Q291bnRNYXh9ICkgewoKICAgICAgICAgICAgIyBubyBjb250ZW50IHRoZW4gc3RvcCBsb29wLi4uCiAgICAgICAgICAgIGxhc3QgQ09VTlRFUiBpZiAhZGVmaW5lZCAkUGFyYW17WE1MRGF0YX0tPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlcl0tPntDb250ZW50fTsKCiAgICAgICAgICAgICMgZ2V0IHRoZSB2YWx1ZS4uLgogICAgICAgICAgICBpZiAoICRJdGVtLT57S2V5fSBlcSAkUGFyYW17S2V5TmFtZX0gKSB7CiAgICAgICAgICAgICAgICAkUGFyYW17WE1MRGF0YX0tPnsgJEl0ZW0tPntLZXl9IH0tPlskQ291bnRlcl0tPntDb250ZW50fSA9ICRQYXJhbXtOZXdDb250ZW50fTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgbmV4dCBDT1VOVEVSIGlmICEkSXRlbS0+e1N1Yn07CgogICAgICAgICAgICAjcmVjdXJzZSBpZiBzdWJzZWN0aW9uIGF2YWlsYWJsZS4uLgogICAgICAgICAgICBteSAkU3ViUmVzdWx0ID0gJFNlbGYtPlNldEF0dHJpYnV0ZUNvbnRlbnRzQnlLZXkoCiAgICAgICAgICAgICAgICBLZXlOYW1lICAgICAgID0+ICRQYXJhbXtLZXlOYW1lfSwKICAgICAgICAgICAgICAgIE5ld0NvbnRlbnQgICAgPT4gJFBhcmFte05ld0NvbnRlbnR9LAogICAgICAgICAgICAgICAgWE1MRGVmaW5pdGlvbiA9PiAkSXRlbS0+e1N1Yn0sCiAgICAgICAgICAgICAgICBYTUxEYXRhICAgICAgID0+ICRQYXJhbXtYTUxEYXRhfS0+eyAkSXRlbS0+e0tleX0gfS0+WyRDb3VudGVyXSwKICAgICAgICAgICAgKTsKCiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAwOwp9CgojIEVPIGNhcGVJVAojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KCj1jdXQKCj1oZWFkMSBWRVJTSU9OCgokUmV2aXNpb246IDEuMiAkICREYXRlOiAyMDExLTAzLTE0IDE0OjMzOjE1ICQKCj1jdXQK IyAtLQojIEtlcm5lbC9TeXN0ZW0vQ0lBdHRhY2htZW50U3RvcmFnZS9BdHRhY2htZW50U3RvcmFnZS5wbSAtIGxpYiBmb3IgYXR0YWNobWVudCBtYW5hZ2VtZW50CiMgQ29weXJpZ2h0IChDKSAyMDA2LTIwMTEgYy5hLnAuZS4gSVQgR21iSCwgaHR0cDovL3d3dy5jYXBlLWl0LmRlCiMKIyB3cml0dGVuL2VkaXRlZCBieToKIyAqIFRvcnN0ZW4oZG90KVRoYXUoYXQpY2FwZS1pdChkb3QpZGUKIyAqIEFubmEoZG90KUxpdHZpbm92YShhdCljYXBlLWl0KGRvdClkZQojIC0tCiMgJElkOiBBdHRhY2htZW50U3RvcmFnZS5wbSx2IDEuNyAyMDExLTA3LTI1IDA5OjIzOjQ2IHNtZWhsaWcgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDSUF0dGFjaG1lbnRTdG9yYWdlOjpBdHRhY2htZW50U3RvcmFnZTsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBNSU1FOjpCYXNlNjQ7CnVzZSBEaWdlc3Q6Ok1ENSBxdyhtZDVfaGV4KTsKdXNlIEVuY29kZSBxdyhlbmNvZGVfdXRmOCk7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjcgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpDSUF0dGFjaG1lbnRTdG9yYWdlOjpBdHRhY2htZW50U3RvcmFnZSAtIHN0ZC4gYXR0YWNobWVudCBsaWIKCj1oZWFkMSBTWU5PUFNJUwoKQWxsIGF0dGFjaG1lbnQgc3RvcmFnZSBmdW5jdGlvbnMuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBzdGQuIGF0dGFjaG1lbnQgb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpDSUF0dGFjaG1lbnRTdG9yYWdlOjpBdHRhY2htZW50U3RvcmFnZTsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ID0+ICRNYWluT2JqZWN0LAogICAgICAgIExvZ09iamVjdCA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICRBdHRhY2htZW50U3RvcmFnZU9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpDSUF0dGFjaG1lbnRTdG9yYWdlOjpBdHRhY2htZW50U3RvcmFnZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIERCT2JqZWN0ID0+ICREQk9iamVjdCwKICAgICAgICBMb2dPYmplY3QgPT4gJExvZ09iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CgogICAgIyBhbGxvY2F0ZSBuZXcgaGFzaCBmb3Igb2JqZWN0CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICNjaGVjayByZXF1aXJlZCBvYmplY3RzLi4uCiAgICBmb3IgbXkgJE9iamVjdCAoCiAgICAgICAgcXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBEQk9iamVjdCBNYWluT2JqZWN0IEVuY29kZU9iamVjdCkKICAgICAgICApCiAgICB7CiAgICAgICAgJFNlbGYtPnskT2JqZWN0fSA9ICRQYXJhbXskT2JqZWN0fSB8fCBkaWUgIkdvdCBubyAkT2JqZWN0ISI7CiAgICB9CgogICAgIyBnZXQgY29uZmlndXJlZCBzdG9yYWdlIGJhY2tlbmRzLi4uCiAgICBteSAkQmFja2VuZFJlZiA9ICRTZWxmLT57Q29uZmlnT2JqZWN0fS0+R2V0KCdBdHRhY2htZW50U3RvcmFnZTo6U3RvcmFnZUJhY2tlbmRNb2R1bGVzJyk7CiAgICBpZiAoICEoIHJlZigkQmFja2VuZFJlZikgZXEgJ0hBU0gnICkgKSB7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICNyZXRyaWV2ZSByZXF1aXJlZCBzdG9yYWdlIGJhY2tlbmQgbW9kdWxlcy4uLgogICAgbXkgJVN0b3JhZ2VCYWNrZW5kSGFzaCA9ICgpOwogICAgbXkgJFNRTCAgICAgICAgICAgICAgICA9ICJTRUxFQ1QgZGlzdGluY3Qoc3RvcmFnZV9iYWNrZW5kKSBGUk9NIGF0dGFjaG1lbnRfZGlyZWN0b3J5ICI7CiAgICBpZiAoICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKCBTUUwgPT4gJFNRTCApICkgewogICAgICAgIG15IEBEYXRhID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKTsKICAgICAgICB3aGlsZSAoIG15IEBEYXRhID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgJEJhY2tlbmRSZWYtPnsgJERhdGFbMF0gfSA9IDE7CiAgICAgICAgfQogICAgfQoKICAgICNsb2FkIHN0b3JhZ2UgYmFja2VuZHMuLi4KICAgIGZvciBteSAkQ3VycktleSAoIGtleXMoICV7JEJhY2tlbmRSZWZ9ICkgKSB7CiAgICAgICAgaWYgKCAkQmFja2VuZFJlZi0+eyRDdXJyS2V5fSAmJiAkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCRDdXJyS2V5KSApIHsKICAgICAgICAgICAgJFNlbGYtPnskQ3VycktleX0gPSAkQ3VycktleS0+bmV3KCAleyRTZWxmfSwgKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuICRTZWxmOwp9Cgo9aXRlbSBBdHRhY2htZW50U3RvcmFnZUdldERpcmVjdG9yeSgpCgpnZXQgYW4gYXR0YWNobWVudCAtIHJldHVybnMgYXR0YWNobWVudCBkaXJlY3RvcnkgZW50cnkgd2l0aG91dCBhdHRhY2htZW50IGNvbnRlbnQKCiAgICBteSAlRGF0YSA9ICRBdHRhY2htZW50U3RvcmFnZU9iamVjdC0+QXR0YWNobWVudFN0b3JhZ2VHZXREaXJlY3RvcnkoCiAgICAgICAgSUQgPT4gJElELAogICAgKTsKCj1jdXQKCnN1YiBBdHRhY2htZW50U3RvcmFnZUdldERpcmVjdG9yeSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgbXkgJURhdGEgPSAoKTsKCiAgICAjY2hlY2sgcmVxdWlyZWQgc3R1ZmYuLi4KICAgIGlmICggISRQYXJhbXtJRH0gKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgSUQhIiApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgZ2V0IGF0dGFjaG1lbnQgZGlyZWN0b3J5CiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAjZGIgcXVvdGluZy4uLgogICAgZm9yZWFjaCAocXcoIElEKSkgewogICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskX30sICdJbnRlZ2VyJyApOwogICAgfQoKICAgICNidWlsZCBzcWwuLi4KICAgIG15ICRTUUwgPSAiU0VMRUNUIGlkLCBzdG9yYWdlX2JhY2tlbmQsIGZpbGVfcGF0aCwgIiAuCiAgICAgICAgImZpbGVfbmFtZSAiIC4KICAgICAgICAiRlJPTSBhdHRhY2htZW50X2RpcmVjdG9yeSAiIC4KICAgICAgICAiV0hFUkUgaWQ9JFBhcmFte0lEfSI7CgogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICRTUUwsCiAgICApOwoKICAgIHdoaWxlICggbXkgQERhdGEgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICVEYXRhID0gKAogICAgICAgICAgICBBdHREaXJJRCAgICAgICA9PiAkRGF0YVswXSwKICAgICAgICAgICAgU3RvcmFnZUJhY2tlbmQgPT4gJERhdGFbMV0sCiAgICAgICAgICAgIEZpbGVQYXRoICAgICAgID0+ICREYXRhWzJdLAogICAgICAgICAgICBGaWxlTmFtZSAgICAgICA9PiAkRGF0YVszXSwKICAgICAgICApOwogICAgfQoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjIGdldCBhdHRhY2htZW50IGRpcmVjdG9yeSBwcmVmZXJlbmNlcwogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAjYnVpbGQgc3FsLi4uCiAgICAkU1FMID0gIlNFTEVDVCBwcmVmZXJlbmNlc19rZXksIHByZWZlcmVuY2VzX3ZhbHVlICIgLgogICAgICAgICJGUk9NIGF0dGFjaG1lbnRfZGlyX3ByZWZlcmVuY2VzICIgLgogICAgICAgICJXSEVSRSBhdHRhY2htZW50X2RpcmVjdG9yeV9pZD0kUGFyYW17SUR9IjsKCiAgICAkU2VsZi0+e0RCT2JqZWN0fS0+UHJlcGFyZSgKICAgICAgICBTUUwgPT4gJFNRTCwKICAgICk7CgogICAgbXkgJVByZWZlcmVuY2VzOwoKICAgIHdoaWxlICggbXkgQERhdGEgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgICRQcmVmZXJlbmNlc3sgJERhdGFbMF0gfSA9ICREYXRhWzFdOwogICAgfQoKICAgICNhZGQgcHJlZmVyZW5jZXMKICAgICREYXRhe1ByZWZlcmVuY2VzfSA9IFwlUHJlZmVyZW5jZXM7CgogICAgcmV0dXJuICVEYXRhOwp9Cgo9aXRlbSBBdHRhY2htZW50U3RvcmFnZUdldCgpCgpnZXQgYW4gYXR0YWNobWVudAoKICAgIG15ICVEYXRhID0gJEF0dGFjaG1lbnRTdG9yYWdlT2JqZWN0LT5BdHRhY2htZW50U3RvcmFnZUdldCgKICAgICAgICBJRCA9PiAkSUQsCiAgICApOwoKPWN1dAoKc3ViIEF0dGFjaG1lbnRTdG9yYWdlR2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSAlRGF0YSA9ICgpOwoKICAgICNjaGVjayByZXF1aXJlZCBzdHVmZi4uLgogICAgaWYgKCAhJFBhcmFte0lEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCBJRCEiICk7CiAgICAgICAgcmV0dXJuIFwlRGF0YTsKICAgIH0KCiAgICAjZ2V0IGRpcmVjdG9yeSBkYXRhLi4uCiAgICAlRGF0YSA9ICRTZWxmLT5BdHRhY2htZW50U3RvcmFnZUdldERpcmVjdG9yeSggSUQgPT4gJFBhcmFte0lEfSApOwoKICAgIGlmICggIWRlZmluZWQoICREYXRhe0F0dERpcklEfSApICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fQogICAgICAgICAgICAtPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTm8gYXR0YWNobWVudCB3aXRoIHRoaXMgSUQgZXhpc3RzISIgKTsKICAgICAgICByZXR1cm4gXCVEYXRhOwogICAgfQoKICAgICNnZXQgdGhlIGFjdHVhbCBhdHRhY2htZW50Li4uCiAgICBteSAkQXR0YWNobWVudFJlZiA9ICRTZWxmLT57ICREYXRhe1N0b3JhZ2VCYWNrZW5kfSB9LT5BdHRhY2htZW50R2V0KAogICAgICAgICVQYXJhbSwKICAgICAgICBBdHREaXJJRCA9PiAkRGF0YXtBdHREaXJJRH0sCiAgICApOwoKICAgICMkRGF0YXtDb250ZW50VHlwZX0gPSAkQXR0YWNobWVudFJlZi0+e0RhdGFUeXBlfTsKCiAgICAjIGdldCBDb250ZW50UmVmIGZvciBEQiBiYWNrZW5kCiAgICBpZiAoICRBdHRhY2htZW50UmVmLT57RGF0YVJlZn0gKSB7CiAgICAgICAgJERhdGF7Q29udGVudFJlZn0gPSAkQXR0YWNobWVudFJlZi0+e0RhdGFSZWZ9OwogICAgfQoKICAgICMgZ2V0IENvbnRlbnRSZWYgZm9yIEZTIGJhY2tlbmQKICAgIGVsc2lmICggZXhpc3RzKCAkQXR0YWNobWVudFJlZi0+e0RhdGF9ICkgKSB7CiAgICAgICAgJERhdGF7Q29udGVudFJlZn0gPSBcJEF0dGFjaG1lbnRSZWYtPntEYXRhfTsKICAgIH0KCiAgICAkQXR0YWNobWVudFJlZiA9IHVuZGVmOwogICAgJEF0dGFjaG1lbnRSZWYgPSB7fTsKCiAgICByZXR1cm4gXCVEYXRhOwp9Cgo9aXRlbSAgQXR0YWNobWVudFN0b3JhZ2VHZXRSZWFsUHJvcGVydGllcygpCgpnZXQgdGhlIGF0dGFjaG1lbnQncyBzaXplIG9uIGRpc2sgYW5kIHRoZSBtZDVzdW0KCiAgICBteSAlRGF0YSA9ICRBdHRhY2htZW50U3RvcmFnZU9iamVjdC0+QXR0YWNobWVudFN0b3JhZ2VHZXRSZWFsUHJvcGVydGllcygKICAgICAgICBBdHREaXJJRCAgICAgID0+ICRBdHREaXJJRCwKICAgICAgIFN0b3JhZ2VCYWNrZW5kID0+ICJLZXJuZWw6OlN5c3RlbTo6QXR0YWNobWVudFN0b3JhZ2VEQiIsCiAgICApOwoKPWN1dAoKc3ViIEF0dGFjaG1lbnRTdG9yYWdlR2V0UmVhbFByb3BlcnRpZXMgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIG15ICVSZWFsUHJvcGVydGllczsKCiAgICAjIGNoZWNrIHJlcXVpcmVkIHN0dWZmLi4uCiAgICBpZiAoICEkUGFyYW17QXR0RGlySUR9ICYmICEkUGFyYW17U3RvcmFnZUJhY2tlbmR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiTmVlZCBBdHREaXJJRCBhbmQgU3RvcmFnZUJhY2tlbmQhIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuICVSZWFsUHJvcGVydGllczsKICAgIH0KCiAgICAjIGdldCB0aGUgYWN0dWFsIGF0dGFjaG1lbnQgcHJvcGVydGllcy4uLgogICAgJVJlYWxQcm9wZXJ0aWVzID0gJFNlbGYtPnsgJFBhcmFte1N0b3JhZ2VCYWNrZW5kfSB9LT5BdHRhY2htZW50R2V0UmVhbFByb3BlcnRpZXMoCiAgICAgICAgQXR0RGlySUQgPT4gJFBhcmFte0F0dERpcklEfSwKICAgICk7CgogICAgcmV0dXJuICVSZWFsUHJvcGVydGllczsKfQoKPWl0ZW0gQXR0YWNobWVudFN0b3JhZ2VBZGQoKQoKY3JlYXRlIGEgbmV3IGF0dGFjaG1lbnQgZGlyZWN0b3J5IGVudHJ5IGFuZCB3cml0ZSBhdHRhY2htZW50IHRvIHRoZSBzcGVjaWZpZWQgYmFja2VuZAoKICAgIG15ICRJRCA9ICRBdHRhY2htZW50U3RvcmFnZU9iamVjdC0+QXR0YWNobWVudFN0b3JhZ2VBZGQoCiAgICAgICAgU3RvcmFnZUJhY2tlbmQgPT4gJ0tlcm5lbDo6U3lzdGVtOjpBdHRhY2htZW50U3RvcmFnZURCJywKICAgICAgICBEYXRhUmVmID0+ICRTb21lQ29udGVudFJlZmVyZW5jZSwKICAgICAgICBGaWxlTmFtZSA9PiAnU29tZUZpbGVOYW1lLnppcCcsCiAgICAgICAgVXNlcklEID0+IDEyMywKICAgICAgICBQcmVmZXJlbmNlcyAgPT4gewogICAgICAgICAgIAkgICAgICAgICAgIAkJRGF0YVR5cGUgCQkgICA9PiAndGV4dC94bWwnLAogICAgICAgICAgIAkgICAgICAgICAgIAkJU29tZUN1c3RvbVBhcmFtcyAgID0+ICd3aXRoIG91ciBvd24gdmFsdWUnLAogICAgICAgICAgIAkJCQl9CiAgICApOwoKPWN1dAoKc3ViIEF0dGFjaG1lbnRTdG9yYWdlQWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSAkSUQgICAgID0gMDsKICAgIG15ICRNRDVzdW0gPSAnJzsKCiAgICAjY2hlY2sgcmVxdWlyZWQgc3R1ZmYuLi4KICAgIGZvcmVhY2ggKHF3KERhdGFSZWYgRmlsZU5hbWUgVXNlcklEKSkgewogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoICEoICRQYXJhbXtTdG9yYWdlQmFja2VuZH0gKSApIHsKICAgICAgICAkUGFyYW17U3RvcmFnZUJhY2tlbmR9ID0KICAgICAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0F0dGFjaG1lbnRTdG9yYWdlOjpEZWZhdWx0U3RvcmFnZUJhY2tlbmRNb2R1bGUnKTsKICAgIH0KCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgKDEpIGNyZWF0ZSBhdHRhY2htZW50IGRpcmVjdG9yeSBlbnRyeS4uLgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgI2RiIHF1b3RpbmcuLi4KICAgIGZvcmVhY2ggKHF3KCBTdG9yYWdlQmFja2VuZCBGaWxlTmFtZSkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JF99ICk7CiAgICB9CiAgICBmb3JlYWNoIChxdyggVXNlcklEICkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdH0tPlF1b3RlKCAkUGFyYW17JF99LCAnSW50ZWdlcicgKTsKICAgIH0KCiAgICAjYnVpbGQgc3FsLi4uCiAgICBteSAkU1FMID0gIklOU0VSVCBJTlRPIGF0dGFjaG1lbnRfZGlyZWN0b3J5ICgiIC4KICAgICAgICAiIHN0b3JhZ2VfYmFja2VuZCwgIiAuCiAgICAgICAgIiBmaWxlX3BhdGgsIGZpbGVfbmFtZSwgICIgLgogICAgICAgICIgY3JlYXRlX3RpbWUsIGNyZWF0ZV9ieSwgY2hhbmdlX3RpbWUsIGNoYW5nZV9ieSkgIiAuCiAgICAgICAgIiBWQUxVRVMgKCIgLgogICAgICAgICIgJyRQYXJhbXtTdG9yYWdlQmFja2VuZH0nLCAiIC4KICAgICAgICAiICcnLCAnJFBhcmFte0ZpbGVOYW1lfScsICIgLgogICAgICAgICIgY3VycmVudF90aW1lc3RhbXAsICRQYXJhbXtVc2VySUR9LCBjdXJyZW50X3RpbWVzdGFtcCwgJFBhcmFte1VzZXJJRH0pIjsKCiAgICAjcnVuIFNRTC4uLgogICAgaWYgKCAkU2VsZi0+e0RCT2JqZWN0fS0+RG8oIFNRTCA9PiAkU1FMICkgKSB7CgogICAgICAgICMuLi5hbmQgZ2V0IHRoZSBJRC4uLgogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgPT4gIlNFTEVDVCBtYXgoaWQpIEZST00gYXR0YWNobWVudF9kaXJlY3RvcnkgV0hFUkUgIiAuCiAgICAgICAgICAgICAgICAiZmlsZV9uYW1lID0gJyRQYXJhbXtGaWxlTmFtZX0nIEFORCAiIC4KICAgICAgICAgICAgICAgICJzdG9yYWdlX2JhY2tlbmQgPSAnJFBhcmFte1N0b3JhZ2VCYWNrZW5kfScgQU5EICIgLgogICAgICAgICAgICAgICAgImNyZWF0ZV9ieSA9ICRQYXJhbXtVc2VySUR9IiwKICAgICAgICApOwogICAgICAgIHdoaWxlICggbXkgQFJvdyA9ICRTZWxmLT57REJPYmplY3R9LT5GZXRjaHJvd0FycmF5KCkgKSB7CiAgICAgICAgICAgICRJRCA9ICRSb3dbMF07CiAgICAgICAgfQoKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ291bGQgTk9UIGluc2VydCBhdHRhY2htZW50IGluIGF0dGFjaG1lbnQgZGlyZWN0b3J5ISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAjICgyKSBzYXZlIGF0dGFjaG1lbnQgZGlyZWN0b3J5IHByZWZlcmVuY2VzIC4uLgogICAgIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgIyBtZDVzdW0gY2FsY3VsYXRpb24KICAgICRTZWxmLT57RW5jb2RlT2JqZWN0fS0+RW5jb2RlT3V0cHV0KCAkeyAkUGFyYW17RGF0YVJlZn0gfSApOwogICAgJFBhcmFte1ByZWZlcmVuY2VzfS0+e01ENVN1bX0gPSBtZDVfaGV4KCAkeyAkUGFyYW17RGF0YVJlZn0gfSApOwoKICAgICMgc2l6ZSBjYWxjdWxhdGlvbgogICAgJFBhcmFte1ByZWZlcmVuY2VzfS0+e0ZpbGVTaXplQnl0ZXN9ID0gYnl0ZXM6Omxlbmd0aCggJHsgJFBhcmFte0RhdGFSZWZ9IH0gKTsKCiAgICBteSAkRmlsZVNpemUgPSAkUGFyYW17UHJlZmVyZW5jZXN9LT57RmlsZVNpemVCeXRlc307CiAgICBpZiAoICRGaWxlU2l6ZSA+ICggMTAyNCAqIDEwMjQgKSApIHsKICAgICAgICAkRmlsZVNpemUgPSBzcHJpbnRmICIlLjFmIE1CeXRlcyIsICggJEZpbGVTaXplIC8gKCAxMDI0ICogMTAyNCApICk7CiAgICB9CiAgICBlbHNpZiAoICRGaWxlU2l6ZSA+IDEwMjQgKSB7CiAgICAgICAgJEZpbGVTaXplID0gc3ByaW50ZiAiJS4xZiBLQnl0ZXMiLCAoICRGaWxlU2l6ZSAvIDEwMjQgKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRGaWxlU2l6ZSA9ICRGaWxlU2l6ZSAuICcgQnl0ZXMnOwogICAgfQogICAgJFBhcmFte1ByZWZlcmVuY2VzfS0+e0ZpbGVTaXplfSA9ICRGaWxlU2l6ZTsKCiAgICAjIGluc2VydCBwcmVmZXJlbmNlcwogICAgZm9yIG15ICRLZXkgKCBzb3J0IGtleXMgJXsgJFBhcmFte1ByZWZlcmVuY2VzfSB9ICkgewogICAgICAgIHJldHVybiBpZiAhJFNlbGYtPntEQk9iamVjdH0tPkRvKAogICAgICAgICAgICBTUUwgPT4gJ0lOU0VSVCBJTlRPIGF0dGFjaG1lbnRfZGlyX3ByZWZlcmVuY2VzICcKICAgICAgICAgICAgICAgIC4gJyhhdHRhY2htZW50X2RpcmVjdG9yeV9pZCwgcHJlZmVyZW5jZXNfa2V5LCBwcmVmZXJlbmNlc192YWx1ZSkgVkFMVUVTICggPywgPywgPyknLAogICAgICAgICAgICBCaW5kID0+IFsgXCRJRCwgXCRLZXksIFwkUGFyYW17UHJlZmVyZW5jZXN9LT57JEtleX0gXSwKICAgICAgICApOwoKICAgIH0KCiAgICAjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICMgKDMpIGNyZWF0ZSBhdHRhY2htZW50IHN0b3JhZ2UgZW50cnkgKCA9IHNhdmUgZmlsZSkuLi4KICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIG15ICRBdHRJRCA9ICRTZWxmLT57ICRQYXJhbXtTdG9yYWdlQmFja2VuZH0gfS0+QXR0YWNobWVudEFkZCgKICAgICAgICBBdHREaXJJRCA9PiAkSUQsCiAgICAgICAgRGF0YVJlZiAgPT4gJFBhcmFte0RhdGFSZWZ9LAogICAgKTsKCiAgICBpZiAoICEkQXR0SUQgKSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBOT1Qgc3RvcmUgYXR0YWNobWVudCBpbiBzdG9yYWdlICgkUGFyYW17U3RvcmFnZUJhY2tlbmR9KSEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIyAoNCkgdXBkYXRlIGF0dGFjaG1lbnQgZGlyZWN0b3J5IChpLmUuIGZpbGUgcGF0aCkuLi4KICAgICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICRBdHRJRCA9ICRTZWxmLT57REJPYmplY3R9LT5RdW90ZSgkQXR0SUQpOwogICAgJFNRTCAgID0gIlVQREFURSBhdHRhY2htZW50X2RpcmVjdG9yeSBTRVQgIiAuCiAgICAgICAgIiBmaWxlX3BhdGggPSAnJEF0dElEJyAiIC4KICAgICAgICAiIFdIRVJFIGlkID0gJElEIjsKCiAgICBpZiAoICRTZWxmLT57REJPYmplY3R9LT5EbyggU1FMID0+ICRTUUwgKSApIHsKICAgICAgICByZXR1cm4gJElEOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBOT1QgdXBkYXRlIGF0dGFjaG1lbnQgZGlyZWN0b3J5IChJRD0kSUQsIGZpbGVfcGF0aD0kQXR0SUQpISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9Cn0KCj1pdGVtIEF0dGFjaG1lbnRTdG9yYWdlU2VhcmNoKCkKCnJldHVybnMgYXR0YWNobWVudCBkaXJlY3RvcnkgSURzIGZvciB0aGUgZ2l2ZW4gRmlsZU5hbWUgCgogICAgbXkgQERhdGEgPSAkQXR0YWNobWVudFN0b3JhZ2VPYmplY3QtPkF0dGFjaG1lbnRTdG9yYWdlU2VhcmNoKAogICAgICAgIEZpbGVOYW1lID0+ICdTb21lRmlsZU5hbWUuemlwJywKICAgICAgICBVc2luZ1dpbGRjYXJkcyA9PiAxLCAoMSB8fCAwLCBvcHRpb25hbCkKICAgICk7Cgo9Y3V0CgpzdWIgQXR0YWNobWVudFN0b3JhZ2VTZWFyY2ggewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIG15IEBSZXN1bHQgPSAoKTsKICAgIG15ICRXSEVSRSAgPSAiKGlkID4gMCkiOwoKICAgICNjaGVjayByZXF1aXJlZCBzdHVmZi4uLgogICAgaWYgKCAhJFBhcmFte0ZpbGVOYW1lfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIk5lZWQgRmlsZU5hbWUhIgogICAgICAgICk7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgICNkYiBxdW90aW5nLi4uCiAgICBmb3JlYWNoIChxdyggRmlsZU5hbWUpKSB7CiAgICAgICAgaWYgKCBkZWZpbmVkKCAkUGFyYW17JF99ICkgJiYgKCAkUGFyYW17JF99ICkgKSB7CiAgICAgICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskX30gKTsKICAgICAgICB9CiAgICB9CgogICAgI2J1aWxkIFdIRVJFLWNsYXVzZS4uLgogICAgaWYgKCAkUGFyYW17VXNpbmdXaWxkY2FyZHN9ICkgewogICAgICAgICRXSEVSRSAuPSAiIEFORCAoZmlsZV9uYW1lIExJS0UgJyRQYXJhbXtGaWxlTmFtZX0nKSI7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkV0hFUkUgLj0gIiBBTkQgKGZpbGVfbmFtZSA9ICckUGFyYW17RmlsZU5hbWV9JykiOwogICAgfQoKICAgICNidWlsZCBzcWwuLi4KICAgIG15ICRTUUwgPSAiU0VMRUNUIGlkIEZST00gYXR0YWNobWVudF9kaXJlY3RvcnkgIiAuCiAgICAgICAgIldIRVJFICIgLiAkV0hFUkU7CgogICAgJFNlbGYtPntEQk9iamVjdH0tPlByZXBhcmUoCiAgICAgICAgU1FMID0+ICRTUUwsCiAgICApOwoKICAgIHdoaWxlICggbXkgQERhdGEgPSAkU2VsZi0+e0RCT2JqZWN0fS0+RmV0Y2hyb3dBcnJheSgpICkgewogICAgICAgIHB1c2goIEBSZXN1bHQsICREYXRhWzBdICk7CiAgICB9CgogICAgcmV0dXJuIEBSZXN1bHQ7Cn0KCjE7Cgo9YmFjawoKPWhlYWQxIFRFUk1TIEFORCBDT05ESVRJT05TCgpUaGlzIHNvZnR3YXJlIGlzIHBhcnQgb2YgdGhlIE9UUlMgcHJvamVjdCAoaHR0cDovL290cnMub3JnLykuCgpUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQp0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgoKPWN1dAoKPWhlYWQxIFZFUlNJT04KCiRSZXZpc2lvbjogMS43ICQgJERhdGU6IDIwMTEtMDctMjUgMDk6MjM6NDYgJAoKPWN1dAoK IyAtLQojIEtlcm5lbC9TeXN0ZW0vQ0lBdHRhY2htZW50U3RvcmFnZS9BdHRhY2htZW50U3RvcmFnZUZTLnBtIC0gYXR0YWNobWVudCBzdG9yYWdlIGluIGZpbGUgc3lzdGVtCiMgQ29weXJpZ2h0IChDKSAyMDA2LTIwMTEgYy5hLnAuZS4gSVQgR21iSCwgaHR0cDovL3d3dy5jYXBlLWl0LmRlCiMKIyB3cml0dGVuL2VkaXRlZCBieToKIyAqIFRvcnN0ZW4oZG90KVRoYXUoYXQpY2FwZS1pdChkb3QpZGUKIyAqIEFubmEoZG90KUxpdHZpbm92YShhdCljYXBlLWl0KGRvdClkZQojIC0tCiMgJElkOiBBdHRhY2htZW50U3RvcmFnZUZTLnBtLHYgMS43IDIwMTEtMDgtMTcgMTA6MDQ6MDkgdHRvIEV4cCAkCiMgLS0KIyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQojIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvZ3BsLnR4dC4KIyAtLQoKcGFja2FnZSBLZXJuZWw6OlN5c3RlbTo6Q0lBdHRhY2htZW50U3RvcmFnZTo6QXR0YWNobWVudFN0b3JhZ2VGUzsKCnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnVzZSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlOwoKdXNlIE1JTUU6OkJhc2U2NDsKdXNlIEZpbGU6OnN0YXQ7CnVzZSBEaWdlc3Q6Ok1ENSBxdyhtZDVfaGV4KTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNyAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpTeXN0ZW06OkNJQXR0YWNobWVudFN0b3JhZ2U6OkF0dGFjaG1lbnRTdG9yYWdlRlMgCgo9aGVhZDEgU1lOT1BTSVMKClByb3ZpZGVzIGF0dGFjaG1lbnQgaGFuZGxpbmcgZm9yIGZpbGUgc3lzdGVtIGJhY2tlbmQuCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBBdHRhY2htZW50U3RvcmFnZUZTIG9iamVjdAoKICAgIHVzZSBLZXJuZWw6OkNvbmZpZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TG9nOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpBdHRhY2htZW50OwoKICAgIG15ICRDb25maWdPYmplY3QgPSBLZXJuZWw6OkNvbmZpZy0+bmV3KCk7CiAgICBteSAkTG9nT2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkxvZy0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgKTsKICAgIG15ICRBdHRhY2htZW50T2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkNJQXR0YWNobWVudFN0b3JhZ2U6OkF0dGFjaG1lbnRTdG9yYWdlRlMtPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBEQk9iamVjdCA9PiAkREJPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ID0+ICRMb2dPYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBjb21tb24gb2JqZWN0cwogICAgZm9yZWFjaCAoIGtleXMgJVBhcmFtICkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffTsKICAgIH0KCiAgICAjIGNoZWNrIGFsbCBuZWVkZWQgb2JqZWN0cwogICAgZm9yZWFjaCAocXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCkpIHsKICAgICAgICBkaWUgIkdvdCBubyAkXyIgaWYgKCAhJFNlbGYtPnskX30gKTsKICAgIH0KCiAgICAkU2VsZi0+e0VuY29kZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoJVBhcmFtKTsKCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIEF0dGFjaG1lbnRBZGQoKQoKY3JlYXRlIGEgbmV3IHN0ZC4gYXR0YWNobWVudAoKICAgIG15ICRJRCA9ICRBdHRhY2htZW50T2JqZWN0LT5BdHRhY2htZW50QWRkKAogICAgICAgIEF0dERpcklEID0+IDEyMywKICAgICAgICBEYXRhUmVmICA9PiBcJFNvbWVDb250ZW50LAogICAgKTsKCj1jdXQKCnN1YiBBdHRhY2htZW50QWRkIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSAkcmV0VmFsID0gMTsKCiAgICAjY2hlY2sgcmVxdWlyZWQgc3R1ZmYuLi4KICAgIGZvcmVhY2ggKHF3KEF0dERpcklEIERhdGFSZWYpKSB7CiAgICAgICAgaWYgKCAhJFBhcmFteyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coIFByaW9yaXR5ID0+ICdlcnJvcicsIE1lc3NhZ2UgPT4gIk5lZWQgJF8hIiApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICNidWlsZCBhdHRhY2htZW50IGRhdGEgZmlsZSBwYXRoLi4uCiAgICAkcmV0VmFsID0gJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0hvbWUnKSAuCiAgICAgICAgJFNlbGYtPntDb25maWdPYmplY3R9LT5HZXQoJ0F0dGFjaG1lbnRTdG9yYWdlRlM6OlN0b3JhZ2VEaXJlY3RvcnknKTsKCiAgICAjY2hlY2sgaWYgZGVzdGluYXRpb24gcGF0aCBleGlzdHMuLi4KICAgIGlmICggIS1kICRyZXRWYWwgKSB7CiAgICAgICAgaWYgKCAhRmlsZTo6UGF0aDo6bWtwYXRoKCBbJHJldFZhbF0sIDAsIDA3NzUgKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgICAgICJBdHRhY2htZW50U3RvcmFnZUZTIHBhdGggZG9lcyBub3QgZXhpc3QgbmVpdGhlciBJIGNhbiBjcmVhdGUgaXQgKCRyZXRWYWwpOiAkISIKICAgICAgICAgICAgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjYnVpbGQgYXR0YWNobWVudCBkYXRhIGZpbGUgcGF0aC4uLgogICAgJHJldFZhbCAuPSAiLyIgLiAkUGFyYW17QXR0RGlySUR9IC4gIi5kYXQiOwoKICAgICN3cml0ZSB0aGUgYXR0YWNobWVudCBkYXRhIGZpbGUuLi4KICAgIGlmICggb3BlbiggbXkgJERBVEEsICI+IiwgIiRyZXRWYWwiICkgKSB7CiAgICAgICAgYmlubW9kZSgkREFUQSk7CiAgICAgICAgcHJpbnQgJERBVEEgJHsgJFBhcmFte0RhdGFSZWZ9IH07CiAgICAgICAgY2xvc2UoJERBVEEpOwogICAgICAgIHJldHVybiAkcmV0VmFsOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDYW4gTk9UIHdyaXRlIGZpbGUgKCRyZXRWYWwpOiAkISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9Cn0KCj1pdGVtIEF0dGFjaG1lbnRHZXQoKQoKcmV0dXJucyBhbiBlbnRyeSBpbiBhdHRhY2htZW50X3N0b3JhZ2UKCiAgICBteSAlRGF0YSA9ICRBdHRhY2htZW50T2JqZWN0LT5BdHRhY2htZW50KAogICAgICAgIEF0dERpcklEID0+IDEyMywgIyhzb21lIGF0dGFjaG1lbnQgZGlyZWN0b3J5IGlkKSAKICAgICAgICAjLi5PUi4uLgogICAgICAgIEZpbGVQYXRoID0+ICcvcGF0aC90by90aGUvYXR0YWNobWVudC9maWxlLmRhdCcsICAgIAogICAgKTsKCj1jdXQKCnN1YiBBdHRhY2htZW50R2V0IHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSAlRGF0YSAgICAgPSAoKTsKICAgIG15ICRGaWxlUGF0aCA9ICcnOwoKICAgICNjaGVjayByZXF1aXJlZCBzdHVmZi4uLgogICAgaWYgKCAhJFBhcmFte0F0dERpcklEfSAmJiAhJFBhcmFte0ZpbGVQYXRofSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCBBdHREaXJJRCBvciBGaWxlUGF0aCEiICk7CiAgICAgICAgcmV0dXJuIFwlRGF0YTsKICAgIH0KCiAgICBpZiAoIGRlZmluZWQoICRQYXJhbXtGaWxlUGF0aH0gKSAmJiAkUGFyYW17RmlsZVBhdGh9ICkgewogICAgICAgICRGaWxlUGF0aCA9ICRQYXJhbXtGaWxlUGF0aH07CiAgICB9CgogICAgI2NoZWNrIGlmIFBhcmFtSUQgaXMgZGVmaW5lZAogICAgaWYgKCBkZWZpbmVkKCAkUGFyYW17QXR0RGlySUR9ICkgJiYgJFBhcmFte0F0dERpcklEfSApIHsKCiAgICAgICAgI2RiIHF1b3RpbmcuLi4KICAgICAgICBmb3JlYWNoIChxdyggQXR0RGlySUQpKSB7CiAgICAgICAgICAgICRQYXJhbXskX30gPSAkU2VsZi0+e0RCT2JqZWN0fS0+UXVvdGUoICRQYXJhbXskX30sICdJbnRlZ2VyJyApOwogICAgICAgIH0KCiAgICAgICAgI2J1aWxkIHNxbC4uLgogICAgICAgIG15ICRTUUwgPSAiU0VMRUNUIGZpbGVfcGF0aCBGUk9NIGF0dGFjaG1lbnRfZGlyZWN0b3J5ICIKICAgICAgICAgICAgLiAiV0hFUkUgaWQ9JFBhcmFte0F0dERpcklEfSI7CgogICAgICAgICRTZWxmLT57REJPYmplY3R9LT5QcmVwYXJlKAogICAgICAgICAgICBTUUwgPT4gJFNRTCwKICAgICAgICApOwoKICAgICAgICB3aGlsZSAoIG15IEBEYXRhID0gJFNlbGYtPntEQk9iamVjdH0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgJEZpbGVQYXRoID0gJERhdGFbMF07CiAgICAgICAgfQogICAgfQoKICAgIGlmICggISRGaWxlUGF0aCApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSA9PgogICAgICAgICAgICAgICAgIkNvdWxkIE5PVCBmaW5kIGZpbGUgcGF0aCBmb3IgZ2l2ZW4gYXR0YWNobWVudCBkaXJlY3RvcnkgaWQgKCRQYXJhbXtBdHREaXJJRH0pISIKICAgICAgICApOwogICAgICAgIHJldHVybiBcJURhdGE7CiAgICB9CgogICAgI2dldCB0aGUgYXR0YWNobWVudCBkYXRhIGZpbGUuLi4KICAgIGlmICggb3BlbiggbXkgJERBVEEsICI8IiwgJEZpbGVQYXRoICkgKSB7CiAgICAgICAgbXkgJENvdW50ZXIgPSAwOwogICAgICAgIG15ICREYXRhICAgID0gIiI7CiAgICAgICAgYmlubW9kZSgkREFUQSk7CiAgICAgICAgd2hpbGUgKDwkREFUQT4pIHsKICAgICAgICAgICAgJERhdGEgLj0gJF87CiAgICAgICAgfQogICAgICAgIGNsb3NlKCREQVRBKTsKCiAgICAgICAgIyBzZXQgRGF0YVJlZiBwYXJhbQogICAgICAgICREYXRhe0RhdGFSZWZ9ID0gXCREYXRhOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdlcnJvcicsCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBub3Qgb3BlbiAkRmlsZVBhdGg6ICQhICEiLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuIFwlRGF0YTsKICAgIH0KCiAgICByZXR1cm4gXCVEYXRhOwp9Cgo9aXRlbSBBdHRhY2htZW50R2V0UmVhbFByb3BlcnRpZXMoKQoKcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgYXR0YWNobWVudCBpbiB0aGUgc3RvcmFnZSBiYWNrZW5kIGFuZCB0aGUgbWQ1c3VtLgoKICAgIG15IFJlYWxQcm9wZXJ0aWVzID0gQXR0YWNobWVudFN0b3JhZ2VPYmplY3QtPkF0dGFjaG1lbnRHZXRSZWFsUHJvcGVydGllcygKICAgICAgICBBdHREaXJJRCA9PiAxMjMsICMoc29tZSBhdHRhY2htZW50IGRpcmVjdG9yeSBpZCkgCiAgICApOwoKPWN1dAoKc3ViIEF0dGFjaG1lbnRHZXRSZWFsUHJvcGVydGllcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwogICAgbXkgJVJlYWxQcm9wZXJ0aWVzOwoKICAgICNjaGVjayByZXF1aXJlZCBzdHVmZi4uLgogICAgaWYgKCAhJFBhcmFte0F0dERpcklEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCBBdHREaXJJRCEiICk7CiAgICAgICAgcmV0dXJuICVSZWFsUHJvcGVydGllczsKICAgIH0KCiAgICBteSAkRGF0YSA9ICRTZWxmLT5BdHRhY2htZW50R2V0KAogICAgICAgIEF0dERpcklEID0+ICRQYXJhbXtBdHREaXJJRH0KICAgICk7CgogICAgbXkgJENvbnRlbnQgPSAkeyAkRGF0YS0+e0RhdGFSZWZ9IH07CiAgICAkU2VsZi0+e0VuY29kZU9iamVjdH0tPkVuY29kZU91dHB1dCggXCRDb250ZW50ICk7CgogICAgbXkgJFJlYWxGaWxlU2l6ZSA9IGJ5dGVzOjpsZW5ndGgoJENvbnRlbnQpOwogICAgbXkgJFJlYWxNRDVTdW0gICA9IG1kNV9oZXgoJENvbnRlbnQpOwoKICAgICRSZWFsUHJvcGVydGllc3tSZWFsRmlsZVNpemV9ID0gJFJlYWxGaWxlU2l6ZTsKICAgICRSZWFsUHJvcGVydGllc3tSZWFsTUQ1U3VtfSAgID0gJFJlYWxNRDVTdW07CgogICAgcmV0dXJuICVSZWFsUHJvcGVydGllczsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjcgJCAkRGF0ZTogMjAxMS0wOC0xNyAxMDowNDowOSAkCgo9Y3V0Cg== IyAtLQojIEtlcm5lbC9TeXN0ZW0vQ0lBdHRhY2htZW50U3RvcmFnZS9BdHRhY2htZW50U3RvcmFnZURCLnBtIC0gYXR0YWNobWVudCBzdG9yYWdlIGluIGxvY2FsIGRhdGEgYmFzZQojIENvcHlyaWdodCAoQykgMjAwNi0yMDExIGMuYS5wLmUuIElUIEdtYkgsIGh0dHA6Ly93d3cuY2FwZS1pdC5kZQojCiMgd3JpdHRlbi9lZGl0ZWQgYnk6CiMgKiBUb3JzdGVuKGRvdClUaGF1KGF0KWNhcGUtaXQoZG90KWRlCiMgKiBBbm5hKGRvdClMaXR2aW5vdmEoYXQpY2FwZS1pdChkb3QpZGUKIyAtLQojICRJZDogQXR0YWNobWVudFN0b3JhZ2VEQi5wbSx2IDEuNSAyMDExLTA3LTI1IDA5OjAxOjMzIHNtZWhsaWcgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCgpwYWNrYWdlIEtlcm5lbDo6U3lzdGVtOjpDSUF0dGFjaG1lbnRTdG9yYWdlOjpBdHRhY2htZW50U3RvcmFnZURCOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpFbmNvZGU7CnVzZSBLZXJuZWw6OlN5c3RlbTo6REI7Cgp1c2UgTUlNRTo6QmFzZTY0Owp1c2UgRGlnZXN0OjpNRDUgcXcobWQ1X2hleCk7Cgp1c2UgdmFycyBxdygkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjUgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCktlcm5lbDo6U3lzdGVtOjpDSUF0dGFjaG1lbnRTdG9yYWdlOjpBdHRhY2htZW50U3RvcmFnZURCIAoKPWhlYWQxIFNZTk9QU0lTCgpQcm92aWRlcyBhdHRhY2htZW50IGhhbmRsaW5nIGZvciBkYXRhIGJhc2UgYmFja2VuZCAtIGxvY2FsLCBPVFJTLWRhdGEgYmFzZS4KCj1oZWFkMSBQVUJMSUMgSU5URVJGQUNFCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIEF0dGFjaG1lbnRTdG9yYWdlREIgb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpDSUF0dGFjaG1lbnRTdG9yYWdlOjpBdHRhY2htZW50U3RvcmFnZTsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJExvZ09iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkREJPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBNYWluT2JqZWN0ID0+ICRNYWluT2JqZWN0LAogICAgICAgIExvZ09iamVjdCA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICRBdHRhY2htZW50T2JqZWN0ID0gS2VybmVsOjpTeXN0ZW06OkNJQXR0YWNobWVudFN0b3JhZ2U6OkF0dGFjaG1lbnRTdG9yYWdlREItPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICAgICBEQk9iamVjdCA9PiAkREJPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ID0+ICRMb2dPYmplY3QsCiAgICApOwoKPWN1dAoKc3ViIG5ldyB7CiAgICBteSAoICRUeXBlLCAlUGFyYW0gKSA9IEBfOwoKICAgICMgYWxsb2NhdGUgbmV3IGhhc2ggZm9yIG9iamVjdAogICAgbXkgJFNlbGYgPSB7fTsKICAgIGJsZXNzKCAkU2VsZiwgJFR5cGUgKTsKCiAgICAjIGdldCBjb21tb24gb2JqZWN0cwogICAgZm9yZWFjaCAoIGtleXMgJVBhcmFtICkgewogICAgICAgICRTZWxmLT57JF99ID0gJFBhcmFteyRffTsKICAgIH0KCiAgICAjIGNoZWNrIGFsbCBuZWVkZWQgb2JqZWN0cwogICAgZm9yZWFjaCAocXcoREJPYmplY3QgQ29uZmlnT2JqZWN0IExvZ09iamVjdCkpIHsKICAgICAgICBkaWUgIkdvdCBubyAkXyIgaWYgKCAhJFNlbGYtPnskX30gKTsKICAgIH0KCiAgICAkU2VsZi0+e0VuY29kZU9iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6RW5jb2RlLT5uZXcoJVBhcmFtKTsKCiAgICAkU2VsZi0+e0RCT2JqZWN0Mn0gPSBLZXJuZWw6OlN5c3RlbTo6REItPm5ldyglUGFyYW0pOwoKICAgIHJldHVybiAkU2VsZjsKfQoKPWl0ZW0gQXR0YWNobWVudEFkZCgpCgpjcmVhdGUgYSBuZXcgc3RkLiBhdHRhY2htZW50CgogICAgbXkgJElEID0gJEF0dGFjaG1lbnRPYmplY3QtPkF0dGFjaG1lbnRBZGQoCiAgICAgICAgQXR0RGlySUQgPT4gMTIzLAogICAgICAgIERhdGFSZWYgID0+IFwkU29tZUNvbnRlbnQsCiAgICApOwoKPWN1dAoKc3ViIEF0dGFjaG1lbnRBZGQgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIG15ICRJRCAgICA9IDA7CgogICAgI2NoZWNrIHJlcXVpcmVkIHN0dWZmLi4uCiAgICBmb3JlYWNoIChxdyhBdHREaXJJRCBEYXRhUmVmKSkgewogICAgICAgIGlmICggISRQYXJhbXskX30gKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkICRfISIgKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgIH0KCiAgICAjZW5jb2RlIGF0dGFjaG1lbnQgaWYgaXQncyBhIHBvc3RncmVzcWwgYmFja2VuZC4uLgogICAgaWYgKCAhJFNlbGYtPntEQk9iamVjdDJ9LT5HZXREYXRhYmFzZUZ1bmN0aW9uKCdEaXJlY3RCbG9iJykgKSB7CiAgICAgICAgJFNlbGYtPntFbmNvZGVPYmplY3R9LT5FbmNvZGVPdXRwdXQoICRQYXJhbXtEYXRhUmVmfSApOwoKICAgICAgICAjb3ZlcndyaXRlIGV4aXN0aW5nIHZhbHVlIGluc3RlYWQgb2YgdXNpbmcgYW5vdGhlciBmaWxlc2l6ZSBvZiBtZW1vcnkuLi4KICAgICAgICAkeyAkUGFyYW17RGF0YVJlZn0gfSA9IGVuY29kZV9iYXNlNjQoICR7ICRQYXJhbXtEYXRhUmVmfSB9ICk7CiAgICB9CgogICAgI2RiIHF1b3RpbmcuLi4KICAgIGZvcmVhY2ggKHF3KCBBdHREaXJJRCkpIHsKICAgICAgICAkUGFyYW17JF99ID0gJFNlbGYtPntEQk9iamVjdDJ9LT5RdW90ZSggJFBhcmFteyRffSwgJ0ludGVnZXInICk7CiAgICB9CgogICAgI2J1aWxkIHNxbC4uLgogICAgbXkgJFNRTCA9ICIiOwogICAgaWYgKCAkU2VsZi0+e0RCT2JqZWN0Mn0tPntCYWNrZW5kfS0+eydEQjo6VHlwZSd9ID1+IC9vcmFjbGUvICkgewogICAgICAgICRTUUwgPSAiSU5TRVJUIElOVE8gYXR0YWNobWVudF9zdG9yYWdlICIgLgogICAgICAgICAgICAiIChhdHRhY2htZW50X2RpcmVjdG9yeV9pZCwgZGF0YSkgIiAuCiAgICAgICAgICAgICIgVkFMVUVTICIgLgogICAgICAgICAgICAiICggJFBhcmFte0F0dERpcklEfSwgRU1QVFlfQ0xPQigpKSI7CgogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNRTCA9ICJJTlNFUlQgSU5UTyBhdHRhY2htZW50X3N0b3JhZ2UgIiAuCiAgICAgICAgICAgICIgKGF0dGFjaG1lbnRfZGlyZWN0b3J5X2lkLCBkYXRhKSAiIC4KICAgICAgICAgICAgIiBWQUxVRVMgIiAuCiAgICAgICAgICAgICIgKCAkUGFyYW17QXR0RGlySUR9LCA/KSI7CiAgICB9CgogICAgI3J1biBzcWwuLi4KICAgIG15ICREb1Jlc3VsdCA9IDA7CiAgICAkRG9SZXN1bHQgPSAkU2VsZi0+e0RCT2JqZWN0Mn0tPkRvKAogICAgICAgIFNRTCA9PiAkU1FMLCBCaW5kID0+IFsgJFBhcmFte0RhdGFSZWZ9IF0sICAgICMgQXR0RGlySUQgPT4gJFBhcmFte0F0dERpcklEfQogICAgKTsKCiAgICBpZiAoJERvUmVzdWx0KSB7CgogICAgICAgICNyZXR1cm4gSUQuLi4KICAgICAgICAkU2VsZi0+e0RCT2JqZWN0Mn0tPlByZXBhcmUoCiAgICAgICAgICAgIFNRTCA9PiAiU0VMRUNUIGlkIEZST00gYXR0YWNobWVudF9zdG9yYWdlIFdIRVJFICIgLgogICAgICAgICAgICAgICAgImF0dGFjaG1lbnRfZGlyZWN0b3J5X2lkID0gJFBhcmFte0F0dERpcklEfSIsCiAgICAgICAgKTsKICAgICAgICB3aGlsZSAoIG15IEBSb3cgPSAkU2VsZi0+e0RCT2JqZWN0Mn0tPkZldGNocm93QXJyYXkoKSApIHsKICAgICAgICAgICAgJElEID0gJFJvd1swXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICRJRDsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fQogICAgICAgICAgICAtPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiRmFpbGVkIHRvIGluc2VydCBhdHRhY2htZW50IGRhdGEhIiApOwogICAgICAgIHJldHVybjsKICAgIH0KfQoKPWl0ZW0gQXR0YWNobWVudEdldCgpCgpyZXR1cm5zIGFuIGVudHJ5IGluIGF0dGFjaG1lbnRfc3RvcmFnZQoKICAgIG15ICVEYXRhID0gJEF0dGFjaG1lbnRPYmplY3QtPkF0dGFjaG1lbnRHZXQoCiAgICAgICAgSUQgPT4gMTIzLCAjKHNvbWUgYXR0YWNobWVudCBzdG9yYWdlIGlkKSAKICAgICAgICAjIC4uLk9SLi4uCiAgICAgICAgQXR0RGlySUQgPT4gMTIzICMoc29tZSBhdHRhY2htZW50IGRpcmVjdG9yeSBpZCksCiAgICApOwo9Y3V0CgpzdWIgQXR0YWNobWVudEdldCB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOzsKICAgIG15ICVEYXRhICA9ICgpOwogICAgbXkgJFdIRVJFID0gIiI7CgogICAgI2NoZWNrIHJlcXVpcmVkIHN0dWZmLi4uCiAgICBpZiAoICEkUGFyYW17SUR9ICYmICEkUGFyYW17QXR0RGlySUR9ICkgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKCBQcmlvcml0eSA9PiAnZXJyb3InLCBNZXNzYWdlID0+ICJOZWVkIEF0dERpcklEIG9yIElEISIgKTsKICAgICAgICByZXR1cm4gXCVEYXRhOwogICAgfQoKICAgICNkYiBxdW90aW5nLi4uCiAgICBmb3JlYWNoIChxdyggQXR0RGlySUQgSUQpKSB7CiAgICAgICAgJFBhcmFteyRffSA9ICRTZWxmLT57REJPYmplY3QyfS0+UXVvdGUoICRQYXJhbXskX30sICdJbnRlZ2VyJyApOwogICAgfQoKICAgICNidWlsZCBzcWwuLi4KICAgIGlmICggZGVmaW5lZCggJFBhcmFte0F0dERpcklEfSApICYmICRQYXJhbXtBdHREaXJJRH0gKSB7CiAgICAgICAgJFdIRVJFID0gIiBXSEVSRSBhdHRhY2htZW50X2RpcmVjdG9yeV9pZCA9ICRQYXJhbXtBdHREaXJJRH0iOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFdIRVJFID0gIiBXSEVSRSBpZCA9ICRQYXJhbXtJRH0iOwogICAgfQoKICAgIG15ICRTUUwgPSAiU0VMRUNUIGlkLCBhdHRhY2htZW50X2RpcmVjdG9yeV9pZCBGUk9NIGF0dGFjaG1lbnRfc3RvcmFnZSAiIC4gJFdIRVJFOwoKICAgIGlmICggISRTZWxmLT57REJPYmplY3QyfS0+UHJlcGFyZSggU1FMID0+ICRTUUwsIEVuY29kZSA9PiBbIDAsIDAsIDEgXSApICkgewogICAgICAgIHJldHVybiBcJURhdGE7CiAgICB9CgogICAgbXkgQERhdGEgPSAkU2VsZi0+e0RCT2JqZWN0Mn0tPkZldGNocm93QXJyYXkoKTsKCiAgICBpZiAoQERhdGEpIHsKICAgICAgICBteSAkU1FMID0gIlNFTEVDVCBkYXRhIEZST00gYXR0YWNobWVudF9zdG9yYWdlICIgLiAkV0hFUkU7CgogICAgICAgIGlmICggISRTZWxmLT57REJPYmplY3QyfS0+UHJlcGFyZSggU1FMID0+ICRTUUwgKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkZhaWxlZCB0byBwcmVwYXJlIFNRTCBmb3IgRmV0Y2hyb3dBcnJheSEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybiBcJURhdGE7CiAgICAgICAgfQoKICAgICAgICBteSBAQXR0YWNoRGF0YSA9ICRTZWxmLT57REJPYmplY3QyfS0+RmV0Y2hyb3dBcnJheSgpOwoKICAgICAgICBteSAkQXR0YWNoRGF0YVJlZiA9IFwkQXR0YWNoRGF0YVswXTsKCiAgICAgICAgaWYgKCAhJEF0dGFjaERhdGFSZWYgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJGYWlsZWQgdG8gRmV0Y2hyb3dBcnJheSEiCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybiBcJURhdGE7CiAgICAgICAgfQoKICAgICAgICAjZGVjb2RlIGF0dGFjaG1lbnQgaWYgaXQncyBhIHBvc3RncmVzcWwgYmFja2VuZC4uLgogICAgICAgIGlmICggISRTZWxmLT57REJPYmplY3QyfS0+R2V0RGF0YWJhc2VGdW5jdGlvbignRGlyZWN0QmxvYicpICkgewogICAgICAgICAgICAkeyRBdHRhY2hEYXRhUmVmfSA9IGRlY29kZV9iYXNlNjQoICR7JEF0dGFjaERhdGFSZWZ9ICk7CiAgICAgICAgfQoKICAgICAgICAlRGF0YSA9ICgKICAgICAgICAgICAgSUQgICAgICAgPT4gJERhdGFbMF0sCiAgICAgICAgICAgIEF0dERpcklEID0+ICREYXRhWzFdLAoKICAgICAgICAgICAgI0RhdGFUeXBlID0+ICREYXRhWzJdLAogICAgICAgICAgICBEYXRhUmVmID0+ICRBdHRhY2hEYXRhUmVmLAogICAgICAgICk7CgogICAgICAgICRBdHRhY2hEYXRhUmVmID0gdW5kZWY7CiAgICB9CgogICAgcmV0dXJuIFwlRGF0YTsKfQoKPWl0ZW0gQXR0YWNobWVudEdldFJlYWxQcm9wZXJ0aWVzKCkKCnJldHVybnMgdGhlIHNpemUgb2YgdGhlIGF0dGFjaG1lbnQgaW4gdGhlIHN0b3JhZ2UgYmFja2VuZCBhbmQgdGhlIG1kNXN1bS4KCiAgICBteSBSZWFsUHJvcGVydGllcyA9IEF0dGFjaG1lbnRTdG9yYWdlT2JqZWN0LT5BdHRhY2htZW50R2V0UmVhbFByb3BlcnRpZXMoCiAgICAgICAgQXR0RGlySUQgPT4gMTIzLCAjKHNvbWUgYXR0YWNobWVudCBkaXJlY3RvcnkgaWQpIAogICAgICAgICMuLk9SLi4uCgkJSUQgPT4gMTIzLCAjKHNvbWUgYXR0YWNobWVudCBzdG9yYWdlIGlkKSAgICAKICAgICk7Cgo9Y3V0CgpzdWIgQXR0YWNobWVudEdldFJlYWxQcm9wZXJ0aWVzIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgbXkgJVJlYWxQcm9wZXJ0aWVzOwoKICAgICNjaGVjayByZXF1aXJlZCBzdHVmZi4uLgogICAgaWYgKCAhJFBhcmFte0F0dERpcklEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZyggUHJpb3JpdHkgPT4gJ2Vycm9yJywgTWVzc2FnZSA9PiAiTmVlZCBBdHREaXJJRCEiICk7CiAgICAgICAgcmV0dXJuICVSZWFsUHJvcGVydGllczsKICAgIH0KCiAgICBteSAkRGF0YSA9ICRTZWxmLT5BdHRhY2htZW50R2V0KAogICAgICAgIEF0dERpcklEID0+ICRQYXJhbXtBdHREaXJJRH0KICAgICk7CgogICAgbXkgJENvbnRlbnQgPSAkeyAkRGF0YS0+e0RhdGFSZWZ9IH07CiAgICAkU2VsZi0+e0VuY29kZU9iamVjdH0tPkVuY29kZU91dHB1dChcJENvbnRlbnQpOwoKICAgIG15ICRSZWFsRmlsZVNpemUgPSBieXRlczo6bGVuZ3RoKCRDb250ZW50KTsKICAgIG15ICRSZWFsTUQ1U3VtICAgPSBtZDVfaGV4KCAkQ29udGVudCApOwoKICAgICRSZWFsUHJvcGVydGllc3tSZWFsRmlsZVNpemV9ID0gJFJlYWxGaWxlU2l6ZTsKICAgICRSZWFsUHJvcGVydGllc3tSZWFsTUQ1U3VtfSAgID0gJFJlYWxNRDVTdW07CgogICAgcmV0dXJuICVSZWFsUHJvcGVydGllczsKfQoKMTsKCj1iYWNrCgo9aGVhZDEgVEVSTVMgQU5EIENPTkRJVElPTlMKClRoaXMgc29mdHdhcmUgaXMgcGFydCBvZiB0aGUgT1RSUyBwcm9qZWN0IChodHRwOi8vb3Rycy5vcmcvKS4KClRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCnRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEdQTCkuIElmIHlvdQpkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgoKJFJldmlzaW9uOiAxLjUgJCAkRGF0ZTogMjAxMS0wNy0yNSAwOTowMTozMyAkCgo9Y3V0Cg== Ly8gLS0KLy8gQ29yZS5BZ2VudC5DSUNsYXNzU2VhcmNoLmpzIC0gcHJvdmlkZXMgdGhlIHNwZWNpYWwgbW9kdWxlIGZ1bmN0aW9ucyBmb3IgdGhlIENJIGNsYXNzZXMgc2VhcmNoCi8vIENvcHlyaWdodCAoQykgMjAwNi0yMDExIGMuYS5wLmUuIElUIEdtYkgsIGh0dHA6Ly93d3cuY2FwZS1pdC5kZQovLwovLyB3cml0dGVuL2VkaXRlZCBieToKLy8gICBGcmFuayhkb3QpT2JlcmVuZGVyKGF0KWNhcGUoZGFzaClpdChkb3QpZGUKLy8gICBNYXJ0aW4oZG90KUJhbHphcmVrKGF0KWNhcGUoZGFzaClpdChkb3QpZGUKLy8KLy8gLS0KLy8gJElkOiBDb3JlLkFnZW50LkNJQ2xhc3NTZWFyY2guanMsdiAxLjMgMjAxMS0xMC0yOCAxMjo0Njo0NCBtYWJhIEV4cCAkCi8vIC0tCi8vIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCi8vIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKLy8gZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KLy8gLS0KCiJ1c2Ugc3RyaWN0IjsKCnZhciBDb3JlID0gQ29yZSB8fCB7fTsKQ29yZS5BZ2VudCA9IENvcmUuQWdlbnQgfHwge307CgovKioKICogQG5hbWVzcGFjZQogKiBAZXhwb3J0cyBUYXJnZXROUyBhcyBDb3JlLkFnZW50LkNJQ2xhc3NTZWFyY2gKICogQGRlc2NyaXB0aW9uCiAqICAgICAgVGhpcyBuYW1lc3BhY2UgY29udGFpbnMgdGhlIHNwZWNpYWwgbW9kdWxlIGZ1bmN0aW9ucyBmb3IgdGhlIENJIGNsYXNzZXMgc2VhcmNoLgogKi8KQ29yZS5BZ2VudC5DSUNsYXNzU2VhcmNoID0gKGZ1bmN0aW9uIChUYXJnZXROUykgewoKICAgLyoqCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkRWxlbWVudCBUaGUgalF1ZXJ5IG9iamVjdCBvZiB0aGUgaW5wdXQgZmllbGQgd2l0aCBhdXRvY29tcGxldGUKICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gQWN0aXZlQXV0b0NvbXBsZXRlIFNldCB0byBmYWxzZSwgaWYgYXV0b2NvbXBsZXRlIHNob3VsZCBvbmx5IGJlIHN0YXJ0ZWQgYnkgY2xpY2sgb24gYSBidXR0b24gbmV4dCB0byB0aGUgaW5wdXQgZmllbGQKICAgICAqIEByZXR1cm4gbm90aGluZwogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBzcGVjaWFsIG1vZHVsZSBmdW5jdGlvbnMKICAgICAqLwogICAgVGFyZ2V0TlMuSW5pdCA9IGZ1bmN0aW9uICgkRWxlbWVudCwgQ2xhc3NJRCAsQWN0aXZlQXV0b0NvbXBsZXRlKSB7CiAgICAgICAgdmFyIEZpZWxkSUQgPSAkRWxlbWVudC5hdHRyKCdpZCcpLnJlcGxhY2UoLzovZywgJ1xcOicpOwoKICAgICAgICBpZiAodHlwZW9mIEFjdGl2ZUF1dG9Db21wbGV0ZSA9PT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgQWN0aXZlQXV0b0NvbXBsZXRlID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIEFjdGl2ZUF1dG9Db21wbGV0ZSA9ICEhQWN0aXZlQXV0b0NvbXBsZXRlOwogICAgICAgIH0KCiAgICAgICAgaWYgKGlzSlF1ZXJ5T2JqZWN0KCRFbGVtZW50KSkgewogICAgICAgICAgICAkRWxlbWVudC5hdXRvY29tcGxldGUoewogICAgICAgICAgICAgICAgbWluTGVuZ3RoOiBBY3RpdmVBdXRvQ29tcGxldGUgPyBDb3JlLkNvbmZpZy5HZXQoJ0F1dG9jb21wbGV0ZS5NaW5RdWVyeUxlbmd0aCcpIDogNTAwLAogICAgICAgICAgICAgICAgZGVsYXk6IENvcmUuQ29uZmlnLkdldCgnQXV0b2NvbXBsZXRlLlF1ZXJ5RGVsYXknKSwKICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKFJlcXVlc3QsIFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIFVSTCA9IENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKSwgRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRDSUNsYXNzU2VhcmNoJywKICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NJRDogQ2xhc3NJRCwKICAgICAgICAgICAgICAgICAgICAgICAgVGVybTogUmVxdWVzdC50ZXJtLAogICAgICAgICAgICAgICAgICAgICAgICBNYXhSZXN1bHRzOiBDb3JlLkNvbmZpZy5HZXQoJ0F1dG9jb21wbGV0ZS5NYXhSZXN1bHRzRGlzcGxheWVkJykKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoVVJMLCBEYXRhLCBmdW5jdGlvbiAoUmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBEYXRhID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChSZXN1bHQsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMuQ0lDbGFzc1ZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLkNJQ2xhc3NLZXkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2UoRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc2VsZWN0OiBmdW5jdGlvbiAoRXZlbnQsIFVJKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIENJQ2xhc3NLZXkgPSBVSS5pdGVtLnZhbHVlOwoKICAgICAgICAgICAgICAgICAgICAkRWxlbWVudC52YWwoVUkuaXRlbS5sYWJlbCk7CgogICAgICAgICAgICAgICAgICAgIC8vIHNldCBoaWRkZW4gZmllbGQgU2VsZWN0ZWRRdWV1ZQogICAgICAgICAgICAgICAgICAgICQoJyMnICsgRmllbGRJRCArICdTZWxlY3RlZCcpLnZhbChDSUNsYXNzS2V5KTsKCiAgICAgICAgICAgICAgICAgICAgRXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgaWYgKCFBY3RpdmVBdXRvQ29tcGxldGUpIHsKICAgICAgICAgICAgICAgICRFbGVtZW50LmFmdGVyKCc8YnV0dG9uIGlkPSInICsgJEVsZW1lbnQuYXR0cignaWQnKSArICdTZWFyY2giIHR5cGU9ImJ1dHRvbiI+JyArIENvcmUuQ29uZmlnLkdldCgnQXV0b2NvbXBsZXRlLlNlYXJjaEJ1dHRvblRleHQnKSArICc8L2J1dHRvbj4nKTsKICAgICAgICAgICAgICAgICQoJyMnICsgRmllbGRJRCArICdTZWFyY2gnKS5jbGljayhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgJEVsZW1lbnQuYXV0b2NvbXBsZXRlKCJvcHRpb24iLCAibWluTGVuZ3RoIiwgMCk7CiAgICAgICAgICAgICAgICAgICAgJEVsZW1lbnQuYXV0b2NvbXBsZXRlKCJzZWFyY2giKTsKICAgICAgICAgICAgICAgICAgICAkRWxlbWVudC5hdXRvY29tcGxldGUoIm9wdGlvbiIsICJtaW5MZW5ndGgiLCA1MDApOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIE9uIHVubG9hZCByZW1vdmUgb2xkIHNlbGVjdGVkIGRhdGEuIElmIHRoZSBwYWdlIGlzIHJlbG9hZGVkICh3aXRoIEY1KSB0aGlzIGRhdGEgc3RheXMgaW4gdGhlIGZpZWxkIGFuZCBpbnZva2VzIGFuIGFqYXggcmVxdWVzdCBvdGhlcndpc2UKICAgICAgICAkKHdpbmRvdykuYmluZCgndW5sb2FkJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICQoJyMnICsgRmllbGRJRCArICdTZWxlY3RlZCcpLnZhbCgnJyk7CiAgICAgICAgfSk7CiAgICB9OwoKICAgIHJldHVybiBUYXJnZXROUzsKfShDb3JlLkFnZW50LkNJQ2xhc3NTZWFyY2ggfHwge30pKTsK Ly8gLS0KLy8gQ29yZS5BZ2VudC5TZXJ2aWNlU2VhcmNoLmpzIC0gcHJvdmlkZXMgdGhlIHNwZWNpYWwgbW9kdWxlIGZ1bmN0aW9ucyBmb3IgdGhlIHNlcnZpY2Ugc2VhcmNoCi8vIENvcHlyaWdodCAoQykgMjAwNi0yMDExIGMuYS5wLmUuIElUIEdtYkgsIGh0dHA6Ly93d3cuY2FwZS1pdC5kZQovLwovLyB3cml0dGVuL2VkaXRlZCBieToKLy8gICBGcmFuayhkb3QpT2JlcmVuZGVyKGF0KWNhcGUoZGFzaClpdChkb3QpZGUKLy8gICBNYXJ0aW4oZG90KUJhbHphcmVrKGF0KWNhcGUoZGFzaClpdChkb3QpZGUKLy8KLy8gLS0KLy8gJElkOiBDb3JlLkFnZW50LlNlcnZpY2VTZWFyY2guanMsdiAxLjMgMjAxMS0xMC0yOCAxMjo0Njo0NCBtYWJhIEV4cCAkCi8vIC0tCi8vIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCi8vIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKLy8gZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KLy8gLS0KCiJ1c2Ugc3RyaWN0IjsKCnZhciBDb3JlID0gQ29yZSB8fCB7fTsKQ29yZS5BZ2VudCA9IENvcmUuQWdlbnQgfHwge307CgovKioKICogQG5hbWVzcGFjZQogKiBAZXhwb3J0cyBUYXJnZXROUyBhcyBDb3JlLkFnZW50LlNlcnZpY2VTZWFyY2gKICogQGRlc2NyaXB0aW9uCiAqICAgICAgVGhpcyBuYW1lc3BhY2UgY29udGFpbnMgdGhlIHNwZWNpYWwgbW9kdWxlIGZ1bmN0aW9ucyBmb3IgdGhlIHNlcnZpY2Ugc2VhcmNoLgogKi8KQ29yZS5BZ2VudC5TZXJ2aWNlU2VhcmNoID0gKGZ1bmN0aW9uIChUYXJnZXROUykgewoKICAgLyoqCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkRWxlbWVudCBUaGUgalF1ZXJ5IG9iamVjdCBvZiB0aGUgaW5wdXQgZmllbGQgd2l0aCBhdXRvY29tcGxldGUKICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gQWN0aXZlQXV0b0NvbXBsZXRlIFNldCB0byBmYWxzZSwgaWYgYXV0b2NvbXBsZXRlIHNob3VsZCBvbmx5IGJlIHN0YXJ0ZWQgYnkgY2xpY2sgb24gYSBidXR0b24gbmV4dCB0byB0aGUgaW5wdXQgZmllbGQKICAgICAqIEByZXR1cm4gbm90aGluZwogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBzcGVjaWFsIG1vZHVsZSBmdW5jdGlvbnMKICAgICAqLwogICAgVGFyZ2V0TlMuSW5pdCA9IGZ1bmN0aW9uICgkRWxlbWVudCwgQWN0aXZlQXV0b0NvbXBsZXRlKSB7CiAgICAgICAgdmFyIEZpZWxkSUQgPSAkRWxlbWVudC5hdHRyKCdpZCcpLnJlcGxhY2UoLzovZywgJ1xcOicpOwoKICAgICAgICBpZiAodHlwZW9mIEFjdGl2ZUF1dG9Db21wbGV0ZSA9PT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgQWN0aXZlQXV0b0NvbXBsZXRlID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIEFjdGl2ZUF1dG9Db21wbGV0ZSA9ICEhQWN0aXZlQXV0b0NvbXBsZXRlOwogICAgICAgIH0KCiAgICAgICAgaWYgKGlzSlF1ZXJ5T2JqZWN0KCRFbGVtZW50KSkgewogICAgICAgICAgICAkRWxlbWVudC5hdXRvY29tcGxldGUoewogICAgICAgICAgICAgICAgbWluTGVuZ3RoOiBBY3RpdmVBdXRvQ29tcGxldGUgPyBDb3JlLkNvbmZpZy5HZXQoJ0F1dG9jb21wbGV0ZS5NaW5RdWVyeUxlbmd0aCcpIDogNTAwLAogICAgICAgICAgICAgICAgZGVsYXk6IENvcmUuQ29uZmlnLkdldCgnQXV0b2NvbXBsZXRlLlF1ZXJ5RGVsYXknKSwKICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKFJlcXVlc3QsIFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIFVSTCA9IENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKSwgRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRTZXJ2aWNlU2VhcmNoJywKICAgICAgICAgICAgICAgICAgICAgICAgVGVybTogUmVxdWVzdC50ZXJtLAogICAgICAgICAgICAgICAgICAgICAgICBNYXhSZXN1bHRzOiBDb3JlLkNvbmZpZy5HZXQoJ0F1dG9jb21wbGV0ZS5NYXhSZXN1bHRzRGlzcGxheWVkJykKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoVVJMLCBEYXRhLCBmdW5jdGlvbiAoUmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBEYXRhID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChSZXN1bHQsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMuU2VydmljZVZhbHVlICsgIiAoIiArIHRoaXMuU2VydmljZUtleSArICIpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5TZXJ2aWNlVmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2UoRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc2VsZWN0OiBmdW5jdGlvbiAoRXZlbnQsIFVJKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIFNlcnZpY2VLZXkgPSBVSS5pdGVtLmxhYmVsLnJlcGxhY2UoLy4qXCgoLiopXCkkLywgJyQxJyk7CgogICAgICAgICAgICAgICAgICAgICRFbGVtZW50LnZhbChVSS5pdGVtLnZhbHVlKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGhpZGRlbiBmaWVsZCBTZWxlY3RlZFNlcnZpY2UKICAgICAgICAgICAgICAgICAgICAkKCcjJyArIEZpZWxkSUQgKyAnU2VsZWN0ZWQnKS52YWwoU2VydmljZUtleSk7CgogICAgICAgICAgICAgICAgICAgIEV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlmICghQWN0aXZlQXV0b0NvbXBsZXRlKSB7CiAgICAgICAgICAgICAgICAkRWxlbWVudC5hZnRlcignPGJ1dHRvbiBpZD0iJyArICRFbGVtZW50LmF0dHIoJ2lkJykgKyAnU2VhcmNoIiB0eXBlPSJidXR0b24iPicgKyBDb3JlLkNvbmZpZy5HZXQoJ0F1dG9jb21wbGV0ZS5TZWFyY2hCdXR0b25UZXh0JykgKyAnPC9idXR0b24+Jyk7CiAgICAgICAgICAgICAgICAkKCcjJyArIEZpZWxkSUQgKyAnU2VhcmNoJykuY2xpY2soZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICRFbGVtZW50LmF1dG9jb21wbGV0ZSgib3B0aW9uIiwgIm1pbkxlbmd0aCIsIDApOwogICAgICAgICAgICAgICAgICAgICRFbGVtZW50LmF1dG9jb21wbGV0ZSgic2VhcmNoIik7CiAgICAgICAgICAgICAgICAgICAgJEVsZW1lbnQuYXV0b2NvbXBsZXRlKCJvcHRpb24iLCAibWluTGVuZ3RoIiwgNTAwKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBPbiB1bmxvYWQgcmVtb3ZlIG9sZCBzZWxlY3RlZCBkYXRhLiBJZiB0aGUgcGFnZSBpcyByZWxvYWRlZCAod2l0aCBGNSkgdGhpcyBkYXRhIHN0YXlzIGluIHRoZSBmaWVsZCBhbmQgaW52b2tlcyBhbiBhamF4IHJlcXVlc3Qgb3RoZXJ3aXNlCiAgICAgICAgJCh3aW5kb3cpLmJpbmQoJ3VubG9hZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAkKCcjJyArIEZpZWxkSUQgKyAnU2VsZWN0ZWQnKS52YWwoJycpOwogICAgICAgIH0pOwogICAgfTsKCiAgICByZXR1cm4gVGFyZ2V0TlM7Cn0oQ29yZS5BZ2VudC5TZXJ2aWNlU2VhcmNoIHx8IHt9KSk7Cg== Ly8gLS0KLy8gQ29yZS5BZ2VudC5RdWV1ZVNlYXJjaC5qcyAtIHByb3ZpZGVzIHRoZSBzcGVjaWFsIG1vZHVsZSBmdW5jdGlvbnMgZm9yIHRoZSBxdWV1ZSBzZWFyY2gKLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTEgYy5hLnAuZS4gSVQgR21iSCwgaHR0cDovL3d3dy5jYXBlLWl0LmRlCi8vCi8vIHdyaXR0ZW4vZWRpdGVkIGJ5OgovLyAgIEZyYW5rKGRvdClPYmVyZW5kZXIoYXQpY2FwZShkYXNoKWl0KGRvdClkZQovLyAgIE1hcnRpbihkb3QpQmFsemFyZWsoYXQpY2FwZShkYXNoKWl0KGRvdClkZQovLwovLyAtLQovLyAkSWQ6IENvcmUuQWdlbnQuUXVldWVTZWFyY2guanMsdiAxLjMgMjAxMS0xMC0yOCAxMjo0Njo0NCBtYWJhIEV4cCAkCi8vIC0tCi8vIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCi8vIHRoZSBlbmNsb3NlZCBmaWxlIENPUFlJTkcgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24gKEFHUEwpLiBJZiB5b3UKLy8gZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9hZ3BsLnR4dC4KLy8gLS0KCiJ1c2Ugc3RyaWN0IjsKCnZhciBDb3JlID0gQ29yZSB8fCB7fTsKQ29yZS5BZ2VudCA9IENvcmUuQWdlbnQgfHwge307CgovKioKICogQG5hbWVzcGFjZQogKiBAZXhwb3J0cyBUYXJnZXROUyBhcyBDb3JlLkFnZW50LlF1ZXVlU2VhcmNoCiAqIEBkZXNjcmlwdGlvbgogKiAgICAgIFRoaXMgbmFtZXNwYWNlIGNvbnRhaW5zIHRoZSBzcGVjaWFsIG1vZHVsZSBmdW5jdGlvbnMgZm9yIHRoZSBxdWV1ZSBzZWFyY2guCiAqLwpDb3JlLkFnZW50LlF1ZXVlU2VhcmNoID0gKGZ1bmN0aW9uIChUYXJnZXROUykgewoKICAgLyoqCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkRWxlbWVudCBUaGUgalF1ZXJ5IG9iamVjdCBvZiB0aGUgaW5wdXQgZmllbGQgd2l0aCBhdXRvY29tcGxldGUKICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gQWN0aXZlQXV0b0NvbXBsZXRlIFNldCB0byBmYWxzZSwgaWYgYXV0b2NvbXBsZXRlIHNob3VsZCBvbmx5IGJlIHN0YXJ0ZWQgYnkgY2xpY2sgb24gYSBidXR0b24gbmV4dCB0byB0aGUgaW5wdXQgZmllbGQKICAgICAqIEByZXR1cm4gbm90aGluZwogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBzcGVjaWFsIG1vZHVsZSBmdW5jdGlvbnMKICAgICAqLwogICAgVGFyZ2V0TlMuSW5pdCA9IGZ1bmN0aW9uICgkRWxlbWVudCwgQWN0aXZlQXV0b0NvbXBsZXRlKSB7CiAgICAgICAgdmFyIEZpZWxkSUQgPSAkRWxlbWVudC5hdHRyKCdpZCcpLnJlcGxhY2UoLzovZywgJ1xcOicpOwoKICAgICAgICBpZiAodHlwZW9mIEFjdGl2ZUF1dG9Db21wbGV0ZSA9PT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgQWN0aXZlQXV0b0NvbXBsZXRlID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIEFjdGl2ZUF1dG9Db21wbGV0ZSA9ICEhQWN0aXZlQXV0b0NvbXBsZXRlOwogICAgICAgIH0KCiAgICAgICAgaWYgKGlzSlF1ZXJ5T2JqZWN0KCRFbGVtZW50KSkgewogICAgICAgICAgICAkRWxlbWVudC5hdXRvY29tcGxldGUoewogICAgICAgICAgICAgICAgbWluTGVuZ3RoOiBBY3RpdmVBdXRvQ29tcGxldGUgPyBDb3JlLkNvbmZpZy5HZXQoJ0F1dG9jb21wbGV0ZS5NaW5RdWVyeUxlbmd0aCcpIDogNTAwLAogICAgICAgICAgICAgICAgZGVsYXk6IENvcmUuQ29uZmlnLkdldCgnQXV0b2NvbXBsZXRlLlF1ZXJ5RGVsYXknKSwKICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKFJlcXVlc3QsIFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIFVSTCA9IENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKSwgRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRRdWV1ZVNlYXJjaCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFRlcm06IFJlcXVlc3QudGVybSwKICAgICAgICAgICAgICAgICAgICAgICAgTWF4UmVzdWx0czogQ29yZS5Db25maWcuR2V0KCdBdXRvY29tcGxldGUuTWF4UmVzdWx0c0Rpc3BsYXllZCcpCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKFVSTCwgRGF0YSwgZnVuY3Rpb24gKFJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgRGF0YSA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2goUmVzdWx0LCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLlF1ZXVlVmFsdWUgKyAiICgiICsgdGhpcy5RdWV1ZUtleSArICIpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5RdWV1ZVZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlKERhdGEpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHNlbGVjdDogZnVuY3Rpb24gKEV2ZW50LCBVSSkgewogICAgICAgICAgICAgICAgICAgIHZhciBRdWV1ZUtleSA9IFVJLml0ZW0ubGFiZWwucmVwbGFjZSgvLipcKCguKilcKSQvLCAnJDEnKTsKCiAgICAgICAgICAgICAgICAgICAgJEVsZW1lbnQudmFsKFVJLml0ZW0udmFsdWUpOwoKICAgICAgICAgICAgICAgICAgICAvLyBzZXQgaGlkZGVuIGZpZWxkIFNlbGVjdGVkUXVldWUKICAgICAgICAgICAgICAgICAgICAkKCcjJyArIEZpZWxkSUQgKyAnU2VsZWN0ZWQnKS52YWwoUXVldWVLZXkpOwoKICAgICAgICAgICAgICAgICAgICBFdmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAoIUFjdGl2ZUF1dG9Db21wbGV0ZSkgewogICAgICAgICAgICAgICAgJEVsZW1lbnQuYWZ0ZXIoJzxidXR0b24gaWQ9IicgKyAkRWxlbWVudC5hdHRyKCdpZCcpICsgJ1NlYXJjaCIgdHlwZT0iYnV0dG9uIj4nICsgQ29yZS5Db25maWcuR2V0KCdBdXRvY29tcGxldGUuU2VhcmNoQnV0dG9uVGV4dCcpICsgJzwvYnV0dG9uPicpOwogICAgICAgICAgICAgICAgJCgnIycgKyBGaWVsZElEICsgJ1NlYXJjaCcpLmNsaWNrKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAkRWxlbWVudC5hdXRvY29tcGxldGUoIm9wdGlvbiIsICJtaW5MZW5ndGgiLCAwKTsKICAgICAgICAgICAgICAgICAgICAkRWxlbWVudC5hdXRvY29tcGxldGUoInNlYXJjaCIpOwogICAgICAgICAgICAgICAgICAgICRFbGVtZW50LmF1dG9jb21wbGV0ZSgib3B0aW9uIiwgIm1pbkxlbmd0aCIsIDUwMCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gT24gdW5sb2FkIHJlbW92ZSBvbGQgc2VsZWN0ZWQgZGF0YS4gSWYgdGhlIHBhZ2UgaXMgcmVsb2FkZWQgKHdpdGggRjUpIHRoaXMgZGF0YSBzdGF5cyBpbiB0aGUgZmllbGQgYW5kIGludm9rZXMgYW4gYWpheCByZXF1ZXN0IG90aGVyd2lzZQogICAgICAgICQod2luZG93KS5iaW5kKCd1bmxvYWQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAkKCcjJyArIEZpZWxkSUQgKyAnU2VsZWN0ZWQnKS52YWwoJycpOwogICAgICAgIH0pOwogICAgfTsKCiAgICByZXR1cm4gVGFyZ2V0TlM7Cn0oQ29yZS5BZ2VudC5RdWV1ZVNlYXJjaCB8fCB7fSkpOwo= Ly8gLS0KLy8gQ29yZS5BZ2VudC5DdXN0b21lckNvbXBhbnlTZWFyY2guanMgLSBwcm92aWRlcyB0aGUgc3BlY2lhbCBtb2R1bGUgZnVuY3Rpb25zIGZvciB0aGUgY3VzdG9tZXIgY29tcGFueSBzZWFyY2gKLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTEgYy5hLnAuZS4gSVQgR21iSCwgaHR0cDovL3d3dy5jYXBlLWl0LmRlCi8vCi8vIHdyaXR0ZW4vZWRpdGVkIGJ5OgovLyAgIEZyYW5rKGRvdClPYmVyZW5kZXIoYXQpY2FwZShkYXNoKWl0KGRvdClkZQovLyAgIE1hcnRpbihkb3QpQmFsemFyZWsoYXQpY2FwZShkYXNoKWl0KGRvdClkZQovLwovLyAtLQovLyAkSWQ6IENvcmUuQWdlbnQuQ3VzdG9tZXJDb21wYW55U2VhcmNoLmpzLHYgMS4zIDIwMTEtMTAtMjggMTI6NDY6NDQgbWFiYSBFeHAgJAovLyAtLQovLyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQovLyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91Ci8vIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCi8vIC0tCgoidXNlIHN0cmljdCI7Cgp2YXIgQ29yZSA9IENvcmUgfHwge307CkNvcmUuQWdlbnQgPSBDb3JlLkFnZW50IHx8IHt9OwoKLyoqCiAqIEBuYW1lc3BhY2UKICogQGV4cG9ydHMgVGFyZ2V0TlMgYXMgQ29yZS5BZ2VudC5DdXN0b21lckNvbXBhbnlTZWFyY2gKICogQGRlc2NyaXB0aW9uCiAqICAgICAgVGhpcyBuYW1lc3BhY2UgY29udGFpbnMgdGhlIHNwZWNpYWwgbW9kdWxlIGZ1bmN0aW9ucyBmb3IgdGhlIGN1c3RvbWVyIGNvbXBhbnkgc2VhcmNoLgogKi8KQ29yZS5BZ2VudC5DdXN0b21lckNvbXBhbnlTZWFyY2ggPSAoZnVuY3Rpb24gKFRhcmdldE5TKSB7CiAgIC8qKgogICAgICogQGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0ge2pRdWVyeU9iamVjdH0gJEVsZW1lbnQgVGhlIGpRdWVyeSBvYmplY3Qgb2YgdGhlIGlucHV0IGZpZWxkIHdpdGggYXV0b2NvbXBsZXRlCiAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IEFjdGl2ZUF1dG9Db21wbGV0ZSBTZXQgdG8gZmFsc2UsIGlmIGF1dG9jb21wbGV0ZSBzaG91bGQgb25seSBiZSBzdGFydGVkIGJ5IGNsaWNrIG9uIGEgYnV0dG9uIG5leHQgdG8gdGhlIGlucHV0IGZpZWxkCiAgICAgKiBAcmV0dXJuIG5vdGhpbmcKICAgICAqICAgICAgVGhpcyBmdW5jdGlvbiBpbml0aWFsaXplcyB0aGUgc3BlY2lhbCBtb2R1bGUgZnVuY3Rpb25zCiAgICAgKi8KICAgIFRhcmdldE5TLkluaXQgPSBmdW5jdGlvbiAoJEVsZW1lbnQsIEFjdGl2ZUF1dG9Db21wbGV0ZSkgewogICAgICAgIHZhciBGaWVsZElEID0gJEVsZW1lbnQuYXR0cignaWQnKS5yZXBsYWNlKC86L2csICdcXDonKTsKCiAgICAgICAgaWYgKHR5cGVvZiBBY3RpdmVBdXRvQ29tcGxldGUgPT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgIEFjdGl2ZUF1dG9Db21wbGV0ZSA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBBY3RpdmVBdXRvQ29tcGxldGUgPSAhIUFjdGl2ZUF1dG9Db21wbGV0ZTsKICAgICAgICB9CgogICAgICAgIGlmIChpc0pRdWVyeU9iamVjdCgkRWxlbWVudCkpIHsKICAgICAgICAgICAgJEVsZW1lbnQuYXV0b2NvbXBsZXRlKHsKICAgICAgICAgICAgICAgIG1pbkxlbmd0aDogQWN0aXZlQXV0b0NvbXBsZXRlID8gQ29yZS5Db25maWcuR2V0KCdBdXRvY29tcGxldGUuTWluUXVlcnlMZW5ndGgnKSA6IDUwMCwKICAgICAgICAgICAgICAgIGRlbGF5OiBDb3JlLkNvbmZpZy5HZXQoJ0F1dG9jb21wbGV0ZS5RdWVyeURlbGF5JyksCiAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uIChSZXF1ZXN0LCBSZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBVUkwgPSBDb3JlLkNvbmZpZy5HZXQoJ0Jhc2VsaW5rJyksIERhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50Q3VzdG9tZXJDb21wYW55U2VhcmNoJywKICAgICAgICAgICAgICAgICAgICAgICAgVGVybTogUmVxdWVzdC50ZXJtLAogICAgICAgICAgICAgICAgICAgICAgICBNYXhSZXN1bHRzOiBDb3JlLkNvbmZpZy5HZXQoJ0F1dG9jb21wbGV0ZS5NYXhSZXN1bHRzRGlzcGxheWVkJykKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoVVJMLCBEYXRhLCBmdW5jdGlvbiAoUmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBEYXRhID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChSZXN1bHQsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMuQ3VzdG9tZXJDb21wYW55VmFsdWUgKyAiICgiICsgdGhpcy5DdXN0b21lckNvbXBhbnlLZXkgKyAiKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuQ3VzdG9tZXJDb21wYW55VmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2UoRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc2VsZWN0OiBmdW5jdGlvbiAoRXZlbnQsIFVJKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIEN1c3RvbWVyQ29tcGFueUtleSA9IFVJLml0ZW0ubGFiZWwucmVwbGFjZSgvLipcKCguKilcKSQvLCAnJDEnKTsKCiAgICAgICAgICAgICAgICAgICAgJEVsZW1lbnQudmFsKFVJLml0ZW0udmFsdWUpOwoKICAgICAgICAgICAgICAgICAgICAvLyBzZXQgaGlkZGVuIGZpZWxkIFNlbGVjdGVkU2VydmljZQogICAgICAgICAgICAgICAgICAgICQoJyMnICsgRmllbGRJRCArICdTZWxlY3RlZCcpLnZhbChDdXN0b21lckNvbXBhbnlLZXkpOwoKICAgICAgICAgICAgICAgICAgICBFdmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CgogICAgICAgICAgICBpZiAoIUFjdGl2ZUF1dG9Db21wbGV0ZSkgewogICAgICAgICAgICAgICAgJEVsZW1lbnQuYWZ0ZXIoJzxidXR0b24gaWQ9IicgKyAkRWxlbWVudC5hdHRyKCdpZCcpICsgJ1NlYXJjaCIgdHlwZT0iYnV0dG9uIj4nICsgQ29yZS5Db25maWcuR2V0KCdBdXRvY29tcGxldGUuU2VhcmNoQnV0dG9uVGV4dCcpICsgJzwvYnV0dG9uPicpOwogICAgICAgICAgICAgICAgJCgnIycgKyBGaWVsZElEICsgJ1NlYXJjaCcpLmNsaWNrKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAkRWxlbWVudC5hdXRvY29tcGxldGUoIm9wdGlvbiIsICJtaW5MZW5ndGgiLCAwKTsKICAgICAgICAgICAgICAgICAgICAkRWxlbWVudC5hdXRvY29tcGxldGUoInNlYXJjaCIpOwogICAgICAgICAgICAgICAgICAgICRFbGVtZW50LmF1dG9jb21wbGV0ZSgib3B0aW9uIiwgIm1pbkxlbmd0aCIsIDUwMCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gT24gdW5sb2FkIHJlbW92ZSBvbGQgc2VsZWN0ZWQgZGF0YS4gSWYgdGhlIHBhZ2UgaXMgcmVsb2FkZWQgKHdpdGggRjUpIHRoaXMgZGF0YSBzdGF5cyBpbiB0aGUgZmllbGQgYW5kIGludm9rZXMgYW4gYWpheCByZXF1ZXN0IG90aGVyd2lzZQogICAgICAgICQod2luZG93KS5iaW5kKCd1bmxvYWQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgJCgnIycgKyBGaWVsZElEICsgJ1NlbGVjdGVkJykudmFsKCcnKTsKICAgICAgICB9KTsKICAgIH07CgogICAgcmV0dXJuIFRhcmdldE5TOwp9KENvcmUuQWdlbnQuQ3VzdG9tZXJDb21wYW55U2VhcmNoIHx8IHt9KSk7Cg== Ly8gLS0KLy8gQ29yZS5BZ2VudC5DdXN0b21lclVzZXJDb21wYW55U2VhcmNoLmpzIC0gcHJvdmlkZXMgdGhlIHNwZWNpYWwgbW9kdWxlIGZ1bmN0aW9ucyBmb3IgdGhlIGN1c3RvbWVyIHVzZXIgY29tcGFueSBzZWFyY2gKLy8gQ29weXJpZ2h0IChDKSAyMDA2LTIwMTEgYy5hLnAuZS4gSVQgR21iSCwgaHR0cDovL3d3dy5jYXBlLWl0LmRlCi8vCi8vIHdyaXR0ZW4vZWRpdGVkIGJ5OgovLyAgIEZyYW5rKGRvdClPYmVyZW5kZXIoYXQpY2FwZShkYXNoKWl0KGRvdClkZQovLyAgIE1hcnRpbihkb3QpQmFsemFyZWsoYXQpY2FwZShkYXNoKWl0KGRvdClkZQovLwovLyAtLQovLyAkSWQ6IENvcmUuQWdlbnQuQ3VzdG9tZXJVc2VyQ29tcGFueVNlYXJjaC5qcyx2IDEuMyAyMDExLTEwLTI4IDEyOjQ2OjQ0IG1hYmEgRXhwICQKLy8gLS0KLy8gVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKLy8gdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQovLyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgovLyAtLQoKInVzZSBzdHJpY3QiOwoKdmFyIENvcmUgPSBDb3JlIHx8IHt9OwpDb3JlLkFnZW50ID0gQ29yZS5BZ2VudCB8fCB7fTsKCi8qKgogKiBAbmFtZXNwYWNlCiAqIEBleHBvcnRzIFRhcmdldE5TIGFzIENvcmUuQWdlbnQuQ3VzdG9tZXJVc2VyQ29tcGFueVNlYXJjaAogKiBAZGVzY3JpcHRpb24KICogICAgICBUaGlzIG5hbWVzcGFjZSBjb250YWlucyB0aGUgc3BlY2lhbCBtb2R1bGUgZnVuY3Rpb25zIGZvciB0aGUgY3VzdG9tZXIgdXNlciBjb21wYW55IHNlYXJjaC4KICovCkNvcmUuQWdlbnQuQ3VzdG9tZXJVc2VyQ29tcGFueVNlYXJjaCA9IChmdW5jdGlvbiAoVGFyZ2V0TlMpIHsKICAgLyoqCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7alF1ZXJ5T2JqZWN0fSAkRWxlbWVudCBUaGUgalF1ZXJ5IG9iamVjdCBvZiB0aGUgaW5wdXQgZmllbGQgd2l0aCBhdXRvY29tcGxldGUKICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gQWN0aXZlQXV0b0NvbXBsZXRlIFNldCB0byBmYWxzZSwgaWYgYXV0b2NvbXBsZXRlIHNob3VsZCBvbmx5IGJlIHN0YXJ0ZWQgYnkgY2xpY2sgb24gYSBidXR0b24gbmV4dCB0byB0aGUgaW5wdXQgZmllbGQKICAgICAqIEByZXR1cm4gbm90aGluZwogICAgICogICAgICBUaGlzIGZ1bmN0aW9uIGluaXRpYWxpemVzIHRoZSBzcGVjaWFsIG1vZHVsZSBmdW5jdGlvbnMKICAgICAqLwogICAgVGFyZ2V0TlMuSW5pdCA9IGZ1bmN0aW9uICgkRWxlbWVudCwgQWN0aXZlQXV0b0NvbXBsZXRlKSB7CiAgICAgICAgdmFyIEZpZWxkSUQgPSAkRWxlbWVudC5hdHRyKCdpZCcpLnJlcGxhY2UoLzovZywgJ1xcOicpOwoKICAgICAgICBpZiAodHlwZW9mIEFjdGl2ZUF1dG9Db21wbGV0ZSA9PT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgQWN0aXZlQXV0b0NvbXBsZXRlID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIEFjdGl2ZUF1dG9Db21wbGV0ZSA9ICEhQWN0aXZlQXV0b0NvbXBsZXRlOwogICAgICAgIH0KCiAgICAgICAgaWYgKGlzSlF1ZXJ5T2JqZWN0KCRFbGVtZW50KSkgewogICAgICAgICAgICAkRWxlbWVudC5hdXRvY29tcGxldGUoewogICAgICAgICAgICAgICAgbWluTGVuZ3RoOiBBY3RpdmVBdXRvQ29tcGxldGUgPyBDb3JlLkNvbmZpZy5HZXQoJ0F1dG9jb21wbGV0ZS5NaW5RdWVyeUxlbmd0aCcpIDogNTAwLAogICAgICAgICAgICAgICAgZGVsYXk6IENvcmUuQ29uZmlnLkdldCgnQXV0b2NvbXBsZXRlLlF1ZXJ5RGVsYXknKSwKICAgICAgICAgICAgICAgIHNvdXJjZTogZnVuY3Rpb24gKFJlcXVlc3QsIFJlc3BvbnNlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIFVSTCA9IENvcmUuQ29uZmlnLkdldCgnQmFzZWxpbmsnKSwgRGF0YSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgQWN0aW9uOiAnQWdlbnRDdXN0b21lclVzZXJDb21wYW55U2VhcmNoJywKICAgICAgICAgICAgICAgICAgICAgICAgVGVybTogUmVxdWVzdC50ZXJtLAogICAgICAgICAgICAgICAgICAgICAgICBNYXhSZXN1bHRzOiBDb3JlLkNvbmZpZy5HZXQoJ0F1dG9jb21wbGV0ZS5NYXhSZXN1bHRzRGlzcGxheWVkJykKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIENvcmUuQUpBWC5GdW5jdGlvbkNhbGwoVVJMLCBEYXRhLCBmdW5jdGlvbiAoUmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBEYXRhID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICQuZWFjaChSZXN1bHQsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGEucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRoaXMuQ3VzdG9tZXJVc2VyQ29tcGFueVZhbHVlICsgIiAoIiArIHRoaXMuQ3VzdG9tZXJVc2VyQ29tcGFueUtleSArICIpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5DdXN0b21lclVzZXJDb21wYW55VmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgUmVzcG9uc2UoRGF0YSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgc2VsZWN0OiBmdW5jdGlvbiAoRXZlbnQsIFVJKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIEN1c3RvbWVyVXNlckNvbXBhbnlLZXkgPSBVSS5pdGVtLmxhYmVsLnJlcGxhY2UoLy4qXCgoLiopXCkkLywgJyQxJyk7CgogICAgICAgICAgICAgICAgICAgICRFbGVtZW50LnZhbChVSS5pdGVtLnZhbHVlKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGhpZGRlbiBmaWVsZCBTZWxlY3RlZFNlcnZpY2UKICAgICAgICAgICAgICAgICAgICAkKCcjJyArIEZpZWxkSUQgKyAnU2VsZWN0ZWQnKS52YWwoQ3VzdG9tZXJVc2VyQ29tcGFueUtleSk7CgogICAgICAgICAgICAgICAgICAgIEV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlmICghQWN0aXZlQXV0b0NvbXBsZXRlKSB7CiAgICAgICAgICAgICAgICAkRWxlbWVudC5hZnRlcignPGJ1dHRvbiBpZD0iJyArICRFbGVtZW50LmF0dHIoJ2lkJykgKyAnU2VhcmNoIiB0eXBlPSJidXR0b24iPicgKyBDb3JlLkNvbmZpZy5HZXQoJ0F1dG9jb21wbGV0ZS5TZWFyY2hCdXR0b25UZXh0JykgKyAnPC9idXR0b24+Jyk7CiAgICAgICAgICAgICAgICAkKCcjJyArIEZpZWxkSUQgKyAnU2VhcmNoJykuY2xpY2soZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICRFbGVtZW50LmF1dG9jb21wbGV0ZSgib3B0aW9uIiwgIm1pbkxlbmd0aCIsIDApOwogICAgICAgICAgICAgICAgICAgICRFbGVtZW50LmF1dG9jb21wbGV0ZSgic2VhcmNoIik7CiAgICAgICAgICAgICAgICAgICAgJEVsZW1lbnQuYXV0b2NvbXBsZXRlKCJvcHRpb24iLCAibWluTGVuZ3RoIiwgNTAwKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBPbiB1bmxvYWQgcmVtb3ZlIG9sZCBzZWxlY3RlZCBkYXRhLiBJZiB0aGUgcGFnZSBpcyByZWxvYWRlZCAod2l0aCBGNSkgdGhpcyBkYXRhIHN0YXlzIGluIHRoZSBmaWVsZCBhbmQgaW52b2tlcyBhbiBhamF4IHJlcXVlc3Qgb3RoZXJ3aXNlCiAgICAgICAgJCh3aW5kb3cpLmJpbmQoJ3VubG9hZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAkKCcjJyArIEZpZWxkSUQgKyAnU2VsZWN0ZWQnKS52YWwoJycpOwogICAgICAgIH0pOwogICAgfTsKCiAgICByZXR1cm4gVGFyZ2V0TlM7Cn0oQ29yZS5BZ2VudC5DdXN0b21lclVzZXJDb21wYW55U2VhcmNoIHx8IHt9KSk7Cg== Ly8gLS0KLy8gQ29yZS5BZ2VudC5Vc2VyU2VhcmNoLmpzIC0gcHJvdmlkZXMgdGhlIHNwZWNpYWwgbW9kdWxlIGZ1bmN0aW9ucyBmb3IgdGhlIHVzZXIgc2VhcmNoCi8vIGJhc2VkIG9uIElUU00uQWdlbnQuVXNlclNlYXJjaC5qczogQ29weXJpZ2h0IChDKSAyMDAxLTIwMTAgT1RSUyBBRywgaHR0cDovL290cnMub3JnLwovLyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMSBjLmEucC5lLiBJVCBHbWJILCBodHRwOi8vd3d3LmNhcGUtaXQuZGUKLy8KLy8gd3JpdHRlbi9lZGl0ZWQgYnk6Ci8vICAgRnJhbmsoZG90KU9iZXJlbmRlcihhdCljYXBlKGRhc2gpaXQoZG90KWRlCi8vICAgTWFydGluKGRvdClCYWx6YXJlayhhdCljYXBlKGRhc2gpaXQoZG90KWRlCi8vCi8vIC0tCi8vICRJZDogQ29yZS5BZ2VudC5Vc2VyU2VhcmNoLmpzLHYgMS4zIDIwMTEtMTAtMjggMTI6NDY6NDQgbWFiYSBFeHAgJAovLyAtLQovLyBUaGlzIHNvZnR3YXJlIGNvbWVzIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWS4gRm9yIGRldGFpbHMsIHNlZQovLyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChBR1BMKS4gSWYgeW91Ci8vIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCi8vIC0tCgoidXNlIHN0cmljdCI7Cgp2YXIgQ29yZSA9IENvcmUgfHwge307CkNvcmUuQWdlbnQgPSBDb3JlLkFnZW50IHx8IHt9OwoKLyoqCiAqIEBuYW1lc3BhY2UKICogQGV4cG9ydHMgVGFyZ2V0TlMgYXMgQ29yZS5BZ2VudC5Vc2VyU2VhcmNoCiAqIEBkZXNjcmlwdGlvbgogKiAgICAgIFRoaXMgbmFtZXNwYWNlIGNvbnRhaW5zIHRoZSBzcGVjaWFsIG1vZHVsZSBmdW5jdGlvbnMgZm9yIHRoZSB1c2VyIHNlYXJjaC4KICovCkNvcmUuQWdlbnQuVXNlclNlYXJjaCA9IChmdW5jdGlvbiAoVGFyZ2V0TlMpIHsKCiAgICAvKioKICAgICAqIEBmdW5jdGlvbgogICAgICogQHBhcmFtIHtqUXVlcnlPYmplY3R9ICRFbGVtZW50IFRoZSBqUXVlcnkgb2JqZWN0IG9mIHRoZSBpbnB1dCBmaWVsZCB3aXRoIGF1dG9jb21wbGV0ZQogICAgICogQHBhcmFtIHtCb29sZWFufSBBY3RpdmVBdXRvQ29tcGxldGUgU2V0IHRvIGZhbHNlLCBpZiBhdXRvY29tcGxldGUgc2hvdWxkIG9ubHkgYmUgc3RhcnRlZCBieSBjbGljayBvbiBhIGJ1dHRvbiBuZXh0IHRvIHRoZSBpbnB1dCBmaWVsZAogICAgICogQHJldHVybiBub3RoaW5nCiAgICAgKiAgICAgIFRoaXMgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgdGhlIHNwZWNpYWwgbW9kdWxlIGZ1bmN0aW9ucwogICAgICovCiAgICBUYXJnZXROUy5Jbml0ID0gZnVuY3Rpb24gKCRFbGVtZW50LCBBY3RpdmVBdXRvQ29tcGxldGUpIHsKICAgICAgICB2YXIgRmllbGRJRCA9ICRFbGVtZW50LmF0dHIoJ2lkJykucmVwbGFjZSgvOi9nLCAnXFw6Jyk7CgogICAgICAgIGlmICh0eXBlb2YgQWN0aXZlQXV0b0NvbXBsZXRlID09PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICBBY3RpdmVBdXRvQ29tcGxldGUgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgQWN0aXZlQXV0b0NvbXBsZXRlID0gISFBY3RpdmVBdXRvQ29tcGxldGU7CiAgICAgICAgfQoKICAgICAgICBpZiAoaXNKUXVlcnlPYmplY3QoJEVsZW1lbnQpKSB7CiAgICAgICAgICAgICRFbGVtZW50LmF1dG9jb21wbGV0ZSh7CiAgICAgICAgICAgICAgICBtaW5MZW5ndGg6IEFjdGl2ZUF1dG9Db21wbGV0ZSA/IENvcmUuQ29uZmlnLkdldCgnVXNlckF1dG9jb21wbGV0ZS5NaW5RdWVyeUxlbmd0aCcpIDogNTAwLAogICAgICAgICAgICAgICAgZGVsYXk6IENvcmUuQ29uZmlnLkdldCgnVXNlckF1dG9jb21wbGV0ZS5RdWVyeURlbGF5JyksCiAgICAgICAgICAgICAgICBzb3VyY2U6IGZ1bmN0aW9uIChSZXF1ZXN0LCBSZXNwb25zZSkgewogICAgICAgICAgICAgICAgICAgIHZhciBVUkwgPSBDb3JlLkNvbmZpZy5HZXQoJ0Jhc2VsaW5rJyksIERhdGEgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIEFjdGlvbjogJ0FnZW50VXNlclNlYXJjaCcsCiAgICAgICAgICAgICAgICAgICAgICAgIFRlcm06IFJlcXVlc3QudGVybSArICcqJywKICAgICAgICAgICAgICAgICAgICAgICAgTWF4UmVzdWx0czogQ29yZS5Db25maWcuR2V0KCdVc2VyQXV0b2NvbXBsZXRlLk1heFJlc3VsdHNEaXNwbGF5ZWQnKSwKICAgICAgICAgICAgICAgICAgICAgICAgR3JvdXBzIDogQ29yZS5Db25maWcuR2V0KCdVc2VyQXV0b2NvbXBsZXRlLkdyb3VwcycpIHx8ICcnCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBDb3JlLkFKQVguRnVuY3Rpb25DYWxsKFVSTCwgRGF0YSwgZnVuY3Rpb24gKFJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgRGF0YSA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAkLmVhY2goUmVzdWx0LCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiB0aGlzLlVzZXJWYWx1ZSArICIgKCIgKyB0aGlzLlVzZXJLZXkgKyAiKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuVXNlclZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIFJlc3BvbnNlKERhdGEpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHNlbGVjdDogZnVuY3Rpb24gKEV2ZW50LCBVSSkgewogICAgICAgICAgICAgICAgICAgIHZhciBVc2VyS2V5ID0gVUkuaXRlbS5sYWJlbC5yZXBsYWNlKC8uKlwoKC4qKVwpJC8sICckMScpOwogICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICRFbGVtZW50LnZhbChVSS5pdGVtLnZhbHVlKTsKCiAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGhpZGRlbiBmaWVsZCBTZWxlY3RlZEN1c3RvbWVyVXNlcgogICAgICAgICAgICAgICAgICAgICQoJyMnICsgRmllbGRJRCArICdTZWxlY3RlZCcpLnZhbChVc2VyS2V5KTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIGlmICghQWN0aXZlQXV0b0NvbXBsZXRlKSB7CiAgICAgICAgICAgICAgICAkRWxlbWVudC5hZnRlcignPGJ1dHRvbiBpZD0iJyArICRFbGVtZW50LmF0dHIoJ2lkJykgKyAnU2VhcmNoIiB0eXBlPSJidXR0b24iPicgKyBDb3JlLkNvbmZpZy5HZXQoJ1VzZXJBdXRvY29tcGxldGUuU2VhcmNoQnV0dG9uVGV4dCcpICsgJzwvYnV0dG9uPicpOwogICAgICAgICAgICAgICAgJCgnIycgKyBGaWVsZElEICsgJ1NlYXJjaCcpLmNsaWNrKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAkRWxlbWVudC5hdXRvY29tcGxldGUoIm9wdGlvbiIsICJtaW5MZW5ndGgiLCAwKTsKICAgICAgICAgICAgICAgICAgICAkRWxlbWVudC5hdXRvY29tcGxldGUoInNlYXJjaCIpOwogICAgICAgICAgICAgICAgICAgICRFbGVtZW50LmF1dG9jb21wbGV0ZSgib3B0aW9uIiwgIm1pbkxlbmd0aCIsIDUwMCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gT24gdW5sb2FkIHJlbW92ZSBvbGQgc2VsZWN0ZWQgZGF0YS4gSWYgdGhlIHBhZ2UgaXMgcmVsb2FkZWQgKHdpdGggRjUpIHRoaXMgZGF0YSBzdGF5cyBpbiB0aGUgZmllbGQgYW5kIGludm9rZXMgYW4gYWpheCByZXF1ZXN0IG90aGVyd2lzZQogICAgICAgICQod2luZG93KS5iaW5kKCd1bmxvYWQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgJCgnIycgKyBGaWVsZElEICsgJ1NlbGVjdGVkJykudmFsKCcnKTsKICAgICAgICB9KTsKICAgIH07CgogICAgcmV0dXJuIFRhcmdldE5TOwp9KENvcmUuQWdlbnQuVXNlclNlYXJjaCB8fCB7fSkpOwo= PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSIgPz4KPG90cnNfY29uZmlnIHZlcnNpb249IjEuMCIgaW5pdD0iQ29uZmlnIj4KCiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ0lBdHRyaWJ1dGVDb2xsZWN0aW9uOjpBZ2VudEJhY2tlbmRNYXBwaW5nIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJlbiI+RGVmaW5lcyB2YWx1ZXMgc2hvd24gZm9yIGFnZW50IHVzZXIgYXR0cmlidXRlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0IFdlcnRlIGRpZSBmdWVyIEF0dHJpYnV0IEFnZW50ZW5udXR6ZXIgYW5nZXplaWd0IHdlcmRlbi48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNLUNJQXR0cmlidXRlQ29sbGVjdGlvbjwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPlVzZXI8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTAwMCI+VXNlckZpcnN0bmFtZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTAwMSI+VXNlckxhc3RuYW1lPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIyMDAwIj5Vc2VyTG9naW48L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjMwMDAiPlVzZXJFbWFpbDwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgICAKICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DSUF0dHJpYnV0ZUNvbGxlY3Rpb246OkNvbXBhbnlCYWNrZW5kTWFwcGluZyIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPkRlZmluZXMgaW5mb3JtYXRpb24gc2hvd24gZm9yIGNvbXBhbnkgYXR0cmlidXRlcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxEZXNjcmlwdGlvbiBMYW5nPSJkZSI+RGVmaW5pZXJ0IGRpZSB6dSBlaW5lbSBDb21wYW55YXR0cmlidXQgYW5nZXplaWd0ZW4gV2VydGUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTS1DSUF0dHJpYnV0ZUNvbGxlY3Rpb248L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5DdXN0b21lckNvbXBhbnk8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMTAwMCI+Q3VzdG9tZXJDb21wYW55TmFtZTwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMjAwMCI+Q3VzdG9tZXJDb21wYW55U3RyZWV0PC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIzMDAwIj5DdXN0b21lckNvbXBhbnlaSVA8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjMwMDEiPkN1c3RvbWVyQ29tcGFueUNpdHk8L0l0ZW0+CiAgICAgICAgICAgIDwvSGFzaD4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICAKICAgIDwhLS0gQ0kgRVZFTlQgUkVHSVNUUkFUSU9OUyAtLT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01Db25maWdJdGVtOjpFdmVudE1vZHVsZVBvc3QjIyM1MDItUmVmcmVzaENJQ2xhc3NSZWZlcmVuY2VMaW5rcyIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZW4iPlNlYXJjaGVzIGZvciBhdHRyaWJ1dGVzIG9mIHR5cGUgQ0lDbGFzc1JlZmVyZW5jZSBpbiB0aGUgbmV3IENJcyB2ZXJzaW9uIGRhdGEgYW5kIHJlZnJlc2hlcyBhbGwgbGlua3MgdG8gdGhhdCBjbGFzcy4gSXQgZGVsZXRlcyBsaW5rcyB0byB0aGlzIGNsYXNzIGlmIHRoZSB2YWx1ZSBpcyBub3QgZXhpc3RlbnQgaW4gdGhlIENJcyB2ZXJzaW9uIGRhdGEuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8RGVzY3JpcHRpb24gTGFuZz0iZGUiPlN1Y2h0IG5hY2ggQXR0cmlidXRlbiB2b20gVHlwIENJQ2xhc3NSZWZlcmVuY2UgaW4gZGVyIG5ldWVuIFZlcnNpb24gZGVzIENJcyB1bmQgYWt0dWFsaXNpZXJ0IGFsbGUgVmVya251ZXBmdW5nZW4genUgQ0lzIGRpZXNlciBLbGFzc2UuIEFsbGUgVmVya251ZXBmdW5nZW4genUgZGllc2VyIEtsYXNzZSB6dSBkZW5lbiBrZWluIFdlcnQgaW4gZGVyIENJLVZlcnNpb24gZXhpc3RpZXJ0IHdlcmRlbiBnZWxvZXNjaHQuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTS1DSUF0dHJpYnV0ZUNvbGxlY3Rpb248L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpJVFNNQ29uZmlnSXRlbUV2ZW50czwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxIYXNoPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJNb2R1bGUiPktlcm5lbDo6U3lzdGVtOjpJVFNNQ29uZmlnSXRlbTo6RXZlbnQ6OkNJQ2xhc3NSZWZlcmVuY2VfUmVmcmVzaExpbmtzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJFdmVudCI+KFZlcnNpb25DcmVhdGUpPC9JdGVtPgogICAgICAgICAgICA8L0hhc2g+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPiAgICAgICAgCiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ29uZmlnSXRlbTo6RXZlbnRNb2R1bGVQb3N0IyMjNTAyLVJlZnJlc2hTZXJ2aWNlUmVmZXJlbmNlTGlua3MiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImVuIj5TZWFyY2hlcyBmb3IgYXR0cmlidXRlcyBvZiB0eXBlIFNlcnZpY2VSZWZlcmVuY2UgaW4gdGhlIG5ldyBDSXMgdmVyc2lvbiBkYXRhIGFuZCByZWZyZXNoZXMgYWxsIGxpbmtzIHRvIHRoYXQgY2xhc3MuIEl0IGRlbGV0ZXMgbGlua3MgdG8gdGhpcyBjbGFzcyBpZiB0aGUgdmFsdWUgaXMgbm90IGV4aXN0ZW50IGluIHRoZSBDSXMgdmVyc2lvbiBkYXRhLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPERlc2NyaXB0aW9uIExhbmc9ImRlIj5TdWNodCBuYWNoIEF0dHJpYnV0ZW4gdm9tIFR5cCBTZXJ2aWNlUmVmZXJlbmNlIGluIGRlciBuZXVlbiBWZXJzaW9uIGRlcyBDSXMgdW5kIGFrdHVhbGlzaWVydCBhbGxlIFZlcmtudWVwZnVuZ2VuIHp1IENJcyBkaWVzZXIgS2xhc3NlLiBBbGxlIFZlcmtudWVwZnVuZ2VuIHp1IGRpZXNlciBLbGFzc2UgenUgZGVuZW4ga2VpbiBXZXJ0IGluIGRlciBDSS1WZXJzaW9uIGV4aXN0aWVydCB3ZXJkZW4gZ2Vsb2VzY2h0LjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00tQ0lBdHRyaWJ1dGVDb2xsZWN0aW9uPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6SVRTTUNvbmZpZ0l0ZW1FdmVudHM8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8SGFzaD4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iTW9kdWxlIj5LZXJuZWw6OlN5c3RlbTo6SVRTTUNvbmZpZ0l0ZW06OkV2ZW50OjpTZXJ2aWNlUmVmZXJlbmNlX1JlZnJlc2hMaW5rczwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iRXZlbnQiPihWZXJzaW9uQ3JlYXRlKTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4gCiAgICA8IS0tIEVPIENJIEVWRU5UIFJFR0lTVFJBVElPTlMgLS0+CgogICAgPCEtLSByZWdpc3RlcmluZyBmb3IgYXV0b2NvbXBsZXRlIGZ1bmN0aW9uYWxpdHkgLS0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJMb2FkZXI6OkFnZW50OjpDb21tb25KUyMjIzEwMS1JVFNNQ0lBdHRyaWJ1dGVDb2xsZWN0aW9uIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkxpc3Qgb2YgSlMgZmlsZXMgdG8gYWx3YXlzIGJlIGxvYWRlZCBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5GcmFtZXdvcms8L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpXZWI8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8QXJyYXk+CiAgICAgICAgICAgICAgICA8SXRlbT5Db3JlLkFnZW50LlF1ZXVlU2VhcmNoLmpzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Q29yZS5BZ2VudC5TZXJ2aWNlU2VhcmNoLmpzPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0+Q29yZS5BZ2VudC5DdXN0b21lckNvbXBhbnlTZWFyY2guanM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5Db3JlLkFnZW50LkN1c3RvbWVyVXNlckNvbXBhbnlTZWFyY2guanM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5Db3JlLkFnZW50LkNJQ2xhc3NTZWFyY2guanM8L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbT5Db3JlLkFnZW50LlVzZXJTZWFyY2guanM8L0l0ZW0+CiAgICAgICAgICAgIDwvQXJyYXk+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgoKICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudFF1ZXVlU2VhcmNoIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTS1DSUF0dHJpYnV0ZUNvbGxlY3Rpb248L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5Mb29rdXAgb2YgcXVldWVzLCB1c2VkIGZvciBhdXRvY29tcGxldGlvbjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGU+UXVldWVTZWFyY2g8L1RpdGxlPgo8IS0tCiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5Db25maWcgSXRlbTwvTmF2QmFyTmFtZT4KLS0+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgoKICAgIDxDb25maWdJdGVtIE5hbWU9IkZyb250ZW5kOjpNb2R1bGUjIyNBZ2VudFVzZXJTZWFyY2giIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNLUNJQXR0cmlidXRlQ29sbGVjdGlvbjwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6TW9kdWxlUmVnaXN0cmF0aW9uPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEZyb250ZW5kTW9kdWxlUmVnPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPkxvb2t1cCBvZiB1c2VycywgdXNlZCBmb3IgYXV0b2NvbXBsZXRpb248L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPkFnZW50VXNlclNlYXJjaDwvVGl0bGU+CjwhLS0KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkNvbmZpZyBJdGVtPC9OYXZCYXJOYW1lPgotLT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50U2VydmljZVNlYXJjaCIgUmVxdWlyZWQ9IjAiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5Gcm9udGVuZCBtb2R1bGUgcmVnaXN0cmF0aW9uIGZvciB0aGUgYWdlbnQgaW50ZXJmYWNlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00tQ0lBdHRyaWJ1dGVDb2xsZWN0aW9uPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+RnJvbnRlbmQ6OkFnZW50OjpNb2R1bGVSZWdpc3RyYXRpb248L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8RnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgICAgICAgICA8RGVzY3JpcHRpb24+TG9va3VwIG9mIHNlcnZpY2VzLCB1c2VkIGZvciBhdXRvY29tcGxldGlvbjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGU+U2VydmljZVNlYXJjaDwvVGl0bGU+CjwhLS0KICAgICAgICAgICAgICAgIDxOYXZCYXJOYW1lPkNvbmZpZyBJdGVtPC9OYXZCYXJOYW1lPgotLT4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50Q3VzdG9tZXJDb21wYW55U2VhcmNoIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTS1DSUF0dHJpYnV0ZUNvbGxlY3Rpb248L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5Mb29rdXAgb2YgY3VzdG9tZXIgY29tcGFuaWVzLCB1c2VkIGZvciBhdXRvY29tcGxldGlvbjwvRGVzY3JpcHRpb24+CiAgICAgICAgICAgICAgICA8VGl0bGU+Q3VzdG9tZXJDb21wYW55U2VhcmNoPC9UaXRsZT4KPCEtLQogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+Q29uZmlnIEl0ZW08L05hdkJhck5hbWU+Ci0tPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KCiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRDdXN0b21lclVzZXJDb21wYW55U2VhcmNoIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTS1DSUF0dHJpYnV0ZUNvbGxlY3Rpb248L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5Mb29rdXAgb2YgY3VzdG9tZXIgdXNlciBjb21wYW5pZXMsIHVzZWQgZm9yIGF1dG9jb21wbGV0aW9uPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgICAgIDxUaXRsZT5DdXN0b21lclVzZXJDb21wYW55U2VhcmNoPC9UaXRsZT4KPCEtLQogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+Q29uZmlnIEl0ZW08L05hdkJhck5hbWU+Ci0tPgogICAgICAgICAgICA8L0Zyb250ZW5kTW9kdWxlUmVnPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KCiAgICA8Q29uZmlnSXRlbSBOYW1lPSJGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRDSUNsYXNzU2VhcmNoIiBSZXF1aXJlZD0iMCIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkZyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTS1DSUF0dHJpYnV0ZUNvbGxlY3Rpb248L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6Ok1vZHVsZVJlZ2lzdHJhdGlvbjwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxEZXNjcmlwdGlvbj5Mb29rdXAgb2YgQ0kgY2xhc3NlcywgdXNlZCBmb3IgYXV0b2NvbXBsZXRpb248L0Rlc2NyaXB0aW9uPgogICAgICAgICAgICAgICAgPFRpdGxlPkNJQ2xhc3NTZWFyY2g8L1RpdGxlPgo8IS0tCiAgICAgICAgICAgICAgICA8TmF2QmFyTmFtZT5Db25maWcgSXRlbTwvTmF2QmFyTmFtZT4KLS0+CiAgICAgICAgICAgIDwvRnJvbnRlbmRNb2R1bGVSZWc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgoKICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DSUF0dHJpYnV0ZUNvbGxlY3Rpb246OkZyb250ZW5kOjpDb21tb25TZWFyY2hBdXRvQ29tcGxldGUjIyNBY3RpdmUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgYXV0b2NvbXBsZXRlIGZlYXR1cmUgZm9yIHRoZSBxdWV1ZSwgc2VydmljZSBhbmQgQ0ktY2xhc3Mgc2VhcmNoIGluIHRoZSBJVFNNIGFnZW50IGludGVyZmFjZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNLUNJQXR0cmlidXRlQ29sbGVjdGlvbjwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6Q29tbW9uU2VhcmNoPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNJQXR0cmlidXRlQ29sbGVjdGlvbjo6RnJvbnRlbmQ6OkNvbW1vblNlYXJjaEF1dG9Db21wbGV0ZTo6RHluYW1pY1dpZHRoIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkFkYXB0cyB0aGUgd2lkdGggb2YgdGhlIGF1dG9jb21wbGV0ZSBkcm9wIGRvd24gdG8gdGhlIGxlbmd0aCBvZiB0aGUgbG9uZ2VzdCBvcHRpb24uPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTS1DSUF0dHJpYnV0ZUNvbGxlY3Rpb248L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OkNvbW1vblNlYXJjaDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxPcHRpb24gU2VsZWN0ZWRJRD0iMSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjAiPk5vPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIxIj5ZZXM8L0l0ZW0+CiAgICAgICAgICAgIDwvT3B0aW9uPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DSUF0dHJpYnV0ZUNvbGxlY3Rpb246OkZyb250ZW5kOjpDb21tb25TZWFyY2hBdXRvQ29tcGxldGUjIyNNaW5RdWVyeUxlbmd0aCIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5TZXRzIHRoZSBtaW5pbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIGJlZm9yZSBhdXRvY29tcGxldGUgcXVlcnkgaXMgc2VudC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNLUNJQXR0cmlidXRlQ29sbGVjdGlvbjwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6Q29tbW9uU2VhcmNoPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPFN0cmluZyBSZWdleD0iXlsxLTldJCI+MjwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DSUF0dHJpYnV0ZUNvbGxlY3Rpb246OkZyb250ZW5kOjpDb21tb25TZWFyY2hBdXRvQ29tcGxldGUjIyNNYXhSZXN1bHRzRGlzcGxheWVkIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlNldHMgdGhlIG1heGltYWwgbnVtYmVyIG9mIHNlYXJjaCByZXN1bHRzIGZvciB0aGUgYXV0b2NvbXBsZXRlIGZlYXR1cmUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTS1DSUF0dHJpYnV0ZUNvbGxlY3Rpb248L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OkNvbW1vblNlYXJjaDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmc+MjA8L1N0cmluZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJJVFNNQ0lBdHRyaWJ1dGVDb2xsZWN0aW9uOjpGcm9udGVuZDo6Q29tbW9uU2VhcmNoQXV0b0NvbXBsZXRlIyMjUXVlcnlEZWxheSIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5EZWxheSB0aW1lIGJldHdlZW4gYXV0b2NvbXBsZXRlIHF1ZXJpZXMuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTS1DSUF0dHJpYnV0ZUNvbGxlY3Rpb248L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Gcm9udGVuZDo6QWdlbnQ6OkNvbW1vblNlYXJjaDwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9Il5bMS05XVswLTldKiQiPjEwMDwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IklUU01DSUF0dHJpYnV0ZUNvbGxlY3Rpb246OkZyb250ZW5kOjpDb21tb25TZWFyY2hBdXRvQ29tcGxldGUjIyNUeXBlQWhlYWQiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RW5hYmxlcyBvciBkaXNhYmxlcyBUeXBlQWhlYWQgZm9yIHRoZSBhdXRvY29tcGxldGUgZmVhdHVyZS48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNLUNJQXR0cmlidXRlQ29sbGVjdGlvbjwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkZyb250ZW5kOjpBZ2VudDo6Q29tbW9uU2VhcmNoPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSJmYWxzZSI+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9ImZhbHNlIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0idHJ1ZSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8IS0tIEVPIHJlZ2lzdGVyaW5nIGZvciBhdXRvY29tcGxldGUgZnVuY3Rpb25hbGl0eSAtLT4KCjwvb3Ryc19jb25maWc+Cg== PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iaXNvLTg4NTktMSI/Pgo8b3Ryc19jb25maWcgdmVyc2lvbj0iMS4wIiBpbml0PSJBcHBsaWNhdGlvbiI+CiAgICA8Q1ZTPiRJZDogQXR0YWNobWVudFN0b3JhZ2UueG1sLHYgMS40IDIwMTEtMDctMTggMTQ6NTc6NDAgdHRvIEV4cCAkPC9DVlM+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJBdHRhY2htZW50U3RvcmFnZTo6U3RvcmFnZUJhY2tlbmRNb2R1bGVzIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkEgbGlzdCBvZiBhbGwgYXZhaWxhYmxlIENJLWF0dGFjaG1lbnQgc3RvcmFnZSBiYWNrZW5kcy48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNLUNJQXR0cmlidXRlQ29sbGVjdGlvbjwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkF0dGFjaG1lbnRTdG9yYWdlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPEhhc2g+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9Iktlcm5lbDo6U3lzdGVtOjpDSUF0dGFjaG1lbnRTdG9yYWdlOjpBdHRhY2htZW50U3RvcmFnZURCIj4xPC9JdGVtPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSJLZXJuZWw6OlN5c3RlbTo6Q0lBdHRhY2htZW50U3RvcmFnZTo6QXR0YWNobWVudFN0b3JhZ2VGUyI+MTwvSXRlbT4KICAgICAgICAgICAgPC9IYXNoPgogICAgICAgIDwvU2V0dGluZz4KICAgIDwvQ29uZmlnSXRlbT4KICAgIDxDb25maWdJdGVtIE5hbWU9IkF0dGFjaG1lbnRTdG9yYWdlOjpEZWZhdWx0U3RvcmFnZUJhY2tlbmRNb2R1bGUiIFJlcXVpcmVkPSIxIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RGVmaW5lcyB0aGUgYmFja2VuZCBtb2R1bGUgdXNlZCBmb3IgYXR0YWNobWVudCBzdG9yYWdlLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00tQ0lBdHRyaWJ1dGVDb2xsZWN0aW9uPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6QXR0YWNobWVudFN0b3JhZ2U8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8U3RyaW5nIFJlZ2V4PSIiPktlcm5lbDo6U3lzdGVtOjpDSUF0dGFjaG1lbnRTdG9yYWdlOjpBdHRhY2htZW50U3RvcmFnZURCPC9TdHJpbmc+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iRnJvbnRlbmQ6Ok1vZHVsZSMjI0FnZW50QXR0YWNobWVudFN0b3JhZ2UiIFJlcXVpcmVkPSIwIiBWYWxpZD0iMSI+CiAgICAgICAgPERlc2NyaXB0aW9uIFRyYW5zbGF0YWJsZT0iMSI+RnJvbnRlbmQgbW9kdWxlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIENJLUFnZW50QXR0YWNobWVudFN0b3JhZ2Ugb2JqZWN0IGluIHRoZSBhZ2VudCBpbnRlcmZhY2UuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTS1DSUF0dHJpYnV0ZUNvbGxlY3Rpb248L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpBdHRhY2htZW50U3RvcmFnZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxGcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICAgICAgICAgIDxUaXRsZT48L1RpdGxlPgogICAgICAgICAgICAgICAgPE5hdkJhck5hbWU+VGlja2V0PC9OYXZCYXJOYW1lPgogICAgICAgICAgICAgICAgPERlc2NyaXB0aW9uPlRvIGRvd25sb2FkIGF0dGFjaG1lbnRzPC9EZXNjcmlwdGlvbj4KICAgICAgICAgICAgPC9Gcm9udGVuZE1vZHVsZVJlZz4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+CiAgICA8Q29uZmlnSXRlbSBOYW1lPSJBdHRhY2htZW50U3RvcmFnZUZTOjpTdG9yYWdlRGlyZWN0b3J5IiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPlRoZSBwYXRoIHRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGZpbGUgc3lzdGVtIGJhY2tlbmQgc3RvcmVzIG5ldyBhdHRhY2htZW50cy4gVGhlIHBhdGggbmVlZHMgdG8gYmUgc3BlY2lmaWVkIHJlbGF0aXZlIHRvIHRoZSBPVFJTLUhvbWUuPC9EZXNjcmlwdGlvbj4KICAgICAgICA8R3JvdXA+SVRTTS1DSUF0dHJpYnV0ZUNvbGxlY3Rpb248L0dyb3VwPgogICAgICAgIDxTdWJHcm91cD5Db3JlOjpBdHRhY2htZW50U3RvcmFnZTwvU3ViR3JvdXA+CiAgICAgICAgPFNldHRpbmc+CiAgICAgICAgICAgIDxTdHJpbmcgUmVnZXg9IiI+L3Zhci9hdHRhY2htZW50czwvU3RyaW5nPgogICAgICAgIDwvU2V0dGluZz4gCiAgICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNJQXR0cmlidXRlQ29sbGVjdGlvbjo6QXR0YWNobWVudE1ENUNoZWNrIiBSZXF1aXJlZD0iMSIgVmFsaWQ9IjEiPgogICAgICAgIDxEZXNjcmlwdGlvbiBUcmFuc2xhdGFibGU9IjEiPkVuYWJsZXMgbWQ1IGNvbnRlbnQgY2hlY2sgZm9yIHVwbG9hZGVkIENJLWF0dGFjaG1lbnQgY29udGVudC48L0Rlc2NyaXB0aW9uPgogICAgICAgIDxHcm91cD5JVFNNLUNJQXR0cmlidXRlQ29sbGVjdGlvbjwvR3JvdXA+CiAgICAgICAgPFN1Ykdyb3VwPkNvcmU6OkF0dGFjaG1lbnRTdG9yYWdlPC9TdWJHcm91cD4KICAgICAgICA8U2V0dGluZz4KICAgICAgICAgICAgPE9wdGlvbiBTZWxlY3RlZElEPSIxIj4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMCI+Tm88L0l0ZW0+CiAgICAgICAgICAgICAgICA8SXRlbSBLZXk9IjEiPlllczwvSXRlbT4KICAgICAgICAgICAgPC9PcHRpb24+CiAgICAgICAgPC9TZXR0aW5nPgogICAgPC9Db25maWdJdGVtPgogICAgPENvbmZpZ0l0ZW0gTmFtZT0iSVRTTUNJQXR0cmlidXRlQ29sbGVjdGlvbjo6QXR0YWNobWVudFNpemVDaGVjayIgUmVxdWlyZWQ9IjEiIFZhbGlkPSIxIj4KICAgICAgICA8RGVzY3JpcHRpb24gVHJhbnNsYXRhYmxlPSIxIj5FbmFibGVzIHNpemUgY2hlY2sgZm9yIHVwbG9hZGVkIENJLWF0dGFjaG1lbnRzLjwvRGVzY3JpcHRpb24+CiAgICAgICAgPEdyb3VwPklUU00tQ0lBdHRyaWJ1dGVDb2xsZWN0aW9uPC9Hcm91cD4KICAgICAgICA8U3ViR3JvdXA+Q29yZTo6QXR0YWNobWVudFN0b3JhZ2U8L1N1Ykdyb3VwPgogICAgICAgIDxTZXR0aW5nPgogICAgICAgICAgICA8T3B0aW9uIFNlbGVjdGVkSUQ9IjEiPgogICAgICAgICAgICAgICAgPEl0ZW0gS2V5PSIwIj5ObzwvSXRlbT4KICAgICAgICAgICAgICAgIDxJdGVtIEtleT0iMSI+WWVzPC9JdGVtPgogICAgICAgICAgICA8L09wdGlvbj4KICAgICAgICA8L1NldHRpbmc+CiAgICA8L0NvbmZpZ0l0ZW0+Cjwvb3Ryc19jb25maWc+Cg== IyAtLQojIEtlcm5lbC9Nb2R1bGVzL0FnZW50QXR0YWNobWVudFN0b3JhZ2UucG0gLSB0byBnZXQgdGhlIGF0dGFjaG1lbnRzCiMgQ29weXJpZ2h0IChDKSAyMDA2LTIwMTEgYy5hLnAuZS4gSVQgR21iSCwgaHR0cDovL3d3dy5jYXBlLWl0LmRlCiMKIyB3cml0dGVuL2VkaXRlZCBieToKIyAqIFRvcnN0ZW4oZG90KVRoYXUoYXQpY2FwZS1pdChkb3QpZGUKIyAqIEFubmEoZG90KUxpdHZpbm92YShhdCljYXBlLWl0KGRvdClkZQojIC0tCiMgJElkOiBBZ2VudEF0dGFjaG1lbnRTdG9yYWdlLnBtLHYgMS40IDIwMTEtMDctMjUgMDk6MDE6MzMgc21laGxpZyBFeHAgJAojIC0tCiMgVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKIyB0aGUgZW5jbG9zZWQgZmlsZSBDT1BZSU5HIGZvciBsaWNlbnNlIGluZm9ybWF0aW9uIChHUEwpLiBJZiB5b3UKIyBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2dwbC50eHQuCiMgLS0KCnBhY2thZ2UgS2VybmVsOjpNb2R1bGVzOjpBZ2VudEF0dGFjaG1lbnRTdG9yYWdlOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpDSUF0dGFjaG1lbnRTdG9yYWdlOjpBdHRhY2htZW50U3RvcmFnZTsKCnVzZSB2YXJzIHF3KCRWRVJTSU9OKTsKJFZFUlNJT04gPSBxdygkUmV2aXNpb246IDEuNCAkKSBbMV07Cgo9aGVhZDEgTkFNRQoKS2VybmVsOjpNb2R1bGVzOjpBZ2VudEF0dGFjaG1lbnRTdG9yYWdlIC0gZnJvbnRlbmQgbW9kdWxlIGZvciBhY2Nlc3MgdG8gYXR0YWNobWVudHMKCj1oZWFkMSBTWU5PUFNJUwoKQSBmcm9udGVuZCBtb2R1bGUgd2hpY2ggcHJvdmlkZXMgc3lzdGVtIHVzZXJzIGFjY2VzcyB0byBzdG9yZWQgYXR0YWNobWVudHMuCgo9b3ZlciA0Cgo9Y3V0Cgo9aXRlbSBuZXcoKQoKY3JlYXRlIGEgb2JqZWN0CgogICAgdXNlIEtlcm5lbDo6Q29uZmlnOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpMb2c7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkRCOwogICAgdXNlIEtlcm5lbDo6U3lzdGVtOjpDSUF0dGFjaG1lbnRTdG9yYWdlOjpBdHRhY2htZW50U3RvcmFnZTsKCiAgICBteSAkQXR0YWNobWVudFN0b3JhZ2VPYmplY3QgPSBLZXJuZWw6Ok1vZHVsZXM6OkFnZW50QXR0YWNobWVudFN0b3JhZ2UtPm5ldygKICAgICAgICBQYXJhbU9iamVjdCAgPT4gJFBhcmFtT2JqZWN0LAogICAgICAgIERCT2JqZWN0ICA9PiAkREJPYmplY3QsCiAgICAgICAgTGF5b3V0T2JqZWN0ICA9PiAkTGF5b3V0T2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgPT4gJExvZ09iamVjdCwKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7Cgo9Y3V0CgpzdWIgbmV3IHsKICAgIG15ICggJFR5cGUsICVQYXJhbSApID0gQF87CiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgIGZvcmVhY2ggKCBrZXlzICVQYXJhbSApIHsKICAgICAgICAkU2VsZi0+eyRffSA9ICRQYXJhbXskX307CiAgICB9CgogICAgI2NoZWNrIHJlcXVpcmVkIG9iamVjdHMuLi4KICAgIGZvcmVhY2ggKHF3KFBhcmFtT2JqZWN0IERCT2JqZWN0IExheW91dE9iamVjdCBMb2dPYmplY3QgQ29uZmlnT2JqZWN0IEVuY29kZU9iamVjdCkpIHsKICAgICAgICBpZiAoICEkU2VsZi0+eyRffSApIHsKICAgICAgICAgICAgJFNlbGYtPntMYXlvdXRPYmplY3R9LT5GYXRhbEVycm9yKCBNZXNzYWdlID0+ICJHb3Qgbm8gJF8hIiApOwogICAgICAgIH0KICAgIH0KCiAgICAkU2VsZi0+e0F0dGFjaG1lbnRTdG9yYWdlT2JqZWN0fSA9CiAgICAgICAgS2VybmVsOjpTeXN0ZW06OkNJQXR0YWNobWVudFN0b3JhZ2U6OkF0dGFjaG1lbnRTdG9yYWdlLT5uZXcoICV7JFNlbGZ9ICk7CgogICAgI2dldCBBdHRhY2htZW50RGlyZWN0b3J5SUQuLi4KICAgICRTZWxmLT57QXR0YWNobWVudERpcmVjdG9yeUlEfSA9CiAgICAgICAgJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnQXR0YWNobWVudERpcmVjdG9yeUlEJyApOwogICAgJFNlbGYtPntWaWV3ZXJ9ID0gJFNlbGYtPntQYXJhbU9iamVjdH0tPkdldFBhcmFtKCBQYXJhbSA9PiAnVmlld2VyJyApIHx8IDA7CgogICAgcmV0dXJuICRTZWxmOwp9CgpzdWIgUnVuIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICBteSAkT3V0cHV0ICA9ICcnOwogICAgbXkgJEFsbG93ZWQgPSAxOwoKICAgICNjaGVjayBwYXJhbXMuLi4KICAgIGlmICggISRTZWxmLT57QXR0YWNobWVudERpcmVjdG9yeUlEfSApIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgTWVzc2FnZSAgPT4gJ0F0dGFjaG1lbnREaXJlY3RvcnlJRCBpcyBuZWVkZWQhJywKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICApOwogICAgICAgIHJldHVybiAkU2VsZi0+e0xheW91dE9iamVjdH0tPkVycm9yU2NyZWVuKCk7CiAgICB9CgogICAgI2dldCB0aGUgYXR0YWNobWVudC4uLgogICAgbXkgJUF0dGFjaG1lbnREYXRhID0gJXsKICAgICAgICAkU2VsZi0+e0F0dGFjaG1lbnRTdG9yYWdlT2JqZWN0fS0+QXR0YWNobWVudFN0b3JhZ2VHZXQoCiAgICAgICAgICAgIElEID0+ICRTZWxmLT57QXR0YWNobWVudERpcmVjdG9yeUlEfSwKICAgICAgICAgICAgKQogICAgICAgIH07CgogICAgaWYgKCVBdHRhY2htZW50RGF0YSkgewogICAgICAgICRBdHRhY2htZW50RGF0YXtDb250ZW50fSAgICAgPSAkeyAkQXR0YWNobWVudERhdGF7Q29udGVudFJlZn0gfTsKICAgICAgICAkQXR0YWNobWVudERhdGF7RmlsZW5hbWV9ICAgID0gJEF0dGFjaG1lbnREYXRhe0ZpbGVOYW1lfTsKICAgICAgICAkQXR0YWNobWVudERhdGF7Q29udGVudFR5cGV9ID0gJEF0dGFjaG1lbnREYXRhe1ByZWZlcmVuY2VzfS0+e0RhdGFUeXBlfTsKICAgICAgICByZXR1cm4gJFNlbGYtPntMYXlvdXRPYmplY3R9LT5BdHRhY2htZW50KCVBdHRhY2htZW50RGF0YSk7CgogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJObyBzdWNoIGF0dGFjaG1lbnQgaW4gZGlyZWN0b3J5IGluZGV4ICgkU2VsZi0+e0F0dGFjaG1lbnREaXJlY3RvcnlJRH0pISAiLAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICk7CiAgICAgICAgcmV0dXJuICRTZWxmLT57TGF5b3V0T2JqZWN0fS0+RXJyb3JTY3JlZW4oKTsKICAgIH0KfQoKMTsK IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9BdHRhY2htZW50U3RvcmFnZS5wbSAtIHRoZSBnZXJtYW4gdHJhbnNsYXRpb24gb2YgQXR0YWNobWVudFN0b3JhZ2UKIyBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMSBjLmEucC5lLiBJVCBHbWJILCBodHRwOi8vd3d3LmNhcGUtaXQuZGUKIwojIHdyaXR0ZW4vZWRpdGVkIGJ5OgojICogQW5uYShkb3QpTGl0dmlub3ZhKGF0KWNhcGUtaXQoZG90KWRlCiMgLS0KIyAkSWQ6IGRlX0F0dGFjaG1lbnRTdG9yYWdlLnBtLHYgMS4zIDIwMTEtMDMtMTYgMTY6MjI6MjIgdHRvIEV4cCAkCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZGVfQXR0YWNobWVudFN0b3JhZ2U7CnVzZSBzdHJpY3Q7CnVzZSB3YXJuaW5nczsKCnN1YiBEYXRhIHsKICAgIG15ICRTZWxmID0gc2hpZnQ7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydSZW1vdmUgYXR0YWNobWVudCd9ID0gJ0FubGFnZSBlbnRmZXJuZW4nOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnU2VsZWN0IGEgZmlsZSB0byByZXBsYWNlIGN1cnJlbnQgYXR0YWNobWVudCd9ID0KICAgICAgICAnRGF0ZWlhdXN3YWhsIHVtIGFrdC4gQW5sYWdlIHp1IGVyc2V0emVuJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0ludmFsaWQgY29udGVudCAtIGZpbGUgc2l6ZSBvbiBkaXNrIGhhcyBiZWVuIGNoYW5nZWQnfSA9CiAgICAgICAgJ1VuZ/xsdGlnZXIgSW5oYWx0IC0gdGF0c+RjaGxpY2hlIERhdGVpZ3L232UgaGF0IHNpY2ggZ2XkbmRlcnQnOwogICAgJFNlbGYtPntUcmFuc2xhdGlvbn0tPnsnSW52YWxpZCBtZDVzdW0gLSBUaGUgZmlsZSBtaWdodCBoYXZlIGJlZW4gY2hhbmdlZCd9ID0KICAgICAgICAnVW5n/Gx0aWdlIE1ENS1TdW1tZSAtIERlciBEYXRlaWluaGFsdCB3dXJkZSB3YWhyc2NoZWlubGljaCBnZeRuZGVydCc7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+eydEZWZpbmVzIHRoZSBiYWNrZW5kIG1vZHVsZSB1c2VkIGZvciBhdHRhY2htZW50IHN0b3JhZ2UuJ30KICAgICAgICA9ICdEZWZpbmllcnQgZGFzIEJhY2tlbmQtTW9kdWwgZvxyIGRpZSBTcGVpY2hlcnVuZyB2b24gQW5o5G5nZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J0EgbGlzdCBvZiBhbGwgYXZhaWxhYmxlIENJLWF0dGFjaG1lbnQgc3RvcmFnZSBiYWNrZW5kcy4nfQogICAgICAgID0gJ0VpbmUgTGlzdGUgYWxsZXIgdmVyZvxnYmFyZXIgQmFja2VuZHMgZvxyIGRpZSBTcGVpY2hlcnVuZyB2b24gQ0ktQW5o5G5nZW4uJzsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57CiAgICAgICAgJ0Zyb250ZW5kIG1vZHVsZSByZWdpc3RyYXRpb24gZm9yIHRoZSBDSS1BZ2VudEF0dGFjaG1lbnRTdG9yYWdlIG9iamVjdCBpbiB0aGUgYWdlbnQgaW50ZXJmYWNlLicKICAgICAgICB9ID0gJ0Zyb250ZW5kbW9kdWwtUmVnaXN0cmF0aW9uIGRlcyBDSS1BZ2VudEF0dGFjaG1lbnRTdG9yYWdlLU9iamVrdHMgaW0gQWdlbnQtSW50ZXJmYWNlLic7CiAgICAkU2VsZi0+e1RyYW5zbGF0aW9ufS0+ewogICAgICAgICdUaGUgcGF0aCB0byB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBmaWxlIHN5c3RlbSBiYWNrZW5kIHN0b3JlcyBuZXcgYXR0YWNobWVudHMuIFRoZSBwYXRoIG5lZWRzIHRvIGJlIHNwZWNpZmllZCByZWxhdGl2ZSB0byB0aGUgT1RSUy1Ib21lLicKICAgICAgICB9CiAgICAgICAgPSAnUGZhZCB6dW0gVmVyemVpY2huaXMgaW4gd2VsY2hlbSB2b20gRGF0ZWlzeXN0ZW1zcGVpY2hlcm1vZHVsIChBdHRhY2htZW50U3RvcmFnZUZTKSBuZXVlIEFuaORuZ2UgYWJnZWxlZ3Qgd2VyZGVuLiBEZXIgUGZhZCB3aXJkIHJlbGF0aXYgenVtIE9UUlMtSG9tZSBWZXJ6ZWljaG5pcyBhbmdlZ2ViZW4uJwogICAgICAgIDsKICAgIHJldHVybiAxOwp9CjE7Cg== IyAtLQojIEtlcm5lbC9MYW5ndWFnZS9kZV9JVFNNQ0lBdHRyaWJ1dGVDb2xsZWN0aW9uLnBtIC0gdGhlIGdlcm1hbiB0cmFuc2xhdGlvbiBvZiBJVFNNQ0lBdHRyaWJ1dGVDb2xsZWN0aW9uCiMgQ29weXJpZ2h0IChDKSAyMDA2LTIwMTEgYy5hLnAuZS4gSVQgR21iSCwgaHR0cDovL3d3dy5jYXBlLWl0LmRlCiMKIyB3cml0dGVuL2VkaXRlZCBieToKIyAqIFN0ZWZhbihkb3QpTWVobGlnKGF0KWNhcGUtaXQoZG90KWRlCiMgLS0KIyAkSWQ6IGRlX0lUU01DSUF0dHJpYnV0ZUNvbGxlY3Rpb24ucG0sdiAxLjEgMjAxMS0xMC0xMyAxMToyNjowMSBzbWVobGlnIEV4cCAkCiMKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CiMgZGlkIG5vdCByZWNlaXZlIHRoaXMgZmlsZSwgc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgojIC0tCnBhY2thZ2UgS2VybmVsOjpMYW5ndWFnZTo6ZGVfSVRTTUNJQXR0cmlidXRlQ29sbGVjdGlvbjsKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKc3ViIERhdGEgewogICAgbXkgJFNlbGYgPSBzaGlmdDsKICAgICRTZWxmLT57VHJhbnNsYXRpb259LT57J09wZW4gbGluayBpbiBuZXcgd2luZG93J30gPSAn1mZmbmV0IGRlbiBMaW5rIGluIGVpbmVtIG5ldWVtIEZlbnN0ZXInOwogICAgcmV0dXJuIDE7Cn0KMTsK IyAtLQojIElUU01fQ0lBdHRyaWJ1dGVDb2xsZWN0aW9uLnBtIC0gY29kZSBydW4gZHVyaW5nIHBhY2thZ2UgZGUtL2luc3RhbGxhdGlvbgojIENvcHlyaWdodCAoQykgMjAwNi0yMDExIGMuYS5wLmUuIElUIEdtYkgsIGh0dHA6Ly93d3cuY2FwZS1pdC5kZQojCiMgd3JpdHRlbi9lZGl0ZWQgYnkKIwlBbm5hKGRvdClMaXR2aW5vdmEoYXQpY2FwZS1pdChkb3QpZGUKIwojIC0tCiMgJElkOiBJVFNNX0NJQXR0cmlidXRlQ29sbGVjdGlvbi5wbSx2IDEuNyAyMDExLTA3LTI1IDA5OjEwOjI5IHNtZWhsaWcgRXhwICQKIyAtLQojIFRoaXMgc29mdHdhcmUgY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLiBGb3IgZGV0YWlscywgc2VlCiMgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdQojIGRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCiMgLS0KCnBhY2thZ2UgdmFyOjpwYWNrYWdlc2V0dXA6OklUU01fQ0lBdHRyaWJ1dGVDb2xsZWN0aW9uOwoKdXNlIHN0cmljdDsKdXNlIHdhcm5pbmdzOwoKdXNlIEtlcm5lbDo6U3lzdGVtOjpQYWNrYWdlOwoKdXNlIHZhcnMgcXcoQElTQSAkVkVSU0lPTik7CiRWRVJTSU9OID0gcXcoJFJldmlzaW9uOiAxLjcgJCkgWzFdOwoKPWhlYWQxIE5BTUUKCk9UUlNfS0lYNE9UUlMucG0gLSBjb2RlIHRvIGV4Y2VjdXRlIGR1cmluZyBwYWNrYWdlIGluc3RhbGxhdGlvbgoKPWhlYWQxIFNZTk9QU0lTCgpBbGwgZnVuY3Rpb25zCgo9aGVhZDEgUFVCTElDIElOVEVSRkFDRQoKPW92ZXIgNAoKPWN1dAoKPWl0ZW0gbmV3KCkKCmNyZWF0ZSBhbiBvYmplY3QKCiAgICB1c2UgS2VybmVsOjpDb25maWc7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OkxvZzsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6TWFpbjsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6VGltZTsKICAgIHVzZSBLZXJuZWw6OlN5c3RlbTo6REI7CiAgICB1c2UgS2VybmVsOjpTeXN0ZW06OlhNTDsKCiAgICBteSAkQ29uZmlnT2JqZWN0ID0gS2VybmVsOjpDb25maWctPm5ldygpOwogICAgbXkgJExvZ09iamVjdCAgICA9IEtlcm5lbDo6U3lzdGVtOjpMb2ctPm5ldygKICAgICAgICBDb25maWdPYmplY3QgPT4gJENvbmZpZ09iamVjdCwKICAgICk7CiAgICBteSAkTWFpbk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpNYWluLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICApOwogICAgbXkgJFRpbWVPYmplY3QgPSBLZXJuZWw6OlN5c3RlbTo6VGltZS0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgKTsKICAgIG15ICREQk9iamVjdCA9IEtlcm5lbDo6U3lzdGVtOjpEQi0+bmV3KAogICAgICAgIENvbmZpZ09iamVjdCA9PiAkQ29uZmlnT2JqZWN0LAogICAgICAgIExvZ09iamVjdCAgICA9PiAkTG9nT2JqZWN0LAogICAgICAgIE1haW5PYmplY3QgICA9PiAkTWFpbk9iamVjdCwKICAgICk7CgogICAgbXkgJENvZGVPYmplY3QgPSB2YXI6OnBhY2thZ2VzZXR1cDo6T1RSUy1LSVg0T1RSUy1JVFNNLnBtLT5uZXcoCiAgICAgICAgQ29uZmlnT2JqZWN0ID0+ICRDb25maWdPYmplY3QsCiAgICAgICAgTG9nT2JqZWN0ICAgID0+ICRMb2dPYmplY3QsCiAgICAgICAgTWFpbk9iamVjdCAgID0+ICRNYWluT2JqZWN0LAogICAgICAgIFRpbWVPYmplY3QgICA9PiAkVGltZU9iamVjdCwKICAgICAgICBEQk9iamVjdCAgICAgPT4gJERCT2JqZWN0LAogICAgKTsKCj1jdXQKCnN1YiBuZXcgewogICAgbXkgKCAkVHlwZSwgJVBhcmFtICkgPSBAXzsKCiAgICBteSAkU2VsZiA9IHt9OwogICAgYmxlc3MoICRTZWxmLCAkVHlwZSApOwoKICAgICMgY2hlY2sgcmVxdWlyZWQgcGFyYW1zLi4uCiAgICBmb3IgbXkgJE9iamVjdCAoCiAgICAgICAgcXcoQ29uZmlnT2JqZWN0IExvZ09iamVjdCBNYWluT2JqZWN0IFRpbWVPYmplY3QgREJPYmplY3QgRW5jb2RlT2JqZWN0KQogICAgICAgICkKICAgIHsKICAgICAgICAkU2VsZi0+eyRPYmplY3R9ID0gJFBhcmFteyRPYmplY3R9IHx8IGRpZSAiR290IG5vICRPYmplY3QhIjsKICAgIH0KCiAgICByZXR1cm4gJFNlbGY7Cn0KCj1pdGVtIENvZGVJbnN0YWxsKCkKCnJ1biB0aGUgY29kZSBpbnN0YWxsIHBhcnQKCiAgICBteSAkUmVzdWx0ID0gJENvZGVPYmplY3QtPkNvZGVJbnN0YWxsKCk7Cgo9Y3V0CgpzdWIgQ29kZUluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgIG15ICRLSVhDb3JlSW5zdGFsbGVkID0gMDsKCiAgICAkU2VsZi0+e1BhY2thZ2VPYmplY3R9ID0gS2VybmVsOjpTeXN0ZW06OlBhY2thZ2UtPm5ldyggJXskU2VsZn0gKTsKICAgIG15IEBJbnN0YWxsZWRQYWNrYWdlcyA9ICRTZWxmLT57UGFja2FnZU9iamVjdH0tPlJlcG9zaXRvcnlMaXN0KCk7CgogICAgZm9yIG15ICRQYWNrYWdlIChASW5zdGFsbGVkUGFja2FnZXMpIHsKICAgICAgICBpZiAoICRQYWNrYWdlLT57TmFtZX0tPntDb250ZW50fSBlcSAnS0lYQ29yZScgKSB7CiAgICAgICAgICAgICRLSVhDb3JlSW5zdGFsbGVkID0gMTsKICAgICAgICAgICAgbGFzdDsKICAgICAgICB9CiAgICB9CgogICAgaWYgKCRLSVhDb3JlSW5zdGFsbGVkKSB7CiAgICAgICAgJFNlbGYtPl9SZWdpc3RlckN1c3RvbU1vZHVsZSgpOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPl9NYWtlQ2hhbmdlcygpOwogICAgfQoKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb2RlUmVpbnN0YWxsKCkKCnJ1biB0aGUgY29kZSByZWluc3RhbGwgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVJlaW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVSZWluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKICAgICRTZWxmLT5Db2RlVW5pbnN0YWxsKCk7CiAgICAkU2VsZi0+Q29kZUluc3RhbGwoKTsKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb2RlVXBncmFkZSgpCgpydW4gdGhlIGNvZGUgdXBncmFkZSBwYXJ0CgogICAgbXkgJFJlc3VsdCA9ICRDb2RlT2JqZWN0LT5Db2RlVXBncmFkZSgpOwoKPWN1dAoKc3ViIENvZGVVcGdyYWRlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CiAgICAkU2VsZi0+Q29kZUluc3RhbGwoKTsKICAgIHJldHVybiAxOwp9Cgo9aXRlbSBDb2RlVW5pbnN0YWxsKCkKCnJ1biB0aGUgY29kZSB1bmluc3RhbGwgcGFydAoKICAgIG15ICRSZXN1bHQgPSAkQ29kZU9iamVjdC0+Q29kZVVuaW5zdGFsbCgpOwoKPWN1dAoKc3ViIENvZGVVbmluc3RhbGwgewogICAgbXkgKCAkU2VsZiwgJVBhcmFtICkgPSBAXzsKCiAgICAkU2VsZi0+X1JlbW92ZUN1c3RvbU1vZHVsZSgpOwoKICAgIHJldHVybiAxOwp9CgpzdWIgX1JlZ2lzdGVyQ3VzdG9tTW9kdWxlIHsKICAgIG15ICggJFNlbGYsICVQYXJhbSApID0gQF87CgogICAgaWYgKCAkU2VsZi0+e01haW5PYmplY3R9LT5SZXF1aXJlKCdLZXJuZWw6OlN5c3RlbTo6S0lYVXRpbHMnKSApIHsKICAgICAgICAkU2VsZi0+e0tJWFV0aWxzT2JqZWN0fSA9IEtlcm5lbDo6U3lzdGVtOjpLSVhVdGlscy0+bmV3KCAleyRTZWxmfSApOwogICAgICAgICRTZWxmLT57S0lYVXRpbHNPYmplY3R9LT5SZWdpc3RlckN1c3RvbVBhY2thZ2UoCiAgICAgICAgICAgIFBhY2thZ2VOYW1lID0+ICdJVFNNQ0lBdHRyaWJ1dGVDb2xsZWN0aW9uJywKICAgICAgICAgICAgUHJpb3JpdHkgICAgPT4gJzAyMDAnLAogICAgICAgICk7CiAgICB9CgogICAgcmV0dXJuOwp9CgpzdWIgX1JlbW92ZUN1c3RvbU1vZHVsZSB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIGlmICggJFNlbGYtPntNYWluT2JqZWN0fS0+UmVxdWlyZSgnS2VybmVsOjpTeXN0ZW06OktJWFV0aWxzJykgKSB7CiAgICAgICAgJFNlbGYtPntLSVhVdGlsc09iamVjdH0gPSBLZXJuZWw6OlN5c3RlbTo6S0lYVXRpbHMtPm5ldyggJXskU2VsZn0gKTsKICAgICAgICAkU2VsZi0+e0tJWFV0aWxzT2JqZWN0fS0+VW5SZWdpc3RlckN1c3RvbVBhY2thZ2UoCiAgICAgICAgICAgIFBhY2thZ2VOYW1lID0+ICdJVFNNQ0lBdHRyaWJ1dGVDb2xsZWN0aW9uJywKICAgICAgICApOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPl9SZXN0b3JlQ2hhbmdlcygpOwogICAgfQoKICAgIHJldHVybjsKfQoKc3ViIF9NYWtlQ2hhbmdlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRDdXJyZW50T1MgICAgPSAkXk87CiAgICBteSAkRmlsZVRvQ2hhbmdlID0gIiI7CgogICAgbXkgJEZpbGVOYW1lICAgPSAiQWdlbnRJVFNNQ29uZmlnSXRlbUVkaXQuZHRsIjsKICAgIG15ICRGaWxlRm9sZGVyID0gIiI7CgogICAgaWYgKCAkQ3VycmVudE9TID1+IC9NU1dpbi8gKSB7CiAgICAgICAgJEZpbGVGb2xkZXIgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpCiAgICAgICAgICAgIC4gIlxcS2VybmVsXFxPdXRwdXRcXEhUTUxcXFN0YW5kYXJkXFwiOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJEZpbGVGb2xkZXIgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpCiAgICAgICAgICAgIC4gIi9LZXJuZWwvT3V0cHV0L0hUTUwvU3RhbmRhcmQvIjsKICAgIH0KCiAgICAkRmlsZVRvQ2hhbmdlID0gJEZpbGVGb2xkZXIgLiAkRmlsZU5hbWU7CgogICAgIyBuYW1lIGZvciBhIGJhY2t1cCBmaWxlCiAgICBteSAkRmlsZVRvQ2hhbmdlQmFja3VwID0gJEZpbGVGb2xkZXIgLiAkRmlsZU5hbWUgLiAiLnNhdmUiOwoKICAgICMgY2hlY2sgaWYgdGhlIGJhY2t1cCBmaWxlIGFscmVhZHkgZXhpc3RzIChpbiBjYXNlIG9mIHVwZ3JhZGUpCiAgICAjIGlmIG5vdCAtIHJlbmFtZSB0aGUgb2xkIGZpbGUKICAgIHVubGVzcyAoIC1lICRGaWxlVG9DaGFuZ2VCYWNrdXAgKSB7CiAgICAgICAgaWYgKCAhcmVuYW1lKCAkRmlsZVRvQ2hhbmdlLCAkRmlsZVRvQ2hhbmdlQmFja3VwICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBub3QgcmVuYW1lIGZpbGUgJEZpbGVUb0NoYW5nZSEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgfQoKICAgICMgcmVhZCB0aGUgZmlsZSBjb250ZW50CiAgICBteSAkRmlsZU5ld0NvbnRlbnQ7CiAgICBpZiAoIG9wZW4oIG15ICRJTiwgIjwiLCAkRmlsZVRvQ2hhbmdlQmFja3VwICkgKSB7CiAgICAgICAgd2hpbGUgKDwkSU4+KSB7CiAgICAgICAgICAgIG15ICRDdXJyTGluZSA9ICRfOwoKICAgICAgICAgICAgIyB0aGlzIGlzIHRoZSBsaW5lIHRoYXQgbXVzdCBiZSBjaGFuZ2VkCiAgICAgICAgICAgIGlmICggKC9eXHMqPGZvcm0gYWN0aW9uPS8pICYmICEoL2VuY3R5cGU9XCJtdWx0aXBhcnRcL2Zvcm0tZGF0YVwiLykgKSB7CiAgICAgICAgICAgICAgICBteSAkTmV3TGluZSA9ICIjIEtJWDRPVFJTLWNhcGVJVFxuIiAuCiAgICAgICAgICAgICAgICAgICAgIiMkXyI7CiAgICAgICAgICAgICAgICBzLz4vIGVuY3R5cGU9XCJtdWx0aXBhcnRcL2Zvcm0tZGF0YVwiPi87CiAgICAgICAgICAgICAgICAkTmV3TGluZSAuPSAiICRfIiAuCiAgICAgICAgICAgICAgICAgICAgIiMgRU8gS0lYNE9UUlMtY2FwZUlUXG4iOwogICAgICAgICAgICAgICAgJEN1cnJMaW5lID0gJE5ld0xpbmU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJEZpbGVOZXdDb250ZW50IC49ICRDdXJyTGluZTsKICAgICAgICB9CiAgICAgICAgY2xvc2UoJElOKTsKICAgIH0KICAgIGVsc2UgewogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ291bGQgbm90IG9wZW4gZmlsZSAkRmlsZVRvQ2hhbmdlISIsCiAgICAgICAgKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgIyB3cml0ZSBuZXcgY29udGVudCB0byBhIG5ldyBmaWxlIHdpdGggdGhlIG9sZCBuYW1lCiAgICBpZiAoIG9wZW4oIG15ICRPVVQsICI+IiwgJEZpbGVUb0NoYW5nZSApICkgewogICAgICAgIGJpbm1vZGUoJE9VVCk7CiAgICAgICAgcHJpbnQgJE9VVCAkRmlsZU5ld0NvbnRlbnQ7CiAgICAgICAgY2xvc2UoJE9VVCk7CgogICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICBQcmlvcml0eSA9PiAnbm90aWNlJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlVwZGF0ZWQgJEZpbGVUb0NoYW5nZS4iLAogICAgICAgICk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvdWxkIG5vdCB3cml0ZSB0byBmaWxlICRGaWxlVG9DaGFuZ2UhIiwKICAgICAgICApOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICByZXR1cm4gMTsKfQoKc3ViIF9SZXN0b3JlQ2hhbmdlcyB7CiAgICBteSAoICRTZWxmLCAlUGFyYW0gKSA9IEBfOwoKICAgIG15ICRDdXJyZW50T1MgICAgPSAkXk87CiAgICBteSAkRmlsZVRvQ2hhbmdlID0gIiI7CiAgICBteSAkRmlsZU5hbWUgICAgID0gIkFnZW50SVRTTUNvbmZpZ0l0ZW1FZGl0LmR0bCI7CiAgICBteSAkRmlsZUZvbGRlciAgID0gIiI7CgogICAgaWYgKCAkQ3VycmVudE9TID1+IC9NU1dpbi8gKSB7CiAgICAgICAgJEZpbGVGb2xkZXIgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpCiAgICAgICAgICAgIC4gIlxcS2VybmVsXFxPdXRwdXRcXEhUTUxcXFN0YW5kYXJkXFwiOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgJEZpbGVGb2xkZXIgPSAkU2VsZi0+e0NvbmZpZ09iamVjdH0tPkdldCgnSG9tZScpCiAgICAgICAgICAgIC4gIi9LZXJuZWwvT3V0cHV0L0hUTUwvU3RhbmRhcmQvIjsKICAgIH0KCiAgICAkRmlsZVRvQ2hhbmdlID0gJEZpbGVGb2xkZXIgLiAkRmlsZU5hbWU7CgogICAgIyBiYWNrdXAgZmlsZSBjcmVhdGVkIGR1cmluZyB0aGUgaW5zdGFsbGF0aW9uCiAgICBteSAkRmlsZVRvQ2hhbmdlQmFja3VwID0gJEZpbGVGb2xkZXIgLiAkRmlsZU5hbWUgLiAiLnNhdmUiOwoKICAgICMgaWYgYmFja3VwIGV4aXN0cywgcmVtb3ZlIHRoZSBhY3R1YWwgZmlsZQogICAgaWYgKCAtZSAkRmlsZVRvQ2hhbmdlQmFja3VwICkgewogICAgICAgIGlmICggIXVubGluaygkRmlsZVRvQ2hhbmdlKSApIHsKICAgICAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgICAgICBQcmlvcml0eSA9PiAnZXJyb3InLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIkNvdWxkIG5vdCBkZWxldGUgZmlsZSAkRmlsZVRvQ2hhbmdlISIsCiAgICAgICAgICAgICk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICMgYW5kIHJlc3RvcmUgdGhlIGJhY2t1cCBmaWxlCiAgICAgICAgaWYgKCAhcmVuYW1lKCAkRmlsZVRvQ2hhbmdlQmFja3VwLCAkRmlsZVRvQ2hhbmdlICkgKSB7CiAgICAgICAgICAgICRTZWxmLT57TG9nT2JqZWN0fS0+TG9nKAogICAgICAgICAgICAgICAgUHJpb3JpdHkgPT4gJ2Vycm9yJywKICAgICAgICAgICAgICAgIE1lc3NhZ2UgID0+ICJDb3VsZCBub3QgcmVuYW1lIGZpbGUgJEZpbGVUb0NoYW5nZUJhY2t1cCEiLAogICAgICAgICAgICApOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAkU2VsZi0+e0xvZ09iamVjdH0tPkxvZygKICAgICAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICAgICAgTWVzc2FnZSAgPT4gIlJlc3RvcmVkIGluaXRpYWwgZmlsZSAkRmlsZVRvQ2hhbmdlLiIsCiAgICAgICAgICAgICk7CiAgICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgICAgJFNlbGYtPntMb2dPYmplY3R9LT5Mb2coCiAgICAgICAgICAgIFByaW9yaXR5ID0+ICdub3RpY2UnLAogICAgICAgICAgICBNZXNzYWdlICA9PiAiQ291bGQgbm90IGZpbmQgZmlsZSAkRmlsZVRvQ2hhbmdlQmFja3VwISIsCiAgICAgICAgKTsKICAgIH0KICAgIHJldHVybiAxOwp9CgoxOwoKPWJhY2sKCj1oZWFkMSBURVJNUyBBTkQgQ09ORElUSU9OUwoKVGhpcyBTb2Z0d2FyZSBpcyBwYXJ0IG9mIHRoZSBPVFJTIHByb2plY3QgKGh0dHA6Ly9vdHJzLm9yZy8pLgoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUKdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoR1BMKS4gSWYgeW91CmRpZCBub3QgcmVjZWl2ZSB0aGlzIGZpbGUsIHNlZSBodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvYWdwbC50eHQuCgo9Y3V0Cgo9aGVhZDEgVkVSU0lPTgokUmV2aXNpb246IDEuNyAkICREYXRlOiAyMDExLTA3LTI1IDA5OjEwOjI5ICQKPWN1dAo= IyAkSWQ6IFVTQUdFX2l0c20tY2lhdHRyaWJ1dGVjb2xsZWN0aW9uLnBvZCx2IDEuMTAgMjAxMS0xMC0xMyAxMTozNDo1MiBzbWVobGlnIEV4cCAkCgo9aGVhZDEgVXNhZ2UgSW5mb3JtYXRpb24gCgpUaGlzIHZlcnNpb24gZG9lcyBub3QgcmVxdWlyZSBPVFJTOjpDaUNTIGFueW1vcmUgYnV0IG5lZWRzIHRvIHBsYWNlIGEgbW9kaWZpY2F0aW9uIGluIGEgZmlsZSBjb250YWluZWQgaW4gSVRTTUNvbmZpZ3VyYXRpb25NYW5hZ2VtZW50LiBUaHVzIHRoaXMgZmlsZSB3aWxsIGJlIG1vZGlmaWVkLgoKVGhpcyBwYWNrYWdlIHByb3ZpZGVzIGFkZGl0aW9uYWwgSVRTTS1DSS1hdHRyaWJ1dGVzIGZvciBPVFJTOklUU00sIGkuZS4gSVRTTUNvbmZpZ3VyYXRpb25NYW5hZ2VtZW50LiBGb2xsb3dpbmcgeW91J2xsIGZpbmQgYSBzaG9ydCBkb2N1bWVudGF0aW9uIG9uIHRoZSB1c2UgYW5kIGZlYXR1cmVzIG9mIHRoaXMgZXh0ZW5zaW9uLgoKPWhlYWQyIFdoeSBhIG5ldyBhdHRhY2htZW50IHN0b3JhZ2UgcmF0aGVyIHRoYW4gdXNpbmcgVmlydHVhbEZpbGVTeXN0ZW0KClZpcnR1YWwgZmlsZSBzeXN0ZW0gcHJvdmVkIHRvIGJlIG5vdCBzdWl0YWJsZSwgc2luY2UgaXQgYnVpbGRzIHNvbWUgc29ydCBvZiBkaXJlY3RvcnkgcGF0aCBvdXQgb2Ygb2JqZWN0LWNsYXNzIGFuZCBpZC4gVGh1cyBpdCB3b3VsZCByZXF1aXJlIHRvIGtub3cgdGhlIENJcyB2ZXJzaW9uIElEIGJlZm9yZSBpdCdzIGFjdHVhbGx5IGNyZWF0ZWQuIElmIHRoaXMgY291bGQgYmUgc29sdmVkIHNvbWVob3csIGNvcHlpbmcgYSBDSSB3aXRoIGFuIGF0dGFjaG1lbnQgd291bGQgYWxzbyBjYXVzZSBhIGNvcHkgb2YgdGhlIGF0dGFjaG1lbnQgaXRzZWxmLCB3aGljaCBpcyBub3QgZGVzaXJhYmxlIGZyb20gb3VyIHBvaW50IG9mIHZpZXcuCgoKPWhlYWQyIChpKSBVc2Ugb2YgdGhlIENJLUF0dHJpYnV0ZSAiQ0lDbGFzc1JlZmVyZW5jZSIKCj1vdmVyIDQKCj1pdGVtICogYmVoYXZlcyBzaW1pbGFyIHRvIGN1c3RvbWVyIHVzZXIgYXR0cmlidXRlIGJ1dCByZWZlcnMgdG8gYW5vdGhlciBjb25maWcgaXRlbSBvZiBzb21lIENJLWNsYXNzCgo9aXRlbSAqIGFsbG93cyB0byBhdXRvbWF0aWNhbGx5IGRlbGV0ZSBhbmQgY3JlYXRlIGxpbmtzIHRvIENJcyBvZiBhIHJlZmVyZW5jZWQgY2xhc3MKCj1pdGVtICogZWFzZXMgdGhlIGNvbmZpZ3VyYXRpb24gb2YgYXNzZW1ibGVkIGNvbmZpZyBpdGVtcywgd2hpY2ggY29uc2lzdCAoaW4gcGFydHMpIG9mIG90aGVyIGNvbmZpZyBpdGVtcyB3aXRob3V0IGFubm95aW5nIG1hbnVhbCBsaW5rIGNyZWF0aW9uCgo9aXRlbSAqIGF0dHJpYnV0ZSBkZWZpbml0aW9uIHJlcXVpcmVzIHRocmVlIGFkZGl0aW9uYWwgYXR0cmlidXRlczoKCiAgICAgICAgUmVmZXJlbmNlZENJQ2xhc3NOYW1lIG9yIFJlZmVyZW5jZWRDSUNsYXNzSUQ6IGRlZmluZXMgdGhlIHJlZmVyZW5jZWQgQ0ktY2xhc3MKICAgICAgICBSZWZlcmVuY2VkQ0lDbGFzc0xpbmtUeXBlOiBkZWZpbmVzIHRoZSBsaW5rIHR5cGUgd2hpY2ggc2hvdWxkIGJlIHVzZWQgZm9yIGF1dG9tYXRpYyBsaW5rIGNyZWF0aW9uIGFuZCBkZWxldGlvbiwgbm8gbGluayB3aWxsIGJlIGNyZWF0ZWQgaWYgZW1wdHkKICAgICAgICBSZWZlcmVuY2VkQ0lDbGFzc0xpbmtEaXJlY3Rpb246IHNldCB0byAiUmV2ZXJzZSIgaWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgcmV2ZXJzZSBsaW5rIGZvciBkaXJlY3RlZCBsaW5rIHR5cGVzICh3aWxsIG9ubHkgYmUgcmVsZXZhbnQgaWYgUmVmZXJlbmNlZENJQ2xhc3NMaW5rVHlwZSBpcyBzZXQpCgo9aXRlbSAqIElNUE9SVEFOVCBOT1RFOiBUaGUgIktleSIgYXR0cmlidXRlIGhhcyB0byBiZSBhIFVOSVFVRSBuYW1lIHdpdGhpbiB0aGUgY2xhc3MgZGVmaW5pdGlvbiEKCj1iYWNrCgo9aGVhZDMgRVhBTVBMRQoKICAgewogICAgICAgS2V5ICAgICAgICA9PiAnTG9jYXRpb24nLAogICAgICAgTmFtZSAgICAgICA9PiAnQXNzZXQgTG9jYXRpb24nLAogICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgSW5wdXQgPT4gewogICAgICAgICAgIFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICA9PiAnQ0lDbGFzc1JlZmVyZW5jZScsCiAgICAgICAgICAgUmVmZXJlbmNlZENJQ2xhc3NOYW1lICAgICAgICAgID0+ICdMb2NhdGlvbicsCiAgICAgICAgICAgUmVmZXJlbmNlZENJQ2xhc3NMaW5rVHlwZSAgICAgID0+ICdJbmNsdWRlcycsCiAgICAgICAgICAgUmVmZXJlbmNlZENJQ2xhc3NMaW5rRGlyZWN0aW9uID0+ICdSZXZlcnNlJywKICAgICAgIH0sCiAgIH0sCgoKPWhlYWQyIChpaSkgVXNlIG9mIHRoZSBDSS1BdHRyaWJ1dGUgIlNlcnZpY2VSZWZlcmVuY2UiCgo9b3ZlciA0Cgo9aXRlbSAqIGJlaGF2ZXMgc2ltaWxhciB0byBjdXN0b21lciB1c2VyIGF0dHJpYnV0ZSBidXQgcmVmZXJzIHRvIGEgc2VydmljZQoKPWl0ZW0gKiBhbGxvd3MgdG8gYXV0b21hdGljYWxseSBkZWxldGUgYW5kIGNyZWF0ZSBsaW5rcyB0byBTZXJ2aWNlcwoKPWl0ZW0gKiBhdHRyaWJ1dGUgZGVmaW5pdGlvbiByZXF1aXJlcyB0d28gYWRkaXRpb25hbCBhdHRyaWJ1dGVzOgoKICAgICAgICBSZWZlcmVuY2VkU2VydmljZUxpbmtUeXBlOiBkZWZpbmVzIHRoZSBsaW5rIHR5cGUgd2hpY2ggc2hvdWxkIGJlIHVzZWQgZm9yIGF1dG9tYXRpYyBsaW5rIGNyZWF0aW9uIGFuZCBkZWxldGlvbiwgbm8gbGluayB3aWxsIGJlIGNyZWF0ZWQgaWYgZW1wdHkKICAgICAgICBSZWZlcmVuY2VkU2VydmljZUxpbmtEaXJlY3Rpb246IHNldCB0byAiUmV2ZXJzZSIgaWYgeW91IHdhbnQgdG8gY3JlYXRlIGEgcmV2ZXJzZSBsaW5rIGZvciBkaXJlY3RlZCBsaW5rIHR5cGVzICh3aWxsIG9ubHkgYmUgcmVsZXZhbnQgaWYgUmVmZXJlbmNlZENJQ2xhc3NMaW5rVHlwZSBpcyBzZXQpCgo9aXRlbSAqIElNUE9SVEFOVCBOT1RFOiBUaGUgIktleSIgYXR0cmlidXRlIGhhcyB0byBiZSBhIFVOSVFVRSBuYW1lIHdpdGhpbiB0aGUgY2xhc3MgZGVmaW5pdGlvbiEgIAoKPWJhY2sKCj1oZWFkMyBFWEFNUExFOiAKCiAgIHsKICAgICAgIEtleSAgICAgICAgPT4gJ0Fzc2lnbmVkU2VydmljZScsCiAgICAgICBOYW1lICAgICAgID0+ICdBc3NpZ25lZCBTZXJ2aWNlJywKICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgID0+ICdTZXJ2aWNlUmVmZXJlbmNlJywKICAgICAgICAgICBSZWZlcmVuY2VkU2VydmljZUxpbmtUeXBlICAgICAgID0+ICdSZWxldmFudFRvJywKICAgICAgICAgICBSZWZlcmVuY2VkU2VydmljZUxpbmtEaXJlY3Rpb24gID0+ICdOb3JtYWwnLAogICAgICAgfSwKICAgfSwKIAoKPWhlYWQyIChpaWkpIFVzZSBvZiB0aGUgQ0ktQXR0cmlidXRlICJRdWV1ZVJlZmVyZW5jZSIKCj1vdmVyIDQKCj1pdGVtICogYmVoYXZlcyBzaW1pbGFyIHRvIGN1c3RvbWVyIHVzZXIgYXR0cmlidXRlIGJ1dCByZWZlcnMgdG8gYSBxdWV1ZQoKPWJhY2sKCj1oZWFkMyAgRVhBTVBMRTogCgogICB7CiAgICAgICBLZXkgICAgICAgID0+ICdBc3NpZ25lZFF1ZXVlJywKICAgICAgIE5hbWUgICAgICAgPT4gJ0Fzc2lnbmVkIFF1ZXVlJywKICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICBUeXBlID0+ICdRdWV1ZVJlZmVyZW5jZScsCiAgICAgICB9LAogICB9LAoKCj1oZWFkMiAoaXYpIEF1dG9jb21wbGV0ZSBmdW5jdGlvbiBmb3IgYXR0cmlidXRlIHR5cGVzIHF1ZXVlLCBzZXJ2aWNlLCBDSWNsYXNzLCBVc2VycywgQ3VzdG9tZXJDb21wYW55IGFuZCBDdXN0b21lclVzZXJDb21wYW55IAoKPW92ZXIgNAoKPWl0ZW0gKiBiZWhhdmVzIHNpbWlsYXIgdG8gY3VzdG9tZXIgdXNlciBhdXRvY29tcGxldGUgZnVuY3Rpb24KCj1pdGVtICogYWN0aXZhdGlvbiBjYW4gYmUgY29uZmlndXJlZCBpbiBTeXNDb25maWcKICAgICAgKiBJVFNNQ0lBdHRyaWJ1dGVDb2xsZWN0aW9uOjpGcm9udGVuZDo6Q29tbW9uU2VhcmNoQXV0b0NvbXBsZXRlCgo9aXRlbSAqIGZ1cnRoZXIgY29uZmlndXJhdGlvbiBpbiBTeXNDb25maWcKCiAgICAgICAgTG9hZGVyOjpBZ2VudDo6Q29tbW9uSlMxMDEtSVRTTUNJQXR0cmlidXRlQ29sbGVjdGlvbgogICAgICAgIEZyb250ZW5kOjpNb2R1bGVBZ2VudFF1ZXVlU2VhcmNoCiAgICAgICAgRnJvbnRlbmQ6Ok1vZHVsZUFnZW50U2VydmljZVNlYXJjaAogICAgICAgIEZyb250ZW5kOjpNb2R1bGVBZ2VudENJQ2xhc3NTZWFyY2gKICAgICAgICBGcm9udGVuZDo6TW9kdWxlQWdlbnRVc2VyU2VhcmNoCiAgICAgICAgRnJvbnRlbmQ6Ok1vZHVsZUFnZW50Q3VzdG9tZXJDb21wYW55YXNzU2VhcmNoCiAgICAgICAgRnJvbnRlbmQ6Ok1vZHVsZUFnZW50Q3VzdG9tZXJVc2VyQ29tcGFueVNlYXJjaAoKPWl0ZW0gKiBmdXJ0aGVyIGluZm9ybWF0aW9ucyB0byBDdXN0b21lckNvbXBhbnkgYW5kIEN1c3RvbWVyVXNlckNvbXBhbnkKCiAgICAgICogQ3VzdG9tZXJDb21wYW55U2VhcmNoIHVzZXMgQ3VzdG9tZXJDb21wYW55LVRhYmxlIGFzIHNlYXJjaCBiYXNlCiAgICAgICogQ3VzdG9tZXJVc2VyQ29tcGFueVNlYXJjaCB1c2VzIEN1c3RvbWVySURzIGZyb20gQ3VzdG9tZXJEYXRhIGFzIHNlYXJjaCBiYXNlOyAKCj1iYWNrCgoKPWhlYWQyICh2KSBVc2Ugb2YgdGhlIENJLUF0dHJpYnV0ZSAiQ0lBdHRhY2htZW50IgoKPW92ZXIgNAoKPWl0ZW0gKiBhbGxvd3MgdG8gYWRkIG9uZSBvciBtb3JlIGF0dGFjaG1lbnRzIHRvIGEgQ29uZmlnSXRlbSAKCj1pdGVtICogc2VlIGZvbGxvd2luZyBTeXNDb25maWcgb3B0aW9ucyBmb3IgZnVydGhlciBjb25maWd1cmF0aW9uCiAgICAgICAgQXR0YWNobWVudFN0b3JhZ2U6OlN0b3JhZ2VCYWNrZW5kTW9kdWxlcwogICAgICAgIEF0dGFjaG1lbnRTdG9yYWdlOjpEZWZhdWx0U3RvcmFnZUJhY2tlbmRNb2R1bGUKICAgICAgICBGcm9udGVuZDo6TW9kdWxlIyMjQWdlbnRBdHRhY2htZW50U3RvcmFnZQogICAgICAgIEF0dGFjaG1lbnRTdG9yYWdlRlM6OlN0b3JhZ2VEaXJlY3RvcnkKCj1pdGVtICogSU1QT1JUQU5UIE5PVEU6IFRoZSBhdHRyaWJ1dGVzIENvdW50TWluIGFuZCBDb3VudE1heCBtdXN0IGFsd2F5cyBiZSBkZWZpbmVkISBPdGhlcndpc2UgeW91IHdvbid0IGJlIGFibGUgdG8gZGVsZXRlIGF0dGFjaG1lbnRzIGZyb20gQ0lzLiBJZiB5b3Ugc2V0IENvdW50TWluID0+IDEsIGl0IHdpbGwgYmUgaW1wb3NzaWJsZSB0byBkZWxldGUgdGhlIGxhc3QgYXR0YWNobWVudCAodGhlIGxhc3QgbiBhdHRhY2htZW50cyBmb3IgQ291bnRNaW4gPT4gbikuCgo9YmFjawoKPWhlYWQzICBFWEFNUExFOiAKCiAgIHsKICAgICAgIEtleSA9PiAnQXR0YWNobWVudCcsCiAgICAgICBOYW1lID0+ICdBdHRhY2htZW50JywKICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICBTaXplID0+IDUwLAogICAgICAgICAgIE1heExlbmd0aCA9PiA1MCwKICAgICAgICAgICBUeXBlICA9PiAnQ0lBdHRhY2htZW50JywgCiAgICAgICB9LAogICAgICAgQ291bnRNaW4gPT4gMCwKICAgICAgIENvdW50TWF4ID0+IDEsCiAgIH0sCgo9aGVhZDIgKHZpKSBVc2Ugb2YgdGhlIENJLUF0dHJpYnV0ZSAiVXNlciIKCj1vdmVyIDQKCj1pdGVtICogYmVoYXZlcyBzaW1pbGFyIHRvIGN1c3RvbWVyIHVzZXIgYXR0cmlidXRlIGJ1dCByZWZlcnMgdG8gYSB1c2VyL2FnZW50Cgo9YmFjawoKPWhlYWQzICBFWEFNUExFOiAKCiAgIHsKICAgICAgIEtleSAgICAgICAgPT4gJ1Jlc3BvbnNpYmxlJywKICAgICAgIE5hbWUgICAgICAgPT4gJ1Jlc3BvbnNpYmxlJywKICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICBUeXBlID0+ICdVc2VyJywKICAgICAgIH0sCiAgIH0sCgogCj1oZWFkMiAodmlpKSBVc2Ugb2YgdGhlIENJLUF0dHJpYnV0ZSAiQ3VzdG9tZXJVc2VyQ29tcGFueSIKCj1vdmVyIDQKCj1pdGVtICogYmVoYXZlcyBzaW1pbGFyIHRvIGN1c3RvbWVyIHVzZXIgYXR0cmlidXRlIGJ1dCByZWZlcnMgdG8gYSBDdXN0b21lckNvbXBhbnkKICAgICAgKiBsb29rcyBpbiBhbGwgQ3VzdG9tZXJEYXRhcyBmb3IgQ3VzdG9tZXJDb21wYW55IAoKPWJhY2sKCj1oZWFkMyAgRVhBTVBMRTogCgogICAgewogICAgICAgIEtleSA9PiAnQ3VzdG9tZXJVc2VyQ29tcGFueScsCiAgICAgICAgTmFtZSA9PiAnQ3VzdG9tZXJVc2VyQ29tcGFueScsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnQ3VzdG9tZXJVc2VyQ29tcGFueScsCiAgICAgICAgfSwKICAgIH0sCgogCj1oZWFkMiAodmlpaSkgVXNlIG9mIHRoZSBDSS1BdHRyaWJ1dGUgIkN1c3RvbWVyQ29tcGFueSIKCj1vdmVyIDQKCj1pdGVtICogYmVoYXZlcyBzaW1pbGFyIHRvIGN1c3RvbWVyIHVzZXIgYXR0cmlidXRlIGJ1dCByZWZlcnMgdG8gYSB1c2VyL2FnZW50CiAgICAgICogbG9va3MgaW4gQ3VzdG9tZXJDb21wYW55LVRhYmxlIGZvciBDdXN0b21lckNvbXBhbnkgCgo9YmFjawoKPWhlYWQzICBFWEFNUExFOiAKCiAgICB7CiAgICAgICAgS2V5ID0+ICdDdXN0b21lckNvbXBhbnknLAogICAgICAgIE5hbWUgPT4gJ0N1c3RvbWVyQ29tcGFueScsCiAgICAgICAgU2VhcmNoYWJsZSA9PiAxLAogICAgICAgIElucHV0ID0+IHsKICAgICAgICAgICAgVHlwZSA9PiAnQ3VzdG9tZXJDb21wYW55JywKICAgICAgICB9LAogICAgfSwKCgo9aGVhZDIgKGl4KSBVc2Ugb2YgdGhlIENJLUF0dHJpYnV0ZSAiUGFzc3dvcmQiCgo9b3ZlciA0Cgo9aXRlbSAqIGFsbG93cyB0byBkZXBvc2l0ZSBwYXNzd29yZHMKICAgICAgKiBjaGFuZ2UgYW5kIGRpc3BsYXkgb2YgcGFzc3dvcmQgb25seSBmb3IgY29uZmlndXJlZCBncm91cHMKCj1iYWNrCgo9aGVhZDMgIEVYQU1QTEU6IAoKICAgIHsgCiAgICAgICAgIEtleSA9PiAnUGFzc3dvcmQnLCAKICAgICAgICAgTmFtZSA9PiAnUGFzc3dvcmQnLAogICAgICAgICBHcm91cCA9PiB7IAogICAgICAgICAgICAgICAgIGFkbWluID0+IDEsIAogICAgICAgICAgICAgICAgIGdyb3VwbmFtZSA9PiAxLCAKICAgICAgICAgfSwgCiAgICAgICAgIElucHV0ID0+IHsgCiAgICAgICAgICAgICBUeXBlID0+ICdFbmNyeXB0ZWRUZXh0JywgCiAgICAgICAgICAgICBTaXplID0+IDUwLCAKICAgICAgICAgICAgIE1heExlbmd0aCA9PiAxMDAsIAogICAgICAgICB9LCAKICAgICB9LAogICAgIAogICAgIAo9aGVhZDIgKGl4KSBVc2Ugb2YgdGhlIENJLUF0dHJpYnV0ZSAiTGlua1RleHQiCgo9b3ZlciA0Cgo9aXRlbSAqIGFsbG93cyB0byB1c2UgdGV4dCBpbiBhIGNvbmZpZ3VyZWQgbGluawoKCj1iYWNrCgo9aGVhZDMgIEVYQU1QTEU6IAoKICAgIHsKICAgICAgICBLZXkgPT4gJ1RleHRMaW5rJywKICAgICAgICBOYW1lID0+ICdUZXh0IExpbmsnLAogICAgICAgIFNlYXJjaGFibGUgPT4gMSwKICAgICAgICBJbnB1dCA9PiB7CiAgICAgICAgICAgIFR5cGUgPT4gJ1RleHRMaW5rJywKICAgICAgICAgICAgU2l6ZSA9PiA1MCwKICAgICAgICAgICAgTWF4TGVuZ3RoID0+IDEwMCwKICAgICAgICAgICAgVVJMID0+ICdodHRwOi8vd3d3LmV4YW1wbGUuY29tLzxWQUxVRT4nLAogICAgICAgIH0sCiAgICB9LCAgICAKCgoKCj1oZWFkMSBDT1BZUklHSFQKCkNvcHlyaWdodCAoQykgMjAwNi0yMDExIGMuYS5wLmUuIElUIEdtYkgsIGh0dHA6Ly93d3cuY2FwZS1pdC5kZS8KClRoZSBmb2xsb3dpbmcgcGVyc29ucyBoYXZlIGNvbnRyaWJ1dGVkIHRvIHRoaXMgZXh0ZW5zaW9uOgoKPW92ZXIgNAoKPWl0ZW0gKiBUb3JzdGVuKGRvdClUaGF1KGF0KWNhcGUoZGFzaClpdChkb3QpZGUKCj1pdGVtICogTWFydGluKGRvdClCYWx6YXJlayhhdCljYXBlKGRhc2gpaXQoZG90KWRlCgo9aXRlbSAqIEZyYW5rKGRvdClPYmVyZW5kZXIoYXQpY2FwZShkYXNoKWl0KGRvdClkZQoKPWl0ZW0gKiBBbm5hKGRvdClMaXR2aW5vdmEoYXQpY2FwZShkYXNoKWl0KGRvdClkZQoKPWl0ZW0gKiBTdGVmYW4oZG90KU1laGxpZyhhdCljYXBlKGRhc2gpaXQoZG90KWRlCgo9YmFjawoKVGhpcyBzb2Z0d2FyZSBjb21lcyB3aXRoIEFCU09MVVRFTFkgTk8gV0FSUkFOVFkuIEZvciBkZXRhaWxzLCBzZWUgdGhlIGVuY2xvc2VkIGZpbGUgQ09QWUlORyBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbiAoQUdQTCkuIElmIHlvdSBkaWQgbm90IHJlY2VpdmUgdGhpcyBmaWxlLCBzZWUgaHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzL2FncGwudHh0LgoKPWN1dAo=